4 b8971940 2024-10-05 benni %include "macros.inc"
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
16 a1cd4b7f 2024-10-03 benni mov byte [bootdrv], dl
18 a64d9d6e 2024-10-05 benni ; clear screen
19 a64d9d6e 2024-10-05 benni mov bx, 0xb800
22 a64d9d6e 2024-10-05 benni mov ax, (' ' | (0x07 << 8))
23 a64d9d6e 2024-10-05 benni mov cx, (80 * 25 * 2)
26 a1cd4b7f 2024-10-03 benni ; get size of conventional memory (below 640K)
28 a1cd4b7f 2024-10-03 benni mov word [convmem], ax
30 a1cd4b7f 2024-10-03 benni ; get size of extended memory (above 1M)
31 a1cd4b7f 2024-10-03 benni mov ah, 0x88
34 a1cd4b7f 2024-10-03 benni mov word [highmem], ax
37 ce2fe607 2024-10-05 benni ; NOTE: BIOS cannot be accessed from here
40 ce2fe607 2024-10-05 benni ; disable keyboard
42 ce2fe607 2024-10-05 benni mov al, 0xAD
43 ce2fe607 2024-10-05 benni out 0x64, al
45 ce2fe607 2024-10-05 benni ; read from input
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
53 ce2fe607 2024-10-05 benni ; write to output
55 ce2fe607 2024-10-05 benni mov al,0xD1
56 ce2fe607 2024-10-05 benni out 0x64,al
59 ce2fe607 2024-10-05 benni or al, 2 ; enable A20 line
60 ce2fe607 2024-10-05 benni out 0x60, al
62 ce2fe607 2024-10-05 benni ; enable keyboard
64 ce2fe607 2024-10-05 benni mov al, 0xAE
65 ce2fe607 2024-10-05 benni out 0x64, al
83 a64d9d6e 2024-10-05 benni lidt [idtr]
84 a64d9d6e 2024-10-05 benni lgdt [gdtr]
88 50eedbae 2024-10-05 benni jmp 0x08:.reloadcs
91 a64d9d6e 2024-10-05 benni lea sp, [stack]
92 a64d9d6e 2024-10-05 benni mov ax, 0x10
97 50eedbae 2024-10-05 benni out 0x80, al
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
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
117 a1cd4b7f 2024-10-03 benni lea bp, [hello]
120 3a5c7209 2024-10-05 benni lea bp, [convmsg]
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]
127 3a5c7209 2024-10-05 benni lea bp, [xmmsg]
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]
134 9990f831 2024-10-05 benni call floppy_init
141 50eedbae 2024-10-05 benni mov al, '.'
142 50eedbae 2024-10-05 benni call putchar
144 50eedbae 2024-10-05 benni outb 0x20, 0x20
148 50eedbae 2024-10-05 benni ; al - num
149 50eedbae 2024-10-05 benni ; ah - attr
150 50eedbae 2024-10-05 benni ; dx - offset
152 50eedbae 2024-10-05 benni xor bh, bh
153 50eedbae 2024-10-05 benni mov bl, al
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
165 a1cd4b7f 2024-10-03 benni lea bp, [errstr]
170 3a5c7209 2024-10-05 benni ; ax - value
173 3a5c7209 2024-10-05 benni mov al, ah
174 3a5c7209 2024-10-05 benni call puthexb
176 3a5c7209 2024-10-05 benni jmp puthexb
178 3a5c7209 2024-10-05 benni ; al - value
182 3a5c7209 2024-10-05 benni call puthexch
184 3a5c7209 2024-10-05 benni and al, 0xf
185 3a5c7209 2024-10-05 benni jmp puthexch
187 3a5c7209 2024-10-05 benni ; al - hex digit
189 3a5c7209 2024-10-05 benni cmp al, 10
191 3a5c7209 2024-10-05 benni add al, '0'
192 3a5c7209 2024-10-05 benni jmp putchar
195 3a5c7209 2024-10-05 benni add al, 'a' - 10
196 3a5c7209 2024-10-05 benni jmp putchar
198 a64d9d6e 2024-10-05 benni ; al - char
200 a64d9d6e 2024-10-05 benni mov bx, 0x18
201 a64d9d6e 2024-10-05 benni mov es, bx
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]
208 a64d9d6e 2024-10-05 benni cmp al, 10 ; '\n'
211 a64d9d6e 2024-10-05 benni imul bx, dx, 80
212 a64d9d6e 2024-10-05 benni add bx, cx
214 a64d9d6e 2024-10-05 benni mov byte [es:bx], al
217 a64d9d6e 2024-10-05 benni cmp cl, 80
219 a64d9d6e 2024-10-05 benni mov byte [posx], cl
223 a64d9d6e 2024-10-05 benni mov byte [posx], 0
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
233 b6729e0b 2024-10-05 benni mov ax, 0x18
234 b6729e0b 2024-10-05 benni mov ds, ax
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
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))
248 a64d9d6e 2024-10-05 benni mov byte [posy], 24
253 50eedbae 2024-10-05 benni call writech
254 50eedbae 2024-10-05 benni jmp update_cursor
256 a64d9d6e 2024-10-05 benni ; bp - str
258 a1cd4b7f 2024-10-03 benni mov al, byte [ds:bp]
260 a1cd4b7f 2024-10-03 benni test al, al
261 50eedbae 2024-10-05 benni jz update_cursor
263 50eedbae 2024-10-05 benni call writech
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
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]
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
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
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
288 4dc7f0b4 2024-10-05 benni ; bp - str
297 a1cd4b7f 2024-10-03 benni section .rodata
299 a64d9d6e 2024-10-05 benni db "Hello World", 10, 0
301 a64d9d6e 2024-10-05 benni db "Error", 10, 0
303 3a5c7209 2024-10-05 benni db "Conventional memory: 0x", 0
305 3a5c7209 2024-10-05 benni db "Extended memory: 0x", 0
307 3a5c7209 2024-10-05 benni db " KB", 10, 0
311 a1cd4b7f 2024-10-03 benni dw idt.end - idt - 1
312 a64d9d6e 2024-10-05 benni dd idt + 0x10000
316 a1cd4b7f 2024-10-03 benni dw gdt.end - gdt - 1
317 a64d9d6e 2024-10-05 benni dd gdt + 0x10000
320 a64d9d6e 2024-10-05 benni section .data
324 a64d9d6e 2024-10-05 benni ; 0x08 - kernel code
331 a64d9d6e 2024-10-05 benni ; 0x10 - kernel data
338 a64d9d6e 2024-10-05 benni ; 0x18 - video memory
346 a1cd4b7f 2024-10-03 benni section .bss
354 a1cd4b7f 2024-10-03 benni resw 1 ; in kilobytes
356 a1cd4b7f 2024-10-03 benni resw 1 ; in kilobytes