diff --git a/Qcommon.c b/Qcommon.c index 4965d6b..4221576 100644 --- a/Qcommon.c +++ b/Qcommon.c @@ -40,12 +40,23 @@ void serial_write(const char *msg) } extern void bios_write(const char *msg, unsigned length); +extern void *bios_getmap(void *buffer); + +unsigned char memmap[24 * 128]; void main() { bios_write("init\r\n", 6); + void *end = bios_getmap(memmap); bios_write("karlos\r\n", 8); + for (int i = 0; ; i++) { + unsigned char *entry = memmap + 24 * i; + if (entry >= end) break; + unsigned char type = *(entry + 16); + char c = type < 10 ? type + '0' : '?'; + bios_write(&c, 1); + } for (;;) { __asm__ ("hlt" :); } diff --git a/Rnbp.S b/Rnbp.S index 418bc83..09a82aa 100644 --- a/Rnbp.S +++ b/Rnbp.S @@ -1,4 +1,4 @@ - // vim: et:sw=12:ts=12:sts=12 + // vim: ft=gas:et:sw=12:ts=12:sts=12 .global _start @@ -13,6 +13,7 @@ .code32 mov $SS_DATA16, %ax mov %ax, %ds + mov %ax, %es mov %ax, %ss ljmp $SS_CODE16, $9f 9: .code16 @@ -22,6 +23,7 @@ .code16 mov $SS_DATA32, %ax mov %ax, %ds + mov %ax, %es mov %ax, %ss ljmp $SS_CODE32, $9f 9: .code32 @@ -164,6 +166,45 @@ bios_write: push %ebp pop %ebp ret + .global bios_getmap + .code32 +bios_getmap:push %ebp + mov %esp, %ebp + push %ebx + push %edi + + mov 8+0(%ebp), %edi + + PROT16 + .code16 + REAL + + xor %ebx, %ebx +_gmnext: movl $0, 20(%di) + mov $0x534D4150, %edx // e820 magic number + mov $24, %ecx + mov $0xE820, %eax + int $0x15 + jc _gmdone + test %ebx, %ebx + jz _gmdone + add $24, %di + jmp _gmnext +_gmdone: add $24, %di + + + PROT + PROT32 + .code32 + + mov %edi, %eax + + pop %edi + pop %ebx + mov %ebp, %esp + pop %ebp + ret + .data real_ss: .word 0