// TRN4
GET "TRNHDR"
LET LOAD(X) BE
$(1 IF X=0 DO $( TRANSREPORT(148, CURRENTBRANCH)
LOADZERO()
RETURN $)
$( LET OP = H1!X
SWITCHON OP INTO
$( DEFAULT: TRANSREPORT(147, CURRENTBRANCH)
LOADZERO()
RETURN
CASE S.BYTEAP: OP := S.GETBYTE
CASE S.DIV: CASE S.REM: CASE S.MINUS:
CASE S.LS: CASE S.GR: CASE S.LE: CASE S.GE:
CASE S.LSHIFT: CASE S.RSHIFT:
LOAD(H2!X)
LOAD(H3!X)
OUT1(OP)
SSP := SSP - 1
RETURN
CASE S.VECAP: CASE S.MULT: CASE S.PLUS: CASE S.EQ: CASE S.NE:
CASE S.LOGAND: CASE S.LOGOR: CASE S.EQV: CASE S.NEQV:
$( LET A, B = H2!X, H3!X
IF H1!A=S.NAME LOGOR H1!A=S.NUMBER DO
A, B := H3!X, H2!X
LOAD(A)
LOAD(B)
IF OP=S.VECAP DO $( OUT1(S.PLUS); OP := S.RV $)
OUT1(OP)
SSP := SSP - 1
RETURN $)
CASE S.NEG: CASE S.NOT: CASE S.RV: CASE S.ABS:
LOAD(H2!X)
OUT1(OP)
RETURN
CASE S.TRUE: CASE S.FALSE: CASE S.QUERY:
OUT1(OP)
SSP := SSP + 1
RETURN
CASE S.LV: LOADLV(H2!X)
RETURN
CASE S.NUMBER:
OUT2(S.LN, H2!X)
SSP := SSP + 1
RETURN
CASE S.STRING:
$( LET S = @H2!X
OUT2(S.LSTR, GETBYTE(S, 0))
FOR I = 1 TO GETBYTE(S, 0) DO OUTN1(GETBYTE(S, I))
WRC('*S')
SSP := SSP + 1
RETURN $)
CASE S.NAME:
TRANSNAME(X, S.LP, S.LG, S.LL, S.LN)
SSP := SSP + 1
RETURN
CASE S.VALOF:
$( LET RL = RESULTLABEL
LET A, B = DVECS, DVECE
DECLLABELS(H2!X)
RESULTLABEL := NEXTPARAM()
TRANS(H2!X)
COMPLAB(RESULTLABEL)
OUT2(S.RSTACK, SSP)
SSP := SSP + 1
DVECS, DVECE := A, B
RESULTLABEL := RL
RETURN $)
CASE S.FNAP:
$( LET S = SSP
SSP := SSP + SAVESPACESIZE
OUT2(S.STACK, SSP)
LOADLIST(H3!X)
LOAD(H2!X)
OUT2(S.FNAP, S)
SSP := S + 1
RETURN $)
CASE S.COND:
$( LET L, M = NEXTPARAM(), NEXTPARAM()
LET S = SSP
JUMPCOND(H2!X, FALSE, M)
LOAD(H3!X)
COMPJUMP(L)
SSP := S; OUT2(S.STACK, SSP)
COMPLAB(M)
LOAD(H4!X)
COMPLAB(L)
RETURN $)
CASE S.TABLE:
$( LET M = NEXTPARAM()
COMPDATALAB(M)
X := H2!X
WHILE H1!X=S.COMMA DO
$( OUT2(S.ITEMN, EVALCONST(H2!X))
X := H3!X $)
OUT2(S.ITEMN, EVALCONST(X))
OUT2P(S.LLL, M)
SSP := SSP + 1
RETURN $) $)1
AND LOADLV(X) BE
$(1 IF X=0 GOTO ERR
SWITCHON H1!X INTO
$( DEFAULT:
ERR: TRANSREPORT(113, CURRENTBRANCH)
LOADZERO()
RETURN
CASE S.NAME:
TRANSNAME(X, S.LLP, S.LLG, S.LLL, 0)
SSP := SSP + 1
RETURN
CASE S.RV:
LOAD(H2!X)
RETURN
CASE S.VECAP:
$( LET A, B = H2!X, H3!X
IF H1!A=S.NAME DO A, B := H3!X, H2!X
LOAD(A)
LOAD(B)
OUT1(S.PLUS)
SSP := SSP - 1
RETURN $) $)1
AND LOADZERO() BE $( OUT2(S.LN, 0)
SSP := SSP + 1 $)
AND LOADLIST(X) BE UNLESS X=0 DO
$( UNLESS H1!X=S.COMMA DO $( LOAD(X); RETURN $)
LOADLIST(H2!X)
LOADLIST(H3!X) $)
.