.TITLE EQN ; JEFFREY KODOSKY ARL NOV75 ; ; SUBR ; ENTRY: 2 ARGS ; ; EXIT: 1 ARG ; ERRORS: NONE ; CALLS: NONE (EQ) ; ATM2N, ATOM TO NUMBER CONVERSION (EQN) ; IR, INTEGER TO REAL CONVERSION (EQN) ; EQ PRESERVES R0,R1,R2,R3 .GLOBL EQ,ZEQ,EQN,ZEQN,.T.,QATM2N,QIR EQ: CMP (R5)+,(R5)+ BNE EQ02 EQ01: MOV .T.,-(R5) JMP @-(R4) EQ02: CLR -(R5) JMP @-(R4) ZEQ=.-EQ ; EQN: CMP (R5)+,(R5)+ ;EQ[;]? BEQ EQ01 BIT #3,@-(R5) ;NUMBERP[]? BNE EQN10 ;JUMP IF SO BIT #3,@-(R5) ;NUMBERP[]? BNE EQ ;YES: RETURN FALSE EVENTUALLY MOV (R5)+,R0;NO: COMPARE TWO STRINGS (OR TWO ATOM MOV (R5)+,R1;PNAMES, E.G. FOR ATMOBL) BIT #3,2(R0);IF ONE ARG IS A LIST RETURN FALSE BEQ EQ02 BIT #3,2(R1) BEQ EQ02 EQN1: MOV @R0,R0 ;GET NEXT CELL OF STRING1 BIC #3,R0 ;REMOVE DATA BIT BEQ EQN01 ;JUMP IF NO MORE CELLS MOV @R1,R1 ;GET NEXT CELL OF STRING2 BIC #3,R1 ;REMOVE DATA BIT BEQ EQ02 ;RETURN FALSE IF STRING2 IS SHORTER CMP 2(R0),2(R1) ;COMPARE DATA BNE EQ02 ;RETURN FALSE IF DIFFERENT BR EQN1 ;IF SAME, LOOP BACK TO CHECK NEXT EQN01: MOV @R1,R1 ;GET NEXT CELL OF STRING2 BIC #3,R1 BEQ EQ01 ;RETURN TRUE IF STRINGS END AT THE BR EQ02 ;SAME TIME, FALSE IF STRING1 SHORTER EQN10: BIT #3,@-(R5) ;NUMBERP[]? BEQ EQ ;NO: RETURN FALSE EVENTUALLY QATM2N ;YES: COMPARE TWO NUMBERS BCS EQN20 ;JUMP IF FIRST IS FLOATING POINT QATM2N BCS EQN12 ;JUMP IF SECOND IS FLOATING POINT EQN11: CMP (SP)+,(SP)+ ;COMPARE TWO INTEGERS BEQ EQ01 BR EQ02 EQN12: MOV 4(SP),R0;GET INTEGER MOV (SP)+,2(SP) ;SET UP TO INTERLEAVE F.P. #'S MOV @SP,-(SP) MOV R0,-(SP);CONVERT INTEGER TO REAL EQN13: QIR EQN14: MOV (SP)+,4(SP) ;INSERT EXPONENT CMP (SP)+,(SP)+ ;COMPARE MANTISSAS BEQ EQN11 ;IF EQUAL JUMP TO COMPARE EXPONENTS CMP (SP)+,(SP)+ ;OTHERWISE FLUSH STACK BR EQ02 ;AND RETURN FALSE EQN20: MOV 2(SP),-(SP) ;SET UP TO INTERLEAVE F.P. #'S MOV 2(SP),4(SP) QATM2N BCS EQN14 ;JUMP IF SECOND IS F.P. BR EQN13 ;OTHERWISE CONVERT IT ZEQN=.-EQN .END