From 195d9098a1b6f0d4b31607abbeeea282e0d42cd5 Mon Sep 17 00:00:00 2001 From: Ivan Izaguirre Date: Tue, 29 Jan 2019 00:06:15 +0100 Subject: [PATCH] Reorder execute.go --- execute.go | 90 +++++++++++++++++++++++++++--------------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/execute.go b/execute.go index 2296930..95404dd 100644 --- a/execute.go +++ b/execute.go @@ -31,50 +31,6 @@ func getWordInLine(line []uint8) uint16 { return uint16(line[1]) + 0x100*uint16(line[2]) } -type opcode struct { - name string - bytes int - cycles int - action opFunc -} - -type opFunc func(s *state, line []uint8, opcode opcode) - -func opNOP(s *state, line []uint8, opcode opcode) {} - -func buildOpTransfer(regSrc int, regDst int) opFunc { - return func(s *state, line []uint8, opcode opcode) { - value := s.registers.getRegister(regSrc) - s.registers.setRegister(regDst, value) - if regDst != regSP { - s.registers.updateFlagZN(value) - } - } -} - -func buildOpIncDec(addressMode int, inc bool) opFunc { - return func(s *state, line []uint8, opcode opcode) { - value, hasAddress, address, register := resolveWithAddressMode(s, line, addressMode) - if inc { - value++ - } else { - value-- - } - s.registers.updateFlagZN(value) - storeWhereNeeded(s, value, hasAddress, address, register) - } -} - -func storeWhereNeeded(s *state, value uint8, hasAddress bool, address uint16, register int) { - if hasAddress { - s.memory[address] = value - } else if register != regNone { - s.registers.setRegister(register, value) - } else { - // Todo: assert impossible - } -} - func resolveWithAddressMode(s *state, line []uint8, addressMode int) ( value uint8, hasAddress bool, address uint16, register int) { hasAddress = true @@ -121,6 +77,50 @@ func resolveWithAddressMode(s *state, line []uint8, addressMode int) ( return } +func storeWhereResolved(s *state, value uint8, hasAddress bool, address uint16, register int) { + if hasAddress { + s.memory[address] = value + } else if register != regNone { + s.registers.setRegister(register, value) + } else { + // Todo: assert impossible + } +} + +type opcode struct { + name string + bytes int + cycles int + action opFunc +} + +type opFunc func(s *state, line []uint8, opcode opcode) + +func opNOP(s *state, line []uint8, opcode opcode) {} + +func buildOpTransfer(regSrc int, regDst int) opFunc { + return func(s *state, line []uint8, opcode opcode) { + value := s.registers.getRegister(regSrc) + s.registers.setRegister(regDst, value) + if regDst != regSP { + s.registers.updateFlagZN(value) + } + } +} + +func buildOpIncDec(addressMode int, inc bool) opFunc { + return func(s *state, line []uint8, opcode opcode) { + value, hasAddress, address, register := resolveWithAddressMode(s, line, addressMode) + if inc { + value++ + } else { + value-- + } + s.registers.updateFlagZN(value) + storeWhereResolved(s, value, hasAddress, address, register) + } +} + func buildRotate(addressMode int, isLeft bool) opFunc { return func(s *state, line []uint8, opcode opcode) { value, hasAddress, address, register := resolveWithAddressMode(s, line, addressMode) @@ -138,7 +138,7 @@ func buildRotate(addressMode int, isLeft bool) opFunc { } s.registers.updateFlag(flagC, carry) s.registers.updateFlagZN(value) - storeWhereNeeded(s, value, hasAddress, address, register) + storeWhereResolved(s, value, hasAddress, address, register) } }