summaryrefslogtreecommitdiff
path: root/src/bootloader/bios_functions/print.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootloader/bios_functions/print.asm')
-rw-r--r--src/bootloader/bios_functions/print.asm59
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