internal/vm/{exec_funcs,opcodes}: handle INX instruction execution

This commit is contained in:
Bradford Lamson-Scribner 2020-05-30 17:14:13 -06:00
parent 71a1fa30ec
commit 35bdeac2c8
2 changed files with 38 additions and 16 deletions

View File

@ -9,7 +9,7 @@ func todo(a *Appleone, o op) error {
// interrupt, N Z C I D V // interrupt, N Z C I D V
// push PC+2, push SR - - - 1 - - // push PC+2, push SR - - - 1 - -
func exec0x00(a *Appleone, o op) error { func execBRK(a *Appleone, o op) error {
// set processer status flag to BRK // set processer status flag to BRK
a.cpu.ps = flagBreak a.cpu.ps = flagBreak
@ -24,7 +24,7 @@ func exec0x00(a *Appleone, o op) error {
// pull SR, pull PC N Z C I D V // pull SR, pull PC N Z C I D V
// from stack // from stack
func exec0x40(a *Appleone, o op) error { func execRTI(a *Appleone, o op) error {
a.cpu.ps = a.popStackWord() a.cpu.ps = a.popStackWord()
a.cpu.pc = a.popStackDWord() a.cpu.pc = a.popStackDWord()
return nil return nil
@ -32,18 +32,40 @@ func exec0x40(a *Appleone, o op) error {
// M - 1 -> M N Z C I D V // M - 1 -> M N Z C I D V
// + + - - - - // + + - - - -
func exec0xC6(a *Appleone, o op) error { func execDEC(a *Appleone, o op) error {
addr, err := o.getAddr(a) addr, err := o.getAddr(a)
if err != nil { if err != nil {
return err return err
} }
b := a.mem[addr] b := a.mem[addr]
b-- b--
a.mem[addr] = b a.mem[addr] = b
a.setZeroIfNeeded(b) a.setZeroIfNeeded(b)
a.setNegativeIfOverflow(b) a.setNegativeIfOverflow(b)
return nil
}
// M + 1 -> M N Z C I D V
// + + - - - -
func execINC(a *Appleone, o op) error {
addr, err := o.getAddr(a)
if err != nil {
return err
}
b := a.mem[addr]
b++
a.mem[addr] = b
a.setZeroIfNeeded(b)
a.setNegativeIfOverflow(b)
return nil
}
// X + 1 -> X N Z C I D V
// + + - - - -
func execINX(a *Appleone, o op) error {
b := a.cpu.x + 1
a.cpu.x = b
a.setZeroIfNeeded(b)
a.setNegativeIfOverflow(b)
return nil return nil
} }

View File

@ -77,13 +77,13 @@ var opcodes = map[uint8]op{
// addressing assembler opc bytes cyles // addressing assembler opc bytes cyles
// -------------------------------------------- // --------------------------------------------
// implied BRK 00 1 7 // implied BRK 00 1 7
0x00: newOp("BRK", 0x00, 1, implied, exec0x00), 0x00: newOp("BRK", 0x00, 1, implied, execBRK),
// RTI Return from Interrupt // RTI Return from Interrupt
// addressing assembler opc bytes cyles // addressing assembler opc bytes cyles
// -------------------------------------------- // --------------------------------------------
// implied RTI 40 1 6 // implied RTI 40 1 6
0x40: newOp("RTI", 0x40, 1, implied, exec0x40), 0x40: newOp("RTI", 0x40, 1, implied, execRTI),
// DEC Decrement Memory by One // DEC Decrement Memory by One
// addressing assembler opc bytes cyles // addressing assembler opc bytes cyles
@ -92,10 +92,10 @@ var opcodes = map[uint8]op{
// zeropage,X DEC oper,X D6 2 6 // zeropage,X DEC oper,X D6 2 6
// absolute DEC oper CE 3 6 // absolute DEC oper CE 3 6
// absolute,X DEC oper,X DE 3 7 // absolute,X DEC oper,X DE 3 7
0xC6: newOp("DEC", 0xC6, 2, zeroPage, exec0xC6), 0xC6: newOp("DEC", 0xC6, 2, zeroPage, execDEC),
0xD6: newOp("DEC", 0xD6, 2, zeroPageXIndexed, exec0xC6), 0xD6: newOp("DEC", 0xD6, 2, zeroPageXIndexed, execDEC),
0xCE: newOp("DEC", 0xCE, 3, absolute, exec0xC6), 0xCE: newOp("DEC", 0xCE, 3, absolute, execDEC),
0xDE: newOp("DEC", 0xDE, 3, absoluteXIndexed, exec0xC6), 0xDE: newOp("DEC", 0xDE, 3, absoluteXIndexed, execDEC),
// INC Increment Memory by One // INC Increment Memory by One
// addressing assembler opc bytes cyles // addressing assembler opc bytes cyles
@ -104,10 +104,10 @@ var opcodes = map[uint8]op{
// zeropage,X INC oper,X F6 2 6 // zeropage,X INC oper,X F6 2 6
// absolute INC oper EE 3 6 // absolute INC oper EE 3 6
// absolute,X INC oper,X FE 3 7 // absolute,X INC oper,X FE 3 7
0xE6: newOp("INC", 0xE6, 2, zeroPage, todo), 0xE6: newOp("INC", 0xE6, 2, zeroPage, execINC),
0xF6: newOp("INC", 0xF6, 2, zeroPageXIndexed, todo), 0xF6: newOp("INC", 0xF6, 2, zeroPageXIndexed, execINC),
0xEE: newOp("INC", 0xEE, 3, absolute, todo), 0xEE: newOp("INC", 0xEE, 3, absolute, execINC),
0xFE: newOp("INC", 0xFE, 3, absoluteXIndexed, todo), 0xFE: newOp("INC", 0xFE, 3, absoluteXIndexed, execINC),
// INX Increment Index X by One // INX Increment Index X by One
// addressing assembler opc bytes cyles // addressing assembler opc bytes cyles