ORG 100H
USE16

include 'macros.inc'

push cs
pop  ax
mov  ds,ax
mov  es,ax

mov ax,03h
int 10h

callp CLine,0,1,9,80
callp CLine,0,2,9,80
callp CLine,0,25,9,80
callp WriteStr,35,1,9,15,Intro
callp WriteStr,0,2,0,12,Prompt
mov di,Command

Main:
     push $

     callp CLine,5,2,0,80
     callp WriteKey,5,2,0,10,Command
     callp CLine,5,2,0,1760
     callp CLine,0,25,9,80


     callp CStr,Command,Ver
     cmp al,0
     je CVer

     callp CStr,Command,Exit
     cmp al,0
     je CExit

     callp CStr,Command,ClS
     cmp al,0
     je CCls

     callp CStr,Command,CPUC
     cmp al,0
     je CCpu

     cmp al,27
     je CExit


     callp WriteStr,0,25,9,12,Bad
     pop cx
     jmp Main



proc CStr,a,b
	begin
	push di
	mov si, [a]
	mov di, [b]
     .a:
	mov bl, [si]
	cmp bl, [di]
	jne .e
	cmp bl, 0
	je .b
	inc si
	inc di
	jmp .a
     .b:
	xor ax, ax
     .e:
	pop di
	endp

proc WriteKey,x,y,b,f,buff
     begin
	push di
	mov  cx, [x]
	mov  dx, 126
	add  dx, cx
	mov  di, [buff]
	.aloop:
	      mov   [di],word 0
	      xor   ax,ax
	      int   16h

	      cmp   al,13
	      je    .e
	      cmp   cx,dx
	      je    .e

	      cmp   al,8
	      je    .del

	      cmp   al,32
	      jb    .e
	      cmp   al,126
	      jg    .e

	      mov   [di], al
	      callp WriteStr,cx,[y],[b],[f],di
	      inc   cx
	      inc   di
	      jmp   .aloop

	      .del:
	      cmp   cx, [x]
	      je    .aloop
	      dec   di
	      mov   [di],word 0
	      dec   cx
	      callp CLine,cx,2,0,160
	      callp WriteStr,cx,[y],[b],[f],di
	      jmp  .aloop

	      .e:
	      pop di
     endp

proc Cls,c
     begin
	push di
	mov  ax, 0B800h
	mov  es, ax
	xor  di, di
	mov  ah, byte [c]
	shl  ah, 4
	or   ah, al
	mov  cx, 4000
	rep  stosw
	pop  di
     endp

proc CLine,x,y,c,cc
     begin
	pusha
	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]
	mov   al, byte [c]
	and   al, 00000111b
	shl   ah, 4
	or    ah, al
	and   ah, 01111111b

	mov   cx, [cc]
	rep   stosw
	popa
     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
	and   ah, 01111111b

	lodsb
      Continue:
	stosw
	lodsb
	or    al, 0
	jnz Continue
	popa
     endp

CVer:
     callp WriteStr,0,6,0,12,Intro
     callp WriteStr,6,6,0,15,Version
     ret
CCls:
     callp CLine,5,2,0,1840
     ret

CCpu:
     xor   eax, eax
     CPUID
     mov   [CPUOEM], ebx
     mov   [CPUOEM+4], edx
     mov   [CPUOEM+8], ecx
     callp WriteStr,0,5,0,15,CpuInfo
     callp WriteStr,0,6,0,15,CPUOEM
     ret

CExit:
      int 20h



Intro	 db 'XBIOC',0
Prompt	 db 'xcmd>',0
Version  db 'eXtended Basic Input/Output Console v0.1 Alpha Release',0
CpuInfo  db '<Cpu Information>',0
Bad	 db 'Bad command ...',0

Ver	 db 'ver' ,0
Exit	 db 'exit',0
RAM	 db 'ram' ,0
ClS	 db 'cls' ,0
CPUC	 db 'cpu' ,0

CPUOEM:  times 97  db 0
Command: times 128 db 0
