From 0749fd92b53fe082cbdc64c6a7576dd12add1ac2 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 26 Jan 2025 22:53:18 +1000 Subject: [PATCH] testing --- Shared_Includes | 2 +- src/bios/exp/BIOS_FUNC.asm | 36 +-- src/bios/exp/EXTENDED/FDD_DRIVER_2.asm | 4 +- src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM | 313 +++++++++++--------- src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM | 43 ++- src/bios/exp/EXTENDED/IDE/shared.asm | 81 ++--- src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm | 4 +- src/bios/rom/SETUP/AUTOIDE.asm | 22 +- 8 files changed, 299 insertions(+), 206 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 857938d..b3224fc 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 857938d1dbf3b332a5e9e8ccabfee531eb3848fa +Subproject commit b3224fc3afac71c6b1d461ff54049e58657bbe5a diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index 2934024..8c6fb14 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -480,8 +480,8 @@ TAB_5xFNS: DB low FDD_5x_READ ;#55 DB low FDD_5x_WRITE ;#56 DB low FDD_5x_DETECT ;#57 - DB low FDD_5x_GETMED ;#58 - DB low FDD_5x_SETMED ;#59 + DB low FDD_5x_GET_PAR ;#58 + DB low FDD_5x_SET_PAR ;#59 DB low DRV_VERSION ;#5A - Дубль. На эту функцию прыгает из основного обработчика DB low FN_RESERVED_5x ;#5B - Дубль. На эту функцию прыгает из основного обработчика @@ -506,8 +506,8 @@ TAB_5xFNS: DB low RMD_5x_READ DB low RMD_5x_WRITE DB low FN_ABSENT_5x - DB low RMD_5x_GETMED - DB low RMD_5x_SETMED + DB low RMD_5x_GET_PAR + DB low RMD_5x_SET_PAR DB low DRV_VERSION DB low FN_RESERVED_5x @@ -531,8 +531,8 @@ TAB_5xFNS: DB low HDD_5x_READ DB low HDD_5x_WRITE DB low HDD_5x_DETECT - DB low HDD_5x_GETMED - DB low HDD_5x_SETMED + DB low HDD_5x_GET_PAR + DB low HDD_5x_SET_PAR DB low DRV_VERSION DB low FN_RESERVED_5x @@ -556,7 +556,7 @@ TAB_5xFNS: DB low CD_5x_READ DB low CD_5x_WRITE ; [ ] new DB low CD_5x_DETECT - DB low CD_5x_GETMED ; [ ] new + DB low CD_5x_GET_PAR ; [ ] new DB low FN_ABSENT_5x ; SETMED DB low DRV_VERSION @@ -583,8 +583,8 @@ TAB_5xFNS: DB high FDD_5x_READ ;#55 DB high FDD_5x_WRITE ;#56 DB high FDD_5x_DETECT ;#57 - DB high FDD_5x_GETMED ;#58 - DB high FDD_5x_SETMED ;#59 + DB high FDD_5x_GET_PAR ;#58 + DB high FDD_5x_SET_PAR ;#59 DB high DRV_VERSION ;#5A - Дубль. На эту функцию прыгает из основного обработчика DB high FN_RESERVED_5x ;#5B - Дубль. На эту функцию прыгает из основного обработчика @@ -609,8 +609,8 @@ TAB_5xFNS: DB high RMD_5x_READ DB high RMD_5x_WRITE DB high FN_ABSENT_5x - DB high RMD_5x_GETMED - DB high RMD_5x_SETMED + DB high RMD_5x_GET_PAR + DB high RMD_5x_SET_PAR DB high DRV_VERSION DB high FN_RESERVED_5x @@ -634,8 +634,8 @@ TAB_5xFNS: DB high HDD_5x_READ DB high HDD_5x_WRITE DB high HDD_5x_DETECT - DB high HDD_5x_GETMED - DB high HDD_5x_SETMED + DB high HDD_5x_GET_PAR + DB high HDD_5x_SET_PAR DB high DRV_VERSION DB high FN_RESERVED_5x @@ -659,7 +659,7 @@ TAB_5xFNS: DB high CD_5x_READ DB high CD_5x_WRITE ; WRITE ; [ ] new DB high CD_5x_DETECT - DB high CD_5x_GETMED + DB high CD_5x_GET_PAR DB high FN_ABSENT_5x ; SETMED DB high DRV_VERSION @@ -695,8 +695,8 @@ EXP_FNS_RST18: ; HDD_5x_READ ; HDD_5x_WRITE ; HDD_5x_DETECT - ; HDD_5x_GETMED - ; HDD_5x_SETMED + ; HDD_5x_GET_PAR + ; HDD_5x_SET_PAR ; DRV_VERSION ; FN_RESERVED_5x ; FN_RESERVED_5x @@ -722,10 +722,10 @@ FN_5x_Parser_6: ; HDD_5x_WRITE FN_5x_Parser_7: ; HDD_5x_DETECT LD C,#07 JP FN_5x_Parser -FN_5x_Parser_8: ; HDD_5x_GETMED +FN_5x_Parser_8: ; HDD_5x_GET_PAR LD C,#08 JP FN_5x_Parser -FN_5x_Parser_9: ; HDD_5x_SETMED +FN_5x_Parser_9: ; HDD_5x_SET_PAR LD C,#09 JP FN_5x_Parser FN_5x_Parser_E: ; DRV_EXTENDED diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm index 718ba40..7a56109 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm @@ -23,7 +23,7 @@ ; D7 - "1" - High Density, "0" - Double Density ;[]===========================================================[] ;!FIXIT всегда идет работа с данными для диска А -FDD_5x_GETMED: +FDD_5x_GET_PAR: ;!TEST FDD 720/1440 IF FDD_NormalCount LD IY,FDD_INIT_TABLE.FDD_0 @@ -71,7 +71,7 @@ FDD_5x_GETMED: ; D7 - "1" - High Density, "0" - Double Density ;Return: None ;[]===========================================================[] -FDD_5x_SETMED: ;!TEST FDD 720/1440 +FDD_5x_SET_PAR: ;!TEST FDD 720/1440 IF FDD_NormalCount LD IY,FDD_INIT_TABLE.FDD_0 DEC A diff --git a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM index 3ca6ae8..8949812 100644 --- a/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM @@ -28,14 +28,12 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI RET C LD B,50 .loop: PUSH BC - LD HL,ATAPI_CMD_PACKET.NOP - LD DE,0 ; маркер того, что не нужно читать с устройства в ОЗУ - CALL EXEC_PACKET_COMMAND + CALL EXEC_NOP_CMD ;!FIXIT ;[ ] sector size. сделать реинит HDD_INIT_TABLE POP BC RET NC ; - CALL CD_CHECK_MEDIA_CHANGED + CALL CD_CHECK_MEDIA_CHANGED.noWait RET C ; EI @@ -49,17 +47,20 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI ;Function: Get Current Media Parameters ; A - Disk ;Return: -; H - Heads -; L - Sectors per cylinder -; DE - Cylinders +; H - Heads ; [ ] For ATAPI HL:DE - media size in sectors +; L - Sectors per cylinder ; +; 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 +; [ ] A - HDD_INIT_TABLE.MediaParameters +; IF media changed +; [ ] CF' = 1, A' = error number UnitAttention +CD_5x_GET_PAR: LD C,IDE.Device.ATAPI CALL SELECT_DRIVE RET C ; IN A,(SLOT3) + AND A EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A @@ -68,31 +69,36 @@ CD_5x_GETMED: LD C,IDE.Device.ATAPI CALL CD_CHECK_MEDIA_CHANGED JR NC,.get_data ; - ; CP BIOS.Error.ATAPI.UnitAttention - ; JR NZ,.get_data - ; - LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia) - AND %1111'1101 - LD (IY + IDE.HDD_INIT_TABLE.RemovableMedia),A + CP BIOS.Error.ATAPI.NotReady + ;LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters) + SCF + JR NZ,.UnitAttention + LD HL,#FFFF + LD D,H + LD E,L + RET ; +.UnitAttention: RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media + EX AF,AF' + SCF + EX AF,AF' .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 A,(IY+IDE.HDD_INIT_TABLE.RemovableMedia) + LD A,(IY+IDE.HDD_INIT_TABLE.MediaParameters) 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 + ; [ ] sector size + LD E,(IY+IDE.HDD_INIT_TABLE.SectorSize) + LD D,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1) LD XL,E LD XH,D - ; - LD HL,0 - LD D,H - LD E,H + ; [ ] media size + LD L,(IY+IDE.HDD_INIT_TABLE.MediaSizeHigh) + LD H,(IY+IDE.HDD_INIT_TABLE.MediaSizeHigh+1) + LD E,(IY+IDE.HDD_INIT_TABLE.MediaSizeLow) + LD D,(IY+IDE.HDD_INIT_TABLE.MediaSizeLow+1) + ; EX AF,AF' - OUT (SLOT3),A + OUT (SLOT3),A + LD A,BIOS.Error.ATAPI.UnitAttention ; если CF, то номер ошибки EX AF,AF RET ;[]================================================================[#58] @@ -165,7 +171,7 @@ RW_ATAPI_SECTORs: LD A,SYS_PAGE OUT (C),A ; [ ] media change - LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia) + LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters) AND %0000'0010 JR NZ,.error_media ; @@ -196,7 +202,7 @@ RW_ATAPI_SECTORs: ; POP AF ; OUT (SLOT3),A LD HL,RAM_ATAPI_RW_CMD - CALL EXEC_PACKET_COMMAND + CALL EXEC_PACKET_COMMAND.start ; .exit: POP BC ;LD C,SLOT3 @@ -255,38 +261,60 @@ CD_5x_LONG_WRITE: ;Function: Detect Disk ; A - Disk ;Return: CF=0 - A=Drive type -; B=RemovableMedia byte ; [ ] +; B=MediaParameters byte ; [ ] media change +; CF=1 - drive not present, A=#02 +; CD_5x_DETECT: LD C,IDE.Device.ATAPI +; AND %1011'1111 +; .shared: LD D,A +; LD E,C +; PUSH DE +; CALL DRV_DETECT +; POP DE +; RET C +; ; +; PUSH AF +; LD C,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 +; LD B,A +; AND %0000'0011 ;[ ] media change переделать логику тут и в ДСС? ; !FIXIT +; JR NZ,.error +; ; +; .exit: POP AF +; RET +; ; +; .error: AND %0000'0010 +; JR NZ,.UnitAttention +; ; +; LD A,D +; LD C,E +; CALL SELECT_DRIVE +; CALL CD_CHECK_MEDIA_CHANGED +; JR NC,.exit +; POP BC +; RET +; ; +; .UnitAttention: POP AF +; LD A,BIOS.Error.ATAPI.UnitAttention +; SCF +; RET +;[]================================================================[#57] +;[]================================================================[#57] +;Function: Detect Disk +; A - Disk +;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 - AND %1011'1111 -.shared: CALL DRV_DETECT - RET C - ; - PUSH AF - LD C,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 - LD B,A - AND %0000'0010 - JR Z,.exit - ; - POP AF - LD A,BIOS.Error.ATAPI.UnitAttention - SCF - RET - ; -.exit: POP AF - RET - + JP HDD_5x_DETECT.shared ;[]================================================================[#57] - ;[]================================================================[#5E] ; [ ] ;Function: Extended @@ -316,17 +344,20 @@ CD_5x_Extended: ; вход: DE - адрес для данных CD_REQUEST_SENSE: LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE - JR EXEC_PACKET_COMMAND + JR EXEC_PACKET_COMMAND.start ;----------------------------------------------------------------------; ;[ ] media changed ;----------------------------------------------------------------------; CD_CHECK_MEDIA_CHANGED: - EXX - LD DE,256*(IDE.CtrlByte.Error) + 0 - CALL CD_WAITPRT.Custom - EXX - ;RET NC + CALL EXEC_NOP_CMD ;!FIXIT а может и не надо +; .skip_nop: EXX +; CALL CD_WAITPRT +; EXX +; LD A, high IDE.Read.Status +; IN A,(low IDE.Read.Status) +; RRA +; ;RET NC JR C,.noWait ; EXX @@ -335,7 +366,7 @@ CD_CHECK_MEDIA_CHANGED: LD A,SYS_PAGE OUT (C),A ; - LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia) + LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters) OUT (C),B EXX RRA @@ -357,7 +388,7 @@ CD_CHECK_MEDIA_CHANGED: TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE LD DE,0 ; маркер того, что не нужно читать с устройства в ОЗУ DEC A - JR Z,EXEC_PACKET_COMMAND + JR Z,EXEC_PACKET_COMMAND.start LD HL,ATAPI_CMD_PACKET.OPEN ;JR EXEC_PACKET_COMMAND @@ -376,20 +407,38 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE ; #0B - ABORTED COMMAND ; #80 - TIME OUT EXEC_PACKET_COMMAND: - EXX +.error: CP #FF +.error_fail: SCF + LD A,BIOS.Error.Failure + RET Z + ; + LD A,BIOS.Error.Busy + RET + ; +.error_TimeOut: CP #FF + JR Z,.error_fail + LD A,BIOS.Error.ATAPI.TimeOut + SCF + RET +; .CMD_ERROR: CALL CD_GET_ERROR +; OR #70 +; CP BIOS.Error.UnitAttention +; CALL Z,CD_MEDIA_CHANGED_ERROR +; ;LD BC,IDE.Read.Error ;ERROR +; ;IN A,(C) +; ;RRCA +; ;RRCA +; ;RRCA +; ;RRCA +; ;AND #0F +; SCF +; RET + ; +.start: EXX CALL CD_WAITPRT EXX JR NC,.READY ; - ; [ ] media changed - ; CP +(BIOS.Error.UnitAttention & #0F) - ; JR NZ,.reset - ; ; - ; CALL CD_MEDIA_CHANGED_ERROR - ; OR #70 ; error prefix for ATAPI in BIOS - ; SCF - ; RET - ; .reset: LD BC,IDE.Write.Command LD A,IDE.ATAPI.Reset OUT (C),A @@ -420,8 +469,6 @@ EXEC_PACKET_COMMAND: ; XOR A EXX - ;OUT (C),A - ;XOR A LD BC,IDE.Write.Features OUT (C),A LD DE,MAX_ATAPI_SEC_SIZE ;SIZE BLOCK ;!HARDCODE доставать из переменной какой-нибудь @@ -441,37 +488,8 @@ EXEC_PACKET_COMMAND: LD DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest CALL CD_WAITPRT.Custom EXX - JR NC,.YEP_DRQ + JR C,.error_TimeOut ; - 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 -; CALL Z,CD_MEDIA_CHANGED_ERROR -; ;LD BC,IDE.Read.Error ;ERROR -; ;IN A,(C) -; ;RRCA -; ;RRCA -; ;RRCA -; ;RRCA -; ;AND #0F -; ;!FIXIT ; [ ] sector size. make REQUEST SENSE if A=6 -; SCF -; RET ; EXEC ATAPI PACKET COMMAND .YEP_DRQ: LD C,SLOT3 IN B,(C) @@ -507,10 +525,11 @@ EXEC_PACKET_COMMAND: EXX CALL CD_WAITPRT EXX - JR C,.error + JP C,.error + ; + LD A,high IDE.Read.Status + IN A,(low IDE.Read.Status) ; - LD BC,IDE.Read.Status - IN A,(C) BIT IDE.CtrlBit.Error,A JP NZ,CD_CHECK_MEDIA_CHANGED.noWait ; @@ -525,23 +544,35 @@ EXEC_PACKET_COMMAND: EX DE,HL LD BC,IDE.Read.ByteCountLow IN E,(C) - LD BC,IDE.Read.ByteCountHigh + INC C ;LD BC,IDE.Read.ByteCountHigh IN D,(C) ;TRANSFER BLOCK SIZE + ; LD A,D OR E RET Z ;BLOCK = 0 ; + ; уменьшаем счётчик загружаемых байтов в 2 раза. Читаем по 2 байта + SRL D + RR E + ; LD BC,IDE.Read.InterruptReason IN A,(C) AND IDE.InterruptReasonByte.IO LD BC,IDE.Read.Data JR Z,.WRITE_DATA - ; ;READ + ; проверка на тупость кодера + ; CF=0 + ; ADC HL,DE + ; JR Z,.good_buffer + ; JR C,.error_buffer + ; +; .good_buffer: AND A +; SBC HL,DE + .read_loop: INI INI DEC DE - DEC DE LD A,D OR E JR NZ,.read_loop @@ -566,19 +597,20 @@ EXEC_PACKET_COMMAND: EX AF,AF' ;<-----------< / OUT (SLOT3),A JR .AP_LOOP - ; ; ;WRITE .WRITE_DATA: INC B ; LD BC,IDE.Write.Data .write_loop: OUTI OUTI DEC DE - DEC DE LD A,D OR E JR NZ,.write_loop JR .return_rw - -;.NULL: LD BC,IDE.Read.Data + ; +; !TODO холостое чтение +; .error_buffer: AND A +; SBC HL,DE +;.NULL: ;.RD_N_CD: IN A,(C) ; DEC B ; IN A,(C) @@ -647,7 +679,9 @@ CD_MEDIA_CHANGED_ERROR: LD DE,SYS_PAGE.SHARED_BUFFER_256b CALL CD_REQUEST_SENSE ; - LD A,(SYS_PAGE.SHARED_BUFFER_256b + 2) ; SenceKey. 06 + 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 ; @@ -659,17 +693,23 @@ CD_MEDIA_CHANGED_ERROR: AND A JR NZ,.exit ; - LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia) + LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters) OR %0000'0011 - LD (IY + IDE.HDD_INIT_TABLE.RemovableMedia),A + 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 + CALL EXEC_PACKET_COMMAND.start LD HL,#FFFF JR C,.No_Media ; - LD HL,(SYS_PAGE.TMP_BUFFER + 6) ; sector size (high byte, low byte) + LD HL,(SYS_PAGE.TMP_BUFFER) ; media size high + LD (IY+IDE.HDD_INIT_TABLE.MediaSizeHigh),H + LD (IY+IDE.HDD_INIT_TABLE.MediaSizeHigh+1),L + LD HL,(SYS_PAGE.TMP_BUFFER + 2) ; media size low + LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow),H + LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow+1),L + LD HL,(SYS_PAGE.TMP_BUFFER + 6) ; sector size ; .No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H ;[ ] sector size LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L @@ -680,6 +720,12 @@ CD_MEDIA_CHANGED_ERROR: 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 @@ -687,7 +733,10 @@ CD_MEDIA_CHANGED_ERROR: RET ;----------------------------------------------------------------------; - +; SELECT_DRIVE должен отработать заранее +EXEC_NOP_CMD: LD HL,ATAPI_CMD_PACKET.NOP + LD DE,0 ; маркер того, что не нужно читать с устройства в ОЗУ + JP EXEC_PACKET_COMMAND.start //////////////////////////////////////////////////////////////////////// ATAPI_CMD_PACKET: @@ -734,17 +783,17 @@ ATAPI_PACKET: //////////////////////////////////////////////////////////////////////// ; ; E - Second * 10 -; PAUSE LD HL,#0000 +; PAUSE LD HL,#0000 ; PAUSE1 DEC L -; JR NZ,PAUSE1 -; DEC H -; JR NZ,PAUSE1 -; DEC E -; JR NZ,PAUSE1 -; RET +; JR NZ,PAUSE1 +; DEC H +; JR NZ,PAUSE1 +; DEC E +; JR NZ,PAUSE1 +; RET ; /* -Если ловится ошибка media changed, то биос должен выставлять в HDD_INIT_TABLE.RemovableMedia = 3 +Если ловится ошибка media changed, то биос должен выставлять в HDD_INIT_TABLE.MediaParameters = 3 и затирать FF SectorSize. Дос после получения такой ошибки должен вызывать BIOS.DRV_DETECT и если всё ОК, то ReScanDRV */ \ No newline at end of file diff --git a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM index 1f683bb..6b17071 100644 --- a/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/ATA_DRV.ASM @@ -99,7 +99,7 @@ HDD_5x_RESET: ; !FIXIT ; DE - Cylinders ; IX - Capacity sector in bytes ; B - Flags: MASTER/SLAVE, LBA/CHS -HDD_5x_GETMED: +HDD_5x_GET_PAR: LD C,IDE.Device.HDD CALL SELECT_DRIVE RET C @@ -107,13 +107,13 @@ HDD_5x_GETMED: EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD A,(IY+IDE.HDD_INIT_TABLE.RemovableMedia) + LD A,(IY+IDE.HDD_INIT_TABLE.MediaParameters) 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 IX,512 ;!HARDCODE sector size + LD IX,512 ;!HARDCODE ; [ ] sector size EX AF,AF' OUT (SLOT3),A EX AF,AF' @@ -129,7 +129,7 @@ HDD_5x_GETMED: ; IX - Capacity sector in bytes ; B - Flags ;Return: None -HDD_5x_SETMED: +HDD_5x_SET_PAR: LD C,IDE.Device.HDD CALL SELECT_DRIVE RET C @@ -143,6 +143,7 @@ HDD_5x_SETMED: LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),D LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),B ;!TODO ; [ ] sector size + ;!TODO ; [ ] UnitAttention EX AF,AF' OUT (SLOT3),A ;EX AF,AF' @@ -674,7 +675,35 @@ WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE ; A - Disk ;Return: CF=0 - A=Drive type ; CF=1 - drive not present, A=#02 -HDD_5x_DETECT: - LD C,IDE.Device.HDD - JP CD_5x_DETECT.shared +HDD_5x_DETECT: LD C,IDE.Device.HDD +.shared: CALL SELECT_DRIVE + RET C + ; + LD B,A + AND %0000'0011 ;[ ] media change переделать логику тут и в ДСС? ; !FIXIT + JR NZ,.notZero + LD A,C + RET + ; +.notZero: AND %0000'0010 + JR NZ,.UnitAttention + ; C = DriveType + LD A,C + CP IDE.Device.ATAPI + JR Z,.AtapiCheckMedia + ;!FIXIT AtaCheckMedia - не сделано + AND A + RET + ; +.AtapiCheckMedia: + PUSH BC ; B - MediaParameters, C - DriveType + CALL CD_CHECK_MEDIA_CHANGED + POP BC ; B - MediaParameters, C - DriveType + RET C + LD A,C + RET + ; +.UnitAttention: LD A,BIOS.Error.ATAPI.UnitAttention + SCF + RET ;[]================================================================[#57] \ No newline at end of file diff --git a/src/bios/exp/EXTENDED/IDE/shared.asm b/src/bios/exp/EXTENDED/IDE/shared.asm index 9b79eef..065fd8c 100644 --- a/src/bios/exp/EXTENDED/IDE/shared.asm +++ b/src/bios/exp/EXTENDED/IDE/shared.asm @@ -1,6 +1,7 @@ ;[x] 18/12/2023. добавление/допиливание API CD-ROM (ATAPI) ;======================================================================= -; Вход: A - номер устройства +; Вход: A - номер устройства, C - DriveType +; Выход: A - MediaParameters, C - DriveType SELECT_DRIVE: AND #0F LD IY,IDE.INIT_TBL_IDE0 @@ -27,30 +28,33 @@ SELECT_DRIVE: LD A,SYS_PAGE OUT (SLOT3),A ; - LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) - AND 1 - LD A,IDE.Chanel.Secondary - JR NZ,.device - LD A,IDE.Chanel.Primary -.device: - OUT (IDE.Chanel.Set),A ;R02 - LD C,(IY+IDE.HDD_INIT_TABLE.DriveType) - LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) + LD H,(IY + IDE.HDD_INIT_TABLE.MediaParameters) + LD C,(IY + IDE.HDD_INIT_TABLE.DriveType) + LD B,(IY + IDE.HDD_INIT_TABLE.DRV_Flags) POP AF OUT (SLOT3),A ;возврат страницы ; LD A,C EXX + ; CP C + ; EXX SCF LD A,BIOS.Error.BadNumber RET NZ ; + LD A,B + RRA + LD A,IDE.Chanel.Secondary + JR C,.device + LD A,IDE.Chanel.Primary +.device: OUT (IDE.Chanel.Set),A ;R02 LD A,B AND #F0 LD BC,IDE.Write.DeviceHead OUT (C),A + LD A,H EXX RET ; @@ -65,32 +69,33 @@ SELECT_DRIVE: ;Function: Detect Disk ; A - Disk ; С - Type -;Return: CF=0 - A=Drive type +;Return: CF=0 - A=Drive type, H=MediaParameters ; CF=1 - drive not present, A=#02 -DRV_DETECT: CP #84 ;!HARDCODE max IDE drives (#80,#81,#82,#83) - CCF - JR C,.error - ; - LD HL,IDE.INIT_TBL_IDE0.DriveType - AND 3 - JR Z,.get_param - LD HL,IDE.INIT_TBL_IDE1.DriveType - DEC A - JR Z,.get_param - LD HL,IDE.INIT_TBL_IDE2.DriveType - DEC A - JR Z,.get_param - LD HL,IDE.INIT_TBL_IDE3.DriveType -.get_param: IN A,(SLOT3) - LD B,A - LD A,SYS_PAGE - OUT (SLOT3),A - ; - LD A,(HL) - CP C ; compare Type - LD C,SLOT3 - OUT (C),B - RET Z - SCF -.error: LD A,BIOS.Error.BadNumber - RET \ No newline at end of file +;DRV_DETECT: CP #84 ;!HARDCODE max IDE drives (#80,#81,#82,#83) +; CCF +; JR C,.error +; ; +; LD IX,IDE.INIT_TBL_IDE0 +; AND 3 +; JR Z,.get_param +; LD IX,IDE.INIT_TBL_IDE1 +; DEC A +; JR Z,.get_param +; LD IX,IDE.INIT_TBL_IDE2 +; DEC A +; JR Z,.get_param +; LD IX,IDE.INIT_TBL_IDE3 +; .get_param: IN A,(SLOT3) +; LD B,A +; LD A,SYS_PAGE +; OUT (SLOT3),A +; ; +; LD H,(IX + IDE.HDD_INIT_TABLE.MediaParameters) +; LD A,(IX + IDE.HDD_INIT_TABLE.DriveType) +; CP C ; compare Type +; LD C,SLOT3 +; OUT (C),B +; RET Z +; SCF +; .error: LD A,BIOS.Error.BadNumber +; RET \ No newline at end of file diff --git a/src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm b/src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm index a2cb99e..099bda9 100644 --- a/src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm +++ b/src/bios/exp/EXTENDED/RAM_DISK_DRIVER_1.asm @@ -12,7 +12,7 @@ ;Return: None ;[]===========================================================[] ;!FIXIT -RMD_5x_SETMED: +RMD_5x_SET_PAR: and a ret ; A - Disk @@ -35,7 +35,7 @@ RMD_5x_SETMED: ; IX - Capacity sector in bytes ; B - Flags: ramblock ID ;[]===========================================================[] -RMD_5x_GETMED: AND #0F +RMD_5x_GET_PAR: AND #0F CALL GET_RAMD_ST ; получение идентификатора блока RET C SCF diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index f43d8f4..f5b06bf 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -406,7 +406,7 @@ IDESPEC: IN A,(SLOT3) LD A,(IDENTIFY_DEVICE_BUFFER.GeneralConfiguration) RLCA AND %0000'0001 - LD (IY+IDE.HDD_INIT_TABLE.RemovableMedia),A + LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),A ; LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack) LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A @@ -444,18 +444,28 @@ IDESPEC: IN A,(SLOT3) LD HL,ICHANEL OR (HL) LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A - ; + ; на всякий случай + 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 - LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; просто нужен был буфер на 8 байтов - CALL EXEC_PACKET_COMMAND + LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; просто нужен был буфер + CALL EXEC_PACKET_COMMAND.start LD HL,#FFFF JR C,.No_Media ; - LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 6) ; sector size high + LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224) ; media size high + LD (IY+IDE.HDD_INIT_TABLE.MediaSizeHigh),H + LD (IY+IDE.HDD_INIT_TABLE.MediaSizeHigh+1),L + LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 2) ; media size low + LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow),H + LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow+1),L + LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 6) ; sector size + ; .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 + LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),%0000'0001 ; !HARDCODE ATAPI пока всегда removable ; JR IDESPEC.END /////////////////////////////////////////////////////////////////////[^]