From 4bde8c738c12cab6657caa531d10a124f4cb3e7e Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 6 Feb 2025 03:34:12 +1000 Subject: [PATCH] =?UTF-8?q?DSSBOOT:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B0?= =?UTF-8?q?=20=D1=81=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=8F=D0=B4=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 1 + DSS/DOS_Proc.asm | 8 +- DSS/build.txt | 2 +- DSS/drivers/media/ata_atapi-drv.asm | 113 +++++++++++++++++++++++----- SHELL/build.txt | 2 +- 5 files changed, 104 insertions(+), 22 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index eff0e54..d451e3a 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -263,6 +263,7 @@ RUN_CORE: DI ; INC_SECTOR_NUM: PUSH DE CALL CLUSTER_TO_SECTOR + CALL GET_ABSOLUTE_SECTOR LD DE,#20 ;!HARDCODE количество прочитанных секторов ADD IX,DE JR NC,.no_inc diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index ffc901b..b50e811 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -192,6 +192,7 @@ OPENDSK: ;!TEST DRV.Open RST ToDSS.DRV POP BC JR Z,.exit + JR .skip_open ;!FIXIT когда DRV.MediaCheck и DRV.Open будут отличаться ; .open: LD A,C ; @@ -201,7 +202,7 @@ OPENDSK: ;!TEST DRV.Open POP BC JP C,.error ;[x] 29/02/2024 fix "open drive error" - LD A,(CORE_BUFFERS.FatBuffer.DRIVE) +.skip_open: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD D,A PUSH DE ; @@ -217,12 +218,13 @@ OPENDSK: ;!TEST DRV.Open .exit: LD A,(LDRIVE) AND A RET - ; + ; !FIXIT костыль для Flex Navigator ; [ ] media change .error: CP DSS_Error.sys.INVALID_DRIVE SCF RET Z LD A,DSS_Error.sys.NOT_READY - RET + RET + ; ;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed .error_bpb: PUSH AF ; сохраняем номер ошибки LD A,(CORE_BUFFERS.FatBuffer.DRIVE) diff --git a/DSS/build.txt b/DSS/build.txt index 301160a..f11c82a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -8 \ No newline at end of file +9 \ 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 86764f5..55aeb65 100644 --- a/DSS/drivers/media/ata_atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -294,16 +294,49 @@ Init: PUSH IY ;+10 WORD Sector Size ;+12 BYTE Removable Media Byte flags ;+13_15 FREE +; SelectDrive: PUSH DE +; PUSH HL +; ; +; LD L,A +; ; +; LOGDRV_ENTRY_FIND LOGDRV +; ; +; ; [ ] custorm sector size +; CALL CHECK_IDE_SECTOR_SIZE +; RLA +; ; +; ; +; LD E,(IY+LOGDRV.SECTOR_OFFSET) +; LD D,(IY+LOGDRV.SECTOR_OFFSET+1) +; ADD IX,DE +; LD E,(IY+LOGDRV.SECTOR_OFFSET+2) +; LD D,(IY+LOGDRV.SECTOR_OFFSET+3) +; POP HL +; ADC HL,DE +; ; [ ] custom sector size +; ;JR C,.exit +; RRA +; ; +; .exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) +; POP DE +; RET NC +; LD A,DSS_Error.drv.UNKNOWN_FORMAT +; RET +; переделать тут проверку на размер сектора? SelectDrive: PUSH DE PUSH HL ; LD L,A + ADD 0 - DSS_MAX_DRIVES_AMOUNT - 1 + LD A,DSS_Error.sys.INVALID_DRIVE + JR C,.error_pop ; LOGDRV_ENTRY_FIND LOGDRV ; ; [ ] custom sector size CALL CHECK_IDE_SECTOR_SIZE - RLA + LD A,DSS_Error.drv.UNKNOWN_FORMAT + JR C,.error_pop ; ; LD E,(IY+LOGDRV.SECTOR_OFFSET) @@ -313,15 +346,17 @@ SelectDrive: PUSH DE LD D,(IY+LOGDRV.SECTOR_OFFSET+3) POP HL ADC HL,DE - ; [ ] custom sector size - ;JR C,.exit - RRA - ; -.exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) POP DE - RET NC - LD A,DSS_Error.drv.UNKNOWN_FORMAT - RET + LD A,DSS_Error.drv.SECTOR_NOT_FOUND + RET C + ; + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) + RET + ; +.error_pop: POP HL + POP DE + RET + ; 00 - GET DEVICE PARAMETERS ; 01 - READ TRACK @@ -509,17 +544,55 @@ Close: XOR A ;!TODO пока Open ничего не делает кроме проверки MediaCheck -Open: ;CALL MediaCheck - ;RET -; JP MediaCheck +Open: CALL MediaCheck + ;!TODO + ;RET С + ;CALL READ_PARTITION_PARAMETERS + RET ; ;[ ] media changed - bios 5x DETECT ; выход A=#FF - changed, A=0 - not changed, ZF=1 - not changed +; MediaCheck: PUSH IY +; CALL SelectDrive +; JR C,.exit +; ; +; ; [ ] media changed +; LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) +; LD C,BIOS.DRV_DETECT ;[ ] media change переделать логику тут и в биос? ; !FIXIT +; PUSH IY +; RST ToBIOS +; POP IY +; JR NC,.next_check +; ; +; CP BIOS.Error.ATAPI.UnitAttention +; JR Z,.Reinit +; JR .exit +; ; +; .next_check: BIT 1,(IY + LOGDRV.MediaParameters) +; JR NZ,.Reinit +; ; +; XOR A +; .exit: POP IY +; RET +; ; +; .Reinit: LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) +; LD (CURRENT_DRIVE.Number),A +; LD (LOGDRV_OFFSET),IY +; ;RES 1,(IY + LOGDRV.MediaParameters) +; CALL DEFINE_PARTITIONS +; LD A,#FF ;!HARDCODE drive changed +; OR A +; POP IY +; RET MediaCheck: PUSH IY CALL SelectDrive - JR C,.exit + JR NC,.next_step ; + CP DSS_Error.drv.UNKNOWN_FORMAT + SCF + JR NZ,.exit ; [ ] 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 PUSH IY @@ -529,13 +602,18 @@ MediaCheck: PUSH IY ; CP BIOS.Error.ATAPI.UnitAttention JR Z,.Reinit - JR .exit + SCF + POP BC ; Баланс стека +.exit: POP IY + RET ; .next_check: BIT 1,(IY + LOGDRV.MediaParameters) JR NZ,.Reinit ; + POP AF ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1 + POP IY + RET C XOR A -.exit: POP IY RET ; .Reinit: LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) @@ -543,13 +621,14 @@ MediaCheck: PUSH IY LD (LOGDRV_OFFSET),IY ;RES 1,(IY + LOGDRV.MediaParameters) CALL DEFINE_PARTITIONS + POP AF + POP IY + RET C ; Восстанавливаем CF и код ошибки UNKNOWN_FORMAT, если CF=1 LD A,#FF ;!HARDCODE drive changed OR A - POP IY RET - ; [ ] custorm sector size CHECK_IDE_SECTOR_SIZE: LD E,(IY+LOGDRV.SECTOR_SIZE) diff --git a/SHELL/build.txt b/SHELL/build.txt index 4991210..812799a 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -451 \ No newline at end of file +452 \ No newline at end of file