From 5e4513dd223e997b6ff6dc05e3441ea3b086277c Mon Sep 17 00:00:00 2001 From: Andrew Kesterson Date: Sat, 24 Jan 2015 18:06:35 -0800 Subject: [PATCH] Loading from disk works, but jumping to the kernel does not --- Makefile | 19 +++++++----- asm/bootloader.S | 74 +++++++++++++++++++++++---------------------- asm/kernel_syms.S | 4 +++ asm/libinterrupt.S | 75 +++++++++++++++++++++++++++++++++------------- bootloader.S | 52 -------------------------------- src/kernel.c | 9 +++--- 6 files changed, 112 insertions(+), 121 deletions(-) create mode 100644 asm/kernel_syms.S delete mode 100644 bootloader.S diff --git a/Makefile b/Makefile index f545cbd..a875315 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,21 @@ all: boot.img kernel.bin -boot.bin: asm/bootloader.S asm/bootloader.S - nasm asm/bootloader.S -f bin -o $@ - -asm/%.o: asm/%.S - nasm $< -f as86 -o $@ - src/%.o: src/%.c bcc -ansi -3 -c -o $@ $< kernel.bin: src/kernel.o - ld86 -T0x1000 -o $@ $^ + ld86 -T0x1000 -M -o $@ $^ + +asm/kernel_syms.S: kernel.bin + objdump86 kernel.bin | \ + grep -E "^[0-9]+ T _.*" | \ + python -c "import sys; print '\n'.join([\"_extern_c%s:\n jmp 0x1000:0x%04x\" % (x.split(' ')[2].strip('\n'), int(x.split(' ')[0].lstrip('0'), 16)-0x1000) for x in sys.stdin.readlines()])" > asm/kernel_syms.S + +boot.bin: asm/kernel_syms.S asm/bootloader.S asm/bootloader.S + cd asm && nasm bootloader.S -f bin -o ../$@ + +asm/%.o: asm/%.S + nasm $< -f as86 -o $@ boot.img: boot.bin kernel.bin cat $^ > $@ diff --git a/asm/bootloader.S b/asm/bootloader.S index 36de9a4..667d150 100644 --- a/asm/bootloader.S +++ b/asm/bootloader.S @@ -13,44 +13,44 @@ start: mov dl, 0x0 call setCursorPosition - mov al, 0x17 ; read the remaining 16 tracks - mov ch, 0x1 ; .... on track 1 .... - mov cl, 0x1 ; .... starting at sector 1 + mov al, 0x1 ; read the remaining 16 tracks + mov ch, 0x0 ; .... on track 0 .... + mov cl, 0x2 ; .... starting at sector 2 mov bx, 0x1000 ; 0x1000 is a standard kernel start location mov es, bx - xor bx, bx ; bx = 0, es:bs = 0x1000:0 + mov bx, 0x0 ; bx = 0, es:bx = 0x1000:0 call loadFloppyDiskSectors - push ax - mov ax, bx - add ax, 0x2200 ; we just read 0x2200 bytes, move pointer in memory - mov bx, ax - pop ax - mov al, 0x17 ; read 18 sectors per track for all future tracks - mov cl, 0x1 ; start at sector 1 for all future tracks +;; push ax +;; mov ax, bx +;; add ax, 0x2200 ; we just read 0x2200 bytes, move pointer in memory +;; mov bx, ax +;; pop ax +;; mov al, 0x17 ; read 18 sectors per track for all future tracks +;; mov cl, 0x1 ; start at sector 1 for all future tracks - mov di, 0x2FF ; abuse di as a counter, while (di < 80) - ; di is technically a destination index for stream - ; ops, but nothing is using it ATM, so gimme. -_next_floppy_track: - push ax - mov ax, 0x2e - call printCharacter - mov ax, cx - mov cx, di - mov cl, al - pop ax - call loadFloppyDiskSectors - push ax - mov ax, bx - add ax, 0x2400 ; each floppy track is (512b*18s)=0x2400 bytes long - mov bx, ax - pop ax - inc di - push cx - mov cx, 0x50 - cmp di, cx ; di < 80 ? - jg _end_floppy_read - pop cx +;; mov di, 0x2FF ; abuse di as a counter, while (di < 80) +;; ; di is technically a destination index for stream +;; ; ops, but nothing is using it ATM, so gimme. +;; _next_floppy_track: +;; push ax +;; mov ax, 0x2e +;; call printCharacter +;; mov ax, cx +;; mov cx, di +;; mov cl, al +;; pop ax +;; call loadFloppyDiskSectors +;; push ax +;; mov ax, bx +;; add ax, 0x2400 ; each floppy track is (512b*18s)=0x2400 bytes long +;; mov bx, ax +;; pop ax +;; inc di +;; push cx +;; mov cx, 0x50 +;; cmp di, cx ; di < 80 ? +;; jg _end_floppy_read +;; pop cx _end_floppy_read: mov dh, 0x1 @@ -58,13 +58,15 @@ _end_floppy_read: call setCursorPosition mov si, _str_floppydone call printString - jmp 0x1000 + jmp _extern_c_main %include "libinterrupt.S" - +%include "kernel_syms.S" + _str_hello db 'Piquant v0.1 Bootloader', 0xA, 0 _str_loading db 'Loading', 0 _str_floppydone db 'Kernel loaded', 0xA, 0 times 510 - ($ - $$) db 0 ; fill up to 510 bytes with 0 dw 0xAA55 ; magic bootloader signature + diff --git a/asm/kernel_syms.S b/asm/kernel_syms.S new file mode 100644 index 0000000..01ae27d --- /dev/null +++ b/asm/kernel_syms.S @@ -0,0 +1,4 @@ +_extern_c_main: + jmp 0x1000:0x0049 +_extern_c_printCh: + jmp 0x1000:0x0000 diff --git a/asm/libinterrupt.S b/asm/libinterrupt.S index ec078c9..703fa9b 100644 --- a/asm/libinterrupt.S +++ b/asm/libinterrupt.S @@ -1,26 +1,59 @@ resetFloppy: -mov ax, 0 ; reset floppy disk (only need ah, reset - ; al while we're here though) -mov dl, 0 ; use drive 0 (first floppy) -int 0x13 -jc resetFloppy -ret + mov ah, 0 ; reset floppy disk + mov dl, 0 ; use drive 0 (first floppy) + int 0x13 + jc resetFloppy + ret -loadDiskSector: + ;; set al = how many sectors to read + ;; set ch = what track to read from + ;; set cl = what sector on the track to start reading + ;; set es:bx = where to store the disk data +loadFloppyDiskSectors: + mov ah, 0x02 ; int 0x13 function 2 (read sectors from disk) + mov dh, 0 ; head 0 (assume simple small floppy) + mov dl, 0 ; drive 0 = floppy drive + int 0x13 + jc loadFloppyDiskSectors ; retry on errors (not much else we can do) +blankScreen: + push cx + mov cx, 0x0 +_blankScreen_next: + mov al, 0x20 ; blank space + call printCharacter + inc cx + cmp cx, 0x7d0 ; 80 * 25 screen = 0x7d0 + jne _blankScreen_next +_blankScreen_exit: + pop cx + ret + + ;; set dh = row + ;; set dl = column +setCursorPosition: + mov ah, 0x02 + mov bh, 0 + int 0x10 + ret + + ;; set al = character to display +printCharacter: ; print a single character to the display + mov ah, 0x0e ; int 0x10 is the entire display control, + ; 0x0e means teletype output + mov bh, 0x00 ; Print on the zero (primary) page + mov bl, 0x07 ; Color. 0x07 is grey on black. + int 0x10 + ret -printCharacter: ; print a single character to the display -mov ah, 0x0e ; int 0x10 is the entire display control, - ; 0x0e means teletype output -mov bh, 0x00 ; Print on the zero (primary) page -mov bl, 0x07 ; Color. 0x07 is grey on black. -int 0x10 -ret - + ;; set si = string to display printString: ; print the entire string pointed to by si -mov al, [si] ; [x] == *x, dereferencing source index -call printCharacter -inc si -cmp al, 0x0 ; found the trailing NULL? -jne printString -ret +_printString_next: + mov al, [si] ; [x] == *x, dereferencing source index + cmp al, 0x0 ; found the trailing NULL? + je _printString_exit + call printCharacter + inc si + jmp _printString_next +_printString_exit: + ret diff --git a/bootloader.S b/bootloader.S deleted file mode 100644 index b09d41e..0000000 --- a/bootloader.S +++ /dev/null @@ -1,52 +0,0 @@ -[bits 16] ; 16 bit real mode code -[org 0x7C00] ; Origin at 0x7C00 (upper end of memory) - -start: - mov si, _str_hello ; si = source index - call printString - mov al, 0x97 - call printCharacter - -; mov al, 0x17 ; read the remaining 16 tracks -; mov ch, 0x1 ; .... on track 1 .... -; mov cl, 0x2 ; .... starting at sector 2 -; mov bx, 0x1000 ; 0x1000 is a standard kernel start location -; mov es, bx -; xor bx ; bx = 0, es:bs = 0x1000:0 -; call loadFloppyDiskSectors -; push ax -; mov ax, bx -; add ax, 0x2200 ; we just read 0x2200 bytes, move pointer in memory -; mov bx, ax -; pop ax -; mov al, 0x17 ; read 18 sectors per track for all future tracks -; mov cl, 0x1 ; start at sector 1 for all future tracks - -; mov di, 0x2 ; abuse di as a counter, while (di < 80) -; ; di is technically a destination index for stream -; ; ops, but nothing is using it ATM, so gimme. -; _next_floppy_track: -; mov ch, di -; call loadFloppyDiskSectors -; push ax -; mov ax, bx -; add ax, 0x2400 ; each floppy track is (512b*18s)=0x2400 bytes long -; mov bx, ax -; pop ax -; inc di -; push cx -; mov cx, 0x50 -; cmp di, cx ; di < 80 ? -; jlt _next_floppy_track - - mov si, _str_floppydone - call printString - jmp $ - -%include "libinterrupt.S" - - _str_hello db 'Piquant v0.1 Bootloader', 0xA, 0 - _str_floppydone db 'Kernel loaded', 0xA, 0 - -times 510 - ($ - $$) db 0 ; fill up to 510 bytes with 0 -dw 0xAA55 ; magic bootloader signature \ No newline at end of file diff --git a/src/kernel.c b/src/kernel.c index a472cb5..415d7d5 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -19,9 +19,9 @@ void printChar(char c) void printString(char *ptr) { - while (*ptr != '\0') { - printChar(*ptr); - *ptr++; + while ((char)*ptr != '\0') { + printChar((char)*ptr); + ptr++; } return; @@ -29,7 +29,6 @@ void printString(char *ptr) void main(void) { - char *kernelHello = "Welcome to Piquant, please wait while Kernel boots...\n"; - printString(kernelHello); + //printString("Piquant Kernel v0.1\n"); while(1); }