Определение смены диска в драйве ATAPI.
This commit is contained in:
parent
e5856eef12
commit
69670d7873
Binary file not shown.
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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]
|
||||||
@ -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
|
|
||||||
@ -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:
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user