330 lines
No EOL
4.9 KiB
NASM
330 lines
No EOL
4.9 KiB
NASM
;NXOS shell
|
||
;----------
|
||
;Written by: Alberto Venturini (Alb‚) - 2001
|
||
;Email address: -albe-@libero.it
|
||
|
||
org 0h
|
||
|
||
cld
|
||
Main1:
|
||
; mov si,offset Prompt ;shows the prompt
|
||
; mov ah,01h
|
||
; mov bl,07h
|
||
; int 24h
|
||
|
||
call ShowPrompt
|
||
|
||
mov di,offset Command
|
||
xor cx,cx
|
||
|
||
GetCommand: ;Get a string from the keyboard
|
||
mov si,offset Command
|
||
mov ah,07h
|
||
int 25h
|
||
dec si
|
||
|
||
ToUpCase: ;Turns everything upcase
|
||
inc si
|
||
mov al,ds:[si]
|
||
cmp al,13
|
||
je EndCommand
|
||
cmp al,90
|
||
jbe ToUpCase
|
||
sub al,32
|
||
mov ds:[si],al
|
||
jmp ToUpCase
|
||
|
||
EndCommand:
|
||
test cx,cx ;If only CR was pressed, just re-write the prompt
|
||
jz Main1
|
||
|
||
push cx
|
||
mov di,offset Command
|
||
|
||
Test4Extension: ;tests if file extension is available
|
||
mov al,es:[di]
|
||
cmp al,'.'
|
||
je ExtensionOk2
|
||
inc di
|
||
dec cx
|
||
jnz Test4Extension
|
||
|
||
NoExtension: ;there's no extension...assume it's an internal
|
||
;shell command
|
||
|
||
pop cx
|
||
|
||
mov di,offset Command
|
||
|
||
mov cx,3
|
||
mov si,offset ClsCmd
|
||
push di
|
||
rep cmpsb
|
||
pop di
|
||
je ShellCommand_Cls
|
||
|
||
mov cx,4
|
||
mov si,offset HelpCmd
|
||
push di
|
||
rep cmpsb
|
||
pop di
|
||
je ShellCommand_Help
|
||
|
||
mov cx,8
|
||
mov si,offset ShutdownCmd
|
||
push di
|
||
rep cmpsb
|
||
pop di
|
||
je ShellCommand_Shutdown
|
||
|
||
mov cx,2
|
||
mov si,offset CdCmd
|
||
push di
|
||
rep cmpsb
|
||
pop di
|
||
je ShellCommand_Cd
|
||
|
||
mov ah,01h
|
||
mov si,offset Error3
|
||
mov bl,7
|
||
int 24h
|
||
|
||
jmp ClearCommandBuffer
|
||
|
||
ExtensionOk2:
|
||
jmp ExtensionOk
|
||
|
||
ShellCommand_Cls: ;executes the "CLS" command
|
||
mov ah,04h
|
||
int 24h
|
||
jmp ClearCommandBuffer
|
||
|
||
ShellCommand_Cd:
|
||
mov si,offset CiaoDir
|
||
mov ah,02h
|
||
int 22h
|
||
jmp ClearCommandBuffer
|
||
|
||
CiaoDir db 'CIAO ',0
|
||
|
||
ShellCommand_Help:
|
||
mov si,offset HelpTxt
|
||
mov ah,01h
|
||
mov bl,7
|
||
int 24h
|
||
jmp ClearCommandBuffer
|
||
|
||
ShellCommand_ShutDown:
|
||
mov al,13
|
||
mov ah,00h
|
||
int 24h
|
||
mov al,10
|
||
int 24h
|
||
xor ax,ax
|
||
int 21h
|
||
|
||
|
||
ExtensionOk: ;there's the extension
|
||
pop cx
|
||
|
||
StoreExtension: ;store the extension in a buffer ("Extension")
|
||
push di
|
||
inc di
|
||
mov si,di
|
||
mov di,offset Extension
|
||
|
||
movsb
|
||
movsb
|
||
movsb
|
||
|
||
mov di,offset Parameters ;store the parameters in a buffer
|
||
mov cx,90
|
||
inc si
|
||
rep movsb
|
||
|
||
pop di
|
||
|
||
jmp ExecuteProgram
|
||
|
||
push di
|
||
sub di,offset Command
|
||
|
||
cmp di,8
|
||
jb StoreExtension2
|
||
|
||
pop di ;file name must be <= 8
|
||
mov di,offset Command
|
||
add di,8
|
||
jmp StoreExtension3
|
||
|
||
StoreExtension2:
|
||
mov cx,8
|
||
sub cx,di
|
||
mov al,' '
|
||
|
||
pop di
|
||
|
||
rep stosb
|
||
|
||
StoreExtension3:
|
||
mov si,offset Extension
|
||
movsb
|
||
movsb
|
||
movsb
|
||
|
||
ExecuteProgram:
|
||
mov di,offset Extension
|
||
mov si,offset BinExtension
|
||
|
||
mov cx,3
|
||
|
||
push di
|
||
rep cmpsb ;tests if the extension is "BIN"
|
||
pop di
|
||
je ExecuteBinProgram
|
||
|
||
mov si,offset ComExtension
|
||
mov cx,3
|
||
|
||
push di
|
||
rep cmpsb
|
||
pop di
|
||
je ExecuteComProgram
|
||
|
||
mov si,offset ExeExtension
|
||
mov cx,3
|
||
push di
|
||
rep cmpsb
|
||
pop di
|
||
je ExecuteExeProgram
|
||
|
||
mov ah,01h
|
||
mov si,offset Error2
|
||
mov bl,7
|
||
int 24h
|
||
|
||
jmp Main1
|
||
|
||
ExecuteBinProgram:
|
||
push es
|
||
|
||
mov si,offset Command
|
||
mov ah,00h
|
||
int 20h
|
||
test dx,dx
|
||
jz FileNotFound
|
||
mov bl,0
|
||
mov ah,01h
|
||
int 20h
|
||
|
||
pop es
|
||
|
||
jmp ClearCommandBuffer
|
||
|
||
ExecuteComProgram:
|
||
push es
|
||
|
||
mov si,offset Command
|
||
mov bx,offset Parameters
|
||
mov ah,07h
|
||
int 20h
|
||
test dx,dx
|
||
jz FileNotFound
|
||
mov bl,0
|
||
mov ah,01h
|
||
int 20h
|
||
|
||
pop es
|
||
|
||
jmp ClearCommandBuffer
|
||
ExecuteExeProgram:
|
||
mov si,offset Command
|
||
mov ah,08h
|
||
int 20h
|
||
jmp ClearCommandBuffer
|
||
|
||
FileNotFound:
|
||
pop es
|
||
mov si,offset Error1
|
||
mov ah,01h
|
||
mov bl,7
|
||
int 24h
|
||
|
||
ClearCommandBuffer:
|
||
mov di,offset Command
|
||
mov al,' '
|
||
mov cx,95
|
||
|
||
ClearCommandBuffer2:
|
||
mov byte ptr cs:[di],al
|
||
inc di
|
||
loop ClearCommandBuffer2
|
||
|
||
jmp Main1
|
||
|
||
|
||
;------------------------------------------------------------------------------
|
||
|
||
ShowPrompt:
|
||
mov si,offset Prompt
|
||
mov ah,01h
|
||
mov bl,7
|
||
int 24h
|
||
|
||
mov al,'\'
|
||
mov ah,00h
|
||
int 24h
|
||
|
||
; push ds
|
||
; push es
|
||
; push di
|
||
|
||
; mov ah,05h ;get current dir name in ES:[DI]
|
||
; int 22h
|
||
;
|
||
; push es
|
||
; pop ds
|
||
; mov si,di
|
||
; mov ah,01h
|
||
; int 24h
|
||
;
|
||
; pop di
|
||
; pop es
|
||
; pop ds
|
||
|
||
ret
|
||
|
||
|
||
;------------------------------------------------------------------------------
|
||
|
||
Command db 100 dup (32)
|
||
Prompt db 13,10,'Ready:',0
|
||
Error1 db 13,10,'File not found',13,10,0
|
||
Error2 db 13,10,'Invalid file name',13,10,0
|
||
Error3 db 13,10,'Invalid command',13,10,0
|
||
NextLine db 13,10,0
|
||
Extension db 3 dup (?)
|
||
BinExtension db 'BIN',0
|
||
ComExtension db 'COM',0
|
||
ExeExtension db 'EXE',0
|
||
|
||
ClsCmd db 'CLS'
|
||
CdCmd db 'CD'
|
||
HelpCmd db 'HELP'
|
||
ShutdownCmd db 'SHUTDOWN'
|
||
|
||
;Help text
|
||
|
||
HelpTxt db 13,10,'NXOS shell',13,10
|
||
db '-------------',13,10
|
||
db 13,10
|
||
db 'How to use this shell:',13,10
|
||
db 'if you want to execute an external program, just type the',13,10
|
||
db 'file name, with his extension.',13,10
|
||
db 13,10
|
||
db 'Available shell commands:',13,10
|
||
db ' CLS: clears the screen',13,10
|
||
db ' HELP: shows this screen',13,10
|
||
db ' SHUTDOWN: reboots or shutdowns the system',13,10,0
|
||
|
||
Parameters: ;where to store the parameters |