From a93bbd76ad76c05fa937de03164a06efaf276829 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 8 Feb 2025 01:28:18 +1000 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D1=82=D0=B8=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=81=D0=BC=D0=B5=D0=BD=D1=83?= =?UTF-8?q?=20=D0=B4=D0=B8=D1=81=D0=BA=D0=B0=20ATAPI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DSS/API/Close.asm | 5 ++ DSS/DOS_Proc.asm | 19 +++++ DSS/DRV-MAIN.ASM | 2 +- DSS/build.txt | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 126 ++++++++++++++++++++-------- SHELL/Commands/DIR.ASM | 10 ++- SHELL/Commands/MKDIR.ASM | 22 ++--- SHELL/Commands/REN.ASM | 4 - SHELL/Commands/RMDIR.ASM | 25 +++--- SHELL/EXEC.ASM | 15 +++- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 12 files changed, 165 insertions(+), 69 deletions(-) diff --git a/DSS/API/Close.asm b/DSS/API/Close.asm index 92f79ab..e39e794 100644 --- a/DSS/API/Close.asm +++ b/DSS/API/Close.asm @@ -31,6 +31,7 @@ CLOSE_FN: ; [x] 15/11/2023 -bug with bad clusters ;!TEST LD A,(IY+_sFM.DRIVE) CALL OPENDSK + JR C,.error ; XOR A CALL SET_FM @@ -83,4 +84,8 @@ CLOSE_FN: .NOTMODF: LD A,(.TMP) JP RES_FM + ; +.error: POP DE + POP DE + RET ; \ No newline at end of file diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index b50e811..264b838 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -222,8 +222,27 @@ OPENDSK: ;!TEST DRV.Open .error: CP DSS_Error.sys.INVALID_DRIVE SCF RET Z + ; + CP DSS_Error.sys.MEDIA_CHANGED + SCF + RET Z + ; + CP DSS_Error.sys.UNKNOWN_FORMAT + SCF + RET Z + ; LD A,DSS_Error.sys.NOT_READY RET + +/* +0000 0010 02 +0001 1100 1c +0000 1101 0d + +0001 0011 +*/ + + ; ;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed .error_bpb: PUSH AF ; сохраняем номер ошибки diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 0b53a17..3ea33ff 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -266,7 +266,7 @@ LOGDRV EQU DEVICE + DEVICE.End .SIZE_IN_SECTORS EQU 5 .PARTITION_RECORD_NUM EQU 9 .SECTOR_SIZE EQU 10 ; word -.MediaParameters EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved +.MediaParameters EQU 12 ; bit0=1 removable, bit1=1 drive changed, bit7..2 reserved .Reserved_1 EQU 13 .Reserved_2 EQU 14 .Reserved_3 EQU 15 diff --git a/DSS/build.txt b/DSS/build.txt index f11c82a..3cacc0b 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -9 \ No newline at end of file +12 \ No newline at end of file diff --git a/DSS/drivers/media/ata_atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm index 55aeb65..59f0fc0 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -335,7 +335,7 @@ SelectDrive: PUSH DE ; ; [ ] custom sector size CALL CHECK_IDE_SECTOR_SIZE - LD A,DSS_Error.drv.UNKNOWN_FORMAT + LD A,DSS_Error.sys.UNKNOWN_FORMAT JR C,.error_pop ; ; @@ -463,7 +463,7 @@ GetParams: EX DE,HL JR .error - ; [ ] media change + ; [ ] media change - убрать ;!FIXIT .next: EX AF,AF JR NC,.NoMediaChange CP BIOS.Error.ATAPI.UnitAttention @@ -545,9 +545,15 @@ Close: XOR A ;!TODO пока Open ничего не делает кроме проверки MediaCheck Open: CALL MediaCheck - ;!TODO - ;RET С + RET Z + RET C + ;!TODO ??? ;CALL READ_PARTITION_PARAMETERS + ; + INC A + RET NZ + LD A,DSS_Error.sys.MEDIA_CHANGED + SCF RET ; ;[ ] media changed - bios 5x DETECT @@ -588,23 +594,25 @@ MediaCheck: PUSH IY CALL SelectDrive JR NC,.next_step ; - CP DSS_Error.drv.UNKNOWN_FORMAT - SCF + CP DSS_Error.sys.UNKNOWN_FORMAT JR NZ,.exit + AND A ; сброс ZF + SCF ; [ ] media changed .next_step: PUSH AF ; Сохраняем CF и код ошибки UNKNOWN_FORMAT, если CF=1 LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) - LD C,BIOS.DRV_DETECT ;[ ] media change переделать логику тут и в биос? ; !FIXIT + LD C,BIOS.DRV_GET_PAR ;[ ] media change переделать логику тут и в биос? ; !FIXIT PUSH IY RST ToBIOS POP IY + EX AF,AF' JR NC,.next_check ; CP BIOS.Error.ATAPI.UnitAttention JR Z,.Reinit - SCF POP BC ; Баланс стека -.exit: POP IY +.exit: SCF + POP IY RET ; .next_check: BIT 1,(IY + LOGDRV.MediaParameters) @@ -619,12 +627,12 @@ MediaCheck: PUSH IY .Reinit: LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) LD (CURRENT_DRIVE.Number),A LD (LOGDRV_OFFSET),IY - ;RES 1,(IY + LOGDRV.MediaParameters) + ;RES 1,(IY + LOGDRV.MediaParameters) - сбрасывается в DEFINE_PARTITIONS CALL DEFINE_PARTITIONS POP AF POP IY RET C ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1 - LD A,#FF ;!HARDCODE drive changed + LD A,#FF ;!HARDCODE drive changed OR A RET @@ -633,9 +641,11 @@ MediaCheck: PUSH IY CHECK_IDE_SECTOR_SIZE: LD E,(IY+LOGDRV.SECTOR_SIZE) LD D,(IY+LOGDRV.SECTOR_SIZE+1) - LD HL,DSS_MAX_SECTOR_SIZE - AND A - SBC HL,DE + ; LD HL,DSS_MAX_SECTOR_SIZE + ; AND A + ; SBC HL,DE + LD HL,-DSS_MAX_SECTOR_SIZE - 1 + ADD HL,DE RET ; @@ -725,7 +735,7 @@ Exec_BIOS: PUSH IY RET ; .exec: CALL SelectDrive - RET C + RET C ;!FIXIT переделать номер ошибки с драйвера на дос RST ToBIOS RET NC CP BIOS.Error.ATAPI.UnitAttention @@ -799,11 +809,7 @@ DEFINE_PARTITIONS: CALL INC_DRV_COUNT RET NC ; - LD A,(CURRENT_DRIVE.Number) - LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A - LD DE,LOGDRV.TBL_Entry ;DSKITEM - ADD IX,DE - LD (LOGDRV_OFFSET),IX + CALL .set_drv_tbl JP .NextPartition ; .NotExtended: CP PartitionSysTypes.FAT16 @@ -824,8 +830,14 @@ DEFINE_PARTITIONS: JP Z,.SubLevel JP .NextPartition ; раздел не поддерживается ; - -.ATAPI_TST: ;JR .check_atapi ;!FIXIT CDFS +.set_drv_tbl: LD A,(CURRENT_DRIVE.Number) + LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A + LD DE,LOGDRV.TBL_Entry ;DSKITEM + ADD IX,DE + LD (LOGDRV_OFFSET),IX + RET + ; +.CDFS_TST: ;JR .check_atapi ;!FIXIT CDFS ;SCF ;RET .check_atapi: LD A,(CURRENT_DRIVE.Number) @@ -833,10 +845,22 @@ DEFINE_PARTITIONS: AND #F0 CP DRIVE_CODES.SPRINTER.ATAPI SCF - RET NZ + ;RET NZ + PUSH AF ; CALL GetSectorSize - ;BPB SECTOR ;!TODO если CD-ROM, то другой номер сектора + CALL .set_LOGDRV + POP AF + RET NZ ; результат CP DRIVE_CODES.SPRINTER.ATAPI + ; для правильного выхода из парсера разделов + LD B,1 + PUSH BC + ;загрузка с активного раздела, а не с первого + LD A,#FF ; для пропуска .tst_zipNoMBR и записи в LOGDRV.PARTITION_RECORD_NUM + LD (CURRENT_SECTOR.Low),A + JP .not_supported + ; +.set_LOGDRV: ;BPB SECTOR ;!TODO если CD-ROM, то другой номер сектора LD IX,(LOGDRV_OFFSET) LD A,(CURRENT_DRIVE.Removable) LD (IX + LOGDRV.MediaParameters),A @@ -851,15 +875,9 @@ DEFINE_PARTITIONS: LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H ; [ ] sector size - LD (IX + LOGDRV.SECTOR_SIZE),C - LD (IX + LOGDRV.SECTOR_SIZE + 1),B - ; - ; для правильного выхода из парсера разделов - LD B,1 - PUSH BC - ;загрузка с активного раздела, а не с первого - DEC A - JP .not_supported + LD (IX + LOGDRV.SECTOR_SIZE),C + LD (IX + LOGDRV.SECTOR_SIZE + 1),B + RET ; ; вход: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved .Start: LD IX,0 @@ -883,7 +901,7 @@ DEFINE_PARTITIONS: ;JR NZ,NODEFIN ; [ ] CDFS - JR NZ,.ATAPI_TST + JR NZ,.CDFS_TST ;SCF ;RET NZ ; @@ -927,7 +945,43 @@ DEFINE_PARTITIONS: ADD IY,DE POP BC DJNZ .DOSAGA - AND A + ; +.tst_zipNoMBR: ; [ ] zip no MBR + ; только для Removable media + LD A,(CURRENT_DRIVE.Removable) + AND %0000'0001 + RET Z + ; только для ATAPI + LD A,(CURRENT_DRIVE.Number) + LD B,A + AND #F0 + CP DRIVE_CODES.SPRINTER.ATAPI + JR NZ,.exit + ; + XOR A + LD HL,(CURRENT_SECTOR.Low) + OR H + OR L + LD HL,(CURRENT_SECTOR.High) + OR H + OR L + RET NZ + ; + PUSH IY + LD A,B + LD C,BIOS.DRV_GET_PAR + RST ToBIOS + POP IY + ; + LD B,XH + LD C,XL + CALL .set_LOGDRV + LD A,(CURRENT_DRIVE.Removable) + LD (IX + LOGDRV.MediaParameters),A + LD (IX + LOGDRV.PARTITION_RECORD_NUM),#FF + CALL .set_drv_tbl + ; +.exit: AND A RET ; .ParseExtended: LD HL,(EXT_Partition.Low) @@ -970,7 +1024,7 @@ DEFINE_PARTITIONS: GetSectorSize: PUSH IY LD A,(CURRENT_DRIVE.Number) ; sector size - LD C,BIOS.DRV_GET_PAR + LD C,BIOS.DRV_GET_PAR ; [ ] media change заменить на drv_detect ? RST ToBIOS JR NC,.no_err ; diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index afdf8a5..1944926 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -87,7 +87,15 @@ cmd_dir: push de ld hl,Buffers.work.buffer1 ld c,Dss.ChDir rst ToDSS - ;ld a,DSS_Error.sys.NOT_READY + jr nc,.no_error + ; + cp DSS_Error.sys.MEDIA_CHANGED + jp nz,print_err_message + call print_err_message + ; + ld hl,Buffers.work.buffer1 + ld c,Dss.ChDir + rst ToDSS jp c,print_err_message .no_error: ; ld hl,Buffers.bat_params.PRM1 diff --git a/SHELL/Commands/MKDIR.ASM b/SHELL/Commands/MKDIR.ASM index a01c513..141c4d1 100644 --- a/SHELL/Commands/MKDIR.ASM +++ b/SHELL/Commands/MKDIR.ASM @@ -4,14 +4,16 @@ ; ;/////////////////////////////////////////////////// cmd_mkdir: - ex de,hl - ;ld de,T9186 ; буфер - ld de,Buffers.work.buffer1; - ld c,Dss.GSwitch ; выделить параметр ком-строки - RST ToDSS - ;ld hl,T9186 ; имя папки - ld hl,Buffers.work.buffer1; ld c,Dss.MkDir ; создать папку - RST ToDSS - call c,print_err_message ; вывод сообщения - ret + push bc + jp cmd_rmdir.shared + + ; ex de,hl + ; ld de,Buffers.work.buffer1; + ; ld c,Dss.GSwitch ; выделить параметр ком-строки + ; RST ToDSS + ; ld hl,Buffers.work.buffer1 ; имя папки + ; ld c,Dss.MkDir ; создать папку + ; RST ToDSS + ; call c,print_err_message ; вывод сообщения + ; ret diff --git a/SHELL/Commands/REN.ASM b/SHELL/Commands/REN.ASM index 7df2136..4e6c82f 100644 --- a/SHELL/Commands/REN.ASM +++ b/SHELL/Commands/REN.ASM @@ -5,16 +5,12 @@ ;/////////////////////////////////////////////////// cmd_rename: ex de,hl - ;ld de,T9186 ld de,Buffers.work.buffer1; ld c,Dss.GSwitch RST ToDSS - ;ld de,T9206 ld de,Buffers.work.buffer+256; ld c,Dss.GSwitch RST ToDSS - ;ld hl,T9186 - ;ld de,T9206 ld hl,Buffers.work.buffer1; ld de,Buffers.work.buffer+256; ld c,Dss.Rename diff --git a/SHELL/Commands/RMDIR.ASM b/SHELL/Commands/RMDIR.ASM index 86ef838..62b4867 100644 --- a/SHELL/Commands/RMDIR.ASM +++ b/SHELL/Commands/RMDIR.ASM @@ -3,15 +3,16 @@ ; RD, RMDIR. Удалить папку ; ;/////////////////////////////////////////////////// -cmd_rmdir: - ex de,hl - ;ld de,T9186 ; буфер - ld de,Buffers.work.buffer1; - ld c,Dss.GSwitch ; выделить параметр ком-строки - RST ToDSS - ;ld hl,T9186 ; имя папки - ld hl,Buffers.work.buffer1; - ld c,Dss.RmDir ; удалить папку - RST ToDSS - call c,print_err_message ; вывод сообщения - ret +cmd_rmdir: ld c,Dss.RmDir ; создать папку + push bc + ; +.shared: ex de,hl + ld de,Buffers.work.buffer1; + ld c,Dss.GSwitch ; выделить параметр ком-строки + RST ToDSS + ld hl,Buffers.work.buffer1 ; имя папки + POP BC + RST ToDSS + ret nc + JP print_err_message ; вывод сообщения +; diff --git a/SHELL/EXEC.ASM b/SHELL/EXEC.ASM index 60b77cf..00aa701 100644 --- a/SHELL/EXEC.ASM +++ b/SHELL/EXEC.ASM @@ -60,10 +60,21 @@ COMP: call EVALCMD ; (batch.asm) jr nc,.NOUP and #5F ; a..z -> A..Z .NOUP: sub "A" ; номер диска + ld (.dsk),a ld c,Dss.ChDisk ; сменить тек. диск RST ToDSS - jp c,print_err_message ; вывод сообщения - + jr nc,.no_err + ; + cp DSS_Error.sys.MEDIA_CHANGED + jp nz,print_err_message + ; + call print_err_message +.dsk+1: ld a,0 + ld c,Dss.ChDisk ; сменить тек. диск + RST ToDSS + jp c,print_err_message + ; +.no_err: ;!FIXIT тут восстанавливается директория и могут быть глюки на новом ядре ;!TODO доставать Buffers.sys_path отдельно для каждого диска (или в ядре сделать?) ; тест на существование папки на целевом диске diff --git a/SHELL/build.txt b/SHELL/build.txt index 812799a..ee2b836 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -452 \ No newline at end of file +456 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index b3224fc..aa0c67b 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b3224fc3afac71c6b1d461ff54049e58657bbe5a +Subproject commit aa0c67b6b30b02b1302145cd4d57b708130e2e0a