flashing bars
[bootcard] / bootcard.asm
1 ; ---- boot me! ----
2 ; nasm -f bin -o bootcard.img bootcard.asm
3 ; cat bootcard.img >/dev/<usbstick>
4 ; reboot
5
6         org 7c00h
7         bits 16
8
9 barh    equ 4
10 nbars   equ 11
11 barstart equ 200 - (nbars+1) * barh
12
13 nticks  equ 7e00h
14 tmoffs  equ 7e04h
15 musptr  equ 7e08h
16 frame   equ 7e0ch
17 fval    equ 7e10h
18 cmap    equ 7e14h
19
20 %macro setcur 2
21         mov dx, %1 | (%2 << 8)
22         xor bx, bx
23         mov ah, 2
24         int 10h
25 %endmacro
26 %macro spkon 0
27         in al, 61h
28         or al, 3
29         out 61h, al
30 %endmacro
31 %macro spkoff 0
32         in al, 61h
33         and al, 0fch
34         out 61h, al
35 %endmacro
36 %macro stimer 2
37         mov al, (%1 << 6) | 36h
38         out 43h, al
39         mov ax, %2
40         out 40h + %1, al
41         mov al, ah
42         out 40h + %1, al
43 %endmacro
44
45 start:  xor ax, ax
46         mov ds, ax
47         mov es, ax
48         mov ss, ax
49         mov sp, 7c00h
50
51         mov di, nticks
52         mov cx, 8
53         rep stosw
54
55         mov word [32], tintr
56         mov [34], ax
57
58         stimer 0, 5966
59
60         mov ax, 13h
61         int 10h
62         push 0a000h
63         pop es
64
65         
66         mov al, 16
67         mov di, barstart * 320
68         mov bx, nbars
69 .drawbars:
70         mov cx, barh * 320
71         rep stosb
72         inc al
73         dec bx
74         jnz .drawbars
75
76         setcur 12, 16
77         mov si, str1
78         call textout
79
80         sti
81
82 mainloop:
83         mov dx, 3dah
84 .invb:  in al, dx
85         and al, 8
86         jnz .invb
87 .novb:  in al, dx
88         and al, 8
89         jz .novb
90
91 drawbg:
92         mov bx, 200
93         xor di, di
94 .fillgrad:
95         mov ax, bx
96         mov ah, al
97         mov cx, 2400    ; 15 lines
98         rep stosw
99         inc bx
100         cmp bx, 208
101         jnz .fillgrad
102
103         ; mountains
104         mov cx, 320
105         mov bp, sp
106 .mnt:   mov [bp - 2], cx
107         fild word [bp - 2]
108         fidiv word [w30]
109         fsincos
110         fiadd word [w5]
111         fimul word [w5]
112         fistp word [bp - 2]
113         fstp st0
114         mov bx, [bp - 2]
115         add bx, 84
116         imul bx, bx, 320
117         add bx, cx
118 .mntcol:
119         mov byte [es:bx], 0
120         add bx, 320
121         cmp bx, 128 * 320
122         jb .mntcol
123
124         dec cx
125         jnz .mnt
126
127         test word [nticks], 0fh
128         jnz mainloop
129         call fadecol
130
131         jmp mainloop
132
133 textout:
134         mov al, [si]
135         and al, al
136         jz .done
137         mov ah, 0eh
138         mov bx, 82
139         int 10h
140         inc si
141         jmp textout
142 .done:  ret
143
144 fadecol:
145         push es
146         push word 0
147         pop es
148         mov ax, 16
149         mov dx, 3c7h
150         out dx, al
151         add dx, 2
152         mov cx, 16 * 3
153         mov di, cmap
154         rep insb
155         pop es
156         dec dx
157         out dx, al
158         inc dx
159         mov cx, 16 * 3
160         mov si, cmap
161 .fadeloop:
162         lodsb
163         test al, al
164         jz .skipdec
165         dec al
166 .skipdec:
167         out dx, al
168         dec cx
169         jnz .fadeloop
170         ret
171
172 tintr:
173         pusha
174         mov ax, [nticks]
175         inc ax
176         mov [nticks], ax
177
178         mov bx, [musptr]
179         cmp bx, 23*3
180         jnz .skiploop
181         xor bx, bx
182         mov [tmoffs], ax
183 .skiploop:
184         xor cx, cx
185         mov cl, [music + bx]
186         shl cx, 4
187         sub ax, [tmoffs]
188         cmp ax, cx
189         jb .eoi
190
191         mov ax, [music + 1 + bx]
192         add bx, 3
193         mov [musptr], bx
194         test ax, ax
195         jz .off
196         mov bx, ax
197
198         mov dx, 3c8h
199         shr ax, 9
200         add ax, 3
201         out dx, al
202         inc dx
203         mov al, 3fh
204         out dx, al
205         mov al, 2fh
206         out dx, al
207         out dx, al
208
209         stimer 2, bx
210         spkon
211         jmp .eoi
212
213 .off:   spkoff
214
215 .eoi:   mov al, 20h
216         out 20h, al
217         popa
218         iret
219
220 str1:   db 'Michael ',3,' Athena',0
221
222 music:  dd 0a2f8f00h, 0a11123a1h, 23a11423h, 28000023h, 0be322f8fh, 25c0391fh
223         dd 4b23a13ch, 8f500000h, 23a15a2fh, 641ab161h, 476e1ab1h, 1fbe751ch
224         dd 8223a178h, 0a18925c0h, 1fbe8c23h, 0aa0000a0h
225         dw 0
226
227 w5:     dw 5
228 w30:    dw 30
229
230         times 446-($-$$) db 0
231         dd 00212080h
232         dd 0820280ch
233         dd 00000800h
234         dd 0001f800h
235
236         times 510-($-$$) db 0
237         dw 0aa55h
238
239 ; vi:ft=nasm ts=8 sts=8 sw=8: