From 1c2f824e480e5ccd802622409aa7bedf5505dbff Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 2 Feb 2024 01:18:47 +1000 Subject: [PATCH] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B3=D0=B8=20=D0=B2=20rescandrv,=20sys.exe,=20diskINF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/boot.asm | 16 +++++- DSS/API/ScanDRV.asm | 18 +++++- DSS/API/bootDsk.asm | 1 - DSS/API/diskINF.asm | 88 +++++++++++++++++++----------- DSS/DRV-MAIN.ASM | 2 +- DSS/Media_drivers/ReScanDRV.ASM | 15 ++++- DSS/Media_drivers/fdd-drv.asm | 2 +- DSS/Media_drivers/ide-drv.asm | 4 +- DSS/Media_drivers/ram_disk-drv.asm | 5 +- DSS/build.txt | 2 +- Shared_Includes | 2 +- 11 files changed, 108 insertions(+), 47 deletions(-) diff --git a/BOOT/boot.asm b/BOOT/boot.asm index ef2ace2..ddab7f7 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -276,7 +276,7 @@ write_boot_loader: ; pop hl ; восст. баланс стека ; call close_device cp #F8 ; винт - jr z,write_to_hard_disk + jp z,write_to_hard_disk scf ; незнакомый формат ret @@ -350,7 +350,21 @@ write_to_: ld a,(disk) ; ret z ; !TODO загрузка с расширенного раздела не поддерживается dec c push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + ; [ ] 02/02/2024 проверка на влезаемость загрузчика (чтоб не попортить фат) + LD HL,0 + LD IX,0 + LD DE,buffer + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + POP BC + LD HL,(buffer + _sBOOT_SEC.RESERVE) + LD DE,04 ;!HARDCODE минимальное расстояние на драйве от нулевого сектора до фата (длина загрузчика + 1) + AND A + SBC HL,DE + RET C ; + push bc + ld a,b ld hl,0 ; ст. разряд лог. сектора ld ix,1 ; мл. разряд ld de,code_loader ; откуда (код загрузчика) diff --git a/DSS/API/ScanDRV.asm b/DSS/API/ScanDRV.asm index 38da595..bc0b42e 100644 --- a/DSS/API/ScanDRV.asm +++ b/DSS/API/ScanDRV.asm @@ -27,9 +27,23 @@ SCANDRV: RST ToDSS.DRV LD (LDRIVE),A ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; -; 4. выход +; 4. на всякий случай перечитываем дирректорию ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; - POP AF + LD A,(CurrentPath) + SUB 'A' + CALL CHNDISK + ; + LD HL,CurrentDirectory + CALL CHDIR + JR NC,.exit + LD HL,CurrentDirectory + LD (HL),0 + ; LD HL,CurrentPath + ; CALL CHDIR +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +; 5. выход +; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -; +.exit: POP AF RET PO EI RET diff --git a/DSS/API/bootDsk.asm b/DSS/API/bootDsk.asm index 1db9326..2bfaca7 100644 --- a/DSS/API/bootDsk.asm +++ b/DSS/API/bootDsk.asm @@ -3,7 +3,6 @@ ; Возвращает номер диска, c которого загружена система. ; ; При B = 0 (GET) -; вход: B = 0 (01h - исп. boot-загрузчик системы) ; выход: A - номер системного диска (0=A,1=B,..) ; При B = 1 (SET - исп. boot-загрузчик системы, после чего функция недоступна) ; вход: A - номер устройства, L - номер раздела на устройстве diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 305c78e..ea36f1c 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -7,20 +7,24 @@ ; При A bit7 = 1: ; HL - буфер (256 байтов) для расширенных данных: ; B != 0 - считать свободное место -; ; -; размер поля - 1 байт -; Файловая система -; ; -; размер поля - 1 байт -; Серийный номер диска -; ; -; размер поля - 1 байт -; Метка диска -; ; -; размер поля - 1 байт -; Зарезервировано... -; ; -; A xor #80 - номер диска +; ; +; размер поля - 1 байт +; Файловая система +; ; +; размер поля - 1 байт +; Серийный номер диска +; ; +; размер поля - 1 байт +; Метка диска +; ; +; размер поля - 1 байт +; физический номер диска, номер раздела +; ; +; размер поля - 1 байт +; зарезервировано +; ; + +; A and #7F - номер диска ; ; выход: A - размер кластера в секторах, если CF=0 ; HL - общее кол-во кластеров @@ -28,15 +32,6 @@ ; BC - размер сектора в байтах ; A - код ошибки, если CF=1 ;///////////////////////////////////////////////////////////////////// - ; [ ] 22/11/23 подфункция с доп.инфой - MACRO _mCOPY_LOOP - LD C,A - LD B,0 - LD (DE),A - INC DE - LDIR - ENDM - ; DISKINF:; [ ] 22/11/23 подфункция с доп.инфой LD C,B LD B,1 @@ -47,37 +42,56 @@ DISKINF:; [ ] 22/11/23 JR Z,.CurrentDisk ; more info LD B,C - PUSH HL AND %0111'1111 + PUSH HL + PUSH AF CALL .CustomDisk + POP IX JR C,.error ; EX (SP),HL - PUSH AF PUSH DE + PUSH AF PUSH BC ;;;; ; EX DE,HL LD HL,CORE_BUFFERS.BootSector.ID_FAT LD A,8 ;!HARDCODE _sBOOT_SEC.ID_FAT.length - _mCOPY_LOOP + CALL .mCOPY_LOOP ; LD HL,CORE_BUFFERS.BootSector.BPB_SERIAL_NUMBER LD A,4 ;!HARDCODE _sBOOT_SEC.BPB_SERIAL_NUMBER - _mCOPY_LOOP + CALL .mCOPY_LOOP ; LD HL,CORE_BUFFERS.BootSector.BPB_LABEL LD A,11 ;!HARDCODE _sBOOT_SEC.BPB_LABEL - _mCOPY_LOOP + CALL .mCOPY_LOOP ; - + PUSH DE + LD A,XH + LD DE,Dss.DRV.GenIOCTL.Enter + LD BC,Dss.DRV.GenIOCTL.GetParams + RST ToDSS.DRV + POP DE + JR C,.error_drv + LD A,2 ;!HARDCODE длина поля №4 2 байта: физ номер диска, номер раздела диска + LD (DE),A + INC DE + EX AF,AF' + LD (DE),A ;физ номер диска + INC DE + LD A,C + LD (DE),A ;номер раздела диска + INC DE + ; +.error_drv: XOR A LD (DE),A ;;;; POP BC - POP DE POP AF + POP DE .error: POP HL RET ; @@ -96,7 +110,7 @@ DISKINF:; [ ] 22/11/23 PUSH BC CALL CHNDISK ;R06 POP BC - RET C ;R06 + RET C ; .CheckFreeSpace: ; @@ -130,4 +144,14 @@ DISKINF:; [ ] 22/11/23 INC BC .skip: INC HL JP .FRESP -; \ No newline at end of file + ; + ; [ ] 22/11/23 подфункция с доп.инфой +.mCOPY_LOOP: + LD C,A + LD B,0 + LD (DE),A + INC DE + LDIR + RET + ; +; diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index 90c2501..1f9355b 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -191,7 +191,7 @@ A0066: JP DRV_PAGE.NMI ; ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; <[DRIVE PAGE SWITCH]> ; - _mInfoBLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 + BLOCK PORTAL.RSTx18_SWITCH_ADDRESS-$-(PORTAL.out_DRV.switch - PORTAL.out_DRV),#C7 PORTAL.out_DRV: PUSH BC ; .RETBANK+2: LD BC,SLOT0 + 0*256; ;!!!!! ReScnDRV использует это значение .switch: OUT (C),B ; diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index 73610bb..e5a5258 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -387,6 +387,18 @@ HARD_DRV: JR NZ,.skip LD A,(IY+LOGDRV.SECTOR_OFFSET+3) CP (IX+LOGDRV.SECTOR_OFFSET+3) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS) + CP (IX+LOGDRV.SIZE_IN_SECTORS) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS+1) + CP (IX+LOGDRV.SIZE_IN_SECTORS+1) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS+2) + CP (IX+LOGDRV.SIZE_IN_SECTORS+2) + JR NZ,.skip + LD A,(IY+LOGDRV.SIZE_IN_SECTORS+3) + CP (IX+LOGDRV.SIZE_IN_SECTORS+3) JR Z,.found ; .skip: ADD IX,DE @@ -414,8 +426,7 @@ HARD_DRV: ;-----[] ; ВХОД: HL - текущая запись в таблице DEVICE ; B - шаг общего цикла -KILL_FM: - ; +KILL_FM:; LD A,DSS_MAX_DRIVES_AMOUNT SUB B LD C,A diff --git a/DSS/Media_drivers/fdd-drv.asm b/DSS/Media_drivers/fdd-drv.asm index a1cff9b..a3cd2c3 100644 --- a/DSS/Media_drivers/fdd-drv.asm +++ b/DSS/Media_drivers/fdd-drv.asm @@ -250,8 +250,8 @@ FDDRIVE: RET -; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL:DE - SECTORS ON LOGICAL DISK +; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL' - CYLINDERS ON PHISICAL DISK ; DE' - HEADS ON PHISICAL DISK ; BC' - SECTORS PER TRACK ON PHISICAL DISK diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index 9124cd3..7e7e049 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -275,7 +275,7 @@ DRVCLC: ; INC A ; ;+05 DWORD SIZE IN SECTORS ; ;+09 FREE ; ;+15 -; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ;!FIXIT перенести к буферам в конец страницы +; LOGDRV: BLOCK .TBL_Entry * LD_DSK,0 ; .TBL_Entry EQU 16 ; .Size EQU $-LOGDRV @@ -349,8 +349,8 @@ HFRTRAC LD A,DSS_Error.drv.GENERAL_FAILURE SCF RET -; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL:DE - SECTORS ON LOGICAL DISK +; C - PARTITION RECORD NUMBER IN DRIVE MBR. if #FF - then not supported ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL' - CYLINDERS ON PHISICAL DISK ; DE' - HEADS ON PHISICAL DISK ; BC' - SECTORS PER TRACK ON PHISICAL DISK diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index a43a897..13c811b 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -508,9 +508,8 @@ IOCTL_RD: RL D RRA JR NC,.loopShift - -.end: - EX AF,AF' + ; +.end: EX AF,AF' POP AF EX AF,AF' XOR A diff --git a/DSS/build.txt b/DSS/build.txt index 6a34de5..0dd217a 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -843 \ No newline at end of file +880 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index e7e58e7..b5606d6 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit e7e58e7b816a25137a0a253321164e863bbe782e +Subproject commit b5606d6db7c0eecf2e3b3da53040af2432a40569