уже лучше

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

@ -39,6 +39,12 @@ Version_Msg: DB "DSS Drive Formatter v"
.Size EQU $-Version_Msg
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
@ -49,6 +55,9 @@ col_cmd EQU 16
PARAMS_MSG: BYTE "\r\nDrive "
.disk BYTE "A: "
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 "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"
@ -57,12 +66,17 @@ PARAMS_MSG: BYTE "\r\nDrive "
BYTE 'Press "Y" for format or any other key to exit', "\r\n"
BYTE 0
.ptr: WORD PARAMS_MSG
WORD .fullSize
WORD .dataSize
.unused: DWORD 0
.Clusters: DWORD 0
.Clu_size: WORD 0
.FAT: WORD .FATtxt
WORD .FATtxt
.Serial: DWORD 0
.Label: WORD .LabelTxt
WORD .LabelTxt
;
.FATtxt: DZ 'FAT '
.LabelTxt: DZ 'NO LABEL '
.fullSize: BYTE ' ',0
.dataSize: BYTE ' ',0
;-----------------------------------------------------------------------

View File

@ -8,6 +8,17 @@ FAT16 EQU 2 ;
FAT12 EQU 3 ; § ®¤­® ¨ ¬­®¦¨â¥«ì
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:
.FDD_DD EQU 112
.FDD_HD EQU 224
@ -31,9 +42,9 @@ FAT_ReservedSectors:
FAT_TYPES: FAT_TYPES_LINE #0800, 32768, CONSTANTS.FAT32 ; > 32768
FAT_TYPES_LINE #0400, 16384, CONSTANTS.FAT32 ; 16384..32768 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, 32768, CONSTANTS.FAT16 ; 2048..4096 Mb
FAT_TYPES_LINE #0040, 16384, CONSTANTS.FAT16 ; 1023..2048 Mb
FAT_TYPES_LINE #0080, 4096, CONSTANTS.FAT32 ; 2048..8192 Mb
FAT_TYPES_LINE #0060, 32768, CONSTANTS.FAT16 ; 1536..2047 Mb
FAT_TYPES_LINE #0040, 16384, CONSTANTS.FAT16 ; 1023..1535 Mb
FAT_TYPES_LINE #0020, 8192, CONSTANTS.FAT16 ; 511..1023 Mb
FAT_TYPES_LINE #0010, 4096, CONSTANTS.FAT16 ; 256..511 Mb
FAT_TYPES_LINE #0008, 2048, CONSTANTS.FAT16 ; 128..256 Mb
@ -110,14 +121,14 @@ VARIABLES EQU $
;.Fat32_ReservedSectors WORD 32
.ReservedSectors WORD 0 ; [ ]
.RootDirSectors D24 0 ; [ ]
.NotUsedSpace BYTE 0 ; in sectors
.NotUsedSpace WORD 0 ; in sectors ; [ ] ­¥¯à ¢¨«ì­® áç¨â îâáï?
.total_clusters_L: WORD 0 ; [x]
.total_clusters_H: WORD 0 ; [x]
.FAT32_RootDirClusters WORD 1 ; [ ]
.FAT.LABEL BYTE 'NO_LABEL ' ; [ ]
.DriveExtendedParameters BYTE 0 ; [ ]
.DataSectors_L WORD 0 ; [ ]
.DataSectors_H WORD 0 ; [ ]
.DataSectors_L WORD 0 ; [ ] ­¥¯à ¢¨«ì­® áç¨â îâáï?
.DataSectors_H WORD 0 ; [ ] ­¥¯à ¢¨«ì­® áç¨â îâáï?
.RootDirFirstSector_L WORD 0 ; [x] ¢ëç¨á«ï¥âáï ¢ FORMAT_DRIVE
.RootDirFirstSector_H WORD 0 ; [x] ¢ëç¨á«ï¥âáï ¢ FORMAT_DRIVE
.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
;!TODO
EXIT: PUSH BC
EXIT: LD C,Dss.Exit
PUSH BC
LD HL,Exit_Path
LD C,Dss.ChDir
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
;-----------------------------------------------------------------------
@ -393,7 +404,7 @@ CALC_TOTAL_CLUSTERS:
.skip_dec_DE: ; DE:HL = total_sectors - reserved_sectors
.push_regs: PUSH DE
PUSH HL
;num_fats * fat_sz32; fat_sz32 ¢ ª« áâ¥à å
;num_fats * fat_size; fat_size ¢ ª« áâ¥à å
.fat_size_l+1: LD BC,0
.fat_size_h+1: LD DE,0
LD A,(FAT_PARAMETERS.Number_of_FATs)
@ -403,7 +414,7 @@ CALC_TOTAL_CLUSTERS:
LD C,L
PUSH IX
POP DE
;num_fats * fat_sz32 = BCDE
;num_fats * fat_size = BCDE
;
LD HL,(VARIABLES.RootDirSectors)
ADD HL,DE
@ -413,7 +424,7 @@ CALC_TOTAL_CLUSTERS:
ADC HL,BC
LD B,H
LD C,L
;num_fats * fat_sz32 + root_dir_sectors = BC:DE
;num_fats * fat_size + root_dir_sectors = BC:DE
;
POP HL
SBC HL,DE
@ -421,15 +432,26 @@ CALC_TOTAL_CLUSTERS:
POP HL
SBC HL,BC
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_H),HL
;
; total_clusters
LD A,(FAT_PARAMETERS.SectorsPerCluster)
CALL HLDE_Div_A
LD (VARIABLES.NotUsedSpace),A
; total_clusters = HL:DE
; total_clusters = HL:DE, A - unused space in sectors
;
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_H),HL
; 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:
LD A,(VARIABLES.FAT_TYPE)
@ -1043,31 +1138,56 @@ JP_HL: EX DE,HL
;-----------------------------------------------------------------------
;!FIXIT
SHOW_FORMAT_PARAMETERS:
;.disk
LD A,(VARIABLES.CurrentDrive)
ADD '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 (PARAMS_MSG.Clusters),HL
LD HL,(VARIABLES.total_clusters_H)
LD (PARAMS_MSG.Clusters + 2),HL
;
;.Clu_size
LD HL,(VARIABLES.ClusterSize)
LD (PARAMS_MSG.Clu_size),HL
;
;.FATtxt
LD HL,(FAT_PARAMETERS.ID_FAT+3)
LD (PARAMS_MSG.FATtxt + 3),HL
;
;.Serial
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 HL,(FAT_PARAMETERS.SERIAL_NUMBER_2)
LD (PARAMS_MSG.Serial),HL
;.LabelTxt
LD HL,FAT_PARAMETERS.LABEL
LD DE,PARAMS_MSG.LabelTxt
LD BC,FAT_PARAMETERS.LABEL.Size
LDIR
;
;
LD IY,PARAMS_MSG.ptr
CALL printf#.str
@ -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'
////////////////////////////////////////////////////////////////////////

View File

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