
 /****************************************************************************
 **									    **
 **		-- TEdi --    (c) 21.4.88 by TAA			    **
 **									    **
 console*********************************************************************/


 /******  Globals  */

extern struct MsgPort  *CreatePort();
extern struct IOStdReq *CreateStdIO();
extern struct ExecBase *SysBase;

extern char Lstr[];
extern int m0,m1,m2;
struct NewWindow nw = {
	0,0,640,256,
	-1,-1,
	NULL,
	WINDOWDEPTH|ACTIVATE|GIMMEZEROZERO,
	NULL,
	NULL,
	"  TEdi V1.0                                           © & ® 1988 by TAA!",
	NULL,
	NULL,
	0,0,0,0,
	WBENCHSCREEN };

struct Window *w;
struct IOStdReq *cWM,*cRM;
struct MsgPort  *cWP,*cRP;
struct IntuitionBase *IntuitionBase;
struct FileInfoBlock *fib;

long GfxBase;
char e,*cpy,*bmp,*Wbuf,*Inbuf,*CJbuf,*CSbuf,*CRbuf;
char curoff[] = { 0x9b,0x30,0x20,0x70,0x00 },curon[] = { 0x9b,0x20,0x70,0x00 };

 /******  SubRoutines  */

Init()
{
CRbuf          = AllocMem(30,MEMF_PUBLIC);
CSbuf	       = AllocMem(30,MEMF_PUBLIC);
CJbuf	       = AllocMem(5,MEMF_PUBLIC);
Inbuf	       = AllocMem(80,MEMF_PUBLIC);
Wbuf	       = AllocMem(256,MEMF_PUBLIC);
fib            = AllocMem(sizeof(struct FileInfoBlock),MEMF_PUBLIC);
cpy            = (UBYTE *)AllocMem(1024,MEMF_PUBLIC);
bmp            = (UBYTE *)AllocMem(2050,MEMF_PUBLIC);
IntuitionBase  = OpenLibrary("intuition.library",0);
GfxBase        = OpenLibrary("graphics.library",0);
cWP            = CreatePort("my.con.write",0);
cWM            = CreateStdIO(cWP);
cRP            = CreatePort("my.con.read",0);
cRM            = CreateStdIO(cRP);
w              = (struct Window *) OpenWindow(&nw);
cWM->io_Data   = (APTR) w;
cWM->io_Length = sizeof(*w);
                 OpenDevice("console.device",0,cWM,0);
cRM->io_Device = cWM->io_Device;
cRM->io_Unit   = cWM->io_Unit;
                 QueueRead();
}


ReInit()
{
FreeMem(CRbuf,30);
FreeMem(CSbuf,30);
FreeMem(CJbuf,5);
FreeMem(Inbuf,80);
FreeMem(Wbuf,256);
FreeMem(fib,sizeof(struct FileInfoBlock));
FreeMem(cpy,1024);
FreeMem(bmp,2050);
if (CheckIO(cRM) == FALSE) AbortIO(cRM);
WaitPort(cRP);
GetMsg(cRP);
CloseDevice(cWM);
CloseWindow(w);
DeleteStdIO(cRM);
DeletePort(cRP);
DeleteStdIO(cWM);
DeletePort(cWP);
CloseLibrary(GfxBase);
CloseLibrary(IntuitionBase);
}


print(str)
char *str;
{
cWM->io_Command = CMD_WRITE;
cWM->io_Data    = (APTR)str;
cWM->io_Length  = -1;
DoIO(cWM);
}


prtlen(str,len)
char *str;
int len;
{
cWM->io_Command = CMD_WRITE;
cWM->io_Data    = (APTR)str;
cWM->io_Length  = len;
DoIO(cWM);
}


setcur(x,y)
int x,y;
{
int i,j,a[2];
char seq[7];

a[0]   = y; a[1]   = x;
seq[0] = 0x9b; seq[3] = ';'; seq[6] = 'H'; seq[7] = 0;
for(i=0;i<2;i++)
	{
	j = a[i]/10;
	seq[i*3+1] = j+48;
	seq[i*3+2] = a[i]-j*10+48;
	}
print(seq);
}


QueueRead()
{
cRM->io_Command = CMD_READ;
cRM->io_Data    = (APTR)&e;
cRM->io_Length  = 1;
SendIO(cRM);
}


char get()
{
register char i;

if (GetMsg(cRP) == NULL) return(0);
i=e;
QueueRead();
return(i);
}


prtdez (x,y,digits,value)
int x,y,digits;
ULONG value;
{
char str[10];
int i;

for (i=digits-1;i >= 0;i--)
	{
	str[digits-i-1] = (value/pow(i))+48;
	value           = value-(value/pow(i))*pow(i);
	}
str[digits]=0;
Move(w->RPort,x*8,y*8+6);
Text(w->RPort,str,digits);
}


int pow(expo)
int expo;
{
register i,j=1;

if (expo == 0) return(1);
for (i=1;i<=expo;i++) j*=10;
return (j);
}


InitFile(file,str)
struct File *file;
char        *str;
{
strcpy(file->Fname,str);
file->x =        0;
file->y =        0;
file->Mode =     0;
file->ActLine  = 1;
file->Actl.pos = 0;
file->SFlag =    1;
if (file->undel != 0)
	{
	killine(file->undel);
	file->undel = 0;
	}
}


LoadFile(file)
struct File *file;
{
long f,lck;
int laenge,i=0,j=1,k=0,l;
char *buff,*x,*y,*buffi;
struct Line *Help,*Holp;

Examine(lck=Lock(file->Fname,ACCESS_READ),fib);
if((lck!=0) && (fib->fib_Size !=0))
	{
	laenge       = fib->fib_Size;
	UnLock(lck);
	buff         = AllocMem(laenge,MEMF_PUBLIC);
	f            = Open(file->Fname,1005);
	Read(f,buff,laenge);
	Close(f);
	Help         = AllocMem(sizeof(struct Line),MEMF_PUBLIC);
	file->first  = Help;
	Help->prev   = 0;
	buffi        = buff;
	for(i=0;i<laenge;i++)
		{
		if(*(buff+i)==10)
			{
			Help->len    = (UBYTE)j;
			Help->string = AllocMem(j,MEMF_PUBLIC);
			x            = Help->string;
			y            = buffi;
			for(l=0;l<j;l++) *x++ = *y++;
			Holp         = AllocMem(sizeof(struct Line),MEMF_PUBLIC);
			Help->next   = Holp;
			Holp->prev   = Help;
			Help         = Holp;
			buffi        = buff+i+1;
			j            = 0;
			k++;
			}
		j++;
		}
	file->last       = Help->prev;
	Help->prev->next = 0;
	FreeMem(Help,sizeof(struct Line));
	file->AnzLines   = k;
	file->Actl.Line  = file->first;
	file->SFlag      = 1;
	FreeMem(buff,laenge);
	}
else
	{
	Help             = AllocMem(sizeof(struct Line),MEMF_PUBLIC);
	file->first      = Help;
	file->last       = Help;
	file->Actl.Line  = Help;
	file->AnzLines   = 1;
	file->SFlag      = 1;
	Help->prev       = 0;
	Help->next       = 0;
	Help->len        = 1;
	Help->string     = AllocMem(1,MEMF_PUBLIC);
	*(Help->string)  = 10;
	}
}


KillFile(file)
struct File *file;
{
struct Line *poi,*doi;

poi = file->first;
do
	{
	FreeMem(poi->string,poi->len);
	doi = poi;
	poi = poi->next;
	FreeMem(doi,sizeof(struct Line));
	}
while(poi!=0);
if (file->undel != 0)
	{
	killine(file->undel);
	file->undel = 0;
	}
}


prt(x,y,str,len)
int x,y,len;
char *str;
{
register int i,o,k=0,j;
register char *poi;

poi = bmp;
Move(w->RPort,x*8,y*8+6);
if (len>79) len = 79;

m0 = len; m1 = str; mcprt(); k = m0;

if (bmp[k-1] == 10) bmp[k-1] = 32;
if (k >= 79) k=79;
Text(w->RPort,bmp,k);
ClearEOL(w->RPort);
}

#asm

_mcprt	move.l _m0,d0
	move.l _m1,a0
	move.l _bmp,a1
	moveq  #0,d2

lab4	move.b (a0)+,d1
	cmpi.b #9,d1
	bne    lab3
	move.w d2,d3
	andi.w #$fff8,d3
	addq.w #8,d3
lab2	move.b #32,(a1)+
	addq.w #1,d2
	cmp.w  d2,d3
	bne    lab2
	bra    lab5
lab3	move.b d1,(a1)+
	addq.w #1,d2
lab5	subq.w #1,d0
	bne    lab4
	move.l d2,_m0
	rts

#endasm


prtmd(a,b,c)
int a,b,c;
{
SetAPen(w->RPort,a);
SetBPen(w->RPort,b);
SetDrMd(w->RPort,c);
}


int lenstr(str)
char *str;
{
int i;

for(i=0;*str++ != 0;i++);
return(i);
}


cursor(Mode)
int Mode;
{
if (Mode == 1) print(curon);
else print(curoff);
}


 /******  EndofTextFile  */

