Simplify resolveWithAddressMethod() use with Lens pattern
This commit is contained in:
parent
195d9098a1
commit
e6535c2778
37
execute.go
37
execute.go
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue