$MACRO ALL VAR JSR PC,$$RES RES.STR #@{1} @#$$RES1 $ENDM ; - - - - - - - - - - - - - - - - - - - - - - - $MACRO FRE MOV (SP),R0 ADD R0,SP $ENDM ; - - - - - - - - - - - - - - - - - - - - - - - $MACRO RES.STR ; NAME,SIZE SUB #@2,SP SUB #10.,SP MOV #1,-(SP) MOV #@2,-(SP) ADD #8.,(SP) MOV SP,#@1 MOV #@1,-(SP) JSR PC,INI ADD #6.,(SP) JSR PC,$$$STK $ENDM ; - - - - - - - - - - - - - - - - - - - - - - - $MACRO print ** p%%t <#@*(1"Z)> $ENDM ; - - - - - - - - - - - - - - - - - - - - - - - $MACRO p%%t printf "#@1=(%d)(%o)" <#@1> <#@1> $ENDM ; - - - - - - - - - - - - - - - - - - - - - - - $MACRO LEN string ?? 2 mov #@{1},r0 #@2=. tstb (r0)+ bne #@2 sub #@{1},r0 dec r0 $ENDM / program macexp auto i function macexp[fun,s,t,n,l] all r3 add #2,mlsp let @mlsp = &s ;put mac exp record (s,t,n,l) ptr onto stack let r4 = fun - #macent+1 ;printf "loop r4=%d .mfst[r4]=%o .mlst[r4]=%o" r4 .mfst[r4] .mlst[r4] loop for i = .mfst[r4] to .mlst[r4] ;printf "txpnt=%o" .txpnt[] . expnd2[.txpnt[],r3,&s] . state[r3] next i sub #2,mlsp ;pop off mac exp record ret FUNCTION expnd2[s,smp,p] let r4 = s - #12. LET r3 = p LET r0 = 4(r3) - #1 mov 6(r3),r2 IF r2 LT #0 mov #1,r2 dec r0 ELSE clr r2 FI inc r2 . subs[2(r3),r0,#-1,smp,r4,r2] RET .end