в общем FAT32 работает

This commit is contained in:
Tolik 2026-04-03 00:50:52 +10:00
parent da1d4e1cb7
commit 209709448f
2 changed files with 718 additions and 95 deletions

@ -1 +1 @@
Subproject commit c020ce3b569f171558e159af931aca3a0fdb78bf Subproject commit 440cb45e755dbb4c4c00ac1d193a6701c5684704

View File

@ -1,3 +1,16 @@
;ÚÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¿
;³ DSS Drive Formatter for Sprinter ³
;³ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ³
;³ Tolik_Trek ³
;³ 2026 ³
;ÀÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÙ
INCLUDE "shared_includes/constants/SP2000.inc"
INCLUDE "shared_includes/constants/bios_equ.inc"
INCLUDE "shared_includes/constants/dss_equ.inc"
INCLUDE "shared_includes/structures/FileSystem.inc"
;ÚÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¿ ;ÚÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¿
;³ FORMAT - Disk Format Utility for Sprinter ³ ;³ FORMAT - Disk Format Utility for Sprinter ³
;³ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ³ ;³ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ³
@ -56,6 +69,8 @@ main: DI
CALL prepare CALL prepare
JR NC,.ok_drive JR NC,.ok_drive
; ;
CALL FAT32_FORMAT
;
LD A,"\a" ; bell LD A,"\a" ; bell
SYS ESTEX_pchar SYS ESTEX_pchar
LD DE,ProcessErr_Msg.ptr LD DE,ProcessErr_Msg.ptr
@ -784,17 +799,6 @@ badClust_Msg: DB cr,lf,"Bad cluster size.",cr,lf,cr,lf,0
buff EQU ( high $ + ((low $)<?1) ) * 256 buff EQU ( high $ + ((low $)<?1) ) * 256
; ALIGN 256
; buff:
; equ ($/80h)*80h+80h
DISPLAY "programm size: ",$-EXEHeader
Loader_End:
DISPLAY "last address: ",$
; SAVEBIN "format.exe",EXEHeader,$-EXEHeader
IFUSED FAT32_FORMAT IFUSED FAT32_FORMAT
@ -841,48 +845,9 @@ BOOT_SECTOR EQU #00
!RESERVED_SECTORS: predefined (¯®ª )
.FAT12_FDD EQU 1
.FAT12_HDD
.FAT16_HDD
.FAT32_HDD EQU 32
CALCULATED_FAT_PARAMETERS:
.FAT_TYPE BYTE TABLES.FAT12 ; [x]
.BytesPerSector: WORD #200 ; predefined ; [x]
.SectorsPerCluster: BYTE 32 ; predefined ; [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: WORD 0 ; ; [x] +-
.SectorsPerFAT16: WORD 0 ; FAT32 constant ;
.HEADS WORD 0 ;
.HIDDEN DWORD 0 ; ®â ­ ç «  MBR, extMBR ; [x]
.BPB_BIG_TOTAL_SECTORS_L WORD 0 ; [x] +-
.BPB_BIG_TOTAL_SECTORS_H WORD 0 ; [x] +-
; FAT 12, FAT 16
.BPB_PHISICAL_DRIVE_NUMBER BYTE #80 ; [x]
.reserved_1 BYTE 0 ;
.FAT.EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ;
.FAT.SERIAL_NUMBER DWORD 0 ;
.FAT.LABEL TEXT 11 ;
.ID_FAT TEXT 8 ;
; FAT32
.SectorsPerFAT32 DWORD 0 ;
.MainFATnumber WORD 0 ; BPB_ExtFlags ;
.Version WORD 0 ; constant ;
.RootDirStartCluster DWORD 2 ;
.FSINFO_Sector WORD 1 ; constant ;
.CopyBootSector WORD 6 ; constant ;
.reserved_block: BLOCK 12 ; constant ;
.FDD_Number BYTE 0 ;
.reserved_2: BYTE 0 ; constant ;
.FAT32.EXT_BOOT_REC_SIGNATURE BYTE #29 ; constant ;
.FAT32.SERIAL_NUMBER DWORD 0 ;
.FAT32.LABEL TEXT 11 ;
.ID_FAT32 TEXT 8 ; constant ;
; #5A ;
¤«ï ᬥ饭¨ï FAT ¤® ªà â­®£® 4096 §­ ç¥­¨ï: ¤«ï ᬥ饭¨ï FAT ¤® ªà â­®£® 4096 §­ ç¥­¨ï:
@ -894,8 +859,28 @@ reserved_sectors = ( ((.HIDDEN + min_last_sector) & #0F)>0 ) * #10) - .HIDDEN
;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;
*/ */
;!TODO:
; Dss.DRV.Open
; Dss.DRV.Close
; DSS Drive Formatter
FAT32_FORMAT:
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
FORMAT_FAT32: LD (.Save_SP),SP
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 ; Ž¯à¥¤¥«¥­¨¥ ¯ à ¬¥â஢ ­®á¨â¥«ï ¨ ¢ë¡®à FAT
.STEP1: ; íâ  ¤®«¦­  ¡ëâì ®¡é¥© ¤«ï § ¯®«­¥­¨ï £¥®¬¥âਨ ¤¨áª  .STEP1: ; íâ  ¤®«¦­  ¡ëâì ®¡é¥© ¤«ï § ¯®«­¥­¨ï £¥®¬¥âਨ ¤¨áª 
@ -907,19 +892,20 @@ FORMAT_FAT32: LD (.Save_SP),SP
CP BIOS.Error.InvalidSubFunction CP BIOS.Error.InvalidSubFunction
JR Z,.GetParams ; ¥á«¨ ­¥â â ª®© ¯®¤ä㭪樨 ¢ ¤à ©¢¥à¥, ⮠ᬥ饭¨¥ = 0 JR Z,.GetParams ; ¥á«¨ ­¥â â ª®© ¯®¤ä㭪樨 ¢ ¤à ©¢¥à¥, ⮠ᬥ饭¨¥ = 0
SCF SCF
JR .ERROR JP STOP_ERROR
; ;
.set_hidden: LD (CALCULATED_FAT_PARAMETERS.HIDDEN),DE .set_hidden: LD (CALCULATED_FAT_PARAMETERS.HIDDEN),DE
LD (CALCULATED_FAT_PARAMETERS.HIDDEN + 2),HL LD (CALCULATED_FAT_PARAMETERS.HIDDEN + 2),HL
.GetParams: LD A,(VARIABLES.CurrentDrive) .GetParams: LD A,(VARIABLES.CurrentDrive)
LD BC,Dss.DRV.GenIOCTL.GetParams LD BC,Dss.DRV.GenIOCTL.GetParams
RST ToDSS.DRV RST ToDSS.DRV
JR C,.ERROR JP C,STOP_ERROR
;!TODO CHECK ERROR ­¥¯®¤å®¤ï騩 ¤¨áª ;!TODO CHECK ERROR ­¥¯®¤å®¤ï騩 ¤¨áª
; ;
EX AF,AF' EX AF,AF'
AND #F0 AND #F0
LD (CALCULATED_FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER),A LD (CALCULATED_FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER),A
LD (CALCULATED_FAT_PARAMETERS.FDD_Number),A
; !FIXIT ¢ à¨ ­â ¤«ï ¢¨­â  ; !FIXIT ¢ à¨ ­â ¤«ï ¢¨­â 
LD A,H LD A,H
OR L OR L
@ -940,23 +926,25 @@ FORMAT_FAT32: LD (.Save_SP),SP
LD (CALCULATED_FAT_PARAMETERS.BytesPerSector),BC LD (CALCULATED_FAT_PARAMETERS.BytesPerSector),BC
; à §¬¥à ¤¨áª  ¢ ¡ ©â å ; à §¬¥à ¤¨áª  ¢ ¡ ©â å
CALL MUL32_POWER2 CALL MUL32_POWER2
LD (VOLUME_SIZE_BYTES),DE LD (VARIABLES.VOLUME_SIZE_BYTES),DE
LD (VOLUME_SIZE_BYTES + 2),HL LD (VARIABLES.VOLUME_SIZE_BYTES + 2),HL
LD (VOLUME_SIZE_BYTES + 4),A LD (VARIABLES.VOLUME_SIZE_BYTES + 4),A
LD E,H LD E,H
LD D,A LD D,A
CALL AUTO_CHOOSE_FAT_PARAMS CALL AUTO_CHOOSE_FAT_PARAMS
JR C,.ERROR JR C,STOP_ERROR
; ;
LD A,C LD A,C
LD (CALCULATED_FAT_PARAMETERS.FAT_TYPE),A LD (CALCULATED_FAT_PARAMETERS.FAT_TYPE),A
CP TABLES.FAT32 CP TABLES.FAT32
LD A,(RESERVED_SECTORS.FAT32) LD HL,RESERVED_SECTORS.FAT32
JR Z,.set_reserved_s JR Z,.set_reserved_s
; ;
LD A,(RESERVED_SECTORS.FAT) ;!FIXIT ¯à®¢¥àª  FDD/HDD
LD HL,RESERVED_SECTORS.FAT_HDD
;
.set_reserved_s: .set_reserved_s:
LD (CALCULATED_FAT_PARAMETERS.RESERVED_SECTORS),A LD (CALCULATED_FAT_PARAMETERS.RESERVED_SECTORS),HL
LD HL,(CALCULATED_FAT_PARAMETERS.BytesPerSector) LD HL,(CALCULATED_FAT_PARAMETERS.BytesPerSector)
DEC HL DEC HL
SBC HL,DE SBC HL,DE
@ -966,31 +954,511 @@ FORMAT_FAT32: LD (.Save_SP),SP
; ­  á«ãç ©, ¥á«¨ â ¡«¨ç­ë© ª« áâ¥à ¬¥­ìè¥ á¥ªâ®à  ; ­  á«ãç ©, ¥á«¨ â ¡«¨ç­ë© ª« áâ¥à ¬¥­ìè¥ á¥ªâ®à 
LD A,1 LD A,1
.BPS_OK: CALL C,DIV16_POWER2 .BPS_OK: CALL C,DIV16_POWER2
JR C,.ERROR JR C,STOP_ERROR
; ;
LD (CALCULATED_FAT_PARAMETERS.SectorsPerCluster),A LD (CALCULATED_FAT_PARAMETERS.SectorsPerCluster),A
; ;
CALL GET_DRIVE_TYPE CALL GET_DRIVE_TYPE
JR C,.ERROR JR C,STOP_ERROR
; ;
LD A,B LD A,B
LD (CALCULATED_FAT_PARAMETERS.DRIVE_TYPE),A 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: ;
.ERROR: ;
.Save_SP+1: LD SP,0 .Save_SP+1: LD SP,0
;!TODO ;!TODO
SCF
; ;
RET 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 ¤®¤¥« âì ¤«ï ¤¨áª¥â ;!TODO ¤®¤¥« âì ¤«ï ¤¨áª¥â
;;;;;;;;
GET_DRIVE_TYPE: LD A,(CALCULATED_FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER) GET_DRIVE_TYPE: LD A,(CALCULATED_FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER)
CP DRIVE_CODES.SPRINTER.ATA CP DRIVE_CODES.SPRINTER.ATA
LD B,BOOT_SECTOR.Hard_Drive LD B,BOOT_SECTOR.Hard_Drive
@ -998,10 +1466,10 @@ GET_DRIVE_TYPE: LD A,(CALCULATED_FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER)
; ¤¨áª¥âë ¨ ª®£¤ -­¨¡ã¤ì ATAPI ; ¤¨áª¥âë ¨ ª®£¤ -­¨¡ã¤ì ATAPI
SCF SCF
RET RET
;;;;;;;; ;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
; -> DE - 4 ¨ 5 ¡ ©âë à §¬¥à  à §¤¥« . ; -> DE - 4 ¨ 5 ¡ ©âë à §¬¥à  à §¤¥« .
; ¤®«¦­® ¡ëâì ãáâ ­®¢«¥­® §­ ç¥­¨¥ VOLUME_SIZE_BYTES. ; ¤®«¦­® ¡ëâì ãáâ ­®¢«¥­® §­ ç¥­¨¥ VOLUME_SIZE_BYTES.
; <- DE - CLUSTER SIZE. ; <- DE - CLUSTER SIZE.
@ -1014,6 +1482,7 @@ AUTO_CHOOSE_FAT_PARAMS:
LD H,(IX+1) LD H,(IX+1)
SBC HL,DE SBC HL,DE
JR C,.found JR C,.found
JR Z,.found
; ;
ADD IX,BC ADD IX,BC
DEC A DEC A
@ -1025,7 +1494,7 @@ AUTO_CHOOSE_FAT_PARAMS:
OR E OR E
JR NZ,.found JR NZ,.found
; ;
LD HL,(VOLUME_SIZE_BYTES + 1) LD HL,(VARIABLES.VOLUME_SIZE_BYTES + 1)
LD DE,8 LD DE,8
SBC HL,DE SBC HL,DE
RET C ; à §¤¥« ᫨誮¬ ¬ « ¤«ï FAT12 (<2048) RET C ; à §¤¥« ᫨誮¬ ¬ « ¤«ï FAT12 (<2048)
@ -1039,13 +1508,22 @@ AUTO_CHOOSE_FAT_PARAMS:
LD A,C LD A,C
.restore_SP+1: LD SP,0 .restore_SP+1: LD SP,0
EI EI
AND A
RET RET
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
; -> HLDE * BC. BC = á⥯¥­ì ¤¢®©ª¨ ; -> HLDE * BC. BC = á⥯¥­ì ¤¢®©ª¨
; <- AHLDE ; <- AHLDE
; CF=1 - error ; CF=1 - error
MUL32_POWER2: XOR A MUL32_POWER2: SRL B
RR C
LD A,B
OR C
RET Z
;
XOR A
.loop: EX DE,HL .loop: EX DE,HL
ADD HL,HL ADD HL,HL
EX DE,HL EX DE,HL
@ -1057,11 +1535,13 @@ MUL32_POWER2: XOR A
RR C RR C
JR NC,.loop JR NC,.loop
; ;
EX DE,HL ;EX DE,HL
AND A AND A
RET RET
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
; -> HL / DE. DE = á⥯¥­ì ¤¢®©ª¨ ; -> HL / DE. DE = á⥯¥­ì ¤¢®©ª¨
; <- A = HL / DE ; <- A = HL / DE
; CF=1 - error ; CF=1 - error
@ -1073,36 +1553,179 @@ DIV16_POWER2: XOR A
RET Z ; error: ¤¥«¨¬®¥ < ¤¥«¨â¥«ï RET Z ; error: ¤¥«¨¬®¥ < ¤¥«¨â¥«ï
CCF CCF
RET 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
MACRO FAT_TYPES_LINE (vol_size, clu_size, fat_type) WORD vol_size, clu_size
WORD vol_size, clu_size : BYTE fat_type BYTE fat_type
ENDM ENDM
MODULE TABLES MODULE TABLES
FAT12 EQU 0 FAT12 EQU 3
FAT16 EQU 1 FAT16 EQU 2
FAT32 EQU 2 FAT32 EQU 4
; VOL SIZE CLUSTER SIZE FAT TYPE ; VOL SIZE CLUSTER SIZE FAT TYPE
FAT_TYPES: FAT_TYPES_LINE (#0800, 32768, FAT32) ; > 32768 FAT_TYPES: FAT_TYPES_LINE #0800, 32768, FAT32 ; > 32768
FAT_TYPES_LINE (#0400, 16384, FAT32) ; 16384..32768 Mb FAT_TYPES_LINE #0400, 16384, FAT32 ; 16384..32768 Mb
FAT_TYPES_LINE (#0200, 8192, FAT32) ; 8192..16384 Mb FAT_TYPES_LINE #0200, 8192, FAT32 ; 8192..16384 Mb
FAT_TYPES_LINE (#0100, 4096, FAT32) ; 4096..8192 Mb FAT_TYPES_LINE #0100, 4096, FAT32 ; 4096..8192 Mb
FAT_TYPES_LINE (#0080, 32768, FAT16) ; 2048..4096 Mb FAT_TYPES_LINE #0080, 32768, FAT16 ; 2048..4096 Mb
FAT_TYPES_LINE (#0040, 16384, FAT16) ; 1023..2048 Mb FAT_TYPES_LINE #0040, 16384, FAT16 ; 1023..2048 Mb
FAT_TYPES_LINE (#0020, 8192, FAT16) ; 511..1023 Mb FAT_TYPES_LINE #0020, 8192, FAT16 ; 511..1023 Mb
FAT_TYPES_LINE (#0010, 4096, FAT16) ; 256..511 Mb FAT_TYPES_LINE #0010, 4096, FAT16 ; 256..511 Mb
FAT_TYPES_LINE (#0008, 2048, FAT16) ; 128..256 Mb FAT_TYPES_LINE #0008, 2048, FAT16 ; 128..256 Mb
FAT_TYPES_LINE (#0004, 1024, FAT16) ; 64..128 Mb FAT_TYPES_LINE #0004, 1024, FAT16 ; 64..128 Mb
FAT_TYPES_LINE (#0002, 512, FAT16) ; 32..64 Mb FAT_TYPES_LINE #0002, 512, FAT16 ; 32..64 Mb
; ¥á«¨ ¬¥­ìè¥, â® FAT12 ; ¥á«¨ ¬¥­ìè¥, â® FAT12
.LineSize EQU 5 .LineSize EQU 5
.Records EQU ($ - .FAT_TYPES)/.LineSize .Records EQU ($ - FAT_TYPES)/.LineSize
ENDMODULE 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 ENDIF
DISPLAY "programm size: ",$-EXEHeader
Loader_End:
DISPLAY "last address: ",$