Simplify resolveWithAddressMethod() use with Lens pattern

This commit is contained in:
Ivan Izaguirre 2019-01-29 00:23:43 +01:00
parent 195d9098a1
commit e6535c2778
1 changed files with 19 additions and 18 deletions

View File

@ -31,10 +31,11 @@ func getWordInLine(line []uint8) uint16 {
return uint16(line[1]) + 0x100*uint16(line[2]) return uint16(line[1]) + 0x100*uint16(line[2])
} }
func resolveWithAddressMode(s *state, line []uint8, addressMode int) ( func resolveWithAddressMode(s *state, line []uint8, addressMode int) (value uint8, setValue func(uint8)) {
value uint8, hasAddress bool, address uint16, register int) { var address uint16
hasAddress = true hasAddress := true
register = regNone register := regNone
switch addressMode { switch addressMode {
case modeAccumulator: case modeAccumulator:
value = s.registers.getA() value = s.registers.getA()
@ -74,17 +75,17 @@ func resolveWithAddressMode(s *state, line []uint8, addressMode int) (
if hasAddress { if hasAddress {
value = s.memory[address] value = s.memory[address]
} }
return
}
func storeWhereResolved(s *state, value uint8, hasAddress bool, address uint16, register int) { setValue = func(value uint8) {
if hasAddress { if hasAddress {
s.memory[address] = value s.memory[address] = value
} else if register != regNone { } else if register != regNone {
s.registers.setRegister(register, value) s.registers.setRegister(register, value)
} else { } else {
// Todo: assert impossible // Todo: assert impossible
}
} }
return
} }
type opcode struct { type opcode struct {
@ -110,20 +111,20 @@ func buildOpTransfer(regSrc int, regDst int) opFunc {
func buildOpIncDec(addressMode int, inc bool) opFunc { func buildOpIncDec(addressMode int, inc bool) opFunc {
return func(s *state, line []uint8, opcode opcode) { return func(s *state, line []uint8, opcode opcode) {
value, hasAddress, address, register := resolveWithAddressMode(s, line, addressMode) value, setValue := resolveWithAddressMode(s, line, addressMode)
if inc { if inc {
value++ value++
} else { } else {
value-- value--
} }
s.registers.updateFlagZN(value) s.registers.updateFlagZN(value)
storeWhereResolved(s, value, hasAddress, address, register) setValue(value)
} }
} }
func buildRotate(addressMode int, isLeft bool) opFunc { func buildRotate(addressMode int, isLeft bool) opFunc {
return func(s *state, line []uint8, opcode opcode) { return func(s *state, line []uint8, opcode opcode) {
value, hasAddress, address, register := resolveWithAddressMode(s, line, addressMode) value, setValue := resolveWithAddressMode(s, line, addressMode)
oldCarry := s.registers.getFlagBit(flagC) oldCarry := s.registers.getFlagBit(flagC)
var carry bool var carry bool
@ -138,13 +139,13 @@ func buildRotate(addressMode int, isLeft bool) opFunc {
} }
s.registers.updateFlag(flagC, carry) s.registers.updateFlag(flagC, carry)
s.registers.updateFlagZN(value) s.registers.updateFlagZN(value)
storeWhereResolved(s, value, hasAddress, address, register) setValue(value)
} }
} }
func buildOpLoad(addressMode int, regDst int) opFunc { func buildOpLoad(addressMode int, regDst int) opFunc {
return func(s *state, line []uint8, opcode opcode) { return func(s *state, line []uint8, opcode opcode) {
value, _, _, _ := resolveWithAddressMode(s, line, addressMode) value, _ := resolveWithAddressMode(s, line, addressMode)
s.registers.setRegister(regDst, value) s.registers.setRegister(regDst, value)
s.registers.updateFlagZN(value) s.registers.updateFlagZN(value)
} }