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 C38300 jp BOOT_PHASE0 39: 40: - 0008 org 0x0008 41: - 0008 RST_08 ;Print Char 42: 10+10 0008 C3D50D jp EXEC_RST_08 43: 44: - 0010 org 0x0010 45: - 0010 RST_10 ;receive char 46: 20+10 0010 C3D90D jp EXEC_RST_10 47: 48: - 0018 org 0x0018 49: - 0018 RST_18 ;Buffer length 50: 30+10 0018 C3E50D 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: - 0044 mon_var_template: 63: - 4000 phase SYS_RAM_START 64: - 4000 interrupt_vectors: 65: - 4000 ..40FF 00 defs 256 66: - 4100 var_buffer_len: 67: - 4100 00 defb 0 68: - 4101 var_last_char: 69: - 4101 00 defb 0 70: - 4102 var_curserx: 71: - 4102 00 defb 0 72: - 4103 var_cursery: 73: - 4103 00 defb 0 74: - 4104 var_curserstate: 75: - 4104 00 defb 0 76: - 4105 var_curseron: 77: - 4105 00 defb 0 78: - 4106 var_curserchar: 79: - 4106 00 defb 0 80: - 4107 var_curserlastaddr: 81: - 4107 0000 defw 0 82: - 4109 var_pio_present: 83: - 4109 00 defb 0 84: - 410A var_apu_present: 85: - 410A 00 defb 0 86: - 410B var_scratch: 87: - 410B ..411A 00 defs 16 ;16 bytes space for scratch vars 88: - 411B var_ps2mem: 89: - 411B ..412A 00 defs 16 ;16 bytes space for scratch vars 90: - 412B var_dir: 91: - 412B ..417A 00 defs 80 92: - 417B var_input: 93: - 417B ..41CA 00 defs 80 94: - 41CB var_idebuffer: 95: - 41CB ..44CA 00 defs 768 96: 97: - 050F dephase 98: - 050F mon_var_template_end: 99: 40+4 050F 00 nop 100: 101: ;================================================================ 102: ; Start of monitor 103: ;================================================================ 104: - 0050 org 0x0050 105: .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 B_BEEP: 6: 44+10 0050 C3E80D jp beep 7: 8: - 0053 B_IICSEND: 9: 54+10 0053 C3C316 jp iic_send_buffer 10: 11: - 0056 B_IICRECV: 12: 64+10 0056 C3ED16 jp iic_receive_buffer 13: 14: - 0059 B_PRINTCHAR: 15: 74+10 0059 C31501 jp print_char 16: 17: - 005C B_PRINTSTR: 18: 84+10 005C C31D01 jp print_str 19: 20: - 005F B_PRINTINLINE: 21: 94+10 005F C3D001 jp PRINTINLINE 22: 23: - 0062 B_PRINTAHEX: 24: 104+10 0062 C34301 jp print_a_hex 25: 26: - 0065 B_PRINTLN: 27: 114+10 0065 C32D01 jp print_newLine 28: 29: - 0068 B_READCHAR: 30: 124+10 0068 C35B01 jp read_char 31: 32: - 006B B_KEYREAD: 33: 134+10 006B C9 ret ;placeholder -> not implemented 34: - 006C 0000 db 0x00, 0x00 35: 36: - 006E B_KEYSEND: 37: 144+10 006E C9 ret ;placeholder -> not implemented 38: - 006F 0000 db 0x00, 0x00 39: 40: - 0071 B_DSKSEL: 41: 154+10 0071 C39A15 jp ideif_drv_sel 42: 43: - 0074 B_FATOPEN: 44: 164+10 0074 C31722 jp fat_openfile 45: 46: - 0077 B_FATREAD: 47: 174+10 0077 C3EA21 jp fat_readfilesec 48: 49: - 007A B_FATCD: 50: 184+10 007A C39B24 jp fat_cd_single 51: 52: - 007D B_FATCREATE: 53: 194+10 007D C9 ret ;placeholder -> not implemented 54: - 007E 0000 db 0x00, 0x00 55: 56: - 0080 B_FATWRITE: 57: 204+10 0080 C9 ret ;placeholder -> not implemented **** main.asm **** 106: - 0081 0000 db 0x00, 0x00 107: 108: - 0083 BOOT_PHASE0: ;Setup Hardware 109: ;Setup Stack-Pointer 110: 214+10 0083 31FFFF ld sp, STACK_RAM_TOP 111: ;Disable Interrupts 112: 224+4 0086 F3 di 113: ;Setup PIO on MIO Board 114: 228+7 0087 3ECF LD A,0xCF 115: 235+11 0089 D3F6 OUT (CS_PIO_AC), A 116: 246+7 008B 3EF7 LD A,11110111b ;All pins inputs except speaker 117: 253+11 008D D3F6 OUT (CS_PIO_AC), A 118: 264+7 008F 3E03 LD A,00000011B ;Preset I2C pins to high 119: 271+11 0091 D3F6 OUT (CS_PIO_AC), A 120: 121: ;Set variables 122: 282+13 0093 320441 ld (var_curserstate),a 123: 295+13 0096 320541 ld (var_curseron),a 124: 308+7 0099 3E20 ld a, " " 125: 315+13 009B 320641 ld (var_curserchar),a 126: 127: ;setup interrupt table 128: 328+7 009E 3E40 ld a,[interrupt_vectors]>>8 129: 335+9 00A0 ED47 ld i,a 130: 131: ;Initialize Console (Serial-Port) 132: 344+17 00A2 CDDC00 call CONSOLE_INIT 133: 134: - 00A5 BOOT_PHASE1: ;Copy default values to RAM 135: 361+10 00A5 214400 ld hl,mon_var_template 136: 371+10 00A8 110F05 ld de,mon_var_template_end 137: 381+10 00AB 010040 ld bc,SYS_RAM_START 138: - 00AE BOOT_PHASE1_LOOP: 139: 391+7 00AE 7E ld a,(hl) ;copy values 140: 398+7 00AF 02 ld (bc),a 141: 405+6 00B0 23 inc hl 142: 411+6 00B1 03 inc bc 143: 417+11 00B2 E5 push hl ;check if end is reached 144: 428+15 00B3 ED52 sbc hl,de 145: 443+10 00B5 E1 pop hl 146: 453+10 00B6 C2AE00 jp nz, BOOT_PHASE1_LOOP 147: ;template copy done 148: 149: 150: - 00B9 BOOT_PHASE2: ;Hardware initialized. 151: ; Print banner 152: 463+17 00B9 CD2601 call print_clear 153: 480+10 00BC 218926 ld hl, [STR_Banner_Start] 154: 490+17 00BF CD1D01 call print_str 155: 156: ; Power-On Self Tests 157: 507+17 00C2 CD481E call POST_START 158: 159: ; Detect IDE drives 160: 524+17 00C5 CD4E15 call ideif_init_all 161: 162: ; Beep after start 163: 541+10 00C8 114000 LD DE,0x40 164: 551+10 00CB 014800 LD BC,0x48 165: 561+17 00CE CDE80D CALL beep 166: 167: 578+4 00D1 AF xor a ;set dir to empty 168: 582+13 00D2 322B41 ld (var_dir),a 169: 595+13 00D5 322C41 ld (var_dir+1),a 170: ; Start commandline 171: 608+10 00D8 C34419 jp COMMAND 172: 173: ; This instruction should never be reached 174: 618+4 00DB 76 halt 175: 176: ;================================================================ 177: ; Includes (2/2) 178: ;================================================================ 179: .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/ 5: ; 6: ;9600 -> 12 / 00110000 7: ; 8: 9: - 00DC CONSOLE_INIT: 10: - 00DC CONSOLE_INIT_CTC: 11: ;LD A,00001111b ; Set /16 Divider, CPU Trigger, Time COnstant Follows 12: 622+7 00DC 3E4F LD A,01001111b ; External Trigger, Time COnstant Follows 13: 629+11 00DE D304 OUT (CS_CTC_0),A 14: 640+11 00E0 DB01 IN A,(CS_DIP) ; Read BAUD from DIP-Switches 15: ;LD A,39 16: 651+11 00E2 D304 OUT (CS_CTC_0),A 17: - 00E4 CONSOLE_INIT_SIO: 18: 662+7 00E4 3E30 LD A,00110000b ;write into WR0: error reset, select WR0 19: 669+11 00E6 D309 OUT (CS_SIO_A_C),A 20: 680+7 00E8 3E18 LD a,018h ;write into WR0: channel reset 21: 687+11 00EA D309 OUT (CS_SIO_A_C),A 22: 698+7 00EC 3E04 LD a,004h ;write into WR0: select WR4 23: 705+11 00EE D309 OUT (CS_SIO_A_C),A 24: 716+7 00F0 3E44 LD a,01000100b ;write into WR4: clkx16,1 stop bit, no parity 25: 723+11 00F2 D309 OUT (CS_SIO_A_C),A 26: 734+7 00F4 3E05 LD a,005h ;write into WR0: select WR5 27: 741+11 00F6 D309 OUT (CS_SIO_A_C),A 28: 752+7 00F8 3EE8 LD a,11101000b ;DTR inactive, TX 8bit, BREAK off, TX on, RTS inactive 29: 759+11 00FA D309 OUT (CS_SIO_A_C),A 30: 770+7 00FC 3E01 LD a,01h ;write into WR0: select WR1 31: 777+11 00FE D309 OUT (CS_SIO_A_C),A 32: 788+7 0100 3E04 LD a,00000100b ;no interrupt in CH B, special RX condition affects vect 33: 795+11 0102 D309 OUT (CS_SIO_A_C),A 34: 806+7 0104 3E02 LD a,02h ;write into WR0: select WR2 35: 813+11 0106 D309 OUT (CS_SIO_A_C),A 36: 824+7 0108 3E00 LD a,0h ;write into WR2: cmd line int vect (see int vec table) 37: ;bits D3,D2,D1 are changed according to RX condition 38: 831+11 010A D309 OUT (CS_SIO_A_C),A 39: 842+7 010C 3E03 LD a,003h ;write into WR0: select WR3 40: 849+11 010E D309 OUT (CS_SIO_A_C),A 41: 860+7 0110 3EC1 LD a,0C1h ;RX 8bit, auto enable off, RX on 42: 867+11 0112 D309 OUT (CS_SIO_A_C),A 43: ;Channel A RX active 44: 878+10 0114 C9 RET 45: 46: ; A contains char 47: ; Destroys A 48: - 0115 print_char: 49: 888+11 0115 F5 push af 50: 899+11 0116 D308 out (CS_SIO_A_D),a 51: 910+17 0118 CD3801 call print_wait_out 52: 927+10 011B F1 pop af 53: ;call print_char 54: 937+10 011C C9 ret 55: ; HL contains pointer to string 56: ; Destroy A, HL 57: 58: - 011D print_str: 59: 947+7 011D 7E ld a, (hl) 60: 954+4 011E B7 or a 61: 958+5+6 011F C8 ret z 62: 963+17 0120 CD1501 call print_char 63: 980+6 0123 23 inc hl 64: 986+12 0124 18F7 jr print_str 65: 66: 67: - 0126 print_clear: 68: 998+10 0126 21B601 ld hl, [MSG_CLEAR] 69: 1008+17 0129 CD1D01 call print_str 70: 1025+10 012C C9 ret 71: 72: - 012D print_newLine: 73: 1035+7 012D 3E0A ld a,10 74: 1042+17 012F CD1501 call print_char 75: 1059+7 0132 3E0D ld a,13 76: 1066+17 0134 CD1501 call print_char 77: 1083+10 0137 C9 ret 78: ; destroys a 79: - 0138 print_wait_out: 80: ; check for TX buffer empty 81: 1093+4 0138 97 sub a ;clear a, write into WR0: select RR0 82: 1097+4 0139 3C inc a ;select RR1 83: 1101+11 013A D309 out (CS_SIO_A_C),A 84: 1112+11 013C DB09 in A,(CS_SIO_A_C) ;read RRx 85: 1123+8 013E CB47 bit 0,A 86: 1131+7+5 0140 28F6 jr z,print_wait_out 87: 1138+10 0142 C9 ret 88: 89: - 0143 print_a_hex: 90: 1148+11 0143 F5 push af 91: 1159+11 0144 C5 push bc 92: 1170+11 0145 D5 push de 93: 1181+17 0146 CD6C02 call STRCONV_BYTES_TO_HEX 94: 1198+4 0149 78 ld a,b 95: 1202+17 014A CD1501 call print_char 96: 1219+4 014D 79 ld a,c 97: 1223+17 014E CD1501 call print_char 98: 1240+10 0151 D1 pop de 99: 1250+10 0152 C1 pop bc 100: 1260+10 0153 F1 pop af 101: 1270+10 0154 C9 ret 102: 103: - 0155 print_bcd: 104: 1280+7 0155 C630 ADD 48 ;offset for ascii number 105: 1287+17 0157 CD1501 call print_char 106: 1304+10 015A C9 ret 107: 108: - 015B read_char: 109: 1314+17 015B CDC701 call A_RTS_ON 110: 1331+4 015E 00 nop 111: 1335+4 015F AF xor a ; a = 0 112: 1339+11 0160 D309 out (CS_SIO_A_C), a ; select reg 0 113: 1350+11 0162 DB09 in a, (CS_SIO_A_C) ; read reg 0 114: 1361+7 0164 E601 and 1 ; mask D0 (recieve char available) 115: 1368+17 0166 CDBE01 call A_RTS_OFF 116: 1385+5+6 0169 C8 ret Z ; return 0 if no char 117: 1390+11 016A DB08 in a, (CS_SIO_A_D) ; read char if avail 118: 1401+10 016C C9 ret ; return 119: 120: 121: - 016D read_in_sts: 122: 1411+11 016D D309 out (CS_SIO_A_C), a ; select reg 0 123: 1422+11 016F DB09 in a, (CS_SIO_A_C) ; read reg 0 124: 1433+7 0171 E601 and 1 ; mask D0 (recieve char available) 125: 1440+5+6 0173 C8 ret z 126: 1445+7 0174 3EFF ld a, 0xFF 127: 1452+10 0176 C9 ret 128: 129: - 0177 read_bcd; 130: 1462+17 0177 CD5B01 call read_char 131: 1479+10 017A CA7701 jp z, read_bcd 132: 1489+17 017D CD1501 call print_char 133: 1506+7 0180 DE30 sbc 48 ;remove ascii offset 134: 1513+10 0182 DA8D01 jp c, _read_bcd_invalid ;if carry, wrong input 135: 1523+7 0185 FE0A cp 10 136: 1530+10 0187 CA8D01 jp z, _read_bcd_invalid ;if equal or greater than 10, also error 137: 1540+7 018A E60F and 0x0F ;mask unused bits 138: 1547+10 018C C9 ret 139: - 018D _read_bcd_invalid 140: 1557+7 018D 3EFF ld a, 0xFF 141: 1564+10 018F C9 ret 142: 143: - 0190 print_32_hex: 144: 1574+19 0190 DD7E03 ld a,(ix+3) 145: 1593+17 0193 CD4301 call print_a_hex 146: 1610+19 0196 DD7E02 ld a,(ix+2) 147: 1629+17 0199 CD4301 call print_a_hex 148: 1646+19 019C DD7E01 ld a,(ix+1) 149: 1665+17 019F CD4301 call print_a_hex 150: 1682+19 01A2 DD7E00 ld a,(ix+0) 151: 1701+17 01A5 CD4301 call print_a_hex 152: 1718+10 01A8 C9 ret 153: 154: - 01A9 print_16_hex: 155: 1728+19 01A9 DD7E01 ld a,(ix+1) 156: 1747+17 01AC CD4301 call print_a_hex 157: 1764+19 01AF DD7E00 ld a,(ix+0) 158: 1783+17 01B2 CD4301 call print_a_hex 159: 1800+10 01B5 C9 ret 160: 161: 162: ;MSG_CRSR_0: 163: ; db 0x1B, "[?25h",0 164: ;MSG_CRSR_1: 165: ; db 0x1B, "[?25l",0 166: - 01B6 MSG_CLEAR: 167: - 01B6 1B5B324A db 27, '[2J', 27, '[H',0 1B5B4800 168: 169: 170: 171: ; Serial Util Functions 172: - 01BE A_RTS_OFF: 173: 1810+7 01BE 3E05 ld a,005h ;write into WR0: select WR5 174: 1817+11 01C0 D309 out (CS_SIO_A_C),A 175: 1828+7 01C2 3E68 ld a,068h ;DTR inactive, TX 8bit, BREAK off, TX on, RTS inactive 176: 1835+11 01C4 D309 out (CS_SIO_A_C),A 177: 1846+10 01C6 C9 ret 178: - 01C7 A_RTS_ON: 179: 1856+7 01C7 3E05 ld a,005h ;write into WR0: select WR5 180: 1863+11 01C9 D309 out (CS_SIO_A_C),A 181: 1874+7 01CB 3EEA ld a,0EAh ;DTR active, TX 8bit, BREAK off, TX on, RTS active 182: 1881+11 01CD D309 out (CS_SIO_A_C),A 183: 1892+10 01CF C9 ret 184: 185: ;------------------------------------------------------------------------------ 186: ; PRINTINLINE 187: ; 188: ; String output function 189: ; 190: ; Prints in-line data (bytes immediately following the PRINTINLINE call) 191: ; until a string terminator is encountered (0 - null char). 192: ;------------------------------------------------------------------------------ 193: - 01D0 PRINTINLINE: 194: 1902+19 01D0 E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL 195: 1921+11 01D1 F5 PUSH AF 196: 1932+11 01D2 C5 PUSH BC 197: - 01D3 nxtILC: 198: 1943+7 01D3 7E LD A,(HL) 199: 1950+7 01D4 FE00 CP 0 200: 1957+7+5 01D6 2806 JR Z,endPrint 201: 1964+17 01D8 CD1501 CALL print_char 202: 1981+6 01DB 23 INC HL 203: 1987+12 01DC 18F5 JR nxtILC 204: - 01DE endPrint: 205: 1999+6 01DE 23 INC HL ; Get past "null" terminator 206: 2005+10 01DF C1 POP BC 207: 2015+10 01E0 F1 POP AF 208: 2025+19 01E1 E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL 209: 2044+10 01E2 C9 RET 210: 211: - 01E3 print_reg: 212: 2054+11 01E3 F5 push af 213: 2065+11 01E4 D5 push de 214: 2076+11 01E5 C5 push bc 215: 2087+11 01E6 E5 push hl 216: 2098+11 01E7 F5 push af 217: 2109+17 01E8 CDD001 call PRINTINLINE 218: - 01EB 0A0D413A db 10,13,"A: ",0 202000 219: 2126+10 01F2 F1 pop af 220: 2136+17 01F3 CD4301 call print_a_hex 221: 2153+17 01F6 CDD001 call PRINTINLINE 222: - 01F9 0A0D4243 db 10,13,"BC: ",0 3A2000 223: 2170+4 0200 78 ld a,b 224: 2174+17 0201 CD4301 call print_a_hex 225: 2191+4 0204 79 ld a,c 226: 2195+17 0205 CD4301 call print_a_hex 227: 2212+17 0208 CDD001 call PRINTINLINE 228: - 020B 0A0D4445 db 10,13,"DE: ",0 3A2000 229: 2229+4 0212 7A ld a,d 230: 2233+17 0213 CD4301 call print_a_hex 231: 2250+4 0216 7B ld a,e 232: 2254+17 0217 CD4301 call print_a_hex 233: 2271+10 021A F1 pop af 234: 2281+17 021B CDD001 call PRINTINLINE 235: - 021E 0A0D484C db 10,13,"HL: ",0 3A2000 236: 2298+4 0225 7C ld a,h 237: 2302+17 0226 CD4301 call print_a_hex 238: 2319+4 0229 7D ld a,l 239: 2323+17 022A CD4301 call print_a_hex 240: 2340+17 022D CD2D01 call print_newLine 241: 2357+10 0230 E1 pop hl 242: 2367+10 0231 C1 pop bc 243: 2377+10 0232 D1 pop de 244: 2387+10 0233 F1 pop af **** main.asm **** 180: 2397+10 0234 C9 ret 181: .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: - 0235 DHEX_TO_BYTE: 7: 2407+11 0235 E5 PUSH HL ;Backup pointer 8: ; Load First Byte 9: 2418+7 0236 7E LD A,(HL) ;Load first char (high) 10: 2425+17 0237 CD5502 CALL HEX_TO_BIN ;Conv chart to 4bit 11: 2442+7+5 023A 3815 jr C, DHEX_TO_BYTE_FAILED ;If error jmp to DHEX_TO_BYTE_FAILED 12: 2449+8 023C CB27 SLA A ;shift result to upper 4 bits 13: 2457+8 023E CB27 SLA A 14: 2465+8 0240 CB27 SLA A 15: 2473+8 0242 CB27 SLA A 16: 2481+4 0244 57 LD D,A ;store result in D 17: 18: 2485+6 0245 23 INC HL ;next byte 19: 2491+7 0246 7E LD A,(HL) ;load 2nd char (lower) 20: 2498+17 0247 CD5502 CALL HEX_TO_BIN ;Conv chart to 4bit 21: 2515+7+5 024A 3805 jr C, DHEX_TO_BYTE_FAILED ;If error jmp to DHEX_TO_BYTE_FAILED 22: 2522+4 024C B2 OR D ;merge D with accumulator 23: 24: 2526+10 024D E1 POP HL ;restor original pointer 25: 2536+7 024E 1E00 LD E,0x00 ;set error to 0x00 = no error 26: 2543+10 0250 C9 RET 27: - 0251 DHEX_TO_BYTE_FAILED: 28: 2553+7 0251 1EFF LD E,0xFF ;set error to oxFF 29: ;LD A,0x00 30: 2560+10 0253 E1 POP HL 31: 2570+10 0254 C9 RET 32: 33: ; REG A Contains CHAR-Low 34: ; If failed, Carry is set 35: - 0255 HEX_TO_BIN: 36: 2580+7 0255 D630 SUB 48 ; 0 is 0 37: 2587+10 0257 EA6A02 jp PE, HEX_TO_INVALID_2; to low (SUB overflow) 38: 2597+7 025A FE0A CP 10 ; Value is between 0 and 9 39: 2604+7+5 025C 3805 JR C, HEX_TO_BIN_2 40: 2611+7 025E D607 SUB 7 41: 2618+10 0260 EA6A02 jp PE, HEX_TO_INVALID_2; to low (SUB overflow) 42: - 0263 HEX_TO_BIN_2: 43: 2628+7 0263 FE10 CP 16 44: 2635+7+5 0265 3003 JR NC, HEX_TO_INVALID_2; if bigger than 15-> fail 45: 2642+7 0267 E60F AND 0x0F 46: 2649+10 0269 C9 RET 47: - 026A HEX_TO_INVALID_2: 48: 2659+4 026A 37 SCF ;set carry flag 49: 2663+10 026B 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: - 026C STRCONV_BYTES_TO_HEX: 63: 2673+11 026C F5 PUSH AF;Backup A Register 64: 2684+4 026D 1F RRA 65: 2688+4 026E 1F RRA 66: 2692+4 026F 1F RRA 67: 2696+4 0270 1F RRA 68: 2700+17 0271 CD7B02 CALL STRCONV_BYTES_TO_HEX_1 69: ;LD A,D 70: 2717+4 0274 47 LD B,A 71: 2721+10 0275 F1 POP AF ; Reload first Byte 72: 2731+17 0276 CD7B02 CALL STRCONV_BYTES_TO_HEX_1 73: ;LD A,D 74: 2748+4 0279 4F LD C,A 75: 2752+10 027A C9 RET 76: 77: - 027B STRCONV_BYTES_TO_HEX_1: 78: 2762+7 027B E60F AND 0x0F 79: 2769+7 027D C630 ADD 48 80: 2776+7 027F FE3A CP 58 ; Check if less than 58 (less than ASCII 9) 81: ;JR C, STRCONV_BYTES_TO_HEX_2 82: 2783+5+6 0281 D8 RET C 83: 2788+7 0282 C607 ADD 7 ; A-F 84: 2795+10 0284 C9 RET 85: - 0285 STRCONV_BYTES_TO_HEX_2: 86: ;LD D,A 87: 2805+10 0285 C9 RET 88: 89: **** main.asm **** 182: .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: - 0286 disassemble: 12: 2815+4 0286 78 ld a,b 13: 2819+13 0287 321A41 ld (var_bytes_count),a 14: - 028A disassemble_next: 15: 16: 17: 2832+16 028A 221041 ld (var_opcode_start), hl ;16 bit pointer to opcode in mem 18: 2848+7 028D 7E ld a,(hl) ;load opcode to find in A 19: 2855+13 028E 321441 ld (var_opcode), a ;8 bit opcode value 20: 2868+6 0291 23 inc hl 21: 2874+7 0292 7E ld a,(hl) ;load opcode to find in A 22: 2881+13 0293 321541 ld (var_opcode_x), a ;8 bit opcode extended value 23: 2894+6 0296 2B dec hl 24: 2900+17 0297 CD7A03 call disassemble_table_seek 25: 2917+4 029A 78 ld a,b 26: 2921+4 029B B1 or c 27: 2925+10 029C CA5C03 jp z, disassemble_err ;if bc==0000h 28: 29: 2935+20 029F ED431241 ld (var_opcode_table), bc ;16 bit pointer to opcode in table 30: 31: ;load params 32: 2955+6 02A3 03 inc bc 33: 2961+6 02A4 03 inc bc 34: 2967+6 02A5 03 inc bc 35: 2973+6 02A6 03 inc bc 36: 2979+7 02A7 0A ld a,(bc) 37: 2986+13 02A8 321641 ld (var_opcode_length),A ;8 bit opcode length (in bytes) 38: 2999+6 02AB 03 inc bc 39: 3005+7 02AC 0A ld a, (bc) 40: 3012+4 02AD 5F ld e,a 41: 3016+6 02AE 03 inc bc 42: 3022+7 02AF 0A ld a, (bc) 43: 3029+4 02B0 57 ld d,a 44: 3033+20 02B1 ED531741 ld (var_opcode_string),de ;16 bit pointer to opcode string 45: 3053+6 02B5 03 inc bc 46: 3059+7 02B6 0A ld a,(bc) 47: 3066+13 02B7 321941 ld (var_opcode_pcount),A ;8 bit opcode param count 48: 49: ;values are prepared. Continue with print 50: 51: 3079+16 02BA 2A1041 ld hl,(var_opcode_start) ;print address 52: 3095+17 02BD CDC203 call dasm_print16hex_addr 53: 54: 3112+13 02C0 3A1641 ld a,(var_opcode_length) 55: 3125+4 02C3 47 ld b, a 56: 57: ;print up to 4 opcode bytes 58: 3129+16 02C4 2A1041 ld hl,(var_opcode_start) 59: 60: - 02C7 disassemble_print_opcode_raw 61: 3145+7 02C7 7E ld a,(hl) ;load first byte 62: 3152+17 02C8 CD4301 call print_a_hex 63: 3169+6 02CB 23 inc hl 64: 3175+8+5 02CC 10F9 djnz disassemble_print_opcode_raw 65: 66: 3183+7 02CE 3E68 ld a,"h" 67: 3190+17 02D0 CD1501 call print_char 68: ;fill empty spots 69: 3207+13 02D3 3A1641 ld a,(var_opcode_length) 70: 3220+4 02D6 47 ld b,a 71: 3224+7 02D7 3E06 ld a,6 72: 3231+4 02D9 90 sub b 73: 3235+4 02DA 47 ld b,a 74: 75: - 02DB disassemble_print_opcode_raw_fill: 76: 3239+7 02DB 3E20 ld a," " 77: 3246+17 02DD CD1501 call print_char 78: 3263+7 02E0 3E20 ld a," " 79: 3270+17 02E2 CD1501 call print_char 80: 3287+8+5 02E5 10F4 djnz disassemble_print_opcode_raw_fill 81: 3295+7 02E7 3E20 ld a," " 82: 3302+17 02E9 CD1501 call print_char 83: 84: 3319+11 02EC E5 push hl 85: ;print opcode 86: 3330+16 02ED 2A1741 ld hl,(var_opcode_string) 87: 3346+17 02F0 CD1D01 call print_str 88: 89: 90: ;print params 91: 3363+13 02F3 3A1941 ld a,(var_opcode_pcount) 92: 3376+4 02F6 B7 or a 93: 3380+10 02F7 CA5903 jp z, disassemble_print_opcode_params_end ;skip if no params 94: 95: 3390+16 02FA 2A1241 ld hl,(var_opcode_table) 96: 3406+10 02FD 010800 ld bc, 8 97: 3416+11 0300 09 add hl,bc ;hl now has address of first param 98: 3427+13 0301 3A1941 ld a,(var_opcode_pcount) 99: 3440+4 0304 47 ld b,a 100: - 0305 disassemble_print_opcode_params_loop: 101: ;ld a,(hl) ;load param 102: ;call print_a_hex 103: 3444+7 0305 7E ld a,(hl) ;load param 104: 105: 3451+7 0306 FE01 cp 0x01 106: 3458+10+7 0308 CCE803 call z, param_01 107: 3468+7 030B FE02 cp 0x02 108: 3475+10+7 030D CC0F04 call z, param_02 109: 3485+7 0310 FE03 cp 0x03 110: 3492+10+7 0312 CC2C04 call z, param_03 111: 3502+7 0315 FE04 cp 0x04 112: 3509+10+7 0317 CC6804 call z, param_04 113: 3519+7 031A FE05 cp 0x05 114: 3526+10+7 031C CC7E04 call z, param_05 115: 3536+7 031F FE06 cp 0x06 116: 3543+10+7 0321 CC8B04 call z, param_06 117: 3553+7 0324 FE07 cp 0x07 118: 3560+10+7 0326 CCA504 call z, param_07 119: 3570+7 0329 FE08 cp 0x08 120: 3577+10+7 032B CCB204 call z, param_08 121: 3587+7 032E FE09 cp 0x09 122: 3594+10+7 0330 CCC704 call z, param_09 123: 3604+7 0333 FE10 cp 0x10 124: 3611+10+7 0335 CCDC04 call z, param_10 125: 3621+7 0338 FE11 cp 0x11 126: 3628+10+7 033A CCEC04 call z, param_11 127: 3638+7 033D FE12 cp 0x12 128: 3645+10+7 033F CCF404 call z, param_12 129: 3655+7 0342 FE13 cp 0x13 130: 3662+10+7 0344 CC2C05 call z, param_13 131: 3672+7 0347 FE0A cp 0x0A 132: 3679+10+7 0349 CCBE04 call z, param_0A 133: ;strings 134: 3689+7 034C FE80 cp 0x80 135: 3696+10+7 034E CC4B05 call z, param_80 136: 3706+7 0351 FE81 cp 0x81 137: 3713+10+7 0353 CC4205 call z, param_81 138: 3723+6 0356 23 inc hl 139: 3729+8+5 0357 10AC djnz disassemble_print_opcode_params_loop 140: - 0359 disassemble_print_opcode_params_end: 141: 3737+10 0359 E1 pop hl 142: 3747+12 035A 1810 jr disassemble_continue 143: 144: 145: - 035C disassemble_err: 146: 3759+17 035C CDC203 call dasm_print16hex_addr 147: 3776+7 035F 7E ld a,(hl) 148: 3783+17 0360 CDDA03 call dasm_print8hex ;print value 149: 3800+6 0363 23 inc hl 150: 3806+11 0364 E5 push hl 151: 3817+10 0365 21970D ld hl, [dasm_UU] 152: 3827+17 0368 CD1D01 call print_str 153: 3844+10 036B E1 pop hl 154: 155: - 036C disassemble_continue: 156: 157: 3854+17 036C CD2D01 call print_newLine 158: ;inc hl 159: 3871+13 036F 3A1A41 ld a,(var_bytes_count) 160: 3884+4 0372 3D dec a 161: 3888+13 0373 321A41 ld (var_bytes_count),a 162: 3901+10 0376 C28A02 jp nz, disassemble_next 163: 3911+10 0379 C9 ret 164: 165: 166: 167: ;A contains opcode 168: ;BC contains returned position 169: - 037A disassemble_table_seek: 170: 3921+11 037A E5 push hl 171: 3932+10 037B 219505 ld hl, [dasm_opcode_table] 172: - 037E disassemble_table_seek_loop: 173: 3942+13 037E 3A1441 ld a,(var_opcode) 174: 3955+4 0381 4F ld c,a 175: 3959+7 0382 7E ld a,(hl) 176: 3966+7 0383 FEFF cp 0xFF ; if null 177: 3973+10 0385 CABC03 jp z, disassemble_table_notfound 178: 179: ;apply mask 180: 3983+11 0388 F5 push af 181: 3994+6 0389 23 inc hl 182: 4000+7 038A 46 ld b,(hl) ;load mask 183: 4007+6 038B 2B dec hl 184: 4013+4 038C 79 ld a,c 185: 4017+4 038D A0 and b ;apply mask 186: 4021+4 038E 4F ld c,a 187: 4025+10 038F F1 pop af 188: 189: 4035+4 0390 B9 cp c ; if match 190: 4039+7+5 0391 280B jr z, disassemble_table_first_match 191: 4046+7 0393 0600 ld b,0 192: 4053+7 0395 0E07 ld c,7 193: 4060+11 0397 09 add hl,bc 194: 4071+7 0398 7E ld a,(hl) 195: 4078+4 0399 4F ld c,a 196: 4082+11 039A 09 add hl,bc 197: 4093+6 039B 23 inc hl 198: 4099+12 039C 18E0 jr disassemble_table_seek_loop 199: 200: - 039E disassemble_table_first_match 201: 4111+6 039E 23 inc hl 202: 4117+6 039F 23 inc hl 203: 4123+7 03A0 4E ld c,(hl) ;load opcode x from table 204: 4130+6 03A1 23 inc hl 205: 4136+13 03A2 3A1541 ld a,(var_opcode_x) ;load current opcode x 206: 4149+7 03A5 46 ld b,(hl) ;load mask 207: 4156+4 03A6 A0 and b ;apply mask 208: 4160+4 03A7 B9 cp c ;compare to table 209: 4164+6 03A8 2B dec hl 210: 4170+6 03A9 2B dec hl 211: 4176+6 03AA 2B dec hl 212: 4182+7+5 03AB 280B jr z, disassemble_table_found ;IF FOUND 213: 4189+7 03AD 0600 ld b,0 ;else continue with next 214: 215: 4196+7 03AF 0E07 ld c,7 216: 4203+11 03B1 09 add hl,bc 217: 4214+7 03B2 7E ld a,(hl) 218: 4221+4 03B3 4F ld c,a 219: 4225+11 03B4 09 add hl,bc 220: 4236+6 03B5 23 inc hl 221: 4242+12 03B6 18C6 jr disassemble_table_seek_loop 222: 223: - 03B8 disassemble_table_found 224: 4254+4 03B8 44 ld b,H 225: 4258+4 03B9 4D ld c,l 226: 4262+10 03BA E1 pop hl 227: 4272+10 03BB C9 ret 228: 229: - 03BC disassemble_table_notfound 230: 4282+7 03BC 0600 ld b,0 231: 4289+7 03BE 0E00 ld c,0 232: 4296+10 03C0 E1 pop hl 233: 4306+10 03C1 C9 ret 234: 235: 236: 237: 238: - 03C2 dasm_print16hex_addr: 239: 4316+7 03C2 3E24 ld a,"$" 240: 4323+17 03C4 CD1501 call print_char 241: 4340+4 03C7 7C ld a,h 242: 4344+17 03C8 CD4301 call print_a_hex 243: 4361+4 03CB 7D ld a,l 244: 4365+17 03CC CD4301 call print_a_hex 245: 4382+7 03CF 3E68 ld a,"h" 246: 4389+17 03D1 CD1501 call print_char 247: 4406+7 03D4 3E20 ld a," " 248: 4413+17 03D6 CD1501 call print_char 249: 4430+10 03D9 C9 ret 250: 251: - 03DA dasm_print8hex: 252: 4440+17 03DA CD4301 call print_a_hex 253: 4457+7 03DD 3E68 ld a,"h" 254: 4464+17 03DF CD1501 call print_char 255: 4481+7 03E2 3E20 ld a," " 256: 4488+17 03E4 CD1501 call print_char 257: 4505+10 03E7 C9 ret 258: 259: 260: 261: 262: 263: 264: 265: - 03E8 param_01: ; 0x01 16bit address pointer 266: 4515+11 03E8 E5 push hl 267: 4526+20 03E9 ED5B1041 ld de,(var_opcode_start) 268: 4546+6 03ED 13 inc de 269: 4552+7 03EE 1A ld a,(de) 270: 4559+4 03EF 6F ld l,a 271: 4563+6 03F0 13 inc de 272: 4569+7 03F1 1A ld a,(de) 273: 4576+4 03F2 67 ld h,a 274: 275: 4580+7 03F3 3E24 ld a,"$" 276: 4587+17 03F5 CD1501 call print_char 277: 4604+4 03F8 7C ld a,h 278: 4608+17 03F9 CD4301 call print_a_hex 279: 4625+4 03FC 7D ld a,l 280: 4629+17 03FD CD4301 call print_a_hex 281: 4646+7 0400 3E68 ld a,"h" 282: 4653+17 0402 CD1501 call print_char 283: 4670+7 0405 3E20 ld a," " 284: 4677+17 0407 CD1501 call print_char 285: 4694+17 040A CD8605 call param_comma 286: 4711+10 040D E1 pop hl 287: 4721+10 040E C9 ret 288: 289: - 040F param_02: 290: 4731+11 040F C5 push bc 291: 4742+20 0410 ED5B1041 ld de,(var_opcode_start) 292: 4762+7 0414 1A ld a,(de) 293: 4769+4 0415 1F rra 294: 4773+4 0416 1F rra 295: 4777+7 0417 E60E and 0x0E 296: 297: 4784+11 0419 E5 push hl 298: 4795+10 041A 21A00D ld hl, [dasm_printFlags_table] 299: 4805+7 041D 0600 ld b,0 300: 4812+4 041F 4F ld c,a 301: 4816+11 0420 09 add hl,bc 302: 4827+17 0421 CD1D01 call print_str 303: 4844+7 0424 3E20 ld a, " " 304: 4851+17 0426 CD1501 call print_char 305: 4868+10 0429 E1 pop hl 306: 4878+10 042A C1 pop bc 307: 4888+10 042B C9 ret 308: 309: 310: - 042C param_03: 311: 4898+20 042C ED5B1041 ld de,(var_opcode_start) 312: 4918+6 0430 13 inc de 313: 4924+7 0431 1A ld a,(de) 314: 315: 4931+11 0432 F5 push af 316: 4942+7 0433 E680 and 0x80 317: 4949+10 0435 C24D04 jp nz, param_03_neg 318: 4959+7 0438 3E24 ld a,"$" 319: 4966+17 043A CD1501 call print_char 320: 4983+7 043D 3E2B ld a,"+" 321: 4990+17 043F CD1501 call print_char 322: 5007+10 0442 F1 pop af 323: 5017+17 0443 CD4301 call print_a_hex 324: 5034+7 0446 3E68 ld a,"h" 325: 5041+17 0448 CD1501 call print_char 326: 5058+12 044B 1817 jr param_03_done 327: 328: - 044D param_03_neg: 329: 5070+7 044D 3E24 ld a,"$" 330: 5077+17 044F CD1501 call print_char 331: 5094+7 0452 3E2D ld a,"-" 332: 5101+17 0454 CD1501 call print_char 333: 5118+10 0457 F1 pop af 334: 5128+8 0458 ED44 neg 335: 5136+17 045A CD4301 call print_a_hex 336: 5153+7 045D 3E68 ld a,"h" 337: 5160+17 045F CD1501 call print_char 338: 5177+12 0462 1800 jr param_03_done 339: 340: - 0464 param_03_done: 341: 5189+17 0464 CD8605 call param_comma 342: 5206+10 0467 C9 ret 343: 344: 345: - 0468 param_04: 346: 5216+20 0468 ED5B1041 ld de,(var_opcode_start) 347: 5236+6 046C 13 inc de 348: 5242+7 046D 1A ld a,(de) 349: 5249+7 046E FE4D cp 0x4D 350: 5256+7+5 0470 2806 jr z,param_04_i 351: 5263+7 0472 3E4E ld a,"N" 352: 5270+17 0474 CD1501 call print_char 353: 5287+10 0477 C9 ret 354: - 0478 param_04_i: 355: 5297+7 0478 3E49 ld a,"I" 356: 5304+17 047A CD1501 call print_char 357: 5321+10 047D C9 ret 358: 359: - 047E param_05: 360: 5331+11 047E C5 push bc 361: 5342+20 047F ED5B1041 ld de,(var_opcode_start) 362: 5362+7 0483 1A ld a,(de) 363: 5369+7 0484 E638 and 0x38 364: ; print hex char 365: 5376+17 0486 CDDA03 call dasm_print8hex 366: 5393+10 0489 C1 pop bc 367: 5403+10 048A C9 ret 368: 369: 370: - 048B param_06: 371: 5413+11 048B C5 push bc 372: 5424+20 048C ED5B1041 ld de,(var_opcode_start) 373: 5444+7 0490 1A ld a,(de) 374: 5451+4 0491 1F rra 375: 5455+4 0492 1F rra 376: 5459+4 0493 1F rra 377: 5463+7 0494 E607 and 0x07 378: 5470+17 0496 CD6105 call param_printRegister 379: 5487+7 0499 3E20 ld a," " 380: 5494+17 049B CD1501 call print_char 381: 5511+7 049E 3E2C ld a,"," 382: 5518+17 04A0 CD1501 call print_char 383: 5535+10 04A3 C1 pop bc 384: 5545+10 04A4 C9 ret 385: 386: - 04A5 param_07: 387: 5555+11 04A5 C5 push bc 388: 5566+20 04A6 ED5B1041 ld de,(var_opcode_start) 389: 5586+7 04AA 1A ld a,(de) 390: 5593+7 04AB E607 and 0x07 391: 392: 5600+17 04AD CD6105 call param_printRegister 393: 5617+10 04B0 C1 pop bc 394: 5627+10 04B1 C9 ret 395: 396: - 04B2 param_08: 397: 5637+11 04B2 C5 push bc 398: 5648+20 04B3 ED5B1041 ld de,(var_opcode_start) 399: 5668+6 04B7 13 inc de 400: 5674+7 04B8 1A ld a,(de) 401: 5681+17 04B9 CDDA03 call dasm_print8hex 402: 5698+10 04BC C1 pop bc 403: 5708+10 04BD C9 ret 404: 405: 406: - 04BE param_0A: 407: 5718+11 04BE E5 push hl 408: 5729+20 04BF ED5B1041 ld de,(var_opcode_start) 409: 5749+6 04C3 13 inc de 410: 5755+6 04C4 13 inc de 411: 5761+12 04C5 1806 jr param_09_0A 412: - 04C7 param_09: 413: 5773+11 04C7 E5 push hl 414: 5784+20 04C8 ED5B1041 ld de,(var_opcode_start) 415: 5804+6 04CC 13 inc de 416: - 04CD param_09_0A: 417: 5810+7 04CD 1A ld a,(de) 418: 5817+4 04CE 6F ld l,a 419: 5821+6 04CF 13 inc de 420: 5827+7 04D0 1A ld a,(de) 421: 5834+4 04D1 67 ld h,a 422: 5838+4 04D2 7C ld a,h 423: 5842+17 04D3 CD4301 call print_a_hex 424: 5859+4 04D6 7D ld a,l 425: 5863+17 04D7 CD4301 call print_a_hex 426: 5880+10 04DA E1 pop hl 427: 5890+10 04DB C9 ret 428: 429: - 04DC param_10: 430: 5900+11 04DC C5 push bc 431: 5911+20 04DD ED5B1041 ld de,(var_opcode_start) 432: 5931+7 04E1 1A ld a,(de) 433: 5938+4 04E2 1F rra 434: 5942+4 04E3 1F rra 435: 5946+4 04E4 1F rra 436: 5950+7 04E5 E607 and 0x07 437: 5957+17 04E7 CD6105 call param_printRegister 438: 5974+10 04EA C1 pop bc 439: 5984+10 04EB C9 ret 440: 441: 442: - 04EC param_11: 443: 5994+11 04EC E5 push hl 444: 6005+11 04ED C5 push bc 445: 6016+20 04EE ED5B1041 ld de,(var_opcode_start) 446: 6036+12 04F2 1807 jr param_11_12 447: - 04F4 param_12: 448: 6048+11 04F4 E5 push hl 449: 6059+11 04F5 C5 push bc 450: 6070+20 04F6 ED5B1041 ld de,(var_opcode_start) 451: 6090+6 04FA 13 inc de 452: 453: - 04FB param_11_12: 454: 6096+7 04FB 1A ld a,(de) 455: 6103+4 04FC 1F rra 456: 6107+4 04FD 1F rra 457: 6111+4 04FE 1F rra 458: 6115+7 04FF E606 and 0x06 459: 6122+11 0501 F5 push af 460: ;check which table to use 461: 6133+16 0502 2A1041 ld hl, (var_opcode_start) 462: 6149+7 0505 7E ld a,(hl) 463: 6156+7 0506 FEDD cp 0xDD 464: 6163+7+5 0508 2809 jr z,param_11_12_ix 465: 6170+7 050A FEFD cp 0xFD 466: 6177+7+5 050C 280A jr z,param_11_12_iy 467: - 050E param_11_12_def: 468: 6184+10 050E 21B00D ld hl, [dasm_printRegister8_table] 469: 6194+12 0511 1808 jr param_11_12_all 470: - 0513 param_11_12_ix: 471: 6206+10 0513 21B80D ld hl, [dasm_printRegisterIX_table] 472: 6216+12 0516 1803 jr param_11_12_all 473: - 0518 param_11_12_iy: 474: 6228+10 0518 21C00D ld hl, [dasm_printRegisterIY_table] 475: - 051B param_11_12_all: 476: 6238+10 051B F1 pop af 477: 6248+7 051C 0600 ld b,0 478: 6255+4 051E 4F ld c,a 479: 6259+11 051F 09 add hl, bc 480: 6270+7 0520 7E ld a,(hl) 481: 6277+17 0521 CD1501 call print_char 482: 6294+6 0524 23 inc hl 483: 6300+7 0525 7E ld a,(hl) 484: 6307+17 0526 CD1501 call print_char 485: 6324+10 0529 C1 pop bc 486: 6334+10 052A E1 pop hl 487: 6344+10 052B C9 ret 488: 489: - 052C param_13: 490: 6354+11 052C E5 push hl 491: 6365+11 052D C5 push bc 492: 6376+20 052E ED5B1041 ld de,(var_opcode_start) 493: 6396+7 0532 1A ld a,(de) 494: 6403+4 0533 1F rra 495: 6407+4 0534 1F rra 496: 6411+4 0535 1F rra 497: 6415+7 0536 E606 and 0x06 498: 6422+11 0538 F5 push af 499: ;check which table to use 500: 6433+16 0539 2A1041 ld hl, (var_opcode_start) 501: 6449+7 053C 7E ld a,(hl) 502: 6456+10 053D 21C80D ld hl, [dasm_printRegisterSP_table] 503: 6466+12 0540 18D9 jr param_11_12_all ;reuse code from 11_12 504: 505: 506: - 0542 param_81: 507: 6478+11 0542 E5 push hl 508: 6489+11 0543 C5 push bc 509: 6500+16 0544 2A1741 ld hl, (var_opcode_string) 510: 6516+7 0547 0602 ld b,2 511: 6523+12 0549 1807 jr param_80_seek 512: - 054B param_80: 513: 6535+11 054B E5 push hl 514: 6546+11 054C C5 push bc 515: 6557+16 054D 2A1741 ld hl, (var_opcode_string) 516: 6573+7 0550 0601 ld b,1 517: - 0552 param_80_seek: 518: 6580+7 0552 7E ld a,(hl) 519: 6587+6 0553 23 inc hl 520: 6593+4 0554 A7 and a 521: 6597+7+5 0555 20FB jr nz, param_80_seek 522: ;found 523: 6604+4 0557 05 dec b ;found but counter too high 524: 6608+10 0558 C25205 jp nz, param_80_seek 525: 526: 6618+17 055B CD1D01 call print_str 527: 6635+10 055E C1 pop bc 528: 6645+10 055F E1 pop hl 529: 6655+10 0560 C9 ret 530: 531: 532: 533: - 0561 param_printRegister: 534: 6665+11 0561 E5 push hl 535: 6676+7 0562 FE06 cp 0x06 536: 6683+7+5 0564 2811 jr z, param_printRegisterHL 537: 6690+7 0566 FE07 cp 0x07 538: 6697+7+5 0568 2815 jr z, param_printRegisterA 539: 6704+10 056A 21B00D ld hl, [dasm_printRegister8_table] 540: 6714+7 056D 0600 ld b,0 541: 6721+4 056F 4F ld c,a 542: 6725+11 0570 09 add hl,bc 543: 6736+7 0571 7E ld a, (hl) 544: 6743+17 0572 CD1501 call print_char 545: 6760+10 0575 E1 pop hl 546: 6770+10 0576 C9 ret 547: 548: - 0577 param_printRegisterHL: 549: 6780+10 0577 21D00D ld hl, [dasm_printRegister8_table_HL] 550: 6790+17 057A CD1D01 call print_str 551: 6807+10 057D E1 pop hl 552: 6817+10 057E C9 ret 553: 554: - 057F param_printRegisterA: 555: 6827+7 057F 3E41 ld a,"A" 556: 6834+17 0581 CD1501 call print_char 557: 6851+10 0584 E1 pop hl 558: 6861+10 0585 C9 ret 559: 560: 561: - 0586 param_comma: 562: 6871+4 0586 78 ld a,b 563: 6875+7 0587 FE01 cp 1 564: 6882+5+6 0589 C8 ret z 565: 6887+7 058A 3E20 ld a," " 566: 6894+17 058C CD1501 call print_char 567: 6911+7 058F 3E2C ld a,"," 568: 6918+17 0591 CD1501 call print_char **** main.asm **** 183: 6935+10 0594 C9 ret 184: .include "disassembler_table.s" **** include/disassembler_table.s **** 1: ;disassembler tables 2: 3: - 0595 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: - 0595 00FF0000 defb 0x00, 0xFF, 0x00, 0x00, 1, [dasm_00], [dasm_00]>>8,0 ;NOP 01ED0900 29: ;General-Purpose Arithmetic and CPU Control Groups 30: - 059D 27FF0000 defb 0x27, 0xFF, 0x00, 0x00, 1, [dasm_27], [dasm_27]>>8, 0 ;DAA 01B80A00 31: - 05A5 2FFF0000 defb 0x2F, 0xFF, 0x00, 0x00, 1, [dasm_2F], [dasm_2F]>>8, 0 ;CPL 01BC0A00 32: - 05AD EDFF44FF defb 0xED, 0xFF, 0x44, 0xFF, 2, [dasm_ED_44], [dasm_ED_44]>>8, 0 ;NEG 02C00A00 33: - 05B5 3FFF0000 defb 0x3f, 0xFF, 0x00, 0x00, 1, [dasm_3F], [dasm_3F]>>8, 0 ;CCF 01C40A00 34: - 05BD 37FF0000 defb 0x37, 0xFF, 0x00, 0x00, 1, [dasm_37], [dasm_37]>>8, 0 ;SCF 01C80A00 35: ;defb 0x00, 0xFF, 0x00, 0x00, 1, [dasm_00], [dasm_00]>>8,0 ;NOP -> already at top for performance reasons 36: - 05C5 76FF0000 defb 0x76, 0xFF, 0x00, 0x00, 1, [dasm_76], [dasm_76]>>8, 0 ;HALT 01CC0A00 37: - 05CD F3FF0000 defb 0xF3, 0xFF, 0x00, 0x00, 1, [dasm_F3], [dasm_F3]>>8, 0 ;DI 01D10A00 38: - 05D5 FBFF0000 defb 0xFB, 0xFF, 0x00, 0x00, 1, [dasm_FB], [dasm_FB]>>8, 0 ;EI 01D40A00 39: - 05DD EDFF46FF defb 0xED, 0xFF, 0x46, 0xFF, 2, [dasm_ED_46], [dasm_ED_46]>>8, 0 ;IM 0 02D70A00 40: - 05E5 EDFF56FF defb 0xED, 0xFF, 0x56, 0xFF, 2, [dasm_ED_56], [dasm_ED_56]>>8, 0 ;IM 1 02DC0A00 41: - 05ED EDFF5EFF defb 0xED, 0xFF, 0x5E, 0xFF, 2, [dasm_ED_5E], [dasm_ED_5E]>>8, 0 ;IM 2 02E10A00 42: 43: ;Exchange, Block Transfer, and Search Group 44: - 05F5 EBFF0000 defb 0xEB, 0xFF, 0x00, 0x00, 1, [dasm_BE], [dasm_BE]>>8, 0 ;EX DE, HL 01E60A00 45: - 05FD 08FF0000 defb 0x08, 0xFF, 0x00, 0x00, 1, [dasm_08], [dasm_08]>>8, 0 ;EX AF, AF′ 01F00A00 46: - 0605 D9FF0000 defb 0xD9, 0xFF, 0x00, 0x00, 1, [dasm_D9], [dasm_D9]>>8, 0 ;EXX 01FD0A00 47: - 060D E3FF0000 defb 0xE3, 0xFF, 0x00, 0x00, 1, [dasm_E3], [dasm_E3]>>8, 0 ;EX (SP), HL 01010B00 48: - 0615 DDFFE3FF defb 0xDD, 0xFF, 0xE3, 0xFF, 2, [dasm_DD_E3], [dasm_DD_E3]>>8, 0 ;EX (SP), IX 020D0B00 49: - 061D FDFFE3FF defb 0xFD, 0xFF, 0xE3, 0xFF, 2, [dasm_FD_E3], [dasm_FD_E3]>>8, 0 ;EX (SP), IY 02190B00 50: - 0625 EDFFA0FF defb 0xED, 0xFF, 0xA0, 0xFF, 2, [dasm_ED_A0], [dasm_ED_A0]>>8, 0 ;LDI 02250B00 51: - 062D EDFFB0FF defb 0xED, 0xFF, 0xB0, 0xFF, 2, [dasm_ED_B0], [dasm_ED_B0]>>8, 0 ;LDIR 02290B00 52: - 0635 EDFFA8FF defb 0xED, 0xFF, 0xA8, 0xFF, 2, [dasm_ED_A8], [dasm_ED_A8]>>8, 0 ;LDD 022E0B00 53: - 063D EDFFB8FF defb 0xED, 0xFF, 0xB8, 0xFF, 2, [dasm_ED_B8], [dasm_ED_B8]>>8, 0 ;LDDR 02320B00 54: - 0645 EDFFA1FF defb 0xED, 0xFF, 0xA1, 0xFF, 2, [dasm_ED_A1], [dasm_ED_A1]>>8, 0 ;CPI 02370B00 55: - 064D EDFFB1FF defb 0xED, 0xFF, 0xB1, 0xFF, 2, [dasm_ED_B1], [dasm_ED_B1]>>8, 0 ;CPIR 023B0B00 56: - 0655 EDFFA9FF defb 0xED, 0xFF, 0xA9, 0xFF, 2, [dasm_ED_A9], [dasm_ED_A9]>>8, 0 ;CPD 02400B00 57: - 065D EDFFB9FF defb 0xED, 0xFF, 0xB9, 0xFF, 2, [dasm_ED_B9], [dasm_ED_B9]>>8, 0 ;CPDR 02440B00 58: 59: ;JUMP Group 60: - 0665 C3FF0000 defb 0xC3, 0xFF, 0x00, 0x00, 3, [dasm_C3], [dasm_C3]>>8,1, 0x01 ;JP nn 03F10901 01 61: - 066E C2C70000 defb 0xC2, 0xC7, 0x00, 0x00, 3, [dasm_C3], [dasm_C3]>>8,3, 0x02, 0x80, 0x01 ;JP cc,nn 03F10903 028001 62: - 0679 18FF0000 defb 0x18, 0xFF, 0x00, 0x00, 2, [dasm_18], [dasm_18]>>8,1, 0x03 ;JR e 02F80901 03 63: - 0682 38FF0000 defb 0x38, 0xFF, 0x00, 0x00, 2, [dasm_38], [dasm_38]>>8,1, 0x03 ;JR C,e 02FC0901 03 64: - 068B 30FF0000 defb 0x30, 0xFF, 0x00, 0x00, 2, [dasm_30], [dasm_30]>>8,1, 0x03 ;JR NC,e 02030A01 03 65: - 0694 28FF0000 defb 0x28, 0xFF, 0x00, 0x00, 2, [dasm_28], [dasm_28]>>8,1, 0x03 ;JR Z,e 020B0A01 03 66: - 069D 20FF0000 defb 0x20, 0xFF, 0x00, 0x00, 2, [dasm_20], [dasm_20]>>8,1, 0x03 ;JR NZ,e 02120A01 03 67: - 06A6 E9FF0000 defb 0xE9, 0xFF, 0x00, 0x00, 2, [dasm_E9], [dasm_E9]>>8,0 ;JP (HL) 021A0A00 68: - 06AE DDFFE9FF defb 0xDD, 0xFF, 0xE9, 0xFF, 2, [dasm_DD], [dasm_DD]>>8,0 ;JP (IX) 02230A00 69: - 06B6 FDFFE9FF defb 0xFD, 0xFF, 0xE9, 0xFF, 2, [dasm_FD], [dasm_FD]>>8,0 ;JP (IY) 022C0A00 70: - 06BE 10FF0000 defb 0x10, 0xFF, 0x00, 0x00, 2, [dasm_10], [dasm_10]>>8,1, 0x03 ;DJNZ, e 02350A01 03 71: ;Call and Return Group 72: - 06C7 CDFF0000 defb 0xCD, 0xFF, 0x00, 0x00, 3, [dasm_CD], [dasm_CD]>>8,1, 0x01 ;CALL nn 033B0A01 01 73: - 06D0 C4C70000 defb 0xC4, 0xC7, 0x00, 0x00, 3, [dasm_CD], [dasm_CD]>>8,2, 0x02, 0x01 ;CALL cc,nn 033B0A02 0201 74: - 06DA C9FF0000 defb 0xC9, 0xFF, 0x00, 0x00, 1, [dasm_C9], [dasm_C9]>>8,0 ;RET 01410A00 75: - 06E2 C0C70000 defb 0xC0, 0xC7, 0x00, 0x00, 1, [dasm_C9], [dasm_C9]>>8,1, 0x02 ;RET cc 01410A01 02 76: - 06EB EDFF4DFF defb 0xED, 0xFF, 0x4D, 0xFF, 2, [dasm_ED_4D], [dasm_ED_4D]>>8,0 ;RETI 02460A00 77: - 06F3 EDFF45FF defb 0xED, 0xFF, 0x45, 0xFF, 2, [dasm_ED_45], [dasm_ED_45]>>8,0 ;RETN 024B0A00 78: 79: - 06FB C7C70000 defb 0xC7, 0xC7, 0x00, 0x00, 1, [dasm_FF], [dasm_FF]>>8,1, 0x05 ;RST 01500A01 05 80: ;8-Bit load group 81: - 0704 0AFF0000 defb 0x0A, 0xFF, 0x00, 0x00, 1, [dasm_0A], [dasm_0A]>>8, 0 ;LD A, (BC) 01550A00 82: - 070C 1AFF0000 defb 0x1A, 0xFF, 0x00, 0x00, 1, [dasm_1A], [dasm_1A]>>8, 0 ;LD A, (DE) 015F0A00 83: - 0714 3AFF0000 defb 0x3A, 0xFF, 0x00, 0x00, 3, [dasm_3A], [dasm_3A]>>8, 2, 0x09, 0x80 ;LD A, (nn) 03690A02 0980 84: - 071E 02FF0000 defb 0x02, 0xFF, 0x00, 0x00, 1, [dasm_02], [dasm_02]>>8, 0 ;LD (BC), A 01730A00 85: - 0726 12FF0000 defb 0x12, 0xFF, 0x00, 0x00, 1, [dasm_12], [dasm_12]>>8, 0 ;LD (DE), A 017E0A00 86: - 072E 32FF0000 defb 0x32, 0xFF, 0x00, 0x00, 3, [dasm_32], [dasm_32]>>8, 2, 0x09, 0x80 ;LD (nn), A 03890A02 0980 87: - 0738 EDFF57FF defb 0xED, 0xFF, 0x57, 0xFF, 2, [dasm__ED_57], [dasm__ED_57]>>8, 0 ;LD A, I 02980A00 88: - 0740 EDFF5FFF defb 0xED, 0xFF, 0x5F, 0xFF, 2, [dasm__ED_5F], [dasm__ED_5F]>>8, 0 ;LD A, R 02A00A00 89: - 0748 EDFF47FF defb 0xED, 0xFF, 0x47, 0xFF, 2, [dasm__ED_47], [dasm__ED_47]>>8, 0 ;LD I, A 02A80A00 90: - 0750 EDFF4FFF defb 0xED, 0xFF, 0x4F, 0xFF, 2, [dasm__ED_4F], [dasm__ED_4F]>>8, 0 ;LD R, A 02B00A00 91: 92: - 0758 06C70000 defb 0x06, 0xC7, 0x00, 0x00, 2, [dasm__LD], [dasm__LD]>>8, 2, 0x06, 0x08 ;LD r, n 02940A02 0608 93: - 0762 40C00000 defb 0x40, 0xC0, 0x00, 0x00, 1, [dasm__LD], [dasm__LD]>>8, 2, 0x06, 0x07 ;LD r, r' / LD r, (HL) / LD (HL), r 01940A02 0607 94: 95: ;8-Bit Arithmetic Group 96: - 076C 80F80000 defb 0x80, 0xF8, 0x00, 0x00, 1, [dasm_80C6], [dasm_80C6]>>8, 1, 0x07 ;ADD A, r / ADD A, (HL) 01490B01 07 97: - 0775 C6FF0000 defb 0xC6, 0xFF, 0x00, 0x00, 2, [dasm_80C6], [dasm_80C6]>>8, 1, 0x08 ;ADD A, n 02490B01 08 98: - 077E DDFF86FF defb 0xDD, 0xFF, 0x86, 0xFF, 3, [dasm_DD_86], [dasm_DD_86]>>8, 2, 0x08, 0x80 ;ADD A, (IX + d) 03510B02 0880 99: - 0788 FDFF86FF defb 0xFD, 0xFF, 0x86, 0xFF, 3, [dasm_FD_86], [dasm_FD_86]>>8, 2, 0x08, 0x80 ;ADD A, (IY + d) 03600B02 0880 100: - 0792 C8F80000 defb 0xC8, 0xF8, 0x00, 0x00, 1, [dasm_C88E], [dasm_C88E]>>8, 1, 0x07 ;ADC A, r / ADC A, (HL) 016F0B01 07 101: - 079B 8EF80000 defb 0x8E, 0xF8, 0x00, 0x00, 2, [dasm_C88E], [dasm_C88E]>>8, 1, 0x08 ;ADC A, n 026F0B01 08 102: - 07A4 DDFF8EFF defb 0xDD, 0xFF, 0x8E, 0xFF, 3, [dasm_DD_8E], [dasm_DD_8E]>>8, 2, 0x08, 0x80 ;ADC A, (IX + d) 03770B02 0880 103: - 07AE FDFF8EFF defb 0xFD, 0xFF, 0x8E, 0xFF, 3, [dasm_FD_8E], [dasm_FD_8E]>>8, 2, 0x08, 0x80 ;ADC A, (IY + d) 03860B02 0880 104: - 07B8 90F80000 defb 0x90, 0xF8, 0x00, 0x00, 1, [dasm__SUB], [dasm__SUB]>>8, 1, 0x07 ;SUB r / SUB A, (HL) 01950B01 07 105: - 07C1 D6FF0000 defb 0xD6, 0xFF, 0x00, 0x00, 2, [dasm__SUB], [dasm__SUB]>>8, 1, 0x08 ;SUB n 02950B01 08 106: - 07CA DDFF96FF defb 0xDD, 0xFF, 0x96, 0xFF, 3, [dasm_DD_96], [dasm_DD_96]>>8, 2, 0x08, 0x80 ;SUB (IX + d) 039A0B02 0880 107: - 07D4 FDFF96FF defb 0xFD, 0xFF, 0x96, 0xFF, 3, [dasm_FD_96], [dasm_FD_96]>>8, 2, 0x08, 0x80 ;SUB (IY + d) 03A60B02 0880 108: - 07DE 94F80000 defb 0x94, 0xF8, 0x00, 0x00, 1, [dasm__SBC], [dasm__SBC]>>8, 1, 0x07 ;SBC A,r / SBC A, (HL) 01B20B01 07 109: - 07E7 DEFF0000 defb 0xDE, 0xFF, 0x00, 0x00, 2, [dasm__SBC], [dasm__SBC]>>8, 1, 0x08 ;SBC A,n 02B20B01 08 110: - 07F0 DDFF9EFF defb 0xDD, 0xFF, 0x9E, 0xFF, 3, [dasm_DD_9E], [dasm_DD_9E]>>8, 2, 0x08, 0x80 ;SBC A,(IX + d) 03BA0B02 0880 111: - 07FA FDFF9EFF defb 0xFD, 0xFF, 0x9E, 0xFF, 3, [dasm_FD_9E], [dasm_FD_9E]>>8, 2, 0x08, 0x80 ;SBC A,(IY + d) 03C80B02 0880 112: - 0804 A0F80000 defb 0xA0, 0xF8, 0x00, 0x00, 1, [dasm__AND], [dasm__AND]>>8, 1, 0x07 ;AND A,r / AND A, (HL) 01D60B01 07 113: - 080D E6FF0000 defb 0xE6, 0xFF, 0x00, 0x00, 2, [dasm__AND], [dasm__AND]>>8, 1, 0x08 ;AND A,n 02D60B01 08 114: - 0816 DDFFA6FF defb 0xDD, 0xFF, 0xA6, 0xFF, 3, [dasm_DD_A6], [dasm_DD_A6]>>8, 2, 0x08, 0x80 ;AND A,(IX + d) 03DB0B02 0880 115: - 0820 FDFFA6FF defb 0xFD, 0xFF, 0xA6, 0xFF, 3, [dasm_FD_A6], [dasm_FD_A6]>>8, 2, 0x08, 0x80 ;AND A,(IY + d) 03E70B02 0880 116: - 082A B0F80000 defb 0xB0, 0xF8, 0x00, 0x00, 1, [dasm__OR], [dasm__OR]>>8, 1, 0x07 ;OR A,r / OR A, (HL) 01F30B01 07 117: - 0833 F6FF0000 defb 0xF6, 0xFF, 0x00, 0x00, 2, [dasm__OR], [dasm__OR]>>8, 1, 0x08 ;OR A,n 02F30B01 08 118: - 083C DDFFB6FF defb 0xDD, 0xFF, 0xB6, 0xFF, 3, [dasm_DD_B6], [dasm_DD_B6]>>8, 2, 0x08, 0x80 ;OR A,(IX + d) 03F70B02 0880 119: - 0846 FDFFB6FF defb 0xFD, 0xFF, 0xB6, 0xFF, 3, [dasm_FD_B6], [dasm_FD_B6]>>8, 2, 0x08, 0x80 ;OR A,(IY + d) 03020C02 0880 120: - 0850 A8F80000 defb 0xA8, 0xF8, 0x00, 0x00, 1, [dasm__XOR], [dasm__XOR]>>8, 1, 0x07 ;XOR A,r / XOR A, (HL) 010D0C01 07 121: - 0859 EEFF0000 defb 0xEE, 0xFF, 0x00, 0x00, 2, [dasm__XOR], [dasm__XOR]>>8, 1, 0x08 ;XOR A,n 020D0C01 08 122: - 0862 DDFFAEFF defb 0xDD, 0xFF, 0xAE, 0xFF, 3, [dasm_DD_AE], [dasm_DD_AE]>>8, 2, 0x08, 0x80 ;XOR A,(IX + d) 03120C02 0880 123: - 086C FDFFAEFF defb 0xFD, 0xFF, 0xAE, 0xFF, 3, [dasm_FD_AE], [dasm_FD_AE]>>8, 2, 0x08, 0x80 ;XOR A,(IY + d) 031E0C02 0880 124: - 0876 B8F80000 defb 0xB8, 0xF8, 0x00, 0x00, 1, [dasm__CP], [dasm__CP]>>8, 1, 0x07 ;CP A,r / CP A, (HL) 012A0C01 07 125: - 087F FEFF0000 defb 0xFE, 0xFF, 0x00, 0x00, 2, [dasm__CP], [dasm__CP]>>8, 1, 0x08 ;CP A,n 022A0C01 08 126: - 0888 DDFFBEFF defb 0xDD, 0xFF, 0xBE, 0xFF, 3, [dasm_DD_BE], [dasm_DD_BE]>>8, 2, 0x08, 0x80 ;CP A,(IX + d) 032E0C02 0880 127: - 0892 FDFFBEFF defb 0xFD, 0xFF, 0xBE, 0xFF, 3, [dasm_FD_BE], [dasm_FD_BE]>>8, 2, 0x08, 0x80 ;CP A,(IY + d) 03390C02 0880 128: - 089C 04C70000 defb 0x04, 0xC7, 0x00, 0x00, 1, [dasm__INC], [dasm__INC]>>8, 1, 0x10 ;INC r / INC (HL) 01440C01 10 129: - 08A5 DDFF34FF defb 0xDD, 0xFF, 0x34, 0xFF, 3, [dasm_DD_34], [dasm_DD_34]>>8, 2, 0x08, 0x80 ;INC (IX + d) 03490C02 0880 130: - 08AF FDFF34FF defb 0xFD, 0xFF, 0x34, 0xFF, 3, [dasm_FD_34], [dasm_FD_34]>>8, 2, 0x08, 0x80 ;INC (IY + d) 03550C02 0880 131: - 08B9 05C70000 defb 0x05, 0xC7, 0x00, 0x00, 1, [dasm__DEC], [dasm__DEC]>>8, 1, 0x10 ;DEC r / DEC (HL) 01610C01 10 132: - 08C2 DDFF35FF defb 0xDD, 0xFF, 0x35, 0xFF, 3, [dasm_DD_35], [dasm_DD_35]>>8, 2, 0x08, 0x80 ;DEC (IX + d) 03660C02 0880 133: - 08CC FDFF35FF defb 0xFD, 0xFF, 0x35, 0xFF, 3, [dasm_FD_35], [dasm_FD_35]>>8, 2, 0x08, 0x80 ;DEC (IY + d) 03720C02 0880 134: ;16-Bit Arithmetic Group 135: - 08D6 09CF0000 defb 0x09, 0xCF, 0x00, 0x00, 1, [dasm_09], [dasm_09]>>8, 1, 0x11 ;ADD HL, ss 017E0C01 11 136: - 08DF EDFF4ACF defb 0xED, 0xFF, 0x4A, 0xCF, 2, [dasm_ED_4A], [dasm_ED_4A]>>8, 1, 0x12 ;ADC HL, ss 02870C01 12 137: - 08E8 EDFF42CF defb 0xED, 0xFF, 0x42, 0xCF, 2, [dasm_ED_42], [dasm_ED_42]>>8, 1, 0x12 ;SBC HL, ss 02900C01 12 138: - 08F1 DDFF09CF defb 0xDD, 0xFF, 0x09, 0xCF, 2, [dasm_DD_09], [dasm_DD_09]>>8, 1, 0x12 ;ADD IX, ss 02990C01 12 139: - 08FA FDFF09CF defb 0xFD, 0xFF, 0x09, 0xCF, 2, [dasm_FD_09], [dasm_FD_09]>>8, 1, 0x12 ;ADD IY, ss 02A20C01 12 140: - 0903 03CF0000 defb 0x03, 0xCF, 0x00, 0x00, 1, [dasm_03], [dasm_03]>>8, 1, 0x11 ;INC ss 01AB0C01 11 141: - 090C DDFF23FF defb 0xDD, 0xFF, 0x23, 0xFF, 2, [dasm_DD_23], [dasm_DD_23]>>8, 0 ;INC IX 02B00C00 142: - 0914 FDFF23FF defb 0xFD, 0xFF, 0x23, 0xFF, 2, [dasm_FD_23], [dasm_FD_23]>>8, 0 ;INC IY 02B90C00 143: - 091C 0BCF0000 defb 0x0B, 0xCF, 0x00, 0x00, 1, [dasm_0B], [dasm_0B]>>8, 1, 0x11 ;DEC ss 01C20C01 11 144: - 0925 DDFF2BFF defb 0xDD, 0xFF, 0x2B, 0xFF, 2, [dasm_DD_2B], [dasm_DD_2B]>>8, 0 ;DEC IX 02C70C00 145: - 092D FDFF2BFF defb 0xFD, 0xFF, 0x2B, 0xFF, 2, [dasm_FD_2B], [dasm_FD_2B]>>8, 0 ;DEC IY 02D00C00 146: ;16-Bit Load Group 147: - 0935 01CF0000 defb 0x01, 0xCF, 0x00, 0x00, 3, [dasm_01], [dasm_01]>>8, 3, 0x11, 0x80, 0x09 ;LD dd, nn 03D90C03 118009 148: - 0940 DDFF21FF defb 0xDD, 0xFF, 0x21, 0xFF, 4, [dasm_DD_01], [dasm_DD_01]>>8, 1, 0x0A ;LD IX, nn 04E00C01 0A 149: - 0949 FDFF21FF defb 0xFD, 0xFF, 0x21, 0xFF, 4, [dasm_FD_01], [dasm_FD_01]>>8, 1, 0x0A ;LD IY, nn 04E80C01 0A 150: - 0952 2AFF0000 defb 0x2A, 0xFF, 0x00, 0x00, 3, [dasm_2A], [dasm_2A]>>8, 2, 0x09, 0x80 ;LD HL, (nn) 03F00C02 0980 151: - 095C EDFF4BCF defb 0xED, 0xFF, 0x4B, 0xCF, 4, [dasm_ED_4B], [dasm_ED_4B]>>8, 4, 0x12, 0x80, 0x0A, 0x81 ;LD dd, (nn) 04FC0C04 12800A81 152: - 0968 DDFF2AFF defb 0xDD, 0xFF, 0x2A, 0xFF, 4, [dasm_DD_2A], [dasm_DD_2A]>>8, 1, 0x0A ;LD IX, (nn) 04070D01 0A 153: - 0971 FDFF2AFF defb 0xFD, 0xFF, 0x2A, 0xFF, 4, [dasm_FD_2A], [dasm_FD_2A]>>8, 1, 0x0A ;LD IY, (nn) 04130D01 0A 154: - 097A 22FF0000 defb 0x22, 0xFF, 0x00, 0x00, 3, [dasm_22], [dasm_22]>>8, 2, 0x0A, 0x80 ;LD (nn), HL 031F0D02 0A80 155: - 0984 EDFF43CF defb 0xED, 0xFF, 0x43, 0xCF, 4, [dasm_ED_43], [dasm_ED_43]>>8, 3, 0x0A, 0x80, 0x12 ;LD (nn), dd 042B0D03 0A8012 156: - 098F DDFF22CF defb 0xDD, 0xFF, 0x22, 0xCF, 4, [dasm_DD_22], [dasm_DD_22]>>8, 2, 0x0A, 0x80 ;LD (nn), IX 04350D02 0A80 157: - 0999 FDFF22CF defb 0xFD, 0xFF, 0x22, 0xCF, 4, [dasm_FD_22], [dasm_FD_22]>>8, 2, 0x0A, 0x80 ;LD (nn), IY 04410D02 0A80 158: - 09A3 F9FF0000 defb 0xF9, 0xFF, 0x00, 0x00, 1, [dasm_F9], [dasm_F9]>>8, 0 ;LD SP, HL 014D0D00 159: - 09AB DDFFF9FF defb 0xDD, 0xFF, 0xF9, 0xFF, 2, [dasm_DD_F9], [dasm_DD_F9]>>8, 0 ;LD SP, IX 02570D00 160: - 09B3 FDFFF9FF defb 0xFD, 0xFF, 0xF9, 0xFF, 2, [dasm_FD_F9], [dasm_FD_F9]>>8, 0 ;LD SP, IY 02610D00 161: - 09BB C5CF0000 defb 0xC5, 0xCF, 0x00, 0x00, 1, [dasm_E5], [dasm_E5]>>8, 1, 0x13 ;PUSH qq 016B0D01 13 162: - 09C4 DDFFE5FF defb 0xDD, 0xFF, 0xE5, 0xFF, 2, [dasm_DD_E5], [dasm_DD_E5]>>8, 0 ;PUSH IX 02710D00 163: - 09CC FDFFE5FF defb 0xFD, 0xFF, 0xE5, 0xFF, 2, [dasm_FD_E5], [dasm_FD_E5]>>8, 0 ;PUSH IY 02790D00 164: - 09D4 C1CF0000 defb 0xC1, 0xCF, 0x00, 0x00, 1, [dasm_E1], [dasm_E1]>>8, 1, 0x13 ;POP qq 01810D01 13 165: - 09DD DDFFE1FF defb 0xDD, 0xFF, 0xE1, 0xFF, 2, [dasm_DD_E1], [dasm_DD_E1]>>8, 0 ;POP IX 02870D00 166: - 09E5 FDFFE1FF defb 0xFD, 0xFF, 0xE1, 0xFF, 2, [dasm_FD_E1], [dasm_FD_E1]>>8, 0 ;POP IY 028F0D00 167: 168: 169: - 09ED 4E4F5000 dasm_00: db "NOP",0x00 170: ;JUMP Group 171: - 09F1 4A502000 dasm_C3: db "JP ",0x00,", ",0x00 2C2000 172: - 09F8 4A522000 dasm_18: db "JR ",0x00 173: - 09FC 4A522043 dasm_38: db "JR C, ",0x00 2C2000 174: - 0A03 4A52204E dasm_30: db "JR NC, ",0x00 432C2000 175: - 0A0B 4A52205A dasm_28: db "JR Z, ",0x00 2C2000 176: - 0A12 4A52204E dasm_20: db "JR NZ, ",0x00 5A2C2000 177: - 0A1A 4A502028 dasm_E9: db "JP (HL) ",0x00 484C2920 00 178: - 0A23 4A502028 dasm_DD: db "JP (IX) ",0x00 49582920 00 179: - 0A2C 4A502028 dasm_FD: db "JP (IY) ",0x00 49592920 00 180: - 0A35 444A4E5A dasm_10: db "DJNZ ",0x00 2000 181: ;Call and Return Group 182: - 0A3B 43414C4C dasm_CD: db "CALL ",0x00 2000 183: - 0A41 52455420 dasm_C9: db "RET ",0x00 00 184: - 0A46 52455449 dasm_ED_4D: db "RETI",0x00 00 185: - 0A4B 5245544E dasm_ED_45: db "RETN",0x00 00 186: - 0A50 52535420 dasm_FF: db "RST ",0x00 00 187: ;8-Bit load group 188: - 0A55 4C442041 dasm_0A: db "LD A,(BC)",0x00 2C284243 2900 189: - 0A5F 4C442041 dasm_1A: db "LD A,(DE)",0x00 2C284445 2900 190: - 0A69 4C442041 dasm_3A: db "LD A,(",0x00, "h)",0x00 2C280068 2900 191: - 0A73 4C442028 dasm_02: db "LD (BC), A",0x00 4243292C 204100 192: - 0A7E 4C442028 dasm_12: db "LD (DE), A",0x00 4445292C 204100 193: - 0A89 4C442028 dasm_32: db "LD (",0x00, "h), A",0x00 0068292C 204100 194: - 0A94 4C442000 dasm__LD: db "LD ",0x00 195: - 0A98 4C442041 dasm__ED_57: db "LD A, I",0x00 2C204900 196: - 0AA0 4C442041 dasm__ED_5F: db "LD A, R",0x00 2C205200 197: - 0AA8 4C442049 dasm__ED_47: db "LD I, A",0x00 2C204100 198: - 0AB0 4C442052 dasm__ED_4F: db "LD R, A",0x00 2C204100 199: ;General-Purpose Arithmetic and CPU Control Groups 200: - 0AB8 44414100 dasm_27: db "DAA",0x00 201: - 0ABC 43504C00 dasm_2F: db "CPL",0x00 202: - 0AC0 4E454700 dasm_ED_44: db "NEG",0x00 203: - 0AC4 43434600 dasm_3F: db "CCF",0x00 204: - 0AC8 53434600 dasm_37: db "SCF",0x00 205: - 0ACC 48414C54 dasm_76: db "HALT",0x00 00 206: - 0AD1 444900 dasm_F3: db "DI",0x00 207: - 0AD4 454900 dasm_FB: db "EI",0x00 208: - 0AD7 494D2030 dasm_ED_46: db "IM 0",0x00 00 209: - 0ADC 494D2031 dasm_ED_56: db "IM 1",0x00 00 210: - 0AE1 494D2032 dasm_ED_5E: db "IM 2",0x00 00 211: ;Exchange, Block Transfer, and Search Group 212: - 0AE6 45582044 dasm_BE: db "EX DE, HL",0x00 452C2048 4C00 213: - 0AF0 45582041 dasm_08: db "EX AF, AF′",0x00 462C2041 46E280B2 00 214: - 0AFD 45585800 dasm_D9: db "EXX",0x00 215: - 0B01 45582028 dasm_E3: db "EX (SP), HL",0x00 5350292C 20484C00 216: - 0B0D 45582028 dasm_DD_E3: db "EX (SP), IX",0x00 5350292C 20495800 217: - 0B19 45582028 dasm_FD_E3: db "EX (SP), IY",0x00 5350292C 20495900 218: - 0B25 4C444900 dasm_ED_A0: db "LDI",0x00 219: - 0B29 4C444952 dasm_ED_B0: db "LDIR",0x00 00 220: - 0B2E 4C444400 dasm_ED_A8: db "LDD",0x00 221: - 0B32 4C444452 dasm_ED_B8: db "LDDR",0x00 00 222: - 0B37 43504900 dasm_ED_A1: db "CPI",0x00 223: - 0B3B 43504952 dasm_ED_B1: db "CPIR",0x00 00 224: - 0B40 43504400 dasm_ED_A9: db "CPD",0x00 225: - 0B44 43504452 dasm_ED_B9: db "CPDR",0x00 00 226: ;8-Bit Arithmetic Group 227: - 0B49 41444420 dasm_80C6: db "ADD A, ", 0x00 412C2000 228: - 0B51 41444420 dasm_DD_86: db "ADD A, (IX+", 0x00, "h)",0x00 412C2028 49582B00 682900 229: - 0B60 41444420 dasm_FD_86: db "ADD A, (IY+", 0x00, "h)",0x00 412C2028 49592B00 682900 230: - 0B6F 41444320 dasm_C88E: db "ADC A, ", 0x00 412C2000 231: - 0B77 41444320 dasm_DD_8E: db "ADC A, (IX+", 0x00, "h)",0x00 412C2028 49582B00 682900 232: - 0B86 41444320 dasm_FD_8E: db "ADC A, (IY+", 0x00, "h)",0x00 412C2028 49592B00 682900 233: - 0B95 53554220 dasm__SUB: db "SUB ", 0x00 00 234: - 0B9A 53554220 dasm_DD_96: db "SUB (IX+", 0x00, "h)",0x00 2849582B 00682900 235: - 0BA6 53554220 dasm_FD_96: db "SUB (IY+", 0x00, "h)",0x00 2849592B 00682900 236: - 0BB2 53424320 dasm__SBC: db "SBC A, ", 0x00 412C2000 237: - 0BBA 53424320 dasm_DD_9E: db "SBC A,(IX+", 0x00, "h)",0x00 412C2849 582B0068 2900 238: - 0BC8 53424320 dasm_FD_9E: db "SBC A,(IY+", 0x00, "h)",0x00 412C2849 592B0068 2900 239: - 0BD6 414E4420 dasm__AND: db "AND ", 0x00 00 240: - 0BDB 414E4420 dasm_DD_A6: db "AND (IX+", 0x00, "h)",0x00 2849582B 00682900 241: - 0BE7 414E4420 dasm_FD_A6: db "AND (IY+", 0x00, "h)",0x00 2849592B 00682900 242: - 0BF3 4F522000 dasm__OR: db "OR ", 0x00 243: - 0BF7 4F522028 dasm_DD_B6: db "OR (IX+", 0x00, "h)",0x00 49582B00 682900 244: - 0C02 4F522028 dasm_FD_B6: db "OR (IY+", 0x00, "h)",0x00 49592B00 682900 245: - 0C0D 584F5220 dasm__XOR: db "XOR ", 0x00 00 246: - 0C12 584F5220 dasm_DD_AE: db "XOR (IX+", 0x00, "h)",0x00 2849582B 00682900 247: - 0C1E 584F5220 dasm_FD_AE: db "XOR (IY+", 0x00, "h)",0x00 2849592B 00682900 248: - 0C2A 43502000 dasm__CP: db "CP ", 0x00 249: - 0C2E 43502028 dasm_DD_BE: db "CP (IX+", 0x00, "h)",0x00 49582B00 682900 250: - 0C39 43502028 dasm_FD_BE: db "CP (IY+", 0x00, "h)",0x00 49592B00 682900 251: - 0C44 494E4320 dasm__INC: db "INC ", 0x00 00 252: - 0C49 494E4320 dasm_DD_34: db "INC (IX+", 0x00, "h)",0x00 2849582B 00682900 253: - 0C55 494E4320 dasm_FD_34: db "INC (IY+", 0x00, "h)",0x00 2849592B 00682900 254: - 0C61 44454320 dasm__DEC: db "DEC ", 0x00 00 255: - 0C66 44454320 dasm_DD_35: db "DEC (IX+", 0x00, "h)",0x00 2849582B 00682900 256: - 0C72 44454320 dasm_FD_35: db "DEC (IY+", 0x00, "h)",0x00 2849592B 00682900 257: ;16-Bit Arithmetic Group 258: - 0C7E 41444420 dasm_09: db "ADD HL, ",0x00 484C2C20 00 259: - 0C87 41444320 dasm_ED_4A: db "ADC HL, ",0x00 484C2C20 00 260: - 0C90 53424320 dasm_ED_42: db "SBC HL, ",0x00 484C2C20 00 261: - 0C99 41444420 dasm_DD_09: db "ADD IX, ",0x00 49582C20 00 262: - 0CA2 41444420 dasm_FD_09: db "ADD IY, ",0x00 49592C20 00 263: - 0CAB 494E4320 dasm_03: db "INC ",0x00 00 264: - 0CB0 494E4320 dasm_DD_23: db "INC IX, ",0x00 49582C20 00 265: - 0CB9 494E4320 dasm_FD_23: db "INC IY, ",0x00 49592C20 00 266: - 0CC2 44454320 dasm_0B: db "DEC ",0x00 00 267: - 0CC7 44454320 dasm_DD_2B: db "DEC IX, ",0x00 49582C20 00 268: - 0CD0 44454320 dasm_FD_2B: db "DEC IY, ",0x00 49592C20 00 269: ;16-Bit Load Group 270: - 0CD9 4C442000 dasm_01: db "LD ",0x00, ", ",0x00 2C2000 271: - 0CE0 4C442049 dasm_DD_01: db "LD IX, ",0x00 582C2000 272: - 0CE8 4C442049 dasm_FD_01: db "LD IY, ",0x00 592C2000 273: - 0CF0 4C442048 dasm_2A: db "LD HL, (",0x00,"h)",0x00 4C2C2028 00682900 274: - 0CFC 4C442000 dasm_ED_4B: db "LD ",0x00,", (",0x00,"h)",0x00 2C202800 682900 275: - 0D07 4C442049 dasm_DD_2A: db "LD IX, (",0x00,"h)",0x00 582C2028 00682900 276: - 0D13 4C442049 dasm_FD_2A: db "LD IY, (",0x00,"h)",0x00 592C2028 00682900 277: - 0D1F 4C442028 dasm_22: db "LD (",0x00,"h), HL",0x00 0068292C 20484C00 278: - 0D2B 4C442028 dasm_ED_43: db "LD (",0x00,"h), ",0x00 0068292C 2000 279: - 0D35 4C442028 dasm_DD_22: db "LD (",0x00,"h), IX",0x00 0068292C 20495800 280: - 0D41 4C442028 dasm_FD_22: db "LD (",0x00,"h), IY",0x00 0068292C 20495900 281: - 0D4D 4C442053 dasm_F9: db "LD SP, HL",0x00 502C2048 4C00 282: - 0D57 4C442053 dasm_DD_F9: db "LD SP, IX",0x00 502C2049 5800 283: - 0D61 4C442053 dasm_FD_F9: db "LD SP, IY",0x00 502C2049 5900 284: - 0D6B 50555348 dasm_E5: db "PUSH ",0x00 2000 285: - 0D71 50555348 dasm_DD_E5: db "PUSH IX",0x00 20495800 286: - 0D79 50555348 dasm_FD_E5: db "PUSH IY",0x00 20495900 287: - 0D81 50555348 dasm_E1: db "PUSH ",0x00 2000 288: - 0D87 50555348 dasm_DD_E1: db "PUSH IX",0x00 20495800 289: - 0D8F 50555348 dasm_FD_E1: db "PUSH IY",0x00 20495900 290: 291: ;Misc 292: - 0D97 2E3F2E00 dasm_UU: db ".?.",0x00 293: - 0D9B 20202020 dasm_UW: db " ",0x00 00 294: 295: - 0DA0 dasm_printFlags_table: 296: - 0DA0 4E5A db "NZ" 297: - 0DA2 5A00 db "Z",0 298: - 0DA4 4E43 db "NC" 299: - 0DA6 4300 db "C",0 300: - 0DA8 504F db "PO" 301: - 0DAA 5045 db "PE" 302: - 0DAC 5000 db "P",0 303: - 0DAE 4D00 db "M",0 304: 305: - 0DB0 dasm_printRegister8_table: 306: - 0DB0 42 db "B" 307: - 0DB1 43 db "C" 308: - 0DB2 44 db "D" 309: - 0DB3 45 db "E" 310: - 0DB4 48 db "H" 311: - 0DB5 4C db "L" 312: - 0DB6 53 db "S" ;only 18 bit (SP) 313: - 0DB7 50 db "P" ;only 18 bit (SP) 314: 315: - 0DB8 dasm_printRegisterIX_table: 316: - 0DB8 4243 db "BC" 317: - 0DBA 4445 db "DE" 318: - 0DBC 4958 db "IX" 319: - 0DBE 5350 db "SP" 320: - 0DC0 dasm_printRegisterIY_table: 321: - 0DC0 4243 db "BC" 322: - 0DC2 4445 db "DE" 323: - 0DC4 4959 db "IY" 324: - 0DC6 5350 db "SP" 325: 326: - 0DC8 dasm_printRegisterSP_table: 327: - 0DC8 4243 db "BC" 328: - 0DCA 4445 db "DE" 329: - 0DCC 484C db "HL" 330: - 0DCE 4146 db "AF" 331: 332: - 0DD0 dasm_printRegister8_table_HL: **** main.asm **** 185: - 0DD0 28484C29 db "(HL)", 0 00 186: .include "rst.s" **** include/rst.s **** 1: - 0DD5 EXEC_RST_08: 2: 6945+17 0DD5 CD1501 call print_char 3: 6962+10 0DD8 C9 ret 4: 5: 6: - 0DD9 EXEC_RST_10: 7: 6972+11 0DD9 C5 push bc 8: 6983+11 0DDA D5 push de 9: 6994+11 0DDB E5 push hl 10: ;call vdp_cursor_on 11: 7005+17 0DDC CD5B01 call read_char 12: 7022+11 0DDF F5 push af 13: ;call vdp_cursor_off 14: 7033+10 0DE0 F1 pop af 15: 7043+10 0DE1 E1 pop hl 16: 7053+10 0DE2 D1 pop de 17: 7063+10 0DE3 C1 pop bc 18: 7073+10 0DE4 C9 ret 19: 20: - 0DE5 EXEC_RST_18: 21: 7083+7 0DE5 3E00 ld a,0 22: 7090+10 0DE7 C9 ret **** main.asm **** 187: .include "beep.s" **** include/beep.s **** 1: ;------------------------------------------------------------------------------ 2: ; beep 3: ; 4: ; Beeps the speaker 5: ; DE sets duration 6: ;------------------------------------------------------------------------------ 7: - 0DE8 beep: 8: 7100+11 0DE8 F5 push AF 9: 7111+11 0DE9 D5 push DE 10: - 0DEA beep_loop: 11: 7122+7 0DEA 3E08 LD A,0x08 12: 7129+11 0DEC D3F4 OUT (CS_PIO_AD), A 13: 7140+17 0DEE CD000E CALL beep_pause 14: 7157+7 0DF1 3E00 LD A,0x00 15: 7164+11 0DF3 D3F4 OUT (CS_PIO_AD), A 16: 7175+17 0DF5 CD000E CALL beep_pause 17: 7192+6 0DF8 1B DEC DE 18: 7198+4 0DF9 7A ld A,D 19: 7202+4 0DFA B3 or E 20: 7206+7+5 0DFB 20ED jr NZ, beep_loop 21: 7213+10 0DFD D1 pop de 22: 7223+10 0DFE F1 pop af 23: 7233+10 0DFF C9 ret 24: 25: - 0E00 beep_pause: 26: 7243+11 0E00 C5 PUSH BC 27: - 0E01 _beep_pause_l1: 28: ;NEG ; 8 T-states 29: ;NEG ; 8 T-states 30: 7254+8 0E01 ED44 NEG ; 8 T-states 31: 7262+8 0E03 ED44 NEG ; 8 T-states 32: 7270+6 0E05 0B DEC BC ; 6 T-states 33: 7276+4 0E06 79 LD A,C ; 9 T-states 34: 7280+4 0E07 B0 OR B ; 4 T-states 35: 7284+10 0E08 C2010E JP NZ,_beep_pause_l1 ; 10 T-states 36: 7294+10 0E0B C1 POP BC **** main.asm **** 188: 7304+10 0E0C C9 RET ; Pause complete, RETurn 189: .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: - 0E0D ide_reset: 71: 72: 7314+7 0E0D 3E80 LD A, 10000000b ;CommandByte-A, Mode 0, PA Out, PC Out, PB Out 73: 7321+11 0E0F D333 OUT (CS_PIA_CR), A ;Set Data direction to out 74: 7332+7 0E11 3E80 LD A, IDE_RST 75: 7339+11 0E13 D332 OUT (CS_PIA_PC), A ;Reset IDE Device 76: 7350+4 0E15 AF XOR A 77: 7354+11 0E16 D332 OUT (CS_PIA_PC), A ;end device reset 78: 7365+10 0E18 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: - 0E19 ide_regwrite_8: 89: 7375+11 0E19 F5 PUSH AF ;store date to stack 90: ; Prepare PIA Data Direction 91: 7386+7 0E1A 3E80 LD A, 10000000b ;CommandByte-A, Mode 0, PA Out, PC Out, PB Out 92: 7393+11 0E1C D333 OUT (CS_PIA_CR), A ;Set Data direction to out 93: ; Write Data out 94: 7404+10 0E1E F1 POP AF 95: 7414+11 0E1F D330 OUT (CS_PIA_PA), A ;Write Data to bit 0-7 96: ;Prepare Address 97: 7425+4 0E21 78 LD A, B ;Load register address 98: 7429+7 0E22 E61F AND 00011111b ;Mask unused bits 99: 7436+11 0E24 D332 OUT (CS_PIA_PC), A ;Write Data to bit controll lines 100: 7447+7 0E26 F620 OR IDE_WR ;Set Write bit 101: 7454+11 0E28 D332 OUT (CS_PIA_PC), A ;Set write signal 102: ;NOP ;delay to wait for processing 103: 7465+4 0E2A 78 LD A, B ;Load register address 104: 7469+7 0E2B E61F AND 00011111b ;Mask unused bits 105: 7476+11 0E2D D332 OUT (CS_PIA_PC), A ;disable write signal 106: ;NOP 107: 7487+4 0E2F AF XOR A ;clear register A 108: 7491+11 0E30 D332 OUT (CS_PIA_PC), A ;clear controll lines 109: 7502+10 0E32 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: - 0E33 ide_regread_8: 120: 7512+7 0E33 3E92 LD A, 10010010b ;CommandByte-A, Mode 0, PA IN, PC Out, PB IN 121: 7519+11 0E35 D333 OUT (CS_PIA_CR), A ;Set Data direction to in 122: ;Prepare Address 123: 7530+4 0E37 78 LD A, B ;Load register address 124: 7534+7 0E38 E61F AND 00011111b ;Mask unused bits 125: 7541+11 0E3A D332 OUT (CS_PIA_PC), A ;Write Data to bit controll lines 126: 7552+7 0E3C F640 OR IDE_RD ;Set Write bit 127: 7559+11 0E3E D332 OUT (CS_PIA_PC), A ;Write Data to bit controll lines 128: 7570+4 0E40 00 NOP 129: 7574+11 0E41 DB30 IN A,(CS_PIA_PA) ;read data from ide device to b (because a is used later) 130: 7585+11 0E43 F5 PUSH AF 131: 7596+4 0E44 AF XOR A ;clear register A 132: 7600+11 0E45 D332 OUT (CS_PIA_PC), A ;clear controll lines 133: 7611+10 0E47 F1 POP AF ;put data in accumulator 134: 7621+10 0E48 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: - 0E49 ide_readsector_512_fast: 144: 7631+7 0E49 060F ld b, IDE_REG_CMDSTS ;check status 145: 7638+17 0E4B CD330E call ide_regread_8 146: 7655+8 0E4E CB47 bit 0,a ;Error Bit set 147: 7663+10 0E50 C2940E jp nz, ide_printerror ;then abort 148: 7673+8 0E53 CB5F bit 3,a ;wait for drq 149: 7681+7+5 0E55 28F2 jr z,ide_readsector_512_fast 150: 7688+7 0E57 0600 ld b,0 ;256x 151: 7695+7 0E59 3E92 ld a, 10010010b ;CommandByte-A, Mode 0, PA IN, PC Out, PB IN 152: 7702+11 0E5B D333 out (CS_PIA_CR), a ;Set Data direction to IN 153: - 0E5D _ide_readsector_512_floop: 154: 7713+7 0E5D 3E08 ld a, IDE_REG_DATA ;CS0 and A=0 -> I/O register 155: 7720+11 0E5F D332 out (CS_PIA_PC), a ;set register 156: 7731+7 0E61 F640 or IDE_RD ;Set Read bit 157: 7738+11 0E63 D332 out (CS_PIA_PC), a ;Write Read to bit controll lines 158: 7749+11 0E65 DB30 in a,(CS_PIA_PA) ;load first byte 159: 7760+7 0E67 77 ld (hl), a 160: 7767+6 0E68 23 inc hl 161: 7773+11 0E69 DB31 in a,(CS_PIA_PB) ;load second byte 162: 7784+7 0E6B 77 ld (hl), a 163: 7791+6 0E6C 23 inc hl 164: 7797+8+5 0E6D 10EE djnz _ide_readsector_512_floop ;loop 256 times (256words = 512 bytes) 165: 7805+7 0E6F 060F ld b, IDE_REG_CMDSTS;check drive status 166: 7812+17 0E71 CD330E call ide_regread_8 ; 167: 7829+7 0E74 E689 and 10001001b ;busy, DRQ, or error? 168: 7836+5+6 0E76 C8 ret z ;no more data or errors -> exit 169: 7841+8 0E77 CB5F bit 3,a ;test if more data available 170: 7849+7+5 0E79 20CE jr nz,ide_readsector_512_fast ;if true, repeat read function 171: 7856+10 0E7B C3940E jp ide_printerror ;else exit function 172: 173: - 0E7E ide_readsector_timeout: 174: 7866+10 0E7E 21F80E LD HL, [str_error_time] 175: 7876+17 0E81 CD1D01 CALL print_str 176: 7893+4 0E84 79 LD A, C 177: 7897+17 0E85 CD4301 CALL print_a_hex 178: 7914+7 0E88 3E0A LD A,10 179: 7921+17 0E8A CD1501 CALL print_char 180: 7938+7 0E8D 3E0D LD A,13 181: 7945+17 0E8F CD1501 CALL print_char 182: 7962+10 0E92 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: - 0E93 ide_writesector_256: 191: 7972+10 0E93 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: - 0E94 ide_printerror: 204: 7982+10 0E94 21C90E LD HL, [str_error_start] 205: 7992+17 0E97 CD1D01 CALL print_str 206: 8009+7 0E9A 060F LD B, IDE_REG_CMDSTS 207: 8016+17 0E9C CD330E CALL ide_regread_8 208: 8033+17 0E9F CD4301 CALL print_a_hex 209: 8050+10 0EA2 21E60E LD HL, [str_error_start1] 210: 8060+17 0EA5 CD1D01 CALL print_str 211: 8077+13 0EA8 3ACB41 LD A,(MEM_IDE_DEVICE) 212: 8090+17 0EAB CD4301 CALL print_a_hex 213: 8107+10 0EAE 21EF0E LD HL, [str_error_start2] 214: 8117+17 0EB1 CD1D01 CALL print_str 215: 8134+7 0EB4 0609 LD B, IDE_REG_ERROR 216: 8141+17 0EB6 CD330E CALL ide_regread_8 217: 8158+17 0EB9 CD4301 CALL print_a_hex 218: 8175+7 0EBC 3E0A LD A,10 219: 8182+17 0EBE CD1501 CALL print_char 220: 8199+7 0EC1 3E0D LD A,13 221: 8206+17 0EC3 CD1501 CALL print_char 222: 8223+7 0EC6 3E01 LD A,1 223: 8230+10 0EC8 C9 RET 224: 225: - 0EC9 str_error_start: 226: - 0EC9 0D0A4469 db 13,10,"Disk I/O error. Status: 0x",0 736B2049 2F4F2065 72726F72 2E205374 61747573 3A203078 00 227: - 0EE6 str_error_start1: 228: - 0EE6 20446576 db " Dev: 0x",0 3A203078 00 229: - 0EEF str_error_start2: 230: - 0EEF 20457272 db " Err: 0x",0 3A203078 00 231: 232: - 0EF8 str_error_time: 233: - 0EF8 0D0A4469 db 13,10,"Disk I/O error. Data timeout @ 0x",0 736B2049 2F4F2065 72726F72 2E204461 74612074 696D656F 75742040 20307800 **** main.asm **** 190: .include "kdrv_ideif.s" ;include ide driver. **** include/kdrv_ideif.s **** 1: ;---------------------------------------------------------------- 2: ;BIOS Driver for IDE Access 3: ;by Dennis Gunia (01/2023) 4: ;---------------------------------------------------------------- 5: 6: ;================================================================ 7: ; IDE commands 8: ;================================================================ 9: - 00EC IDE_CMD_IDENT .EQU 0xEC ;Identify drive. 10: - 0020 IDE_CMD_READSEC .EQU 0x20 ;Read sectors. 11: 12: ;================================================================ 13: ; IDE Variables 14: ;================================================================ 15: - 41CB phase var_idebuffer 16: - 41CB MEM_IDE_DEVICE: 17: - 41CB ..41CB 00 defs 1 18: - 41CC MEM_IDE_STATUS: 19: - 41CC ..41CC 00 defs 1 ;1Byte: 0x00 if status is okay 20: - 41CD MEM_IDE_PARTITION: 21: - 41CD ..41D0 00 defs 4 ;4*16Bytes: LBA first sector 22: - 41D1 MEM_IDE_POINTER: 23: - 41D1 ..41D4 00 defs 4 ;4*16Bytes: LBA first sector 24: - 41D5 MEM_IDE_DEV_TABLE: 25: - 41D5 ..4214 00 defs 16*4 26: - 4215 MEM_IDE_SELECTED: 27: - 4215 ..4215 00 defs 1 28: - 4216 MEM_IDE_STRING_0: 29: - 4216 ..423D 00 defs 40 30: - 423E MEM_IDE_STRING_1: 31: - 423E ..4265 00 defs 40 32: - 4266 MEM_IDE_STRING_2: 33: - 4266 ..428D 00 defs 40 34: - 428E MEM_IDE_STRING_3: 35: - 428E ..42B5 00 defs 40 36: - 42B6 MEM_IDE_BUFFER: 37: - 42B6 ..44B5 00 defs 512 38: - 44B6 MEM_IDE_FSBUFFER: 39: - 44B6 ..45B5 00 defs 256 40: - 1307 dephase 41: ;DEV-Table layout 42: ; 0x00 0x00 43: ;Status: 0x00 -> Ready 44: ; 0x01 -> Not found 45: ; 0x02 -> No supported filesystem 46: ;I/O Addr: Base addr of 82C55 47: ;Type: File system type 48: 49: 50: - 1307 IDE_DEV_TABLE: 51: - 1307 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 16420000 52: - 1317 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 3E420000 53: - 1327 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 66420000 54: - 1337 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 8E420000 55: 56: ;================================================================ 57: ; IDE funtions 58: ;================================================================ 59: 60: ;------------------------------------------------------------------------------ 61: ; ideif_init_table 62: ; 63: ; initializes drive table 64: ;------------------------------------------------------------------------------ 65: - 1347 ideif_init_devtable: 66: ;copy default values to ram 67: 8240+10 1347 210713 ld hl,[IDE_DEV_TABLE] 68: 8250+10 134A 11D541 ld de,[MEM_IDE_DEV_TABLE] 69: 8260+10 134D 014000 ld bc,16*4 70: 8270+16+5 1350 EDB0 ldir 71: ;set selected device 72: 8286+7 1352 3E00 ld a,0 73: 8293+13 1354 321542 ld (MEM_IDE_SELECTED),a 74: ;set empty names 75: 8306+4 1357 AF xor a 76: 8310+13 1358 321642 ld (MEM_IDE_STRING_0),a 77: 8323+13 135B 323E42 ld (MEM_IDE_STRING_1),a 78: 8336+13 135E 326642 ld (MEM_IDE_STRING_2),a 79: 8349+13 1361 328E42 ld (MEM_IDE_STRING_3),a 80: 8362+10 1364 C9 ret 81: 82: ;------------------------------------------------------------------------------ 83: ; ideif_prnt_devtable 84: ; 85: ; prints drive table 86: ;------------------------------------------------------------------------------ 87: - 1365 ideif_prnt_devtable: 88: 8372+17 1365 CD2D01 call print_newLine 89: 8389+10 1368 211216 ld hl,[_ideif_prnt_devtable_hdr] 90: 8399+17 136B CD1D01 call print_str 91: 8416+10 136E 21D541 ld hl,[MEM_IDE_DEV_TABLE] 92: 8426+7 1371 0600 ld b,0 ;device number 93: - 1373 _ideif_prnt_devtable_l1: ;loop 1 -> for each device 94: ;print if selected 95: 8433+13 1373 3A1542 ld a,(MEM_IDE_SELECTED) 96: 8446+4 1376 B8 cp b 97: 8450+10 1377 CA7E13 jp z,_ideif_prnt_devtable_l1_sel 98: 8460+7 137A 3E20 ld a, ' ' 99: 8467+12 137C 1802 jr _ideif_prnt_devtable_l1_nxt 100: - 137E _ideif_prnt_devtable_l1_sel: 101: 8479+7 137E 3E2A ld a, '*' 102: - 1380 _ideif_prnt_devtable_l1_nxt: 103: 8486+17 1380 CD1501 call print_char 104: ;print drive letter 105: 8503+4 1383 78 ld a,b 106: 8507+7 1384 C645 add 69 ;offset letter to D 107: 8514+17 1386 CD1501 call print_char 108: 8531+7 1389 3E3A ld a, ':' 109: 8538+17 138B CD1501 call print_char 110: 8555+7 138E 3E20 ld a, ' ' 111: 8562+17 1390 CD1501 call print_char 112: ;print status 113: 8579+11 1393 E5 push hl 114: 8590+7 1394 7E ld a,(HL) 115: 8597+4 1395 B7 or a 116: 8601+7+5 1396 280E jr z, _ideif_prnt_devtable_l1_s00 117: 8608+7 1398 FE01 cp 0x01 118: 8615+7+5 139A 280F jr z, _ideif_prnt_devtable_l1_s01 119: 8622+7 139C FE02 cp 0x02 120: 8629+7+5 139E 2810 jr z, _ideif_prnt_devtable_l1_s02 121: 8636+7 13A0 FEFF cp 0xFF 122: 8643+7+5 13A2 2811 jr z, _ideif_prnt_devtable_l1_sFF 123: 8650+12 13A4 180F jr _ideif_prnt_devtable_l1_sFF 124: - 13A6 _ideif_prnt_devtable_l1_s00 125: 8662+10 13A6 214A16 ld hl,[_ideif_prnt_devtable_s00] 126: 8672+12 13A9 180D jr _ideif_prnt_devtable_l1_es 127: - 13AB _ideif_prnt_devtable_l1_s01 128: 8684+10 13AB 215516 ld hl,[_ideif_prnt_devtable_s01] 129: 8694+12 13AE 1808 jr _ideif_prnt_devtable_l1_es 130: - 13B0 _ideif_prnt_devtable_l1_s02 131: 8706+10 13B0 216016 ld hl,[_ideif_prnt_devtable_s02] 132: 8716+12 13B3 1803 jr _ideif_prnt_devtable_l1_es 133: - 13B5 _ideif_prnt_devtable_l1_sFF 134: 8728+10 13B5 216B16 ld hl,[_ideif_prnt_devtable_sFF] 135: - 13B8 _ideif_prnt_devtable_l1_es 136: 8738+17 13B8 CD1D01 call print_str 137: 8755+10 13BB E1 pop hl 138: 8765+6 13BC 23 inc hl 139: ;print FS-Type 140: 8771+7 13BD 3E30 ld a,'0' 141: 8778+17 13BF CD1501 call print_char 142: 8795+7 13C2 3E78 ld a,'x' 143: 8802+17 13C4 CD1501 call print_char 144: 8819+7 13C7 7E ld a,(HL) 145: 8826+17 13C8 CD4301 call print_a_hex 146: 8843+7 13CB 3E20 ld a,' ' 147: 8850+17 13CD CD1501 call print_char 148: 8867+6 13D0 23 inc hl 149: ;print first sector 150: 8873+11 13D1 E5 push hl 151: 8884+14 13D2 DDE1 pop ix 152: 153: 8898+6 13D4 23 inc hl 154: 8904+6 13D5 23 inc hl 155: 8910+6 13D6 23 inc hl 156: 8916+6 13D7 23 inc hl 157: 8922+6 13D8 23 inc hl 158: 8928+6 13D9 23 inc hl 159: 8934+6 13DA 23 inc hl 160: 8940+6 13DB 23 inc hl 161: 162: 8946+19 13DC DD7E03 ld a,(ix+3) 163: 8965+17 13DF CD4301 call print_a_hex 164: 8982+19 13E2 DD7E02 ld a,(ix+2) 165: 9001+17 13E5 CD4301 call print_a_hex 166: 9018+19 13E8 DD7E01 ld a,(ix+1) 167: 9037+17 13EB CD4301 call print_a_hex 168: 9054+19 13EE DD7E00 ld a,(ix+0) 169: 9073+17 13F1 CD4301 call print_a_hex 170: 9090+7 13F4 3E20 ld a,' ' 171: 9097+17 13F6 CD1501 call print_char 172: ;print length 173: 9114+19 13F9 DD7E07 ld a,(ix+7) 174: 9133+17 13FC CD4301 call print_a_hex 175: 9150+19 13FF DD7E06 ld a,(ix+6) 176: 9169+17 1402 CD4301 call print_a_hex 177: 9186+19 1405 DD7E05 ld a,(ix+5) 178: 9205+17 1408 CD4301 call print_a_hex 179: 9222+19 140B DD7E04 ld a,(ix+4) 180: 9241+17 140E CD4301 call print_a_hex 181: 9258+7 1411 3E20 ld a,' ' 182: 9265+17 1413 CD1501 call print_char 183: ;print Port 184: 9282+7 1416 3E30 ld a,'0' 185: 9289+17 1418 CD1501 call print_char 186: 9306+7 141B 3E78 ld a,'x' 187: 9313+17 141D CD1501 call print_char 188: 9330+7 1420 7E ld a,(HL) 189: 9337+17 1421 CD4301 call print_a_hex 190: 9354+7 1424 3E20 ld a,' ' 191: 9361+17 1426 CD1501 call print_char 192: 9378+6 1429 23 inc hl 193: ;print M/S 194: 9384+7 142A 7E ld a,(HL) 195: 9391+11 142B E5 push hl 196: 9402+4 142C B7 or a 197: 9406+10 142D CA3614 jp z,_ideif_prnt_devtable_l1_ms 198: 9416+10 1430 217E16 ld hl,[_ideif_prnt_devtable_slave] 199: 9426+10 1433 C33914 jp _ideif_prnt_devtable_l1_e2 200: - 1436 _ideif_prnt_devtable_l1_ms 201: 9436+10 1436 217616 ld hl,[_ideif_prnt_devtable_master] 202: - 1439 _ideif_prnt_devtable_l1_e2 203: 9446+17 1439 CD1D01 call print_str 204: 9463+10 143C E1 pop hl 205: 9473+6 143D 23 inc hl 206: ;print str 207: 9479+11 143E C5 push bc 208: 9490+7 143F 7E ld a,(hl) 209: 9497+4 1440 4F ld c,a 210: 9501+6 1441 23 inc hl 211: 9507+7 1442 7E ld a,(hl) 212: 9514+4 1443 47 ld b,a 213: 9518+6 1444 23 inc hl 214: 9524+11 1445 E5 push hl 215: 9535+4 1446 60 ld h,b 216: 9539+4 1447 69 ld l,c 217: 9543+17 1448 CD1D01 call print_str 218: 9560+17 144B CD2D01 call print_newLine 219: 9577+10 144E E1 pop hl 220: 9587+10 144F C1 pop bc 221: ;next 222: 9597+6 1450 23 inc hl 223: 9603+6 1451 23 inc hl 224: 9609+4 1452 04 inc b 225: 9613+4 1453 78 ld a,b 226: 9617+7 1454 FE04 cp 4 227: 9624+5+6 1456 C8 ret z 228: 9629+10 1457 C37313 jp _ideif_prnt_devtable_l1 229: ;------------------------------------------------------------------------------ 230: ; ideif_init_drive 231: ; 232: ; initializes selected drive in table 233: ;------------------------------------------------------------------------------ 234: - 145A ideif_init_drive: 235: 9639+17 145A CD3A15 call ideif_get_drv_pointer 236: ; load addresses. not used atm 237: ;ld a,(IX+6) ;load IO Addr 238: ;ld d,a 239: ;ld a,(IX+7) ;load Master/Slave bit 240: ;ld e,a 241: 9656+17 145D CD0D0E call ide_reset 242: 243: 9673+10 1460 11FFAF ld de, 0xAFFF ;preload timeout counter 244: - 1463 _ideif_init_drive_loop: 245: 9683+7 1463 060F ld b, IDE_REG_CMDSTS 246: 9690+17 1465 CD330E call ide_regread_8 ;read drive status register 247: 9707+4 1468 B7 or a 248: 9711+7+5 1469 280B jr z,_ideif_init_drive_nodrv ;no drive found 249: 9718+8 146B CB77 bit 6,a 250: 9726+7+5 146D 200C jr nz, _ideif_init_drive_found 251: 9733+6 146F 1B dec de 252: 9739+4 1470 7A ld a,d 253: 9743+4 1471 B3 or e 254: 9747+7+5 1472 2802 jr z, _ideif_init_drive_nodrv 255: 9754+12 1474 18ED jr _ideif_init_drive_loop 256: 257: - 1476 _ideif_init_drive_nodrv: 258: 9766+19 1476 DD360001 ld(ix+0),0x01 259: 9785+10 147A C9 ret 260: 261: - 147B _ideif_init_drive_found: 262: 9795+19 147B DD360002 ld (ix+0),0x02 263: ;get drive name 264: 9814+7 147F 060F ld b, IDE_REG_CMDSTS ;Get drive identification 265: 9821+7 1481 3EEC ld a, IDE_CMD_IDENT 266: 9828+17 1483 CD190E call ide_regwrite_8 ;Write command to drive 267: 9845+10 1486 21B642 ld hl, MEM_IDE_BUFFER ;set read/write buffer start address 268: 9855+17 1489 CD490E call ide_readsector_512_fast ;read 256 words from device 269: 9872+10 148C 21EC42 ld hl,MEM_IDE_BUFFER + 54 ;print device serial 270: 9882+19 148F DD7E0C ld a,(ix+12) ;load str pointer into de 271: 9901+4 1492 5F ld e,a 272: 9905+19 1493 DD7E0D ld a,(ix+13) 273: 9924+4 1496 57 ld d,a 274: 9928+7 1497 0614 ld b,20 275: - 1499 _ideif_init_drive_charloop: 276: 9935+7 1499 7E ld a,(hl) ;load data from HL (buffer) 277: 9942+6 149A 23 inc hl 278: 9948+4 149B 08 ex af,af' 279: 9952+7 149C 7E ld a,(hl) 280: 9959+6 149D 23 inc hl 281: 9965+7 149E 12 ld (de),a 282: 9972+6 149F 13 inc de 283: 9978+4 14A0 08 ex af,af' 284: 9982+7 14A1 12 ld (de),a 285: 9989+6 14A2 13 inc de 286: 9995+8+5 14A3 10F4 djnz _ideif_init_drive_charloop 287: ;get partition table 288: ;read bootsector 289: - 14A5 ?a0000: 289:10003+7 14A5 060F ld b, IDE_REG_CMDSTS 289:10010+17 14A7 CD330E call ide_regread_8 289:10027+4 14AA 17 rla 289:10031+7+5 14AB 38F8 jr c, ?a0000 289: - 14AD endm 289:10003+35 14A5 060FCD33 ide_wait_rdy 0E1738F8 290:10038+7 14AD 3E01 ld a,1 ;read 1 sector 291:10045+7 14AF 060A ld B,IDE_REG_SECTOR 292:10052+17 14B1 CD190E call ide_regwrite_8 293:10069+7 14B4 3E00 ld a,0 ;read sector 0 294:10076+7 14B6 060B ld b,IDE_REG_LBA0 295:10083+17 14B8 CD190E call ide_regwrite_8 296:10100+7 14BB 3E00 ld a,0 ;read cylinder 0 297:10107+7 14BD 060C ld b,IDE_REG_LBA1 298:10114+17 14BF CD190E call ide_regwrite_8 299:10131+7 14C2 3E00 ld a,0 300:10138+7 14C4 060D ld b,IDE_REG_LBA2 301:10145+17 14C6 CD190E call ide_regwrite_8 302:10162+7 14C9 3EE0 ld a,11100000b ;read head 0 303:10169+7 14CB 060E ld b,IDE_REG_LBA3 304:10176+17 14CD CD190E call ide_regwrite_8 305: 306:10193+7 14D0 3E20 ld a,IDE_CMD_READSEC ;send read command 307:10200+7 14D2 060F ld b,IDE_REG_CMDSTS 308:10207+17 14D4 CD190E call ide_regwrite_8 309: 310:10224+10 14D7 21B642 ld hl, MEM_IDE_BUFFER ;set read/write buffer start address 311:10234+17 14DA CD490E call ide_readsector_512_fast ;read 256 words from device 312: ;prepare partitions 313:10251+7 14DD 0604 ld b,4 ;Partition table length 314:10258+7 14DF 0E00 ld c,0 ;Partition ID counter 315:10265+14 14E1 FD217444 ld iy,MEM_IDE_BUFFER+446 ;Load offest of first partition table entry 316: - 14E5 _ideif_init_drive_prt_l1: 317:10279+19 14E5 FD7E04 ld a,(iy+4) ;load status byte 318:10298+4 14E8 B7 or a 319:10302+10 14E9 C2F714 jp NZ, _ideif_init_drive_prt_fnd ;If not zero, jump to print function 320:10312+10 14EC C3EF14 jp _ideif_init_drive_prt_ln 321: - 14EF _ideif_init_drive_prt_ln: 322:10322+10 14EF 111000 ld de,16 323:10332+15 14F2 FD19 add iy,de 324:10347+8+5 14F4 10EF djnz _ideif_init_drive_prt_l1 325:10355+10 14F6 C9 ret 326: - 14F7 _ideif_init_drive_prt_fnd; 327:10365+19 14F7 FD7E04 ld a,(iy+4) 328:10384+19 14FA DD7701 ld (ix+1),a ;store partition type 329:10403+7 14FD FE0E cp 0x0E ;if not 0xE0, continue with next entry 330:10410+7+5 14FF 20EE jr nz, _ideif_init_drive_prt_ln 331: ;get start LBA 332:10417+19 1501 FD7E08 ld a,(iy+0x08) 333:10436+19 1504 DD7702 ld (ix+0x02),a 334:10455+19 1507 FD7E09 ld a,(iy+0x09) 335:10474+19 150A DD7703 ld (ix+0x03),a 336:10493+19 150D FD7E0A ld a,(iy+0x0A) 337:10512+19 1510 DD7704 ld (ix+0x04),a 338:10531+19 1513 FD7E0B ld a,(iy+0x0B) 339:10550+19 1516 DD7705 ld (ix+0x05),a 340:10569+19 1519 DD360000 ld (ix+0),0x00 341: ;get count LBA 342:10588+19 151D FD7E0C ld a,(iy+0x0C) 343:10607+19 1520 DD7706 ld (ix+0x06),a 344:10626+19 1523 FD7E0D ld a,(iy+0x0D) 345:10645+19 1526 DD7707 ld (ix+0x07),a 346:10664+19 1529 FD7E0E ld a,(iy+0x0E) 347:10683+19 152C DD7708 ld (ix+0x08),a 348:10702+19 152F FD7E0F ld a,(iy+0x0F) 349:10721+19 1532 DD7709 ld (ix+0x09),a 350:10740+19 1535 DD360000 ld (ix+0),0x00 351:10759+10 1539 C9 ret 352: 353: ;------------------------------------------------------------------------------ 354: ; ideif_get_drv_pointer 355: ; 356: ; gets pointer to selected drive in table in IX 357: ;------------------------------------------------------------------------------ 358: - 153A ideif_get_drv_pointer: 359:10769+11 153A F5 push af 360:10780+11 153B C5 push bc 361: ;get selected drive 362:10791+13 153C 3A1542 ld a,(MEM_IDE_SELECTED) 363: ;multiply a *8 364:10804+4 153F 07 rlca ;*2 365:10808+4 1540 07 rlca ;*4 366:10812+4 1541 07 rlca ;*8 367:10816+7 1542 0600 ld b,0 368:10823+4 1544 4F ld c,a 369:10827+14 1545 DD21D541 ld ix,[MEM_IDE_DEV_TABLE] 370:10841+15 1549 DD09 add ix,bc 371:10856+10 154B C1 pop bc 372:10866+10 154C F1 pop af 373:10876+10 154D C9 ret 374: 375: ;------------------------------------------------------------------------------ 376: ; ideif_init_all 377: ; 378: ; initializes interface 379: ;------------------------------------------------------------------------------ 380: - 154E ideif_init_all: 381:10886+10 154E 21F215 ld hl, [str_dev_waitready] 382:10896+17 1551 CD1D01 call print_str ;print waiting message 383: 384:10913+17 1554 CD4713 call ideif_init_devtable 385:10930+17 1557 CD5A14 call ideif_init_drive 386: 387:10947+10 155A 210A16 ld hl, [str_dev_done] 388:10957+17 155D CD1D01 call print_str 389:10974+10 1560 C9 RET 390: 391: 392: ;------------------------------------------------------------------------------ 393: ; ideif_drv_sel 394: ; 395: ; Selects drive from table and initializes the fat16 file system 396: ; A contains drive id 397: ;------------------------------------------------------------------------------ 398: 399: 400: 401: ;------------------------------------------------------------------------------ 402: ; read_lba_sector 403: ; 404: ; Reads A*512 byte sector into memory 405: ; HL contains pointer to LBA address 406: ; DE contains destination location 407: ; A contains sector count 408: ;------------------------------------------------------------------------------ 409: - 1561 read_lba_sector: 410:10984+11 1561 F5 push af 411: - 1562 ?a0001: 411:10995+7 1562 060F ld b, IDE_REG_CMDSTS 411:11002+17 1564 CD330E call ide_regread_8 411:11019+4 1567 17 rla 411:11023+7+5 1568 38F8 jr c, ?a0001 411: - 156A endm 411:10995+35 1562 060FCD33 ide_wait_rdy 0E1738F8 412:11030+10 156A F1 pop af 413:11040+7 156B 060A LD B,IDE_REG_SECTOR ;amount of sectores 414:11047+17 156D CD190E CALL ide_regwrite_8 415: 416:11064+7 1570 7E LD A,(HL) 417:11071+7 1571 060B LD B,IDE_REG_LBA0 418:11078+17 1573 CD190E CALL ide_regwrite_8 419:11095+6 1576 23 INC HL 420:11101+7 1577 7E LD A,(HL) 421:11108+7 1578 060C LD B,IDE_REG_LBA1 422:11115+17 157A CD190E CALL ide_regwrite_8 423:11132+6 157D 23 INC HL 424:11138+7 157E 7E LD A,(HL) 425:11145+7 157F 060D LD B,IDE_REG_LBA2 426:11152+17 1581 CD190E CALL ide_regwrite_8 427:11169+6 1584 23 INC HL 428:11175+7 1585 7E LD A,(HL) 429:11182+7 1586 E60F AND 00001111b 430:11189+7 1588 F6E0 OR 11100000b 431:11196+7 158A 060E LD B,IDE_REG_LBA3 432:11203+17 158C CD190E CALL ide_regwrite_8 433: 434:11220+7 158F 3E20 LD A,IDE_CMD_READSEC ;send read command 435:11227+7 1591 060F LD B,IDE_REG_CMDSTS 436:11234+17 1593 CD190E CALL ide_regwrite_8 437: 438: ;LD HL,MEM_IDE_BUFFER ;set read/write buffer start address 439:11251+4 1596 EB EX DE,HL ;transfer destination in DE to HL 440:11255+10 1597 C3490E jp ide_readsector_512_fast ;read 256 words from device 441: 442: ;------------------------------------------------------------------------------ 443: ; ideif_drv_sel 444: ; 445: ; Select drive from table 446: ; Prepare variables 447: ; 448: ; A contains drive number 449: ;------------------------------------------------------------------------------ 450: - 159A ideif_drv_sel: 451:11265+13 159A 321542 ld (MEM_IDE_SELECTED),a 452:11278+11 159D F5 push af 453:11289+17 159E CD3A15 call ideif_get_drv_pointer ;test if drive is marked as available 454:11306+19 15A1 DD7E00 ld a,(ix+0) 455:11325+4 15A4 B7 or a 456:11329+10 15A5 C2D215 jp nz, _ideif_drv_sel_fail ;if not-> fail 457: 458:11339+17 15A8 CD6D20 call fat_get_root_table ;else get root table 459: 460:11356+10 15AB 218616 ld hl,[_ideif_drv_sel_pstr] ;print success message 461:11366+17 15AE CD1D01 call print_str 462:11383+10 15B1 F1 pop af 463:11393+7 15B2 C645 add 69 464:11400+13 15B4 322B41 ld (var_dir),a ;store drive letter 465:11413+17 15B7 CD1501 call print_char 466:11430+7 15BA 3E3A ld a, ':' 467:11437+13 15BC 322C41 ld (var_dir+1),a 468:11450+7 15BF 3E5C ld a, '\' 469:11457+13 15C1 322D41 ld (var_dir+2),a 470:11470+4 15C4 AF xor a ;set dir to empty 471:11474+13 15C5 322E41 ld (var_dir+3),a 472:11487+13 15C8 327A41 ld (var_dir+79),a ;set depth counter 473:11500+10 15CB 219D16 ld hl,[_ideif_drv_sel_sstr0] 474:11510+17 15CE CD1D01 call print_str 475:11527+10 15D1 C9 ret 476: - 15D2 _ideif_drv_sel_fail: 477:11537+10 15D2 218616 ld hl,[_ideif_drv_sel_pstr] 478:11547+17 15D5 CD1D01 call print_str 479:11564+10 15D8 F1 pop af 480:11574+7 15D9 C645 add 69 481:11581+17 15DB CD1501 call print_char 482:11598+10 15DE 218F16 ld hl,[_ideif_drv_sel_fstr0] 483:11608+17 15E1 CD1D01 call print_str 484:11625+4 15E4 AF xor a ;set dir to empty 485:11629+13 15E5 322B41 ld (var_dir),a 486:11642+10 15E8 112000 LD DE,0x20 487:11652+10 15EB 017000 LD BC,0x70 488:11662+17 15EE CDE80D CALL beep 489:11679+10 15F1 C9 ret 490: 491: 492: 493: 494: ;================================================================ 495: ; IDE strings 496: ;=============================================================== 497: 498: - 15F2 str_dev_waitready: 499: - 15F2 0D0A4465 db 13,10,"Detecting drives ... ",0 74656374 696E6720 64726976 6573202E 2E2E2000 500: - 160A str_dev_done: 501: - 160A 646F6E65 db "done!",13,10,0 210D0A00 502: 503: - 1612 _ideif_prnt_devtable_hdr: 504: - 1612 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 505: - 164A _ideif_prnt_devtable_s00: 506: - 164A 41766169 db "Avail ",0 6C202020 202000 507: - 1655 _ideif_prnt_devtable_s01: 508: - 1655 4E6F7420 db "Not Found ",0 466F756E 642000 509: - 1660 _ideif_prnt_devtable_s02: 510: - 1660 556E6B6F db "Unkown FS ",0 776E2046 532000 511: - 166B _ideif_prnt_devtable_sFF: 512: - 166B 4374726C db "Ctrl. Err ",0 2E204572 722000 513: - 1676 _ideif_prnt_devtable_master: 514: - 1676 4D617374 db "Master ",0 65722000 515: - 167E _ideif_prnt_devtable_slave: 516: - 167E 536C6176 db "Slave ",0 65202000 517: - 1686 _ideif_drv_sel_pstr: 518: - 1686 0A0D4472 db 10,13,"Drive ",0 69766520 00 519: - 168F _ideif_drv_sel_fstr0: 520: - 168F 3A206E6F db ": not ready",10,13,0 74207265 6164790A 0D00 521: - 169D _ideif_drv_sel_sstr0: 522: - 169D 3A207365 db ": selected",10,13,0 6C656374 65640A0D 00 523: - 16AA _ideif_drv_sel_syn: 524: - 16AA 0A0D496E db 10,13,"Invalid drive letter",10,13,0 76616C69 64206472 69766520 6C657474 65720A0D 00 **** main.asm **** 191: .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: - 16C3 iic_send_buffer: 28:11689+17 16C3 CD2917 CALL iic_send_sbit ;Send startbit 29:11706+4 16C6 79 LD A,C 30:11710+7 16C7 E6FE AND 0xFE ;Mask R/W bit (must be 0 for write) 31:11717+17 16C9 CDC317 CALL iic_send_byte ;Send Address 32:11734+17 16CC CD6317 CALL iic_read_ack 33:11751+4 16CF B7 OR A ; if no ack, error 34:11755+10 16D0 C2E716 JP NZ, iic_send_buffer_err 35: - 16D3 iic_send_buffer_loop; 36:11765+7 16D3 7E LD A,(HL) 37:11772+6 16D4 23 INC HL 38:11778+17 16D5 CDC317 CALL iic_send_byte 39:11795+17 16D8 CD6317 CALL iic_read_ack 40:11812+4 16DB B7 OR A ; if no ack, error 41:11816+10 16DC C2E716 JP NZ, iic_send_buffer_err 42:11826+8+5 16DF 10F2 DJNZ iic_send_buffer_loop ;loop for remaining bytes 43: - 16E1 iic_send_buffer_done: 44:11834+17 16E1 CD4217 CALL iic_send_ebit 45:11851+7 16E4 3E00 LD A,0 46:11858+10 16E6 C9 RET 47: - 16E7 iic_send_buffer_err: 48:11868+17 16E7 CD4217 CALL iic_send_ebit 49:11885+7 16EA 3E01 LD A,1 50:11892+10 16EC C9 RET 51: 52: ;HL contains buffer location 53: ;B defines amount of bytes to send 54: ;C contains device address 55: - 16ED iic_receive_buffer: 56:11902+4 16ED 05 DEC B 57:11906+17 16EE CD2917 CALL iic_send_sbit ;Send startbit 58:11923+4 16F1 79 LD A,C 59:11927+7 16F2 F601 OR 0x01 ;set R/W bit (must be 1 for read) 60:11934+17 16F4 CDC317 CALL iic_send_byte ;Send Address 61:11951+17 16F7 CD6317 CALL iic_read_ack 62:11968+4 16FA B7 OR A ; if no ack, error 63:11972+10 16FB C21617 JP NZ, iic_receive_buffer_err 64: - 16FE iic_receive_buffer_loop: 65:11982+17 16FE CDE917 CALL iic_receive_byte 66:11999+7 1701 77 LD (HL),A 67:12006+6 1702 23 INC HL 68:12012+17 1703 CD8917 CALL iic_send_ack 69:12029+8+5 1706 10F6 DJNZ iic_receive_buffer_loop 70: ; last time: 71:12037+17 1708 CDE917 CALL iic_receive_byte 72:12054+7 170B 77 LD (HL),A 73:12061+6 170C 23 INC HL 74:12067+17 170D CDA617 CALL iic_send_nack 75: 76: - 1710 iic_receive_buffer_done: 77:12084+17 1710 CD4217 CALL iic_send_ebit 78:12101+7 1713 3E00 LD A,0 79:12108+10 1715 C9 RET 80: - 1716 iic_receive_buffer_err: 81:12118+17 1716 CD4217 CALL iic_send_ebit 82:12135+7 1719 3E01 LD A,1 83:12142+10 171B C9 RET 84: 85: 86: 87: ;================================================================ 88: ; I/O access functions 89: ;================================================================ 90: 91: ;Reset PIO configuration 92: - 171C iic_init: 93: ;SCL HIGH, SDA HIGH 94:12152+7 171C 3E03 LD A,0x03 95:12159+11 171E D3F4 OUT (CS_PIO_AD), A 96: ;Set port to controll mode (MODE3) 97:12170+7 1720 3ECF LD A,0xCF 98:12177+11 1722 D3F6 OUT (CS_PIO_AC), A 99: ;Set inputs/outputs 100:12188+7 1724 3EF0 LD A,0xF0 101:12195+11 1726 D3F6 OUT (CS_PIO_AC), A 102:12206+10 1728 C9 RET 103: 104: ; send start bit 105: - 1729 iic_send_sbit: 106: ;SCL HIGH, SDA HIGH 107:12216+7 1729 3E03 LD A,0x03 108:12223+11 172B D3F4 OUT (CS_PIO_AD), A 109: ;Set port to controll mode (MODE3) 110:12234+7 172D 3ECF LD A,0xCF 111:12241+11 172F D3F6 OUT (CS_PIO_AC), A 112: ;Set inputs/outputs (SDA and SCL is now output) 113:12252+7 1731 3EFC LD A,0xFC 114:12259+11 1733 D3F6 OUT (CS_PIO_AC), A 115: ;SCL HIGH, SDA LOW 116:12270+7 1735 3E02 LD A,0x02 117:12277+11 1737 D3F4 OUT (CS_PIO_AD), A 118:12288+4 1739 00 NOP 119:12292+4 173A 00 NOP 120:12296+7 173B 3E00 LD A,0x00 121:12303+11 173D D3F4 OUT (CS_PIO_AD), A 122:12314+4 173F 00 NOP 123:12318+4 1740 00 NOP 124:12322+10 1741 C9 RET 125: 126: ; send end/stop bit 127: - 1742 iic_send_ebit: 128: ;Set port to controll mode (MODE3) 129:12332+7 1742 3ECF LD A,0xCF 130:12339+11 1744 D3F6 OUT (CS_PIO_AC), A 131: 132: ;Set inputs/outputs (SDA and SCL is now output) 133:12350+7 1746 3EFC LD A,0xFC 134:12357+11 1748 D3F6 OUT (CS_PIO_AC), A 135: ;SCL HIGH, SDA LOW 136:12368+7 174A 3E02 LD A,0x02 137:12375+11 174C D3F4 OUT (CS_PIO_AD), A 138:12386+4 174E 00 NOP 139:12390+4 174F 00 NOP 140:12394+7 1750 3E03 LD A,0x03 ; both high 141:12401+11 1752 D3F4 OUT (CS_PIO_AD), A 142:12412+4 1754 00 NOP 143:12416+4 1755 00 NOP 144: ;release bus 145: ;Set port to controll mode (MODE3) 146:12420+7 1756 3ECF LD A,0xCF 147:12427+11 1758 D3F6 OUT (CS_PIO_AC), A 148:12438+4 175A 00 NOP 149:12442+4 175B 00 NOP 150: ;Set inputs/outputs (SDA and SCL is now input, sound enabled) 151:12446+7 175C 3EF7 LD A,11110111b 152:12453+11 175E D3F6 OUT (CS_PIO_AC), A 153:12464+4 1760 00 NOP 154:12468+4 1761 00 NOP 155:12472+10 1762 C9 RET 156: 157: 158: - 1763 iic_read_ack: 159:12482+7 1763 3ECF LD A,0xCF 160:12489+11 1765 D3F6 OUT (CS_PIO_AC), A 161: ;Set inputs/outputs (SCL is now output, SDA input) 162:12500+7 1767 3EFD LD A,0xFD 163:12507+11 1769 D3F6 OUT (CS_PIO_AC), A 164:12518+4 176B 00 NOP 165:12522+4 176C 00 NOP 166:12526+7 176D 3E00 LD A,0x00 ;set SCL LOW 167:12533+11 176F D3F4 OUT (CS_PIO_AD), A 168:12544+4 1771 00 NOP 169:12548+4 1772 00 NOP 170:12552+7 1773 EE02 XOR 0x02 ;set SCL HIGH 171:12559+11 1775 D3F4 OUT (CS_PIO_AD), A 172:12570+4 1777 00 NOP 173:12574+11 1778 DBF4 IN A,(CS_PIO_AD) ; Read SDA 174:12585+4 177A 00 NOP 175:12589+4 177B 00 NOP 176:12593+11 177C F5 PUSH AF 177:12604+7 177D E6FE AND 0xFE ; Filter input 178:12611+7 177F EE02 XOR 0x02 ;set SCL LOW 179:12618+11 1781 D3F4 OUT (CS_PIO_AD), A 180:12629+4 1783 00 NOP 181:12633+4 1784 00 NOP 182:12637+10 1785 F1 POP AF 183:12647+7 1786 E601 AND 1 184:12654+10 1788 C9 RET 185: 186: - 1789 iic_send_ack: 187: ;Set port to controll mode (MODE3) 188:12664+7 1789 3ECF LD A,0xCF 189:12671+11 178B D3F6 OUT (CS_PIO_AC), A 190: ;Set inputs/outputs (SDA and SCL is now output) 191:12682+7 178D 3EFC LD A,0xFC 192:12689+11 178F D3F6 OUT (CS_PIO_AC), A 193:12700+4 1791 00 NOP 194:12704+4 1792 00 NOP 195:12708+7 1793 3E00 LD A,0x00 ; SCL LOW, SDA LOW 196:12715+11 1795 D3F4 OUT (CS_PIO_AD), A 197:12726+4 1797 00 NOP 198:12730+4 1798 00 NOP 199:12734+7 1799 3E02 LD A,0x02 ; SCL HIGH, SDA LOW 200:12741+11 179B D3F4 OUT (CS_PIO_AD), A 201:12752+4 179D 00 NOP 202:12756+4 179E 00 NOP 203:12760+7 179F 3E00 LD A,0x00 ; SCL LOW, SDA LOW 204:12767+11 17A1 D3F4 OUT (CS_PIO_AD), A 205:12778+4 17A3 00 NOP 206:12782+4 17A4 00 NOP 207:12786+10 17A5 C9 RET 208: 209: - 17A6 iic_send_nack: 210: ;Set port to controll mode (MODE3) 211:12796+7 17A6 3ECF LD A,0xCF 212:12803+11 17A8 D3F6 OUT (CS_PIO_AC), A 213: ;Set inputs/outputs (SDA and SCL is now output) 214:12814+7 17AA 3EFC LD A,0xFC 215:12821+11 17AC D3F6 OUT (CS_PIO_AC), A 216:12832+4 17AE 00 NOP 217:12836+4 17AF 00 NOP 218:12840+7 17B0 3E02 LD A,0x02 ; SCL LOW, SDA HIGH 219:12847+11 17B2 D3F4 OUT (CS_PIO_AD), A 220:12858+4 17B4 00 NOP 221:12862+4 17B5 00 NOP 222:12866+7 17B6 3E03 LD A,0x03 ; both high 223:12873+11 17B8 D3F4 OUT (CS_PIO_AD), A 224:12884+4 17BA 00 NOP 225:12888+4 17BB 00 NOP 226:12892+7 17BC 3E02 LD A,0x02 ; SCL LOW, SDA HIGH 227:12899+11 17BE D3F4 OUT (CS_PIO_AD), A 228:12910+4 17C0 00 NOP 229:12914+4 17C1 00 NOP 230:12918+10 17C2 C9 RET 231: 232: ;A contains byte 233: - 17C3 iic_send_byte: 234:12928+11 17C3 C5 PUSH BC 235:12939+4 17C4 4F LD C,A ;buffer 236: ;Set port to controll mode (MODE3) 237:12943+7 17C5 3ECF LD A,0xCF 238:12950+11 17C7 D3F6 OUT (CS_PIO_AC), A 239: ;Set inputs/outputs (SDA and SCL is now output) 240:12961+7 17C9 3EFC LD A,0xFC 241:12968+11 17CB D3F6 OUT (CS_PIO_AC), A 242:12979+7 17CD 0608 LD B,8 ;bit counter 243: 244: - 17CF iic_send_byte_loop: 245: ;prepare data 246:12986+8 17CF CB11 RL C 247:12994+7 17D1 3E00 LD A,0 248:13001+4 17D3 17 RLA ; set SCA bit from carry, SCL LOW 249:13005+11 17D4 D3F4 OUT (CS_PIO_AD), A 250:13016+4 17D6 00 NOP 251:13020+4 17D7 00 NOP 252:13024+7 17D8 EE02 XOR 0x02 ;set SCL HIGH 253:13031+11 17DA D3F4 OUT (CS_PIO_AD), A 254:13042+4 17DC 00 NOP 255:13046+4 17DD 00 NOP 256:13050+7 17DE EE02 XOR 0x02 ;set SCL LOW 257:13057+11 17E0 D3F4 OUT (CS_PIO_AD), A 258:13068+4 17E2 00 NOP 259:13072+4 17E3 00 NOP 260:13076+8+5 17E4 10E9 DJNZ iic_send_byte_loop ;loop until counter is 0 261: ;transmittion end / end loop 262:13084+4 17E6 79 LD A,C 263:13088+10 17E7 C1 POP BC 264:13098+10 17E8 C9 RET 265: 266: - 17E9 iic_receive_byte: 267:13108+11 17E9 C5 PUSH BC 268: ;Set port to controll mode (MODE3) 269:13119+7 17EA 3ECF LD A,0xCF 270:13126+11 17EC D3F6 OUT (CS_PIO_AC), A 271: ;Set inputs/outputs (SCL is now output, SDA input) 272:13137+7 17EE 3EFD LD A,0xFD 273:13144+11 17F0 D3F6 OUT (CS_PIO_AC), A 274:13155+7 17F2 0608 LD B,8 ;bit counter 275:13162+7 17F4 0E00 LD C,0 276: - 17F6 iic_receive_byte_loop: 277:13169+4 17F6 AF XOR A ;set SCL LOW 278:13173+11 17F7 D3F4 OUT (CS_PIO_AD), A 279:13184+4 17F9 00 NOP 280:13188+4 17FA 00 NOP 281:13192+7 17FB 3E02 LD A,2 ;set SCL HIGH 282:13199+11 17FD D3F4 OUT (CS_PIO_AD), A 283:13210+4 17FF 00 NOP 284:13214+11 1800 DBF4 IN A, (CS_PIO_AD) 285:13225+4 1802 00 NOP 286:13229+4 1803 1F RRA ;read SDA bit 287:13233+8 1804 CB11 RL C ;store bit 288:13241+4 1806 AF XOR A ;set SCL LOW again 289:13245+11 1807 D3F4 OUT (CS_PIO_AD), A 290:13256+4 1809 00 NOP 291:13260+4 180A 00 NOP 292:13264+8+5 180B 10E9 DJNZ iic_receive_byte_loop 293:13272+4 180D 79 LD A,C 294:13276+10 180E C1 POP BC **** main.asm **** 192:13286+10 180F C9 RET 193: .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: - 1810 dump_pretty: 15:13296+11 1810 E5 PUSH HL 16:13307+10 1811 216B18 LD HL,[STR_PD_HEADER] ;Print header 17:13317+17 1814 CD1D01 CALL print_str 18:13334+10 1817 E1 POP HL 19: - 1818 dump_pretty_row: 20:13344+4 1818 78 LD A,B ;Check row counter 21:13348+4 1819 B7 OR A 22:13352+10 181A CA6A18 JP Z, dump_pretty_end ;If counter is 0, exit 23:13362+4 181D 05 DEC B ;Decrement row counter by 1 24:13366+7 181E 0E10 LD C, 16 ;Load column counter 25:13373+4 1820 7C LD A, H ;Print base address 26:13377+17 1821 CD4301 CALL print_a_hex 27:13394+4 1824 7D LD A, L 28:13398+17 1825 CD4301 CALL print_a_hex 29:13415+7 1828 3E20 LD A, ' ' 30:13422+17 182A CD1501 CALL print_char 31: - 182D dump_pretty_col: ;Loop for column 32:13439+7 182D 7E LD A,(HL) ;Load byte to disply 33:13446+17 182E CD4301 CALL print_a_hex 34:13463+7 1831 3E20 LD A, ' ' 35:13470+17 1833 CD1501 CALL print_char 36:13487+6 1836 23 INC HL 37:13493+4 1837 0D DEC C ;Decrement column counter 38:13497+7+5 1838 20F3 JR NZ, dump_pretty_col ;Loop if not 0 39: - 183A dump_pretty_ascii: 40:13504+11 183A C5 PUSH BC 41:13515+11 183B E5 PUSH HL 42:13526+7 183C 0600 LD B,0 43:13533+7 183E 0E10 LD C,16 44:13540+15 1840 ED42 SBC HL,BC ;Reset HL by column count 45: - 1842 dump_pretty_ascii_loop: 46:13555+7 1842 7E LD A,(HL) 47:13562+6 1843 23 INC HL 48:13568+7 1844 FE20 CP 32 49:13575+10 1846 DA5318 JP C, dump_pretty_ascii_none ;if less than 32, it is not a char 50:13585+7 1849 FE7F CP 127 51:13592+10 184B D25318 JP NC, dump_pretty_ascii_none ;if greater or equal than 128, it is not a char 52:13602+17 184E CD1501 call print_char 53:13619+12 1851 1805 jr dump_pretty_ascii_cont 54: - 1853 dump_pretty_ascii_none: 55:13631+7 1853 3E2E LD A,'.' 56:13638+17 1855 CD1501 call print_char 57: - 1858 dump_pretty_ascii_cont: 58:13655+4 1858 0D DEC C 59:13659+10 1859 C24218 JP NZ, dump_pretty_ascii_loop 60: 61: 62:13669+10 185C E1 POP HL 63:13679+10 185D C1 POP BC 64: - 185E dump_pretty_nextrow: 65:13689+7 185E 3E0A LD A,10 ;New line 66:13696+17 1860 CD1501 CALL print_char 67:13713+7 1863 3E0D LD A,13 68:13720+17 1865 CD1501 CALL print_char 69:13737+12 1868 18AE JR dump_pretty_row ;Else next line 70: - 186A dump_pretty_end: 71:13749+10 186A C9 RET 72: 73: - 186B STR_PD_HEADER: 74: - 186B 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: - 18AA print_str_fixed: 85:13759+7 18AA 7E LD A,(HL) 86:13766+6 18AB 23 INC HL 87:13772+17 18AC CD1501 CALL print_char 88:13789+8+5 18AF 10F9 DJNZ print_str_fixed 89:13797+10 18B1 C9 RET 90: **** main.asm **** 194: .include "command.s" **** include/command.s **** 1: - 18B2 COMMAND_LUT: 2: - 18B2 64617465 db "date", 0 , [OP_RTIME], [OP_RTIME]>>8 ;Read time 00EF1B 3: - 18B9 73657464 db "setdate", 0 , [OP_STIME], [OP_STIME]>>8 ;Read time 61746500 871D 4: - 18C3 70696E20 db "pin ", 0 , [OP_IO_IN], [OP_IO_IN]>>8 ;Read port 00081B 5: - 18CA 64756D70 db "dump ",0, [OP_DUMP], [OP_DUMP]>>8 ;print pretty hexdump 2000771A 6: - 18D2 706F7574 db "pout ", 0 , [OP_IO_OUT], [OP_IO_OUT]>>8 ;Write port 20001E1B 7: - 18DA 69696E20 db "iin ", 0, [OP_IIC_IN], [OP_IIC_IN]>>8 ;Read IIC 009F1B 8: - 18E1 696F7574 db "iout ", 0, [OP_IIC_OUT], [OP_IIC_OUT]>>8 ;Write IIC 20003F1B 9: - 18E9 63616C6C db "call ", 0, [OP_CALL], [OP_CALL]>>8 ;Call to addr 2000571A 10: - 18F1 636C7200 db "clr", 0, [OP_CLR], [OP_CLR]>>8 ;Call to addr EB1B 11: - 18F7 6461736D db "dasm ", 0, [OP_DASM], [OP_DASM]>>8 ;Call to addr 2000D81A 12: - 18FF 6A702000 db "jp ", 0,[OP_EXEC], [OP_EXEC]>>8 ;jump to addr 3E1A 13: - 1905 72737400 db "rst", 0,0x00,0x00 ;soft reset 0000 14: - 190B 6C736473 db "lsdsk", 0,[OP_LSDSK], [OP_LSDSK]>>8 ;list disks 6B00001E 15: - 1913 73656C64 db "seldsk ", 0,[OP_SELDSK], [OP_SELDSK]>>8 ;select disk 736B2000 041E 16: - 191D 63642000 db "cd ", 0 , [OP_CD], [OP_CD]>>8 ;Read time 271E 17: - 1923 6C730023 db "ls", 0 , [OP_DIR], [OP_DIR]>>8 ;Read time 1E 18: - 1928 72756E20 db "run ", 0 , [OP_FSEXEC], [OP_FSEXEC]>>8 ;Read time 00441E 19: - 192F 24003E1A db "$", 0, [OP_EXEC], [OP_EXEC]>>8 ;jump to addr 20: - 1933 6900081B db "i", 0, [OP_IO_IN], [OP_IO_IN]>>8 ;Read port 21: - 1937 6F001E1B db "o", 0, [OP_IO_OUT], [OP_IO_OUT]>>8 ;Write port 22: - 193B 2100A71A db "!", 0, [OP_SET], [OP_SET]>>8 ;Write memory 23: - 193F 3F00771A db "?", 0, [OP_DUMP], [OP_DUMP]>>8 ;Print memory 24: - 1943 FF db 0xFF ;End of Table 25: 26: - 1944 COMMAND: 27:13807+17 1944 CD2D01 call print_newLine 28:13824+10 1947 212B41 ld hl,[var_dir] 29:13834+17 194A CD1D01 call print_str 30:13851+7 194D 3E3E ld a,'>' 31:13858+17 194F CD1501 call print_char 32:13875+4 1952 AF xor a ;reset buffer len 33:13879+13 1953 320041 ld (var_buffer_len),a ;set buffer len to 0 34: - 1956 COMMAND_READ: 35:13892+17 1956 CD5B01 call read_char 36:13909+10 1959 CA5619 jp z, COMMAND_READ ;wait for input 37:13919+7 195C FE0D cp 13 ; enter 38:13926+10 195E CAAB19 jp z,COMMAND_PROCESS 39:13936+7 1961 FE0A cp 10 40:13943+10 1963 CA5619 jp z, COMMAND_READ; skip LF for file load 41:13953+7 1966 FE08 cp 0x08 ; backspace 0x08 VT102 0x7f Putty 42:13960+10 1968 CA8519 jp z,COMMAND_BACKSPACE 43: 44:13970+11 196B F5 push af 45: ; a contains latest char 46:13981+10 196C 217B41 ld hl,[var_input] 47:13991+7 196F 1600 ld d,0 48:13998+13 1971 3A0041 ld a,(var_buffer_len) 49:14011+4 1974 5F ld e,a 50:14015+11 1975 19 add hl,de ;hl now contains pointer to last position in buffer 51:14026+4 1976 3C inc a 52:14030+13 1977 320041 ld (var_buffer_len),a ;store incremented buffer length 53: 54:14043+10 197A F1 pop af 55:14053+7 197B 77 ld (hl),a 56:14060+17 197C CD1501 call print_char 57:14077+6 197F 23 inc hl 58:14083+4 1980 AF xor a ;a = 0 59:14087+7 1981 77 ld (hl),a ;always add null termination after last char 60:14094+10 1982 C35619 jp COMMAND_READ 61: 62: 63: - 1985 COMMAND_BACKSPACE: 64:14104+13 1985 3A0041 ld a,(var_buffer_len) 65:14117+4 1988 A7 and a 66:14121+10 1989 CA5619 jp z, COMMAND_READ ; do not continue if already at char 0 67:14131+4 198C 3D dec a ;decrement length 68:14135+13 198D 320041 ld (var_buffer_len),a ;and store it 69:14148+4 1990 5F ld e,a ;load de with decremented value 70:14152+7 1991 1600 ld d,0 71:14159+10 1993 217B41 ld hl,[var_input] 72:14169+11 1996 19 add hl,de ;hl now contains pointer to last position in buffer 73:14180+4 1997 AF xor a ; store null byte to current location 74:14184+7 1998 77 ld (hl),a 75: ;call print_delete 76:14191+7 1999 3E08 ld a, 0x08 77:14198+17 199B CD1501 call print_char 78:14215+7 199E 3E20 ld a, 0x20 79:14222+17 19A0 CD1501 call print_char 80:14239+7 19A3 3E08 ld a, 0x08 81:14246+17 19A5 CD1501 call print_char 82:14263+10 19A8 C35619 jp COMMAND_READ 83: - 19AB COMMAND_PROCESS: 84: ;compare 85:14273+10 19AB 21B218 LD HL,[COMMAND_LUT] ;Lookup table 86: - 19AE COMMAND_PROCESS_LOOP: 87:14283+10 19AE 117B41 LD DE,[var_input] ;Buffer 88:14293+7 19B1 7E LD A,(HL) ;Load first byte of entry 89:14300+7 19B2 FEFF CP 0xFF 90:14307+10 19B4 CADD19 JP Z,COMMAND_PROCESS_NOT_FOUND ;if first byte is 0xFF, End is reached 91: ; compare string loop 92: - 19B7 COMMAND_PROCESS_LOOP_STR1: 93:14317+7 19B7 1A LD A,(DE) 94:14324+4 19B8 47 LD B,A 95:14328+7 19B9 7E LD A,(HL) 96:14335+4 19BA B0 OR B ;not 0 -> match 97:14339+10 19BB CAE619 JP Z, COMMAND_PROCESS_FOUND ;match 98: 99:14349+7 19BE 1A LD A,(DE) 100:14356+4 19BF 47 LD B,A 101: ;LD A,(HL) ;Load first byte of entry 102: ;call print_a_hex 103:14360+7 19C0 7E LD A,(HL) 104: ;compare byte 105:14367+4 19C1 A8 XOR B 106:14371+4 19C2 B7 OR A ;if identical = resoult shopuld be zero 107:14375+10 19C3 CACD19 JP Z, COMMAND_PROCESS_LOOP_STR2 ;then continue 108: ; if not identical 109:14385+7 19C6 7E LD A,(HL) 110:14392+4 19C7 B7 OR A ;if reached end of compare string 111:14396+10 19C8 CAE619 JP Z, COMMAND_PROCESS_FOUND ;match 112:14406+12 19CB 1805 JR COMMAND_PROCESS_NEXT_ENTRY ;next entry on no match 113: 114: - 19CD COMMAND_PROCESS_LOOP_STR2: ;continue with next char 115:14418+6 19CD 23 INC HL 116:14424+6 19CE 13 INC DE 117:14430+12 19CF 18E6 JR COMMAND_PROCESS_LOOP_STR1 118: 119: - 19D1 COMMAND_PROCESS_NEXT_ENTRYI: ;do not jump here 120:14442+6 19D1 23 INC HL 121: - 19D2 COMMAND_PROCESS_NEXT_ENTRY: ;jump here 122:14448+7 19D2 7E LD A,(HL) 123:14455+4 19D3 B7 OR A 124:14459+10 19D4 C2D119 JP NZ,COMMAND_PROCESS_NEXT_ENTRYI ;loop until end of string 125:14469+6 19D7 23 INC HL ;skip pointer 126:14475+6 19D8 23 INC HL 127:14481+6 19D9 23 INC HL 128:14487+10 19DA C3AE19 JP COMMAND_PROCESS_LOOP 129: - 19DD COMMAND_PROCESS_NOT_FOUND: 130:14497+10 19DD 21171A LD HL,[_STR_NOT_FOUND] 131:14507+17 19E0 CD1D01 CALL print_str 132:14524+10 19E3 C34419 JP COMMAND 133: 134: - 19E6 COMMAND_PROCESS_FOUND: 135:14534+11 19E6 E5 PUSH HL 136:14545+10 19E7 C1 POP BC 137:14555+6 19E8 03 INC BC 138:14561+7 19E9 0A LD A,(BC) 139:14568+4 19EA 6F LD L,A 140:14572+6 19EB 03 INC BC 141:14578+7 19EC 0A LD A,(BC) 142:14585+4 19ED 67 LD H,A 143: 144: ;HL: pointer to start of routine 145: ;DE: buffer start of arguments 146:14589+17 19EE CDF419 CALL _COMMAND_PROCESS_FOUND 147:14606+10 19F1 C34419 JP COMMAND 148: - 19F4 _COMMAND_PROCESS_FOUND 149:14616+4 19F4 E9 JP (HL) 150: 151: - 19F5 NOT_IMPLEMENTED: 152:14620+10 19F5 21031A LD HL,[_STR_NOT_IMPLEMENTED] 153:14630+17 19F8 CD1D01 CALL print_str 154:14647+10 19FB C9 RET 155: 156: - 19FC ERR_SYNTAX: 157:14657+10 19FC 212B1A LD HL,[_STR_SYNTAX] 158:14667+17 19FF CD1D01 CALL print_str 159:14684+10 1A02 C9 RET 160: 161: - 1A03 _STR_NOT_IMPLEMENTED: 162: - 1A03 0A0D6E6F db 10,13,"not implemented",10,13,0 7420696D 706C656D 656E7465 640A0D00 163: 164: - 1A17 _STR_NOT_FOUND: 165: - 1A17 0A0D696E db 10,13,"invalid command",10,13,0 76616C69 6420636F 6D6D616E 640A0D00 166: 167: - 1A2B _STR_SYNTAX: **** main.asm **** 195: - 1A2B 0A0D696E db 10,13,"invalid syntax",10,13,0 76616C69 64207379 6E746178 0A0D00 196: .include "cmd_mem.s" **** include/cmd_mem.s **** 1: - 1A3E OP_EXEC: 2: ;DE contains pointer 3:14694+11 1A3E D5 push DE 4:14705+10 1A3F E1 pop HL 5:14715+17 1A40 CD3502 call DHEX_TO_BYTE 6:14732+4 1A43 47 ld b,a ;store result in b 7:14736+4 1A44 7B ld a,e ;check for error 8:14740+4 1A45 A7 and a 9:14744+10 1A46 C2FC19 jp nz, ERR_SYNTAX 10:14754+6 1A49 23 inc HL 11:14760+6 1A4A 23 inc HL 12:14766+17 1A4B CD3502 call DHEX_TO_BYTE 13:14783+4 1A4E 4F ld c,a 14:14787+4 1A4F 7B ld a,e ;check for error 15:14791+4 1A50 A7 and a 16:14795+10 1A51 C2FC19 jp nz, ERR_SYNTAX 17:14805+4 1A54 60 ld h,b 18:14809+4 1A55 69 ld l,c 19:14813+4 1A56 E9 jp (hl) 20: - 1A57 OP_CALL: 21: ;DE contains pointer 22:14817+11 1A57 D5 push DE 23:14828+10 1A58 E1 pop HL 24:14838+17 1A59 CD3502 call DHEX_TO_BYTE 25:14855+4 1A5C 47 ld b,a ;store result in b 26:14859+4 1A5D 7B ld a,e ;check for error 27:14863+4 1A5E A7 and a 28:14867+10 1A5F C2FC19 jp nz, ERR_SYNTAX 29:14877+6 1A62 23 inc HL 30:14883+6 1A63 23 inc HL 31:14889+17 1A64 CD3502 call DHEX_TO_BYTE 32:14906+4 1A67 4F ld c,a 33:14910+4 1A68 7B ld a,e ;check for error 34:14914+4 1A69 A7 and a 35:14918+10 1A6A C2FC19 jp nz, ERR_SYNTAX 36:14928+4 1A6D 60 ld h,b 37:14932+4 1A6E 69 ld l,c 38:14936+17 1A6F CD761A call _OP_CALL 39:14953+17 1A72 CD2D01 call print_newLine 40:14970+10 1A75 C9 ret 41: - 1A76 _OP_CALL 42:14980+4 1A76 E9 jp (hl) 43: 44: - 1A77 OP_DUMP: 45: ;DE contains pointer 46:14984+11 1A77 D5 push DE 47:14995+10 1A78 E1 pop HL 48:15005+17 1A79 CD3502 call DHEX_TO_BYTE ;parse start address 49:15022+4 1A7C 47 ld b,a ;store result in b 50:15026+4 1A7D 7B ld a,e ;check for error 51:15030+4 1A7E A7 and a 52:15034+10 1A7F C2FC19 jp nz, ERR_SYNTAX 53:15044+6 1A82 23 inc HL 54:15050+6 1A83 23 inc HL 55:15056+17 1A84 CD3502 call DHEX_TO_BYTE 56:15073+4 1A87 4F ld c,a 57:15077+4 1A88 7B ld a,e ;check for error 58:15081+4 1A89 A7 and a 59:15085+10 1A8A C2FC19 jp nz, ERR_SYNTAX 60:15095+6 1A8D 23 inc HL 61:15101+6 1A8E 23 inc HL 62:15107+7 1A8F 7E ld a,(HL) 63:15114+7 1A90 FE20 cp ' ' 64:15121+10 1A92 C2FC19 jp nz, ERR_SYNTAX 65:15131+6 1A95 23 inc HL 66:15137+17 1A96 CD3502 call DHEX_TO_BYTE 67:15154+11 1A99 F5 push af 68:15165+4 1A9A 7B ld a,e ;check for error 69:15169+4 1A9B A7 and a 70:15173+10 1A9C C2FC19 jp nz, ERR_SYNTAX 71:15183+10 1A9F F1 pop af 72: 73:15193+4 1AA0 60 ld h,b 74:15197+4 1AA1 69 ld l,c 75:15201+4 1AA2 47 ld b,a 76: 77:15205+17 1AA3 CD1018 call dump_pretty 78:15222+10 1AA6 C9 ret 79: 80: - 1AA7 OP_SET: 81: ;DE contains pointer 82:15232+11 1AA7 D5 push DE 83:15243+10 1AA8 E1 pop HL 84:15253+17 1AA9 CD3502 call DHEX_TO_BYTE ;parse start address 85:15270+4 1AAC 47 ld b,a ;store result in b 86:15274+4 1AAD 7B ld a,e ;check for error 87:15278+4 1AAE A7 and a 88:15282+10 1AAF C2FC19 jp nz, ERR_SYNTAX 89:15292+6 1AB2 23 inc HL 90:15298+6 1AB3 23 inc HL 91:15304+17 1AB4 CD3502 call DHEX_TO_BYTE 92:15321+4 1AB7 4F ld c,a 93:15325+4 1AB8 7B ld a,e ;check for error 94:15329+4 1AB9 A7 and a 95:15333+10 1ABA C2FC19 jp nz, ERR_SYNTAX 96: ;bc now contains the start address 97:15343+6 1ABD 23 INC HL 98:15349+6 1ABE 23 INC HL 99: ;hl now cointains start addr of data bytes 100: - 1ABF _OP_SET_LOOP: 101:15355+7 1ABF 7E ld a,(hl) 102:15362+7 1AC0 FE00 cp 0 ;if 0 then end 103:15369+5+6 1AC2 C8 RET Z 104:15374+7 1AC3 FE20 cp ' ' 105:15381+10 1AC5 C2FC19 jp nz, ERR_SYNTAX 106:15391+6 1AC8 23 inc hl ;next byte 107:15397+17 1AC9 CD3502 call DHEX_TO_BYTE 108:15414+7 1ACC 02 ld (bc),a ;load byte to 109:15421+4 1ACD 7B ld a,e 110:15425+4 1ACE A7 and a 111:15429+10 1ACF C2FC19 jp nz, ERR_SYNTAX 112:15439+6 1AD2 03 inc bc 113:15445+6 1AD3 23 inc hl 114:15451+6 1AD4 23 inc hl 115:15457+10 1AD5 C3BF1A jp _OP_SET_LOOP 116: 117: - 1AD8 OP_DASM: 118:15467+11 1AD8 D5 push DE 119:15478+10 1AD9 E1 pop HL 120:15488+17 1ADA CD3502 call DHEX_TO_BYTE 121:15505+4 1ADD 47 ld b,a ;store result in b 122:15509+4 1ADE 7B ld a,e ;check for error 123:15513+4 1ADF A7 and a 124:15517+10 1AE0 C2FC19 jp nz, ERR_SYNTAX 125:15527+6 1AE3 23 inc hl 126:15533+6 1AE4 23 inc hl 127:15539+17 1AE5 CD3502 call DHEX_TO_BYTE 128:15556+4 1AE8 4F ld c,a 129:15560+4 1AE9 7B ld a,e ;check for error 130:15564+4 1AEA A7 and a 131:15568+10 1AEB C2FC19 jp nz, ERR_SYNTAX 132:15578+6 1AEE 23 inc hl 133:15584+6 1AEF 23 inc hl 134:15590+7 1AF0 7E ld a,(HL) 135:15597+7 1AF1 FE20 cp ' ' 136:15604+10 1AF3 C2FC19 jp nz, ERR_SYNTAX 137:15614+6 1AF6 23 inc hl 138:15620+17 1AF7 CD3502 call DHEX_TO_BYTE 139:15637+11 1AFA F5 push af 140:15648+4 1AFB 7B ld a,e ;check for error 141:15652+4 1AFC A7 and a 142:15656+10 1AFD C2FC19 jp nz, ERR_SYNTAX 143:15666+4 1B00 60 ld h,b 144:15670+4 1B01 69 ld l,c 145:15674+10 1B02 F1 pop af ;restore af 146:15684+4 1B03 47 ld b,a 147:15688+17 1B04 CD8602 call disassemble **** main.asm **** 197:15705+10 1B07 C9 ret 198: .include "cmd_io.s" **** include/cmd_io.s **** 1: - 1B08 OP_IO_IN: 2:15715+11 1B08 D5 push DE 3:15726+10 1B09 E1 pop HL 4:15736+17 1B0A CD3502 call DHEX_TO_BYTE 5:15753+4 1B0D 4F ld c,a ;store result in b 6:15757+4 1B0E 7B ld a,e ;check for error 7:15761+4 1B0F A7 and a 8:15765+10 1B10 C2FC19 jp nz, ERR_SYNTAX 9:15775+12 1B13 ED78 in a,(c) 10:15787+11 1B15 F5 push af 11:15798+17 1B16 CD2D01 call print_newLine 12:15815+10 1B19 F1 pop af 13:15825+17 1B1A CD4301 call print_a_hex 14:15842+10 1B1D C9 ret 15: 16: - 1B1E OP_IO_OUT: 17:15852+11 1B1E D5 push DE 18:15863+10 1B1F E1 pop HL 19:15873+17 1B20 CD3502 call DHEX_TO_BYTE 20:15890+4 1B23 4F ld c,a ;store result in b 21:15894+4 1B24 7B ld a,e ;check for error 22:15898+4 1B25 A7 and a 23:15902+10 1B26 C2FC19 jp nz, ERR_SYNTAX 24:15912+6 1B29 23 inc hl 25:15918+6 1B2A 23 inc hl 26:15924+7 1B2B 7E ld a,(hl) 27:15931+7 1B2C FE20 cp ' ' 28:15938+10 1B2E C2FC19 jp nz, ERR_SYNTAX 29:15948+6 1B31 23 inc hl 30:15954+17 1B32 CD3502 call DHEX_TO_BYTE 31:15971+11 1B35 F5 push af 32:15982+4 1B36 7B ld a,e ;check for error 33:15986+4 1B37 A7 and a 34:15990+10 1B38 C2FC19 jp nz, ERR_SYNTAX 35:16000+10 1B3B F1 pop af 36:16010+12 1B3C ED79 out (c),a 37:16022+10 1B3E C9 ret 38: 39: - 1B3F OP_IIC_OUT: 40:16032+11 1B3F D5 push DE 41:16043+10 1B40 E1 pop HL 42:16053+17 1B41 CD3502 call DHEX_TO_BYTE ;load start addr 43:16070+13 1B44 320C41 ld (var_scratch+1),A ;store result in ram 44:16083+4 1B47 7B ld a,e ;check for error 45:16087+4 1B48 A7 and a 46:16091+10 1B49 C2FC19 jp nz, ERR_SYNTAX 47:16101+6 1B4C 23 inc hl 48:16107+6 1B4D 23 inc hl 49:16113+10 1B4E 010D41 LD BC,[var_scratch + 2] 50:16123+4 1B51 AF XOR A 51:16127+13 1B52 320B41 LD (var_scratch),A 52: - 1B55 _OP_IIC_OUT_LOOP: 53:16140+7 1B55 7E ld a,(hl) 54:16147+7 1B56 FE00 cp 0 ;if 0 then end 55:16154+10 1B58 CA711B jp z,_OP_IIC_OUT_SEND 56:16164+7 1B5B FE20 cp ' ' 57:16171+10 1B5D C2FC19 jp nz, ERR_SYNTAX 58:16181+6 1B60 23 inc hl ;next byte 59: 60:16187+17 1B61 CD3502 call DHEX_TO_BYTE 61:16204+7 1B64 02 ld (bc),a 62:16211+6 1B65 03 inc bc ;incerement pointer 63:16217+13 1B66 3A0B41 ld a,(var_scratch) 64:16230+4 1B69 3C inc a ;increment counter 65:16234+13 1B6A 320B41 ld (var_scratch),a 66:16247+6 1B6D 23 inc HL 67:16253+6 1B6E 23 inc HL 68:16259+12 1B6F 18E4 jr _OP_IIC_OUT_LOOP 69: - 1B71 _OP_IIC_OUT_SEND: 70:16271+10 1B71 210D41 ld hl,[var_scratch + 2] 71:16281+13 1B74 3A0B41 ld a,(var_scratch) ;load amount of bytes 72:16294+4 1B77 47 ld b,a 73:16298+13 1B78 3A0C41 ld a,(var_scratch+1) ;load start addr 74:16311+4 1B7B 4F ld c,a 75:16315+17 1B7C CDC316 call iic_send_buffer 76:16332+4 1B7F B7 or a 77:16336+10 1B80 C2841B jp nz, _OP_IIC_ACK_ERR 78:16346+10 1B83 C9 ret 79: 80: - 1B84 _OP_IIC_ACK_ERR: 81:16356+10 1B84 218B1B LD HL,[_OP_IIC_ACK_ERR_str] 82:16366+17 1B87 CD1D01 call print_str 83:16383+10 1B8A C9 ret 84: - 1B8B _OP_IIC_ACK_ERR_str: 85: - 1B8B 0A0D6275 db 10,13,"bus-error: no ACK",0 732D6572 726F723A 206E6F20 41434B00 86: 87: - 1B9F OP_IIC_IN: 88:16393+11 1B9F D5 push DE 89:16404+10 1BA0 E1 pop HL 90:16414+17 1BA1 CD3502 call DHEX_TO_BYTE ;load start addr 91:16431+4 1BA4 4F ld C,a ;store start addr to B 92:16435+4 1BA5 7B ld a,e ;check for error 93:16439+4 1BA6 A7 and a 94:16443+10 1BA7 C2FC19 jp nz, ERR_SYNTAX 95:16453+6 1BAA 23 inc hl 96:16459+6 1BAB 23 inc hl 97:16465+7 1BAC 7E ld a,(hl) 98:16472+7 1BAD FE20 cp ' ' 99:16479+10 1BAF C2FC19 jp nz, ERR_SYNTAX 100:16489+6 1BB2 23 inc hl 101:16495+17 1BB3 CD3502 call DHEX_TO_BYTE ;read length 102:16512+4 1BB6 47 ld b,a ;store length in B 103:16516+11 1BB7 C5 push bc 104:16527+4 1BB8 7B ld a,e ;check for error 105:16531+4 1BB9 A7 and a 106:16535+10 1BBA C2FC19 jp nz, ERR_SYNTAX 107:16545+10 1BBD 210B41 ld hl,[var_scratch] 108:16555+17 1BC0 CDED16 call iic_receive_buffer 109:16572+10 1BC3 C1 pop bc 110:16582+4 1BC4 B7 or a 111:16586+10 1BC5 C2841B jp nz, _OP_IIC_ACK_ERR 112:16596+10 1BC8 21DE1B ld hl,[_OP_IIC_IN_LOOP_TEXT] 113:16606+17 1BCB CD1D01 call print_str 114:16623+10 1BCE 210B41 ld hl,[var_scratch] 115: ;print data 116: - 1BD1 _OP_IIC_IN_LOOP: 117:16633+7 1BD1 7E ld a,(hl) 118:16640+17 1BD2 CD4301 call print_a_hex 119:16657+7 1BD5 3E20 ld a, ' ' 120:16664+17 1BD7 CD1501 call print_char 121:16681+6 1BDA 23 inc hl 122:16687+8+5 1BDB 10F4 djnz _OP_IIC_IN_LOOP 123:16695+10 1BDD C9 ret 124: 125: - 1BDE _OP_IIC_IN_LOOP_TEXT: 126: - 1BDE 0A0D7265 db 10,13,"rec-buff: ",0 632D6275 66663A20 00 127: 128: - 1BEB OP_CLR: 129:16705+17 1BEB CD2601 call print_clear **** main.asm **** 199:16722+10 1BEE C9 ret 200: .include "cmd_date.s" **** include/cmd_date.s **** 1: - 00D0 ADDR_RTC .equ 0xD0 2: 3: - 1BEF OP_RTIME: 4:16732+17 1BEF CD2D01 call print_newLine 5: - 1BF2 _OP_RTIME_NN: 6: ;set pointer 7:16749+10 1BF2 21AA1C ld hl,[_OP_RTIME_RD_CMD] 8:16759+7 1BF5 0601 ld b, 1 9:16766+7 1BF7 0ED0 ld c, ADDR_RTC 10:16773+17 1BF9 CDC316 call iic_send_buffer 11:16790+4 1BFC B7 or a 12:16794+10 1BFD C2841B jp nz, _OP_IIC_ACK_ERR 13: ;read RTC data 14:16804+10 1C00 210B41 ld hl,[var_scratch] 15:16814+7 1C03 0608 ld b,8 16:16821+7 1C05 0ED0 ld c, ADDR_RTC 17:16828+17 1C07 CDED16 call iic_receive_buffer 18:16845+4 1C0A B7 or a 19:16849+10 1C0B C2841B jp nz, _OP_IIC_ACK_ERR 20: ;process display hours 21:16859+13 1C0E 3A0D41 ld a,(var_scratch+2) 22:16872+7 1C11 E630 and 00110000b 23:16879+4 1C13 1F RRA 24:16883+4 1C14 1F RRA 25:16887+4 1C15 1F RRA 26:16891+4 1C16 1F RRA 27:16895+17 1C17 CD5501 call print_bcd 28:16912+13 1C1A 3A0D41 ld a,(var_scratch+2) 29:16925+7 1C1D E60F and 00001111b 30:16932+17 1C1F CD5501 call print_bcd 31:16949+7 1C22 3E3A ld a,':' 32:16956+17 1C24 CD1501 call print_char 33: ;display minutes 34:16973+13 1C27 3A0C41 ld a,(var_scratch+1) 35:16986+7 1C2A E670 and 01110000b 36:16993+4 1C2C 1F RRA 37:16997+4 1C2D 1F RRA 38:17001+4 1C2E 1F RRA 39:17005+4 1C2F 1F RRA 40:17009+17 1C30 CD5501 call print_bcd 41:17026+13 1C33 3A0C41 ld a,(var_scratch+1) 42:17039+7 1C36 E60F and 00001111b 43:17046+17 1C38 CD5501 call print_bcd 44:17063+7 1C3B 3E3A ld a,':' 45:17070+17 1C3D CD1501 call print_char 46: ;display seconds 47:17087+13 1C40 3A0B41 ld a,(var_scratch+0) 48:17100+7 1C43 E670 and 01110000b 49:17107+4 1C45 1F RRA 50:17111+4 1C46 1F RRA 51:17115+4 1C47 1F RRA 52:17119+4 1C48 1F RRA 53:17123+17 1C49 CD5501 call print_bcd 54:17140+13 1C4C 3A0B41 ld a,(var_scratch+0) 55:17153+7 1C4F E60F and 00001111b 56:17160+17 1C51 CD5501 call print_bcd 57:17177+7 1C54 3E20 ld a,' ' 58:17184+17 1C56 CD1501 call print_char 59: ;display date 60:17201+13 1C59 3A0F41 ld a,(var_scratch+4) 61:17214+7 1C5C E630 and 00110000b 62:17221+4 1C5E 1F RRA 63:17225+4 1C5F 1F RRA 64:17229+4 1C60 1F RRA 65:17233+4 1C61 1F RRA 66:17237+17 1C62 CD5501 call print_bcd 67:17254+13 1C65 3A0F41 ld a,(var_scratch+4) 68:17267+7 1C68 E60F and 00001111b 69:17274+17 1C6A CD5501 call print_bcd 70:17291+7 1C6D 3E2E ld a,'.' 71:17298+17 1C6F CD1501 call print_char 72:17315+13 1C72 3A1041 ld a,(var_scratch+5) 73:17328+7 1C75 E610 and 00010000b 74:17335+4 1C77 1F RRA 75:17339+4 1C78 1F RRA 76:17343+4 1C79 1F RRA 77:17347+4 1C7A 1F RRA 78:17351+17 1C7B CD5501 call print_bcd 79:17368+13 1C7E 3A1041 ld a,(var_scratch+5) 80:17381+7 1C81 E60F and 00001111b 81:17388+17 1C83 CD5501 call print_bcd 82:17405+7 1C86 3E2E ld a,'.' 83:17412+17 1C88 CD1501 call print_char 84:17429+7 1C8B 3E32 ld a,'2' 85:17436+17 1C8D CD1501 call print_char 86:17453+7 1C90 3E30 ld a,'0' 87:17460+17 1C92 CD1501 call print_char 88:17477+13 1C95 3A1141 ld a,(var_scratch+6) 89:17490+7 1C98 E6F0 and 11110000b 90:17497+4 1C9A 1F RRA 91:17501+4 1C9B 1F RRA 92:17505+4 1C9C 1F RRA 93:17509+4 1C9D 1F RRA 94:17513+17 1C9E CD5501 call print_bcd 95:17530+13 1CA1 3A1141 ld a,(var_scratch+6) 96:17543+7 1CA4 E60F and 00001111b 97:17550+17 1CA6 CD5501 call print_bcd 98: 99:17567+10 1CA9 C9 RET 100: - 1CAA _OP_RTIME_RD_CMD: 101: - 1CAA 00 db 0x00 102: 103: - 1CAB 0A0D456E _OP_STIME_STR_DAY: db 10,13,"Enter Date (00-31) : ",0 74657220 44617465 20202020 2830302D 33312920 3A2000 104: - 1CC6 0A0D456E _OP_STIME_STR_MON: db 10,13,"Enter Month (00-12) : ",0 74657220 4D6F6E74 68202020 2830302D 31322920 3A2000 105: - 1CE1 0A0D456E _OP_STIME_STR_YEAR: db 10,13,"Enter Year (00-99) : ",0 74657220 59656172 20202020 2830302D 39392920 3A2000 106: - 1CFC 0A0D456E _OP_STIME_STR_HOUR: db 10,13,"Enter Hours (00-23) : ",0 74657220 486F7572 73202020 2830302D 32332920 3A2000 107: - 1D17 0A0D456E _OP_STIME_STR_MIN: db 10,13,"Enter Minutes (00-59) : ",0 74657220 4D696E75 74657320 2830302D 35392920 3A2000 108: - 1D32 0A0D456E _OP_STIME_STR_SEC: db 10,13,"Enter Seconds (00-59) : ",0 74657220 5365636F 6E647320 2830302D 35392920 3A2000 109: - 1D4D 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: - 1D64 _OP_STIME_PROMPT: 113:17577+11 1D64 E5 push hl 114:17588+17 1D65 CD1D01 call print_str 115:17605+10 1D68 E1 pop hl 116:17615+17 1D69 CD7701 call read_bcd 117:17632+7 1D6C FEFF cp 0xFF ;if failed 118:17639+10 1D6E CA7C1D jp Z, _OP_STIME_PROMPT_ERR 119:17649+4 1D71 47 ld b,a 120:17653+17 1D72 CD7701 call read_bcd 121:17670+7 1D75 FEFF cp 0xFF ;if failed 122:17677+10 1D77 CA7C1D jp Z, _OP_STIME_PROMPT_ERR 123:17687+4 1D7A 4F ld c,a 124:17691+10 1D7B C9 ret 125: - 1D7C _OP_STIME_PROMPT_ERR: 126:17701+11 1D7C E5 push HL 127:17712+10 1D7D 214D1D ld hl, [_OP_STIME_INVALID] 128:17722+17 1D80 CD1D01 call print_str 129:17739+10 1D83 E1 pop hl 130:17749+10 1D84 C3641D jp _OP_STIME_PROMPT 131: 132: 133: 134: - 1D87 OP_STIME: 135:17759+4 1D87 AF xor a 136:17763+13 1D88 320B41 ld (var_scratch),a ;set pointer 137: ;date 138:17776+10 1D8B 21AB1C ld hl, [_OP_STIME_STR_DAY] 139:17786+17 1D8E CD641D call _OP_STIME_PROMPT 140:17803+4 1D91 78 ld a,b 141:17807+17 1D92 CDFB1D call _shift4 142:17824+7 1D95 E630 and 00110000b ;mask bits; bit6 low -> 24h mode 143:17831+4 1D97 B1 or c ;add second digit 144:17835+13 1D98 321041 ld (var_scratch+5),a 145: ;month 146:17848+10 1D9B 21C61C ld hl, [_OP_STIME_STR_MON] 147:17858+17 1D9E CD641D call _OP_STIME_PROMPT 148:17875+4 1DA1 78 ld a,b 149:17879+17 1DA2 CDFB1D call _shift4 150:17896+7 1DA5 E610 and 00010000b ;mask bits; bit6 low -> 24h mode 151:17903+4 1DA7 B1 or c ;add second digit 152:17907+13 1DA8 321141 ld (var_scratch+6),a 153: ;year 154:17920+10 1DAB 21E11C ld hl, [_OP_STIME_STR_YEAR] 155:17930+17 1DAE CD641D call _OP_STIME_PROMPT 156:17947+4 1DB1 78 ld a,b 157:17951+17 1DB2 CDFB1D call _shift4 158:17968+7 1DB5 E6F0 and 11110000b ;mask bits; bit6 low -> 24h mode 159:17975+4 1DB7 B1 or c ;add second digit 160:17979+13 1DB8 321241 ld (var_scratch+7),a 161: ;hours 162:17992+10 1DBB 21FC1C ld hl, [_OP_STIME_STR_HOUR] 163:18002+17 1DBE CD641D call _OP_STIME_PROMPT 164:18019+4 1DC1 78 ld a,b 165:18023+17 1DC2 CDFB1D call _shift4 166:18040+7 1DC5 E630 and 00110000b ;mask bits; bit6 low -> 24h mode 167:18047+4 1DC7 B1 or c ;add second digit 168:18051+13 1DC8 320E41 ld (var_scratch+3),a 169: ; minutes 170:18064+10 1DCB 21171D ld hl, [_OP_STIME_STR_MIN] 171:18074+17 1DCE CD641D call _OP_STIME_PROMPT 172:18091+4 1DD1 78 ld a,b 173:18095+17 1DD2 CDFB1D call _shift4 174:18112+7 1DD5 E670 and 01110000b ;mask bits 175:18119+4 1DD7 B1 or c ;add second digit 176:18123+13 1DD8 320D41 ld (var_scratch+2),a 177: ; seconds 178:18136+10 1DDB 21321D ld hl, [_OP_STIME_STR_SEC] 179:18146+17 1DDE CD641D call _OP_STIME_PROMPT 180:18163+4 1DE1 78 ld a,b 181:18167+17 1DE2 CDFB1D call _shift4 182:18184+7 1DE5 E670 and 01110000b ;mask bits / bit6 low -> 24h mode (enable clock) 183:18191+4 1DE7 B1 or c ;add second digit 184:18195+13 1DE8 320C41 ld (var_scratch+1),a 185:18208+6 1DEB 13 inc de ;next 186: 187:18214+7 1DEC 0ED0 ld c, ADDR_RTC 188:18221+7 1DEE 0608 ld b, 8 189:18228+10 1DF0 210B41 ld hl,[var_scratch] 190:18238+17 1DF3 CDC316 call iic_send_buffer 191:18255+4 1DF6 B7 or a 192:18259+10 1DF7 C2841B jp nz, _OP_IIC_ACK_ERR 193: 194:18269+10 1DFA C9 ret 195: 196: - 1DFB _shift4: 197:18279+4 1DFB 07 RLCA 198:18283+4 1DFC 07 RLCA 199:18287+4 1DFD 07 RLCA 200:18291+4 1DFE 07 RLCA **** main.asm **** 201:18295+10 1DFF C9 ret 202: .include "cmd_disk.s" **** include/cmd_disk.s **** 1: - 1E00 OP_LSDSK: 2:18305+17 1E00 CD6513 call ideif_prnt_devtable 3:18322+10 1E03 C9 ret 4: 5: - 1E04 OP_SELDSK: 6: ;DE contains pointer 7:18332+11 1E04 D5 push de 8:18343+10 1E05 E1 pop hl 9:18353+7 1E06 7E ld a,(hl) 10:18360+7 1E07 DE45 sbc 69 11:18367+7+5 1E09 3808 jr c,_OP_SELDSK_INVALID 12:18374+7 1E0B FE04 cp 4 13:18381+7+5 1E0D 3004 jr nc, _OP_SELDSK_INVALID 14:18388+17 1E0F CD9A15 call ideif_drv_sel 15:18405+10 1E12 C9 ret 16: 17: - 1E13 _OP_SELDSK_INVALID: 18:18415+10 1E13 212B1E ld hl,[_OP_SELDSK_INVALID_STR] 19:18425+17 1E16 CD1D01 call print_str 20:18442+10 1E19 112000 LD DE,0x20 21:18452+10 1E1C 017000 LD BC,0x70 22:18462+17 1E1F CDE80D CALL beep 23:18479+10 1E22 C9 ret 24: 25: - 1E23 OP_DIR: 26:18489+17 1E23 CD8223 CALL fat_print_directory 27:18506+10 1E26 C9 ret 28: 29: - 1E27 OP_CD: 30:18516+17 1E27 CD9B24 call fat_cd_single 31:18533+10 1E2A C9 ret 32: 33: - 1E2B _OP_SELDSK_INVALID_STR: 34: - 1E2B 0A0D496E db 10,13,"Invalid drive letter",10,13,0 76616C69 64206472 69766520 6C657474 65720A0D 00 35: 36: - 1E44 OP_FSEXEC: 37:18543+17 1E44 CDB625 call fat_exec **** main.asm **** 203:18560+10 1E47 C9 ret 204: .include "post.s" **** include/post.s **** 1: ;Power-On self test 2: - 1E48 POST_START: 3:18570+17 1E48 CD581E call POST_CHECK_PIO 4:18587+17 1E4B CD7D1E call POST_CHECK_APU 5:18604+17 1E4E CDD51E call POST_TEST_RTC 6:18621+17 1E51 CDA81E call POST_CHECK_IDE_30 7:18638+17 1E54 CDBB1E call POST_CHECK_IDE_40 8:18655+10 1E57 C9 ret 9: 10: - 1E58 POST_CHECK_PIO: 11:18665+10 1E58 214C1F ld hl,[str_post_pio] 12:18675+17 1E5B CD1D01 call print_str 13:18692+11 1E5E DBF6 in a,(CS_PIO_AC) ;test read from pio 14:18703+7 1E60 FE00 cp 0x00 ;0x78 when not installed 15:18710+10 1E62 C2711E jp nz, _POST_CHECK_PIO_FAILED 16:18720+7 1E65 3E00 ld a, 0x00 ;set present flag 17:18727+13 1E67 320941 ld (var_pio_present),a 18:18740+10 1E6A 21D51F ld hl,[str_post_ok] 19:18750+17 1E6D CD1D01 call print_str 20:18767+10 1E70 C9 ret 21: - 1E71 _POST_CHECK_PIO_FAILED: 22:18777+7 1E71 3EFF ld a, 0xFF 23:18784+13 1E73 320941 ld (var_pio_present),a 24:18797+10 1E76 219D1F ld hl,[str_post_nd] 25:18807+17 1E79 CD1D01 call print_str 26:18824+10 1E7C C9 ret 27: 28: - 1E7D POST_CHECK_APU: 29:18834+10 1E7D 21671F ld hl,[str_post_apu] 30:18844+17 1E80 CD1D01 call print_str 31: 32:18861+7 1E83 3EFF ld a, 0xFF 33:18868+11 1E85 D3F8 out (CS_APU_DATA),a 34:18879+4 1E87 00 nop 35:18883+4 1E88 00 nop 36:18887+11 1E89 DBF8 in a,(CS_APU_DATA) 37:18898+7 1E8B FEFF cp 0xFF 38:18905+10 1E8D C29C1E jp nz, _POST_CHECK_APU_FAILED 39:18915+7 1E90 3E00 ld a, 0x00 ;set present flag 40:18922+13 1E92 320A41 ld (var_apu_present),a 41:18935+10 1E95 21D51F ld hl,[str_post_ok] 42:18945+17 1E98 CD1D01 call print_str 43:18962+10 1E9B C9 ret 44: - 1E9C _POST_CHECK_APU_FAILED: 45:18972+7 1E9C 3EFF ld a, 0xFF 46:18979+13 1E9E 320A41 ld (var_apu_present),a 47:18992+10 1EA1 219D1F ld hl,[str_post_nd] 48:19002+17 1EA4 CD1D01 call print_str 49:19019+10 1EA7 C9 ret 50: 51: - 1EA8 POST_CHECK_IDE_30: 52:19029+10 1EA8 21161F ld hl,[str_post_ide_30] 53:19039+17 1EAB CD1D01 call print_str 54:19056+11 1EAE DB30 in a,(0x30) 55:19067+4 1EB0 B7 or a 56:19071+10 1EB1 C2CE1E jp nz, _POST_CHECK_IDE_FAILED 57:19081+10 1EB4 21D51F ld hl,[str_post_ok] 58:19091+17 1EB7 CD1D01 call print_str 59:19108+10 1EBA C9 ret 60: - 1EBB POST_CHECK_IDE_40: 61:19118+10 1EBB 21311F ld hl,[str_post_ide_40] 62:19128+17 1EBE CD1D01 call print_str 63:19145+11 1EC1 DB40 in a,(0x40) 64:19156+4 1EC3 B7 or a 65:19160+10 1EC4 C2CE1E jp nz, _POST_CHECK_IDE_FAILED 66:19170+10 1EC7 21D51F ld hl,[str_post_ok] 67:19180+17 1ECA CD1D01 call print_str 68:19197+10 1ECD C9 ret 69: 70: - 1ECE _POST_CHECK_IDE_FAILED 71:19207+10 1ECE 219D1F ld hl,[str_post_nd] 72:19217+17 1ED1 CD1D01 call print_str 73:19234+10 1ED4 C9 ret 74: 75: - 1ED5 POST_TEST_RTC: 76:19244+7 1ED5 3E06 ld a, 0x06 77:19251+13 1ED7 320B41 ld (var_scratch),a 78:19264+10 1EDA 21821F ld hl,[str_post_rtc] 79:19274+17 1EDD CD1D01 call print_str 80:19291+10 1EE0 210B41 ld hl,[var_scratch] 81:19301+7 1EE3 0601 ld b, 1 82:19308+7 1EE5 0ED0 ld c, ADDR_RTC 83:19315+17 1EE7 CDC316 call iic_send_buffer 84:19332+4 1EEA B7 or a 85:19336+10 1EEB C2081F jp nz, _POST_TEST_RTC_NOTFOUND 86:19346+10 1EEE 210B41 ld hl,[var_scratch] 87:19356+7 1EF1 0601 ld b, 1 88:19363+7 1EF3 0ED0 ld c, ADDR_RTC 89:19370+17 1EF5 CDED16 call iic_receive_buffer 90:19387+13 1EF8 3A0B41 ld a, (var_scratch) 91:19400+4 1EFB B7 or a 92:19404+10 1EFC CA0F1F jp z, _POST_TEST_RTC_INVALID 93:19414+10 1EFF 21D51F ld hl,[str_post_ok] 94:19424+17 1F02 CD1D01 call print_str 95:19441+10 1F05 C3F21B jp _OP_RTIME_NN 96: - 1F08 _POST_TEST_RTC_NOTFOUND: 97:19451+10 1F08 219D1F ld hl,[str_post_nd] 98:19461+17 1F0B CD1D01 call print_str 99:19478+10 1F0E C9 ret 100: - 1F0F _POST_TEST_RTC_INVALID: 101:19488+10 1F0F 21AB1F ld hl,[str_post_rtc_iv] 102:19498+17 1F12 CD1D01 call print_str 103:19515+10 1F15 C9 ret 104: 105: - 1F16 str_post_ide_30: 106: - 1F16 0D0A4368 db 13,10,"Check Diskctrl.@030h... ",0 65636B20 4469736B 6374726C 2E403033 30682E2E 2E2000 107: - 1F31 str_post_ide_40: 108: - 1F31 0D0A4368 db 13,10,"Check Diskctrl.@040h... ",0 65636B20 4469736B 6374726C 2E403034 30682E2E 2E2000 109: - 1F4C str_post_pio: 110: - 1F4C 0D0A4368 db 13,10,"Check IO-Controller ... ",0 65636B20 494F2D43 6F6E7472 6F6C6C65 72202E2E 2E2000 111: - 1F67 str_post_apu: 112: - 1F67 0D0A4368 db 13,10,"Check AMD8911 APU ... ",0 65636B20 414D4438 39313120 41505520 20202E2E 2E2000 113: - 1F82 str_post_rtc: 114: - 1F82 0D0A4368 db 13,10,"Check DS1307 RTC ... ",0 65636B20 44533133 30372052 54432020 20202E2E 2E2000 115: - 1F9D str_post_nd: 116: - 1F9D 6E6F7420 db "not detected!",0 64657465 63746564 2100 117: - 1FAB str_post_rtc_iv: 118: - 1FAB 6E6F7420 db "not set. Check battery and run 'setdate'!",0 7365742E 20436865 636B2062 61747465 72792061 6E642072 756E2027 73657464 61746527 2100 119: - 1FD5 str_post_ok: **** main.asm **** 205: - 1FD5 6F6B2120 db "ok! ",0 00 206: .include "fat16.s" **** include/fat16.s **** 1: ; VARS 2: 3: - 44B6 phase MEM_IDE_FSBUFFER 4: - 44B6 MEM_FAT_RESERVED: ; Reserved sectors (2byte) 5: - 44B6 ..44B7 00 defs 2 6: - 44B8 MEM_FAT_AMOUNT: ; Amount of FATs (1byte) 7: - 44B8 ..44B8 00 defs 1 8: - 44B9 MEM_FAT_SECTORS: ; Length of FAT (2byte) 9: - 44B9 ..44BA 00 defs 2 10: - 44BB MEM_FAT_CLUSTERLEN: ; Length of Cluster (1byte) 11: - 44BB ..44BB 00 defs 1 12: - 44BC MEM_FAT_COUNT1: ; Counter Var for reading FAT (2byte) 13: - 44BC ..44BC 00 defs 1 14: - 44BD MEM_FAT_TMPPOINTER: ; Temporary working pointer 15: - 44BD ..44C0 00 defs 4 16: - 44C1 MEM_FAT_DATASTART: ; Start of data area 17: - 44C1 ..44C4 00 defs 4 18: - 44C5 MEM_FAT_ROOTSTART: ; Start of Root directory 19: - 44C5 ..44C8 00 defs 4 20: - 44C9 MEM_FAT_FILEREMAIN: ; Remaining sectors in file 21: - 44C9 ..44CC 00 defs 4 22: - 44CD MEM_FAT_DIRSEC: ; Sectors per directory 23: - 44CD ..44CE 00 defs 2 24: - 44CF MEM_FAT_TMPFNAME: ; Temporary filename 25: - 44CF ..44DE 00 defs 16 26: - 44DF MEM_FAT_CURDIR: ; Current Directory 27: - 44DF ..452E 00 defs 80 28: - 452F MEM_FAT_OF0_ATTRIBUTE: ;Current file attribute 29: - 452F 0000 defw 0 30: - 4531 MEM_FAT_OF0_CCLUST: ;Current cluster of file 31: - 4531 0000 defw 0 32: - 4533 MEM_FAT_OF0_FATSEC: ;Current sector in FAT 33: - 4533 ..4536 00 defs 4 34: - 4537 MEM_FAT_OF0_DATSEC: ;Current sector in Data 35: - 4537 ..453A 00 defs 4 36: - 453B MEM_FAT_OF0_DATREM: ;Remaining bytes in Data 37: - 453B ..453E 00 defs 4 38: - 453F MEM_FAT_CURRDIR: ;Current directory 39: - 453F ..4542 00 defs 4 40: - 4543 MEM_FAT_EXEC_CURR: 41: - 4543 0000 defw 0 42: - 4545 MEM_FAT_EXEC_COUNT: 43: - 4545 0000 defw 0 44: - 4547 MEM_FAT_EXEC_START: 45: - 4547 0000 defw 0 46: 47: - 206D dephase 48: 49: 50: 51: ;------------------------------------- 52: ; Get FAT Root-Table position 53: ;------------------------------------- 54: - 206D fat_get_root_table: 55:19525+17 206D CD2E23 call fat_reset_pointer ;reset fat pointer 56: 57: ; Load first sector on active partition 58:19542+10 2070 21D141 LD HL, MEM_IDE_POINTER ; pointer to LBA address 59:19552+7 2073 3E01 LD A,1 ;read 1 sector 60:19559+10 2075 11B642 LD DE, MEM_IDE_BUFFER ;where to store data? 61:19569+17 2078 CD6115 call read_lba_sector 62: 63: ; check for valid Boot sector 64:19586+13 207B 3AB642 ld a,(MEM_IDE_BUFFER) 65:19599+7 207E FEEB cp 0xEB ;first byte should be 0xEB 66:19606+10 2080 C23A21 jp nz, _fat_get_root_table_invalid 67: 68: ; Read and store FS Properties 69:19616+14 2083 DD21B642 LD IX,MEM_IDE_BUFFER 70:19630+19 2087 DD7E0D LD A,(IX+0x0D) 71:19649+13 208A 32BB44 LD (MEM_FAT_CLUSTERLEN),A 72:19662+19 208D DD7E0E LD A,(IX+0x0E) 73:19681+13 2090 32B644 LD (MEM_FAT_RESERVED),A 74:19694+19 2093 DD7E0F LD A,(IX+0x0F) 75:19713+13 2096 32B744 LD (MEM_FAT_RESERVED+1),A 76:19726+19 2099 DD7E10 LD A,(IX+0x10) 77:19745+13 209C 32B844 LD (MEM_FAT_AMOUNT),A 78:19758+19 209F DD7E16 LD A,(IX+0x16) 79:19777+13 20A2 32B944 LD (MEM_FAT_SECTORS),A 80:19790+19 20A5 DD7E17 LD A,(IX+0x17) 81:19809+13 20A8 32BA44 LD (MEM_FAT_SECTORS+1),A 82: 83: ;Get Data Start Sector 84: ;calculate fat length 85:19822+20 20AB ED4BB944 ld bc,(MEM_FAT_SECTORS) 86:19842+13 20AF 3AB844 ld a,(MEM_FAT_AMOUNT) ;add fat to cluster number 87:19855+7 20B2 1600 ld d,0 88:19862+4 20B4 5F ld e,a 89:19866+17 20B5 CD1523 call _fat_math_mul32 90: ; BCHL contains result -> store to PTR.MEM_FAT_ROOTSTART 91:19883+16 20B8 22C544 ld (MEM_FAT_ROOTSTART+0),hl 92:19899+20 20BB ED43C744 ld (MEM_FAT_ROOTSTART+2),bc 93: 94: ;add offset (reserved sectors) 95:19919+16 20BF 2AC442 ld hl,(MEM_IDE_BUFFER +0x0E) ; load sectors into hl 96:19935+16 20C2 22BD44 ld (MEM_FAT_TMPPOINTER), hl 97:19951+4 20C5 AF xor a 98:19955+13 20C6 32BF44 ld (MEM_FAT_TMPPOINTER+2),a 99:19968+13 20C9 32C044 ld (MEM_FAT_TMPPOINTER+3),a 100: 101:19981+10 20CC 01C544 ld bc,[MEM_FAT_ROOTSTART] 102:19991+10 20CF 11BD44 ld de,[MEM_FAT_TMPPOINTER] 103:20001+17 20D2 CDE422 call _fat_math_add32 ;MEM_FAT_ROOTSTART now contains the first sector 104: ;of the Root directory 105: 106: ;add offset (partition location) 107:20018+17 20D5 CD3A15 call ideif_get_drv_pointer 108:20035+10 20D8 DD23 inc ix 109:20045+10 20DA DD23 inc ix 110:20055+15 20DC DDE5 push ix 111:20070+10 20DE D1 pop de ;copy poiter to hl 112:20080+10 20DF 01C544 ld bc,[MEM_FAT_ROOTSTART] 113:20090+17 20E2 CDE422 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:20107+10 20E5 21C544 ld hl,MEM_FAT_ROOTSTART 117:20117+10 20E8 11D141 ld de,MEM_IDE_POINTER 118:20127+16 20EB EDA0 ldi 119:20143+16 20ED EDA0 ldi 120:20159+16 20EF EDA0 ldi 121:20175+16 20F1 EDA0 ldi 122: 123: ;copy value from MEM_FAT_ROOTSTART to MEM_IDE_POINTER 124:20191+10 20F3 21C544 ld hl,MEM_FAT_ROOTSTART 125:20201+10 20F6 11C144 ld de,MEM_FAT_DATASTART 126:20211+16 20F9 EDA0 ldi 127:20227+16 20FB EDA0 ldi 128:20243+16 20FD EDA0 ldi 129:20259+16 20FF EDA0 ldi 130: 131:20275+10 2101 21C544 ld hl,MEM_FAT_ROOTSTART 132:20285+10 2104 113F45 ld de,MEM_FAT_CURRDIR 133:20295+16 2107 EDA0 ldi 134:20311+16 2109 EDA0 ldi 135:20327+16 210B EDA0 ldi 136:20343+16 210D EDA0 ldi 137: 138: ;add offset to data area 139: ;multiply cluster by length of cluster 140: 141: ;calculate sectors for root dir 142:20359+16 210F 2AC742 ld hl,(MEM_IDE_BUFFER+0x11) ;load Maximum root directory entries 143:20375+4 2112 7C ld a,h 144:20379+4 2113 6F ld l,a 145:20383+4 2114 AF xor a ;set a 0, clear carry flag 146:20387+4 2115 67 ld h,a ;shift right by 8 bit = /512 147: 148: ;last step: multiply by 16 149:20391+4 2116 EB ex de,hl 150:20395+10 2117 011000 ld bc,16 151:20405+17 211A CD1523 call _fat_math_mul32 152: ; BCHL contains result -> store to PTR.MEM_FAT_TMPPOINTER 153:20422+16 211D 22BD44 ld (MEM_FAT_TMPPOINTER+0),hl 154:20438+20 2120 ED43BF44 ld (MEM_FAT_TMPPOINTER+2),bc 155: 156:20458+16 2124 22CD44 ld (MEM_FAT_DIRSEC),hl 157: ; add offset to MEM_FAT_DATASTART 158:20474+10 2127 11BD44 ld de,[MEM_FAT_TMPPOINTER] 159:20484+10 212A 01C144 ld bc,[MEM_FAT_DATASTART] 160:20494+17 212D CDE422 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:20511+7 2130 3E5C ld a,'\' 168:20518+13 2132 32DF44 ld(MEM_FAT_CURDIR),a 169:20531+4 2135 AF xor a 170:20535+13 2136 32E044 ld(MEM_FAT_CURDIR+1),a 171: 172:20548+10 2139 C9 ret 173: 174: - 213A _fat_get_root_table_invalid: 175:20558+17 213A CDD001 call PRINTINLINE 176: - 213D 0A0D4361 db 10,13,"Cannot find boot sector.",10,13,0 6E6E6F74 2066696E 6420626F 6F742073 6563746F 722E0A0D 00 177:20575+17 215A CD3A15 call ideif_get_drv_pointer 178:20592+19 215D DD360002 ld (ix+0),0x02 179:20611+10 2161 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: - 2162 fat_getfatsec: 190:20621+16 2162 2A3145 ld HL,(MEM_FAT_OF0_CCLUST) ;load cluster 191:20637+4 2165 7C ld a,h ;if not 0x0000 192:20641+4 2166 B5 or l 193:20645+10 2167 C27921 jp nz, _fat_getfatsec_notroot 194: ;if 0x0000, goto root directory 195:20655+10 216A 21C544 ld hl,MEM_FAT_ROOTSTART 196:20665+10 216D 113745 ld de,MEM_FAT_OF0_DATSEC 197:20675+16 2170 EDA0 ldi ;quick and dirty hack to go back to root directory 198:20691+16 2172 EDA0 ldi 199:20707+16 2174 EDA0 ldi 200:20723+16 2176 EDA0 ldi 201:20739+10 2178 C9 ret 202: 203: - 2179 _fat_getfatsec_notroot: 204:20749+16 2179 2A3145 ld HL,(MEM_FAT_OF0_CCLUST) ;load cluster 205: ;each sector contains 256 clusters 206: ;first 8bits are not needed (/256) 207:20765+4 217C 7C ld a,h ;divide by 256 208:20769+4 217D 6F ld l,a 209:20773+4 217E AF xor a 210:20777+4 217F 67 ld h,a 211: 212:20781+20 2180 ED4BB644 ld bc,(MEM_FAT_RESERVED) ;add reserved sectors 213:20801+11 2184 09 add hl,bc 214:20812+16 2185 223345 ld(MEM_FAT_OF0_FATSEC+0),hl;store sector 215:20828+4 2188 AF xor a 216:20832+13 2189 323545 ld(MEM_FAT_OF0_FATSEC+2),a 217:20845+13 218C 323645 ld(MEM_FAT_OF0_FATSEC+3),a 218: 219:20858+17 218F CD3A15 call ideif_get_drv_pointer 220:20875+10 2192 DD23 inc ix 221:20885+10 2194 DD23 inc ix 222:20895+15 2196 DDE5 push ix 223:20910+10 2198 D1 pop de ;copy poiter to hl 224:20920+10 2199 013345 ld bc,[MEM_FAT_OF0_FATSEC] 225:20930+17 219C CDE422 call _fat_math_add32 ;MEM_FAT_OF0_FATSEC now contains the correct sector 226: ;in the FAT 227: 228: ;read FAT sector 229:20947+10 219F 213345 ld hl,MEM_FAT_OF0_FATSEC ;read next sector 230:20957+7 21A2 0601 ld b,1 231:20964+7 21A4 3E01 ld a,1 232:20971+10 21A6 11B642 LD DE, MEM_IDE_BUFFER ;where to store data? 233:20981+17 21A9 CD6115 call read_lba_sector 234: 235: ;calculate data sector 236: ;multiply cluster by length of cluster 237:20998+4 21AC AF xor a ;clear carry 238:21002+13 21AD 3ABB44 ld a,(MEM_FAT_CLUSTERLEN) 239:21015+7 21B0 0600 ld b,0 240:21022+4 21B2 4F ld c,a 241:21026+20 21B3 ED5B3145 ld de,(MEM_FAT_OF0_CCLUST) ;load cluster number 242:21046+6 21B7 1B dec de ; sub 2 becaus fat starts at 3 243:21052+6 21B8 1B dec de 244:21058+17 21B9 CD1523 call _fat_math_mul32 245: ; BCHL contains result -> store to PTR.MEM_FAT_OF0_DATSEC 246:21075+16 21BC 223745 ld (MEM_FAT_OF0_DATSEC+0),hl 247:21091+20 21BF ED433945 ld (MEM_FAT_OF0_DATSEC+2),bc 248: 249: ; add start of data region to addr 250:21111+10 21C3 013745 ld bc,[MEM_FAT_OF0_DATSEC] 251:21121+10 21C6 11C144 ld de,[MEM_FAT_DATASTART] 252:21131+17 21C9 CDE422 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:21148+13 21CC 3ABB44 ld a,(MEM_FAT_CLUSTERLEN) 258:21161+4 21CF 6F ld l,a 259:21165+7 21D0 2600 ld h,0 260:21172+16 21D2 223B45 ld (MEM_FAT_OF0_DATREM), hl 261: 262: ;get next cluster 263: ;calculate offset address 264:21188+13 21D5 3A3145 ld a,(MEM_FAT_OF0_CCLUST) 265:21201+4 21D8 17 RLA ;shift to left (x2) 266:21205+4 21D9 6F ld l, a 267:21209+7 21DA 3E00 ld a,0 268:21216+4 21DC 17 RLA ;shift in carry flag 269:21220+4 21DD 67 ld h,a 270:21224+10 21DE 11B642 ld de,MEM_IDE_BUFFER 271:21234+11 21E1 19 add hl,de 272: ;copy pointer (hl to de) 273:21245+10 21E2 113145 ld de,MEM_FAT_OF0_CCLUST 274:21255+16 21E5 EDA0 ldi ;copy byte for next cluster from FAT 275:21271+16 21E7 EDA0 ldi 276:21287+10 21E9 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: - 21EA fat_readfilesec: 290: ;call fat_print_dbg 291:21297+10 21EA 213745 ld hl,[MEM_FAT_OF0_DATSEC] 292:21307+7 21ED 0601 ld b,1 293:21314+7 21EF 3E01 ld a,1 294: ;LD DE, MEM_IDE_BUFFER ;where to store data? 295:21321+17 21F1 CD6115 call read_lba_sector ;read sectore 296:21338+10 21F4 213745 ld hl,[MEM_FAT_OF0_DATSEC] ;increment pointer to next sector 297:21348+17 21F7 CDD022 call _fat_increment_32 ;*** 298:21365+16 21FA 2A3B45 ld hl,(MEM_FAT_OF0_DATREM) ;reduce counter 299:21381+4 21FD AF xor a 300:21385+10 21FE 110100 ld de,1 301:21395+15 2201 ED52 sbc hl,de ;decrement counter 302:21410+16 2203 223B45 ld (MEM_FAT_OF0_DATREM),hl ;store decremented counter 303:21426+5+6 2206 C0 ret nz ;when not zero, exit function 304: ;if zero: 305:21431+7 2207 3EFF ld a, 0xFF ;preload error code 306:21438+16 2209 2A3145 ld hl,(MEM_FAT_OF0_CCLUST) ;check next chunk 307:21454+10 220C 11FFFF ld de,0xFFFF ;end mark 308:21464+15 220F ED52 sbc hl,de ;if Z match 309:21479+5+6 2211 C8 ret z ;If 0xFFFF, end is reched. Return 310: ;if next cluster available: 311:21484+4 2212 AF xor a 312:21488+17 2213 CD6221 call fat_getfatsec ; read next cluster information 313:21505+10 2216 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: - 2217 fat_openfile: 329:21515+11 2217 D5 PUSH DE 330: ;MEM_FAT_TMPFNAME now has valid text to compare 331:21526+10 2218 21CF44 LD HL,[MEM_FAT_TMPFNAME] 332:21536+17 221B CD5C23 call format_filename_fat16 333:21553+10 221E D1 POP DE 334: - 221F fat_openfile_noprepare: 335:21563+11 221F D5 PUSH DE 336: ;prepare pointer 337:21574+10 2220 213F45 ld hl,MEM_FAT_CURRDIR 338:21584+10 2223 11D141 ld de,MEM_IDE_POINTER 339:21594+16 2226 EDA0 ldi 340:21610+16 2228 EDA0 ldi 341:21626+16 222A EDA0 ldi 342:21642+16 222C EDA0 ldi 343: 344:21658+13 222E 3ACD44 LD A,(MEM_FAT_DIRSEC) ;init counter for FAT sectors 345:21671+13 2231 32BC44 LD (MEM_FAT_COUNT1),A 346: 347:21684+10 2234 21D141 LD HL,MEM_IDE_POINTER ;read first sector 348:21694+7 2237 0601 LD B,1 349:21701+7 2239 3E01 ld a,1 350:21708+10 223B 11B642 LD DE, MEM_IDE_BUFFER ;where to store data? 351:21718+17 223E CD6115 call read_lba_sector 352: 353:21735+10 2241 21B642 LD HL, MEM_IDE_BUFFER ;set buffer start 354:21745+7 2244 0E10 LD C,16 ;set entries counter 355: 356: - 2246 _fat_lfs_loop: 357:21752+10 2246 11CF44 LD DE,[MEM_FAT_TMPFNAME] 358:21762+17 2249 CD4623 CALL compare_filename 359:21779+7+5 224C 3838 JR C, _fat_lfs_loop_compare_match ;on match 360: 361: ; prepare next entry 362:21786+4 224E 0D DEC C ;next sector after 16 entries 363:21790+7+5 224F 2807 JR Z,_fat_lfs_loop_compare_next_sector 364:21797+10 2251 112000 LD DE, 32 ;length of entry 365:21807+11 2254 19 ADD HL,DE ;increment 366:21818+10 2255 C34622 JP _fat_lfs_loop 367: 368: - 2258 _fat_lfs_loop_compare_next_sector: 369:21828+10 2258 21D141 ld hl,[MEM_IDE_POINTER] 370:21838+17 225B CDD022 call _fat_increment_32 ;increment sector 371: 372:21855+13 225E 3ABC44 LD A,(MEM_FAT_COUNT1) ; decrement sector count (max FAT length) 373:21868+4 2261 3D DEC A 374:21872+13 2262 32BC44 LD (MEM_FAT_COUNT1),A 375:21885+10 2265 CA8222 JP Z, _fat_lfs_loop_compare_end ; if DE is 0, mmax is reached. End here 376: ;call print_a_hex 377: 378:21895+10 2268 21D141 LD HL,MEM_IDE_POINTER ;read next sector 379:21905+7 226B 0601 LD B,1 380:21912+7 226D 3E01 ld a,1 381:21919+10 226F 11B642 LD DE, MEM_IDE_BUFFER ;where to store data? 382:21929+17 2272 CD6115 call read_lba_sector 383: 384:21946+10 2275 21B642 LD HL, MEM_IDE_BUFFER ;set buffer start 385:21956+7 2278 0E10 LD C,16 ;set entries counter 386: 387:21963+7 227A 7E ld a,(HL) 388:21970+4 227B B7 or a 389:21974+10 227C CA8222 jp z, _fat_lfs_loop_compare_end ;skip empty sectors 390: 391:21984+10 227F C34622 JP _fat_lfs_loop 392: 393: - 2282 _fat_lfs_loop_compare_end: 394:21994+10 2282 D1 POP DE 395:22004+7 2283 3EFF ld a,0xFF 396:22011+10 2285 C9 RET 397: 398: - 2286 _fat_lfs_loop_compare_match: 399: ; get entry 400:22021+10 2286 D1 POP DE 401: 402: ; HL points to Start of Table item 403:22031+11 2287 E5 PUSH HL 404:22042+14 2288 DDE1 POP IX 405: ; get important information 406:22056+19 228A DD7E1B ld a,(ix+0x1B) ;first cluster number 407:22075+13 228D 323245 ld (MEM_FAT_OF0_CCLUST+1),a 408:22088+19 2290 DD7E1A ld a,(ix+0x1A) 409:22107+13 2293 323145 ld (MEM_FAT_OF0_CCLUST+0),a 410:22120+19 2296 DD7E0B ld a,(ix+0x0B) 411:22139+13 2299 322F45 ld (MEM_FAT_OF0_ATTRIBUTE+0),a 412: 413:22152+4 229C AF xor a ;clear carry ;set MEM_FAT_OF0_DATREM to remaining sectors 414:22156+19 229D DD7E1F ld a,(ix+0x1F) ;cluste length shift by 256 415:22175+4 22A0 1F rra 416:22179+13 22A1 32CB44 ld (MEM_FAT_FILEREMAIN+2),a 417:22192+19 22A4 DD7E1E ld a,(ix+0x1E) 418:22211+4 22A7 1F rra 419:22215+13 22A8 32CA44 ld (MEM_FAT_FILEREMAIN+1),a 420:22228+19 22AB DD7E1D ld a,(ix+0x1D) 421:22247+4 22AE 1F rra 422:22251+13 22AF 32C944 ld (MEM_FAT_FILEREMAIN+0),a 423:22264+7 22B2 3E00 ld a,0 424:22271+13 22B4 32CC44 ld (MEM_FAT_FILEREMAIN+3),a 425:22284+17 22B7 CD6221 call fat_getfatsec ;get sector information 426: 427:22301+4 22BA AF xor a 428:22305+10 22BB C9 RET 429: 430: 431: ;=================== UTIL Functions =========================== 432: ; 32 Bit addition to pointer 433: ; HL has value 434: ;deprecated!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 435: - 22BC _fat_math_sector_add_16: 436:22315+16 22BC 22BD44 ld (MEM_FAT_TMPPOINTER), hl 437:22331+4 22BF AF xor a 438:22335+13 22C0 32BF44 ld (MEM_FAT_TMPPOINTER+2),a 439:22348+13 22C3 32C044 ld (MEM_FAT_TMPPOINTER+3),a 440: 441:22361+10 22C6 11BD44 ld de,[MEM_FAT_TMPPOINTER] 442:22371+10 22C9 01D141 ld bc,[MEM_IDE_POINTER] 443:22381+17 22CC CDE422 call _fat_math_add32 444:22398+10 22CF C9 ret 445: ;deprecated!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 446: 447: ;hl contains pointer 448: - 22D0 _fat_increment_32 449:22408+7 22D0 7E ld a,(HL) ; byte 0 450:22415+7 22D1 C601 add 1 451:22422+7 22D3 77 ld (hl),a 452:22429+6 22D4 23 inc hl 453:22435+7 22D5 7E ld a,(HL) ; byte 1 454:22442+7 22D6 CE00 adc 0 455:22449+7 22D8 77 ld (hl),a 456:22456+6 22D9 23 inc hl 457:22462+7 22DA 7E ld a,(HL) ; byte 2 458:22469+7 22DB CE00 adc 0 459:22476+7 22DD 77 ld (hl),a 460:22483+6 22DE 23 inc hl 461:22489+7 22DF 7E ld a,(HL) ; byte 3 462:22496+7 22E0 CE00 adc 0 463:22503+7 22E2 77 ld (hl),a 464:22510+10 22E3 C9 ret 465: ;bc contains pointer to a (also result) 466: ;de contains pointer to b 467: - 22E4 _fat_math_add32 468:22520+11 22E4 E5 push hl 469:22531+11 22E5 C5 push bc 470:22542+11 22E6 D5 push de 471:22553+7 22E7 1A ld a,(de) ; load lower 16bit for B int from (DE) to HL 472:22560+4 22E8 6F ld l,a 473:22564+6 22E9 13 inc de 474:22570+7 22EA 1A ld a,(de) 475:22577+4 22EB 67 ld h,a 476:22581+6 22EC 13 inc de 477: ; HL, DE dirty 478:22587+7 22ED 0A ld a,(bc) ; load lower 16bit for A int from (BC) to DE 479:22594+4 22EE 5F ld e,a 480:22598+6 22EF 03 inc bc 481:22604+7 22F0 0A ld a,(bc) 482:22611+4 22F1 57 ld d,a 483: ; HL now contains A, DE now contains D 484:22615+11 22F2 19 add hl,de ;add lower bytes, store carry 485:22626+10 22F3 D1 pop de ;restore pointers 486:22636+10 22F4 C1 pop bc ;both now cointain first byte of long-value 487:22646+4 22F5 7D ld a,l ;store lower result in (bc) 488:22650+7 22F6 02 ld (bc),a 489:22657+6 22F7 03 inc bc 490:22663+4 22F8 7C ld a,h 491:22667+7 22F9 02 ld (bc),a 492:22674+6 22FA 03 inc bc 493:22680+6 22FB 13 inc de ;also increment de to next byte 494:22686+6 22FC 13 inc de 495: ; DE and HL now start at the upper byte 496:22692+11 22FD C5 push bc 497:22703+11 22FE D5 push de 498:22714+7 22FF 1A ld a,(de) ; load upper 16bit for B 499:22721+4 2300 6F ld l,a 500:22725+6 2301 13 inc de 501:22731+7 2302 1A ld a,(de) 502:22738+4 2303 67 ld h,a 503:22742+6 2304 13 inc de 504:22748+7 2305 0A ld a,(bc) ; load upper 16bit for A 505:22755+4 2306 5F ld e,a 506:22759+6 2307 03 inc bc 507:22765+7 2308 0A ld a,(bc) 508:22772+4 2309 57 ld d,a 509:22776+15 230A ED5A adc hl,de ;add upper bytes, store carry 510:22791+10 230C D1 pop de 511:22801+10 230D C1 pop bc 512:22811+4 230E 7D ld a,l ;store lower result in (bc) 513:22815+7 230F 02 ld(bc),a 514:22822+6 2310 03 inc bc 515:22828+4 2311 7C ld a,h 516:22832+7 2312 02 ld(bc),a 517:22839+10 2313 E1 pop hl 518:22849+10 2314 C9 ret 519: 520: 521: ; Multiply 16-bit values (with 32-bit result) 522: ; Operands BC, DE 523: ; Result -> BCHL 524: - 2315 _fat_math_mul32: 525:22859+4 2315 79 ld a,c 526:22863+4 2316 48 ld c,b 527:22867+10 2317 210000 ld hl,0 528:22877+7 231A 0610 ld b,16 529: - 231C _fat_math_mul32_l: 530:22884+11 231C 29 add hl,hl 531:22895+4 231D 17 rla 532:22899+8 231E CB11 rl c 533:22907+7+5 2320 3007 jr nc,_fat_math_mul32_noadd 534:22914+11 2322 19 add hl,de 535:22925+7 2323 CE00 adc a,0 536:22932+10 2325 D22923 jp nc,_fat_math_mul32_noadd 537:22942+4 2328 0C inc c 538: - 2329 _fat_math_mul32_noadd: 539:22946+8+5 2329 10F1 djnz _fat_math_mul32_l 540:22954+4 232B 41 ld b,c 541:22958+4 232C 4F ld c,a 542:22962+10 232D C9 ret 543: 544: ; reset LBA pointer to first sector in selected partition 545: - 232E fat_reset_pointer: 546:22972+17 232E CD3A15 call ideif_get_drv_pointer 547:22989+10 2331 DD23 inc ix 548:22999+10 2333 DD23 inc ix 549:23009+15 2335 DDE5 push ix 550:23024+10 2337 E1 pop hl ;copy poiter to hl 551:23034+10 2338 11D141 ld de, MEM_IDE_POINTER 552:23044+12 233B 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: - 233D fat_copy_lba_pointer: 558:23056+11 233D C5 PUSH BC 559:23067+7 233E 0600 LD B,0 560:23074+7 2340 0E04 LD C,4 561:23081+16+5 2342 EDB0 LDIR 562:23097+10 2344 C1 POP BC 563:23107+10 2345 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: - 2346 compare_filename: 571:23117+11 2346 E5 PUSH HL 572:23128+11 2347 C5 push BC 573:23139+7 2348 060B LD B, 11 ;Counter 574: - 234A _compare_filename_loop: 575:23146+7 234A 1A LD A,(DE) 576:23153+4 234B 4F LD C,A 577:23157+7 234C 7E LD A,(HL) 578:23164+6 234D 23 INC HL 579:23170+6 234E 13 INC DE 580:23176+4 234F A9 XOR C ;check if identical (should return 0) 581:23180+7+5 2350 2006 JR NZ, _compare_filename_nomatch 582:23187+8+5 2352 10F6 djnz _compare_filename_loop ;if not last, continue 583:23195+10 2354 C1 POP BC 584:23205+10 2355 E1 POP HL 585:23215+4 2356 37 SCF 586:23219+10 2357 C9 RET 587: - 2358 _compare_filename_nomatch: 588:23229+10 2358 C1 POP BC 589:23239+10 2359 E1 POP HL 590:23249+4 235A AF XOR A ; clear carry flag 591:23253+10 235B C9 RET 592: 593: ; formats filename to 8+3 format 594: ; DE points to source filename to string 595: ; HL points to destination 596: - 235C format_filename_fat16: 597:23263+7 235C 060B LD B, 11 ;counter 598:23270+11 235E E5 PUSH HL 599:23281+7 235F 3E20 LD A, ' ' 600: - 2361 _format_filename_fat16_clean: 601:23288+7 2361 77 LD (HL),A 602:23295+6 2362 23 INC HL 603:23301+8+5 2363 10FC DJNZ _format_filename_fat16_clean 604:23309+10 2365 E1 POP HL ; continue with copy 605:23319+7 2366 060D LD B, 13 606: - 2368 _format_filename_fat16_loop: 607:23326+7 2368 1A LD A, (DE) ; load byte 608:23333+4 2369 B7 OR A 609:23337+5+6 236A C8 RET Z ;exit on 0byte 610:23342+4 236B 05 DEC B ;reduce counter 611:23346+5+6 236C C8 RET Z ;exit after 12 bytes 8+.+3 612:23351+7 236D FE2E CP '.' ; check if dot 613:23358+7+5 236F 200A JR NZ, _format_filename_fat16_loop_copy ; if not continue as usual 614:23365+6 2371 13 INC DE ;else skip char 615: - 2372 _format_filename_fat16_loop_skip_8: 616:23371+4 2372 78 LD A,B 617:23375+7 2373 FE05 CP 5 618:23382+7+5 2375 38F1 JR C, _format_filename_fat16_loop 619:23389+6 2377 23 INC HL 620:23395+4 2378 05 DEC B 621:23399+12 2379 18F7 JR _format_filename_fat16_loop_skip_8 622: 623: - 237B _format_filename_fat16_loop_copy: 624:23411+7 237B 1A LD A, (DE) ; load byte 625:23418+7 237C 77 LD (HL), A ; copy byte 626:23425+6 237D 23 INC HL 627:23431+6 237E 13 INC DE **** main.asm **** 207:23437+10 237F C36823 JP _format_filename_fat16_loop 208: .include "fat16_cmd.s" **** include/fat16_cmd.s **** 1: ;------------------------------------- 2: ; Print current fat directory of MEM_FAT_CURRDIR 3: ;------------------------------------- 4: - 2382 fat_print_directory: 5:23447+10 2382 213F45 ld hl,MEM_FAT_CURRDIR 6:23457+10 2385 11D141 ld de,MEM_IDE_POINTER 7:23467+16 2388 EDA0 ldi 8:23483+16 238A EDA0 ldi 9:23499+16 238C EDA0 ldi 10:23515+16 238E EDA0 ldi 11: 12:23531+20 2390 ED5BB944 LD DE,(MEM_FAT_SECTORS) 13:23551+20 2394 ED53BC44 LD (MEM_FAT_COUNT1),DE 14:23571+10 2398 21D141 LD HL,MEM_IDE_POINTER ;read first sector 15:23581+7 239B 0601 LD B,1 16:23588+7 239D 3E01 ld a,1 17:23595+10 239F 11B642 LD DE, MEM_IDE_BUFFER ;where to store data? 18:23605+17 23A2 CD6115 call read_lba_sector 19: 20:23622+17 23A5 CDD001 call PRINTINLINE 21: - 23A8 0A0D2020 db 10,13," Filename Cluster Size",10,13,0 46696C65 6E616D65 20202020 20436C75 73746572 2053697A 650A0D00 22: 23:23639+10 23C8 21B642 LD HL, MEM_IDE_BUFFER ;set buffer start 24:23649+7 23CB 0E10 LD C,16 ;set entries counter 25: 26: - 23CD _fat_print_directory_loop: ;loop over each entry (32byte) 27:23656+7 23CD 7E LD A,(HL) ; check first byte 28:23663+11 23CE E5 PUSH HL ;backup start of entry 29:23674+14 23CF DDE1 POP IX 30:23688+11 23D1 E5 PUSH HL 31: ;ignore unwanted entries 32:23699+7 23D2 FE41 CP 0x41 ;skip invisible 33:23706+10 23D4 CA6524 JP Z, _fat_print_directory_loop_next 34:23716+7 23D7 FEE5 CP 0xE5 ;skip deleted 35:23723+10 23D9 CA6524 JP Z, _fat_print_directory_loop_next 36:23733+7 23DC FE00 CP 0x00 ;reached end 37:23740+10 23DE CA9924 JP Z, _fat_print_directory_loop_break 38: 39: ;check file attribute 40:23750+19 23E1 DD7E0B ld a,(IX+0x0B) 41:23769+7 23E4 FE10 cp 0x10 ;if subdirectors 42:23776+10 23E6 CA3A24 jp z, _fat_print_directory_dir ;print dir 43: ;else print file 44: - 23E9 _fat_print_directory_loop_file 45: ;print filename 46:23786+7 23E9 3E20 ld a,' ' 47:23793+17 23EB CD1501 call print_char 48:23810+7 23EE 3E20 ld a,' ' 49:23817+17 23F0 CD1501 call print_char 50:23834+7 23F3 0608 LD B,8 51:23841+17 23F5 CDAA18 call print_str_fixed 52:23858+7 23F8 3E2E ld A,'.' 53:23865+17 23FA CD1501 call print_char 54:23882+7 23FD 0603 LD B,3 55:23889+17 23FF CDAA18 call print_str_fixed 56: 57:23906+17 2402 CDD001 call PRINTINLINE 58: - 2405 20307800 db " 0x",0 59: ;first cluster number 60:23923+19 2409 DD7E1B ld a,(ix+0x1B) 61:23942+17 240C CD4301 call print_a_hex 62:23959+19 240F DD7E1A ld a,(ix+0x1A) 63:23978+17 2412 CD4301 call print_a_hex 64:23995+17 2415 CDD001 call PRINTINLINE 65: - 2418 20203078 db " 0x",0 00 66:24012+19 241D DD7E1F ld a,(ix+0x1F) 67:24031+17 2420 CD4301 call print_a_hex 68:24048+19 2423 DD7E1E ld a,(ix+0x1E) 69:24067+17 2426 CD4301 call print_a_hex 70:24084+19 2429 DD7E1D ld a,(ix+0x1D) 71:24103+17 242C CD4301 call print_a_hex 72:24120+19 242F DD7E1C ld a,(ix+0x1C) 73:24139+17 2432 CD4301 call print_a_hex 74:24156+17 2435 CD2D01 call print_newLine 75:24173+12 2438 182B jr _fat_print_directory_loop_next 76: - 243A _fat_print_directory_dir 77:24185+7 243A 3E44 ld a,'D' 78:24192+17 243C CD1501 call print_char 79:24209+7 243F 3E20 ld a,' ' 80:24216+17 2441 CD1501 call print_char 81:24233+7 2444 0608 LD B,8 82:24240+17 2446 CDAA18 call print_str_fixed 83:24257+17 2449 CDD001 call PRINTINLINE 84: - 244C 20202020 db " 0x",0 20307800 85: ;first cluster number 86:24274+19 2454 DD7E1B ld a,(ix+0x1B) 87:24293+17 2457 CD4301 call print_a_hex 88:24310+19 245A DD7E1A ld a,(ix+0x1A) 89:24329+17 245D CD4301 call print_a_hex 90:24346+17 2460 CD2D01 call print_newLine 91:24363+12 2463 1800 jr _fat_print_directory_loop_next 92: 93: - 2465 _fat_print_directory_loop_next: ; read next entry 94:24375+4 2465 0D DEC C ;next sector after 32 entries 95:24379+7+5 2466 2808 JR Z,_fat_print_directory_loop_next_sector 96:24386+10 2468 E1 POP HL ;restore start 97:24396+10 2469 112000 LD DE, 32 ;length of entry 98:24406+11 246C 19 ADD HL,DE ;increment 99:24417+10 246D C3CD23 JP _fat_print_directory_loop 100: 101: - 2470 _fat_print_directory_loop_next_sector: ; end fo sector. read next sector from disk 102:24427+10 2470 E1 POP HL ;clear stack from old hl 103:24437+7 2471 2600 LD H,0 104:24444+7 2473 2E01 LD L,1 105:24451+17 2475 CDBC22 call _fat_math_sector_add_16 ;increment sector 106: 107:24468+20 2478 ED5BBC44 LD DE,(MEM_FAT_COUNT1) ; decrement sector count (max FAT length) 108:24488+6 247C 1B DEC DE 109:24494+20 247D ED53BC44 LD (MEM_FAT_COUNT1),DE 110:24514+4 2481 7A LD A,D 111:24518+4 2482 B3 OR E 112:24522+5+6 2483 C8 RET Z ; if DE is 0, mmax is reached. End here 113: 114:24527+10 2484 21D141 LD HL,MEM_IDE_POINTER ;read next sector 115:24537+7 2487 0601 LD B,1 116:24544+7 2489 3E01 ld a,1 117:24551+10 248B 11B642 LD DE, MEM_IDE_BUFFER ;where to store data? 118:24561+17 248E CD6115 call read_lba_sector 119: 120:24578+10 2491 21B642 LD HL, MEM_IDE_BUFFER ;set buffer start 121:24588+7 2494 0E10 LD C,16 ;set entries counter 122:24595+10 2496 C3CD23 JP _fat_print_directory_loop 123: 124: - 2499 _fat_print_directory_loop_break 125:24605+10 2499 E1 POP HL 126:24615+10 249A 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: - 249B fat_cd_single: 134:24625+11 249B D5 push de 135: ; check if user wants to go back (input = '..') 136:24636+7 249C 1A ld a,(de) 137:24643+7 249D FE2E cp '.' 138:24650+7+5 249F 205E jr nz, _fat_cd_navigate; if not, skip 139:24657+6 24A1 13 inc de ;check next 140:24663+7 24A2 1A ld a,(de) 141:24670+7 24A3 FE2E cp '.' 142:24677+7+5 24A5 2058 jr nz, _fat_cd_navigate; if not, skip 143:24684+13 24A7 3A7A41 ld a,(var_dir+79) ;last byte contains depth 144:24697+4 24AA B7 or a; Test if 0 145:24701+10 24AB CA5725 jp z, _fat_cd_navigate_error ;cannot go back any more (already at root) 146: ; check if .. exists in directory 147:24711+7 24AE 3E2E ld a,'.' ;prepare filename buffer 148:24718+10 24B0 21CF44 ld hl,[MEM_FAT_TMPFNAME] 149:24728+7 24B3 77 ld (hl),a 150:24735+6 24B4 23 inc hl 151:24741+7 24B5 77 ld (hl),a 152:24748+6 24B6 23 inc hl 153:24754+7 24B7 3E20 ld a,0x20 ;clear char 3-11 154:24761+7 24B9 060B ld b,11 155: - 24BB _fat_cd_navigate_goback_fl: 156:24768+7 24BB 77 ld (hl),a 157:24775+6 24BC 23 inc hl 158:24781+8+5 24BD 10FC djnz _fat_cd_navigate_goback_fl ;fill loop end 159:24789+17 24BF CD1F22 call fat_openfile_noprepare ;load file table (only 1st sector needed) 160:24806+4 24C2 B7 or a ;check for error 161:24810+10 24C3 C25725 jp nz, _fat_cd_navigate_error ;entry not found exception 162: 163: 164: ; find end of path 165:24820+10 24C6 212E41 ld hl,[var_dir+3] ;current position 166:24830+10 24C9 014C00 ld bc,76 167:24840+7 24CC 3E00 ld a,0x00 ;termination char 168:24847+16+5 24CE EDB1 cpir ;find end 169:24863+10 24D0 E26525 jp po,_fat_cd_navigate_inerror ;in case of error, abort 170: ;hl is now at end of string 171:24873+10 24D3 014C00 ld bc,76 172:24883+7 24D6 3E5C ld a,'\' ;seperation char 173:24890+16+5 24D8 EDB9 cpdr ;serach backwards for "/" 174:24906+10 24DA E26525 jp po,_fat_cd_navigate_inerror ;in case of error, abort 175: ;hl is now at end of string 176:24916+6 24DD 23 inc hl 177:24922+4 24DE AF xor a 178:24926+7 24DF 77 ld (hl),a ;set termination char 179:24933+6 24E0 23 inc hl 180:24939+7 24E1 77 ld (hl),a ;set termination char 181:24946+13 24E2 3A7A41 ld a,(var_dir+79) 182:24959+4 24E5 3D dec a 183:24963+13 24E6 327A41 ld (var_dir+79),a ;decrement dir depth counter 184: 185:24976+10 24E9 D1 pop de 186: 187:24986+10 24EA 212D41 ld hl,[var_dir+2] 188:24996+7 24ED 3E5C ld a,'\' 189:25003+7 24EF 77 ld (hl),a ;set first / 190: 191:25010+10 24F0 213745 ld hl,MEM_FAT_OF0_DATSEC ;setup directory pointer 192:25020+10 24F3 113F45 ld de,MEM_FAT_CURRDIR 193:25030+16 24F6 EDA0 ldi 194:25046+16 24F8 EDA0 ldi 195:25062+16 24FA EDA0 ldi 196:25078+16 24FC EDA0 ldi 197: 198:25094+10 24FE C9 ret 199: 200: - 24FF _fat_cd_navigate 201:25104+10 24FF D1 pop de ;get pointer to directory namme 202:25114+11 2500 D5 push de ;and re-store it for next use 203:25125+17 2501 CD1722 call fat_openfile ;find 'file' in current directory 204: - 2504 _fat_cd_navigate_findsec 205:25142+4 2504 B7 or a 206:25146+10 2505 C25725 jp nz, _fat_cd_navigate_error ;entry not found 207:25156+13 2508 3A2F45 ld a, (MEM_FAT_OF0_ATTRIBUTE) 208:25169+7 250B FE10 cp 0x10 209:25176+10 250D C26D25 jp nz, _fat_cd_navigate_errfile 210:25186+13 2510 3A7A41 ld a,(var_dir+79) 211:25199+4 2513 3C inc a 212:25203+13 2514 327A41 ld (var_dir+79),a ;increment dir depth counter 213:25216+10 2517 212D41 ld hl,[var_dir+2] ;load start of path string 214:25226+7 251A 3E00 ld a,0 ;load termination char 215:25233+10 251C 014C00 ld bc,76 ;max length of string 216:25243+16+5 251F EDB1 cpir ;find end of path string 217:25259+6 2521 2B dec hl 218:25265+10 2522 E26525 jp po,_fat_cd_navigate_inerror ;in case of error, abort 219: ;HL now has last element, BC has remaining max length 220:25275+13 2525 3A7A41 ld a,(var_dir+79) ;last byte contains depth 221:25288+7 2528 FE01 cp 1 ;if first path, skip / 222:25295+7+5 252A 2804 jr z, _fat_cd_navigate_findsec_skipslash 223:25302+7 252C 3E5C ld a,'\' 224:25309+7 252E 77 ld (hl),a 225:25316+6 252F 23 inc hl 226: - 2530 _fat_cd_navigate_findsec_skipslash 227:25322+10 2530 D1 pop de ;get argument from stack 228:25332+4 2531 EB ex de,hl 229:25336+11 2532 D5 push de ;store start to stack 230: ;HL now has start of input string, DE has end of current path 231:25347+10 2533 010900 ld bc,09 ;maximum length of directory name +1 232: - 2536 _fat_cd_navigate_l2: ;copy new subdirectory 233:25357+16 2536 EDA0 ldi ;copy 234:25373+10 2538 E25F25 jp po,_fat_cd_navigate_inerrorS ;in case of error, abort 235:25383+7 253B 7E ld a,(hl) ;check next char 236:25390+7 253C FE5C cp '\' ;end at '\' 237:25397+7+5 253E 2805 jr z, _fat_cd_navigate_end ;else next byte 238:25404+4 2540 B7 or a ;or and at 0x00 239:25408+7+5 2541 2802 jr z, _fat_cd_navigate_end ;else next byte 240:25415+12 2543 18F1 jr _fat_cd_navigate_l2 241: - 2545 _fat_cd_navigate_end: 242:25427+4 2545 AF xor a 243:25431+7 2546 12 ld (de),a ;set last byte to 0x00 (termination) 244:25438+10 2547 213745 ld hl,MEM_FAT_OF0_DATSEC 245: ;setup directory pointer 246:25448+10 254A 113F45 ld de,MEM_FAT_CURRDIR 247:25458+16 254D EDA0 ldi 248:25474+16 254F EDA0 ldi 249:25490+16 2551 EDA0 ldi 250:25506+16 2553 EDA0 ldi 251:25522+10 2555 D1 pop de ;stack cleanup 252:25532+10 2556 C9 ret 253: 254: - 2557 _fat_cd_navigate_error: 255:25542+10 2557 217525 ld hl,[_fat_cd_navigate_error_str] 256:25552+17 255A CD1D01 call print_str 257:25569+10 255D D1 pop de 258:25579+10 255E C9 ret 259: 260: - 255F _fat_cd_navigate_inerrorS: ;with path reset 261:25589+10 255F D1 pop de ;restore former path 262:25599+6 2560 1B dec de ;change pointer to remove previous '\' as well 263:25605+4 2561 AF xor a ;clear a to 0x00 264:25609+7 2562 12 ld (de),a ;set last byte to 0x00 (termination) 265:25616+12 2563 1801 jr _fat_cd_navigate_inerrore 266: - 2565 _fat_cd_navigate_inerror: ;without path reset 267:25628+10 2565 D1 pop de 268: - 2566 _fat_cd_navigate_inerrore: 269:25638+10 2566 218C25 ld hl,[_fat_cd_navigate_inputerr_str] 270:25648+17 2569 CD1D01 call print_str 271:25665+10 256C C9 ret 272: - 256D _fat_cd_navigate_errfile: 273:25675+10 256D D1 pop de 274:25685+10 256E 219F25 ld hl,[_fat_cd_navigate_errfile_str] 275:25695+17 2571 CD1D01 call print_str 276:25712+10 2574 C9 ret 277: 278: - 2575 _fat_cd_navigate_error_str: 279: - 2575 0A0D4E6F db 10,13,"No such directory!",10,13,0 20737563 68206469 72656374 6F727921 0A0D00 280: - 258C _fat_cd_navigate_inputerr_str: 281: - 258C 0A0D496E db 10,13,"Invalid input!",10,13,0 76616C69 6420696E 70757421 0A0D00 282: - 259F _fat_cd_navigate_errfile_str: 283: - 259F 0A0D4361 db 10,13,"Cannot cd to file!",10,13,0 6E6E6F74 20636420 746F2066 696C6521 0A0D00 284: 285: - 25B6 fat_exec: 286:25722+11 25B6 D5 push de 287: ;DE has pointer to arguments 288:25733+17 25B7 CD1722 call fat_openfile 289:25750+4 25BA B7 or a 290:25754+10 25BB C24C26 jp nz, _fat_exec_notfound ;if not found, abort 291: ;call fat_print_dbg 292: ;load header 293:25764+10 25BE 11B642 ld de, MEM_IDE_BUFFER 294:25774+17 25C1 CDEA21 call fat_readfilesec 295: 296: 297: ;ld hl, MEM_IDE_BUFFER ;print sector 298: ;ld b,0x20 299: ;call dump_pretty 300: 301:25791+13 25C4 3AB642 ld a,(MEM_IDE_BUFFER) 302:25804+7 25C7 FEC3 cp 0xC3 303:25811+10 25C9 C26526 jp nz, _fat_exec_notexec 304: 305:25821+17 25CC CDD001 call PRINTINLINE 306: - 25CF 0A0D4C6F db 10,13,"Loading ",0 6164696E 672000 307:25838+10 25DA E1 pop hl ;get and re-store pointer ot filename from and to stack 308:25848+11 25DB E5 push hl 309:25859+17 25DC CD1D01 call print_str 310:25876+17 25DF CDD001 call PRINTINLINE 311: - 25E2 20746F20 db " to 0x",0 307800 312: ;get start address 313:25893+20 25E9 ED4BC042 ld bc,(MEM_IDE_BUFFER + 10) 314:25913+4 25ED 78 ld a,b 315:25917+17 25EE CD4301 call print_a_hex 316:25934+4 25F1 79 ld a,c 317:25938+17 25F2 CD4301 call print_a_hex 318:25955+17 25F5 CDD001 call PRINTINLINE 319: - 25F8 202E2E2E db " ... ",0 2000 320: ;bc has start addr 321:25972+20 25FE ED434345 ld (MEM_FAT_EXEC_CURR),bc 322:25992+20 2602 ED434745 ld (MEM_FAT_EXEC_START),bc 323: 324: ;get amount of sectors to load 325:26012+16 2606 2AC442 ld hl,(MEM_IDE_BUFFER + 14) 326:26028+4 2609 6C ld l,h 327:26032+8 260A CB3D srl l 328:26040+7 260C 2600 ld h,0 ;divide by 512 329:26047+6 260E 23 inc hl ;increment because first sector is always loaded 330: ; hl contains sector count 331:26053+16 260F 224545 ld (MEM_FAT_EXEC_COUNT), hl 332: 333:26069+10 2612 D1 pop de ; restore filename 334:26079+17 2613 CD1722 call fat_openfile ;reset file information 335: ;start reading 336: - 2616 _fat_exec_readloop1: 337:26096+20 2616 ED5B4345 ld de,(MEM_FAT_EXEC_CURR) 338:26116+17 261A CDEA21 call fat_readfilesec 339:26133+16 261D 2A4345 ld hl,(MEM_FAT_EXEC_CURR) 340:26149+10 2620 110002 ld de,512 341:26159+11 2623 19 add hl,de 342:26170+16 2624 224345 ld (MEM_FAT_EXEC_CURR),hl 343: 344:26186+16 2627 2A4545 ld hl,(MEM_FAT_EXEC_COUNT) 345:26202+6 262A 2B dec hl 346:26208+16 262B 224545 ld (MEM_FAT_EXEC_COUNT),hl 347:26224+4 262E 7C ld a,h 348:26228+4 262F B5 or l 349:26232+7+5 2630 2802 jr z, _fat_exec_read_done 350:26239+12 2632 18E2 jr _fat_exec_readloop1 351: - 2634 _fat_exec_read_done: 352:26251+17 2634 CDD001 call PRINTINLINE 353: - 2637 4C6F6164 db "Load complete!",10,13,0 20636F6D 706C6574 65210A0D 00 354:26268+16 2648 2A4745 ld hl,(MEM_FAT_EXEC_START) 355:26284+4 264B E9 jp (hl) 356: 357: 358: - 264C _fat_exec_notfound: 359:26288+10 264C D1 pop de 360:26298+17 264D CDD001 call PRINTINLINE 361: - 2650 0A0D4669 db 10,13,"File not found!",10,13,0 6C65206E 6F742066 6F756E64 210A0D00 362:26315+10 2664 C9 ret 363: 364: - 2665 _fat_exec_notexec: 365:26325+10 2665 D1 pop de 366:26335+17 2666 CDD001 call PRINTINLINE 367: - 2669 0A0D4669 db 10,13,"File is not an executable!",10,13,0 6C652069 73206E6F 7420616E 20657865 63757461 626C6521 0A0D00 **** main.asm **** 209:26352+10 2688 C9 ret 210: 211: ;================================================================ 212: ; Strings 213: ;================================================================ 214: - 2689 STR_Banner_Start: 215: - 2689 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 578 symbols 11070 bytes 2 macro calls 244 macro bytes 8 invented symbols Symbol Table: ?a0000 14A5 5285 ?a0001 1562 5474 ADDR_RTC =D0 208 A_RTS_OFF 1BE 446 A_RTS_ON 1C7 455 BOOT_PHASE0 83 131 BOOT_PHASE1 A5 165 BOOT_PHASE1_LOOP AE 174 BOOT_PHASE2 B9 185 B_BEEP 50 80 B_DSKSEL 71 113 B_FATCD 7A 122 B_FATCREATE 7D 125 B_FATOPEN 74 116 B_FATREAD 77 119 B_FATWRITE 80 128 B_IICRECV 56 86 B_IICSEND 53 83 B_KEYREAD 6B 107 B_KEYSEND 6E 110 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 1944 6468 COMMAND_BACKSPACE 1985 6533 COMMAND_LUT 18B2 6322 COMMAND_PROCESS 19AB 6571 COMMAND_PROCESS_FOUND 19E6 6630 COMMAND_PROCESS_LOOP 19AE 6574 COMMAND_PROCESS_LOOP_STR1 19B7 6583 COMMAND_PROCESS_LOOP_STR2 19CD 6605 COMMAND_PROCESS_NEXT_ENTRY 19D2 6610 COMMAND_PROCESS_NEXT_ENTRYI 19D1 6609 COMMAND_PROCESS_NOT_FOUND 19DD 6621 COMMAND_READ 1956 6486 CONSOLE_INIT DC 220 CONSOLE_INIT_CTC DC 220 CONSOLE_INIT_SIO E4 228 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 235 565 DHEX_TO_BYTE_FAILED 251 593 ERR_SYNTAX 19FC 6652 EXEC_RST_08 DD5 3541 EXEC_RST_10 DD9 3545 EXEC_RST_18 DE5 3557 HEX_TO_BIN 255 597 HEX_TO_BIN_2 263 611 HEX_TO_INVALID_2 26A 618 IDE_CMD_IDENT =EC 236 IDE_CMD_READSEC=20 32 IDE_DEV_TABLE 1307 4871 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_VEC 1B 27 IO_AY0_ADDR =40 64 IO_AY0_DATA =41 65 IO_AY1_ADDR =42 66 IO_AY1_DATA =43 67 IO_REG0 =20 32 IO_RTC_AMPM =25 37 IO_RTC_CTR_D =2D 45 IO_RTC_CTR_E =2E 46 IO_RTC_CTR_F =2F 47 IO_RTC_DAY0 =26 38 IO_RTC_DAY1 =27 39 IO_RTC_HOUR =24 36 IO_RTC_MIN0 =22 34 IO_RTC_MIN1 =23 35 IO_RTC_MON0 =28 40 IO_RTC_MON1 =29 41 IO_RTC_SEC0 =20 32 IO_RTC_SEC1 =21 33 IO_RTC_WEEK =2C 44 IO_RTC_YEAR1 =2B 43 IO_RTC_YERR0 =2A 42 MEM_FAT_AMOUNT 44B8 17592 MEM_FAT_CLUSTERLEN 44BB 17595 MEM_FAT_COUNT1 44BC 17596 MEM_FAT_CURDIR 44DF 17631 MEM_FAT_CURRDIR 453F 17727 MEM_FAT_DATASTART 44C1 17601 MEM_FAT_DIRSEC 44CD 17613 MEM_FAT_EXEC_COUNT 4545 17733 MEM_FAT_EXEC_CURR 4543 17731 MEM_FAT_EXEC_START 4547 17735 MEM_FAT_FILEREMAIN 44C9 17609 MEM_FAT_OF0_ATTRIBUTE 452F 17711 MEM_FAT_OF0_CCLUST 4531 17713 MEM_FAT_OF0_DATREM 453B 17723 MEM_FAT_OF0_DATSEC 4537 17719 MEM_FAT_OF0_FATSEC 4533 17715 MEM_FAT_RESERVED 44B6 17590 MEM_FAT_ROOTSTART 44C5 17605 MEM_FAT_SECTORS 44B9 17593 MEM_FAT_TMPFNAME 44CF 17615 MEM_FAT_TMPPOINTER 44BD 17597 MEM_IDE_BUFFER 42B6 17078 MEM_IDE_DEVICE 41CB 16843 MEM_IDE_DEV_TABLE 41D5 16853 MEM_IDE_FSBUFFER 44B6 17590 MEM_IDE_PARTITION 41CD 16845 MEM_IDE_POINTER 41D1 16849 MEM_IDE_SELECTED 4215 16917 MEM_IDE_STATUS 41CC 16844 MEM_IDE_STRING_0 4216 16918 MEM_IDE_STRING_1 423E 16958 MEM_IDE_STRING_2 4266 16998 MEM_IDE_STRING_3 428E 17038 MSG_CLEAR 1B6 438 NOT_IMPLEMENTED 19F5 6645 OP_CALL 1A57 6743 OP_CD 1E27 7719 OP_CLR 1BEB 7147 OP_DASM 1AD8 6872 OP_DIR 1E23 7715 OP_DUMP 1A77 6775 OP_EXEC 1A3E 6718 OP_FSEXEC 1E44 7748 OP_IIC_IN 1B9F 7071 OP_IIC_OUT 1B3F 6975 OP_IO_IN 1B08 6920 OP_IO_OUT 1B1E 6942 OP_LSDSK 1E00 7680 OP_RTIME 1BEF 7151 OP_SELDSK 1E04 7684 OP_SET 1AA7 6823 OP_STIME 1D87 7559 POST_CHECK_APU 1E7D 7805 POST_CHECK_IDE_30 1EA8 7848 POST_CHECK_IDE_40 1EBB 7867 POST_CHECK_PIO 1E58 7768 POST_START 1E48 7752 POST_TEST_RTC 1ED5 7893 PRG_RAM_START =4110 16656 PRG_RAM_TOP =FF00 65280 PRINTINLINE 1D0 464 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 26C 620 STRCONV_BYTES_TO_HEX_1 27B 635 STRCONV_BYTES_TO_HEX_2 285 645 STR_Banner_Start 2689 9865 STR_PD_HEADER 186B 6251 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 19F4 6644 _OP_CALL 1A76 6774 _OP_IIC_ACK_ERR 1B84 7044 _OP_IIC_ACK_ERR_str 1B8B 7051 _OP_IIC_IN_LOOP 1BD1 7121 _OP_IIC_IN_LOOP_TEXT 1BDE 7134 _OP_IIC_OUT_LOOP 1B55 6997 _OP_IIC_OUT_SEND 1B71 7025 _OP_RTIME_NN 1BF2 7154 _OP_RTIME_RD_CMD 1CAA 7338 _OP_SELDSK_INVALID 1E13 7699 _OP_SELDSK_INVALID_STR 1E2B 7723 _OP_SET_LOOP 1ABF 6847 _OP_STIME_INVALID 1D4D 7501 _OP_STIME_PROMPT 1D64 7524 _OP_STIME_PROMPT_ERR 1D7C 7548 _OP_STIME_STR_DAY 1CAB 7339 _OP_STIME_STR_HOUR 1CFC 7420 _OP_STIME_STR_MIN 1D17 7447 _OP_STIME_STR_MON 1CC6 7366 _OP_STIME_STR_SEC 1D32 7474 _OP_STIME_STR_YEAR 1CE1 7393 _POST_CHECK_APU_FAILED 1E9C 7836 _POST_CHECK_IDE_FAILED 1ECE 7886 _POST_CHECK_PIO_FAILED 1E71 7793 _POST_TEST_RTC_INVALID 1F0F 7951 _POST_TEST_RTC_NOTFOUND 1F08 7944 _STR_NOT_FOUND 1A17 6679 _STR_NOT_IMPLEMENTED 1A03 6659 _STR_SYNTAX 1A2B 6699 _beep_pause_l1 E01 3585 _compare_filename_loop 234A 9034 _compare_filename_nomatch 2358 9048 _fat_cd_navigate 24FF 9471 _fat_cd_navigate_end 2545 9541 _fat_cd_navigate_errfile 256D 9581 _fat_cd_navigate_errfile_str 259F 9631 _fat_cd_navigate_error 2557 9559 _fat_cd_navigate_error_str 2575 9589 _fat_cd_navigate_findsec 2504 9476 _fat_cd_navigate_findsec_skipslash 2530 9520 _fat_cd_navigate_goback_fl 24BB 9403 _fat_cd_navigate_inerror 2565 9573 _fat_cd_navigate_inerrorS 255F 9567 _fat_cd_navigate_inerrore 2566 9574 _fat_cd_navigate_inputerr_str 258C 9612 _fat_cd_navigate_l2 2536 9526 _fat_exec_notexec 2665 9829 _fat_exec_notfound 264C 9804 _fat_exec_read_done 2634 9780 _fat_exec_readloop1 2616 9750 _fat_get_root_table_invalid 213A 8506 _fat_getfatsec_notroot 2179 8569 _fat_increment_32 22D0 8912 _fat_lfs_loop 2246 8774 _fat_lfs_loop_compare_end 2282 8834 _fat_lfs_loop_compare_match 2286 8838 _fat_lfs_loop_compare_next_sector 2258 8792 _fat_math_add32 22E4 8932 _fat_math_mul32 2315 8981 _fat_math_mul32_l 231C 8988 _fat_math_mul32_noadd 2329 9001 _fat_math_sector_add_16 22BC 8892 _fat_print_directory_dir 243A 9274 _fat_print_directory_loop 23CD 9165 _fat_print_directory_loop_break 2499 9369 _fat_print_directory_loop_file 23E9 9193 _fat_print_directory_loop_next 2465 9317 _fat_print_directory_loop_next_sector 2470 9328 _format_filename_fat16_clean 2361 9057 _format_filename_fat16_loop 2368 9064 _format_filename_fat16_loop_copy 237B 9083 _format_filename_fat16_loop_skip_8 2372 9074 _ide_readsector_512_floop E5D 3677 _ideif_drv_sel_fail 15D2 5586 _ideif_drv_sel_fstr0 168F 5775 _ideif_drv_sel_pstr 1686 5766 _ideif_drv_sel_sstr0 169D 5789 _ideif_drv_sel_syn 16AA 5802 _ideif_init_drive_charloop 1499 5273 _ideif_init_drive_found 147B 5243 _ideif_init_drive_loop 1463 5219 _ideif_init_drive_nodrv 1476 5238 _ideif_init_drive_prt_fnd 14F7 5367 _ideif_init_drive_prt_l1 14E5 5349 _ideif_init_drive_prt_ln 14EF 5359 _ideif_prnt_devtable_hdr 1612 5650 _ideif_prnt_devtable_l1 1373 4979 _ideif_prnt_devtable_l1_e2 1439 5177 _ideif_prnt_devtable_l1_es 13B8 5048 _ideif_prnt_devtable_l1_ms 1436 5174 _ideif_prnt_devtable_l1_nxt 1380 4992 _ideif_prnt_devtable_l1_s00 13A6 5030 _ideif_prnt_devtable_l1_s01 13AB 5035 _ideif_prnt_devtable_l1_s02 13B0 5040 _ideif_prnt_devtable_l1_sFF 13B5 5045 _ideif_prnt_devtable_l1_sel 137E 4990 _ideif_prnt_devtable_master 1676 5750 _ideif_prnt_devtable_s00 164A 5706 _ideif_prnt_devtable_s01 1655 5717 _ideif_prnt_devtable_s02 1660 5728 _ideif_prnt_devtable_sFF 166B 5739 _ideif_prnt_devtable_slave 167E 5758 _read_bcd_invalid 18D 397 _shift4 1DFB 7675 beep DE8 3560 beep_loop DEA 3562 beep_pause E00 3584 compare_filename 2346 9030 dasm_00 9ED 2541 dasm_01 CD9 3289 dasm_02 A73 2675 dasm_03 CAB 3243 dasm_08 AF0 2800 dasm_09 C7E 3198 dasm_0A A55 2645 dasm_0B CC2 3266 dasm_10 A35 2613 dasm_12 A7E 2686 dasm_18 9F8 2552 dasm_1A A5F 2655 dasm_20 A12 2578 dasm_22 D1F 3359 dasm_27 AB8 2744 dasm_28 A0B 2571 dasm_2A CF0 3312 dasm_2F ABC 2748 dasm_30 A03 2563 dasm_32 A89 2697 dasm_37 AC8 2760 dasm_38 9FC 2556 dasm_3A A69 2665 dasm_3F AC4 2756 dasm_76 ACC 2764 dasm_80C6 B49 2889 dasm_BE AE6 2790 dasm_C3 9F1 2545 dasm_C88E B6F 2927 dasm_C9 A41 2625 dasm_CD A3B 2619 dasm_D9 AFD 2813 dasm_DD A23 2595 dasm_DD_01 CE0 3296 dasm_DD_09 C99 3225 dasm_DD_22 D35 3381 dasm_DD_23 CB0 3248 dasm_DD_2A D07 3335 dasm_DD_2B CC7 3271 dasm_DD_34 C49 3145 dasm_DD_35 C66 3174 dasm_DD_86 B51 2897 dasm_DD_8E B77 2935 dasm_DD_96 B9A 2970 dasm_DD_9E BBA 3002 dasm_DD_A6 BDB 3035 dasm_DD_AE C12 3090 dasm_DD_B6 BF7 3063 dasm_DD_BE C2E 3118 dasm_DD_E1 D87 3463 dasm_DD_E3 B0D 2829 dasm_DD_E5 D71 3441 dasm_DD_F9 D57 3415 dasm_E1 D81 3457 dasm_E3 B01 2817 dasm_E5 D6B 3435 dasm_E9 A1A 2586 dasm_ED_42 C90 3216 dasm_ED_43 D2B 3371 dasm_ED_44 AC0 2752 dasm_ED_45 A4B 2635 dasm_ED_46 AD7 2775 dasm_ED_4A C87 3207 dasm_ED_4B CFC 3324 dasm_ED_4D A46 2630 dasm_ED_56 ADC 2780 dasm_ED_5E AE1 2785 dasm_ED_A0 B25 2853 dasm_ED_A1 B37 2871 dasm_ED_A8 B2E 2862 dasm_ED_A9 B40 2880 dasm_ED_B0 B29 2857 dasm_ED_B1 B3B 2875 dasm_ED_B8 B32 2866 dasm_ED_B9 B44 2884 dasm_F3 AD1 2769 dasm_F9 D4D 3405 dasm_FB AD4 2772 dasm_FD A2C 2604 dasm_FD_01 CE8 3304 dasm_FD_09 CA2 3234 dasm_FD_22 D41 3393 dasm_FD_23 CB9 3257 dasm_FD_2A D13 3347 dasm_FD_2B CD0 3280 dasm_FD_34 C55 3157 dasm_FD_35 C72 3186 dasm_FD_86 B60 2912 dasm_FD_8E B86 2950 dasm_FD_96 BA6 2982 dasm_FD_9E BC8 3016 dasm_FD_A6 BE7 3047 dasm_FD_AE C1E 3102 dasm_FD_B6 C02 3074 dasm_FD_BE C39 3129 dasm_FD_E1 D8F 3471 dasm_FD_E3 B19 2841 dasm_FD_E5 D79 3449 dasm_FD_F9 D61 3425 dasm_FF A50 2640 dasm_UU D97 3479 dasm_UW D9B 3483 dasm__AND BD6 3030 dasm__CP C2A 3114 dasm__DEC C61 3169 dasm__ED_47 AA8 2728 dasm__ED_4F AB0 2736 dasm__ED_57 A98 2712 dasm__ED_5F AA0 2720 dasm__INC C44 3140 dasm__LD A94 2708 dasm__OR BF3 3059 dasm__SBC BB2 2994 dasm__SUB B95 2965 dasm__XOR C0D 3085 dasm_opcode_table 595 1429 dasm_print16hex_addr 3C2 962 dasm_print8hex 3DA 986 dasm_printFlags_table DA0 3488 dasm_printRegister8_table DB0 3504 dasm_printRegister8_table_HL DD0 3536 dasm_printRegisterIX_table DB8 3512 dasm_printRegisterIY_table DC0 3520 dasm_printRegisterSP_table DC8 3528 disassemble 286 646 disassemble_continue 36C 876 disassemble_err 35C 860 disassemble_next 28A 650 disassemble_print_opcode_params_end 359 857 disassemble_print_opcode_params_loop 305 773 disassemble_print_opcode_raw 2C7 711 disassemble_print_opcode_raw_fill 2DB 731 disassemble_table_first_match 39E 926 disassemble_table_found 3B8 952 disassemble_table_notfound 3BC 956 disassemble_table_seek 37A 890 disassemble_table_seek_loop 37E 894 dump_pretty 1810 6160 dump_pretty_ascii 183A 6202 dump_pretty_ascii_cont 1858 6232 dump_pretty_ascii_loop 1842 6210 dump_pretty_ascii_none 1853 6227 dump_pretty_col 182D 6189 dump_pretty_end 186A 6250 dump_pretty_nextrow 185E 6238 dump_pretty_row 1818 6168 endPrint 1DE 478 fat_cd_single 249B 9371 fat_copy_lba_pointer 233D 9021 fat_exec 25B6 9654 fat_get_root_table 206D 8301 fat_getfatsec 2162 8546 fat_openfile 2217 8727 fat_openfile_noprepare 221F 8735 fat_print_directory 2382 9090 fat_readfilesec 21EA 8682 fat_reset_pointer 232E 9006 format_filename_fat16 235C 9052 ide_printerror E94 3732 ide_readsector_512_fast E49 3657 ide_readsector_timeout E7E 3710 ide_regread_8 E33 3635 ide_regwrite_8 E19 3609 ide_reset E0D 3597 ide_writesector_256 E93 3731 ideif_drv_sel 159A 5530 ideif_get_drv_pointer 153A 5434 ideif_init_all 154E 5454 ideif_init_devtable 1347 4935 ideif_init_drive 145A 5210 ideif_prnt_devtable 1365 4965 iic_init 171C 5916 iic_read_ack 1763 5987 iic_receive_buffer 16ED 5869 iic_receive_buffer_done 1710 5904 iic_receive_buffer_err 1716 5910 iic_receive_buffer_loop 16FE 5886 iic_receive_byte 17E9 6121 iic_receive_byte_loop 17F6 6134 iic_send_ack 1789 6025 iic_send_buffer 16C3 5827 iic_send_buffer_done 16E1 5857 iic_send_buffer_err 16E7 5863 iic_send_buffer_loop 16D3 5843 iic_send_byte 17C3 6083 iic_send_byte_loop 17CF 6095 iic_send_ebit 1742 5954 iic_send_nack 17A6 6054 iic_send_sbit 1729 5929 interrupt_vectors 4000 16384 mon_var_template 44 68 mon_var_template_end 50F 1295 nxtILC 1D3 467 param_01 3E8 1000 param_02 40F 1039 param_03 42C 1068 param_03_done 464 1124 param_03_neg 44D 1101 param_04 468 1128 param_04_i 478 1144 param_05 47E 1150 param_06 48B 1163 param_07 4A5 1189 param_08 4B2 1202 param_09 4C7 1223 param_09_0A 4CD 1229 param_0A 4BE 1214 param_10 4DC 1244 param_11 4EC 1260 param_11_12 4FB 1275 param_11_12_all 51B 1307 param_11_12_def 50E 1294 param_11_12_ix 513 1299 param_11_12_iy 518 1304 param_12 4F4 1268 param_13 52C 1324 param_80 54B 1355 param_80_seek 552 1362 param_81 542 1346 param_comma 586 1414 param_printRegister 561 1377 param_printRegisterA 57F 1407 param_printRegisterHL 577 1399 print_16_hex 1A9 425 print_32_hex 190 400 print_a_hex 143 323 print_bcd 155 341 print_char 115 277 print_clear 126 294 print_newLine 12D 301 print_reg 1E3 483 print_str 11D 285 print_str_fixed 18AA 6314 print_wait_out 138 312 read_bcd 177 375 read_char 15B 347 read_in_sts 16D 365 read_lba_sector 1561 5473 str_dev_done 160A 5642 str_dev_waitready 15F2 5618 str_error_start EC9 3785 str_error_start1 EE6 3814 str_error_start2 EEF 3823 str_error_time EF8 3832 str_post_apu 1F67 8039 str_post_ide_30 1F16 7958 str_post_ide_40 1F31 7985 str_post_nd 1F9D 8093 str_post_ok 1FD5 8149 str_post_pio 1F4C 8012 str_post_rtc 1F82 8066 str_post_rtc_iv 1FAB 8107 var_apu_present 410A 16650 var_buffer_len 4100 16640 var_bytes_count=411A 16666 var_curserchar 4106 16646 var_curserlastaddr 4107 16647 var_curseron 4105 16645 var_curserstate 4104 16644 var_curserx 4102 16642 var_cursery 4103 16643 var_dir 412B 16683 var_idebuffer 41CB 16843 var_input 417B 16763 var_last_char 4101 16641 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 4109 16649 var_ps2mem 411B 16667 var_scratch 410B 16651