progress on FAT16 support

This commit is contained in:
Dennis Gunia
2024-01-12 13:29:20 +01:00
parent ee2f22df09
commit 507eb3a017
40 changed files with 19699 additions and 6346 deletions

View File

@@ -45,3 +45,6 @@ CS_PIO_BD .EQU 0xF5
CS_PIO_BC .EQU 0xF7
CS_PIO_AD .EQU 0xF4
CS_PIO_AC .EQU 0xF6
CS_APU_DATA .EQU 0xF8
CS_APU_CTRL .EQU 0xF9

View File

@@ -6,33 +6,32 @@
;------------------------------------------------------------------------------
beep:
push AF
push BC
push DE
beep_loop:
LD A,0x08
OUT (CS_PIO_AD), A
LD BC, 0x28
CALL beep_pause
LD A,0x00
OUT (CS_PIO_AD), A
LD BC, 0x24
CALL beep_pause
DEC DE
ld A,D
or E
jr NZ, beep_loop
pop de
pop bc
pop af
ret
beep_pause:
NEG ; 8 T-states
NEG ; 8 T-states
PUSH BC
_beep_pause_l1:
;NEG ; 8 T-states
;NEG ; 8 T-states
NEG ; 8 T-states
NEG ; 8 T-states
DEC BC ; 6 T-states
LD A,C ; 9 T-states
OR B ; 4 T-states
JP NZ,beep_pause ; 10 T-states
JP NZ,_beep_pause_l1 ; 10 T-states
POP BC
RET ; Pause complete, RETurn

View File

@@ -0,0 +1,201 @@
ADDR_RTC .equ 0xD0
OP_RTIME:
call print_newLine
_OP_RTIME_NN:
;set pointer
ld hl,[_OP_RTIME_RD_CMD]
ld b, 1
ld c, ADDR_RTC
call iic_send_buffer
or a
jp nz, _OP_IIC_ACK_ERR
;read RTC data
ld hl,[var_scratch]
ld b,8
ld c, ADDR_RTC
call iic_receive_buffer
or a
jp nz, _OP_IIC_ACK_ERR
;process display hours
ld a,(var_scratch+2)
and 00110000b
RRA
RRA
RRA
RRA
call print_bcd
ld a,(var_scratch+2)
and 00001111b
call print_bcd
ld a,':'
call print_char
;display minutes
ld a,(var_scratch+1)
and 01110000b
RRA
RRA
RRA
RRA
call print_bcd
ld a,(var_scratch+1)
and 00001111b
call print_bcd
ld a,':'
call print_char
;display seconds
ld a,(var_scratch+0)
and 01110000b
RRA
RRA
RRA
RRA
call print_bcd
ld a,(var_scratch+0)
and 00001111b
call print_bcd
ld a,' '
call print_char
;display date
ld a,(var_scratch+4)
and 00110000b
RRA
RRA
RRA
RRA
call print_bcd
ld a,(var_scratch+4)
and 00001111b
call print_bcd
ld a,'.'
call print_char
ld a,(var_scratch+5)
and 00010000b
RRA
RRA
RRA
RRA
call print_bcd
ld a,(var_scratch+5)
and 00001111b
call print_bcd
ld a,'.'
call print_char
ld a,'2'
call print_char
ld a,'0'
call print_char
ld a,(var_scratch+6)
and 11110000b
RRA
RRA
RRA
RRA
call print_bcd
ld a,(var_scratch+6)
and 00001111b
call print_bcd
RET
_OP_RTIME_RD_CMD:
db 0x00
_OP_STIME_STR_DAY: db 10,13,"Enter Date (00-31) : ",0
_OP_STIME_STR_MON: db 10,13,"Enter Month (00-12) : ",0
_OP_STIME_STR_YEAR: db 10,13,"Enter Year (00-99) : ",0
_OP_STIME_STR_HOUR: db 10,13,"Enter Hours (00-23) : ",0
_OP_STIME_STR_MIN: db 10,13,"Enter Minutes (00-59) : ",0
_OP_STIME_STR_SEC: db 10,13,"Enter Seconds (00-59) : ",0
_OP_STIME_INVALID: db " invaild input. Retry!",0
;HL contains pointer to stack
;BC returns value (BCD)
_OP_STIME_PROMPT:
push hl
call print_str
pop hl
call read_bcd
cp 0xFF ;if failed
jp Z, _OP_STIME_PROMPT_ERR
ld b,a
call read_bcd
cp 0xFF ;if failed
jp Z, _OP_STIME_PROMPT_ERR
ld c,a
ret
_OP_STIME_PROMPT_ERR:
push HL
ld hl, [_OP_STIME_INVALID]
call print_str
pop hl
jp _OP_STIME_PROMPT
OP_STIME:
xor a
ld (var_scratch),a ;set pointer
;date
ld hl, [_OP_STIME_STR_DAY]
call _OP_STIME_PROMPT
ld a,b
call _shift4
and 00110000b ;mask bits; bit6 low -> 24h mode
or c ;add second digit
ld (var_scratch+5),a
;month
ld hl, [_OP_STIME_STR_MON]
call _OP_STIME_PROMPT
ld a,b
call _shift4
and 00010000b ;mask bits; bit6 low -> 24h mode
or c ;add second digit
ld (var_scratch+6),a
;year
ld hl, [_OP_STIME_STR_YEAR]
call _OP_STIME_PROMPT
ld a,b
call _shift4
and 11110000b ;mask bits; bit6 low -> 24h mode
or c ;add second digit
ld (var_scratch+7),a
;hours
ld hl, [_OP_STIME_STR_HOUR]
call _OP_STIME_PROMPT
ld a,b
call _shift4
and 00110000b ;mask bits; bit6 low -> 24h mode
or c ;add second digit
ld (var_scratch+3),a
; minutes
ld hl, [_OP_STIME_STR_MIN]
call _OP_STIME_PROMPT
ld a,b
call _shift4
and 01110000b ;mask bits
or c ;add second digit
ld (var_scratch+2),a
; seconds
ld hl, [_OP_STIME_STR_SEC]
call _OP_STIME_PROMPT
ld a,b
call _shift4
and 01110000b ;mask bits / bit6 low -> 24h mode (enable clock)
or c ;add second digit
ld (var_scratch+1),a
inc de ;next
ld c, ADDR_RTC
ld b, 8
ld hl,[var_scratch]
call iic_send_buffer
or a
jp nz, _OP_IIC_ACK_ERR
ret
_shift4:
RLCA
RLCA
RLCA
RLCA
ret

View File

@@ -0,0 +1,26 @@
OP_LSDSK:
call ideif_prnt_devtable
ret
OP_SELDSK:
;DE contains pointer
push de
pop hl
ld a,(hl)
sbc 69
jr c,_OP_SELDSK_INVALID
cp 4
jr nc, _OP_SELDSK_INVALID
call 0x8000
ret
_OP_SELDSK_INVALID:
ld hl,[_OP_SELDSK_INVALID_STR]
call print_str
LD DE,0x20
LD BC,0x70
CALL beep
ret
_OP_SELDSK_INVALID_STR:
db 10,13,"Invalid drive letter",10,13,0

View File

@@ -0,0 +1,130 @@
OP_IO_IN:
push DE
pop HL
call DHEX_TO_BYTE
ld c,a ;store result in b
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
in a,(c)
push af
call print_newLine
pop af
call print_a_hex
ret
OP_IO_OUT:
push DE
pop HL
call DHEX_TO_BYTE
ld c,a ;store result in b
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
inc hl
inc hl
ld a,(hl)
cp ' '
jp nz, ERR_SYNTAX
inc hl
call DHEX_TO_BYTE
push af
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
pop af
out (c),a
ret
OP_IIC_OUT:
push DE
pop HL
call DHEX_TO_BYTE ;load start addr
ld (var_scratch+1),A ;store result in ram
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
inc hl
inc hl
LD BC,[var_scratch + 2]
XOR A
LD (var_scratch),A
_OP_IIC_OUT_LOOP:
ld a,(hl)
cp 0 ;if 0 then end
jp z,_OP_IIC_OUT_SEND
cp ' '
jp nz, ERR_SYNTAX
inc hl ;next byte
call DHEX_TO_BYTE
ld (bc),a
inc bc ;incerement pointer
ld a,(var_scratch)
inc a ;increment counter
ld (var_scratch),a
inc HL
inc HL
jr _OP_IIC_OUT_LOOP
_OP_IIC_OUT_SEND:
ld hl,[var_scratch + 2]
ld a,(var_scratch) ;load amount of bytes
ld b,a
ld a,(var_scratch+1) ;load start addr
ld c,a
call iic_send_buffer
or a
jp nz, _OP_IIC_ACK_ERR
ret
_OP_IIC_ACK_ERR:
LD HL,[_OP_IIC_ACK_ERR_str]
call print_str
ret
_OP_IIC_ACK_ERR_str:
db 10,13,"bus-error: no ACK",0
OP_IIC_IN:
push DE
pop HL
call DHEX_TO_BYTE ;load start addr
ld C,a ;store start addr to B
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
inc hl
inc hl
ld a,(hl)
cp ' '
jp nz, ERR_SYNTAX
inc hl
call DHEX_TO_BYTE ;read length
ld b,a ;store length in B
push bc
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
ld hl,[var_scratch]
call iic_receive_buffer
pop bc
or a
jp nz, _OP_IIC_ACK_ERR
ld hl,[_OP_IIC_IN_LOOP_TEXT]
call print_str
ld hl,[var_scratch]
;print data
_OP_IIC_IN_LOOP:
ld a,(hl)
call print_a_hex
ld a, ' '
call print_char
inc hl
djnz _OP_IIC_IN_LOOP
ret
_OP_IIC_IN_LOOP_TEXT:
db 10,13,"rec-buff: ",0
OP_CLR:
call print_clear
ret

View File

@@ -0,0 +1,148 @@
OP_EXEC:
;DE contains pointer
push DE
pop HL
call DHEX_TO_BYTE
ld b,a ;store result in b
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
inc HL
inc HL
call DHEX_TO_BYTE
ld c,a
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
ld h,b
ld l,c
jp (hl)
OP_CALL:
;DE contains pointer
push DE
pop HL
call DHEX_TO_BYTE
ld b,a ;store result in b
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
inc HL
inc HL
call DHEX_TO_BYTE
ld c,a
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
ld h,b
ld l,c
call _OP_CALL
call print_newLine
ret
_OP_CALL
jp (hl)
OP_DUMP:
;DE contains pointer
push DE
pop HL
call DHEX_TO_BYTE ;parse start address
ld b,a ;store result in b
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
inc HL
inc HL
call DHEX_TO_BYTE
ld c,a
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
inc HL
inc HL
ld a,(HL)
cp ' '
jp nz, ERR_SYNTAX
inc HL
call DHEX_TO_BYTE
push af
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
pop af
ld h,b
ld l,c
ld b,a
call dump_pretty
ret
OP_SET:
;DE contains pointer
push DE
pop HL
call DHEX_TO_BYTE ;parse start address
ld b,a ;store result in b
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
inc HL
inc HL
call DHEX_TO_BYTE
ld c,a
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
;bc now contains the start address
INC HL
INC HL
;hl now cointains start addr of data bytes
_OP_SET_LOOP:
ld a,(hl)
cp 0 ;if 0 then end
RET Z
cp ' '
jp nz, ERR_SYNTAX
inc hl ;next byte
call DHEX_TO_BYTE
ld (bc),a ;load byte to
ld a,e
and a
jp nz, ERR_SYNTAX
inc bc
inc hl
inc hl
jp _OP_SET_LOOP
OP_DASM:
push DE
pop HL
call DHEX_TO_BYTE
ld b,a ;store result in b
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
inc hl
inc hl
call DHEX_TO_BYTE
ld c,a
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
inc hl
inc hl
ld a,(HL)
cp ' '
jp nz, ERR_SYNTAX
inc hl
call DHEX_TO_BYTE
push af
ld a,e ;check for error
and a
jp nz, ERR_SYNTAX
ld h,b
ld l,c
pop af ;restore af
ld b,a
call disassemble
ret

View File

@@ -0,0 +1,165 @@
COMMAND_LUT:
db "date", 0 , [OP_RTIME], [OP_RTIME]>>8 ;Read time
db "setdate", 0 , [OP_STIME], [OP_STIME]>>8 ;Read time
db "pin ", 0 , [OP_IO_IN], [OP_IO_IN]>>8 ;Read port
db "dump ",0, [OP_DUMP], [OP_DUMP]>>8 ;print pretty hexdump
db "pout ", 0 , [OP_IO_OUT], [OP_IO_OUT]>>8 ;Write port
db "iin ", 0, [OP_IIC_IN], [OP_IIC_IN]>>8 ;Read IIC
db "iout ", 0, [OP_IIC_OUT], [OP_IIC_OUT]>>8 ;Write IIC
db "call ", 0, [OP_CALL], [OP_CALL]>>8 ;Call to addr
db "clr", 0, [OP_CLR], [OP_CLR]>>8 ;Call to addr
db "dasm ", 0, [OP_DASM], [OP_DASM]>>8 ;Call to addr
db "jp ", 0,[OP_EXEC], [OP_EXEC]>>8 ;jump to addr
db "rst", 0,0x00,0x00 ;soft reset
db "lsdsk", 0,[OP_LSDSK], [OP_LSDSK]>>8 ;list disks
db "seldsk ", 0,[OP_SELDSK], [OP_SELDSK]>>8 ;select disk
db "$", 0, [OP_EXEC], [OP_EXEC]>>8 ;jump to addr
db "i", 0, [OP_IO_IN], [OP_IO_IN]>>8 ;Read port
db "o", 0, [OP_IO_OUT], [OP_IO_OUT]>>8 ;Write port
db "!", 0, [OP_SET], [OP_SET]>>8 ;Write memory
db "?", 0, [OP_DUMP], [OP_DUMP]>>8 ;Print memory
db 0xFF ;End of Table
IN_BUFFER .equ var_buffer
COMMAND:
call print_newLine
ld a,'>'
call print_char
xor a ;reset buffer len
ld (var_buffer_len),a
COMMAND_READ:
call read_char
jp z, COMMAND_READ ;wait for input
cp 13 ; enter
jp z,COMMAND_PROCESS
cp 10
jp z, COMMAND_READ; skip LF for file load
cp 0x08 ; backspace 0x08 VT102 0x7f Putty
jp z,COMMAND_BACKSPACE
push af
; a contains latest char
ld hl,[var_buffer]
ld d,0
ld a,(var_buffer_len)
ld e,a
add hl,de ;hl now contains pointer to last position in buffer
inc a
ld (var_buffer_len),a ;store incremented buffer length
pop af
ld (hl),a
call print_char
inc hl
xor a ;a = 0
ld (hl),a ;always add null termination after last char
jp COMMAND_READ
COMMAND_BACKSPACE:
ld a,(var_buffer_len)
and a
jp z, COMMAND_READ ; do not continue if already at char 0
dec a ;decrement length
ld (var_buffer_len),a ;and store it
ld e,a ;load de with decremented value
ld d,0
ld hl,[var_buffer]
add hl,de ;hl now contains pointer to last position in buffer
xor a ; store null byte to current location
ld (hl),a
;call print_delete
ld a, 0x08
call print_char
ld a, 0x20
call print_char
ld a, 0x08
call print_char
jp COMMAND_READ
COMMAND_PROCESS:
;compare
LD HL,[COMMAND_LUT] ;Lookup table
COMMAND_PROCESS_LOOP:
LD DE,[var_buffer] ;Buffer
LD A,(HL) ;Load first byte of entry
CP 0xFF
JP Z,COMMAND_PROCESS_NOT_FOUND ;if first byte is 0xFF, End is reached
; compare string loop
COMMAND_PROCESS_LOOP_STR1:
LD A,(DE)
LD B,A
LD A,(HL)
OR B ;not 0 -> match
JP Z, COMMAND_PROCESS_FOUND ;match
LD A,(DE)
LD B,A
;LD A,(HL) ;Load first byte of entry
;call print_a_hex
LD A,(HL)
;compare byte
XOR B
OR A ;if identical = resoult shopuld be zero
JP Z, COMMAND_PROCESS_LOOP_STR2 ;then continue
; if not identical
LD A,(HL)
OR A ;if reached end of compare string
JP Z, COMMAND_PROCESS_FOUND ;match
JR COMMAND_PROCESS_NEXT_ENTRY ;next entry on no match
COMMAND_PROCESS_LOOP_STR2: ;continue with next char
INC HL
INC DE
JR COMMAND_PROCESS_LOOP_STR1
COMMAND_PROCESS_NEXT_ENTRYI: ;do not jump here
INC HL
COMMAND_PROCESS_NEXT_ENTRY: ;jump here
LD A,(HL)
OR A
JP NZ,COMMAND_PROCESS_NEXT_ENTRYI ;loop until end of string
INC HL ;skip pointer
INC HL
INC HL
JP COMMAND_PROCESS_LOOP
COMMAND_PROCESS_NOT_FOUND:
LD HL,[_STR_NOT_FOUND]
CALL print_str
JP COMMAND
COMMAND_PROCESS_FOUND:
PUSH HL
POP BC
INC BC
LD A,(BC)
LD L,A
INC BC
LD A,(BC)
LD H,A
;HL: pointer to start of routine
;DE: buffer start of arguments
CALL _COMMAND_PROCESS_FOUND
JP COMMAND
_COMMAND_PROCESS_FOUND
JP (HL)
NOT_IMPLEMENTED:
LD HL,[_STR_NOT_IMPLEMENTED]
CALL print_str
RET
ERR_SYNTAX:
LD HL,[_STR_SYNTAX]
CALL print_str
RET
_STR_NOT_IMPLEMENTED:
db 10,13,"not implemented",10,13,0
_STR_NOT_FOUND:
db 10,13,"invalid command",10,13,0
_STR_SYNTAX:
db 10,13,"invalid syntax",10,13,0

View File

@@ -99,6 +99,12 @@ print_a_hex:
pop de
pop bc
pop af
ret
print_bcd:
ADD 48 ;offset for ascii number
call print_char
ret
read_char:
call A_RTS_ON
@@ -112,6 +118,21 @@ read_char:
in a, (CS_SIO_A_D) ; read char if avail
ret ; return
read_bcd;
call read_char
jp z, read_bcd
call print_char
sbc 48 ;remove ascii offset
jp c, _read_bcd_invalid ;if carry, wrong input
cp 10
jp z, _read_bcd_invalid ;if equal or greater than 10, also error
and 0x0F ;mask unused bits
ret
_read_bcd_invalid
ld a, 0xFF
ret
;MSG_CRSR_0:
; db 0x1B, "[?25h",0
;MSG_CRSR_1:

View File

@@ -32,6 +32,11 @@
IDE_REG_ALTSTS .EQU 10110b ;Alternate Status/Digital Output
IDE_REG_DRVADDR .EQU 10111b ;Drive Address
IDE_REG_LBA0 .EQU 01011b ;Start sector register
IDE_REG_LBA1 .EQU 01100b ;Low byte of the cylinder number
IDE_REG_LBA2 .EQU 01101b ;High two bits of the cylinder number
IDE_REG_LBA3 .EQU 01110b ;Head and device select register
;================================================================
; I/O access functions

View File

@@ -12,73 +12,378 @@
;================================================================
; IDE Variables
;================================================================
MEM_IDE_BASE .EQU 0x5000
MEM_IDE_DEVICE .EQU MEM_IDE_BASE
MEM_IDE_STATUS .EQU MEM_IDE_BASE + 1 ;1Byte: 0x00 if status is okay
phase var_idebuffer
MEM_IDE_DEVICE:
defs 1
MEM_IDE_STATUS:
defs 1 ;1Byte: 0x00 if status is okay
MEM_IDE_PARTITION:
defs 4 ;4*16Bytes: LBA first sector
MEM_IDE_POINTER:
defs 4 ;4*16Bytes: LBA first sector
MEM_IDE_DEV_TABLE:
defs 16*4
MEM_IDE_SELECTED:
defs 1
MEM_IDE_STRING_0:
defs 40
MEM_IDE_STRING_1:
defs 40
MEM_IDE_STRING_2:
defs 40
MEM_IDE_STRING_3:
defs 40
MEM_IDE_BUFFER:
defs 512
MEM_IDE_FSBUFFER:
defs 256
dephase
;DEV-Table layout
;<STATUS> <TYPE> <FIRST-SECTOR (4-byte)> <Length (4-byte)> <I/O Addr> <Master/Slave> 0x00 0x00
;Status: 0x00 -> Ready
; 0x01 -> Not found
; 0x02 -> No supported filesystem
;I/O Addr: Base addr of 82C55
;Type: File system type
MEM_IDE_PARTITION .EQU MEM_IDE_BASE + 2 ;4*16Bytes: LBA first sector
MEM_IDE_POINTER .EQU MEM_IDE_BASE + 6 ;4*16Bytes: LBA first sector
MEM_IDE_BUFFER .EQU MEM_IDE_BASE + 65 ;512Byte: buffer for read/write data
IDE_DEV_TABLE:
db 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, [MEM_IDE_STRING_0], [MEM_IDE_STRING_0]>>8, 0x00, 0x00
db 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x01, [MEM_IDE_STRING_1], [MEM_IDE_STRING_1]>>8, 0x00, 0x00
db 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, [MEM_IDE_STRING_2], [MEM_IDE_STRING_2]>>8, 0x00, 0x00
db 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, [MEM_IDE_STRING_3], [MEM_IDE_STRING_3]>>8, 0x00, 0x00
;================================================================
; IDE funtions
;================================================================
;------------------------------------------------------------------------------
; ideif_init_table
;
; initializes drive table
;------------------------------------------------------------------------------
ideif_init_devtable:
;copy default values to ram
ld hl,[IDE_DEV_TABLE]
ld de,[MEM_IDE_DEV_TABLE]
ld bc,16*4
ldir
;set selected device
ld a,0
ld (MEM_IDE_SELECTED),a
;set empty names
xor a
ld (MEM_IDE_STRING_0),a
ld (MEM_IDE_STRING_1),a
ld (MEM_IDE_STRING_2),a
ld (MEM_IDE_STRING_3),a
ret
;------------------------------------------------------------------------------
; ideif_prnt_devtable
;
; prints drive table
;------------------------------------------------------------------------------
ideif_prnt_devtable:
call print_newLine
ld hl,[_ideif_prnt_devtable_hdr]
call print_str
ld hl,[MEM_IDE_DEV_TABLE]
ld b,0 ;device number
_ideif_prnt_devtable_l1: ;loop 1 -> for each device
;print if selected
ld a,(MEM_IDE_SELECTED)
cp b
jp z,_ideif_prnt_devtable_l1_sel
ld a, ' '
jr _ideif_prnt_devtable_l1_nxt
_ideif_prnt_devtable_l1_sel:
ld a, '*'
_ideif_prnt_devtable_l1_nxt:
call print_char
;print drive letter
ld a,b
add 69 ;offset letter to D
call print_char
ld a, ':'
call print_char
ld a, ' '
call print_char
;print status
push hl
ld a,(HL)
or a
jr z, _ideif_prnt_devtable_l1_s00
cp 0x01
jr z, _ideif_prnt_devtable_l1_s01
cp 0x02
jr z, _ideif_prnt_devtable_l1_s02
cp 0xFF
jr z, _ideif_prnt_devtable_l1_sFF
jr _ideif_prnt_devtable_l1_sFF
_ideif_prnt_devtable_l1_s00
ld hl,[_ideif_prnt_devtable_s00]
jr _ideif_prnt_devtable_l1_es
_ideif_prnt_devtable_l1_s01
ld hl,[_ideif_prnt_devtable_s01]
jr _ideif_prnt_devtable_l1_es
_ideif_prnt_devtable_l1_s02
ld hl,[_ideif_prnt_devtable_s02]
jr _ideif_prnt_devtable_l1_es
_ideif_prnt_devtable_l1_sFF
ld hl,[_ideif_prnt_devtable_sFF]
_ideif_prnt_devtable_l1_es
call print_str
pop hl
inc hl
;print FS-Type
ld a,'0'
call print_char
ld a,'x'
call print_char
ld a,(HL)
call print_a_hex
ld a,' '
call print_char
inc hl
;print first sector
push hl
pop ix
inc hl
inc hl
inc hl
inc hl
inc hl
inc hl
inc hl
inc hl
ld a,(ix+3)
call print_a_hex
ld a,(ix+2)
call print_a_hex
ld a,(ix+1)
call print_a_hex
ld a,(ix+0)
call print_a_hex
ld a,' '
call print_char
;print length
ld a,(ix+7)
call print_a_hex
ld a,(ix+6)
call print_a_hex
ld a,(ix+5)
call print_a_hex
ld a,(ix+4)
call print_a_hex
ld a,' '
call print_char
;print Port
ld a,'0'
call print_char
ld a,'x'
call print_char
ld a,(HL)
call print_a_hex
ld a,' '
call print_char
inc hl
;print M/S
ld a,(HL)
push hl
or a
jp z,_ideif_prnt_devtable_l1_ms
ld hl,[_ideif_prnt_devtable_slave]
jp _ideif_prnt_devtable_l1_e2
_ideif_prnt_devtable_l1_ms
ld hl,[_ideif_prnt_devtable_master]
_ideif_prnt_devtable_l1_e2
call print_str
pop hl
inc hl
;print str
push bc
ld a,(hl)
ld c,a
inc hl
ld a,(hl)
ld b,a
inc hl
push hl
ld h,b
ld l,c
call print_str
call print_newLine
pop hl
pop bc
;next
inc hl
inc hl
inc b
ld a,b
cp 4
ret z
jp _ideif_prnt_devtable_l1
;------------------------------------------------------------------------------
; ideif_init_drive
;
; initializes drive
; initializes selected drive in table
;------------------------------------------------------------------------------
ideif_init_drive:
xor a
ld (MEM_IDE_DEVICE),A ;Set device to 0
ld (MEM_IDE_STATUS),A ;Set status to 0 (OK)
di ;disable interrupt
call ide_reset ;Reset drives on bus
ld hl, [str_dev_waitready]
call print_str ;print waiting message
ld DE, 0x1FFF ;preload timeout counter
ideif_init_drive_loop1:
call ideif_get_drv_pointer
; load addresses. not used atm
;ld a,(IX+6) ;load IO Addr
;ld d,a
;ld a,(IX+7) ;load Master/Slave bit
;ld e,a
call ide_reset
ld bc, 0x5FFF ;preload timeout counter
_ideif_init_drive_loop:
ld b, IDE_REG_CMDSTS
call ide_regread_8 ;read drive status register
OR A
JR Z, ideif_init_drive_nodrv ;no drive found
BIT 6,A ;Wait for device ready
JR NZ, ideif_init_drive_detected
DEC DE ; decrement timeout
LD A,D
OR E
JR Z, ideif_init_drive_nodrv
JR ideif_init_drive_loop1
or a
jr z,_ideif_init_drive_nodrv ;no drive found
bit 6,a
jr nz, _ideif_init_drive_found
dec de
ld a,d
or e
jr z, _ideif_init_drive_nodrv
jr _ideif_init_drive_loop
ideif_init_drive_nodrv:
ld hl, [str_dev_notfound]
call print_str
RET
_ideif_init_drive_nodrv:
ld(ix+0),0x01
ret
ideif_init_drive_detected:
ld hl, [str_dev_ready]
call print_str
LD B, IDE_REG_CMDSTS ;Get drive identification
LD A, IDE_CMD_IDENT
_ideif_init_drive_found:
ld (ix+0),0x02
;get drive name
ld b, IDE_REG_CMDSTS ;Get drive identification
ld a, IDE_CMD_IDENT
call ide_regwrite_8 ;Write command to drive
LD HL,MEM_IDE_BUFFER ;set read/write buffer start address
ld hl, MEM_IDE_BUFFER ;set read/write buffer start address
call ide_readsector_256 ;read 256 words from device
LD HL,MEM_IDE_BUFFER + 20 ;print device serial
LD B, 20
CALL print_str_fixed
ld hl, [str_dev_ready2]
ld hl,MEM_IDE_BUFFER + 54 ;print device serial
ld a,(ix+12) ;load str pointer into de
ld e,a
ld a,(ix+13)
ld d,a
ld bc,40 ;copy 40 char
ldir
;get partition table
;read bootsector
ld a,1 ;read 1 sector
ld B,IDE_REG_SECTOR
call ide_regwrite_8
ld a,1 ;read sector 0
ld b,IDE_REG_SSECTOR
call ide_regwrite_8
ld a,0 ;read cylinder 0
ld b,IDE_REG_LCYL
call ide_regwrite_8
ld a,0
ld b,IDE_REG_HCYL
call ide_regwrite_8
ld a,10100000b ;read head 0
ld b,IDE_REG_HEAD
call ide_regwrite_8
ld a,IDE_CMD_READSEC ;send read command
ld b,IDE_REG_CMDSTS
call ide_regwrite_8
ld hl, MEM_IDE_BUFFER ;set read/write buffer start address
call ide_readsector_512_inv ;read 256 words from device
;prepare partitions
ld b,4 ;Partition table length
ld c,0 ;Partition ID counter
ld iy,MEM_IDE_BUFFER+446 ;Load offest of first partition table entry
_ideif_init_drive_prt_l1:
ld a,(iy+4) ;load status byte
or a
jp NZ, _ideif_init_drive_prt_fnd ;If not zero, jump to print function
jp _ideif_init_drive_prt_ln
_ideif_init_drive_prt_ln:
ld de,16
add iy,de
djnz _ideif_init_drive_prt_l1
ret
_ideif_init_drive_prt_fnd;
ld a,(iy+4)
ld (ix+1),a ;store partition type
cp 0x0E ;if not 0xE0, continue with next entry
jr nz, _ideif_init_drive_prt_ln
;get start LBA
ld a,(iy+0x08)
ld (ix+0x02),a
ld a,(iy+0x09)
ld (ix+0x03),a
ld a,(iy+0x0A)
ld (ix+0x04),a
ld a,(iy+0x0B)
ld (ix+0x05),a
ld (ix+0),0x00
;get count LBA
ld a,(iy+0x0C)
ld (ix+0x06),a
ld a,(iy+0x0D)
ld (ix+0x07),a
ld a,(iy+0x0E)
ld (ix+0x08),a
ld a,(iy+0x0F)
ld (ix+0x09),a
ld (ix+0),0x00
ret
;------------------------------------------------------------------------------
; ideif_get_drv_pointer
;
; gets pointer to selected drive in table in IX
;------------------------------------------------------------------------------
ideif_get_drv_pointer:
push af
push bc
;get selected drive
ld a,(MEM_IDE_SELECTED)
;multiply a *8
rlca ;*2
rlca ;*4
rlca ;*8
ld b,0
ld c,a
ld ix,[MEM_IDE_DEV_TABLE]
add ix,bc
pop bc
pop af
ret
;------------------------------------------------------------------------------
; ideif_init_all
;
; initializes interface
;------------------------------------------------------------------------------
ideif_init_all:
ld hl, [str_dev_waitready]
call print_str ;print waiting message
call ideif_init_devtable
call ideif_init_drive
ld hl, [str_dev_done]
call print_str
LD HL,MEM_IDE_BUFFER + 54 ;print device name
LD B, 40
CALL print_str_fixed
LD A,10 ;New line
CALL print_char
LD A,13
CALL print_char
RET
;------------------------------------------------------------------------------
; ideif_drv_sel
;
; Selects drive from table and initializes the fat16 file system
; A contains drive id
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; read_lba_sector
;
@@ -90,24 +395,23 @@ read_lba_sector:
LD B,IDE_REG_SECTOR ;amount of sectores
CALL ide_regwrite_8
LD A,(HL)
LD B,IDE_REG_LBA0
CALL ide_regwrite_8
INC HL
LD A,(HL)
LD B,IDE_REG_LBA1
CALL ide_regwrite_8
INC HL
LD A,(HL)
LD B,IDE_REG_LBA2
CALL ide_regwrite_8
INC HL
LD A,(HL)
AND 00001111b
OR 11100000b
LD B,IDE_REG_HEAD
LD B,IDE_REG_LBA3
CALL ide_regwrite_8
INC HL
LD A,(HL)
LD B,IDE_REG_HCYL
CALL ide_regwrite_8
INC HL
LD A,(HL)
LD B,IDE_REG_LCYL
CALL ide_regwrite_8
INC HL
LD A,(HL)
LD B,IDE_REG_SSECTOR
CALL ide_regwrite_8
INC HL
LD A,IDE_CMD_READSEC ;send read command
LD B,IDE_REG_CMDSTS
@@ -117,17 +421,29 @@ read_lba_sector:
ret
;================================================================
; IDE strings
;===============================================================
str_dev_waitready:
db 13,10,"Detecting drives ",0
db 13,10,"Detecting drives ... ",0
str_dev_done:
db "done!",13,10,0
str_dev_ready:
db "found!",13,10,"ID: ",0
str_dev_ready2:
db " Desc: ",0
str_dev_notfound:
db "no drive",13,10,0
_ideif_prnt_devtable_hdr:
db "DRV Status Type LBA Length Port M/S Name",10,13,0
_ideif_prnt_devtable_s00:
db "Avail ",0
_ideif_prnt_devtable_s01:
db "Not Found ",0
_ideif_prnt_devtable_s02:
db "Unkown FS ",0
_ideif_prnt_devtable_sFF:
db "Ctrl. Err ",0
_ideif_prnt_devtable_master:
db "Master ",0
_ideif_prnt_devtable_slave:
db "Slave ",0

View File

@@ -0,0 +1,289 @@
;----------------------------------------------------------------
;BIOS Driver for I2C Protocol (Software)
;by Dennis Gunia (01/2024)
;
; SCL is connected to PA1 of PIO (U6) with pull-up
; SDA is connected to PA0 of PIO (U6) with pull-up
;----------------------------------------------------------------
;================================================================
; I/O registers
;================================================================
;================================================================
; I/O pins
;================================================================
IIC_CLK .EQU 00000001b
IIC_DATA .EQU 00000010b
;================================================================
; basic access functions
;================================================================
;HL contains buffer location
;B defines amount of bytes to send
;C contains device address
iic_send_buffer:
CALL iic_send_sbit ;Send startbit
LD A,C
AND 0xFE ;Mask R/W bit (must be 0 for write)
CALL iic_send_byte ;Send Address
CALL iic_read_ack
OR A ; if no ack, error
JP NZ, iic_send_buffer_err
iic_send_buffer_loop;
LD A,(HL)
INC HL
CALL iic_send_byte
CALL iic_read_ack
OR A ; if no ack, error
JP NZ, iic_send_buffer_err
DJNZ iic_send_buffer_loop ;loop for remaining bytes
iic_send_buffer_done:
CALL iic_send_ebit
LD A,0
RET
iic_send_buffer_err:
CALL iic_send_ebit
LD A,1
RET
;HL contains buffer location
;B defines amount of bytes to send
;C contains device address
iic_receive_buffer:
DEC B
CALL iic_send_sbit ;Send startbit
LD A,C
OR 0x01 ;set R/W bit (must be 1 for read)
CALL iic_send_byte ;Send Address
CALL iic_read_ack
OR A ; if no ack, error
JP NZ, iic_receive_buffer_err
iic_receive_buffer_loop:
CALL iic_receive_byte
LD (HL),A
INC HL
CALL iic_send_ack
DJNZ iic_receive_buffer_loop
; last time:
CALL iic_receive_byte
LD (HL),A
INC HL
CALL iic_send_nack
iic_receive_buffer_done:
CALL iic_send_ebit
LD A,0
RET
iic_receive_buffer_err:
CALL iic_send_ebit
LD A,1
RET
;================================================================
; I/O access functions
;================================================================
;Reset PIO configuration
iic_init:
;Set port to controll mode (MODE3)
LD A,0xCF
OUT (CS_PIO_AC), A
;Set inputs/outputs
LD A,0xF0
OUT (CS_PIO_AC), A
RET
; send start bit
iic_send_sbit:
;Set port to controll mode (MODE3)
LD A,0xCF
OUT (CS_PIO_AC), A
;Set inputs/outputs (SDA and SCL is now output)
LD A,0xFC
OUT (CS_PIO_AC), A
;SCL HIGH, SDA LOW
LD A,0x02
OUT (CS_PIO_AD), A
NOP
NOP
LD A,0x00
OUT (CS_PIO_AD), A
NOP
NOP
RET
; send end/stop bit
iic_send_ebit:
;Set port to controll mode (MODE3)
LD A,0xCF
OUT (CS_PIO_AC), A
;Set inputs/outputs (SDA and SCL is now output)
LD A,0xFC
OUT (CS_PIO_AC), A
;SCL HIGH, SDA LOW
LD A,0x02
OUT (CS_PIO_AD), A
NOP
NOP
LD A,0x03 ; both high
OUT (CS_PIO_AD), A
NOP
NOP
;release bus
;Set port to controll mode (MODE3)
LD A,0xCF
OUT (CS_PIO_AC), A
NOP
NOP
;Set inputs/outputs (SDA and SCL is now input, sound enabled)
LD A,11110111b
OUT (CS_PIO_AC), A
NOP
NOP
RET
iic_read_ack:
LD A,0xCF
OUT (CS_PIO_AC), A
;Set inputs/outputs (SCL is now output, SDA input)
LD A,0xFD
OUT (CS_PIO_AC), A
NOP
NOP
LD A,0x00 ;set SCL LOW
OUT (CS_PIO_AD), A
NOP
NOP
XOR 0x02 ;set SCL HIGH
OUT (CS_PIO_AD), A
NOP
IN A,(CS_PIO_AD) ; Read SDA
NOP
NOP
PUSH AF
AND 0xFE ; Filter input
XOR 0x02 ;set SCL LOW
OUT (CS_PIO_AD), A
NOP
NOP
POP AF
AND 1
RET
iic_send_ack:
;Set port to controll mode (MODE3)
LD A,0xCF
OUT (CS_PIO_AC), A
;Set inputs/outputs (SDA and SCL is now output)
LD A,0xFC
OUT (CS_PIO_AC), A
NOP
NOP
LD A,0x00 ; SCL LOW, SDA LOW
OUT (CS_PIO_AD), A
NOP
NOP
LD A,0x02 ; SCL HIGH, SDA LOW
OUT (CS_PIO_AD), A
NOP
NOP
LD A,0x00 ; SCL LOW, SDA LOW
OUT (CS_PIO_AD), A
NOP
NOP
RET
iic_send_nack:
;Set port to controll mode (MODE3)
LD A,0xCF
OUT (CS_PIO_AC), A
;Set inputs/outputs (SDA and SCL is now output)
LD A,0xFC
OUT (CS_PIO_AC), A
NOP
NOP
LD A,0x02 ; SCL LOW, SDA HIGH
OUT (CS_PIO_AD), A
NOP
NOP
LD A,0x03 ; both high
OUT (CS_PIO_AD), A
NOP
NOP
LD A,0x02 ; SCL LOW, SDA HIGH
OUT (CS_PIO_AD), A
NOP
NOP
RET
;A contains byte
iic_send_byte:
PUSH BC
LD C,A ;buffer
;Set port to controll mode (MODE3)
LD A,0xCF
OUT (CS_PIO_AC), A
;Set inputs/outputs (SDA and SCL is now output)
LD A,0xFC
OUT (CS_PIO_AC), A
LD B,8 ;bit counter
iic_send_byte_loop:
;prepare data
RL C
LD A,0
RLA ; set SCA bit from carry, SCL LOW
OUT (CS_PIO_AD), A
NOP
NOP
XOR 0x02 ;set SCL HIGH
OUT (CS_PIO_AD), A
NOP
NOP
XOR 0x02 ;set SCL LOW
OUT (CS_PIO_AD), A
NOP
NOP
DJNZ iic_send_byte_loop ;loop until counter is 0
;transmittion end / end loop
LD A,C
POP BC
RET
iic_receive_byte:
PUSH BC
;Set port to controll mode (MODE3)
LD A,0xCF
OUT (CS_PIO_AC), A
;Set inputs/outputs (SCL is now output, SDA input)
LD A,0xFD
OUT (CS_PIO_AC), A
LD B,8 ;bit counter
LD C,0
iic_receive_byte_loop:
XOR A ;set SCL LOW
OUT (CS_PIO_AD), A
NOP
NOP
LD A,2 ;set SCL HIGH
OUT (CS_PIO_AD), A
NOP
IN A, (CS_PIO_AD)
NOP
RRA ;read SDA bit
RL C ;store bit
XOR A ;set SCL LOW again
OUT (CS_PIO_AD), A
NOP
NOP
DJNZ iic_receive_byte_loop
LD A,C
POP BC
RET

View File

@@ -0,0 +1,120 @@
;Power-On self test
POST_START:
call POST_CHECK_PIO
call POST_CHECK_APU
call POST_TEST_RTC
call POST_CHECK_IDE_30
call POST_CHECK_IDE_40
ret
POST_CHECK_PIO:
ld hl,[str_post_pio]
call print_str
in a,(CS_PIO_AC) ;test read from pio
cp 0x00 ;0x78 when not installed
jp nz, _POST_CHECK_PIO_FAILED
ld a, 0x00 ;set present flag
ld (var_pio_present),a
ld hl,[str_post_ok]
call print_str
ret
_POST_CHECK_PIO_FAILED:
ld a, 0xFF
ld (var_pio_present),a
ld hl,[str_post_nd]
call print_str
ret
POST_CHECK_APU:
ld hl,[str_post_apu]
call print_str
ld a, 0xFF
out (CS_APU_DATA),a
nop
nop
in a,(CS_APU_DATA)
cp 0xFF
jp nz, _POST_CHECK_APU_FAILED
ld a, 0x00 ;set present flag
ld (var_apu_present),a
ld hl,[str_post_ok]
call print_str
ret
_POST_CHECK_APU_FAILED:
ld a, 0xFF
ld (var_apu_present),a
ld hl,[str_post_nd]
call print_str
ret
POST_CHECK_IDE_30:
ld hl,[str_post_ide_30]
call print_str
in a,(0x30)
or a
jp nz, _POST_CHECK_IDE_FAILED
ld hl,[str_post_ok]
call print_str
ret
POST_CHECK_IDE_40:
ld hl,[str_post_ide_40]
call print_str
in a,(0x40)
or a
jp nz, _POST_CHECK_IDE_FAILED
ld hl,[str_post_ok]
call print_str
ret
_POST_CHECK_IDE_FAILED
ld hl,[str_post_nd]
call print_str
ret
POST_TEST_RTC:
ld a, 0x06
ld (var_scratch),a
ld hl,[str_post_rtc]
call print_str
ld hl,[var_scratch]
ld b, 1
ld c, ADDR_RTC
call iic_send_buffer
or a
jp nz, _POST_TEST_RTC_NOTFOUND
ld hl,[var_scratch]
ld b, 1
ld c, ADDR_RTC
call iic_receive_buffer
ld a, (var_scratch)
or a
jp z, _POST_TEST_RTC_INVALID
ld hl,[str_post_ok]
call print_str
jp _OP_RTIME_NN
_POST_TEST_RTC_NOTFOUND:
ld hl,[str_post_nd]
call print_str
ret
_POST_TEST_RTC_INVALID:
ld hl,[str_post_rtc_iv]
call print_str
ret
str_post_ide_30:
db 13,10,"Check Diskctrl.@030h... ",0
str_post_ide_40:
db 13,10,"Check Diskctrl.@040h... ",0
str_post_pio:
db 13,10,"Check IO-Controller ... ",0
str_post_apu:
db 13,10,"Check AMD8911 APU ... ",0
str_post_rtc:
db 13,10,"Check DS1307 RTC ... ",0
str_post_nd:
db "not detected!",0
str_post_rtc_iv:
db "not set. Check battery and run 'setdate'!",0
str_post_ok:
db "ok! ",0

View File

@@ -1,12 +1,21 @@
;----------------------------------------------------------------
;Z8C Homebrew Computer Monitor
;by Dennis Gunia (01/2023)
;----------------------------------------------------------------
;================================================================
; Memory areas
;================================================================
SYS_RAM_START equ 0x4000
SYS_BUF_START equ 0x4010
PRG_RAM_START equ 0x4110
PRG_RAM_TOP equ 0xFF00
STACK_RAM_TOP equ 0xFFFF
;VAR_CONSOLE_CONF equ 0x07 ;CLK/TRG Clock @ 1843220.5/s
;================================================================
; Terminal configuration
;================================================================
VAR_CONSOLE_CONF equ 0x0F ;CPU/16 Clock @ 230402.5625/s
VAR_CONSOLE_BAUD equ 24 ;BAUD timer constant
;CLK/TRG Clock @ 1843220.5/s
; -> 0x16 : 14400
@@ -14,14 +23,18 @@ VAR_CONSOLE_BAUD equ 24 ;BAUD timer constant
; -> 12 : 19200
; -> 24 : 9600
;================================================================
; Includes (1/2)
;================================================================
; include IO device addresses
.include "addresses.s"
;================================================================
; RST Vectors for BASIC
;================================================================
org 0x0000
RST_00: ;Hardware Restart
ld sp, STACK_RAM_TOP
di
jp mon_start_init_sound
jp BOOT_PHASE0
org 0x0008
RST_08 ;Print Char
@@ -35,12 +48,16 @@ RST_10 ;receive char
RST_18 ;Buffer length
jp EXEC_RST_18
;================================================================
; Default interrupt vectors
;================================================================
INT_VEC:
org 0x0044
;DEFW EXEC_INT_VDP
;memory var template
;================================================================
; Memory layout
;================================================================
mon_var_template:
phase SYS_RAM_START
@@ -60,73 +77,54 @@ var_curserchar:
defb 0
var_curserlastaddr:
defw 0
var_pio_present:
defb 0
var_apu_present:
defb 0
var_scratch:
defs 16 ;16 bytes space for scratch vars
var_ps2mem:
defs 16 ;16 bytes space for scratch vars
var_buffer:
defb 0 ;var lentgh
var_idebuffer:
defs 768
dephase
mon_var_template_end:
nop
;end memory var template
;================================================================
; Start of monitor
;================================================================
org 0x0050
mon_start_init_sound:
;CALL BTLDR_ENTRY ;call bootloader first
;ld D,0x08 ; Select register #8
;ld A,0x00 ; Volume channel A 0
;call AY0_WRITE_REG
;ld D,0x09 ; Select register #9
;ld A,0x00 ; Volume channel B 0
;call AY0_WRITE_REG
;ld D,0x0A ; Select register #10
;ld A,0x00 ; Volume channel C 0
;call AY0_WRITE_REG
mon_start_init_ctc:
; Set CTC Ch2 Interrupt Vector
;LD A,40h ; it vector defined in bit 7­3,bit 2­1 don't care, bit 0 = 0
;OUT (IO_CTC0_C0),A
; Init CTC Channel 2
;LD A,10100111b
;OUT (IO_CTC0_C2),A
;LD A,0x34 ; 55Hz ISR
;LD A,0xFF ; 55Hz ISR
;OUT (IO_CTC0_C2),A
;INIT PIO
BOOT_PHASE0: ;Setup Hardware
;Setup Stack-Pointer
ld sp, STACK_RAM_TOP
;Disable Interrupts
di
;Setup PIO on MIO Board
LD A,0xCF
OUT (CS_PIO_AC), A
LD A,11110101b
LD A,11110111b ;All pins inputs except speaker
OUT (CS_PIO_AC), A
LD A,00000011B ;Preset I2C pins to high
OUT (CS_PIO_AC), A
xor a
;ld i, a
;im 2 ;set int mode 2
;Set variables
ld (var_curserstate),a
ld (var_curseron),a
ld a, " "
ld (var_curserchar),a
;ei ; Enable Interrupts
;jr mon_start_ram ;skip serial, cause not used atm
mon_start_init_serial:
;Initialize Console (Serial-Port)
call CONSOLE_INIT
;jp mon_start_complete
mon_start_ram:
BOOT_PHASE1: ;Copy default values to RAM
ld hl,mon_var_template
ld de,mon_var_template_end
ld bc,SYS_RAM_START
mon_start_ram_loop:
BOOT_PHASE1_LOOP:
ld a,(hl) ;copy values
ld (bc),a
inc hl
@@ -134,379 +132,54 @@ mon_start_ram_loop:
push hl ;check if end is reached
sbc hl,de
pop hl
jp nz, mon_start_ram_loop
jp nz, BOOT_PHASE1_LOOP
;template copy done
mon_start_complete:
;call keyboard_init_io
;call vdpconsole_init
;call print_str
;jp splash_run
;jp ps2demo_run
;call debug_init
;call vdp_cursor_on
;jp COLD
BOOT_PHASE2: ;Hardware initialized.
; Print banner
call print_clear
ld hl, [STR_Banner_Start]
call print_str
call ideif_init_drive
; Power-On Self Tests
call POST_START
; Detect IDE drives
call ideif_init_all
; Beep after start
LD DE,0x40
LD BC,0x48
CALL beep
;call vdp_cursor_on
call PROMPT_BEGIN
; Start commandline
jp COMMAND
;halt CPU if prompt exits
; This instruction should never be reached
halt
; Misc Functions
AY0_WRITE_REG:
LD B,A
LD A,D
OUT (IO_AY0_ADDR),A
LD A,B
OUT (IO_AY0_DATA),A
RET
PROMPT_BEGIN:
call print_newLine
;call A_RTS_ON
ld a,'>'
call print_char
xor a ;reset buffer len
ld (var_buffer_len),a
PROMPT_BEGIN_READ_LOOP:
call read_char
;call keybd_read_ascii
jp z, PROMPT_BEGIN_READ_LOOP ; wait until char avail
push af
pop af
; process special ops
cp 13 ; enter
jp z,PROMPT_BEGIN_READ_PROCESS
cp 10
jp z, PROMPT_BEGIN_READ_LOOP; skip LF for file load
cp 0x08 ; backspace 0x08 VT102 0x7f Putty
jp z,PROMPT_BEGIN_READ_BACKSPACE
push af
; a contains latest char
ld hl,[var_buffer]
ld d,0
ld a,(var_buffer_len)
ld e,a
add hl,de ;hl now contains pointer to last position in buffer
inc a
ld (var_buffer_len),a ;store incremented buffer length
pop af
ld (hl),a
call print_char
inc hl
xor a ;a = 0
ld (hl),a ;always add null termination after last char
jp PROMPT_BEGIN_READ_LOOP
PROMPT_BEGIN_READ_BACKSPACE:
ld a,(var_buffer_len)
and a
jp z, PROMPT_BEGIN_READ_LOOP ; do not continue if already at char 0
dec a ;decrement length
ld (var_buffer_len),a ;and store it
ld e,a ;load de with decremented value
ld d,0
ld hl,[var_buffer]
add hl,de ;hl now contains pointer to last position in buffer
xor a ; store null byte to current location
ld (hl),a
;call print_delete
ld a, 0x08
call print_char
ld a, 0x20
call print_char
ld a, 0x08
call print_char
jp PROMPT_BEGIN_READ_LOOP
PROMPT_BEGIN_READ_PROCESS:
;call print_newLine
;ld hl,var_buffer
;call print_str
ld a,([var_buffer])
cp '$' ;jump to addr
jp z, CMD_EXEC
cp '?' ;print hexdump
jp z, CMD_VIEW
cp '!' ;set memory
jp z, CMD_SET
cp 'i' ;in IO
jp z, CMD_IO_READ
cp 'o' ;out IO
jp z, CMD_IO_WRITE
cp 'd' ;disassemble
jp z, CMD_DASM
cp 'x' ;start xmodem
jp z, xmodem_init
call print_newLine
ld hl, [STR_Unknown]
call print_str
jp PROMPT_BEGIN
ret
CMD_EXEC:
xor a ;write null byte to buffer pos 0 to prevent reexecute the last command
ld (var_buffer),a
ld hl,var_buffer+1 ;load 1st byte
call DHEX_TO_BYTE
ld b,a ;store result in b
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
ld hl,var_buffer+3 ;load 2nd byte
call DHEX_TO_BYTE
ld c,a
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
ld h,b
ld l,c
jp (hl)
CMD_VIEW:
call print_newLine
ld hl,var_buffer+1 ;load 1st byte
call DHEX_TO_BYTE
ld b,a ;store result in b
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
ld hl,var_buffer+3 ;load 2nd byte
call DHEX_TO_BYTE
ld c,a
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
ld a,(var_buffer+5)
cp ' '
jp nz, CMD_SYNTAX_ERROR
ld hl,var_buffer+6 ;load length
call DHEX_TO_BYTE
push af
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
;draw header
ld hl,[STR_HEXDUMP_HEADER]
call print_str
pop af
;loading vars done. display results
ld h, b ;pointer to current byte
ld l, c ;pointer to current byte
ld b, a ;bytes counter
;draw row
CMD_VIEW_ROW:
call print_newLine
ld a,h ;print start
call print_a_hex
ld a,l
call print_a_hex
ld a, ' '
call print_char
ld c, 16 ;column counter
CMD_VIEW_ROW_LOOP:
ld a,(hl)
call print_a_hex
inc hl ;increment pointer
dec b ;decrement byte counter
dec c ;decrement column counter
ld a,b
and a
jp z,CMD_VIEW_END ;if byte counter = 0 -> end reached
ld a,c
and a
jp z,CMD_VIEW_ROW ;else if column counter = 0 -> 16 chars printed. next row
ld a, ' '
call print_char
jp CMD_VIEW_ROW_LOOP ;else
CMD_VIEW_END:
call print_newLine
jp PROMPT_BEGIN
CMD_SET:
ld hl,var_buffer+1 ;load 1st byte
call DHEX_TO_BYTE
ld b,a ;store result in b
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
ld hl,var_buffer+3 ;load 2nd byte
call DHEX_TO_BYTE
ld c,a
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
;bc now contains the start address
ld hl,var_buffer+5
CMD_SET_LOOP:
ld a,(hl)
cp 0 ;if 0 then end
jp z, CMD_SET_END
cp ' '
jp nz, CMD_SYNTAX_ERROR
inc hl ;next byte
call DHEX_TO_BYTE
ld (bc),a ;load byte to
ld a,e
and a
jp nz, CMD_SYNTAX_ERROR
inc bc
inc hl
inc hl
jp CMD_SET_LOOP
CMD_SET_END:
call print_newLine
jp PROMPT_BEGIN
CMD_IO_WRITE:
ld hl,var_buffer+1 ;load 1st byte
call DHEX_TO_BYTE
ld c,a ;store result in b
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
ld a,(var_buffer+3)
cp ' '
jp nz, CMD_SYNTAX_ERROR
ld hl,var_buffer+4 ;load 1st byte
call DHEX_TO_BYTE
push af
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
pop af
out (c),a
call print_newLine
jp PROMPT_BEGIN
CMD_IO_READ:
ld hl,var_buffer+1 ;load 1st byte
call DHEX_TO_BYTE
ld c,a ;store result in b
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
in a,(c)
push af
call print_newLine
pop af
call print_a_hex
call print_newLine
jp PROMPT_BEGIN
CMD_DASM:
call print_newLine
ld hl,var_buffer+1 ;load 1st byte
call DHEX_TO_BYTE
ld b,a ;store result in b
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
ld hl,var_buffer+3 ;load 2nd byte
call DHEX_TO_BYTE
ld c,a
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
ld a,(var_buffer+5)
cp ' '
jp nz, CMD_SYNTAX_ERROR
ld hl,var_buffer+6 ;load length
call DHEX_TO_BYTE
push af
ld a,e ;check for error
and a
jp nz, CMD_SYNTAX_ERROR
ld h,b
ld l,c
pop af ;restore af
ld b,a
call disassemble
jp PROMPT_BEGIN
CMD_SYNTAX_ERROR:
call print_newLine
ld hl, [STR_SyntaxError]
call print_str
jp PROMPT_BEGIN
Includes:
;.include "bootldr.s"
;================================================================
; Includes (2/2)
;================================================================
.include "console.s"
.include "conversions.s"
;.include "basic.s"
.include "disassembler.s"
.include "disassembler_table.s"
.include "rst.s"
.include "beep.s"
.include "xmodem.s"
.include "kdrv_ide8255.s" ;include ide interface driver.
.include "kdrv_ideif.s" ;include ide driver.
.include "prettydump.s" ;include monitor symbols.
.include "kdrv_siic.s"
.include "prettydump.s"
.include "command.s"
.include "cmd_mem.s"
.include "cmd_io.s"
.include "cmd_date.s"
.include "cmd_disk.s"
.include "post.s"
;================================================================
; Strings
;================================================================
STR_Banner_Start:
db "Z8C Monitor V2 by Dennis Gunia (2022)",0
STR_SyntaxError:
db "syn?",0
STR_Unknown:
db "cmd?",0
STR_HEXDUMP_HEADER:
db 'BASE 0 1 2 3 4 5 6 7 8 9 A B C D E F',0
;.include "debug.s"
db "Z8C Monitor V2.1 by Dennis Gunia (2022-2024)",0

View File

@@ -1,320 +1,541 @@
:0700000031FFFFF3C35000C4
:03000800C3C40E60
:03001000C3C80E54
:03001800C3D40E40
:03000000C35000EA
:03000800C3040D21
:03001000C3080D15
:03001800C3140D01
:1000440000000000000000000000000000000000AC
:10005400000000000000000000000000000000009C
:0B006400000000000000000000000091
:100050003ECFD3F63EF5D3F6AF3204403205403EF4
:1000600020320640CD7E02214400116E0001004086
:100070007E022303E5ED52E1C27000CDCA02216089
:1000800013CDBF02CDF411114000CDD70ECD990094
:1000900076477AD34078D341C9CDD1023E3ECDB721
:1000A00002AF320040CDF802CAA500F5F1FE0DCA3C
:1000B000FC00FE0ACAA500FE08CAD600F5212940A8
:1000C00016003A00405F193C320040F177CDB7028C
:1000D00023AF77C3A5003A0040A7CAA5003D320070
:1000E000405F160021294019AF773E08CDB7023E88
:1000F00020CDB7023E08CDB702C3A5003A2940FE85
:1001000024CA2F01FE3FCA4E01FE21CAB801FE6972
:10011000CA1D02FE6FCAF401FE64CA3902FE78CA23
:10012000060FCDD102218B13CDBF02C39900C9AFF9
:10013000322940212A40CD2403477BA7C2720221E5
:100140002C40CD24034F7BA7C272026069E9CDD158
:1001500002212A40CD2403477BA7C27202212C40F2
:10016000CD24034F7BA7C272023A2E40FE20C272FA
:1001700002212F40CD2403F57BA7C27202219013E8
:10018000CDBF02F1606947CDD1027CCDE7027DCDC4
:10019000E7023E20CDB7020E107ECDE70223050D0B
:1001A00078A7CAB20179A7CA87013E20CDB702C39A
:1001B0009901CDD102C39900212A40CD2403477B68
:1001C000A7C27202212C40CD24034F7BA7C272022A
:1001D000212E407EFE00CAEE01FE20C2720223CD17
:1001E0002403027BA7C27202032323C3D301CDD110
:1001F00002C39900212A40CD24034F7BA7C272027B
:100200003A2C40FE20C27202212D40CD2403F57B02
:10021000A7C27202F1ED79CDD102C39900212A4023
:10022000CD24034F7BA7C27202ED78F5CDD102F148
:10023000CDE702CDD102C39900CDD102212A40CD14
:100240002403477BA7C27202212C40CD24034F7B9D
:10025000A7C272023A2E40FE20C27202212F40CD68
:100260002403F57BA7C272026069F147CD7503C311
:100270009900CDD102218613CDBF02C399003E4F14
:10028000D304DB01D3043E30D3093E18D3093E0426
:10029000D3093E44D3093E05D3093EE8D3093E01C4
:1002A000D3093E04D3093E02D3093E00D3093E03DD
:1002B000D3093EC1D309C9F5D308CDDC02F1C97E0B
:1002C000B72806CDB7022318F6C9210A03CDBF020D
:1002D000C93E0ACDB7023E0DCDB702C9973CD3093E
:1002E000DB09CB4728F6C9F5C5D5CD5B0378CDB77B
:1002F0000279CDB702D1C1F1CD1B0300AFD309DB29
:1003000009E601CD1203C8DB08C91B5B324A1B5B3F
:1003100048003E05D3093E68D309C93E05D3093ECE
:10032000EAD309C9E57ECD44033815CB27CB27CBCB
:1003300027CB2757237ECD44033805B2E11E00C9E1
:100340001EFFE1C9D630EA5903FE0A3805D607EA8E
:100350005903FE103003E60FC937C9F51F1F1F1FD1
:10036000CD6A0347F1CD6A034FC9E60FC630FE3AA6
:10037000D8C607C9C978321A412210417E321441C9
:10038000237E3215412BCD690478B1CA4B04ED436D
:100390001241030303030A321641030A5F030A579B
:1003A000ED531741030A3219412A1041CDB1043AE5
:1003B0001641472A10417ECDE7022310F93E68CD51
:1003C000B7023A1641473E0690473E20CDB7023E5F
:1003D00020CDB70210F43E20CDB702E52A1741CD5B
:1003E000BF023A1941B7CA48042A1241010800095C
:1003F0003A1941477EFE01CCD704FE02CCFE04FE32
:1004000003CC1B05FE04CC5705FE05CC6D05FE068E
:10041000CC7A05FE07CC9405FE08CCA105FE09CCDC
:10042000B605FE10CCCB05FE11CCDB05FE12CCE3ED
:1004300005FE13CC1B06FE0ACCAD05FE80CC3A06A9
:10044000FE81CC31062310ACE11810CDB1047ECD75
:10045000C90423E521860ECDBF02E1CDD1023A1AAF
:10046000413D321A41C27903C9E52184063A14415B
:100470004F7EFEFFCAAB04F523462B79A04FF1B99E
:10048000280B06000E07097E4F092318E023234E90
:10049000233A154146A0B92B2B2B280B06000E073B
:1004A000097E4F092318C6444DE1C906000E00E13C
:1004B000C93E24CDB7027CCDE7027DCDE7023E6880
:1004C000CDB7023E20CDB702C9CDE7023E68CDB719
:1004D000023E20CDB702C9E5ED5B1041131A6F1340
:1004E0001A673E24CDB7027CCDE7027DCDE7023E00
:1004F00068CDB7023E20CDB702CD7506E1C9C5ED86
:100500005B10411A1F1FE60EE5218F0E06004F09F2
:10051000CDBF023E20CDB702E1C1C9ED5B10411352
:100520001AF5E680C23C053E24CDB7023E2BCDB77E
:1005300002F1CDE7023E68CDB70218173E24CDB7D1
:10054000023E2DCDB702F1ED44CDE7023E68CDB7B6
:10055000021800CD7506C9ED5B1041131AFE4D2837
:10056000063E4ECDB702C93E49CDB702C9C5ED5BC7
:1005700010411AE638CDC904C1C9C5ED5B10411A56
:100580001F1F1FE607CD50063E20CDB7023E2CCDE3
:10059000B702C1C9C5ED5B10411AE607CD5006C1CF
:1005A000C9C5ED5B1041131ACDC904C1C9E5ED5BA6
:1005B000104113131806E5ED5B1041131A6F131A5F
:1005C000677CCDE7027DCDE702E1C9C5ED5B104157
:1005D0001A1F1F1FE607CD5006C1C9E5C5ED5B1008
:1005E000411807E5C5ED5B1041131A1F1F1FE606F2
:1005F000F52A10417EFEDD2809FEFD280A219F0E06
:10060000180821A70E180321AF0EF106004F097E2E
:10061000CDB702237ECDB702C1E1C9E5C5ED5B10C0
:10062000411A1F1F1FE606F52A10417E21B70E183A
:10063000D9E5C52A174106021807E5C52A1741065C
:10064000017E23A720FB05C24106CDBF02C1E1C93F
:10065000E5FE062811FE072815219F0E06004F090A
:100660007ECDB702E1C921BF0ECDBF02E1C93E4137
:10067000CDB702E1C978FE01C83E20CDB7023E2CBD
:10068000CDB702C900FF000001DC0A0027FF00000F
:1006900001A70B002FFF000001AB0B00EDFF44FF93
:1006A00002AF0B003FFF000001B30B0037FF00005B
:1006B00001B70B0076FF000001BB0B00F3FF000049
:1006C00001C00B00FBFF000001C30B00EDFF46FF64
:1006D00002C60B00EDFF56FF02CB0B00EDFF5EFFE5
:1006E00002D00B00EBFF000001D50B0008FF00005B
:1006F00001DF0B00D9FF000001EC0B00E3FF00005D
:1007000001F00B00DDFFE3FF02FC0B00FDFFE3FF48
:1007100002080C00EDFFA0FF02140C00EDFFB0FF7B
:1007200002180C00EDFFA8FF021D0C00EDFFB8FF42
:1007300002210C00EDFFA1FF02260C00EDFFB1FF2E
:10074000022A0C00EDFFA9FF022F0C00EDFFB9FFFC
:1007500002330C00C3FF000003E00A0101C2C7001E
:100760000003E00A0302800118FF000002E70A010B
:100770000338FF000002EB0A010330FF000002F221
:100780000A010328FF000002FA0A010320FF00000B
:1007900002010B0103E9FF000002090B00DDFFE984
:1007A000FF02120B00FDFFE9FF021B0B0010FF0010
:1007B0000002240B0103CDFF0000032A0B0101C43A
:1007C000C70000032A0B020201C9FF000001300B21
:1007D00000C0C7000001300B0102EDFF4DFF0235E4
:1007E0000B00EDFF45FF023A0B00C7C70000013FB9
:1007F0000B01050AFF000001440B001AFF00000175
:100800004E0B003AFF000003580B02098002FF0064
:100810000001620B0012FF0000016D0B0032FF00AF
:100820000003780B020980EDFF57FF02870B00EDF4
:10083000FF5FFF028F0B00EDFF47FF02970B00EDFC
:10084000FF4FFF029F0B0006C7000002830B02064A
:100850000840C0000001830B02060780F800000179
:10086000380C0107C6FF000002380C0108DDFF86C6
:10087000FF03400C020880FDFF86FF034F0C0208B7
:1008800080C8F80000015E0C01078EF80000025ECF
:100890000C0108DDFF8EFF03660C020880FDFF8E51
:1008A000FF03750C02088090F8000001840C01071A
:1008B000D6FF000002840C0108DDFF96FF03890CBF
:1008C000020880FDFF96FF03950C02088094F80053
:1008D0000001A10C0107DEFF000002A10C0108DDF0
:1008E000FF9EFF03A90C020880FDFF9EFF03B70CCB
:1008F000020880A0F8000001C50C0107E6FF000017
:1009000002C50C0108DDFFA6FF03CA0C020880FD2A
:10091000FFA6FF03D60C020880B0F8000001E20C2D
:100920000107F6FF000002E20C0108DDFFB6FF033D
:10093000E60C020880FDFFB6FF03F10C020880A858
:10094000F8000001FC0C0107EEFF000002FC0C01A6
:1009500008DDFFAEFF03010D020880FDFFAEFF03BF
:100960000D0D020880B8F8000001190D0107FEFF07
:10097000000002190D0108DDFFBEFF031D0D020876
:1009800080FDFFBEFF03280D02088004C7000001A0
:10099000330D0110DDFF34FF03380D020880FDFF29
:1009A00034FF03440D02088005C7000001500D010B
:1009B00010DDFF35FF03550D020880FDFF35FF03F5
:1009C000610D02088009CF0000016D0D0111EDFFDE
:1009D0004ACF02760D0112EDFF42CF027F0D0112C8
:1009E000DDFF09CF02880D0112FDFF09CF02910D35
:1009F000011203CF0000019A0D0111DDFF23FF0258
:100A00009F0D00FDFF23FF02A80D000BCF0000018A
:100A1000B10D0111DDFF2BFF02B60D00FDFF2BFF15
:100A200002BF0D0001CF000003C80D03118009DDD6
:100A3000FF21FF04CF0D010AFDFF21FF04D70D01A7
:100A40000A2AFF000003DF0D020980EDFF4BCF04EF
:100A5000EB0D0412800A81DDFF2AFF04F60D010A66
:100A6000FDFF2AFF04020E010A22FF0000030E0E02
:100A7000020A80EDFF43CF041A0E030A8012DDFF45
:100A800022CF04240E020A80FDFF22CF04300E0282
:100A90000A80F9FF0000013C0E00DDFFF9FF02466D
:100AA0000E00FDFFF9FF02500E00C5CF0000015AF5
:100AB0000E0113DDFFE5FF02600E00FDFFE5FF0202
:100AC000680E00C1CF000001700E0113DDFFE1FFD1
:100AD00002760E00FDFFE1FF027E0E004E4F500039
:100AE0004A5020002C20004A5220004A5220432C19
:100AF00020004A52204E432C20004A52205A2C20DB
:100B0000004A52204E5A2C20004A502028484C2996
:100B100020004A50202849582920004A50202849BE
:100B200059292000444A4E5A200043414C4C200091
:100B3000524554200052455449005245544E0052EB
:100B4000535420004C4420412C28424329004C445B
:100B500020412C28444529004C4420412C28006881
:100B600029004C4420284243292C2041004C442099
:100B7000284445292C2041004C4420280068292C79
:100B80002041004C4420004C4420412C2049004C82
:100B90004420412C2052004C4420492C2041004C40
:100BA0004420522C2041004441410043504C004E0F
:100BB000454700434346005343460048414C5400D8
:100BC000444900454900494D203000494D2031003D
:100BD000494D20320045582044452C20484C0045C2
:100BE000582041462C204146E280B200455858002A
:100BF000455820285350292C20484C00455820287F
:100C00005350292C20495800455820285350292C4E
:100C1000204959004C4449004C444952004C44443A
:100C2000004C444452004350490043504952004351
:100C3000504400435044520041444420412C200081
:100C400041444420412C202849582B006829004168
:100C5000444420412C202849592B00682900414454
:100C60004320412C200041444320412C2028495856
:100C70002B0068290041444320412C202849592B4E
:100C800000682900535542200053554220284958F6
:100C90002B00682900535542202849592B00682908
:100CA0000053424320412C200053424320412C2832
:100CB00049582B0068290053424320412C284959A8
:100CC0002B00682900414E442000414E4420284911
:100CD000582B00682900414E44202849592B0068B0
:100CE00029004F5220004F52202849582B006829D4
:100CF000004F52202849592B00682900584F522094
:100D000000584F52202849582B00682900584F524C
:100D1000202849592B0068290043502000435020C7
:100D20002849582B006829004350202849592B0096
:100D3000682900494E432000494E43202849582B3A
:100D400000682900494E43202849592B0068290092
:100D50004445432000444543202849582B00682936
:100D600000444543202849592B0068290041444448
:100D700020484C2C200041444320484C2C20005358
:100D8000424320484C2C20004144442049582C2008
:100D9000004144442049592C2000494E4320004939
:100DA0004E432049582C2000494E432049592C20BD
:100DB0000044454320004445432049582C2000442A
:100DC00045432049592C20004C4420002C20004C45
:100DD000442049582C20004C442049592C20004CD8
:100DE0004420484C2C2028006829004C4420002C2A
:100DF0002028006829004C442049582C20280068ED
:100E000029004C442049592C2028006829004C44D2
:100E100020280068292C20484C004C4420280068D9
:100E2000292C20004C4420280068292C20495800F7
:100E30004C4420280068292C204959004C44205358
:100E4000502C20484C004C442053502C2049580032
:100E50004C442053502C20495900505553482000F1
:100E6000505553482049580050555348204959007F
:100E7000505553482000505553482049580050556C
:100E80005348204959002E3F2E0020202020004E9C
:100E90005A5A004E434300504F504550004D0042B7
:100EA000434445484C5350424344454958535042AB
:100EB0004344454959535042434445484C414628D0
:100EC000484C2900CDB702C9C5D5E5CDF802F5F1EA
:100ED000E1D1C1C93E00C9F5C5D53E08D3F401280A
:100EE00000CDF70E3E00D3F4012400CDF70E1B7A9F
:100EF000B320E7D1C1F1C9ED44ED44ED44ED440B1D
:100F000079B0C2F70EC9CD12033EA7D3063E0ED369
:100F1000063E00D30421E60F22044221000022FCF9
:100F20004022FE403E42ED47ED5E216110CDBF0202
:100F3000FBCD97103E43CD3710CD0A10DA340FFEAB
:100F400004CA9D0FFE18CA340FFE01CA510FC3A573
:100F50000FCD0A10DA89104732FB40CD0A10DA892A
:100F60001080FEFFC2A50F3D781FE67F67783D0F1A
:100F7000E6806F1100441906800E00E5CD0A10DAF4
:100F80008910E177230C05C27B0FCD0A10DA891096
:100F9000570CCD0A10DA89105F0CC37B103E06CDCA
:100FA0003710C3DF0F3E18CD37103E18CD37103E37
:100FB00018CD37103E18CD37103E18CD37103E18DB
:100FC000CD37103E18CD37103E18CD37103E18CD16
:100FD00037103E18CD37103E18214810CDBF02F310
:100FE000CDD102C39900F308D92AFC402322FC404A
:100FF000110404ED52C2051021000022FC402AFE1B
:10100000402322FE4008D9FBED4DF321000022FCD5
:101010004022FE40FBCD1B032AFE407DFE03CA3565
:1010200010AFD309DB09E601CA1810DB08F5CD12B1
:1010300003F1373FC937C9D308CD3D10C9973CD319
:1010400009DB09CB4728F6C94572726F723A2075E1
:101050006E657870656374656420627974650D0AE5
:1010600000417761697420786D6F64656D20636FEE
:101070006E6E656374696F6E0D0A003E06CD3710A3
:10108000CD0A10DA7B10C33F0F3E15CD3710CD0AC5
:1010900010DA8910C33F0F21FF000101000000009A
:1010A00000ED42C818F73E80D3333E80D33200AF04
:1010B000D332C9F53E80D333F1D33078E61FD33233
:1010C000F620D3320078E61FD33200AFD332C93EC8
:1010D00092D33378E61FD332F640D33200F5F1F5E0
:1010E000F1F5F1F5F1DB30F5AFD332F1C90EFF06C2
:1010F0000FCDCF10CB47C26E11CB5F28F23E92D3FB
:10110000333E08D332F640D332000000DB31772380
:10111000DB30772379B7CA1C110D18D3C90EFF1124
:1011200000101B7AB3CA5811060FCDCF10CB47C29F
:101130006E11CB5F28EC1100083E92D3333E08D3EA
:1011400032F640D332000000DB307723DB317723E7
:1011500079B7CA1C110D18CA21D011CDBF0279CDA3
:10116000E7023E0ACDB7023E0DCDB702C9C921A1A3
:1011700011CDBF02060FCDCF10CDE70221BE11CD9C
:10118000BF023A0050CDE70221C711CDBF020609C8
:10119000CDCF10CDE7023E0ACDB7023E0DCDB7024E
:1011A000C90D0A4469736B20492F4F206572726F15
:1011B000722E205374617475733A20307800204485
:1011C00065763A20307800204572723A20307800F7
:1011D0000D0A4469736B20492F4F206572726F723C
:1011E0002E20446174612074696D656F75742040B0
:1011F00020307800AF320050320150F3CDA61021DC
:101200008912CDBF0211FF1F060FCDCF10B7280BDB
:10121000CB77200E1B7AB3280218ED21B312CDBF75
:1012200002C9219D12CDBF02060F3EECCDB31021A5
:101230004150CDED102155500614CD581321AA125E
:10124000CDBF022177500628CD58133E0ACDB702F4
:101250003E0DCDB702C9060ACDB3107EE60FF6E00B
:10126000060ECDB310237E060DCDB310237E060CE3
:10127000CDB310237E060BCDB310233E20060FCD39
:10128000B310214150CD1D11C90D0A446574656329
:1012900074696E67206472697665732000666F7585
:1012A0006E64210D0A49443A20002020446573638E
:1012B0003A20006E6F2064726976650D0A00E521A0
:1012C0001913CDBF02E178B7CA1813050E107CCDF3
:1012D000E7027DCDE7023E20CDB7027ECDE7023E9C
:1012E00020CDB702230D20F3C5E506000E10ED4218
:1012F0007E23FE20DA0113FE7FD20113CDB7021840
:10130000053E2ECDB7020DC2F012E1C13E0ACDB7A7
:10131000023E0DCDB70218AEC90D0A424153452019
:10132000302020312020322020332020342020354E
:10133000202036202037202038202039202041202E
:1013400020422020432020442020452020462020E9
:1013500041534349490D0A007E23CDB70210F9C914
:101360005A3843204D6F6E69746F72205632206276
:10137000792044656E6E69732047756E6961202817
:1013800032303232290073796E3F00636D643F0062
:10139000424153452030202031202032202033206C
:1013A00020342020352020362020372020382020CF
:1013B0003920204120204220204320204420204565
:0413C00020204600A3
:10006400000000000000000000000000000000008C
:10007400000000000000000000000000000000007C
:10008400000000000000000000000000000000006C
:10009400000000000000000000000000000000005C
:1000A400000000000000000000000000000000004C
:1000B400000000000000000000000000000000003C
:1000C400000000000000000000000000000000002C
:1000D400000000000000000000000000000000001C
:1000E400000000000000000000000000000000000C
:1000F40000000000000000000000000000000000FC
:1001040000000000000000000000000000000000EB
:1001140000000000000000000000000000000000DB
:1001240000000000000000000000000000000000CB
:1001340000000000000000000000000000000000BB
:1001440000000000000000000000000000000000AB
:10015400000000000000000000000000000000009B
:10016400000000000000000000000000000000008B
:10017400000000000000000000000000000000007B
:10018400000000000000000000000000000000006B
:10019400000000000000000000000000000000005B
:1001A400000000000000000000000000000000004B
:1001B400000000000000000000000000000000003B
:1001C400000000000000000000000000000000002B
:1001D400000000000000000000000000000000001B
:1001E400000000000000000000000000000000000B
:1001F40000000000000000000000000000000000FB
:1002040000000000000000000000000000000000EA
:1002140000000000000000000000000000000000DA
:1002240000000000000000000000000000000000CA
:1002340000000000000000000000000000000000BA
:1002440000000000000000000000000000000000AA
:10025400000000000000000000000000000000009A
:10026400000000000000000000000000000000008A
:10027400000000000000000000000000000000007A
:10028400000000000000000000000000000000006A
:10029400000000000000000000000000000000005A
:1002A400000000000000000000000000000000004A
:1002B400000000000000000000000000000000003A
:1002C400000000000000000000000000000000002A
:1002D400000000000000000000000000000000001A
:1002E400000000000000000000000000000000000A
:1002F40000000000000000000000000000000000FA
:1003040000000000000000000000000000000000E9
:1003140000000000000000000000000000000000D9
:1003240000000000000000000000000000000000C9
:1003340000000000000000000000000000000000B9
:1003440000000000000000000000000000000000A9
:100354000000000000000000000000000000000099
:0D036400000000000000000000000000008C
:1000500031FFFFF33ECFD3F63EF7D3F63E03D3F6A0
:100060003204403205403E20320640CD9E002144FD
:10007000001170030100407E022303E5ED52E1C24E
:100080007700CDEA00216F1ECDDF00CDDD1CCDABAA
:1000900014114000014800CD170DC3EB17763E4FF9
:1000A000D304DB01D3043E30D3093E18D3093E0408
:1000B000D3093E44D3093E05D3093EE8D3093E01A6
:1000C000D3093E04D3093E02D3093E00D3093E03BF
:1000D000D3093EC1D309C9F5D308CDFC00F1C97ECF
:1000E000B72806CDD7002318F6C9214A01CDDF0075
:1000F000C93E0ACDD7003E0DCDD700C9973CD309E4
:10010000DB09CB4728F6C9F5C5D5CD9B0178CDD7FE
:100110000079CDD700D1C1F1C9C630CDD700C9CD46
:100120005B0100AFD309DB09E601CD5201C8DB0852
:10013000C9CD1F01CA3101CDD700DE30DA4701FE3B
:100140000ACA4701E60FC93EFFC91B5B324A1B5B67
:1001500048003E05D3093E68D309C93E05D3093E90
:10016000EAD309C9E57ECD84013815CB27CB27CB4F
:1001700027CB2757237ECD84013805B2E11E00C965
:100180001EFFE1C9D630EA9901FE0A3805D607EA12
:100190009901FE103003E60FC937C9F51F1F1F1F55
:1001A000CDAA0147F1CDAA014FC9E60FC630FE3AEC
:1001B000D8C607C9C978321A412210417E3214418B
:1001C000237E3215412BCDA90278B1CA8B02ED43B3
:1001D0001241030303030A321641030A5F030A575D
:1001E000ED531741030A3219412A1041CDF1023A69
:1001F0001641472A10417ECD07012310F93E68CDF4
:10020000D7003A1641473E0690473E20CDD7003EE4
:1002100020CDD70010F43E20CDD700E52A1741CDE0
:10022000DF003A1941B7CA88022A124101080009C1
:100230003A1941477EFE01CC1703FE02CC3E03FE75
:1002400003CC5B03FE04CC9703FE05CCAD03FE0696
:10025000CCBA03FE07CCD403FE08CCE103FE09CCE4
:10026000F603FE10CC0B04FE11CC1B04FE12CC23B3
:1002700004FE13CC5B04FE0ACCED03FE80CC7A04B2
:10028000FE81CC71042310ACE11810CDF1027ECDBB
:10029000090323E521C60CCDDF00E1CDF1003A1AB8
:1002A000413D321A41C2B901C9E521C4043A1441A1
:1002B0004F7EFEFFCAEB02F523462B79A04FF1B922
:1002C000280B06000E07097E4F092318E023234E52
:1002D000233A154146A0B92B2B2B280B06000E07FD
:1002E000097E4F092318C6444DE1C906000E00E1FE
:1002F000C93E24CDD7007CCD07017DCD07013E68E6
:10030000CDD7003E20CDD700C9CD07013E68CDD75F
:10031000003E20CDD700C9E5ED5B1041131A6F13E5
:100320001A673E24CDD7007CCD07017DCD07013E65
:1003300068CDD7003E20CDD700CDB504E1C9C5EDCD
:100340005B10411A1F1FE60EE521CF0C06004F0976
:10035000CDDF003E20CDD700E1C1C9ED5B104113D8
:100360001AF5E680C27C033E24CDD7003E2BCDD7C4
:1003700000F1CD07013E68CDD70018173E24CDD738
:10038000003E2DCDD700F1ED44CD07013E68CDD71D
:10039000001800CDB504C9ED5B1041131AFE4D28BD
:1003A000063E4ECDD700C93E49CDD700C9C5ED5B4D
:1003B00010411AE638CD0903C1C9C5ED5B10411AD9
:1003C0001F1F1FE607CD90043E20CDD7003E2CCD49
:1003D000D700C1C9C5ED5B10411AE607CD9004C135
:1003E000C9C5ED5B1041131ACD0903C1C9E5ED5B29
:1003F000104113131806E5ED5B1041131A6F131A21
:10040000677CCD07017DCD0701E1C9C5ED5B1041DA
:100410001A1F1F1FE607CD9004C1C9E5C5ED5B108B
:10042000411807E5C5ED5B1041131A1F1F1FE606B3
:10043000F52A10417EFEDD2809FEFD280A21DF0C89
:10044000180821E70C180321EF0CF106004F097E74
:10045000CDD700237ECDD700C1E1C9E5C5ED5B1046
:10046000411A1F1F1FE606F52A10417E21F70C18BE
:10047000D9E5C52A174106021807E5C52A1741061E
:10048000017E23A720FB05C28104CDDF00C1E1C9A5
:10049000E5FE062811FE07281521DF0C06004F098E
:1004A0007ECDD700E1C921FF0CCDDF00E1C93E417F
:1004B000CDD700E1C978FE01C83E20CDD7003E2C43
:1004C000CDD700C900FF0000011C090027FF000074
:1004D00001E709002FFF000001EB0900EDFF44FFD9
:1004E00002EF09003FFF000001F3090037FF0000A1
:1004F00001F7090076FF000001FB0900F3FF00008F
:1005000001000A00FBFF000001030A00EDFF46FFA7
:1005100002060A00EDFF56FF020B0A00EDFF5EFF28
:1005200002100A00EBFF000001150A0008FF00009E
:10053000011F0A00D9FF0000012C0A00E3FF0000A0
:1005400001300A00DDFFE3FF023C0A00FDFFE3FF8C
:1005500002480A00EDFFA0FF02540A00EDFFB0FFC1
:1005600002580A00EDFFA8FF025D0A00EDFFB8FF88
:1005700002610A00EDFFA1FF02660A00EDFFB1FF74
:10058000026A0A00EDFFA9FF026F0A00EDFFB9FF42
:1005900002730A00C3FF00000320090101C2C70063
:1005A000000320090302800118FF0000022709014F
:1005B0000338FF0000022B09010330FF0000023264
:1005C00009010328FF0000023A09010320FF00008F
:1005D0000241090103E9FF000002490900DDFFE9CA
:1005E000FF02520900FDFFE9FF025B090010FF0056
:1005F000000264090103CDFF0000036A090101C480
:10060000C70000036A09020201C9FF000001700966
:1006100000C0C700000170090102EDFF4DFF027527
:100620000900EDFF45FF027A0900C7C70000017FFE
:100630000901050AFF0000018409001AFF000001FA
:100640008E09003AFF000003980902098002FF00AA
:100650000001A2090012FF000001AD090032FF00F5
:100660000003B809020980EDFF57FF02C70900ED3A
:10067000FF5FFF02CF0900EDFF47FF02D70900ED42
:10068000FF4FFF02DF090006C7000002C309020690
:100690000840C0000001C30902060780F8000001FD
:1006A000780A0107C6FF000002780A0108DDFF860C
:1006B000FF03800A020880FDFF86FF038F0A0208FD
:1006C00080C8F80000019E0A01078EF80000029E13
:1006D0000A0108DDFF8EFF03A60A020880FDFF8ED7
:1006E000FF03B50A02088090F8000001C40A010760
:1006F000D6FF000002C40A0108DDFF96FF03C90A05
:10070000020880FDFF96FF03D50A02088094F800D6
:100710000001E10A0107DEFF000002E10A0108DD35
:10072000FF9EFF03E90A020880FDFF9EFF03F70A10
:10073000020880A0F8000001050B0107E6FF000099
:1007400002050B0108DDFFA6FF030A0B020880FD6E
:10075000FFA6FF03160B020880B0F8000001220B71
:100760000107F6FF000002220B0108DDFFB6FF03C0
:10077000260B020880FDFFB6FF03310B020880A89C
:10078000F80000013C0B0107EEFF0000023C0B01EA
:1007900008DDFFAEFF03410B020880FDFFAEFF0343
:1007A0004D0B020880B8F8000001590B0107FEFF4D
:1007B000000002590B0108DDFFBEFF035D0B0208BC
:1007C00080FDFFBEFF03680B02088004C700000124
:1007D000730B0110DDFF34FF03780B020880FDFF6F
:1007E00034FF03840B02088005C7000001900B0151
:1007F00010DDFF35FF03950B020880FDFF35FF0379
:10080000A10B02088009CF000001AD0B0111EDFF23
:100810004ACF02B60B0112EDFF42CF02BF0B01120D
:10082000DDFF09CF02C80B0112FDFF09CF02D10B7A
:10083000011203CF000001DA0B0111DDFF23FF02DB
:10084000DF0B00FDFF23FF02E80B000BCF000001D0
:10085000F10B0111DDFF2BFF02F60B00FDFF2BFF5B
:1008600002FF0B0001CF000003080C03118009DD1B
:10087000FF21FF040F0C010AFDFF21FF04170C01EB
:100880000A2AFF0000031F0C020980EDFF4BCF0472
:100890002B0C0412800A81DDFF2AFF04360C010AAA
:1008A000FDFF2AFF04420C010A22FF0000034E0C48
:1008B000020A80EDFF43CF045A0C030A8012DDFFC9
:1008C00022CF04640C020A80FDFF22CF04700C02C8
:1008D0000A80F9FF0000017C0C00DDFFF9FF0286B1
:1008E0000C00FDFFF9FF02900C00C5CF0000019A3B
:1008F0000C0113DDFFE5FF02A00C00FDFFE5FF0288
:10090000A80C00C1CF000001B00C0113DDFFE1FF16
:1009100002B60C00FDFFE1FF02BE0C004E4F50007E
:100920004A5020002C20004A5220004A5220432CDA
:1009300020004A52204E432C20004A52205A2C209C
:10094000004A52204E5A2C20004A502028484C2958
:1009500020004A50202849582920004A5020284980
:1009600059292000444A4E5A200043414C4C200053
:10097000524554200052455449005245544E0052AD
:10098000535420004C4420412C28424329004C441D
:1009900020412C28444529004C4420412C28006843
:1009A00029004C4420284243292C2041004C44205B
:1009B000284445292C2041004C4420280068292C3B
:1009C0002041004C4420004C4420412C2049004C44
:1009D0004420412C2052004C4420492C2041004C02
:1009E0004420522C2041004441410043504C004ED1
:1009F000454700434346005343460048414C54009A
:100A0000444900454900494D203000494D203100FE
:100A1000494D20320045582044452C20484C004583
:100A2000582041462C204146E280B20045585800EB
:100A3000455820285350292C20484C004558202840
:100A40005350292C20495800455820285350292C10
:100A5000204959004C4449004C444952004C4444FC
:100A6000004C444452004350490043504952004313
:100A7000504400435044520041444420412C200043
:100A800041444420412C202849582B00682900412A
:100A9000444420412C202849592B00682900414416
:100AA0004320412C200041444320412C2028495818
:100AB0002B0068290041444320412C202849592B10
:100AC00000682900535542200053554220284958B8
:100AD0002B00682900535542202849592B006829CA
:100AE0000053424320412C200053424320412C28F4
:100AF00049582B0068290053424320412C2849596A
:100B00002B00682900414E442000414E44202849D2
:100B1000582B00682900414E44202849592B006871
:100B200029004F5220004F52202849582B00682995
:100B3000004F52202849592B00682900584F522055
:100B400000584F52202849582B00682900584F520E
:100B5000202849592B006829004350200043502089
:100B60002849582B006829004350202849592B0058
:100B7000682900494E432000494E43202849582BFC
:100B800000682900494E43202849592B0068290054
:100B90004445432000444543202849582B006829F8
:100BA00000444543202849592B006829004144440A
:100BB00020484C2C200041444320484C2C2000531A
:100BC000424320484C2C20004144442049582C20CA
:100BD000004144442049592C2000494E43200049FB
:100BE0004E432049582C2000494E432049592C207F
:100BF0000044454320004445432049582C200044EC
:100C000045432049592C20004C4420002C20004C06
:100C1000442049582C20004C442049592C20004C99
:100C20004420484C2C2028006829004C4420002CEB
:100C30002028006829004C442049582C20280068AE
:100C400029004C442049592C2028006829004C4494
:100C500020280068292C20484C004C44202800689B
:100C6000292C20004C4420280068292C20495800B9
:100C70004C4420280068292C204959004C4420531A
:100C8000502C20484C004C442053502C20495800F4
:100C90004C442053502C20495900505553482000B3
:100CA0005055534820495800505553482049590041
:100CB000505553482000505553482049580050552E
:100CC0005348204959002E3F2E0020202020004E5E
:100CD0005A5A004E434300504F504550004D004279
:100CE000434445484C53504243444549585350426D
:100CF0004344454959535042434445484C41462892
:100D0000484C2900CDD700C9C5D5E5CD1F01F5F167
:100D1000E1D1C1C93E00C9F5D53E08D3F4CD2F0DB0
:100D20003E00D3F4CD2F0D1B7AB320EDD1F1C9C510
:100D3000ED44ED440B79B0C2300DC1C93E80D333D0
:100D40003E80D33200AFD332C9F53E80D333F1D3E6
:100D50003078E61FD332F620D3320078E61FD33244
:100D600000AFD332C93E92D33378E61FD332F64078
:100D7000D33200F5F1F5F1F5F1F5F1DB30F5AFD354
:100D800032F1C90EFF060FCD650DCB47C2040ECB65
:100D90005F28F23E92D3333E08D332F640D332007E
:100DA0000000DB317723DB30772379B7CAB20D0D32
:100DB00018D3C90EFF1100101B7AB3CAEE0D060F2F
:100DC000CD650DCB47C2040ECB5F28EC1100083E69
:100DD00092D3333E08D332F640D332000000DB30EA
:100DE0007723DB31772379B7CAB20D0D18CA216694
:100DF0000ECDDF0079CD07013E0ACDD7003E0DCDE7
:100E0000D700C9C921370ECDDF00060FCD650DCD46
:100E1000070121540ECDDF003A2C40CD0701215DA2
:100E20000ECDDF000609CD650DCD07013E0ACDD7F9
:100E3000003E0DCDD700C90D0A4469736B20492FC0
:100E40004F206572726F722E205374617475733AFD
:100E500020307800204465763A20307800204572B2
:100E6000723A203078000D0A4469736B20492F4F85
:100E7000206572726F722E20446174612074696DF6
:100E8000656F75742040203078000000000000007D
:100E90000000000000000000000000000000000052
:100EA0000000000000000000000000000000000042
:100EB0000000000000000000000000000000000032
:100EC0000000000000000000000000000000000022
:100ED0000000000000000000000000000000000012
:100EE0000000000000000000000000000000000002
:100EF00000000000000000000000000000000000F2
:100F000000000000000000000000000000000000E1
:100F100000000000000000000000000000000000D1
:100F200000000000000000000000000000000000C1
:100F300000000000000000000000000000000000B1
:100F400000000000000000000000000000000000A1
:100F50000000000000000000000000000000000091
:100F60000000000000000000000000000000000081
:100F70000000000000000000000000000000000071
:100F80000000000000000000000000000000000061
:100F90000000000000000000000000000000000051
:100FA0000000000000000000000000000000000041
:100FB0000000000000000000000000000000000031
:100FC0000000000000000000000000000000000021
:100FD0000000000000000000000000000000000011
:100FE0000000000000000000000000000000000001
:100FF00000000000000000000000000000000000F1
:1010000000000000000000000000000000000000E0
:1010100000000000000000000000000000000000D0
:1010200000000000000000000000000000000000C0
:1010300000000000000000000000000000000000B0
:1010400000000000000000000000000000000000A0
:101050000000000000000000000000000000000090
:101060000000000000000000000000000000000080
:101070000000000000000000000000000000000070
:101080000000000000000000000000000000000060
:101090000000000000000000000000000000000050
:1010A0000000000000000000000000000000000040
:1010B0000000000000000000000000000000000030
:1010C0000000000000000000000000000000000020
:1010D0000000000000000000000000000000000010
:1010E0000000000000000000000000000000000000
:1010F00000000000000000000000000000000000F0
:1011000000000000000000000000000000000000DF
:1011100000000000000000000000000000000000CF
:1011200000000000000000000000000000000000BF
:1011300000000000000000000000000000000000AF
:10114000000000000000000000000000000000009F
:10115000000000000000000000000000000000008F
:10116000000000000000000000000000000000007F
:10117000000000000000000000000000000000006F
:10118000000000000000000000000000000000005F
:10119000000000000000000000000000000000004F
:1011A000000000000000000000000000000000003F
:1011B000000000000000000000000000000000002F
:1011C000000000000000000000000000000000001F
:1011D000000000000000000000000000000000000F
:1011E00000000000000000000000000000000000FF
:1011F00000000000000000000000000000000000EF
:1012000000000000000000000000000000000000DE
:1012100000000000000000000000000000000000CE
:1012200000000000000000000000000000000000BE
:1012300000000000000000000000000000000000AE
:10124000000000000000000000000000000000009E
:10125000000000000000000000000000000000008E
:10126000000000000000000000000000000000007E
:101270000000000000FF000000000000000000303F
:101280000077400000FF0000000000000000003078
:10129000019F400000FF000000000000000000402F
:1012A00000C7400000FF00000000000000000040F8
:1012B00001EF400000217512113640014000EDB0F1
:1012C0003E00327640AF327740329F4032C74032E4
:1012D000EF40C9CDF100211015CDDF0021364006C9
:1012E000003A7640B8CAEC123E2018023E2ACDD70A
:1012F0000078C645CDD7003E3ACDD7003E20CDD7A9
:1013000000E57EB7280EFE01280FFE022810FEFF22
:101310002811180F214815180D2153151808215EA2
:10132000151803216915CDDF00E1233E30CDD7002C
:101330003E78CDD7007ECD07013E20CDD70023E5F6
:10134000DDE12323232323232323DD7E03CD070194
:10135000DD7E02CD0701DD7E01CD0701DD7E00CD02
:1013600007013E20CDD700DD7E07CD0701DD7E06DB
:10137000CD0701DD7E05CD0701DD7E04CD07013EF1
:1013800020CDD7003E30CDD7003E78CDD7007ECDE2
:1013900007013E20CDD700237EE5B7CAA413217CE8
:1013A00015C3A713217415CDDF00E123C57E4F239C
:1013B0007E4723E56069CDDF00CDF100E1C1232345
:1013C0000478FE04C8C3E112CD9714CD3C0D01FF93
:1013D0005F060FCD650DB7280BCB77200C1B7AB3BA
:1013E000280218EDDD360001C9DD360002060F3E89
:1013F000ECCD490D211741CD830D214D41DD7E0CF2
:101400005FDD7E0D57012800EDB03E01060ACD4993
:101410000D3E01060BCD490D3E00060CCD490D3E9B
:1014200000060DCD490D3EA0060ECD490D3E20060D
:101430000FCD490D211741CDB30D06040E00FD213E
:10144000D542FD7E04B7C25414C34C14111000FDE4
:101450001910EFC9FD7E04DD7701FE0E20EEFD7E42
:1014600008DD7702FD7E09DD7703FD7E0ADD770466
:10147000FD7E0BDD7705DD360000FD7E0CDD770699
:10148000FD7E0DDD7707FD7E0EDD7708FD7E0FDD2D
:101490007709DD360000C9F5C53A7640070707062B
:1014A000004FDD213640DD09C1F1C921F014CDDF47
:1014B00000CDB512CDC813210815CDDF00C9060A2D
:1014C000CD490D7E060BCD490D237E060CCD490D71
:1014D000237E060DCD490D237EE60FF6E0060ECDE8
:1014E000490D3E20060FCD490D211741CDB30DC941
:1014F0000D0A446574656374696E67206472697669
:101500006573202E2E2E2000646F6E65210D0A005B
:1015100044525620537461747573202020205479EE
:101520007065204C42412020202020204C656E67B1
:101530007468202020506F7274204D2F532020207B
:10154000204E616D650A0D00417661696C20202096
:101550002020004E6F7420466F756E642000556E1B
:101560006B6F776E20465320004374726C2E2045BB
:10157000727220004D61737465722000536C617645
:1015800065202000CDE61579E6FECD7C16CD1C1633
:10159000B7C2A8157E23CD7C16CD1C16B7C2A815E0
:1015A00010F2CDFB153E00C9CDFB153E01C905CD9E
:1015B000E61579F601CD7C16CD1C16B7C2D715CD30
:1015C000A2167723CD421610F6CDA2167723CD5F53
:1015D00016CDFB153E00C9CDFB153E01C93ECFD34C
:1015E000F63EF0D3F6C93ECFD3F63EFCD3F63E022C
:1015F000D3F400003E00D3F40000C93ECFD3F63E42
:10160000FCD3F63E02D3F400003E03D3F400003EC8
:10161000CFD3F600003EF7D3F60000C93ECFD3F695
:101620003EFDD3F600003E00D3F40000EE02D3F4FA
:1016300000DBF40000F5E6FEEE02D3F40000F1E674
:1016400001C93ECFD3F63EFCD3F600003E00D3F4F2
:1016500000003E02D3F400003E00D3F40000C93E77
:10166000CFD3F63EFCD3F600003E02D3F400003E9A
:1016700003D3F400003E02D3F40000C9C54F3ECFAF
:10168000D3F63EFCD3F60608CB113E0017D3F40088
:1016900000EE02D3F40000EE02D3F4000010E9796A
:1016A000C1C9C53ECFD3F63EFDD3F606080E00AF46
:1016B000D3F400003E02D3F400DBF4001FCB11AFE3
:1016C000D3F4000010E979C1C9E5212417CDDF006A
:1016D000E178B7CA2317050E107CCD07017DCD0731
:1016E000013E20CDD7007ECD07013E20CDD700237F
:1016F0000D20F3C5E506000E10ED427E23FE20DA34
:101700000C17FE7FD20C17CDD70018053E2ECDD773
:10171000000DC2FB16E1C13E0ACDD7003E0DCDD76C
:101720000018AEC90D0A4241534520302020312017
:101730002032202033202034202035202036202045
:1017400037202038202039202041202042202043EB
:101750002020442020452020462020415343494951
:101760000D0A007E23CDD70010F9C96461746500AD
:10177000901A7365746461746500281C70696E202A
:1017800000A91964756D7020001819706F757420A8
:1017900000BF1969696E2000401A696F75742000D6
:1017A000E01963616C6C2000F818636C72008C1A8D
:1017B0006461736D200079196A702000DF187273FC
:1017C000740000006C7364736B00A11C73656C641F
:1017D000736B2000A51C2400DF186900A9196F0095
:1017E000BF19210048193F001819FFCDF1003E3EF6
:1017F000CDD700AF320040CD1F01CAF717FE0DCA8A
:101800004C18FE0ACAF717FE08CA2618F5212B4005
:1018100016003A00405F193C320040F177CDD70006
:1018200023AF77C3F7173A0040A7CAF7173D320036
:10183000405F1600212B4019AF773E08CDD7003E00
:1018400020CDD7003E08CDD700C3F717216B171165
:101850002B407EFEFFCA7E181A477EB0CA87181A30
:10186000477EA8B7CA6E187EB7CA87181805231313
:1018700018E6237EB7C27218232323C34F1821B85A
:1018800018CDDF00C3EB17E5C1030A6F030A67CD6C
:101890009518C3EB17E921A418CDDF00C921CC1896
:1018A000CDDF00C90A0D6E6F7420696D706C656DB7
:1018B000656E7465640A0D000A0D696E76616C6967
:1018C0006420636F6D6D616E640A0D000A0D696EB0
:1018D00076616C69642073796E7461780A0D00D545
:1018E000E1CD6401477BA7C29D182323CD64014F3E
:1018F0007BA7C29D186069E9D5E1CD6401477BA74C
:10190000C29D182323CD64014F7BA7C29D18606937
:10191000CD1719CDF100C9E9D5E1CD6401477BA709
:10192000C29D182323CD64014F7BA7C29D1823239A
:101930007EFE20C29D1823CD6401F57BA7C29D18B1
:10194000F1606947CDC916C9D5E1CD6401477BA7D0
:10195000C29D182323CD64014F7BA7C29D1823236A
:101960007EFE00C8FE20C29D1823CD6401027BA725
:10197000C29D18032323C36019D5E1CD6401477BC1
:10198000A7C29D182323CD64014F7BA7C29D1823B6
:10199000237EFE20C29D1823CD6401F57BA7C29D46
:1019A000186069F147CDB501C9D5E1CD64014F7B20
:1019B000A7C29D18ED78F5CDF100F1CD0701C9D58D
:1019C000E1CD64014F7BA7C29D1823237EFE20C278
:1019D0009D1823CD6401F57BA7C29D18F1ED79C94F
:1019E000D5E1CD6401320C407BA7C29D18232301B1
:1019F0000D40AF320B407EFE00CA121AFE20C29D7F
:101A00001823CD640102033A0B403C320B402323E0
:101A100018E4210D403A0B40473A0C404FCD841555
:101A2000B7C2251AC9212C1ACDDF00C90A0D62756B
:101A3000732D6572726F723A206E6F2041434B00B6
:101A4000D5E1CD64014F7BA7C29D1823237EFE20E4
:101A5000C29D1823CD640147C57BA7C29D18210BE9
:101A600040CDAE15C1B7C2251A217F1ACDDF0021A6
:101A70000B407ECD07013E20CDD7002310F4C90ACC
:101A80000D7265632D627566663A2000CDEA00C965
:101A9000CDF100214B1B06010ED0CD8415B7C22518
:101AA0001A210B4006080ED0CDAE15B7C2251A3A42
:101AB0000D40E6301F1F1F1FCD19013A0D40E60FE4
:101AC000CD19013E3ACDD7003A0C40E6701F1F1FDA
:101AD0001FCD19013A0C40E60FCD19013E3ACDD782
:101AE000003A0B40E6701F1F1F1FCD19013A0B4033
:101AF000E60FCD19013E20CDD7003A0F40E6301F4A
:101B00001F1F1FCD19013A0F40E60FCD19013E2EC0
:101B1000CDD7003A1040E6101F1F1F1FCD19013A04
:101B20001040E60FCD19013E2ECDD7003E32CDD765
:101B3000003E30CDD7003A1140E6F01F1F1F1FCDE9
:101B400019013A1140E60FCD1901C9000A0D456E81
:101B50007465722044617465202020202830302D67
:101B6000333129203A20000A0D456E746572204DEC
:101B70006F6E74682020202830302D313229203AB1
:101B800020000A0D456E746572205965617220202F
:101B900020202830302D393929203A20000A0D45DF
:101BA0006E74657220486F75727320202028303063
:101BB0002D323329203A20000A0D456E74657220BB
:101BC0004D696E75746573202830302D35392920A4
:101BD0003A20000A0D456E746572205365636F6E7E
:101BE0006473202830302D353929203A20002069AF
:101BF0006E7661696C6420696E7075742E20526512
:101C00007472792100E5CDDF00E1CD3101FEFFCA1C
:101C10001D1C47CD3101FEFFCA1D1C4FC9E521EE39
:101C20001BCDDF00E1C3051CAF320B40214C1BCDA7
:101C3000051C78CD9C1CE630B132104021671BCDCD
:101C4000051C78CD9C1CE610B132114021821BCDC1
:101C5000051C78CD9C1CE6F0B1321240219D1BCDB5
:101C6000051C78CD9C1CE630B1320E4021B81BCD4E
:101C7000051C78CD9C1CE670B1320D4021D31BCDE4
:101C8000051C78CD9C1CE670B1320C40130ED006BA
:101C900008210B40CD8415B7C2251AC907070707CD
:101CA000C9CDD312C9D5E17EDE453808FE04300423
:101CB000CD0080C921C41CCDDF00112000017000BF
:101CC000CD170DC90A0D496E76616C696420647286
:101CD000697665206C65747465720A0D00CDED1C23
:101CE000CD121DCD6A1DCD3D1DCD501DC921E11D5B
:101CF000CDDF00DBF6FE00C2061D3E0032094021AA
:101D00006A1ECDDF00C93EFF32094021321ECDDF01
:101D100000C921FC1DCDDF003EFFD3F80000DBF839
:101D2000FEFFC2311D3E00320A40216A1ECDDF0097
:101D3000C93EFF320A4021321ECDDF00C921AB1D52
:101D4000CDDF00DB30B7C2631D216A1ECDDF00C9C5
:101D500021C61DCDDF00DB40B7C2631D216A1ECD49
:101D6000DF00C921321ECDDF00C93E06320B402103
:101D7000171ECDDF00210B4006010ED0CD8415B714
:101D8000C29D1D210B4006010ED0CDAE153A0B4071
:101D9000B7CAA41D216A1ECDDF00C3931A21321ECB
:101DA000CDDF00C921401ECDDF00C90D0A436865A3
:101DB000636B204469736B6374726C2E40303330F4
:101DC000682E2E2E20000D0A436865636B2044693F
:101DD000736B6374726C2E40303430682E2E2E205C
:101DE000000D0A436865636B20494F2D436F6E7485
:101DF000726F6C6C6572202E2E2E20000D0A4368C7
:101E000065636B20414D44383931312041505520B4
:101E100020202E2E2E20000D0A436865636B20447F
:101E2000533133303720525443202020202E2E2E81
:101E300020006E6F742064657465637465642100AE
:101E40006E6F74207365742E20436865636B206227
:101E500061747465727920616E642072756E2027DA
:101E6000736574646174652721006F6B2120005ACB
:101E70003843204D6F6E69746F722056322E3120B8
:101E800062792044656E6E69732047756E696120C2
:0C1E900028323032322D3230323429003A
:00000001FF

