protected mode works, return to real-mode triple faults
authorJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 1 Oct 2023 05:46:41 +0000 (08:46 +0300)
committerJohn Tsiombikas <nuclear@member.fsf.org>
Sun, 1 Oct 2023 05:46:41 +0000 (08:46 +0300)
com32.ld
src/loader.asm
src/startup.asm

index 4771389..b83e861 100644 (file)
--- a/com32.ld
+++ b/com32.ld
@@ -8,24 +8,27 @@ SECTIONS {
 
        . = ALIGN(4);
        _ldr_main_start = .;
+       _ldr_main_end = _ldr_main_start + _main_size;
 
        /* main program will be moved to 2MB by the loader */
        . = 2M;
-       _main_start = .;
-       .startup : { * (.startup); }
-       .text : { * (.text*); }
-       .rodata : { * (.rodata*); }
-       .data : { * (.data*); }
+       main ALIGN(4): AT (_ldr_main_start) {
+               _main_start = .;
+               * (.startup);
+               * (.text*);
+               * (.rodata*);
+               * (.data*);
 
-       .bss ALIGN(4): {
+               . = ALIGN(4);
                _bss_start = .;
                * (.bss*);
                * (COMMON);
                . = ALIGN(4);
                _bss_end = .;
+               _bss_size = _bss_end - _bss_start;
        }
-       _bss_size = SIZEOF(.bss);
 
+       . = ALIGN(4);
        _main_size = . - _main_start;
        _mem_start = .;
 }
index 18bd286..b0c13d6 100644 (file)
@@ -73,14 +73,14 @@ _start:
        cld
        mov esi, _ldr_main_start
        mov edi, _main_start
-       lea ecx, [_main_size + 3]
+       mov ecx, _main_size + 3
        shr ecx, 2
        rep movsd
 
        mov ax, 10h
        mov ds, ax
        mov ss, ax
-       mov esp, 200000h
+       mov esp, _main_start
 
        call 8:startup
 
@@ -92,7 +92,7 @@ _start:
        and ax, 0xfffe
        mov cr0, eax
 .jmpcs16:
-       jmp 42h:.loadcs16       ; 42 seg is modifed at the start (TODO)
+       jmp 42h:.loadcs16       ; 42 seg is modifed at the start
 .loadcs16:
        mov ax, fs
        mov ds, ax
@@ -218,19 +218,19 @@ gdt_base dd 0xbadf00d     ; space for GDT linear address
 gdt:   ; 0: null segment
        dd 0
        dd 0
-       ; 1: code - 0/lim:4g, G:4k, 32bit, avl, pres|app, dpl:0, type:code/non-conf/rd
+       ; 1: code - 0/lim:4g, G:4k, 32bit, avl, pres|app, dpl:0, type:code/non-conf/rd (sel: 8)
        dd 0000ffffh
        dd 00cf9a00h
-       ; 2: data - 0/lim:4g, G:4k, 32bit, avl, pres|app, dpl:0, type:data/rw
+       ; 2: data - 0/lim:4g, G:4k, 32bit, avl, pres|app, dpl:0, type:data/rw (sel: 10h)
        dd 0000ffffh
        dd 00cf9200h
-       ; 3: tmp code (will set base before entering pmode)
+       ; 3: tmp code (will set base before entering pmode) (sel: 18h)
        dd 0000ffffh
        dd 00cf9a00h
-       ; 4: tmp data (will set base before entering pmode)
+       ; 4: tmp data (will set base before entering pmode) (sel: 20h)
        dd 0000ffffh
        dd 00cf9200h
-       ; 5: return to real-mode 16bit code segment
+       ; 5: return to real-mode 16bit code segment (sel: 28h)
        dd 0000ffffh
        dd 00009a00h
 
index 99cbf6c..56e25b4 100644 (file)
@@ -5,6 +5,11 @@
 startup:
        mov ebx, 0xb8000
        mov byte [ebx], '@'
+.waitkey:
+       in al, 64h
+       test al, 1
+       jz .waitkey
+       in al, 60h
        ret
 
 ; vi:set ts=8 sts=8 sw=8 ft=nasm: