diff --git a/Messages.z80 b/Messages.z80 index cb6c838..5c2b74a 100644 --- a/Messages.z80 +++ b/Messages.z80 @@ -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 ;----------------------------------------------------------------------- diff --git a/data.z80 b/data.z80 index 000854d..152f5d0 100644 --- a/data.z80 +++ b/data.z80 @@ -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] diff --git a/ddf_build.txt b/ddf_build.txt index f0b5c72..4b6f9c3 100644 --- a/ddf_build.txt +++ b/ddf_build.txt @@ -1 +1 @@ -57 \ No newline at end of file +64 \ No newline at end of file diff --git a/format.asm b/format.asm index a10bc3c..e4dd7c8 100644 --- a/format.asm +++ b/format.asm @@ -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' //////////////////////////////////////////////////////////////////////// diff --git a/math.asm b/math.asm index fdb72ab..77683fb 100644 --- a/math.asm +++ b/math.asm @@ -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