From 22efbb84c752c0db3d6ab979ec48681b4bdf86bc Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 18 Dec 2023 04:14:12 +1000 Subject: [PATCH] =?UTF-8?q?+=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=20=D0=BB=D1=8E=D0=B1=D0=BE=D0=B3=D0=BE=20=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE=20Primary=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 55 +++++++++----- BOOT/boot.asm | 111 ++++++++++++++++++++++------- DSS/API/bootDsk.asm | 19 ++++- DSS/DRV-MAIN.ASM | 16 +++-- DSS/DSS-MAIN.ASM | 16 +++-- DSS/INTMOUSE.ASM | 9 ++- DSS/Media_drivers/ReScanDRV.ASM | 28 +++++--- DSS/Media_drivers/fdd-drv.asm | 4 +- DSS/Media_drivers/ide-drv.asm | 96 +++++++++++++++++-------- DSS/Media_drivers/ram_disk-drv.asm | 2 + DSS/build.txt | 2 +- SHELL/Commands/DIR.ASM | 11 ++- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 14 files changed, 268 insertions(+), 105 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 88062d5..a647bdf 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -35,12 +35,12 @@ DRIVE: _mSYSID BIT 7,A JR Z,GOOD_DRIVE EX DE,HL - LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка + LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка SBC HL,DE LD A,INCORR JR C,FAIL GOOD_DRIVE: - LD DE,#8200 + LD DE,#8200 ;!HARDCODE LD HL,0 LD IX,2 LD BC,2*256 + BIOS.DRV_READ @@ -174,8 +174,11 @@ CONTINUE: ;DOS LOADED IF UNIVERSAL_BOOT - - LD A,(DRIVE) + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,(DRIVE+1) ; номер раздела + LD L,A + ; + LD A,(DRIVE) ; номер устройства LD C,Dss.Version RST ToDSS jp c,XFAIL.fail @@ -187,7 +190,8 @@ CONTINUE: LD BC,Dss.BootDSK.Set RST ToDSS - LD B,high Dss.BootDSK.Get + ;LD B,high Dss.BootDSK.Get + LD BC,Dss.BootDSK.Get ELSE IF ORIGINAL_DSS @@ -198,6 +202,7 @@ CONTINUE: LD C,Dss.Version RST ToDSS jp c,XFAIL.fail + LD C,Dss.BootDSK ENDIF LD A,STARTDO @@ -208,15 +213,17 @@ CONTINUE: LD BC,Dss.BootDSK.Set RST ToDSS - LD B,high Dss.BootDSK.Get + ;LD B,high Dss.BootDSK.Get + LD BС,Dss.BootDSK.Get ENDIF ENDIF - LD C,Dss.BootDSK + ;LD C,Dss.BootDSK RST ToDSS ADD A,"A" + LD HL,ROOT LD (HL),A LD C,Dss.ChDir @@ -250,23 +257,31 @@ PART_TB: PUSH BC SBC HL,DE JR NZ,ERRP LD IX,BOOT+#01BE - LD B,4 + LD B,4 ;!HARDCODE счетчик записей партиций в MBR DOSAGA: LD A,(IX+4) - CP #0E + CP PartitionSysTypes.FAT16_LBA JR Z,YEPDOS - CP 6 + CP PartitionSysTypes.FAT16 JR Z,YEPDOS - CP 4 + CP PartitionSysTypes.FAT16_32Mb JR Z,YEPDOS - CP 1 + CP PartitionSysTypes.FAT12 JR Z,YEPDOS - LD DE,#10 +.next: LD DE,#10 ADD IX,DE DJNZ DOSAGA ERRP: LD A,ERRPART JP FAIL -YEPDOS: LD E,(IX+08) +YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,#80 + CP (IX+0) + JR NZ,DOSAGA.next + LD A,4 ;!HARDCODE счетчик записей партиций в MBR + SUB B + PUSH AF ; номер загрузочного раздела + ; + LD E,(IX+08) LD D,(IX+09) LD L,(IX+10) LD H,(IX+11) @@ -278,8 +293,13 @@ YEPDOS: LD E,(IX+08) LD DE,BOOT LD BC,1*256 + BIOS.DRV_READ RST ToBIOS_18 - POP BC - LD A,C + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + POP AF + POP BC + LD L,A ; номер загрузочного раздела + LD A,C + ;LD A,C + ; RET SET_PRM: PUSH BC @@ -311,6 +331,9 @@ GET_BPB: LD IX,#0000 JR NZ,NX1 CALL PART_TB ;HDD RET C + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD (DRIVE+1),HL + ; NX1: CP #00 JR NZ,NX2 CALL SET_PRM ;FDD diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 761617c..ef2ace2 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -64,16 +64,24 @@ BEGIN: in a,(SLOT3) ld c,Dss.Version ; узнать версию ДОС RST ToDSS ex de,hl ; hl=тек. версия - ld de,#013C ; 1.60 d=версия, e=модификация, bc - номер сборки. de = #013E, bc = #0064 dos ver 1.62.100 + ld de,#0146 ; 1.70.810 d=версия, e=модификация, bc - номер сборки. de = #0146, bc = 810 dos ver 1.70.810 and a sbc hl,de - jr nc,version_ok - pop hl - ld a,11 ; индекс строки "Error: Need DSS version 1.60..." + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;jr nc,version_ok + jr z,.check_build ; если номер версии 1.70 + jr nc,version_ok ; если номер версии больше 1.70 + ; +.old_ver: pop hl + ld a,11 ; индекс строки "Error: Need DSS version 1.70..." call print_string ld a,-1 jp exit - + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого +.check_build: ld hl,810 ; 1.70.810 d=версия, e=модификация, bc - номер сборки. de = #0146, bc = 810 dos ver 1.70.810 + sbc hl,bc + jr nc,BEGIN.old_ver + ; version_ok: xor a ; индекс строки титла call print_string pop hl ; ком-строка @@ -82,7 +90,7 @@ version_ok: xor a ; jp c,help ; нет параметров ld (disk),a ; заданный номер диска ; узнать номер boot-диска системы - ld bc,0009h + ld bc,Dss.BootDSK.Get RST ToDSS ld (boot_disk),a ; диск (A=0,B=1,..) ; проверить на совпадение дисков @@ -258,16 +266,16 @@ write_boot_loader: rst 18h ret c ; ошибка чтения ld a,(buffer+21) ; байт формата - cp 0F0h ; 1.44Mb + cp #F0 ; 1.44Mb ret c ; незнакомый формат jr z,write_to_floppy - cp 0F9h ; 720kB + cp #F9 ; 720kB jr z,write_to_floppy - cp 0FAh ; RAM disk + cp #FA ; RAM disk jr z,write_to_ram_disk ; pop hl ; восст. баланс стека ; call close_device - cp 0F8h ; винт + cp #F8 ; винт jr z,write_to_hard_disk scf ; незнакомый формат ret @@ -329,22 +337,77 @@ overwrite_floppy: ; вход: нет ; выход: CF-ошибка записи ;------------------------------------------------- - write_to_ram_disk: -write_to_hard_disk: - ld a,(disk) ; номер заданного диска +write_to_: ld a,(disk) ; номер заданного диска ld de,#55AA ld bc,0 * 256 + 8 rst #18 ex af,af' - + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ld b,a + inc c + scf + ret z ; !TODO загрузка с расширенного раздела не поддерживается + dec c + push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + ; ld hl,0 ; ст. разряд лог. сектора ld ix,1 ; мл. разряд ld de,code_loader ; откуда (код загрузчика) ld bc,3*256 + BIOS.DRV_WRITE ; записать 3 сектора (размер загр.) - rst 08h + rst ToBIOS + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + pop bc + ; ret - +write_to_hard_disk: + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + CALL write_to_ + RET C + ; + PUSH BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + LD A,B + LD HL,0 + LD IX,0 + LD DE,buffer + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS + ; check signature + LD HL,(buffer+510) ;!HARDCODE Signature word + LD DE,#AA55 + AND A + SBC HL,DE + POP BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + SCF + RET NZ + PUSH BC + ; set active in buffer + INC C + LD HL,buffer + #01BE + #30 ;!HARDCODE MBR: Offset of last record of partition table in the MBR + LD DE,#10 ; размер одной записи MBR + LD B,4 ;!HARDCODE MBR: Number of entries in the partition table +.loop: XOR A + LD (HL),A + ; + LD A,C + CP B + JR NZ,.next + ; + LD A,#80 + LD (HL),A + ; +.next: AND A + SBC HL,DE + DJNZ .loop + ; save buffer to disk + POP BC ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + ld a,b + ld hl,0 ; ст. разряд лог. сектора + ld ix,0 ; мл. разряд + ld de,buffer ; откуда (код загрузчика) + ld bc,1*256 + BIOS.DRV_WRITE ; записать 3 сектора (размер загр.) + JP ToBIOS + ; ;------------------------------------------------- ; Выделить заданный диск из ком-строки ; @@ -467,14 +530,14 @@ lett2: db "X:",0Dh,0Ah lett3: db "X:",0Dh,0Ah db "and strike any key when ready ...",0Dh,0Ah,0Ah,0 ; - db "Can't install boot on this disk",0Dh,0Ah,0Ah,0 ;7 - db "Invalid drive specification",0Dh,0Ah,0Ah,0 ;8 - db " Error: Can't open file",0Dh,0Ah,0Ah,0 ;9 - db " Error: Can't allocate memory",0Dh,0Ah,0Ah,0 ;10 - db " Error: Need DOS version 1.60 or higher",0Dh,0Ah,0Ah,0;11 - db " Error: Reading error",0Dh,0Ah,0Ah,0 ;12 - db " Error: Can't create file",0Dh,0Ah,0Ah,0 ;13 - db " Error: Writing error",0Dh,0Ah,0Ah,0 ;14 + db "Can't install boot on this disk",0Dh,0Ah,0Ah,0 ;7 + db "Invalid drive specification",0Dh,0Ah,0Ah,0 ;8 + db " Error: Can't open file",0Dh,0Ah,0Ah,0 ;9 + db " Error: Can't allocate memory",0Dh,0Ah,0Ah,0 ;10 + db " Error: Need DOS version 1.70.811 or higher",0Dh,0Ah,0Ah,0 ;11 + db " Error: Reading error",0Dh,0Ah,0Ah,0 ;12 + db " Error: Can't create file",0Dh,0Ah,0Ah,0 ;13 + db " Error: Writing error",0Dh,0Ah,0Ah,0 ;14 endmess: db 0 diff --git a/DSS/API/bootDsk.asm b/DSS/API/bootDsk.asm index b2c5934..2459c5f 100644 --- a/DSS/API/bootDsk.asm +++ b/DSS/API/bootDsk.asm @@ -20,18 +20,33 @@ BOOTDSK: RET ; Сообщить DSS с какого диска загружается система. ; Исп. загрузчик системы для иниц. ячейки "boot_disk". -.SET: LD B,A ;SET BOOT DISK - LD C,0 + +.SET: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;LD B,A ;SET BOOT DISK + ;LD C,0 + LD B,A + LD C,0 + LD (.part),HL + ; .loop: PUSH BC LD A,C LD DE,#55AA LD BC,256*0 + Dss.DRV.GenIOCTL RST ToDSS.DRV + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,C ; номер партиции в MBR диска + ; POP BC JR C,.NoSupport EX AF,AF' ;PHISICAL DRIVE NUMBER CP B JR NZ,.NoSupport + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + EX AF,AF' ; номер партиции в MBR диска +.part+1: LD HL,0 + CP L + JR NZ,.NoSupport + ; ;R13 LD A,#38 ; opcode for JR C,addr LD (BOOTDSK.chg),A diff --git a/DSS/DRV-MAIN.ASM b/DSS/DRV-MAIN.ASM index d851905..90c2501 100644 --- a/DSS/DRV-MAIN.ASM +++ b/DSS/DRV-MAIN.ASM @@ -200,7 +200,7 @@ PORTAL.out_DRV: PUSH BC ; LD (.RETBANK),A ; POP BC ; POP AF ; -ADCALL+1: CALL DISPATCH ; патчится на INTDISK +.ADCALL+1: CALL DISPATCH ; патчится на INTDISK JP PORTAL.out_DRV ; ;' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '; ; @@ -224,7 +224,7 @@ DRV_PAGE.LDRIVE: DB #00 DISPATCH: LD HL,INTDISK - LD (ADCALL),HL + LD (PORTAL.out_DRV.ADCALL),HL INITDVC_RET_DRIVE: CALL INITDVC LD A,(DRV_PAGE.LDRIVE) @@ -251,11 +251,17 @@ DEVICE EQU $ ;+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) ;+09 FREE ;+15 -LOGDRV EQU DEVICE + DEVICE.End -.TBL_Entry EQU 16 -.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry +LOGDRV EQU DEVICE + DEVICE.End +.TBL_Entry EQU 16 +.Size EQU DSS_MAX_DRIVES_AMOUNT * .TBL_Entry +;!TODO сделать структурой +.PHISICAL_DRV_NUMBER EQU 0 +.SECTOR_OFFSET EQU 1 +.SIZE_IN_SECTORS EQU 5 +.PARTITION_RECORD_NUM EQU 9 ; ВХОД: L - логический номер в таблице ; ВЫХОД: IY - начало записи ; ПОРТИТ: HL, IY. HL<-->DE diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index 4b18527..b70ede6 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -265,7 +265,11 @@ PORTAL.out_MAIN: ; ; Первый старт системы, после инициализации адрес в таблице меняется на VERSION F_START: DI - LD (.saveDRV),A + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + ;LD (.saveDRV),A + LD H,A + LD (.saveDRV),HL ; H - номер устройства, L - номер раздела на устройстве + ; ;R12 LD C,BIOS.DRV_VERSION @@ -297,10 +301,12 @@ F_START: DI RST ToDSS.DRV LD (LDRIVE),A ;R05 - -.saveDRV+1: LD A,0 - ;LD BC,1*256 + Dss.BootDSK - ;RST ToDSS +.saveDRV+1: + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD HL,0 ; H - номер устройства, L - номер раздела на устройстве + LD A,H + ;LD A,0 + ; LD B,1 CALL BOOTDSK diff --git a/DSS/INTMOUSE.ASM b/DSS/INTMOUSE.ASM index 61cd369..62f1244 100644 --- a/DSS/INTMOUSE.ASM +++ b/DSS/INTMOUSE.ASM @@ -649,18 +649,17 @@ READ_M: IN A,(PORT_MOUSE.Ctrl) CCF RET Z - ;!TEST mouse freeeeezzzz + ;[x] mouse freeeeezzzz LD BC,#2000 ; TST_01: IN A,(PORT_MOUSE.Ctrl) RRCA - ;!TEST mouse freeeeezzzz + ;[x] mouse freeeeezzzz JR C,.NXT DEC BC LD A,B OR C JR NZ,TST_01 - SCF RET ;JR NC,TST_01 ; @@ -671,12 +670,12 @@ TST_01: IN A,(PORT_MOUSE.Ctrl) CCF RET NZ - ;[x] mouse freeeeezzzz !TEST + ;[x] mouse freeeeezzzz LD BC,#2000 ; TST_02: IN A,(PORT_MOUSE.Ctrl) RRCA - ;[x] mouse freeeeezzzz !TEST + ;[x] mouse freeeeezzzz JR C,.NXT DEC BC LD A,B diff --git a/DSS/Media_drivers/ReScanDRV.ASM b/DSS/Media_drivers/ReScanDRV.ASM index b62d351..21f7f2b 100644 --- a/DSS/Media_drivers/ReScanDRV.ASM +++ b/DSS/Media_drivers/ReScanDRV.ASM @@ -41,7 +41,6 @@ ReScanDRV: INC HL LD H,(HL) LD L,A - ; [ищем что за драйв] EX DE,HL ; FDD? @@ -276,6 +275,7 @@ Find_Record: ;-----------------------[] ERROR_BOOTDRV_DIES: + DI LD BC,BIOS.LP_OPEN_S.TXT_80x32_Default LD E,1 RST ToBIOS @@ -370,25 +370,31 @@ HARD_DRV: LD DE,LOGDRV.TBL_Entry LD B,DSS_MAX_DRIVES_AMOUNT ; -.loop: LD A,(IY+0) +.loop: LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;CP #FF ;JR Z,.skip - CP (IX+0) + CP (IX+LOGDRV.PHISICAL_DRV_NUMBER) JR NZ,.skip - ; - LD A,(IY+1) - CP (IX+1) + ; + LD A,(IY+LOGDRV.SECTOR_OFFSET) + CP (IX+LOGDRV.SECTOR_OFFSET) JR NZ,.skip - LD A,(IY+2) - CP (IX+2) + LD A,(IY+LOGDRV.SECTOR_OFFSET+1) + CP (IX+LOGDRV.SECTOR_OFFSET+1) + JR NZ,.skip + LD A,(IY+LOGDRV.SECTOR_OFFSET+2) + CP (IX+LOGDRV.SECTOR_OFFSET+2) + JR NZ,.skip + LD A,(IY+LOGDRV.SECTOR_OFFSET+3) + CP (IX+LOGDRV.SECTOR_OFFSET+3) JR Z,.found - ; + ; .skip: ADD IX,DE DJNZ .loop ; ЗАПИСЬ НЕ НАЙДЕНА ; Грохаем старую запись в OLD_TABLES.LOGDRV LD A,#FF - LD (IY+0),A + LD (IY+LOGDRV.PHISICAL_DRV_NUMBER),A ; Достаём положение в OLD_TABLES.DEVICE POP HL ; Достаём шаг общего цикла для получения лог.номера драйва в KILL_FM @@ -400,7 +406,7 @@ HARD_DRV: JP ReScanDRV.nextN2 ; .found: ; затираем в новой таблице совпавший драйв (чтоб легче было парсить оставшееся) - LD (IX+0),#FF + LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),#FF JP ReScanDRV.nextN ; ; CD_ROM: diff --git a/DSS/Media_drivers/fdd-drv.asm b/DSS/Media_drivers/fdd-drv.asm index f7b8813..a1cff9b 100644 --- a/DSS/Media_drivers/fdd-drv.asm +++ b/DSS/Media_drivers/fdd-drv.asm @@ -250,6 +250,7 @@ FDDRIVE: RET +; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL:DE - SECTORS ON LOGICAL DISK ; HL' - CYLINDERS ON PHISICAL DISK ; DE' - HEADS ON PHISICAL DISK @@ -311,7 +312,8 @@ FDDRIVE: LD L,H LD H,B EX DE,HL - EXX + EXX + LD C,0 ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого AND A RET diff --git a/DSS/Media_drivers/ide-drv.asm b/DSS/Media_drivers/ide-drv.asm index fac1df9..9124cd3 100644 --- a/DSS/Media_drivers/ide-drv.asm +++ b/DSS/Media_drivers/ide-drv.asm @@ -210,9 +210,10 @@ RESR_H LD A,DSS_Error.drv.INVALID_COMMAND ;--------------------------------------------------------------------[v] ; c=0 Initialization INIT_H: PUSH IY - ;!TEST ;[ ] + ;!TEST ;[ ] для rescanDRV XOR A LD (DRVCLC.count),A + ; LD HL,LOGDRV LD (OFFSECT),HL @@ -348,6 +349,7 @@ 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 ; HL' - CYLINDERS ON PHISICAL DISK ; DE' - HEADS ON PHISICAL DISK @@ -377,7 +379,7 @@ HGETPRM: ; LOGDRV_ENTRY_FIND LOGDRV ; - LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... PUSH IY LD C,BIOS.DRV_GET_PAR RST ToBIOS @@ -393,13 +395,16 @@ HGETPRM: LD B,D EXX ; SECTORS ON LOGICAL DISK - LD E,(IY+5) - LD D,(IY+6) - LD L,(IY+7) - LD H,(IY+8) + 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) + ; + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD C,(IY+LOGDRV.PARTITION_RECORD_NUM) ; номер партиции в MBR диска ; EX AF,AF' - LD A,(IY+0) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... + LD A,(IY+LOGDRV.PHISICAL_DRV_NUMBER) ;MASTER/SLAVE PHISICAL DRIVE NUMBER #80/#81/... EX AF,AF' ; AND A @@ -525,18 +530,32 @@ HIGHDOS: LD D,XH LD E,XL LD IX,(OFFSECT) - LD (IX+1),E ;BPB SECTOR - LD (IX+2),D - LD (IX+3),L - LD (IX+4),H + LD (IX+LOGDRV.SECTOR_OFFSET+0),E ;BPB SECTOR + LD (IX+LOGDRV.SECTOR_OFFSET+1),D + LD (IX+LOGDRV.SECTOR_OFFSET+2),L + LD (IX+LOGDRV.SECTOR_OFFSET+3),H LD E,(IY+12) LD D,(IY+13) LD L,(IY+14) LD H,(IY+15) - LD (IX+5),E ;SIZE DISK - LD (IX+6),D - LD (IX+7),L - LD (IX+8),H + LD (IX+LOGDRV.SIZE_IN_SECTORS+0),E ;SIZE DISK + LD (IX+LOGDRV.SIZE_IN_SECTORS+1),D + LD (IX+LOGDRV.SIZE_IN_SECTORS+2),L + LD (IX+LOGDRV.SIZE_IN_SECTORS+3),H + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого +ExtendedPartitionFlag+1: + LD A,0 + OR A ; !TODO загрузка с расширенного раздела не поддерживается + LD A,#FF + JR NZ,.not_supported ; если расширенный раздел, то облом + ; + POP BC + PUSH BC + LD A,4 ;!HARDCODE MBR: 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 @@ -545,17 +564,18 @@ HIGHDOS: LD (DRVCLC.count),A ; LD A,(DRV_NUM) - LD (IX+0),A + LD (IX+LOGDRV.PHISICAL_DRV_NUMBER),A LD DE,LOGDRV.TBL_Entry ;DSKITEM ADD IX,DE LD (OFFSECT),IX -NXTPART: - LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry - ADD IY,DE - POP BC - DJNZ DOSAGA - AND A - RET + JP NXTPART +; NXTPART: +; LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry +; ADD IY,DE +; POP BC +; DJNZ DOSAGA +; AND A +; RET ; @@ -564,17 +584,18 @@ NOEXTDS: JR Z,HIGHDOS CP PartitionSysTypes.FAT16_LBA JR Z,HIGHDOS - CP PartitionSysTypes.FAT16_32M + CP PartitionSysTypes.FAT16_32Mb JR Z,MEDIDOS CP PartitionSysTypes.FAT12 JR Z,EASYDOS CP PartitionSysTypes.Win_Ext_LBA JR Z,SUBLEV ;[x] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация детекта - OR A ;PartitionSysTypes.Empty - JR NZ,NXTPART - POP BC ; баланс стека - RET + ;OR A ;PartitionSysTypes.Empty + ;JR NZ,NXTPART + JR NXTPART ; раздел не поддерживается + ;POP BC ; баланс стека + ;RET ;POP BC ;OR A ;RET Z @@ -583,7 +604,6 @@ NOEXTDS: ;RET ; - PARTIT: IN A,(SLOT3) PUSH AF LD A,SHARED_PAGE @@ -623,14 +643,30 @@ SUBLEV: PUSH IY LD IX,(CURSECH) PUSH DE PUSH IX + ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(ExtendedPartitionFlag) + INC A + LD (ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; CALL EXTDOS + ;[ ] 17/12/23 пропуск разделов с неизвестными ФС, оптимизация перебора разделов + LD A,(ExtendedPartitionFlag) + DEC A + LD (ExtendedPartitionFlag),A ; !TODO загрузка с расширенного раздела не поддерживается + ; POP IX POP DE LD (CURSECL),DE LD (CURSECH),IX CALL LOADSEC POP IY - JP NXTPART +NXTPART: + LD DE,#10 ;!HARDCODE SZ_PTE - Size of a partition table entry + ADD IY,DE + POP BC + DJNZ DOSAGA + AND A + RET ; EXTDOS: LD HL,(EXTDOSL) LD DE,(EXTDOSH) diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index 4596085..a43a897 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -455,6 +455,7 @@ IOCTL_RD: SCF RET +; C - PARTITION RECORD NUMBER IN DRIVE MBR must be 0 here ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого ; HL:DE - SECTORS ON LOGICAL DISK ; HL' - CYLINDERS ON PHISICAL DISK ; DE' - HEADS ON PHISICAL DISK @@ -515,6 +516,7 @@ IOCTL_RD: XOR A LD L,A LD H,L + LD C,A ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,%10100000 RET diff --git a/DSS/build.txt b/DSS/build.txt index 773855c..189296e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -810 \ No newline at end of file +825 \ No newline at end of file diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index f295c1e..cff6327 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -70,6 +70,11 @@ cmd_dir: call MESSAGE ; вывести строку ld c,Dss.WaitKey rst ToDSS + dec d + jr nz,.skip_esc + xor a + ld (.key_p),a ; отменяем ESC +.skip_esc: ld a,32-1 .skip_wait: PUSH AF @@ -135,9 +140,9 @@ cmd_dir: .next: ld de,work_buffer1 ; 80 буфер ld c,Dss.F_Next ; поиск след. RST ToDSS - jr nc,.loop ; назад в цикл, если не конец списка - pop af ; лишнее - + jp nc,.loop ; назад в цикл, если не конец списка + ; + pop af ; баланс стека ; Десятичный вывод .print: ld hl,(D88DC) ld ix,PRM1 ; буфер diff --git a/SHELL/build.txt b/SHELL/build.txt index 2d82846..3d9983a 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -289 \ No newline at end of file +295 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index b9ca4f4..f112b13 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b9ca4f484d074cc80c221ad37a2a40e7ee670a16 +Subproject commit f112b1359045d7fe7aa47f843011fddc5e03eba2