Revert "slight source minification"
[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, 16
53         rep stosw
54
55         cli
56         mov word [32], tintr
57         mov [34], ax
58
59         stimer 0, 5966
60
61         mov ax, 13h
62         int 10h
63         push 0a000h
64         pop es
65
66         
67         mov al, 16
68         mov di, barstart * 320
69         mov bx, nbars
70 .drawbars:
71         mov cx, barh * 320
72         rep stosb
73         inc al
74         dec bx
75         jnz .drawbars
76
77         setcur 12, 16
78         mov si, str1
79         call textout
80
81         sti
82
83 mainloop:
84         mov dx, 3dah
85 .invb:  in al, dx
86         and al, 8
87         jnz .invb
88 .novb:  in al, dx
89         and al, 8
90         jz .novb
91
92 drawbg:
93         mov bx, 200
94         xor di, di
95 .fillgrad:
96         mov ax, bx
97         mov ah, al
98         mov cx, 2400    ; 15 lines
99         rep stosw
100         inc bx
101         cmp bx, 208
102         jnz .fillgrad
103
104         ; mountains
105         mov cx, 320
106         mov bp, sp
107 .mnt:   mov [bp - 2], cx
108         fild word [bp - 2]
109         fidiv word [w30]
110         fsincos
111         fiadd word [w5]
112         fimul word [w5]
113         fistp word [bp - 2]
114         fstp st0
115         mov bx, [bp - 2]
116         add bx, 84
117         imul bx, bx, 320
118         add bx, cx
119 .mntcol:
120         mov byte [es:bx], 0
121         add bx, 320
122         cmp bx, 128 * 320
123         jb .mntcol
124
125         dec cx
126         jnz .mnt
127
128         ; upd colormap
129         mov dx, 3c8h
130         mov al, 16
131         out dx, al
132         inc dx
133         mov si, cmap
134         mov cx, 16 * 3
135         rep outsb
136
137         jmp mainloop
138
139 textout:
140         mov al, [si]
141         and al, al
142         jz .done
143         mov ah, 0eh
144         mov bx, 82
145         int 10h
146         inc si
147         jmp textout
148 .done:  ret
149
150
151 tintr:
152         pusha
153         mov ax, [nticks]
154         inc ax
155         mov [nticks], ax
156
157         mov bx, [musptr]
158         cmp bx, 22*3
159         jnz .skiploop
160         xor bx, bx
161         mov [tmoffs], ax
162 .skiploop:
163         xor cx, cx
164         mov cl, [music + bx]
165         shl cx, 4
166         sub ax, [tmoffs]
167         cmp ax, cx
168         jb .end
169
170         mov ax, [music + 1 + bx]
171         add bx, 3
172         mov [musptr], bx
173         test ax, ax
174         jz .off
175
176         mov bx, ax
177         shr bx, 9
178         sub bx, 13
179         imul bx, bx, 3
180         mov byte [cmap + bx], 3fh
181         mov word [cmap + bx + 1], 2f2fh
182
183         mov bx, ax
184         stimer 2, bx
185         spkon
186         jmp .end
187
188 .off:   spkoff
189
190 .end:   test word [nticks], 1
191         jnz .eoi
192         mov cx, 16 * 3
193         mov si, cmap
194 .fadecol:
195         lodsb
196         test al, al
197         jz .skipdec
198         dec al
199         mov [si-1], al
200 .skipdec:
201         dec cx
202         jnz .fadecol
203         
204 .eoi:   mov al, 20h
205         out 20h, al
206         popa
207         iret
208
209 str1:   db 'Michael ',3,' Athena',0
210
211 music:  dd 0a2f8f00h, 0a11123a1h, 23a11423h, 28000023h, 0be322f8fh, 25c0391fh
212         dd 4b23a13ch, 8f500000h, 23a15a2fh, 641ab161h, 476e1ab1h, 1fbe751ch
213         dd 8223a178h, 0a18925c0h, 1fbe8c23h, 0aa0000a0h
214         dw 0
215
216 w5:     dw 5
217 w30:    dw 30
218
219         times 446-($-$$) db 0
220         dd 00212080h
221         dd 0820280ch
222         dd 00000800h
223         dd 0001f800h
224
225         times 510-($-$$) db 0
226         dw 0aa55h
227
228 ; vi:ft=nasm ts=8 sts=8 sw=8: