ORG 100H
USE16

include 'macros.inc'

push cs
pop ax
mov ds,ax
mov es,ax

mov ax,03h
int 10h

callp WriteStr,0,1,0,9,Intro
callp WriteStr,0,2,0,12,Prompt

Main:
     callp WriteKey,5,2,0,10,Command

     push $

     ;I can't compare Command with Ver
     ;I want to have 0 in ax if Command=Ver
     callp CStr,Command,Ver
     or al,0
     jz CVer
     callp CStr,Command,Exit
     or al,0
     jz CExit


     pop cx
     callp CLine,5,2,0
     jmp Main


proc CStr,s1,s2
     begin
	mov si,[s1]
	mov di,[s1]
	repe cmpsb
	jne .e
	xor ax,ax
	.e:
     endp

proc WriteKey,x,y,b,f,buff
     begin
	mov  cx,[x]
	mov  dx,126
	add  dx,cx
	mov  di,[buff]
	.aloop:
	      xor  ax,ax
	      int  16h
	      cmp  al,13
	      je   .e
	      cmp  cx,dx
	      je   .e
	      mov  [di],al
	      mov  [di+1],byte 0
	      callp WriteStr,cx,[y],[b],[f],di
	      inc  cx
	      inc  di
	      jmp  .aloop
	      .e:
     endp

proc Cls,c
     begin
	mov ax,0B800h
	mov es,ax
	xor di,di
	mov ah, byte [c]
	shl ah, 4
	or  ah, al
	mov cx,4000
	rep stosw
     endp

proc CLine,x,y,c
     begin
	mov   ax, [y]
	dec   ax
	mov   cx, 80
	mul   cx
	add   ax, [x]
	shl   ax, 1
	mov   di, ax
	mov ax,0B800h
	mov es,ax
	mov ah, byte [c]
	shl ah, 4
	or  ah, al
	mov   cx, 160
	rep   stosw
     endp

proc WriteStr,x,y,b,f,msg
     begin
	pusha
	mov ax,0B800h
	mov es,ax

	mov   ax, [y]
	dec   ax
	mov   cx, 80
	mul   cx
	add   ax, [x]
	shl   ax, 1
	mov   di, ax

	mov   si, [msg]

	mov   ah, byte [b]
	mov   al, byte [f]
	shl   ah, 4
	or    ah, al

	lodsb
      Continue:
	stosw
	lodsb
	or  al,   0
	jnz Continue
	popa
     endp

CVer:
     callp WriteStr,0,1,0,15,Ver
     retn
CExit:
      int 20h



Intro db 'Command interpreter',0
Prompt db 'xcmd>',0
Ver  db 'ver',0
Exit db 'exit',0
RAM  db 'ram',0


Command:
  times 128 db 0