home *** CD-ROM | disk | FTP | other *** search
-
- *LET MACRO -- INTEGER COMPUTATIONS
- * LET LET-EXPR
- * LET-EXPR:=A|A,OP,B
- * A:=(LET-EXPR)|CONSTANT|SYMBOLIC RAM LOC LABEL|EMPTY
- * IF AA IS EMPTY, MEANS VALUE IN THE AC
- * (CONTINUATION FROM PREVIOUS LET)
- * B:=(LET-EXPR)|CONSTANT|SYMBOLIC RAM LOC LABEL
- * OP:=+|-|/|*|&|##|--|//|LT|GT|EQ|LE|GE|NE|^
- * ADD -> + LESS THAN ------------> LT
- * SUB -> - GREATER THAN ---------> GT
- * DIV -> / EQUAL ----------------> EQ
- * MPY -> * LESS THAN OR EQUAL ---> LE
- * AND -> & GREATER THAN OR EQUAL-> GE
- * XOR -> ## NOT EQUAL ------------> NE
- * OR -> ++
- * MOD -> // SHIFT -> ^
-
- COPY MACROS.LCAC
-
- LET $MACRO A,OP,B
- $VAR T,S,SF,ST,DB,NS,SZ
- $ASG '$$STSZ' TO SZ.S
- $ASG '$$STAR' TO NS.S
- $ASG '^' TO SF.S
- $IF A.L#=0
- $IF A.A&$POPL
- LET :A:
- $ELSE
- $IF A.SA&$UNDF
- $IF OP.SV=SF.SV
- LCAC :A:,:B:
- $ELSE
- LCAC :A:
- $ENDIF
- $ELSE
- $IF OP.SV=SF.SV
- LAC :A:,:B:
- $ELSE
- LAC :A:,0
- $ENDIF
- $ENDIF
- $ENDIF
- $ENDIF
- $IF (OP.L#=0)&(OP.SV#=SF.SV)
- $ASG '$$STSL' TO ST.S
- $ASG 1 TO S.V
- $ASG 0 TO DB.V
- $ASG '+' TO T.S
- $IF OP.SV=T.SV
- $ASG 1 TO DB.V
- $ENDIF
- $ASG '-' TO T.S
- $IF OP.SV=T.SV
- $ASG 1 TO DB.V
- $ENDIF
- $ASG '/' TO T.S
- $IF OP.SV=T.SV
- $ASG 1 TO DB.V
- $ENDIF
- $ASG '//' TO T.S
- $IF OP.SV=T.SV
- $ASG 1 TO DB.V
- $ENDIF
- $IF B.A&$POPL
- $IF ST.SV=0
- $IF NS.SV<0
- LARK AR1,LETST$ LOAD STACK POINTR
- LARP AR1
- $ENDIF
- $ENDIF
- $ASG ST.SV+1 TO ST.SV
- MAR *+
- $IF DB.V
- SACH *+,0
- $ASG ST.SV+1 TO ST.SV
- $ENDIF
- SACL *,0
- $IF SZ.SV<ST.SV
- ERROR ***LETSET stack size of :ST.SV: is req'd***
- $ENDIF
- LET :B:
- $ASG ST.SV-1 TO ST.SV
- $IF DB.V
- $ASG ST.SV-1 TO ST.SV
- $ELSE
- $IF B.SA&$UNDF
- $IF ST.SV=0
- $IF NS.SV<0
- LARK AR1,LETST$ LOAD STACK POINTR
- LARP AR1
- $ENDIF
- $ENDIF
- MAR *+
- $IF DB.V
- SACH *+,0
- SACL *,0
- $IF SZ.SV<2
- ERROR ***LETSET stack size of 2 is req'd***
- $ENDIF
- $ELSE
- SACL *,0
- $IF SZ.SV<1
- ERROR ***LETSET stack size of 1 is req'd***
- $ENDIF
- $ENDIF
- LCAC :B:
- $ELSE
- $ASG 0 TO S.V LITRAL SECOND OPERND
- $ASG '+' TO T.S
- $IF OP.SV=T.SV
- ADD :B:,0 +
- $ENDIF
- $ASG '-' TO T.S
- $IF OP.SV=T.SV
- SUB :B:,0 -
- $ENDIF
- $ASG '*' TO T.S
- $IF OP.SV=T.SV
- SACL XR0,0 SAVE AC
- LT XR0 LOAD T
- MPY :B: *
- PAC TO AC
- $ENDIF
- $ASG '/' TO T.S
- $IF OP.SV=T.SV
- SACH DDV$0+0,0 SAVE AC HIGH
- SACL DDV$0+1,0 SAVE AC LOW
- LAC :B:,0 LOAD :B:
- SACL DDV$1,0 SAVE :B:
- CALL DDV$ DIVIDE
- $IF NS.SV=0
- LARP AR0
- $ENDIF
- LAC DDV$2,0 LOAD QUOT
- REF DDV$,DDV$0,DDV$1,DDV$2,DDV$3
- $ENDIF
- $ASG '//' TO T.S
- $IF OP.SV=T.SV
- SACH DDV$0+0,0 SAVE AC HIGH
- SACL DDV$0+1,0 SAVE AC LOW
- LAC :B:,0 LOAD :B:
- SACL DDV$1,0 SAVE :B:
- CALL DDV$ DIVIDE
- $IF NS.SV=0
- LARP AR0
- $ENDIF
- LAC DDV$3,0 LOAD REM
- REF DDV$,DDV$0,DDV$1,DDV$2,DDV$3
- $ENDIF
- $ASG '&' TO T.S
- $IF OP.SV=T.SV
- AND :B: AND
- $ENDIF
- $ASG '##' TO T.S
- $IF OP.SV=T.SV
- XOR :B: XOR
- $ENDIF
- $ASG '++' TO T.S
- $IF OP.SV=T.SV
- OR :B: OR
- $ENDIF
- $ENDIF
- $ENDIF
- $IF S.V STACKD 1ST OPERND
- $ASG '+' TO T.S
- $IF OP.SV=T.SV
- ADDS *-
- ADDH *- +
- $ENDIF
- $ASG '-' TO T.S
- $IF OP.SV=T.SV
- SACL XR0,0 SAVE SECOND
- SACH XR1,0
- ZALS *- RELOAD FIRST
- ADDH *-
- SUBS XR0 1ST-2ND
- SUBH XR1
- $ENDIF
- $ASG '/' TO T.S
- $IF OP.SV=T.SV
- SACL DDV$1,0 SAVE 2ND
- LAC *-,0 LOAD
- SACL DDV$0+1,0 SAVE LOW
- LAC *-,0 LOAD
- SACL DDV$0+0,0 SAVE HIGH
- CALL DDV$ DIVIDE
- $IF NS.SV=0
- LARP AR0
- $ENDIF
- LAC DDV$2,0 LOAD QUOT
- REF DDV$,DDV$0,DDV$1,DDV$2,DDV$3
- $ENDIF
- $ASG '//' TO T.S
- $IF OP.SV=T.SV
- SACL DDV$1,0 SAVE 2ND
- LAC *-,0 LOAD
- SACL DDV$0+1,0 SAVE LOW
- LAC *-,0 LOAD
- SACH DDV$0+0,0 SAVE HIGH
- CALL DDV$ DIVIDE
- $IF NS.SV=0
- LARP AR0
- $ENDIF
- LAC DDV$3,0 LOAD REM
- REF DDV$,DDV$0,DDV$1,DDV$2,DDV$3
- $ENDIF
- $ASG '*' TO T.S
- $IF OP.SV=T.SV
- SACL XR0,0 GET 2ND
- LT XR0 TO T REG
- MPY *- MPY BY STACK
- PAC TO AC
- $ENDIF
- $ASG '&' TO T.S
- $IF OP.SV=T.SV
- AND *- AND
- $ENDIF
- $ASG '##' TO T.S
- $IF OP.SV=T.SV
- XOR *- XOR
- $ENDIF
- $ASG '++' TO T.S
- $IF OP.SV=T.SV
- OR *- OR
- $ENDIF
- $ENDIF
- $ENDIF
- $END