commit - 095d0ed35c3587d68ee65e3d1fd5024c2d3109fc
commit + a64d9d6ef94a1fe121764b0d24584975f3a515cd
blob - 51f794e345e354781f7566c0a4d659cd6aa7de07
blob + 9cccd7b79bc793815e2ede3b2acecfb8968ee503
--- sys/Makefile
+++ sys/Makefile
LDFLAGS = -s --no-pie
OBJ = loader.o kernel.o
-IMG = floppy1440.img
+IMG = sys.img
all: ${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
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
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:
idt:
resq 256
.end:
+ resb 512
+stack:
blob - ecbcc7999f5bade6b01fe9fba663d6cddddfe644
blob + 4db60817c1aa6c04d3020381c5bcbcf0bb3ccfcc
--- sys/loader.asm
+++ sys/loader.asm
jc error
.loop:
+ lea bp, [ldstr]
+ call puts
+
; read sectors
mov ah, 0x02
mov al, NUM_SECTORS
.ret:
ret
+ldstr:
+ db "Loading kernel...", 13, 10, 0
+
errstr:
db "Error", 13, 10, 0