Estex-DSS/DSS/drivers/media/atapi-drv.asm
2025-01-16 01:27:59 +10:00

886 lines
18 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
; DE = #55AA Magic Number
; 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,DSS_Error.drv.INVALID_COMMAND
SCF
RET
////////////////////////////////////////////////////////////////////////
// Commands for restart #18 //
////////////////////////////////////////////////////////////////////////
;--------------------------------------------------------------------[v]
; c=0 Initialization
Init: PUSH IY
;!TEST ;[ ] ¤«ï rescanDRV
XOR A
LD (.count),A
;
LD HL,LOGDRV
LD (OFFSECT),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 (DRV_NUM),A
LD C,BIOS.DRV_DETECT
RST ToBIOS
CALL NC,DEFINE_PARTITIONS.BEGIN
POP BC
INC C
JR C,.NX_DVCI
DJNZ .NX_DVCI
RET
;---------------------------------------------------------------------[^]
; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
; ;+01 DWORD SECTOR OFFSET
; ;+05 DWORD SIZE IN SECTORS
; ;+09 FREE
; ;+15
; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0
; .TBL_Entry EQU 16
; .Size EQU $-LOGDRV
SelectDrive: PUSH DE
PUSH HL
;
LD L,A
;
LOGDRV_ENTRY_FIND LOGDRV
;
; [ ] custorm sector size
CALL CHECK_IDE_SECTOR_SIZE
RLA
;
;
LD E,(IY+LOGDRV.SECTOR_OFFSET)
LD D,(IY+LOGDRV.SECTOR_OFFSET+1)
ADD IX,DE
LD E,(IY+LOGDRV.SECTOR_OFFSET+2)
LD D,(IY+LOGDRV.SECTOR_OFFSET+3)
POP HL
ADC HL,DE
; [ ] custom sector size
;JR C,.exit
RRA
;
.exit: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER)
POP DE
RET NC
LD A,DSS_Error.drv.UNKNOWN_FORMAT
RET
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 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
LD A,DSS_Error.drv.INVALID_COMMAND
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,DSS_Error.drv.INVALID_COMMAND
SCF
RET
;
.error: LD A,DSS_Error.drv.GENERAL_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
;LD B,L
;CALL CHECKH
;RET
; HSETPRM: AND A
; RET
; HFRTRAC: LD A,DSS_Error.drv.GENERAL_FAILURE
; SCF
; RET
; 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,#55AA
AND A
SBC HL,BC
LD L,A
LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET NZ
;
PUSH IX
PUSH IY
;
LOGDRV_ENTRY_FIND LOGDRV
;
LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
PUSH IY
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
POP IY
LD A,DSS_Error.drv.INVALID_DRIVE
JR C,.error
; ¯¥à¥â á®¢ª  ॣ¨áâ஢ á १ã«ìâ â®¬ ®â 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+LOGDRV.SIZE_IN_SECTORS+0)
LD D,(IY+LOGDRV.SIZE_IN_SECTORS+1)
LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2)
LD H,(IY+LOGDRV.SIZE_IN_SECTORS+3)
;
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD C,(IY+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+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
Open: XOR A
RET
Close: XOR A
RET
;[ ] media changed - bios 5x DETECT
; ¢ë室 A=#FF - changed, A=0 - not changed, ZF=1 - not changed
MediaCheck: PUSH IY
CALL SelectDrive
JR C,.exit
;
LD A,#FF
BIT 1,(IY + LOGDRV.RemovableMedia)
JR NZ,.exit
;
LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER)
LD C,BIOS.DRV_DETECT
RST ToBIOS
AND %0000'0010
JR Z,.norm_exit
;
ld
; २­¨â ¤à ©¢ 
;
.norm_exit: XOR A
.exit: POP IY
RET
; [ ] custorm sector size
CHECK_IDE_SECTOR_SIZE:
LD E,(IY+LOGDRV.SECTOR_SIZE)
LD D,(IY+LOGDRV.SECTOR_SIZE+1)
LD HL,DSS_MAX_SECTOR_SIZE
AND A
SBC HL,DE
RET
;
;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
JR Read
; PUSH IY
; PUSH DE
; LD L,A
; ;
; LOGDRV_ENTRY_FIND LOGDRV
; ;
; ; [ ] custorm sector size
; CALL CHECK_IDE_SECTOR_SIZE
; JR C,.error
; ;
; LD E,(IY+LOGDRV.SECTOR_OFFSET)
; LD D,(IY+LOGDRV.SECTOR_OFFSET+1)
; LD L,(IY+LOGDRV.SECTOR_OFFSET+2)
; LD H,(IY+LOGDRV.SECTOR_OFFSET+3)
; LD XL,E
; LD XH,D
; LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER)
; POP DE
; POP IY
; LD BC,1*256 + BIOS.DRV_READ
; JP ToBIOS
; ;
; .error: POP DE
; POP IY
; LD A,DSS_Error.drv.UNKNOWN_FORMAT
; RET
;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
; PUSH IY
; CALL SelectDrive
; JR C,.error ; [ ] custorm sector size
; LD C,BIOS.DRV_READ_LONG
; RST ToBIOS
; .error: POP IY
; RET
;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
; PUSH IY
; CALL SelectDrive
; JR C,.error ; [ ] custorm sector size
; LD C,BIOS.DRV_WRITE_LONG
; RST ToBIOS
; .error: POP IY
; RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;WRITE SECTOR
Write: LD C,BIOS.DRV_WRITE
JP Exec_BIOS
; PUSH IY
; CALL SelectDrive
; JR C,.error ; [ ] custorm sector size
; LD C,BIOS.DRV_WRITE
; RST ToBIOS
; .error: POP IY
; RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;CHECK SECTOR
; CHECKH: PUSH IY
; CALL SelectDrive
; LD C,BIOS.DRV_VERIFY
; RST ToBIOS
; POP IY
; 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
RST ToBIOS
RET NC
CP BIOS.Error.ATAPI.UnitAttention
SCF
RET NZ
SET 1,(IY + LOGDRV.RemovableMedia)
RET
;------------------------------[ PARTIT ]------------------------------;
DEFINE_PARTITIONS:
.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_L)
ADD IX,DE
LD DE,(CURRENT_SECTOR_H)
ADC HL,DE
LD D,XH
LD E,XL
;BPB SECTOR
LD IX,(OFFSECT)
LD (IX + LOGDRV.SECTOR_OFFSET + 0),E
LD (IX + LOGDRV.SECTOR_OFFSET + 1),D
LD (IX + LOGDRV.SECTOR_OFFSET + 2),L
LD (IX + 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 + LOGDRV.SIZE_IN_SECTORS + 0),E
LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D
LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L
LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H
;[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 + LOGDRV.PARTITION_RECORD_NUM),A
;
CALL INC_DRV_COUNT
RET NC
;
LD A,(DRV_NUM)
LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A
LD DE,LOGDRV.TBL_Entry ;DSKITEM
ADD IX,DE
LD (OFFSECT),IX
JP .NextPartition
;
.NotExtended: CP PartitionSysTypes.FAT16
JR Z,.HIGHDOS
CP PartitionSysTypes.FAT16_LBA
JR Z,.HIGHDOS
CP PartitionSysTypes.FAT16_32Mb
JR Z,.MEDIDOS
CP PartitionSysTypes.FAT12
JR 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 ; à §¤¥« ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
;
.ATAPI_TST: ;JR .check_atapi ;!FIXIT CDFS
;SCF
;RET
.check_atapi: LD A,(DRV_NUM)
LD B,A
AND #F0
CP DRIVE_CODES.SPRINTER.ATAPI
SCF
RET NZ
;
; No Media
;!TODO sector size
LD A,B
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
JR NC,.no_err
;
LD IX,#FFFF
.no_err: LD D,XH
LD E,XL
;
XOR A
;BPB SECTOR
LD IX,(OFFSECT)
LD (IX + LOGDRV.SECTOR_OFFSET + 0),A
LD (IX + LOGDRV.SECTOR_OFFSET + 1),A
LD (IX + LOGDRV.SECTOR_OFFSET + 2),A
LD (IX + LOGDRV.SECTOR_OFFSET + 3),A
;SIZE DISK
LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),A
LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),A
LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),A
LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),A
; [ ] sector size
LD (IX + LOGDRV.SECTOR_SIZE),E
LD (IX + LOGDRV.SECTOR_SIZE + 1),D
;
; ¤«ï ¯à ¢¨«ì­®£® ¢ë室  ¨§ ¯ àá¥à  à §¤¥«®¢
LD B,1
PUSH BC
;§ £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
DEC A
JR .not_supported
;
.BEGIN: ;CP IDE.Device.HDD
;RET NZ
IN A,(SLOT3)
PUSH AF
LD A,SHARED_PAGE
OUT (SLOT3),A
CALL .Start
POP AF
OUT (SLOT3),A
RET
;
;
.Start: LD IX,0
LD DE,0
LD (EXTDOSL),DE ;R01
LD (EXTDOSH),IX ;R01
;
.LOOP: LD (CURRENT_SECTOR_L),DE
LD (CURRENT_SECTOR_H),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,.ATAPI_TST
;SCF
;RET NZ
;
; [ ] ¥á«¨ ATAPI, â® ¯à®¡ã¥¬ ¯à®ç¥áâì 0 ᥪâ®à ª ª-¡ã¤â® ­¥â MBR
;LD A,(DRV_NUM)
;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_L)
LD IX,(CURRENT_SECTOR_H)
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_L),DE
LD (CURRENT_SECTOR_H),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
AND A
RET
;
.ParseExtended: LD HL,(EXTDOSL)
LD DE,(EXTDOSH)
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 (EXTDOSL),DE
LD (EXTDOSH),HL
PUSH DE
JR .set_regs
;
.ext_in_ext: LD IX,(EXTDOSL)
ADD IX,DE
LD DE,(EXTDOSH)
ADC HL,DE
PUSH IX
.set_regs: PUSH HL
POP IX
POP DE
JP .LOOP
;
.LOAD_SECTOR: PUSH IY
LD IX,(CURRENT_SECTOR_L)
LD HL,(CURRENT_SECTOR_H)
LD DE,PARTITION_BUFFER
LD A,(DRV_NUM)
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
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 ¬ áâ¥à/á«¥©¢
DRV_NUM: DB #00
CURRENT_SECTOR_L: DW #0000
CURRENT_SECTOR_H: DW #0000
EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE
EXTDOSH: DW #0000
OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD
;=======================================================================
ENDMODULE