From 391a1aa7d551047d3230cc2c21352582c28c1d48 Mon Sep 17 00:00:00 2001 From: Ain <41307858+nero@users.noreply.github.com> Date: Tue, 26 Mar 2019 20:46:40 +0000 Subject: [PATCH] vbr: CHS reading seems to work so far --- Makefile | 3 +- boot/vbr.asm | 119 ++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 91 insertions(+), 31 deletions(-) diff --git a/Makefile b/Makefile index b7e6411..ac41d13 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,7 @@ vbr.bin: boot/vbr.asm nasm -s -o $@ -I lib $< fdimage.img: vbr.bin kernel.com - dd if=/dev/zero bs=512 count=720 of=$@ - dd if=vbr.bin bs=512 count=1 conv=notrunc of=$@ + cat vbr.bin kernel.com > $@ clean: rm -f *.com diff --git a/boot/vbr.asm b/boot/vbr.asm index cf77145..45fccba 100644 --- a/boot/vbr.asm +++ b/boot/vbr.asm @@ -29,15 +29,66 @@ bpb: dd 0 ; number of hidden sectors .lrgsectors: dd 0 ; large sector count +.drivenum: + db 0 ; drive number +.winntflags: + db 0 +.signature: + db 0x28 -times (0x3E - ($-$$)) nop +times (0x5A - ($-$$)) nop _startup: - call printgeo + call adjust_bpb + mov ax, 0x0500 + mov es, ax + + mov si, 1 + mov di, 0x7D00 + mov cx, 0x10 + call loadblk + call dump +.end: + hlt + jmp .end + +dump: + mov si, 0x0000 + mov cx, 0x10 +.nextline: + mov ax, si + call print16 + mov al, 0x3A + call printc + mov al, 0x20 + call printc + + push cx + mov cx, 0x0020 +.words: + es lodsb + call print8 + loop .words + pop cx + + mov al, 0x0A + call printc + mov al, 0x0D + call printc + + loop .nextline + + ret + +; Adjust the bdp data from BIOS-supplied data (if) +; No args, no output +adjust_bpb: + push ax + push cx + push dx mov ah, 0x08 - mov dl, 0x00 int 0x13 ; required, QEMU detects 360kB as 1200kB with CHS 80 2 15 - jc .noadjust + jc .end ; skip if function does not exist inc dh mov [bpb.heads], dh mov ax, cx @@ -51,39 +102,49 @@ _startup: mul word [bpb.heads] ; number of tracks = number of cylinders * heads mul word [bpb.spt] ; number of sectors = number of tracks * sectors per track mov [bpb.sectors], ax -.noadjust: - call printgeo .end: - hlt - jmp .end + pop dx + pop cx + pop ax + ret + +; in si sector number, +; dl drive number +; es:0000 buffer +; out al error code, +; carry set if error +loadblk: + push bx + push cx + push dx + xor dx, dx + mov ax, si + div word [bpb.spt] ; ax:temp = (lba / spt) + inc dx ; dx:sector = (lba % spt) + 1 + mov cl, dl ; for int 0x13 + xor dx, dx + div word [bpb.heads] ; ax:cylinder = (tmp / heads) + ; dx:head = (tmp % heads) + mov ch, al ; for int 0x13 + mov ax, dx + pop dx ; drive number comes back into dl + mov dh, al ; for int 0x13 + + mov bx, 0x0000 + mov ax, 0x0201 ; ah=0x02 al=0x01 + int 0x13 -printgeo: - mov ax, [bpb.heads] - call print16 - mov ax, [bpb.spt] - call print16 - mov ax, [bpb.sectors] call print16 + lahf + xchg ah, al + call print8 mov al, 0x0A call printc mov al, 0x0D call printc - ret - -; in bx sector number, -; dl drive number -; ds:di buffer -; out al error code, -; carry set if error -loadblk: - mov ax, bx - div byte [bpb.spt] - call print16 - ; Temp = LBA / (Sectors per Track) - ; Sector = (LBA % (Sectors per Track)) + 1 - ; Head = Temp % (Number of Heads) - ; Cylinder = Temp / (Number of Heads) + pop cx + pop bx ret %include "print.asm"