f823219c247a4b5b13d729f5644c2bc825772a1c
[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 data_start      equ 7e00h
10 nticks          equ data_start
11 tmoffs          equ nticks + 4
12 muscur          equ tmoffs + 4
13 data_end        equ muscur + 4
14
15 backbuf_seg     equ 1000h
16
17 OSC_FREQ        equ 1193182
18 PIT_DATA0       equ 40h
19 PIT_CMD         equ 43h
20 PIT_CMD_CHAN0   equ 00h
21 PIT_CMD_HILO    equ 30h
22 PIT_CMD_SQWAVE  equ 06h
23 KB_CTRL         equ 61h
24
25 %define DIV_ROUND(a, b) ((a) / (b) + ((a) % (b)) / ((b) / 2))
26
27 %macro setcursor 2
28         mov dx, %1 | (%2 << 8)
29         xor bx, bx
30         mov ah, 2
31         int 10h
32 %endmacro
33 %macro spkon 0
34         in al, KB_CTRL
35         or al, 3
36         out KB_CTRL, al
37 %endmacro
38 %macro spkoff 0
39         in al, KB_CTRL
40         and al, 0fch
41         out KB_CTRL, al
42 %endmacro
43 %macro settimer 2
44         mov al, (PIT_CMD_CHAN0 + (%1 << 6)) | PIT_CMD_HILO | PIT_CMD_SQWAVE
45         out PIT_CMD, al
46         mov ax, %2
47         out PIT_DATA0 + %1, al
48         mov al, ah
49         out PIT_DATA0 + %1, al
50 %endmacro
51
52 start:  xor ax, ax
53         mov ds, ax
54         mov es, ax
55         mov ss, ax
56         mov sp, 7c00h
57
58         mov di, data_start
59         mov cx, (data_end - data_start) / 2
60         rep stosw
61
62         mov word [32], timer_intr
63         mov [34], ax
64
65         settimer 0, DIV_ROUND(OSC_FREQ, 200)
66
67         mov ax, 13h
68         int 10h
69         push backbuf_seg
70         pop es
71
72         sti
73
74 mainloop:
75         call drawbg
76
77         push ds
78         push es
79         push es
80         pop ds
81         push 0a000h
82         pop es
83         xor di, di
84         xor si, si
85         mov cx, 32000
86
87         mov dx, 3dah
88 .invb:  in al, dx
89         and al, 8
90         jnz .invb
91 .novb:  in al, dx
92         and al, 8
93         jz .novb
94
95         rep movsw
96         pop es
97         pop ds
98
99         setcursor 10, 0
100         mov si, str1
101         call textout
102         setcursor 12, 1
103         mov si, str2
104         call textout
105
106         jmp mainloop
107
108 drawbg:
109         mov bx, 200
110         mov di, 5120
111 .fillgrad:
112         mov ax, bx
113         mov ah, al
114         mov cx, 2400    ; 15 lines
115         rep stosw
116         inc bx
117         cmp bx, 208
118         jnz .fillgrad
119
120         ; mountains
121         mov cx, 320
122         mov bp, sp
123 .mnt:   mov [bp - 2], cx
124         fild word [bp - 2]
125         fidiv word [w30]
126         fsincos
127         fiadd word [w5]
128         fimul word [w5]
129         fistp word [bp - 2]
130         ;fistp word [bp - 4]
131         mov bx, [bp - 2]
132         add bx, 100
133         imul bx, bx, 320
134         add bx, cx
135 .mntcol:
136         mov byte [es:bx], 0
137         add bx, 320
138         cmp bx, 64000
139         jb .mntcol
140
141         dec cx
142         jnz .mnt
143         
144         ret
145
146
147 textout:
148         mov al, [si]
149         and al, al
150         jz .done
151         mov ah, 0eh
152         mov bx, 82
153         int 10h
154         inc si
155         jmp textout
156 .done:  ret
157
158 timer_intr:
159         pusha
160         push ds
161         push word 0
162         pop ds
163         mov ax, [nticks]
164         inc ax
165         mov [nticks], ax
166
167         sub ax, [tmoffs]
168 .pmus:  mov bx, [muscur]
169         shl bx, 2
170         mov cx, [music + bx]    ; event time
171         cmp cx, 0ffffh
172         jz .loop
173         cmp ax, cx
174         jb .eoi
175
176         inc word [muscur]
177         mov ax, [music + 2 + bx] ; event counter reload
178         test ax, ax
179         jz .off
180         mov bx, ax
181         settimer 2, bx
182         spkon
183         jmp .eoi
184
185 .off:   spkoff
186
187 .eoi:   mov al, 20h
188         out 20h, al     ; EOI
189         pop ds
190         popa
191         iret
192
193 .loop:  neg cx
194         mov [muscur], cx
195         mov ax, [nticks]
196         mov [tmoffs], ax
197         jmp .pmus
198         
199
200 str1:   db 'message message blah',0
201 str2:   db 'Michael & Athena',0
202
203 G2      equ 12175
204 C3      equ 9121
205 D3      equ 8126
206 B2      equ 9664
207 F3      equ 6833
208 E3      equ 7239
209
210 %define TM(x)   (40 + (x) * 4)
211
212 music:  dw 0, 0
213         dw TM(0),       G2
214         dw TM(40),      C3
215         dw TM(70),      C3
216
217         dw TM(80),      C3
218         dw TM(140),     0
219
220         dw TM(160),     G2
221         dw TM(200),     D3
222         dw TM(230),     B2
223
224         dw TM(240),     C3
225         dw TM(300),     0
226
227         dw TM(320),     G2
228         dw TM(360),     C3
229         dw TM(390),     F3
230
231         dw TM(400),     F3
232         dw TM(440),     E3
233         dw TM(470),     D3
234
235         dw TM(480),     C3
236         dw TM(520),     B2
237         dw TM(550),     C3
238
239         dw TM(560),     D3
240         dw TM(640),     0
241
242         dw TM(680),     0
243         dw 0ffffh, 0
244
245         times 446-($-$$) db 0
246         dd 00212080h
247         dd 0820280ch
248         dd 00000800h
249         dd 0001f800h
250
251 w5:     dw 5
252 w30:    dw 30
253         times 510-($-$$) db 0
254         dw 0aa55h
255
256 ; vi:ft=nasm ts=8 sts=8 sw=8: