Commit Diff


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