Смена носителя в драйве ATAPI должна обрабатываться корректно

This commit is contained in:
Tolik 2025-01-17 23:17:05 +10:00
parent d4911f7c45
commit a35f7e81f2
13 changed files with 305 additions and 971 deletions

View File

@ -200,7 +200,6 @@ CONTINUE: LD HL,0
LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
CP #20 + 1 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢
JP NC,INC_SECTOR_NUM
;CALL R_F_FAT ; next cluster in chain
CALL READ_FROM_FAT ; next cluster in chain
EX DE,HL
EXX
@ -222,7 +221,6 @@ RUN_CORE: DI
OUT (C),A
;
;DOS LOADED
;IF UNIVERSAL_BOOT
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD A,(DRIVE+1) ; ­®¬¥à à §¤¥« 
LD L,A
@ -243,27 +241,6 @@ RUN_CORE: DI
RST ToDSS
;
LD BC,Dss.BootDSK.Get
;ELSE
; IF ORIGINAL_DSS
; LD C,Dss.Version
; RST ToDSS
; ELSE
; LD A,(DRIVE)
; LD C,Dss.Version
; RST ToDSS
; JP C,FAIL.NULL
; LD C,Dss.BootDSK
; ENDIF ;
; LD HL,MESSAGES.STARTDO
; CALL MESSAGE
; IF ORIGINAL_DSS
; LD A,(DRIVE)
; LD BC,Dss.BootDSK.Set
; RST ToDSS
; LD B,Dss.BootDSK.Get
; ENDIF
;ENDIF
;
RST ToDSS
;
ADD A,"A"

View File

@ -59,7 +59,7 @@ DISKINF: LD C,B
;;;;
;
EX DE,HL
LD HL,FAT_STRING
LD HL,FAT_STRING ;!HARDCODE FAT FS
LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length
CALL .mCOPY_LOOP
; 12, 16 or 32
@ -114,12 +114,16 @@ DISKINF: LD C,B
LD (DE),A ;­®¬¥à à §¤¥«  ¤¨áª 
INC DE
;
.error_drv: XOR A
.error_drv: EX AF,AF'
XOR A
LD (DE),A
;;;;
POP BC
POP AF
POP DE
EX AF,AF'
JR C,.error
EX AF,AF'
.error: POP HL
RET
;

View File

@ -186,15 +186,13 @@ OPENDSK: ;!TEST DRV.Open
LD C,A
LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
CP C
IF CHECK_DRIVE_CHANGE
JR NZ,.open
PUSH BC
LD C,Dss.DRV.MediaCheck
RST ToDSS.DRV
POP BC
ENDIF
JR Z,.exit
;
.open: LD A,C
;
.force: PUSH AF
@ -238,9 +236,11 @@ OPENDSK: ;!TEST DRV.Open
;
LD (CORE_BUFFERS.FatBuffer.DRIVE),A
CALL OPENDSK.force
JR NC,.err_exit
;
LD A,(BOOTDSK.NUM)
LD (CORE_BUFFERS.FatBuffer.DRIVE),A
CALL C,OPENDSK.force
CALL OPENDSK.force
;
.err_exit: LD A,(CORE_BUFFERS.FatBuffer.DRIVE)
ADD 'A'

View File

