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

@@ -1,21 +1,55 @@
; VARS
MEM_FAT_RESERVED .EQU MEM_IDE_BASE + 10 ; Reserved sectors (2byte)
MEM_FAT_AMOUNT .EQU MEM_IDE_BASE + 12 ; Amount of FATs (1byte)
MEM_FAT_SECTORS .EQU MEM_IDE_BASE + 13 ; Length of FAT (2byte)
phase MEM_IDE_FSBUFFER
MEM_FAT_RESERVED: ; Reserved sectors (2byte)
defs 2
MEM_FAT_AMOUNT: ; Amount of FATs (1byte)
defs 1
MEM_FAT_SECTORS: ; Length of FAT (2byte)
defs 2
MEM_FAT_COUNT1: ; Counter Var for reading FAT (2byte)
defs 1
MEM_FAT_TMPPOINTER: ; Temporary working pointer
defs 4
MEM_FAT_TMPPOINTER1: ; Temporary working pointer
defs 4
MEM_FAT_TMPFNAME: ; Temporary filename
defs 16
MEM_FAT_COUNT1 .EQU MEM_IDE_BASE + 15 ;Counter Var for reading FAT (2byte)
MEM_FAT_OF0_CCLUST: ;Current cluster of file
defw 0
MEM_FAT_OF0_FATSEC: ;Current sector in FAT
defs 4
MEM_FAT_OF0_DATSEC: ;Current sector in Data
defs 4
MEM_FAT_OF0_DATREM: ;Remaining sector in Data
defs 2
dephase
;-------------------------------------
; Get FAT Root-Table position
;-------------------------------------
fat_get_root_table:
call fat_reset_pointer ;reset fat pointer
;call fat_print_dbg
; Load first sector on active partition
LD HL, MEM_IDE_PARTITION ; pointer to LBA address
LD HL, MEM_IDE_POINTER ; pointer to LBA address
LD A,1 ;read 1 sector
call read_lba_sector
; check for valid Boot sector
ld a,(MEM_IDE_BUFFER)
cp 0xEB ;first byte should be 0xEB
jp nz, _fat_get_root_table_invalid
;debug sector
;ld hl, MEM_IDE_BUFFER
;ld b,20
;call dump_pretty
; Read and store FS Properties
LD IX,MEM_IDE_BUFFER
LD A,(IX+0x0E)
@@ -53,35 +87,54 @@ _fat_get_root_table_loop: ; multiply
call _fat_math_sector_add_16
ret
_fat_get_root_table_invalid:
call PRINTINLINE
db 10,13,"Cannot find boot sector.",10,13,0
call ideif_get_drv_pointer
ld (ix+0),0x02
ret
;-------------------------------------
; Print current fat directory of MEM_IDE_POINTER
;-------------------------------------
fat_print_directory:
LD A,10 ;New line
CALL print_char
LD A,13
CALL print_char
LD DE,(MEM_FAT_SECTORS)
LD (MEM_FAT_COUNT1),DE
LD HL,MEM_IDE_POINTER ;read first sector
LD B,1
call read_lba_sector
call PRINTINLINE
db 10,13," Filename Cluster Size",10,13,0
LD HL, MEM_IDE_BUFFER ;set buffer start
LD C,16 ;set entries counter
_fat_print_directory_loop: ;loop over each entry (32byte)
LD A,(HL) ; check first byte
PUSH HL ;backup start of entry
POP IX
PUSH HL
;ignore unwanted entries
CP 0x41 ;skip invisible
JR Z, _fat_print_directory_loop_next
JP Z, _fat_print_directory_loop_next
CP 0xE5 ;skip deleted
JR Z, _fat_print_directory_loop_next
JP Z, _fat_print_directory_loop_next
CP 0x00 ;reached end
JP Z, _fat_print_directory_loop_break
;check file attribute
ld a,(IX+0x0B)
cp 0x10 ;if subdirectors
jp z, _fat_print_directory_dir ;print dir
;else print file
_fat_print_directory_loop_file
;print filename
ld a,' '
call print_char
ld a,' '
call print_char
LD B,8
call print_str_fixed
ld A,'.'
@@ -89,14 +142,49 @@ _fat_print_directory_loop: ;loop over each entry (32byte)
LD B,3
call print_str_fixed
LD A,(HL) ; print attribute
call print_char
call PRINTINLINE
db " 0x",0
;first cluster number
ld a,(ix+0x1B)
call print_a_hex
ld a,(ix+0x1A)
call print_a_hex
call PRINTINLINE
db " 0x",0
ld a,(ix+0x1F)
call print_a_hex
ld a,(ix+0x1E)
call print_a_hex
ld a,(ix+0x1D)
call print_a_hex
ld a,(ix+0x1C)
call print_a_hex
LD A,10 ;New line
CALL print_char
LD A,13
CALL print_char
jr _fat_print_directory_loop_next
_fat_print_directory_dir
ld a,'D'
call print_char
ld a,' '
call print_char
LD B,8
call print_str_fixed
call PRINTINLINE
db " 0x",0
;first cluster number
ld a,(ix+0x1B)
call print_a_hex
ld a,(ix+0x1A)
call print_a_hex
LD A,10 ;New line
CALL print_char
LD A,13
CALL print_char
jr _fat_print_directory_loop_next
_fat_print_directory_loop_next: ; read next entry
DEC C ;next sector after 32 entries
@@ -130,12 +218,12 @@ _fat_print_directory_loop_next_sector: ; end fo sector. read next sector from d
_fat_print_directory_loop_break
POP HL
_fat_print_directory_loop_break_dirty
ld hl, [str_sum]
call print_str ;print
ld a,c
call print_a_hex
ld hl, [str_files]
call print_str ;print
; ld hl, [str_sum]
; call print_str ;print
; ld a,c
; call print_a_hex
; ld hl, [str_files]
; call print_str ;print
ret
;-------------------------------------
@@ -145,7 +233,7 @@ _fat_print_directory_loop_break_dirty
;-------------------------------------
fat_lfs:
PUSH DE
LD HL,MEM_IDE_BASE + 17 ; prepare filename
LD HL,[MEM_FAT_TMPFNAME] ; prepare filename
CALL format_filename_fat16
LD A,16 ;init counter for FAT sectors
@@ -216,27 +304,79 @@ _fat_lfs_loop_compare_match:
; 32 Bit addition to pointer
; HL has value
_fat_math_sector_add_16:
LD IX,MEM_IDE_POINTER; LOAD IX to sector pointer in memory
LD A,L
ADD A,(IX+3)
LD (IX+3),A
JR NC, _fat_math_sector_add_16_2 ;if no carry, continue
LD A,1
ADD A,(IX+2)
_fat_math_sector_add_16_2:
LD A,h
ADD A,(IX+2)
LD (IX+2),A
RET NC ;done when no carry
LD A,1
ADD A,(IX+1)
LD (IX+1),A
RET
ld (MEM_FAT_TMPPOINTER), hl
xor a
ld (MEM_FAT_TMPPOINTER+2),a
ld (MEM_FAT_TMPPOINTER+3),a
; reset LBA pointer to first sector in partition
ld de,[MEM_FAT_TMPPOINTER]
ld bc,[MEM_IDE_POINTER]
call _fat_math_add32
ret
;bc contains pointer to a (also result)
;de contains pointer to b
_fat_math_add32
push hl
push bc
push de
ld a,(de) ; load lower 16bit for B int from (DE) to HL
ld l,a
inc de
ld a,(de)
ld h,a
inc de
; HL, DE dirty
ld a,(bc) ; load lower 16bit for A int from (BC) to DE
ld e,a
inc bc
ld a,(bc)
ld d,a
; HL now contains A, DE now contains D
add hl,de ;add lower bytes, store carry
pop de ;restore pointers
pop bc ;both now cointain first byte of long-value
ld a,l ;store lower result in (bc)
ld (bc),a
inc bc
ld a,h
ld (bc),a
inc bc
inc de ;also increment de to next byte
inc de
; DE and HL now start at the upper byte
push bc
push de
ld a,(de) ; load upper 16bit for B
ld l,a
inc de
ld a,(de)
ld h,a
inc de
ld a,(bc) ; load upper 16bit for A
ld e,a
inc bc
ld a,(bc)
ld d,a
adc hl,de ;add upper bytes, store carry
pop de
pop bc
ld a,l ;store lower result in (bc)
ld(bc),a
inc bc
ld a,h
ld(bc),a
pop hl
ret
; reset LBA pointer to first sector in selected partition
fat_reset_pointer:
LD HL,MEM_IDE_PARTITION
LD DE,MEM_IDE_POINTER
call ideif_get_drv_pointer
inc ix
inc ix
push ix
pop hl ;copy poiter to hl
ld de, MEM_IDE_POINTER
jr fat_copy_lba_pointer
; resets LBA pointer (4-byte) to partition start
@@ -318,5 +458,5 @@ _format_filename_fat16_loop_copy:
str_file_notfound:
db "File not found!",13,10,0
str_file_found:
str_file_found:
db " File located!",13,10,0

View File

@@ -0,0 +1,69 @@
;1. find sector for given cluster
;2. read sector
;3. store first data sector to MEM_FAT_OF0_DATSEC
;4. set MEM_FAT_OF0_DATREM to amount uf sectors per cluster
;5. find next cluster in FAt and update MEM_FAT_OF0_CCLUST
; gets sector in FAT table for the cluster stored in MEM_FAT_OF0_CCLUST
; store result in MEM_FAT_OF0_FATSEC
; stores next cluster in MEM_FAT_OF0_CCLUST
fat_getfatsec:
ld HL,(MEM_FAT_OF0_CCLUST) ;load cluster
;each sector contains 256 clusters
;first 8bits are not needed (/256)
ld a,h ;divide by 256
ld l,a
xor a
ld h,a
ld bc,(MEM_FAT_RESERVED) ;add reserved sectors
add hl,bc
ld(MEM_FAT_OF0_FATSEC+0),hl;store sector to MEM_FAT_TMPPOINTER1
xor a
ld(MEM_FAT_OF0_FATSEC+2),a
ld(MEM_FAT_OF0_FATSEC+3),a
call ideif_get_drv_pointer
inc ix
inc ix
push ix
pop de ;copy poiter to hl
ld bc,[MEM_FAT_OF0_FATSEC]
call _fat_math_add32 ;MEM_FAT_OF0_FATSEC now contains the correct sector
;in the FAT
call fat_print_dbg
;read FAT sector
ld hl,MEM_FAT_OF0_FATSEC ;read next sector
ld b,1
call read_lba_sector
ld hl, MEM_IDE_BUFFER
ld b,20
call dump_pretty
;calculate offset address
ld a,(MEM_FAT_OF0_CCLUST)
RLA ;shift to left (x2)
ld l, a
ld a,0
RLA ;shift in carry flag
ld h,a
ld de,MEM_IDE_BUFFER
add hl,de
;copy pointer
ld de,MEM_FAT_OF0_CCLUST
ldi ;copy byte for next cluster from FAT
ldi
call fat_print_dbg
ret
;store data

View File

@@ -1,141 +1,170 @@
.include "extern_symbols.s" ;include monitor symbols.
org 0xB000
;Testing code
org 0x8000
;LD HL,MEM_IDE_BUFFER
;LD B,32
;call dump_pretty
call find_partition
;call fat_get_root_table
;call fat_print_directory
sel_dsk:
call ideif_drv_sel
call fat_print_dbg
ret
call fat_get_root_table
LD DE, [str1]
CALL fat_lfs
org 0x8010
call fat_print_dbg
ret
org 0x8020
call fat_print_directory
ret
org 0x8030
ld hl,0x0006
ld (MEM_FAT_OF0_CCLUST),hl
call fat_getfatsec
ret
fat_print_dbg:
call PRINTINLINE
db 10,13,"PTR.MEM_IDE_POINTER: 0x",0
ld ix,MEM_IDE_POINTER
call print_32_hex
call PRINTINLINE
db " | PTR.MEM_IDE_PARTITION: 0x",0
ld ix,MEM_IDE_PARTITION
call print_32_hex
call PRINTINLINE
db 10,13,"PTR.MEM_FAT_TMPPOINTER: 0x",0
ld ix,MEM_FAT_TMPPOINTER
call print_32_hex
call PRINTINLINE
db " | PTR.MEM_FAT_TMPPOINTER1: 0x",0
ld ix,MEM_FAT_TMPPOINTER1
call print_32_hex
call PRINTINLINE
db 10,13,"VAL.MEM_FAT_RESERVED: 0x",0
ld ix,MEM_FAT_RESERVED
call print_16_hex
call PRINTINLINE
db " | VAL.MEM_FAT_AMOUNT: 0x",0
ld a,(MEM_FAT_AMOUNT)
call print_a_hex
call PRINTINLINE
db 10,13,"VAL.MEM_FAT_SECTORS: 0x",0
ld ix,MEM_FAT_SECTORS
call print_16_hex
call PRINTINLINE
db " | VAL.MEM_FAT_COUNT1: 0x",0
ld a,(MEM_FAT_COUNT1)
call print_a_hex
call PRINTINLINE
db 10,13,"VAL.MEM_FAT_OF0_CCLUST: 0x",0
ld ix,MEM_FAT_OF0_CCLUST
call print_16_hex
call PRINTINLINE
db " | PTR.MEM_FAT_OF0_FATSEC: 0x",0
ld ix,MEM_FAT_OF0_FATSEC
call print_32_hex
call PRINTINLINE
db 10,13,"VAL.MEM_FAT_OF0_DATSEC: 0x",0
ld ix,MEM_FAT_OF0_DATSEC
call print_32_hex
call PRINTINLINE
db " | PTR.MEM_FAT_OF0_DATREM: 0x",0
ld ix,MEM_FAT_OF0_DATREM
call print_16_hex
call print_newLine
ret
print_32_hex:
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
ret
print_16_hex:
ld a,(ix+1)
call print_a_hex
ld a,(ix+0)
call print_a_hex
ret
; a contains drive to select
; populate fs vars as well
ideif_drv_sel:
ld (MEM_IDE_SELECTED),a
push af
call ideif_get_drv_pointer ;test if drive is marked as available
ld a,(ix+0)
or a
jp nz, _ideif_drv_sel_fail ;if not-> fail
JP PROMPT_BEGIN
call fat_get_root_table ;else get root table
;backup tmp pointer
ld hl,(MEM_IDE_POINTER)
ld de,(MEM_IDE_PARTITION) ;use MEM_IDE_PARTITION to backup the pointer
call fat_copy_lba_pointer
ld hl,[_ideif_drv_sel_pstr] ;print success message
call print_str
pop af
add 69
call print_char
ld hl,[_ideif_drv_sel_sstr0]
call print_str
ret
_ideif_drv_sel_fail:
ld hl,[_ideif_drv_sel_pstr]
call print_str
pop af
add 69
call print_char
ld hl,[_ideif_drv_sel_fstr0]
call print_str
LD DE,0x20
LD BC,0x70
CALL beep
ret
str1:
db "ILLUSION.PSG",0
str2:
db "HALLOWLT.TXT",0
str3:
db "TEST",0
str4:
db ".ORG",0
_ideif_drv_sel_pstr:
db 10,13,"Drive ",0
_ideif_drv_sel_fstr0:
db ": not ready",10,13,0
_ideif_drv_sel_sstr0:
db ": selected",10,13,0
_ideif_drv_sel_syn:
db 10,13,"Invalid drive letter",10,13,0
.include "fat16.s" ;include monitor symbols.
.include "fat16_file.s" ;include monitor symbols.
delay_small:
PUSH AF
POP AF
PUSH AF
POP AF
RET
find_partition:
;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
LD B,4 ;Partition table length
LD C,0 ;Partition ID counter
LD IX,MEM_IDE_BUFFER+446 ;Load offest of first partition table entry
find_partition_loop:
LD A,(IX+4) ;load status byte
OR A
JP NZ, find_partition_process ;If not zero, jump to print function
jp find_partition_next
find_partition_next:
LD A,10 ;New line
CALL print_char
LD A,13
CALL print_char
LD DE,16
ADD IX,DE
DJNZ find_partition_loop
RET
find_partition_process: ; process table entry
ld hl, [str_part_seek_1]
call print_str ;print
LD A,(IX+0x04) ;load type
call print_a_hex
LD A,(IX+0x04) ;load type
CP 0x0E
JR NZ, find_partition_next
ld hl, [str_part_seek_2]
call print_str ;print
ld hl, [str_part_seek_3]
call print_str ;print
LD A,(IX+0x08) ;load start LBA
LD (MEM_IDE_PARTITION+3),A
LD A,(IX+0x09) ;load start LBA
LD (MEM_IDE_PARTITION+2),A
LD A,(IX+0x0A) ;load start LBA
LD (MEM_IDE_PARTITION+1),A
LD A,(IX+0x0B) ;load start LBA
LD (MEM_IDE_PARTITION+0),A
LD A,(MEM_IDE_PARTITION+3)
call print_a_hex
LD A,(MEM_IDE_PARTITION+2)
call print_a_hex
LD A,(MEM_IDE_PARTITION+1)
call print_a_hex
LD A,(MEM_IDE_PARTITION+0)
call print_a_hex
ld hl, [str_part_seek_4]
call print_str ;print
LD A,(IX+0x0C) ;load count LBA
call print_a_hex
LD A,(IX+0x0D) ;load count LBA
call print_a_hex
LD A,(IX+0x0E) ;load count LBA
call print_a_hex
LD A,(IX+0x0F) ;load count LBA
call print_a_hex
LD A,10 ;New line
CALL print_char
LD A,13
CALL print_char
RET
str_part_seek_1:
db "- Type: 0x",0
str_part_seek_2:
db " State: ",0
str_part_seek_3:
db " LBA: 0x",0
str_part_seek_4:
db " Len: 0x",0
str_sum:
db "------------",10,13,0
str_files:
db " Files",10,13,0
.include "include/fat16.s"
;------------------------------------------------------------------------------
; PRINTINLINE
;
; String output function
;
; Prints in-line data (bytes immediately following the PRINTINLINE call)
; until a string terminator is encountered (0 - null char).
;------------------------------------------------------------------------------
PRINTINLINE:
EX (SP),HL ; PUSH HL and put RET ADDress into HL
PUSH AF
PUSH BC
nxtILC:
LD A,(HL)
CP 0
JR Z,endPrint
CALL print_char
INC HL
JR nxtILC
endPrint:
INC HL ; Get past "null" terminator
POP BC
POP AF
EX (SP),HL ; PUSH new RET ADDress on stack and restore HL
RET

View File

@@ -0,0 +1,141 @@
.include "extern_symbols.s" ;include monitor symbols.
org 0xB000
;Testing code
;LD HL,MEM_IDE_BUFFER
;LD B,32
;call dump_pretty
call find_partition
;call fat_get_root_table
;call fat_print_directory
call fat_get_root_table
LD DE, [str1]
CALL fat_lfs
JP PROMPT_BEGIN
str1:
db "ILLUSION.PSG",0
str2:
db "HALLOWLT.TXT",0
str3:
db "TEST",0
str4:
db ".ORG",0
delay_small:
PUSH AF
POP AF
PUSH AF
POP AF
RET
find_partition:
;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
LD B,4 ;Partition table length
LD C,0 ;Partition ID counter
LD IX,MEM_IDE_BUFFER+446 ;Load offest of first partition table entry
find_partition_loop:
LD A,(IX+4) ;load status byte
OR A
JP NZ, find_partition_process ;If not zero, jump to print function
jp find_partition_next
find_partition_next:
LD A,10 ;New line
CALL print_char
LD A,13
CALL print_char
LD DE,16
ADD IX,DE
DJNZ find_partition_loop
RET
find_partition_process: ; process table entry
ld hl, [str_part_seek_1]
call print_str ;print
LD A,(IX+0x04) ;load type
call print_a_hex
LD A,(IX+0x04) ;load type
CP 0x0E
JR NZ, find_partition_next
ld hl, [str_part_seek_2]
call print_str ;print
ld hl, [str_part_seek_3]
call print_str ;print
LD A,(IX+0x08) ;load start LBA
LD (MEM_IDE_PARTITION+3),A
LD A,(IX+0x09) ;load start LBA
LD (MEM_IDE_PARTITION+2),A
LD A,(IX+0x0A) ;load start LBA
LD (MEM_IDE_PARTITION+1),A
LD A,(IX+0x0B) ;load start LBA
LD (MEM_IDE_PARTITION+0),A
LD A,(MEM_IDE_PARTITION+3)
call print_a_hex
LD A,(MEM_IDE_PARTITION+2)
call print_a_hex
LD A,(MEM_IDE_PARTITION+1)
call print_a_hex
LD A,(MEM_IDE_PARTITION+0)
call print_a_hex
ld hl, [str_part_seek_4]
call print_str ;print
LD A,(IX+0x0C) ;load count LBA
call print_a_hex
LD A,(IX+0x0D) ;load count LBA
call print_a_hex
LD A,(IX+0x0E) ;load count LBA
call print_a_hex
LD A,(IX+0x0F) ;load count LBA
call print_a_hex
LD A,10 ;New line
CALL print_char
LD A,13
CALL print_char
RET
str_part_seek_1:
db "- Type: 0x",0
str_part_seek_2:
db " State: ",0
str_part_seek_3:
db " LBA: 0x",0
str_part_seek_4:
db " Len: 0x",0
str_sum:
db "------------",10,13,0
str_files:
db " Files",10,13,0
.include "include/fat16.s"

View File

@@ -1,51 +1,99 @@
:10B00000CD38B0CD42B1110FB0CD1AB2C3990049BD
:10B010004C4C5553494F4E2E5053470048414C4CD1
:10B020004F574C542E5458540054455354002E4FEF
:10B03000524700F5F1F5F1C93E01060ACDB3103EC5
:10B0400001060BCDB3103E00060CCDB3103E00063A
:10B050000DCDB3103EA0060ECDB3103E20060FCD91
:10B06000B310214150CD1D1106040E00DD21FF510A
:10B07000DD7E04B7C28CB0C37AB03E0ACDB7023EC3
:10B080000DCDB702111000DD1910E5C92104B1CDB5
:10B09000BF02DD7E04CDE702DD7E04FE0E20DB2153
:10B0A0000FB1CDBF022118B1CDBF02DD7E08320540
:10B0B00050DD7E09320450DD7E0A320350DD7E0B06
:10B0C0003202503A0550CDE7023A0450CDE7023A39
:10B0D0000350CDE7023A0250CDE7022121B1CDBFA6
:10B0E00002DD7E0CCDE702DD7E0DCDE702DD7E0EBA
:10B0F000CDE702DD7E0FCDE7023E0ACDB7023E0D61
:10B10000CDB702C92D20547970653A2030780020DF
:10B1100053746174653A2000204C42413A203078E3
:10B1200000204C656E3A203078002D2D2D2D2D2DD0
:10B130002D2D2D2D2D2D0A0D002046696C65730ACD
:10B140000D00CDA7B22102503E01CD5612DD2141A6
:10B1500050DD7E0E320A50DD7E0F320B50DD7E1048
:10B16000320C50DD7E16320D50DD7E17320E503A15
:10B170000E50573A0D505FAF676F3A0C5047191099
:10B18000FD16003A0A505F19CD84B2C93E0ACDB708
:10B19000023E0DCDB702ED5B0D50ED530F50210671
:10B1A000500601CD56122141500E107EE5FE412879
:10B1B00026FEE52822FE00CA08B20608CD58133E36
:10B1C0002ECDB7020603CD58137ECDB7023E0ACD71
:10B1D000B7023E0DCDB7020D2808E111200019C3BA
:10B1E000ABB1E126002E01CD84B2ED5B0F501BED1B
:10B1F000530F507AB3CA09B22106500601CD561238
:10B200002141500E10C3ABB1E1212AB1CDBF02796B
:10B21000CDE7022139B1CDBF02C9D5211150CDCE24
:10B22000B23E10320F502106500601CD5612214178
:10B23000500E10D1D5CDB8B238330D2807112000EB
:10B2400019C333B226002E01CD84B23A0F503D32DD
:10B250000F50CA65B22106500601CD561221415049
:10B260000E10C333B2D121F3B2CDBF02C9D106084B
:10B27000CD58133E2ECDB7020603CD58132105B38A
:10B28000CDBF02C9DD2106507DDD8603DD770330A9
:10B29000053E01DD86027CDD8602DD7702D03E01BF
:10B2A000DD8601DD7701C92102501106501800C565
:10B2B00006000E04EDB0C1C9E5C5060B1A4F7EA904
:10B2C00020070520F7C1E137C9C1E1373FC9060BA7
:10B2D000E5AF772310FCE1060D1AB7C805C8FE2EAE
:10B2E000200A1378FE0538F1230518F71A7723137F
:10B2F000C3D9B246696C65206E6F7420666F756E37
:10B3000064210D0A002046696C65206C6F636174CE
:06B310006564210D0A0036
:07800000CD5A82CD3A80C980
:04801000CD3A80C91C
:04802000CD8583C9BE
:10803000210600223543CDBB85C9CD0C860A0D50E3
:1080400054522E4D454D5F4944455F504F494E5463
:1080500045523A20202020307800DD213240CD34B6
:1080600082CD0C8620207C20205054522E4D454D30
:108070005F4944455F504152544954494F4E3A205C
:108080002020307800DD212E40CD3482CD0C860AB0
:108090000D5054522E4D454D5F4641545F544D5046
:1080A000504F494E5445523A20307800DD211D434F
:1080B000CD3482CD0C8620207C20205054522E4D71
:1080C000454D5F4641545F544D50504F494E5445C5
:1080D00052313A20307800DD212143CD3482CD0C5D
:1080E000860A0D56414C2E4D454D5F4641545F5218
:1080F000455345525645443A202020307800DD2132
:108100001743CD4D82CD0C862020202020207C20BE
:108110002056414C2E4D454D5F4641545F414D4FD9
:10812000554E543A2020202020203078003A194320
:10813000CD0701CD0C860A0D56414C2E4D454D5FA5
:108140004641545F534543544F52533A2020202018
:10815000307800DD211A43CD4D82CD0C86202020C1
:108160002020207C202056414C2E4D454D5F46411D
:10817000545F434F554E54313A2020202020203068
:1081800078003A1C43CD0701CD0C860A0D56414CB0
:108190002E4D454D5F4641545F4F46305F43434C43
:1081A0005553543A20307800DD213543CD4D82CDF2
:1081B0000C862020202020207C20205054522E4D40
:1081C000454D5F4641545F4F46305F4641545345ED
:1081D000433A2020307800DD213743CD3482CD0C66
:1081E000860A0D56414C2E4D454D5F4641545F4F1A
:1081F00046305F4441545345433A20307800DD21F6
:108200003B43CD3482CD0C8620207C20205054521C
:108210002E4D454D5F4641545F4F46305F444154BB
:1082200052454D3A2020307800DD213F43CD4D822C
:10823000CDF100C9DD7E03CD0701DD7E02CD070152
:10824000DD7E01CD0701DD7E00CD0701C9DD7E01A8
:10825000CD0701DD7E00CD0701C9327640F5CD970F
:1082600014DD7E00B7C28882CD0B832A3240ED5BDD
:108270002E40CD548521A482CDDF00F1C645CDD757
:108280000021BB82CDDF00C921A482CDDF00F1C671
:1082900045CDD70021AD82CDDF0011200001700057
:1082A000CD170DC90A0D447269766520003A206E1B
:1082B0006F742072656164790A0D003A2073656CF1
:1082C00065637465640A0D000A0D496E76616C6918
:1082D00064206472697665206C65747465720A0D39
:1082E000000000000000000000000000000000008E
:1082F000000000000000000000000000000000007E
:108300000000000000000000000000CD4585213283
:10831000403E01CDBE143A1741FEEBC25D83DD2124
:108320001741DD7E0E321743DD7E0F321843DD7EAE
:1083300010321943DD7E16321A43DD7E17321B439D
:108340003A1B43573A1A435FAF676F3A19434719CD
:1083500010FD16003A17435F19CD0085C9CD0C8674
:108360000A0D43616E6E6F742066696E6420626FE1
:108370006F7420736563746F722E0A0D00CD9714AD
:10838000DD360002C9ED5B1A43ED531C4321324038
:108390000601CDBE14CD0C860A0D202046696C6501
:1083A0006E616D652020202020436C7573746572AA
:1083B0002053697A650A0D002117410E107EE5DD14
:1083C000E1E5FE41CA6384FEE5CA6384FE00CA9407
:1083D00084DD7E0BFE10CA31843E20CDD7003E20C6
:1083E000CDD7000608CD63173E2ECDD7000603CDAE
:1083F0006317CD0C8620307800DD7E1BCD0701DDB4
:108400007E1ACD0701CD0C862020307800DD7E1F3E
:10841000CD0701DD7E1ECD0701DD7E1DCD0701DD0F
:108420007E1CCD07013E0ACDD7003E0DCDD70018EA
:10843000323E44CDD7003E20CDD7000608CD63178D
:10844000CD0C862020202020307800DD7E1BCD073B
:1084500001DD7E1ACD07013E0ACDD7003E0DCDD7F6
:108460000018000D2808E111200019C3BD83E12682
:10847000002E01CD0085ED5B1C431BED531C437AA0
:10848000B3CA95842132400601CDBE142117410E96
:1084900010C3BD83E1C9D5212543CD73853E10327C
:1084A0001C432132400601CDBE142117410E10D1CC
:1084B000D5CD5D8538330D280711200019C3AF8451
:1084C00026002E01CD00853A1C433D321C43CAE1F3
:1084D000842132400601CDBE142117410E10C3AFD6
:1084E00084D1219885CDDF00C9D10608CD63173E20
:1084F0002ECDD7000603CD631721AA85CDDF00C995
:10850000221D43AF321F43322043111D430132402D
:10851000CD1485C9E5C5D51A6F131A67130A5F0311
:108520000A5719D1C17D02037C02031313C5D51A62
:108530006F131A67130A5F030A57ED5AD1C17D0200
:10854000037C02E1C9CD9714DD23DD23DDE5E111D4
:1085500032401800C506000E04EDB0C1C9E5C506DD
:108560000B1A4F7EA920070520F7C1E137C9C1E1E9
:10857000373FC9060BE5AF772310FCE1060D1AB7AC
:10858000C805C8FE2E200A1378FE0538F123051809
:10859000F71A772313C37E8546696C65206E6F7466
:1085A00020666F756E64210D0A002046696C652097
:1085B0006C6F6361746564210D0A002A35437C6F1A
:1085C000AF67ED4B174309223743AF323943323A95
:1085D00043CD9714DD23DD23DDE5D1013743CD14F1
:1085E00085CD3A802137430601CDBE1421174106BF
:1085F00014CDC9163A3543176F3E0017671117415E
:1086000019113543EDA0EDA0CD3A80C9E3F5C57E43
:0F861000FE002806CDD7002318F523C1F1E3C9DA
:00000001FF

File diff suppressed because it is too large Load Diff

View File

@@ -1,50 +1,98 @@
!B000 CD 38 B0 CD 42 B1 11 0F B0 CD 1A B2 C3 99 00 49
!B010 4C 4C 55 53 49 4F 4E 2E 50 53 47 00 48 41 4C 4C
!B020 4F 57 4C 54 2E 54 58 54 00 54 45 53 54 00 2E 4F
!B030 52 47 00 F5 F1 F5 F1 C9 3E 01 06 0A CD B3 10 3E
!B040 01 06 0B CD B3 10 3E 00 06 0C CD B3 10 3E 00 06
!B050 0D CD B3 10 3E A0 06 0E CD B3 10 3E 20 06 0F CD
!B060 B3 10 21 41 50 CD 1D 11 06 04 0E 00 DD 21 FF 51
!B070 DD 7E 04 B7 C2 8C B0 C3 7A B0 3E 0A CD B7 02 3E
!B080 0D CD B7 02 11 10 00 DD 19 10 E5 C9 21 04 B1 CD
!B090 BF 02 DD 7E 04 CD E7 02 DD 7E 04 FE 0E 20 DB 21
!B0A0 0F B1 CD BF 02 21 18 B1 CD BF 02 DD 7E 08 32 05
!B0B0 50 DD 7E 09 32 04 50 DD 7E 0A 32 03 50 DD 7E 0B
!B0C0 32 02 50 3A 05 50 CD E7 02 3A 04 50 CD E7 02 3A
!B0D0 03 50 CD E7 02 3A 02 50 CD E7 02 21 21 B1 CD BF
!B0E0 02 DD 7E 0C CD E7 02 DD 7E 0D CD E7 02 DD 7E 0E
!B0F0 CD E7 02 DD 7E 0F CD E7 02 3E 0A CD B7 02 3E 0D
!B100 CD B7 02 C9 2D 20 54 79 70 65 3A 20 30 78 00 20
!B110 53 74 61 74 65 3A 20 00 20 4C 42 41 3A 20 30 78
!B120 00 20 4C 65 6E 3A 20 30 78 00 2D 2D 2D 2D 2D 2D
!B130 2D 2D 2D 2D 2D 2D 0A 0D 00 20 46 69 6C 65 73 0A
!B140 0D 00 CD A7 B2 21 02 50 3E 01 CD 56 12 DD 21 41
!B150 50 DD 7E 0E 32 0A 50 DD 7E 0F 32 0B 50 DD 7E 10
!B160 32 0C 50 DD 7E 16 32 0D 50 DD 7E 17 32 0E 50 3A
!B170 0E 50 57 3A 0D 50 5F AF 67 6F 3A 0C 50 47 19 10
!B180 FD 16 00 3A 0A 50 5F 19 CD 84 B2 C9 3E 0A CD B7
!B190 02 3E 0D CD B7 02 ED 5B 0D 50 ED 53 0F 50 21 06
!B1A0 50 06 01 CD 56 12 21 41 50 0E 10 7E E5 FE 41 28
!B1B0 26 FE E5 28 22 FE 00 CA 08 B2 06 08 CD 58 13 3E
!B1C0 2E CD B7 02 06 03 CD 58 13 7E CD B7 02 3E 0A CD
!B1D0 B7 02 3E 0D CD B7 02 0D 28 08 E1 11 20 00 19 C3
!B1E0 AB B1 E1 26 00 2E 01 CD 84 B2 ED 5B 0F 50 1B ED
!B1F0 53 0F 50 7A B3 CA 09 B2 21 06 50 06 01 CD 56 12
!B200 21 41 50 0E 10 C3 AB B1 E1 21 2A B1 CD BF 02 79
!B210 CD E7 02 21 39 B1 CD BF 02 C9 D5 21 11 50 CD CE
!B220 B2 3E 10 32 0F 50 21 06 50 06 01 CD 56 12 21 41
!B230 50 0E 10 D1 D5 CD B8 B2 38 33 0D 28 07 11 20 00
!B240 19 C3 33 B2 26 00 2E 01 CD 84 B2 3A 0F 50 3D 32
!B250 0F 50 CA 65 B2 21 06 50 06 01 CD 56 12 21 41 50
!B260 0E 10 C3 33 B2 D1 21 F3 B2 CD BF 02 C9 D1 06 08
!B270 CD 58 13 3E 2E CD B7 02 06 03 CD 58 13 21 05 B3
!B280 CD BF 02 C9 DD 21 06 50 7D DD 86 03 DD 77 03 30
!B290 05 3E 01 DD 86 02 7C DD 86 02 DD 77 02 D0 3E 01
!B2A0 DD 86 01 DD 77 01 C9 21 02 50 11 06 50 18 00 C5
!B2B0 06 00 0E 04 ED B0 C1 C9 E5 C5 06 0B 1A 4F 7E A9
!B2C0 20 07 05 20 F7 C1 E1 37 C9 C1 E1 37 3F C9 06 0B
!B2D0 E5 AF 77 23 10 FC E1 06 0D 1A B7 C8 05 C8 FE 2E
!B2E0 20 0A 13 78 FE 05 38 F1 23 05 18 F7 1A 77 23 13
!B2F0 C3 D9 B2 46 69 6C 65 20 6E 6F 74 20 66 6F 75 6E
!B300 64 21 0D 0A 00 20 46 69 6C 65 20 6C 6F 63 61 74
!B310 65 64 21 0D 0A 00
!8000 CD 5A 82 CD 3A 80 C9
!8010 CD 3A 80 C9
!8020 CD 85 83 C9
!8030 21 06 00 22 35 43 CD BB 85 C9 CD 0C 86 0A 0D 50
!8040 54 52 2E 4D 45 4D 5F 49 44 45 5F 50 4F 49 4E 54
!8050 45 52 3A 20 20 20 20 30 78 00 DD 21 32 40 CD 34
!8060 82 CD 0C 86 20 20 7C 20 20 50 54 52 2E 4D 45 4D
!8070 5F 49 44 45 5F 50 41 52 54 49 54 49 4F 4E 3A 20
!8080 20 20 30 78 00 DD 21 2E 40 CD 34 82 CD 0C 86 0A
!8090 0D 50 54 52 2E 4D 45 4D 5F 46 41 54 5F 54 4D 50
!80A0 50 4F 49 4E 54 45 52 3A 20 30 78 00 DD 21 1D 43
!80B0 CD 34 82 CD 0C 86 20 20 7C 20 20 50 54 52 2E 4D
!80C0 45 4D 5F 46 41 54 5F 54 4D 50 50 4F 49 4E 54 45
!80D0 52 31 3A 20 30 78 00 DD 21 21 43 CD 34 82 CD 0C
!80E0 86 0A 0D 56 41 4C 2E 4D 45 4D 5F 46 41 54 5F 52
!80F0 45 53 45 52 56 45 44 3A 20 20 20 30 78 00 DD 21
!8100 17 43 CD 4D 82 CD 0C 86 20 20 20 20 20 20 7C 20
!8110 20 56 41 4C 2E 4D 45 4D 5F 46 41 54 5F 41 4D 4F
!8120 55 4E 54 3A 20 20 20 20 20 20 30 78 00 3A 19 43
!8130 CD 07 01 CD 0C 86 0A 0D 56 41 4C 2E 4D 45 4D 5F
!8140 46 41 54 5F 53 45 43 54 4F 52 53 3A 20 20 20 20
!8150 30 78 00 DD 21 1A 43 CD 4D 82 CD 0C 86 20 20 20
!8160 20 20 20 7C 20 20 56 41 4C 2E 4D 45 4D 5F 46 41
!8170 54 5F 43 4F 55 4E 54 31 3A 20 20 20 20 20 20 30
!8180 78 00 3A 1C 43 CD 07 01 CD 0C 86 0A 0D 56 41 4C
!8190 2E 4D 45 4D 5F 46 41 54 5F 4F 46 30 5F 43 43 4C
!81A0 55 53 54 3A 20 30 78 00 DD 21 35 43 CD 4D 82 CD
!81B0 0C 86 20 20 20 20 20 20 7C 20 20 50 54 52 2E 4D
!81C0 45 4D 5F 46 41 54 5F 4F 46 30 5F 46 41 54 53 45
!81D0 43 3A 20 20 30 78 00 DD 21 37 43 CD 34 82 CD 0C
!81E0 86 0A 0D 56 41 4C 2E 4D 45 4D 5F 46 41 54 5F 4F
!81F0 46 30 5F 44 41 54 53 45 43 3A 20 30 78 00 DD 21
!8200 3B 43 CD 34 82 CD 0C 86 20 20 7C 20 20 50 54 52
!8210 2E 4D 45 4D 5F 46 41 54 5F 4F 46 30 5F 44 41 54
!8220 52 45 4D 3A 20 20 30 78 00 DD 21 3F 43 CD 4D 82
!8230 CD F1 00 C9 DD 7E 03 CD 07 01 DD 7E 02 CD 07 01
!8240 DD 7E 01 CD 07 01 DD 7E 00 CD 07 01 C9 DD 7E 01
!8250 CD 07 01 DD 7E 00 CD 07 01 C9 32 76 40 F5 CD 97
!8260 14 DD 7E 00 B7 C2 88 82 CD 0B 83 2A 32 40 ED 5B
!8270 2E 40 CD 54 85 21 A4 82 CD DF 00 F1 C6 45 CD D7
!8280 00 21 BB 82 CD DF 00 C9 21 A4 82 CD DF 00 F1 C6
!8290 45 CD D7 00 21 AD 82 CD DF 00 11 20 00 01 70 00
!82A0 CD 17 0D C9 0A 0D 44 72 69 76 65 20 00 3A 20 6E
!82B0 6F 74 20 72 65 61 64 79 0A 0D 00 3A 20 73 65 6C
!82C0 65 63 74 65 64 0A 0D 00 0A 0D 49 6E 76 61 6C 69
!82D0 64 20 64 72 69 76 65 20 6C 65 74 74 65 72 0A 0D
!82E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
!82F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
!8300 00 00 00 00 00 00 00 00 00 00 00 CD 45 85 21 32
!8310 40 3E 01 CD BE 14 3A 17 41 FE EB C2 5D 83 DD 21
!8320 17 41 DD 7E 0E 32 17 43 DD 7E 0F 32 18 43 DD 7E
!8330 10 32 19 43 DD 7E 16 32 1A 43 DD 7E 17 32 1B 43
!8340 3A 1B 43 57 3A 1A 43 5F AF 67 6F 3A 19 43 47 19
!8350 10 FD 16 00 3A 17 43 5F 19 CD 00 85 C9 CD 0C 86
!8360 0A 0D 43 61 6E 6E 6F 74 20 66 69 6E 64 20 62 6F
!8370 6F 74 20 73 65 63 74 6F 72 2E 0A 0D 00 CD 97 14
!8380 DD 36 00 02 C9 ED 5B 1A 43 ED 53 1C 43 21 32 40
!8390 06 01 CD BE 14 CD 0C 86 0A 0D 20 20 46 69 6C 65
!83A0 6E 61 6D 65 20 20 20 20 20 43 6C 75 73 74 65 72
!83B0 20 53 69 7A 65 0A 0D 00 21 17 41 0E 10 7E E5 DD
!83C0 E1 E5 FE 41 CA 63 84 FE E5 CA 63 84 FE 00 CA 94
!83D0 84 DD 7E 0B FE 10 CA 31 84 3E 20 CD D7 00 3E 20
!83E0 CD D7 00 06 08 CD 63 17 3E 2E CD D7 00 06 03 CD
!83F0 63 17 CD 0C 86 20 30 78 00 DD 7E 1B CD 07 01 DD
!8400 7E 1A CD 07 01 CD 0C 86 20 20 30 78 00 DD 7E 1F
!8410 CD 07 01 DD 7E 1E CD 07 01 DD 7E 1D CD 07 01 DD
!8420 7E 1C CD 07 01 3E 0A CD D7 00 3E 0D CD D7 00 18
!8430 32 3E 44 CD D7 00 3E 20 CD D7 00 06 08 CD 63 17
!8440 CD 0C 86 20 20 20 20 20 30 78 00 DD 7E 1B CD 07
!8450 01 DD 7E 1A CD 07 01 3E 0A CD D7 00 3E 0D CD D7
!8460 00 18 00 0D 28 08 E1 11 20 00 19 C3 BD 83 E1 26
!8470 00 2E 01 CD 00 85 ED 5B 1C 43 1B ED 53 1C 43 7A
!8480 B3 CA 95 84 21 32 40 06 01 CD BE 14 21 17 41 0E
!8490 10 C3 BD 83 E1 C9 D5 21 25 43 CD 73 85 3E 10 32
!84A0 1C 43 21 32 40 06 01 CD BE 14 21 17 41 0E 10 D1
!84B0 D5 CD 5D 85 38 33 0D 28 07 11 20 00 19 C3 AF 84
!84C0 26 00 2E 01 CD 00 85 3A 1C 43 3D 32 1C 43 CA E1
!84D0 84 21 32 40 06 01 CD BE 14 21 17 41 0E 10 C3 AF
!84E0 84 D1 21 98 85 CD DF 00 C9 D1 06 08 CD 63 17 3E
!84F0 2E CD D7 00 06 03 CD 63 17 21 AA 85 CD DF 00 C9
!8500 22 1D 43 AF 32 1F 43 32 20 43 11 1D 43 01 32 40
!8510 CD 14 85 C9 E5 C5 D5 1A 6F 13 1A 67 13 0A 5F 03
!8520 0A 57 19 D1 C1 7D 02 03 7C 02 03 13 13 C5 D5 1A
!8530 6F 13 1A 67 13 0A 5F 03 0A 57 ED 5A D1 C1 7D 02
!8540 03 7C 02 E1 C9 CD 97 14 DD 23 DD 23 DD E5 E1 11
!8550 32 40 18 00 C5 06 00 0E 04 ED B0 C1 C9 E5 C5 06
!8560 0B 1A 4F 7E A9 20 07 05 20 F7 C1 E1 37 C9 C1 E1
!8570 37 3F C9 06 0B E5 AF 77 23 10 FC E1 06 0D 1A B7
!8580 C8 05 C8 FE 2E 20 0A 13 78 FE 05 38 F1 23 05 18
!8590 F7 1A 77 23 13 C3 7E 85 46 69 6C 65 20 6E 6F 74
!85A0 20 66 6F 75 6E 64 21 0D 0A 00 20 46 69 6C 65 20
!85B0 6C 6F 63 61 74 65 64 21 0D 0A 00 2A 35 43 7C 6F
!85C0 AF 67 ED 4B 17 43 09 22 37 43 AF 32 39 43 32 3A
!85D0 43 CD 97 14 DD 23 DD 23 DD E5 D1 01 37 43 CD 14
!85E0 85 CD 3A 80 21 37 43 06 01 CD BE 14 21 17 41 06
!85F0 14 CD C9 16 3A 35 43 17 6F 3E 00 17 67 11 17 41
!8600 19 11 35 43 ED A0 ED A0 CD 3A 80 C9 E3 F5 C5 7E
!8610 FE 00 28 06 CD D7 00 23 18 F5 23 C1 F1 E3 C9