Files
2024-11-30 15:41:09 +01:00

6148 lines
261 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
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: ;----------------------------------------------------------------
2: ;Z8C Homebrew Computer Monitor
3: ;by Dennis Gunia (01/2023)
4: ;----------------------------------------------------------------
5:
6: ;================================================================
7: ; Memory areas
8: ;================================================================
9: - 4000 SYS_RAM_START equ 0x4000
10: - 4010 SYS_BUF_START equ 0x4010
11: - 4110 PRG_RAM_START equ 0x4110
12: - FF00 PRG_RAM_TOP equ 0xFF00
13: - FFFF STACK_RAM_TOP equ 0xFFFF
14:
15: ;================================================================
16: ; Terminal configuration
17: ;================================================================
18: - 000F VAR_CONSOLE_CONF equ 0x0F ;CPU/16 Clock @ 230402.5625/s
19: - 0018 VAR_CONSOLE_BAUD equ 24 ;BAUD timer constant
20: ;CLK/TRG Clock @ 1843220.5/s
21: ; -> 0x16 : 14400
22: ;CPU/16 Clock @ 230402.5625/s
23: ; -> 12 : 19200
24: ; -> 24 : 9600
25:
26: ;================================================================
27: ; Includes (1/2)
28: ;================================================================
29: ; include IO device addresses
30: .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
48:
49: - 00F8 CS_APU_DATA .EQU 0xF8
**** main.asm ****
31: - 00F9 CS_APU_CTRL .EQU 0xF9
32:
33: ;================================================================
34: ; RST Vectors for BASIC
35: ;================================================================
36: - 0000 org 0x0000
37: - 0000 RST_00: ;Hardware Restart
38: 0+10 0000 C38600 jp BOOT_PHASE0
39:
40: - 0008 org 0x0008
41: - 0008 RST_08 ;Print Char
42: 10+10 0008 C3F10D jp EXEC_RST_08
43:
44: - 0010 org 0x0010
45: - 0010 RST_10 ;receive char
46: 20+10 0010 C3F50D jp EXEC_RST_10
47:
48: - 0018 org 0x0018
49: - 0018 RST_18 ;Buffer length
50: 30+10 0018 C3010E jp EXEC_RST_18
51:
52: ;================================================================
53: ; Default interrupt vectors
54: ;================================================================
55: - 001B INT_VEC:
56: - 0044 org 0x0044
57: ;DEFW EXEC_INT_VDP
58:
59: ;================================================================
60: ; Memory layout
61: ;================================================================
62:
63: - 0444 mon_var_template_sof .EQU mon_var_template + 1024
64:
65: - 0044 mon_var_template:
66: - 4000 phase SYS_RAM_START
67: - 4000 interrupt_vectors:
68: - 4000 ..40FF 00 defs 256
69: - 4100 var_buffer_conin_data: ;contains console input
70: - 4100 ..41FF 00 defs 256
71: - 4200 var_buffer_conin_in: ;pointer to write position of buffer
72: - 4200 00 defb 0
73: - 4201 var_buffer_conin_out: ;pointer to read position of buffer
74: - 4201 00 defb 0
75: - 4202 var_buffer_conin_sts:
76: - 4202 00 defb 0
77: - 4203 var_buffer_conout:
78: - 4203 00 defb 0
79: - 4204 var_buffer_len:
80: - 4204 00 defb 0
81: - 4205 var_last_char:
82: - 4205 00 defb 0
83: - 4206 var_curserx:
84: - 4206 00 defb 0
85: - 4207 var_cursery:
86: - 4207 00 defb 0
87: - 4208 var_curserstate:
88: - 4208 00 defb 0
89: - 4209 var_curseron:
90: - 4209 00 defb 0
91: - 420A var_curserchar:
92: - 420A 00 defb 0
93: - 420B var_curserlastaddr:
94: - 420B 0000 defw 0
95: - 420D var_pio_present:
96: - 420D 00 defb 0
97: - 420E var_apu_present:
98: - 420E 00 defb 0
99: - 420F var_scratch:
100: - 420F ..421E 00 defs 16 ;16 bytes space for scratch vars
101: - 421F var_ps2mem:
102: - 421F ..422E 00 defs 16 ;16 bytes space for scratch vars
103: - 422F var_dir:
104: - 422F ..427E 00 defs 80
105: - 427F var_input:
106: - 427F ..42CE 00 defs 80
107: - 42CF var_idebuffer:
108: - 42CF ..45CE 00 defs 768
109:
110: - 0613 dephase
111: - 0613 mon_var_template_end:
112: 40+4 0613 00 nop
113:
114: ;================================================================
115: ; Start of monitor
116: ;================================================================
117: .include "ref.s" ;static bios calls for programs
**** include/ref.s ****
1: ;-------------------------------------
2: ; BIOS Routines entry points
3: ; Do not move in memory!!!!
4: ;-------------------------------------
5: - 0050 org 0x0050
6: - 0050 B_BEEP:
7: 44+10 0050 C3040E jp beep
8:
9: - 0053 B_IICSEND:
10: 54+10 0053 C3E116 jp iic_send_buffer
11:
12: - 0056 B_IICRECV:
13: 64+10 0056 C30B17 jp iic_receive_buffer
14:
15: - 0059 B_PRINTCHAR:
16: 74+10 0059 C3F600 jp print_char
17:
18: - 005C B_PRINTSTR:
19: 84+10 005C C3FC00 jp print_str
20:
21: - 005F B_PRINTINLINE:
22: 94+10 005F C3EC01 jp PRINTINLINE
23:
24: - 0062 B_PRINTAHEX:
25: 104+10 0062 C32201 jp print_a_hex
26:
27: - 0065 B_PRINTLN:
28: 114+10 0065 C30C01 jp print_newLine
29:
30: - 0068 B_READCHAR:
31: 124+10 0068 C34C01 jp read_char
32:
33: - 006B B_KEYREAD:
34: 134+10 006B C9 ret ;placeholder -> not implemented
35: - 006C 0000 db 0x00, 0x00
36:
37: - 006E B_KEYREADASCII:
38: 144+10 006E C9 ret ;placeholder -> not implemented
39: - 006F 0000 db 0x00, 0x00
40:
41: - 0071 B_KEYSEND:
42: 154+10 0071 C9 ret ;placeholder -> not implemented
43: - 0072 0000 db 0x00, 0x00
44:
45: - 0074 B_DSKSEL:
46: 164+10 0074 C3B815 jp ideif_drv_sel
47:
48: - 0077 B_FATOPEN:
49: 174+10 0077 C37723 jp fat_openfile
50:
51: - 007A B_FATREAD:
52: 184+10 007A C34A23 jp fat_readfilesec
53:
54: - 007D B_FATCD:
55: 194+10 007D C3FB25 jp fat_cd_single
56:
57: - 0080 B_FATCREATE:
58: 204+10 0080 C9 ret ;placeholder -> not implemented
59: - 0081 0000 db 0x00, 0x00
60:
61: - 0083 B_FATWRITE:
62: 214+10 0083 C9 ret ;placeholder -> not implemented
**** main.asm ****
118: - 0084 0000 db 0x00, 0x00
119:
120: - 0086 BOOT_PHASE0: ;Setup Hardware
121: ;Setup Stack-Pointer
122: 224+10 0086 31FFFF ld sp, STACK_RAM_TOP
123: ;Disable Interrupts
124: 234+4 0089 F3 di
125: ;Setup PIO on MIO Board
126: 238+7 008A 3ECF LD A,0xCF
127: 245+11 008C D3F6 OUT (CS_PIO_AC), A
128: 256+7 008E 3EF7 LD A,11110111b ;All pins inputs except speaker
129: 263+11 0090 D3F6 OUT (CS_PIO_AC), A
130: 274+7 0092 3E03 LD A,00000011B ;Preset I2C pins to high
131: 281+11 0094 D3F6 OUT (CS_PIO_AC), A
132:
133: ;Set variables
134: 292+13 0096 320842 ld (var_curserstate),a
135: 305+13 0099 320942 ld (var_curseron),a
136: 318+7 009C 3E20 ld a, " "
137: 325+13 009E 320A42 ld (var_curserchar),a
138:
139: ;Enable interupts
140: 338+17 00A1 CD2E18 call intctrl_init
141: ;Initialize Console (Serial-Port)
142: 355+17 00A4 CDEF00 call CONSOLE_INIT
143:
144:
145: ;clear memory area
146: 372+10 00A7 214404 ld hl, [mon_var_template_sof]
147: 382+10 00AA 01CF01 ld bc, [mon_var_template_end-mon_var_template_sof]
148: 392+10 00AD 114504 ld de, [mon_var_template_sof+1]
149: 402+4 00B0 AF xor a
150: 406+7 00B1 77 ld (hl),a
151: 413+16+5 00B2 EDB0 ldir
152:
153: 429+10 00B4 C3CB00 jp BOOT_PHASE2 ;skip rest of table init
154: - 00B7 BOOT_PHASE1: ;Copy default values to RAM
155: 439+10 00B7 214404 ld hl,mon_var_template + 1024
156: 449+10 00BA 111306 ld de,mon_var_template_end
157: 459+10 00BD 010040 ld bc,SYS_RAM_START
158: - 00C0 BOOT_PHASE1_LOOP:
159: 469+7 00C0 7E ld a,(hl) ;copy values
160: 476+7 00C1 02 ld (bc),a
161: 483+6 00C2 23 inc hl
162: 489+6 00C3 03 inc bc
163: 495+11 00C4 E5 push hl ;check if end is reached
164: 506+15 00C5 ED52 sbc hl,de
165: 521+10 00C7 E1 pop hl
166: 531+10 00C8 C2C000 jp nz, BOOT_PHASE1_LOOP
167: ;template copy done
168:
169:
170: - 00CB BOOT_PHASE2: ;Hardware initialized.
171: ; Print banner
172: 541+17 00CB CD0501 call print_clear
173: 558+10 00CE 21E927 ld hl, [STR_Banner_Start]
174: 568+17 00D1 CDFC00 call print_str
175:
176: ; Power-On Self Tests
177: 585+17 00D4 CDA81F call POST_START
178:
179: ; Detect IDE drives
180: 602+17 00D7 CD6C15 call ideif_init_all
181:
182: ; Beep after start
183: 619+10 00DA 114000 LD DE,0x40
184: 629+10 00DD 014800 LD BC,0x48
185: 639+17 00E0 CD040E CALL beep
186:
187: 656+4 00E3 AF xor a ;set dir to empty
188: 660+13 00E4 322F42 ld (var_dir),a
189: 673+13 00E7 323042 ld (var_dir+1),a
190: ;enable interrupts
191: 686+4 00EA FB ei
192: ; Start commandline
193: 690+10 00EB C3A41A jp COMMAND
194:
195: ; This instruction should never be reached
196: 700+4 00EE 76 halt
197:
198: ;================================================================
199: ; Includes (2/2)
200: ;================================================================
201: .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:
10: - 00EF CONSOLE_INIT:
11: 704+17 00EF CD8E01 call con_rb_init; initialize ring buffer
12: 721+17 00F2 CDCE18 call consio_init_a
13: 738+10 00F5 C9 ret
14:
15:
16: ; A contains char
17: ; Destroys A
18: - 00F6 print_char:
19: 748+11 00F6 F5 push af
20: 759+17 00F7 CD2619 call consio_tx_a
21: 776+10 00FA F1 pop af
22: 786+10 00FB C9 ret
23: ; HL contains pointer to string
24: ; Destroy A, HL
25:
26: - 00FC print_str:
27: 796+7 00FC 7E ld a, (hl)
28: 803+4 00FD B7 or a
29: 807+5+6 00FE C8 ret z
30: 812+17 00FF CDF600 call print_char
31: 829+6 0102 23 inc hl
32: 835+12 0103 18F7 jr print_str
33:
34:
35: - 0105 print_clear:
36: 847+10 0105 21D201 ld hl, [MSG_CLEAR]
37: 857+17 0108 CDFC00 call print_str
38: 874+10 010B C9 ret
39:
40: - 010C print_newLine:
41: 884+7 010C 3E0A ld a,10
42: 891+17 010E CDF600 call print_char
43: 908+7 0111 3E0D ld a,13
44: 915+17 0113 CDF600 call print_char
45: 932+10 0116 C9 ret
46: ; destroys a
47: - 0117 print_wait_out:
48: ; check for TX buffer empty
49: 942+4 0117 97 sub a ;clear a, write into WR0: select RR0
50: 946+4 0118 3C inc a ;select RR1
51: 950+11 0119 D309 out (CS_SIO_A_C),A
52: 961+11 011B DB09 in A,(CS_SIO_A_C) ;read RRx
53: 972+8 011D CB47 bit 0,A
54: 980+7+5 011F 28F6 jr z,print_wait_out
55: 987+10 0121 C9 ret
56:
57: - 0122 print_a_hex:
58: 997+11 0122 F5 push af
59: 1008+11 0123 C5 push bc
60: 1019+11 0124 D5 push de
61: 1030+17 0125 CD8802 call STRCONV_BYTES_TO_HEX
62: 1047+4 0128 78 ld a,b
63: 1051+17 0129 CDF600 call print_char
64: 1068+4 012C 79 ld a,c
65: 1072+17 012D CDF600 call print_char
66: 1089+10 0130 D1 pop de
67: 1099+10 0131 C1 pop bc
68: 1109+10 0132 F1 pop af
69: 1119+10 0133 C9 ret
70:
71: - 0134 print_bcd:
72: 1129+7 0134 C630 ADD 48 ;offset for ascii number
73: 1136+17 0136 CDF600 call print_char
74: 1153+10 0139 C9 ret
75:
76: - 013A read_char_raw:
77: 1163+17 013A CDE301 call A_RTS_ON
78: 1180+4 013D 00 nop
79: 1184+4 013E AF xor a ; a = 0
80: 1188+11 013F D309 out (CS_SIO_A_C), a ; select reg 0
81: 1199+11 0141 DB09 in a, (CS_SIO_A_C) ; read reg 0
82: 1210+7 0143 E601 and 1 ; mask D0 (recieve char available)
83: 1217+17 0145 CDDA01 call A_RTS_OFF
84: 1234+5+6 0148 C8 ret Z ; return 0 if no char
85: 1239+11 0149 DB08 in a, (CS_SIO_A_D) ; read char if avail
86: 1250+10 014B C9 ret ; return
87:
88: - 014C read_char:
89: 1260+10 014C C33319 jp consio_rx_a
90:
91: - 014F read_bcd;
92: 1270+17 014F CD4C01 call read_char
93: 1287+10 0152 CA4F01 jp z, read_bcd
94: 1297+17 0155 CDF600 call print_char
95: 1314+7 0158 DE30 sbc 48 ;remove ascii offset
96: 1321+10 015A DA6501 jp c, _read_bcd_invalid ;if carry, wrong input
97: 1331+7 015D FE0A cp 10
98: 1338+10 015F CA6501 jp z, _read_bcd_invalid ;if equal or greater than 10, also error
99: 1348+7 0162 E60F and 0x0F ;mask unused bits
100: 1355+10 0164 C9 ret
101: - 0165 _read_bcd_invalid
102: 1365+7 0165 3EFF ld a, 0xFF
103: 1372+10 0167 C9 ret
104:
105: - 0168 print_32_hex:
106: 1382+19 0168 DD7E03 ld a,(ix+3)
107: 1401+17 016B CD2201 call print_a_hex
108: 1418+19 016E DD7E02 ld a,(ix+2)
109: 1437+17 0171 CD2201 call print_a_hex
110: 1454+19 0174 DD7E01 ld a,(ix+1)
111: 1473+17 0177 CD2201 call print_a_hex
112: 1490+19 017A DD7E00 ld a,(ix+0)
113: 1509+17 017D CD2201 call print_a_hex
114: 1526+10 0180 C9 ret
115:
116: - 0181 print_16_hex:
117: 1536+19 0181 DD7E01 ld a,(ix+1)
118: 1555+17 0184 CD2201 call print_a_hex
119: 1572+19 0187 DD7E00 ld a,(ix+0)
120: 1591+17 018A CD2201 call print_a_hex
121: 1608+10 018D C9 ret
122:
123: ;input ringbuffer
124: ;initialize ringbuffer
125: - 018E con_rb_init:
126: 1618+4 018E AF xor a
127: 1622+13 018F 320042 ld (var_buffer_conin_in),a
128: 1635+13 0192 320142 ld (var_buffer_conin_out),a
129: 1648+13 0195 320242 ld (var_buffer_conin_sts),a
130: 1661+10 0198 C9 ret
131:
132: - 0199 con_rb_read:
133: 1671+11 0199 E5 push hl
134: 1682+11 019A D5 push de
135: 1693+13 019B 3A0042 ld a,(var_buffer_conin_in)
136: 1706+4 019E 47 ld b,a
137: 1710+13 019F 3A0142 ld a,(var_buffer_conin_out)
138: 1723+4 01A2 B8 cp b ;check if equal
139: 1727+10 01A3 CAB601 jp z, con_rb_read_empty
140: ;if not equal, buffer contians data
141: 1737+7 01A6 2641 ld h, high [var_buffer_conin_data] ;load high byte for pointer
142: 1744+4 01A8 6F ld l, a
143: 1748+7 01A9 7E ld a,(hl)
144: 1755+11 01AA F5 push af
145: ;move pointer
146: 1766+13 01AB 3A0142 ld a,(var_buffer_conin_out)
147: 1779+4 01AE 3C inc a
148: 1783+13 01AF 320142 ld (var_buffer_conin_out),a
149: 1796+10 01B2 F1 pop af
150: 1806+10 01B3 D1 pop de
151: 1816+10 01B4 E1 pop hl
152: 1826+10 01B5 C9 ret
153: - 01B6 con_rb_read_empty:
154: 1836+7 01B6 3E01 ld a,1
155: 1843+13 01B8 320242 ld (var_buffer_conin_sts),a
156: 1856+4 01BB AF xor a
157: 1860+10 01BC D1 pop de
158: 1870+10 01BD E1 pop hl
159: 1880+10 01BE C9 ret
160:
161: - 01BF con_rb_write:
162: 1890+11 01BF E5 push hl
163: 1901+11 01C0 F5 push af
164: 1912+7 01C1 2641 ld h, high [var_buffer_conin_data] ;load high byte for pointer
165: 1919+13 01C3 3A0042 ld a,(var_buffer_conin_in)
166: 1932+4 01C6 6F ld l,a
167: 1936+10 01C7 F1 pop af
168: 1946+7 01C8 77 ld (hl),a
169: 1953+13 01C9 3A0042 ld a,(var_buffer_conin_in)
170: 1966+4 01CC 3C inc a
171: 1970+13 01CD 320042 ld (var_buffer_conin_in),a
172: ;TODO: check for overflow
173: 1983+10 01D0 E1 pop hl
174: 1993+10 01D1 C9 ret
175:
176:
177: ;MSG_CRSR_0:
178: ; db 0x1B, "[?25h",0
179: ;MSG_CRSR_1:
180: ; db 0x1B, "[?25l",0
181: - 01D2 MSG_CLEAR:
182: - 01D2 1B5B324A db 27, '[2J', 27, '[H',0
1B5B4800
183:
184:
185:
186: ; Serial Util Functions
187: - 01DA A_RTS_OFF:
188: 2003+7 01DA 3E05 ld a,005h ;write into WR0: select WR5
189: 2010+11 01DC D309 out (CS_SIO_A_C),A
190: 2021+7 01DE 3E68 ld a,068h ;DTR inactive, TX 8bit, BREAK off, TX on, RTS inactive
191: 2028+11 01E0 D309 out (CS_SIO_A_C),A
192: 2039+10 01E2 C9 ret
193: - 01E3 A_RTS_ON:
194: 2049+7 01E3 3E05 ld a,005h ;write into WR0: select WR5
195: 2056+11 01E5 D309 out (CS_SIO_A_C),A
196: 2067+7 01E7 3EEA ld a,0EAh ;DTR active, TX 8bit, BREAK off, TX on, RTS active
197: 2074+11 01E9 D309 out (CS_SIO_A_C),A
198: 2085+10 01EB C9 ret
199:
200: ;------------------------------------------------------------------------------
201: ; PRINTINLINE
202: ;
203: ; String output function
204: ;
205: ; Prints in-line data (bytes immediately following the PRINTINLINE call)
206: ; until a string terminator is encountered (0 - null char).
207: ;------------------------------------------------------------------------------
208: - 01EC PRINTINLINE:
209: 2095+19 01EC E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL
210: 2114+11 01ED F5 PUSH AF
211: 2125+11 01EE C5 PUSH BC
212: - 01EF nxtILC:
213: 2136+7 01EF 7E LD A,(HL)
214: 2143+7 01F0 FE00 CP 0
215: 2150+7+5 01F2 2806 JR Z,endPrint
216: 2157+17 01F4 CDF600 CALL print_char
217: 2174+6 01F7 23 INC HL
218: 2180+12 01F8 18F5 JR nxtILC
219: - 01FA endPrint:
220: 2192+6 01FA 23 INC HL ; Get past "null" terminator
221: 2198+10 01FB C1 POP BC
222: 2208+10 01FC F1 POP AF
223: 2218+19 01FD E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL
224: 2237+10 01FE C9 RET
225:
226: - 01FF print_reg:
227: 2247+11 01FF F5 push af
228: 2258+11 0200 D5 push de
229: 2269+11 0201 C5 push bc
230: 2280+11 0202 E5 push hl
231: 2291+11 0203 F5 push af
232: 2302+17 0204 CDEC01 call PRINTINLINE
233: - 0207 0A0D413A db 10,13,"A: ",0
202000
234: 2319+10 020E F1 pop af
235: 2329+17 020F CD2201 call print_a_hex
236: 2346+17 0212 CDEC01 call PRINTINLINE
237: - 0215 0A0D4243 db 10,13,"BC: ",0
3A2000
238: 2363+4 021C 78 ld a,b
239: 2367+17 021D CD2201 call print_a_hex
240: 2384+4 0220 79 ld a,c
241: 2388+17 0221 CD2201 call print_a_hex
242: 2405+17 0224 CDEC01 call PRINTINLINE
243: - 0227 0A0D4445 db 10,13,"DE: ",0
3A2000
244: 2422+4 022E 7A ld a,d
245: 2426+17 022F CD2201 call print_a_hex
246: 2443+4 0232 7B ld a,e
247: 2447+17 0233 CD2201 call print_a_hex
248: 2464+10 0236 F1 pop af
249: 2474+17 0237 CDEC01 call PRINTINLINE
250: - 023A 0A0D484C db 10,13,"HL: ",0
3A2000
251: 2491+4 0241 7C ld a,h
252: 2495+17 0242 CD2201 call print_a_hex
253: 2512+4 0245 7D ld a,l
254: 2516+17 0246 CD2201 call print_a_hex
255: 2533+17 0249 CD0C01 call print_newLine
256: 2550+10 024C E1 pop hl
257: 2560+10 024D C1 pop bc
258: 2570+10 024E D1 pop de
259: 2580+10 024F F1 pop af
**** main.asm ****
202: 2590+10 0250 C9 ret
203: .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: - 0251 DHEX_TO_BYTE:
7: 2600+11 0251 E5 PUSH HL ;Backup pointer
8: ; Load First Byte
9: 2611+7 0252 7E LD A,(HL) ;Load first char (high)
10: 2618+17 0253 CD7102 CALL HEX_TO_BIN ;Conv chart to 4bit
11: 2635+7+5 0256 3815 jr C, DHEX_TO_BYTE_FAILED ;If error jmp to DHEX_TO_BYTE_FAILED
12: 2642+8 0258 CB27 SLA A ;shift result to upper 4 bits
13: 2650+8 025A CB27 SLA A
14: 2658+8 025C CB27 SLA A
15: 2666+8 025E CB27 SLA A
16: 2674+4 0260 57 LD D,A ;store result in D
17:
18: 2678+6 0261 23 INC HL ;next byte
19: 2684+7 0262 7E LD A,(HL) ;load 2nd char (lower)
20: 2691+17 0263 CD7102 CALL HEX_TO_BIN ;Conv chart to 4bit
21: 2708+7+5 0266 3805 jr C, DHEX_TO_BYTE_FAILED ;If error jmp to DHEX_TO_BYTE_FAILED
22: 2715+4 0268 B2 OR D ;merge D with accumulator
23:
24: 2719+10 0269 E1 POP HL ;restor original pointer
25: 2729+7 026A 1E00 LD E,0x00 ;set error to 0x00 = no error
26: 2736+10 026C C9 RET
27: - 026D DHEX_TO_BYTE_FAILED:
28: 2746+7 026D 1EFF LD E,0xFF ;set error to oxFF
29: ;LD A,0x00
30: 2753+10 026F E1 POP HL
31: 2763+10 0270 C9 RET
32:
33: ; REG A Contains CHAR-Low
34: ; If failed, Carry is set
35: - 0271 HEX_TO_BIN:
36: 2773+7 0271 D630 SUB 48 ; 0 is 0
37: 2780+10 0273 EA8602 jp PE, HEX_TO_INVALID_2; to low (SUB overflow)
38: 2790+7 0276 FE0A CP 10 ; Value is between 0 and 9
39: 2797+7+5 0278 3805 JR C, HEX_TO_BIN_2
40: 2804+7 027A D607 SUB 7
41: 2811+10 027C EA8602 jp PE, HEX_TO_INVALID_2; to low (SUB overflow)
42: - 027F HEX_TO_BIN_2:
43: 2821+7 027F FE10 CP 16
44: 2828+7+5 0281 3003 JR NC, HEX_TO_INVALID_2; if bigger than 15-> fail
45: 2835+7 0283 E60F AND 0x0F
46: 2842+10 0285 C9 RET
47: - 0286 HEX_TO_INVALID_2:
48: 2852+4 0286 37 SCF ;set carry flag
49: 2856+10 0287 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: - 0288 STRCONV_BYTES_TO_HEX:
63: 2866+11 0288 F5 PUSH AF;Backup A Register
64: 2877+4 0289 1F RRA
65: 2881+4 028A 1F RRA
66: 2885+4 028B 1F RRA
67: 2889+4 028C 1F RRA
68: 2893+17 028D CD9702 CALL STRCONV_BYTES_TO_HEX_1
69: ;LD A,D
70: 2910+4 0290 47 LD B,A
71: 2914+10 0291 F1 POP AF ; Reload first Byte
72: 2924+17 0292 CD9702 CALL STRCONV_BYTES_TO_HEX_1
73: ;LD A,D
74: 2941+4 0295 4F LD C,A
75: 2945+10 0296 C9 RET
76:
77: - 0297 STRCONV_BYTES_TO_HEX_1:
78: 2955+7 0297 E60F AND 0x0F
79: 2962+7 0299 C630 ADD 48
80: 2969+7 029B FE3A CP 58 ; Check if less than 58 (less than ASCII 9)
81: ;JR C, STRCONV_BYTES_TO_HEX_2
82: 2976+5+6 029D D8 RET C
83: 2981+7 029E C607 ADD 7 ; A-F
84: 2988+10 02A0 C9 RET
85: - 02A1 STRCONV_BYTES_TO_HEX_2:
86: ;LD D,A
87: 2998+10 02A1 C9 RET
88:
89:
**** main.asm ****
204: .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: - 02A2 disassemble:
12: 3008+4 02A2 78 ld a,b
13: 3012+13 02A3 321A41 ld (var_bytes_count),a
14: - 02A6 disassemble_next:
15:
16:
17: 3025+16 02A6 221041 ld (var_opcode_start), hl ;16 bit pointer to opcode in mem
18: 3041+7 02A9 7E ld a,(hl) ;load opcode to find in A
19: 3048+13 02AA 321441 ld (var_opcode), a ;8 bit opcode value
20: 3061+6 02AD 23 inc hl
21: 3067+7 02AE 7E ld a,(hl) ;load opcode to find in A
22: 3074+13 02AF 321541 ld (var_opcode_x), a ;8 bit opcode extended value
23: 3087+6 02B2 2B dec hl
24: 3093+17 02B3 CD9603 call disassemble_table_seek
25: 3110+4 02B6 78 ld a,b
26: 3114+4 02B7 B1 or c
27: 3118+10 02B8 CA7803 jp z, disassemble_err ;if bc==0000h
28:
29: 3128+20 02BB ED431241 ld (var_opcode_table), bc ;16 bit pointer to opcode in table
30:
31: ;load params
32: 3148+6 02BF 03 inc bc
33: 3154+6 02C0 03 inc bc
34: 3160+6 02C1 03 inc bc
35: 3166+6 02C2 03 inc bc
36: 3172+7 02C3 0A ld a,(bc)
37: 3179+13 02C4 321641 ld (var_opcode_length),A ;8 bit opcode length (in bytes)
38: 3192+6 02C7 03 inc bc
39: 3198+7 02C8 0A ld a, (bc)
40: 3205+4 02C9 5F ld e,a
41: 3209+6 02CA 03 inc bc
42: 3215+7 02CB 0A ld a, (bc)
43: 3222+4 02CC 57 ld d,a
44: 3226+20 02CD ED531741 ld (var_opcode_string),de ;16 bit pointer to opcode string
45: 3246+6 02D1 03 inc bc
46: 3252+7 02D2 0A ld a,(bc)
47: 3259+13 02D3 321941 ld (var_opcode_pcount),A ;8 bit opcode param count
48:
49: ;values are prepared. Continue with print
50:
51: 3272+16 02D6 2A1041 ld hl,(var_opcode_start) ;print address
52: 3288+17 02D9 CDDE03 call dasm_print16hex_addr
53:
54: 3305+13 02DC 3A1641 ld a,(var_opcode_length)
55: 3318+4 02DF 47 ld b, a
56:
57: ;print up to 4 opcode bytes
58: 3322+16 02E0 2A1041 ld hl,(var_opcode_start)
59:
60: - 02E3 disassemble_print_opcode_raw
61: 3338+7 02E3 7E ld a,(hl) ;load first byte
62: 3345+17 02E4 CD2201 call print_a_hex
63: 3362+6 02E7 23 inc hl
64: 3368+8+5 02E8 10F9 djnz disassemble_print_opcode_raw
65:
66: 3376+7 02EA 3E68 ld a,"h"
67: 3383+17 02EC CDF600 call print_char
68: ;fill empty spots
69: 3400+13 02EF 3A1641 ld a,(var_opcode_length)
70: 3413+4 02F2 47 ld b,a
71: 3417+7 02F3 3E06 ld a,6
72: 3424+4 02F5 90 sub b
73: 3428+4 02F6 47 ld b,a
74:
75: - 02F7 disassemble_print_opcode_raw_fill:
76: 3432+7 02F7 3E20 ld a," "
77: 3439+17 02F9 CDF600 call print_char
78: 3456+7 02FC 3E20 ld a," "
79: 3463+17 02FE CDF600 call print_char
80: 3480+8+5 0301 10F4 djnz disassemble_print_opcode_raw_fill
81: 3488+7 0303 3E20 ld a," "
82: 3495+17 0305 CDF600 call print_char
83:
84: 3512+11 0308 E5 push hl
85: ;print opcode
86: 3523+16 0309 2A1741 ld hl,(var_opcode_string)
87: 3539+17 030C CDFC00 call print_str
88:
89:
90: ;print params
91: 3556+13 030F 3A1941 ld a,(var_opcode_pcount)
92: 3569+4 0312 B7 or a
93: 3573+10 0313 CA7503 jp z, disassemble_print_opcode_params_end ;skip if no params
94:
95: 3583+16 0316 2A1241 ld hl,(var_opcode_table)
96: 3599+10 0319 010800 ld bc, 8
97: 3609+11 031C 09 add hl,bc ;hl now has address of first param
98: 3620+13 031D 3A1941 ld a,(var_opcode_pcount)
99: 3633+4 0320 47 ld b,a
100: - 0321 disassemble_print_opcode_params_loop:
101: ;ld a,(hl) ;load param
102: ;call print_a_hex
103: 3637+7 0321 7E ld a,(hl) ;load param
104:
105: 3644+7 0322 FE01 cp 0x01
106: 3651+10+7 0324 CC0404 call z, param_01
107: 3661+7 0327 FE02 cp 0x02
108: 3668+10+7 0329 CC2B04 call z, param_02
109: 3678+7 032C FE03 cp 0x03
110: 3685+10+7 032E CC4804 call z, param_03
111: 3695+7 0331 FE04 cp 0x04
112: 3702+10+7 0333 CC8404 call z, param_04
113: 3712+7 0336 FE05 cp 0x05
114: 3719+10+7 0338 CC9A04 call z, param_05
115: 3729+7 033B FE06 cp 0x06
116: 3736+10+7 033D CCA704 call z, param_06
117: 3746+7 0340 FE07 cp 0x07
118: 3753+10+7 0342 CCC104 call z, param_07
119: 3763+7 0345 FE08 cp 0x08
120: 3770+10+7 0347 CCCE04 call z, param_08
121: 3780+7 034A FE09 cp 0x09
122: 3787+10+7 034C CCE304 call z, param_09
123: 3797+7 034F FE10 cp 0x10
124: 3804+10+7 0351 CCF804 call z, param_10
125: 3814+7 0354 FE11 cp 0x11
126: 3821+10+7 0356 CC0805 call z, param_11
127: 3831+7 0359 FE12 cp 0x12
128: 3838+10+7 035B CC1005 call z, param_12
129: 3848+7 035E FE13 cp 0x13
130: 3855+10+7 0360 CC4805 call z, param_13
131: 3865+7 0363 FE0A cp 0x0A
132: 3872+10+7 0365 CCDA04 call z, param_0A
133: ;strings
134: 3882+7 0368 FE80 cp 0x80
135: 3889+10+7 036A CC6705 call z, param_80
136: 3899+7 036D FE81 cp 0x81
137: 3906+10+7 036F CC5E05 call z, param_81
138: 3916+6 0372 23 inc hl
139: 3922+8+5 0373 10AC djnz disassemble_print_opcode_params_loop
140: - 0375 disassemble_print_opcode_params_end:
141: 3930+10 0375 E1 pop hl
142: 3940+12 0376 1810 jr disassemble_continue
143:
144:
145: - 0378 disassemble_err:
146: 3952+17 0378 CDDE03 call dasm_print16hex_addr
147: 3969+7 037B 7E ld a,(hl)
148: 3976+17 037C CDF603 call dasm_print8hex ;print value
149: 3993+6 037F 23 inc hl
150: 3999+11 0380 E5 push hl
151: 4010+10 0381 21B30D ld hl, [dasm_UU]
152: 4020+17 0384 CDFC00 call print_str
153: 4037+10 0387 E1 pop hl
154:
155: - 0388 disassemble_continue:
156:
157: 4047+17 0388 CD0C01 call print_newLine
158: ;inc hl
159: 4064+13 038B 3A1A41 ld a,(var_bytes_count)
160: 4077+4 038E 3D dec a
161: 4081+13 038F 321A41 ld (var_bytes_count),a
162: 4094+10 0392 C2A602 jp nz, disassemble_next
163: 4104+10 0395 C9 ret
164:
165:
166:
167: ;A contains opcode
168: ;BC contains returned position
169: - 0396 disassemble_table_seek:
170: 4114+11 0396 E5 push hl
171: 4125+10 0397 21B105 ld hl, [dasm_opcode_table]
172: - 039A disassemble_table_seek_loop:
173: 4135+13 039A 3A1441 ld a,(var_opcode)
174: 4148+4 039D 4F ld c,a
175: 4152+7 039E 7E ld a,(hl)
176: 4159+7 039F FEFF cp 0xFF ; if null
177: 4166+10 03A1 CAD803 jp z, disassemble_table_notfound
178:
179: ;apply mask
180: 4176+11 03A4 F5 push af
181: 4187+6 03A5 23 inc hl
182: 4193+7 03A6 46 ld b,(hl) ;load mask
183: 4200+6 03A7 2B dec hl
184: 4206+4 03A8 79 ld a,c
185: 4210+4 03A9 A0 and b ;apply mask
186: 4214+4 03AA 4F ld c,a
187: 4218+10 03AB F1 pop af
188:
189: 4228+4 03AC B9 cp c ; if match
190: 4232+7+5 03AD 280B jr z, disassemble_table_first_match
191: 4239+7 03AF 0600 ld b,0
192: 4246+7 03B1 0E07 ld c,7
193: 4253+11 03B3 09 add hl,bc
194: 4264+7 03B4 7E ld a,(hl)
195: 4271+4 03B5 4F ld c,a
196: 4275+11 03B6 09 add hl,bc
197: 4286+6 03B7 23 inc hl
198: 4292+12 03B8 18E0 jr disassemble_table_seek_loop
199:
200: - 03BA disassemble_table_first_match
201: 4304+6 03BA 23 inc hl
202: 4310+6 03BB 23 inc hl
203: 4316+7 03BC 4E ld c,(hl) ;load opcode x from table
204: 4323+6 03BD 23 inc hl
205: 4329+13 03BE 3A1541 ld a,(var_opcode_x) ;load current opcode x
206: 4342+7 03C1 46 ld b,(hl) ;load mask
207: 4349+4 03C2 A0 and b ;apply mask
208: 4353+4 03C3 B9 cp c ;compare to table
209: 4357+6 03C4 2B dec hl
210: 4363+6 03C5 2B dec hl
211: 4369+6 03C6 2B dec hl
212: 4375+7+5 03C7 280B jr z, disassemble_table_found ;IF FOUND
213: 4382+7 03C9 0600 ld b,0 ;else continue with next
214:
215: 4389+7 03CB 0E07 ld c,7
216: 4396+11 03CD 09 add hl,bc
217: 4407+7 03CE 7E ld a,(hl)
218: 4414+4 03CF 4F ld c,a
219: 4418+11 03D0 09 add hl,bc
220: 4429+6 03D1 23 inc hl
221: 4435+12 03D2 18C6 jr disassemble_table_seek_loop
222:
223: - 03D4 disassemble_table_found
224: 4447+4 03D4 44 ld b,H
225: 4451+4 03D5 4D ld c,l
226: 4455+10 03D6 E1 pop hl
227: 4465+10 03D7 C9 ret
228:
229: - 03D8 disassemble_table_notfound
230: 4475+7 03D8 0600 ld b,0
231: 4482+7 03DA 0E00 ld c,0
232: 4489+10 03DC E1 pop hl
233: 4499+10 03DD C9 ret
234:
235:
236:
237:
238: - 03DE dasm_print16hex_addr:
239: 4509+7 03DE 3E24 ld a,"$"
240: 4516+17 03E0 CDF600 call print_char
241: 4533+4 03E3 7C ld a,h
242: 4537+17 03E4 CD2201 call print_a_hex
243: 4554+4 03E7 7D ld a,l
244: 4558+17 03E8 CD2201 call print_a_hex
245: 4575+7 03EB 3E68 ld a,"h"
246: 4582+17 03ED CDF600 call print_char
247: 4599+7 03F0 3E20 ld a," "
248: 4606+17 03F2 CDF600 call print_char
249: 4623+10 03F5 C9 ret
250:
251: - 03F6 dasm_print8hex:
252: 4633+17 03F6 CD2201 call print_a_hex
253: 4650+7 03F9 3E68 ld a,"h"
254: 4657+17 03FB CDF600 call print_char
255: 4674+7 03FE 3E20 ld a," "
256: 4681+17 0400 CDF600 call print_char
257: 4698+10 0403 C9 ret
258:
259:
260:
261:
262:
263:
264:
265: - 0404 param_01: ; 0x01 16bit address pointer
266: 4708+11 0404 E5 push hl
267: 4719+20 0405 ED5B1041 ld de,(var_opcode_start)
268: 4739+6 0409 13 inc de
269: 4745+7 040A 1A ld a,(de)
270: 4752+4 040B 6F ld l,a
271: 4756+6 040C 13 inc de
272: 4762+7 040D 1A ld a,(de)
273: 4769+4 040E 67 ld h,a
274:
275: 4773+7 040F 3E24 ld a,"$"
276: 4780+17 0411 CDF600 call print_char
277: 4797+4 0414 7C ld a,h
278: 4801+17 0415 CD2201 call print_a_hex
279: 4818+4 0418 7D ld a,l
280: 4822+17 0419 CD2201 call print_a_hex
281: 4839+7 041C 3E68 ld a,"h"
282: 4846+17 041E CDF600 call print_char
283: 4863+7 0421 3E20 ld a," "
284: 4870+17 0423 CDF600 call print_char
285: 4887+17 0426 CDA205 call param_comma
286: 4904+10 0429 E1 pop hl
287: 4914+10 042A C9 ret
288:
289: - 042B param_02:
290: 4924+11 042B C5 push bc
291: 4935+20 042C ED5B1041 ld de,(var_opcode_start)
292: 4955+7 0430 1A ld a,(de)
293: 4962+4 0431 1F rra
294: 4966+4 0432 1F rra
295: 4970+7 0433 E60E and 0x0E
296:
297: 4977+11 0435 E5 push hl
298: 4988+10 0436 21BC0D ld hl, [dasm_printFlags_table]
299: 4998+7 0439 0600 ld b,0
300: 5005+4 043B 4F ld c,a
301: 5009+11 043C 09 add hl,bc
302: 5020+17 043D CDFC00 call print_str
303: 5037+7 0440 3E20 ld a, " "
304: 5044+17 0442 CDF600 call print_char
305: 5061+10 0445 E1 pop hl
306: 5071+10 0446 C1 pop bc
307: 5081+10 0447 C9 ret
308:
309:
310: - 0448 param_03:
311: 5091+20 0448 ED5B1041 ld de,(var_opcode_start)
312: 5111+6 044C 13 inc de
313: 5117+7 044D 1A ld a,(de)
314:
315: 5124+11 044E F5 push af
316: 5135+7 044F E680 and 0x80
317: 5142+10 0451 C26904 jp nz, param_03_neg
318: 5152+7 0454 3E24 ld a,"$"
319: 5159+17 0456 CDF600 call print_char
320: 5176+7 0459 3E2B ld a,"+"
321: 5183+17 045B CDF600 call print_char
322: 5200+10 045E F1 pop af
323: 5210+17 045F CD2201 call print_a_hex
324: 5227+7 0462 3E68 ld a,"h"
325: 5234+17 0464 CDF600 call print_char
326: 5251+12 0467 1817 jr param_03_done
327:
328: - 0469 param_03_neg:
329: 5263+7 0469 3E24 ld a,"$"
330: 5270+17 046B CDF600 call print_char
331: 5287+7 046E 3E2D ld a,"-"
332: 5294+17 0470 CDF600 call print_char
333: 5311+10 0473 F1 pop af
334: 5321+8 0474 ED44 neg
335: 5329+17 0476 CD2201 call print_a_hex
336: 5346+7 0479 3E68 ld a,"h"
337: 5353+17 047B CDF600 call print_char
338: 5370+12 047E 1800 jr param_03_done
339:
340: - 0480 param_03_done:
341: 5382+17 0480 CDA205 call param_comma
342: 5399+10 0483 C9 ret
343:
344:
345: - 0484 param_04:
346: 5409+20 0484 ED5B1041 ld de,(var_opcode_start)
347: 5429+6 0488 13 inc de
348: 5435+7 0489 1A ld a,(de)
349: 5442+7 048A FE4D cp 0x4D
350: 5449+7+5 048C 2806 jr z,param_04_i
351: 5456+7 048E 3E4E ld a,"N"
352: 5463+17 0490 CDF600 call print_char
353: 5480+10 0493 C9 ret
354: - 0494 param_04_i:
355: 5490+7 0494 3E49 ld a,"I"
356: 5497+17 0496 CDF600 call print_char
357: 5514+10 0499 C9 ret
358:
359: - 049A param_05:
360: 5524+11 049A C5 push bc
361: 5535+20 049B ED5B1041 ld de,(var_opcode_start)
362: 5555+7 049F 1A ld a,(de)
363: 5562+7 04A0 E638 and 0x38
364: ; print hex char
365: 5569+17 04A2 CDF603 call dasm_print8hex
366: 5586+10 04A5 C1 pop bc
367: 5596+10 04A6 C9 ret
368:
369:
370: - 04A7 param_06:
371: 5606+11 04A7 C5 push bc
372: 5617+20 04A8 ED5B1041 ld de,(var_opcode_start)
373: 5637+7 04AC 1A ld a,(de)
374: 5644+4 04AD 1F rra
375: 5648+4 04AE 1F rra
376: 5652+4 04AF 1F rra
377: 5656+7 04B0 E607 and 0x07
378: 5663+17 04B2 CD7D05 call param_printRegister
379: 5680+7 04B5 3E20 ld a," "
380: 5687+17 04B7 CDF600 call print_char
381: 5704+7 04BA 3E2C ld a,","
382: 5711+17 04BC CDF600 call print_char
383: 5728+10 04BF C1 pop bc
384: 5738+10 04C0 C9 ret
385:
386: - 04C1 param_07:
387: 5748+11 04C1 C5 push bc
388: 5759+20 04C2 ED5B1041 ld de,(var_opcode_start)
389: 5779+7 04C6 1A ld a,(de)
390: 5786+7 04C7 E607 and 0x07
391:
392: 5793+17 04C9 CD7D05 call param_printRegister
393: 5810+10 04CC C1 pop bc
394: 5820+10 04CD C9 ret
395:
396: - 04CE param_08:
397: 5830+11 04CE C5 push bc
398: 5841+20 04CF ED5B1041 ld de,(var_opcode_start)
399: 5861+6 04D3 13 inc de
400: 5867+7 04D4 1A ld a,(de)
401: 5874+17 04D5 CDF603 call dasm_print8hex
402: 5891+10 04D8 C1 pop bc
403: 5901+10 04D9 C9 ret
404:
405:
406: - 04DA param_0A:
407: 5911+11 04DA E5 push hl
408: 5922+20 04DB ED5B1041 ld de,(var_opcode_start)
409: 5942+6 04DF 13 inc de
410: 5948+6 04E0 13 inc de
411: 5954+12 04E1 1806 jr param_09_0A
412: - 04E3 param_09:
413: 5966+11 04E3 E5 push hl
414: 5977+20 04E4 ED5B1041 ld de,(var_opcode_start)
415: 5997+6 04E8 13 inc de
416: - 04E9 param_09_0A:
417: 6003+7 04E9 1A ld a,(de)
418: 6010+4 04EA 6F ld l,a
419: 6014+6 04EB 13 inc de
420: 6020+7 04EC 1A ld a,(de)
421: 6027+4 04ED 67 ld h,a
422: 6031+4 04EE 7C ld a,h
423: 6035+17 04EF CD2201 call print_a_hex
424: 6052+4 04F2 7D ld a,l
425: 6056+17 04F3 CD2201 call print_a_hex
426: 6073+10 04F6 E1 pop hl
427: 6083+10 04F7 C9 ret
428:
429: - 04F8 param_10:
430: 6093+11 04F8 C5 push bc
431: 6104+20 04F9 ED5B1041 ld de,(var_opcode_start)
432: 6124+7 04FD 1A ld a,(de)
433: 6131+4 04FE 1F rra
434: 6135+4 04FF 1F rra
435: 6139+4 0500 1F rra
436: 6143+7 0501 E607 and 0x07
437: 6150+17 0503 CD7D05 call param_printRegister
438: 6167+10 0506 C1 pop bc
439: 6177+10 0507 C9 ret
440:
441:
442: - 0508 param_11:
443: 6187+11 0508 E5 push hl
444: 6198+11 0509 C5 push bc
445: 6209+20 050A ED5B1041 ld de,(var_opcode_start)
446: 6229+12 050E 1807 jr param_11_12
447: - 0510 param_12:
448: 6241+11 0510 E5 push hl
449: 6252+11 0511 C5 push bc
450: 6263+20 0512 ED5B1041 ld de,(var_opcode_start)
451: 6283+6 0516 13 inc de
452:
453: - 0517 param_11_12:
454: 6289+7 0517 1A ld a,(de)
455: 6296+4 0518 1F rra
456: 6300+4 0519 1F rra
457: 6304+4 051A 1F rra
458: 6308+7 051B E606 and 0x06
459: 6315+11 051D F5 push af
460: ;check which table to use
461: 6326+16 051E 2A1041 ld hl, (var_opcode_start)
462: 6342+7 0521 7E ld a,(hl)
463: 6349+7 0522 FEDD cp 0xDD
464: 6356+7+5 0524 2809 jr z,param_11_12_ix
465: 6363+7 0526 FEFD cp 0xFD
466: 6370+7+5 0528 280A jr z,param_11_12_iy
467: - 052A param_11_12_def:
468: 6377+10 052A 21CC0D ld hl, [dasm_printRegister8_table]
469: 6387+12 052D 1808 jr param_11_12_all
470: - 052F param_11_12_ix:
471: 6399+10 052F 21D40D ld hl, [dasm_printRegisterIX_table]
472: 6409+12 0532 1803 jr param_11_12_all
473: - 0534 param_11_12_iy:
474: 6421+10 0534 21DC0D ld hl, [dasm_printRegisterIY_table]
475: - 0537 param_11_12_all:
476: 6431+10 0537 F1 pop af
477: 6441+7 0538 0600 ld b,0
478: 6448+4 053A 4F ld c,a
479: 6452+11 053B 09 add hl, bc
480: 6463+7 053C 7E ld a,(hl)
481: 6470+17 053D CDF600 call print_char
482: 6487+6 0540 23 inc hl
483: 6493+7 0541 7E ld a,(hl)
484: 6500+17 0542 CDF600 call print_char
485: 6517+10 0545 C1 pop bc
486: 6527+10 0546 E1 pop hl
487: 6537+10 0547 C9 ret
488:
489: - 0548 param_13:
490: 6547+11 0548 E5 push hl
491: 6558+11 0549 C5 push bc
492: 6569+20 054A ED5B1041 ld de,(var_opcode_start)
493: 6589+7 054E 1A ld a,(de)
494: 6596+4 054F 1F rra
495: 6600+4 0550 1F rra
496: 6604+4 0551 1F rra
497: 6608+7 0552 E606 and 0x06
498: 6615+11 0554 F5 push af
499: ;check which table to use
500: 6626+16 0555 2A1041 ld hl, (var_opcode_start)
501: 6642+7 0558 7E ld a,(hl)
502: 6649+10 0559 21E40D ld hl, [dasm_printRegisterSP_table]
503: 6659+12 055C 18D9 jr param_11_12_all ;reuse code from 11_12
504:
505:
506: - 055E param_81:
507: 6671+11 055E E5 push hl
508: 6682+11 055F C5 push bc
509: 6693+16 0560 2A1741 ld hl, (var_opcode_string)
510: 6709+7 0563 0602 ld b,2
511: 6716+12 0565 1807 jr param_80_seek
512: - 0567 param_80:
513: 6728+11 0567 E5 push hl
514: 6739+11 0568 C5 push bc
515: 6750+16 0569 2A1741 ld hl, (var_opcode_string)
516: 6766+7 056C 0601 ld b,1
517: - 056E param_80_seek:
518: 6773+7 056E 7E ld a,(hl)
519: 6780+6 056F 23 inc hl
520: 6786+4 0570 A7 and a
521: 6790+7+5 0571 20FB jr nz, param_80_seek
522: ;found
523: 6797+4 0573 05 dec b ;found but counter too high
524: 6801+10 0574 C26E05 jp nz, param_80_seek
525:
526: 6811+17 0577 CDFC00 call print_str
527: 6828+10 057A C1 pop bc
528: 6838+10 057B E1 pop hl
529: 6848+10 057C C9 ret
530:
531:
532:
533: - 057D param_printRegister:
534: 6858+11 057D E5 push hl
535: 6869+7 057E FE06 cp 0x06
536: 6876+7+5 0580 2811 jr z, param_printRegisterHL
537: 6883+7 0582 FE07 cp 0x07
538: 6890+7+5 0584 2815 jr z, param_printRegisterA
539: 6897+10 0586 21CC0D ld hl, [dasm_printRegister8_table]
540: 6907+7 0589 0600 ld b,0
541: 6914+4 058B 4F ld c,a
542: 6918+11 058C 09 add hl,bc
543: 6929+7 058D 7E ld a, (hl)
544: 6936+17 058E CDF600 call print_char
545: 6953+10 0591 E1 pop hl
546: 6963+10 0592 C9 ret
547:
548: - 0593 param_printRegisterHL:
549: 6973+10 0593 21EC0D ld hl, [dasm_printRegister8_table_HL]
550: 6983+17 0596 CDFC00 call print_str
551: 7000+10 0599 E1 pop hl
552: 7010+10 059A C9 ret
553:
554: - 059B param_printRegisterA:
555: 7020+7 059B 3E41 ld a,"A"
556: 7027+17 059D CDF600 call print_char
557: 7044+10 05A0 E1 pop hl
558: 7054+10 05A1 C9 ret
559:
560:
561: - 05A2 param_comma:
562: 7064+4 05A2 78 ld a,b
563: 7068+7 05A3 FE01 cp 1
564: 7075+5+6 05A5 C8 ret z
565: 7080+7 05A6 3E20 ld a," "
566: 7087+17 05A8 CDF600 call print_char
567: 7104+7 05AB 3E2C ld a,","
568: 7111+17 05AD CDF600 call print_char
**** main.asm ****
205: 7128+10 05B0 C9 ret
206: .include "disassembler_table.s"
**** include/disassembler_table.s ****
1: ;disassembler tables
2:
3: - 05B1 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: - 05B1 00FF0000 defb 0x00, 0xFF, 0x00, 0x00, 1, [dasm_00], [dasm_00]>>8,0 ;NOP
01090A00
29: ;General-Purpose Arithmetic and CPU Control Groups
30: - 05B9 27FF0000 defb 0x27, 0xFF, 0x00, 0x00, 1, [dasm_27], [dasm_27]>>8, 0 ;DAA
01D40A00
31: - 05C1 2FFF0000 defb 0x2F, 0xFF, 0x00, 0x00, 1, [dasm_2F], [dasm_2F]>>8, 0 ;CPL
01D80A00
32: - 05C9 EDFF44FF defb 0xED, 0xFF, 0x44, 0xFF, 2, [dasm_ED_44], [dasm_ED_44]>>8, 0 ;NEG
02DC0A00
33: - 05D1 3FFF0000 defb 0x3f, 0xFF, 0x00, 0x00, 1, [dasm_3F], [dasm_3F]>>8, 0 ;CCF
01E00A00
34: - 05D9 37FF0000 defb 0x37, 0xFF, 0x00, 0x00, 1, [dasm_37], [dasm_37]>>8, 0 ;SCF
01E40A00
35: ;defb 0x00, 0xFF, 0x00, 0x00, 1, [dasm_00], [dasm_00]>>8,0 ;NOP -> already at top for performance reasons
36: - 05E1 76FF0000 defb 0x76, 0xFF, 0x00, 0x00, 1, [dasm_76], [dasm_76]>>8, 0 ;HALT
01E80A00
37: - 05E9 F3FF0000 defb 0xF3, 0xFF, 0x00, 0x00, 1, [dasm_F3], [dasm_F3]>>8, 0 ;DI
01ED0A00
38: - 05F1 FBFF0000 defb 0xFB, 0xFF, 0x00, 0x00, 1, [dasm_FB], [dasm_FB]>>8, 0 ;EI
01F00A00
39: - 05F9 EDFF46FF defb 0xED, 0xFF, 0x46, 0xFF, 2, [dasm_ED_46], [dasm_ED_46]>>8, 0 ;IM 0
02F30A00
40: - 0601 EDFF56FF defb 0xED, 0xFF, 0x56, 0xFF, 2, [dasm_ED_56], [dasm_ED_56]>>8, 0 ;IM 1
02F80A00
41: - 0609 EDFF5EFF defb 0xED, 0xFF, 0x5E, 0xFF, 2, [dasm_ED_5E], [dasm_ED_5E]>>8, 0 ;IM 2
02FD0A00
42:
43: ;Exchange, Block Transfer, and Search Group
44: - 0611 EBFF0000 defb 0xEB, 0xFF, 0x00, 0x00, 1, [dasm_BE], [dasm_BE]>>8, 0 ;EX DE, HL
01020B00
45: - 0619 08FF0000 defb 0x08, 0xFF, 0x00, 0x00, 1, [dasm_08], [dasm_08]>>8, 0 ;EX AF, AF
010C0B00
46: - 0621 D9FF0000 defb 0xD9, 0xFF, 0x00, 0x00, 1, [dasm_D9], [dasm_D9]>>8, 0 ;EXX
01190B00
47: - 0629 E3FF0000 defb 0xE3, 0xFF, 0x00, 0x00, 1, [dasm_E3], [dasm_E3]>>8, 0 ;EX (SP), HL
011D0B00
48: - 0631 DDFFE3FF defb 0xDD, 0xFF, 0xE3, 0xFF, 2, [dasm_DD_E3], [dasm_DD_E3]>>8, 0 ;EX (SP), IX
02290B00
49: - 0639 FDFFE3FF defb 0xFD, 0xFF, 0xE3, 0xFF, 2, [dasm_FD_E3], [dasm_FD_E3]>>8, 0 ;EX (SP), IY
02350B00
50: - 0641 EDFFA0FF defb 0xED, 0xFF, 0xA0, 0xFF, 2, [dasm_ED_A0], [dasm_ED_A0]>>8, 0 ;LDI
02410B00
51: - 0649 EDFFB0FF defb 0xED, 0xFF, 0xB0, 0xFF, 2, [dasm_ED_B0], [dasm_ED_B0]>>8, 0 ;LDIR
02450B00
52: - 0651 EDFFA8FF defb 0xED, 0xFF, 0xA8, 0xFF, 2, [dasm_ED_A8], [dasm_ED_A8]>>8, 0 ;LDD
024A0B00
53: - 0659 EDFFB8FF defb 0xED, 0xFF, 0xB8, 0xFF, 2, [dasm_ED_B8], [dasm_ED_B8]>>8, 0 ;LDDR
024E0B00
54: - 0661 EDFFA1FF defb 0xED, 0xFF, 0xA1, 0xFF, 2, [dasm_ED_A1], [dasm_ED_A1]>>8, 0 ;CPI
02530B00
55: - 0669 EDFFB1FF defb 0xED, 0xFF, 0xB1, 0xFF, 2, [dasm_ED_B1], [dasm_ED_B1]>>8, 0 ;CPIR
02570B00
56: - 0671 EDFFA9FF defb 0xED, 0xFF, 0xA9, 0xFF, 2, [dasm_ED_A9], [dasm_ED_A9]>>8, 0 ;CPD
025C0B00
57: - 0679 EDFFB9FF defb 0xED, 0xFF, 0xB9, 0xFF, 2, [dasm_ED_B9], [dasm_ED_B9]>>8, 0 ;CPDR
02600B00
58:
59: ;JUMP Group
60: - 0681 C3FF0000 defb 0xC3, 0xFF, 0x00, 0x00, 3, [dasm_C3], [dasm_C3]>>8,1, 0x01 ;JP nn
030D0A01
01
61: - 068A C2C70000 defb 0xC2, 0xC7, 0x00, 0x00, 3, [dasm_C3], [dasm_C3]>>8,3, 0x02, 0x80, 0x01 ;JP cc,nn
030D0A03
028001
62: - 0695 18FF0000 defb 0x18, 0xFF, 0x00, 0x00, 2, [dasm_18], [dasm_18]>>8,1, 0x03 ;JR e
02140A01
03
63: - 069E 38FF0000 defb 0x38, 0xFF, 0x00, 0x00, 2, [dasm_38], [dasm_38]>>8,1, 0x03 ;JR C,e
02180A01
03
64: - 06A7 30FF0000 defb 0x30, 0xFF, 0x00, 0x00, 2, [dasm_30], [dasm_30]>>8,1, 0x03 ;JR NC,e
021F0A01
03
65: - 06B0 28FF0000 defb 0x28, 0xFF, 0x00, 0x00, 2, [dasm_28], [dasm_28]>>8,1, 0x03 ;JR Z,e
02270A01
03
66: - 06B9 20FF0000 defb 0x20, 0xFF, 0x00, 0x00, 2, [dasm_20], [dasm_20]>>8,1, 0x03 ;JR NZ,e
022E0A01
03
67: - 06C2 E9FF0000 defb 0xE9, 0xFF, 0x00, 0x00, 2, [dasm_E9], [dasm_E9]>>8,0 ;JP (HL)
02360A00
68: - 06CA DDFFE9FF defb 0xDD, 0xFF, 0xE9, 0xFF, 2, [dasm_DD], [dasm_DD]>>8,0 ;JP (IX)
023F0A00
69: - 06D2 FDFFE9FF defb 0xFD, 0xFF, 0xE9, 0xFF, 2, [dasm_FD], [dasm_FD]>>8,0 ;JP (IY)
02480A00
70: - 06DA 10FF0000 defb 0x10, 0xFF, 0x00, 0x00, 2, [dasm_10], [dasm_10]>>8,1, 0x03 ;DJNZ, e
02510A01
03
71: ;Call and Return Group
72: - 06E3 CDFF0000 defb 0xCD, 0xFF, 0x00, 0x00, 3, [dasm_CD], [dasm_CD]>>8,1, 0x01 ;CALL nn
03570A01
01
73: - 06EC C4C70000 defb 0xC4, 0xC7, 0x00, 0x00, 3, [dasm_CD], [dasm_CD]>>8,2, 0x02, 0x01 ;CALL cc,nn
03570A02
0201
74: - 06F6 C9FF0000 defb 0xC9, 0xFF, 0x00, 0x00, 1, [dasm_C9], [dasm_C9]>>8,0 ;RET
015D0A00
75: - 06FE C0C70000 defb 0xC0, 0xC7, 0x00, 0x00, 1, [dasm_C9], [dasm_C9]>>8,1, 0x02 ;RET cc
015D0A01
02
76: - 0707 EDFF4DFF defb 0xED, 0xFF, 0x4D, 0xFF, 2, [dasm_ED_4D], [dasm_ED_4D]>>8,0 ;RETI
02620A00
77: - 070F EDFF45FF defb 0xED, 0xFF, 0x45, 0xFF, 2, [dasm_ED_45], [dasm_ED_45]>>8,0 ;RETN
02670A00
78:
79: - 0717 C7C70000 defb 0xC7, 0xC7, 0x00, 0x00, 1, [dasm_FF], [dasm_FF]>>8,1, 0x05 ;RST
016C0A01
05
80: ;8-Bit load group
81: - 0720 0AFF0000 defb 0x0A, 0xFF, 0x00, 0x00, 1, [dasm_0A], [dasm_0A]>>8, 0 ;LD A, (BC)
01710A00
82: - 0728 1AFF0000 defb 0x1A, 0xFF, 0x00, 0x00, 1, [dasm_1A], [dasm_1A]>>8, 0 ;LD A, (DE)
017B0A00
83: - 0730 3AFF0000 defb 0x3A, 0xFF, 0x00, 0x00, 3, [dasm_3A], [dasm_3A]>>8, 2, 0x09, 0x80 ;LD A, (nn)
03850A02
0980
84: - 073A 02FF0000 defb 0x02, 0xFF, 0x00, 0x00, 1, [dasm_02], [dasm_02]>>8, 0 ;LD (BC), A
018F0A00
85: - 0742 12FF0000 defb 0x12, 0xFF, 0x00, 0x00, 1, [dasm_12], [dasm_12]>>8, 0 ;LD (DE), A
019A0A00
86: - 074A 32FF0000 defb 0x32, 0xFF, 0x00, 0x00, 3, [dasm_32], [dasm_32]>>8, 2, 0x09, 0x80 ;LD (nn), A
03A50A02
0980
87: - 0754 EDFF57FF defb 0xED, 0xFF, 0x57, 0xFF, 2, [dasm__ED_57], [dasm__ED_57]>>8, 0 ;LD A, I
02B40A00
88: - 075C EDFF5FFF defb 0xED, 0xFF, 0x5F, 0xFF, 2, [dasm__ED_5F], [dasm__ED_5F]>>8, 0 ;LD A, R
02BC0A00
89: - 0764 EDFF47FF defb 0xED, 0xFF, 0x47, 0xFF, 2, [dasm__ED_47], [dasm__ED_47]>>8, 0 ;LD I, A
02C40A00
90: - 076C EDFF4FFF defb 0xED, 0xFF, 0x4F, 0xFF, 2, [dasm__ED_4F], [dasm__ED_4F]>>8, 0 ;LD R, A
02CC0A00
91:
92: - 0774 06C70000 defb 0x06, 0xC7, 0x00, 0x00, 2, [dasm__LD], [dasm__LD]>>8, 2, 0x06, 0x08 ;LD r, n
02B00A02
0608
93: - 077E 40C00000 defb 0x40, 0xC0, 0x00, 0x00, 1, [dasm__LD], [dasm__LD]>>8, 2, 0x06, 0x07 ;LD r, r' / LD r, (HL) / LD (HL), r
01B00A02
0607
94:
95: ;8-Bit Arithmetic Group
96: - 0788 80F80000 defb 0x80, 0xF8, 0x00, 0x00, 1, [dasm_80C6], [dasm_80C6]>>8, 1, 0x07 ;ADD A, r / ADD A, (HL)
01650B01
07
97: - 0791 C6FF0000 defb 0xC6, 0xFF, 0x00, 0x00, 2, [dasm_80C6], [dasm_80C6]>>8, 1, 0x08 ;ADD A, n
02650B01
08
98: - 079A DDFF86FF defb 0xDD, 0xFF, 0x86, 0xFF, 3, [dasm_DD_86], [dasm_DD_86]>>8, 2, 0x08, 0x80 ;ADD A, (IX + d)
036D0B02
0880
99: - 07A4 FDFF86FF defb 0xFD, 0xFF, 0x86, 0xFF, 3, [dasm_FD_86], [dasm_FD_86]>>8, 2, 0x08, 0x80 ;ADD A, (IY + d)
037C0B02
0880
100: - 07AE C8F80000 defb 0xC8, 0xF8, 0x00, 0x00, 1, [dasm_C88E], [dasm_C88E]>>8, 1, 0x07 ;ADC A, r / ADC A, (HL)
018B0B01
07
101: - 07B7 8EF80000 defb 0x8E, 0xF8, 0x00, 0x00, 2, [dasm_C88E], [dasm_C88E]>>8, 1, 0x08 ;ADC A, n
028B0B01
08
102: - 07C0 DDFF8EFF defb 0xDD, 0xFF, 0x8E, 0xFF, 3, [dasm_DD_8E], [dasm_DD_8E]>>8, 2, 0x08, 0x80 ;ADC A, (IX + d)
03930B02
0880
103: - 07CA FDFF8EFF defb 0xFD, 0xFF, 0x8E, 0xFF, 3, [dasm_FD_8E], [dasm_FD_8E]>>8, 2, 0x08, 0x80 ;ADC A, (IY + d)
03A20B02
0880
104: - 07D4 90F80000 defb 0x90, 0xF8, 0x00, 0x00, 1, [dasm__SUB], [dasm__SUB]>>8, 1, 0x07 ;SUB r / SUB A, (HL)
01B10B01
07
105: - 07DD D6FF0000 defb 0xD6, 0xFF, 0x00, 0x00, 2, [dasm__SUB], [dasm__SUB]>>8, 1, 0x08 ;SUB n
02B10B01
08
106: - 07E6 DDFF96FF defb 0xDD, 0xFF, 0x96, 0xFF, 3, [dasm_DD_96], [dasm_DD_96]>>8, 2, 0x08, 0x80 ;SUB (IX + d)
03B60B02
0880
107: - 07F0 FDFF96FF defb 0xFD, 0xFF, 0x96, 0xFF, 3, [dasm_FD_96], [dasm_FD_96]>>8, 2, 0x08, 0x80 ;SUB (IY + d)
03C20B02
0880
108: - 07FA 94F80000 defb 0x94, 0xF8, 0x00, 0x00, 1, [dasm__SBC], [dasm__SBC]>>8, 1, 0x07 ;SBC A,r / SBC A, (HL)
01CE0B01
07
109: - 0803 DEFF0000 defb 0xDE, 0xFF, 0x00, 0x00, 2, [dasm__SBC], [dasm__SBC]>>8, 1, 0x08 ;SBC A,n
02CE0B01
08
110: - 080C DDFF9EFF defb 0xDD, 0xFF, 0x9E, 0xFF, 3, [dasm_DD_9E], [dasm_DD_9E]>>8, 2, 0x08, 0x80 ;SBC A,(IX + d)
03D60B02
0880
111: - 0816 FDFF9EFF defb 0xFD, 0xFF, 0x9E, 0xFF, 3, [dasm_FD_9E], [dasm_FD_9E]>>8, 2, 0x08, 0x80 ;SBC A,(IY + d)
03E40B02
0880
112: - 0820 A0F80000 defb 0xA0, 0xF8, 0x00, 0x00, 1, [dasm__AND], [dasm__AND]>>8, 1, 0x07 ;AND A,r / AND A, (HL)
01F20B01
07
113: - 0829 E6FF0000 defb 0xE6, 0xFF, 0x00, 0x00, 2, [dasm__AND], [dasm__AND]>>8, 1, 0x08 ;AND A,n
02F20B01
08
114: - 0832 DDFFA6FF defb 0xDD, 0xFF, 0xA6, 0xFF, 3, [dasm_DD_A6], [dasm_DD_A6]>>8, 2, 0x08, 0x80 ;AND A,(IX + d)
03F70B02
0880
115: - 083C FDFFA6FF defb 0xFD, 0xFF, 0xA6, 0xFF, 3, [dasm_FD_A6], [dasm_FD_A6]>>8, 2, 0x08, 0x80 ;AND A,(IY + d)
03030C02
0880
116: - 0846 B0F80000 defb 0xB0, 0xF8, 0x00, 0x00, 1, [dasm__OR], [dasm__OR]>>8, 1, 0x07 ;OR A,r / OR A, (HL)
010F0C01
07
117: - 084F F6FF0000 defb 0xF6, 0xFF, 0x00, 0x00, 2, [dasm__OR], [dasm__OR]>>8, 1, 0x08 ;OR A,n
020F0C01
08
118: - 0858 DDFFB6FF defb 0xDD, 0xFF, 0xB6, 0xFF, 3, [dasm_DD_B6], [dasm_DD_B6]>>8, 2, 0x08, 0x80 ;OR A,(IX + d)
03130C02
0880
119: - 0862 FDFFB6FF defb 0xFD, 0xFF, 0xB6, 0xFF, 3, [dasm_FD_B6], [dasm_FD_B6]>>8, 2, 0x08, 0x80 ;OR A,(IY + d)
031E0C02
0880
120: - 086C A8F80000 defb 0xA8, 0xF8, 0x00, 0x00, 1, [dasm__XOR], [dasm__XOR]>>8, 1, 0x07 ;XOR A,r / XOR A, (HL)
01290C01
07
121: - 0875 EEFF0000 defb 0xEE, 0xFF, 0x00, 0x00, 2, [dasm__XOR], [dasm__XOR]>>8, 1, 0x08 ;XOR A,n
02290C01
08
122: - 087E DDFFAEFF defb 0xDD, 0xFF, 0xAE, 0xFF, 3, [dasm_DD_AE], [dasm_DD_AE]>>8, 2, 0x08, 0x80 ;XOR A,(IX + d)
032E0C02
0880
123: - 0888 FDFFAEFF defb 0xFD, 0xFF, 0xAE, 0xFF, 3, [dasm_FD_AE], [dasm_FD_AE]>>8, 2, 0x08, 0x80 ;XOR A,(IY + d)
033A0C02
0880
124: - 0892 B8F80000 defb 0xB8, 0xF8, 0x00, 0x00, 1, [dasm__CP], [dasm__CP]>>8, 1, 0x07 ;CP A,r / CP A, (HL)
01460C01
07
125: - 089B FEFF0000 defb 0xFE, 0xFF, 0x00, 0x00, 2, [dasm__CP], [dasm__CP]>>8, 1, 0x08 ;CP A,n
02460C01
08
126: - 08A4 DDFFBEFF defb 0xDD, 0xFF, 0xBE, 0xFF, 3, [dasm_DD_BE], [dasm_DD_BE]>>8, 2, 0x08, 0x80 ;CP A,(IX + d)
034A0C02
0880
127: - 08AE FDFFBEFF defb 0xFD, 0xFF, 0xBE, 0xFF, 3, [dasm_FD_BE], [dasm_FD_BE]>>8, 2, 0x08, 0x80 ;CP A,(IY + d)
03550C02
0880
128: - 08B8 04C70000 defb 0x04, 0xC7, 0x00, 0x00, 1, [dasm__INC], [dasm__INC]>>8, 1, 0x10 ;INC r / INC (HL)
01600C01
10
129: - 08C1 DDFF34FF defb 0xDD, 0xFF, 0x34, 0xFF, 3, [dasm_DD_34], [dasm_DD_34]>>8, 2, 0x08, 0x80 ;INC (IX + d)
03650C02
0880
130: - 08CB FDFF34FF defb 0xFD, 0xFF, 0x34, 0xFF, 3, [dasm_FD_34], [dasm_FD_34]>>8, 2, 0x08, 0x80 ;INC (IY + d)
03710C02
0880
131: - 08D5 05C70000 defb 0x05, 0xC7, 0x00, 0x00, 1, [dasm__DEC], [dasm__DEC]>>8, 1, 0x10 ;DEC r / DEC (HL)
017D0C01
10
132: - 08DE DDFF35FF defb 0xDD, 0xFF, 0x35, 0xFF, 3, [dasm_DD_35], [dasm_DD_35]>>8, 2, 0x08, 0x80 ;DEC (IX + d)
03820C02
0880
133: - 08E8 FDFF35FF defb 0xFD, 0xFF, 0x35, 0xFF, 3, [dasm_FD_35], [dasm_FD_35]>>8, 2, 0x08, 0x80 ;DEC (IY + d)
038E0C02
0880
134: ;16-Bit Arithmetic Group
135: - 08F2 09CF0000 defb 0x09, 0xCF, 0x00, 0x00, 1, [dasm_09], [dasm_09]>>8, 1, 0x11 ;ADD HL, ss
019A0C01
11
136: - 08FB EDFF4ACF defb 0xED, 0xFF, 0x4A, 0xCF, 2, [dasm_ED_4A], [dasm_ED_4A]>>8, 1, 0x12 ;ADC HL, ss
02A30C01
12
137: - 0904 EDFF42CF defb 0xED, 0xFF, 0x42, 0xCF, 2, [dasm_ED_42], [dasm_ED_42]>>8, 1, 0x12 ;SBC HL, ss
02AC0C01
12
138: - 090D DDFF09CF defb 0xDD, 0xFF, 0x09, 0xCF, 2, [dasm_DD_09], [dasm_DD_09]>>8, 1, 0x12 ;ADD IX, ss
02B50C01
12
139: - 0916 FDFF09CF defb 0xFD, 0xFF, 0x09, 0xCF, 2, [dasm_FD_09], [dasm_FD_09]>>8, 1, 0x12 ;ADD IY, ss
02BE0C01
12
140: - 091F 03CF0000 defb 0x03, 0xCF, 0x00, 0x00, 1, [dasm_03], [dasm_03]>>8, 1, 0x11 ;INC ss
01C70C01
11
141: - 0928 DDFF23FF defb 0xDD, 0xFF, 0x23, 0xFF, 2, [dasm_DD_23], [dasm_DD_23]>>8, 0 ;INC IX
02CC0C00
142: - 0930 FDFF23FF defb 0xFD, 0xFF, 0x23, 0xFF, 2, [dasm_FD_23], [dasm_FD_23]>>8, 0 ;INC IY
02D50C00
143: - 0938 0BCF0000 defb 0x0B, 0xCF, 0x00, 0x00, 1, [dasm_0B], [dasm_0B]>>8, 1, 0x11 ;DEC ss
01DE0C01
11
144: - 0941 DDFF2BFF defb 0xDD, 0xFF, 0x2B, 0xFF, 2, [dasm_DD_2B], [dasm_DD_2B]>>8, 0 ;DEC IX
02E30C00
145: - 0949 FDFF2BFF defb 0xFD, 0xFF, 0x2B, 0xFF, 2, [dasm_FD_2B], [dasm_FD_2B]>>8, 0 ;DEC IY
02EC0C00
146: ;16-Bit Load Group
147: - 0951 01CF0000 defb 0x01, 0xCF, 0x00, 0x00, 3, [dasm_01], [dasm_01]>>8, 3, 0x11, 0x80, 0x09 ;LD dd, nn
03F50C03
118009
148: - 095C DDFF21FF defb 0xDD, 0xFF, 0x21, 0xFF, 4, [dasm_DD_01], [dasm_DD_01]>>8, 1, 0x0A ;LD IX, nn
04FC0C01
0A
149: - 0965 FDFF21FF defb 0xFD, 0xFF, 0x21, 0xFF, 4, [dasm_FD_01], [dasm_FD_01]>>8, 1, 0x0A ;LD IY, nn
04040D01
0A
150: - 096E 2AFF0000 defb 0x2A, 0xFF, 0x00, 0x00, 3, [dasm_2A], [dasm_2A]>>8, 2, 0x09, 0x80 ;LD HL, (nn)
030C0D02
0980
151: - 0978 EDFF4BCF defb 0xED, 0xFF, 0x4B, 0xCF, 4, [dasm_ED_4B], [dasm_ED_4B]>>8, 4, 0x12, 0x80, 0x0A, 0x81 ;LD dd, (nn)
04180D04
12800A81
152: - 0984 DDFF2AFF defb 0xDD, 0xFF, 0x2A, 0xFF, 4, [dasm_DD_2A], [dasm_DD_2A]>>8, 1, 0x0A ;LD IX, (nn)
04230D01
0A
153: - 098D FDFF2AFF defb 0xFD, 0xFF, 0x2A, 0xFF, 4, [dasm_FD_2A], [dasm_FD_2A]>>8, 1, 0x0A ;LD IY, (nn)
042F0D01
0A
154: - 0996 22FF0000 defb 0x22, 0xFF, 0x00, 0x00, 3, [dasm_22], [dasm_22]>>8, 2, 0x0A, 0x80 ;LD (nn), HL
033B0D02
0A80
155: - 09A0 EDFF43CF defb 0xED, 0xFF, 0x43, 0xCF, 4, [dasm_ED_43], [dasm_ED_43]>>8, 3, 0x0A, 0x80, 0x12 ;LD (nn), dd
04470D03
0A8012
156: - 09AB DDFF22CF defb 0xDD, 0xFF, 0x22, 0xCF, 4, [dasm_DD_22], [dasm_DD_22]>>8, 2, 0x0A, 0x80 ;LD (nn), IX
04510D02
0A80
157: - 09B5 FDFF22CF defb 0xFD, 0xFF, 0x22, 0xCF, 4, [dasm_FD_22], [dasm_FD_22]>>8, 2, 0x0A, 0x80 ;LD (nn), IY
045D0D02
0A80
158: - 09BF F9FF0000 defb 0xF9, 0xFF, 0x00, 0x00, 1, [dasm_F9], [dasm_F9]>>8, 0 ;LD SP, HL
01690D00
159: - 09C7 DDFFF9FF defb 0xDD, 0xFF, 0xF9, 0xFF, 2, [dasm_DD_F9], [dasm_DD_F9]>>8, 0 ;LD SP, IX
02730D00
160: - 09CF FDFFF9FF defb 0xFD, 0xFF, 0xF9, 0xFF, 2, [dasm_FD_F9], [dasm_FD_F9]>>8, 0 ;LD SP, IY
027D0D00
161: - 09D7 C5CF0000 defb 0xC5, 0xCF, 0x00, 0x00, 1, [dasm_E5], [dasm_E5]>>8, 1, 0x13 ;PUSH qq
01870D01
13
162: - 09E0 DDFFE5FF defb 0xDD, 0xFF, 0xE5, 0xFF, 2, [dasm_DD_E5], [dasm_DD_E5]>>8, 0 ;PUSH IX
028D0D00
163: - 09E8 FDFFE5FF defb 0xFD, 0xFF, 0xE5, 0xFF, 2, [dasm_FD_E5], [dasm_FD_E5]>>8, 0 ;PUSH IY
02950D00
164: - 09F0 C1CF0000 defb 0xC1, 0xCF, 0x00, 0x00, 1, [dasm_E1], [dasm_E1]>>8, 1, 0x13 ;POP qq
019D0D01
13
165: - 09F9 DDFFE1FF defb 0xDD, 0xFF, 0xE1, 0xFF, 2, [dasm_DD_E1], [dasm_DD_E1]>>8, 0 ;POP IX
02A30D00
166: - 0A01 FDFFE1FF defb 0xFD, 0xFF, 0xE1, 0xFF, 2, [dasm_FD_E1], [dasm_FD_E1]>>8, 0 ;POP IY
02AB0D00
167:
168:
169: - 0A09 4E4F5000 dasm_00: db "NOP",0x00
170: ;JUMP Group
171: - 0A0D 4A502000 dasm_C3: db "JP ",0x00,", ",0x00
2C2000
172: - 0A14 4A522000 dasm_18: db "JR ",0x00
173: - 0A18 4A522043 dasm_38: db "JR C, ",0x00
2C2000
174: - 0A1F 4A52204E dasm_30: db "JR NC, ",0x00
432C2000
175: - 0A27 4A52205A dasm_28: db "JR Z, ",0x00
2C2000
176: - 0A2E 4A52204E dasm_20: db "JR NZ, ",0x00
5A2C2000
177: - 0A36 4A502028 dasm_E9: db "JP (HL) ",0x00
484C2920
00
178: - 0A3F 4A502028 dasm_DD: db "JP (IX) ",0x00
49582920
00
179: - 0A48 4A502028 dasm_FD: db "JP (IY) ",0x00
49592920
00
180: - 0A51 444A4E5A dasm_10: db "DJNZ ",0x00
2000
181: ;Call and Return Group
182: - 0A57 43414C4C dasm_CD: db "CALL ",0x00
2000
183: - 0A5D 52455420 dasm_C9: db "RET ",0x00
00
184: - 0A62 52455449 dasm_ED_4D: db "RETI",0x00
00
185: - 0A67 5245544E dasm_ED_45: db "RETN",0x00
00
186: - 0A6C 52535420 dasm_FF: db "RST ",0x00
00
187: ;8-Bit load group
188: - 0A71 4C442041 dasm_0A: db "LD A,(BC)",0x00
2C284243
2900
189: - 0A7B 4C442041 dasm_1A: db "LD A,(DE)",0x00
2C284445
2900
190: - 0A85 4C442041 dasm_3A: db "LD A,(",0x00, "h)",0x00
2C280068
2900
191: - 0A8F 4C442028 dasm_02: db "LD (BC), A",0x00
4243292C
204100
192: - 0A9A 4C442028 dasm_12: db "LD (DE), A",0x00
4445292C
204100
193: - 0AA5 4C442028 dasm_32: db "LD (",0x00, "h), A",0x00
0068292C
204100
194: - 0AB0 4C442000 dasm__LD: db "LD ",0x00
195: - 0AB4 4C442041 dasm__ED_57: db "LD A, I",0x00
2C204900
196: - 0ABC 4C442041 dasm__ED_5F: db "LD A, R",0x00
2C205200
197: - 0AC4 4C442049 dasm__ED_47: db "LD I, A",0x00
2C204100
198: - 0ACC 4C442052 dasm__ED_4F: db "LD R, A",0x00
2C204100
199: ;General-Purpose Arithmetic and CPU Control Groups
200: - 0AD4 44414100 dasm_27: db "DAA",0x00
201: - 0AD8 43504C00 dasm_2F: db "CPL",0x00
202: - 0ADC 4E454700 dasm_ED_44: db "NEG",0x00
203: - 0AE0 43434600 dasm_3F: db "CCF",0x00
204: - 0AE4 53434600 dasm_37: db "SCF",0x00
205: - 0AE8 48414C54 dasm_76: db "HALT",0x00
00
206: - 0AED 444900 dasm_F3: db "DI",0x00
207: - 0AF0 454900 dasm_FB: db "EI",0x00
208: - 0AF3 494D2030 dasm_ED_46: db "IM 0",0x00
00
209: - 0AF8 494D2031 dasm_ED_56: db "IM 1",0x00
00
210: - 0AFD 494D2032 dasm_ED_5E: db "IM 2",0x00
00
211: ;Exchange, Block Transfer, and Search Group
212: - 0B02 45582044 dasm_BE: db "EX DE, HL",0x00
452C2048
4C00
213: - 0B0C 45582041 dasm_08: db "EX AF, AF",0x00
462C2041
46E280B2
00
214: - 0B19 45585800 dasm_D9: db "EXX",0x00
215: - 0B1D 45582028 dasm_E3: db "EX (SP), HL",0x00
5350292C
20484C00
216: - 0B29 45582028 dasm_DD_E3: db "EX (SP), IX",0x00
5350292C
20495800
217: - 0B35 45582028 dasm_FD_E3: db "EX (SP), IY",0x00
5350292C
20495900
218: - 0B41 4C444900 dasm_ED_A0: db "LDI",0x00
219: - 0B45 4C444952 dasm_ED_B0: db "LDIR",0x00
00
220: - 0B4A 4C444400 dasm_ED_A8: db "LDD",0x00
221: - 0B4E 4C444452 dasm_ED_B8: db "LDDR",0x00
00
222: - 0B53 43504900 dasm_ED_A1: db "CPI",0x00
223: - 0B57 43504952 dasm_ED_B1: db "CPIR",0x00
00
224: - 0B5C 43504400 dasm_ED_A9: db "CPD",0x00
225: - 0B60 43504452 dasm_ED_B9: db "CPDR",0x00
00
226: ;8-Bit Arithmetic Group
227: - 0B65 41444420 dasm_80C6: db "ADD A, ", 0x00
412C2000
228: - 0B6D 41444420 dasm_DD_86: db "ADD A, (IX+", 0x00, "h)",0x00
412C2028
49582B00
682900
229: - 0B7C 41444420 dasm_FD_86: db "ADD A, (IY+", 0x00, "h)",0x00
412C2028
49592B00
682900
230: - 0B8B 41444320 dasm_C88E: db "ADC A, ", 0x00
412C2000
231: - 0B93 41444320 dasm_DD_8E: db "ADC A, (IX+", 0x00, "h)",0x00
412C2028
49582B00
682900
232: - 0BA2 41444320 dasm_FD_8E: db "ADC A, (IY+", 0x00, "h)",0x00
412C2028
49592B00
682900
233: - 0BB1 53554220 dasm__SUB: db "SUB ", 0x00
00
234: - 0BB6 53554220 dasm_DD_96: db "SUB (IX+", 0x00, "h)",0x00
2849582B
00682900
235: - 0BC2 53554220 dasm_FD_96: db "SUB (IY+", 0x00, "h)",0x00
2849592B
00682900
236: - 0BCE 53424320 dasm__SBC: db "SBC A, ", 0x00
412C2000
237: - 0BD6 53424320 dasm_DD_9E: db "SBC A,(IX+", 0x00, "h)",0x00
412C2849
582B0068
2900
238: - 0BE4 53424320 dasm_FD_9E: db "SBC A,(IY+", 0x00, "h)",0x00
412C2849
592B0068
2900
239: - 0BF2 414E4420 dasm__AND: db "AND ", 0x00
00
240: - 0BF7 414E4420 dasm_DD_A6: db "AND (IX+", 0x00, "h)",0x00
2849582B
00682900
241: - 0C03 414E4420 dasm_FD_A6: db "AND (IY+", 0x00, "h)",0x00
2849592B
00682900
242: - 0C0F 4F522000 dasm__OR: db "OR ", 0x00
243: - 0C13 4F522028 dasm_DD_B6: db "OR (IX+", 0x00, "h)",0x00
49582B00
682900
244: - 0C1E 4F522028 dasm_FD_B6: db "OR (IY+", 0x00, "h)",0x00
49592B00
682900
245: - 0C29 584F5220 dasm__XOR: db "XOR ", 0x00
00
246: - 0C2E 584F5220 dasm_DD_AE: db "XOR (IX+", 0x00, "h)",0x00
2849582B
00682900
247: - 0C3A 584F5220 dasm_FD_AE: db "XOR (IY+", 0x00, "h)",0x00
2849592B
00682900
248: - 0C46 43502000 dasm__CP: db "CP ", 0x00
249: - 0C4A 43502028 dasm_DD_BE: db "CP (IX+", 0x00, "h)",0x00
49582B00
682900
250: - 0C55 43502028 dasm_FD_BE: db "CP (IY+", 0x00, "h)",0x00
49592B00
682900
251: - 0C60 494E4320 dasm__INC: db "INC ", 0x00
00
252: - 0C65 494E4320 dasm_DD_34: db "INC (IX+", 0x00, "h)",0x00
2849582B
00682900
253: - 0C71 494E4320 dasm_FD_34: db "INC (IY+", 0x00, "h)",0x00
2849592B
00682900
254: - 0C7D 44454320 dasm__DEC: db "DEC ", 0x00
00
255: - 0C82 44454320 dasm_DD_35: db "DEC (IX+", 0x00, "h)",0x00
2849582B
00682900
256: - 0C8E 44454320 dasm_FD_35: db "DEC (IY+", 0x00, "h)",0x00
2849592B
00682900
257: ;16-Bit Arithmetic Group
258: - 0C9A 41444420 dasm_09: db "ADD HL, ",0x00
484C2C20
00
259: - 0CA3 41444320 dasm_ED_4A: db "ADC HL, ",0x00
484C2C20
00
260: - 0CAC 53424320 dasm_ED_42: db "SBC HL, ",0x00
484C2C20
00
261: - 0CB5 41444420 dasm_DD_09: db "ADD IX, ",0x00
49582C20
00
262: - 0CBE 41444420 dasm_FD_09: db "ADD IY, ",0x00
49592C20
00
263: - 0CC7 494E4320 dasm_03: db "INC ",0x00
00
264: - 0CCC 494E4320 dasm_DD_23: db "INC IX, ",0x00
49582C20
00
265: - 0CD5 494E4320 dasm_FD_23: db "INC IY, ",0x00
49592C20
00
266: - 0CDE 44454320 dasm_0B: db "DEC ",0x00
00
267: - 0CE3 44454320 dasm_DD_2B: db "DEC IX, ",0x00
49582C20
00
268: - 0CEC 44454320 dasm_FD_2B: db "DEC IY, ",0x00
49592C20
00
269: ;16-Bit Load Group
270: - 0CF5 4C442000 dasm_01: db "LD ",0x00, ", ",0x00
2C2000
271: - 0CFC 4C442049 dasm_DD_01: db "LD IX, ",0x00
582C2000
272: - 0D04 4C442049 dasm_FD_01: db "LD IY, ",0x00
592C2000
273: - 0D0C 4C442048 dasm_2A: db "LD HL, (",0x00,"h)",0x00
4C2C2028
00682900
274: - 0D18 4C442000 dasm_ED_4B: db "LD ",0x00,", (",0x00,"h)",0x00
2C202800
682900
275: - 0D23 4C442049 dasm_DD_2A: db "LD IX, (",0x00,"h)",0x00
582C2028
00682900
276: - 0D2F 4C442049 dasm_FD_2A: db "LD IY, (",0x00,"h)",0x00
592C2028
00682900
277: - 0D3B 4C442028 dasm_22: db "LD (",0x00,"h), HL",0x00
0068292C
20484C00
278: - 0D47 4C442028 dasm_ED_43: db "LD (",0x00,"h), ",0x00
0068292C
2000
279: - 0D51 4C442028 dasm_DD_22: db "LD (",0x00,"h), IX",0x00
0068292C
20495800
280: - 0D5D 4C442028 dasm_FD_22: db "LD (",0x00,"h), IY",0x00
0068292C
20495900
281: - 0D69 4C442053 dasm_F9: db "LD SP, HL",0x00
502C2048
4C00
282: - 0D73 4C442053 dasm_DD_F9: db "LD SP, IX",0x00
502C2049
5800
283: - 0D7D 4C442053 dasm_FD_F9: db "LD SP, IY",0x00
502C2049
5900
284: - 0D87 50555348 dasm_E5: db "PUSH ",0x00
2000
285: - 0D8D 50555348 dasm_DD_E5: db "PUSH IX",0x00
20495800
286: - 0D95 50555348 dasm_FD_E5: db "PUSH IY",0x00
20495900
287: - 0D9D 50555348 dasm_E1: db "PUSH ",0x00
2000
288: - 0DA3 50555348 dasm_DD_E1: db "PUSH IX",0x00
20495800
289: - 0DAB 50555348 dasm_FD_E1: db "PUSH IY",0x00
20495900
290:
291: ;Misc
292: - 0DB3 2E3F2E00 dasm_UU: db ".?.",0x00
293: - 0DB7 20202020 dasm_UW: db " ",0x00
00
294:
295: - 0DBC dasm_printFlags_table:
296: - 0DBC 4E5A db "NZ"
297: - 0DBE 5A00 db "Z",0
298: - 0DC0 4E43 db "NC"
299: - 0DC2 4300 db "C",0
300: - 0DC4 504F db "PO"
301: - 0DC6 5045 db "PE"
302: - 0DC8 5000 db "P",0
303: - 0DCA 4D00 db "M",0
304:
305: - 0DCC dasm_printRegister8_table:
306: - 0DCC 42 db "B"
307: - 0DCD 43 db "C"
308: - 0DCE 44 db "D"
309: - 0DCF 45 db "E"
310: - 0DD0 48 db "H"
311: - 0DD1 4C db "L"
312: - 0DD2 53 db "S" ;only 18 bit (SP)
313: - 0DD3 50 db "P" ;only 18 bit (SP)
314:
315: - 0DD4 dasm_printRegisterIX_table:
316: - 0DD4 4243 db "BC"
317: - 0DD6 4445 db "DE"
318: - 0DD8 4958 db "IX"
319: - 0DDA 5350 db "SP"
320: - 0DDC dasm_printRegisterIY_table:
321: - 0DDC 4243 db "BC"
322: - 0DDE 4445 db "DE"
323: - 0DE0 4959 db "IY"
324: - 0DE2 5350 db "SP"
325:
326: - 0DE4 dasm_printRegisterSP_table:
327: - 0DE4 4243 db "BC"
328: - 0DE6 4445 db "DE"
329: - 0DE8 484C db "HL"
330: - 0DEA 4146 db "AF"
331:
332: - 0DEC dasm_printRegister8_table_HL:
**** main.asm ****
207: - 0DEC 28484C29 db "(HL)", 0
00
208: .include "rst.s"
**** include/rst.s ****
1: - 0DF1 EXEC_RST_08:
2: 7138+17 0DF1 CDF600 call print_char
3: 7155+10 0DF4 C9 ret
4:
5:
6: - 0DF5 EXEC_RST_10:
7: 7165+11 0DF5 C5 push bc
8: 7176+11 0DF6 D5 push de
9: 7187+11 0DF7 E5 push hl
10: ;call vdp_cursor_on
11: 7198+17 0DF8 CD4C01 call read_char
12: 7215+11 0DFB F5 push af
13: ;call vdp_cursor_off
14: 7226+10 0DFC F1 pop af
15: 7236+10 0DFD E1 pop hl
16: 7246+10 0DFE D1 pop de
17: 7256+10 0DFF C1 pop bc
18: 7266+10 0E00 C9 ret
19:
20: - 0E01 EXEC_RST_18:
21: 7276+7 0E01 3E00 ld a,0
22: 7283+10 0E03 C9 ret
**** main.asm ****
209: .include "beep.s"
**** include/beep.s ****
1: ;------------------------------------------------------------------------------
2: ; beep
3: ;
4: ; Beeps the speaker
5: ; DE sets duration
6: ;------------------------------------------------------------------------------
7: - 0E04 beep:
8: 7293+11 0E04 F5 push AF
9: 7304+11 0E05 D5 push DE
10: 7315+4 0E06 F3 di
11: - 0E07 beep_loop:
12: 7319+7 0E07 3E08 LD A,0x08
13: 7326+11 0E09 D3F4 OUT (CS_PIO_AD), A
14: 7337+17 0E0B CD1E0E CALL beep_pause
15: 7354+7 0E0E 3E00 LD A,0x00
16: 7361+11 0E10 D3F4 OUT (CS_PIO_AD), A
17: 7372+17 0E12 CD1E0E CALL beep_pause
18: 7389+6 0E15 1B DEC DE
19: 7395+4 0E16 7A ld A,D
20: 7399+4 0E17 B3 or E
21: 7403+7+5 0E18 20ED jr NZ, beep_loop
22: 7410+10 0E1A D1 pop de
23: 7420+10 0E1B F1 pop af
24: 7430+4 0E1C FB ei
25: 7434+10 0E1D C9 ret
26:
27: - 0E1E beep_pause:
28: 7444+11 0E1E C5 PUSH BC
29: - 0E1F _beep_pause_l1:
30: ;NEG ; 8 T-states
31: ;NEG ; 8 T-states
32: 7455+8 0E1F ED44 NEG ; 8 T-states
33: 7463+8 0E21 ED44 NEG ; 8 T-states
34: 7471+6 0E23 0B DEC BC ; 6 T-states
35: 7477+4 0E24 79 LD A,C ; 9 T-states
36: 7481+4 0E25 B0 OR B ; 4 T-states
37: 7485+10 0E26 C21F0E JP NZ,_beep_pause_l1 ; 10 T-states
38: 7495+10 0E29 C1 POP BC
**** main.asm ****
210: 7505+10 0E2A C9 RET ; Pause complete, RETurn
211: .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: - 000B IDE_REG_LBA0 .EQU 01011b ;Start sector register
36: - 000C IDE_REG_LBA1 .EQU 01100b ;Low byte of the cylinder number
37: - 000D IDE_REG_LBA2 .EQU 01101b ;High two bits of the cylinder number
38: - 000E IDE_REG_LBA3 .EQU 01110b ;Head and device select register
39:
40: ide_wait_rdy macro
41: local wait
42: wait:
43: ld b, IDE_REG_CMDSTS
44: call ide_regread_8
45: rla
46: jr c, wait
47: endm
48:
49: ide_wait_drq macro
50: local wait
51: wait:
52: ld b, IDE_REG_CMDSTS
53: call ide_regread_8
54: bit 0,a ;Error Bit set.
55: jp nz, ide_printerror
56: bit 3,a
57: jr z,wait
58: endm
59:
60:
61: ;================================================================
62: ; I/O access functions
63: ;================================================================
64:
65: ;------------------------------------------------------------------------------
66: ; ide_reset
67: ;
68: ; resets drives on bus
69: ;------------------------------------------------------------------------------
70: - 0E2B ide_reset:
71:
72: 7515+7 0E2B 3E80 LD A, 10000000b ;CommandByte-A, Mode 0, PA Out, PC Out, PB Out
73: 7522+11 0E2D D333 OUT (CS_PIA_CR), A ;Set Data direction to out
74: 7533+7 0E2F 3E80 LD A, IDE_RST
75: 7540+11 0E31 D332 OUT (CS_PIA_PC), A ;Reset IDE Device
76: 7551+4 0E33 AF XOR A
77: 7555+11 0E34 D332 OUT (CS_PIA_PC), A ;end device reset
78: 7566+10 0E36 C9 RET
79:
80:
81: ;------------------------------------------------------------------------------
82: ; ide_regwrite_8
83: ;
84: ; Sends data to the IDE device
85: ; A contains DATA
86: ; B contains register number
87: ;------------------------------------------------------------------------------
88: - 0E37 ide_regwrite_8:
89: 7576+11 0E37 F5 PUSH AF ;store date to stack
90: ; Prepare PIA Data Direction
91: 7587+7 0E38 3E80 LD A, 10000000b ;CommandByte-A, Mode 0, PA Out, PC Out, PB Out
92: 7594+11 0E3A D333 OUT (CS_PIA_CR), A ;Set Data direction to out
93: ; Write Data out
94: 7605+10 0E3C F1 POP AF
95: 7615+11 0E3D D330 OUT (CS_PIA_PA), A ;Write Data to bit 0-7
96: ;Prepare Address
97: 7626+4 0E3F 78 LD A, B ;Load register address
98: 7630+7 0E40 E61F AND 00011111b ;Mask unused bits
99: 7637+11 0E42 D332 OUT (CS_PIA_PC), A ;Write Data to bit controll lines
100: 7648+7 0E44 F620 OR IDE_WR ;Set Write bit
101: 7655+11 0E46 D332 OUT (CS_PIA_PC), A ;Set write signal
102: ;NOP ;delay to wait for processing
103: 7666+4 0E48 78 LD A, B ;Load register address
104: 7670+7 0E49 E61F AND 00011111b ;Mask unused bits
105: 7677+11 0E4B D332 OUT (CS_PIA_PC), A ;disable write signal
106: ;NOP
107: 7688+4 0E4D AF XOR A ;clear register A
108: 7692+11 0E4E D332 OUT (CS_PIA_PC), A ;clear controll lines
109: 7703+10 0E50 C9 RET
110:
111:
112: ;------------------------------------------------------------------------------
113: ; ide_regread_8
114: ;
115: ; Sends data to the IDE device
116: ; B contains register number
117: ; A returns data
118: ;------------------------------------------------------------------------------
119: - 0E51 ide_regread_8:
120: 7713+7 0E51 3E92 LD A, 10010010b ;CommandByte-A, Mode 0, PA IN, PC Out, PB IN
121: 7720+11 0E53 D333 OUT (CS_PIA_CR), A ;Set Data direction to in
122: ;Prepare Address
123: 7731+4 0E55 78 LD A, B ;Load register address
124: 7735+7 0E56 E61F AND 00011111b ;Mask unused bits
125: 7742+11 0E58 D332 OUT (CS_PIA_PC), A ;Write Data to bit controll lines
126: 7753+7 0E5A F640 OR IDE_RD ;Set Write bit
127: 7760+11 0E5C D332 OUT (CS_PIA_PC), A ;Write Data to bit controll lines
128: 7771+4 0E5E 00 NOP
129: 7775+11 0E5F DB30 IN A,(CS_PIA_PA) ;read data from ide device to b (because a is used later)
130: 7786+11 0E61 F5 PUSH AF
131: 7797+4 0E62 AF XOR A ;clear register A
132: 7801+11 0E63 D332 OUT (CS_PIA_PC), A ;clear controll lines
133: 7812+10 0E65 F1 POP AF ;put data in accumulator
134: 7822+10 0E66 C9 RET
135:
136: ;------------------------------------------------------------------------------
137: ; ide_readsector_512_fast
138: ;
139: ; Reads IDE Data until no more data is available (multiple sectors)
140: ; HL contains destination address
141: ; A returns 0 on success, 1 on error
142: ;------------------------------------------------------------------------------
143: - 0E67 ide_readsector_512_fast:
144: 7832+7 0E67 060F ld b, IDE_REG_CMDSTS ;check status
145: 7839+17 0E69 CD510E call ide_regread_8
146: 7856+8 0E6C CB47 bit 0,a ;Error Bit set
147: 7864+10 0E6E C2B20E jp nz, ide_printerror ;then abort
148: 7874+8 0E71 CB5F bit 3,a ;wait for drq
149: 7882+7+5 0E73 28F2 jr z,ide_readsector_512_fast
150: 7889+7 0E75 0600 ld b,0 ;256x
151: 7896+7 0E77 3E92 ld a, 10010010b ;CommandByte-A, Mode 0, PA IN, PC Out, PB IN
152: 7903+11 0E79 D333 out (CS_PIA_CR), a ;Set Data direction to IN
153: - 0E7B _ide_readsector_512_floop:
154: 7914+7 0E7B 3E08 ld a, IDE_REG_DATA ;CS0 and A=0 -> I/O register
155: 7921+11 0E7D D332 out (CS_PIA_PC), a ;set register
156: 7932+7 0E7F F640 or IDE_RD ;Set Read bit
157: 7939+11 0E81 D332 out (CS_PIA_PC), a ;Write Read to bit controll lines
158: 7950+11 0E83 DB30 in a,(CS_PIA_PA) ;load first byte
159: 7961+7 0E85 77 ld (hl), a
160: 7968+6 0E86 23 inc hl
161: 7974+11 0E87 DB31 in a,(CS_PIA_PB) ;load second byte
162: 7985+7 0E89 77 ld (hl), a
163: 7992+6 0E8A 23 inc hl
164: 7998+8+5 0E8B 10EE djnz _ide_readsector_512_floop ;loop 256 times (256words = 512 bytes)
165: 8006+7 0E8D 060F ld b, IDE_REG_CMDSTS;check drive status
166: 8013+17 0E8F CD510E call ide_regread_8 ;
167: 8030+7 0E92 E689 and 10001001b ;busy, DRQ, or error?
168: 8037+5+6 0E94 C8 ret z ;no more data or errors -> exit
169: 8042+8 0E95 CB5F bit 3,a ;test if more data available
170: 8050+7+5 0E97 20CE jr nz,ide_readsector_512_fast ;if true, repeat read function
171: 8057+10 0E99 C3B20E jp ide_printerror ;else exit function
172:
173: - 0E9C ide_readsector_timeout:
174: 8067+10 0E9C 21160F LD HL, [str_error_time]
175: 8077+17 0E9F CDFC00 CALL print_str
176: 8094+4 0EA2 79 LD A, C
177: 8098+17 0EA3 CD2201 CALL print_a_hex
178: 8115+7 0EA6 3E0A LD A,10
179: 8122+17 0EA8 CDF600 CALL print_char
180: 8139+7 0EAB 3E0D LD A,13
181: 8146+17 0EAD CDF600 CALL print_char
182: 8163+10 0EB0 C9 RET
183:
184: ;------------------------------------------------------------------------------
185: ; ide_writesector_256
186: ;
187: ; Writes 512 bytes (256 words) of IDE Data
188: ; HL contains data start address
189: ;------------------------------------------------------------------------------
190: - 0EB1 ide_writesector_256:
191: 8173+10 0EB1 C9 RET ;NOT IMPLEMENTED
192:
193:
194: ;================================================================
195: ; utility functions
196: ;================================================================
197:
198: ;------------------------------------------------------------------------------
199: ; ide_printerror
200: ;
201: ; prints IDE error to console
202: ;------------------------------------------------------------------------------
203: - 0EB2 ide_printerror:
204: 8183+10 0EB2 21E70E LD HL, [str_error_start]
205: 8193+17 0EB5 CDFC00 CALL print_str
206: 8210+7 0EB8 060F LD B, IDE_REG_CMDSTS
207: 8217+17 0EBA CD510E CALL ide_regread_8
208: 8234+17 0EBD CD2201 CALL print_a_hex
209: 8251+10 0EC0 21040F LD HL, [str_error_start1]
210: 8261+17 0EC3 CDFC00 CALL print_str
211: 8278+13 0EC6 3ACF42 LD A,(MEM_IDE_DEVICE)
212: 8291+17 0EC9 CD2201 CALL print_a_hex
213: 8308+10 0ECC 210D0F LD HL, [str_error_start2]
214: 8318+17 0ECF CDFC00 CALL print_str
215: 8335+7 0ED2 0609 LD B, IDE_REG_ERROR
216: 8342+17 0ED4 CD510E CALL ide_regread_8
217: 8359+17 0ED7 CD2201 CALL print_a_hex
218: 8376+7 0EDA 3E0A LD A,10
219: 8383+17 0EDC CDF600 CALL print_char
220: 8400+7 0EDF 3E0D LD A,13
221: 8407+17 0EE1 CDF600 CALL print_char
222: 8424+7 0EE4 3E01 LD A,1
223: 8431+10 0EE6 C9 RET
224:
225: - 0EE7 str_error_start:
226: - 0EE7 0D0A4469 db 13,10,"Disk I/O error. Status: 0x",0
736B2049
2F4F2065
72726F72
2E205374
61747573
3A203078
00
227: - 0F04 str_error_start1:
228: - 0F04 20446576 db " Dev: 0x",0
3A203078
00
229: - 0F0D str_error_start2:
230: - 0F0D 20457272 db " Err: 0x",0
3A203078
00
231:
232: - 0F16 str_error_time:
233: - 0F16 0D0A4469 db 13,10,"Disk I/O error. Data timeout @ 0x",0
736B2049
2F4F2065
72726F72
2E204461
74612074
696D656F
75742040
20307800
**** main.asm ****
212: .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: - 0030 IDE_CMD_WRITESEC .EQU 0x30 ;Write sectors.
12:
13: ;================================================================
14: ; IDE Variables
15: ;================================================================
16: - 42CF phase var_idebuffer
17: - 42CF MEM_IDE_DEVICE:
18: - 42CF ..42CF 00 defs 1
19: - 42D0 MEM_IDE_STATUS:
20: - 42D0 ..42D0 00 defs 1 ;1Byte: 0x00 if status is okay
21: - 42D1 MEM_IDE_PARTITION:
22: - 42D1 ..42D4 00 defs 4 ;4*16Bytes: LBA first sector
23: - 42D5 MEM_IDE_POINTER:
24: - 42D5 ..42D8 00 defs 4 ;4*16Bytes: LBA first sector
25: - 42D9 MEM_IDE_DEV_TABLE:
26: - 42D9 ..4318 00 defs 16*4
27: - 4319 MEM_IDE_SELECTED:
28: - 4319 ..4319 00 defs 1
29: - 431A MEM_IDE_STRING_0:
30: - 431A ..4341 00 defs 40
31: - 4342 MEM_IDE_STRING_1:
32: - 4342 ..4369 00 defs 40
33: - 436A MEM_IDE_STRING_2:
34: - 436A ..4391 00 defs 40
35: - 4392 MEM_IDE_STRING_3:
36: - 4392 ..43B9 00 defs 40
37: - 43BA MEM_IDE_BUFFER:
38: - 43BA ..45B9 00 defs 512
39: - 45BA MEM_IDE_FSBUFFER:
40: - 45BA ..46B9 00 defs 256
41: - 1325 dephase
42: ;DEV-Table layout
43: ;<STATUS> <TYPE> <FIRST-SECTOR (4-byte)> <Length (4-byte)> <I/O Addr> <Master/Slave> 0x00 0x00
44: ;Status: 0x00 -> Ready
45: ; 0x01 -> Not found
46: ; 0x02 -> No supported filesystem
47: ;I/O Addr: Base addr of 82C55
48: ;Type: File system type
49:
50:
51: - 1325 IDE_DEV_TABLE:
52: - 1325 FF000000 db 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, [MEM_IDE_STRING_0], [MEM_IDE_STRING_0]>>8, 0x00, 0x00
00000000
00003000
1A430000
53: - 1335 FF000000 db 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, [MEM_IDE_STRING_1], [MEM_IDE_STRING_1]>>8, 0x00, 0x00
00000000
00003001
42430000
54: - 1345 FF000000 db 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, [MEM_IDE_STRING_2], [MEM_IDE_STRING_2]>>8, 0x00, 0x00
00000000
00004000
6A430000
55: - 1355 FF000000 db 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, [MEM_IDE_STRING_3], [MEM_IDE_STRING_3]>>8, 0x00, 0x00
00000000
00004001
92430000
56:
57: ;================================================================
58: ; IDE funtions
59: ;================================================================
60:
61: ;------------------------------------------------------------------------------
62: ; ideif_init_table
63: ;
64: ; initializes drive table
65: ;------------------------------------------------------------------------------
66: - 1365 ideif_init_devtable:
67: ;copy default values to ram
68: 8441+10 1365 212513 ld hl,[IDE_DEV_TABLE]
69: 8451+10 1368 11D942 ld de,[MEM_IDE_DEV_TABLE]
70: 8461+10 136B 014000 ld bc,16*4
71: 8471+16+5 136E EDB0 ldir
72: ;set selected device
73: 8487+7 1370 3E00 ld a,0
74: 8494+13 1372 321943 ld (MEM_IDE_SELECTED),a
75: ;set empty names
76: 8507+4 1375 AF xor a
77: 8511+13 1376 321A43 ld (MEM_IDE_STRING_0),a
78: 8524+13 1379 324243 ld (MEM_IDE_STRING_1),a
79: 8537+13 137C 326A43 ld (MEM_IDE_STRING_2),a
80: 8550+13 137F 329243 ld (MEM_IDE_STRING_3),a
81: 8563+10 1382 C9 ret
82:
83: ;------------------------------------------------------------------------------
84: ; ideif_prnt_devtable
85: ;
86: ; prints drive table
87: ;------------------------------------------------------------------------------
88: - 1383 ideif_prnt_devtable:
89: 8573+17 1383 CD0C01 call print_newLine
90: 8590+10 1386 213016 ld hl,[_ideif_prnt_devtable_hdr]
91: 8600+17 1389 CDFC00 call print_str
92: 8617+10 138C 21D942 ld hl,[MEM_IDE_DEV_TABLE]
93: 8627+7 138F 0600 ld b,0 ;device number
94: - 1391 _ideif_prnt_devtable_l1: ;loop 1 -> for each device
95: ;print if selected
96: 8634+13 1391 3A1943 ld a,(MEM_IDE_SELECTED)
97: 8647+4 1394 B8 cp b
98: 8651+10 1395 CA9C13 jp z,_ideif_prnt_devtable_l1_sel
99: 8661+7 1398 3E20 ld a, ' '
100: 8668+12 139A 1802 jr _ideif_prnt_devtable_l1_nxt
101: - 139C _ideif_prnt_devtable_l1_sel:
102: 8680+7 139C 3E2A ld a, '*'
103: - 139E _ideif_prnt_devtable_l1_nxt:
104: 8687+17 139E CDF600 call print_char
105: ;print drive letter
106: 8704+4 13A1 78 ld a,b
107: 8708+7 13A2 C645 add 69 ;offset letter to D
108: 8715+17 13A4 CDF600 call print_char
109: 8732+7 13A7 3E3A ld a, ':'
110: 8739+17 13A9 CDF600 call print_char
111: 8756+7 13AC 3E20 ld a, ' '
112: 8763+17 13AE CDF600 call print_char
113: ;print status
114: 8780+11 13B1 E5 push hl
115: 8791+7 13B2 7E ld a,(HL)
116: 8798+4 13B3 B7 or a
117: 8802+7+5 13B4 280E jr z, _ideif_prnt_devtable_l1_s00
118: 8809+7 13B6 FE01 cp 0x01
119: 8816+7+5 13B8 280F jr z, _ideif_prnt_devtable_l1_s01
120: 8823+7 13BA FE02 cp 0x02
121: 8830+7+5 13BC 2810 jr z, _ideif_prnt_devtable_l1_s02
122: 8837+7 13BE FEFF cp 0xFF
123: 8844+7+5 13C0 2811 jr z, _ideif_prnt_devtable_l1_sFF
124: 8851+12 13C2 180F jr _ideif_prnt_devtable_l1_sFF
125: - 13C4 _ideif_prnt_devtable_l1_s00
126: 8863+10 13C4 216816 ld hl,[_ideif_prnt_devtable_s00]
127: 8873+12 13C7 180D jr _ideif_prnt_devtable_l1_es
128: - 13C9 _ideif_prnt_devtable_l1_s01
129: 8885+10 13C9 217316 ld hl,[_ideif_prnt_devtable_s01]
130: 8895+12 13CC 1808 jr _ideif_prnt_devtable_l1_es
131: - 13CE _ideif_prnt_devtable_l1_s02
132: 8907+10 13CE 217E16 ld hl,[_ideif_prnt_devtable_s02]
133: 8917+12 13D1 1803 jr _ideif_prnt_devtable_l1_es
134: - 13D3 _ideif_prnt_devtable_l1_sFF
135: 8929+10 13D3 218916 ld hl,[_ideif_prnt_devtable_sFF]
136: - 13D6 _ideif_prnt_devtable_l1_es
137: 8939+17 13D6 CDFC00 call print_str
138: 8956+10 13D9 E1 pop hl
139: 8966+6 13DA 23 inc hl
140: ;print FS-Type
141: 8972+7 13DB 3E30 ld a,'0'
142: 8979+17 13DD CDF600 call print_char
143: 8996+7 13E0 3E78 ld a,'x'
144: 9003+17 13E2 CDF600 call print_char
145: 9020+7 13E5 7E ld a,(HL)
146: 9027+17 13E6 CD2201 call print_a_hex
147: 9044+7 13E9 3E20 ld a,' '
148: 9051+17 13EB CDF600 call print_char
149: 9068+6 13EE 23 inc hl
150: ;print first sector
151: 9074+11 13EF E5 push hl
152: 9085+14 13F0 DDE1 pop ix
153:
154: 9099+6 13F2 23 inc hl
155: 9105+6 13F3 23 inc hl
156: 9111+6 13F4 23 inc hl
157: 9117+6 13F5 23 inc hl
158: 9123+6 13F6 23 inc hl
159: 9129+6 13F7 23 inc hl
160: 9135+6 13F8 23 inc hl
161: 9141+6 13F9 23 inc hl
162:
163: 9147+19 13FA DD7E03 ld a,(ix+3)
164: 9166+17 13FD CD2201 call print_a_hex
165: 9183+19 1400 DD7E02 ld a,(ix+2)
166: 9202+17 1403 CD2201 call print_a_hex
167: 9219+19 1406 DD7E01 ld a,(ix+1)
168: 9238+17 1409 CD2201 call print_a_hex
169: 9255+19 140C DD7E00 ld a,(ix+0)
170: 9274+17 140F CD2201 call print_a_hex
171: 9291+7 1412 3E20 ld a,' '
172: 9298+17 1414 CDF600 call print_char
173: ;print length
174: 9315+19 1417 DD7E07 ld a,(ix+7)
175: 9334+17 141A CD2201 call print_a_hex
176: 9351+19 141D DD7E06 ld a,(ix+6)
177: 9370+17 1420 CD2201 call print_a_hex
178: 9387+19 1423 DD7E05 ld a,(ix+5)
179: 9406+17 1426 CD2201 call print_a_hex
180: 9423+19 1429 DD7E04 ld a,(ix+4)
181: 9442+17 142C CD2201 call print_a_hex
182: 9459+7 142F 3E20 ld a,' '
183: 9466+17 1431 CDF600 call print_char
184: ;print Port
185: 9483+7 1434 3E30 ld a,'0'
186: 9490+17 1436 CDF600 call print_char
187: 9507+7 1439 3E78 ld a,'x'
188: 9514+17 143B CDF600 call print_char
189: 9531+7 143E 7E ld a,(HL)
190: 9538+17 143F CD2201 call print_a_hex
191: 9555+7 1442 3E20 ld a,' '
192: 9562+17 1444 CDF600 call print_char
193: 9579+6 1447 23 inc hl
194: ;print M/S
195: 9585+7 1448 7E ld a,(HL)
196: 9592+11 1449 E5 push hl
197: 9603+4 144A B7 or a
198: 9607+10 144B CA5414 jp z,_ideif_prnt_devtable_l1_ms
199: 9617+10 144E 219C16 ld hl,[_ideif_prnt_devtable_slave]
200: 9627+10 1451 C35714 jp _ideif_prnt_devtable_l1_e2
201: - 1454 _ideif_prnt_devtable_l1_ms
202: 9637+10 1454 219416 ld hl,[_ideif_prnt_devtable_master]
203: - 1457 _ideif_prnt_devtable_l1_e2
204: 9647+17 1457 CDFC00 call print_str
205: 9664+10 145A E1 pop hl
206: 9674+6 145B 23 inc hl
207: ;print str
208: 9680+11 145C C5 push bc
209: 9691+7 145D 7E ld a,(hl)
210: 9698+4 145E 4F ld c,a
211: 9702+6 145F 23 inc hl
212: 9708+7 1460 7E ld a,(hl)
213: 9715+4 1461 47 ld b,a
214: 9719+6 1462 23 inc hl
215: 9725+11 1463 E5 push hl
216: 9736+4 1464 60 ld h,b
217: 9740+4 1465 69 ld l,c
218: 9744+17 1466 CDFC00 call print_str
219: 9761+17 1469 CD0C01 call print_newLine
220: 9778+10 146C E1 pop hl
221: 9788+10 146D C1 pop bc
222: ;next
223: 9798+6 146E 23 inc hl
224: 9804+6 146F 23 inc hl
225: 9810+4 1470 04 inc b
226: 9814+4 1471 78 ld a,b
227: 9818+7 1472 FE04 cp 4
228: 9825+5+6 1474 C8 ret z
229: 9830+10 1475 C39113 jp _ideif_prnt_devtable_l1
230: ;------------------------------------------------------------------------------
231: ; ideif_init_drive
232: ;
233: ; initializes selected drive in table
234: ;------------------------------------------------------------------------------
235: - 1478 ideif_init_drive:
236: 9840+17 1478 CD5815 call ideif_get_drv_pointer
237: ; load addresses. not used atm
238: ;ld a,(IX+6) ;load IO Addr
239: ;ld d,a
240: ;ld a,(IX+7) ;load Master/Slave bit
241: ;ld e,a
242: 9857+17 147B CD2B0E call ide_reset
243:
244: 9874+10 147E 11FFAF ld de, 0xAFFF ;preload timeout counter
245: - 1481 _ideif_init_drive_loop:
246: 9884+7 1481 060F ld b, IDE_REG_CMDSTS
247: 9891+17 1483 CD510E call ide_regread_8 ;read drive status register
248: 9908+4 1486 B7 or a
249: 9912+7+5 1487 280B jr z,_ideif_init_drive_nodrv ;no drive found
250: 9919+8 1489 CB77 bit 6,a
251: 9927+7+5 148B 200C jr nz, _ideif_init_drive_found
252: 9934+6 148D 1B dec de
253: 9940+4 148E 7A ld a,d
254: 9944+4 148F B3 or e
255: 9948+7+5 1490 2802 jr z, _ideif_init_drive_nodrv
256: 9955+12 1492 18ED jr _ideif_init_drive_loop
257:
258: - 1494 _ideif_init_drive_nodrv:
259: 9967+19 1494 DD360001 ld(ix+0),0x01
260: 9986+10 1498 C9 ret
261:
262: - 1499 _ideif_init_drive_found:
263: 9996+19 1499 DD360002 ld (ix+0),0x02
264: ;get drive name
265:10015+7 149D 060F ld b, IDE_REG_CMDSTS ;Get drive identification
266:10022+7 149F 3EEC ld a, IDE_CMD_IDENT
267:10029+17 14A1 CD370E call ide_regwrite_8 ;Write command to drive
268:10046+10 14A4 21BA43 ld hl, MEM_IDE_BUFFER ;set read/write buffer start address
269:10056+17 14A7 CD670E call ide_readsector_512_fast ;read 256 words from device
270:10073+10 14AA 21F043 ld hl,MEM_IDE_BUFFER + 54 ;print device serial
271:10083+19 14AD DD7E0C ld a,(ix+12) ;load str pointer into de
272:10102+4 14B0 5F ld e,a
273:10106+19 14B1 DD7E0D ld a,(ix+13)
274:10125+4 14B4 57 ld d,a
275:10129+7 14B5 0614 ld b,20
276: - 14B7 _ideif_init_drive_charloop:
277:10136+7 14B7 7E ld a,(hl) ;load data from HL (buffer)
278:10143+6 14B8 23 inc hl
279:10149+4 14B9 08 ex af,af'
280:10153+7 14BA 7E ld a,(hl)
281:10160+6 14BB 23 inc hl
282:10166+7 14BC 12 ld (de),a
283:10173+6 14BD 13 inc de
284:10179+4 14BE 08 ex af,af'
285:10183+7 14BF 12 ld (de),a
286:10190+6 14C0 13 inc de
287:10196+8+5 14C1 10F4 djnz _ideif_init_drive_charloop
288: ;get partition table
289: ;read bootsector
290: - 14C3 ?a0000:
290:10204+7 14C3 060F ld b, IDE_REG_CMDSTS
290:10211+17 14C5 CD510E call ide_regread_8
290:10228+4 14C8 17 rla
290:10232+7+5 14C9 38F8 jr c, ?a0000
290: - 14CB endm
290:10204+35 14C3 060FCD51 ide_wait_rdy
0E1738F8
291:10239+7 14CB 3E01 ld a,1 ;read 1 sector
292:10246+7 14CD 060A ld B,IDE_REG_SECTOR
293:10253+17 14CF CD370E call ide_regwrite_8
294:10270+7 14D2 3E00 ld a,0 ;read sector 0
295:10277+7 14D4 060B ld b,IDE_REG_LBA0
296:10284+17 14D6 CD370E call ide_regwrite_8
297:10301+7 14D9 3E00 ld a,0 ;read cylinder 0
298:10308+7 14DB 060C ld b,IDE_REG_LBA1
299:10315+17 14DD CD370E call ide_regwrite_8
300:10332+7 14E0 3E00 ld a,0
301:10339+7 14E2 060D ld b,IDE_REG_LBA2
302:10346+17 14E4 CD370E call ide_regwrite_8
303:10363+7 14E7 3EE0 ld a,11100000b ;read head 0
304:10370+7 14E9 060E ld b,IDE_REG_LBA3
305:10377+17 14EB CD370E call ide_regwrite_8
306:
307:10394+7 14EE 3E20 ld a,IDE_CMD_READSEC ;send read command
308:10401+7 14F0 060F ld b,IDE_REG_CMDSTS
309:10408+17 14F2 CD370E call ide_regwrite_8
310:
311:10425+10 14F5 21BA43 ld hl, MEM_IDE_BUFFER ;set read/write buffer start address
312:10435+17 14F8 CD670E call ide_readsector_512_fast ;read 256 words from device
313: ;prepare partitions
314:10452+7 14FB 0604 ld b,4 ;Partition table length
315:10459+7 14FD 0E00 ld c,0 ;Partition ID counter
316:10466+14 14FF FD217845 ld iy,MEM_IDE_BUFFER+446 ;Load offest of first partition table entry
317: - 1503 _ideif_init_drive_prt_l1:
318:10480+19 1503 FD7E04 ld a,(iy+4) ;load status byte
319:10499+4 1506 B7 or a
320:10503+10 1507 C21515 jp NZ, _ideif_init_drive_prt_fnd ;If not zero, jump to print function
321:10513+10 150A C30D15 jp _ideif_init_drive_prt_ln
322: - 150D _ideif_init_drive_prt_ln:
323:10523+10 150D 111000 ld de,16
324:10533+15 1510 FD19 add iy,de
325:10548+8+5 1512 10EF djnz _ideif_init_drive_prt_l1
326:10556+10 1514 C9 ret
327: - 1515 _ideif_init_drive_prt_fnd;
328:10566+19 1515 FD7E04 ld a,(iy+4)
329:10585+19 1518 DD7701 ld (ix+1),a ;store partition type
330:10604+7 151B FE0E cp 0x0E ;if not 0xE0, continue with next entry
331:10611+7+5 151D 20EE jr nz, _ideif_init_drive_prt_ln
332: ;get start LBA
333:10618+19 151F FD7E08 ld a,(iy+0x08)
334:10637+19 1522 DD7702 ld (ix+0x02),a
335:10656+19 1525 FD7E09 ld a,(iy+0x09)
336:10675+19 1528 DD7703 ld (ix+0x03),a
337:10694+19 152B FD7E0A ld a,(iy+0x0A)
338:10713+19 152E DD7704 ld (ix+0x04),a
339:10732+19 1531 FD7E0B ld a,(iy+0x0B)
340:10751+19 1534 DD7705 ld (ix+0x05),a
341:10770+19 1537 DD360000 ld (ix+0),0x00
342: ;get count LBA
343:10789+19 153B FD7E0C ld a,(iy+0x0C)
344:10808+19 153E DD7706 ld (ix+0x06),a
345:10827+19 1541 FD7E0D ld a,(iy+0x0D)
346:10846+19 1544 DD7707 ld (ix+0x07),a
347:10865+19 1547 FD7E0E ld a,(iy+0x0E)
348:10884+19 154A DD7708 ld (ix+0x08),a
349:10903+19 154D FD7E0F ld a,(iy+0x0F)
350:10922+19 1550 DD7709 ld (ix+0x09),a
351:10941+19 1553 DD360000 ld (ix+0),0x00
352:10960+10 1557 C9 ret
353:
354: ;------------------------------------------------------------------------------
355: ; ideif_get_drv_pointer
356: ;
357: ; gets pointer to selected drive in table in IX
358: ;------------------------------------------------------------------------------
359: - 1558 ideif_get_drv_pointer:
360:10970+11 1558 F5 push af
361:10981+11 1559 C5 push bc
362: ;get selected drive
363:10992+13 155A 3A1943 ld a,(MEM_IDE_SELECTED)
364: ;multiply a *8
365:11005+4 155D 07 rlca ;*2
366:11009+4 155E 07 rlca ;*4
367:11013+4 155F 07 rlca ;*8
368:11017+7 1560 0600 ld b,0
369:11024+4 1562 4F ld c,a
370:11028+14 1563 DD21D942 ld ix,[MEM_IDE_DEV_TABLE]
371:11042+15 1567 DD09 add ix,bc
372:11057+10 1569 C1 pop bc
373:11067+10 156A F1 pop af
374:11077+10 156B C9 ret
375:
376: ;------------------------------------------------------------------------------
377: ; ideif_init_all
378: ;
379: ; initializes interface
380: ;------------------------------------------------------------------------------
381: - 156C ideif_init_all:
382:11087+10 156C 211016 ld hl, [str_dev_waitready]
383:11097+17 156F CDFC00 call print_str ;print waiting message
384:
385:11114+17 1572 CD6513 call ideif_init_devtable
386:11131+17 1575 CD7814 call ideif_init_drive
387:
388:11148+10 1578 212816 ld hl, [str_dev_done]
389:11158+17 157B CDFC00 call print_str
390:11175+10 157E C9 RET
391:
392:
393: ;------------------------------------------------------------------------------
394: ; ideif_drv_sel
395: ;
396: ; Selects drive from table and initializes the fat16 file system
397: ; A contains drive id
398: ;------------------------------------------------------------------------------
399:
400:
401:
402: ;------------------------------------------------------------------------------
403: ; read_lba_sector
404: ;
405: ; Reads A*512 byte sector into memory
406: ; HL contains pointer to LBA address
407: ; DE contains destination location
408: ; A contains sector count
409: ;------------------------------------------------------------------------------
410: - 157F read_lba_sector:
411:11185+11 157F F5 push af
412: - 1580 ?a0001:
412:11196+7 1580 060F ld b, IDE_REG_CMDSTS
412:11203+17 1582 CD510E call ide_regread_8
412:11220+4 1585 17 rla
412:11224+7+5 1586 38F8 jr c, ?a0001
412: - 1588 endm
412:11196+35 1580 060FCD51 ide_wait_rdy
0E1738F8
413:11231+10 1588 F1 pop af
414:11241+7 1589 060A LD B,IDE_REG_SECTOR ;amount of sectores
415:11248+17 158B CD370E CALL ide_regwrite_8
416:
417:11265+7 158E 7E LD A,(HL)
418:11272+7 158F 060B LD B,IDE_REG_LBA0
419:11279+17 1591 CD370E CALL ide_regwrite_8
420:11296+6 1594 23 INC HL
421:11302+7 1595 7E LD A,(HL)
422:11309+7 1596 060C LD B,IDE_REG_LBA1
423:11316+17 1598 CD370E CALL ide_regwrite_8
424:11333+6 159B 23 INC HL
425:11339+7 159C 7E LD A,(HL)
426:11346+7 159D 060D LD B,IDE_REG_LBA2
427:11353+17 159F CD370E CALL ide_regwrite_8
428:11370+6 15A2 23 INC HL
429:11376+7 15A3 7E LD A,(HL)
430:11383+7 15A4 E60F AND 00001111b
431:11390+7 15A6 F6E0 OR 11100000b
432:11397+7 15A8 060E LD B,IDE_REG_LBA3
433:11404+17 15AA CD370E CALL ide_regwrite_8
434:
435:11421+7 15AD 3E20 LD A,IDE_CMD_READSEC ;send read command
436:11428+7 15AF 060F LD B,IDE_REG_CMDSTS
437:11435+17 15B1 CD370E CALL ide_regwrite_8
438:
439: ;LD HL,MEM_IDE_BUFFER ;set read/write buffer start address
440:11452+4 15B4 EB EX DE,HL ;transfer destination in DE to HL
441:11456+10 15B5 C3670E jp ide_readsector_512_fast ;read 256 words from device
442:
443: ;------------------------------------------------------------------------------
444: ; ideif_drv_sel
445: ;
446: ; Select drive from table
447: ; Prepare variables
448: ;
449: ; A contains drive number
450: ;------------------------------------------------------------------------------
451: - 15B8 ideif_drv_sel:
452:11466+13 15B8 321943 ld (MEM_IDE_SELECTED),a
453:11479+11 15BB F5 push af
454:11490+17 15BC CD5815 call ideif_get_drv_pointer ;test if drive is marked as available
455:11507+19 15BF DD7E00 ld a,(ix+0)
456:11526+4 15C2 B7 or a
457:11530+10 15C3 C2F015 jp nz, _ideif_drv_sel_fail ;if not-> fail
458:
459:11540+17 15C6 CDCD21 call fat_get_root_table ;else get root table
460:
461:11557+10 15C9 21A416 ld hl,[_ideif_drv_sel_pstr] ;print success message
462:11567+17 15CC CDFC00 call print_str
463:11584+10 15CF F1 pop af
464:11594+7 15D0 C645 add 69
465:11601+13 15D2 322F42 ld (var_dir),a ;store drive letter
466:11614+17 15D5 CDF600 call print_char
467:11631+7 15D8 3E3A ld a, ':'
468:11638+13 15DA 323042 ld (var_dir+1),a
469:11651+7 15DD 3E5C ld a, '\'
470:11658+13 15DF 323142 ld (var_dir+2),a
471:11671+4 15E2 AF xor a ;set dir to empty
472:11675+13 15E3 323242 ld (var_dir+3),a
473:11688+13 15E6 327E42 ld (var_dir+79),a ;set depth counter
474:11701+10 15E9 21BB16 ld hl,[_ideif_drv_sel_sstr0]
475:11711+17 15EC CDFC00 call print_str
476:11728+10 15EF C9 ret
477: - 15F0 _ideif_drv_sel_fail:
478:11738+10 15F0 21A416 ld hl,[_ideif_drv_sel_pstr]
479:11748+17 15F3 CDFC00 call print_str
480:11765+10 15F6 F1 pop af
481:11775+7 15F7 C645 add 69
482:11782+17 15F9 CDF600 call print_char
483:11799+10 15FC 21AD16 ld hl,[_ideif_drv_sel_fstr0]
484:11809+17 15FF CDFC00 call print_str
485:11826+4 1602 AF xor a ;set dir to empty
486:11830+13 1603 322F42 ld (var_dir),a
487:11843+10 1606 112000 LD DE,0x20
488:11853+10 1609 017000 LD BC,0x70
489:11863+17 160C CD040E CALL beep
490:11880+10 160F C9 ret
491:
492:
493:
494:
495: ;================================================================
496: ; IDE strings
497: ;===============================================================
498:
499: - 1610 str_dev_waitready:
500: - 1610 0D0A4465 db 13,10,"Detecting drives ... ",0
74656374
696E6720
64726976
6573202E
2E2E2000
501: - 1628 str_dev_done:
502: - 1628 646F6E65 db "done!",13,10,0
210D0A00
503:
504: - 1630 _ideif_prnt_devtable_hdr:
505: - 1630 44525620 db "DRV Status Type LBA Length Port M/S Name",10,13,0
53746174
75732020
20205479
7065204C
42412020
20202020
4C656E67
74682020
20506F72
74204D2F
53202020
204E616D
650A0D00
506: - 1668 _ideif_prnt_devtable_s00:
507: - 1668 41766169 db "Avail ",0
6C202020
202000
508: - 1673 _ideif_prnt_devtable_s01:
509: - 1673 4E6F7420 db "Not Found ",0
466F756E
642000
510: - 167E _ideif_prnt_devtable_s02:
511: - 167E 556E6B6F db "Unkown FS ",0
776E2046
532000
512: - 1689 _ideif_prnt_devtable_sFF:
513: - 1689 4374726C db "Ctrl. Err ",0
2E204572
722000
514: - 1694 _ideif_prnt_devtable_master:
515: - 1694 4D617374 db "Master ",0
65722000
516: - 169C _ideif_prnt_devtable_slave:
517: - 169C 536C6176 db "Slave ",0
65202000
518: - 16A4 _ideif_drv_sel_pstr:
519: - 16A4 0A0D4472 db 10,13,"Drive ",0
69766520
00
520: - 16AD _ideif_drv_sel_fstr0:
521: - 16AD 3A206E6F db ": not ready",10,13,0
74207265
6164790A
0D00
522: - 16BB _ideif_drv_sel_sstr0:
523: - 16BB 3A207365 db ": selected",10,13,0
6C656374
65640A0D
00
524: - 16C8 _ideif_drv_sel_syn:
525: - 16C8 0A0D496E db 10,13,"Invalid drive letter",10,13,0
76616C69
64206472
69766520
6C657474
65720A0D
00
**** main.asm ****
213: .include "kdrv_siic.s"
**** include/kdrv_siic.s ****
1: ;----------------------------------------------------------------
2: ;BIOS Driver for I2C Protocol (Software)
3: ;by Dennis Gunia (01/2024)
4: ;
5: ; SCL is connected to PA1 of PIO (U6) with pull-up
6: ; SDA is connected to PA0 of PIO (U6) with pull-up
7: ;----------------------------------------------------------------
8:
9:
10: ;================================================================
11: ; I/O registers
12: ;================================================================
13:
14:
15: ;================================================================
16: ; I/O pins
17: ;================================================================
18: - 0001 IIC_CLK .EQU 00000001b
19: - 0002 IIC_DATA .EQU 00000010b
20:
21: ;================================================================
22: ; basic access functions
23: ;================================================================
24: ;HL contains buffer location
25: ;B defines amount of bytes to send
26: ;C contains device address
27: - 16E1 iic_send_buffer:
28:11890+17 16E1 CD4717 CALL iic_send_sbit ;Send startbit
29:11907+4 16E4 79 LD A,C
30:11911+7 16E5 E6FE AND 0xFE ;Mask R/W bit (must be 0 for write)
31:11918+17 16E7 CDE117 CALL iic_send_byte ;Send Address
32:11935+17 16EA CD8117 CALL iic_read_ack
33:11952+4 16ED B7 OR A ; if no ack, error
34:11956+10 16EE C20517 JP NZ, iic_send_buffer_err
35: - 16F1 iic_send_buffer_loop;
36:11966+7 16F1 7E LD A,(HL)
37:11973+6 16F2 23 INC HL
38:11979+17 16F3 CDE117 CALL iic_send_byte
39:11996+17 16F6 CD8117 CALL iic_read_ack
40:12013+4 16F9 B7 OR A ; if no ack, error
41:12017+10 16FA C20517 JP NZ, iic_send_buffer_err
42:12027+8+5 16FD 10F2 DJNZ iic_send_buffer_loop ;loop for remaining bytes
43: - 16FF iic_send_buffer_done:
44:12035+17 16FF CD6017 CALL iic_send_ebit
45:12052+7 1702 3E00 LD A,0
46:12059+10 1704 C9 RET
47: - 1705 iic_send_buffer_err:
48:12069+17 1705 CD6017 CALL iic_send_ebit
49:12086+7 1708 3E01 LD A,1
50:12093+10 170A C9 RET
51:
52: ;HL contains buffer location
53: ;B defines amount of bytes to send
54: ;C contains device address
55: - 170B iic_receive_buffer:
56:12103+4 170B 05 DEC B
57:12107+17 170C CD4717 CALL iic_send_sbit ;Send startbit
58:12124+4 170F 79 LD A,C
59:12128+7 1710 F601 OR 0x01 ;set R/W bit (must be 1 for read)
60:12135+17 1712 CDE117 CALL iic_send_byte ;Send Address
61:12152+17 1715 CD8117 CALL iic_read_ack
62:12169+4 1718 B7 OR A ; if no ack, error
63:12173+10 1719 C23417 JP NZ, iic_receive_buffer_err
64: - 171C iic_receive_buffer_loop:
65:12183+17 171C CD0718 CALL iic_receive_byte
66:12200+7 171F 77 LD (HL),A
67:12207+6 1720 23 INC HL
68:12213+17 1721 CDA717 CALL iic_send_ack
69:12230+8+5 1724 10F6 DJNZ iic_receive_buffer_loop
70: ; last time:
71:12238+17 1726 CD0718 CALL iic_receive_byte
72:12255+7 1729 77 LD (HL),A
73:12262+6 172A 23 INC HL
74:12268+17 172B CDC417 CALL iic_send_nack
75:
76: - 172E iic_receive_buffer_done:
77:12285+17 172E CD6017 CALL iic_send_ebit
78:12302+7 1731 3E00 LD A,0
79:12309+10 1733 C9 RET
80: - 1734 iic_receive_buffer_err:
81:12319+17 1734 CD6017 CALL iic_send_ebit
82:12336+7 1737 3E01 LD A,1
83:12343+10 1739 C9 RET
84:
85:
86:
87: ;================================================================
88: ; I/O access functions
89: ;================================================================
90:
91: ;Reset PIO configuration
92: - 173A iic_init:
93: ;SCL HIGH, SDA HIGH
94:12353+7 173A 3E03 LD A,0x03
95:12360+11 173C D3F4 OUT (CS_PIO_AD), A
96: ;Set port to controll mode (MODE3)
97:12371+7 173E 3ECF LD A,0xCF
98:12378+11 1740 D3F6 OUT (CS_PIO_AC), A
99: ;Set inputs/outputs
100:12389+7 1742 3EF0 LD A,0xF0
101:12396+11 1744 D3F6 OUT (CS_PIO_AC), A
102:12407+10 1746 C9 RET
103:
104: ; send start bit
105: - 1747 iic_send_sbit:
106: ;SCL HIGH, SDA HIGH
107:12417+7 1747 3E03 LD A,0x03
108:12424+11 1749 D3F4 OUT (CS_PIO_AD), A
109: ;Set port to controll mode (MODE3)
110:12435+7 174B 3ECF LD A,0xCF
111:12442+11 174D D3F6 OUT (CS_PIO_AC), A
112: ;Set inputs/outputs (SDA and SCL is now output)
113:12453+7 174F 3EFC LD A,0xFC
114:12460+11 1751 D3F6 OUT (CS_PIO_AC), A
115: ;SCL HIGH, SDA LOW
116:12471+7 1753 3E02 LD A,0x02
117:12478+11 1755 D3F4 OUT (CS_PIO_AD), A
118:12489+4 1757 00 NOP
119:12493+4 1758 00 NOP
120:12497+7 1759 3E00 LD A,0x00
121:12504+11 175B D3F4 OUT (CS_PIO_AD), A
122:12515+4 175D 00 NOP
123:12519+4 175E 00 NOP
124:12523+10 175F C9 RET
125:
126: ; send end/stop bit
127: - 1760 iic_send_ebit:
128: ;Set port to controll mode (MODE3)
129:12533+7 1760 3ECF LD A,0xCF
130:12540+11 1762 D3F6 OUT (CS_PIO_AC), A
131:
132: ;Set inputs/outputs (SDA and SCL is now output)
133:12551+7 1764 3EFC LD A,0xFC
134:12558+11 1766 D3F6 OUT (CS_PIO_AC), A
135: ;SCL HIGH, SDA LOW
136:12569+7 1768 3E02 LD A,0x02
137:12576+11 176A D3F4 OUT (CS_PIO_AD), A
138:12587+4 176C 00 NOP
139:12591+4 176D 00 NOP
140:12595+7 176E 3E03 LD A,0x03 ; both high
141:12602+11 1770 D3F4 OUT (CS_PIO_AD), A
142:12613+4 1772 00 NOP
143:12617+4 1773 00 NOP
144: ;release bus
145: ;Set port to controll mode (MODE3)
146:12621+7 1774 3ECF LD A,0xCF
147:12628+11 1776 D3F6 OUT (CS_PIO_AC), A
148:12639+4 1778 00 NOP
149:12643+4 1779 00 NOP
150: ;Set inputs/outputs (SDA and SCL is now input, sound enabled)
151:12647+7 177A 3EF7 LD A,11110111b
152:12654+11 177C D3F6 OUT (CS_PIO_AC), A
153:12665+4 177E 00 NOP
154:12669+4 177F 00 NOP
155:12673+10 1780 C9 RET
156:
157:
158: - 1781 iic_read_ack:
159:12683+7 1781 3ECF LD A,0xCF
160:12690+11 1783 D3F6 OUT (CS_PIO_AC), A
161: ;Set inputs/outputs (SCL is now output, SDA input)
162:12701+7 1785 3EFD LD A,0xFD
163:12708+11 1787 D3F6 OUT (CS_PIO_AC), A
164:12719+4 1789 00 NOP
165:12723+4 178A 00 NOP
166:12727+7 178B 3E00 LD A,0x00 ;set SCL LOW
167:12734+11 178D D3F4 OUT (CS_PIO_AD), A
168:12745+4 178F 00 NOP
169:12749+4 1790 00 NOP
170:12753+7 1791 EE02 XOR 0x02 ;set SCL HIGH
171:12760+11 1793 D3F4 OUT (CS_PIO_AD), A
172:12771+4 1795 00 NOP
173:12775+11 1796 DBF4 IN A,(CS_PIO_AD) ; Read SDA
174:12786+4 1798 00 NOP
175:12790+4 1799 00 NOP
176:12794+11 179A F5 PUSH AF
177:12805+7 179B E6FE AND 0xFE ; Filter input
178:12812+7 179D EE02 XOR 0x02 ;set SCL LOW
179:12819+11 179F D3F4 OUT (CS_PIO_AD), A
180:12830+4 17A1 00 NOP
181:12834+4 17A2 00 NOP
182:12838+10 17A3 F1 POP AF
183:12848+7 17A4 E601 AND 1
184:12855+10 17A6 C9 RET
185:
186: - 17A7 iic_send_ack:
187: ;Set port to controll mode (MODE3)
188:12865+7 17A7 3ECF LD A,0xCF
189:12872+11 17A9 D3F6 OUT (CS_PIO_AC), A
190: ;Set inputs/outputs (SDA and SCL is now output)
191:12883+7 17AB 3EFC LD A,0xFC
192:12890+11 17AD D3F6 OUT (CS_PIO_AC), A
193:12901+4 17AF 00 NOP
194:12905+4 17B0 00 NOP
195:12909+7 17B1 3E00 LD A,0x00 ; SCL LOW, SDA LOW
196:12916+11 17B3 D3F4 OUT (CS_PIO_AD), A
197:12927+4 17B5 00 NOP
198:12931+4 17B6 00 NOP
199:12935+7 17B7 3E02 LD A,0x02 ; SCL HIGH, SDA LOW
200:12942+11 17B9 D3F4 OUT (CS_PIO_AD), A
201:12953+4 17BB 00 NOP
202:12957+4 17BC 00 NOP
203:12961+7 17BD 3E00 LD A,0x00 ; SCL LOW, SDA LOW
204:12968+11 17BF D3F4 OUT (CS_PIO_AD), A
205:12979+4 17C1 00 NOP
206:12983+4 17C2 00 NOP
207:12987+10 17C3 C9 RET
208:
209: - 17C4 iic_send_nack:
210: ;Set port to controll mode (MODE3)
211:12997+7 17C4 3ECF LD A,0xCF
212:13004+11 17C6 D3F6 OUT (CS_PIO_AC), A
213: ;Set inputs/outputs (SDA and SCL is now output)
214:13015+7 17C8 3EFC LD A,0xFC
215:13022+11 17CA D3F6 OUT (CS_PIO_AC), A
216:13033+4 17CC 00 NOP
217:13037+4 17CD 00 NOP
218:13041+7 17CE 3E02 LD A,0x02 ; SCL LOW, SDA HIGH
219:13048+11 17D0 D3F4 OUT (CS_PIO_AD), A
220:13059+4 17D2 00 NOP
221:13063+4 17D3 00 NOP
222:13067+7 17D4 3E03 LD A,0x03 ; both high
223:13074+11 17D6 D3F4 OUT (CS_PIO_AD), A
224:13085+4 17D8 00 NOP
225:13089+4 17D9 00 NOP
226:13093+7 17DA 3E02 LD A,0x02 ; SCL LOW, SDA HIGH
227:13100+11 17DC D3F4 OUT (CS_PIO_AD), A
228:13111+4 17DE 00 NOP
229:13115+4 17DF 00 NOP
230:13119+10 17E0 C9 RET
231:
232: ;A contains byte
233: - 17E1 iic_send_byte:
234:13129+11 17E1 C5 PUSH BC
235:13140+4 17E2 4F LD C,A ;buffer
236: ;Set port to controll mode (MODE3)
237:13144+7 17E3 3ECF LD A,0xCF
238:13151+11 17E5 D3F6 OUT (CS_PIO_AC), A
239: ;Set inputs/outputs (SDA and SCL is now output)
240:13162+7 17E7 3EFC LD A,0xFC
241:13169+11 17E9 D3F6 OUT (CS_PIO_AC), A
242:13180+7 17EB 0608 LD B,8 ;bit counter
243:
244: - 17ED iic_send_byte_loop:
245: ;prepare data
246:13187+8 17ED CB11 RL C
247:13195+7 17EF 3E00 LD A,0
248:13202+4 17F1 17 RLA ; set SCA bit from carry, SCL LOW
249:13206+11 17F2 D3F4 OUT (CS_PIO_AD), A
250:13217+4 17F4 00 NOP
251:13221+4 17F5 00 NOP
252:13225+7 17F6 EE02 XOR 0x02 ;set SCL HIGH
253:13232+11 17F8 D3F4 OUT (CS_PIO_AD), A
254:13243+4 17FA 00 NOP
255:13247+4 17FB 00 NOP
256:13251+7 17FC EE02 XOR 0x02 ;set SCL LOW
257:13258+11 17FE D3F4 OUT (CS_PIO_AD), A
258:13269+4 1800 00 NOP
259:13273+4 1801 00 NOP
260:13277+8+5 1802 10E9 DJNZ iic_send_byte_loop ;loop until counter is 0
261: ;transmittion end / end loop
262:13285+4 1804 79 LD A,C
263:13289+10 1805 C1 POP BC
264:13299+10 1806 C9 RET
265:
266: - 1807 iic_receive_byte:
267:13309+11 1807 C5 PUSH BC
268: ;Set port to controll mode (MODE3)
269:13320+7 1808 3ECF LD A,0xCF
270:13327+11 180A D3F6 OUT (CS_PIO_AC), A
271: ;Set inputs/outputs (SCL is now output, SDA input)
272:13338+7 180C 3EFD LD A,0xFD
273:13345+11 180E D3F6 OUT (CS_PIO_AC), A
274:13356+7 1810 0608 LD B,8 ;bit counter
275:13363+7 1812 0E00 LD C,0
276: - 1814 iic_receive_byte_loop:
277:13370+4 1814 AF XOR A ;set SCL LOW
278:13374+11 1815 D3F4 OUT (CS_PIO_AD), A
279:13385+4 1817 00 NOP
280:13389+4 1818 00 NOP
281:13393+7 1819 3E02 LD A,2 ;set SCL HIGH
282:13400+11 181B D3F4 OUT (CS_PIO_AD), A
283:13411+4 181D 00 NOP
284:13415+11 181E DBF4 IN A, (CS_PIO_AD)
285:13426+4 1820 00 NOP
286:13430+4 1821 1F RRA ;read SDA bit
287:13434+8 1822 CB11 RL C ;store bit
288:13442+4 1824 AF XOR A ;set SCL LOW again
289:13446+11 1825 D3F4 OUT (CS_PIO_AD), A
290:13457+4 1827 00 NOP
291:13461+4 1828 00 NOP
292:13465+8+5 1829 10E9 DJNZ iic_receive_byte_loop
293:13473+4 182B 79 LD A,C
294:13477+10 182C C1 POP BC
**** main.asm ****
214:13487+10 182D C9 RET
215: .include "kdrv_int.s"
**** include/kdrv_int.s ****
1:
2: - 4000 INT_VEC_TABLE .equ [interrupt_vectors]
3: - 00F4 INT_PIO_ADDRD .equ CS_PIO_AD
4: - 00F6 INT_PIO_ADDRC .equ CS_PIO_AC
5:
6: ;initialize interrupt controller
7: - 182E intctrl_init:
8: ;disable interrupt (just to make sure)
9:13497+4 182E F3 di
10: ;setup interrupt table
11:13501+7 182F 3E40 ld a,high [INT_VEC_TABLE]
12:13508+9 1831 ED47 ld i,a
13:
14: ; set port
15:13517+4 1833 AF xor a
16:13521+11 1834 D3F4 out (INT_PIO_ADDRD), a
17:
18: ;fill table
19:13532+10 1836 210040 ld hl,[INT_VEC_TABLE]
20:13542+7 1839 0680 ld b,128
21: - 183B _intctrl_init_fill_loop:
22:13549+7 183B 3E5A ld a, low [_int_invalid_int]
23:13556+7 183D 77 ld (hl),a
24:13563+6 183E 23 inc hl
25:13569+7 183F 3E18 ld a, high [_int_invalid_int]
26:13576+7 1841 77 ld (hl),a
27:13583+6 1842 23 inc hl
28:13589+8+5 1843 10F6 djnz _intctrl_init_fill_loop
29:
30: ;set int vector for PIO
31:13597+10 1845 214E18 ld hl, [_isr_pio]
32:13607+16 1848 220240 ld (INT_VEC_TABLE + 2), hl
33:
34: ;enable interrupts
35:13623+8 184B ED5E im 2
36:13631+10 184D C9 ret
37:
38: ;------------------------------------------------------------------------------
39: ; setup interrupt for PIO pin
40: ; inputs: a (interrupt pin)
41: ; hl (jump addr)
42: ;------------------------------------------------------------------------------
43: - 184E initctrl_int_register:
44:
45: ;------------------------------------------------------------------------------
46: ; removes interrupt for PIO pin
47: ; inputs: a (interrupt pin)
48: ;------------------------------------------------------------------------------
49: - 184E initctrl_int_abandon:
50:
51: ; jumps to isr. MUST be exited with RETI opcode!
52: - 184E _isr_pio:
53:13641+4 184E F3 di
54:13645+10 184F 219B18 ld hl, [_str_pio_interrupt]
55:13655+17 1852 CDFC00 call print_str
56: ;get int from pio
57:13672+11 1855 DBF4 in a,(INT_PIO_ADDRD)
58:13683+17 1857 CD2201 call print_a_hex
59:
60: - 185A _int_invalid_int:
61:13700+4 185A F3 di
62:13704+10 185B 216418 ld hl, [_str_invalid_interrupt]
63:13714+17 185E CDFC00 call print_str
64:13731+4 1861 FB ei
65:13735+14 1862 ED4D reti
66:
67: - 1864 _str_invalid_interrupt:
68: - 1864 0A0D5B4B db 10,13,"[KERNEL] INT: Invalid interrupt call! Exiting ISR.",10,13,0
45524E45
4C5D2049
4E543A20
496E7661
6C696420
696E7465
72727570
74206361
6C6C2120
45786974
696E6720
4953522E
0A0D00
69:
70: - 189B _str_pio_interrupt:
**** main.asm ****
216: - 189B 0A0D5B4B db 10,13,"[KERNEL] INT: (DEBUG) Interrupt call from PIO.",10,13,0
45524E45
4C5D2049
4E543A20
28444542
55472920
496E7465
72727570
74206361
6C6C2066
726F6D20
50494F2E
0A0D00
217: .include "kdrv_sio.s"
**** include/kdrv_sio.s ****
1: ;----------------------------------------------------------------
2: ;BIOS Driver for Serial Console
3: ;by Dennis Gunia (07/2024)
4: ;
5: ;----------------------------------------------------------------
6:
7: ;================================================================
8: ; I/O access functions
9: ;================================================================
10: ;initialize SIO Port A
11:
12: - 18CE consio_init_a:
13:13749+17 18CE CD1D19 call consio_init_ctc_a
14:13766+17 18D1 CDD518 call consio_init_a_sio
15: ;call consio_init_a_int
16:13783+10 18D4 C9 ret
17:
18: - 18D5 consio_init_a_sio:
19:13793+7 18D5 3E30 ld A, 00110000b ;write into WR0: error reset, select WR0
20:13800+11 18D7 D309 out (CS_SIO_A_C), a
21:13811+7 18D9 3E18 ld a, 018h ;write into WR0: channel reset
22:13818+11 18DB D309 out (CS_SIO_A_C), a
23:13829+7 18DD 3E04 ld a, 004h ;write into WR0: select WR4
24:13836+11 18DF D309 out (CS_SIO_A_C), a
25:13847+7 18E1 3E44 ld a, 01000100b ;write into WR4: clkx16,1 stop bit, no parity
26:13854+11 18E3 D309 out (CS_SIO_A_C), a
27:13865+7 18E5 3E05 ld a, 005h ;write into WR0: select WR5
28:13872+11 18E7 D309 out (CS_SIO_A_C), a
29:13883+7 18E9 3EE8 ld a, 11101000b ;DTR inactive, TX 8bit, BREAK off, TX on, RTS inactive
30:13890+11 18EB D309 out (CS_SIO_A_C), a
31:13901+7 18ED 3E01 ld a, 01h ;write into WR0: select WR1
32:13908+11 18EF D309 out (CS_SIO_A_C), a
33:13919+7 18F1 3E04 ld a, 00000100b ;no interrupt in CH B, special RX condition affects vect
34:13926+11 18F3 D309 out (CS_SIO_A_C), a
35:13937+7 18F5 3E02 ld a, 02h ;write into WR0: select WR2
36:13944+11 18F7 D309 out (CS_SIO_A_C), a
37:13955+7 18F9 3E00 ld a, 0h ;write into WR2: cmd line int vect (see int vec table)
38: ;bits D3,D2,D1 are changed according to RX condition
39:13962+11 18FB D309 out (CS_SIO_A_C), a
40:13973+7 18FD 3E03 ld a, 003h ;write into WR0: select WR3
41:13980+11 18FF D309 out (CS_SIO_A_C), a
42:13991+7 1901 3EC1 ld a, 0C1h ;RX 8bit, auto enable off, RX on
43:13998+11 1903 D309 out (CS_SIO_A_C), a
44:14009+10 1905 C9 ret
45:
46: - 1906 consio_init_a_int:
47: ;setup SIO interrupt vector
48:14019+7 1906 3E02 ld a, 2 ;write WR2
49:14026+11 1908 D30B out (CS_SIO_B_C), a
50:14037+7 190A 3E04 ld a, 00000100b ;write Vector
51:14044+11 190C D30B out (CS_SIO_B_C), a
52: ;setup SIO
53:14055+7 190E 3E01 ld a, 1 ;write WR1
54:14062+11 1910 D309 out (CS_SIO_A_C), a
55:14073+7 1912 3E18 ld a, 00011000b ;enable INT on all RX
56:14080+11 1914 D309 out (CS_SIO_A_C), a
57: ;set ISR addr
58:14091+10 1916 216019 ld hl, [consio_isr]
59:14101+16 1919 220440 ld (INT_VEC_TABLE + 4), hl
60:14117+10 191C C9 ret
61:
62: - 191D consio_init_ctc_a:
63:14127+7 191D 3E4F ld a, 01001111b; External Trigger, Time COnstant Follows
64:14134+11 191F D304 out (CS_CTC_0),a
65:14145+11 1921 DB01 in a, (CS_DIP) ; Read BAUD from DIP-Switches
66:14156+11 1923 D304 out (CS_CTC_0),a
67:14167+10 1925 C9 ret
68:
69:
70: - 1926 consio_tx_a:
71:14177+11 1926 D308 out (CS_SIO_A_D),a
72: - 1928 consio_tx_a_waitout:
73: ; check for TX buffer empty
74:14188+4 1928 97 sub a ;clear a, write into WR0: select RR0
75:14192+4 1929 3C inc a ;select RR1
76:14196+11 192A D309 out (CS_SIO_A_C),A
77:14207+11 192C DB09 in A,(CS_SIO_A_C) ;read RRx
78:14218+8 192E CB47 bit 0,A
79:14226+7+5 1930 28F6 jr z,consio_tx_a_waitout
80:14233+10 1932 C9 ret
81:
82: - 1933 consio_rx_a:
83:14243+17 1933 CD4419 call consio_rx_rts_a_on
84:14260+4 1936 AF xor a ; a = 0
85:14264+11 1937 D309 out (CS_SIO_A_C), a ; select reg 0
86:14275+11 1939 DB09 in a, (CS_SIO_A_C) ; read reg 0
87:14286+7 193B E601 and 1 ; mask D0 (recieve char available)
88:14293+17 193D CDDA01 call A_RTS_OFF
89:14310+5+6 1940 C8 ret Z ; return 0 if no char
90:14315+11 1941 DB08 in a, (CS_SIO_A_D) ; read char if avail
91:14326+10 1943 C9 ret ; return
92:
93: - 1944 consio_rx_rts_a_on:
94:14336+7 1944 3E05 ld a,005h ;write into WR0: select WR5
95:14343+11 1946 D309 out (CS_SIO_A_C),A
96:14354+7 1948 3EEA ld a,0EAh ;DTR active, TX 8bit, BREAK off, TX on, RTS active
97:14361+11 194A D309 out (CS_SIO_A_C),A
98:14372+10 194C C9 ret
99:
100: - 194D consio_rx_rts_a_off:
101:14382+7 194D 3E05 ld a,005h ;write into WR0: select WR5
102:14389+11 194F D309 out (CS_SIO_A_C),A
103:14400+7 1951 3E68 ld a,068h ;DTR inactive, TX 8bit, BREAK off, TX on, RTS inactive
104:14407+11 1953 D309 out (CS_SIO_A_C),A
105:14418+10 1955 C9 ret
106:
107: - 1956 consio_rx_a_sts:
108:14428+11 1956 D309 out (CS_SIO_A_C), a ; select reg 0
109:14439+11 1958 DB09 in a, (CS_SIO_A_C) ; read reg 0
110:14450+7 195A E601 and 1 ; mask D0 (recieve char available)
111:14457+5+6 195C C8 ret z
112:14462+7 195D 3EFF ld a, 0xFF
113:14469+10 195F C9 ret
114:
115:
116: ;Interrupt service routine
117: - 1960 consio_isr:
118:14479+4 1960 F3 di
119:14483+7 1961 3E38 ld a, 00111000b ;RET fro INT
120:14490+11 1963 D30B out (CS_SIO_B_C), a ;read data
121:14501+11 1965 DB08 in a, (CS_SIO_A_D)
122:14512+17 1967 CDBF01 call con_rb_write ;write to ringbuffer
123:14529+4 196A FB ei
**** main.asm ****
218:14533+14 196B ED4D reti
219: .include "prettydump.s"
**** 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: - 196D dump_pretty:
15:14547+11 196D E5 PUSH HL
16:14558+10 196E 21C819 LD HL,[STR_PD_HEADER] ;Print header
17:14568+17 1971 CDFC00 CALL print_str
18:14585+10 1974 E1 POP HL
19: - 1975 dump_pretty_row:
20:14595+4 1975 78 LD A,B ;Check row counter
21:14599+4 1976 B7 OR A
22:14603+10 1977 CAC719 JP Z, dump_pretty_end ;If counter is 0, exit
23:14613+4 197A 05 DEC B ;Decrement row counter by 1
24:14617+7 197B 0E10 LD C, 16 ;Load column counter
25:14624+4 197D 7C LD A, H ;Print base address
26:14628+17 197E CD2201 CALL print_a_hex
27:14645+4 1981 7D LD A, L
28:14649+17 1982 CD2201 CALL print_a_hex
29:14666+7 1985 3E20 LD A, ' '
30:14673+17 1987 CDF600 CALL print_char
31: - 198A dump_pretty_col: ;Loop for column
32:14690+7 198A 7E LD A,(HL) ;Load byte to disply
33:14697+17 198B CD2201 CALL print_a_hex
34:14714+7 198E 3E20 LD A, ' '
35:14721+17 1990 CDF600 CALL print_char
36:14738+6 1993 23 INC HL
37:14744+4 1994 0D DEC C ;Decrement column counter
38:14748+7+5 1995 20F3 JR NZ, dump_pretty_col ;Loop if not 0
39: - 1997 dump_pretty_ascii:
40:14755+11 1997 C5 PUSH BC
41:14766+11 1998 E5 PUSH HL
42:14777+7 1999 0600 LD B,0
43:14784+7 199B 0E10 LD C,16
44:14791+15 199D ED42 SBC HL,BC ;Reset HL by column count
45: - 199F dump_pretty_ascii_loop:
46:14806+7 199F 7E LD A,(HL)
47:14813+6 19A0 23 INC HL
48:14819+7 19A1 FE20 CP 32
49:14826+10 19A3 DAB019 JP C, dump_pretty_ascii_none ;if less than 32, it is not a char
50:14836+7 19A6 FE7F CP 127
51:14843+10 19A8 D2B019 JP NC, dump_pretty_ascii_none ;if greater or equal than 128, it is not a char
52:14853+17 19AB CDF600 call print_char
53:14870+12 19AE 1805 jr dump_pretty_ascii_cont
54: - 19B0 dump_pretty_ascii_none:
55:14882+7 19B0 3E2E LD A,'.'
56:14889+17 19B2 CDF600 call print_char
57: - 19B5 dump_pretty_ascii_cont:
58:14906+4 19B5 0D DEC C
59:14910+10 19B6 C29F19 JP NZ, dump_pretty_ascii_loop
60:
61:
62:14920+10 19B9 E1 POP HL
63:14930+10 19BA C1 POP BC
64: - 19BB dump_pretty_nextrow:
65:14940+7 19BB 3E0A LD A,10 ;New line
66:14947+17 19BD CDF600 CALL print_char
67:14964+7 19C0 3E0D LD A,13
68:14971+17 19C2 CDF600 CALL print_char
69:14988+12 19C5 18AE JR dump_pretty_row ;Else next line
70: - 19C7 dump_pretty_end:
71:15000+10 19C7 C9 RET
72:
73: - 19C8 STR_PD_HEADER:
74: - 19C8 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: - 1A07 print_str_fixed:
85:15010+7 1A07 7E LD A,(HL)
86:15017+6 1A08 23 INC HL
87:15023+17 1A09 CDF600 CALL print_char
88:15040+8+5 1A0C 10F9 DJNZ print_str_fixed
89:15048+10 1A0E C9 RET
90:
**** main.asm ****
220: .include "command.s"
**** include/command.s ****
1: - 1A0F COMMAND_LUT:
2: - 1A0F 64617465 db "date", 0 , [OP_RTIME], [OP_RTIME]>>8 ;Read time
004F1D
3: - 1A16 73657464 db "setdate", 0 , [OP_STIME], [OP_STIME]>>8 ;Read time
61746500
E71E
4: - 1A20 70696E20 db "pin ", 0 , [OP_IO_IN], [OP_IO_IN]>>8 ;Read port
00681C
5: - 1A27 64756D70 db "dump ",0, [OP_DUMP], [OP_DUMP]>>8 ;print pretty hexdump
2000D71B
6: - 1A2F 706F7574 db "pout ", 0 , [OP_IO_OUT], [OP_IO_OUT]>>8 ;Write port
20007E1C
7: - 1A37 69696E20 db "iin ", 0, [OP_IIC_IN], [OP_IIC_IN]>>8 ;Read IIC
00FF1C
8: - 1A3E 696F7574 db "iout ", 0, [OP_IIC_OUT], [OP_IIC_OUT]>>8 ;Write IIC
20009F1C
9: - 1A46 63616C6C db "call ", 0, [OP_CALL], [OP_CALL]>>8 ;Call to addr
2000B71B
10: - 1A4E 636C7200 db "clr", 0, [OP_CLR], [OP_CLR]>>8 ;Call to addr
4B1D
11: - 1A54 6461736D db "dasm ", 0, [OP_DASM], [OP_DASM]>>8 ;Call to addr
2000381C
12: - 1A5C 6A702000 db "jp ", 0,[OP_EXEC], [OP_EXEC]>>8 ;jump to addr
9E1B
13: - 1A62 72737400 db "rst", 0,0x00,0x00 ;soft reset
0000
14: - 1A68 6C736473 db "lsdsk", 0,[OP_LSDSK], [OP_LSDSK]>>8 ;list disks
6B00601F
15: - 1A70 73656C64 db "seldsk ", 0,[OP_SELDSK], [OP_SELDSK]>>8 ;select disk
736B2000
641F
16: - 1A7A 63642000 db "cd ", 0 , [OP_CD], [OP_CD]>>8 ;Read time
871F
17: - 1A80 6C730083 db "ls", 0 , [OP_DIR], [OP_DIR]>>8 ;Read time
1F
18: - 1A85 72756E20 db "run ", 0 , [OP_FSEXEC], [OP_FSEXEC]>>8 ;Read time
00A41F
19: - 1A8C 24009E1B db "$", 0, [OP_EXEC], [OP_EXEC]>>8 ;jump to addr
20: - 1A90 6900681C db "i", 0, [OP_IO_IN], [OP_IO_IN]>>8 ;Read port
21: - 1A94 6F007E1C db "o", 0, [OP_IO_OUT], [OP_IO_OUT]>>8 ;Write port
22: - 1A98 2100071C db "!", 0, [OP_SET], [OP_SET]>>8 ;Write memory
23: - 1A9C 3F00D71B db "?", 0, [OP_DUMP], [OP_DUMP]>>8 ;Print memory
24: - 1AA0 FF db 0xFF ;End of Table
25:
26: - 1AA1 COMMAND_ABORT:
27: ;cleanup stack
28:15058+10 1AA1 31FFFF ld sp, STACK_RAM_TOP
29: ; return to prompt
30: - 1AA4 COMMAND:
31:15068+17 1AA4 CD0C01 call print_newLine
32:15085+10 1AA7 212F42 ld hl,[var_dir]
33:15095+17 1AAA CDFC00 call print_str
34:15112+7 1AAD 3E3E ld a,'>'
35:15119+17 1AAF CDF600 call print_char
36:15136+4 1AB2 AF xor a ;reset buffer len
37:15140+13 1AB3 320442 ld (var_buffer_len),a ;set buffer len to 0
38: - 1AB6 COMMAND_READ:
39:15153+17 1AB6 CD4C01 call read_char
40:15170+10 1AB9 CAB61A jp z, COMMAND_READ ;wait for input
41:15180+7 1ABC FE0D cp 13 ; enter
42:15187+10 1ABE CA0B1B jp z,COMMAND_PROCESS
43:15197+7 1AC1 FE0A cp 10
44:15204+10 1AC3 CAB61A jp z, COMMAND_READ; skip LF for file load
45:15214+7 1AC6 FE08 cp 0x08 ; backspace 0x08 VT102 0x7f Putty
46:15221+10 1AC8 CAE51A jp z,COMMAND_BACKSPACE
47:
48:15231+11 1ACB F5 push af
49: ; a contains latest char
50:15242+10 1ACC 217F42 ld hl,[var_input]
51:15252+7 1ACF 1600 ld d,0
52:15259+13 1AD1 3A0442 ld a,(var_buffer_len)
53:15272+4 1AD4 5F ld e,a
54:15276+11 1AD5 19 add hl,de ;hl now contains pointer to last position in buffer
55:15287+4 1AD6 3C inc a
56:15291+13 1AD7 320442 ld (var_buffer_len),a ;store incremented buffer length
57:
58:15304+10 1ADA F1 pop af
59:15314+7 1ADB 77 ld (hl),a
60:15321+17 1ADC CDF600 call print_char
61:15338+6 1ADF 23 inc hl
62:15344+4 1AE0 AF xor a ;a = 0
63:15348+7 1AE1 77 ld (hl),a ;always add null termination after last char
64:15355+10 1AE2 C3B61A jp COMMAND_READ
65:
66:
67: - 1AE5 COMMAND_BACKSPACE:
68:15365+13 1AE5 3A0442 ld a,(var_buffer_len)
69:15378+4 1AE8 A7 and a
70:15382+10 1AE9 CAB61A jp z, COMMAND_READ ; do not continue if already at char 0
71:15392+4 1AEC 3D dec a ;decrement length
72:15396+13 1AED 320442 ld (var_buffer_len),a ;and store it
73:15409+4 1AF0 5F ld e,a ;load de with decremented value
74:15413+7 1AF1 1600 ld d,0
75:15420+10 1AF3 217F42 ld hl,[var_input]
76:15430+11 1AF6 19 add hl,de ;hl now contains pointer to last position in buffer
77:15441+4 1AF7 AF xor a ; store null byte to current location
78:15445+7 1AF8 77 ld (hl),a
79: ;call print_delete
80:15452+7 1AF9 3E08 ld a, 0x08
81:15459+17 1AFB CDF600 call print_char
82:15476+7 1AFE 3E20 ld a, 0x20
83:15483+17 1B00 CDF600 call print_char
84:15500+7 1B03 3E08 ld a, 0x08
85:15507+17 1B05 CDF600 call print_char
86:15524+10 1B08 C3B61A jp COMMAND_READ
87: - 1B0B COMMAND_PROCESS:
88: ;compare
89:15534+10 1B0B 210F1A LD HL,[COMMAND_LUT] ;Lookup table
90: - 1B0E COMMAND_PROCESS_LOOP:
91:15544+10 1B0E 117F42 LD DE,[var_input] ;Buffer
92:15554+7 1B11 7E LD A,(HL) ;Load first byte of entry
93:15561+7 1B12 FEFF CP 0xFF
94:15568+10 1B14 CA3D1B JP Z,COMMAND_PROCESS_NOT_FOUND ;if first byte is 0xFF, End is reached
95: ; compare string loop
96: - 1B17 COMMAND_PROCESS_LOOP_STR1:
97:15578+7 1B17 1A LD A,(DE)
98:15585+4 1B18 47 LD B,A
99:15589+7 1B19 7E LD A,(HL)
100:15596+4 1B1A B0 OR B ;not 0 -> match
101:15600+10 1B1B CA461B JP Z, COMMAND_PROCESS_FOUND ;match
102:
103:15610+7 1B1E 1A LD A,(DE)
104:15617+4 1B1F 47 LD B,A
105: ;LD A,(HL) ;Load first byte of entry
106: ;call print_a_hex
107:15621+7 1B20 7E LD A,(HL)
108: ;compare byte
109:15628+4 1B21 A8 XOR B
110:15632+4 1B22 B7 OR A ;if identical = resoult shopuld be zero
111:15636+10 1B23 CA2D1B JP Z, COMMAND_PROCESS_LOOP_STR2 ;then continue
112: ; if not identical
113:15646+7 1B26 7E LD A,(HL)
114:15653+4 1B27 B7 OR A ;if reached end of compare string
115:15657+10 1B28 CA461B JP Z, COMMAND_PROCESS_FOUND ;match
116:15667+12 1B2B 1805 JR COMMAND_PROCESS_NEXT_ENTRY ;next entry on no match
117:
118: - 1B2D COMMAND_PROCESS_LOOP_STR2: ;continue with next char
119:15679+6 1B2D 23 INC HL
120:15685+6 1B2E 13 INC DE
121:15691+12 1B2F 18E6 JR COMMAND_PROCESS_LOOP_STR1
122:
123: - 1B31 COMMAND_PROCESS_NEXT_ENTRYI: ;do not jump here
124:15703+6 1B31 23 INC HL
125: - 1B32 COMMAND_PROCESS_NEXT_ENTRY: ;jump here
126:15709+7 1B32 7E LD A,(HL)
127:15716+4 1B33 B7 OR A
128:15720+10 1B34 C2311B JP NZ,COMMAND_PROCESS_NEXT_ENTRYI ;loop until end of string
129:15730+6 1B37 23 INC HL ;skip pointer
130:15736+6 1B38 23 INC HL
131:15742+6 1B39 23 INC HL
132:15748+10 1B3A C30E1B JP COMMAND_PROCESS_LOOP
133: - 1B3D COMMAND_PROCESS_NOT_FOUND:
134:15758+10 1B3D 21771B LD HL,[_STR_NOT_FOUND]
135:15768+17 1B40 CDFC00 CALL print_str
136:15785+10 1B43 C3A41A JP COMMAND
137:
138: - 1B46 COMMAND_PROCESS_FOUND:
139:15795+11 1B46 E5 PUSH HL
140:15806+10 1B47 C1 POP BC
141:15816+6 1B48 03 INC BC
142:15822+7 1B49 0A LD A,(BC)
143:15829+4 1B4A 6F LD L,A
144:15833+6 1B4B 03 INC BC
145:15839+7 1B4C 0A LD A,(BC)
146:15846+4 1B4D 67 LD H,A
147:
148: ;HL: pointer to start of routine
149: ;DE: buffer start of arguments
150:15850+17 1B4E CD541B CALL _COMMAND_PROCESS_FOUND
151:15867+10 1B51 C3A41A JP COMMAND
152: - 1B54 _COMMAND_PROCESS_FOUND
153:15877+4 1B54 E9 JP (HL)
154:
155:
156:
157: - 1B55 NOT_IMPLEMENTED:
158:15881+10 1B55 21631B LD HL,[_STR_NOT_IMPLEMENTED]
159:15891+17 1B58 CDFC00 CALL print_str
160:15908+10 1B5B C9 RET
161:
162: - 1B5C ERR_SYNTAX:
163:15918+10 1B5C 218B1B LD HL,[_STR_SYNTAX]
164:15928+17 1B5F CDFC00 CALL print_str
165:15945+10 1B62 C9 RET
166:
167: - 1B63 _STR_NOT_IMPLEMENTED:
168: - 1B63 0A0D6E6F db 10,13,"not implemented",10,13,0
7420696D
706C656D
656E7465
640A0D00
169:
170: - 1B77 _STR_NOT_FOUND:
171: - 1B77 0A0D696E db 10,13,"invalid command",10,13,0
76616C69
6420636F
6D6D616E
640A0D00
172:
173: - 1B8B _STR_SYNTAX:
**** main.asm ****
221: - 1B8B 0A0D696E db 10,13,"invalid syntax",10,13,0
76616C69
64207379
6E746178
0A0D00
222: .include "cmd_mem.s"
**** include/cmd_mem.s ****
1: - 1B9E OP_EXEC:
2: ;DE contains pointer
3:15955+11 1B9E D5 push DE
4:15966+10 1B9F E1 pop HL
5:15976+17 1BA0 CD5102 call DHEX_TO_BYTE
6:15993+4 1BA3 47 ld b,a ;store result in b
7:15997+4 1BA4 7B ld a,e ;check for error
8:16001+4 1BA5 A7 and a
9:16005+10 1BA6 C25C1B jp nz, ERR_SYNTAX
10:16015+6 1BA9 23 inc HL
11:16021+6 1BAA 23 inc HL
12:16027+17 1BAB CD5102 call DHEX_TO_BYTE
13:16044+4 1BAE 4F ld c,a
14:16048+4 1BAF 7B ld a,e ;check for error
15:16052+4 1BB0 A7 and a
16:16056+10 1BB1 C25C1B jp nz, ERR_SYNTAX
17:16066+4 1BB4 60 ld h,b
18:16070+4 1BB5 69 ld l,c
19:16074+4 1BB6 E9 jp (hl)
20: - 1BB7 OP_CALL:
21: ;DE contains pointer
22:16078+11 1BB7 D5 push DE
23:16089+10 1BB8 E1 pop HL
24:16099+17 1BB9 CD5102 call DHEX_TO_BYTE
25:16116+4 1BBC 47 ld b,a ;store result in b
26:16120+4 1BBD 7B ld a,e ;check for error
27:16124+4 1BBE A7 and a
28:16128+10 1BBF C25C1B jp nz, ERR_SYNTAX
29:16138+6 1BC2 23 inc HL
30:16144+6 1BC3 23 inc HL
31:16150+17 1BC4 CD5102 call DHEX_TO_BYTE
32:16167+4 1BC7 4F ld c,a
33:16171+4 1BC8 7B ld a,e ;check for error
34:16175+4 1BC9 A7 and a
35:16179+10 1BCA C25C1B jp nz, ERR_SYNTAX
36:16189+4 1BCD 60 ld h,b
37:16193+4 1BCE 69 ld l,c
38:16197+17 1BCF CDD61B call _OP_CALL
39:16214+17 1BD2 CD0C01 call print_newLine
40:16231+10 1BD5 C9 ret
41: - 1BD6 _OP_CALL
42:16241+4 1BD6 E9 jp (hl)
43:
44: - 1BD7 OP_DUMP:
45: ;DE contains pointer
46:16245+11 1BD7 D5 push DE
47:16256+10 1BD8 E1 pop HL
48:16266+17 1BD9 CD5102 call DHEX_TO_BYTE ;parse start address
49:16283+4 1BDC 47 ld b,a ;store result in b
50:16287+4 1BDD 7B ld a,e ;check for error
51:16291+4 1BDE A7 and a
52:16295+10 1BDF C25C1B jp nz, ERR_SYNTAX
53:16305+6 1BE2 23 inc HL
54:16311+6 1BE3 23 inc HL
55:16317+17 1BE4 CD5102 call DHEX_TO_BYTE
56:16334+4 1BE7 4F ld c,a
57:16338+4 1BE8 7B ld a,e ;check for error
58:16342+4 1BE9 A7 and a
59:16346+10 1BEA C25C1B jp nz, ERR_SYNTAX
60:16356+6 1BED 23 inc HL
61:16362+6 1BEE 23 inc HL
62:16368+7 1BEF 7E ld a,(HL)
63:16375+7 1BF0 FE20 cp ' '
64:16382+10 1BF2 C25C1B jp nz, ERR_SYNTAX
65:16392+6 1BF5 23 inc HL
66:16398+17 1BF6 CD5102 call DHEX_TO_BYTE
67:16415+11 1BF9 F5 push af
68:16426+4 1BFA 7B ld a,e ;check for error
69:16430+4 1BFB A7 and a
70:16434+10 1BFC C25C1B jp nz, ERR_SYNTAX
71:16444+10 1BFF F1 pop af
72:
73:16454+4 1C00 60 ld h,b
74:16458+4 1C01 69 ld l,c
75:16462+4 1C02 47 ld b,a
76:
77:16466+17 1C03 CD6D19 call dump_pretty
78:16483+10 1C06 C9 ret
79:
80: - 1C07 OP_SET:
81: ;DE contains pointer
82:16493+11 1C07 D5 push DE
83:16504+10 1C08 E1 pop HL
84:16514+17 1C09 CD5102 call DHEX_TO_BYTE ;parse start address
85:16531+4 1C0C 47 ld b,a ;store result in b
86:16535+4 1C0D 7B ld a,e ;check for error
87:16539+4 1C0E A7 and a
88:16543+10 1C0F C25C1B jp nz, ERR_SYNTAX
89:16553+6 1C12 23 inc HL
90:16559+6 1C13 23 inc HL
91:16565+17 1C14 CD5102 call DHEX_TO_BYTE
92:16582+4 1C17 4F ld c,a
93:16586+4 1C18 7B ld a,e ;check for error
94:16590+4 1C19 A7 and a
95:16594+10 1C1A C25C1B jp nz, ERR_SYNTAX
96: ;bc now contains the start address
97:16604+6 1C1D 23 INC HL
98:16610+6 1C1E 23 INC HL
99: ;hl now cointains start addr of data bytes
100: - 1C1F _OP_SET_LOOP:
101:16616+7 1C1F 7E ld a,(hl)
102:16623+7 1C20 FE00 cp 0 ;if 0 then end
103:16630+5+6 1C22 C8 RET Z
104:16635+7 1C23 FE20 cp ' '
105:16642+10 1C25 C25C1B jp nz, ERR_SYNTAX
106:16652+6 1C28 23 inc hl ;next byte
107:16658+17 1C29 CD5102 call DHEX_TO_BYTE
108:16675+7 1C2C 02 ld (bc),a ;load byte to
109:16682+4 1C2D 7B ld a,e
110:16686+4 1C2E A7 and a
111:16690+10 1C2F C25C1B jp nz, ERR_SYNTAX
112:16700+6 1C32 03 inc bc
113:16706+6 1C33 23 inc hl
114:16712+6 1C34 23 inc hl
115:16718+10 1C35 C31F1C jp _OP_SET_LOOP
116:
117: - 1C38 OP_DASM:
118:16728+11 1C38 D5 push DE
119:16739+10 1C39 E1 pop HL
120:16749+17 1C3A CD5102 call DHEX_TO_BYTE
121:16766+4 1C3D 47 ld b,a ;store result in b
122:16770+4 1C3E 7B ld a,e ;check for error
123:16774+4 1C3F A7 and a
124:16778+10 1C40 C25C1B jp nz, ERR_SYNTAX
125:16788+6 1C43 23 inc hl
126:16794+6 1C44 23 inc hl
127:16800+17 1C45 CD5102 call DHEX_TO_BYTE
128:16817+4 1C48 4F ld c,a
129:16821+4 1C49 7B ld a,e ;check for error
130:16825+4 1C4A A7 and a
131:16829+10 1C4B C25C1B jp nz, ERR_SYNTAX
132:16839+6 1C4E 23 inc hl
133:16845+6 1C4F 23 inc hl
134:16851+7 1C50 7E ld a,(HL)
135:16858+7 1C51 FE20 cp ' '
136:16865+10 1C53 C25C1B jp nz, ERR_SYNTAX
137:16875+6 1C56 23 inc hl
138:16881+17 1C57 CD5102 call DHEX_TO_BYTE
139:16898+11 1C5A F5 push af
140:16909+4 1C5B 7B ld a,e ;check for error
141:16913+4 1C5C A7 and a
142:16917+10 1C5D C25C1B jp nz, ERR_SYNTAX
143:16927+4 1C60 60 ld h,b
144:16931+4 1C61 69 ld l,c
145:16935+10 1C62 F1 pop af ;restore af
146:16945+4 1C63 47 ld b,a
147:16949+17 1C64 CDA202 call disassemble
**** main.asm ****
223:16966+10 1C67 C9 ret
224: .include "cmd_io.s"
**** include/cmd_io.s ****
1: - 1C68 OP_IO_IN:
2:16976+11 1C68 D5 push DE
3:16987+10 1C69 E1 pop HL
4:16997+17 1C6A CD5102 call DHEX_TO_BYTE
5:17014+4 1C6D 4F ld c,a ;store result in b
6:17018+4 1C6E 7B ld a,e ;check for error
7:17022+4 1C6F A7 and a
8:17026+10 1C70 C25C1B jp nz, ERR_SYNTAX
9:17036+12 1C73 ED78 in a,(c)
10:17048+11 1C75 F5 push af
11:17059+17 1C76 CD0C01 call print_newLine
12:17076+10 1C79 F1 pop af
13:17086+17 1C7A CD2201 call print_a_hex
14:17103+10 1C7D C9 ret
15:
16: - 1C7E OP_IO_OUT:
17:17113+11 1C7E D5 push DE
18:17124+10 1C7F E1 pop HL
19:17134+17 1C80 CD5102 call DHEX_TO_BYTE
20:17151+4 1C83 4F ld c,a ;store result in b
21:17155+4 1C84 7B ld a,e ;check for error
22:17159+4 1C85 A7 and a
23:17163+10 1C86 C25C1B jp nz, ERR_SYNTAX
24:17173+6 1C89 23 inc hl
25:17179+6 1C8A 23 inc hl
26:17185+7 1C8B 7E ld a,(hl)
27:17192+7 1C8C FE20 cp ' '
28:17199+10 1C8E C25C1B jp nz, ERR_SYNTAX
29:17209+6 1C91 23 inc hl
30:17215+17 1C92 CD5102 call DHEX_TO_BYTE
31:17232+11 1C95 F5 push af
32:17243+4 1C96 7B ld a,e ;check for error
33:17247+4 1C97 A7 and a
34:17251+10 1C98 C25C1B jp nz, ERR_SYNTAX
35:17261+10 1C9B F1 pop af
36:17271+12 1C9C ED79 out (c),a
37:17283+10 1C9E C9 ret
38:
39: - 1C9F OP_IIC_OUT:
40:17293+11 1C9F D5 push DE
41:17304+10 1CA0 E1 pop HL
42:17314+17 1CA1 CD5102 call DHEX_TO_BYTE ;load start addr
43:17331+13 1CA4 321042 ld (var_scratch+1),A ;store result in ram
44:17344+4 1CA7 7B ld a,e ;check for error
45:17348+4 1CA8 A7 and a
46:17352+10 1CA9 C25C1B jp nz, ERR_SYNTAX
47:17362+6 1CAC 23 inc hl
48:17368+6 1CAD 23 inc hl
49:17374+10 1CAE 011142 LD BC,[var_scratch + 2]
50:17384+4 1CB1 AF XOR A
51:17388+13 1CB2 320F42 LD (var_scratch),A
52: - 1CB5 _OP_IIC_OUT_LOOP:
53:17401+7 1CB5 7E ld a,(hl)
54:17408+7 1CB6 FE00 cp 0 ;if 0 then end
55:17415+10 1CB8 CAD11C jp z,_OP_IIC_OUT_SEND
56:17425+7 1CBB FE20 cp ' '
57:17432+10 1CBD C25C1B jp nz, ERR_SYNTAX
58:17442+6 1CC0 23 inc hl ;next byte
59:
60:17448+17 1CC1 CD5102 call DHEX_TO_BYTE
61:17465+7 1CC4 02 ld (bc),a
62:17472+6 1CC5 03 inc bc ;incerement pointer
63:17478+13 1CC6 3A0F42 ld a,(var_scratch)
64:17491+4 1CC9 3C inc a ;increment counter
65:17495+13 1CCA 320F42 ld (var_scratch),a
66:17508+6 1CCD 23 inc HL
67:17514+6 1CCE 23 inc HL
68:17520+12 1CCF 18E4 jr _OP_IIC_OUT_LOOP
69: - 1CD1 _OP_IIC_OUT_SEND:
70:17532+10 1CD1 211142 ld hl,[var_scratch + 2]
71:17542+13 1CD4 3A0F42 ld a,(var_scratch) ;load amount of bytes
72:17555+4 1CD7 47 ld b,a
73:17559+13 1CD8 3A1042 ld a,(var_scratch+1) ;load start addr
74:17572+4 1CDB 4F ld c,a
75:17576+17 1CDC CDE116 call iic_send_buffer
76:17593+4 1CDF B7 or a
77:17597+10 1CE0 C2E41C jp nz, _OP_IIC_ACK_ERR
78:17607+10 1CE3 C9 ret
79:
80: - 1CE4 _OP_IIC_ACK_ERR:
81:17617+10 1CE4 21EB1C LD HL,[_OP_IIC_ACK_ERR_str]
82:17627+17 1CE7 CDFC00 call print_str
83:17644+10 1CEA C9 ret
84: - 1CEB _OP_IIC_ACK_ERR_str:
85: - 1CEB 0A0D6275 db 10,13,"bus-error: no ACK",0
732D6572
726F723A
206E6F20
41434B00
86:
87: - 1CFF OP_IIC_IN:
88:17654+11 1CFF D5 push DE
89:17665+10 1D00 E1 pop HL
90:17675+17 1D01 CD5102 call DHEX_TO_BYTE ;load start addr
91:17692+4 1D04 4F ld C,a ;store start addr to B
92:17696+4 1D05 7B ld a,e ;check for error
93:17700+4 1D06 A7 and a
94:17704+10 1D07 C25C1B jp nz, ERR_SYNTAX
95:17714+6 1D0A 23 inc hl
96:17720+6 1D0B 23 inc hl
97:17726+7 1D0C 7E ld a,(hl)
98:17733+7 1D0D FE20 cp ' '
99:17740+10 1D0F C25C1B jp nz, ERR_SYNTAX
100:17750+6 1D12 23 inc hl
101:17756+17 1D13 CD5102 call DHEX_TO_BYTE ;read length
102:17773+4 1D16 47 ld b,a ;store length in B
103:17777+11 1D17 C5 push bc
104:17788+4 1D18 7B ld a,e ;check for error
105:17792+4 1D19 A7 and a
106:17796+10 1D1A C25C1B jp nz, ERR_SYNTAX
107:17806+10 1D1D 210F42 ld hl,[var_scratch]
108:17816+17 1D20 CD0B17 call iic_receive_buffer
109:17833+10 1D23 C1 pop bc
110:17843+4 1D24 B7 or a
111:17847+10 1D25 C2E41C jp nz, _OP_IIC_ACK_ERR
112:17857+10 1D28 213E1D ld hl,[_OP_IIC_IN_LOOP_TEXT]
113:17867+17 1D2B CDFC00 call print_str
114:17884+10 1D2E 210F42 ld hl,[var_scratch]
115: ;print data
116: - 1D31 _OP_IIC_IN_LOOP:
117:17894+7 1D31 7E ld a,(hl)
118:17901+17 1D32 CD2201 call print_a_hex
119:17918+7 1D35 3E20 ld a, ' '
120:17925+17 1D37 CDF600 call print_char
121:17942+6 1D3A 23 inc hl
122:17948+8+5 1D3B 10F4 djnz _OP_IIC_IN_LOOP
123:17956+10 1D3D C9 ret
124:
125: - 1D3E _OP_IIC_IN_LOOP_TEXT:
126: - 1D3E 0A0D7265 db 10,13,"rec-buff: ",0
632D6275
66663A20
00
127:
128: - 1D4B OP_CLR:
129:17966+17 1D4B CD0501 call print_clear
**** main.asm ****
225:17983+10 1D4E C9 ret
226: .include "cmd_date.s"
**** include/cmd_date.s ****
1: - 00D0 ADDR_RTC .equ 0xD0
2:
3: - 1D4F OP_RTIME:
4:17993+17 1D4F CD0C01 call print_newLine
5: - 1D52 _OP_RTIME_NN:
6: ;set pointer
7:18010+10 1D52 210A1E ld hl,[_OP_RTIME_RD_CMD]
8:18020+7 1D55 0601 ld b, 1
9:18027+7 1D57 0ED0 ld c, ADDR_RTC
10:18034+17 1D59 CDE116 call iic_send_buffer
11:18051+4 1D5C B7 or a
12:18055+10 1D5D C2E41C jp nz, _OP_IIC_ACK_ERR
13: ;read RTC data
14:18065+10 1D60 210F42 ld hl,[var_scratch]
15:18075+7 1D63 0608 ld b,8
16:18082+7 1D65 0ED0 ld c, ADDR_RTC
17:18089+17 1D67 CD0B17 call iic_receive_buffer
18:18106+4 1D6A B7 or a
19:18110+10 1D6B C2E41C jp nz, _OP_IIC_ACK_ERR
20: ;process display hours
21:18120+13 1D6E 3A1142 ld a,(var_scratch+2)
22:18133+7 1D71 E630 and 00110000b
23:18140+4 1D73 1F RRA
24:18144+4 1D74 1F RRA
25:18148+4 1D75 1F RRA
26:18152+4 1D76 1F RRA
27:18156+17 1D77 CD3401 call print_bcd
28:18173+13 1D7A 3A1142 ld a,(var_scratch+2)
29:18186+7 1D7D E60F and 00001111b
30:18193+17 1D7F CD3401 call print_bcd
31:18210+7 1D82 3E3A ld a,':'
32:18217+17 1D84 CDF600 call print_char
33: ;display minutes
34:18234+13 1D87 3A1042 ld a,(var_scratch+1)
35:18247+7 1D8A E670 and 01110000b
36:18254+4 1D8C 1F RRA
37:18258+4 1D8D 1F RRA
38:18262+4 1D8E 1F RRA
39:18266+4 1D8F 1F RRA
40:18270+17 1D90 CD3401 call print_bcd
41:18287+13 1D93 3A1042 ld a,(var_scratch+1)
42:18300+7 1D96 E60F and 00001111b
43:18307+17 1D98 CD3401 call print_bcd
44:18324+7 1D9B 3E3A ld a,':'
45:18331+17 1D9D CDF600 call print_char
46: ;display seconds
47:18348+13 1DA0 3A0F42 ld a,(var_scratch+0)
48:18361+7 1DA3 E670 and 01110000b
49:18368+4 1DA5 1F RRA
50:18372+4 1DA6 1F RRA
51:18376+4 1DA7 1F RRA
52:18380+4 1DA8 1F RRA
53:18384+17 1DA9 CD3401 call print_bcd
54:18401+13 1DAC 3A0F42 ld a,(var_scratch+0)
55:18414+7 1DAF E60F and 00001111b
56:18421+17 1DB1 CD3401 call print_bcd
57:18438+7 1DB4 3E20 ld a,' '
58:18445+17 1DB6 CDF600 call print_char
59: ;display date
60:18462+13 1DB9 3A1342 ld a,(var_scratch+4)
61:18475+7 1DBC E630 and 00110000b
62:18482+4 1DBE 1F RRA
63:18486+4 1DBF 1F RRA
64:18490+4 1DC0 1F RRA
65:18494+4 1DC1 1F RRA
66:18498+17 1DC2 CD3401 call print_bcd
67:18515+13 1DC5 3A1342 ld a,(var_scratch+4)
68:18528+7 1DC8 E60F and 00001111b
69:18535+17 1DCA CD3401 call print_bcd
70:18552+7 1DCD 3E2E ld a,'.'
71:18559+17 1DCF CDF600 call print_char
72:18576+13 1DD2 3A1442 ld a,(var_scratch+5)
73:18589+7 1DD5 E610 and 00010000b
74:18596+4 1DD7 1F RRA
75:18600+4 1DD8 1F RRA
76:18604+4 1DD9 1F RRA
77:18608+4 1DDA 1F RRA
78:18612+17 1DDB CD3401 call print_bcd
79:18629+13 1DDE 3A1442 ld a,(var_scratch+5)
80:18642+7 1DE1 E60F and 00001111b
81:18649+17 1DE3 CD3401 call print_bcd
82:18666+7 1DE6 3E2E ld a,'.'
83:18673+17 1DE8 CDF600 call print_char
84:18690+7 1DEB 3E32 ld a,'2'
85:18697+17 1DED CDF600 call print_char
86:18714+7 1DF0 3E30 ld a,'0'
87:18721+17 1DF2 CDF600 call print_char
88:18738+13 1DF5 3A1542 ld a,(var_scratch+6)
89:18751+7 1DF8 E6F0 and 11110000b
90:18758+4 1DFA 1F RRA
91:18762+4 1DFB 1F RRA
92:18766+4 1DFC 1F RRA
93:18770+4 1DFD 1F RRA
94:18774+17 1DFE CD3401 call print_bcd
95:18791+13 1E01 3A1542 ld a,(var_scratch+6)
96:18804+7 1E04 E60F and 00001111b
97:18811+17 1E06 CD3401 call print_bcd
98:
99:18828+10 1E09 C9 RET
100: - 1E0A _OP_RTIME_RD_CMD:
101: - 1E0A 00 db 0x00
102:
103: - 1E0B 0A0D456E _OP_STIME_STR_DAY: db 10,13,"Enter Date (00-31) : ",0
74657220
44617465
20202020
2830302D
33312920
3A2000
104: - 1E26 0A0D456E _OP_STIME_STR_MON: db 10,13,"Enter Month (00-12) : ",0
74657220
4D6F6E74
68202020
2830302D
31322920
3A2000
105: - 1E41 0A0D456E _OP_STIME_STR_YEAR: db 10,13,"Enter Year (00-99) : ",0
74657220
59656172
20202020
2830302D
39392920
3A2000
106: - 1E5C 0A0D456E _OP_STIME_STR_HOUR: db 10,13,"Enter Hours (00-23) : ",0
74657220
486F7572
73202020
2830302D
32332920
3A2000
107: - 1E77 0A0D456E _OP_STIME_STR_MIN: db 10,13,"Enter Minutes (00-59) : ",0
74657220
4D696E75
74657320
2830302D
35392920
3A2000
108: - 1E92 0A0D456E _OP_STIME_STR_SEC: db 10,13,"Enter Seconds (00-59) : ",0
74657220
5365636F
6E647320
2830302D
35392920
3A2000
109: - 1EAD 20696E76 _OP_STIME_INVALID: db " invaild input. Retry!",0
61696C64
20696E70
75742E20
52657472
792100
110: ;HL contains pointer to stack
111: ;BC returns value (BCD)
112: - 1EC4 _OP_STIME_PROMPT:
113:18838+11 1EC4 E5 push hl
114:18849+17 1EC5 CDFC00 call print_str
115:18866+10 1EC8 E1 pop hl
116:18876+17 1EC9 CD4F01 call read_bcd
117:18893+7 1ECC FEFF cp 0xFF ;if failed
118:18900+10 1ECE CADC1E jp Z, _OP_STIME_PROMPT_ERR
119:18910+4 1ED1 47 ld b,a
120:18914+17 1ED2 CD4F01 call read_bcd
121:18931+7 1ED5 FEFF cp 0xFF ;if failed
122:18938+10 1ED7 CADC1E jp Z, _OP_STIME_PROMPT_ERR
123:18948+4 1EDA 4F ld c,a
124:18952+10 1EDB C9 ret
125: - 1EDC _OP_STIME_PROMPT_ERR:
126:18962+11 1EDC E5 push HL
127:18973+10 1EDD 21AD1E ld hl, [_OP_STIME_INVALID]
128:18983+17 1EE0 CDFC00 call print_str
129:19000+10 1EE3 E1 pop hl
130:19010+10 1EE4 C3C41E jp _OP_STIME_PROMPT
131:
132:
133:
134: - 1EE7 OP_STIME:
135:19020+4 1EE7 AF xor a
136:19024+13 1EE8 320F42 ld (var_scratch),a ;set pointer
137: ;date
138:19037+10 1EEB 210B1E ld hl, [_OP_STIME_STR_DAY]
139:19047+17 1EEE CDC41E call _OP_STIME_PROMPT
140:19064+4 1EF1 78 ld a,b
141:19068+17 1EF2 CD5B1F call _shift4
142:19085+7 1EF5 E630 and 00110000b ;mask bits; bit6 low -> 24h mode
143:19092+4 1EF7 B1 or c ;add second digit
144:19096+13 1EF8 321442 ld (var_scratch+5),a
145: ;month
146:19109+10 1EFB 21261E ld hl, [_OP_STIME_STR_MON]
147:19119+17 1EFE CDC41E call _OP_STIME_PROMPT
148:19136+4 1F01 78 ld a,b
149:19140+17 1F02 CD5B1F call _shift4
150:19157+7 1F05 E610 and 00010000b ;mask bits; bit6 low -> 24h mode
151:19164+4 1F07 B1 or c ;add second digit
152:19168+13 1F08 321542 ld (var_scratch+6),a
153: ;year
154:19181+10 1F0B 21411E ld hl, [_OP_STIME_STR_YEAR]
155:19191+17 1F0E CDC41E call _OP_STIME_PROMPT
156:19208+4 1F11 78 ld a,b
157:19212+17 1F12 CD5B1F call _shift4
158:19229+7 1F15 E6F0 and 11110000b ;mask bits; bit6 low -> 24h mode
159:19236+4 1F17 B1 or c ;add second digit
160:19240+13 1F18 321642 ld (var_scratch+7),a
161: ;hours
162:19253+10 1F1B 215C1E ld hl, [_OP_STIME_STR_HOUR]
163:19263+17 1F1E CDC41E call _OP_STIME_PROMPT
164:19280+4 1F21 78 ld a,b
165:19284+17 1F22 CD5B1F call _shift4
166:19301+7 1F25 E630 and 00110000b ;mask bits; bit6 low -> 24h mode
167:19308+4 1F27 B1 or c ;add second digit
168:19312+13 1F28 321242 ld (var_scratch+3),a
169: ; minutes
170:19325+10 1F2B 21771E ld hl, [_OP_STIME_STR_MIN]
171:19335+17 1F2E CDC41E call _OP_STIME_PROMPT
172:19352+4 1F31 78 ld a,b
173:19356+17 1F32 CD5B1F call _shift4
174:19373+7 1F35 E670 and 01110000b ;mask bits
175:19380+4 1F37 B1 or c ;add second digit
176:19384+13 1F38 321142 ld (var_scratch+2),a
177: ; seconds
178:19397+10 1F3B 21921E ld hl, [_OP_STIME_STR_SEC]
179:19407+17 1F3E CDC41E call _OP_STIME_PROMPT
180:19424+4 1F41 78 ld a,b
181:19428+17 1F42 CD5B1F call _shift4
182:19445+7 1F45 E670 and 01110000b ;mask bits / bit6 low -> 24h mode (enable clock)
183:19452+4 1F47 B1 or c ;add second digit
184:19456+13 1F48 321042 ld (var_scratch+1),a
185:19469+6 1F4B 13 inc de ;next
186:
187:19475+7 1F4C 0ED0 ld c, ADDR_RTC
188:19482+7 1F4E 0608 ld b, 8
189:19489+10 1F50 210F42 ld hl,[var_scratch]
190:19499+17 1F53 CDE116 call iic_send_buffer
191:19516+4 1F56 B7 or a
192:19520+10 1F57 C2E41C jp nz, _OP_IIC_ACK_ERR
193:
194:19530+10 1F5A C9 ret
195:
196: - 1F5B _shift4:
197:19540+4 1F5B 07 RLCA
198:19544+4 1F5C 07 RLCA
199:19548+4 1F5D 07 RLCA
200:19552+4 1F5E 07 RLCA
**** main.asm ****
227:19556+10 1F5F C9 ret
228: .include "cmd_disk.s"
**** include/cmd_disk.s ****
1: - 1F60 OP_LSDSK:
2:19566+17 1F60 CD8313 call ideif_prnt_devtable
3:19583+10 1F63 C9 ret
4:
5: - 1F64 OP_SELDSK:
6: ;DE contains pointer
7:19593+11 1F64 D5 push de
8:19604+10 1F65 E1 pop hl
9:19614+7 1F66 7E ld a,(hl)
10:19621+7 1F67 DE45 sbc 69
11:19628+7+5 1F69 3808 jr c,_OP_SELDSK_INVALID
12:19635+7 1F6B FE04 cp 4
13:19642+7+5 1F6D 3004 jr nc, _OP_SELDSK_INVALID
14:19649+17 1F6F CDB815 call ideif_drv_sel
15:19666+10 1F72 C9 ret
16:
17: - 1F73 _OP_SELDSK_INVALID:
18:19676+10 1F73 218B1F ld hl,[_OP_SELDSK_INVALID_STR]
19:19686+17 1F76 CDFC00 call print_str
20:19703+10 1F79 112000 LD DE,0x20
21:19713+10 1F7C 017000 LD BC,0x70
22:19723+17 1F7F CD040E CALL beep
23:19740+10 1F82 C9 ret
24:
25: - 1F83 OP_DIR:
26:19750+17 1F83 CDE224 CALL fat_print_directory
27:19767+10 1F86 C9 ret
28:
29: - 1F87 OP_CD:
30:19777+17 1F87 CDFB25 call fat_cd_single
31:19794+10 1F8A C9 ret
32:
33: - 1F8B _OP_SELDSK_INVALID_STR:
34: - 1F8B 0A0D496E db 10,13,"Invalid drive letter",10,13,0
76616C69
64206472
69766520
6C657474
65720A0D
00
35:
36: - 1FA4 OP_FSEXEC:
37:19804+17 1FA4 CD1627 call fat_exec
**** main.asm ****
229:19821+10 1FA7 C9 ret
230: .include "post.s"
**** include/post.s ****
1: ;Power-On self test
2: - 1FA8 POST_START:
3:19831+17 1FA8 CDB81F call POST_CHECK_PIO
4:19848+17 1FAB CDDD1F call POST_CHECK_APU
5:19865+17 1FAE CD3520 call POST_TEST_RTC
6:19882+17 1FB1 CD0820 call POST_CHECK_IDE_30
7:19899+17 1FB4 CD1B20 call POST_CHECK_IDE_40
8:19916+10 1FB7 C9 ret
9:
10: - 1FB8 POST_CHECK_PIO:
11:19926+10 1FB8 21AC20 ld hl,[str_post_pio]
12:19936+17 1FBB CDFC00 call print_str
13:19953+11 1FBE DBF6 in a,(CS_PIO_AC) ;test read from pio
14:19964+7 1FC0 FE00 cp 0x00 ;0x78 when not installed
15:19971+10 1FC2 C2D11F jp nz, _POST_CHECK_PIO_FAILED
16:19981+7 1FC5 3E00 ld a, 0x00 ;set present flag
17:19988+13 1FC7 320D42 ld (var_pio_present),a
18:20001+10 1FCA 213521 ld hl,[str_post_ok]
19:20011+17 1FCD CDFC00 call print_str
20:20028+10 1FD0 C9 ret
21: - 1FD1 _POST_CHECK_PIO_FAILED:
22:20038+7 1FD1 3EFF ld a, 0xFF
23:20045+13 1FD3 320D42 ld (var_pio_present),a
24:20058+10 1FD6 21FD20 ld hl,[str_post_nd]
25:20068+17 1FD9 CDFC00 call print_str
26:20085+10 1FDC C9 ret
27:
28: - 1FDD POST_CHECK_APU:
29:20095+10 1FDD 21C720 ld hl,[str_post_apu]
30:20105+17 1FE0 CDFC00 call print_str
31:
32:20122+7 1FE3 3EFF ld a, 0xFF
33:20129+11 1FE5 D3F8 out (CS_APU_DATA),a
34:20140+4 1FE7 00 nop
35:20144+4 1FE8 00 nop
36:20148+11 1FE9 DBF8 in a,(CS_APU_DATA)
37:20159+7 1FEB FEFF cp 0xFF
38:20166+10 1FED C2FC1F jp nz, _POST_CHECK_APU_FAILED
39:20176+7 1FF0 3E00 ld a, 0x00 ;set present flag
40:20183+13 1FF2 320E42 ld (var_apu_present),a
41:20196+10 1FF5 213521 ld hl,[str_post_ok]
42:20206+17 1FF8 CDFC00 call print_str
43:20223+10 1FFB C9 ret
44: - 1FFC _POST_CHECK_APU_FAILED:
45:20233+7 1FFC 3EFF ld a, 0xFF
46:20240+13 1FFE 320E42 ld (var_apu_present),a
47:20253+10 2001 21FD20 ld hl,[str_post_nd]
48:20263+17 2004 CDFC00 call print_str
49:20280+10 2007 C9 ret
50:
51: - 2008 POST_CHECK_IDE_30:
52:20290+10 2008 217620 ld hl,[str_post_ide_30]
53:20300+17 200B CDFC00 call print_str
54:20317+11 200E DB30 in a,(0x30)
55:20328+4 2010 B7 or a
56:20332+10 2011 C22E20 jp nz, _POST_CHECK_IDE_FAILED
57:20342+10 2014 213521 ld hl,[str_post_ok]
58:20352+17 2017 CDFC00 call print_str
59:20369+10 201A C9 ret
60: - 201B POST_CHECK_IDE_40:
61:20379+10 201B 219120 ld hl,[str_post_ide_40]
62:20389+17 201E CDFC00 call print_str
63:20406+11 2021 DB40 in a,(0x40)
64:20417+4 2023 B7 or a
65:20421+10 2024 C22E20 jp nz, _POST_CHECK_IDE_FAILED
66:20431+10 2027 213521 ld hl,[str_post_ok]
67:20441+17 202A CDFC00 call print_str
68:20458+10 202D C9 ret
69:
70: - 202E _POST_CHECK_IDE_FAILED
71:20468+10 202E 21FD20 ld hl,[str_post_nd]
72:20478+17 2031 CDFC00 call print_str
73:20495+10 2034 C9 ret
74:
75: - 2035 POST_TEST_RTC:
76:20505+7 2035 3E06 ld a, 0x06
77:20512+13 2037 320F42 ld (var_scratch),a
78:20525+10 203A 21E220 ld hl,[str_post_rtc]
79:20535+17 203D CDFC00 call print_str
80:20552+10 2040 210F42 ld hl,[var_scratch]
81:20562+7 2043 0601 ld b, 1
82:20569+7 2045 0ED0 ld c, ADDR_RTC
83:20576+17 2047 CDE116 call iic_send_buffer
84:20593+4 204A B7 or a
85:20597+10 204B C26820 jp nz, _POST_TEST_RTC_NOTFOUND
86:20607+10 204E 210F42 ld hl,[var_scratch]
87:20617+7 2051 0601 ld b, 1
88:20624+7 2053 0ED0 ld c, ADDR_RTC
89:20631+17 2055 CD0B17 call iic_receive_buffer
90:20648+13 2058 3A0F42 ld a, (var_scratch)
91:20661+4 205B B7 or a
92:20665+10 205C CA6F20 jp z, _POST_TEST_RTC_INVALID
93:20675+10 205F 213521 ld hl,[str_post_ok]
94:20685+17 2062 CDFC00 call print_str
95:20702+10 2065 C3521D jp _OP_RTIME_NN
96: - 2068 _POST_TEST_RTC_NOTFOUND:
97:20712+10 2068 21FD20 ld hl,[str_post_nd]
98:20722+17 206B CDFC00 call print_str
99:20739+10 206E C9 ret
100: - 206F _POST_TEST_RTC_INVALID:
101:20749+10 206F 210B21 ld hl,[str_post_rtc_iv]
102:20759+17 2072 CDFC00 call print_str
103:20776+10 2075 C9 ret
104:
105: - 2076 str_post_ide_30:
106: - 2076 0D0A4368 db 13,10,"Check Diskctrl.@030h... ",0
65636B20
4469736B
6374726C
2E403033
30682E2E
2E2000
107: - 2091 str_post_ide_40:
108: - 2091 0D0A4368 db 13,10,"Check Diskctrl.@040h... ",0
65636B20
4469736B
6374726C
2E403034
30682E2E
2E2000
109: - 20AC str_post_pio:
110: - 20AC 0D0A4368 db 13,10,"Check IO-Controller ... ",0
65636B20
494F2D43
6F6E7472
6F6C6C65
72202E2E
2E2000
111: - 20C7 str_post_apu:
112: - 20C7 0D0A4368 db 13,10,"Check AMD8911 APU ... ",0
65636B20
414D4438
39313120
41505520
20202E2E
2E2000
113: - 20E2 str_post_rtc:
114: - 20E2 0D0A4368 db 13,10,"Check DS1307 RTC ... ",0
65636B20
44533133
30372052
54432020
20202E2E
2E2000
115: - 20FD str_post_nd:
116: - 20FD 6E6F7420 db "not detected!",0
64657465
63746564
2100
117: - 210B str_post_rtc_iv:
118: - 210B 6E6F7420 db "not set. Check battery and run 'setdate'!",0
7365742E
20436865
636B2062
61747465
72792061
6E642072
756E2027
73657464
61746527
2100
119: - 2135 str_post_ok:
**** main.asm ****
231: - 2135 6F6B2120 db "ok! ",0
00
232: .include "fat16.s"
**** include/fat16.s ****
1: ; VARS
2:
3: - 45BA phase MEM_IDE_FSBUFFER
4: - 45BA MEM_FAT_RESERVED: ; Reserved sectors (2byte)
5: - 45BA ..45BB 00 defs 2
6: - 45BC MEM_FAT_AMOUNT: ; Amount of FATs (1byte)
7: - 45BC ..45BC 00 defs 1
8: - 45BD MEM_FAT_SECTORS: ; Length of FAT (2byte)
9: - 45BD ..45BE 00 defs 2
10: - 45BF MEM_FAT_CLUSTERLEN: ; Length of Cluster (1byte)
11: - 45BF ..45BF 00 defs 1
12: - 45C0 MEM_FAT_COUNT1: ; Counter Var for reading FAT (2byte)
13: - 45C0 ..45C0 00 defs 1
14: - 45C1 MEM_FAT_TMPPOINTER: ; Temporary working pointer
15: - 45C1 ..45C4 00 defs 4
16: - 45C5 MEM_FAT_DATASTART: ; Start of data area
17: - 45C5 ..45C8 00 defs 4
18: - 45C9 MEM_FAT_ROOTSTART: ; Start of Root directory
19: - 45C9 ..45CC 00 defs 4
20: - 45CD MEM_FAT_FILEREMAIN: ; Remaining sectors in file
21: - 45CD ..45D0 00 defs 4
22: - 45D1 MEM_FAT_DIRSEC: ; Sectors per directory
23: - 45D1 ..45D2 00 defs 2
24: - 45D3 MEM_FAT_TMPFNAME: ; Temporary filename
25: - 45D3 ..45E2 00 defs 16
26: - 45E3 MEM_FAT_CURDIR: ; Current Directory
27: - 45E3 ..4632 00 defs 80
28: - 4633 MEM_FAT_OF0_ATTRIBUTE: ;Current file attribute
29: - 4633 0000 defw 0
30: - 4635 MEM_FAT_OF0_CCLUST: ;Current cluster of file
31: - 4635 0000 defw 0
32: - 4637 MEM_FAT_OF0_FATSEC: ;Current sector in FAT
33: - 4637 ..463A 00 defs 4
34: - 463B MEM_FAT_OF0_DATSEC: ;Current sector in Data
35: - 463B ..463E 00 defs 4
36: - 463F MEM_FAT_OF0_DATREM: ;Remaining bytes in Data
37: - 463F ..4642 00 defs 4
38: - 4643 MEM_FAT_CURRDIR: ;Current directory
39: - 4643 ..4646 00 defs 4
40: - 4647 MEM_FAT_EXEC_CURR:
41: - 4647 0000 defw 0
42: - 4649 MEM_FAT_EXEC_COUNT:
43: - 4649 0000 defw 0
44: - 464B MEM_FAT_EXEC_START:
45: - 464B 0000 defw 0
46:
47: - 21CD dephase
48:
49:
50:
51: ;-------------------------------------
52: ; Get FAT Root-Table position
53: ;-------------------------------------
54: - 21CD fat_get_root_table:
55:20786+17 21CD CD8E24 call fat_reset_pointer ;reset fat pointer
56:
57: ; Load first sector on active partition
58:20803+10 21D0 21D542 LD HL, MEM_IDE_POINTER ; pointer to LBA address
59:20813+7 21D3 3E01 LD A,1 ;read 1 sector
60:20820+10 21D5 11BA43 LD DE, MEM_IDE_BUFFER ;where to store data?
61:20830+17 21D8 CD7F15 call read_lba_sector
62:
63: ; check for valid Boot sector
64:20847+13 21DB 3ABA43 ld a,(MEM_IDE_BUFFER)
65:20860+7 21DE FEEB cp 0xEB ;first byte should be 0xEB
66:20867+10 21E0 C29A22 jp nz, _fat_get_root_table_invalid
67:
68: ; Read and store FS Properties
69:20877+14 21E3 DD21BA43 LD IX,MEM_IDE_BUFFER
70:20891+19 21E7 DD7E0D LD A,(IX+0x0D)
71:20910+13 21EA 32BF45 LD (MEM_FAT_CLUSTERLEN),A
72:20923+19 21ED DD7E0E LD A,(IX+0x0E)
73:20942+13 21F0 32BA45 LD (MEM_FAT_RESERVED),A
74:20955+19 21F3 DD7E0F LD A,(IX+0x0F)
75:20974+13 21F6 32BB45 LD (MEM_FAT_RESERVED+1),A
76:20987+19 21F9 DD7E10 LD A,(IX+0x10)
77:21006+13 21FC 32BC45 LD (MEM_FAT_AMOUNT),A
78:21019+19 21FF DD7E16 LD A,(IX+0x16)
79:21038+13 2202 32BD45 LD (MEM_FAT_SECTORS),A
80:21051+19 2205 DD7E17 LD A,(IX+0x17)
81:21070+13 2208 32BE45 LD (MEM_FAT_SECTORS+1),A
82:
83: ;Get Data Start Sector
84: ;calculate fat length
85:21083+20 220B ED4BBD45 ld bc,(MEM_FAT_SECTORS)
86:21103+13 220F 3ABC45 ld a,(MEM_FAT_AMOUNT) ;add fat to cluster number
87:21116+7 2212 1600 ld d,0
88:21123+4 2214 5F ld e,a
89:21127+17 2215 CD7524 call _fat_math_mul32
90: ; BCHL contains result -> store to PTR.MEM_FAT_ROOTSTART
91:21144+16 2218 22C945 ld (MEM_FAT_ROOTSTART+0),hl
92:21160+20 221B ED43CB45 ld (MEM_FAT_ROOTSTART+2),bc
93:
94: ;add offset (reserved sectors)
95:21180+16 221F 2AC843 ld hl,(MEM_IDE_BUFFER +0x0E) ; load sectors into hl
96:21196+16 2222 22C145 ld (MEM_FAT_TMPPOINTER), hl
97:21212+4 2225 AF xor a
98:21216+13 2226 32C345 ld (MEM_FAT_TMPPOINTER+2),a
99:21229+13 2229 32C445 ld (MEM_FAT_TMPPOINTER+3),a
100:
101:21242+10 222C 01C945 ld bc,[MEM_FAT_ROOTSTART]
102:21252+10 222F 11C145 ld de,[MEM_FAT_TMPPOINTER]
103:21262+17 2232 CD4424 call _fat_math_add32 ;MEM_FAT_ROOTSTART now contains the first sector
104: ;of the Root directory
105:
106: ;add offset (partition location)
107:21279+17 2235 CD5815 call ideif_get_drv_pointer
108:21296+10 2238 DD23 inc ix
109:21306+10 223A DD23 inc ix
110:21316+15 223C DDE5 push ix
111:21331+10 223E D1 pop de ;copy poiter to hl
112:21341+10 223F 01C945 ld bc,[MEM_FAT_ROOTSTART]
113:21351+17 2242 CD4424 call _fat_math_add32 ;MEM_FAT_OF0_DATSEC now contains the first sector
114: ;of the cluster
115: ;copy value from MEM_FAT_ROOTSTART to MEM_IDE_POINTER
116:21368+10 2245 21C945 ld hl,MEM_FAT_ROOTSTART
117:21378+10 2248 11D542 ld de,MEM_IDE_POINTER
118:21388+16 224B EDA0 ldi
119:21404+16 224D EDA0 ldi
120:21420+16 224F EDA0 ldi
121:21436+16 2251 EDA0 ldi
122:
123: ;copy value from MEM_FAT_ROOTSTART to MEM_IDE_POINTER
124:21452+10 2253 21C945 ld hl,MEM_FAT_ROOTSTART
125:21462+10 2256 11C545 ld de,MEM_FAT_DATASTART
126:21472+16 2259 EDA0 ldi
127:21488+16 225B EDA0 ldi
128:21504+16 225D EDA0 ldi
129:21520+16 225F EDA0 ldi
130:
131:21536+10 2261 21C945 ld hl,MEM_FAT_ROOTSTART
132:21546+10 2264 114346 ld de,MEM_FAT_CURRDIR
133:21556+16 2267 EDA0 ldi
134:21572+16 2269 EDA0 ldi
135:21588+16 226B EDA0 ldi
136:21604+16 226D EDA0 ldi
137:
138: ;add offset to data area
139: ;multiply cluster by length of cluster
140:
141: ;calculate sectors for root dir
142:21620+16 226F 2ACB43 ld hl,(MEM_IDE_BUFFER+0x11) ;load Maximum root directory entries
143:21636+4 2272 7C ld a,h
144:21640+4 2273 6F ld l,a
145:21644+4 2274 AF xor a ;set a 0, clear carry flag
146:21648+4 2275 67 ld h,a ;shift right by 8 bit = /512
147:
148: ;last step: multiply by 16
149:21652+4 2276 EB ex de,hl
150:21656+10 2277 011000 ld bc,16
151:21666+17 227A CD7524 call _fat_math_mul32
152: ; BCHL contains result -> store to PTR.MEM_FAT_TMPPOINTER
153:21683+16 227D 22C145 ld (MEM_FAT_TMPPOINTER+0),hl
154:21699+20 2280 ED43C345 ld (MEM_FAT_TMPPOINTER+2),bc
155:
156:21719+16 2284 22D145 ld (MEM_FAT_DIRSEC),hl
157: ; add offset to MEM_FAT_DATASTART
158:21735+10 2287 11C145 ld de,[MEM_FAT_TMPPOINTER]
159:21745+10 228A 01C545 ld bc,[MEM_FAT_DATASTART]
160:21755+17 228D CD4424 call _fat_math_add32 ;MEM_FAT_DATASTART now contains the correct sector
161: ;at teh beginnig of the data area
162:
163:
164: ;done all FS vars populated
165:
166: ;navigate to root directory
167:21772+7 2290 3E5C ld a,'\'
168:21779+13 2292 32E345 ld(MEM_FAT_CURDIR),a
169:21792+4 2295 AF xor a
170:21796+13 2296 32E445 ld(MEM_FAT_CURDIR+1),a
171:
172:21809+10 2299 C9 ret
173:
174: - 229A _fat_get_root_table_invalid:
175:21819+17 229A CDEC01 call PRINTINLINE
176: - 229D 0A0D4361 db 10,13,"Cannot find boot sector.",10,13,0
6E6E6F74
2066696E
6420626F
6F742073
6563746F
722E0A0D
00
177:21836+17 22BA CD5815 call ideif_get_drv_pointer
178:21853+19 22BD DD360002 ld (ix+0),0x02
179:21872+10 22C1 C9 ret
180:
181: ;-------------------------------------
182: ; fat_getfatsec
183: ;
184: ; gets sector in FAT table for the cluster stored in MEM_FAT_OF0_CCLUST
185: ;
186: ; store result in MEM_FAT_OF0_FATSEC
187: ; stores next cluster in MEM_FAT_OF0_CCLUST
188: ;-------------------------------------
189: - 22C2 fat_getfatsec:
190:21882+16 22C2 2A3546 ld HL,(MEM_FAT_OF0_CCLUST) ;load cluster
191:21898+4 22C5 7C ld a,h ;if not 0x0000
192:21902+4 22C6 B5 or l
193:21906+10 22C7 C2D922 jp nz, _fat_getfatsec_notroot
194: ;if 0x0000, goto root directory
195:21916+10 22CA 21C945 ld hl,MEM_FAT_ROOTSTART
196:21926+10 22CD 113B46 ld de,MEM_FAT_OF0_DATSEC
197:21936+16 22D0 EDA0 ldi ;quick and dirty hack to go back to root directory
198:21952+16 22D2 EDA0 ldi
199:21968+16 22D4 EDA0 ldi
200:21984+16 22D6 EDA0 ldi
201:22000+10 22D8 C9 ret
202:
203: - 22D9 _fat_getfatsec_notroot:
204:22010+16 22D9 2A3546 ld HL,(MEM_FAT_OF0_CCLUST) ;load cluster
205: ;each sector contains 256 clusters
206: ;first 8bits are not needed (/256)
207:22026+4 22DC 7C ld a,h ;divide by 256
208:22030+4 22DD 6F ld l,a
209:22034+4 22DE AF xor a
210:22038+4 22DF 67 ld h,a
211:
212:22042+20 22E0 ED4BBA45 ld bc,(MEM_FAT_RESERVED) ;add reserved sectors
213:22062+11 22E4 09 add hl,bc
214:22073+16 22E5 223746 ld(MEM_FAT_OF0_FATSEC+0),hl;store sector
215:22089+4 22E8 AF xor a
216:22093+13 22E9 323946 ld(MEM_FAT_OF0_FATSEC+2),a
217:22106+13 22EC 323A46 ld(MEM_FAT_OF0_FATSEC+3),a
218:
219:22119+17 22EF CD5815 call ideif_get_drv_pointer
220:22136+10 22F2 DD23 inc ix
221:22146+10 22F4 DD23 inc ix
222:22156+15 22F6 DDE5 push ix
223:22171+10 22F8 D1 pop de ;copy poiter to hl
224:22181+10 22F9 013746 ld bc,[MEM_FAT_OF0_FATSEC]
225:22191+17 22FC CD4424 call _fat_math_add32 ;MEM_FAT_OF0_FATSEC now contains the correct sector
226: ;in the FAT
227:
228: ;read FAT sector
229:22208+10 22FF 213746 ld hl,MEM_FAT_OF0_FATSEC ;read next sector
230:22218+7 2302 0601 ld b,1
231:22225+7 2304 3E01 ld a,1
232:22232+10 2306 11BA43 LD DE, MEM_IDE_BUFFER ;where to store data?
233:22242+17 2309 CD7F15 call read_lba_sector
234:
235: ;calculate data sector
236: ;multiply cluster by length of cluster
237:22259+4 230C AF xor a ;clear carry
238:22263+13 230D 3ABF45 ld a,(MEM_FAT_CLUSTERLEN)
239:22276+7 2310 0600 ld b,0
240:22283+4 2312 4F ld c,a
241:22287+20 2313 ED5B3546 ld de,(MEM_FAT_OF0_CCLUST) ;load cluster number
242:22307+6 2317 1B dec de ; sub 2 becaus fat starts at 3
243:22313+6 2318 1B dec de
244:22319+17 2319 CD7524 call _fat_math_mul32
245: ; BCHL contains result -> store to PTR.MEM_FAT_OF0_DATSEC
246:22336+16 231C 223B46 ld (MEM_FAT_OF0_DATSEC+0),hl
247:22352+20 231F ED433D46 ld (MEM_FAT_OF0_DATSEC+2),bc
248:
249: ; add start of data region to addr
250:22372+10 2323 013B46 ld bc,[MEM_FAT_OF0_DATSEC]
251:22382+10 2326 11C545 ld de,[MEM_FAT_DATASTART]
252:22392+17 2329 CD4424 call _fat_math_add32 ;MEM_FAT_OF0_FATSEC now contains the correct sector
253: ;in the FAT
254: ;MEM_FAT_OF0_DATSEC now has the first sector of the selected cluster
255:
256: ;reset MEM_FAT_OF0_DATREM to default cluster length
257:22409+13 232C 3ABF45 ld a,(MEM_FAT_CLUSTERLEN)
258:22422+4 232F 6F ld l,a
259:22426+7 2330 2600 ld h,0
260:22433+16 2332 223F46 ld (MEM_FAT_OF0_DATREM), hl
261:
262: ;get next cluster
263: ;calculate offset address
264:22449+13 2335 3A3546 ld a,(MEM_FAT_OF0_CCLUST)
265:22462+4 2338 17 RLA ;shift to left (x2)
266:22466+4 2339 6F ld l, a
267:22470+7 233A 3E00 ld a,0
268:22477+4 233C 17 RLA ;shift in carry flag
269:22481+4 233D 67 ld h,a
270:22485+10 233E 11BA43 ld de,MEM_IDE_BUFFER
271:22495+11 2341 19 add hl,de
272: ;copy pointer (hl to de)
273:22506+10 2342 113546 ld de,MEM_FAT_OF0_CCLUST
274:22516+16 2345 EDA0 ldi ;copy byte for next cluster from FAT
275:22532+16 2347 EDA0 ldi
276:22548+10 2349 C9 ret
277: ;store data
278:
279: ;-------------------------------------
280: ; fat_readfilesec
281: ;
282: ; reads single sector of file
283: ; must run fat_readfilesec before to initialize
284: ; if a ix 0x00, success
285: ; if a is 0xFF, end reached
286: ;
287: ; DE contains destination address
288: ;-------------------------------------
289: - 234A fat_readfilesec:
290: ;call fat_print_dbg
291:22558+10 234A 213B46 ld hl,[MEM_FAT_OF0_DATSEC]
292:22568+7 234D 0601 ld b,1
293:22575+7 234F 3E01 ld a,1
294: ;LD DE, MEM_IDE_BUFFER ;where to store data?
295:22582+17 2351 CD7F15 call read_lba_sector ;read sectore
296:22599+10 2354 213B46 ld hl,[MEM_FAT_OF0_DATSEC] ;increment pointer to next sector
297:22609+17 2357 CD3024 call _fat_increment_32 ;***
298:22626+16 235A 2A3F46 ld hl,(MEM_FAT_OF0_DATREM) ;reduce counter
299:22642+4 235D AF xor a
300:22646+10 235E 110100 ld de,1
301:22656+15 2361 ED52 sbc hl,de ;decrement counter
302:22671+16 2363 223F46 ld (MEM_FAT_OF0_DATREM),hl ;store decremented counter
303:22687+5+6 2366 C0 ret nz ;when not zero, exit function
304: ;if zero:
305:22692+7 2367 3EFF ld a, 0xFF ;preload error code
306:22699+16 2369 2A3546 ld hl,(MEM_FAT_OF0_CCLUST) ;check next chunk
307:22715+10 236C 11FFFF ld de,0xFFFF ;end mark
308:22725+15 236F ED52 sbc hl,de ;if Z match
309:22740+5+6 2371 C8 ret z ;If 0xFFFF, end is reched. Return
310: ;if next cluster available:
311:22745+4 2372 AF xor a
312:22749+17 2373 CDC222 call fat_getfatsec ; read next cluster information
313:22766+10 2376 C9 ret
314:
315:
316: ;-------------------------------------
317: ; fat_openfile
318: ; search for entry in current directory
319: ;
320: ; DE pointer to file name
321: ; sets:
322: ; - MEM_FAT_OF0_CCLUST
323: ; - MEM_FAT_OF0_ATTRIBUTE
324: ; - MEM_FAT_FILEREMAIN
325: ; if a is 0x00, success
326: ; if a is 0xFF, end reached
327: ;-------------------------------------
328: - 2377 fat_openfile:
329:22776+11 2377 D5 PUSH DE
330: ;MEM_FAT_TMPFNAME now has valid text to compare
331:22787+10 2378 21D345 LD HL,[MEM_FAT_TMPFNAME]
332:22797+17 237B CDBC24 call format_filename_fat16
333:22814+10 237E D1 POP DE
334: - 237F fat_openfile_noprepare:
335:22824+11 237F D5 PUSH DE
336: ;prepare pointer
337:22835+10 2380 214346 ld hl,MEM_FAT_CURRDIR
338:22845+10 2383 11D542 ld de,MEM_IDE_POINTER
339:22855+16 2386 EDA0 ldi
340:22871+16 2388 EDA0 ldi
341:22887+16 238A EDA0 ldi
342:22903+16 238C EDA0 ldi
343:
344:22919+13 238E 3AD145 LD A,(MEM_FAT_DIRSEC) ;init counter for FAT sectors
345:22932+13 2391 32C045 LD (MEM_FAT_COUNT1),A
346:
347:22945+10 2394 21D542 LD HL,MEM_IDE_POINTER ;read first sector
348:22955+7 2397 0601 LD B,1
349:22962+7 2399 3E01 ld a,1
350:22969+10 239B 11BA43 LD DE, MEM_IDE_BUFFER ;where to store data?
351:22979+17 239E CD7F15 call read_lba_sector
352:
353:22996+10 23A1 21BA43 LD HL, MEM_IDE_BUFFER ;set buffer start
354:23006+7 23A4 0E10 LD C,16 ;set entries counter
355:
356: - 23A6 _fat_lfs_loop:
357:23013+10 23A6 11D345 LD DE,[MEM_FAT_TMPFNAME]
358:23023+17 23A9 CDA624 CALL compare_filename
359:23040+7+5 23AC 3838 JR C, _fat_lfs_loop_compare_match ;on match
360:
361: ; prepare next entry
362:23047+4 23AE 0D DEC C ;next sector after 16 entries
363:23051+7+5 23AF 2807 JR Z,_fat_lfs_loop_compare_next_sector
364:23058+10 23B1 112000 LD DE, 32 ;length of entry
365:23068+11 23B4 19 ADD HL,DE ;increment
366:23079+10 23B5 C3A623 JP _fat_lfs_loop
367:
368: - 23B8 _fat_lfs_loop_compare_next_sector:
369:23089+10 23B8 21D542 ld hl,[MEM_IDE_POINTER]
370:23099+17 23BB CD3024 call _fat_increment_32 ;increment sector
371:
372:23116+13 23BE 3AC045 LD A,(MEM_FAT_COUNT1) ; decrement sector count (max FAT length)
373:23129+4 23C1 3D DEC A
374:23133+13 23C2 32C045 LD (MEM_FAT_COUNT1),A
375:23146+10 23C5 CAE223 JP Z, _fat_lfs_loop_compare_end ; if DE is 0, mmax is reached. End here
376: ;call print_a_hex
377:
378:23156+10 23C8 21D542 LD HL,MEM_IDE_POINTER ;read next sector
379:23166+7 23CB 0601 LD B,1
380:23173+7 23CD 3E01 ld a,1
381:23180+10 23CF 11BA43 LD DE, MEM_IDE_BUFFER ;where to store data?
382:23190+17 23D2 CD7F15 call read_lba_sector
383:
384:23207+10 23D5 21BA43 LD HL, MEM_IDE_BUFFER ;set buffer start
385:23217+7 23D8 0E10 LD C,16 ;set entries counter
386:
387:23224+7 23DA 7E ld a,(HL)
388:23231+4 23DB B7 or a
389:23235+10 23DC CAE223 jp z, _fat_lfs_loop_compare_end ;skip empty sectors
390:
391:23245+10 23DF C3A623 JP _fat_lfs_loop
392:
393: - 23E2 _fat_lfs_loop_compare_end:
394:23255+10 23E2 D1 POP DE
395:23265+7 23E3 3EFF ld a,0xFF
396:23272+10 23E5 C9 RET
397:
398: - 23E6 _fat_lfs_loop_compare_match:
399: ; get entry
400:23282+10 23E6 D1 POP DE
401:
402: ; HL points to Start of Table item
403:23292+11 23E7 E5 PUSH HL
404:23303+14 23E8 DDE1 POP IX
405: ; get important information
406:23317+19 23EA DD7E1B ld a,(ix+0x1B) ;first cluster number
407:23336+13 23ED 323646 ld (MEM_FAT_OF0_CCLUST+1),a
408:23349+19 23F0 DD7E1A ld a,(ix+0x1A)
409:23368+13 23F3 323546 ld (MEM_FAT_OF0_CCLUST+0),a
410:23381+19 23F6 DD7E0B ld a,(ix+0x0B)
411:23400+13 23F9 323346 ld (MEM_FAT_OF0_ATTRIBUTE+0),a
412:
413:23413+4 23FC AF xor a ;clear carry ;set MEM_FAT_OF0_DATREM to remaining sectors
414:23417+19 23FD DD7E1F ld a,(ix+0x1F) ;cluste length shift by 256
415:23436+4 2400 1F rra
416:23440+13 2401 32CF45 ld (MEM_FAT_FILEREMAIN+2),a
417:23453+19 2404 DD7E1E ld a,(ix+0x1E)
418:23472+4 2407 1F rra
419:23476+13 2408 32CE45 ld (MEM_FAT_FILEREMAIN+1),a
420:23489+19 240B DD7E1D ld a,(ix+0x1D)
421:23508+4 240E 1F rra
422:23512+13 240F 32CD45 ld (MEM_FAT_FILEREMAIN+0),a
423:23525+7 2412 3E00 ld a,0
424:23532+13 2414 32D045 ld (MEM_FAT_FILEREMAIN+3),a
425:23545+17 2417 CDC222 call fat_getfatsec ;get sector information
426:
427:23562+4 241A AF xor a
428:23566+10 241B C9 RET
429:
430:
431: ;=================== UTIL Functions ===========================
432: ; 32 Bit addition to pointer
433: ; HL has value
434: ;deprecated!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
435: - 241C _fat_math_sector_add_16:
436:23576+16 241C 22C145 ld (MEM_FAT_TMPPOINTER), hl
437:23592+4 241F AF xor a
438:23596+13 2420 32C345 ld (MEM_FAT_TMPPOINTER+2),a
439:23609+13 2423 32C445 ld (MEM_FAT_TMPPOINTER+3),a
440:
441:23622+10 2426 11C145 ld de,[MEM_FAT_TMPPOINTER]
442:23632+10 2429 01D542 ld bc,[MEM_IDE_POINTER]
443:23642+17 242C CD4424 call _fat_math_add32
444:23659+10 242F C9 ret
445: ;deprecated!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
446:
447: ;hl contains pointer
448: - 2430 _fat_increment_32
449:23669+7 2430 7E ld a,(HL) ; byte 0
450:23676+7 2431 C601 add 1
451:23683+7 2433 77 ld (hl),a
452:23690+6 2434 23 inc hl
453:23696+7 2435 7E ld a,(HL) ; byte 1
454:23703+7 2436 CE00 adc 0
455:23710+7 2438 77 ld (hl),a
456:23717+6 2439 23 inc hl
457:23723+7 243A 7E ld a,(HL) ; byte 2
458:23730+7 243B CE00 adc 0
459:23737+7 243D 77 ld (hl),a
460:23744+6 243E 23 inc hl
461:23750+7 243F 7E ld a,(HL) ; byte 3
462:23757+7 2440 CE00 adc 0
463:23764+7 2442 77 ld (hl),a
464:23771+10 2443 C9 ret
465: ;bc contains pointer to a (also result)
466: ;de contains pointer to b
467: - 2444 _fat_math_add32
468:23781+11 2444 E5 push hl
469:23792+11 2445 C5 push bc
470:23803+11 2446 D5 push de
471:23814+7 2447 1A ld a,(de) ; load lower 16bit for B int from (DE) to HL
472:23821+4 2448 6F ld l,a
473:23825+6 2449 13 inc de
474:23831+7 244A 1A ld a,(de)
475:23838+4 244B 67 ld h,a
476:23842+6 244C 13 inc de
477: ; HL, DE dirty
478:23848+7 244D 0A ld a,(bc) ; load lower 16bit for A int from (BC) to DE
479:23855+4 244E 5F ld e,a
480:23859+6 244F 03 inc bc
481:23865+7 2450 0A ld a,(bc)
482:23872+4 2451 57 ld d,a
483: ; HL now contains A, DE now contains D
484:23876+11 2452 19 add hl,de ;add lower bytes, store carry
485:23887+10 2453 D1 pop de ;restore pointers
486:23897+10 2454 C1 pop bc ;both now cointain first byte of long-value
487:23907+4 2455 7D ld a,l ;store lower result in (bc)
488:23911+7 2456 02 ld (bc),a
489:23918+6 2457 03 inc bc
490:23924+4 2458 7C ld a,h
491:23928+7 2459 02 ld (bc),a
492:23935+6 245A 03 inc bc
493:23941+6 245B 13 inc de ;also increment de to next byte
494:23947+6 245C 13 inc de
495: ; DE and HL now start at the upper byte
496:23953+11 245D C5 push bc
497:23964+11 245E D5 push de
498:23975+7 245F 1A ld a,(de) ; load upper 16bit for B
499:23982+4 2460 6F ld l,a
500:23986+6 2461 13 inc de
501:23992+7 2462 1A ld a,(de)
502:23999+4 2463 67 ld h,a
503:24003+6 2464 13 inc de
504:24009+7 2465 0A ld a,(bc) ; load upper 16bit for A
505:24016+4 2466 5F ld e,a
506:24020+6 2467 03 inc bc
507:24026+7 2468 0A ld a,(bc)
508:24033+4 2469 57 ld d,a
509:24037+15 246A ED5A adc hl,de ;add upper bytes, store carry
510:24052+10 246C D1 pop de
511:24062+10 246D C1 pop bc
512:24072+4 246E 7D ld a,l ;store lower result in (bc)
513:24076+7 246F 02 ld(bc),a
514:24083+6 2470 03 inc bc
515:24089+4 2471 7C ld a,h
516:24093+7 2472 02 ld(bc),a
517:24100+10 2473 E1 pop hl
518:24110+10 2474 C9 ret
519:
520:
521: ; Multiply 16-bit values (with 32-bit result)
522: ; Operands BC, DE
523: ; Result -> BCHL
524: - 2475 _fat_math_mul32:
525:24120+4 2475 79 ld a,c
526:24124+4 2476 48 ld c,b
527:24128+10 2477 210000 ld hl,0
528:24138+7 247A 0610 ld b,16
529: - 247C _fat_math_mul32_l:
530:24145+11 247C 29 add hl,hl
531:24156+4 247D 17 rla
532:24160+8 247E CB11 rl c
533:24168+7+5 2480 3007 jr nc,_fat_math_mul32_noadd
534:24175+11 2482 19 add hl,de
535:24186+7 2483 CE00 adc a,0
536:24193+10 2485 D28924 jp nc,_fat_math_mul32_noadd
537:24203+4 2488 0C inc c
538: - 2489 _fat_math_mul32_noadd:
539:24207+8+5 2489 10F1 djnz _fat_math_mul32_l
540:24215+4 248B 41 ld b,c
541:24219+4 248C 4F ld c,a
542:24223+10 248D C9 ret
543:
544: ; reset LBA pointer to first sector in selected partition
545: - 248E fat_reset_pointer:
546:24233+17 248E CD5815 call ideif_get_drv_pointer
547:24250+10 2491 DD23 inc ix
548:24260+10 2493 DD23 inc ix
549:24270+15 2495 DDE5 push ix
550:24285+10 2497 E1 pop hl ;copy poiter to hl
551:24295+10 2498 11D542 ld de, MEM_IDE_POINTER
552:24305+12 249B 1800 jr fat_copy_lba_pointer
553:
554: ; resets LBA pointer (4-byte) to partition start
555: ; HL = from here
556: ; DE = to this destimation
557: - 249D fat_copy_lba_pointer:
558:24317+11 249D C5 PUSH BC
559:24328+7 249E 0600 LD B,0
560:24335+7 24A0 0E04 LD C,4
561:24342+16+5 24A2 EDB0 LDIR
562:24358+10 24A4 C1 POP BC
563:24368+10 24A5 C9 ret
564:
565: ; compares filenames
566: ; HL points to name1
567: ; DE points to name2
568: ; Carry is set if match
569: ; Destroys DE, AF
570: - 24A6 compare_filename:
571:24378+11 24A6 E5 PUSH HL
572:24389+11 24A7 C5 push BC
573:24400+7 24A8 060B LD B, 11 ;Counter
574: - 24AA _compare_filename_loop:
575:24407+7 24AA 1A LD A,(DE)
576:24414+4 24AB 4F LD C,A
577:24418+7 24AC 7E LD A,(HL)
578:24425+6 24AD 23 INC HL
579:24431+6 24AE 13 INC DE
580:24437+4 24AF A9 XOR C ;check if identical (should return 0)
581:24441+7+5 24B0 2006 JR NZ, _compare_filename_nomatch
582:24448+8+5 24B2 10F6 djnz _compare_filename_loop ;if not last, continue
583:24456+10 24B4 C1 POP BC
584:24466+10 24B5 E1 POP HL
585:24476+4 24B6 37 SCF
586:24480+10 24B7 C9 RET
587: - 24B8 _compare_filename_nomatch:
588:24490+10 24B8 C1 POP BC
589:24500+10 24B9 E1 POP HL
590:24510+4 24BA AF XOR A ; clear carry flag
591:24514+10 24BB C9 RET
592:
593: ; formats filename to 8+3 format
594: ; DE points to source filename to string
595: ; HL points to destination
596: - 24BC format_filename_fat16:
597:24524+7 24BC 060B LD B, 11 ;counter
598:24531+11 24BE E5 PUSH HL
599:24542+7 24BF 3E20 LD A, ' '
600: - 24C1 _format_filename_fat16_clean:
601:24549+7 24C1 77 LD (HL),A
602:24556+6 24C2 23 INC HL
603:24562+8+5 24C3 10FC DJNZ _format_filename_fat16_clean
604:24570+10 24C5 E1 POP HL ; continue with copy
605:24580+7 24C6 060D LD B, 13
606: - 24C8 _format_filename_fat16_loop:
607:24587+7 24C8 1A LD A, (DE) ; load byte
608:24594+4 24C9 B7 OR A
609:24598+5+6 24CA C8 RET Z ;exit on 0byte
610:24603+4 24CB 05 DEC B ;reduce counter
611:24607+5+6 24CC C8 RET Z ;exit after 12 bytes 8+.+3
612:24612+7 24CD FE2E CP '.' ; check if dot
613:24619+7+5 24CF 200A JR NZ, _format_filename_fat16_loop_copy ; if not continue as usual
614:24626+6 24D1 13 INC DE ;else skip char
615: - 24D2 _format_filename_fat16_loop_skip_8:
616:24632+4 24D2 78 LD A,B
617:24636+7 24D3 FE05 CP 5
618:24643+7+5 24D5 38F1 JR C, _format_filename_fat16_loop
619:24650+6 24D7 23 INC HL
620:24656+4 24D8 05 DEC B
621:24660+12 24D9 18F7 JR _format_filename_fat16_loop_skip_8
622:
623: - 24DB _format_filename_fat16_loop_copy:
624:24672+7 24DB 1A LD A, (DE) ; load byte
625:24679+7 24DC 77 LD (HL), A ; copy byte
626:24686+6 24DD 23 INC HL
627:24692+6 24DE 13 INC DE
**** main.asm ****
233:24698+10 24DF C3C824 JP _format_filename_fat16_loop
234: .include "fat16_cmd.s"
**** include/fat16_cmd.s ****
1: ;-------------------------------------
2: ; Print current fat directory of MEM_FAT_CURRDIR
3: ;-------------------------------------
4: - 24E2 fat_print_directory:
5:24708+10 24E2 214346 ld hl,MEM_FAT_CURRDIR
6:24718+10 24E5 11D542 ld de,MEM_IDE_POINTER
7:24728+16 24E8 EDA0 ldi
8:24744+16 24EA EDA0 ldi
9:24760+16 24EC EDA0 ldi
10:24776+16 24EE EDA0 ldi
11:
12:24792+20 24F0 ED5BBD45 LD DE,(MEM_FAT_SECTORS)
13:24812+20 24F4 ED53C045 LD (MEM_FAT_COUNT1),DE
14:24832+10 24F8 21D542 LD HL,MEM_IDE_POINTER ;read first sector
15:24842+7 24FB 0601 LD B,1
16:24849+7 24FD 3E01 ld a,1
17:24856+10 24FF 11BA43 LD DE, MEM_IDE_BUFFER ;where to store data?
18:24866+17 2502 CD7F15 call read_lba_sector
19:
20:24883+17 2505 CDEC01 call PRINTINLINE
21: - 2508 0A0D2020 db 10,13," Filename Cluster Size",10,13,0
46696C65
6E616D65
20202020
20436C75
73746572
2053697A
650A0D00
22:
23:24900+10 2528 21BA43 LD HL, MEM_IDE_BUFFER ;set buffer start
24:24910+7 252B 0E10 LD C,16 ;set entries counter
25:
26: - 252D _fat_print_directory_loop: ;loop over each entry (32byte)
27:24917+7 252D 7E LD A,(HL) ; check first byte
28:24924+11 252E E5 PUSH HL ;backup start of entry
29:24935+14 252F DDE1 POP IX
30:24949+11 2531 E5 PUSH HL
31: ;ignore unwanted entries
32:24960+7 2532 FE41 CP 0x41 ;skip invisible
33:24967+10 2534 CAC525 JP Z, _fat_print_directory_loop_next
34:24977+7 2537 FEE5 CP 0xE5 ;skip deleted
35:24984+10 2539 CAC525 JP Z, _fat_print_directory_loop_next
36:24994+7 253C FE00 CP 0x00 ;reached end
37:25001+10 253E CAF925 JP Z, _fat_print_directory_loop_break
38:
39: ;check file attribute
40:25011+19 2541 DD7E0B ld a,(IX+0x0B)
41:25030+7 2544 FE10 cp 0x10 ;if subdirectors
42:25037+10 2546 CA9A25 jp z, _fat_print_directory_dir ;print dir
43: ;else print file
44: - 2549 _fat_print_directory_loop_file
45: ;print filename
46:25047+7 2549 3E20 ld a,' '
47:25054+17 254B CDF600 call print_char
48:25071+7 254E 3E20 ld a,' '
49:25078+17 2550 CDF600 call print_char
50:25095+7 2553 0608 LD B,8
51:25102+17 2555 CD071A call print_str_fixed
52:25119+7 2558 3E2E ld A,'.'
53:25126+17 255A CDF600 call print_char
54:25143+7 255D 0603 LD B,3
55:25150+17 255F CD071A call print_str_fixed
56:
57:25167+17 2562 CDEC01 call PRINTINLINE
58: - 2565 20307800 db " 0x",0
59: ;first cluster number
60:25184+19 2569 DD7E1B ld a,(ix+0x1B)
61:25203+17 256C CD2201 call print_a_hex
62:25220+19 256F DD7E1A ld a,(ix+0x1A)
63:25239+17 2572 CD2201 call print_a_hex
64:25256+17 2575 CDEC01 call PRINTINLINE
65: - 2578 20203078 db " 0x",0
00
66:25273+19 257D DD7E1F ld a,(ix+0x1F)
67:25292+17 2580 CD2201 call print_a_hex
68:25309+19 2583 DD7E1E ld a,(ix+0x1E)
69:25328+17 2586 CD2201 call print_a_hex
70:25345+19 2589 DD7E1D ld a,(ix+0x1D)
71:25364+17 258C CD2201 call print_a_hex
72:25381+19 258F DD7E1C ld a,(ix+0x1C)
73:25400+17 2592 CD2201 call print_a_hex
74:25417+17 2595 CD0C01 call print_newLine
75:25434+12 2598 182B jr _fat_print_directory_loop_next
76: - 259A _fat_print_directory_dir
77:25446+7 259A 3E44 ld a,'D'
78:25453+17 259C CDF600 call print_char
79:25470+7 259F 3E20 ld a,' '
80:25477+17 25A1 CDF600 call print_char
81:25494+7 25A4 0608 LD B,8
82:25501+17 25A6 CD071A call print_str_fixed
83:25518+17 25A9 CDEC01 call PRINTINLINE
84: - 25AC 20202020 db " 0x",0
20307800
85: ;first cluster number
86:25535+19 25B4 DD7E1B ld a,(ix+0x1B)
87:25554+17 25B7 CD2201 call print_a_hex
88:25571+19 25BA DD7E1A ld a,(ix+0x1A)
89:25590+17 25BD CD2201 call print_a_hex
90:25607+17 25C0 CD0C01 call print_newLine
91:25624+12 25C3 1800 jr _fat_print_directory_loop_next
92:
93: - 25C5 _fat_print_directory_loop_next: ; read next entry
94:25636+4 25C5 0D DEC C ;next sector after 32 entries
95:25640+7+5 25C6 2808 JR Z,_fat_print_directory_loop_next_sector
96:25647+10 25C8 E1 POP HL ;restore start
97:25657+10 25C9 112000 LD DE, 32 ;length of entry
98:25667+11 25CC 19 ADD HL,DE ;increment
99:25678+10 25CD C32D25 JP _fat_print_directory_loop
100:
101: - 25D0 _fat_print_directory_loop_next_sector: ; end fo sector. read next sector from disk
102:25688+10 25D0 E1 POP HL ;clear stack from old hl
103:25698+7 25D1 2600 LD H,0
104:25705+7 25D3 2E01 LD L,1
105:25712+17 25D5 CD1C24 call _fat_math_sector_add_16 ;increment sector
106:
107:25729+20 25D8 ED5BC045 LD DE,(MEM_FAT_COUNT1) ; decrement sector count (max FAT length)
108:25749+6 25DC 1B DEC DE
109:25755+20 25DD ED53C045 LD (MEM_FAT_COUNT1),DE
110:25775+4 25E1 7A LD A,D
111:25779+4 25E2 B3 OR E
112:25783+5+6 25E3 C8 RET Z ; if DE is 0, mmax is reached. End here
113:
114:25788+10 25E4 21D542 LD HL,MEM_IDE_POINTER ;read next sector
115:25798+7 25E7 0601 LD B,1
116:25805+7 25E9 3E01 ld a,1
117:25812+10 25EB 11BA43 LD DE, MEM_IDE_BUFFER ;where to store data?
118:25822+17 25EE CD7F15 call read_lba_sector
119:
120:25839+10 25F1 21BA43 LD HL, MEM_IDE_BUFFER ;set buffer start
121:25849+7 25F4 0E10 LD C,16 ;set entries counter
122:25856+10 25F6 C32D25 JP _fat_print_directory_loop
123:
124: - 25F9 _fat_print_directory_loop_break
125:25866+10 25F9 E1 POP HL
126:25876+10 25FA C9 ret
127:
128: ;-------------------------------------
129: ; Changes current fat directory of MEM_FAT_CURRDIR
130: ; input is relativ path
131: ; DE points to path
132: ;-------------------------------------
133: - 25FB fat_cd_single:
134:25886+11 25FB D5 push de
135: ; check if user wants to go back (input = '..')
136:25897+7 25FC 1A ld a,(de)
137:25904+7 25FD FE2E cp '.'
138:25911+7+5 25FF 205E jr nz, _fat_cd_navigate; if not, skip
139:25918+6 2601 13 inc de ;check next
140:25924+7 2602 1A ld a,(de)
141:25931+7 2603 FE2E cp '.'
142:25938+7+5 2605 2058 jr nz, _fat_cd_navigate; if not, skip
143:25945+13 2607 3A7E42 ld a,(var_dir+79) ;last byte contains depth
144:25958+4 260A B7 or a; Test if 0
145:25962+10 260B CAB726 jp z, _fat_cd_navigate_error ;cannot go back any more (already at root)
146: ; check if .. exists in directory
147:25972+7 260E 3E2E ld a,'.' ;prepare filename buffer
148:25979+10 2610 21D345 ld hl,[MEM_FAT_TMPFNAME]
149:25989+7 2613 77 ld (hl),a
150:25996+6 2614 23 inc hl
151:26002+7 2615 77 ld (hl),a
152:26009+6 2616 23 inc hl
153:26015+7 2617 3E20 ld a,0x20 ;clear char 3-11
154:26022+7 2619 060B ld b,11
155: - 261B _fat_cd_navigate_goback_fl:
156:26029+7 261B 77 ld (hl),a
157:26036+6 261C 23 inc hl
158:26042+8+5 261D 10FC djnz _fat_cd_navigate_goback_fl ;fill loop end
159:26050+17 261F CD7F23 call fat_openfile_noprepare ;load file table (only 1st sector needed)
160:26067+4 2622 B7 or a ;check for error
161:26071+10 2623 C2B726 jp nz, _fat_cd_navigate_error ;entry not found exception
162:
163:
164: ; find end of path
165:26081+10 2626 213242 ld hl,[var_dir+3] ;current position
166:26091+10 2629 014C00 ld bc,76
167:26101+7 262C 3E00 ld a,0x00 ;termination char
168:26108+16+5 262E EDB1 cpir ;find end
169:26124+10 2630 E2C526 jp po,_fat_cd_navigate_inerror ;in case of error, abort
170: ;hl is now at end of string
171:26134+10 2633 014C00 ld bc,76
172:26144+7 2636 3E5C ld a,'\' ;seperation char
173:26151+16+5 2638 EDB9 cpdr ;serach backwards for "/"
174:26167+10 263A E2C526 jp po,_fat_cd_navigate_inerror ;in case of error, abort
175: ;hl is now at end of string
176:26177+6 263D 23 inc hl
177:26183+4 263E AF xor a
178:26187+7 263F 77 ld (hl),a ;set termination char
179:26194+6 2640 23 inc hl
180:26200+7 2641 77 ld (hl),a ;set termination char
181:26207+13 2642 3A7E42 ld a,(var_dir+79)
182:26220+4 2645 3D dec a
183:26224+13 2646 327E42 ld (var_dir+79),a ;decrement dir depth counter
184:
185:26237+10 2649 D1 pop de
186:
187:26247+10 264A 213142 ld hl,[var_dir+2]
188:26257+7 264D 3E5C ld a,'\'
189:26264+7 264F 77 ld (hl),a ;set first /
190:
191:26271+10 2650 213B46 ld hl,MEM_FAT_OF0_DATSEC ;setup directory pointer
192:26281+10 2653 114346 ld de,MEM_FAT_CURRDIR
193:26291+16 2656 EDA0 ldi
194:26307+16 2658 EDA0 ldi
195:26323+16 265A EDA0 ldi
196:26339+16 265C EDA0 ldi
197:
198:26355+10 265E C9 ret
199:
200: - 265F _fat_cd_navigate
201:26365+10 265F D1 pop de ;get pointer to directory namme
202:26375+11 2660 D5 push de ;and re-store it for next use
203:26386+17 2661 CD7723 call fat_openfile ;find 'file' in current directory
204: - 2664 _fat_cd_navigate_findsec
205:26403+4 2664 B7 or a
206:26407+10 2665 C2B726 jp nz, _fat_cd_navigate_error ;entry not found
207:26417+13 2668 3A3346 ld a, (MEM_FAT_OF0_ATTRIBUTE)
208:26430+7 266B FE10 cp 0x10
209:26437+10 266D C2CD26 jp nz, _fat_cd_navigate_errfile
210:26447+13 2670 3A7E42 ld a,(var_dir+79)
211:26460+4 2673 3C inc a
212:26464+13 2674 327E42 ld (var_dir+79),a ;increment dir depth counter
213:26477+10 2677 213142 ld hl,[var_dir+2] ;load start of path string
214:26487+7 267A 3E00 ld a,0 ;load termination char
215:26494+10 267C 014C00 ld bc,76 ;max length of string
216:26504+16+5 267F EDB1 cpir ;find end of path string
217:26520+6 2681 2B dec hl
218:26526+10 2682 E2C526 jp po,_fat_cd_navigate_inerror ;in case of error, abort
219: ;HL now has last element, BC has remaining max length
220:26536+13 2685 3A7E42 ld a,(var_dir+79) ;last byte contains depth
221:26549+7 2688 FE01 cp 1 ;if first path, skip /
222:26556+7+5 268A 2804 jr z, _fat_cd_navigate_findsec_skipslash
223:26563+7 268C 3E5C ld a,'\'
224:26570+7 268E 77 ld (hl),a
225:26577+6 268F 23 inc hl
226: - 2690 _fat_cd_navigate_findsec_skipslash
227:26583+10 2690 D1 pop de ;get argument from stack
228:26593+4 2691 EB ex de,hl
229:26597+11 2692 D5 push de ;store start to stack
230: ;HL now has start of input string, DE has end of current path
231:26608+10 2693 010900 ld bc,09 ;maximum length of directory name +1
232: - 2696 _fat_cd_navigate_l2: ;copy new subdirectory
233:26618+16 2696 EDA0 ldi ;copy
234:26634+10 2698 E2BF26 jp po,_fat_cd_navigate_inerrorS ;in case of error, abort
235:26644+7 269B 7E ld a,(hl) ;check next char
236:26651+7 269C FE5C cp '\' ;end at '\'
237:26658+7+5 269E 2805 jr z, _fat_cd_navigate_end ;else next byte
238:26665+4 26A0 B7 or a ;or and at 0x00
239:26669+7+5 26A1 2802 jr z, _fat_cd_navigate_end ;else next byte
240:26676+12 26A3 18F1 jr _fat_cd_navigate_l2
241: - 26A5 _fat_cd_navigate_end:
242:26688+4 26A5 AF xor a
243:26692+7 26A6 12 ld (de),a ;set last byte to 0x00 (termination)
244:26699+10 26A7 213B46 ld hl,MEM_FAT_OF0_DATSEC
245: ;setup directory pointer
246:26709+10 26AA 114346 ld de,MEM_FAT_CURRDIR
247:26719+16 26AD EDA0 ldi
248:26735+16 26AF EDA0 ldi
249:26751+16 26B1 EDA0 ldi
250:26767+16 26B3 EDA0 ldi
251:26783+10 26B5 D1 pop de ;stack cleanup
252:26793+10 26B6 C9 ret
253:
254: - 26B7 _fat_cd_navigate_error:
255:26803+10 26B7 21D526 ld hl,[_fat_cd_navigate_error_str]
256:26813+17 26BA CDFC00 call print_str
257:26830+10 26BD D1 pop de
258:26840+10 26BE C9 ret
259:
260: - 26BF _fat_cd_navigate_inerrorS: ;with path reset
261:26850+10 26BF D1 pop de ;restore former path
262:26860+6 26C0 1B dec de ;change pointer to remove previous '\' as well
263:26866+4 26C1 AF xor a ;clear a to 0x00
264:26870+7 26C2 12 ld (de),a ;set last byte to 0x00 (termination)
265:26877+12 26C3 1801 jr _fat_cd_navigate_inerrore
266: - 26C5 _fat_cd_navigate_inerror: ;without path reset
267:26889+10 26C5 D1 pop de
268: - 26C6 _fat_cd_navigate_inerrore:
269:26899+10 26C6 21EC26 ld hl,[_fat_cd_navigate_inputerr_str]
270:26909+17 26C9 CDFC00 call print_str
271:26926+10 26CC C9 ret
272: - 26CD _fat_cd_navigate_errfile:
273:26936+10 26CD D1 pop de
274:26946+10 26CE 21FF26 ld hl,[_fat_cd_navigate_errfile_str]
275:26956+17 26D1 CDFC00 call print_str
276:26973+10 26D4 C9 ret
277:
278: - 26D5 _fat_cd_navigate_error_str:
279: - 26D5 0A0D4E6F db 10,13,"No such directory!",10,13,0
20737563
68206469
72656374
6F727921
0A0D00
280: - 26EC _fat_cd_navigate_inputerr_str:
281: - 26EC 0A0D496E db 10,13,"Invalid input!",10,13,0
76616C69
6420696E
70757421
0A0D00
282: - 26FF _fat_cd_navigate_errfile_str:
283: - 26FF 0A0D4361 db 10,13,"Cannot cd to file!",10,13,0
6E6E6F74
20636420
746F2066
696C6521
0A0D00
284:
285: - 2716 fat_exec:
286:26983+11 2716 D5 push de
287: ;DE has pointer to arguments
288:26994+17 2717 CD7723 call fat_openfile
289:27011+4 271A B7 or a
290:27015+10 271B C2AC27 jp nz, _fat_exec_notfound ;if not found, abort
291: ;call fat_print_dbg
292: ;load header
293:27025+10 271E 11BA43 ld de, MEM_IDE_BUFFER
294:27035+17 2721 CD4A23 call fat_readfilesec
295:
296:
297: ;ld hl, MEM_IDE_BUFFER ;print sector
298: ;ld b,0x20
299: ;call dump_pretty
300:
301:27052+13 2724 3ABA43 ld a,(MEM_IDE_BUFFER)
302:27065+7 2727 FEC3 cp 0xC3
303:27072+10 2729 C2C527 jp nz, _fat_exec_notexec
304:
305:27082+17 272C CDEC01 call PRINTINLINE
306: - 272F 0A0D4C6F db 10,13,"Loading ",0
6164696E
672000
307:27099+10 273A E1 pop hl ;get and re-store pointer ot filename from and to stack
308:27109+11 273B E5 push hl
309:27120+17 273C CDFC00 call print_str
310:27137+17 273F CDEC01 call PRINTINLINE
311: - 2742 20746F20 db " to 0x",0
307800
312: ;get start address
313:27154+20 2749 ED4BC443 ld bc,(MEM_IDE_BUFFER + 10)
314:27174+4 274D 78 ld a,b
315:27178+17 274E CD2201 call print_a_hex
316:27195+4 2751 79 ld a,c
317:27199+17 2752 CD2201 call print_a_hex
318:27216+17 2755 CDEC01 call PRINTINLINE
319: - 2758 202E2E2E db " ... ",0
2000
320: ;bc has start addr
321:27233+20 275E ED434746 ld (MEM_FAT_EXEC_CURR),bc
322:27253+20 2762 ED434B46 ld (MEM_FAT_EXEC_START),bc
323:
324: ;get amount of sectors to load
325:27273+16 2766 2AC843 ld hl,(MEM_IDE_BUFFER + 14)
326:27289+4 2769 6C ld l,h
327:27293+8 276A CB3D srl l
328:27301+7 276C 2600 ld h,0 ;divide by 512
329:27308+6 276E 23 inc hl ;increment because first sector is always loaded
330: ; hl contains sector count
331:27314+16 276F 224946 ld (MEM_FAT_EXEC_COUNT), hl
332:
333:27330+10 2772 D1 pop de ; restore filename
334:27340+17 2773 CD7723 call fat_openfile ;reset file information
335: ;start reading
336: - 2776 _fat_exec_readloop1:
337:27357+20 2776 ED5B4746 ld de,(MEM_FAT_EXEC_CURR)
338:27377+17 277A CD4A23 call fat_readfilesec
339:27394+16 277D 2A4746 ld hl,(MEM_FAT_EXEC_CURR)
340:27410+10 2780 110002 ld de,512
341:27420+11 2783 19 add hl,de
342:27431+16 2784 224746 ld (MEM_FAT_EXEC_CURR),hl
343:
344:27447+16 2787 2A4946 ld hl,(MEM_FAT_EXEC_COUNT)
345:27463+6 278A 2B dec hl
346:27469+16 278B 224946 ld (MEM_FAT_EXEC_COUNT),hl
347:27485+4 278E 7C ld a,h
348:27489+4 278F B5 or l
349:27493+7+5 2790 2802 jr z, _fat_exec_read_done
350:27500+12 2792 18E2 jr _fat_exec_readloop1
351: - 2794 _fat_exec_read_done:
352:27512+17 2794 CDEC01 call PRINTINLINE
353: - 2797 4C6F6164 db "Load complete!",10,13,0
20636F6D
706C6574
65210A0D
00
354:27529+16 27A8 2A4B46 ld hl,(MEM_FAT_EXEC_START)
355:27545+4 27AB E9 jp (hl)
356:
357:
358: - 27AC _fat_exec_notfound:
359:27549+10 27AC D1 pop de
360:27559+17 27AD CDEC01 call PRINTINLINE
361: - 27B0 0A0D4669 db 10,13,"File not found!",10,13,0
6C65206E
6F742066
6F756E64
210A0D00
362:27576+10 27C4 C9 ret
363:
364: - 27C5 _fat_exec_notexec:
365:27586+10 27C5 D1 pop de
366:27596+17 27C6 CDEC01 call PRINTINLINE
367: - 27C9 0A0D4669 db 10,13,"File is not an executable!",10,13,0
6C652069
73206E6F
7420616E
20657865
63757461
626C6521
0A0D00
**** main.asm ****
235:27613+10 27E8 C9 ret
236:
237: ;================================================================
238: ; Strings
239: ;================================================================
240: - 27E9 STR_Banner_Start:
241: - 27E9 5A384320 db "Z8C Monitor V2.1 by Dennis Gunia (2022-2024)",0
4D6F6E69
746F7220
56322E31
20627920
44656E6E
69732047
756E6961
20283230
32322D32
30323429
00
Statistics:
4 passes
0 jr promotions
611 symbols
11682 bytes
2 macro calls
244 macro bytes
8 invented symbols
Symbol Table:
?a0000 14C3 5315
?a0001 1580 5504
ADDR_RTC =D0 208
A_RTS_OFF 1DA 474
A_RTS_ON 1E3 483
BOOT_PHASE0 86 134
BOOT_PHASE1 B7 183
BOOT_PHASE1_LOOP C0 192
BOOT_PHASE2 CB 203
B_BEEP 50 80
B_DSKSEL 74 116
B_FATCD 7D 125
B_FATCREATE 80 128
B_FATOPEN 77 119
B_FATREAD 7A 122
B_FATWRITE 83 131
B_IICRECV 56 86
B_IICSEND 53 83
B_KEYREAD 6B 107
B_KEYREADASCII 6E 110
B_KEYSEND 71 113
B_PRINTAHEX 62 98
B_PRINTCHAR 59 89
B_PRINTINLINE 5F 95
B_PRINTLN 65 101
B_PRINTSTR 5C 92
B_READCHAR 68 104
COMMAND 1AA4 6820
COMMAND_ABORT 1AA1 6817
COMMAND_BACKSPACE 1AE5 6885
COMMAND_LUT 1A0F 6671
COMMAND_PROCESS 1B0B 6923
COMMAND_PROCESS_FOUND 1B46 6982
COMMAND_PROCESS_LOOP 1B0E 6926
COMMAND_PROCESS_LOOP_STR1 1B17 6935
COMMAND_PROCESS_LOOP_STR2 1B2D 6957
COMMAND_PROCESS_NEXT_ENTRY 1B32 6962
COMMAND_PROCESS_NEXT_ENTRYI 1B31 6961
COMMAND_PROCESS_NOT_FOUND 1B3D 6973
COMMAND_READ 1AB6 6838
CONSOLE_INIT EF 239
CS_APU_CTRL =F9 249
CS_APU_DATA =F8 248
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 251 593
DHEX_TO_BYTE_FAILED 26D 621
ERR_SYNTAX 1B5C 7004
EXEC_RST_08 DF1 3569
EXEC_RST_10 DF5 3573
EXEC_RST_18 E01 3585
HEX_TO_BIN 271 625
HEX_TO_BIN_2 27F 639
HEX_TO_INVALID_2 286 646
IDE_CMD_IDENT =EC 236
IDE_CMD_READSEC=20 32
IDE_CMD_WRITESEC=30 48
IDE_DEV_TABLE 1325 4901
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_LBA0 =0B 11
IDE_REG_LBA1 =0C 12
IDE_REG_LBA2 =0D 13
IDE_REG_LBA3 =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
IIC_CLK =01 1
IIC_DATA =02 2
INT_PIO_ADDRC =F6 246
INT_PIO_ADDRD =F4 244
INT_VEC 1B 27
INT_VEC_TABLE =4000 16384
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
MEM_FAT_AMOUNT 45BC 17852
MEM_FAT_CLUSTERLEN 45BF 17855
MEM_FAT_COUNT1 45C0 17856
MEM_FAT_CURDIR 45E3 17891
MEM_FAT_CURRDIR 4643 17987
MEM_FAT_DATASTART 45C5 17861
MEM_FAT_DIRSEC 45D1 17873
MEM_FAT_EXEC_COUNT 4649 17993
MEM_FAT_EXEC_CURR 4647 17991
MEM_FAT_EXEC_START 464B 17995
MEM_FAT_FILEREMAIN 45CD 17869
MEM_FAT_OF0_ATTRIBUTE 4633 17971
MEM_FAT_OF0_CCLUST 4635 17973
MEM_FAT_OF0_DATREM 463F 17983
MEM_FAT_OF0_DATSEC 463B 17979
MEM_FAT_OF0_FATSEC 4637 17975
MEM_FAT_RESERVED 45BA 17850
MEM_FAT_ROOTSTART 45C9 17865
MEM_FAT_SECTORS 45BD 17853
MEM_FAT_TMPFNAME 45D3 17875
MEM_FAT_TMPPOINTER 45C1 17857
MEM_IDE_BUFFER 43BA 17338
MEM_IDE_DEVICE 42CF 17103
MEM_IDE_DEV_TABLE 42D9 17113
MEM_IDE_FSBUFFER 45BA 17850
MEM_IDE_PARTITION 42D1 17105
MEM_IDE_POINTER 42D5 17109
MEM_IDE_SELECTED 4319 17177
MEM_IDE_STATUS 42D0 17104
MEM_IDE_STRING_0 431A 17178
MEM_IDE_STRING_1 4342 17218
MEM_IDE_STRING_2 436A 17258
MEM_IDE_STRING_3 4392 17298
MSG_CLEAR 1D2 466
NOT_IMPLEMENTED 1B55 6997
OP_CALL 1BB7 7095
OP_CD 1F87 8071
OP_CLR 1D4B 7499
OP_DASM 1C38 7224
OP_DIR 1F83 8067
OP_DUMP 1BD7 7127
OP_EXEC 1B9E 7070
OP_FSEXEC 1FA4 8100
OP_IIC_IN 1CFF 7423
OP_IIC_OUT 1C9F 7327
OP_IO_IN 1C68 7272
OP_IO_OUT 1C7E 7294
OP_LSDSK 1F60 8032
OP_RTIME 1D4F 7503
OP_SELDSK 1F64 8036
OP_SET 1C07 7175
OP_STIME 1EE7 7911
POST_CHECK_APU 1FDD 8157
POST_CHECK_IDE_30 2008 8200
POST_CHECK_IDE_40 201B 8219
POST_CHECK_PIO 1FB8 8120
POST_START 1FA8 8104
POST_TEST_RTC 2035 8245
PRG_RAM_START =4110 16656
PRG_RAM_TOP =FF00 65280
PRINTINLINE 1EC 492
PROG_MEM_START =4000 16384
PROG_ROM_START = 100 256
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 288 648
STRCONV_BYTES_TO_HEX_1 297 663
STRCONV_BYTES_TO_HEX_2 2A1 673
STR_Banner_Start 27E9 10217
STR_PD_HEADER 19C8 6600
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
_COMMAND_PROCESS_FOUND 1B54 6996
_OP_CALL 1BD6 7126
_OP_IIC_ACK_ERR 1CE4 7396
_OP_IIC_ACK_ERR_str 1CEB 7403
_OP_IIC_IN_LOOP 1D31 7473
_OP_IIC_IN_LOOP_TEXT 1D3E 7486
_OP_IIC_OUT_LOOP 1CB5 7349
_OP_IIC_OUT_SEND 1CD1 7377
_OP_RTIME_NN 1D52 7506
_OP_RTIME_RD_CMD 1E0A 7690
_OP_SELDSK_INVALID 1F73 8051
_OP_SELDSK_INVALID_STR 1F8B 8075
_OP_SET_LOOP 1C1F 7199
_OP_STIME_INVALID 1EAD 7853
_OP_STIME_PROMPT 1EC4 7876
_OP_STIME_PROMPT_ERR 1EDC 7900
_OP_STIME_STR_DAY 1E0B 7691
_OP_STIME_STR_HOUR 1E5C 7772
_OP_STIME_STR_MIN 1E77 7799
_OP_STIME_STR_MON 1E26 7718
_OP_STIME_STR_SEC 1E92 7826
_OP_STIME_STR_YEAR 1E41 7745
_POST_CHECK_APU_FAILED 1FFC 8188
_POST_CHECK_IDE_FAILED 202E 8238
_POST_CHECK_PIO_FAILED 1FD1 8145
_POST_TEST_RTC_INVALID 206F 8303
_POST_TEST_RTC_NOTFOUND 2068 8296
_STR_NOT_FOUND 1B77 7031
_STR_NOT_IMPLEMENTED 1B63 7011
_STR_SYNTAX 1B8B 7051
_beep_pause_l1 E1F 3615
_compare_filename_loop 24AA 9386
_compare_filename_nomatch 24B8 9400
_fat_cd_navigate 265F 9823
_fat_cd_navigate_end 26A5 9893
_fat_cd_navigate_errfile 26CD 9933
_fat_cd_navigate_errfile_str 26FF 9983
_fat_cd_navigate_error 26B7 9911
_fat_cd_navigate_error_str 26D5 9941
_fat_cd_navigate_findsec 2664 9828
_fat_cd_navigate_findsec_skipslash 2690 9872
_fat_cd_navigate_goback_fl 261B 9755
_fat_cd_navigate_inerror 26C5 9925
_fat_cd_navigate_inerrorS 26BF 9919
_fat_cd_navigate_inerrore 26C6 9926
_fat_cd_navigate_inputerr_str 26EC 9964
_fat_cd_navigate_l2 2696 9878
_fat_exec_notexec 27C5 10181
_fat_exec_notfound 27AC 10156
_fat_exec_read_done 2794 10132
_fat_exec_readloop1 2776 10102
_fat_get_root_table_invalid 229A 8858
_fat_getfatsec_notroot 22D9 8921
_fat_increment_32 2430 9264
_fat_lfs_loop 23A6 9126
_fat_lfs_loop_compare_end 23E2 9186
_fat_lfs_loop_compare_match 23E6 9190
_fat_lfs_loop_compare_next_sector 23B8 9144
_fat_math_add32 2444 9284
_fat_math_mul32 2475 9333
_fat_math_mul32_l 247C 9340
_fat_math_mul32_noadd 2489 9353
_fat_math_sector_add_16 241C 9244
_fat_print_directory_dir 259A 9626
_fat_print_directory_loop 252D 9517
_fat_print_directory_loop_break 25F9 9721
_fat_print_directory_loop_file 2549 9545
_fat_print_directory_loop_next 25C5 9669
_fat_print_directory_loop_next_sector 25D0 9680
_format_filename_fat16_clean 24C1 9409
_format_filename_fat16_loop 24C8 9416
_format_filename_fat16_loop_copy 24DB 9435
_format_filename_fat16_loop_skip_8 24D2 9426
_ide_readsector_512_floop E7B 3707
_ideif_drv_sel_fail 15F0 5616
_ideif_drv_sel_fstr0 16AD 5805
_ideif_drv_sel_pstr 16A4 5796
_ideif_drv_sel_sstr0 16BB 5819
_ideif_drv_sel_syn 16C8 5832
_ideif_init_drive_charloop 14B7 5303
_ideif_init_drive_found 1499 5273
_ideif_init_drive_loop 1481 5249
_ideif_init_drive_nodrv 1494 5268
_ideif_init_drive_prt_fnd 1515 5397
_ideif_init_drive_prt_l1 1503 5379
_ideif_init_drive_prt_ln 150D 5389
_ideif_prnt_devtable_hdr 1630 5680
_ideif_prnt_devtable_l1 1391 5009
_ideif_prnt_devtable_l1_e2 1457 5207
_ideif_prnt_devtable_l1_es 13D6 5078
_ideif_prnt_devtable_l1_ms 1454 5204
_ideif_prnt_devtable_l1_nxt 139E 5022
_ideif_prnt_devtable_l1_s00 13C4 5060
_ideif_prnt_devtable_l1_s01 13C9 5065
_ideif_prnt_devtable_l1_s02 13CE 5070
_ideif_prnt_devtable_l1_sFF 13D3 5075
_ideif_prnt_devtable_l1_sel 139C 5020
_ideif_prnt_devtable_master 1694 5780
_ideif_prnt_devtable_s00 1668 5736
_ideif_prnt_devtable_s01 1673 5747
_ideif_prnt_devtable_s02 167E 5758
_ideif_prnt_devtable_sFF 1689 5769
_ideif_prnt_devtable_slave 169C 5788
_int_invalid_int 185A 6234
_intctrl_init_fill_loop 183B 6203
_isr_pio 184E 6222
_read_bcd_invalid 165 357
_shift4 1F5B 8027
_str_invalid_interrupt 1864 6244
_str_pio_interrupt 189B 6299
beep E04 3588
beep_loop E07 3591
beep_pause E1E 3614
compare_filename 24A6 9382
con_rb_init 18E 398
con_rb_read 199 409
con_rb_read_empty 1B6 438
con_rb_write 1BF 447
consio_init_a 18CE 6350
consio_init_a_int 1906 6406
consio_init_a_sio 18D5 6357
consio_init_ctc_a 191D 6429
consio_isr 1960 6496
consio_rx_a 1933 6451
consio_rx_a_sts 1956 6486
consio_rx_rts_a_off 194D 6477
consio_rx_rts_a_on 1944 6468
consio_tx_a 1926 6438
consio_tx_a_waitout 1928 6440
dasm_00 A09 2569
dasm_01 CF5 3317
dasm_02 A8F 2703
dasm_03 CC7 3271
dasm_08 B0C 2828
dasm_09 C9A 3226
dasm_0A A71 2673
dasm_0B CDE 3294
dasm_10 A51 2641
dasm_12 A9A 2714
dasm_18 A14 2580
dasm_1A A7B 2683
dasm_20 A2E 2606
dasm_22 D3B 3387
dasm_27 AD4 2772
dasm_28 A27 2599
dasm_2A D0C 3340
dasm_2F AD8 2776
dasm_30 A1F 2591
dasm_32 AA5 2725
dasm_37 AE4 2788
dasm_38 A18 2584
dasm_3A A85 2693
dasm_3F AE0 2784
dasm_76 AE8 2792
dasm_80C6 B65 2917
dasm_BE B02 2818
dasm_C3 A0D 2573
dasm_C88E B8B 2955
dasm_C9 A5D 2653
dasm_CD A57 2647
dasm_D9 B19 2841
dasm_DD A3F 2623
dasm_DD_01 CFC 3324
dasm_DD_09 CB5 3253
dasm_DD_22 D51 3409
dasm_DD_23 CCC 3276
dasm_DD_2A D23 3363
dasm_DD_2B CE3 3299
dasm_DD_34 C65 3173
dasm_DD_35 C82 3202
dasm_DD_86 B6D 2925
dasm_DD_8E B93 2963
dasm_DD_96 BB6 2998
dasm_DD_9E BD6 3030
dasm_DD_A6 BF7 3063
dasm_DD_AE C2E 3118
dasm_DD_B6 C13 3091
dasm_DD_BE C4A 3146
dasm_DD_E1 DA3 3491
dasm_DD_E3 B29 2857
dasm_DD_E5 D8D 3469
dasm_DD_F9 D73 3443
dasm_E1 D9D 3485
dasm_E3 B1D 2845
dasm_E5 D87 3463
dasm_E9 A36 2614
dasm_ED_42 CAC 3244
dasm_ED_43 D47 3399
dasm_ED_44 ADC 2780
dasm_ED_45 A67 2663
dasm_ED_46 AF3 2803
dasm_ED_4A CA3 3235
dasm_ED_4B D18 3352
dasm_ED_4D A62 2658
dasm_ED_56 AF8 2808
dasm_ED_5E AFD 2813
dasm_ED_A0 B41 2881
dasm_ED_A1 B53 2899
dasm_ED_A8 B4A 2890
dasm_ED_A9 B5C 2908
dasm_ED_B0 B45 2885
dasm_ED_B1 B57 2903
dasm_ED_B8 B4E 2894
dasm_ED_B9 B60 2912
dasm_F3 AED 2797
dasm_F9 D69 3433
dasm_FB AF0 2800
dasm_FD A48 2632
dasm_FD_01 D04 3332
dasm_FD_09 CBE 3262
dasm_FD_22 D5D 3421
dasm_FD_23 CD5 3285
dasm_FD_2A D2F 3375
dasm_FD_2B CEC 3308
dasm_FD_34 C71 3185
dasm_FD_35 C8E 3214
dasm_FD_86 B7C 2940
dasm_FD_8E BA2 2978
dasm_FD_96 BC2 3010
dasm_FD_9E BE4 3044
dasm_FD_A6 C03 3075
dasm_FD_AE C3A 3130
dasm_FD_B6 C1E 3102
dasm_FD_BE C55 3157
dasm_FD_E1 DAB 3499
dasm_FD_E3 B35 2869
dasm_FD_E5 D95 3477
dasm_FD_F9 D7D 3453
dasm_FF A6C 2668
dasm_UU DB3 3507
dasm_UW DB7 3511
dasm__AND BF2 3058
dasm__CP C46 3142
dasm__DEC C7D 3197
dasm__ED_47 AC4 2756
dasm__ED_4F ACC 2764
dasm__ED_57 AB4 2740
dasm__ED_5F ABC 2748
dasm__INC C60 3168
dasm__LD AB0 2736
dasm__OR C0F 3087
dasm__SBC BCE 3022
dasm__SUB BB1 2993
dasm__XOR C29 3113
dasm_opcode_table 5B1 1457
dasm_print16hex_addr 3DE 990
dasm_print8hex 3F6 1014
dasm_printFlags_table DBC 3516
dasm_printRegister8_table DCC 3532
dasm_printRegister8_table_HL DEC 3564
dasm_printRegisterIX_table DD4 3540
dasm_printRegisterIY_table DDC 3548
dasm_printRegisterSP_table DE4 3556
disassemble 2A2 674
disassemble_continue 388 904
disassemble_err 378 888
disassemble_next 2A6 678
disassemble_print_opcode_params_end 375 885
disassemble_print_opcode_params_loop 321 801
disassemble_print_opcode_raw 2E3 739
disassemble_print_opcode_raw_fill 2F7 759
disassemble_table_first_match 3BA 954
disassemble_table_found 3D4 980
disassemble_table_notfound 3D8 984
disassemble_table_seek 396 918
disassemble_table_seek_loop 39A 922
dump_pretty 196D 6509
dump_pretty_ascii 1997 6551
dump_pretty_ascii_cont 19B5 6581
dump_pretty_ascii_loop 199F 6559
dump_pretty_ascii_none 19B0 6576
dump_pretty_col 198A 6538
dump_pretty_end 19C7 6599
dump_pretty_nextrow 19BB 6587
dump_pretty_row 1975 6517
endPrint 1FA 506
fat_cd_single 25FB 9723
fat_copy_lba_pointer 249D 9373
fat_exec 2716 10006
fat_get_root_table 21CD 8653
fat_getfatsec 22C2 8898
fat_openfile 2377 9079
fat_openfile_noprepare 237F 9087
fat_print_directory 24E2 9442
fat_readfilesec 234A 9034
fat_reset_pointer 248E 9358
format_filename_fat16 24BC 9404
ide_printerror EB2 3762
ide_readsector_512_fast E67 3687
ide_readsector_timeout E9C 3740
ide_regread_8 E51 3665
ide_regwrite_8 E37 3639
ide_reset E2B 3627
ide_writesector_256 EB1 3761
ideif_drv_sel 15B8 5560
ideif_get_drv_pointer 1558 5464
ideif_init_all 156C 5484
ideif_init_devtable 1365 4965
ideif_init_drive 1478 5240
ideif_prnt_devtable 1383 4995
iic_init 173A 5946
iic_read_ack 1781 6017
iic_receive_buffer 170B 5899
iic_receive_buffer_done 172E 5934
iic_receive_buffer_err 1734 5940
iic_receive_buffer_loop 171C 5916
iic_receive_byte 1807 6151
iic_receive_byte_loop 1814 6164
iic_send_ack 17A7 6055
iic_send_buffer 16E1 5857
iic_send_buffer_done 16FF 5887
iic_send_buffer_err 1705 5893
iic_send_buffer_loop 16F1 5873
iic_send_byte 17E1 6113
iic_send_byte_loop 17ED 6125
iic_send_ebit 1760 5984
iic_send_nack 17C4 6084
iic_send_sbit 1747 5959
initctrl_int_abandon 184E 6222
initctrl_int_register 184E 6222
intctrl_init 182E 6190
interrupt_vectors 4000 16384
mon_var_template 44 68
mon_var_template_end 613 1555
mon_var_template_sof= 444 1092
nxtILC 1EF 495
param_01 404 1028
param_02 42B 1067
param_03 448 1096
param_03_done 480 1152
param_03_neg 469 1129
param_04 484 1156
param_04_i 494 1172
param_05 49A 1178
param_06 4A7 1191
param_07 4C1 1217
param_08 4CE 1230
param_09 4E3 1251
param_09_0A 4E9 1257
param_0A 4DA 1242
param_10 4F8 1272
param_11 508 1288
param_11_12 517 1303
param_11_12_all 537 1335
param_11_12_def 52A 1322
param_11_12_ix 52F 1327
param_11_12_iy 534 1332
param_12 510 1296
param_13 548 1352
param_80 567 1383
param_80_seek 56E 1390
param_81 55E 1374
param_comma 5A2 1442
param_printRegister 57D 1405
param_printRegisterA 59B 1435
param_printRegisterHL 593 1427
print_16_hex 181 385
print_32_hex 168 360
print_a_hex 122 290
print_bcd 134 308
print_char F6 246
print_clear 105 261
print_newLine 10C 268
print_reg 1FF 511
print_str FC 252
print_str_fixed 1A07 6663
print_wait_out 117 279
read_bcd 14F 335
read_char 14C 332
read_char_raw 13A 314
read_lba_sector 157F 5503
str_dev_done 1628 5672
str_dev_waitready 1610 5648
str_error_start EE7 3815
str_error_start1 F04 3844
str_error_start2 F0D 3853
str_error_time F16 3862
str_post_apu 20C7 8391
str_post_ide_30 2076 8310
str_post_ide_40 2091 8337
str_post_nd 20FD 8445
str_post_ok 2135 8501
str_post_pio 20AC 8364
str_post_rtc 20E2 8418
str_post_rtc_iv 210B 8459
var_apu_present 420E 16910
var_buffer_conin_data 4100 16640
var_buffer_conin_in 4200 16896
var_buffer_conin_out 4201 16897
var_buffer_conin_sts 4202 16898
var_buffer_conout 4203 16899
var_buffer_len 4204 16900
var_bytes_count=411A 16666
var_curserchar 420A 16906
var_curserlastaddr 420B 16907
var_curseron 4209 16905
var_curserstate 4208 16904
var_curserx 4206 16902
var_cursery 4207 16903
var_dir 422F 16943
var_idebuffer 42CF 17103
var_input 427F 17023
var_last_char 4205 16901
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_pio_present 420D 16909
var_ps2mem 421F 16927
var_scratch 420F 16911