commit - 0d35c07dfc7e6b341aadc64a253738b6285b9e6a
commit + a1cd4b7fc7a060a817c404ca38994a604035281d
blob - e342091e9697412790341e858ea9b0617d74aedd
blob + 24455900f3df544d1a38de611ffa601f0a9fb02a
--- cc/irc/.gitignore
+++ cc/irc/.gitignore
*.swp
+*.core
irc
test.asm
blob - 8343815d60afa69b4a0d8da66581b71e26aced45
blob + 51f794e345e354781f7566c0a4d659cd6aa7de07
--- sys/Makefile
+++ sys/Makefile
-.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
+*.o
+*.elf
+*.img
+*.swp
blob - 0b45a1a612f911b3a57817aaac3dfcf139356a27 (mode 644)
blob + /dev/null
--- sys/kern.asm
+++ /dev/null
-[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
-[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
+- enable A20
+- fill in GDT
+- set_irq()
blob - /dev/null
blob + 69b9070ffb6b42d218ee011e8901e12d540393e3 (mode 644)
--- /dev/null
+++ sys/kernel.asm
+[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
+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)
+ }
+}
+