/* -----------------------  Ue1.c	---------------------- */

#define ISMAIN 1

#include "uedit.h"

void setShow();

static long 		myPriority;
static struct Task  *myTask;

void setTaskPri(pri)
register long pri;
{
	if (pri < -128L) pri = -128L;
	if (pri>127L) pri = 127L;
	myPriority = SetTaskPri(myTask,pri);
}

FsetTaskPri()
{
	setTaskPri(*longPtrArgs[0]);
	return(TRUE);
}

void init()
{
	setShow();
	nullArrays();
	zero(buf);
	zero(edMenu);
	wipeMsgQ();
	wipeLearn();
	zero(cmdLens);
	zero(cmdTable);
	zero(menuMacroNum);
	zero(tabTables);
	zero(bStack);
	zero(nStack);
	zero(bufPopStack);
	zero(numPopStack);
	zero(bufferFlags);
	*passive=0x00;
	zero(linePtrs);
	*rc=0x00;
	zero(gadgetName);
	initFolds();
	
	localColor =  1182604243;
	screenColor =  -1206491631;

	hyperText.table = NULL;

	myTask = FindTask((char *)NULL);
}

void _wb_parse() { }

/* -----------------------
---------------------- */

extern struct WBStartup *WBenchMsg;
UCHAR					*statePtr = NULL;

main(argc,argv)
int   argc;
char **argv;
{
register struct WBArg	*arg;
register char			*x;
register short  		k,n;
register long			i,m;
char					*vargs[21];

	DosBase  = (long)OpenLibrary("dos.library",0L);
	IntuitionBase	= (long)OpenLibrary("intuition.library",0L);
	GfxBase  = (long)OpenLibrary("graphics.library", 0L);
	DiskfontBase  = (long)OpenLibrary("diskfont.library", 0L);
	if (GfxBase==0L || IntuitionBase==0L || DosBase==0L || DiskfontBase==0L)
						exit(10);

	if (argc>1) {
		if (argc>20) argc = 20;
		 for (i=0; i<argc; i++) vargs[i]=argv[i];
	} else if (WBenchMsg!=NULL) {
		argc = WBenchMsg->sm_NumArgs;
		if (argc>1) {
			if (argc>20) argc=20;
			for(i=0, arg = WBenchMsg->sm_ArgList; i < argc; i++,arg++) {
				CurrentDir(arg->wa_Lock);
				vargs[i]=arg->wa_Name;
			}
		}
	}

	init();

	menuDrawn = &((struct IntuitionBase *)IntuitionBase)->Flags;

/* -------------------------
configPtr = getenv("UCONFIG");
if (configPtr==NULL) configPtr = fileName(sss,"Config!");
------------------------- */
	statePtr = NULL;

	strcpy(dataName,DFALT_DAT); 						 /* data! */
	i = 1;
	if (argc>1) for (; i<argc; i++) {
		x = vargs[i];
		if (*(x++)!='-') goto NOARGS;
		k = tolower(*(x++));
		if (k=='s') {
			if (*x<=' ') x = (char *)"uestate";
			statePtr = (UCHAR *)x;
			continue;
		}
		if (k=='d') {
			if (*x>' ') strncpy(dataName,x,(size_t)63);
			continue;
		}
		if (k=='c') {
			if (*x>' ') configPtr = (UBYTE *)x;
			else configPtr = (UBYTE *)DFALT_CFG;
			continue;
		}
		n = *x;
		if (k=='l')  lcmd = (UCHAR *)x;
		else if (isdigit(n) || n=='-') {
			m = atole(x);
			if (k=='a') { uga = m; continue; }
			if (k=='b') { ugb = m; continue; }
			if (k=='k') { if (m>0L && m<MAXMACROS) kcmd = m; continue; }
		}
	}

NOARGS:
	curBuf = NULL;  										 /* warn below */
	startingUp = 1;
	if (!loadKeyData()) goto BADQUIT;		 /* startingUp is TRUE here */

	/* parse command line */
	while (i<argc) { startFile(vargs[i]); i++; }
								/*   if (WBenchMsg) ReplyMsg(WBenchMsg); */
	stopPause = 0;
	showTitle = TRUE;
	bombMaybe();

	editWork();

BADQUIT:
	badQuit();
}

void badQuit()
{
long j;

	j = 10L;
	longPtrArgs[0] = &j;
	Fquit();
}

