diff options
author | Brett Weiland <brett_weiland@bpcspace.com> | 2021-03-19 10:54:25 -0500 |
---|---|---|
committer | Brett Weiland <brett_weiland@bpcspace.com> | 2021-03-19 10:54:25 -0500 |
commit | 66289aa8ecfa07b20bad424eb9860b196641ef52 (patch) | |
tree | 9fb3915b5cb18d9f2c1f4648d3bf3fb56396509f /src/bootloader/bios_functions/print.asm |
first commit
Diffstat (limited to 'src/bootloader/bios_functions/print.asm')
-rw-r--r-- | src/bootloader/bios_functions/print.asm | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/bootloader/bios_functions/print.asm b/src/bootloader/bios_functions/print.asm new file mode 100644 index 0000000..d071cd9 --- /dev/null +++ b/src/bootloader/bios_functions/print.asm @@ -0,0 +1,59 @@ +;TODO fix null problem, allow direct passes +bios_print: +;push ax ; we need to use ax, so let's push it in case whoever called needs it +pusha +mov ah, 0x0e ; tells bios we're in tty mode + +.print_loop: +mov al, [bx] ; al is the char MEANT TO BE CX +cmp al, 0 ; compare the char we're about to print with null +je .fini ; if it is null, we gonna scoot the fuck outta here + +test cx, cx ; if cx is zero, ascii, otherwise hex string +jne .print_hex +int 0x10 ; bios call, actually prints the char +.print_hex_ret: +inc bx ; adds to the pointer +jmp .print_loop ; goes back to loop start + +.fini: +mov al, 0xd ; \r +int 0x10 +mov al, 0xa ; \n +int 0x10 +popa +ret + + +.print_hex: +mov al, '0' +int 0x10 + +mov al, 'x' +int 0x10 + +mov al, [bx] ; shift bits to get first nibble +shr al, 4 +call .bios_print_nibble + +mov al, [bx] +and al, 0x0f +call .bios_print_nibble + +mov al, ' ' +int 0x10 + +jmp .print_hex_ret + + +.bios_print_nibble: +cmp al, 9 ; see if letter worthy +ja .print_hex_letter +add al, 0x30 ;'1' +int 0x10 +ret + +.print_hex_letter: +add al, 0x57 ;'a' +int 0x10 +ret |