/AUTO AND CROSS CORRELATION MS- CORRELATIONS ON DATA /COLLECTED VIA THE A/D. / /DEC-8E-AACRA-A-LA / /COPYRIGHT 1972 /DIGITAL EQUIPMENT CORPORATION /MAYNARD, MASSACHUSETTS 01754 / /FILE COR.3 / /THIS VERSION RUNS UNDER OS-8 /AND READS ANS WRITES TO THE SYSTEM DEVICE. /AUTO AND CROSS CORRELATION PROGRAM FOR THE LAB8/E. /IOT REFERENCES FOR THE LAB8/E / / /AD8-EA 10 BIT A/D CONVERTER / ADCL=6530 /CLEAR ALL ADLM=6531 /LOAD MPLXR ADST=6532 /START CONVERSION ADRB=6533 /READ AD BUFFER ADSK=6534 /SKIP ON AD DONE ADSE=6535 /SKIP ON TIMING ERROR ADLE=6536 /LOAD ENABLE REGISTER ADRS=6537 /READ STATUS REGISTER /VC8-E POINT PLOT DISPLAY DILC=6050 /CLEAR ALL DICD=6051 /CLEAR DONE FLAG DISD=6052 /SKIP ON DONE FLAG DILX=6053 /CLEAR DONE FLAG LOAD X DILY=6054 /CLEAR DONE FLAG LOAD Y DIXY=6055 /CLEAR DONE, INTENSIFY, SET DONE DILE=6056 /LOAD ENABLE CLEAR AC DIRE=6057 /ENABLE TO AC / /DK8-EP REAL TIME CLOCK / CLZE=6130 /ZERO TO ENABLE CLSK=6131 /SKP ON CLOCK FG CLOE=6132 /ONES TO ENABLE CLAB=6133 /AC TO CLK BUF AND COUNTER REGISTER CLEN=6134 /ENABLE TO AC CLSA=6135 /STATUS TO AC AND AC ONE'S CLEAR STATUS REG. CLBA=6136 /CLK BUF TO AC CLCA=6137 /CLK CNTR TO AC AND TO AC / /DB8-EA 12 CHANNEL DIGITAL I/O / DBDI=6500 /ENABLE INTERRUPT DBEI=6501 /DISABLE INTERRUPT DBSK=6502 /SKIP ON INPUT DBCI=6503 /CLEAR INPUT BITS WITH SET AC BIT DBRI=6504 /READ INPUT DBCO=6505 /CLEAR OUTPUT BITS WITH AC BITS DBSO=6506 /SET OUTPUT BITS WITH AC BITS DBRO=6507 /READ OUTPUT REGISTER BSW=7002 /PAGE 0 *0 0 /JUMP TO INTERRUPT ROUTINE. JMP I .+1 CHAS TTYBUF, 0 /CHAR TO BE TYPED PLACED HERE BY PRINTC. KEYBRD, 0 /CHAR TO BE INPUTED PLACED IN HERE BY INTERRUPT ROUTINE. 0 /LOCATIONS 5,6,AND 7 ARE RESERVED FOR XODT. 0 0 *10 PNTR, 0 /AUTO INDEX REGISTERS. PNTR1, 0 PNTR2, 0 PNTR3, 0 BTCFLG, 0 /=0 IF NORMAL, -1 IF BATCH MODE. TFLAG, 0 SCL, 0 *20 NUMBER, 0 /CONTAINS NUMBER OF POIINTS. CLKCNT, 0 /CONTAINS NUMBER OF XTAL CLOCK TICKS FOR EACH STAGE OF THE ALGORITHIM. WRDCNT, 0 /CONTAINS - # OF POINTS. FLAG, 0 /=0 IF AUTO CORRELATION, -1 IF CROSS. SBUF, BUFFER-1 ENDTMP, 0 /POINTS TO END TEMP BUFFER-1 ENDPRM, 0 /POINTS TO END PERMAMENT BUFFER-1 TKCNT, 0 /COUNTER USED BY CLOCK ROUTINE TO COUNT THE NUMBER OF XTAL TICKS. COMFLG, -1 /=0 IF ALL COMMANDS LEGAL.=-1 IF ONLY CNTRL/C AND CNTRL/A ARE LEGAL PNTRT, 0 /POINTER TO TEMP BUFFER USED BY CLOCK SERVICE ROUTINE. PNTRH, 0 /POINTERS TO DOUBLE PRECISION BUFFER USED BY CLOCK SERVICE ROUTINE. PNTRL, 0 DISFLG, 0 /=0 IF DISPLAY TEMP BUFFER.=-1 IF DISPLAY PERMAMENT BUFFER. PLTFLG, 0 /=0 IF DON'T PLOT,-1 IF SHOULD PLOT. CHAR, 0 /HOLDS A CHARACTER. NUMER, 0 /NUMERATOR IN DIVIDE ROUTINE. DENOM, 0 /DENOMINATOR IN DIVIDE ROUTINE. X, 0 /X-COORIDINATE Y, 0 /Y-COORIDNATE. CNTR, 0 CNTR1, 0 HIGH1, 0 /DOUBLE PRECISION STORAGE LOW1, 0 HIGH, 0 LOW, 0 S0, 0 /SIGN INDICATOR FOR ADCVAL. S1, 0 TELSW, 0 /IS NON ZERO IF PRINTER SERVICE ROUTINE IS EXPECTING AN INTERRUPT. TEMP, 0 CHECK1, CHECK2 ADC0, BUFFER /ADC0 IS FIRST WORD IN BUFFER. ADC1, 0 PNTR5, 0 SCNTR, 0 /USED AS A COUNTER IN THE CLOCK SERVICE ROUTINE. CURFLG, -1 /=0 IF DISPLAY CURSORS. -1 IF DON'T. SCALE, 4 /CONTAINS SCALE FACTOR FOR Y VALUES. CHKSUM, 0 SGN, 0 T2, 0 CNTR6, 0 HIGH2, 0 DIGBOX, 0 C, 0 T1, 0 SWEEPH, 0 SWEEPL, 0 TT1, 0 SDADDR, CONL-1 T4, 0 PNTR6, 0 DATFLG, 0 /=-1 IF TAKING DATA, 0 IF NOT. EXP, 0 /FLOATING AC HORD, 0 LORD, 0 OVER2, 0 EX1, 0 AC1H, 0 AC1L, 0 OVER1, 0 MINS, ACMINS /SUBROUTINE ASSIGNMENTS. NORM=JMS I . ;DNORM SAVE=JMS I . ;XSAVE NORMF=JMS I . ;DNORM DIVF=JMS I . ;FDIV SORTJ=JMS I . ;SORTB /SEARCH AND BRANCH ROUTINE. COMCHK=JMS I . ;CHECK /CHECKS TO SEE IF USER TYPED COMMANDS. SETDAT=JMS I . ;XSDAT /SETS UP DATA FOR THE DISPLAY ROUTINES. DISPLY=JMS I . ;DYS /DISPLAYS BUFFERS. SETUP=JMS I . ;XSETUP /SETS UP INTERNAL DATA FOR DISPLAY ROUTINE. MESAGE=JMS I . ;MESG /TYPES A MESSAGE ONTO THE TELETYPE. PRINTC=JMS I . ;XPRINT /PRINTS A SINGLE CHAR ONTO THE TELETYPE. READC=JMS I . ;INDEV /READS A CHARACTER FROM THE TELETYPE. DIV=JMS I . ;XDIV /DOES A DIVISION BY SUBTRACTION METHOD. CRLF=JMS I . ;XCRLF /TYPES A CR-LF COMBINATION. RESET=JMS I . ;XRESET /RESETS DATA FOR CLOCK ROUTINE AFTER A SWEEP IS OVER. DNEG=JMS I . ;XDNEG /DOES A DOUBLE PRECISON NEGATION. DBLSCL=JMS I . ;DBS /SCALES A DOUBLE PRECISION WORD. DECIN=JMS I . ;DECINP /INPUTS A DECIMAL # FROM THE TTY. CLEAR=JMS I . ;XCLR /CLEARS OUT THE BUFFERS. CURSOR=JMS I . ;XCUR /DISPLAYS CURSORS. ADC=JMS I . ;XADC /READS IN AN ADC VALUE FROM CHANNEL (AC). DECOUT=JMS I . ;DECTYP /OUTPUTS A DOUBLE PRECISON NUMBER. DOUT=JMS I . ;SDPRNT /OUTPUTS A DOUBLE PRECISION DECIMAL NUMBER. INIT=JMS I . ;INIT1 /INITIALIZES VARS. DLOOP=JMS I . ;DOLOOP /DOES A LOOP IN THE DISPLAY ROUTINE. LOADX=JMS I . ;XLOAD LOADY=JMS I . ;YLOAD LIUFLG, 0 /THE REST OF THE PAGE 0 LOCATIONS ARE RESERVED FOR LITERALS. *200 START, CLA CLL CMA CLZE CLA TCF KCC ION AGAIN, MESAGE /TYPE "RATE? " MES1-1 DECIN /READ THE ANSWER. TAD NUMBER /RATE<=0? SMA SZA CLA JMP ALRGHT /YES. MESAGE /NO. TYPE "000.04? TAD (-4 SPA SNA CLA JMP ERROR4 /NO. TAD NUMBER /YES. WRDCNT=-NUMBER 0F POINTS. CIA DCA WRDCNT MESAGE /TYPE "AUTO? " MES5-1 RDAGN, READC /READ ANSWER. /BECAUSE COMFLG=-1 ONLY CNTRL/C AND CNTR/A ARE LEGAL COMMANDS. SORTJ /SEE IF CHAR ="Y" OR "N" LST1-1 JMP1-LST1 JMP RDAGN /NOT A "Y" OR "N". IGNORE AND DON'T ECHO . ASK AGAIN. YES, CMA /FLAG=0 IF AUTO NO, CMA /FLAG=-1 IF CROSS DCA FLAG PRINTC /ECHO. CRLF /TYPE A CR-LF TAD SBUF /GET BUFFER -1 TAD NUMBER /SET ENDTMP TO END OF TEMP BUF -1 DCA ENDTMP TAD NUMBER /SET ENDPRM TO END OF PERM BUF -1 CLL RAL /MULT BY 2 TO COMPENSATE FOR DOUBLEPRECISION. TAD ENDTMP DCA ENDPRM CONT2, CLEAR /CLEAR BUFFERS. TAD CLKCNT /TICK COUNTER = CLKCNT. DCA TKCNT /TKCNT USED BY CLOCK SERVICE ROUTINE. DCA COMFLG /ALL COMMANDS ACCEPTABLE. DCA LIUFLG /SET THE BUFFER NOT FULL FLAG RESET /SET UP DATA FOR CLOCK SERVICE ROUTINE. JMS I (MODE CONT3, JMS DISP JMP .-1 /DISPLAY LOOP BEGINS HERE. DISP, 0 TAD DISFLG /DISPLAYING INPUT? SZA CLA JMP SPPB /NO. TAD SBUF /YES. SET PNTR TO BEGINNING OF TEMP BUF IAC CONT6, DCA PNTR SETDAT /SET DATA FOR DISPLAY ROUTINE. DISPLY /DISPLAY DATA. TAD PLTFLG /PLOTTING? SMA CLA JMP CONT5 /NO. DCA PLTFLG /YES. TERMINATE PLOTTING MODE. SKP CONT5, CURSOR /DISPLAY CURSORS. JMP I DISP SPPB, TAD ENDTMP /SET PNTR TO BEGGINNING OF PERMAMENT BUFFER. IAC JMP CONT6 /THIS NEXT ROUTINE IS A SORT AND BRANCH ROUTINE. /CALLING SEA /CALLING SEQUENCE: SORTJ / LIST1-1 / LIST2-LIST1 / /RETURN /THE CONTENTS OF CHAR IS SORTED AGAINST LIST1. /IF A MATCH IS FOUND A JUMP IS MADE TO THE /CONTENTS OF THE CORRESPONDING LOCATION IN LIST2. /IF A MATCH IS NOT FOUND A RETURN IS MADE TO RETURN. /LIST1 IS TERMINATED BY A NEGATIVE NUMBER. SORTB, 0 /CALLED VIA "SORTJ" TAD I SORTB /GET POINTER LIST1-1 DCA PNTR1 SORTB1, TAD I PNTR1 /GET ENTRY SMA /END OF LIST? JMP SORTB2 /NO. ISZ SORTB /YES. RETURN. ISZ SORTB CLA CLL JMP I SORTB SORTB2, CIA TAD CHAR SZA CLA /MATCH? JMP SORTB1 /NO. CONTINUE LOOKING. TAD PNTR1 /YES. COMPUTE CORRESPONDING LOCATION IN LIST2. ISZ SORTB TAD I SORTB DCA SORTB TAD I SORTB DCA SORTB JMP I SORTB /THIS NEXT ROUTIEN CHECKS TO SEE IF A COMMAND HAS BEEN TYPED /BY THE USER. /IF THE AC IS NON-ZERO UPON ENTRY, THE ROUTINE WILL CHECK /FOR COMMANDS USING CHAR, INSTEAD OF KEYBRD. CHECK, 0 SZA CLA /AC=0? JMP CHK /NO. CHECK WITH CHAR. TAD KEYBRD /YES. CHECK WITH KEYBRD. ANYTHING TO CHECK? SNA JMP I CHECK /NO. EXIT. DCA CHAR /YES. DCA KEYBRD CHK, TAD COMFLG /CHECK FOR CNTR/C AND CNTRL/A? SPA CLA JMP CHECK3 /YES. JMS I (CHKALL /CHECK FOR MORE COMMANDS. CHECK2, JMP I CHECK /NO. RETURN.CHECK2, JMP I CHECK /RETURN. NOT A COMMAND. CHECK3, SORTJ CLST-1 COMGO1-CLST LUCY, JMP I CHECK /THIS NEXT ROUTINE DISPLAYS EITHER THE TEMP OR PERM BUFFERS. *400 DYS, 0 /CALLED VIA "DISPLY" COMCHK /CHECK FOR COMMANDS. SETUP /SETUP COUNTERS AND POINTERS. DYS1, DLOOP /DO DISPLAY LOOP JMP I DYS /DONE. TAD X /LOAD X LOADX CLA CLL TAD Y LOADY CLA CLL TAD PLTFLG /PLOTTING? SZA CLA JMS I (DELAY /YES DELAY. JMP DYS1 /NO. CONTINUE. XSETUP, 0 /CALLED VIA "SETUP" DCA C /C=0 TAD DENOM /X=-QUOTIENT. CIA DCA X CLA CMA TAD WRDCNT /CNTR=-# OF POINTS. DCA CNTR JMP I XSETUP DOLOOP, 0 /CALLED VIA "DLOOP" TAD X /X=X+QUOTIENT. TAD DENOM DCA X TAD WRDCNT /C>=DIVISOR? TAD C SPA CLA JMP DS1 /NO. DCA C /YES. C=0 ISZ X /X=X+1 DS1, TAD DISFLG /DISPLAYING DOUBLE PRECSIION? SMA CLA JMP DS2 /NO. TAD I PNTR /YES. DCA HIGH /GET HIGH ORDER. TAD I PNTR DCA LOW DBLSCL TAD SCL DS3, DCA Y TAD C /C=C+REMAINDER TAD NUMER DCA C ISZ CNTR /LOOP DONE? ISZ DOLOOP /NO. JMP I DOLOOP /YES. EXIT CALL+1 DS2, TAD I PNTR /DO A SINGLE PRECISION SCALE. JMP DS3 /THIS ROUTINE TYPES A MESSAGE ON THE TTY. /CALLING SEQUENCE: MESAGE / LIST-1 / RETURN /THE LIST CONTAINS 8 BIT ASCII CHARS AND IS TERMINATED BY A 0. MESG, 0 /CALLED VIA "MESAGE" CRLF /TYPE A CR-LF. TAD I MESG /GET POINTER. DCA PNTR ISZ MESG MESG1, COMCHK /CHECK FOR COMMANDS. TAD I PNTR /GET TABLE ENTRY. SNA /END? JMP I MESG /YES. PRINTC /NO. PRINT IT. JMP MESG1 /THE NEXT ROUTINE PRINTS A CHAR. XPRINT, 0 /CALLED VIA "PRINTC" SZA /PRINT CONTENTS OF AC? DCA CHAR /YES. TAD TELSW /INTERRUPT EXPECTED? SNA CLA JMP XPR1 /NO. PRINT HERE. XPR3, TAD TTYBUF /YES. PREVIOUS CHAR BEEN PRINTED? SZA CLA JMP XPR2 /NO. TAD CHAR /YES. DCA TTYBUF JMP I XPRINT XPR1, TAD CHAR TLS /PRINT CHAR. DCA TELSW /TURN ON TELSW DCA TTYBUF JMP I XPRINT XPR2, COMCHK /CHECK FOR COMMANDS WHILE IN LOOP. JMP XPR3 /CHECK AGAIN. /THE NEXT ROUTINE READS A CHAR FROM THE TTY. /AND PLACES IT IN CHAR. INDEV, 0 /CALLED VIA "READC" TAD KEYBRD /ANYTHING TYPED YET? SNA CLA JMP .-2 /NO. CHECK AGAIN. COMCHK JMP I INDEV /THE NEXT ROUTIEN TYPES OUT A CR-LF. XCRLF, 0 /CALLED VIA CRLF TAD (215 PRINTC TAD (212 PRINTC JMP I XCRLF /THE NEXT ROUTINE DOES A DIVISION BY SUBTRACTION. /THE NUMERATOR IS HELD IN LOCATION NUMER /THE DENOMINATOR IS HELD IN LOCATION DENOM. /AFTER THE DIVISION THE REMAINDER IS IN NUMER /AND THE QUOTIENT IN DENOM. /NUMER MUST BE >= DENOM XDIV, 0 /CALLED VIA "DIV" DCA INDEV /CLEAR SUBTRACTION COUNTER. COUNT, TAD DENOM /DO NUMER-DENOM CIA TAD NUMER SPA /SUBTRACTED ENOUGH TIMES? JMP .+4 /YES. DCA NUMER /NO. ISZ INDEV /UP DATE SUBT. COUNTER. JMP COUNT CLA CLL TAD INDEV /PUT IN QUOTIENT DCA DENOM JMP I XDIV MES10, "N "A "M "E ": 240 0 /INTERRUPT HANDLER. *600 INTRPT, DCA AC RAL DCA LINK CLSA SNA CLA JMP TPRNT /NO. CHECK OTHER DEVICES. ISZ TKCNT /CLOCK TICKED ENOUGH TIMES? JMP IEXIT /NO. EXIT. TAD AC DCA AC1 /YES. SAVE AC. TAD LINK DCA LINK1 TAD CLKCNT /RESET CLOCK COUNTER. DCA TKCNT TAD 0 /SAVE RETURN. DCA RETURN ION JMS DOALG /NO. DO ALGORITHIM. JMS I [RDVAL RESET /RESET VARS. TAD DATFLG /STILL TAKING DATA? SMA CLA JMP I (CNTRQ1 /NO TAD LINK1 RAR TAD AC1 JMP I RETURN RETURN, 0 AC1, 0 LINK1, 0 AC, 0 PNTRA, 0 LINK, 0 ADCVAL, 0 TEST, 0 CLL /CLEAR LINK. SPA /ADC VALUE <0? CML CIA /YES. SET LINK AND NEGATE. DCA ADCVAL /SAVE. RAR /GET LINK. IT INDICATES THE SIGN. DCA S0 TAD ADCVAL AND [360 /MASK 0FF THE 4 BITS. CLL RTR /ROTATE INTO POSITION. RTR TAD S0 /PUT IN SIGH BIT DCA ADCVAL JMP I TEST DOALG, 0 TAD BTCFLG /ARE WE IN BATCH MODE? SZA CLA JMP LIU1 /YES, BUFFER MUST BE FULL TAD LIUFLG /NO HAVE WE FILLED THE BUFFER YET? TAD WRDCNT SZA CLA JMP LIU4 /NO, JUST SHIFT LIU1, TAD I PNTRT /GET DATA. CLL /CLEAR LINK. SPA /IS IT NEG? CML CIA /YES. SET LINK AND NEGATE. AND [360 /GET THE 4 BITS. TAD ADCVAL /ADD IN ADCVAL. SPA /ADCVAL NEG? CML /YES. AND [3777 /CLEAR SIGN BIT. TAD [7000 /ADD IN TABLE BIAS. DCA PNTRA TAD I PNTRA /GET ANSWER. SZL /# NEG? JMP NEG /YES. TAD I PNTRL /ADD IN LOW ORDER. DCA I PNTRL GLK JMP BOOB NEG, CIA /NEGATE RESULT. TAD I PNTRL DCA I PNTRL GLK CIA BOOB, TAD I PNTRH /ADD OR SUBTRACT CARRY. DCA I PNTRH LIU4, TAD I PNTRT /ROTATE IT. ISZ PNTRT DCA I PNTRT TAD [-2 TAD PNTRT DCA PNTRT TAD [-2 /PNTRH=PNTRH-2 TAD PNTRH DCA PNTRH TAD PNTRH /RESET PNTRL. IAC DCA PNTRL ISZ SCNTR /LOOP DONE? JMP DOALG+1 /NO. JMS I [ADDS TAD LIUFLG /INCREMENT THE SCAN COUNT? TAD WRDCNT SZA CLA /IF SKIP, NO ISZ LIUFLG /YES JMP I DOALG TPRNT, TSF /PRINTER? JMP KINT /NO. TCF /YES. CLEAR FLAG. TAD TTYBUF /ANYTHING TO TYPE? SZA JMP INT1 /YES. DCA TELSW /NO. TURN OFF TELSW. IEXIT, TAD LINK RAR TAD AC IEXIT1, RMF ION JMP I 0 INT1, TPC /PRINT CHAR. DCA TELSW /TURN ON TELSW. DCA TTYBUF /CLEAR TTYBUF. JMP IEXIT KINT, KSF /KEYBORAD? JMP IEXIT KRB /YES. READ IN CHAR. DCA KEYBRD JMP IEXIT CHAS, DCA AC RAL DCA LINK JMP TPRNT *1000 /THE NEXT ROUTINE DOES A DOUBLE PRECISION NEGATION . /CALLIN SEQUENCE: DNEG / POINTER TO HIGH ORDER. / RETURN /THE RESULT IS PUT BACK IN THE SAME WORDS. XDNEG, 0 /CALLED VIA "DNEG" TAD I XDNEG /GET POINTER. DCA PNTR5 TAD PNTR5 IAC CLL /GENERATE POINTER TO LOW ORDER. DCA PNTR6 TAD I PNTR6 /NEGATE LOW ORDER. CIA DCA I PNTR6 TAD I PNTR5 /COMPLEMENT HIGH ORDER. CMA SZL /ADD IN CARRY. IAC CLL DCA I PNTR5 JMP I XDNEG /THE NEXT ROUTINE SCALES A DOUBLE PRECISON WORD. /IF SCALE=0 THEN NOTHING IS DONE. /IF SCALE > 0 THEN THE DOUBLE PRECISON WORD IS SHIFTED LEFT /SCALE # OF TIMES AND THE HIGH ORDER WORD DISPLAYED. /IF SCALE <0 THEN THE DOUBLE PRECISON WORD IS SCALED /RIGHT SCALE TIMES. DBS, 0 TAD HIGH /DOUBLE PRECISIONWORD < 0? SPA CLA JMP NEGG1 /YES. XXX1, DCA SGN /NO. SGN=0. IAC CLL RAL /SHIFT AN ORIGNAL 2 PLACES RIGHT. JMS I [SHIFTR HIGH TAD SCALE /SCALE =0? SNA JMP EXIT1 /YES. SPA /NO. >0? JMP SL0 /NO. JMS SHIFTL /YES. SHIFT LEFT. HIGH EXIT1, TAD HIGH ISZ SGN CIA CIA JMP I DBS SL0, CIA JMS I (SHIFTR /SHIFT RIGHT. HIGH JMP EXIT1 NEGG1, DNEG HIGH CMA JMP XXX1 SHIFTL, 0 /THIS ROUTINE SHIFTS HIGH LOW AC TIMES LEFT. CIA DCA CNTR1 /SET COUNTER. TAD I SHIFTL DCA PNTR5 /GET POINTER. TAD PNTR5 IAC ISZ SHIFTL DCA PNTR6 SHIFL, TAD I PNTR6 CLL RAL DCA I PNTR6 TAD I PNTR5 RAL DCA I PNTR5 ISZ CNTR1 JMP SHIFL CLL JMP I SHIFTL PLOT, TAD PMODE CLOE CLA CMA DCA PLTFLG /PLOT TAD DISFLG /DISPLAYING TEMP BUF? SMA CLA JMP PYES /YES. JMS I (DISFST /NO. DISP FIRST POINT OF PERM BUFFER. WAIT, READC /WAIT FOR USER TO TYPE SOMETHING BEFORE PLOTTING. JMS I [DISP READC /WAIT FOR USER TO TYPE SOMETHING BEFORE PROCEEDING. JMP I [CONT3 PMODE, 5300 PYES, TAD SBUF IAC DCA PNTR LOADX CLL CLA TAD I PNTR LOADY CLA CLL JMP WAIT /THE NEXT ROUTINE INPUTS A DECIMAL NUMBER FROM THE TTY. /THE NUMBER TYPED IN IS LEFT IN LOCATION NUMBER. /IF A RUBOUT IS TYPED THEN INPUT IS RESTARTED. /ONLY A MAX OF 4 DIGITS CAN BE TYPED. DECINP, 0 /CALLED VIA "DECIN" TAD (-3 /INPUT NO MORE THAN 3 DIGITS BEFORE DECIMAL POINT. DCA CNTR1 DCA NUMBER LOOP5, READC /READ A CHAR. SORTJ /SEE IF A RUBOT OR PERIOD. INLST-1 GOLST-INLST JMS I TESTN1 /NOT A RUBOUT OR ".". SEE IF A DIGIT. JMP LOOP5 /NOT A DIGIT. IGNORE. PRINTC /IT IS A DIGIT. ECHO. JMS I CONVRI /DO ALGORITHIM. ISZ CNTR1 /INPUTED 3 DIGITS? JMP LOOP5 /NO. DEC6, READC /YES. WAIT FOR PERIOD. SORTJ INLST-1 GOLST-INLST JMP DEC6 PERIOD, DCA CNTR1 PRINTC /ECHO THE PERIOD. READC /INPUT ONE MORE DIGIT. JMS I TESTN1 /A DIGIT? JMP PERIOD+2 /NO.IGNORE. PRINTC /YES. ECHO. JMS I CONVRI /DO ALGORITHIM. BIN5, CRLF JMP I DECINP RUBOUT, TAD (334 /A RUBOUT WAS TYPED. RESTART INPUT. PRINTC /ECHO A "\" JMP DECINP+1 CR, TAD X /X=-1? IF SO CR ACCEPTABLE. SPA CLA JMP BIN5 /YES. TYPE A CR AND EXIT. TAD CNTR1 /NO. STILL WAITING FOR 3 DIGITS? SZA CLA JMP LOOP5 /YES. JMP DEC6 /NO. WAITING FOR A PERIOD CONVRI, CONVER TESTN1, TESTN /THE NEXT ROUTINE CLEARS THE BUFFERS. *1200 /THIS ROUTINE DISPLAYS THE CURSORS. XCUR, 0 /CALLED VIA "CURSOR" TAD CURFLG /DISPLAY CURSORS? SZA CLA JMP I XCUR /NO. ADC JMS DELOOP CLA IAC ADC JMS DELOOP JMP I XCUR DELOOP, 0 TAD [400 LOADX CLA CLL TAD (-1000 DCA TT1 TAD (-377 DLOP, LOADY TAD [-10 ISZ TT1 JMP DLOP CLA CLL JMP I DELOOP /THE NEXT ROUTIE DIES A DOUBLE PRECISION SIGNED /DECIMAL OUTPUT. IT PRITNS THE DOULBE PRECISION NUMBER /HELD IN LOCATIONS HIGH1 AND LOW1. SDPRNT, 0 /CALLED VIA "DOUT" TAD HIGH1 SMA CLA /NUMBER <0? TAD (-15 /NO. GENERATE CODE FOR SPACE. TAD (255 PRINTC TAD HIGH1 /HIGH1<0? SMA CLA JMP NO11 /NO. DNEG HIGH1 /YES. NEGATE IT. NO11, TAD (-7 /TYPE OUT 7 DIGITS. DCA CNTR6 TAD SDADDR DCA PNTR2 SDLOOP, TAD I PNTR2 /GET ENTRY FROM TABLE OF POWERS. DCA HIGH TAD I PNTR2 DCA LOW SDOUT, JMS I (DPDIV TAD DIGBOX TAD (260 PRINTC /PRINT DIGIT. ISZ CNTR6 /DONE? JMP SDLOOP /NO. JMP I SDPRNT CONL, 0364 /1,000,000 1100 0030 /100,000 3240 0002 /10,000 3420 0000 1750 /1,000 0000 /100 144 0000 /10 0012 ONE, 0000 0001 /COMMAND HANDLERS. CNTRLA, INIT /INIT VARS. JMP I .+1 START CNTRLZ, CLEAR /CLEAR BUFFERS. INIT CLA CLL CMA /TURN OFF CLOCK. CLZE CLA TAD (CHAS DCA 2 DCA COMFLG /ALL COMMANDS ACCEPTABLE. ION JMP I (CONT3 CNTRLS, CLEAR /CLEAR BUFFERS. CNTRLR, CLSA CLA CMA CLZE /ZAP THE CLOCK DCA DATFLG /SET DATA TAKING FLAG TAD (-144 CLAB /BUFFER PRESET = -100 CLL CLA TAD CLKMDE /GET THE CLOCK MODE CLOE CLA CLL CMA DCA CURFLG TAD BTCFLG /BATCH MODE? SZA CLA JMP I (BATCH-6 /YES. TAD (INTRPT DCA 2 JMP I [CONT3 MES8, 262 /2 336 /^ 0 DVSOR, 0 0 DECI, 0 CMA DCA X DECIN DCA X JMP I DECI CLKMDE, 5610 *1400 KALBRT, LOADX /CALABRATE PLOTTER. TAD (-377 LOADY CLA CLL READC /WAIT FOR USER TO TYPE SOMETHING. CMA COMCHK /CHECK FOR COMMAND TAD (777 LOADX CLA CLL CLL CLA TAD (377 LOADY CLA CLL READC /WAIT FOR USER TO YPE SOMETHING. CMA COMCHK JMP KALBRT /THIS COMMAND TYPES OUT DATA BETWEEN CURSORS. /IN ADDITION IT TYPES OUT THE FOLLOWING DATA: /VALUE OF THE LOWER CURSOR, VALUE OF THE HIGHER CURSOR, /THE # OF SWEEPS, # OF POINTS BETWEEN CURSORS, AND /THE TIME IN HUNDREDS OF MICRO SECS BEWEEEN CURSORS. /THIS NEXT COMMAND TYPES OUT DATA BETWEEN THE CURSORS IN ONE OF /TWO MODES. MODE 1 IS REPRESENTED EXTERNALLY BY THE COMMAND /CNTRL/T. IT DIVIDES THE DATA BETWEEN THE CURSORS BY THE FIRST /POINT IN THE PERMAMENT BUFFER. SINCE THE FIRST IS THE LARGEST, /OUTPUT IS IN THE FORM OF THE FRACTIONAL VALUES OF EACH /POINT IN RELATION TO THE FIRST POINT. /MODE 2 IS OUTPUTS THE POINTS AS MILLI VOLTS SQUARED TIMES 10^2. TYPCR, CLA CMA /MODE 1. TFLAG=-1 TYPCUR, DCA TFLAG /MODE 2. TFLAG=0 CRLF DCA DISFLG SETDAT /TYPE OUT DATA BETWEEN CURSORS. SETUP /SET UP DATA FOR DISPLAY ROUTINE. ADC JMS FIND DCA TEMP SETDAT SETUP CLA IAC ADC JMS FIND DCA ADC1 TAD ADC1 /TEMP=ADC1? CIA TAD TEMP SNA JMP I CHECK1 /YES. DON'T TYPE ANYTHING. SMA /NO. TEMP