/* ----------------------- ue12.c ----------------------------- */

#include "uedit.h"

void freeBufStacks()
{
struct CB  *bp;
register struct CB  *sbp;
register short  	i;

	sbp = buf[0];
	for (i=0; i<ALLBUFS; i++) {
		while (pop(&(bStack[i]),&bp))
				if (bp!=NULL) { buf[0] = bp; bp->Flags = 0; freeBuf(0); }
		bufPopStack[i] = 0;
	}
	buf[0] = sbp;
}

Fquit()
{
register struct Screen     *ss;
register short  	i,rtn;
struct CB			*bp;

	if (!downRexx()) goto FALSERTN;
	rtn = FALSE;
	for (i=0; i<ALLBUFS; i++) if (bStack[i]) { rtn = TRUE; break; }
	if (rtn && !yesNo("Throw away buffer stacks?","")) goto FALSERTN;
	while (busyWork()) if (FinputWaiting() || stopPause) {
FALSERTN:
		if (curBuf!=NULL || startFile(NULL)>=0) return(FALSE);
	}

	rtn = (short) *longPtrArgs[0];
	downWindow();

	if (fdKeyHelp!=NULL) Close((BPTR)fdKeyHelp);

/* ------------------- NEW NEW NEW NEW -------------- */
	freeDefines(gDefines);

	FstopSpell();
	freeCompileBuf();
	wipeCmds();
	freeMenus();
	for (i=0; i<=ALLBUFS; i++) {
		freeBuf(i);
		if (i<ALLBUFS) while (pop(&(nStack[i]),&bp));
	}
	freeBufStacks();

	FhyperClose();
	ss = edScreen;
	if (ss) {
		while (ss->FirstWindow) Delay(50L);
		CloseScreen(ss);
	}

	CloseLibrary((void *)IntuitionBase);
	CloseLibrary((void *)GfxBase);
	CloseLibrary((void *)DosBase);
	CloseLibrary((void *)DiskfontBase);
	if (ArpBase) CloseLibrary((void *)ArpBase);
	if (RexxSysBase) CloseLibrary((void *)RexxSysBase);
	OpenWorkBench();
/*    puts(COPYRIGHT);
*/
	exit(rtn);
}

Fdraw() 	/* x,y,color,mode,flag;;; flag=0 means do a move only */
{
register long	**l;
register long	x,y,mode,color;

	if (tiny) return(FALSE);
	l = longPtrArgs;
	x = *l[0];
	y = *l[1];
	if (x<=0) x = 0;
	if (x>=sWidth) x = sWidth;
	if (y<=0) y = 0;
	if (y>=sHeight) y = sHeight;
	color = *l[2];
	if (color >= 0 && color<=15) {
		if (curBuf) localColor = curBuf->colors;
		setColors((short)color);
	}
	if (*l[4]==0) {
		Move(rp,x,y);
		goto RTN;
	}

	if (y<=lineHeight[0]) cleared = 1;
	mode =  *l[3] & 255;
	SetDrMd(rp,mode);
	Draw(rp,x,y);
	SetDrMd(rp,(long)JAM2);
	suppressClear = TRUE;
RTN:	
	return(TRUE);
}

FloadKeys()
{
register UCHAR  *z,*fd;
register short  rtn;
register long	hi,lo;
register long	i;
long			version;
short			m,len;

	rtn = FALSE;
	fd = NULL;
	lo = *longPtrArgs[1];
	if (lo<1L || lo>=MAXMACROS) goto RTN;
	hi = *longPtrArgs[2];
	if (hi<lo) hi = lo;
	if (hi>=MAXMACROS) hi = MAXMACROS - 1;
	z = fixString(' ',0,63);
	if (z==NULL || *z<=' ') goto RTN;
	fd = openOld(z);
	if (fd==NULL) goto RTN;
	Read((BPTR)fd,&version,4L);
	if (version!=PARTIALVERSION) { versionMsg(z); goto RTN; }
	while (Read((BPTR)fd,&m,2L)==2L) {						/* read in cmds */
		Read((BPTR)fd,&len,2L);
		i = len;
		if (m<lo || m>hi) Seek((BPTR)fd,i,(ULONG)OFFSET_CURRENT);
		else {
			z = NULL;
			if (i>0L) {
				z = safeMem(i);
				if (z==NULL) goto RTN;
				if (Read((BPTR)fd,z,i)!=i) {
					FreeMem(z,i);
					goto RTN;
				}
			}
			version = (long)cmdTable[m];
			if (m==startupMacro) killMenus();
			if (version!=0L) FreeMem((void *)version,(long)cmdLens[m]);
			cmdTable[m] = z;
			cmdLens[m] = i;
/*  if (m==startupMacro) upMenus(); */
			rtn = TRUE;
		}
	}
RTN:
	if (fd!=NULL) Close((BPTR)fd);
	return(rtn);
}

FsaveKeys()
{
register UCHAR  *z,*fd;
register short  rtn,i;
register long	hi,lo;
long			version;
short			m,len;

	rtn = FALSE;
	fd = NULL;
	lo = *longPtrArgs[1];
	if (lo<1L || lo>=MAXMACROS) goto RTN;
	hi = *longPtrArgs[2];
	if (hi<lo) hi = lo;
	if (hi>=MAXMACROS) hi = MAXMACROS - 1;
	z = fixString(' ',0,63);
	fd = openOld(z);
	if (fd!=NULL) { 									/* already exists */
		Read((BPTR)fd,&version,4L);
		if (version!=PARTIALVERSION) { versionMsg(z); goto RTN; }
	} else {											/* does NOT exist yet  */
		fd = openNew(z);
		if (fd==NULL) goto RTN;
		version = PARTIALVERSION;
		Write((BPTR)fd,&version,4L);  					/* now in right position */
	}
	Seek((BPTR)fd,0L,(ULONG)OFFSET_END); 						/* will put cmds at end */
	for (i=lo; i<=hi; i++) {
		z = cmdTable[i];
		len = cmdLens[i];
		if (z==NULL) len = 0;
		m = i;
		Write((BPTR)fd,&m,2L);
		Write((BPTR)fd,&len,2L);
		if (z!=NULL && Write((BPTR)fd,z,(long)len)!=(long)len) goto RTN;
		rtn = TRUE;
	}
RTN:
	if (fd!=NULL) Close((BPTR)fd);
	return(rtn);
}

FsaveConfig()
{
register UCHAR *z;

	z=fixString(' ',0,63);
	if (z!=NULL) strcpy(dataName,z);
	if (!saveUeditDat()) {
	strcpy(dataName,DFALT_CFG);
	return(FALSE);
	}
	return(TRUE);
}

FloadConfig()
{
register UCHAR  *z,*y;

	if (primitive) goto FRTN;
	y = dataName;
	z=fixString(' ',0,63);
	if (z!=NULL) strcpy(y,z);
	if (*y<=' ') strcpy(y,DFALT_DAT);
	if (!findFile(y)) {
		passiveMsg("Can't find",y,0L);
		goto FALSERTN;
	}
	if (!loadKeyData()) {
FALSERTN:
		strcpy(y,DFALT_DAT);
		goto FRTN;
	}
	stopPause = TRUE;				 /* VITAL - must stop current macro!!! */
	return(TRUE);
FRTN:
	return(FALSE);
}

Fexecute()
{
register UCHAR  *pstring,*fdout;
register short  rtn,flag,i;
register long		mode;
UCHAR				*xout;

	pstring = fixString(' ',1,127);
	if (pstring==NULL)  goto FRTN;
	if (args[0]==buf_) {
		i = *longPtrArgs[0];
		if (buf[i]!=NULL && !canChange(buf[i])) goto FRTN;
		flag = TRUE;
		mode = MODE_NEWFILE;
		xout = rv;
	} else  {
		mode = MODE_OLDFILE;
		flag = FALSE;
		xout = (UCHAR *)"NIL:";
	}
	if ( (fdout = (BPTT)Open(xout,mode))==NULL) goto FRTN;
	rtn = TRUE;
	if (Execute(pstring,0L,(BPTR)fdout)==0L) {
		rtn = FALSE;
		oneMsg("Bad AmigaDOS return!");
	}
	Close((BPTR)fdout);
	if (flag) {
		args[1] 	= atCursor_;
		ptrArgs[2]  = xout;
		args[2] 	= literal_;
		rtn = FinsertFile();
	}
	if (flag) DeleteFile(xout);
	return(rtn);
FRTN:
	return(FALSE);
}

FsaveLearn()
{
register UCHAR  *fd;
register short    i;

	if (execLearn || learnMode) {
		learnMsg();
		goto FRTN;
	}
	if (learnQ[0].Count==0) goto FRTN;
	learnName();
	if (*z==0x00) goto FRTN;
	if ((fd=openNew(&z[2]))==NULL) {
NOROOM:
	oneMsg("Can't save Learn");
	goto FRTN;
	}
	for (i=0; i<=MAXLEARN; i++) {
		if (Write((BPTR)fd,&(learnQ[i]),(long)sizeof(struct msgQueue))<=0L) {
			Close((BPTR)fd);
			DeleteFile(z);
			goto NOROOM;
		}
		if (learnQ[i].Count==0) break;
	}
	Close((BPTR)fd);
	return(TRUE);
FRTN:
	return(FALSE);
}

Fpush()
{
register struct CB  *bp;
register short  	bufNum,i;

	if (args[0]!=buf_) return(pushNum());
	if (args[1]!=buf_) goto BRTN;
	i = (short)*longPtrArgs[0];    /* buffer stack #i */
	bufNum = *longPtrArgs[1];
	bp = buf[bufNum];
	if (!push(&(bStack[i]),(ULONG)bp)) goto BRTN;
		++(bufPopStack[i]);
		buf[bufNum] = NULL;
		splitFlag(bufNum,PAGE_);
		if (bp==curBuf) newCurBuf();
		return(TRUE);
BRTN:
	return(FALSE);
}

Fpop()
{
register short  	bufNum,i;
struct CB			*bpp;

	if (args[0]!=buf_) return(popNum());
	if (args[1]!=buf_) goto BRTN;
	i = (short) *longPtrArgs[0];   /* buffer stack #i */
	if (!pop(&(bStack[i]),&bpp)) goto BRTN;
		--(bufPopStack[i]);
		bufNum = *longPtrArgs[1];
		i = FALSE;
		if (buf[bufNum]==curBuf) i = TRUE;
		freeBuf(bufNum);
		if (bpp!=NULL) {
			buf[bufNum] = bpp;
			bpp->BufNum = bufNum;
		}
		splitFlag(bufNum,PAGE_);
		if (i) newCurBuf();
		return(TRUE);
BRTN:
	return(FALSE);
}

FrollStack()
{
register struct ST  **pt,*p;
struct ST			*pe;
register long		amt,size;
register USHORT 	i;

	amt = *longPtrArgs[1];
	if (amt==0L) goto BRTN;
	if (args[0]==buf_) {
		i = *longPtrArgs[0];	/* buffer number! */
		pt = &bStack[i];
		size = bufPopStack[i];
	} else if (args[0]==n_) {
		size = (long)((ULONG)longPtrArgs[0] - (ULONG)&n[0]);
		i = size >> 2;
		pt = &nStack[i];
		size = numPopStack[i];
	} else goto BRTN;
	if (size<2L) goto BRTN;
	while (amt) {
		p = *pt;												/* start */
		while (p->ptr) {										/* end */
			pe = p;
			p = p->ptr;
		}
		if (amt>0L) {
			p->ptr = *pt;
			p = *pt;
			*pt = p->ptr;
			p->ptr = NULL;
			amt--;
		} else {
			pe->ptr = NULL;
			p->ptr = *pt;
			*pt = p;
			amt++;
		}
	}
	return(TRUE);
BRTN:
	return(FALSE);
}

FgetBufAddr()									/* getBufAddr(n33,buf33) */
{
register long bufptr;

	bufptr = (long)bufPtrArgs[1];
	if (bufptr!=0L) {
		*longPtrArgs[0] = bufptr;
		return(TRUE);
	}
	return(FALSE);
}

FattachBuf()
{
register struct CB  *bufPtr;
register short  bufNum;
register long		bufp;

	bufNum = *longPtrArgs[0];
	if (bufNum<0 || bufNum>99) goto BRTN;
	if (buf[bufNum]!=NULL) goto BRTN;
	bufp = *(longPtrArgs[1]);
	if (bufp & 0x3L) goto BRTN; /* MUST be BCPL pointer! */
	bufPtr = (struct CB *)bufp;
/* ====== simple cheap test ----- for DOCUMENTATION ============ */
	if (bufPtr && bufPtr->NextBlock && bufPtr->NextBlock->LastBlock) {
		if (bufPtr->NextBlock->LastBlock!=(struct DB *)bufPtr) goto BRTN;
		buf[bufNum] = bufPtr;
		bufPtr->BufNum = bufNum;
		fixSOF(bufPtr);
		fixPtrs((UCHAR **)bufPtr,(ULONG)bufPtr->NextBlock,(ULONG)bufPtr->NextBlock);
		return(TRUE);
	}
BRTN:
	return(FALSE);
}

FdetachBuf()
{
register struct CB  *bufPtr;
register short  bufNum;

	bufNum = *longPtrArgs[0];
	bufPtr = buf[bufNum];
	if (bufPtr==NULL) goto BRTN;
	splitFlag(bufNum,PAGE_);
	buf[bufNum] = NULL;
	if (bufPtr==curBuf) newCurBuf();
	return(TRUE);
BRTN:
	return(FALSE);
}

FupFlag()
{
	FflipFlag();
	if (FgetFlag()) return(TRUE);
	FflipFlag();
	return(FALSE);
}

FdownFlag()
{
	FflipFlag();
	if (!FgetFlag()) return(TRUE);
	FflipFlag();
	return(FALSE);
}

FflipFlag()
{
register struct CB  *bufPtr;
register long		*lptr;
register short  	i,j;
register ULONG  	flags;

	j = args[1];
	lptr = longPtrArgs[1];
	if (j==lace_) { newLace(); goto RTN; }
	if (j<trueTabs_) {
		if (j==hideDisplay_) { flipDisplay(); goto RTN; }
		if (j>=pmEsc_) *lptr = (*lptr) ? 0L : 1L;
		switch(j) {
		case  cram_:		displaySize();
							cleared = 0;
							clearMsg();
		case  columnar_:	FrefreshDisplay();
							break;
		case  learnMode_:	wipeLearn();
							curLearn = 0;
							showTitle = TRUE;  /* setTitle(); */
							break;
		case  rowCol_:
		case  markGadgets_: cleared = 0;
							clearMsg();
							break;
		case  teachKeys_:	showTitle = TRUE;  /* setTitle(); */
		case  trapMenus_:	rmbFlags(); break;
		}
	} else {
		bufPtr=bufPtrArgs[0];
		if (bufPtr==NULL) return(FALSE);
		flags = bufPtr->Flags;
		if (j==readOnly_ && (flags & FOLDED)) return(FALSE);
		if (j<=userLocalB_) {
			i = 1 << (j - trueTabs_);
			flags ^= i;
			*lptr = (flags & i) ? 1L : 0L;
			splitFlag(bufPtr->BufNum,PAGE_);
		} else if (j==favorite_) flags ^= FAVORITE;
		bufPtr->Flags = flags;
		setGlobals();
		showTitle = TRUE;  /* setTitle(); */
	}
RTN:
	return(TRUE);
}

Ftoggle()
{
register struct CB    *curB,*bufPtr;
register short  i,j,k,maxf;

	curB = curBuf;
	k = args[0];
	maxf = MAXFILES;

	switch(k) {

	case  scrollType_:   scrollType = (scrollType) ? 0L : 1L;  goto RTN;

	case  trapMenus_:	trapMenus  = (trapMenus) ? 0L : 1L; rmbFlags(); goto RTN;

	case  hideDisplay_: flipDisplay(); goto RTN;

	case  lace_:	(void)newLace(); goto RTN;

	case  toTiny_:  if (tiny==0) {
						if (!makeTiny()) makeWindow();
					} else closeTiny();
					if (edWindow==NULL) badQuit();
					goto RTN;

	case  buf_: /* toggling currentFile_ */
	case  favorite_: /* toggling favorite_ */
					i = j = curB->BufNum;
					showTitle = TRUE;
					if (i>=maxf) { /* reset cursor to front */
						i = j = -1;
						curB->Block = curB->NextBlock;
						curB->Ptr	= (UCHAR *)curB->NextBlock;
					}
					while (1) {
						if (++i >= maxf) {
							if (j==-1) goto FALSERTN;
							i = 0;
						}
						if (i==j) goto FALSERTN;
						bufPtr = buf[i];
						if (bufPtr!=NULL) {
							if ( (k==favorite_
								&& (bufPtr->Flags & FAVORITE)) || k==buf_) {
								curBuf = bufPtr;
								splitBufNum[curSplit] = curBuf->BufNum;
								goto SWITCHIT;
							}
						}
					}
SWITCHIT:			switchFast();
					FrefreshDisplay();
					goto RTN;

	case  windowSplit_:
					maxf = nSplit;
					if (maxf==0) goto FALSERTN;
					i = curSplit + 1;
					if (i>maxf) i = 0;
					swapSplit(i);
					goto SWITCHIT;
	}
FALSERTN:
	return(FALSE);
RTN:
	return(TRUE);
}

#ifdef USEC

FgetStackSize()
{
register ULONG  bufr,numr;

	bufr = *longPtrArgs[0];
	numr = *longPtrArgs[1];

	if (bufr>=0L && bufr<(ULONG)ALLBUFS) bufr = bufPopStack[bufr];
	else bufr = 0L;
	if (numr>=0L && numr<(ULONG)ALLBUFS) numr = numPopStack[numr];
	else numr = 0L;

	*longPtrArgs[0] = bufr;
	*longPtrArgs[1] = numr;
	*longPtrArgs[2] = saves;
	return(TRUE);
}

FcopyKey()
{
register short  toKey,frKey,len;
register UCHAR  *to,*fr;

	toKey = *longPtrArgs[0];
	frKey = *longPtrArgs[1];
	if (toKey<=0 || frKey<=0 || toKey==frKey) goto BRTN;
	if (toKey>=MAXMACROS || frKey>=MAXMACROS) goto BRTN;
	fr = cmdTable[frKey];
	if (fr==NULL) goto BRTN;

	len = cmdLens[frKey];
	to = safeMem((long)len);
	if (to==NULL) goto BRTN;
	if (cmdTable[toKey]!=NULL) FkillKey(); /* may kill menus */
	cmdTable[toKey] = to;
	cmdLens[toKey] = len;
	movdat((UCHAR *)fr,(UCHAR *)to,(short)len);
	return(TRUE);
BRTN:
	return(FALSE);
}

FloadLearn()
{
register UCHAR  *fd;
register short    i;

	if (execLearn || learnMode) {
		learnMsg();
		goto FRTN;
	}
	learnName();
	if (*z==0x00) goto FRTN;
	if ((fd=openOld(&z[2]))==NULL) {
		if ((fd=openOld(z))==NULL) goto FRTN;
	}
	for (i=0; i<=MAXLEARN; i++)
		if (Read((BPTR)fd,&(learnQ[i]),(long)sizeof(struct msgQueue)) <= 0L) {
			learnQ[i].Count = 0;
			break;
	}
	Close((BPTR)fd);
	if (i>0) return(TRUE);
FRTN:
	return(FALSE);
}

void learnMsg()
{
	oneMsg("Can't load/save Learn when in Learn");
}

FgadgetName()
{
register short   gnum;
register UCHAR  *x;

	if ((gnum = *longPtrArgs[0])<1 || gnum>4) goto FRTN;
	x = fixString(' ',1,19);
	if (x==NULL) goto FRTN;
	if (*x==' ' && *(x+1)==0x00) {
		gadgetName[0][21]=0;
	} else {
		strcpy(gadgetName[gnum-1],x);
		gadgetName[gnum-1][21]=(UCHAR)strlen(x);
	}
	cleared = 0;
	clearMsg();
	return(TRUE);
FRTN:
	return(FALSE);
}

FtoNumber() 							/* does NOT move the cursor */
{
register struct CB *bufPtr;

	bufPtr=bufPtrArgs[1];
	if (bufPtr==NULL) goto BRTN;
	pushFast(bufPtr,&bufPtr->Block,&bufPtr->Ptr);
	copyNum('(');
	if (*xnum==0x00) goto BRTN;
	*(longPtrArgs[0]) =  atole(xnum);
	popFast();
	return(TRUE);
BRTN:
	popFast();
	return(FALSE);
}

void newLace()
{
	if (++lace>3) lace = 0;
	killMenus();
	makeWindow();
}

FgetFlag()
{
register struct CB  *bufPtr;
register ULONG  	i,j;

	j = args[1];
	if (j<trueTabs_)
		return( (*longPtrArgs[1]!=0L) ? TRUE : FALSE);
	else {
		bufPtr=bufPtrArgs[0];
		if (bufPtr==NULL) { FRTN: return(FALSE); }
		i = j - trueTabs_;
		if (j<=userLocalB_) i = (1L << i);
		else if (j==favorite_) i = FAVORITE;
		else goto FRTN;
		return((bufPtr->Flags & i) ? TRUE : FALSE);
	}
}

Fspeak()
{
register UCHAR  *p;
register short  i;
long				len;

	i = args[0];
	args[1] = all_;
	len = 0L;
	if (i==buf_ || i==literal_) p = exportStr(&len);
	else						p = fixString(0x00,0,127);
	if (p==NULL) return(FALSE);
	i = speakIt(p);
	if (len) FreeMem(p,len);
	return(i);
}

FputMsg()
{
register UCHAR  *z;

	z=fixString(0x00,0,75);
	if (z==NULL) clearMsg();
	else oneMsg(z);
	return(TRUE);
}

FinputString()
{
register struct CB  *curB;
register short  	rtn,bufNum;
register ULONG  	saveFlags;

	rtn = FALSE;
	bufNum = *longPtrArgs[0];
	if (bufNum<MAXFILES) goto RTN;
	if (!getBuf(bufNum)) goto RTN;
	curB = buf[bufNum];
	if (curB==curBuf) goto RTN;
	saveSplit();
	curBuf = curB;
	splitBufNum[0] = curB->BufNum;
	setPMTitle(curB->FileName,0);
	/* --------------------------
	strcpy(curB->FileName,"Primitive Mode string input (pmESC = done):");
	--------------------------------- */
	saveFlags = curB->Flags;
	curB->Flags &= ~CHANGED;
	primitiveEdit(2);					 /* editWork() does a switchFast() */
	rtn = (curB->Flags & CHANGED) ? TRUE : FALSE;
	curB->Flags |= saveFlags;
	curB->FileName[0] = 0x00;
	nameBuf(curB);
	curB->Block  = curB->NextBlock;
	curB->Ptr		 = (UCHAR *)curB->NextBlock;
	unsaveSplit();
	curBuf = buf[splitBufNum[curSplit]];
	showTitle = TRUE;		/* setTitle(); */
	switchFast();
/*     localColors = curB->colors; */
	displayFlag = ALLPAGE;
RTN:
	return(rtn);
}

FeditBuf()
{
register	struct  CB  *curb;
register	short			i;

	i = (short) *longPtrArgs[0];
	if (!getBuf(i)) goto BRTN;
	curb = buf[i];
	curBuf = curb;
	splitBufNum[curSplit] = curb->BufNum;
	nameBuf(curb);
	switchFast();
	if (*(curb->PPtr)==EOFILE) {
		curb->PBlock = curb->NextBlock;
		curb->PPtr  = curb->NextBlock->Data;
	}
	displayFlag = (PAGE_ << curSplit);
	FrefreshDisplay();
	return(TRUE);
BRTN:
	return(FALSE);
}

FmoveCursor()
{
register struct CB *bufPtr;

	bufPtr=bufPtrArgs[0];
	if (bufPtr==NULL) goto FRTN;
	getBP(bufPtr,1);
	if (gB==NULL || gP == bufPtr->Ptr) goto FRTN;
	bufPtr->Block = gB;
	bufPtr->Ptr   = gP;

	if (bufPtr==curBuf) { gcol = -1; displayFlag |= SHOWCURSOR_; }
	return(TRUE);
FRTN:
	return(FALSE);
}

FequateLoc()
{
register struct CB *bufPtr;
register UCHAR     **ovl;
register short  	j;

	bufPtr=bufPtrArgs[0];
	if (bufPtr==NULL) goto FRTN;
	getBP(bufPtr,2);
	if (gB==NULL) goto FRTN;
	j=args[1];
	if (j==mouseLoc_) mouseY=0;
	j -= atCursor_;
	ovl = (UCHAR **)bufPtr;
	ovl[j]  	 = (UCHAR *)gB;
	ovl[j+CBOVL]  = gP;
	return(TRUE);
FRTN:
	return(FALSE);
}

FincLoc()
{
register struct CB  *bufPtr;
register UCHAR  	**ovl;
register short  	j,i;

	bufPtr=bufPtrArgs[0];
	if (bufPtr==NULL) goto FRTN;
	i = args[1];
	j = i - atCursor_;
	ovl = (UCHAR **)bufPtr;
	if (*(ovl[j+CBOVL]) == EOFILE) goto FRTN;
	if (i==mouseLoc_) mouseY=0;
	fastBufPtr =	 bufPtr;
	fastB = (struct DB *)ovl[j];
	fastP = 		 ovl[j+CBOVL];
	ovl[j+CBOVL] = incFast();
	ovl[j]  	 = (UCHAR *)fastB;
	popFast();
	return(TRUE);
FRTN:
	return(FALSE);
}

FdecLoc()
{
register struct CB  *bufPtr;
register UCHAR  	**ovl;
register short  	j,i;

	bufPtr=bufPtrArgs[0];
	if (bufPtr==NULL) goto FRTN;
	i = args[1];
	j = i - atCursor_;
	ovl = (UCHAR **)bufPtr;
	if (ovl[j+CBOVL]==(UCHAR *)bufPtr->NextBlock) goto FRTN;
	if (i==mouseLoc_) mouseY=0;
	fastBufPtr =	 bufPtr;
	fastB = (struct DB *)ovl[j];
	fastP = 		 ovl[j+CBOVL];
	ovl[j+CBOVL] = decFast();
	ovl[j]  	 = (UCHAR *)fastB;
	popFast();
	return(TRUE);
FRTN:
	return(FALSE);
}

FeqLoc()
{
register struct CB  *bufPtr;
register unsigned long  loc1;

	bufPtr=bufPtrArgs[0];
	if (bufPtr==NULL) goto FRTN;
	getBP(bufPtr,1);
	loc1=(long)loc(gB,gP);
	getBP(bufPtr,2);
	if (loc1!=loc(gB,gP)) goto FRTN;
	return(TRUE);
FRTN:
	return(FALSE);
}

FgeLoc()
{
register struct CB  *bufPtr;
register unsigned long  loc1;

	bufPtr=bufPtrArgs[0];
	if (bufPtr==NULL) goto FRTN;
	getBP(bufPtr,1);
	loc1=(long)loc(gB,gP);
	getBP(bufPtr,2);
	if (loc1 < loc(gB,gP)) goto FRTN;
	return(TRUE);
FRTN:
	return(FALSE);
}

FgtLoc()
{
register struct CB  *bufPtr;
register unsigned long  loc1;

	bufPtr=bufPtrArgs[0];
	if (bufPtr==NULL) goto FRTN;
	getBP(bufPtr,1);
	loc1=(long)loc(gB,gP);
	getBP(bufPtr,2);
	if (loc1 <= loc(gB,gP)) goto FRTN;
	return(TRUE);
FRTN:
	return(FALSE);
}

FgetKeyVal()
{
	rmbFlags();
	while (1) {
		if (!nextEvent() && !busyWork()) waite();
		if (macroNum || gChar || stopPause) break;
	}
	*(longPtrArgs[0])= macroNum;
	*(longPtrArgs[1])= gChar;
	return(TRUE);
}

FgetKey()
{
	rmbFlags();
	while (1) {
		if (!nextEvent() && !busyWork()) waite();
		if (macroNum || stopPause) break;
	}
	*(longPtrArgs[0])=macroNum;
	return(TRUE);
}

FgetChar()
{
	rmbFlags();
	while (1) {
		if (!nextEvent() && !busyWork()) waite();
		if (gChar || stopPause) break;
	}
	*(longPtrArgs[0])=gChar;
	return(TRUE);
}

FinputKey()
{
	rmbFlags();
	if (nextEvent() && macroNum) {
		*(longPtrArgs[0])=macroNum;
		return(TRUE);
	}
	*(longPtrArgs[0]) = 0L;
	return(FALSE);
}

FswapKey()
{
register short  k1,k2,i;
register UCHAR  *x;

	k1 = *(longPtrArgs[0]);
	k2 = *(longPtrArgs[1]);
	if (k1<=0 || k2<=0) goto FRTN;
	if (k1>=MAXMACROS || k2>=MAXMACROS || k1==k2) goto FRTN;
	if (cmdTable[k1]==NULL && cmdTable[k2]==NULL) goto FRTN;

	if (k1==startupMacro || k2==startupMacro) killMenus();
	x			 =   (UCHAR *)cmdTable[k1];
	cmdTable[k1]	=	cmdTable[k2];
	cmdTable[k2]	=	(UCHAR *)x;
	i			 =   cmdLens[k1];
	cmdLens[k1] 	=	cmdLens[k2];
	cmdLens[k2] 	=	i;
	return(TRUE);
FRTN:
	return(FALSE);
}

FkillKey()
{
register short     i;

	i = *longPtrArgs[0];
	if (i<=0 || i>=MAXMACROS || cmdTable[i]==NULL) goto BRTN;
	if (i==startupMacro) killMenus();
	FreeMem(cmdTable[i],(long)cmdLens[i]);
	cmdLens[i]  = 0;
	cmdTable[i] = NULL;
	return(TRUE);
BRTN:
	return(FALSE);
}

Fdelay()
{
register long ticks;
long seconds,micros;

	ticks = *longPtrArgs[0];
	if (ticks<=0L) goto BRTN;
	(void)setTime(&seconds,&micros,ticks);
	rmbFlags();
	while (1) {
		collectRaw();
		if (stopPause) break;
		if (!busyWork()) waite();
		if (isTime(seconds,micros)) break;
	}
	return(TRUE);
BRTN:
	return(FALSE);
}

void wipeCmds()
{
register short i;

	for (i=0; i<MAXMACROS; i++) {
		if (cmdTable[i]!=NULL) FreeMem(cmdTable[i],(long)cmdLens[i]);
		cmdTable[i] = NULL;
		cmdLens[i] = 0;
	}
}

pushNum()
{
register ULONG  j;
register USHORT i;

	if (args[0]!=n_) goto BRTN;
	j = (ULONG)longPtrArgs[0] - (ULONG)&n[0];
	i = j >> 2;
	if (!push(&(nStack[i]),*longPtrArgs[1])) goto BRTN;
	++(numPopStack[i]);
	return(TRUE);
BRTN:
	return(FALSE);
}

popNum()												/* popNum(n33) */
{
register ULONG  j;
register USHORT i;

	if (args[0]!=n_) goto BRTN;
	j = (ULONG)longPtrArgs[0] - (ULONG)&n[0];
	i = j >> 2;
	if (!pop(&(nStack[i]),longPtrArgs[1])) goto BRTN;
	--(numPopStack[i]);
	return(TRUE);
BRTN:
	return(FALSE);
}

push(	register struct ST **stack,
		long val)
{
register struct ST *x;

	if (noMemory ||
	(x =AllocMem((long)sizeof(struct ST),(long)MEMF_CLEAR))==NULL) goto BRTN;
	x->ptr = *stack;
	*stack = x;
	x->num = val;
	return(TRUE);
BRTN:
	return(FALSE);
}

pop(	register struct ST **stack,
		long *val)
{
register struct ST *x;

	if (*stack==NULL) goto BRTN;
	x = *stack;
	*val = x->num;
	*stack = x->ptr;
	FreeMem(x,(long)sizeof(struct ST));
	return(TRUE);
BRTN:
	return(FALSE);
}

Ftext() 									/*  text,row,col,color,lenflag */
{
register UCHAR  *zz;
register struct RastPort *r;
register short  row,col,i,lenFlag;
register long	colora;

	if (tiny) return(FALSE);
	row = *longPtrArgs[1];
	col = *longPtrArgs[2];
	lenFlag = *longPtrArgs[4];

	if (row>maxLines) goto BRTN;
	if (col>maxLineChars) goto BRTN;
	if (lenFlag>maxLineChars) lenFlag = maxLineChars;

	i = lenFlag;								/* len to use in fixString */
	if (i<=0) i = maxLineChars;
	if (i>=128) i = 127;

	zz=fixString(0,0,i);
	if (zz==NULL) { zz = z; *zz = 0x00; }
	i = (short)strlen(zz);

	if (lenFlag>0) {
		while (i<lenFlag) {
			zz[i] = ' ';
			i++;
		}
		zz[lenFlag] = 0x00;
	}
	if (row==0) cleared = 1;
	if (row>=0 && col>=0) move(col,row);
	colora = *longPtrArgs[3];
	if (colora>=0 && colora<=15) {
		if (curBuf) localColor = curBuf->colors;
		setColors((short)colora);
	}
	wptr = zz;
	r = rp;
	if (i) text(i); /* SetDrMd(r,COMPLEMENT); SetDrMd(r,JAM2); */
	if (lenFlag<0) {
		if (lenFlag==-1) cleareol();
		else {
			if (col>=0 && row>=0) {
				Move(r,(long)(col*charWidth),(long)lineHeight[row]-1);
				ClearScreen(r);
			}
		}
	}
	suppressClear = TRUE;
	return(TRUE);
BRTN:
	return(FALSE);
}

FrunLearn()
{
register short    i,m,rtn;
register long	count;

	rtn = FALSE;
	if (execLearn || learnMode || stopPause) {
		if (learnMode) {
			cleared = 0;
			clearMsg();
			learnQ[curLearn-1].Count = 0;
		}
		learnMode = 0;
		showTitle = TRUE;  /* setTitle(); */
		goto RTNPT;
	}
	if (learnQ[0].Count==0) goto RTNPT;
		/* this causes nextEvent() to work out of learn buffer until done */
	execLearn = EXEC_LEARN;
	curLearn = 0;
	if (hideDisplay) noDisplay = 1;
TOP:
	while (nextEvent()) {					/* don't display unless no keys queued up */
		if (stopPause) { rtn = FALSE; goto RTNPT; }
		if (execLearn==STOP_EXEC_LEARN) break;
		i = inputChar;
		m = macroNum;
		if (i==0 && m) gcol = -1;
		if (newSplit!=curSplit) {
			swapSplit(newSplit); /* sets curBuf, displayFlag, switchFast() */
			FrefreshDisplay();
			newSplit = curSplit;
		}
		if (i || m) {
			if (cmdTable[preKeyMacro]!=NULL) {
				FrunKey(preKeyMacro);
				m = mcrNum;
				if (m<0 || m>=MAXMACROS) m = 0;
				i = inpChar;
				if (i & ~255) i = 0;
				if (!(i | m)) goto TOP;
			}
			count = 1L;
			if (cmdMultiplier>0L) { count = cmdMultiplier; cmdMultiplier=0; }
			if (i && !canChange(curBuf)) continue;
			while (1) {
				if (i) { rtn = insertChar(i); stop(); }
				else rtn = FrunKey(m);
				if (stopPause) { rtn = FALSE; goto RTNPT; }
				if (--count<=0L) break;
			}
		}
	}
RTNPT:
	execLearn = 0;
	return(rtn);
}

