diff --git a/data.z80 b/data.z80 index db75c2e..13da241 100644 --- a/data.z80 +++ b/data.z80 @@ -14,8 +14,7 @@ FilesInRootDIR: .HDD EQU 512 ; FAT_ReservedSectors: -.FDD EQU 1 -.HDD EQU 8 +.FAT EQU 1 .FAT32 EQU 32 ENDMODULE ;----------------------------------------------------------------------- @@ -156,7 +155,7 @@ FAT_PARAMETERS: ; .FAT.SERIAL_NUMBER DWORD 0 ; ; .FAT.LABEL DB 'NO_LABEL ' ; ; .ID_FAT DB 'FAT16 ' ; -.PART2_FAT12_16_END EQU $ +.PART2_FAT12_16_SIZE EQU $ ; FAT32 .PART2_FAT32 EQU $ diff --git a/ddf_build.txt b/ddf_build.txt index 72f523f..801f180 100644 --- a/ddf_build.txt +++ b/ddf_build.txt @@ -1 +1 @@ -39 \ No newline at end of file +47 \ No newline at end of file diff --git a/format.asm b/format.asm index 098746c..e27639b 100644 --- a/format.asm +++ b/format.asm @@ -145,9 +145,7 @@ DSS_DRIVE_FORMAT: ; MAKE_AUTO: CALL CALCULATE_FAT CALL FORMAT_DRIVE - CALL MAKE_LABEL_IN_DIR - ;!FIXIT - ;CALL MAKE_ROOT_DIR_LABEL ; первая запись в root dir - метка, потом нули + CALL MAKE_LABEL_IN_DIR ; первая запись в root dir - метка, потом нули RET ;----------------------------------------------------------------------- @@ -476,12 +474,12 @@ SET_RESERVED_AND_ROOTDIR: ; Ставим дефолтные значения LD A,(FAT_PARAMETERS.DRIVE_TYPE) CP BOOT_SECTOR.Hard_Drive - LD HL,CONSTANTS.FAT_ReservedSectors.HDD + LD HL,CONSTANTS.FAT_ReservedSectors.FAT LD DE,CONSTANTS.FilesInRootDIR.HDD JR Z,.set_vars ; #F0 CP BOOT_SECTOR.Floppy_3x5_1x44 - LD HL,CONSTANTS.FAT_ReservedSectors.FDD + ;LD HL,CONSTANTS.FAT_ReservedSectors.FDD LD DE,CONSTANTS.FilesInRootDIR.FDD_HD JR Z,.set_vars ; #F9 @@ -493,6 +491,14 @@ SET_RESERVED_AND_ROOTDIR: .set_vars: CALL .ChooseReserved EX DE,HL CALL .ChooseFilesInRootDIR + ; + LD A,(VARIABLES.FAT_TYPE) + CP CONSTANTS.FAT16 + LD HL,'61' ; str FAT16 + JR Z,.set_type + ; + LD H,'2' ; str FAT12 +.set_type: LD (FAT_PARAMETERS.ID_FAT + 3),HL RET ; .for_fat32: LD A,(KEYS_PARAMETERS.FilesInRootDIR + KEYS_PARAMETERS.KEYS_STR.Status) @@ -620,19 +626,7 @@ MAKE_SERIAL: LD C,Dss.SysTime ;----------------------------------------------------------------------- -FORMAT_DRIVE: CALL CLEAN_SECTOR_BUFFER - ; - LD HL,FAT_PARAMETERS.PART1 - LD DE,SECTOR_BUFFER - LD BC,FAT_PARAMETERS.PART1_SIZE - LDIR - ; - LD A,(VARIABLES.FAT_TYPE) - CP CONSTANTS.FAT32 - ;!FIXIT - JP NZ,STOP_ERROR - ; - CALL MAKE_SYS_SECTORS +FORMAT_DRIVE: CALL MAKE_SYS_SECTORS CALL CLEAN_SECTOR_BUFFER ; clean all fat tables at drive LD A,(VARIABLES.FAT_TYPE) @@ -770,9 +764,27 @@ FORMAT_DRIVE: CALL CLEAN_SECTOR_BUFFER ;----------------------------------------------------------------------- MAKE_SYS_SECTORS: - LD HL,FAT_PARAMETERS.PART2_FAT32 - LD BC,FAT_PARAMETERS.PART2_FAT32_SIZE + FAT_PARAMETERS.PART3_SHARED_SIZE + CALL CLEAN_SECTOR_BUFFER + LD HL,FAT_PARAMETERS.PART1 + LD DE,SECTOR_BUFFER + LD BC,FAT_PARAMETERS.PART1_SIZE LDIR + ; + LD A,(VARIABLES.FAT_TYPE) + CP CONSTANTS.FAT32 + JR Z,.set_32 + ; + LD HL,(FAT_PARAMETERS.PART2_FAT12_16) + LD (SECTOR_BUFFER + FAT_PARAMETERS.PART1_SIZE),HL + INC DE + INC DE + LD HL,FAT_PARAMETERS.PART3_SHARED + LD BC,FAT_PARAMETERS.PART3_SHARED_SIZE + JR .ldir + ; +.set_32: LD HL,FAT_PARAMETERS.PART2_FAT32 + LD BC,FAT_PARAMETERS.PART2_FAT32_SIZE + FAT_PARAMETERS.PART3_SHARED_SIZE +.ldir: LDIR ; LD HL,#AA55 LD (SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE),HL @@ -780,14 +792,14 @@ MAKE_SYS_SECTORS: LD HL,0 LD IX,0 CALL WRITE_SECTOR_BUFFER - LD HL,0 - LD IX,(FAT_PARAMETERS.CopyBootSector) - CALL WRITE_SECTOR_BUFFER ; LD A,(VARIABLES.FAT_TYPE) CP CONSTANTS.FAT32 RET NZ ; + LD HL,0 + LD IX,(FAT_PARAMETERS.CopyBootSector) + CALL WRITE_SECTOR_BUFFER CALL CLEAN_SECTOR_BUFFER LD HL,#AA55 LD (SECTOR_BUFFER + _sFSinfo.SECTOR_SIGNATURE),HL @@ -876,9 +888,9 @@ WRITE_SECTOR_BUFFER: ;----------------------------------------------------------------------- -; IN: HL:IX - rootdir's first sector +; IN: (VARIABLES.RootDirFirstSector_H), (VARIABLES.RootDirFirstSector_L) MAKE_LABEL_IN_DIR: - CALL CLEAN_SECTOR_BUFFER ;!FIXIT скорее всего, не нужно чистить + CALL CLEAN_SECTOR_BUFFER ; make directory record LD HL,FAT_PARAMETERS.LABEL LD DE,SECTOR_BUFFER @@ -909,107 +921,6 @@ MAKE_LABEL_IN_DIR: ;----------------------------------------------------------------------- -/* - -PARSE_CMD: LD A,(HL) - INC HL - INC HL - AND A - JP Z,SHOW_VERSION - ; - 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 - - ; перебираем ключи "/" -.loop: POP HL - LD DE,SECTOR_BUFFER - LD C,Dss.GSwitch - RST ToDSS - PUSH HL - ; - LD A,(SECTOR_BUFFER) - CP '/' ; - JR Z,.SET_KEY - ; - 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 HL,SECTOR_BUFFER+1 - LD A,(HL) - EX AF,AF' - INC HL - LD A,(HL) - INC HL - AND A - 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 L,(IX + KEYS_PARAMETERS.KEYS_STR.Procedure) - LD H,(IX + KEYS_PARAMETERS.KEYS_STR.Procedure + 1) - LD A,L - OR H - 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 ; неправильный драйв - ; - 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 строки нулевая @@ -1044,7 +955,7 @@ PARSE_CMD: LD A,(HL) POP HL JR NC,.loop ; - CP DSS_Error.drv.UNKNOWN_FORMAT + CP DSS_Error.sys.UNKNOWN_FORMAT JP NZ,STOP_ERROR ; перебираем ключи "/" .loop: CALL .skip_space @@ -1106,7 +1017,6 @@ JP_HL: EX DE,HL ;----------------------------------------------------------------------- -;!FIXIT SHOW_VERSION: LD SP,(STOP_ERROR.Save_SP) LD HL,Version_Msg LD C,Dss.PChars @@ -1133,115 +1043,6 @@ GET_KEY_FAT: DI ;----------------------------------------------------------------------- -;!FIXIT -/* -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 ;