Estex-DSS/DSS/drivers/media/ata_atapi-drv.asm
Tolik b38d6ccd48 removed #55aa for GenIOCTL
new subfunction GetMoreParams for GenIOCTL
2026-03-27 00:16:01 +10:00

1053 lines
23 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;!TODO ¯à¨¢¥á⨠ª ®¡é¥¬ã ¢¨¤ã ¢ ®¤­ã ¨­áâàãªæ¨î, ¯à®¢¥à¨âì ª®à४⭮áâì
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
;R02 06-08-2001 DNS Secondary IDE
;R01 06-08-2001 DNS Fixed BUG with partitions on Second hard disk
;---------------------------------------------------------------
;
; Disk Driver Specification ver. 2.20
;[]===========================================================[0]
;Procedure: Initialization
;
;Function: Initialization device(s)
;
;Input: C = #00
; IX = Environment
;
;Output: A = Amount drive support
;[]===========================================================[0]
;[]===========================================================[1]
;Procedure: Open
;
;Function: Open disk
;
;Input: C = #01
; A = Drive
;
;Output: None
;[]===========================================================[1]
;[]===========================================================[2]
;Procedure: Close
;
;Function: Close disk
;
;Input: C = #02
; A = Drive
;
;Output: None
;[]===========================================================[2]
;[]===========================================================[3]
;Procedure: Media check
;
;Function: Checking change line
;
;Input: C = #03
; A = Drive
;
;Output: A = #00 disk no changed
; #FF disk changed
;[]===========================================================[3]
;[]===========================================================[4]
;Procedure: Get BPB
;
;Function: Get Block Parameters BIOS
;
;Input: C = #04
; A = Drive
; DE = Address
;
;Output: None
;[]===========================================================[4]
;[]===========================================================[5]
;Procedure: Read
;
;Function: Read from disk
;
;Input: C = #05
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
; A = Drive
;
;Output: None
;[]===========================================================[5]
;[]===========================================================[6]
;Procedure: Write
;
;Function: Write to disk
;
;Input: C = #06
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
;
;Output: None
;[]===========================================================[6]
;[]===========================================================[7]
;Procedure: Removable
;
;Function: Checking change line
;
;Input: C = #07
; A = Drive
;
;Output: A = #00 Removable
; A = #FF Non-removable
;[]===========================================================[7]
;[]===========================================================[8]
;Procedure: Generic IOCTL
;
;Function: Generic Input Output Control
;
;Input: C = #08
; B = Subcommand
; A = Drive
;
;Subcommands: #00 - Get Device Parameters
; #01 - Read track
; #02 - Test track
; #80 - Set Device Parameters
; #81 - Write track
; #82 - Format track
;Output:
;[]===========================================================[8]
;[]===========================================================[9]
;Procedure: Read Long
;
;Function: Reading sectors from disk
;
;Input: C = #0A
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
; A' = Page
;
;Output: A' = Next Page
; HL:IX = Next Logical Block (sector)
; DE = Next Address
;[]===========================================================[9]
;[]===========================================================[10]
;Procedure: Write Long
;
;Function: Writing sectors to disk
;
;Input: C = #0B
; HL:IX = Logical Block (sector)
; DE = Address
; B = Sector count
; A' = Page
;
;Output: A' = Next Page
; HL:IX = Next Logical Block (sector)
; DE = Next Address
;[]===========================================================[10]
;
; Errors:
; 0 (#00) - NO ERRORS
; 1 (#01) - BAD COMMAND
; 2 (#02) - BAD DRIVE NUMBER
; 3 (#03) - UNKNOW FORMAT
; 4 (#04) - NOT READY
; 5 (#05) - SEEK ERROR
; 6 (#06) - SECTOR NOT FOUND
; 7 (#07) - CRC ERROR
; 8 (#08) - WRITE PROTECT
; 9 (#09) - READ ERROR
; 10 (#0A) - WRITE ERROR
; 11 (#0B) - FAILURE
; 12 (#0C) - BUSY (DEVICE OPENED)
; 13 (#0D) - RESERVED
; IDE0 EQU #0C1C0
; IDE1 EQU #0C1C8
MODULE IDE_DRV
PARTITION_BUFFER _sBOOT_SECTOR = #C000
ATAPI_BUFFER _sCDFS_PRIMARY_VOLUME_DESCRIPTOR = #C000
API_TABLE: INC C
DEC C
JP Z,Init ; [ ] ; c=0 Initialization
DEC C
JP Z,Open ; [ ] ; c=1 open
DEC C
JP Z,Close ; [ ] ; c=2 close
DEC C
JP Z,MediaCheck ; [ ] ; c=3 media check (ᬥ­  ­®á¨â¥«ï)
DEC C
JP Z,GetBPB ; [ ] ; c=4 get BPB
DEC C
JP Z,Read ; [ ] ; c=5 read (ç⥭¨¥ ᥪâ®à®¢)
DEC C
JP Z,Write ; [ ] ; c=6 write (§ ¯¨áì ᥪâ®à®¢)
DEC C
JP Z,Removable ; [ ] ; c=7 Removable
DEC C
JP Z,GenIOCTL ; [ ] ; c=8 ã§­ âì £¥®¬¥âà¨î ¤¨áª  Generic IOCTL
DEC C
JP Z,.Reserved ; [ ] ; c=9 Reserved
DEC C
JP Z,ReadLong ; [ ] ; c=10 Read Long
DEC C
JP Z,WriteLong ; [ ] ; c=11 Write Long
;
.Reserved: LD A,BIOS.Error.InvalidSubFunction
SCF
RET
////////////////////////////////////////////////////////////////////////
// Commands for restart #18 //
////////////////////////////////////////////////////////////////////////
;--------------------------------------------------------------------[v]
; c=0 Initialization
Init: PUSH IY
;!TEST ;[ ] ¤«ï rescanDRV
XOR A
LD (.count),A
;
LD HL,DRIVES_DRIVER.LOGDRV
LD (LOGDRV_OFFSET),HL
LD IX,SYS_PAGE.TMP_BUFFER
LD C,BIOS.DRV_LIST
RST ToBIOS
; DRV_LIST:
; +0 LEN
; +1 FDD COUNT
; +2 ATA COUNT
; +3 ATAPI COUNT
; +4 RESERVED (14)
;
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(IX+3) ;ª®«¨ç¥á⢮ ATAPI ¤«ï ¯à®æ¥¤ãàë NX_DVCI
AND A
PUSH AF
XOR A
LD B,(IX+2) ;ª®«¨ç¥á⢮ ATA ¤«ï ¯à®æ¥¤ãàë NX_DVCI
CP B
LD A,C
OUT (SLOT3),A
JR Z,.NO_HARDS
LD C,DRIVE_CODES.SPRINTER.ATA
CALL .NX_DVCI
;
.NO_HARDS: POP AF
JR Z,.skip_atapi
;
LD B,A
LD C,DRIVE_CODES.SPRINTER.ATAPI
CALL .NX_DVCI
;
.skip_atapi: POP IY
.count+1: LD A,0
;
AND A
RET
;
.NX_DVCI: PUSH BC
LD A,C
LD (CURRENT_DRIVE.Number),A
LD C,BIOS.DRV_DETECT ;[ ] media change ¯¥à¥¤¥« âì «®£¨ªã âãâ ¨ ¢ ¡¨®á? ; !FIXIT
RST ToBIOS
CALL C,.check_error
CALL NC,DEFINE_PARTITIONS
.skip: POP BC
INC C
JR C,.NX_DVCI
DJNZ .NX_DVCI
RET
;
.check_error: XOR BIOS.Error.BadNumber ; â ª ­ ¤®
RET NZ
SCF
RET
;---------------------------------------------------------------------[^]
;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
;+01 LONG SECTOR OFFSET
;+05 LONG SIZE IN SECTORS
;+09 BYTE PARTITION RECORD NUMBER (in drive MBR)
;+10 WORD Sector Size
;+12 BYTE Removable Media Byte flags
;+13_15 FREE
;
; A - HDD LOG NUMBER
SelectDrive.NoSector:
LD HL,0
LD IX,0
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
SelectDrive: PUSH DE
PUSH HL
;
LD L,A
ADD 0 - DSS_MAX_DRIVES_AMOUNT - 1
LD A,BIOS.Error.UnknownDevice
JR C,.error_pop
;
LOGDRV_ENTRY_FIND @DRIVES_DRIVER.LOGDRV
;
POP HL
CALL .get_data
JR C,.error_pop2
;
POP DE
LD A,(IY+DRIVES_DRIVER.LOGDRV.PHISICAL_DRV_NUMBER)
RET
;
.error_pop: POP HL
.error_pop2: POP DE
RET
;
.get_data: ; [ ] custom sector size
CALL CHECK_IDE_SECTOR_SIZE
LD A,BIOS.Error.UnknownDevice
RET C
;
LD E,(IY+DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET)
LD D,(IY+DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET+1)
ADD IX,DE
LD E,(IY+DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET+2)
LD D,(IY+DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET+3)
ADC HL,DE
LD A,BIOS.Error.SectorNotFound
RET
GetMoreParams: PUSH IX
PUSH IY
LD L,A
LD IY,@DRIVES_DRIVER.LOGDRV
CALL @GET_LOGDRV_ENTRY
LD H,(IY + DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 3)
LD L,(IY + DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 2)
LD D,(IY + DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 1)
LD E,(IY + DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 0)
POP IY
POP IX
RET
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 03 - GET MORE DEVICE PARAMETERS
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
GenIOCTL: BIT 7,B
JR NZ,.Set
INC B
DEC B
JR Z,GetParams
DEC B
JR Z,.error ;ReadTrack
DEC B
JR Z,TestTRK
DEC B
JR Z,GetMoreParams
LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;
.Set: RES 7,B
INC B
DEC B
RET Z ;SetParams
DEC B
JR Z,.error ;WriteTrack
DEC B
JR Z,.error
LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;
.error: LD A,BIOS.Error.Failure
SCF
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;CHECK SECTOR
TestTRK: LD C,BIOS.DRV_VERIFY
JP Exec_BIOS
; HL:DE - SECTORS ON LOGICAL DISK
; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
; HL' - CYLINDERS ON PHISICAL DISK
; DE' - HEADS ON PHISICAL DISK
; BC' - SECTORS PER TRACK ON PHISICAL DISK
; A' - PHISICAL DRIVE NUMBER
; A - DRIVE/HEAD REGISTER PHISICAL DISK:
; bit7 - reserved "1"
; bit6 - ADDRESSING MODE LBA/CHS
; bit5 - reserved "1"
; bit4 - DEVICE MASTER/SLAVE
; bit3 - reserved "0" (MAY BE OTHER)
; bit2 - reserved "0" (MAY BE OTHER)
; bit1 - reserved "0" (MAY BE OTHER)
; bit0 - Primary/Secondary Chanel
; B - ;[ ] sector size ;!TODO
; 00 - undefined
; 01 - 128 bytes
; 02 - 256 bytes
; 04 - 512 bytes
; 08 - 1024 bytes
; 16 - 2048 bytes
; 32 - 4096 bytes
; 64 - 8192 bytes
; 128 - 16384 bytes
GetParams: ;EX DE,HL
;LD BC,Dss.DRV.GenIOCTL.Enter
;AND A
;SBC HL,BC
LD L,A
;LD A,BIOS.Error.Failure
;SCF
;RET NZ
;
PUSH IX
PUSH IY
;
;LOGDRV_ENTRY_FIND @DRIVES_DRIVER.LOGDRV
LD IY,@DRIVES_DRIVER.LOGDRV
CALL GET_LOGDRV_ENTRY
;
LD A,(IY+DRIVES_DRIVER.LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
PUSH IY
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
POP IY
JR C,.error
;
; CP BIOS.Error.BadNumber
; SCF
; JR Z,.error
; LD A,BIOS.Error.NotReady
; JR .error
;
; [ ] media change - ã¡à âì ;!FIXIT
.next: EX AF,AF'
JR NC,.NoMediaChange
CP BIOS.Error.ATAPI.UnitAttention
JR Z,.ReDEFINE
;SCF
;JR NZ,.NoMediaChange
;
PUSH HL
PUSH DE
AND A
LD DE,#FFFF
LD L,(IY+DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS+0)
LD H,(IY+DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS+1)
SBC HL,DE
JR NZ,.ReDEFINE_SP
;
LD L,(IY+DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS+2)
LD H,(IY+DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS+3)
SBC HL,DE
JR Z,.ReDEFINE_Skip
;
;
.ReDEFINE: PUSH HL
PUSH DE
.ReDEFINE_SP: PUSH IX
PUSH IY
PUSH BC
CALL ReDEFINE_PARTITIONS
POP BC
POP IY
POP IX
.ReDEFINE_Skip: POP DE
POP HL
;
.NoMediaChange: ; ¯¥à¥â á®¢ª  ॣ¨áâ஢ á १ã«ìâ â®¬ ®â BIOS
EX DE,HL
LD C,E
LD E,D
LD D,0
LD A,B
LD B,D
EXX
;[ ] 04/01/2025 ¢®§¢à é¥­¨¥ à §¬¥à  ᥪâ®à 
EX AF,AF'
LD A,XH
LD E,XL
RL E
RLA
;
; SECTORS ON LOGICAL DISK
LD E,(IY+DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS+0)
LD D,(IY+DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS+1)
LD L,(IY+DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS+2)
LD H,(IY+DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS+3)
;
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD C,(IY+DRIVES_DRIVER.LOGDRV.PARTITION_RECORD_NUM) ; ­®¬¥à ¯ àâ¨æ¨¨ ¢ MBR ¤¨áª 
;
;[ ] 04/01/2025 ¢®§¢à é¥­¨¥ à §¬¥à  ᥪâ®à 
; 00 - undefined
; 01 - 128 bytes
; 02 - 256 bytes
; 04 - 512 bytes
; 08 - 1024 bytes
; 16 - 2048 bytes
; 32 - 4096 bytes
; 64 - 8192 bytes
; 128 - 16384 bytes
;EX AF,AF'
LD B,A
;
LD A,(IY+DRIVES_DRIVER.LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
EX AF,AF'
;
AND A
.error: POP IY
POP IX
RET
;
Removable: XOR A
INC A
RET
Close: XOR A
RET
;!TODO ¯®ª  Open ­¨ç¥£® ­¥ ¤¥« ¥â ªà®¬¥ ¯à®¢¥àª¨ MediaCheck
Open: CALL MediaCheck
RET Z
RET C
;!TODO ???
;CALL READ_PARTITION_PARAMETERS
;
INC A
RET NZ
LD A,BIOS.Error.ATAPI.UnitAttention
SCF
RET
;
;[ ] media changed - bios 5x DETECT
MediaCheck: PUSH IY
CALL SelectDrive.NoSector
JR NC,.next_step
;
CP BIOS.Error.UnknownDevice
JR NZ,.exit
; A != 0
AND A ; á¡à®á ZF
SCF
; [ ] media changed
.next_step: PUSH AF ; ‘®å࠭塞 CF ¨ ª®¤ ®è¨¡ª¨ UNKNOWN_FORMAT, ¥á«¨ CF=1
LD A,(IY +DRIVES_DRIVER.LOGDRV.PHISICAL_DRV_NUMBER)
LD C,BIOS.DRV_GET_PAR ;[ ] media change ¯¥à¥¤¥« âì «®£¨ªã âãâ ¨ ¢ ¡¨®á? ; !FIXIT
PUSH IY
RST ToBIOS
POP IY
EX AF,AF'
JR NC,.next_check
;
CP BIOS.Error.ATAPI.UnitAttention
JR Z,.Reinit
POP BC ; <20> « ­á á⥪ 
.exit: SCF
POP IY
RET
;
.next_check: BIT 1,(IY +DRIVES_DRIVER.LOGDRV.MediaParameters)
JR NZ,.Reinit
;
POP AF ; ‚®ááâ ­ ¢«¨¢ ¥¬ CF ¨ ª®¤ ®è¨¡ª¨ UNKNOWN_FORMAT, ¥á«¨ CF=1
POP IY
RET C
XOR A
RET
;
.Reinit: PUSH IY
CALL ReDEFINE_PARTITIONS
POP IY
POP AF ; ‚®ááâ ­ ¢«¨¢ ¥¬ CF ¨ ª®¤ ®è¨¡ª¨ UNKNOWN_FORMAT, ¥á«¨ CF=1
CALL C,SelectDrive.get_data
POP IY
JR NC,.no_errors
;
CP BIOS.Error.UnknownDevice
JR NZ,.no_errors
AND A ; á¡à®á ZF
SCF
RET
;
.no_errors: LD A,#FF ;!HARDCODE drive changed
OR A
RET
; [ ] custorm sector size
CHECK_IDE_SECTOR_SIZE: ;RET
LD E,(IY+DRIVES_DRIVER.LOGDRV.SECTOR_SIZE)
LD D,(IY+DRIVES_DRIVER.LOGDRV.SECTOR_SIZE+1)
PUSH HL
LD HL,-DSS_MAX_SECTOR_SIZE - 1
ADD HL,DE
POP HL
RET
;
ReDEFINE_PARTITIONS:
EX AF,AF'
LD B,A ; HDD_INIT_TABLE.RemovableMedia
LD A,DSS_MAX_DRIVES_AMOUNT - 1 ; ®£à ­¨ç¨â¥«ì, ç⮡ ­¥ ¤¥â¥ªâ¨âì ¡®«ìè¥ 1 à §¤¥« 
LD (Init.count),A
LD A,(IY +DRIVES_DRIVER.LOGDRV.PHISICAL_DRV_NUMBER)
LD (CURRENT_DRIVE.Number),A
LD (LOGDRV_OFFSET),IY
;RES 1,(IY +DRIVES_DRIVER.LOGDRV.MediaParameters) - á¡à á뢠¥âáï ¢ DEFINE_PARTITIONS
;LD B,%0000'0011 ;!HARDCODE drive changed, removable media
JP DEFINE_PARTITIONS
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;READ SECTOR
; DE - ADDRESS
; A - DRIVE
GetBPB: ; !FIXIT ¢ë¡¨à âì §­ ç¥­¨ï ¨áå®¤ï ¨§ ⨯  ¤à ©¢  ¨«¨ ¥éñ 祣®-­¨¡ã¤ì
LD HL,0
LD IX,0
LD B,1
JR Read
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
; A - HDD LOG NUMBER
;READ SECTOR
ReadLong: LD C,BIOS.DRV_READ_LONG
JP Exec_BIOS
;!FIXIT debug zip
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
; A - HDD LOG NUMBER
;WRITE SECTOR
; WriteLong: LD C,BIOS.DRV_WRITE_LONG
; JP Exec_BIOS
WriteLong: LD C,BIOS.DRV_WRITE_LONG
JP Exec_BIOS
;!FIXIT debug zip
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;WRITE SECTOR
Write: LD C,BIOS.DRV_WRITE
JP Exec_BIOS
; Write: LD C,BIOS.DRV_WRITE
; .loop: PUSH HL
; PUSH IX
; PUSH DE
; PUSH BC
; PUSH AF
; CALL Exec_BIOS
; JR NC,.good
; JR Z,.good
; ;
; POP AF
; POP BC
; POP DE
; POP IX
; POP HL
; JR .loop
; ;
; .good: EXX
; POP DE
; POP DE
; POP DE
; POP DE
; POP DE
; EXX
; RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;READ SECTOR
Read: LD C,BIOS.DRV_READ
;
Exec_BIOS: PUSH IY
CALL .exec
POP IY
RET
;
.exec: CALL SelectDrive
RET C ;!FIXIT ¯¥à¥¤¥« âì ­®¬¥à ®è¨¡ª¨ á ¤à ©¢¥à  ­  ¤®á
PUSH IY
RST ToBIOS
POP IY
RET NC
CP BIOS.Error.ATAPI.UnitAttention
SCF
RET NZ
SET 1,(IY +DRIVES_DRIVER.LOGDRV.MediaParameters)
RET
;
;------------------------------[ PARTIT ]------------------------------;
; ¢å®¤: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved
DEFINE_PARTITIONS:
IN A,(SLOT3)
PUSH AF
LD A,SHARED_PAGE
OUT (SLOT3),A
LD A,(Init.count) ; [ ] for ZIP disk A:
PUSH AF ; [ ] for ZIP disk A:
CALL .Start
; [ ] for ZIP disk A:
LD A,(Init.count)
LD B,A
POP AF
CP B
CALL Z,.Check_0_BPB
;
POP AF
OUT (SLOT3),A
RET
;
.FAT32_DOS:
.EASYDOS:
.MEDIDOS:
.HIGHDOS:
LD E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0)
LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1)
LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2)
LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3)
LD IX,(CURRENT_SECTOR.Low)
ADD IX,DE
LD DE,(CURRENT_SECTOR.High)
ADC HL,DE
LD D,XH
LD E,XL
;BPB SECTOR
LD IX,(LOGDRV_OFFSET)
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 0),E
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 1),D
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 2),L
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 3),H
LD E,(IY + BOOT_SECTOR.Partition.Size_LBA + 0)
LD D,(IY + BOOT_SECTOR.Partition.Size_LBA + 1)
LD L,(IY + BOOT_SECTOR.Partition.Size_LBA + 2)
LD H,(IY + BOOT_SECTOR.Partition.Size_LBA + 3)
;SIZE DISK
LD (IX +DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS + 0),E
LD (IX +DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS + 1),D
LD (IX +DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS + 2),L
LD (IX +DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS + 3),H
; [ ] sector size
CALL GetSectorSize
LD IX,(LOGDRV_OFFSET)
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_SIZE),C
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_SIZE + 1),B
LD A,(CURRENT_DRIVE.Removable)
LD (IX +DRIVES_DRIVER.LOGDRV.MediaParameters),A
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
.ExtendedPartitionFlag+1:
LD A,0
OR A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
LD A,#FF
JR NZ,.not_supported ; ¥á«¨ à áè¨à¥­­ë© à §¤¥«, â® ®¡«®¬
;
POP BC
PUSH BC
LD A,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table
SUB B
.not_supported: LD (IX +DRIVES_DRIVER.LOGDRV.PARTITION_RECORD_NUM),A
;
CALL INC_DRV_COUNT
RET NC
;
CALL .set_drv_tbl
JP .NextPartition
;
.NotExtended: CP PartitionSysTypes.FAT16
JR Z,.HIGHDOS
CP PartitionSysTypes.FAT16_LBA
JP Z,.HIGHDOS
CP PartitionSysTypes.FAT16_32Mb
JP Z,.MEDIDOS
CP PartitionSysTypes.FAT12
JP Z,.EASYDOS
;[ ] fat32
CP PartitionSysTypes.FAT32
JP Z,.FAT32_DOS
CP PartitionSysTypes.FAT32_LBA
JP Z,.FAT32_DOS
;
CP PartitionSysTypes.Win_Ext_LBA
JP Z,.SubLevel
JP .NextPartition ; à §¤¥« ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
;
.set_drv_tbl: LD A,(CURRENT_DRIVE.Number)
LD (IX +DRIVES_DRIVER.LOGDRV.PHISICAL_DRV_NUMBER),A
LD DE,DRIVES_DRIVER.LOGDRV.TBL_Entry ;DSKITEM
ADD IX,DE
LD (LOGDRV_OFFSET),IX
RET
;
.CDFS_TST: ;JR .check_atapi ;!FIXIT CDFS
;SCF
;RET
.check_atapi: LD A,(CURRENT_DRIVE.Number)
;LD B,A
AND #F0
CP DRIVE_CODES.SPRINTER.ATAPI
SCF
;RET NZ
PUSH AF
;
CALL GetSectorSize
CALL .set_LOGDRV
POP AF
RET NZ ; १ã«ìâ â CP DRIVE_CODES.SPRINTER.ATAPI
; ¤«ï ¯à ¢¨«ì­®£® ¢ë室  ¨§ ¯ àá¥à  à §¤¥«®¢
LD B,1
PUSH BC
;§ £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD A,#FF ; ¤«ï ¯à®¯ã᪠ .tst_zipNoMBR ¨ § ¯¨á¨ ¢ LOGDRV.PARTITION_RECORD_NUM
LD (CURRENT_SECTOR.Low),A
JP .not_supported
;
.set_LOGDRV: ;BPB SECTOR ;!TODO ¥á«¨ CD-ROM, â® ¤à㣮© ­®¬¥à ᥪâ®à 
LD IX,(LOGDRV_OFFSET)
LD A,(CURRENT_DRIVE.Removable)
LD (IX +DRIVES_DRIVER.LOGDRV.MediaParameters),A
XOR A
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 0),A
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 1),A
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 2),A
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_OFFSET + 3),A
; [ ] SIZE DISK
LD (IX +DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS + 0),E
LD (IX +DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS + 1),D
LD (IX +DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS + 2),L
LD (IX +DRIVES_DRIVER.LOGDRV.SIZE_IN_SECTORS + 3),H
; [ ] sector size
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_SIZE),C
LD (IX +DRIVES_DRIVER.LOGDRV.SECTOR_SIZE + 1),B
RET
;
; ¢å®¤: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved
.Start: LD IX,0
LD DE,0
LD A,B
AND %1111'1101
LD (CURRENT_DRIVE.Removable),A
LD (EXT_Partition.Low),DE ;R01
LD (EXT_Partition.High),DE ;R01
;
.LOOP: LD (CURRENT_SECTOR.Low),DE
LD (CURRENT_SECTOR.High),IX
CALL .LOAD_SECTOR
JR C,.check_atapi
;
.check_sign: LD HL,(PARTITION_BUFFER.MBR_SIGNATURE)
LD DE,#AA55
AND A
SBC HL,DE
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
;JR NZ,NODEFIN
; [ ] CDFS
JR NZ,.CDFS_TST
;SCF
;RET NZ
;
; [ ] ¥á«¨ ATAPI, â® ¯à®¡ã¥¬ ¯à®ç¥áâì 0 ᥪâ®à ª ª-¡ã¤â® ­¥â MBR
;LD A,(CURRENT_DRIVE.Number)
;CP DRIVE_CODES.SPRINTER.CDROM
;
LD IY,PARTITION_BUFFER.PARTITION_TABLE ; Offset of partition table in the MBR
LD B,+(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) ; Number of entries in the partition table
.DOSAGA: PUSH BC
LD A,(IY+_sMBR_PARTITION_RECORD.FS_ID)
CP PartitionSysTypes.Extended
JR Z,.SubLevel
CP PartitionSysTypes.Win_Ext_LBA
JP NZ,.NotExtended
;
.SubLevel: PUSH IY
LD DE,(CURRENT_SECTOR.Low)
LD IX,(CURRENT_SECTOR.High)
PUSH DE
PUSH IX
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
LD A,(.ExtendedPartitionFlag)
INC A
LD (.ExtendedPartitionFlag),A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
;
CALL .ParseExtended
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
LD A,(.ExtendedPartitionFlag)
DEC A
LD (.ExtendedPartitionFlag),A ; !TODO § £à㧪  á à áè¨à¥­­®£® à §¤¥«  ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
;
POP IX
POP DE
LD (CURRENT_SECTOR.Low),DE
LD (CURRENT_SECTOR.High),IX
CALL .LOAD_SECTOR
POP IY
.NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry
ADD IY,DE
POP BC
DJNZ .DOSAGA
.exit: AND A
RET
;
.ParseExtended: LD HL,(EXT_Partition.Low)
LD DE,(EXT_Partition.High)
LD A,L
OR H
OR E
OR D
LD E,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 0)
LD D,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 1)
LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2)
LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3)
JP NZ,.ext_in_ext
LD (EXT_Partition.Low),DE
LD (EXT_Partition.High),HL
PUSH DE
JR .set_regs
;
.ext_in_ext: LD IX,(EXT_Partition.Low)
ADD IX,DE
LD DE,(EXT_Partition.High)
ADC HL,DE
PUSH IX
.set_regs: PUSH HL
POP IX
POP DE
JP .LOOP
;
.LOAD_SECTOR: PUSH IY
LD IX,(CURRENT_SECTOR.Low)
LD HL,(CURRENT_SECTOR.High)
LD DE,PARTITION_BUFFER
LD A,(CURRENT_DRIVE.Number)
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
POP IY
RET
;
.Check_0_BPB: LD A,(CURRENT_DRIVE.Number)
CP DRIVE_CODES.SPRINTER.ATAPI
RET C
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
RET C
;
LD B,XH
LD C,XL
CALL .set_LOGDRV
LD A,(CURRENT_DRIVE.Removable)
LD (IX +DRIVES_DRIVER.LOGDRV.MediaParameters),A
LD (IX +DRIVES_DRIVER.LOGDRV.PARTITION_RECORD_NUM),#FF
CALL .set_drv_tbl
JP INC_DRV_COUNT
;
; ; ;
GetSectorSize: PUSH IY
LD A,(CURRENT_DRIVE.Number)
; sector size
LD C,BIOS.DRV_GET_PAR ; [ ] media change § ¬¥­¨âì ­  drv_detect ?
RST ToBIOS
JR NC,.no_err
;
LD IX,#FFFF
.no_err: LD B,XH
LD C,XL
POP IY
RET
;----------------------------------------------------------------------;
;
;!TEST <09>®¤áâà å®¢ª  ®â ¯¥à¥¯®«­¥­¨ï â ¡«¨æë LOGDRV
INC_DRV_COUNT: LD A,(Init.count)
INC A
CP DSS_MAX_DRIVES_AMOUNT+1
RET NC
LD (Init.count),A
RET
;=======================================================================
;=======================================================================
; PHISICAL DRIVE NUMBER
; #80/#81 - primary ¬ áâ¥à/á«¥©¢, #82/#83 - secondary ¬ áâ¥à/á«¥©¢
CURRENT_DRIVE:
.Number: DB #00
.Removable: DB #00
;
CURRENT_SECTOR:
.Low: DW #0000
.High: DW #0000
;
EXT_Partition: ;CURRENT PARTITION TABLE
.Low: DW #0000
.High: DW #0000
;
LOGDRV_OFFSET: DW DRIVES_DRIVER.LOGDRV ;POINTER ON CURRENT DISK RECORD
;=======================================================================
ENDMODULE ;IDE_DRV