diff --git a/BOOT/DSSBOOT.ASM b/BOOT/DSSBOOT.ASM index c8113e3..e37d201 100644 --- a/BOOT/DSSBOOT.ASM +++ b/BOOT/DSSBOOT.ASM @@ -12,6 +12,7 @@ ; + Initial revision 09 Nov 1998 + ; +------------------------------+ +; BIOS 3.06 загружает один сектор загрузчика и передаёт ему управление. DEFINE ORIGINAL_DSS 0 DEFINE UNIVERSAL_BOOT 1 @@ -37,22 +38,140 @@ DRIVE: _mSYSID LD HL,FAIL PUSH HL ; - LD A,INCORR - ;JR C,FAIL - RET C + LD HL,MESSAGES.INCORR + RET C ; goto FAIL LD A,(DRIVE) BIT 7,A - JR Z,GOOD_DRIVE + JP 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 + LD HL,MESSAGES.INCORR + RET C ; goto FAIL + JP GOOD_DRIVE +//////////////////////////////////////////////////////////////////////// +FAIL: CALL MESSAGE +.NULL: LD HL,MESSAGES.FAILURE + CALL MESSAGE + DI + HALT + JR $ +; + +; +; DOSMESS: CALL FMESAGE +; LD C,Dss.PChars +; RST ToDSS +; RET +; + +; +; 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 + XOR A + OUT (SYS_PORT.ON),A +.loop: LD A,(HL) ;R01 + INC HL + OR A + RET Z + CALL PRINTX + JR .loop +; +PRINTX: CP "\r" ; + JR Z,.CR_ + CP "\n" ; + 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,BIOS.LP_SET_PLACE + 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 +;R01 End + +; 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 + +MESSAGES:; 0 10 20 30 40 50 60 70 80 +.FAILURE: DB "\r\nFatal error! Press RESET to restart.\r\n",0 +.INCORR: DB "\r\nUnsupported BIOS version! Update BIOS to run this version of DSS.\r\n",0 +.ERRPART: DB "\r\nUnknown partition table.",0 +.ERRIBPB: DB "\r\nInvalid BOOT sector.",0 +.NO_SYS: DB "\r\nCan't open file SYSTEM.DOS...",0 +.NOSHELL: DB "\r\nCan't open file SYSTEM.EXE...",0 +.STARTDO: DB "\r\nStarting DSS... \r\n\n",0 +; +SHELL_NAME: DB '\SYSTEM.EXE /P',0 +ROOT: DB 'X:\',0 +CORE_NAME: DB "SYSTEM DOS" +.Size EQU $-CORE_NAME +FATMSG: DB "FAT" +//////////////////////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////////////////////// + ASSERT $<#8200, "Error!!! BIOS LOADING ONLY FIRST #200 BYTES" +//////////////////////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////////////////////// GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD HL,0 LD IX,2 - LD BC,2*256 + BIOS.DRV_READ + LD BC,2*256 + BIOS.DRV_READ ;!HARDCODE дозагрузка ещё двух секторов загрузчика LD A,(DRIVE) RST ToBIOS_18 JP C,FAIL.NULL @@ -72,13 +191,11 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE OUT (SLOT0),A ; CALL GET_BPB ;READ BPB - LD A,ERRIBPB - ;JP C,FAIL - RET C + LD HL,MESSAGES.ERRIBPB + RET C ; goto FAIL CALL GETROOT - LD A,NO_SYS - ;JP C,FAIL - RET C + LD HL,MESSAGES.NO_SYS + RET C ; goto FAIL ; [ ] загрузка system.dos больше #4000 байтов LD HL,(FSIZE1) LD A,H @@ -109,16 +226,16 @@ GOOD_DRIVE: LD DE,#8200 ;!HARDCODE LD (LOAD_CORE.max_sectors),A LD (BIG_CORE),A ; теперь это счётчик оставшихся секторов ; - LD A,(BOOT.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов JP NC,INC_SECTOR_NUM - CALL C,R_F_FAT ; next cluster in chain + CALL R_F_FAT ; next cluster in chain EX DE,HL LD DE,#C000 CALL NC,LOAD_CORE .no_big_core: ; RUN_CORE: DI - XOR A + XOR A OUT (SYS_PORT.OFF),A ; LD A,#10 @@ -132,7 +249,7 @@ RUN_CORE: DI ; LD A,(BANKDOS) ; OUT (SLOT0),A ;DOS LOADED - IF UNIVERSAL_BOOT + ;IF UNIVERSAL_BOOT ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,(DRIVE+1) ; номер раздела LD L,A @@ -140,36 +257,39 @@ RUN_CORE: DI LD A,(DRIVE) ; номер устройства LD C,Dss.Version RST ToDSS - JP C,XFAIL.fail + JP C,FAIL.NULL ; - LD A,STARTDO - CALL DOSMESS + LD HL,MESSAGES.STARTDO + CALL MESSAGE + ; + XOR A + OUT (SYS_PORT.OFF),A ; 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 + ;ELSE + ; IF ORIGINAL_DSS + ; LD C,Dss.Version + ; RST ToDSS + ; ELSE + ; LD A,(DRIVE) + ; LD C,Dss.Version + ; RST ToDSS + ; JP C,FAIL.NULL + ; LD C,Dss.BootDSK + ; ENDIF ; + ; LD HL,MESSAGES.STARTDO + ; CALL MESSAGE + ; IF ORIGINAL_DSS + ; LD A,(DRIVE) + ; LD BC,Dss.BootDSK.Set + ; RST ToDSS + ; LD BС,Dss.BootDSK.Get + ; ENDIF + ;ENDIF ; RST ToDSS ; @@ -180,17 +300,28 @@ RUN_CORE: DI LD C,Dss.ChDir RST ToDSS ; - LD HL,PSHELL + LD HL,SHELL_NAME 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 + +.NoShell: JP NC,FAIL.NULL + LD HL,MESSAGES.NOSHELL + CP DSS_Error.sys.UNEXPECTED_APP_TRMN + JP NZ,FAIL + JP FAIL.NULL + +; .NoShell: LD HL,MESSAGES.NOSHELL +; JP C,FAIL +; LD HL,MESSAGES.FAILURE +; JP FAIL + + +; XFAIL: CALL DOSMESS +; .fail: LD HL,MESSAGES.FAILURE +; CALL DOSMESS +; DI +; HALT +; .halt: JR .halt ; ; @@ -202,38 +333,79 @@ INC_SECTOR_NUM: PUSH DE INC HL .no_inc: ; POP DE - CALL .set_stack - JP RUN_CORE -.set_stack: PUSH HL + LD BC,RUN_CORE + PUSH BC + PUSH HL JP LOAD_CORE.subload + +; CALL .set_stack +; JP RUN_CORE +; .set_stack: PUSH HL +; JP LOAD_CORE.subload ; ; PART_TB: PUSH BC - LD HL,(BOOT+510) + LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) LD DE,#AA55 - AND A + ;AND A + ; CF = 0 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 + SCF + RET NZ + LD IX,BOOT_BUFFER + BOOT_SECTOR.PARTITION_TABLE + LD B, +(_sMBR_PARTITION_TABLE / _sMBR_PARTITION_RECORD) + ; +.part_loop: LD A,(IX + _sMBR_PARTITION_RECORD.FS_ID) + ; ЕСЛИ добавится поддержка ещё одного типа ФС, то поменять 1 на 2 + ; 1 + 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 + CP PartitionSysTypes.FAT32 + JR Z,YEPDOS + CP PartitionSysTypes.FAT32_LBA + JR Z,YEPDOS + ; + ; 2 + ;EXX + ;LD HL,SUPPORTED_PARTITIONS + ;LD BC,SUPPORTED_PARTITIONS.Size + ;CPIR + ;EXX + ;JR Z,YEPDOS + ; +.next: LD DE,_sMBR_PARTITION_RECORD ADD IX,DE - DJNZ .DOSAGA -.ERRP: LD A,ERRPART + DJNZ .part_loop + ; + LD HL,MESSAGES.ERRPART JP FAIL +; 2 + ; SUPPORTED_PARTITIONS: + ; ;.Empty DB #00 + ; .FAT12 DB #01 + ; .FAT16_32Mb DB #04 + ; ;.Extended DB #05 + ; .FAT16 DB #06 + ; ;.HPFS_NTFS DB #07 + ; .FAT32 DB #0B + ; .FAT32_LBA DB #0C + ; .FAT16_LBA DB #0E + ; ;.Win_Ext_LBA DB #0F + ; ;.Linux_swap DB #82 + ; ;.Linux DB #83 + ; ;.Linux_extended DB #85 + ; .Size EQU $-SUPPORTED_PARTITIONS ; -; + + YEPDOS: ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого LD A,#80 CP (IX+0) @@ -246,12 +418,12 @@ YEPDOS: ;[ ] 17.12.2023 LD D,(IX+09) LD L,(IX+10) LD H,(IX+11) - LD XH,D - LD XL,E + PUSH DE + POP IX LD (DISKL),IX LD (DISKH),HL LD A,(DRIVE) - LD DE,BOOT + LD DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ RST ToBIOS_18 ;[ ] 17.12.2023 загрузка с активного раздела, а не с первого @@ -264,26 +436,12 @@ YEPDOS: ;[ ] 17.12.2023 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 DE,BOOT_BUFFER LD BC,1*256 + BIOS.DRV_READ LD A,(DRIVE) RST ToBIOS_18 @@ -301,31 +459,47 @@ GET_BPB: LD IX,#0000 ; .NX1: CP #00 JR NZ,.NX2 - CALL SET_PRM ;FDD -.NX2: LD HL,(BOOT+510) + ; + ; SET_PRM if FDD + PUSH BC + LD A,B + LD C,BIOS.DRV_GET_PAR + RST ToBIOS_18 + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerTrack) + LD L,A + POP AF + ;PUSH AF + LD C,BIOS.DRV_SET_PAR + RST ToBIOS_18 + ;POP BC + ;LD A,C ; нахера? + ;RET + +.NX2: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) LD DE,#AA55 AND A SBC HL,DE SCF RET NZ - LD IY,BOOT ;Analysing Block Parametr BIOS + ; + LD IY,BOOT_BUFFER ;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 (FatBuffer.RootDirFirstSector_H),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 (FatBuffer.FAT1_SEC_L),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 + LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ;amount FATs .C_DATA1: ADD HL,DE DEC A JR NZ,.C_DATA1 - LD (DIR_FRM),HL ;first sector DIR + LD (FatBuffer.RootDirFirstSector_L),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) @@ -336,21 +510,21 @@ GET_BPB: LD IX,#0000 ADD HL,HL LD A,H SRL A - LD (DIR_S_S),A ;Sectors per dir + LD (FatBuffer.DirSizeInSectors),A ;Sectors per dir LD L,A LD H,0 ADD HL,DE - LD (DAT_FRM),HL ;First sector data + LD (FatBuffer.FirstDataSector_L),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) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) .NEXTAD3: ADD HL,BC ;calc. cluster size DEC A JR NZ,.NEXTAD3 - LD (CLU_LEN),HL - LD HL,BOOT.ID_FAT + LD (FatBuffer.BytesPerCluster),HL + LD HL,BOOT_BUFFER + BOOT_SECTOR.ID_FAT LD DE,FATMSG LD B,3 .R_BPBL1: LD A,(DE) @@ -368,29 +542,29 @@ GET_BPB: LD IX,#0000 RET NZ LD A,(HL) CP "6" ; FAT16 - LD HL,#FFFF + ;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 HL,#0FFF +.BPB_FAT: LD (FatBuffer.FAT_TYPE),A + ;LD (FatBuffer.END_CHAIN_CLUSTER_L),HL ; LD IX,(DISKL) LD HL,(DISKH) - LD DE,(FAT_FRM) + LD DE,(FatBuffer.FAT1_SEC_L) LD BC,#0000 ADD IX,DE ADC HL,BC ;HL:IX - LD DE,FAT + LD DE,FAT_SECTORS_BUFFER LD BC,3*256 + BIOS.DRV_READ LD A,(DRIVE) RST ToBIOS_18 RET C LD HL,0 - LD (FatCache),HL + LD (FatBuffer.CacheBlock),HL XOR A RET ; @@ -404,14 +578,470 @@ GET_BPB: LD IX,#0000 LD A,"2" LD HL,#0FFF JR .BPB_FAT +;*/ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* +GET_BPB: LD IX,#0000 + LD HL,#0000 + LD DE,BOOT_BUFFER + 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 + ; + ; SET_PRM if FDD + PUSH BC + LD A,B + LD C,BIOS.DRV_GET_PAR + RST ToBIOS_18 + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerTrack) + LD L,A + POP AF + ;PUSH AF + LD C,BIOS.DRV_SET_PAR + RST ToBIOS_18 + ;POP BC + ;LD A,C ; нахера? + ;RET + +.NX2: LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) + LD DE,#AA55 + AND A + SBC HL,DE + SCF + RET NZ + ; +;RD_BPB: ; CALL READ_BPB + ; JP C,DOS_X_Error.Not_ready + ; ; + ; LD DE,#AA55 ; сигнатура ;R05 + ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.MBR_SIGNATURE) ;R08 ;R07 + ; ;R05 + ; AND A + ; SBC HL,DE + ; JP NZ,DOS_X_Error.UnknownBPB + ; + ; ;R08 ; [x] fat32 + ; LD HL,BOOT_BUFFER + ; LD DE,CORE_BUFFERS.BootSector + ; LD BC,_sBOOT_SECTOR_PARAMS_FAT32 ; size + ; LDIR + ; + LD A,(BOOT_BUFFER + BOOT_SECTOR.DRIVE_TYPE) + CP #F0 + RET C + ; + ; LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + ; LD (FatBuffer.BytesPerSector),HL + ; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + ; LD (FatBuffer.SectorsPerCluster),A + ; calc. first sector FAT + LD HL,(BOOT_BUFFER + BOOT_SECTOR.RESERVED_SECTORS) + LD (FatBuffer.FAT1_SEC_L),HL ; low word first sector FAT #1 + ;LD (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.SectorsPerFAT_H),A ; fat32 + ; + ; + LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT16) + LD A,E + OR D + JR NZ,.skip_high + ; + LD BC,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32 + 2) + LD A,C + LD (FatBuffer.SectorsPerFAT_H),A + LD DE,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerFAT32) +.skip_high: LD (FatBuffer.SectorsPerFAT_L),DE + LD A,(BOOT_BUFFER + BOOT_SECTOR.Number_of_FATs) ; amount FATs + LD (FatBuffer.Number_Of_FATs),A + CP 1 + JR Z,.one_FAT + DEC A + ADD HL,DE + LD (FatBuffer.FAT2_SEC_L),HL + JR NC,.no_inc_BC + INC BC +.no_inc_BC: LD (FatBuffer.FAT2_SEC_H),BC +.one_FAT: ;C_DATA1 +.loop1: ADD HL,DE + JR NC,.loop1_1 + INC BC +.loop1_1: DEC A + JR NZ,.loop1 + ; + LD (FatBuffer.RootDirFirstSector_L),HL ; first sector DIR + + ;LD BC,(FatBuffer.BytesPerSector) + LD BC,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + LD A,B + AND A + ; + RL C + RLA + RL C + RLA + RL C + RLA + ; + LD C,A + LD B,0 ; BC - File handels in sectors + ;;;; + IF COMPILE_UNUSED_CODE + LD (FatBuffer.FilesPerSector),A + ENDIF + ; + EX DE,HL + LD HL,(BOOT_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 + ; fat32 + LD A,H + OR L + JR Z,.skip_loop2 + ; + DEC HL + XOR A + ;NEXTAD2 +.loop2: INC A + RET C + SBC HL,BC + JR NC,.loop2 + ; +.skip_loop2: EX DE,HL + LD C,A ; A - sectors in DIR + LD B,0 + LD (FatBuffer.DirSizeInSectors),A + + ADD HL,BC ; Start DATA area + LD (FatBuffer.FirstDataSector_L),HL + ; B = 0 + ; + ;LD HL,(FatBuffer.BytesPerSector) + LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) + ;LD A,(FatBuffer.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + ;!TODO FATcacheSize + ; calc. cluster size + XOR 1 + JR Z,.loop3.end + RRA +.loop3: ADD HL,HL + RRA + JP NC,.loop3 +.loop3.end: ; + LD (FatBuffer.BytesPerCluster),HL + ; fat32 + LD HL,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerDrive) + LD DE,(FatBuffer.FirstDataSector_L) + LD A,H + OR L + JP NZ,.HDDSMAL + ; + LD HL,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_L) + LD BC,(BOOT_BUFFER + BOOT_SECTOR.BPB_BIG_TOTAL_SECTORS_H) + PUSH BC ; Total Sectors high + PUSH HL ; Total Sectors low + AND A + SBC HL,DE + JP NC,.HDDBIG + DEC BC + JP .HDDBIG + ; +.HDDSMAL: ; CF = 0 + LD BC,0 + PUSH BC ; Total Sectors high + PUSH HL ; Total Sectors low + SBC HL,DE + ; +.HDDBIG: CALL SectorToCluster +; LD A,(FatBuffer.SectorsPerCluster) +; SCF +; .loop7: RRA +; JR C,.loop7_exit +; RR B +; RR C +; RR H +; RR L +; JP .loop7 + ; +.loop7_exit: INC HL + LD (FatBuffer.MaxClusterLow),HL + LD A,L + OR H + JR NZ,.no_inc_bc + INC BC +.no_inc_bc: LD (FatBuffer.MaxClusterHigh),BC + ; + XOR A + LD H,A + LD L,A + LD (FatBuffer.CacheBlock),HL + LD (FatBuffer.CacheUpdated),A + ; A = 0 + LD HL,(FatBuffer.SectorsPerFAT_H) + LD H,A + EX DE,HL + LD HL,(FatBuffer.SectorsPerFAT_L) + ; DE:HL = SectorsPerFAT + ; + LD A,(BOOT_BUFFER + BOOT_SECTOR.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,(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,(BOOT_BUFFER + BOOT_SECTOR.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,(FatBuffer.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.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 HL,#FFFF + LD A,FAT_TYPE.x16 +.set_vars: EXX + LD HL,0 + LD (FatBuffer.END_CHAIN_CLUSTER_H),HL + LD (FatBuffer.RootDirStartCluster_L),HL + LD (FatBuffer.RootDirStartCluster_H),HL + LD HL,BOOT_BUFFER + BOOT_SECTOR.FAT.LABEL + EXX + LD DE,(BOOT_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER) + LD BC,(BOOT_BUFFER + BOOT_SECTOR.FAT.SERIAL_NUMBER+2) + JR .SET_VARS + ; +.its_FAT12: LD HL,#0FFF + LD A,FAT_TYPE.x12 + JR .set_vars + ; +.its_FAT32: LD A,(BOOT_BUFFER + BOOT_SECTOR.MainFATnumber) + CP #80 + JR C,.mirrored_FATs ;если все копии FAT используются + ; используется только одна копия FAT + LD HL,(FatBuffer.FAT1_SEC_H) + LD DE,(FatBuffer.SectorsPerFAT_H) + LD D,0 + EXX + LD HL,(FatBuffer.FAT1_SEC_L) + LD DE,(FatBuffer.SectorsPerFAT_L) + AND #0F + JR Z,.first_FAT_active + LD B,A + ; +.fat_calc_loop: ADD HL,DE + EXX + ADC HL,DE + EXX + DJNZ .fat_calc_loop + ; +.first_FAT_active: + LD (FatBuffer.FAT1_SEC_L),HL + LD (FatBuffer.FAT2_SEC_L),HL + EXX + LD (FatBuffer.FAT1_SEC_H),HL + LD (FatBuffer.FAT2_SEC_H),HL + ; +.mirrored_FATs: ; + LD HL,BOOT_BUFFER + BOOT_SECTOR.FAT32.LABEL + ; + EXX + LD HL,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster) + LD (FatBuffer.RootDirStartCluster_L),HL + LD BC,(BOOT_BUFFER + BOOT_SECTOR.RootDirStartCluster+2) + LD (FatBuffer.RootDirStartCluster_H),BC + ; + CALL CLUSTER_TO_SECTOR + LD (FatBuffer.RootDirFirstSector_L),HL + LD (FatBuffer.RootDirFirstSector_H),BC + ; + LD HL,(BOOT_BUFFER + BOOT_SECTOR.FSINFO_Sector) + LD (FatBuffer.FSINFO_Sector),HL + ; + LD A,FAT_TYPE.x32 + LD HL,#0FFF + LD (FatBuffer.END_CHAIN_CLUSTER_H),HL + LD H,L + LD DE,(BOOT_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER) + LD BC,(BOOT_BUFFER + BOOT_SECTOR.FAT32.SERIAL_NUMBER+2) + ; +.SET_VARS: LD (FatBuffer.FAT_TYPE),A + LD (FatBuffer.END_CHAIN_CLUSTER_L),HL + LD (FatBuffer.BPB_SERIAL_NUMBER),DE + LD (FatBuffer.BPB_SERIAL_NUMBER+2),BC + EXX + LD DE,FatBuffer.BPB_LABEL + LD BC,11 ;!HARDCODE + LDIR + ; + SET_PAGE_X FATPAGE + PUSH AF + LD DE,0 + CALL READ_FAT_TABLE + POP AF + OUT (SLOT3),A + ; + ; Установить начальный кластер для чтения + LD A,(FatBuffer.FAT_TYPE) + CP FAT_TYPE.x32 + JR Z,.set_FSinfo + ; + LD HL,#0001 + LD (G_CLUST.low),HL + DEC L + LD (G_CLUST.high),HL + ; + DEC HL + LD (FatBuffer.FREE_CLUSTERS_COUNT_L),HL + LD (FatBuffer.FREE_CLUSTERS_COUNT_H),HL + XOR A + RET + ; +.set_FSinfo: CALL READ_FSinfo + ; !FIXIT проверка на ошибку + ; + ; проверка одной из сотни сраных сигнатур + LD HL,(BOOT_BUFFER + _sFSinfo.DATA_SIGNATURE) + LD DE,(BOOT_BUFFER + _sFSinfo.DATA_SIGNATURE + 2) + LD BC,#7272 + SBC HL,BC + JR NZ,.error + EX DE,HL + LD DE,#6141 + SBC HL,DE + JR NZ,.error + ; FREE_CLUSTERS_COUNT + LD BC,(BOOT_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT) + LD DE,(BOOT_BUFFER + _sFSinfo.FREE_CLUSTERS_COUNT+2) + ; CF = 0 + CALL .check_cluster + JR NC,.skip_FFFF + ; + LD B,#FF + LD C,B + LD D,B + LD E,B + ; +.skip_FFFF: LD (FatBuffer.FREE_CLUSTERS_COUNT_L),BC + LD (FatBuffer.FREE_CLUSTERS_COUNT_H),DE + ; + ; FIRST_FREE_CLUSTER + LD BC,(BOOT_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER) + LD DE,(BOOT_BUFFER + _sFSinfo.FIRST_FREE_CLUSTER+2) + ; CF = 0 + CALL .check_cluster + JR C,.error + ; + LD (G_CLUST.high),DE + LD (G_CLUST.low),BC + XOR A +.error: LD (FatBuffer.UPD_FSINFO),A + RET Z + ;!TODO FREE_CLUSTERS_COUNT + ;LD HL,#FFFF + ;LD (FatBuffer.FREE_CLUSTERS_COUNT_L),HL + ;LD (FatBuffer.FREE_CLUSTERS_COUNT_H),HL + ; + XOR A + LD H,A + LD L,2 + LD (G_CLUST.low),HL + LD L,H + LD (G_CLUST.high),HL + RET + ; + ;!TODO MaxCluster - максимально допустимый или на 1 больше максимально допустимого? +.check_cluster: LD HL,(FatBuffer.MaxClusterLow) + SBC HL,BC + LD HL,(FatBuffer.MaxClusterHigh) + SBC HL,DE + RET +;;;;;;;; + +; --> BC:HL - Sector +; <-- BC:HL - Cluster +SectorToCluster: + LD A,B + AND #0F + LD B,A + ;LD A,(FatBuffer.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) + SCF +.loop: RRA + RET C + RR B + RR C + RR H + RR L + JP .loop ; +*/ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ; поиск system.dos -GETROOT: LD HL,(DIR_FRH) - LD IX,(DIR_FRL) +GETROOT: LD HL,(FatBuffer.RootDirFirstSector_H) + LD IX,(FatBuffer.RootDirFirstSector_L) LD BC,(DISKL) LD DE,(DISKH) - LD A,(DIR_S_S) + LD A,(FatBuffer.DirSizeInSectors) .NEXTSEC: PUSH AF ADD IX,BC ADC HL,DE @@ -439,38 +1069,43 @@ GETROOT: LD HL,(DIR_FRH) ; SEARCH: LD C,17 ;HANDELS PER SECTOR 512/32 + 1 - LD IX,DIR - FAT_DIRECTORY_RECORD + LD IX, DIR - FAT_DIRECTORY_RECORD .SKIPNAM: LD DE,FAT_DIRECTORY_RECORD ADD IX,DE DEC C RET Z - LD A,(IX+00) + ; + LD A,(IX+FAT_DIRECTORY_RECORD.NAME) OR A SCF RET Z + ; CP #E5 JR Z,.SKIPNAM - LD A,(IX+11) - AND #10 + ; + LD A,(IX+FAT_DIRECTORY_RECORD.ATTRIBUT) + AND FAT_ATTR.DIRECTORY JR NZ,.SKIPNAM - LD HL,MASKARE - LD D,XH - LD E,XL - LD B,11 -.SEARCH2: LD A,(DE) + ; + LD DE,CORE_NAME + PUSH IX + POP HL + LD B,CORE_NAME.Size + ; +.loop: 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 + DJNZ .loop + ; + PUSH IX + POP HL + LD DE,HANDBUF LD BC,FAT_DIRECTORY_RECORD LDIR - XOR A - INC A + ; ZF = 1, CF = 0, A != 0 + AND A ; на выходе ZF = CF = 0 RET ; ; HL - CLUSTER @@ -480,7 +1115,7 @@ LOAD_CORE: LD (READMEM),DE .loop: PUSH HL CALL NSECTOR LD DE,(READMEM) - LD A,(BOOT.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) .max_sectors+1: CP #20 JR C,.SMALL_CLUSTER ; @@ -492,7 +1127,7 @@ LOAD_CORE: LD (READMEM),DE LD A,(DRIVE) RST ToBIOS_18 POP HL - AND A + ;AND A RET ; .SMALL_CLUSTER: LD B,A @@ -503,7 +1138,7 @@ LOAD_CORE: LD (READMEM),DE RST ToBIOS_18 ; LD HL,(READMEM) - LD DE,(CLU_LEN) + LD DE,(FatBuffer.BytesPerCluster) ADD HL,DE LD (READMEM),HL POP HL @@ -527,7 +1162,7 @@ LOAD_CORE: LD (READMEM),DE ; .LD_FILE: PUSH HL ; system.dos first cluster ; CALL NSECTOR ; Cluster to Sector ; LD DE,(READMEM) -; LD A,(BOOT.SectorsPerCluster) +; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ; CP #20 + 1 ; !HARDCODE кол-во загружаемых секторов ; LD C,BIOS.DRV_READ_LONG ; JR C,.SMALL_CLUSTER @@ -594,12 +1229,12 @@ LOAD_CORE: LD (READMEM),DE ; LD (BANKDOS),A ; LD HL,#C000 ; LD (READMEM),HL -; LD A,(BOOT.SectorsPerCluster) +; LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) ; SUB SUBLOAD_SIZE + 1 ; CCF ; RET NC ; LD A,SUBLOAD_SIZE -; LD (BOOT.SectorsPerCluster),A +; LD (BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster),A ; AND A ; RET @@ -611,7 +1246,7 @@ LOAD_CORE: LD (READMEM),DE NSECTOR: LD DE,0 DEC HL DEC HL - LD A,(BOOT.SectorsPerCluster) + LD A,(BOOT_BUFFER + BOOT_SECTOR.SectorsPerCluster) XOR 1 JR Z,.skip ; @@ -623,9 +1258,9 @@ NSECTOR: LD DE,0 JP NC,.loop ; .skip: EX DE,HL - LD XL,E - LD XH,D - LD DE,(DAT_FRM) ;first data sector + PUSH DE + POP IX + LD DE,(FatBuffer.FirstDataSector_L) ;first data sector XOR A ADD IX,DE LD D,A @@ -642,28 +1277,29 @@ NSECTOR: LD DE,0 ; HL - CLUSTER ; DE - (CLUSTER) R_F_FAT: PUSH HL - LD A,(FAT_TYP) + LD A,(FatBuffer.FAT_TYPE) 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 +.R_F_00H: INC A ; HL - CLUSTER ; [ ] fat32 тут счётчик в 32 бита нужен или 16, если страницу FF использовать 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 + LD BC,(FatBuffer.CacheBlock) ; A - ELEMENT OF CASH CP C CALL NZ,RE_FAT - LD DE,FAT + LD DE,FAT_SECTORS_BUFFER ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD HL,#FFEF - XOR A + ; +.exit: XOR A SBC HL,DE POP HL RET @@ -676,7 +1312,7 @@ R_F_FAT: PUSH HL RR L PUSH AF EX DE,HL - LD HL,(BOOT.BytesPerSector) + LD HL,(BOOT_BUFFER + BOOT_SECTOR.BytesPerSector) LD B,H LD C,L ADD HL,HL @@ -688,10 +1324,10 @@ R_F_FAT: PUSH HL JP NC,.R_F_00 ADD HL,DE DEC A - LD BC,(FatCache) + LD BC,(FatBuffer.CacheBlock) CP C CALL NZ,RE_FAT - LD DE,FAT + LD DE,FAT_SECTORS_BUFFER ADD HL,DE POP AF LD E,(HL) @@ -701,7 +1337,7 @@ R_F_FAT: PUSH HL LD A,D AND #0F LD D,A - JP .R_F_F02 + JR .R_F_F02 ; .R_F_F01: LD A,E AND #F0 @@ -714,24 +1350,26 @@ R_F_FAT: PUSH HL RR D RRA LD E,A + ; .R_F_F02: LD HL,#0FEF - XOR A - SBC HL,DE - POP HL - RET + JR .exit + ; XOR A + ; SBC HL,DE + ; POP HL + ; RET ; ; RE_FAT: PUSH HL LD L,A LD H,0 - LD (FatCache),HL + LD (FatBuffer.CacheBlock),HL LD E,L LD D,H ADD HL,HL ADD HL,DE LD IX,0 - LD DE,(FAT_FRM) + LD DE,(FatBuffer.FAT1_SEC_L) ADD HL,DE EX DE,HL JR NC,.NOINX @@ -747,7 +1385,7 @@ RE_FAT: PUSH HL PUSH DE POP IX POP HL - LD DE,FAT + LD DE,FAT_SECTORS_BUFFER LD BC,3*256 + BIOS.DRV_READ LD A,(DRIVE) RST ToBIOS_18 @@ -755,158 +1393,47 @@ RE_FAT: PUSH 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 -;a BIOS version that is incompatible with this version of DOS -; 0 10 20 30 40 50 60 70 80 -MSG0: DB 0 - DB 13,10,"The system has been halted. Press RESET to restart your computer.",13,10,0 - DB 13,10,"You started your computer with a BIOS version that is incompatible with this",13,10 - DB "version of DSS. Please update BIOS to run this version of DSS.",13,10,0 - DB "Invalid partition table.",13,10,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 -; -PSHELL: DB '\SYSTEM.EXE /P',0 -ROOT: DB 'X:\',0 -MASKARE: DB "SYSTEM DOS" -FATMSG: DB "FAT" -//////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////// ; Area for boot sector [512Bytes] -BOOT _sBOOT_SECTOR_PARAMS = $ - -; BOOT EQU $ -; ID_NAME EQU BOOT+#03 ; +03 DOS NAME -; ; Block Parameters BIOS -; B_P_S EQU BOOT+#0B ; +0B BYTE PER SECTOR -; S_P_C EQU BOOT+#0D ; +0D SECTORS PER CLUSTER -; RESERVE EQU BOOT+#0E ; +0E RESERVE SECTORS -; FAT_NUM EQU BOOT+#10 ; +10 AMOUNT FATS -; F_P_DIR EQU BOOT+#11 ; +11 FILES IN DIRECTORY -; S_P_D EQU BOOT+#13 ; +13 ALL SECTORS ON DISK -; ID_FORM EQU BOOT+#15 ; +15 ID FORMAT -; S_P_F EQU BOOT+#16 ; +16 SIZE FAT IN SECTORS -; S_P_T EQU BOOT+#18 ; +18 SECTOR PER TRACK -; HEADS EQU BOOT+#1A ; +1A AMOUNT SIDES -; HIDDEN EQU BOOT+#1C ; +1C HIDDEN SECTORS -; ID_FAT EQU BOOT+#36 ; +36 FAT ID -; ; end boot sector +;BOOT _sBOOT_SECTOR_PARAMS = $ +BOOT_BUFFER EQU $ +DIR EQU BOOT_BUFFER+512 +; +FAT_SECTORS_BUFFER EQU DIR+512 +VALUE EQU 3*512+FAT_SECTORS_BUFFER +; +FatBuffer EQU VALUE +.CacheBlock EQU FatBuffer+0 ; FatCache +.FAT1_SEC_L EQU FatBuffer+2 ; FAT_FRM MSD_FAT_SEC first sector FAT +.RootDirFirstSector_H EQU FatBuffer+4 ; DIR_FRH MSD_CAT_SEC first sector DIR +.RootDirFirstSector_L EQU FatBuffer+6 ; DIR_FRL MSD_CAT_SEC first sector DIR +.DirSizeInSectors EQU FatBuffer+8 ; DIR_S_S DIR_SEC_SIZE +.FirstDataSector_L EQU FatBuffer+9 ; DAT_FRM MSD_DAT_SEC +.FAT_TYPE EQU FatBuffer+11; FAT_TYP ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit) +.BytesPerCluster EQU FatBuffer+12; CLU_LEN +;.END_CHAIN_CLUSTER_L EQU FatBuffer+14; ENDCLUS -DIR EQU BOOT+512 -FAT EQU DIR+512 +; FatCache EQU VALUE+0 ; .CacheBlock +; FAT_FRM EQU FatCache+2 ; .FAT1_SEC_L MSD_FAT_SEC first sector FAT +; DIR_FRH EQU FatCache+4 ; .RootDirFirstSector_H MSD_CAT_SEC first sector DIR +; DIR_FRL EQU FatCache+6 ; .RootDirFirstSector_L MSD_CAT_SEC first sector DIR +; DIR_S_S EQU FatCache+8 ; .DirSizeInSectors DIR_SEC_SIZE +; DAT_FRM EQU FatCache+9 ; .FirstDataSector_L MSD_DAT_SEC +; FAT_TYP EQU FatCache+11; .FAT_TYPE ; !FIXIT TYPE FAT (#32 - 12bit, #36 - 16bit) +; CLU_LEN EQU FatCache+12; .BytesPerCluster +; ENDCLUS EQU FatCache+14; .END_CHAIN_CLUSTER_L + -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 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 +FCLUSTER32 EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_H +; FTIME EQU HANDBUF + FAT_DIRECTORY_RECORD.TIME +; FDATE EQU HANDBUF + FAT_DIRECTORY_RECORD.DATE +FCLUSTR EQU HANDBUF + FAT_DIRECTORY_RECORD.FIRST_CLUSTER_L +FSIZE0 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE +FSIZE1 EQU HANDBUF + FAT_DIRECTORY_RECORD.F_SIZE + 2 DISKH EQU VALUE+48 DISKL EQU VALUE+50 @@ -917,8 +1444,8 @@ BANKDOS EQU VALUE+55 ; EQU VALUE+56 ;----------------- - BLOCK #8600-$-3,0 - DB 'SPT' +; BLOCK #8600-$-3,0 +; DB 'SPT' ; BIGA EQU (($/256)+1)*256 ; BIGA2 EQU BIGA-$-2 ; DS BIGA2 diff --git a/BOOT/boot.asm b/BOOT/boot.asm index e26b06a..2849694 100644 --- a/BOOT/boot.asm +++ b/BOOT/boot.asm @@ -802,7 +802,7 @@ write_end: pop af ; code_loader: include 'dssboot.asm' ; универсальный загрузчик для старого и нового доса code_loader.size EQU $-code_loader - DISPLAY " dssboot size: ", /D,code_loader.size, " bytes. Sectors: ",code_loader.size/512 + DISPLAY " dssboot size: ", /D,code_loader.size, " bytes. Sectors: ",/D,(code_loader.size/512 + (code_loader.size mod 512)/(code_loader.size mod 512)) ; 512 байт, буфер boot-сектора diff --git a/DSS/FS/FAT/FAT.asm b/DSS/FS/FAT/FAT.asm index 51214f3..fcb278b 100644 --- a/DSS/FS/FAT/FAT.asm +++ b/DSS/FS/FAT/FAT.asm @@ -769,9 +769,9 @@ RD_BPB: ; LD C,SLOT3 LD C,A LD B,0 ; BC - File handels in sectors ;;;; - IF COMPILE_UNUSED_CODE - LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A - ENDIF + IF COMPILE_UNUSED_CODE + LD (CORE_BUFFERS.FatBuffer.FilesPerSector),A + ENDIF ; EX DE,HL LD HL,(CORE_BUFFERS.SECTOR_BUFFER + BOOT_SECTOR.FilesInRootDIR) ; 0 for fat32 diff --git a/DSS/Structures.inc b/DSS/Structures.inc index 4a2ef37..a28b23a 100644 --- a/DSS/Structures.inc +++ b/DSS/Structures.inc @@ -97,7 +97,7 @@ .FirstDataSector_H: WORD #0000 ; MSD_DAT_SEC high .BytesPerCluster: WORD #0000 ; CLUSTER_LEN .END_CHAIN_CLUSTER_L: WORD #FFFF -.END_CHAIN_CLUSTER_H: WORD #0FFF ; [ ] fat3 +.END_CHAIN_CLUSTER_H: WORD #0FFF .MaxClusterLow: WORD #0000 ; макс. число кластеров (без служ.) .MaxClusterHigh: WORD #0000 ; макс. число кластеров (без служ.) .BytesPerSector WORD #0000 diff --git a/DSS/build.txt b/DSS/build.txt index be9c519..0272c1e 100644 --- a/DSS/build.txt +++ b/DSS/build.txt @@ -1 +1 @@ -986 \ No newline at end of file +987 \ No newline at end of file diff --git a/SHELL/Commands/DATE.ASM b/SHELL/Commands/DATE.ASM index b09accc..105a276 100644 --- a/SHELL/Commands/DATE.ASM +++ b/SHELL/Commands/DATE.ASM @@ -82,7 +82,7 @@ cmd_date: CALL ncopy_string ; ld de,MAIN_MSG.DATE ; индекс "Current date: %1" - jp MESSAGE ; вывести строку + jp ECHO_MESSAGE ; вывести строку ; .days: DB 0 DZ "Sunday" @@ -172,4 +172,4 @@ cmd_tm1:ld c,Dss.SysTime xor a ld (hl),a ; в конец строки ld de,MAIN_MSG.TIME ; индекс "Current time: %1" - jp MESSAGE ; вывести строку + jp ECHO_MESSAGE ; вывести строку diff --git a/SHELL/Commands/DIR.ASM b/SHELL/Commands/DIR.ASM index f1fcd6a..3115533 100644 --- a/SHELL/Commands/DIR.ASM +++ b/SHELL/Commands/DIR.ASM @@ -20,7 +20,7 @@ cmd_dir: push de and a jr z,.skip LD DE,MAIN_MSG.CALCULATING - CALL MESSAGE + CALL ECHO_MESSAGE ; 23/05/24 .skip: ;LD C,Dss.CurDisk ; узнать тек. диск ;RST ToDSS @@ -122,12 +122,12 @@ cmd_dir: push de dec a jr nz,.skip_wait ld de,MAIN_MSG.PAUSE - call MESSAGE ; вывести строку + call ECHO_MESSAGE ; вывести строку ld c,Dss.WaitKey rst ToDSS dec d ld de,MAIN_MSG.DIR_ESCAPE - jp z,MESSAGE ; закончить по ESC + jp z,ECHO_MESSAGE ; закончить по ESC ;jr nz,.skip_esc ;xor a ;ld (.key_p),a ; отменяем ESC @@ -228,7 +228,7 @@ cmd_dir: push de CALL PRN_DISK_SIZE ; ; ld de,MAIN_MSG.DIR_2 ; индекс " %1 file(s), %2 bytes, %3 Dir(s)" - CALL MESSAGE ; вывести строку + CALL ECHO_MESSAGE ; вывести строку ; ; [ ] 23/05/2024 ld hl,Buffers.work.buffer2 @@ -240,7 +240,7 @@ cmd_dir: push de ld a,(read_disk_info.full) and a ;ld de,MAIN_MSG.CRLF - ;jp z,MESSAGE + ;jp z,ECHO_MESSAGE RET Z ; ; free space @@ -252,7 +252,7 @@ cmd_dir: push de CALL PRN_DISK_SIZE ; ld de,MAIN_MSG.DIR_4 ; индекс " %6 bytes free" - jp MESSAGE + jp ECHO_MESSAGE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -312,7 +312,7 @@ Print_Header: ; %1 ; CALL copy_string ; скопир. строку (с нулем) ; ld de,MAIN_MSG.DIR_1 ; индекс "Volume in drive %1..." - JP MESSAGE ; вывести строку + JP ECHO_MESSAGE ; вывести строку ; ; Подготовить строку списка файлов/папок @@ -337,7 +337,7 @@ PRNNAME: dec hl call PRNDATE ; вывести в буфер дату файла/папки call PRNTIME ; вывести в буфер время файла/папки ld de,MAIN_MSG.DIR_3 ; индекс "%1 %2 %3 %4 %5" - jp MESSAGE ; вывод строки + jp ECHO_MESSAGE ; вывод строки ; .set_small: ld d,h diff --git a/SHELL/Commands/ECHO.ASM b/SHELL/Commands/ECHO.ASM index 7fc3418..a893a48 100644 --- a/SHELL/Commands/ECHO.ASM +++ b/SHELL/Commands/ECHO.ASM @@ -39,7 +39,7 @@ A862E: ld a,(echo_mode) ; фла ld de,PRM1 ; куда (аргумент %1) call ncopy_string ; скопир. строку (с нулем), макс.15 симв. ld de,MAIN_MSG.ECHO ; индекс "Echo is %1" - jp MESSAGE + jp ECHO_MESSAGE ; A864B: ld (echo_mode),a ; флаг echo-режима ret diff --git a/SHELL/Commands/HELP.ASM b/SHELL/Commands/HELP.ASM index 4d74175..0dbe14e 100644 --- a/SHELL/Commands/HELP.ASM +++ b/SHELL/Commands/HELP.ASM @@ -5,4 +5,4 @@ ;/////////////////////////////////////////////////// cmd_help: ld de,MAIN_MSG.HELP ; индекс "COMMANDS: ..." - jp MESSAGE + jp ECHO_MESSAGE diff --git a/SHELL/Commands/PAUSE.ASM b/SHELL/Commands/PAUSE.ASM index 84cf4e3..55a48ce 100644 --- a/SHELL/Commands/PAUSE.ASM +++ b/SHELL/Commands/PAUSE.ASM @@ -5,7 +5,7 @@ ;/////////////////////////////////////////////////// cmd_pause: ld de,MAIN_MSG.PAUSE ; индекс "Press any key to continue ..." - call MESSAGE ; вывод строки + call ECHO_MESSAGE ; вывод строки LD A,LF LD C,Dss.PutChar RST ToDSS diff --git a/SHELL/Commands/VER.ASM b/SHELL/Commands/VER.ASM index f0fc837..19ef652 100644 --- a/SHELL/Commands/VER.ASM +++ b/SHELL/Commands/VER.ASM @@ -17,7 +17,7 @@ cmd_version: CALL .Set_Ver_to_PRM ; set Shell version ;R13 LD DE,MAIN_MSG.VERSION - JP MESSAGE + JP ECHO_MESSAGE ; Вход: ; L - номер версии (0..9) diff --git a/SHELL/Procedures/Print.ASM b/SHELL/Procedures/Print.ASM index 4b472db..100ca94 100644 --- a/SHELL/Procedures/Print.ASM +++ b/SHELL/Procedures/Print.ASM @@ -19,7 +19,7 @@ print_err_message: ;A850D: invalid_param: ld de,MAIN_MSG.INVALID ; индекс "Invalid parametr" - jr MESSAGE + jr ECHO_MESSAGE @@ -27,7 +27,7 @@ invalid_param: ; Вывод сообщения ошибки по индексу ; вход: de=индекс строки ;------------------------------------------------- -MESSAGE: +ECHO_MESSAGE: call FMESAGE ; найти строку по индексу jp PRINTZ ; формат. вывод строки ;jp A82CC ; узнать и уст. полож. курсора