git @ Cat's Eye Technologies BefOS / master src / boot / beboot.s
master

Tree @master (Download .tar.gz)

beboot.s @masterraw · history · blame

; Boot Block for BefOS.

; Boot Block is one sector (= 512 bytes.)
; Program must be =< 510 bytes in length.
; Byte 511 must be 55h and byte 512 must be aah.

; Boot Block loads at 0000:7C00.
; In turn, it loads KERNEL_SIZE sectors
; off the disk starting at sector KERNEL_POS
; into memory at BEFOS_SEG:BEFOS_OFF.


;--- BEGIN ---------------------------------------------------;

BITS	16
ORG	7C00h

;--- INCLUDES -----------------------------------------------;

%include "../inc/befos.inc"

;--- CONSTANTS -----------------------------------------------;

INT13_READCODE	EQU	02h

KERNEL_SIZE	EQU	16	; * 512 = 8K = 4 BefOS Pages (2K ea)
KERNEL_POS	EQU	4	; start sector

SEC_TRACK	EQU	18	; sectors per track (on a floppy)
NUM_HEADS	EQU	2	; number of heads (on a floppy)

KERNEL_SEC	EQU	(KERNEL_POS % SEC_TRACK) + 1
KERNEL_CYL	EQU	(KERNEL_POS / SEC_TRACK) / NUM_HEADS
KERNEL_HEAD	EQU	(KERNEL_POS / SEC_TRACK) % NUM_HEADS
KERNEL_DRIVE	EQU	0

KERNEL_AX	EQU	KERNEL_SIZE + (INT13_READCODE * 256)
KERNEL_CX	EQU	KERNEL_SEC + (KERNEL_CYL * 256)
KERNEL_DX	EQU	KERNEL_DRIVE + (KERNEL_HEAD * 256)

;--- CODE ----------------------------------------------------;

SEGMENT	.text

;--- Main ----------------------------------------------------;

Main:	mov	ax, cs		; find DATA segment
        mov	ds, ax		; assign to ds register

        mov	ax, 0b800h	; ASSUMES COLOR VGA 80x25 TEXT
        mov	es, ax
	mov	di, 0
	mov	[es:di], word 02f42h	; the BefOS 'logo'

;--- Load ----------------------------------------------------;

; the following should be tried three times!

	mov	di, 4

Reset:	dec	di
	jz	NoGood
	mov	ah, 00h		; call code = reset
	mov	dl, 00h		; drive
	int	13h

Load:	mov	ax, BEFOS_SEG	; dest segment
	mov	es, ax
	mov	bx, BEFOS_OFF	; dest offset

	mov	cx, KERNEL_CX
	mov	dx, KERNEL_DX

	mov	ax, KERNEL_AX
	int	13h
	jc	Reset

        mov	ax, 0b800h	; ASSUMES COLOR VGA 80x25 TEXT
        mov	es, ax
	mov	di, 0
	mov	[es:di], word 00f24h	; '$'

	jmp	BEFOS_SEG:BEFOS_OFF

NoGood:	mov	ah, 0ah
	mov	al, 'X'
	mov	bh, 0
	mov	bl, 1
	int	10h
	jmp	NoGood

;--- DATA ----------------------------------------------------;

SEGMENT	.data

; nothing here now