Reading and printing strings from hard drives
This commit is contained in:
commit
bd62352513
4 changed files with 122 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
boot.bin
|
8
Makefile
Normal file
8
Makefile
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
compile_and_run: compile run
|
||||||
|
|
||||||
|
compile:
|
||||||
|
rm -rf boot.bin
|
||||||
|
nasm -f bin -o boot.bin main.asm
|
||||||
|
|
||||||
|
run:
|
||||||
|
qemu-system-x86_64 -drive format=raw,file=boot.bin -drive format=raw,file=drive.bin -monitor stdio
|
BIN
drive.bin
Normal file
BIN
drive.bin
Normal file
Binary file not shown.
113
main.asm
Normal file
113
main.asm
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
org 0x7C00
|
||||||
|
bits 16
|
||||||
|
|
||||||
|
jmp .start
|
||||||
|
|
||||||
|
;;; Print string at bx
|
||||||
|
.puts:
|
||||||
|
.puts_loop:
|
||||||
|
|
||||||
|
mov al, [bx] ; load the character
|
||||||
|
cmp al, 0 ; check for null byte
|
||||||
|
je .end_puts_loop
|
||||||
|
|
||||||
|
mov ah, 0x0e
|
||||||
|
int 0x10 ; print charachter
|
||||||
|
inc bx
|
||||||
|
jmp .puts_loop
|
||||||
|
.end_puts_loop:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;;; Print bl as hex
|
||||||
|
.puthex:
|
||||||
|
|
||||||
|
; Print high bits
|
||||||
|
mov dl, bl
|
||||||
|
shr dl, 4
|
||||||
|
|
||||||
|
cmp dl, 9
|
||||||
|
jg .puthex_high_alpha
|
||||||
|
|
||||||
|
; It's < 10, print as digit
|
||||||
|
mov al, dl
|
||||||
|
add al, 0x30
|
||||||
|
mov ah, 0x0e
|
||||||
|
int 0x10
|
||||||
|
jmp .puthex_low
|
||||||
|
|
||||||
|
.puthex_high_alpha:
|
||||||
|
; It's >= 10, print as letter
|
||||||
|
mov al, dl
|
||||||
|
add al, 0x57 ; 0x57 = (0x61 - 10)
|
||||||
|
mov ah, 0x0e
|
||||||
|
int 0x10
|
||||||
|
|
||||||
|
.puthex_low:
|
||||||
|
; Print low bits
|
||||||
|
mov dl, bl
|
||||||
|
and dl, 0b1111
|
||||||
|
|
||||||
|
cmp dl, 9
|
||||||
|
jg .puthex_low_alpha
|
||||||
|
|
||||||
|
; It's < 10, print as digit
|
||||||
|
mov al, dl
|
||||||
|
add al, 0x30
|
||||||
|
mov ah, 0x0e
|
||||||
|
int 0x10
|
||||||
|
jmp .puthex_end
|
||||||
|
|
||||||
|
.puthex_low_alpha:
|
||||||
|
; It's >= 10, print as letter
|
||||||
|
mov al, dl
|
||||||
|
add al, 0x57 ; 0x57 = (0x61 - 10)
|
||||||
|
mov ah, 0x0e
|
||||||
|
int 0x10
|
||||||
|
|
||||||
|
.puthex_end:
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.start:
|
||||||
|
|
||||||
|
; reset disk system
|
||||||
|
mov ah, 0x00
|
||||||
|
mov dl, 0x81
|
||||||
|
int 0x13
|
||||||
|
|
||||||
|
; print result on error
|
||||||
|
jnc .reset_disk_no_error
|
||||||
|
mov bl, ah
|
||||||
|
call .puthex
|
||||||
|
.reset_disk_no_error:
|
||||||
|
|
||||||
|
; Read sector 1 into memory
|
||||||
|
mov ah, 0x02
|
||||||
|
mov al, 0x01 ; number of sectors
|
||||||
|
mov ch, 0x00 ; cylinder number, low 8 bits
|
||||||
|
mov cl, 0x01 ; cylinder number, high 2 bits + sector number (6 bits)
|
||||||
|
mov dh, 0x00 ; head number
|
||||||
|
mov dl, 0x81 ; drive number
|
||||||
|
mov bx, .data ; data buffer
|
||||||
|
int 0x13
|
||||||
|
|
||||||
|
; print result on error
|
||||||
|
jnc .read_disk_no_error
|
||||||
|
mov bl, ah
|
||||||
|
call .puthex
|
||||||
|
.read_disk_no_error:
|
||||||
|
|
||||||
|
; print string
|
||||||
|
mov bx, .data
|
||||||
|
call .puts
|
||||||
|
|
||||||
|
.end:
|
||||||
|
hlt
|
||||||
|
|
||||||
|
.data:
|
||||||
|
|
||||||
|
times 510 - ($ - $$) db 0
|
||||||
|
dw 0xAA55
|
Loading…
Reference in a new issue