;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