diff --git a/Shared_Includes b/Shared_Includes index 7ef1dd9..d21dd0c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7ef1dd98b491068d5a9ded34f5ff51430b7fa7e7 +Subproject commit d21dd0c0291e48f53d40b7bd09fcb8e7756dda1e diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index f3d045c..80ddb4c 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -13,10 +13,11 @@ ; [ ] установка параметра максимального размера для чтения через DRV_SET_PAR ; ;---------------------------------------------------------------------------------- -MAX_ATAPI_SEC_SIZE EQU 4096/2 -PACKET_SIZE EQU 12 ; !FIXIT брать из IDENTIFY PACKET DEVICE -RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b -RAM_ATAPI_RW_CMD EQU SYS_PAGE.SHARED_BUFFER_32b+16 +MAX_ATAPI_SEC_SIZE EQU 4096/2 +PACKET_SIZE EQU 12 ; !FIXIT брать из IDENTIFY PACKET DEVICE +RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b +RAM_ATAPI_RW_CMD EQU SYS_PAGE.SHARED_BUFFER_32b+16 +MAX_DATA_PACKET_FOR_REQUEST_SENSE EQU 254 ASSERT ((PACKET_SIZE % 4) = 0), "PACKET_SIZE must be an even number" @@ -47,33 +48,60 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI ; DE - Cylinders ; IX - Capacity sector in bytes ; B - Flags: MASTER/SLAVE, LBA/CHS -CD_5x_GETMED: - LD C,IDE.Device.ATAPI - CALL SELECT_DRIVE - RET C - ; [ ] sector size. media changed +CD_5x_GETMED: LD C,IDE.Device.ATAPI + CALL SELECT_DRIVE + RET C + ; [ ] sector size. media changed + CALL CD_CHECK_MEDIA_CHANGED + JR NC,.get_data + ; + CP BIOS.Error.ATAPI.UnitAttention + JR NZ,.get_data + ; - ; - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD HL,0 - LD D,H - LD L,H - ; LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) - ; 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 B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) - LD A,(IY+IDE.HDD_INIT_TABLE.SectorSize) ;[ ]sector size - LD XL,A - LD A,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1) ;[ ]sector size - LD XH,A - EX AF,AF' - OUT (SLOT3),A - ;AND A - RET + ; + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + ; + ; [ ] sector size. media changed + CALL CD_CHECK_MEDIA_CHANGED + JR NC,.get_data + ; + CP BIOS.Error.ATAPI.UnitAttention + JR NZ,.get_data + ; + LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA + LD DE,SYS_PAGE.TMP_BUFFER + CALL EXEC_PACKET_COMMAND + LD HL,#FFFF + JR C,.No_Media + ; + LD HL,(SYS_PAGE.TMP_BUFFER + 6) ; sector size (high byte, low byte) + ; +.No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H ;[ ]sector size + LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L ;[ ]sector size + ; +.get_data: ; + ; LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) + ; 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 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 + EX DE,HL + LD XL,E + LD XH,D + ; + LD HL,0 + LD D,H + LD E,H + EX AF,AF' + OUT (SLOT3),A + ;AND A + RET ;[]================================================================[#58] ;!TODO @@ -115,9 +143,7 @@ CD_5x_LONG_READ: EX AF,AF' AND A ;read EX AF,AF' - ld - ; проверить .RemovableMedia bit, если установлен, то пропуск RW_ATAPI_SECTORs - CALL NC,RW_ATAPI_SECTORs + CALL RW_ATAPI_SECTORs ; [ ] sector size. media changed JP HDD_5x_LONG_READ.shared ; JP NC,HDD_5x_LONG_READ.shared @@ -146,6 +172,11 @@ RW_ATAPI_SECTORs: PUSH BC LD A,SYS_PAGE OUT (C),A + ; [ ] media change + LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia) + AND %0000'0010 + JR NZ,.error_media + ; LD HL,ATAPI_CMD_PACKET.READ EX AF,AF' JR NC,.read_cmd @@ -175,10 +206,16 @@ RW_ATAPI_SECTORs: LD HL,RAM_ATAPI_RW_CMD CALL EXEC_PACKET_COMMAND ; - POP BC +.exit: POP BC ;LD C,SLOT3 OUT (C),B RET + ; +.error_media: EXX + LD A,BIOS.Error.ATAPI.UnitAttention + SCF + JR .exit + ;[]===========================================================[#52, #55] ;[]================================================================[#56] @@ -218,10 +255,7 @@ CD_5x_LONG_WRITE: EX AF,AF' SCF ;write EX AF,AF' - ; - ld - ; проверить .RemovableMedia bit, если установлен, то пропуск RW_ATAPI_SECTORs - CALL NC,RW_ATAPI_SECTORs + CALL RW_ATAPI_SECTORs ; JP HDD_5x_LONG_READ.shared @@ -238,6 +272,7 @@ CD_5x_DETECT: ;[]================================================================[#5E] +; [ ] ;Function: Extended ; A - Disk ; B - SubFunction @@ -250,7 +285,9 @@ CD_5x_Extended: ; LD A,B CP 2 - JR C,TRAY_FN + JR C,TRAY_FN ; B = 0 или 1 + ; + JR Z,CD_REQUEST_SENSE ; B = 2 ; ... ; ... ;LD A,#AA @@ -259,6 +296,34 @@ CD_5x_Extended: RET ;[]================================================================[#5E] +;----------------------------------------------------------------------;!TODO сделать доступной через расширенную функцию API +; вход: DE - адрес для данных +CD_REQUEST_SENSE: + LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE + JR EXEC_PACKET_COMMAND +;----------------------------------------------------------------------; + +;----------------------------------------------------------------------; +CD_CHECK_MEDIA_CHANGED: + EXX + LD DE,256*(IDE.CtrlByte.Error) + 0 + CALL CD_WAITPRT.Custom + EXX + RET NC + ; +.noWait: EXX + CALL CD_GET_ERROR + OR #70 + EXX + CP BIOS.Error.ATAPI.NoSence + SCF + RET NZ + ; + CALL CD_MEDIA_CHANGED_ERROR + ; CF=1 + LD A,BIOS.Error.ATAPI.UnitAttention + RET +;----------------------------------------------------------------------; ;----------------------------------------------------------------------; TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE @@ -266,9 +331,8 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE DEC A JR Z,EXEC_PACKET_COMMAND LD HL,ATAPI_CMD_PACKET.OPEN - JR EXEC_PACKET_COMMAND + ;JR EXEC_PACKET_COMMAND ;----------------------------------------------------------------------; - ;----------------------------------------------------------------------; ; INPUT: HL - AP packet (12bytes) ; DE - address for/with data if needed @@ -312,10 +376,7 @@ EXEC_PACKET_COMMAND: ;RET C JR C,CD_CHECK_MEDIA_CHANGED.noWait ; -.READY: CALL CD_CHECK_MEDIA_CHANGED - RET C - ; - LD C,SLOT3 +.READY: LD C,SLOT3 IN B,(C) PUSH DE PUSH BC @@ -356,7 +417,7 @@ EXEC_PACKET_COMMAND: BIT IDE.CtrlBit.Error,A JR NZ,CD_CHECK_MEDIA_CHANGED.noWait JR NC,.YEP_DRQ - LD A,BIOS.Error.TimeOut ;!FIXIT media change test + LD A,BIOS.Error.ATAPI.TimeOut ;!FIXIT media change test RET ; ; .CMD_ERROR: CALL CD_GET_ERROR @@ -412,7 +473,7 @@ EXEC_PACKET_COMMAND: LD BC,IDE.Read.Status IN A,(C) BIT IDE.CtrlBit.Error,A - JR NZ,CD_CHECK_MEDIA_CHANGED.noWait + JP NZ,CD_CHECK_MEDIA_CHANGED.noWait ; AND IDE.CtrlByte.DataRequest RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors @@ -539,54 +600,41 @@ CD_TEST: LD HL,ATAPI_CMD_PACKET.NOP JP EXEC_PACKET_COMMAND ;----------------------------------------------------------------------; -;----------------------------------------------------------------------;!TODO сделать доступной через расширенную функцию API -; вход: DE - адрес для данных -CD_REQUEST_SENSE: - LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE - JP EXEC_PACKET_COMMAND - ld -;----------------------------------------------------------------------; ;----------------------------------------------------------------------; CD_MEDIA_CHANGED_ERROR: PUSH AF + ; IN A,(SLOT3) - EX AF,AF + PUSH AF LD A,SYS_PAGE OUT (SLOT3),A ; - LD A,%0000'0011 - LD (IY + HDD_INIT_TABLE.RemovableMedia),A + LD DE,SYS_PAGE.SHARED_BUFFER_256b + CALL CD_REQUEST_SENSE ; - EX AF,AF + LD A,(SYS_PAGE.SHARED_BUFFER_256b + 2) ; SenceKey. 06 + CP 6 + JR NZ,.exit + ; + LD A,(SYS_PAGE.SHARED_BUFFER_256b + 12) ; AdditionalSenceKey. #28 + CP #28 + JR NZ,.exit + ; + LD A,(SYS_PAGE.SHARED_BUFFER_256b + 13) ; AdditionalSenseCodeQualifier. 0 + AND A + JR NZ,.exit + ; + LD A,%0000'0011 + LD (IY + IDE.HDD_INIT_TABLE.RemovableMedia),A + ; +.exit: POP AF OUT (SLOT3),A POP AF RET ;----------------------------------------------------------------------; -;----------------------------------------------------------------------; -CD_CHECK_MEDIA_CHANGED: - EXX - LD DE,256*(IDE.CtrlByte.Error) + 0 - CALL CD_WAITPRT.Custom - EXX - RET NC - ; -.noWait: EXX - CALL CD_GET_ERROR - OR #70 - EXX - CP BIOS.Error.UnitAttention - SCF - RET NZ - ; - CALL CD_MEDIA_CHANGED_ERROR - ; CF=1 - LD A,BIOS.Error.UnitAttention - RET -;----------------------------------------------------------------------; - //////////////////////////////////////////////////////////////////////// ATAPI_CMD_PACKET: diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index 8e1269b..c2edb61 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -440,7 +440,6 @@ IDESPEC: IN A,(SLOT3) OR (HL) LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A ; - ld ; [ ] sector size ATAPI LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; просто нужен был буфер на 8 байтов @@ -448,12 +447,9 @@ IDESPEC: IN A,(SLOT3) LD HL,#FFFF JR C,.No_Media ; - LD A,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 6) ; sector size high - LD H,A - LD A,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 7) ; sector size low - LD L,A -.No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),L - LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),H + LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 6) ; sector size high +.No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H + LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L LD (IY+IDE.HDD_INIT_TABLE.RemovableMedia),%0000'0001 ; !HARDCODE ATAPI пока всегда removable ; JR IDESPEC.END