Определение смены диска в драйве 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
EX AF,AF'
OUT (SLOT3),A
;EX AF,AF'
LD A,%0000'0001 ; removable media
AND A
RET
@ -130,6 +130,7 @@ FDD_5x_DETECT: CALL SAVE_INTERRUPTS.switch_off
PUSH AF
CALL SET_DOS_OFF
POP AF
LD B,%0000'0001 ;bit0=1 removable, bit1=1 drive changed, bit7..2 reserved ; [ ]
JP SAVE_INTERRUPTS.restore
;RET

View File

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

View File

@ -107,6 +107,7 @@ HDD_5x_GETMED:
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(IY+IDE.HDD_INIT_TABLE.RemovableMedia)
LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
LD H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber)
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 IX,512 ;!HARDCODE sector size
EX AF,AF'
OUT (SLOT3),A
;AND A
OUT (SLOT3),A
EX AF,AF'
RET
;[]================================================================[#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
HDD_5x_DETECT:
LD C,IDE.Device.HDD
JP DRV_DETECT
JP CD_5x_DETECT.shared
;[]================================================================[#57]

View File

@ -67,32 +67,30 @@ SELECT_DRIVE:
; - 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.BadNumber
RET
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

View File

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

View File

@ -388,7 +388,6 @@ IDESPEC: IN A,(SLOT3)
OR B
LD B,A
LD A,(IDENTIFY_DEVICE_BUFFER.Capabilities_high)
;BIT 1,A
AND %0000'0010
JR Z,.NONLBA
;
@ -403,6 +402,12 @@ IDESPEC: IN A,(SLOT3)
LD HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders)
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L
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 (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A
IF IDE_Optimization