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