Смена носителя в драйве 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) LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster)
CP #20 + 1 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢ CP #20 + 1 ; !HARDCODE ª®«-¢® § £à㦠¥¬ëå ᥪâ®à®¢
JP NC,INC_SECTOR_NUM JP NC,INC_SECTOR_NUM
;CALL R_F_FAT ; next cluster in chain
CALL READ_FROM_FAT ; next cluster in chain CALL READ_FROM_FAT ; next cluster in chain
EX DE,HL EX DE,HL
EXX EXX
@ -222,7 +221,6 @@ RUN_CORE: DI
OUT (C),A OUT (C),A
; ;
;DOS LOADED ;DOS LOADED
;IF UNIVERSAL_BOOT
;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[ ] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
LD A,(DRIVE+1) ; ­®¬¥à à §¤¥«  LD A,(DRIVE+1) ; ­®¬¥à à §¤¥« 
LD L,A LD L,A
@ -243,27 +241,6 @@ RUN_CORE: DI
RST ToDSS RST ToDSS
; ;
LD BC,Dss.BootDSK.Get 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 RST ToDSS
; ;
ADD A,"A" ADD A,"A"

View File

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

View File

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

View File

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

View File

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

View File

@ -1 +1 @@
0 3

View File

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

View File

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

View File

@ -224,7 +224,7 @@ Init: PUSH IY
LD (.count),A LD (.count),A
; ;
LD HL,LOGDRV LD HL,LOGDRV
LD (OFFSECT),HL LD (LOGDRV_OFFSET),HL
LD IX,SYS_PAGE.TMP_BUFFER LD IX,SYS_PAGE.TMP_BUFFER
LD C,BIOS.DRV_LIST LD C,BIOS.DRV_LIST
@ -268,10 +268,10 @@ Init: PUSH IY
; ;
.NX_DVCI: PUSH BC .NX_DVCI: PUSH BC
LD A,C LD A,C
LD (DRV_NUM),A LD (CURRENT_DRIVE.Number),A
LD C,BIOS.DRV_DETECT LD C,BIOS.DRV_DETECT
RST ToBIOS RST ToBIOS
CALL NC,DEFINE_PARTITIONS.BEGIN CALL NC,DEFINE_PARTITIONS
POP BC POP BC
INC C INC C
JR C,.NX_DVCI JR C,.NX_DVCI
@ -279,14 +279,13 @@ Init: PUSH IY
RET RET
;---------------------------------------------------------------------[^] ;---------------------------------------------------------------------[^]
; ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... ;+00 BYTE MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/...
; ;+01 DWORD SECTOR OFFSET ;+01 LONG SECTOR OFFSET
; ;+05 DWORD SIZE IN SECTORS ;+05 LONG SIZE IN SECTORS
; ;+09 FREE ;+09 BYTE PARTITION RECORD NUMBER (in drive MBR)
; ;+15 ;+10 WORD Sector Size
; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;+12 BYTE Removable Media Byte flags
; .TBL_Entry EQU 16 ;+13_15 FREE
; .Size EQU $-LOGDRV
SelectDrive: PUSH DE SelectDrive: PUSH DE
PUSH HL PUSH HL
; ;
@ -358,19 +357,8 @@ GenIOCTL: BIT 7,B
;CHECK SECTOR ;CHECK SECTOR
TestTRK: LD C,BIOS.DRV_VERIFY TestTRK: LD C,BIOS.DRV_VERIFY
JP Exec_BIOS 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 ; HL:DE - SECTORS ON LOGICAL DISK
; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
; HL' - CYLINDERS ON PHISICAL DISK ; HL' - CYLINDERS ON PHISICAL DISK
@ -415,8 +403,36 @@ GetParams: EX DE,HL
LD C,BIOS.DRV_GET_PAR LD C,BIOS.DRV_GET_PAR
RST ToBIOS RST ToBIOS
POP IY 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 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 ; ¯¥à¥â á®¢ª  ॣ¨áâ஢ á १ã«ìâ â®¬ ®â BIOS
EX DE,HL EX DE,HL
LD C,E LD C,E
@ -468,34 +484,53 @@ Removable: XOR A
INC A INC A
RET RET
Open: XOR A
RET
Close: XOR A Close: XOR A
RET RET
;!TODO ¯®ª  Open ­¨ç¥£® ­¥ ¤¥« ¥â ªà®¬¥ ¯à®¢¥àª¨ MediaCheck
Open: ;CALL MediaCheck
;RET
; JP MediaCheck
;
;[ ] media changed - bios 5x DETECT ;[ ] media changed - bios 5x DETECT
; ¢ë室 A=#FF - changed, A=0 - not changed, ZF=1 - not changed ; ¢ë室 A=#FF - changed, A=0 - not changed, ZF=1 - not changed
MediaCheck: PUSH IY MediaCheck: PUSH IY
CALL SelectDrive CALL SelectDrive
JR C,.exit JR C,.exit
; ;
LD A,#FF ; [ ] media changed
BIT 1,(IY + LOGDRV.RemovableMedia)
JR NZ,.exit
;
LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER) LD A,(IY + LOGDRV.PHISICAL_DRV_NUMBER)
LD C,BIOS.DRV_DETECT LD C,BIOS.DRV_DETECT
PUSH IY
RST ToBIOS RST ToBIOS
AND %0000'0010 POP IY
JR Z,.norm_exit 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 .exit: POP IY
RET 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 ; [ ] custorm sector size
@ -520,8 +555,8 @@ CHECK_IDE_SECTOR_SIZE:
GetBPB: ; !FIXIT ¢ë¡¨à âì §­ ç¥­¨ï ¨áå®¤ï ¨§ ⨯  ¤à ©¢  ¨«¨ ¥éñ 祣®-­¨¡ã¤ì GetBPB: ; !FIXIT ¢ë¡¨à âì §­ ç¥­¨ï ¨áå®¤ï ¨§ ⨯  ¤à ©¢  ¨«¨ ¥éñ 祣®-­¨¡ã¤ì
LD HL,0 LD HL,0
LD IX,0 LD IX,0
LD B,1
JR Read JR Read
; PUSH IY ; PUSH IY
; PUSH DE ; PUSH DE
; LD L,A ; LD L,A
@ -548,6 +583,9 @@ GetBPB: ; !FIXIT
; POP IY ; POP IY
; LD A,DSS_Error.drv.UNKNOWN_FORMAT ; LD A,DSS_Error.drv.UNKNOWN_FORMAT
; RET ; RET
;HL:IX - SECTOR ;HL:IX - SECTOR
; DE - ADDRESS ; DE - ADDRESS
; B - COUNTER ; B - COUNTER
@ -556,13 +594,7 @@ GetBPB: ; !FIXIT
;READ SECTOR ;READ SECTOR
ReadLong: LD C,BIOS.DRV_READ_LONG ReadLong: LD C,BIOS.DRV_READ_LONG
JP Exec_BIOS 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 ;HL:IX - SECTOR
; DE - ADDRESS ; DE - ADDRESS
@ -572,13 +604,7 @@ ReadLong: LD C,BIOS.DRV_READ_LONG
;WRITE SECTOR ;WRITE SECTOR
WriteLong: LD C,BIOS.DRV_WRITE_LONG WriteLong: LD C,BIOS.DRV_WRITE_LONG
JP Exec_BIOS 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 ;HL:IX - SECTOR
; DE - ADDRESS ; DE - ADDRESS
@ -587,27 +613,8 @@ WriteLong: LD C,BIOS.DRV_WRITE_LONG
;WRITE SECTOR ;WRITE SECTOR
Write: LD C,BIOS.DRV_WRITE Write: LD C,BIOS.DRV_WRITE
JP Exec_BIOS 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 ;HL:IX - SECTOR
; DE - ADDRESS ; DE - ADDRESS
@ -620,7 +627,7 @@ Exec_BIOS: PUSH IY
CALL .exec CALL .exec
POP IY POP IY
RET RET
;
.exec: CALL SelectDrive .exec: CALL SelectDrive
RET C RET C
RST ToBIOS RST ToBIOS
@ -630,24 +637,36 @@ Exec_BIOS: PUSH IY
RET NZ RET NZ
SET 1,(IY + LOGDRV.RemovableMedia) SET 1,(IY + LOGDRV.RemovableMedia)
RET RET
;------------------------------[ PARTIT ]------------------------------; ;------------------------------[ PARTIT ]------------------------------;
; ¢å®¤: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved
DEFINE_PARTITIONS: DEFINE_PARTITIONS:
.FAT32_DOS: ; IN A,(SLOT3)
.EASYDOS: ; PUSH AF
.MEDIDOS: ; LD A,SHARED_PAGE
.HIGHDOS: ; 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 E,(IY + BOOT_SECTOR.Partition.Start_LBA + 0)
LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1) LD D,(IY + BOOT_SECTOR.Partition.Start_LBA + 1)
LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2) LD L,(IY + BOOT_SECTOR.Partition.Start_LBA + 2)
LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3) LD H,(IY + BOOT_SECTOR.Partition.Start_LBA + 3)
LD IX,(CURRENT_SECTOR_L) LD IX,(CURRENT_SECTOR.Low)
ADD IX,DE ADD IX,DE
LD DE,(CURRENT_SECTOR_H) LD DE,(CURRENT_SECTOR.High)
ADC HL,DE ADC HL,DE
LD D,XH LD D,XH
LD E,XL LD E,XL
;BPB SECTOR ;BPB SECTOR
LD IX,(OFFSECT) LD IX,(LOGDRV_OFFSET)
LD (IX + LOGDRV.SECTOR_OFFSET + 0),E LD (IX + LOGDRV.SECTOR_OFFSET + 0),E
LD (IX + LOGDRV.SECTOR_OFFSET + 1),D LD (IX + LOGDRV.SECTOR_OFFSET + 1),D
LD (IX + LOGDRV.SECTOR_OFFSET + 2),L 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 + 1),D
LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L
LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H 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 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;[x] 17.12.2023 § £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
.ExtendedPartitionFlag+1: .ExtendedPartitionFlag+1:
LD A,0 LD A,0
@ -677,21 +703,21 @@ DEFINE_PARTITIONS:
CALL INC_DRV_COUNT CALL INC_DRV_COUNT
RET NC RET NC
; ;
LD A,(DRV_NUM) LD A,(CURRENT_DRIVE.Number)
LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A LD (IX + LOGDRV.PHISICAL_DRV_NUMBER),A
LD DE,LOGDRV.TBL_Entry ;DSKITEM LD DE,LOGDRV.TBL_Entry ;DSKITEM
ADD IX,DE ADD IX,DE
LD (OFFSECT),IX LD (LOGDRV_OFFSET),IX
JP .NextPartition JP .NextPartition
; ;
.NotExtended: CP PartitionSysTypes.FAT16 .NotExtended: CP PartitionSysTypes.FAT16
JR Z,.HIGHDOS JR Z,.HIGHDOS
CP PartitionSysTypes.FAT16_LBA CP PartitionSysTypes.FAT16_LBA
JR Z,.HIGHDOS JP Z,.HIGHDOS
CP PartitionSysTypes.FAT16_32Mb CP PartitionSysTypes.FAT16_32Mb
JR Z,.MEDIDOS JP Z,.MEDIDOS
CP PartitionSysTypes.FAT12 CP PartitionSysTypes.FAT12
JR Z,.EASYDOS JP Z,.EASYDOS
;[ ] fat32 ;[ ] fat32
CP PartitionSysTypes.FAT32 CP PartitionSysTypes.FAT32
JP Z,.FAT32_DOS JP Z,.FAT32_DOS
@ -706,68 +732,50 @@ DEFINE_PARTITIONS:
.ATAPI_TST: ;JR .check_atapi ;!FIXIT CDFS .ATAPI_TST: ;JR .check_atapi ;!FIXIT CDFS
;SCF ;SCF
;RET ;RET
.check_atapi: LD A,(DRV_NUM) .check_atapi: LD A,(CURRENT_DRIVE.Number)
LD B,A ;LD B,A
AND #F0 AND #F0
CP DRIVE_CODES.SPRINTER.ATAPI CP DRIVE_CODES.SPRINTER.ATAPI
SCF SCF
RET NZ RET NZ
; ;
; No Media CALL GetSectorSize
;!TODO sector size ;BPB SECTOR ;!TODO ¥á«¨ CD-ROM, â® ¤à㣮© ­®¬¥à ᥪâ®à 
LD A,B LD IX,(LOGDRV_OFFSET)
LD C,BIOS.DRV_GET_PAR LD A,(CURRENT_DRIVE.Removable)
RST ToBIOS LD (IX + LOGDRV.RemovableMedia),A
JR NC,.no_err
;
LD IX,#FFFF
.no_err: LD D,XH
LD E,XL
;
XOR A XOR A
;BPB SECTOR
LD IX,(OFFSECT)
LD (IX + LOGDRV.SECTOR_OFFSET + 0),A LD (IX + LOGDRV.SECTOR_OFFSET + 0),A
LD (IX + LOGDRV.SECTOR_OFFSET + 1),A LD (IX + LOGDRV.SECTOR_OFFSET + 1),A
LD (IX + LOGDRV.SECTOR_OFFSET + 2),A LD (IX + LOGDRV.SECTOR_OFFSET + 2),A
LD (IX + LOGDRV.SECTOR_OFFSET + 3),A LD (IX + LOGDRV.SECTOR_OFFSET + 3),A
;SIZE DISK ; [ ] SIZE DISK
LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),A LD (IX + LOGDRV.SIZE_IN_SECTORS + 0),E
LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),A LD (IX + LOGDRV.SIZE_IN_SECTORS + 1),D
LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),A LD (IX + LOGDRV.SIZE_IN_SECTORS + 2),L
LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),A LD (IX + LOGDRV.SIZE_IN_SECTORS + 3),H
; [ ] sector size ; [ ] sector size
LD (IX + LOGDRV.SECTOR_SIZE),E LD (IX + LOGDRV.SECTOR_SIZE),C
LD (IX + LOGDRV.SECTOR_SIZE + 1),D LD (IX + LOGDRV.SECTOR_SIZE + 1),B
; ;
; ¤«ï ¯à ¢¨«ì­®£® ¢ë室  ¨§ ¯ àá¥à  à §¤¥«®¢ ; ¤«ï ¯à ¢¨«ì­®£® ¢ë室  ¨§ ¯ àá¥à  à §¤¥«®¢
LD B,1 LD B,1
PUSH BC PUSH BC
;§ £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£® ;§ £à㧪  á  ªâ¨¢­®£® à §¤¥« ,   ­¥ á ¯¥à¢®£®
DEC A DEC A
JR .not_supported JP .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
;
; ;
; ¢å®¤: B - bit0=1 removable, bit1=1 drive changed, bit7..2 reserved
.Start: LD IX,0 .Start: LD IX,0
LD DE,0 LD DE,0
LD (EXTDOSL),DE ;R01 LD A,B
LD (EXTDOSH),IX ;R01 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 .LOOP: LD (CURRENT_SECTOR.Low),DE
LD (CURRENT_SECTOR_H),IX LD (CURRENT_SECTOR.High),IX
CALL .LOAD_SECTOR CALL .LOAD_SECTOR
JR C,.check_atapi JR C,.check_atapi
; ;
@ -784,7 +792,7 @@ DEFINE_PARTITIONS:
;RET NZ ;RET NZ
; ;
; [ ] ¥á«¨ ATAPI, â® ¯à®¡ã¥¬ ¯à®ç¥áâì 0 ᥪâ®à ª ª-¡ã¤â® ­¥â MBR ; [ ] ¥á«¨ ATAPI, â® ¯à®¡ã¥¬ ¯à®ç¥áâì 0 ᥪâ®à ª ª-¡ã¤â® ­¥â MBR
;LD A,(DRV_NUM) ;LD A,(CURRENT_DRIVE.Number)
;CP DRIVE_CODES.SPRINTER.CDROM ;CP DRIVE_CODES.SPRINTER.CDROM
; ;
@ -798,8 +806,8 @@ DEFINE_PARTITIONS:
JP NZ,.NotExtended JP NZ,.NotExtended
; ;
.SubLevel: PUSH IY .SubLevel: PUSH IY
LD DE,(CURRENT_SECTOR_L) LD DE,(CURRENT_SECTOR.Low)
LD IX,(CURRENT_SECTOR_H) LD IX,(CURRENT_SECTOR.High)
PUSH DE PUSH DE
PUSH IX PUSH IX
;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢ ;[x] 17/12/23 ¯à®¯ã᪠ࠧ¤¥«®¢ á ­¥¨§¢¥áâ­ë¬¨ ”‘, ®¯â¨¬¨§ æ¨ï ¯¥à¥¡®à  à §¤¥«®¢
@ -815,8 +823,8 @@ DEFINE_PARTITIONS:
; ;
POP IX POP IX
POP DE POP DE
LD (CURRENT_SECTOR_L),DE LD (CURRENT_SECTOR.Low),DE
LD (CURRENT_SECTOR_H),IX LD (CURRENT_SECTOR.High),IX
CALL .LOAD_SECTOR CALL .LOAD_SECTOR
POP IY POP IY
.NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry .NextPartition: LD DE,_sMBR_PARTITION_RECORD ;Size of a partition table entry
@ -826,8 +834,8 @@ DEFINE_PARTITIONS:
AND A AND A
RET RET
; ;
.ParseExtended: LD HL,(EXTDOSL) .ParseExtended: LD HL,(EXT_Partition.Low)
LD DE,(EXTDOSH) LD DE,(EXT_Partition.High)
LD A,L LD A,L
OR H OR H
OR E OR E
@ -837,14 +845,14 @@ DEFINE_PARTITIONS:
LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2) LD L,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 2)
LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3) LD H,(IY + _sMBR_PARTITION_RECORD.Start_LBA + 3)
JP NZ,.ext_in_ext JP NZ,.ext_in_ext
LD (EXTDOSL),DE LD (EXT_Partition.Low),DE
LD (EXTDOSH),HL LD (EXT_Partition.High),HL
PUSH DE PUSH DE
JR .set_regs JR .set_regs
; ;
.ext_in_ext: LD IX,(EXTDOSL) .ext_in_ext: LD IX,(EXT_Partition.Low)
ADD IX,DE ADD IX,DE
LD DE,(EXTDOSH) LD DE,(EXT_Partition.High)
ADC HL,DE ADC HL,DE
PUSH IX PUSH IX
.set_regs: PUSH HL .set_regs: PUSH HL
@ -853,14 +861,28 @@ DEFINE_PARTITIONS:
JP .LOOP JP .LOOP
; ;
.LOAD_SECTOR: PUSH IY .LOAD_SECTOR: PUSH IY
LD IX,(CURRENT_SECTOR_L) LD IX,(CURRENT_SECTOR.Low)
LD HL,(CURRENT_SECTOR_H) LD HL,(CURRENT_SECTOR.High)
LD DE,PARTITION_BUFFER LD DE,PARTITION_BUFFER
LD A,(DRV_NUM) LD A,(CURRENT_DRIVE.Number)
LD BC,1*256 + BIOS.DRV_READ LD BC,1*256 + BIOS.DRV_READ
RST ToBIOS RST ToBIOS
POP IY POP IY
RET 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 ; PHISICAL DRIVE NUMBER
; #80/#81 - primary ¬ áâ¥à/á«¥©¢, #82/#83 - secondary ¬ áâ¥à/á«¥©¢ ; #80/#81 - primary ¬ áâ¥à/á«¥©¢, #82/#83 - secondary ¬ áâ¥à/á«¥©¢
DRV_NUM: DB #00 CURRENT_DRIVE:
CURRENT_SECTOR_L: DW #0000 .Number: DB #00
CURRENT_SECTOR_H: DW #0000 .Removable: DB #00
EXTDOSL: DW #0000 ;CURRENT PARTITION TABLE ;
EXTDOSH: DW #0000 CURRENT_SECTOR:
OFFSECT: DW LOGDRV ;POINTER ON CURRENT DISK RECORD .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 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 JR C,.ItIsFDD
LD DE,Dss.DRV.GenIOCTL.Enter LD DE,Dss.DRV.GenIOCTL.Enter
LD BC,Dss.DRV.GenIOCTL.GetParams LD BC,Dss.DRV.GenIOCTL.GetParams
RST ToDSS.DRV ; !FIXIT ­¥ ¢®§¢à é ¥â à §¬¥à ᥪâ®à , ¯®í⮬ã å à¤ª®à ¯® 512 RST ToDSS.DRV
JR NC,.calc_size JR NC,.calc_size
;
.ItIsFDD: ; .ItIsFDD: ;
LD HL,.Unknown_str LD HL,.Unknown_str
LD DE,Buffers.bat_params.PRM5 ; Drive size LD DE,Buffers.bat_params.PRM5 ; Drive size
CALL ncopy_string CALL ncopy_string
JR .print_info_2 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 D
RL L RL L
RL H RL H
RRA
JR NC,.RL_LOOP
;XOR A
;
.set_regs: EXX
LD L,A
EXX
;
LD A,H LD A,H
EX AF,AF EX AF,AF
LD A,E LD A,E
@ -110,9 +142,35 @@ cmd_info: CALL Get_Path
LD L,D LD L,D
EXX EXX
LD H,A LD H,A
LD L,0
EX AF,AF 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" ; ¯ âç¨âáï ¡ãª¢  ¤à ©¢  ¢ 横«¥ .Collect_Msg: DZ " A: <WAITING>\r" ; ¯ âç¨âáï ¡ãª¢  ¤à ©¢  ¢ 横«¥
.Unknown_str: DZ "unknown" .Unknown_str: DZ "unknown"

View File

@ -1 +1 @@
444 451

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