-
Notifications
You must be signed in to change notification settings - Fork 0
/
instruction_regpair.go
159 lines (141 loc) · 3.04 KB
/
instruction_regpair.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package gomu8080
/* Register Pair Instructions */
/* STACK Instruction */
// push data onto stack
func (p *Processor) push(msb *byte, lsb *byte) {
p.dasm("PUSH")
p.mmu.Memory[p.SP-1] = *msb
p.mmu.Memory[p.SP-2] = *lsb
p.SP -= 2
}
// pop data off stack (register pair)
func (p *Processor) pop(msb *byte, lsb *byte) {
p.dasm("POP")
*lsb = p.mmu.Memory[p.SP]
*msb = p.mmu.Memory[p.SP+1]
p.SP += 2
}
// push PSW onto stack
func (p *Processor) pushPSW() {
p.dasm("PUSH PSW")
p.mmu.Memory[p.SP-1] = p.A
p.mmu.Memory[p.SP-2] = p.getFlags()
p.SP -= 2
}
// pop data off stack to PSW
func (p *Processor) popPSW() {
p.dasm("POP PSW")
flags := p.mmu.Memory[p.SP]
p.A = p.mmu.Memory[p.SP+1]
p.SP += 2
//restore flags
p.Carry = false
p.Parity = false
p.AuxiliaryCarry = false
p.Zero = false
p.Sign = false
if flags&0b00000001 > 0 {
p.Carry = true
}
if flags&0b00000100 > 0 {
p.Parity = true
}
if flags&0b00010000 > 0 {
p.AuxiliaryCarry = true
}
if flags&0b01000000 > 0 {
p.Zero = true
}
if flags&0b10000000 > 0 {
p.Sign = true
}
// update unuse flags
if flags&0b00000010 > 0 {
p.FlagBit1 = true
}
if flags&0b00001000 > 0 {
p.FlagBit3 = true
}
if flags&0b00100000 > 0 {
p.FlagBit5 = true
}
}
// Double Add - add specified register pair to HL
func (p *Processor) dad(msb *byte, lsb *byte) {
p.dasm("DAD")
adder := uint32(*msb)<<8 | uint32(*lsb)
result := uint32(p.H)<<8 | uint32(p.L)
result += adder
p.H = byte(result >> 8)
p.L = byte(result & 0xFF)
p.Carry = result > 0xFFFF // greater than 2-byte
}
// Double Add - add specified register pair to HL (16-bit operand)
func (p *Processor) dad16(reg *uint16) {
p.dasm("DAD")
adder := uint32(*reg)
HL := uint32(p.H)<<8 | uint32(p.L)
HL += adder
p.H = byte(HL >> 8)
p.L = byte(HL & 0xFF)
p.Carry = HL > 0xFFFF
}
// Increase value of register pair by 1
func (p *Processor) inx(msb *byte, lsb *byte) {
p.dasm("INX")
// *lsb += 1
// if *lsb == 0 {
// *msb += 1
// }
result := (uint16(*msb) << 8) | uint16(*lsb)
result += 1
*msb = byte(result >> 8)
*lsb = byte(result & 0x00FF)
}
// Increase value of register pair by 1 (16-bit input)
func (p *Processor) inx16(reg *uint16) {
p.dasm("INX")
*reg += 1
}
// Decrease value of register pair by 1
func (p *Processor) dcx(msb *byte, lsb *byte) {
p.dasm("DCX")
// *lsb -= 1
// if *lsb == 0xFF {
// *msb -= 1
// }
result := (uint16(*msb) << 8) | uint16(*lsb)
result -= 1
*msb = byte(result >> 8)
*lsb = byte(result & 0x00FF)
}
// Decrease value of register pair by 1 (16-bit)
func (p *Processor) dcx16(reg *uint16) {
p.dasm("DCX")
*reg -= 1
}
// Exchange register pair HL <-> DE
func (p *Processor) xchg() {
p.dasm("XCHG")
tlsb := p.L
tmsb := p.H
p.L = p.E
p.H = p.D
p.E = tlsb
p.D = tmsb
}
// Exchange stack HL <-> mem[stack pointer]
func (p *Processor) xthl() {
p.dasm("XTHL")
tlsb := p.mmu.Memory[p.SP]
tmsb := p.mmu.Memory[p.SP+1]
p.mmu.Memory[p.SP] = p.L
p.mmu.Memory[p.SP+1] = p.H
p.L = tlsb
p.H = tmsb
}
// Load SP from HL
func (p *Processor) sphl() {
p.dasm("SPHL")
p.SP = (uint16(p.H) << 8) | uint16(p.L)
}