Ocean-240.2-Emulator/okean240/computer.go

76 lines
1.3 KiB
Go

package okean240
import (
"z80em/config"
"z80em/z80em"
log "github.com/sirupsen/logrus"
)
type ComputerType struct {
cpu z80em.Z80Type
memory Memory
ioPorts [256]byte
cycles uint64
dd17EnableOut bool
}
type ComputerInterface interface {
//Init(rom0 string, rom1 string)
Run()
}
func (c *ComputerType) M1MemRead(addr uint16) byte {
return c.memory.M1MemRead(addr)
}
func (c *ComputerType) MemRead(addr uint16) byte {
return c.memory.MemRead(addr)
}
func (c *ComputerType) MemWrite(addr uint16, val byte) {
c.memory.MemWrite(addr, val)
}
func (c *ComputerType) IORead(port uint16) byte {
return c.ioPorts[port]
}
func (c *ComputerType) IOWrite(port uint16, val byte) {
c.ioPorts[byte(port&0x00ff)] = val
switch byte(port & 0x00ff) {
case SYS_DD17PB:
if c.dd17EnableOut {
c.memory.Configure(val)
}
case SYS_DD17CTR:
c.dd17EnableOut = val == 0x80
case KBD_DD78CTR:
}
}
// New Builds new computer
func New(cfg config.OkEmuConfig) *ComputerType {
c := ComputerType{}
c.memory = Memory{}
c.memory.Init(cfg.MonitorFile, cfg.CPMFile)
c.cpu = *z80em.New(&c)
c.cycles = 0
c.dd17EnableOut = false
return &c
}
func (c *ComputerType) Run() {
c.cpu.Reset()
for {
state := c.cpu.GetState()
log.Infof("%d - [%x]: %x\n", c.cycles, state.PC, c.MemRead(state.PC))
c.cycles += uint64(c.cpu.RunInstruction())
}
}