% Author: Yuval Yarom % Program T from Section 2.3.1 % 2002-06-28 02:24 % ---------------- VERSION 1 ---------------------- MAX IS #100 LOC Data_Segment STACK OCTA LOC @+MAX HEAD OCTA max GREG MAX stack GREG STACK head GREG HEAD p IS $0 s IS $1 arg IS $3 t IS $255 LLINK IS 0 RLINK IS 8 DATA IS 16 LOC #100 T1 LDO p,head,LLINK 1 T1. Initialize. Set P <- T T2A BZ p,DONE 1 Stop if P == NULL NEG s,0,0 1 T3 CMPU t,s,max n T3. Stack <= P BNN t,OVERFLOW n Has the stack reach capacity? STO p,stack,s n If not, store P in stack ADDU s,s,8 n Increase stack pointer LDO p,p,LLINK n P <- LLINK(P) T2B BNZ p,T3 n To T3 if P != NULL T4 SUBU s,s,8 n T4. P <= Stack. Decrease the stack pointer LDO p,stack,s n And load P from stack T5 SET arg,p n T5. Visit P. Prepare argument PUSHJ arg-1,VISIT n Visit P LDO p,p,RLINK n P <- RLINK(P) T2C BNZ p,T3 n T2. P = NULL ? PBNZ s,T4 a Test if the stack is empty DONE TRAP 0,Halt,0 OverFlowString BYTE "OVERFLOW",#a,0 OVERFLOW LDA t,OverFlowString TRAP 0,Fputs,StdOut TRAP 0,Halt,0 NewLn BYTE #a,0 VISIT LDA t,$0,DATA TRAP 0,Fputs,StdOut LDA t,NewLn TRAP 0,Fputs,StdOut POP 0,0 LOC HEAD OCTA R R OCTA TL,TR ; BYTE "R",0 TL OCTA TLL,TLR ; BYTE "TL",0 TLL OCTA TLLL,0 ; BYTE "TLL",0 TLLL OCTA 0,TLLLR ; BYTE "TLLL",0 TLLLR OCTA 0,0 ; BYTE "TLLLR",0 TLR OCTA TLRL,TLRR ; BYTE "TLR",0 TLRL OCTA 0,0 ; BYTE "TLRL",0 TLRR OCTA 0,0 ; BYTE "TLRR",0 TR OCTA TRL,TRR ; BYTE "TR",0 TRL OCTA 0,0 ; BYTE "TRL",0 TRR OCTA 0,0 ; BYTE "TRR",0 Main IS T1