diff --git a/Messages.z80 b/Messages.z80 index 5c2b74a..3b1cbae 100644 --- a/Messages.z80 +++ b/Messages.z80 @@ -47,7 +47,8 @@ Error_Msg: DZ "\r\n\r\nError!!!\r\n\r\n" ;----------------------------------------------------------------------- - ;!FIXIT Color settings + ;!FIXIT Color settings +/* col_magenta EQU 5 col_white EQU 7 col_cmd EQU 16 @@ -79,4 +80,30 @@ PARAMS_MSG: BYTE "\r\nDrive " .LabelTxt: DZ 'NO LABEL ' .fullSize: BYTE ' ',0 .dataSize: BYTE ' ',0 +*/ ;----------------------------------------------------------------------- + + + ;----------------------------------------------------------------------- +PARAMS_MSG: BYTE "\r\nDrive " +.disk: BYTE "A: " + BYTE "will be formatted using the current settings:\r\n\r\n" + BYTE "Partition size:\t" +.fullSize: BYTE " bytes\r\n" + BYTE "Available size:\t" +.dataSize: BYTE " bytes\r\n" + BYTE "Unused space:\t" +.unused: BYTE " bytes\r\n" + BYTE "Clusters:\t" +.Clusters: BYTE " \r\n" + BYTE "Cluster size:\t" +.Clu_size: BYTE " bytes\r\n" + BYTE "File system:\t" +.FATtxt: BYTE "FAT \r\n" + BYTE "Serial:\t\t" +.Serial: BYTE "0000-0000\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 diff --git a/Strings.asm b/Strings.asm new file mode 100644 index 0000000..97951dd --- /dev/null +++ b/Strings.asm @@ -0,0 +1,300 @@ +;----------------------------------------------------------------------- +; Enin Anton, Anatoliy Belyanskiy +; A:HL':HL - число для перевода +; A:HL:DE - число для перевода +; BC - буфер для текстовой строки +PRINT_5BYTES: PUSH BC + ; + PUSH HL + EXX + POP HL + EXX + EX DE,HL + ; + 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 ; "000 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 - $ +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- +; Enin Anton +;Процедура преобразования 8битовых чисел в шестнадц. текст +;На вход: +; HL - адрес буфера +; А - байт +;На выход: +; буфер с текст.числом + IFUSED PutHexNumb +PutHexNumb: PUSH AF + RRCA + RRCA + RRCA + RRCA + AND #0F + ADD A,#90 + DAA + ADC A,#40 + DAA + LD (HL),A + INC L + POP AF + AND #0F + ADD A,#90 + DAA + ADC A,#40 + DAA + LD (HL),A + INC L + RET + ENDIF +;----------------------------------------------------------------------- + + +;----------------------------------------------------------------------- +; HL - Строка с лишними пробелами +; DE - Буфер новой строки +SKIP_DUBLESPACES: + LD A,(HL) + AND A + RET Z + ; + SUB ' ' + JR NZ,.loop + ; + INC HL + JR SKIP_DUBLESPACES + ; +.loop LDI + LD A,(HL) + AND A + RET Z + ; + SUB ' ' + JR NZ,.loop + LDI + JR SKIP_DUBLESPACES +;----------------------------------------------------------------------- + + +;███████████████████████████████████████████████████████████████████████ +;███████████████████████████████████████████████████████████████████████ +;███████████████████████████████████████████████████████████████████████ + + +;----------------------------------------------------------------------- +; IN: DE - (string decimal) +; OUT: HL - string to word +; DE - addr next after string decimal +;!FIXIT проверка на пустую строку +STR_TO_WORD: LD HL,0 +.loop: LD B,H + LD C,L + ; + ADD HL,HL ;x2 + RET C + ADD HL,HL ;x4 + RET C + ADD HL,BC ;x5 + RET C + ADD HL,HL ;x10 + RET C + ; + LD B,0 + LD C,A + ADD HL,BC + RET C + ; + LD A,(DE) + OR A + RET Z + CP ' ' + RET Z + ; + CP '9'+1 + CCF + RET C + SUB '0' + RET C + ; + INC DE + JR .loop +;----------------------------------------------------------------------- \ No newline at end of file diff --git a/ddf_build.txt b/ddf_build.txt index 4b6f9c3..8c0474e 100644 --- a/ddf_build.txt +++ b/ddf_build.txt @@ -1 +1 @@ -64 \ No newline at end of file +69 \ No newline at end of file diff --git a/format.asm b/format.asm index e4dd7c8..7c27df9 100644 --- a/format.asm +++ b/format.asm @@ -1147,50 +1147,60 @@ SHOW_FORMAT_PARAMETERS: LD DE,(VARIABLES.NotUsedSpace) LD HL,0 CALL MUL32_POWER2 - LD (PARAMS_MSG.unused),DE - LD (PARAMS_MSG.unused + 2),HL + XOR A + LD BC,PARAMS_MSG.unused + CALL PRINT_5BYTES ;.fullSize + LD DE,(VARIABLES.VOLUME_SIZE_BYTES) 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 + LD BC,PARAMS_MSG.fullSize CALL PRINT_5BYTES ;.dataSize - LD HL,(VARIABLES.DataSectors_H) - LD DE,(VARIABLES.DataSectors_L) - LD BC,(FAT_PARAMETERS.BytesPerSector) + LD HL,(VARIABLES.total_clusters_H) + LD DE,(VARIABLES.total_clusters_L) + LD BC,(VARIABLES.ClusterSize) CALL MUL32_POWER2 - PUSH DE - EXX - POP HL - LD DE,PARAMS_MSG.dataSize + LD BC,PARAMS_MSG.dataSize CALL PRINT_5BYTES ;.Clusters - LD HL,(VARIABLES.total_clusters_L) - LD (PARAMS_MSG.Clusters),HL + LD DE,(VARIABLES.total_clusters_L) LD HL,(VARIABLES.total_clusters_H) - LD (PARAMS_MSG.Clusters + 2),HL + XOR A + LD BC,PARAMS_MSG.Clusters + CALL PRINT_5BYTES ;.Clu_size - LD HL,(VARIABLES.ClusterSize) - LD (PARAMS_MSG.Clu_size),HL + LD DE,(VARIABLES.ClusterSize) + XOR A + LD H,A + LD L,A + LD BC,PARAMS_MSG.Clu_size + CALL PRINT_5BYTES ;.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 + 2),HL - LD HL,(FAT_PARAMETERS.SERIAL_NUMBER_2) - LD (PARAMS_MSG.Serial),HL + LD HL,FAT_PARAMETERS.SERIAL_NUMBER_2 + LD DE,PARAMS_MSG.Serial + CALL .make_Serial + INC DE + CALL .make_Serial ;.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 - + ; + LD HL,PARAMS_MSG + LD DE,SECTOR_BUFFER + PUSH DE + CALL SKIP_DUBLESPACES + EX DE,HL + LD (HL),0 + POP HL + LD C,Dss.PChars + RST ToDSS + ; .loop: LD C,Dss.EchoKey RST ToDSS ; позиционный код Y/y/н/Н - #95/#15 @@ -1200,6 +1210,23 @@ SHOW_FORMAT_PARAMETERS: RET Z SCF RET + ; + ; +.make_Serial: LD B,2 +.serialLoop: LD A,(HL) + DEC HL + PUSH HL + PUSH DE + EX DE,HL + ; HL - адрес буфера + ; А - байт + CALL PutHexNumb + POP DE + POP HL + INC DE + INC DE + DJNZ .serialLoop + RET ;----------------------------------------------------------------------- @@ -1214,21 +1241,6 @@ SHOW_VERSION: LD SP,(STOP_ERROR.Save_SP) ;----------------------------------------------------------------------- -;----------------------------------------------------------------------- -;!FIXIT -SHOW_HELP: LD SP,(STOP_ERROR.Save_SP) - DI - HALT -;----------------------------------------------------------------------- - - -;----------------------------------------------------------------------- -;!FIXIT -GET_KEY_FAT: DI - HALT -;----------------------------------------------------------------------- - - ;----------------------------------------------------------------------- SET_LABEL: LD HL,SECTOR_BUFFER ; создаём метку тут, если символы в порядке EX DE,HL @@ -1337,272 +1349,17 @@ STRING_TO_WORD: CALL STR_TO_WORD ;----------------------------------------------------------------------- -; DEBUG_START: LD HL,.data -; CALL STRING_TO_WORD -; DI -; HALT -; ; -; .data: DZ "327670" - -; IN: DE - (string decimal) -; OUT: HL - string to word -; DE - addr next after string decimal -;!FIXIT проверка на пустую строку -STR_TO_WORD: LD HL,0 -.loop: LD B,H - LD C,L - ; - ADD HL,HL ;x2 - RET C - ADD HL,HL ;x4 - RET C - ADD HL,BC ;x5 - RET C - ADD HL,HL ;x10 - RET C - ; - LD B,0 - LD C,A - ADD HL,BC - RET C - ; - LD A,(DE) - OR A - RET Z - CP ' ' - RET Z - ; - CP '9'+1 - CCF - RET C - SUB '0' - RET C - ; - INC DE - JR .loop +;!FIXIT +SHOW_HELP: LD SP,(STOP_ERROR.Save_SP) + DI + HALT ;----------------------------------------------------------------------- ;----------------------------------------------------------------------- -; Enin Anton -;Процедура преобразования 8битовых чисел в шестнадц. текст -;На вход: -; HL - адрес буфера -; А - байт -;На выход: -; буфер с текст.числом - IFUSED PutHexNumb -PutHexNumb: PUSH AF - RRCA - RRCA - RRCA - RRCA - AND #0F - ADD A,#90 - DAA - ADC A,#40 - DAA - LD (HL),A - INC L - POP AF - AND #0F - ADD A,#90 - DAA - ADC A,#40 - DAA - LD (HL),A - INC L - RET - ENDIF -;----------------------------------------------------------------------- - - -;----------------------------------------------------------------------- -; 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 - $ +;!FIXIT +GET_KEY_FAT: DI + HALT ;----------------------------------------------------------------------- @@ -1611,6 +1368,11 @@ L32BIT_: DB " " ; 000000000 //////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// + include 'Strings.asm' +//////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////// include 'data.z80' //////////////////////////////////////////////////////////////////////// @@ -1623,7 +1385,7 @@ L32BIT_: DB " " ; 000000000 //////////////////////////////////////////////////////////////////////// ;!FIXIT - include 'shared_includes/printf.asm' +; include 'shared_includes/printf.asm' //////////////////////////////////////////////////////////////////////// Exit_Path: DB 'A:\'