Add hexadecimal dump function
The function which is added with this commit writes a caller-supplied hexadecimal string of a caller-supplied length to the display, nibble by nibble, leaving the background black and making the text white.
This commit is contained in:
parent
6342b433b4
commit
4acf6f3a44
|
@ -0,0 +1,106 @@
|
||||||
|
|
||||||
|
FRAMEBUFFER_ADDRESS equ 0xb8000
|
||||||
|
|
||||||
|
; Arguments:
|
||||||
|
; [FURTHEST FROM EBP]
|
||||||
|
; 4. U32 Target Y-Position
|
||||||
|
; 3. U32 Target X-Position
|
||||||
|
; 2. U32 Length of Hexadecimal String
|
||||||
|
; 1. Ptr32 Hexadecimal String
|
||||||
|
; [NEAREST TO EBP]
|
||||||
|
write_hexadecimal_string:
|
||||||
|
push dword esi
|
||||||
|
sub esp, 64
|
||||||
|
mov esi, esp
|
||||||
|
|
||||||
|
mov [esi + (64 - 4)], eax
|
||||||
|
mov [esi + (64 - 8)], ebx
|
||||||
|
mov [esi + (64 - 12)], ecx
|
||||||
|
mov [esi + (64 - 16)], edx
|
||||||
|
mov [esi + (64 - 20)], edi
|
||||||
|
|
||||||
|
; [esi]:
|
||||||
|
|
||||||
|
.initialize_writer_loop:
|
||||||
|
xor ecx, ecx
|
||||||
|
|
||||||
|
.writer_loop:
|
||||||
|
cmp ecx, [ebp - 8]
|
||||||
|
jae .epilog
|
||||||
|
|
||||||
|
; Calculate the byte's start on-screen (A single byte from
|
||||||
|
; the input uses 6 bytes in the framebuffer as every single
|
||||||
|
; character uses 2 bytes and there are 3 characters per byte
|
||||||
|
; written; the upper nibble, the lower nibble and the padding.
|
||||||
|
|
||||||
|
; Multiply the row with 80, the number of cells per row
|
||||||
|
mov eax, [ebp - 16]
|
||||||
|
mov edx, 80
|
||||||
|
mul edx
|
||||||
|
|
||||||
|
; Add the offset within the row ontop
|
||||||
|
add eax, [ebp - 12]
|
||||||
|
add eax, ecx
|
||||||
|
|
||||||
|
; Multiply with 2 to get the byte offset
|
||||||
|
; from the character index
|
||||||
|
mov edx, 6
|
||||||
|
mul edx
|
||||||
|
|
||||||
|
; Point into the framebuffer
|
||||||
|
add eax, FRAMEBUFFER_ADDRESS
|
||||||
|
|
||||||
|
; Save the value
|
||||||
|
mov [esi], eax
|
||||||
|
|
||||||
|
.write_upper_nibble:
|
||||||
|
; Lookup the hexadecimal character
|
||||||
|
xor eax, eax
|
||||||
|
mov ebx, [ebp - 4]
|
||||||
|
add ebx, ecx
|
||||||
|
mov al, [ebx]
|
||||||
|
shr al, 4
|
||||||
|
mov ebx, .hexadecimal_lookup
|
||||||
|
add ebx, eax
|
||||||
|
mov dl, [ebx]
|
||||||
|
|
||||||
|
mov ebx, [esi]
|
||||||
|
mov [ebx], dl
|
||||||
|
; Set the color code for leaving the background black (0x0?)
|
||||||
|
; and making the foreground be white (0x?f).
|
||||||
|
mov [ebx + 1], byte 0x0f
|
||||||
|
|
||||||
|
.write_lower_nibble:
|
||||||
|
; Lookup the hexadecimal character
|
||||||
|
xor eax, eax
|
||||||
|
mov ebx, [ebp - 4]
|
||||||
|
add ebx, ecx
|
||||||
|
mov al, [ebx]
|
||||||
|
and al, 0x0f
|
||||||
|
mov ebx, .hexadecimal_lookup
|
||||||
|
add ebx, eax
|
||||||
|
mov dl, [ebx]
|
||||||
|
|
||||||
|
mov ebx, [esi]
|
||||||
|
mov [ebx + 2], dl
|
||||||
|
; Set the color code for leaving the background black (0x0?)
|
||||||
|
; and making the foreground be white (0x?f).
|
||||||
|
mov [ebx + 3], byte 0x0f
|
||||||
|
|
||||||
|
|
||||||
|
inc ecx
|
||||||
|
jmp .writer_loop
|
||||||
|
|
||||||
|
.epilog:
|
||||||
|
mov eax, [esi + (64 - 4)]
|
||||||
|
mov ebx, [esi + (64 - 8)]
|
||||||
|
mov ecx, [esi + (64 - 12)]
|
||||||
|
mov edx, [esi + (64 - 16)]
|
||||||
|
mov edi, [esi + (64 - 20)]
|
||||||
|
|
||||||
|
add esp, 64
|
||||||
|
pop dword esi
|
||||||
|
ret
|
||||||
|
|
||||||
|
.hexadecimal_lookup:
|
||||||
|
db "0123456789abcdef"
|
Loading…
Reference in New Issue