File diff suppressed because it is too large Load Diff

View File

@@ -1,24 +1,30 @@
;This file is generated by the build script.
;Do not make any changes here!
AY0_WRITE_REG equ 0x91
A_RTS_OFF equ 0x312
A_RTS_ON equ 0x31B
CMD_DASM equ 0x239
CMD_EXEC equ 0x12F
CMD_IO_READ equ 0x21D
CMD_IO_WRITE equ 0x1F4
CMD_SET equ 0x1B8
CMD_SET_END equ 0x1EE
CMD_SET_LOOP equ 0x1D3
CMD_SYNTAX_ERROR equ 0x272
CMD_VIEW equ 0x14E
CMD_VIEW_END equ 0x1B2
CMD_VIEW_ROW equ 0x187
CMD_VIEW_ROW_LOOP equ 0x199
CONSOLE_INIT equ 0x27E
CONSOLE_INIT_CTC equ 0x27E
CONSOLE_INIT_SIO equ 0x286
ADDR_RTC equ 0xD0
A_RTS_OFF equ 0x152
A_RTS_ON equ 0x15B
BOOT_PHASE0 equ 0x50
BOOT_PHASE1 equ 0x6E
BOOT_PHASE1_LOOP equ 0x77
BOOT_PHASE2 equ 0x82
COMMAND equ 0x17EB
COMMAND_BACKSPACE equ 0x1826
COMMAND_LUT equ 0x176B
COMMAND_PROCESS equ 0x184C
COMMAND_PROCESS_FOUND equ 0x1887
COMMAND_PROCESS_LOOP equ 0x184F
COMMAND_PROCESS_LOOP_STR1 equ 0x1858
COMMAND_PROCESS_LOOP_STR2 equ 0x186E
COMMAND_PROCESS_NEXT_ENTRY equ 0x1873
COMMAND_PROCESS_NEXT_ENTRYI equ 0x1872
COMMAND_PROCESS_NOT_FOUND equ 0x187E
COMMAND_READ equ 0x17F7
CONSOLE_INIT equ 0x9E
CONSOLE_INIT_CTC equ 0x9E
CONSOLE_INIT_SIO equ 0xA6
CS_APU_CTRL equ 0xF9
CS_APU_DATA equ 0xF8
CS_BANK equ 0x00
CS_CTC_0 equ 0x04
CS_CTC_1 equ 0x05
@@ -37,16 +43,18 @@ CS_SIO_A_C equ 0x09
CS_SIO_A_D equ 0x08
CS_SIO_B_C equ 0x0B
CS_SIO_B_D equ 0x0A
DHEX_TO_BYTE equ 0x324
DHEX_TO_BYTE_FAILED equ 0x340
EXEC_RST_08 equ 0xEC4
EXEC_RST_10 equ 0xEC8
EXEC_RST_18 equ 0xED4
HEX_TO_BIN equ 0x344
HEX_TO_BIN_2 equ 0x352
HEX_TO_INVALID_2 equ 0x359
DHEX_TO_BYTE equ 0x164
DHEX_TO_BYTE_FAILED equ 0x180
ERR_SYNTAX equ 0x189D
EXEC_RST_08 equ 0xD04
EXEC_RST_10 equ 0xD08
EXEC_RST_18 equ 0xD14
HEX_TO_BIN equ 0x184
HEX_TO_BIN_2 equ 0x192
HEX_TO_INVALID_2 equ 0x199
IDE_CMD_IDENT equ 0xEC
IDE_CMD_READSEC equ 0x20
IDE_DEV_TABLE equ 0x1275
IDE_RD equ 0x40
IDE_REG_ALTSTS equ 0x16
IDE_REG_CMDSTS equ 0x0F
@@ -55,12 +63,19 @@ IDE_REG_DRVADDR equ 0x17
IDE_REG_ERROR equ 0x09
IDE_REG_HCYL equ 0x0D
IDE_REG_HEAD equ 0x0E
IDE_REG_LBA0 equ 0x0B
IDE_REG_LBA1 equ 0x0C
IDE_REG_LBA2 equ 0x0D
IDE_REG_LBA3 equ 0x0E
IDE_REG_LCYL equ 0x0C
IDE_REG_SECTOR equ 0x0A
IDE_REG_SSECTOR equ 0x0B
IDE_RST equ 0x80
IDE_WR equ 0x20
IIC_CLK equ 0x01
IIC_DATA equ 0x02
INT_VEC equ 0x1B
IN_BUFFER equ 0x402B
IO_AY0_ADDR equ 0x40
IO_AY0_DATA equ 0x41
IO_AY1_ADDR equ 0x42
@@ -82,277 +97,360 @@ IO_RTC_SEC1 equ 0x21
IO_RTC_WEEK equ 0x2C
IO_RTC_YEAR1 equ 0x2B
IO_RTC_YERR0 equ 0x2A
Includes equ 0x27E
MEM_IDE_BASE equ 0x5000
MEM_IDE_BUFFER equ 0x5041
MEM_IDE_DEVICE equ 0x5000
MEM_IDE_PARTITION equ 0x5002
MEM_IDE_POINTER equ 0x5006
MEM_IDE_STATUS equ 0x5001
MEM_INT_VEC_T equ 0x40FE
MEM_LOC_LOAD equ 0x4400
MEM_VAR_BLOCK equ 0x40FB
MEM_VAR_TIMEA equ 0x40FC
MEM_VAR_TIMER equ 0x40FE
MSG_CLEAR equ 0x30A
MSG_ERROR equ 0x1048
MSG_START equ 0x1061
MEM_IDE_BUFFER equ 0x4117
MEM_IDE_DEVICE equ 0x402C
MEM_IDE_DEV_TABLE equ 0x4036
MEM_IDE_FSBUFFER equ 0x4317
MEM_IDE_PARTITION equ 0x402E
MEM_IDE_POINTER equ 0x4032
MEM_IDE_SELECTED equ 0x4076
MEM_IDE_STATUS equ 0x402D
MEM_IDE_STRING_0 equ 0x4077
MEM_IDE_STRING_1 equ 0x409F
MEM_IDE_STRING_2 equ 0x40C7
MEM_IDE_STRING_3 equ 0x40EF
MSG_CLEAR equ 0x14A
NOT_IMPLEMENTED equ 0x1896
OP_CALL equ 0x18F8
OP_CLR equ 0x1A8C
OP_DASM equ 0x1979
OP_DUMP equ 0x1918
OP_EXEC equ 0x18DF
OP_IIC_IN equ 0x1A40
OP_IIC_OUT equ 0x19E0
OP_IO_IN equ 0x19A9
OP_IO_OUT equ 0x19BF
OP_LSDSK equ 0x1CA1
OP_RTIME equ 0x1A90
OP_SELDSK equ 0x1CA5
OP_SET equ 0x1948
OP_STIME equ 0x1C28
POST_CHECK_APU equ 0x1D12
POST_CHECK_IDE_30 equ 0x1D3D
POST_CHECK_IDE_40 equ 0x1D50
POST_CHECK_PIO equ 0x1CED
POST_START equ 0x1CDD
POST_TEST_RTC equ 0x1D6A
PRG_RAM_START equ 0x4110
PRG_RAM_TOP equ 0xFF00
PROG_MEM_START equ 0x4000
PROG_ROM_START equ 0x100
PROMPT_BEGIN equ 0x99
PROMPT_BEGIN_READ_BACKSPACE equ 0xD6
PROMPT_BEGIN_READ_LOOP equ 0xA5
PROMPT_BEGIN_READ_PROCESS equ 0xFC
RST_00 equ 0x00
RST_08 equ 0x08
RST_10 equ 0x10
RST_18 equ 0x18
STACK_RAM_TOP equ 0xFFFF
START_ROM equ 0x00
STRCONV_BYTES_TO_HEX equ 0x35B
STRCONV_BYTES_TO_HEX_1 equ 0x36A
STRCONV_BYTES_TO_HEX_2 equ 0x374
STR_Banner_Start equ 0x1360
STR_HEXDUMP_HEADER equ 0x1390
STR_PD_HEADER equ 0x1319
STR_SyntaxError equ 0x1386
STR_Unknown equ 0x138B
SYM_ACK equ 0x06
SYM_C equ 0x43
SYM_CAN equ 0x18
SYM_EOT equ 0x04
SYM_ETB equ 0x17
SYM_NAK equ 0x15
SYM_SOH equ 0x01
STRCONV_BYTES_TO_HEX equ 0x19B
STRCONV_BYTES_TO_HEX_1 equ 0x1AA
STRCONV_BYTES_TO_HEX_2 equ 0x1B4
STR_Banner_Start equ 0x1E6F
STR_PD_HEADER equ 0x1724
SYS_BUF_START equ 0x4010
SYS_RAM_START equ 0x4000
VAR_CONSOLE_BAUD equ 0x18
VAR_CONSOLE_CONF equ 0x0F
VDP_MEM equ 0x80
VDP_REG equ 0x81
beep equ 0xED7
beep_loop equ 0xEDA
beep_pause equ 0xEF7
dasm_00 equ 0xADC
dasm_01 equ 0xDC8
dasm_02 equ 0xB62
dasm_03 equ 0xD9A
dasm_08 equ 0xBDF
dasm_09 equ 0xD6D
dasm_0A equ 0xB44
dasm_0B equ 0xDB1
dasm_10 equ 0xB24
dasm_12 equ 0xB6D
dasm_18 equ 0xAE7
dasm_1A equ 0xB4E
dasm_20 equ 0xB01
dasm_22 equ 0xE0E
dasm_27 equ 0xBA7
dasm_28 equ 0xAFA
dasm_2A equ 0xDDF
dasm_2F equ 0xBAB
dasm_30 equ 0xAF2
dasm_32 equ 0xB78
dasm_37 equ 0xBB7
dasm_38 equ 0xAEB
dasm_3A equ 0xB58
dasm_3F equ 0xBB3
dasm_76 equ 0xBBB
dasm_80C6 equ 0xC38
dasm_BE equ 0xBD5
dasm_C3 equ 0xAE0
dasm_C88E equ 0xC5E
dasm_C9 equ 0xB30
dasm_CD equ 0xB2A
dasm_D9 equ 0xBEC
dasm_DD equ 0xB12
dasm_DD_01 equ 0xDCF
dasm_DD_09 equ 0xD88
dasm_DD_22 equ 0xE24
dasm_DD_23 equ 0xD9F
dasm_DD_2A equ 0xDF6
dasm_DD_2B equ 0xDB6
dasm_DD_34 equ 0xD38
dasm_DD_35 equ 0xD55
dasm_DD_86 equ 0xC40
dasm_DD_8E equ 0xC66
dasm_DD_96 equ 0xC89
dasm_DD_9E equ 0xCA9
dasm_DD_A6 equ 0xCCA
dasm_DD_AE equ 0xD01
dasm_DD_B6 equ 0xCE6
dasm_DD_BE equ 0xD1D
dasm_DD_E1 equ 0xE76
dasm_DD_E3 equ 0xBFC
dasm_DD_E5 equ 0xE60
dasm_DD_F9 equ 0xE46
dasm_E1 equ 0xE70
dasm_E3 equ 0xBF0
dasm_E5 equ 0xE5A
dasm_E9 equ 0xB09
dasm_ED_42 equ 0xD7F
dasm_ED_43 equ 0xE1A
dasm_ED_44 equ 0xBAF
dasm_ED_45 equ 0xB3A
dasm_ED_46 equ 0xBC6
dasm_ED_4A equ 0xD76
dasm_ED_4B equ 0xDEB
dasm_ED_4D equ 0xB35
dasm_ED_56 equ 0xBCB
dasm_ED_5E equ 0xBD0
dasm_ED_A0 equ 0xC14
dasm_ED_A1 equ 0xC26
dasm_ED_A8 equ 0xC1D
dasm_ED_A9 equ 0xC2F
dasm_ED_B0 equ 0xC18
dasm_ED_B1 equ 0xC2A
dasm_ED_B8 equ 0xC21
dasm_ED_B9 equ 0xC33
dasm_F3 equ 0xBC0
dasm_F9 equ 0xE3C
dasm_FB equ 0xBC3
dasm_FD equ 0xB1B
dasm_FD_01 equ 0xDD7
dasm_FD_09 equ 0xD91
dasm_FD_22 equ 0xE30
dasm_FD_23 equ 0xDA8
dasm_FD_2A equ 0xE02
dasm_FD_2B equ 0xDBF
dasm_FD_34 equ 0xD44
dasm_FD_35 equ 0xD61
dasm_FD_86 equ 0xC4F
dasm_FD_8E equ 0xC75
dasm_FD_96 equ 0xC95
dasm_FD_9E equ 0xCB7
dasm_FD_A6 equ 0xCD6
dasm_FD_AE equ 0xD0D
dasm_FD_B6 equ 0xCF1
dasm_FD_BE equ 0xD28
dasm_FD_E1 equ 0xE7E
dasm_FD_E3 equ 0xC08
dasm_FD_E5 equ 0xE68
dasm_FD_F9 equ 0xE50
dasm_FF equ 0xB3F
dasm_UU equ 0xE86
dasm_UW equ 0xE8A
dasm__AND equ 0xCC5
dasm__CP equ 0xD19
dasm__DEC equ 0xD50
dasm__ED_47 equ 0xB97
dasm__ED_4F equ 0xB9F
dasm__ED_57 equ 0xB87
dasm__ED_5F equ 0xB8F
dasm__INC equ 0xD33
dasm__LD equ 0xB83
dasm__OR equ 0xCE2
dasm__SBC equ 0xCA1
dasm__SUB equ 0xC84
dasm__XOR equ 0xCFC
dasm_opcode_table equ 0x684
dasm_print16hex_addr equ 0x4B1
dasm_print8hex equ 0x4C9
dasm_printFlags_table equ 0xE8F
dasm_printRegister8_table equ 0xE9F
dasm_printRegister8_table_HL equ 0xEBF
dasm_printRegisterIX_table equ 0xEA7
dasm_printRegisterIY_table equ 0xEAF
dasm_printRegisterSP_table equ 0xEB7
disassemble equ 0x375
disassemble_continue equ 0x45B
disassemble_err equ 0x44B
disassemble_next equ 0x379
disassemble_print_opcode_params_end equ 0x448
disassemble_print_opcode_params_loop equ 0x3F4
disassemble_print_opcode_raw equ 0x3B6
disassemble_print_opcode_raw_fill equ 0x3CA
disassemble_table_first_match equ 0x48D
disassemble_table_found equ 0x4A7
disassemble_table_notfound equ 0x4AB
disassemble_table_seek equ 0x469
disassemble_table_seek_loop equ 0x46D
dump_pretty equ 0x12BE
dump_pretty_ascii equ 0x12E8
dump_pretty_ascii_cont equ 0x1306
dump_pretty_ascii_loop equ 0x12F0
dump_pretty_ascii_none equ 0x1301
dump_pretty_col equ 0x12DB
dump_pretty_end equ 0x1318
dump_pretty_nextrow equ 0x130C
dump_pretty_row equ 0x12C6
ide_printerror equ 0x116E
ide_readsector_256 equ 0x10ED
ide_readsector_256_done equ 0x111C
ide_readsector_256_waitloop equ 0x10EF
ide_readsector_512_inv equ 0x111D
ide_readsector_512_inv_waitloop equ 0x1122
ide_readsector_timeout equ 0x1158
ide_regread_8 equ 0x10CF
ide_regwrite_8 equ 0x10B3
ide_reset equ 0x10A6
ide_writesector_256 equ 0x116D
ideif_init_drive equ 0x11F4
ideif_init_drive_detected equ 0x1222
ideif_init_drive_loop1 equ 0x1208
ideif_init_drive_nodrv equ 0x121B
mon_start_complete equ 0x7B
mon_start_init_ctc equ 0x50
mon_start_init_serial equ 0x64
mon_start_init_sound equ 0x50
mon_start_ram equ 0x67
mon_start_ram_loop equ 0x70
_COMMAND_PROCESS_FOUND equ 0x1895
_OP_CALL equ 0x1917
_OP_IIC_ACK_ERR equ 0x1A25
_OP_IIC_ACK_ERR_str equ 0x1A2C
_OP_IIC_IN_LOOP equ 0x1A72
_OP_IIC_IN_LOOP_TEXT equ 0x1A7F
_OP_IIC_OUT_LOOP equ 0x19F6
_OP_IIC_OUT_SEND equ 0x1A12
_OP_RTIME_NN equ 0x1A93
_OP_RTIME_RD_CMD equ 0x1B4B
_OP_SELDSK_INVALID equ 0x1CB4
_OP_SELDSK_INVALID_STR equ 0x1CC4
_OP_SET_LOOP equ 0x1960
_OP_STIME_INVALID equ 0x1BEE
_OP_STIME_PROMPT equ 0x1C05
_OP_STIME_PROMPT_ERR equ 0x1C1D
_OP_STIME_STR_DAY equ 0x1B4C
_OP_STIME_STR_HOUR equ 0x1B9D
_OP_STIME_STR_MIN equ 0x1BB8
_OP_STIME_STR_MON equ 0x1B67
_OP_STIME_STR_SEC equ 0x1BD3
_OP_STIME_STR_YEAR equ 0x1B82
_POST_CHECK_APU_FAILED equ 0x1D31
_POST_CHECK_IDE_FAILED equ 0x1D63
_POST_CHECK_PIO_FAILED equ 0x1D06
_POST_TEST_RTC_INVALID equ 0x1DA4
_POST_TEST_RTC_NOTFOUND equ 0x1D9D
_STR_NOT_FOUND equ 0x18B8
_STR_NOT_IMPLEMENTED equ 0x18A4
_STR_SYNTAX equ 0x18CC
_beep_pause_l1 equ 0xD30
_ideif_init_drive_found equ 0x13E9
_ideif_init_drive_loop equ 0x13D1
_ideif_init_drive_nodrv equ 0x13E4
_ideif_init_drive_prt_fnd equ 0x1454
_ideif_init_drive_prt_l1 equ 0x1442
_ideif_init_drive_prt_ln equ 0x144C
_ideif_prnt_devtable_hdr equ 0x1510
_ideif_prnt_devtable_l1 equ 0x12E1
_ideif_prnt_devtable_l1_e2 equ 0x13A7
_ideif_prnt_devtable_l1_es equ 0x1326
_ideif_prnt_devtable_l1_ms equ 0x13A4
_ideif_prnt_devtable_l1_nxt equ 0x12EE
_ideif_prnt_devtable_l1_s00 equ 0x1314
_ideif_prnt_devtable_l1_s01 equ 0x1319
_ideif_prnt_devtable_l1_s02 equ 0x131E
_ideif_prnt_devtable_l1_sFF equ 0x1323
_ideif_prnt_devtable_l1_sel equ 0x12EC
_ideif_prnt_devtable_master equ 0x1574
_ideif_prnt_devtable_s00 equ 0x1548
_ideif_prnt_devtable_s01 equ 0x1553
_ideif_prnt_devtable_s02 equ 0x155E
_ideif_prnt_devtable_sFF equ 0x1569
_ideif_prnt_devtable_slave equ 0x157C
_read_bcd_invalid equ 0x147
_shift4 equ 0x1C9C
beep equ 0xD17
beep_loop equ 0xD19
beep_pause equ 0xD2F
dasm_00 equ 0x91C
dasm_01 equ 0xC08
dasm_02 equ 0x9A2
dasm_03 equ 0xBDA
dasm_08 equ 0xA1F
dasm_09 equ 0xBAD
dasm_0A equ 0x984
dasm_0B equ 0xBF1
dasm_10 equ 0x964
dasm_12 equ 0x9AD
dasm_18 equ 0x927
dasm_1A equ 0x98E
dasm_20 equ 0x941
dasm_22 equ 0xC4E
dasm_27 equ 0x9E7
dasm_28 equ 0x93A
dasm_2A equ 0xC1F
dasm_2F equ 0x9EB
dasm_30 equ 0x932
dasm_32 equ 0x9B8
dasm_37 equ 0x9F7
dasm_38 equ 0x92B
dasm_3A equ 0x998
dasm_3F equ 0x9F3
dasm_76 equ 0x9FB
dasm_80C6 equ 0xA78
dasm_BE equ 0xA15
dasm_C3 equ 0x920
dasm_C88E equ 0xA9E
dasm_C9 equ 0x970
dasm_CD equ 0x96A
dasm_D9 equ 0xA2C
dasm_DD equ 0x952
dasm_DD_01 equ 0xC0F
dasm_DD_09 equ 0xBC8
dasm_DD_22 equ 0xC64
dasm_DD_23 equ 0xBDF
dasm_DD_2A equ 0xC36
dasm_DD_2B equ 0xBF6
dasm_DD_34 equ 0xB78
dasm_DD_35 equ 0xB95
dasm_DD_86 equ 0xA80
dasm_DD_8E equ 0xAA6
dasm_DD_96 equ 0xAC9
dasm_DD_9E equ 0xAE9
dasm_DD_A6 equ 0xB0A
dasm_DD_AE equ 0xB41
dasm_DD_B6 equ 0xB26
dasm_DD_BE equ 0xB5D
dasm_DD_E1 equ 0xCB6
dasm_DD_E3 equ 0xA3C
dasm_DD_E5 equ 0xCA0
dasm_DD_F9 equ 0xC86
dasm_E1 equ 0xCB0
dasm_E3 equ 0xA30
dasm_E5 equ 0xC9A
dasm_E9 equ 0x949
dasm_ED_42 equ 0xBBF
dasm_ED_43 equ 0xC5A
dasm_ED_44 equ 0x9EF
dasm_ED_45 equ 0x97A
dasm_ED_46 equ 0xA06
dasm_ED_4A equ 0xBB6
dasm_ED_4B equ 0xC2B
dasm_ED_4D equ 0x975
dasm_ED_56 equ 0xA0B
dasm_ED_5E equ 0xA10
dasm_ED_A0 equ 0xA54
dasm_ED_A1 equ 0xA66
dasm_ED_A8 equ 0xA5D
dasm_ED_A9 equ 0xA6F
dasm_ED_B0 equ 0xA58
dasm_ED_B1 equ 0xA6A
dasm_ED_B8 equ 0xA61
dasm_ED_B9 equ 0xA73
dasm_F3 equ 0xA00
dasm_F9 equ 0xC7C
dasm_FB equ 0xA03
dasm_FD equ 0x95B
dasm_FD_01 equ 0xC17
dasm_FD_09 equ 0xBD1
dasm_FD_22 equ 0xC70
dasm_FD_23 equ 0xBE8
dasm_FD_2A equ 0xC42
dasm_FD_2B equ 0xBFF
dasm_FD_34 equ 0xB84
dasm_FD_35 equ 0xBA1
dasm_FD_86 equ 0xA8F
dasm_FD_8E equ 0xAB5
dasm_FD_96 equ 0xAD5
dasm_FD_9E equ 0xAF7
dasm_FD_A6 equ 0xB16
dasm_FD_AE equ 0xB4D
dasm_FD_B6 equ 0xB31
dasm_FD_BE equ 0xB68
dasm_FD_E1 equ 0xCBE
dasm_FD_E3 equ 0xA48
dasm_FD_E5 equ 0xCA8
dasm_FD_F9 equ 0xC90
dasm_FF equ 0x97F
dasm_UU equ 0xCC6
dasm_UW equ 0xCCA
dasm__AND equ 0xB05
dasm__CP equ 0xB59
dasm__DEC equ 0xB90
dasm__ED_47 equ 0x9D7
dasm__ED_4F equ 0x9DF
dasm__ED_57 equ 0x9C7
dasm__ED_5F equ 0x9CF
dasm__INC equ 0xB73
dasm__LD equ 0x9C3
dasm__OR equ 0xB22
dasm__SBC equ 0xAE1
dasm__SUB equ 0xAC4
dasm__XOR equ 0xB3C
dasm_opcode_table equ 0x4C4
dasm_print16hex_addr equ 0x2F1
dasm_print8hex equ 0x309
dasm_printFlags_table equ 0xCCF
dasm_printRegister8_table equ 0xCDF
dasm_printRegister8_table_HL equ 0xCFF
dasm_printRegisterIX_table equ 0xCE7
dasm_printRegisterIY_table equ 0xCEF
dasm_printRegisterSP_table equ 0xCF7
disassemble equ 0x1B5
disassemble_continue equ 0x29B
disassemble_err equ 0x28B
disassemble_next equ 0x1B9
disassemble_print_opcode_params_end equ 0x288
disassemble_print_opcode_params_loop equ 0x234
disassemble_print_opcode_raw equ 0x1F6
disassemble_print_opcode_raw_fill equ 0x20A
disassemble_table_first_match equ 0x2CD
disassemble_table_found equ 0x2E7
disassemble_table_notfound equ 0x2EB
disassemble_table_seek equ 0x2A9
disassemble_table_seek_loop equ 0x2AD
dump_pretty equ 0x16C9
dump_pretty_ascii equ 0x16F3
dump_pretty_ascii_cont equ 0x1711
dump_pretty_ascii_loop equ 0x16FB
dump_pretty_ascii_none equ 0x170C
dump_pretty_col equ 0x16E6
dump_pretty_end equ 0x1723
dump_pretty_nextrow equ 0x1717
dump_pretty_row equ 0x16D1
ide_printerror equ 0xE04
ide_readsector_256 equ 0xD83
ide_readsector_256_done equ 0xDB2
ide_readsector_256_waitloop equ 0xD85
ide_readsector_512_inv equ 0xDB3
ide_readsector_512_inv_waitloop equ 0xDB8
ide_readsector_timeout equ 0xDEE
ide_regread_8 equ 0xD65
ide_regwrite_8 equ 0xD49
ide_reset equ 0xD3C
ide_writesector_256 equ 0xE03
ideif_get_drv_pointer equ 0x1497
ideif_init_all equ 0x14AB
ideif_init_devtable equ 0x12B5
ideif_init_drive equ 0x13C8
ideif_prnt_devtable equ 0x12D3
iic_init equ 0x15DD
iic_read_ack equ 0x161C
iic_receive_buffer equ 0x15AE
iic_receive_buffer_done equ 0x15D1
iic_receive_buffer_err equ 0x15D7
iic_receive_buffer_loop equ 0x15BF
iic_receive_byte equ 0x16A2
iic_receive_byte_loop equ 0x16AF
iic_send_ack equ 0x1642
iic_send_buffer equ 0x1584
iic_send_buffer_done equ 0x15A2
iic_send_buffer_err equ 0x15A8
iic_send_buffer_loop equ 0x1594
iic_send_byte equ 0x167C
iic_send_byte_loop equ 0x1688
iic_send_ebit equ 0x15FB
iic_send_nack equ 0x165F
iic_send_sbit equ 0x15E6
mon_var_template equ 0x44
mon_var_template_end equ 0x6E
param_01 equ 0x4D7
param_02 equ 0x4FE
param_03 equ 0x51B
param_03_done equ 0x553
param_03_neg equ 0x53C
param_04 equ 0x557
param_04_i equ 0x567
param_05 equ 0x56D
param_06 equ 0x57A
param_07 equ 0x594
param_08 equ 0x5A1
param_09 equ 0x5B6
param_09_0A equ 0x5BC
param_0A equ 0x5AD
param_10 equ 0x5CB
param_11 equ 0x5DB
param_11_12 equ 0x5EA
param_11_12_all equ 0x60A
param_11_12_def equ 0x5FD
param_11_12_ix equ 0x602
param_11_12_iy equ 0x607
param_12 equ 0x5E3
param_13 equ 0x61B
param_80 equ 0x63A
param_80_seek equ 0x641
param_81 equ 0x631
param_comma equ 0x675
param_printRegister equ 0x650
param_printRegisterA equ 0x66E
param_printRegisterHL equ 0x666
print_a_hex equ 0x2E7
print_char equ 0x2B7
print_clear equ 0x2CA
print_newLine equ 0x2D1
print_str equ 0x2BF
print_str_end equ 0x2C9
print_str_fixed equ 0x1358
print_wait_out equ 0x2DC
read_char equ 0x2F8
read_lba_sector equ 0x1256
str_dev_notfound equ 0x12B3
str_dev_ready equ 0x129D
str_dev_ready2 equ 0x12AA
str_dev_waitready equ 0x1289
str_error_start equ 0x11A1
str_error_start1 equ 0x11BE
str_error_start2 equ 0x11C7
str_error_time equ 0x11D0
var_buffer equ 0x4029
mon_var_template_end equ 0x370
param_01 equ 0x317
param_02 equ 0x33E
param_03 equ 0x35B
param_03_done equ 0x393
param_03_neg equ 0x37C
param_04 equ 0x397
param_04_i equ 0x3A7
param_05 equ 0x3AD
param_06 equ 0x3BA
param_07 equ 0x3D4
param_08 equ 0x3E1
param_09 equ 0x3F6
param_09_0A equ 0x3FC
param_0A equ 0x3ED
param_10 equ 0x40B
param_11 equ 0x41B
param_11_12 equ 0x42A
param_11_12_all equ 0x44A
param_11_12_def equ 0x43D
param_11_12_ix equ 0x442
param_11_12_iy equ 0x447
param_12 equ 0x423
param_13 equ 0x45B
param_80 equ 0x47A
param_80_seek equ 0x481
param_81 equ 0x471
param_comma equ 0x4B5
param_printRegister equ 0x490
param_printRegisterA equ 0x4AE
param_printRegisterHL equ 0x4A6
print_a_hex equ 0x107
print_bcd equ 0x119
print_char equ 0xD7
print_clear equ 0xEA
print_newLine equ 0xF1
print_str equ 0xDF
print_str_end equ 0xE9
print_str_fixed equ 0x1763
print_wait_out equ 0xFC
read_bcd equ 0x131
read_char equ 0x11F
read_lba_sector equ 0x14BE
str_dev_done equ 0x1508
str_dev_waitready equ 0x14F0
str_error_start equ 0xE37
str_error_start1 equ 0xE54
str_error_start2 equ 0xE5D
str_error_time equ 0xE66
str_post_apu equ 0x1DFC
str_post_ide_30 equ 0x1DAB
str_post_ide_40 equ 0x1DC6
str_post_nd equ 0x1E32
str_post_ok equ 0x1E6A
str_post_pio equ 0x1DE1
str_post_rtc equ 0x1E17
str_post_rtc_iv equ 0x1E40
var_apu_present equ 0x400A
var_buffer equ 0x402B
var_buffer_len equ 0x4000
var_bytes_count equ 0x411A
var_curserchar equ 0x4006
@@ -361,6 +459,7 @@ var_curseron equ 0x4005
var_curserstate equ 0x4004
var_curserx equ 0x4002
var_cursery equ 0x4003
var_idebuffer equ 0x402C
var_last_char equ 0x4001
var_opcode equ 0x4114
var_opcode_length equ 0x4116
@@ -369,26 +468,6 @@ var_opcode_start equ 0x4110
var_opcode_string equ 0x4117
var_opcode_table equ 0x4112
var_opcode_x equ 0x4115
var_ps2mem equ 0x4019
var_scratch equ 0x4009
xmodem_ack equ 0x107B
xmodem_await_conn equ 0xF34
xmodem_end equ 0xFDF
xmodem_err equ 0xFA5
xmodem_init equ 0xF06
xmodem_int equ 0xFE6
xmodem_int_cont equ 0x1005
xmodem_nak equ 0x1089
xmodem_out equ 0x1037
xmodem_packet equ 0xF3F
xmodem_packet_EOT equ 0xF9D
xmodem_packet_get equ 0xF51
xmodem_packet_get_crc equ 0xF8A
xmodem_packet_get_data equ 0xF7B
xmodem_read_timeount equ 0x03
xmodem_read_wait equ 0x100A
xmodem_read_wait_loop equ 0x1018
xmodem_read_wait_timeout equ 0x1035
xmodem_wait equ 0x1097
xmodem_wait_1 equ 0x109D
xmodem_wait_out equ 0x103D
var_pio_present equ 0x4009
var_ps2mem equ 0x401B
var_scratch equ 0x400B