Bootloader: Generalize framebuffer video mode search
Framebuffer size is now taken as arguments to vesa_find_video_mode
This commit is contained in:
parent
0c3e5980d6
commit
8b01e2d4a2
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue