diff --git a/Messages.z80 b/Messages.z80 index 3b1cbae..c6e6b10 100644 --- a/Messages.z80 +++ b/Messages.z80 @@ -88,22 +88,50 @@ PARAMS_MSG: BYTE "\r\nDrive " PARAMS_MSG: BYTE "\r\nDrive " .disk: BYTE "A: " BYTE "will be formatted using the current settings:\r\n\r\n" - BYTE "Partition size:\t" + BYTE "Partition size:\t " .fullSize: BYTE " bytes\r\n" - BYTE "Available size:\t" + BYTE "Available size:\t " .dataSize: BYTE " bytes\r\n" - BYTE "Unused space:\t" + BYTE "Unused space:\t " .unused: BYTE " bytes\r\n" - BYTE "Clusters:\t" -.Clusters: BYTE " \r\n" - BYTE "Cluster size:\t" + BYTE "Clusters:\t " +.Clusters: BYTE " \r\n" + BYTE "Cluster size:\t " .Clu_size: BYTE " bytes\r\n" - BYTE "File system:\t" + BYTE "File system:\t " .FATtxt: BYTE "FAT \r\n" - BYTE "Serial:\t\t" + BYTE "Serial:\t\t " .Serial: BYTE "0000-0000\r\n" - BYTE "Label:\t\t" -.LabelTxt: BYTE "NO LABEL \r\n\r\n" + BYTE "Label:\t\t ", '"' +.LabelTxt: BYTE 'NO LABEL "',"\r\n\r\n" BYTE 'Press "Y" for format or any other key to exit', "\r\n" BYTE 0 -;----------------------------------------------------------------------- \ No newline at end of file +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- +FORMATING_MSG: DZ "\rFormating drive. Please wait...\r\n" +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- +DONE_MSG: DZ "Done!\r\n\r\n" +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- +CANCELED_MSG: DZ "\rСancelled!\r\n\r\n" +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- +HELP_MSG: BYTE "DDF it`s quck formating utility.\r\n" + BYTE "First parameter - drive letter.\r\n" + BYTE "Available keys:\r\n" + BYTE "/? - for this help,\r\n" + BYTE '/l "label" - for label.',"\r\n" + BYTE "Example:\r\n" + DZ 'format e: /l "dsk label"',"\r\n\r\n" +;----------------------------------------------------------------------- + + diff --git a/Strings.asm b/Strings.asm index 97951dd..4a90545 100644 --- a/Strings.asm +++ b/Strings.asm @@ -35,8 +35,11 @@ PRINT_5BYTES: PUSH BC CALL GET_BIG_DIG ; DE':DE = 100,000,000 CALL .skip_1 - POP DE ; "000 000 000 000" - LD HL,L40BIT.Str ; "0000000000" + ; + ; форматирование по разрядам + POP DE ; "000.000.000.000" + PUSH DE + LD HL,L40BIT.Str ; "000000000000" LDI LDI LD A,(HL) @@ -44,7 +47,7 @@ PRINT_5BYTES: PUSH BC CP " " JR Z,1F ; - LD A,"," ; разд. разрядов + LD A,"." ; разд. разрядов 1: LD (DE),A INC DE LDI @@ -54,7 +57,7 @@ PRINT_5BYTES: PUSH BC CP " " JR Z,1F ; - LD A,"," ; разд. разрядов + LD A,"." ; разд. разрядов 1: LD (DE),A INC DE LDI @@ -64,13 +67,33 @@ PRINT_5BYTES: PUSH BC CP " " JR Z,1F ; - LD A,"," ; разд. разрядов + LD A,"." ; разд. разрядов 1: LD (DE),A INC DE LDI LDI LDI - ;SCF + ; + POP HL + LD D,H + LD E,L + LD BC,15 + 1 ;!HARDCODE длина выходного буфера с форматированным числом +.loop_space: DEC C + INC B + LD A,(HL) + INC HL + SUB ' ' + JR Z,.loop_space + ; + DEC HL + LD A,B + LD B,0 + LDIR + LD B,A + EX DE,HL +.loop2: LD (HL),' ' + INC HL + DJNZ .loop2 RET ; .skip_1: EXX @@ -184,9 +207,7 @@ GET_BIG_DIG: LD B,"0"-1 RET ; L40BIT: DB " " ; маркер для ix-1 -.Str: DB " " ; 00 -L32BIT_: DB " " ; 000000000 -.end: DB "0" +.Str: DB " 0" ; 12 знаков ; ; SIZE_BUFFER: db " " ; маркер для ix-1 ; .high db " " ; "00" diff --git a/Version.inc b/Version.inc index e08bc2d..2426082 100644 --- a/Version.inc +++ b/Version.inc @@ -40,7 +40,7 @@ ; номер версии (0..9) VERS EQU 0 ; номер модификации (0..99) -MODF EQU 50 +MODF EQU 60 ; номер билда (0..999) BUILD EQU lua_BUILD ; diff --git a/data.z80 b/data.z80 index 152f5d0..22b4eb6 100644 --- a/data.z80 +++ b/data.z80 @@ -33,30 +33,47 @@ FAT_ReservedSectors: ;----------------------------------------------------------------------- MACRO FAT_TYPES_LINE vol_size, clu_size, fat_type - WORD vol_size, clu_size + DWORD vol_size + WORD clu_size BYTE fat_type ENDM MODULE TABLES ; VOL SIZE CLUSTER SIZE FAT TYPE -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 #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 - FAT_TYPES_LINE #0004, 1024, CONSTANTS.FAT16 ; 64..128 Mb - FAT_TYPES_LINE #0002, 512, CONSTANTS.FAT16 ; 32..64 Mb - ; если меньше, то FAT12 -.LineSize EQU 5 +FAT_TYPES: FAT_TYPES_LINE #04000000, 32768, CONSTANTS.FAT32 ; > 16383 + FAT_TYPES_LINE #02000000, 16384, CONSTANTS.FAT32 ; 8191..16383 Mb + FAT_TYPES_LINE #01000000, 8192, CONSTANTS.FAT32 ; 4095..8191 Mb + FAT_TYPES_LINE #007FFE80, 4096, CONSTANTS.FAT32 ; 2048..4095 Mb + FAT_TYPES_LINE #00400140, 32768, CONSTANTS.FAT16 ; 1023..2047 Mb + FAT_TYPES_LINE #002002A0, 16384, CONSTANTS.FAT16 ; 511..1023 Mb + FAT_TYPES_LINE #00100350, 8192, CONSTANTS.FAT16 ; 255..511 Mb + FAT_TYPES_LINE #000803A8, 4096, CONSTANTS.FAT16 ; 127..255 Mb + FAT_TYPES_LINE #0001FED0, 2048, CONSTANTS.FAT16 ; 32..127 Mb + FAT_TYPES_LINE #0000FF80, 8192, CONSTANTS.FAT12 ; 16..32 Mb + FAT_TYPES_LINE #00007FD8, 4096, CONSTANTS.FAT12 ; 8..16 Mb + FAT_TYPES_LINE #00004004, 2048, CONSTANTS.FAT12 ; 4..8 Mb + FAT_TYPES_LINE #0000201A, 1024, CONSTANTS.FAT12 ; 2..4 Mb + FAT_TYPES_LINE #000012C0, 512, CONSTANTS.FAT12 ; 1,2..2 Mb + FAT_TYPES_LINE #000005A0, 1024, CONSTANTS.FAT12 ; 0,36..1.1 Mb + FAT_TYPES_LINE #00000008, 512, CONSTANTS.FAT12 ; 0..0,35 Mb + ; если меньше, то error +.LineSize EQU 7 .Records EQU ($ - FAT_TYPES)/.LineSize ENDMODULE +; +; для двух таблиц FAT Для одной +; #007FFE80 #007FFC80 ; 2048..8191 Mb +; #00400140 #003FFF40 ; 1023..2047 Mb +; #002002A0 #002000A0 ; 511..1023 Mb +; #00100350 #00100150 ; 255..511 Mb +; #000803A8 #000801A8 ; 127..255 Mb +; #0001FED0 #0001FEB8 ; 32..127 Mb +; #0000FF80 #0000FF68 ; 16..32 Mb +; #00007FD8 #00007FC0 ; 8..16 Mb +; #00004004 #00003FEC ; 4..8 Mb +; #0000201A #00002002 ; 2..4 Mb ;----------------------------------------------------------------------- - ;----------------------------------------------------------------------- MODULE KEYS_PARAMETERS diff --git a/ddf_build.txt b/ddf_build.txt index 8c0474e..90be1cd 100644 --- a/ddf_build.txt +++ b/ddf_build.txt @@ -1 +1 @@ -69 \ No newline at end of file +95 \ No newline at end of file diff --git a/fat_table.xlsx b/fat_table.xlsx new file mode 100644 index 0000000..12c6831 Binary files /dev/null and b/fat_table.xlsx differ diff --git a/format.asm b/format.asm index 7c27df9..083c460 100644 --- a/format.asm +++ b/format.asm @@ -153,11 +153,13 @@ DSS_DRIVE_FORMAT: ; MAKE_AUTO: CALL CALCULATE_FAT CALL SHOW_FORMAT_PARAMETERS - JP C,STOP_ERROR ; abort + ;JP C,STOP_ERROR ; abort CALL FORMAT_DRIVE CALL MAKE_LABEL_IN_DIR ; первая запись в root dir - метка, потом нули JP C,STOP_ERROR LD B,DSS_Error.sys.NO_ERROR + LD HL,DONE_MSG + LD (EXIT.msg),HL JP EXIT ;----------------------------------------------------------------------- @@ -178,7 +180,7 @@ CALCULATE_FAT: CALL .STEP1 ; RST ToDSS.DRV JR NC,.set_hidden ; - CP BIOS.Error.InvalidSubFunction + CP DSS_Error.drv.INVALID_COMMAND JP NZ,STOP_ERROR ; если нет такой подфункции в драйвере, то смещение = 0 LD HL,0 @@ -320,6 +322,8 @@ CALCULATE_FAT: CALL .STEP1 ; STOP_ERROR: .Save_SP+1: LD SP,0 LD B,DSS_Error.sys.INVALID_FUNCTION + LD HL,Error_Msg + LD (EXIT.msg),HL ;!TODO EXIT: LD C,Dss.Exit @@ -328,13 +332,13 @@ EXIT: LD C,Dss.Exit LD C,Dss.ChDir RST ToDSS ; - POP BC - LD A,B - AND A - JP Z,ToDSS + ; POP BC + ; LD A,B + ; AND A + ; JP Z,ToDSS ; - PUSH BC - LD HL,Error_Msg + ; PUSH BC +.msg+1: LD HL,Error_Msg LD C,Dss.PChars RST ToDSS ; @@ -679,36 +683,47 @@ GET_DRIVE_TYPE: LD A,(FAT_PARAMETERS.BPB_PHISICAL_DRIVE_NUMBER) ; <- DE - CLUSTER SIZE. ; C - FAT TYPE. AUTO_CHOOSE_FAT_PARAMS: - LD DE,(VARIABLES.VOLUME_SIZE_BYTES + 3) + LD DE,(VARIABLES.VOLUME_SIZE_BYTES + 1) + EXX + LD DE,(VARIABLES.VOLUME_SIZE_BYTES + 3) ; 00:0000:0000 LD IX,TABLES.FAT_TYPES LD A,TABLES.FAT_TYPES.Records LD BC,TABLES.FAT_TYPES.LineSize -.loop: LD L,(IX) - LD H,(IX+1) +.loop: LD L,(IX+2) + LD H,(IX+3) AND A SBC HL,DE JR C,.found + JR NZ,.next + ; + EXX + LD L,(IX) + LD H,(IX+1) + SBC HL,DE + EXX + JR C,.found JR Z,.found ; - ADD IX,BC +.next: ADD IX,BC DEC A JR NZ,.loop ; у нас FAT12 c кластером в 512 ; надо проверить раздел на минимальный размер для FAT ; sec_bpb + sec_fat + sec_root_dir + sec_for_data - LD A,D - OR E - JR NZ,.found - ; - LD HL,(VARIABLES.VOLUME_SIZE_BYTES + 1) - LD DE,8 - SBC HL,DE + ; LD A,D + ; OR E + ; JR NZ,.found + ; ; + ; LD HL,(VARIABLES.VOLUME_SIZE_BYTES + 1) + ; LD DE,8 + ; SBC HL,DE RET C ; раздел слишком мал для FAT12 (<2048) .found: ; достаём параметры из таблицы DI LD (.restore_SP),SP LD SP,IX POP HL ; холостое + POP HL ; холостое POP DE ; CLUSTER SIZE POP BC ; C - FAT TYPE LD A,C @@ -1054,7 +1069,7 @@ PARSE_CMD: LD A,(HL) INC HL AND %1101'1111 SUB 'A' - JP C,STOP_ERROR + JP C,SHOW_HELP_NO_DISK ; LD (VARIABLES.CurrentDrive),A LD D,A @@ -1065,7 +1080,7 @@ PARSE_CMD: LD A,(HL) AND ~' ' ADD A,E SUB ':' - JP NZ,STOP_ERROR + JP NZ,SHOW_HELP_NO_DISK ; только для того, чтоб обновить параметры драйва (вдруг дискету сменили?) PUSH HL LD A,D @@ -1180,7 +1195,7 @@ SHOW_FORMAT_PARAMETERS: LD HL,(FAT_PARAMETERS.ID_FAT+3) LD (PARAMS_MSG.FATtxt + 3),HL ;.Serial - LD HL,FAT_PARAMETERS.SERIAL_NUMBER_2 + LD HL,FAT_PARAMETERS.SERIAL_NUMBER_2 + 1 LD DE,PARAMS_MSG.Serial CALL .make_Serial INC DE @@ -1207,8 +1222,11 @@ SHOW_FORMAT_PARAMETERS: LD A,D AND %0111'1111 CP #15 - RET Z - SCF + JR NZ,SHOW_CANCELED + ; + LD HL,FORMATING_MSG + LD C,Dss.PChars + RST ToDSS RET ; ; @@ -1231,13 +1249,47 @@ SHOW_FORMAT_PARAMETERS: ;----------------------------------------------------------------------- -SHOW_VERSION: LD SP,(STOP_ERROR.Save_SP) +SHOW_VERSION: LD HL,Version_Msg +;----------------------------------------------------------------------- +PRINT_AND_EXIT: LD SP,(STOP_ERROR.Save_SP) + LD C,Dss.PChars + RST ToDSS + LD BC,Dss.Exit + RST ToDSS +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- +SHOW_DONE: LD HL,DONE_MSG + LD (EXIT.msg),HL + JP EXIT +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- +SHOW_CANCELED: LD HL,CANCELED_MSG + LD (EXIT.msg),HL + JP EXIT +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- +SHOW_HELP: LD HL,Version_Msg + LD C,Dss.PChars + RST ToDSS + LD HL,HELP_MSG + LD (EXIT.msg),HL + JP EXIT +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- +SHOW_HELP_NO_DISK: LD HL,Version_Msg LD C,Dss.PChars RST ToDSS - ; - LD BC,Dss.Exit ; + 256*DSS_Error.sys.INVALID_DRIVE - RST ToDSS + LD HL,HELP_MSG + JR PRINT_AND_EXIT ;----------------------------------------------------------------------- @@ -1348,14 +1400,6 @@ STRING_TO_WORD: CALL STR_TO_WORD ;----------------------------------------------------------------------- -;----------------------------------------------------------------------- -;!FIXIT -SHOW_HELP: LD SP,(STOP_ERROR.Save_SP) - DI - HALT -;----------------------------------------------------------------------- - - ;----------------------------------------------------------------------- ;!FIXIT GET_KEY_FAT: DI