From fa0375aad397486c3d61b7729a8d5f66cbd45859 Mon Sep 17 00:00:00 2001 From: Tolik Trek Date: Mon, 13 Apr 2026 01:36:32 +1000 Subject: [PATCH] ... --- Version.ini => Version.inc | 0 data.z80 | 2 +- ddf_build.txt | 2 +- format.asm | 446 ++++++++++++++++++++++++++++++++----- 4 files changed, 389 insertions(+), 61 deletions(-) rename Version.ini => Version.inc (100%) diff --git a/Version.ini b/Version.inc similarity index 100% rename from Version.ini rename to Version.inc diff --git a/data.z80 b/data.z80 index 343f542..db75c2e 100644 --- a/data.z80 +++ b/data.z80 @@ -50,7 +50,7 @@ FAT_TYPES: FAT_TYPES_LINE #0800, 32768, CONSTANTS.FAT32 ; > 32768 ;----------------------------------------------------------------------- VARIABLES EQU $ .FAT_TYPE BYTE CONSTANTS.FAT12 ; [x] -.CurrentDrive DB 0 ; [x] +.CurrentDrive DB #FF ; [x] .VOLUME_SIZE_BYTES BLOCK 5,0 ; [ ] ;.FatFDD_ReservedSectors WORD 1 ;.FatHDD_ReservedSectors WORD 8 diff --git a/ddf_build.txt b/ddf_build.txt index f11c82a..b74e882 100644 --- a/ddf_build.txt +++ b/ddf_build.txt @@ -1 +1 @@ -9 \ No newline at end of file +31 \ No newline at end of file diff --git a/format.asm b/format.asm index 4222cb5..5a8110d 100644 --- a/format.asm +++ b/format.asm @@ -83,7 +83,7 @@ reserved_sectors = ( ((.HIDDEN + min_last_sector) & #0F)>0 ) * #10) - .HIDDEN INCLUDE 'shared_includes/constants/bios_equ.inc' INCLUDE 'shared_includes/constants/dss_equ.inc' INCLUDE 'shared_includes/structures/FileSystem.inc' - INCLUDE 'version.ini' + INCLUDE 'version.inc' ; Standart EQU section ;---------------------------------------------------------------------[] @@ -909,65 +909,56 @@ MAKE_LABEL_IN_DIR: ;----------------------------------------------------------------------- +/* + PARSE_CMD: LD A,(HL) + INC HL INC HL AND A JP Z,SHOW_VERSION ; CALL .MAIN - JP C,STOP_ERROR - RET + RET NC + JP STOP_ERROR ; .MAIN: PUSH HL LD BC,Dss.EX_Path.GET_ALL RST ToDSS - RET C + JP C,STOP_ERROR ; нам нужна строка в которой есть драйв, но нет пути AND %0000'1100 XOR %0000'1000 - RET NZ - ; достаём имя драйва (оно без ключа "/") - POP HL - PUSH HL - LD DE,SECTOR_BUFFER - LD BC,Dss.EX_Path.GET_DRIVE - RST ToDSS - RET C - ; - LD (VARIABLES.CurrentDrive),A - ; только для того, чтоб обновить параметры драйва (вдруг дискету сменили?) - LD C,Dss.ChDisk - RST ToDSS - JR NC,.no_err_drv - ; - CP DSS_Error.sys.MEDIA_CHANGED JP NZ,STOP_ERROR + ; перебираем ключи "/" -.no_err_drv: POP HL -.loop: LD A,(HL) - INC HL - AND A - RET Z +.loop: POP HL + LD DE,SECTOR_BUFFER + LD C,Dss.GSwitch + RST ToDSS + PUSH HL ; + LD A,(SECTOR_BUFFER) CP '/' ; JR Z,.SET_KEY ; - CP ' ' - JR Z,.loop + AND A + EX DE,HL + LD HL,(SECTOR_BUFFER + 1) + LD BC,-':' + ADC HL,BC + EX DE,HL + JR Z,.get_drv JP STOP_ERROR ; ; -.SET_KEY: LD A,(HL) +.SET_KEY: LD HL,SECTOR_BUFFER+1 + LD A,(HL) EX AF,AF' INC HL LD A,(HL) INC HL AND A - JR Z,.cont_set - ; - CP ' ' - JR Z,.cont_set - JP STOP_ERROR ; неправильный ключ + JP NZ,STOP_ERROR ; неправильный ключ ; .cont_set: EX AF,AF' LD IX,KEYS_PARAMETERS.TABLE @@ -994,6 +985,146 @@ PARSE_CMD: LD A,(HL) .next: ADD IX,DE DJNZ .loop_key JP STOP_ERROR ; неправильный ключ + ; +.get_drv: ; достаём имя драйва (оно без ключа "/") + LD A,(VARIABLES.CurrentDrive) + INC A + JP NZ,STOP_ERROR ; неправильный ключ + ; + ;PUSH HL + LD HL,SECTOR_BUFFER + LD DE,SECTOR_BUFFER + 3 + LD BC,Dss.EX_Path.GET_DRIVE + RST ToDSS + JP C,STOP_ERROR ; неправильный драйв + ; + LD (VARIABLES.CurrentDrive),A + ; только для того, чтоб обновить параметры драйва (вдруг дискету сменили?) + LD C,Dss.ChDisk + RST ToDSS + JR NC,.loop + ; + CP DSS_Error.drv.UNKNOWN_FORMAT + JR Z,.loop + JP STOP_ERROR ; неправильный драйв +; .no_err_drv: POP HL +; RET +*/ +PARSE_CMD: LD A,(HL) + AND A + JP Z,SHOW_VERSION ; длина CMD строки нулевая + ; + INC HL + INC HL + CALL .MAIN + RET NC + JP STOP_ERROR + ; +.MAIN: PUSH HL + LD BC,Dss.EX_Path.GET_ALL + RST ToDSS + JP C,STOP_ERROR + ; нам нужна строка в которой есть драйв, но нет пути + AND %0000'1100 + XOR %0000'1000 + JP NZ,STOP_ERROR + ; + POP HL + LD A,(HL) + AND #1101'1111 + SUB 'A' + JP C,STOP_ERROR + CALL .get_drv + ; + + ; перебираем ключи "/" +.loop: CALL .skip_space + RET Z + ; + CP '/' ; + JP NZ,STOP_ERROR + ; + ; AND A + ; EX DE,HL + ; LD HL,(SECTOR_BUFFER + 1) + ; LD BC,-':' + ; ADC HL,BC + ; EX DE,HL + ; JR Z,.get_drv + ; JP STOP_ERROR + ; + ; +.SET_KEY: INC HL + LD A,(HL) + EX AF,AF' + INC HL + LD A,(HL) + AND A + JR Z,.cont_set + CP ' ' + JP NZ,STOP_ERROR + ; +.cont_set: EX AF,AF' + LD IX,KEYS_PARAMETERS.TABLE + LD B,KEYS_PARAMETERS.TABLE.Elements + LD DE,KEYS_PARAMETERS.KEYS_STR + ; +.loop_key: CP (IX + KEYS_PARAMETERS.KEYS_STR.Key) + JR NZ,.next + ; + ;EX DE,HL + LD E,(IX + KEYS_PARAMETERS.KEYS_STR.Procedure) + LD D,(IX + KEYS_PARAMETERS.KEYS_STR.Procedure + 1) + LD A,E + OR D + CALL NZ,JP_HL + ;EX DE,HL + LD A,KEYS_PARAMETERS.Status.On + JR NC,.set_stat + ; + LD A,KEYS_PARAMETERS.Status.Ignored +.set_stat: LD (IX + KEYS_PARAMETERS.KEYS_STR.Status),A + JR .loop + ; +.next: ADD IX,DE + DJNZ .loop_key + JP STOP_ERROR ; неправильный ключ + ; +.get_drv: ; достаём имя драйва (оно без ключа "/") + ;LD A,(VARIABLES.CurrentDrive) + ;INC A + ;JP NZ,STOP_ERROR ; неправильный ключ + ; + ;PUSH HL + ;LD HL,SECTOR_BUFFER + ;LD DE,SECTOR_BUFFER + 3 + ;LD BC,Dss.EX_Path.GET_DRIVE + ;RST ToDSS + ;JP C,STOP_ERROR ; неправильный драйв + ; + PUSH HL + LD (VARIABLES.CurrentDrive),A + ;!TODO запоминать текущий путь и восстанавливать после выхода + ; + ; только для того, чтоб обновить параметры драйва (вдруг дискету сменили?) + LD C,Dss.ChDisk + RST ToDSS + POP HL + INC HL + INC HL + RET NC + ; + CP DSS_Error.drv.UNKNOWN_FORMAT + RET Z + JP STOP_ERROR ; неправильный драйв + ; +.skip_space: LD A,(HL) + AND A + RET Z + INC HL + CP ' ' + RET NZ + JR .skip_space ;----------------------------------------------------------------------- @@ -1009,7 +1140,7 @@ SHOW_VERSION: LD SP,(STOP_ERROR.Save_SP) LD C,Dss.PChars RST ToDSS ; - LD BC, 256*DSS_Error.sys.INVALID_DRIVE + Dss.Exit + LD BC,Dss.Exit ; + 256*DSS_Error.sys.INVALID_DRIVE RST ToDSS ;----------------------------------------------------------------------- @@ -1031,8 +1162,207 @@ GET_KEY_FAT: DI ;----------------------------------------------------------------------- ;!FIXIT -SET_LABEL: DI - HALT +/* +SET_LABEL: POP HL + EX (SP),HL + ; LD DE,SECTOR_BUFFER + ; LD C,Dss.GSwitch + ; RST ToDSS + ; EX (SP),HL + ; PUSH HL + ; + ;LD HL,SECTOR_BUFFER + ; LD A,(HL) + ; INC HL + ; OR A + ; SCF + ; RET C ; ключ без метки + ; + LD A,(HL) + INC HL + CP '"' + SCF + RET NZ ; метка начинается не с кавычки + ; + LD DE,SECTOR_BUFFER ; создаём метку тут, если символы в порядке + LD C,FAT_PARAMETERS.LABEL.Size + LD B,C + LD A,(HL) + CP ' '+1 + RET C ; no_name + ; + CALL .loop1 + CALL C,.skip_label + EX (SP),HL + JP (HL) + + ; +.loop1: LD A,(HL) + AND A + SCF + RET Z + ; + ; + CP #80 + JR NC,.sym_ok + ; + CP #22 + JR Z,.end_label + CP #7C + SCF + RET Z ; no_name + CP #2A + JR C,.check_3A + CP #30 + JR NC,.check_3A + CP #2D + JR Z,.sym_ok + SCF + RET ; no_name + ; +.check_3A: CP #3A + JR C,.check_5B + CP #40 + JR NC,.check_5B + RET ; no_name + +.check_5B: CP #5B + JR C,.sym_ok + CP #5E + RET C ; no_name +.sym_ok: LD (DE),A + INC HL + INC DE + DJNZ .loop1 + LD A,(HL) + CP '"' + SCF + RET NZ + ; +.end_label: LD A,B + CP C + SCF + RET Z ; стандартная метка + ; + INC B ; чтоб не тратить байты на проверку на ноль + EX DE,HL +.loop2: LD (HL)," " + INC HL + DJNZ .loop2 + INC DE + PUSH DE + ; B=0, C=FAT_PARAMETERS.LABEL.Size + LD HL,SECTOR_BUFFER + LD DE,FAT_PARAMETERS.LABEL + LDIR + POP HL + AND A + RET + ; +.skip_label: LD A,(HL) + AND A + SCF + RET Z + ; + CP '/' + SCF + RET Z + INC HL + JR .skip_label +*/ +SET_LABEL: LD HL,SECTOR_BUFFER + EX DE,HL + ; + LD A,(HL) + INC HL + CP ' ' + JR NZ,.skip_label ; нет пробела между ключом и меткой + ; + LD A,(HL) + INC HL + CP '"' + JR NZ,.skip_label ; метка начинается не с кавычки + ; + LD DE,SECTOR_BUFFER ; создаём метку тут, если символы в порядке + LD C,FAT_PARAMETERS.LABEL.Size + LD B,C + LD A,(HL) + CP ' ' + JR Z,.skip_label ; no_name + ; + CALL .loop1 + RET NC + JR .skip_label + ; +.loop1: LD A,(HL) + AND A + JR Z,.skip_label ; no_name + ; + CP #80 + JR NC,.sym_ok + ; + CP #22 + JR Z,.end_label + CP #7C + JR Z,.skip_label ; no_name + ; + CP #2A + JR C,.check_3A + CP #30 + JR NC,.check_3A + CP #2D + JR Z,.sym_ok + JR .skip_label ; no_name + ; +.check_3A: CP #3A + JR C,.check_5B + CP #40 + JR C,.skip_label ; no_name + ; +.check_5B: CP #5B + JR C,.sym_ok + CP #5E + JR C,.skip_label ; no_name + ; +.sym_ok: LD (DE),A + INC HL + INC DE + DJNZ .loop1 + LD A,(HL) + CP '"' + SCF + RET NZ + ; +.end_label: LD A,B + CP C + SCF + RET Z ; стандартная метка + ; + INC B ; чтоб не тратить байты на проверку на ноль + EX DE,HL +.loop2: LD (HL)," " + INC HL + DJNZ .loop2 + INC DE + PUSH DE + ; B=0, C=FAT_PARAMETERS.LABEL.Size + LD HL,SECTOR_BUFFER + LD DE,FAT_PARAMETERS.LABEL + LDIR + POP HL + AND A + RET + ; +.skip_label: LD A,(HL) + AND A + SCF + RET Z + ; + INC HL + CP '"' + SCF + RET Z + JR .skip_label ;----------------------------------------------------------------------- @@ -1059,7 +1389,6 @@ STRING_TO_WORD: CALL STR_TO_WORD ; DE - addr next after string decimal ;!FIXIT проверка на пустую строку STR_TO_WORD: LD HL,0 - .loop: LD B,H LD C,L ; @@ -1103,28 +1432,27 @@ STR_TO_WORD: LD HL,0 ;На выход: ; буфер с текст.числом 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 +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 ;-----------------------------------------------------------------------