Bootloader: Generalize framebuffer video mode search

Framebuffer size is now taken as arguments to vesa_find_video_mode
This commit is contained in:
Bananymous 2023-12-09 16:48:04 +02:00
parent 0c3e5980d6
commit 8b01e2d4a2
2 changed files with 28 additions and 15 deletions

View File

@ -60,6 +60,9 @@ stage2_main:
call get_memory_map call get_memory_map
call read_user_command_line call read_user_command_line
movw $800, %ax
movw $600, %bx
movb $32, %cl
call vesa_find_video_mode call vesa_find_video_mode
call print_newline call print_newline

View File

@ -1,20 +1,28 @@
.set TARGET_WIDTH, 800
.set TARGET_HEIGHT, 600
.set TARGET_BPP, 32
.code16 .code16
.section .stage2 .section .stage2
# Find suitable video mode # Find suitable video mode (argument registers not saved)
# ax: target width
# bx: target height
# cl: target bpp
# return: # return:
# ax: video mode number if found, 0 otherwise # ax: video mode number if found, 0 otherwise
.global vesa_find_video_mode .global vesa_find_video_mode
vesa_find_video_mode: vesa_find_video_mode:
pushw %ax
pushw %cx
pushw %di pushw %di
pushl %esi pushl %esi
pushl %ebp
movl %esp, %ebp
subl $6, %esp
# save arguments in stack
movw %ax, -2(%ebp)
movw %bx, -4(%ebp)
andw $0xFF, %cx
movw %cx, -6(%ebp)
# clear target mode and frame buffer # clear target mode and frame buffer
movw $0, (vesa_target_mode) movw $0, (vesa_target_mode)
movl $0, (framebuffer + 0) movl $0, (framebuffer + 0)
@ -57,20 +65,23 @@ vesa_find_video_mode:
jz .vesa_find_video_mode_next_mode jz .vesa_find_video_mode_next_mode
# compare mode's dimensions # compare mode's dimensions
cmpw $TARGET_WIDTH, (vesa_mode_info_buffer + 0x12) movw -2(%ebp), %ax; cmpw %ax, (vesa_mode_info_buffer + 0x12)
jne .vesa_find_video_mode_next_mode jne .vesa_find_video_mode_next_mode
cmpw $TARGET_HEIGHT, (vesa_mode_info_buffer + 0x14) movw -4(%ebp), %ax; cmpw %ax, (vesa_mode_info_buffer + 0x14)
jne .vesa_find_video_mode_next_mode jne .vesa_find_video_mode_next_mode
cmpb $TARGET_BPP, (vesa_mode_info_buffer + 0x19) movb -6(%ebp), %al; cmpb %al, (vesa_mode_info_buffer + 0x19)
jne .vesa_find_video_mode_next_mode jne .vesa_find_video_mode_next_mode
movl (vesa_mode_info_buffer + 0x28), %esi movl (vesa_mode_info_buffer + 0x28), %esi
movl %esi, (framebuffer + 0) movl %esi, (framebuffer + 0)
movw (vesa_mode_info_buffer + 0x10), %ax movw (vesa_mode_info_buffer + 0x10), %ax
movw %ax, (framebuffer + 4) movw %ax, (framebuffer + 4)
movl $TARGET_WIDTH, (framebuffer + 8)
movl $TARGET_HEIGHT, (framebuffer + 12) xorl %eax, %eax
movb $TARGET_BPP, (framebuffer + 16) movw -2(%ebp), %ax; movw %ax, (framebuffer + 8)
movw -4(%ebp), %ax; movw %ax, (framebuffer + 12)
movw -6(%ebp), %ax; movb %al, (framebuffer + 16)
movb $1, (framebuffer + 17) movb $1, (framebuffer + 17)
movw %cx, (vesa_target_mode) movw %cx, (vesa_target_mode)
@ -81,10 +92,9 @@ vesa_find_video_mode:
jmp .vesa_find_video_mode_loop_modes jmp .vesa_find_video_mode_loop_modes
.vesa_find_video_mode_loop_modes_done: .vesa_find_video_mode_loop_modes_done:
leavel
popl %esi popl %esi
popw %di popw %di
popw %cx
popw %ax
ret ret
.vesa_unsupported: .vesa_unsupported: