;Main mov ax, 0x1000 mov ds, ax mov si, welcome call print loop: mov si, prompt call print call read cmp byte [input], 0 je loop execute: .hello: mov si, input mov di, command.hello call compare jnc .echo call hello jmp loop .echo: mov si, input mov di, command.echo call compare jnc .unknown call echo jmp loop .unknown: mov si, command.unknown call print jmp loop ;Calls print: lodsb cmp al, 0 je .done mov ah, 0xe int 0x10 jmp print .done: ret read: mov di, input mov cx, 0x80 mov al, 0 rep stosb mov di, input mov cl, 0 .loop: mov ah, 0 int 0x16 cmp al, 0xd je .return cmp al, 0x8 je .backspace cmp cl, 0x80 je .loop cmp al, 0x20 je .space cmp al, 0x9 je .erase cmp al, 0 je .loop .character: mov byte [di], 0 mov ah, 0xe int 0x10 stosb inc cl jmp .loop .erase: mov al, 0x20 jmp .character .space: cmp byte [di], 0 je .character mov al, byte [di] mov ah, 0xe int 0x10 inc di inc cl jmp .loop .backspace: cmp cl, 0 je .loop mov ah, 0xe int 0x10 dec di dec cl jmp .loop .return: mov di, input.end .tspfind: dec di cmp byte [di], 0 je .tspfind cmp byte [di], 0x20 je .tsperase jmp .done .tsperase: mov al, 0 stosb dec di jmp .tspfind .done: mov si, newline call print ret compare: mov al, [si] mov bl, [di] cmp al, bl jne .nequal cmp al, 0 je .equal inc si inc di jmp compare .nequal: clc ret .equal: stc ret hello: mov si, .msg call print ret .msg: db "Hello world!", 0xd, 0xa, 0 echo: call read cmp byte [input], 0 je loop mov si, input call print mov si, newline call print ret ;Data welcome: db 0xd, 0xa, "Welcome to EttinOS!", 0xd, 0xa, 0xd, 0xa, 0 prompt: db "> ", 0 command: .hello: db "hello", 0 .echo: db "echo", 0 .unknown: db "Unknown command", 0xd, 0xa, 0 newline: db 0xd, 0xa, 0 input: times 0x80 db 0 .end: db 0