TITLE "MP3 -- by Douglas Jones, optimized version" USE "hawk.h" USE "stdio.h" EXT MP3DATA INT MAIN S MAIN ; AR for PUTMSG, the recursive routine to traverse the message tree ;RETAD = 0 SVR8 = 4 ; used to save R8 so it can hold n ARSIZE = 8 PUTMSG: ; expects R3 = n, a pointer to a tree node ; returns nothing ; uses R8 = n, while stepping through the tree node ; R3 = p, a pointer extracted from the tree node STORES R1,R2 STORE R8,R2,SVR8 ADDI R2,R2,ARSIZE ; -- end of receiving sequence MOVE R8,R3 ; -- move n into place PUTLOOP: ; for (;;) { LOADSCC R3,R8 ; int p = *n BZS PUTQUIT ; if (p == NULL) break BITTST R3,0 BBS ODDADDR ; if ((p & 1) == 0) { -- p is even JSR R1,PUTMSG ; putmsg( p ) -- traverse a subtree BR ENDIF ODDADDR: ; } else { -- p is odd LIL R1,PUTSTR JSRS R1,R1 ; putstr( p ) -- output a leaf string ENDIF: ; } ADDSI R8,4 ; n++ BR PUTLOOP PUTQUIT: ; } ADDI R2,R2,-ARSIZE ; -- start of return sequence LOAD R8,R2,SVR8 LOADS PC,R2 ; return ; AR for MAIN ;RETAD = 0 ARSIZE = 4 MAIN: STORES R1,R2 ADDSI R2,4 ; -- end of receiving sequence LIL R3,MP3DATA JSR R1,PUTMSG ; putmsg( mp3data ) ADDSI R2,-4 ; -- start of return sequence LOADS PC,R2 END