Commit Diff


commit - 0d35c07dfc7e6b341aadc64a253738b6285b9e6a
commit + a1cd4b7fc7a060a817c404ca38994a604035281d
blob - e342091e9697412790341e858ea9b0617d74aedd
blob + 24455900f3df544d1a38de611ffa601f0a9fb02a
--- cc/irc/.gitignore
+++ cc/irc/.gitignore
@@ -1,3 +1,4 @@
 *.swp
+*.core
 irc
 test.asm
blob - 8343815d60afa69b4a0d8da66581b71e26aced45
blob + 51f794e345e354781f7566c0a4d659cd6aa7de07
--- sys/Makefile
+++ sys/Makefile
@@ -1,15 +1,27 @@
-.SUFFIXES: .asm .bin
+.SUFFIXES: .asm .o
+LDFLAGS = -s --no-pie
 
-all: floppy.img
+OBJ = loader.o kernel.o
+IMG = floppy1440.img
 
+
+all: ${IMG}
+
+xxd: ${IMG}
+	xxd ${IMG} | less
+
 clean:
-	rm -f floppy.img *.bin
+	rm -f *.o *.elf *.img
 
-run: floppy.img
-	qemu-system-i386 -M pc -m 4M -fda floppy.img
+run: ${IMG}
+	qemu-system-i386 -M pc -m 1M -fda ${IMG}
 
-floppy.img: loader.bin kern.bin
-	cat loader.bin kern.bin > floppy.img
+floppy1440.img: sys.elf
+	objcopy -O binary --pad-to $$((2880 * 512)) sys.elf floppy1440.img
 
-.asm.bin:
-	nasm -fbin -o $@ $<
+sys.elf: linker.ld ${OBJ}
+	ld -o $@ -T linker.ld ${OBJ} ${LDFLAGS}
+
+.asm.o:
+	nasm -felf32 -o $@ $<
+
blob - /dev/null
blob + f43362a9f2965b8ba3f1a00c704bedb3e83e8584 (mode 644)
--- /dev/null
+++ sys/.gitignore
@@ -0,0 +1,4 @@
+*.o
+*.elf
+*.img
+*.swp
blob - 0b45a1a612f911b3a57817aaac3dfcf139356a27 (mode 644)
blob + /dev/null
--- sys/kern.asm
+++ /dev/null
@@ -1,12 +0,0 @@
-[org 0]
-[bits 16]
-[cpu 286]
-
-_start:
-	mov ax, 0x18
-	mov es, ax
-	mov byte [es:0], 'H'
-	jmp $
-
-hello:
-	db "Hello World", 13, 10, 0
blob - 649daf4117b26c0b0bf6f6238848a68d524663b4
blob + ecbcc7999f5bade6b01fe9fba663d6cddddfe644
--- sys/loader.asm
+++ sys/loader.asm
@@ -1,78 +1,78 @@
-[org 0x7C00]
 [bits 16]
 [cpu 286]
 
-KERN_BEGIN equ 0x8000
 
+NUM_SECTORS equ 8
+
+section .boot exec write
+global _start
+extern _entry
 _start:
-	; load 32KiB from floppy
+	mov byte [bootdrv], dl
+
+	; reset boot drive
+	xor ah, ah
+	mov dl, byte [bootdrv]
+	int 0x13
+	jc error
+
+.loop:
+	; read sectors
 	mov ah, 0x02
-	mov al, 63
-	mov ch, 0
+	mov al, NUM_SECTORS
+	xor ch, ch
 	mov cl, 2
-	mov dh, 0
-	mov bx, (KERN_BEGIN >> 4)
+	xor dh, dh
+	mov dl, byte [bootdrv]
+	mov bx, 0x1000
 	mov es, bx
 	xor bx, bx
 	int 0x13
-	jc _start
+	jnc .ok
 
-	; zero out IDT
-	cli
-	cld
-	mov ax, 0x80
-	mov es, ax
-	xor ax, ax
-	xor di, di
-	mov cx, (256 * 8 / 2)
-	rep stosw
-	lidt [idtr]
+	; reset boot drive again
+	xor ah, ah
+	mov dl, byte [bootdrv]
+	int 0x13
+	jnc error
 
-	; set up GDT
-	lgdt [gdtr]
+	dec byte [tries]
+	jnz .loop
+	jmp error
 
-	smsw ax
-	or ax, 1
-	lmsw ax
-
-	mov ax, 0x10
+.ok:
+	push word [bootdrv]
+	mov ax, 0x1000
 	mov ds, ax
 	mov es, ax
