Curle
4edd4b7cc8
All ISR/IRQ stuff moved into its own header and source. Comments added on all major parts. Some optimisations in important functions. All ASM removed for ISR and IRQ, instead using new GCC directives.
95 lines
2.3 KiB
ArmAsm
Executable File
95 lines
2.3 KiB
ArmAsm
Executable File
[BITS 32] ;... somehow.
|
|
|
|
[GLOBAL start]
|
|
start:
|
|
mov esp, _sys_stack ; Stack pointer!
|
|
jmp stublet ; This has a purpse. I don't know what it is, but there is one.
|
|
|
|
ALIGN 4 ; 4KB alignment, required by GRUB.
|
|
mboot: ; This is all magic, and all of it required for GRUB to see our stuff.
|
|
MULTIBOOT_ALIGN equ 1<<0
|
|
MULTIBOOT_MEM equ 1<<1
|
|
MULTIBOOT_AOUT equ 1<<16
|
|
MULTIBOOT_MAGIC equ 0x1BADB002
|
|
MULTIBOOT_FLAGS equ MULTIBOOT_ALIGN | MULTIBOOT_MEM | MULTIBOOT_AOUT
|
|
MULTIBOOT_CHECKSUM equ -(MULTIBOOT_MAGIC + MULTIBOOT_FLAGS)
|
|
EXTERN code, bss, end
|
|
|
|
dd MULTIBOOT_MAGIC
|
|
dd MULTIBOOT_FLAGS
|
|
dd MULTIBOOT_CHECKSUM
|
|
|
|
dd mboot
|
|
dd code
|
|
dd bss
|
|
dd end
|
|
dd start
|
|
|
|
stublet: ; Where the kernel stuff goes.
|
|
|
|
;=====================================
|
|
;===Priority: 32 bit Protected Mode===
|
|
;=====================================
|
|
|
|
cli ; Interrupts be gone!
|
|
|
|
xor cx, cx ; CX - GP, useful here.
|
|
kbempty:
|
|
in al, 64h ; Read keyboard status
|
|
test al, 02h ; Check if the buffer is full
|
|
loopnz kbempty ; Wait until it is
|
|
mov al, 0d1h ; Prepare a message
|
|
out 64h, al ; And then send it to the keyboard (controller)
|
|
kbempty2:
|
|
in al, 64h ; Read the status again
|
|
test al, 02h ; Check if it's processed our message
|
|
loopnz kbempty2 ; And wait until it has
|
|
mov al, 0dfh ; Prepare a different message, telling it to enable A20
|
|
out 60h, al ; Send the message
|
|
mov cx, 14h ; Restore the value of CX
|
|
wait_kb: ; Insinuate a 25uS delay to allow the processor to catch up
|
|
out 0edh, ax
|
|
loop wait_kb
|
|
|
|
mov eax, cr0 ; Read the control register
|
|
or al, 1 ; Set bit 1: protected mode
|
|
mov cr0, eax ; Set the control register back
|
|
jmp $+2 ; Clear the queue
|
|
nop ; (jump straight to kernel)
|
|
nop
|
|
|
|
;==================================
|
|
;===32-bit Protected Mode active===
|
|
;==================================
|
|
; Call the kernel
|
|
|
|
EXTERN kernel_main
|
|
call kernel_main
|
|
jmp $
|
|
|
|
[GLOBAL load_gdt]
|
|
[EXTERN gp]
|
|
load_gdt:
|
|
lgdt [gp] ; Load the new GDT pointer
|
|
|
|
mov ax, 0x10
|
|
mov ds, ax
|
|
mov es, ax
|
|
mov fs, ax
|
|
mov gs, ax
|
|
mov ss, ax
|
|
jmp 0x08:flush
|
|
flush:
|
|
ret
|
|
|
|
[GLOBAL idt_load]
|
|
[EXTERN idtp]
|
|
idt_load:
|
|
lidt [idtp]
|
|
ret
|
|
|
|
|
|
SECTION .bss
|
|
resb 8192
|
|
_sys_stack:
|