--- /dev/null
+bin = bootsplash.bin
+img = bootsplash.img
+
+$(img): $(bin)
+ dd if=/dev/zero of=$@ bs=512 count=2880
+ dd if=$< of=$@ bs=512 conv=notrunc
+
+$(bin): bootsplash.asm
+ nasm -f bin -o $@ $<
+
+.PHONY: run
+run: $(img)
+ qemu-system-i386 -fda $<
+
+.PHONY: debug
+debug: $(img)
+ qemu-system-i386 -S -s -fda $<
--- /dev/null
+ org 7c00h
+ bits 16
+
+stacktop equ 7b00h
+boot_driveno equ 7b00h ; 1 byte
+stage2_size equ stage2_end - stage2_start
+
+start:
+ xor ax, ax
+ mov ds, ax
+ mov es, ax
+ mov ss, ax
+ mov gs, ax
+ mov fs, ax
+
+ mov sp, stacktop
+ mov [boot_driveno], dl
+
+ ; load the rest of the code at 7e00
+ xor ax, ax
+ mov es, ax
+ mov bx, stage2_start
+ mov ah, 2 ; read sectors LBA call
+ mov al, (stage2_size + 511) / 512 ; num sectors
+ mov cx, 2 ; ch: cylinder, cl: sector
+ xor dx, dx ; dh: head
+ mov dl, [boot_driveno]
+ int 13h
+ jnc stage2_start ; loaded successfully, jump to it
+
+ ; failed to load second sector
+ mov ax, str_load_fail
+ call printstr
+.hang: cli
+ hlt
+ jmp .hang
+
+ ; expects string ptr in ax
+printstr:
+ mov bx, ax
+.loop: mov al, [bx]
+ inc bx
+ test al, al
+ jz .done
+ mov ah, 0eh
+ mov bx, 7
+ int 10h
+ jmp .loop
+.done: ret
+
+str_load_fail db "Failed to load second stage!",0
+str_foo db "Loaded 2nd stage boot loader",0
+
+
+ times 510-($-$$) db 0
+ dw 0xaa55
+
+ ; start of the second stage
+stage2_start:
+ mov ax, 13h
+ int 10h
+
+ mov ax, 0a000h
+ mov es, ax
+ xor di, di
+ mov cx, 32000
+ mov ax, 0505h
+ rep stosw
+
+ call waitkey
+
+ mov ax, 3
+ int 10h
+
+ xor ax, ax
+ mov es, ax
+
+ mov ax, str_foo
+ call printstr
+
+.hang: cli
+ hlt
+ jmp .hang
+
+waitkey:
+ in al, 64h
+ test al, 1
+ jz waitkey
+ in al, 60h
+ ret
+
+stage2_end:
+
+; vi:set ft=nasm: