From a35f7e81f21ef6aefa8cda6805b09b4b6297db7b Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 17 Jan 2025 23:17:05 +1000 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D0=B8=D1=82=D0=B5=D0=BB=D1=8F=20=D0=B2=20=D0=B4=D1=80?= =?UTF-8?q?=D0=B0=D0=B9=D0=B2=D0=B5=20ATAPI=20=D0=B4=D0=BE=D0=BB=D0=B6?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=B0=D1=82=D1=8B?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=D1=81=D1=8F=20=D0=BA=D0=BE=D1=80=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 85 +- DSS/API/diskINF.asm | 10 +- DSS/DOS_Proc.asm | 20 +- DSS/DRV-MAIN.ASM | 16 +- DSS/FS/FAT.asm | 11 +- DSS/build.txt | 2 +- DSS/defines.inc | 1 - .../media/{shared-drv.asm => Shared.asm} | 2 +- .../{atapi-drv.asm => ata_atapi-drv.asm} | 323 ++++---- DSS/drivers/media/ide-drv.asm | 734 ------------------ SHELL/Commands/INFO.ASM | 68 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 13 files changed, 305 insertions(+), 971 deletions(-) rename DSS/drivers/media/{shared-drv.asm => Shared.asm} (95%) rename DSS/drivers/media/{atapi-drv.asm => ata_atapi-drv.asm} (81%) delete mode 100644 DSS/drivers/media/ide-drv.asm diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 54c0231..eff0e54 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -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" @@ -455,28 +432,28 @@ GET_BPB: XOR A LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 ; - XOR A - LD B,A - LD C,A - EXX - LD H,A - LD L,A - LD D,A - LD E,A - EXX + XOR A + LD B,A + LD C,A + EXX + LD H,A + LD L,A + LD D,A + LD E,A + EXX ; - ;LD BC,0 + ;LD BC,0 LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT16) LD A,E OR D JR NZ,.skip_high ; - EXX - LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) - LD A,E - EXX - ;LD BC,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) - ;LD A,C + EXX + LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + LD A,E + EXX + ;LD BC,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + ;LD A,C LD (FatBuffer.SectorsPerFAT_H),A LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32) ; @@ -486,28 +463,28 @@ GET_BPB: XOR A JR Z,.one_FAT DEC A ADD HL,DE - EXX - ADC HL,DE - EXX - ;JR NC,.no_inc_BC - ;INC BC + EXX + ADC HL,DE + EXX + ;JR NC,.no_inc_BC + ;INC BC .no_inc_BC: ; .one_FAT: ; .loop1: ADD HL,DE - EXX - ADC HL,DE - EXX - ;JR NC,.loop1_1 - ;INC BC + EXX + ADC HL,DE + EXX + ;JR NC,.loop1_1 + ;INC BC .loop1_1: DEC A JR NZ,.loop1 ; LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - EXX - ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. - LD (FatBuffer.FirstDataSector_H),HL - EXX - ;LD (FatBuffer.FirstDataSector_H),BC + EXX + ; можно сразу тут загнать старший байт, потому-что дла FAT32 следующий расчёт - это прибавление нуля. + LD (FatBuffer.FirstDataSector_H),HL + EXX + ;LD (FatBuffer.FirstDataSector_H),BC LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) LD A,B AND A diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index bfc6cba..e5e2e7a 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -59,8 +59,8 @@ DISKINF: LD C,B ;;;; ; EX DE,HL - LD HL,FAT_STRING - LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length + LD HL,FAT_STRING ;!HARDCODE FAT FS + LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length CALL .mCOPY_LOOP ; 12, 16 or 32 LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) @@ -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 ; diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index 8be4c0b..ffc901b 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -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 NZ,.open + PUSH BC + LD C,Dss.DRV.MediaCheck + RST ToDSS.DRV + POP BC JR Z,.exit - + ; .open: LD A,C ; .force: PUSH AF @@ -226,7 +224,7 @@ OPENDSK: ;!TEST DRV.Open LD A,DSS_Error.sys.NOT_READY RET ;[x] 29/02/2024 fix "open drive error"; 20/06/2024 fixed -.error_bpb: PUSH AF ; сохраняем номер ошибки +.error_bpb: PUSH AF ; сохраняем номер ошибки LD A,(CORE_BUFFERS.FatBuffer.DRIVE) CP D JR Z,.next_check @@ -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' diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 4ae29fb..a87e8e5 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -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 diff --git a/DSS/FS/FAT.asm b/DSS/FS/FAT.asm index e74d536..69ce24f 100644 --- a/DSS/FS/FAT.asm +++ b/DSS/FS/FAT.asm @@ -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 diff --git a/DSS/build.txt b/DSS/build.txt index c227083..e440e5c 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -0 \ No newline at end of file +3 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index 95a0251..761506b 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -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 diff --git a/DSS/drivers/media/shared-drv.asm b/DSS/drivers/media/Shared.asm similarity index 95% rename from DSS/drivers/media/shared-drv.asm rename to DSS/drivers/media/Shared.asm index 5b4d88e..abda541 100644 --- a/DSS/drivers/media/shared-drv.asm +++ b/DSS/drivers/media/Shared.asm @@ -135,7 +135,7 @@ INITDVC: XOR A CALL FDD_DRV.Init ; узнать число FDD-девайсов LD DE,FDD_DRV.API_TABLE ; адрес обработчика тек. девайса CALL MAKEDVC ; иниц. таблицу переходов - ; HDD девайсы + ; IDE девайсы .if_old: CALL IDE_DRV.Init ; если на старте версия BIOS не подходит, то грузиться можно только с дискеты, для этого тут замена кода на XOR A : RET LD DE,IDE_DRV.API_TABLE CALL MAKEDVC diff --git a/DSS/drivers/media/atapi-drv.asm b/DSS/drivers/media/ata_atapi-drv.asm similarity index 81% rename from DSS/drivers/media/atapi-drv.asm rename to DSS/drivers/media/ata_atapi-drv.asm index 7831101..eb918a5 100644 --- a/DSS/drivers/media/atapi-drv.asm +++ b/DSS/drivers/media/ata_atapi-drv.asm @@ -183,11 +183,11 @@ ATAPI_BUFFER _sCDFS_PRIMARY_VOLUME_DESCRIPTOR = #C000 API_TABLE: INC C DEC C - JP Z,Init ; [ ] ; c=0 Initialization + JP Z,Init ; [ ] ; c=0 Initialization DEC C - JP Z,Open ; [ ] ; c=1 open + JP Z,Open ; [ ] ; c=1 open DEC C - JP Z,Close ; [ ] ; c=2 close + JP Z,Close ; [ ] ; c=2 close DEC C JP Z,MediaCheck ; [ ] ; c=3 media check (смена носителя) DEC C @@ -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 + 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 + 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 \ No newline at end of file diff --git a/DSS/drivers/media/ide-drv.asm b/DSS/drivers/media/ide-drv.asm deleted file mode 100644 index 025caae..0000000 --- a/DSS/drivers/media/ide-drv.asm +++ /dev/null @@ -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 Подстраховка от переполнения таблицы 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 -;======================================================================= \ No newline at end of file diff --git a/SHELL/Commands/INFO.ASM b/SHELL/Commands/INFO.ASM index 501b2b5..f168532 100644 --- a/SHELL/Commands/INFO.ASM +++ b/SHELL/Commands/INFO.ASM @@ -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: \r" ; патчится буква драйва в цикле .Unknown_str: DZ "unknown" diff --git a/SHELL/build.txt b/SHELL/build.txt index cb856a4..4991210 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -444 \ No newline at end of file +451 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 857938d..171e479 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 857938d1dbf3b332a5e9e8ccabfee531eb3848fa +Subproject commit 171e4791a80462627c5876e095a042dc3e3b9eac