comparison z80.cpu @ 2440:338c78da3fff

Added a little syntax sugar to CPU DSL and started updating new Z80 core to use it
author Michael Pavone <pavone@retrodev.com>
date Sun, 11 Feb 2024 17:26:52 -0800
parents 1dc718581aac
children 4435abe5db5e
comparison
equal deleted inserted replaced
2439:a66916828c9b 2440:338c78da3fff
76 C 0 carry chflags.7 76 C 0 carry chflags.7
77 77
78 78
79 z80_op_fetch 79 z80_op_fetch
80 cycles 1 80 cycles 1
81 add 1 r r 81 r += 1
82 mov pc scratch1 82 scratch1 = pc
83 ocall read_8 83 ocall read_8
84 add 1 pc pc 84 pc += 1
85 85
86 z80_run_op 86 z80_run_op
87 #printf "Z80: %X @ %d\n" pc cycles 87 #printf "Z80: %X @ %d\n" pc cycles
88 #printf "Z80: %X - A: %X, B: %X, C: %X D: %X, E: %X, H: %X, L: %X, SP: %X, IX: %X, IY: %X @ %d\n" pc a b c d e h l sp ix iy cycles 88 #printf "Z80: %X - A: %X, B: %X, C: %X D: %X, E: %X, H: %X, L: %X, SP: %X, IX: %X, IY: %X @ %d\n" pc a b c d e h l sp ix iy cycles
89 z80_op_fetch 89 z80_op_fetch
91 91
92 z80_interrupt 92 z80_interrupt
93 cmp int_cycle cycles 93 cmp int_cycle cycles
94 if >=U 94 if >=U
95 95
96 mov 0 iff1 96 iff1 = 0
97 mov 0 iff2 97 iff2 = 0
98 cycles 6 98 cycles 6
99 update_sync 99 update_sync
100 100
101 switch imode 101 switch imode
102 case 0 102 case 0
103 dispatch int_value 103 dispatch int_value
104 104
105 case 1 105 case 1
106 dispatch 0xFF 106 dispatch 0xFF
107 107
108 case 2 108 case 2
109 lsl i 8 pc 109 lsl i 8 pc
110 or int_value pc pc 110 pc |= int_value
111 #CD is call 111 #CD is call
112 dispatch 0xCD 112 dispatch 0xCD
113 end 113 end
114 114
115 else 115 else
116 116
117 cmp nmi_cycle cycles 117 cmp nmi_cycle cycles
118 if >=U 118 if >=U
119 119
120 mov 0xFFFFFFFF nmi_cycle 120 nmi_cycle = 0xFFFFFFFF
121 mov 0 iff1 121 iff1 = 0
122 local pch 8 122 local pch 8
123 lsr pc 8 pch 123 lsr pc 8 pch
124 meta high pch 124 meta high pch
125 meta low pc 125 meta low pc
126 z80_push 126 z80_push
127 mov 0x66 pc 127 pc = 0x66
128 update_sync 128 update_sync
129 129
130 end 130 end
131 end 131 end
132 132
133 133
134 11001011 cb_prefix 134 11001011 cb_prefix
135 z80_op_fetch 135 z80_op_fetch
148 dispatch scratch1 fd 148 dispatch scratch1 fd
149 149
150 dd 11001011 ddcb_prefix 150 dd 11001011 ddcb_prefix
151 z80_calc_index ix 151 z80_calc_index ix
152 cycles 2 152 cycles 2
153 mov pc scratch1 153 scratch1 = pc
154 ocall read_8 154 ocall read_8
155 add 1 pc pc 155 pc += 1
156 dispatch scratch1 ddcb 156 dispatch scratch1 ddcb
157 157
158 fd 11001011 fdcb_prefix 158 fd 11001011 fdcb_prefix
159 z80_calc_index iy 159 z80_calc_index iy
160 cycles 2 160 cycles 2
161 mov pc scratch1 161 scratch1 = pc
162 ocall read_8 162 ocall read_8
163 add 1 pc pc 163 pc += 1
164 dispatch scratch1 fdcb 164 dispatch scratch1 fdcb
165 165
166 z80_check_cond 166 z80_check_cond
167 arg cond 8 167 arg cond 8
168 local invert 8 168 local invert 8
169 switch cond 169 switch cond
170 case 0 170 case 0
171 meta istrue invert 171 meta istrue invert
172 lnot zflag invert 172 lnot zflag invert
173 173
174 case 1 174 case 1
175 meta istrue zflag 175 meta istrue zflag
176 176
177 case 2 177 case 2
178 meta istrue invert 178 meta istrue invert
179 not chflags invert 179 not chflags invert
180 and 0x80 invert invert 180 invert &= 0x80
181 181
182 case 3 182 case 3
183 meta istrue invert 183 meta istrue invert
184 and 0x80 chflags invert 184 and 0x80 chflags invert
185 185
186 case 4 186 case 4
187 meta istrue invert 187 meta istrue invert
188 lnot pvflag invert 188 lnot pvflag invert
189 189
190 case 5 190 case 5
191 meta istrue pvflag 191 meta istrue pvflag
192 192
193 case 6 193 case 6
194 meta istrue invert 194 meta istrue invert
195 not last_flag_result invert 195 not last_flag_result invert
196 and 0x80 invert invert 196 invert &= 0x80
197 197
198 case 7 198 case 7
199 meta istrue invert 199 meta istrue invert
200 and 0x80 last_flag_result invert 200 and 0x80 last_flag_result invert
201
202 end 201 end
203 202
204 z80_fetch_hl 203 z80_fetch_hl
205 lsl h 8 scratch1 204 lsl h 8 scratch1
206 or l scratch1 scratch1 205 scratch1 |= l
207 ocall read_8 206 ocall read_8
208 207
209 z80_store_hl 208 z80_store_hl
210 lsl h 8 scratch2 209 lsl h 8 scratch2
211 or l scratch2 scratch2 210 scratch2 |= l
212 ocall write_8 211 ocall write_8
213 212
214 z80_fetch_immed 213 z80_fetch_immed
215 mov pc scratch1 214 scratch1 = pc
216 ocall read_8 215 ocall read_8
217 add 1 pc pc 216 pc += 1
218 217
219 z80_fetch_immed16 218 z80_fetch_immed16
220 mov pc scratch1 219 scratch1 = pc
221 ocall read_8 220 ocall read_8
222 mov scratch1 wz 221 wz = scratch1
223 add 1 pc pc 222 pc += 1
224 mov pc scratch1 223 scratch1 = pc
225 ocall read_8 224 ocall read_8
226 add 1 pc pc 225 pc += 1
227 lsl scratch1 8 scratch1 226 scratch1 <<= 8
228 or scratch1 wz wz 227 wz |= scratch1
229 228
230 z80_fetch_immed_reg16 229 z80_fetch_immed_reg16
231 mov pc scratch1 230 scratch1 = pc
232 ocall read_8 231 ocall read_8
233 mov scratch1 low 232 low = scratch1
234 add 1 pc pc 233 pc += 1
235 mov pc scratch1 234 scratch1 = pc
236 ocall read_8 235 ocall read_8
237 mov scratch1 high 236 high = scratch1
238 add 1 pc pc 237 pc += 1
239 238
240 z80_fetch_immed_to_reg16 239 z80_fetch_immed_to_reg16
241 mov pc scratch1 240 scratch1 = pc
242 ocall read_8 241 ocall read_8
243 mov scratch1 reg 242 reg = scratch1
244 add 1 pc pc 243 pc += 1
245 mov pc scratch1 244 scratch1 = pc
246 ocall read_8 245 ocall read_8
247 add 1 pc pc 246 pc += 1
248 lsl scratch1 8 scratch1 247 scratch1 <<= 8
249 or scratch1 reg reg 248 reg |= scratch1
250 249
251 01RRR110 ld_from_hl 250 01RRR110 ld_from_hl
252 z80_fetch_hl 251 z80_fetch_hl
253 mov scratch1 main.R 252 main.R = scratch1
254 253
255 01DDDSSS ld_from_reg 254 01DDDSSS ld_from_reg
256 mov main.S main.D 255 main.D = main.S
257 256
258 dd 01DDD100 ld_from_ixh 257 dd 01DDD100 ld_from_ixh
259 invalid D 6 258 invalid D 6
260 lsr ix 8 main.D 259 lsr ix 8 main.D
261 260
262 dd 01100SSS ld_to_ixh 261 dd 01100SSS ld_to_ixh
263 invalid S 6 262 invalid S 6
264 local tmp 16 263 local tmp 16
265 and 0xFF ix ix 264 ix &= 0xFF
266 lsl main.S 8 tmp 265 lsl main.S 8 tmp
267 or tmp ix ix 266 ix |= tmp
268 267
269 dd 0110D10S ld_ixb_to_ixb 268 dd 0110D10S ld_ixb_to_ixb
270 269
271 dd 01DDD101 ld_from_ixl 270 dd 01DDD101 ld_from_ixl
272 invalid D 6 271 invalid D 6
273 mov ix main.D 272 main.D = ix
274 273
275 dd 01101SSS ld_to_ixl 274 dd 01101SSS ld_to_ixl
276 invalid S 6 275 invalid S 6
277 and 0xFF00 ix ix 276 ix &= 0xFF00
278 or main.S ix ix 277 ix |= main.S
279 278
280 dd 01100101 ld_ixl_to_ixh 279 dd 01100101 ld_ixl_to_ixh
281 local tmp 16 280 local tmp 16
282 lsl ix 8 tmp 281 lsl ix 8 tmp
283 and 0xFF ix ix 282 ix &= 0xFF
284 or tmp ix ix 283 ix |= tmp
285 284
286 dd 01101100 ld_ixh_to_ixl 285 dd 01101100 ld_ixh_to_ixl
287 local tmp 16 286 local tmp 16
288 lsr ix 8 tmp 287 lsr ix 8 tmp
289 and 0xFF00 ix ix 288 ix &= 0xFF00
290 or tmp ix ix 289 ix |= tmp
291 290
292 fd 01DDD100 ld_from_iyh 291 fd 01DDD100 ld_from_iyh
293 invalid D 6 292 invalid D 6
294 lsr iy 8 main.D 293 lsr iy 8 main.D
295 294
296 fd 01100SSS ld_to_iyh 295 fd 01100SSS ld_to_iyh
297 invalid S 6 296 invalid S 6
298 local tmp 16 297 local tmp 16
299 and 0xFF iy iy 298 iy &= 0xFF
300 lsl main.S 8 tmp 299 lsl main.S 8 tmp
301 or tmp iy iy 300 iy |= tmp
302 301
303 fd 0110D10S ld_iyb_to_iyb 302 fd 0110D10S ld_iyb_to_iyb
304 303
305 fd 01DDD101 ld_from_iyl 304 fd 01DDD101 ld_from_iyl
306 invalid D 6 305 invalid D 6
307 mov iy main.D 306 main.D = iy
308 307
309 fd 01101SSS ld_to_iyl 308 fd 01101SSS ld_to_iyl
310 invalid S 6 309 invalid S 6
311 and 0xFF00 iy iy 310 iy &= 0xFF00
312 or main.S iy iy 311 iy |= main.S
313 312
314 fd 01100101 ld_iyl_to_iyh 313 fd 01100101 ld_iyl_to_iyh
315 local tmp 16 314 local tmp 16
316 lsl iy 8 tmp 315 lsl iy 8 tmp
317 and 0xFF iy iy 316 iy &= 0xFF
318 or tmp iy iy 317 iy |= tmp
319 318
320 fd 01101100 ld_iyh_to_iyl 319 fd 01101100 ld_iyh_to_iyl
321 local tmp 16 320 local tmp 16
322 lsr iy 8 tmp 321 lsr iy 8 tmp
323 and 0xFF00 iy iy 322 iy &= 0xFF00
324 or tmp iy iy 323 iy |= tmp
325 324
326 z80_calc_index 325 z80_calc_index
327 arg index 16 326 arg index 16
328 mov index wz 327 wz = index
329 z80_fetch_immed 328 z80_fetch_immed
330 sext 16 scratch1 scratch1 329 sext 16 scratch1 scratch1
331 add scratch1 wz wz 330 wz += scratch1
332 331
333 z80_fetch_index 332 z80_fetch_index
334 arg index 16 333 arg index 16
335 z80_calc_index index 334 z80_calc_index index
336 mov wz scratch1 335 scratch1 = wz
337 cycles 5 336 cycles 5
338 ocall read_8 337 ocall read_8
339 338
340 z80_store_index 339 z80_store_index
341 mov wz scratch2 340 scratch2 = wz
342 ocall write_8 341 ocall write_8
343 342
344 dd 01RRR110 ld_from_ix 343 dd 01RRR110 ld_from_ix
345 z80_fetch_index ix 344 z80_fetch_index ix
346 mov scratch1 main.R 345 main.R = scratch1
347 346
348 fd 01RRR110 ld_from_iy 347 fd 01RRR110 ld_from_iy
349 z80_fetch_index iy 348 z80_fetch_index iy
350 mov scratch1 main.R 349 main.R = scratch1
351 350
352 00RRR110 ld_immed 351 00RRR110 ld_immed
353 z80_fetch_immed 352 z80_fetch_immed
354 mov scratch1 main.R 353 main.R = scratch1
355 354
356 dd 00100110 ld_immed_ixh 355 dd 00100110 ld_immed_ixh
357 z80_fetch_immed 356 z80_fetch_immed
358 lsl scratch1 8 scratch1 357 scratch1 <<= 8
359 and 0xFF ix ix 358 ix &= 0xFF
360 or scratch1 ix ix 359 ix |= scratch1
361 360
362 dd 00101110 ld_immed_ixl 361 dd 00101110 ld_immed_ixl
363 z80_fetch_immed 362 z80_fetch_immed
364 and 0xFF00 ix ix 363 ix &= 0xFF00
365 or scratch1 ix ix 364 ix |= scratch1
366 365
367 fd 00100110 ld_immed_iyh 366 fd 00100110 ld_immed_iyh
368 z80_fetch_immed 367 z80_fetch_immed
369 lsl scratch1 8 scratch1 368 scratch1 <<= 8
370 and 0xFF iy iy 369 iy &= 0xFF
371 or scratch1 iy iy 370 iy |= scratch1
372 371
373 fd 00101110 ld_immed_iyl 372 fd 00101110 ld_immed_iyl
374 z80_fetch_immed 373 z80_fetch_immed
375 and 0xFF00 iy iy 374 iy &= 0xFF00
376 or scratch1 iy iy 375 iy |= scratch1
377 376
378 01110RRR ld_to_hl 377 01110RRR ld_to_hl
379 mov main.R scratch1 378 scratch1 = main.R
380 z80_store_hl 379 z80_store_hl
381 380
382 dd 01110RRR ld_to_ix 381 dd 01110RRR ld_to_ix
383 z80_calc_index ix 382 z80_calc_index ix
384 mov wz scratch2 383 scratch2 = wz
385 mov main.R scratch1 384 scratch1 = main.R
386 cycles 5 385 cycles 5
387 ocall write_8 386 ocall write_8
388 387
389 fd 01110RRR ld_to_iy 388 fd 01110RRR ld_to_iy
390 z80_calc_index iy 389 z80_calc_index iy
391 mov wz scratch2 390 scratch2 = wz
392 mov main.R scratch1 391 scratch1 = main.R
393 cycles 5 392 cycles 5
394 ocall write_8 393 ocall write_8
395 394
396 00110110 ld_to_hl_immed 395 00110110 ld_to_hl_immed
397 z80_fetch_immed 396 z80_fetch_immed
399 398
400 dd 00110110 ld_to_ixd_immed 399 dd 00110110 ld_to_ixd_immed
401 z80_calc_index ix 400 z80_calc_index ix
402 z80_fetch_immed 401 z80_fetch_immed
403 cycles 2 402 cycles 2
404 mov wz scratch2 403 scratch2 = wz
405 ocall write_8 404 ocall write_8
406 405
407 fd 00110110 ld_to_iyd_immed 406 fd 00110110 ld_to_iyd_immed
408 z80_calc_index iy 407 z80_calc_index iy
409 z80_fetch_immed 408 z80_fetch_immed
410 cycles 2 409 cycles 2
411 mov wz scratch2 410 scratch2 = wz
412 ocall write_8 411 ocall write_8
413 412
414 00001010 ld_a_from_bc 413 00001010 ld_a_from_bc
415 lsl b 8 wz 414 lsl b 8 wz
416 or c wz wz 415 wz |= c
417 mov wz scratch1 416 scratch1 = wz
418 add 1 wz wz 417 wz += 1
419 ocall read_8 418 ocall read_8
420 mov scratch1 a 419 a = scratch1
421 420
422 00011010 ld_a_from_de 421 00011010 ld_a_from_de
423 lsl d 8 wz 422 lsl d 8 wz
424 or e wz wz 423 wz |= e
425 mov wz scratch1 424 scratch1 = wz
426 add 1 wz wz 425 wz += 1
427 ocall read_8 426 ocall read_8
428 mov scratch1 a 427 a = scratch1
429 428
430 00111010 ld_a_from_immed 429 00111010 ld_a_from_immed
431 z80_fetch_immed16 430 z80_fetch_immed16
432 mov wz scratch1 431 scratch1 = wz
433 add 1 wz wz 432 wz += 1
434 ocall read_8 433 ocall read_8
435 mov scratch1 a 434 a = scratch1
436 435
437 00000010 ld_a_to_bc 436 00000010 ld_a_to_bc
438 local tmp 8 437 local tmp 8
439 lsl b 8 scratch2 438 lsl b 8 scratch2
440 or c scratch2 scratch2 439 scratch2 |= c
441 mov a scratch1 440 scratch1 = a
442 add c 1 tmp 441 add c 1 tmp
443 lsl a 8 wz 442 lsl a 8 wz
444 or tmp wz wz 443 wz |= tmp
445 ocall write_8 444 ocall write_8
446 445
447 00010010 ld_a_to_de 446 00010010 ld_a_to_de
448 local tmp 8 447 local tmp 8
449 lsl d 8 scratch2 448 lsl d 8 scratch2
450 or e scratch2 scratch2 449 scratch2 |= e
451 mov a scratch1 450 scratch1 = a
452 add e 1 tmp 451 add e 1 tmp
453 lsl a 8 wz 452 lsl a 8 wz
454 or tmp wz wz 453 wz |= tmp
455 ocall write_8 454 ocall write_8
456 455
457 00110010 ld_a_to_immed 456 00110010 ld_a_to_immed
458 local tmp 16 457 local tmp 16
459 z80_fetch_immed16 458 z80_fetch_immed16
460 mov wz scratch2 459 scratch2 = wz
461 mov a scratch1 460 scratch1 = a
462 add 1 wz wz 461 wz += 1
463 ocall write_8 462 ocall write_8
464 and 0xFF wz wz 463 wz &= 0xFF
465 lsl a 8 tmp 464 lsl a 8 tmp
466 or tmp wz wz 465 wz |= tmp
467 466
468 ed 01000111 ld_i_a 467 ed 01000111 ld_i_a
469 mov a i 468 i = a
470 cycles 1 469 cycles 1
471 470
472 ed 01001111 ld_r_a 471 ed 01001111 ld_r_a
473 mov a r 472 r = a
474 and 0x80 a rhigh 473 and 0x80 a rhigh
475 cycles 1 474 cycles 1
476 475
477 ed 01011111 ld_a_r 476 ed 01011111 ld_a_r
478 cycles 1 477 cycles 1
479 and 0x7F r a 478 and 0x7F r a
480 or rhigh a a 479 a |= rhigh
481 update_flags SZYH0XN0 480 update_flags SZYH0XN0
482 mov iff2 pvflag 481 pvflag = iff2
483 482
484 ed 01010111 ld_a_i 483 ed 01010111 ld_a_i
485 cycles 1 484 cycles 1
486 mov i a 485 a = i
487 update_flags SZYH0XN0 486 update_flags SZYH0XN0
488 mov iff2 pvflag 487 pvflag = iff2
489 488
490 00000001 ld_bc_immed 489 00000001 ld_bc_immed
491 meta high b 490 meta high b
492 meta low c 491 meta low c
493 z80_fetch_immed_reg16 492 z80_fetch_immed_reg16
514 meta reg iy 513 meta reg iy
515 z80_fetch_immed_to_reg16 514 z80_fetch_immed_to_reg16
516 515
517 z80_fetch16_from_immed 516 z80_fetch16_from_immed
518 z80_fetch_immed16 517 z80_fetch_immed16
519 mov wz scratch1 518 scratch1 = wz
520 ocall read_8 519 ocall read_8
521 mov scratch1 low 520 low = scratch1
522 add 1 wz wz 521 wz += 1
523 mov wz scratch1 522 scratch1 = wz
524 ocall read_8 523 ocall read_8
525 mov scratch1 high 524 high = scratch1
526 add 1 wz wz 525 wz += 1
527 526
528 00101010 ld_hl_from_immed 527 00101010 ld_hl_from_immed
529 meta low l 528 meta low l
530 meta high h 529 meta high h
531 z80_fetch16_from_immed 530 z80_fetch16_from_immed
545 meta high h 544 meta high h
546 z80_fetch16_from_immed 545 z80_fetch16_from_immed
547 546
548 z80_fetch_reg16_from_immed 547 z80_fetch_reg16_from_immed
549 z80_fetch_immed16 548 z80_fetch_immed16
550 mov wz scratch1 549 scratch1 = wz
551 ocall read_8 550 ocall read_8
552 mov scratch1 reg 551 reg = scratch1
553 add 1 wz wz 552 wz += 1
554 mov wz scratch1 553 scratch1 = wz
555 ocall read_8 554 ocall read_8
556 lsl scratch1 8 scratch1 555 scratch1 <<= 8
557 or scratch1 reg reg 556 reg |= scratch1
558 add 1 wz wz 557 wz += 1
559 558
560 ed 01111011 ld_sp_from_immed 559 ed 01111011 ld_sp_from_immed
561 meta reg sp 560 meta reg sp
562 z80_fetch_reg16_from_immed 561 z80_fetch_reg16_from_immed
563 562
569 meta reg iy 568 meta reg iy
570 z80_fetch_reg16_from_immed 569 z80_fetch_reg16_from_immed
571 570
572 00100010 ld_hl_to_immed 571 00100010 ld_hl_to_immed
573 z80_fetch_immed16 572 z80_fetch_immed16
574 mov wz scratch2 573 scratch2 = wz
575 mov l scratch1 574 scratch1 = l
576 ocall write_8 575 ocall write_8
577 add 1 wz wz 576 wz += 1
578 mov wz scratch2 577 scratch2 = wz
579 mov h scratch1 578 scratch1 = h
580 ocall write_8 579 ocall write_8
581 add 1 wz wz 580 wz += 1
582 581
583 dd 00100010 ld_ix_to_immed 582 dd 00100010 ld_ix_to_immed
584 z80_fetch_immed16 583 z80_fetch_immed16
585 mov wz scratch2 584 scratch2 = wz
586 mov ix scratch1 585 scratch1 = ix
587 ocall write_8 586 ocall write_8
588 add 1 wz wz 587 wz += 1
589 mov wz scratch2 588 scratch2 = wz
590 lsr ix 8 scratch1 589 lsr ix 8 scratch1
591 ocall write_8 590 ocall write_8
592 add 1 wz wz 591 wz += 1
593 592
594 fd 00100010 ld_iy_to_immed 593 fd 00100010 ld_iy_to_immed
595 z80_fetch_immed16 594 z80_fetch_immed16
596 mov wz scratch2 595 scratch2 = wz
597 mov iy scratch1 596 scratch1 = iy
598 ocall write_8 597 ocall write_8
599 add 1 wz wz 598 wz += 1
600 mov wz scratch2 599 scratch2 = wz
601 lsr iy 8 scratch1 600 lsr iy 8 scratch1
602 ocall write_8 601 ocall write_8
603 add 1 wz wz 602 wz += 1
604 603
605 z80_regpair_to_immed 604 z80_regpair_to_immed
606 z80_fetch_immed16 605 z80_fetch_immed16
607 mov wz scratch2 606 scratch2 = wz
608 mov low scratch1 607 scratch1 = low
609 ocall write_8 608 ocall write_8
610 add 1 wz wz 609 wz += 1
611 mov high scratch1 610 scratch1 = high
612 mov wz scratch2 611 scratch2 = wz
613 ocall write_8 612 ocall write_8
614 add 1 wz wz 613 wz += 1
615 614
616 ed 01000011 ld_bc_to_immed 615 ed 01000011 ld_bc_to_immed
617 meta low c 616 meta low c
618 meta high b 617 meta high b
619 z80_regpair_to_immed 618 z80_regpair_to_immed
636 z80_regpair_to_immed 635 z80_regpair_to_immed
637 636
638 11111001 ld_sp_hl 637 11111001 ld_sp_hl
639 cycles 2 638 cycles 2
640 lsl h 8 sp 639 lsl h 8 sp
641 or l sp sp 640 sp |= l
642 641
643 dd 11111001 ld_sp_ix 642 dd 11111001 ld_sp_ix
644 cycles 2 643 cycles 2
645 mov ix sp 644 sp = ix
646 645
647 fd 11111001 ld_sp_iy 646 fd 11111001 ld_sp_iy
648 cycles 2 647 cycles 2
649 mov iy sp 648 sp = iy
650 649
651 z80_push 650 z80_push
652 cycles 1 651 cycles 1
653 sub 1 sp sp 652 sp -= 1
654 mov sp scratch2 653 scratch2 = sp
655 mov high scratch1 654 scratch1 = high
656 ocall write_8 655 ocall write_8
657 sub 1 sp sp 656 sp -= 1
658 mov sp scratch2 657 scratch2 = sp
659 mov low scratch1 658 scratch1 = low
660 ocall write_8 659 ocall write_8
661 660
662 11000101 push_bc 661 11000101 push_bc
663 meta high b 662 meta high b
664 meta low c 663 meta low c
694 z80_push 693 z80_push
695 694
696 z80_pop 695 z80_pop
697 mov sp scratch1 696 mov sp scratch1
698 ocall read_8 697 ocall read_8
699 add 1 sp sp 698 sp += 1
700 mov scratch1 low 699 low = scratch1
701 mov sp scratch1 700 scratch1 = sp
702 ocall read_8 701 ocall read_8
703 add 1 sp sp 702 sp += 1
704 mov scratch1 high 703 high = scratch1
705 704
706 11000001 pop_bc 705 11000001 pop_bc
707 meta high b 706 meta high b
708 meta low c 707 meta low c
709 z80_pop 708 z80_pop
734 fd 11100001 pop_iy 733 fd 11100001 pop_iy
735 local iyh 16 734 local iyh 16
736 meta high iyh 735 meta high iyh
737 meta low iy 736 meta low iy
738 z80_pop 737 z80_pop
739 lsl iyh 8 iyh 738 iyh <<= 8
740 or iyh iy iy 739 iy |= iyh
741 740
742 11101011 ex_de_hl 741 11101011 ex_de_hl
743 xchg e l 742 xchg e l
744 xchg d h 743 xchg d h
745 744
754 xchg e e' 753 xchg e e'
755 xchg h h' 754 xchg h h'
756 xchg l l' 755 xchg l l'
757 756
758 11100011 ex_sp_hl 757 11100011 ex_sp_hl
759 mov sp scratch1 758 scratch1 = sp
760 ocall read_8 759 ocall read_8
761 xchg l scratch1 760 xchg l scratch1
762 cycles 1 761 cycles 1
763 mov sp scratch2 762 scratch2 = sp
764 ocall write_8 763 ocall write_8
765 add 1 sp scratch1 764 add 1 sp scratch1
766 ocall read_8 765 ocall read_8
767 xchg h scratch1 766 xchg h scratch1
768 cycles 2 767 cycles 2
769 add 1 sp scratch2 768 add 1 sp scratch2
770 ocall write_8 769 ocall write_8
771 lsl h 8 wz 770 lsl h 8 wz
772 or l wz wz 771 wz |= l
773 772
774 dd 11100011 ex_sp_ix 773 dd 11100011 ex_sp_ix
775 mov sp scratch1 774 scratch1 = sp
776 ocall read_8 775 ocall read_8
777 mov scratch1 wz 776 wz = scratch1
778 mov ix scratch1 777 scratch1 = ix
779 cycles 1 778 cycles 1
780 mov sp scratch2 779 scratch2 = sp
781 ocall write_8 780 ocall write_8
782 add 1 sp scratch1 781 add 1 sp scratch1
783 ocall read_8 782 ocall read_8
784 lsl scratch1 8 scratch1 783 scratch1 <<= 8
785 or scratch1 wz wz 784 wz |= scratch1
786 lsr ix 8 scratch1 785 lsr ix 8 scratch1
787 cycles 2 786 cycles 2
788 add 1 sp scratch2 787 add 1 sp scratch2
789 ocall write_8 788 ocall write_8
790 mov wz ix 789 ix = wz
791 790
792 fd 11100011 ex_sp_iy 791 fd 11100011 ex_sp_iy
793 mov sp scratch1 792 scratch1 = sp
794 ocall read_8 793 ocall read_8
795 mov scratch1 wz 794 wz = scratch1
796 mov iy scratch1 795 scratch1 = iy
797 cycles 1 796 cycles 1
798 mov sp scratch2 797 scratch2 = sp
799 ocall write_8 798 ocall write_8
800 add 1 sp scratch1 799 add 1 sp scratch1
801 ocall read_8 800 ocall read_8
802 lsl scratch1 8 scratch1 801 scratch1 <<= 8
803 or scratch1 wz wz 802 wz |= scratch1
804 lsr iy 8 scratch1 803 lsr iy 8 scratch1
805 cycles 2 804 cycles 2
806 add 1 sp scratch2 805 add 1 sp scratch2
807 ocall write_8 806 ocall write_8
808 mov wz iy 807 iy = wz
809 808
810 10000RRR add_reg 809 10000RRR add_reg
811 add a main.R a 810 add a main.R a
812 update_flags SZYHVXN0C 811 update_flags SZYHVXN0C
813 812