.TITLE COMDBT - ROUTINE TO COMPUTE DISTANCE BETWEEN TICS .IDENT 'COMD00' .PSECT COMDBT ; KEN DEMERS ; UTRC ; JAN 1980 ; THIS ROUTINE COMPUTES THE MOST LOGICAL VALUE TO ; BE USED AS A DISTANCE BETWEEN TICS. IT IS PART OF ; THE SFGL70. ; CALLING FORMAT: ; CALL COMDBT(RANGE,GRDTAB,GRDMIN,MAXTIC) ; WHERE: ; RANGE = THE RANGE OF THE GRID NEEDING TICS(IN F.P.) ; GRDTAB = TABLE CONTAINING DIST(F.P.),START(F.P.),DELTA(F.P.),NTICS ; GRDMIN = MINIMUM VALUE OF THE GRID ; MAXTIC = MAXIMUM # OF TICS ALLOWED PER GRID ; ON EXIT: ; C = 0 = DISTANCE BETWEEN TICKS WAS FOUND ; C = 1 = NO FIND ; INTERNAL GLOBALS .GLOBL C$OMDBT ; EXTERNAL GLOBALS .GLOBL $AINT ; ASSIGNMENTS F0 = %0 ;F.P. ACCUMULATOR 0 F1 = %1 F2 = %2 TEN = 41040 ;F.P. 10. MINTIC = 40600 ;MIN # OF TIC (CURRENTLY F.P. 4) TABLEN = 6 ;LENGTH OF DBTTAB C$OMDBT: MOV #1,R1 ;R1= LOOP CNT MOV R1,R2 ;SAVE CONSTANT CLR IFLG ;INIT MULTIPLY FLG MOV 2(R5),R4 ;R4= A(RANGE) MOV 4(R5),R3 ;R3= A(GRDTAB ARG) COM10: MOV R1,R0 ;R0= TAB INDEX ASL R0 ;F.P. TAB ASL R0 SETF ;SET MODE = F.P. LDF DBTTAB-4(R0),F0 ;GET QUESSTIMATE STF F0,(R3) ;SAVE IT COM20: LDF (R4),F0 ;GET RANGE CMPF (R3),F0 ;IS DISTANCE < RANGE? CFCC ;GET CC'S BLT COM40 ;YES CMP IFLG,R2 ;HAVE WE DONE MULTIPLE OF DIST YET? BEQ COM40 ;YES,DON'T DIVIDE AGAIN COM30: LDF (R3),F0 ;GET DBT DIVF #TEN,F0 ;DIVIDE IT BY 10. STF F0,(R3) ;SAVE IT BR COM20 ;TRY AGAIN COM40: LDF (R4),F0 ;GET RANGE DIVF (R3),F0 ;CK IF WE CMPF #MINTIC,F0 ;ENOUGH TICS? CFCC ;GET F.P. CC'S BLE COM50 ;YES CMP IFLG,R2 ;MULTIPLED YET? BEQ COM60 ;YES BR COM30 ;TRY AGAIN COM50: LDF (R3),F0 ;GET DBT LDF (R4),F1 ;# OF TICS LDF F1,F2 ;LESS THAN DIVF F0,F1 ;OR EQUAL CMPF @8.(R5),F1 ;MAXIMUM ALLOWED CFCC ;GET F.P. CC'S BGE COM70 ;YES CMPF F0,F2 ;HAVE WE EXCEEDED OR EQUALED OUR RANGE? CFCC ;GET F.P. C'S BGE COM60 ;YES LDF (R3),F0 ;GET CURRENT DBT MULF #TEN,F0 ;GET NEXT MULTIPLE OF QUESS STF F0,(R3) ;SAVE IT MOV R2,IFLG ;FLG=1= WE MULTIPLIED IT BR COM20 ;TRY AGAIN COM60: CLR IFLG ;INIT FLG FOR NEXT QUESS INC R1 ;BUMP LOOP CNT CMP #TABLEN,R1 ;END OF TAB? BGT COM10 ;NO,TRY NEXT QUESS SEC ;C=1= NO FIND BR COM120 COM70: LDF (R3),F0 ;GET DBT LDF F0,F1 ;GET # MULF E1MIN4,F0 ;TICS ADDF (R4),F0 DIVF F1,F0 SETI ;SET MODE = INTEGER STCFI F0,8.(R3) ;STORE # TICS THAT WILL BE GENERATED INC 8.(R3) ;DON'T FORGET LAST TIC MOV 6(R5),-(SP) ;SAVE ADDR OF GRDMIN LDF @6(R5),F0 ;GET GRDMIN DIVF (R3),F0 ;GRDMIN/DIST STF F0,-(SP) ;PUT RESULT ON SP(FOR TRUNCATION) MOV SP,ARGPTR ;SET UP $AINT ARG BLK MOV #ARGBLK,R5 ;R5= A($AINT ARG BLK) CALL $AINT ;TRUNCATE GRDMIN/DIST MOV R1,2(SP) ;STORE LO ORD RESUTL MOV R0,(SP) ;STORE HI ORDER RESULT SETF ;SET MODE F.P. LDF (SP)+,F1 ;GET RESULT MULF (R3),F1 ;GET DIST*RESULT LDF @(SP)+,F0 ;F0= GRDMIN COM80: CMPF F1,F0 ;IS START >= GRDMIN? CFCC BGE COM90 ;YES ADDF (R3),F1 ;ADD DIST TO START BR COM80 COM90: STF F1,4(R3) ;STORE START=AINT(GRDMIN/DIST) * DIST COM110: CLC ;C=0= # TICS WAS FOUND COM120: RETURN ; DISTANCE BETWEEN TICS TABLE DBTTAB: .FLT2 10.,5.,4. ;PRIORITY ORDERED TABLE OF .FLT2 2.,2.5,8. ;OF DBT QUESTIMATES IFLG: .WORD 0 ;FLG=1= WE'VE MULTIPLIED QUESS ALREADY E1MIN4: .FLT2 .0001 ;1E-4 USED TO CORRECT FOR F.P. COMPARE ERRORS ; ARG BLK FOR FORTRAN AINT(F.P. TRUNCATION ROUTINE) ARGBLK: .BYTE 1,0 ;# ARGS,NOT USED ARGPTR: .WORD 0 ;PTR TO F.P. # TO BE TRUNCATED .END