4 b8971940 2024-10-05 benni %include "macros.inc"
7 c9ad2767 2024-10-07 benni .link: resw 1 ; +0x00
8 c9ad2767 2024-10-07 benni .sp0: resw 1 ; +0x02
9 c9ad2767 2024-10-07 benni .ss0: resw 1 ; +0x04
10 c9ad2767 2024-10-07 benni .sp1: resw 1 ; +0x06
11 c9ad2767 2024-10-07 benni .ss1: resw 1 ; +0x08
12 c9ad2767 2024-10-07 benni .sp2: resw 1 ; +0x0a
13 c9ad2767 2024-10-07 benni .ss2: resw 1 ; +0x0c
14 c9ad2767 2024-10-07 benni .ip: resw 1 ; +0x0e
15 c9ad2767 2024-10-07 benni .flags: resw 1 ; +0x10
16 c9ad2767 2024-10-07 benni .ax: resw 1 ; +0x12
17 c9ad2767 2024-10-07 benni .cx: resw 1 ; +0x14
18 c9ad2767 2024-10-07 benni .dx: resw 1 ; +0x16
19 c9ad2767 2024-10-07 benni .bx: resw 1 ; +0x18
20 c9ad2767 2024-10-07 benni .sp: resw 1 ; +0x1a
21 c9ad2767 2024-10-07 benni .bp: resw 1 ; +0x1c
22 c9ad2767 2024-10-07 benni .si: resw 1 ; +0x1e
23 c9ad2767 2024-10-07 benni .di: resw 1 ; +0x20
24 c9ad2767 2024-10-07 benni .es: resw 1 ; +0x22
25 c9ad2767 2024-10-07 benni .cs: resw 1 ; +0x24
26 c9ad2767 2024-10-07 benni .ss: resw 1 ; +0x26
27 c9ad2767 2024-10-07 benni .ds: resw 1 ; +0x28
28 c9ad2767 2024-10-07 benni .ldtr: resw 1 ; +0x2a
29 c9ad2767 2024-10-07 benni .size: ; +0x2c
32 a1cd4b7f 2024-10-03 benni section .text
33 9990f831 2024-10-05 benni extern floppy_init
34 a1cd4b7f 2024-10-03 benni global _entry
35 9990f831 2024-10-05 benni global putchar
36 9990f831 2024-10-05 benni global puts
37 9990f831 2024-10-05 benni global puthexb
38 9990f831 2024-10-05 benni global puthexw
39 9990f831 2024-10-05 benni global panic
42 a1cd4b7f 2024-10-03 benni mov byte [bootdrv], dl
44 79ff103d 2024-10-07 benni ; copy user task into 0x2000:0
45 79ff103d 2024-10-07 benni mov ax, 0x2000
48 79ff103d 2024-10-07 benni lea si, [user]
49 79ff103d 2024-10-07 benni lea cx, [user.end - user]
52 a64d9d6e 2024-10-05 benni ; clear screen
53 a64d9d6e 2024-10-05 benni mov bx, 0xb800
56 a64d9d6e 2024-10-05 benni mov ax, (' ' | (0x07 << 8))
57 a64d9d6e 2024-10-05 benni mov cx, (80 * 25 * 2)
60 a1cd4b7f 2024-10-03 benni ; get size of conventional memory (below 640K)
62 a1cd4b7f 2024-10-03 benni mov word [convmem], ax
64 a1cd4b7f 2024-10-03 benni ; get size of extended memory (above 1M)
65 a1cd4b7f 2024-10-03 benni mov ah, 0x88
68 a1cd4b7f 2024-10-03 benni mov word [highmem], ax
71 ce2fe607 2024-10-05 benni ; NOTE: BIOS cannot be accessed from here
74 ce2fe607 2024-10-05 benni ; disable keyboard
76 ce2fe607 2024-10-05 benni mov al, 0xAD
77 ce2fe607 2024-10-05 benni out 0x64, al
79 ce2fe607 2024-10-05 benni ; read from input
81 ce2fe607 2024-10-05 benni mov al, 0xD0
82 ce2fe607 2024-10-05 benni out 0x64, al
83 ce2fe607 2024-10-05 benni call .wait2
84 ce2fe607 2024-10-05 benni in al, 0x60
87 ce2fe607 2024-10-05 benni ; write to output
89 ce2fe607 2024-10-05 benni mov al,0xD1
90 ce2fe607 2024-10-05 benni out 0x64,al
93 ce2fe607 2024-10-05 benni or al, 2 ; enable A20 line
94 ce2fe607 2024-10-05 benni out 0x60, al
96 ce2fe607 2024-10-05 benni ; enable keyboard
98 ce2fe607 2024-10-05 benni mov al, 0xAE
99 ce2fe607 2024-10-05 benni out 0x64, al
100 ce2fe607 2024-10-05 benni call .wait
101 ce2fe607 2024-10-05 benni jmp .setup
104 ce2fe607 2024-10-05 benni in al,0x64
105 ce2fe607 2024-10-05 benni test al, 2
111 ce2fe607 2024-10-05 benni in al,0x64
117 a64d9d6e 2024-10-05 benni lidt [idtr]
118 a64d9d6e 2024-10-05 benni lgdt [gdtr]
122 0f506373 2024-10-07 benni jmp (gdt.text - gdt):.reloadcs
124 50eedbae 2024-10-05 benni .reloadcs:
125 a64d9d6e 2024-10-05 benni lea sp, [stack]
126 0f506373 2024-10-07 benni lea ax, [gdt.data - gdt]
127 a64d9d6e 2024-10-05 benni mov ds, ax
128 a64d9d6e 2024-10-05 benni mov es, ax
129 a64d9d6e 2024-10-05 benni mov ss, ax
131 50eedbae 2024-10-05 benni ; initialize PIC
132 50eedbae 2024-10-05 benni outb_slow 0x20, 0x11 ; Start the initialization routine (in cascae mode)
133 50eedbae 2024-10-05 benni outb_slow 0xA0, 0x11
134 50eedbae 2024-10-05 benni outb_slow 0x21, 0x20 ; Master PIC IRQ offset
135 50eedbae 2024-10-05 benni outb_slow 0xA1, 0x28 ; Slave PIC IRQ offset
136 50eedbae 2024-10-05 benni outb_slow 0x21, 4 ; Tell the master PIC that there is a slave PIC at IRQ2
137 50eedbae 2024-10-05 benni outb_slow 0xA1, 2 ; Tell the slave PIC it's cascade identity
138 50eedbae 2024-10-05 benni outb_slow 0x21, 1 ; Use the 8086-mode (and not the 8088 mode)
139 50eedbae 2024-10-05 benni outb_slow 0xA1, 1
140 50eedbae 2024-10-05 benni outb_slow 0x21, 0xfe ; Set the IRQ masks
141 50eedbae 2024-10-05 benni outb_slow 0xA1, 0xff
143 50eedbae 2024-10-05 benni ; initialize IDT
144 50eedbae 2024-10-05 benni mov al, 0x20
145 50eedbae 2024-10-05 benni mov ah, 0x86
146 50eedbae 2024-10-05 benni lea dx, [i_timer]
147 50eedbae 2024-10-05 benni call set_irq
148 79ff103d 2024-10-07 benni mov al, 0x80
149 79ff103d 2024-10-07 benni mov ah, 0xe6
150 79ff103d 2024-10-07 benni lea dx, [i_sys]
151 79ff103d 2024-10-07 benni call set_irq
153 3a5c7209 2024-10-05 benni lea bp, [convmsg]
155 3a5c7209 2024-10-05 benni mov ax, word [convmem]
156 3a5c7209 2024-10-05 benni call puthexw
157 3a5c7209 2024-10-05 benni lea bp, [kbmsg]
160 3a5c7209 2024-10-05 benni lea bp, [xmmsg]
162 3a5c7209 2024-10-05 benni mov ax, word [highmem]
163 3a5c7209 2024-10-05 benni call puthexw
164 3a5c7209 2024-10-05 benni lea bp, [kbmsg]
167 9990f831 2024-10-05 benni call floppy_init
169 c9ad2767 2024-10-07 benni ; set up TSS
170 c9ad2767 2024-10-07 benni mov word [tss + TSS.link], 0
171 c9ad2767 2024-10-07 benni mov word [tss + TSS.sp0], stack
172 0f506373 2024-10-07 benni mov word [tss + TSS.ss0], (gdt.data - gdt)
174 c9ad2767 2024-10-07 benni ; load TSS into TR
175 c9ad2767 2024-10-07 benni lea ax, [gdt.tss - gdt]
178 5cd42ecd 2024-10-07 benni ; load LDT
179 5cd42ecd 2024-10-07 benni lea ax, [gdt.ldt - gdt]
182 e3a03814 2024-10-07 benni ; enter userspace, TODO: enter ring 3
183 79ff103d 2024-10-07 benni mov ax, 0x0f ; LDT .data
184 e3a03814 2024-10-07 benni mov ds, ax
185 74abebce 2024-10-07 benni mov es, ax
186 79ff103d 2024-10-07 benni push 0x17 ; ss (LDT .stack)
187 79ff103d 2024-10-07 benni push 0xfffe ; sp
188 0f506373 2024-10-07 benni push 0x202 ; flags (EI | 0x02)
189 79ff103d 2024-10-07 benni push 0x07 ; cs (LDT .text)
190 79ff103d 2024-10-07 benni push 0 ; ip
198 79ff103d 2024-10-07 benni mov ax, (gdt.data - gdt)
199 79ff103d 2024-10-07 benni mov ds, ax
200 79ff103d 2024-10-07 benni mov es, ax
202 50eedbae 2024-10-05 benni mov al, '.'
203 50eedbae 2024-10-05 benni call putchar
205 50eedbae 2024-10-05 benni outb 0x20, 0x20
211 79ff103d 2024-10-07 benni ; ds:si - from
212 79ff103d 2024-10-07 benni ; es:di - to
213 79ff103d 2024-10-07 benni ; cx - count
214 79ff103d 2024-10-07 benni copy_from_user:
218 79ff103d 2024-10-07 benni i_sys: ; syscall interrupt (0x80)
222 ae4ed8c5 2024-10-07 benni ; load kernel .data into es
224 79ff103d 2024-10-07 benni mov ax, (gdt.data - gdt)
225 79ff103d 2024-10-07 benni mov es, ax
228 79ff103d 2024-10-07 benni test ax, ax
231 79ff103d 2024-10-07 benni ; invalid interrupt
232 79ff103d 2024-10-07 benni mov ax, -1
238 79ff103d 2024-10-07 benni mov si, bx
239 79ff103d 2024-10-07 benni lea di, [ubuf]
240 79ff103d 2024-10-07 benni ; TODO: check that cx < sizeof(ubuf)
241 79ff103d 2024-10-07 benni call copy_from_user
243 79ff103d 2024-10-07 benni mov byte [ubuf + bx], 0
245 ae4ed8c5 2024-10-07 benni ; load kernel .data into ds & es
246 79ff103d 2024-10-07 benni lea ax, [gdt.data - gdt]
247 79ff103d 2024-10-07 benni mov ds, ax
248 79ff103d 2024-10-07 benni mov es, ax
250 79ff103d 2024-10-07 benni lea bp, [ubuf]
252 79ff103d 2024-10-07 benni xor ax, ax
260 50eedbae 2024-10-05 benni ; al - num
261 50eedbae 2024-10-05 benni ; ah - attr
262 50eedbae 2024-10-05 benni ; dx - offset
264 50eedbae 2024-10-05 benni xor bh, bh
265 50eedbae 2024-10-05 benni mov bl, al
267 50eedbae 2024-10-05 benni lea bx, [idt + bx]
268 50eedbae 2024-10-05 benni mov word [bx + 0], dx
269 0f506373 2024-10-07 benni mov word [bx + 2], (gdt.text - gdt)
270 50eedbae 2024-10-05 benni mov byte [bx + 4], 0x00
271 50eedbae 2024-10-05 benni mov byte [bx + 5], ah
272 50eedbae 2024-10-05 benni mov word [bx + 6], 0
277 a1cd4b7f 2024-10-03 benni lea bp, [errstr]
282 3a5c7209 2024-10-05 benni ; ax - value
285 3a5c7209 2024-10-05 benni mov al, ah
286 3a5c7209 2024-10-05 benni call puthexb
288 3a5c7209 2024-10-05 benni jmp puthexb
290 3a5c7209 2024-10-05 benni ; al - value
294 3a5c7209 2024-10-05 benni call puthexch
296 3a5c7209 2024-10-05 benni and al, 0xf
297 3a5c7209 2024-10-05 benni jmp puthexch
299 3a5c7209 2024-10-05 benni ; al - hex digit
301 3a5c7209 2024-10-05 benni cmp al, 10
303 3a5c7209 2024-10-05 benni add al, '0'
304 3a5c7209 2024-10-05 benni jmp putchar
307 3a5c7209 2024-10-05 benni add al, 'a' - 10
308 3a5c7209 2024-10-05 benni jmp putchar
310 a64d9d6e 2024-10-05 benni ; al - char
312 0f506373 2024-10-07 benni lea bx, [gdt.vid - gdt]
313 a64d9d6e 2024-10-05 benni mov es, bx
315 a64d9d6e 2024-10-05 benni xor ch, ch
316 a64d9d6e 2024-10-05 benni xor dh, dh
317 a64d9d6e 2024-10-05 benni mov cl, byte [posx]
318 a64d9d6e 2024-10-05 benni mov dl, byte [posy]
320 a64d9d6e 2024-10-05 benni cmp al, 10 ; '\n'
323 a64d9d6e 2024-10-05 benni imul bx, dx, 80
324 a64d9d6e 2024-10-05 benni add bx, cx
326 a64d9d6e 2024-10-05 benni mov byte [es:bx], al
329 a64d9d6e 2024-10-05 benni cmp cl, 80
331 a64d9d6e 2024-10-05 benni mov byte [posx], cl
335 a64d9d6e 2024-10-05 benni mov byte [posx], 0
338 a64d9d6e 2024-10-05 benni cmp dl, 25
339 a64d9d6e 2024-10-05 benni je .scroll
340 a64d9d6e 2024-10-05 benni mov byte [posy], dl
345 b6729e0b 2024-10-05 benni mov ax, 0x18
346 b6729e0b 2024-10-05 benni mov ds, ax
349 a64d9d6e 2024-10-05 benni xor di, di
350 b6729e0b 2024-10-05 benni mov si, 160
351 b6729e0b 2024-10-05 benni mov cx, 80 * 24
356 b6729e0b 2024-10-05 benni mov di, 80 * 24 * 2
357 b6729e0b 2024-10-05 benni mov cx, 80
358 a64d9d6e 2024-10-05 benni mov ax, (' ' | (0x07 << 8))
360 a64d9d6e 2024-10-05 benni mov byte [posy], 24
365 50eedbae 2024-10-05 benni call writech
366 50eedbae 2024-10-05 benni jmp update_cursor
368 a64d9d6e 2024-10-05 benni ; bp - str
370 a1cd4b7f 2024-10-03 benni mov al, byte [ds:bp]
372 a1cd4b7f 2024-10-03 benni test al, al
373 50eedbae 2024-10-05 benni jz update_cursor
375 50eedbae 2024-10-05 benni call writech
378 50eedbae 2024-10-05 benni update_cursor:
379 a64d9d6e 2024-10-05 benni mov dx, 0x3D4
380 a64d9d6e 2024-10-05 benni mov al, 0x0f
381 a64d9d6e 2024-10-05 benni out dx, al
383 a64d9d6e 2024-10-05 benni mov bx, word [posy]
384 a64d9d6e 2024-10-05 benni imul bx, 80
385 a64d9d6e 2024-10-05 benni add bx, word [posx]
387 a64d9d6e 2024-10-05 benni inc dx ; 0x3D5
388 a64d9d6e 2024-10-05 benni mov al, bl
389 a64d9d6e 2024-10-05 benni out dx, al
391 a64d9d6e 2024-10-05 benni dec dx ; 0x3D4
392 a64d9d6e 2024-10-05 benni mov al, 0x0E
393 a64d9d6e 2024-10-05 benni out dx, al
395 a64d9d6e 2024-10-05 benni inc dx ; 0x3D5
396 a64d9d6e 2024-10-05 benni mov al, bh
397 a64d9d6e 2024-10-05 benni out dx, al
400 4dc7f0b4 2024-10-05 benni ; bp - str
409 a1cd4b7f 2024-10-03 benni section .rodata
411 79ff103d 2024-10-07 benni incbin "user.bin"
414 a64d9d6e 2024-10-05 benni db "Hello World", 10, 0
416 a64d9d6e 2024-10-05 benni db "Error", 10, 0
418 3a5c7209 2024-10-05 benni db "Conventional memory: 0x", 0
420 3a5c7209 2024-10-05 benni db "Extended memory: 0x", 0
422 3a5c7209 2024-10-05 benni db " KB", 10, 0
426 a1cd4b7f 2024-10-03 benni dw idt.end - idt - 1
427 a64d9d6e 2024-10-05 benni dd idt + 0x10000
431 a1cd4b7f 2024-10-03 benni dw gdt.end - gdt - 1
432 a64d9d6e 2024-10-05 benni dd gdt + 0x10000
435 a64d9d6e 2024-10-05 benni section .data
439 c9ad2767 2024-10-07 benni .text: ; 0x08 - kernel code
446 c9ad2767 2024-10-07 benni .data: ; 0x10 - kernel data
453 c9ad2767 2024-10-07 benni .vid: ; 0x18 - video memory
460 c9ad2767 2024-10-07 benni .tss: ; 0x20 - TSS
461 c9ad2767 2024-10-07 benni dw TSS.size
467 5cd42ecd 2024-10-07 benni .ldt: ; 0x28 - LDT
468 5cd42ecd 2024-10-07 benni dw (ldt.end - ldt)
476 5cd42ecd 2024-10-07 benni .text: ; 0x07 - user code
483 5cd42ecd 2024-10-07 benni .data: ; 0x0f - user data
490 5cd42ecd 2024-10-07 benni .stack: ; 0x17 - user stack
498 a1cd4b7f 2024-10-03 benni section .bss
508 a1cd4b7f 2024-10-03 benni resw 1 ; in kilobytes
510 a1cd4b7f 2024-10-03 benni resw 1 ; in kilobytes
517 c9ad2767 2024-10-07 benni resb TSS.size