readme
[bootcard] / bootcard.asm
1 ; ---- boot me! ----
2 ; nasm -f bin -o bootcard.img bootcard.asm
3 ; cat bootcard.img >/dev/<usbstick>
4
5         org 7c00h
6         bits 16
7
8 barh    equ 4
9 nbars   equ 11
10 barstart equ 200 - (nbars+1) * barh
11
12 nticks  equ 7e00h
13 tmoffs  equ 7e04h
14 musptr  equ 7e08h
15 frame   equ 7e0ch
16 fval    equ 7e10h
17 cmap    equ 7e14h
18
19 %macro setcur 2
20         mov dx, %1 | (%2 << 8)
21         xor bx, bx
22         mov ah, 2
23         int 10h
24 %endmacro
25 %macro spkon 0
26         in al, 61h
27         or al, 3
28         out 61h, al
29 %endmacro
30 %macro spkoff 0
31         in al, 61h
32         and al, 0fch
33         out 61h, al
34 %endmacro
35 %macro stimer 2
36         mov al, (%1 << 6) | 36h
37         out 43h, al
38         mov ax, %2
39         out 40h + %1, al
40         mov al, ah
41         out 40h + %1, al
42 %endmacro
43
44 start:  xor ax, ax
45         mov ds, ax
46         mov es, ax
47         mov ss, ax
48         mov sp, 7c00h
49
50         mov di, nticks
51         mov cx, 16
52         rep stosw
53
54         cli
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         ; upd colormap
128         mov dx, 3c8h
129         mov al, 16
130         out dx, al
131         inc dx
132         mov si, cmap
133         mov cx, 16 * 3
134         rep outsb
135
136         jmp mainloop
137
138 textout:
139         mov al, [si]
140         and al, al
141         jz .done
142         mov ah, 0eh
143         mov bx, 82
144         int 10h
145         inc si
146         jmp textout
147 .done:  ret
148
149
150 tintr:
151         pusha
152         mov ax, [nticks]
153         inc ax
154         mov [nticks], ax
155
156         mov bx, [musptr]
157         cmp bx, 22*3
158         jnz .skiploop
159         xor bx, bx
160         mov [tmoffs], ax
161 .skiploop:
162         xor cx, cx
163         mov cl, [music + bx]
164         shl cx, 4
165         sub ax, [tmoffs]
166         cmp ax, cx
167         jb .end
168
169         mov ax, [music + 1 + bx]
170         add bx, 3
171         mov [musptr], bx
172         test ax, ax
173         jz .off
174
175         mov bx, ax
176         shr bx, 9
177         sub bx, 13
178         imul bx, bx, 3
179         mov byte [cmap + bx], 3fh
180         mov word [cmap + bx + 1], 2f2fh
181
182         mov bx, ax
183         stimer 2, bx
184         spkon
185         jmp .end
186
187 .off:   spkoff
188
189 .end:   test word [nticks], 1
190         jnz .eoi
191         mov cx, 16 * 3
192         mov si, cmap
193 .fadecol:
194         lodsb
195         test al, al
196         jz .skipdec
197         dec al
198         mov [si-1], al
199 .skipdec:
200         dec cx
201         jnz .fadecol
202         
203 .eoi:   mov al, 20h
204         out 20h, al
205         popa
206         iret
207
208 str1:   db 'Michael ',3,' Athena',0
209
210 music:  dd 0a2f8f00h, 0a11123a1h, 23a11423h, 28000023h, 0be322f8fh, 25c0391fh
211         dd 4b23a13ch, 8f500000h, 23a15a2fh, 641ab161h, 476e1ab1h, 1fbe751ch
212         dd 8223a178h, 0a18925c0h, 1fbe8c23h, 0aa0000a0h
213         dw 0
214
215 w5:     dw 5
216 w30:    dw 30
217
218         times 446-($-$$) db 0
219         dd 00212080h
220         dd 0820280ch
221         dd 00000800h
222         dd 0001f800h
223
224         times 510-($-$$) db 0
225         dw 0aa55h
226 ; vi:ft=nasm ts=8 sts=8 sw=8: