From 8955783ba664add35e2518c40f4585a0dd9266b4 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 25 Apr 2026 05:09:47 +1000 Subject: [PATCH] first beta --- Messages.z80 | 50 ++++++++++++++++----- Strings.asm | 39 +++++++++++++---- Version.inc | 2 +- data.z80 | 47 +++++++++++++------- ddf_build.txt | 2 +- fat_table.xlsx | Bin 0 -> 15650 bytes format.asm | 116 ++++++++++++++++++++++++++++++++++--------------- 7 files changed, 183 insertions(+), 73 deletions(-) create mode 100644 fat_table.xlsx 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 0000000000000000000000000000000000000000..12c68311293cba3f11bb210e15392098d3678b19 GIT binary patch literal 15650 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 z hlYbX4Vf~x