434bf0b44e2071222d8337a4f73a0a9d0a25b09c
[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 OSC_FREQ        equ 1193182
16 PIT_DATA0       equ 40h
17 PIT_CMD         equ 43h
18 PIT_CMD_CHAN0   equ 00h
19 PIT_CMD_HILO    equ 30h
20 PIT_CMD_SQWAVE  equ 06h
21 KB_CTRL         equ 61h
22
23 %define DIV_ROUND(a, b) ((a) / (b) + ((a) % (b)) / ((b) / 2))
24
25 %macro setcursor 2
26         mov dl, %1
27         mov dh, %2
28         xor bx, bx
29         mov ah, 2
30         int 10h
31 %endmacro
32 %macro spkon 0
33         in al, KB_CTRL
34         or al, 3
35         out KB_CTRL, al
36 %endmacro
37 %macro spkoff 0
38         in al, KB_CTRL
39         and al, 0fch
40         out KB_CTRL, al
41 %endmacro
42 %macro settimer 2
43         mov al, (PIT_CMD_CHAN0 + (%1 << 6)) | PIT_CMD_HILO | PIT_CMD_SQWAVE
44         out PIT_CMD, al
45         mov ax, %2
46         out PIT_DATA0 + %1, al
47         mov al, ah
48         out PIT_DATA0 + %1, al
49 %endmacro
50
51 start:  xor eax, eax
52         mov ds, ax
53         mov es, ax
54         mov ss, ax
55         mov sp, 7c00h
56
57         mov di, data_start
58         mov cx, (data_end - data_start) / 2
59         rep stosw
60
61         mov word [32], timer_intr
62         mov [34], ax
63
64         settimer 0, DIV_ROUND(OSC_FREQ, 200)
65
66         mov ax, 13h
67         int 10h
68         push 0a000h
69         pop es
70
71         ; setup palette
72         mov cx, 128
73         mov dx, 3c8h
74         mov al, 16
75         out dx, al
76         inc dx
77 .cmapsetup:
78         mov al, cl
79         shr al, 2
80         out dx, al
81         neg al
82         and al, 03fh
83         shr al, 1
84         mov ah, al
85         shr al, 2
86         out dx, al
87         mov al, ah
88         out dx, al
89         dec cx
90         jnz .cmapsetup
91         
92 drawbg:
93         mov bx, 200
94         xor di, di
95 .fillgrad:
96         mov ax, bx
97         add ax, 16
98         mov ah, al
99         mov cx, 320
100         rep stosw
101         dec bx
102         jnz .fillgrad
103
104         setcursor 10, 12
105         mov si, str1
106         call textout
107         setcursor 12, 13
108         mov si, str2
109         call textout
110
111         sti
112
113 infloop:
114         hlt
115         jmp infloop
116
117 textout:
118         mov al, [si]
119         and al, al
120         jz .done
121         mov ah, 0eh
122         mov bx, 0fh
123         int 10h
124         inc si
125         jmp textout
126 .done:  ret
127
128 timer_intr:
129         pusha
130         mov ax, [nticks]
131         inc ax
132         mov [nticks], ax
133
134         sub ax, [tmoffs]
135 .pmus:  mov bx, [muscur]
136         shl bx, 2
137         mov cx, [music + bx]    ; event time
138         cmp cx, 0ffffh
139         jz .loop
140         cmp ax, cx
141         jb .eoi
142
143         inc dword [muscur]
144         mov ax, [music + 2 + bx] ; event counter reload
145         test ax, ax
146         jz .off
147         mov bx, ax
148         settimer 2, bx
149         spkon
150         jmp .eoi
151
152 .off:   spkoff
153
154 .eoi:   mov al, 20h
155         out 20h, al     ; EOI
156         popa
157         iret
158
159 .loop:  neg cx
160         mov [muscur], cx
161         mov ax, [nticks]
162         mov [tmoffs], ax
163         jmp .pmus
164         
165
166 str1:   db 'message message blah',0
167 str2:   db 'Michael & Athina',0
168
169 G2      equ 24351/2
170 C3      equ 18243/2
171 D3      equ 16252/2
172 B2      equ 19328/2
173 F3      equ 13666/2
174 E3      equ 14479/2
175
176 %define TM(x)   (40 + (x) * 4)
177
178 music:  dw 0, 0
179         dw TM(0),       G2
180         dw TM(40),      C3
181         dw TM(70),      C3
182
183         dw TM(80),      C3
184         dw TM(140),     0
185
186         dw TM(160),     G2
187         dw TM(200),     D3
188         dw TM(230),     B2
189
190         dw TM(240),     C3
191         dw TM(300),     0
192
193         dw TM(320),     G2
194         dw TM(360),     C3
195         dw TM(390),     F3
196
197         dw TM(400),     F3
198         dw TM(440),     E3
199         dw TM(470),     D3
200
201         dw TM(480),     C3
202         dw TM(520),     B2
203         dw TM(550),     C3
204
205         dw TM(560),     D3
206         dw TM(640),     0
207
208         dw TM(680),     0
209         dw 0ffffh, 0
210
211         times 446-($-$$) db 0
212         dd 00212080h
213         dd 0820280ch
214         dd 00000800h
215         dd 0001f800h
216         times 510-($-$$) db 0
217         dw 0aa55h
218
219 ; vi:ft=nasm ts=8 sts=8 sw=8: