📄 shell.inc
字号:
;===========================================================
;
; WarmOS
; by HotHeart(xujiwei)
; Email: vipxjw@163.com
;
; Shell
; user shell
;
; History:
; 2005.08.29 finished base shell
; 2005.08.28 finished backspace
; 2005.08.28 file created
;
;===========================================================
;===========================================================
; shell data
;===========================================================
align 4
CMDLINE times 128 db 0
CMDLINE_LEN dw 0
CMDLINE_PARAM dw 0
;===========================================================
; shell
;===========================================================
align 4
szPrompt db 'A:\>',0
Shell:
.printf_cursor:
mov ax,1
mov bx,'_'
int 0x40
call Backspace
.getchar:
mov ax,5
int 0x40
.chk_key:
cmp al,13
je .is_13
cmp al,8
je .is_8
.chk_pos:
push ax
mov ax,6
int 0x40
mov bx,ax
pop ax
cmp bh,78
jge Shell
.echo:
mov bx,ax
mov ax,1
int 0x40
.put2buf:
mov ax,bx
mov bx,[CMDLINE_LEN]
add bx,CMDLINE
cmp ah,0
jne .put_2b
mov [bx],al
mov [bx+1],byte 0
inc word[CMDLINE_LEN]
jmp Shell
.put_2b:
mov [bx],ax
mov [bx+1],byte 0
add word[CMDLINE_LEN],2
jmp Shell
.is_13:
mov ax,1
mov bx,0
int 0x40
mov ax,1
mov bx,13
int 0x40
cmp [CMDLINE],byte 0
je .is_13_done
.exec:
call ExecuteCommand ; execute the command
.exec_done:
mov ax,1
mov bx,13
int 0x40
.is_13_done:
mov ax,0
mov bx,szPrompt
int 0x40
mov di,CMDLINE
mov cx,128/2
xor ax,ax
cld
rep stosw
mov word[CMDLINE_LEN],0
jmp Shell
.is_8:
mov ax,1
mov bx,' '
int 0x40
call Backspace
call Backspace
mov ax,1
mov bx,' '
int 0x40
call Backspace
cmp [CMDLINE_LEN],word 0
je .is_8_done
dec word[CMDLINE_LEN]
.is_8_done:
mov bx,[CMDLINE_LEN]
add bx,CMDLINE
mov [bx],byte 0
jmp Shell
.done:
ret
;===========================================================
; execute
;===========================================================
align 4
bufFileName times 12 db ' '
szUnknownCommand db '未知命令,请输入help获取帮助。',13,10,0
align 4
ExecuteCommand:
mov si,CMDLINE
.chk_20:
cmp [si],byte 0x20
je .get
cmp [si],byte 0
je .get
inc si
jmp .chk_20
.get:
mov [si],byte 0
inc si
mov [CMDLINE_PARAM],si
mov si,CMDLINE
call UpCase
mov si,CMDLINE
mov bx,CommandTable
.chk_cmd:
mov di,[bx]
call strcmp
cmp ax,0
je .exec
add bx,4
cmp bx,CommandTable_end
jge .chk_floppy
jmp .chk_cmd
.exec:
call word[bx+2]
ret
.chk_floppy:
mov si,CMDLINE
mov di,bufFileName
call FD_Expand
push es
mov ax,0x1010
mov es,ax
xor bx,bx
mov si,bufFileName
call FD_LoadFile
pop es
cmp ax,0
jne .unknown_cmd
jmp CreateProcess
.unknown_cmd:
mov ax,0
mov bx,szUnknownCommand
int 0x40
ret
;===========================================================
; create process
;===========================================================
align 4
REGS_DS dw 0
REGS_ES dw 0
REGS_FS dw 0
REGS_GS dw 0
REGS_SS dw 0
REGS_SP dw 0
REGS_CS dw 0
REGS_IP dw 0
CreateProcess:
mov [REGS_DS],ds
mov [REGS_ES],es
mov [REGS_FS],fs
mov [REGS_GS],gs
mov [REGS_SS],ss
mov [REGS_SP],sp
mov [REGS_CS],cs
mov [REGS_IP],word Shell.exec_done
mov ax,0x1000
mov es,ax
mov si,[CMDLINE_PARAM]
call strlen
mov [es:0x80],al
mov di,0x81
call strcpy
mov ax,0x1000
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
mov sp,0xFFFE
jmp 0x1000:0x100
;===========================================================
; back space
;===========================================================
align 4
Backspace:
push ds
push ax
push bx
mov ax,cs
mov ds,ax
push si
mov si,szPrompt
call strlen
mov bx,ax
pop si
mov ax,[printf_x]
.chk_x:
cmp ax,bx
jbe .done
dec ax
.done:
mov [printf_x],ax
pop bx
pop ax
pop ds
ret
;===========================================================
; commands execute
;===========================================================
%include "commands.inc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -