'******************************************************************************
'* 
'* PC (Model 5150) MOTHERBOARD v.1.0 (MOTHERBOARD DEVICE)
'*
'* Supported platform/bus: X86
'* 
'* Version history:
'*  - v.1.0 by WadiM (initial emulation)
'*
'****************************************************************************** 

//parent PC chipset implementation
public use object CHIPSET_PC

//motherboard name
DeviceName="PC Model 5150 Motherboard"
DebugName="PC_MB"

//variables
dim i as integer

'---------------------------- Video adapter (CGA) -----------------------------

//CGA video adapter
public use object VID_CGA as CGA : AddISADevice(CGA,-1,-1)
pc.WritePort(0x3D4)=CGA.CRT_INDEX_PORT : pc.ReadPort(0x3D4)=CGA.CRT_INDEX_PORT
pc.WritePort(0x3D5)=CGA.CRT_DATA_PORT  : pc.ReadPort(0x3D5)=CGA.CRT_DATA_PORT
pc.WritePort(0x3D8)=CGA.MODE_PORT      : pc.ReadPort(0x3D8)=CGA.MODE_PORT
pc.WritePort(0x3D9)=CGA.COLOR_PORT     : pc.ReadPort(0x3D9)=CGA.COLOR_PORT
pc.WritePort(0x3DB)=CGA.PEN_RESET_PORT : pc.WritePort(0x3DC)=CGA.PEN_SET_PORT
pc.ReadPort(0x3DA)=CGA.STATE_PORT
for i=0xB8000/1024 to (0xC0000/1024)-1 //CGA video memory
 mem.KBReader(i)=CGA.ReadMemory : mem.KBWriter(i)=CGA.WriteMemory 
next

'---------------------------- DEVICE Interface --------------------------------

//Device initialization
protected function DEV_INIT(stream as object,byref EventFreq as integer) as boolean
 dim i as integer, j as integer, s as string

 'parent call
 if not DEV_INIT(stream,EventFreq) then exit(false)
 if EventFreq<22050 then EventFreq=22050 'to pass POST tests

 'load ROM BIOS file
 s="bin\pc081682.bin" : mem.Bytes(0x100000-FileSize(s))=ArrayFile(s) 'main BIOS
 s="bin\basicc11.f6"  : mem.Bytes(0xF6000)=ArrayFile(s) 'ROM Basic 1/4
 s="bin\basicc11.f8"  : mem.Bytes(0xF8000)=ArrayFile(s) 'ROM Basic 2/4
 s="bin\basicc11.fa"  : mem.Bytes(0xFA000)=ArrayFile(s) 'ROM Basic 3/4
 s="bin\basicc11.fc"  : mem.Bytes(0xFC000)=ArrayFile(s) 'ROM Basic 4/4

 'mark BIOS area as read-only 
 for i=0x80000/1024 to 0xFFFFF/1024 : mem.KBAccess(i)=memReadOnly : next
 'mark CGA memory as read-write 
 for i=0xB8000/1024 to 0xBFFFF/1024 : mem.KBAccess(i)=memReadWrite : next

 'success
 result=true

end


