⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boot.asm

📁 FDOS Operating System
💻 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 + -