📄 boot.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Project : FDOS 0.0.7
;; Author : Stefan Tappertzhofen (tappertzhofen@t-online.de)
;; Webpage : http://www.visual-opal.de
;; Date : 2. September 2003
;; Info : Bootsector
;; Filename : boot.asm
;; Compile Syntax : nasm boot.asm -f bin -o boot.bin
;; copyboot boot.bin 0
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0
JMP Begin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Bootblock
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OSEOMName DB 'fdos 0.1' ; System Name
BytesPerSector DW 512 ; Bytes pro Sektor
SectorsPerCluster DB 1 ; Sektoren pro Cluster
ReservedSectors DW 1 ; Dieser Sektor
FATTables DB 2 ; Anzahl der FAT Tabellen
RootEntries DW 224 ; Eintr鋑e im Hauptverzeichniss
CountSectors DW 2880 ; Anzahl der Sektoren auf der Disk
DiskMediaType DB 240 ; Diskettentyp (1,44 MB)
FATTableSize DW 9 ; Anzahl der Sektoren pro FAT
SectorsPerTrack DW 18 ; Anzahl der Sektoren pro Spur
DriveHeads DW 2 ; Anzahl der K鰌fe
HiddenSectors DD 0 ; Versteckte Sektoren
LGSectors DD 0 ; ?
DriveNumber DB 0 ; Laufwerk A:
NTDrtyFlg DB 0 ; ?
ExBPSign DB 29h ; ?
SerialNumber DD 0 ; Seriennummer
DiskLabel DB 'FDOS System' ; Datentr鋑erbezeichnung
FileSystem DB 'FAT12 ' ; Dateisystem
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Starte Bootprozedur
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DataSector DW 0
Begin:
CLI ; In die Speicherstelle 0000:7C00
; schreiben
MOV AX, 0x7C0 ; und Register vorbereiten
MOV DS, AX
MOV ES, AX
MOV FS, AX
MOV GS, AX
MOV [DriveNumber], DL ; Bootlaufwerk ermitteln aus DL
XOR AX, AX ; AX = 0
MOV SS, AX ; Stack erstellen
MOV SP, 0xFFFF
STI
MOV SI, MSG_Welcome
CALL WriteString
XOR CX, CX ; Errechne die L鋘ge des
; Hauptverzeichnisses
XOR DX, DX
MOV AX, 32 ; Ein Eintrag hat 32 Bytes
MUL WORD [RootEntries] ; Maximale Gr鲞e des Root
DIV WORD [BytesPerSector] ; Anzahl der zu ladenen Sektoren
; errechnen
XCHG AX, CX ; AX = CX; CX = AX(alt)
MOV AL, BYTE [FATTables] ; Errechne die Position des Roots
; und schreibe es in AX
MUL WORD [FATTableSize] ; Gr鲞e der FAT
ADD AX, WORD [ReservedSectors] ; f黵 den Bootsector (?)
MOV WORD [DataSector], AX ; Rootverzeichnis
ADD WORD [DataSector], CX
MOV BX, 0x0200 ; Lade das ROOT DIR nach 0x020
CALL ReadSectors
MOV CX, WORD [RootEntries] ; Suche nach der Datei
MOV DI, 0x0200 ; Suche von Anfang an
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Suche die Datei
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.LOOP:
PUSH CX
MOV CX, 11 ; 11 Zeichen pro Dateiname
MOV SI, ImageName ; Zu suchende Datei
PUSH DI
REP CMPSB ; Vergleiche Dateinamen <> RootDIR
POP DI
JE SHORT LOAD_FAT ; Dateigefunden?
POP CX
ADD DI, 32 ; N鋍hster Eintrag
LOOP .LOOP ; Schleife
JMP SHORT FAILURE
LOAD_FAT:
MOV DX, WORD [DI+0x001A] ;
MOV WORD [Cluster], DX ; Erster Cluster der Datei
XOR AX, AX ; Errechne die Gr鲞e von FAT
; und schreibe es in CX
MOV AL, BYTE [FATTables] ; Anzahl der FATs
MUL WORD [FATTableSize] ; Gebrauchte Sektoren
MOV CX, AX
MOV AX, WORD [ReservedSectors] ; Bootsektor
MOV BX, 0x0200
CALL ReadSectors
MOV AX, 0x0050
MOV ES, AX ; Quelle f黵 das Image
XOR BX, BX
PUSH BX
LOAD_IMAGE:
MOV AX, WORD [Cluster] ; Zu ladener Cluster
POP BX
CALL ClusterLBA ; Cluster in LBA
XOR CX, CX
MOV CL, BYTE [SectorsPerCluster] ; Anzahl d. zu ladenen Sektoren
CALL ReadSectors
PUSH BX
MOV AX, WORD [Cluster] ; ermittle aktuellen Cluster
MOV CX, AX ; kopieren
MOV DX, AX ; kopieren
SHR DX, 0x0001 ; durch 2 teilen
ADD CX, DX ; (3/2)
MOV BX, 0x0200 ; FAT im Speicher
ADD BX, CX ; Index in der FAT
MOV DX, WORD [BX] ; Lese 2 Bytes der FAT
TEST AX, 0x0001
JNZ .ODD_CLUSTER
.EVEN_CLUSTER:
AND DX, 0000111111111111b ; 12 Low Bits
JMP .DONE
.ODD_CLUSTER:
SHR DX, 4 ; 12 High Bits
.DONE:
MOV WORD [Cluster], DX
CMP DX, 0x0FF0 ; Ende des Files?
JB LOAD_IMAGE
DONE:
PUSH WORD 0x0050
PUSH WORD 0x0000
RETF
FAILURE:
MOV AH, 0 ; Warte auf Tastendruck
INT 16h
INT 19h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Sektor 鰂fnen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ReadSectors:
.MAIN
MOV DI, 0x0005 ; 5 Versuche vor einem Fehler
.SECTORLOOP
PUSH AX
PUSH BX
PUSH CX
CALL LBACHS
MOV AH, 2 ; Sektor lesen
MOV AL, 1 ; 1 Sektor
MOV CH, BYTE [absoluteTrack] ; Spur
MOV CL, BYTE [absoluteSector] ; Sektor
MOV DH, BYTE [absoluteHead] ; Kopf
MOV DL, BYTE [DriveNumber] ; Laufwerk
INT 13h
JNC .SUCCESS
XOR AX, AX ; AH = 0; Disk Reset
INT 13h
DEC DI
POP CX
POP BX
POP AX
JNZ .SECTORLOOP ; weiterer Versuch
INT 18h
.SUCCESS
POP CX
POP BX
POP AX
ADD BX, WORD [BytesPerSector]
INC AX
LOOP .MAIN
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ClusterLBA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ClusterLBA:
SUB AX, 2 ; 0-basierte Sektornummer
XOR CX, CX
MOV CL, BYTE [SectorsPerCluster] ; BYTE > WORD
MUL CX
ADD AX, WORD [DataSector]
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; LBACHS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LBACHS:
XOR DX, DX ; DX, AX vorbereiten
DIV WORD [SectorsPerTrack] ; rechne...
INC DL ; f黵 Sektor 0
MOV BYTE [absoluteSector], dl
XOR DX, DX ; DX, AX vorbereiten
DIV WORD [DriveHeads] ; rechne...
MOV BYTE [absoluteHead], DL
MOV BYTE [absoluteTrack], al
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; WriteString
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WriteString:
PUSHA ; Register sichern
.WLoop:
LODSB ; SI nach AL und SI + 1
OR AL, AL ; AL = 0?
JZ SHORT .DONE ; Wenn ja dann Sprung
MOV AH, 0x0E ; Bildschirmausgabe
MOV BH, 0
MOV BL, 7
INT 10h ; mit Int 10h
JMP SHORT .WLoop ; Neuer Durchlauf
.DONE:
POPA ; Alle Register zur點k
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Sonstige Daten
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
absoluteSector DB 0x00
absoluteHead DB 0x00
absoluteTrack DB 0x00
Cluster DW 0x0000
ImageName DB 'FDOS SYS'
MSG_Welcome DB 'FDOS boot',13,10,
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 512 Byte Code und Bootsignatur
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIMES 510-($-$$) DB 0
DW 0xAA55
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -