mirror of
https://github.com/Tolik-Trek/FORMAT.git
synced 2026-06-15 09:21:40 +03:00
...
This commit is contained in:
parent
209709448f
commit
ee29a4c7b0
129
format/data.z80
Normal file
129
format/data.z80
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
||||||
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ DATA ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
||||||
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
MACRO FAT_TYPES_LINE vol_size, clu_size, fat_type
|
||||||
|
WORD vol_size, clu_size
|
||||||
|
BYTE fat_type
|
||||||
|
ENDM
|
||||||
|
|
||||||
|
MODULE TABLES
|
||||||
|
FAT12 EQU 3
|
||||||
|
FAT16 EQU 2
|
||||||
|
FAT32 EQU 4
|
||||||
|
; VOL SIZE CLUSTER SIZE FAT TYPE
|
||||||
|
FAT_TYPES: FAT_TYPES_LINE #0800, 32768, FAT32 ; > 32768
|
||||||
|
FAT_TYPES_LINE #0400, 16384, FAT32 ; 16384..32768 Mb
|
||||||
|
FAT_TYPES_LINE #0200, 8192, FAT32 ; 8192..16384 Mb
|
||||||
|
FAT_TYPES_LINE #0100, 4096, FAT32 ; 4096..8192 Mb
|
||||||
|
FAT_TYPES_LINE #0080, 32768, FAT16 ; 2048..4096 Mb
|
||||||
|
FAT_TYPES_LINE #0040, 16384, FAT16 ; 1023..2048 Mb
|
||||||
|
FAT_TYPES_LINE #0020, 8192, FAT16 ; 511..1023 Mb
|
||||||
|
FAT_TYPES_LINE #0010, 4096, FAT16 ; 256..511 Mb
|
||||||
|
FAT_TYPES_LINE #0008, 2048, FAT16 ; 128..256 Mb
|
||||||
|
FAT_TYPES_LINE #0004, 1024, FAT16 ; 64..128 Mb
|
||||||
|
FAT_TYPES_LINE #0002, 512, FAT16 ; 32..64 Mb
|
||||||
|
; ¥á«¨ ¬¥ìè¥, â® FAT12
|
||||||
|
.LineSize EQU 5
|
||||||
|
.Records EQU ($ - FAT_TYPES)/.LineSize
|
||||||
|
ENDMODULE
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
VARIABLES EQU $
|
||||||
|
.FAT_TYPE BYTE TABLES.FAT12 ; [x]
|
||||||
|
.CurrentDrive DB 0
|
||||||
|
.VOLUME_SIZE_BYTES BLOCK 5,0
|
||||||
|
.FatFDD_ReservedSectors WORD 1
|
||||||
|
.FatHDD_ReservedSectors WORD 8
|
||||||
|
.Fat32_ReservedSectors WORD 32
|
||||||
|
.RootDirSectors WORD 0
|
||||||
|
.NotUsedSpace BYTE 0 ; in sectors
|
||||||
|
.total_clusters_L: WORD 0
|
||||||
|
.total_clusters_H: WORD 0
|
||||||
|
.FAT32_RootDirClusters WORD 1
|
||||||
|
.FAT.LABEL BYTE 'NO_LABEL '
|
||||||
|
.DriveExtendedParameters BYTE 0
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
; Š«îç ¢ëáâ ¢«¥ : „¥ä®«â®¥ § 票¥
|
||||||
|
KEYS_PARAMETERS EQU $
|
||||||
|
.ONLY_HELP BYTE 0 : BYTE 0 ; [ ] /? ; ¢ë¢®¤ á¯à ¢ª¨
|
||||||
|
.FAT_TYPE BYTE 0 : BYTE TABLES.FAT12 ; [ ] /t ;
|
||||||
|
.BytesPerSector BYTE 0 : WORD #200 ; [ ] /s ;
|
||||||
|
.SectorsPerCluster: BYTE 0 : BYTE 0 ; [ ] /c ;
|
||||||
|
.Number_of_FATs: BYTE 0 : BYTE 2 ; [ ] /n ;
|
||||||
|
.FilesInRootDIR: BYTE 0 : WORD 0 ; [ ] /d ;
|
||||||
|
.RESERVED_SECTORS: BYTE 0 : WORD 0 ; [ ] /r ;
|
||||||
|
.LOW_FORMAT BYTE 0 : BYTE 0 ; [ ] /l ; ¤«ï ¤¨áª¥â
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
; root_dir_sectors = ((root_dir_entries * 32) + (bytes_per_sector - 1)) / bytes_per_sector
|
||||||
|
FAT_PARAMETERS:
|
||||||
|
.PART1 EQU $
|
||||||
|
;
|
||||||
|
.JMP: BYTE #EB,#FE,#00 ; [x] opcode jmp $
|
||||||
|
.ID_NAME BYTE "DDF " ; DSS Drive Formatter
|
||||||
|
.ID_NAME_VER BYTE "0."
|
||||||
|
.ID_NAME_MOD BYTE "00"
|
||||||
|
.BytesPerSector: WORD #200 ; predefined ; [x]
|
||||||
|
.SectorsPerCluster: BYTE 0 ; [x]
|
||||||
|
.RESERVED_SECTORS: WORD 0 ; [x]
|
||||||
|
.Number_of_FATs: BYTE 2 ; predefined ; [x]
|
||||||
|
.FilesInRootDIR: WORD 0 ; FAT32 constant ; [ ] FAT ; [x] FAT32
|
||||||
|
.SectorsPerDrive: WORD 0 ; FAT32 constant ; [x] +-
|
||||||
|
.DRIVE_TYPE: BYTE 0 ; ; [x] +-
|
||||||
|
.SectorsPerFAT16: WORD 0 ; FAT32 constant ; [x]
|
||||||
|
.SectorsPerTrack WORD 9 ; BPB_SecPerTrk ; [x]
|
||||||
|
.HEADS WORD 2 ; [x]
|
||||||
|
.HIDDEN DWORD 0 ; ®â ç « MBR, extMBR ; [x]
|
||||||
|
.BPB_BIG_TOTAL_SECTORS_L WORD 0 ; [x] +-
|
||||||
|
.BPB_BIG_TOTAL_SECTORS_H WORD 0 ; [x] +-
|
||||||
|
.PART1_SIZE EQU $ - .PART1
|
||||||
|
; FAT 12, FAT 16
|
||||||
|
.PART2_FAT12_16 EQU $
|
||||||
|
;
|
||||||
|
.BPB_PHISICAL_DRIVE_NUMBER BYTE #80 ; [x]
|
||||||
|
.reserved_1 BYTE 0 ; predefined ;
|
||||||
|
; .FAT.EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ;
|
||||||
|
; .FAT.SERIAL_NUMBER DWORD 0 ;
|
||||||
|
; .FAT.LABEL DB 'NO_LABEL ' ;
|
||||||
|
; .ID_FAT DB 'FAT16 ' ;
|
||||||
|
.PART2_FAT12_16_END EQU $
|
||||||
|
|
||||||
|
; FAT32
|
||||||
|
.PART2_FAT32 EQU $
|
||||||
|
;
|
||||||
|
.SectorsPerFAT32 DWORD 0 ; [x] ;!TODO error ¥á«¨ áâ à訩 ¡ ©â !=0
|
||||||
|
.MainFATnumber WORD 0 ; BPB_ExtFlags ;
|
||||||
|
.Version WORD 0 ; constant ;
|
||||||
|
.RootDirStartCluster DWORD 2 ; FIXED! ¨á¯®«ì§ã¥âáï ¢ ä®à¬ã«¥
|
||||||
|
.FSINFO_Sector WORD 1 ; constant ;
|
||||||
|
.CopyBootSector WORD 6 ; constant ;
|
||||||
|
.reserved_block: BLOCK 12 ; constant ;
|
||||||
|
.FDD_Number BYTE 0 ; [x]
|
||||||
|
.reserved_2: BYTE 0 ; constant ;
|
||||||
|
; .FAT32.EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ;
|
||||||
|
; .FAT32.SERIAL_NUMBER DWORD 0 ;
|
||||||
|
; .FAT32.LABEL DB 'NO_LABEL ' ;
|
||||||
|
; .ID_FAT32 DB 'FAT32 ' ;
|
||||||
|
.PART2_FAT32_SIZE EQU $ - .PART2_FAT32
|
||||||
|
; SHARED
|
||||||
|
.PART3_SHARED EQU $
|
||||||
|
;
|
||||||
|
.FAT.EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ;
|
||||||
|
.FAT.SERIAL_NUMBER DWORD 0 ; [ ]
|
||||||
|
.FAT.LABEL DB 'NO_LABEL ' ; [ ] ;!TODO ¤®¯®«¨â¥«ì® ¯¨á âì ¢ ª®à¥¢ãî ¤¨à¥ªâ®à¨î
|
||||||
|
.ID_FAT DB 'FAT32 ' ;
|
||||||
|
.PART3_SHARED_SIZE EQU $ - .PART3_SHARED
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
@ -801,931 +801,12 @@ buff EQU ( high $ + ((low $)<?1) ) * 256
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
IFUSED FAT32_FORMAT
|
////////////////////////////////////////////////////////////////////////
|
||||||
/*
|
include 'new_format.asm'
|
||||||
BOOT_SECTOR EQU #00
|
|
||||||
.JMP EQU #00 ; BLOCK 3,0 BS_jmpBoot Jump to bootstrap (E.g. eb 3c 90; on i86: JMP 003E NOP. One finds either eb xx 90, or e9 xx xx.
|
|
||||||
.ID_NAME EQU #03 ; TEXT 8 BS_OEMName DOS NAME - DB "DSS_1.70"
|
|
||||||
; Block Parameters BIOS
|
|
||||||
.BytesPerSector GenIOCTL.GetParams EQU #0B ; WORD #200 BPB_BytsPerSec <09> §¬¥à ᥪâ®à ¢ ¡ ©â å
|
|
||||||
.SectorsPerCluster ;!TODO EQU #0D ; BYTE 2 BPB_SecPerClus <09> §¬¥à ª« áâ¥à ¢ ᥪâ®à å
|
|
||||||
.RESERVED_SECTORS !RESERVED_SECTORS EQU #0E ; WORD 1 BPB_ResvdSecCnt <09> §¬¥à á¨á⥬®© ®¡« á⨠(¢ª«îç ï íâ®â ᥪâ®à) RESERVE SECTORS
|
|
||||||
.Number_of_FATs 2 EQU #10 ; BYTE 2 BPB_NumFATs Š®«¨ç¥á⢮ â ¡«¨æ FAT
|
|
||||||
.FilesInRootDIR 0 EQU #11 ; WORD 112 BPB_RootEntCnt —¨á«® ®¯¨á ⥫¥© ä ©«®¢ ¢ ª®à¥¢®¬ ª â «®£¥ (¢ FAT32 - 0)
|
|
||||||
.SectorsPerDrive 0 EQU #13 ; WORD 1440 BPB_TotSec16 ޡ饥 ç¨á«® ᥪâ®à®¢ ¤¨áª¥ (¥á«¨ 0, â® à §¬¥à - ¢ .BPB_BIG_TOTAL_SECTORS)
|
|
||||||
.DRIVE_TYPE !DRV_TYPE EQU #15 ; BYTE #F0 BPB_Media ’¨¯ ãáâனáâ¢
|
|
||||||
.SectorsPerFAT16 0 EQU #16 ; WORD 2 BPB_FATSz16 <09> §¬¥à ®¤®© FAT ¢ ᥪâ®à å (0 ¢ FAT32)
|
|
||||||
.SectorsPerTrack GenIOCTL.GetParams EQU #18 ; WORD 9 BPB_SecPerTrk <09> §¬¥à ¤®à®¦ª¨ ¢ ᥪâ®à å
|
|
||||||
.HEADS GenIOCTL.GetParams EQU #1A ; WORD 2 BPB_NumHeads ª®«¨ç¥á⢮ £®«®¢®ª
|
|
||||||
.HIDDEN EQU #1C ; DWORD 0 BPB_HiddSec ª®«¨ç¥á⢮ áªàëâëå ᥪâ®à®¢
|
|
||||||
.BPB_BIG_TOTAL_SECTORS_L EQU #20 ; WORD 0 BPB_TotSec32 BIG TOTAL SECTOR Low word
|
|
||||||
.BPB_BIG_TOTAL_SECTORS_H EQU #22 ; WORD 0 BPB_TotSec32 BIG TOTAL SECTOR High word
|
|
||||||
; FAT 32
|
|
||||||
.SectorsPerFAT32 EQU #24 ; DWORD 4 BPB_FATSz32 <09> §¬¥à ®¤®© FAT ¢ ᥪâ®à å
|
|
||||||
.MainFATnumber 0 EQU #28 ; WORD 0 BPB_ExtFlags <09>®¬¥à £« ¢®© â ¡«¨æë FAT
|
|
||||||
.Version 0 EQU #2A ; WORD 0 BPB_FSVer ‚¥àá¨ï FAT32 (®¡ëç® 0)
|
|
||||||
.RootDirStartCluster 2 EQU #2C ; DWORD 2 BPB_RootClus <09>¥à¢ë© ª« áâ¥à ª®à¥¢®£® ª â «®£ (®¡ëç® 2)
|
|
||||||
.FSINFO_Sector 1 EQU #30 ; WORD 1 BPB_FSInfo <09>®¬¥à ᥪâ®à áâàãªâãàë FSINFO (®¡ëç® 1)
|
|
||||||
.CopyBootSector 6 EQU #32 ; WORD 6 BPB_BkBootSec <09>®¬¥à ᥪâ®à - ª®¯¨¨ § £à㧮箣® (®¡ëç® 6)
|
|
||||||
.reserved_block: 0 EQU #34 ; BLOCK 12 BPB_Reserved ‡ १¥à¢¨à®¢ ®
|
|
||||||
.FDD_Number GenIOCTL.GetParams&#F0 EQU #40 ; BYTE 0 BS_DrvNum <09>®¬¥à ¤¨áª®¢®¤ ¤«ï äãªæ¨© BIOS
|
|
||||||
.reserved_2: 0 EQU #41 ; BYTE 0 BS_Reserved1 ‡ १¥à¢¨à®¢ ®
|
|
||||||
.FAT32.EXT_BOOT_REC_SIGNATURE EQU #42 ; BYTE #29 BS_BootSig ‘¨£ âãà - #29
|
|
||||||
.FAT32.SERIAL_NUMBER EQU #43 ; DWORD 0 BS_VolID VOLUME SERIAL NUMBER
|
|
||||||
.FAT32.LABEL EQU #47 ; TEXT 11 BS_VolLab Œ¥âª ¤¨áª
|
|
||||||
.ID_FAT32 EQU #52 ; TEXT 8 BS_FilSysType €¡¡à¥¢¨ âãà ä ©«®¢®© á¨á⥬ë
|
|
||||||
.BOOT_CODE_FAT32 EQU #5A
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
!DRV_TYPE: GenIOCTL.GetParams - 䨧¨ç¥áª¨© ®¬¥à
|
|
||||||
0,1 - BIOS.DRV_GET_PAR - ⨯ ä«®¯ àï
|
|
||||||
#8x - Hard Drive
|
|
||||||
®á⠫쮥 ¯®¤ã¬ âì
|
|
||||||
;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
¤«ï ᬥ饨ï FAT ¤® ªà ⮣® 4096 § 票ï:
|
|
||||||
1) tmp1 = ((.HIDDEN + min_last_sector) & #0F)>0 ) * #10
|
|
||||||
2) tmp2 = (.HIDDEN + min_last_sector) & #FFFF'FFF0
|
|
||||||
3) tmp3 = tmp2 + tmp1
|
|
||||||
4) error = (tmp3 >= #1000'0000) ; LBA28
|
|
||||||
reserved_sectors = ( ((.HIDDEN + min_last_sector) & #0F)>0 ) * #10) - .HIDDEN
|
|
||||||
;;;;;;;;;;;;;;;;;
|
|
||||||
*/
|
|
||||||
|
|
||||||
;!TODO:
|
|
||||||
; Dss.DRV.Open
|
|
||||||
; Dss.DRV.Close
|
|
||||||
|
|
||||||
|
|
||||||
; DSS Drive Formatter
|
|
||||||
FAT32_FORMAT:
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
MAKE_AUTO: LD (STOP_ERROR.Save_SP),SP
|
|
||||||
;!FIXIT
|
|
||||||
LD A,(FMTDISK)
|
|
||||||
LD (VARIABLES.CurrentDrive),A
|
|
||||||
;
|
|
||||||
CALL CALCULATE_FAT
|
|
||||||
CALL FORMAT_DRIVE
|
|
||||||
;!FIXIT
|
|
||||||
;CALL MAKE_ROOT_DIR_LABEL ; ¯¥à¢ ï § ¯¨áì ¢ root dir - ¬¥âª , ¯®â®¬ 㫨
|
|
||||||
RET
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
CALCULATE_FAT: ;LD (STOP_ERROR.Save_SP),SP
|
|
||||||
; Ž¯à¥¤¥«¥¨¥ ¯ à ¬¥â஢ ®á¨â¥«ï ¨ ¢ë¡®à FAT
|
|
||||||
.STEP1: ; íâ ¤®«¦ ¡ëâì ®¡é¥© ¤«ï § ¯®«¥¨ï £¥®¬¥âਨ ¤¨áª
|
|
||||||
|
|
||||||
LD A,(VARIABLES.CurrentDrive)
|
|
||||||
LD BC,Dss.DRV.GenIOCTL.GetMoreParams
|
|
||||||
RST ToDSS.DRV
|
|
||||||
JR NC,.set_hidden
|
|
||||||
;
|
|
||||||
CP BIOS.Error.InvalidSubFunction
|
|
||||||
JR Z,.GetParams ; ¥á«¨ ¥â â ª®© ¯®¤äãªæ¨¨ ¢ ¤à ©¢¥à¥, ⮠ᬥ饨¥ = 0
|
|
||||||
SCF
|
|
||||||
JP STOP_ERROR
|
|
||||||
;
|
|
||||||
.set_hidden: LD (CALCULATED_FAT_PARAMETERS.HIDDEN),DE
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.HIDDEN + 2),HL
|
|
||||||
.GetParams: LD A,(VARIABLES.CurrentDrive)
|
|
||||||
LD BC,Dss.DRV.GenIOCTL.GetParams
|
|
||||||
RST ToDSS.DRV
|
|
||||||
JP C,STOP_ERROR
|
|
||||||
;!TODO CHECK ERROR ¥¯®¤å®¤ï騩 ¤¨áª
|
|
||||||
;
|
|
||||||
EX AF,AF'
|
|
||||||
AND #F0
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER),A
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.FDD_Number),A
|
|
||||||
; !FIXIT ¢ ਠ⠤«ï ¢¨â
|
|
||||||
LD A,H
|
|
||||||
OR L
|
|
||||||
JR NZ,.BPB_BIG_TOTAL_SECTORS
|
|
||||||
;
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.SectorsPerDrive),DE
|
|
||||||
;!TODO ãáâ ®¢¨âì ä« £, çâ® ¬¥«ª¨© ¤¨áª ¥ ¤«ï FAT32 ¯à¨ €¢â®¬ â¥
|
|
||||||
JR .STEP1_2
|
|
||||||
;
|
|
||||||
.BPB_BIG_TOTAL_SECTORS:
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.BPB_BIG_TOTAL_SECTORS_L),DE
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.BPB_BIG_TOTAL_SECTORS_H),HL
|
|
||||||
.STEP1_2: ; à §¬¥à ᥪâ®à
|
|
||||||
XOR A
|
|
||||||
SRL B
|
|
||||||
RRA
|
|
||||||
LD C,A
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.BytesPerSector),BC
|
|
||||||
; à §¬¥à ¤¨áª ¢ ¡ ©â å
|
|
||||||
CALL MUL32_POWER2
|
|
||||||
LD (VARIABLES.VOLUME_SIZE_BYTES),DE
|
|
||||||
LD (VARIABLES.VOLUME_SIZE_BYTES + 2),HL
|
|
||||||
LD (VARIABLES.VOLUME_SIZE_BYTES + 4),A
|
|
||||||
LD E,H
|
|
||||||
LD D,A
|
|
||||||
CALL AUTO_CHOOSE_FAT_PARAMS
|
|
||||||
JR C,STOP_ERROR
|
|
||||||
;
|
|
||||||
LD A,C
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.FAT_TYPE),A
|
|
||||||
CP TABLES.FAT32
|
|
||||||
LD HL,RESERVED_SECTORS.FAT32
|
|
||||||
JR Z,.set_reserved_s
|
|
||||||
;
|
|
||||||
;!FIXIT ¯à®¢¥àª FDD/HDD
|
|
||||||
LD HL,RESERVED_SECTORS.FAT_HDD
|
|
||||||
;
|
|
||||||
.set_reserved_s:
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.RESERVED_SECTORS),HL
|
|
||||||
LD HL,(CALCULATED_FAT_PARAMETERS.BytesPerSector)
|
|
||||||
DEC HL
|
|
||||||
SBC HL,DE
|
|
||||||
LD HL,(CALCULATED_FAT_PARAMETERS.BytesPerSector)
|
|
||||||
EX DE,HL
|
|
||||||
JR C,.BPS_OK
|
|
||||||
; á«ãç ©, ¥á«¨ â ¡«¨çë© ª« áâ¥à ¬¥ìè¥ á¥ªâ®à
|
|
||||||
LD A,1
|
|
||||||
.BPS_OK: CALL C,DIV16_POWER2
|
|
||||||
JR C,STOP_ERROR
|
|
||||||
;
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.SectorsPerCluster),A
|
|
||||||
;
|
|
||||||
CALL GET_DRIVE_TYPE
|
|
||||||
JR C,STOP_ERROR
|
|
||||||
;
|
|
||||||
LD A,B
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.DRIVE_TYPE),A
|
|
||||||
LD HL,(CALCULATED_FAT_PARAMETERS.SectorsPerDrive)
|
|
||||||
LD A,H
|
|
||||||
OR L
|
|
||||||
JR NZ,.total_sectors
|
|
||||||
;
|
|
||||||
LD HL,(CALCULATED_FAT_PARAMETERS.BPB_BIG_TOTAL_SECTORS_H)
|
|
||||||
LD (CALC_TOTAL_CLUSTERS.t_sec_h),HL
|
|
||||||
LD HL,(CALCULATED_FAT_PARAMETERS.BPB_BIG_TOTAL_SECTORS_L)
|
|
||||||
.total_sectors: LD (CALC_TOTAL_CLUSTERS.t_sec_l),HL
|
|
||||||
CALL CALC_TOTAL_CLUSTERS
|
|
||||||
LD HL,(CALC_TOTAL_CLUSTERS.fat_size_l)
|
|
||||||
LD A,(CALCULATED_FAT_PARAMETERS.FilesInRootDIR)
|
|
||||||
AND A
|
|
||||||
JR Z,.it_is_fat32
|
|
||||||
;
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.SectorsPerFAT16),HL
|
|
||||||
RET
|
|
||||||
;
|
|
||||||
.it_is_fat32: LD (CALCULATED_FAT_PARAMETERS.SectorsPerFAT32),HL
|
|
||||||
LD HL,(CALC_TOTAL_CLUSTERS.fat_size_h)
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.SectorsPerFAT32 + 2),HL
|
|
||||||
RET
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
STOP_ERROR: ;
|
|
||||||
.Save_SP+1: LD SP,0
|
|
||||||
;!TODO
|
|
||||||
SCF
|
|
||||||
;
|
|
||||||
RET
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
; data_sectors = total_sectors - reserved_sectors - root_dir_sectors - (num_fats * fat_sz)
|
|
||||||
; IN:
|
|
||||||
; DE:HL = total_sectors
|
|
||||||
CALC_TOTAL_CLUSTERS:
|
|
||||||
.t_sec_h+1: LD DE,0
|
|
||||||
.t_sec_l+1: LD HL,0
|
|
||||||
; data_sectors
|
|
||||||
AND A
|
|
||||||
; total_sectors - reserved_sectors
|
|
||||||
LD BC,(CALCULATED_FAT_PARAMETERS.RESERVED_SECTORS)
|
|
||||||
SBC HL,BC
|
|
||||||
JR NC,.skip_dec_DE
|
|
||||||
;
|
|
||||||
AND A
|
|
||||||
DEC DE
|
|
||||||
.skip_dec_DE: ; DE:HL = total_sectors - reserved_sectors
|
|
||||||
PUSH DE
|
|
||||||
PUSH HL
|
|
||||||
;num_fats * fat_sz32; fat_sz32 ¢ ª« áâ¥à å
|
|
||||||
.fat_size_l+1: LD BC,0
|
|
||||||
.fat_size_h+1: LD DE,0
|
|
||||||
LD A,(CALCULATED_FAT_PARAMETERS.Number_of_FATs)
|
|
||||||
CALL DEBCxA
|
|
||||||
;
|
|
||||||
LD B,H
|
|
||||||
LD C,L
|
|
||||||
PUSH IX
|
|
||||||
POP DE
|
|
||||||
;num_fats * fat_sz32 = BCDE
|
|
||||||
;
|
|
||||||
LD HL,(CALCULATED_FAT_PARAMETERS.RootDirSectors) ; !FIXIT ¯¨á âì ¯à®æ¥¤ãàã ¢ëç¨á«¥¨ï RootDirSectors ¤® ¢ë§®¢ í⮩
|
|
||||||
ADD HL,DE
|
|
||||||
JR NC,.skip_inc
|
|
||||||
;
|
|
||||||
AND A
|
|
||||||
INC BC
|
|
||||||
.skip_inc: EX DE,HL
|
|
||||||
;num_fats * fat_sz32 + root_dir_sectors = BC:DE
|
|
||||||
;
|
|
||||||
POP HL
|
|
||||||
SBC HL,DE
|
|
||||||
EX DE,HL
|
|
||||||
POP HL
|
|
||||||
SBC HL,BC
|
|
||||||
JR C,STOP_ERROR
|
|
||||||
; data_sectors = HL:DE
|
|
||||||
;
|
|
||||||
; total_clusters
|
|
||||||
LD A,(CALCULATED_FAT_PARAMETERS.SectorsPerCluster)
|
|
||||||
CALL HLDE_Div_A
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.NotUsedSpace),A
|
|
||||||
; total_clusters = HL:DE
|
|
||||||
;
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.total_clusters),DE
|
|
||||||
LD (CALCULATED_FAT_PARAMETERS.total_clusters + 2),HL
|
|
||||||
; fat_size
|
|
||||||
LD B,D
|
|
||||||
LD C,E
|
|
||||||
EX DE,HL
|
|
||||||
; total_clusters = DE:BC
|
|
||||||
;
|
|
||||||
LD A,(CALCULATED_FAT_PARAMETERS.FAT_TYPE)
|
|
||||||
.call_calc: CALL DEBCxA
|
|
||||||
;DE:BC * A = HL:IX
|
|
||||||
;
|
|
||||||
LD BC,(CALCULATED_FAT_PARAMETERS.BytesPerSector)
|
|
||||||
LD A,(CALCULATED_FAT_PARAMETERS.FAT_TYPE)
|
|
||||||
CP TABLES.FAT12
|
|
||||||
JR NZ,.no_sla
|
|
||||||
;
|
|
||||||
SLA C
|
|
||||||
RL B
|
|
||||||
.no_sla: DEC BC
|
|
||||||
ADD IX,BC
|
|
||||||
JR NC,.skip_inc_HL
|
|
||||||
;
|
|
||||||
INC HL
|
|
||||||
.skip_inc_HL: INC BC
|
|
||||||
CALL HLIX_div_BC
|
|
||||||
; ®ªà㣫¥¨¥ ¢¯¥àñ¤
|
|
||||||
LD A,D
|
|
||||||
OR E
|
|
||||||
JR Z,.set_new_size
|
|
||||||
;
|
|
||||||
LD BC,1
|
|
||||||
ADD IX,BC
|
|
||||||
DEC C
|
|
||||||
ADC HL,BC
|
|
||||||
; fat_size = HLIX
|
|
||||||
.set_new_size: LD DE,(.fat_size_l)
|
|
||||||
LD BC,(.fat_size_h)
|
|
||||||
LD (.fat_size_l),IX
|
|
||||||
LD (.fat_size_h),HL
|
|
||||||
AND A
|
|
||||||
SBC HL,BC
|
|
||||||
JR NZ,.next_loop
|
|
||||||
;
|
|
||||||
PUSH IX
|
|
||||||
POP HL
|
|
||||||
SBC HL,DE
|
|
||||||
RET Z
|
|
||||||
.next_loop: ;
|
|
||||||
.counter+1: LD A,32 ; loop counter
|
|
||||||
DEC A
|
|
||||||
LD (.counter),A
|
|
||||||
JP NZ,CALC_TOTAL_CLUSTERS
|
|
||||||
JP STOP_ERROR
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
;----------------------------------------------------------------------;
|
|
||||||
IFUSED DIV_by_Shifts
|
|
||||||
; HL:DE / A => DE:BC, H=0, L - ®áâ ⮪
|
|
||||||
DIV_by_Shifts: LD C,A
|
|
||||||
DEC A
|
|
||||||
JR Z,.exit
|
|
||||||
;
|
|
||||||
AND E
|
|
||||||
LD B,A ; ®áâ ⮪
|
|
||||||
LD A,C
|
|
||||||
RRCA
|
|
||||||
.loop: SRL H
|
|
||||||
RR L
|
|
||||||
RR D
|
|
||||||
RR E
|
|
||||||
RRCA
|
|
||||||
JP NC,.loop
|
|
||||||
;
|
|
||||||
LD A,B
|
|
||||||
.exit: LD B,D
|
|
||||||
LD C,E
|
|
||||||
EX DE,HL
|
|
||||||
LD H,0
|
|
||||||
LD L,A
|
|
||||||
RET
|
|
||||||
ENDIF
|
|
||||||
;----------------------------------------------------------------------;
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
; IN:
|
|
||||||
; DEBC, A
|
|
||||||
; OUT:
|
|
||||||
; HLIX = DEBC*A
|
|
||||||
DEBCxA: LD HL,0
|
|
||||||
LD IX,0
|
|
||||||
AND A
|
|
||||||
RET Z
|
|
||||||
;
|
|
||||||
.loop: ADD IX,BC
|
|
||||||
ADC HL,DE
|
|
||||||
JP C,STOP_ERROR ; ¤®å¥à
|
|
||||||
;
|
|
||||||
DEC A
|
|
||||||
JR NZ,.loop
|
|
||||||
RET
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
total_sectors DWORD 0x10000000
|
|
||||||
reserved_sectors WORD
|
|
||||||
data_sectors DWORD
|
|
||||||
total_clusters 3 bytes 0x400000
|
|
||||||
|
|
||||||
total_clusters * 4 4 bytes
|
|
||||||
fat_sz32 max 3 bytes <EFBFBD> §¬¥à â ¡«¨æë ¢ ᥪâ®à å
|
|
||||||
|
|
||||||
data_sectors = total_sectors - reserved_sectors - (num_fats * fat_sz32)
|
|
||||||
total_clusters = data_sectors / sectors_per_cluster
|
|
||||||
fat_sz32 = (total_clusters * 4 + (bytes_per_sector - 1)) / bytes_per_sector
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
;HLIX/BC -> HLIX remainder DE
|
|
||||||
HLIX_div_BC: EX DE,HL
|
|
||||||
; Negate BC to allow add instead of sbc
|
|
||||||
XOR A
|
|
||||||
; Need to set HL to 0 anyways, so save 2cc and a byte
|
|
||||||
LD H,A
|
|
||||||
LD L,A
|
|
||||||
SUB C
|
|
||||||
LD C,A
|
|
||||||
SBC A,A
|
|
||||||
SUB B
|
|
||||||
LD B,A
|
|
||||||
LD A,D
|
|
||||||
CALL .sub8
|
|
||||||
RLA
|
|
||||||
LD D,A
|
|
||||||
LD A,E
|
|
||||||
CALL .sub8
|
|
||||||
RLA
|
|
||||||
LD E,A
|
|
||||||
LD A,XH
|
|
||||||
CALL .sub8
|
|
||||||
RLA
|
|
||||||
LD XH,A
|
|
||||||
LD A,XL
|
|
||||||
CALL .sub8
|
|
||||||
RLA
|
|
||||||
LD XL,A
|
|
||||||
EX DE,HL
|
|
||||||
RET
|
|
||||||
;
|
|
||||||
.sub8: CALL .iter1
|
|
||||||
.iter1: CALL .iter2
|
|
||||||
.iter2: CALL .sub
|
|
||||||
.sub: RLA
|
|
||||||
ADC HL,HL
|
|
||||||
JR C,.skip
|
|
||||||
;
|
|
||||||
ADD HL,BC
|
|
||||||
RET C
|
|
||||||
;
|
|
||||||
SBC HL,BC
|
|
||||||
RET
|
|
||||||
;
|
|
||||||
.skip: ADD HL,BC
|
|
||||||
SCF
|
|
||||||
RET
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
FORMAT_DRIVE: CALL CLEAN_SECTOR_BUFFER
|
|
||||||
;
|
|
||||||
LD HL,CALCULATED_FAT_PARAMETERS.PART1
|
|
||||||
LD DE,SECTOR_BUFFER
|
|
||||||
LD BC,CALCULATED_FAT_PARAMETERS.PART1_SIZE
|
|
||||||
LDIR
|
|
||||||
;
|
|
||||||
LD A,(CALCULATED_FAT_PARAMETERS.FAT_TYPE)
|
|
||||||
CP TABLES.FAT32
|
|
||||||
;!FIXIT
|
|
||||||
JP NZ,STOP_ERROR
|
|
||||||
;
|
|
||||||
CALL MAKE_SYS_SECTORS
|
|
||||||
CALL CLEAN_SECTOR_BUFFER
|
|
||||||
; clean all fat tables at drive
|
|
||||||
LD A,(CALCULATED_FAT_PARAMETERS.FAT_TYPE)
|
|
||||||
CP TABLES.FAT32
|
|
||||||
LD BC,(CALCULATED_FAT_PARAMETERS.SectorsPerFAT32)
|
|
||||||
LD DE,(CALCULATED_FAT_PARAMETERS.SectorsPerFAT32 + 2)
|
|
||||||
JR Z,.its_fat32
|
|
||||||
;
|
|
||||||
LD BC,(CALCULATED_FAT_PARAMETERS.SectorsPerFAT16)
|
|
||||||
LD DE,0
|
|
||||||
.its_fat32: LD (.add_l),BC
|
|
||||||
LD (.add_h),DE
|
|
||||||
LD A,(CALCULATED_FAT_PARAMETERS.Number_of_FATs)
|
|
||||||
CALL DEBCxA
|
|
||||||
; HL:IX - ¢á¥£® ᥪâ®à®¢ ¤«ï § ¯¨á¨
|
|
||||||
PUSH HL
|
|
||||||
PUSH IX
|
|
||||||
EXX
|
|
||||||
POP DE
|
|
||||||
POP HL
|
|
||||||
EXX
|
|
||||||
; HL':DE' - ¢á¥£® ᥪâ®à®¢ ¤«ï § ¯¨á¨
|
|
||||||
;
|
|
||||||
LD IX,(CALCULATED_FAT_PARAMETERS.RESERVED_SECTORS)
|
|
||||||
LD HL,0
|
|
||||||
EXX
|
|
||||||
.write_loop: PUSH HL
|
|
||||||
PUSH DE
|
|
||||||
EXX
|
|
||||||
PUSH HL
|
|
||||||
PUSH IX
|
|
||||||
; HL:IX - ⥪ã騩 ᥪâ®à FAT
|
|
||||||
CALL WRITE_SECTOR_BUFFER
|
|
||||||
;
|
|
||||||
POP IX
|
|
||||||
POP HL
|
|
||||||
LD BC,1
|
|
||||||
ADD IX,BC
|
|
||||||
DEC C
|
|
||||||
ADC HL,BC
|
|
||||||
EXX
|
|
||||||
LD BC,1
|
|
||||||
POP HL
|
|
||||||
SBC HL,BC
|
|
||||||
POP DE
|
|
||||||
EX DE,HL
|
|
||||||
DEC C
|
|
||||||
SBC HL,BC
|
|
||||||
JR NZ,.write_loop
|
|
||||||
;
|
|
||||||
LD A,D
|
|
||||||
OR E
|
|
||||||
JR NZ,.write_loop
|
|
||||||
EXX
|
|
||||||
; make fat table
|
|
||||||
LD HL,(CALCULATED_FAT_PARAMETERS.DRIVE_TYPE)
|
|
||||||
LD H,#FF
|
|
||||||
LD (SECTOR_BUFFER),HL
|
|
||||||
LD L,H
|
|
||||||
LD (SECTOR_BUFFER + 2),HL
|
|
||||||
LD A,(CALCULATED_FAT_PARAMETERS.FAT_TYPE)
|
|
||||||
CP TABLES.FAT12
|
|
||||||
JR NZ,.not_fat12
|
|
||||||
; fat12
|
|
||||||
XOR A
|
|
||||||
LD (SECTOR_BUFFER + 3),A
|
|
||||||
JR .write_fat
|
|
||||||
;
|
|
||||||
.not_fat12 CP TABLES.FAT16
|
|
||||||
JR Z,.write_fat
|
|
||||||
;fat32
|
|
||||||
;
|
|
||||||
LD HL,.Fat32Data
|
|
||||||
LD DE,SECTOR_BUFFER + 3
|
|
||||||
LD BC,.Fat32Data.Size
|
|
||||||
LDIR
|
|
||||||
;
|
|
||||||
.write_fat: LD A,(CALCULATED_FAT_PARAMETERS.Number_of_FATs)
|
|
||||||
LD HL,0
|
|
||||||
LD D,H
|
|
||||||
LD E,L
|
|
||||||
PUSH HL
|
|
||||||
POP IX
|
|
||||||
LD BC,(CALCULATED_FAT_PARAMETERS.RESERVED_SECTORS)
|
|
||||||
;
|
|
||||||
.write_tbl_fat: ADD IX,BC
|
|
||||||
ADC HL,DE
|
|
||||||
PUSH AF
|
|
||||||
PUSH HL
|
|
||||||
PUSH IX
|
|
||||||
; HL:IX - ⥪ã騩 ᥪâ®à FAT
|
|
||||||
;
|
|
||||||
CALL WRITE_SECTOR_BUFFER
|
|
||||||
;
|
|
||||||
.add_l+1: LD BC,0
|
|
||||||
.add_h+1: LD DE,0
|
|
||||||
POP IX
|
|
||||||
POP HL
|
|
||||||
POP AF
|
|
||||||
DEC A
|
|
||||||
JR NZ,.write_tbl_fat
|
|
||||||
RET
|
|
||||||
;
|
|
||||||
.Fat32Data: DB #0F,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#0F
|
|
||||||
.Fat32Data.Size EQU $-.Fat32Data
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
MAKE_SYS_SECTORS:
|
|
||||||
LD HL,CALCULATED_FAT_PARAMETERS.PART2_FAT32
|
|
||||||
LD BC,CALCULATED_FAT_PARAMETERS.PART2_FAT32_SIZE + CALCULATED_FAT_PARAMETERS.PART3_SHARED_SIZE
|
|
||||||
LDIR
|
|
||||||
;
|
|
||||||
LD HL,#AA55
|
|
||||||
LD (SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE),HL
|
|
||||||
;
|
|
||||||
LD HL,0
|
|
||||||
LD IX,0
|
|
||||||
CALL WRITE_SECTOR_BUFFER
|
|
||||||
LD HL,0
|
|
||||||
LD IX,(CALCULATED_FAT_PARAMETERS.CopyBootSector)
|
|
||||||
CALL WRITE_SECTOR_BUFFER
|
|
||||||
;
|
|
||||||
LD A,(CALCULATED_FAT_PARAMETERS.FAT_TYPE)
|
|
||||||
CP TABLES.FAT32
|
|
||||||
RET NZ
|
|
||||||
;
|
|
||||||
CALL CLEAN_SECTOR_BUFFER
|
|
||||||
LD HL,#AA55
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL
|
|
||||||
;
|
|
||||||
LD HL,#5252
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE),HL
|
|
||||||
LD HL,#4161
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE + 2),HL
|
|
||||||
;
|
|
||||||
LD HL,#7272
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE),HL
|
|
||||||
LD HL,#6141
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2),HL
|
|
||||||
;
|
|
||||||
LD HL,(CALCULATED_FAT_PARAMETERS.FAT32_RootDirClusters)
|
|
||||||
LD DE,(CALCULATED_FAT_PARAMETERS.RootDirStartCluster) ; FIXED!
|
|
||||||
ADD HL,DE
|
|
||||||
LD DE,(CALCULATED_FAT_PARAMETERS.RootDirStartCluster + 2)
|
|
||||||
JR NC,.no_inc_de
|
|
||||||
;
|
|
||||||
INC DE
|
|
||||||
.no_inc_de: LD (SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER + 2),DE
|
|
||||||
;
|
|
||||||
LD B,H
|
|
||||||
LD C,L
|
|
||||||
LD HL,(CALCULATED_FAT_PARAMETERS.total_clusters)
|
|
||||||
LD IX,(CALCULATED_FAT_PARAMETERS.total_clusters + 2)
|
|
||||||
SBC HL,BC
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL
|
|
||||||
PUSH IX
|
|
||||||
POP HL
|
|
||||||
SBC HL,DE
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT + 2),HL
|
|
||||||
;
|
|
||||||
LD IX,(CALCULATED_FAT_PARAMETERS.FSINFO_Sector)
|
|
||||||
LD HL,0
|
|
||||||
CALL WRITE_SECTOR_BUFFER
|
|
||||||
;
|
|
||||||
LD HL,#FFFF
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER + 2),HL
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT + 2),HL
|
|
||||||
INC HL
|
|
||||||
LD IX,(CALCULATED_FAT_PARAMETERS.CopyBootSector)
|
|
||||||
LD DE,(CALCULATED_FAT_PARAMETERS.FSINFO_Sector)
|
|
||||||
ADD IX,DE
|
|
||||||
PUSH IX
|
|
||||||
CALL WRITE_SECTOR_BUFFER
|
|
||||||
;
|
|
||||||
CALL CLEAN_SECTOR_BUFFER
|
|
||||||
LD HL,#AA55
|
|
||||||
LD (SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL
|
|
||||||
LD HL,0
|
|
||||||
LD IX,(CALCULATED_FAT_PARAMETERS.FSINFO_Sector)
|
|
||||||
INC IX
|
|
||||||
CALL WRITE_SECTOR_BUFFER
|
|
||||||
POP IX
|
|
||||||
INC IX
|
|
||||||
LD HL,0
|
|
||||||
CALL WRITE_SECTOR_BUFFER
|
|
||||||
RET
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
CLEAN_SECTOR_BUFFER:
|
|
||||||
LD HL,SECTOR_BUFFER
|
|
||||||
LD DE,SECTOR_BUFFER + 1
|
|
||||||
LD BC,4096 - 1 ; ¡ã¤ã饥, ¤«ï ᥪâ®à®¢ ¡®«ìè¥ 512
|
|
||||||
LD (HL),0
|
|
||||||
LDIR
|
|
||||||
RET
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
;!FIXIT check error
|
|
||||||
WRITE_SECTOR_BUFFER:
|
|
||||||
LD A,(VARIABLES.CurrentDrive)
|
|
||||||
.sectors+2: LD BC,256*1 + Dss.DRV.Write
|
|
||||||
LD DE,SECTOR_BUFFER
|
|
||||||
JP ToDSS.DRV
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
;!TODO ¤®¤¥« âì ¤«ï ¤¨áª¥â
|
|
||||||
GET_DRIVE_TYPE: LD A,(CALCULATED_FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER)
|
|
||||||
CP DRIVE_CODES.SPRINTER.ATA
|
|
||||||
LD B,BOOT_SECTOR.Hard_Drive
|
|
||||||
RET Z
|
|
||||||
; ¤¨áª¥âë ¨ ª®£¤ -¨¡ã¤ì ATAPI
|
|
||||||
SCF
|
|
||||||
RET
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
; -> DE - 4 ¨ 5 ¡ ©âë à §¬¥à à §¤¥« .
|
|
||||||
; ¤®«¦® ¡ëâì ãáâ ®¢«¥® § 票¥ VOLUME_SIZE_BYTES.
|
|
||||||
; <- DE - CLUSTER SIZE.
|
|
||||||
; C - FAT TYPE.
|
|
||||||
AUTO_CHOOSE_FAT_PARAMS:
|
|
||||||
LD IX,TABLES.FAT_TYPES
|
|
||||||
LD A,TABLES.FAT_TYPES.Records
|
|
||||||
LD BC,TABLES.FAT_TYPES.LineSize
|
|
||||||
.loop: LD L,(IX)
|
|
||||||
LD H,(IX+1)
|
|
||||||
SBC HL,DE
|
|
||||||
JR C,.found
|
|
||||||
JR Z,.found
|
|
||||||
;
|
|
||||||
ADD IX,BC
|
|
||||||
DEC A
|
|
||||||
JR NZ,.loop
|
|
||||||
; ã á FAT12 c ª« áâ¥à®¬ ¢ 512
|
|
||||||
; ¤® ¯à®¢¥à¨âì à §¤¥« ¬¨¨¬ «ìë© à §¬¥à ¤«ï FAT
|
|
||||||
; sec_bpb + sec_fat + sec_root_dir + sec_for_data
|
|
||||||
LD A,D
|
|
||||||
OR E
|
|
||||||
JR NZ,.found
|
|
||||||
;
|
|
||||||
LD HL,(VARIABLES.VOLUME_SIZE_BYTES + 1)
|
|
||||||
LD DE,8
|
|
||||||
SBC HL,DE
|
|
||||||
RET C ; à §¤¥« ᫨誮¬ ¬ « ¤«ï FAT12 (<2048)
|
|
||||||
.found: ; ¤®áâ ñ¬ ¯ à ¬¥âàë ¨§ â ¡«¨æë
|
|
||||||
DI
|
|
||||||
LD (.restore_SP),SP
|
|
||||||
LD SP,IX
|
|
||||||
POP HL ; 宫®á⮥
|
|
||||||
POP DE ; CLUSTER SIZE
|
|
||||||
POP BC ; C - FAT TYPE
|
|
||||||
LD A,C
|
|
||||||
.restore_SP+1: LD SP,0
|
|
||||||
EI
|
|
||||||
AND A
|
|
||||||
RET
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
; -> HLDE * BC. BC = á⥯¥ì ¤¢®©ª¨
|
|
||||||
; <- AHLDE
|
|
||||||
; CF=1 - error
|
|
||||||
MUL32_POWER2: SRL B
|
|
||||||
RR C
|
|
||||||
LD A,B
|
|
||||||
OR C
|
|
||||||
RET Z
|
|
||||||
;
|
|
||||||
XOR A
|
|
||||||
.loop: EX DE,HL
|
|
||||||
ADD HL,HL
|
|
||||||
EX DE,HL
|
|
||||||
ADC HL,HL
|
|
||||||
ADC A,0
|
|
||||||
RET C
|
|
||||||
;
|
|
||||||
SRL B
|
|
||||||
RR C
|
|
||||||
JR NC,.loop
|
|
||||||
;
|
|
||||||
;EX DE,HL
|
|
||||||
AND A
|
|
||||||
RET
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
; -> HL / DE. DE = á⥯¥ì ¤¢®©ª¨
|
|
||||||
; <- A = HL / DE
|
|
||||||
; CF=1 - error
|
|
||||||
DIV16_POWER2: XOR A
|
|
||||||
.loop: INC A
|
|
||||||
SBC HL,DE
|
|
||||||
JR NC,.loop
|
|
||||||
DEC A
|
|
||||||
RET Z ; error: ¤¥«¨¬®¥ < ¤¥«¨â¥«ï
|
|
||||||
CCF
|
|
||||||
RET
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
MACRO DIV_RL
|
|
||||||
RL H
|
|
||||||
RLA
|
|
||||||
ADD A,C
|
|
||||||
JR C,.exit
|
|
||||||
SUB C
|
|
||||||
.exit:
|
|
||||||
ENDM
|
|
||||||
;
|
|
||||||
;Input: HLDE is numerator, A<129 is the divisor.
|
|
||||||
;Output: HLDE is quotient, A is remainder, C is negated
|
|
||||||
HLDE_Div_A: NEG
|
|
||||||
LD C,A
|
|
||||||
XOR A
|
|
||||||
CALL .div
|
|
||||||
LD B,H
|
|
||||||
LD H,L
|
|
||||||
CALL .div
|
|
||||||
LD L,H
|
|
||||||
LD H,D
|
|
||||||
CALL .div
|
|
||||||
LD D,H
|
|
||||||
LD H,E
|
|
||||||
CALL .div
|
|
||||||
LD E,H
|
|
||||||
LD H,B
|
|
||||||
RL E
|
|
||||||
RL D
|
|
||||||
ADC HL,HL
|
|
||||||
RET
|
|
||||||
;
|
|
||||||
.div: DIV_RL
|
|
||||||
DIV_RL
|
|
||||||
DIV_RL
|
|
||||||
DIV_RL
|
|
||||||
DIV_RL
|
|
||||||
DIV_RL
|
|
||||||
DIV_RL
|
|
||||||
RL H
|
|
||||||
RLA
|
|
||||||
ADD A,C
|
|
||||||
RET C
|
|
||||||
SUB C
|
|
||||||
RET
|
|
||||||
;-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
MACRO FAT_TYPES_LINE vol_size, clu_size, fat_type
|
|
||||||
WORD vol_size, clu_size
|
|
||||||
BYTE fat_type
|
|
||||||
ENDM
|
|
||||||
|
|
||||||
MODULE TABLES
|
|
||||||
FAT12 EQU 3
|
|
||||||
FAT16 EQU 2
|
|
||||||
FAT32 EQU 4
|
|
||||||
; VOL SIZE CLUSTER SIZE FAT TYPE
|
|
||||||
FAT_TYPES: FAT_TYPES_LINE #0800, 32768, FAT32 ; > 32768
|
|
||||||
FAT_TYPES_LINE #0400, 16384, FAT32 ; 16384..32768 Mb
|
|
||||||
FAT_TYPES_LINE #0200, 8192, FAT32 ; 8192..16384 Mb
|
|
||||||
FAT_TYPES_LINE #0100, 4096, FAT32 ; 4096..8192 Mb
|
|
||||||
FAT_TYPES_LINE #0080, 32768, FAT16 ; 2048..4096 Mb
|
|
||||||
FAT_TYPES_LINE #0040, 16384, FAT16 ; 1023..2048 Mb
|
|
||||||
FAT_TYPES_LINE #0020, 8192, FAT16 ; 511..1023 Mb
|
|
||||||
FAT_TYPES_LINE #0010, 4096, FAT16 ; 256..511 Mb
|
|
||||||
FAT_TYPES_LINE #0008, 2048, FAT16 ; 128..256 Mb
|
|
||||||
FAT_TYPES_LINE #0004, 1024, FAT16 ; 64..128 Mb
|
|
||||||
FAT_TYPES_LINE #0002, 512, FAT16 ; 32..64 Mb
|
|
||||||
; ¥á«¨ ¬¥ìè¥, â® FAT12
|
|
||||||
.LineSize EQU 5
|
|
||||||
.Records EQU ($ - FAT_TYPES)/.LineSize
|
|
||||||
ENDMODULE
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
;
|
|
||||||
RESERVED_SECTORS: ;predefined (¯®ª )
|
|
||||||
.FAT_FDD EQU 1
|
|
||||||
.FAT_HDD EQU 8
|
|
||||||
.FAT32 EQU #2032 ;32
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
;
|
|
||||||
VARIABLES EQU $
|
|
||||||
.CurrentDrive DB 0
|
|
||||||
.VOLUME_SIZE_BYTES BLOCK 5,0
|
|
||||||
;
|
|
||||||
|
|
||||||
; root_dir_sectors = ((root_dir_entries * 32) + (bytes_per_sector - 1)) / bytes_per_sector
|
|
||||||
CALCULATED_FAT_PARAMETERS:
|
|
||||||
.FAT_TYPE BYTE TABLES.FAT12 ; [x]
|
|
||||||
.RootDirSectors WORD 0
|
|
||||||
.NotUsedSpace BYTE 0 ; in sectors
|
|
||||||
.total_clusters: DWORD 0
|
|
||||||
.FAT32_RootDirClusters WORD 1
|
|
||||||
.PART1 EQU $
|
|
||||||
;
|
|
||||||
.JMP: BYTE #EB,#FE,#00 ; [x] opcode jmp $
|
|
||||||
.ID_NAME BYTE "DDF " ; DSS Drive Formatter
|
|
||||||
.ID_NAME_VER BYTE "0."
|
|
||||||
.ID_NAME_MOD BYTE "00"
|
|
||||||
.BytesPerSector: WORD #200 ; predefined ; [x]
|
|
||||||
.SectorsPerCluster: BYTE 0 ; [x]
|
|
||||||
.RESERVED_SECTORS: WORD 0 ; [x]
|
|
||||||
.Number_of_FATs: BYTE 2 ; predefined ; [ ]
|
|
||||||
.FilesInRootDIR: WORD 0 ; FAT32 constant ; [ ] FAT ; [x] FAT32
|
|
||||||
.SectorsPerDrive: WORD 0 ; FAT32 constant ; [x] +-
|
|
||||||
.DRIVE_TYPE: BYTE 0 ; ; [x] +-
|
|
||||||
.SectorsPerFAT16: WORD 0 ; FAT32 constant ; [x]
|
|
||||||
.SectorsPerTrack WORD 9 ; BPB_SecPerTrk ; [ ] <20> §¬¥à ¤®à®¦ª¨ ¢ ᥪâ®à å
|
|
||||||
.HEADS WORD 2 ; [ ]
|
|
||||||
.HIDDEN DWORD 0 ; ®â ç « MBR, extMBR ; [x]
|
|
||||||
.BPB_BIG_TOTAL_SECTORS_L WORD 0 ; [x] +-
|
|
||||||
.BPB_BIG_TOTAL_SECTORS_H WORD 0 ; [x] +-
|
|
||||||
.PART1_SIZE EQU $ - .PART1
|
|
||||||
; FAT 12, FAT 16
|
|
||||||
.PART2_FAT12_16 EQU $
|
|
||||||
;
|
|
||||||
.BPB_PHISICAL_DRIVE_NUMBER BYTE #80 ; [x]
|
|
||||||
.reserved_1 BYTE 0 ; predefined ;
|
|
||||||
; .FAT.EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ;
|
|
||||||
; .FAT.SERIAL_NUMBER DWORD 0 ;
|
|
||||||
; .FAT.LABEL DB 'NO_LABEL ' ;
|
|
||||||
; .ID_FAT DB 'FAT16 ' ;
|
|
||||||
.PART2_FAT12_16_END EQU $
|
|
||||||
|
|
||||||
; FAT32
|
|
||||||
.PART2_FAT32 EQU $
|
|
||||||
;
|
|
||||||
.SectorsPerFAT32 DWORD 0 ; [x] ;!TODO error ¥á«¨ áâ à訩 ¡ ©â !=0
|
|
||||||
.MainFATnumber WORD 0 ; BPB_ExtFlags ;
|
|
||||||
.Version WORD 0 ; constant ;
|
|
||||||
.RootDirStartCluster DWORD 2 ; FIXED! ¨á¯®«ì§ã¥âáï ¢ ä®à¬ã«¥
|
|
||||||
.FSINFO_Sector WORD 1 ; constant ;
|
|
||||||
.CopyBootSector WORD 6 ; constant ;
|
|
||||||
.reserved_block: BLOCK 12 ; constant ;
|
|
||||||
.FDD_Number BYTE 0 ; [x]
|
|
||||||
.reserved_2: BYTE 0 ; constant ;
|
|
||||||
; .FAT32.EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ;
|
|
||||||
; .FAT32.SERIAL_NUMBER DWORD 0 ;
|
|
||||||
; .FAT32.LABEL DB 'NO_LABEL ' ;
|
|
||||||
; .ID_FAT32 DB 'FAT32 ' ;
|
|
||||||
.PART2_FAT32_SIZE EQU $ - .PART2_FAT32
|
|
||||||
; SHARED
|
|
||||||
.PART3_SHARED EQU $
|
|
||||||
;
|
|
||||||
.FAT.EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ;
|
|
||||||
.FAT.SERIAL_NUMBER DWORD 0 ; [ ]
|
|
||||||
.FAT.LABEL DB 'NO_LABEL ' ; [ ] ;!TODO ¤®¯®«¨â¥«ì® ¯¨á âì ¢ ª®à¥¢ãî ¤¨à¥ªâ®à¨î
|
|
||||||
.ID_FAT DB 'FAT32 ' ;
|
|
||||||
.PART3_SHARED_SIZE EQU $ - .PART3_SHARED
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
;
|
|
||||||
SECTOR_BUFFER EQU $
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DISPLAY "programm size: ",$-EXEHeader
|
DISPLAY "programm size: ",$-EXEHeader
|
||||||
Loader_End:
|
Loader_End:
|
||||||
DISPLAY "last address: ",$
|
DISPLAY "last address: ",$
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
194
format/math.asm
Normal file
194
format/math.asm
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
||||||
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ MATH ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
||||||
|
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
||||||
|
|
||||||
|
|
||||||
|
;----------------------------------------------------------------------;
|
||||||
|
IFUSED DIV_by_Shifts
|
||||||
|
; HL:DE / A => DE:BC, H=0, L - ®áâ ⮪
|
||||||
|
DIV_by_Shifts: LD C,A
|
||||||
|
DEC A
|
||||||
|
JR Z,.exit
|
||||||
|
;
|
||||||
|
AND E
|
||||||
|
LD B,A ; ®áâ ⮪
|
||||||
|
LD A,C
|
||||||
|
RRCA
|
||||||
|
.loop: SRL H
|
||||||
|
RR L
|
||||||
|
RR D
|
||||||
|
RR E
|
||||||
|
RRCA
|
||||||
|
JP NC,.loop
|
||||||
|
;
|
||||||
|
LD A,B
|
||||||
|
.exit: LD B,D
|
||||||
|
LD C,E
|
||||||
|
EX DE,HL
|
||||||
|
LD H,0
|
||||||
|
LD L,A
|
||||||
|
RET
|
||||||
|
ENDIF
|
||||||
|
;----------------------------------------------------------------------;
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
; IN:
|
||||||
|
; DEBC, A
|
||||||
|
; OUT:
|
||||||
|
; HLIX = DEBC*A
|
||||||
|
DEBCxA: LD HL,0
|
||||||
|
LD IX,0
|
||||||
|
AND A
|
||||||
|
RET Z
|
||||||
|
;
|
||||||
|
.loop: ADD IX,BC
|
||||||
|
ADC HL,DE
|
||||||
|
JP C,STOP_ERROR ; ¤®å¥à
|
||||||
|
;
|
||||||
|
DEC A
|
||||||
|
JR NZ,.loop
|
||||||
|
RET
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
;HLIX/BC -> HLIX remainder DE
|
||||||
|
HLIX_div_BC: EX DE,HL
|
||||||
|
; Negate BC to allow add instead of sbc
|
||||||
|
XOR A
|
||||||
|
; Need to set HL to 0 anyways, so save 2cc and a byte
|
||||||
|
LD H,A
|
||||||
|
LD L,A
|
||||||
|
SUB C
|
||||||
|
LD C,A
|
||||||
|
SBC A,A
|
||||||
|
SUB B
|
||||||
|
LD B,A
|
||||||
|
LD A,D
|
||||||
|
CALL .sub8
|
||||||
|
RLA
|
||||||
|
LD D,A
|
||||||
|
LD A,E
|
||||||
|
CALL .sub8
|
||||||
|
RLA
|
||||||
|
LD E,A
|
||||||
|
LD A,XH
|
||||||
|
CALL .sub8
|
||||||
|
RLA
|
||||||
|
LD XH,A
|
||||||
|
LD A,XL
|
||||||
|
CALL .sub8
|
||||||
|
RLA
|
||||||
|
LD XL,A
|
||||||
|
EX DE,HL
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
.sub8: CALL .iter1
|
||||||
|
.iter1: CALL .iter2
|
||||||
|
.iter2: CALL .sub
|
||||||
|
.sub: RLA
|
||||||
|
ADC HL,HL
|
||||||
|
JR C,.skip
|
||||||
|
;
|
||||||
|
ADD HL,BC
|
||||||
|
RET C
|
||||||
|
;
|
||||||
|
SBC HL,BC
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
.skip: ADD HL,BC
|
||||||
|
SCF
|
||||||
|
RET
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
; -> HLDE * BC. BC = á⥯¥ì ¤¢®©ª¨
|
||||||
|
; <- AHLDE
|
||||||
|
; CF=1 - error
|
||||||
|
MUL32_POWER2: SRL B
|
||||||
|
RR C
|
||||||
|
LD A,B
|
||||||
|
OR C
|
||||||
|
RET Z
|
||||||
|
;
|
||||||
|
XOR A
|
||||||
|
.loop: EX DE,HL
|
||||||
|
ADD HL,HL
|
||||||
|
EX DE,HL
|
||||||
|
ADC HL,HL
|
||||||
|
ADC A,0
|
||||||
|
JP C,STOP_ERROR
|
||||||
|
;
|
||||||
|
SRL B
|
||||||
|
RR C
|
||||||
|
JR NC,.loop
|
||||||
|
;
|
||||||
|
;EX DE,HL
|
||||||
|
AND A
|
||||||
|
RET
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
; -> HL / DE. DE = á⥯¥ì ¤¢®©ª¨
|
||||||
|
; <- A = HL / DE
|
||||||
|
; CF=1 - error
|
||||||
|
DIV16_POWER2: XOR A
|
||||||
|
.loop: INC A
|
||||||
|
SBC HL,DE
|
||||||
|
JR NC,.loop
|
||||||
|
DEC A
|
||||||
|
RET Z ; error: ¤¥«¨¬®¥ < ¤¥«¨â¥«ï
|
||||||
|
CCF
|
||||||
|
RET
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
MACRO DIV_RL
|
||||||
|
RL H
|
||||||
|
RLA
|
||||||
|
ADD A,C
|
||||||
|
JR C,.exit
|
||||||
|
SUB C
|
||||||
|
.exit:
|
||||||
|
ENDM
|
||||||
|
;
|
||||||
|
;Input: HLDE is numerator, A<129 is the divisor.
|
||||||
|
;Output: HLDE is quotient, A is remainder, C is negated
|
||||||
|
HLDE_Div_A: NEG
|
||||||
|
LD C,A
|
||||||
|
XOR A
|
||||||
|
CALL .div
|
||||||
|
LD B,H
|
||||||
|
LD H,L
|
||||||
|
CALL .div
|
||||||
|
LD L,H
|
||||||
|
LD H,D
|
||||||
|
CALL .div
|
||||||
|
LD D,H
|
||||||
|
LD H,E
|
||||||
|
CALL .div
|
||||||
|
LD E,H
|
||||||
|
LD H,B
|
||||||
|
RL E
|
||||||
|
RL D
|
||||||
|
ADC HL,HL
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
.div: DIV_RL
|
||||||
|
DIV_RL
|
||||||
|
DIV_RL
|
||||||
|
DIV_RL
|
||||||
|
DIV_RL
|
||||||
|
DIV_RL
|
||||||
|
DIV_RL
|
||||||
|
RL H
|
||||||
|
RLA
|
||||||
|
ADD A,C
|
||||||
|
RET C
|
||||||
|
SUB C
|
||||||
|
RET
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
655
format/new_format.asm
Normal file
655
format/new_format.asm
Normal file
@ -0,0 +1,655 @@
|
|||||||
|
;!TODO:
|
||||||
|
; [ ] Dss.DRV.Open
|
||||||
|
; [ ] Dss.DRV.Close
|
||||||
|
; [ ] .SectorsPerFAT32 DWORD 0 error ¥á«¨ áâ à訩 ¡ ©â !=0
|
||||||
|
; [ ] .FAT.LABEL DB 'NO_LABEL ' ¤®¯®«¨â¥«ì® ¯¨á âì ¢ ª®à¥¢ãî ¤¨à¥ªâ®à¨î
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
BOOT_SECTOR EQU #00
|
||||||
|
.JMP EQU #00 ; BLOCK 3,0 BS_jmpBoot Jump to bootstrap (E.g. eb 3c 90; on i86: JMP 003E NOP. One finds either eb xx 90, or e9 xx xx.
|
||||||
|
.ID_NAME EQU #03 ; TEXT 8 BS_OEMName DOS NAME - DB "DSS_1.70"
|
||||||
|
; Block Parameters BIOS
|
||||||
|
.BytesPerSector GenIOCTL.GetParams EQU #0B ; WORD #200 BPB_BytsPerSec <09> §¬¥à ᥪâ®à ¢ ¡ ©â å
|
||||||
|
.SectorsPerCluster ;!TODO EQU #0D ; BYTE 2 BPB_SecPerClus <09> §¬¥à ª« áâ¥à ¢ ᥪâ®à å
|
||||||
|
.RESERVED_SECTORS !RESERVED_SECTORS EQU #0E ; WORD 1 BPB_ResvdSecCnt <09> §¬¥à á¨á⥬®© ®¡« á⨠(¢ª«îç ï íâ®â ᥪâ®à) RESERVE SECTORS
|
||||||
|
.Number_of_FATs 2 EQU #10 ; BYTE 2 BPB_NumFATs Š®«¨ç¥á⢮ â ¡«¨æ FAT
|
||||||
|
.FilesInRootDIR 0 EQU #11 ; WORD 112 BPB_RootEntCnt —¨á«® ®¯¨á ⥫¥© ä ©«®¢ ¢ ª®à¥¢®¬ ª â «®£¥ (¢ FAT32 - 0)
|
||||||
|
.SectorsPerDrive 0 EQU #13 ; WORD 1440 BPB_TotSec16 ޡ饥 ç¨á«® ᥪâ®à®¢ ¤¨áª¥ (¥á«¨ 0, â® à §¬¥à - ¢ .BPB_BIG_TOTAL_SECTORS)
|
||||||
|
.DRIVE_TYPE !DRV_TYPE EQU #15 ; BYTE #F0 BPB_Media ’¨¯ ãáâனáâ¢
|
||||||
|
.SectorsPerFAT16 0 EQU #16 ; WORD 2 BPB_FATSz16 <09> §¬¥à ®¤®© FAT ¢ ᥪâ®à å (0 ¢ FAT32)
|
||||||
|
.SectorsPerTrack GenIOCTL.GetParams EQU #18 ; WORD 9 BPB_SecPerTrk <09> §¬¥à ¤®à®¦ª¨ ¢ ᥪâ®à å
|
||||||
|
.HEADS GenIOCTL.GetParams EQU #1A ; WORD 2 BPB_NumHeads ª®«¨ç¥á⢮ £®«®¢®ª
|
||||||
|
.HIDDEN EQU #1C ; DWORD 0 BPB_HiddSec ª®«¨ç¥á⢮ áªàëâëå ᥪâ®à®¢
|
||||||
|
.BPB_BIG_TOTAL_SECTORS_L EQU #20 ; WORD 0 BPB_TotSec32 BIG TOTAL SECTOR Low word
|
||||||
|
.BPB_BIG_TOTAL_SECTORS_H EQU #22 ; WORD 0 BPB_TotSec32 BIG TOTAL SECTOR High word
|
||||||
|
; FAT 32
|
||||||
|
.SectorsPerFAT32 EQU #24 ; DWORD 4 BPB_FATSz32 <09> §¬¥à ®¤®© FAT ¢ ᥪâ®à å
|
||||||
|
.MainFATnumber 0 EQU #28 ; WORD 0 BPB_ExtFlags <09>®¬¥à £« ¢®© â ¡«¨æë FAT
|
||||||
|
.Version 0 EQU #2A ; WORD 0 BPB_FSVer ‚¥àá¨ï FAT32 (®¡ëç® 0)
|
||||||
|
.RootDirStartCluster 2 EQU #2C ; DWORD 2 BPB_RootClus <09>¥à¢ë© ª« áâ¥à ª®à¥¢®£® ª â «®£ (®¡ëç® 2)
|
||||||
|
.FSINFO_Sector 1 EQU #30 ; WORD 1 BPB_FSInfo <09>®¬¥à ᥪâ®à áâàãªâãàë FSINFO (®¡ëç® 1)
|
||||||
|
.CopyBootSector 6 EQU #32 ; WORD 6 BPB_BkBootSec <09>®¬¥à ᥪâ®à - ª®¯¨¨ § £à㧮箣® (®¡ëç® 6)
|
||||||
|
.reserved_block: 0 EQU #34 ; BLOCK 12 BPB_Reserved ‡ १¥à¢¨à®¢ ®
|
||||||
|
.FDD_Number GenIOCTL.GetParams&#F0 EQU #40 ; BYTE 0 BS_DrvNum <09>®¬¥à ¤¨áª®¢®¤ ¤«ï äãªæ¨© BIOS
|
||||||
|
.reserved_2: 0 EQU #41 ; BYTE 0 BS_Reserved1 ‡ १¥à¢¨à®¢ ®
|
||||||
|
.FAT32.EXT_BOOT_REC_SIGNATURE EQU #42 ; BYTE #29 BS_BootSig ‘¨£ âãà - #29
|
||||||
|
.FAT32.SERIAL_NUMBER EQU #43 ; DWORD 0 BS_VolID VOLUME SERIAL NUMBER
|
||||||
|
.FAT32.LABEL EQU #47 ; TEXT 11 BS_VolLab Œ¥âª ¤¨áª
|
||||||
|
.ID_FAT32 EQU #52 ; TEXT 8 BS_FilSysType €¡¡à¥¢¨ âãà ä ©«®¢®© á¨á⥬ë
|
||||||
|
.BOOT_CODE_FAT32 EQU #5A
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
!DRV_TYPE: GenIOCTL.GetParams - 䨧¨ç¥áª¨© ®¬¥à
|
||||||
|
0,1 - BIOS.DRV_GET_PAR - ⨯ ä«®¯ àï
|
||||||
|
#8x - Hard Drive
|
||||||
|
®á⠫쮥 ¯®¤ã¬ âì
|
||||||
|
;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
¤«ï ᬥ饨ï FAT ¤® ªà ⮣® 4096 § 票ï:
|
||||||
|
1) tmp1 = ((.HIDDEN + min_last_sector) & #0F)>0 ) * #10
|
||||||
|
2) tmp2 = (.HIDDEN + min_last_sector) & #FFFF'FFF0
|
||||||
|
3) tmp3 = tmp2 + tmp1
|
||||||
|
4) error = (tmp3 >= #1000'0000) ; LBA28
|
||||||
|
reserved_sectors = ( ((.HIDDEN + min_last_sector) & #0F)>0 ) * #10) - .HIDDEN
|
||||||
|
;;;;;;;;;;;;;;;;;
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; DSS Drive Formatter
|
||||||
|
FAT32_FORMAT:
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
MAKE_AUTO: LD (STOP_ERROR.Save_SP),SP
|
||||||
|
;!FIXIT
|
||||||
|
LD A,(FMTDISK)
|
||||||
|
LD (VARIABLES.CurrentDrive),A
|
||||||
|
;
|
||||||
|
CALL CALCULATE_FAT
|
||||||
|
CALL FORMAT_DRIVE
|
||||||
|
;!FIXIT
|
||||||
|
;CALL MAKE_ROOT_DIR_LABEL ; ¯¥à¢ ï § ¯¨áì ¢ root dir - ¬¥âª , ¯®â®¬ 㫨
|
||||||
|
RET
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
; Ž¯à¥¤¥«¥¨¥ ¯ à ¬¥â஢ ®á¨â¥«ï ¨ ¢ë¡®à FAT
|
||||||
|
CALCULATE_FAT: CALL .STEP1 ; íâ ¤®«¦ ¡ëâì ®¡é¥© ¤«ï § ¯®«¥¨ï £¥®¬¥âਨ ¤¨áª
|
||||||
|
; €¢â®¬ â¨ç¥áª¨© ¢ë¡®à FAT_TYPE, RESERVED_SECTORS, SectorsPerCluster
|
||||||
|
CALL .STEP2
|
||||||
|
; ¤ «ìè¥ ãáâ ¢«¨¢ ¥¬ £¥®¬¥âà¨î. “¦¥ ¤®«¦¥ ¡ëâì ¢ë¡à ⨯ FAT
|
||||||
|
CALL .STEP3
|
||||||
|
RET
|
||||||
|
;--------------;
|
||||||
|
|
||||||
|
|
||||||
|
;--------------;
|
||||||
|
.STEP1: LD A,(VARIABLES.CurrentDrive)
|
||||||
|
LD BC,Dss.DRV.GenIOCTL.GetMoreParams
|
||||||
|
RST ToDSS.DRV
|
||||||
|
JR NC,.set_hidden
|
||||||
|
;
|
||||||
|
CP BIOS.Error.InvalidSubFunction
|
||||||
|
JP NZ,STOP_ERROR
|
||||||
|
; ¥á«¨ ¥â â ª®© ¯®¤äãªæ¨¨ ¢ ¤à ©¢¥à¥, ⮠ᬥ饨¥ = 0
|
||||||
|
LD HL,0
|
||||||
|
LD D,H
|
||||||
|
LD E,L
|
||||||
|
;
|
||||||
|
.set_hidden: LD (FAT_PARAMETERS.HIDDEN),DE
|
||||||
|
LD (FAT_PARAMETERS.HIDDEN + 2),HL
|
||||||
|
LD A,(VARIABLES.CurrentDrive)
|
||||||
|
LD BC,Dss.DRV.GenIOCTL.GetParams
|
||||||
|
RST ToDSS.DRV
|
||||||
|
JP C,STOP_ERROR
|
||||||
|
;!TODO CHECK ERROR ¥¯®¤å®¤ï騩 ¤¨áª
|
||||||
|
;
|
||||||
|
LD (VARIABLES.DriveExtendedParameters),A
|
||||||
|
EX AF,AF'
|
||||||
|
AND #F0
|
||||||
|
LD (FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER),A
|
||||||
|
LD (FAT_PARAMETERS.FDD_Number),A
|
||||||
|
EXX
|
||||||
|
LD (FAT_PARAMETERS.SectorsPerTrack),BC
|
||||||
|
LD (FAT_PARAMETERS.HEADS),DE
|
||||||
|
EXX
|
||||||
|
; !FIXIT ¢ ਠ⠤«ï ¢¨â
|
||||||
|
LD A,H
|
||||||
|
OR L
|
||||||
|
JR NZ,.BPB_BIG_TOTAL_SECTORS
|
||||||
|
;
|
||||||
|
LD (FAT_PARAMETERS.SectorsPerDrive),DE
|
||||||
|
;!TODO ãáâ ®¢¨âì ä« £, çâ® ¬¥«ª¨© ¤¨áª ¥ ¤«ï FAT32 ¯à¨ €¢â®¬ â¥
|
||||||
|
JR .STEP1_2
|
||||||
|
;
|
||||||
|
.BPB_BIG_TOTAL_SECTORS:
|
||||||
|
LD (FAT_PARAMETERS.BPB_BIG_TOTAL_SECTORS_L),DE
|
||||||
|
LD (FAT_PARAMETERS.BPB_BIG_TOTAL_SECTORS_H),HL
|
||||||
|
.STEP1_2: ; à §¬¥à ᥪâ®à
|
||||||
|
XOR A
|
||||||
|
SRL B
|
||||||
|
RRA
|
||||||
|
LD C,A
|
||||||
|
LD (FAT_PARAMETERS.BytesPerSector),BC
|
||||||
|
; à §¬¥à ¤¨áª ¢ ¡ ©â å EDLHA
|
||||||
|
CALL MUL32_POWER2
|
||||||
|
LD (VARIABLES.VOLUME_SIZE_BYTES),DE
|
||||||
|
LD (VARIABLES.VOLUME_SIZE_BYTES + 2),HL
|
||||||
|
LD (VARIABLES.VOLUME_SIZE_BYTES + 4),A
|
||||||
|
RET
|
||||||
|
;--------------;
|
||||||
|
|
||||||
|
|
||||||
|
;--------------;
|
||||||
|
; €¢â®¬ â¨ç¥áª¨© ¢ë¡®à FAT_TYPE, RESERVED_SECTORS, SectorsPerCluster
|
||||||
|
.STEP2: CALL AUTO_CHOOSE_FAT_PARAMS
|
||||||
|
JR C,STOP_ERROR
|
||||||
|
;
|
||||||
|
LD A,C
|
||||||
|
LD (VARIABLES.FAT_TYPE),A
|
||||||
|
CP TABLES.FAT32
|
||||||
|
LD HL,(VARIABLES.Fat32_ReservedSectors)
|
||||||
|
JR Z,.set_reserved_s
|
||||||
|
;
|
||||||
|
;!FIXIT ¯à®¢¥àª FDD/HDD
|
||||||
|
LD HL,(VARIABLES.FatHDD_ReservedSectors)
|
||||||
|
;
|
||||||
|
.set_reserved_s:
|
||||||
|
LD (FAT_PARAMETERS.RESERVED_SECTORS),HL
|
||||||
|
LD HL,(FAT_PARAMETERS.BytesPerSector)
|
||||||
|
DEC HL
|
||||||
|
SBC HL,DE
|
||||||
|
LD HL,(FAT_PARAMETERS.BytesPerSector)
|
||||||
|
EX DE,HL
|
||||||
|
JR C,.BPS_OK
|
||||||
|
; á«ãç ©, ¥á«¨ â ¡«¨çë© ª« áâ¥à ¬¥ìè¥ á¥ªâ®à
|
||||||
|
LD A,1
|
||||||
|
.BPS_OK: CALL C,DIV16_POWER2
|
||||||
|
JR C,STOP_ERROR
|
||||||
|
;
|
||||||
|
LD (FAT_PARAMETERS.SectorsPerCluster),A
|
||||||
|
RET
|
||||||
|
;--------------;
|
||||||
|
|
||||||
|
|
||||||
|
;--------------;
|
||||||
|
; ¤ «ìè¥ ãáâ ¢«¨¢ ¥¬ £¥®¬¥âà¨î. “¦¥ ¤®«¦¥ ¡ëâì ¢ë¡à ⨯ FAT
|
||||||
|
;IN:
|
||||||
|
; FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER
|
||||||
|
; FAT_PARAMETERS.SectorsPerDrive
|
||||||
|
; FAT_PARAMETERS.BPB_BIG_TOTAL_SECTORS_L
|
||||||
|
; FAT_PARAMETERS.BPB_BIG_TOTAL_SECTORS_H
|
||||||
|
;OUT:
|
||||||
|
; VARIABLES.NotUsedSpace
|
||||||
|
; VARIABLES.total_clusters_L
|
||||||
|
; VARIABLES.total_clusters_H
|
||||||
|
; CALC_TOTAL_CLUSTERS.fat_size_l
|
||||||
|
; CALC_TOTAL_CLUSTERS.fat_size_h
|
||||||
|
; FAT_PARAMETERS.DRIVE_TYPE
|
||||||
|
; FAT_PARAMETERS.SectorsPerFAT16
|
||||||
|
; FAT_PARAMETERS.SectorsPerFAT32
|
||||||
|
.STEP3: CALL GET_DRIVE_TYPE
|
||||||
|
JR C,STOP_ERROR
|
||||||
|
;
|
||||||
|
LD A,B
|
||||||
|
LD (FAT_PARAMETERS.DRIVE_TYPE),A
|
||||||
|
LD HL,(FAT_PARAMETERS.SectorsPerDrive)
|
||||||
|
LD A,H
|
||||||
|
OR L
|
||||||
|
JR NZ,.total_sectors
|
||||||
|
;
|
||||||
|
LD HL,(FAT_PARAMETERS.BPB_BIG_TOTAL_SECTORS_H)
|
||||||
|
LD (CALC_TOTAL_CLUSTERS.t_sec_h),HL
|
||||||
|
LD HL,(FAT_PARAMETERS.BPB_BIG_TOTAL_SECTORS_L)
|
||||||
|
.total_sectors: LD (CALC_TOTAL_CLUSTERS.t_sec_l),HL
|
||||||
|
CALL CALC_TOTAL_CLUSTERS
|
||||||
|
LD HL,(CALC_TOTAL_CLUSTERS.fat_size_l)
|
||||||
|
LD A,(VARIABLES.FAT_TYPE)
|
||||||
|
CP TABLES.FAT32
|
||||||
|
JR Z,.it_is_fat32
|
||||||
|
;
|
||||||
|
LD (FAT_PARAMETERS.SectorsPerFAT16),HL
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
.it_is_fat32: LD (FAT_PARAMETERS.SectorsPerFAT32),HL
|
||||||
|
LD HL,(CALC_TOTAL_CLUSTERS.fat_size_h)
|
||||||
|
LD (FAT_PARAMETERS.SectorsPerFAT32 + 2),HL
|
||||||
|
RET
|
||||||
|
;--------------;
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
STOP_ERROR:
|
||||||
|
.Save_SP+1: LD SP,0
|
||||||
|
;!TODO
|
||||||
|
SCF
|
||||||
|
;
|
||||||
|
RET
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
; data_sectors = total_sectors - reserved_sectors - root_dir_sectors - (num_fats * fat_sz)
|
||||||
|
; IN: DE:HL = total_sectors
|
||||||
|
; OUT: (VARIABLES.NotUsedSpace)
|
||||||
|
; (VARIABLES.total_clusters_L)
|
||||||
|
; (VARIABLES.total_clusters_H)
|
||||||
|
; (CALC_TOTAL_CLUSTERS.fat_size_l)
|
||||||
|
; (CALC_TOTAL_CLUSTERS.fat_size_h)
|
||||||
|
|
||||||
|
CALC_TOTAL_CLUSTERS:
|
||||||
|
.t_sec_h+1: LD DE,0
|
||||||
|
.t_sec_l+1: LD HL,0
|
||||||
|
; data_sectors
|
||||||
|
AND A
|
||||||
|
; total_sectors - reserved_sectors
|
||||||
|
LD BC,(FAT_PARAMETERS.RESERVED_SECTORS)
|
||||||
|
SBC HL,BC
|
||||||
|
JR NC,.skip_dec_DE
|
||||||
|
;
|
||||||
|
AND A
|
||||||
|
DEC DE
|
||||||
|
.skip_dec_DE: ; DE:HL = total_sectors - reserved_sectors
|
||||||
|
PUSH DE
|
||||||
|
PUSH HL
|
||||||
|
;num_fats * fat_sz32; fat_sz32 ¢ ª« áâ¥à å
|
||||||
|
.fat_size_l+1: LD BC,0
|
||||||
|
.fat_size_h+1: LD DE,0
|
||||||
|
LD A,(FAT_PARAMETERS.Number_of_FATs)
|
||||||
|
CALL DEBCxA
|
||||||
|
;
|
||||||
|
LD B,H
|
||||||
|
LD C,L
|
||||||
|
PUSH IX
|
||||||
|
POP DE
|
||||||
|
;num_fats * fat_sz32 = BCDE
|
||||||
|
;
|
||||||
|
LD HL,(VARIABLES.RootDirSectors) ; !FIXIT ¯¨á âì ¯à®æ¥¤ãàã ¢ëç¨á«¥¨ï RootDirSectors ¤® ¢ë§®¢ í⮩
|
||||||
|
ADD HL,DE
|
||||||
|
JR NC,.skip_inc
|
||||||
|
;
|
||||||
|
AND A
|
||||||
|
INC BC
|
||||||
|
.skip_inc: EX DE,HL
|
||||||
|
;num_fats * fat_sz32 + root_dir_sectors = BC:DE
|
||||||
|
;
|
||||||
|
POP HL
|
||||||
|
SBC HL,DE
|
||||||
|
EX DE,HL
|
||||||
|
POP HL
|
||||||
|
SBC HL,BC
|
||||||
|
JR C,STOP_ERROR
|
||||||
|
; data_sectors = HL:DE
|
||||||
|
;
|
||||||
|
; total_clusters
|
||||||
|
LD A,(FAT_PARAMETERS.SectorsPerCluster)
|
||||||
|
CALL HLDE_Div_A
|
||||||
|
LD (VARIABLES.NotUsedSpace),A
|
||||||
|
; total_clusters = HL:DE
|
||||||
|
;
|
||||||
|
LD (VARIABLES.total_clusters_L),DE
|
||||||
|
LD (VARIABLES.total_clusters_H),HL
|
||||||
|
; fat_size
|
||||||
|
LD B,D
|
||||||
|
LD C,E
|
||||||
|
EX DE,HL
|
||||||
|
; total_clusters = DE:BC
|
||||||
|
;
|
||||||
|
LD A,(VARIABLES.FAT_TYPE)
|
||||||
|
.call_calc: CALL DEBCxA
|
||||||
|
;DE:BC * A = HL:IX
|
||||||
|
;
|
||||||
|
LD BC,(FAT_PARAMETERS.BytesPerSector)
|
||||||
|
LD A,(VARIABLES.FAT_TYPE)
|
||||||
|
CP TABLES.FAT12
|
||||||
|
JR NZ,.no_sla
|
||||||
|
;
|
||||||
|
SLA C
|
||||||
|
RL B
|
||||||
|
.no_sla: DEC BC
|
||||||
|
ADD IX,BC
|
||||||
|
JR NC,.skip_inc_HL
|
||||||
|
;
|
||||||
|
INC HL
|
||||||
|
.skip_inc_HL: INC BC
|
||||||
|
CALL HLIX_div_BC
|
||||||
|
; ®ªà㣫¥¨¥ ¢¯¥àñ¤
|
||||||
|
LD A,D
|
||||||
|
OR E
|
||||||
|
JR Z,.set_new_size
|
||||||
|
;
|
||||||
|
LD BC,1
|
||||||
|
ADD IX,BC
|
||||||
|
DEC C
|
||||||
|
ADC HL,BC
|
||||||
|
; fat_size = HLIX
|
||||||
|
.set_new_size: LD DE,(.fat_size_l)
|
||||||
|
LD BC,(.fat_size_h)
|
||||||
|
LD (.fat_size_l),IX
|
||||||
|
LD (.fat_size_h),HL
|
||||||
|
AND A
|
||||||
|
SBC HL,BC
|
||||||
|
JR NZ,.next_loop
|
||||||
|
;
|
||||||
|
PUSH IX
|
||||||
|
POP HL
|
||||||
|
SBC HL,DE
|
||||||
|
RET Z
|
||||||
|
.next_loop: ;
|
||||||
|
.counter+1: LD A,32 ; loop counter
|
||||||
|
DEC A
|
||||||
|
LD (.counter),A
|
||||||
|
JP NZ,CALC_TOTAL_CLUSTERS
|
||||||
|
JP STOP_ERROR
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
;!TODO ¤®¤¥« âì ¤«ï ¤¨áª¥â
|
||||||
|
GET_DRIVE_TYPE: LD A,(FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER)
|
||||||
|
CP DRIVE_CODES.SPRINTER.ATA
|
||||||
|
LD B,BOOT_SECTOR.Hard_Drive
|
||||||
|
RET Z
|
||||||
|
; ¤¨áª¥âë ¨ ª®£¤ -¨¡ã¤ì ATAPI
|
||||||
|
SCF
|
||||||
|
RET
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
; -> ¤®«¦® ¡ëâì ãáâ ®¢«¥® § 票¥ VOLUME_SIZE_BYTES.
|
||||||
|
; <- DE - CLUSTER SIZE.
|
||||||
|
; C - FAT TYPE.
|
||||||
|
AUTO_CHOOSE_FAT_PARAMS:
|
||||||
|
LD DE,(VARIABLES.VOLUME_SIZE_BYTES + 3)
|
||||||
|
LD IX,TABLES.FAT_TYPES
|
||||||
|
LD A,TABLES.FAT_TYPES.Records
|
||||||
|
LD BC,TABLES.FAT_TYPES.LineSize
|
||||||
|
.loop: LD L,(IX)
|
||||||
|
LD H,(IX+1)
|
||||||
|
AND A
|
||||||
|
SBC HL,DE
|
||||||
|
JR C,.found
|
||||||
|
JR Z,.found
|
||||||
|
;
|
||||||
|
ADD IX,BC
|
||||||
|
DEC A
|
||||||
|
JR NZ,.loop
|
||||||
|
; ã á FAT12 c ª« áâ¥à®¬ ¢ 512
|
||||||
|
; ¤® ¯à®¢¥à¨âì à §¤¥« ¬¨¨¬ «ìë© à §¬¥à ¤«ï FAT
|
||||||
|
; sec_bpb + sec_fat + sec_root_dir + sec_for_data
|
||||||
|
LD A,D
|
||||||
|
OR E
|
||||||
|
JR NZ,.found
|
||||||
|
;
|
||||||
|
LD HL,(VARIABLES.VOLUME_SIZE_BYTES + 1)
|
||||||
|
LD DE,8
|
||||||
|
SBC HL,DE
|
||||||
|
RET C ; à §¤¥« ᫨誮¬ ¬ « ¤«ï FAT12 (<2048)
|
||||||
|
.found: ; ¤®áâ ñ¬ ¯ à ¬¥âàë ¨§ â ¡«¨æë
|
||||||
|
DI
|
||||||
|
LD (.restore_SP),SP
|
||||||
|
LD SP,IX
|
||||||
|
POP HL ; 宫®á⮥
|
||||||
|
POP DE ; CLUSTER SIZE
|
||||||
|
POP BC ; C - FAT TYPE
|
||||||
|
LD A,C
|
||||||
|
.restore_SP+1: LD SP,0
|
||||||
|
EI
|
||||||
|
AND A
|
||||||
|
RET
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
FORMAT_DRIVE: CALL CLEAN_SECTOR_BUFFER
|
||||||
|
;
|
||||||
|
LD HL,FAT_PARAMETERS.PART1
|
||||||
|
LD DE,SECTOR_BUFFER
|
||||||
|
LD BC,FAT_PARAMETERS.PART1_SIZE
|
||||||
|
LDIR
|
||||||
|
;
|
||||||
|
LD A,(VARIABLES.FAT_TYPE)
|
||||||
|
CP TABLES.FAT32
|
||||||
|
;!FIXIT
|
||||||
|
JP NZ,STOP_ERROR
|
||||||
|
;
|
||||||
|
CALL MAKE_SYS_SECTORS
|
||||||
|
CALL CLEAN_SECTOR_BUFFER
|
||||||
|
; clean all fat tables at drive
|
||||||
|
LD A,(VARIABLES.FAT_TYPE)
|
||||||
|
CP TABLES.FAT32
|
||||||
|
LD BC,(FAT_PARAMETERS.SectorsPerFAT32)
|
||||||
|
LD DE,(FAT_PARAMETERS.SectorsPerFAT32 + 2)
|
||||||
|
JR Z,.its_fat32
|
||||||
|
;
|
||||||
|
LD BC,(FAT_PARAMETERS.SectorsPerFAT16)
|
||||||
|
LD DE,0
|
||||||
|
.its_fat32: LD (.add_l),BC
|
||||||
|
LD (.add_h),DE
|
||||||
|
LD A,(FAT_PARAMETERS.Number_of_FATs)
|
||||||
|
CALL DEBCxA
|
||||||
|
; HL:IX - ¢á¥£® ᥪâ®à®¢ ¤«ï § ¯¨á¨
|
||||||
|
PUSH HL
|
||||||
|
PUSH IX
|
||||||
|
EXX
|
||||||
|
POP DE
|
||||||
|
POP HL
|
||||||
|
EXX
|
||||||
|
; HL':DE' - ¢á¥£® ᥪâ®à®¢ ¤«ï § ¯¨á¨
|
||||||
|
;
|
||||||
|
LD IX,(FAT_PARAMETERS.RESERVED_SECTORS)
|
||||||
|
LD HL,0
|
||||||
|
EXX
|
||||||
|
.write_loop: PUSH HL
|
||||||
|
PUSH DE
|
||||||
|
EXX
|
||||||
|
PUSH HL
|
||||||
|
PUSH IX
|
||||||
|
; HL:IX - ⥪ã騩 ᥪâ®à FAT
|
||||||
|
CALL WRITE_SECTOR_BUFFER
|
||||||
|
;
|
||||||
|
POP IX
|
||||||
|
POP HL
|
||||||
|
LD BC,1
|
||||||
|
ADD IX,BC
|
||||||
|
DEC C
|
||||||
|
ADC HL,BC
|
||||||
|
EXX
|
||||||
|
LD BC,1
|
||||||
|
POP HL
|
||||||
|
SBC HL,BC
|
||||||
|
POP DE
|
||||||
|
EX DE,HL
|
||||||
|
DEC C
|
||||||
|
SBC HL,BC
|
||||||
|
JR NZ,.write_loop
|
||||||
|
;
|
||||||
|
LD A,D
|
||||||
|
OR E
|
||||||
|
JR NZ,.write_loop
|
||||||
|
EXX
|
||||||
|
; make fat table
|
||||||
|
LD HL,(FAT_PARAMETERS.DRIVE_TYPE)
|
||||||
|
LD H,#FF
|
||||||
|
LD (SECTOR_BUFFER),HL
|
||||||
|
LD L,H
|
||||||
|
LD (SECTOR_BUFFER + 2),HL
|
||||||
|
LD A,(VARIABLES.FAT_TYPE)
|
||||||
|
CP TABLES.FAT12
|
||||||
|
JR NZ,.not_fat12
|
||||||
|
; fat12
|
||||||
|
XOR A
|
||||||
|
LD (SECTOR_BUFFER + 3),A
|
||||||
|
JR .write_fat
|
||||||
|
;
|
||||||
|
.not_fat12 CP TABLES.FAT16
|
||||||
|
JR Z,.write_fat
|
||||||
|
;fat32
|
||||||
|
;
|
||||||
|
LD HL,.Fat32Data
|
||||||
|
LD DE,SECTOR_BUFFER + 3
|
||||||
|
LD BC,.Fat32Data.Size
|
||||||
|
LDIR
|
||||||
|
;
|
||||||
|
.write_fat: LD A,(FAT_PARAMETERS.Number_of_FATs)
|
||||||
|
LD HL,0
|
||||||
|
LD D,H
|
||||||
|
LD E,L
|
||||||
|
PUSH HL
|
||||||
|
POP IX
|
||||||
|
LD BC,(FAT_PARAMETERS.RESERVED_SECTORS)
|
||||||
|
;
|
||||||
|
.write_tbl_fat: ADD IX,BC
|
||||||
|
ADC HL,DE
|
||||||
|
PUSH AF
|
||||||
|
PUSH HL
|
||||||
|
PUSH IX
|
||||||
|
; HL:IX - ⥪ã騩 ᥪâ®à FAT
|
||||||
|
;
|
||||||
|
CALL WRITE_SECTOR_BUFFER
|
||||||
|
;
|
||||||
|
.add_l+1: LD BC,0
|
||||||
|
.add_h+1: LD DE,0
|
||||||
|
POP IX
|
||||||
|
POP HL
|
||||||
|
POP AF
|
||||||
|
DEC A
|
||||||
|
JR NZ,.write_tbl_fat
|
||||||
|
RET
|
||||||
|
;
|
||||||
|
.Fat32Data: DB #0F,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#0F
|
||||||
|
.Fat32Data.Size EQU $-.Fat32Data
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
MAKE_SYS_SECTORS:
|
||||||
|
LD HL,FAT_PARAMETERS.PART2_FAT32
|
||||||
|
LD BC,FAT_PARAMETERS.PART2_FAT32_SIZE + FAT_PARAMETERS.PART3_SHARED_SIZE
|
||||||
|
LDIR
|
||||||
|
;
|
||||||
|
LD HL,#AA55
|
||||||
|
LD (SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE),HL
|
||||||
|
;
|
||||||
|
LD HL,0
|
||||||
|
LD IX,0
|
||||||
|
CALL WRITE_SECTOR_BUFFER
|
||||||
|
LD HL,0
|
||||||
|
LD IX,(FAT_PARAMETERS.CopyBootSector)
|
||||||
|
CALL WRITE_SECTOR_BUFFER
|
||||||
|
;
|
||||||
|
LD A,(VARIABLES.FAT_TYPE)
|
||||||
|
CP TABLES.FAT32
|
||||||
|
RET NZ
|
||||||
|
;
|
||||||
|
CALL CLEAN_SECTOR_BUFFER
|
||||||
|
LD HL,#AA55
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL
|
||||||
|
;
|
||||||
|
LD HL,#5252
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE),HL
|
||||||
|
LD HL,#4161
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.LEAD_SIGNATURE + 2),HL
|
||||||
|
;
|
||||||
|
LD HL,#7272
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE),HL
|
||||||
|
LD HL,#6141
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.DATA_SIGNATURE + 2),HL
|
||||||
|
;
|
||||||
|
LD HL,(VARIABLES.FAT32_RootDirClusters)
|
||||||
|
LD DE,(FAT_PARAMETERS.RootDirStartCluster) ; FIXED!
|
||||||
|
ADD HL,DE
|
||||||
|
LD DE,(FAT_PARAMETERS.RootDirStartCluster + 2)
|
||||||
|
JR NC,.no_inc_de
|
||||||
|
;
|
||||||
|
INC DE
|
||||||
|
.no_inc_de: LD (SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER + 2),DE
|
||||||
|
;
|
||||||
|
LD B,H
|
||||||
|
LD C,L
|
||||||
|
LD HL,(VARIABLES.total_clusters_L)
|
||||||
|
LD IX,(VARIABLES.total_clusters_H)
|
||||||
|
SBC HL,BC
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL
|
||||||
|
PUSH IX
|
||||||
|
POP HL
|
||||||
|
SBC HL,DE
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT + 2),HL
|
||||||
|
;
|
||||||
|
LD IX,(FAT_PARAMETERS.FSINFO_Sector)
|
||||||
|
LD HL,0
|
||||||
|
CALL WRITE_SECTOR_BUFFER
|
||||||
|
;
|
||||||
|
LD HL,#FFFF
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER),HL
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER + 2),HL
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT),HL
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT + 2),HL
|
||||||
|
INC HL
|
||||||
|
LD IX,(FAT_PARAMETERS.CopyBootSector)
|
||||||
|
LD DE,(FAT_PARAMETERS.FSINFO_Sector)
|
||||||
|
ADD IX,DE
|
||||||
|
PUSH IX
|
||||||
|
CALL WRITE_SECTOR_BUFFER
|
||||||
|
;
|
||||||
|
CALL CLEAN_SECTOR_BUFFER
|
||||||
|
LD HL,#AA55
|
||||||
|
LD (SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL
|
||||||
|
LD HL,0
|
||||||
|
LD IX,(FAT_PARAMETERS.FSINFO_Sector)
|
||||||
|
INC IX
|
||||||
|
CALL WRITE_SECTOR_BUFFER
|
||||||
|
POP IX
|
||||||
|
INC IX
|
||||||
|
LD HL,0
|
||||||
|
CALL WRITE_SECTOR_BUFFER
|
||||||
|
RET
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
CLEAN_SECTOR_BUFFER:
|
||||||
|
LD HL,SECTOR_BUFFER
|
||||||
|
LD DE,SECTOR_BUFFER + 1
|
||||||
|
LD BC,4096 - 1 ; ¡ã¤ã饥, ¤«ï ᥪâ®à®¢ ¡®«ìè¥ 512
|
||||||
|
LD (HL),0
|
||||||
|
LDIR
|
||||||
|
RET
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
;!FIXIT check error
|
||||||
|
WRITE_SECTOR_BUFFER:
|
||||||
|
LD A,(VARIABLES.CurrentDrive)
|
||||||
|
.sectors+2: LD BC,256*1 + Dss.DRV.Write
|
||||||
|
LD DE,SECTOR_BUFFER
|
||||||
|
JP ToDSS.DRV
|
||||||
|
;-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
include 'math.asm'
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
include 'data.z80'
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
SECTOR_BUFFER EQU $
|
||||||
|
.SIZE EQU 4096
|
||||||
|
ASSERT SECTOR_BUFFER + SECTOR_BUFFER.SIZE < #C000, "ERROR: SECTOR_BUFFER"
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
Loading…
Reference in New Issue
Block a user