уже лучше

This commit is contained in:
Tolik 2026-04-24 00:56:29 +10:00
parent 8e61332b03
commit d997a4374f
5 changed files with 360 additions and 27 deletions

View File

@ -40,6 +40,12 @@ Version_Msg: DB "DSS Drive Formatter v"
ASSERT Version_Msg.Size < 80+4, "ERROR: Version_Msg to long!" ASSERT Version_Msg.Size < 80+4, "ERROR: Version_Msg to long!"
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
Error_Msg: DZ "\r\n\r\nError!!!\r\n\r\n"
;-----------------------------------------------------------------------
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
;!FIXIT Color settings ;!FIXIT Color settings
col_magenta EQU 5 col_magenta EQU 5
@ -49,6 +55,9 @@ col_cmd EQU 16
PARAMS_MSG: BYTE "\r\nDrive " PARAMS_MSG: BYTE "\r\nDrive "
.disk BYTE "A: " .disk BYTE "A: "
BYTE "will be formatted using the current settings:\r\n\r\n" BYTE "will be formatted using the current settings:\r\n\r\n"
BYTE "Partition size:\t", col_cmd,col_magenta, "%S bytes", col_cmd,col_white, "\r\n"
BYTE "Available size:\t", col_cmd,col_magenta, "%S bytes", col_cmd,col_white, "\r\n"
BYTE "Unused space:\t", col_cmd,col_magenta, "%lu bytes", col_cmd,col_white, "\r\n"
BYTE "Clusters:\t", col_cmd,col_magenta, "%lu", col_cmd,col_white, "\r\n" BYTE "Clusters:\t", col_cmd,col_magenta, "%lu", col_cmd,col_white, "\r\n"
BYTE "Cluster size:\t", col_cmd,col_magenta, "%u bytes", col_cmd,col_white, "\r\n" BYTE "Cluster size:\t", col_cmd,col_magenta, "%u bytes", col_cmd,col_white, "\r\n"
BYTE "File system:\t", col_cmd,col_magenta, "%S", col_cmd,col_white, "\r\n" BYTE "File system:\t", col_cmd,col_magenta, "%S", col_cmd,col_white, "\r\n"
@ -57,12 +66,17 @@ PARAMS_MSG: BYTE "\r\nDrive "
BYTE 'Press "Y" for format or any other key to exit', "\r\n" BYTE 'Press "Y" for format or any other key to exit', "\r\n"
BYTE 0 BYTE 0
.ptr: WORD PARAMS_MSG .ptr: WORD PARAMS_MSG
WORD .fullSize
WORD .dataSize
.unused: DWORD 0
.Clusters: DWORD 0 .Clusters: DWORD 0
.Clu_size: WORD 0 .Clu_size: WORD 0
.FAT: WORD .FATtxt WORD .FATtxt
.Serial: DWORD 0 .Serial: DWORD 0
.Label: WORD .LabelTxt WORD .LabelTxt
; ;
.FATtxt: DZ 'FAT ' .FATtxt: DZ 'FAT '
.LabelTxt: DZ 'NO LABEL ' .LabelTxt: DZ 'NO LABEL '
.fullSize: BYTE ' ',0
.dataSize: BYTE ' ',0
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------

View File

@ -8,6 +8,17 @@ FAT16 EQU 2 ;
FAT12 EQU 3 ; § ®¤­® ¨ ¬­®¦¨â¥«ì FAT12 EQU 3 ; § ®¤­® ¨ ¬­®¦¨â¥«ì
FAT32 EQU 4 ; § ®¤­® ¨ ¬­®¦¨â¥«ì FAT32 EQU 4 ; § ®¤­® ¨ ¬­®¦¨â¥«ì
; ;
;
MaxClustersNumber:
.FAT12 EQU 4084
.FAT16 EQU 65524
;
MaxDataSectorsNumber:
.FAT12_L EQU #0000
.FAT12_H EQU #07FA
.FAT16_L EQU #0000
.FAT16_H EQU #7FFA
;
FilesInRootDIR: FilesInRootDIR:
.FDD_DD EQU 112 .FDD_DD EQU 112
.FDD_HD EQU 224 .FDD_HD EQU 224
@ -31,9 +42,9 @@ FAT_ReservedSectors:
FAT_TYPES: FAT_TYPES_LINE #0800, 32768, CONSTANTS.FAT32 ; > 32768 FAT_TYPES: FAT_TYPES_LINE #0800, 32768, CONSTANTS.FAT32 ; > 32768
FAT_TYPES_LINE #0400, 16384, CONSTANTS.FAT32 ; 16384..32768 Mb FAT_TYPES_LINE #0400, 16384, CONSTANTS.FAT32 ; 16384..32768 Mb
FAT_TYPES_LINE #0200, 8192, CONSTANTS.FAT32 ; 8192..16384 Mb FAT_TYPES_LINE #0200, 8192, CONSTANTS.FAT32 ; 8192..16384 Mb
FAT_TYPES_LINE #0100, 4096, CONSTANTS.FAT32 ; 4096..8192 Mb FAT_TYPES_LINE #0080, 4096, CONSTANTS.FAT32 ; 2048..8192 Mb
FAT_TYPES_LINE #0080, 32768, CONSTANTS.FAT16 ; 2048..4096 Mb FAT_TYPES_LINE #0060, 32768, CONSTANTS.FAT16 ; 1536..2047 Mb
FAT_TYPES_LINE #0040, 16384, CONSTANTS.FAT16 ; 1023..2048 Mb FAT_TYPES_LINE #0040, 16384, CONSTANTS.FAT16 ; 1023..1535 Mb
FAT_TYPES_LINE #0020, 8192, CONSTANTS.FAT16 ; 511..1023 Mb FAT_TYPES_LINE #0020, 8192, CONSTANTS.FAT16 ; 511..1023 Mb
FAT_TYPES_LINE #0010, 4096, CONSTANTS.FAT16 ; 256..511 Mb FAT_TYPES_LINE #0010, 4096, CONSTANTS.FAT16 ; 256..511 Mb
FAT_TYPES_LINE #0008, 2048, CONSTANTS.FAT16 ; 128..256 Mb FAT_TYPES_LINE #0008, 2048, CONSTANTS.FAT16 ; 128..256 Mb
@ -110,14 +121,14 @@ VARIABLES EQU $
;.Fat32_ReservedSectors WORD 32 ;.Fat32_ReservedSectors WORD 32
.ReservedSectors WORD 0 ; [ ] .ReservedSectors WORD 0 ; [ ]
.RootDirSectors D24 0 ; [ ] .RootDirSectors D24 0 ; [ ]
.NotUsedSpace BYTE 0 ; in sectors .NotUsedSpace WORD 0 ; in sectors ; [ ] ­¥¯à ¢¨«ì­® áç¨â îâáï?
.total_clusters_L: WORD 0 ; [x] .total_clusters_L: WORD 0 ; [x]
.total_clusters_H: WORD 0 ; [x] .total_clusters_H: WORD 0 ; [x]
.FAT32_RootDirClusters WORD 1 ; [ ] .FAT32_RootDirClusters WORD 1 ; [ ]
.FAT.LABEL BYTE 'NO_LABEL ' ; [ ] .FAT.LABEL BYTE 'NO_LABEL ' ; [ ]
.DriveExtendedParameters BYTE 0 ; [ ] .DriveExtendedParameters BYTE 0 ; [ ]
.DataSectors_L WORD 0 ; [ ] .DataSectors_L WORD 0 ; [ ] ­¥¯à ¢¨«ì­® áç¨â îâáï?
.DataSectors_H WORD 0 ; [ ] .DataSectors_H WORD 0 ; [ ] ­¥¯à ¢¨«ì­® áç¨â îâáï?
.RootDirFirstSector_L WORD 0 ; [x] ¢ëç¨á«ï¥âáï ¢ FORMAT_DRIVE .RootDirFirstSector_L WORD 0 ; [x] ¢ëç¨á«ï¥âáï ¢ FORMAT_DRIVE
.RootDirFirstSector_H WORD 0 ; [x] ¢ëç¨á«ï¥âáï ¢ FORMAT_DRIVE .RootDirFirstSector_H WORD 0 ; [x] ¢ëç¨á«ï¥âáï ¢ FORMAT_DRIVE
.SectorsPerFAT_L WORD 0 ; [x] .SectorsPerFAT_L WORD 0 ; [x]

View File

@ -1 +1 @@
57 64

View File

@ -322,12 +322,23 @@ STOP_ERROR:
LD B,DSS_Error.sys.INVALID_FUNCTION LD B,DSS_Error.sys.INVALID_FUNCTION
;!TODO ;!TODO
EXIT: PUSH BC EXIT: LD C,Dss.Exit
PUSH BC
LD HL,Exit_Path LD HL,Exit_Path
LD C,Dss.ChDir LD C,Dss.ChDir
RST ToDSS RST ToDSS
; ;
LD C,Dss.Exit POP BC
LD A,B
AND A
JP Z,ToDSS
;
PUSH BC
LD HL,Error_Msg
LD C,Dss.PChars
RST ToDSS
;
POP BC
RST ToDSS RST ToDSS
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
@ -393,7 +404,7 @@ CALC_TOTAL_CLUSTERS:
.skip_dec_DE: ; DE:HL = total_sectors - reserved_sectors .skip_dec_DE: ; DE:HL = total_sectors - reserved_sectors
.push_regs: PUSH DE .push_regs: PUSH DE
PUSH HL PUSH HL
;num_fats * fat_sz32; fat_sz32 ¢ ª« áâ¥à å ;num_fats * fat_size; fat_size ¢ ª« áâ¥à å
.fat_size_l+1: LD BC,0 .fat_size_l+1: LD BC,0
.fat_size_h+1: LD DE,0 .fat_size_h+1: LD DE,0
LD A,(FAT_PARAMETERS.Number_of_FATs) LD A,(FAT_PARAMETERS.Number_of_FATs)
@ -403,7 +414,7 @@ CALC_TOTAL_CLUSTERS:
LD C,L LD C,L
PUSH IX PUSH IX
POP DE POP DE
;num_fats * fat_sz32 = BCDE ;num_fats * fat_size = BCDE
; ;
LD HL,(VARIABLES.RootDirSectors) LD HL,(VARIABLES.RootDirSectors)
ADD HL,DE ADD HL,DE
@ -413,7 +424,7 @@ CALC_TOTAL_CLUSTERS:
ADC HL,BC ADC HL,BC
LD B,H LD B,H
LD C,L LD C,L
;num_fats * fat_sz32 + root_dir_sectors = BC:DE ;num_fats * fat_size + root_dir_sectors = BC:DE
; ;
POP HL POP HL
SBC HL,DE SBC HL,DE
@ -421,15 +432,26 @@ CALC_TOTAL_CLUSTERS:
POP HL POP HL
SBC HL,BC SBC HL,BC
JP C,STOP_ERROR JP C,STOP_ERROR
; data_sectors = HL:DE ; data_sectors = HL:DE 0x7FFA0000
;
;CALL CHECK_MAX_DATA_SECTORS
JP C,STOP_ERROR ; ᬥ­¨âì FAT type?
;
LD (VARIABLES.DataSectors_L),DE LD (VARIABLES.DataSectors_L),DE
LD (VARIABLES.DataSectors_H),HL LD (VARIABLES.DataSectors_H),HL
;
; total_clusters ; total_clusters
LD A,(FAT_PARAMETERS.SectorsPerCluster) LD A,(FAT_PARAMETERS.SectorsPerCluster)
CALL HLDE_Div_A CALL HLDE_Div_A
LD (VARIABLES.NotUsedSpace),A ; total_clusters = HL:DE, A - unused space in sectors
; total_clusters = HL:DE
; ;
LD B,0
LD C,A
LD IX,(VARIABLES.NotUsedSpace)
ADD IX,BC
JP C,STOP_ERROR ; ᬥ­¨âì FAT type?
;
LD (VARIABLES.NotUsedSpace),IX
LD (VARIABLES.total_clusters_L),DE LD (VARIABLES.total_clusters_L),DE
LD (VARIABLES.total_clusters_H),HL LD (VARIABLES.total_clusters_H),HL
; fat_size ; fat_size
@ -487,6 +509,79 @@ CALC_TOTAL_CLUSTERS:
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
IFUSED CHECK_MAX_DATA_SECTORS
; IN: data_sectors = HL:DE
; OUT: CF=0 corrected data_sectors = HL:DE
; CF=1 ᫨誮¬ ¡®«ìè ï à §­¨æ 
CHECK_MAX_DATA_SECTORS:
LD BC,0
LD (VARIABLES.NotUsedSpace),BC
LD A,(VARIABLES.FAT_TYPE)
SUB CONSTANTS.FAT12
RET NC ; good sectors
;
PUSH HL
PUSH DE
;
LD BC,CONSTANTS.MaxDataSectorsNumber.FAT12_H
JR Z,.sectors_fat12
; sectors_fat16
LD BC,CONSTANTS.MaxDataSectorsNumber.FAT16_H
.sectors_fat12: PUSH BC
LD BC,(FAT_PARAMETERS.BytesPerSector)
CALL MUL32_POWER2
; A:HL:DE
;
POP BC
AND A
JR NZ,.too_mutch
;
AND A
SBC HL,BC
JR C,.good_sectors
;
JR NZ,.get_clu
LD A,D
OR E
JR Z,.good_sectors
;
.get_clu: PUSH DE
POP IX
PUSH BC
LD BC,(FAT_PARAMETERS.BytesPerSector)
CALL HLIX_div_BC
POP BC
; HLIX remainder DE
; ¯® ¨¤¥¥, DE = 0 âãâ
;
LD A,H
OR L
JR NZ,.too_mutch
;
LD (VARIABLES.NotUsedSpace),IX
LD IX,0
LD H,B
LD L,C
LD BC,(FAT_PARAMETERS.BytesPerSector)
CALL HLIX_div_BC
PUSH IX
POP DE
POP BC
POP BC
AND A
RET
;
.good_sectors: SCF
.too_mutch: POP DE
POP HL
CCF
RET
;
ENDIF
;-----------------------------------------------------------------------
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
SET_RESERVED_AND_ROOTDIR: SET_RESERVED_AND_ROOTDIR:
LD A,(VARIABLES.FAT_TYPE) LD A,(VARIABLES.FAT_TYPE)
@ -1043,26 +1138,51 @@ JP_HL: EX DE,HL
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
;!FIXIT ;!FIXIT
SHOW_FORMAT_PARAMETERS: SHOW_FORMAT_PARAMETERS:
;.disk
LD A,(VARIABLES.CurrentDrive) LD A,(VARIABLES.CurrentDrive)
ADD 'A' ADD 'A'
LD (PARAMS_MSG.disk),A LD (PARAMS_MSG.disk),A
; ;.unused
LD BC,(FAT_PARAMETERS.BytesPerSector)
LD DE,(VARIABLES.NotUsedSpace)
LD HL,0
CALL MUL32_POWER2
LD (PARAMS_MSG.unused),DE
LD (PARAMS_MSG.unused + 2),HL
;.fullSize
LD HL,(VARIABLES.VOLUME_SIZE_BYTES + 2)
EXX
LD HL,(VARIABLES.VOLUME_SIZE_BYTES)
LD A,(VARIABLES.VOLUME_SIZE_BYTES + 4)
LD DE,PARAMS_MSG.fullSize
CALL PRINT_5BYTES
;.dataSize
LD HL,(VARIABLES.DataSectors_H)
LD DE,(VARIABLES.DataSectors_L)
LD BC,(FAT_PARAMETERS.BytesPerSector)
CALL MUL32_POWER2
PUSH DE
EXX
POP HL
LD DE,PARAMS_MSG.dataSize
CALL PRINT_5BYTES
;.Clusters
LD HL,(VARIABLES.total_clusters_L) LD HL,(VARIABLES.total_clusters_L)
LD (PARAMS_MSG.Clusters),HL LD (PARAMS_MSG.Clusters),HL
LD HL,(VARIABLES.total_clusters_H) LD HL,(VARIABLES.total_clusters_H)
LD (PARAMS_MSG.Clusters + 2),HL LD (PARAMS_MSG.Clusters + 2),HL
; ;.Clu_size
LD HL,(VARIABLES.ClusterSize) LD HL,(VARIABLES.ClusterSize)
LD (PARAMS_MSG.Clu_size),HL LD (PARAMS_MSG.Clu_size),HL
; ;.FATtxt
LD HL,(FAT_PARAMETERS.ID_FAT+3) LD HL,(FAT_PARAMETERS.ID_FAT+3)
LD (PARAMS_MSG.FATtxt + 3),HL LD (PARAMS_MSG.FATtxt + 3),HL
; ;.Serial
LD HL,(FAT_PARAMETERS.SERIAL_NUMBER_1) LD HL,(FAT_PARAMETERS.SERIAL_NUMBER_1)
LD (PARAMS_MSG.Serial),HL
LD HL,(FAT_PARAMETERS.SERIAL_NUMBER_2)
LD (PARAMS_MSG.Serial + 2),HL LD (PARAMS_MSG.Serial + 2),HL
; LD HL,(FAT_PARAMETERS.SERIAL_NUMBER_2)
LD (PARAMS_MSG.Serial),HL
;.LabelTxt
LD HL,FAT_PARAMETERS.LABEL LD HL,FAT_PARAMETERS.LABEL
LD DE,PARAMS_MSG.LabelTxt LD DE,PARAMS_MSG.LabelTxt
LD BC,FAT_PARAMETERS.LABEL.Size LD BC,FAT_PARAMETERS.LABEL.Size
@ -1297,6 +1417,195 @@ PutHexNumb: PUSH AF
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
; A:HL':HL - ç¨á«® ¤«ï ¯¥à¥¢®¤ 
; DE - ¡ãä¥à ¤«ï ⥪á⮢®© áâப¨
PRINT_5BYTES: PUSH DE
LD IX,L40BIT.Str ; "00"
LD C,#17
EXX
LD DE,#4876
EXX
LD DE,#E800
; C:DE':DE = 100,000,000,000
CALL GET_BIG_DIG
LD C,#02
EXX
LD DE,#540B
EXX
LD DE,#E400
; C:DE':DE = 10,000,000,000
CALL GET_BIG_DIG
LD C,#00
EXX
LD DE,#3B9A
EXX
LD DE,#CA00
; C:DE':DE = 1,000,000,000
CALL GET_BIG_DIG
; DE':DE = 100,000,000
CALL .skip_1
POP DE
;LD DE,SIZE_BUFFER.high ; "0 000 000 000"
LD HL,L40BIT.Str ; "0000000000"
LDI
LDI
LD A,(HL)
LDI
CP " "
JR Z,1F
;
LD A,"," ; à §¤. à §à冷¢
1: LD (DE),A
INC DE
LDI
LDI
LD A,(HL)
LDI
CP " "
JR Z,1F
;
LD A,"," ; à §¤. à §à冷¢
1: LD (DE),A
INC DE
LDI
LDI
LD A,(HL)
LDI
CP " "
JR Z,1F
;
LD A,"," ; à §¤. à §à冷¢
1: LD (DE),A
INC DE
LDI
LDI
LDI
;SCF
RET
;
.skip_1: EXX
LD DE,#05F5
EXX
LD DE,#E100
; DE':DE = 100,000,000
CALL GET_DIG ; 100,000,000...999,999,999
EXX
LD DE,#98
EXX
LD DE,#9680
; DE':DE = 10,000,000
CALL GET_DIG ; 10,000,000...99,999,999
EXX
LD DE,#0F
EXX
LD DE,#4240
; DE':DE = 1,000,000
CALL GET_DIG ; 1,000,000...9,999,999
EXX
LD DE,#01
EXX
LD DE,#86A0
; DE':DE = 100,000
CALL GET_DIG ; 100,000...999,999
EXX
LD DE,#00
EXX
LD DE,#2710
; DE':DE = 10,000
CALL GET_DIG ; 10,000...99,999
EXX
LD DE,#00
EXX
LD DE,#03E8
; DE':DE = 1,000
CALL GET_DIG ; 1,000...9,999
EXX
LD DE,#00
EXX
LD DE,#64
; DE':DE = 100
CALL GET_DIG ; 100..999
EXX
LD DE,#00
EXX
LD DE,#0A
; DE':DE = 10
CALL GET_DIG ; 10..99
LD A,L
ADD A,"0"
LD (ix+0),A
INC IX
RET
;
GET_DIG: LD A,"0"-1
AND A
.loop: INC A
SBC HL,DE
EXX
SBC HL,DE
EXX
JR NC,.loop
;
ADD HL,DE
EXX
ADC HL,DE
EXX
CP "0"
JR NZ,.putChar
;
LD B,A
LD A,(ix-1)
CP " "
JR Z,.putChar
;
LD A,B
.putChar: LD (ix+0),A
INC IX
RET
;
GET_BIG_DIG: LD B,"0"-1
AND A
.loop: INC B
SBC HL,DE
EXX
SBC HL,DE
EXX
SBC A,C
JR NC,.loop
;
ADD HL,DE
EXX
ADC HL,DE
EXX
ADC A,C
EX AF,AF'
LD A,B
CP "0"
JR NZ,.putChar
;
LD A,(ix-1)
CP " "
JR Z,.putChar
;
LD A,B
.putChar: LD (ix+0),A
EX AF,AF'
INC IX
RET
;
L40BIT: DB " " ; ¬ àª¥à ¤«ï ix-1
.Str: DB " " ; 00
L32BIT_: DB " " ; 000000000
.end: DB "0"
;
; SIZE_BUFFER: db " " ; ¬ àª¥à ¤«ï ix-1
; .high db " " ; "00"
; .low: db " ",0,0 ; "0 000 000 000",0,0
; .bytes equ SIZE_BUFFER - $
;-----------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
include 'math.asm' include 'math.asm'
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////

View File

@ -127,7 +127,6 @@ HLIX_div_BC: EX DE,HL
;----------------------------------------------------------------------- ;-----------------------------------------------------------------------
; -> HLDE * BC. BC = á⥯¥­ì ¤¢®©ª¨ ; -> HLDE * BC. BC = á⥯¥­ì ¤¢®©ª¨
; <- AHLDE ; <- AHLDE
; CF=1 - error
MUL32_POWER2: SRL B MUL32_POWER2: SRL B
RR C RR C
LD A,B LD A,B
@ -140,7 +139,7 @@ MUL32_POWER2: SRL B
EX DE,HL EX DE,HL
ADC HL,HL ADC HL,HL
ADC A,0 ADC A,0
JP C,STOP_ERROR JP C,STOP_ERROR ; CF=1 - error
; ;
SRL B SRL B
RR C RR C