ed23d79582afc037ebe774f749e22be7dff8f873
[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 nticks  equ 7e00h
10 tmoffs  equ 7e04h
11 muscur  equ 7e08h
12
13 %macro setcur 2
14         mov dx, %1 | (%2 << 8)
15         xor bx, bx
16         mov ah, 2
17         int 10h
18 %endmacro
19 %macro spkon 0
20         in al, 61h
21         or al, 3
22         out 61h, al
23 %endmacro
24 %macro spkoff 0
25         in al, 61h
26         and al, 0fch
27         out 61h, al
28 %endmacro
29 %macro stimer 2
30         mov al, (%1 << 6) | 36h
31         out 43h, al
32         mov ax, %2
33         out 40h + %1, al
34         mov al, ah
35         out 40h + %1, al
36 %endmacro
37
38 start:  xor ax, ax
39         mov ds, ax
40         mov es, ax
41         mov ss, ax
42         mov sp, 7c00h
43
44         mov di, nticks
45         mov cx, 6
46         rep stosw
47
48         mov word [32], tintr
49         mov [34], ax
50
51         stimer 0, 5966
52
53         mov ax, 13h
54         int 10h
55         push 1000h
56         pop es
57
58         sti
59
60 mainloop:
61         call drawbg
62
63         push ds
64         push es
65         push es
66         pop ds
67         push 0a000h
68         pop es
69         xor di, di
70         xor si, si
71         mov cx, 32000
72
73         mov dx, 3dah
74 .invb:  in al, dx
75         and al, 8
76         jnz .invb
77 .novb:  in al, dx
78         and al, 8
79         jz .novb
80
81         rep movsw
82         pop es
83         pop ds
84
85         setcur 10, 0
86         mov si, str1
87         call textout
88         setcur 12, 1
89         mov si, str2
90         call textout
91
92         jmp mainloop
93
94 drawbg:
95         mov bx, 200
96         mov di, 5120
97 .fillgrad:
98         mov ax, bx
99         mov ah, al
100         mov cx, 2400    ; 15 lines
101         rep stosw
102         inc bx
103         cmp bx, 208
104         jnz .fillgrad
105
106         ; mountains
107         mov cx, 320
108         mov bp, sp
109 .mnt:   mov [bp - 2], cx
110         fild word [bp - 2]
111         fidiv word [w30]
112         fsincos
113         fiadd word [w5]
114         fimul word [w5]
115         fistp word [bp - 2]
116         fstp st0
117         mov bx, [bp - 2]
118         add bx, 100
119         imul bx, bx, 320
120         add bx, cx
121 .mntcol:
122         mov byte [es:bx], 0
123         add bx, 320
124         cmp bx, 64000
125         jb .mntcol
126
127         dec cx
128         jnz .mnt
129         
130         ret
131
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 tintr:
145         pusha
146         push ds
147         push word 0
148         pop ds
149         mov ax, [nticks]
150         inc ax
151         mov [nticks], ax
152
153         sub ax, [tmoffs]
154 .pmus:  mov bx, [muscur]
155         shl bx, 2
156         mov cx, [music + bx]
157         cmp cx, 0ffffh
158         jz .loop
159         cmp ax, cx
160         jb .eoi
161
162         inc word [muscur]
163         mov ax, [music + 2 + bx]
164         test ax, ax
165         jz .off
166         mov bx, ax
167         stimer 2, bx
168         spkon
169         jmp .eoi
170
171 .off:   spkoff
172
173 .eoi:   mov al, 20h
174         out 20h, al
175         pop ds
176         popa
177         iret
178
179 .loop:  neg cx
180         mov [muscur], cx
181         mov ax, [nticks]
182         mov [tmoffs], ax
183         jmp .pmus
184         
185
186 str1:   db 'message blah',0
187 str2:   db 'Michael & Athena',0
188
189 G2      equ 12175
190 C3      equ 9121
191 D3      equ 8126
192 B2      equ 9664
193 F3      equ 6833
194 E3      equ 7239
195
196 music:  dw 0,           0
197         dw 40,          G2
198         dw 200,         C3
199         dw 320,         C3
200         dw 360,         C3
201         dw 600,         0
202         dw 680,         G2
203         dw 840,         D3
204         dw 960,         B2
205         dw 1000,        C3
206         dw 1240,        0
207         dw 1320,        G2
208         dw 1480,        C3
209         dw 1600,        F3
210         dw 1640,        F3
211         dw 1800,        E3
212         dw 1920,        D3
213         dw 1960,        C3
214         dw 2120,        B2
215         dw 2240,        C3
216         dw 2280,        D3
217         dw 2600,        0
218         dw 2760,        0
219         dw 0ffffh,      0
220
221 w5:     dw 5
222 w30:    dw 30
223
224         times 446-($-$$) db 0
225         dd 00212080h
226         dd 0820280ch
227         dd 00000800h
228         dd 0001f800h
229
230         times 510-($-$$) db 0
231         dw 0aa55h
232
233 ; vi:ft=nasm ts=8 sts=8 sw=8: