From c88395c12db8509e13c3e1aabed9ba2f810909a3 Mon Sep 17 00:00:00 2001 From: Ain <41307858+nero@users.noreply.github.com> Date: Wed, 27 Mar 2019 22:05:00 +0000 Subject: [PATCH] vbr: work in progress on block reading --- boot/vbr.asm | 184 +++++++++++++++++++++++---------------------------- 1 file changed, 82 insertions(+), 102 deletions(-) diff --git a/boot/vbr.asm b/boot/vbr.asm index 45fccba..6895d15 100644 --- a/boot/vbr.asm +++ b/boot/vbr.asm @@ -1,57 +1,104 @@ org 0x7C00 -bpb: - jmp _startup ; 2 bytes - nop ; 1 byte +fdc: ; FDC Descriptor as per ECMA-107 + jmp _startup + times (0x03 - ($-$$)) nop .oem: - db "OEM " ; OEM -.bps: - dw 0x200 ; bytes per sector -.spc: - db 1 ; sectors per cluster -.rsectors: - dw 2 ; number of reserved sectors -.fats: - db 2 ; number of file allocation tables -.dirents: - dw 2 ; Number of directory entries -.sectors: - dw 720 ; total number of sectors -.mtd: ; media descriptor type + db "2B" ; creating system identifier + times (0x0B - ($-$$)) db " " ; space-padded +.ss: + dw 0x200 ; sector size +.sc: + db 0 ; sectors per cluster +.rsc: + dw 2 ; reserved sector count +.fn: + db 0 ; number of file allocation tables +.rde: + dw 0 ; number of root directory entries +.ts_old: + dw 0 ; legacy: total number of sectors +.mi: ; medium identifier db 0xFD ; 5.25-inch Double sided, 40 tracks per side, 9 sectors per track (360 KB) -.spfat: ; sectors per fat +.sf: ; sectors per fat dw 0 .spt: dw 9 ; sectors per track -.heads: - dw 2 ; number of heads -.hidsecs: - dd 0 ; number of hidden sectors -.lrgsectors: - dd 0 ; large sector count -.drivenum: +.nos: + dw 2 ; number of sides (heads) +.po: + dd 0 ; partition offset (in LBA blocks) +.ts: + dw 720 +.drv: db 0 ; drive number -.winntflags: db 0 -.signature: - db 0x28 - -times (0x5A - ($-$$)) nop + db 0x29 ; efdc signature +.vid: + dd 0 ; volume id +.vlabel: + db "2B" + times (54 - ($-$$)) db " " +.fstype: + db "FAT12" + times (62 - ($-$$)) db " " _startup: - call adjust_bpb + mov [fdc.drv], dl ; backup driver number + mov ah, 0x08 + int 0x13 ; required, QEMU detects 360kB as 1200kB with CHS 80 2 15 + jc .noadjust ; skip if function does not exist + inc dh + mov [fdc.nos], dh + mov ax, cx + and ax, 0x003F + mov [fdc.spt], ax ; no adjustment because sectors are 1-indexed + mov ax, cx + xchg al, ah + mov cl,6 + shr ah,cl + inc ax ; convert from maximum number (0-based) to total number (1-based) of cylinders + mul word [fdc.nos] ; number of tracks = number of cylinders * heads + mul word [fdc.spt] ; number of sectors = number of tracks * sectors per track + mov [fdc.ts], ax +.noadjust: mov ax, 0x0500 mov es, ax - - mov si, 1 - mov di, 0x7D00 - mov cx, 0x10 + mov bx, 0x0000 + mov ax, 1 call loadblk call dump + + mov al, [fdc.sc] + call print8 .end: hlt jmp .end +; Load a cluster from cluster offset +loadcluster: + ret + +; Load a single cluster into memory +; in ax sector number +; es:bx buffer +; out al error code, +; carry set if error +loadblk: + xor dx, dx + div word [fdc.spt] ; ax:temp = (lba / spt) + inc dx ; dx:sector = (lba % spt) + 1 + mov cl, dl ; sector number + xor dx, dx + div word [fdc.nos] ; ax:cylinder = (tmp / heads) + ; dx:head = (tmp % heads) + mov ch, al ; cylinder number + mov dh, dl ; head number + mov dl, [fdc.drv] ; driver number + mov ax, 0x0201 ; ah=0x02 al=0x01 + int 0x13 + ret + dump: mov si, 0x0000 mov cx, 0x10 @@ -80,73 +127,6 @@ dump: 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 - int 0x13 ; required, QEMU detects 360kB as 1200kB with CHS 80 2 15 - jc .end ; skip if function does not exist - inc dh - mov [bpb.heads], dh - mov ax, cx - and ax, 0x003F - mov [bpb.spt], ax ; no adjustment because sectors are 1-indexed - mov ax, cx - xchg al, ah - mov cl,6 - shr ah,cl - inc ax ; convert from maximum number (0-based) to total number (1-based) of cylinders - 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 -.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 - - call print16 - lahf - xchg ah, al - call print8 - mov al, 0x0A - call printc - mov al, 0x0D - call printc - - pop cx - pop bx - ret - %include "print.asm" times (0x1FE - ($-$$)) nop