rdos/boot/dumpbda.asm

72 lines
1.0 KiB
NASM

org 0x7C00
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00
mov si, 0x400
loop: mov dx, si
call dmpdx
mov al, 0x20
int 0x10
int 0x10
push si
mov cx, 8
wloop: lodsw
xchg al, ah
mov dx, ax
push cx
call dmpdx
mov al, 0x20
int 0x10
pop cx
loop wloop
pop si
mov al, 0x20
int 0x10
mov cx, 16
aloop: lodsb
cmp al, 0x20
jnc noadj
mov al, '.'
noadj: int 0x10
loop aloop
mov al, 0x0A
int 0x10
mov al, 0x0D
int 0x10
cmp si, 0x500
jc loop
hlt: hlt
jmp hlt
dmpdx: ; setup bx and ah for int 10h call
xor bx, bx
mov ah, 0x0e
mov cl, 4
; this double-call is essentially a 4 times repeating loop
call dmpdx1
dmpdx1: call dmpdx2
dmpdx2: ; grab highest nibble from dx
mov al, dh
; remove highest nibble from dx
shl dx, cl
; shift away second-highest nibble that we accidentally copied
shr al, cl
; map 0-9 to ascii codes for '0' to '9'
add al, 0x30
; if result is larger than '9', ...
cmp al, 0x3a
jl dmpdx3
; ... add 7 so we continue at 'A'
add al, 7
dmpdx3: int 0x10
ret