@ -232,15 +232,14 @@ INITDVC_RET_DRIVE:
AND A
RET
INCLUDE 'dss/Drivers/media/shared-drv.asm'
INCLUDE 'dss/Drivers/media/atapi-drv.asm'
;INCLUDE 'dss/Drivers/media/ide-drv.asm'
INCLUDE 'dss/Drivers/media/shared.asm'
INCLUDE 'dss/Drivers/media/ata_atapi-drv.asm'
INCLUDE 'dss/Drivers/media/fdd-drv.asm'
INCLUDE 'dss/Drivers/media/ram_disk-drv.asm'
INCLUDE "dss/Drivers/input/MOUSE.ASM"
/////////////////////////// [ DRIVE TABLES ] \\\\\\\\\\\\\\\\\\\\\\\\\\\;
;
;------------------------[shared-drv.asm table]------------------------;
;--------------------------[shared.asm table]--------------------------;
DEVICE EQU $
.TBL_Entry EQU 3
.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry
@ -249,13 +248,14 @@ DEVICE EQU $
;
;
;-------------------------[ IDE-DRV.ASM table]-------------------------;
;--------------------------[shared.asm table]--------------------------;
;+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 FREE
;+12 BYTE Removable Media Byte flags
;+13_15 FREE
;
LOGDRV EQU DEVICE + DEVICE.End
.TBL_Entry EQU 16
@ -307,7 +307,7 @@ RAMDTBL EQU LOGDRV + LOGDRV.Size
///////////////////////// [ DRIVE TABLES COPY] \\\\\\\\\\\\\\\\\\\\\\\\\;
MODULE OLD_TABLES
;
;------------------------[shared-drv.asm table]------------------------;
;--------------------------[shared.asm table]--------------------------;
DEVICE EQU @RAMDTBL + @RAMDTBL.Size
.TBL_Entry EQU @DEVICE.TBL_Entry
.Size: EQU @DEVICE.Size
@ -316,7 +316,7 @@ DEVICE EQU @RAMDTBL + @RAMDTBL.Size
;
;
;-------------------------[ IDE-DRV.ASM table]-------------------------;
;--------------------------[shared.asm table]--------------------------;
;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
;+01 LONG SECTOR OFFSET
;+05 LONG SIZE IN SECTORS

View File

@ -696,7 +696,8 @@ RD_BPB: ; LD C,SLOT3
; POP BC
; OUT (C),B
CALL READ_BPB
JP C,DOS_X_Error.Not_ready
;JP C,DOS_X_Error.Not_ready
RET C
;
LD DE,#AA55 ; ᨣ­ âãà  ;R05
LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07
@ -1159,9 +1160,9 @@ DOS_X_Error:
SCF
RET
;
.Not_ready: LD A,DSS_Error.sys.NOT_READY
; CF = 1
RET
; .Not_ready: LD A,DSS_Error.sys.NOT_READY
; ; CF = 1
; RET
;
;
;!TODO ª ¡ãä¥à ¬!
@ -2446,7 +2447,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX
CALL SET_NEW_FREE_CLUSTERS
;
CALL WRITE_TO_FAT
;!TEST ;!TODO 2/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE?
; 02/12/23 ; [ ] ¡ £ á ¨§¡ëâ®ç­®© § ¯¨áìî WRITE_FAT_TABLE?
;PUSH HL
;CALL WRITE_FAT_TABLE ; ¯®¤ª«. ¡ ­ªã ª¥è  FAT ¨ § ¯¨á âì ¥£® ­  ¤¨áª
;POP HL

View File

@ -1 +1 @@
0
3

View File

@ -101,7 +101,6 @@ DSS_MAX_DRIVES_AMOUNT EQU 26
DEFINE TABisSPACES 0
DEFINE EnoughtOnly_LF 0
DEFINE MINIMUM_BIOS_VERSION 2*256 + 55 ; version 2.55
DEFINE CHECK_DRIVE_CHANGE 1 ; 1 - â®à¬®§­¥¥, ­® ¡¥§®¯ á­¥¥
DEFINE NON_REMOVABLE_FDD 0
;
DEFINE OLD_DSS_FOR_OLD_EXE 0 ; !TODO

View File

@ -135,7 +135,7 @@ INITDVC: XOR A
CALL FDD_DRV.Init ; ã§­ âì ç¨á«® FDD-¤¥¢ ©á®¢
LD DE,FDD_DRV.API_TABLE ;  ¤à¥á ®¡à ¡®â稪  ⥪. ¤¥¢ ©á 
CALL MAKEDVC ; ¨­¨æ. â ¡«¨æã ¯¥à¥å®¤®¢
; HDD 、・「<EFBDA5>ゥ硴
; IDE ¤¥¢ ©áë
.if_old: CALL IDE_DRV.Init ; ¥á«¨ ­  áâ à⥠¢¥àá¨ï BIOS ­¥ ¯®¤å®¤¨â, â® £à㧨âìáï ¬®¦­® ⮫쪮 á ¤¨áª¥âë, ¤«ï í⮣® âãâ § ¬¥­  ª®¤  ­  XOR A : RET
LD DE,IDE_DRV.API_TABLE
CALL MAKEDVC

View File

@ -224,7 +224,7 @@ Init: PUSH IY
LD (.count),A
;
LD HL,LOGDRV
LD (OFFSECT),HL
LD (LOGDRV_OFFSET),HL
LD IX,SYS_PAGE.TMP_BUFFER
LD C,BIOS.DRV_LIST
@ -268,10 +268,10 @@ Init: PUSH IY
;
.NX_DVCI: PUSH BC
LD A,C
LD (DRV_NUM),A
LD (CURRENT_DRIVE.Number),A
LD C,BIOS.DRV_DETECT
RST ToBIOS
CALL NC,DEFINE_PARTITIONS.BEGIN
CALL NC,DEFINE_PARTITIONS
POP BC
INC C
JR C,.NX_DVCI
@ -279,14 +279,13 @@ Init: PUSH IY
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
;+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
SelectDrive: PUSH DE
PUSH HL
;
@ -358,19 +357,8 @@ GenIOCTL: BIT 7,B
;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
@ -415,8 +403,36 @@ GetParams: EX DE,HL
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
POP IY
JR NC,.next
;
CP BIOS.Error.ATAPI.NotReady
SCF
LD A,DSS_Error.drv.NOT_READY
JR Z,.error
LD A,DSS_Error.drv.INVALID_DRIVE
JR C,.error
JR .error
; [ ] media change
.next: EX AF,AF
JR C,.NoMediaChange
CP BIOS.Error.ATAPI.UnitAttention
JR NZ,.NoMediaChange
;
PUSH IX
PUSH IY
PUSH HL
PUSH DE
PUSH BC
LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER)
LD (CURRENT_DRIVE.Number),A
LD (LOGDRV_OFFSET),IY
CALL DEFINE_PARTITIONS
POP BC
POP DE
POP HL
POP IY
POP IX
;
.NoMediaChange: ;EX AF,AF
; ¯¥à¥â á®¢ª  ॣ¨áâ஢ á १ã«ìâ â®¬ ®â BIOS
EX DE,HL
LD C,E
@ -468,34 +484,53 @@ Removable: XOR A
INC A
RET
Open: XOR A
RET
Close: XOR A
RET
;!TODO ¯®ª  Open ­¨ç¥£® ­¥ ¤¥« ¥â ªà®¬¥ ¯à®¢¥àª¨ MediaCheck
Open: ;CALL MediaCheck
;RET
; JP MediaCheck
;
;[ ] 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
;
; [ ] media changed
LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER)
LD C,BIOS.DRV_DETECT
PUSH IY
RST ToBIOS
AND %0000'0010
JR Z,.norm_exit
POP IY
JR NC,.next_check
;
ld
; २­¨â ¤à ©¢ 
CP BIOS.Error.ATAPI.UnitAttention
JR Z,.Reinit
JR .exit
;
.norm_exit: XOR A
.next_check: BIT 1,(IY + LOGDRV.RemovableMedia)
JR NZ,.Reinit
;
XOR A
.exit: POP IY
RET
;
.Reinit: LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER)
LD (CURRENT_DRIVE.Number),A
LD (LOGDRV_OFFSET),IY
;RES 1,(IY + LOGDRV.RemovableMedia)
CALL DEFINE_PARTITIONS
LD A,#FF ;!HARDCODE drive changed
OR A
POP IY
RET
; [ ] custorm sector size
@ -520,8 +555,8 @@ CHECK_IDE_SECTOR_SIZE:
GetBPB: ; !FIXIT ¢ë¡¨à âì §­ ç¥­¨ï ¨áå®¤ï ¨§ ⨯  ¤à ©¢  ¨«¨ ¥éñ 祣®-­¨¡ã¤ì
LD HL,0
LD IX,0
LD B,1
JR Read
; PUSH IY
; PUSH DE
; LD L,A
@ -548,6 +583,9 @@ GetBPB: ; !FIXIT
; POP IY
; LD A,DSS_Error.drv.UNKNOWN_FORMAT
; RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
@ -556,13 +594,7 @@ GetBPB: ; !FIXIT
;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
@ -572,13 +604,7 @@ ReadLong: LD C,BIOS.DRV_READ_LONG
;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
@ -587,27 +613,8 @@ WriteLong: LD C,BIOS.DRV_WRITE_LONG
;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
@ -620,7 +627,7 @@ Exec_BIOS: PUSH IY
CALL .exec
POP IY
RET
;
.exec: CALL SelectDrive
RET C
RST ToBIOS
@ -630,24 +637,36 @@ Exec_BIOS: PUSH IY
RET NZ
SET 1,(IY + LOGDRV.RemovableMedia)
RET
;------------------------------[ PARTIT ]------------------------------;
; ¢å®¤: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved
DEFINE_PARTITIONS:
.FAT32_DOS: ;
.EASYDOS: ;
.MEDIDOS: ;
.HIGHDOS: ;
IN A,(SLOT3)
PUSH AF
LD A,SHARED_PAGE
OUT (SLOT3),A
CALL .Start
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_L)
LD IX,(CURRENT_SECTOR.Low)
ADD IX,DE
LD DE,(CURRENT_SECTOR_H)
LD DE,(CURRENT_SECTOR.High)
ADC HL,DE
LD D,XH
LD E,XL
;BPB SECTOR
LD IX,(OFFSECT)
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
@ -661,6 +680,13 @@ DEFINE_PARTITIONS:
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.RemovableMedia),A
;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
.ExtendedPartitionFlag+1:
LD A,0
@ -677,21 +703,21 @@ DEFINE_PARTITIONS:
CALL INC_DRV_COUNT
RET NC
;
LD A,(DRV_NUM)
LD A,(CURRENT_DRIVE.Number)
LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A
LD DE,LOGDRV.TBL_Entry ;DSKITEM
ADD IX,DE
LD (OFFSECT),IX
LD (LOGDRV_OFFSET),IX
JP .NextPartition
;
.NotExtended: CP PartitionSysTypes.FAT16
JR Z,.HIGHDOS
CP PartitionSysTypes.FAT16_LBA
JR Z,.HIGHDOS
JP Z,.HIGHDOS
CP PartitionSysTypes.FAT16_32Mb
JR Z,.MEDIDOS
JP Z,.MEDIDOS
CP PartitionSysTypes.FAT12
JR Z,.EASYDOS
JP Z,.EASYDOS
;[ ] fat32
CP PartitionSysTypes.FAT32
JP Z,.FAT32_DOS
@ -706,68 +732,50 @@ DEFINE_PARTITIONS:
.ATAPI_TST: ;JR .check_atapi ;!FIXIT CDFS
;SCF
;RET
.check_atapi: LD A,(DRV_NUM)
LD B,A
.check_atapi: LD A,(CURRENT_DRIVE.Number)
;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
;
CALL GetSectorSize
;BPB SECTOR ;!TODO ¥á«¨ CD-ROM, â® ¤à㣮© ­®¬¥à ᥪâ®à 
LD IX,(LOGDRV_OFFSET)
LD A,(CURRENT_DRIVE.Removable)
LD (IX + LOGDRV.RemovableMedia),A
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
; [ ] 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),E
LD (IX + LOGDRV.SECTOR_SIZE + 1),D
LD (IX + LOGDRV.SECTOR_SIZE),C
LD (IX + LOGDRV.SECTOR_SIZE + 1),B
;
; ¤«ï ¯à ¢¨«ì­®£® ¢ë室  ¨§ ¯ àá¥à  à §¤¥«®¢
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
;
JP .not_supported
;
; ¢å®¤: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved
.Start: LD IX,0
LD DE,0
LD (EXTDOSL),DE ;R01
LD (EXTDOSH),IX ;R01
LD A,B
AND %1111'1101
LD (CURRENT_DRIVE.Removable),A
LD (EXT_Partition.Low),DE ;R01
LD (EXT_Partition.High),IX ;R01
;
.LOOP: LD (CURRENT_SECTOR_L),DE
LD (CURRENT_SECTOR_H),IX
.LOOP: LD (CURRENT_SECTOR.Low),DE
LD (CURRENT_SECTOR.High),IX
CALL .LOAD_SECTOR
JR C,.check_atapi
;
@ -784,7 +792,7 @@ DEFINE_PARTITIONS:
;RET NZ
;
; [ ] ¥á«¨ ATAPI, â® ¯à®¡ã¥¬ ¯à®ç¥áâì 0 ᥪâ®à ª ª-¡ã¤â® ­¥â MBR
;LD A,(DRV_NUM)
;LD A,(CURRENT_DRIVE.Number)
;CP DRIVE_CODES.SPRINTER.CDROM
;
@ -798,8 +806,8 @@ DEFINE_PARTITIONS:
JP NZ,.NotExtended
;
.SubLevel: PUSH IY
LD DE,(CURRENT_SECTOR_L)
LD IX,(CURRENT_SECTOR_H)
LD DE,(CURRENT_SECTOR.Low)
LD IX,(CURRENT_SECTOR.High)
PUSH DE
PUSH IX
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
@ -815,8 +823,8 @@ DEFINE_PARTITIONS:
;
POP IX
POP DE
LD (CURRENT_SECTOR_L),DE
LD (CURRENT_SECTOR_H),IX
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
@ -826,8 +834,8 @@ DEFINE_PARTITIONS:
AND A
RET
;
.ParseExtended: LD HL,(EXTDOSL)
LD DE,(EXTDOSH)
.ParseExtended: LD HL,(EXT_Partition.Low)
LD DE,(EXT_Partition.High)
LD A,L
OR H
OR E
@ -837,14 +845,14 @@ DEFINE_PARTITIONS:
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
LD (EXT_Partition.Low),DE
LD (EXT_Partition.High),HL
PUSH DE
JR .set_regs
;
.ext_in_ext: LD IX,(EXTDOSL)
.ext_in_ext: LD IX,(EXT_Partition.Low)
ADD IX,DE
LD DE,(EXTDOSH)
LD DE,(EXT_Partition.High)
ADC HL,DE
PUSH IX
.set_regs: PUSH HL
@ -853,14 +861,28 @@ DEFINE_PARTITIONS:
JP .LOOP
;
.LOAD_SECTOR: PUSH IY
LD IX,(CURRENT_SECTOR_L)
LD HL,(CURRENT_SECTOR_H)
LD IX,(CURRENT_SECTOR.Low)
LD HL,(CURRENT_SECTOR.High)
LD DE,PARTITION_BUFFER
LD A,(DRV_NUM)
LD A,(CURRENT_DRIVE.Number)
LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS
POP IY
RET
GetSectorSize: PUSH IY
LD A,(CURRENT_DRIVE.Number)
; sector size
LD C,BIOS.DRV_GET_PAR
RST ToBIOS
JR NC,.no_err
;
LD IX,#FFFF
.no_err: LD B,XH
LD C,XL
POP IY
RET
;----------------------------------------------------------------------;
;
@ -875,12 +897,19 @@ INC_DRV_COUNT: LD A,(Init.count)
;=======================================================================
; 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
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

