From e7cb4c354fca81b503f9c89ccf3752ab5224920c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 19 Feb 2025 02:16:58 +1000 Subject: [PATCH] ATAPI media changed - 99% --- Shared_Includes | 2 +- src/bios/exp/BIOS_FUNC.asm | 4 +- src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM | 185 ++++++++++++++++-------- src/bios/rom/SETUP/AUTOIDE.asm | 59 ++++---- 4 files changed, 151 insertions(+), 99 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 831b2da..2b1e30c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 831b2da8a66ee3bd78a7c73ef3592609e5f02902 +Subproject commit 2b1e30c6108f0a5c271f84558e1e5f804a6d623a diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index 7fd392d..770bbb7 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -556,14 +556,14 @@ TAB_5xFNS: DB low ATAPI_5x_READ DB low ATAPI_5x_WRITE ; [ ] new DB low ATAPI_5x_DETECT - DB low ATAPI_5x_GET_PAR ; [ ] new + DB low ATAPI_5x_GET_PAR ; [ ] new DB low ATAPI_5x_SET_PAR ; SETMED DB low DRV_VERSION DB low FN_RESERVED_5x DB low FN_RESERVED_5x DB low FN_RESERVED_5x - DB low ATAPI_5x_Extended ;[ ] media changed? ;!TODO + DB low ATAPI_5x_Extended ;[ ] media changed? ;!TODO DB low DRV_LIST ;---------------------------------------------------------------------[] diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index f25dd53..aeff00d 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -33,8 +33,11 @@ ATAPI_5x_RESET: LD C,IDE.Device.ATAPI POP BC RET NC ; - CALL ATAPI_CHECK_MEDIA_CHANGED.noWait - RET C + ;CALL ATAPI_CHECK_MEDIA_CHANGED.noWait + ;RET C + CP BIOS.Error.ATAPI.UnitAttention + SCF + RET Z ; EI HALT @@ -354,29 +357,32 @@ ATAPI_5x_DETECT: ; A - Disk ; B - SubFunction ;Return: -; +; [ ] расписать в доке ATAPI_5x_Extended: - LD C,IDE.Device.ATAPI - CALL SELECT_DRIVE - RET C - ; - LD A,B - CP 2 - JR C,TRAY_FN ; B = 0 или 1 - ; - JR Z,ATAPI_REQUEST_SENSE ; B = 2 - ; ... - ; ... - ;LD A,#AA - LD A,BIOS.Error.InvalidSubFunction - SCF - RET + LD C,IDE.Device.ATAPI + CALL SELECT_DRIVE + RET C + ; + LD A,B + CP 2 + JR C,TRAY_FN ; B = 0 или 1 + ; + JR Z,ATAPI_REQUEST_SENSE ; B = 2 + ; + CP 3 + JR Z,ATAPI_CUSTOM_CMD + ; ... + LD A,BIOS.Error.InvalidSubFunction + SCF + RET ;[]================================================================[#5E] ;----------------------------------------------------------------------;!TODO сделать доступной через расширенную функцию API ; вход: DE - адрес для данных ATAPI_REQUEST_SENSE: - LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE + IN A,(SLOT3) + EX AF,AF' +.FN: LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE JR EXEC_PACKET_COMMAND.start ;----------------------------------------------------------------------; @@ -409,15 +415,7 @@ ATAPI_CHECK_MEDIA_CHANGED: RET ; .noWait: EXX - ;CALL ATAPI_GET_ERROR - XOR A ;LD BC,IDE.Read.Error - IN A,(IDE.Read.Error) ;IN A,(C) - RRCA - RRCA - RRCA - RRCA - AND #0F - OR #70 + CALL ATAPI_GET_ERROR_REG EXX CP BIOS.Error.ATAPI.NoSence JP Z,ATAPI_MEDIA_ERROR @@ -431,6 +429,18 @@ ATAPI_CHECK_MEDIA_CHANGED: RET ;----------------------------------------------------------------------; + +;----------------------------------------------------------------------; +; HL - указатель на пакетную команду (первый или второй слот) +; DE - указатель на буффер для команды +ATAPI_CUSTOM_CMD: + IN A,(SLOT3) + EX AF,AF' + LD A,1 ; признак, что ошибка смены носителя НЕ обрабатываться в EXEC_PACKET_COMMAND + JP EXEC_PACKET_COMMAND.start_custom +;----------------------------------------------------------------------; + + ;----------------------------------------------------------------------; TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE LD DE,0 ; маркер того, что не нужно читать с устройства в ОЗУ @@ -441,6 +451,7 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE ; INPUT: HL - AP packet (12bytes) ; DE - address for/with data if needed +; A' - начальная страница для R/W Long ; ; RETURN: CF - ERROR ; !TODO CD ERRORS to INCLUDES @@ -467,21 +478,14 @@ EXEC_PACKET_COMMAND: LD A,BIOS.Error.ATAPI.TimeOut SCF RET -; .CMD_ERROR: CALL ATAPI_GET_ERROR -; OR #70 -; CP BIOS.Error.UnitAttention -; CALL Z,ATAPI_MEDIA_ERROR -; ;LD BC,IDE.Read.Error ;ERROR -; ;IN A,(C) -; ;RRCA -; ;RRCA -; ;RRCA -; ;RRCA -; ;AND #0F -; SCF -; RET ; -.start: EXX +.start_sys_page: + LD A,SYS_PAGE + EX AF,AF' + ; +.start: XOR A ; признак того, что ошибка смены носителя должна обрабатываться в EXEC_PACKET_COMMAND +.start_custom: EXX + LD C,A ; признак того, что ошибка смены носителя должна обрабатываться в EXEC_PACKET_COMMAND CALL ATAPI_WAITPRT EXX JR NC,.READY @@ -515,6 +519,7 @@ EXEC_PACKET_COMMAND: ; XOR A EXX + LD H,C ; признак того, что ошибка смены носителя должна обрабатываться в EXEC_PACKET_COMMAND LD BC,IDE.Write.Features OUT (C),A LD DE,MAX_ATAPI_SEC_SIZE ;SIZE BLOCK ;!HARDCODE доставать из переменной какой-нибудь @@ -525,6 +530,7 @@ EXEC_PACKET_COMMAND: LD BC,IDE.Write.Command LD A,IDE.ATAPI.Packet OUT (C),A + LD C,H ; признак того, что ошибка смены носителя должна обрабатываться в EXEC_PACKET_COMMAND CALL ATAPI_WAITPRT EXX JR C,.error @@ -564,13 +570,14 @@ EXEC_PACKET_COMMAND: ; EX DE,HL .AP_LOOP: EX DE,HL - IN A,(SLOT3) - EX AF,AF' ;>-----------> \ + ; IN A,(SLOT3) + ; EX AF,AF' ;>-----------> \ ; - EXX + EXX CALL ATAPI_WAITPRT - EXX + EXX JP C,.error + ; ; [ ] media change. а надо ли тут? ;!FIXIT лучше блокировать носитель LD A,high IDE.Read.Status IN A,(low IDE.Read.Status) @@ -578,10 +585,18 @@ EXEC_PACKET_COMMAND: AND IDE.CtrlByte.DataRequest + IDE.CtrlByte.Error RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors RRA ; Checking IDE.CtrlByte.CheckCondition - JP C,ATAPI_CHECK_MEDIA_CHANGED.noWait - ; - ;====== IF DATA REQUEST =======================================; - ; + JR NC,.data_request + ; признак того, что ошибка смены носителя должна обрабатываться в EXEC_PACKET_COMMAND + EXX + DEC C ; признак того, что ошибка смены носителя должна обрабатываться в EXEC_PACKET_COMMAND + EXX + RET Z ; выход, если ошибка обрабатывается не в EXEC_PACKET_COMMAND + ; + JP ATAPI_CHECK_MEDIA_CHANGED.noWait +;====== IF DATA REQUEST ===============================================; +.data_request: IN A,(SLOT3) + EX AF,AF' ;>-----------> \ + ; LD A,XH OUT (SLOT3),A EX DE,HL @@ -669,14 +684,17 @@ EXEC_PACKET_COMMAND: ;----------------------------------------------------------------------; -; ATAPI_GET_ERROR: XOR A ;LD BC,IDE.Read.Error -; IN A,(IDE.Read.Error) ;IN A,(C) -; RRCA -; RRCA -; RRCA -; RRCA -; AND #0F -; RET +; портим только регистр AF +ATAPI_GET_ERROR_REG: + XOR A ;LD BC,IDE.Read.Error + IN A,(IDE.Read.Error) ;IN A,(C) + RRCA + RRCA + RRCA + RRCA + AND #0F + OR BIOS.Error.ATAPI + RET ;----------------------------------------------------------------------; @@ -705,6 +723,45 @@ ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 ;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +; DE - buffer +ATAPI_READ_CAPACITY_DATA: + LD BC,28 ;счётчик + ; +.loop: PUSH BC + PUSH DE + LD A,SYS_PAGE + EX AF,AF' + LD A,1 + LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA + CALL EXEC_PACKET_COMMAND.start_custom + POP DE + POP BC + RET NC + ; + CALL ATAPI_GET_ERROR_REG + CP BIOS.Error.ATAPI.NotReady + SCF + RET NZ + CALL ATAPI_MEDIA_ERROR + CP BIOS.Error.ATAPI.NotReady + SCF + RET NZ + ; + CPI + RET PO + ; + LD HL,0 +.pause: DEC HL + LD A,H + OR L + JR NZ,.pause + ; + JP .loop + RET +;----------------------------------------------------------------------; + + ;----------------------------------------------------------------------; ; ATAPI_TEST: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY ; LD DE,0 ; маркер того, что не нужно читать с устройства в ОЗУ @@ -718,9 +775,9 @@ ATAPI_MEDIA_ERROR: PUSH AF LD A,SYS_PAGE OUT (SLOT3),A - ; + EX AF,AF' ; set page with buffer to SYS_PAGE LD DE,SYS_PAGE.SHARED_BUFFER_256b - CALL ATAPI_REQUEST_SENSE + CALL ATAPI_REQUEST_SENSE.FN ; LD A,(SYS_PAGE.SHARED_BUFFER_256b + 2) ; SenceKey. 06 - UNIT ATTENTION CP 2 ; SenceKey. 02 - NOT READY @@ -740,9 +797,11 @@ ATAPI_MEDIA_ERROR: OR %0000'0011 LD (IY + IDE.HDD_INIT_TABLE.MediaParameters),A ; - LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA - LD DE,SYS_PAGE.TMP_BUFFER - CALL EXEC_PACKET_COMMAND.start + ;LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA + LD DE,SYS_PAGE.TMP_BUFFER + ;CALL EXEC_PACKET_COMMAND.start_sys_page + CALL ATAPI_READ_CAPACITY_DATA + ; LD HL,#FFFF LD C,BIOS.Error.ATAPI.MediumError JR C,.No_Media diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index be1d27a..a7173c8 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -291,12 +291,11 @@ AUTODETECTING: CALL DETECTORS.CheckChanel .Its_ATAPI: CALL DETECTORS.IdentPDevChk JR C,.IDE_ABSENT LD A,IDE.Device.ATAPI - LD (IDEDEV),A JR .get .Its_ATA: LD A,IDE.Device.HDD - LD (IDEDEV),A -.get: CALL GETPARAM +.get: LD (IDEDEV),A + CALL GETPARAM JR C,.IDE_ABSENT ;CALL DisableWriteCache ;CALL DisableStandBy @@ -467,9 +466,10 @@ IDESPEC: IN A,(SLOT3) ; LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; просто нужен был буфер ; CALL EXEC_PACKET_COMMAND.start ; [ ] sector size ATAPI -.s_size: LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA +.s_size: ;LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; просто нужен был буфер - CALL EXEC_PACKET_COMMAND.start + ;CALL EXEC_PACKET_COMMAND.start_sys_page + CALL ATAPI_READ_CAPACITY_DATA ; .set_sector: LD HL,#FFFF JR C,.No_Media @@ -526,31 +526,27 @@ MODEL: LD HL,IDENTIFY_DEVICE_BUFFER.ModelNumber /////////////////////////////////////////////////////////////////////[v] BITS_WAITS: -; IN: -; HL - Waiting delay -; DE - MASK : PATTERN -; OUT: -; NC: (PORT & D)-E = 0 -; CF: waiting delay exceeded -.WAIT_PRT: - LD BC,IDE.Read.Status - ; -.loop: IN A,(C) - AND D - CP E - RET Z - DEC HL - CALL SKIPKEY - RET C - LD A,L - OR H - JP NZ,.loop - ; - SCF - RET - ; - -; Pause for clear BUSY and DATA REQUEST + ; IN: + ; HL - Waiting delay + ; DE - MASK : PATTERN + ; OUT: + ; NC: (PORT & D)-E = 0 + ; CF: waiting delay exceeded +.WAIT_PRT: LD BC,IDE.Read.Status +.loop: IN A,(C) + AND D + CP E + RET Z + DEC HL + CALL SKIPKEY + RET C + LD A,L + OR H + JP NZ,.loop + SCF + RET + ; + ; Pause for clear BUSY and DATA REQUEST .Clear_BUSY: LD BC,IDE.Read.Status IN A,(C) ;!TEST for normal bus with pull-ups @@ -570,7 +566,6 @@ BITS_WAITS: ; CALL SKIPKEY RET C - ; JR .Clear_BUSY /////////////////////////////////////////////////////////////////////[^] @@ -835,8 +830,6 @@ DETECTORS: LD BC,IDE.Read.Status IN A,(C) RRCA - ; RET C - ; XOR A RET ;-------;