Files
kern/src/entry.asm
T

368 lines
4.4 KiB
NASM

[bits 32]
[global _start]
[global driveNum]
[extern main]
[extern idtp]
[extern faultHandler]
[extern irqHandler]
;; Calls the main function in 'main.c'
_start:
pop ax
mov [driveNum], al
call main
; Exit QEMU
mov ax, 0x2000
mov dx, 0x0604
out dx, ax
jmp $ ;; If we used cli, hlt we wouldn't have interrupts :/
driveNum: db 0
;;
;; --- IDT ---
;;
[global idtLoad]
idtLoad:
lidt [idtp]
ret
;; Isrs (exceptions)
[global isr0]
isr0:
cli
push 0
push 0
jmp isrCommon
[global isr1]
isr1:
cli
push 0
push 1
jmp isrCommon
[global isr2]
isr2:
cli
push 0
push 2
jmp isrCommon
[global isr3]
isr3:
cli
push 0
push 3
jmp isrCommon
[global isr4]
isr4:
cli
push 0
push 4
jmp isrCommon
[global isr5]
isr5:
cli
push 0
push 5
jmp isrCommon
[global isr6]
isr6:
cli
push 0
push 6
jmp isrCommon
[global isr7]
isr7:
cli
push 0
push 7
jmp isrCommon
[global isr8]
isr8:
cli
push 8
jmp isrCommon
[global isr9]
isr9:
cli
push 0
push 9
jmp isrCommon
[global isr10]
isr10:
cli
push 10
jmp isrCommon
[global isr11]
isr11:
cli
push 11
jmp isrCommon
[global isr12]
isr12:
cli
push 12
jmp isrCommon
[global isr13]
isr13:
cli
push 13
jmp isrCommon
[global isr14]
isr14:
cli
push 14
jmp isrCommon
[global isr15]
isr15:
cli
push 0
push 15
jmp isrCommon
[global isr16]
isr16:
cli
push 0
push 16
jmp isrCommon
[global isr17]
isr17:
cli
push 0
push 17
jmp isrCommon
[global isr18]
isr18:
cli
push 0
push 18
jmp isrCommon
[global isr19]
isr19:
cli
push 0
push 19
jmp isrCommon
[global isr20]
isr20:
cli
push 0
push 20
jmp isrCommon
[global isr21]
isr21:
cli
push 0
push 21
jmp isrCommon
[global isr22]
isr22:
cli
push 0
push 22
jmp isrCommon
[global isr23]
isr23:
cli
push 0
push 23
jmp isrCommon
[global isr24]
isr24:
cli
push 0
push 24
jmp isrCommon
[global isr25]
isr25:
cli
push 0
push 25
jmp isrCommon
[global isr26]
isr26:
cli
push 0
push 26
jmp isrCommon
[global isr27]
isr27:
cli
push 0
push 27
jmp isrCommon
[global isr28]
isr28:
cli
push 0
push 28
jmp isrCommon
[global isr29]
isr29:
cli
push 0
push 29
jmp isrCommon
[global isr30]
isr30:
cli
push 0
push 30
jmp isrCommon
[global isr31]
isr31:
cli
push 0
push 31
jmp isrCommon
isrCommon: ; No clue how this works, i'm pretty sure it calls the C function and has to push the registers or something idk
pusha
push ds
push es
push fs
push gs
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov eax, esp
push eax
mov eax, faultHandler
call eax
pop eax
pop gs
pop fs
pop es
pop ds
popa
add esp, 8
iret
;; IRQs
[global irq0]
irq0:
cli
push 0
push 32
jmp irqCommon
[global irq1]
irq1:
cli
push 0
push 33
jmp irqCommon
[global irq2]
irq2:
cli
push 0
push 34
jmp irqCommon
[global irq3]
irq3:
cli
push 0
push 35
jmp irqCommon
[global irq4]
irq4:
cli
push 0
push 36
jmp irqCommon
[global irq5]
irq5:
cli
push 0
push 37
jmp irqCommon
[global irq6]
irq6:
cli
push 0
push 38
jmp irqCommon
[global irq7]
irq7:
cli
push 0
push 39
jmp irqCommon
[global irq8]
irq8:
cli
push 0
push 40
jmp irqCommon
[global irq9]
irq9:
cli
push 0
push 41
jmp irqCommon
[global irq10]
irq10:
cli
push 0
push 42
jmp irqCommon
[global irq11]
irq11:
cli
push 0
push 43
jmp irqCommon
[global irq12]
irq12:
cli
push 0
push 44
jmp irqCommon
[global irq13]
irq13:
cli
push 0
push 45
jmp irqCommon
[global irq14]
irq14:
cli
push 0
push 46
jmp irqCommon
[global irq15]
irq15:
cli
push 0
push 47
jmp irqCommon
irqCommon: ; Simular to isrCommon, probaly calls the C function
pusha
push ds
push es
push fs
push gs
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov eax, esp
push eax
mov eax, irqHandler
call eax
pop eax
pop gs
pop fs
pop es
pop ds
popa
add esp, 8
iret