diff --git a/Shared_Includes b/Shared_Includes index f112b13..226dbc1 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit f112b1359045d7fe7aa47f843011fddc5e03eba2 +Subproject commit 226dbc13e8cacb202848245b7f11de3df2f0cbd7 diff --git a/src/bios/exp/BIOS_FUNC.asm b/src/bios/exp/BIOS_FUNC.asm index 3d7726d..cb4241c 100644 --- a/src/bios/exp/BIOS_FUNC.asm +++ b/src/bios/exp/BIOS_FUNC.asm @@ -92,11 +92,11 @@ TAB_FNS: DB low FN_5x_Parser_8 ;#58 - Get Media parameters DB low FN_5x_Parser_9 ;#59 - Set Media parameters - DB low DRV_VERSION ;#5A - Version number - DB low FN_RESERVED_5x ;#5B - DB low FN_RESERVED_5x ;#5C - DB low FN_RESERVED_5x ;#5D - DB low FN_RESERVED_5x ;#5E + DB low DRV_VERSION ;#5A - Version number + DB low FN_RESERVED_5x ;#5B + DB low FN_RESERVED_5x ;#5C + DB low FN_RESERVED_5x ;#5D + DB low FN_5x_Parser_E ;#5E DB low DRV_LIST ;#5F ;-------------- @@ -288,7 +288,7 @@ TAB_FNS: DB high FN_RESERVED_5x DB high FN_RESERVED_5x DB high FN_RESERVED_5x - DB high FN_RESERVED_5x + DB high FN_5x_Parser_E DB high DRV_LIST ;-------------- @@ -434,6 +434,27 @@ TAB_FNS: DB high REINIT DB high FN_RESERVED DB high FN_VERSION +//////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////// +; +; ,----, ,----,. +; ,/ .`| ,' ,' | +; ,` .' : ,--, ,' .' | +; ; ; / ,---, ,--.'| ,----.' .' +; .'___,/ ,' ,---.'| | | : | | .' +; | : | | | : : : ' : : |--, ,--, ,--, +; ; |.'; ; ,--.--. : : : | ' | ,---. : | ;.' \|'. \/ .`| +; `----' | | / \ : |,-.' | | / \ | | |' \/ / ; +; ' : ;.--. .-. || : ' || | : / / | `----'.'\ ; \ \.' / +; | | ' \__\/: . .| | / :' : |__ . ' / | __ \ . | \ ; ; +; ' : | ," .--.; |' : |: || | '.'|' ; /| / /\/ / : / \ \ \ +; ; |.' / / ,. || | '/ :; : ;' | / | / ,,/ ',- ./__; ; \ +; '---' ; : .' \ : || , / | : | \ ''\ ;| :/\ \ ; +; | , .-./ \ / ---`-' \ \ / \ \ .' `---' `--` +; `--`---' `-'----' `----' `--`-,-' +//////////////////////////////////////////////////////////////////////////////////////// _mInfoALIGN 256,0 @@ -451,11 +472,11 @@ TAB_5xFNS: ; --< LOW PART >-- ;-------------------------------------------------------------[ FDD #0 ] ; - DB low FN_RESERVED_5x ;#50 - Дубль. На эту функцию прыгает из основного обработчика + DB low FN_RESERVED_5x ;#50 - Дубль. На эту функцию прыгает из основного обработчика DB low FDD_5x.RESET ;#51 DB low FDD_5x.LONG_READ ;#52 DB low FDD_5x.LONG_WRITE ;#53 - DB low FN_ABSENT_5x ;#54 + DB low FN_ABSENT_5x ;#54 DB low FDD_5x.READ ;#55 DB low FDD_5x.WRITE ;#56 DB low FDD_5x.DETECT ;#57 @@ -463,10 +484,10 @@ TAB_5xFNS: DB low FDD_5x.SETMED ;#59 DB low DRV_VERSION ;#5A - Дубль. На эту функцию прыгает из основного обработчика - DB low FN_RESERVED_5x ;#5B - Дубль. На эту функцию прыгает из основного обработчика - DB low FN_RESERVED_5x ;#5C - Дубль. На эту функцию прыгает из основного обработчика - DB low FN_RESERVED_5x ;#5D - Дубль. На эту функцию прыгает из основного обработчика - DB low FN_RESERVED_5x ;#5E - Дубль. На эту функцию прыгает из основного обработчика + DB low FN_RESERVED_5x ;#5B - Дубль. На эту функцию прыгает из основного обработчика + DB low FN_RESERVED_5x ;#5C - Дубль. На эту функцию прыгает из основного обработчика + DB low FN_RESERVED_5x ;#5D - Дубль. На эту функцию прыгает из основного обработчика + DB low FN_RESERVED_5x ;#5E - Дубль. На эту функцию прыгает из основного обработчика DB low DRV_LIST ;#5F - Дубль. На эту функцию прыгает из основного обработчика ; ;---------------------------------------------------------------------[] @@ -477,14 +498,14 @@ TAB_5xFNS: ;-------------------------------------------------------[ RAM DRIVE #6 ] ; - DB low FN_RESERVED_5x - DB low FN_ABSENT_5x + DB low FN_RESERVED_5x + DB low FN_ABSENT_5x DB low RMD_5x.LONG_READ DB low RMD_5x.LONG_WRITE - DB low FN_ABSENT_5x + DB low FN_ABSENT_5x DB low RMD_5x.READ DB low RMD_5x.WRITE - DB low FN_ABSENT_5x + DB low FN_ABSENT_5x DB low RMD_5x.GETMED DB low RMD_5x.SETMED @@ -502,7 +523,7 @@ TAB_5xFNS: ;-------------------------------------------------------------[ HDD #8 ] ; - DB low FN_RESERVED_5x + DB low FN_RESERVED_5x DB low HDD_5x.RESET DB low HDD_5x.LONG_READ DB low HDD_5x.LONG_WRITE @@ -514,10 +535,10 @@ TAB_5xFNS: DB low HDD_5x.SETMED DB low DRV_VERSION - DB low FN_RESERVED_5x - DB low FN_RESERVED_5x - DB low FN_RESERVED_5x - DB low FN_RESERVED_5x + DB low FN_RESERVED_5x + DB low FN_RESERVED_5x + DB low FN_RESERVED_5x + DB low FN_RESERVED_5x DB low DRV_LIST ;---------------------------------------------------------------------[] @@ -527,22 +548,22 @@ TAB_5xFNS: ;-----------------------------------------------------------[ CDROM #C ] ; - DB low FN_RESERVED_5x + DB low FN_RESERVED_5x DB low CD_5x.RESET DB low CD_5x.LONG_READ - DB low FN_ABSENT_5x - DB low FN_ABSENT_5x + DB low FN_ABSENT_5x + DB low FN_ABSENT_5x DB low CD_5x.READ - DB low FN_ABSENT_5x + DB low FN_ABSENT_5x DB low CD_5x.DETECT - DB low FN_ABSENT_5x - DB low FN_ABSENT_5x + DB low FN_ABSENT_5x + DB low FN_ABSENT_5x DB low DRV_VERSION - DB low FN_RESERVED_5x - DB low FN_RESERVED_5x - DB low FN_RESERVED_5x - DB low FN_RESERVED_5x + DB low FN_RESERVED_5x + DB low FN_RESERVED_5x + DB low FN_RESERVED_5x + DB low CD_5x.Extended DB low DRV_LIST ;---------------------------------------------------------------------[] @@ -554,23 +575,22 @@ TAB_5xFNS: ; --< HIGH PART >-- ;-------------------------------------------------------------[ FDD #0 ] ; - DB high FN_RESERVED_5x ;#50 - Дубль. На эту функцию прыгает из основного обработчика - DB high FDD_5x.RESET ;#51 - DB high FDD_5x.LONG_READ ;#52 - DB high FDD_5x.LONG_WRITE ;#53 - DB high FN_ABSENT_5x ;#54 - 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 DRV_VERSION ;#5A - Дубль. На эту функцию прыгает из основного обработчика - DB high FN_RESERVED_5x ;#5B - Дубль. На эту функцию прыгает из основного обработчика - DB high FN_RESERVED_5x ;#5C - Дубль. На эту функцию прыгает из основного обработчика - DB high FN_RESERVED_5x ;#5D - Дубль. На эту функцию прыгает из основного обработчика - DB high FN_RESERVED_5x ;#5E - Дубль. На эту функцию прыгает из основного обработчика - DB high DRV_LIST ;#5F - Дубль. На эту функцию прыгает из основного обработчика + DB high FN_RESERVED_5x ;#50 - Дубль. На эту функцию прыгает из основного обработчика + DB high FDD_5x.RESET ;#51 + DB high FDD_5x.LONG_READ ;#52 + DB high FDD_5x.LONG_WRITE ;#53 + DB high FN_ABSENT_5x ;#54 + 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 DRV_VERSION ;#5A - Дубль. На эту функцию прыгает из основного обработчика + DB high FN_RESERVED_5x ;#5B - Дубль. На эту функцию прыгает из основного обработчика + DB high FN_RESERVED_5x ;#5C - Дубль. На эту функцию прыгает из основного обработчика + DB high FN_RESERVED_5x ;#5D - Дубль. На эту функцию прыгает из основного обработчика + DB high FN_RESERVED_5x ;#5E - Extended functions + DB high DRV_LIST ;#5F - Дубль. На эту функцию прыгает из основного обработчика ; ;---------------------------------------------------------------------[] @@ -580,23 +600,22 @@ TAB_5xFNS: ;-------------------------------------------------------[ RAM DRIVE #6 ] ; - DB high FN_RESERVED_5x - DB high FN_ABSENT_5x - DB high RMD_5x.LONG_READ - DB high RMD_5x.LONG_WRITE - DB high FN_ABSENT_5x - 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 DRV_VERSION - DB high FN_RESERVED_5x - DB high FN_RESERVED_5x - DB high FN_RESERVED_5x - DB high FN_RESERVED_5x - DB high DRV_LIST + DB high FN_RESERVED_5x + DB high FN_ABSENT_5x + DB high RMD_5x.LONG_READ + DB high RMD_5x.LONG_WRITE + DB high FN_ABSENT_5x + 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 DRV_VERSION + DB high FN_RESERVED_5x + DB high FN_RESERVED_5x + DB high FN_RESERVED_5x + DB high FN_RESERVED_5x + DB high DRV_LIST ;---------------------------------------------------------------------[] ;---------------------------------[ #7 ] @@ -605,23 +624,22 @@ TAB_5xFNS: ;-------------------------------------------------------------[ HDD #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.GETMED - DB high HDD_5x.SETMED - - DB high DRV_VERSION - DB high FN_RESERVED_5x - DB high FN_RESERVED_5x - DB high FN_RESERVED_5x - DB high FN_RESERVED_5x - DB high DRV_LIST + 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.GETMED + DB high HDD_5x.SETMED + DB high DRV_VERSION + DB high FN_RESERVED_5x + DB high FN_RESERVED_5x + DB high FN_RESERVED_5x + DB high FN_RESERVED_5x + DB high DRV_LIST ;---------------------------------------------------------------------[] ;-----------------------------[ #9..#B ] @@ -630,23 +648,22 @@ TAB_5xFNS: ;----------------------------------------------------------[ CDROM #C0 ] ; - DB high FN_RESERVED_5x - DB high CD_5x.RESET - DB high CD_5x.LONG_READ - DB high FN_ABSENT_5x - DB high FN_ABSENT_5x - DB high CD_5x.READ - DB high FN_ABSENT_5x - DB high CD_5x.DETECT - DB high FN_ABSENT_5x - DB high FN_ABSENT_5x - - DB high DRV_VERSION - DB high FN_RESERVED_5x - DB high FN_RESERVED_5x - DB high FN_RESERVED_5x - DB high FN_RESERVED_5x - DB high DRV_LIST + DB high FN_RESERVED_5x + DB high CD_5x.RESET + DB high CD_5x.LONG_READ + DB high FN_ABSENT_5x + DB high FN_ABSENT_5x + DB high CD_5x.READ + DB high FN_ABSENT_5x + DB high CD_5x.DETECT + DB high FN_ABSENT_5x + DB high FN_ABSENT_5x + 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 DRV_LIST ;---------------------------------------------------------------------[] ;-----------------------------[ #D..#F ] @@ -668,31 +685,34 @@ EXP_FNS_RST18: RET FN_5x_Parser_1: - LD C,1 - JP FN_5x_Parser + LD C,#01 + JP FN_5x_Parser FN_5x_Parser_2: - LD C,2 - JP FN_5x_Parser + LD C,#02 + JP FN_5x_Parser FN_5x_Parser_3: - LD C,3 - JP FN_5x_Parser + LD C,#03 + JP FN_5x_Parser FN_5x_Parser_4: - LD C,4 - JP FN_5x_Parser -FN_5x_Parser_5: - LD C,5 - JP FN_5x_Parser + LD C,#04 + JP FN_5x_Parser FN_5x_Parser_6: - LD C,6 - JP FN_5x_Parser + LD C,#06 + JP FN_5x_Parser FN_5x_Parser_7: - LD C,7 - JP FN_5x_Parser + LD C,#07 + JP FN_5x_Parser FN_5x_Parser_8: - LD C,8 - JP FN_5x_Parser + LD C,#08 + JP FN_5x_Parser FN_5x_Parser_9: - LD C,9 + LD C,#09 + JP FN_5x_Parser +FN_5x_Parser_E: + LD C,#0E + JP FN_5x_Parser +FN_5x_Parser_5: + LD C,5 FN_5x_Parser: PUSH HL LD H,A diff --git a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm index b8635e7..d4dd0f4 100644 --- a/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm +++ b/src/bios/exp/EXTENDED/FDD_DRIVER_2.asm @@ -173,7 +173,7 @@ FDD_5x.READ: ; HL:IX - Sector ; DE - Address ; B - Sector counter -; A'- Memory ID Block +; A'- Memory Page Number ;Return: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) @@ -320,7 +320,7 @@ FDD_5x.WRITE: ; HL:IX - Sector ; DE - Address ; B - Sector counter -; A'- Memory ID Block +; A'- Memory Page Number ;Return: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) diff --git a/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM b/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM index 35a1ac8..af8984b 100644 --- a/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/CD_DRV.ASM @@ -1,4 +1,6 @@ -;CD ROM DRIVE DRIVER ;!FIXIT ALL! +;[ ] 18/12/2023. добавление/допиливание API CD-ROM (ATAPI) + +;CD ROM DRIVE DRIVER ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- @@ -11,12 +13,15 @@ RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b RAM_ATAPI_READ EQU SYS_PAGE.SHARED_BUFFER_32b+16 ASSERT ((PKTSIZE % 2) = 0), "PKTSIZE must be an even number" -;[]===========================================================[] + +;[]================================================================[#51] CD_5x.RESET: + LD C,IDE.Device.CDROM + CALL SELECT_DRIVE + RET C LD B,50 .loop: PUSH BC - LD A,1 CALL CD_TEST POP BC RET NC @@ -24,70 +29,46 @@ CD_5x.RESET: HALT DJNZ .loop RET -;[]===========================================================[] +;[]================================================================[#51] -;[]===========================================================[] -CD_5x.LONG_READ: ; !FIXIT не надо сохранять страницу SLOT3 как в других драйвах? -;[]===========================================================[] -;[]===========================================================[] +;[]================================================================[#55] +;Function: Read Sectors +; A - Disk +; HL:IX - Sector +; DE - Address +; B - Sector counter +;Return: +; HL:IX - Sector + Sector counter +; DE - Address + (Sector counter * Size sector) +;READ SECTOR(S) CD_5x.READ: - LD A,1 - JP CD_READ -;[]===========================================================[] - - -;[]===========================================================[] -CD.OPEN: - LD A,1 - JP CD_OPEN -;[]===========================================================[] - - -;[]===========================================================[] -CD.CLOSE: - LD A,1 - JP CD_CLOSE -;[]===========================================================[] - -CD_TEST LD HL,CMDNOPP - LD DE,0 - CALL AP_COM - RET - -; -;[]===========================================================[] -CD_5x.DETECT: ; !FIXIT - SCF - RET -;[]===========================================================[] -CD_OPEN: - LD HL,CMDOPEN - LD DE,0 - CALL AP_COM - RET -; - -CD_CLOSE: - LD HL,CMDCLOS - LD DE,0 - CALL AP_COM - RET - -; HL:IX - SECTOR -; DE - ADDRESS -; B - SECTOR COUNT -; A - DRIVE - -CD_READ: - LD C,A + EX AF,AF' + IN A,(SLOT3) + EX AF,AF' +;[]================================================================[#52] +;Function: Long Read Sectors +; A - Disk +; HL:IX - Sector +; DE - Address +; B - Sector counter +; A'- Memory Page Number +;Return: +; HL:IX - Sector + Sector counter +; DE - Address + (Sector counter * Size sector) +;LONG READ SECTOR(S) +CD_5x.LONG_READ: + LD C,IDE.Device.CDROM + CALL SELECT_DRIVE + RET C + ; EXX LD C,SLOT3 IN A,(C) PUSH AF LD A,SYS_PAGE OUT (C),A - LD HL,CMDREAD + LD HL,ATAPI_CMD_PACKET.READ LD DE,RAM_ATAPI_READ LD BC,PKTSIZE LDIR @@ -101,59 +82,107 @@ CD_READ: LD A,H LD H,L LD L,A - LD (RAM_ATAPI_READ+SECREAD+0),HL + LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+0),HL ; LD A,XH - LD (RAM_ATAPI_READ+SECREAD+2),A ;R01 + LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+2),A ;R01 LD A,XL - LD (RAM_ATAPI_READ+SECREAD+3),A ;R01 + LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+3),A ;R01 LD A,B - LD (RAM_ATAPI_READ+COUNT+1),A ;R01 - POP AF + LD (RAM_ATAPI_READ + ATAPI_PACKET.COUNTER+1),A ;R01 + ; + EX AF,AF' OUT (SLOT3),A + ; + ; POP AF + ; OUT (SLOT3),A ;R01 LD HL,CMDREAD LD HL,RAM_ATAPI_READ - LD A,C CALL AP_COM + ; + POP BC + LD C,SLOT3 + OUT (C),B + ; RET +;[]===========================================================[#52, #55] + +;[]================================================================[#57] +;Function: Detect Disk +; A - Disk +;Return: CF=0 - A=Drive type +; CF=1 - drive not present, A=#02 +CD_5x.DETECT: + LD C,IDE.Device.CDROM + AND %1011'1111 + JP DRV_DETECT +;[]================================================================[#57] + + +;[]================================================================[#5E] +;Function: Extended +; A - Disk +; B - SubFunction +;Return: +; +CD_5x.Extended: + LD C,IDE.Device.CDROM + CALL SELECT_DRIVE + RET C + ; + LD A,B + CP 2 + JR C,TRAY_FN + ; ... + ; ... + LD A,#AA ;!HARDCODE error code + SCF + RET +;[]================================================================[#5E] + + +;----------------------------------------------------------------------; +TRAY_FN: + LD DE,0 ;!FIXIT нужно ли? + LD HL,ATAPI_CMD_PACKET.CLOSE + DEC A + JR Z,AP_COM + LD HL,ATAPI_CMD_PACKET.OPEN + JR AP_COM +;----------------------------------------------------------------------; + + +;----------------------------------------------------------------------; ; INPUT: HL - AP paket (12bytes) ; RETURN: CF - ERROR -; 01h - RECOVERED ERROR -; 02h - NOT READY -; 03h - MEDIUM ERROR -; 04h - HARDWARE ERROR -; 05h - ILLEGAL REQUEST -; 06h - UNIT ATTETION -; 07h - DATA PROTECT -; 0Bh - ABORTED COMMAND -; 80h - TIME OUT -AP_COM: AND #01 - LD A,IDE.Drive.Master - JR Z,.APCOM1 - LD A,IDE.Drive.Slave -.APCOM1 LD BC,IDE.Write.DeviceHead - OUT (C),A ;SELECT DRIVE +; #01 - RECOVERED ERROR +; #02 - NOT READY +; #03 - MEDIUM ERROR +; #04 - HARDWARE ERROR +; #05 - ILLEGAL REQUEST +; #06 - UNIT ATTETION +; #07 - DATA PROTECT +; #0B - ABORTED COMMAND +; #80 - TIME OUT +AP_COM: EXX + LD DE,#8000 + CALL CD_WAITPRT EXX - LD DE,#8000 - ;LD BC,IDE.Read.Status - CALL CWAITPRT - EXX - JR NC,.CDREADY + JR NC,.READY LD BC,IDE.Write.Command - LD A,#08 + LD A,IDE.ATAPI.Reset OUT (C),A - LD B,#00 + LD B,#80 .pause: DJNZ .pause EXX - LD DE,#8000 - ;LD BC,IDE.Read.Status - CALL CWAITPRT + LD DE,#8000 + CALL CD_WAITPRT EXX RET C -.CDREADY: +.READY: LD C,SLOT3 IN B,(C) @@ -163,7 +192,7 @@ AP_COM: AND #01 LD A,SYS_PAGE OUT (C),A LD A,B - LD DE,RAM_ATAPI_PK + LD DE,RAM_ATAPI_PK ;!FIXIT может на стеке выделять место? LD BC,PKTSIZE LDIR @@ -173,32 +202,30 @@ AP_COM: AND #01 XOR A EXX - OUT (C),A - XOR A - LD BC,IDE.Write.Features - OUT (C),A - LD DE,SIZESEC ;SIZE BLOCK - LD BC,IDE.Write.CylinderLow - OUT (C),E - LD BC,IDE.Write.CylinderHigh - OUT (C),D - LD BC,IDE.Write.Command - LD A,IDE.ATAPI.Packet - OUT (C),A - LD DE,#8000 - ;LD BC,IDE.Read.Status - CALL CWAITPRT + ;OUT (C),A + ;XOR A + LD BC,IDE.Write.Features + OUT (C),A + LD DE,SIZESEC ;SIZE BLOCK ;!HARDCODE доставать из переменной какой-нибудь + LD BC,IDE.Write.CylinderLow + OUT (C),E + LD BC,IDE.Write.CylinderHigh + OUT (C),D + LD BC,IDE.Write.Command + LD A,IDE.ATAPI.Packet + OUT (C),A + LD DE,#8000 + CALL CD_WAITPRT EXX RET C EXX - LD DE,#0908 - ;LD BC,IDE.Read.Status - CALL CWAITPRT + LD DE,#0908 + CALL CD_WAITPRT EXX BIT IDE.ControlBit.Error,A JR NZ,.CDERROR JR NC,.YEP_DRQ - LD A,#80 + LD A,#80 ; TIME OUT ;!HARDCODE RET .YEP_DRQ: LD C,SLOT3 @@ -209,7 +236,6 @@ AP_COM: AND #01 LD HL,RAM_ATAPI_PK LD BC,IDE.Write.Data LD A,PKTSIZE/2 - ;SRL A .OUTPKT: OUTI OUTI @@ -224,9 +250,8 @@ AP_COM: AND #01 .AP_LOOP: EXX - LD DE,#8000 - ;LD BC,IDE.Read.Status - CALL CWAITPRT + LD DE,#8000 + CALL CD_WAITPRT EXX RET C LD BC,IDE.Read.Status @@ -245,7 +270,7 @@ AP_COM: AND #01 RET .NO_ERR: BIT IDE.ControlBit.DataRequest,A - LD A,0 + LD A,BIOS.Error.NoErrors RET Z ;NO DATA REQUEST EX DE,HL LD BC,IDE.Read.CylinderLow @@ -258,8 +283,8 @@ AP_COM: AND #01 LD BC,IDE.Read.Counter IN A,(C) AND #02 - CP #02 - JP Z,.FROM_CD + ;CP #02 + JP NZ,.FROM_CD ;.TO_CD: LD BC,IDE.Read.Data .WR_T_CD: @@ -298,26 +323,15 @@ AP_COM: AND #01 LD A,D OR E JR NZ,.RD_N_CD -; DE = 0 !!! + ; DE = 0 JR .AP_LOOP +;----------------------------------------------------------------------; - -; E - Second * 10 -; PAUSE LD HL,#0000 -; PAUSE1 DEC L -; JR NZ,PAUSE1 -; DEC H -; JR NZ,PAUSE1 -; DEC E -; JR NZ,PAUSE1 -; RET - - +;----------------------------------------------------------------------; ; D - MASK ; E - PATTERN - //; BC - PORT -CWAITPRT: +CD_WAITPRT: LD BC,IDE.Read.Status LD A,100 LD HL,#0000 @@ -344,32 +358,50 @@ CWAITPRT: .CWAITP1: SCF RET - -CMDNOPP DEFB #00 - DEFB 00,00,00 - DEFB #00 - DEFB 00,00,00 - DEFB 00,00,00 - DEFB #00 - -CMDOPEN DEFB #1B - DEFB #00,#00,#00 - DEFB #02 - DEFB #00,#00,#00,#00,#00,#00,#00 - -CMDCLOS DEFB #1B - DEFB #00,#00,#00 - DEFB #03 - DEFB #00,#00,#00,#00,#00,#00,#00 - -CMDREAD DEFB #28,#00 -SECREAD EQU $-CMDREAD - DEFB #00,#00,#00,#00 - DEFB #00 -COUNT EQU $-CMDREAD - DEFB #00,#01 - DEFB #00,#00,#00 - -;======================================================== +;----------------------------------------------------------------------; +;----------------------------------------------------------------------; +CD_TEST LD HL,ATAPI_CMD_PACKET.NOP + LD DE,0 ;!FIXIT нужно ли? + JP AP_COM +;----------------------------------------------------------------------; + + +//////////////////////////////////////////////////////////////////////// +ATAPI_CMD_PACKET: +.NOP: DUP 12 + DB #00 + EDUP +; +.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 +; +.READ: DB #28,#00 + DB #00,#00,#00,#00 ; sector dword + DB #00 + DB #00,#01,#00,#00 ; counter dword + DB #00 +; +ATAPI_PACKET: +.SECTOR EQU 2 +.COUNTER EQU 7 +//////////////////////////////////////////////////////////////////////// +; +; E - Second * 10 +; PAUSE LD HL,#0000 +; PAUSE1 DEC L +; JR NZ,PAUSE1 +; DEC H +; JR NZ,PAUSE1 +; DEC E +; JR NZ,PAUSE1 +; RET +; \ No newline at end of file diff --git a/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM b/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM index cda8e56..f175b01 100644 --- a/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM +++ b/src/bios/exp/EXTENDED/IDE/HDD_DRV.ASM @@ -89,47 +89,6 @@ HDD_5x.RESET: ; !FIXIT RET ;[]================================================================[#51] -SELECTH: - AND #0F - LD IY,IDE.INIT_TBL_IDE0 - JR Z,SELHH - DEC A - LD IY,IDE.INIT_TBL_IDE1 - ;R02 - JR Z,SELHH - DEC A - LD IY,IDE.INIT_TBL_IDE2 - JR Z,SELHH - DEC A - LD IY,IDE.INIT_TBL_IDE3 - ; - JR NZ,NODRIVE -SELHH: EXX - LD C,SLOT3 - IN B,(C) - LD A,SYS_PAGE - OUT (C),A - - LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) - AND #01 - LD A,IDE.Chanel.Secondary - JR NZ,SELCHAN - LD A,IDE.Chanel.Primary -SELCHAN: - OUT (IDE.Chanel.Set),A ;R02 - LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) - CP IDE.Device.HDD ;!FIXIT возможно, нахрен не нужно, потому-что если CD, то прилетит в драйвер CD - LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) - OUT (C),B ;возврат страницы - LD BC,IDE.Write.DeviceHead - RES 0,A - OUT (C),A - EXX - RET Z -NODRIVE: - LD A,BIOS.Error.BadDrvNumber - SCF - RET ;[]================================================================[#58] ;Function: Get Current Media Parameters @@ -141,7 +100,8 @@ NODRIVE: ; IX - Capacity sector in bytes ; B - Flags: MASTER/SLAVE, LBA/CHS HDD_5x.GETMED: - CALL SELECTH + LD C,IDE.Device.HDD + CALL SELECT_DRIVE RET C IN A,(SLOT3) EX AF,AF' @@ -170,7 +130,8 @@ HDD_5x.GETMED: ; B - Flags ;Return: None HDD_5x.SETMED: - CALL SELECTH + LD C,IDE.Device.HDD + CALL SELECT_DRIVE RET C IN A,(SLOT3) EX AF,AF' @@ -208,7 +169,7 @@ HDD_5x.READ: ; HL:IX - Sector ; DE - Address ; B - Sector counter -; A'- Memory ID Block +; A'- Memory Page Number ;Return: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) @@ -273,7 +234,9 @@ RST8RDR: RESTORE_PORTY ;EX AF,AF' ;!TEST 21/11/23 RET ;READ SECTOR(S) -RDS000: CALL SELECTH +RDS000: + LD C,IDE.Device.HDD + CALL SELECT_DRIVE RET C EXX LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0 @@ -333,6 +296,7 @@ RDS004: DUP 16 LD XH,A EX AF,AF' OUT (SLOT3),A + ; .W44: INC XL ;INC LOADED SECTORS EXX LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1 @@ -369,7 +333,7 @@ HDD_5x.WRITE: ; HL:IX - Sector ; DE - Address ; B - Sector counter -; A'- Memory ID Block +; A'- Memory Page Number ;Return: ; HL:IX - Sector + Sector counter ; DE - Address + (Sector counter * Size sector) @@ -436,7 +400,8 @@ RST8WRR: RESTORE_PORTY ;WRITE SECTOR(S) WRS000: - CALL SELECTH + LD C,IDE.Device.HDD + CALL SELECT_DRIVE RET C EXX LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0 @@ -550,7 +515,9 @@ HDD_5x.VERIFY: RET ;[]================================================================[#54] ;VERIFY SECTOR(S) -VRS000: CALL SELECTH +VRS000: + LD C,IDE.Device.HDD + CALL SELECT_DRIVE RET C EXX LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0 @@ -665,9 +632,9 @@ CHS005: INC A LD L,A RET +;----------------------------------------------------------------------; ; D - MASK ; E - PATTERN - //; BC - PORT WAITPRT: LD BC,IDE.Read.Status LD HL,#0000 ; задержка ;!HARDCODE @@ -690,42 +657,46 @@ WAITPRT: RET .ok: POP HL RET +;----------------------------------------------------------------------; -;======================================================================= ;[]================================================================[#57] +;[ ] 18/12/2023. добавление/допиливание API CD-ROM (ATAPI) ;Function: Detect Disk ; A - Disk ;Return: CF=0 - A=Drive type -; CF=1 - drive not present, A=#FF +; CF=1 - drive not present, A=#02 HDD_5x.DETECT: - CP #84 ;!HARDCODE max HDD drives (#80,#81,#82,#83) - CCF - JR C,.error + LD C,IDE.Device.HDD + JP DRV_DETECT - 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 +; 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) - LD C,SLOT3 - OUT (C),B +; LD A,(HL) +; LD C,SLOT3 +; OUT (C),B - CP IDE.Device.HDD - RET Z - SCF -.error: LD A,BIOS.Error.BadDrvNumber - RET +; CP IDE.Device.HDD +; RET Z +; SCF +; .error: LD A,BIOS.Error.BadDrvNumber +; 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 new file mode 100644 index 0000000..5cbcabc --- /dev/null +++ b/src/bios/exp/EXTENDED/IDE/shared.asm @@ -0,0 +1,100 @@ +;[ ] 18/12/2023. добавление/допиливание API CD-ROM (ATAPI) + +;======================================================================= +; Вход: A - номер устройства +; C - Тип +SELECT_DRIVE: + AND #0F + LD IY,IDE.INIT_TBL_IDE0 + JR Z,.channel + DEC A + LD IY,IDE.INIT_TBL_IDE1 + ;R02 + JR Z,.channel + DEC A + LD IY,IDE.INIT_TBL_IDE2 + JR Z,.channel + DEC A + LD IY,IDE.INIT_TBL_IDE3 + ; + JR Z,.channel + LD A,BIOS.Error.BadDrvNumber + SCF + RET + ; +.channel: + EXX + IN A,(SLOT3) + PUSH AF + 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) + POP AF + OUT (SLOT3),A ;возврат страницы + ; + LD A,C + EXX + CP C + EXX + SCF + LD A,BIOS.Error.BadDrvNumber + RET NZ + ; + LD A,B + AND #F0 + LD BC,IDE.Write.DeviceHead + OUT (C),A + EXX + RET + ; +; NODRIVE: +; LD A,BIOS.Error.BadDrvNumber +; SCF +; RET +;======================================================================= + + +;======================================================================= +;Function: Detect Disk +; A - Disk +; С - Type +;Return: CF=0 - A=Drive type +; 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.BadDrvNumber + RET \ No newline at end of file diff --git a/src/bios/exp/FUNC_5x.asm b/src/bios/exp/FUNC_5x.asm index 5f0a03d..679eb90 100644 --- a/src/bios/exp/FUNC_5x.asm +++ b/src/bios/exp/FUNC_5x.asm @@ -119,8 +119,9 @@ DRV_LIST: ; ????? INCLUDE 'EXTENDED/FDD_DRIVER_2.asm' INCLUDE 'EXTENDED/RAM_DISK_DRIVER_1.asm' - INCLUDE 'EXTENDED/HDD_DRIVER_6.asm' - INCLUDE 'EXTENDED/CD_DRIVER_0.asm' + INCLUDE 'EXTENDED/IDE/HDD_DRV.asm' + INCLUDE 'EXTENDED/IDE/CD_DRV.asm' + INCLUDE 'EXTENDED/IDE/SHARED.asm' ;DISPLAY " EXTENDED end addr: ", /A, $ diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index c34b87f..ff58d5f 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -4,7 +4,7 @@ ;----------------------------------------------------------------------- ;Rev Date Name Description ;----------------------------------------------------------------------- -;R02 17.08.2023 BAO Fixed bug with AUTODETECT ATAPI Drives +;R02 17.08.2023 BAO New AUTODETECT ATA/ATAPI procedure ;R01 01.08.2001 DNS FIX BUG INT "SELECT_IDE" ;R00 24.07.2001 DNS ADD SECONDARY IDE ; 24.07.2001 DNS INITIAL NEW VERSION 2.48 @@ -169,7 +169,7 @@ START: CALL SetUP_CHANELS LD A,#03 CALL STEP1_GETCMOS - ;!TEST save hdd parameters to cmos for "setup" in settings + ;[x] save hdd parameters to cmos for "setup" in settings CALL WRITING ; CALL ScreenPOS.CRLF diff --git a/src/bios/rom/SETUP/MAIN.asm b/src/bios/rom/SETUP/MAIN.asm index 16fd523..725e2ac 100644 --- a/src/bios/rom/SETUP/MAIN.asm +++ b/src/bios/rom/SETUP/MAIN.asm @@ -884,6 +884,7 @@ RECOVERYstart: PrepareToBOOT: + CALL INT_ON HALT ; без него не срабатывает зажимание шифта при старте доса для отмены старта system.exe CALL INT_OFF CALL PORTS_INIT.clean_kbd_buf ;Clearing the keyboard buffer @@ -937,7 +938,7 @@ CDSTART: POP AF PUSH AF CALL PRINT_CHANEL - + ; POP BC SET 6,B SCF diff --git a/src/bios/shared/RECOVERY.IMG b/src/bios/shared/RECOVERY.IMG index 69bed98..1ecf119 100755 Binary files a/src/bios/shared/RECOVERY.IMG and b/src/bios/shared/RECOVERY.IMG differ