.TITLE SIZE ; JEFFREY KODOSKY ARL NOV75 ; ; SUBR ; ENTRY: 1 ARG ; EXIT: 1 ARG ; ERRORS: G2, RECURSION LIMIT EXCEEDED ; CALLS: I2ATM ; R2,R3 PRESERVED .GLOBL SIZE,ZSIZE,FSTART,SSTART,QI2ATM,QG2ERR SIZE: CLR -(SP) ;DEPTH COUNTER MOV (R5)+,R0 SIZE01: BIC #3,R0 BEQ SIZE03 ;DON'T MARK NIL BIT #1,@R0 ;IS CELL ALREADY MARKED? BNE SIZE03 ;JUMP IF SO BIT #2,@R0 ;IS IT A NUMBER? BNE SIZE02 ;JUMP IF SO BIT @PC,2(R0) ;IS IT A STRING ATOM? BNE SIZE02 ;JUMP IF SO BIT #1,2(R0);IS IT A LITATM? BNE SIZE03 ;JUMP IF SO (DON'T MARK IT) INC @SP ;ITS A LIST: SAVE CDR MOV 2(R0),-(R5) CMP R4,R5 BHIS SIZE20 ;JUMP IF NO STACK SPACE LEFT SIZE02: INC @R0 ;MARK CELL MOV @R0,R0 ;LOOP BACK TO MARK CAR BR SIZE01 SIZE03: DEC @SP BMI SIZE04 MOV (R5)+,R0;LOOP BACK WITH A CDR BR SIZE01 SIZE04: TST (SP)+ ;POP DEPTH COUNTER CLR R1 ;COUNT AND UNMARK CELLS SIZE05: MOV FSTART,R0 SIZE09: ASR @R0 ;IS CELL MARKED? BCC SIZE10 ;JUMP IF NOT INC R1 ;OTHERWISE COUNT IT SIZE10: ASL @R0 ;AND UNMARK IT CMP (R0)+,(R0)+ ;BUMP TO NEXT CELL CMP R0,SSTART BLO SIZE09 MOV R1,-(SP);END OF FREE SPACE: MAKE AN INTEGER ATOM BPL .+4 ;IF<0 THEN MUST HAVE RUN OUT OF ROOM QG2ERR QI2ATM .WORD 0 SIZE20: ASL @SP ;FLUSH STACK ADD (SP)+,R5 MOV #100000,R1 ;MAKE A NEGATIVE DEFINITE COUNTER BR SIZE05 ;JUMP BACK TO UNMARK EVERYTHING AND EXIT ZSIZE=.-SIZE .END