forked from calc84maniac/tiboyce
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathopcodegen.asm
227 lines (208 loc) · 2.91 KB
/
opcodegen.asm
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
; Allocate at 256-byte aligned cursor memory
opgenroutines:
opgenE9:
ex de,hl
ld (hl),$C3
inc hl
ld (hl),ophandlerE9 & $FF
inc hl
ld (hl),ophandlerE9 >> 8
ex de,hl
ret
opgenE0:
jp opgenFFwrite
opgenEA:
jp opgenCONSTwrite
opgenF0:
jp opgenFFread
opgenFA:
jp opgenCONSTread
opgenCALLcond:
jp _opgenCALLcond
opgenCALL:
jp _opgenCALL
opgenRST:
jp _opgenRST
opgenJP:
jp _opgenJP
opgenJR:
jp _opgenJR
opgenRET:
jp _opgenRET
opgenRETcond:
jp _opgenRETcond
opgen08:
call opgenroutinecall2byte_5cc
.dw ophandler08
opgen31:
call opgenroutinecall2byte_3cc
.dw ophandler31
opgenE8:
call opgenroutinecall1byte_4cc
.dw ophandlerE8
opgenF8:
call opgenroutinecall1byte_3cc
.dw ophandlerF8
opgen36:
call opgenroutinecall1byte_3cc
.dw ophandler36
opgen34:
call opgenroutinecall_3cc
.dw ophandler34
opgen35:
call opgenroutinecall_3cc
.dw ophandler35
opgen39:
call opgenroutinecall_2cc
.dw ophandler39
opgen76:
call opgenroutinecall_1cc
.dw ophandler76
opgenE2:
call opgenroutinecall_2cc
.dw ophandlerE2
opgenF1:
call opgenroutinecall_3cc
.dw ophandlerF1
opgenF2:
call opgenroutinecall_2cc
.dw ophandlerF2
opgenF3:
call opgenroutinecall_1cc
.dw ophandlerF3
opgenF5:
call opgenroutinecall_4cc
.dw ophandlerF5
opgenF9:
call opgenroutinecall_2cc
.dw ophandlerF9
opgenEI:
call opgenroutinecall_1cc
.dw ophandlerEI
opgenMEM:
ld a,RST_MEM
ld (de),a
inc de
ldi
inc de
dec iy
jr opgen_next_fast
opgenPUSH:
ldi
ld a,RST_PUSH
ld (de),a
inc de
lea iy,iy-3
jr opgen_next_fast
opgenPOP:
ld a,RST_POP
ld (de),a
inc de
opgen1byte_3cc:
lea iy,iy-2
jr opgen1byte
opgen33:
opgen3B:
dec iy
ex de,hl
ld (hl),$D9 ; EXX
inc hl
ld (hl),$5B ; .LIL
inc hl
res 4,c
ld (hl),c ; INC/DEC HL
inc hl
ld (hl),$D9 ; EXX
opgen_next_swap_skip:
ex de,hl
opgen_next_skip:
inc de
inc hl
opgen_next:
ld bc,opgentable
jr opgen_next_fast
opgenNOP:
xor a
ld (de),a
jr opgen_next_skip
opgenCB:
ldi
ld a,(hl)
and $07
cp $06
jr nz,opgen1byte
opgenswap:
dec de
ld a,RST_BITS
ld (de),a
inc de
jr opgen1byte
opgen1byte_2cc:
dec iy
jr opgen1byte
opgen3byte_low:
inc b
opgen3byte:
ldi
opgen2byte:
ldi
opgen1byte:
ldi
opgen_next_fast:
ld c,(hl)
ld a,(bc)
ld ixl,a
ld a,l
sub iyl
ret p
jp (ix)
opgenRETI:
jr _opgenRETI
opgenINVALID:
jr _opgenINVALID
opgenJRcond:
jr _opgenJRcond
opgenJPcond:
jr _opgenJPcond
opgen27:
call opgenroutinecall_1cc
.dw ophandler27
.echo "Opgen routine size: ", $ - opgenroutines
_opgenJRcond:
ld b,a
ld a,c
xor $20 ^ $28
ld (de),a
inc de
ld a,8
ld (de),a
inc de
ld a,b
call opgen_emit_JR
jr opgen_next_skip
_opgenJPcond:
ld b,a
ld a,c
xor $C2 ^ $28
ld (de),a
inc de
ld a,8
ld (de),a
inc de
ld a,b
call opgen_emit_JP
jr opgen_next_skip
_opgenRETI:
lea iy,iy-3
ex de,hl
ld (hl),$C3 ;JP ophandlerRETI
inc hl
ld (hl),ophandlerRETI & $FF
inc hl
ld (hl),ophandlerRETI >> 8
ex de,hl
ret
_opgenINVALID:
ld a,RST_INVALID_OPCODE
ld (de),a
ret