commit a64d9d6ef94a1fe121764b0d24584975f3a515cd from: Benjamin Stürz date: Sat Oct 05 16:08:47 2024 UTC sys: implement puts(), GDT and IDT commit - 095d0ed35c3587d68ee65e3d1fd5024c2d3109fc commit + a64d9d6ef94a1fe121764b0d24584975f3a515cd blob - 51f794e345e354781f7566c0a4d659cd6aa7de07 blob + 9cccd7b79bc793815e2ede3b2acecfb8968ee503 --- sys/Makefile +++ sys/Makefile @@ -2,7 +2,7 @@ LDFLAGS = -s --no-pie OBJ = loader.o kernel.o -IMG = floppy1440.img +IMG = sys.img all: ${IMG} @@ -19,6 +19,9 @@ run: ${IMG} floppy1440.img: sys.elf objcopy -O binary --pad-to $$((2880 * 512)) sys.elf floppy1440.img +sys.img: sys.elf + objcopy -O binary --pad-to $$((128 * 512)) sys.elf sys.img + sys.elf: linker.ld ${OBJ} ld -o $@ -T linker.ld ${OBJ} ${LDFLAGS} blob - 69b9070ffb6b42d218ee011e8901e12d540393e3 blob + 3fc59d313bfdc54792f5c76e6b0537ebe2a8c3a0 --- sys/kernel.asm +++ sys/kernel.asm @@ -6,6 +6,14 @@ _entry: pop dx mov byte [bootdrv], dl + ; clear screen + mov bx, 0xb800 + mov es, bx + xor di, di + mov ax, (' ' | (0x07 << 8)) + mov cx, (80 * 25 * 2) + rep stosw + ; get size of conventional memory (below 640K) int 0x12 mov word [convmem], ax @@ -15,56 +23,160 @@ _entry: int 0x15 jc .noxm mov word [highmem], ax - jmp .okxm .noxm: - lea bp, [xmerr] - call puts + cli + lidt [idtr] + lgdt [gdtr] + smsw ax + or ax, 1 + lmsw ax -.okxm: + lea sp, [stack] + mov ax, 0x10 + mov ds, ax + mov es, ax + mov ss, ax + jmp 0x08:.reloadcs + +.reloadcs: lea bp, [hello] call puts jmp $ error: + cli lea bp, [errstr] - ; fallthrough + call puts + hlt + jmp $ +; al - char +putchar: + mov bx, 0x18 + mov es, bx + + xor ch, ch + xor dh, dh + mov cl, byte [posx] + mov dl, byte [posy] + + cmp al, 10 ; '\n' + je .nl + + imul bx, dx, 80 + add bx, cx + shl bx, 1 + mov byte [es:bx], al + + inc cl + cmp cl, 80 + je .nl + mov byte [posx], cl + ret + +.nl: + mov byte [posx], 0 + inc dl + + cmp dl, 25 + je .scroll + mov byte [posy], dl + ret + +.scroll: + cld + xor di, di + mov si, 0x160 + mov cx, 80 * 24 * 2 + rep movsw + + mov si, 80 * 24 * 2 + mov ax, (' ' | (0x07 << 8)) + rep stosw + mov byte [posy], 24 + ret + +; bp - str puts: mov al, byte [ds:bp] inc bp test al, al jz .ret - mov ah, 0x0E - xor bx, bx - int 0x10 + call putchar jmp puts .ret: + mov dx, 0x3D4 + mov al, 0x0f + out dx, al + + mov bx, word [posy] + imul bx, 80 + add bx, word [posx] + + inc dx ; 0x3D5 + mov al, bl + out dx, al + + dec dx ; 0x3D4 + mov al, 0x0E + out dx, al + + inc dx ; 0x3D5 + mov al, bh + out dx, al ret section .rodata hello: - db "Hello World", 13, 10, 0 + db "Hello World", 10, 0 errstr: - db "Error", 13, 10, 0 -xmerr: - db "No extended memory detected", 13, 10, 0 + db "Error", 10, 0 +align 2 idtr: dw idt.end - idt - 1 - dd idt + dd idt + 0x10000 +align 2 gdtr: dw gdt.end - gdt - 1 - dd gdt + dd gdt + 0x10000 + +section .data gdt: dq 0 + + ; 0x08 - kernel code + dw 0xffff + dw 0x0000 + db 0x01 + db 0x9A + dw 0x0000 + + ; 0x10 - kernel data + dw 0xffff + dw 0x0000 + db 0x01 + db 0x92 + dw 0x0000 + + ; 0x18 - video memory + dw 4000 + dw 0x8000 + db 0x0b + db 0x92 + dw 0x0000 .end: section .bss +posx: + resw 1 +posy: + resw 1 bootdrv: resb 1 convmem: @@ -74,3 +186,5 @@ highmem: idt: resq 256 .end: + resb 512 +stack: blob - ecbcc7999f5bade6b01fe9fba663d6cddddfe644 blob + 4db60817c1aa6c04d3020381c5bcbcf0bb3ccfcc --- sys/loader.asm +++ sys/loader.asm @@ -17,6 +17,9 @@ _start: jc error .loop: + lea bp, [ldstr] + call puts + ; read sectors mov ah, 0x02 mov al, NUM_SECTORS @@ -65,6 +68,9 @@ puts: .ret: ret +ldstr: + db "Loading kernel...", 13, 10, 0 + errstr: db "Error", 13, 10, 0