From a2022a4c6f35f46a612870ea6970665127a4e761 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 6 Feb 2025 04:12:47 +1000 Subject: [PATCH] =?UTF-8?q?ATAPI=20media=20change=20=C2=A2=E0=AE=A4=C2=A5?= =?UTF-8?q?=20OK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared_Includes | 2 +- src/bios/exp/BIOS_FUNC.asm | 104 +++++----- src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM | 244 +++++++++++++----------- src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM | 27 +-- src/bios/rom/SETUP/AUTOIDE.asm | 138 +++++++++----- 5 files changed, 283 insertions(+), 232 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index b3224fc..237dd36 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b3224fc3afac71c6b1d461ff54049e58657bbe5a +Subproject commit 237dd36651b4af124f12d3f1eaee3688467f8fa3 diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index 8c6fb14..399a8b8 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -524,15 +524,15 @@ TAB_5xFNS: ;-------------------------------------------------------------[ ATA #8 ] ; DB low FN_RESERVED_5x - DB low HDD_5x_RESET - DB low HDD_5x_LONG_READ - DB low HDD_5x_LONG_WRITE - DB low HDD_5x_VERIFY - DB low HDD_5x_READ - DB low HDD_5x_WRITE - DB low HDD_5x_DETECT - DB low HDD_5x_GET_PAR - DB low HDD_5x_SET_PAR + DB low ATA_5x_RESET + DB low ATA_5x_LONG_READ + DB low ATA_5x_LONG_WRITE + DB low ATA_5x_VERIFY + DB low ATA_5x_READ + DB low ATA_5x_WRITE + DB low ATA_5x_DETECT + DB low ATA_5x_GET_PAR + DB low ATA_5x_SET_PAR DB low DRV_VERSION DB low FN_RESERVED_5x @@ -549,21 +549,21 @@ TAB_5xFNS: ;-----------------------------------------------------------[ ATAPI #C ] ; DB low FN_RESERVED_5x - DB low CD_5x_RESET - DB low CD_5x_LONG_READ - DB low CD_5x_LONG_WRITE ; [ ] new + DB low ATAPI_5x_RESET + DB low ATAPI_5x_LONG_READ + DB low ATAPI_5x_LONG_WRITE ; [ ] new DB low FN_ABSENT_5x ; VERIFY - DB low CD_5x_READ - DB low CD_5x_WRITE ; [ ] new - DB low CD_5x_DETECT - DB low CD_5x_GET_PAR ; [ ] new + 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 FN_ABSENT_5x ; SETMED DB low DRV_VERSION DB low FN_RESERVED_5x DB low FN_RESERVED_5x DB low FN_RESERVED_5x - DB low CD_5x_Extended ;[ ] media changed? ;!TODO + DB low ATAPI_5x_Extended ;[ ] media changed? ;!TODO DB low DRV_LIST ;---------------------------------------------------------------------[] @@ -627,15 +627,15 @@ TAB_5xFNS: ;-------------------------------------------------------------[ ATA #8 ] ; DB high FN_RESERVED_5x - DB high HDD_5x_RESET - DB high HDD_5x_LONG_READ - DB high HDD_5x_LONG_WRITE - DB high HDD_5x_VERIFY - DB high HDD_5x_READ - DB high HDD_5x_WRITE - DB high HDD_5x_DETECT - DB high HDD_5x_GET_PAR - DB high HDD_5x_SET_PAR + DB high ATA_5x_RESET + DB high ATA_5x_LONG_READ + DB high ATA_5x_LONG_WRITE + DB high ATA_5x_VERIFY + DB high ATA_5x_READ + DB high ATA_5x_WRITE + DB high ATA_5x_DETECT + DB high ATA_5x_GET_PAR + DB high ATA_5x_SET_PAR DB high DRV_VERSION DB high FN_RESERVED_5x @@ -652,21 +652,21 @@ TAB_5xFNS: ;-----------------------------------------------------------[ ATAPI #C ] ; DB high FN_RESERVED_5x - DB high CD_5x_RESET - DB high CD_5x_LONG_READ - DB high CD_5x_LONG_WRITE ; LONG_WRITE ; [ ] new + DB high ATAPI_5x_RESET + DB high ATAPI_5x_LONG_READ + DB high ATAPI_5x_LONG_WRITE ; LONG_WRITE ; [ ] new DB high FN_ABSENT_5x - DB high CD_5x_READ - DB high CD_5x_WRITE ; WRITE ; [ ] new - DB high CD_5x_DETECT - DB high CD_5x_GET_PAR + DB high ATAPI_5x_READ + DB high ATAPI_5x_WRITE ; WRITE ; [ ] new + DB high ATAPI_5x_DETECT + DB high ATAPI_5x_GET_PAR DB high FN_ABSENT_5x ; SETMED DB high DRV_VERSION DB high FN_RESERVED_5x DB high FN_RESERVED_5x DB high FN_RESERVED_5x - DB high CD_5x_Extended + DB high ATAPI_5x_Extended DB high DRV_LIST ;---------------------------------------------------------------------[] @@ -688,15 +688,15 @@ EXP_FNS_RST18: EX (SP),HL RET - ; HDD_5x_RESET - ; HDD_5x_LONG_READ - ; HDD_5x_LONG_WRITE - ; HDD_5x_VERIFY - ; HDD_5x_READ - ; HDD_5x_WRITE - ; HDD_5x_DETECT - ; HDD_5x_GET_PAR - ; HDD_5x_SET_PAR + ; ATA_5x_RESET + ; ATA_5x_LONG_READ + ; ATA_5x_LONG_WRITE + ; ATA_5x_VERIFY + ; ATA_5x_READ + ; ATA_5x_WRITE + ; ATA_5x_DETECT + ; ATA_5x_GET_PAR + ; ATA_5x_SET_PAR ; DRV_VERSION ; FN_RESERVED_5x ; FN_RESERVED_5x @@ -704,34 +704,34 @@ EXP_FNS_RST18: ; FN_RESERVED_5x ; DRV_LIST -FN_5x_Parser_1: ; HDD_5x_RESET +FN_5x_Parser_1: ; ATA_5x_RESET LD C,#01 JP FN_5x_Parser -FN_5x_Parser_2: ; HDD_5x_LONG_READ +FN_5x_Parser_2: ; ATA_5x_LONG_READ LD C,#02 JP FN_5x_Parser -FN_5x_Parser_3: ; HDD_5x_LONG_WRITE +FN_5x_Parser_3: ; ATA_5x_LONG_WRITE LD C,#03 JP FN_5x_Parser -FN_5x_Parser_4: ; HDD_5x_VERIFY +FN_5x_Parser_4: ; ATA_5x_VERIFY LD C,#04 JP FN_5x_Parser -FN_5x_Parser_6: ; HDD_5x_WRITE +FN_5x_Parser_6: ; ATA_5x_WRITE LD C,#06 JP FN_5x_Parser -FN_5x_Parser_7: ; HDD_5x_DETECT +FN_5x_Parser_7: ; ATA_5x_DETECT LD C,#07 JP FN_5x_Parser -FN_5x_Parser_8: ; HDD_5x_GET_PAR +FN_5x_Parser_8: ; ATA_5x_GET_PAR LD C,#08 JP FN_5x_Parser -FN_5x_Parser_9: ; HDD_5x_SET_PAR +FN_5x_Parser_9: ; ATA_5x_SET_PAR LD C,#09 JP FN_5x_Parser FN_5x_Parser_E: ; DRV_EXTENDED LD C,#0E JP FN_5x_Parser -FN_5x_Parser_5: ; HDD_5x_READ +FN_5x_Parser_5: ; ATA_5x_READ LD C,5 FN_5x_Parser: PUSH HL diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index 8949812..1cd53c7 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -23,17 +23,17 @@ MAX_DATA_PACKET_FOR_REQUEST_SENSE EQU 254 ;[]================================================================[#51] ;!FIXIT сделать настоящий ресет -CD_5x_RESET: LD C,IDE.Device.ATAPI +ATAPI_5x_RESET: LD C,IDE.Device.ATAPI CALL SELECT_DRIVE RET C LD B,50 .loop: PUSH BC - CALL EXEC_NOP_CMD + CALL EXEC_TEST_CMD ;!FIXIT ;[ ] sector size. сделать реинит HDD_INIT_TABLE POP BC RET NC ; - CALL CD_CHECK_MEDIA_CHANGED.noWait + CALL ATAPI_CHECK_MEDIA_CHANGED.noWait RET C ; EI @@ -55,27 +55,31 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI ; [ ] A - HDD_INIT_TABLE.MediaParameters ; IF media changed ; [ ] CF' = 1, A' = error number UnitAttention -CD_5x_GET_PAR: LD C,IDE.Device.ATAPI +ATAPI_5x_GET_PAR: + LD C,IDE.Device.ATAPI CALL SELECT_DRIVE RET C ; - IN A,(SLOT3) +.DriveSelected: IN A,(SLOT3) AND A EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A ; ; [ ] sector size. media changed - CALL CD_CHECK_MEDIA_CHANGED + CALL ATAPI_CHECK_MEDIA_CHANGED JR NC,.get_data ; - CP BIOS.Error.ATAPI.NotReady - ;LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters) - SCF - JR NZ,.UnitAttention + CP BIOS.Error.ATAPI.UnitAttention + JR Z,.UnitAttention + ; + ;CP BIOS.Error.ATAPI.NotReady + ;SCF + ;RET NZ LD HL,#FFFF LD D,H LD E,L + SCF RET ; .UnitAttention: RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media @@ -115,7 +119,7 @@ CD_5x_GET_PAR: LD C,IDE.Device.ATAPI ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;READ SECTOR(S) -CD_5x_READ: EX AF,AF' +ATAPI_5x_READ: EX AF,AF' IN A,(SLOT3) EX AF,AF' ;[]================================================================[#52] @@ -129,7 +133,7 @@ CD_5x_READ: EX AF,AF' ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;LONG READ SECTOR(S) -CD_5x_LONG_READ: +ATAPI_5x_LONG_READ: AND A ; PUSH IY @@ -143,10 +147,10 @@ CD_5x_LONG_READ: EX AF,AF' CALL RW_ATAPI_SECTORs ; [ ] sector size. media changed - JP HDD_5x_LONG_READ.shared - ; JP NC,HDD_5x_LONG_READ.shared + JP ATA_5x_LONG_READ.shared + ; JP NC,ATA_5x_LONG_READ.shared ; CP BIOS.Error.UnitAttention - ; JR Z,CD_MEDIA_CHANGED_ERROR + ; JR Z,ATAPI_MEDIA_ERROR ; SCF ;[]================================================================[#52] ; INPUT: @@ -226,10 +230,9 @@ RW_ATAPI_SECTORs: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;WRITE SECTOR(S) -CD_5x_WRITE: - EX AF,AF' - IN A,(SLOT3) - EX AF,AF' +ATAPI_5x_WRITE: EX AF,AF' + IN A,(SLOT3) + EX AF,AF' ;[]================================================================[#53] ;Function: Long Write Sectors ; A - Disk @@ -241,7 +244,7 @@ CD_5x_WRITE: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;WRITE SECTOR(S) -CD_5x_LONG_WRITE: +ATAPI_5x_LONG_WRITE: AND A ; PUSH IY @@ -255,7 +258,7 @@ CD_5x_LONG_WRITE: EX AF,AF' CALL RW_ATAPI_SECTORs ; - JP HDD_5x_LONG_READ.shared + JP ATA_5x_LONG_READ.shared ;[]================================================================[#57] ;Function: Detect Disk @@ -263,7 +266,7 @@ CD_5x_LONG_WRITE: ;Return: CF=0 - A=Drive type ; B=MediaParameters byte ; [ ] media change ; CF=1 - drive not present, A=#02 -; CD_5x_DETECT: LD C,IDE.Device.ATAPI +; ATAPI_5x_DETECT: LD C,IDE.Device.ATAPI ; AND %1011'1111 ; .shared: LD D,A ; LD E,C @@ -295,7 +298,7 @@ CD_5x_LONG_WRITE: ; LD A,D ; LD C,E ; CALL SELECT_DRIVE -; CALL CD_CHECK_MEDIA_CHANGED +; CALL ATAPI_CHECK_MEDIA_CHANGED ; JR NC,.exit ; POP BC ; RET @@ -311,8 +314,9 @@ CD_5x_LONG_WRITE: ;Return: CF=0 - A=Drive type ; B=MediaParameters byte ; [ ] media change ; CF=1 - drive not present, A=#02 -CD_5x_DETECT: LD C,IDE.Device.ATAPI - JP HDD_5x_DETECT.shared +ATAPI_5x_DETECT: + LD C,IDE.Device.ATAPI + JP ATA_5x_DETECT.shared ;[]================================================================[#57] ;[]================================================================[#5E] @@ -322,7 +326,7 @@ CD_5x_DETECT: LD C,IDE.Device.ATAPI ; B - SubFunction ;Return: ; -CD_5x_Extended: +ATAPI_5x_Extended: LD C,IDE.Device.ATAPI CALL SELECT_DRIVE RET C @@ -331,7 +335,7 @@ CD_5x_Extended: CP 2 JR C,TRAY_FN ; B = 0 или 1 ; - JR Z,CD_REQUEST_SENSE ; B = 2 + JR Z,ATAPI_REQUEST_SENSE ; B = 2 ; ... ; ... ;LD A,#AA @@ -342,23 +346,24 @@ CD_5x_Extended: ;----------------------------------------------------------------------;!TODO сделать доступной через расширенную функцию API ; вход: DE - адрес для данных -CD_REQUEST_SENSE: +ATAPI_REQUEST_SENSE: LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE JR EXEC_PACKET_COMMAND.start ;----------------------------------------------------------------------; ;[ ] media changed ;----------------------------------------------------------------------; -CD_CHECK_MEDIA_CHANGED: - CALL EXEC_NOP_CMD ;!FIXIT а может и не надо +ATAPI_CHECK_MEDIA_CHANGED: + CALL EXEC_TEST_CMD ;!FIXIT а может и не надо + RET C ; .skip_nop: EXX -; CALL CD_WAITPRT +; CALL ATAPI_WAITPRT ; EXX ; LD A, high IDE.Read.Status ; IN A,(low IDE.Read.Status) ; RRA ; ;RET NC - JR C,.noWait + ;JR C,.noWait ; EXX LD C,SLOT3 @@ -375,12 +380,25 @@ CD_CHECK_MEDIA_CHANGED: RET ; .noWait: EXX - CALL CD_GET_ERROR + ;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 EXX CP BIOS.Error.ATAPI.NoSence - JP Z,CD_MEDIA_CHANGED_ERROR - ;SCF + JP Z,ATAPI_MEDIA_ERROR + ; !FIXIT скорее всего железо тут выдаст всегда Error.ATAPI.NoSence + CP BIOS.Error.ATAPI.NotReady + JP Z,ATAPI_MEDIA_ERROR + CP BIOS.Error.ATAPI.UnitAttention + JP Z,ATAPI_MEDIA_ERROR + ; + SCF RET ;----------------------------------------------------------------------; @@ -420,10 +438,10 @@ EXEC_PACKET_COMMAND: LD A,BIOS.Error.ATAPI.TimeOut SCF RET -; .CMD_ERROR: CALL CD_GET_ERROR +; .CMD_ERROR: CALL ATAPI_GET_ERROR ; OR #70 ; CP BIOS.Error.UnitAttention -; CALL Z,CD_MEDIA_CHANGED_ERROR +; CALL Z,ATAPI_MEDIA_ERROR ; ;LD BC,IDE.Read.Error ;ERROR ; ;IN A,(C) ; ;RRCA @@ -435,7 +453,7 @@ EXEC_PACKET_COMMAND: ; RET ; .start: EXX - CALL CD_WAITPRT + CALL ATAPI_WAITPRT EXX JR NC,.READY ; @@ -447,10 +465,9 @@ EXEC_PACKET_COMMAND: .pause: DJNZ .pause ; EXX - CALL CD_WAITPRT + CALL ATAPI_WAITPRT EXX JR C,.error - ;JR C,CD_CHECK_MEDIA_CHANGED.noWait ; .READY: LD C,SLOT3 IN B,(C) @@ -479,14 +496,13 @@ EXEC_PACKET_COMMAND: LD BC,IDE.Write.Command LD A,IDE.ATAPI.Packet OUT (C),A - CALL CD_WAITPRT + CALL ATAPI_WAITPRT EXX 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 + CALL ATAPI_WAITPRT.Custom EXX JR C,.error_TimeOut ; @@ -523,24 +539,22 @@ EXEC_PACKET_COMMAND: EX AF,AF' ;>-----------> \ ; EXX - CALL CD_WAITPRT + CALL ATAPI_WAITPRT EXX JP C,.error - ; + ; [ ] media change. а надо ли тут? ;!FIXIT лучше блокировать носитель LD A,high IDE.Read.Status IN A,(low IDE.Read.Status) ; - BIT IDE.CtrlBit.Error,A - JP NZ,CD_CHECK_MEDIA_CHANGED.noWait - ; - AND IDE.CtrlByte.DataRequest - RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors - ; - LD A,XH - OUT (SLOT3),A + 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 =======================================; ; + LD A,XH + OUT (SLOT3),A EX DE,HL LD BC,IDE.Read.ByteCountLow IN E,(C) @@ -626,21 +640,21 @@ EXEC_PACKET_COMMAND: ;----------------------------------------------------------------------; -CD_GET_ERROR: LD BC,IDE.Read.Error ;ERROR - IN A,(C) - RRCA - RRCA - RRCA - RRCA - AND #0F - RET +; 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 ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; ; D - MASK, E - PATTERN -CD_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 +ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 .Custom: LD B,100 LD HL,#0000 .LOOP: LD A,high IDE.Read.Status @@ -663,35 +677,35 @@ CD_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 ;----------------------------------------------------------------------; -; CD_TEST: LD HL,ATAPI_CMD_PACKET.NOP +; ATAPI_TEST: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY ; LD DE,0 ; маркер того, что не нужно читать с устройства в ОЗУ ; JP EXEC_PACKET_COMMAND ;----------------------------------------------------------------------; ;----------------------------------------------------------------------; -CD_MEDIA_CHANGED_ERROR: +ATAPI_MEDIA_ERROR: IN A,(SLOT3) PUSH AF LD A,SYS_PAGE OUT (SLOT3),A ; LD DE,SYS_PAGE.SHARED_BUFFER_256b - CALL CD_REQUEST_SENSE + CALL ATAPI_REQUEST_SENSE ; LD A,(SYS_PAGE.SHARED_BUFFER_256b + 2) ; SenceKey. 06 - UNIT ATTENTION CP 2 ; SenceKey. 02 - NOT READY JR Z,.Not_Ready CP 6 - JR NZ,.exit + JR NZ,.unkn_error ; LD A,(SYS_PAGE.SHARED_BUFFER_256b + 12) ; AdditionalSenceKey. #28 CP #28 - JR NZ,.exit + JR NZ,.unkn_error ; LD A,(SYS_PAGE.SHARED_BUFFER_256b + 13) ; AdditionalSenseCodeQualifier. 0 AND A - JR NZ,.exit + JR NZ,.unkn_error ; LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters) OR %0000'0011 @@ -701,6 +715,7 @@ CD_MEDIA_CHANGED_ERROR: LD DE,SYS_PAGE.TMP_BUFFER CALL EXEC_PACKET_COMMAND.start LD HL,#FFFF + LD C,BIOS.Error.ATAPI.MediumError JR C,.No_Media ; LD HL,(SYS_PAGE.TMP_BUFFER) ; media size high @@ -711,70 +726,73 @@ CD_MEDIA_CHANGED_ERROR: LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow+1),L LD HL,(SYS_PAGE.TMP_BUFFER + 6) ; sector size ; + LD C,BIOS.Error.ATAPI.UnitAttention .No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H ;[ ] sector size LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L ; - POP AF - OUT (SLOT3),A - LD A,BIOS.Error.ATAPI.UnitAttention - SCF - RET - ; -.Not_Ready: POP AF - OUT (SLOT3),A - LD A,BIOS.Error.ATAPI.NotReady - SCF - RET - ; .exit: POP AF OUT (SLOT3),A - ; CF=0 - ;AND A + LD A,C + SCF RET + ; +.Not_Ready: LD A,(SYS_PAGE.SHARED_BUFFER_256b + 12) ; AdditionalSenceKey + LD C,BIOS.Error.ATAPI.MediumError ; нет носителя + CP 4 + JR NZ,.exit + ; [ ] !(test for ZIP) + LD A,(SYS_PAGE.SHARED_BUFFER_256b + 13) ; AdditionalSenseCodeQualifier + CP 1 + JR NZ,.exit + ; + ; идёт инициализация + LD C,BIOS.Error.ATAPI.NotReady + JR .exit + ; +.unkn_error: LD C,BIOS.Error.ATAPI.MediumError + JR .exit ;----------------------------------------------------------------------; -; SELECT_DRIVE должен отработать заранее -EXEC_NOP_CMD: LD HL,ATAPI_CMD_PACKET.NOP +; !!! SELECT_DRIVE должен отработать заранее +EXEC_TEST_CMD: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY LD DE,0 ; маркер того, что не нужно читать с устройства в ОЗУ JP EXEC_PACKET_COMMAND.start //////////////////////////////////////////////////////////////////////// ATAPI_CMD_PACKET: -.NOP: DUP 12 - DB #00 - EDUP +.TEST_UNIT_READY: DUP 12 + DB #00 + EDUP ; -.OPEN: DB #1B - DB #00,#00,#00 - DB #02 - DB #00,#00,#00,#00,#00,#00,#00 +.OPEN: DB #1B + DB #00,#00,#00 + DB #02 + DB #00,#00,#00,#00,#00,#00,#00 ; -.CLOSE: DB #1B - DB #00,#00,#00 - DB #03 - DB #00,#00,#00,#00,#00,#00,#00 +.CLOSE: DB #1B + DB #00,#00,#00 + DB #03 + DB #00,#00,#00,#00,#00,#00,#00 ; -.READ: DB #28,#00 - DB #00,#00,#00,#00 ; sector dword - DB #00 - DB #00,#01,#00,#00 ; counter dword - DB #00 +.READ: DB #28,#00 + DB #00,#00,#00,#00 ; sector dword + DB #00 + DB #00,#01,#00,#00 ; counter dword + DB #00 ; -.WRITE: DB #2E,#00 - DB #00,#00,#00,#00 ; sector dword - DB #00 - DB #00,#01,#00,#00 ; counter dword - DB #00 +.WRITE: DB #2E,#00 + DB #00,#00,#00,#00 ; sector dword + DB #00 + DB #00,#01,#00,#00 ; counter dword + DB #00 ; -.READ_CAPACITY_DATA: - DB #25 - BLOCK 11,0 +.READ_CAPACITY_DATA: DB #25 + BLOCK 11,0 ; -.REQUEST_SENSE: - DB #03 - DB #00,#00,#00 - DB MAX_DATA_PACKET_FOR_REQUEST_SENSE - DB #00,#00,#00,#00,#00,#00,#00 +.REQUEST_SENSE: DB #03 + DB #00,#00,#00 + DB MAX_DATA_PACKET_FOR_REQUEST_SENSE + DB #00,#00,#00,#00,#00,#00,#00 ; ATAPI_PACKET: diff --git a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM index 6b17071..e299d8e 100644 --- a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM @@ -78,7 +78,7 @@ WRITE_OUTI_DUPs EQU 32 ; bytes ;[]================================================================[#51] ;Function: Reset drive -HDD_5x_RESET: ; !FIXIT не ресетится? +ATA_5x_RESET: ; !FIXIT не ресетится? ;For non-ATAPI drives, the only method a driver has of resetting a drive ; after a major error is to do a "software reset" on the bus. ; Set bit 2 (SRST, value = 4) in the proper Control Register for the @@ -99,7 +99,7 @@ HDD_5x_RESET: ; !FIXIT ; DE - Cylinders ; IX - Capacity sector in bytes ; B - Flags: MASTER/SLAVE, LBA/CHS -HDD_5x_GET_PAR: +ATA_5x_GET_PAR: LD C,IDE.Device.HDD CALL SELECT_DRIVE RET C @@ -129,7 +129,7 @@ HDD_5x_GET_PAR: ; IX - Capacity sector in bytes ; B - Flags ;Return: None -HDD_5x_SET_PAR: +ATA_5x_SET_PAR: LD C,IDE.Device.HDD CALL SELECT_DRIVE RET C @@ -161,7 +161,7 @@ HDD_5x_SET_PAR: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;READ SECTOR(S) -HDD_5x_READ: +ATA_5x_READ: EX AF,AF' IN A,(SLOT3) EX AF,AF' @@ -177,7 +177,7 @@ HDD_5x_READ: ; DE - Address + (Sector counter * Size sector) ; A' - Last mem page in RAM Block used for readed data ;LONG READ SECTOR(S) -HDD_5x_LONG_READ: +ATA_5x_LONG_READ: PUSH IY SAFE_PORTY_2 PUSH BC @@ -245,7 +245,7 @@ HDD_5x_LONG_READ: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;WRITE SECTOR(S) -HDD_5x_WRITE: +ATA_5x_WRITE: EX AF,AF' IN A,(SLOT3) EX AF,AF' @@ -260,7 +260,7 @@ HDD_5x_WRITE: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) ;WRITE SECTOR(S) -HDD_5x_LONG_WRITE: +ATA_5x_LONG_WRITE: PUSH IY SAFE_PORTY_2 PUSH BC @@ -272,7 +272,7 @@ HDD_5x_LONG_WRITE: EX AF,AF' CALL RW_ATA_SECTORs ; - JP HDD_5x_LONG_READ.shared + JP ATA_5x_LONG_READ.shared /* EX DE,HL JP C,.error @@ -525,7 +525,7 @@ WRITE_ATA_SECTORs: ; B - Sector counter ;Return: None ;VERIFY SECTOR(S) -HDD_5x_VERIFY: PUSH IY +ATA_5x_VERIFY: PUSH IY SAFE_PORTY_2 PUSH IX PUSH HL @@ -671,11 +671,12 @@ WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE ;[]================================================================[#57] ;[x] 18/12/2023. добавление/допиливание API CD-ROM (ATAPI) +; [ ] media change ;Function: Detect Disk ; A - Disk ;Return: CF=0 - A=Drive type -; CF=1 - drive not present, A=#02 -HDD_5x_DETECT: LD C,IDE.Device.HDD +; CF=1 - error +ATA_5x_DETECT: LD C,IDE.Device.HDD .shared: CALL SELECT_DRIVE RET C ; @@ -691,13 +692,13 @@ HDD_5x_DETECT: LD C,IDE.Device.HDD LD A,C CP IDE.Device.ATAPI JR Z,.AtapiCheckMedia - ;!FIXIT AtaCheckMedia - не сделано + ;!FIXIT AtaCheckMedia - не сделано ; [ ] media change AND A RET ; .AtapiCheckMedia: PUSH BC ; B - MediaParameters, C - DriveType - CALL CD_CHECK_MEDIA_CHANGED + CALL ATAPI_CHECK_MEDIA_CHANGED POP BC ; B - MediaParameters, C - DriveType RET C LD A,C diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index f5b06bf..a236a82 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -103,29 +103,29 @@ WAIT: .ERROR EQU #0400 ENDMODULE -WAIT_IDE EQU #0000 -WAIT_SML EQU #1000 -WAIT_ERROR EQU #0400 +; WAIT_IDE EQU #0000 +; WAIT_SML EQU #1000 +; WAIT_ERROR EQU #0400 -M_CYLL EQU #12 -M_CYLH EQU #13 -M_HEAD EQU #14 -M_SECT EQU #15 +; M_CYLL EQU #12 +; M_CYLH EQU #13 +; M_HEAD EQU #14 +; M_SECT EQU #15 -S_CYLL EQU #16 -S_CYLH EQU #17 -S_HEAD EQU #18 -S_SECT EQU #19 +; S_CYLL EQU #16 +; S_CYLH EQU #17 +; S_HEAD EQU #18 +; S_SECT EQU #19 -SM_CYLL EQU #37 -SM_CYLH EQU #38 -SM_HEAD EQU #39 -SM_SECT EQU #3A +; SM_CYLL EQU #37 +; SM_CYLH EQU #38 +; SM_HEAD EQU #39 +; SM_SECT EQU #3A -SS_CYLL EQU #3B -SS_CYLH EQU #3C -SS_HEAD EQU #3D -SS_SECT EQU #3E +; SS_CYLL EQU #3B +; SS_CYLH EQU #3C +; SS_HEAD EQU #3D +; SS_SECT EQU #3E MACRO PAUSE_DJNZ num IF num<255 @@ -318,19 +318,19 @@ AUTODETECTING: CALL DETECTORS.CheckChanel /////////////////////////////////////////////////////////////////////[v] SETUP_FROM_CMOS: LD A,H - LD IX,PRIM_MASTER_CMOS_T + LD IX,PRIM_MASTER_CMOS_TABLE OR A JR Z,.step1 ; - LD IX,PRIM_SLAVE_CMOS_T + LD IX,PRIM_SLAVE_CMOS_TABLE CP 1 JR Z,.step1 ; - LD IX,SEC_MASTER_CMOS_T + LD IX,SEC_MASTER_CMOS_TABLE CP 2 JR Z,.step1 ; - LD IX,SEC_SLAVE_CMOS_T + LD IX,SEC_SLAVE_CMOS_TABLE .step1: LD HL,IDENTIFY_DEVICE_BUFFER LD DE,IDENTIFY_DEVICE_BUFFER+1 LD BC,511 @@ -344,21 +344,21 @@ SETUP_FROM_CMOS: CALL BITS_WAITS.Clear_BUSY JR C,AUTODETECTING.IDE_ABSENT ; -.step2: LD A,(IX+2) ;M_HEAD +.step2: LD A,(IX + IDE_CMOS_TABLE.Heads) CALL READCMS LD (IDENTIFY_DEVICE_BUFFER.NumHeads),A ; - LD A,(IX+1) ;M_CYLH + LD A,(IX + IDE_CMOS_TABLE.CylindersHigh) CALL READCMS PUSH AF ; - LD A,(IX+0) ;M_CYLL + LD A,(IX + IDE_CMOS_TABLE.CylindersLow) CALL READCMS POP HL LD L,A LD (IDENTIFY_DEVICE_BUFFER.NumCylinders),HL ; - LD A,(IX+3) ;M_SECT + LD A,(IX + IDE_CMOS_TABLE.Sectors) CALL READCMS LD (IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack),A ; @@ -445,14 +445,30 @@ IDESPEC: IN A,(SLOT3) OR (HL) LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A ; на всякий случай - LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE - LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; просто нужен был буфер + LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),%0000'0001 + ;!FIXIT сделать цикл со счётчиком +.get_error_loop: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY CALL EXEC_PACKET_COMMAND.start + JR NC,.s_size + ; + CP BIOS.Error.ATAPI.NotReady + JR Z,.get_error_loop + ; + RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media + CP BIOS.Error.ATAPI.UnitAttention + JR Z,IDESPEC.END + ; любая непонятная ошибка - нет носителя + SCF + JR .set_sector + ; + ; LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE + ; LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; просто нужен был буфер + ; CALL EXEC_PACKET_COMMAND.start ; [ ] sector size ATAPI - 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 - LD HL,#FFFF +.set_sector: LD HL,#FFFF JR C,.No_Media ; LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224) ; media size high @@ -465,7 +481,7 @@ IDESPEC: IN A,(SLOT3) ; .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.MediaParameters),%0000'0001 ; !HARDCODE ATAPI пока всегда removable + ;LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),%0000'0001 ; !HARDCODE ATAPI пока всегда removable ; JR IDESPEC.END /////////////////////////////////////////////////////////////////////[^] @@ -624,37 +640,37 @@ SaveToCMOS: EX AF,AF' ;LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) AND %0001'0001 - LD IX,PRIM_MASTER_CMOS_T + LD IX,PRIM_MASTER_CMOS_TABLE JR Z,.save_to_cmos ; DEC A - LD IX,SEC_MASTER_CMOS_T + LD IX,SEC_MASTER_CMOS_TABLE JR Z,.save_to_cmos ; CP %0001'0000 - LD IX,SEC_SLAVE_CMOS_T + LD IX,SEC_SLAVE_CMOS_TABLE JR Z,.save_to_cmos ; - LD IX,PRIM_SLAVE_CMOS_T + LD IX,PRIM_SLAVE_CMOS_TABLE .save_to_cmos: LD HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders) LD B,L - LD A,(IX+0) - CALL WRITCMS ; Cylinder low + LD A,(IX + IDE_CMOS_TABLE.CylindersLow) + CALL WRITCMS LD B,H - LD A,(IX+1) - CALL WRITCMS ; Cylinder high + LD A,(IX + IDE_CMOS_TABLE.CylindersHigh) + CALL WRITCMS LD A,(IDENTIFY_DEVICE_BUFFER.NumHeads) LD B,A - LD A,(IX+2) + LD A,(IX + IDE_CMOS_TABLE.Heads) CALL WRITCMS ; Heads LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack) LD B,A - LD A,(IX+3) - JP WRITCMS ; Heads + LD A,(IX + IDE_CMOS_TABLE.Sectors) + JP WRITCMS /////////////////////////////////////////////////////////////////////[^] @@ -900,16 +916,32 @@ SetUP_CHANELS: ; JP IDE_CMD /////////////////////////////////////////////////////////////////////[^] - -;!FIXIT CMOS переделать под названия ячеек из SP2000.inc -PRIM_MASTER_CMOS_T: - DB M_CYLL,M_CYLH,M_HEAD,M_SECT -PRIM_SLAVE_CMOS_T: - DB S_CYLL,S_CYLH,S_HEAD,S_SECT -SEC_MASTER_CMOS_T: - DB SM_CYLL,SM_CYLH,SM_HEAD,SM_SECT -SEC_SLAVE_CMOS_T: - DB SS_CYLL,SS_CYLH,SS_HEAD,SS_SECT +IDE_CMOS_TABLE: +.CylindersLow EQU 0 +.CylindersHigh EQU 1 +.Heads EQU 2 +.Sectors EQU 3 +; +PRIM_MASTER_CMOS_TABLE: + DB CMOS_CELL.IDE_Setup.PriMaster.CylindersLow + DB CMOS_CELL.IDE_Setup.PriMaster.CylindersHigh + DB CMOS_CELL.IDE_Setup.PriMaster.Heads + DB CMOS_CELL.IDE_Setup.PriMaster.Sectros +PRIM_SLAVE_CMOS_TABLE: + DB CMOS_CELL.IDE_Setup.PriSlave.CylindersLow + DB CMOS_CELL.IDE_Setup.PriSlave.CylindersHigh + DB CMOS_CELL.IDE_Setup.PriSlave.Heads + DB CMOS_CELL.IDE_Setup.PriSlave.Sectros +SEC_MASTER_CMOS_TABLE: + DB CMOS_CELL.IDE_Setup.SecMaster.CylindersLow + DB CMOS_CELL.IDE_Setup.SecMaster.CylindersHigh + DB CMOS_CELL.IDE_Setup.SecMaster.Heads + DB CMOS_CELL.IDE_Setup.SecMaster.Sectros +SEC_SLAVE_CMOS_TABLE: + DB CMOS_CELL.IDE_Setup.SecSlave.CylindersLow + DB CMOS_CELL.IDE_Setup.SecSlave.CylindersHigh + DB CMOS_CELL.IDE_Setup.SecSlave.Heads + DB CMOS_CELL.IDE_Setup.SecSlave.Sectros SKIP: BYTE #FF