;--------------------------------------------------------------- ;Rev Date Name Decription ;--------------------------------------------------------------- ;R04 25-03-2023 BAO ; !FIXIT ;R03 23-01-2000 DNS OPTIMIZE NEW BOOTING PROCEDURE ;R02 08-01-2000 DNS NEW BOOTING PROCEDURE ;R01 25-05-1998 DNS Console printing ;R00 09-11-1998 DNS Color printing start message ; Install CGA palette ; +------------------------------+ ; + System Bootstrap + ; + Initial revision 09 Nov 1998 + ; +------------------------------+ DEFINE ORIGINAL_DSS 0 DEFINE UNIVERSAL_BOOT 1 DISP #8000 OUTPUT 'build/DSSloader.bin' ADRIVE EQU #00 CDRIVE EQU #02 DRIVE: _mSYSID DI LD (DRIVE),A LD C,BIOS.EXT_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,#0215 ; если версия ниже 2.21, то ошибка SBC HL,DE LD A,INCORR JR C,FAIL GOOD_DRIVE: LD DE,#8200 LD HL,0 LD IX,2 LD BC,2*256 + BIOS.DRV_READ LD A,(DRIVE) RST ToBIOS_18 JR C,NULL JP CONTINU FAIL CALL MESSAGE NULL LD A,FAILURE CALL MESSAGE DI HALT JR $ 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 JR PRINTZ ;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 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 ; 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 DB 0 DB 13,10 DB "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 DB 0 DB "Invalid partition table.",13,10 DB 0 DB "Invalid BOOT sector.",13,10 DB 0 DB "Can't open file SYSTEM.DOS ...",13,10 DB 0 DB "Can't open file SYSTEM.EXE ...",13,10 DB 0 DB 13,10,"Starting DSS... ",13,10,13,10 DB 0 MSGE DB 0 CONTINU 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 LD A,(DRIVE) LD C,#00 RST #10 jp c,XFAIL LD A,STARTDO CALL DOSMESS LD A,(DRIVE) LD B,1 LD C,Dss.BootDSK RST #10 LD B,0 ELSE IF ORIGINAL_DSS LD C,#00 RST #10 ELSE LD A,(DRIVE) LD C,#00 RST #10 jp c,XFAIL ENDIF LD A,STARTDO CALL DOSMESS IF ORIGINAL_DSS LD A,(DRIVE) LD B,1 LD C,Dss.BootDSK RST #10 LD B,0 ENDIF ENDIF LD C,Dss.BootDSK RST #10 ADD A,"A" LD HL,ROOT LD (HL),A LD C,Dss.ChDir RST #10 LD HL,PSHELL LD BC,Dss.Exec RST #10 LD A,NOSHELL JP XFAIL PSHELL: DB '\SYSTEM.EXE /P',0 ROOT: DB 'X:\',0 DOSMESS CALL FMESAGE LD C,Dss.PChars RST #10 RET XFAIL CALL DOSMESS 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 DOSAGA LD A,(IX+4) CP #0E JR Z,YEPDOS CP 6 JR Z,YEPDOS CP 4 JR Z,YEPDOS CP 1 JR Z,YEPDOS LD DE,#10 ; ошибка в оригинале ; ADD IY,DE ADD IX,DE DJNZ DOSAGA ERRP LD A,ERRPART JP FAIL YEPDOS 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 DE,BOOT LD BC,1*256 + BIOS.DRV_READ LD A,(DRIVE) RST ToBIOS_18 POP BC LD A,C RET SET_PRM PUSH BC LD A,B LD C,BIOS.DRV_GET_PAR RST ToBIOS_18 LD A,(BOOT.S_P_T) 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 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_SEC.ID_FORM) CP #F0 RET C LD HL,0 ;calc. first sector FAT LD (DIR_FRH),HL LD E,(IY+_sBOOT_SEC.RESERVE) ;Reserve sec LD D,(IY+_sBOOT_SEC.RESERVE+1) ADD HL,DE LD (FAT_FRM),HL ;first sector FAT LD E,(IY+_sBOOT_SEC.S_P_F) ;sectors in FAT LD D,(IY+_sBOOT_SEC.S_P_F+1) LD A,(BOOT.FAT_NUM) ;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_SEC.F_P_DIR) ;Number file handel LD H,(IY+_sBOOT_SEC.F_P_DIR+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_SEC.B_P_S) ;Size sector LD B,(IY+_sBOOT_SEC.B_P_S+1) LD HL,0 LD A,(BOOT.S_P_C) 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 #20 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 (FATCASH),HL XOR A RET IBMDOS_ LD A,(IY+_sBOOT_SEC.ID_FORM) 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 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 FLOAD LD (READMEM),DE LD_FILE PUSH HL CALL NSECTOR LD DE,(READMEM) LD A,(BOOT.S_P_C) CP #20 JR C,SMCLUS 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 SMCLUS 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.S_P_C) 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 ;----------------- ; 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,(FATCASH) ; 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.B_P_S) 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,(FATCASH) 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 LD E,A RR D RR E RR D RR E RR D RR E RR D RR E 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 (FATCASH),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_SEC = $ ; 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 DIR EQU BOOT+512 FAT EQU DIR+512 VALUE EQU 3*512+FAT FATCASH 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 DISKH EQU VALUE+48 DISKL EQU VALUE+50 READMEM EQU VALUE+52 SHEL_FM EQU VALUE+54 BANKDOS EQU VALUE+55 ; EQU VALUE+56 ;----------------- BLOCK #8600-$-3,0 DB 'SPT' ; BIGA EQU (($/256)+1)*256 ; BIGA2 EQU BIGA-$-2 ; DS BIGA2 ; DB "dp" ; E______ ;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 ;[]-----------------------------------------------------------[]