EttinOS/src/SYSTEM.ASM

129 lines
1.8 KiB
NASM

CPU 8086
ORG 0x500
jmp start
;Interrupt handler
;Return to the shell
int0x20:
jmp shell
;Input and output
int0x21:
cmp ah, 0x0
je printstr
cmp ah, 0x1
je readstr
cmp ah, 0x2
je println
cmp ah, 0x3
je readln
iret
;Disk operations
int0x22:
cmp ah, 0x0
je loadf
;To do: savef
iret
;System calls
%include "PRINTSTR.INC"
%include "READSTR.INC"
%include "PRINTLN.INC"
%include "READLN.INC"
%include "LOADF.INC"
start:
;Set up the interrupt vectors
;Interrupt 0x20 offset
mov ax, int0x20
mov [0x80], ax
;Interrupt 0x21 offset
mov ax, int0x21
mov [0x84], ax
;Interrupt 0x22 offset
mov ax, int0x22
mov [0x88], ax
;Segments
mov ax, 0x0
mov [0x82], ax
mov [0x86], ax
mov [0x8a], ax
;Store the boot drive number
mov [drive], dl
;Print a welcome message
mov si, welcomemsg
mov ah, 0x2
int 0x21
shell:
;Re-set the stack
cli
mov sp, 0x0
sti
;Prompt for and read a command
;Print a prompt
mov si, prompt
mov ah, 0x0
int 0x21
;Read
mov di, input
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
mov ah, 0x0
int 0x22
;Check for errors
cmp al, 0x1
je error
;Execute
jmp 0x2000
;Print an error message and return to the shell
error:
mov bh, 0x0
mov ah, 0x3
int 0x10
dec dh
mov ah, 0x2
int 0x10
mov si, errormsg
mov ah, 0x2
int 0x21
jmp shell
;Data
drive db 0x0
welcomemsg db 0xd, 0xa, "Welcome to EttinOS!", 0xd, 0xa, 0x0
prompt db "> ", 0x0
errormsg db "Unknown command", 0x0
input times 0x4e db 0x0
crlf db 0xd, 0xa, 0x0
;Print a CRLF
printcrlf:
;Store the initial registers in the stack
push si
;Print the CRLF
mov si, crlf
mov ah, 0x0
int 0x21
;Load the initial registers from the stack
pop si
ret
;File system buffer
buffer: