108 lines
2.7 KiB
NASM
108 lines
2.7 KiB
NASM
|
|
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 160, the number of bytes per row
|
|
mov eax, [ebp - 16]
|
|
mov edx, 160
|
|
mul edx
|
|
mov [esi + 4], eax
|
|
|
|
; Get the byte offset within the row
|
|
mov eax, [ebp - 12]
|
|
add eax, ecx
|
|
mov edx, 6
|
|
mul edx
|
|
|
|
; Add the start offset of the line
|
|
add eax, [esi + 4]
|
|
|
|
; 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"
|