ddf50cdbbe0fcb7730394d3ae655a4c50d5976ea
[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 0a000h
56         pop es
57
58         setcur 10, 0
59         mov si, str1
60         call textout
61         setcur 12, 1
62         mov si, str2
63         call textout
64
65         sti
66
67 mainloop:
68         mov dx, 3dah
69 .invb:  in al, dx
70         and al, 8
71         jnz .invb
72 .novb:  in al, dx
73         and al, 8
74         jz .novb
75
76         call drawbg
77
78         jmp mainloop
79
80 drawbg:
81         mov bx, 200
82         mov di, 5120
83 .fillgrad:
84         mov ax, bx
85         mov ah, al
86         mov cx, 2400    ; 15 lines
87         rep stosw
88         inc bx
89         cmp bx, 208
90         jnz .fillgrad
91
92         ; mountains
93         mov cx, 320
94         mov bp, sp
95 .mnt:   mov [bp - 2], cx
96         fild word [bp - 2]
97         fidiv word [w30]
98         fsincos
99         fiadd word [w5]
100         fimul word [w5]
101         fistp word [bp - 2]
102         fstp st0
103         mov bx, [bp - 2]
104         add bx, 100
105         imul bx, bx, 320
106         add bx, cx
107 .mntcol:
108         mov byte [es:bx], 0
109         add bx, 320
110         cmp bx, 64000
111         jb .mntcol
112
113         dec cx
114         jnz .mnt
115         
116         ret
117
118
119 textout:
120         mov al, [si]
121         and al, al
122         jz .done
123         mov ah, 0eh
124         mov bx, 82
125         int 10h
126         inc si
127         jmp textout
128 .done:  ret
129
130 tintr:
131         pusha
132         push ds
133         push word 0
134         pop ds
135         mov ax, [nticks]
136         inc ax
137         mov [nticks], ax
138
139         sub ax, [tmoffs]
140 .pmus:  mov bx, [muscur]
141         shl bx, 2
142         mov cx, [music + bx]
143         cmp cx, 0ffffh
144         jz .loop
145         cmp ax, cx
146         jb .eoi
147
148         inc word [muscur]
149         mov ax, [music + 2 + bx]
150         test ax, ax
151         jz .off
152         mov bx, ax
153         stimer 2, bx
154         spkon
155         jmp .eoi
156
157 .off:   spkoff
158
159 .eoi:   mov al, 20h
160         out 20h, al
161         pop ds
162         popa
163         iret
164
165 .loop:  neg cx
166         mov [muscur], cx
167         mov ax, [nticks]
168         mov [tmoffs], ax
169         jmp .pmus
170         
171
172 str1:   db 'message blah',0
173 str2:   db 'Michael & Athena',0
174
175 G2      equ 12175
176 C3      equ 9121
177 D3      equ 8126
178 B2      equ 9664
179 F3      equ 6833
180 E3      equ 7239
181
182 music:  dw 0,           0
183         dw 40,          G2
184         dw 200,         C3
185         dw 320,         C3
186         dw 360,         C3
187         dw 600,         0
188         dw 680,         G2
189         dw 840,         D3
190         dw 960,         B2
191         dw 1000,        C3
192         dw 1240,        0
193         dw 1320,        G2
194         dw 1480,        C3
195         dw 1600,        F3
196         dw 1640,        F3
197         dw 1800,        E3
198         dw 1920,        D3
199         dw 1960,        C3
200         dw 2120,        B2
201         dw 2240,        C3
202         dw 2280,        D3
203         dw 2600,        0
204         dw 2760,        0
205         dw 0ffffh,      0
206
207 w5:     dw 5
208 w30:    dw 30
209
210         times 446-($-$$) db 0
211         dd 00212080h
212         dd 0820280ch
213         dd 00000800h
214         dd 0001f800h
215
216         times 510-($-$$) db 0
217         dw 0aa55h
218
219 ; vi:ft=nasm ts=8 sts=8 sw=8: