diff --git a/boot1.s b/boot1.s index 8077dba..9a804be 100644 --- a/boot1.s +++ b/boot1.s @@ -218,6 +218,10 @@ main: mov eax, 0xa1b2c3d4 mov ebx, 0x12345678 + mov ecx, 0xdeadbeef + mov edx, 0xcafebabe + mov esi, 0xfeedface + mov edi, 0x66778899 call panic_fancy call test_a20 @@ -237,61 +241,71 @@ main: hlt -; Wrapper function around panic_fancy which provides default arguments. -; Arguments: none -; Does not return -panic_default: - push bp - mov bp, sp - push word 0 - push word 0 - ; Spoof return address - push dword [bp] - jmp panic_fancy - - ; Print a panic message then terminate. ; Arguments: -; - [sp - 2]: panic message segment +; - [sp + 2]: panic message segment ; - [sp]: panic message offset ; Does not return panic_fancy: push bp mov bp, sp - sub sp, 16 ; Buffer: bp - 16 - - push eax ; bp - 20 - push ebx ; bp - 24 - push ecx ; bp - 28 - push edx ; bp - 32 - push esi ; bp - 36 - push edi ; bp - 40 + ; Flags first so we don't cobber them when we sub (uwu) + pushfd ; Temp flags: bp - 0x04 + sub sp, 16 ; Buffer: bp - 0x14 + push eax ; eax: bp - 0x18 + push ebx ; ebx: bp - 0x1c + push ecx ; ecx: bp - 0x20 + push edx ; edx: bp - 0x24 + push esi ; esi: bp - 0x28 + push edi ; edi: bp - 0x2c + sub sp, 4 ; Flags: bp - 0x30 + mov eax, [bp - 0x04] + mov [bp - 0x30], eax mov word [GLOBALS + VGA_COL], 0x4f00 call vga_clear mov ax, ss mov es, ax - - lea ax, [bp - 16] - push ax - mov ecx, [bp - 20] - call dump_reg - pop cx - xor ax, ax - mov dx, 8 + + xor bx, bx + mov di, VGA_WIDTH * 3 +.loop_dump_regs: + cmp bx, 7 + jae .loop_dump_regs_done + + mov ax, bx + shl ax, 1 + mov si, table_reg_msgs + add si, ax + mov cx, [si] + mov ax, di + add ax, 1 + mov dx, 6 call vga_print_raw - lea ax, [bp - 16] - push ax - mov ecx, [bp - 24] + ; Format the current saved register value as hex + lea si, [bp - 0x18] + mov ax, bx + shl ax, 2 + sub si, ax + mov ecx, ss:[si] + lea ax, [bp - 0x14] call dump_reg - pop cx - mov ax, VGA_WIDTH + + mov ax, di + add ax, 7 + lea cx, [bp - 0x14] mov dx, 8 call vga_print_raw - + + inc bx + add di, VGA_WIDTH + jmp .loop_dump_regs + +.loop_dump_regs_done: + .halt: hlt ; Handle non-maskable interrupts @@ -583,6 +597,24 @@ msg_a20_enabled db "a20 enabled", 0 msg_a20_disabled db "a20 not enabled", 0 msg_panic db "panic!", 0 +msg_reg_eax db "eax", 0 +msg_reg_ebx db "ebx", 0 +msg_reg_ecx db "ecx", 0 +msg_reg_edx db "edx", 0 +msg_reg_esi db "esi", 0 +msg_reg_edi db "edi", 0 +msg_reg_flags db "flags", 0 + +table_reg_msgs: + dw msg_reg_eax + dw msg_reg_ebx + dw msg_reg_ecx + dw msg_reg_edx + dw msg_reg_esi + dw msg_reg_edi + dw msg_reg_flags + dw 0 + boot1_magic dd BOOT1_MAGIC BOOT1_TOTAL_LEN equ $ - $$