;; warning:  In the C modules must call FrunKey(D0) with tnum arg in register
;; D0
    XREF    _msgList
    XREF	_args
	XREF	_buf
	XREF	_bufPtrArgs
	XREF	_cmdTable
	XREF	_curBuf
    XREF    _doTiny
	XREF	_findMemory
	XREF	_Fnull
	XREF	_GetMsg
	XREF	_killMenus
	XREF	_longArgs
	XREF	_longPtrArgs
	XREF	_macroFunc
	XREF	_macroptr
	XREF	_n
	XREF	_noMemory
	XREF	_numArg
	XREF	_numArgs
	XREF	_ptrArgs
	XREF	_stackDepth
	XREF	_startingUp
	XREF	_stop
	XREF	_stopPause
	XREF	_such
	XREF	_unpackArgs
	XREF	_upMenus
	XREF	_uport
    
							;FrunKey(tnum)
							;register short   tnum;

	dseg
	ds	0
_offset:
	dc.w	0
	cseg            ;FrunKey(Rshorttnum)/*WARNING:NOSTATICSonthese-RECURSIVE!!!!*/{
    
    
    xdef  _FrunKey
_FrunKey:
	movem.l d2-d7/a2/a3/a6,-(sp)
;;	move.w  8(a5),d4		;{
							;register UCHAR 	*sPtr,*macroPtr,funcNum;
							;register short 	rtn,doingIf;
							;struct   IntuiMessage     *msg;
							;UCHAR  	**tPtr;
							;move.w d4,d0	;	tPtr = &cmdTable[tnum];
	lea _macroFunc,a6
    move.w  d0,d4
	lea _numArgs,a0
    move.l  a0,d2
    add.w   d0,d0
    add.w   d0,d0
	lea _cmdTable,a0
	add.w	d0,a0
	move.l  a0,d3
	move.l  (a0),a3 		;	macroPtr  = *tPtr;
	move.l  a3,d0			;	if (macroPtr==NULL) return(FALSE);
	beq RK5
	move.w  _stackDepth,d0
	addq.w  #1,d0
	move.w  d0,_stackDepth
	cmp.w	#10,d0  		;	if (++stackDepth > MAXSTACK) {
	ble RK6
RK7:					;BADRTN:
    jsr _Fnull  			;	   rtn = Fnull();
	move.w  d0,d6
	bra RK8 			;	   goto RTNPT;
RK6:					;	}
	moveq	#0,d6			;	rtn = FALSE;
	moveq	#0,d7			;	doingIf  = 0;
	move.l  a3,a2			;	sPtr = macroPtr;

    add.w	_offset,a3      ;macroPtr += offset
	clr.w	_offset         ;offset=0

RK9:					;CONT:
	tst.w	_stopPause  	;	if (stopPause) goto BADRTN;
	bne RK7
    move.l  _msgList,a0
    move.l  (a0),a0
    tst.l   (a0)
    beq RK10
    jsr _stop				;	if (stop() || noMemory) goto BADRTN
	tst.w	d0
	bne RK7
	tst.w	_noMemory
	bne RK7
    jsr _doTiny
RK11:
RK10:					;	}
	move.l  d3,a0		    ;	if (*tPtr!=sPtr) goto BADRTN;
	cmp.l	(a0),a2
	bne RK7
    moveq   #0,d5
	move.b  (a3)+,d5		;	funcNum = *(macroPtr++);
	cmp.b	#12,d5  		;	if (funcNum<=returnFalse_) goto SPECFCT;
	bls RK15

    cmp.b	#39,d5          ;if (funcNum<=newFile) goto NORMALFCT
	bls  RK1313

RK10008:
							;	/* ******************* ARGD *************** */
    move.l  d2,a0           ; numArg = numArgs[funcNum];
	move.b  (a0,d5.w),d1	;;; move.b  (a0,d0.w),_numArg
                            ;;; move.l  a3,_macroptr
	jsr _unpackArgs 		;	unpackArgs();
                            ;;; move.l  _macroptr,a3
	move.l  a3,d0			;	if (macroPtr==NULL) goto BADRTN;
	beq RK7


	cmp.b	#45,d5  		;	if (funcNum==runKey_) goto RUNKEY;
    beq RK13
RK1313:                     ; NORMALFCT
    add.w   d5,d5			;	rtn = (*macroFunc[funcNum])();
    add.w   d5,d5
;;;	lea _macroFunc,a0
	move.l  (a6,d5.w),a1
	jsr (a1)
	move.w  d0,d6
	bra RK9 			;	goto CONT;

RK13:
				;/* ============== THIS IS RUNKEY =============== */
;;; NEW NEW - moved test here for startup & runkey
	cmp.w	#1148,d4		;	if (tnum==startupMacro && !startingUp) goto CONT;
	bne RK1414
	tst.w	_startingUp
    beq RK9

RK1414:
	move.l  _longPtrArgs,a0 ;	rtn = (short) *longPtrArgs[0];
	move.w  2(a0),d6
	cmp.w	#1148,d6		;if (rtn==startupMacro)
	bne RK14			;		{ killMenus(); upMenus(); rtn = TRUE; go
	jsr _killMenus
	moveq	#1,d6
	bra RK9
RK14:
	cmp.w	#1200,d6		;if (rtn>=MAXMACROS || rtn<0) goto BADRTN;
	bge RK7
	move.l  d6,d0	        ;	rtn 	   = FrunKey(rtn);
	blt RK7
	jsr _FrunKey
	move.w  d0,d6
	bra RK9			    ;	goto CONT;

                            ;SPECFCT: ;	switch(funcNum) {
RK17:					;	case 0x00:  	 goto RTNPT;
	bra RK8
;;;RK18:					;	case abort_:		 goto BADRTN;
;;;	bra RK7
RK19:					;	case not_:  doingIf ^= (doingIf & 2); goto
	moveq	#1,d7			; not_ is really IFNOT_
	bra RK9 			; CONT;
RK20:					;	case if_:  doingIf = 3; goto CONT;
	moveq  #3,d7
	bra RK9
RK21:					;	case goto_: if (doingIf & 1) {
    btst.l  #0,d7
;;;	move.w  d7,d0
;;;	and.w	#1,d0
	beq RK22
	and.w	#2,d7			;	doingIf &= 2;
	move.w  d7,d0			;	if ((doingIf >> 1)!=rtn) {
	asr.w	#1,d0
	cmp.w	d6,d0
	beq RK23
	addq.w  #2,a3			;	macroPtr += 2;
	bra RK9 			;	goto CONT;
RK23:					;	}	}
RK22:
	move.b  (a3),d0 	    ;macroPtr	+= ((macroPtr[0] << 8) + macroPtr[0]);
	asl.w	#8,d0
	move.b  1(a3),d0
	add.w	d0,a3
	bra RK9 			;	goto CONT;
RK24:					;	case nothing_:   rtn = TRUE; goto CONT;
	moveq	#1,d6
	bra RK9
;;;RK25:					;	case return_:	 goto RTNPT;
;;;	bra RK8
RK26:					;	case returnTrue_:	rtn = TRUE; goto RTNPT;
	moveq	#1,d6
	bra RK8
RK27:					;	case returnFalse_:  rtn = FALSE; goto RTNPT;
	moveq	#0,d6
	bra RK8
RK2727:                     ; handle gosub
    moveq	#0,d0
	move.b  (a3),d0         ;offset=(short)((USHORT)(macroPtr[0]<<8)|macroPtr[1])
	asl.w	#8,d0
    move.b  1(a3),d0
    move.l  a3,d1
    sub.l   a2,d1
    add.l   d1,d0
    move.w	d0,_offset
    move.w  d4,d0
    jsr _FrunKey            ; rtn = FrunKey(tnum)
    move.w	d0,d6
;;;	clr.w	_offset         ;offset=0
    addq.w  #2,a3
	bra	RK9                 ;gotoCONT
RK28:					;	}
	dc.w	RK17-RK29-2             ;0x00
	dc.w	RK7-RK29-2      ; rk18  ;abort
	dc.w	RK19-RK29-2             ;not (used for ifnot)
	dc.w	RK2727-RK29-2   ;rk16   ;do  (used for gosub)
	dc.w	RK7-RK29-2      ;rk16   ;while
	dc.w	RK20-RK29-2             ;if
	dc.w	RK7-RK29-2      ;rk16   ;else
	dc.w	RK21-RK29-2             ;goto
	dc.w	RK7-RK29-2      ;rk16   ;label
	dc.w	RK24-RK29-2             ;nothing
	dc.w	RK8-RK29-2      ;rk25   ;return
	dc.w	RK26-RK29-2             ;returnTrue
	dc.w	RK27-RK29-2             ;returnFalse
RK15:
;;;	cmp.w	#13,d5
;;;	bcc RK7
	add.w	d5,d5
	move.w  RK28(pc,d5.w),d0
RK29:
	jmp (pc,d0.w)
;;;RK16:
;;;	bra RK7 			;	goto BADRTN;
RK8:					;RTNPT:
	subq.w  #1,_stackDepth  ;	stackDepth--;
	move.w  d6,d0			;	return(rtn);
RK5:
	movem.l (sp)+,d2-d7/a2/a3/a6
	rts


	xdef  _unpackArgs
_unpackArgs:
	movem.l d2-d7/a2/a6,-(sp)  ;WARNING:  a3 & d1 are SHARED here & in FrunKey
							;register UCHAR 			 *x;
							;register struct CB 		 **bptr;
							;register UCHAR 			 i,numa,j,k;
							;long		**ppLongArg,*pLongArg;
							;UCHAR  	*pArg;
							;	x	= macroptr; ;;; move.l d0,a3 ;;; move.l _macroptr,a3
	move.b  d1,d5	        ;;;    move.b  _numArg,d5  ;numa	  = numArg;
	lea _args,a6			;	pArg	  = args;
	lea _longPtrArgs,a0		;	ppLongArg = longPtrArgs;
	move.l  a0,d2
	lea _longArgs,a0		;	pLongArg  = longArgs;
	move.l  a0,d3
	lea _bufPtrArgs,a0		;	bptr	  = bufPtrArgs;
	move.l  a0,a2
	moveq	#0,d4			;	i = 0;
	moveq	#0,d7
UP32:					;TOPCONT:
	move.l  d2,a0			;	*ppLongArg = pLongArg;
	move.l  d3,(a0)
	moveq	#0,d6			;	j = *(x++);
	move.b  (a3)+,d6
	move.b  d6,(a6)			;	*pArg = j;
	move.l  d6,d0			;	switch ((short)j) {
    bra UP90
UP39:					;	 case 0:
	sub.l	a3,a3			;BADRTN:	 x = NULL;
	bra UP33			;			 goto NOARGS; break;
UP38:					;	 case buf_:
	move.b  (a3)+,d6		;			 j = *(x++);
	cmp.b	#100,d6			;			 if (j>=ALLBUFS) goto BADRTN;
	bcc UP39
	move.l  d3,a0			;			 *pLongArg = j;
	move.l  d6,(a0)
	move.w  d6,d0			;			 *bptr = buf[j];
    add.w   d0,d0
    add.w   d0,d0
	lea _buf,a0
	move.l  (a0,d0.w),(a2)
	bra UP37			;			 goto CONT; break;
UP48:					;	case bufN_:
	move.b  #1,(a6)		;			 *pArg = buf_;
	move.b  (a3)+,d7		;			 k = *(x++);
	move.b  (a3)+,d6		;			 j = *(x++);
	cmp.b	#100,d6			;			 if (j>=ALLBUFS) goto BADRTN;
	bcc UP39
	cmp.b	#5,d7			;			 if (k==nN_) {
	bne UP49
	move.w  d6,d0			;				 j = n[j];
    add.w   d0,d0
    add.w   d0,d0
	lea _n,a0
	move.b  3(a0,d0.w),d6
	cmp.b	#100,d6			;				 if (j>=ALLBUFS) goto BADRTN;
	bcc UP39			;			 }
UP49:
	move.w  d6,d0			;			 k = n[j];
    add.w   d0,d0
    add.w   d0,d0
	lea _n,a0
	move.b  3(a0,d0.w),d7
	cmp.b	#100,d7			;			 if (k>=ALLBUFS) goto BADRTN;
	bcc UP39
	move.l  d3,a0			;			 *pLongArg = (long)k;
	move.l  d7,(a0)
	move.w  d7,d0			;			 *bptr = buf[k];
    add.w   d0,d0
    add.w   d0,d0
	lea _buf,a0
	move.l  (a0,d0.w),(a2)
	bra UP37			;			 goto CONT; break;
UP36:					;	case currentFile_:
	move.l  _curBuf,a0		;			 j = curBuf->BufNum;
	move.b  167(a0),d6
	move.l  d3,a0			;			 *pLongArg = j;
	move.l  d6,(a0)
	move.w  d6,d0			;			 *bptr = buf[j];
    add.w   d0,d0
    add.w   d0,d0
	lea _buf,a0
	move.l  (a0,d0.w),(a2)
	move.b  #1,(a6)		;			 *pArg = buf_;
	bra UP37			;			 goto CONT; break;
UP40:					;	case n_:
	move.b  (a3)+,d6		;	j = *(x++);
UP41:					;HANDLEN:	 if (j>=ALLBUFS) goto BADRTN;
	cmp.b	#100,d6
	bcc UP39
	move.l  d2,a0			;	*ppLongArg = &n[j];
	move.w  d6,d0
    add.w   d0,d0
    add.w   d0,d0
	lea _n,a1
    add.w   d0,a1
	move.l  a1,(a0)
	bra UP37			;			 goto CONT; break;
UP47:					;	case nN_:
	move.b  #4,(a6)		;			 *pArg = n_;
	move.b  (a3)+,d6		;			 j = *(x++);
	cmp.b	#100,d6		;			 if (j>=ALLBUFS)  goto BADRTN;
	bcc UP39
	move.w  d6,d0			;			 j = n[j];
    add.w   d0,d0
    add.w   d0,d0
	lea _n,a0
	move.b  3(a0,d0.w),d6
	bra UP41			;			 goto HANDLEN;break;
UP44:					;	case literal_:
	moveq	#0,d0			;			 ptrArgs[i] = x;
	move.b  d4,d0
    add.w   d0,d0
    add.w   d0,d0
	lea _ptrArgs,a0
	move.l  a3,(a0,d0.w)
	move.l  d3,a0			;			 *pLongArg = 0L;
	clr.l	(a0)
    moveq   #0,d0
	move.l  d3,a1
UP45:
    move.b  (a3)+,d0		    ;	while (*x) *pLongArg = ((*pLongArg) << 8L) | *(x++)
	beq UP37			;			 goto CONT;break;
	move.l  (a1),d1
	asl.l	#8,d1
    move.b  d0,d1
	move.l  d1,(a1)
	bra UP45
UP43:					;	case keyArg_:
    moveq   #0,d0
    move.b  (a3)+,d0    ;	*pLongArg = (long)((*x << 8L) | (*(x+1)));
	asl.w	#8,d0
	move.b  (a3)+,d0
	move.l  d3,a0
	move.l  d0,(a0)
	bra UP37			;			 goto CONT; break;
UP42A:                  ;   case byteArg_:
    moveq   #0,d0
    move.b  (a3)+,d0    ; *pLongArg = (long)*(x++);
    ext.w   d0
    ext.l   d0
    move.l  d3,a0
    move.l  d0,(a0)
    bra UP37            ; goto CONT;
UP42:					;	 case REALARG_:
	moveq	#0,d0	    ;	*pLongArg = (long)((*x << 24L) | (*(x+1) << 16L)
	move.b  (a3)+,d0	;	| (*(x+2) << 8L) | (*(x+3)));
    asl.w   #8,d0
	move.b  (a3)+,d0
    swap    d0
	move.b  (a3)+,d1
    asl.w   #8,d1
	move.b  (a3)+,d1
    move.w  d1,d0
    move.l  d3,a0
	move.l  d0,(a0)
	bra UP37			;			 goto CONT; break;
UP51:					;	 default:
	cmp.b	#15,d6			;	if (j >= pmEsc_ && j <= macroNum_)
	bcs UP37			;	*ppLongArg = (long *)such[j - pmEsc_];
	cmp.b	#76,d6
	bhi UP37
	move.w  d6,d0
	subq.w  #8,d0
	subq.w  #7,d0
    add.w   d0,d0
    add.w   d0,d0
	lea _such,a0
	move.l  d2,a1
	move.l  (a0,d0.w),(a1)
	bra UP37			;			 break;
UP91:
	dc.w	UP39-UP99-2     ; case 0
	dc.w	UP38-UP99-2     ;buf_
	dc.w	UP48-UP99-2     ;bufN_
	dc.w	UP36-UP99-2     ;currentFile_
	dc.w	UP40-UP99-2     ;n_
	dc.w	UP47-UP99-2     ;nN_
	dc.w	UP39-UP99-2     ;number_    ;; never get this BADRTN
	dc.w	UP44-UP99-2     ;literal_
	dc.w	UP43-UP99-2     ;keyArg_
	dc.w	UP42-UP99-2     ;REALARG_
    dc.w    UP42A-UP99-2    ;byteArg_
UP90:
    cmp.w   #11,d0
    bcc UP51
	add.w	d0,d0
	move.w  UP91(pc,d0.w),d0
UP99:
	jmp (pc,d0.w)
UP98:
	bra UP39 			;	goto BADRTN;
UP37:					;CONT:
	addq.b  #1,d4			;	i++;
	cmp.b	d5,d4			;	if (i>=numa) goto NOARGS;
    beq UP33
	addq.w  #1,a6			;	pArg++;
	addq.w  #4,d2			;	ppLongArg++;
	addq.w  #4,d3			;	pLongArg++;
	addq.w  #4,a2			;	bptr++;
    bra UP32			;	goto TOPCONT;
UP33:					;NOARGS:
UP55:					;macroptr = x; }
	movem.l (sp)+,d2-d7/a2/a6
	rts

