;[BEGIN] ;//MODULE: DOS_X ;//CREATE: 19-05-1998 AUTHOR: Denis Parinov ;//UPDATE: 24-10-1999 DNS Restore module ;--------------------------------------------------------------- ;Rev Date Name Description ;--------------------------------------------------------------- ;R13 06-04-2023 BAO Функцию SETBOOT можно вызвать только раз (если завершится корректно) ;R12 03-04-2023 BAO Добавлена функция рескана драйвов LD C,8 : RST #10 ;R11 15-04-2003 DNS ROUTINE FOR STORE CURDISK AND CURDIR ;!FIXIT работает криво ;R10 03-04-2003 DNS IMPROVED FN. VERSION ;R09 27-03-2003 DNS PASTED SET/GET BOOT FN. ;R08 14-11-2002 DNS IMPROVE BPB-FUNCTION ;R07 17-12-1999 DNS BUG FIX SIGNATURE #55AA AT 510 OFFSET ;R06 21-11-1999 DNS FN. DISKINF SUPPORT ALL DISKS ;R05 21-11-1999 DNS BUG FIX SIGNATURE #55AA IN BOOT SECTOR ;R04 08-11-1999 DNS KILL OLD FUNCTIONS ;R03 23-11-1998 DNS BUG FIX (IX+28) -> (IY+28) ;R02 21-11-1998 DNS CHANGE FUNCTION "MAKE FAT" ;R01 20-11-1998 DNS REPAIR FUNCTION "SAVE" ;--------------------------------------------------------------- ; RGADR EQU #89 ;VIDEO CONTROL REGISTER ; SLOT0 EQU #82 ;WIN #0000-#3FFF ; SLOT1 EQU #A2 ;WIN #4000-#7FFF ; SLOT2 EQU #C2 ;WIN #8000-#BFFF ; SLOT3 EQU #E2 ;WIN #C000-#FFFF ; SYSPAGE EQU #FE ;Commands for restart #10 //NOPS: LD A,DSS_Error.sys.INVALID_FUNCTION // SCF // RET VERSION: LD DE,VERS*256+MODF XOR A LD H,A ;!TODO пихать сюда OSINFO LD L,A LD BC,BUILD RET //;R10 //OSINFO: //OSINFO_SIG: DB "OSINFOSTRUCTURE",0 ;R09 BOOTDRV: DB #FF BOOTDSK: INC B DEC B JR Z,GETBOOT DEC B .chg: JR Z,SETBOOT ;R13 меняется на JR С,SETBOOT после первого удачного исполнения SETBOOT LD A,DSS_Error.sys.INVALID_FUNCTION SCF RET ;GET BOOT DISK GETBOOT LD A,(BOOTDRV) AND A RET ;SET BOOT DISK SETBOOT: LD B,A LD C,0 .loop: PUSH BC LD A,C LD DE,#55AA LD BC,256*0 + Dss.DRV.GenIOCTL RST ToDSS.DRV POP BC JR C,.NoSupport EX AF,AF' ;PHISICAL DRIVE NUMBER CP B JR NZ,.NoSupport ;R13 LD A,#38 ; opcode for JR C,addr LD (BOOTDSK.chg),A ;R13 LD A,C LD (BOOTDRV),A AND A RET .NoSupport: INC C LD A,(LDRIVE) CP C JR NZ,.loop SCF RET ;R09 ;!!!!! Дубль - CHNDISK = OPENDSK /* CHNDISK: PUSH AF LD C,Dss.DRV.Open RST ToDSS.DRV POP BC JP C,NDISK11 LD A,B LD (FatBuffer.DRIVE),A CALL RD_BPB RET C LD A,(LDRIVE) AND A RET NDISK11: CP DSS_Error.sys.INVALID_DRIVE SCF RET Z LD A,DSS_Error.sys.NOT_READY RET */ CURRDSK: LD A,(FatBuffer.DRIVE) AND A RET DISKINF: INC A JR Z,CURRDS ;R06 DEC A ;R06 CALL CHNDISK ;R06 RET C ;R06 CURRDS: LD HL,2 LD BC,0 FRESP: PUSH BC CALL R_F_FAT POP BC CP DSS_Error.sys.DISK_FULL JR Z,FRESP2 LD A,E OR D JR NZ,SKIC INC BC SKIC: INC HL JP FRESP FRESP2: LD D,B LD E,C LD HL,(MAX_CLU) DEC HL LD BC,(BootSector.B_P_S) LD A,(BootSector.S_P_C) AND A RET LDRIVE: DB #02 TDRIVE: DB #00 TCLUST: DW #0000 TCOUNT: DW #0000 ;R04SIZE2CL LD DE,(B_P_C) ;R04 XOR A ;R04 SCF ;R04S2C01 RR D ;R04 RR E ;R04 JR C,S2C02 ;R04 RR H ;R04 RR L ;R04 RR B ;R04 RR C ;R04 JP NC,S2C01 ;R04 LD A,1 ;R04 JP S2C01 ;R04S2C02 OR A ;R04 RET Z ;R04 INC BC ;R04 RET ;R04L_SEC_X DW 0 ;R04H_SEC_X DW 0 ; !FIXIT чёт не используется TESTDSK LD A,(FatBuffer.DRIVE) LD C,Dss.DRV.MediaCheck RST ToDSS.DRV OR A RET Z RD_BPB: LD C,SLOT3 IN B,(C) PUSH BC IN A,(SLOT0) OUT (SLOT3),A ;R08 ;LD DE,BOOT+#C000 LD DE,SECBUF+#C000 ;R08 LD A,(FatBuffer.DRIVE) ;вызов RD_BPB может в дальнейшем понадобиться, пускай она сама достаёт переменную DRIVE LD C,Dss.DRV.GetBPB RST ToDSS.DRV POP BC OUT (C),B JP C,RDERR1 PUSH IY LD DE,#AA55 ;R05 ;R08 LD HL,(BOOT+510) ;R07 LD HL,(SECBUF+510) ;R08 AND A ;R05 SBC HL,DE ;R05 JP NZ,ERR_BPB ;R05 ;R08 LD HL,SECBUF ;R08 LD DE,BootSector ;R08 LD BC,_sBOOT_SEC ;R08 size LDIR ;R08 LD IY,BootSector LD A,(IY+_sBOOT_SEC.ID_FORM) CP #F0 JP C,ERR_BPB ;!TEST ;LD HL,0 ; calc. first sector FAT ;LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec ;LD D,(IY+_sBOOT_SEC.RESERVE+1) ;ADD HL,DE LD L,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec LD H,(IY+_sBOOT_SEC.RESERVE+1) ; ; LD E,(IY+#1C) ;Hidden sec ; LD D,(IY+#1D) ; ADD HL,DE ; LD (FatBuffer.FAT_FRM),HL ; first sector FAT LD (FatBuffer.FAT1_XX),HL ; first sector FAT #1 LD (FatBuffer.FAT2_XX),HL LD E,(IY+_sBOOT_SEC.S_P_F) ; sectors in FAT LD D,(IY+_sBOOT_SEC.S_P_F+1) LD A,(BootSector.FAT_NUM) ; amount FATs CP 1 JR Z,C_DATA1 DEC A ADD HL,DE LD (FatBuffer.FAT2_XX),HL C_DATA1 ADD HL,DE DEC A JR NZ,C_DATA1 LD (FatBuffer.DIR_FRM),HL ; first sector DIR LD C,(IY+#0B) ; Size sectors LD B,(IY+#0C) RL C RL B RL C RL B RL C RL B LD C,B LD B,0 ; BC - File handels in sectors LD A,C LD (FatBuffer.F_P_S),A LD E,(IY+_sBOOT_SEC.F_P_DIR) ; Number file handel LD D,(IY+_sBOOT_SEC.F_P_DIR+1) EX DE,HL DEC HL XOR A NEXTAD2 INC A JP Z,ERR_BPB SBC HL,BC JR NC,NEXTAD2 EX DE,HL LD C,A ; A - sectors in DIR LD B,0 LD (FatBuffer.DIR_S_S),A ADD HL,BC ; Start DATA area LD (FatBuffer.DAT_FRM),HL ;LD HL,0 LD H,B ; тут в B ноль должен быть LD L,B LD C,(IY+#0B) ; Size sector LD B,(IY+#0C) LD A,(BootSector.S_P_C) NEXTAD3 ADD HL,BC ; calc. cluster size DEC A JR NZ,NEXTAD3 LD (FatBuffer.CLU_LEN),HL EX DE,HL LD HL,#3FFF XOR A NEXTAD4 INC A JP Z,ERR_BPB SBC HL,DE JR NC,NEXTAD4 LD (FatBuffer.C_P_B),A ; A - Clusters per bank (16k) LD HL,BootSector.ID_FAT LD DE,FatBuffer.MSG 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' JP NZ,ERR_BPB LD A,(HL) CP '6' ; FAT16 LD HL,#FFFF JR Z,BPB_FAT CP '2' ; FAT12 JP NZ,ERR_BPB LD HL,#0FFF BPB_FAT: LD (FatBuffer.FAT_TYP),A LD (FatBuffer.ENDCLUS),HL LD HL,0 LD C,(IY+_sBOOT_SEC.S_P_T) ; Sector per track LD B,(IY+_sBOOT_SEC.S_P_T+1) LD A,(BootSector.HEADS) BPB_L1: ; calc. sector per cylinder ADD HL,BC DEC A JR NZ,BPB_L1 LD (FatBuffer.S_X_H),HL LD DE,(FatBuffer.DAT_FRM) ; LD E,(IY+#1C) ;Hidden sec ; LD D,(IY+#1D) ; AND A ; SBC HL,DE ; EX DE,HL LD L,(IY+_sBOOT_SEC.S_P_D) LD H,(IY+_sBOOT_SEC.S_P_D+1) LD A,H OR L JP NZ,HDDSMAL LD L,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS) LD H,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+1) LD C,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+2) LD B,(IY+_sBOOT_SEC.BPB_BIG_TOTAL_SECTORS+3) AND A SBC HL,DE JP NC,HDDBIG DEC BC JP HDDBIG HDDSMAL: ;AND A ;тут CF полюбас сброшен должен быть SBC HL,DE LD BC,0 HDDBIG LD A,(BootSector.S_P_C) SCF S4C01 RRA JR C,S4C02 RR B RR C RR H RR L JP S4C01 S4C02 INC HL LD (MAX_CLU),HL POP IY ; LD DE,FAT ; LD HL,0 ; LD IX,(FAT_FRM) ; LD B,3 ; LD A,(DRIVE) ; LD C,Dss.DRV.Read ; RST ToDSS.DRV ; JP C,RDERR1 LD HL,0 LD (FATCASH),HL SET_PAGE_X FATPAGE PUSH AF XOR A CALL RE_FAT POP AF OUT (SLOT3),A CALL R_CLUST XOR A RET IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) CP #F0 JR C,ERR_BPB ;????? надо ли изменить? // OR 2 // CP #FA ; ID ram-диска CP #F8 ; а если не F8? ;????? LD A,'6' LD HL,#FFFF JP Z,BPB_FAT LD A,'2' LD HL,#0FFF JP BPB_FAT ERR_BPB: POP IY LD A,DSS_Error.sys.UNKNOWN_FORMAT SCF RET RDERR1: LD A,DSS_Error.sys.NOT_READY ;SCF RET ; FatBuffer: .MSG: DB 'FAT' .READ_PG: DB #00 .BLOCK: DB #00 .DIR_CLU: DW #0000 .DRIVE: DB #FF .FAT_FRM: .FAT1_XX: DW #0000 ; MSD_FAT_SEC first sector FAT .FAT2_XX: DW #0000 .DIR_FRH: DW #0000 ; MSD_CAT_SEC first sector DIR .DIR_FRL: .DIR_FRM: DW #0000 ; MSD_CAT_SEC first sector DIR .F_P_S: DB #00 ; число файловых записей в секторе .DIR_S_S: DB #00 ; DIR_SEC_SIZE .DAT_FRM: DW #0000 ; MSD_DAT_SEC .CLU_LEN: .B_P_C: DW #0000 ; CLUSTER_LEN .C_P_B: DB #00 ; A - Clusters per bank (16k) (число кластеров на блок ОЗУ) ; ????? это используется? .FAT_TYP: DB #00 ; TYPE FAT (#32 - 12bit, #36 - 16bit) .S_X_H: DW #0000 ; количество секторов на цилиндре ; ????? это используется? .ENDCLUS: DW #FFFF ; ; DIRSPEC: DB '\' ;BLOCK DIRSPEC.DEPTH,0 ;????? Было 255, у Саймана 256 BLOCK DIRSPEC.DEPTH-1,0 ;????? Было 255, у Саймана 256 ; ;R11 ; !TODO починить SAVE_CUR_PATH PUSH IX PUSH IY PUSH HL PUSH DE PUSH BC PUSH AF SET_PAGE_X ENVPAGE PUSH AF CALL CURRDSK ADD A,"A" LD HL,TMP_CURDIR LD (HL),A INC HL LD A,":" LD (HL),A INC HL CALL CURRDIR ; почему не POP AF : OUT (SLOT3),A //POP BC //LD A,B //OUT (SLOT3),A POP AF OUT (SLOT3),A ; ; POP AF POP BC POP DE POP HL POP IY POP IX RET ; !TODO починить BACK_CUR_PATH: PUSH IY PUSH IX PUSH HL PUSH DE PUSH BC PUSH AF SET_PAGE_X ENVPAGE PUSH AF LD HL,TMP_CURDIR CALL CHDIR ; почему не POP AF : OUT (SLOT3),A //POP BC //LD A,B //OUT (SLOT3),A POP AF OUT (SLOT3),A ; POP AF POP BC POP DE POP HL POP IX POP IY RET ;R11 ;R12 SCANDRV: ;!TEST в DRV-MAIN могут быть проблемы с прерываниями ;DI LD A,Dss.DRV.RescanDRV LD C,Dss.DRV.RescanDRV RST ToDSS.DRV LD (LDRIVE),A ;EI ; RET ;R12 ;GOD EQU 1999-1980*512 ;FHAND DB " " ; DB " " ; DB #20 ; DW 0,0,0,0,0 ; DW #0000 ; DW 5*32+19+GOD ;SAVEC DW #0000 ;SIZEC DW #0000,#0000 ;============================================= ;//MODULE: DOS_X ;[END]