mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 17:31:47 +03:00
1034 lines
22 KiB
NASM
1034 lines
22 KiB
NASM
;!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,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,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 LOGDRV
|
||
;
|
||
POP HL
|
||
CALL .get_data
|
||
JR C,.error_pop2
|
||
;
|
||
POP DE
|
||
LD A,(IY+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+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)
|
||
ADC HL,DE
|
||
LD A,BIOS.Error.SectorNotFound
|
||
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,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,#55AA
|
||
AND A
|
||
SBC HL,BC
|
||
LD L,A
|
||
LD A,BIOS.Error.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
|
||
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+LOGDRV.SIZE_IN_SECTORS+0)
|
||
LD H,(IY+LOGDRV.SIZE_IN_SECTORS+1)
|
||
SBC HL,DE
|
||
JR NZ,.ReDEFINE_SP
|
||
;
|
||
LD L,(IY+LOGDRV.SIZE_IN_SECTORS+2)
|
||
LD H,(IY+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+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
|
||
|
||
|
||
|
||
|
||
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 + 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 + 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+LOGDRV.SECTOR_SIZE)
|
||
LD D,(IY+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 + LOGDRV.PHISICAL_DRV_NUMBER)
|
||
LD (CURRENT_DRIVE.Number),A
|
||
LD (LOGDRV_OFFSET),IY
|
||
;RES 1,(IY + 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 + 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 + 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
|
||
; [ ] sector size
|
||
CALL GetSectorSize
|
||
LD IX,(LOGDRV_OFFSET)
|
||
LD (IX + LOGDRV.SECTOR_SIZE),C
|
||
LD (IX + LOGDRV.SECTOR_SIZE + 1),B
|
||
LD A,(CURRENT_DRIVE.Removable)
|
||
LD (IX + 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 + 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 + LOGDRV.PHISICAL_DRV_NUMBER),A
|
||
LD DE,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 + LOGDRV.MediaParameters),A
|
||
XOR A
|
||
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),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
|
||
; [ ] sector size
|
||
LD (IX + LOGDRV.SECTOR_SIZE),C
|
||
LD (IX + 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 + LOGDRV.MediaParameters),A
|
||
LD (IX + 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 LOGDRV ;POINTER ON CURRENT DISK RECORD
|
||
;=======================================================================
|
||
|
||
ENDMODULE |