#endif

void learnName()
{
register UCHAR *zz;

	zz = fixString(' ',0,100);
	*z = 0x00;
	if (zz!=NULL) {
		strcpy(z,sss);
		strcat(z,zz);
	}
}

#ifndef USEC
#asm
	XREF	_AllocMem
	XREF	_args
	XREF	_atole
	XREF	_buf
	XREF	_bufPopStack
	XREF	_bufPtrArgs
	XREF	_busyWork
	XREF	_charWidth
	XREF	_cleared
	XREF	_cleareol
	XREF	_clearMsg
	XREF	_ClearScreen
	XREF	_Close
	XREF	_cmdLens
	XREF	_cmdMultiplier
	XREF	_cmdTable
	XREF	_collectRaw
	XREF	_copyNum
	XREF	_curBuf
	XREF	_curLearn
	XREF	_curSplit
	XREF	_decFast
	XREF	_displayFlag
	XREF	_displaySize
	XREF	_execLearn
	XREF	_exportStr
	XREF	_fastB
	XREF	_fastBufPtr
	XREF	_fastP
	XREF	_fixString
	XREF	_flipDisplay
	XREF	_FreeMem
	XREF	_FrefreshDisplay
	XREF	_FrunKey
	XREF	_gadgetName
	XREF	_gB
	XREF	_gChar
	XREF	_gcol
	XREF	_getBP
	XREF	_getBuf
	XREF	_gP
	XREF	_hideDisplay
	XREF	_incFast
	XREF	_inpChar
	XREF	_inputChar
	XREF	_insertChar
	XREF	_isTime
	XREF	_killMenus
	XREF	_lace
	XREF	_learnMode
	XREF	_learnQ
	XREF	_lineHeight
	XREF	_longPtrArgs
	XREF	_macroNum
	XREF	_makeWindow
	XREF	_MAXFILES
	XREF	_maxLineChars
	XREF	_maxLines
	XREF	_mcrNum
	XREF	_mouseY
	XREF	_move
	XREF	_Move
	XREF	_movdat
	XREF	_nameBuf
	XREF	_newSplit
	XREF	_nextEvent
	XREF	_noDisplay
	XREF	_noMemory
	XREF	_nSplit
	XREF	_nStack
	XREF	_numPopStack
	XREF	_oneMsg
	XREF	_openOld
	XREF	_popFast
	XREF	_primitiveEdit
	XREF	_pushFast
	XREF	_Read
	XREF	_rmbFlags
	XREF	_rp
	XREF	_safeMem
	XREF	_saves
	XREF	_saveSplit
	XREF	_scrollType
	XREF	_setColors
	XREF	_setPMTitle
	XREF	_setTime
	XREF	_setTitle
	XREF	_speakIt
	XREF	_splitBufNum
	XREF	_splitFlag
	XREF	_sss
	XREF	_stop
	XREF	_stopPause
	XREF	_strcat
	XREF	_strcpy
	XREF	_strlen
	XREF	_swapSplit
	XREF	_switchFast
	XREF	_text
	XREF	_toTiny
	XREF	_unsaveSplit
	XREF	_waite
	XREF	_wipeLearn
	XREF	_wptr
	XREF	_xnum
	XREF	_z
	XREF	_n
	XREF	_showTitle
	XREF	_suppressClear

	xdef	_Ftext
_Ftext:
	movem.l	d2-d5/a2/a6,-(sp)			;RUCHAR*zzRshortrow,col,i,lenFlagrow=*longPtrArgs[1]
	move.l	_longPtrArgs+4,a0
	move.w	2(a0),d4			;col=*longPtrArgs[2]
	move.l	_longPtrArgs+8,a0
	move.w	2(a0),d5			;lenFlag=*longPtrArgs[4]
	move.l	_longPtrArgs+16,a0
	move.w	2(a0),d3			;if(row>maxLines)gotoBRTN
	cmp.w	_maxLines,d4
	bgt	FT10001 		;if(col>maxLineChars)gotoBRTN
	cmp.w	_maxLineChars,d5
	bgt	FT10001 		;if(lenFlag>maxLineChars)lenFlag=maxLineChars
	cmp.w	_maxLineChars,d3
	ble	FT10002
	move.w	_maxLineChars,d3			;i=lenFlag/*lentouseinfixString*/
FT10002:
	move.w	d3,d2			;if(i<=0)i=maxLineChars
	tst.w	d2
	bgt	FT10003
	move.w	_maxLineChars,d2			;if(i>=128)i=127
FT10003:
	cmp.w	#128,d2
	blt	FT10004
	moveq	#127,d2 		;zz=fixString(0,0,i)
FT10004:
	move.w	d2,-(sp)
	clr.l	-(sp)
;;;	clr.w	-(sp)
	jsr	_fixString
	move.l	d0,a2			;if(zz==NULL){zz=z*zz=0x00}
	move.l	a2,d0
	addq.w	#6,sp
	bne	FT10005
	lea	_z,a0
	move.l	a0,a2
	clr.b	(a2)			;i=(short)strlen(zz)
FT10005:
	move.l	a2,-(sp)
	jsr	_strlen
	move.w	d0,d2			;if(lenFlag>0){
	tst.w	d3
	addq.w	#4,sp
	ble	FT10006 		;while(i<lenFlag){
FT10007:
	cmp.w	d3,d2
	bge	FT10008 		;zz[i]=''
	move.b	#32,(a2,d2.w)			;i++
	addq.w	#1,d2			;}
	bra	FT10007
FT10008:			;zz[lenFlag]=0x00
	clr.b	(a2,d3.w)			;}if(row==0)cleared=1
FT10006:
	tst.w	d4
	bne	FT10009
	move.w	#1,_cleared 		;if(row>=0&&col>=0)move(col,row)
FT10009:
	tst.w	d4
	blt	FT10010
	tst.w	d5
	blt	FT10010
	move.w	d4,-(sp)
	move.w	d5,-(sp)
	jsr	_move			;if(*longPtrArgs[3]>=0)setColors((short)*longPtrArgs[3])
	addq.w	#4,sp
FT10010:
	move.l	_longPtrArgs+12,a0
	move.l  (a0),d0
	blt	FT10011
	and.w	#15,d0
	move.w	d0,-(sp)
	jsr	_setColors  		;wptr=zz
	addq.w	#2,sp
FT10011:
	move.l	a2,_wptr			;if(i)text(i)/*SetDrMd(rp,COMPLEMENT)SetDrMd(rp,JAM2)*/
	tst.w	d2
	beq	FT10012
	move.w	d2,-(sp)
	jsr	_text			;if(lenFlag<0){
	addq.w	#2,sp
FT10012:
	tst.w	d3
	bge	FT10013 		;if(lenFlag==-1)cleareol()
	cmp.w	#-1,d3
	bne	FT10014
	jsr	_cleareol			;else{
	bra	FT10015
FT10014:			;if(col>=0&&row>=0){
	tst.w	d5
	blt	FT10016
	tst.w	d4
	blt	FT10016 		;Move(rp,(long)(col*charWidth),(long)lineHeight[row]-1)
	move.w	d4,d0
;;;	ext.l	d0
	add.w	d0,d0
	lea	_lineHeight,a0
	move.w	(a0,d0.w),d0
	ext.l	d0
	subq.l	#1,d0
	move.l	d0,d1
	move.w	d5,d0
	muls.w	_charWidth,d0
	ext.l	d0
	move.l	_rp,a1
	move.l	_GfxBase,a6
	jsr	-240(a6)			;ClearScreen(rp)
	move.l	_rp,a1
	move.l	_GfxBase,a6
	jsr	-48(a6) 		;}}
FT10016:
FT10015:			;}suppressClear=TRUE
FT10013:
	move.w	#1,_suppressClear			;return(TRUE)
	moveq	#1,d0
FT2:
	movem.l	(sp)+,d2-d5/a2/a6
	rts 		;BRTN:
FT10001:			;return(FALSE)
	moveq	#0,d0
	bra	FT2 		;}

	xdef	_FgetStackSize
_FgetStackSize:
	move.l  d2,-(sp)
	move.l	_longPtrArgs,a0 			;bufr=*longPtrArgs[0]
	move.l	(a0),d1 					;numr=*longPtrArgs[1]
	move.l	_longPtrArgs+4,a0
	move.l	(a0),d2 	   ;if(bufr>=0L&&bufr<(ULONG)ALLBUFS)bufr=bufPopStack[buf
	tst.l	d1
	bcs	S4
	cmp.l	#100,d1
	bcc	S4  	  ;r]
	move.l	d1,d0
	add.w	d0,d0
	add.w	d0,d0
;;;	asl.l	#2,d0
	lea	_bufPopStack,a0
	move.l	(a0,d0.w),d1				;elsebufr=0L
	bra	S5
S4:
	moveq	#0,d1
S5: 					;if(numr>=0L&&numr<(ULONG)ALLBUFS)numr=numPopStack[num
	tst.l	d2
	bcs	S6
	cmp.l	#100,d2
	bcc	S6  							;r]
	move.l	d2,d0
	add.w	d0,d0
	add.w	d0,d0
;;;	asl.l	#2,d0
	lea	_numPopStack,a0
	move.l	(a0,d0.w),d2				;elsenumr=0L
	bra	S7
S6:
	moveq	#0,d2
S7:
	move.l	_longPtrArgs,a0 			;*longPtrArgs[0]=bufr
	move.l	d1,(a0) 					;*longPtrArgs[1]=numr
	move.l	_longPtrArgs+4,a0
	move.l	d2,(a0) 					;*longPtrArgs[2]=saves
	move.w	_saves,d0
	ext.l	d0
	move.l	_longPtrArgs+8,a0
	move.l	d0,(a0) 					;return(TRUE)
	moveq	#1,d0
S8:
	move.l (sp)+,d2
	rts

	xdef  _FrunLearn
_FrunLearn:
	movem.l YYYY31,-(sp)
	moveq	#0,d6	;rtn = FALSE;
		; moveq   #0,d4
		; moveq   #0,d5
	tst.w	_execLearn   ;if (execLearn || learnMode
	bne YYYY33  ;|| stopPause) {
	tst.l	_learnMode
	bne YYYY33
	tst.w	_stopPause
	beq YYYY32
YYYY33:
	tst.l	_learnMode   ;if (learnMode) {
	beq YYYY34
	clr.w	_cleared   ;cleared = 0;
	jsr _clearMsg	;clearMsg();
	move.w  _curLearn,d0   ;learnQ[curLearn-1].Count = 0;
	subq.w  #1,d0
	muls.w  #14,d0
	lea _learnQ,a0
	clr.w	(a0,d0.w)	;}
YYYY34:   ;learnMode = 0;
	clr.l	_learnMode
	move.w  #1,_showTitle		;jsr _setTitle	;setTitle();
	bra YYYY35   ;goto RTNPT;
YYYY32:   ;}
	tst.w	_learnQ   ;if (learnQ[0].Count==0) goto RTNPT;
	beq YYYY35
	move.w  #1,_execLearn	;execLearn = EXEC_LEARN;
	clr.w	_curLearn	;curLearn = 0;
	tst.l	_hideDisplay   ;if (hideDisplay) noDisplay = 1;
	beq YYYY36
	move.w  #1,_noDisplay
YYYY36:   ;TOP
	jsr _nextEvent   ;while (nextEvent()) {
	tst.w	d0
	beq YYYY35   ;less no keys queued up */
	tst.w	_stopPause   ;if (stopPause)
	beq YYYY40  ; { rtn = FALSE; goto RTNPT; }
	moveq	#0,d6
	bra YYYY35
YYYY40:   ;if (execLearn==STOP_EXEC_LEARN) break;
	cmp.w	#2,_execLearn
	beq YYYY35
	move.w  _macroNum,d5   ;m = macroNum;
	move.w  _inputChar,d4	;i = inputChar;
	tst.w	d4  ;if (i==0 && m) gcol = -1;
	bne YYYY41
	tst.w	d5
	beq YYYY41
	move.w  #-1,_gcol
YYYY41:   ;if (newSplit!=curSplit) {
	move.w  _newSplit,d0
	cmp.w	_curSplit,d0
	beq YYYY42
	move.w  _newSplit,-(sp) ;swapSplit(newSplit);
	jsr _swapSplit
	addq.w  #2,sp
	jsr _FrefreshDisplay   ;FrefreshDisplay();
	move.w  _curSplit,_newSplit  ;newSplit = curSplit;
YYYY42:
	tst.w	d4   ;if (i || m) {
	bne YYYY44
	tst.w	d5
	beq YYYY36
YYYY44:
	tst.l	_cmdTable+4588  ;if (cmdTable[preKeyMacro]
	beq YYYY45  ;!=NULL) {
;;;	move.w  #1147,-(sp)   ;FrunKey(preKeyMacro);
	move.l  #1147,d0
	jsr _FrunKey
;;;	addq.w  #2,sp
	move.w  _mcrNum+2,d5   ;m = mcrNum;
	tst.w	d5     ;if (m<0 || m>=MAXMACROS) m = 0;
	blt YYYY47
	cmp.w	#1200,d5
	blt YYYY46
YYYY47:
	moveq	#0,d5
YYYY46:   ;i = inpChar;
	move.w  _inpChar+2,d4
	move.w  d4,d0	;if (i & ~255) i = 0;
	and.w	#-256,d0
	beq YYYY48
	moveq	#0,d4
YYYY48:   ;if (!(i | m)) goto TOP;
	move.w  d4,d0
	or.w	d5,d0
	beq YYYY36   ;}
YYYY45:   ;count = 1L;
	moveq	#1,d7
	tst.l	_cmdMultiplier  ;if (cmdMultiplier>0L)
	ble YYYY49  ;{ count = cmdMultiplier; cmdMult
	move.l  _cmdMultiplier,d7
	clr.l	_cmdMultiplier  ;
YYYY49: 	;if (i && !canChange(curBuf)) continue;
	tst.w	d4
	beq YYYY51
	move.l  _curBuf,-(sp)
	jsr _canChange
	tst.w	d0
	addq.w  #4,sp
	beq YYYY36
YYYY51:   ;while (1) {
	tst.w	d4   ;if (i) { rtn = insertChar(i); stop(); }
	beq YYYY53
	move.w  d4,-(sp)
	jsr _insertChar
	addq.w  #2,sp
	move.w  d0,d6
	jsr _stop
	bra YYYY54
YYYY53:   ;else rtn = FrunKey(m);
;;;	move.w  d5,-(sp)
	move.l  d5,d0
	jsr _FrunKey
;;;	addq.w  #2,sp
	move.w  d0,d6
YYYY54:
	tst.w	_stopPause   ;if (stopPause)
	beq YYYY55  ;{ rtn = FALSE; goto RTNPT; }
	moveq	#0,d6
	bra YYYY35
YYYY55:   ;count--;
	subq.l  #1,d7
		;	tst.l	d7  	;if (count<=0L) break;
	ble YYYY36
	bra YYYY51   ;}
YYYY35:   ;RTNPT
	clr.w	_execLearn   ;execLearn = 0;
	move.w  d6,d0	;return(rtn);
YYYY56:
	movem.l (sp)+,YYYY31
	rts
YYYY31: reg d4-d7

	xdef  _FcopyKey
_FcopyKey:
	movem.l G6,-(sp) ;toKey=*longPtrArgs[0]
	move.l  _longPtrArgs,a0
	moveq	#0,d4
	moveq	#0,d6
	move.w  2(a0),d4   ;frKey=*longPtrArgs[1]
	move.l  _longPtrArgs+4,a0
	moveq	#0,d5
	move.w  2(a0),d5   ;if(toKey<=0||frKey<=0
	tst.w	d4  ;||toKey==frKey)gotoBRTN
	ble G7
	tst.w	d5
	ble G7
	cmp.w	d5,d4
	beq G7   ;if(toKey>=MAXMACROS||frKey>=MAXMACROS)gotoBRTN
	cmp.w	#1200,d4
	bge G7
	cmp.w	#1200,d5
	bge G7   ;fr=cmdTable[frKey]
	moveq	#0,d0
	move.w  d5,d0	;	ext.l	d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	lea _cmdTable,a0
	move.l  (a0,d0.w),a3   ;if(fr==NULL)gotoBRTN
	move.l  a3,d0
	beq G7   ;len=cmdLens[frKey]
	move.w  d5,d0	;	ext.l	d0
	add.w	d0,d0	;asl.l  #1,d0
	lea _cmdLens,a0
	move.w  (a0,d0.w),d6   ;to=safeMem((long)len)
	move.w  d6,d0
	ext.l	d0
	move.l  d0,-(sp)
	jsr _safeMem
	move.l  d0,a2	;if(to==NULL)gotoBRTN
	move.l  a2,d0
	addq.w  #4,sp
	beq G7   ;if(cmdTable[toKey]!=NULL)FkillKey() maykillmenus
	moveq	#0,d0
	move.w  d4,d0	;	ext.l	d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	lea _cmdTable,a0
	tst.l	(a0,d0.w)
	beq G8
	jsr _FkillKey	;cmdTable[toKey]=to
G8:
	moveq	#0,d0
	move.w  d4,d0	;	ext.l	d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	lea _cmdTable,a0
	move.l  a2,(a0,d0.w)   ;cmdLens[toKey]=len
	move.w  d4,d0	;	ext.l	d0
	add.w	d0,d0	;asl.l  #1,d0
	lea _cmdLens,a0
	move.w  d6,(a0,d0.w)   ;movdat(fr,to,len)
	move.w  d6,-(sp)
	move.l  a2,-(sp)
	move.l  a3,-(sp)
	jsr _movdat   ;return(TRUE)
	moveq	#1,d0
	lea 10(sp),sp
G9:
	movem.l (sp)+,G6
	rts   ;BRTN
G7:   ;return(FALSE)
	moveq	#0,d0
	bra G9   ;}
G6: reg d4-d6/a2/a3

	xdef  _FloadLearn
_FloadLearn:
	movem.l G11,-(sp)	;if(execLearn||learnMode){
	tst.w	_execLearn
	bne G13
	tst.l	_learnMode
	beq G12
G13:   ;learnMsg()
	jsr _learnMsg	;gotoFRTN
	bra G14   ;}learnName()
G12:
	jsr _learnName   ;if(*z==0x00)gotoFRTN
	tst.b	_z
	beq G14   ;if((fd=openOld(&z[2]))==NULL){
	pea _z+2
	jsr _openOld
	move.l  d0,a2
	tst.l	d0
	addq.w  #4,sp
	bne G15   ;if((fd=openOld(z))==NULL)gotoFRTN
	pea _z
	jsr _openOld
	move.l  d0,a2
	tst.l	d0
	addq.w  #4,sp
	beq G14   ;}for(i=0i<=MAXLEARNi++)
G15:
	moveq	#0,d4
G18:   ;if(Read(fd,&(learnQ[i]),
	pea 14   ;(long)sizeof(structmsgQueue))<=0L){
	move.w  d4,d0
	muls.w  #14,d0
	lea _learnQ,a0
	add.l	a0,d0
	move.l  d0,-(sp)
	move.l  a2,-(sp)
	jsr _Read
	tst.l	d0
	lea 12(sp),sp
	bgt G19   ;learnQ[i].Count=0
	move.w  d4,d0
	muls.w  #14,d0
	lea _learnQ,a0
	clr.w	(a0,d0.l)	;break
	bra G17   ;}Close(fd)
G19:
G16:
	addq.w  #1,d4
	cmp.w	#200,d4
	ble G18
G17:
	move.l  a2,-(sp)
	jsr _Close   ;if(i>0)return(TRUE)
	tst.w	d4
	addq.w  #4,sp
	ble G20
	moveq	#1,d0
G21:
	movem.l (sp)+,G11
	rts   ;FRTN
G20:
G14:   ;return(FALSE)
	moveq	#0,d0
	bra G21   ;}
G11:	reg d4/a2

	xdef  _learnMsg
_learnMsg:
	pea G1+0   ;oneMsg("Can'tload/saveLearnwheninLearn")
	jsr _oneMsg   ;}
	addq.w  #4,sp
	rts
G1:
	dc.b	67,97,110,39,116,32,108,111,97,100,47,115,97,118,101
	dc.b	32,76,101,97,114,110,32,119,104,101,110,32,105,110,32
	dc.b	76,101,97,114,110,0
	ds  0

	xdef  _FgadgetName
_FgadgetName:
	movem.l G27,-(sp)	;if((gnum=*longPtrArgs[0])<1||
							;gnum>4)gotoFRTN
	move.l  _longPtrArgs,a0
	move.w  2(a0),d4
	cmp.w	#1,d4
	blt G28
	cmp.w	#4,d4
	bgt G28   ;x=fixString('',1,19)
	move.w  #19,-(sp)
	move.w  #1,-(sp)
	move.w  #32,-(sp)
	jsr _fixString
	move.l  d0,a2	;if(x==NULL)gotoFRTN
	move.l  a2,d0
	addq.w  #6,sp
	beq G28   ;if(*x==''&&*(x+1)==0x00){
	cmp.b	#32,(a2)
	bne G29
	tst.b	1(a2)
	bne G29   ;gadgetName[0][21]=0
	clr.b	_gadgetName+21   ;}else{
	bra G30
G29:   ;strcpy(gadgetName[gnum-1],x)
	move.l  a2,-(sp)
	move.w  d4,d0
	subq.w  #1,d0
	muls.w  #22,d0
	lea _gadgetName,a0
	add.l	a0,d0
	move.l  d0,-(sp)
	jsr _strcpy   ;gadgetName[gnum-1][21]=strlen(x)
	move.l  a2,-(sp)
	jsr _strlen
	move.w  d4,d1
	subq.w  #1,d1
	muls.w  #22,d1
	lea _gadgetName+21,a0
	move.b  d0,(a0,d1.w)   ;}
	lea 12(sp),sp
G30:   ;cleared=0
	clr.w	_cleared   ;clearMsg()
	jsr _clearMsg	;return(TRUE)
	moveq	#1,d0
G31:
	movem.l (sp)+,G27
	rts   ;FRTN
G28:   ;return(FALSE)
	moveq	#0,d0
	bra G31   ;}
G27:	reg d4/a2

	xdef  _FtoNumber
_FtoNumber:
	move.l  a2,-(sp)   ;bufPtr=bufPtrArgs[1]
	move.l  _bufPtrArgs+4,a2   ;if(bufPtr==NULL)gotoBRTN
	move.l  a2,d0
	beq G34   ;pushFast(bufPtr,&bufPtr->Block,&bufPtr->Ptr)
	pea 80(a2)
	move.l  a2,-(sp)
	move.l  a2,-(sp)
	jsr _pushFast	;copyNum('(')
	move.w  #40,-(sp)
	jsr _copyNum   ;if(*xnum==0x00)gotoBRTN
	tst.b	_xnum
	lea 14(sp),sp
	beq G34   ;*(longPtrArgs[0])=atole(xnum)
	pea _xnum
	jsr _atole
	move.l  _longPtrArgs,a0
	move.l  d0,(a0)   ;popFast()
	jsr _popFast   ;return(TRUE)
	moveq	#1,d0
	addq.w  #4,sp
G35:
	move.l  (sp)+,a2
	rts   ;BRTN
G34:   ;popFast()
	jsr _popFast   ;return(FALSE)
	moveq	#0,d0
	bra G35

	xdef  _newLace
_newLace:
	addq.l  #1,_lace   ;if(++lace>3)lace=0
	cmp.l	#3,_lace
	ble G43
	clr.l	_lace	;killMenus()
G43:
	jsr _killMenus   ;makeWindow()
	jsr _makeWindow
	rts

	xdef  _FgetFlag
_FgetFlag:
	movem.l G46,-(sp)	;j=args[1]
	moveq	#0,d0
	move.b  _args+1,d0
	move.w  d0,d5	;if(j<trueTabs_)
	cmp.w	#56,d5   ;return((*longPtrArgs[1]!=0L)?TRUE FALSE)
	bge G47
	move.l  _longPtrArgs+4,a0
	tst.l	(a0)
	beq G48
	moveq	#1,d0
	bra G49
G48:
	moveq	#0,d0
G49:
G50:
	movem.l (sp)+,G46
	rts   ;else{
G47:   ;bufPtr=bufPtrArgs[0]
	move.l  _bufPtrArgs,a2   ;if(bufPtr==NULL)
	move.l  a2,d0	;{FRTN return(FALSE)}
	bne G51
G52:
	moveq	#0,d0
	bra G50   ;i=j-trueTabs_
G51:
	moveq	#0,d4
	move.w  d5,d4
	sub.w	#56,d4   ;if(j<=userLocalB_)i=(1<<i)
	cmp.w	#66,d5
	bgt G53
	moveq	#1,d0
	asl.l	d4,d0
	move.l  d0,d4	;elseif(j==favorite_)i=FAVORITE
	bra G54
G53:
	cmp.w	#91,d5
	bne G55
	move.l  #2048,d4   ;elsegotoFRTN
	bra G56
G55:
	bra G52
G56:
G54:   ;return((bufPtr->Flags&i)?TRUE FALSE)
	move.l  168(a2),d0
	and.l	d4,d0
	beq G57
	moveq	#1,d0
	bra G58
G57:
	moveq	#0,d0
G58:
	bra G50
G46:	reg d4/d5/a2

	xdef  _Fspeak
_Fspeak:
	link	a5,#G128
	movem.l G129,-(sp)   ;i=args[0]
	moveq	#0,d0
	move.b  _args,d0
	move.w  d0,d4	;args[1]=all_
	move.b  #134,_args+1   ;len=0L
	clr.l	-4(a5)   ;if(i==buf_||i==literal_)p=exportStr(&len)
	cmp.w	#1,d4
	beq G131
	cmp.w	#7,d4
	bne G130
G131:
	pea -4(a5)
	jsr _exportStr
	move.l  d0,a2	;elsep=fixString(0x00,0,127)
	addq.w  #4,sp
	bra G132
G130:
	move.w  #127,-(sp)
	clr.w	-(sp)
	clr.w	-(sp)
	jsr _fixString
	move.l  d0,a2
	addq.w  #6,sp
G132:	;if(p==NULL)return(FALSE)
	move.l  a2,d0
	bne G133
	moveq	#0,d0
G134:
	movem.l (sp)+,G129
	unlk	a5
	rts   ;i=speakIt(p)
G133:
	move.l  a2,-(sp)
	jsr _speakIt
	move.w  d0,d4	;if(len)FreeMem(p,len)
	tst.l	-4(a5)
	addq.w  #4,sp
	beq G135
	move.l  -4(a5),-(sp)
	move.l  a2,-(sp)
	jsr _FreeMem   ;return(i)
	addq.w  #8,sp
G135:
	move.w  d4,d0
	bra G134   ;}
G128:	equ -4
G129:	reg d4/a2

	xdef  _FputMsg
_FputMsg:
	move.l  a2,-(sp)   ;RUCHAR*zz=fixString(0x00,0,75)
	move.w  #75,-(sp)
	clr.w	-(sp)
	clr.w	-(sp)
	jsr _fixString
	move.l  d0,a2	;if(z==NULL)clearMsg()
	move.l  a2,d0
	addq.w  #6,sp
	bne G158
	jsr _clearMsg	;elseoneMsg(z)
	bra G159
G158:
	move.l  a2,-(sp)
	jsr _oneMsg
	addq.w  #4,sp
G159:	;return(TRUE)
	moveq	#1,d0
	move.l  (sp)+,a2
	rts

	xdef  _FinputString
_FinputString:
	movem.l G161,-(sp)   ;rtn=FALSE
	moveq	#0,d4	;bufNum=*longPtrArgs[0]
	move.l  _longPtrArgs,a0
	move.w  2(a0),d6   ;if(bufNum<MAXFILES)gotoRTN
	moveq	#0,d0
	move.w  d6,d0
	cmp.l	_MAXFILES,d0
	blt G162   ;if(!getBuf(bufNum))gotoRTN
	move.w  d6,-(sp)
	jsr _getBuf
	tst.w	d0
	addq.w  #2,sp
	beq G162   ;curB=buf[bufNum]
	moveq	#0,d0
	move.w  d6,d0	;	ext.l	d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	lea _buf,a0
	move.l  (a0,d0.w),a2   ;if(curB==curBuf)gotoRTN
	cmp.l	_curBuf,a2
	beq G162   ;saveSplit()
	jsr _saveSplit   ;curBuf=curB
	move.l  a2,_curBuf   ;splitBufNum[0]=curB->BufNum
	move.w  166(a2),_splitBufNum   ;strcpy(curB->FileName,
	
;;;    pea G40+0
	move.w  #0,-(sp)
	pea 196(a2)
	jsr _setPMTitle
	addq.l  #6,sp
;;;	jsr _strcpy
	
	move.l  168(a2),d5   ;saveFlags=curB->Flags
;;;	lea	168(a2),a0   ;curB->Flags&=~CHANGED
	bclr.b	#0,170(a2)
	
	move.w  #2,-(sp)	;primitiveEdit(2)
	jsr _primitiveEdit   ;rtn=(curB->Flags&CHANGED)?TRUE FALSE
	addq.l  #2,sp
	btst.b  #0,170(a2)
;;;	lea 10(sp),sp
	beq G163
	moveq	#1,d0
	bra G164
G163:
	moveq	#0,d0
G164:
	move.w  d0,d4	;curB->Flags|=saveFlags
;;;	lea	168(a2),a0
	or.l	d5,168(a2)
	
	clr.b	196(a2)   ;curB->FileName[0]=0x00
	move.l  a2,-(sp)   ;nameBuf(curB)
	jsr _nameBuf   ;curB->Block=curB->NextBlock
	move.l  160(a2),(a2)   ;curB->Ptr=(UCHAR*)curB->NextBlock
	move.l  160(a2),80(a2)   ;unsaveSplit()
	jsr _unsaveSplit   ;curBuf=buf[splitBufNum[curSplit]]
	moveq	#0,d0
	move.w  _curSplit,d0	;	ext.l	d0
	add.w	d0,d0	;asl.l  #1,d0
	lea _splitBufNum,a0
	moveq	#0,d1
	move.w  (a0,d0.w),d1	;	ext.l	d1
;;;	asl.w	#2,d1
	add.w	d1,d1
	add.w	d1,d1
	lea _buf,a0
	move.l  (a0,d1.w),_curBuf	;setTitle()
	move.w  #1,_showTitle		;jsr _setTitle	;switchFast()
	jsr _switchFast   ;displayFlag=ALLPAGE
	move.w  #-16,_displayFlag	;RTN
	addq.w  #4,sp
G162:	;return(rtn)
	move.w  d4,d0
G165:
	movem.l (sp)+,G161
	rts   ;}
G161:	reg d4-d6/a2
G40:
	dc.b	80,114,105,109,105,116,105,118,101,32,77,111,100,101,32
	dc.b	115,116,114,105,110,103,32,105,110,112,117,116,32,40,112
	dc.b	109,69,83,67,32,61,32,100,111,110,101,41,58,0
	ds  0

	xdef  _FeditBuf
_FeditBuf:
	movem.l G168,-(sp)   ;ii=(short)*longPtrArgs[0]
	move.l  _longPtrArgs,a0
	move.w  2(a0),d4   ;if(!getBuf(i))gotoBRTN
	move.w  d4,-(sp)
	jsr _getBuf
	tst.w	d0
	addq.w  #2,sp
	beq G169   ;curb=buf[i]
	moveq	#0,d0
	move.w  d4,d0	;	ext.l	d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	lea _buf,a0
	move.l  (a0,d0.w),a2   ;curBuf=curb
	move.l  a2,_curBuf   ;splitBufNum[curSplit]=curb->BufNum
	moveq	#0,d0
	move.w  _curSplit,d0	;	ext.l	d0
	add.w	d0,d0	;asl.l  #1,d0
	lea _splitBufNum,a0
	move.w  166(a2),(a0,d0.w)	;nameBuf(curb)
	move.l  a2,-(sp)
	jsr _nameBuf   ;switchFast()
	jsr _switchFast   ;if(*(curb->PPtr)==EOFILE){
	move.l  100(a2),a0
	cmp.b	#3,(a0)
	addq.w  #4,sp
	bne G170   ;curb->PBlock=curb->NextBlock
	move.l  160(a2),20(a2)   ;curb->PPtr=curb->NextBlock->Data
	move.l  160(a2),100(a2)   ;}displayFlag=(PAGE_<<curSplit)
G170:
	moveq	#16,d0
	move.w  _curSplit,d1
	asl.w	d1,d0
	move.w  d0,_displayFlag   ;FrefreshDisplay()
	jsr _FrefreshDisplay   ;return(TRUE)
	moveq	#1,d0
G171:
	movem.l (sp)+,G168
	rts   ;BRTN
G169:	;return(FALSE)
	moveq	#0,d0
	bra G171
G168:	reg d4/a2

	xdef  _FmoveCursor
_FmoveCursor:
	move.l  a2,-(sp)   ;RstructCB*bufPtrbufPtr=bufPtrArgs[0]
	move.l  _bufPtrArgs,a2   ;if(bufPtr==NULL)gotoFRTN
	move.l  a2,d0
	beq G174   ;getBP(bufPtr,1)
	move.w  #1,-(sp)
	move.l  a2,-(sp)
	jsr _getBP   ;if(gB==NULL||gP==bufPtr->Ptr)gotoFRTN
	tst.l	_gB
	addq.w  #6,sp
	beq G174
	move.l  80(a2),a0
	cmp.l	_gP,a0
	beq G174   ;bufPtr->Block=gB
	move.l  _gB,(a2)   ;bufPtr->Ptr=gP
	move.l  _gP,80(a2)   ;if(bufPtr==curBuf)
	cmp.l	_curBuf,a2  ; displayFlag |= SHOWCURSOR_
	bne G175
	bset.b  #0,_displayFlag+1	;return(TRUE)
	move.w  #-1,_gcol
G175:
	moveq	#1,d0
G176:
	move.l  (sp)+,a2
	rts   ;FRTN
G174:	;return(FALSE)
	moveq	#0,d0
	bra G176

	xdef  _FequateLoc
_FequateLoc:
	movem.l G178,-(sp);bufPtr=bufPtrArgs[0]
	move.l  _bufPtrArgs,a2   ;if(bufPtr==NULL)gotoFRTN
	move.l  a2,d0
	beq G179   ;getBP(bufPtr,2)
	move.w  #2,-(sp)
	move.l  a2,-(sp)
	jsr _getBP   ;if(gB==NULL)gotoFRTN
	tst.l	_gB
	addq.w  #6,sp
	beq G179   ;j=args[1]
	moveq	#0,d4
	move.b  _args+1,d4
		;	move.w  d0,d4	;if(j==mouseLoc_)mouseY=0
	cmp.w	#118,d4
	bne G180
	clr.w	_mouseY   ;j-=atCursor_
G180:
	sub.w	#99,d4   ;ovl=(UCHAR**)bufPtr
	move.l  a2,a3	;ovl[j]=(UCHAR*)gB
	moveq	#0,d0
	move.w  d4,d0	;	ext.l	d0
;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	move.l  _gB,(a3,d0.w)	;ovl[j+CBOVL]=gP
		;	move.w  d4,d0
	add.w	#80,d0
		;	ext.l	d0
		;	asl.w	#2,d0
	move.l  _gP,(a3,d0.w)	;return(TRUE)
	moveq	#1,d0
G181:
	movem.l (sp)+,G178
	rts   ;FRTN
G179:	;return(FALSE)
	moveq	#0,d0
	bra G181   ;}
G178:	reg d4/a2/a3

	xdef  _FincLoc
_FincLoc:
	movem.l G183,-(sp)  ;bufPtr=bufPtrArgs[0]
	move.l  _bufPtrArgs,a2   ;if(bufPtr==NULL)gotoFRTN
	move.l  a2,d0
	beq G184   ;i=args[1]
	moveq	#0,d0
	move.b  _args+1,d0
	move.w  d0,d5	;j=i-atCursor_
	move.w  d5,d4
	sub.w	#99,d4   ;ovl=(UCHAR**)bufPtr
	move.l  a2,a3	;if(*(ovl[j+CBOVL])==EOFILE)gotoFRTN
	move.w  d4,d0
	add.w	#20,d0  ;	ext.l	d0
;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	move.l  (a3,d0.w),a0
	cmp.b	#3,(a0)
	beq G184   ;if(i==mouseLoc_)mouseY=0
	cmp.w	#118,d5
	bne G185
	clr.w	_mouseY   ;fastBufPtr=bufPtr
G185:
	move.l  a2,_fastBufPtr   ;fastB=(structDB*)ovl[j]
	moveq	#0,d0
	move.w  d4,d0	;	ext.l	d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	move.l  (a3,d0.w),_fastB   ;fastP=ovl[j+CBOVL]
		;	move.w  d4,d0
	add.w	#80,d0  ;	ext.l	d0  ;	asl.w	#2,d0
	move.l  (a3,d0.w),_fastP   ;ovl[j+CBOVL]=incFast()
	jsr _incFast
	moveq	#0,d1
	move.w  d4,d1
	add.w	#20,d1  ;	ext.l	d1
;;;	asl.w	#2,d1
	add.w	d1,d1
	add.w	d1,d1
	move.l  d0,(a3,d1.w)   ;ovl[j]=(UCHAR*)fastB
	sub.w	#80,d1
		;	moveq	#0,d0
		;	move.w  d4,d0
		;	ext.l	d0
		;	asl.w	#2,d0
	move.l  _fastB,(a3,d1.w)   ;popFast()
	jsr _popFast   ;return(TRUE)
	moveq	#1,d0
G186:
	movem.l (sp)+,G183
	rts   ;FRTN
G184:	;return(FALSE)
	moveq	#0,d0
	bra G186   ;}
G183:	reg d4/d5/a2/a3

	xdef  _FdecLoc
_FdecLoc:
	movem.l G188,-(sp)  ;bufPtr=bufPtrArgs[0]
	move.l  _bufPtrArgs,a2   ;if(bufPtr==NULL)gotoFRTN
	move.l  a2,d0
	beq G189   ;i=args[1]
	moveq	#0,d0
	move.b  _args+1,d0
	move.w  d0,d5	;j=i-atCursor_
	move.w  d5,d4
	sub.w	#99,d4   ;ovl=(UCHAR**)bufPtr
	move.l  a2,a3	;if(ovl[j+CBOVL]==(UCHAR*)bufP,r->NextBlock)
	move.w  d4,d0	; gotoFRTN
	add.w	#20,d0
		;	ext.l	d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	move.l  (a3,d0.w),a0
	cmp.l	160(a2),a0
	beq G189   ;if(i==mouseLoc_)mouseY=0
	cmp.w	#118,d5
	bne G190
	clr.w	_mouseY   ;fastBufPtr=bufPtr
G190:
	move.l  a2,_fastBufPtr   ;fastB=(structDB*)ovl[j]
	moveq	#0,d0
	move.w  d4,d0
		;	ext.l	d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	move.l  (a3,d0.w),_fastB   ;fastP=ovl[j+CBOVL]
		;	move.w  d4,d0
	add.w	#80,d0
		;	ext.l	d0
		;	asl.w	#2,d0
	move.l  (a3,d0.w),_fastP   ;ovl[j+CBOVL]=decFast()
	jsr _decFast
	moveq	#0,d1
	move.w  d4,d1
	add.w	#20,d1
		;	ext.l	d1
;;;	asl.w	#2,d1
	add.w	d1,d1
	add.w	d1,d1
	move.l  d0,(a3,d1.w)   ;ovl[j]=(UCHAR*)fastB
		;	move.w  d4,d0
		;	ext.l	d0
		;	asl.w	#2,d0
	sub.w	#80,d1
	move.l  _fastB,(a3,d1.w)   ;popFast()
	jsr _popFast   ;return(TRUE)
	moveq	#1,d0
G191:
	movem.l (sp)+,G188
	rts   ;FRTN
G189:	;return(FALSE)
	moveq	#0,d0
	bra G191   ;}
G188:	reg d4/d5/a2/a3

	xdef  _FeqLoc
_FeqLoc:
	movem.l G193,-(sp) ;bufPtr=bufPtrArgs[0]
	move.l  _bufPtrArgs,a2   ;if(bufPtr==NULL)gotoFRTN
	move.l  a2,d0
	beq G194   ;getBP(bufPtr,1)
	move.w  #1,-(sp)
	move.l  a2,-(sp)
	jsr _getBP   ;loc1=(long)loc(gB,gP)
	move.l  _gB,a0
	moveq	#0,d0
	move.w  246(a0),d0
	moveq	#16,d1
	asl.l	d1,d0
	add.l	_gP,d0
	move.l  d0,d4
	sub.l	_gB,d4   ;getBP(bufPtr,2)
	move.w  #2,-(sp)
	move.l  a2,-(sp)
	jsr _getBP   ;if(loc1!=loc(gB,gP))gotoFRTN
	move.l  _gB,a0
	moveq	#0,d0
	move.w  246(a0),d0
	moveq	#16,d1
	asl.l	d1,d0
	add.l	_gP,d0
	sub.l	_gB,d0
	cmp.l	d4,d0
	lea 12(sp),sp
	bne G194   ;return(TRUE)
	moveq	#1,d0
G195:
	movem.l (sp)+,G193
	rts   ;FRTN
G194:	;return(FALSE)
	moveq	#0,d0
	bra G195   ;}
G193:	reg d4/a2

	xdef  _FgeLoc
_FgeLoc:
	movem.l G197,-(sp) ;bufPtr=bufPtrArgs[0]
	move.l  _bufPtrArgs,a2   ;if(bufPtr==NULL)gotoFRTN
	move.l  a2,d0
	beq G198   ;getBP(bufPtr,1)
	move.w  #1,-(sp)
	move.l  a2,-(sp)
	jsr _getBP   ;loc1=(long)loc(gB,gP)
	move.l  _gB,a0
	moveq	#0,d0
	move.w  246(a0),d0
	moveq	#16,d1
	asl.l	d1,d0
	add.l	_gP,d0
	move.l  d0,d4
	sub.l	_gB,d4   ;getBP(bufPtr,2)
	move.w  #2,-(sp)
	move.l  a2,-(sp)
	jsr _getBP   ;if(loc1<loc(gB,gP))gotoFRTN
	move.l  _gB,a0
	moveq	#0,d0
	move.w  246(a0),d0
	moveq	#16,d1
	asl.l	d1,d0
	add.l	_gP,d0
	sub.l	_gB,d0
	cmp.l	d0,d4
	lea 12(sp),sp
	bcs G198   ;return(TRUE)
	moveq	#1,d0
G199:
	movem.l (sp)+,G197
	rts   ;FRTN
G198:	;return(FALSE)
	moveq	#0,d0
	bra G199   ;}
G197:	reg d4/a2

	xdef  _FgtLoc
_FgtLoc:
	movem.l G201,-(sp) ;bufPtr=bufPtrArgs[0]
	move.l  _bufPtrArgs,a2   ;if(bufPtr==NULL)gotoFRTN
	move.l  a2,d0
	beq G202   ;getBP(bufPtr,1)
	move.w  #1,-(sp)
	move.l  a2,-(sp)
	jsr _getBP   ;loc1=(long)loc(gB,gP)
	move.l  _gB,a0
	moveq	#0,d0
	move.w  246(a0),d0
	moveq	#16,d1
	asl.l	d1,d0
	add.l	_gP,d0
	move.l  d0,d4
	sub.l	_gB,d4   ;getBP(bufPtr,2)
	move.w  #2,-(sp)
	move.l  a2,-(sp)
	jsr _getBP   ;if(loc1<=loc(gB,gP))gotoFRTN
	move.l  _gB,a0
	moveq	#0,d0
	move.w  246(a0),d0
	moveq	#16,d1
	asl.l	d1,d0
	add.l	_gP,d0
	sub.l	_gB,d0
	cmp.l	d0,d4
	lea 12(sp),sp
	bls G202   ;return(TRUE)
	moveq	#1,d0
G203:
	movem.l (sp)+,G201
	rts   ;FRTN
G202:	;return(FALSE)
	moveq	#0,d0
	bra G203   ;}
G201:	reg d4/a2

	xdef  _FgetKeyVal
_FgetKeyVal:
	jsr _rmbFlags
G206:	;while(1){
	jsr _nextEvent   ;if(!nextEvent()&&!busyWork())waite()
	tst.w	d0
	bne G208
	jsr _busyWork
	tst.w	d0
	bne G208
	jsr _waite	;if(macroNum||gChar||stopPause)break
G208:
	tst.w	_macroNum
	bne G207
	tst.w	_gChar
	bne G207
	tst.w	_stopPause
	beq G206   ;}
G207:	;*(longPtrArgs[0])=macroNum
	moveq	#0,d0
	move.w  _macroNum,d0
		;	ext.l	d0
	move.l  _longPtrArgs,a0
	move.l  d0,(a0)   ;*(longPtrArgs[1])=gChar
	move.w  _gChar,d0
		;	ext.l	d0
	move.l  _longPtrArgs+4,a0
	move.l  d0,(a0)   ;return(TRUE)
	moveq	#1,d0
G209:
	rts

	xdef  _FgetKey
_FgetKey:
	jsr _rmbFlags
G212:	;while(1){
	jsr _nextEvent   ;if(!nextEvent()&&!busyWork())waite()
	tst.w	d0
	bne G214
	jsr _busyWork
	tst.w	d0
	bne G214
	jsr _waite	;if(macroNum||stopPause)break
G214:
	tst.w	_macroNum
	bne G213
	tst.w	_stopPause
	beq G212
G213:	;*(longPtrArgs[0])=macroNum
	moveq	#0,d0
	move.w  _macroNum,d0
	move.l  _longPtrArgs,a0
	move.l  d0,(a0)   ;return(TRUE)
	moveq	#1,d0
G215:
	rts   ;}

	xdef  _FgetChar
_FgetChar:
	jsr _rmbFlags
G218:	;while(1){
	jsr _nextEvent   ;if(!nextEvent()&&!busyWork())waite()
	tst.w	d0
	bne G220
	jsr _busyWork
	tst.w	d0
	bne G220
	jsr _waite	;if(gChar||stopPause)break
G220:
	tst.w	_gChar
	bne G219
	tst.w	_stopPause
	bne G219   ;}
	bra G218
G219:	;*(longPtrArgs[0])=gChar
	moveq	#0,d0
	move.w  _gChar,d0
	move.l  _longPtrArgs,a0
	move.l  d0,(a0)   ;return(TRUE)
	moveq	#1,d0
G221:
	rts   ;}

	xdef  _FinputKey
_FinputKey:
	jsr _rmbFlags
	jsr _nextEvent   ;if(nextEvent()&&macroNum){
	tst.w	d0
	beq G224
	tst.w	_macroNum
	beq G224   ;*(longPtrArgs[0])=macroNum
	moveq	#0,d0
	move.w  _macroNum,d0
	move.l  _longPtrArgs,a0
	move.l  d0,(a0)   ;return(TRUE)
	moveq	#1,d0
G225:
	rts   ;}*(longPtrArgs[0])=0L
G224:
	move.l  _longPtrArgs,a0
	clr.l	(a0)   ;return(FALSE)
	moveq	#0,d0
	bra G225   ;}

	xdef  _FswapKey
_FswapKey:
	movem.l G227,-(sp)   ;k1=*(longPtrArgs[0])
	move.l  _longPtrArgs,a0
	move.w  2(a0),d4   ;k2=*(longPtrArgs[1])
	move.l  _longPtrArgs+4,a0
	move.w  2(a0),d5   ;if(k1<=0||k2<=0)gotoFRTN
	tst.w	d4
	ble G228
	tst.w	d5
	ble G228   ;if(k1>=MAXMACROS||k2>=MAXMACROS||k1==k2)
	cmp.w	#1200,d4		;gotoFRTN
	bge G228
	cmp.w	#1200,d5
	bge G228
	cmp.w	d5,d4
	beq G228   ;if(cmdTable[k1]==NULL&&cmdTable[k2]==NULL)
	moveq	#0,d0	;gotoFRTN
	move.w  d4,d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	lea _cmdTable,a0
	tst.l	(a0,d0.w)
	bne G229
	move.w  d5,d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	lea _cmdTable,a0
	tst.l	(a0,d0.w)
	beq G228
G229:	;if(k1==startupMacro||k2==startupMacro)killMenus()
	cmp.w	#1148,d4
	beq G231
	cmp.w	#1148,d5
	bne G230
G231:
	jsr _killMenus   ;x=(UCHAR*)cmdTable[k1]
G230:
	moveq	#0,d0
	move.w  d4,d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	moveq	#0,d1
	move.w  d5,d1
;;;	asl.w	#2,d1
	add.w	d1,d1
	add.w	d1,d1
	lea _cmdTable,a0
	move.l  (a0,d0.w),a2   ;cmdTable[k1]=cmdTable[k2]
	lea _cmdTable,a1
	move.l  (a0,d1.w),(a1,d0.w)   ;cmdTable[k2]=(UCHAR*)x
	move.l  a2,(a0,d1.w)   ;i=cmdLens[k1]

	move.w  d4,d0
	add.w	d0,d0	;asl.l  #1,d0
	move.w  d5,d1
	add.w	d1,d1	;asl.l  #1,d0
	lea _cmdLens,a0
	move.w  (a0,d0.w),d6   ;cmdLens[k1]=cmdLens[k2]
	lea _cmdLens,a1
	move.w  (a0,d1.w),(a1,d0.w)   ;cmdLens[k2]=i
	move.w  d6,(a0,d1.w)   ;return(TRUE)
	moveq	#1,d0
G232:
	movem.l (sp)+,G227
	rts   ;FRTN
G228:	;return(FALSE)
	moveq	#0,d0
	bra G232   ;}
G227:	reg d4-d7/a2

	xdef  _FkillKey
_FkillKey:
	move.l  d4,-(sp)   ;Rshortii=*longPtrArgs[0]
	move.l  _longPtrArgs,a0
	move.w  2(a0),d4   ;if(i<=0||i>=MAXMACROS
	tst.w	d4  ;||cmdTable[i]==NULL)gotoBRTN
	ble G235
	cmp.w	#1200,d4
	bge G235
	moveq	#0,d0
	move.w  d4,d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	lea _cmdTable,a0
	tst.l	(a0,d0.w)
	beq G235   ;if(i==startupMacro)killMenus()
	cmp.w	#1148,d4
	bne G236
	jsr _killMenus   ;FreeMem(cmdTable[i],(long)cmdLens[i])
G236:
	moveq	#0,d0
	move.w  d4,d0
		;	ext.l	d0
	add.w	d0,d0	;asl.l  #1,d0
	lea _cmdLens,a0
	moveq	#0,d1
	move.w  (a0,d0.w),d1
		;	ext.l	d1
	move.l  d1,-(sp)
	move.w  d4,d0
		;	ext.l	d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	lea _cmdTable,a0
	move.l  (a0,d0.w),-(sp)
	jsr _FreeMem   ;cmdLens[i]=0
	moveq	#0,d0
	move.w  d4,d0
	add.w	d0,d0	;asl.l  #1,d0
	lea _cmdLens,a0
	clr.w	(a0,d0.w)	;cmdTable[i]=NULL
	add.w	d0,d0	;this is TIMES 4
		;	move.w  d4,d0
		;	ext.l	d0
		;	asl.w	#2,d0
	lea _cmdTable,a0
	clr.l	(a0,d0.w)	;return(TRUE)
	moveq	#1,d0
	addq.w  #8,sp
G237:
	move.l  (sp)+,d4
	rts   ;BRTN
G235:	;return(FALSE)
	moveq	#0,d0
	bra G237   ;}

	xdef  _Fdelay
_Fdelay:
	link	a5,#G238
	jsr _rmbFlags
	move.l  d4,-(sp)   ;ticks=*longPtrArgs[0]
	move.l  _longPtrArgs,a0
	move.l  (a0),d4   ;if(ticks<=0L)gotoBRTN
	tst.l	d4
	ble G240   ;(void)setTime(&seconds,&micros,ticks)
	move.l  d4,-(sp)
	pea -8(a5)
	pea -4(a5)
	jsr _setTime   ;while(1){
	lea 12(sp),sp
G241:	;collectRaw()
	jsr _collectRaw   ;if(stopPause)break
	tst.w	_stopPause
	bne G242   ;if(!busyWork())waite()
	jsr _busyWork
	tst.w	d0
	bne G243
	jsr _waite	;if(isTime(seconds,micros))break
G243:
	move.l  -8(a5),-(sp)
	move.l  -4(a5),-(sp)
	jsr _isTime
	tst.w	d0
	addq.w  #8,sp
	bne G242   ;}
	bra G241
G242:	;return(TRUE)
	moveq	#1,d0
G244:
	move.l  (sp)+,d4
	unlk	a5
	rts   ;BRTN
G240:	;return(FALSE)
	moveq	#0,d0
	bra G244   ;}
G238:	equ -8

	xdef  _wipeCmds
_wipeCmds:
	move.l  d4,-(sp)   ;Rshortifor(i=0i<MAXMACROSi++){
	moveq	#0,d4
G249:	;if(cmdTable[i]!=NULL)
	moveq	#0,d0	;FreeMem(cmdTable[i],(long)cmdLe
	move.w  d4,d0
;;;	asl.w	#2,d0
	add.w	d0,d0
	add.w	d0,d0
	lea _cmdTable,a0
	tst.l	(a0,d0.w)
	beq G250   ;ns[i])
	move.w  d4,d0
	add.w	d0,d0	;asl.l  #1,d0
	lea _cmdLens,a0
	moveq	#0,d1
	move.w  (a0,d0.w),d1
	move.l  d1,-(sp)
	add.w	d0,d0	;this is TIMES 4
	lea _cmdTable,a0
	move.l  (a0,d0.w),-(sp)
	jsr _FreeMem   ;cmdTable[i]=NULL
	addq.w  #8,sp
G250:
	moveq	#0,d0
	move.w  d4,d0
	add.w	d0,d0	;asl.l  #1,d0
	lea _cmdLens,a0
	clr.w	(a0,d0.w)	;}
	add.w	d0,d0	;this is TIMES 4
	lea _cmdTable,a0
	clr.l	(a0,d0.w)	;cmdLens[i]=0
G247:
	addq.w  #1,d4
	cmp.w	#1200,d4
	blt G249
G248:	;}
G251:
	move.l  (sp)+,d4
	rts

	xdef	_pushNum
_pushNum:
	move.l	d5,-(sp)		;if(args[0]!=n_)gotoBRTN
	cmp.b	#4,_args
	bne	V4  	  ;j=(ULONG)longPtrArgs[0]-(ULONG)&n[0]
	lea	_n,a0
	move.l	_longPtrArgs,d5
	sub.l	a0,d5		 ;if(!push(&nStack[i],*longPtrArgs[1]))gotoBRTN
	move.l	_longPtrArgs+4,a0
	move.l	(a0),-(sp)
	lea	_nStack,a0
	add.l	d5,a0
	move.l	a0,-(sp)
	jsr	_push
	tst.w	d0
	addq.w	#8,sp
	beq	V4  	  ;numPopStack[i]++
	lea	_numPopStack,a0
	add.l	#1,(a0,d5.w)		;return(TRUE)
	moveq	#1,d0
V5:
	move.l	(sp)+,d5
	rts 	   ;BRTN:
V4: 	   ;return(FALSE)
	moveq	#0,d0
	bra	V5  	  ;}

	xdef	_popNum
_popNum:
	move.l	d5,-(sp)		;if(args[0]!=n_)gotoBRTN
	cmp.b	#4,_args
	bne	V8  	  ;j=(ULONG)longPtrArgs[0]-(ULONG)&n[0]
	lea	_n,a0
	move.l	_longPtrArgs,d5
	sub.l	a0,d5		 ;if(!pop(&nStack[i],longPtrArgs[1]))gotoBRTN
	move.l	_longPtrArgs+4,-(sp)
	lea	_nStack,a0
	add.l	d5,a0
	move.l	a0,-(sp)
	jsr	_pop
	tst.w	d0
	addq.w	#8,sp
	beq	V8  	  ;numPopStack[i]--
	lea	_numPopStack,a0
	sub.l	#1,(a0,d5.w)		;return(TRUE)
	moveq	#1,d0
V9:
	move.l	(sp)+,d5
	rts 	   ;BRTN:
V8: 	   ;return(FALSE)
	moveq	#0,d0
	bra	V9  	  ;}

	xdef  _push	;push(stack,val)
_push:   ;if (noMemory ||
	tst.w	_noMemory	;(x =AllocMem((long)sizeof(struct ST),
	bne x13   ;(long)MEMF_CLEAR))==NU ;LL) return(FALSE);
	pea 65536
	pea 8
	jsr _AllocMem
	addq.w  #8,sp
	tst.l	d0
	beq x13
	move.l  d0,a0
	move.l  4(sp),a1
	move.l  (a1),4(a0)   ;*stack = x;
	move.l  a0,(a1)   ;x->num = val;
	move.l  8(sp),(a0)   ;return(TRUE);
	moveq	#1,d0
x14:
	rts   ;x->ptr = *stack;
x13:
	moveq	#0,d0
	bra x14

	xdef  _pop   ;pop(stack,val) ;Rstruct ST **stack;
_pop:
	move.l  a2,-(sp)
	move.l  8(sp),a1   ;Rstruct ST *x
	tst.l	(a1)   ;if (*stack==NULL) return(FALSE);
	beq x17
	move.l  (a1),a2   ;*val = x->num;
	move.l  12(sp),a0
	move.l  (a2),(a0)	;*stack = x->ptr;
	move.l  4(a2),(a1)   ;FreeMem(x,(long)sizeof(struct ST));
	pea 8
	move.l  a2,-(sp)
	jsr _FreeMem   ;return(TRUE);
	addq.w  #8,sp
	moveq	#1,d0
x18:
	move.l  (sp)+,a2
	rts   ;x = *stack;
x17:
	moveq	#0,d0
	bra x18

#endasm
#endif

