Ocean-240.2-Emulator/okean240/ioports.go

113 lines
2.2 KiB
Go

package okean240
/*
* Ocean-240.2
* Computer with FDC variant.
* IO Ports definitions
*
* By Romych 2026-03-01
*/
import log "github.com/sirupsen/logrus"
func (c *ComputerType) IORead(port uint16) byte {
switch port & 0x00ff {
case PicDd75a:
// PIO xx59, get IRR register
return c.pic.IRR()
case UartDd72rr:
// USART VV51 CMD
return c.usart.Status()
case UartDd72rd:
// USART VV51 Data
return c.usart.Receive()
case KbdDd78pa:
// Keyboard data
return c.ioPorts[KbdDd78pa]
case KbdDd78pb:
return c.ioPorts[KbdDd78pb]
case FdcCmd:
return c.fdc.Status()
case FdcDrq:
return c.fdc.Drq()
case Floppy:
return c.fdc.GetFloppy()
case FdcData:
return c.fdc.Data()
case FdcTrack:
return c.fdc.Track()
case FdcSect:
return c.fdc.Sector()
default:
log.Debugf("IORead from port: %x", port)
}
return c.ioPorts[byte(port&0x00ff)]
}
func (c *ComputerType) IOWrite(port uint16, val byte) {
bp := byte(port & 0x00ff)
c.ioPorts[bp] = val
//log.Debugf("OUT (%x), %x", bp, val)
switch bp {
case SysDd17pb:
if c.dd17EnableOut {
c.memory.Configure(val)
}
case SysDd17ctr:
c.dd17EnableOut = val == 0x80
case VID_DD67PB:
if val&VidVsuBit == 0 {
// video page 0
c.vRAM = c.memory.allMemory[VRAMBlock0]
} else {
// video page 1
c.vRAM = c.memory.allMemory[VRAMBlock1]
}
if val&VidColorBit != 0 {
c.colorMode = true
c.screenWidth = 256
} else {
c.colorMode = false
c.screenWidth = 512
}
c.palette = val & 0x07
c.bgColor = (val >> 3) & 0x07
case SysDd17pa:
c.vShift = val
case SysDd17pc:
c.hShift = val
case TmrDd70ctr:
// Timer VI63 config register
c.pit.Configure(val)
case TmrDd70c1:
// Timer VI63 counter0 register
c.pit.Load(0, val)
case TmrDd70c2:
// Timer VI63 counter1 register
c.pit.Load(1, val)
case TmrDd70c3:
// Timer VI63 counter2 register
c.pit.Load(2, val)
case UartDd72rr:
// USART VV51 CMD
c.usart.Command(val)
case UartDd72rd:
// USART VV51 Data
c.usart.Send(val)
case FdcCmd:
c.fdc.SetCmd(val)
case FdcData:
c.fdc.SetData(val)
case FdcTrack:
c.fdc.SetTrackNo(val)
case FdcSect:
c.fdc.SetSectorNo(val)
case Floppy:
c.fdc.SetFloppy(val)
default:
//log.Debugf("OUT to Unknown port (%x), %x", bp, val)
}
}