Mirai's Miscellaneous Misadventures
M21 / x86 / vbe.s
1# copyright 2022 zamfofex
2# license: AGPLv3 or later
3
4.intel_syntax noprefix
5.code16
6
7.section vbe
8
9.global mimimi_vbe_set_mode
10.global mimimi_vbe_next_mode
11
12mimimi_vbe_set_mode:
13 push es
14 mov ax, 0x4F00
15 mov di, offset vbe_info
16 int 0x10
17 pop es
18
19 cmp ax, 0x4F
20 jne error
21
22reset_mode:
23 mov ax, [vbe_info.video_modes]
24 mov [offset_], ax
25 mov ax, [vbe_info.video_modes + 2]
26 mov [segment], ax
27
28mimimi_vbe_next_mode:
29 mov ax, [segment]
30 mov fs, ax
31 mov si, [offset_]
32 mov dx, fs:[si]
33
34 add si, 2
35 mov [offset_], si
36 mov [mode], dx
37 mov ax, 0
38 mov fs, ax
39
40 cmp [word ptr mode], 0xFFFF
41 je reset_mode
42
43 push es
44 mov ax, 0x4F01
45 mov cx, [mode]
46 mov di, offset vbe_mode_info
47 int 0x10
48 pop es
49
50 cmp ax, 0x4F
51 jne error
52
53 mov al, 32
54 cmp al, [vbe_mode_info.bpp]
55 jne mimimi_vbe_next_mode
56
57 mov ax, [vbe_mode_info.width]
58 mov [vbe_screen.width], ax
59 mov ax, [vbe_mode_info.height]
60 mov [vbe_screen.height], ax
61 mov eax, [vbe_mode_info.framebuffer]
62 mov [vbe_screen.buffer], eax
63 mov ax, [vbe_mode_info.pitch]
64 mov [vbe_screen.bytes_per_line], ax
65 mov eax, 0
66 mov al, [vbe_mode_info.bpp]
67 shr eax, 3
68 mov [vbe_screen.bytes_per_pixel], eax
69
70 push es
71 mov ax, 0x4F02
72 mov bx, [mode]
73 or bx, 0x4000
74 mov di, 0
75 int 0x10
76 pop es
77
78 cmp ax, 0x4F
79 jne error
80
81 clc
82 ret
83
84next_mode:
85 mov ax, [segment]
86 mov fs, ax
87 mov si, [offset_]
88 jmp mimimi_vbe_next_mode
89
90error:
91 jmp mimimi_x86_exit
92
93width: .zero 2
94height: .zero 2
95segment: .zero 2
96offset_: .zero 2
97mode: .zero 2
98
99vbe_info:
100vbe_info.signature: .ascii "VBE2"
101vbe_info.version: .zero 2
102vbe_info.oem: .zero 4
103vbe_info.capabilities: .zero 4
104vbe_info.video_modes: .zero 4
105vbe_info.video_memory: .zero 2
106vbe_info.software_rev: .zero 2
107vbe_info.vendor: .zero 4
108vbe_info.product_name: .zero 4
109vbe_info.product_rev: .zero 4
110vbe_info.reserved: .zero 222
111vbe_info.oem_data: .zero 256
112
113vbe_mode_info:
114vbe_mode_info.attributes: .zero 2
115vbe_mode_info.window_a: .zero 1
116vbe_mode_info.window_b: .zero 1
117vbe_mode_info.granularity: .zero 2
118vbe_mode_info.window_size: .zero 2
119vbe_mode_info.segment_a: .zero 2
120vbe_mode_info.segment_b: .zero 2
121vbe_mode_info.win_func_ptr: .zero 4
122vbe_mode_info.pitch: .zero 2
123vbe_mode_info.width: .zero 2
124vbe_mode_info.height: .zero 2
125vbe_mode_info.w_char: .zero 1
126vbe_mode_info.y_char: .zero 1
127vbe_mode_info.planes: .zero 1
128vbe_mode_info.bpp: .zero 1
129vbe_mode_info.banks: .zero 1
130vbe_mode_info.memory_model: .zero 1
131vbe_mode_info.bank_size: .zero 1
132vbe_mode_info.image_pages: .zero 1
133vbe_mode_info.reserved0: .zero 1
134vbe_mode_info.red_mask: .zero 1
135vbe_mode_info.red_position: .zero 1
136vbe_mode_info.green_mask: .zero 1
137vbe_mode_info.green_position: .zero 1
138vbe_mode_info.blue_mask: .zero 1
139vbe_mode_info.blue_position: .zero 1
140vbe_mode_info.reserved_mask: .zero 1
141vbe_mode_info.reserved_position: .zero 1
142vbe_mode_info.direct_color_attributes: .zero 1
143vbe_mode_info.framebuffer: .zero 4
144vbe_mode_info.off_screen_mem_off: .zero 4
145vbe_mode_info.off_screen_mem_size: .zero 2
146vbe_mode_info.reserved1: .zero 206
147
148.global mimimi_vbe_screen
149mimimi_vbe_screen:
150
151vbe_screen:
152vbe_screen.buffer: .zero 4
153vbe_screen.width: .zero 2
154vbe_screen.height: .zero 2
155vbe_screen.bytes_per_line: .zero 2
156vbe_screen.bytes_per_pixel: .zero 2