Files
Z8C-Homebrew-Computer/OperatingSystem/monitor_v2/zout/main.lst
Dennis Gunia d4af826223 restructure
2023-12-26 01:11:55 +01:00

3386 lines
144 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
1: - 4000 SYS_RAM_START equ 0x4000
2: - 4010 SYS_BUF_START equ 0x4010
3: - 4110 PRG_RAM_START equ 0x4110
4: - FF00 PRG_RAM_TOP equ 0xFF00
5: - FFFF STACK_RAM_TOP equ 0xFFFF
6:
7: ;VAR_CONSOLE_CONF equ 0x07 ;CLK/TRG Clock @ 1843220.5/s
8: - 000F VAR_CONSOLE_CONF equ 0x0F ;CPU/16 Clock @ 230402.5625/s
9:
10: - 0018 VAR_CONSOLE_BAUD equ 24 ;BAUD timer constant
11: ;CLK/TRG Clock @ 1843220.5/s
12: ; -> 0x16 : 14400
13: ;CPU/16 Clock @ 230402.5625/s
14: ; -> 12 : 19200
15: ; -> 24 : 9600
16:
17: ; include IO device addresses
18: .include "addresses.s"
**** include/addresses.s ****
1: - 0000 CS_BANK equ 0000000b
2: - 0001 CS_DIP equ 0000001b
3: - 0004 CS_CTC_0 equ 0000100b
4: - 0005 CS_CTC_1 equ 0000101b
5: - 0006 CS_CTC_2 equ 0000110b
6: - 0007 CS_CTC_3 equ 0000111b
7: - 0008 CS_SIO_A_D equ 0001000b
8: - 0009 CS_SIO_A_C equ 0001001b
9: - 000A CS_SIO_B_D equ 0001010b
10: - 000B CS_SIO_B_C equ 0001011b
11:
12: - 0020 IO_RTC_SEC0 equ 00100000b
13: - 0021 IO_RTC_SEC1 equ 00100001b
14: - 0022 IO_RTC_MIN0 equ 00100010b
15: - 0023 IO_RTC_MIN1 equ 00100011b
16: - 0024 IO_RTC_HOUR equ 00100100b
17: - 0025 IO_RTC_AMPM equ 00100101b
18: - 0026 IO_RTC_DAY0 equ 00100110b
19: - 0027 IO_RTC_DAY1 equ 00100111b
20: - 0028 IO_RTC_MON0 equ 00101000b
21: - 0029 IO_RTC_MON1 equ 00101001b
22: - 002A IO_RTC_YERR0 equ 00101010b
23: - 002B IO_RTC_YEAR1 equ 00101011b
24: - 002C IO_RTC_WEEK equ 00101100b
25: - 002D IO_RTC_CTR_D equ 00101101b
26: - 002E IO_RTC_CTR_E equ 00101110b
27: - 002F IO_RTC_CTR_F equ 00101111b
28:
29: - 0040 IO_AY0_ADDR equ 01000000b ;64
30: - 0041 IO_AY0_DATA equ 01000001b ;65
31: - 0042 IO_AY1_ADDR equ 01000010b ;66
32: - 0043 IO_AY1_DATA equ 01000011b ;67
33:
34: - 0000 START_ROM equ 0x0000
35: - 0020 IO_REG0 equ 0x20
36:
37: - 0081 VDP_REG equ 0x81
38: - 0080 VDP_MEM equ 0x80
39:
40: - 0100 PROG_ROM_START equ 0x0100
41: - 4000 PROG_MEM_START equ 04000h
42:
43:
44: - 00F5 CS_PIO_BD .EQU 0xF5
45: - 00F7 CS_PIO_BC .EQU 0xF7
46: - 00F4 CS_PIO_AD .EQU 0xF4
47: - 00F6 CS_PIO_AC .EQU 0xF6
**** main.asm ****
19:
20: - 0000 org 0x0000
21: - 0000 RST_00: ;Hardware Restart
22: 0+10 0000 31FFFF ld sp, STACK_RAM_TOP
23: 10+4 0003 F3 di
24: 14+10 0004 C35000 jp mon_start_init_sound
25:
26: - 0008 org 0x0008
27: - 0008 RST_08 ;Print Char
28: 24+10 0008 C3C40E jp EXEC_RST_08
29:
30: - 0010 org 0x0010
31: - 0010 RST_10 ;receive char
32: 34+10 0010 C3C80E jp EXEC_RST_10
33:
34: - 0018 org 0x0018
35: - 0018 RST_18 ;Buffer length
36: 44+10 0018 C3D40E jp EXEC_RST_18
37:
38:
39: - 001B INT_VEC:
40: - 0044 org 0x0044
41: ;DEFW EXEC_INT_VDP
42:
43: ;memory var template
44: - 0044 mon_var_template:
45: - 4000 phase SYS_RAM_START
46:
47: - 4000 var_buffer_len:
48: - 4000 00 defb 0
49: - 4001 var_last_char:
50: - 4001 00 defb 0
51: - 4002 var_curserx:
52: - 4002 00 defb 0
53: - 4003 var_cursery:
54: - 4003 00 defb 0
55: - 4004 var_curserstate:
56: - 4004 00 defb 0
57: - 4005 var_curseron:
58: - 4005 00 defb 0
59: - 4006 var_curserchar:
60: - 4006 00 defb 0
61: - 4007 var_curserlastaddr:
62: - 4007 0000 defw 0
63: - 4009 var_scratch:
64: - 4009 ..4018 00 defs 16 ;16 bytes space for scratch vars
65: - 4019 var_ps2mem:
66: - 4019 ..4028 00 defs 16 ;16 bytes space for scratch vars
67: - 4029 var_buffer:
68: - 4029 00 defb 0 ;var lentgh
69:
70: - 006E dephase
71: - 006E mon_var_template_end:
72: 54+4 006E 00 nop
73: ;end memory var template
74: - 0050 org 0x0050
75: - 0050 mon_start_init_sound:
76: ;CALL BTLDR_ENTRY ;call bootloader first
77: ;ld D,0x08 ; Select register #8
78: ;ld A,0x00 ; Volume channel A 0
79: ;call AY0_WRITE_REG
80: ;ld D,0x09 ; Select register #9
81: ;ld A,0x00 ; Volume channel B 0
82: ;call AY0_WRITE_REG
83: ;ld D,0x0A ; Select register #10
84: ;ld A,0x00 ; Volume channel C 0
85: ;call AY0_WRITE_REG
86:
87: - 0050 mon_start_init_ctc:
88:
89: ; Set CTC Ch2 Interrupt Vector
90: ;LD A,40h ; it vector defined in bit 7­3,bit 2­1 don't care, bit 0 = 0
91: ;OUT (IO_CTC0_C0),A
92: ; Init CTC Channel 2
93: ;LD A,10100111b
94: ;OUT (IO_CTC0_C2),A
95: ;LD A,0x34 ; 55Hz ISR
96: ;LD A,0xFF ; 55Hz ISR
97: ;OUT (IO_CTC0_C2),A
98:
99: ;INIT PIO
100: 58+7 0050 3ECF LD A,0xCF
101: 65+11 0052 D3F6 OUT (CS_PIO_AC), A
102: 76+7 0054 3EF5 LD A,11110101b
103: 83+11 0056 D3F6 OUT (CS_PIO_AC), A
104:
105:
106: 94+4 0058 AF xor a
107: ;ld i, a
108: ;im 2 ;set int mode 2
109:
110: 98+13 0059 320440 ld (var_curserstate),a
111: 111+13 005C 320540 ld (var_curseron),a
112: 124+7 005F 3E20 ld a, " "
113: 131+13 0061 320640 ld (var_curserchar),a
114:
115:
116:
117:
118: ;ei ; Enable Interrupts
119:
120: ;jr mon_start_ram ;skip serial, cause not used atm
121: - 0064 mon_start_init_serial:
122: 144+17 0064 CD7E02 call CONSOLE_INIT
123: ;jp mon_start_complete
124:
125: - 0067 mon_start_ram:
126: 161+10 0067 214400 ld hl,mon_var_template
127: 171+10 006A 116E00 ld de,mon_var_template_end
128: 181+10 006D 010040 ld bc,SYS_RAM_START
129: - 0070 mon_start_ram_loop:
130: 191+7 0070 7E ld a,(hl) ;copy values
131: 198+7 0071 02 ld (bc),a
132: 205+6 0072 23 inc hl
133: 211+6 0073 03 inc bc
134: 217+11 0074 E5 push hl ;check if end is reached
135: 228+15 0075 ED52 sbc hl,de
136: 243+10 0077 E1 pop hl
137: 253+10 0078 C27000 jp nz, mon_start_ram_loop
138: ;template copy done
139:
140: - 007B mon_start_complete:
141:
142: ;call keyboard_init_io
143: ;call vdpconsole_init
144:
145: ;call print_str
146:
147:
148: ;jp splash_run
149:
150: ;jp ps2demo_run
151: ;call debug_init
152: ;call vdp_cursor_on
153: ;jp COLD
154:
155: 263+17 007B CDCA02 call print_clear
156: 280+10 007E 216013 ld hl, [STR_Banner_Start]
157: 290+17 0081 CDBF02 call print_str
158:
159: 307+17 0084 CDF411 call ideif_init_drive
160:
161: 324+10 0087 114000 LD DE,0x40
162: 334+17 008A CDD70E CALL beep
163:
164: ;call vdp_cursor_on
165: 351+17 008D CD9900 call PROMPT_BEGIN
166:
167: ;halt CPU if prompt exits
168: 368+4 0090 76 halt
169:
170: ; Misc Functions
171: - 0091 AY0_WRITE_REG:
172: 372+4 0091 47 LD B,A
173: 376+4 0092 7A LD A,D
174: 380+11 0093 D340 OUT (IO_AY0_ADDR),A
175: 391+4 0095 78 LD A,B
176: 395+11 0096 D341 OUT (IO_AY0_DATA),A
177: 406+10 0098 C9 RET
178:
179: - 0099 PROMPT_BEGIN:
180: 416+17 0099 CDD102 call print_newLine
181: ;call A_RTS_ON
182: 433+7 009C 3E3E ld a,'>'
183: 440+17 009E CDB702 call print_char
184: 457+4 00A1 AF xor a ;reset buffer len
185: 461+13 00A2 320040 ld (var_buffer_len),a
186:
187: - 00A5 PROMPT_BEGIN_READ_LOOP:
188: 474+17 00A5 CDF802 call read_char
189: ;call keybd_read_ascii
190: 491+10 00A8 CAA500 jp z, PROMPT_BEGIN_READ_LOOP ; wait until char avail
191: 501+11 00AB F5 push af
192: 512+10 00AC F1 pop af
193: ; process special ops
194: 522+7 00AD FE0D cp 13 ; enter
195: 529+10 00AF CAFC00 jp z,PROMPT_BEGIN_READ_PROCESS
196: 539+7 00B2 FE0A cp 10
197: 546+10 00B4 CAA500 jp z, PROMPT_BEGIN_READ_LOOP; skip LF for file load
198: 556+7 00B7 FE08 cp 0x08 ; backspace 0x08 VT102 0x7f Putty
199: 563+10 00B9 CAD600 jp z,PROMPT_BEGIN_READ_BACKSPACE
200:
201: 573+11 00BC F5 push af
202: ; a contains latest char
203: 584+10 00BD 212940 ld hl,[var_buffer]
204: 594+7 00C0 1600 ld d,0
205: 601+13 00C2 3A0040 ld a,(var_buffer_len)
206: 614+4 00C5 5F ld e,a
207: 618+11 00C6 19 add hl,de ;hl now contains pointer to last position in buffer
208: 629+4 00C7 3C inc a
209: 633+13 00C8 320040 ld (var_buffer_len),a ;store incremented buffer length
210:
211: 646+10 00CB F1 pop af
212: 656+7 00CC 77 ld (hl),a
213: 663+17 00CD CDB702 call print_char
214: 680+6 00D0 23 inc hl
215: 686+4 00D1 AF xor a ;a = 0
216: 690+7 00D2 77 ld (hl),a ;always add null termination after last char
217: 697+10 00D3 C3A500 jp PROMPT_BEGIN_READ_LOOP
218:
219: - 00D6 PROMPT_BEGIN_READ_BACKSPACE:
220: 707+13 00D6 3A0040 ld a,(var_buffer_len)
221: 720+4 00D9 A7 and a
222: 724+10 00DA CAA500 jp z, PROMPT_BEGIN_READ_LOOP ; do not continue if already at char 0
223: 734+4 00DD 3D dec a ;decrement length
224: 738+13 00DE 320040 ld (var_buffer_len),a ;and store it
225: 751+4 00E1 5F ld e,a ;load de with decremented value
226: 755+7 00E2 1600 ld d,0
227: 762+10 00E4 212940 ld hl,[var_buffer]
228: 772+11 00E7 19 add hl,de ;hl now contains pointer to last position in buffer
229: 783+4 00E8 AF xor a ; store null byte to current location
230: 787+7 00E9 77 ld (hl),a
231: ;call print_delete
232: 794+7 00EA 3E08 ld a, 0x08
233: 801+17 00EC CDB702 call print_char
234: 818+7 00EF 3E20 ld a, 0x20
235: 825+17 00F1 CDB702 call print_char
236: 842+7 00F4 3E08 ld a, 0x08
237: 849+17 00F6 CDB702 call print_char
238: 866+10 00F9 C3A500 jp PROMPT_BEGIN_READ_LOOP
239:
240: - 00FC PROMPT_BEGIN_READ_PROCESS:
241: ;call print_newLine
242: ;ld hl,var_buffer
243: ;call print_str
244:
245: 876+13 00FC 3A2940 ld a,([var_buffer])
246: 889+7 00FF FE24 cp '$' ;jump to addr
247: 896+10 0101 CA2F01 jp z, CMD_EXEC
248: 906+7 0104 FE3F cp '?' ;print hexdump
249: 913+10 0106 CA4E01 jp z, CMD_VIEW
250: 923+7 0109 FE21 cp '!' ;set memory
251: 930+10 010B CAB801 jp z, CMD_SET
252: 940+7 010E FE69 cp 'i' ;in IO
253: 947+10 0110 CA1D02 jp z, CMD_IO_READ
254: 957+7 0113 FE6F cp 'o' ;out IO
255: 964+10 0115 CAF401 jp z, CMD_IO_WRITE
256: 974+7 0118 FE64 cp 'd' ;disassemble
257: 981+10 011A CA3902 jp z, CMD_DASM
258: 991+7 011D FE78 cp 'x' ;start xmodem
259: 998+10 011F CA060F jp z, xmodem_init
260:
261:
262: 1008+17 0122 CDD102 call print_newLine
263: 1025+10 0125 218B13 ld hl, [STR_Unknown]
264: 1035+17 0128 CDBF02 call print_str
265: 1052+10 012B C39900 jp PROMPT_BEGIN
266:
267: 1062+10 012E C9 ret
268:
269: - 012F CMD_EXEC:
270: 1072+4 012F AF xor a ;write null byte to buffer pos 0 to prevent reexecute the last command
271: 1076+13 0130 322940 ld (var_buffer),a
272:
273: 1089+10 0133 212A40 ld hl,var_buffer+1 ;load 1st byte
274: 1099+17 0136 CD2403 call DHEX_TO_BYTE
275: 1116+4 0139 47 ld b,a ;store result in b
276: 1120+4 013A 7B ld a,e ;check for error
277: 1124+4 013B A7 and a
278: 1128+10 013C C27202 jp nz, CMD_SYNTAX_ERROR
279:
280: 1138+10 013F 212C40 ld hl,var_buffer+3 ;load 2nd byte
281: 1148+17 0142 CD2403 call DHEX_TO_BYTE
282: 1165+4 0145 4F ld c,a
283: 1169+4 0146 7B ld a,e ;check for error
284: 1173+4 0147 A7 and a
285: 1177+10 0148 C27202 jp nz, CMD_SYNTAX_ERROR
286:
287: 1187+4 014B 60 ld h,b
288: 1191+4 014C 69 ld l,c
289: 1195+4 014D E9 jp (hl)
290:
291: - 014E CMD_VIEW:
292: 1199+17 014E CDD102 call print_newLine
293: 1216+10 0151 212A40 ld hl,var_buffer+1 ;load 1st byte
294: 1226+17 0154 CD2403 call DHEX_TO_BYTE
295: 1243+4 0157 47 ld b,a ;store result in b
296: 1247+4 0158 7B ld a,e ;check for error
297: 1251+4 0159 A7 and a
298: 1255+10 015A C27202 jp nz, CMD_SYNTAX_ERROR
299:
300: 1265+10 015D 212C40 ld hl,var_buffer+3 ;load 2nd byte
301: 1275+17 0160 CD2403 call DHEX_TO_BYTE
302: 1292+4 0163 4F ld c,a
303: 1296+4 0164 7B ld a,e ;check for error
304: 1300+4 0165 A7 and a
305: 1304+10 0166 C27202 jp nz, CMD_SYNTAX_ERROR
306:
307:
308: 1314+13 0169 3A2E40 ld a,(var_buffer+5)
309: 1327+7 016C FE20 cp ' '
310: 1334+10 016E C27202 jp nz, CMD_SYNTAX_ERROR
311:
312: 1344+10 0171 212F40 ld hl,var_buffer+6 ;load length
313: 1354+17 0174 CD2403 call DHEX_TO_BYTE
314: 1371+11 0177 F5 push af
315: 1382+4 0178 7B ld a,e ;check for error
316: 1386+4 0179 A7 and a
317: 1390+10 017A C27202 jp nz, CMD_SYNTAX_ERROR
318:
319: ;draw header
320: 1400+10 017D 219013 ld hl,[STR_HEXDUMP_HEADER]
321: 1410+17 0180 CDBF02 call print_str
322:
323: 1427+10 0183 F1 pop af
324: ;loading vars done. display results
325: 1437+4 0184 60 ld h, b ;pointer to current byte
326: 1441+4 0185 69 ld l, c ;pointer to current byte
327: 1445+4 0186 47 ld b, a ;bytes counter
328:
329: ;draw row
330: - 0187 CMD_VIEW_ROW:
331: 1449+17 0187 CDD102 call print_newLine
332: 1466+4 018A 7C ld a,h ;print start
333: 1470+17 018B CDE702 call print_a_hex
334: 1487+4 018E 7D ld a,l
335: 1491+17 018F CDE702 call print_a_hex
336: 1508+7 0192 3E20 ld a, ' '
337: 1515+17 0194 CDB702 call print_char
338: 1532+7 0197 0E10 ld c, 16 ;column counter
339: - 0199 CMD_VIEW_ROW_LOOP:
340: 1539+7 0199 7E ld a,(hl)
341: 1546+17 019A CDE702 call print_a_hex
342:
343: 1563+6 019D 23 inc hl ;increment pointer
344: 1569+4 019E 05 dec b ;decrement byte counter
345: 1573+4 019F 0D dec c ;decrement column counter
346:
347: 1577+4 01A0 78 ld a,b
348: 1581+4 01A1 A7 and a
349: 1585+10 01A2 CAB201 jp z,CMD_VIEW_END ;if byte counter = 0 -> end reached
350:
351: 1595+4 01A5 79 ld a,c
352: 1599+4 01A6 A7 and a
353: 1603+10 01A7 CA8701 jp z,CMD_VIEW_ROW ;else if column counter = 0 -> 16 chars printed. next row
354:
355: 1613+7 01AA 3E20 ld a, ' '
356: 1620+17 01AC CDB702 call print_char
357: 1637+10 01AF C39901 jp CMD_VIEW_ROW_LOOP ;else
358: - 01B2 CMD_VIEW_END:
359: 1647+17 01B2 CDD102 call print_newLine
360: 1664+10 01B5 C39900 jp PROMPT_BEGIN
361:
362: - 01B8 CMD_SET:
363: 1674+10 01B8 212A40 ld hl,var_buffer+1 ;load 1st byte
364: 1684+17 01BB CD2403 call DHEX_TO_BYTE
365: 1701+4 01BE 47 ld b,a ;store result in b
366: 1705+4 01BF 7B ld a,e ;check for error
367: 1709+4 01C0 A7 and a
368: 1713+10 01C1 C27202 jp nz, CMD_SYNTAX_ERROR
369:
370: 1723+10 01C4 212C40 ld hl,var_buffer+3 ;load 2nd byte
371: 1733+17 01C7 CD2403 call DHEX_TO_BYTE
372: 1750+4 01CA 4F ld c,a
373: 1754+4 01CB 7B ld a,e ;check for error
374: 1758+4 01CC A7 and a
375: 1762+10 01CD C27202 jp nz, CMD_SYNTAX_ERROR
376: ;bc now contains the start address
377:
378: 1772+10 01D0 212E40 ld hl,var_buffer+5
379: - 01D3 CMD_SET_LOOP:
380: 1782+7 01D3 7E ld a,(hl)
381: 1789+7 01D4 FE00 cp 0 ;if 0 then end
382: 1796+10 01D6 CAEE01 jp z, CMD_SET_END
383: 1806+7 01D9 FE20 cp ' '
384: 1813+10 01DB C27202 jp nz, CMD_SYNTAX_ERROR
385: 1823+6 01DE 23 inc hl ;next byte
386: 1829+17 01DF CD2403 call DHEX_TO_BYTE
387: 1846+7 01E2 02 ld (bc),a ;load byte to
388: 1853+4 01E3 7B ld a,e
389: 1857+4 01E4 A7 and a
390: 1861+10 01E5 C27202 jp nz, CMD_SYNTAX_ERROR
391: 1871+6 01E8 03 inc bc
392: 1877+6 01E9 23 inc hl
393: 1883+6 01EA 23 inc hl
394: 1889+10 01EB C3D301 jp CMD_SET_LOOP
395: - 01EE CMD_SET_END:
396: 1899+17 01EE CDD102 call print_newLine
397: 1916+10 01F1 C39900 jp PROMPT_BEGIN
398:
399:
400: - 01F4 CMD_IO_WRITE:
401: 1926+10 01F4 212A40 ld hl,var_buffer+1 ;load 1st byte
402: 1936+17 01F7 CD2403 call DHEX_TO_BYTE
403: 1953+4 01FA 4F ld c,a ;store result in b
404: 1957+4 01FB 7B ld a,e ;check for error
405: 1961+4 01FC A7 and a
406: 1965+10 01FD C27202 jp nz, CMD_SYNTAX_ERROR
407:
408: 1975+13 0200 3A2C40 ld a,(var_buffer+3)
409: 1988+7 0203 FE20 cp ' '
410: 1995+10 0205 C27202 jp nz, CMD_SYNTAX_ERROR
411:
412: 2005+10 0208 212D40 ld hl,var_buffer+4 ;load 1st byte
413: 2015+17 020B CD2403 call DHEX_TO_BYTE
414: 2032+11 020E F5 push af
415: 2043+4 020F 7B ld a,e ;check for error
416: 2047+4 0210 A7 and a
417: 2051+10 0211 C27202 jp nz, CMD_SYNTAX_ERROR
418:
419: 2061+10 0214 F1 pop af
420: 2071+12 0215 ED79 out (c),a
421: 2083+17 0217 CDD102 call print_newLine
422: 2100+10 021A C39900 jp PROMPT_BEGIN
423:
424: - 021D CMD_IO_READ:
425: 2110+10 021D 212A40 ld hl,var_buffer+1 ;load 1st byte
426: 2120+17 0220 CD2403 call DHEX_TO_BYTE
427: 2137+4 0223 4F ld c,a ;store result in b
428: 2141+4 0224 7B ld a,e ;check for error
429: 2145+4 0225 A7 and a
430: 2149+10 0226 C27202 jp nz, CMD_SYNTAX_ERROR
431:
432: 2159+12 0229 ED78 in a,(c)
433: 2171+11 022B F5 push af
434: 2182+17 022C CDD102 call print_newLine
435: 2199+10 022F F1 pop af
436: 2209+17 0230 CDE702 call print_a_hex
437: 2226+17 0233 CDD102 call print_newLine
438: 2243+10 0236 C39900 jp PROMPT_BEGIN
439:
440: - 0239 CMD_DASM:
441: 2253+17 0239 CDD102 call print_newLine
442: 2270+10 023C 212A40 ld hl,var_buffer+1 ;load 1st byte
443: 2280+17 023F CD2403 call DHEX_TO_BYTE
444: 2297+4 0242 47 ld b,a ;store result in b
445: 2301+4 0243 7B ld a,e ;check for error
446: 2305+4 0244 A7 and a
447: 2309+10 0245 C27202 jp nz, CMD_SYNTAX_ERROR
448:
449: 2319+10 0248 212C40 ld hl,var_buffer+3 ;load 2nd byte
450: 2329+17 024B CD2403 call DHEX_TO_BYTE
451: 2346+4 024E 4F ld c,a
452: 2350+4 024F 7B ld a,e ;check for error
453: 2354+4 0250 A7 and a
454: 2358+10 0251 C27202 jp nz, CMD_SYNTAX_ERROR
455:
456:
457: 2368+13 0254 3A2E40 ld a,(var_buffer+5)
458: 2381+7 0257 FE20 cp ' '
459: 2388+10 0259 C27202 jp nz, CMD_SYNTAX_ERROR
460:
461: 2398+10 025C 212F40 ld hl,var_buffer+6 ;load length
462: 2408+17 025F CD2403 call DHEX_TO_BYTE
463: 2425+11 0262 F5 push af
464: 2436+4 0263 7B ld a,e ;check for error
465: 2440+4 0264 A7 and a
466: 2444+10 0265 C27202 jp nz, CMD_SYNTAX_ERROR
467:
468: 2454+4 0268 60 ld h,b
469: 2458+4 0269 69 ld l,c
470:
471: 2462+10 026A F1 pop af ;restore af
472: 2472+4 026B 47 ld b,a
473:
474: 2476+17 026C CD7503 call disassemble
475:
476:
477: 2493+10 026F C39900 jp PROMPT_BEGIN
478:
479: - 0272 CMD_SYNTAX_ERROR:
480: 2503+17 0272 CDD102 call print_newLine
481: 2520+10 0275 218613 ld hl, [STR_SyntaxError]
482: 2530+17 0278 CDBF02 call print_str
483: 2547+10 027B C39900 jp PROMPT_BEGIN
484:
485:
486:
487: - 027E Includes:
488: ;.include "bootldr.s"
489: .include "console.s"
**** include/console.s ****
1: ;DIP SWICTHES
2: ;1843200 CLK / x16 SIO CLOCK MODE = 115200
3: ;MAX BAUD RATE = 115200
4: ;DIP VALUE = 115200/<BAUD>
5: ;
6: ;9600 -> 12 / 00110000
7: ;
8:
9: - 027E CONSOLE_INIT:
10: - 027E CONSOLE_INIT_CTC:
11: ;LD A,00001111b ; Set /16 Divider, CPU Trigger, Time COnstant Follows
12: 2557+7 027E 3E4F LD A,01001111b ; External Trigger, Time COnstant Follows
13: 2564+11 0280 D304 OUT (CS_CTC_0),A
14: 2575+11 0282 DB01 IN A,(CS_DIP) ; Read BAUD from DIP-Switches
15: ;LD A,39
16: 2586+11 0284 D304 OUT (CS_CTC_0),A
17: - 0286 CONSOLE_INIT_SIO:
18: 2597+7 0286 3E30 LD A,00110000b ;write into WR0: error reset, select WR0
19: 2604+11 0288 D309 OUT (CS_SIO_A_C),A
20: 2615+7 028A 3E18 LD a,018h ;write into WR0: channel reset
21: 2622+11 028C D309 OUT (CS_SIO_A_C),A
22: 2633+7 028E 3E04 LD a,004h ;write into WR0: select WR4
23: 2640+11 0290 D309 OUT (CS_SIO_A_C),A
24: 2651+7 0292 3E44 LD a,01000100b ;write into WR4: clkx16,1 stop bit, no parity
25: 2658+11 0294 D309 OUT (CS_SIO_A_C),A
26: 2669+7 0296 3E05 LD a,005h ;write into WR0: select WR5
27: 2676+11 0298 D309 OUT (CS_SIO_A_C),A
28: 2687+7 029A 3EE8 LD a,11101000b ;DTR inactive, TX 8bit, BREAK off, TX on, RTS inactive
29: 2694+11 029C D309 OUT (CS_SIO_A_C),A
30: 2705+7 029E 3E01 LD a,01h ;write into WR0: select WR1
31: 2712+11 02A0 D309 OUT (CS_SIO_A_C),A
32: 2723+7 02A2 3E04 LD a,00000100b ;no interrupt in CH B, special RX condition affects vect
33: 2730+11 02A4 D309 OUT (CS_SIO_A_C),A
34: 2741+7 02A6 3E02 LD a,02h ;write into WR0: select WR2
35: 2748+11 02A8 D309 OUT (CS_SIO_A_C),A
36: 2759+7 02AA 3E00 LD a,0h ;write into WR2: cmd line int vect (see int vec table)
37: ;bits D3,D2,D1 are changed according to RX condition
38: 2766+11 02AC D309 OUT (CS_SIO_A_C),A
39: 2777+7 02AE 3E03 LD a,003h ;write into WR0: select WR3
40: 2784+11 02B0 D309 OUT (CS_SIO_A_C),A
41: 2795+7 02B2 3EC1 LD a,0C1h ;RX 8bit, auto enable off, RX on
42: 2802+11 02B4 D309 OUT (CS_SIO_A_C),A
43: ;Channel A RX active
44: 2813+10 02B6 C9 RET
45:
46: ; A contains char
47: ; Destroys A
48: - 02B7 print_char:
49: 2823+11 02B7 F5 push af
50: 2834+11 02B8 D308 out (CS_SIO_A_D),a
51: 2845+17 02BA CDDC02 call print_wait_out
52: 2862+10 02BD F1 pop af
53: ;call print_char
54: 2872+10 02BE C9 ret
55: ; HL contains pointer to string
56: ; Destroy A, HL
57:
58: - 02BF print_str:
59: 2882+7 02BF 7E ld a, (hl)
60: 2889+4 02C0 B7 or a
61: 2893+7+5 02C1 2806 jr z,print_str_end
62: 2900+17 02C3 CDB702 call print_char
63: 2917+6 02C6 23 inc hl
64: 2923+12 02C7 18F6 jr print_str
65: - 02C9 print_str_end:
66: 2935+10 02C9 C9 ret
67:
68: - 02CA print_clear:
69: 2945+10 02CA 210A03 ld hl, [MSG_CLEAR]
70: 2955+17 02CD CDBF02 call print_str
71: 2972+10 02D0 C9 ret
72:
73: - 02D1 print_newLine:
74: 2982+7 02D1 3E0A ld a,10
75: 2989+17 02D3 CDB702 call print_char
76: 3006+7 02D6 3E0D ld a,13
77: 3013+17 02D8 CDB702 call print_char
78: 3030+10 02DB C9 ret
79: ; destroys a
80: - 02DC print_wait_out:
81: ; check for TX buffer empty
82: 3040+4 02DC 97 sub a ;clear a, write into WR0: select RR0
83: 3044+4 02DD 3C inc a ;select RR1
84: 3048+11 02DE D309 out (CS_SIO_A_C),A
85: 3059+11 02E0 DB09 in A,(CS_SIO_A_C) ;read RRx
86: 3070+8 02E2 CB47 bit 0,A
87: 3078+7+5 02E4 28F6 jr z,print_wait_out
88: 3085+10 02E6 C9 ret
89:
90: - 02E7 print_a_hex:
91: 3095+11 02E7 F5 push af
92: 3106+11 02E8 C5 push bc
93: 3117+11 02E9 D5 push de
94: 3128+17 02EA CD5B03 call STRCONV_BYTES_TO_HEX
95: 3145+4 02ED 78 ld a,b
96: 3149+17 02EE CDB702 call print_char
97: 3166+4 02F1 79 ld a,c
98: 3170+17 02F2 CDB702 call print_char
99: 3187+10 02F5 D1 pop de
100: 3197+10 02F6 C1 pop bc
101: 3207+10 02F7 F1 pop af
102:
103: - 02F8 read_char:
104: 3217+17 02F8 CD1B03 call A_RTS_ON
105: 3234+4 02FB 00 nop
106: 3238+4 02FC AF xor a ; a = 0
107: 3242+11 02FD D309 out (CS_SIO_A_C), a ; select reg 0
108: 3253+11 02FF DB09 in a, (CS_SIO_A_C) ; read reg 0
109: 3264+7 0301 E601 and 1 ; mask D0 (recieve char available)
110: 3271+17 0303 CD1203 call A_RTS_OFF
111: 3288+5+6 0306 C8 ret Z ; return 0 if no char
112: 3293+11 0307 DB08 in a, (CS_SIO_A_D) ; read char if avail
113: 3304+10 0309 C9 ret ; return
114:
115: ;MSG_CRSR_0:
116: ; db 0x1B, "[?25h",0
117: ;MSG_CRSR_1:
118: ; db 0x1B, "[?25l",0
119: - 030A MSG_CLEAR:
120: - 030A 1B5B324A db 27, '[2J', 27, '[H',0
1B5B4800
121:
122:
123:
124: ; Serial Util Functions
125: - 0312 A_RTS_OFF:
126: 3314+7 0312 3E05 ld a,005h ;write into WR0: select WR5
127: 3321+11 0314 D309 out (CS_SIO_A_C),A
128: 3332+7 0316 3E68 ld a,068h ;DTR inactive, TX 8bit, BREAK off, TX on, RTS inactive
129: 3339+11 0318 D309 out (CS_SIO_A_C),A
130: 3350+10 031A C9 ret
131: - 031B A_RTS_ON:
132: 3360+7 031B 3E05 ld a,005h ;write into WR0: select WR5
133: 3367+11 031D D309 out (CS_SIO_A_C),A
134: 3378+7 031F 3EEA ld a,0EAh ;DTR active, TX 8bit, BREAK off, TX on, RTS active
135: 3385+11 0321 D309 out (CS_SIO_A_C),A
**** main.asm ****
490: 3396+10 0323 C9 ret
491: .include "conversions.s"
**** include/conversions.s ****
1: ; HL Contains Address to string
2: ; E is 0xFF if error
3: ; E is 0x00 if okay
4: ; A returns byte
5: ; A,DE are destroyed
6: - 0324 DHEX_TO_BYTE:
7: 3406+11 0324 E5 PUSH HL ;Backup pointer
8: ; Load First Byte
9: 3417+7 0325 7E LD A,(HL) ;Load first char (high)
10: 3424+17 0326 CD4403 CALL HEX_TO_BIN ;Conv chart to 4bit
11: 3441+7+5 0329 3815 jr C, DHEX_TO_BYTE_FAILED ;If error jmp to DHEX_TO_BYTE_FAILED
12: 3448+8 032B CB27 SLA A ;shift result to upper 4 bits
13: 3456+8 032D CB27 SLA A
14: 3464+8 032F CB27 SLA A
15: 3472+8 0331 CB27 SLA A
16: 3480+4 0333 57 LD D,A ;store result in D
17:
18: 3484+6 0334 23 INC HL ;next byte
19: 3490+7 0335 7E LD A,(HL) ;load 2nd char (lower)
20: 3497+17 0336 CD4403 CALL HEX_TO_BIN ;Conv chart to 4bit
21: 3514+7+5 0339 3805 jr C, DHEX_TO_BYTE_FAILED ;If error jmp to DHEX_TO_BYTE_FAILED
22: 3521+4 033B B2 OR D ;merge D with accumulator
23:
24: 3525+10 033C E1 POP HL ;restor original pointer
25: 3535+7 033D 1E00 LD E,0x00 ;set error to 0x00 = no error
26: 3542+10 033F C9 RET
27: - 0340 DHEX_TO_BYTE_FAILED:
28: 3552+7 0340 1EFF LD E,0xFF ;set error to oxFF
29: ;LD A,0x00
30: 3559+10 0342 E1 POP HL
31: 3569+10 0343 C9 RET
32:
33: ; REG A Contains CHAR-Low
34: ; If failed, Carry is set
35: - 0344 HEX_TO_BIN:
36: 3579+7 0344 D630 SUB 48 ; 0 is 0
37: 3586+10 0346 EA5903 jp PE, HEX_TO_INVALID_2; to low (SUB overflow)
38: 3596+7 0349 FE0A CP 10 ; Value is between 0 and 9
39: 3603+7+5 034B 3805 JR C, HEX_TO_BIN_2
40: 3610+7 034D D607 SUB 7
41: 3617+10 034F EA5903 jp PE, HEX_TO_INVALID_2; to low (SUB overflow)
42: - 0352 HEX_TO_BIN_2:
43: 3627+7 0352 FE10 CP 16
44: 3634+7+5 0354 3003 JR NC, HEX_TO_INVALID_2; if bigger than 15-> fail
45: 3641+7 0356 E60F AND 0x0F
46: 3648+10 0358 C9 RET
47: - 0359 HEX_TO_INVALID_2:
48: 3658+4 0359 37 SCF ;set carry flag
49: 3662+10 035A C9 RET
50:
51:
52: ;*****************
53: ; Convert Byte to Hex Char (ASCII)
54: ;*****************
55: ;Description: the StrLength function inline
56: ;
57: ;Inputs: A contains input byte
58: ;
59: ;Outputs: BC contains 2 Bytes of ASCII (HEX)
60: ;
61: ;Destroys: A, BC,
62: - 035B STRCONV_BYTES_TO_HEX:
63: 3672+11 035B F5 PUSH AF;Backup A Register
64: 3683+4 035C 1F RRA
65: 3687+4 035D 1F RRA
66: 3691+4 035E 1F RRA
67: 3695+4 035F 1F RRA
68: 3699+17 0360 CD6A03 CALL STRCONV_BYTES_TO_HEX_1
69: ;LD A,D
70: 3716+4 0363 47 LD B,A
71: 3720+10 0364 F1 POP AF ; Reload first Byte
72: 3730+17 0365 CD6A03 CALL STRCONV_BYTES_TO_HEX_1
73: ;LD A,D
74: 3747+4 0368 4F LD C,A
75: 3751+10 0369 C9 RET
76:
77: - 036A STRCONV_BYTES_TO_HEX_1:
78: 3761+7 036A E60F AND 0x0F
79: 3768+7 036C C630 ADD 48
80: 3775+7 036E FE3A CP 58 ; Check if less than 58 (less than ASCII 9)
81: ;JR C, STRCONV_BYTES_TO_HEX_2
82: 3782+5+6 0370 D8 RET C
83: 3787+7 0371 C607 ADD 7 ; A-F
84: 3794+10 0373 C9 RET
85: - 0374 STRCONV_BYTES_TO_HEX_2:
86: ;LD D,A
87: 3804+10 0374 C9 RET
88:
89:
**** main.asm ****
492: ;.include "basic.s"
493: .include "disassembler.s"
**** include/disassembler.s ****
1: - 4110 var_opcode_start equ PRG_RAM_START ;16 bit pointer to opcode in mem
2: - 4112 var_opcode_table equ PRG_RAM_START+2 ;16 bit pointer to opcode in table
3: - 4114 var_opcode equ PRG_RAM_START+4 ;8 bit opcode value
4: - 4115 var_opcode_x equ PRG_RAM_START+5 ;8 bit opcode extension value
5: - 4116 var_opcode_length equ PRG_RAM_START+6 ;8 bit opcode length (in bytes)
6: - 4117 var_opcode_string equ PRG_RAM_START+7 ;16 bit pointer to opcode string
7: - 4119 var_opcode_pcount equ PRG_RAM_START+9 ;8 bit opcode param count
8: - 411A var_bytes_count equ PRG_RAM_START+10 ;bytes to examine
9: ; HL contains start address
10: ; B contains length
11: - 0375 disassemble:
12: 3814+4 0375 78 ld a,b
13: 3818+13 0376 321A41 ld (var_bytes_count),a
14: - 0379 disassemble_next:
15:
16:
17: 3831+16 0379 221041 ld (var_opcode_start), hl ;16 bit pointer to opcode in mem
18: 3847+7 037C 7E ld a,(hl) ;load opcode to find in A
19: 3854+13 037D 321441 ld (var_opcode), a ;8 bit opcode value
20: 3867+6 0380 23 inc hl
21: 3873+7 0381 7E ld a,(hl) ;load opcode to find in A
22: 3880+13 0382 321541 ld (var_opcode_x), a ;8 bit opcode extended value
23: 3893+6 0385 2B dec hl
24: 3899+17 0386 CD6904 call disassemble_table_seek
25: 3916+4 0389 78 ld a,b
26: 3920+4 038A B1 or c
27: 3924+10 038B CA4B04 jp z, disassemble_err ;if bc==0000h
28:
29: 3934+20 038E ED431241 ld (var_opcode_table), bc ;16 bit pointer to opcode in table
30:
31: ;load params
32: 3954+6 0392 03 inc bc
33: 3960+6 0393 03 inc bc
34: 3966+6 0394 03 inc bc
35: 3972+6 0395 03 inc bc
36: 3978+7 0396 0A ld a,(bc)
37: 3985+13 0397 321641 ld (var_opcode_length),A ;8 bit opcode length (in bytes)
38: 3998+6 039A 03 inc bc
39: 4004+7 039B 0A ld a, (bc)
40: 4011+4 039C 5F ld e,a
41: 4015+6 039D 03 inc bc
42: 4021+7 039E 0A ld a, (bc)
43: 4028+4 039F 57 ld d,a
44: 4032+20 03A0 ED531741 ld (var_opcode_string),de ;16 bit pointer to opcode string
45: 4052+6 03A4 03 inc bc
46: 4058+7 03A5 0A ld a,(bc)
47: 4065+13 03A6 321941 ld (var_opcode_pcount),A ;8 bit opcode param count
48:
49: ;values are prepared. Continue with print
50:
51: 4078+16 03A9 2A1041 ld hl,(var_opcode_start) ;print address
52: 4094+17 03AC CDB104 call dasm_print16hex_addr
53:
54: 4111+13 03AF 3A1641 ld a,(var_opcode_length)
55: 4124+4 03B2 47 ld b, a
56:
57: ;print up to 4 opcode bytes
58: 4128+16 03B3 2A1041 ld hl,(var_opcode_start)
59:
60: - 03B6 disassemble_print_opcode_raw
61: 4144+7 03B6 7E ld a,(hl) ;load first byte
62: 4151+17 03B7 CDE702 call print_a_hex
63: 4168+6 03BA 23 inc hl
64: 4174+8+5 03BB 10F9 djnz disassemble_print_opcode_raw
65:
66: 4182+7 03BD 3E68 ld a,"h"
67: 4189+17 03BF CDB702 call print_char
68: ;fill empty spots
69: 4206+13 03C2 3A1641 ld a,(var_opcode_length)
70: 4219+4 03C5 47 ld b,a
71: 4223+7 03C6 3E06 ld a,6
72: 4230+4 03C8 90 sub b
73: 4234+4 03C9 47 ld b,a
74:
75: - 03CA disassemble_print_opcode_raw_fill:
76: 4238+7 03CA 3E20 ld a," "
77: 4245+17 03CC CDB702 call print_char
78: 4262+7 03CF 3E20 ld a," "
79: 4269+17 03D1 CDB702 call print_char
80: 4286+8+5 03D4 10F4 djnz disassemble_print_opcode_raw_fill
81: 4294+7 03D6 3E20 ld a," "
82: 4301+17 03D8 CDB702 call print_char
83:
84: 4318+11 03DB E5 push hl
85: ;print opcode
86: 4329+16 03DC 2A1741 ld hl,(var_opcode_string)
87: 4345+17 03DF CDBF02 call print_str
88:
89:
90: ;print params
91: 4362+13 03E2 3A1941 ld a,(var_opcode_pcount)
92: 4375+4 03E5 B7 or a
93: 4379+10 03E6 CA4804 jp z, disassemble_print_opcode_params_end ;skip if no params
94:
95: 4389+16 03E9 2A1241 ld hl,(var_opcode_table)
96: 4405+10 03EC 010800 ld bc, 8
97: 4415+11 03EF 09 add hl,bc ;hl now has address of first param
98: 4426+13 03F0 3A1941 ld a,(var_opcode_pcount)
99: 4439+4 03F3 47 ld b,a
100: - 03F4 disassemble_print_opcode_params_loop:
101: ;ld a,(hl) ;load param
102: ;call print_a_hex
103: 4443+7 03F4 7E ld a,(hl) ;load param
104:
105: 4450+7 03F5 FE01 cp 0x01
106: 4457+10+7 03F7 CCD704 call z, param_01
107: 4467+7 03FA FE02 cp 0x02
108: 4474+10+7 03FC CCFE04 call z, param_02
109: 4484+7 03FF FE03 cp 0x03
110: 4491+10+7 0401 CC1B05 call z, param_03
111: 4501+7 0404 FE04 cp 0x04
112: 4508+10+7 0406 CC5705 call z, param_04
113: 4518+7 0409 FE05 cp 0x05
114: 4525+10+7 040B CC6D05 call z, param_05
115: 4535+7 040E FE06 cp 0x06
116: 4542+10+7 0410 CC7A05 call z, param_06
117: 4552+7 0413 FE07 cp 0x07
118: 4559+10+7 0415 CC9405 call z, param_07
119: 4569+7 0418 FE08 cp 0x08
120: 4576+10+7 041A CCA105 call z, param_08
121: 4586+7 041D FE09 cp 0x09
122: 4593+10+7 041F CCB605 call z, param_09
123: 4603+7 0422 FE10 cp 0x10
124: 4610+10+7 0424 CCCB05 call z, param_10
125: 4620+7 0427 FE11 cp 0x11
126: 4627+10+7 0429 CCDB05 call z, param_11
127: 4637+7 042C FE12 cp 0x12
128: 4644+10+7 042E CCE305 call z, param_12
129: 4654+7 0431 FE13 cp 0x13
130: 4661+10+7 0433 CC1B06 call z, param_13
131: 4671+7 0436 FE0A cp 0x0A
132: 4678+10+7 0438 CCAD05 call z, param_0A
133: ;strings
134: 4688+7 043B FE80 cp 0x80
135: 4695+10+7 043D CC3A06 call z, param_80
136: 4705+7 0440 FE81 cp 0x81
137: 4712+10+7 0442 CC3106 call z, param_81
138: 4722+6 0445 23 inc hl
139: 4728+8+5 0446 10AC djnz disassemble_print_opcode_params_loop
140: - 0448 disassemble_print_opcode_params_end:
141: 4736+10 0448 E1 pop hl
142: 4746+12 0449 1810 jr disassemble_continue
143:
144:
145: - 044B disassemble_err:
146: 4758+17 044B CDB104 call dasm_print16hex_addr
147: 4775+7 044E 7E ld a,(hl)
148: 4782+17 044F CDC904 call dasm_print8hex ;print value
149: 4799+6 0452 23 inc hl
150: 4805+11 0453 E5 push hl
151: 4816+10 0454 21860E ld hl, [dasm_UU]
152: 4826+17 0457 CDBF02 call print_str
153: 4843+10 045A E1 pop hl
154:
155: - 045B disassemble_continue:
156:
157: 4853+17 045B CDD102 call print_newLine
158: ;inc hl
159: 4870+13 045E 3A1A41 ld a,(var_bytes_count)
160: 4883+4 0461 3D dec a
161: 4887+13 0462 321A41 ld (var_bytes_count),a
162: 4900+10 0465 C27903 jp nz, disassemble_next
163: 4910+10 0468 C9 ret
164:
165:
166:
167: ;A contains opcode
168: ;BC contains returned position
169: - 0469 disassemble_table_seek:
170: 4920+11 0469 E5 push hl
171: 4931+10 046A 218406 ld hl, [dasm_opcode_table]
172: - 046D disassemble_table_seek_loop:
173: 4941+13 046D 3A1441 ld a,(var_opcode)
174: 4954+4 0470 4F ld c,a
175: 4958+7 0471 7E ld a,(hl)
176: 4965+7 0472 FEFF cp 0xFF ; if null
177: 4972+10 0474 CAAB04 jp z, disassemble_table_notfound
178:
179: ;apply mask
180: 4982+11 0477 F5 push af
181: 4993+6 0478 23 inc hl
182: 4999+7 0479 46 ld b,(hl) ;load mask
183: 5006+6 047A 2B dec hl
184: 5012+4 047B 79 ld a,c
185: 5016+4 047C A0 and b ;apply mask
186: 5020+4 047D 4F ld c,a
187: 5024+10 047E F1 pop af
188:
189: 5034+4 047F B9 cp c ; if match
190: 5038+7+5 0480 280B jr z, disassemble_table_first_match
191: 5045+7 0482 0600 ld b,0
192: 5052+7 0484 0E07 ld c,7
193: 5059+11 0486 09 add hl,bc
194: 5070+7 0487 7E ld a,(hl)
195: 5077+4 0488 4F ld c,a
196: 5081+11 0489 09 add hl,bc
197: 5092+6 048A 23 inc hl
198: 5098+12 048B 18E0 jr disassemble_table_seek_loop
199:
200: - 048D disassemble_table_first_match
201: 5110+6 048D 23 inc hl
202: 5116+6 048E 23 inc hl
203: 5122+7 048F 4E ld c,(hl) ;load opcode x from table
204: 5129+6 0490 23 inc hl
205: 5135+13 0491 3A1541 ld a,(var_opcode_x) ;load current opcode x
206: 5148+7 0494 46 ld b,(hl) ;load mask
207: 5155+4 0495 A0 and b ;apply mask
208: 5159+4 0496 B9 cp c ;compare to table
209: 5163+6 0497 2B dec hl
210: 5169+6 0498 2B dec hl
211: 5175+6 0499 2B dec hl
212: 5181+7+5 049A 280B jr z, disassemble_table_found ;IF FOUND
213: 5188+7 049C 0600 ld b,0 ;else continue with next
214:
215: 5195+7 049E 0E07 ld c,7
216: 5202+11 04A0 09 add hl,bc
217: 5213+7 04A1 7E ld a,(hl)
218: 5220+4 04A2 4F ld c,a
219: 5224+11 04A3 09 add hl,bc
220: 5235+6 04A4 23 inc hl
221: 5241+12 04A5 18C6 jr disassemble_table_seek_loop
222:
223: - 04A7 disassemble_table_found
224: 5253+4 04A7 44 ld b,H
225: 5257+4 04A8 4D ld c,l
226: 5261+10 04A9 E1 pop hl
227: 5271+10 04AA C9 ret
228:
229: - 04AB disassemble_table_notfound
230: 5281+7 04AB 0600 ld b,0
231: 5288+7 04AD 0E00 ld c,0
232: 5295+10 04AF E1 pop hl
233: 5305+10 04B0 C9 ret
234:
235:
236:
237:
238: - 04B1 dasm_print16hex_addr:
239: 5315+7 04B1 3E24 ld a,"$"
240: 5322+17 04B3 CDB702 call print_char
241: 5339+4 04B6 7C ld a,h
242: 5343+17 04B7 CDE702 call print_a_hex
243: 5360+4 04BA 7D ld a,l
244: 5364+17 04BB CDE702 call print_a_hex
245: 5381+7 04BE 3E68 ld a,"h"
246: 5388+17 04C0 CDB702 call print_char
247: 5405+7 04C3 3E20 ld a," "
248: 5412+17 04C5 CDB702 call print_char
249: 5429+10 04C8 C9 ret
250:
251: - 04C9 dasm_print8hex:
252: 5439+17 04C9 CDE702 call print_a_hex
253: 5456+7 04CC 3E68 ld a,"h"
254: 5463+17 04CE CDB702 call print_char
255: 5480+7 04D1 3E20 ld a," "
256: 5487+17 04D3 CDB702 call print_char
257: 5504+10 04D6 C9 ret
258:
259:
260:
261:
262:
263:
264:
265: - 04D7 param_01: ; 0x01 16bit address pointer
266: 5514+11 04D7 E5 push hl
267: 5525+20 04D8 ED5B1041 ld de,(var_opcode_start)
268: 5545+6 04DC 13 inc de
269: 5551+7 04DD 1A ld a,(de)
270: 5558+4 04DE 6F ld l,a
271: 5562+6 04DF 13 inc de
272: 5568+7 04E0 1A ld a,(de)
273: 5575+4 04E1 67 ld h,a
274:
275: 5579+7 04E2 3E24 ld a,"$"
276: 5586+17 04E4 CDB702 call print_char
277: 5603+4 04E7 7C ld a,h
278: 5607+17 04E8 CDE702 call print_a_hex
279: 5624+4 04EB 7D ld a,l
280: 5628+17 04EC CDE702 call print_a_hex
281: 5645+7 04EF 3E68 ld a,"h"
282: 5652+17 04F1 CDB702 call print_char
283: 5669+7 04F4 3E20 ld a," "
284: 5676+17 04F6 CDB702 call print_char
285: 5693+17 04F9 CD7506 call param_comma
286: 5710+10 04FC E1 pop hl
287: 5720+10 04FD C9 ret
288:
289: - 04FE param_02:
290: 5730+11 04FE C5 push bc
291: 5741+20 04FF ED5B1041 ld de,(var_opcode_start)
292: 5761+7 0503 1A ld a,(de)
293: 5768+4 0504 1F rra
294: 5772+4 0505 1F rra
295: 5776+7 0506 E60E and 0x0E
296:
297: 5783+11 0508 E5 push hl
298: 5794+10 0509 218F0E ld hl, [dasm_printFlags_table]
299: 5804+7 050C 0600 ld b,0
300: 5811+4 050E 4F ld c,a
301: 5815+11 050F 09 add hl,bc
302: 5826+17 0510 CDBF02 call print_str
303: 5843+7 0513 3E20 ld a, " "
304: 5850+17 0515 CDB702 call print_char
305: 5867+10 0518 E1 pop hl
306: 5877+10 0519 C1 pop bc
307: 5887+10 051A C9 ret
308:
309:
310: - 051B param_03:
311: 5897+20 051B ED5B1041 ld de,(var_opcode_start)
312: 5917+6 051F 13 inc de
313: 5923+7 0520 1A ld a,(de)
314:
315: 5930+11 0521 F5 push af
316: 5941+7 0522 E680 and 0x80
317: 5948+10 0524 C23C05 jp nz, param_03_neg
318: 5958+7 0527 3E24 ld a,"$"
319: 5965+17 0529 CDB702 call print_char
320: 5982+7 052C 3E2B ld a,"+"
321: 5989+17 052E CDB702 call print_char
322: 6006+10 0531 F1 pop af
323: 6016+17 0532 CDE702 call print_a_hex
324: 6033+7 0535 3E68 ld a,"h"
325: 6040+17 0537 CDB702 call print_char
326: 6057+12 053A 1817 jr param_03_done
327:
328: - 053C param_03_neg:
329: 6069+7 053C 3E24 ld a,"$"
330: 6076+17 053E CDB702 call print_char
331: 6093+7 0541 3E2D ld a,"-"
332: 6100+17 0543 CDB702 call print_char
333: 6117+10 0546 F1 pop af
334: 6127+8 0547 ED44 neg
335: 6135+17 0549 CDE702 call print_a_hex
336: 6152+7 054C 3E68 ld a,"h"
337: 6159+17 054E CDB702 call print_char
338: 6176+12 0551 1800 jr param_03_done
339:
340: - 0553 param_03_done:
341: 6188+17 0553 CD7506 call param_comma
342: 6205+10 0556 C9 ret
343:
344:
345: - 0557 param_04:
346: 6215+20 0557 ED5B1041 ld de,(var_opcode_start)
347: 6235+6 055B 13 inc de
348: 6241+7 055C 1A ld a,(de)
349: 6248+7 055D FE4D cp 0x4D
350: 6255+7+5 055F 2806 jr z,param_04_i
351: 6262+7 0561 3E4E ld a,"N"
352: 6269+17 0563 CDB702 call print_char
353: 6286+10 0566 C9 ret
354: - 0567 param_04_i:
355: 6296+7 0567 3E49 ld a,"I"
356: 6303+17 0569 CDB702 call print_char
357: 6320+10 056C C9 ret
358:
359: - 056D param_05:
360: 6330+11 056D C5 push bc
361: 6341+20 056E ED5B1041 ld de,(var_opcode_start)
362: 6361+7 0572 1A ld a,(de)
363: 6368+7 0573 E638 and 0x38
364: ; print hex char
365: 6375+17 0575 CDC904 call dasm_print8hex
366: 6392+10 0578 C1 pop bc
367: 6402+10 0579 C9 ret
368:
369:
370: - 057A param_06:
371: 6412+11 057A C5 push bc
372: 6423+20 057B ED5B1041 ld de,(var_opcode_start)
373: 6443+7 057F 1A ld a,(de)
374: 6450+4 0580 1F rra
375: 6454+4 0581 1F rra
376: 6458+4 0582 1F rra
377: 6462+7 0583 E607 and 0x07
378: 6469+17 0585 CD5006 call param_printRegister
379: 6486+7 0588 3E20 ld a," "
380: 6493+17 058A CDB702 call print_char
381: 6510+7 058D 3E2C ld a,","
382: 6517+17 058F CDB702 call print_char
383: 6534+10 0592 C1 pop bc
384: 6544+10 0593 C9 ret
385:
386: - 0594 param_07:
387: 6554+11 0594 C5 push bc
388: 6565+20 0595 ED5B1041 ld de,(var_opcode_start)
389: 6585+7 0599 1A ld a,(de)
390: 6592+7 059A E607 and 0x07
391:
392: 6599+17 059C CD5006 call param_printRegister
393: 6616+10 059F C1 pop bc
394: 6626+10 05A0 C9 ret
395:
396: - 05A1 param_08:
397: 6636+11 05A1 C5 push bc
398: 6647+20 05A2 ED5B1041 ld de,(var_opcode_start)
399: 6667+6 05A6 13 inc de
400: 6673+7 05A7 1A ld a,(de)
401: 6680+17 05A8 CDC904 call dasm_print8hex
402: 6697+10 05AB C1 pop bc
403: 6707+10 05AC C9 ret
404:
405:
406: - 05AD param_0A:
407: 6717+11 05AD E5 push hl
408: 6728+20 05AE ED5B1041 ld de,(var_opcode_start)
409: 6748+6 05B2 13 inc de
410: 6754+6 05B3 13 inc de
411: 6760+12 05B4 1806 jr param_09_0A
412: - 05B6 param_09:
413: 6772+11 05B6 E5 push hl
414: 6783+20 05B7 ED5B1041 ld de,(var_opcode_start)
415: 6803+6 05BB 13 inc de
416: - 05BC param_09_0A:
417: 6809+7 05BC 1A ld a,(de)
418: 6816+4 05BD 6F ld l,a
419: 6820+6 05BE 13 inc de
420: 6826+7 05BF 1A ld a,(de)
421: 6833+4 05C0 67 ld h,a
422: 6837+4 05C1 7C ld a,h
423: 6841+17 05C2 CDE702 call print_a_hex
424: 6858+4 05C5 7D ld a,l
425: 6862+17 05C6 CDE702 call print_a_hex
426: 6879+10 05C9 E1 pop hl
427: 6889+10 05CA C9 ret
428:
429: - 05CB param_10:
430: 6899+11 05CB C5 push bc
431: 6910+20 05CC ED5B1041 ld de,(var_opcode_start)
432: 6930+7 05D0 1A ld a,(de)
433: 6937+4 05D1 1F rra
434: 6941+4 05D2 1F rra
435: 6945+4 05D3 1F rra
436: 6949+7 05D4 E607 and 0x07
437: 6956+17 05D6 CD5006 call param_printRegister
438: 6973+10 05D9 C1 pop bc
439: 6983+10 05DA C9 ret
440:
441:
442: - 05DB param_11:
443: 6993+11 05DB E5 push hl
444: 7004+11 05DC C5 push bc
445: 7015+20 05DD ED5B1041 ld de,(var_opcode_start)
446: 7035+12 05E1 1807 jr param_11_12
447: - 05E3 param_12:
448: 7047+11 05E3 E5 push hl
449: 7058+11 05E4 C5 push bc
450: 7069+20 05E5 ED5B1041 ld de,(var_opcode_start)
451: 7089+6 05E9 13 inc de
452:
453: - 05EA param_11_12:
454: 7095+7 05EA 1A ld a,(de)
455: 7102+4 05EB 1F rra
456: 7106+4 05EC 1F rra
457: 7110+4 05ED 1F rra
458: 7114+7 05EE E606 and 0x06
459: 7121+11 05F0 F5 push af
460: ;check which table to use
461: 7132+16 05F1 2A1041 ld hl, (var_opcode_start)
462: 7148+7 05F4 7E ld a,(hl)
463: 7155+7 05F5 FEDD cp 0xDD
464: 7162+7+5 05F7 2809 jr z,param_11_12_ix
465: 7169+7 05F9 FEFD cp 0xFD
466: 7176+7+5 05FB 280A jr z,param_11_12_iy
467: - 05FD param_11_12_def:
468: 7183+10 05FD 219F0E ld hl, [dasm_printRegister8_table]
469: 7193+12 0600 1808 jr param_11_12_all
470: - 0602 param_11_12_ix:
471: 7205+10 0602 21A70E ld hl, [dasm_printRegisterIX_table]
472: 7215+12 0605 1803 jr param_11_12_all
473: - 0607 param_11_12_iy:
474: 7227+10 0607 21AF0E ld hl, [dasm_printRegisterIY_table]
475: - 060A param_11_12_all:
476: 7237+10 060A F1 pop af
477: 7247+7 060B 0600 ld b,0
478: 7254+4 060D 4F ld c,a
479: 7258+11 060E 09 add hl, bc
480: 7269+7 060F 7E ld a,(hl)
481: 7276+17 0610 CDB702 call print_char
482: 7293+6 0613 23 inc hl
483: 7299+7 0614 7E ld a,(hl)
484: 7306+17 0615 CDB702 call print_char
485: 7323+10 0618 C1 pop bc
486: 7333+10 0619 E1 pop hl
487: 7343+10 061A C9 ret
488:
489: - 061B param_13:
490: 7353+11 061B E5 push hl
491: 7364+11 061C C5 push bc
492: 7375+20 061D ED5B1041 ld de,(var_opcode_start)
493: 7395+7 0621 1A ld a,(de)
494: 7402+4 0622 1F rra
495: 7406+4 0623 1F rra
496: 7410+4 0624 1F rra
497: 7414+7 0625 E606 and 0x06
498: 7421+11 0627 F5 push af
499: ;check which table to use
500: 7432+16 0628 2A1041 ld hl, (var_opcode_start)
501: 7448+7 062B 7E ld a,(hl)
502: 7455+10 062C 21B70E ld hl, [dasm_printRegisterSP_table]
503: 7465+12 062F 18D9 jr param_11_12_all ;reuse code from 11_12
504:
505:
506: - 0631 param_81:
507: 7477+11 0631 E5 push hl
508: 7488+11 0632 C5 push bc
509: 7499+16 0633 2A1741 ld hl, (var_opcode_string)
510: 7515+7 0636 0602 ld b,2
511: 7522+12 0638 1807 jr param_80_seek
512: - 063A param_80:
513: 7534+11 063A E5 push hl
514: 7545+11 063B C5 push bc
515: 7556+16 063C 2A1741 ld hl, (var_opcode_string)
516: 7572+7 063F 0601 ld b,1
517: - 0641 param_80_seek:
518: 7579+7 0641 7E ld a,(hl)
519: 7586+6 0642 23 inc hl
520: 7592+4 0643 A7 and a
521: 7596+7+5 0644 20FB jr nz, param_80_seek
522: ;found
523: 7603+4 0646 05 dec b ;found but counter too high
524: 7607+10 0647 C24106 jp nz, param_80_seek
525:
526: 7617+17 064A CDBF02 call print_str
527: 7634+10 064D C1 pop bc
528: 7644+10 064E E1 pop hl
529: 7654+10 064F C9 ret
530:
531:
532:
533: - 0650 param_printRegister:
534: 7664+11 0650 E5 push hl
535: 7675+7 0651 FE06 cp 0x06
536: 7682+7+5 0653 2811 jr z, param_printRegisterHL
537: 7689+7 0655 FE07 cp 0x07
538: 7696+7+5 0657 2815 jr z, param_printRegisterA
539: 7703+10 0659 219F0E ld hl, [dasm_printRegister8_table]
540: 7713+7 065C 0600 ld b,0
541: 7720+4 065E 4F ld c,a
542: 7724+11 065F 09 add hl,bc
543: 7735+7 0660 7E ld a, (hl)
544: 7742+17 0661 CDB702 call print_char
545: 7759+10 0664 E1 pop hl
546: 7769+10 0665 C9 ret
547:
548: - 0666 param_printRegisterHL:
549: 7779+10 0666 21BF0E ld hl, [dasm_printRegister8_table_HL]
550: 7789+17 0669 CDBF02 call print_str
551: 7806+10 066C E1 pop hl
552: 7816+10 066D C9 ret
553:
554: - 066E param_printRegisterA:
555: 7826+7 066E 3E41 ld a,"A"
556: 7833+17 0670 CDB702 call print_char
557: 7850+10 0673 E1 pop hl
558: 7860+10 0674 C9 ret
559:
560:
561: - 0675 param_comma:
562: 7870+4 0675 78 ld a,b
563: 7874+7 0676 FE01 cp 1
564: 7881+5+6 0678 C8 ret z
565: 7886+7 0679 3E20 ld a," "
566: 7893+17 067B CDB702 call print_char
567: 7910+7 067E 3E2C ld a,","
568: 7917+17 0680 CDB702 call print_char
**** main.asm ****
494: 7934+10 0683 C9 ret
495: .include "disassembler_table.s"
**** include/disassembler_table.s ****
1: ;disassembler tables
2:
3: - 0684 dasm_opcode_table:
4: ;byte 0 = opcode
5: ;byte 1 = opcode mask
6: ;byte 2 = opcode extended
7: ;byte 3 = opcode extended mask
8: ;byte 4 = length
9: ;byte 5+6 = pointer to string
10: ;byte 7 = params = count of paramters
11: ;byte 8+ = paramters
12: ; 0x01 16bit address pointer
13: ; 0x02 flag bit 3-5
14: ; 0x03 relative jmp address
15: ; 0x04 RETI/RETN
16: ; 0x05 RST Vector
17: ; 0x06 register (r)
18: ; 0x07 register (r')
19: ; 0x08 8-Bit value
20: ; 0x09 16-Bit value
21: ; 0x0A 16-bit value with offset +1
22: ; 0x10 same as 0x06 without ","
23: ; 0x11 print 16 bit register from 1st byte
24: ; 0x12 print 16 bit register from 2nd byte
25: ; 0x13 push/pop register lookup
26: ; 0x80 print string suffix
27: ; 0x81 print string suffix 2
28: - 0684 00FF0000 defb 0x00, 0xFF, 0x00, 0x00, 1, [dasm_00], [dasm_00]>>8,0 ;NOP
01DC0A00
29: ;General-Purpose Arithmetic and CPU Control Groups
30: - 068C 27FF0000 defb 0x27, 0xFF, 0x00, 0x00, 1, [dasm_27], [dasm_27]>>8, 0 ;DAA
01A70B00
31: - 0694 2FFF0000 defb 0x2F, 0xFF, 0x00, 0x00, 1, [dasm_2F], [dasm_2F]>>8, 0 ;CPL
01AB0B00
32: - 069C EDFF44FF defb 0xED, 0xFF, 0x44, 0xFF, 2, [dasm_ED_44], [dasm_ED_44]>>8, 0 ;NEG
02AF0B00
33: - 06A4 3FFF0000 defb 0x3f, 0xFF, 0x00, 0x00, 1, [dasm_3F], [dasm_3F]>>8, 0 ;CCF
01B30B00
34: - 06AC 37FF0000 defb 0x37, 0xFF, 0x00, 0x00, 1, [dasm_37], [dasm_37]>>8, 0 ;SCF
01B70B00
35: ;defb 0x00, 0xFF, 0x00, 0x00, 1, [dasm_00], [dasm_00]>>8,0 ;NOP -> already at top for performance reasons
36: - 06B4 76FF0000 defb 0x76, 0xFF, 0x00, 0x00, 1, [dasm_76], [dasm_76]>>8, 0 ;HALT
01BB0B00
37: - 06BC F3FF0000 defb 0xF3, 0xFF, 0x00, 0x00, 1, [dasm_F3], [dasm_F3]>>8, 0 ;DI
01C00B00
38: - 06C4 FBFF0000 defb 0xFB, 0xFF, 0x00, 0x00, 1, [dasm_FB], [dasm_FB]>>8, 0 ;EI
01C30B00
39: - 06CC EDFF46FF defb 0xED, 0xFF, 0x46, 0xFF, 2, [dasm_ED_46], [dasm_ED_46]>>8, 0 ;IM 0
02C60B00
40: - 06D4 EDFF56FF defb 0xED, 0xFF, 0x56, 0xFF, 2, [dasm_ED_56], [dasm_ED_56]>>8, 0 ;IM 1
02CB0B00
41: - 06DC EDFF5EFF defb 0xED, 0xFF, 0x5E, 0xFF, 2, [dasm_ED_5E], [dasm_ED_5E]>>8, 0 ;IM 2
02D00B00
42:
43: ;Exchange, Block Transfer, and Search Group
44: - 06E4 EBFF0000 defb 0xEB, 0xFF, 0x00, 0x00, 1, [dasm_BE], [dasm_BE]>>8, 0 ;EX DE, HL
01D50B00
45: - 06EC 08FF0000 defb 0x08, 0xFF, 0x00, 0x00, 1, [dasm_08], [dasm_08]>>8, 0 ;EX AF, AF
01DF0B00
46: - 06F4 D9FF0000 defb 0xD9, 0xFF, 0x00, 0x00, 1, [dasm_D9], [dasm_D9]>>8, 0 ;EXX
01EC0B00
47: - 06FC E3FF0000 defb 0xE3, 0xFF, 0x00, 0x00, 1, [dasm_E3], [dasm_E3]>>8, 0 ;EX (SP), HL
01F00B00
48: - 0704 DDFFE3FF defb 0xDD, 0xFF, 0xE3, 0xFF, 2, [dasm_DD_E3], [dasm_DD_E3]>>8, 0 ;EX (SP), IX
02FC0B00
49: - 070C FDFFE3FF defb 0xFD, 0xFF, 0xE3, 0xFF, 2, [dasm_FD_E3], [dasm_FD_E3]>>8, 0 ;EX (SP), IY
02080C00
50: - 0714 EDFFA0FF defb 0xED, 0xFF, 0xA0, 0xFF, 2, [dasm_ED_A0], [dasm_ED_A0]>>8, 0 ;LDI
02140C00
51: - 071C EDFFB0FF defb 0xED, 0xFF, 0xB0, 0xFF, 2, [dasm_ED_B0], [dasm_ED_B0]>>8, 0 ;LDIR
02180C00
52: - 0724 EDFFA8FF defb 0xED, 0xFF, 0xA8, 0xFF, 2, [dasm_ED_A8], [dasm_ED_A8]>>8, 0 ;LDD
021D0C00
53: - 072C EDFFB8FF defb 0xED, 0xFF, 0xB8, 0xFF, 2, [dasm_ED_B8], [dasm_ED_B8]>>8, 0 ;LDDR
02210C00
54: - 0734 EDFFA1FF defb 0xED, 0xFF, 0xA1, 0xFF, 2, [dasm_ED_A1], [dasm_ED_A1]>>8, 0 ;CPI
02260C00
55: - 073C EDFFB1FF defb 0xED, 0xFF, 0xB1, 0xFF, 2, [dasm_ED_B1], [dasm_ED_B1]>>8, 0 ;CPIR
022A0C00
56: - 0744 EDFFA9FF defb 0xED, 0xFF, 0xA9, 0xFF, 2, [dasm_ED_A9], [dasm_ED_A9]>>8, 0 ;CPD
022F0C00
57: - 074C EDFFB9FF defb 0xED, 0xFF, 0xB9, 0xFF, 2, [dasm_ED_B9], [dasm_ED_B9]>>8, 0 ;CPDR
02330C00
58:
59: ;JUMP Group
60: - 0754 C3FF0000 defb 0xC3, 0xFF, 0x00, 0x00, 3, [dasm_C3], [dasm_C3]>>8,1, 0x01 ;JP nn
03E00A01
01
61: - 075D C2C70000 defb 0xC2, 0xC7, 0x00, 0x00, 3, [dasm_C3], [dasm_C3]>>8,3, 0x02, 0x80, 0x01 ;JP cc,nn
03E00A03
028001
62: - 0768 18FF0000 defb 0x18, 0xFF, 0x00, 0x00, 2, [dasm_18], [dasm_18]>>8,1, 0x03 ;JR e
02E70A01
03
63: - 0771 38FF0000 defb 0x38, 0xFF, 0x00, 0x00, 2, [dasm_38], [dasm_38]>>8,1, 0x03 ;JR C,e
02EB0A01
03
64: - 077A 30FF0000 defb 0x30, 0xFF, 0x00, 0x00, 2, [dasm_30], [dasm_30]>>8,1, 0x03 ;JR NC,e
02F20A01
03
65: - 0783 28FF0000 defb 0x28, 0xFF, 0x00, 0x00, 2, [dasm_28], [dasm_28]>>8,1, 0x03 ;JR Z,e
02FA0A01
03
66: - 078C 20FF0000 defb 0x20, 0xFF, 0x00, 0x00, 2, [dasm_20], [dasm_20]>>8,1, 0x03 ;JR NZ,e
02010B01
03
67: - 0795 E9FF0000 defb 0xE9, 0xFF, 0x00, 0x00, 2, [dasm_E9], [dasm_E9]>>8,0 ;JP (HL)
02090B00
68: - 079D DDFFE9FF defb 0xDD, 0xFF, 0xE9, 0xFF, 2, [dasm_DD], [dasm_DD]>>8,0 ;JP (IX)
02120B00
69: - 07A5 FDFFE9FF defb 0xFD, 0xFF, 0xE9, 0xFF, 2, [dasm_FD], [dasm_FD]>>8,0 ;JP (IY)
021B0B00
70: - 07AD 10FF0000 defb 0x10, 0xFF, 0x00, 0x00, 2, [dasm_10], [dasm_10]>>8,1, 0x03 ;DJNZ, e
02240B01
03
71: ;Call and Return Group
72: - 07B6 CDFF0000 defb 0xCD, 0xFF, 0x00, 0x00, 3, [dasm_CD], [dasm_CD]>>8,1, 0x01 ;CALL nn
032A0B01
01
73: - 07BF C4C70000 defb 0xC4, 0xC7, 0x00, 0x00, 3, [dasm_CD], [dasm_CD]>>8,2, 0x02, 0x01 ;CALL cc,nn
032A0B02
0201
74: - 07C9 C9FF0000 defb 0xC9, 0xFF, 0x00, 0x00, 1, [dasm_C9], [dasm_C9]>>8,0 ;RET
01300B00
75: - 07D1 C0C70000 defb 0xC0, 0xC7, 0x00, 0x00, 1, [dasm_C9], [dasm_C9]>>8,1, 0x02 ;RET cc
01300B01
02
76: - 07DA EDFF4DFF defb 0xED, 0xFF, 0x4D, 0xFF, 2, [dasm_ED_4D], [dasm_ED_4D]>>8,0 ;RETI
02350B00
77: - 07E2 EDFF45FF defb 0xED, 0xFF, 0x45, 0xFF, 2, [dasm_ED_45], [dasm_ED_45]>>8,0 ;RETN
023A0B00
78:
79: - 07EA C7C70000 defb 0xC7, 0xC7, 0x00, 0x00, 1, [dasm_FF], [dasm_FF]>>8,1, 0x05 ;RST
013F0B01
05
80: ;8-Bit load group
81: - 07F3 0AFF0000 defb 0x0A, 0xFF, 0x00, 0x00, 1, [dasm_0A], [dasm_0A]>>8, 0 ;LD A, (BC)
01440B00
82: - 07FB 1AFF0000 defb 0x1A, 0xFF, 0x00, 0x00, 1, [dasm_1A], [dasm_1A]>>8, 0 ;LD A, (DE)
014E0B00
83: - 0803 3AFF0000 defb 0x3A, 0xFF, 0x00, 0x00, 3, [dasm_3A], [dasm_3A]>>8, 2, 0x09, 0x80 ;LD A, (nn)
03580B02
0980
84: - 080D 02FF0000 defb 0x02, 0xFF, 0x00, 0x00, 1, [dasm_02], [dasm_02]>>8, 0 ;LD (BC), A
01620B00
85: - 0815 12FF0000 defb 0x12, 0xFF, 0x00, 0x00, 1, [dasm_12], [dasm_12]>>8, 0 ;LD (DE), A
016D0B00
86: - 081D 32FF0000 defb 0x32, 0xFF, 0x00, 0x00, 3, [dasm_32], [dasm_32]>>8, 2, 0x09, 0x80 ;LD (nn), A
03780B02
0980
87: - 0827 EDFF57FF defb 0xED, 0xFF, 0x57, 0xFF, 2, [dasm__ED_57], [dasm__ED_57]>>8, 0 ;LD A, I
02870B00
88: - 082F EDFF5FFF defb 0xED, 0xFF, 0x5F, 0xFF, 2, [dasm__ED_5F], [dasm__ED_5F]>>8, 0 ;LD A, R
028F0B00
89: - 0837 EDFF47FF defb 0xED, 0xFF, 0x47, 0xFF, 2, [dasm__ED_47], [dasm__ED_47]>>8, 0 ;LD I, A
02970B00
90: - 083F EDFF4FFF defb 0xED, 0xFF, 0x4F, 0xFF, 2, [dasm__ED_4F], [dasm__ED_4F]>>8, 0 ;LD R, A
029F0B00
91:
92: - 0847 06C70000 defb 0x06, 0xC7, 0x00, 0x00, 2, [dasm__LD], [dasm__LD]>>8, 2, 0x06, 0x08 ;LD r, n
02830B02
0608
93: - 0851 40C00000 defb 0x40, 0xC0, 0x00, 0x00, 1, [dasm__LD], [dasm__LD]>>8, 2, 0x06, 0x07 ;LD r, r' / LD r, (HL) / LD (HL), r
01830B02
0607
94:
95: ;8-Bit Arithmetic Group
96: - 085B 80F80000 defb 0x80, 0xF8, 0x00, 0x00, 1, [dasm_80C6], [dasm_80C6]>>8, 1, 0x07 ;ADD A, r / ADD A, (HL)
01380C01
07
97: - 0864 C6FF0000 defb 0xC6, 0xFF, 0x00, 0x00, 2, [dasm_80C6], [dasm_80C6]>>8, 1, 0x08 ;ADD A, n
02380C01
08
98: - 086D DDFF86FF defb 0xDD, 0xFF, 0x86, 0xFF, 3, [dasm_DD_86], [dasm_DD_86]>>8, 2, 0x08, 0x80 ;ADD A, (IX + d)
03400C02
0880
99: - 0877 FDFF86FF defb 0xFD, 0xFF, 0x86, 0xFF, 3, [dasm_FD_86], [dasm_FD_86]>>8, 2, 0x08, 0x80 ;ADD A, (IY + d)
034F0C02
0880
100: - 0881 C8F80000 defb 0xC8, 0xF8, 0x00, 0x00, 1, [dasm_C88E], [dasm_C88E]>>8, 1, 0x07 ;ADC A, r / ADC A, (HL)
015E0C01
07
101: - 088A 8EF80000 defb 0x8E, 0xF8, 0x00, 0x00, 2, [dasm_C88E], [dasm_C88E]>>8, 1, 0x08 ;ADC A, n
025E0C01
08
102: - 0893 DDFF8EFF defb 0xDD, 0xFF, 0x8E, 0xFF, 3, [dasm_DD_8E], [dasm_DD_8E]>>8, 2, 0x08, 0x80 ;ADC A, (IX + d)
03660C02
0880
103: - 089D FDFF8EFF defb 0xFD, 0xFF, 0x8E, 0xFF, 3, [dasm_FD_8E], [dasm_FD_8E]>>8, 2, 0x08, 0x80 ;ADC A, (IY + d)
03750C02
0880
104: - 08A7 90F80000 defb 0x90, 0xF8, 0x00, 0x00, 1, [dasm__SUB], [dasm__SUB]>>8, 1, 0x07 ;SUB r / SUB A, (HL)
01840C01
07
105: - 08B0 D6FF0000 defb 0xD6, 0xFF, 0x00, 0x00, 2, [dasm__SUB], [dasm__SUB]>>8, 1, 0x08 ;SUB n
02840C01
08
106: - 08B9 DDFF96FF defb 0xDD, 0xFF, 0x96, 0xFF, 3, [dasm_DD_96], [dasm_DD_96]>>8, 2, 0x08, 0x80 ;SUB (IX + d)
03890C02
0880
107: - 08C3 FDFF96FF defb 0xFD, 0xFF, 0x96, 0xFF, 3, [dasm_FD_96], [dasm_FD_96]>>8, 2, 0x08, 0x80 ;SUB (IY + d)
03950C02
0880
108: - 08CD 94F80000 defb 0x94, 0xF8, 0x00, 0x00, 1, [dasm__SBC], [dasm__SBC]>>8, 1, 0x07 ;SBC A,r / SBC A, (HL)
01A10C01
07
109: - 08D6 DEFF0000 defb 0xDE, 0xFF, 0x00, 0x00, 2, [dasm__SBC], [dasm__SBC]>>8, 1, 0x08 ;SBC A,n
02A10C01
08
110: - 08DF DDFF9EFF defb 0xDD, 0xFF, 0x9E, 0xFF, 3, [dasm_DD_9E], [dasm_DD_9E]>>8, 2, 0x08, 0x80 ;SBC A,(IX + d)
03A90C02
0880
111: - 08E9 FDFF9EFF defb 0xFD, 0xFF, 0x9E, 0xFF, 3, [dasm_FD_9E], [dasm_FD_9E]>>8, 2, 0x08, 0x80 ;SBC A,(IY + d)
03B70C02
0880
112: - 08F3 A0F80000 defb 0xA0, 0xF8, 0x00, 0x00, 1, [dasm__AND], [dasm__AND]>>8, 1, 0x07 ;AND A,r / AND A, (HL)
01C50C01
07
113: - 08FC E6FF0000 defb 0xE6, 0xFF, 0x00, 0x00, 2, [dasm__AND], [dasm__AND]>>8, 1, 0x08 ;AND A,n
02C50C01
08
114: - 0905 DDFFA6FF defb 0xDD, 0xFF, 0xA6, 0xFF, 3, [dasm_DD_A6], [dasm_DD_A6]>>8, 2, 0x08, 0x80 ;AND A,(IX + d)
03CA0C02
0880
115: - 090F FDFFA6FF defb 0xFD, 0xFF, 0xA6, 0xFF, 3, [dasm_FD_A6], [dasm_FD_A6]>>8, 2, 0x08, 0x80 ;AND A,(IY + d)
03D60C02
0880
116: - 0919 B0F80000 defb 0xB0, 0xF8, 0x00, 0x00, 1, [dasm__OR], [dasm__OR]>>8, 1, 0x07 ;OR A,r / OR A, (HL)
01E20C01
07
117: - 0922 F6FF0000 defb 0xF6, 0xFF, 0x00, 0x00, 2, [dasm__OR], [dasm__OR]>>8, 1, 0x08 ;OR A,n
02E20C01
08
118: - 092B DDFFB6FF defb 0xDD, 0xFF, 0xB6, 0xFF, 3, [dasm_DD_B6], [dasm_DD_B6]>>8, 2, 0x08, 0x80 ;OR A,(IX + d)
03E60C02
0880
119: - 0935 FDFFB6FF defb 0xFD, 0xFF, 0xB6, 0xFF, 3, [dasm_FD_B6], [dasm_FD_B6]>>8, 2, 0x08, 0x80 ;OR A,(IY + d)
03F10C02
0880
120: - 093F A8F80000 defb 0xA8, 0xF8, 0x00, 0x00, 1, [dasm__XOR], [dasm__XOR]>>8, 1, 0x07 ;XOR A,r / XOR A, (HL)
01FC0C01
07
121: - 0948 EEFF0000 defb 0xEE, 0xFF, 0x00, 0x00, 2, [dasm__XOR], [dasm__XOR]>>8, 1, 0x08 ;XOR A,n
02FC0C01
08
122: - 0951 DDFFAEFF defb 0xDD, 0xFF, 0xAE, 0xFF, 3, [dasm_DD_AE], [dasm_DD_AE]>>8, 2, 0x08, 0x80 ;XOR A,(IX + d)
03010D02
0880
123: - 095B FDFFAEFF defb 0xFD, 0xFF, 0xAE, 0xFF, 3, [dasm_FD_AE], [dasm_FD_AE]>>8, 2, 0x08, 0x80 ;XOR A,(IY + d)
030D0D02
0880
124: - 0965 B8F80000 defb 0xB8, 0xF8, 0x00, 0x00, 1, [dasm__CP], [dasm__CP]>>8, 1, 0x07 ;CP A,r / CP A, (HL)
01190D01
07
125: - 096E FEFF0000 defb 0xFE, 0xFF, 0x00, 0x00, 2, [dasm__CP], [dasm__CP]>>8, 1, 0x08 ;CP A,n
02190D01
08
126: - 0977 DDFFBEFF defb 0xDD, 0xFF, 0xBE, 0xFF, 3, [dasm_DD_BE], [dasm_DD_BE]>>8, 2, 0x08, 0x80 ;CP A,(IX + d)
031D0D02
0880
127: - 0981 FDFFBEFF defb 0xFD, 0xFF, 0xBE, 0xFF, 3, [dasm_FD_BE], [dasm_FD_BE]>>8, 2, 0x08, 0x80 ;CP A,(IY + d)
03280D02
0880
128: - 098B 04C70000 defb 0x04, 0xC7, 0x00, 0x00, 1, [dasm__INC], [dasm__INC]>>8, 1, 0x10 ;INC r / INC (HL)
01330D01
10
129: - 0994 DDFF34FF defb 0xDD, 0xFF, 0x34, 0xFF, 3, [dasm_DD_34], [dasm_DD_34]>>8, 2, 0x08, 0x80 ;INC (IX + d)
03380D02
0880
130: - 099E FDFF34FF defb 0xFD, 0xFF, 0x34, 0xFF, 3, [dasm_FD_34], [dasm_FD_34]>>8, 2, 0x08, 0x80 ;INC (IY + d)
03440D02
0880
131: - 09A8 05C70000 defb 0x05, 0xC7, 0x00, 0x00, 1, [dasm__DEC], [dasm__DEC]>>8, 1, 0x10 ;DEC r / DEC (HL)
01500D01
10
132: - 09B1 DDFF35FF defb 0xDD, 0xFF, 0x35, 0xFF, 3, [dasm_DD_35], [dasm_DD_35]>>8, 2, 0x08, 0x80 ;DEC (IX + d)
03550D02
0880
133: - 09BB FDFF35FF defb 0xFD, 0xFF, 0x35, 0xFF, 3, [dasm_FD_35], [dasm_FD_35]>>8, 2, 0x08, 0x80 ;DEC (IY + d)
03610D02
0880
134: ;16-Bit Arithmetic Group
135: - 09C5 09CF0000 defb 0x09, 0xCF, 0x00, 0x00, 1, [dasm_09], [dasm_09]>>8, 1, 0x11 ;ADD HL, ss
016D0D01
11
136: - 09CE EDFF4ACF defb 0xED, 0xFF, 0x4A, 0xCF, 2, [dasm_ED_4A], [dasm_ED_4A]>>8, 1, 0x12 ;ADC HL, ss
02760D01
12
137: - 09D7 EDFF42CF defb 0xED, 0xFF, 0x42, 0xCF, 2, [dasm_ED_42], [dasm_ED_42]>>8, 1, 0x12 ;SBC HL, ss
027F0D01
12
138: - 09E0 DDFF09CF defb 0xDD, 0xFF, 0x09, 0xCF, 2, [dasm_DD_09], [dasm_DD_09]>>8, 1, 0x12 ;ADD IX, ss
02880D01
12
139: - 09E9 FDFF09CF defb 0xFD, 0xFF, 0x09, 0xCF, 2, [dasm_FD_09], [dasm_FD_09]>>8, 1, 0x12 ;ADD IY, ss
02910D01
12
140: - 09F2 03CF0000 defb 0x03, 0xCF, 0x00, 0x00, 1, [dasm_03], [dasm_03]>>8, 1, 0x11 ;INC ss
019A0D01
11
141: - 09FB DDFF23FF defb 0xDD, 0xFF, 0x23, 0xFF, 2, [dasm_DD_23], [dasm_DD_23]>>8, 0 ;INC IX
029F0D00
142: - 0A03 FDFF23FF defb 0xFD, 0xFF, 0x23, 0xFF, 2, [dasm_FD_23], [dasm_FD_23]>>8, 0 ;INC IY
02A80D00
143: - 0A0B 0BCF0000 defb 0x0B, 0xCF, 0x00, 0x00, 1, [dasm_0B], [dasm_0B]>>8, 1, 0x11 ;DEC ss
01B10D01
11
144: - 0A14 DDFF2BFF defb 0xDD, 0xFF, 0x2B, 0xFF, 2, [dasm_DD_2B], [dasm_DD_2B]>>8, 0 ;DEC IX
02B60D00
145: - 0A1C FDFF2BFF defb 0xFD, 0xFF, 0x2B, 0xFF, 2, [dasm_FD_2B], [dasm_FD_2B]>>8, 0 ;DEC IY
02BF0D00
146: ;16-Bit Load Group
147: - 0A24 01CF0000 defb 0x01, 0xCF, 0x00, 0x00, 3, [dasm_01], [dasm_01]>>8, 3, 0x11, 0x80, 0x09 ;LD dd, nn
03C80D03
118009
148: - 0A2F DDFF21FF defb 0xDD, 0xFF, 0x21, 0xFF, 4, [dasm_DD_01], [dasm_DD_01]>>8, 1, 0x0A ;LD IX, nn
04CF0D01
0A
149: - 0A38 FDFF21FF defb 0xFD, 0xFF, 0x21, 0xFF, 4, [dasm_FD_01], [dasm_FD_01]>>8, 1, 0x0A ;LD IY, nn
04D70D01
0A
150: - 0A41 2AFF0000 defb 0x2A, 0xFF, 0x00, 0x00, 3, [dasm_2A], [dasm_2A]>>8, 2, 0x09, 0x80 ;LD HL, (nn)
03DF0D02
0980
151: - 0A4B EDFF4BCF defb 0xED, 0xFF, 0x4B, 0xCF, 4, [dasm_ED_4B], [dasm_ED_4B]>>8, 4, 0x12, 0x80, 0x0A, 0x81 ;LD dd, (nn)
04EB0D04
12800A81
152: - 0A57 DDFF2AFF defb 0xDD, 0xFF, 0x2A, 0xFF, 4, [dasm_DD_2A], [dasm_DD_2A]>>8, 1, 0x0A ;LD IX, (nn)
04F60D01
0A
153: - 0A60 FDFF2AFF defb 0xFD, 0xFF, 0x2A, 0xFF, 4, [dasm_FD_2A], [dasm_FD_2A]>>8, 1, 0x0A ;LD IY, (nn)
04020E01
0A
154: - 0A69 22FF0000 defb 0x22, 0xFF, 0x00, 0x00, 3, [dasm_22], [dasm_22]>>8, 2, 0x0A, 0x80 ;LD (nn), HL
030E0E02
0A80
155: - 0A73 EDFF43CF defb 0xED, 0xFF, 0x43, 0xCF, 4, [dasm_ED_43], [dasm_ED_43]>>8, 3, 0x0A, 0x80, 0x12 ;LD (nn), dd
041A0E03
0A8012
156: - 0A7E DDFF22CF defb 0xDD, 0xFF, 0x22, 0xCF, 4, [dasm_DD_22], [dasm_DD_22]>>8, 2, 0x0A, 0x80 ;LD (nn), IX
04240E02
0A80
157: - 0A88 FDFF22CF defb 0xFD, 0xFF, 0x22, 0xCF, 4, [dasm_FD_22], [dasm_FD_22]>>8, 2, 0x0A, 0x80 ;LD (nn), IY
04300E02
0A80
158: - 0A92 F9FF0000 defb 0xF9, 0xFF, 0x00, 0x00, 1, [dasm_F9], [dasm_F9]>>8, 0 ;LD SP, HL
013C0E00
159: - 0A9A DDFFF9FF defb 0xDD, 0xFF, 0xF9, 0xFF, 2, [dasm_DD_F9], [dasm_DD_F9]>>8, 0 ;LD SP, IX
02460E00
160: - 0AA2 FDFFF9FF defb 0xFD, 0xFF, 0xF9, 0xFF, 2, [dasm_FD_F9], [dasm_FD_F9]>>8, 0 ;LD SP, IY
02500E00
161: - 0AAA C5CF0000 defb 0xC5, 0xCF, 0x00, 0x00, 1, [dasm_E5], [dasm_E5]>>8, 1, 0x13 ;PUSH qq
015A0E01
13
162: - 0AB3 DDFFE5FF defb 0xDD, 0xFF, 0xE5, 0xFF, 2, [dasm_DD_E5], [dasm_DD_E5]>>8, 0 ;PUSH IX
02600E00
163: - 0ABB FDFFE5FF defb 0xFD, 0xFF, 0xE5, 0xFF, 2, [dasm_FD_E5], [dasm_FD_E5]>>8, 0 ;PUSH IY
02680E00
164: - 0AC3 C1CF0000 defb 0xC1, 0xCF, 0x00, 0x00, 1, [dasm_E1], [dasm_E1]>>8, 1, 0x13 ;POP qq
01700E01
13
165: - 0ACC DDFFE1FF defb 0xDD, 0xFF, 0xE1, 0xFF, 2, [dasm_DD_E1], [dasm_DD_E1]>>8, 0 ;POP IX
02760E00
166: - 0AD4 FDFFE1FF defb 0xFD, 0xFF, 0xE1, 0xFF, 2, [dasm_FD_E1], [dasm_FD_E1]>>8, 0 ;POP IY
027E0E00
167:
168:
169: - 0ADC 4E4F5000 dasm_00: db "NOP",0x00
170: ;JUMP Group
171: - 0AE0 4A502000 dasm_C3: db "JP ",0x00,", ",0x00
2C2000
172: - 0AE7 4A522000 dasm_18: db "JR ",0x00
173: - 0AEB 4A522043 dasm_38: db "JR C, ",0x00
2C2000
174: - 0AF2 4A52204E dasm_30: db "JR NC, ",0x00
432C2000
175: - 0AFA 4A52205A dasm_28: db "JR Z, ",0x00
2C2000
176: - 0B01 4A52204E dasm_20: db "JR NZ, ",0x00
5A2C2000
177: - 0B09 4A502028 dasm_E9: db "JP (HL) ",0x00
484C2920
00
178: - 0B12 4A502028 dasm_DD: db "JP (IX) ",0x00
49582920
00
179: - 0B1B 4A502028 dasm_FD: db "JP (IY) ",0x00
49592920
00
180: - 0B24 444A4E5A dasm_10: db "DJNZ ",0x00
2000
181: ;Call and Return Group
182: - 0B2A 43414C4C dasm_CD: db "CALL ",0x00
2000
183: - 0B30 52455420 dasm_C9: db "RET ",0x00
00
184: - 0B35 52455449 dasm_ED_4D: db "RETI",0x00
00
185: - 0B3A 5245544E dasm_ED_45: db "RETN",0x00
00
186: - 0B3F 52535420 dasm_FF: db "RST ",0x00
00
187: ;8-Bit load group
188: - 0B44 4C442041 dasm_0A: db "LD A,(BC)",0x00
2C284243
2900
189: - 0B4E 4C442041 dasm_1A: db "LD A,(DE)",0x00
2C284445
2900
190: - 0B58 4C442041 dasm_3A: db "LD A,(",0x00, "h)",0x00
2C280068
2900
191: - 0B62 4C442028 dasm_02: db "LD (BC), A",0x00
4243292C
204100
192: - 0B6D 4C442028 dasm_12: db "LD (DE), A",0x00
4445292C
204100
193: - 0B78 4C442028 dasm_32: db "LD (",0x00, "h), A",0x00
0068292C
204100
194: - 0B83 4C442000 dasm__LD: db "LD ",0x00
195: - 0B87 4C442041 dasm__ED_57: db "LD A, I",0x00
2C204900
196: - 0B8F 4C442041 dasm__ED_5F: db "LD A, R",0x00
2C205200
197: - 0B97 4C442049 dasm__ED_47: db "LD I, A",0x00
2C204100
198: - 0B9F 4C442052 dasm__ED_4F: db "LD R, A",0x00
2C204100
199: ;General-Purpose Arithmetic and CPU Control Groups
200: - 0BA7 44414100 dasm_27: db "DAA",0x00
201: - 0BAB 43504C00 dasm_2F: db "CPL",0x00
202: - 0BAF 4E454700 dasm_ED_44: db "NEG",0x00
203: - 0BB3 43434600 dasm_3F: db "CCF",0x00
204: - 0BB7 53434600 dasm_37: db "SCF",0x00
205: - 0BBB 48414C54 dasm_76: db "HALT",0x00
00
206: - 0BC0 444900 dasm_F3: db "DI",0x00
207: - 0BC3 454900 dasm_FB: db "EI",0x00
208: - 0BC6 494D2030 dasm_ED_46: db "IM 0",0x00
00
209: - 0BCB 494D2031 dasm_ED_56: db "IM 1",0x00
00
210: - 0BD0 494D2032 dasm_ED_5E: db "IM 2",0x00
00
211: ;Exchange, Block Transfer, and Search Group
212: - 0BD5 45582044 dasm_BE: db "EX DE, HL",0x00
452C2048
4C00
213: - 0BDF 45582041 dasm_08: db "EX AF, AF",0x00
462C2041
46E280B2
00
214: - 0BEC 45585800 dasm_D9: db "EXX",0x00
215: - 0BF0 45582028 dasm_E3: db "EX (SP), HL",0x00
5350292C
20484C00
216: - 0BFC 45582028 dasm_DD_E3: db "EX (SP), IX",0x00
5350292C
20495800
217: - 0C08 45582028 dasm_FD_E3: db "EX (SP), IY",0x00
5350292C
20495900
218: - 0C14 4C444900 dasm_ED_A0: db "LDI",0x00
219: - 0C18 4C444952 dasm_ED_B0: db "LDIR",0x00
00
220: - 0C1D 4C444400 dasm_ED_A8: db "LDD",0x00
221: - 0C21 4C444452 dasm_ED_B8: db "LDDR",0x00
00
222: - 0C26 43504900 dasm_ED_A1: db "CPI",0x00
223: - 0C2A 43504952 dasm_ED_B1: db "CPIR",0x00
00
224: - 0C2F 43504400 dasm_ED_A9: db "CPD",0x00
225: - 0C33 43504452 dasm_ED_B9: db "CPDR",0x00
00
226: ;8-Bit Arithmetic Group
227: - 0C38 41444420 dasm_80C6: db "ADD A, ", 0x00
412C2000
228: - 0C40 41444420 dasm_DD_86: db "ADD A, (IX+", 0x00, "h)",0x00
412C2028
49582B00
682900
229: - 0C4F 41444420 dasm_FD_86: db "ADD A, (IY+", 0x00, "h)",0x00
412C2028
49592B00
682900
230: - 0C5E 41444320 dasm_C88E: db "ADC A, ", 0x00
412C2000
231: - 0C66 41444320 dasm_DD_8E: db "ADC A, (IX+", 0x00, "h)",0x00
412C2028
49582B00
682900
232: - 0C75 41444320 dasm_FD_8E: db "ADC A, (IY+", 0x00, "h)",0x00
412C2028
49592B00
682900
233: - 0C84 53554220 dasm__SUB: db "SUB ", 0x00
00
234: - 0C89 53554220 dasm_DD_96: db "SUB (IX+", 0x00, "h)",0x00
2849582B
00682900
235: - 0C95 53554220 dasm_FD_96: db "SUB (IY+", 0x00, "h)",0x00
2849592B
00682900
236: - 0CA1 53424320 dasm__SBC: db "SBC A, ", 0x00
412C2000
237: - 0CA9 53424320 dasm_DD_9E: db "SBC A,(IX+", 0x00, "h)",0x00
412C2849
582B0068
2900
238: - 0CB7 53424320 dasm_FD_9E: db "SBC A,(IY+", 0x00, "h)",0x00
412C2849
592B0068
2900
239: - 0CC5 414E4420 dasm__AND: db "AND ", 0x00
00
240: - 0CCA 414E4420 dasm_DD_A6: db "AND (IX+", 0x00, "h)",0x00
2849582B
00682900
241: - 0CD6 414E4420 dasm_FD_A6: db "AND (IY+", 0x00, "h)",0x00
2849592B
00682900
242: - 0CE2 4F522000 dasm__OR: db "OR ", 0x00
243: - 0CE6 4F522028 dasm_DD_B6: db "OR (IX+", 0x00, "h)",0x00
49582B00
682900
244: - 0CF1 4F522028 dasm_FD_B6: db "OR (IY+", 0x00, "h)",0x00
49592B00
682900
245: - 0CFC 584F5220 dasm__XOR: db "XOR ", 0x00
00
246: - 0D01 584F5220 dasm_DD_AE: db "XOR (IX+", 0x00, "h)",0x00
2849582B
00682900
247: - 0D0D 584F5220 dasm_FD_AE: db "XOR (IY+", 0x00, "h)",0x00
2849592B
00682900
248: - 0D19 43502000 dasm__CP: db "CP ", 0x00
249: - 0D1D 43502028 dasm_DD_BE: db "CP (IX+", 0x00, "h)",0x00
49582B00
682900
250: - 0D28 43502028 dasm_FD_BE: db "CP (IY+", 0x00, "h)",0x00
49592B00
682900
251: - 0D33 494E4320 dasm__INC: db "INC ", 0x00
00
252: - 0D38 494E4320 dasm_DD_34: db "INC (IX+", 0x00, "h)",0x00
2849582B
00682900
253: - 0D44 494E4320 dasm_FD_34: db "INC (IY+", 0x00, "h)",0x00
2849592B
00682900
254: - 0D50 44454320 dasm__DEC: db "DEC ", 0x00
00
255: - 0D55 44454320 dasm_DD_35: db "DEC (IX+", 0x00, "h)",0x00
2849582B
00682900
256: - 0D61 44454320 dasm_FD_35: db "DEC (IY+", 0x00, "h)",0x00
2849592B
00682900
257: ;16-Bit Arithmetic Group
258: - 0D6D 41444420 dasm_09: db "ADD HL, ",0x00
484C2C20
00
259: - 0D76 41444320 dasm_ED_4A: db "ADC HL, ",0x00
484C2C20
00
260: - 0D7F 53424320 dasm_ED_42: db "SBC HL, ",0x00
484C2C20
00
261: - 0D88 41444420 dasm_DD_09: db "ADD IX, ",0x00
49582C20
00
262: - 0D91 41444420 dasm_FD_09: db "ADD IY, ",0x00
49592C20
00
263: - 0D9A 494E4320 dasm_03: db "INC ",0x00
00
264: - 0D9F 494E4320 dasm_DD_23: db "INC IX, ",0x00
49582C20
00
265: - 0DA8 494E4320 dasm_FD_23: db "INC IY, ",0x00
49592C20
00
266: - 0DB1 44454320 dasm_0B: db "DEC ",0x00
00
267: - 0DB6 44454320 dasm_DD_2B: db "DEC IX, ",0x00
49582C20
00
268: - 0DBF 44454320 dasm_FD_2B: db "DEC IY, ",0x00
49592C20
00
269: ;16-Bit Load Group
270: - 0DC8 4C442000 dasm_01: db "LD ",0x00, ", ",0x00
2C2000
271: - 0DCF 4C442049 dasm_DD_01: db "LD IX, ",0x00
582C2000
272: - 0DD7 4C442049 dasm_FD_01: db "LD IY, ",0x00
592C2000
273: - 0DDF 4C442048 dasm_2A: db "LD HL, (",0x00,"h)",0x00
4C2C2028
00682900
274: - 0DEB 4C442000 dasm_ED_4B: db "LD ",0x00,", (",0x00,"h)",0x00
2C202800
682900
275: - 0DF6 4C442049 dasm_DD_2A: db "LD IX, (",0x00,"h)",0x00
582C2028
00682900
276: - 0E02 4C442049 dasm_FD_2A: db "LD IY, (",0x00,"h)",0x00
592C2028
00682900
277: - 0E0E 4C442028 dasm_22: db "LD (",0x00,"h), HL",0x00
0068292C
20484C00
278: - 0E1A 4C442028 dasm_ED_43: db "LD (",0x00,"h), ",0x00
0068292C
2000
279: - 0E24 4C442028 dasm_DD_22: db "LD (",0x00,"h), IX",0x00
0068292C
20495800
280: - 0E30 4C442028 dasm_FD_22: db "LD (",0x00,"h), IY",0x00
0068292C
20495900
281: - 0E3C 4C442053 dasm_F9: db "LD SP, HL",0x00
502C2048
4C00
282: - 0E46 4C442053 dasm_DD_F9: db "LD SP, IX",0x00
502C2049
5800
283: - 0E50 4C442053 dasm_FD_F9: db "LD SP, IY",0x00
502C2049
5900
284: - 0E5A 50555348 dasm_E5: db "PUSH ",0x00
2000
285: - 0E60 50555348 dasm_DD_E5: db "PUSH IX",0x00
20495800
286: - 0E68 50555348 dasm_FD_E5: db "PUSH IY",0x00
20495900
287: - 0E70 50555348 dasm_E1: db "PUSH ",0x00
2000
288: - 0E76 50555348 dasm_DD_E1: db "PUSH IX",0x00
20495800
289: - 0E7E 50555348 dasm_FD_E1: db "PUSH IY",0x00
20495900
290:
291: ;Misc
292: - 0E86 2E3F2E00 dasm_UU: db ".?.",0x00
293: - 0E8A 20202020 dasm_UW: db " ",0x00
00
294:
295: - 0E8F dasm_printFlags_table:
296: - 0E8F 4E5A db "NZ"
297: - 0E91 5A00 db "Z",0
298: - 0E93 4E43 db "NC"
299: - 0E95 4300 db "C",0
300: - 0E97 504F db "PO"
301: - 0E99 5045 db "PE"
302: - 0E9B 5000 db "P",0
303: - 0E9D 4D00 db "M",0
304:
305: - 0E9F dasm_printRegister8_table:
306: - 0E9F 42 db "B"
307: - 0EA0 43 db "C"
308: - 0EA1 44 db "D"
309: - 0EA2 45 db "E"
310: - 0EA3 48 db "H"
311: - 0EA4 4C db "L"
312: - 0EA5 53 db "S" ;only 18 bit (SP)
313: - 0EA6 50 db "P" ;only 18 bit (SP)
314:
315: - 0EA7 dasm_printRegisterIX_table:
316: - 0EA7 4243 db "BC"
317: - 0EA9 4445 db "DE"
318: - 0EAB 4958 db "IX"
319: - 0EAD 5350 db "SP"
320: - 0EAF dasm_printRegisterIY_table:
321: - 0EAF 4243 db "BC"
322: - 0EB1 4445 db "DE"
323: - 0EB3 4959 db "IY"
324: - 0EB5 5350 db "SP"
325:
326: - 0EB7 dasm_printRegisterSP_table:
327: - 0EB7 4243 db "BC"
328: - 0EB9 4445 db "DE"
329: - 0EBB 484C db "HL"
330: - 0EBD 4146 db "AF"
331:
332: - 0EBF dasm_printRegister8_table_HL:
**** main.asm ****
496: - 0EBF 28484C29 db "(HL)", 0
00
497: .include "rst.s"
**** include/rst.s ****
1: - 0EC4 EXEC_RST_08:
2: 7944+17 0EC4 CDB702 call print_char
3: 7961+10 0EC7 C9 ret
4:
5:
6: - 0EC8 EXEC_RST_10:
7: 7971+11 0EC8 C5 push bc
8: 7982+11 0EC9 D5 push de
9: 7993+11 0ECA E5 push hl
10: ;call vdp_cursor_on
11: 8004+17 0ECB CDF802 call read_char
12: 8021+11 0ECE F5 push af
13: ;call vdp_cursor_off
14: 8032+10 0ECF F1 pop af
15: 8042+10 0ED0 E1 pop hl
16: 8052+10 0ED1 D1 pop de
17: 8062+10 0ED2 C1 pop bc
18: 8072+10 0ED3 C9 ret
19:
20: - 0ED4 EXEC_RST_18:
21: 8082+7 0ED4 3E00 ld a,0
22: 8089+10 0ED6 C9 ret
**** main.asm ****
498: .include "beep.s"
**** include/beep.s ****
1: ;------------------------------------------------------------------------------
2: ; beep
3: ;
4: ; Beeps the speaker
5: ; DE sets duration
6: ;------------------------------------------------------------------------------
7: - 0ED7 beep:
8: 8099+11 0ED7 F5 push AF
9: 8110+11 0ED8 C5 push BC
10: 8121+11 0ED9 D5 push DE
11: - 0EDA beep_loop:
12: 8132+7 0EDA 3E08 LD A,0x08
13: 8139+11 0EDC D3F4 OUT (CS_PIO_AD), A
14: 8150+10 0EDE 012800 LD BC, 0x28
15: 8160+17 0EE1 CDF70E CALL beep_pause
16: 8177+7 0EE4 3E00 LD A,0x00
17: 8184+11 0EE6 D3F4 OUT (CS_PIO_AD), A
18: 8195+10 0EE8 012400 LD BC, 0x24
19: 8205+17 0EEB CDF70E CALL beep_pause
20: 8222+6 0EEE 1B DEC DE
21: 8228+4 0EEF 7A ld A,D
22: 8232+4 0EF0 B3 or E
23: 8236+7+5 0EF1 20E7 jr NZ, beep_loop
24: 8243+10 0EF3 D1 pop de
25: 8253+10 0EF4 C1 pop bc
26: 8263+10 0EF5 F1 pop af
27: 8273+10 0EF6 C9 ret
28:
29: - 0EF7 beep_pause:
30: 8283+8 0EF7 ED44 NEG ; 8 T-states
31: 8291+8 0EF9 ED44 NEG ; 8 T-states
32: 8299+8 0EFB ED44 NEG ; 8 T-states
33: 8307+8 0EFD ED44 NEG ; 8 T-states
34: 8315+6 0EFF 0B DEC BC ; 6 T-states
35: 8321+4 0F00 79 LD A,C ; 9 T-states
36: 8325+4 0F01 B0 OR B ; 4 T-states
37: 8329+10 0F02 C2F70E JP NZ,beep_pause ; 10 T-states
**** main.asm ****
499: 8339+10 0F05 C9 RET ; Pause complete, RETurn
500: .include "xmodem.s"
**** include/xmodem.s ****
1: ;-------------------------------------------------------------------------
2: ; Z80 XMODEM implementation by Dennis Gunia
3: ; 2022 - www,dennisgunia.de
4: ;
5: ; important doc: https://web.mit.edu/6.115/www/amulet/xmodem.htm
6: ; http://www.blunk-electronic.de/train-z/pdf/xymodem.pdf
7: ;-------------------------------------------------------------------------
8:
9: ;Symbols
10: - 0001 SYM_SOH equ 0x01
11: - 0004 SYM_EOT equ 0x04
12: - 0006 SYM_ACK equ 0x06
13: - 0015 SYM_NAK equ 0x15
14: - 0017 SYM_ETB equ 0x17
15: - 0018 SYM_CAN equ 0x18
16: - 0043 SYM_C equ 0x43
17:
18: ;Memory locations
19: - 40FB MEM_VAR_BLOCK equ 0x40FB ;last block
20: - 40FC MEM_VAR_TIMEA equ 0x40FC ;timer var (mills)
21: - 40FE MEM_VAR_TIMER equ 0x40FE ;timer var (seconds)
22: - 40FE MEM_INT_VEC_T equ 0x40FE ;interrupt vector table
23:
24: - 4400 MEM_LOC_LOAD equ 0x4400 ;load location for program
25:
26: ;XMODEM routine
27: - 0F06 xmodem_init:
28: 8349+17 0F06 CD1203 call A_RTS_OFF
29:
30: 8366+7 0F09 3EA7 LD A,10100111b ; Init CTC Channel 3
31: 8373+11 0F0B D306 OUT (CS_CTC_2),A
32: 8384+7 0F0D 3E0E LD A,14 ; 1028.57Hz ISR
33: 8391+11 0F0F D306 OUT (CS_CTC_2),A
34: 8402+7 0F11 3E00 LD A,00h ; Set CTC Ch3 Interrupt Vector
35: 8409+11 0F13 D304 OUT (CS_CTC_0),A
36: ;load int vector to ram
37: 8420+10 0F15 21E60F ld hl,xmodem_int ;CTC Ch3 INT routine
38: 8430+16 0F18 220442 ld (0x4200 + 0x04),hl
39: ;reset timer vars
40: 8446+10 0F1B 210000 ld hl,0x0000
41: 8456+16 0F1E 22FC40 ld (MEM_VAR_TIMEA),hl
42: 8472+16 0F21 22FE40 ld (MEM_VAR_TIMER),hl
43:
44: 8488+7 0F24 3E42 ld a,0x42 ; Set interrupt vector register
45: 8495+9 0F26 ED47 ld i,a
46: 8504+8 0F28 ED5E im 2 ; Z80 Interrupt mode
47:
48: 8512+10 0F2A 216110 ld hl,MSG_START ; Print start banner
49: 8522+17 0F2D CDBF02 call print_str
50: 8539+4 0F30 FB ei ; Enable interrupts
51: ; init done. Continue with xmodem_await_conn
52: 8543+17 0F31 CD9710 call xmodem_wait
53:
54: - 0F34 xmodem_await_conn: ;Wait for initial connection
55: 8560+7 0F34 3E43 ld a, SYM_C ;Send C to notify sender, that we want CRC
56: 8567+17 0F36 CD3710 call xmodem_out
57: 8584+17 0F39 CD0A10 call xmodem_read_wait ;Read with timeout
58: 8601+10 0F3C DA340F jp c, xmodem_await_conn ;Carry flag set = timeout -> repeat
59: ;else continue
60:
61: - 0F3F xmodem_packet: ;XmodemCRC packet start
62: ;use 1st byte to decide further processing
63: 8611+7 0F3F FE04 cp SYM_EOT ;End of Transmission
64: 8618+10 0F41 CA9D0F jp z, xmodem_packet_EOT
65: 8628+7 0F44 FE18 cp SYM_CAN ;Cancel (Force receiver to start sending C's)
66: 8635+10 0F46 CA340F jp z, xmodem_await_conn
67: 8645+7 0F49 FE01 cp SYM_SOH ;Start of
68: 8652+10 0F4B CA510F jp z, xmodem_packet_get
69:
70: 8662+10 0F4E C3A50F jp xmodem_err ;anything else is an error -> abort transmission
71:
72: - 0F51 xmodem_packet_get: ;if first byte == SYM_SOH -> receive block
73: 8672+17 0F51 CD0A10 call xmodem_read_wait ;get byte 2 => block ID
74: 8689+10 0F54 DA8910 jp c, xmodem_nak
75: 8699+4 0F57 47 ld b,a
76: 8703+13 0F58 32FB40 ld (MEM_VAR_BLOCK), a ;store block id to memory
77: 8716+17 0F5B CD0A10 call xmodem_read_wait ;get byte 3 => block ID complement
78: 8733+10 0F5E DA8910 jp c, xmodem_nak
79: 8743+4 0F61 80 add b
80: 8747+7 0F62 FEFF cp 255 ;both size infos should always sum to 255
81: 8754+10 0F64 C2A50F jp nz,xmodem_err ;if not 255 then its an error
82:
83: ;calculate block start address in RAM
84: ;multiply by 128
85: ;use more efficient bit-wise operations
86: 8764+4 0F67 3D dec a ;a-1 to remove 1 sector offset
87: 8768+4 0F68 78 ld a,b
88: 8772+4 0F69 1F rra ;shift 1 bit to the right
89: 8776+7 0F6A E67F and 0x7F
90: 8783+4 0F6C 67 ld h,a
91: 8787+4 0F6D 78 ld a,b
92: 8791+4 0F6E 3D dec a ;a-1 to remove 1 sector offset
93: 8795+4 0F6F 0F rrca ;shift bit0 to bit 7
94: 8799+7 0F70 E680 and 0x80 ;mask out all other bits
95: 8806+4 0F72 6F ld l,a
96: ;result:
97: ;hl = 0aaaaaaa a000000
98:
99: 8810+10 0F73 110044 ld de,MEM_LOC_LOAD
100: 8820+11 0F76 19 add hl,de ;add calculated offset to base address
101: ;hl now contains the true start address of this sector
102:
103: 8831+7 0F77 0680 ld b,128 ;preload counter for data baytes
104: 8838+7 0F79 0E00 ld c,0 ;packet length counter ( used for overflow error )
105:
106: - 0F7B xmodem_packet_get_data: ;get 128 data bytes (loop)
107: 8845+11 0F7B E5 push hl ;push hl onto stack because xmodem_read_wait destroys hl
108: 8856+17 0F7C CD0A10 call xmodem_read_wait ;read byte or timeout
109: 8873+10 0F7F DA8910 jp c, xmodem_nak ;if timeout -> nak and retry
110: 8883+10 0F82 E1 pop hl ;restore hl
111: 8893+7 0F83 77 ld (hl), a ;store received byte in memory
112: 8900+6 0F84 23 inc hl ;increment pointer
113: 8906+4 0F85 0C inc c ;increment packet length counter
114: 8910+4 0F86 05 dec b ;decerment data bytes remmaining
115: 8914+10 0F87 C27B0F jp nz, xmodem_packet_get_data ;if bytes remaining, loop
116: ;else continue with crc bytes
117:
118: - 0F8A xmodem_packet_get_crc: ;get 16-Bit CRC
119: 8924+17 0F8A CD0A10 call xmodem_read_wait
120: 8941+10 0F8D DA8910 jp c, xmodem_nak
121: 8951+4 0F90 57 ld d,a
122: 8955+4 0F91 0C inc c
123: 8959+17 0F92 CD0A10 call xmodem_read_wait
124: 8976+10 0F95 DA8910 jp c, xmodem_nak
125: 8986+4 0F98 5F ld e,a
126: 8990+4 0F99 0C inc c
127: ;de now contains CRC value
128: ;check if c is not bigger than 130 byte (128 data + 2crc)
129: ;TODO if so NACK
130:
131: ;de contains 16-bit CRC
132: ;TODO if crc error NACK
133: 8994+10 0F9A C37B10 jp xmodem_ack ;ack block -> then jump to start again
134:
135: - 0F9D xmodem_packet_EOT: ;End of transmission SUB.
136: 9004+7 0F9D 3E06 ld a, SYM_ACK ;Acknowledge EOT
137: 9011+17 0F9F CD3710 call xmodem_out
138: 9028+10 0FA2 C3DF0F jp xmodem_end ;and end xmodem
139:
140:
141:
142: - 0FA5 xmodem_err: ;non recoverable error -> abort
143: 9038+7 0FA5 3E18 ld a, SYM_CAN
144: 9045+17 0FA7 CD3710 call xmodem_out
145: 9062+7 0FAA 3E18 ld a, SYM_CAN
146: 9069+17 0FAC CD3710 call xmodem_out
147: 9086+7 0FAF 3E18 ld a, SYM_CAN
148: 9093+17 0FB1 CD3710 call xmodem_out
149: 9110+7 0FB4 3E18 ld a, SYM_CAN
150: 9117+17 0FB6 CD3710 call xmodem_out
151: 9134+7 0FB9 3E18 ld a, SYM_CAN
152: 9141+17 0FBB CD3710 call xmodem_out
153: 9158+7 0FBE 3E18 ld a, SYM_CAN
154: 9165+17 0FC0 CD3710 call xmodem_out
155: 9182+7 0FC3 3E18 ld a, SYM_CAN
156: 9189+17 0FC5 CD3710 call xmodem_out
157: 9206+7 0FC8 3E18 ld a, SYM_CAN
158: 9213+17 0FCA CD3710 call xmodem_out
159: 9230+7 0FCD 3E18 ld a, SYM_CAN
160: 9237+17 0FCF CD3710 call xmodem_out
161: 9254+7 0FD2 3E18 ld a, SYM_CAN
162: 9261+17 0FD4 CD3710 call xmodem_out
163: 9278+7 0FD7 3E18 ld a, SYM_CAN
164:
165: 9285+10 0FD9 214810 ld hl, MSG_ERROR
166: 9295+17 0FDC CDBF02 call print_str
167:
168: ;overflow to end
169: - 0FDF xmodem_end:
170: 9312+4 0FDF F3 di ;disable interrupts
171: 9316+17 0FE0 CDD102 call print_newLine ;print new line
172: 9333+10 0FE3 C39900 jp PROMPT_BEGIN ;return ti prompt
173:
174: ;isr is used as counter for timeouts
175: - 0FE6 xmodem_int:
176: 9343+4 0FE6 F3 di ;setup ISR (disable further interrupts, exchange registers)
177: 9347+4 0FE7 08 ex AF,AF'
178: 9351+4 0FE8 D9 exx
179:
180: 9355+16 0FE9 2AFC40 ld hl,(MEM_VAR_TIMEA) ;millis counter
181: 9371+6 0FEC 23 inc hl
182: 9377+16 0FED 22FC40 ld (MEM_VAR_TIMEA),hl
183:
184: 9393+10 0FF0 110404 ld de,1028 ;every 1028 millis counter
185: 9403+15 0FF3 ED52 sbc hl,de
186: 9418+10 0FF5 C20510 jp nz, xmodem_int_cont ;if less than 1028 millis, loop
187:
188: 9428+10 0FF8 210000 ld hl,0 ;reset millis
189: 9438+16 0FFB 22FC40 ld (MEM_VAR_TIMEA),hl
190: 9454+16 0FFE 2AFE40 ld hl,(MEM_VAR_TIMER) ;incement seconds
191: 9470+6 1001 23 inc hl
192: 9476+16 1002 22FE40 ld (MEM_VAR_TIMER),hl
193: - 1005 xmodem_int_cont: ;end isr
194: 9492+4 1005 08 ex AF,AF' ;restore registers
195: 9496+4 1006 D9 exx
196: 9500+4 1007 FB EI ;enable interrupts
197: 9504+14 1008 ED4D reti ;exit ISR
198:
199:
200:
201:
202:
203: ; A returns char
204: ; Carry is set if timeout
205: - 0003 xmodem_read_timeount equ 3 ;3 seconds timeout
206: - 100A xmodem_read_wait:
207: 9518+4 100A F3 di
208: 9522+10 100B 210000 ld hl,0
209: 9532+16 100E 22FC40 ld (MEM_VAR_TIMEA),hl
210: 9548+16 1011 22FE40 ld (MEM_VAR_TIMER),hl
211: 9564+4 1014 FB ei
212: 9568+17 1015 CD1B03 call A_RTS_ON
213: - 1018 xmodem_read_wait_loop:
214: ;check timeout
215: 9585+16 1018 2AFE40 ld hl,(MEM_VAR_TIMER)
216: 9601+4 101B 7D ld a, l
217: 9605+7 101C FE03 cp xmodem_read_timeount
218: 9612+10 101E CA3510 jp z, xmodem_read_wait_timeout ;if timeout retry
219:
220: ; if no timeout
221: 9622+4 1021 AF xor a ; a = 0
222: 9626+11 1022 D309 out (CS_SIO_A_C), a ; select reg 0
223: 9637+11 1024 DB09 in a, (CS_SIO_A_C) ; read reg 0
224: 9648+7 1026 E601 and 1 ; mask D0 (recieve char available)
225: 9655+10 1028 CA1810 jp Z,xmodem_read_wait_loop ; wait if no char
226:
227: ; if char avail
228: 9665+11 102B DB08 in a, (CS_SIO_A_D) ; read char
229: ;call debug_a_hex
230: 9676+11 102D F5 push af
231: 9687+17 102E CD1203 call A_RTS_OFF
232: 9704+10 1031 F1 pop af
233: 9714+4 1032 37 scf
234: 9718+4 1033 3F ccf
235: 9722+10 1034 C9 ret ; return
236: - 1035 xmodem_read_wait_timeout:
237: 9732+4 1035 37 scf
238: 9736+10 1036 C9 ret
239:
240:
241: - 1037 xmodem_out:
242: 9746+11 1037 D308 out (CS_SIO_A_D), a
243: 9757+17 1039 CD3D10 call xmodem_wait_out
244: 9774+10 103C C9 ret
245:
246: - 103D xmodem_wait_out:
247: 9784+4 103D 97 sub a ;clear a, write into WR0: select RR0
248: 9788+4 103E 3C inc a ;select RR1
249: 9792+11 103F D309 out (CS_SIO_A_C),A
250: 9803+11 1041 DB09 in A,(CS_SIO_A_C) ;read RRx
251: 9814+8 1043 CB47 bit 0,A
252: 9822+7+5 1045 28F6 jr z,xmodem_wait_out
253: 9829+10 1047 C9 ret
254:
255: - 1048 MSG_ERROR:
256: - 1048 4572726F db "Error: unexpected byte",13,10,0
723A2075
6E657870
65637465
64206279
74650D0A
00
257:
258: - 1061 MSG_START:
259: - 1061 41776169 db "Await xmodem connection",13,10,0
7420786D
6F64656D
20636F6E
6E656374
696F6E0D
0A00
260:
261:
262: - 107B xmodem_ack: ;ack routine. Only use when expecting transmission afterwards.
263: 9839+7 107B 3E06 ld a, SYM_ACK ;send ACK
264: 9846+17 107D CD3710 call xmodem_out
265: 9863+17 1080 CD0A10 call xmodem_read_wait ;wait for response
266: 9880+10 1083 DA7B10 jp c, xmodem_ack ;if timeout repeat
267: 9890+10 1086 C33F0F jp xmodem_packet ;if received, continue with new packet
268:
269: - 1089 xmodem_nak: ;nak routine. Only use when expecting transmission afterwards.
270: 9900+7 1089 3E15 ld a, SYM_NAK ;send NAK
271: 9907+17 108B CD3710 call xmodem_out
272: 9924+17 108E CD0A10 call xmodem_read_wait ;wait for response
273: 9941+10 1091 DA8910 jp c, xmodem_nak ;if timeout repeat
274: 9951+10 1094 C33F0F jp xmodem_packet ;if received, continue with new packet
275:
276: - 1097 xmodem_wait:
277: 9961+10 1097 21FF00 ld hl, 0xFF
278: 9971+10 109A 010100 ld bc, 0x01
279: - 109D xmodem_wait_1:
280: 9981+4 109D 00 nop
281: 9985+4 109E 00 nop
282: 9989+4 109F 00 nop
283: 9993+4 10A0 00 nop
284: 9997+15 10A1 ED42 sbc hl,bc
285:10012+5+6 10A3 C8 ret Z
**** main.asm ****
501:10017+12 10A4 18F7 jr xmodem_wait_1
502: .include "kdrv_ide8255.s" ;include ide interface driver.
**** include/kdrv_ide8255.s ****
1: ;----------------------------------------------------------------
2: ;BIOS Driver for IDE Interface 82C55
3: ;by Dennis Gunia (01/2023)
4: ;----------------------------------------------------------------
5:
6: ;================================================================
7: ; I/O registers
8: ;================================================================
9: - 0030 CS_PIA_PA .EQU 0x30 ; D0-7
10: - 0031 CS_PIA_PB .EQU 0x31 ; D8-15
11: - 0032 CS_PIA_PC .EQU 0x32 ; Controll Lines
12: - 0033 CS_PIA_CR .EQU 0x33
13:
14: ;================================================================
15: ; I/O pins
16: ;================================================================
17: - 0020 IDE_WR .EQU 00100000b
18: - 0040 IDE_RD .EQU 01000000b
19: - 0080 IDE_RST .EQU 10000000b
20:
21: ;================================================================
22: ; IDE registers
23: ;================================================================
24: - 0008 IDE_REG_DATA .EQU 01000b ;data I/O register (16-bits)
25: - 0009 IDE_REG_ERROR .EQU 01001b ;error information register when read; write precompensation register when written.
26: - 000A IDE_REG_SECTOR .EQU 01010b ;Sector counter register
27: - 000B IDE_REG_SSECTOR .EQU 01011b ;Start sector register
28: - 000C IDE_REG_LCYL .EQU 01100b ;Low byte of the cylinder number
29: - 000D IDE_REG_HCYL .EQU 01101b ;High two bits of the cylinder number
30: - 000E IDE_REG_HEAD .EQU 01110b ;Head and device select register
31: - 000F IDE_REG_CMDSTS .EQU 01111b ;command/status register
32: - 0016 IDE_REG_ALTSTS .EQU 10110b ;Alternate Status/Digital Output
33: - 0017 IDE_REG_DRVADDR .EQU 10111b ;Drive Address
34:
35:
36: ;================================================================
37: ; I/O access functions
38: ;================================================================
39:
40: ;------------------------------------------------------------------------------
41: ; ide_reset
42: ;
43: ; resets drives on bus
44: ;------------------------------------------------------------------------------
45: - 10A6 ide_reset:
46:
47:10029+7 10A6 3E80 LD A, 10000000b ;CommandByte-A, Mode 0, PA Out, PC Out, PB Out
48:10036+11 10A8 D333 OUT (CS_PIA_CR), A ;Set Data direction to out
49:10047+7 10AA 3E80 LD A, IDE_RST
50:10054+11 10AC D332 OUT (CS_PIA_PC), A ;Reset IDE Device
51:10065+4 10AE 00 NOP
52:10069+4 10AF AF XOR A
53:10073+11 10B0 D332 OUT (CS_PIA_PC), A ;end device reset
54:10084+10 10B2 C9 RET
55:
56:
57: ;------------------------------------------------------------------------------
58: ; ide_regwrite_8
59: ;
60: ; Sends data to the IDE device
61: ; A contains DATA
62: ; B contains register number
63: ;------------------------------------------------------------------------------
64: - 10B3 ide_regwrite_8:
65:10094+11 10B3 F5 PUSH AF ;store date to stack
66: ; Prepare PIA Data Direction
67:10105+7 10B4 3E80 LD A, 10000000b ;CommandByte-A, Mode 0, PA Out, PC Out, PB Out
68:10112+11 10B6 D333 OUT (CS_PIA_CR), A ;Set Data direction to out
69: ; Write Data out
70:10123+10 10B8 F1 POP AF
71:10133+11 10B9 D330 OUT (CS_PIA_PA), A ;Write Data to bit 0-7
72: ;Prepare Address
73:10144+4 10BB 78 LD A, B ;Load register address
74:10148+7 10BC E61F AND 00011111b ;Mask unused bits
75:10155+11 10BE D332 OUT (CS_PIA_PC), A ;Write Data to bit controll lines
76:10166+7 10C0 F620 OR IDE_WR ;Set Write bit
77:10173+11 10C2 D332 OUT (CS_PIA_PC), A ;Set write signal
78:10184+4 10C4 00 NOP ;delay to wait for processing
79:10188+4 10C5 78 LD A, B ;Load register address
80:10192+7 10C6 E61F AND 00011111b ;Mask unused bits
81:10199+11 10C8 D332 OUT (CS_PIA_PC), A ;disable write signal
82:10210+4 10CA 00 NOP
83:10214+4 10CB AF XOR A ;clear register A
84:10218+11 10CC D332 OUT (CS_PIA_PC), A ;clear controll lines
85:10229+10 10CE C9 RET
86:
87:
88: ;------------------------------------------------------------------------------
89: ; ide_regread_8
90: ;
91: ; Sends data to the IDE device
92: ; B contains register number
93: ; A returns data
94: ;------------------------------------------------------------------------------
95: - 10CF ide_regread_8:
96:10239+7 10CF 3E92 LD A, 10010010b ;CommandByte-A, Mode 0, PA IN, PC Out, PB IN
97:10246+11 10D1 D333 OUT (CS_PIA_CR), A ;Set Data direction to in
98: ;Prepare Address
99:10257+4 10D3 78 LD A, B ;Load register address
100:10261+7 10D4 E61F AND 00011111b ;Mask unused bits
101:10268+11 10D6 D332 OUT (CS_PIA_PC), A ;Write Data to bit controll lines
102:10279+7 10D8 F640 OR IDE_RD ;Set Write bit
103:10286+11 10DA D332 OUT (CS_PIA_PC), A ;Write Data to bit controll lines
104:10297+4 10DC 00 NOP ;delay to wait for processing
105:10301+11 10DD F5 PUSH AF
106:10312+10 10DE F1 POP AF
107:10322+11 10DF F5 PUSH AF
108:10333+10 10E0 F1 POP AF
109:10343+11 10E1 F5 PUSH AF
110:10354+10 10E2 F1 POP AF
111:10364+11 10E3 F5 PUSH AF
112:10375+10 10E4 F1 POP AF
113:10385+11 10E5 DB30 IN A,(CS_PIA_PA) ;read data from ide device to b (because a is used later)
114:10396+11 10E7 F5 PUSH AF
115:10407+4 10E8 AF XOR A ;clear register A
116:10411+11 10E9 D332 OUT (CS_PIA_PC), A ;clear controll lines
117:10422+10 10EB F1 POP AF ;put data in accumulator
118:10432+10 10EC C9 RET
119:
120:
121: ;------------------------------------------------------------------------------
122: ; ide_readsector_256
123: ;
124: ; Reads IDE Data
125: ; HL contains destination address
126: ;------------------------------------------------------------------------------
127: - 10ED ide_readsector_256:
128:10442+7 10ED 0EFF LD C,255 ;Setup counter for 256 words
129:
130: - 10EF ide_readsector_256_waitloop:
131:10449+7 10EF 060F LD B, IDE_REG_CMDSTS
132:10456+17 10F1 CDCF10 CALL ide_regread_8
133:10473+8 10F4 CB47 BIT 0,a ;Error Bit set.
134:10481+10 10F6 C26E11 JP NZ, ide_printerror
135:10491+8 10F9 CB5F BIT 3,a ;DRQ Bit set. If set, disk has data
136:10499+7+5 10FB 28F2 JR Z, ide_readsector_256_waitloop ;If not set, wait
137:
138:10506+7 10FD 3E92 LD A, 10010010b ;CommandByte-A, Mode 0, PA IN, PC Out, PB IN
139:10513+11 10FF D333 OUT (CS_PIA_CR), A ;Set Data direction to IN
140:10524+7 1101 3E08 LD A, IDE_REG_DATA ;CS0 and A=0 -> I/O register
141:10531+11 1103 D332 OUT (CS_PIA_PC), A ;set register
142:10542+7 1105 F640 OR IDE_RD ;Set Read bit
143:10549+11 1107 D332 OUT (CS_PIA_PC), A ;Write Read to bit controll lines
144:10560+4 1109 00 NOP
145:10564+4 110A 00 NOP
146:10568+4 110B 00 NOP
147:10572+11 110C DB31 IN A,(CS_PIA_PB) ;Load 16-Bit data to buffer
148:10583+7 110E 77 LD (HL), A
149:10590+6 110F 23 INC HL
150:10596+11 1110 DB30 IN A,(CS_PIA_PA)
151:10607+7 1112 77 LD (HL), A
152:10614+6 1113 23 INC HL
153:
154:10620+4 1114 79 LD A,C
155:10624+4 1115 B7 OR A
156:10628+10 1116 CA1C11 JP Z,ide_readsector_256_done
157:10638+4 1119 0D DEC C
158:10642+12 111A 18D3 JR ide_readsector_256_waitloop
159:
160: - 111C ide_readsector_256_done:
161:10654+10 111C C9 RET
162:
163: - 111D ide_readsector_512_inv:
164:10664+7 111D 0EFF LD C,255 ;Setup counter for 256 words
165:10671+10 111F 110010 LD DE, 4096 ;Timeout counter
166: - 1122 ide_readsector_512_inv_waitloop:
167:10681+6 1122 1B DEC DE
168:10687+4 1123 7A LD A,D
169:10691+4 1124 B3 OR E
170:10695+10 1125 CA5811 JP Z, ide_readsector_timeout
171:10705+7 1128 060F LD B, IDE_REG_CMDSTS
172:10712+17 112A CDCF10 CALL ide_regread_8
173:10729+8 112D CB47 BIT 0,a ;Error Bit set.
174:10737+10 112F C26E11 JP NZ, ide_printerror
175:10747+8 1132 CB5F BIT 3,a ;DRQ Bit set. If set, disk has data
176:10755+7+5 1134 28EC JR Z, ide_readsector_512_inv_waitloop ;If not set, wait
177:10762+10 1136 110008 LD DE, 2048 ;Timeout counter
178:10772+7 1139 3E92 LD A, 10010010b ;CommandByte-A, Mode 0, PA IN, PC Out, PB IN
179:10779+11 113B D333 OUT (CS_PIA_CR), A ;Set Data direction to IN
180:10790+7 113D 3E08 LD A, IDE_REG_DATA ;CS0 and A=0 -> I/O register
181:10797+11 113F D332 OUT (CS_PIA_PC), A ;set register
182:10808+7 1141 F640 OR IDE_RD ;Set Read bit
183:10815+11 1143 D332 OUT (CS_PIA_PC), A ;Write Read to bit controll lines
184:10826+4 1145 00 NOP
185:10830+4 1146 00 NOP
186:10834+4 1147 00 NOP
187:10838+11 1148 DB30 IN A,(CS_PIA_PA) ;Load 16-Bit data to buffer
188:10849+7 114A 77 LD (HL), A
189:10856+6 114B 23 INC HL
190:10862+11 114C DB31 IN A,(CS_PIA_PB)
191:10873+7 114E 77 LD (HL), A
192:10880+6 114F 23 INC HL
193:
194:10886+4 1150 79 LD A,C
195:10890+4 1151 B7 OR A
196:10894+10 1152 CA1C11 JP Z,ide_readsector_256_done
197:10904+4 1155 0D DEC C
198:10908+12 1156 18CA JR ide_readsector_512_inv_waitloop
199:
200: - 1158 ide_readsector_timeout:
201:10920+10 1158 21D011 LD HL, [str_error_time]
202:10930+17 115B CDBF02 CALL print_str
203:10947+4 115E 79 LD A, C
204:10951+17 115F CDE702 CALL print_a_hex
205:10968+7 1162 3E0A LD A,10
206:10975+17 1164 CDB702 CALL print_char
207:10992+7 1167 3E0D LD A,13
208:10999+17 1169 CDB702 CALL print_char
209:11016+10 116C C9 RET
210:
211:
212:
213:
214: ;------------------------------------------------------------------------------
215: ; ide_writesector_256
216: ;
217: ; Writes 512 bytes (256 words) of IDE Data
218: ; HL contains data start address
219: ;------------------------------------------------------------------------------
220: - 116D ide_writesector_256:
221:11026+10 116D C9 RET ;NOT IMPLEMENTED
222:
223:
224: ;================================================================
225: ; utility functions
226: ;================================================================
227:
228: ;------------------------------------------------------------------------------
229: ; ide_printerror
230: ;
231: ; prints IDE error to console
232: ;------------------------------------------------------------------------------
233: - 116E ide_printerror:
234:11036+10 116E 21A111 LD HL, [str_error_start]
235:11046+17 1171 CDBF02 CALL print_str
236:11063+7 1174 060F LD B, IDE_REG_CMDSTS
237:11070+17 1176 CDCF10 CALL ide_regread_8
238:11087+17 1179 CDE702 CALL print_a_hex
239:11104+10 117C 21BE11 LD HL, [str_error_start1]
240:11114+17 117F CDBF02 CALL print_str
241:11131+13 1182 3A0050 LD A,(MEM_IDE_DEVICE)
242:11144+17 1185 CDE702 CALL print_a_hex
243:11161+10 1188 21C711 LD HL, [str_error_start2]
244:11171+17 118B CDBF02 CALL print_str
245:11188+7 118E 0609 LD B, IDE_REG_ERROR
246:11195+17 1190 CDCF10 CALL ide_regread_8
247:11212+17 1193 CDE702 CALL print_a_hex
248:11229+7 1196 3E0A LD A,10
249:11236+17 1198 CDB702 CALL print_char
250:11253+7 119B 3E0D LD A,13
251:11260+17 119D CDB702 CALL print_char
252:
253:11277+10 11A0 C9 RET
254:
255: - 11A1 str_error_start:
256: - 11A1 0D0A4469 db 13,10,"Disk I/O error. Status: 0x",0
736B2049
2F4F2065
72726F72
2E205374
61747573
3A203078
00
257: - 11BE str_error_start1:
258: - 11BE 20446576 db " Dev: 0x",0
3A203078
00
259: - 11C7 str_error_start2:
260: - 11C7 20457272 db " Err: 0x",0
3A203078
00
261:
262: - 11D0 str_error_time:
263: - 11D0 0D0A4469 db 13,10,"Disk I/O error. Data timeout @ 0x",0
736B2049
2F4F2065
72726F72
2E204461
74612074
696D656F
75742040
20307800
**** main.asm ****
503: .include "kdrv_ideif.s" ;include ide driver.
**** include/kdrv_ideif.s ****
1: ;----------------------------------------------------------------
2: ;BIOS Driver for IDE Access
3: ;by Dennis Gunia (01/2023)
4: ;----------------------------------------------------------------
5:
6: ;================================================================
7: ; IDE commands
8: ;================================================================
9: - 00EC IDE_CMD_IDENT .EQU 0xEC ;Identify drive.
10: - 0020 IDE_CMD_READSEC .EQU 0x20 ;Read sectors.
11:
12: ;================================================================
13: ; IDE Variables
14: ;================================================================
15: - 5000 MEM_IDE_BASE .EQU 0x5000
16: - 5000 MEM_IDE_DEVICE .EQU MEM_IDE_BASE
17: - 5001 MEM_IDE_STATUS .EQU MEM_IDE_BASE + 1 ;1Byte: 0x00 if status is okay
18:
19: - 5002 MEM_IDE_PARTITION .EQU MEM_IDE_BASE + 2 ;4*16Bytes: LBA first sector
20: - 5006 MEM_IDE_POINTER .EQU MEM_IDE_BASE + 6 ;4*16Bytes: LBA first sector
21:
22: - 5041 MEM_IDE_BUFFER .EQU MEM_IDE_BASE + 65 ;512Byte: buffer for read/write data
23:
24: ;================================================================
25: ; IDE funtions
26: ;================================================================
27:
28: ;------------------------------------------------------------------------------
29: ; ideif_init_drive
30: ;
31: ; initializes drive
32: ;------------------------------------------------------------------------------
33: - 11F4 ideif_init_drive:
34:11287+4 11F4 AF xor a
35:11291+13 11F5 320050 ld (MEM_IDE_DEVICE),A ;Set device to 0
36:11304+13 11F8 320150 ld (MEM_IDE_STATUS),A ;Set status to 0 (OK)
37:11317+4 11FB F3 di ;disable interrupt
38:11321+17 11FC CDA610 call ide_reset ;Reset drives on bus
39:11338+10 11FF 218912 ld hl, [str_dev_waitready]
40:11348+17 1202 CDBF02 call print_str ;print waiting message
41:11365+10 1205 11FF1F ld DE, 0x1FFF ;preload timeout counter
42: - 1208 ideif_init_drive_loop1:
43:11375+7 1208 060F ld b, IDE_REG_CMDSTS
44:11382+17 120A CDCF10 call ide_regread_8 ;read drive status register
45:11399+4 120D B7 OR A
46:11403+7+5 120E 280B JR Z, ideif_init_drive_nodrv ;no drive found
47:11410+8 1210 CB77 BIT 6,A ;Wait for device ready
48:11418+7+5 1212 200E JR NZ, ideif_init_drive_detected
49:11425+6 1214 1B DEC DE ; decrement timeout
50:11431+4 1215 7A LD A,D
51:11435+4 1216 B3 OR E
52:11439+7+5 1217 2802 JR Z, ideif_init_drive_nodrv
53:11446+12 1219 18ED JR ideif_init_drive_loop1
54:
55: - 121B ideif_init_drive_nodrv:
56:11458+10 121B 21B312 ld hl, [str_dev_notfound]
57:11468+17 121E CDBF02 call print_str
58:11485+10 1221 C9 RET
59:
60: - 1222 ideif_init_drive_detected:
61:11495+10 1222 219D12 ld hl, [str_dev_ready]
62:11505+17 1225 CDBF02 call print_str
63:11522+7 1228 060F LD B, IDE_REG_CMDSTS ;Get drive identification
64:11529+7 122A 3EEC LD A, IDE_CMD_IDENT
65:11536+17 122C CDB310 call ide_regwrite_8 ;Write command to drive
66:11553+10 122F 214150 LD HL,MEM_IDE_BUFFER ;set read/write buffer start address
67:11563+17 1232 CDED10 call ide_readsector_256 ;read 256 words from device
68:11580+10 1235 215550 LD HL,MEM_IDE_BUFFER + 20 ;print device serial
69:11590+7 1238 0614 LD B, 20
70:11597+17 123A CD5813 CALL print_str_fixed
71:11614+10 123D 21AA12 ld hl, [str_dev_ready2]
72:11624+17 1240 CDBF02 call print_str
73:11641+10 1243 217750 LD HL,MEM_IDE_BUFFER + 54 ;print device name
74:11651+7 1246 0628 LD B, 40
75:11658+17 1248 CD5813 CALL print_str_fixed
76:11675+7 124B 3E0A LD A,10 ;New line
77:11682+17 124D CDB702 CALL print_char
78:11699+7 1250 3E0D LD A,13
79:11706+17 1252 CDB702 CALL print_char
80:11723+10 1255 C9 RET
81:
82: ;------------------------------------------------------------------------------
83: ; read_lba_sector
84: ;
85: ; Reads A*512 byte sector into memory
86: ; HL contains pointer to LBA address
87: ; A contains sector count
88: ;------------------------------------------------------------------------------
89: - 1256 read_lba_sector:
90:11733+7 1256 060A LD B,IDE_REG_SECTOR ;amount of sectores
91:11740+17 1258 CDB310 CALL ide_regwrite_8
92:
93:11757+7 125B 7E LD A,(HL)
94:11764+7 125C E60F AND 00001111b
95:11771+7 125E F6E0 OR 11100000b
96:11778+7 1260 060E LD B,IDE_REG_HEAD
97:11785+17 1262 CDB310 CALL ide_regwrite_8
98:11802+6 1265 23 INC HL
99:11808+7 1266 7E LD A,(HL)
100:11815+7 1267 060D LD B,IDE_REG_HCYL
101:11822+17 1269 CDB310 CALL ide_regwrite_8
102:11839+6 126C 23 INC HL
103:11845+7 126D 7E LD A,(HL)
104:11852+7 126E 060C LD B,IDE_REG_LCYL
105:11859+17 1270 CDB310 CALL ide_regwrite_8
106:11876+6 1273 23 INC HL
107:11882+7 1274 7E LD A,(HL)
108:11889+7 1275 060B LD B,IDE_REG_SSECTOR
109:11896+17 1277 CDB310 CALL ide_regwrite_8
110:11913+6 127A 23 INC HL
111:
112:11919+7 127B 3E20 LD A,IDE_CMD_READSEC ;send read command
113:11926+7 127D 060F LD B,IDE_REG_CMDSTS
114:11933+17 127F CDB310 CALL ide_regwrite_8
115:11950+10 1282 214150 LD HL,MEM_IDE_BUFFER ;set read/write buffer start address
116:11960+17 1285 CD1D11 call ide_readsector_512_inv ;read 256 words from device
117:11977+10 1288 C9 ret
118:
119:
120: ;================================================================
121: ; IDE strings
122: ;===============================================================
123:
124: - 1289 str_dev_waitready:
125: - 1289 0D0A4465 db 13,10,"Detecting drives ",0
74656374
696E6720
64726976
65732000
126:
127: - 129D str_dev_ready:
128: - 129D 666F756E db "found!",13,10,"ID: ",0
64210D0A
49443A20
00
129: - 12AA str_dev_ready2:
130: - 12AA 20204465 db " Desc: ",0
73633A20
00
131:
132: - 12B3 str_dev_notfound:
133: - 12B3 6E6F2064 db "no drive",13,10,0
72697665
0D0A00
**** main.asm ****
504: .include "prettydump.s" ;include monitor symbols.
**** include/prettydump.s ****
1: ;----------------------------------------------------------------
2: ;HEX and ASCII dump function
3: ;by Dennis Gunia (01/2023)
4: ;----------------------------------------------------------------
5:
6: ;------------------------------------------------------------------------------
7: ; dump_pretty
8: ;
9: ; Dumps memory content
10: ; B contains amount of rows
11: ; HL contains start address
12: ; Destroys BC, HL
13: ;------------------------------------------------------------------------------
14: - 12BE dump_pretty:
15:11987+11 12BE E5 PUSH HL
16:11998+10 12BF 211913 LD HL,[STR_PD_HEADER] ;Print header
17:12008+17 12C2 CDBF02 CALL print_str
18:12025+10 12C5 E1 POP HL
19: - 12C6 dump_pretty_row:
20:12035+4 12C6 78 LD A,B ;Check row counter
21:12039+4 12C7 B7 OR A
22:12043+10 12C8 CA1813 JP Z, dump_pretty_end ;If counter is 0, exit
23:12053+4 12CB 05 DEC B ;Decrement row counter by 1
24:12057+7 12CC 0E10 LD C, 16 ;Load column counter
25:12064+4 12CE 7C LD A, H ;Print base address
26:12068+17 12CF CDE702 CALL print_a_hex
27:12085+4 12D2 7D LD A, L
28:12089+17 12D3 CDE702 CALL print_a_hex
29:12106+7 12D6 3E20 LD A, ' '
30:12113+17 12D8 CDB702 CALL print_char
31: - 12DB dump_pretty_col: ;Loop for column
32:12130+7 12DB 7E LD A,(HL) ;Load byte to disply
33:12137+17 12DC CDE702 CALL print_a_hex
34:12154+7 12DF 3E20 LD A, ' '
35:12161+17 12E1 CDB702 CALL print_char
36:12178+6 12E4 23 INC HL
37:12184+4 12E5 0D DEC C ;Decrement column counter
38:12188+7+5 12E6 20F3 JR NZ, dump_pretty_col ;Loop if not 0
39: - 12E8 dump_pretty_ascii:
40:12195+11 12E8 C5 PUSH BC
41:12206+11 12E9 E5 PUSH HL
42:12217+7 12EA 0600 LD B,0
43:12224+7 12EC 0E10 LD C,16
44:12231+15 12EE ED42 SBC HL,BC ;Reset HL by column count
45: - 12F0 dump_pretty_ascii_loop:
46:12246+7 12F0 7E LD A,(HL)
47:12253+6 12F1 23 INC HL
48:12259+7 12F2 FE20 CP 32
49:12266+10 12F4 DA0113 JP C, dump_pretty_ascii_none ;if less than 32, it is not a char
50:12276+7 12F7 FE7F CP 127
51:12283+10 12F9 D20113 JP NC, dump_pretty_ascii_none ;if greater or equal than 128, it is not a char
52:12293+17 12FC CDB702 call print_char
53:12310+12 12FF 1805 jr dump_pretty_ascii_cont
54: - 1301 dump_pretty_ascii_none:
55:12322+7 1301 3E2E LD A,'.'
56:12329+17 1303 CDB702 call print_char
57: - 1306 dump_pretty_ascii_cont:
58:12346+4 1306 0D DEC C
59:12350+10 1307 C2F012 JP NZ, dump_pretty_ascii_loop
60:
61:
62:12360+10 130A E1 POP HL
63:12370+10 130B C1 POP BC
64: - 130C dump_pretty_nextrow:
65:12380+7 130C 3E0A LD A,10 ;New line
66:12387+17 130E CDB702 CALL print_char
67:12404+7 1311 3E0D LD A,13
68:12411+17 1313 CDB702 CALL print_char
69:12428+12 1316 18AE JR dump_pretty_row ;Else next line
70: - 1318 dump_pretty_end:
71:12440+10 1318 C9 RET
72:
73: - 1319 STR_PD_HEADER:
74: - 1319 0D0A4241 db 13,10,'BASE 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII',13,10,0
53452030
20203120
20322020
33202034
20203520
20362020
37202038
20203920
20412020
42202043
20204420
20452020
46202041
53434949
0D0A00
75:
76:
77: ;------------------------------------------------------------------------------
78: ; print_str_fixed
79: ;
80: ; Prints string with fixed length
81: ; B contains length
82: ; HL contains start address
83: ;------------------------------------------------------------------------------
84: - 1358 print_str_fixed:
85:12450+7 1358 7E LD A,(HL)
86:12457+6 1359 23 INC HL
87:12463+17 135A CDB702 CALL print_char
88:12480+8+5 135D 10F9 DJNZ print_str_fixed
89:12488+10 135F C9 RET
90:
**** main.asm ****
505: ; Strings
506: - 1360 STR_Banner_Start:
507: - 1360 5A384320 db "Z8C Monitor V2 by Dennis Gunia (2022)",0
4D6F6E69
746F7220
56322062
79204465
6E6E6973
2047756E
69612028
32303232
2900
508: - 1386 STR_SyntaxError:
509: - 1386 73796E3F db "syn?",0
00
510: - 138B STR_Unknown:
511: - 138B 636D643F db "cmd?",0
00
512: - 1390 STR_HEXDUMP_HEADER:
513: - 1390 42415345 db 'BASE 0 1 2 3 4 5 6 7 8 9 A B C D E F',0
20302020
31202032
20203320
20342020
35202036
20203720
20382020
39202041
20204220
20432020
44202045
20204600
514:
515:
516:
**** main.asm ****
517: ;.include "debug.s"
Statistics:
4 passes
0 jr promotions
391 symbols
5039 bytes
Symbol Table:
AY0_WRITE_REG 91 145
A_RTS_OFF 312 786
A_RTS_ON 31B 795
CMD_DASM 239 569
CMD_EXEC 12F 303
CMD_IO_READ 21D 541
CMD_IO_WRITE 1F4 500
CMD_SET 1B8 440
CMD_SET_END 1EE 494
CMD_SET_LOOP 1D3 467
CMD_SYNTAX_ERROR 272 626
CMD_VIEW 14E 334
CMD_VIEW_END 1B2 434
CMD_VIEW_ROW 187 391
CMD_VIEW_ROW_LOOP 199 409
CONSOLE_INIT 27E 638
CONSOLE_INIT_CTC 27E 638
CONSOLE_INIT_SIO 286 646
CS_BANK =00 0
CS_CTC_0 =04 4
CS_CTC_1 =05 5
CS_CTC_2 =06 6
CS_CTC_3 =07 7
CS_DIP =01 1
CS_PIA_CR =33 51
CS_PIA_PA =30 48
CS_PIA_PB =31 49
CS_PIA_PC =32 50
CS_PIO_AC =F6 246
CS_PIO_AD =F4 244
CS_PIO_BC =F7 247
CS_PIO_BD =F5 245
CS_SIO_A_C =09 9
CS_SIO_A_D =08 8
CS_SIO_B_C =0B 11
CS_SIO_B_D =0A 10
DHEX_TO_BYTE 324 804
DHEX_TO_BYTE_FAILED 340 832
EXEC_RST_08 EC4 3780
EXEC_RST_10 EC8 3784
EXEC_RST_18 ED4 3796
HEX_TO_BIN 344 836
HEX_TO_BIN_2 352 850
HEX_TO_INVALID_2 359 857
IDE_CMD_IDENT =EC 236
IDE_CMD_READSEC=20 32
IDE_RD =40 64
IDE_REG_ALTSTS =16 22
IDE_REG_CMDSTS =0F 15
IDE_REG_DATA =08 8
IDE_REG_DRVADDR=17 23
IDE_REG_ERROR =09 9
IDE_REG_HCYL =0D 13
IDE_REG_HEAD =0E 14
IDE_REG_LCYL =0C 12
IDE_REG_SECTOR =0A 10
IDE_REG_SSECTOR=0B 11
IDE_RST =80 128
IDE_WR =20 32
INT_VEC 1B 27
IO_AY0_ADDR =40 64
IO_AY0_DATA =41 65
IO_AY1_ADDR =42 66
IO_AY1_DATA =43 67
IO_REG0 =20 32
IO_RTC_AMPM =25 37
IO_RTC_CTR_D =2D 45
IO_RTC_CTR_E =2E 46
IO_RTC_CTR_F =2F 47
IO_RTC_DAY0 =26 38
IO_RTC_DAY1 =27 39
IO_RTC_HOUR =24 36
IO_RTC_MIN0 =22 34
IO_RTC_MIN1 =23 35
IO_RTC_MON0 =28 40
IO_RTC_MON1 =29 41
IO_RTC_SEC0 =20 32
IO_RTC_SEC1 =21 33
IO_RTC_WEEK =2C 44
IO_RTC_YEAR1 =2B 43
IO_RTC_YERR0 =2A 42
Includes 27E 638
MEM_IDE_BASE =5000 20480
MEM_IDE_BUFFER =5041 20545
MEM_IDE_DEVICE =5000 20480
MEM_IDE_PARTITION=5002 20482
MEM_IDE_POINTER=5006 20486
MEM_IDE_STATUS =5001 20481
MEM_INT_VEC_T =40FE 16638
MEM_LOC_LOAD =4400 17408
MEM_VAR_BLOCK =40FB 16635
MEM_VAR_TIMEA =40FC 16636
MEM_VAR_TIMER =40FE 16638
MSG_CLEAR 30A 778
MSG_ERROR 1048 4168
MSG_START 1061 4193
PRG_RAM_START =4110 16656
PRG_RAM_TOP =FF00 65280
PROG_MEM_START =4000 16384
PROG_ROM_START = 100 256
PROMPT_BEGIN 99 153
PROMPT_BEGIN_READ_BACKSPACE D6 214
PROMPT_BEGIN_READ_LOOP A5 165
PROMPT_BEGIN_READ_PROCESS FC 252
RST_00 00 0
RST_08 08 8
RST_10 10 16
RST_18 18 24
STACK_RAM_TOP =FFFF 65535
START_ROM =00 0
STRCONV_BYTES_TO_HEX 35B 859
STRCONV_BYTES_TO_HEX_1 36A 874
STRCONV_BYTES_TO_HEX_2 374 884
STR_Banner_Start 1360 4960
STR_HEXDUMP_HEADER 1390 5008
STR_PD_HEADER 1319 4889
STR_SyntaxError 1386 4998
STR_Unknown 138B 5003
SYM_ACK =06 6
SYM_C =43 67
SYM_CAN =18 24
SYM_EOT =04 4
SYM_ETB =17 23
SYM_NAK =15 21
SYM_SOH =01 1
SYS_BUF_START =4010 16400
SYS_RAM_START =4000 16384
VAR_CONSOLE_BAUD=18 24
VAR_CONSOLE_CONF=0F 15
VDP_MEM =80 128
VDP_REG =81 129
beep ED7 3799
beep_loop EDA 3802
beep_pause EF7 3831
dasm_00 ADC 2780
dasm_01 DC8 3528
dasm_02 B62 2914
dasm_03 D9A 3482
dasm_08 BDF 3039
dasm_09 D6D 3437
dasm_0A B44 2884
dasm_0B DB1 3505
dasm_10 B24 2852
dasm_12 B6D 2925
dasm_18 AE7 2791
dasm_1A B4E 2894
dasm_20 B01 2817
dasm_22 E0E 3598
dasm_27 BA7 2983
dasm_28 AFA 2810
dasm_2A DDF 3551
dasm_2F BAB 2987
dasm_30 AF2 2802
dasm_32 B78 2936
dasm_37 BB7 2999
dasm_38 AEB 2795
dasm_3A B58 2904
dasm_3F BB3 2995
dasm_76 BBB 3003
dasm_80C6 C38 3128
dasm_BE BD5 3029
dasm_C3 AE0 2784
dasm_C88E C5E 3166
dasm_C9 B30 2864
dasm_CD B2A 2858
dasm_D9 BEC 3052
dasm_DD B12 2834
dasm_DD_01 DCF 3535
dasm_DD_09 D88 3464
dasm_DD_22 E24 3620
dasm_DD_23 D9F 3487
dasm_DD_2A DF6 3574
dasm_DD_2B DB6 3510
dasm_DD_34 D38 3384
dasm_DD_35 D55 3413
dasm_DD_86 C40 3136
dasm_DD_8E C66 3174
dasm_DD_96 C89 3209
dasm_DD_9E CA9 3241
dasm_DD_A6 CCA 3274
dasm_DD_AE D01 3329
dasm_DD_B6 CE6 3302
dasm_DD_BE D1D 3357
dasm_DD_E1 E76 3702
dasm_DD_E3 BFC 3068
dasm_DD_E5 E60 3680
dasm_DD_F9 E46 3654
dasm_E1 E70 3696
dasm_E3 BF0 3056
dasm_E5 E5A 3674
dasm_E9 B09 2825
dasm_ED_42 D7F 3455
dasm_ED_43 E1A 3610
dasm_ED_44 BAF 2991
dasm_ED_45 B3A 2874
dasm_ED_46 BC6 3014
dasm_ED_4A D76 3446
dasm_ED_4B DEB 3563
dasm_ED_4D B35 2869
dasm_ED_56 BCB 3019
dasm_ED_5E BD0 3024
dasm_ED_A0 C14 3092
dasm_ED_A1 C26 3110
dasm_ED_A8 C1D 3101
dasm_ED_A9 C2F 3119
dasm_ED_B0 C18 3096
dasm_ED_B1 C2A 3114
dasm_ED_B8 C21 3105
dasm_ED_B9 C33 3123
dasm_F3 BC0 3008
dasm_F9 E3C 3644
dasm_FB BC3 3011
dasm_FD B1B 2843
dasm_FD_01 DD7 3543
dasm_FD_09 D91 3473
dasm_FD_22 E30 3632
dasm_FD_23 DA8 3496
dasm_FD_2A E02 3586
dasm_FD_2B DBF 3519
dasm_FD_34 D44 3396
dasm_FD_35 D61 3425
dasm_FD_86 C4F 3151
dasm_FD_8E C75 3189
dasm_FD_96 C95 3221
dasm_FD_9E CB7 3255
dasm_FD_A6 CD6 3286
dasm_FD_AE D0D 3341
dasm_FD_B6 CF1 3313
dasm_FD_BE D28 3368
dasm_FD_E1 E7E 3710
dasm_FD_E3 C08 3080
dasm_FD_E5 E68 3688
dasm_FD_F9 E50 3664
dasm_FF B3F 2879
dasm_UU E86 3718
dasm_UW E8A 3722
dasm__AND CC5 3269
dasm__CP D19 3353
dasm__DEC D50 3408
dasm__ED_47 B97 2967
dasm__ED_4F B9F 2975
dasm__ED_57 B87 2951
dasm__ED_5F B8F 2959
dasm__INC D33 3379
dasm__LD B83 2947
dasm__OR CE2 3298
dasm__SBC CA1 3233
dasm__SUB C84 3204
dasm__XOR CFC 3324
dasm_opcode_table 684 1668
dasm_print16hex_addr 4B1 1201
dasm_print8hex 4C9 1225
dasm_printFlags_table E8F 3727
dasm_printRegister8_table E9F 3743
dasm_printRegister8_table_HL EBF 3775
dasm_printRegisterIX_table EA7 3751
dasm_printRegisterIY_table EAF 3759
dasm_printRegisterSP_table EB7 3767
disassemble 375 885
disassemble_continue 45B 1115
disassemble_err 44B 1099
disassemble_next 379 889
disassemble_print_opcode_params_end 448 1096
disassemble_print_opcode_params_loop 3F4 1012
disassemble_print_opcode_raw 3B6 950
disassemble_print_opcode_raw_fill 3CA 970
disassemble_table_first_match 48D 1165
disassemble_table_found 4A7 1191
disassemble_table_notfound 4AB 1195
disassemble_table_seek 469 1129
disassemble_table_seek_loop 46D 1133
dump_pretty 12BE 4798
dump_pretty_ascii 12E8 4840
dump_pretty_ascii_cont 1306 4870
dump_pretty_ascii_loop 12F0 4848
dump_pretty_ascii_none 1301 4865
dump_pretty_col 12DB 4827
dump_pretty_end 1318 4888
dump_pretty_nextrow 130C 4876
dump_pretty_row 12C6 4806
ide_printerror 116E 4462
ide_readsector_256 10ED 4333
ide_readsector_256_done 111C 4380
ide_readsector_256_waitloop 10EF 4335
ide_readsector_512_inv 111D 4381
ide_readsector_512_inv_waitloop 1122 4386
ide_readsector_timeout 1158 4440
ide_regread_8 10CF 4303
ide_regwrite_8 10B3 4275
ide_reset 10A6 4262
ide_writesector_256 116D 4461
ideif_init_drive 11F4 4596
ideif_init_drive_detected 1222 4642
ideif_init_drive_loop1 1208 4616
ideif_init_drive_nodrv 121B 4635
mon_start_complete 7B 123
mon_start_init_ctc 50 80
mon_start_init_serial 64 100
mon_start_init_sound 50 80
mon_start_ram 67 103
mon_start_ram_loop 70 112
mon_var_template 44 68
mon_var_template_end 6E 110
param_01 4D7 1239
param_02 4FE 1278
param_03 51B 1307
param_03_done 553 1363
param_03_neg 53C 1340
param_04 557 1367
param_04_i 567 1383
param_05 56D 1389
param_06 57A 1402
param_07 594 1428
param_08 5A1 1441
param_09 5B6 1462
param_09_0A 5BC 1468
param_0A 5AD 1453
param_10 5CB 1483
param_11 5DB 1499
param_11_12 5EA 1514
param_11_12_all 60A 1546
param_11_12_def 5FD 1533
param_11_12_ix 602 1538
param_11_12_iy 607 1543
param_12 5E3 1507
param_13 61B 1563
param_80 63A 1594
param_80_seek 641 1601
param_81 631 1585
param_comma 675 1653
param_printRegister 650 1616
param_printRegisterA 66E 1646
param_printRegisterHL 666 1638
print_a_hex 2E7 743
print_char 2B7 695
print_clear 2CA 714
print_newLine 2D1 721
print_str 2BF 703
print_str_end 2C9 713
print_str_fixed 1358 4952
print_wait_out 2DC 732
read_char 2F8 760
read_lba_sector 1256 4694
str_dev_notfound 12B3 4787
str_dev_ready 129D 4765
str_dev_ready2 12AA 4778
str_dev_waitready 1289 4745
str_error_start 11A1 4513
str_error_start1 11BE 4542
str_error_start2 11C7 4551
str_error_time 11D0 4560
var_buffer 4029 16425
var_buffer_len 4000 16384
var_bytes_count=411A 16666
var_curserchar 4006 16390
var_curserlastaddr 4007 16391
var_curseron 4005 16389
var_curserstate 4004 16388
var_curserx 4002 16386
var_cursery 4003 16387
var_last_char 4001 16385
var_opcode =4114 16660
var_opcode_length=4116 16662
var_opcode_pcount=4119 16665
var_opcode_start=4110 16656
var_opcode_string=4117 16663
var_opcode_table=4112 16658
var_opcode_x =4115 16661
var_ps2mem 4019 16409
var_scratch 4009 16393
xmodem_ack 107B 4219
xmodem_await_conn F34 3892
xmodem_end FDF 4063
xmodem_err FA5 4005
xmodem_init F06 3846
xmodem_int FE6 4070
xmodem_int_cont 1005 4101
xmodem_nak 1089 4233
xmodem_out 1037 4151
xmodem_packet F3F 3903
xmodem_packet_EOT F9D 3997
xmodem_packet_get F51 3921
xmodem_packet_get_crc F8A 3978
xmodem_packet_get_data F7B 3963
xmodem_read_timeount=03 3
xmodem_read_wait 100A 4106
xmodem_read_wait_loop 1018 4120
xmodem_read_wait_timeout 1035 4149
xmodem_wait 1097 4247
xmodem_wait_1 109D 4253
xmodem_wait_out 103D 4157