From bb63a4071de03159ea55de8d5a93b7333f188161 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 14 Apr 2024 01:54:39 +1000 Subject: [PATCH] =?UTF-8?q?DSS:=20=D0=B4=D0=B5=D1=82=D0=B5=D0=BA=D1=82=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D1=80=D1=8F=D0=B4=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20=20FAT=20=D0=B2=20BPB=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=20=D0=BF=D0=BE=20=D0=B2=D1=81=D0=B5=D0=BC=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=BD=D0=B0=D0=BC.=20=D0=94=D0=BE=D0=BF=D0=B8?= =?UTF-8?q?=D0=BB=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BE=20FAT?= =?UTF-8?q?32.=20SYS:=20=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0?= =?UTF-8?q?=20System.dos=20>=20#4000=20=D0=B1=D0=B0=D0=B9=D1=82=D0=BE?= =?UTF-8?q?=D0=B2.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B1=D0=B0=D0=B3=20=D1=81=20=D0=BD=D0=B5=D0=BD=D1=83?= =?UTF-8?q?=D0=B6=D0=BD=D0=BE=D0=B9=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=BE=D0=B9=20=D1=80=D0=B0=D1=81=D1=81=D1=82=D0=BE=D1=8F?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BE=D1=82=20BPB=20=D0=B4=D0=BE=20FAT=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20HDD.=20SHELL:=20=D0=BC=D0=B5=D0=BB=D0=BA?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BOOT/DSSBOOT.ASM | 1479 ++++++++++++++-------------- BOOT/boot.asm | 8 +- DSS/API.asm | 2 +- DSS/API/Delete.asm | 2 +- DSS/API/MkDir.asm | 10 +- DSS/API/Open.asm | 2 +- DSS/API/RmDir.asm | 4 +- DSS/API/Write.asm | 2 +- DSS/API/curDisk.asm | 2 +- DSS/API/diskINF.asm | 16 +- DSS/DOS_Proc.asm | 15 +- DSS/DSS-MAIN.ASM | 22 +- DSS/FS/FAT/FAT.asm | 292 ++++-- DSS/FS/FAT/FAT_X.asm | 110 +-- DSS/Media_drivers/ram_disk-drv.asm | 9 +- DSS/Structures.inc | 45 +- DSS/build.txt | 2 +- DSS/defines.inc | 7 +- SHELL/BATCH.ASM | 10 +- SHELL/build.txt | 2 +- Shared_Includes | 2 +- 21 files changed, 1124 insertions(+), 919 deletions(-) diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index 690d745..051747a 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -19,118 +19,741 @@ OUTPUT 'build/DSSloader.bin' -ADRIVE EQU #00 -CDRIVE EQU #02 +;ADRIVE EQU #00 +;CDRIVE EQU #02 -DRIVE: _mSYSID - DI - LD (DRIVE),A - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - XOR A - LD (DRIVE+1),A +DRIVE: _mSYSID + DI + LD (DRIVE),A + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + XOR A + LD (DRIVE+1),A + ; + LD C,BIOS.DRV_VERSION + RST ToBIOS_18 + ; + LD HL,FAIL + PUSH HL + ; + LD A,INCORR + ;JR C,FAIL + RET C + LD A,(DRIVE) + BIT 7,A + JR Z,GOOD_DRIVE + EX DE,HL + LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка + SBC HL,DE + LD A,INCORR + ;JR C,FAIL + RET C +GOOD_DRIVE: LD DE,#8200 ;!HARDCODE + LD HL,0 + LD IX,2 + LD BC,2*256 + BIOS.DRV_READ + LD A,(DRIVE) + RST ToBIOS_18 + JP C,FAIL.NULL + ; + ; CONTINUE + ;!TEST 26/03/2024 + LD SP,#C000 + ; + LD HL,0 + LD (DISKL),HL + LD (DISKH),HL + ; + LD BC,1*256 + BIOS.GetMem + RST ToBIOS_18 ;GET PAGE FOR DOS + LD (BANKDOS),A + ; + OUT (SLOT0),A + ; + CALL GET_BPB ;READ BPB + LD A,ERRIBPB + ;JP C,FAIL + RET C + CALL GETROOT + LD A,NO_SYS + ;JP C,FAIL + RET C + ; [ ] загрузка system.dos больше #4000 байтов + LD HL,(FSIZE1) + LD A,H + OR L + JR NZ,.set_size + LD DE,(FSIZE0) + LD HL,#4000 + SBC HL,DE + RLA +.set_size: LD (BIG_SHELL),A + ; + LD HL,(FCLUSTR) + LD DE,#C000 + CALL FLOAD ; загрузка + DI + XOR A + OUT (SYS_PORT.OFF),A + ; + LD A,#10 + LD BC,#7FFD + OUT (C),A + ; + LD A,1 + LD B,#1F ;1FFD + OUT (C),A + ; + ; LD A,(BANKDOS) + ; OUT (SLOT0),A + ;DOS LOADED + IF UNIVERSAL_BOOT + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,(DRIVE+1) ; номер раздела + LD L,A + ; + LD A,(DRIVE) ; номер устройства + LD C,Dss.Version + RST ToDSS + JP C,XFAIL.fail + ; + LD A,STARTDO + CALL DOSMESS + ; + LD A,(DRIVE) + LD BC,Dss.BootDSK.Set + 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,XFAIL.fail + LD C,Dss.BootDSK + ENDIF ; + LD A,STARTDO + CALL DOSMESS + IF ORIGINAL_DSS + LD A,(DRIVE) + LD BC,Dss.BootDSK.Set + RST ToDSS + LD BС,Dss.BootDSK.Get + ENDIF + ENDIF ; - LD C,BIOS.DRV_VERSION - RST ToBIOS_18 - LD A,INCORR - JR C,FAIL - LD A,(DRIVE) - BIT 7,A - JR Z,GOOD_DRIVE - EX DE,HL - LD DE,2*256 + 21 ;!HARDCODE если версия ниже 2.21, то ошибка - SBC HL,DE - LD A,INCORR - JR C,FAIL -GOOD_DRIVE: - LD DE,#8200 ;!HARDCODE - LD HL,0 - LD IX,2 - LD BC,2*256 + BIOS.DRV_READ - LD A,(DRIVE) - RST ToBIOS_18 - JR C,NULL - JP CONTINUE + RST ToDSS + ; + ADD A,"A" + ; + LD HL,ROOT + LD (HL),A + LD C,Dss.ChDir + RST ToDSS + ; + LD HL,PSHELL + LD BC,Dss.Exec + RST ToDSS +.NoShell: LD A,NOSHELL + ;JP XFAIL +XFAIL: CALL DOSMESS +.fail: LD A,FAILURE + CALL DOSMESS + DI + HALT +.halt: JR .halt +; -FAIL CALL MESSAGE -NULL LD A,FAILURE - CALL MESSAGE - DI - HALT - JR $ +; +PART_TB: PUSH BC + LD HL,(BOOT+510) + LD DE,#AA55 + AND A + SBC HL,DE + JR NZ,.ERRP + LD IX,BOOT+#01BE + LD B,4 ;!HARDCODE счетчик записей партиций в MBR +.DOSAGA: LD A,(IX+4) + CP PartitionSysTypes.FAT16_LBA + JR Z,YEPDOS + CP PartitionSysTypes.FAT16 + JR Z,YEPDOS + CP PartitionSysTypes.FAT16_32Mb + JR Z,YEPDOS + CP PartitionSysTypes.FAT12 + JR Z,YEPDOS +.next: LD DE,#10 + ADD IX,DE + DJNZ .DOSAGA +.ERRP: LD A,ERRPART + JP FAIL +; -FMESAGE LD HL,MSG0 - LD BC,MSGE-MSG0 - INC A - EX AF,AF' - XOR A - EX AF,AF' -NEXTMSG EX AF,AF' - CPIR - RET PO - RET NZ - EX AF,AF' - DEC A - JR NZ,NEXTMSG - RET +; +YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + LD A,#80 + CP (IX+0) + JR NZ,PART_TB.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) + LD XH,D + LD XL,E + LD (DISKL),IX + LD (DISKH),HL + LD A,(DRIVE) + LD DE,BOOT + LD BC,1*256 + BIOS.DRV_READ + RST ToBIOS_18 + ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого + POP AF + POP BC + LD L,A ; номер загрузочного раздела + LD A,C + ;LD A,C + ; + RET +; -MESSAGE CALL FMESAGE - JR PRINTZ +; +SET_PRM: PUSH BC + LD A,B + LD C,BIOS.DRV_GET_PAR + RST ToBIOS_18 + LD A,(BOOT.SectorsPerTrack) + LD L,A + POP AF + PUSH AF + LD C,BIOS.DRV_SET_PAR + RST ToBIOS_18 + POP BC + LD A,C + RET +; -;R01 Start -PRINTZ LD A,(HL) ;R01 - INC HL - OR A - RET Z - CALL PRINTX - JR PRINTZ +; +GET_BPB: LD IX,#0000 + LD HL,#0000 + LD DE,BOOT + LD BC,1*256 + BIOS.DRV_READ + LD A,(DRIVE) + RST ToBIOS_18 + RET C + LD A,(DRIVE) + LD B,A + AND #F0 + LD C,A + CP #80 + 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 +.NX2: LD HL,(BOOT+510) + LD DE,#AA55 + AND A + SBC HL,DE + SCF + RET NZ + LD IY,BOOT ;Analysing Block Parametr BIOS + LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) + CP #F0 + RET C + LD HL,0 ;calc. first sector FAT + LD (DIR_FRH),HL + ; + LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec + LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) + ADD HL,DE + LD (FAT_FRM),HL ;first sector FAT + LD E,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16) ;sectors in FAT + LD D,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16+1) + LD A,(BOOT.Number_of_FATs) ;amount FATs +.C_DATA1: ADD HL,DE + DEC A + JR NZ,.C_DATA1 + LD (DIR_FRM),HL ;first sector DIR + EX DE,HL + LD L,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR) ;Number file handel + LD H,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR+1) + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD A,H + SRL A + LD (DIR_S_S),A ;Sectors per dir + LD L,A + LD H,0 + ADD HL,DE + LD (DAT_FRM),HL ;First sector data + ; + LD C,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector) ;Size sector + LD B,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector+1) + LD HL,0 + LD A,(BOOT.SectorsPerCluster) +.NEXTAD3: ADD HL,BC ;calc. cluster size + DEC A + JR NZ,.NEXTAD3 + LD (CLU_LEN),HL + LD HL,BOOT.ID_FAT + LD DE,FATMSG + LD B,3 +.R_BPBL1: LD A,(DE) + CP (HL) + JP NZ,.IBMDOS_ + INC HL + INC DE + DJNZ .R_BPBL1 +.FID: LD A,(HL) + INC HL + CP " " + JR Z,.FID + CP "1" + SCF + RET NZ + LD A,(HL) + CP "6" ; FAT16 + LD HL,#FFFF + JR Z,.BPB_FAT + CP "2" ; FAT12 + SCF + RET NZ + LD HL,#0FFF +.BPB_FAT: LD (FAT_TYP),A + LD (ENDCLUS),HL + ; + LD IX,(DISKL) + LD HL,(DISKH) + LD DE,(FAT_FRM) + LD BC,#0000 + ADD IX,DE + ADC HL,BC + ;HL:IX + LD DE,FAT + LD BC,3*256 + BIOS.DRV_READ + LD A,(DRIVE) + RST ToBIOS_18 + RET C + LD HL,0 + LD (FatCache),HL + XOR A + RET + ; +.IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) + CP #F0 + RET C + CP #F8 + LD A,"6" + LD HL,#FFFF + JR Z,.BPB_FAT + LD A,"2" + LD HL,#0FFF + JR .BPB_FAT +; -PRINTX CP #0D - JR Z,CR_ - CP #0A - JR Z,LF_ - LD BC,1*256 + BIOS.LP_PRINT_SYM - RST ToBIOS_18 - RET -CR_ LD C,BIOS.LP_GET_PLACE - RST ToBIOS_18 - LD E,0 - LD C,#84 - RST ToBIOS_18 - RET -LF_ LD C,BIOS.LP_GET_PLACE - RST ToBIOS_18 - LD A,#1F - CP D - JR NZ,LF2 - PUSH DE - PUSH HL - LD DE,#0020 - LD BC,1*256 + BIOS.LP_SCROLL_UD - RST ToBIOS_18 - LD DE,#1F00 - LD C,BIOS.LP_SET_PLACE - RST ToBIOS_18 - LD A," " - LD BC,#50 + BIOS.LP_PRINT_SYM - RST ToBIOS_18 - POP HL - POP DE - DEC D -LF2 INC D - LD C,BIOS.LP_SET_PLACE - RST ToBIOS_18 - RET ;R01 +; поиск system.dos +GETROOT: LD HL,(DIR_FRH) + LD IX,(DIR_FRL) + LD BC,(DISKL) + LD DE,(DISKH) + LD A,(DIR_S_S) +.NEXTSEC: PUSH AF + ADD IX,BC + ADC HL,DE + ;HL:IX + PUSH IX + PUSH HL + LD BC,1*256 + BIOS.DRV_READ + LD DE,DIR + LD A,(DRIVE) + RST ToBIOS_18 + CALL SEARCH + POP HL + POP IX + POP BC + RET C + RET NZ + LD A,B + LD DE,0 + LD BC,1 + DEC A + JR NZ,.NEXTSEC + SCF + RET +; + +; +SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 + LD IX,DIR-#0020 +.SKIPNAM: LD DE,#0020 + ADD IX,DE + DEC C + RET Z + LD A,(IX+00) + OR A + SCF + RET Z + CP #E5 + JR Z,.SKIPNAM + LD A,(IX+11) + AND #10 + JR NZ,.SKIPNAM + LD HL,MASKARE + LD D,XH + LD E,XL + LD B,11 +.SEARCH2: LD A,(DE) + CP (HL) + JR NZ,.SKIPNAM + INC HL + INC DE + DJNZ .SEARCH2 + LD D,XH + LD E,XL + LD HL,HANDBUF + EX DE,HL + LD BC,#0020 + LDIR + XOR A + INC A + RET + +; HL - CLUSTER +; DE - ADDRESS +;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы +FLOAD: LD (READMEM),DE +.LD_FILE: PUSH HL ; system.dos first cluster + CALL NSECTOR ; Cluster to Sector + LD DE,(READMEM) + LD A,(BOOT.SectorsPerCluster) + CP #20 + LD C,BIOS.DRV_READ_LONG + JR C,.SMALL_CLUSTER + LD A,(BANKDOS) + EX AF,AF' + ;LD BC,#20*256 + BIOS.DRV_READ_LONG + LD B,#20 ; !HARDCODE кол-во загружаемых секторов +.set_drv: LD A,(DRIVE) + RST ToBIOS_18 + JP C,GOOD_DRIVE.NoShell + POP HL + ; [ ] загрузка system.dos больше #4000 байтов + ;AND A + ;RET + LD A,(BIG_SHELL) + OR A + RET Z + ; + XOR A + LD (BIG_SHELL),A + PUSH HL + CALL NSECTOR + LD DE,#20 ; !HARDCODE кол-во прочитанных секторов + AND A + ADD IX,DE + JR NC,.no_inc_hl + INC HL +.no_inc_hl: LD BC,SUBLOAD_SIZE*256 + BIOS.DRV_READ ; !HARDCODE кол-во ДОзагружаемых секторов + LD DE,#4000 + JR .set_drv + ; +.SMALL_CLUSTER: LD B,A + ;LD C,BIOS.DRV_READ_LONG + LD A,(BANKDOS) + EX AF,AF' + LD A,(DRIVE) + RST ToBIOS_18 + JP C,GOOD_DRIVE.NoShell + ; + LD HL,(READMEM) + LD DE,(CLU_LEN) + ADD HL,DE + LD (READMEM),HL + ; [ ] загрузка system.dos больше #4000 байтов + ;POP HL + ;RET C + CALL C,.more_than_1 + POP HL + RET C + ; + CALL R_F_FAT ; next cluster in chain + RET C + EX DE,HL + JP .LD_FILE + ; [ ] загрузка system.dos больше #4000 байтов +.more_than_1: LD A,(BIG_SHELL) + OR A + SCF + RET Z + IN A,(SLOT1) + LD HL,BANKDOS + CP (HL) + CCF + RET Z + LD (BANKDOS),A + LD HL,#C000 + LD (READMEM),HL + AND A + RET + + +; + +; --> HL - CLUSTER +; <-- HL:IX - SECTOR +NSECTOR: LD DE,0 + DEC HL + DEC HL + LD A,(BOOT.SectorsPerCluster) + XOR 1 + JR Z,.skip + ; + RRA +.loop: ADD HL,HL + RL E + RL D + RRA + JP NC,.loop + ; +.skip: EX DE,HL + LD XL,E + LD XH,D + LD DE,(DAT_FRM) ;first data sector + XOR A + ADD IX,DE + LD D,A + LD E,A + ADC HL,DE + ; + LD DE,(DISKL) + ADD IX,DE + LD DE,(DISKH) + ADC HL,DE + RET +;----------------- +;!TODO сделать это макросами или инклюдами универсальными. повторяются в досе и ещё где-то +; HL - CLUSTER +; DE - (CLUSTER) +R_F_FAT: PUSH HL + LD A,(FAT_TYP) + CP "2" + JP Z,.R_F_F12 + ; +.R_F_F16: LD DE,768 ; DE - CLUSTERS IN CASH + XOR A +.R_F_00H: INC A ; HL - CLUSTER + SBC HL,DE + JP NC,.R_F_00H + ADD HL,DE + ADD HL,HL ; HL - FAT OFFSET (FROM CASH) + DEC A + LD BC,(FatCache) ; A - ELEMENT OF CASH + CP C + CALL NZ,RE_FAT + LD DE,FAT + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + LD HL,#FFEF + XOR A + SBC HL,DE + POP HL + RET + ; +.R_F_F12 LD D,H + LD E,L + ADD HL,HL + ADD HL,DE + RR H + RR L + PUSH AF + EX DE,HL + LD HL,(BOOT.BytesPerSector) + LD B,H + LD C,L + ADD HL,HL + ADD HL,BC + EX DE,HL + XOR A ; DE - SIZE SECTOR * 3 +.R_F_00: INC A ; HL - FAT OFFSET + SBC HL,DE + JP NC,.R_F_00 + ADD HL,DE + DEC A + LD BC,(FatCache) + CP C + CALL NZ,RE_FAT + LD DE,FAT + ADD HL,DE + POP AF + LD E,(HL) + INC HL + LD D,(HL) + JP C,.R_F_F01 + LD A,D + AND #0F + LD D,A + JP .R_F_F02 + ; +.R_F_F01: LD A,E + AND #F0 + RR D ; вправо на 4 битa + RRA + RR D + RRA + RR D + RRA + RR D + RRA + LD E,A +.R_F_F02: LD HL,#0FEF + XOR A + SBC HL,DE + POP HL + RET +; + +; +RE_FAT: PUSH HL + LD L,A + LD H,0 + LD (FatCache),HL + LD E,L + LD D,H + ADD HL,HL + ADD HL,DE + LD IX,0 + LD DE,(FAT_FRM) + ADD HL,DE + EX DE,HL + JR NC,.NOINX + INC IX +.NOINX: LD HL,(DISKL) + ADD HL,DE + EX DE,HL + LD BC,(DISKH) + JR NC,.NOINX2 + INC IX +.NOINX2: ADD IX,BC + PUSH IX + PUSH DE + POP IX + POP HL + LD DE,FAT + LD BC,3*256 + BIOS.DRV_READ + LD A,(DRIVE) + RST ToBIOS_18 + POP HL + RET +; + +//////////////////////////////////////////////////////////////////////// +FAIL: CALL MESSAGE +.NULL: LD A,FAILURE + CALL MESSAGE + DI + HALT + JR $ +; + +; +DOSMESS: CALL FMESAGE + LD C,Dss.PChars + JP ToDSS +; + +; +FMESAGE: LD HL,MSG0 + LD BC,MSGE-MSG0 + INC A + EX AF,AF' + XOR A + EX AF,AF' +.NEXTMSG: EX AF,AF' + CPIR + RET PO + RET NZ + EX AF,AF' + DEC A + JR NZ,.NEXTMSG + RET +; + +; +MESSAGE: CALL FMESAGE + ;R01 Start +PRINTZ: LD A,(HL) ;R01 + INC HL + OR A + RET Z + CALL PRINTX + JR PRINTZ +; + +; +PRINTX: CP #0D + JR Z,.CR_ + CP #0A + JR Z,.LF_ + LD BC,1*256 + BIOS.LP_PRINT_SYM + RST ToBIOS_18 + RET +.CR_: LD C,BIOS.LP_GET_PLACE + RST ToBIOS_18 + LD E,0 + LD C,#84 + JP ToBIOS_18 + ;RET + ; +.LF_: LD C,BIOS.LP_GET_PLACE + RST ToBIOS_18 + LD A,#1F + CP D + JR NZ,.LF2 + PUSH DE + PUSH HL + LD DE,#0020 + LD BC,1*256 + BIOS.LP_SCROLL_UD + RST ToBIOS_18 + LD DE,#1F00 + LD C,BIOS.LP_SET_PLACE + RST ToBIOS_18 + LD A," " + LD BC,#50 + BIOS.LP_PRINT_SYM + RST ToBIOS_18 + POP HL + POP DE + DEC D +.LF2: INC D + LD C,BIOS.LP_SET_PLACE + JP ToBIOS_18 + ;RET ;R01 ;R01 End -FAILURE EQU 0 -INCORR EQU 1 -ERRPART EQU 2 -ERRIBPB EQU 3 -NO_SYS EQU 4 -NOSHELL EQU 5 -STARTDO EQU 6 +FAILURE EQU 0 +INCORR EQU 1 +ERRPART EQU 2 +ERRIBPB EQU 3 +NO_SYS EQU 4 +NOSHELL EQU 5 +STARTDO EQU 6 ;a BIOS version that is incompatible with this version of DOS ; 0 10 20 30 40 50 60 70 80 MSG0: DB 0 @@ -141,596 +764,18 @@ MSG0: DB 0 DB "Invalid BOOT sector.",13,10,0 DB "Can't open file SYSTEM.DOS...",13,10,0 DB 13,10,"Starting DSS... ",13,10,13,10,0 -MSGE DB 0 - -CONTINUE: - ;!TEST 26/03/2024 - LD SP,#C000 - ; - - LD HL,0 - LD (DISKL),HL - LD (DISKH),HL - - LD BC,1*256 + BIOS.GetMem - RST ToBIOS_18 ;GET PAGE FOR DOS - LD (BANKDOS),A - CALL GET_BPB ;READ BPB - LD A,ERRIBPB - JP C,FAIL - CALL GETROOT - LD A,NO_SYS - JP C,FAIL - - LD HL,(FCLUSTR) - LD DE,#C000 - CALL FLOAD ; загрузка - DI - XOR A - OUT (SYS_PORT.OFF),A - - LD A,#10 - LD BC,#7FFD - OUT (C),A - - LD A,1 - LD B,#1F ;1FFD - OUT (C),A - - LD A,(BANKDOS) - OUT (SLOT0),A - -;DOS LOADED - IF UNIVERSAL_BOOT - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - LD A,(DRIVE+1) ; номер раздела - LD L,A - ; - LD A,(DRIVE) ; номер устройства - LD C,Dss.Version - RST ToDSS - jp c,XFAIL.fail - - LD A,STARTDO - CALL DOSMESS - - LD A,(DRIVE) - LD BC,Dss.BootDSK.Set - RST ToDSS - - ;LD B,high Dss.BootDSK.Get - LD BC,Dss.BootDSK.Get - ELSE - - IF ORIGINAL_DSS - LD C,Dss.Version - RST ToDSS - ELSE - LD A,(DRIVE) - LD C,Dss.Version - RST ToDSS - jp c,XFAIL.fail - LD C,Dss.BootDSK - ENDIF - - LD A,STARTDO - CALL DOSMESS - - IF ORIGINAL_DSS - LD A,(DRIVE) - LD BC,Dss.BootDSK.Set - RST ToDSS - - ;LD B,high Dss.BootDSK.Get - LD BС,Dss.BootDSK.Get - ENDIF - ENDIF - - ;LD C,Dss.BootDSK - RST ToDSS - - ADD A,"A" +MSGE: DB 0 +; +PSHELL: DB '\SYSTEM.EXE /P',0 +ROOT: DB 'X:\',0 +MASKARE: DB "SYSTEM DOS" +FATMSG: DB "FAT" +//////////////////////////////////////////////////////////////////////// - LD HL,ROOT - LD (HL),A - LD C,Dss.ChDir - RST ToDSS - - LD HL,PSHELL - LD BC,Dss.Exec - RST ToDSS - LD A,NOSHELL - JP XFAIL - -PSHELL: DB '\SYSTEM.EXE /P',0 -ROOT: DB 'X:\',0 - -DOSMESS CALL FMESAGE - LD C,Dss.PChars - RST ToDSS - RET - -XFAIL: CALL DOSMESS -.fail: LD A,FAILURE - CALL DOSMESS - DI - HALT -.halt: JR .halt - -PART_TB: PUSH BC - LD HL,(BOOT+510) - LD DE,#AA55 - AND A - SBC HL,DE - JR NZ,ERRP - LD IX,BOOT+#01BE - LD B,4 ;!HARDCODE счетчик записей партиций в MBR -DOSAGA: LD A,(IX+4) - CP PartitionSysTypes.FAT16_LBA - JR Z,YEPDOS - CP PartitionSysTypes.FAT16 - JR Z,YEPDOS - CP PartitionSysTypes.FAT16_32Mb - JR Z,YEPDOS - CP PartitionSysTypes.FAT12 - JR Z,YEPDOS -.next: LD DE,#10 - ADD IX,DE - DJNZ DOSAGA -ERRP: LD A,ERRPART - JP FAIL - -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) - LD XH,D - LD XL,E - LD (DISKL),IX - LD (DISKH),HL - LD A,(DRIVE) - LD DE,BOOT - LD BC,1*256 + BIOS.DRV_READ - RST ToBIOS_18 - ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого - POP AF - POP BC - LD L,A ; номер загрузочного раздела - LD A,C - ;LD A,C - ; - RET - -SET_PRM: PUSH BC - LD A,B - LD C,BIOS.DRV_GET_PAR - RST ToBIOS_18 - LD A,(BOOT.SectorsPerTrack) - LD L,A - POP AF - PUSH AF - LD C,BIOS.DRV_SET_PAR - RST ToBIOS_18 - POP BC - LD A,C - RET - -GET_BPB: LD IX,#0000 - LD HL,#0000 - LD DE,BOOT - LD BC,1*256 + BIOS.DRV_READ - LD A,(DRIVE) - RST ToBIOS_18 - RET C - LD A,(DRIVE) - LD B,A - AND #F0 - LD C,A - CP #80 - 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 -NX2: LD HL,(BOOT+510) - LD DE,#AA55 - AND A - SBC HL,DE - SCF - RET NZ - LD IY,BOOT ;Analysing Block Parametr BIOS - LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) - CP #F0 - RET C - LD HL,0 ;calc. first sector FAT - LD (DIR_FRH),HL - - LD E,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ;Reserve sec - LD D,(IY+_sBOOT_SECTOR_PARAMS.RESERVED_SECTORS+1) - ADD HL,DE - LD (FAT_FRM),HL ;first sector FAT - LD E,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16) ;sectors in FAT - LD D,(IY+_sBOOT_SECTOR_PARAMS.SectorsPerFAT16+1) - LD A,(BOOT.Number_of_FATs) ;amount FATs -C_DATA1: ADD HL,DE - DEC A - JR NZ,C_DATA1 - LD (DIR_FRM),HL ;first sector DIR - EX DE,HL - LD L,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR) ;Number file handel - LD H,(IY+_sBOOT_SECTOR_PARAMS.FilesInRootDIR+1) - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD A,H - SRL A - LD (DIR_S_S),A ;Sectors per dir - LD L,A - LD H,0 - ADD HL,DE - LD (DAT_FRM),HL ;First sector data - - LD C,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector) ;Size sector - LD B,(IY+_sBOOT_SECTOR_PARAMS.BytesPerSector+1) - LD HL,0 - LD A,(BOOT.SectorsPerCluster) -NEXTAD3: - ADD HL,BC ;calc. cluster size - DEC A - JR NZ,NEXTAD3 - LD (CLU_LEN),HL - - LD HL,BOOT.ID_FAT - LD DE,FATMSG - LD B,3 -R_BPBL1: - LD A,(DE) - CP (HL) - JP NZ,IBMDOS_ - INC HL - INC DE - DJNZ R_BPBL1 -FID: LD A,(HL) - INC HL - CP " " - JR Z,FID - CP "1" - SCF - RET NZ - LD A,(HL) - CP "6" ; FAT16 - LD HL,#FFFF - JR Z,BPB_FAT - CP "2" ; FAT12 - SCF - RET NZ - LD HL,#0FFF -BPB_FAT - LD (FAT_TYP),A - LD (ENDCLUS),HL - - LD IX,(DISKL) - LD HL,(DISKH) - LD DE,(FAT_FRM) - LD BC,#0000 - ADD IX,DE - ADC HL,BC -;HL:IX - LD DE,FAT - LD BC,3*256 + BIOS.DRV_READ - LD A,(DRIVE) - RST ToBIOS_18 - RET C - LD HL,0 - LD (FatCache),HL - XOR A - RET - -IBMDOS_ LD A,(IY+_sBOOT_SECTOR_PARAMS.DRIVE_TYPE) - CP #F0 - RET C - CP #F8 - LD A,"6" - LD HL,#FFFF - JR Z,BPB_FAT - LD A,"2" - LD HL,#0FFF - JR BPB_FAT - -; поиск system.dos -GETROOT: LD HL,(DIR_FRH) - LD IX,(DIR_FRL) - LD BC,(DISKL) - LD DE,(DISKH) - LD A,(DIR_S_S) -NEXTSEC: PUSH AF - ADD IX,BC - ADC HL,DE -;HL:IX - PUSH IX - PUSH HL - LD BC,1*256 + BIOS.DRV_READ - LD DE,DIR - LD A,(DRIVE) - RST ToBIOS_18 - CALL SEARCH - POP HL - POP IX - POP BC - RET C - RET NZ - LD A,B - LD DE,0 - LD BC,1 - DEC A - JR NZ,NEXTSEC - SCF - RET - -SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 - LD IX,DIR-#0020 -SKIPNAM: LD DE,#0020 - ADD IX,DE - DEC C - RET Z - LD A,(IX+00) - OR A - SCF - RET Z - CP #E5 - JR Z,SKIPNAM - LD A,(IX+11) - AND #10 - JR NZ,SKIPNAM - LD HL,MASKARE - LD D,XH - LD E,XL - LD B,11 -SEARCH2: LD A,(DE) - CP (HL) - JR NZ,SKIPNAM - INC HL - INC DE - DJNZ SEARCH2 - LD D,XH - LD E,XL - LD HL,HANDBUF - EX DE,HL - LD BC,#0020 - LDIR - XOR A - INC A - RET - -; HL - CLUSTER -; DE - ADDRESS -;!TODO сделать тут определение размера SYSTEM.DOS и возможность загрузить больше 1 страницы -FLOAD: LD (READMEM),DE -LD_FILE: PUSH HL - CALL NSECTOR - LD DE,(READMEM) - LD A,(BOOT.SectorsPerCluster) - CP #20 - JR C,SMALL_CLUSTER - LD BC,#20*256 + BIOS.DRV_READ_LONG - LD A,(BANKDOS) - EX AF,AF' - LD A,(DRIVE) - RST ToBIOS_18 - POP HL - AND A - RET -SMALL_CLUSTER: - LD B,A - LD C,BIOS.DRV_READ_LONG - LD A,(BANKDOS) - EX AF,AF' - LD A,(DRIVE) - RST ToBIOS_18 - LD HL,(READMEM) - LD DE,(CLU_LEN) - ADD HL,DE - LD (READMEM),HL - POP HL - RET C - CALL R_F_FAT - RET C - EX DE,HL - JP LD_FILE - -; HL - CLUSTER -; HL:IX - SECTOR - -; NSECTOR: -; DEC HL -; DEC HL -; EX DE,HL -; LD A,(BOOT.SectorsPerCluster) -; LD B,A -; LD HL,0 -; LD IX,0 -; ADD_DE1 ADD IX,DE -; JP NC,ADD_DE2 -; INC HL -; ADD_DE2 DJNZ ADD_DE1 -; LD DE,(DAT_FRM) -; ADD IX,DE -; LD DE,#0000 -; ADC HL,DE - -; LD DE,(DISKL) -; ADD IX,DE -; LD DE,(DISKH) -; ADC HL,DE -; RET - - -NSECTOR: - LD DE,0 - DEC HL - DEC HL - LD A,(BOOT.SectorsPerCluster) - XOR 1 - JR Z,.skip - ; - RRA -.loop: ADD HL,HL - RL E - RL D - ; - RRA - JP NC,.loop - ; -.skip: EX DE,HL - LD XL,E - LD XH,D - LD DE,(DAT_FRM) ;first data sector - XOR A - ADD IX,DE - LD D,A - LD E,A - ADC HL,DE - ; - LD DE,(DISKL) - ADD IX,DE - LD DE,(DISKH) - ADC HL,DE - RET -;----------------- -;!TODO сделать это макросами или инклюдами универсальными. повторяются в досе и ещё где-то -; HL - CLUSTER -; DE - (CLUSTER) -R_F_FAT: PUSH HL - LD A,(FAT_TYP) - CP "2" - JP Z,R_F_F12 -R_F_F16 LD DE,768 ; DE - CLUSTERS IN CASH - XOR A -R_F_00H INC A ; HL - CLUSTER - SBC HL,DE - JP NC,R_F_00H - ADD HL,DE - ADD HL,HL ; HL - FAT OFFSET (FROM CASH) - DEC A - LD BC,(FatCache) ; A - ELEMENT OF CASH - CP C - CALL NZ,RE_FAT - LD DE,FAT - ADD HL,DE - LD E,(HL) - INC HL - LD D,(HL) - LD HL,#FFEF - XOR A - SBC HL,DE - POP HL - RET - -R_F_F12 LD D,H - LD E,L - ADD HL,HL - ADD HL,DE - RR H - RR L - PUSH AF - EX DE,HL - LD HL,(BOOT.BytesPerSector) - LD B,H - LD C,L - ADD HL,HL - ADD HL,BC - EX DE,HL - XOR A ; DE - SIZE SECTOR * 3 -R_F_00 INC A ; HL - FAT OFFSET - SBC HL,DE - JP NC,R_F_00 - ADD HL,DE - DEC A - LD BC,(FatCache) - CP C - CALL NZ,RE_FAT - LD DE,FAT - ADD HL,DE - POP AF - LD E,(HL) - INC HL - LD D,(HL) - JP C,R_F_F01 - LD A,D - AND #0F - LD D,A - JP R_F_F02 - -R_F_F01 LD A,E - AND #F0 - RR D ; вправо на 4 битa - RRA - RR D - RRA - RR D - RRA - RR D - RRA - LD E,A -R_F_F02 LD HL,#0FEF - XOR A - SBC HL,DE - POP HL - RET - -RE_FAT PUSH HL - LD L,A - LD H,0 - LD (FatCache),HL - LD E,L - LD D,H - ADD HL,HL - ADD HL,DE - LD IX,0 - LD DE,(FAT_FRM) - ADD HL,DE - EX DE,HL - JR NC,NOINX - INC IX -NOINX LD HL,(DISKL) - ADD HL,DE - EX DE,HL - LD BC,(DISKH) - JR NC,NOINX2 - INC IX -NOINX2 ADD IX,BC - PUSH IX - PUSH DE - POP IX - POP HL - LD DE,FAT - LD BC,3*256 + BIOS.DRV_READ - LD A,(DRIVE) - RST ToBIOS_18 - POP HL - RET - -MASKARE DB "SYSTEM DOS" - -FATMSG DB "FAT" - +//////////////////////////////////////////////////////////////////////// ; Area for boot sector [512Bytes] -BOOT _sBOOT_SECTOR_PARAMS = $ +BOOT _sBOOT_SECTOR_PARAMS = $ ; BOOT EQU $ ; ID_NAME EQU BOOT+#03 ; +03 DOS NAME @@ -750,33 +795,34 @@ BOOT _sBOOT_SECTOR_PARAMS = $ ; ; end boot sector -DIR EQU BOOT+512 -FAT EQU DIR+512 +DIR EQU BOOT+512 +FAT EQU DIR+512 -VALUE EQU 3*512+FAT +VALUE EQU 3*512+FAT FatCache EQU VALUE+0 -FAT_FRM EQU VALUE+2 ; MSD_FAT_SEC first sector FAT -DIR_FRH EQU VALUE+4 ; MSD_CAT_SEC first sector DIR -DIR_FRL EQU VALUE+6 ; MSD_CAT_SEC first sector DIR -DIR_FRM EQU VALUE+6 -DIR_S_S EQU VALUE+8 ; DIR_SEC_SIZE -DAT_FRM EQU VALUE+9 ; MSD_DAT_SEC -FAT_TYP EQU VALUE+11; TYPE FAT (#32 - 12bit, #36 - 16bit) -CLU_LEN EQU VALUE+12; CLASTER_LEN -ENDCLUS EQU VALUE+14 +FAT_FRM EQU VALUE+2 ; MSD_FAT_SEC first sector FAT +DIR_FRH EQU VALUE+4 ; MSD_CAT_SEC first sector DIR +DIR_FRL EQU VALUE+6 ; MSD_CAT_SEC first sector DIR +DIR_FRM EQU VALUE+6 +DIR_S_S EQU VALUE+8 ; DIR_SEC_SIZE +DAT_FRM EQU VALUE+9 ; MSD_DAT_SEC +FAT_TYP EQU VALUE+11; TYPE FAT (#32 - 12bit, #36 - 16bit) +CLU_LEN EQU VALUE+12; CLASTER_LEN +ENDCLUS EQU VALUE+14 -HANDBUF EQU VALUE+16 -FTIME EQU VALUE+16+22 -FDATE EQU VALUE+16+24 -FCLUSTR EQU VALUE+16+26 -FSIZE0 EQU VALUE+16+28 -FSIZE1 EQU VALUE+16+30 +HANDBUF EQU VALUE+16 +FTIME EQU VALUE+16+22 +FDATE EQU VALUE+16+24 +FCLUSTR EQU VALUE+16+26 +FSIZE0 EQU VALUE+16+28 +FSIZE1 EQU VALUE+16+30 -DISKH EQU VALUE+48 -DISKL EQU VALUE+50 -READMEM EQU VALUE+52 -SHEL_FM EQU VALUE+54 -BANKDOS EQU VALUE+55 +DISKH EQU VALUE+48 +DISKL EQU VALUE+50 +READMEM EQU VALUE+52 +;SHEL_FM EQU VALUE+54 +BIG_SHELL EQU VALUE+54 +BANKDOS EQU VALUE+55 ; EQU VALUE+56 ;----------------- @@ -791,14 +837,5 @@ BANKDOS EQU VALUE+55 ;STACK EQU (($/256)+2)*256 ENT -;START DI -; LD (SPZ+1),SP -; LD SP,#BFFF -; LD C,#FE -; CALL #3D13 -;SPZ LD SP,#0000 -; EI -; RET - - OUTEND + OUTEND ;[]-----------------------------------------------------------[] diff --git a/BOOT/boot.asm b/BOOT/boot.asm index 9f79832..dce1683 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -24,6 +24,7 @@ include 'shared_includes/macroses/accelerator.z80' include 'shared_includes/macroses/macros.z80' include 'shared_includes/structures/FileSystem.inc' + include '../DSS/defines.inc' DEFINE EXEinfoMACRO 0 DEFINE App_EXE_Version 1 @@ -348,9 +349,11 @@ write_to_: ld a,(disk) ; ld b,a inc c scf - ret z ; !TODO загрузка с расширенного раздела не поддерживается + ret z ; !TODO загрузка с расширенного раздела не поддерживается dec c - push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR + CP #80 ;!HARDCODE тип драйва - HDD + JR NC,.skip_FAT_check + push bc ; B - PHISICAL DRIVE NUMBER, C - PARTITION RECORD NUMBER IN DRIVE MBR ; [x] 02/02/2024 проверка на влезаемость загрузчика (чтоб не попортить фат) LD HL,0 LD IX,0 @@ -364,6 +367,7 @@ write_to_: ld a,(disk) ; SBC HL,DE RET C ; +.skip_FAT_check:; push bc ld a,b ld hl,0 ; ст. разряд лог. сектора diff --git a/DSS/API.asm b/DSS/API.asm index 7c49cd2..e2a7cc0 100644 --- a/DSS/API.asm +++ b/DSS/API.asm @@ -79,7 +79,7 @@ ; POP BC ; JP C,NDISK11 ; LD A,B - ; LD (FatBuffer.DRIVE),A + ; LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; CALL RD_BPB ; RET C ; LD A,(LDRIVE) diff --git a/DSS/API/Delete.asm b/DSS/API/Delete.asm index 13aaefe..a0277a7 100644 --- a/DSS/API/Delete.asm +++ b/DSS/API/Delete.asm @@ -62,9 +62,9 @@ DEL_FN: ;!TEST PUSH DE LD DE,#0000 ; номер кластера CALL WRITE_TO_FAT.Custom ; записать в кеш FAT-а номер кластера - POP AF POP DE EXX + POP AF POP DE EXX JP NC,.loop diff --git a/DSS/API/MkDir.asm b/DSS/API/MkDir.asm index 6f55c51..c0ddc0d 100644 --- a/DSS/API/MkDir.asm +++ b/DSS/API/MkDir.asm @@ -132,14 +132,14 @@ MKDIR: CP "." JR Z,.copy_dir_record ; fat32 - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 JR NZ,.fat16_root_dir ; fat 32 EX DE,HL - LD HL,(FatBuffer.RootDirStartCluster_L) + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_L),HL - LD HL,(FatBuffer.RootDirStartCluster_H) + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) LD (HANDBUF + _sFAT_DIRECTORY_RECORD.FIRST_CLUSTER_H),HL EX DE,HL JR .set_rec @@ -169,7 +169,7 @@ MKDIR: EXX POP HL ; младший номер сектора CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ; секторов на кластер + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ; секторов на кластер .MKD12: PUSH AF PUSH HL ; ст. разряд PUSH IX ; номер лог. сектора @@ -178,7 +178,7 @@ MKDIR: IN A,(SLOT0) OUT (SLOT3),A ; - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD DE,CORE_BUFFERS.SECBUF+#C000 LD BC,1*256 + Dss.DRV.Write RST ToDSS.DRV diff --git a/DSS/API/Open.asm b/DSS/API/Open.asm index 40864dc..676313a 100644 --- a/DSS/API/Open.asm +++ b/DSS/API/Open.asm @@ -67,7 +67,7 @@ OPEN_FN: ;!TEST Current Dir ;[x] 15/10/23 LD (IY+_sFM.F_POSITION+1),A LD (IY+_sFM.F_POSITION+2),A LD (IY+_sFM.F_POSITION+3),A - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A ; fat32 LD HL,CORE_BUFFERS.FM_BUF+_sFM.FS_REC.FIRST_CLUSTER_H diff --git a/DSS/API/RmDir.asm b/DSS/API/RmDir.asm index 3bcacfa..0723673 100644 --- a/DSS/API/RmDir.asm +++ b/DSS/API/RmDir.asm @@ -51,7 +51,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 PUSH HL EXX CALL CLUSTER_TO_SECTOR - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) LD B,A LD C,Dss.DRV.Read ; начинаем вычитывать содержимое каталога посекторно @@ -67,7 +67,7 @@ RMDIR: ;!TEST Current Dir ;[x] 15/10/23 LD DE,CORE_BUFFERS.SECBUF+#C000 ;LD BC,1*256 + Dss.DRV.Read LD B,1 - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) RST ToDSS.DRV POP AF OUT (SLOT3),A diff --git a/DSS/API/Write.asm b/DSS/API/Write.asm index 9a886b3..aa5b773 100644 --- a/DSS/API/Write.asm +++ b/DSS/API/Write.asm @@ -18,7 +18,7 @@ WRITE.RD_ONLY: WRITE: ;!TEST ;!TODO 5/12/23 ; [ ] избыточные вызовы WRITE_FAT_TABLE CALL .Start PUSH AF - LD A,(FatBuffer.CacheUpdated) + LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) OR A CALL NZ,WRITE_FAT_TABLE ; подкл. банку кеша FAT и записать его на диск POP AF diff --git a/DSS/API/curDisk.asm b/DSS/API/curDisk.asm index 5c61c19..bd51cdb 100644 --- a/DSS/API/curDisk.asm +++ b/DSS/API/curDisk.asm @@ -16,7 +16,7 @@ CURDISK_FN: CURDISK: LD A,(LDRIVE) LD C,A - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) AND A RET ; \ No newline at end of file diff --git a/DSS/API/diskINF.asm b/DSS/API/diskINF.asm index 9914621..9852d60 100644 --- a/DSS/API/diskINF.asm +++ b/DSS/API/diskINF.asm @@ -59,7 +59,7 @@ DISKINF: LD C,B 1: LD C,5 ;!HARDCODE _sBOOT_SECTOR_PARAMS.ID_FAT.length CALL .mCOPY_LOOP ; 12, 16 or 32 - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.next_prm ; @@ -73,11 +73,11 @@ DISKINF: LD C,B .put_char: LD (DE),A POP DE ; -.next_prm: LD HL,FatBuffer.BPB_SERIAL_NUMBER +.next_prm: LD HL,CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER LD C,4 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER CALL .mCOPY_LOOP ; - LD HL,FatBuffer.BPB_LABEL + LD HL,CORE_BUFFERS.FatBuffer.BPB_LABEL LD C,11 ;!HARDCODE _sBOOT_SECTOR_PARAMS.BPB_LABEL CALL .mCOPY_LOOP ; fat32 @@ -121,7 +121,7 @@ DISKINF: LD C,B ;JR Z,CURRDS ;R06 .CurrentDisk: LD A,(CurrentPath) SUB 'A' - LD HL,FatBuffer.DRIVE + LD HL,CORE_BUFFERS.FatBuffer.DRIVE CP (HL) JR Z,.CheckFreeSpace ; @@ -138,15 +138,15 @@ DISKINF: LD C,B ;.FRESP2: LD D,B LD E,C - LD HL,(FatBuffer.MaxClusterLow) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) DEC HL ; fat 32 EXX - LD HL,(FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) DEC HL EXX - LD BC,(CORE_BUFFERS.BootSector.BytesPerSector) - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) AND A RET ; diff --git a/DSS/DOS_Proc.asm b/DSS/DOS_Proc.asm index a2bb9e3..08f26b5 100644 --- a/DSS/DOS_Proc.asm +++ b/DSS/DOS_Proc.asm @@ -181,7 +181,7 @@ TMPNAME: DZ ' ' ; 12 ; IN: A - drive number OPENDSK:;!TEST DRV.Open обход R10 LD C,A - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) CP C IF CHECK_DRIVE_CHANGE JR NZ,.open @@ -200,12 +200,12 @@ OPENDSK:;!TEST DRV.Open POP BC JP C,.error ;[x] 29/02/2024 fix "open drive error" - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD D,A PUSH DE ; LD A,B - LD (FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; CALL RD_BPB ;[x] 29/02/2024 fix "open drive error" @@ -217,6 +217,7 @@ OPENDSK:;!TEST DRV.Open .exit: LD A,(LDRIVE) AND A RET + ; .error: CP DSS_Error.sys.INVALID_DRIVE SCF RET Z @@ -356,7 +357,7 @@ MASK: LD HL,TMPNAME ;----------------------------------------------------------------------; ;!TEST Current Dir ;[x] 15/10/23 DIR_PATH_CHANGE: -.FullCurrent: LD A,(FatBuffer.DRIVE) +.FullCurrent: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' LD (CurrentPath),A ; @@ -365,7 +366,7 @@ DIR_PATH_CHANGE: ; .FullWork: LD A,(CurrentPath) SUB 'A' - LD (FatBuffer.DRIVE),A + LD (CORE_BUFFERS.FatBuffer.DRIVE),A ; .Work: LD HL,WorkDirectory JP CURRDIR_FN @@ -391,7 +392,7 @@ DIR_PATH_CHECK: LD A,(HL) JR Z,.checkDir ; LD HL,CurrentPath - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' CP (HL) JR NZ,.gotoPath @@ -413,7 +414,7 @@ DIR_PATH_CHECK: LD A,(HL) JR .gotoPath ; .checkDrive: LD HL,CurrentPath - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ADD 'A' CP (HL) RET diff --git a/DSS/DSS-MAIN.ASM b/DSS/DSS-MAIN.ASM index fa82eb8..3329914 100644 --- a/DSS/DSS-MAIN.ASM +++ b/DSS/DSS-MAIN.ASM @@ -241,11 +241,16 @@ PORTAL.out_MAIN: ; CLEAR_BUFFER_AND_INIT_PROC: ;------[CLEAR BUFFERS]------; ;R07 ;R11 + XOR A LD HL,CLEAR_ZONE.start LD DE,CLEAR_ZONE.start+1 LD BC,CLEAR_ZONE.size-1 - LD (HL),0 + LD (HL),A LDIR + ; A = 0 + DEC A + LD (CORE_BUFFERS.FatBuffer.DRIVE),A + ; ;R07 ;R11 ;R11 LD HL,CORE_BUFFERS.FM_BUF @@ -405,7 +410,8 @@ BUFFERSplace _sBuffers=$ FM_BUF _sFM = BUFFERSplace.FileManipulator .Size EQU _sFM .FullSize EQU FMCOUNT*FM_BUF.Size -BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector разной длины +;BootSector _sBOOT_SECTOR_PARAMS = BUFFERSplace.BootSector ; [ ] fat32 ;!FIXIT CORE_BUFFERS.BootSector разной длины +FatBuffer _sFatBuffer = BUFFERSplace.FatBuffer EXEBUFF _sEXE_HEADER = BUFFERSplace.EXE_Header XSTACK EQU BUFFERSplace.Stack.SPoint BUFFER EQU BUFFERSplace.Buffer @@ -415,11 +421,11 @@ CLEAR_ZONE.size EQU _sBuffers ASSERT (CORE_BUFFERS.BUFFERSplace+_sBuffers)<#4000, "Warning!!! OUT OF SLOT0" DISPLAY "--- --- --- --- --- --- --- ---" - DISPLAY "BUFFERSplace.BootSector ",/H,CORE_BUFFERS.BUFFERSplace.BootSector - DISPLAY "BootSector ", /H, CORE_BUFFERS.BootSector - DISPLAY "BootSector.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector + DISPLAY "BUFFERSplace ", /H, CORE_BUFFERS.BUFFERSplace + DISPLAY "FatBuffer ", /H, CORE_BUFFERS.FatBuffer + DISPLAY "FatBuffer.Size ", /D, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.FatBuffer DISPLAY "EXEBUFF ", /H, CORE_BUFFERS.EXEBUFF - DISPLAY "Size ", /H, CORE_BUFFERS.EXEBUFF - CORE_BUFFERS.BootSector + DISPLAY "Size ", /H, CORE_BUFFERS.XSTACK - CORE_BUFFERS.EXEBUFF DISPLAY "--- --- --- --- --- --- --- ---" @@ -597,7 +603,9 @@ DRV_CONTENT: DRV_CONTENT.SIZE EQU $-DRV_CONTENT DISPLAY "END ADDRESS: ",/H,$ - ASSERT $<#4001,'-> Memory leack!!!'; + DISPLAY "Memory leacks when > ",/H, #4000+SUBLOAD_SIZE*512 + ASSERT $ < (#4001+SUBLOAD_SIZE*512),'-> Memory leack!!!'; + ASSERT DRV_CONTENT.SIZE < #4001,'-> Drivers code size > #4000!!!'; ;[END] ; diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 95976eb..55c64cd 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -345,9 +345,9 @@ OPENDIR: LD IY,CORE_BUFFERS.FM_BUF JR NZ,.SUBDIR .REROOT: ; fat32 EX DE,HL - LD HL,(FatBuffer.RootDirStartCluster_L) + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_L) LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_L),HL - LD HL,(FatBuffer.RootDirStartCluster_H) + LD HL,(CORE_BUFFERS.FatBuffer.RootDirStartCluster_H) LD (CORE_BUFFERS.FM_BUF + _sFM.FS_REC.FIRST_CLUSTER_H),HL EX DE,HL CALL LOADDIR @@ -423,11 +423,11 @@ LOADDIR: ;!TODO optimize ; ; LD (HL),L ; ; LDIR ; ; - ; LD A,(FatBuffer.DRIVE) ; номер диска + ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска ; LD (IY+_sFM.DRIVE),A ; сохр. в дескриптор ; ; номер первого кластера ; ; [x] fat32 - ; LD A,(FatBuffer.FAT_TYPE) + ; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) ; XOR 32 ; JR Z,.read_dir ; ;!FIXIT переделать на работу без IY @@ -446,14 +446,14 @@ LOADDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.LoadRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) ; ст. разряд - LD IX,(FatBuffer.RootDirFirstSector_L) ; номер лог. сектора - LD A,(FatBuffer.DirSizeInSectors) +.LoadRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) ; ст. разряд + LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) ; номер лог. сектора + LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD B,32 ; !HARDCODE sector size 512. 16384/(sector 512). размер root-каталога CP B JR NC,.RTD1 LD B,A ; число секторов -.RTD1: LD A,(FatBuffer.DRIVE) ; номер диска +.RTD1: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска LD DE,DIRPAGE.buffer ; буфер LD C,Dss.DRV.Read ; чтение секторов RST ToDSS.DRV @@ -475,10 +475,10 @@ LOAD_SAVE_DIR_PREPARE: AND A EX AF,AF' ; - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD (IY+_sFM.DRIVE),A ; [x] fat32 - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 - 1 JR NC,.exit ;!FIXIT переделать на работу без IY @@ -504,10 +504,10 @@ SAVEDIR: ;!TODO optimize ; AND A ; PUSH AF ; ; - ; LD A,(FatBuffer.DRIVE) + ; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; LD (IY+_sFM.DRIVE),A ; ; [x] fat32 - ; LD A,(FatBuffer.FAT_TYPE) + ; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) ; XOR 32 ; JR Z,.save_dir ; ;!FIXIT переделать на работу без IY @@ -528,15 +528,15 @@ SAVEDIR: ;!TODO optimize OUT (SLOT3),A RET ; -.SaveRootDir: LD HL,(FatBuffer.RootDirFirstSector_H) - LD IX,(FatBuffer.RootDirFirstSector_L) - LD A,(FatBuffer.DirSizeInSectors) +.SaveRootDir: LD HL,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_H) + LD IX,(CORE_BUFFERS.FatBuffer.RootDirFirstSector_L) + LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) LD B,32 ;!HARDCODE sector size 512, Root Dir max size in sectors SUB B JR NC,.RTD1S ADD A,B LD B,A -.RTD1S: LD A,(FatBuffer.DRIVE) +.RTD1S: LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD DE,DIRPAGE.buffer LD C,Dss.DRV.Write RST ToDSS.DRV @@ -593,7 +593,7 @@ WRT_HND: SET_PAGE_X DIRPAGE SBC HL,DE JR NC,SAVEDIR LD HL,(SAVEDIR.DIRSIZE) - LD BC,(FatBuffer.BytesPerCluster) + LD BC,(CORE_BUFFERS.FatBuffer.BytesPerCluster) ADD HL,BC LD (SAVEDIR.DIRSIZE),HL AND A @@ -604,7 +604,7 @@ WRT_HND: SET_PAGE_X DIRPAGE ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; не используется ; TESTDSK: ;????? возможно, что тут логичнее, чем в начале OPENDSK, если будет работать Dss.DRV.Open -; LD A,(FatBuffer.DRIVE) +; LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; LD C,Dss.DRV.MediaCheck ; RST ToDSS.DRV ; OR A @@ -618,7 +618,7 @@ RD_BPB: LD C,SLOT3 PUSH BC IN A,(SLOT0) OUT (SLOT3),A - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD DE,CORE_BUFFERS.SECBUF+#C000 ;R08 LD C,Dss.DRV.GetBPB RST ToDSS.DRV @@ -642,6 +642,17 @@ RD_BPB: LD C,SLOT3 LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.DRIVE_TYPE) CP #F0 JP C,DOS_X_Error.UnknownBPB + ; + ;!TODO проверить по метке раздела, что это FAT, потом определять какой FAT + ; + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) + LD (CORE_BUFFERS.FatBuffer.BytesPerSector),HL + LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) + LD (CORE_BUFFERS.FatBuffer.SectorsPerCluster),A + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER) + LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER),HL + LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_SERIAL_NUMBER+2) + LD (CORE_BUFFERS.FatBuffer.BPB_SERIAL_NUMBER+2),HL ; calc. first sector FAT LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) ; @@ -649,20 +660,20 @@ RD_BPB: LD C,SLOT3 ; LD D,(IY+_sBOOT_SECTOR_PARAMS.HIDDEN+1) ; ADD HL,DE ; - ;!FIXIT для fat32 втыкать сюда сектора активной таблицы - LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 - LD (FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 + ;!FIXIT для fat32 втыкать сюда сектора активной таблицы + LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL ; low word first sector FAT #2 ;[ ] fat32 XOR A LD B,A LD C,A - LD (FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 - LD (FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 - LD (FatBuffer.RootDirStartCluster_L),BC ; [ ] fat32 - LD (FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32 - LD (FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables - LD (FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables - LD (FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 + LD (CORE_BUFFERS.FatBuffer.FAT1_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC ; high word first sector FAT #1 ; [ ] fat32 + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_L),BC ; [ ] fat32 + LD (CORE_BUFFERS.FatBuffer.RootDirStartCluster_H),BC ; [ ] fat32 + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),BC ; [ ] fat32 reset variables + LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),BC ; [ ] fat32 reset variables + LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A ; [ ] fat32 ; ; LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerFAT16) @@ -670,20 +681,21 @@ RD_BPB: LD C,SLOT3 OR D JR NZ,.skip_high ; - LD BC,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32+4) - LD (FatBuffer.SectorsPerFAT_H),BC - LD DE,(CORE_BUFFERS.BootSector + _sBOOT_SECTOR_PARAMS_FAT32.FAT32.SectorsPerFAT32) -.skip_high: LD (FatBuffer.SectorsPerFAT_L),DE + LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS_FAT32.SectorsPerFAT32+4) + LD A,C + LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_H),A + LD DE,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS_FAT32.SectorsPerFAT32) +.skip_high: LD (CORE_BUFFERS.FatBuffer.SectorsPerFAT_L),DE ; LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) ; amount FATs CP 1 JR Z,.one_FAT DEC A ADD HL,DE - LD (FatBuffer.FAT2_SEC_L),HL + LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL JR NC,.no_inc_BC INC BC -.no_inc_BC: LD (FatBuffer.FAT2_SEC_H),BC +.no_inc_BC: LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_H),BC .one_FAT: ;C_DATA1 .loop1: ADD HL,DE JR NC,.loop1_1 @@ -691,9 +703,9 @@ RD_BPB: LD C,SLOT3 .loop1_1: DEC A JR NZ,.loop1 ; - LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR + LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR - LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) + LD BC,(CORE_BUFFERS.FatBuffer.BytesPerSector) LD A,B AND A ; @@ -708,7 +720,7 @@ RD_BPB: LD C,SLOT3 LD B,0 ; BC - File handels in sectors ;;;; IF COMPILE_UNUSED_CODE - LD (FatBuffer.FilesPerSector),A + LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A ENDIF ; EX DE,HL @@ -724,14 +736,14 @@ RD_BPB: LD C,SLOT3 EX DE,HL LD C,A ; A - sectors in DIR LD B,0 - LD (FatBuffer.DirSizeInSectors),A + LD (CORE_BUFFERS.FatBuffer.DirSizeInSectors),A ADD HL,BC ; Start DATA area - LD (FatBuffer.FirstDataSector_L),HL + LD (CORE_BUFFERS.FatBuffer.FirstDataSector_L),HL ; B = 0 ; - LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BytesPerSector) - LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) + LD HL,(CORE_BUFFERS.FatBuffer.BytesPerSector) + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;!TODO FATcacheSize ; calc. cluster size XOR 1 @@ -741,7 +753,7 @@ RD_BPB: LD C,SLOT3 RRA JP NC,.loop3 .loop3.end: ; - LD (FatBuffer.BytesPerCluster),HL + LD (CORE_BUFFERS.FatBuffer.BytesPerCluster),HL ; IF COMPILE_UNUSED_CODE EX DE,HL @@ -752,69 +764,71 @@ RD_BPB: LD C,SLOT3 JP Z,DOS_X_Error.UnknownBPB SBC HL,DE JR NC,.loop4 - LD (FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) + LD (CORE_BUFFERS.FatBuffer.ClustersPerBank),A ; A - Clusters per bank (16k) ENDIF - ; - ;!TODO detect fat type by clusters! - ; [ ] fat32 - LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.FAT16.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага - LD DE,FAT_STRING - LD B,3 - ;R_BPBL1 -.loop5: LD A,(DE) - CP (HL) - JP NZ,.IBM_DOS - INC HL - INC DE - DJNZ .loop5 + + //////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////// +; LD HL,CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.ID_FAT ;!!!!! а если IY используется для переменного BootSector, то будет бага +; LD DE,FAT_STRING +; LD B,3 +; ;R_BPBL1 +; .loop5: LD A,(DE) +; CP (HL) +; JP NZ,.IBM_DOS +; INC HL +; INC DE +; DJNZ .loop5 ;FID -.loop6: LD A,(HL) - INC HL - CP ' ' - JR Z,.loop6 - ; - CP '1' - ;[ ] fat32 - JP Z,.fat1x - CP '3' - JP NZ,DOS_X_Error.UnknownBPB - LD A,#52 ; #52-#20 = #32 fat type - LD HL,#0FFF - LD (FatBuffer.END_CHAIN_CLUSTER_H),HL - LD (FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT - LD H,L - JR .BPB_FAT - ; -.fat1x: LD A,(HL) - CP '2' ; FAT16 - LD HL,#0FFF - JR Z,.BPB_FAT - CP '6' ; FAT12 - JP NZ,DOS_X_Error.UnknownBPB - LD H,L -.BPB_FAT: SUB #20 ; A-#20 = fat type (#12, #16, #32) - LD (FatBuffer.FAT_TYPE),A - LD (FatBuffer.END_CHAIN_CLUSTER_L),HL +; .loop6: LD A,(HL) +; INC HL +; CP ' ' +; JR Z,.loop6 +; ; +; CP '1' +; JP Z,.fat1x +; CP '3' +; JP NZ,DOS_X_Error.UnknownBPB +; LD A,#52 ; #52-#20 = #32 fat type +; LD HL,#0FFF +; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL +; LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT +; LD H,L +; JR .BPB_FAT +; ; +; .fat1x: LD A,(HL) +; CP '2' ; FAT16 +; LD HL,#0FFF +; JR Z,.BPB_FAT +; CP '6' ; FAT12 +; JP NZ,DOS_X_Error.UnknownBPB +; LD H,L +; .BPB_FAT: SUB #20 ; A-#20 = fat type (#12, #16, #32) +; LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A +; LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL ;!TODO не используется значение вычисляемое и сохраняемое в FatBuffer //////////////////////////////////////////////////////////////////////// ; LD HL,0 -; LD BC,(CORE_BUFFERS.BootSector.SectorsPerTrack) ; Sector per track -; LD A,(CORE_BUFFERS.BootSector.HEADS) +; LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerTrack) ; Sector per track +; LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.HEADS) ; .BPB_L1: ; calc. sector per cylinder ; ADD HL,BC ; DEC A ; JR NZ,.BPB_L1 -; LD (FatBuffer.S_X_H),HL +; LD (CORE_BUFFERS.FatBuffer.S_X_H),HL //////////////////////////////////////////////////////////////////////// ; [ ] fat32 LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerDrive) - LD DE,(FatBuffer.FirstDataSector_L) + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) LD A,H OR L JP NZ,.HDDSMAL ; LD HL,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_L) LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.BPB_BIG_TOTAL_SECTORS_H) + PUSH BC ; Total Sectors high + PUSH HL ; Total Sectors low AND A SBC HL,DE JP NC,.HDDBIG @@ -822,25 +836,104 @@ RD_BPB: LD C,SLOT3 JP .HDDBIG ; .HDDSMAL: ; CF = 0 - SBC HL,DE LD BC,0 -.HDDBIG: LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.SectorsPerCluster) + PUSH BC ; Total Sectors high + PUSH HL ; Total Sectors low + SBC HL,DE + ; +.HDDBIG: LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) SCF -.S4C01: RRA - JR C,.S4C02 +.loop7: RRA + JR C,.loop7_exit RR B RR C RR H RR L - JP .S4C01 -.S4C02: INC HL - LD (FatBuffer.MaxClusterLow),HL + JP .loop7 + ; +.loop7_exit: INC HL + LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL ; XOR A LD H,A LD L,A - LD (FatBuffer.CacheBlock),HL - LD (FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL + LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A + ; A = 0 + LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) + LD H,A + EX DE,HL + LD HL,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) + ; DE:HL = SectorsPerFAT + ; + LD A,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.Number_of_FATs) + LD B,A + DEC A + JR Z,.loop_mul_end + ; .Number_of_FATs * .SectorsPerFAT +.loop_mul: ADD HL,HL + EX DE,HL + ADC HL,HL + EX DE,HL + DJNZ .loop_mul +.loop_mul_end: ; .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT + LD B,0 + LD A,(CORE_BUFFERS.FatBuffer.DirSizeInSectors) + LD C,A + ADD HL,BC + JR NC,.no_inc_DE + INC DE +.no_inc_DE: ; .RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT + LD BC,(CORE_BUFFERS.SECBUF + _sBOOT_SECTOR_PARAMS.RESERVED_SECTORS) + ADD HL,BC + JR NC,.no_inc_de + INC DE +.no_inc_de: ; Total_Sectors - (.RESERVED_SECTORS + .DirSizeInSectors + .Number_of_FATs * .SectorsPerFAT) + AND A + LD B,D + LD C,E + POP DE ; Total Sectors low + EX DE,HL + SBC HL,DE + EX (SP),HL ; Total Sectors high + SBC HL,BC + POP DE ; Total Sectors low + ; HL:DE = DataSec + ; + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) + ; HL:DE / A => DE:BC, H=0, L - остаток + CALL DIV_for_SPC + ; выясняем разрядность FAT + LD A,D + OR E + JR NZ,.its_FAT32 + ; + LD HL,4084 + SBC HL,BC + JR NC,.its_FAT12 + ; + LD HL,65525 + SBC HL,BC + JR C,.its_FAT32 + ; + ; It's FAT16 + LD A,FAT_TYPE.x16 + LD HL,#FFFF + JR .BPB_FAT + ; +.its_FAT12: LD HL,#0FFF + LD A,FAT_TYPE.x12 + JR .BPB_FAT + ; +.its_FAT32: LD A,FAT_TYPE.x32 + LD HL,#0FFF + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H),HL + LD (CORE_BUFFERS.FatBuffer.MaxClusterHigh),HL ; [ ] fat32 ;!FIXIT + LD H,L + ; +.BPB_FAT: LD (CORE_BUFFERS.FatBuffer.FAT_TYPE),A + LD (CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L),HL + ; SET_PAGE_X FATPAGE @@ -848,8 +941,9 @@ RD_BPB: LD C,SLOT3 ; [ ] fat32 ; XOR A ; HL = 0 - EX DE,HL + ; EX DE,HL ; + LD DE,0 CALL READ_FAT_TABLE POP AF OUT (SLOT3),A @@ -881,6 +975,7 @@ DOS_X_Error: ; ; ;!TODO к буферам! +/* FatBuffer: ;.MSG: DB 'FAT' .DRIVE: DB #FF @@ -918,4 +1013,5 @@ FatBuffer: ;.READ_PG: DB #00 ;!TODO не используются некоторые значения, но задумка неплохая))) ;.S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? ; +*/ //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/DSS/FS/FAT/FAT_X.asm b/DSS/FS/FAT/FAT_X.asm index 91db79b..9430351 100644 --- a/DSS/FS/FAT/FAT_X.asm +++ b/DSS/FS/FAT/FAT_X.asm @@ -113,23 +113,23 @@ INC_FAT: ; вход: hl = младшее слово номера кластера для сравнения с FAT_Max_Cluster ; hl' = старшее слово номера кластера для сравнения с FAT_Max_Cluster (только для fat32) CHECK_CLUSTER_IS_SMALLER: - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) XOR FAT_TYPE.x32 JR NZ,.low ; Z=0 проверяем младшее слово номера кластера ; проверяем старшее слово номера кластера EXX EX DE,HL - LD HL,(FatBuffer.MaxClusterHigh) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterHigh) ; CF = 0 SBC HL,DE EX DE,HL EXX LD A,DSS_Error.sys.DISK_FULL ;RET C - RET NZ ; если FatBuffer.MaxClusterHigh - hl' != 0, то кластер корректный + RET NZ ; если CORE_BUFFERS.FatBuffer.MaxClusterHigh - hl' != 0, то кластер корректный ; проверяем младше слово номера кластера .low: EX DE,HL - LD HL,(FatBuffer.MaxClusterLow) + LD HL,(CORE_BUFFERS.FatBuffer.MaxClusterLow) ; CF = 0 SBC HL,DE EX DE,HL @@ -157,7 +157,7 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; PUSH HL PUSH AF - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 @@ -255,9 +255,9 @@ READ_FROM_FAT: CALL CHECK_CLUSTER_IS_SMALLER ; .Custom: ; HL':HL и DE':DE такие же как и на входе ;------------------------------------------------------------------------------------------------ -WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; номер кластера +WRITE_TO_FAT: LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_L) ; номер кластера EXX - LD DE,(FatBuffer.END_CHAIN_CLUSTER_H) ; номер кластера + LD DE,(CORE_BUFFERS.FatBuffer.END_CHAIN_CLUSTER_H) ; номер кластера EXX .Custom: PUSH DE EXX @@ -278,9 +278,9 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; PUSH DE ; младший номер кластера который вписать ; [x] 2/12/23 FAT не всегда мог записаться на HDD ;LD A,1 - ;LD (FatBuffer.CacheUpdated),A + ;LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A ; - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x16 JR C,.FAT12 JR NZ,.FAT32 @@ -296,7 +296,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; ; [x] 2/12/23 FAT не всегда мог записаться на HDD XOR A INC A - LD (FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A ; CF = 0 RET ; @@ -360,7 +360,7 @@ WRITE_TO_FAT: LD DE,(FatBuffer.END_CHAIN_CLUSTER_L) ; ; out: C:HL - logical number ; B = 0 GET_SECTOR_OF_FAT: - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) LD B,FAT_CACHE.Degree_32 ;!FIXIT сделать через переменную XOR FAT_TYPE.x32 JR Z,.next @@ -383,7 +383,7 @@ GET_SECTOR_OF_FAT: ; ADC A,C ; EDUP ; LD C,A -; LD A,(FatBuffer.FAT_TYPE) +; LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) ; CP FAT_TYPE.x32 ; RET NZ ; ADD HL,HL ;x2 @@ -400,34 +400,34 @@ GET_SECTOR_OF_FAT: ; DE - NEW FAT BLOCK READ_FAT_TABLE: PUSH HL PUSH DE - LD A,(FatBuffer.CacheUpdated) + LD A,(CORE_BUFFERS.FatBuffer.CacheUpdated) OR A CALL NZ,WRITE_FAT_TABLE.Start POP DE ; EX DE,HL - LD (FatBuffer.CacheBlock),HL + LD (CORE_BUFFERS.FatBuffer.CacheBlock),HL ; CALL GET_SECTOR_OF_FAT ; ; BC:HL - номер лог.сектора - LD DE,(FatBuffer.FAT1_SEC_L) + LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) ADD HL,DE EX DE,HL LD XH,D LD XL,E - LD HL,(FatBuffer.FAT1_SEC_H) + LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) ; JR NC,.no_inc ; INC HL .no_inc: ADC HL,BC ; HL:IX - SECTOR FAT FOR READING - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) XOR FAT_TYPE.x32 LD BC,FAT_CACHE.Sectors_16 * 256 + Dss.DRV.Read ; рег B * FAT_CACHE.Sector_Size = CASH SIZE JR NZ,.next LD B,FAT_CACHE.Sectors_32 ; рег B * FAT_CACHE.Sector_Size = CASH SIZE .next: LD DE,FATPAGE.cache ; куда ; DE - FAT ADDRESS - LD A,(FatBuffer.DRIVE) ; номер диска + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска RST ToDSS.DRV POP HL RET @@ -443,7 +443,7 @@ WRITE_FAT_TABLE: OUT (SLOT3),A RET ; Запись кеша FAT-а на диск -.Start: LD HL,(FatBuffer.CacheBlock) +.Start: LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ;FAT_BLOCK * Sectors_in_Block = SECTOR_OF_FAT CALL GET_SECTOR_OF_FAT ; B=0, C:HL - смещение в секторах внутри таблицы FAT на начало блока @@ -453,7 +453,7 @@ WRITE_FAT_TABLE: ;LD C,L ; LD DE,FAT_CACHE.Sectors_32 - LD A,(FatBuffer.FAT_TYPE) + LD A,(CORE_BUFFERS.FatBuffer.FAT_TYPE) CP FAT_TYPE.x32 JR Z,.next LD DE,FAT_CACHE.Sectors_16 ; !FIXIT брать это значение из переменной везде @@ -466,10 +466,10 @@ WRITE_FAT_TABLE: ; .no_inc: ; конец блока выходит за пределы таблицы? LD B,E ; MAX число секторов для чтения в кэш - LD A,(FatBuffer.SectorsPerFAT_H) + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_H) LD (.sub_A),A ;LD DE,(CORE_BUFFERS.BootSector.SectorsPerFAT16) ; секторов на FAT - LD DE,(FatBuffer.SectorsPerFAT_L) + LD DE,(CORE_BUFFERS.FatBuffer.SectorsPerFAT_L) AND A LD A,C SBC HL,DE @@ -493,8 +493,8 @@ WRITE_FAT_TABLE: ;PUSH HL ; ; B = число секторов - LD IX,(FatBuffer.FAT1_SEC_H) - LD DE,(FatBuffer.FAT1_SEC_L) + LD IX,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) ;LD B,A ;LD C,Dss.DRV.Write ; запись секторов PUSH BC @@ -505,26 +505,26 @@ WRITE_FAT_TABLE: CALL .SAVE_FAT_XX ; [x] если всего одна таблица FAT, то повторной записи не происходит 13/03/2024 POP BC ; B = число секторов, C = старший байт смещения в секторах - LD HL,(FatBuffer.FAT1_SEC_H) - LD DE,(FatBuffer.FAT2_SEC_H) + LD HL,(CORE_BUFFERS.FatBuffer.FAT1_SEC_H) + LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) AND A SBC HL,DE JR NZ,.not_one_FAT - LD HL,(FatBuffer.FAT2_SEC_L) - LD DE,(FatBuffer.FAT1_SEC_L) + LD HL,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) + LD DE,(CORE_BUFFERS.FatBuffer.FAT1_SEC_L) ; CF = 0 SBC HL,DE JR Z,.only_one_FAT ; ; сохраняем вторую копию FAT -.not_one_FAT: LD IX,(FatBuffer.FAT2_SEC_H) - LD DE,(FatBuffer.FAT2_SEC_L) +.not_one_FAT: LD IX,(CORE_BUFFERS.FatBuffer.FAT2_SEC_H) + LD DE,(CORE_BUFFERS.FatBuffer.FAT2_SEC_L) LD HL,(.save_hl) CALL .SAVE_FAT_XX AND A ;!TODO нет контроля ошибок .only_one_FAT: ; .ERR: LD A,0 - LD (FatBuffer.CacheUpdated),A + LD (CORE_BUFFERS.FatBuffer.CacheUpdated),A RET ; Вход: IX:DE - начало таблицы FAT в секторах ; C:HL - смещение в таблице в секторах @@ -546,7 +546,7 @@ WRITE_FAT_TABLE: LD XL,E ; HL:IX - смещение внутри раздела на начало нужного блока FAT LD DE,FATPAGE.cache ; откуда - LD A,(FatBuffer.DRIVE) ; номер диска + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) ; номер диска LD C,Dss.DRV.Write JP ToDSS.DRV @@ -585,7 +585,7 @@ GET_FAT32_CELL: ; EXX EX DE,HL - LD HL,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + LD HL,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH SBC HL,DE CALL NZ,READ_FAT_TABLE ; A != C - READ NEW BLOCK FAT POP HL @@ -611,9 +611,9 @@ GET_FAT16_CELL: ; ADD HL,HL ; HL - FAT OFFSET (FROM CASH) ; [x] fat32 поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + ; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -654,9 +654,9 @@ GET_FAT12_CELL: ;AND FAT_CACHE.Part_Mask_16 ; ; [ ] поменялся вход в процедуру READ_FAT_TABLE. Раньше номер блока в рег. A передавался - ; LD BC,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + ; LD BC,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH ; CP C - LD DE,(FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH + LD DE,(CORE_BUFFERS.FatBuffer.CacheBlock) ; BC - BLOCK FAT IN CASH CP E LD E,A ; @@ -683,7 +683,7 @@ CLUSTER_TO_SECTOR: ; DE:HL - cluster DEC HL DEC HL - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) XOR 1 JR Z,.skip ; @@ -698,13 +698,13 @@ CLUSTER_TO_SECTOR: .skip: EX DE,HL LD XL,E LD XH,D - LD DE,(FatBuffer.FirstDataSector_L) + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_L) ; [x] fat32 ;XOR A ; ADD IX,DE ; [x] fat32 - LD DE,(FatBuffer.FirstDataSector_H) + LD DE,(CORE_BUFFERS.FatBuffer.FirstDataSector_H) ;LD D,A ;LD E,A ; @@ -720,7 +720,7 @@ CLUSTER_TO_SECTOR: ; IX - buffer in RAM ; B - количество секторов для чтения BLOCK_READ: LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток @@ -809,7 +809,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX JR NC,.skip2 INC HL .skip2: LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV @@ -817,7 +817,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX JR C,.Error POP BC ; B = количество секторов на дочитку, C = (SectorsPerCluster - остаток) либо количество секторов для чтения LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) ;!TEST LD A,B LD B,C @@ -833,7 +833,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX RET Z ; количество секторов на дочитку = 0? LD B,A ; -.loop4: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster +.loop4: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -861,7 +861,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX PUSH BC CALL CLUSTER_TO_SECTOR LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Read RST ToDSS.DRV @@ -869,7 +869,7 @@ BLOCK_READ: LD (READ.PointerOnBuffer),IX ; POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -915,7 +915,7 @@ CHECK_FIRST_CLUSTER: ; IY - FM ; B - количество секторов для записи BLOK_WRITE: LD (READ.PointerOnBuffer),IX - LD A,(CORE_BUFFERS.BootSector.SectorsPerCluster) ;SECTORS PER CLUSTER + LD A,(CORE_BUFFERS.FatBuffer.SectorsPerCluster) ;SECTORS PER CLUSTER LD C,A PUSH BC ; B - количество секторов для чтения, C - SectorsPerCluster ; HL:DE / A => DE:BC, H=0, L - остаток @@ -1031,7 +1031,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX INC HL ; DOUBLE 1 .skip2: LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV @@ -1040,7 +1040,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) ; LD A,B LD B,C @@ -1057,7 +1057,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX RET Z ; количество секторов на дочитку = 0? LD B,A ; -.big_loop: LD HL,CORE_BUFFERS.BootSector.SectorsPerCluster +.big_loop: LD HL,CORE_BUFFERS.FatBuffer.SectorsPerCluster LD A,B SUB (HL) LD B,A @@ -1090,7 +1090,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX CALL CLUSTER_TO_SECTOR ; DOUBLE 1 LD DE,(READ.PointerOnBuffer) - LD A,(FatBuffer.DRIVE) + LD A,(CORE_BUFFERS.FatBuffer.DRIVE) LD B,C LD C,Dss.DRV.Write RST ToDSS.DRV @@ -1098,7 +1098,7 @@ BLOK_WRITE: LD (READ.PointerOnBuffer),IX JR C,.Error_3 POP BC LD HL,(READ.PointerOnBuffer) - LD DE,(CORE_BUFFERS.BootSector.BytesPerSector) + LD DE,(CORE_BUFFERS.FatBuffer.BytesPerSector) .loop3: ADD HL,DE DEC C JR NZ,.loop3 @@ -1268,12 +1268,12 @@ GET_OFFSET_IN_SECTORS: ;!TODO fat32 ;======================================================================= ;BPB - ;LD (FatBuffer.FAT2_SEC_L),HL - ;LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR + ;LD (CORE_BUFFERS.FatBuffer.FAT2_SEC_L),HL + ;LD (CORE_BUFFERS.FatBuffer.RootDirFirstSector_L),HL ; first sector DIR ;BPB32 ;LD HL,(CORE_BUFFERS.BootSector+#2C) ;fat32 Первый кластер корневого каталога (обычно 2) 4 байта ;FAT Max Cluster - ;LD (FatBuffer.MaxClusterLow),HL + ;LD (CORE_BUFFERS.FatBuffer.MaxClusterLow),HL ;======================================================================= ;//MODULE: FAT_X diff --git a/DSS/Media_drivers/ram_disk-drv.asm b/DSS/Media_drivers/ram_disk-drv.asm index 9fe4bcb..3c90bec 100644 --- a/DSS/Media_drivers/ram_disk-drv.asm +++ b/DSS/Media_drivers/ram_disk-drv.asm @@ -538,5 +538,12 @@ GET_RAMDRV_NUM: LD A,(BC) OR #60 ;!HARDCODE сделать номера разных устройств через метки RET -ENDDRVR EQU $ +; + +; +;TEST_DB_DEL_ME: DB 'Make here more than one page to load test' +; + +; +;ENDDRVR EQU $ ; \ No newline at end of file diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 2f72d1f..ff95c4c 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -73,14 +73,55 @@ ; LEN2 EQU 29 ; AMODE EQU 41 ; LEN3 EQU 30 ; FTASK EQU 42 +; + STRUCT _sFatBuffer +;.MSG: BYTE 'FAT' +.DRIVE: BYTE #FF +.FAT_TYPE: BYTE #00 ; TYPE FAT (12 - 12bit, 16 - 16bit, 32 - 32bit) ; [x] fat32 +.CacheBlock: WORD #0000 +.CacheUpdated: BYTE #00 +;.SectorsPerBank: BYTE #00 +.RootDirStartCluster_L: WORD #0000 +.RootDirStartCluster_H: WORD #0000 ; [ ] fat32 +.FAT1_SEC_L: WORD #0000 ; MSD_FAT_SEC first sector FAT (FAT_FRM) +.FAT1_SEC_H: WORD #0000 ; [ ] fat32 +.FAT2_SEC_L: WORD #0000 +.FAT2_SEC_H: WORD #0000 ; [ ] fat32 +.SectorsPerFAT_L WORD #0000 +.SectorsPerFAT_H BYTE #00 +.RootDirFirstSector_L: WORD #0000 ; MSD_CAT_SEC first sector DIR +.RootDirFirstSector_H: WORD #0000 ; MSD_CAT_SEC first sector DIR ; !TODO ограничение в 32 Гига ;!FIXIT не используется +.DirSizeInSectors: BYTE #00 ; DIR_SEC_SIZE +.FirstDataSector_L: WORD #0000 ; MSD_DAT_SEC low +.FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high ; [ ] fat32 было ограничение в 32 Гига +.BytesPerCluster: WORD #0000 ; CLUSTER_LEN +.END_CHAIN_CLUSTER_L: WORD #FFFF +.END_CHAIN_CLUSTER_H: WORD #0FFF ; [ ] fat3 +.MaxClusterLow: WORD #0000 ; макс. число кластеров (без служ.) +.MaxClusterHigh: WORD #0000 ; макс. число кластеров (без служ.) +; +.BytesPerSector WORD #0000 +.SectorsPerCluster BYTE #00 +.BPB_SERIAL_NUMBER DWORD #00000000 +.BPB_LABEL BLOCK 11,' ' ; 11 для FAT, 31 для CDFS +; IF COMPILE_UNUSED_CODE +; .FilesPerSector: BYTE #00 ; число файловых записей в секторе +; .ClustersPerBank: BYTE #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) +; ENDIF +;.READ_PG: BYTE #00 ;!TODO не используются некоторые значения, но задумка неплохая))) +;.S_X_H: DWORD #0000 ; количество секторов на цилиндре + ENDS +; + ; STRUCT _sBuffers .FileManipulator _sFM ; 44 bytes + 44 bytes * (FMCOUNT-1) .FM_RESERVE BLOCK _sFM * (FMCOUNT-1),0 ; -.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 +.FatBuffer _sFatBuffer +;.BootSector BLOCK 90,0 ; _sBOOT_SECTOR_PARAMS: 62 bytes FAT16, 90 bytes FAT32 .EXE_Header _sEXE_HEADER ; 512 bytes .Stack _sStack ; 256 bytes .Buffer BLOCK 512,0 ; FOR BUFFER & SECBUF .MemoryTable BLOCK 256,0 ; 256 bytes ENDS -; +; \ No newline at end of file diff --git a/DSS/build.txt b/DSS/build.txt index 9f02e1c..4d19020 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -952 \ No newline at end of file +950 \ No newline at end of file diff --git a/DSS/defines.inc b/DSS/defines.inc index f380f5c..6bd6034 100644 --- a/DSS/defines.inc +++ b/DSS/defines.inc @@ -149,4 +149,9 @@ MOUSE_BAUD: .multiplier_2 EQU 45 ; второй множитель = 45. 875000/Мн1*Мн2=1215 ENDIF ;----------------------------------------------------; -; \ No newline at end of file +; + +; +;----------------------------------------------------; +SUBLOAD_SIZE EQU 10 ; кол-во секторов которое надо подгрузить после загрузки system.dos в страницу +;----------------------------------------------------; diff --git a/SHELL/BATCH.ASM b/SHELL/BATCH.ASM index e990f93..22b9e4c 100644 --- a/SHELL/BATCH.ASM +++ b/SHELL/BATCH.ASM @@ -103,8 +103,14 @@ BATCH: ;CALL Restore_Screen ;R10 ;pop af - ret c - ld (BAT_FM),a ; дескр. bat-файла + JR NC,.good + CP DSS_Error.sys.TOO_MANY_FILES_IN_DIR + SCF + RET NZ + LD A,DSS_Error.sys.FILE_NOT_FOUND + RET + ; +.good: ld (BAT_FM),a ; дескр. bat-файла ; выполн. команд bat-файла call NEWLINE ;!TODO вложенные bat. передавать ошибку обратно в вызывающий bat diff --git a/SHELL/build.txt b/SHELL/build.txt index c0d6976..75af06e 100644 --- a/SHELL/build.txt +++ b/SHELL/build.txt @@ -1 +1 @@ -314 \ No newline at end of file +315 \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 18c132c..0e2bbfb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 18c132c6e9b507cb92d2144f5497278f021a0292 +Subproject commit 0e2bbfb73ceb70a16b2ab2b5ee6cbc6bd5005bf7