mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 01:11:48 +03:00
Смена носителя в драйве ATAPI должна обрабатываться корректно
This commit is contained in:
parent
d4911f7c45
commit
a35f7e81f2
@ -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"
|
||||
|
||||
@ -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
|
||||
;
|
||||
|
||||
@ -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'
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -1 +1 @@
|
||||
0
|
||||
3
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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
|
||||
;=======================================================================
|
||||
@ -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"
|
||||
|
||||
@ -1 +1 @@
|
||||
444
|
||||
451
|
||||
@ -1 +1 @@
|
||||
Subproject commit 857938d1dbf3b332a5e9e8ccabfee531eb3848fa
|
||||
Subproject commit 171e4791a80462627c5876e095a042dc3e3b9eac
|
||||
Loading…
Reference in New Issue
Block a user