129 lines
1.6 KiB
ArmAsm
129 lines
1.6 KiB
ArmAsm
.code16
|
|
main:
|
|
ljmp $0x0,$0x7c05
|
|
main2:
|
|
mov $0x0, %ax
|
|
mov %ax, %ds
|
|
mov %ax, %ss
|
|
mov $0x7b00, %ax
|
|
mov %ax, %sp
|
|
mov $0x500, %ax
|
|
mov %ax, %es
|
|
|
|
clc
|
|
int $0x12
|
|
mov %ax, (lower_mem)
|
|
|
|
mov $0x0, %di
|
|
call do_e820
|
|
jc hang
|
|
|
|
cli
|
|
|
|
in $0x92, %al
|
|
or $2, %al
|
|
out %al, $0x92
|
|
|
|
xor %eax, %eax
|
|
mov %ds, %ax
|
|
shl $4, %eax
|
|
add $gdt_base, %eax
|
|
mov %eax, gdtr+2
|
|
mov $gdt_end, %eax
|
|
sub $gdt_base, %eax
|
|
mov %ax, gdtr
|
|
lgdtw gdtr
|
|
|
|
mov %cr0, %eax
|
|
or $1, %eax
|
|
mov %eax, %cr0
|
|
|
|
mov $0x10, %ax
|
|
mov %ax, %ds
|
|
mov %ax, %es
|
|
mov %ax, %fs
|
|
mov %ax, %gs
|
|
mov %ax, %ss
|
|
|
|
.global kmain
|
|
ljmp $0x08,$kmain
|
|
|
|
hang:
|
|
jmp hang
|
|
|
|
do_e820:
|
|
xor %ebx, %ebx
|
|
xor %bp, %bp
|
|
mov $0x534D4150, %edx
|
|
mov $0xe820, %eax
|
|
movl $0x1,%es:20(%di)
|
|
mov $24, %ecx
|
|
int $0x15
|
|
jb do_e820.failed
|
|
mov $0x534D4150, %edx
|
|
cmp %edx, %eax
|
|
jne do_e820.failed
|
|
test %ebx, %ebx
|
|
je do_e820.failed
|
|
jmp do_e820.jmpin
|
|
do_e820.e820lp:
|
|
mov $0xe820, %eax
|
|
movl $0x1,%es:20(%di)
|
|
mov $24, %ecx
|
|
int $0x15
|
|
jb do_e820.e820f
|
|
mov $0x534D4150, %edx
|
|
do_e820.jmpin:
|
|
jcxz do_e820.skipent
|
|
cmp $20, %cl
|
|
jbe do_e820.notext
|
|
testb $0x1, %es:20(%di)
|
|
je do_e820.skipent
|
|
do_e820.notext:
|
|
mov %es:8(%di), %ecx
|
|
or %es:12(%di), %ecx
|
|
jz do_e820.skipent
|
|
inc %bp
|
|
add $24, %di
|
|
do_e820.skipent:
|
|
test %ebx, %ebx
|
|
jne do_e820.e820lp
|
|
do_e820.e820f:
|
|
mov %bp, mmap_ent
|
|
clc
|
|
ret
|
|
do_e820.failed:
|
|
stc
|
|
ret
|
|
|
|
.align 8
|
|
gdtr:
|
|
.word 0
|
|
.long 0
|
|
|
|
gdt_base:
|
|
.quad 0
|
|
.word 0xFFFF
|
|
.word 0
|
|
.byte 0
|
|
.byte 0x9a
|
|
.byte 0xcf
|
|
.byte 0
|
|
.word 0xffff
|
|
.word 0
|
|
.byte 0
|
|
.byte 0x92
|
|
.byte 0xcf
|
|
.byte 0
|
|
gdt_end:
|
|
|
|
.global mmap_ent
|
|
mmap_ent:
|
|
.byte 0
|
|
.byte 0
|
|
|
|
.global lower_mem
|
|
lower_mem:
|
|
.byte 0
|
|
.byte 0
|