back to the standard palette
[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 eax, eax
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, 3680    ; 20 lines
115         rep stosw
116         inc bx
117         cmp bx, 208
118         jnz .fillgrad
119         ret
120
121
122 textout:
123         mov al, [si]
124         and al, al
125         jz .done
126         mov ah, 0eh
127         mov bx, 82
128         int 10h
129         inc si
130         jmp textout
131 .done:  ret
132
133 timer_intr:
134         pusha
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]    ; event time
143         cmp cx, 0ffffh
144         jz .loop
145         cmp ax, cx
146         jb .eoi
147
148         inc dword [muscur]
149         mov ax, [music + 2 + bx] ; event counter reload
150         test ax, ax
151         jz .off
152         mov bx, ax
153         settimer 2, bx
154         spkon
155         jmp .eoi
156
157 .off:   spkoff
158
159 .eoi:   mov al, 20h
160         out 20h, al     ; EOI
161         popa
162         iret
163
164 .loop:  neg cx
165         mov [muscur], cx
166         mov ax, [nticks]
167         mov [tmoffs], ax
168         jmp .pmus
169         
170
171 str1:   db 'message message blah',0
172 str2:   db 'Michael & Athina',0
173
174 G2      equ 24351/2
175 C3      equ 18243/2
176 D3      equ 16252/2
177 B2      equ 19328/2
178 F3      equ 13666/2
179 E3      equ 14479/2
180
181 %define TM(x)   (40 + (x) * 4)
182
183 music:  dw 0, 0
184         dw TM(0),       G2
185         dw TM(40),      C3
186         dw TM(70),      C3
187
188         dw TM(80),      C3
189         dw TM(140),     0
190
191         dw TM(160),     G2
192         dw TM(200),     D3
193         dw TM(230),     B2
194
195         dw TM(240),     C3
196         dw TM(300),     0
197
198         dw TM(320),     G2
199         dw TM(360),     C3
200         dw TM(390),     F3
201
202         dw TM(400),     F3
203         dw TM(440),     E3
204         dw TM(470),     D3
205
206         dw TM(480),     C3
207         dw TM(520),     B2
208         dw TM(550),     C3
209
210         dw TM(560),     D3
211         dw TM(640),     0
212
213         dw TM(680),     0
214         dw 0ffffh, 0
215
216         times 446-($-$$) db 0
217         dd 00212080h
218         dd 0820280ch
219         dd 00000800h
220         dd 0001f800h
221         times 510-($-$$) db 0
222         dw 0aa55h
223
224 ; vi:ft=nasm ts=8 sts=8 sw=8: