rnd
[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 musptr  equ 7e08h
12 ppos    equ 7e0ch
13
14 %macro setcur 2
15         mov dx, %1 | (%2 << 8)
16         xor bx, bx
17         mov ah, 2
18         int 10h
19 %endmacro
20 %macro spkon 0
21         in al, 61h
22         or al, 3
23         out 61h, al
24 %endmacro
25 %macro spkoff 0
26         in al, 61h
27         and al, 0fch
28         out 61h, al
29 %endmacro
30 %macro stimer 2
31         mov al, (%1 << 6) | 36h
32         out 43h, al
33         mov ax, %2
34         out 40h + %1, al
35         mov al, ah
36         out 40h + %1, al
37 %endmacro
38
39 start:  xor ax, ax
40         mov ds, ax
41         mov es, ax
42         mov ss, ax
43         mov sp, 7c00h
44
45         mov di, nticks
46         mov cx, 8
47         rep stosw
48
49         mov word [32], tintr
50         mov [34], ax
51
52         stimer 0, 5966
53
54         mov ax, 13h
55         int 10h
56         push 0a000h
57         pop es
58
59         setcur 10, 0
60         mov si, str1
61         call textout
62         setcur 12, 1
63         mov si, str2
64         call textout
65
66         sti
67
68 mainloop:
69         mov dx, 3dah
70 .invb:  in al, dx
71         and al, 8
72         jnz .invb
73 .novb:  in al, dx
74         and al, 8
75         jz .novb
76
77         call drawbg
78
79         call psys
80
81         jmp mainloop
82
83 drawbg:
84         mov bx, 200
85         mov di, 5120
86 .fillgrad:
87         mov ax, bx
88         mov ah, al
89         mov cx, 2400    ; 15 lines
90         rep stosw
91         inc bx
92         cmp bx, 208
93         jnz .fillgrad
94
95         ; mountains
96         mov cx, 320
97         mov bp, sp
98 .mnt:   mov [bp - 2], cx
99         fild word [bp - 2]
100         fidiv word [w30]
101         fsincos
102         fiadd word [w5]
103         fimul word [w5]
104         fistp word [bp - 2]
105         fstp st0
106         mov bx, [bp - 2]
107         add bx, 100
108         imul bx, bx, 320
109         add bx, cx
110 .mntcol:
111         mov byte [es:bx], 0
112         add bx, 320
113         cmp bx, 64000
114         jb .mntcol
115
116         dec cx
117         jnz .mnt
118         
119         ret
120
121 psys:   cmp word [ppos + 2], 0
122         ja .skipspawn
123
124         call rnd
125         add ax, 128
126         mov [ppos + 2], ax
127         call rnd
128         add ax, 32
129         mov [ppos], ax
130 .skipspawn:
131         dec word [ppos + 2]
132         mov ax, [ppos + 2]
133         shr ax, 2
134         imul bx, ax, 320
135         add bx, [ppos]
136         mov byte [es:bx], 0eh
137
138 rnd:    in al, 40h
139         mov ah, al
140         in al, 40h
141         shr ax, 8
142         ret
143
144 textout:
145         mov al, [si]
146         and al, al
147         jz .done
148         mov ah, 0eh
149         mov bx, 82
150         int 10h
151         inc si
152         jmp textout
153 .done:  ret
154
155 tintr:
156         pusha
157         mov ax, [nticks]
158         inc ax
159         mov [nticks], ax
160
161         mov bx, [musptr]
162         cmp bx, 23*3
163         jnz .skiploop
164         xor bx, bx
165         mov [tmoffs], ax
166 .skiploop:
167         xor cx, cx
168         mov cl, [music + bx]
169         shl cx, 4
170         sub ax, [tmoffs]
171         cmp ax, cx
172         jb .eoi
173
174         mov ax, [music + 1 + bx]
175         add bx, 3
176         mov [musptr], bx
177         test ax, ax
178         jz .off
179         mov bx, ax
180         stimer 2, bx
181         spkon
182         jmp .eoi
183
184 .off:   spkoff
185
186 .eoi:   mov al, 20h
187         out 20h, al
188         popa
189         iret
190
191 str1:   db 'message blah',0
192 str2:   db 'Michael & Athena',0
193
194 music:  dd 0a2f8f00h, 0a11123a1h, 23a11423h, 28000023h, 0be322f8fh, 25c0391fh
195         dd 4b23a13ch, 8f500000h, 23a15a2fh, 641ab161h, 476e1ab1h, 1fbe751ch
196         dd 8223a178h, 0a18925c0h, 1fbe8c23h, 0aa0000a0h
197         dw 0
198
199 w5:     dw 5
200 w30:    dw 30
201
202         times 446-($-$$) db 0
203         dd 00212080h
204         dd 0820280ch
205         dd 00000800h
206         dd 0001f800h
207
208         times 510-($-$$) db 0
209         dw 0aa55h
210
211 ; vi:ft=nasm ts=8 sts=8 sw=8: