📄 boot.asm
字号:
%TITLE "instinct - bootloader 0.0.3"
; Robert Lee <robert.lee@lostcommunity.org>
; Tuesday, July 04, 2000
; Created file as experimental bootloader
; Thursday, January 04, 2001
; Support for second-stage bootloader
; Sunday, October 13, 2002
; Rewrote for IDEAL mode and style
;
; Simeon Maxein <smaxein@freenet.de>
; ? Sunday, October 13, 2002
; Support for FAT12
IDEAL
MODEL SMALL, C
STACK
JUMPS
LOCALS @@
CODESEG
P386N
start:
JMP main
NOP
bOSOEMName DB 'iosx 0.0'
wByPSector DW 512
bSecPClust DB 1
wRsvdSects DW 1 ; Boot Sect
bFATTables DB 2
wRootEntrs DW 224
wSmSectors DW 2880 ; All
bMediaTypw DB 240 ; 1.44MB Floppy
wFATSector DW 9
wSectsPTrk DW 18
wDrivHeads DW 2
dHidnSects DD 0
dLgSectors DD 0
bDrivNumbr DB 0 ; A:
bNTDrtyFlg DB 0
bExBPBSign DB 29h ; Extended
dDskSerial DD 0 ; Blank
bDiskLabel DB ' '
bDskFilSys DB 'FAT12 '
bFilename DB 'CORE SYS'
main:
DB 0EAh
DW OFFSET L01, 7C0h
L01:
MOV AX, CS
MOV DS, AX
MOV ES, AX
MOV [bDrivNumbr], DL
CALL readSects, 01d, 09d, 2000h ; FAT
JC Fail
CALL readSects, 19d, 14d, 2500h ; Root Dir
JC Fail
CALL findFile, OFFSET bFilename, 2500h
JC Fail
CALL chainLoad, AX, 0050h ; core.sys
JC Fail
DB 0EAh
DW 0000h, 0050h
Fail:
MOV AL, 'E'
MOV BX, 0007h
MOV AH, 0Eh
INT 10h
JMP $
PROC getCHS NEAR @@address:WORD
MOV AX, [@@address]
XOR DX, DX
DIV [wSectsPTrk]
INC DX
MOV [bSECT], DL
XOR DX, DX
DIV [wDrivHeads]
MOV [bCYL], AL
MOV [bHEAD], DL
RET
ENDP getCHS
PROC readSects NEAR @@SectStart:WORD, @@SectCount:WORD, @@LoadSeg:WORD
LOCAL @@Attempt:BYTE
PUSH ES
MOV [@@Attempt], 03h
@@sectLoop:
CMP [@@SectCount], 0000h
JE @@success
CALL getCHS, [@@SectStart]
MOV AX, [@@LoadSeg]
MOV ES, AX
XOR BX, BX
MOV CH, [bCYL]
MOV CL, [bSECT]
MOV DH, [bHEAD]
MOV DL, [bDrivNumbr]
MOV AL, 01h
MOV AH, 02h
INT 13h
JNC @@L01
DEC [@@Attempt]
CMP [@@Attempt], 0
JE @@failure
CALL resetDisk
JMP @@sectLoop
@@L01:
ADD [@@LoadSeg], 20h
INC [@@SectStart]
DEC [@@SectCount]
JMP @@sectLoop
@@success:
POP ES
CLC
RET
@@failure:
POP ES
STC
RET
ENDP readSects
PROC resetDisk NEAR
MOV DL, [bDrivNumbr]
MOV AH, 0
INT 13h
JC @@failure
@@success:
CLC
RET
@@failure:
STC
RET
ENDP resetDisk
PROC chainLoad NEAR @@Cluster:WORD, @@StartSeg:WORD
PUSH ES
MOV AX, [@@Cluster]
@@chlstart:
ADD AX, 31d
CALL readSects, AX, 0001h, [@@StartSeg]
JC @@failure
ADD [@@StartSeg], 20h
MOV AX, 2000h ; FAT
MOV ES, AX
MOV SI, [@@Cluster]
SHL SI, 01d ; si=si*2
ADD SI, [@@Cluster] ; si=si+cluster (si=si*3)
SHR SI, 01d ; si=si/2 (si=si*1.5)
MOV AX, [ES:SI]
JNC @@L01
SHR AX, 04d
JMP @@L02
@@L01:
AND AX, 0FFFh
@@L02:
CMP AX, 0FF8h
JAE @@success
MOV [@@Cluster], AX
JMP @@chlstart
@@success:
POP ES
CLC
RET
@@failure:
POP ES
STC
RET
ENDP chainLoad
PROC findFile NEAR @@FilePointer:WORD, @@StartSeg
PUSH ES
MOV AX, [@@StartSeg]
MOV ES, AX
XOR DX, DX
@@ffloop1:
MOV SI, [@@FilePointer]
MOV DI, DX
MOV CX, 11
CLD
REPE CMPSB
JE @@getCluster
ADD DX, 32d
CMP DX, 1C00h
JAE @@failure
JMP @@ffloop1
@@getcluster:
ADD DX, 26d
MOV DI, DX
MOV AX, [ES:DI]
@@success:
POP ES
CLC
RET
@@failure:
POP ES
STC
RET
ENDP findFile
ORG 510d
wSysDskSgn DW 0AA55h
bCYL DB ?
bHEAD DB ?
bSECT DB ?
END start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -