@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÅÙÔÁ×@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@åÖÓñÁôñðùó@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@æÈÄÙñ@ÄÁãÁ@@@@@@@@@@@@@@@ðøð@ðñððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ðñððñ@ÄÄÙñ@ÄÁãÁðù@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñð@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁññ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñò@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñó@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñô@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñõ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñö@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñ÷@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñø@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñù@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòð@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòñ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòò@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòó@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòô@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòõ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòö@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå RSTS70 DECRT11A åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå Ay•wkQc!» ¸8Cy{kQ/c!» ¸89€wukQc!» åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå¸8hjkQ&c!» ¸8ä.H;kQJc!» ¸8óHkQAc!» ¸8OyXŽååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååAPS11 O.S. LPS11$=1 ;LPS HARDWARE .IFDF LPS11$ AD$5=1 ;LED'S HARDWARE .ENDC ;AR11$=1 ;AR11 HARDWARE .IFDF AR11$ ;AååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååRPOL$=1 ;BIPOLAR DATA FOR READING CURSOR KNOBS .ENDC ;***** ;GROUP 2 SPECIAL FLOATING VECTORS ;***** LPSV$=340 ;LPS ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååOR AR11 FLOATING VECTOR ADDRS LPSS$=170400 ;LPS OR AR11 STATUS REG ADDR GT40V$=320 ;GT40 FLOATING VECTOR ADDR GT40S$=172000kQ"c!» ¸8Ay§s¼ c!» ¸8Ay®s¼ c!» ¸8vL0H¼ c!åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå» ¸8Cy•`kQ5c!» ¸8CyhjkQc!» ¸8–,ÀvkQc!.NLIST ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE » ¸8a€%kQc!» ¸8TŒH;kQ c!» ¸8IyüXkQ c!FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTW» ¸8Oy¨ŽkQc!» ¸8Ay¶s¼ c!» ¸8vLØE¼ c!» ARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH¸8vLðF¼ c!» ¸8  SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DE C. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååIS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON .TITLE SPASEM ;LAB APPLICATION-11 ASSEMBLY FILE åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå ;DEC-11-SLABA-C-LAB25 ;FILE SPASEM.MAC ;FILE ID SPASEM.1 ;IF ANY OF THE FOLLOWING PARAMETERS ARE DEFINED, THEY ;ASSEMBLE ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååCODE AS DESCRIBED IN THE COMMENTS ;***** ;GROUP 1 DEFINE THE SYSTEM TO BE USED ;***** RT11$=1 ;RT11 O.S. ;CAPS$=1 ;CBDE CMD SPBIN$=1 ;BIN CMD SPBSM$=1 ;BSM CMD SPMOP$=1 ;MOP,MIN,MOU,MRE,MCL CMDS SPAAD$=1 ;AAD CMD SPFFT$=1 ;FFT C.TITLE SPCDIS ;LAB APPLICATION-11 DATA EDITOR ROOT SECTION ;DEC-11-SLABA-C-LA14 ;FILE SPCDIS.MAC ;FILE ID SPCDIS.1 .CSECT SMD SPFPO$=1 ;FPO,FMP CMDS SPFAC$=1 ;FAC,FCC CMDS AD$3=1 ;MULTI CHANNEL SAMPLING IN A/D MODULE AD$4=1 ;FAST SAMPLE PCDIS ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSEIN A/D MODULE ;GT40 DISPLAY MODULE RELATED PARAMETERS GTD$1=1 ;IF=0,CAUSES 'DIWRFL' FLG TO BE SET IN ;GT40 DISPLY MO FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTDULE WHEN WRAPAROUND OCCURS ;IF=1,WILL NOT ALLOW WRAPAROUND. GTD$7=0 ;ENABLE SCOPE PARAMETERS GTD$A=0 ;ENABLE FL.PT. DWARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCATA GTD$C=0 ;TEST EACH I/D TBL FLG FOR RECALC. GTD$D=0 ;GENERATE GRAPH Y-MODE DISPLAYS ;***** ;GROUP 5 DO NOT CHANGE AH SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DNY OF THESE EVER! ;***** TTYR$1=1 TTYR$2=1 FORTX$=1 FORSP$=1 FORFL$=1 QAFLO$=1 QAMIX$=1 QAALP$=1 DIV$=1 SAVRG$=1 LEC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY ;GT40 START ADDR (DPC) ;***** ;GROUP 3 DISPLAY RELATED PARAMETERS ;***** ;SPNDI$=1 ;ELIMINATE ALL DISPLAY RELATED CODISTC$=1 MULT$=1 MULTS$=1 .IFDF SPDID$ DA$10=1 ;FREE CURSOR VALUES DA$11=1 ;FIX CURSOR VALUES DA$12=1 ;CURVES ID NAME .IFNDF SPNDI$ GT40$=1 ;ASSEMBLE CODE FOR GT40/44 ;VR14$=1 ;ASSEMBLE CODE FOR VR14 DISPLAY SPDDI$=1 ;DDI CMD SPDFR$=1ES .ENDC .IFDF SPDFR$ GTD$6=0 ;FIX CUR CMD CODE IN GT40 MODULE VRD$1=0 ;FIX CUR CMD CODE IN VR14 MODULE DA$5=1 ;FRE ;DFR,DCU,DLI,DWI,DPO,DTA CMDS .IFDF SPDFR$ SPBST$=1 ;BST CMD (NEEDS FIX & FREE CUR) SPBAL$=1 ;BAL CMD (NEEDS FIX CUR) E CURSORS DA$6=1 ;LINE DA$8=1 ;WINDOW .ENDC .IFDF SPDSP$ DA$4=1 ;DUAL DISPLAY .ENDC .IFDF SPDIS$ GTD$9=0 ;EXSPDID$=1 ;DID,DFV,DCV CMDS .ENDC SPDSP$=1 ;DSP,DOV CMDS SPDIS$=1 ;DEX,DIN,DDE,DRA,DLO CMDS SPBDD$=1 ;BDD CMD SPDNO$PAND CMD CODE IN GT40 MODULE VRD$4=0 ;EXPAND CMD CODE IN VR14 MODULE .ENDC .IFDF SPNDI$ AD$4=1 ;FAST SAMPLE USES NO DI=1 ;DNO CMD SPDTB$=1 ;DTB CMD AD$1=1 ;DISPLAY CODE IN A/D MODULE .ENDC ;***** ;GROUP 4 NON-DISPLAY RELATED PARAMETSPLAY .ENDC .IFNDF SPNDI$&VR14$>40$ ERR=AAA ;YOU NEED VR14$ OR GT40$ .ENDC .LIST ERS ;***** SPERR$=1 ;LONG FORM OF ERROR MESSAGES ;DA$2=1 ;ADDING NEW CMDS TO SPARTA SPBBU$=1 ;BBU CMD SPPWR$=1 ;PWR,PRE CMDS SPBAD$=1 ;BAD,BSU,BMU,BDI CMDS SPBMO$=1 ;BMO CMD SPBMM$=1 ;BMM CMD SPSAD$=1 ;SAD,SMU,SDI CMDS SPBDE$=1 ;RDWARE ;ARPOL$ ;THE AR11 POLARITY FOR READING THE POTS: ;IF DF, BIPOLAR; IF NDF, UNIPOLAR. ;DA$10 ;DEFINED=DISPLAY ,DISXC1,DISOFY .GLOBL DISSC DEE05: .IFDF GT40$ TSTB DEDSKP ;TEST NOT TO RECAL. DISPLAY BNE DE04 INCB GTRCAL ;RECALCFREE CURSOR VALUES ON GT40. ;DA$11 ;IF DF, DISPLAY FIXED CURSOR VALUES ON GT40. ;VR14$ ;IF DEFINED VR14 IN USE ;DEFINULATE GT40 DISPLAY MOVB #1,DEG1RC ;SET TO RECAL DISPLAYS .IFDF DA$4 MOVB #1,DEG2RC .ENDC TSTB DEFLG4 ;TEST FOR WINDOWITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;RELATIVE LPS STATUS REGISTER ADDRESSES ADSTAT=0 ; A/D ST. BEQ DE03 MOVB #-1,GTRCAL ;DON'T CHANGE DISP. BUF. SIZE DE04: CLRB DEDSKP ;CLEAR DISPLAY RECAL FLAG .ENDC ;AFTER A COATUS REG. ADBUF =2 ; A/D BUFFER REG. .IFDF LPS11$ VCSTAT=16 ; DISPLAY STATUS .ENDC .IFDF AR11$ VCSTAT=10 .ENDC MMAND ;INITIALIZE POT LIMITS FOR MOVING DISPLAYS DE03: MOV DELST,R1 ;TEST DISPLAY 1 .IFDF DA$4 BEQ DE01 .ENDC .IF;INTERNAL GLOBALS .GLOBL DEE05,DEE1 ;EXTERNAL GLOBALS .GLOBL DEFLG1,DEFLG2,DEFLG4,DELST,DESM1L,DESM1S,DEONE,DED2P1 .GLNDF DA$4 BEQ DE025 .ENDC JSR PC,DESM10 ;SET S-1 LIMIT AND SHIFT MOV R2,DESM1L ;FOR POT 2 MOV R5,DESM1S .IFDF DA$4 DOBL DED2P2,DEPOTS,DEPOT1,DEPOT2,DEPOT3,DEPTC,DED1P1,DED1P2 .GLOBL TTYBUF,DE4POT,DEOLDP,DEDID,DEFORE,DESWIP,DEDIT1,DEDI1C .GLOBE01: MOV DELST+2,R1 ;TEST FOR DISPLAY 2 BEQ DE025 JSR PC,DESM10 ;SET S-1 LIMIT AND SHIFT MOV R2,DES1L3 ;FOR POT 3 MOV R5L DEDI2C,DEOFYD,DEDIT2,VCX,VCY,LPSSAD,DEDYSZ,MULT,SAVARG .GLOBL $POLSH,$IR,RSTARG,FORBUA,DEDXSZ,$DVR,$ADR,FORBUF,DIVR .GLOBL D,DES1S3 .ENDC DE025: RTS PC DEE1: MOV #4,(PC)+ ;SET UP FOR NEXT POT SCAN. DEPOTC: 0 MOV #DEPOTS,(PC)+ DEPOTA: 0 MOV #IVDNH,DIVDSH,DIVD .IFDF DA$4 .GLOBL DES1L3,DES1S3,DESWP0,DESWP1,DESWP3 .ENDC .IFDF DA$5 & DA$6 .GLOBL DELNB,DELMDY,DEDDEPTC,(PC)+ DEPOTE: 0 JSR PC,DEPOTR ;GET A/D POT VALUES MOV DEPOTS,R1 MOV DEPOT1,R2 MOV DEPOT2,R3 MOV DEPOT3,R4 .IFELY,DEDLYF,DEDELX,DEDRBS,DEX0,DEY0 .ENDC .IFDF DA$7 .GLOBL DEADSH .ENDC .IFDF GT40$ .GLOBL DEDSKP,GTRCAL,DEG1RC,DEGTOFDF DA$7 MOV DEADSH,R0 BEQ DE2 DE3: ASL R1 ;ROTATE POT VALUE IF LPS A/D ASL R2 ;IS LESS THAN 12 BITS ASL R3 ASL R4 DIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH,GTDISP,DEGTON,DISSKP,GTSET .GLOBL DEGFXF,DEDCVZ,DEGCUF,DEPTCC,DISMPO .IFDF DA$11 .GLOBL DFXCT3,DFXCTA,DFXCT4 .ENDC .IFD IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ; ASSEMBLY PARAMETERS ;GT40$ ;IF DEFINED GF DA$10!DA$11 .GLOBL FORMAB,DFXCTB,DFXCT5,$CMR,$MLR .ENDC .IFDF DA$10 .GLOBL DFCVT2,DFCVT4 .ENDC .IFDF DA$4 .GLOBL DET40 IS DISPLAY, ELSE VR14 ;DA$4 ;DEFINED=DUAL DISPLAY ;DA$5 ;DEFINED=FREE CURSORS ;DA$6 ;DEFINED=LINE ;DA$7 ;DEFG2RC .ENDC .IFDF DA$5 .GLOBL DEGXL,DEGYL,DEGXR,DEGYR .IFDF DA$6 .GLOBL DEGLX1,DEGLX2,DEGLX3,DEGLX4,DEGLX5 .ENDC .ENDINED=LESS THAN 12 BIT A/D, ELSE 12 BIT ;DA$8 ;DEFINED=WINDOW ;LPS11$ ;DEFINED = LPS HARDWARE ;AR11$ ;DEFINED=AR11 HAC .ENDC .IFDF VR14$ .GLOBL DISPLY,DISET,DEPTCC .ENDC ;DISPLAY GLOBALS .GLOBL DISBUF,DISYBU,DISTYP,DISST,DISN,DISTDED1P2 ;FIX CURSOR IN DISPLAY .IFDF DA$4 MOV R3,DED2P1 ;POTS 2 AND 3 FOR BOTTOM DISPLAY MOV R4,DED2P2 .ENDC DE2A: ASL RUE DEC R1 ;OF S-1 BNE DE5 DE4: CMP R0,DESM1L ;TEST IF THE POT 2 INDEX VALUE BLO DE6 ;IS GREATER THAN THE MAX MOV DESM1 ;ADD 4 POTS TOGETHER ADD R2,R1 ASL R1 ADD R3,R1 ASL R1 ADD R4,R1 MOV DE4POT,DEOLDP ;SAVE OLD VALUE MOV R1,DE4PO1L,R0 ;SIZE OF S-1 FOR THE WINDOW. DE6: MOV #DEDIT1,R1 ;SET THE VALUE OF S-1 FOR MOV R0,DISST(R1) ;THE WINDOW MOV R1,R0 ;PT ;SAVE NEW SUM CMPB #1,DEFLG1 BHI DE30J ;NO DISPLAY, TEST FOR ANY ;COMMANDS ;SHOW DISPLAY .IFDF VR14$ JSR PC,DIASS ADD. OF DISPLY TABLE. .IFDF VR14$ JSR PC,DISET ;CALL DISPLAY TO SET START ADD. .ENDC .IFDF GT40$ MOVB #1,DISSKP(R1SPLY .ENDC .IFDF GT40$ TSTB GTRCAL ;TEST TO RECALCULATE DISPLAY BEQ DE29A ;NO TSTB DEG1RC+1 ;TEST FOR GRAPH MODE ) ;SET RECALC THIS CURVE FLAG JSR PC,GTSET MOVB #-1,GTRCAL ;DON'T CHANGE SIZE OF DISP. BUF CLR DE4POT ;WILL CAUSE AN EXTRBNE DE29C ;DON'T TURN OFF GT40 IF SO. JSR PC,DEGTOF ;YES, TURN OFF DISPLAY DE29C: JSR PC,GTDISP ;RECALCULATE IT TST R0 ;TA PASS THRU ;FIX CURSOR VALUE DISPLAY TO CATCH UP .ENDC .ENDC DE29J: .IFDF VR14$ .IFDF DA$6 JMP DE27 ;GO HERE OEST FOR ERROR BEQ DE29B MOV #22.,R0 ;PRINT ERROR CLRB DEFLG1 CLR DEDID ;CLEAR DISPLAY & DEFAULT JMP DEFORE DE29B: JNLY IF 'LINE' IS IN .ENDC .IFNDF DA$6 RTS PC ;ELSE JUST SIMPLY RETURN .ENDC .ENDC .IFDF GT40$ JMP DE14 .ENDC DSR PC,DEGTON ;TURN IT ON BR DE54 DE29A: CMP DE4POT,DEOLDP ;TEST IF POTS CHANGED BEQ DE54 JSR PC,GTDISP ;CALL DISPLAY FORE30J: JMP DERTN DE14J: JMP DE14 DE7: .IFNDF DA$4 BR DE54 .ENDC .IFDF DA$4 ;DUAL DISPLAY TSTB DEDI1C ;TEST FOR CURSORS. .ENDC DE54: TSTB DEFLG1+1 ;TEST FOR FREE CURSORS BNE DE14J ;FREE CURSOR ON CMPB #1,DEFLG1 ;TEST FOR SINGLE DISFIX CURSORS BNE DE29J ;ON, SHOW DISPLAY TSTB DEDI2C BNE DE29J TSTB DEFLG4 ;TEST TO MOVE DISPLAYS BEQ DE29J .IFDF GPLAY BNE DE7 ;NON SINGLE .IFDF GT40$ CLRB DEG1RC ;SET NOT TO RECAL DISPLAY .ENDC DE10: TSTB DEFLG4 ;TEST FOR NO WINDT40$ CLRB DEG1RC ;SET FOR NO DISP.RECAL CLRB DEG2RC .ENDC .IFDF DA$8 CMPB #3,DEFLG1 ;TEST FOR TYPE OF DUAL BEQ DE9 OW .IFDF DA$8 BEQ DE29J ;NO WINDOW CMP DEPOT2,DESWIP ;NO FREE CURSORS, POTS BEQ DE29J ;CONTROL A WINDOW ON ;SINGLE ;DISPLAY ;DUAL DISPLAY, ONE OVER THE OTHER, DOV COMMAND ;MOVE DISPLAYS UP AND DOWN ;OFFSET IS NORMALLY DEOFY TO MOVE - DISPLAY WINDOW ;THE DISPLAY TEST IF POT CHANGED MOV DEPOT2,R0 ;SWITCH DIRECTION OF POT 2 .IFDF LPS11$&VR14$ ASR R0 ;HODATA INTO SCOPE MOV DEPOTS,R0 ;TEST IF POT 0 CHANGED CMP R0,DESWP0 BEQ DE60 MOV R0,DESWP0 ;SAVE NEW VALUE ;CHANGERIZ WINDOW ALWAYS ASSUMES A ASR R0 ;10 BIT POT VALUE .ENDC NEG R0 ADD #1777,R0 MOV DEPOT2,DESWIP ;SAVE CURRENT VALUE DISP. Y VALUE ASL R0 ;Y VALUE DISPLAY SUB DEOFYD,R0 MOV DELST,R1 MOV R0,DISOFY(R1) MOV R1,R0 ;CHANGE DISP. .IFDF DEC R0 BNE DE3 .ENDC DE2: TSTB DEFLG1+1 ;TEST FOR FREE CURSORS BNE DE2A MOV R1,DED1P1 ;STORE POT VALUES FOR MOV R2, OF POT 2 MOV DESM1S,R1 ;ROTATE POT 2 VALUE TO BEQ DE4 ;ACCOMODATE THE INDEX RANGE DE5: ASL R0 ;DETERMINED BY THE MAX VALADD #-40,VCX(R5) DEFRC1: ADD #10,VCX(R5) DEC R0 BNE DEFRC1 MOV #10,R0 ADD #-40,VCX(R5) ADD #-40,VCY(R5) DEFRC2: ADD BNE DFXCV ;CURSOR VALUES DFXCVE: .IFDF DA$5 TSTB DEFLG1+1 ;TEST FOR FREE CURSOR ;SPECIAL ENTRY TO FIX DISPLAY BNE D#10,VCY(R5) DEC R0 BNE DEFRC2 BIC #6,VCSTAT(R5) ;SLOW INTENSITY ON Y .ENDC .IFDF AR11$ MOV #14,VCSTAT(R5) ;INTENSIFYE14B .ENDC JMP DERTN ;NO DFXCV: MOV #DFXCT3,R4 ;SET UP PRINTER TO STORAGE ;POINTER TABEQ MOV #DEDIT1,R1 ;DO STOP VR14$ JSR PC,DISET .ENDC .IFDF GT40$ MOVB #1,DISSKP(R1) ;SET TO RECAL. DISP. JSR PC,GTSET .ENDC DE60: MOV DEPOT1,R0 ON X OR Y MOV #4,R0 ADD #-10,VCX(R5) DEFRC1: TSTB VCSTAT(R5) ;WAIT BPL DEFRC1 ADD #4,VCX(R5) DEC R0 BNE DEFRC1 ;ADD POT 1 VALUE TO LOWER CMP R0,DESWP1 ;TEST IF POT1 CHANGED BEQ DE9 MOV R0,DESWP1 ;SAVE NEW VALUE ASL R0 ;Y VALUE DIMOV #4,R0 DEFRC3: TSTB VCSTAT(R5) BPL DEFRC3 BIC #4,VCSTAT(R5) ;INTENSIFY ON Y ADD #-10,VCX(R5) ADD #-10,VCY(R5) DEFRSPLAY SUB DEOFYD,R0 MOV DELST+2,R1 MOV R0,DISOFY(R1) MOV R1,R0 ;CALL DISPLAY SETUP .IFDF VR14$ JSR PC,DISET .ENDCC2: TSTB VCSTAT(R5) BPL DEFRC2 ADD #4,VCY(R5) DEC R0 BNE DEFRC2 DEFRC4: TSTB VCSTAT(R5) BPL DEFRC4 .ENDC RTS PC .IFDF GT40$ MOVB #1,DISSKP(R1) ;SET TO RECAL DISP. JSR PC,GTSET .ENDC ;MOVE DISPLAYS HORIZONTALLY FOR BOTH ;DSP A .ENDC DE29JJ: JMP DERTN .IFNDF DA$5 & DA$11 DE14: BR DE29JJ .ENDC .IFDF DA$5 .IFDF VR14$ ;SHOW FREE CURSORS DND DOV COMMAND DE9: CMP DEPOT3,DESWP3 ;THIS IS THE SAME AS AT DE10. BEQ DE10J MOV DEPOT3,R0 MOV R0,DESWP3 .IFDF LPS11E14: MOV LPSSAD,R5 ;GET LPS STATUS ADDRESS MOV #10,VCSTAT(R5) ;SET DISPLAY TO ;INTENSIFY ON Y LOAD MOV DEPOTS,VCX(R5) ;$&VR14$ ASR R0 ;HORIZ WINDOW ALWAYS ASSUMES A ASR R0 ;10 BIT POT VALUE .ENDC NEG R0 ADD #1777,R0 MOV DES1S3,R1 BLOAD LEFT CURSOR MOV DEPOT2,R2 MOV R2,VCY(R5) JSR PC,DEFRCU MOV DEPOT1,VCX(R5) ;LOAD RIGHT CURSOR CMP DEPOTS,DEPOT1 ;REQ DE11 DE12: ASL R0 DEC R1 BNE DE12 DE11: CMP R0,DES1L3 BLO DE13 MOV DES1L3,R0 DE13: MOV #DEDIT2,R1 MOV R0,DISST(RIGHT CURSOR IS ALWAYS BLO DE15 ;TO THE RIGHT OR LEFT MOV DEPOTS,DEPOT1 MOV DEPOTS,VCX(R5) DE15: MOV DEPOT3,R2 MOV R2,V1) MOV R1,R0 ;PASS ADD. OF DISPLY TABLE .IFDF VR14$ JSR PC,DISET ;CALL DISPLAY TO SET START ADD. .ENDC .IFDF GT40$ CY(R5) JSR PC,DEFRCU ;SHOW FREE CURSOR .ENDC .ENDC .IFDF GT40$ .IFDF DA$5!DA$11 DE14: CMP DEOLDP,DE4POT ;TEST IF POTSMOVB #1,DISSKP(R1) ;SET RECALC FLAG JSR PC,GTSET MOVB #-1,GTRCAL ;DON'T CHANGE SIZE OF DISP BUF. .ENDC .ENDC ;MOVE TOP CHANGED BEQ DE29JJ .ENDC .IFDF DA$11 TST DEOLDP ;UPDATAE FIX CURSOR DISPLAY ;IF 0,1ST TIME UP ON FREE POSITION DISPLAY VIA SINGLE DISPLAY CODE DE10J: JMP DE10 .ENDC .IFDF VR14$ ;SUBROUTINE TO DISPLAY A FREE CURSOR DEFRCU: TSTB BEQ DFXCV0 TSTB DEFLG1+1 ;TEST FOR FREE CURSORS .IFDF DA$5 BNE DE14B .ENDC .IFNDF DA$5 BEQ DFXCV0 JMP DERTN .ENDVCSTAT(R5) ;WAIT FOR SLEW TO CURSOR BPL DEFRCU .IFDF LPS11$ MOV #16,VCSTAT(R5) ;FAST INTENSITY ON X OR Y MOV #10,R0 C DFXCV0: TSTB DEDI1C ;TEST FOR FIX CURSORS BNE DFXCV6 TSTB DEDI2C BEQ DFXCVE DFXCV6: TSTB DEGFXF ;TEST TO SHOW FIX ;STORE F.P. VALUE MOV (R0),DFXCTB+2 BR DFXCV2 DFXCV1: ADD DISYBU(R1),R0 ;GET S.P. VALUE AND FLOAT IT JSR PC,SAVARG MMULT MOV R5,DEDCVZ ;SAVE T*N MOV @(R2)+,R0 BIC #40000,R0 MOV R0,DEDCVZ+2 ;SAVE POT VALUE JSR PC,SAVARG MOV DISST(R1)OV (R0),-(SP) JSR R4,$POLSH $IR,.+2 MOV (SP)+,DFXCTB ;STORE FLOATED VALUE TO OUTPUT MOV (SP)+,DFXCTB+2 JSR PC,RSTARG ,-(SP) ;PUT ST+1 ON STACK INC (SP) ;AND FLOAT JSR R4,$POLSH $IR,.+2 MOV DEDCVZ+2,-(SP) ;FLOAT POT VALUE JSR R4,$POLSHDFXCV2: MOV #DFXCT5,R0 ;CONVERT NUMBER AND STORE MOV (R4)+,R5 ;IN DISPLAY BUFFER MOV #DEDCVZ,FORBUA ;SET TEMPORARY BUFFER $IR,.+2 MOV DEDCVZ,-(SP) ;FLOAT T*N JSR R4,$POLSH $IR,.+2 MOV DEDXSZ,-(SP) ;FLOAT SCOPE SIZE AND JSR R4,$POLSH ;DO JSR PC,DFXCS ;CALCULATE DECIMAL PLACES JSR PC,FORMAB ;FOR FORMAB MOV #TTYBUF,FORBUA ;RESTORE REGULAR BUFFER DEC R3 ;TEST CALCULATION $IR,$DVR,$MLR,$ADR,.+2 MOV (SP)+,DFXCTB ;STORE NUMBER TO OUTPUT MOV (SP)+,DFXCTB+2 JSR PC,RSTARG MOV (R3)+OF 2 CURSOR DONE BNE DFXCV3 BR DFXCV4 ;YES, TEST FOR SINGLE DISPLAY .ENDC .IFDF DA$5 DE14B: MOV DEPOTS,R0 ;LOAD LEFT,R5 ;SET BUFFER ADDRESS MOV #DFXCT5,R0 ;AND COMMAND TABLE MOV #DEDCVZ,FORBUA ;SET TEMP BUFFER FOR FORMAB JSR PC,DFXCS JSOR SINGLE DISPLAY BR DFXCV5 DFXCV4: CMPB #1,DEFLG1 ;TEST FOR SINGLE DISPLAY BEQ DFXCVE CMP R1,#DEDIT2 ;TEST IF DUAL OUT X CURSOR ADD #40000,R0 MOV R0,DEGXL MOV DEPOT2,R3 ;LEFT Y CURSOR VALUE CMP R3,DEDYSZ ;TEST IF POT VALUE IS BLE DE14A PUT DONE. BEQ DFXCVE MOV #DEDIT2,R1 ;DO BOTTOM DISPLAY DFXCV5: MOV R1,R2 ;CALCULATE POINTER TO CURSOR ADD #DISXC1,R2 ;OU ;ABOVE SCREEN TOP MOV DEDYSZ,R3 ;SAVE VALUE IN R3 DE14A: MOV R3,DEGYL CMP DEPOTS,DEPOT1 ;TEST IF LEFT CURSOR TO LEFT OR RITPUT MOV #2,R3 ;X POSITION =(T-CURSOR VAL)*N+S+1 DFXCV3: MOV DIST(R1),R0 ;GET # OF POINTS TO DISPLAY SUB (R2)+,R0 ;SUGHT CURSOR. BLO DE15 MOV DEPOTS,DEPOT1 DE15: MOV DEPOT1,R0 ;LOAD RIGHT X ADD #40000,R0 MOV R0,DEGXR MOV DEPOT3,R2 ;LOBTRACT CURSOR OUTPUT POSITION FROM MOV DISN(R1),R5 ;# OF POINTS AND MULT. RESULT JSR PC,MULT ;BY THE TABLE DELTA INC R5 AD RIGHT Y VALUE CMP R2,DEDYSZ ;TEST IF POT VALUE IS BLE DE15A ;ABOVE SCREEN TOP MOV DEDYSZ,R2 ;SAVE VALUE IN R2 DE15A: ;ADD ONE, AND START POSITION ADD DISST(R1),R5 ;TO GET POSITION OF PT. IN BUFFER MOV R5,DFXCTA ;STORE COMMAND TABLE MOV (R4MOV R2,DEGYR ;ROUTINE TO DISPLAY THE FREE CURSOR VALUES ON THE GT-40 ;X IS POSITION IN BUFFER, Y THE RELATIVE POT VALUE TO D),R0 ;STORE SPACE IN DISPLAY MOV #20040,(R0)+ ;BUFFER MOV #20040,(R0)+ MOV #20040,(R0) MOV (R4)+,R5 ;STORE OUTPUT BUFFEATA. .IFDF DA$10 TSTB DEFLG1+1 ;TEST FOR FREE CURSORS BNE DFCV7 JMP DFCVE DFCV7: TSTB DEGCUF ;TEST TO DISPLAY FREE VALR MOV #DFXCT4,R0 ;AND COMMAND TABLE ADDRESS JSR PC,FORMAB ;FOR THE CONVERSION MOV DFXCTA,R0 ;GET X POSITION AND DEC R0 UES. BEQ DFCVE ;NO. MOV #DFCVT2,R3 ;SET UP TABLE POINTERS MOV #DFCVT4,R2 MOV DEONE,R1 DFCV6: TST (R3) ;TEST IF DONE ASL R0 ;CALCULATE BUFFER ADD. CMP #-2,DISTYP(R1) ;TEST FOR F.P. BNE DFXCV1 ASL R0 ADD DISYBU(R1),R0 MOV (R0)+,DFXCTB BEQ DFCVE ;CALCULATE X POSITION =((POT*T*N)/SCOPE SIZE)+ST+1 MOV DIST(R1),R0 ;CALCULATE T*N MOV DISN(R1),R5 JSR PC, DISMPO+6(R1),6(SP) MOV DISMPO+4(R1),4(SP) MOV DISMPO+2(R1),-(SP) MOV DISMPO(R1),-(SP) JSR R4,$POLSH $DVR,$ADR,.+2 DFDISPLAY A LINE BNE DE59 ;YES, SHOW DISPLAY JMP DERTN DE59: .IFDF VR14$ CMP DEOLDP,DE4POT ;TEST IF POTS CHANGED BNE DELCV5: MOV (SP)+,DFXCTB ;STORE VALUE TO OUTPUT MOV (SP)+,DFXCTB+2 JSR PC,RSTARG ;RESTORE REGISTERS MOV (R3)+,R5 ;STORE BUFFE1 JMP DE27 DEL1: .ENDC ;ROUTINE TO DRAW A STRAIGHT LINE VIA 3 ;VECTORS, VEC 1 LEFT PART, VEC 2, BETWEEN CURSORS ;VER MOV #DFXCT5,R0 ;COMMAND TABLE JSR PC,DFXCS JSR PC,FORMAB ;CONVERT DATA BR DFCV6 DFCVE: MOV #FORBUF,FORBUA ;RESTORE C 3 RIGHT PART. .IFDF GT40$ MOV DEPOTS,R0 ;SET X1 POSITION MOV R0,DEGLX1 MOV DEGYL,R1 MOV R1,DEGLX1+2 ;SET Y1 POSITIONOUTF'S BUFFER. BR DFXCSE .ENDC .ENDC .IFDF DA$10!DA$11 ;SUBROUTINE TO CALCULATE THE # OF DECIMAL ;PLACES FOR A NUM FOR VEC 1 MOV R0,DEGLX3 ;SET X1, Y1 POSITION FOR VEC 2 MOV R1,DEGLX3+2 CLR DELNB ;CHAR -DY FLAG DX=0 FLAG MOV DEPOT1,RBER. 0.LE.N.LT.10 IS OUTPUT ;AS X.XXXXXX, 10.LE.N.LT.100 IS THE OUTPUT AS ;XX.XXXXX ETC. LIM=10,100,1000 ETC. DFXCS: JSR PC0 ;X2 SUB DEPOTS,R0 ;DX=X2-X1 MOV R0,R4 ;SAVE DX BNE DEL1 INCB DELNB ;SET DX=0 FLAG DEL1: MOV DEGYR,R5 SUB DEGYL,R5,SAVARG ;SAVE ALL REGISTERS MOV #6,DEDCVZ ;SET DECIMAL PLACES = 6 CLR -(SP) ;PUT 10. ON STACK MOV #41040,-(SP) MOV 2(SP ;DY=Y2-Y1 BPL DEL2 INCB DELMDY ;SET -DY FLAG NEG R5 DEL2: MOV R0,R1 ADD #40000,R1 MOV R1,DEGLX4 ;DX FOR VECTOR 2 ),-(SP) ;COPY IT FOR LIM STACK = LIM,10 MOV 2(SP),-(SP) DFXCS2: MOV 2(SP),-(SP) ;COPY LIM; STACK= MOV 2(SP),-(SP) ;LIM,LIM,MOV R5,R1 TSTB DELMDY ;TEST FOR NEG DY BEQ DEL3 ADD #20000,R1 DEL3: MOV R1,DEGLX4+2 ;DY FOR VECTOR 2 JSR PC,DIVR ;DIV10 MOV DFXCTB+2,-(SP) ;PUT NUMBER ON STACK MOV DFXCTB,-(SP) ;STACK=N,LIM,LIM,10 BIC #100000,(SP) ;KEEP VALUE POSITIVE JSIDE R5=DY BY R0=DX MOV R0,DEDELY ;DELTA Y MOV R5,DIVDNH ;DIVIDE REMAINDER BY DX CLR R5 CLR DIVDSH MOV R4,R0 JSR PC,DR PC,FORMAB ;CONVERT AND STORE NUMBER. ;SCALE Y VALUE = (POT-DISOFY)*2**SCALE=Y(S.P.) ;IF F.P. SET Y VALUE = (Y(S.P.)/MULT)+R R4,$POLSH $CMR ;CMP LIM, N AND BRANCH .+2 ;IF LIM.GT.N, STACK=LIM,10 BGT DFXCS1 DEC DEDCVZ ;SET # OF DECIMAL PLACOFFSET MOV @(R2)+,R0 ;GET Y POT VALUE SUB DISOFY(R1),R0 ;SUB. OFFSET (S.P.) MOVB DISSC(R1),R5 ;TEST FOR S.P. SCALE BEQ DES=1 LESS. BEQ DFXCS1 ;DONE IF 0 DECIMAL PLACES MOV 2(SP),-(SP) ;COPY LIM MOV 2(SP),-(SP) MOV 12(SP),6(SP) ;COPY TEN FCV2 BMI DFCV3 DFCV4: ASR R0 ;POSITIVE SCALE NUMBER DEC R5 BNE DFCV4 BR DFCV2 DFCV3: ASL R0 ;NEG SCALE NUMBER INMOV 10(SP),4(SP) ;STACK=LIM,10,10 JSR R4,$POLSH ;MULTIPLY LIM*10=LIM $MLR,.+2 ;STACK=LIM,10 BR DFXCS2 DFXCS1: ADD #10,C R5 BNE DFCV3 DFCV2: JSR PC,SAVARG ;SAVE ALL REGISTERS MOV R0,-(SP) ;FLOAT Y S.P. VALUE JSR R4,$POLSH $IR,.+2 MOV 12SP ;DONE POP LIM, 10 OFF STACK ADD #200,DEDCVZ ;SET COMMAND TABLE MOVB DEDCVZ,DFXCT5+1 ;WORD FOR DECIMAL PLACES ;TO OU(SP),R1 ;TEST FOR F.P. CMP #-2,DISTYP(R1) BNE DFCV5 ;NO MOV 2(SP),-(SP) ;DO (Y(S.P.)/MULT)+OFFSET MOV 2(SP),-(SP) MOVTPUT #. JSR PC,RSTARG ;RESTORE REGISTERS RTS PC DFXCSE: .ENDC .ENDC .IFDF DA$5 .IFDF DA$6 TST DEFLG2 ;TEST TO EQ DEL13 DEL15: MOV DEDELY,R3 ADD DEDLYF,R2 ADC R3 ;R3 IS DELTA Y ADD 2(R5),R0 ;CHANGE X BY 1. BR DEL10 DEL11: TST TANDARD DELTA X SUB R3,R2 ;DY BPL DE16 NEG R2 ;NEGATIVE DY INCB DELMDY ;SET MINUS DY FLAG DE16: MOV R1,R0 MOV R3,RR3 ;TEST IF DELTA Y DONE BEQ DEL7 ;BRANCH IF YES TSTB DELMDY ;CHANGE Y UP OR DOWN BEQ DEL8 ;DEPENDING ON THE SLOPE A5 JSR PC,MULT MOV R5,R3 MOV R0,R4 ;Y1*DX=R4, R3 MOV DEPOTS,R0 MOV R2,R5 JSR PC,MULT ;X1*DY=R0,R5 TSTB DELMDY ;TDD 4(R5),R1 BR DEL9 DEL8: ADD 2(R5),R1 DEL9: DEC R3 ;DECREMENT DATA Y COUNT DEL10: TST R1 ;TEST FOR Y AT END SCREEN BLEEST FOR NEG. DY BEQ DE52 ;BR ON POS. ADD R5,R3 ;ADD ABSOLUTE VALUES TO GET ADC R4 ;RESOULTENT SUBTRACTION ADD R0,R4 DEL6 CMP DEDYSZ,R1 BGT DEL11 DEL6: MOV DEDELY,R4 ;TEST IF MOST OF DELTA Y ASR R4 ;WAS TAKEN UP WITH THE CMP R3,R4 ;D;OF POS. MINUS A NEG NUMBER BR DE17 ;DIVIDE BY DX DE52: SUB R5,R3 SBC R4 SUB R0,R4 ;Y1*DX-X1*DY=R4,R3 BPL DE17 INCBELTA X BLT DEL13 ADD 4(R5),R0 BR DEL14 DEL13: TSTB DELNB ;TEST FOR DX=0 ON EDGE BNE DEL15 DEL14: MOV @6(R5),R2 ;SET DELNB ;WHEN X=0 Y IS NEGATIVE NEG R3 ;NEGATE VALUE ADC R4 NEG R4 DE17: MOV R1,R0 ;DIVIDE Y1*DX-X1*DY MOV R4,DIVDNH DATA X FOR VECTOR SUB R0,R2 TST 0(R5) ;TEST FOR VECTOR 3 BEQ DEL19 NEG R2 DEL19: ADD 12(R5),R2 MOV R2,@14(R5) MOV ;BY DX MOV R3,R5 CLR DIVDSH JSR PC,DIVD ;B=R0 ;NOTE Y0 COULD BE ROUNDED UP AS A ;FUNCTION OF THE REMAINDER TO THE AB @10(R5),R2 ;SET DELTA Y FOR VECTOR SUB R2,R1 TSTB DELMDY ;TEST FOR NEG DY BNE DEL18 TST 0(R5) ;TEST FOR VECTOR 1 OR 3OVE DIVIDE. ;OR THE FRACTIONAL PART=R/DX STORED IN R2 ;AS THE INITIAL VALUE OF Y BELOW AT DE26. DE19: CLR DEX0 ;STORE INIT BEQ DEL17 BR DEL16 DEL18: TST 0(R5) BEQ DEL16 DEL17: NEG R1 ;SET DY BIS #20000,R1 DEL16: MOV R1,@16(R5) RTS PC IAL X AND Y TSTB DELNB ;VALUES FOR THE STRAIGHT LINE BEQ DE18 ;THESE VALUES WILL BE NEG R0 ;CHANGED IF NOT IN THE SCOPE DELTA2: 1777,1,-1,DEPOT1,DEGYR,40000,DEGLX5,DEGLX5+2 DELTA1: 0 ;0 -1 ;2 1 ;4 DEPOTS ;6 DEGYL ;10 60000 DE18: MOV R0,DEY0 ;RANGE DE21: MOV R2,R0 ;DELTA X=41. .IFDF VR14$ MOV #41.,R5 ;SET DELTA Y=(DY*41.)/DX .ENDC JSR P ;12 DEGLX2 ;14 DEGLX2+2 ;16 .ENDC ;RECALCUALTE STRAIGHT LINE ;Y=MX+B, Y1=(DY/DX)X1+B, B=(Y1*DX-X1*DY)/DX ;SET IC,MULT MOV R0,DIVDNH MOV R1,R0 CLR DIVDSH JSR PC,DIVD MOV R0,DEDELY ;DELTA Y INTEGER MOV R5,DIVDNH ;CALCULATE FRACTINITIAL VALUES X0=0, Y0=B .IFDF VR14$ CLR DELNB ;CLEAR ;B AND -DY FLAGS MOV DEPOT1,R1 SUB DEPOTS,R1 ;DX BNE DE5ONAL CLR R5 ;DELTA Y MOV R1,R0 CLR DIVDSH JSR PC,DIVD TSTB DELMDY ;TEST FOR NEG SLOPE BEQ DE26 NEG R0 ;YES NEGAIVD MOV R0,DEDLYF ;FRACTIONAL DELTA Y MOV #DELTA1,R5 ;CALCULATE VECTOR 1 JSR PC,DELS MOV #DELTA2,R5 ;CALCULATE VECTOR 2 5 ;TEST FOR 0 DX. MOV DEPOTS,DEX0 ;SET INITIAL X CLR DEY0 ;SET INITIAL Y MOV #41.,DEDELY ;SET DELTA Y CLR DEDLYF ;CLR JSR PC,DELS JMP DERTN DELS: MOV @6(R5),R0 ;GET X MOV @10(R5),R1 ;GET Y CLR R2 DEL7: CMP 0(R5),R0 ;TEST IF X AT END B DELTA Y FRACTION CLR DEDELX ;CLR DELTA X MOV #100.,DEDRBS ;SET #PTS JMP DE27 ;DISPLY LINE DE55: MOV #41.,DEDELX ;SET S1,R4 ;ADD DELTA Y ADD DEDELX,VCX(R5) ;ADD DELTA X MOV R4,VCY(R5) ;STORE NEW Y DE2A8: TSTB VCSTAT(R5) BPL DE2A8 DEC R0 TE DELTA Y VALUE ADC DEDELY NEG DEDELY DE26: MOV R0,DEDLYF ;STORE DELTA Y FRACTION MOV DEDELY,R1 ;SET DELTA Y=R1, R0 M ;TEST IF DONE. BNE DE28 .ENDC .ENDC .ENDC DERTN: RTS PC ;A/D POT INTERRUPT READ ROUTINE DEPOTR: MOV R0,-(SP) MOVOV DEY0,R3 ;Y=R3,R2 CLR R2 CLR R4 ;X=R4 CLR R5 ;GOOD DATA FLAG CLR DEDRBS ;NUMBER OF POINTS IN LINE COUNT DE24: TST R1,-(SP) MOV LPSSAD,R1 .IFDF LPS11$ MOV #1,@LPSSAD ;START A/D .ENDC .IFDF AR11$ .IFNDF ARPOL$ MOV #20001,@LPSSAD R3 ;TEST IF Y IS OUT OF BOUNDS BMI DE22 ;YES WAS NEG. .IFDF VR14$ .IFDF LPS11$ CMP #7777,R3 ;TEST IF TOO BIG .ENDC ;UNIPOLAR DATA .ENDC .IFDF ARPOL$ MOV #1,@LPSSAD ;BIPOLAR DATA .ENDC .ENDC DEPOTH: TSTB @LPSSAD ;WAIT FOR A/D BP .IFDF AR11$ CMP #1777,R3 .ENDC .ENDC BLO DE22 ;YES .IFDF VR14$ .IFDF LPS11$ CMP #7777,R4 ;TEST IF X TOO BIG .L DEPOTH ADD #400,@LPSSAD ;SET TO NEXT CHANNEL MOV ADBUF(R1),R0 ;READ VALUE,AND 0 TWO LOWER BITS. .IFDF LPS11$ CMP R0,#7ENDC .IFDF AR11$ CMP #1777,R4 .ENDC .ENDC BLO DE22 INC R5 ;SET GOOD DISPLAY DATA FLAG INC DEDRBS ;COUNT GOOD DAT777 BEQ DEPOOT BIC #3,R0 ;GET RID OF POT 'JITTER' BITS DEPOOT: .IFDF GT40$ ASR R0 ;USE ONLY 10 BITS ASR R0 .ENDC A PAIRS BR DE23 DE22: TST R5 ;TEST IF GOOD DATA WAS FOUND BNE DE27 ;YES THEN DONE .IFDF VR14$ DE23: ADD #41.,R4 ;GET .ENDC CMP R0,@DEPOTA BNE DEPOTF CLR @DEPOTE BR DEPOTG DEPOTF: INC @DEPOTE CMP DEPTCC,@DEPOTE ;REACHED SET # OF JITTNEXT X,Y VALUE .ENDC ADD R0,R2 ADC R3 ADD R1,R3 DE25: TST R5 ;TEST IF GOOD DATA FOUND BNE DE24 ;YET, BRANCH IF YES ER TRIALS? BNE DEPOTG ;NO CLR @DEPOTE ;YES MOV R0,@DEPOTA ;STORE POT VALUE DEPOTG: ADD #2,DEPOTA ADD #2,DEPOTE DEC MOV R4,DEX0 ;LAST INITIAL X,Y WERE MOV R3,DEY0 ;OUT OF RANGE, TRY BR DE24 ;CURRENT X,Y VALUES AS X0,Y0 ;SHOW STRAIGHDEPOTC ;TEST IF 4 POTS READ. BNE DEPOTB CLR @LPSSAD ;IF SO STOP. MOV (SP)+,R1 MOV (SP)+,R0 RTS PC DEPOTB: INC @LPSST LINE DISPLAY DE27: TST DEFLG2 ;TEST FOR STRAIGHT LINE BNE DE27A JMP DERTN DE27A: MOV LPSSAD,R5 ;GET LPS STATUS REGISTERAD ;NO READ NEXT POT. BR DEPOTH ;SUBROUTINE ;CALCULATE DISPLAY WINDOW LIMIT ;TO BE RESET WHEN N OR T IS CHANGED. ;OR A MOV #10,VCSTAT(R5) ;DISPLAY THE FIRST POINT MOV DEX0,VCX(R5) MOV DEY0,R4 ;SET UP DELTA Y TO SHOW MOV R4,VCY(R5) ;REST DISPLAY IS CHANGED, DISTROYS R0,R5,R2,R1. DESM10: MOV DISBUF(R1),R2 ;GET BUFFER SIZE DESM11: CLR R5 ;CALCULATE NUMBER OF MOOF POINTS. MOV DEDRBS,R0 DEC R0 BEQ DERTN MOV DEDELY,R1 ;SET DELTA Y, DELTA Y FRACTION MOV DEDLYF,R2 CLR R3 MOV #1V #1777,R0 ;SHIFTS NECESSARY TO GET DESM13: CMP R0,R2 ;POT VALUE GREATER THAN BHI DESM12 ;MAX S-1 VALUE,STORE ASL R0 ;IN2,VCSTAT(R5) ;SET TO FAST INTENSIFY DE2B8: TSTB VCSTAT(R5) BPL DE2B8 DE28: ADD R2,R3 ;ADD DELTA Y FRACTION ADC R4 ADD R R5 INC R5 BR DESM13 DESM12: RTS PC .END N RT11$ IS DEFINED. ;TTYR$1 H/S PUNCH AVAILABLE ;TTYR$2 LPT AVAILABLE .IFNDF RT11$ ! CAPS$ RT11$=1 .ENDC ;GLOBAL S UNTIL THE BUFFER IS FULL OR A ;C.R. IS READ. IF A NULL IS READ AFTER DATA, THE NULL ;IS TREATED AS A C.R., LEADING NULLS ARYMBOLS ;INTERNAL GLOBALS .GLOBL TYPCH,CRLF,TYPMS .GLOBL TTYTST,TTYITY,TTYBUF .GLOBL TTYBUT,TTYBUB,TTYICH,TTYOCH,TTYBFF,TTE IGNORED. ;THE LINE FEED, INSERTED BY RT-11, AFTER A C.R. IS ;DELETED BY THE ROUTINE AND IS NOT PUT IN THE USER'S BUFFER. YELF .GLOBL TTYBFA,TTYCON,TTYCVA,TTYECH,TTYEOL ;EXTERNAL GLOBALS .GLOBL SAVARG,RSTARG ;REGISTER DEFINITION R0=%0 R1=%;OUTPUT USAGE ;OUTPUT IS MADE TO THE TERMINAL, EITHER ;ONE CHARACTER AT A TIME OR A MESSAGE. THE OUTPUT CAN ;GO TO THE TTY, 1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;STATUS REGISTERS PRS=177550 PRB=177552 PPS=177554 PPB=177556 LPS=177514 LPLPT, OR H/S PUNCH, A CHARACTER AT A TIME, ;INTERRUPTS OFF. ;TO OUTPUT A CHARACTER, PUT IT IN R0 AND CALL TYPCH ;JSR PC,TYPCH .TITLE TTYR11 ;LAB APPLICATIONS-11 TERMINAL INTERRUPT ROUTINE ;DEC-11-SLABA-C-LA6 ;FILENAME TTYR11.MAC ;FILE ID TTYR11.1 .CB=177516 ;RT-11 MACRO CALLS .IFDF RT11$ .MCALL .TTINR,.RCTRLO,.TTYOUT .ENDC ;ROUTINE USAGE ;THIS ROUTINE INTERFASECT TTYR11 ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LCES A USER ROUTINE TO RT-11 I/O. ;ON INPUT, IT READS CHARACTERS FROM RT-11 TO A ;USER BUFFER. IT CHECKS FOR CARRIAGE RETURN, ICENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THICONTINUATION ;CHARACTER, AND USER BUFFER FILLUP ;IF THE BUFFER FILLS UP, AN OPTIONAL USER ADDRESS CAN BE ;JUMPED TO ;CHARACTS SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ERS CAN BE READ FROM THE TERMINAL OR THE H/S READER. ;ON OUTPUT THE ROUTINE OUTPUTS A CHARACTER OR A MESSAGE ;TO THE TERMINAON SUCH SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIL, H/S PUNCH OR LINEPRINTER. ;INPUT USAGE ;JSR PC,TTYITY ;CALL TTYITY TO INITIALIZE INPUT FROM THE TERMINAL OR H/S READER. ;N IN DEC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMEFOR THE TERMINAL INPUT IS INITIALIZED, FOR THE H/S READER ;A LINE IS READ OR A BUFFER FILLED ;JSR PC,TTYTST ;CALL TTYTST TO TNT BY DIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENTEST IF A LINE IS IN. FOR THE TERMINAL IF ;A LINE IS IN, IT IS TRANSFERRED TO THE USER'S BUFFER. FOR ;H/S READER THE LINE IS WHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;RT11$ IF DEFINED,READ BY TTYITY. ;A LINE IS COMPLETE ON THE TEMINAL WHEN THE USER INPUTS ;A CARRIAGE RETURN. HOWEVER IF THE LINE FILLS UP THE RT-11 IS THE OPERATING SYSTEM. ;CAPS$ IF DEFINED, CAPS-11 IS THE OPERATING SYSTEM. ;IF NEITHER RT11$ OR CAPS$ ARE DEFINED THE ;USER'S BUFFER THE FULL BUFFER FLAG IS SET AND THE ;REST OF THE LINE IS LEFT IN THE RT-11 BUFFER. THE ;H/S READER IS FETCHED ;IF IT IS DESIRED TO HAVE A SPECIAL CHARACTER TO SPECIFY ;THAT THE CURRENT LINE IS TO BE CONTINUED ON THE NEXT ;LINE, THAT CH11'S LINE FEED. .ENDC TYTS3: .IFDF CAPS$ MOV TTYBUT,R0 ;TTY BUFR ADDR MOV R0,R1 ;COPY IT ADD #-3,R0 ;PTR TO BYTE STARACTER IS PUT IN TTYCVA AND WHEN ;FOUND THE BYTE TTYCON IS SET 1. ;VARIABLES TTYICH: .BYTE 0 ;INPUT FLAG=0 FOR TERMINALATUS BITB #3,(R0)+ ;LINE TOO LONG? BEQ TYTS3D ;NO TYTS3E: MOVB (R1)+,R2 ;GET CHAR CMP #12,R2 ;IS IT A LF ? BEQ TYTS3F INPUT ; =-1 FOR H/S READER INPUT TTYOCH: .BYTE 0 ;OUTPUT FLAG=0 FOR TERMINAL OUTPUT ; =1 FOR LPT ; =-1 FOR ;YES CMP #14,R2 ;MAYBE A FORM FEED ? BNE TYTS3E ;NOPE,TRY NXT CHAR TYTS3F: MOVB #15,-(R1) ;REPLACE LF OR FF WITH CR IH/S PUNCH. TTYBFF: .BYTE 0 ;BUFFER FULL FLAG=1 WHEN FULL TTYELF: .BYTE 0 ;LINE COMPLETE FLAG=1 WHEN LINE IN ;BOTH=0 OTHERWNCB TTYBFF ;BUFFER FULL SET FLAG TST TTYBFA ;TEST FOR BUFFER FULL JMP BEQ TYTS3C ;ADDRESS MOV TTYBFA,20(SP) ;STORE ADDRISE TTYCON: .BYTE 0 ;CONTINUATION FLAG=1 IF THE CONTINUATION CHAR IS ;IS INPUT, 0 OTHERWISE. TTYCVA: .BYTE 0 ;CONTINUATION IF AVAILABLE BR TYTS2 TYTS3D: MOV (R0),R0 ;BYTE COUNT TYTS3A: CMPB (R1)+,TTYCVA ;LOOKING FOR CONTINUTION CHAR BEQ TYTS3B CHARACTER. TTYECH: .BYTE 0 ;ECH/NO ECHO FLAG - NOT USED BY THIS ROUTINE TTYEOL: .BYTE 15 ;TTYEOL ALSO NOT USED BY THIS ROUTIN ;FOUND ONE DEC R0 ;SEARCHED ALL OF BUFR? BNE TYTS3A ;NO BR TYTS3C ;YES TYTS3B: INCB TTYCON ;SET CONTINUATION FLG E ;KEPT FOR COMPATIBILITY WITH OTHER TTY ROUTINE ;ROUTINE TO TEST IF A LINE IS IN ;JSR,PC,TTYTST ;NO DATA RETURN .ENDC TYTS3C: ADD #2,20(SP) ;EXIT, VIA SUCESS EXIT BR TYTS2 ;INPUT INITIATION ROUTINE, TO GET A LINE OF INPUT. ;JSR PC, ;TO OUTPUT A MESSAGE, PUT THE ADDRESS OF THE MESSAGE IN ;R0 AND CALL TYPMS ;JSR PC,TYPMS ;THE MESSAGE HAS ONE CHARACTER PER TTYTST: TSTB TTYICH ;TEST FOR H/S READER INPUT. BPL TYTS4 TST TTYBFF BEQ TYTS5 ADD #2,(SP) ;BYPASS NO DATA BR TYTS5: BYTE ENDED BY A 0. ;A CARRIAGE RETURN LINE FEED CAN BE OUTPUT BY ;CALLING CRLF ;JSR PC,CRLF ;BUFFER: ;THE USER PROGRAM MURTS PC TYTS4: JSR PC,SAVARG ;TERMINAL INPUT .IFDF CAPS$ TST CAPFLG ;HAS A READ BEEN INITIALIZE? BNE TYTS4A ;YES MOV TST DEFINE A BUFFER NAMED TTYBUF ;AND SET IT GLOBAL. THE DEFAULT SIZE IS 72 CHARACTERS. ;TO CHANGE THE BUFFER SIZE, STORE THE LTYBUT,TTYIT0 ;NO THEN DO IT ADD #-6,TTYIT0 IOT .BYTE 5,3 ;KBRD READ TTYIT0: 0 ;BUF HDR ADDR INC CAPFLG ;SAYS THAT AST LOCATION ;OF THE BUFFER IN TTYBUB ;INPUT-OUTPUT TYPE: ;TTYICH, TTYOCH DETERMINE THE INPUT OR OUTPUT DEVICE, ;SET AS SHREAD WAS INIT TYTS4A: IOT .BYTE 3,3 ;KBRD WAIT RETURN TYTS2 ;BUSY RTN-DATA NOT AVAILABLE BR TYTS3 ;DATA IS IN BUFR OWN BELOW ;TTYBFF IS SET WHEN THE INPUT BUFFER IS FULL. ;TTYELF IS SET WHEN AN END OF LINE IS FOUND. ;IF WHEN A BUFFER FILL.ENDC .IFDF RT11$ .TTINR ;GET FIRST VALUE. BCC TYTS1 ;CARY SET IF LINE NOT AVAILABLE. .ENDC TYTS2: JSR PC,RSTARG RS UP, THE USER WISHES TO JUMP ;TO A LOCATION, THE ADDRESS OF THE LOCATION SHOULD BE ;STORED IN TTYBFA. ;LINE CONTINUATION: TS PC .IFDF RT11$ TYTS1: JSR PC,TTYGTC ;GET REST OF THE LINE TSTB TTYELF ;TEST FOR C.R. BEQ TYTS3 .TTINR ;READ RT-.IFDF TTYR$1 JSR PC,SAVARG ;H/S READER CLR PRS TTYIT3: INC PRS ;READ INPUT CLR R0 TTYIT2: BIT #100200,PRS ;TEST IF DONE .IFDF TTYR$2 BGT TYPCH3 ;OR LPT .ENDC .IFDF TTYR$1 BLT TYPCH2 .ENDC .IFDF CAPS$ IOT .BYTE 3,2 ;KBRD WRITE-W OR ERROR. BEQ TTYIT2 BMI TTYIT4 ;BRANCH ON ERROR MOV PRB,R0 ;TEST IF NULL BEQ TTYIT3 ;SKIP IF SO TTYIT4: JSR PC,TTYAIT .-4 MOVB R0,CAPSDA ;OUTPUT TO TTY IOT .BYTE 4,2 ;KBRD WRITE CAPSBU .ENDC .IFDF RT11$ .TTYOUT ;OUTPUT TO TGTC ;READ DATA INTO USER'S BUFFER. BR TYTS2 .ENDC ;SUBROUTINE TO READ DATA INTO THE USER'S BUFFER. TTYGTC: MOV (PC)+,TY .ENDC TYPCH4: RTS PC .IFDF TTYR$1 TYPCH2: BIT #100200,PPS ;OUTPUT TO PUNCH BEQ TYPCH2 CLR PPS MOV R0,PPB RTS PCR1 ;SET BUFFER ADDRESS. TTYBUT: TTYBUF ;ADDR. OF INPUT BUFFER TYGTC5: MOVB R0,(R1)+ ;STORE DATA IN BUFFER. BEQ TYGTC3 ;EN .ENDC .IFDF TTYR$2 TYPCH3: BIT #100200,LPS ;OUTPUT TO LPT BEQ TYPCH3 CLR LPS MOV R0,LPB RTS PC .ENDC ;ROUTINED INPUT IF NULL (H/S READER) TYGTC1: CMPB R0,TTYCVA ;TEST FOR CONTINUATION CHAR. BNE TYGTC2 INCB TTYCON ;SET CONTINUE FLAG TO OUTPUT C.R. L.F. CRLF: MOV R0,-(SP) MOV #15,R0 JSR PC,TYPCH MOV #12,R0 JSR PC,TYPCH MOV (SP)+,R0 RTS PC ;S IF SO. TYGTC2: CMP R0,#15 ;TEST FOR C.R. BEQ TYGTC3 CMP R1,(PC)+ ;TEST IF BUFFER FULL. TTYBUB: .IFDF CAPS$ TTYBUF+72UBROUTINE TO OUTPUT MULTIPLE CHARACTERS ;THERE IS ONE CHARACTER PER BYTE ;THE LAST BYTE IS 0. ;ROUTINE RETURNS WHEN DONE ;AD. ;ADDR OF LAST LOC OF INPUT BUFFER .ENDC .IFDF RT11$ TTYBUF+71. .ENDC BHI TYGTC4 TSTB TTYICH ;TEST TYPE OF INPUT DRESS OF MESSAGE IN R0 ;JSR PC,TYPMS TYPMS: MOV R1,-(SP) ;SAVE R1 MOV R0,R1 TYPMS2: MOVB (R1)+,R0 ;OUTPUT A BYTE AT A TIM BMI TYGTC6 .IFDF RT11$ .TTINR ;GET NEXT TERMINAL CHAR. .ENDC BR TYGTC5 TYGTC6: .IFNDF TTYR$1 HALT ;NOT ASSEMBLE BEQ TYPMS1 ;TEST FOR END, 0, JSR PC,TYPCH BR TYPMS2 TYPMS1: MOV (SP)+,R1 ;RETURN RTS PC .IFDF CAPS$ CAPSBU: 1 ;ED FOR H/S READER .ENDC .IFDF TTYR$1 MOV #1,@#PRS ;GET NEXT VALUE FROM H/S READER. CLR R0 TYGTC7: BIT #100200,PRS ;TESBUFSIZ-BYTES .BYTE 0,0 ;FORMATTED ASCII 1 ;BYTE COUNT CAPSDA: .BYTE 0 ;DATA BYTE .EVEN CAPFLG: 0 .ENDC .END T FOR ERROR OR DONE. BEQ TYGTC7 BMI TYGTC5 ;STORE A NULL IF AN ERROR. MOV PRB,R0 BR TYGTC5 .ENDC TYGTC3: INCB TTYELF TTYITY TTYITY: CLR TTYBFF ;CLEAR FLAGS. CLRB TTYCON .IFDF RT11$ .RCTRLO ;CLEAR CONTROL O IN RT-11 .ENDC .IFDF C ;LINE IN, SET END LINE FLAG. TYGTC8: RTS PC TYGTC4: INCB TTYBFF ;BUFFER FULL, SET FLAG. TST (PC)+ ;TEST FOR BUFFER FULAPS$ CLR CAPFLG ;SAYS OK TO ISSUE NXT READ IOT .BYTE 0,0 ;CLEAR CONTRL O IN CAPS11 0 .ENDC TSTB TTYICH ;TEST FOR L JUMP TTYBFA: 0 ;ADDR OF GO TO IF BUFFER IS FULL BEQ TYGTC8 MOV TTYBFA,22(SP) ;STORE ADD. IF AVAILABLE TST (SP)+ JSRINPUT TYPE BMI TTYIT1 RTS PC ;EXIT IF TERMINAL TTYIT1: .IFNDF TTYR$1 HALT ;NOT ASSEMBLED FOR H/S READER. .ENDC PC,RSTARG RTS PC ;SUBROUTINE TO OUTPUT A CHARACTER ;VALUE IN R0 ;JSR PC,TYPCH TYPCH: TSTB TTYOCH ;TEST FOR H/S PUNCH .IFDF QAFLO$ .GLOBL SAVARG,RSTARG,$RCI .IFNDF QASDO$ .GLOBL IFIX .ENDC .ENDC .IFDF QAALP$ .GLOBL LISTCP .ENDC .IFDF QASDO$ .GLOBL MULT .ENDC ;GLOBAL SYMBOLS INTERNAL .GLOBL QADATF,QAERR,QACONT,QADLIM,QACSKP .GLOBL QAANS,QA,QANCB.TITLE QA ;LAB APPLICATIONS-11 QUESTIONS AND ANSWERS ;DEC-11-SLABA-C-LA9 ;FILENAME QA.MAC ;FILE ID QA.1 .CSECT QAMOD ;COD,QANCDF,QANCMF,QABUFP,QAXCHS .IFDF QASDO$ .GLOBL QANCLL,QANCHL .ENDC ;QUESTION AND ANSWER ROUTINE ;THE QA ROUTINE IPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLS USED TO INTERPRET A COMMAND ;CONVERT A NUMBER, OR PRINT A COMMAND MESSAGE ;QA IS CALLED AS FOLLOWS ;JSR R5,QA ;ANSWER TYY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANYPE ;ADD ;ADDRESS OF MESSAGE, OPTIONAL ;ADD ;ADDRESS OF COMMAND TABLE, OPTIONAL. ;QA CAN BE CALLED WITH AN OFFSET ADDRESS I OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ANDF ;BIT 40000 IS SET IN THE TYPE WORD ;JSR R5,QA ;TYPE ;BIT 40000 MUST BE SET. ;MESS ADD-.-2 ;COM ADD-.-2 ;THE ANSW TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE ER TYPES ARE SHOWN BELOW. MORE THAN ONE ;TYPE CAN BE USED IN A CALL TO QA. EACH TYPE IS SET ;BY SETTING A BIT IN THE ANSWER INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUITYPE WORD. A CALL ;TO QA CAN GET ONE RESUET ONLY, BUT MULTIPLE CALLS ;CAN GET SEVERAL ANSWERS ON ONE LINE. HENCE IF 3 ANSWERPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPS ;WERE ON A LINE, 3 CALLS TO QA WOULD BE NEEDED TO GET ;THE DATA. AN INPUT ENTITY IS SEPERATED BY A DELIMETER ;AND A LINE ILIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;IF DEFINED INCLUDE ;QAFLO$ FLOATIS USUALLY ENDED BY A CARRIAGE RETURN. ;LINE FEEDS ARE IGNORED, ONE CHAR CAN BE IGNORED. THE TTY ;MODULE DETERMINES THE LINE TNG INPUT ;QAMIX$ MIXED INPUT ;QAALP$ ALPHAMUMERIC INPUT ;QASTR$ STRING INPUT ;QASDO$ SINGLE, DOUBLE, OCTAL INPUT .IFDERMINATOR, BUT A QA HAS ;A LOCATION FOR THE DELIMITER AND CHARACTER TO SKIP. ;IF NOT SET, THEY WILL DEFAULT TO A SPACE AS ;THF QAMIX$ QAALP$=1 .IFNDF QAFLO$ QASDO$=1 .ENDC .ENDC ;REGISTER DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SPE DELIMITER AND A COMMA TO SKIP. STORE A ZERO IN ;THE BYTE TO SKIP NO CHARACTER. ;THE ANSWER TYPES ARE AS FOLLOWS ;1. S=%6 PC=%7 ;GLOBAL SYMBOLS EXTERNAL .GLOBL TTYICH,TTYBUT,TTYBUB,TTYCVA,TTYTST .GLOBL SAVRG,RSTRG,CRLF,TYPMS,TTYITY,TTYEOLINGLE PRECISION - CONVERT THE ASCII BEING ; PROCESSED INTO A S.P. NUMBER ;2. DOUBLE PRECISION - CONVERT TO A D.P. INTEGER.HIS TYPE WILL OUTPUT A ; CARRIAGE RETURN LINE FEED AS THE QUESTION, OTHERWISE ; SAME REGULAR MESSAGE TYPE ;13. NULL ANS S.P. IN QAANS, D.P. HAS THE LOW ORDER IN ; QAANS, F.P. HAS THE EXPONENT PART IN QAANS. ; 2. STRING ADDRESS IN RETUWER - IF NO ANSWER IS GIVEN AS THE ; ANSWER NO ERROR IS SET. ; IF NO SPECIAL MESSAGE IS SET A REGULAR MESSAGE ; ISRNED IN R0 ; 3. COMMANDS ARE RETURNED IN R0. 0 FOR THE FIRST ; COMMAND IN THE TABLE, 1 FOR THE NEXT ETC. R0 WILL ; ASSUMED. ; TYPE COMBINATIONS: ; A. ONLY ONE TYPE OF 1 THRU 7 IS ALLOWED. ; B. ONLY ONE OF THE FOLLOWING SILENT BE NEGATIVE IF NO COMMAND MATCH IS FOUND. ; REGISTERS: ALL REGISTERS ARE RETSTORED, EXCEPT R0 ; IF A VALUE IS R ;3. OCTAL - CONVERT TO A D.P. OCTAL NUMBER. ;4. FLOATING - CONVERT THE ASCII TO A F.P. NUMBER ;5. ALPHANUMERIC COMMAND - QUESTION, MESSAGE ; ONLY, ANSWER ONLY, OR NULL QUESTION ; C. DON'T WAIT - CAN BE USED WITH NULL QUESTION, OR ; THE ASCII ENTITY BEING ; PROCESSED IS TO BE TESTED AGAINST A COMMAND LIST. ;6. STRING - THE ASCII ENT@Tt IS TO BE STORED I A REGULAR MESSAGE ; LINE FORMAT: ; AN EXAMPLE OF AN INPUT LINE COULD BE ; CA 25. S1 ; TO INTERPRET THIS LINN A BUFFER ; THE STRING MUST START AND END WITH A DOUBLE QOUTE ; MARK ;7. MIXED MODE - THE ASCII ENTITY CONSISTS OF A E, 3 CALLS TO QA ARE NECESSARY. ; THE FIRST CALL COULD PRINT THE MESSAGE AND WAIT FOR ; THE ANSWER WITH THE TYPE, ALPHAN ; ALPHANUMERIC COMMAND AND A NUMBER (S.P.) ; TOGETHER, FOR EXAMPLE ST25. THE LETTERS ARE ; TREATED AS A COMMAND ANDUMERIC COMMAND. ; THE SECOND CALL WOULD BE SILENT QUESTION AND FLOATING ; INPUT, THE THIRD COULD BE SILENT QUESTION AND THE NUMBER CONVERTED ; TO A S.P. VALUE. ;8. SILENT QUESTION - NO QUESTION IS ASKED, AND THE ; NEXT ASCII ENTITY ON THMIXED ; MODE. ; MESSAGE ADDRESS: ; IF A MESSAGE IS TO GE PRINTED, THE ADDRESS OF THE ; MESSAGE AS ADD-.-2 SHOUE LINE IS PROCESSED. THIS ; MODE IS USED TO PROCESS MORE THAN ONE INPUT ON ; A LINE. DOES NOT RESET BUFFER POINTER TO LD FOLLOW THE ; TYPE. THE MESSAGE FORMAT IS A CHARACTER A BYTE ; ENDED BY A 0 BYTE. ; COMMAND ADDRESS: ; IF ATHE BEGINING ; OF THE BUFFER. ;9. DON'T WAIT FOR ANSWER - AFTER THE QUESTION IS ; TYPED OUT, RETURN TO THE USER AND DO COMMAND IS ASKED THE COMMAND TABLE ADDRESS ; AS ADD-.-2 COMES NEXT IN THE LIST OF THE QA CALL. ; THE COMMAND TABLE IS SN'T ; WAIT FOR AN ANSWER. ;10. MESSAGE ONLY - THE MESSAGE IS TYPED OUT, AND ; NO RETURN IS EXPECTED. ;11. ANSWER ONLY,HOWN BELOW AT QAALP:. THE ; COMMAND TABLE CONSISTS OF ALL POSSIBLE COMMANDS. ; THE TABLE FORMAT IS. ; BYTE1 = # OF C DIDN'T WAIT FOR ANSWER - AFTER, ; A QUESTION IS ASKED AND THE ANSWER WAS NOT WAITED ; FOR, THE USER CAN RETURN TO GET TOMMANDS +1 ; BYTE2 = # OF LETTERS PER COMMAND ; FOLLOWED BY ALL THE FIRST LETTERS OF EACH COMMAND ; ENDED BY A 0, FOHE ANSWER ; LATER VIA THIS MODE. THIS MODE WILL RESET THE ; BUFFER TO THE BEGINING OF THE LINE. ;12. NULL QUESTION - TLLOWED BY ALL SECOND LETTERS ENDED ; BY A 0, ETC ; ANSWERS: ; 1. NUMBERS ARE RETURNED IN QAANS AND QAANS+2. ; URS ON INPUT THE BUFFER POINTER ; IS SET BACK TO THE BEGINING OF THE INPUT ENTITY, SO ; THAT IT CAN BE REPROSSED. ;INPU QA: JSR PC,SAVRG ;SAVE REGISTERS 1-4 MOV R0,-(SP) CLR QANCDF ;CLEAR FLAGS CLR QADATF ;CLEAR FLAGS CLR QAERR CLRB T NEEDED - BEFORE QA IS CALLED THE ;BUFFER ADDRESSES TTYBUT MUST BE SET IN TTY ROUTINE. ;JSR R5,QA ;ANSWER TYPE ;MESSAGE ADDQAXCHS CLR QAFSP MOV (R5)+,R1 ;PUT ANSWER TYPE IN R1. MOV R1,(PC)+ QATYPE: 0 ;SAVE QA TYPE BIT #4000,R1 ;TEST FOR ANSRESS/OPTIONAL2 ;COMMAND ADDRESS/OPTIONAL2 ;ANSWER TYPE ;BIT 0 SINGLE PRECISION 1 ; 1 DOUBLE PRECISION 2 ; 2 OCTAL WER ONLY BNE QA5 BIT #400,R1 ;TEST FOR SILENT QUESTION BNE QA2 JSR PC,TTYITY TSTB TTYICH ;TEST FOR H.S. READER INPU 4 ; 3 FLOATING 10 ; 4 ALPHANUMERIC COMMAND 20 ; 5 STRING 40 ; 6 MIXED MODE 100 ; 7 NOT USED 200 ; T BMI QA19 JSR PC,CRLF ;TYPE CRLF QA19: BIT #10000,R1 ;TEST FOR NULL QUESTION BNE QA15 MOV (R5)+,R0 ;GET MESSAGE ADDRE 8 SILENT QUESTION 400 ; 9 DON'T WAIT FOR ANSWER 1000 ; 10 MESSAGE ONLY 2000 ; 11 ANSWER ONLY, DIDN'T WAIT FOR ANSSS. BIT #40000,R1 ;TEST FOR OFFSET CALL. BEQ QA21 ADD R5,R0 QA21: JSR PC,TYPMS ;TYPE MESSAGE QA4: BIT #2000,R1 ;TEST FORWER 4000 ; 12 NULL QUESTION 10000 ; 13 NULL ANSWER 20000 ; 14 OFFSET ADDRESS CALL 40000 ;R0 IS DESTROYED ;NUMB MESSAGE ONLY BEQ QA15 QAEXIT: MOV (SP)+,R0 JSR PC,RSTRG ;RESTORE REGISTERS RTS R5 ;EXIT ;START INPUT QA15: BIT ETURNED IN IT. ; USER VARIABLES: ; QADATF - BYTE - = 0 IS NO DATA IS FOUND, =1 IF DATA IS FOUND. ; QAERR - BYTE ER ANSWERS ARE IN QAANS ;COMMANDS IN R0 ;STRING ADDRESS IN R0 ;LINE FEEDS ARE IGNORED BY QA ;POINTER SET BY QA ROUTINE T- = 0 IF INPUT WAS GOOD, ELSE =1 ; QANCBD - BYTE - = # OF PLACES BEFORE THE DECIMAL POINT IN ; S.P. AND D.P. INPUT O INPUT BUFFER ;FLAGS CLEARED BY QA ROUTINE QADATF: .BYTE 0 ;SET 1 IF DATA IS FOUND QANCBD: .BYTE 0 ;# OF DECIMAL PLACES ; QACONT - BYTE - = #OF DECIMAL PLACES IN S.P. AND D.P. INPUT ; QACNDF - BYTE - = 1 IF A DECIMAL POINT WAS IN S.P. OR D. BEFORE THE POINT. QAERR: .BYTE 0 ;SET 1 IF AN ERROR OCCURS QACONT: .BYTE 0 ;SET TO THE NUMBER OF DECIMAL ;POINTS FOR SP. INPUT ; QANCMF - BYTE - = 1 IF S.P. OR D.P. # WAS NEGATIVE. ; QACONF-BYTE-SET =1 IF CONTINUATION CHAR. FOUND ; OTHERWIING AND DOUB PRECISIONS ;NUMBERS QANCDF: .BYTE 0 ;DECIMAL PT. FLAG QANCMF: .BYTE 0 ;NEG. NUMBER FLAG QAFSP: .BYTE 0 ;SE=0 ; QABUFP -WORD- POINTER TO INPUT BUFFER ; QAXCHS-BYTE-=1 IF THERE WERE EXCESS CHAR. ; TO AN ALP COMMAND ; OTHERWISE=0SET 1 TO CONVERT A S.P. VIA F.P. QACONF: .BYTE 0 ;SET 1 IF THE CONTINUATION CHAR. IS FOUND QACSKP: .BYTE ', ;QA WILL IGNORE ; QANCLL - WORD - LOW ORDER ; QANCHL - WORD - HIGH ORDER INTEGER MAX LIMIT INPUT. ; IF A BIT IN QANCLL OR QANCHTHIS CHARACTER QADLIM: .BYTE 40 ;LINE DELIMETER QAXCHS: .BYTE 0 ;SET =1 IF EXCESS CHAR. IN ALP MODE ;OTHERWISE =0 QAHNL IS ALSO ; SET IN THE ABSOLUTE VALUE OF INTEGER INPUT ; THE ERROR BYTE IS SET ; ERRORS: ; IF AN ERROR OCCV: .BYTE 72 ;=72 FOR DECIMAL,=70 FOR OCTAL ;NUMBER ANSWER QAANS: 0 ;SINGLE PRECISION, LOW 0 ;DOUBLE PRECISION, HIGH FOR ALPH,MIXED BEQ QAEXIT TST (R5)+ ;SKIP OVER COM. ADD. BR QAEXIT QA7: DEC R2 ;SET R2 TO POINT TO 1ST ;DATA VAR4,(PC)+ ;USED IN MIXED INPUT QAMIXS: 0 MOV R1,(PC)+ ;STORE ADDRESS OF FIRST LETTER IN QAALP1: 0 ;LIST OF COMMANDS CLR RLUE OF INTEREST. CLR R0 MOV R1,R3 BIT #177,R3 BNE QA11 BR QA16 QAERRO: INCB QAERR ;ERROR IN CALL QA17: TST (SP)+ 3 ;R3 HOLDS THE COMMAND ;INDEX WHICH IS BEING TESTED MOV R2,(PC)+ ;SAVE POINTER TO 1ST COMMAND QASAV2: 0 ;CHARACTER ;POP PC OFF STACK BR QAEXIT QA11: ROR R3 ;TEST TO FIND JUMP ADDRESS. BCS QA12 ADD #2,R0 BR QA11 QA12: JSR PC,@QAQAALP4: JSR PC,QAGETV ;GET 1ST COMMAND CHARACTER. BR QAALPE ;ERROR MOV QAALP1,-(SP) JSR PC,LISTCP ;COMPARE COMMAND CHARACJMP1(R0) ;JUMP TO ROUTINE QA14: MOV R2,QABUFP ;PUT BUFFER POINTER TO NEXT BR QAEXIT QA20: TST (SP)+ BR QA16 QAJMP1: TER ;AGAINST TABLE TST R0 BMI QAALPE ;NO MATCH,ERROR ADD R0,R3 ADD R0,R1 ;INDEX INTO NEXT LIST. MOV R1,QAALP1 ;JUMP TABLE TO ROUTINES .IFDF QASDO$ ! QAFLO$ QANUM,QANUM,QANUM .ENDC .IFNDF QASDO$ & QAFLO$ QA20,QA20,QA20 .ENDC INC QAALP1 ;SAVE ADD. OF NEXT LIST ELEMENT. QAALP3: DEC R4 ;TEST IF DONE, ALL LETTERS CHECKED. BNE QAALP2 QAALP6: JSR PC, .IFDF QAFLO$ QAFLOA .ENDC .IFNDF QAFLO$ QA20 .ENDC .IFDF QAALP$ QAALP .ENDC .IFNDF QAALP$ QA20 .ENDC .QAGETV ;SCAN OFF UNUSED CHARACTERS BR QAALP7 ;EXIT INCB QAXCHS ;SET EXCESS CHAR FLAG BR QAALP6 QAALP7: MOV R3,2(SP) ;IFDF QASTR$ QASTR .ENDC .IFNDF QASTR$ QA20 .ENDC .IFDF QAMIX$ QAMIX .ENDC .IFNDF QAMIX$ QA20 .ENDC ;STRSTORE COMMAND INDEX IN R0 ON THE STACK RTS PC QAALP2: ADD (PC)+,R1 ;ADD # OF COMMAND TO GET QACOMC: 0 ;NEXT LETTER IN TAING INPUT ROUTINE .IFDF QASTR$ QASTR: CMPB (R2),#42 ;GET CHARACTER AND CHECK FOR BNE QAERRO ;A ". INC R2 MOV R2,2(SP) BLE. JSR PC,QAGETV ;GET NEXT COMMAND CHAR. BR QAALPE ;ERROR CMPB R0,(R1) ;COMPARE TO TABLE VALUE BEQ QAALP3 ;SAVE M;PUT ADDRESS OF STRING IN R0 ON THE STACK. QASTR1: JSR PC,QAGETV BR QAERRO ;ERROR IF NO END STRING CMP R0,#42 ;LOOK FOR EOV QASAV2,R2 ;NOT SAVE, START WITH ;1ST CAHRACTER AGAIN MOV QAALP1,R1 ;MOVE START ADD. DOWN INC R3 ;SAVE IN R1. MOV #1000,R1 ;TEST TO WAIT FOR ANSWER. BNE QA8 ;NO QA5: JSR PC,TTYTST ;TEST FOR END OF INPUT LINE BR QA15 QA1: MOV TTYBUT,QND OF STRING BNE QASTR1 RTS PC ;FOUND END, SET .ENDC ;COMMAND INPUT INTERPRETER ROUTINE ;THE CALL TO QA HAD A COMMANDABUFP ;SET POINTER TO TOP OF BUFFER QA2: MOV QABUFP,R2 QA10: JSR PC,QAGETV ;GET NEXT VALUE BR QA9 INCB QADATF ;FOUND GOOD ADDRESS. ;THE COMMAND TABLE IS ; .BYTE # OF COMMANDS +1 ; .BYTE # OF LETTERS/COMMAND ; A1 ; A2 ; . ; . ; AM ; 0 ; B1 DATA BR QA7 QA9: CMPB R0,QADLIM ;TEST FOR DELIMETER BNE QA18 ;NO DATA INC (PC)+ ;YES MOVE POINTER UP ONE QABUFP: 0 ; B2 ; . ; . ; BM ; 0 ; ETC .IFDF QAALP$ QAALP: MOV (R5)+,R1 ;GET COMMAND LIST ADDRESS BIT #40000,QATYPE ;TEST FOR ;PTR TO INPUT BUFFER BR QA2 QA18: BIT #20000,R1 ;TEST IF NO DATA OK. BNE QA8 QA16: INCB QAERR QA8: BIT #120,R1 ;TESTOFFSET CALL. BEQ QA22 ADD R5,R1 QA22: MOVB (R1)+,QACOMC ;GET # OF COMMANDS MOVB (R1)+,R4 ;GET # OF LETTERS/COMMAND MOV ONVERT SUBROUTINE ;IS USED TO CONVERT ASCII TO INTEGER OR OCTAL ;IT WILL COUNT THE DECIMAL PLACES IF A DECIMAL ;POINT IS PRESLOW QANCHL: 0 ;INPUT LIMIT HIGH QANCF: .BYTE 0 ;NUMBER FOUND FLAG .BYTE 0 ;LOC. NOT USED. QANC: MOV R5,-(SP) CLR QANCENT. ;THE INPUT IS IN THE TELETYPE BUFFER. ;OUTPUT IS IN QAANS, QAANS+2 WHERE QAANS ;IS THE LOW ORDER PART. ;OCTAL NUMBER F CMPB (R2),#'- ;TEST FOR + OR -, AND SET BNE QANC5 ;MINUS FLAG IF - INCB QANCMF BR QANC6 QANC5: CMPB (R2),#'+ BNE QCAN BE D.P. .IFDF QASDO$ QANUM: MOV #10.,R4 ;TEST FOR OCTAL OR DECIMAL MOVB #72,QAHNV ;SET HIGH ASCII VALUE BIT #4,R1 ANC7 QANC6: INC R2 ;IF + OR - SKIP TO NEXT CHAR. QANC7: CLR R1 ;LOW ORDER OF NUMBER CLR R3 ;HIGH ORDER OF NUMBER QANC2: ;AND STORE RADIX IN R4. BEQ QANUM1 MOV #8.,R4 MOVB #70,QAHNV ;SET HIGH ASCII # VALUE BR QANUM2 QANUM1: MOV #100000,QANJSR PC,QAGETV ;GET NEXT CHAR BR QANCDO ;DONE IF TERMINATE CHAR CMP R0,#56 ;TEST FOR DECIMAL PT. BNE QANC1 TSTB QANCDF CHL BIT #2,R1 ;TEST S.P. OR D.P. TO BNE QANUM2 ;SET MAX VALUE MOV #177777,QANCHL MOV #100000,QANCLL QANUM2: JSR PC,QA ;ONLY ONE DECIMAL PT ALLOWED BNE QANCER INCB QANCDF ;SET DECIMAL PT FLAG BR QANC2 QANC1: CMP R0,#60 ;TEST FOR A NUMBNC ;CALL NUMBER CONVERT BR QANUM5 ;ERROR RETURN JSR PC,QAGETV ;TEST THAT THE NUMBER BR QANUM3 ;IS FOLLOWED BY A DELIMITER BMI QANCEX ;EXIT IF NOT, AND STILL POINT CMPB R0,QAHNV ;TO CHAR BPL QANCEX TSTB QANCDF BNE QANC8 INCB QANCBD ;CER QANUM5: JMP QAERRO QANUM3: TSTB QANCF ;TEST FOR NUMBER BEQ QANUM5 TSTB QANCMF ;TEST FOR NEG. VALUE BEQ QANUM4 NEGOUNT PLACES BEFORE DECIMAL BR QANC3 QANC8: INCB QACONT ;COUNT DECIMAL PTS AFTER IF FLAG ;SET QANC3: SUB #60,R0 ;SAME R1 ADC R3 NEG R3 QANUM4: MOV R1,QAANS ;STORE ANSWER. MOV R3,QAANS+2 RTS PC ;NUMBER CONVERSION ROUTINE ;CREATES A 3DIGIT MOV R0,(PC)+ QANCTM: 0 MOV R4,R0 ;MULTIPLY NUMBER BY RADIX MOV R3,R5 ;IN R4 ;HIGH ORDER PART FIRST BEQ QANC4 2 BIT POSITIVE NUMBER, MAXIMUM ;TESTS AGAINST SMALLER MAXIMUM CRITERIOR ;CALLING SEQUENCE ;SET RADIX FOR CONVERSION IN R4 JSR PC,MULT TST R0 BNE QANCER MOV R5,R3 ;SAVE HIGH ORDER PRODUCT QANC4: MOV R4,R0 ;MULTIPLY LOW ORDER PART BY MOV R1,;SET MAX LIMIT IN QANCLL, QANCHL ;JSR PC,QANC ;ERROR BRANCH ;NORMAL RETURN ;ANSWER IN R3, R1, LOW ORDER PART IN R1 ;TO R5 ;RADIX JSR PC,MULT MOV R5,R1 ;SAVE LOW ORDER PRODUCT AND ADD R0,R3 ;ADD HIGH ORDER PART OF PRODUCT TO BCS QANCER SET LIMIT, SET ALL BITS IN QANCHL AND QANCLL ;GREATER THAN THE ALLOWED NUMBER WHERE QANCHL IS ;THE HIGH ORDER PART OF THE MASK;NUMBER. ADD QANCTM,R1 ;ADD NEW DIGIT TO NUMBER ADC R3 INCB QANCF ;SET NUMBER FLAG. BIT QANCLL,R1 ;TEST IF NUMBER IS TO. EX, IF QANCHL=-1 ;A 16 BIT VALUE IS THE MAXIMUM ALLOWABLE VALUE. ;ON RETURN R2 POINTS TO THE LAST CHAR LOOKED AT IF ;THEO BIG BNE QANCER BIT QANCHL,R3 BEQ QANC2 ;GET NEXT INPUT QANCER: CLR QANCLL ;ENTER HERE ON ERROR EXIT CLR QANCHL MOQAMIXS,R4 ;RESTORE # OF COM. LETTERS. BR QAALP4 QAALPE: MOV #177777,2(SP) ;SET R0 -1 ON ERROR BR QAERRO .ENDC ;NUMBER CRE WAS NO ERROR AND RETURNS TO JSR+4 ;ON AN ERROR R2 POINTS TO THE NEXT CHAR AND RETURNS TO ;JSR+2. QANCLL: 0 ;INPUT LIMIT .IFDF QAMIX$ QAMIX: MOV R2,(PC)+ ;SAVE BUFFER POINTER QAMXR2: 0 TST (SP)+ ;POP PC JSR PC,QAALP ;CALL COMMAND INTERPRETE.TITLE GTDISP ;LAB APPLICATIONS-11 GT40 DISPLAY ;DEC-11-SLABA-C-LA1 ;FILE GTDISP.MAC ;FILE ID GTDISP.1 .CSECT GTSUBS ;COR ;RESULT OF QAALP IN R0 ON THE STACK. MOV QATYPE,R1 ;RESTORE TYPE VALUE. MOV QAMXR2,R2 ;CALCULATE BUF POINTER TO ADDPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLV (SP)+,R5 RTS PC QANCEX: DEC R2 ;RETAIN CURRENT CHAR QANCDO: ADD #2,2(SP) ;NORMAL EXIT BR QANCER .ENDC .IFNDF QASDO QAMIXS,R2 ;NUMBER PART CMPB (R2),QADLIM ;TEST FOR DELIMITER BEQ QAMIX3 JSR PC,QANUM ;EVALUATE NUMBER QAMIX1: JMP QA14 ;$ .IFDF QAFLO$ QANUM: BIT #6,R1 ;TEST D.P. OR OCTAL BNE QANUME INCB QAFSP ;SET S.P. FLOATING FLAG. BR QAFLOA ;CONVERRETURN EXIT QAMIX3: TST -(SP) ;CALL ERROR JMP QAERRO .ENDC ;SUBROUTINE TO GET A VALUE OF INPUT ;FOR QA ROUTINE ;JSR PT VAI FLOATING. QANUME: JMP QAERRO .ENDC .ENDC ;---FLOATING POINT INPUT ;FPMP FLOATING POINT INPUT ROUTINE IS USED C,QAGETV ;RETURN FOR EOL,@,AND SPACE ;RETURN FOR GOOD DATA QAGETV: CMP R2,TTYBUB ;TEST FOR BUFFER OVER READ. BLOS QAGET6 ;FOR THE CONVERSION .IFDF QAFLO$ QAFLOA: CLR R3 MOV R2,R1 ;BUFFER ADDRESS QAFLO3: JSR PC,QAGETV ;COUNT FIELD SIZE BR CLR R0 BR QAGET1 QAGET6: MOVB (R2),R0 BEQ QAGET1 ;TEST FOR NULL CHAR. CMPB R0,QACSKP ;TEST FOR SKIP CHAR. BNE QAGET QAFLO1 INC R3 BR QAFLO3 QAFLO1: JSR PC,SAVARG MOV R1,-(SP) ;STORE BUFFER ADD MOV R3,-(SP) ;FIELD SIZE CLR -(SP) 3 QAGET5: INC R2 BR QAGETV QAGET3: CMP R0,#12 ;AND LINE FEEDS BEQ QAGET5 CMPB R0,QADLIM ;TEST FOR LINE DELIMITER BEQ CLR -(SP) JSR PC,$RCI MOV (SP)+,QAANS ;HIGH ORDER VALUE MOV (SP)+,QAANS+2 ;LOW ORDER BCS QAFLO2 ;TEST FOR ERROR .IFNDQAGET1 CMPB R0,TTYCVA ;COMPARE TO CONTINUATION BEQ QAGET2 CMPB R0,TTYEOL ;TEST AGAINST EOL. BEQ QAGET1 ADD #2,(SP) ;RF QASDO$ TSTB QAFSP ;TEST TO FIX VALUE BEQ QAFLO4 JSR R5,IFIX ;FIX F.P. NUMBER BR QAFLO5 QAANS QAFLO5: MOV R0,QAANSETURN TO LOCATION CALL+4 INC R2 ;POINT TO NEXT VALUE RTS PC QAGET2: INCB QACONF ;SET CONTINUATION FLAG ;RETURN TO ;STORE IN QAANS .ENDC QAFLO4: JSR PC,RSTARG ;RETURN RTS PC QAFLO2: JSR PC,RSTARG ;ERROR. JMP QAERRO .ENDC ;QAMIXCALL+2 BR QAGET5 QAGET1: RTS PC .END COMMAND TO INTERPRET A COMMAND AND ;NUMBER WHICH ARE TOGETHER. ;THE COMMAND LIST FORMAT IS THE SAME ;AS THE ALPHANUMERIC COMMAND. FOR EXAMPLE ;IF S2 IS THE ;COMMAND. THE S IS TO BE INTERPRETED AS A COMMAND ;THE 2 IS A NUMBER TO BE RETURNED. F# IS THE OTHER COMMAND ;COMMAND LIST IS AS FOLLOWS ;.BYTE # OF COMMAND +1 (=3) ;.BYTE # OF LETTER PER COMMAND (=1) ;S ;F ;0 ET LONG VECTOR MODE SYMDEF SETPNT,3 ;SET POINT MODE SYMDEF SETGRA,5 ;SET GRAPH Y MODE SYMDEF SETRLP,6 ;SET RELATIVE POINT . ; IF NOT DEFINED,DEFAULT VALUES ARE USED. ;GTD$8- IF DEFINED WILL ASSEMBLE CODE NEEDED FOR IMPLIMENTING THE ; 'DBA' COMMANMODE INT= ^B10000000000 ;AS PART OF ANY OF THE ABOVE COMMANDS ;IT CAUSES BITS 9-7 TO BE LOADED INTO ;THE INTENSITY RD ;GTD$9- IF DEFINED WILL ASSEMBLE CODE NEEDED FOR IMPLIMENTING THE ; 'DEX' COMMAND ;GTD$A- IF DEFINED, CODE WILL BE ASSEMBEGISTER .ENDC .IFDF CAPS$ SETCHR=100000 SETSVC=104000 SETLVC=110000 SETPNT=114000 SETGRA=124000 SETRLP=130000 LED TO DISPLAY FLOATING POINT ; DATA. ;GTD$B- IF DEFINED, CODE WILL BE ASSEMBLED FOR A GT44. ; IF UNDEFINED, CODE WILL BE ASSINT=2000 .ENDC DSTOP= 173400 ;DISPLAY STOP COMMAND DJSR= 173400 ;PSUEDO DISPLAY SUBROUTINE CALL DJMP= 160000 ;DISPLAYEMBLED FOR A GT40 ;GTD$C- IF DEFINED, TEST EACH I/D TABLE FLAG FOR RECALCULATION. ;GTD$D- IF DEFINED, CODE WILL BE ASSEMBLED T JUMP INSTRUCTION DNOP= 164000 ;DISPLAY NOP .IFDF RT11$ .MACRO ADDR,A,B ;MACRO TO PUT ADDR OF A IN B MOV #A,B ;NON PO OPTIONALLY ; GENERATE GRAPH-Y MODE DISPLAYS. ; .SBTTL GLOBAL SYMBOLS ;GLOBAL SYMBOLS - DEFINED LOCALLY .GLOBL GTRCAL,Y ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANYIC CODED FUNCTION .ENDM .ENDC .IFDF GTD$9 GTD$6=0 ;THIS MUST PRECEED THE COND. ASSEM. ON NXT PG .ENDC ; .SBTTL CO OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ANDNDITIONAL ASSEMBLY PARAMETER EXPLANATIONS ;ASSEMBLY PARAMETERS MUST BE DEFINED IN A SEPARATE FILE AND THEN ;ASSEMBLED ALONG WI TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE TH 'GTDISP' ;GTD$1- IF DEFINED AND .EQ.0 WILL CAUSE 'DIWRFL' FLG TO BE SET WHENEVER ; Y WRAP-AROUND OCCURS AND X WRAP-AROUNDINFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUI IF X-Y DISPLAY. ; IF DEFINED AND .NE. 0 WILL CAUSE WRAP-AROUND VALUES TO BE SET TO ; DISTOP FOR Y VALUES AND DISSZX FOR X VALPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPUES IF X-Y DISPLAY. ;GTD$2- IF DEFINED WILL ALLOW USER TO CONTROL A SPECIAL FUNCTIONAL DX ;GTD$3- IF DEFINED WILL ALLOW USER TLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; LARRY PEARSON 15-JAN-74 ;DEFINITIONS R0= %0 R1= %1 R2= %2 R3= %O CONTROL A SPECIAL FUNCTIONAL DATA ; TABLE DELTA. **** THIS FEATURE HAS NOT BEEN IMPLEMENTED.**** ;GTD$5- IF DEFINED WILL AS3 R4= %4 R5= %5 SP= %6 PC= %7 .IFDF RT11$ .MACRO SYMDEF,SYM,DEF ;MACRO TO DEFINE GT40/44 DPU INSTRUCTIONS SYM= ^SEMBLE CODE TO GRAPH XY-DATA AS WELL AS ; Y-DATA WHICH IS ALWAYS ACTIVE. ;GTD$6- IF DEFINED WILL ASSEMBLE CODE NEEDED FOR ENO4000*DEF!^O100000 .ENDM SYMDEF SETCHR,0 ;SET CHARACTER MODE SYMDEF SETSVC,1 ;SET SHORT VECTOR MODE SYMDEF SETLVC,2 ;SABLING FIX CURSORS ;GTD$7- IF DEFINED WILL ASSEMBLE CODE NEEDED FOR X-AXIS & Y-AXIS OFFSET, ; SCOPESIZE,TOP & BOTTOM OF DISPLYSCC,GTBCMD .ENDC .IFDF GTD$9 ;DEX COMMAND? .GLOBL DISSTX,DISTX,GTXCMD .ENDC .IFDF GTD$2 ;SPECIAL FUNCTION DELTA-NON-ZERO INDICATES AN ERROR CONDITION .IFDF GTD$5 ;XY DISPLAYS? GTXVAL: .BYTE 0 ;NON-ZERO VALUE MEANS FETCH X VALUE .ENDX? .GLOBL NEWDX ;USER PROVIDED SUBROUTINE .ENDC .IFDF GTD$5 ;XY DATA? .GLOBL DISXBU .ENDC .IFDF GTD$A ;FLOATIC .IFDF GTD$6 ;FIXED CURSORS? GTCURC: .BYTE 0 ;LEFT OR RIGHT CURSOR SWITCH .ENDC GTRCAL: .BYTE 0 ;SET BY CALLING PRONG POINT DATA? .GLOBL DISMPO,$POLSH,$SBR,$MLR,$RI .ENDC .IFDF GTD$C ;SPECIAL RECAL FLAG? .GLOBL DISSKP .ENDC .IGRAM, CLEARED BY GTDISP ;=+1 CREATE A NEW DISPLAY FILE ;= 0 DO NOT CHANGE FILE. UPDATE CURSORS. ;=-1 MODIFY AN EXFDF GTD$D ;SPECIAL GRAPH MODE? .GLOBL DISGRA .ENDC ; .SBTTL VARIABLES AND MACRO DEFINITIONS ;COMMAND LIST TO POSITION ISTING FILE IN PLACE .EVEN .IFDF GTD$2>D$D .ERROR ;GTD$2 & GTD$D ARE MUTUALLY EXCLUSIVE .ENDC ; .SBTTL GINIT - SUBBEAM AND CALL CURSOR SUBROUTINE .IFDF GTD$6 ;FIXED CURSORS? GTCRSR: 4 ;NUMBER OF WORDS IN THE LIST GTCINT: SETPNT!INT ;POROUTINE ;--- INIT ROUTINE --- ;AN I/O TABLE IS USED TO SETUP PARAMS FOR ;'GTSET' & 'GTDISP' ;ADR OF I/D TBL TO BE INITED IS INT MODE - POSTION FOR LEFT CURSOR 0 ;X VALUE POSITION 0 ;Y VALUE POSITION GTCRSE: DJMP ;CHANGED TO DJSR FOR CURSOR CALLPASSED IN R0 ;CALL JSR PC,GINIT GINIT: .IFDF GTD$8 ;"DBA" CMD MOV DISST(R0),DISSTC(R0) ;SAVE ST, N,T,CU,SC MOV DISN(R ; .+4 ;CALLER MUST COMPUTE THIS VALUE ; FIXCUR ;AND FILL THIS ONE IN THE DISPLAY FILE .IFDF RT11$ .MACRO DLTAXY,$DX,$0),DISNC(R0) MOV DIST(R0),DISTC(R0) MOVB DISCU(R0),DISCUC(R0) MOVB DISSC(R0),DISSCC(R0) .ENDC .IFDF GTD$9 ;"DEX" CDY $$DX= $DX $$DY= $DY .IIF LT $DX,$$DX=-$DX!100 .IIF LT $DY,$$DY=-$DY!100 $$DX*200!$$DY!40000 .ENDM .ENDC FIXCMD CLR DISTX(R0) ;SET FLG FOR 'OK' TO EXPAND .ENDC JSR PC,GTSET ;CALL SETUP RTS PC ; .SBTTL GINIT0 - SUBROUTINE GINIT,GINIT0,GTSET,GTDISP,GTICMD .GLOBL GTDCMD,GTRCMD,GTLCMD,GTTCMD,GTNCMD,GTDSP0 ;GLOBAL SYMBOLS - DEFINED EXTERNALLY UR: SETSVC ;CURSOR SUBROUTINE .IFDF RT11$ DLTAXY 0,14 ;SHORT VECTOR UP DLTAXY 0,-30 ;AND DOWN DLTAXY 0,14 ;AND BACK TO .GLOBL SAVARG,RSTARG,SAVRG,RSTRG,DIVD,DIVDNH,DIVDSH,DIVR,MULT .GLOBL DISBUF,DISYBU,DISTYP,DISST,DISN,DIST,DISSC,DISR .GLOBL 0,0 AGAIN .ENDC .IFDF CAPS$ 40014 ;UP 14 FOR Y 40130 ;DOWN 30 FOR Y 40014 ;BACK TO BEGINNING .ENDC DSTOP ;RETUDISDX,DISYBS,DISDLT,DISCI .IFDF GTD$1 ;WRAP-AROUND CHECK? .IFZ GTD$1 ;SET WRAP-AROUND FLAG? .GLOBL DEWRFL .ENDC .ERN 0 .ENDC GTFSUB: GTFINT ;FETCH NEXT SINGLE PRECISION INTEGER GTFBYT ;FETCH NEXT BYTE GTFDBL ;FETCH NEXT DOUBLE PNDC .IFDF GTD$6 ;FIXED CURSORS? .GLOBL DISCU,DISCU1,DISCU2,DISXC1,DISXC2,GTCCMD .ENDC .IFDF GTD$7 ;SCOPE SIZE & OFRECISION INTEGER .IFDF GTD$A ;DISPLAY FLOATING POINT DATA? GTFFLT ;FETCH NEXT FLOATING POINT VALUE .ENDC .IFDF GTD$FSETS? .GLOBL DISOFX,DISOFY,DISSZX,DISTOP,DISBOT .ENDC .IFDF GTD$8 ;DBA COMMAND? .GLOBL DISSTC,DISNC,DISTC,DISCUC,DISB GTYMAX=1777 ;GT44 MAXIMUM Y VALUE .ENDC .IFNDF GTD$B GTYMAX=1377 ;GT40 MAXIMUM Y VALUE .ENDC GTERRC: .BYTE 0 ;ISPLAY FILE ; BUFPNT ;PNTR TO BUFFER CONTROL BLOCK GINIT0: MOV (R0)+,GTLST MOV (R0)+,GTIDTB MOV (R0)+,GTCRVP MOV (R0)T(R1),R0 ;R0 = STARTING POINT JSR PC,GTMTYP ;CONVERT TO OFFSET IN BYTES ADD DISYBU(R1),R0 ;COMPUTE STARTING ADDR MOV R0,DI,GTBUFP RTS PC ; .SBTTL GTSET - SUBROUTINE ;--- SETUP ROUTINE --- ;THIS ROUTINE IS USED BY 'GINIT' AND MANY OF ;THE DISPSYBS(R1) ;AND STASH IT JSR PC,RSTARG ;RESTORE R0-R5 RTS PC ; .SBTTL GTDISP - SUBROUTINE ;--- GTDISP ROUTINE --- ;THIS ROLAY CMDS. IT USES THE 'GTDISP PORTION' ;OF AN I/D TABLE, WHOSE ADR IS PASSED IN R0. GTSET: JSR PC,SAVARG ;SAVE R0-R5 MOVBUTINE IS CALLED TO GENERATE XY-DATA OR Y-DATA DISPLAYS. ;IT USES LIST OF I/O TABLES GTDISP: JSR PC,GTSAVR ;SAVE R1-R5 MOV #1,GTRCAL ;SET RECALCULATE SWITCH MOV R0,R1 ;R1=ADR OF I/D TBL ;DETERMINE TABLE DELTA = N FOR BYTE DISPLY ; = 2*N FORGTBUFP,R5 ;GET POINTER TO BUFFER CONTROL BLOCK TSTB GTRCAL ;TIME TO RECALCULATE? BEQ GTDIS2 ;BR IF NOT CLR 4(R5) ;CLEAR WORD DISPLY ; = 4*N FOR DBL PREC DISPLY MOV DISN(R1),R0 ;TBLDLT=N JSR PC,GTMTYP ;CONVERT TO BYTES ;DETERMINE DX & R BUFFER OFFSET GTDIS1: JSR PC,GTDSP0 ;RECALCULATE CLRB GTRCAL ;CLEAR RECALCULATE SWITCH TST R0 ;ANY ERRORS? BNE GTDRTN IF Y-DATA ; BASE XPTR IF XY-DATA DI: MOV R0,DISDLT(R1) ;PUT TBLDLT IN I/D TBL .IFDF GTD$5 ;XY DATA? TST DISXB ;BR IF ANY ERRORS GTDIS2: .IFDF GTD$6 ;FIXED CURSORS? MOV GTLST,R0 ;PNTR TO LIST OF I/D TABLES TO DISPLAY MOV GTCRVP,U(R1) ;XY OR Y DATA? BEQ DT1 ;Y-DATA! ;XY-DATA DX=BASE DIXPTR. MOV DISST(R1),R0 ;CONVERT ST TO BYTE OFFSET JSR PC,GTR2 ;PNTR TO LIST OF STARTING ADDRESSES OF ;CURVES IN THE DISPLAY FILE .IFDF GTD$5 ;XY DISPLAYS? CLRB GTXVAL ;CLEAR MTYP ADD DISXBU(R1),R0 ;COMPUTE X POINTER MOV R0,DISDX(R1) ;STORE IT BR DI3 .ENDC ;Y-DATA SNGL PREC DIV: (SCOPE SIZE)SWITCH TO GET Y VALUES .ENDC GTDCUR: MOV (R0)+,R1 ;R1 = I/D TABLE POINTER BEQ GTDRTZ ;BR IF ALL DONE MOV (R2)+,R3 ;R3 /T = Q1 + R1 ; DX=Q1 ; DBL PREC DIV: R1.0/T = Q2 + R2 ; FRACTURAL REMAINDER = Q2 DT1: .IFDF GTD$7 ;SCOPE SIZE & OFFSETS = STARTING ADDR OF CURVE IN THE ;DISPLAY FILE .IFDF GTD$5 ;XY DISPLAYS? TST DISXBU(R1) ;IF XBU=0, Y DISPLAY, ELSE MOV DISSZX(R1),R5 ;SCOPE SIZE X-DIRECTION FROM TBL .ENDC .IFNDF GTD$7 ;NO SCOPE SIZE & OFFSETS MOV #2000,R5 ;DEFAULT S ;XY AND NO CURSORS BNE GTDCUR ;BR IF NO CURSORS .ENDC TSTB DISCU(R1) ;FIXED CURSORS FOR THIS DISPLAY? BNE GTDCUP ;BIZE .ENDC .IFNDF GTD$2 ;NO SPECIAL FUNCTIONAL DELTA-X? MOV DIST(R1),R2 MOV R2,R0 JSR PC,DIVR ;USES R5 & R0 MOV RR IF CURSORS ARE UP MOV #DJMP,6(R3) ;REPLACE "DJSR" WITH "DJMP" ON LEFT MOV #DJMP,22(R3) ;AND RIGHT CURSOR CALLS BR GTDCUR;---INIT0 ROUTINE--- ;CALL: MOV #CTABLE,R0 ;R0 = POINTER TO INIT TABLE ; JSR PC,GINIT0 ; ... ;CTABLE:DSPTBL ;PNTR TO LIS0,DISDX(R1) ;DX MOV R5,DIVDNH ;DBL PREC DIVIDEND HI CLR R5 ; LOW MOV R2,R0 ;DIVISOR=T AGAIN CLR DIVDSH JSR PC,DIVDT OF I/D TABLES TO DISPLAY ; UPDTBL ;PNTR TO LIST OF I/D TABLES TO UPDATE ; CRVLST ;PNTR TO LIST OF CURVE STARTING ADDR IN D ;DOUBLE PRECISION DIVIDE MOV R0,DISR(R1) ;FRACTIONAL REMAINDER .ENDC ;DETERMINE BASE YPTR IN ANY CASE DI3: MOV DISSC1 ;BR IF TIME ADD DISDLT(R1),R0 ;UPDATE Y BUFFER POINTER CMP R0,GTBEND ;IS Y-BUFFER POINTER WITHIN BUFFER? BLO GTDCND ; BYTES IN ;THE DATA ELEMENT AS SPECIFIED IN THE I/D TABLE POINTED TO BY R1. ;CALLING SEQUENCE: ; MOV IDPNTR,R1 ;R1 = STARTING ;CHECK NEXT I/D TABLE .ENDC ;RETURN FROM GTDISP GTDRTZ: CLR R0 ;RETURN WITH NO ERROR GTDRTN: JSR PC,GTRSTR ;RESTORBR IF OK SUB DISDLT(R1),R0 ;USE LAST POINT IF CURSOR OUT OF RANGE GTDC1: SUB (SP),R2 ;SUB HALF DELTA-X JSR PC,GTGETV ;GET E R1-R5 RTS PC .IFDF GTD$6 ;FIXED CURSORS? ;TURN CURSORS ON GTDCUP: MOV #DJSR,6(R3) ;INSERT CURSOR CALL FOR LEFT Y VALUE & UPDATE R0 MOV R2,(R3)+ ;STORE X MOV (SP)+,(R3) ;STORE Y COORDINATE ADD (SP),R2 ;ADD BACK HALF DELTA-X ADD #16MOV #DJSR,22(R3) ;AND RIGHT CURSORS MOV R0,-(SP) ;SAVE I/D TABLE POINTER MOV R2,-(SP) ;AND CURVE POINTER MOV DISBUF(R1),R0-4,R3 ;MAKE R3 POINT TO LEFT CURSOR ;X COORDINATE COMB GTCURC ;SET SWITCH FOR RIGHT CURSOR BEQ GTDCRC ;BR IF JUST DON ;R0 = NUMBER OF POINTS IN BUFFER JSR PC,GTMTYP ;CONVERT R0 TO NUMBER OF BYTES IN BUFFER ADD DISYBU(R1),R0 ;COMPUTE ADDR OF E RIGHT CURSOR MOV GTNPTS,DISXC1(R1) ;STORE RELATIVE CURSOR POSITION MOV DISCU2(R1),R5 ;SET RIGHT CURSOR VALUE SUB DISDLT(FIRST POINT MOV R0,GTBEND ;OUTSIDE OF THE BUFFER .IFDF GTD$2 ;SPECIAL FUNCTIONAL DX? MOV DIST(R1),R0 JSR PC,NEWDX ;COR1),R0 ;RESTORE Y VALUE IN CASE BOTH ;CURSORS ARE ON SAME POINT BR GTDCL ;GO DO RIGHT CURSOR GTDCND: .IFDF GTD$D ;SPMPUTE FIRST DX .ENDC MOV DISYBS(R1),R0 ;GET STARTING ADDRESS OF DISPLAYED ;POINTS JSR PC,GTFIXS ;SET PNTR FOR SUBR ECIAL GRAPH-Y MODE? TSTB DISGRA(R1) ;USE GRAPH MODE? BNE GTGP4 ;BR IF GRAPH MODE .ENDC ADD DISR(R1),R4 ;ADD DELTA-X FGETV MOV DIST(R1),GTNPTS ;NUMBER OF POINTS IN THE DISPLAY CLRB GTCURC ;CLEAR SWITCH FOR LEFT CURSOR ;R2 = INTEGER PORTIORACTION ADC R2 ;ADD CARRY BIT GTGP4: ADD DISDX(R1),R2 ;ADD DELTA-X TO X .IFDF GTD$2 ;SPECIAL FUNCTIONAL DELTA-X? MOV N OF X ;R4 = FRACTIONAL PORTION OF X ;INITAL VALUE OF X = HALF DELTA-X PLUS OFFSET IF ANY MOV DISDX(R1),R2 ;R2 & R4 = HALFR0,-(SP) ;SAVE Y BUFFER POINTER MOV GTNPTS,R0 ;PASS NUMBER OF POINTS REMAINING JSR PC,NEWDX ;LET USER COMPUTE NEXT X MOV R DELTA-X MOV DISR(R1),R4 ASR R2 ROR R4 .IFDF GTD$D ;SPECIAL GRAPH-Y MODE? TSTB DISGRA(R1) ;USE GRAPH MODE? BEQ GT0,R2 ;STORE X MOV (SP)+,R0 ;POP Y BUFFER POINTER .ENDC DEC GTNPTS ;DECREASE POINT COUNTER BNE GTDCL ;GO DO NEXT POIGP3 ;BR IF NOT GRAPH MODE CLR R4 ;CLEAR FRACTIONAL DELTA-X .ENDC GTGP3: MOV R2,-(SP) ;INTEGER PORTION OF HALF DELTA-X NT BR GTDCFI ;DONE ALL GTDCRC: MOV GTNPTS,DISXC2(R1) ;STORE RELATIVE CURSOR POSITION GTDCFI: TST (SP)+ ;POP HALF DELTA-X .IFDF GTD$7 ;OFFSETS & SCOPE SIZE? ADD DISOFX(R1),R2 ;X OFFSET .ENDC MOV DISCU1(R1),R5 ;R5 = CURRENT CURSOR VALUE OFF THE STACK MOV (SP)+,R2 ;RESTORE CURVE POINTER MOV (SP)+,R0 ;AND I/D TABLE POINTER JMP GTDCUR ;GO DO NEXT I/D TABLE TST (R3)+ ;INCREMENT DISPLAY BUFFER POINTER ;TO X COORDINATE GTDCL: CMP R5,R2 ;TIME TO SET CURSOR COORDINATES BLOS GTD .ENDC ; .SBTTL GTMTYP - SUBROUTINE ;--- GTMTYP SUBROUTINE --- ;SUBROUTINE TO MULTIPLY THE CONTENTS OF R0 BY THE NUMBER OF IS TERMINATED WITH A DSTOP/0. GTDS1: ADD (R4),R3 ;R3 = ADDR OF NEXT AVAILABLE LOC IN ;THE DISPLAY FILE CMP R3,GTBUFE ; ;BITS 2-0 TO 10-8 ASR R2 ; TO 9-7 .IFDF GTD$6 ;FIXED CURSORS BIC #001600,GTCINT ;CLEAR OLD INTENSITY BITS BIS R2,GTTEST IF COMPUTED ADDR IS IN THE BUFFER BHI GTERR ;BR IF ADDR IS OUT OF THE BUFFER! GTLOOP: MOV (R0)+,R1 ;R1 = I/D TABLE ADDRCINT ;SET INTENSITY .ENDC .IFDF GTD$6 ;FIXED CURSORS? .IFDF RT11$ ADDR GTCRSR,R0 ;R0 = ADDR OF CURSOR CODE .ENDC BNE GTID ;ZERO TERMINATES THE LIST .IFDF GTD$C ;SPECIAL RECAL FLAG? TSTB GTRCAL ;IS THIS AN INITIAL CALCULATION? B.IFDF CAPS$ MOV #GTCRSR,R0 .ENDC JSR PC,GTCPYC ;COPY DISPLAY CODE FOR LEFT CURSOR JSR PC,GTCPYC ;AND FOR RIGHT CURSOR MI GTSRTN ;BR IF SPECIAL RECALCULATION .ENDC MOV #DSTOP,R0 ;TERMINATE THE DISPLAY JSR PC,GTPUT0 CLR R0 JSR PC,GTPUT.ENDC MOV #SETPNT!INT,R0 ;POSITION CMD FOR FIRST PNT BIS R2,R0 ;SET INTENSITY VALUE JSR PC,GTPUT0 ;STORE IN BUFFER MO ADDR OF THE I/D TABLE ; MOV X,R0 ;R0 = MULTIPLICAND ; JSR PC,GTMTYP ;CALL SUBROUTINE ; *** ;RETURN IS HERE WITH THE RESUL0 MOV R3,(R4) ;COMPUTE NEW "BUFSPC" = SUB @GTBUFP,(R4) ; - ; ;ALL DONE, RETT IN R0 GTMTYP: TST DISTYP(R1) ;TEST DATA TYPE BEQ GTMTBY ;BR IF BYTE BPL GTMTWD ;BR IF WORD ASL R0 ;DOUBLE PRECISIOURN TO CALLER GTSRTN: CLR (R2) ;TERMINATE TABLE OF CURVE STARTS GTERTN: JSR PC,GTRSTR ;RESTORE REGISTERS 1-5 MOVB GTERRC,N OR FLOATING POINT GTMTWD: ASL R0 ;WORD GTMTBY: RTS PC ;BYTE ; .SBTTL GTDSP0 - SUBROUTINE ;--- GTDSP0 SUBROUTINE --- ;TR0 ;R0 = ERROR RETURN RTS PC ;ERROR ROUTINE - ABORT AND RETURN WITH R0 NON-ZERO GTERR: MOV GTSP,SP ;RESET THE STACK POIHIS SUBROUTINE IS CALLED TO ADD CURVES TO THE DISPLAY FILE. GTDSP0: JSR PC,GTSAVR ;SAVE REGISTERS 1-5 MOV SP,(PC)+ ;SAVE STNTER TO THE SAVED ;REGISTER AREA INCB GTERRC ;SET ERROR CONDITION CLR @GTCRVP ;CLEAR FIRST ENTRY IN CURVE TABLE BR ACK POINTER FOR LOW LEVEL GTSP: 0 ;ERROR EXITS CLRB GTERRC ;INDICATE NO ERROR CONDITION MOV (PC)+,R0 ;R0 = PNTR TO LIST GTERTN ;RETURN ;PROCESS I/D TABLE GTID: MOV R0,-(SP) ;SAVE TABLE LIST POINTER .IFDF GTD$C ;SPECIAL RECAL FLAG? MOV OF I/D TABLES GTLST: 0 MOV (PC)+,R2 ;R2 = PNTR TO LIST OF CURVE STARTS GTCRVP: 0 MOV (PC)+,R4 ;R4 = PNTR TO BUFFER CNTRL B(R0),(PC)+ ;SAVE PNTR TO NEXT I/D TABLE GTNXID: 0 .ENDC MOV R3,(R2)+ ;STORE STARTING ADDR OF NEXT CURVE MOV R4,-(SP) ;SLOCK GTBUFP: 0 MOV (R4)+,R3 ;R3 = ADDR OF BUFFER MOV (R4)+,GTBUFE ;BUFE = SIZE OF BUFFER IN BYTES ADD R3,(PC)+ ; = ADAVE ADDR OF "BUFSPC" .IFDF GTD$C ;SPECIAL RECAL FLAG? TSTB DISSKP(R1) ;RECALCULATE THIS CURVE? BNE GTID2 ;BR IF RECAL DR OF WORD IMMEDIATELY GTBUFE: 0 ;FOLLOWING THE END OF THE BUFFER. TST (R4) ;IF OFFSET = 0, THEN THERE IS NO BEQ GTDS1 JMP GTNRCL GTID2: .ENDC MOV R2,-(SP) ;SAVE CURVE LIST POINTER .IFDF GTD$6 ;FIXED CURSORS? MOV R3,-(SP) ;SAVE STA;TERMINATING DSTOP/0 TO OVERLAY SUB #4,(R4) ;THIS SUBROUTINE ASSUMES THAT IF ;SOMETHING IS IN THE DISPLAY FILE, ;ITRTING ADDR OF CURRENT CURVE .ENDC MOVB DISCI(R1),R2 ;R2 = INTENSITY VALUE BIC #177770,R2 ;REMOVE ANY GARBAGE SWAB R2 SXC1(R1) ;INITIALIZE CURSOR POSITIONS, LEFT MOV #1,DISXC2(R1) ;AND RIGHT .ENDC ;GET NEXT POINT GTGETP: .IFDF GTD$5 ;XKIP IF PLUS NEG (SP) ;GET MAGNITUDE OF DX BIS #100,(SP) ;MAKE SIGNED MAGNITUDE NEG R0 ;MAKE DX PLUS GTGXP: CMP R0,#77 Y DISPLAYS? TST DISXBU(R1) ;IF XBU=0, Y DISPLAY ELSE XY BEQ GTGETX ;BR IF Y DISPLAY, GO GET X .IFNDF GTD$2 ;NO SPECI;IS DX WITHIN RANGE? BGT GTPTMX ;BR IF NOT ;DX AND DY ARE WITHIN THE REL PNT MODE RANGE TSTB (PC)+ ;WHAT MODE ARE WE AL FUNCTIONAL DELTA-X? ;GET X VALUE FROM BUFFER MOV R5,R0 ;NEXT X ADDR IN R0 MOVB #1,GTXVAL ;SET SWITCH FOR X VALUE IN? GTDMOD: 0 ;0=POINT MODE, 177=RELATIVE PT MODE BNE GTGTDX ;BR IF WE ARE IN REL MODE COMB GTDMOD ;MAKE IT REL MODE JSR PC,GTGETV ;GET VALUE OF X MOV R0,R5 ;UPDATE X ADDR IN R0 MOV (SP)+,X1 ;STORE NEXT X .ENDC .ENDC GTGETX: .IFDF GTMOV #SETRLP,R0 ;PUT REL PNT MODE IN DISPLAY FILE JSR PC,GTPUT0 ;DO IT GTGTDX: MOV (SP)+,R0 ;GET DX SWAB R0 ;MOVE DX TO BITD$2 ;SPECIAL FUNCTIONAL DELTA-X? MOV GTNPTS,R0 ;PASS NUMBER OF POINTS REMAINING JSR PC,NEWDX ;LET USER COMPUTE NEXT DX .ES 13-7 ASR R0 BIS (SP)+,R0 ;R0 = 200 * DX + DY BIS #40000,R0 ;SET INTENSITY ON BIT BR GTPNTD ;POINT DONE ;DX AND/OR DNDC ;GET NEXT Y VALUE MOV R4,R0 ;NEXT Y ADDR IN R0 .IFDF GTD$5 ;XY DISPLAYS? CLRB GTXVAL ;CLEAR SWITCH FOR Y VAY IS GREATER THAN +77 OR LESS THAN - 77 GTPTMX: TST (SP)+ ;POP DX OFF THE STACK GTPTMY: TST (SP)+ ;POP DY OFF THE STACK LUE .ENDC CMP R0,GTBEND ;TEST TO SEE IF CURRENT Y ADDR ;IS WITHIN THE Y BUFFER BHIS GTPFIN ;BR IF Y ADDR IS OUT OFTSTB GTDMOD ;WHAT MODE ARE WE IN? BEQ GTPTPT ;BR IF WE ARE IN PNT MODE .IFDF GTD$D ;SPECIAL GRAPH-Y MODE? BPL GTGP1 V DISYBS(R1),R4 ;R4 = PNTR TO Y DATA .IFDF GTD$5 ;XY DISPLAYS? MOV DISDX(R1),R5 ;R5 = PNTR TO X DATA IF XY DISPLAY .END THE BUFFER JSR PC,GTGETV ;GET VALUE OF Y MOV R0,R4 ;UPDATED Y ADDR IN R0 MOV (SP),(PC)+ ;STORE NEXT Y Y1: 0 ;CURRENT C CLRB GTDMOD ;SET TO INDICATE POINT MODE JSR PC,GTFIXS ;FIX PNTR FOR GETV SUBR MOV DIST(R1),GTNPTS ;NUMBER OF POINTS IY VALUE .IFDF GTD$D ;SPECIAL GRAPH-Y MODE? TSTB DISGRA(R1) ;USE GRAPH MODE? BNE GTPTMY ;BR IF GRAPH MODE .ENDC SN THE CURVE MOV #40000,X0 ;HIGH VALUES TO FORCE POINT MODE MOV #40000,Y0 ;ON THE FIRST POINT .IFDF GTD$7 ;OFFSETS & SCOUB (PC)+,(SP) ;COMPUTE DY Y0: 40000 ;PREVIOUS Y VALUE MOV (SP),R0 ;TEST FOR ABS(DY) WITH RANGE FOR ;REL PNT MODE BPPE SIZE? MOV DISOFX(R1),X1 ;X OFFSET .ENDC .IFNDF GTD$7 ;NO OFFSETS & SCOPE SIZE? CLR X1 ;0 OFFSET .ENDC CLR XL GTGYP ;SKIP IF PLUS NEG (SP) ;GET MAGNITUDE OF DY BIS #100,(SP) ;MAKE SIGNED MAGNITUDE NEG R0 ;MAKE DY PLUS GTGYP: CF ;X FRACTION MOV DISBUF(R1),R0 ;R0 = NUMBER OF POINTS IN Y BUFFER JSR PC,GTMTYP ;CONVERT TO OFFSET IN BYTES ADD DISYBU(RMP R0,#77 ;IS DY WITHIN RANGE? BGT GTPTMY ;BR IF NOT MOV (PC)+,-(SP) ;GET X VALUE X1: 0 ;CURRENT X VALUE SUB (PC)+,(S1),R0 ;COMPUTE ADDR OF FIRST POINT OUTSIDE MOV R0,(PC)+ ;OF THE BUFFER GTBEND: 0 .IFDF GTD$6 ;FIXED CURSORS? MOV #1,DIP) ;COMPUTE DX X0: 40000 ;PREVIOUS X VALUE MOV (SP),R0 ;TEST FOR ABS(DX) WITH RANGE FOR ;REL PNT MODE BPL GTGXP ;SA(R1) ;SPECIAL GRAPH MODE? BEQ GTGP2 ;BR IF NOT TSTB GTDMOD ;IS THIS THE FIRST POINT? BNE GTPD1 ;BR IF NOT BIC #40000 RIGHT CURSOR MOV Y1,20(R0) .ENDC MOV (SP)+,R2 ;POP CURVE LIST POINTER .IFDF GTD$C ;SPECIAL RECAL FLAG MOV GTNXID,-4(R3) ;CLEAR INTENSITY BIT OF X VALUE MOV DISDX(R1),R0 ;BUILD A "LOAD STATUS REG B" CMP #77,R0 ;IF DELTA-X IS GREATER THA,R1 ;IS THIS THE LAST TABLE? BEQ GTPFI3 ;BR IF LAST TSTB GTRCAL ;ANY SIZE CHANGE? BMI GTPFI1 ;BR IF NO CHANGES TSTB DN 77, BGT GTGP1A ;THEN USE 77 FOR GRAPH INCREMENT MOV #77,R0 MOV R0,DISDX(R1) ;CHANGE DELTA-X ALSO GTGP1A: BIC #177700,RISSKP(R1) ;RECAL THIS TABLE? BNE GTPFI4 ;BR IF RECAL GTPFI1: CMP R3,(R2) ;CHECK IF RECAL ANYWAY BLOS GTPFI2 ;BR IF UNN0 ;COMMAND WITH INTEGER DELTA-X ADD #174100,R0 JSR PC,GTPUT0 ;STORE IT MOV #SETGRA,R0 ;STORE A GRAPH-Y MODE COMMAND JSR ECESSARY INCB DISSKP(R1) ;FORCE RECAL BR GTPFI4 GTPFI2: BEQ GTPFI4 ;BR IF NO FILLING REQUIRED MOV #DNOP,R0 ;FILL BUFFEPC,GTPUT0 MOV Y1,R0 ;STORE FIRST Y AGAIN BECAUSE JSR PC,GTPUT0 ;GRAPH-Y INCREMENTS AFTER DISPLAY INCB GTDMOD ;SET THE NOR WITH DISPLAY NOP'S JSR PC,GTPUT0 ;STORE IT BR GTPFI1 ;GO SEE IF THAT FILLED IT GTPFI3: .IFDF GTD$D ;SPECIAL GRAPH-Y MT FIRST POINT SWITCH BR GTGP5 .ENDC ;POINT HAS BEEN ENTERED INTO THE DISPLAY FILE GTGP2: MOV X1,X0 ;MOVE NEW TO OLD ODE? TSTB GTRCAL ;ANY SIZE CHANGES? BPL GTPFI4 ;BR IF SIZE CHANGES GTPF3A: CMP #DSTOP,(R3) ;ARE WE AT THE END? BEQ GTPF MOV Y1,Y0 .IFDF GTD$5 ;XY DISPLAYS? TST DISXBU(R1) ;IF XBU=0, Y DISPLAY ELSE XY BNE GTPD1 ;BR IF XY DISPLAY .ENDC I4 ;BR IF DONE MOV #DNOP,(R3)+ ;FILL WITH DISPLAY NOP'S BR GTPF3A ;CHECK NEXT .ENDC GTPFI4: .ENDC MOV (SP)+,R4 ;P ;COMPUTE NEXT X VALUE ADD DISR(R1),(PC)+ ;ADD DELTA X FRACTION XF: 0 ;CURRENT X FRACTION ADC X1 ;ADD CARRY BIT GTGPOP ADDR OF "BUFSPC" GTPFI5: MOV (SP)+,R0 ;POP TABLE LIST POINTER JMP GTLOOP ;GO TEST FOR ANOTHER I/D TABLE .IFDF GTD$C 5: ADD DISDX(R1),X1 ;ADD DELTA X TO X GTPD1: DEC (PC)+ ;DECR NUMBER OF POINTS IN THIS CURVE GTNPTS: 0 .IFL .-GTGETP-376 ;;SPECIAL RECAL FLAG? GTNRCL: MOV (R2),R3 ;R3 = ADDR OF NEXT CURVE INCB DISSKP(R1) ;LEAVE IT AT 1 BR GTPFI4 .ENDC ;ERRWITHIN BRANCH RANGE? BNE GTGETP ;BR IF MORE POINTS .ENDC .IFGE .-GTGETP-376 ;OUT OF BRANCH RANGE? BEQ GTPFIN ;BR IF OR ROUTINE LINKAGE GTERR1: JMP GTERR ; .SBTTL GTCPYB - SUBROUTINE ;SUBROUTINE TO COPY A LIST TO THE DISPLAY FILE ;CALLING;BR IF NOT FIRST POINT .ENDC MOV #SETPNT,R0 ;PUT PNT MODE IN DISPLAY BUFFER JSR PC,GTPUT0 ;DO IT CLRB GTDMOD ;CLEAR SNO MORE POINTS JMP GTGETP ;GO DO NEXT POINT .ENDC ;ALL POINTS FOR THIS I/D TABLE HAVE BEEN ENTERED INTO THE DISPLAY ;FILWITCH FOR POINT MODE GTPTPT: MOV X1,R0 ;PUT X VALUE IN DISPLAY BUFFER BIS #40000,R0 ;SET INTENSITY BIT JSR PC,GTPUT0 ;STASE. COMPUTE NEW "BUFSPC" AND GO CHECK FOR ADDITIONAL I/D TABLES. GTPFIN: .IFDF GTD$6 ;FIXED CURSORS? MOV (SP)+,R0 ;POP STAH IT GTGP1: MOV Y1,R0 ;GET Y VALUE IN DISPLAY FILE GTPNTD: JSR PC,GTPUT0 .IFDF GTD$D ;SPECIAL GRAPH-Y MODE? TSTB DISGRRTING ADDR OF CURRENT CURVE MOV X1,2(R0) ;INITIALIZE LEFT CURSOR X-COORD MOV Y1,4(R0) ;AND Y-COORD MOV X1,16(R0) ;SAME FOR SEQUENCE: ; ;R3 CONTAINS ADDR OF NEXT LOC IN BUFFER ; MOV #LIST,R0 ;R0 = ADDR OF LIST ; JSR PC,GTCPYB ; ... ;LIST: /2 ;NUMBER OF WORDS IN LIST ; WORD1 ;FIRST WORD IN THE LIST ; WORD2 ; ... ;ENDL: WORDN ;LAST WORD IN THE LIST GTLING SEQUENCE: ; R0 = VALUE TO PLACE IN THE BUFFER ; R3 = POINTER TO THE NEXT AVAILABLE LOCATION IN THE BUFFER ; JSR PC,GTPUTCPYB: MOV R2,-(SP) ;SAVE R2 MOV (R0)+,R2 ;R2 = NUMBER OF WORDS IN THE LIST GTCM: CMP R3,GTBUFE ;CHECK FOR SPACE AVAILABLE B0 ; *** ;RETURNS HERE IF NO BUFFER OVERFLOW GTPUT0: CMP R3,GTBUFE ;ARE WE AT THE END OF THE BUFFER? BHIS GTERR1 ;BR IF HI GTERR1 ;BR IF ERROR MOV (R0)+,(R3)+ ;MOVE WORD TO DISPLAY FILE DEC R2 ;NUMBER OF WORDS REMAINING BGT GTCM ;BR IF MORAT END MOV R0,(R3)+ ;STORE CMD OR DATA IN DISPLAY FILE RTS PC ; .SBTTL GTGETV - SUBROUTINE ;SUBROUTINE TO GET A VALUE FROE TO MOVE MOV (SP)+,R2 ;RESTORE R2 RTS PC .IFDF GTD$6 ;FIXED CURSORS? ; .SBTTL GTCPYC - SUBROUTINE ;CALLING SEQUENCE:M A DATA BUFFER, PERFORM THE ;REQUIRED SCALING AND RETURN WITH A 10 BIT RESULT ON THE ;STACK. ;BEFORE CALLING THIS SUBROUTINE ;R3 CONTAINS ADDR OF NEXT LOC IN BUFFER ; MOV #LIST,R0 ;R0 = ADDR OF CURSOR CODE ; JSR PC,GTCPYC GTCPYC: MOV R0,-(SP), THE POINTER VARIABLE "GTFSBP" MUST ;HAVE BEEN SET TO POINT TO EITHER "GTFBYT", "GTFINT", "GTFDBL", OR ;"GTFFLT" ACCORDING TO ;SAVE R0 JSR PC,GTCPYB ;COPY FROM "SETPNT" TO "DSTOP" MOV R3,R0 ;MOV "." TO R0 CMP (R0)+,(R0)+ ;COMPUTE ".+4" RELATIVE T THE DATA TYPE TO BE FETCHED: BYTE, SINGLE ;PRECISION INTEGER, DOUBLE PRECISION INTEGER, OR FLOATING POINT. ;GTXVAL MUST BE CLO START OF DISPLAY FILE JSR PC,GTPUT0 ;STASH IT IN THE DISPLAY FILE .IFDF RT11$ ADDR FIXCUR,R0 ;R0 = ADDR OF FIXED CURSOR EARED (CLRB) TO FETCH A Y VALUE AND SET TO FETCH AN ;X VALUE. ;CALLING SEQUENCE: ; R0 = ADDRESS OF THE DATA ELEMENT ; R1 = IDISPLAY SUB .ENDC .IFDF CAPS$ MOV #FIXCUR,R0 .ENDC JSR PC,GTPUT0 ;STASH IT IN THE DISPLAY FILE MOV (SP)+,R0 ;RESTORE/D TABLE POINTER ; JSR PC,GTGETV ;GET VALUE FROM A BUFFER ; *** ;RETURN HERE IF NO ERROR OCCURRED WITH ;R0 UPDATED TO T PNTR TO DISPLAY CODE RTS PC .ENDC ; .SBTTL GTSAVR - SUBROUTINE ;PAIR OF SUBROUTINES TO SAVE AND RESTORE REGISTERS 1 THRUHE NEXT ELEMENT GTGETV: MOV (SP),-(SP) ;MAKE A HOLE IN THE STACK FOR THE RESULT MOV R0,-(SP) ;SAVE ELEMENT POINTER AND JS 5 GTSAVR: MOV (SP)+,GTSRTA ;STORE RETURN ADDR MOV R1,-(SP) ;SAVE R1-R5 MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R PC,GTSAVR ;R1-R5 JMP @(PC)+ ;DISPATCH TO ELEMENT FETCH ROUTINE ;FBYT, FINT, FDBL, OR FFLT GTFSBP: 0 ;ADDR OF SUBROUTR5,-(SP) GTRRTN: JMP @(PC)+ ;RETURN TO LOC SPECIFIED BELOW GTSRTA: GTRRTA: 0 ; .SBTTL GTRSTR - SUBROUTINE ;RESTORE R5-R1INE TO FETCH A DATA ELEMENT, ;NORMALIZE IT, AND INCREMENT THE POINTER TO ;THE NEXT ELEMENT. SUB CAN BE ANY LISTED IN GTRSTR: MOV (SP)+,GTRRTA ;STORE RETURN ADDR MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (S ;THE GTFSUB TABLE. ;ROUTINE TO FETCH A BYTE GTFBYT: MOVB (R0),R2 ;FETCH BYTE AND TRANSFORM TO ;DOUBLE PRECISION EVENTS THE FLOATING POINT PACKAGE FROM ABORTING THE ;DISPLAY. GTFFIX: MOV (SP),R0 ;PERMITTED RANGE OF EXPONENT IS 000-436 SIGN EXTENSION GTGFIP: ADD R5,R2 ;DOUBLE PRECISION ADD ADC R0 ADD R4,R0 .ENDC .IFNDF GTD$7 ;NO SCOPE SIZE & OFFSET BIC #100177,R0 ;CLEAR EVERTHING BUT THE EXPONENT CMP #043600,R0 ;TEST EXP FOR MAXIMUM VALUE BGT GTFFL1 ;BR IF EXP IS OK GTGFI3: .ENDC .IFNDF GTD$1 ;NO WRAP-AROUND CHECK BIC #176000,R2 ;CLEAR EVERYTHING BUT THE RESULT .ENDC .IFDF GTMOV #77777,2(SP) ;MAKE A MAXIMUM VALUE TST (SP)+ ;CHECK SIGN BPL GTFFL2 ;BR IF SIGN IS PLUS NEG (SP) ;MAKE VALUE NEGATID$1 ;WRAP-AROUND CHECK BVS GTWRAP ;BR IF WRAP-AROUND BNE GTWRPO ;BR IF OVERFLOW .IFDF GTD$5 ;XY DISPLAYS? TSTB GTXBR GTFIN1 ;REMAINDER OF THE PROCESS IS THE SAME ;AS FOR AN INTEGER ;ROUTINE TO FETCH A SINGLE PRECISION INTEGER GTFIVE BR GTFFL2 GTFFL1: JSR R4,$POLSH ;FIX THE FLOATING POINT VALUE $RI,.+2 ;EXIT POLISH MODE GTFFL2: MOV (SP)+,R0 ;STASH TNT: MOV (R0),R2 ;FETCH WORD AND TRANSFORM TO A ;DOUBLE PRECISION INTEGER GTFIN1: CLR R0 ;CLEAR HIGH ORDER PART TST R2 HE INTEGER RESULT JSR PC,GTRSTR ;RESTORE R1-R5 MOV R0,R2 ;PUT RESULT WHERE IT BELONGS BR GTFIN1 ;GO FINISH UP ;FETCH ;DO 11/40-45 SXT THE HARD WAY BPL GTGFIN ;BR IF SIGN OK COM R0 ;MAKE SIGN EXTENSION FOR NEGATIVE RESULT BR GTGFIN ;GO AN X VALUE ONLY, NO SCALING REQUIRED .IFDF GTD$5 ;XY DISPLAYS? GTFX1: MOV 2(R0),-(SP) ;STACK FLOATING POINT X VALUE MOV FINISH UP ; ROUTINE TO FETCH A DOUBLE PRECISION INTEGER GTFDBL: MOV (R0)+,R2 ;GET HIGH ORDER MOV (R0),R0 ;GET LOW ORDER(R0),-(SP) BR GTFFIX .ENDC .ENDC ;FINISH UP THE PROCESS GTGFIN: .IFDF GTD$5 ;XY DISPLAYS? TSTB GTXVAL ;X OR Y BR GTGFIN ;GO FINISH UP ;ROUTINE TO FETCH A FLOATING POINT NUMBER .IFDF GTD$A ;FLOATING POINT DATA? GTFFLT: JSR PVALUE? BNE GTGFI6 ;BR IF X .ENDC .IFDF GTD$7 ;SCOPE SIZE & OFFSET? CLR R4 ;CLEAR HIGH ORDER OF OFFSET .ENDC MC,GTSAVR ;SAVE R1-R5 .IFDF GTD$5 ;XY DISPLAYS? TSTB GTXVAL ;TEST FOR X VALUE BNE GTFX1 ;BR IF GETTING AN X VALUE .EOVB DISSC(R1),R3 ;GET SCALE FACTOR BEQ GTGFI2 ;BR IF NO SCALING IS TO BE DONE BPL GTGFI1 ;BR IF WE ARE TO SCALE LEFT ;SNDC MOV DISMPO+2(R1),-(SP) ;STACK LOW ORDER OF MULTIPLIER MOV DISMPO(R1),-(SP) ;AND HIGH ORDER MOV 2(R0),-(SP) ;STACK LOCALING RIGHT GTGFI0: ASR R0 ;SCALE HIGH ORDER THEN ROR R2 ;THE LOW ORDER INCB R3 ;DONE YET? BMI GTGFI0 ;BR IF MORE W ORDER OF ELEMENT MOV (R0),-(SP) ;AND HIGH ORDER MOV DISMPO+6(R1),-(SP) ;STACK LOW ORDER OF OFFSET MOV DISMPO+4(R1),-(SP)TO DO BR GTGFI2 ;SCALING LEFT GTGFI1: ASL R2 ;SCALE LOW ORDER ROL R0 ;THE HIGH ORDER .IFDF GTD$1 ;WRAP AROUND C ;AND HIGH ORDER JSR R4,$POLSH ;COMPUTE (Y-OFFSET)*MULTIPLIER $SBR ;SUBTRACT OFFSET FROM Y $MLR ;AND MULTIPLY BY THE MHECK? BVS GTWRAP ;BR IF WRAP-AROUND .ENDC DECB R3 ;DONE YET? BGT GTGFI1 ;BR IF MORE TO DO GTGFI2: .IFDF GTD$7 ;ULTIPLIER .+2 ;EXIT POLISH MODE ;MAKE SURE FLOATING POINT VALUE IS SMALL ENOUGH TO BE CONVERTED TO AN ;INTEGER. THIS PRSCOPE SIZE & OFFSET? MOV DISOFY(R1),R5 ;ADD THE Y OFFSET GTGFI3: BPL GTGFIP ;BR IF HIGH ORDER OFFSET OK COM R4 ;THIS IS A X TO SIZE-X .ENDC .IFNDF GTD$7 ;NO SCOPE SIZE & OFFSETS? CMP #1777,R2 ;X GREATER THAN XMAX? BGE GTLCHK ;BR IF OK GFFSET .ENDC BR GTGFI3 .ENDC ; .SBTTL GTFIXS - SUBROUTINE ;SUBROUTINE TO SET THE DISPATCH POINTER ACCORDING TO THE DATA TGFI5: MOV #1777,R2 ;SET X TO XMAX .ENDC .IFZ GTD$1 ;SET WRAP-AROUND FLAG? MOVB #1,DEWRFL ;INDICATE X-WRAP OCCURRED . ;TYPE BEING FETCHED. GTFIXS: MOV R0,-(SP) ;SAVE R0 MOV DISTYP(R1),R0 ;TYPE = 1, 0, -1, & -2 FOR DATA NEG R0 ;TYPES INTEENDC BR GTGRTN .ENDC .IFNDF GTD$5 ;NO XY DISPLAYS? GTWRAP: BCC GTGFI4 ;BR IF OVERFLOW BR GTLCY1 ;IT WAS UNDERFGER, BYTE, DOUBLE INC R0 ;PRECISION INTEGER, AND FLOATING ASL R0 ;POINT. COMPUTE ADDRESS OF MOV GTFSUB(R0),GTFSBP ;SUBRLOW .ENDC ;WRAP-AROUND OCCURRED, BUT NOT VIA OVERFLOW. MOVE SIGN INTO CARRY ;AND TREAT AS OVERFLOW GTWRPO: ROL R0 ;SEOUTINE TO FETCH AN ;ELEMENT, NORMALIZE IT, AND INCREMENT ;THE POINTER MOV (SP)+,R0 ;RESTORE R0 RTS PC ; .SBTTL T CARRY = SIGN BR GTWRAP ;CHECK FOR UNDERFLOW GTLCHK: .IFDF GTD$5 ;XY DISPLAYS? TSTB GTXVAL ;X OR Y VALUE? BNE GTLGTCCMD - SUBROUTINE ;--- 'DCU' CMD --- ;THIS CMD COMPLIMENTS BYTE 2 OF DISCU ;0=ELIMINATE CURSORS, 377=ACTIVATE CURSORS .CX ;BR IF X .ENDC .IFDF GTD$7 ;SCOPE SIZE AND OFFSET? CMP DISBOT(R1),R2 ;IS Y BELOW Y-BOT? BLOS GTGRTN ;BR IF OK GIFDF GTD$6 ;FIXED CURSORS? GTCCMD: JSR PC,SAVARG MOV GTIDTB,R1 ;GET LST OF I/D TBLS DIC2: MOV (R1)+,R0 ;GET TBL BEQ DIVAL ;X OR Y VALUES? BNE GTGFIX ;BR IF X .ENDC .IFDF GTD$7 ;SCOPE SIZE & OFFSETS? CMP DISTOP(R1),R2 ;Y GREATER THAN TLCY1: MOV DISBOT(R1),R2 ;SET Y = Y-BOT .ENDC .IFNDF GTD$7 ;NO SCOPE SIZE AND OFFSET? TST R2 ;IS Y BELOW 0? BGE GTGRTOP OF DISPLAY? BHIS GTLCHK ;BR IF OK GTGFI4: MOV DISTOP(R1),R2 ;SET Y TO YMAX .ENDC .IFNDF GTD$7 ;NO SCOPE SIZE & OFTN ;BR IF OK CLR R2 ;MAKE A GOOD Y .ENDC .IFDF GTD$5 ;XY DISPLAYS? BR GTGRTN ;Y DONE GTLCX: .IFDF GTD$7 ;SCOFSETS? CMP #GTYMAX,R2 ;Y GREATER THAN TOP OF DISPLAY? BHIS GTLCHK ;BR IF OK GTGFI4: MOV #GTYMAX,R2 ;SET Y TO YMAX .ENDC PE SIZE & OFFSET? CMP DISOFX(R1),R2 ;IS X WITHIN RANGE? BLE GTGRTN ;BR IF OK GTLCX1: MOV DISOFX(R1),R2 ;MAKE X OK .ENDC .IFZ GTD$1 ;SET FLAG? MOVB #1,DEWRFL ;INDICATE WRAP-AROUND OCCURRED .ENDC BR GTGRTN .IFDF GTD$5 ;XY DISPLAYS .IFNDF GTD$7 ;NO SCOPE SIZE & OFFSET? TST R2 ;IS X WITHIN RANGE? BGE GTGRTN ;BR IF OK CLR R2 ;MAKE A GOOD X .END ;WRAP-AROUND OCCURRED. TEST FOR X OR Y. GTWRAP: BCS GTWNEG ;BR IF UNDERFLOW TSTB GTXVAL ;X OR Y WRAP-AROUND BNE GTGFC .ENDC GTGRTN: .ENDC MOV R2,R0 ;KEEP IT FROM GETTING CLOBBERED JSR PC,GTRSTR ;RESTORE R1-R5 MOV R0,4(SP) ;PUTI5 ;BR IF X BR GTGFI4 ;IT WAS Y GTWNEG: TSTB GTXVAL ;X OR Y UNDERFLOW BNE GTLCX1 ;BR IF X BR GTLCY1 GTGFIX: .IFDF RESULT IN OUR LITTLE HOLE MOV (SP)+,R0 ;GET DATA POINTER ADD DISDLT(R1),R0 ;UPDATE IT FOR NEXT VALUE RTS PC ;RETURN WITHGTD$7 ;SCOPE SIZE & OFFSETS? CMP DISSZX(R1),R2 ;X GREATER THAN SIZE-X BGE GTLCHK ;BR IF OK GTGFI5: MOV DISSZX(R1),R2 ;SET RESULT ON THE STACK .IFDF GTD$5 ;XY DISPLAYS? GTGFI6: .IFDF GTD$7 ;SCOPE SIZE & OFFSET? MOV DISOFX(R1),R5 ;ADD THE X OX(R0) ;SET FLG FOR OK TO EXPAND .ENDC JSR PC,GTSET BR DIB2 DIB1: JSR PC,RSTARG RTS PC .ENDC ; .SBTTL GTXCMD - SUBHE TOTAL POINTS DISPLAYED & DOUBLE THE TABLE DELTA GTDCMD: JSR PC,SAVARG MOV GTIDTB,R1 ;GET TABLE LIST DID2: MOV (R1)+,R0ROUTINE ;--- 'DEX' CMD --- ;IF DISCU = 377 & DISTX=0 THEN OK TO EXPAND BETWEEN CURSURS ; FOR DISPLAYS POINTED TO BY 'GTIDT ;GET TABLE BEQ DID1 ;NO MORE TABLES MOV DIST(R0),R5 ;GET TOTAL POINTS ASR R5 ;HALF THE TOTAL POINTS BEQ DID2 ;NB' ;IF DISCU=377 & DISTX=1 THEN OK TO RESTORE ;IF DISCU=0, IGNORE THIS CMD. .IFDF GTD$9 GTXCMD: JSR PC,SAVARG ;SAV R0-R5EED 1 POINT TO DISPLAY ASR DIST(R0) ASL DISN(R0) JSR PC,GTSET BR DID2 DID1: JSR PC,RSTARG RTS PC ; .SBTTL GTRCMD - MOV GTIDTB,R2 ;GET TBL LST DIX4: MOV (R2)+,R1 ;GET TBL BEQ DIX2 ;NO MORE TBLS TSTB DISCU(R1) BEQ DIX2 ;IGNORE CM SUBROUTINE ;---'DRA' CMD--- ;RAISE (SCALE UP) DATA BY 2 GTRCMD: JSR PC,SAVARG MOV GTIDTB,R1 ;GET TABLE LIST DIR2: MOV D, CURSORS AREN'T UP TST DISTX(R1) ;EXPAND OR RESTORE? BNE DIX1 MOV DISST(R1),DISSTX(R1) ;EXPAND! SAVE ST MOV DIST(R1),(R1)+,R0 ;GET TABLE BEQ DIR1 ;NO MORE TABLES INCB DISSC(R0) ;SCAFAC=SCAFAC+1 JSR PC,GTSET BR DIR2 DIR1: JSR PC,RSTADISTX(R1) ;AND T MOV DIST(R1),R0 ;T SUB DISXC1(R1),R0 ;T-XC1=R0 MOV DISN(R1),R5 ;N=R5 JSR PC,MULT ;RTNS WITH PRODUCRG RTS PC ; .SBTTL GTLCMD - SUBROUTINE ;---'DLO' CMD--- ;LOWER (SCALE DOWN) DATA BY 2 GTLCMD: JSR PC,SAVARG MOV (PC)T IN R5 ADD R5,DISST(R1) ;ST=ST+(T-XC1)*N MOV DISXC1(R1),DIST(R1) SUB DISXC2(R1),DIST(R1) INC DIST(R1) ;T=(XC1-XC2)+1 +,R1 GTIDTB: 0 ;PNTR TO LIST OF I/D TABLES TO UPDATE DIL2: MOV (R1)+,R0 BEQ DIL1 DECB DISSC(R0) ;SCAFAC=SCAFAC-1 JSR P DIX3: MOV R1,R0 ;GTSET NEED TBLADR IN R0 JSR PC,GTSET ;CALL 'GTSET' BR DIX4 DIX2: JSR PC,RSTARG ;RESTORE R1 RTS PC C,GTSET BR DIL2 DIL1: JSR PC,RSTARG RTS PC ; .SBTTL GTTCMD - SUBROUTINE ;---'DPO #' CMD ;CHANGE THE TOTAL NUMBER OF PODIX1: MOV DISSTX(R1),DISST(R1) ;RESTORE! ST & T MOV DISTX(R1),DIST(R1) CLR DISTX(R1) ;USED AS A FLG TOO BR DIX3 .ENDC INTS, T TO # ;CALL JSR PC,GTTCMD ; R0=#POINTS GTTCMD: JSR PC,SAVARG MOV R0,R3 ;GET #POINTS & SAV IN R3 BLE DIT1 ;NEEDC1 ;NO MORE TBLS COMB DISCU(R0) BR DIC2 DIC1: JSR PC,RSTARG RTS PC .ENDC ; .SBTTL GTBCMD - SUBROUTINE ;--- 'DBA' ; .SBTTL GTICMD - SUBROUTINE ;---'DIN' CMD--- ;INCREASE BY 2, THE TOTAL #PTS DISPLAYED & HALF THE TABLE DLTA GTICMD: JSR CMD --- ;RE-INITIALIZE THE DISPLAY AS IT ORIGINALLY WAS IN THE BEGINNING .IFDF GTD$8 ;"DBA" CMD? GTBCMD: JSR PC,SAVARG PC,SAVARG MOV GTIDTB,R1 ;GET TABLE LST DII2: MOV (R1)+,R0 ;GET TABLE BEQ DII1 ;NO MORE TABLES MOV DISN(R0),R5 ;TABLE MOV GTIDTB,R1 DIB2: MOV (R1)+,R0 BEQ DIB1 MOV DISSTC(R0),DISST(R0) ;RESET ST,N,T,CU,SC MOV DISNC(R0),DISN(R0) ;BACK TO O DELTA ASR R5 ;HALF TABLE DELTA BEQ DII2 ;TABLE DELTA MUST BE > 0 ASR DISN(R0) ;IT IS ASL DIST(R0) ;DOUBLE TOTAL PRIGINALS MOV DISTC(R0),DIST(R0) MOVB DISCUC(R0),DISCU(R0) MOVB DISSCC(R0),DISSC(R0) .IFDF GTD$9 ;"DEX" CMD? CLR DISTOINTS JSR PC,GTSET BR DII2 DII1: JSR PC,RSTARG RTS PC ; .SBTTL GTDCMD - SUBROUTINE ;---'DDE' CMD--- ;DECREASE BY 2, TGTSET BR DIT2 DIT1: JSR PC,RSTARG RTS PC ; .SBTTL GTNDMD - SUBROUTINE ;---'DTA #' CMD--- ;CHANGE THE TABLE DELTA, N TOAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS N # ;CALL JSR PC,GTNCMD ; R0=TBLDLTA GTNCMD: JSR PC,SAVARG MOV R0,R3 ;GET TABLE DELTA & SAV IN R3 BLE DIN1 ;TABLE DELTOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;CONDITIONAL ASSEMBLY PARAMETERS ;AD$1 ;SHOW DISPA MUST BE > 0 MOV GTIDTB,R1 ;GET TABLE LIST DIN2: MOV (R1)+,R0 ;GET TABLE BEQ DIN1 MOV R3,DISN(R0) ;N=# JSR PC,GTSET LAY IF DEFINED ;FOR NO PRE-AMPS ON A/D ;AD$2 ;IF NOT DEFINED THE MUX IS CHANGED AT ;THE A/D STARTED AT THE SAME TIME ;IBR DIN2 DIN1: JSR PC,RSTARG RTS PC .END F DEFINED THE A/D START IS DELAYED ;BY A USER SUBROUTINE AFTER ;THE MUX IS CHANGED. ;AD$3 ;DEFINE IF MUTI CHANNEL CAPABILITY DESIRED ;AD$4 ;DEFINE IF FAST SAMPLING DESIRED ;AD$5 ;DEFINE IF LED READOUT DESIRED ;GT40$ ;GT40 IF DEFINED ;AD$INT ;SAMPLING PRIOROTY FOR FAST SAMPLE MODE ;ADDTYP=-1 ;SET AD$INT =200 FOR PRIORITY 4 ; =240 5 ; =300 6 ;IF NOT DEFINED , THE DEFAULT VALUE IS 200 ;ADFRQ$ ;=1 FOR 60 CPS ;=0 FOR 50 CPS ;VR14$ ;IF DEFINED, THE SCO.TITLE ADSAM ;LAB APPLICATION-11 SMALL A/D SAMPLE MODULE ;DEC-11-SLABA-C-LA7 ;FILE ADSAM.MAC ;FILE ID ADSAM.3 .CSECT ADSAMPPE IS VR14. ;AR11$ ;IF DEFINED, SYSTEM HAS AR11 RATHER THAN LPS .IFDF AR11$ & AD$5 NOLEDS ;AR11 HAS NO LEDS, CAUSE UNDEFINE ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR D GLOBAL ;IF AR11 AND AD$5 IS DEFINED. .ENDC ;LPS11$ ;IF DEFINED, SYSTEM HAS LPS ;RT11$ ;RT-11 O.S. ;CONDITIONAL CHECUSE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE,KS .IFNDF AD$INT AD$INT= 200 ;DEFAULT TO PRIORITY 4 .ENDC .IFDF GT40$ & VR14$ ERROR=XXXX ;CAN NOT HAVE BOTH DISPLAYS DE OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSFINED. .ENDC .IFDF AD$1 .IFNDF GT40$ & VR14$ ERROR = XXXX ;IF AD$1 DEFINED, A DISPLAY MUST BE DEFINED .ENDC .ENDC ;DETEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. FINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 PS=177776 HLT=0 ;VALUE DEFINITIONS .IFNDF ADFRQ$ ADFR ONE POINT TO DISPLAY MOV GTIDTB,R1 ;GET TABLE LIST DIT2: MOV (R1)+,R0 ;GET TABLE BEQ DIT1 MOV R3,DIST(R0) ;T=# JSR PC, ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGIT SET BOTH GLOBAL ;3. INCLUDE THE MULTIPLY AND DIVIDE ROUTINE FROM THE ; GENERAL SUBROUTINE MODULE ; FOR A GT40 DISPLAY , S DO NOT WORD. THE SUM ; BUFFER OF THE A/D IS UPDATED ON THE FLY, THE CURRENT ; BUFFER FOR DMA IS UPDATED ON THE FLY, BUTIF ADSAM IS CALLED WITH F TYPE ; DISPLAY, THE DISPLAY MUST BE ON. ; THE GT40 DISPLAY IS ALWAYS TURNED OFF ON EXIT. ;4. A THE SUM ; BUFFER FOR DMA IS UPDATED AT THE END OF THE SWEEP ; IF A GT40 DISPLAY IS USED THE FOLLOWING VARIABLES ; MUQ$=1 .ENDC .IFNZ ADFRQ$ ADL100 = 5 ADLFRQ = 3 .ENDC .IFZ ADFRQ$ ADL100 = 2 ADLFRQ = 1 .ENDC ;VALUE DEFINITIONS FOR QTELETYPE MODULE IS NEEDED. ; UNLESS DISPLAY TYPE (ADDTYP) =-1 IS USED ; IF THE MODULE IS ASSEMBLED WITH NO ; DISPLAY, A QAAO=4000 QADWA=1000 QAALP=20 QASP=1 QASIL=400 QANQ=10000 ;CLOCK AND A/D STATUS ADDRESSES CKSTAT = 4 CKBUF = 6DISPLAY TYPE -1 OR 0 ; CAN BE USED ; DISPLAY TYPE = -1 CAN SAMPLE AT ; A FASTER RATE ;5. LOAD THE A/D SAMPLER TABLE AS ADBUF = 2 DMASTA = 36 CLKVEC = 4 ADTBUF = 177562 ;TTY INPUT BUFFER ;GLOBAL DEFINITIONS .GLOBL LPSVEC,LPSSAD .GLOBL SHOWN BELOW. ;6. CALL ADSAM ; JSR R5,ADSAM ; TABLE ADD-2-. ; BR ERROR ADDRESS ;CHARACTERISTICS OF A/D TABLE ; A TABLE MULT,DIVR,DIVQH,DIVDNH,DIVDSH,DIVD .IFDF AD$1 .IFDF VR14$ .GLOBL DISPLY,DIRCMD,DILCMD,DIICMD,DIDCMD,DISET .ENDC .IFDF GT40$OF DISPLAY COMMANDS TO CONTROL ; THE DISPLAY WHILE SAMPLING ID DEFINED AS FOLLOWS. THE TABLE IS A ; CHARACTER PER BYTE EN .GLOBL GTDISP,GTRCMD,GTLCMD,GTICMD,GTDCMD,GTSET .GLOBL GTRCAL,ADGTON,ADGTOF,ADSCAL,ADMAXV .ENDC .GLOBL ADDTYB,ADDTAB .ENDCDED BY 0, AND HAS THE VALUES AS FOLLOWS. ; ADCOML: .BYTE 'S,'X,'R,'L,'I,'D,C,0 ; THE FIRST CHARACTER IS TO START THE S .GLOBL QA,QAERR,QADATF,QAANS .GLOBL ADSAM .IFDF AD$2 .GLOBL ADXWAT .ENDC ;ADSAM IS A SUBROUTINE TO DO THE FOLLOWING ;AMPLING, THE SECOND TO EXIT, ; THE ROUTINE BACK TO THE USER, THE NEXT 4 WILL ; SCALE UP,SCALE DOWN, INCREASE AND DECREASE TH1. SAMPLE 1-64 CHANNELS, OR 1 DMA CHANNELS ;2. ADD DATA IF MORE THAN ONE SWEEP TO A S.P. ; OR D.P. BUFFER. ;3. DISPLAY DATAE NUMBER ; OF POINTS DISPLAYED RESPECTIVELY. ; A NUMBER IS INPUT TO DISPLAY DIFFERENT ; CHANNELS. 1 FOR THE FIRST CHANNEL, WHILE SAMPLING ;4. START CLOCK OFF OF SCHMITT 1 AND SAMPLE ; CHANNELS VIA CLOCK TIMING. CLOCK FIRES A/D. ; TO CALL TH2 FOR ; SECOND, ETC. ; TYPYING A C WILL VIEW THE CURRENT SWEEP ; FOR DMA SAMPLING. ; IF A GT40 DISPLAY IS USED THERE IE ROUTINE THE USER MUST DO THE FOLLOWING. ;1. DEFINE THE VECTOR ADDRESS BY PUTTING IT IN A LOCATION ; LPSVEC AND THE ADDRESS THE POSSIBILITY ; OF 2 DISPLAYS OR NO DISPLAY ; A FULL DISPLAY WILL SHOW THE DISPLAY VIA THE ; GT40 DISPLAY MODULE. S OF THE STATUS REGISTERS IN A LOCATION ; LPSSAD. LPSVEC,LPSSAD MUST BE SET GLOBAL. ;2. IF A DISPLAY IS TO BE USED, DEFINETHIS DISPLAY IS UPDATED 10 ; TIMES A SWEEP, THE DMA BUFFERS WILL BE UPDATED AT ; THE END OF THE SWEEP. ; A PARTIAL DI THE ENTRY ; IN THE DISPLAY TABLE, Y BUFFER ADD=DISYBY, TO ADDTYB, ; SET ADDTAB TO THE DISPLAY TABLES FIRST ; VALUE ANDSPLAY IS A GRAPH PLOT DISPLAY AND DOES ; NOT COVER THE WHOLE SCREEN. IN THIS DISPLAY, THE ; INCREASE AND DECREASE COMMAND ;8. ADCOUT IS THE # OF POINTS SAMPLED PER CHANNEL. ;9. ADNOFS IS THE # OF SWEEPS. ;10. ADBADM IS THE ADDRESS OF THE TEMP BA, ELSE 0 ADDONE: .BYTE 0 ;SAMPLING DONE FLAG. .IFDF AD$5 ADLEDC: .BYTE 0,0,0,0,0,0 ;LED COUNTERS .ENDC ;FLAGS ADDOUUFFER FOR ; DMA ONLY. CAN = ADBUFA FOR ONE SWEEP & BOTH S.P. ;11. ADDTYP DISPLAY TYPE FOR VR14 AND GT40 ; SET=0 FOR FULL DIP: .BYTE 0 ;=0 FOR S.P. BUFFER, 1 FOR D.P. ADSAMP: .BYTE 0 ;=0 WHEN NOT AVG. =1 WHEN AVERAGING. ADCOML: .BYTE 7,1,'S,'X,'R,'SPLAY ; =1 FOR GRAPH PLOT DISPLAY, GT40 ONLY ; =-1 FOR NO DISPLAY AND FAST SAMPLE MODE ; IN THE MODE TERMINAL IS L,'I,'D,'C,0 ;EXTERNAL INPUT VALUES. ;THIS TABLE REPRESENTS THE USER'S TABLE THAT MUST ;BE SET BEFORE CALLING THE ROUTINLOCKED OUT AND SAND X ; ARE NOT ECHOED ;FOR GRAPH PLOT MODE THE NEXT 2 INPUTS ARE NEEDED ;FOR MODES N AND F THEY ARE NOT E ADBUFX =0 ;ADDRESS OF FIRST BUFFER OF BUFFERS. ADRATE =2 ;INPUT RATE, PTS/SEC, IN MICRO SECONDS ;DOUBLE PRECISION NEEDED ;12. ADGRAB DISPLAY BUFFER FOR GRAPH PLOT ON GT-40,ADDRESS OF BUFFER ;13. ADGRAS SIZE OF DISPLAY BUFFER FOR GRAPH PLOT ADDELY =6 ;DELAY IN MICRO SECONDS ;DOUBLE PRECISION ADCHTX =12 ;CHANNEL TYPE 0=REG CHANNEL ; 1=DMA ADST BE DEFINED AND SET GLOBAL. ; ADSACAL ADDRESS OF THE SCALE FACTOR IN THE DISPLAY ; ID. TABLE ; ADMAXV ADDRESS OF THE M ;7. SET THE DISPLAY TYPE IN THE ; DISPLAY TABLE TO DOUBLE OR SINGLE ; WORD, DEPENDING ON THE BUFFER TYPE ; REGISTERAXIMUM Y SIZE OF THE SCOPE 1377=GT40, ; 1777=GT44, 7777=VR14 ; ADGTON ADDRESS OF THE GT40 ON ROUTINE ; ADGTOF ADDRESS OFS ; THIS ROUTINE WILL DESTROY ALL REGISTERS ; ERROR MESSAGES ARE IN R0 ; R0=0 DELAY ERROR ; R0=1 CLOCK RATE ERROR ; R0=2 BU THE GT40 OFF ROUTINE ; IF A VR-14 IS USED THE DISPLAY IS THE ONE PRODUCED ; BY THE VR-14 DISPLAY MODULE, AND SHOWN THE FFER TYPE ERROR ; R0=3 DISPLAY BUFFER OVERFLOW ; ;8. THE ROUTINE WILL RETURN TO THE USER WHEN THE TOTAL SAMPLING ;IS DONE. DATA ; COMMING IN ON THE FLY. THE DMA SUM BUFFER ; IS UPDATED AT THE END OF THE SWEEP. ; SAMPLE TABLE: ;1. ADBUFA ;RUN TIME VALUES .IFDF AR11$ ;VALUES USED FOR AR11 SAMPLING ADCDRM: .BYTE 0 ;LOW ORDER BYTE OF DELAY COUNT ADCSRM: .BYTADDRESS OF FIRST SUM BUFFER OR BUFFERS. ; THE SUM BUFFERS ARE CONTIGUOUS ; ;2. ADRATE THE RATE BETWEEN SAMPLES IN MICROSECOE 0 ;LOW ORDER BYTE OF SAMPLING COUNT ADCREM: .BYTE 0 ;LOW ORDER SAVE FOR CLOCK COUNTER ADSMFL: .BYTE 0 ;SAMPLE FLAG, 0 NDS. ; A DOUBLE PRECISION VALUE. ; LOW ORDER PART ; HIGH ORDER PART ;3. ADDELY THE DELAY IN MICROSECONDS. A D.P. VALUE TO SET SAMPLE ;NONZERO OTHERWIZE .ENDC ADSAML: ADSAMA-AD32-2 ;RELATIVE ADDRESSES OF INTERRUPT ROUTINES ADSAMB-AD32-2 ; AS RATE. ;4. ADCHTY (BYTE) IS THE CHANNEL TYPE 0 FOR REGULAR, ; 1 FOR DMA ;5. ADDOUP (BYTE) SET 0 FOR S.P. BUFFER, 1 FO;SINGLE CHAN D.P. ADSAMC-AD32-2 ;MULTI CHAN S.P. & D.P. ADSWPD-AD32-2 ;DMA INTERRUPT ADDRESS ADSN1-AD32-2 ;SINGLE CHAN R D.P. BUFFER ;6. ADCHN THE FIRST CHANNEL TO SAMPLE FROM, 0 ; IS CHANNNEL 0. ;7. ADNOFC IS THE # OF CHANNELS -1 TO SAMPLE.N MODE S.P. ADSN2-AD32-2 ; D.P. ADSN3-AD32-2 ;MULTI CHAN N MODE S.P. ADSN4-AD32-2 ; D.P. ADCHTY: .BYTE 0 ;=1 FOR DMIN R4 ADD R5,R4 MOV R5,(SP) ;SAVE RETURN ADDRESS ON THE STACK ;TEST FOR ERRORS .IFDF LPS11$ CMP #16.,ADNOSX(R4) ;TE)+ ;CLOCK RATE STATUS TO SAMPLE ADCKSS: 0 .ENDC ;CALCULATE THE DELAY CLOCK RATE AND BUF. VALUE. MOV ADDELY(R4),R0 ;LOST FOR 16 SWEEPS OR MORE. .ENDC .IFDF AR11$ CMP #64.,ADNOSX(R4) ;64 OR MORE .ENDC BHIS AD4 ;BRANCH IF LESS. TSTB ADAD DELAY TIME MOV ADDELY+2(R4),@#DIVQH JSR PC,ADCRS BR ADSER1 ;ERROR RETURN .IFDF LPS11$ MOV R0,(PC)+ ;CLOCK BUFFER VDOUX(R4) ;BUFFER MUST BE FLOATING BEQ ADSER2 ;ERROR AD35: MOV #4,(PC)+ ;SET UP D.P. BUFFER VALUES. ADPRE: 0 ;=2 FOR S.P.,ALUE FOR DELAY ADCKBD: 0 BEQ AD39 ;TEST FOR 0. .ENDC .IFDF AR11$ MOV R0,(PC)+ ;SET HIGH 16 BITS OF DELAY ADCDCT: 0 4 FOR D.P. MOV #-4,(PC)+ ;-4 FOR D.P. ADBUFS: 0 ;-2 FOR S.P.,USED TO FIND NEXT BUF BR AD5 ADSER2: MOV #2,R0 ;BUFFER ERBEQ ADDL1 ;CHECK FOR DELAY OF ZERO ADDL2: MOVB ADCDCT,ADCDRM ;SET LOW 8 BITS OF DELAY IN BYTE CLRB ADCDCT ;CLEAR OUT THAT BROR RTS PC ADSER1: MOV #1,R0 ;CLOCK ERROR RTS PC ADSER: CLR R0 ;DELAY ERROR RTS PC AD4: TSTB ADDOUX(R4) ;TEST BUFFEYTE ADD @#DIVQH,ADCDCT ;ADD HIGH BYTE IN AT LOW BYTE SWAB ADCDCT ;HIGH 16 BITS NOW IN PROPER ORDER COMB ADCDCT ;MAKE LOWR TYPE BNE AD35 ;D.P. BUFFER INPUT MOV #2,ADPRE ;SINGLE PRECISION, SET BUFFER MOV #-2,ADBUFS ;VALUES. AD5: MOV ADCOUX(R4 BYTE POS COUNT BR ADDL3 ADDL1: TST @#DIVQH ;CHECK HIGH ORDER FOR ZERO BNE ADDL2 ;NOT ZERO, BACK TO LOOP CLRB ADCDRM ;),R0 ;CALCULATE DISTANCE TO CURRENT ;VALUE IN NEXT BUFFER, ;FOR MULTI CHANNEL COLLECTION TSTB ADDOUX(R4) ;DOUBLE DISCLEAR REMAINDER ADDL3: MOV R1,(PC)+ ;SET DELAY RATE ADCDRT: 0 CMP R1,ADCSRT ;TEST IF DELAY FASTER THAN SAMPLING .ENDC .ITANCE BEQ AD6 ;IF FLOATING ASL R0 AD6: ASL R0 MOV R0,(PC)+ ;SAVE BUFFER SIZE IN BYTES ADBUFZ: 0 ADD R0,ADBUFS ;USED TFDF LPS11$ MOV R1,(PC)+ ;STORE CLOCK RATE FOR DELAY ADCKSD: 0 CMP R1,ADCKSS ;TEST IF DELAY CLOCK RATE .ENDC BLO ADSER DOUX =13 ;=0 FOR S.P., =1 FOR D.P. BUFFERS. ADCHN =14 ;FIRST CHANNEL TO SAMPLE FROM. ADNOFX =16 ;# OF CHANNELS -1 ADCOUO GET ADDR OF MULTI BUF ;CALCULATE CLOCK RATE FOR SAMPLING ;ADRATE HAS THE CLOCK RATE IN MICRO SECONDS. MOV ADRATE(R4),R0 X =20 ;PTS PER SWEEP COUNTER. ADNOSX =22 ;NUMBER OF SWEEPS ADBADX =24 ADDTYX =26 ;DISPLAY TYPE ;ENTRY TO A/D SAMPLE ;LOW CLOCK RATE MOV ADRATE+2(R4),@#DIVQH JSR PC,ADCRS BR ADSER1 ;ERROR RETURN .IFDF AR11$ MOV R0,(PC)+ ;SET HIGH 16 BROUTINE ;JSR R5,ADSAM ;TABLE ADD-.-2 ;ERROR RETURN ;NORMAL RETURN ADSAM: CLR ADDOUP ;INITIALIZE VALUES. CLR ADCHTITS OF SAMPLING COUNT ADCSCT: 0 MOVB ADCSCT,ADCSRM ;LOW 8 BITS NOW SET CLRB ADCSCT ;CLEAR LOWER BYTE ADD @#DIVQH,ADCSCT Y CLR (PC)+ ;TEMP FOR FAST SAMPLING ADNC2: 0 CLR (PC)+ ;TEMP FOR FAST SAMPLING ADNC3: 0 MOV @#LPSSAD,R0 MOV R0,(PC)+;BRING IN HIGH ORDER 8 BITS SWAB ADCSCT ;SET HIGH 16 BITS IN PROPER ORDER COMB ADCSCT ;MAKE LOW BYTE POS COUNT MOV R1,(P ;A/D STATUS REG ADCSR: 0 ADD #ADBUF,R0 MOV R0,ADBUSA ;BUF ADDR ;PICK UP ADDRESS OF INPUT TABLE MOV (R5)+,R4 ;STORE IT C)+ ;SET CLOCK SAMPLING RATE ADCSRT: 0 .ENDC .IFDF LPS11$ MOV R0,(PC)+ ;STORE CLOCK BUFFER VALUE. ADCKBS: 0 MOV R1,(PCDDRESS OF ADD #ADCINT-AD17-2,R0 ;CLOCK INTERRUPT. MOV @#LPSVEC,R1 ;GET VECTOR ADD. MOV R0,CLKVEC(R1) MOV #240,CLKVEC+2(R R5 ;PERIOD FOR F TYPE MOV #10.,R0 ;DISPLAYS JSR PC,@#DIVR MOV R0,(PC)+ ;FULL DISPLAY UPDATE INCREMENT ADFDST: 0 MOV 1) ;DETERMINE A/D ROUTINE TO USE, AND A/D STATUS MOVB ADDTYX(R4),(PC)+ ;GET DISPLAY TYPE ADDTYP: 0 ;LOW BYTE HAS DISPLAR0,(PC)+ ;INITIALIZE FOR DISPLAY COUNTER ADFDSC: 0 TSTB ADDTYP ;TEST FOR GRAPH PLOT BEQ AD33 BMI AD32A ;N DISPLAY MODE Y TYPE, HIGH BYTE ;HAS GAIN ;DISPLAY TYPE ;=0 FULL DISPLAY, -1 NO DISPLAY ;=1 GRAPH PLOT DISPLAY ;DETER MOV (R4)+,R5 ;DISPLAY ADD MOV (R4)+,R0 ;DISPLAY BUF SIZE AD32A: JSR PC,@#ADGTOF ;STOP THE GT-40 FOR N OR P TSTB ADDTYP MINE A/D STATUS MOV ADCHN(R4),R0 ;SET 1ST CHANNEL TO START FROM. SWAB R0 ADD #140,R0 ;CLOCK STARTS A/D. MOV R0,(PC)+ ;ABMI AD33A CMP R0,#10. ;DISPLAY BUF. MUST BE AT LEAST 10. BLOS ADSER3 MOV #1,R1 ;SET DISPLAY DELTA MOV #1,R2 ;SET DATA/D STATUS VALUE TO RUN ADSTAV: 0 CLR R0 ;USED TO DETERMINE ADR OF INTERRUPT TSTB ADDOUX(R4) ;TEST BUFFER TYPE BEQ AD18 BUF. DELTA MOV ADCOUT,R4 ;CAL DISPLAY BUF NEG R4 ;THE SMALLER OF SUB #7,R0 ;1024, BUFFER, OR CMP R4,R0 ;DISPLAY BUFF INCB ADDOUP TST (R0)+ AD18: TST ADNOFX(R4) ;TEST FOR MULTI CHANNEL BEQ AD19 MOV #4,R0 AD19: TSTB ADCHTX(R4) ;TEST FOR DER BHI AD60 MOV R4,R0 AD60: CMP #1024.,R0 BHI AD62 MOV #1024.,R0 AD62: CMP R0,#1024. ;TEST IF DATA TO DISPLAY GREATER MA BEQ AD20A INCB ADCHTY MOV ADBADX(R4),(PC)+ ;DMA TEMP BUF ADBADM: 0 MOV #6,R0 BR AD20 AD20A: .IFDF AD$4 TSTB ADD BHI AD50 ;THAN GT-40 ABILILY MOV R0,R3 ;NO, CALCULATE THE DISPLAY LESS THAN AD52: ASL R3 CMP R3,#1024. ;TEST TO DOUBLE TYP ;TEST FOR NO DISPLAY BPL AD20 ADD #10,R0 ;CALCULATE NO DISPLAY TST ADNOFX(R4) ;TEST FOR MULTI CHARACTERS BEQ AD20 DELTA BHI AD50 ASL R1 BIT #100,R1 ;TEST FOR MAX DISPLAY DELTA BEQ AD52 DEC R1 ;SET TO MAX DISPLAY DELTA AD50: CMP R TSTB ADDOUP ;INTERRUPT ROUTINE ADD. BEQ AD20 TST (R0)+ ;ADD 2 .ENDC AD20: MOV PC,R1 ;GET ADDRESS OF OF A/D ADD #AD4,R0 BLOS AD51 MOV R4,R3 AD61: ASL R2 ASR R3 CMP R3,R0 BHI AD61 MOV R3,R0 ;CALCULATE THE DATA BUFFER DELTA SAML-AD20-2,R1 ;ADDRESS TABLE ADD R0,R1 AD32: MOV PC,R0 ;GET ADDRESS OF A/D ADD (R1),R0 ;INTERRUPT ROUTINE MOV @#LPSVEC ;SAVE THE DISPLAY BUFFER SIZE AD51: MOV R2,(PC)+ ;SAVE DATA BUFFER DELTA ADGPDE: 0 MOV R5,R2 ;BUILD THE DISPLAY BUFFER ,R5 ;GET VECTOR ADDRESS MOV R0,(R5) MOV #300,2(R5) ;GET REST OF VARIABLES FROM THE INPUT TABLE. MOV ADBUFX(R4),ADBUFA ADD #174100,R1 MOV #114000,(R2)+ ;SET POINT MODE CLR (R2)+ CLR (R2)+ MOV R1,(R2)+ ;STORE THE GRAPH DELTA MODE WORD M;IS FASTER THAN SAMPLE RATE. ;CALCULATE TOTAL SIZE OF ALL BUFFERS. AD39: MOV ADNOFX(R4),R0 ;MULTIPLY # OF BUFFER TIMES INC ADD #ADNOFX,R4 MOV (R4)+,(PC)+ ;# OF CHAN -1 ADNOFC: 0 MOV (R4)+,(PC)+ ADCOUT: 0 NEG ADCOUT ;- PTS PER SWEEP MOV (R4)R0 ;THEIR SIZE MOV ADBUFZ,R5 ASR R5 ;SET TO WORDS JSR PC,@#MULT MOV R5,ADTBS ;SIZE IN ADTBS AD17: MOV PC,R0 ;STORE A+,(PC)+ ;# OF SWEEPS ADNOFS: 0 .IFDF GT40$ CMP (R4)+,(R4)+ ;SKIP ADD. UP TWO VALUES MOV ADCOUT,R5 ;CALCULATE UPDATE NEGBUF. CLR PS ;RESET THE STATUS .ENDC RTS PC .IFDF VR14$ AD34: JSR PC,@#DISPLY ;SET DISPLAY .ENDC .IFDF GT40$ AT SAMPLING JMP AD33 AD25: CMP R0,#2 .IFDF AD$1 BGE AD37 .ENDC .IFNDF AD$1 BGE AD24 .ENDC AD25A: MOV @#LPSSAD,ROV #127400,(R2)+ ;STORE THE GRAPH MODE WORD. MOV R0,(PC)+ ;SAVE THE BUFFER SIZE ADGPCT: 0 MOV R2,(PC)+ ;SAVE THE BUFFER STAD34: TSTB ADDTYP ;TEST FOR DISPLAY TYPE BMI AD42 ;NO DISPLAY BGT AD43 ;GRAPH DISPLAY MOV ADCOUT,R0 ;TEST FOR REFRESH DIRT ADD. ADGPBS: 0 MOV R2,R3 ;SAVE ADD. ASL R0 ADD R0,R2 ;END ADD +2 OF DISPLAY BUFFER. BR AD63 ADSER3: MOV #3,R0 ;SSPLAY NEG R0 ADD ADCNTR,R0 ;TEST IF COUNTER OVERFLOWED CMP R0,ADFDSC BLE AD55 MOVB #1,@#GTRCAL ADD ADFDST,ADFDSC ADET ERROR RTS PC AD63: MOV #173400,(R2)+ ;STORE A DJUMP. CLR (R2) MOV ADBUFA,@#ADDTYB ;STORE BUFFER TO DISPLAY ASR R0 A55: TSTB @#GTRCAL ;TEST TO RECALCULATE DISPLAY BEQ AD42 JSR PC,@#ADGTOF ;YES, TURN IT OFF. AD44: JSR PC,@#GTDISP ;RESET DISD53: CLR (R3)+ ;CLEAR DISPLAY BUFFER DEC R0 BNE AD53 .IFDF RT11$ MOV R5,R0 .INSRT .ENDC JSR PC,@#ADGTON ;START DIPLAY TST R0 ;TEST FOR ERROR BNE ADSER3 JSR PC,@#ADGTON ;TURN IT ON. BR AD42 AD43: MOV ADGPCT,R0 ;GRAPH PLOT DISPLAY SPLAY .ENDC ;START SAMPLING AD33A: .IFDF AD$4 TSTB ADDTYP ;TEST FOR N MODE BPL AD33 MOV #AD$INT,PS ;SET PRIORITY TO MOV ADGPBS,R1 ;SCALE AND STORE DATA MOV @#ADDTYB,R2 ;GET BUFFER ADDRESS AD49: CLR R4 ;CLEAR HIGH ORDER OF VALUE MOV (R2) ;SHUT OUT INTERRUPTS .ENDC AD33: JSR PC,ADZBUF ;ZERO BUFFERS. JSR PC,ADSAMS ;SET UP TO START SAMPLING .IFDF AD$4 +,R5 ;GET VALUE TSTB ADDOUP ;TEST FOR DOUBLE PRECISION BEQ AD45 MOV (R2)+,R4 ;HIGH ORDER PART AD45: MOVB @#ADSCAL,R3 ;GE TSTB ADDTYP ;TEST FOR NO DISPLAY BPL AD24 ADN2: TSTB ADDONE ;TEST IF DONE. BEQ ADN1 BR AD38 ;YES ADN1: MOV @#ADTBUF,T SCALE FACTOR BMI AD46 BEQ AD47A AD48: ASL R5 ;SCALE LEFT ROL R4 DEC R3 BNE AD48 BR AD47A AD46: CLC ;SCALE RIGADNC2 ;READ TTY INPUT BIC #200,ADNC2 ;CLEAR PARITY BIT CMP ADNC2,ADNC3 ;TST IF VALUE CHANGED BEQ ADN2 ;NO MOV ADNC2,ADNHT ROR R4 ROR R5 INC R3 BNE AD46 AD47A: CMP R5,ADMAXV ;TEST FOR A VALUE TOO LARGE FOR SCREEN BLO AD47 MOV ADMAXV,R5C3 ;YES,SAVE NEW VALUE CMP #'S,ADNC3 ;TEST FOR S BEQ AD42A CMP #'X,ADNC3 ;TEST FOR X BNE ADN2 JMP AD25A .ENDC AD2 AD47: MOV R5,(R1)+ ;STORE VALUE IN DISPLAY DEC R0 ;BUFFER TEST IF DONE BEQ AD42 MOV ADGPDE,R4 ;GET DATA BUF. DELTA AD54: JSR R5,QA QADWA+QANQ AD36: TSTB ADDONE ;TEST IF SWEEP DONE .IFDF AD$1 BEQ AD34 .ENDC .IFNDF AD$1 BEQ AD42 .EN4: DEC R4 ;SKIP POINTS IF NECC. BEQ AD49 TST (R2)+ ;SKIP POINTS TSTB ADDOUP ;TEST FOR D.P. SKIP. BEQ AD54 TST (R2)+DC AD38: ADD #2,(SP) ;SWEEP DONE RETURN TO USER. .IFDF GT40$ JSR PC,@#ADGTOF TSTB ADDTYP ;TEST TO STOP DISPLAY BNE AD ;ADD 2 BR AD54 .ENDC AD42: JSR R5,QA QAAO+QADWA+QAALP ADCOML TSTB @#QADATF ;TEST FOR A LINE INPUT BEQ AD36 TST38D RTS PC .ENDC AD38D: .IFDF AD$4 TSTB ADDTYP ;TEST FOR NO DISP. BMI AD38C RTS PC AD38C: MOV ADTBUF,R0 ;CLEAR TTY R0 ;TEST FOR NON VALID COMMAND. BMI AD29 BNE AD25 AD42A: MOV @#LPSSAD,R0 CLR (R0) CLR CKSTAT(R0) INCB ADSAMP ;STARFER. BHI AD24J MOV ADBUFA,R1 ;CALCULATE NEW BUFFER AD31: DEC R0 ;ADDRESS. BMI AD30 ADD ADBUFZ,R1 BR AD31 AD30: MOV P BUFFER POINTER FOR NEXT VALUE. MOV ADSTAV,@ADCSR ;RESET A/D CSR MOV (SP)+,R1 MOV (SP)+,R0 BR ADSAM2 ;EXIT. .ENDC R1,@#ADDTYB ;STORE IN DISPLAY TABLE AD41: MOV #ADDTAB,R0 ;RESET DISPLAY .IFDF VR14$ JSR PC,@#DISET .ENDC .IFDF GT40$ .IFNDF AD$3 ADSAMC: HLT .ENDC ;SINGLE CHANNEL N MODE ;SINGLE PRECISION .IFDF AD$4 ADSN1: ADD (R4),(R1)+ ;ADD DATA TO BJSR PC,@#GTSET .ENDC AD24J: JMP AD24 .ENDC .IFNDF AD$1 AD29: BR AD24 .ENDC ;SINGLE CHANNEL SAMPLING ;SINGLE PRECISIUFFER ADSN12: INC R2 ;TEST IF SWEEP DONE BEQ ADSN11 RTI ADSN11: JMP ADSWPD ;DOUBLE PRECISION ADSN2: ADD (R4),(R1)+ ;ON BUFFER ADSAMA: ADD @ADBUSA,@ADBUFP ;ADD DATA TO BUFFER ADD #2,(PC)+ ADBUFP: 0 ;RELATIVE POSITION IN BUF ADSAM2: INC ADD DATA LOW TO BUFFER ADC (R1)+ ;ADD HIGH ORDER BR ADSN12 ;MULTI CHANNEL N MODE ;SINGLE PRECISION .IFDF AD$3 .IFND0 ;EXIT ROUTINE CLR CKSTAT(R0) ;CLEAR CLOCK, A/D CLR (R0) .IFDF LPS11$ TSTB ADCHTY ;TEST FOR DMA BEQ AD25B MOV #2,((PC)+ ;TEST IF DONE ADCNTR: 0 BEQ ADSAM1 RTI ADSAM1: JMP ADSWPD ;YES SET FOR NEXT SWEEP. ;DOUBLE PRECISION BUFFER ADSR0) ;TURN DMA OFF CLR DMASTA(R0) CLR (R0) .ENDC AD25B: JMP AD38 ;EXIT .IFDF AD$1 .IFDF VR14$ AD37: BNE AD26 JSR AMB: MOV R0,-(SP) MOV ADBUFP,R0 ;DO A D.P. ADD TO BUFFER. ADD @(PC)+,(R0)+ ADBUSA: 0 ;ADDR OF A/D BUF REG ADC (R0)+ MPC,@#DIRCMD ;UP SCOPE .ENDC .IFDF GT40$ AD37: TSTB ADDTYP ;TEST FOR NO DISPLAY BMI AD24J CMP R0,#2 ;TEST FOR UP SCOPEOV R0,ADBUFP MOV (SP)+,R0 BR ADSAM2 ;MULTI CHANNEL SAMPLING .IFDF AD$3 ADSAMC: MOV R0,-(SP) MOV R1,-(SP) MOV A BNE AD26 JSR PC,@#GTRCMD .ENDC BR AD24J AD26: CMP R0,#4 BGE AD27 .IFDF VR14$ JSR PC,@#DILCMD ;LOWER SCOPE .EDBUFP,R0 ;SET BUFFER ADDRESS MOV ADNOFC,R1 ;# OF CHANNELS .IFNDF AD$2 ADSAM3: ADD #401,@ADCSR ;START NEXT CHANNEL. .ENDC NDC .IFDF GT40$ JSR PC,@#GTLCMD .ENDC BR AD24J AD27: BNE AD28 .IFDF VR14$ JSR PC,@#DIICMD ;INCREASE # OF POINTS .IFDF AD$2 ADSAM3: ADD #400,@ADCSR JSR PC,ADXWAT ;USER WAIT ROUTINE INC @ADCSR ;START AD .ENDC .IFDF AR11$ BIC #14 .ENDC .IFDF GT40$ JSR PC,@#GTICMD .ENDC BR AD24J AD28: CMP R0,#6 BGE AD40 .IFDF VR14$ JSR PC,@#DIDCMD ;DECREAS0,@ADCSR ;TURN OFF CLOCK START .ENDC ADD @ADBUSA,(R0)+ ;ADD VALUE TO BUFFER. BITB #1,ADDOUP ;TEST FOR D.P. BUFFER BEQ ADE # OF POINTS. .ENDC .IFDF GT40$ JSR PC,@#GTDCMD .ENDC BR AD24J AD40: BNE AD29 ;TEST FOR DMA TEMP BUFF. .IFDF LPSAM4 ADC (R0)+ ;ADD CARRY IF SO. ADSAM4: ADD ADBUFS,R0 ;SET TO NEXT BUFFER. DEC R1 ;TEST IF DONE BEQ ADSAM7 ADSAM6: TSS11$ TSTB ADCHTY ;TEST FOR DMA BUFFER BEQ AD24J MOV ADBADM,@#ADDTYB BR AD41 .ENDC .IFDF AR11$ BR AD24J .ENDC TB @ADCSR ;WAIT FOR THE A/D CONVERSION BMI ADSAM3 ;TO COMPLETE. BR ADSAM6 ADSAM7: TSTB @ADCSR ;WAIT FOR A/D. BPL ADS AD29: JSR R5,QA QASIL+QASP TSTB @#QAERR BNE AD24J MOV @#QAANS,R0 ;GET CHAN. # BEQ AD24J DEC R0 CMP R0,ADNOFC ;BUFAM7 ADD @ADBUSA,(R0)+ ;ADD VALUE MOVB ADDOUP,R1 ;TEST FOR D.P. BUFFER BEQ ADSAM5 ADC (R0) ADSAM5: ADD ADPRE,ADBUFP ;STER1) ;ADD VALUE TO BUFFER ADSN36: MOV R0,R1 ;RESET BUF POINTER FOR CHAN. 1 MOV R5,(R3) ;RESET A/D STATUS INC R2 ;TEST IF R0,#ADLEDC+5 ;AND CARRY THE 1 TO NEXT DIGIT BNE ADSLD1 BR ADSLD3 ;EXIT IF COUNTER FULL ADSLD2: MOVB (R0),-(SP) ;SET DIGIT SWEEP DONE BEQ ADSN32 RTI ;NO ADSN32: JMP ADSWPD ;YES ;MULTI CHANNEL N MODE ;DOUBLE PRECISION .IFNDF AD$2 ADSN4:IN LEDS BIC #177400,(SP) ADD (SP)+,R1 MOV R1,@ADBUSA ADSLD3: MOV (SP)+,R1 .ENDC MOV @#LPSSAD,R0 ;GET LPS ADDRESS CL ADD #401,(R3) ;CHANGE CHANNELS, START NEXT CHAN ADD (R4),(R1)+ ;ADD DATA TO BUFFER ADC (R1)+ .ENDC .IFDF AD$2 ADSN4: AR CKSTAT(R0) CLR (R0) MOV (SP)+,R0 .IFDF GT40$ MOVB #1,@#GTRCAL MOV ADFDST,ADFDSC ;RESET REFRESH COUNT FOR ;TYPE DD #400,(R3) ADD (R4),(R1)+ ADC (R1)+ JSR PC,ADXWAT ;GO TO USER WAIT ROUTINE INC (R3) .ENDC MOV ADNOFC,ADNC1 ;SET # DISPLAY .ENDC TSTB ADSAMP .IFDF AR11$ BNE ADSWP2 .ENDC .IFDF LPS11$ BNE ADSWP3 .ENDC JSR PC,ADZBUF BR ADSWP1OF CHAN -1 MOV R1,R0 ;SAVE BUFFER POINTER BR ADSN45 .IFNDF AD$2 ADSN41: ADD #401,(R3) ;CHANGE CHANNELS, START NEXT CHAN .IFDF LPS11$ ADSWP3: TSTB ADCHTY ;TEST FOR DMA BEQ ADSWP2 ;BRANCH IF NOT CMP ADBADM,ADBUFA ;TEST FOR SINGLE BEQ AD ADD (R4),(R1)+ ADC (R1)+ .ENDC .IFDF AD$2 ADSN41: ADD #400,(R3) ADD (R4),(R1)+ ADC (R1)+ JSR PC,ADXWAT ;GO TO USSWP2 ;BUFFER DMA MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV ADBADM,R0 ;ADD THE CURRENT BUFFER MOV ADCOUT,R1 ;TO THE SER WAIT ROUTINE INC (R3) .ENDC ADSN45: ADD ADBUFS,R1 ;SET TO NEXT CHANNEL'S BUF. DEC (PC)+ ;TEST IF LAST CHANNEL ADNC1:UM BUFFER. MOV ADBUFA,R2 ADSWP4: ADD (R0)+,(R2)+ BITB #1,ADDOUP ;TEST FOR D.P. SUM BUFFER BEQ ADSWP5 ADC (R2)+ ADSWP5:F AD$2 ADSN3: ADD #401,(R3) ;CHANGE CHANNELS, START NEXT CHAN. ADD (R4),(R1)+ ;ADD DATA TO BUFFER .ENDC .IFDF AD$2 ADSN3 0 ;TEMP # OF CHAN COUNTER BEQ ADSN43 ADSN44: TSTB (R3) ;NO, WAIT TILL A/D DONE BMI ADSN41 BR ADSN44 ADSN43: TSTB (: ADD #400,(R3) ADD (R4),(R1)+ JSR PC,ADXWAT ;GO TO USER WAIT ROUTINE INC (R3) .ENDC MOV ADNOFC,ADNC1 ;SET # OF CHANNER3) ;LAST CHANNEL, WAIT TILL BPL ADSN43 ;A/D DONE ADD (R4),(R1)+ ;ADD VALUE TO BUFFER ADC (R1) BR ADSN36 .ENDC .IFLS-1 TO DO. MOV R1,R0 ;SAVE BUF ADD BR ADSN35 .IFNDF AD$2 ADSN31: ADD #401,(R3) ;CHANGE CHANNELS, START NEXT CHAN. ANDF AD$3 ADSN3: ADSN4: HLT .ENDC .ENDC .IFNDF AD$4 ADSN1: ADSN2: ADSN3: ADSN4: HLT .ENDC ;END OF SWEEP ROUTINE FDD (R4),(R1)+ .ENDC .IFDF AD$2 ADSN31: ADD #400,(R3) ADD (R4),(R1)+ JSR PC,ADXWAT ;GO TO USER WAIT ROUTINE INC (R3) OR REGULAR CHANNELS ;CLEAR CLOCK AND A/D ;TEST IF AVERAGING. NO, ZERO BUFFERS. ADSWPD: MOV R0,-(SP) .IFDF AD$5 ;LED PRINT .ENDC ADSN35: ADD ADBUFS,R1 ;SET TO NEXT CHANNEL'S BUF. DEC ADNC1 ;TEST IF LAST CHANNEL BEQ ADSN33 ADSN34: TSTB (R3) ;N OUT MOV R1,-(SP) ;UPDATE LEDS MOV #ADLEDC,R0 CLR R1 ADSLD1: INCB (R0) ;ADD 1 TO DIGIT CMPB (R0),#10. ;TEST IF DIGIT =O, WAIT TILL A/D DONE BMI ADSN31 BR ADSN34 ADSN33: TSTB (R3) ;LAST CHANNEL, WAIT TILL BPL ADSN33 ;A/D DONE ADD (R4),(10. BNE ADSLD2 CLRB (R0)+ ;NUMBER CARRY,SET DIGIT 0 MOV R1,@ADBUSA ;SET LED DIGIT 0 ADD #400,R1 ;GO TO NEXT LED CMP BUFFER .ENDC MOV ADCOUT,ADCNTR .IFDF AD$4 TSTB ADDTYP ;TEST FOR NO DISPLAY MODE. BPL ADSAS5 MOV ADBUSA,R4 ;YES, SEOCK WITH INTERRUPTS ENABLED MOV R1,-(SP) ;SAVE R1 MOV @#LPSVEC,R1 ;VECTOR ADDRESS MOV #ADCINT,CLKVEC(R1) ;SET INTERRUPT ADT REGISTERS MOV ADBUFP,R1 MOV ADCNTR,R2 MOV ADCSR,R3 MOV ADSTAV,R5 .ENDC ADSAS5: MOV #177777,CKBUF(R0) ;SYNC CLOCK DRESS FOR CLOCK MOV (SP)+,R1 ;RESTORE R1 ADSAS6: MOV (SP)+,R0 ;EXIT RTI ;ROUTINE TO COUNT DOUBLE PRECISION CLOCK COUNTER .IFDF AR11$ MOV ADCDRT,CKSTAT(R0) ;LOAD DELAY RATE BNE ADSAS1 MOV ADCSRT,CKSTAT(R0) ;LOAD SAMPLE RATE IF NO DELAY .ENDC AND ;SET COUNTER TO REMAINDER DECCON: BISB #1,ADSMFL ;SET SAMPLING FLAG DEC ADCCLK ;KICK 16 BIT HIGH ORDER COUNTER CMP #1 .IFDF LPS11$ MOV ADCKSD,CKSTAT(R0) ;LOAD DELAY RATE BNE ADSAS1 MOV ADCKSS,CKSTAT(R0) ;LOAD SAMPLE RATE IF NO DELAY .EN,ADCCLK BEQ ADCI2 BPL ADCI1 ;SET REMAINDER IN IF ZERO RTS PC ;EXIT WITH FLAG SET IF STILL COUNTING ADCI1: MOV ADCREM,@CDC ADSAS1: INC CKSTAT(R0) ;START CLOCK ADSAS2: TSTB CKSTAT(R0) ;WAIT TO BE DONE. BPL ADSAS2 .IFDF AR11$ MOV R1,-(SP) ;SAKBUFF ;SET REMAINDER IN CLOCK BUFFER RTS PC ADCI2: CLRB ADSMFL ;CLEAR SAMPLING FLAG SO THAT A/D CAN ;BE TURNED ON AFTERVE R1 MOV @#LPSVEC,R1 ;VECTOR ADDRESS MOV #ADCIN4,CLKVEC(R1) ;SET ADDRESS FOR EXTERNAL EVENT INT MOV (SP)+,R1 ;RESTORE R1 NEXT INTERRUPT RTS PC ;INTERRUPT ROUTINE FOR SINGLE COUNT REMAINDER ADCINT: MOV R0,-(SP) MOV @#LPSSAD,R0 JSR PC,ADCSMS BIS #40000,CKSTAT(R0) ;SET IEXT EV INT JMP ADSAS4 ;EXIT AND WAIT FOR INTERRUPT ADCIN4: MOV R0,-(SP) MOV @#LPSSAD,R0 ;STA;SET UP SAMPLING COUNT BR ADCIN2 ;EXIT ;ROUTINE TO SET UP SAMPLING COUNT ADCSMS: MOV ADCSCT,ADCCLK ;SET HIGH ORDER SAMPLINGTUS ADDRESS TST CKSTAT(R0) ;CHECK FOR EXTERNAL INT BPL ADSAS6 ;NO INTERRUPT, RETURN MOV ADCDCT,(PC)+ ;SET DELAY COUNT HIG COUNT BNE ADCIN6 ;SET UP DOUBLE PRECISION COUNTER ADSIN7: MOVB ADCSRM,CKBUF(R0) ;SET COUNT IN CLK BUFFER JSR PC,ADADST ;SH ORDER ADCCLK: 0 BEQ ADSAS7 ;IF ZERO FORGET DOUBLE PRECISION MOV ADCDRM,ADCREM ;SET LOW ORDER BYTE OF DELAY COUNT MOV RET AD TO START OFF CLOCK MOV ADCSRT,CKSTAT(R0) ;SET CLOCK RATE ADD #401,CKSTAT(R0) ;START CLOCK, REPEAT INT MODE RTS PC A1,-(SP) ;SAVE R1 MOV @#LPSVEC,R1 ;VECTOR ADDRESS MOV #ADCIN1,CLKVEC(R1) ;SET INTERRUPT ADDRESS FOR CLOCK MOV (SP)+,R1 ;RESDCIN6: MOV ADCSRT,CKSTAT(R0) ;SET SAMPLING RATE MOVB ADCSRM,ADCREM ;SET UP REMINDER COUNT MOVB ADCREM,CKBUF(R0) ;PUT REMAIND INC R1 BNE ADSWP4 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 .ENDC ADSWP2: DEC ADNOFS ;TEST IF ALL SWEEPS DONE BNE ADTORE R1 CLR CKBUF(R0) ;SET CLOCK COUNTER TO ZERO MOV ADCDRT,CKSTAT(R0) ;SET CLOCK DELAY RATE ADD #501,CKSTAT(R0) ;START CLSWP1 INCB ADDONE ;SET DONE FLAG RTI ADSWP1: JSR PC,ADSAMS RTI ;ROUTINE TO INITIALIZE A SWEEP OF SAMPLING. ADSAMS: OCK JSR PC,DECCON ;CHECK DOUBLE PRECISION DELAY COUNT BR ADSAS6 ;EXIT ADSAS7: MOVB ADCDRM,CKBUF(R0);SET COUNT IN CLOCK COUMOV ADBUFA,ADBUFP MOV R0,-(SP) MOV @#LPSSAD,R0 .IFDF AR11$ MOV #CKBUF,(PC)+ CKBUFF: 0 ADD R0,CKBUFF ;ADDRESS OF CLOCKNTER BEQ ADSAS3 ;NO DELAY, SET SAMPLE COUNT MOV ADCDRT,CKSTAT(R0) ;SET CLOCK RATE FOR DELAY ADD #101,CKSTAT(R0) ;START CLER IN CLK BUFFER FIRST MOV R1,-(SP) ;SAVE R1 MOV @#LPSVEC,R1 ;VECTOR ADDRESS MOV #ADCIN3,CLKVEC(R1) ;SET INT ADD FOR CLOCK0) ;LOAD CLOCK BUFFER MOV ADCKSS,CKSTAT(R0) ;SET CLOCK RATE ADD #401,CKSTAT(R0) ;START CLOCK, REPEATED MODE. MOV (SP)+,R0 ADD #501,CKSTAT(R0) ;START CLOCK CLR CKBUF(R0) ;RESET BUFFER FOR NEXT TIME MOV (SP)+,R1 ;RESTORE R1 RTS PC ;INTERRUPT RTI .ENDC ;ZERO BUFFERS. ADZBUF: MOV R0,-(SP) MOV R5,-(SP) MOV (PC)+,R5 ;TOTAL BUFFER SIZE IN WORDS ADTBS: 0 MOV ROUTINE FOR DOUBLE PRECISION DELAY ADCIN1: CLR @CKBUFF ;CLEAR CLOCK BUFFER MOV R0,-(SP) MOV @#LPSSAD,R0 JSR PC,DECCON ;(PC)+,R0 ;ZERO IT ALL. ADBUFA: 0 ADZB1: CLR (R0)+ DEC R5 BNE ADZB1 .IFDF AD$5 MOV ADBUSA,R0 ;CLEAR LED TO 0 CLR (R0)CHECK ON COUNTER FINISHED TST ADCCLK ;CHECK IF ALL DONE BNE ADCIN2 ;IF FLAG IS SET JUST EXIT CLR @ADBUSA ;CLEAR BUFFER ;SET LED COUNTERS 0 MOV #5,R5 MOV R1,-(SP) CLR R1 ADZB2: ADD #400,R1 MOV R1,(R0) CLRB ADLEDC(R5) DEC R5 BNE ADZ JSR PC,ADCSMS ;SET UP SAMPLING COUNT ADCIN2: MOV (SP)+,R0 RTI ;INTERRUPT ROUTINE FOR DOUBLE PRECISION SAMPLING ADCIN3: B2 CLRB ADLEDC MOV (SP)+,R1 .ENDC MOV (SP)+,R5 MOV (SP)+,R0 RTS PC ;SUBROUTINE TO CALCULATE A CLOCK RATE AND ;CLOCLR @CKBUFF ;SET UP BUFFER COUNT,MAYBE CHANGED JSR PC,DECCON ;COUNT DOWN CLOCK COUNTER TSTB ADSMFL ;TEST SAMPLING FLAG BCK BUFFER ;PUT LOW TIME BETWEEN CLOCK FIRING IN R0 ;HIGH TIME IN DIVQH ;THE CLOCK RATE IS RETURNED IN R1 ;THE CLOCK BUFFER INE ADCIN5 ;DO NOT SAMPLE IF SET JSR PC,ADADST ;SET AD STATUS WORD FOR SAMPLING MOV ADCSCT,ADCCLK ;RESET HIGH ORDER COUNT N R0 ; JSR PC,ADCRS ; ERROR RETURN ADCRS: MOV #2,R1 ;SET CLOCK RATE TO MICRO SECONDS. ADCRS3: MOV @#DIVQH,@#DIVDNH ;DIVIDINC ADCCLK ;COUNT REMAINDER AS A COUNT COMB ADSMFL ;SET CLEAR FLAG TO -1 RTI ADCIN5: BIC #40,@ADCSR RTI ADSAS3: JSR PCE # OF TICKS, UNTIL # OF TICKS .IFDF AR11$ TSTB @#DIVQH+1 ;CHECK FOR HIGH ORDER BYTE .ENDC BEQ ADCRS1 ;FITS IN A WORD .,ADCSMS ;SET UP SAMPLING COUNT BR ADSAS6 ;EXIT .ENDC .IFDF LPS11$ ADSAS6: MOV ADCKBD,CKBUF(R0) ;LOAD CLOCK FOR DELAY B DONE WHEN HIGH CLR @#DIVDSH ;0 H.O. OF DIVISOR MOV R0,R5 ;ORDER =0 MOV #10.,R0 TST (R1)+ ;SET CLOCK RATE TO NEXT SLOWEQ ADSAS3 ;TEST FOR NO DELAY MOV ADCKSD,CKSTAT(R0) ;SET CLOCK RATE FOR DELAY. ADD #20100,CKSTAT(R0) ;START CLOCK WITH SCHMIER RATE CMP R1,#12 ;TEST FOR SLOWEST RATE BHI ADCRS2 ;SET TO LINE FREQUENCY IF NECESSARY. JSR PC,@#DIVD ;DIVIDE # OF TICTT 1 BR ADSAS6 ;NO DELAY ADSAS3: JSR PC,ADADST ;SET A/D STATUS MOV ADCKBS,CKBUF(R0) ;LOAD CLOCK BUFFER MOV ADCKSS,CKKS BY 10. BR ADCRS3 ADCRS2: MOV #16,R1 ;SET TO LINE FREQUENCY. MOV #ADL100,R0 ;CONVERT 100 HZ TO LINE FREQUENCY. JSR PSTAT(R0) ;SET CLOCK STATUS ADD #20400,CKSTAT(R0) ;START CLOCK VIA SCHMITT 1, MODE 1 .ENDC ;REPEATED INTERVAL ADSAS4: MOV C,@#DIVD ;BY DIVIDING BY 100 AND MULT. TST @#DIVQH ;BY 60 OR (50). BNE ADCRS4 ;ERROR IF NOT S.P. ANSWER MOV #ADLFRQ,R5 (SP)+,R0 RTS PC .IFDF LPS11$ ADCINT: JSR PC,ADADST ;LOAD A/D STATUS MOV R0,-(SP) MOV @#LPSSAD,R0 MOV ADCKBS,CKBUF(R JSR PC,@#MULT ;MULT BY FREQ. TST R0 BNE ADCRS4 ;ERROR IF O.P. MOV R5,R0 ;PUT-CLOCK BUFFER VALUE IN R0. ADCRS1: NEG R0 LY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR AN DEBU00 MOV #1,R0 JMP DEBUEE ;BUFS ARE SAME TYPE, ERR DEBU00: CMP DECMD1,#177777 BNE DEBU0 DEBU0A: MOV #3,R0 JMP DEBUY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ANEE ;SIZE MUST BE SPECIF (ERR) DEBU0: JSR R5,@#IFIX ;FIX THE SIZE BR DEBU1 DECMD1 ;PTR TO SIZE H.OAD, LORD DEBU1: MOV R0D TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE,@#DECMD1+4 ;SAV THE "FIXED" SIZE BLE DEBU0A ;SIZE <= 0--(ERR) MOVB @#DECMD,R5 ;GET # OF BUF TSTB @#DECMD+1 ;WHAT KIND OF ADD #2,(SP) ;RETURN. ADCRS4: RTS PC ;SUBROUTINE TO SET UP A/D FOR SAMPLING ADADST: MOV @ADBUSA,-(SP) ;CLEAR ADFLAG, WIT INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUH A DUMMY MOVE TST (SP)+ .IFDF LPS11$ TSTB ADCHTY ;TEST FOR DMA BNE ADADS1 .ENDC MOV ADSTAV,@ADCSR ;SET REGULAR CHAIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPNNEL STATUS RTS PC .IFDF LPS11$ ;DMA SAMPLING ADADS1: MOV R0,-(SP) MOV @#LPSSAD,R0 MOV #6,(R0) ;SET CURRENT ADDRESS PLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;GT40$ IF DEFINED = GT40 CODE ;VR1 MOV ADBADM,DMASTA(R0) MOV #4,(R0) ;SET COUNT AS NEG. VALUE MOV ADCOUT,DMASTA(R0) MOV #2,(R0) ;ENABLE DMA MOV #10000,4$ IF DEFINED = VR14 CODE ;DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 EXIT=0 CRLFC0=3 COLEND=5 DMASTA(R0) MOV ADSTAV,(R0) ;SET A/D STATUS, INTERRUPT MOV (SP)+,R0 RTS PC ;ON, CLOCK DRIVEN. .ENDC .END COLST=6 TEXT=7 SING=12 FFLOAT=15 .IFDF SPBBU$ .IFDF CAPS$ .GLOBL DEEOL .ENDC .GLOBL DEBU,IFIX,DECMD,DEDATA,MULT,DETOP,DEBOT,DEFREE,DETLE .GLOBL DEFLG1,DEASGN,DEFORE,FORMAT,$IR,DEBTOP,DECMD1,DEDIT1 .GLOBL DIST,DEDID,$POLSH .IFDF GT40$ .IFDF RT11$ .GLOBL DEGFCJ .ENDC .GLOBL DEDBCB,DEGTOF .ENDC ;ROUTINES CALLED: IFIX, MULT,DEFORE,FORMAT,DETLE,$POLSH,DEEOL ;--- BBU(FFERS) S# F# SIZE --- ; S# = NUMBER OF S.P. BUFS ; F# = NUMBER OF F.P. BUFS ; SIZE = TOTAL NUMBER OF POINTS OF.TITLE SPOV1 ;LAB APPLICATIONS-11 BUFFER COMMAND ;DEC-11-SLABA-C-LA15 ;FILE ID SPOV1.1 ;FILE: SPOV1.MAC .CSECT SPOV1 ;C EACH BUFR DEBU: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTANTS .BYTE 4,4 JSR PC,@#DETLE ;CHK ANY OTHER EXCESSES CMP #177777,OPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ON@#DECMD ;A BUFFR WAS SPECIFIED? BNE DEBU02 ;YES MOV #2,R0 ;NO--(ERR) JMP DEBUEE DEBU02: CMPB @#DECMD+1,@#DECMD+3 BNE#*4 ADD R5,R3 ; R3 = TOTAL BYTES FOR F.P. BR DEBU4 DEBU5: ADD R5,R2 ; R2 = R2+# ASL R5 ;#=#*2 (S.P. TAKES 2 BYTES) DECMD ;ADDR OF NUMBER TO OUTPUT .BYTE TEXT .ASCII / WORDS/ .BYTE 0,CRLFC0,EXIT .EVEN MOV #DEDIT1,R0 CLR DIST(RJSR PC,@#MULT ; R0 = BUSIZ, R5 = #*2 ADD R5,R1 ; R1 = TOTAL BYTES FOR S.P. DEBU4: TST R0 ;H.ORD OF PRODUCT = 0? BNE DEBUE0) ;TOTAL PTS=0 (FLG FOR 'DDI') .IFDF GT40$ .IFDF RT11$ MOV @#DEDBCB,R0 .REMOV ;REMOV DISPLYS FROM GRAPHICS MOV #D2 ;NO, BUFSIZE >65536, ERROR DEBU4A: MOV R1,R0 ADD R3,R0 ;R0 = TOTAL WDS FOR S.P. + F.P. BVS DEBUE2 ; TOTAL EXCEEDS 28K,EGFCJ,R0 .REMOV .ENDC CLR @#DEDBCB+2 ;SET GT40 DISPLY BUF SIZE = 0 JSR PC,@#DEGTOF ;TURN GT40 OFF! .ENDC RTS PC ERROR MOV @#DETOP,R5 ; TOP OF FREE CORE SUB @#DEBOT,R5 ; BOT OF " " ADD #2,R5 ;R5 = TOTAL OF FREE CORE CMP R0,R5 ;ERRORS DEBUE2: MOV #5,R0 ;BUFFER NEEDS EXCEED FREE CORE DEBUEE: TST (SP)+ ;GET NORMAL RTN OFF STACK JMP @#DEFORE .EN; ROOM FOR ALL BUFFERS? BHI DEBUE2 ;NO, BUFFER NEED EXCEED FREE CORE? ;UPDATE BUFFER MANAGEMENT TABLE. MOV @#DECMD1+4,@DC ;--- ASSIGN COMMAND --- .IFDF SPDDI$!SPDSP$ .GLOBL DECMD,DEASGN,DEFORE ;ROUTINES CALLED: DEFORE ;ASSEMBLY PARAME#DEDATA ;SET UP DATA SIZE WD. MOV @#DECMD1+4,@#DEDATA+2 ; " BUFFER SIZE WD. MOV @#DEBOT,@#DEFREE ;RESET DEFREE = BOT OFTERS ;VR14$- WHEN NOT DEF. WILL ELIMINATE CODE FOR 'ASSIGN CMD' BECAUSE ; IT IS NOT USED BY GT40 VERSION OF DATA EDITOR ;-- BUFS? BEQ DEBU2 ;SNGL CLR R2 ;FLOAT, R2 = S.P. # = 0 MOV R5,R4 ; R4 = F.P. # ASL R5 ASL R5 ;# = # *4 (F.P. FREE CORE MOV R2,@#DEDATA+4 ;#S.P. BUFS BEQ DEBU6 ;#S.P. BUFS COULD =0 MOV @#DEFREE,@#DEDATA+6 ;ST.ADDR. OF S.P. BUFS TAKES 4 BYTES) JSR PC,@#MULT ;R0 = BUSIZ, R5 = # *4 MOV R5,R3 ; R3 = TOTAL BYTES FOR F.P. CLR R1 ; R1 = " ADD R1,@#DEFREE ;CURRENT BOTTOM OF FREE CORE DEBU6: MOV R4,@#DEDATA+10 ;#F.P. BUFS BEQ DEBU7 ;#F.P. BUFS COULD =0 MOV " " S.P. = 0 BR DEBU3 DEBU2: MOV R5,R2 ; R2 = S.P. # CLR R4 ; R4 = F.P. # = 0 ASL R5 ;#=#*2 (S.P. TA @#DEFREE,@#DEDATA+12 ;ST.ADDR. OF F.P. BUFS ADD R3,@#DEFREE ;CURRENT BOTTOM OF FREE CORE DEBU7: MOV @#DEFREE,@#DEBTOP ;SET KES 2 BYTES) JSR PC,@#MULT ;R0 = BUSIZ, R5 = #*2 MOV R5,R1 ; R1 = TOT BYTES OF S.P. CLR R3 ; R3 = " " "BUF TOP = DEFREE CLRB @#DEFLG1 ;DISPL INACTIVE CLR @#DEDID ;CLR I/D TBLS WHICH CLR @#DEDID+2 ;WERE BEING DISPLAYED C F.P. = 0 DEBU3: TST R0 ;H.ORD OF PRODUCT = 0? BNE DEBUE2 ;NO, BUF SIZE >65536, ERROR MOV @#DECMD1+4,R0 ;R0 = BUF SIZE LR @#DEASGN ;CLR ASSIGN TBL CLR @#DEASGN+12 ;TIME TO OUTPUT SIZE OF FREE CORE MOV @#DETOP,R0 SUB @#DEFREE,R0 ADD #2, MOVB @#DECMD+2,R5 ;GET # OF BUFS BMI DEBU4A ;NONE, THEREFORE GO ON TO NEXT STEP TSTB @#DECMD+3 ;WHAT KIND OF BUFS? BEQ DR0 ;#BYTES CLC ROR R0 ;#WORDS MOV R0,-(SP) JSR R4,@#$POLSH $IR,.+2 ;#WORDS FLOATED MOV (SP)+,DECMD MOV (SP)EBU5 ;SNGL ADD R5,R4 ;FLOAT, R4 = R4+# ASL R5 ASL R5 ;# = #*4 (F.P. TAKES 4 BYTES) JSR PC,@#MULT ;R0 = BUSIZ, R5 = +,DECMD+2 JSR R5,@#FORMAT .BYTE CRLFC0,TEXT .ASCII /FREE CORE = / .BYTE 0,FFLOAT .BYTE 0,7 ;VALUE--7 SIG DIG .EVEN 1ST WD OF 1ST ENTRY OF CLRB @#DEASGN ;THE ASSIGN TBL RTS PC ;ERRORS DEASE1: MOV #7,R0 ;MUST BE S.P. BUFR TST (SPTTYOCH ;SET DEV FOR 'QA' (T,L,H) JSR PC,@#DECHR TST R0 ;WAS A SWITCH SPECIF? BMI DEWR7 ;NO CMP R0,#2 ;MAYBE! BHI DE)+ ;GET NORMAL RTN OFF STACK JMP @#DEFORE .ENDC .ENDC ;--- WRITE COMMAND --- .IFDF SPPWR$ .IFDF CAPS$ .GLOBL DEWR6 ;YES MOV #9.,R0 JMP DEPREE ;BAD SWITCH (ERR) DEWR6: SUB #3,R0 MOV R0,@#DECMD+2 ;SWITCH =0(N) OR 1(Y) BR DEWR8 DEFLCK,DEEOL,DEFXCU,DEOPBU .GLOBL DEFMCK,DEFMK0,DEFMK1 .ENDC .GLOBL DEWR,DECMD,DECMD1,DEDATA,TTYOCH,IFIX .GLOBL FORMAT,DEGET,WR7: CLR @#DECMD+2 ;DEFAULT SWITCH =0(N) DEWR8: JSR PC,@#DETLE ;CHK ANY OTHER EXCESSES TST @#DECMD1+4 ;#SKPS SPECIF? BPL DEDEFORE,IFIX,DETLE ;ROUTINES CALLED:DEFXCU,FORMAT,DEFMCK,DEGET,DEFORE,DEOPBU ; DECHR,IFIX,DETLE,DEEOL ;--- PWR [B] [#PTS [WR9 ;YES CLR R0 ;NO DEFAULT =0 BR DEWR10 DEWR9: JSR R5,@#IFIX BR DEWR10 DECMD1+4 DEWR10: MOV R0,@#DECMD1+4 ;SAVE #S#SKP]] [DEV SU] --- ;#PTS= # PTS TO WRITE OUT & #SKP= # OF PTS TO SKIP BEFORE ; WRITING OUT #PTS ;IF #PTS NOT SPECIF-WRITE DAKP FOR MINUTE TST @#DECMD1 ;#PTS SPECIF? BMI DEWR12 ;NO; CHK OUT FIX CURSORS JSR R5,@#IFIX ;YES, FIX #PTS BR DEWR11 TA BETWN CURSORS IF THEY ARE UP,ELSE ; WRITE OUT ENTIRE DATA FILE. ;IF #PTS ARE SPECIF-WRITE OUT AS DIRECTED. ;DEV=TTY(T), LPDECMD1 DEWR11: MOV R0,R5 ;R5=#PTS BNE DEWR1A RTS PC ;#PTS=0, SO RETN DEWR1A: MOV @#DECMD1+4,R4 ;R4=#SKP ADD R4,R5 T(L), H.S.P.(H) DEFAULTS TO (T) ;SUPPRESS SWITCH (SU)- YES(Y), SUPPRESS LINE #S & COLUMNS. ; -NO(N),OUTPUT LINE #S & COLUMNS ;R5=TOTAL PTS +SKP= END PT CMP R5,@#DEDATA+2 ;#PTS + #SKPS > BUFSIZ? BLOS DEWR1B ;NO MOV #50.,R0 ;YES--(ERR) JMP . ; DEFAULT=NO(N) ;USE SPECIFIED OUT FORMAT. DEWR: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTANTS .BYTE 2,10 JSR PC,@#DEOPBUDEPREE DEWR1B: DEC R5 ;R5=TOTAL PTS-1 BR DEB3 DEWR12: JSR PC,@#DEFXCU TST R4 ;ARE CURSORS ACTIVE BPL DEB3 ;YES, R4 ;CHK OPTIONAL BUFR B ;GET DEV FOR QA & GET SWITCH JSR PC,@#DECHR ;CHK FOR 'DEV' TST R0 ;1ST CALL GAVE A DEFAULT? BPL DE & R5 ARE SET UP CLR R4 ;ST PT #=0(R4) MOV @#DEDATA,R5 ;END PT#=(DATASIZE-1)(R5) DEC R5 DEB3: MOV #5,R2 ;#COLUMNS TO- DAS S1 [S2] --- ;SNGL PREC BUFS S1 AND S2 (OPTINAL), PREVIOUSLY ;DEFINE, ARE ASSIGNED FOR F.P. DATA BUF CONVERSIONS. .IFWR1 ;NO CLR R0 ;YES R0=0(T) CLR @#DECMD+2 ; SWITCH=0(N) BR DEWR3 DEWR1: CMP R0,#2 ;'N' OR 'Y' SPECIF BLOS DEWR4 ;NDF VR14$ .GLOBL DEAS DEAS: MOVB @#DECMD+1,R0 ;GET S1 TYPE BNE DEASE1 ;ERR, TYPE WAS NOT S.P. MOVB @#DECMD+3,R1 ;GET SO, T,L, OR H WERE SPECIF SUB #3,R0 ;YES MOV R0,@#DECMD+2 ;SWITCH =0(N) OR 1(Y) JSR PC,@#DECHR ;THEN DEV SHOULD HAVE BEEN 2 TYPE (IF ONE) BPL DEAS1 CLR @#DEASGN+12 ;ONLY 1 BUF WAS ASSIGNED BR DEAS2 DEAS1: BNE DEASE1 ;ERR,TYPE WAS NOT S.P. DEFAULTED TST R0 ;WAS IT? BMI DEWR2 ;YES MOV #8.,R0 JMP DEPREE ;NO (FMT ERR) DEWR2: CLR R0 ;DEFAULT DEV=0(T) DEWR3 MOVB @#DECMD+2,@#DEASGN+13 ;SET 1ST WD OF 2ND ENTRY OF CLRB @#DEASGN+12 ;THE ASIGN TBL DEAS2: MOVB @#DECMD,@#DEASGN+1 ;SET: MOVB R0,@#TTYOCH ;SET DEV FOR QA BR DEWR8 DEWR4: BNE DEWR5 MOV #177777,R0 ;'QA' WANTS R0=-1 FOR H.S.P. DEWR5: MOVB R0,@#EWR15 DEWR14: JSR R5,@#FORMAT ;YES .BYTE CRLFC0,EXIT ;OUTPUT A CRLF TO BEGIN WITH .EVEN DEWR15: TST @#DECMD+2 ;SUPPRESSMD,DECMD1,QA,QADATF,TTYICH,QAERR .GLOBL FORMAT,QAANS,$POLSH,$CMR,SAVARG,RSTARG,DEPUT .GLOBL DEFORE,DEDATA,TTYECH,DEFLCK,DETLE, LINE #S & COLUMNS? BEQ DEB7 ;NO ;THIS OUTPUT DOESNOT USE LINE #S & COLUMNS MOVB #16,DEWRI1 JSR PC,DEWRI CMP R0,R5 DEEOL ;ROUTINES CALLED IFIX,QA,FORMAT,$POLSH,SAVARG,RSTARG,DEPUT,DECHR ; DEOPBU,DETLE,DEEOL ;--- PRE [B] [#PTS [#SKP[BUF ;REACHED THE LAST PT? BEQ DEB13 ;YES INC R0 BR DEWR14 ;THIS OUTPUT DOES USE LINE #S & COLUMNS DEB7: MOV R2,R3 ;RES POSITION]]] [L H] [DEV] ;B - BUFFER INTO WHICH DATA IS TO BE READ ;#PTS - NUMBER OF PTS TO STORE INTO B (#< = DATA SIZE OF B)ET CTR. R3=#COLUMNS/LINE MOV R0,DEB8 ;GET CURRENT PT# INC DEB8 JSR R5,@#FORMAT .BYTE CRLFC0,COLEND,5 .BYTE SING,200 ;SKIP - NUMBER OF PTS TO SKIP OVER BEFORE READING IN # ; SKIP DEFAULTS TO 0 ;BUF POSITION - IS THE NUMBERED POSITION WITHIN ;SNGL PREC. OUTPUT .BYTE 5 ;#SIG. DIGITS .EVEN DEB8: 0 ;VALUE OF CURRENT # .BYTE EXIT .EVEN MOV #5,R1 ;R1 HOLB WHERE THE INPUT ; DATA WILL BEGIN. DEFAULT = 1 ;L & H - ALL DATA OUTSIDE THESE LIMITS, WOULD BE SET TO THE ; CORRESPONDS CURRENT 'COLEND #' DEB9: ADD @#DECMD+4,R1 ;ADD NXT FIELD WIDTH MOVB R1,DEWRI1 JSR PC,DEWRI CMP R0,R5 BEQ DEB13 ;CDING LIMIT (OPTIONAL) ;DEV - DATA IS READ IN FROM HSR (R) OR TTY (T) OR L.S.R. (L) ; DEFAULTS TO (T). DERE: JSR R5,DEEOL ;URRENT PT # = (END PT #-1) INC R0 ;BMP CURRENT PT DEC R3 ;DECR COLUMN CTR BNE DEB9 ;OUTPUT NXT COLUMN BR DEB7 DEBCHK FOR EXCESS BUFRS/CONSTANTS .BYTE 2,-1 JSR PC,DEOPBU ;CHK FOR OPTIONAL BUFRS CMP #177777,@#DECMD1+14 BNE DERE0 ;L &13: JSR R5,@#FORMAT ;ISSUE A CRLF BEFORE RETURNING .BYTE CRLFC0,EXIT .EVEN CLRB @#TTYOCH ;ALWAYS LEAVE 'OUTPUT' TO TTY W H NOT SPECIF, THUS SET L=177777 177777 & H=77777 177777 BIC #100000,@#DECMD1+20 BR DERE2 DERE0: CMP @#DECMD1+20,#177777 ;'HEN DONE RTS PC ;THIS ROUTINE GETS NEXT DATUM,CALLS A ROUTINE TO SET THE # OF ;DEC.PL., AND THEN OUTPUTS THE NUMBER. DEL' WAS SPECIF BNE DERE00 MOV #10.,R0 JMP DEREEE ;BUT 'H' WAS NOT (ERR) DERE00: JSR PC,@#SAVARG ;'H' WAS TOO! MOV @#DWRI: JSR R5,@#DEGET DECMD MOV (SP)+,DEFMK0 MOV (SP)+,DEFMK0+2 JSR PC,DEFMCK MOVB DEFMK1,DEWRI2 JSR R5,@#FORMAT .BYECMD1+16,-(SP) MOV @#DECMD1+14,-(SP) ;PUT L OR H ON STACK (VAL1) MOV @#DECMD1+22,-(SP) MOV @#DECMD1+20,-(SP) ;PUT H OR L OTE COLEND DEWRI1: .BYTE 0 ;#PLACES TO COLLUM END .BYTE 16 ;E-FMT =16 DEWRI2: .BYTE 0 ;#DEC.PL. (TO BE FILLED IN) .BYN STACK (VAL2) JSR R4,@#$POLSH $CMR,.+2 BMI DERE1 ;VAL1VAL2 (SWITCH ORDER) TE 6 ;#SIG.FIG. .EVEN DEFMK0 ;ADDR OF DATUM TO OUTPUT .BYTE EXIT .EVEN RTS PC ;ERRORS DEPREE: TST (SP)+ ; MOV @#DECMD1+16,R1 MOV @#DECMD1+20,@#DECMD1+14 ;SWITCH TO F.P. 'L' FOLLOWED MOV @#DECMD1+22,@#DECMD1+16 ;BY F.P. 'H' MOV OUTPUT MOV #15,@#DECMD+4 ;#SIG.DIG. IN FLD WIDTH MOV R4,R0 ;ROUTINE 'DEGET' USES R0 AS INDEX PTR TSTB @#TTYOCH BMI DGET NORMAL RTN OFF STACK CLRB @#TTYOCH ;ALWAYS LEAVE IN TTY MODE JMP @#DEFORE ;---READ COMMAND--- .GLOBL DERE,IFIX,DEC: INCB @#TTYECH ;DEV=L OR H -- SET NO ECHO DERE99: MOVB R0,@#TTYICH ;SET DEV FOR QA JSR PC,@#DETLE ;CHK FOR OTHER CMD EXCESSE ARE ON THE STACK DERE12: JSR R5,@#DEPUT DECMD ;PUT STACK VALUE INTO 'B' INC R0 INC DERE30 ;INCR CURRENT DATA COUNT S ;TIME TO GET DATA MOV R2,R0 ;SET INDEX FOR 'DEPUT' CLR DERE30 DERE29: TSTB @#TTYICH BNE DERE7 ;H.S.R. JSR R5,@#FORDEC R3 ;DECR DONE CTR BNE DERE13 ;STILL MORE PTS TO READ IN DERE14: CLRB @#TTYECH CLRB @#TTYICH ;ALWAYS RESET TTY & ECHO R0,@#DECMD1+20 MOV R1,@#DECMD1+22 DERE1: JSR PC,@#RSTARG DERE2: CMP @#DECMD1+10,#177777 ;BUF POSITION SPECIF ? BNE DERE2AMAT ;TTY - TELL USER # PTS HE ENTERED .BYTE CRLFC0,TEXT ; SO FAR. .ASCII /PTS=/ ;OUTPUT # PTS READ IN SO FAR .BYTE 0,COLS ;YES CLR -(SP) ;PUT DEFAULT-1 ON STACK TST @#DECMD1+4 ;#SKP SPECIF ? BPL DERE3 ;YES CLR -(SP) ;NO PUT DEFAULT T,5,SING .BYTE 300 ;UNSIGNED VALUE + 'DERE30' HOLDS VALUE. .EVEN DERE30: 0 ;CONTAINS VALUE TO BE OUTPUT .BYTE EXIT .#SKP ON STACK TST @#DECMD1 ;#PTS SPECIF? BPL DERE5 ;YES MOV @#DEDATA,R3 ;NO R3=DATASIZE DEFAULT #PTS BR DERE6A DEEVEN ;GET A NEW LINE OF DATA DERE7: JSR R5,@#QA 10000+10 ;NULL QUEST (CRLF) & F.P. INPUT TSTB @#QADATF BEQ DEREDN ;REARE2A: JSR R5,@#IFIX BR DERE2B DECMD1+10 DERE2B: DEC R0 BPL DERE03 MOV #11.,R0 JMP DEREEE ;BUF POSITION-1 < 0 ? (ERRCHED E.O. DATA DERE8: TSTB @#QAERR BNE DEREE2 ;BAD DATA (ERR) TST R4 ;SKIP OVER THIS DATUM? BEQ DERE9 ;NO! DEC R4 ;) DERE03: MOV R0,-(SP) ;SAV BUF POSITION ON STACK DERE3: JSR R5,@#IFIX BR DERE4 DECMD1+4 DERE4: MOV R0,-(SP) ;SAVE #SKPYES! DECR SKIP CTR DEC R3 ;DECR DONE CTR BEQ DERE14 INC DERE30 ;INCR CURRENT DATA CTR. BR DERE13 DERE9: JSR PC,@#SAVS TILL 'IFIX' IS DONE DERE5: JSR R5,@#IFIX BR DERE66 DECMD1 DERE66: MOV R0,R3 ;SAVE #PTS IN R3 BGT DERE6A CMP (SP)+,(ARG MOV @#QAANS+2,-(SP) MOV @#QAANS,-(SP) ;PUT DATUM ON STACK MOV @#DECMD1+22,-(SP) MOV @#DECMD1+20,-(SP) ;PUT 'H' ON STSP)+ ;CLEAN UP STACK 1ST RTS PC ;#PTS<=0, SO RETN DERE6A: MOV (SP)+,R4 ;GET #SKPS BAK MOV (SP)+,R2 ;GET BUF POSITION BACK ACK JSR R4,@#$POLSH $CMR,.+2 ;COMPARE DATUM WITH 'H' BMI DERE10 ;DATUM < 'H' JSR PC,@#RSTARG ;DATUM > = 'H' PUT H ON S ADD R3,R2 ;BUF POSITION + #PTS CMP R2,@#DEDATA ;BUF POSITON + #PTS <= BUFSIZ ? BLOS DERE77 ;YES MOV #12.,R0 JMP DERETACK MOV @#DECMD1+22,-(SP) MOV @#DECMD1+20,-(SP) BR DERE12 DERE10: MOV @#DECMD1+16,-(SP) MOV @#DECMD1+14,-(SP) ;PUT 'L'EE ;NO, BUF NEEDS EXCEEDED! DERE77: SUB R3,R2 ;RESTORE BUF POSITION ADD R4,R3 ;TOTAL PTS TO READ (#PTS + #SKP) ;GET DE ON STACK MOV @#QAANS+2,-(SP) MOV @#QAANS,-(SP) ;PUT DATUM ON STACK JSR R4,@#$POLSH $CMR,.+2 ;COMPARE 'L' WITH DATUM V FOR 'QA' JSR PC,@#DECHR TST R0 BPL DERE88 CLR R0 ;DEFAULT DEV =0(T) DERE88: CMP R0,#2 BHI DEREE1 ;BAD DEV NAME BPL DERE11 ;'L' > = DATUM JSR PC,@#RSTARG MOV @#QAANS+2,-(SP) MOV @#QAANS,-(SP) ;DATUM > 'L', PUT DATUM ON STACK BR DER BNE DERE89 ;DEV=T OR L MOV #177777,R0 ;'QA' NEEDS R0=-1 FOR H.S.R. BR DERE90 DERE89: TST R0 BEQ DERE99 ;DEV=T DERE90E12 DERE11: JSR PC,@#RSTARG MOV @#DECMD1+16,-(SP) ;PUT 'L' ON STACK MOV @#DECMD1+14,-(SP) ;AT THIS PT EITHER DATUM, L OR HR0=0(T) =1(L) =2(H) =3(N) =4(Y) =-1(DEFAULT) ;DEFAULT DEV(T) SU SW(N) DECHR: JSR R5,QA 20000+400+20 ;NULL ANS OK+SILENT QUEST+ALPHANU CMD DEVADR TSTB @#QADATF BNE DECHR1 MOV #177777,R0 ;NO DATA, SIGNAL DEFAULT R0=-1 RTS PC DECHR1$JOB/RT11 TTYIO .R MACRO *BIN:SPCORE CHECK THE SIGN INC @SP ;AND KEEP TRACK AS ABOVE NEG R2 ; I 2$: MOV R2,R3 ;<-RODUCT ROR R1 BCC 8$ ;NO ADD NEEDED ADD R0,R4 8$: DEC R2 ;COUNT ITERATION BGT 6$ TST R4 ;WAS RESULT DOUBLE? BNE MOVE THE DIVISOR AND NEG R3 ;NEGATE FOR THE ALGORITHM ADD R3,R0 ;PREFORM THE INITIAL SUBTRACTION BCS 12$ ;CARRY SET IS10$ ;YES CMP R1,#100000 ;MAYBE BLO 12$ ;DEFINITELY NOT BHI 10$ ;DEFINITELY TST @SP ;SPECIAL CASE -2**15 OK BNE 12$ AN OVERFLOW MOV #20,-(SP) ;SET UP A COUNTER CLR -(SP) ;THIS IS A LASTING CARRY BIT 3$: ROL R1 ;ROTATE ONE LEFT ROL R0 ;YES 10$: COM R2 ;USE THIS AS CARRY FLAG 12$: TST (SP)+ ;IS RESULT TO BE NEGATED? BEQ 14$ ;NO NEG R4 ;YES NEG R1 TST @SP ;CHECK THE LAST CARRY BEQ 4$ ;IF ZERO ADD ELSE SUBTRACT CLR @SP ;CLEAR THE CARRY ADD R3,R0 ;DO ONE MORE STEP SBC R4 14$: MOV R4,R0 ASR R2 ;SET CARRY BIT FOR TWO WORD CASE MOV (SP)+,R4 ;RST REG MOV (SP)+,R2 RTS PC .ENDC .EN BR 5$ 4$: ADD R2,R0 ;-2N+N=N FOR THIS STEP 5$: ADC @SP ;KEEP IT A WHILE BEQ 6$ ;IF ZERO OMIT UPDATE INC R1 ;NO CARRDC .IFDF DIVR0$ ;DIVR0 32 BY 16 BIT DIVIDE TO SUPPORT MACRO $DIV SRC,R0 ;CALLED BY USING THE MACRO $DIV SRC,R0 ;WHICHY POSSIBLE 6$: DEC 2(SP) ;DECREMENT COUNTER BGT 3$ ;BRANCH IF MORE TO DO ROR R1 ;SEE ABOUT THE LAST CYCLE BCS 7$ ;OMI EXPANDS TO THE FOLLOWING WHEN EIS IS NOT AVAILABLE: ; MOV SRC,-(SP) ; JSR PC,DIVR0 ; ON RETURN R0 CONTAINS QUOTIENT, R1 COT CORRECTION IF ONE ADD R2,R0 ;CORRECT REMAINDER CLC 7$: ROL R1 ;REPLACE THE LAST BIT CMP (SP)+,(SP)+ ;POP TWO WORDS NTAINS REMAINDER ; SIGN OF REMAINDER SAME AS SIGN OF DIVIDEND ; CONDITION CODES N AND V CORRECTLY SET, Z AND C NOT DIVR0: .TST @SP ;TEST FOR REMAINDER CHANGES BGE 8$ ;OMIT IF POSITVE NEG R0 ;NEGATE REMAINDER CLRB 1(SP) ;CLEAR SIGN DEC @SP IFDF EAE MOV R1,@#MQ ;LOW ORDER DIVEND MOV R0,@#AC ;HIGH ORDER DIFIDEND MOV 2(SP),@#DIV ;DIVIDE MOV (SP)+,@SP ;PUT RET ;BUT DO A GOOD JOB ON QUOTIENT 8$: CMP #100000,R1 ;TEST FOR THE BUG IN THE ALGORITHM BLO 12$ ;EXIT WITH ERROR OF TOO BIG URN ADDR WHERE NEEDED MOV @#MQ,R0 ;QUOTIENT MOV @#AC,R1 ;REMAINDER ROLB @#EAESR ;SET N AND V RTS PC .ENDC .IFNDF BEQ 11$ ;CHECK FOR OVERFLOW 9$: TST (SP)+ ;TEST FOR QUOTIENT ADJUSTMENT BEQ 10$ ;IF ZERO NONE NEEDED NEG R1 10$: MOV R0T CLC BITB #2,@#EAESR ;TEST FOR SINGLE PRECISION BNE 1$ SEC ;C=0 IMPLIES 16-BIT PRODUCT OK RTS PC .ENDC .IFNDF EEAE MOV 2(SP),-(SP) ;GET SOURCE MOV 2(SP),4(SP) ;PUT RETURN WHERE NEEDED MOV R2,2(SP) ;FREE A REGISTER MOV (SP)+,R2 ;ANDAE MOV R2,-(SP) ;PUSH TWO REGISTERS AND A FLAG MOV R4,-(SP) CLR -(SP) TST R0 ;CHECK SIGNS BPL 2$ NEG R0 ;TAKE ABSO FILL IT WITH SOURCE MOV R3,-(SP) ;SAVE ANOTHER REGISTER CLR -(SP) ;SET UP A SIGN CONTROL WORD TST R0 BGE 1$ DECB 1(SPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPD PRINT AN EXPONENTIAL ;NUMBER STARTING IN COLUMN 20, FOLLOWED BY A ;C.R.L.F. IS AS FOLLOW ; .BYTE 3 ;DOES A C.R.L.F. AN S,R2 ;SAVE REMAINDER MOV R1,R0 ;GET QUOTIENT MOV R2,R1 ;AND REMAINDER WHERE NEEDED CLC BR 13$ ;EXIT WITH NO OVERFLOW LIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;IF DEFINED INCLUDE ;FORTX$ TEXT 11$: TST @SP ;TEST FOR NEGATIVE BNE 9$ ;IF NEGATIVE, OK 12$: TST (SP)+ ;REMOVE SIGN WORD SEC ;MARK OVERFLOW 13$: MOV;FORSP$ SINGLE PRECISION OUTPUT ;FORFL$ FLOATING OUTPUT ;REGISTER DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 S (SP)+,R3 ;THIS CLEARS V-BIT MOV (SP)+,R2 MOV R0,R0 ;THIS SETS Z,N BCC 14$ SEV 14$: RTS PC .ENDC .ENDC .ENDC .EP=%6 PC=%7 ;EXTERNAL GLOBAL SYMBOLS .GLOBL SAVARG,RSTARG,TYPCH .IFDF FORFL$ .GLOBL $ECO,$FCO,FORBUF .ENDC .IFDF FORSP$ ND .GLOBL DIVD,DIVDNH,DIVQH,DIVDSH .ENDC ;INTERNAL GLOBAL SYMBOLS .GLOBL FORMAA,FORMAT,FORMAB .IFDF FORFL$ .GLOBL FORBUA .ENDC ;OUTPUT BUFFER ADDRESS =FORBUF,FOR FLOATING OUTPUT ;THE USER MUST SET A BUFFER IN HIS PROGRAM CALLED FORBUF ;AND SET IT GLOBAL ;THE AREA MUST BE LARGE ENOUGH(IN BYTES) ;TO ACCOMMODATE THE OUTPUT,FROM FPMP. ;OUTPUT FORMATTER ; TO USE THE OUT.TITLE OUTF ;LAB APPLICATIONS-11 OUTPUT FORMATTER ;DEC-11-SLABA-C-LA8 ;FILENAME OUTF.MAC ;FILE ID OUTF.2 .CSECT OUTF ;COPUT FORMATTER A COMMAND LIST ;MUST BE MADE AND THE THE O.F. CALLED AS FOLLOWS. ;OUTPUT FORMATTER CALLING SEQUENCE ; JSR R5,FOPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLRMAT ; LIST OF COMMANDS ; EXIT ;OR ; STORE ADDRESS OF LIST IN R0 ; JSR PC,FORMAA ;OR, TO STORE ASCII IN A BUFFER RATHER ;Y ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANYTHAN TO AN OUTPUT DEVICE ;STORE ADDRESS OF LIST IN R0 ;STORE ADDRESS OF BUFFER IN R5 ; JSR PC,FORMAB ;THE FORMAT OF THE COMM OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ANDAND LIST IS AS FOLLOWS. ;1. THE COMMAND LIST CONSISTS OF COMMANDS IN BYTE ; FORMAT. ;2. THE LIST OF COMMANDS IS ENDED BY TH TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE E EXIT COMMAND. ;3. EACH COMMAND CONSIST OF A COMMAND DIRECTIVE ; FOLLOWED BY THE COMMAND PARAMETERS. ;4. ADDRESSES AND WORINFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUID OR FLOATING VALUES ARE IN ; WORD OR 2 WORD FORMAT. ;AN EXAMPLE OF A COMMAND LIST TO DO A CARRIAGE ;RETURN, LINE FEED AN1. OCTAL NUMBER OUTPUT ; .BYTE OCTAL,N ; .EVEN ; .ADDRESS OR VALUE ;N=0-5 BITS,#OF DECIMAL PLACES ; BIT 6 ,=1 IF VALUE I;RETURN ADDRESS CLR FOROTF ;SET OUTPUT TO A DEVICE FOR1: MOV (SP)+,R5 ;RESTORE THE VALUE OF R5 FOR5: JSR PC,SAVARG ;SAVE ALS ABSOLUTE ; BIT7 ,=1 IF THE ADDRESS/VALUE WORD IS THE OUTPUT VALUE ; =0 IF ADDRESS OF VALUE. ;12. SINGLE NUMBEL REGISTERS. MOV FORSFG,R4 ;STORE ADDRESS TO COMMAND LIST FORNXT: CLR FORSFG MOVB (R4)+,R0 ;GET COMMAND BNE FOR2 ;EXIT OR OUTPUT ; .BYTE SINGL,N ; .EVEN ; .ADDRESS OR VALUE ; N=SAME AS ABOVE ;13. DOUBLE OCTAL OUTPUT ; .BYTE DOOCT,N ; .EVENN 0 COMMAND. TST FOREXT ;RETURN ADDRESS SAVED? BNE FOR3 BIT #1,R4 ;NO, TEST FOR EVEN ADDRESS BEQ FOR4 INC R4 FOR4: ; ADDRESS OR VALUE ; N=SAME AS ABOVE ;14. DOUBLE NUMBER OUTPUT ; .BYTE DOUB,N ; .EVEN ; .ADDRESS OR VALUE ; N=SAME AS MOV R4,FOREXT FOR3: JSR PC,RSTARG ;RESTORE ALL REGISTERS JMP @FOREXT FOR2: MOVB (R4)+,R1 ;STORE 1ST COMMAND BYTE BIC #17ET COLUMN ; ;POINTER TO COLUMN 1 ; .BYTE 6,20. ;START OUTPUT IN COLUMN 20. ; .BYTE 16,2,7 ;DO EXPONETIAL OUTPUT WITH ; ABOVE ;15. FLOATING OUTPUT ; .BYTE FLOAT,N,M ; .EVEN ; ADDRESS OR VALUE ; N=SAME AS ABOVE BUT BIT 6 IS NOT APPLICABLE .EVEN ;2 DECIMAL PLACES AND 7 ; ;SIGNIFIGANT FIGURES, OF THE ; .WORD ADDRESS ;NUMBER LOCATED AT THE ADDRESS. ; ;IN T; M=NUMBER OF SIGNIFIGANT DIGITS ;16. EXPONENTIAL OUTPUT ; .BYTE EXP,N,M ; .EVEN ; ADDRESS OR VALUE ; THE NUMBER OF SIGNIFIHE TABLE ; .BYTE 3,0 ;DO A CRLF AND END THE ; ;COMMAND TABLE, 0=EXIT ; ;COMMAND ;A CALL TO THE OUTPUT FORMATTER DOEGANT DIGITS OUTPUT EQUALS ;THE NUMBER OF DECIMAL POINTS ;OUTPUT FORMATTER STORAGE AND TABLES. FORATB: FORSPA,FORLIN,FORCLZS NOT SET THE ;COLUMN POINTER TO COLUMN 1, BUT LEAVES IT AT THE ;POSITION WHERE IT WAS LEFT. ;THE COMMANDS AND PARAMETERS F,FORCZ,FORCED,FORCST .IFDF FORTX$ FORTXT,FORTXA .ENDC .IFNDF FORTX$ FORERR,FORERR .ENDC .IFDF FORSP$ FOROCT,FORSOLLOW ;EXIT=0 ;SPACE=1 ;LINES=2 ;CRLFC0=3 ;CRC0=4 ;COLEND=5 ;COLST=6 ;TEXT=7 ;TEXTA=10 ;OCTAL=11 ;SINGL=12 ;DOOCT=NG,FORDOC,FORDBL .ENDC .IFNDF FORSP$ FORERR,FORERR,FORERR,FORERR .ENDC .IFDF FORFL$ FORFLO,FOREXP .ENDC .IFNDF F13 ;DOUB=14 ;FLOAT=15 ;EXP=16 ;COMMANDS. ;1. SPACES: ; .BYTE SPACE,# OF SPACES ;2. LINES ; .BYTE LINES,# OF LINES ;3. SORFL$ FORERR,FORERR .ENDC FORSFG: .BYTE 0 ;=1 FOR SINGLE, 0 FOR DOUBLE ;-1 FOR OCTAL FORDMI: .BYTE 0 ;NEGATIVE SIET COLUMN TO FIRST COLUMN. ; AND TYPE A CRLF ; .BYTE CRLFC0 ;4. SET COLUMN TO COLUMN 1 AND ; OUTPUT ONLY A CR. ; .BYTE CRC0GN FLAG ;OUTPUT FORMATTER. FORMAB: MOV R5,FOROTB ;GET ADDRESS OF STORE BUF. MOV #1,FOROTF ;SET BUF OUTPUT FLAG BR FOR6 ;5. SET COLUMN END POINTER ; .BYTE COLEND,COLUMN # ; COLUMN 1 HAS THE COLUMN #=1 ;6. SET COLUMN START ; .BYTE COLST,COLUMN FORMAA: CLR FOROTF ;SET OUTPUT TO A DEVICE FOR6: MOV R0,FORSFG ;SAVE ADDRESS TO COMMAND LIST. MOV (SP)+,FOREXT ;SAVE RET # ;7. OUTPUT TEXT ; .BYTE TEXT ; .ASCII /TEXT TO OUTPUT/ ; .BYTE 0 ;10. OUTPUT TEXT VIA AN ADDRESS ; .EVEN ; ADDRESS ;1URN ADDRESS BR FOR5 FORMAT: MOV R5,FORSFG ;STORE ADDRESS TO COMMAND LIST CLR (PC)+ ;NO RETURN ADDRESS YET. FOREXT: 0 TO TYPE SPACES FORSPS: DEC R1 ;R1 HAS # OF SPACES TO TYPE BPL FORSP1 RTS PC FORSP1: MOV #40,R0 ;TYPE SPACE JSR PC,FO OR DECIMAL FOROCT: INCB FORSFG ;SET SING. FLAG FORDOC: MOV #8.,(PC)+ ;SET RADIX. FORRAD: 0 ;OUTPUT RADDIX BR FORD15 FOROUT INC FORCCP ;MOVE COLUMN POINTER BR FORSPS ;OUTPUT LINES FORLIN: DEC R1 ;PRINT R1 LINES. BPL FORL1 RTS PC FRSNG: INCB FORSFG ;SET SINGLE FLAG. FORDBL: MOV #10.,FORRAD ;SET RADIX. FORD15: BIT #1,R4 ;TEST ADDRESS FOR EVEN BEQ FORD1ORL1: MOV #12,R0 JSR PC,FOROUT BR FORLIN ;SET COUNTER AT ZERO. FORCLZ: MOV #15,R0 ;DO CR. LF. JSR PC,FOROUT MOV #12 ;AND SET EVEN IF ODD. INC R4 FORD1: TSTB R1 ;R1; BIT 7 IS ADDRESS FLAG, BIT BMI FORD2 ;6 ABS VALUE FLAG, 5-0 IS # OF ,R0 JSR PC,FOROUT BR FORCZ1 FORCZ: MOV #15,R0 ;DO ONLY CR. JSR PC,FOROUT FORCZ1: CLR FORCCP CLR (PC)+ ;NUMBER OF SMOV (R4)+,R2 ;DECIMAL PLACES. IF NEXT WORD BR FORD3 ;NOT ADD, IT IS THE VALUE. FORD2: MOV R4,R2 ;STORE ADDRESS OF THE OUPACES TO USE IN FORDEL: 0 ;THE NEXT OUTPUT. DEC R4 ;MOVE COMMAND POINTER BACK. RTS PC ;CALCULATE NUMBER OF SPACES TO TPUT ADD #4,R4 ;VALUE FORD3: MOV (R2)+,R5 ;GET VALUE TO OUTPUT, LOW MOV (R2),R3 ;ORDER IN R5, HIGH IN R3. TSTB FORSFG USE IN NEXT OUTPUT. FORCED: SUB FORCCP,R1 MOV R1,FORDEL RTS PC .IFDF FORTX$ ;TEXT OUTPUT FORTXA: BIT #1,R4 ;TEST FOR A;TEST FOR SINGLE PRECISION BEQ FORD9 CLR R3 ;YES, CLEAR HIGH ORDER. TSTB R1 ;TEST FOR ADDRESS POINTER BPL FORD9 SUB N ODD ADDRESS BEQ FORTX1 DEC R4 ;AND SET IT BACK IF ODD. FORTX1: MOV (R4)+,R3 ;ADD. IN R3 MOV R4,R2 ;SAVE COMMAND ADDRE#2,R4 ;YES, READJUST ADDRESS TO COMMANDS FORD9: BIT #100,R1 ;TEST FOR ABSOLUTE VALUE BNE FORD12 ;BRANCH IF YES. TSTB FOR7400,R1 ;CLEAR TOP BITS. CMP R0,#16 ;TEST FOR ERROR IN COMMAND. BHI FORERR DEC R0 ;GET INDEX INTO JUMP TABLE. ASL R0 SS MOV R3,R4 JSR PC,FORT1 ;OUTPUT TEXT MOV R2,R4 ;RESTORE LIST ADDRESS RTS PC FORTXT: MOV R4,R3 DEC R3 ;SAVE ADDR JSR PC,@FORATB(R0) ;JUMP TO ROUTINE BR FORNXT FOROUT: TST (PC)+ ;TEST OUTPUT KIND FOROTF: 0 ;=0 TO DEVICE, =1 TO BUFFEESS OF TEXT. TST R1 ;TEST FOR NO OUTPUT. BR FORT3 FORT1: MOVB (R4)+,R1 ;GET NEXT TEXT CHAR. FORT3: BEQ FORT2 ;TEST FOR ER BNE FOROT1 JSR PC,TYPCH ;TO A DEVICE RTS PC FOROT1: MOVB R0,@FOROTB ;TO A BUFFER INC (PC)+ FOROTB: 0 ;OUTPUT BUFFEND OF TEXT DEC FORDEL ;COUNT LEADING SPACES. INC FORCCP ;MOVE POINTER FOR EACH CHAR. BR FORT1 FORT2: MOV FORDEL,R1 ;OR PTR OF FOROTF=1 RTS PC FORERR: 0 ;ERROR HALT FOR DEBUGGING. ;MOVE COLUMN POINTER FORCST: MOV (PC)+,R2 ;MOVE POINTER VUTPUT LEADING SPACES. JSR PC,FORSPS CLR FORDEL ;CLEAR LEADING SPACES COUNT. FORT5: MOVB (R3)+,R0 ;OUTPUT MESSAGE BEQ FORIA SPACES. FORCCP: 0 ;COLUMN POINTER -1; 0 IS START ;THE COLUMN POINTER IS SET TO COLUMN ;1 ONLY BY CRLF0,OR CR0. T4 JSR PC,FOROUT BR FORT5 FORT4: RTS PC .ENDC .IFDF FORSP$ ;OUTPUT CONVERSION ROUTINE FOR SINGLE AND DOUBLE ;PRECISIO INC R2 BR FORS2 ;OUTPUT SPACES. FORSPA: CLR R2 ;TYPE R1 SPACES. FORS2: SUB R2,R1 JSR PC,FORSPS RTS PC ;ROUTINE N OUTPUT; NUMBER IS ABSOLUTE IF BIT 6 IS ;SET. WORD TWO IS VALUE IF BIT 7 IS ONE OF THE CONTROL ;BYTE. ;VALUE CAN BE OCTALR R2 FORD4: MOV FORRAD,R0 ;DIVIDE VALUE BY 10. CLR DIVDSH JSR PC,DIVD ADD #60,R5 ;STORE DIGITS ON STACK, LOW MOVB R5,-AT. BEQ FORF5 TST (SP)+ MOV R5,(SP) ;STORE # OF SIGNIFIGANT DIGITS ;FOR DECIMAL PT. SUB R1,R5 ;CALUILATE P SCALE (SP) ;VALUES FIRST INC R2 DEC R1 ;R1 HAS # OF DECIMAL PLACES. BNE FORD5 ;OR OCTAL PLACES. MOVB #56,-(SP) ;STORE DECIMAFACTOR BPL FORF6 CLR R5 FORF6: MOV R5,-(SP) ;STORE P FACTOR SUB R5,2(SP) ;DECREASE # OF DECIMAL PTS. FORF5: MOV 2(R2),-(L PT IF REQUIRED. INC R2 FORD5: TST DIVQH ;TEST IF QUOTIENT IS 0. BNE FORD6 TST R0 BEQ FORD14 FORD6: MOV DIVQH,DIVDNHSP) ;STORE F.P. VALUE MOV (R2),-(SP) TST R0 ;CALL OUTPUT ROUTINE BEQ FORF7 JSR PC,$ECO BR FORF8 FORF7: JSR PC,$FCO ;NO DIVIDE QUOTIENT MOV R0,R5 ;BY 10. BR FORD4 FORD14: TST R1 ;DON'T END UNTIL DECIMAL BPL FORD6 ;PT. IS PRINTED IFFORF8: JSR PC,RSTARG MOV (PC)+,R2 ;OUTPUT LEADING SPACES FORBUA: FORBUF MOV FORDEL,R1 SUB R3,R1 JSR PC,FORSPS CLR R1 REQUIRED ;OR ALL OCTAL DONE TST R2 ;OR AT LEAST ONE VALUE BEQ FORD6 ;IS OUTPUT FORD7: TSTB FORDMI ;DONE, TEST TO P FORF9: MOVB (R2)+,R0 ;OUTPUT ASCII STRING. CMP R0,#40 ;TEST FOR SPACE AFTER E BNE FORF10 CMP R1,#'E BNE FORF10 MOV #RINT - SIGN. BEQ FORD8 MOVB #55,-(SP) INC R2 FORD8: MOV FORDEL,R1 ;OUTPUT LEADING SPACES. SUB R2,R1 JSR PC,FORSPS FO'+,R0 ;PUT IN + IF SO FORF10: JSR PC,FOROUT MOV R0,R1 INC FORCCP DEC R3 BNE FORF9 BR FORD16 .ENDC .END RD11: MOVB (SP)+,R0 ;OUTPUT NUMBER. JSR PC,FOROUT INC FORCCP ;COUNT UP POINTER. DEC R2 BNE FORD11 .ENDC .IFDF FORSP$!FORFL$ FORD16: CLR FORDEL ;CLEAR LEADING 0 COUNT. RTS PC .ENDC .IFDF FORFL$ ;FLOATING POINT OUTPUT ROUTINE ;F FORMAT ENTRY FORFLO: CLR R0 BR FORF1 ;E FORMAT ENTRY FOREXP: MOV #5,R0 FORF1: MOVB (R4)+,R3 ;GET # OF SIGNIFIGANT DIGITS MOV .TITLE VRDISP ;LAB APPLICATIONS-11 DISPLAY MODULE (VR14) ;DEC-11-SLABA-C-LA3 ;FILE ID VRDISP.1 ;FILE: VRDISP.MAC .CSECT VRDR3,R5 ;SAVE # OF SIGNIFICANT DIGITS ADD #2,R3 ;ADD COUNT FOR . AND SIGN BIT #1,R4 ;SET ADDRESS EVEN. BEQ FORF2 INC R4ISP ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FSFG ;TEST IF SING. BEQ FORD13 TST R5 ;TEST IF NEGATIVE SING VALUE. BPL FORD13 COM R3 ;YES, SET HIGH ORDER NEGATIVE F FORF2: TSTB R1 ;GET ADDRESS OF FLOATING BMI FORF3 ;VALUE TO OUTPUT, PUT IN R2 MOV (R4)+,R2 BR FORF4 FORF3: MOV R4,RORD13: TST R3 ;TEST IF DOUBLE PRECISION IS BPL FORD12 ;NEGATIVE. INCB FORDMI ;SET NEGATIVE FLAG. NEG R5 ;NEGATIVE VALU2 ADD #4,R4 FORF4: ADD R0,R3 JSR PC,SAVARG MOV FORBUA,-(SP) ;STORE ASCII BUFFER ADD. MOV R3,-(SP) ;STORE FIELD SIZE BE. ADC R3 NEG R3 FORD12: MOV R3,DIVDNH ;STORE FOR DIVISION ;R2 IS CHARACTER COUNT BIC #700,R1 ;CLEAR BITS 7,6. CLIC #177700,R1 ;STORE POSITION OF DECIMAL MOV R1,-(SP) ;PT FOR F FORMAT CLR -(SP) ;CLEAR P SCALE. TST R0 ;TEST FOR E FORMOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWAPLOTTER. HOWEVER ; USER MUST STILL SET THE 'PLOTFL' FLAG TO ENABLE THE PLOTTER CODE ;DIS$1- IF DEFINED WILL ASSEMBLE CODE NERE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH EDED FOR ENABLING FIX CURSORS ;DIS$3- IF DEFINED WILL ASSEMBLE CODE NEEDED FOR IMPLIMENTING THE ; 'DBA' COMMAND ;DIS$4- IF DSYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DECEFINED WILL ASSEMBLE CODE NEEDED FOR IMPLIMENTING THE ; 'DEX' COMMAND .IFDF VRD$1 DIS$1=0 .ENDC .IFDF VRD$4 DIS$4=0 .ENDC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DI .IFDF DIS$4 DIS$1=0 ;'EXPAND CODE' NEEDS 'FIX CURSOR CODE' .ENDC ;GLOBAL SYMBOLS .GLOBL DIDLT,DITCNT .GLOBL SAVARGGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH I,RSTARG,DIVDNH,DIVR,MULT,DISPLY .GLOBL DIICMD,DIDCMD,DISET,DIVD,DIVDSH .GLOBL DIRCMD,DILCMD,DITCMD,DINCMD,DINIT,DINIT0 .GLOBLS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R DISOFX,DISOFY,DISSZX,DISTOP,DISBOT .GLOBL DISYBU,DISTYP,DISST,DISN,DIST,DISSC,DISR,DISDX .GLOBL DISYBS,DISDLT,DISCI,DISBUF,DI5=%5 SP=%6 PC=%7 ;TABLE OF OFFSETS FOR LPS OR AR11 ADCSR=0 ;A/D STATUS REG ADBUF=2 ;A/D BUFR CLCSR=4 ;CLOCK STATUS SDDN,LPSSAD .IFDF DIS$1 .GLOBL DISCU,DISCU1,DISCU2,DISXC1,DISXC2,DICCMD .ENDC .IFDF DIS$3 .GLOBL DISSTC,DISNC,DISTC,DISCUC,REG CLPRE=6 ;BUFR PRESET REG .IFDF LPS11$ DICSR=16 ;DISPLAY STATUS DISX=20 ;X-DAC DISY=22 ;Y-DAC .ENDC .IFDF AR11$ DISSCC,DIBCMD .ENDC .IFDF DIS$4 .GLOBL DISSTX,DISTX,DIXCMD .ENDC .IFDF LAB$5 .GLOBL DISXBU .ENDC .IFDF LAB$4 .GLOBL NEW DICSR=10 DISX=12 DISY=14 .ENDC ; ASSEMBLY PARAMETERS ;LAB$1- IF DEFINED AND .EQ.0 WILL CAUSE 'DISWRP' FLG TO BE ; SEDI .ENDC .IFDF LAB$3 .GLOBL NEWDN .ENDC .IFDF LAB$2 .GLOBL NEWDX .ENDC .IFDF LAB$1 .IFZ LAB$1 .GLOBL DISWRP .ENDC .ET WHENEVER WRAP-AROUND OCCURS. ; IF DEFINED AND .NE.0 WILL SET WRAP-AROUND VALUES TO SCOPE SIZE ;LAB$2- IF DEFINED WILL ALLOW NDC ;--- INIT ROUTINE --- ;AN I/O TABLE IS USED TO SETUP PARAMS FOR ;'DISET' & 'DISPLY' ;ADR OF I/D TBL TO BE INITED IS PASUSER TO CONTROL A SPECIAL FUNCTIONAL DX ;LAB$3- IF DEFINED WILL ALLOW USER TO CONTROL A SPECIAL FUNCTIONAL ; DATA TABLE DELTA.SED IN R0 ;CALL JSR PC,DINIT DINIT: .IFDF DIS$3 MOV DISST(R0),DISSTC(R0) ;SAVE ST, N,T,CU,SC MOV DISN(R0),DISNC(R0) ;LAB$4- IF DEFINED WILL ACTIVATE A SECONDARY USER CONTROLLED DISPLAY ; AFTER EACH PT IS DISPLAYED. ;LAB$5- IF DEFINED WILL AMOV DIST(R0),DISTC(R0) MOVB DISCU(R0),DISCUC(R0) MOVB DISSC(R0),DISSCC(R0) .ENDC .IFDF DIS$4 CLR DISTX(R0) ;SET FLG SSEMBLE CODE TO GRAPH XY-DATA AS WELL AS ; Y-DATA WHICH IS ALWAYS ACTIVE. ;LAB$6- IF DEFINED WILL ASSEMBLE CODE TO OPERATE XY-FOR 'OK' TO EXPAND .ENDC JSR PC,DISET ;CALL SETUP RTS PC ;---INIT0 ROUTINE--- ;CALL: MOV #PNTR,R0 ; JSR PC,DINIT0NDC ; IF XY-DATA, DETERMINE BASE XPTR .IFDF LAB$5 ;IF DF, ENABLE CODE FOR XY-DISPLY TST DISXBU(R1) ;XY OR Y DATA? IN LIST DITEMP: 0 MOV DISYBS(R1),R0 ;BASE ADR(Y) .IFDF LAB$5 ;IF DF, ENABLE CODE FOR XY-DISPLY MOV DISDX(R1),R5 ;BASE BEQ DT1 ;Y-DATA! ;XY-DATA DX=BASE DIXPTR. MOV DISST(R1),DISDX(R1) TST DISTYP(R1) BEQ DI2 ;BYTE DISPLY ASL DISDX(R1 ADR (X) IF XY-DATA .ENDC MOV DISDLT(R1),(PC)+ ;GET TBLDLT FROM I/D TBL DIDLT: 0 ;SETTING UP OF FLGS, CTRS, ETC. .IF) ;WORD DISPLY DI2: ADD DISXBU(R1),DISDX(R1) ;XPTR=XBUFR+(2^TYPE)*(ST) BR DI3 .ENDC ;Y-DATA DETERMINE DX & R ; SNGL PDF LAB$1 .IFZ LAB$1 ;IF DF & EQ, ENABLE WRAP FLG CLRB DISWRP(R1) ;CLR WRAP-AROUND FLG! .ENDC .ENDC MOV DISDDN(R1),( ;WHERE, PNTR:DSPLST ;PTR TO LIST OF I/D TBLS TO BE DISPLAYED ; UPDLST ; " " " " " " " " UPDATED ; WHENEVREC DIV: (SCOPE SIZES-OFFSETX VALUE)/T = Q1 + R1 ; DX=Q1 ; DBL PREC DIV: R1.0/T = Q2 + R2 ; FRACTURAL REMAINDER = Q2 DT1: ER A DISPLY-RELATED-CMD IS GIVEN DINIT0: MOV (R0)+,DILST MOV (R0),DIIDTB RTS PC ;--- SETUP ROUTINE --- ;THIS ROUTINE .IFNDF LAB$2 ;IF DF, USE SPECIAL DX MOV DISSZX(R1),R5 ;SCOPE SIZE X-DIRECTION FROM TBL SUB DISOFX(R1),R5 ;SCOPE SIZE-OFFIS USED BY 'DINIT' AND MANY OF ;THE DISPLAY CMDS. IT USES THE 'DISPLY PORTION' ;OF AN I/D TABLE, WHOSE ADR IS PASSED IN R0. X MOV DIST(R1),R2 ;DIVISOR=T MOV R2,R0 JSR PC,DIVR ;USES R5 & R0 MOV R0,DISDX(R1) ;DX MOV R5,DIVDNH ;DBL PREC DIV DISET: JSR PC,SAVARG ;SAVE R0-R5 MOV R0,R1 ;R1=ADR OF I/D TBL ;DETERMINE TABLE DELTA = N FOR BYTE DISPLY ; = IDEND H.O.WORD CLR R5 ; " " " L.O.WORD MOV R2,R0 ;DIVISOR=T (AGAIN) CLR DIVDSH JSR PC,DIVD MOV R0,DISR(R2*N FOR WORD DISPLY ; =4*N FOR DBL PREC DISPLY .IFNDF LAB$3 ;IF DF, USE SPECIAL TBL DLTA MOV DISN(R1),R3 ;TBLDLT=N 1) ;FRACTIONAL REMAINDER .ENDC ;DETERMINE BASE YPTR IN ANY CASE DI3: MOV DISST(R1),DISYBS(R1) TST DISTYP(R1) BEQ DI4 TST DISTYP(R1) BEQ DI ;BYTE DISPLY BPL DI0 ASL R3 ;DBL PREC DISPLY=4*N DI0: ASL R3 ;WORD DISPLY, TBLDLT=2*N DI: M ;BYTE DISPL BPL DII4 ASL DISYBS(R1) ;DBL PREC DISPLY DII4: ASL DISYBS(R1) ;WD DISPL DI4: ADD DISYBU(R1),DISYBS(R1) ;OV R3,DISDLT(R1) ;PUT TBL DLTA IN I/D TBL .ENDC ; SET UP DISPLY DONE CTR ; QUOT = [BUFSIZ - (ST+1)]/N ; IF QUOT+1 >= T,DYPTR = YBUFR + (2^TYPE)*ST JSR PC,RSTARG ;RESTORE R0-R5 RTS PC ;--- DISPLY ROUTINE --- ;THIS ROUTINE IS CALLED TO DISPLAONE CTR = T, ELSE DONE CTR = QUOT+1 MOV DIST(R1),DISDDN(R1) ;HOPEFULLY DNCTR=T! .IFNDF LAB$3 MOV DISN(R1),R0 ;DIVISOR Y (OR DO XY PLOTTING) ;XY-DATA OR Y-DATA. IT USES LIST OF I/O TABLES DISPLY: JSR PC,SAVARG ;SAVE R0-R5 MOV @#LPSSAD,R4 = N MOV DISBUF(R1),R5 SUB DISST(R1),R5 DEC R5 ;DIVIDEND = BUFSIZ - (ST+1) BPL DI0A CLR R0 BR DI0B DI0A: JSR PC,DI;GET LPS/AR11 STATUS REG ADDR MOV (PC)+,R0 ;R0=PTR TO LIST OF I/D TBLS DILST: 0 DILOOP: MOV (R0)+,R1 ;GET AN I/D TBL ADDR VR INC R0 ;QUOT+1 CMP DIST(R1),R0 ;T <= QUOT+1 ? BLOS DI1 ;YES DI0B: MOV R0,DISDDN(R1) ;NO, DNCTR=QUOT+1 DI1: .EFROM THE LIST BNE DI20 JSR PC,RSTARG ;LIST TERMINATED BY 0 = DONE RTS PC DI20: MOV R0,(PC)+ ;SAVE PTR TO CURRENT DILST ROUND FLAG ;TIME TO GET X-VAL FOR 'X-DAC' .IFDF LAB$5 ;IF DF, ENABLE CODE FOR XY-DISPLY TST DISXBU(R1) ;XY OR Y DATAINC: COMB DISWRP(R1) ;SET WARNING FLAG BEQ DINC .ENDC .ENDC ;TIME TO DO DISPLAY OR OUTPUT PT TO XY-PLOTTER DIOK: MOV? BEQ DI6 ;Y-DATA! MOV (R5),DISX(R4) ;XY-DATA LOAD X-DAC ADD DISOFX(R1),DISX(R4) ;ADD IN X-AXIS OFFSET BR DI7 .END R2,DISY(R4) ;LOAD Y-DAC & INTENSIFY .IFDF LAB$4 JSR PC,NEWDI ;ACTIVATE SECONDARY USER DISPLY .ENDC ;TIME TO DISPLAY C DI6: .IFDF LAB$2 ;IF DF, ENABLE SPECIAL DX JSR PC,NEWDX ;USER WRITTEN ROUTN .ENDC .IFNDF LAB$2 ;IF DF, ENABLE SPA CURSOR IF THEY ARE WANTED? .IFDF DIS$1 ;IF DF, ENABLE CURSOR CODE CMP #10000,DIHOLE ;DISPLY OF A CURSOR IS PENDING? ECIAL DX CODE MOV DISMDX,DISX(R4) ;LOAD X-DAC ADD DISR(R1),DISMFR ;ADD DELTA X FRACTION ADC DISMDX ;ADD IN C BIT ADD BEQ DI11 ;NO! CMP #1,DITCNT ;LAST DATA PT IS BEING DISPLYED? BEQ DIAA ;YES! DISPLY CURSOR IMMEDIATELY! CMP DIHOLE,DI DISDX(R1),DISMDX ;ADD DELTA X TO X .ENDC ;TIME TO GET Y-VAL FOR 'Y-DAC' DI7: CLR -(SP) ;HI ORD DUMMY=0 IF WD TST DISTSX(R4) ;NO, TIME TO DISPLY WITHIN DATA? BHI DI11 ;NO DIAA: .IFDF LPS11$ BIC #170000,R2 ;CURSORS RELATE ONLY TO 12 BITYP(R1) BNE DIIII7 MOVB (R0),R2 ;BYTE DISPLY :R2=Y-VAL BR DII7 DIIII7: BPL DIII7 ;WD. DISPLY ADD #2,R0 ADD (R0),(S DATA BIS #2,DICSR(R4) ;SET FAST INTENSITY BIT MOV #3,R3 CLR (SP) DI14: ADD #20,(SP) ADD (SP),R2 CMP #7777,R2 ;CHK PC)+ ;DNCTR DITCNT: 0 ;REMAINING PTS YET TO BE DISPLAYED BGT DI21 JMP DII5 ;DNCTR IS <= 0,HENCE NO PTS TO DISPLY DI21P) ;HI ORD. DATUM SUB #2,R0 ;RETN. PTR TO LOAD DAT DIII7: MOV (R0),R2 ;R2=Y-VAL DII7: MOVB DISSC(R1),R3 ;ISOLATE SCA F: .IFDF DIS$1 ;IF DF, ENABLE CURSOR CODE MOV #10000,(PC)+ ;INITIALY SET TO NON-DISPLY VAL DIHOLE: 0 ;CURRENT CURSOR VAC POWER BEQ DI8 ;NO SCALING BPL DI9 DI10: CLC ROR (SP) ;SCALE RIGHT ROR R2 INC R3 BNE DI10 BR DI8 DI9: TST ALUE (0-4095) TSTB DISCU(R1) ;C-BYTE=0? BEQ DI5 ;YES, FORGET CURSORS CLR (PC)+ ;NO, IMPLEMENT CURSORS DICCNT: 0 ;(SP) ;H.O. WD ALREADY SET? BEQ DII9 ;NO INC DIWRFL ;YES, THUS WRAP AROUND SO SOON DII9: ASL R2 ;SCALE LEFT ROL (S1ST CUR=0, =1 FOR 2ND CUR MOV DISCU1(R1),DIHOLE ;DIHOLE=XCUR1 .ENDC DI5: MOV DISCI(R1),DICSR(R4) ;SET 'CSR' TO USER SPECS P) DEC R3 BNE DII9 DI8: ADD DISOFY(R1),R2 ;ADD IN OFFY ;DO SOMETHING ABOUT WRAP-AROUND .IFDF LAB$1 ;IF DF, ENABLE BIS #10,DICSR(R4) ;ALSO SET TO DISPLY ON Y-DAC LOAD .IFNDF LAB$2 ;IF DF, ENABLE SPECIAL DX MOV DISOFX(R1),(PC)+ ;STARTIN WRAP-AROUND CODE BCS DINC ;ADDING IN OFFSET CAUSED WRAP TST DIWRFL ;WRAP FOUND EARLIER? BNE DINC ;YES TST (SP) G X-POS ON SCOPE DISMDX: 0 ;Y-DATA DISPL-HOLDS CURRENT X-VAL CLR (PC)+ DISMFR: 0 ;HOLDS FR. SUM OF REMAINDER .ENDC ;TEST H.O.WORD NOW BNE DINC ;WRAP FOUND NOW CMP R2,DISTOP(R1) ;USE TBL VALUES TO TEST FOR WRAP BHI DINC CMP DISBOT(RDI55: TSTB DICSR(R4) ;OK TO DISPLAY NXT PT? BPL DI55 ;NO CLR (PC)+ ;KEEP TEMP WRAP-AROUND FLG CLR DIWRFL: 0 ;WRAP-A1),R2 BLOS DIOK ;NO WRAP-AROUND .IFNZ LAB$1 MOV DISBOT(R1),R2 BR DIOK DINC: MOV DISTOP(R1),R2 .ENDC .IFZ LAB$1 D INTENSIFY DI1A4: TSTB DICSR(R4) BPL DI1A4 DI12: ADD #4,(SP) SUB (SP),R2 BMI DI13 MOV R2,DISY(R4) DI13: DEC R3 BNE ELIMINATE CURSORS, 377=ACTIVATE CURSORS .IFDF DIS$1 DICCMD: JSR PC,SAVARG MOV DIIDTB,R1 ;GET LST OF I/D TBLS DIC2: MOV DI14 .ENDC ;PUT TCNT IN XC1 OR XC2 & UPDATE CHOLE TST DICCNT ;1ST CURSORS DISPLAYED? BNE DI15 ;NO, THE 2ND MOV DI(R1)+,R0 ;GET TBL BEQ DIC1 ;NO MORE TBLS COMB DISCU(R0) BR DIC2 DIC1: JSR PC,RSTARG RTS PC .ENDC ;--- 'DBA' CMDTCNT,DISXC1(R1) ;SET XC1 IN THE I/O TBL INC DICCNT ;SET FLG FOR 2ND CUR MOV DISCU2(R1),DIHOLE ;DIHOLE=XCUR2 BR DI11 DI1 --- ;RE-INITIALIZE THE DISPLAY AS IT ORIGINALLY WAS IN THE BEGINNING .IFDF DIS$3 DIBCMD: JSR PC,SAVARG MOV DIIDTB,R1 D5: MOV DITCNT,DISXC2(R1) ;SET XC2 IN THE I/O TBL MOV #10000,DIHOLE ;SET TO NON-DISPLY VAL .ENDC DI11: TST (SP)+ ;MOV STAIB2: MOV (R1)+,R0 BEQ DIB1 MOV DISSTC(R0),DISST(R0) ;RESET ST,N,T,CU,SC MOV DISNC(R0),DISN(R0) ;BACK TO ORIGINALS MOV DICK PTR BK--SEE'DI7' ;MAYBE ONE IS USING THE XY-PLOTTER .IFDF LAB$6 ;IF DF,ENABLE XY-PLOTTER CODE TST (PC)+ PLOTFL: 0 STC(R0),DIST(R0) MOVB DISCUC(R0),DISCU(R0) MOVB DISSCC(R0),DISSC(R0) .IFDF DIS$4 CLR DISTX(R0) ;SET FLG FOR OK TO EXPAN ;NO XY PLOT = 0; YES = 1 BEQ DI16 ;XY-PLOTTER NOT IN USE MOV #1401,ADCSR(R4) ;SET UP TO READ POT#4 DI11A: TSTB ADCSR(RD .ENDC JSR PC,DISET BR DIB2 DIB1: JSR PC,RSTARG RTS PC .ENDC ;--- 'DEX' CMD --- ;IF C-BYTE = 377 & T(EXPAND)=0 T4) BPL DI11A MOV ADBUF(R4),(PC)+ ;GET POT VALUE CLCNT: 0 ;VALUE SET BY USER TO BE USED AS ;-BUF PREVAL FOR WAIT LOOHEN OK TO EXPAND BETWN CURSURS ; FOR DISPLY POINTED TO BY 'TBLADR' ;IF C-BYTE=377 & T(EXPAND)=1 THEN OK TO RESTORE ;IF CP OF XY-PLOTTER BNE DI11B ;IT IS ZERO? INC CLCNT ;YES, THEN SET IT =1 DI11B: NEG CLCNT MOV CLCNT,CLPRE(R4) ;SET CLK -BYTE=0, IGNORE THIS CMD. .IFDF DIS$4 DIXCMD: JSR PC,SAVARG ;SAV R0-R5 MOV DIIDTB,R2 ;GET TBL LST DIX4: MOV (R2)+,R1 BUF PRESET REG MOV #11,CLCSR(R4) ;ENABLE CLOCK AT 1HZ RATE DI17: TSTB CLCSR(R4) ;WAIT FOR CLK DONE BPL DI17 .ENDC ;;GET TBL BEQ DIX2 ;NO MORE TBLS TSTB DISCU(R1) BEQ DIX2 ;IGNORE CMD, CURSORS AREN'T UP TST DISTX(R1) ;EXPAND OR RESFOR VERTICAL WRAPAROUND BMI DI12 MOV R2,DISY(R4) ;LOAD Y-DAC & INTENSIFY DI12: ADD #20,(SP) SUB (SP),R2 BMI DI13 ;CHUPDATE R0, THE RELATIVE DATA BASE PTR BY DIDLT DI16: .IFDF LAB$3 ;IF DF, ENABLE SPECIAL TBL DLTA JSR PC,NEWDN ;ROUTINEK FOR VERTICAL WRAPAROUND MOV R2,DISY(R4) ;LOAD Y-DAC & INTENSIFY DI13: DEC R3 ;CURSUR FULLY DISP? BNE DI14 ;NO BIC SETS DIDLT EACH TIME .ENDC ADD DIDLT,R0 .IFDF LAB$5 ;IF DF,ENABLE XY-DATA CODE ADD DIDLT,R5 .ENDC ;TEST IF CURR#2,DICSR(R4) ;CLR FAST INTENSITY BIT .ENDC .IFDF AR11$ BIC #176000,R2 ;CURSORS RELATE ONLY TO 10 BIT DATA MOV #3,R3 ENT DISPLY OR PLOT IS DONE. DEC DITCNT ;DONE? BEQ DII5 JMP DI55 ;NO ;GET READY FOR NEXT DISPLAY IN LIST DII5: MOV CLR (SP) DI14: TSTB DICSR(R4) BPL DI14 ADD #4,(SP) ADD (SP),R2 CMP #1777,R2 BMI DI12 MOV R2,DISY(R4) ;LOAD Y-DAC &DITEMP,R0 ;GET PTR TO CURRENT TBLADR IN LIST JMP DILOOP ;--- 'DCU' CMD --- ;THIS CMD COMPLIMENTS BYTE 2 OF S/C (COPY) ;0=R1),R0 ;T-XC1=R0 MOV DISN(R1),R5 ;N=R5 JSR PC,MULT ;RTNS WITH PRODUCT IN R5 ADD R5,DISST(R1) ;ST=ST+(T-XC1)*N MOV D BEQ DIL1 DECB DISSC(R0) ;SCAFAC=SCAFAC-1 JSR PC,DISET BR DIL2 DIL1: JSR PC,RSTARG RTS PC ;---'DPO #' CMD ;CHANGEISXC1(R1),DIST(R1) SUB DISXC2(R1),DIST(R1) INC DIST(R1) ;T=(XC1-XC2)+1 DIX3: MOV R1,R0 ;DISET NEED TBLADR IN R0 JSR PC THE TOTAL #PTS, T TO # ;CALL JSR PC,DITCMD ; R0=#PTS DITCMD: JSR PC,SAVARG MOV R0,R3 ;GET #PTS & SAV IN R3 BLE DIT1 ,DISET ;CALL 'DISET' BR DIX4 DIX2: JSR PC,RSTARG ;RESTORE R1 RTS PC DIX1: MOV DISSTX(R1),DISST(R1) ;RESTORE! ST & T MO ;NEED AT LEAST ONE PT TO DISPLY MOV DIIDTB,R1 ;GET TBL LST DIT2: MOV (R1)+,R0 ;GET TBL BEQ DIT1 MOV R3,DIST(R0) ;T=#V DISTX(R1),DIST(R1) CLR DISTX(R1) ;USED AS A FLG TOO BR DIX3 .ENDC ;---'DIN' CMD--- ;DOUBLE THE TOTAL #PTS DISPLAYED JSR PC,DISET BR DIT2 DIT1: JSR PC,RSTARG RTS PC ;---'DTA #' CMD--- ;CHANGE THE TABLE DELTA, N TO # ;CALL JSR PC,DIN & HALF THE TBL DLTA DIICMD: JSR PC,SAVARG MOV DIIDTB,R1 ;GET TBL LST DII2: MOV (R1)+,R0 ;GET TBL BEQ DII1 ;NO MORE CMD ; R0=TBLDLTA DINCMD: JSR PC,SAVARG MOV R0,R3 ;GET TBLDLTA & SAV IN R3 BLE DIN1 ;TBLDLT MUST BE > 0 MOV DIIDTB,TBLS MOV DISN(R0),R5 ;TBLDLT ASR R5 ;HALF TBLDLT BEQ DII2 ;TBLDLT MUST BE > 0 ASR DISN(R0) ;IT IS ASL DIST(R0) R1 ;GET TBL LST DIN2: MOV (R1)+,R0 ;GET TBL BEQ DIN1 MOV R3,DISN(R0) ;N=# JSR PC,DISET BR DIN2 DIN1: JSR PC,RSTARG ;DBL TOTAL PTS JSR PC,DISET BR DII2 DII1: JSR PC,RSTARG RTS PC ;---'DDE' CMD--- ;HALF THE TOTAL #PTS DISPLAYED & DBL RTS PC .END THE TBL DLTA DIDCMD: JSR PC,SAVARG MOV DIIDTB,R1 ;GET TBL LST DID2: MOV (R1)+,R0 ;GET TBL BEQ DID1 ;NO MORE TBLS MOV DIST(R0),R5 ;GET TOTAL PTS ASR R5 ;HALF THE TOTAL PTS BEQ DID2 ;NEED AT LEAST 1 PT TO DISPLY ASR DIST(R0) ASL DI.TITLE SPINIT ;LAB APPLICATION-11 ELIMINATE AND INITIALIZATION ;DEC-11-SLABA-C-LA24 ;FILE SPINIT.MAC ;FILE ID SPINIT.1 .CSESN(R0) JSR PC,DISET BR DID2 DID1: JSR PC,RSTARG RTS PC ;---'DRA' CMD--- ;RAISE (SCALE UP) DATA BY 2 DIRCMD: JSR PCCT SPINIT ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LIC,SAVARG MOV DIIDTB,R1 ;GET TBL LST DIR2: MOV (R1)+,R0 ;GET TBL BEQ DIR1 ;NO MORE TBLS INCB DISSC(R0) ;SCAFAC=SCAFAC+ENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS 1 JSR PC,DISET BR DIR2 DIR1: JSR PC,RSTARG RTS PC ;---'DLO' CMD--- ;LOWER (SCALE DOWN) DATA BY 2 DILCMD: JSR PC,SASOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ONTORE? BNE DIX1 MOV DISST(R1),DISSTX(R1) ;EXPAND! SAVE ST MOV DIST(R1),DISTX(R1) ;AND T MOV DIST(R1),R0 ;T SUB DISXC1(VARG MOV (PC)+,R1 ;CONTAINS PTR TO LIST OF I/D TBLS,TO BE DIIDTB: 0 ;UPDATED BY CMDS;SET BY 'DINIT0' DIL2: MOV (R1)+,R0 INSTRUCTIN TRAP VECTOR ;4. INITIALIZES THE DISPLAY ;5. TESTS FOR GT-40 OR GT-44 IF A GRAPHIC ; DISPLAY IS USED AND SETSM+2 .IFDF RT11$ MOV #1350,SCRBUF+2 ;GT40 SCOPE SIZE FOR SCROLER .ENDC DESG2: .IFDF RT11$ .REMOV #DESGD ;VTMAC CALL ' THE DISPLAY SIZE PARAMETERS ;6. SET PAPER TAPE VECOTRS AND CONTROL CHARACTERS ;7. STORE THE FPMP ERROR JUMP ADDRESS ;8. SREMOV BUFFER FROM LIST' .START ;START GT40 .SCROL #SCRBUF ;SET THE SCOPE SIZE .ENDC .ENDC ;STORE FPMP ERROR ADDRES SUCH SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN AVES THE RT-11 VECTORS FOR RT-11 SYSTEM ;9. SET DATA ANALYSIS FREE CORE BOTTOM, AND TOP AND ; DOES AN RT-11 SETTOP. ;10. IN DEC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENTSETS VECTORS IF THE PAPER TAPE TTY MODULE IS ; BEING USED UNDER RT-11 SYSTEMS. ;11. JUMP TO START THE DATA ANALYSIS ROUTINE BY DIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT W ; IN RT-11 & CAPS11 THE LINKER SETS THE STACK ; AT THE LOAD POINT DEEND: MOV DESTR3,DESTAK ;GET STACK FOR RT-11 OR CAHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;VR14$ ;VR14 CODEPS11 DESTR1: MOV #DEHARE,@#4 CLR @#6 .IFDF VR14$ MOV #DEGTPT,R0 JSR PC,DINIT0 .ENDC .IFDF GT40$ .IFDF RT11$ .LN IF DEFINED ;GT40$ ;GT40 CODE IF DEFINED ;RT11$ ;DEFINE = RT11 SYSTEM ;CAPS$ ;DEFINED = CAPS11 SYSTEM ;DATA EDITOKRT ;VTMAC CALL 'IF R0<0 ON RTN,ERROR TST R0 ;IF R0>=0 ON RTN, THEN OK BPL DESG0 JMP @#DEHARE ;VT11 HARDWARE PROBLEM R ELIMINATE COMMAND AND PROGRAM INITIALIZATION .GLOBL DE0,DETOP,DEEND,TYPMS .GLOBL $ERVEC,DEERFP,DESTAK,DEHARE .IFDF GT40$.ENDC DESG0: MOV #DEGTPT,R0 JSR PC,GINIT0 ;SET DISPLAY TABLES .IFDF CAPS$ MOV GT40SA,R1 MOV GT40VC,R0 MOV #DEGTIN,(R0 .GLOBL DEDYSZ,DENORM,DEOFY,DEOFYD,GINIT0,DEGTPT .IFDF CAPS$ .GLOBL GT40VC,DEGTIN,DERSTR .ENDC .GLOBL GT40SA .ENDC )+ MOV #200,(R0) MOV #DESGD,(R1)+ ;TEST FOR GT40 OR GT44 ;BY MOVING A POINT OFF SCREEN .ENDC .IFDF RT11$ .INSRT .IFDF VR14$ .GLOBL DINIT0,DEGTPT .ENDC .IFDF CAPS$ .GLOBL DERSTR .ENDC .IFDF RT11$ .GLOBL DEBOT .ENDC R0=%#DESGD ;VTMAC CALL MOV GT40SA,R1 MOV R1,R2 TST (R1)+ ;R1=ADDR OF GT40 STATUS REG .ENDC DESG1: .IFDF RT11$ CMP (R20 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;SYSTEM INITIALIZATION CODE ;FOR THE DATA EDITOR ;THE PROGRAM INI),#DESGYS ;THE POINT WAS DISPLAYED YET? BNE DESG1 ;NO .ENDC TST (R1) ;CHK GT40 STATUS REG BPL DESG1 BIT #40,(R1) ;TETIALIZATION ROUTINE DOES THE FOLLOWING ;1. SETS THE STACK POINTER, STORES THE TOP OF THE ; STACK IN DESTAK AND SET THE TTYST FOR EDGE VIOLATION BNE DESG1A .IFDF RT11$ MOV #1750,SCRBUF+2 ;GT44 SCOPE SIZE FOR SCROLLER .ENDC BR DESG2 DESG1A: ON INTERRUPTS ;2. DETERMINES THE AMOUNT OF CORE IN THE MACHINE ; FOR A NON RT-11 MACHINE ;3. PUTS A HALT AT THE ILLEGALMOV DESGYS,DEDYSZ ;YES, SET VALUES FOR THE GT40. MOV DESGYO,DEOFYD MOV DESGYO,DEOFY MOV DESGNO,DENORM MOV DESGNO+2,DENORD BY THE 1ST FREE LOC OF CORE ;DISPLAY TO MOVE A POINT OFF OF THE GT40 .IFDF GT40$ DESGD: 114000,0,1350,0,1750 ;POINT MODDEEOL ;--- BDE B1 B2 OPTION --- ;THE DERIVATIVE OF THE ENTIRE DATA OF B1 IS TAKEN AND STORED IN B2. ;B2 DEFAULTS TO B1 IF NOE 173000 ;STOP DESGYS: 1377 DESGYO: 600 DESGNO: 42277,100000 ;.FLT2 383 .ENDC SCRBUF: .BYTE 0,0 0 .END T SPECIFIED. ;IF OPTION=E, THE EMPIRICAL 5PT DERIVATIVE METHOD IS USED. ;IF OPTION=L, THE 5PT QUADRATIC - LEAST-SQ-DEREVATIVE .TITLE SPOV3 ;LAB APPLICATIONS-11 DERIVATIVE COMMAND ;DEC-11-SLABA-C-LA17 ;FILE ID SPOV3.1 ;FILE: SPOV3.MAC .CSECT SPOV3 IS USED. ;DEFAULT=L DEDE: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTANTS .BYTE 4,0 JSR PC,@#DEOPBU ;CHK OPTIONAL BUFS B1,B2 ; ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USEGET OPTION JSR R5,QA 20000+400+20 ;NULL ANS OK +SILENT QUEST +ALPHAN CMD DEDEAD ;CMD LIST ADDR TSTB @#QADATF BNE DE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, ORDE0 CLR R0 ;NO DATA--USE DEFAULT BR DEDE1 DEDE0: TST R0 BPL DEDE1 JMP DEDEE2 ;FMT ERR (BAD OPTION) DEDE1: MOV R0,R4 S MOV #DEERFP,$ERVEC ;SET TOP OF CORE AVAILABLE .IFDF RT11$ BIS #20100,@#44 ;SET JOB STATUS TO BE RESTARTED ;& P ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEMROMPT RTN FROM MONITR ON TTYINR (F/B) MOV @#54,R0 ;GET BOTTOM OF RT-11 ;USR IS NOT RESIDENT TST -(R0) ;SUBTRACT 2 M AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;OV DESTR3+2,DEBOT ;SET BOTTOM ADDRESS FOR DAEDITOR .MCALL .SETTOP .SETTOP ;DO RT-11 TOP OF CORE EMT MOV R0,DETOP ;SET TOTHE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL P ADDRESS FOR DAEDITOR .ENDC .IFDF CAPS$ IOT .BYTE 1,0 ;RESET 0 IOT .BYTE 2,0 ;RESTART DERSTR MOV @#42,DETEQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT OP ;'HIFREE' LOCATION .ENDC MOV DESTAK,SP ;RESET THE STACK MOV #DEVERM,R0 ;PRINT VERSION # JSR PC,TYPMS JMP DE0 DEVERSUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;VR14$ ;ASSEMBLE CODE FOR VR14 ;M: .BYTE 15,12 .ASCII /SPARTA V/ .IFNDF SPNDI$ .IFDF GT40$ .ASCII /G/ .ENDC .IFDF VR14$ .ASCII /V/ .ENDC .ENDCGT40$ ;ASSEMBLE CODE FOR GT40 ;DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .IFDF SPBDE$ .I .IFDF SPNDI$ .ASCII /N/ .ENDC .IFDF LPS11$ .ASCII /L/ .ENDC .IFDF AR11$ .ASCII /A/ .ENDC .IFNDF LPS11$ & ARFDF CAPS$ .GLOBL DEOPBU,DEFLCK,DEEOL .ENDC .GLOBL DEDE,DECMD,DEDATA,SAVARG,RSTARG,DEGET,DEPUT,DETLE .GLOBL $POLSH,$NGR,$SBR11$ .ASCII /N/ .ENDC .ASCII /3-00/ .BYTE 0 .EVEN DESTR3: .LIMIT ;GENERATE THE STACK AT THE LOAD POINT ;FOLLOWE,$MLR,$ADR,$DVR,DEFORE,QA,QADATF,DECMD1 ;ROUTINES CALLED: SAVARG,RSTARG,DEGET,DEPUT,$POLSH,DEFORE,DEOPBU ; QA,DEFLCK,DETLE, ;'EMPIRICAL DERIVATIVE' DEDERV: JMP DEDELS ;'LEAST SQUARES DERIVATIVE' DEDEBK: MOV (SP)+,@#DECMD1 ;RTN HERE WHEN DERIV IENDPT' CLR @#DECMD1+12 BR DEDE5 DEDE6: MOV #2,R3 ;CTR STORING LAST 2 PTS IN B2 DEDE6A: ADD #4,R2 ;MOV PTR PAST EMPTY RS DONE MOV (SP)+,@#DECMD1+2 ;SAVE DEREVATIVE TILL I RESTOR REGS JSR PC,@#RSTARG ;RESTORE R0-R1 CMP #4,R0 ;WE ARE JUST SING BUF SLOT JSR PC,DEDE7 ;E.O. RING BUF CHK MOV 2(R2),-(SP) ;MOV VAL IN RING BUF INTO B2 MOV (R2),-(SP) INC R0 JSR TARTING? BNE DEDE3 ;NO ; CALC THE BEGINNING 2 END PTS JSR PC,DECALA ;CALC A FOR 'A*X+B' MOV #140400,@#DECMD1+10 ;-R5,@#DEPUT DECMD+2 DEC R3 ;BOTH ENDPTS IN B2 YET? BNE DEDE6A ;NO JSR PC,@#DEFLCK RTS PC ;CHECK IF E.O. RING BUF2 TO BE USED BY 'DENDPT' CLR @#DECMD1+12 JSR PC,DENDPT ;CALC 'A*(-2)+B' MOV #140200,@#DECMD1+10 ;-1 TO BE USED BY 'DENDPTFER - IF SO, RESET R2=TOP OF RING BUFFER. DEDE7: CMP R2,@#DECMD+4 BLOS DEDE8 MOV R5,R2 ;RESET R2 (R5 HOLD ACTUAL LOC OF' CLR @#DECMD1+12 JSR PC,DENDPT ;CALC 'A*(-1)+B' DEDE3: SUB #4,R0 ;SET INDEX FOR 'DEPUT' MOV @#DECMD1,(R2)+ ;PUT CURR 'DERING') DEDE8: RTS PC DERING: 0,0,0,0,0,0 ;3WD F.P. RING BUFR ;ERRORS DEDEE1: MOV #24.,R0 ;BUFRSIZE TOO SMALL TO ENT DERIVATIVE IN OPEN MOV @#DECMD1+2,(R2)+ ;RING BUFFER SLOT. JSR PC,DEDE7 ;E.O. RING BUF? CHECK IT OUT DEC R1 ;DEC DNDIFFERTIATE BR DEDEEE DEDEE2: MOV #15.,R0 ;ILLEG OPTION DEDEEE: TST (SP)+ ;GET NORMAL RTN OFF STACK JMP @#DEFORE ;COM CTR BEQ DEDE4 ;WE ARE DONE! MOV 2(R2),-(SP) ;PUT NXT DERIV TO BE SAVED AWAY MOV (R2),-(SP) ;ONTO STACK-R2 IS SET TO FMAND LIST USED BY 'QA' TO FIND 'OPTION' DEDEAD: .BYTE 3,1 .BYTE 'L ;5 PT LEAST SQ METHOD .BYTE 'E ;5 PT EMPIRICAL METHOD ILL EMPTY SLOT. JSR R5,@#DEPUT ;PUT IT INTO B2 DECMD+2 ADD #5,R0 ;SET INDEX FOR NXT Y (I+2) VALUE BR DEDE2 ; CALC .BYTE 0 .EVEN ;EMPIRICAL 5PT DERIVATIVE :Y(I)=(Y(I+2)-Y(I-2))/4 DEDEEM: CLR -(SP) MOV #37600,-(SP) ;PUT FL. PT. 1/4 ON ;R4= (OPTION 0=L, 1=E) JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES MOV @#DEDATA,R1 SUB #5,R1 ;R1=DATASIZE -5 BPL FINAL 2 ENDPTS DEDE4: ADD #4,R0 ;INDEX SET TO LAST Y(I+2) JUST USED JSR PC,DECALA ;CALC A FOR 'AX+B' SUB #4,R0 ;RTN DEDE1A JMP DEDEE1 ;DATASIZE MUST BE > 4 PTS (ERR) DEDE1A: INC R1 ;R1=DATASIZE -4 (DONE CTR) MOV #4,R0 ;R0=INDEX PTR FINDEX TO WHAT IT WAS MOV 2(R2),-(SP) ;OK TO PUT RING BUF VAL MOV (R2),-(SP) ;(JUST SKPPED ABOVE) INTO B2 JSR R5,@#DEPUT OR 'DEGET & DEPUT' ;BECAUSE THIS ROUTINE MAY MOVE IN CORE, THE ACTUAL LOCATION OF ;'DERING' MUST BE CHECKED DEDEX: MOV PC,R2 DECMD+2 MOV #2,R3 ;CTR FOR CALC THE 2 ENDPTS MOV #40200,@#DECMD1+10 ;1 TO BE USED BY 'DENDPT' CLR @#DECMD1+12 DEDE5: TST -(R2) ADD #DERING-DEDEX,R2 MOV R2,R5 ;USE R5 TO SAV ACTUAL LOC OF 'DERING' MOV R5,@#DECMD+4 ADD #12,@#DECMD+4 ;JSR PC,DENDPT ;CALC A(1)+B JSR PC,DEDE7 ;E.O.RING BUF CHK MOV 2(R2),-(SP) ;PUT NXT VAL IN RING BUF MOV (R2),-(SP) INCHOLDS ACTUAL LOC OF 'DERING+2' ;TIME TO TAKE DERIVATIVE DEDE2: JSR PC,@#SAVARG ;SAVE R0-R5 TST R4 BEQ DEDERV JMP DEDEEM R0 JSR R5,@#DEPUT DECMD+2 DEC R3 ;BOTH ENDPTS CALC? BEQ DEDE6 ;YES MOV #40400,@#DECMD1+10 ;NO 2 TO BE USED BY 'D+2)-Y(I-2))/5+(Y(I+1)-Y(I-1))/10 DEDELS: MOV #146315,-(SP) MOV #37514,-(SP) ;PUT 1/5 ON STACK JSR R5,@#DEGET DECMD ET 'A' MOV @#DECMD1+4,-(SP) JSR R4,@#$POLSH $MLR DESUB2 ;PUTS 'B' ON STACK $ADR,.+2 MOV (SP)+,@#DECMD1+10 ;SAV EN;PUT Y (I+2) FROM B1 ONTO STACK SUB #4,R0 JSR R5,@#DEGET DECMD ;PUT Y(I-2) FROM B1 ONTO STACK TST (SP) ;ATTEMPT TO DPT VAL MOV (SP)+,@#DECMD1+12 JSR PC,@#RSTARG MOV @#DECMD1+10,(R2)+ MOV @#DECMD1+12,(R2)+ ;PUT ENDPT IN RING BUF RTS P'NEG' Y(I-2) BEQ DEDE10 ;BR IF 0 TO AVOID -0 ADD #100000,(SP) ;-Y(I-2) IS NOW ON STACK DEDE10: CLR -(SP) MOV #40000,-(C DESUB2: MOV @#DECMD1+2,-(SP) MOV @#DECMD1,-(SP) ;'B' JMP @(R4)+ .ENDC ;---INTEGRATE COMMAND--- .IFDF SPBIN$ EXISP) ;PUT 1/2 ON STACK ADD #3,R0 JSR R5,@#DEGET DECMD ;PUT Y(I+1) FROM B1 ONTO STACK SUB #2,R0 JSR R5,@#DEGET DECT=0 CRLFC0=3 TEXT=7 .IFDF CAPS$ .GLOBL DEFXCU,DEOPBU,DEFLCK,DEEOL .GLOBL DESTRP,DEFMCK,DEFMK0,DEFMK1 .IFNDF SPNDI$ .GMD ;PUT Y(I-1) FROM B1 ONTO STACK JSR R4,@#$POLSH $SBR,$MLR,$ADR,$ADR,$MLR,.+2 JMP DEDEBK ; THIS ROUTINE CALCULATES LOBL DEPVOT,DEFRCU .ENDC .ENDC .GLOBL DEIN,DECMD,DEDID,DEDATA,DETLE .GLOBL DEPUT,FORMAT,$POLSH,QA .GLOBL $ADR,$MLR,$DVR,D'A', ; WHERE A=(2(Y(I-2)+Y(I+2))-(Y(I-1)+Y(I+1))-2(Y(I)))/7 ; THIS 'A' IS USED TO CALC THE DERIV FOR THE ENDPTS DECALA: JSEFORE .GLOBL QADATF,DECMD1 ;ROUTINES CALLED: DEFRCU,DEPVOT,DEFXCU,DESTRP,DEPUT,QA ; FORMAT,$POLSH,DEFMCK,DEFLCK,DEFORR PC,@#SAVARG DEC R0 JSR R5,@#DEGET ;GET Y(I+1) DECMD ADD #177776,R0 JSR R5,@#DEGET ;GET Y(I-1) DECMD CLR -(SP) E,DETLE ; DEEOL,DEOPBU ;---BIN B1 B2 OPTION--- ;OPTION A- CALC ABS INTEGRAL OF B1 BETWN FIX CURSORS(IF UP) AND ; SU ;F.P. 2 MOV #40400,-(SP) INC R0 JSR R5,@#DEGET ;GET Y(I) DECMD ADD #177776,R0 JSR R5,@#DEGET ;GET Y(I-2) DECMDBTR BASELINE DETERMINED BY FREE CURSORS(IF UP). ;OPTION R- STORE RUNNING INTEGRAL OF B1 IN B2 AND SUBTR A BASELINE ; DETER ADD #4,R0 JSR R5,@#DEGET ;GET Y(I+2) DECMD JSR R4,@#$POLSH $ADR,$SBR,$NGR,$MLR,$SBR,$NGR,$SBR,$NGR DESUB1 ;ROUTMINED BY FREE CURSORS(IF UP) IGNORE FIX CURSORS. ;BOTH OPTIONS PRINT OUT FINAL ABSOLUTE INTEGRAL ON TTY ;METHOD OF INTEGRAINE PUTS F.P. 7 ON STACK $DVR,.+2 MOV (SP)+,@#DECMD1+4 ;SAV 'A' AWAY MOV (SP)+,@#DECMD1+6 JSR PC,@#RSTARG RTS PC DETION IS SIMPSON'S RULE ;DEFAULT OPTION IS (A) DEIN: JSR R5,DEEOL ;CHK EXCESS BUFR/CONSTANTS .BYTE 4,0 JSR PC,@#DEOPBU ;CSUB1: CLR -(SP) MOV #40740,-(SP) ;F.P. 7 JMP @(R4)+ ; ENDPT CALC ROUTINE ; ENDPT=A*X+B WHERE X IS PASSED VIA 'DECMD1+10HK OPTIONAL BUFRS B1,B2 JSR R5,QA 20000+400+20 ;NULL ANS OK+SILENT QUEST + ALPHAN CMD DEINAD ;CMD LIST ADDR TSTB @#QATO STACK JSR R5,@#DEGET DECMD ;PUT Y(I+2) FROM B1 ONTO STACK SUB #4,R0 JSR R5,@#DEGET DECMD ;PUT Y(I-2) FROM B1 &12' AND A IS PASSED ; VIA 'DECMD1+4&6 AND B IS IN 'DECMD1+0&2. ; B IS THE LAST DERIV JUST CALCULATED ; THIS ROUTINE PUTS ENDONTO STACK JSR R4,@#$POLSH $SBR,$MLR,.+2 JMP DEDEBK ;GO BACK ;QUADRATIC 5-PT LEAST-SQUARES-FIT DERIVATIVE ;Y(I)=(Y(IPT VALUE IN RING BUF DENDPT: JSR PC,@#SAVARG MOV @#DECMD1+12,-(SP) ;GET X MOV @#DECMD1+10,-(SP) MOV @#DECMD1+6,-(SP) ;G1+14 ;SAV R0 & R2 MOV R2,@#DECMD1+16 JSR R4,@#$POLSH $ADR,$MLR,.+2 MOV @#DECMD1+16,R2 ;RESTOR R0 & R2 MOV @#DECMD1+1MOV 2(R2),DEFMK0+2 ;SAV FINAL ABS INTEGRAL AWAY BR DEIN13 DERNGG: 0,0,0,0 DEINCK: CMP R2,@#DECMD1+22 BLOS DEINC MOVDATF BNE DEIN0 CLR R0 ;NO DATA--DEFAULT OPTION BR DEIN2 DEIN0: TST R0 BPL DEIN2 JMP DEINE1 ; (BAD OPTION) DEIN2: M4,R0 MOV (SP)+,(R2)+ MOV (SP)+,(R2)+ ;PUT 2ND PT IN RING BUF JSR PC,DEINCK ;E.O.RING BUF CHK ;REMAINING PTS FOUND USIOV R0,@#DECMD+4 ;SAV OPTION AWAY JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES CLR @#DECMD1 CLR @#DECMD1+2 ;'MPIVOT'=0 CNG SIMPSON'S RULE ; Y(N)=(Y'(N-2)+4Y'(N-1)+Y'(N))/3 + Y(N-2) DEIN9: JSR PC,DESTRP ;GET Y'(N-2) MOV @#DECMD1+16,-(SP) MOLR @#DECMD1+4 CLR @#DECMD1+6 ;'BPIVOT'=0 CMP @#DECMD,@#DEDID BEQ DEIN7 CMP @#DECMD,@#DEDID+2 BNE DEIN77 ;B1 IS NOT A V @#DECMD1+14,-(SP) ADD #2,R0 JSR PC,DESTRP ;GET Y'(N) MOV @#DECMD1+16,-(SP) MOV @#DECMD1+14,-(SP) DEC R0 JSR PC,DEDISPLY DEIN7: .IFNDF SPNDI$ JSR PC,@#DEFRCU ;B1 IS A DISPLY TST R0 ;CALL FREE CURSOR ROUTINE BMI DEIN71 ;FREE CUR NOTSTRP ;GET Y'(N-1) MOV @#DECMD1+16,-(SP) MOV @#DECMD1+14,-(SP) CLR -(SP) MOV #40600,-(SP) ;F.P. 4 DEC R0 MOV R0,@#D ACTIVE JSR PC,@#DEPVOT ;CALL PIVOT LINE ROUTINE DEIN71: TST @#DECMD+4 ;OPTION=A? BNE DEIN77 ;NO, =R JSR PC,DEFXCU ;YES ECMD1+14 ;SAV R0 & R2 MOV R2,@#DECMD1+16 JSR R4,@#$POLSH $MLR,$ADR,$ADR DESUBB ;PUTS A F.P. 3 ON STACK $DVR,.+2 TST R4 ;CALL FIXED CURSORS ROUTINE BMI DEIN77 ;FIX CUR NOT ACTIVE SUB R4,R5 MOV R5,@#DECMD1+10 ;DNCTR=XC2-XC1 MOV R4MOV @#DECMD1+16,R2 ;RESTORE R0 & R2 MOV @#DECMD1+14,R0 TST @#DECMD+4 BEQ DEIN10 ;OPTION IS 'A' MOV 2(R2),-(SP) ;OPTI,R0 ;INDEX FOR 'DEGET & DEPUT' BR DEIN8 .ENDC DEIN77: MOV @#DEDATA,@#DECMD1+10 DEC @#DECMD1+10 ;DNCTR=DATASIZE-1 CLR RON IS 'R' MOV (R2),-(SP) JSR R5,@#DEPUT ;PUT NXT RING BUF VAL IN B2 DECMD+2 DEIN10: MOV 2(R2),-(SP) MOV (R2),-(SP) J0 ;TIME TO DO THE INTEGRATION DEIN8: SUB #2,@#DECMD1+10 DEIN88: MOV PC,R2 TST -(R2) ;SINCE CODE MAY BE MOVED(PTAPE VESR R4,@#$POLSH $ADR,.+2 ;CALC Y(N) MOV @#DECMD1+16,R2 ;RESTORE R0 & R2 MOV @#DECMD1+14,R0 MOV (SP)+,(R2)+ MOV (SP)+RSION ADD #DERNGG-DEIN88,R2 ;GET ADDR OF RING BUF THIS WAY MOV R2,@#DECMD1+20 MOV R2,@#DECMD1+22 ADD #6,@#DECMD1+22 ;SA,(R2)+ ;PUT Y(N) IN RING BUF JSR PC,DEINCK ;E.O. RING BUF CHK DEC DECMD1+10 ;DEC DN CTR BMI DEIN11 ;ALL DONE! INC RV E.O. RING BUF ADDR ; INTEGRAL FOR 1ST PT=0, FOR 2ND PT=(Y'(0)+Y'(1))/2 CLR (R2)+ CLR (R2)+ ;PUT 1ST INTEGR IN RING 0 BR DEIN9 ;MOV LAST 2 INTEGRALS(IN RING BUF) INTO B2 IF OPTION IS R DEIN11: TST @#DECMD+4 BEQ DEIN18 ;OPTION IS A !BUF CLR -(SP) MOV #40000,-(SP) ;F.P. 0.5 JSR PC,DESTRP ;GET A PT( STRIPPED OR NOT) MOV @#DECMD1+16,-(SP) ;Y'(0) MOV MOV #2,R3 DEIN12: INC R0 MOV 2(R2),-(SP) MOV (R2),-(SP) JSR R5,@#DEPUT DECMD+2 DEC R3 BEQ DEIN19 ADD #4,R2 J@#DECMD1+14,-(SP) INC R0 JSR PC,DESTRP ;GET Y'(1) MOV @#DECMD1+16,-(SP) MOV @#DECMD1+14,-(SP) DEC R0 MOV R0,@#DECMDSR PC,DEINCK ;E.O. RING BUFR CHK BR DEIN12 DEIN18: ADD #4,R2 JSR PC,DEINCK ;E.O. RING BUFR CHK DEIN19: MOV (R2),DEFMK0 2