; CMD - Command line interpreter ; copyleft Chemist dmitry_gt@tut.by ; ; Compile with FASM for Menuet ; ; use32 org 0x0 db 'MENUET01' dd 0x01 dd START dd I_END dd 0x300000 dd 0x7fff0 dd 0x0 dd 0x0 include "macros.inc" START: call cmdexist call draw call fill call clearcmd call autoexec call ppr call cursor still: mov eax,10 int 0x40 cmp eax,1 je re cmp eax,2 je key cmp eax,3 je button jmp still button: mov eax,17 int 0x40 cmp ah,1 jne noclose jmp exit noclose: jmp still re: call draw call red jmp still red: call cls1 mov dword [xpos],24 mov dword [linev],2000 mov eax,dword [ypos] push eax mov dword [ypos],6 mov ecx,dword [lpress] loop1: push ecx mov eax,4 mov ebx,[ypos] shl ebx,16 add ebx,[xpos] mov ecx,0x00ddeeff mov edx,tic_table add edx,dword [linev] mov esi,81 int 0x40 add dword [xpos],10 add dword [linev],81 pop ecx loop loop1 sub dword [xpos],10 no_line: pop eax mov dword [ypos],eax no_red: ret key: mov eax,2 int 0x40 cmp ah,27 jne no_escape mov dword [ypos],42 call clearstr call ppr mov dword [count],0 call cursor jmp still no_escape: cmp ah,178 jne no_aup cmp dword [count],0 jne no_aup cmp dword [oldcount],0 je no_aup call clearsum sub dword [ypos],6 cld mov ecx,81 mov edi,tic_table+600 mov esi,tic_table+900 rep movsb cld mov ecx,dword [oldcount] mov edi,tic_table add edi,dword [linen] mov esi,tic_table+600 rep movsb call red mov eax,dword [oldcount] mov dword [count],eax add dword [linen],eax add dword [linel],eax mov ebx,6 imul ebx,eax add dword [ypos],ebx call cursor jmp still no_aup: cmp ah,8 jne no_backspace cmp dword [count],0 je still cmp dword [count],0 je no_backspace call clearsum sub dword [ypos],12 call clearsum sub dword [ypos],6 call cursor dec dword [count] jmp still no_backspace: cmp ah,13 jne no_enter cmp dword [count],0 jne enter_ok call clearsum jmp ecmd2 enter_ok: call checkcmd cmp byte [tic_table+600],'/' jne no_script cmp dword [count],1 je nparam5 jmp command no_script: call oldcmd call checkprg jmp ecmd2 no_enter: cmp ah,176 ; Arrow keys, HOME, END, and DEL are unsupported now je still cmp ah,179 je still cmp ah,177 je still cmp ah,178 je still cmp ah,182 je still cmp ah,180 je still cmp ah,181 je still cmp dword [count],74 je still mov byte [smb],ah mov edi,tic_table+600 add edi,dword [count] mov esi,smb movsb inc dword [count] call clearsum sub dword [ypos],6 call print add dword [ypos],6 call cursor jmp still clearstr: mov dword [ypos],6 mov dword [clr],480 call clear mov eax,dword [linel] sub dword [linen],eax mov dword [linel],0 mov ecx,eax push eax loop4: push ecx mov edi,tic_table add edi,dword [linen] mov esi,fill1 movsb inc dword [linen] pop ecx loop loop4 pop eax sub dword [linen],eax mov dword [ypos],42 ret clearsum: mov dword [clr],6 call clear dec dword [linen] dec dword [linel] mov edi,tic_table add edi,dword [linen] mov esi,fill1 movsb ret clear: mov eax,13 mov ebx,[ypos] shl ebx,16 add ebx,[clr] mov ecx,[xpos] shl ecx,16 add ecx,9 mov edx,0 int 0x40 add dword [ypos],6 ret draw: mov eax,12 mov ebx,1 int 0x40 mov eax,0 mov ebx,100*65536+492 mov ecx,100*65536+280 mov edx,0 mov esi,0x805080d0 mov edi,0x005080d0 int 0x40 mov eax,4 mov ebx,8*65536+8 mov ecx,0x10ddeeff mov edx,title mov esi,title_end-title int 0x40 mov eax,8 mov ebx,(492-19)*65536+12 mov ecx,5*65536+12 mov edx,1 mov esi,0x6688dd int 0x40 mov eax,12 mov ebx,2 int 0x40 ret print: mov eax,4 mov ebx,[ypos] shl ebx,16 add ebx,[xpos] mov ecx,0x00ddeeff mov edx,smb mov esi,1 int 0x40 mov edi,tic_table add edi,dword [linen] mov esi,smb movsb inc dword [linen] inc dword [linel] ret cursor: mov eax,4 mov ebx,[ypos] shl ebx,16 add ebx,[xpos] mov ecx,0x00ddeeff mov edx,smb_cursor mov esi,1 int 0x40 mov edi,tic_table mov esi,smb_cursor add edi,dword [linen] movsb inc dword [linen] inc dword [linel] ret ppr: mov eax,4 mov ebx,6 shl ebx,16 add ebx,[xpos] mov ecx,0x00ddeeff mov edx,prompt mov esi,5 int 0x40 mov dword [ypos],42 cld mov ecx,5 mov edi,tic_table add edi,dword [linen] mov esi,prompt rep movsb add dword [linen],6 add dword [linel],6 ret help: cmp byte [callp],1 je gonext8 call clearsum gonext8: call newline call newline mov edx,h1 call printf call newline mov edx,h2 call printf call newline call newline mov edx,h3 call printf call newline call newline mov edx,h4 call printf call newline mov edx,h5 call printf call newline mov edx,h6 call printf call newline mov edx,h7 call printf call newline call newline mov edx,h8 call printf call newline mov edx,h9 call printf call newline mov edx,h10 call printf call newline mov edx,h11 call printf call newline mov edx,h12 call printf call newline mov edx,h13 call printf call newline call newline mov edx,h14 call printf call newline call newline mov edx,h15 call printf call newline mov edx,h16 call printf call newline cmp byte [callp],1 je go jmp ecmd ver: cmp byte [callp],1 je gonext7 call clearsum gonext7: call newline mov edx,about call printf cmp byte [callp],1 je go jmp ecmd pause1: cmp byte [callp],1 je gonext1 call clearsum gonext1: call pause2 cmp byte [callp],1 je go jmp ecmd ls: call oldcmd call cls2 loopls: inc dword [blockcnt] mov eax,34 mov ebx,0 mov ecx,0 mov edx,0 add edx,dword [blockcnt] mov esi,1 mov edi,tic_table+7000 int 0x40 mov ecx,16 loop40: push ecx cld mov ecx,8 mov edi,filename mov esi,tic_table add esi,dword [lscnt] rep movsb add dword [lscnt],8 mov edi,filename+8 mov esi,ddot movsb cld mov ecx,3 mov edi,filename+9 mov esi,tic_table add esi,dword [lscnt] rep movsb cmp byte [filename+10],0 jne no_fn_space1 mov edi,filename+10 mov esi,dzero movsb no_fn_space1: cmp byte [filename],0xe5 ; deleted file je no_newline cmp byte [filename],0xf ; long fat32 filename je no_newline cmp byte [filename],0x10 ; folder je no_newline cmp word [filename],'AK' jne filename_ok cmp byte [filename+3],'e' jne filename_ok cmp byte [filename+5],'y' jne filename_ok cmp byte [filename+7],'a' jne filename_ok cmp byte [filename+10],'s' jne filename_ok jmp no_newline filename_ok: mov eax,6 mov ebx,filename mov ecx,0 mov edx,-1 mov esi,tic_table+25000 int 0x40 cmp eax,4294967295 jne ls_print jmp no_newline ls_print_done: inc byte [lscntf] add dword [ypos],96 cmp byte [lscntf],5 jne no_newline mov byte [lscntf],0 inc byte [lscntx] cmp byte [lscntx],23 je pause2n mov dword [ypos],6 call newline no_newline: add dword [lscnt],24 pop ecx dec ecx cmp ecx,0 jne loop40 cmp dword [blockcnt],16 je ls_end jmp no_pause2 pause2n: mov byte [lscntx],0 call newline call pause2 call cls2 mov dword [lscnt],8024 jmp loopls no_pause2: mov dword [lscnt],8024 jmp loopls ls_end: mov dword [blockcnt],0 mov dword [lscnt],8024 mov byte [lscntf],0 mov byte [lscntx],0 cmp byte [callp],1 je go jmp ecmd2 ls_print: mov edi,filename+8 mov esi,fill1 movsb mov eax,4 mov ebx,[ypos] shl ebx,16 add ebx,[xpos] mov edx,filename mov ecx,0x00ddeeff mov esi,12 int 0x40 cld mov ecx,12 mov edi,tic_table add edi,dword [linen] mov esi,filename rep movsb add dword [linen],16 add dword [linel],16 jmp ls_print_done lscheck: cmp byte [callp],1 je gonext9 call clearsum gonext9: sub dword [count],3 cld mov ecx,dword [count] mov edi,tic_table+400 mov esi,tic_table+600 add esi,3 rep movsb mov ebx,tic_table+400 push esi edi ecx eax mov esi,ebx mov edi,tic_table+400 mov ecx,70 strup2: mov al,[esi] cmp al,'A' jb @f cmp al,'z' ja @f cmp al,'a' jb @f add al,-0x20 @@: mov [edi],al inc esi inc edi dec ecx jnz strup2 pop eax ecx edi esi mov ecx,dword [count] looplsc: cmp byte [tic_table+400+ecx],'.' je chdot loop looplsc jmp chnodot chdot: mov ebx,dword [count] cld mov ecx,5 mov edi,tic_table+400 add edi,ebx mov esi,dzero rep movsb mov eax,6 mov ebx,tic_table+400 mov ecx,0 mov edx,-1 mov esi,tic_table+25000 int 0x40 cmp eax,4294967295 je nosuchfile jmp lschok chnodot: mov ebx,dword [count] mov edi,tic_table+400 add edi,ebx mov esi,ddot movsb inc ebx cld mov ecx,3 mov edi,tic_table+400 add edi,ebx mov esi,fill3 rep movsb mov eax,6 mov ebx,tic_table+400 mov ecx,0 mov edx,-1 mov esi,tic_table+25000 int 0x40 cmp eax,4294967295 je nosuchfile mov edi,tic_table+400 add edi,dword [count] mov esi,fill1 movsb lschok: call newline mov eax,4 mov ebx,6 shl ebx,16 add ebx,[xpos] mov edx,tic_table+400 mov esi,12 mov ecx,0x00ddeeff int 0x40 cld mov ecx,12 mov edi,tic_table add edi,dword [linen] mov esi,tic_table+400 rep movsb add dword [linen],12 add dword [linel],12 add dword [count],3 cmp byte [callp],1 je go jmp ecmd ps: call oldcmd call cls2 call newline mov edx,proc_head call printf call newline mov edx,proc_hd11 call printf call newline call newline mov eax,9 mov ebx,tic_table mov ecx,1 int 0x40 mov dword [count2],eax ll1: inc dword [pn] mov eax,9 mov ebx,tic_table mov ecx,[pn] int 0x40 mov ebx,[tic_table+30] mov dword [fnumb],4 mov dword [ypos],6 call decnumb cld mov ecx,4 mov edi,tic_table add edi,dword [linen] mov esi,tic_table+200 rep movsb add dword [linen],5 add dword [linel],5 cld mov ecx,11 mov esi,tic_table+10 mov edi,pname rep movsb mov dword [ypos],36 mov edx,pname mov eax,4 mov ebx,[ypos] shl ebx,16 add ebx,[xpos] mov ecx,0x00ddeeff mov esi,12 int 0x40 cld mov ecx,11 mov edi,tic_table add edi,dword [linen] mov esi,pname rep movsb add dword [linen],10 add dword [linel],10 mov dword [ypos],94 mov ebx,[tic_table+22] mov dword [fnumb],8 call decnumb cld mov ecx,8 mov edi,tic_table add edi,dword [linen] mov esi,tic_table+200 rep movsb add dword [linen],10 add dword [linel],10 mov dword [ypos],154 mov ebx,[tic_table+26] mov dword [fnumb],8 call decnumb cld mov ecx,8 mov edi,tic_table add edi,dword [linen] mov esi,tic_table+200 rep movsb add dword [linen],12 add dword [linel],12 mov dword [ypos],228 mov ebx,[pn] mov dword [fnumb],4 call decnumb cld mov ecx,4 mov edi,tic_table add edi,dword [linen] mov esi,tic_table+200 rep movsb add dword [linel],4 add dword [linen],4 call newline mov dword [ypos],60 cmp dword [xpos],254 jne nscreen call pause2 call cls2 mov dword [xpos],24 call newline mov dword [ypos],60 mov edx,proc_head call printf call newline mov edx,proc_hd11 call printf call newline call newline nscreen: mov eax, dword [count2] cmp dword [pn],eax jne ll1 mov dword [pn],0 cmp byte [callp],1 je go jmp ecmd2 printn: mov eax,47 shl ebx,16 mov edx,[ypos] shl edx,16 add edx,[xpos] mov esi,0x00ddeeff int 0x40 ret pause2: call newline mov edx,mess1 call printf mov eax,10 int 0x40 red3: cmp eax,2 je back cmp eax,3 je exit call draw call red mov eax,10 int 0x40 jmp red3 back: mov eax,2 int 0x40 cmp ah,27 je checmd ret exit: mov eax,-1 int 0x40 checmd: cmp byte [callp],1 je ecmd3 jmp ecmd err: call clearsum call newline call ppr cmp dword [count],0 je ecmd1 mov edx,err1 mov eax,4 mov ebx,[ypos] shl ebx,16 add ebx,[xpos] mov ecx,0x00ddeeff mov esi,27 int 0x40 cld mov ecx,27 mov edi,tic_table add edi,dword [linen] mov esi,err1 rep movsb add dword [linen],27 add dword [linel],27 call clearcmd jmp cmd_ok2 nparam: cmp byte [callp],1 je gonext4 call clearsum gonext4: call newline mov edx,mess2 call printf cmp byte [callp],1 je go jmp ecmd nparam2: cmp byte [callp],1 je gonext3 call clearsum gonext3: call newline mov edx,mess5 call printf cmp byte [callp],0 je ecmd jmp go cp: cmp byte [callp],1 je gonext10 call clearsum gonext10: sub dword [count],3 cld mov ecx,dword [count] mov edi,tic_table+400 mov esi,tic_table+600 add esi,3 rep movsb mov ecx,12 loop50: cmp byte [tic_table+400+ecx],'+' je file2 loop loop50 add dword [count],3 jmp nparam3 file2: mov dword [f1len],ecx inc ecx mov ebx,ecx cld mov edi,tic_table+9000 mov esi,tic_table+400 rep movsb mov ecx,12 mov edi,tic_table+9100 mov esi,tic_table+400 add esi,ebx rep movsb mov ebx,tic_table+9000 push esi edi ecx eax mov esi,ebx mov edi,tic_table+9000 mov ecx,12 strup3: mov al,[esi] cmp al,'A' jb @f cmp al,'z' ja @f cmp al,'a' jb @f add al,-0x20 @@: mov [edi],al inc esi inc edi dec ecx jnz strup3 pop eax ecx edi esi mov ecx,dword [f1len] loopcp: cmp byte [tic_table+9000+ecx],'.' je chdotcp loop loopcp jmp chnodotcp chdotcp: mov ebx,dword [f1len] cld mov ecx,4 mov edi,tic_table+9000 add edi,ebx mov esi,dzero rep movsb jmp gocp1 chnodotcp: mov ebx,dword [f1len] mov edi,tic_table+9000 add edi,ebx mov esi,ddot movsb inc ebx cld mov ecx,3 mov edi,tic_table+9000 add edi,ebx mov esi,fill3 rep movsb gocp1: mov eax,6 mov ebx,tic_table+9000 mov ecx,0 mov edx,-1 mov esi,tic_table+25000 int 0x40 cmp eax,4294967295 je nosuchfile mov dword [filesize],eax mov ebx,tic_table+9100 push esi edi ecx eax mov esi,ebx mov edi,tic_table+9100 mov ecx,12 strup4: mov al,[esi] cmp al,'A' jb @f cmp al,'z' ja @f cmp al,'a' jb @f add al,-0x20 @@: mov [edi],al inc esi inc edi dec ecx jnz strup4 pop eax ecx edi esi mov ebx,dword [f1len] mov ecx,dword [count] sub ecx,ebx mov dword [f2len],ecx loopcp2: cmp byte [tic_table+9100+ecx],'.' je chdotcp2 loop loopcp2 jmp chnodotcp2 chdotcp2: mov ebx,dword [f2len] cld mov ecx,4 mov edi,tic_table+9100 add edi,ebx mov esi,dzero rep movsb jmp gocp2 chnodotcp2: mov ebx,dword [f2len] mov edi,tic_table+9100 add edi,ebx mov esi,ddot movsb inc ebx cld mov ecx,3 mov edi,tic_table+9100 add edi,ebx mov esi,fill3 rep movsb gocp2: mov eax,6 mov ebx,tic_table+9100 mov ecx,0 mov edx,-1 mov esi,tic_table+25000 int 0x40 cmp eax,4294967295 jne alreadyexist mov eax,33 mov ebx,tic_table+9100 mov ecx,tic_table+25000 mov edx,dword [filesize] mov esi,0 int 0x40 cmp eax,0 jne no_ok mov eax,6 mov ebx,tic_table+9100 mov ecx,0 mov edx,-1 mov esi,tic_table+25000 int 0x40 cmp eax,4294967295 je no_ok call newline mov edx,mess11 call printf jmp cp_end no_ok: call newline mov edx,mess12 call printf cp_end: add dword [count],3 cmp byte [callp],1 je go jmp ecmd alreadyexist: add dword [count],3 call newline mov edx,mess13 call printf cmp byte [callp],1 je go jmp ecmd rn: cmp byte [callp],1 je gonext11 call clearsum gonext11: sub dword [count],3 cld mov ecx,dword [count] mov edi,tic_table+400 mov esi,tic_table+600 add esi,3 rep movsb mov ecx,12 loop51: push ecx cmp byte [tic_table+400+ecx],'+' je file3 pop ecx loop loop51 add dword [count],3 jmp nparam4 file3: mov dword [f1len],ecx inc ecx mov ebx,ecx cld mov edi,tic_table+9000 mov esi,tic_table+400 rep movsb mov ecx,12 mov edi,tic_table+9100 mov esi,tic_table+400 add esi,ebx rep movsb mov ebx,tic_table+9000 push esi edi ecx eax mov esi,ebx mov edi,tic_table+9000 mov ecx,12 strup5: mov al,[esi] cmp al,'A' jb @f cmp al,'z' ja @f cmp al,'a' jb @f add al,-0x20 @@: mov [edi],al inc esi inc edi dec ecx jnz strup5 pop eax ecx edi esi mov ecx,dword [f1len] looprn: cmp byte [tic_table+9000+ecx],'.' je chdotrn loop looprn jmp chnodotrn chdotrn: mov ebx,dword [f1len] cld mov ecx,4 mov edi,tic_table+9000 add edi,ebx mov esi,dzero rep movsb jmp gorn1 chnodotrn: mov ebx,dword [f1len] mov edi,tic_table+9000 add edi,ebx mov esi,ddot movsb inc ebx cld mov ecx,3 mov edi,tic_table+9000 add edi,ebx mov esi,fill3 rep movsb gorn1: mov eax,6 mov ebx,tic_table+9000 mov ecx,0 mov edx,-1 mov esi,tic_table+25000 int 0x40 cmp eax,4294967295 je nosuchfile mov ebx,tic_table+9100 push esi edi ecx eax mov esi,ebx mov edi,tic_table+9100 mov ecx,12 strup6: mov al,[esi] cmp al,'A' jb @f cmp al,'z' ja @f cmp al,'a' jb @f add al,-0x20 @@: mov [edi],al inc esi inc edi dec ecx jnz strup6 pop eax ecx edi esi mov ebx,dword [f1len] mov ecx,dword [count] sub ecx,ebx mov dword [f2len],ecx looprn2: cmp byte [tic_table+9100+ecx],'.' je chdotrn2 loop looprn2 jmp chnodotrn2 chdotrn2: mov ebx,dword [f2len] cld mov ecx,4 mov edi,tic_table+9100 add edi,ebx mov esi,dzero rep movsb jmp gorn2 chnodotrn2: mov ebx,dword [f2len] mov edi,tic_table+9100 add edi,ebx mov esi,ddot movsb inc ebx cld mov ecx,3 mov edi,tic_table+9100 add edi,ebx mov esi,fill3 rep movsb gorn2: mov eax,6 mov ebx,tic_table+9100 mov ecx,0 mov edx,-1 mov esi,tic_table+25000 int 0x40 cmp eax,4294967295 jne alreadyexist mov eax,6 mov ebx,tic_table+9000 mov ecx,0 mov edx,-1 mov esi,tic_table+25000 int 0x40 mov dword [filesize],eax mov eax,33 mov ebx,tic_table+9100 mov ecx,tic_table+25000 mov edx,dword [filesize] mov esi,0 int 0x40 cmp eax,0 jne no_ok1 mov eax,6 mov ebx,tic_table+9100 mov ecx,0 mov edx,-1 mov esi,tic_table+25000 int 0x40 cmp eax,4294967295 je no_ok1 mov eax,32 mov ebx,tic_table+9000 int 0x40 call newline mov edx,mess14 call printf jmp rn_end no_ok1: call newline mov edx,mess15 call printf rn_end: add dword [count],3 cmp byte [callp],1 je go jmp ecmd del: cmp byte [callp],1 je gonext12 call clearsum gonext12: sub dword [count],4 cld mov ecx,dword [count] mov edi,tic_table+400 mov esi,tic_table+600 add esi,4 rep movsb mov ebx,tic_table+400 push esi edi ecx eax mov esi,ebx mov edi,tic_table+400 mov ecx,70 strup1: mov al,[esi] cmp al,'A' jb @f cmp al,'z' ja @f cmp al,'a' jb @f add al,-0x20 @@: mov [edi],al inc esi inc edi dec ecx jnz strup1 pop eax ecx edi esi mov ecx,dword [count] loopdel: cmp byte [tic_table+400+ecx],'.' je chdotdel loop loopdel jmp chnodotdel chdotdel: mov ebx,dword [count] cld mov ecx,4 mov edi,tic_table+400 add edi,ebx mov esi,dzero rep movsb jmp godel chnodotdel: mov ebx,dword [count] mov edi,tic_table+400 add edi,ebx mov esi,ddot movsb inc ebx cld mov ecx,3 mov edi,tic_table+400 add edi,ebx mov esi,fill3 rep movsb godel: mov eax,6 mov ebx,tic_table+400 mov ecx,0 mov edx,-1 mov esi,tic_table+25000 int 0x40 cmp eax,4294967295 je nosuchfile2 mov eax,32 mov ebx,tic_table+400 int 0x40 call newline mov edx,mess6 call printf add dword [count],4 del_end: add dword [count],4 cmp byte [callp],1 je go jmp ecmd nosuchfile: add dword [count],3 call newline mov edx,mess7 call printf cmp byte [callp],0 je ecmd jmp go nosuchfile2: add dword [count],4 call newline mov edx,mess7 call printf cmp byte [callp],1 je go jmp ecmd nosuchfile3: inc dword [count] call newline mov edx,mess7 call printf jmp ecmd autoexec: mov eax,6 mov ebx,autoexfile mov ecx,0 mov edx,-1 mov esi,tic_table+15000 int 0x40 cmp eax,4294967295 je noaxfile sub dword [linen],81 sub dword [xpos],10 dec dword [lpress] jmp autolabel noaxfile: ret command: call clearsum dec dword [count] cld mov ecx,dword [count] mov edi,filename mov esi,tic_table+601 rep movsb mov ebx,filename push esi edi ecx eax mov esi,ebx mov edi,filename mov ecx,12 strup7: mov al,[esi] cmp al,'A' jb @f cmp al,'z' ja @f cmp al,'a' jb @f add al,-0x20 @@: mov [edi],al inc esi inc edi dec ecx jnz strup7 pop eax ecx edi esi cld mov ecx,4 mov edi,filename+8 mov esi,dcmd rep movsb mov eax,6 mov ebx,filename mov ecx,0 mov edx,-1 mov esi,tic_table+15000 int 0x40 cmp eax,4294967295 je nosuchfile3 autolabel: mov dword [filesize2],eax mov byte [callp],1 go: call clearcmd gonext: cmp dword [filesize2],0 je ecmd3 mov ebx,tic_table add ebx,dword [readcnt] cmp byte [ebx],13 je read inc dword [readcnt] inc dword [readcnt2] dec dword [filesize2] jmp gonext read: mov ecx,dword [readcnt2] mov ebx,0 mov edx,dword [readcnt] sub edx,dword [readcnt2] loop60: push ecx mov edi,tic_table+600 add edi,ebx mov esi,tic_table add esi,edx movsb inc ebx inc edx pop ecx loop loop60 mov eax,dword [readcnt2] mov dword [count],eax mov dword [readcnt2],0 add dword [readcnt],2 jmp checkcmd decnumb: cmp dword [fnumb],4 je go1 call divide mov dword [n8],edx mov ebx,eax call divide mov dword [n7],edx mov ebx,eax call divide mov dword [n6],edx mov ebx,eax call divide mov dword [n5],edx mov ebx,eax go1: call divide mov dword [n4],edx mov ebx,eax call divide mov dword [n3],edx mov ebx,eax call divide mov dword [n2],edx mov ebx,eax call divide mov dword [n1],edx add dword [n1],48 add dword [n2],48 add dword [n3],48 add dword [n4],48 cmp dword [fnumb],4 je go2 add dword [n5],48 add dword [n6],48 add dword [n7],48 add dword [n8],48 go2: mov edi,tic_table+200 mov esi,n1 movsb mov edi,tic_table+201 mov esi,n2 movsb mov edi,tic_table+202 mov esi,n3 movsb mov edi,tic_table+203 mov esi,n4 movsb cmp dword [fnumb],4 je go4 mov edi,tic_table+204 mov esi,n5 movsb mov edi,tic_table+205 mov esi,n6 movsb mov edi,tic_table+206 mov esi,n7 movsb mov edi,tic_table+207 mov esi,n8 movsb go4: mov eax,4 mov ebx,[ypos] shl ebx,16 add ebx,[xpos] mov ecx,0x00ddeeff mov edx,tic_table+200 mov esi,dword [fnumb] int 0x40 ret divide: mov eax,ebx xor edx,edx mov ecx,10 div ecx ret kill: mov eax,0 mov ebx,0 mov ecx,0 mov edx,0 mov al, byte [tic_table+608] mov bl, byte [tic_table+607] mov cl, byte [tic_table+606] mov dl, byte [tic_table+605] sub al,48 sub bl,48 sub cl,48 sub dl,48 imul ebx,10 imul ecx,100 imul edx,1000 mov esi,0 add esi,eax add esi,ebx add esi,ecx add esi,edx mov ecx,esi mov eax,9 mov ebx,tic_table int 0x40 cmp eax,ecx jb nosuchprocess mov eax,18 mov ebx,2 mov edx,0 int 0x40 call clearsum call newline mov edx,mess3 call printf call newline mov edx,mess4 call printf cmp byte [callp],1 je go jmp ecmd ecmd1: sub dword [xpos],10 jmp ecmd nosuchprocess: call clearsum call newline mov edx,mess8 call printf cmp byte [callp],1 je go jmp ecmd echoeol: cmp byte [callp],1 je gonext15 call clearsum gonext15: call newline cmp byte [callp],1 je go jmp ecmd echo: cmp byte [callp],1 je gonext13 call clearsum gonext13: sub dword [count],5 cld mov ecx,dword [count] mov edi,tic_table+300 mov esi,tic_table+600 add esi,5 rep movsb call newline mov eax,4 mov ebx,6 shl ebx,16 add ebx,[xpos] mov edx,tic_table+300 mov ecx,0x00ddeeff mov esi,dword [count] int 0x40 cld mov ecx,dword [count] mov edi,tic_table add edi,dword [linen] mov esi,tic_table+300 rep movsb mov eax,dword [count] add dword [linen],eax add dword [linel],eax add dword [count],5 cmp byte [callp],1 je go jmp ecmd printf: mov eax,4 mov ebx,6 shl ebx,16 add ebx,[xpos] mov ecx,0x00ddeeff mov esi,45 int 0x40 cld mov ecx,45 mov edi,tic_table add edi,dword [linen] mov esi,edx rep movsb add dword [linen],46 add dword [linel],46 add dword [ypos],6 ret printipc: mov eax,4 mov ebx,6 shl ebx,16 add ebx,[xpos] mov ecx,0x00ddeeff mov esi,79 int 0x40 cld mov ecx,79 mov edi,tic_table add edi,dword [linen] mov esi,edx rep movsb add dword [linen],80 add dword [linel],80 mov dword [ypos],480 ret clearcmd: cld mov ecx,80 mov edi,tic_table+600 mov esi,tic_table+500 rep movsb mov ecx,80 mov edi,tic_table+400 mov esi,tic_table+500 rep movsb mov ecx,81 mov edi,tic_table+800 mov [esi],byte 'x' rep movsb mov ecx,12 mov edi,filename mov esi,pname rep movsb mov dword [count],0 mov dword [pn],0 mov dword [blockcnt],0 mov dword [lscnt],8024 ret oldcmd: mov eax,dword [count] mov dword [oldcount],eax cld mov ecx,81 mov edi,tic_table+900 mov esi,tic_table+500 rep movsb cld mov ecx,81 mov edi,tic_table+900 mov esi,tic_table+600 rep movsb ret ecmd: call oldcmd call clearcmd call newline call ppr call cursor jmp still ecmd2: call clearcmd call newline call ppr call cursor jmp still ecmd3: call clearcmd call newline call ppr call cursor mov dword [readcnt],15000 mov dword [readcnt2],0 mov byte [callp],0 mov dword [filesize2],0 jmp still chparam: pop ecx mov eax,ecx mov edx,eax push edx inc eax cld mov edi,tic_table+400 mov esi,tic_table+600 rep movsb mov ecx,dword [count] sub ecx,eax cld mov edi,tic_table+800 mov esi,tic_table+600 add esi,eax rep movsb pop edx mov dword [ipccount],edx cld mov ecx,11 mov edi,tic_table+400 add edi,edx mov esi,qspace rep movsb mov eax,19 mov ebx,tic_table+400 mov ecx,tic_table+800 int 0x40 cmp eax,0xfffffff0 jb cmd_ok jmp err cls: call oldcmd call cls2 cmp byte [callp],0 jne needret call clearcmd call ppr call cursor jmp still needret: sub dword [linen],81 dec dword [lpress] sub dword [xpos],10 jmp gonext cls1: mov eax,13 mov ebx,6*65536+486 mov ecx,24*65536+250 mov edx,0 int 0x40 ret cls2: mov dword [linen],2000 mov ecx,2025 loop2: push ecx mov edi,tic_table add edi,dword [linen] mov esi,fill1 movsb inc dword [linen] pop ecx loop loop2 mov dword [linel],0 mov dword [linen],2000 mov dword [linev],2000 mov dword [xpos],24 mov dword [ypos],6 mov dword [lpress],1 mov dword [stnum],1 call cls1 ret chscr: cmp dword [xpos],264 jne no_scr mov dword [cnt_loop1],4500 mov dword [cnt_loop2],2000 mov ecx,2025 loop10: push ecx mov edi,tic_table add edi,dword [cnt_loop1] mov esi,tic_table add esi,dword [cnt_loop2] movsb inc dword [cnt_loop1] inc dword [cnt_loop2] pop ecx loop loop10 mov dword [cnt_loop1],2000 mov ecx,2025 loop11: push ecx mov edi,tic_table add edi,dword [cnt_loop1] mov esi,fill1 movsb inc dword [cnt_loop1] pop ecx loop loop11 mov dword [cnt_loop1],2000 mov dword [cnt_loop2],4581 mov ecx,1944 loop12: push ecx mov edi,tic_table add edi,dword [cnt_loop1] mov esi,tic_table add esi,dword [cnt_loop2] movsb inc dword [cnt_loop1] inc dword [cnt_loop2] pop ecx loop loop12 dec dword [lpress] sub dword [linen],81 mov dword [xpos],264 mov dword [ypos],6 mov dword [clr],480 call clear call red no_scr: ret newline: call chscr push edx mov edx,81 sub edx,dword [linel] add dword [linen],edx pop edx inc dword [lpress] mov dword [linel],0 add dword [xpos],10 ret fill: cld mov ecx,81 mov edi,tic_table+500 mov esi,fill1 rep movsb ret nparam3: cmp byte [callp],1 je gonext5 call clearsum gonext5: call newline mov edx,mess9 call printf cmp byte [callp],1 je go jmp ecmd nparam4: cmp byte [callp],1 je gonext6 call clearsum gonext6: call newline mov edx,mess0 call printf cmp byte [callp],1 je go jmp ecmd nparam5: cmp byte [callp],1 je gonext14 call clearsum gonext14: call newline mov edx,mess16 call printf jmp ecmd endscr: cmp byte [callp],1 je ecmd3 call clearsum call newline mov edx,mess17 call printf jmp ecmd checkcmd: cmp dword [tic_table+600],'help' jne no_help cmp dword [count],4 jne no_help jmp help no_help: cmp dword [tic_table+600],'exit' jne no_exit cmp dword [count],4 jne no_exit jmp exit no_exit: cmp word [tic_table+600],'ve' jne no_ver cmp byte [tic_table+602],'r' jne no_ver cmp dword [count],3 jne no_ver jmp ver no_ver: cmp word [tic_table+600],'cl' jne no_cls cmp byte [tic_table+602],'s' jne no_cls cmp dword [count],3 jne no_cls jmp cls no_cls: cmp dword [tic_table+600],'shut' jne no_shutdown cmp dword [tic_table+604],'down' jne no_shutdown cmp dword [count],8 jne no_shutdown mov eax,18 mov ebx,1 int 0x40 mov eax,5 mov ebx,200 int 0x40 no_shutdown: cmp word [tic_table+600],'ps' jne no_ps cmp dword [count],2 je ps no_ps: cmp dword [tic_table+600],'kill' jne no_kill cmp byte [tic_table+604],' ' jne no_kill cmp dword [count],9 je kill jmp nparam no_kill: cmp dword [tic_table+600],'paus' jne no_pause cmp byte [tic_table+604],'e' jne no_pause cmp dword [count],5 je pause1 no_pause: cmp dword [tic_table+600],'echo' jne no_echo cmp dword [count],4 je echoeol cmp byte [tic_table+604],' ' je echo no_echo: cmp word [tic_table+600],'de' jne no_del cmp byte [tic_table+602],'l' jne no_del cmp byte [tic_table+603],' ' jne no_del cmp dword [count],3 je nparam2 cmp dword [count],4 je nparam2 jmp del no_del: cmp word [tic_table+600],'ls' jne no_ls cmp dword [count],2 je ls cmp dword [count],3 je ls jmp lscheck no_ls: cmp word [tic_table+600],'cp' jne no_cp cmp dword [count],2 je nparam3 cmp dword [count],3 je nparam3 cmp dword [count],4 je nparam3 cmp dword [count],5 je nparam3 cmp byte [tic_table+602],' ' jne no_cp jmp cp no_cp: cmp word [tic_table+600],'rn' jne no_rn cmp dword [count],2 je nparam4 cmp dword [count],3 je nparam4 cmp dword [count],4 je nparam4 cmp dword [count],5 je nparam4 cmp byte [tic_table+602],' ' jne no_rn jmp rn no_rn: cmp dword [tic_table+600],'ends' jne no_end cmp dword [count],4 je endscr no_end: cmp byte [callp],1 je checkprg ret checkprg: mov ebx,tic_table+600 push esi edi ecx eax mov esi,ebx mov edi,tic_table+600 mov ecx,74 strup: mov al,[esi] cmp al,'A' jb @f cmp al,'z' ja @f cmp al,'a' jb @f add al,-0x20 @@: mov [edi],al inc esi inc edi dec ecx jnz strup pop eax ecx edi esi mov ecx,dword [count] loop20: push ecx cmp byte [tic_table+600+ecx],'&' je chparam pop ecx loop loop20 cld mov ecx,11 mov edi,tic_table+600 add edi,dword [count] mov esi,qspace rep movsb mov eax,19 mov ebx,tic_table+600 mov ecx,0 int 0x40 cmp eax,0xfffffff0 jb cmd_ok_1 jmp err cmd_ok_1: mov eax,dword [count] mov dword [ipccount],eax cmd_ok: mov eax,60 mov ebx,1 mov ecx,ipcb mov edx,118 int 0x40 call clearipc mov eax,40 mov ebx,01000111b int 0x40 mov eax,23 mov ebx,10 int 0x40 cmp eax,7 jne noipc cmp byte [callp],1 je printipcprgname call clearsum ipccontinue: mov eax,9 mov ebx,tic_table+100000 mov ecx,-1 int 0x40 mov ecx,eax loopfindipc: push ecx mov eax,9 mov ebx,tic_table+100000 int 0x40 mov bl,[tic_table+600] cmp byte [tic_table+100000+10],bl jne goonipc cmp dword [ipccount],1 je ipcfinished mov bl,[tic_table+601] cmp byte [tic_table+100000+11],bl jne goonipc cmp dword [ipccount],2 je ipcfinished mov bl,[tic_table+602] cmp byte [tic_table+100000+12],bl jne goonipc cmp dword [ipccount],3 je ipcfinished mov bl,[tic_table+603] cmp byte [tic_table+100000+13],bl jne goonipc cmp dword [ipccount],4 je ipcfinished mov bl,[tic_table+604] cmp byte [tic_table+100000+14],bl jne goonipc cmp dword [ipccount],5 je ipcfinished mov bl,[tic_table+605] cmp byte [tic_table+100000+15],bl jne goonipc cmp dword [ipccount],6 je ipcfinished mov bl,[tic_table+606] cmp byte [tic_table+100000+16],bl jne goonipc cmp dword [ipccount],7 je ipcfinished mov bl,[tic_table+607] cmp byte [tic_table+100000+17],bl jne goonipc goonipc: pop ecx dec ecx jnz loopfindipc ipcfinished: mov ebx,[tic_table+100000+30] mov dword [ipcpid],ebx mov eax,60 mov ebx,2 mov ecx,dword [ipcpid] mov edx,ddot mov esi,1 int 0x40 call newline call clearipc jmp waitipc printipcprgname: call newline call printcmd jmp ipccontinue noipc: cmp byte [callp],1 je prtcmd call clearsum jmp cmd_ok2 printcmd: mov eax,4 mov ebx,6 shl ebx,16 add ebx,[xpos] mov edx,tic_table+600 mov ecx,0x00ddeeff mov esi,dword [count] int 0x40 cld mov ecx,dword [count] mov edi,tic_table add edi,dword [linen] mov esi,tic_table+600 rep movsb mov eax,dword [count] add dword [linen],eax add dword [linel],eax ret prtcmd: call newline call printcmd jmp go cmd_ok2: cmp byte [callp],1 je go ret waitipc: mov eax,40 mov ebx,01000111b int 0x40 mov eax,10 int 0x40 cmp eax,7 je ipcok cmp eax,1 je reipc cmp eax,3 je exit cmp eax,2 je keyipc jmp waitipc keyipc: mov eax,2 int 0x40 jmp waitipc reipc: call draw call red jmp waitipc clearipc: cld mov ecx,118 mov edi,ipcb mov esi,ipcc rep movsb ret ipcok: cmp dword [ipcb+16],'~ccc' je ipccls cmp dword [ipcb+16],'~eee' je endipc cmp dword [ipcb+16],'~lll' je ipcline cmp dword [ipcb+16],'~ppp' je ipcprint cmp dword [ipcb+16],'~kkk' je ipckey jmp waitipc reipc2: call draw call red ipckey: mov eax,10 int 0x40 cmp eax,1 je reipc2 cmp eax,3 je exit cmp eax,2 je ipckeypressed jmp ipckey ipckeypressed: mov eax,2 int 0x40 mov byte [ipckeyvalue],ah mov eax,60 mov ebx,2 mov ecx,dword [ipcpid] mov edx,ipckeyvalue mov esi,1 int 0x40 call clearipc jmp waitipc ipccls: call cls2 call clearipc jmp waitipc ipcline: call newline call clearipc jmp waitipc ipcprint: mov edx,ipcb+20 call printipc call clearipc jmp waitipc endipc: cmp byte [callp],1 je go call clearsum jmp ecmd cmdexist: mov eax,9 mov ebx,tic_table mov ecx,-1 int 0x40 mov ecx,eax loopex: push ecx mov eax,9 mov ebx,I_END int 0x40 cmp word [I_END+10],'CM' jne no_cmd cmp byte [I_END+12],'D' jne no_cmd inc byte [cmd_ex] cmp byte [cmd_ex],2 je exit no_cmd: pop ecx loop loopex ret title: db 'CMD - Command line interpreter' title_end: smb_cursor db '|' prompt db 'CMD>>' h1 db ' CMD - Command line interpreter version 0.26 ' h2 db ' copyleft Chemist - dmitry_gt@tut.by ' h3 db ' Available commands: ' h4 db ' HELP - Display this text LS - List files ' h5 db ' EXIT - Exit Programm CP - Copy file ' h6 db ' CLS - Clear Screen PS - Process info ' h7 db ' KILL - Kill Process RN - Rename File ' h8 db ' VER - Display programm version ' h9 db ' DEL - Delete file from ramdisk ' h10 db ' SHUTDOWN - Quit Menuet ' h11 db ' PAUSE - Wait for keypress ' h12 db ' ECHO - Print text to screen ' h13 db ' ENDS - End script ' h14 db ' /[filename] - Execute script ' h15 db ' Use & symbol to enter params: ' h16 db ' tinypad&cmd.asm - open cmd.asm ' about db 'Command Line Interpreter version 0.26 ' err1 db 'Unknown command or filename' proc_head db ' PID Name Start Length Proc_NUMB ' proc_hd11 db '-------------------------------------------- ' mess1 db 'Press any key to continue (ESC - Cancel)... ' mess2 db 'Plz specify a 4 byte process number (not PID) ' mess3 db 'Process with number you specified has been ' mess4 db 'terminated. ' mess5 db 'Usage: del [filename] ' mess6 db 'Filename you specified has been deleted. ' mess7 db 'No such file! ' mess8 db 'No such process! ' mess9 db 'Usage: cp [source_file+destination_file] ' mess0 db 'Usage: rn [source_file+destination_file] ' mess11 db 'File successfully copied ' mess12 db 'ERROR: Can not copy file! ' mess13 db 'ERROR: Output file alredy exist! ' mess14 db 'File successfully renamed ' mess15 db 'ERROR: Can not rename file! ' mess16 db 'You must specify a command script filename! ' mess17 db 'This command is available only in scripts! ' linen dd 2000 lpress dd 1 linel dd 0 linev dd 2000 stnum dd 1 rdstat dd 0 ypos dd 6 xpos dd 24 count dd 0 clr dd 0 smb db 0 pn dd 0 count2 dd 0 count3 dd 9 oldcount dd 0 oldcount1 dd 0 fnumb dd 0 n1 dd 0 n2 dd 0 n3 dd 0 n4 dd 0 n5 dd 0 n6 dd 0 n7 dd 0 n8 dd 0 ddot db '.' dcmd db '.CMD',0 cnt_loop1 dd 0 cnt_loop2 dd 0 lscnt dd 8024 blockcnt dd 0 lscntf db 0 lscntx db 0 filesize dd 0 filesize2 dd 0 readcnt dd 15000 readcnt2 dd 0 callp db 0 callp2 db 0 fill1 db ' ' fill3 db ' ',0 pname db ' ',0 autoexfile db 'AUTOEXEC.CMD',0 filename db ' ',0 dzero db 0,0,0,0 qspace db ' ' f1len dd 0 f2len dd 0 ipcpid dd 0 ipckeyvalue db 0 ipccount dd 0 cmd_ex db 0 ipcb: db 0 db 0,0,0 dd 8 times 110 db 0 ipcc: db 0 db 0,0,0 dd 8 times 110 db 0 I_END: tic_table: