out of space
[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 dl, %1
29         mov dh, %2
30         xor bx, bx
31         mov ah, 2
32         int 10h
33 %endmacro
34 %macro spkon 0
35         in al, KB_CTRL
36         or al, 3
37         out KB_CTRL, al
38 %endmacro
39 %macro spkoff 0
40         in al, KB_CTRL
41         and al, 0fch
42         out KB_CTRL, al
43 %endmacro
44 %macro settimer 2
45         mov al, (PIT_CMD_CHAN0 + (%1 << 6)) | PIT_CMD_HILO | PIT_CMD_SQWAVE
46         out PIT_CMD, al
47         mov ax, %2
48         out PIT_DATA0 + %1, al
49         mov al, ah
50         out PIT_DATA0 + %1, al
51 %endmacro
52
53 start:  xor ax, ax
54         mov ds, ax
55         mov es, ax
56         mov ss, ax
57         mov sp, 7c00h
58
59         mov di, data_start
60         mov cx, (data_end - data_start) / 2
61         rep stosw
62
63         mov word [32], timer_intr
64         mov [34], ax
65
66         settimer 0, DIV_ROUND(OSC_FREQ, 200)
67
68         mov ax, 13h
69         int 10h
70         push backbuf_seg
71         pop es
72
73         sti
74
75 mainloop:
76         call drawbg
77
78         mov dx, 3dah
79 .invb:  in al, dx
80         and al, 8
81         jnz mainloop
82 .novb:  in al, dx
83         and al, 8
84         jz .novb
85
86         push ds
87         push es
88         push es
89         pop ds
90         push 0a000h
91         pop es
92         xor di, di
93         xor si, si
94         mov cx, 32000
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         mov ax, [nticks]
161         inc ax
162         mov [nticks], ax
163
164         sub ax, [tmoffs]
165 .pmus:  mov bx, [muscur]
166         shl bx, 2
167         mov cx, [music + bx]    ; event time
168         cmp cx, 0ffffh
169         jz .loop
170         cmp ax, cx
171         jb .eoi
172
173         inc word [muscur]
174         mov ax, [music + 2 + bx] ; event counter reload
175         test ax, ax
176         jz .off
177         mov bx, ax
178         settimer 2, bx
179         spkon
180         jmp .eoi
181
182 .off:   spkoff
183
184 .eoi:   mov al, 20h
185         out 20h, al     ; EOI
186         popa
187         iret
188
189 .loop:  neg cx
190         mov [muscur], cx
191         mov ax, [nticks]
192         mov [tmoffs], ax
193         jmp .pmus
194         
195
196 str1:   db 'message message blah',0
197 str2:   db 'Michael & Athena',0
198
199 G2      equ 24351/2
200 C3      equ 18243/2
201 D3      equ 16252/2
202 B2      equ 19328/2
203 F3      equ 13666/2
204 E3      equ 14479/2
205
206 %define TM(x)   (40 + (x) * 4)
207
208 music:  dw 0, 0
209         dw TM(0),       G2
210         dw TM(40),      C3
211         dw TM(70),      C3
212
213         dw TM(80),      C3
214         dw TM(140),     0
215
216         dw TM(160),     G2
217         dw TM(200),     D3
218         dw TM(230),     B2
219
220         dw TM(240),     C3
221         dw TM(300),     0
222
223         dw TM(320),     G2
224         dw TM(360),     C3
225         dw TM(390),     F3
226
227         dw TM(400),     F3
228         dw TM(440),     E3
229         dw TM(470),     D3
230
231         dw TM(480),     C3
232         dw TM(520),     B2
233         dw TM(550),     C3
234
235         dw TM(560),     D3
236         dw TM(640),     0
237
238         dw TM(680),     0
239         dw 0ffffh, 0
240
241         times 446-($-$$) db 0
242         dd 00212080h
243         dd 0820280ch
244         dd 00000800h
245         dd 0001f800h
246
247 w5:     dw 5
248 w30:    dw 30
249         times 510-($-$$) db 0
250         dw 0aa55h
251
252 ; vi:ft=nasm ts=8 sts=8 sw=8: