From 13e72e8300867aa59c70266c49b6943cdeff934b Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 1 Aug 2023 02:57:04 +1000 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B6=D0=B5=D0=BA=20=D0=B4=D0=BB=D1=8F=20IDE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared_Includes | 2 +- src/bios/exp/EXTENDED/CD_DRIVER_0.asm | 81 +++++---------- src/bios/exp/EXTENDED/HDD_DRIVER_6.asm | 54 +++++----- src/bios/rom/SETUP/AUTOIDE.asm | 135 ++++++++++++------------- 4 files changed, 121 insertions(+), 151 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 785b2ad..53e49fa 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 785b2adeb82bc426c6a7cc5da0d2c041d414ebc3 +Subproject commit 53e49fa3cc457e2d7a8977d6166246b8457cb5ce diff --git a/src/bios/exp/EXTENDED/CD_DRIVER_0.asm b/src/bios/exp/EXTENDED/CD_DRIVER_0.asm index db42a32..a485a9a 100644 --- a/src/bios/exp/EXTENDED/CD_DRIVER_0.asm +++ b/src/bios/exp/EXTENDED/CD_DRIVER_0.asm @@ -5,33 +5,11 @@ ; 02-08-2001 DNS Initial this module ;--------------------------------------------------------------- ;======================================================== -;!FIXIT -R170 EQU #0050 ;Data -R171 EQU #0051 ;Error -R172 EQU #0052 ;Direct -R173 EQU #0053 ;Reserve -R174 EQU #0054 ;Lenght block low -R175 EQU #0055 ;Lenght block high -R176 EQU #4052 ;Drive device -R177 EQU #4053 ;Status - -W170 EQU #0150 ;Data -W171 EQU #0151 ;???? -W172 EQU #0152 ;???? -W173 EQU #0153 ;Reserve -W174 EQU #0154 ;Lenght block low -W175 EQU #0155 ;Lenght block high -W176 EQU #4152 ;Drive device -W177 EQU #4153 ;Command - +SIZESEC EQU #0800 +PKTSIZE EQU 12 RAM_ATAPI_PK EQU #FEE0 RAM_ATAPI_READ EQU #FEF0 -;BSY EQU 7 -;DRQ EQU 3 -;ERR EQU 0 - - ;[]===========================================================[] CD_5x.RESET: LD B,50 @@ -71,11 +49,6 @@ CD.CLOSE: JP CD_CLOSE ;[]===========================================================[] - - -SIZESEC EQU #0800 -PKTSIZE EQU 12 - CD_TEST LD HL,CMDNOPP LD DE,0 CALL AP_COM @@ -147,27 +120,28 @@ CD_READ: ; 07h - DATA PROTECT ; 0Bh - ABORTED COMMAND ; 80h - TIME OUT - -AP_COM AND #01 +AP_COM: AND #01 LD A,#A0 JR Z,.APCOM1 LD A,#B0 -.APCOM1 LD BC,W176 +.APCOM1 LD BC,IDE.Write.DriveCtrl OUT (C),A ;SELECT DRIVE EXX LD DE,#8000 - LD BC,R177 + ;LD BC,IDE.Read.Status CALL CWAITPRT EXX JR NC,.CDREADY - LD BC,W177 + LD BC,IDE.Write.Command LD A,#08 OUT (C),A + LD B,#00 - DJNZ $ +.pause: DJNZ .pause + EXX LD DE,#8000 - LD BC,R177 + ;LD BC,IDE.Read.Status CALL CWAITPRT EXX RET C @@ -193,24 +167,24 @@ AP_COM AND #01 EXX OUT (C),A XOR A - LD BC,W171 + LD BC,IDE.Write.Error OUT (C),A LD DE,SIZESEC ;SIZE BLOCK - LD BC,W174 + LD BC,IDE.Write.CylinderLow OUT (C),E - LD BC,W175 + LD BC,IDE.Write.CylinderHigh OUT (C),D - LD BC,W177 + LD BC,IDE.Write.Command LD A,#A0 OUT (C),A LD DE,#8000 - LD BC,R177 + ;LD BC,IDE.Read.Status CALL CWAITPRT EXX RET C EXX LD DE,#0908 - LD BC,R177 + ;LD BC,IDE.Read.Status CALL CWAITPRT EXX BIT IDE.ControlBit.Error,A @@ -225,7 +199,7 @@ AP_COM AND #01 LD A,SYS_PAGE OUT (SLOT3),A LD HL,RAM_ATAPI_PK - LD BC,W170 + LD BC,IDE.Write.Data LD A,PKTSIZE SRL A .OUTPKT: @@ -240,16 +214,16 @@ AP_COM AND #01 .AP_LOOP: EXX LD DE,#8000 - LD BC,R177 + ;LD BC,IDE.Read.Status CALL CWAITPRT EXX RET C - LD BC,R177 + LD BC,IDE.Read.Status IN A,(C) BIT IDE.ControlBit.Error,A JR Z,.NO_ERR .CDERROR: - LD BC,R171 ;ERROR + LD BC,IDE.Read.Error ;ERROR IN A,(C) RRCA RRCA @@ -263,20 +237,20 @@ AP_COM AND #01 LD A,0 RET Z ;NO DATA REQUEST EX DE,HL - LD BC,R174 + LD BC,IDE.Read.CylinderLow IN E,(C) - LD BC,R175 + LD BC,IDE.Read.CylinderHigh IN D,(C) ;TRANSFER BLOCK SIZE LD A,D OR E RET Z ;BLOCK = 0 - LD BC,R172 + LD BC,IDE.Read.Counter IN A,(C) AND #02 CP #02 JP Z,.FROM_CD ;.TO_CD: - LD BC,R170 + LD BC,IDE.Read.Data .WR_T_CD: OUTI OUTI @@ -291,7 +265,7 @@ AP_COM AND #01 LD A,H OR L JR Z,.NULL - LD BC,R170 + LD BC,IDE.Read.Data .RD_F_CD: INI INI @@ -302,7 +276,7 @@ AP_COM AND #01 JR NZ,.RD_F_CD EX DE,HL JR .AP_LOOP -.NULL: LD BC,R170 +.NULL: LD BC,IDE.Read.Data .RD_N_CD: IN A,(C) DEC B @@ -331,8 +305,9 @@ AP_COM AND #01 ; D - MASK ; E - PATTERN -; BC - PORT + //; BC - PORT CWAITPRT: + LD BC,IDE.Read.Status LD A,100 LD HL,#0000 .CWAITPX: diff --git a/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm b/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm index 9cc7be7..b426c21 100644 --- a/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm +++ b/src/bios/exp/EXTENDED/HDD_DRIVER_6.asm @@ -279,7 +279,7 @@ RDS000: CALL SELECTH RET C EXX LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0 - LD BC,IDE.Read.Status + ;LD BC,IDE.Read.Status CALL WAITPRT EXX RET C @@ -298,7 +298,7 @@ RDS000: CALL SELECTH ;SAVE HL! RDS002: EXX LD DE,#8908 ;WAIT BUSY=0 & DRQ=1 & ERR=0 - LD BC,IDE.Read.Status + ;LD BC,IDE.Read.Status CALL WAITPRT EXX RET C @@ -338,7 +338,7 @@ RDS004: DUP 16 .W44: INC XL ;INC LOADED SECTORS EXX LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1 - LD BC,IDE.Read.Status + ;LD BC,IDE.Read.Status CALL WAITPRT EXX RET C @@ -443,7 +443,7 @@ WRS000: RET C EXX LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0 - LD BC,IDE.Read.Status + ;LD BC,IDE.Read.Status CALL WAITPRT EXX RET C @@ -478,7 +478,7 @@ NO_WriteProtect: ;SAVE HL! WRS002: EXX LD DE,#8908 ;WAIT BUSY=0 & DRQ=1 & ERR=0 - LD BC,IDE.Read.Status + ;LD BC,IDE.Read.Status CALL WAITPRT EXX RET C @@ -520,7 +520,7 @@ WRS003: .W33: INC XL ;INC SAVED SECTORS EXX LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1 - LD BC,IDE.Read.Status + ;LD BC,IDE.Read.Status CALL WAITPRT EXX RET C @@ -562,7 +562,7 @@ VRS000: CALL SELECTH RET C EXX LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0 - LD BC,IDE.Read.Status + ;LD BC,IDE.Read.Status CALL WAITPRT EXX RET C @@ -579,7 +579,7 @@ VRS002: LD BC,IDE.Read.Status SCF RET VRS003: LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1 - LD BC,IDE.Read.Status + ;LD BC,IDE.Read.Status CALL WAITPRT RET C XOR A @@ -675,27 +675,32 @@ CHS005: INC A ; D - MASK ; E - PATTERN -; BC - PORT + //; BC - PORT WAITPRT: - LD HL,#0000 -.P0: IN A,(C) + LD BC,IDE.Read.Status + LD HL,#0000 ; задержка + +.loop: PUSH HL + +.loop2: IN A,(C) AND D CP E - - ;!TEST - RET Z - ;JR NZ,.P2 - ;AND A - ;RET - ; - -.P2: DEC HL + JR Z,.ok + DEC HL LD A,L OR H - JP NZ,.P0 -.error: LD A,4 ;!HARDCODE error number + JP NZ,.loop2 + + POP HL + DEC L + JR NZ,.loop + +.error: LD A,4 ;!HARDCODE error number SCF RET +.ok: POP HL + RET + ;======================================================================= ;[]================================================================[#57] @@ -728,7 +733,8 @@ HDD_5x.DETECT: LD C,SLOT3 OUT (C),B - CP IDE.Device.NONE - CCF + CP IDE.Device.HDD + RET Z + SCF RET ;[]================================================================[#57] \ No newline at end of file diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index 7288f71..badb19e 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -85,13 +85,17 @@ IDE3 EQU #C1D8 ; DB #FF ;SECTOR PER CYLINDER HIGH ;06 ; DB #FF ;DEVICE TYPE ;07 +WAIT_IDE EQU #0000 +WAIT_SML EQU #1000 +WAIT_ERROR EQU #0400 + IDE__CD: CALL SELECT_IDE ;MASTER CDAUTO: LD A,IDE.Device.CDROM LD (IDEDEV),A - LD A,#FF + LD A,#FF ;!FIXIT можно оптимизировать JP CDMASTR SELECT_IDE: @@ -130,17 +134,13 @@ CDMASTR: LD (SKIP),A LD BC,IDE.Write.DriveCtrl OUT (C),D - IF IDE_Optimization DEC B - INC C - ELSE - LD BC,IDE.Read.Status - ENDIF + INC C ; LD BC,IDE.Read.Status IN A,(C) AND #80 LD HL,280 JR Z,NO_BUSY - LD HL,1550 + LD HL,1550 ; задержка - 31 секунда EI CLRBUSY: HALT @@ -150,7 +150,7 @@ CLRBUSY: JP Z,ABSENT CALL SKIPKEY JP C,ABSENT - LD BC,IDE.Read.Status + LD BC,IDE.Read.Status ;!FIXIT можно закомментировать? IN A,(C) AND #80 JR NZ,CLRBUSY @@ -165,25 +165,31 @@ NO_BUSY: DEC C JR NZ,.pause - IF IDE_Optimization - LD C,IDE.Read.Counter - ELSE - LD BC,IDE.Read.Counter - ENDIF + LD C,IDE.Read.Counter ; LD BC,IDE.Read.Counter IN A,(C) CP E JP NZ,ABSENT + ;!FIXIT CD-ROM Autodetect error! LD A,(IDEDEV) - CP IDE.Device.CDROM - JP Z,NOHDD +;!TODO +; I haven,t done too many tests but this works on all the hardware i have. +; 1 select device (port+6) +; 2 read status byte(port+7) if =-1 then there is no disk +; if busy to many time then no disk +; 3 send id command 0ec0h if error then send packet device id command +; 0a1h if error then no disk. +; commands must be send byte by byte dword operations are used only for data transfers. + ;CP IDE.Device.NONE + ;JR NZ,1F + +1: CP IDE.Device.CDROM + JP Z,NOHDD ;при автодетекте, если тут CD, то никогда не будет перехода на NOHDD LD E,ATA_NOP LD BC,IDE.Write.Command OUT (C),E - IF IDE_Optimization - DEC B - ENDIF + DEC B ; LD BC, IDE.Read.Status WXREADY: HALT DEC HL @@ -192,9 +198,7 @@ WXREADY: JP Z,ABSENT CALL SKIPKEY JP C,ABSENT - IFN IDE_Optimization - LD BC,IDE.Read.Status - ENDIF + ;LD BC,IDE.Read.Status IN A,(C) AND #C0 CP #40 @@ -212,20 +216,15 @@ WXREADY: LD B,0 .pause: DJNZ .pause - LD HL,(WAITSML) + LD HL,WAIT_SML LD DE,#0101 - IF IDE_Optimization - LD B,high IDE.Read.Status - ELSE - LD BC,IDE.Read.Status - ENDIF CALL WAIT_PRT JP NC,NOHDD GETPARM: - LD HL,(WAITIDE) + LD HL,WAIT_IDE LD DE,#0808 - LD BC,IDE.Read.Status + ;LD BC,IDE.Read.Status CALL WAIT_PRT JP C,ABSENT LD BC,IDE.Read.Data @@ -245,13 +244,9 @@ NOHDD: LD A,IDE.Device.CDROM LD B,0 .pause: DJNZ .pause - LD HL,(WAITSML) + ;LD HL,WAIT_SML + LD HL,WAIT_ERROR LD DE,#0101 - IF IDE_Optimization - LD B,high IDE.Read.Status - ELSE - LD BC,IDE.Read.Status - ENDIF CALL WAIT_PRT JP C,GETPARM ABSENT: @@ -329,21 +324,17 @@ FOR_CDR: IDE_CMD: PUSH AF - LD HL,(WAITIDE) + LD HL,WAIT_IDE LD DE,#C040 - LD BC,IDE.Read.Status + ;LD BC,IDE.Read.Status CALL WAIT_PRT POP DE RET C - IF IDE_Optimization - INC B - ELSE - LD BC,IDE.Write.Command - ENDIF + INC B ; LD BC,IDE.Write.Command OUT (C),D - LD HL,(WAITIDE) + LD HL,WAIT_IDE LD DE,#C040 - LD BC,IDE.Read.Status + ;LD BC,IDE.Read.Status JP WAIT_PRT WAITHDD: @@ -363,42 +354,24 @@ WTREADY: SCF RET -;WAITHDD DEC L -; RET NZ -; DEC H -; RET NZ -; DEC E -; RET NZ -; SCF -; RET - -; 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 WAIT_PRT: - IN A,(C) + LD BC,IDE.Read.Status +.loop: IN A,(C) AND D CP E - JR NZ,.P2 - AND A - RET + ;JR NZ,.P2 + ;AND A + ;RET + RET Z .P2: DEC HL CALL SKIPKEY RET C LD A,L OR H - JP NZ,WAIT_PRT + JP NZ,.loop .error: SCF RET @@ -421,12 +394,28 @@ SKIPKEY: LD (SKIP),A SCF RET - -WAITIDE: DW #0000 ;!FIXIT не меняется? -WAITSML: DW #0400 ;!FIXIT не меняется? SKIP: DB #FF IDEDEV: DB #FF ICHANEL: DB #00 ; ENDMODULE -; \ No newline at end of file + +;WAITHDD DEC L +; RET NZ +; DEC H +; RET NZ +; DEC E +; RET NZ +; SCF +; RET + +; 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