From 209709448f40360f5bd4db8a8959715c375bdd07 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 3 Apr 2026 00:50:52 +1000 Subject: [PATCH] =?UTF-8?q?=D0=B2=20=D0=BE=D0=B1=D1=89=D0=B5=D0=BC=20FAT32?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared_Includes | 2 +- format/format.asm | 811 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 718 insertions(+), 95 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index c020ce3..440cb45 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit c020ce3b569f171558e159af931aca3a0fdb78bf +Subproject commit 440cb45e755dbb4c4c00ac1d193a6701c5684704 diff --git a/format/format.asm b/format/format.asm index 06346d0..f72bcae 100755 --- a/format/format.asm +++ b/format/format.asm @@ -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 ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -56,6 +69,8 @@ main: DI CALL prepare JR NC,.ok_drive ; + CALL FAT32_FORMAT + ; LD A,"\a" ; bell SYS ESTEX_pchar 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 $)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 .STEP1: ; 轤 ぎΝ °碎 ♂ォ か キ ギモ爬 え瓷 @@ -907,19 +892,20 @@ FORMAT_FAT32: LD (.Save_SP),SP CP BIOS.Error.InvalidSubFunction JR Z,.GetParams ; メ モ や祗罔 む▲爛, 皰 甃ラキ┘ = 0 SCF - JR .ERROR + 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 - JR C,.ERROR + 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 @@ -940,23 +926,25 @@ FORMAT_FAT32: LD (.Save_SP),SP LD (CALCULATED_FAT_PARAMETERS.BytesPerSector),BC ; Кム え瓷 CALL MUL32_POWER2 - LD (VOLUME_SIZE_BYTES),DE - LD (VOLUME_SIZE_BYTES + 2),HL - LD (VOLUME_SIZE_BYTES + 4),A + 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,.ERROR + JR C,STOP_ERROR ; LD A,C LD (CALCULATED_FAT_PARAMETERS.FAT_TYPE),A CP TABLES.FAT32 - LD A,(RESERVED_SECTORS.FAT32) + LD HL,RESERVED_SECTORS.FAT32 JR Z,.set_reserved_s ; - LD A,(RESERVED_SECTORS.FAT) + ;!FIXIT 牀▲爲 FDD/HDD + LD HL,RESERVED_SECTORS.FAT_HDD + ; .set_reserved_s: - LD (CALCULATED_FAT_PARAMETERS.RESERVED_SECTORS),A + LD (CALCULATED_FAT_PARAMETERS.RESERVED_SECTORS),HL LD HL,(CALCULATED_FAT_PARAMETERS.BytesPerSector) DEC HL SBC HL,DE @@ -966,31 +954,511 @@ FORMAT_FAT32: LD (.Save_SP),SP ; 甄竍, メ ゛膈覃 痰ム キ跏 瓮皰 LD A,1 .BPS_OK: CALL C,DIV16_POWER2 - JR C,.ERROR + JR C,STOP_ERROR ; LD (CALCULATED_FAT_PARAMETERS.SectorsPerCluster),A ; CALL GET_DRIVE_TYPE - JR C,.ERROR + 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 +;----------------------------------------------------------------------- - - -.ERROR: ; +;----------------------------------------------------------------------- +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 Кム ゛肓 瓮皰 + +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 @@ -998,10 +1466,10 @@ GET_DRIVE_TYPE: LD A,(CALCULATED_FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER) ; え瓷モ -─磴 ATAPI SCF RET -;;;;;;;; - +;----------------------------------------------------------------------- +;----------------------------------------------------------------------- ; -> DE - 4 5 硅 Кム Гカ. ; ぎΝ °碎 竅←キ Л腑┘ VOLUME_SIZE_BYTES. ; <- DE - CLUSTER SIZE. @@ -1014,6 +1482,7 @@ AUTO_CHOOSE_FAT_PARAMS: LD H,(IX+1) SBC HL,DE JR C,.found + JR Z,.found ; ADD IX,BC DEC A @@ -1025,7 +1494,7 @@ AUTO_CHOOSE_FAT_PARAMS: OR E JR NZ,.found ; - LD HL,(VOLUME_SIZE_BYTES + 1) + LD HL,(VARIABLES.VOLUME_SIZE_BYTES + 1) LD DE,8 SBC HL,DE RET C ; Гカ 甄茯 か FAT12 (<2048) @@ -1039,13 +1508,22 @@ AUTO_CHOOSE_FAT_PARAMS: LD A,C .restore_SP+1: LD SP,0 EI + AND A RET +;----------------------------------------------------------------------- +;----------------------------------------------------------------------- ; -> HLDE * BC. BC = 痰クキ あ ; <- AHLDE ; 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 ADD HL,HL EX DE,HL @@ -1057,11 +1535,13 @@ MUL32_POWER2: XOR A RR C JR NC,.loop ; - EX DE,HL + ;EX DE,HL AND A RET +;----------------------------------------------------------------------- +;----------------------------------------------------------------------- ; -> HL / DE. DE = 痰クキ あ ; <- A = HL / DE ; CF=1 - error @@ -1073,36 +1553,179 @@ DIV16_POWER2: XOR 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 + MACRO FAT_TYPES_LINE vol_size, clu_size, fat_type + WORD vol_size, clu_size + BYTE fat_type ENDM MODULE TABLES -FAT12 EQU 0 -FAT16 EQU 1 -FAT32 EQU 2 +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 +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 +.Records EQU ($ - FAT_TYPES)/.LineSize ENDMODULE ; + + +; +RESERVED_SECTORS: ;predefined () +.FAT_FDD EQU 1 +.FAT_HDD EQU 8 +.FAT32 EQU #2032 ;32 ; - ENDIF \ No newline at end of file + +; +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 ; [ ] Кム ぎ牀Κ 瓮皰 +.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 +Loader_End: + DISPLAY "last address: ",$ \ No newline at end of file