]> cloudbase.mooo.com Git - ddt180.git/blame - ddt180.z80
Add CSIO interface.
[ddt180.git] / ddt180.z80
CommitLineData
0c4244e5 1; Disassembled ddtz.com, version "DDT/Z [8101]"\r
ed6c425a 2; with modified relocater.\r
0c4244e5 3;\r
ed6c425a
L
4; Build steps:\r
5; - Assemble to a .REL file with M80 or a compatible assembler.\r
6; - Use Digital Research Link-80 to generate a .PRL file (op switch).\r
7; - Cut the .PRL header (first 256 byte) end rename the result to DDTZ.COM.\r
0c4244e5 8\r
0f361185 9\r
dfd599a0
L
10 maclib config.inc\r
11\r
0f361185
L
12; Some greneral definitions\r
13\r
14BS equ 08h\r
15TAB equ 09h\r
16CR equ 0dh\r
17LF equ 0ah\r
18DEL equ 7fh\r
19CNTRX equ 'X'-'@'\r
20\r
21; CP/M memory layout\r
22\r
23BDOS equ 5\r
24TPA equ 0100h\r
25\r
26; ddtz specific definitions\r
27\r
28STACK_SIZE equ 80 ;ddtz internal stack\r
29CONBUF_SIZE equ 80 ;Size of console input buffer\r
30BP_CNT equ 12 ;Number of breakpoints\r
31BP_SIZE equ 4 ;Size of a breakpoint record\r
32\r
33bitmap_size equ (prog_size+7)/8\r
34\r
35;-------------------------------------------------------------------------------\r
efc2486e 36\r
ed6c425a 37 cseg\r
0f361185
L
38start::\r
39ddtz_base::\r
40 jr reloc\r
41 nop\r
42l0003h:\r
43 rst 30h ;rst used by ddtz\r
44di_or_ei: ;ints enabled/disabled while ddtz is running\r
45 nop\r
46 ret\r
efc2486e 47\r
0f361185 48;-------------------------------------------------------------------------------\r
efc2486e
L
49\r
50signon:\r
efc2486e
L
51 db 'DDTZ/180'\r
52 db ' - Version '\r
53 maclib version.inc\r
54 defvers\r
0f361185 55 dc ' ('\r
51e6b03c 56\r
efc2486e 57;-------------------------------------------------------------------------------\r
a3bccdeb
L
58; Clear old position\r
59\r
60cmde_clr:\r
61 ld (hl),0\r
62 inc hl\r
63 dec bc\r
64 ld a,b\r
65 or c\r
66 jr nz,cmde_clr\r
67\r
68; Determine current position\r
0c4244e5 69\r
0f361185 70reloc:\r
a3bccdeb
L
71 ld bc,(028h-2)\r
72 ld de,(028h)\r
73 ld a,i ;get iff2\r
74 ex af,af'\r
75 di\r
76 ld sp,028h ;rst instr needs a minimal stack\r
0f361185 77 ld hl,0e9e1h ;opcpdes pop hl/jp (hl)\r
a3bccdeb
L
78 ld (028h),hl\r
79 rst 028h\r
0f361185 80wearehere:\r
a3bccdeb
L
81 ld (028h-2),bc\r
82 ld (028h),de\r
0f361185
L
83 ld de,-(wearehere-ddtz_base)\r
84 add hl,de ; hl:\r
51e6b03c 85\r
0f361185
L
86 ld de,ddtz_base ; de:\r
87 or a\r
51e6b03c 88 sbc hl,de\r
0f361185 89 ex de,hl ; de: reloc offset\r
a3bccdeb
L
90 ld hl,stack\r
91 add hl,de\r
92 ld sp,hl\r
93 ex af,af'\r
94 push af\r
95 pop bc\r
96 bit 2,c\r
97 jr z,$+3\r
98 ei\r
0f361185
L
99 ld hl,ddtz_end ;start of reloc bitmap\r
100 add hl,de\r
a3bccdeb
L
101\r
102 push hl\r
0f361185 103 exx\r
a3bccdeb 104 pop hl\r
0f361185
L
105 ld bc,0108h ;init bit counter b (c==reload val)\r
106 exx\r
a3bccdeb 107\r
0f361185
L
108 LD HL,ddtz_base\r
109 add hl,de ;--> ddtz_base\r
110 ld bc,prog_size\r
51e6b03c
L
111reloc_lp:\r
112 EXX\r
113 djnz reloc_nl\r
114 ld b,c ;reload bit counter\r
115 LD e,(HL) ;get next 8 relocation bits\r
116 INC HL\r
117reloc_nl:\r
118 sla e\r
119 EXX\r
120 JR NC,reloc_next\r
121 DEC HL\r
122 LD A,(HL)\r
123 ADD A,E\r
124 LD (HL),A\r
125 INC HL\r
126 LD A,(HL)\r
127 ADC A,D\r
128 LD (HL),A\r
129reloc_next:\r
efc2486e
L
130 inc hl\r
131 dec bc\r
132 ld a,b\r
133 or c\r
134 jr nz,reloc_lp\r
0c4244e5 135\r
0c4244e5 136;-------------------------------------------------------------------------------\r
0c4244e5 137\r
0c4244e5 138\r
0f361185
L
139init::\r
140 LD SP,stack\r
0c4244e5 141\r
dfd599a0
L
142 if CPM\r
143\r
0f361185 144 ld hl,(1) ;wboot addr\r
58a0ff85 145 ld de,convec\r
0f361185
L
146 ex de,hl\r
147 ld b,3\r
148vini_l:\r
149 inc de\r
150 inc de\r
151 inc de\r
152 inc hl\r
153 ld (hl),e\r
154 inc hl\r
155 ld (hl),d\r
156 inc hl\r
157 djnz vini_l\r
dfd599a0
L
158 else\r
159 xor a\r
160 dec a\r
161 daa ; Z80: 099H, x180+: 0F9H\r
162 cp 99h ; Result on 180 type cpus is F9 here. Thanks Hitachi\r
163 jr z,ini_z80\r
164\r
165 xor a\r
166 call cinit\r
167 ld a,1\r
168 call cinit\r
169 jr ini_sign\r
170ini_z80:\r
171; if ...\r
172; .printx Error: Not yet implemented!\r
173; db "Stop\r
174; endif\r
175 endif ; CPM\r
176\r
177ini_sign:\r
0f361185
L
178 ld hl,signon\r
179 call pstr\r
180 ld hl,ddtz_base\r
181 call out_hl\r
182 call pstr_inl\r
183 dc ' - '\r
184 ld de,prog_size+bitmap_size-1\r
185 add hl,de\r
186 call out_hl\r
187 call pstr_inl\r
188 dc ')',CR,LF\r
9711a430 189\r
0f361185
L
190 ld a,i\r
191 ld (reg.i),a\r
192 ld a,0f3h\r
193 jp po,l0093h\r
194 ld a,0fbh\r
195l0093h:\r
196 ld (reg.iff),a\r
197 call di_or_ei\r
198 ld hl,ddtz_base\r
199 ld l,000h\r
200 ld (reg_sp),hl\r
0c4244e5 201\r
0f361185 202 jp mainloop\r
0c4244e5 203\r
9711a430
L
204;-------------------------------------------------------------------------------\r
205\r
dfd599a0
L
206 if CPM\r
207\r
208convec:\r
209const: jp 0 ; return console input status\r
210conin: jp 0 ; return console input character\r
211conout: jp 0 ; send console output character\r
212\r
213 else\r
214\r
215 include z180reg.inc\r
216\r
217iobyte equ 3\r
218\r
219max_device equ 3\r
220\r
221;-------------------------------------------------------------------------------\r
222\r
223; init device\r
224cinit: ; a = device\r
225 call vector_io_0\r
226 dw as0init\r
227 dw rret\r
228 dw rret\r
229 dw rret\r
230\r
231; character input status\r
232const: ; return a != 0 if character waiting\r
233 call vector_io\r
234 dw as0ista\r
235 dw null$status\r
236 dw csio_ista\r
237 dw null$status\r
238\r
239; character input\r
240conin: ; return a = input char\r
241 call vector_io\r
242 dw as0inp\r
243 dw null$input\r
244 dw csio_inp\r
245 dw null$input\r
246\r
247; character output\r
248conout: ; c = output char\r
249 call vector_io\r
250 dw as0out\r
251 dw rret\r
252 dw csio_out\r
253 dw rret\r
254\r
255;-------------------------------------------------------------------------------\r
256\r
257vector_io:\r
258 ld a,(iobyte)\r
259vector_io_0:\r
260 pop hl\r
261 cp max_device\r
262 jr c,exist\r
263 ld a,max_device ; use null device if a >= max$device\r
264exist:\r
265 call add_hl_a2\r
266 ld a,(hl)\r
267 inc hl\r
268 ld h,(hl)\r
269 ld l,a\r
270 jp (hl)\r
271\r
272;-------------------------------------------------------------------------------\r
273\r
274null$input:\r
275 ld a,1Ah\r
276rret:\r
277 ret\r
278ret$true:\r
279 or 0FFh\r
280 ret\r
281\r
282null$status:\r
283 xor a\r
284 ret\r
285\r
286;-------------------------------------------------------------------------------\r
287;\r
288; TC = (f PHI /(2*baudrate*Clock_mode)) - 2\r
289;\r
290; TC = (f PHI / (32 * baudrate)) - 2\r
291;\r
292; Init Serial I/O for console input and output (ASCI1)\r
293;\r
294\r
295\r
296\r
297as0init:\r
298 ld hl,initab0\r
299 jp ioiniml\r
300\r
301as1init:\r
302 ld hl,initab1\r
303 jp ioiniml\r
304\r
305\r
306 ld a,M_MPBT\r
307 out0 (cntlb1),a\r
308 ld a,M_RE + M_TE + M_MOD2 ;Rx/Tx enable\r
309 out0 (cntla1),a\r
310 ld a,M_RIE\r
311 out0 (stat1),a ;Enable rx interrupts\r
312\r
313 ret ;\r
314\r
315\r
316initab0:\r
317 db 1,stat0,0 ;Disable rx/tx interrupts\r
318 ;Enable baud rate generator\r
319 db 1,asext0,M_BRGMOD+M_DCD0DIS+M_CTS0DIS\r
320 db 2,astc0l,low 28, high 28\r
321 db 1,cntlb0,M_MPBT ;No MP Mode, X16\r
322 db 1,cntla0,M_RE+M_TE+M_MOD2 ;Rx/Tx enable, 8N1\r
323 db 0\r
324\r
325initab1:\r
326 db 1,stat1,0 ;Disable rx/tx ints, disable CTS1\r
327 db 1,asext1,M_BRGMOD ;Enable baud rate generator\r
328 db 2,astc1l,low 3, high 3\r
329 db 1,cntlb1,M_MPBT ;No MP Mode, X16\r
330 db 1,cntla1,M_RE+M_TE+M_MOD2 ;Rx/Tx enable, 8N1\r
331 db 0\r
332\r
333;-------------------------------------------------------------------------------\r
334\r
335ioiniml:\r
336 push bc\r
337 xor a\r
338ioml_lp:\r
339 ld b,(hl)\r
340 inc hl\r
341 cp b\r
342 jr z,ioml_e\r
343\r
344 ld c,(hl)\r
345 inc hl\r
346 otimr\r
347 jr ioml_lp\r
348ioml_e:\r
349 pop bc\r
350 ret\r
351\r
352;-------------------------------------------------------------------------------\r
353\r
354as0ista:\r
355 in0 a,(stat0)\r
356 rlca\r
357 sbc a,a\r
358 ret\r
359\r
360as1ista:\r
361 in0 a,(stat1)\r
362 rlca\r
363 sbc a,a\r
364 ret\r
365\r
366as0inp:\r
367 in0 a,(stat0)\r
368 rlca\r
369 jr nc,as0inp\r
370 in0 a,rdr0\r
371 ret\r
372\r
373as1inp:\r
374 in0 a,(stat1)\r
375 rlca\r
376 jr nc,as1inp\r
377 in0 a,rdr1\r
378 ret\r
379\r
380as0out:\r
381 in0 a,(stat0)\r
382 and M_TDRE\r
383 jr z,as0out\r
384 out0 (tdr0),c\r
385 ld a,c\r
386 ret\r
387\r
388as1out:\r
389 in0 a,(stat1)\r
390 and M_TDRE\r
391 jr z,as1out\r
392 out0 (tdr1),c\r
393 ld a,c\r
394 ret\r
395\r
396;-------------------------------------------------------------------------------\r
397\r
c0b1aafa
L
398\r
399csio_rx_tmp: db 0ffh\r
400\r
dfd599a0 401csio_ista:\r
c0b1aafa
L
402 ld hl,csio_rx_tmp\r
403 ld a,(hl)\r
404 cp 0ffh\r
405 jr nz,csist_1\r
406 ld a,01\r
407 call csio_wr\r
408 call csio_rd\r
409 call csio_rd\r
410 ld (hl),a\r
411 sub a,0ffh\r
412 ret z\r
413csist_1:\r
414 or 0ffh\r
415 ret\r
416\r
dfd599a0 417csio_inp:\r
c0b1aafa
L
418 ld hl,csio_rx_tmp\r
419 ld a,(hl)\r
420 ld (hl),0ffh\r
421 cp 0ffh\r
422 ret nz\r
423csin_1:\r
424 ld a,01\r
425 call csio_wr\r
426 call csio_rd\r
427 call csio_rd\r
428 cp 0ffh\r
429 jr z,csin_1\r
dfd599a0
L
430 ret\r
431\r
c0b1aafa
L
432csio_rd:\r
433 ld a,M_CSIO_RE\r
434 call csio_cmd_wait\r
435 in0 a,(trdr)\r
436 ret\r
dfd599a0 437\r
c0b1aafa
L
438csio_out:\r
439 ld a,02\r
440 call csio_wr\r
441 call csio_rd\r
442 call csio_rd\r
443 or a\r
444 jr z,csio_out\r
445\r
446 ld a,c\r
447 inc a ;ff..02 --> 00..03\r
448 cp 04h\r
449 jr nc,csout_1\r
450 ld a,00h\r
451 call csio_wr\r
452csout_1:\r
453 ld a,c\r
454csio_wr:\r
dfd599a0
L
455 out0 (trdr),a\r
456 ld a,M_CSIO_TE\r
c0b1aafa 457csio_cmd_wait:\r
dfd599a0 458 out0 (cntr),a\r
c0b1aafa 459cswr_wait:\r
dfd599a0 460 in0 a,(cntr)\r
c0b1aafa
L
461 and M_CSIO_TE+M_CSIO_RE\r
462 jr nz,cswr_wait\r
58a0ff85
L
463 ret\r
464\r
dfd599a0 465 endif ; CPM\r
58a0ff85
L
466\r
467;-------------------------------------------------------------------------------\r
468\r
0f361185 469CMDTAB::\r
a3bccdeb
L
470; dw ERROR ;cmd_@ ;examine/substitute the displacement register @\r
471; dw ERROR ;cmd_A ;Assemble\r
ac35765e 472 dw cmd_B ;Breakpoints display/set/clear\r
3628b074 473 dw ERROR ;cmd_C ;trace over Calls\r
ac35765e 474 dw cmd_D ;Display memory in hex and ascii\r
a3bccdeb 475 dw cmd_E ;rElocate debugger\r
25e453a7 476 dw ERROR ;cmd_F ;specify Filename and command line\r
ac35765e
L
477 dw cmd_G ;Go\r
478 dw cmd_H ;compute Hex and other expressions\r
479 dw cmd_I ;Input a byte from port\r
480 dw ERROR ;\r
481 dw ERROR ;\r
482 dw cmd_L ;List disassembled code\r
483 dw cmd_M ;Move memory [and verify]\r
484 dw ERROR ;\r
485 dw cmd_O ;Output a byte to port\r
486 dw ERROR ;\r
487 dw cmd_Q ;Qery memory for byte string\r
ca1c9c55 488 dw cmd_R ;Read binary or hex file\r
ac35765e
L
489 dw cmd_S ;Substitute memory\r
490 dw cmd_T ;Trace\r
491 dw ERROR ;\r
492 dw cmd_V ;Verify (compare) two memory areas\r
25e453a7 493 dw ERROR ;cmd_W ;Write a file to disk\r
ac35765e 494 dw cmd_X ;eXamine [and substitute] registers\r
1190f4f0 495 dw ERROR ;cmd_Y ;examine [and substitute] Y variables\r
ac35765e
L
496 dw cmd_Z ;Zap (fill) memory with a byte string\r
497\r
474b928c 498ERROR:\r
474b928c
L
499 call pstr_inl\r
500 dc '?',CR,LF\r
501 ;fall thru\r
0f361185 502mainloop::\r
0716e834 503 ld sp,stack\r
ac35765e 504 ld hl,(reg.pc)\r
0716e834
L
505 call bp_clr_temporary\r
506 ld hl,(cmd_rpt)\r
507 ld de,mainloop\r
d0ff7c76 508 push de\r
0716e834
L
509 call cp_hl_de\r
510 ld a,'>'\r
511 call outchar\r
512 call nz,outchar\r
513 call z,outbl\r
514 call get_line\r
515 call skipbl\r
516 jr z,exe_hl\r
d0ff7c76
L
517 pop hl\r
518 push hl\r
0716e834
L
519 ld (cmd_rpt),hl\r
520 inc de\r
a3bccdeb 521 sub 'B'\r
0716e834
L
522 jr c,ERROR\r
523 cp 'Z'+1-'@'\r
524 jr nc,ERROR\r
0716e834 525 ld hl,CMDTAB\r
6bc52899 526 call add_hl_a2\r
0716e834
L
527 ld a,(hl)\r
528 inc hl\r
529 ld h,(hl)\r
530 ld l,a\r
0c4244e5 531exe_hl:\r
b270cd3a 532CALL_HL:\r
d0ff7c76 533 jp (hl)\r
0c4244e5 534\r
9711a430
L
535;-------------------------------------------------------------------------------\r
536\r
ac35765e 537crlf:\r
37ade8ec 538 call pstr_inl\r
474b928c 539 dc CR,LF\r
b5b85b4c 540 xor a\r
ac35765e 541 ld (con_col),a\r
b5b85b4c 542 call inchar\r
ac35765e
L
543 jr c,mainloop\r
544 ret\r
545\r
0c4244e5 546sub_01d9h:\r
37ade8ec
L
547 call pstr_inl\r
548 dc '-'\r
a3bccdeb 549 jp neg.hl\r
0c4244e5
L
550\r
551out_hl_dec_neg:\r
0716e834
L
552 push hl\r
553 call sub_01d9h\r
d1d6fee5 554 defb 03eh ;ld a,.. swallow push hl\r
0c4244e5 555out.hl.dec:\r
0716e834
L
556 push hl\r
557 ld b,006h\r
558 call sub_01f9h\r
559 pop hl\r
37ade8ec
L
560 call pstr_inl\r
561 dc '.'\r
0c4244e5 562l01f3h:\r
0716e834
L
563 call outbl\r
564 djnz l01f3h\r
565 ret\r
8bc5ea22 566\r
0c4244e5 567sub_01f9h:\r
0716e834
L
568 dec b\r
569 push de\r
570 ld de,10\r
571 call div_hl_de\r
572 ld a,h\r
573 or l\r
574 call nz,sub_01f9h\r
575 ld a,e\r
576 pop de\r
577 jr out_dgt\r
0c4244e5
L
578\r
579out_hl_neg:\r
0716e834
L
580 push hl\r
581 call sub_01d9h\r
582 call out_hl\r
583 pop hl\r
584 ret\r
0c4244e5
L
585\r
586out_hl:\r
0716e834
L
587 ld a,h\r
588 call out_hex\r
589 ld a,l\r
0c4244e5
L
590\r
591out_hex:\r
0716e834
L
592 push af\r
593 rra\r
594 rra\r
595 rra\r
596 rra\r
597 call out_dgt\r
598 pop af\r
0c4244e5
L
599\r
600out_dgt:\r
f81f70a9
L
601 or 0f0h\r
602 daa\r
603 add a,0a0h\r
604 adc a,040h\r
0716e834 605 jr outchar\r
5023df4f 606\r
01cb8973
L
607out.bin.w:\r
608 ld a,h\r
609 call out.bin.b\r
610 ld a,l\r
611out.bin.b:\r
612 ld b,8\r
613l01c9h:\r
d1d6fee5
L
614 rlca\r
615 push af\r
a3bccdeb
L
616 and 1\r
617 call out_dgt\r
01cb8973
L
618 pop af\r
619 djnz l01c9h\r
620 ld a,'"'\r
621 jr outchar\r
622\r
0c4244e5 623out.ascii:\r
d24eec89
L
624 push bc\r
625 ld c,a\r
0716e834
L
626 res 7,a\r
627 cp ' '\r
5023df4f
L
628 push af\r
629 call nc,outbl\r
6bc52899
L
630 call pstr_inl\r
631 dc ''''\r
5023df4f 632 pop af\r
0716e834
L
633 jr nc,l0242h\r
634 sub 0c0h\r
d24eec89 635 ld b,a\r
37ade8ec
L
636 call pstr_inl\r
637 dc '^'\r
d24eec89 638 ld a,b\r
0c4244e5 639l0242h:\r
0716e834 640 call outchar\r
0716e834
L
641 cp ''''\r
642 call z,outchar\r
6bc52899
L
643 call pstr_inl\r
644 dc ''''\r
d24eec89
L
645 sla c\r
646 pop bc\r
647 ret nc\r
0716e834 648 ld a,'.'\r
d24eec89 649 jr outchar\r
646e8b05 650\r
01cb8973
L
651outbl6:\r
652 call outbl2\r
653outbl4:\r
654 call outbl2\r
655outbl2:\r
656 call outbl\r
657outbl:\r
658 ld a,' '\r
0c4244e5 659outchar:\r
85b57f2a
L
660 push ix\r
661 push iy\r
0716e834
L
662 push hl\r
663 push de\r
664 push bc\r
665 push af\r
666 and 07fh\r
12eea40b 667 ld c,a\r
58a0ff85 668 call conout\r
0716e834
L
669 ld hl,con_col\r
670 inc (hl)\r
671 pop af\r
672 pop bc\r
673 pop de\r
674 pop hl\r
85b57f2a
L
675 pop iy\r
676 pop ix\r
0716e834 677 ret\r
9bed91b3 678\r
08d0db09 679p_goto_col:\r
8bc5ea22
L
680 ld a,(con_col)\r
681 cp c\r
08d0db09
L
682 ret nc\r
683 ret z\r
684 call outbl\r
685 jr p_goto_col\r
686\r
9711a430 687;-------------------------------------------------------------------------------\r
8bc5ea22 688\r
b5b85b4c
L
689incharw:\r
690 call inchar\r
691 jr nc,incharw\r
12eea40b
L
692 ret\r
693\r
694;-------------------------------------------------------------------------------\r
695\r
0c4244e5 696inchar:\r
1d3941c8 697 push ix\r
0716e834
L
698 push hl\r
699 push de\r
700 push bc\r
58a0ff85 701 call const\r
0716e834 702 and a\r
12eea40b 703 jr z,inch1\r
58a0ff85 704 call conin\r
0716e834 705 scf\r
12eea40b 706inch1:\r
0716e834
L
707 pop bc\r
708 pop de\r
709 pop hl\r
1d3941c8 710 pop ix\r
0716e834 711 ret\r
ac35765e 712\r
12eea40b
L
713;-------------------------------------------------------------------------------\r
714\r
715DELC:\r
716 ld a,b\r
717 or a\r
718 ret z\r
719 call DELC1\r
720 dec hl\r
721 dec b\r
12eea40b
L
722 ld a,(hl)\r
723 cp ' '\r
724 ret nc\r
725DELC1:\r
b5b85b4c
L
726 call pstr_inl\r
727 dc BS,' ',BS\r
12eea40b
L
728 ret\r
729\r
730DELL:\r
731 ld a,b ;\r
732 or a ;\r
733 ret z ;\r
734 call DELC ;\r
735 jr DELL ;\r
736\r
737;-------------------------------------------------------------------------------\r
738\r
01cb8973 739get_line:\r
12eea40b
L
740 push hl ;\r
741 ld hl,conbuf ;\r
0f361185 742 ld b,0 ;\r
12eea40b 743inlnxtch:\r
0f361185
L
744 ld a,b ;\r
745 cp CONBUF_SIZE ;\r
12eea40b 746 jr z,inl_e ;\r
b5b85b4c 747 call incharw ;\r
12eea40b
L
748 cp CR ;\r
749 jr z,inl_e ;Accept line\r
750 cp LF ;\r
751 jr z,inl_e ;Accept line\r
b5b85b4c 752\r
12eea40b 753 cp BS ;\r
b5b85b4c 754 jr z,gl_1 ;\r
12eea40b
L
755 cp DEL ;\r
756 jr nz,gl_2 ;\r
b5b85b4c 757gl_1:\r
12eea40b
L
758 call DELC ;Delete Char\r
759 jr inlnxtch ;\r
760gl_2:\r
761 cp CNTRX ;\r
762 jr nz,gl_3 ;\r
763 call DELL ;Delete Line\r
764 jr inlnxtch ;\r
765gl_3:\r
766 cp TAB ;\r
767 jr nz,gl_4 ;\r
768 ld a,' ' ;\r
769gl_4:\r
770 ld (hl),a ;\r
771 cp ' ' ;\r
772 jr nc,gl_5 ;\r
773 ld a,'^' ;Controll characters\r
b5b85b4c 774 call outchar ;\r
12eea40b
L
775 ld a,(hl) ;\r
776 add a,'@' ;\r
777gl_5:\r
b5b85b4c 778 call outchar ;\r
12eea40b
L
779 inc hl ;\r
780 inc b ;\r
12eea40b
L
781 jr inlnxtch ;\r
782\r
783inl_e:\r
784 ld (hl),0\r
12eea40b 785 call CRLF ;\r
0f361185 786 ld de,conbuf ;\r
12eea40b
L
787 pop hl ;\r
788 ret ;\r
d1f2492e 789\r
9711a430
L
790;-------------------------------------------------------------------------------\r
791\r
0c461f1d
L
792get_char_upper:\r
793 ld a,(de)\r
01cb8973
L
794toupper:\r
795 cp 'a'\r
796 ret c\r
797 cp 'z'+1\r
1d3941c8
L
798 ccf\r
799 ret c\r
01cb8973 800 and 05fh\r
0716e834 801 ret\r
0c4244e5 802\r
9711a430
L
803;-------------------------------------------------------------------------------\r
804\r
0c4244e5 805skipbl0:\r
0716e834 806 inc de\r
0c4244e5 807skipbl:\r
0c461f1d 808 call get_char_upper\r
b5b85b4c
L
809 cp ' '\r
810 jr z,skipbl0\r
0716e834
L
811 or a\r
812 ret\r
0c4244e5 813\r
b5b85b4c
L
814;-------------------------------------------------------------------------------\r
815\r
0c4244e5 816next_arg:\r
0716e834
L
817 call skipbl\r
818 cp ','\r
819 ret nz\r
b5b85b4c 820 call skipbl0\r
0716e834
L
821 cp a\r
822 ret\r
0c4244e5
L
823\r
824assert_eol:\r
0716e834
L
825 call skipbl\r
826 ret z\r
0c4244e5 827to_error:\r
0716e834 828 jp ERROR\r
0c4244e5 829\r
9711a430
L
830;-------------------------------------------------------------------------------\r
831\r
85b57f2a 832chk_stack:\r
0716e834
L
833 push hl\r
834 push de\r
835 ld hl,0\r
836 add hl,sp\r
0dc44d17 837 ld de,stack-(STACK_SIZE-28)\r
0716e834
L
838 call cp_hl_de\r
839 pop de\r
840 pop hl\r
841 jr c,to_error\r
842 ret\r
0c4244e5 843\r
9711a430
L
844;-------------------------------------------------------------------------------\r
845\r
6bc52899
L
846add_hl_a2:\r
847 add a,a\r
01cb8973
L
848add_hl_a:\r
849 add a,l\r
850 ld l,a\r
851 ret nc\r
852 inc h\r
853 ret\r
854\r
0c4244e5 855cp_hl_de:\r
0716e834
L
856 and a\r
857 sbc hl,de\r
858 add hl,de\r
859 ret\r
6bc52899 860\r
9711a430
L
861;-------------------------------------------------------------------------------\r
862\r
0c4244e5 863lookupch:\r
0716e834 864 ld b,0\r
0c4244e5 865l02f5h:\r
0716e834
L
866 ld a,(hl)\r
867 and a\r
868 ret z\r
0c461f1d 869 call get_char_upper\r
0716e834
L
870 cp (hl)\r
871 jr z,l0300h\r
872 inc hl\r
873 inc b\r
874 jr l02f5h\r
0c4244e5 875l0300h:\r
0716e834
L
876 scf\r
877 inc de\r
878 ret\r
0c4244e5
L
879\r
880sub_0303h:\r
f81f70a9 881 ld hl,t_reg_names\r
0716e834 882 ld b,07fh\r
0c4244e5 883l030ch:\r
0716e834
L
884 inc b\r
885 ld a,(hl)\r
886 and a\r
887 ret z\r
888 call sub_031ch\r
889 jr nc,l030ch\r
890 res 7,b\r
891 ret\r
0c4244e5 892\r
0c4244e5 893sub_031ch:\r
0716e834
L
894 push bc\r
895 push de\r
0c4244e5 896l031eh:\r
0c461f1d 897 call get_char_upper\r
0716e834
L
898 xor (hl)\r
899 and 07fh\r
900 jr nz,l0336h\r
901 bit 7,(hl)\r
902 inc hl\r
903 inc de\r
904 jr z,l031eh\r
905 scf\r
906 bit 7,b\r
907 call z,sub_060ch\r
908 jr nc,l0339h\r
909 pop af\r
910 scf\r
911 pop bc\r
912 ret\r
0c4244e5 913l0336h:\r
8c416d5a 914 call str_sel_next\r
0c4244e5 915l0339h:\r
0716e834
L
916 pop de\r
917 and a\r
918 pop bc\r
919 ret\r
646e8b05 920\r
8c416d5a
L
921str_sel:\r
922 inc b\r
923 jr str_sel2\r
924str_sel1:\r
925 call str_sel_next\r
926str_sel2:\r
927 djnz str_sel1\r
928 ret\r
929\r
930str_sel_next:\r
0716e834
L
931 ld a,(hl)\r
932 and a\r
933 ret z\r
0c4244e5 934l0348h:\r
0716e834
L
935 ld a,(hl)\r
936 inc hl\r
937 and a\r
938 ret m\r
939 jr l0348h\r
646e8b05 940\r
a3bccdeb 941get_arg_range_target:\r
0716e834
L
942 call get_arg_range\r
943 push hl\r
944 push bc\r
945 call next_arg\r
a3bccdeb 946 call get_arg_final\r
0716e834
L
947 ex de,hl\r
948 pop bc\r
949 pop hl\r
950 ret\r
0c4244e5
L
951\r
952sub_035dh:\r
0716e834
L
953 call expr\r
954 jr c,error0\r
955 ret\r
0c4244e5 956\r
a3bccdeb 957get_arg_final:\r
0716e834 958 call sub_035dh\r
0c4244e5 959l0366h:\r
0716e834 960 jp assert_eol\r
0c4244e5
L
961\r
962get_lastarg_def:\r
0716e834
L
963 call get_arg_def\r
964 jr l0366h\r
b0b4005c 965\r
0c4244e5 966get_arg_def:\r
0716e834
L
967 push hl\r
968 call expr\r
969 jr c,l0375h\r
970 ex (sp),hl\r
0c4244e5 971l0375h:\r
0716e834
L
972 pop hl\r
973 ret\r
b0b4005c 974\r
0c4244e5 975sub_0377h:\r
0716e834
L
976 call b_037c_start\r
977 jr l0366h\r
0c4244e5
L
978\r
979b_037c_start:\r
d1d6fee5 980 defb 0e6h ;and a,.. clear carry\r
0c4244e5 981get_arg_range:\r
0716e834
L
982 scf\r
983 ex af,af'\r
984 push bc\r
985 push hl\r
986 call expr\r
987 jr nc,l038ch\r
988 ex af,af'\r
989 jr c,error0\r
990 ex af,af'\r
991 pop hl\r
d1d6fee5 992 defb 03eh ;ld a,.. swallow pop af\r
0c4244e5 993l038ch:\r
0716e834
L
994 pop af\r
995 call get_range\r
996 jr nc,l0398h\r
997 ex af,af'\r
998 pop bc\r
999 ret nc\r
0c4244e5 1000error0:\r
0716e834 1001 jp ERROR\r
0c4244e5 1002l0398h:\r
0716e834
L
1003 pop af\r
1004 ret\r
0c4244e5 1005\r
b0b4005c 1006get_range:\r
0716e834
L
1007 call next_arg\r
1008 cp 'S'\r
1009 jr nz,l03a2h\r
1010 inc de\r
0c4244e5 1011l03a2h:\r
0716e834 1012 push hl\r
85b57f2a 1013 push af ;'S' flag\r
0716e834
L
1014 call expr\r
1015 jr c,l03b8h\r
1016 ld b,h\r
1017 ld c,l\r
1018 pop af\r
1019 pop hl\r
85b57f2a 1020 jr z,l03b6h ;'S'?\r
0716e834
L
1021 ld a,c\r
1022 sub l\r
1023 ld c,a\r
1024 ld a,b\r
1025 sbc a,h\r
1026 ld b,a\r
1027 inc bc\r
0c4244e5 1028l03b6h:\r
0716e834
L
1029 and a\r
1030 ret\r
0c4244e5 1031l03b8h:\r
0716e834
L
1032 pop af\r
1033 pop hl\r
85b57f2a 1034 jr z,error0 ;'S', but no expression following\r
0716e834
L
1035 scf\r
1036 ret\r
0c4244e5 1037\r
9711a430
L
1038;-------------------------------------------------------------------------------\r
1039\r
0c4244e5 1040expr:\r
0716e834 1041 call skipbl\r
0c4244e5 1042expr1:\r
0716e834
L
1043 call do_factor\r
1044 ret c\r
0c4244e5 1045l0433h:\r
0716e834
L
1046 call do_binary_op\r
1047 push hl\r
1048 push bc\r
1049 call do_factor\r
1050 pop bc\r
1051 ex de,hl\r
1052 ex (sp),hl\r
1053 jr nc,l0447h\r
1054 pop de\r
1055 ld a,b\r
1056 or c\r
1057 ret z\r
1058 jp ERROR\r
0c4244e5
L
1059\r
1060l0447h:\r
0716e834
L
1061 ld a,b\r
1062 or c\r
1063 push bc\r
1064 ret nz\r
1065 pop bc\r
0c4244e5
L
1066\r
1067doop_add:\r
0716e834 1068 add hl,de\r
0c4244e5 1069l044dh:\r
0716e834
L
1070 pop de\r
1071 jr l0433h\r
0c4244e5
L
1072\r
1073doop_sub:\r
0716e834
L
1074 and a\r
1075 sbc hl,de\r
1076 jr l044dh\r
0c4244e5
L
1077\r
1078doop_mlt:\r
0716e834
L
1079 push bc\r
1080 ld b,h\r
1081 ld c,l\r
1082 ld hl,0\r
1083 ld a,010h\r
0c4244e5 1084l045dh:\r
0716e834
L
1085 add hl,hl\r
1086 ex de,hl\r
1087 add hl,hl\r
1088 ex de,hl\r
1089 jr nc,l0464h\r
1090 add hl,bc\r
0c4244e5 1091l0464h:\r
0716e834
L
1092 dec a\r
1093 jr nz,l045dh\r
1094 pop bc\r
1095 jr l044dh\r
0c4244e5
L
1096\r
1097doop_div:\r
0716e834
L
1098 call div_hl_de\r
1099 jr l044dh\r
0c4244e5
L
1100\r
1101doop_mod:\r
0716e834
L
1102 call div_hl_de\r
1103 ex de,hl\r
1104 jr l044dh\r
0c4244e5
L
1105\r
1106; divide x/y\r
1107; hl: x\r
1108; de: y\r
1109; return:\r
1110; hl: q (x/y)\r
1111; de: r (x%y)\r
1112\r
1113div_hl_de:\r
f33961b5
L
1114 push bc\r
1115 ex de,hl ;de: x\r
1116 ld b,h ;bc: y\r
1117 ld c,l\r
1118 ld hl,0 ;hl: r\r
1119 ld a,16\r
0c4244e5
L
1120\r
1121; de: x (x shifted out, q shifted in)\r
1122; bc: y\r
1123; hl: r (initially 0)\r
1124\r
f33961b5
L
1125div_lp:\r
1126 ex de,hl\r
1127 add hl,hl ;x <<= 1\r
1128 ex de,hl\r
1129 adc hl,hl ;r <<= 1\r
1130 inc de\r
1131 or a\r
1132 sbc hl,bc\r
1133 jr nc,div_norestore\r
1134 dec de\r
1135 add hl,bc\r
1136div_norestore:\r
1137 dec a\r
1138 jr nz,div_lp\r
1139 ex de,hl\r
1140 pop bc\r
0716e834 1141 ret\r
0c4244e5
L
1142\r
1143doop_and:\r
0716e834
L
1144 ld a,h\r
1145 and d\r
1146 ld h,a\r
1147 ld a,l\r
1148 and e\r
1149 ld l,a\r
1150 jr l044dh\r
0c4244e5
L
1151\r
1152doop_or:\r
0716e834
L
1153 ld a,h\r
1154 or d\r
1155 ld h,a\r
1156 ld a,l\r
1157 or e\r
1158 ld l,a\r
1159 jr l044dh\r
0c4244e5
L
1160\r
1161doop_xor:\r
0716e834
L
1162 ld a,h\r
1163 xor d\r
1164 ld h,a\r
1165 ld a,l\r
1166 xor e\r
1167 ld l,a\r
1168 jr l044dh\r
0c4244e5
L
1169\r
1170do_binary_op:\r
0716e834
L
1171 push hl\r
1172 ld hl,tab_op_a\r
1173 call lookupch\r
1174 ld a,b\r
1175 ld hl,tblf_opa\r
6bc52899 1176 call add_hl_a2\r
0716e834
L
1177 ld c,(hl)\r
1178 inc hl\r
1179 ld b,(hl)\r
1180 pop hl\r
1181 ret\r
0c4244e5
L
1182\r
1183tab_op_a:\r
1184 DB '+-*/%&!#',0\r
1185\r
1186tblf_opa:\r
0716e834
L
1187 dw doop_add\r
1188 dw doop_sub\r
1189 dw doop_mlt\r
1190 dw doop_div\r
1191 dw doop_mod\r
1192 dw doop_and\r
1193 dw doop_or\r
1194 dw doop_xor\r
1195 dw 0\r
0c4244e5 1196\r
9711a430
L
1197;-------------------------------------------------------------------------------\r
1198\r
0c4244e5 1199fact_factor:\r
0716e834
L
1200 call do_factor\r
1201 ret nc\r
1202 jp ERROR\r
0c4244e5
L
1203\r
1204do_factor:\r
85b57f2a 1205 call chk_stack\r
0716e834
L
1206 call get.number\r
1207 ret nc\r
1208 inc de\r
0f35ae66 1209 ld hl,ddtz_base-1\r
0716e834
L
1210 cp 'T'\r
1211 ret z\r
1212 ld hl,(high_load)\r
1213 cp 'H'\r
1214 ret z\r
1215 ld hl,(max_load)\r
1216 cp 'M'\r
1217 ret z\r
1218 ld hl,TPA\r
1219 cp 'L'\r
1220 ret z\r
0f361185
L
1221 ld hl,(reg.pc)\r
1222 cp '$'\r
1223 ret z\r
0716e834
L
1224 cp '-'\r
1225 jr z,fact_factneg\r
1226 cp '~'\r
1227 jr z,fact_factinv\r
1228 cp '+'\r
1229 jr z,fact_factor\r
1230 cp '^'\r
1231 jr z,fact_reg.CPU\r
0716e834
L
1232 cp '('\r
1233 jr z,fact_mem\r
1234 cp '['\r
3a4deef9 1235 jr z,expr_brckt\r
0716e834
L
1236 cp ''''\r
1237 jr z,fact_factstring\r
1238 dec de\r
1239 scf\r
1240 ret\r
0c4244e5 1241\r
9711a430
L
1242;-------------------------------------------------------------------------------\r
1243\r
0c4244e5 1244fact_factstring:\r
0716e834 1245 ld hl,0\r
0c4244e5 1246l054bh:\r
0716e834
L
1247 ld a,(de)\r
1248 cp ''''\r
1249 jr z,l0557h\r
1250 and a\r
1251 ret z\r
0c4244e5 1252l0552h:\r
0716e834
L
1253 ld h,l\r
1254 ld l,a\r
1255 inc de\r
1256 jr l054bh\r
0c4244e5 1257l0557h:\r
0716e834
L
1258 inc de\r
1259 ld a,(de)\r
1260 cp ''''\r
1261 jr z,l0552h\r
1262 sub '.'\r
1263 or a\r
1264 ret nz\r
1265 inc de\r
1266 set 7,l\r
1267 ret\r
0c4244e5
L
1268\r
1269fact_reg.CPU:\r
0716e834 1270 call sub_0caeh\r
30673dea 1271 jr nc,error1\r
0716e834
L
1272 ld a,(hl)\r
1273 inc hl\r
1274 ld h,(hl)\r
1275 ld l,a\r
1276 and a\r
1277 bit 0,c\r
1278 ret nz\r
1279 ld h,000h\r
1280 ret\r
0c4244e5 1281\r
a3bccdeb
L
1282fact_factinv:\r
1283 call fact_factor\r
1284 jr cpl.hl\r
1285\r
0c4244e5 1286fact_factneg:\r
0716e834 1287 call fact_factor\r
a3bccdeb 1288neg.hl:\r
0716e834 1289 dec hl\r
0c4244e5 1290cpl.hl:\r
0716e834
L
1291 ld a,h\r
1292 cpl\r
1293 ld h,a\r
1294 ld a,l\r
1295 cpl\r
1296 ld l,a\r
1297 ret\r
0c4244e5 1298\r
0c4244e5 1299fact_mem:\r
0716e834 1300 call expr1\r
30673dea 1301 jr c,error1\r
0716e834
L
1302 ld a,(de)\r
1303 cp ')'\r
30673dea 1304 jr nz,error1\r
0716e834
L
1305 inc de\r
1306 ld a,(hl)\r
1307 inc hl\r
1308 ld h,(hl)\r
1309 ld l,a\r
1310 ld a,(de)\r
1311 inc de\r
1312 cp '.'\r
1313 ret z\r
1314 dec de\r
1315 xor a\r
1316 ld h,a\r
1317 ret\r
0c4244e5
L
1318\r
1319expr_brckt:\r
0716e834 1320 call expr1\r
30673dea 1321 jr c,error1\r
0716e834
L
1322 ld a,(de)\r
1323 cp ']'\r
1324 inc de\r
1325 ret z\r
30673dea 1326error1:\r
0716e834 1327 jp ERROR\r
0c4244e5 1328\r
9711a430
L
1329;-------------------------------------------------------------------------------\r
1330\r
0c4244e5 1331get.number:\r
0716e834
L
1332 call get.hexdigit\r
1333 ret c\r
1334 push de\r
0c4244e5 1335test_number:\r
0716e834
L
1336 inc de\r
1337 call get.hexdigit\r
1338 jr nc,test_number\r
1339 pop de\r
1340 cp '.'\r
1341 jr z,get_dec_number\r
1342 cp '"'\r
1343 jr z,get_bin_number\r
1344 ld hl,0\r
0c4244e5 1345next_hexdigit:\r
0716e834
L
1346 call get.hexdigit\r
1347 jr c,hexnum_done\r
1348 add hl,hl\r
1349 add hl,hl\r
1350 add hl,hl\r
1351 add hl,hl\r
1352 call add_hl_a\r
1353 inc de\r
1354 jr next_hexdigit\r
0c4244e5
L
1355\r
1356hexnum_done:\r
0716e834
L
1357 xor 'H'\r
1358 ret nz\r
1359 inc de\r
1360 ret\r
0c4244e5
L
1361\r
1362get_bin_number:\r
0716e834 1363 ld hl,0\r
0c4244e5 1364next_bindigit:\r
0716e834 1365 call get.bindigit\r
0c4244e5 1366l05dbh:\r
0716e834
L
1367 inc de\r
1368 jr c,l05e4h\r
1369 add hl,hl\r
1370 call add_hl_a\r
1371 jr next_bindigit\r
0c4244e5 1372l05e4h:\r
0716e834 1373 cp '"'\r
1bfdbe14 1374 jr nz,error11\r
0716e834
L
1375 call get.bindigit\r
1376 jr nc,l05dbh\r
1377 or a\r
1378 ret\r
0c4244e5
L
1379\r
1380get_dec_number:\r
0716e834 1381 ld hl,0\r
0c4244e5 1382next_decdigit:\r
0716e834
L
1383 call get.decdigit\r
1384 inc de\r
1385 jr c,decnum_done\r
1386 push bc\r
1387 add hl,hl\r
1388 ld b,h\r
1389 ld c,l\r
1390 add hl,hl\r
1391 add hl,hl\r
1392 add hl,bc\r
1393 pop bc\r
1394 call add_hl_a\r
1395 jr next_decdigit\r
0c4244e5 1396decnum_done:\r
0716e834
L
1397 cp '.'\r
1398 ret z\r
1bfdbe14 1399error11:\r
0716e834 1400 jp ERROR\r
0c4244e5
L
1401\r
1402sub_060ch:\r
0c461f1d 1403 call get_char_upper\r
d1d6fee5 1404 cp 'Z'+1\r
0716e834 1405 jr l0614h\r
0c4244e5
L
1406\r
1407get.hexdigit:\r
c788b3b7 1408 ld a,(de)\r
0c4244e5 1409hex_digit:\r
0c461f1d 1410 call toupper\r
c788b3b7 1411 cp 'F'+1\r
0c4244e5 1412l0614h:\r
c788b3b7
L
1413 ccf\r
1414 ret c\r
1415 cp 'A'\r
1416 jr c,l061eh\r
1417 sub 'A'-10\r
1418 ret\r
0c4244e5
L
1419\r
1420get.decdigit:\r
0c461f1d 1421 call get_char_upper\r
0c4244e5 1422l061eh:\r
c788b3b7
L
1423 cp '9'+1\r
1424 jr l0625h\r
0c4244e5
L
1425\r
1426get.bindigit:\r
0c461f1d 1427 call get_char_upper\r
c788b3b7 1428 cp '1'+1\r
0c4244e5 1429l0625h:\r
c788b3b7
L
1430 ccf\r
1431 ret c\r
1432 cp '0'\r
1433 ret c\r
1434 sub '0'\r
1435 ret\r
0c4244e5 1436\r
9711a430
L
1437;-------------------------------------------------------------------------------\r
1438\r
25a690e5 1439p_cpustat0:\r
0716e834 1440 call assert_eol\r
25a690e5 1441p_cpustat:\r
0716e834
L
1442 call p_f\r
1443 call outbl2\r
1444 ld hl,b_06e9_start\r
1445 ld de,b_0709_start\r
1446 ld b,6\r
0c4244e5 1447l063eh:\r
0716e834
L
1448 call p_regs\r
1449 djnz l063eh\r
27a5c416 1450 call outbl6\r
0716e834
L
1451 push hl\r
1452 push de\r
ac35765e 1453 ld iy,(reg.pc)\r
0716e834 1454 call p_disas_instr\r
d24eec89 1455 pop de\r
8320b8eb 1456 pop hl\r
0716e834
L
1457 call crlf\r
1458 call p_f2\r
1459 call outbl2\r
0716e834 1460 ld b,7\r
0c4244e5 1461l065bh:\r
0716e834
L
1462 call p_regs\r
1463 djnz l065bh\r
0716e834 1464 jp crlf\r
0c4244e5 1465\r
25a690e5 1466p_f:\r
0716e834
L
1467 ld a,(reg.f)\r
1468 call p_flags\r
1469 ld a,(reg.iff)\r
1470 cp 0f3h\r
8320b8eb 1471 jr z,outbl_1\r
0716e834
L
1472 ld a,'E'\r
1473 jp outchar\r
25a690e5 1474p_f2:\r
0716e834
L
1475 ld a,(reg.f2)\r
1476 call p_flags\r
8320b8eb 1477 jr outbl_1\r
d24eec89 1478\r
25a690e5 1479p_flags:\r
836f48ab
L
1480 push hl\r
1481 ld hl,t_flag_names+7\r
1482 ld c,a\r
1483 ld b,8\r
1484fl_loop:\r
1485 ld a,' '\r
1486 cp (hl)\r
1487 ld a,c\r
1488 rlca\r
1489 ld c,a\r
1490 jr z,fl_skip\r
1491 ld a,(hl)\r
1492 call c,outchar\r
1493 call nc,outbl\r
1494fl_skip:\r
1495 dec hl\r
1496 djnz fl_loop\r
1497 pop hl\r
1498 ret\r
25a690e5
L
1499\r
1500p_regs:\r
0716e834
L
1501 push de\r
1502 call pstr\r
37ade8ec
L
1503 call pstr_inl\r
1504 dc '='\r
0716e834
L
1505 ex (sp),hl\r
1506 ld e,(hl)\r
1507 inc hl\r
1508 ld d,(hl)\r
1509 inc hl\r
1510 ld a,(hl)\r
1511 inc hl\r
1512 push hl\r
1513 and a\r
1514 jr z,l06deh\r
d24eec89
L
1515 ex de,hl\r
1516 ld e,(hl)\r
1517 inc hl\r
1518 ld d,(hl)\r
1519 ex de,hl\r
0716e834
L
1520 call out_hl\r
1521 jr l06e2h\r
0c4244e5 1522l06deh:\r
0716e834
L
1523 ld a,(de)\r
1524 call out_hex\r
0c4244e5 1525l06e2h:\r
0716e834
L
1526 pop de\r
1527 pop hl\r
8320b8eb
L
1528outbl_1:\r
1529 jp outbl\r
0c4244e5
L
1530\r
1531b_06e9_start:\r
1532 DC 'A '\r
1533 DC 'BC '\r
1534 DC 'DE '\r
1535 DC 'HL '\r
1536 DC 'SP'\r
1537 DC 'PC'\r
899547a8
L
1538 DC 'a'''\r
1539 DC 'bc'''\r
1540 DC 'de'''\r
1541 DC 'hl'''\r
0c4244e5
L
1542 DC 'IX'\r
1543 DC 'IY'\r
1544 DC 'I'\r
1545 DB 0\r
1546\r
1547b_0709_start:\r
0716e834
L
1548 dw reg.a\r
1549 db 000h\r
1550 dw reg.c\r
1551 db 001h\r
1552 dw reg.e\r
1553 db 001h\r
1554 dw reg.l\r
1555 db 001h\r
1556 dw reg_sp\r
1557 db 001h\r
ac35765e 1558 dw reg.pc\r
0716e834
L
1559 db 002h\r
1560 dw reg.a2\r
1561 db 000h\r
1562 dw reg.c2\r
1563 db 001h\r
1564 dw reg.e2\r
1565 db 001h\r
1566 dw reg.l2\r
1567 db 001h\r
1568 dw reg.ix\r
1569 db 001h\r
1570 dw reg.iy\r
1571 db 001h\r
1572 dw reg.i\r
1573 db 000h\r
1574 db 000h\r
0c4244e5 1575\r
a3bccdeb
L
1576;-------------------------------------------------------------------------------\r
1577; > E addr\r
1578; relocate debugger to addr\r
1579; > ER addr\r
1580; relocate just below addr\r
1581;\r
1582; Move debugger to given address and restart.\r
1583; New location must not overlap with current location.\r
1584\r
1585\r
1586cmd_E:\r
1587 call skipbl\r
1588 sub 'R'\r
1589 jr nz,$+3\r
1590 inc de\r
1591 push af\r
1592 call get_arg_final\r
1593\r
1594 ld bc,prog_size+bitmap_size\r
1595 pop af\r
1596 jr nz,cmde_bottom\r
1597 sbc hl,bc\r
1598cmde_bottom:\r
1599 ld ix,cmde_clr-ddtz_base\r
1600 ex de,hl ;de = dst\r
1601 add ix,de\r
1602 ld hl,ddtz_base ;hl = src\r
1603\r
1604 push hl\r
1605 or a\r
1606 sbc hl,de\r
1607 call c,neg.hl ;abs(distance)\r
1608 or a\r
1609 sbc hl,bc\r
1610 jp c,error\r
1611 pop hl\r
1612 push hl\r
1613 push bc\r
1614 ldir\r
1615 pop bc\r
1616 pop hl\r
1617 jp (ix)\r
1618\r
9711a430
L
1619;-------------------------------------------------------------------------------\r
1620; > G [startaddr] [;breakp..]\r
1621; Go [to start] [with temporary breakpoints]\r
1622\r
0c4244e5 1623cmd_G:\r
0716e834 1624 sub a\r
4bb547a7 1625 ld (bp_p_cpu_flag),a\r
0716e834
L
1626 call expr\r
1627 jr c,l0740h\r
ac35765e 1628 ld (reg.pc),hl\r
0c4244e5 1629l0740h:\r
0716e834 1630 call skipbl\r
4bb547a7 1631 jr z,user_go0\r
0716e834
L
1632 cp ';'\r
1633 jp nz,ERROR\r
1634 inc de\r
1635 ld a,002h\r
1636 call bp_enter\r
4bb547a7 1637user_go0:\r
0716e834 1638 jp user_go\r
0c4244e5 1639\r
9711a430 1640;-------------------------------------------------------------------------------\r
1bfdbe14
L
1641\r
1642bpl_init:\r
1643 ld b,BP_CNT\r
1644 ld ix,bp_tab\r
1645 ex (sp),hl\r
1646 ld (pbl_loop_adr),hl\r
1647 ex (sp),hl\r
1648 ret\r
1649\r
1650bpl_next:\r
1651 ld de,BP_SIZE\r
81c1eadb 1652 push af\r
1bfdbe14 1653 add ix,de\r
81c1eadb 1654 pop af\r
1bfdbe14
L
1655 dec b\r
1656 ret z\r
1657\r
1658 ex (sp),hl\r
1659 ld hl,(pbl_loop_adr)\r
1660 ex (sp),hl\r
1661 ret\r
1662\r
0c4244e5 1663bp_clr_temporary:\r
1bfdbe14
L
1664 call bpl_init\r
1665\r
0716e834
L
1666 ld a,(ix+000h)\r
1667 and 0f1h\r
1668 ld (ix+000h),a\r
1bfdbe14
L
1669\r
1670 call bpl_next\r
0716e834 1671 ret\r
0c4244e5 1672\r
9711a430
L
1673;-------------------------------------------------------------------------------\r
1674; > B\r
1675; display all breakpoints\r
1676; > B breakp [breakp..]\r
1677; set breakpoints\r
1678; > BX\r
1679; clear all breakpoints\r
d2df51e3 1680; > BX breakp [breakp..]\r
9711a430
L
1681; clear breakpoints\r
1682;\r
d2df51e3 1683; breakp can be any valid expression\r
9711a430 1684\r
0c4244e5 1685cmd_B:\r
0716e834 1686 call skipbl\r
4903b8b8 1687 jr z,bp_print\r
0716e834
L
1688 inc de\r
1689 cp 'X'\r
4903b8b8 1690 jr z,bp_clr0\r
0716e834
L
1691 dec de\r
1692 ld a,001h\r
1693 jp bp_enter\r
81c1eadb 1694\r
4903b8b8 1695bp_clr0:\r
0716e834
L
1696 call skipbl\r
1697 jr z,bp_clr_all\r
4903b8b8 1698bp_clr_next:\r
0716e834
L
1699 call expr\r
1700 jp c,assert_eol\r
1701 push de\r
1702 call bp_clr\r
1703 pop de\r
1704 call next_arg\r
4903b8b8 1705 jr bp_clr_next\r
0c4244e5
L
1706\r
1707bp_clr_all:\r
0716e834 1708 scf\r
0c4244e5 1709bp_clr:\r
1bfdbe14
L
1710 call bpl_init\r
1711\r
0716e834
L
1712 push af\r
1713 jr c,l07a7h\r
1714 ld e,(ix+002h)\r
1715 ld d,(ix+003h)\r
1716 call cp_hl_de\r
1717 jr nz,l07aeh\r
0c4244e5 1718l07a7h:\r
0716e834 1719 ld (ix+000h),000h\r
0c4244e5 1720l07aeh:\r
0716e834 1721 pop af\r
1bfdbe14 1722 call bpl_next\r
0716e834 1723 ret\r
0c4244e5 1724\r
4903b8b8 1725bp_print:\r
3628b074 1726 ld c,0\r
1bfdbe14
L
1727 call bpl_init\r
1728\r
0716e834 1729 bit 0,(ix+000h)\r
4903b8b8 1730 jr z,bp_pr_cont\r
0716e834
L
1731 ld l,(ix+002h)\r
1732 ld h,(ix+003h)\r
35b535f6 1733 call out_hl\r
3628b074
L
1734 call outbl2\r
1735 inc c\r
4903b8b8 1736bp_pr_cont:\r
1bfdbe14 1737 call bpl_next\r
3628b074
L
1738 ld a,c\r
1739 or a\r
1740 call nz,crlf\r
0716e834 1741 ret\r
0c4244e5 1742\r
9711a430 1743;-------------------------------------------------------------------------------\r
0c4244e5
L
1744; Add break points to list\r
1745; A = 1 Permanent (B command)\r
1746; A = 2 Temporary (G command)\r
1747\r
1748bp_enter:\r
0716e834
L
1749 ld b,a\r
1750 call skipbl\r
1751 ret z\r
3628b074 1752\r
0716e834
L
1753 push bc\r
1754 call expr\r
1bfdbe14 1755 jr c,error12\r
0716e834
L
1756 pop bc\r
1757 bit 0,b\r
1758 push bc\r
1759 push de\r
1760 push hl\r
1761 call nz,bp_clr\r
1762 pop hl\r
1763 call bp_get_freeslot\r
1764 pop de\r
1765 ld (ix+002h),l\r
1766 ld (ix+003h),h\r
0716e834
L
1767 call next_arg\r
1768 pop af\r
1769 ld (ix+000h),a\r
1770 and 00fh\r
1771 jr bp_enter\r
0c4244e5
L
1772\r
1773bp_get_freeslot:\r
1bfdbe14
L
1774 call bpl_init\r
1775\r
0716e834
L
1776 ld a,(ix+000h)\r
1777 and 00fh\r
1778 ret z\r
1bfdbe14
L
1779\r
1780 call bpl_next\r
1781error12\r
0716e834 1782 jp ERROR\r
0c4244e5 1783\r
0c4244e5 1784\r
9711a430 1785;-------------------------------------------------------------------------------\r
a768c062 1786; Breakpoint handling routine.\r
9711a430 1787\r
0c4244e5 1788bpddtz:\r
0716e834
L
1789 ld (reg.l),hl\r
1790 pop hl\r
1791 dec hl\r
ac35765e 1792 ld (reg.pc),hl\r
0716e834
L
1793 ld (reg_sp),sp\r
1794 ld sp,reg.l\r
1795 push de\r
1796 push bc\r
1797 push af\r
1798 push ix\r
1799 push iy\r
1800 ld a,i\r
4bb547a7 1801 call di_or_ei\r
0716e834
L
1802 ld h,a\r
1803 ld l,000h\r
1804 push hl\r
4bb547a7 1805 ld a,0f3h ; EI\r
0716e834 1806 jp po,l08dfh\r
4bb547a7 1807 ld a,0fbh ; DI\r
0c4244e5 1808l08dfh:\r
0716e834
L
1809 ld (reg.iff),a\r
1810 ex af,af'\r
1811 push af\r
1812 exx\r
1813 push bc\r
1814 push de\r
1815 push hl\r
4bb547a7 1816 call bp_restore_mem\r
0716e834
L
1817 ld a,(b_21e2_start)\r
1818 dec a\r
1819 jr z,l090bh\r
4bb547a7
L
1820 call inchar ;Keyboard hit?\r
1821 jr c,do_break ;yes\r
0716e834
L
1822 call sub_0913h\r
1823 and a\r
1824 jp z,user_go\r
1825 and 083h\r
1826 jp z,l2151h\r
4bb547a7 1827do_break:\r
0716e834
L
1828 call bp_clr_temporary\r
1829 call p_cpustat\r
1830 jp mainloop\r
0c4244e5
L
1831\r
1832l090bh:\r
0716e834
L
1833 ld (b_21e2_start),a\r
1834 ld c,007h\r
1835 jp l0a41h\r
0c4244e5
L
1836\r
1837sub_0913h:\r
0716e834
L
1838 ld a,080h\r
1839 ex af,af'\r
1840 sub a\r
4bb547a7 1841 ld (bp_p_cpu_flag),a\r
1bfdbe14
L
1842 call bpl_init\r
1843\r
0716e834
L
1844 ld a,(ix+000h)\r
1845 and 007h\r
1846 jr z,l0938h\r
1847 ld e,(ix+002h)\r
1848 ld d,(ix+003h)\r
ac35765e 1849 ld hl,(reg.pc)\r
0716e834 1850 call cp_hl_de\r
d2df51e3 1851 jr nz,l0938h\r
0716e834
L
1852 ex af,af'\r
1853 res 7,a\r
0716e834
L
1854 or (ix+000h)\r
1855 ex af,af'\r
d2df51e3
L
1856l0938h:\r
1857 call bpl_next\r
1858 ex af,af'\r
0716e834 1859 ret\r
0c4244e5 1860\r
4bb547a7 1861bp_restore_mem:\r
1bfdbe14
L
1862 call bpl_init\r
1863\r
0716e834
L
1864 bit 5,(ix+000h)\r
1865 res 5,(ix+000h)\r
1866 jr z,l099ah\r
1867 ld l,(ix+002h)\r
1868 ld h,(ix+003h)\r
1869 ld a,(l0003h)\r
1870 cp (hl)\r
1871 jr nz,l099ah\r
1872 ld a,(ix+001h)\r
1873 ld (hl),a\r
0c4244e5 1874l099ah:\r
0716e834 1875 res 3,(ix+000h)\r
1bfdbe14
L
1876\r
1877 call bpl_next\r
0716e834 1878 ret\r
0c4244e5 1879\r
4bb547a7 1880bp_tst_@pc:\r
1bfdbe14
L
1881 call bpl_init\r
1882\r
0716e834
L
1883 ld a,(ix+000h)\r
1884 and 003h\r
4a39ae18 1885 jr z,bp_tst_e\r
0716e834
L
1886 ld e,(ix+002h)\r
1887 ld d,(ix+003h)\r
ac35765e 1888 ld hl,(reg.pc)\r
0716e834
L
1889 call cp_hl_de\r
1890 ret z\r
4a39ae18 1891bp_tst_e:\r
1bfdbe14 1892 call bpl_next\r
0716e834
L
1893 sub a\r
1894 inc a\r
1895 ret\r
0c4244e5 1896\r
4bb547a7 1897bp_trace_enter:\r
0716e834 1898 call bp_get_freeslot\r
0716e834
L
1899 ld (ix+002h),l\r
1900 ld (ix+003h),h\r
0716e834
L
1901 ld a,(b_21e2_start)\r
1902 and a\r
1903 ld a,008h\r
4a39ae18 1904 jr nz,bp_t_e\r
1d3941c8 1905 rra\r
4a39ae18 1906bp_t_e:\r
0716e834
L
1907 ld (ix+000h),a\r
1908 ret\r
0c4244e5 1909\r
1d3941c8 1910bp_set_to_mem:\r
1bfdbe14
L
1911 call bpl_init\r
1912\r
0716e834
L
1913 ld a,(ix+000h)\r
1914 and c\r
1915 jr z,l0a1dh\r
1916 set 5,(ix+000h)\r
1917 ld l,(ix+002h)\r
1918 ld h,(ix+003h)\r
1919 ld a,(hl)\r
1920 ld (ix+001h),a\r
1921 ld a,(l0003h)\r
1922 ld (hl),a\r
1923 and 038h\r
1924 ld h,000h\r
1925 ld l,a\r
1926 ld (hl),0c3h\r
1927 inc hl\r
1928 ld de,bpddtz\r
1929 ld (hl),e\r
1930 inc hl\r
1931 ld (hl),d\r
0c4244e5 1932l0a1dh:\r
1bfdbe14
L
1933\r
1934 call bpl_next\r
0716e834 1935 ret\r
0c4244e5 1936\r
9711a430
L
1937;-------------------------------------------------------------------------------\r
1938\r
0c4244e5 1939user_go:\r
0716e834
L
1940 sub a\r
1941 ld (b_21e2_start),a\r
4bb547a7 1942 ld a,(bp_p_cpu_flag)\r
0716e834
L
1943 and a\r
1944 call nz,p_cpustat\r
4bb547a7 1945 call bp_tst_@pc\r
0716e834
L
1946 ld c,007h\r
1947 jr nz,l0a41h\r
1948 ld a,001h\r
1949 ld (b_21e2_start),a\r
4a39ae18 1950 call tc_set_bp\r
0716e834 1951 ld c,008h\r
0c4244e5 1952l0a41h:\r
1d3941c8 1953 call bp_set_to_mem\r
0716e834
L
1954 ld sp,reg.l2\r
1955 pop hl\r
1956 pop de\r
1957 pop bc\r
1958 pop af\r
1959 exx\r
1960 ex af,af'\r
1961 pop af\r
1962 ld i,a\r
1963 pop iy\r
1964 pop ix\r
1965 pop af\r
1966 pop bc\r
1967 pop de\r
1968 pop hl\r
1969 ld sp,(reg_sp)\r
1970 jp reg.iff\r
0c4244e5 1971\r
9711a430
L
1972;-------------------------------------------------------------------------------\r
1973; > Y\r
1974; examine all Y variables\r
1975; > Y[0..9]\r
1976; examine (and substitute) an Y variable\r
1977\r
0c4244e5 1978\r
9711a430
L
1979;-------------------------------------------------------------------------------\r
1980; > X\r
1981; eXamine (display) all cpu registers and\r
1982; the instruction at the current program counter\r
1983; > X register\r
1984; eXamine (and substitute) a register\r
1985\r
1986\r
0c4244e5 1987cmd_X:\r
0716e834
L
1988 call skipbl\r
1989 call sub_0caeh\r
1990 jp nc,p_cpustat0\r
1991 call assert_eol\r
1992 ld a,b\r
a942c6d5 1993 cp 25\r
0716e834 1994 jr z,l0c5fh\r
a942c6d5 1995 cp 26\r
0716e834 1996 jr z,l0c4fh\r
0716e834 1997 ex de,hl\r
f81f70a9 1998 ld hl,t_reg_names\r
a942c6d5 1999 call pstr_sel\r
0716e834 2000 call l0c33h\r
35b535f6 2001\r
0716e834
L
2002 call outbl\r
2003 push de\r
2004 push bc\r
2005 call get_line\r
2006 call skipbl\r
2007 jr z,l0c30h\r
a3bccdeb 2008 call get_arg_final\r
cab0d80a
L
2009 ex de,hl\r
2010 pop bc\r
0716e834 2011 pop hl\r
cab0d80a
L
2012 ld (hl),e\r
2013 bit 0,c\r
0716e834
L
2014 ret z\r
2015 inc hl\r
cab0d80a 2016 ld (hl),d\r
0716e834 2017 ret\r
0c4244e5 2018l0c30h:\r
0716e834
L
2019 pop af\r
2020 pop hl\r
2021 ret\r
d1f2492e 2022\r
0c4244e5 2023l0c33h:\r
37ade8ec
L
2024 call pstr_inl\r
2025 dc '='\r
0716e834 2026 ld a,(de)\r
cab0d80a 2027 bit 0,c\r
0716e834
L
2028 jp z,out_hex\r
2029 ld l,a\r
2030 inc de\r
2031 ld a,(de)\r
2032 dec de\r
2033 ld h,a\r
35b535f6 2034 jp out_hl\r
0c4244e5
L
2035\r
2036l0c4fh:\r
0716e834
L
2037 call p_f\r
2038 ld a,0f3h\r
2039 ld (reg.iff),a\r
2040 scf\r
2041 call sub_0c6ah\r
2042 ld (reg.f),a\r
2043 ret\r
0c4244e5 2044l0c5fh:\r
0716e834
L
2045 call p_f2\r
2046 and a\r
2047 call sub_0c6ah\r
2048 ld (reg.f2),a\r
2049 ret\r
d24eec89 2050\r
0c4244e5 2051sub_0c6ah:\r
d24eec89 2052 push af\r
0716e834
L
2053 call outbl\r
2054 call assert_eol\r
2055 call get_line\r
d24eec89
L
2056 pop af\r
2057 ex af,af'\r
b0451b39 2058 ld b,0\r
0c4244e5 2059l0c76h:\r
0716e834
L
2060 call skipbl\r
2061 ld a,b\r
2062 ret z\r
2063 push bc\r
f81f70a9 2064 ld hl,t_flag_names\r
0716e834
L
2065 call lookupch\r
2066 jp nc,ERROR\r
f81f70a9
L
2067 inc b\r
2068 xor a\r
2069 scf\r
2070nxt_f:\r
2071 rla\r
2072 djnz nxt_f\r
2073 pop bc\r
2074 jr c,l0c97h\r
2075 or b\r
2076 ld b,a\r
0716e834 2077 jr l0c76h\r
f81f70a9 2078\r
0c4244e5 2079l0c97h:\r
0716e834
L
2080 ex af,af'\r
2081 jp nc,ERROR\r
2082 ex af,af'\r
2083 ld a,0fbh\r
2084 ld (reg.iff),a\r
0716e834 2085 jr l0c76h\r
0c4244e5 2086\r
f81f70a9 2087t_flag_names:\r
0c4244e5
L
2088 db 'CNV H ZSE',0\r
2089\r
2090sub_0caeh:\r
0716e834
L
2091 call sub_0303h\r
2092 ret nc\r
2093 ld a,b\r
2094 add a,b\r
2095 add a,b\r
2096 ld hl,b_0cfa_start\r
2097 call add_hl_a\r
2098 ld c,(hl)\r
2099 inc hl\r
2100 ld a,(hl)\r
2101 inc hl\r
2102 ld h,(hl)\r
2103 ld l,a\r
2104 scf\r
2105 ret\r
0c4244e5 2106\r
f81f70a9 2107t_reg_names:\r
a942c6d5
L
2108 DC 'BC''' ;0\r
2109 DC 'DE''' ;1\r
2110 DC 'HL''' ;2\r
2111 DC 'BC' ;3\r
2112 DC 'DE' ;4\r
2113 DC 'HL' ;5\r
2114 DC 'A''' ;6\r
2115 DC 'B''' ;7\r
2116 DC 'C''' ;8\r
2117 DC 'D''' ;9\r
2118 DC 'E''' ;10\r
2119 DC 'H''' ;11\r
2120 DC 'L''' ;12\r
2121 DC 'A' ;13\r
2122 DC 'B' ;14\r
2123 DC 'C' ;15\r
2124 DC 'D' ;16\r
2125 DC 'E' ;17\r
2126 DC 'H' ;18\r
2127 DC 'L' ;19\r
2128 DC 'IX' ;20\r
2129 DC 'IY' ;21\r
2130 DC 'SP' ;22\r
2131 DC 'PC' ;23\r
2132 DC 'I' ;24\r
2133 DC 'F''' ;25\r
2134 DC 'F' ;26\r
0c4244e5
L
2135 DB 0\r
2136\r
2137b_0cfa_start:\r
0716e834
L
2138 db 003h\r
2139 dw reg.c2\r
2140 db 003h\r
2141 dw reg.e2\r
2142 db 003h\r
2143 dw reg.l2\r
2144 db 003h\r
2145 dw reg.c\r
2146 db 003h\r
2147 dw reg.e\r
2148 db 003h\r
2149 dw reg.l\r
2150 db 000h\r
2151 dw reg.a2\r
2152 db 000h\r
2153 dw reg.b2\r
2154 db 000h\r
2155 dw reg.c2\r
2156 db 000h\r
2157 dw reg.d2\r
2158 db 000h\r
2159 dw reg.e2\r
2160 db 000h\r
2161 dw reg.h2\r
2162 db 000h\r
2163 dw reg.l2\r
2164 db 000h\r
2165 dw reg.a\r
2166 db 000h\r
2167 dw reg.b\r
2168 db 000h\r
2169 dw reg.c\r
2170 db 000h\r
2171 dw reg.d\r
2172 db 000h\r
2173 dw reg.e\r
2174 db 000h\r
2175 dw reg.h\r
2176 db 000h\r
2177 dw reg.l\r
2178 db 003h\r
2179 dw reg.ix\r
2180 db 003h\r
2181 dw reg.iy\r
2182 db 003h\r
2183 dw reg_sp\r
2184 db 003h\r
ac35765e 2185 dw reg.pc\r
0716e834
L
2186 db 000h\r
2187 dw reg.i\r
0716e834
L
2188 db 000h\r
2189 dw reg.f2\r
2190 db 000h\r
2191 dw reg.f\r
0c4244e5 2192\r
9711a430
L
2193;-------------------------------------------------------------------------------\r
2194; > S [startaddr]\r
2195; Substitute memory\r
2196\r
0c4244e5 2197cmd_S:\r
0716e834
L
2198 ld hl,(last_S)\r
2199 call get_lastarg_def\r
0c4244e5 2200l0d60h:\r
0716e834 2201 ld (last_S),hl\r
35b535f6 2202 call out_hl\r
0716e834
L
2203 call outbl\r
2204 ld a,(hl)\r
2205 call out_hex\r
2206 call outbl2\r
2207 call get_line\r
2208 call skipbl\r
2209 inc hl\r
2210 jr z,l0d60h\r
2211 dec hl\r
2212 inc de\r
2213 cp '.'\r
85b57f2a 2214 jr nz,cmds_dash\r
0c461f1d 2215 call get_char_upper\r
85b57f2a
L
2216 or a\r
2217 jr nz,l0d8ah\r
2218 ret\r
2219cmds_dash:\r
0716e834
L
2220 jp z,assert_eol\r
2221 cp '-'\r
2222 jr nz,l0d8ah\r
0c461f1d 2223 call get_char_upper\r
0716e834
L
2224 or a\r
2225 dec hl\r
2226 jr z,l0d60h\r
2227 inc hl\r
0c4244e5 2228l0d8ah:\r
0716e834
L
2229 dec de\r
2230 call sub_0ef8h\r
2231 jr l0d60h\r
0c4244e5 2232\r
9711a430
L
2233;-------------------------------------------------------------------------------\r
2234; > @\r
2235; examine (substitute) displacement register @\r
2236\r
35b535f6 2237;cmd_@:\r
0c4244e5 2238\r
9711a430
L
2239;-------------------------------------------------------------------------------\r
2240; >>I [port]\r
2241; Input a byte from port\r
2242\r
0c4244e5 2243cmd_I:\r
0716e834
L
2244 ld (cmd_rpt),hl\r
2245 ld hl,(last_I)\r
2246 call get_lastarg_def\r
2247 ld (last_I),hl\r
2248 ld b,h\r
2249 ld c,l\r
2250 in a,(c)\r
2251 push af\r
2252 call out_hex\r
2253 call outbl4\r
2254 pop af\r
2255 call out.bin.b\r
2256 jp crlf\r
0c4244e5 2257\r
9711a430
L
2258;-------------------------------------------------------------------------------\r
2259; >>O [byte] [port]\r
2260; Output a byte to a port\r
2261\r
0c4244e5 2262cmd_O:\r
0716e834
L
2263 ld (cmd_rpt),hl\r
2264 ld hl,(last_O_val)\r
2265 call get_arg_def\r
2266 ld a,l\r
2267 ld (last_O_val),a\r
2268 push af\r
2269 call next_arg\r
2270 ld hl,(last_O_addr)\r
2271 call get_lastarg_def\r
2272 ld (last_O_addr),hl\r
2273 ld b,h\r
2274 ld c,l\r
2275 pop af\r
2276 out (c),a\r
2277 ret\r
0c4244e5 2278\r
9711a430 2279;-------------------------------------------------------------------------------\r
a3bccdeb 2280; > V startaddr endaddr targetaddr\r
9711a430
L
2281; Verify (compare) two memory areas\r
2282\r
0c4244e5 2283cmd_V:\r
a3bccdeb 2284 call get_arg_range_target\r
0c4244e5 2285l0dedh:\r
0716e834
L
2286 push bc\r
2287 ld a,(de)\r
2288 ld b,(hl)\r
2289 cp b\r
2290 jr z,l0e10h\r
2291 ld c,a\r
35b535f6 2292 call out_hl\r
0716e834
L
2293 call outbl\r
2294 ld a,b\r
2295 call out_hex\r
2296 call outbl2\r
2297 ld a,c\r
2298 call out_hex\r
2299 call outbl\r
2300 ex de,hl\r
35b535f6 2301 call out_hl\r
0716e834
L
2302 ex de,hl\r
2303 call crlf\r
0c4244e5 2304l0e10h:\r
0716e834 2305 pop bc\r
0716e834 2306 inc de\r
391ac6fb
L
2307 cpi\r
2308 jp pe,l0dedh\r
0716e834 2309 ret\r
0c4244e5 2310\r
9711a430 2311;-------------------------------------------------------------------------------\r
391ac6fb
L
2312; > M startaddr endaddr destaddr\r
2313; Move memory\r
9711a430 2314\r
0c4244e5 2315cmd_M:\r
a3bccdeb 2316 call get_arg_range_target\r
0716e834 2317 call cp_hl_de\r
3f9577cd 2318 jr nc,cmdm_up\r
0716e834
L
2319 add hl,bc\r
2320 ex de,hl\r
2321 add hl,bc\r
2322 ex de,hl\r
2323 dec hl\r
2324 dec de\r
2325 lddr\r
0f361185 2326 ret\r
3f9577cd
L
2327cmdm_up:\r
2328 ldir\r
0716e834 2329 ret\r
0c4244e5 2330\r
9711a430
L
2331;-------------------------------------------------------------------------------\r
2332; > H\r
2333; display Highest load address of last filed loaded, Maximum "High"\r
2334; off all loaded files, and Top address of available memory\r
9711a430
L
2335; > H expression\r
2336; evaluate expression and display result in hex, decimal and other formats\r
9711a430 2337\r
0c4244e5 2338cmd_H:\r
0716e834
L
2339 call expr\r
2340 jp c,p_max_high0\r
0716e834 2341 call assert_eol\r
0716e834
L
2342 call out_hl\r
2343 call outbl2\r
2344 call out_hl_neg\r
2345 call outbl4\r
2346 call out.hl.dec\r
2347 call outbl2\r
2348 call out_hl_dec_neg\r
2349 call outbl4\r
2350 call out.bin.w\r
ca1c9c55 2351 call outbl2\r
0716e834
L
2352 ld a,l\r
2353 call out.ascii\r
2354 jp crlf\r
0c4244e5 2355\r
9711a430
L
2356;-------------------------------------------------------------------------------\r
2357; > Q[J] startaddr endaddr bytes\r
2358; Query memory for a byte string [Justified]\r
2359\r
0c4244e5 2360cmd_Q:\r
0716e834
L
2361 call get_arg_range\r
2362 push bc\r
2363 push hl\r
2364 call sub_0ee6h\r
2365 pop hl\r
0c4244e5 2366l0e96h:\r
c18ba819
L
2367 push hl\r
2368 push de\r
2369 push bc\r
2370l0edah:\r
2371 ld a,(de)\r
2372 cp (hl)\r
2373 jr nz,l0ee2h\r
2374 inc de\r
2375 inc hl\r
2376 djnz l0edah\r
2377l0ee2h:\r
2378 pop bc\r
2379 pop de\r
2380 pop hl\r
0716e834
L
2381 jr nz,l0eb0h\r
2382 push bc\r
0716e834 2383 ld bc,16\r
c18ba819 2384 and a ;clear carry\r
0716e834 2385 call sub_0f58h\r
0716e834 2386 pop bc\r
0c4244e5 2387l0eb0h:\r
0716e834
L
2388 inc hl\r
2389 ex (sp),hl\r
2390 dec hl\r
2391 ld a,h\r
2392 or l\r
2393 ex (sp),hl\r
2394 jr nz,l0e96h\r
2395 pop bc\r
2396 ret\r
0c4244e5 2397\r
9711a430
L
2398;-------------------------------------------------------------------------------\r
2399; > Z startaddr endaddr bytes\r
2400; Zap (fill) memory with a byte string\r
2401\r
0c4244e5 2402cmd_Z:\r
0716e834
L
2403 call get_arg_range\r
2404 push bc\r
2405 push hl\r
2406 call sub_0ee6h\r
2407 ld a,b\r
2408 pop hl\r
2409 pop bc\r
2410 push hl\r
2411 ex de,hl\r
0c4244e5 2412l0ec7h:\r
0716e834
L
2413 ldi\r
2414 jp po,l0ed3h\r
2415 dec a\r
2416 jr nz,l0ec7h\r
2417 pop hl\r
2418 ldir\r
2419 ret\r
0c4244e5 2420l0ed3h:\r
0716e834
L
2421 pop hl\r
2422 ret\r
0c4244e5 2423\r
0c4244e5 2424sub_0ee6h:\r
0f361185 2425 ld hl,conbuf\r
0716e834 2426 call sub_0ef7h\r
0f361185 2427 ld de,conbuf\r
0716e834
L
2428 and a\r
2429 sbc hl,de\r
2430 ld b,l\r
2431 ret nz\r
2432 jp ERROR\r
0c4244e5 2433\r
c18ba819
L
2434sub_0ef7h: ;from cmd_Q, cmd_Z\r
2435 db 0e6h ;and 037h (clear carry)\r
2436sub_0ef8h: ;from cmd_S\r
0716e834 2437 scf\r
0c4244e5 2438l0ef9h:\r
0716e834
L
2439 push af\r
2440 call next_arg\r
0716e834
L
2441 cp ''''\r
2442 jr z,l0f1eh\r
2443 push hl\r
2444 call expr\r
2445 ld a,l\r
2446 pop hl\r
2447 jr c,l0f42h\r
0716e834
L
2448 ld (hl),a\r
2449 inc hl\r
2450 jr l0f3ah\r
0c4244e5 2451l0f1eh:\r
0716e834
L
2452 inc de\r
2453 ld a,(de)\r
2454 cp ''''\r
2455 jr z,l0f2bh\r
2456 or a\r
2457 jr z,l0f42h\r
0c4244e5 2458l0f27h:\r
0716e834
L
2459 ld (hl),a\r
2460 inc hl\r
2461 jr l0f1eh\r
0c4244e5 2462l0f2bh:\r
0716e834
L
2463 inc de\r
2464 ld a,(de)\r
2465 cp ''''\r
2466 jr z,l0f27h\r
2467 cp '.'\r
2468 jr nz,l0f3ah\r
2469 inc de\r
2470 dec hl\r
2471 set 7,(hl)\r
2472 inc hl\r
0c4244e5 2473l0f3ah:\r
0716e834
L
2474 pop af\r
2475 jr nc,l0ef9h\r
2476 ld (last_S),hl\r
2477 jr l0ef9h\r
0c4244e5 2478l0f42h:\r
0716e834
L
2479 pop af\r
2480 ret nc\r
2481 ld (last_S),hl\r
2482 ret\r
0c4244e5 2483\r
9711a430
L
2484;-------------------------------------------------------------------------------\r
2485; >>D [startaddr] [endaddr]\r
2486; Display memory in hex and ASCII\r
2487\r
0c4244e5 2488cmd_D:\r
0716e834
L
2489 ld (cmd_rpt),hl\r
2490 ld hl,(last_D)\r
2491 ld bc,128\r
2492 call sub_0377h\r
2493 scf\r
0c4244e5 2494sub_0f58h:\r
0716e834
L
2495 push bc\r
2496 push de\r
2497 push hl\r
d24eec89 2498 push af\r
0c4244e5 2499l0f5ch:\r
35b535f6 2500 call out_hl\r
c18ba819 2501 call outbl2\r
0716e834 2502 ld de,0\r
0c4244e5 2503l0f68h:\r
0716e834
L
2504 ld a,(hl)\r
2505 inc hl\r
2506 call out_hex\r
2507 call outbl\r
2508 dec bc\r
2509 inc e\r
2510 ld a,e\r
2511 cp 010h\r
2512 jr z,l0f80h\r
2513 and 003h\r
2514 call z,outbl\r
2515 ld a,b\r
2516 or c\r
2517 jr nz,l0f68h\r
0c4244e5 2518l0f80h:\r
0716e834
L
2519 call outbl\r
2520 and a\r
2521 sbc hl,de\r
0c4244e5 2522l0f86h:\r
0716e834
L
2523 ld a,(hl)\r
2524 call sub_0fa3h\r
2525 call outchar\r
2526 inc hl\r
2527 dec e\r
2528 jr nz,l0f86h\r
d24eec89
L
2529 pop af\r
2530 push af\r
0716e834
L
2531 jr nc,l0f97h\r
2532 ld (last_D),hl\r
0c4244e5 2533l0f97h:\r
0716e834
L
2534 call crlf\r
2535 ld a,b\r
2536 or c\r
2537 jr nz,l0f5ch\r
d24eec89 2538 pop af\r
0716e834
L
2539 pop hl\r
2540 pop de\r
2541 pop bc\r
2542 ret\r
0c4244e5
L
2543\r
2544sub_0fa3h:\r
0716e834
L
2545 and 07fh\r
2546 cp 07fh\r
2547 jr z,l0fach\r
2548 cp ' '\r
2549 ret nc\r
0c4244e5 2550l0fach:\r
0716e834
L
2551 ld a,'.'\r
2552 ret\r
0c4244e5 2553\r
9711a430
L
2554;-------------------------------------------------------------------------------\r
2555; > Fcommandline\r
2556; specifiy filenames and command line\r
2557\r
25e453a7 2558;cmd_F:\r
0c4244e5 2559\r
9711a430 2560;-------------------------------------------------------------------------------\r
25e453a7
L
2561; > R [displacement]\r
2562; Read Intel Hex File from console [add displacement]\r
9711a430 2563\r
25e453a7
L
2564cmd_R:\r
2565 ld hl,0\r
2566 call get_lastarg_def ;get offset from command line\r
2567 push hl\r
2568 ld hl,0\r
2569 ld (high_load),hl\r
2570w_recstart:\r
2571 call i.getchar\r
2572 jr z,rdhex_done\r
2573 cp ':'\r
2574 jr nz,w_recstart\r
2575 ld c,0 ;init checksum\r
2576 call i.gethexbyte ;record len\r
2577 ld b,a\r
2578 call i.gethexbyte ;address high\r
2579 ld h,a\r
2580 call i.gethexbyte ;address low\r
2581 ld l,a\r
2582 call i.gethexbyte ;record type (ignored)\r
2583 ld a,b\r
2584 and a ;record len == 0?\r
2585 jr z,rdhex_done\r
2586l16c6h:\r
2587 call i.gethexbyte\r
2588 pop de ;offset\r
c788b3b7 2589 push de\r
25e453a7 2590 push hl\r
c788b3b7 2591 add hl,de\r
25e453a7
L
2592 call i.storebyte\r
2593 pop hl\r
c788b3b7 2594 inc hl\r
25e453a7
L
2595 djnz l16c6h ;repeat for record len\r
2596 call i.gethexbyte ;checksum\r
2597 ld a,c\r
2598 and a\r
b270cd3a 2599 jr nz,error2 ;exit if checksum error\r
25e453a7 2600 jr w_recstart ;next record\r
b270cd3a 2601\r
25e453a7
L
2602rdhex_done:\r
2603 pop hl\r
2604 call i.gethexbyte\r
2605 jp p_max_high\r
9711a430 2606\r
25e453a7
L
2607i.gethexbyte:\r
2608 call sub_16f6h\r
2609 rlca\r
2610 rlca\r
2611 rlca\r
2612 rlca\r
2613 ld d,a\r
2614 call sub_16f6h\r
2615 add a,d\r
2616 ld d,a\r
2617 add a,c\r
2618 ld c,a\r
2619 ld a,d\r
c788b3b7 2620 ret\r
0c4244e5 2621\r
25e453a7
L
2622sub_16f6h:\r
2623 call i.getchar\r
2624 jr z,error2\r
2625 call hex_digit\r
2626 ret nc\r
2627error2:\r
2628 jp ERROR\r
0c4244e5 2629\r
25e453a7 2630i.getchar:\r
b5b85b4c 2631 call incharw\r
25e453a7 2632 cp 01ah\r
0716e834 2633 ret\r
0c4244e5 2634\r
25e453a7 2635i.storebyte:\r
0716e834
L
2636 push af\r
2637 push de\r
25e453a7 2638 ld de,TPA ;lowest allowed load address\r
0716e834 2639 call cp_hl_de\r
30673dea 2640 jr c,error2\r
25e453a7 2641 ld de,(BDOS+1) ;highest allowed load address\r
0716e834 2642 call cp_hl_de\r
30673dea 2643 jr nc,error2\r
0716e834
L
2644 ld de,(high_load)\r
2645 call cp_hl_de\r
2646 jr c,l1157h\r
2647 ld (high_load),hl\r
0c4244e5 2648l1157h:\r
0716e834
L
2649 ld de,(max_load)\r
2650 call cp_hl_de\r
2651 jr c,l1163h\r
2652 ld (max_load),hl\r
0c4244e5 2653l1163h:\r
0716e834
L
2654 pop de\r
2655 pop af\r
25e453a7 2656 ld (hl),a ;store byte\r
0716e834 2657 ret\r
0c4244e5 2658\r
9711a430 2659;-------------------------------------------------------------------------------\r
9711a430 2660\r
25a690e5 2661p_max_high0:\r
d1f2492e 2662 call assert_eol\r
25a690e5 2663p_max_high:\r
d1f2492e 2664 call pstr_inl\r
0c4244e5 2665 DC 'High = '\r
d1f2492e
L
2666 ld hl,(high_load)\r
2667 call out_hl\r
2668 call pstr_inl\r
0c4244e5 2669 DC ' Max = '\r
d1f2492e
L
2670 ld hl,(max_load)\r
2671 call out_hl\r
3a4deef9
L
2672 call pstr_inl\r
2673 DC ' Top = '\r
0f35ae66 2674 ld hl,ddtz_base-1\r
3a4deef9 2675 call out_hl\r
d1f2492e 2676 jp crlf\r
0c4244e5 2677\r
9711a430
L
2678;-------------------------------------------------------------------------------\r
2679; > Wstartaddr endaddr\r
2680; Write a file to disk\r
2681\r
25e453a7 2682;cmd_W:\r
0c4244e5 2683\r
9711a430
L
2684;-------------------------------------------------------------------------------\r
2685; > A [startaddr]\r
2686; Assemble Zilog Z180 mnemonics\r
2687\r
786e99f6 2688;cmd_A:\r
ac35765e 2689\r
9711a430
L
2690;-------------------------------------------------------------------------------\r
2691; >>L [startaddr] [endaddr]\r
2692; List disassembled code\r
2693\r
0c4244e5 2694cmd_L:\r
0716e834
L
2695 ld (cmd_rpt),hl\r
2696 call expr\r
2697 jr nc,l18dbh\r
2698 ld hl,(last_L)\r
0c4244e5 2699l18dbh:\r
0716e834
L
2700 call next_arg\r
2701 call get_range\r
2702 jr nc,l1905h\r
2703 call assert_eol\r
2704 ld b,16\r
0c4244e5 2705l18ebh:\r
0716e834 2706 push bc\r
85b57f2a 2707 call cmdl_p_line\r
0716e834
L
2708 pop bc\r
2709 djnz l18ebh\r
2710 ret\r
85b57f2a 2711\r
0c4244e5 2712l1905h:\r
0716e834 2713 call assert_eol\r
85b57f2a
L
2714 ld d,h\r
2715 ld e,l\r
2716 add hl,bc\r
2717 ex de,hl\r
0c4244e5 2718l190fh:\r
85b57f2a
L
2719 push de\r
2720 call cmdl_p_line\r
2721 pop de\r
2722 call cp_hl_de\r
2723 jr c,l190fh\r
2724 ret\r
2725\r
9711a430
L
2726;-------------------------------------------------------------------------------\r
2727\r
85b57f2a
L
2728cmdl_p_line:\r
2729 push hl\r
35b535f6 2730 call out_hl\r
a942c6d5 2731 call outbl2\r
0716e834
L
2732 sub a\r
2733 ld (con_col),a\r
85b57f2a
L
2734 push hl\r
2735 pop iy\r
0716e834 2736 call p_disas_instr\r
6bc52899
L
2737 call crlf\r
2738 pop hl\r
2739 ld c,b\r
2740 ld b,0\r
2741 add hl,bc\r
2742 ld (last_L),hl\r
35b535f6 2743 ret\r
0c4244e5 2744\r
9711a430
L
2745;-------------------------------------------------------------------------------\r
2746\r
25a690e5 2747p_disas_instr:\r
0716e834
L
2748 call disas_get_instrlen\r
2749 jr nc,l197fh\r
85b57f2a
L
2750 push bc\r
2751 ld a,(con_col)\r
2752 add a,5\r
2753 ld c,a\r
b270cd3a 2754 call pstr ;print mnemonic\r
08d0db09 2755 call p_goto_col\r
2c2c7492 2756 call pr_instr_args ;print arguments\r
0716e834 2757 pop bc\r
0716e834
L
2758 scf\r
2759 ret\r
0c4244e5
L
2760\r
2761l197fh:\r
d1f2492e 2762 call pstr_inl\r
0c4244e5 2763 DC '???'\r
85b57f2a 2764 ld b,1\r
d1f2492e
L
2765 sub a\r
2766 ret\r
0c4244e5
L
2767\r
2768disas_get_instrlen:\r
0716e834
L
2769 sub a\r
2770 ld (isprefix_ixiy),a\r
2771 ld a,(iy+000h)\r
2772 cp 0edh\r
100f8242 2773 jr z,disas_pfx.ED\r
0716e834
L
2774 cp 0ddh\r
2775 jr z,l19abh\r
2776 cp 0fdh\r
2777 jr z,l19afh\r
0c4244e5 2778sub_19a0h:\r
0716e834
L
2779 ld a,(iy+000h)\r
2780 cp 0cbh\r
100f8242
L
2781 jr z,disas_pfx.CB\r
2782 jr disas_nopfx\r
0c4244e5 2783l19abh:\r
0716e834
L
2784 ld a,1\r
2785 jr l19b1h\r
0c4244e5 2786l19afh:\r
0716e834 2787 ld a,2\r
0c4244e5 2788l19b1h:\r
0716e834
L
2789 ld (isprefix_ixiy),a\r
2790 call disas_pfx.DDFD\r
2791 ret nc\r
2792 push bc\r
2793 call sub_19a0h\r
2794 pop af\r
2795 add a,b\r
2796 ld b,a\r
2797 scf\r
2798 ret\r
0c4244e5 2799\r
9711a430
L
2800;-------------------------------------------------------------------------------\r
2801\r
100f8242
L
2802disas_nopfx:\r
2803 ld hl,b_1b54_start ;2 byte opcodes\r
2804 call lookup_op_arg\r
2805 ld b,2\r
2806 ret c\r
2807 ld hl,b_1ab6_start ;1 byte opcodes (no parameters)\r
2808 call lookup_op\r
2809 ld b,1\r
2810 ret c\r
2811 ld hl,b_1ad1_start ;1 byte opcodes\r
2812 call lookup_op_arg\r
2813 ld b,1\r
2814 ret c\r
2815 ld hl,b_1b9b_start ;3 byte opcodes\r
2816 call lookup_op_arg\r
2817 ld b,3\r
2818 ret\r
2819\r
2820;-------------------------------------------------------------------------------\r
2821\r
2822disas_pfx.ED:\r
2823 inc iy\r
0f82c444
L
2824 ld hl,l228bh\r
2825 call lookup_op_arg\r
2826 ld b,3\r
2827 ret c\r
2828 ld hl,b_1c40_start\r
2829 call lookup_op_arg\r
2830 ld b,4\r
2831 ret c\r
2832\r
100f8242
L
2833 ld hl,b_1bc9_start ;1 byte opcode, no arguments\r
2834 call lookup_op\r
0f82c444
L
2835 jr c,da_ed1\r
2836\r
100f8242
L
2837 ld hl,b_1bf4_start\r
2838 call lookup_op_arg\r
0f82c444 2839 ret nc\r
201101b3
L
2840\r
2841 ld a,e\r
2842 cp a_noarg\r
2843 jr nz,da_ed0\r
2844 ld c,(iy+0)\r
2845 ld a,c\r
2846 rra\r
2847 and 0ch\r
2848 ld b,a\r
2849 ld a,c\r
2850 and 03h\r
2851 call str_sel_ab\r
100f8242 2852\r
201101b3
L
2853da_ed0:\r
2854 scf\r
201101b3 2855da_ed1:\r
0f82c444 2856 ld b,2\r
100f8242
L
2857 ret\r
2858\r
2859;-------------------------------------------------------------------------------\r
2860\r
2861disas_pfx.CB:\r
2862 push iy\r
2863 inc iy\r
2864 ld a,(isprefix_ixiy)\r
2865 and a\r
2866 jr z,l1a42h\r
2867 inc iy\r
2868l1a42h:\r
2869 ld hl,b_1c55_start\r
2870 call lookup_op_arg\r
2871 pop iy\r
2872 ld b,2\r
2873 ret\r
2874\r
2875;-------------------------------------------------------------------------------\r
2876\r
0c4244e5 2877disas_pfx.DDFD:\r
0716e834
L
2878 inc iy\r
2879 ld hl,b_19ef_start\r
2880 call test_DDFD\r
2881 ld b,002h\r
2882 ret c\r
2883 ld hl,l1a0ah\r
2884 call test_DDFD\r
2885 ld b,001h\r
2886 ret c\r
2887 ld a,(iy+000h)\r
2888 cp 0cbh\r
2889 jr nz,l19edh\r
2890 ld a,(iy+002h)\r
2891 cp 036h\r
2892 ret z\r
2893 and 007h\r
2894 cp 006h\r
2895 jr nz,l19edh\r
2896 ld b,002h\r
2897 scf\r
2898 ret\r
0c4244e5 2899l19edh:\r
0716e834
L
2900 and a\r
2901 ret\r
0c4244e5 2902\r
9711a430 2903;-------------------------------------------------------------------------------\r
eb982d46 2904; DD/FD 3 byte (ix+d)/(iy+d)\r
0c4244e5 2905b_19ef_start:\r
0716e834
L
2906 db 034h\r
2907 db 035h\r
2908 db 036h\r
2909 db 046h\r
2910 db 04eh\r
2911 db 056h\r
2912 db 05eh\r
2913 db 066h\r
2914 db 06eh\r
2915 db 070h\r
2916 db 071h\r
2917 db 072h\r
2918 db 073h\r
2919 db 074h\r
2920 db 075h\r
2921 db 077h\r
2922 db 07eh\r
2923 db 086h\r
2924 db 08eh\r
2925 db 096h\r
2926 db 09eh\r
2927 db 0a6h\r
2928 db 0aeh\r
2929 db 0b6h\r
2930 db 0beh\r
2931 db 0\r
0c4244e5 2932\r
eb982d46 2933; DD/FD 2 byte\r
0c4244e5 2934l1a0ah:\r
0716e834
L
2935 db 009h\r
2936 db 019h\r
2937 db 021h\r
2938 db 022h\r
2939 db 023h\r
2940 db 029h\r
2941 db 02ah\r
2942 db 02bh\r
2943 db 039h\r
2944 db 0e1h\r
2945 db 0e3h\r
2946 db 0e5h\r
2947 db 0e9h\r
2948 db 0f9h\r
2949 db 0\r
0c4244e5 2950\r
9711a430
L
2951;-------------------------------------------------------------------------------\r
2952\r
0f82c444
L
2953test_DDFD:\r
2954 ld a,(hl)\r
2955 and a\r
2956 ret z\r
2957 inc hl\r
2958 cp (iy+000h)\r
2959 jr nz,test_DDFD\r
2960 scf\r
2961 ret\r
2962\r
100f8242 2963lookup_op:\r
0716e834 2964 ld a,(hl)\r
201101b3 2965 inc hl\r
0716e834
L
2966 cp 0ffh\r
2967 ret z\r
2968 cp (iy+000h)\r
2969 jr z,l1a7fh\r
2970 inc hl\r
100f8242 2971 jr lookup_op\r
0c4244e5 2972l1a7fh:\r
8c416d5a 2973 ld b,(hl)\r
201101b3 2974 ld e,a_noarg\r
cab0d80a
L
2975 jr get_mnemonic\r
2976\r
100f8242 2977lookup_op_arg:\r
0f82c444
L
2978 call lookup_branch_op\r
2979 ret nc\r
2980 ld a,e\r
2981 ld e,d\r
2982 cp a,0ffh\r
2c2c7492 2983 ret z ;carry clear\r
0f82c444
L
2984 ld b,a\r
2985\r
cab0d80a 2986get_mnemonic:\r
0716e834 2987 ld hl,t_MNEMONICS\r
8c416d5a
L
2988 bit 7,b\r
2989 jr z,get_m1\r
2990 res 7,b\r
2991 ld a,(iy+000h)\r
2992 rra\r
2993 rra\r
2994 rra\r
2995 and 07h\r
201101b3 2996str_sel_ab:\r
8c416d5a
L
2997 add b\r
2998 ld b,a\r
2999get_m1:\r
3000 call str_sel\r
0716e834
L
3001 scf\r
3002 ret\r
0c4244e5 3003\r
2c2c7492 3004lookup_branch_op ;TODO\r
0f82c444
L
3005 ld a,(hl)\r
3006 and a\r
3007 ret z\r
2c2c7492 3008 inc hl\r
0f82c444 3009 and (iy+000h)\r
2c2c7492 3010 cp (hl)\r
2c2c7492 3011 inc hl\r
912247b3 3012 jr z,l1aa8_br\r
2c2c7492
L
3013 inc hl\r
3014 inc hl\r
0f82c444 3015 jr lookup_branch_op\r
2c2c7492
L
3016\r
3017l1aa8_br:\r
2c2c7492
L
3018 ld e,(hl)\r
3019 inc hl\r
3020 ld d,(hl)\r
3021 scf\r
3022 ret\r
3023\r
9711a430 3024;-------------------------------------------------------------------------------\r
b0b4005c
L
3025; 1 byte opcodes (no parameters)\r
3026; Format: db opcode, t_MNEMONICS-index\r
0c4244e5 3027b_1ab6_start:\r
8c416d5a
L
3028 db 076h,i_HALT ;halt\r
3029 db 0d9h,i_EXX ;exx\r
3030 db 0f3h,i_DI ;di\r
3031 db 0fbh,i_EI ;ei\r
3032 db 000h,i_NOP ;nop\r
201101b3
L
3033; db 007h,i_RLCA ;rlca\r
3034; db 00fh,i_RRCA ;rrca\r
3035; db 017h,i_RLA ;rla\r
3036; db 01fh,i_RRA ;rra\r
3037; db 027h,i_DAA ;daa\r
3038; db 02fh,i_CPL ;cpl\r
3039; db 037h,i_SCF ;scf\r
3040; db 03fh,i_CCF ;ccf\r
8c416d5a 3041 db 0c9h,i_RET ;ret\r
b0b4005c
L
3042 db 0ffh\r
3043\r
0c4244e5 3044\r
cab0d80a 3045; 1 byte opcodes\r
b0b4005c 3046; Format: db mask, match, t_MNEMONICS-index\r
78c98259 3047; dw argument formating function\r
0c4244e5 3048b_1ad1_start:\r
8c416d5a 3049 db 0c0h,040h,i_LD ;ld r[y],r[z]\r
2c2c7492 3050 db a_rr\r
201101b3
L
3051\r
3052 db 0c0h,080h,i_ADD+080h ;add a,r[z]\r
2c2c7492 3053 db a_r\r
201101b3
L
3054\r
3055; db 0f8h,080h,i_ADD ;add a,r[z]\r
3056; db a_ar\r
3057; db 0f8h,088h,i_ADC ;adc a,r[z]\r
3058; db a_ar\r
3059; db 0f8h,090h,i_SUB ;sub r[z]\r
3060; db a_r\r
3061; db 0f8h,098h,i_SBC ;sbc a,r[z]\r
3062; db a_ar\r
3063; db 0f8h,0a0h,i_AND ;and r[z]\r
3064; db a_r\r
3065; db 0f8h,0a8h,i_XOR ;xor r[z]\r
3066; db a_r\r
3067; db 0f8h,0b0h,i_OR ;or r[z]\r
3068; db a_r\r
3069; db 0f8h,0b8h,i_CP ;cp r[z]\r
3070; db a_r\r
3071\r
8c416d5a 3072 db 0c7h,0c0h,i_RET ;ret cc\r
2c2c7492 3073 db a_cc\r
8c416d5a 3074 db 0c7h,0c7h,i_RST ;rst\r
2c2c7492 3075 db a_rst\r
8c416d5a 3076 db 0cfh,0c1h,i_POP ;pop rp2\r
2c2c7492 3077 db a_p2\r
8c416d5a 3078 db 0cfh,0c5h,i_PUSH ;push rp2\r
2c2c7492 3079 db a_p2\r
8c416d5a 3080 db 0ffh,0e3h,i_EX ;ex (sp),hl\r
2c2c7492 3081 db a_esphl\r
8c416d5a 3082 db 0ffh,0e9h,i_JP ;jp (hl)\r
2c2c7492 3083 db a_hl\r
8c416d5a 3084 db 0ffh,0ebh,i_EX ;ex de,hl\r
2c2c7492 3085 db a_dehl\r
8c416d5a 3086 db 0ffh,0f9h,i_LD ;ld sp,hl\r
2c2c7492 3087 db a_lsphl\r
8c416d5a 3088 db 0cfh,003h,i_INC ;inc rp\r
2c2c7492 3089 db a_p\r
8c416d5a 3090 db 0cfh,00bh,i_DEC ;dec rp\r
2c2c7492 3091 db a_p\r
8c416d5a 3092 db 0c7h,004h,i_INC ;inc r[y]\r
2c2c7492 3093 db a_ry\r
8c416d5a 3094 db 0c7h,005h,i_DEC ;dec r[y]\r
2c2c7492 3095 db a_ry\r
8c416d5a 3096 db 0ffh,008h,i_EX ;ex af,af'\r
2c2c7492 3097 db a_eaf\r
8c416d5a 3098 db 0cfh,009h,i_ADD ;add hl,rp\r
2c2c7492 3099 db a_hlp\r
8c416d5a 3100 db 0efh,002h,i_LD ;ld (rp),a ;rp=bc,de\r
2c2c7492 3101 db a_pa\r
8c416d5a 3102 db 0efh,00ah,i_LD ;ld a,(rp) ;rp=bc,de\r
2c2c7492 3103 db a_ap\r
201101b3
L
3104\r
3105 db 0c7h,007h,i_RLCA+080h;rlca\r
3106 db a_noarg\r
3107\r
b0b4005c 3108 db 0\r
0c4244e5 3109\r
2c2c7492 3110; 2 byte opcodes\r
0c4244e5 3111b_1b54_start:\r
8c416d5a 3112 db 0c7h,006h,i_LD ;ld r[y],nn\r
2c2c7492 3113 db a_rn\r
201101b3
L
3114\r
3115 db 0c7h,0c6h,i_ADD+080h ;add a,r[z]\r
2c2c7492 3116 db a_n\r
201101b3
L
3117\r
3118; db 0ffh,0c6h,i_ADD ;add a,nn\r
3119; db a_an\r
3120; db 0ffh,0ceh,i_ADC ;adc a,nn\r
3121; db a_an\r
3122; db 0ffh,0d6h,i_SUB ;sub nn\r
3123; db a_n\r
3124; db 0ffh,0deh,i_SBC ;sbc a,nn\r
3125; db a_an\r
3126; db 0ffh,0e6h,i_AND ;and nn\r
3127; db a_n\r
3128; db 0ffh,0eeh,i_XOR ;xor nn\r
3129; db a_n\r
3130; db 0ffh,0f6h,i_OR ;or nn\r
3131; db a_n\r
3132; db 0ffh,0feh,i_CP ;cp nn\r
3133; db a_n\r
3134\r
8c416d5a 3135 db 0ffh,010h,i_DJNZ ;djnz\r
2c2c7492 3136 db a_j\r
8c416d5a 3137 db 0ffh,018h,i_JR ;jr\r
2c2c7492 3138 db a_j\r
8c416d5a 3139 db 0e7h,020h,i_JR ;jr cc,\r
2c2c7492 3140 db a_ccj\r
8c416d5a 3141 db 0ffh,0d3h,i_OUT ;out (nn),a\r
2c2c7492 3142 db a_ma\r
8c416d5a 3143 db 0ffh,0dbh,i_IN ;in a,(nn)\r
2c2c7492 3144 db a_am\r
b0b4005c 3145 db 0\r
0c4244e5 3146\r
cab0d80a 3147; 3 byte opcodes\r
0c4244e5 3148b_1b9b_start:\r
8c416d5a 3149 db 0c7h,0c2h,i_JP ;jp cc,mn\r
2c2c7492 3150 db a_ccnn\r
8c416d5a 3151 db 0c7h,0c4h,i_CALL ;call cc,mn\r
2c2c7492 3152 db a_ccnn\r
8c416d5a 3153 db 0cfh,001h,i_LD ;ld ww,mn\r
2c2c7492 3154 db a_rnn\r
8c416d5a 3155 db 0ffh,0c3h,i_JP ;jp mn\r
2c2c7492 3156 db a_nn\r
8c416d5a 3157 db 0ffh,0cdh,i_CALL ;call mn\r
2c2c7492 3158 db a_nn\r
8c416d5a 3159 db 0ffh,022h,i_LD ;ld (mn),hl\r
2c2c7492 3160 db a_mmhl\r
8c416d5a 3161 db 0ffh,02ah,i_LD ;ld hl,(mn)\r
2c2c7492 3162 db a_hlmm\r
8c416d5a 3163 db 0ffh,032h,i_LD ;ld (mn),a\r
2c2c7492 3164 db a_mma\r
8c416d5a 3165 db 0ffh,03ah,i_LD ;ld a,(mn)\r
2c2c7492 3166 db a_amm\r
b0b4005c
L
3167 db 0\r
3168\r
3169; Prefix ED + 1 byte opcode, no arguments\r
3170; Format: opcode, t_MNEMONICS index\r
0c4244e5 3171b_1bc9_start:\r
8c416d5a
L
3172 db 044h,i_NEG ;neg\r
3173 db 045h,i_RETN ;retn\r
3174 db 04dh,i_RETI ;reti\r
3175 db 067h,i_RRD ;rrd\r
3176 db 06fh,i_RLD ;rld\r
201101b3
L
3177; db 0a0h,i_LDI ;ldi\r
3178; db 0a1h,i_CPI ;cpi\r
3179; db 0a2h,i_INI ;ini\r
3180; db 0a3h,i_OUTI ;outi\r
3181; db 0a8h,i_LDD ;ldd\r
3182; db 0a9h,i_CPD ;cpd\r
3183; db 0aah,i_IND ;ind\r
3184; db 0abh,i_OUTD ;outd\r
3185; db 0b0h,i_LDIR ;ldir\r
3186; db 0b1h,i_CPIR ;cpir\r
3187; db 0b2h,i_INIR ;inir\r
3188; db 0b3h,i_OTIR ;otir\r
3189; db 0b8h,i_LDDR ;lddr\r
3190; db 0b9h,i_CPDR ;cpdr\r
3191; db 0bah,i_INDR ;indr\r
3192; db 0bbh,i_OTDR ;otdr\r
8c416d5a
L
3193 db 08bh,i_OTDM ;otdm\r
3194 db 09bh,i_OTDMR ;otdmr\r
3195 db 083h,i_OTIM ;otim\r
3196 db 093h,i_OTIMR ;otimr\r
3197 db 076h,i_SLP ;slp\r
b0b4005c 3198 db 0ffh ;<end mark>\r
0c4244e5
L
3199\r
3200b_1bf4_start:\r
201101b3
L
3201 db 0e4h,0a0h,i_LDI\r
3202 db a_noarg\r
8c416d5a 3203 db 0ffh,070h,i_IN ;in (c) ;\r
2c2c7492 3204 db a_c\r
8c416d5a 3205 db 0c7h,040h,i_IN ;in r,(c) ;r=b,c,d,e,h,l,a\r
2c2c7492 3206 db a_rc\r
25ba7c19 3207 db 0ffh,071h,0ffh ;out (c),0 ;\r
2c2c7492 3208 db a_cr\r
8c416d5a 3209 db 0c7h,041h,i_OUT ;out (c),r ;r=b,c,d,e,h,l,a\r
2c2c7492 3210 db a_cr\r
8c416d5a 3211 db 0cfh,042h,i_SBC ;sbc hl,rp\r
2c2c7492 3212 db a_hlp\r
8c416d5a 3213 db 0cfh,04ah,i_ADC ;adc hl,rp\r
2c2c7492 3214 db a_hlp\r
8c416d5a 3215 db 0ffh,046h,i_IM ;im 0\r
2c2c7492 3216 db a_im0\r
8c416d5a 3217 db 0ffh,056h,i_IM ;im 1\r
2c2c7492 3218 db a_im1\r
8c416d5a 3219 db 0ffh,05eh,i_IM ;im 2\r
2c2c7492 3220 db a_im2\r
8c416d5a 3221 db 0e7h,047h,i_LD ;ld i,a ... ld a,r\r
2c2c7492 3222 db a_ai\r
8c416d5a 3223 db 0cfh,04ch,i_MLT ;mlt rr\r
2c2c7492 3224 db a_p\r
8c416d5a 3225 db 0c7h,004h,i_TST ;tst r\r
2c2c7492 3226 db a_ry\r
b0b4005c
L
3227 db 0\r
3228\r
3229l228bh:\r
8c416d5a 3230 db 0ffh,030h,i_IN0 ;in0 (m)\r
2c2c7492 3231 db a_m\r
8c416d5a 3232 db 0c7h,000h,i_IN0 ;in0 r,(m) ;r=b,c,d,e,h,l,a\r
2c2c7492 3233 db a_rm\r
25ba7c19 3234 db 0ffh,031h,0ffh ;out0 (m),0\r
2c2c7492 3235 db a_mr\r
8c416d5a 3236 db 0c7h,001h,i_OUT0 ;out0 (m),r ;r=b,c,d,e\r
2c2c7492 3237 db a_mr\r
8c416d5a 3238 db 0ffh,064h,i_TST ;tst m\r
2c2c7492 3239 db a_n\r
8c416d5a 3240 db 0ffh,074h,i_TSTIO ;tstio m\r
2c2c7492 3241 db a_n\r
b0b4005c 3242 db 0\r
0c4244e5 3243\r
78c98259
L
3244; Prefix ED + 1 byte opcode + 2 byte address\r
3245; Format: db mask, match, t_MNEMONICS-index\r
3246; dw argument formating function\r
0c4244e5 3247b_1c40_start:\r
8c416d5a 3248 db 0cfh,043h,i_LD ;ld (mn),ww ;ww=bc,de,hl,sp\r
2c2c7492 3249 db a_mmp\r
8c416d5a 3250 db 0cfh,04bh,i_LD ;ld ww,(mn) ;ww=bc,de,hl,sp\r
2c2c7492 3251 db a_pmm\r
b0b4005c
L
3252 db 0\r
3253\r
3254; CB\r
0c4244e5 3255b_1c55_start:\r
201101b3 3256 db 0c0h,000h,i_RLC+080h ;rlc g\r
2c2c7492 3257 db a_cbr\r
201101b3
L
3258\r
3259; db 0f8h,000h,i_RLC ;rlc g\r
3260; db a_cbr\r
3261; db 0f8h,008h,i_RRC ;rrc g\r
3262; db a_cbr\r
3263; db 0f8h,010h,i_RL ;rl g\r
3264; db a_cbr\r
3265; db 0f8h,018h,i_RR ;rr g\r
3266; db a_cbr\r
3267; db 0f8h,020h,i_SLA ;sla g\r
3268; db a_cbr\r
3269; db 0f8h,028h,i_SRA ;sra g\r
3270; db a_cbr\r
3271; db 0f8h,038h,i_SRL ;srl g\r
3272; db a_cbr\r
8c416d5a 3273 db 0c0h,040h,i_BIT ;bit b,g\r
2c2c7492 3274 db a_bcbr\r
8c416d5a 3275 db 0c0h,080h,i_RES ;res b,g\r
2c2c7492 3276 db a_bcbr\r
8c416d5a 3277 db 0c0h,0c0h,i_SET ;set b,g\r
2c2c7492 3278 db a_bcbr\r
b0b4005c 3279 db 0\r
0c4244e5 3280\r
9711a430 3281;-------------------------------------------------------------------------------\r
2c2c7492 3282;-------------------------------------------------------------------------------\r
9711a430 3283\r
25a690e5 3284\r
2c2c7492
L
3285pr_instr_args:\r
3286 ld hl,t_argf\r
3287 ld d,0\r
3288 add hl,de\r
3289pria_l:\r
3290 ld a,(hl) ;get next token\r
3291 inc hl\r
3292 or a\r
3293 ret z ;\r
3294 jp m,pria_1\r
3295 call outchar ;print as normal character\r
3296 jr pria_l\r
25a690e5 3297\r
2c2c7492
L
3298pria_1: ;\r
3299 push hl\r
3300 ld hl,do_arg_n\r
3301 and 07fh\r
3302 call add_hl_a2\r
3303 ld a,(hl)\r
3304 inc hl\r
3305 ld h,(hl)\r
3306 ld l,a\r
c1ae5a7d 3307 ld a,(iy+000h)\r
2c2c7492
L
3308 call CALL_HL\r
3309 pop hl\r
3310 jr pria_l\r
25a690e5 3311\r
2c2c7492
L
3312;\r
3313; http://www.z80.info/decoding.htm\r
3314;\r
3315; | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |\r
3316; | x | y | z |\r
3317; | p | q |\r
3318;\r
25a690e5 3319\r
2c2c7492
L
3320t_argf:\r
3321; 1 byte opcodes\r
3322a_rr equ $-t_argf\r
3323 db fi_ry,',' ;ld r[y],r[z]\r
3324a_r equ $-t_argf\r
3325 db fi_rz,0 ;op r[z]\r
0f82c444
L
3326;a_ar equ $-t_argf\r
3327; db 'A,',fi_rz,0 ;op A,r[z]\r
2c2c7492
L
3328a_cc equ $-t_argf\r
3329 db fi_ccy,0 ;op cc[y]\r
3330a_rst equ $-t_argf\r
3331 db fi_rst,0 ;rst y*8\r
3332a_p2 equ $-t_argf\r
3333 db fi_rp2,0 ;rp2[p]\r
3334a_esphl equ $-t_argf\r
3335 db '(SP),',fi_hlixiy,0 ;ex (sp),hl\r
3336a_hl equ $-t_argf\r
3337 db '(',fi_hlixiy,')',0 ;jp (hl)\r
3338a_dehl equ $-t_argf\r
3339 db 'DE,HL',0\r
3340a_lsphl equ $-t_argf\r
3341 db 'SP,',fi_hlixiy,0 ;ld SP,HL\r
3342a_eaf equ $-t_argf\r
3343 db 'AF,AF''',0 ;ex af,af'\r
3344a_hlp equ $-t_argf\r
3345 db fi_hlixiy,',' ;add hl,rp\r
3346a_p equ $-t_argf\r
3347 db fi_rp,0 ;rp[p]\r
3348a_pa equ $-t_argf\r
3349 db '(',fi_rp,'),A',0 ;ld (rp),a ;rp=bc,de\r
3350a_ap equ $-t_argf\r
3351 db 'A,(',fi_rp,')',0 ;ld a,(rp) ;rp=bc,de\r
25a690e5 3352\r
2c2c7492
L
3353; 2 byte opcodes\r
3354a_rn equ $-t_argf\r
3355 db fi_ry,',',fi_n,0 ;ld r[y],n\r
201101b3
L
3356;a_an equ $-t_argf\r
3357; db 'A,' ;op a,n\r
2c2c7492
L
3358a_n equ $-t_argf\r
3359 db fi_n,0 ;op n\r
3360a_ccj equ $-t_argf\r
3361 db fi_ccy2,',' ;jr cc,j ;cc = nz,z,nc,c\r
3362a_j equ $-t_argf\r
3363 db fi_j,0 ;jr j\r
3364a_ma equ $-t_argf\r
3365 db '(',fi_n,'),A',0 ;out (n),a\r
3366a_am equ $-t_argf\r
3367 db 'A,(',fi_n,')',0 ;in a,(n)\r
3368\r
3369; 3 byte opcodes\r
3370a_ccnn equ $-t_argf\r
3371 db fi_ccy,',',fi_nn,0 ;op cc[y],nn\r
3372a_rnn equ $-t_argf\r
3373 db fi_rp,',' ;ld rp[p],nn\r
3374a_nn equ $-t_argf\r
3375 db fi_nn,0 ;jp nn\r
3376a_mmhl equ $-t_argf\r
3377 db '(',fi_nn,'),',fi_hlixiy,0 ;ld (nn),hl\r
3378a_hlmm equ $-t_argf\r
3379 db fi_hlixiy,',(',fi_nn,')',0 ;ld hl,(nn)\r
3380a_mma equ $-t_argf\r
3381 db '(',fi_nn,'),A',0 ;ld (nn),a\r
3382a_amm equ $-t_argf\r
3383 db 'A,(',fi_nn,')',0 ;ld a,(nn)\r
b0b4005c 3384\r
2c2c7492
L
3385; Prefix ED + 1 byte opcode\r
3386a_rc equ $-t_argf\r
3387 db fi_ry,',' ;in r[y],(c)\r
3388a_c equ $-t_argf\r
3389 db '(C)',0 ;in (c)\r
3390a_cr equ $-t_argf\r
3391 db '(C),' ;out (c),r[y]\r
3392a_ry equ $-t_argf\r
3393 db fi_ry,0 ;inc r[y]\r
3394a_im0 equ $-t_argf\r
3395 db '0',0 ;im 0\r
3396a_im1 equ $-t_argf\r
3397 db '1',0 ;im 1\r
3398a_im2 equ $-t_argf\r
3399 db '2',0 ;im 2\r
3400a_ai equ $-t_argf\r
3401 db fi_ir,0 ;ld a,i ... r,a\r
08d0db09 3402\r
2c2c7492
L
3403; Prefix ED + 2 byte (opcode + immediate)\r
3404a_rm equ $-t_argf\r
3405 db fi_ry,',' ;in0 r[y],(n)\r
3406a_m equ $-t_argf\r
3407 db '(',fi_n,')',0 ;in0 (n)\r
3408a_mr equ $-t_argf\r
3409 db '(',fi_n,'),',fi_ry,0 ;out0 (n),r[y]\r
836f48ab 3410\r
2c2c7492
L
3411; Prefix ED + 3 byte (opcode + address)\r
3412a_mmp equ $-t_argf\r
3413 db '(',fi_nn,'),',fi_rp,0 ;ld (nn),rp\r
3414a_pmm equ $-t_argf\r
3415 db fi_rp,',(',fi_nn,')',0 ;ld rp,(nn)\r
25a690e5 3416\r
2c2c7492
L
3417; Prefix CB + 1 byte opcode\r
3418a_bcbr equ $-t_argf\r
3419 db fi_y,',' ;op y,r[z]\r
3420a_cbr equ $-t_argf\r
3421 db fi_rz_cb,0 ;op r[z]\r
3422a_noarg equ $-t_argf\r
3423 db 0\r
85b57f2a 3424\r
25a690e5 3425\r
2c2c7492
L
3426;-------------------------------------------------------------------------------\r
3427\r
3428argpf_index defl 0\r
3429\r
3430argpf macro x\r
3431fi_&x equ 80h+argpf_index\r
3432 dw p_&x\r
3433argpf_index defl argpf_index+1\r
3434 endm\r
3435\r
3436do_arg_n:\r
3437 argpf ry\r
3438 argpf rz\r
3439 argpf ccy\r
3440 argpf ccy2\r
3441 argpf rst\r
3442 argpf rp\r
3443 argpf rp2\r
3444 argpf hlixiy\r
3445 argpf n\r
3446 argpf j\r
3447 argpf nn\r
3448 argpf ir\r
3449 argpf rz_cb\r
3450 argpf y\r
3451\r
3452\r
c1ae5a7d
L
3453p_n:\r
3454 ld a,(isprefix_ixiy)\r
3455 and a\r
3456 ld a,(iy+001h)\r
3457 jr z,out_hex_0\r
3458 ld a,(iy+002h)\r
3459 jr out_hex_0\r
3460\r
3461p_rst:\r
3462 and 038h\r
3463out_hex_0:\r
3464 jp out_hex\r
3465\r
3466\r
3467p_j:\r
3468 ld c,(iy+001h)\r
3469 ld a,c\r
3470 rla\r
3471 sbc a,a\r
3472 ld b,a\r
3473 push iy\r
3474 pop hl\r
3475 add hl,bc\r
3476 inc hl\r
3477 inc hl\r
3478 jr out_hl_0\r
3479\r
3480p_nn:\r
3481 ld l,(iy+001h)\r
3482 ld h,(iy+002h)\r
3483out_hl_0:\r
3484 jp out_hl\r
3485\r
2c2c7492 3486p_ir:\r
e611c31d
L
3487 rra\r
3488 rra\r
3489 rra\r
3490 and 03\r
3491 ld hl,t_arg_IR\r
c1ae5a7d 3492 jr p_arg\r
0c4244e5 3493\r
0c4244e5 3494\r
2c2c7492
L
3495get_cb_opc:\r
3496 ld a,(isprefix_ixiy)\r
3497 and a\r
3498 ld a,(iy+001h)\r
3499 ret z\r
3500 ld a,(iy+002h)\r
3501 ret\r
25a690e5 3502\r
2c2c7492 3503p_y:\r
998c0841 3504 call get_cb_opc\r
0716e834
L
3505 rra\r
3506 rra\r
3507 rra\r
3508 and 007h\r
2c2c7492 3509 jp out_dgt\r
25a690e5 3510\r
514bb0fd 3511p_rz_cb:\r
998c0841 3512 call get_cb_opc\r
c1ae5a7d 3513 jr p_rz\r
998c0841 3514\r
514bb0fd 3515p_ry:\r
0716e834
L
3516 rra\r
3517 rra\r
3518 rra\r
514bb0fd 3519p_rz:\r
0716e834
L
3520 and 007h\r
3521 cp 006h\r
a942c6d5 3522 ld b,a\r
514bb0fd 3523 ld hl,t_arg_r\r
a942c6d5 3524 jr nz,p_arg0\r
0716e834
L
3525 ld a,(isprefix_ixiy)\r
3526 and a\r
a942c6d5
L
3527 jr z,p_arg0\r
3528 ld hl,t_lp_IXIY\r
0716e834 3529 dec a\r
a942c6d5 3530 call p_arg\r
0716e834 3531 ld a,(iy+001h)\r
836f48ab
L
3532 push af\r
3533 rlca\r
3534 ld a,'+'\r
3535 jr nc,l1e61h\r
3536 pop af\r
0716e834 3537 neg\r
836f48ab
L
3538 push af\r
3539 ld a,'-'\r
3540l1e61h:\r
3541 call outchar\r
3542 pop af\r
2c2c7492
L
3543 call out_hex\r
3544 ld a,')'\r
3545 jp outchar\r
7c2469ef 3546\r
514bb0fd 3547p_rp2:\r
514bb0fd 3548 ld hl,t_arg_rp2\r
c1ae5a7d 3549 db 0ddh ;swallow t_arg_rp in ix\r
514bb0fd 3550p_rp:\r
514bb0fd 3551 ld hl,t_arg_rp\r
0716e834
L
3552 rra\r
3553 rra\r
3554 rra\r
3555 rra\r
3556 and 003h\r
3557 cp 002h\r
2c2c7492
L
3558 jr nz,p_arg\r
3559p_hlixiy:\r
3560 ld a,(isprefix_ixiy)\r
3561 ld hl,t_HL.IX.IY\r
0716e834 3562 jr p_arg\r
646e8b05 3563\r
2c2c7492 3564p_ccy2:\r
2c2c7492 3565 and 018h\r
2c2c7492 3566p_ccy:\r
0716e834
L
3567 rra\r
3568 rra\r
3569 rra\r
3570 and 007h\r
514bb0fd 3571 ld hl,t_arg_cc\r
25a690e5 3572p_arg:\r
0716e834 3573 ld b,a\r
a942c6d5 3574p_arg0:\r
c1ae5a7d 3575 ;fall thru\r
2c2c7492 3576\r
c1ae5a7d 3577pstr_sel:\r
8c416d5a 3578 call str_sel\r
c1ae5a7d
L
3579 ;fall thru\r
3580pstr:\r
3581 ld a,(hl)\r
2c2c7492 3582 inc hl\r
c1ae5a7d
L
3583 and a\r
3584 ret z\r
3585 call outchar\r
3586 ret m\r
3587 jr pstr\r
2c2c7492 3588\r
c1ae5a7d
L
3589pstr_inl:\r
3590 ex (sp),hl\r
3591 call pstr\r
3592 ex (sp),hl\r
3593 ret\r
7c2469ef 3594\r
9711a430
L
3595;-------------------------------------------------------------------------------\r
3596\r
3b18d7ae 3597opc macro x\r
a370992b 3598\r
3b18d7ae 3599i_&x equ opc_index\r
0f82c444 3600;o_&x equ $-opc_tabstart\r
3b18d7ae
L
3601 dc '&x'\r
3602opc_index defl opc_index+1\r
a370992b
L
3603 endm\r
3604\r
0c4244e5 3605t_MNEMONICS:\r
0f82c444 3606;opc_tabstart defl $\r
a370992b 3607opc_index defl 0\r
7c2469ef
L
3608; 1-byte other\r
3609 opc NOP\r
8c416d5a 3610 opc LD\r
7c2469ef 3611 opc INC\r
3b18d7ae 3612 opc DEC\r
3b18d7ae 3613 opc DJNZ\r
3b18d7ae 3614 opc JR\r
7c2469ef
L
3615 opc HALT\r
3616\r
3617 opc RLCA\r
3618 opc RRCA\r
3619 opc RLA\r
3620 opc RRA\r
3621 opc DAA\r
3622 opc CPL\r
3623 opc SCF\r
3624 opc CCF\r
3625\r
3626; 1-byte "alu"\r
3627 opc ADD\r
3628 opc ADC\r
3629 opc SUB\r
3630 opc SBC\r
3631 opc AND\r
8c416d5a
L
3632 opc XOR\r
3633 opc OR\r
7c2469ef
L
3634 opc CP\r
3635\r
3636 opc RET\r
3b18d7ae 3637 opc POP\r
7c2469ef
L
3638 opc JP\r
3639 opc CALL\r
3b18d7ae 3640 opc PUSH\r
7c2469ef
L
3641 opc RST\r
3642 opc OUT\r
3643 opc EXX\r
3644 opc IN\r
3645 opc EX\r
8c416d5a 3646 opc DI\r
7c2469ef
L
3647 opc EI\r
3648; CB\r
3b18d7ae 3649 opc RLC\r
3b18d7ae 3650 opc RRC\r
8c416d5a 3651 opc RL\r
7c2469ef 3652 opc RR\r
3b18d7ae
L
3653 opc SLA\r
3654 opc SRA\r
8c416d5a
L
3655 opc SLL\r
3656 opc SRL\r
7c2469ef
L
3657 opc BIT\r
3658 opc RES\r
3659 opc SET\r
3660\r
3661; ED\r
3662 opc NEG\r
3663 opc RETN\r
3664 opc RETI\r
8c416d5a 3665 opc IM\r
7c2469ef 3666 opc RRD\r
8c416d5a 3667 opc RLD\r
7c2469ef 3668\r
0f82c444 3669; Block instructions\r
8c416d5a 3670 opc LDI\r
7c2469ef
L
3671 opc CPI\r
3672 opc INI\r
3673 opc OUTI\r
3674 opc LDD\r
3675 opc CPD\r
3676 opc IND\r
3677 opc OUTD\r
3678 opc LDIR\r
3679 opc CPIR\r
3680 opc INIR\r
3681 opc OTIR\r
3682 opc LDDR\r
3683 opc CPDR\r
3684 opc INDR\r
3685 opc OTDR\r
3686\r
0f82c444 3687; Z180\r
3b18d7ae 3688 opc IN0\r
3b18d7ae 3689 opc OUT0\r
3b18d7ae 3690 opc TST\r
7c2469ef 3691 opc MLT\r
3b18d7ae 3692 opc TSTIO\r
7c2469ef 3693 opc SLP\r
8c416d5a 3694 opc OTIM\r
7c2469ef
L
3695 opc OTDM\r
3696 opc OTIMR\r
3697 opc OTDMR\r
3698\r
0c4244e5
L
3699 DB 0\r
3700\r
514bb0fd 3701t_arg_r:\r
0c4244e5
L
3702 DC 'B'\r
3703 DC 'C'\r
3704 DC 'D'\r
3705 DC 'E'\r
3706 DC 'H'\r
3707 DC 'L'\r
3708 DC '(HL)'\r
3709 DC 'A'\r
3710 DB 0\r
514bb0fd 3711t_arg_rp:\r
0c4244e5
L
3712 DC 'BC'\r
3713 DC 'DE'\r
3714 DC 'HL'\r
3715 DC 'SP'\r
3716 DB 0\r
514bb0fd 3717t_arg_rp2:\r
0c4244e5
L
3718 DC 'BC'\r
3719 DC 'DE'\r
0c4244e5
L
3720 DC 'HL'\r
3721 DC 'AF'\r
3722 DB 0\r
0c4244e5
L
3723t_HL.IX.IY:\r
3724 DC 'HL'\r
0c4244e5
L
3725 DC 'IX'\r
3726 DC 'IY'\r
3727 DB 0\r
514bb0fd 3728t_arg_cc:\r
0c4244e5
L
3729 DC 'NZ'\r
3730 DC 'Z'\r
3731 DC 'NC'\r
3732 DC 'C'\r
3733 DC 'PO'\r
3734 DC 'PE'\r
3735 DC 'P'\r
3736 DC 'M'\r
0c4244e5 3737 DB 0\r
8320b8eb 3738\r
2c2c7492
L
3739t_lp_IXIY:\r
3740 DC '(IX'\r
3741 DC '(IY'\r
8320b8eb 3742\r
2c2c7492
L
3743t_arg_IR:\r
3744 DC 'I,A'\r
3745 DC 'R,A'\r
3746 DC 'A,I'\r
3747 DC 'A,R'\r
3748 db 0\r
514bb0fd 3749\r
8320b8eb 3750\r
8320b8eb 3751;-------------------------------------------------------------------------------\r
9711a430 3752\r
4a39ae18 3753tc_set_bp:\r
ac35765e 3754 ld hl,(reg.pc)\r
0716e834
L
3755 ld a,h\r
3756 or l\r
3757 jr z,l2037h\r
3758 ld de,BDOS\r
3759 and a\r
3760 sbc hl,de\r
d2df51e3 3761 ld hl,l20edh ;set break after BDOS call\r
0716e834 3762 jr z,l2031h\r
ac35765e 3763 ld iy,(reg.pc)\r
0716e834
L
3764 call disas_get_instrlen\r
3765 jp nc,ERROR\r
3766 ld c,b\r
85b57f2a 3767 ld b,0\r
ac35765e 3768 ld hl,(reg.pc)\r
0716e834 3769 add hl,bc\r
4bb547a7 3770 call bp_trace_enter\r
ac35765e 3771 ld iy,(reg.pc)\r
e611c31d 3772 ld hl,t_op_branch\r
2c2c7492 3773 call lookup_branch_op\r
0716e834
L
3774 ccf\r
3775 ret c\r
3776 ex de,hl\r
0c4244e5 3777l2031h:\r
0716e834 3778 call CALL_HL\r
4bb547a7 3779 call c,bp_trace_enter\r
0c4244e5 3780l2037h:\r
0716e834
L
3781 scf\r
3782 ret\r
0c4244e5 3783\r
9711a430
L
3784;-------------------------------------------------------------------------------\r
3785\r
e611c31d 3786t_op_branch:\r
2c2c7492 3787 db 0ffh,0ddh ;Prefix DD\r
b0b4005c 3788 dw l20a7h\r
2c2c7492 3789 db 0ffh,0fdh ;Prefix FD\r
b0b4005c 3790 dw l20ach\r
2c2c7492 3791 db 0ffh,0edh ;Prefix ED\r
b0b4005c 3792 dw l20b8h\r
0f82c444 3793\r
2c2c7492 3794 db 0ffh,0cdh ;call mn\r
b0b4005c 3795 dw l2080h\r
2c2c7492 3796 db 0ffh,0c3h ;jp mn\r
b0b4005c 3797 dw l208bh\r
2c2c7492 3798 db 0ffh,0e9h ;jp ()\r
b0b4005c 3799 dw l20a2h\r
2c2c7492 3800 db 0ffh,0c9h ;ret\r
b0b4005c 3801 dw l20dch\r
2c2c7492 3802 db 0ffh,0cfh ;rst 8\r
b0b4005c 3803 dw l2115h\r
2c2c7492 3804 db 0c7h,0c7h ;rst n\r
b0b4005c 3805 dw l20f9h\r
2c2c7492 3806 db 0c7h,0c4h ;call cc,mn\r
b0b4005c 3807 dw l2080h\r
2c2c7492 3808 db 0f7h,010h ;djnz d; jr d\r
b0b4005c 3809 dw l2093h\r
2c2c7492 3810 db 0e7h,020h ;jr cc,d\r
b0b4005c 3811 dw l2093h\r
2c2c7492 3812 db 0c7h,0c2h ;jp cc,mn\r
b0b4005c 3813 dw l208bh\r
2c2c7492 3814 db 0c7h,0c0h ;ret cc\r
b0b4005c
L
3815 dw l20c5h\r
3816 db 0\r
0c4244e5 3817\r
9711a430 3818;-------------------------------------------------------------------------------\r
4a39ae18 3819; call mn call cc,mn\r
0c4244e5 3820l2080h:\r
4a39ae18
L
3821\r
3822; jp mn jp cc,mn\r
0c4244e5 3823l208bh:\r
0716e834
L
3824 ld l,(iy+001h)\r
3825 ld h,(iy+002h)\r
3826 scf\r
3827 ret\r
4a39ae18 3828\r
0c4244e5 3829l2093h:\r
0716e834
L
3830 ld c,(iy+001h)\r
3831 ld a,c\r
3832 rla\r
3833 sbc a,a\r
3834 ld b,a\r
ac35765e 3835 ld hl,(reg.pc)\r
0716e834
L
3836 add hl,bc\r
3837 inc hl\r
3838 inc hl\r
3839 scf\r
3840 ret\r
4a39ae18
L
3841\r
3842; jp (hl)\r
0c4244e5 3843l20a2h:\r
0716e834
L
3844 ld hl,(reg.l)\r
3845 scf\r
3846 ret\r
4a39ae18
L
3847\r
3848; Prefix DD\r
0c4244e5 3849l20a7h:\r
0716e834
L
3850 ld hl,(reg.ix)\r
3851 jr l20afh\r
4a39ae18 3852; Prefix FD\r
0c4244e5 3853l20ach:\r
0716e834 3854 ld hl,(reg.iy)\r
0c4244e5 3855l20afh:\r
0716e834 3856 ld a,(iy+001h)\r
4a39ae18 3857 cp 0e9h ; jp (ix); jp (iy)\r
0716e834
L
3858 scf\r
3859 ret z\r
3860 and a\r
3861 ret\r
4a39ae18
L
3862\r
3863; Prefix ED\r
0c4244e5 3864l20b8h:\r
0716e834 3865 ld a,(iy+001h)\r
4a39ae18 3866 cp 04dh ; reti\r
0716e834 3867 jr z,l20dch\r
4a39ae18 3868 cp 045h ; retn\r
0716e834
L
3869 jr z,l20dch\r
3870 and a\r
3871 ret\r
0c4244e5 3872l20c5h:\r
0716e834
L
3873 ld a,(iy+000h)\r
3874 ld (l20d7h),a\r
3875 ld hl,(reg.f)\r
3876 push hl\r
3877 pop af\r
3878 call l20d7h\r
3879 scf\r
3880 jr c,l20dch\r
3881 ret\r
0c4244e5 3882l20d7h:\r
0716e834
L
3883 nop\r
3884 and a\r
3885 pop hl\r
3886 inc hl\r
3887 jp (hl)\r
0c4244e5
L
3888\r
3889l20dch:\r
0c4244e5 3890l20edh:\r
d2df51e3 3891 ld hl,(reg_sp) ;break on return address\r
0716e834
L
3892 ld e,(hl)\r
3893 inc hl\r
3894 ld d,(hl)\r
3895 ex de,hl\r
4bb547a7 3896 call bp_trace_enter\r
4a39ae18 3897l2115h:\r
0716e834
L
3898 and a\r
3899 ret\r
0c4244e5
L
3900\r
3901l20f9h:\r
0716e834
L
3902 ld a,(l0003h)\r
3903 cp (iy+000h)\r
3904 ret z\r
3905 ld a,(iy+000h)\r
3906 and 038h\r
3907 ld l,a\r
3908 ld h,000h\r
3909 ld a,(b_21e2_start)\r
3910 and a\r
3628b074 3911 ret z\r
0716e834
L
3912 scf\r
3913 ret\r
9711a430
L
3914\r
3915;-------------------------------------------------------------------------------\r
3916; >>C[N][J] [steps]\r
3917; >>C[N][J] W expression\r
3918; >>C[N][J] U expression\r
3919; trace over Calls [No list] [Jumps only] /.While./.Until.\r
3920\r
9711a430
L
3921\r
3922;-------------------------------------------------------------------------------\r
3923; >>T[N][J] [steps]\r
3924; >>T[N][J] W expression\r
3925; >>T[N][J] U expression\r
3926; Trace [no List] [Jumps only] / .While. / .Until.\r
3927\r
0c4244e5 3928cmd_T:\r
0716e834 3929 ld (cmd_rpt),hl\r
4a39ae18 3930 ld hl,1 ;default: 1 step\r
0716e834 3931 call get_lastarg_def\r
4a39ae18 3932 ld (trace_cnt_or_ptr),hl\r
0716e834 3933 sub a\r
4bb547a7 3934 ld (bp_p_cpu_flag),a\r
4a39ae18
L
3935 call tc_set_bp\r
3936 jr user_go1\r
0c4244e5
L
3937\r
3938l2151h:\r
0716e834 3939 call bp_clr_temporary\r
4a39ae18 3940 ld hl,(trace_cnt_or_ptr)\r
0716e834 3941 dec hl\r
4a39ae18 3942 ld (trace_cnt_or_ptr),hl\r
0716e834
L
3943 ld a,h\r
3944 or l\r
3628b074
L
3945 jp z,do_break\r
3946\r
4a39ae18 3947 call tc_set_bp\r
3628b074
L
3948 jp nc,do_break\r
3949 sbc a,a\r
4bb547a7 3950 ld (bp_p_cpu_flag),a\r
4a39ae18 3951user_go1:\r
0716e834 3952 jp user_go\r
0c4244e5 3953\r
9711a430
L
3954;-------------------------------------------------------------------------------\r
3955\r
4bb547a7
L
3956con_col:\r
3957 db 0\r
3958\r
3959;-------------------------------------------------------------------------------\r
3960\r
0c4244e5 3961b_21e2_start:\r
9bed91b3 3962 db 0\r
4a39ae18 3963trace_cnt_or_ptr:\r
9bed91b3 3964 dw 0\r
9bed91b3 3965\r
4bb547a7 3966bp_p_cpu_flag:\r
9bed91b3
L
3967 db 0\r
3968\r
3969bp_tab:\r
3970 rept BP_CNT\r
3971 rept BP_SIZE\r
3972 db 0\r
3973 endm\r
3974 endm\r
3975\r
9711a430
L
3976;-------------------------------------------------------------------------------\r
3977\r
9bed91b3
L
3978last_S:\r
3979 dw TPA\r
3980\r
3981last_I:\r
3982 dw 0\r
3983\r
3984last_O_addr:\r
3985 dw 0\r
3986last_O_val:\r
3987 db 0\r
3988\r
9bed91b3
L
3989last_D:\r
3990 dw TPA\r
3991\r
9bed91b3
L
3992high_load:\r
3993 dw TPA\r
3994max_load:\r
3995 dw TPA\r
3996\r
9bed91b3
L
3997isprefix_ixiy:\r
3998 db 0\r
3999last_L:\r
4000 dw TPA\r
0c4244e5 4001\r
1bfdbe14 4002pbl_loop_adr:\r
51e6b03c 4003 dw 0addeh\r
1bfdbe14 4004\r
0f361185
L
4005;-------------------------------------------------------------------------------\r
4006\r
4007conbuf::\r
4008 ds CONBUF_SIZE+1\r
4009\r
4010;-------------------------------------------------------------------------------\r
4011\r
4012 rept (STACK_SIZE+3)/4\r
4013 db 0deh,0adh,0beh,0efh\r
4014 endm\r
4015stack::\r
4016reg.l2: db 000h\r
4017reg.h2: db 000h\r
4018reg.e2: db 000h\r
4019reg.d2: db 000h\r
4020reg.c2: db 000h\r
4021reg.b2: db 000h\r
4022reg.f2: db 000h\r
4023reg.a2: db 000h\r
4024 db 000h\r
4025reg.i: db 000h\r
4026reg.iy: dw 0000h\r
4027reg.ix: dw 0000h\r
4028reg.f: db 000h\r
4029reg.a: db 000h\r
4030reg.c: db 000h\r
4031reg.b: db 000h\r
4032reg.e: db 000h\r
4033reg.d: db 000h\r
4034reg.l: db 000h\r
4035reg.h: db 000h\r
4036reg_sp: dw TPA\r
4037reg.iff:\r
4038 db 0f3h\r
4039 db 0c3h\r
4040reg.pc: dw TPA\r
4041\r
4042cmd_rpt:dw mainloop\r
4043\r
4044;-------------------------------------------------------------------------------\r
4045\r
0c4244e5 4046ddtz_size equ $-ddtz_base\r
0f361185
L
4047prog_size equ $-start\r
4048ddtz_end::\r
0c4244e5
L
4049\r
4050;-------------------------------------------------------------------------------\r
0c4244e5
L
4051\r
4052 end\r