fixed clear .bss code
[bootcensus] / src / startup.s
1 # pcboot - bootable PC demo/game kernel
2 # Copyright (C) 2018  John Tsiombikas <nuclear@member.fsf.org>
3
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY, without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13
14 # You should have received a copy of the GNU General Public License
15 # along with this program.  If not, see <https://www.gnu.org/licenses/>.
16
17         .code32
18         .section .startup,"ax"
19
20         .extern _bss_start
21         .extern _bss_end
22         .extern pcboot_main
23
24         # zero the BSS section
25         xor %eax, %eax
26         mov $_bss_start, %edi
27         mov $_bss_size, %ecx
28         cmp $0, %ecx
29         jz skip_bss_zero
30         shr $4, %ecx
31         rep stosl
32 skip_bss_zero:
33
34         call pcboot_main
35         # pcboot_main never returns
36 0:      cli
37         hlt
38         jmp 0b
39
40         .global logohack
41 logohack:
42         # copy palette
43         mov $logo_pal, %esi
44         xor %cl, %cl
45
46 0:      xor %eax, %eax
47         mov $0x3c8, %dx
48         movb %cl, %al
49         outb %al, %dx
50         inc %dx
51         # red
52         movb (%esi), %al
53         inc %esi
54         shr $2, %al
55         outb %al, %dx
56         # green
57         movb (%esi), %al
58         inc %esi
59         shr $2, %al
60         outb %al, %dx
61         # blue
62         movb (%esi), %al
63         inc %esi
64         shr $2, %al
65         outb %al, %dx
66         add $1, %cl
67         jnc 0b
68
69         # copy pixels
70         mov $sintab, %ebp
71         mov $logo_pix, %esi
72 frameloop:
73         mov $0xa0000, %edi
74         movl $0, yval
75 yloop:
76         movl $0, xval
77 xloop:
78         # calc src scanline address -> ebx
79         xor %ecx, %ecx
80         mov yval, %ebx
81         shl $2, %ebx
82         add frameno, %ebx
83         and $0xff, %ebx
84         mov (%ebp, %ebx), %cl
85         shr $5, %ecx
86
87         mov yval, %eax
88         add %ecx, %eax
89         # bounds check
90         cmp $200, %eax
91         jl 0f
92         mov $199, %eax
93
94 0:      mov %eax, %ebx
95         shl $8, %eax
96         shl $6, %ebx
97         add %eax, %ebx
98
99         # calc src x offset -> eax
100         xor %ecx, %ecx
101         mov xval, %eax
102         shl $2, %eax
103         add frameno, %eax
104         and $0xff, %eax
105         mov (%ebp, %eax), %cl
106         shr $5, %ecx
107
108         mov xval, %eax
109         add %ecx, %eax
110         # bounds check
111         cmp $320, %eax
112         jl 0f
113         mov $319, %eax
114
115 0:      add %eax, %ebx
116         mov (%ebx, %esi), %al
117
118         mov %al, (%edi)
119         inc %edi
120
121         incl xval
122         cmpl $320, xval
123         jnz xloop
124
125         incl yval
126         cmpl $200, yval
127         jnz yloop
128
129         incl frameno
130
131         # wait vsync
132         mov $0x3da, %dx
133 0:      in %dx, %al
134         and $8, %al
135         jnz 0b
136 0:      in %dx, %al
137         and $8, %al
138         jz 0b
139         jmp frameloop
140
141 xval: .long 0
142 yval: .long 0
143 frameno: .long 0
144
145 logo_pal:
146         .incbin "logo.pal"
147
148         .align 16
149 logo_pix:
150         .incbin "logo.raw"
151
152 sintab:
153         .byte 127
154         .byte 130
155         .byte 133
156         .byte 136
157         .byte 139
158         .byte 143
159         .byte 146
160         .byte 149
161         .byte 152
162         .byte 155
163         .byte 158
164         .byte 161
165         .byte 164
166         .byte 167
167         .byte 170
168         .byte 173
169         .byte 176
170         .byte 179
171         .byte 182
172         .byte 184
173         .byte 187
174         .byte 190
175         .byte 193
176         .byte 195
177         .byte 198
178         .byte 200
179         .byte 203
180         .byte 205
181         .byte 208
182         .byte 210
183         .byte 213
184         .byte 215
185         .byte 217
186         .byte 219
187         .byte 221
188         .byte 224
189         .byte 226
190         .byte 228
191         .byte 229
192         .byte 231
193         .byte 233
194         .byte 235
195         .byte 236
196         .byte 238
197         .byte 239
198         .byte 241
199         .byte 242
200         .byte 244
201         .byte 245
202         .byte 246
203         .byte 247
204         .byte 248
205         .byte 249
206         .byte 250
207         .byte 251
208         .byte 251
209         .byte 252
210         .byte 253
211         .byte 253
212         .byte 254
213         .byte 254
214         .byte 254
215         .byte 254
216         .byte 254
217         .byte 255
218         .byte 254
219         .byte 254
220         .byte 254
221         .byte 254
222         .byte 254
223         .byte 253
224         .byte 253
225         .byte 252
226         .byte 251
227         .byte 251
228         .byte 250
229         .byte 249
230         .byte 248
231         .byte 247
232         .byte 246
233         .byte 245
234         .byte 244
235         .byte 242
236         .byte 241
237         .byte 239
238         .byte 238
239         .byte 236
240         .byte 235
241         .byte 233
242         .byte 231
243         .byte 229
244         .byte 228
245         .byte 226
246         .byte 224
247         .byte 221
248         .byte 219
249         .byte 217
250         .byte 215
251         .byte 213
252         .byte 210
253         .byte 208
254         .byte 205
255         .byte 203
256         .byte 200
257         .byte 198
258         .byte 195
259         .byte 193
260         .byte 190
261         .byte 187
262         .byte 184
263         .byte 182
264         .byte 179
265         .byte 176
266         .byte 173
267         .byte 170
268         .byte 167
269         .byte 164
270         .byte 161
271         .byte 158
272         .byte 155
273         .byte 152
274         .byte 149
275         .byte 146
276         .byte 143
277         .byte 139
278         .byte 136
279         .byte 133
280         .byte 130
281         .byte 127
282         .byte 124
283         .byte 121
284         .byte 118
285         .byte 115
286         .byte 111
287         .byte 108
288         .byte 105
289         .byte 102
290         .byte 99
291         .byte 96
292         .byte 93
293         .byte 90
294         .byte 87
295         .byte 84
296         .byte 81
297         .byte 78
298         .byte 75
299         .byte 72
300         .byte 70
301         .byte 67
302         .byte 64
303         .byte 61
304         .byte 59
305         .byte 56
306         .byte 54
307         .byte 51
308         .byte 49
309         .byte 46
310         .byte 44
311         .byte 41
312         .byte 39
313         .byte 37
314         .byte 35
315         .byte 33
316         .byte 30
317         .byte 28
318         .byte 26
319         .byte 25
320         .byte 23
321         .byte 21
322         .byte 19
323         .byte 18
324         .byte 16
325         .byte 15
326         .byte 13
327         .byte 12
328         .byte 10
329         .byte 9
330         .byte 8
331         .byte 7
332         .byte 6
333         .byte 5
334         .byte 4
335         .byte 3
336         .byte 3
337         .byte 2
338         .byte 1
339         .byte 1
340         .byte 0
341         .byte 0
342         .byte 0
343         .byte 0
344         .byte 0
345         .byte 0
346         .byte 0
347         .byte 0
348         .byte 0
349         .byte 0
350         .byte 0
351         .byte 1
352         .byte 1
353         .byte 2
354         .byte 3
355         .byte 3
356         .byte 4
357         .byte 5
358         .byte 6
359         .byte 7
360         .byte 8
361         .byte 9
362         .byte 10
363         .byte 12
364         .byte 13
365         .byte 15
366         .byte 16
367         .byte 18
368         .byte 19
369         .byte 21
370         .byte 23
371         .byte 25
372         .byte 26
373         .byte 28
374         .byte 30
375         .byte 33
376         .byte 35
377         .byte 37
378         .byte 39
379         .byte 41
380         .byte 44
381         .byte 46
382         .byte 49
383         .byte 51
384         .byte 54
385         .byte 56
386         .byte 59
387         .byte 61
388         .byte 64
389         .byte 67
390         .byte 70
391         .byte 72
392         .byte 75
393         .byte 78
394         .byte 81
395         .byte 84
396         .byte 87
397         .byte 90
398         .byte 93
399         .byte 96
400         .byte 99
401         .byte 102
402         .byte 105
403         .byte 108
404         .byte 111
405         .byte 115
406         .byte 118
407         .byte 121
408         .byte 124