diff --git a/README.MD b/README.MD index aea6e75..2a8b8d7 100644 --- a/README.MD +++ b/README.MD @@ -40,9 +40,11 @@ space and backspace keys move the cursor. Programming ----------- -EttinOS has a flat address space of 64 KiB with the data, stack, and -extra segments set at the beginning of the RAM. Programs are loaded at -address 0x2000. +EttinOS has a flat address space of 64 KiB. The data, stack, and +extra segments are set at the beginning of the RAM and the system stack +at the end of the address space. Programs are loaded at address 0x2000. +The stack is reset back to the end of the address space after a program +has finished running. System calls: * Interrupt 0x20: Return to the shell. diff --git a/src/BOOT.ASM b/src/BOOT.ASM index 9268925..b0e349f 100644 --- a/src/BOOT.ASM +++ b/src/BOOT.ASM @@ -60,8 +60,7 @@ mov ss, ax mov es, ax ;Set up the stack cli -mov sp, stack -add sp, 0x100 +mov sp, 0x0 sti ;Store the boot drive number mov [bootdrive], dl @@ -75,7 +74,7 @@ add ax, [bootsectors] push ax call calcsource ;Set the destination -mov si, 0x7f00 +mov si, buffer mov bx, si ;Set the size push dx @@ -92,7 +91,7 @@ int 0x13 ;Search the root for the system entry ;Set DI to the root -mov di, 0x7f00 +mov di, buffer ;Initialise the search loop mov cx, word [rootentries] mov ax, 0x0 @@ -106,7 +105,7 @@ rep cmpsb je loadentry ;Set DI to the next entry add ax, 0x20 -mov di, 0x7f00 +mov di, buffer add di, ax ;Load CX from the stack pop cx @@ -137,7 +136,7 @@ mov word [cluster], ax mov ax, 0x1 call calcsource ;Set the destination -mov di, 0x7f00 +mov di, buffer mov bx, di ;Set the size mov ax, [sectorsperfat] @@ -176,7 +175,7 @@ mov bx, 0x3 mul bx mov bx, 0x2 div bx -mov si, 0x7f00 +mov si, buffer add si, ax mov ax, word [ds:si] or dx, dx @@ -198,8 +197,12 @@ mul word [clustersize] add word [pointer], ax jmp loadcluster -;Boot the system +;Clear the stack and boot the system boot: +;Clear +pop cx +pop bx +;Boot jmp 0x0:0x500 ;Data @@ -236,4 +239,5 @@ times 0x1fe-($-$$) db 0x0 ;Boot signature dw 0xaa55 -stack: +;File system buffer +buffer: diff --git a/src/LOADF.INC b/src/LOADF.INC index d5bb3a1..4486b18 100644 --- a/src/LOADF.INC +++ b/src/LOADF.INC @@ -76,8 +76,7 @@ add ax, [.bootsectors] push ax call .calcsource ;Set the destination -mov si, stack -add si, 0x100 +mov si, buffer mov bx, si ;Set the size push dx @@ -94,8 +93,7 @@ int 0x13 ;Search the root for the file entry ;Set DI to the root -mov di, stack -add di, 0x100 +mov di, buffer ;Initialise the search loop mov cx, word [.rootentries] mov ax, 0x0 @@ -109,8 +107,7 @@ rep cmpsb je .loadentry ;Set DI to the next entry add ax, 0x20 -mov di, stack -add di, 0x100 +mov di, buffer add di, ax ;Load CX from the stack pop cx @@ -134,8 +131,7 @@ mov word [.cluster], ax mov ax, 0x1 call .calcsource ;Set the destination -mov di, stack -add di, 0x100 +mov di, buffer mov bx, di ;Set the size mov ax, [.sectorsperfat] @@ -174,8 +170,7 @@ mov bx, 0x3 mul bx mov bx, 0x2 div bx -mov si, stack -add si, 0x100 +mov si, buffer add si, ax mov ax, word [ds:si] or dx, dx @@ -200,7 +195,7 @@ jmp .loadcluster .clearcarry: clc -;Clear left over values from the stack +;Clear the stack .clearstack: pop cx pop bx @@ -215,7 +210,7 @@ pop cx pop bx pop ax -;Set AL to 0x1 if there was an error and to 0x0 otherwise +;Set AL to 0x1 if there was an error and to 0x0 otherwise and return jc .setal mov al, 0x0 iret diff --git a/src/PRINTSTR.INC b/src/PRINTSTR.INC index a49fdfb..14b0403 100644 --- a/src/PRINTSTR.INC +++ b/src/PRINTSTR.INC @@ -4,6 +4,7 @@ printstr: ;Store the initial registers in the stack push ax +push si ;Print the string .loop: @@ -21,6 +22,7 @@ jmp .loop .done: ;Load the initial registers from the stack +pop si pop ax iret diff --git a/src/READSTR.INC b/src/READSTR.INC index 75cb76d..d4a57e3 100644 --- a/src/READSTR.INC +++ b/src/READSTR.INC @@ -7,6 +7,7 @@ push ax push bx push cx push dx +push di ;Setup ;Store the input length in the stack @@ -124,6 +125,7 @@ jmp .findend .done: ;Load the initial registers from the stack +pop di pop dx pop cx pop bx diff --git a/src/SYSTEM.ASM b/src/SYSTEM.ASM index f1f8fe4..ac81894 100644 --- a/src/SYSTEM.ASM +++ b/src/SYSTEM.ASM @@ -34,12 +34,6 @@ iret start: -;Setup -;Set up the stack -cli -mov sp, stack -add sp, 0x100 -sti ;Set up the interrupt vectors ;Interrupt 0x20 offset mov ax, int0x20 @@ -63,10 +57,9 @@ int 0x21 shell: -;Re-set up the stack +;Re-set the stack cli -mov sp, stack -add sp, 0x100 +mov sp, 0x0 sti ;Prompt for and read a command @@ -76,11 +69,14 @@ mov ah, 0x0 int 0x21 ;Read mov di, input -mov al, 0xff +mov al, 0x4e mov ah, 0x3 int 0x21 ;Load an execute the program +;Check for an empty command +cmp byte [input], 0x0 +jz shell ;Load mov bx, 0x2000 mov si, input @@ -109,7 +105,7 @@ jmp shell welcomemsg db 0xd, 0xa, "Welcome to EttinOS!", 0xd, 0xa, 0x0 prompt db "> ", 0x0 errormsg db "Unknown command", 0x0 -input times 0xff db 0x0 +input times 0x4e db 0x0 crlf db 0xd, 0xa, 0x0 ;Print a CRLF @@ -124,4 +120,5 @@ int 0x21 pop si ret -stack: +;File system buffer +buffer: