diff --git a/i386/loader/src-asm/utility/display.asm b/i386/loader/src-asm/utility/display.asm new file mode 100644 index 0000000..9b913c3 --- /dev/null +++ b/i386/loader/src-asm/utility/display.asm @@ -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"