Estex-DSS/BOOT/DSSBOOT.ASM
2023-07-03 23:04:36 +10:00

756 lines
12 KiB
NASM

;---------------------------------------------------------------
;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
;[]-----------------------------------------------------------[]