neon/steps.go
2023-07-31 11:43:33 -03:00

261 lines
4 KiB
Go

package neon
func stepNOP(c *CPU, addr uint16) Interrupt {
return NoInterrupt
}
func stepLA_(c *CPU, addr uint16) Interrupt {
v := c.RAM[addr]
c.A = v
return NoInterrupt
}
func stepLAB(c *CPU, addr uint16) Interrupt {
c.A = c.B
return NoInterrupt
}
func stepLB_(c *CPU, addr uint16) Interrupt {
v := c.RAM[addr]
c.B = v
return NoInterrupt
}
func stepLBA(c *CPU, addr uint16) Interrupt {
c.B = c.A
return NoInterrupt
}
func stepSWP(c *CPU, addr uint16) Interrupt {
c.A, c.B = c.B, c.A
return NoInterrupt
}
func stepSTA(c *CPU, addr uint16) Interrupt {
c.RAM[addr] = c.A
return NoInterrupt
}
func stepSTB(c *CPU, addr uint16) Interrupt {
c.RAM[addr] = c.B
return NoInterrupt
}
func stepAD_(c *CPU, addr uint16) Interrupt {
v := c.RAM[addr]
c.A += v
c.C = c.A < v
return NoInterrupt
}
func stepADB(c *CPU, addr uint16) Interrupt {
c.A += c.B
c.C = c.A < c.B
return NoInterrupt
}
func stepAC_(c *CPU, addr uint16) Interrupt {
v := c.RAM[addr]
c.A += v
if c.C {
c.A++
}
c.C = c.A < v
return NoInterrupt
}
func stepACB(c *CPU, addr uint16) Interrupt {
c.A += c.B
if c.C {
c.A++
}
c.C = c.A < c.B
return NoInterrupt
}
func stepINA(c *CPU, addr uint16) Interrupt {
c.A++
c.C = c.A == 0
return NoInterrupt
}
func stepINB(c *CPU, addr uint16) Interrupt {
c.B++
c.C = c.B == 0
return NoInterrupt
}
func stepSB_(c *CPU, addr uint16) Interrupt {
v := c.RAM[addr]
c.A -= v
return NoInterrupt
}
func stepSBB(c *CPU, addr uint16) Interrupt {
c.A -= c.B
return NoInterrupt
}
func stepSC_(c *CPU, addr uint16) Interrupt {
v := c.RAM[addr]
c.A -= v
if c.C {
c.A--
}
c.C = c.A > v
return NoInterrupt
}
func stepSCB(c *CPU, addr uint16) Interrupt {
c.A -= c.B
if c.C {
c.A--
}
c.C = c.A > c.B
return NoInterrupt
}
func stepDEA(c *CPU, addr uint16) Interrupt {
c.C = c.A == 0
c.A--
return NoInterrupt
}
func stepDEB(c *CPU, addr uint16) Interrupt {
c.C = c.A == 0
c.B--
return NoInterrupt
}
func stepTE_(c *CPU, addr uint16) Interrupt {
v := c.RAM[addr]
c.T = c.A == v
return NoInterrupt
}
func stepTEB(c *CPU, addr uint16) Interrupt {
c.T = c.A == c.B
return NoInterrupt
}
func stepTG_(c *CPU, addr uint16) Interrupt {
v := c.RAM[addr]
c.T = c.A > v
return NoInterrupt
}
func stepTGB(c *CPU, addr uint16) Interrupt {
c.T = c.A > c.B
return NoInterrupt
}
func stepTL_(c *CPU, addr uint16) Interrupt {
v := c.RAM[addr]
c.T = c.A < v
return NoInterrupt
}
func stepTLB(c *CPU, addr uint16) Interrupt {
c.T = c.A < c.B
return NoInterrupt
}
func stepTFC(c *CPU, addr uint16) Interrupt {
c.T = c.C
return NoInterrupt
}
func stepTFI(c *CPU, addr uint16) Interrupt {
c.T = c.I
return NoInterrupt
}
func stepJMP(c *CPU, addr uint16) Interrupt {
if c.J {
return NoInterrupt
}
v := c.get16(addr)
c.PC = v
return NoInterrupt
}
func stepJRF(c *CPU, addr uint16) Interrupt {
if c.J {
return NoInterrupt
}
v := c.RAM[addr]
c.PC += uint16(v)
return NoInterrupt
}
func stepJRB(c *CPU, addr uint16) Interrupt {
if c.J {
return NoInterrupt
}
v := c.RAM[addr]
c.PC -= 2 + uint16(v)
return NoInterrupt
}
func stepJSR(c *CPU, addr uint16) Interrupt {
if c.J {
return NoInterrupt // TODO: Does this make sense???
}
panic("TODO")
}
func stepRET(c *CPU, addr uint16) Interrupt {
if c.J {
return NoInterrupt // TODO: Does this make sense???
}
panic("TODO")
}
func stepSET(c *CPU, addr uint16) Interrupt {
c.T = true
return NoInterrupt
}
func stepSEC(c *CPU, addr uint16) Interrupt {
c.C = true
return NoInterrupt
}
func stepSEI(c *CPU, addr uint16) Interrupt {
c.I = true
return NoInterrupt
}
func stepSEJ(c *CPU, addr uint16) Interrupt {
c.J = true
return NoInterrupt
}
func stepCLT(c *CPU, addr uint16) Interrupt {
c.T = false
return NoInterrupt
}
func stepCLC(c *CPU, addr uint16) Interrupt {
c.C = false
return NoInterrupt
}
func stepCLI(c *CPU, addr uint16) Interrupt {
c.I = false
return NoInterrupt
}
func stepCLJ(c *CPU, addr uint16) Interrupt {
c.J = false
return NoInterrupt
}
func stepINT(c *CPU, addr uint16) Interrupt {
if c.I {
return NoInterrupt
}
v := c.RAM[addr]
return Interrupt(v)
}