bits 16 org 0x7C00 db 0xEB, 0x01 ; two-byte jmp instruction numtoload: db 13 start: mov si, dx mov ax, 0x4000 mov ss, ax mov sp, 0x1000 mov bx, mbr call prints push si mov ax, 0x7E0 mov es, ax xor bx, bx ; esbx = 7E00 = buffer mov ax, 0x0201 ; fn=2=read, nblocks=1 xor cx, cx inc cx ; cyl=0, sec=1 mov dx, si ; restore saved dx xor dh, dh ; hd=0, dl already disc number int 0x13 ; disc read jnc .ok mov bx, rderr call prints .dead: jmp .dead .ok: mov bx, rdok call prints mov cx, 0x4 mov bx, 0x1BE .loop: es: mov dl, [bx] cmp dl, 0x80 je short found add bx, 0x10 loop .loop found: mov cx, 0x10 mov si, bx .loop: es: mov dl, [bx] call print1b mov al, ' ' call printch inc bx loop .loop call newline sub bx, 12 es: mov al, [bx] cmp al, 0xBA je .ok mov bx, notrect call prints .dead: jmp .dead .ok: mov bx, rect call prints savepd: ; save 16 byte partition entry mov bx, ds ; starting at 0x40000 mov ax, es mov ds, ax mov ax, 0x4000 mov es, ax xor di, di mov cx, 0x10 db 0xF3 ; equiv REP for movsb movsb mov ds, bx pop dx xor bx, bx ; change bytes 0 and 4 to drive number es: mov [bx], dl ; now at 40000 have DX then CX ready add bl, 4 ; for a disc read mov si, dx es: mov [bx], dl mov ah, 0x08 int 0x13 ; drive parameters mov bx, 0x10 es: mov [bx], dx inc bx inc bx es: mov [bx], cx ; the 20 bytes starting from 0x40000 are ; DL DH CL CH for disc read for first block of partition ; DL DH CL CH for disc read for last block of partition ; 4 bytes for absolute first block number ; 4 bytes for number of blocks ; DL DH CL CH format for num drives, max head, max cyl, max sect ; ; the DL DH CL CH format is: ; DL = drive number (80 = first real) ; DH = head number ; CL & 0x3F = sector number (never zero) ; ((CL & 0xC0)<<2) + CH = cylinder number mov cx, 0x14 xor bx, bx .loop: es: mov dl, [bx] call print1b mov al, ' ' call printch inc bx loop .loop call newline loados: mov bx, loading call prints xor bx, bx ; esbx back to 40000 es: mov dx, [bx] inc bx inc bx es: mov cx, [bx] mov ax, 0x0050 mov es, ax xor bx, bx ; esbx = 0500 = buffer mov ah, 0x02 ; fn=2=read mov al, [numtoload] inc al int 0x13 ; disc read jnc .ok mov bx, rderr call prints db 0xEB, 0xFE ; equiv to L: JMP L .ok: mov bx, rdok call prints call newline mov ax, 0x0 mov ds, ax jmp 0x0000:0x0700 printch: pusha mov ah, 0x0E mov bx, 0 int 0x10 popa ret newline: push ax mov al, 13 call printch mov al, 10 call printch pop ax ret print2b: pusha mov cx, 4 jmp short printnb print1b: pusha mov cx, 2 mov dh, dl jmp short printnb printnb: rol dx, 4 mov ax, dx and ax, 15 add ax, 48 cmp ax, 57 jle .ok add ax, 7 .ok: mov ah, 0x0E xor bx, bx int 0x10 loop printnb popa ret prints: push ax .loop: mov al, [bx] or al, al je .end call printch inc bx jmp .loop .end: pop ax ret mbr: db "BS " datecode db ", MBR ", 0 rdok: db "OK ", 0 rderr: db "FAIL ", 0 notrect: db "NOT " rect: db "RECTOS ", 0 loading: db "LOADING ", 0 loc 0x7DFE db 0x55, 0xAA