-	mov ss, ax
-	jmp 0x08:0
-	
-idtr:
-	dw (256 * 8) - 1
-	dd 0x800
+	jmp 0x1000:_entry
 
-gdtr:
-	dw gdt.end - gdt - 1
-	dd gdt
+error:
+	lea bp, [errstr]
+	; fallthrough
 
-gdt:
-	dq 0
+puts:
+	mov al, byte [bp]
+	inc bp
+	test al, al
+	jz .ret
 
-	; kernel code
-	dw 65535
-	dw (KERN_BEGIN & 0xffff)
-	db (KERN_BEGIN >> 16) & 0xf
-	db 0x9A
-	dw 0
+	mov ah, 0x0E
+	xor bx, bx
+	int 0x10
+	jmp puts
 
-	; kernel data
-	dw 65535
-	dw (KERN_BEGIN & 0xffff)
-	db (KERN_BEGIN >> 16) & 0xf
-	db 0x92
-	dw 0
+.ret:
+	ret
 
-	; vidmem
-	dw 4000
-	dw 0x8000
-	db 0x0b
-	db 0x92
-	dw 0
-.end:
+errstr:
+	db "Error", 13, 10, 0
 
+bootdrv:
+	db 0
+
+tries:
+	db 3
+
 times 510 - ($ - $$) db 0
 dw 0xAA55
blob - /dev/null
blob + afe5bebcd75abb4844da7b0e7296229b7425e083 (mode 644)
--- /dev/null
+++ sys/TODO
@@ -0,0 +1,3 @@
+- enable A20
+- fill in GDT
+- set_irq()
blob - /dev/null
blob + 69b9070ffb6b42d218ee011e8901e12d540393e3 (mode 644)
--- /dev/null
+++ sys/kernel.asm
@@ -0,0 +1,76 @@
+[cpu 286]
+[bits 16]
+section .text
+global _entry
+_entry:
+	pop dx
+	mov byte [bootdrv], dl
+
+	; get size of conventional memory (below 640K)
+	int 0x12
+	mov word [convmem], ax
+
+	; get size of extended memory (above 1M)
+	mov ah, 0x88
+	int 0x15
+	jc .noxm
+	mov word [highmem], ax
+	jmp .okxm
+
+.noxm:
+	lea bp, [xmerr]
+	call puts
+
+.okxm:
+	lea bp, [hello]
+	call puts
+	jmp $
+
+error:
+	lea bp, [errstr]
+	; fallthrough
+
+puts:
+	mov al, byte [ds:bp]
+	inc bp
+	test al, al
+	jz .ret
+
+	mov ah, 0x0E
+	xor bx, bx
+	int 0x10
+	jmp puts
+
+.ret:
+	ret
+
+section .rodata
+hello:
+	db "Hello World", 13, 10, 0
+errstr:
+	db "Error", 13, 10, 0
+xmerr:
+	db "No extended memory detected", 13, 10, 0
+
+idtr:
+	dw idt.end - idt - 1
+	dd idt
+
+gdtr:
+	dw gdt.end - gdt - 1
+	dd gdt
+
+gdt:
+	dq 0
+.end:
+
+section .bss
+bootdrv:
+	resb 1
+convmem:
+	resw 1	; in kilobytes
+highmem:
+	resw 1	; in kilobytes
+idt:
+	resq 256
+.end:
blob - /dev/null
blob + 1a2d3779413647e249669a3b82df0ce77f38343e (mode 644)
--- /dev/null
+++ sys/linker.ld
@@ -0,0 +1,34 @@
+ENTRY(_start)
+OUTPUT_ARCH(i386:i386)
+OUTPUT_FORMAT(elf32-i386)	/* pretend that we are a i386 */
+
+MEMORY {
+	BOOTSECT : ORIGIN = 0x7C00, LENGTH = 512
+	ROM : ORIGIN = 0x7E00, LENGTH = 4096
+	RAM : ORIGIN = 0, LENGTH = 4096
+}
+
+SECTIONS {
+	.boot : {
+		*(.boot)
+	} > BOOTSECT
+
+	.kernel : {
+		*(.text)
+		*(.rodata)
+		*(.data)
+		*(.bss)
+	} > RAM AT> ROM
+	/* this will cause the kernel to be directly after the loader on floppy,
+	 * while starting at 0x1000:0 in memory.*/
+
+	/DISCARD/ : {
+		*(.dynamic)
+		*(.gnu.hash)
+		*(.dynsym)
+		*(.dynstr)
+		*(.hash)
+		*(.comment)
+	}
+}
+