View File

@ -1,734 +0,0 @@
;!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
PARTITION_BUFFER _sBOOT_SECTOR = #C000
HDDRIVE: INC C
DEC C
JP Z,INIT_H ; c=0 Initialization
DEC C
JP Z,RESE_H ; c=1 open
DEC C
JP Z,STAT_H ; c=2 close
DEC C
JP Z,CHEK_H ; c=3 media check (ᬥ­  ­®á¨â¥«ï)
DEC C
JP Z,GBPB_H ; c=4 get BPB
DEC C
JP Z,READH ; c=5 read (ç⥭¨¥ ᥪâ®à®¢)
DEC C
JP Z,WRITEH ; c=6 write (§ ¯¨áì ᥪâ®à®¢)
DEC C
JP Z,REMOV_H ; c=7 Removable
DEC C
JP Z,IOCTL_H ; c=8 ã§­ âì £¥®¬¥âà¨î ¤¨áª  Generic IOCTL
DEC C
JP Z,.Reserved ; c=9 Reserved
DEC C
JP Z,LREADH ; c=10 Read Long
DEC C
JP Z,LWRITEH ; c=11 Write Long
;
.Reserved: LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
////////////////////////////////////////////////////////////////////////
// Commands for restart #18 //
////////////////////////////////////////////////////////////////////////
;--------------------------------------------------------------------[v]
; c=0 Initialization
INIT_H: PUSH IY
;!TEST ;[ ] ¤«ï rescanDRV
XOR A
LD (DRVCLC.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 (28)
;
IN A,(SLOT3)
LD C,A
LD A,SYS_PAGE
OUT (SLOT3),A
XOR A
LD B,(IX+2) ;ª®«¨ç¥á⢮ HDD ¤«ï ¯à®æ¥¤ãàë NX_DVCI
CP B
LD A,C
OUT (SLOT3),A
JR Z,NO_HARDS
LD C,#80 ;!HARDCODE - ID ¢¨­â  ¤«ï ¯à®æ¥¤ãàë BIOS.DRV_DETECT
NX_DVCI: PUSH BC
LD A,C
LD (DRV_NUM),A
LD C,BIOS.DRV_DETECT
RST ToBIOS
;JR C,.NO_DRIVE
CALL NC,DEFINE_PARTITIONS.BEGIN
POP BC
INC C
JR C,NX_DVCI
DJNZ NX_DVCI
;
NO_HARDS:
POP IY
;!TEST
; LD HL,(OFFSECT)
; LD DE,LOGDRV
; XOR A
; SBC HL,DE
; RET Z
; LD DE,LOGDRV.TBL_Entry
DRVCLC: ; INC A
; SBC HL,DE
; JR NZ,DRVCLC
;
.count+1: LD A,0
;
AND A
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
SELHDD: PUSH DE
PUSH HL
;
LD L,A
LOGDRV_ENTRY_FIND LOGDRV
; !HARDCODE
LD E,(IY+1)
LD D,(IY+2)
ADD IX,DE
LD E,(IY+3)
LD D,(IY+4)
POP HL
ADC HL,DE
LD A,(IY+0) ;DRIVE NUMBER
POP DE
RET
; 00 - GET DEVICE PARAMETERS
; 01 - READ TRACK
; 02 - TEST TRACK
; 80 - SET DEVICE PARAMETERS
; 81 - WRITE TRACK
; 82 - FORMAT TRACK
IOCTL_H BIT 7,B
JR NZ,O_CTL_H
INC B
DEC B
JP Z,HGETPRM
DEC B
JP Z,HRDTRAC
DEC B
JP Z,HCHTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
O_CTL_H RES 7,B
INC B
DEC B
JP Z,HSETPRM
DEC B
JP Z,HWRTRAC
DEC B
JP Z,HFRTRAC
LD A,DSS_Error.drv.INVALID_COMMAND
SCF
RET
HRDTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
RET
HCHTRAC LD B,L
CALL CHECKH
RET
HSETPRM AND A
RET
HWRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE
SCF
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
HGETPRM:
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
REMOV_H:
LD A,1
AND A
RET
RESE_H: XOR A
RET
STAT_H: XOR A
RET
CHEK_H: ;LD A,#FF
XOR A
;AND A
RET
; DE - ADDRESS
; A - DRIVE
GBPB_H: PUSH IY
PUSH DE
LD L,A
;
LOGDRV_ENTRY_FIND LOGDRV
;
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.SECTOR_OFFSET.PHISICAL_DRV_NUMBER)
POP DE
POP IY
LD BC,1*256 + BIOS.DRV_READ
JP ToBIOS
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
; A - HDD LOG NUMBER
;READ SECTOR
LREADH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_READ_LONG
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A'- PAGE
; A - HDD LOG NUMBER
;WRITE SECTOR
LWRITEH:
PUSH IY
CALL SELHDD
LD C,BIOS.DRV_WRITE_LONG
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;WRITE SECTOR
WRITEH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_WRITE
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;READ SECTOR
READH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_READ
RST ToBIOS
POP IY
RET
;HL:IX - SECTOR
; DE - ADDRESS
; B - COUNTER
; A - HDD LOG NUMBER
;CHECK SECTOR
CHECKH: PUSH IY
CALL SELHDD
LD C,BIOS.DRV_VERIFY
RST ToBIOS
POP IY
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
;
;!TEST <09>®¤áâà å®¢ª  ®â ¯¥à¥¯®«­¥­¨ï â ¡«¨æë LOGDRV
LD A,(DRVCLC.count)
INC A
CP DSS_MAX_DRIVES_AMOUNT+1
RET NC
LD (DRVCLC.count),A
;
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
JR Z,.SubLevel
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¤¥â¥ªâ 
;OR A ;PartitionSysTypes.Empty
;JR NZ,NXTPART
JR .NextPartition ; à §¤¥« ­¥ ¯®¤¤¥à¦¨¢ ¥âáï
;POP BC ; ¡ « ­á á⥪ 
;RET
;POP BC
;OR A
;RET Z
;NODEFIN:
;SCF
;RET
;
.BEGIN: 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
;
LD HL,(PARTITION_BUFFER.MBR_SIGNATURE)
LD DE,#AA55
AND A
SBC HL,DE
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
;JR NZ,NODEFIN
SCF
RET NZ
;
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
JR 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
;----------------------------------------------------------------------;
;
;=======================================================================
; 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
;=======================================================================

View File

@ -91,18 +91,50 @@ cmd_info: CALL Get_Path
JR C,.ItIsFDD
LD DE,Dss.DRV.GenIOCTL.Enter
LD BC,Dss.DRV.GenIOCTL.GetParams
RST ToDSS.DRV ; !FIXIT ­¥ ¢®§¢à é ¥â à §¬¥à ᥪâ®à , ¯®í⮬ã å à¤ª®à ¯® 512
RST ToDSS.DRV
JR NC,.calc_size
;
.ItIsFDD: ;
LD HL,.Unknown_str
LD DE,Buffers.bat_params.PRM5 ; Drive size
CALL ncopy_string
JR .print_info_2
; HL:DE * 512 = A:H'L':HL ;!HARDCODE sector size
.calc_size: RL E
/*
312ÿ585ÿ200
A H L D E
0000 0000. 0001 0010. 1010 0001. 1010 1011. 1111 0000.
0000 1001. 0101 0000. 1101 0101. 1111 1000. 0000 0000. 128
0001 0010. 1010 256
0010 0101. 512
1001 0101 2048
*/
; ¬ ªá¨¬ «ì­ë© à §¬¥à ᥪâ®à  ¤«ï ¯¥à¥¢®¤  ¢ ¡ ©âë - 2048; !FIXIT ; [ ] sector size
; HL:DE * sector_size = A:H'L':HL
.calc_size: LD A,B
CP #FF
JR Z,.ItIsFDD
AND A
JR Z,.ItIsFDD
;
RRA
JR C,.s128
RRA
JR C,.set_regs
;
.RL_LOOP: RL E
RL D
RL L
RL H
RRA
JR NC,.RL_LOOP
;XOR A
;
.set_regs: EXX
LD L,A
EXX
;
LD A,H
EX AF,AF
LD A,E
@ -110,9 +142,35 @@ cmd_info: CALL Get_Path
LD L,D
EXX
LD H,A
LD L,0
EX AF,AF
JR .convert_hex
JP .convert_hex
;
.s128: ; A = 0
SRL H
RR L
RR D
RR E
RRA
JR .set_regs
; ; HL:DE * 512 = A:H'L':HL ;!HARDCODE sector size
; .calc_size: RL E
; RL D
; RL L
; RL H
; LD A,H
; EX AF,AF
; LD A,E
; LD H,L
; LD L,D
; EXX
; LD H,A
; LD L,0
; EX AF,AF
; JR .convert_hex
;
.Collect_Msg: DZ " A: <WAITING>\r" ; ¯ âç¨âáï ¡ãª¢  ¤à ©¢  ¢ 横«¥
.Unknown_str: DZ "unknown"

View File

@ -1 +1 @@
444
451

@ -1 +1 @@
Subproject commit 857938d1dbf3b332a5e9e8ccabfee531eb3848fa
Subproject commit 171e4791a80462627c5876e095a042dc3e3b9eac