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