Определение смены диска в драйве ATAPI.

This commit is contained in:
Tolik 2025-01-17 23:21:22 +10:00
parent e5856eef12
commit 69670d7873
7 changed files with 75 additions and 68 deletions

Binary file not shown.

View File

@ -56,7 +56,7 @@ FDD_5x_GETMED:
LD B,A LD B,A
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
;EX AF,AF' LD A,%0000'0001 ; removable media
AND A AND A
RET RET
@ -130,6 +130,7 @@ FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off
PUSH AF PUSH AF
CALL SET_DOS_OFF CALL SET_DOS_OFF
POP AF POP AF
LD B,%0000'0001 ;bit0=1 removable, bit1=1 drive changed, bit7..2 reserved ; [ ]
JP SAVE_INTERRUPTS.restore JP SAVE_INTERRUPTS.restore
;RET ;RET

View File

@ -109,10 +109,9 @@ CD_5x_GETMED: LD C,IDE.Device.ATAPI
; HL:IX - Sector + Sector counter ; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector) ; DE - Address + (Sector counter * Size sector)
;READ SECTOR(S) ;READ SECTOR(S)
CD_5x_READ: CD_5x_READ: EX AF,AF'
EX AF,AF' IN A,(SLOT3)
IN A,(SLOT3) EX AF,AF'
EX AF,AF'
;[]================================================================[#52] ;[]================================================================[#52]
;Function: Long Read Sectors ;Function: Long Read Sectors
; A - Disk ; A - Disk
@ -256,14 +255,15 @@ CD_5x_LONG_WRITE:
;Function: Detect Disk ;Function: Detect Disk
; A - Disk ; A - Disk
;Return: CF=0 - A=Drive type ;Return: CF=0 - A=Drive type
; B=RemovableMedia byte ; [ ]
; CF=1 - drive not present, A=#02 ; CF=1 - drive not present, A=#02
CD_5x_DETECT: LD C,IDE.Device.ATAPI CD_5x_DETECT: LD C,IDE.Device.ATAPI
AND %1011'1111 AND %1011'1111
CALL DRV_DETECT .shared: CALL DRV_DETECT
RET C RET C
; ;
PUSH AF PUSH AF
LD BC,SLOT3 LD C,SLOT3
IN B,(C) IN B,(C)
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (C),A OUT (C),A
@ -272,6 +272,7 @@ CD_5x_DETECT: LD C,IDE.Device.ATAPI
INC HL INC HL
LD A,(HL) LD A,(HL)
OUT (C),B OUT (C),B
LD B,A
AND %0000'0010 AND %0000'0010
JR Z,.exit JR Z,.exit
; ;
@ -329,7 +330,7 @@ CD_CHECK_MEDIA_CHANGED:
JR C,.noWait JR C,.noWait
; ;
EXX EXX
LD BC,SLOT3 LD C,SLOT3
IN B,(C) IN B,(C)
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (C),A OUT (C),A

View File

@ -107,6 +107,7 @@ HDD_5x_GETMED:
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD A,(IY+IDE.HDD_INIT_TABLE.RemovableMedia)
LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
LD H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) LD H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber)
LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow) LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow)
@ -114,8 +115,8 @@ HDD_5x_GETMED:
LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
LD IX,512 ;!HARDCODE sector size LD IX,512 ;!HARDCODE sector size
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
;AND A EX AF,AF'
RET RET
;[]================================================================[#58] ;[]================================================================[#58]
@ -675,5 +676,5 @@ WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE
; CF=1 - drive not present, A=#02 ; CF=1 - drive not present, A=#02
HDD_5x_DETECT: HDD_5x_DETECT:
LD C,IDE.Device.HDD LD C,IDE.Device.HDD
JP DRV_DETECT JP CD_5x_DETECT.shared
;[]================================================================[#57] ;[]================================================================[#57]

View File

@ -67,32 +67,30 @@ SELECT_DRIVE:
; - Type ; - Type
;Return: CF=0 - A=Drive type ;Return: CF=0 - A=Drive type
; CF=1 - drive not present, A=#02 ; CF=1 - drive not present, A=#02
DRV_DETECT: DRV_DETECT: CP #84 ;!HARDCODE max IDE drives (#80,#81,#82,#83)
CP #84 ;!HARDCODE max IDE drives (#80,#81,#82,#83) CCF
CCF JR C,.error
JR C,.error ;
LD HL,IDE.INIT_TBL_IDE0.DriveType
LD HL,IDE.INIT_TBL_IDE0.DriveType AND 3
AND 3 JR Z,.get_param
JR Z,.get_param LD HL,IDE.INIT_TBL_IDE1.DriveType
LD HL,IDE.INIT_TBL_IDE1.DriveType DEC A
DEC A JR Z,.get_param
JR Z,.get_param LD HL,IDE.INIT_TBL_IDE2.DriveType
LD HL,IDE.INIT_TBL_IDE2.DriveType DEC A
DEC A JR Z,.get_param
JR Z,.get_param LD HL,IDE.INIT_TBL_IDE3.DriveType
LD HL,IDE.INIT_TBL_IDE3.DriveType .get_param: IN A,(SLOT3)
.get_param: LD B,A
IN A,(SLOT3) LD A,SYS_PAGE
LD B,A OUT (SLOT3),A
LD A,SYS_PAGE ;
OUT (SLOT3),A LD A,(HL)
CP C ; compare Type
LD A,(HL) LD C,SLOT3
CP C ; compare Type OUT (C),B
LD C,SLOT3 RET Z
OUT (C),B SCF
RET Z .error: LD A,BIOS.Error.BadNumber
SCF RET
.error: LD A,BIOS.Error.BadNumber
RET

View File

@ -35,33 +35,34 @@ RMD_5x_SETMED:
; IX - Capacity sector in bytes ; IX - Capacity sector in bytes
; B - Flags: ramblock ID ; B - Flags: ramblock ID
;[]===========================================================[] ;[]===========================================================[]
RMD_5x_GETMED: RMD_5x_GETMED: AND #0F
.SectorSize EQU 512 ;!HARDCODE CALL GET_RAMD_ST ; ¯®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª 
AND #0F RET C
CALL GET_RAMD_ST ; ¯®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª  SCF
RET C RET Z
SCF ;
RET Z LD C,A
; LD B,#FF
LD C,A .loop: INC B
LD B,#FF PUSH BC
.loop: INC B LD A,C
PUSH BC CALL EMM.GetMemPage ; ¯®«ãç¨âì 䨧¨ç¥áª¨© ­®¬¥à áâà ­¨æë ¨§ ¡«®ª 
LD A,C POP BC
CALL EMM.GetMemPage ; ¯®«ãç¨âì 䨧¨ç¥áª¨© ­®¬¥à áâà ­¨æë ¨§ ¡«®ª  JR NC,.loop
POP BC ; CF==1, A==0 - ®è¨¡ª , A==#FF - ok
JR NC,.loop INC A
; CF==1, A==0 - ®è¨¡ª , A==#FF - ok RET NZ ; ¥á«¨ ¢ë室¨â, â® á ä« £ ¬¨ CF==1, ZF==1
INC A ;
RET NZ ; ¥á«¨ ¢ë室¨â, â® á ä« £ ¬¨ CF==1, ZF==1 LD E,B
LD B,C
LD E,B ; âãâ ¢ E ª®«¨ç¥á⢮ áâà ­¨æ ¢ à ¬¤¨áª¥, B - ID à ¬¤¨áª 
LD B,C LD HL,1*256 + #4000/.SectorSize
; âãâ ¢ E ª®«¨ç¥á⢮ áâà ­¨æ ¢ à ¬¤¨áª¥, B - ID à ¬¤¨áª  LD D,0
LD HL,1*256 + #4000/.SectorSize LD IX,.SectorSize
LD D,0 LD A,%0000'0001 ; removable media
LD IX,.SectorSize RET
RET ;
.SectorSize EQU 512 ;!HARDCODE
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////
RMD_5x_LONG_WRITE: RMD_5x_LONG_WRITE:

View File

@ -388,7 +388,6 @@ IDESPEC: IN A,(SLOT3)
OR B OR B
LD B,A LD B,A
LD A,(IDENTIFY_DEVICE_BUFFER.Capabilities_high) LD A,(IDENTIFY_DEVICE_BUFFER.Capabilities_high)
;BIT 1,A
AND %0000'0010 AND %0000'0010
JR Z,.NONLBA JR Z,.NONLBA
; ;
@ -403,6 +402,12 @@ IDESPEC: IN A,(SLOT3)
LD HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders) LD HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders)
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H
; [ ] removable media
LD A,(IDENTIFY_DEVICE_BUFFER.GeneralConfiguration)
RLCA
AND %0000'0001
LD (IY+IDE.HDD_INIT_TABLE.RemovableMedia),A
;
LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack) LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack)
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A
IF IDE_Optimization IF IDE_Optimization