From e5856eef12b04dab94bc0b86fcf171ec03847965 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 16 Jan 2025 01:26:55 +1000 Subject: [PATCH] =?UTF-8?q?=D0=B5=D1=89=D1=91=20=D0=BA=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BB=D1=8F=20media=20change=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM | 81 +++++++++++++++++-------- 1 file changed, 55 insertions(+), 26 deletions(-) diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index 50c35f7..1eb3472 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -54,6 +54,7 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI ; DE - Cylinders ; IX - Capacity sector in bytes ; B - Flags: MASTER/SLAVE, LBA/CHS +; [ ] A - HDD_INIT_TABLE.RemovableMedia CD_5x_GETMED: LD C,IDE.Device.ATAPI CALL SELECT_DRIVE RET C @@ -79,6 +80,7 @@ CD_5x_GETMED: LD C,IDE.Device.ATAPI ; LD H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) ; LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow) ; LD D,(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh) + LD A,(IY+IDE.HDD_INIT_TABLE.RemovableMedia) LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) LD L,(IY+IDE.HDD_INIT_TABLE.SectorSize) ;[ ] sector size LD H,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1) ;[ ] sector size @@ -91,7 +93,7 @@ CD_5x_GETMED: LD C,IDE.Device.ATAPI LD E,H EX AF,AF' OUT (SLOT3),A - ;AND A + EX AF,AF RET ;[]================================================================[#58] @@ -255,10 +257,32 @@ CD_5x_LONG_WRITE: ; A - Disk ;Return: CF=0 - A=Drive type ; CF=1 - drive not present, A=#02 -CD_5x_DETECT: - LD C,IDE.Device.ATAPI - AND %1011'1111 - JP DRV_DETECT +CD_5x_DETECT: LD C,IDE.Device.ATAPI + AND %1011'1111 + CALL DRV_DETECT + RET C + ; + PUSH AF + LD BC,SLOT3 + IN B,(C) + LD A,SYS_PAGE + OUT (C),A + INC HL ;!HARDCODE HDD_INIT_TABLE + INC HL + INC HL + LD A,(HL) + OUT (C),B + AND %0000'0010 + JR Z,.exit + ; + POP AF + LD A,BIOS.Error.ATAPI.UnitAttention + SCF + RET + ; +.exit: POP AF + RET + ;[]================================================================[#57] @@ -323,11 +347,8 @@ CD_CHECK_MEDIA_CHANGED: OR #70 EXX CP BIOS.Error.ATAPI.NoSence + JP Z,CD_MEDIA_CHANGED_ERROR ;SCF - RET NZ - ; - CALL CD_MEDIA_CHANGED_ERROR - ; LD A,BIOS.Error.ATAPI.UnitAttention RET ;----------------------------------------------------------------------; @@ -338,8 +359,7 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE JR Z,EXEC_PACKET_COMMAND LD HL,ATAPI_CMD_PACKET.OPEN ;JR EXEC_PACKET_COMMAND -;----------------------------------------------------------------------; -;----------------------------------------------------------------------; + ; INPUT: HL - AP packet (12bytes) ; DE - address for/with data if needed ; @@ -378,9 +398,9 @@ EXEC_PACKET_COMMAND: ; EXX CALL CD_WAITPRT - EXX - ;RET C - JR C,CD_CHECK_MEDIA_CHANGED.noWait + EXX + JR C,.error + ;JR C,CD_CHECK_MEDIA_CHANGED.noWait ; .READY: LD C,SLOT3 IN B,(C) @@ -413,19 +433,30 @@ EXEC_PACKET_COMMAND: OUT (C),A CALL CD_WAITPRT EXX - ;RET C - JR C,CD_CHECK_MEDIA_CHANGED.noWait + JR C,.error + ;JR C,CD_CHECK_MEDIA_CHANGED.noWait ; EXX LD DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest CALL CD_WAITPRT.Custom EXX - BIT IDE.CtrlBit.Error,A - JR NZ,CD_CHECK_MEDIA_CHANGED.noWait JR NC,.YEP_DRQ - LD A,BIOS.Error.ATAPI.TimeOut ;!FIXIT media change test + ; + CP #FF + JR Z,.error_fail + ; + RRA ;AND IDE.CtrlByte.Error + JR C,CD_CHECK_MEDIA_CHANGED.noWait + ; + LD A,BIOS.Error.ATAPI.TimeOut RET ; +.error: CP #FF + SCF +.error_fail: LD A,BIOS.Error.Failure + RET Z + LD A,BIOS.Error.Busy + RET ; .CMD_ERROR: CALL CD_GET_ERROR ; OR #70 ; CP BIOS.Error.UnitAttention @@ -475,7 +506,8 @@ EXEC_PACKET_COMMAND: EXX CALL CD_WAITPRT EXX - RET C + JR C,.error + ; LD BC,IDE.Read.Status IN A,(C) BIT IDE.CtrlBit.Error,A @@ -575,7 +607,7 @@ CD_GET_ERROR: LD BC,IDE.Read.Error ;ERROR ;----------------------------------------------------------------------; ; D - MASK, E - PATTERN -CD_WAITPRT: LD DE,256*(IDE.CtrlByte.Busy) + 0 +CD_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 .Custom: LD B,100 LD HL,#0000 .LOOP: LD A,high IDE.Read.Status @@ -592,11 +624,8 @@ CD_WAITPRT: LD DE,256*(IDE.CtrlByte.Busy) + 0 DEC H JR NZ,.LOOP DJNZ .LOOP - ; - ;EX AF,AF' -.error: ; !FIXIT error number - SCF - RET +.error: SCF + RET ;----------------------------------------------------------------------;