void bombMaybe()
{
	if (curBuf==NULL) {
		if (startFile((UCHAR *)0L)<0 && startFile((UCHAR *)4L)<0) badQuit();
	}
}

void newCurBuf()
{
register struct CB  **bf;
register long       i;

	bf = &(buf[0]);
	curBuf = NULL;
	for (i=0; i<MAXFILES; i++,bf++) if (*bf!=NULL) {
		curBuf = *bf;
		splitBufNum[curSplit] = i;
		switchFast();
		fixSplit();
		FrefreshDisplay();
		return;
	}
	bombMaybe();
}

#ifdef USEC

void nullify(x,amt)
register UCHAR *x;
register long amt;
{
	while (amt-- > 0) *(x++) = 0;
}

void toLower(xx)
register UCHAR *xx;
{
register UCHAR ch;

	while (1) {
        ch = *xx;
        if (ch==0x00) return;
		if (ch<='Z' && ch>='A') {
            ch |= 32;
            *xx = ch;
		}
        xx++;
	}
}

void setGlobals()
{
register ULONG gflags;

	gflags = 0;
	if (autoBackup)   gflags |= AUTOBACKUP;
	if (wordWrap)	 gflags |= WORDWRAP;
	if (rightJustify) gflags |= RIGHTJUSTIFY;
	if (overstrike)   gflags |= OVERSTRIKE;
	if (autoIndent)   gflags |= AUTOINDENT;
	if (mapChars)	 gflags |= MAPCHARS;
	if (trueTabs)	 gflags |= TRUETABS;
	if (userLocalA)  gflags |= USERLOCALA;
	if (userLocalB)  gflags |= USERLOCALB;
	globalFlags = gflags;
}

void freeCompileBuf()
{
	if (buffer!=NULL) FreeMem(buffer,(long)MAXMACROSIZE + 4100L);
	buffer = NULL;
}

busyWork()
{
	if (showTitle) setTitle();
	if (prints || saves) {
		doPrinting();
		doSaving();
		return(prints || saves);
	}
	return(FALSE);
}

void makeWindow()
{
	downWindow();
	upWindow();
	FfullRefresh();
	cleared = 0;
	clearMsg();
	collectRaw();  /* soakInputs(); */
}

#endif

void ReportMouse(long Boolean, struct Window *Window);
#pragma amicall(IntuitionBase, 0xea, ReportMouse(d0,a0))

void trackMouse()
{
register struct Window  *w;

	w = edWindow;
	if (tiny || w==NULL) return;
	reportMouse = TRUE;
	ModifyIDCMP(w,
		(ULONG)(CLOSEWINDOW | MENUPICK | RAWKEY | MOUSEBUTTONS | MOUSEMOVE));
			/*  | REQVERIFY | MENUVERIFY | REQCLEAR */
	ReportMouse(1L,w);
}

void unsaveFlags()
{
register struct Window  *w;

	w = edWindow;
	if (tiny || w==NULL) return;
	ReportMouse(0L,w);
	ModifyIDCMP(w,
		(ULONG)(CLOSEWINDOW | MENUPICK | RAWKEY | MOUSEBUTTONS));
			  /* | REQVERIFY | MENUVERIFY | REQCLEAR */
	rmbFlags();

	reportMouse = mouseDown = FALSE;
}

void rmbFlags()
{
register struct Window  *w;
register ULONG  		i;

	w = edWindow;
	if (w && tiny==0) {
		i = w->Flags;
		if (trapMenus)  i |=		  RMBTRAP;
		else			i &= ~((ULONG)RMBTRAP);
		w->Flags = i;
	}
	setGlobals();
}

void closeffont()
{
	if (ffont) CloseFont(ffont);
	ffont = NULL;
}

static short  Left, Top = 0;

void downWindow()
{
register struct Screen *ss;
register struct Window *ed;

	ss = edScreen;
	ed = edWindow;
	downChip();
	downWarp();
	freeCompileBuf();
	if (ed!=NULL) {
		collectRaw();										/* soak inputs */
		downMenus();
		mouseDown = reportMouse = 0;
		((struct Process *)myTask)->pr_WindowPtr = NULL;
		CloseWindow(ed);
		edWindow = NULL;
		uport = NULL;
	}
	if (ss!=NULL && ss->FirstWindow==NULL) {
		Top = ss->TopEdge;
		Left= ss->LeftEdge;
		CloseScreen(ss);
		edScreen = NULL;
	}
	vp = NULL;
	closeffont();
}

void doFont()
{
register struct TextAttr *f;

    f = &font;
	f->ta_Flags = FPF_ROMFONT;
	f->ta_Name  = fontName;
	f->ta_YSize = fontHeight;
	f->ta_Style = 0;

	ffont = OpenFont(f);
	if (ffont && f->ta_YSize!=ffont->tf_YSize) closeffont();
	if (ffont==NULL) {
		f->ta_Flags = FPF_DISKFONT;
		ffont = OpenDiskFont(f);
		if (ffont && f->ta_YSize!=ffont->tf_YSize) closeffont();
		if (ffont==NULL) {
			f->ta_Name = "topaz.font";
			f->ta_YSize = 8;
			f->ta_Flags = FPF_ROMFONT;
			ffont = OpenFont(f);
		}
	}
}

void upWindow()
{
register struct NewWindow	*w;
register struct NewScreen	*s;
register USHORT				vertP,swidth,c1,c2;
register long				i;

	wptr = lineBuf;
	if (depth==1) {
		c2 = 0;
		c1 = 1;
	} else {
		i = screenColor >> 28L;
		c1 = (i >> 2) & 3; /* fg */
		c2 = i & 3; 	   /* bg */
	}
	w = &laceWindow;
	s = &Screen;
	s->Type = WBENCHSCREEN;
	if (customScreen) s->Type=CUSTOMSCREEN;
	w->Type = s->Type;

	downWindow();

	swidth = sWidth;
	if ( swidth < 640 ) swidth = 640;
	else if ( swidth >  1064 ) swidth = 1064;
	w->Width = sWidth = horPixels = swidth;
	s->Width = swidth;

	vertP = sHeight;
	if ( vertP < 200 ) vertP = 200;
	else if ( vertP > 1064 ) vertP = 1064;
	sHeight = vertP;

	if (lace & 2) { if (vertP > (67 * 8)) vertP >>= 1; }
	vertPixels = vertP;

    doFont();
	s->Font = &font;
    
NOLACE:
	depth = 2 - (lace & 1);
	s->Depth = depth;
	s->ViewModes &= ~LACE;
	vertP  = vertPixels;
	if (lace & 2) { vertP <<= 1; s->ViewModes |= LACE; }
	s->DetailPen = c1;
	s->BlockPen =  c2;
	w->DetailPen = c1;
	w->BlockPen  = c2;
	w->Height = vertP;
	s->Height = vertP + 1;

	s->TopEdge = Top;
	s->LeftEdge = Left;

	if ((edScreen=(struct Screen *)OpenScreen(s))==NULL) goto NEWIN;

	vp = &(edScreen->ViewPort);
	rp = &(edScreen->RastPort);
	if (ffont) SetFont(rp,ffont);
	ffont = rp->Font;

 	w->Screen = edScreen;
	if ((edWindow = (struct Window *)OpenWindow(w))==NULL) {
NEWIN:
		downWindow();
		waite(); 					/* sleep so doesn't hang system! */
		if (lace==2)  { lace = 3; goto NOLACE; }
		if (lace==3)  { lace = 0; goto NOLACE; }
		if (lace==0)  { lace = 1; goto NOLACE; }
		if (lace==1 && vertP>=200) { vertPixels = 100; goto NOLACE; }
 		if (startingUp || !makeTiny()) badQuit();
		return;
	}
	((struct Process *)myTask)->pr_WindowPtr = edWindow;
	setLaceColors();

	ShowTitle(edScreen,0L);
	noDisplay = 0;
	uport = edWindow->UserPort;
    
msgList = &(uport->mp_MsgList);

	oldColors = -1;
	bp = rp->BitMap;
	bytesPerRow = bp->BytesPerRow;
	planeWidth = (long)bytesPerRow << 3L;

	displaySize();
	upChip();
	upWarp();
	showTitle = TRUE;
}

void displaySize()
{
register struct TextFont	*ff;
register short  			*lh;
register short  			j,height,oldmax;
register long               i;

	lh = lineHeight;
	ff = ffont;
	charWidth  = ff->tf_XSize;
	charHeight = height = ff->tf_YSize;
	t1 = 16 * charWidth;
	t2 = 29 * charWidth;
	lh[0] = (height << 1);

	j = (horPixels/charWidth) - 1;
	if (j>=MAXLINECHARS) j = MAXLINECHARS - 1;
	maxLineChars = j;
	if (cram) height--;

	j = maxLines;
	oldmax = j;
	j = ( (vertPixels << (lace >> 1))
		- (lh[0] + ((ff->tf_YSize - ff->tf_Baseline) << 1)) )/height;
	if (j>=MAXLINES) j = MAXLINES - 1;
	if (nSplit==0 || (oldmax && oldmax!=j)) {
		startSplit[0] = 0;
		stopSplit[0] = j + 1;
		curSplit = 0;
		nSplit = 0;
	}
	maxLines = j;
	for (i=1; i<MAXLINES; i++) lh[i] = lh[i-1] + height;
}

void doTiny()
{
	if (tiny) {
		if (gChar==ESC) {
			closeTiny();
			gChar = 0;
			displayFlag = SHOWCURSOR_;
		}
	} else if (toTiny) {
		if (!makeTiny()) makeWindow();
	}
	if (edWindow==NULL) badQuit();
}

makeTiny()
{
register struct Window  *w;
register struct Screen  *s;
register short  		i;

/* ----------------
BUG:  when ue screen and run second UE on top and goto tiny in it, tiny
appears on prev ue screen.  if goto tiny in that ue screen, it closes UE
window, LOSING FILE CHANGES and cannot then close that screen unless reboot!
-------------------- */

	toTiny = 0;
	if (tiny) return(TRUE);
	downWindow();

AGAIN:
	w = (struct Window *)OpenWindow(&TinyWindow);

	if (w==NULL) {
		TinyWindow.TopEdge = TinyWindow.LeftEdge = 0;
		w = (struct Window *)OpenWindow(&TinyWindow);
		if (w==NULL) return(FALSE);
	}
	s = w->WScreen;
	i = (s->WBorTop + s->Font->ta_YSize + 1) << 1;
	if (TinyWindow.Height !=i) {
		TinyWindow.Height = i;
		CloseWindow(w);
		goto AGAIN;
	}
	edWindow = w;
	uport = w->UserPort;
msgList = &(uport->mp_MsgList);
	noDisplay = tiny = 1;
	setTaskPri(tinyPriority);
	return(TRUE);
}

void loopTiny() 	/* NEVER come here unless tiny==1  !!! */
{
register short  	i,j,k;

	j = TinyWindow.TopEdge;
	k = TinyWindow.LeftEdge;
CONT:
	i = 0;
	while (1) {
		if (!busyWork()) {
			if (i == 0) { findMemory(noMemory); i=1; }
			Delay(10L); /* waite(); */
		}
    	if (msgList->lh_Head->ln_Succ) {
			while (nextEvent()) if (gChar==ESC) goto OUT;
		}
		if (FindPort("REXX")) {
			rexxWork();
			if (gChar==ESC) break;
		}
	}
OUT:
	if (j != edWindow->TopEdge || k != edWindow->LeftEdge) Top = Left = 0;
	closeTiny();
	if (tiny) goto CONT;
}

closeTiny()
{
register struct Window *ed;

	if (!tiny) return(TRUE);
	SetTaskPri(myTask,myPriority);
	ed = edWindow;
	collectRaw();
	TinyWindow.TopEdge  = ed->TopEdge;
	TinyWindow.LeftEdge = ed->LeftEdge;

	tiny = toTiny  = 0;
	downWindow();
	upWindow();
	if (edWindow==NULL) {
		findMemory(TRUE);
		upWindow();
		if (edWindow==NULL) return(FALSE);
	}
	displayFlag |= ALLPAGE; 
	if (curBuf) FfullRefresh();
	gChar = 0;
	collectRaw();

	restoreMsg();
	return(TRUE);
}

void setLaceColors()
{
register short i;

	if (vp==NULL) return;
	for (i=0; i<4; i++)  setrgb(i);
}

void setrgb(register short  k)
{
	SetRGB4(vp, (long)k, (long)coloring[0][k],
		(long)coloring[1][k], (long)coloring[2][k]);
}

FgetRGB()
{
register ULONG i;

	if (vp==NULL || tiny) return(FALSE);
	for (i=0; i<4; i++) *(longPtrArgs[i]) = GetRGB4(vp->ColorMap,i);
	return(TRUE);
}

FsetRGB()
{
register short  j;
register long   i;

	if (tiny) return(FALSE);
	for (i=0; i<4; i++) {
		j = (short)*longPtrArgs[i];
		coloring[2][i] = j & 15; j >>= 4;
		coloring[1][i] = j & 15; j >>= 4;
		coloring[0][i] = j & 15;
		setrgb((short)i);
	}
	return(TRUE);
}

/* ------------------ font ----------------------- */

FsetFont()
{
register UCHAR *x;
register USHORT i;

	x = fixString(' ',0,30);
	if (x==NULL) return(FALSE);
	i = (USHORT)*longPtrArgs[1];
	if (i<8 || i>32) return(FALSE);
	fontHeight = i;
	strcpy(fontName,x);
	strncatmax(fontName,".font",30);
	return(TRUE);
}

FgetFont()  /* getFont(name,x,y) */
{
register short  	bufnum;
register UCHAR  	*x,*y;

	*longPtrArgs[1] = charWidth;
	bufnum = 0;
	if (cram) bufnum = 1;
	*longPtrArgs[2] = charHeight - bufnum;
	bufnum = *longPtrArgs[0];
	if (!fixBuf(bufnum)) return(FALSE);
	x = fontName;
	y = buf[bufnum]->NextBlock->Data;
	while (*x)   *(y++) = *(x++);
	*y=EOFILE;
	return(TRUE);
}

/* ================== arp file requester ================== */

FfileRequest()
{
register struct FR_struct *FR;
register UCHAR *ptr;
register short rtn,len,bufnum;
BYTE Filename[80];
BYTE Directory[354];

	rtn = FALSE;
	FR = (struct FR_struct *)safeMem((long)sizeof(struct FR_struct));
	if (FR==NULL) goto RTN2;
	if (ArpBase==0L) {
		ArpBase   = (long)OpenLibrary("arp.library",0L);
		if (ArpBase==0L) goto RTN;
	}

	*Directory = 0x00;
	*Filename = 0x00;
	ptr = fixString(31,0,127); /* directory */
	if (ptr && *ptr) strcpy(Directory,ptr);

	ptr = fixString(31,1,40);
	if (ptr && *ptr) FR->FR_Hail = (APTR)ptr;
	FR->FR_Flags = (short)*longPtrArgs[2];

	FR->FR_Ddef = (APTR)Filename;
	FR->FR_Ddir = (APTR)Directory;
	FR->FR_Wind = (APTR)edWindow;

	if (!FileRequest(FR)) goto RTN;

	bufnum = *longPtrArgs[0];
	if (!fixBuf(bufnum)) goto RTN;  		/* won't allow curfile */
	ptr = buf[bufnum]->NextBlock->Data;

	Directory[DATASIZE - 66] = 0x00;				/* so not too long */
	strcpy(ptr,Directory);
	len = (short)strlen(ptr);

	if (len==0 && *Filename==0x00) strcpy(ptr,"*");
	if (len && ptr[len-1]!=':' && ptr[len-1]!='/')    strcat(ptr,"/");

	len = (short)strlen(ptr);
	Filename[60] = 0x00;
	if (*Filename) { ptr[len] = eol; rtn = TRUE;  strcat(ptr,Filename); }
	strcat(ptr,"\x03"); 						/* EOFILE marker */

RTN:
	FreeMem(FR,(long)sizeof(struct FR_struct));

RTN2:
	unsaveFlags();
	return(rtn);
}

/* ===================== ARP GLUE =========== */

#asm
		INCLUDE 'libraries/arpbase.i'

		XREF	_ArpBase

		XDEF	_FileRequest
_FileRequest:
		move.w    #_LVOFileRequest,d0

		movea.l  4(sp),a0

		move.l   a6,-(sp)
		movea.l  _ArpBase,a6
		jsr 0(a6,d0.w)
		movea.l  (sp)+,a6
		rts

#endasm

/* === end arp req ===========*/

#ifndef USEC
#asm

	XREF	_autoBackup
	XREF	_autoIndent
	XREF	_buffer
	XREF	_clearMsg
	XREF	_doPrinting
	XREF	_doSaving
	XREF	_downWindow
	XREF	_edWindow
	XREF	_FreeMem
	XREF	_FfullRefresh
	XREF	_globalFlags
	XREF	_mapChars
	XREF	_ModifyIDCMP
	XREF	_mouseDown
	XREF	_overstrike
	XREF	_prints
	XREF	_reportMouse
	XREF	_rightJustify
	XREF	_saves
	XREF	_setTitle
	XREF	_showTitle
	XREF	_soakInputs
	XREF	_tiny
	XREF	_trapMenus
	XREF	_trueTabs
	XREF	_uport
	xref	_userLocalB
	xref	_userLocalA
	XREF	_upWindow
	XREF	_wordWrap
	XREF	_collectRaw

	xdef	_nullify
_nullify:
	move.l	4(sp),a0
	move.l	8(sp),d0		;while(amt-->0)*(x++)=0
	moveq	#0,d1
dbr:
	move.b  d1,(a0)+
	dbra	d0,dbr
	rts

	xdef	_toLower
_toLower:
	move.l	4(sp),a0	;while(*xx){
	moveq	#0,d0
U9:
	move.b  (a0),d0
;	tst.b	d0
	beq	U10 	;if(*xx<='Z'&&*xx>='A')*xx|=32
	cmp.b	#90,d0
	bhi	U11
	cmp.b	#65,d0
	bcs	U11
	bset.b	#5,(a0) 	;xx++
U11:
	addq.w  #1,a0
	bra	U9
U10:
	rts

	xdef	_setGlobals
_setGlobals:
							;gflags = 0
	moveq	#0,d1	; if(autoBackup)gflags|=AUTOBACKUP
	tst.l	_autoBackup
	beq	SG10001
	bset.l	#3,d1			;(wordWrap)gflags|=WORDWRAP
SG10001:
	tst.l	_wordWrap
	beq	SG10002
	bset.l	#5,d1			;(rightJustify)gflags|=RIGHTJUSTIFY
SG10002:
	tst.l	_rightJustify
	beq	SG10003
	bset.l	#6,d1			;(overstrike)gflags|=OVERSTRIKE
SG10003:
	tst.l	_overstrike
	beq	SG10004
	bset.l	#2,d1			;(autoIndent)gflags|=AUTOINDENT
SG10004:
	tst.l	_autoIndent
	beq	SG10005
	bset.l	#1,d1			;(;mapChars)gflags|=MAPCHARS
SG10005:
	tst.l	_mapChars
	beq	SG10006
	bset.l	#7,d1			;(trueTabs)gflags|=TRUETABS
SG10006:
	tst.l	_trueTabs
	beq	SG10007
	bset.l	#0,d1			;(userLocalA)gflags|=USERLOCALA
SG10007:
	tst.l	_userLocalA
	beq	SG10008
	bset.l	#9,d1			;(userLocalB)gflags|=USERLOCALB
SG10008:
	tst.l	_userLocalB
	beq	SG10009
	bset.l	#10,d1			;globalFlags=gflags
SG10009:
	move.l	d1,_globalFlags			
SG2:
	rts			

	xdef	_makeWindow
_makeWindow:
	jsr	_downWindow
	jsr	_upWindow
	jsr	_FfullRefresh
	jsr _clearMsg
	jsr _collectRaw 		;;; _soakInputs
XYZ0:
	rts

	xdef	_freeCompileBuf
_freeCompileBuf:
	tst.l	_buffer	;if(buffer!=NULL)FreeMem(buffer,(long)MAXMACROSIZE+4100L
	beq	U29
	pea	24580
	move.l	_buffer,-(sp)
	jsr	_FreeMem	;buffer=NULL
	addq.w	#8,sp
U29:
	clr.l	_buffer
U30:
	rts

	xdef	_busyWork
_busyWork:
	move.l	d4,-(sp)	;Rshortrtnrtn=prints|saves
	moveq	#0,d4
	move.w	_prints,d4
	or.w	_saves,d4	;if(rtn){
;	tst.w	d4
	beq	U44	;doPrinting()
	jsr	_doPrinting	;doSaving()
	jsr	_doSaving	;}return(rtn)
U44:
	tst.w	_showTitle
	beq U444
	jsr _setTitle
U444:
	move.w	d4,d0
	move.l	(sp)+,d4
	rts
#endasm
#endif

