Blame


1 a1cd4b7f 2024-10-03 benni [cpu 286]
2 a1cd4b7f 2024-10-03 benni [bits 16]
3 50eedbae 2024-10-05 benni
4 b8971940 2024-10-05 benni %include "macros.inc"
5 50eedbae 2024-10-05 benni
6 a1cd4b7f 2024-10-03 benni section .text
7 9990f831 2024-10-05 benni extern floppy_init
8 a1cd4b7f 2024-10-03 benni global _entry
9 9990f831 2024-10-05 benni global putchar
10 9990f831 2024-10-05 benni global puts
11 9990f831 2024-10-05 benni global puthexb
12 9990f831 2024-10-05 benni global puthexw
13 9990f831 2024-10-05 benni global panic
14 a1cd4b7f 2024-10-03 benni _entry:
15 a1cd4b7f 2024-10-03 benni pop dx
16 a1cd4b7f 2024-10-03 benni mov byte [bootdrv], dl
17 a1cd4b7f 2024-10-03 benni
18 a64d9d6e 2024-10-05 benni ; clear screen
19 a64d9d6e 2024-10-05 benni mov bx, 0xb800
20 a64d9d6e 2024-10-05 benni mov es, bx
21 a64d9d6e 2024-10-05 benni xor di, di
22 a64d9d6e 2024-10-05 benni mov ax, (' ' | (0x07 << 8))
23 a64d9d6e 2024-10-05 benni mov cx, (80 * 25 * 2)
24 a64d9d6e 2024-10-05 benni rep stosw
25 a64d9d6e 2024-10-05 benni
26 a1cd4b7f 2024-10-03 benni ; get size of conventional memory (below 640K)
27 a1cd4b7f 2024-10-03 benni int 0x12
28 a1cd4b7f 2024-10-03 benni mov word [convmem], ax
29 a1cd4b7f 2024-10-03 benni
30 a1cd4b7f 2024-10-03 benni ; get size of extended memory (above 1M)
31 a1cd4b7f 2024-10-03 benni mov ah, 0x88
32 a1cd4b7f 2024-10-03 benni int 0x15
33 a1cd4b7f 2024-10-03 benni jc .noxm
34 a1cd4b7f 2024-10-03 benni mov word [highmem], ax
35 a1cd4b7f 2024-10-03 benni
36 a1cd4b7f 2024-10-03 benni .noxm:
37 ce2fe607 2024-10-05 benni ; NOTE: BIOS cannot be accessed from here
38 a64d9d6e 2024-10-05 benni cli
39 ce2fe607 2024-10-05 benni
40 ce2fe607 2024-10-05 benni ; disable keyboard
41 ce2fe607 2024-10-05 benni call .wait
42 ce2fe607 2024-10-05 benni mov al, 0xAD
43 ce2fe607 2024-10-05 benni out 0x64, al
44 ce2fe607 2024-10-05 benni
45 ce2fe607 2024-10-05 benni ; read from input
46 ce2fe607 2024-10-05 benni call .wait
47 ce2fe607 2024-10-05 benni mov al, 0xD0
48 ce2fe607 2024-10-05 benni out 0x64, al
49 ce2fe607 2024-10-05 benni call .wait2
50 ce2fe607 2024-10-05 benni in al, 0x60
51 ce2fe607 2024-10-05 benni mov bl, al
52 ce2fe607 2024-10-05 benni
53 ce2fe607 2024-10-05 benni ; write to output
54 ce2fe607 2024-10-05 benni call .wait
55 ce2fe607 2024-10-05 benni mov al,0xD1
56 ce2fe607 2024-10-05 benni out 0x64,al
57 ce2fe607 2024-10-05 benni call .wait
58 ce2fe607 2024-10-05 benni mov al, bl
59 ce2fe607 2024-10-05 benni or al, 2 ; enable A20 line
60 ce2fe607 2024-10-05 benni out 0x60, al
61 ce2fe607 2024-10-05 benni
62 ce2fe607 2024-10-05 benni ; enable keyboard
63 ce2fe607 2024-10-05 benni call .wait
64 ce2fe607 2024-10-05 benni mov al, 0xAE
65 ce2fe607 2024-10-05 benni out 0x64, al
66 ce2fe607 2024-10-05 benni call .wait
67 ce2fe607 2024-10-05 benni jmp .setup
68 ce2fe607 2024-10-05 benni
69 ce2fe607 2024-10-05 benni .wait:
70 ce2fe607 2024-10-05 benni in al,0x64
71 ce2fe607 2024-10-05 benni test al, 2
72 ce2fe607 2024-10-05 benni jnz .wait
73 ce2fe607 2024-10-05 benni ret
74 ce2fe607 2024-10-05 benni
75 ce2fe607 2024-10-05 benni
76 ce2fe607 2024-10-05 benni .wait2:
77 ce2fe607 2024-10-05 benni in al,0x64
78 ce2fe607 2024-10-05 benni test al,1
79 ce2fe607 2024-10-05 benni jz .wait2
80 ce2fe607 2024-10-05 benni ret
81 ce2fe607 2024-10-05 benni
82 ce2fe607 2024-10-05 benni .setup:
83 a64d9d6e 2024-10-05 benni lidt [idtr]
84 a64d9d6e 2024-10-05 benni lgdt [gdtr]
85 a64d9d6e 2024-10-05 benni smsw ax
86 a64d9d6e 2024-10-05 benni or ax, 1
87 a64d9d6e 2024-10-05 benni lmsw ax
88 50eedbae 2024-10-05 benni jmp 0x08:.reloadcs
89 a1cd4b7f 2024-10-03 benni
90 50eedbae 2024-10-05 benni .reloadcs:
91 a64d9d6e 2024-10-05 benni lea sp, [stack]
92 a64d9d6e 2024-10-05 benni mov ax, 0x10
93 a64d9d6e 2024-10-05 benni mov ds, ax
94 a64d9d6e 2024-10-05 benni mov es, ax
95 a64d9d6e 2024-10-05 benni mov ss, ax
96 a64d9d6e 2024-10-05 benni
97 50eedbae 2024-10-05 benni out 0x80, al
98 50eedbae 2024-10-05 benni
99 50eedbae 2024-10-05 benni ; initialize PIC
100 50eedbae 2024-10-05 benni outb_slow 0x20, 0x11 ; Start the initialization routine (in cascae mode)
101 50eedbae 2024-10-05 benni outb_slow 0xA0, 0x11
102 50eedbae 2024-10-05 benni outb_slow 0x21, 0x20 ; Master PIC IRQ offset
103 50eedbae 2024-10-05 benni outb_slow 0xA1, 0x28 ; Slave PIC IRQ offset
104 50eedbae 2024-10-05 benni outb_slow 0x21, 4 ; Tell the master PIC that there is a slave PIC at IRQ2
105 50eedbae 2024-10-05 benni outb_slow 0xA1, 2 ; Tell the slave PIC it's cascade identity
106 50eedbae 2024-10-05 benni outb_slow 0x21, 1 ; Use the 8086-mode (and not the 8088 mode)
107 50eedbae 2024-10-05 benni outb_slow 0xA1, 1
108 50eedbae 2024-10-05 benni outb_slow 0x21, 0xfe ; Set the IRQ masks
109 50eedbae 2024-10-05 benni outb_slow 0xA1, 0xff
110 50eedbae 2024-10-05 benni
111 50eedbae 2024-10-05 benni ; initialize IDT
112 50eedbae 2024-10-05 benni mov al, 0x20
113 50eedbae 2024-10-05 benni mov ah, 0x86
114 50eedbae 2024-10-05 benni lea dx, [i_timer]
115 50eedbae 2024-10-05 benni call set_irq
116 50eedbae 2024-10-05 benni
117 a1cd4b7f 2024-10-03 benni lea bp, [hello]
118 a1cd4b7f 2024-10-03 benni call puts
119 3a5c7209 2024-10-05 benni
120 3a5c7209 2024-10-05 benni lea bp, [convmsg]
121 3a5c7209 2024-10-05 benni call puts
122 3a5c7209 2024-10-05 benni mov ax, word [convmem]
123 3a5c7209 2024-10-05 benni call puthexw
124 3a5c7209 2024-10-05 benni lea bp, [kbmsg]
125 3a5c7209 2024-10-05 benni call puts
126 3a5c7209 2024-10-05 benni
127 3a5c7209 2024-10-05 benni lea bp, [xmmsg]
128 3a5c7209 2024-10-05 benni call puts
129 3a5c7209 2024-10-05 benni mov ax, word [highmem]
130 3a5c7209 2024-10-05 benni call puthexw
131 3a5c7209 2024-10-05 benni lea bp, [kbmsg]
132 3a5c7209 2024-10-05 benni call puts
133 3a5c7209 2024-10-05 benni
134 9990f831 2024-10-05 benni call floppy_init
135 9990f831 2024-10-05 benni
136 50eedbae 2024-10-05 benni sti
137 a1cd4b7f 2024-10-03 benni jmp $
138 a1cd4b7f 2024-10-03 benni
139 50eedbae 2024-10-05 benni i_timer:
140 50eedbae 2024-10-05 benni pusha
141 50eedbae 2024-10-05 benni mov al, '.'
142 50eedbae 2024-10-05 benni call putchar
143 50eedbae 2024-10-05 benni
144 50eedbae 2024-10-05 benni outb 0x20, 0x20
145 50eedbae 2024-10-05 benni popa
146 50eedbae 2024-10-05 benni iret
147 50eedbae 2024-10-05 benni
148 50eedbae 2024-10-05 benni ; al - num
149 50eedbae 2024-10-05 benni ; ah - attr
150 50eedbae 2024-10-05 benni ; dx - offset
151 50eedbae 2024-10-05 benni set_irq:
152 50eedbae 2024-10-05 benni xor bh, bh
153 50eedbae 2024-10-05 benni mov bl, al
154 50eedbae 2024-10-05 benni shl bx, 3
155 50eedbae 2024-10-05 benni lea bx, [idt + bx]
156 50eedbae 2024-10-05 benni mov word [bx + 0], dx
157 50eedbae 2024-10-05 benni mov word [bx + 2], 0x08
158 50eedbae 2024-10-05 benni mov byte [bx + 4], 0x00
159 50eedbae 2024-10-05 benni mov byte [bx + 5], ah
160 50eedbae 2024-10-05 benni mov word [bx + 6], 0
161 50eedbae 2024-10-05 benni ret
162 50eedbae 2024-10-05 benni
163 a1cd4b7f 2024-10-03 benni error:
164 a64d9d6e 2024-10-05 benni cli
165 a1cd4b7f 2024-10-03 benni lea bp, [errstr]
166 a64d9d6e 2024-10-05 benni call puts
167 a64d9d6e 2024-10-05 benni hlt
168 a64d9d6e 2024-10-05 benni jmp $
169 a1cd4b7f 2024-10-03 benni
170 3a5c7209 2024-10-05 benni ; ax - value
171 3a5c7209 2024-10-05 benni puthexw:
172 3a5c7209 2024-10-05 benni push ax
173 3a5c7209 2024-10-05 benni mov al, ah
174 3a5c7209 2024-10-05 benni call puthexb
175 3a5c7209 2024-10-05 benni pop ax
176 3a5c7209 2024-10-05 benni jmp puthexb
177 3a5c7209 2024-10-05 benni
178 3a5c7209 2024-10-05 benni ; al - value
179 3a5c7209 2024-10-05 benni puthexb:
180 3a5c7209 2024-10-05 benni push ax
181 3a5c7209 2024-10-05 benni shr al, 4
182 3a5c7209 2024-10-05 benni call puthexch
183 3a5c7209 2024-10-05 benni pop ax
184 3a5c7209 2024-10-05 benni and al, 0xf
185 3a5c7209 2024-10-05 benni jmp puthexch
186 3a5c7209 2024-10-05 benni
187 3a5c7209 2024-10-05 benni ; al - hex digit
188 3a5c7209 2024-10-05 benni puthexch:
189 3a5c7209 2024-10-05 benni cmp al, 10
190 3a5c7209 2024-10-05 benni jae .hex
191 3a5c7209 2024-10-05 benni add al, '0'
192 3a5c7209 2024-10-05 benni jmp putchar
193 3a5c7209 2024-10-05 benni
194 3a5c7209 2024-10-05 benni .hex:
195 3a5c7209 2024-10-05 benni add al, 'a' - 10
196 3a5c7209 2024-10-05 benni jmp putchar
197 3a5c7209 2024-10-05 benni
198 a64d9d6e 2024-10-05 benni ; al - char
199 50eedbae 2024-10-05 benni writech:
200 a64d9d6e 2024-10-05 benni mov bx, 0x18
201 a64d9d6e 2024-10-05 benni mov es, bx
202 a64d9d6e 2024-10-05 benni
203 a64d9d6e 2024-10-05 benni xor ch, ch
204 a64d9d6e 2024-10-05 benni xor dh, dh
205 a64d9d6e 2024-10-05 benni mov cl, byte [posx]
206 a64d9d6e 2024-10-05 benni mov dl, byte [posy]
207 a64d9d6e 2024-10-05 benni
208 a64d9d6e 2024-10-05 benni cmp al, 10 ; '\n'
209 a64d9d6e 2024-10-05 benni je .nl
210 a64d9d6e 2024-10-05 benni
211 a64d9d6e 2024-10-05 benni imul bx, dx, 80
212 a64d9d6e 2024-10-05 benni add bx, cx
213 a64d9d6e 2024-10-05 benni shl bx, 1
214 a64d9d6e 2024-10-05 benni mov byte [es:bx], al
215 a64d9d6e 2024-10-05 benni
216 a64d9d6e 2024-10-05 benni inc cl
217 a64d9d6e 2024-10-05 benni cmp cl, 80
218 a64d9d6e 2024-10-05 benni je .nl
219 a64d9d6e 2024-10-05 benni mov byte [posx], cl
220 a64d9d6e 2024-10-05 benni ret
221 a64d9d6e 2024-10-05 benni
222 a64d9d6e 2024-10-05 benni .nl:
223 a64d9d6e 2024-10-05 benni mov byte [posx], 0
224 a64d9d6e 2024-10-05 benni inc dl
225 a64d9d6e 2024-10-05 benni
226 a64d9d6e 2024-10-05 benni cmp dl, 25
227 a64d9d6e 2024-10-05 benni je .scroll
228 a64d9d6e 2024-10-05 benni mov byte [posy], dl
229 a64d9d6e 2024-10-05 benni ret
230 a64d9d6e 2024-10-05 benni
231 a64d9d6e 2024-10-05 benni .scroll:
232 b6729e0b 2024-10-05 benni push ds
233 b6729e0b 2024-10-05 benni mov ax, 0x18
234 b6729e0b 2024-10-05 benni mov ds, ax
235 b6729e0b 2024-10-05 benni
236 a64d9d6e 2024-10-05 benni cld
237 a64d9d6e 2024-10-05 benni xor di, di
238 b6729e0b 2024-10-05 benni mov si, 160
239 b6729e0b 2024-10-05 benni mov cx, 80 * 24
240 a64d9d6e 2024-10-05 benni rep movsw
241 a64d9d6e 2024-10-05 benni
242 b6729e0b 2024-10-05 benni pop ds
243 b6729e0b 2024-10-05 benni
244 b6729e0b 2024-10-05 benni mov di, 80 * 24 * 2
245 b6729e0b 2024-10-05 benni mov cx, 80
246 a64d9d6e 2024-10-05 benni mov ax, (' ' | (0x07 << 8))
247 a64d9d6e 2024-10-05 benni rep stosw
248 a64d9d6e 2024-10-05 benni mov byte [posy], 24
249 a64d9d6e 2024-10-05 benni ret
250 a64d9d6e 2024-10-05 benni
251 50eedbae 2024-10-05 benni ; al - ch
252 50eedbae 2024-10-05 benni putchar:
253 50eedbae 2024-10-05 benni call writech
254 50eedbae 2024-10-05 benni jmp update_cursor
255 50eedbae 2024-10-05 benni
256 a64d9d6e 2024-10-05 benni ; bp - str
257 a1cd4b7f 2024-10-03 benni puts:
258 a1cd4b7f 2024-10-03 benni mov al, byte [ds:bp]
259 a1cd4b7f 2024-10-03 benni inc bp
260 a1cd4b7f 2024-10-03 benni test al, al
261 50eedbae 2024-10-05 benni jz update_cursor
262 a1cd4b7f 2024-10-03 benni
263 50eedbae 2024-10-05 benni call writech
264 a1cd4b7f 2024-10-03 benni jmp puts
265 a1cd4b7f 2024-10-03 benni
266 50eedbae 2024-10-05 benni update_cursor:
267 a64d9d6e 2024-10-05 benni mov dx, 0x3D4
268 a64d9d6e 2024-10-05 benni mov al, 0x0f
269 a64d9d6e 2024-10-05 benni out dx, al
270 a64d9d6e 2024-10-05 benni
271 a64d9d6e 2024-10-05 benni mov bx, word [posy]
272 a64d9d6e 2024-10-05 benni imul bx, 80
273 a64d9d6e 2024-10-05 benni add bx, word [posx]
274 a64d9d6e 2024-10-05 benni
275 a64d9d6e 2024-10-05 benni inc dx ; 0x3D5
276 a64d9d6e 2024-10-05 benni mov al, bl
277 a64d9d6e 2024-10-05 benni out dx, al
278 a64d9d6e 2024-10-05 benni
279 a64d9d6e 2024-10-05 benni dec dx ; 0x3D4
280 a64d9d6e 2024-10-05 benni mov al, 0x0E
281 a64d9d6e 2024-10-05 benni out dx, al
282 a64d9d6e 2024-10-05 benni
283 a64d9d6e 2024-10-05 benni inc dx ; 0x3D5
284 a64d9d6e 2024-10-05 benni mov al, bh
285 a64d9d6e 2024-10-05 benni out dx, al
286 a1cd4b7f 2024-10-03 benni ret
287 4dc7f0b4 2024-10-05 benni
288 4dc7f0b4 2024-10-05 benni ; bp - str
289 4dc7f0b4 2024-10-05 benni panic:
290 4dc7f0b4 2024-10-05 benni call puts
291 a1cd4b7f 2024-10-03 benni
292 4dc7f0b4 2024-10-05 benni .halt:
293 4dc7f0b4 2024-10-05 benni cli
294 4dc7f0b4 2024-10-05 benni hlt
295 4dc7f0b4 2024-10-05 benni jmp .halt
296 4dc7f0b4 2024-10-05 benni
297 a1cd4b7f 2024-10-03 benni section .rodata
298 a1cd4b7f 2024-10-03 benni hello:
299 a64d9d6e 2024-10-05 benni db "Hello World", 10, 0
300 a1cd4b7f 2024-10-03 benni errstr:
301 a64d9d6e 2024-10-05 benni db "Error", 10, 0
302 3a5c7209 2024-10-05 benni convmsg:
303 3a5c7209 2024-10-05 benni db "Conventional memory: 0x", 0
304 3a5c7209 2024-10-05 benni xmmsg:
305 3a5c7209 2024-10-05 benni db "Extended memory: 0x", 0
306 3a5c7209 2024-10-05 benni kbmsg:
307 3a5c7209 2024-10-05 benni db " KB", 10, 0
308 a1cd4b7f 2024-10-03 benni
309 a64d9d6e 2024-10-05 benni align 2
310 a1cd4b7f 2024-10-03 benni idtr:
311 a1cd4b7f 2024-10-03 benni dw idt.end - idt - 1
312 a64d9d6e 2024-10-05 benni dd idt + 0x10000
313 a1cd4b7f 2024-10-03 benni
314 a64d9d6e 2024-10-05 benni align 2
315 a1cd4b7f 2024-10-03 benni gdtr:
316 a1cd4b7f 2024-10-03 benni dw gdt.end - gdt - 1
317 a64d9d6e 2024-10-05 benni dd gdt + 0x10000
318 a1cd4b7f 2024-10-03 benni
319 a64d9d6e 2024-10-05 benni
320 a64d9d6e 2024-10-05 benni section .data
321 a1cd4b7f 2024-10-03 benni gdt:
322 a1cd4b7f 2024-10-03 benni dq 0
323 a64d9d6e 2024-10-05 benni
324 a64d9d6e 2024-10-05 benni ; 0x08 - kernel code
325 a64d9d6e 2024-10-05 benni dw 0xffff
326 a64d9d6e 2024-10-05 benni dw 0x0000
327 a64d9d6e 2024-10-05 benni db 0x01
328 a64d9d6e 2024-10-05 benni db 0x9A
329 a64d9d6e 2024-10-05 benni dw 0x0000
330 a64d9d6e 2024-10-05 benni
331 a64d9d6e 2024-10-05 benni ; 0x10 - kernel data
332 a64d9d6e 2024-10-05 benni dw 0xffff
333 a64d9d6e 2024-10-05 benni dw 0x0000
334 a64d9d6e 2024-10-05 benni db 0x01
335 a64d9d6e 2024-10-05 benni db 0x92
336 a64d9d6e 2024-10-05 benni dw 0x0000
337 a64d9d6e 2024-10-05 benni
338 a64d9d6e 2024-10-05 benni ; 0x18 - video memory
339 a64d9d6e 2024-10-05 benni dw 4000
340 a64d9d6e 2024-10-05 benni dw 0x8000
341 a64d9d6e 2024-10-05 benni db 0x0b
342 a64d9d6e 2024-10-05 benni db 0x92
343 a64d9d6e 2024-10-05 benni dw 0x0000
344 a1cd4b7f 2024-10-03 benni .end:
345 a1cd4b7f 2024-10-03 benni
346 a1cd4b7f 2024-10-03 benni section .bss
347 a64d9d6e 2024-10-05 benni posx:
348 a64d9d6e 2024-10-05 benni resw 1
349 a64d9d6e 2024-10-05 benni posy:
350 a64d9d6e 2024-10-05 benni resw 1
351 a1cd4b7f 2024-10-03 benni bootdrv:
352 a1cd4b7f 2024-10-03 benni resb 1
353 a1cd4b7f 2024-10-03 benni convmem:
354 a1cd4b7f 2024-10-03 benni resw 1 ; in kilobytes
355 a1cd4b7f 2024-10-03 benni highmem:
356 a1cd4b7f 2024-10-03 benni resw 1 ; in kilobytes
357 a1cd4b7f 2024-10-03 benni idt:
358 a1cd4b7f 2024-10-03 benni resq 256
359 a1cd4b7f 2024-10-03 benni .end:
360 a64d9d6e 2024-10-05 benni resb 512
361 a64d9d6e 2024-10-05 benni stack: