@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@RT11ߋtv ?B-NO BOOT ON VOLUME @w p@w l wN׭ ׭ w H  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ߋtv ?B-NO BOOT ON VOLUME @w p@w l wN׭ ׭ w H  @J f @wr Z @& 7 h BLOCK@ X IS BAD  -̂@ R   # @ jw 7 r7 t &"B g wD0 ѕ /Rì/    ~ s// ` b|]/ FD 1  8 /s//-w    s/ eAywkQc!Cy`kQ5c!Cy{kQ/ c!CyhjkQ c!9wukQ c!,vkQc!hjkQ&c!a%kQ c!.H;kQJ c!TH;kQ c!HkQAc!IyXkQ c!OyXkQ"c!OykQc!Ays c!Ays  c!Ays  c!vLE C. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DERS ;***** SPERR$=1 ;LONG FORM OF ERROR MESSAGES ;DA$2=1 ;ADDING NEW CMDS TO SPARTA SPBBU$=1 ;BBU CMD SPPWR$=1 ;PWRIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH ,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 ;IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON .TITLE SPASEM ;LAB APPLICATION-11 ASSEMBLY FILE BDE CMD SPBIN$=1 ;BIN CMD SPBSM$=1 ;BSM CMD SPMOP$=1 ;MOP,MIN,MOU,MRE,MCL CMDS SPAAD$=1 ;AAD CMD SPFFT$=1 ;FFT Cc!vL0H c!vLF  c!HkQc!HkQc!HkQc!%%% ;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 ;C}  yhH#&E C}C T~^ C&|&C{3X {3X ,@ CAPS11 O.S. LPS11$=1 ;LPS HARDWARE .IFDF LPS11$ AD$5=1 ;LED'S HARDWARE .ENDC ;AR11$=1 ;AR11 HARDWARE .IFDF AR11$ ;AdD 3C T~X+CZhM Cw C&X C&4X& Cyh  #yhE  #yh #RPOL$=1 ;BIPOLAR DATA FOR READING CURSOR KNOBS .ENDC ;***** ;GROUP 2 SPECIAL FLOATING VECTORS ;***** LPSV$=340 ;LPS zGX C,@ #,E  #}E  #y}  Cy} C&vr C:L1CyL" CyOR AR11 FLOATING VECTOR ADDRS LPSS$=170400 ;LPS OR AR11 STATUS REG ADDR GT40V$=320 ;GT40 FLOATING VECTOR ADDR GT40S$=172000L"E  CyL"  CyL" CyL"^Cy  CyD  C%#'jLmjL ;GT40 START ADDR (DPC) ;***** ;GROUP 3 DISPLAY RELATED PARAMETERS ;***** ;SPNDI$=1 ;ELIMINATE ALL DISPLAY RELATED COD.NLIST ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE E .IFNDF SPNDI$ GT40$=1 ;ASSEMBLE CODE FOR GT40/44 ;VR14$=1 ;ASSEMBLE CODE FOR VR14 DISPLAY SPDDI$=1 ;DDI CMD SPDFR$=1FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTW ;DFR,DCU,DLI,DWI,DPO,DTA CMDS .IFDF SPDFR$ SPBST$=1 ;BST CMD (NEEDS FIX & FREE CUR) SPBAL$=1 ;BAL CMD (NEEDS FIX CUR) ARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCHSPDID$=1 ;DID,DFV,DCV CMDS .ENDC SPDSP$=1 ;DSP,DOV CMDS SPDIS$=1 ;DEX,DIN,DDE,DRA,DLO CMDS SPBDD$=1 ;BDD CMD SPDNO$ SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DE=1 ;DNO CMD SPDTB$=1 ;DTB CMD AD$1=1 ;DISPLAY CODE IN A/D MODULE .ENDC ;***** ;GROUP 4 NON-DISPLAY RELATED PARAMETE CURSORS DA$6=1 ;LINE DA$8=1 ;WINDOW .ENDC .IFDF SPDSP$ DA$4=1 ;DUAL DISPLAY .ENDC .IFDF SPDIS$ GTD$9=0 ;EX40 IS DISPLAY, ELSE VR14 ;DA$4 ;DEFINED=DUAL DISPLAY ;DA$6 ;DEFINED=LINE ;DA$7 ;DEFINED=LESS THAN 12 BIT A/D, ELSE 1PAND CMD CODE IN GT40 MODULE VRD$4=0 ;EXPAND CMD CODE IN VR14 MODULE .ENDC .IFDF SPNDI$ AD$4=1 ;FAST SAMPLE USES NO DI2 BIT ;DA$8 ;DEFINED=WINDOW ;RT11$ ;DEFINED=RT-11 SYSTEM ;CAPS$ ;DEFINED = CAPS11 SYSTEM ;VR14$ ;IF DEFINED VR14SPLAY .ENDC .IFNDF SPNDI$&VR14$>40$ ERR=AAA ;YOU NEED VR14$ OR GT40$ .ENDC .LIST IN USE .IFDF SPNDI$ .IFDF AD$1 ERR=WWW ;IF NO DISPLY THEN NONE FOR A/D .ENDC .ENDC .IFDF GT40$&VR14$ ER=XXX ;BOTH DISPLAYS CAN'T BE DEFINED .ENDC .IFDF LPS11$&AR11$ ERR=YYY .ENDC .IFDF RT11$&CAPS$ ERR=ZZZ .ENDC ;NO STORE COMMAND ;WHEN THIS COMMAND IS ISSUED THE FOLLOWING COMMAND WILL BE ;EXECUTED, BUT WILL NOT STORE ANY DATA IN THE OUTPUT BUFFER. ;AFTE.TITLE SPCORE ;LAB APPLICATION-11 DATA EDITOR ROOT SECTION ;DEC-11-SLABA-C-LA14 ;FILE SPCORE.MAC ;FILE ID SPCORE.1 .CSECT SR WHICH, ALL SUBSEQUENT COMMANDS. WILL OPERATE NORMALLY. ;EXTENTION COMMAND TABLE ;TO ADD NEW COMMANDS TO THE DATA ANALYMD 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 PCORE ;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 ISTC$=1 MULT$=1 MULTS$=1 .IFDF SPDID$ DA$10=1 ;FREE CURSOR VALUES DA$11=1 ;FIX CURSOR VALUES DA$12=1 ;CURVES ID NAMDIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICHES .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 IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;GT40$ ;IF DEFINED GTD LETTERS ; . ; . ; . ; 0 ; ETC ;XJUMPA IS THE ADDRESS OF THE JUMP TABLE TO THE COMMANDS. ;THE JUMPOUTINE IS CALLED VIA A JSR PC,ROUTINE, ;HENCE TO RETURN DO A RTS PC. ;ERRORS: IF AN ERROR OCCURS AND THE USER WISHES ;TO US TABLE IS AS FOLLOWS. ;XJUMPA:ADD OF 1ST X COMMAND ; ADD OF 2ND X COMMAND ; ETC ;THE EXTENSION COMMAND TABLE IS ASSEMBLEE ONE OF THE ERRORS IN SPOV6, THE ERROR ;ROUTINE IS CALLED BY PUT THE ERROR NUMBER IN ;R0 AND JUMPING TO DEFORE. IF AN ERROR D AND LINKED INTO THE ;DATA ANALYSIS MODULE., IN THE ROOT SECTION ;THE USER PROGRAMS CAN BE IN OVERLAYS. ;WHEN USING A USEROCCURS ;IN THE FPMP PACKAGE THE ERROR SUBROUTINE IS ;AUTOMATICALLY CALLED INDEPENDENT OF THE USER. ;WHEN THE ERROR ROUTINE IS EXTENSION TABLE THE CORE ;PROGRAM WILL PICK UP THE BUFFER NAMES AND NUMBERS. ;THE FORMAT THAT SHOULD USED IS ;COMD B1 B2 CALLED VIA DEFORE ;THE STACK IS RESET TO THE TOP. ;GET/PUT ROUTINES: THE USER ROUTINE CAN USE ;SPARTA'S GET AND PUT ROUTI .. #1 #2 ... SWITCHES ;WHERE COMD IS THE COMMAND LETTERS FOR THE COMMAND, ;B1 IS THE FIRST BUFFER, B2 IS THE SECOND BUFFER NES TO GET A VALUE FROM ;A BUFFER AND STORE A VALUE AWAY. TO CALL THEM ;STORE THE INDEX INTO THE BUFFER IN R0, 0 IS THE ;FIRETC. ;#1 IS THE FIRST FLOATING INPUT, #2 IS THE SECOND FLOATING ;NUMBER ETC. AFTER THIS INPUT THE USER COMMAND CAN ;HAVE ANYST VALUE, 1 THE SECOND, ETC AND CALL ; JSR R5,DEGET OR DEPUT ; ADDRESS OF BUFFER# AND TYPE ;THE ADDRESS OF BUFFER # AND SWITCHES OR ANYTHING ELSE. THE CORE ;SECTION OF SPARTA WILL PROCESS UP TO 4 BUFFERS. ;AND 5 FLOATING POINT NUMBERS. THE RES TYPE IS THE ADDRESS OF THE ;TABLE ENTRY DECMD. FOR EXAMPLE THE BUFFER OF ;CONSERN IS IN DECMD+2, STORE # DECMD+2 AS THE ;ADT MUST BE ;INTERPRETED BY THE USER, USING QA. IF AT ANY TIME ;AN ERROR OCCURS DURING INPUT THE QA POINTER ;INTO THE BUFFER WDRESS ABOVE. THE GET AND PUT ROUTINES FLOAT ALL ;NUMBERS SO THAT CALCULATIONS CAN BE DONE IN FLOATING ;POINT. HENCE TO CALL ILL REMAIN AT THE ERROR ENTRY. ;THE CORE ROUTINE OF SPARTA WILL FETCH THE FIRST BUFFER ;THEN THE SECOND THEN THE THIRD AND WDEGET, CALL AS SHOWN ABOVE ;AND THE FLOATING POINT VALUE WILL BE RETURNED AS. ;THE TOP TWO VALUES ON THE STACK, THE EXPONENT ISIS PROGRAM A TABLE MUST BE ;DEFINED, THE ADDRESS OF THE TABLE PUT IN LOCATION DETBXX, ;AND THE COMMANDS ;WRITTEN. TO INSERILL FILL UP THE ;TABLE DECMD WITH THE BUFFER TYPE AND NUMBER. ;WHEN AN ENTRY IS FOUND THAT IS NOT A BUFFER THE REMAINDER OF ;T THE TABLE ADDRESS THE EXTENSION TABLE OBJ ;MUST CONTAIN THE FOLLOWING. ;THE COMMAND TABLE AS SHOWN BELOW MUST HAVE ;THE TTABLE IS FILLED UP WITH 177777. NEXT IT FETCHES ;FLOATING POINT NUMBERS AND STORES THEM IN THE TABLE ;DECMD1 UNTIL AN ERROR OAG DETBX AS SHOWN, AND DETBX SET GLOBAL. ;THE ADDRESS OF THE JUMP TABLE XJUMPA MUST PROCEED THE ;COMMAND TABLE AS SHOWN. ; CCURS AND THEN FILLS THE REMAINDER OF ;TABLE WITH 177777'S. ;NOTE IF MORE THAN 4 BUFFERS ARE INPUT BEFORE THE ;NUMBERS, QA XJUMPA ;DETBX: .BYTE # OF COMMAND +1 ; .BYTE # OF LETTERS ; .BYTE 1ST LETTERS ; . ; . ; . ; 0 ; .BYTE 2NWILL POINT TO THE 5TH BUFFER INPUT AND ;THE NUMBER TABLE WILL BE ALL 177777'S WHEN THE ;USER ROUTINE IS CALLED. ;THE USER RNE WILL FIX THE NUMBER TO ;SINGLE PRECISION IF THE BUFFER IS S.P. AND THE ;GET ROUTINE WILL FLOAT DATA FROM A S.P. BUFFER. GCUF,DEGFXF,DEDCVZ,DEG1MO .GLOBL DEG1RC,DEPTCC,DEDSKP,DEGTOF,DEGTON,DEGFCJ,DEGLIX .GLOBL DEGIDX,DEGFCX,DEGCX,DECDID,ADGTON,ADG;SPARTA VARIABLES: ALL VARIABLES NECESSARY TO ;INTERFACE TO SPARTA ARE DISCRIBED IN THE SPARTA ;LISTINGS. ;PROGRAM CONDITITOF,ADMAXV .GLOBL DISMPO,DISGRA,DISSKP .IFDF CAPS$ .GLOBL GT40VC,DEGTIN .ENDC .IFDF DA$12 .GLOBL DEID1,DEGCID,DEG2ID ONAL INITIALIZATION ADSIZE=12. ; NUMBER OF A/D BITS ;DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=.ENDC .IFDF DA$10!DA$11 .GLOBL DFXCT5,DFXCTB,DEDFX1 .ENDC .IFDF DA$10 .GLOBL DFCVT2,DFCVT4,DGFCL1,DGFCL2,DGFCL3,DGFCL4,D%7 ;VALUE DEFINITIONS FOR QA CALL QASP=1 QAFLO=10 QAALP=20 QAMIX=100 QASIL=400 QADWA=1000 QAAO=4000 ;RELATIVE LPSEGFCL .ENDC .IFDF DA$11 .GLOBL DFXCT3,DEGCS1,DEGCS2,DEGCS3,DEGCS4,DFXCT4,DFXCTA,DEGCST .IFDF DA$4 .GLOBL DEGCS5,DEGCS6,D STATUS REGISTER ADDRESSES CKSTAT= 4 ;CLOCK STATUS ADSTAT=0 ; A/D STATUS REG. ADBUF =2 ; A/D BUFFER REG. .IFDF LPS1EGCS7,DEGCS8,DEGCSB .ENDC .ENDC .IFDF DA$5 .GLOBL DEGFC,DEGXL,DEGYL,DEGXR,DEGYR,DEGLIJ .IFDF DA$6 .GLOBL DEGLI,DEGLX1,1$ VCSTAT=16 ; DISPLAY STATUS VCX =20 ; X DAC VCY =22 ; Y DAC .ENDC .IFDF AR11$ VCSTAT=10 VCX=12 VCY=14 .EDEGLX2,DEGLX3,DEGLX4,DEGLX5 .ENDC .ENDC .ENDC .IFDF VR14$ .GLOBL DEPTCC,DISDDN .ENDC .IFDF RT11$ .GLOBL OFILE,NDC ;RELATIVE VECTOR ADDRESS FOR LPS ADVEC =0 CLKVEC =4 ;INTERNAL GLOBALS .GLOBL CKSTAT,VCX,VCY,ADVEC,CLKVEC,DESTRT,IFILE .IFDF SPMOP$ .GLOBL DECLO .ENDC .ENDC ;DISPLAY GLOBALS .GLOBL DISBUF,DISXBU,DISYBU,DISTYP,DISST,DISN,DIST,DISDERSTR,LPSVEC,LPSSAD .GLOBL DESTAK,DELST,DEONE,DEDID,DEGTPT,DEDIT1,DED1BA,DED1CO,DEDI1C .GLOBL DEDI1S,DED1CI,DED1TY,DED1P1,DEDCU .GLOBL DISSC,DISR,DISDX,DISYBS,DISDLT,DISCI,DISCU1,DISCU2 .GLOBL DISXC1,DISXC2,DISOFX,DISOFY,DISSZX,DISTOP,DISBOT .GLOBL D1P2,DEDATA,DEDATS,DEDATF,DEASGN .GLOBL DEDATT,DEXFG,DECMD,DECMD1,DEPOTS,DEPOT1,DEPOT2,DEPOT3 .GLOBL DEPTC,DE4POT,DEOLDP,DESM1LISSTX,DISTX ;DISPLAY VALUES DISBUF=0 DISXBU=2 DISYBU=4 DISTYP=22 DISST=6 DISN=10 DIST=12 DISCU=14 DISSC=15 DISR=3,DESM1S,DESWIP,DEFLG1,DEFLG2 .GLOBL DEFLG4,DEBOT,DEFREE,DETOP,DEBTOP,FLGOPN,TTYBUF,FORBUF .GLOBL DE0,DEFORE,DEHARE,DENOST,DEGE0 DISDX=32 DISYBS=44 DISDLT=46 DISCI=20 DISCU1=24 DISCU2=26 DISXC1=34 DISXC2=36 DISOFX=50 DISOFY=16 DISSZX=52 DISTOPT,DEPUT,DECALS,DEADSB .GLOBL DEEXIT,DETLE,ADSCAL,ADDTYB,ADDTAB .IFDF DA$7 .GLOBL DEADSH .ENDC ;EXTERNAL GLOBALS .GLO=54 DISBOT=56 DISSTX=40 DISTX=42 DISMPO=60 DISDDN=60 DISSKP=70 DISGRA=71 ;PROGRAM START IS DESTRT ;RESTART IS DESTRT-2BL DEEND,QA,DEE30,QABUFP,DEERFP,DERROR,$POLSH,$IR,$RI .GLOBL SAVRG,RSTRG,TTYICH,FORBUA,MULT,QADATF .IFNDF SPNDI$ .GLOBL DEE0. BR DERSTR ;RESTART ENTRY DESTRT: JMP DEEND ;START LOC FOR DATA EDITOR ;LPS/AR11 VECTOR $ STATUS REG ADDRESSES LPSVES THE ;TOP VALUE, MANTISSA NEXT. TO CALL DEPUT PUT ;THE FLOATING VALUE ON THE STACK AND CALL DEPUT AS ;ABOVE. THE PUT ROUTI5,DEE1 .IFDF SPAAD$ .GLOBL DEDIB2 .ENDC .ENDC ;INTERNAL GLOBALS .IFDF GT40$ .GLOBL GT40SA,DECRLT,DEDBCB,DEGIDF,DE$ ;GT40 DISPLAY DRIVER TABLES,DEGTIN DEGTDL: 0 ;ADDRESS OF DISPLAY BUFFERS DEGFCJ DEGTXF: 0 ;=0 IF OFF, =177777 IF OR-14, SET 1000 FOR GT40 DED1CI: 0 ;20 CI DED1TY: 1 ;22 TYPE DED1P1: 0 ;24 CURSOR 1 IN DED1P2: 0 ;26 CURSOR 2 IN 0 N DEGTDF: 0 ;=0 FOR CURVES, =177777 FOR FREE CURSOR TIME DEGTSF: 0 ;STOP FLAG =0 VIA STOP, = OR < 0 STOP 0,0,0,0 ;DISP ;30 R REMAINDER 0 ;32 DX DELTA X 0 ;34 XC1 CURSOR 1 T-POINT POSITION = T,T-1,...,1 0 ;36 XC2 CURSOR 2 0 ;40 S-C: LPSV$ LPSSAD: LPSS$ .IFDF GT40$ GT40SA: GT40S$ .IFDF CAPS$ GT40VC: GT40V$ .ENDC .ENDC DERSTR: .IFDF RT11$ .IFLAY STACK DEGSTK: 0 DEGSTP: 0 ;DISPLAY STACK POINTER .ENDC ; GT40 CURVE ID AND CURSOR VALUE FLAGS ;FLAG TO DISPLAY CDF GT40$ .UNLNK ;VTMAC CALL 'UNLINK SCROLLER' .LNKRT .CLEAR .ENDC .ENDC .IFDF CAPS$ IOT .BYTE 6,0 ;CLOSE ANY URVE ID DEGIDF: .BYTE 0 ;=0 IF ID OFF ;=1 IF ON ;FLAG TO DISPLAY FREE CURSOR VALUES DEGCUF: .BYTE 0 ;=0 IF FREE CURSOFILE ON CT0: 0 ;NOT USED IOT .BYTE 6,1 ;CLOSE ANY FILE ON CT1: 0 .ENDC JMP DE0 ;DATA EDITOR ROOT SECTION ;DR VALUE OFF ;=1 IF FREE CURSOR VALUE DISPLAYED ;FLAG TO DISPLAY FIX CURSOR VALUES. DEGFXF: .BYTE 0 ;=0 IF FIX CURSORS NATA STORAGE FOR SPARTA ;STACK START DESTAK: 600 ;600 FOR PAPERTAPE ;SET BY RT-11(FORCE 600 HERE ALSO) ;DISPLAYOT DISPLAYED ;=1 IF FIX CURSORS DISPLAYED .BYTE 0 ;NOT USED. ;BUFFER TO STORE FPMP ASCII, FOR DISPLAY OF FIX ;AND F ID TABLE ADDRESSES DELST: 0 ;DEDIT1 AND DEDIT2 GO IN HERE 0 ;TABLE FOR DISPLAY MODULE, DEFINES THE DISPLAY 0 ;TO BE SREE CURSOR VALUES. DEDCVZ: 0,0,0,0,0,0,0 ;DISPLAY FREE CURSOR VALUE TABLES .IFDF DA$10 ;ADDRESSES TO STORE F.C.V. HOWN ;DISPLAY COMMAND TABLE DEONE: 0 ;DEDIT1 AND DEDIT2 GO IN HERE 0 ;FOR DISPLAY, DEFINES WHAT DISPLAYS, DISPLAY 0 DFCVT2: DGFCL1,DGFCL2,DGFCL3,DGFCL4,0 ;ADDRESSES OF POT VALUES DFCVT4: DEGXL,DEGYL,DEGXR,DEGYR .ENDC .IFDF DA$11 ;COMMANDS ARE FOR. ;DISPLAY ID TABLE, BUF #, BUF TYPE. ;OF DISPLAYS BEING SHOWN. DEDID: .BYTE 0 ;BUF NUMBER, DISPLAY 1,;FIX CURSOR DISPLAY VALUE TABLE ;DISPLAY BUFFER STORAGE AREA DFXCT3: DEGCS1,DEGCS2,DEGCS3,DEGCS4 .IFDF DA$4 DEGCS5,DEGCS6 (DELST) .BYTE 0 ;BUF TYPE .BYTE 0,0 ;SAME AS SHOWN, DISPLAY 2, (DELST+2) ;TABLE OF POINTERS TO DISPLAY TABLES FOR GT40 ,DEGCS7,DEGCS8 .ENDC ;S.P. COMMAND TABLE, TO OUTF MODULE DFXCT4: .BYTE 12,200 .EVEN DFXCTA: 0,0 .ENDC .IFDF DA$10! DEGTPT: DELST ;ADD OF I.D. TABLE ADDRESSES DEONE ;ADD OF COMMAND TABLE ADDRESSES .IFDF GT40$ DECRLT ;ADD OF 1ST ADDDA$11 ;F.P. COMMAND TABLE, TO OUTF MODULE DFXCT5: .BYTE 16,200,7 .EVEN DFXCTB: 0,0,0 .ENDC .ENDC ;DISPLAY ID TABLRESS OF EACH CURVE DEDBCB ;ADD OF DISPLAY BUFFER CONTROL BLOCK. ;ADDRESS IN THE DISPLAY BUFFER OF EACH CURVE DECRLT: 0,0E 1, GTDISP MODULE ;ALL VALUES MUST BE SET BY DISPLAY COMMANDS. DEDIT1: 0 ;0 BUFSIZE 0 ;2 XBUFR DED1BA: 0 ;4 YBUFR,0 DEDBCB: 0 ;ADD OF BUFFER DISPLAY FILE 0 ;SIZE OF BUFFER 0 ;OFFSET INTO BUFFER .ENDC .IFDF GT40$ .IFDF CAPS DED1CO: 0 ;6 S-1 1 ;10 N 1 ;12 T DEDI1C: .BYTE 0 ;14 CURSOR DEDI1S: .BYTE 0 ;15 SCALE 4000 ;16 OFFY, FOR V .ENDC ;----------STORAGE TABLES---------- ;BUFFER MANAGEMENT TABLE ;ALL BUFFERS ARE CONTIGUOUS DEDATA: 0 ;DATA S. ;2 BYTES PER BUFFER INPUT, 177777 IMPLIES THE WORD ;AND THOSE UNDER HAVE NO DATA DECMD: .BYTE 0,0 ;DECMD=BUFFER NUMBER IZE, AMOUNT OF DATA TO BE PROCESSED 0 ;BUFFER SIZE DEDATS: 0 ;# OF S.P. BUFFERS 0 ;ADDRESS OF 1ST S.P. BUFFER DEDATF .BYTE 0,0 ;DECMD+1=BUFFER TYPE .BYTE 0,0,0,0 ;ETC ;NUMBER INPUT, ALL NUMBERS STORED ARE F.P. ;A TOTAL OF 4 NUMBERS A: 0 ;# OF F.P. BUFFERS 0 ;ADDRESS OF 1ST F.P. BUFFER ;BUFFER ASSIGN TABLE, 2 ENTRIES ;S.P. BUFFERS USED TO DISPLAY F.PRE ALLOWED. ;177777, 177777 IMPLIES THE F.P. NUMBER AND ;UNDER ARE NOT USED DECMD1: 0,0,0,0,0,0,0,0,0,0 ;5 F.P. NUMBERS . BUFFER, FOR VR14 DISPLAY ;BUFFER #'S ARE 1, 2, 3, ... DEASGN: .BYTE 0 ;F.P. BUFFER # .BYTE 0 ;S.P. BUFFER # 0,0 ;F.P ;POTS TABLE DEADSH: 12.-ADSIZE ;# OF SHIFTS OF POT READING. ;VALUE OF THE 4 POTS, ADJUSTED TO 12 BITS IF ;LESS THAN A 1. SCALE FACTOR 0,0 ;F.P. OFFSET ;SECOND ENTRY .BYTE 0 ;F.P. BUFFER # .BYTE 0 ;S.P. BUFFER # 0,0 ;F.P. SCALE F2 BIT A/D IS USED. DEPOTS: 0 ;POT 0 DEPOT1: 0 ;POT 1 DEPOT2: 0 ;POT 2 DEPOT3: 0 ;POT 3 ;POT JIDDER-ELIMINATION VARI1 EXPAND SAVE 0 ;42 T EXPAND SAVE 0 ;44 BASE ADDRESS FOR DISPLAY 0 ;46 TABLE DELTA REL. TO DATA DED1OX: 0 ;50 X OACTOR 0,0 ;F.P. OFFSET ;DISPLAY NORMALIZATION VALUE ;DISPLAY ALL POS DATA, OR NEG, POS DATA DEDATT: 0 ;=0 FOR NEFFSET DED1ZX: 10000 ;52 X SIZE, FOR VR14, SET 2000 FOR GT-40. DED1TP: 7777 ;54 TOP VALUE FOR VR-14, SET 1777 FOR GT-40. DG/POS ;=1 FOR POS DATA ONLY .IFDF VR14$ .IFDF LPS11$ .GLOBL DEOFYD,DENORM,DEOFY,DEDXSZ,DEDYSZ DEOFYD: 4000 ;= OFFSET DEF. ED1BT: 0 ;56 BOTTOM VALUE .IFDF GT40$ DEG1MO: 0 ;MULT AND OFFSET TO DISPLAY 0 ;FLOATING POINT DATA 0 ;(DATA-OFFSET; 4000=NEG/POS FOR VR14 DENORM: 42777,160000 ;NORMALIZE MULTIPLIER (.FLT2 2047) DEOFY: 4000 ;OFFSET AT DISPLAY DEDXSZ: 100)*MULT 0 DEG1RC: .BYTE 0 ;=1 RECALCULATE THIS DISPLAY ;=0 SKIP THIS DISPLAY .BYTE 0 ;GRAPH PLOT FLAG=0 REG ; =1 GR00 ;DISPLAY X SIZE DEDYSZ: 7777 ;Y SIZE .ENDC .IFDF AR11$ .GLOBL DEOFYD,DENORM,DEOFY,DEDXSZ,DEDYSZ DEOFYD: 1000 DENOAPH PLOT .ENDC .IFDF VR14$ 0 ;60 DISPLY DONE CTR (VR14) .ENDC ADSCAL=DEDI1S ADDTYB=DED1BA ADDTAB=DEDIT1 .IFDF DRM: 42377,100000 ;.FLT2 511 DEOFY: 1000 DEDXSZ: 2000 DEDYSZ: 1777 .ENDC .ENDC .IFDF GT40$ .GLOBL DEOFYD,DENORM,DEOFY,DA$4 ;DIPLAY ID TABLE 2 FOR GTDISP MODULE .GLOBL DEDIT2,DED2CO,DEDI2C,DEDI2S,DED2CI,DED2P1,DED2P2 DEDIT2: 0,0,0 DED2CO: 0,1,EDXSZ,DEDYSZ DEOFYD: 1000 ;THESE VALUES ASSUME A GT44 DENORM: 42377,100000 ;.FLT2 511 DEOFY: 1000 DEDXSZ: 2000 ;DISPLAY1 DEDI2C: .BYTE 0 DEDI2S: .BYTE 0 4000 DED2CI: 0,1 DED2P1: 0 DED2P2: 0,0,0,0,0,0,0,0,0 DED2OX: 0 DED2ZX: 7777 DED2TP: X SIZE DEDYSZ: 1777 ;Y SIZE ADMAXV=DEDYSZ .ENDC ;COMMAND PARAMETER INPUT TABLE DEXFG: .BYTE 0 ;=1 FOR EXTENSION TAB7777 DED2BT: 0 .IFDF GT40$ .GLOBL DEG2MO,DEG2RC DEG2MO: 0,0,0,0 DEG2RC: .BYTE 0 .BYTE 0 .ENDC .IFDF VR14$ 0 .ENDC LE 0 OTHERWISE .BYTE 0 ;NOT USED ;BUFFER TYPE AND NUMBER ;TYPE: 0=S.P., 1=F.P. ;NUMBER: BUFFER NUMBER = 1, 2, 3, .. .IFDF GT40$ DEDSKP: .BYTE 0 ;SET=1 NOT TO RECAL. DISPLAY ;ELSE=0 .BYTE 0 ;NOT USED .ENDC ;DISPLAY TYPE DEFLG FILES AND 6 INPUT FILES OFILE: 0,0,0,0,0,0 IFILE: 0,0,0,0,0,0,0,0,0,0,0,0 .ENDC FLGOPN: 0 ;FLG=0 IF NO FILES ARE OPEN,1: .BYTE 0 ;=0 NO DISPLAY ;=1 SINGLE DISPLAY (DDI) ;=2 DUAL DISPLAY (DOV) ;=3 DUAL DISPLAY (DSP) ;=4 FAST D ELSE .NE.0 .IFDF CAPS$ TTYBFH: 73. ;HDR FOR CAPS11 .BYTE 0,0 ;FORMATTED ASCII 0 ;BYTE COUNT TTYBUF: 0 .=.+72. .ISPLAY ;FREE CURSOR FLAG .BYTE 0 ;=0 IF INACTIVE ;.NE.0 IF ACTIVE ;WINDOW FLAG DEFLG4: .BYTE 0 ;=0 NO WINDOWENDC .IFDF RT11$ TTYBUF: 0 ;TELETYPE BUFFER .=.+70. .ENDC FORBUF=TTYBUF ;OUTPUT BUFFER ;-----MESSAGE TABLES----- ;=-1 DISPLAY WINDOW IS ACTIVE DENOSF: .BYTE 0 ;NO STORE FLAG, SET =0 TO STORE ;DATA VIA AN OPERATION, SET =1 NOT TO ;COMMAND MESSAGE DECQUS: .BYTE '#,0 .EVEN ;INITIALIZATION CODE AFTER A COMMAND DE0: MOV LPSSAD,R0 ;SET STATUS REGI STORE DATA. ;STRAIGHT LINE DISPLAY DEFLG2: 0 ;STRAIGHT LINE FLAG=0 NO LINE ;NE. 0 DRAW LINE .IFDF DA$6 .GLOBL STER CLR ADSTAT(R0) ;CLEAR LPS CLR CKSTAT(R0) CLRB DENOSF ;CLEAR NO STORE FLAG. ;INITIALIZE POT-A/D INTERRUPT READINGDEDRBS,DEX0,DEY0,DEDELY,DEDLYF,DEDELX,DELNB,DELMDY DEDRBS: 0 ;# OF POINTS IN LINE DEX0: 0 ;INITIAL X,Y VALUE OF DEY0: 0 MOV LPSVEC,R1 ;SET VECTOR ADDRESS MOV #300,ADVEC+2(R1) CLR TTYICH ;CLEAR INPUT, OUTPUT TO TELTYPE MOV #TTYBUF,FORBUA ;STRAIGHT LINE DEDELY: 0 ;DELTA Y FOR LINE DEDLYF: 0 ;DELTA Y FRACTION FOR LINE DEDELX: 41. ;DELTA X=41. USUALLY (OR = .IFDF GT40$!VR14$ JSR PC,DEE05 .ENDC DE02: JSR R5,QA QADWA DECQUS DE01: .IFDF GT40$!VR14$ JSR PC,DEE1 .ENDC J0 IF VERT LINE) DELNB: .BYTE 0 ;SET 1 IF B IS NEG, Y=MX+B DELMDY: .BYTE 0 ;SET 1 IF DY IS NEG. .ENDC ;CORE MANAGEMENT SR PC,DEE30 BR DEFOR0 ;ERROR RTN FROM DEE30 BR DE02 BR DE01 DECALS: JSR PC,(R1) ;NORMAL RTN FROM DEE30 BR DE0 DEADSBABLES. .IFDF GT40$ DEPTCC: 20 .ENDC .IFDF VR14$ DEPTCC: 1 .ENDC DEPTC: .WORD 0,0,0,0 ;4 POT SUM, CHANGE TEST VARIABL DEBOT: DEEND ;INITIAL START OF FREE CORE ;DEEND IS FOR PAPER TAPE DEFREE: 0 ;CURRENTBOTTOM OF FREE CORE DETOP: 0 ES DE4POT: 0 ;4 POT SUM DEOLDP: 0 ;OLD 4 POT SUM VALUE ;POT LIMIT VALUES FOR WINDOW DISPLAYS DESM1L: 0 ;MAX VALUE O ;TOP OF FREE CORE DEBTOP: 0 ;ADDRESS OF THE TOP OF THE BUFFERS .IFDF RT11$ ;-----RT11 I/O TABLE----- ;DATA EDITOR I/OF (S-1) FROM DEPOT2 DESM1S: 0 ;SHIFT OF DEPOT2 TO REACH MAX (S-1) DESWIP: 0 ;LAST VALUE OF DEPOT2 .IFDF DA$4 .GLOBL D INFORMATION TABLE ; ;IT CONTAINS 9 SETS OF INFO. EACH SET CORRESPONDS TO ; ONE I/O FILE BEGINNING WITH CHAN#0. ;EACH SET COES1L3,DES1S3,DESWP3,DESWP0,DESWP1 DES1L3: 0 ;MAX VALUE OF (S-1) FROM DEPOT3 DES1S3: 0 ;SHIFT OF DEPOT3 TO REACH MAX (S-1) NSISTS OF 2 WDS. ; WD1=KEEPS TRACK OF CURRENT REL. FILE BLK. (CLR=177777) ; WD2=EVEN BYTE, HOLDS CORRESP CHANNEL# ; WD2=ODD B DESWP3: 0 ;LAST VALUE OF DEPOT3 DESWP0: 0 ;VALUES OF POTS FOR UP & DOWN DESWP1: 0 .ENDC ;DISPLAY CONTROL INFORMATIONYTE KEEPS TRACK OF CURR. PT.# OF REL. BLK. ;THIS TABLE IS INITIALIZED (CLEARED) BY THE 'OPEN CMD' ;TABLE HAS A MAX OF 3 OUTPUT ;TEST IF FIX CURSOR BEQ DE0 ;DISPLAY ON AND CALL IF SO JSR PC,DEDFX1 .ENDC BR DE0 .ENDC ;LINE FORMAT TEST, FOR EER ON THE STACK IN ;FLOATING PT FORMAT. ; ;CALLING SEQUENCE ;STORE VALUE INDEX IN R0, 0=FIRST VALUE. ; JSR R5,DEGET ;ADDREXCESS INPUT ON LINE DETLE: CMPB @QABUFP,#15 ;TEST FOR C.R. BNE DETLE1 RTS PC DETLE1: CMPB @QABUFP,#40 ;SPACE IS O.K. BSS OF BUFFER # AND TYPE ;VALUES IN R0-R5 ARE RESTORED DEGET: CMP -(SP),-(SP) ;SET UP PLACE ON THE STACK TO RETURN MOV 4(SP),NE DETLE2 INC QABUFP ;LOOK FOR A C.R. BR DETLE DETLE2: MOV #42.,R0 ;TYPE ERROR FOR EXCESS INPUT BR DEFORE ;COMMAND(SP) ;VALUE JSR PC,DEGPS ;GET ADDRESS OF VALUE IN R4 MOV (R4),R0 ;ASSUME F.P. AND STORE F.P. MOV 2(R4),R1 ;VALUE IN R0,R1 ERROR DEHARE: MOV #60,R0 BR DEFORE DEFOR0: MOV #-51,R0 ;SPECIFY A NUMBER DEERFP: NEG R0 ;FPMP ERROR DEFORE: JSR PC,DERR. TSTB (R2) ;TEST IF S.P. BNE DEGET1 MOV (R4),-(SP) ;FLOAT INTEGER JSR R4,$POLSH $IR,.+2 MOV (SP)+,R0 ;STORE IN R0-OR MOV DESTAK,SP ;RESET THE STACK .IFDF GT40$ INCB DEDSKP ;SKIP RECALCULATION OF DISPLAY .ENDC BR DE0 ;GO TO RE-INITR1 MOV (SP)+,R1 DEGET1: MOV R0,22(SP) ;PUT F.P. # ON THE STACK MOV R1,24(SP) MOV (SP)+,R5 MOV (SP)+,R0 ;RESTORE REGISTEIALIZATION ;NO STORE COMMAND DENOST: MOVB #1,DENOSF ;SET NO STORE FLAG BR DE02 .IFDF RT11$ ;EXIT ROUTINE FROM SPARTRS. JSR PC,RSTRG TST (SP)+ RTS R5 ;-----DEPUT----- ;SUBROUTINE TO STORE A VALUE IN A DATA BUFFER. ;THE VALUE IS ON THA TO RT KBR MONITOR .MCALL .EXIT DEEXIT: .IFDF SPMOP$ JSR PC,DECLO ;CLOSE ALL FILES BEFOR EXT .ENDC .IFDF GT40$ .UNE STACK IN F.P. AND THE CALL TO ;DEPUT SETS THE BUFFER INDEX IN R0 AND THE ADDRESS ;OF THE BUFFER NUMBER AND TYPE AS AN ARGUMELNK ;VTMAC CALL 'RELEASE DISPLAY BUF FROM SCROLL' .ENDC MOV #1,R0 ;DO A 'SRESET' UPON RTN TO .EXIT ;RT11 KBRD MONITOR NT ; ;CALLING SEQUENCE ;STORE BUFFER INDEX IN R0 ; JSR R5,DEPUT ;ADDRESS OF BUFFER #/TYPE ;R0-R5 ARE RESTORED DEPUT: JS.ENDC .IFDF CAPS$ ;EXIT ROUTINE FROM SPARTA TO CAPS KBR MONITOR DEEXIT: .IFDF GT40$ JSR PC,@#DEGTOF ;TURN OFF GT40 .R PC,DEGPS ;GET ADDRESS OF BUFFER LOC. MOV SP,R1 ;CALCULATE ADDRESS OF F.P. # ADD #22,R1 TSTB (R2) ;TEST FOR F.P. BUFFERENDC IOT .BYTE 6,0 ;CLOSE ANY FILE ON CT0 0 IOT .BYTE 6,1 ;CLOSE ANY FILE IN CT1 0 IOT .BYTE 4,2 ;WRITE ^C? BNE DEPUT2 ;BRANCH IF F.P. BUFFER MOV R4,-(SP) ;SAVE R4 MOV 2(R1),-(SP) ;FIX NUMBER MOV (R1),-(SP) JSR R4,$POLSH $ CTRLC IOT .BYTE 5,3 ;READ ANY CHAR CIBUF IOT .BYTE 3,3 ;WAITR .-4 IOT .BYTE 2,0 0 ;DISABLE CRTL/P RESTARTRI,.+2 MOV (SP)+,R0 ;STORE IN R0 DEPUT3: MOV (SP)+,R4 ;RESTORE R4 TSTB DENOSF ;TEST FOR NO STORAGE BNE DEPUT4 MOV R0,(: .IFDF SPAAD$ .IFDF GT40$!VR14$ JSR PC,DEDIB2 ;CALL DISPLAY AFTER A/D .ENDC .ENDC BR DE0 .IFDF GT40$ DECDID: . CLR PC ;BOOT-LOC 0='JMP CBOOT' CIBUF: 1 .BYTE 202,0 0 .BYTE 0 .EVEN CTRLC: 3 .BYTE 0,0 3 .BYTE '^,'C IFDF DA$12 TSTB DEGIDF ;TEST FOR ID ON BEQ DE58 JSR PC,DEID1 ;CALL ID ROUTINE .ENDC DE58: .IFDF DA$11 TSTB DEGFXF .BYTE '? .EVEN .ENDC ;-----DEGET----- ;SUBROUTINE TO GET A VALUE FROM A BUFFER (S.P. OR F.P.) ;AND RETURN IT TO THE CALLTSF ;CLEAT STOP FLAG MOV DEDBCB,@GT40SA ;START DISPLAY RTS PC ;SUBROUTINE TO STOP GT40 DEGTOF: TST DEGTXF ;TEST IF CTOR 1 117000 DEGLX3: 40000 ;SET FOR VECTOR 2 0 113400 DEGLX4: 40000 ;VECTOR 2 0 DEGLX5: 40000 ;VECTOR 3 0 R4) ;STORE S.P. VALUE IN BUFFER BR DEPUT4 DEPUT2: TSTB DENOSF ;TEST FOR NO STORAGE BNE DEPUT4 MOV (R1)+,(R4)+ ;STORE ON BNE DEGTF1 RTS PC DEGTF1: COM DEGTSF ;SET STOP FLAG DEGTF2: TST DEGTSF ;WAIT FOR DISPLAY TO STOP BNE DEGTF2 RTS PF.P. IN BUFFER MOV (R1),(R4) DEPUT4: MOV 20(SP),24(SP) ;MOVE R5 FOR RETURN MOV (SP)+,R5 MOV (SP)+,R0 ;RESTORE R0-R4 JSC ;GT40 INTERRUPT ROUTINE DEGTIN: TST DEGTSF ;TEST TO STOP DISPLAY BEQ DEGTI1 CLR DEGTXF ;TURN DISPLAY FLAG OFF CR PC,RSTRG ADD #6,SP ;POP OFF F.P. # AND PC TO DEPUT RTS R5 ;RETURN ;DEGTPT - SUBROUTINE FOR DEGET/DEPUT ;TO GET THE ALR DEGTSF ;CLEAR STOP FLAG RTI DEGTI1: JSR PC,SAVRG MOV DEGSTP,R2 ;GET DISPLAY STACK POINTER MOV @GT40SA,R1 ;READ DPC;DDRESS OF THE BUFFER VALUE. DEGPS: JSR PC,SAVRG MOV R0,-(SP) ;SAVE R0-R4 MOV (R5)+,R2 ;GET ADDRESS OF BUF # /TYPE. MOV VALUE AFTER DSTOP TST (R1) ;TEST WHAT WAS RUNNING BNE DEGTI2 ;NOT 0 FOR SUBROUTINE TST (R2) ;NO SUB, TEST FOR RETURNS R5,-(SP) MOVB (R2),R1 ;STORE BUF # IN R1 INC R2 ;ADDRESS OF BUF TYPE CLR R3 DEGPT2: DEC R1 ;ADD SIZE OF S.P. BUFFERS ON STACK BNE DEGTI3 MOV DEGTDL,R3 ;NO RETURNS, START CURVES OR CURSOR COM DEGTDF ;TEST FOR WHAT WAS RUNNING, AND SET FLAG BEQ DEGPT3 ;TO PASS OVER ADD DEDATA+2,R3 BR DEGPT2 DEGPT3: ASL R0 ;MULT INDEX BY 2 TO ADD TO ADD ASL R3 ;MULTIPLY SIZ. BEQ DEGTI4 MOV DEGTDL+2,R3 ;CURVES WAS RUNNING, DO CORSOR BR DEGTI4 DEGTI3: MOV (R2)+,R3 ;GET RETURN SUB ADD OFF STACE BY 2 FOR ADDRESS MOV DEDATS+2,R4 ;STORE ADD OF 1ST S.P. BUF TSTB (R2) ;TEST IF F.P. BUF BEQ DEGPT4 ASL R3 ;YES MULT.K BR DEGTI4 DEGTI2: MOV (R1)+,-(R2) ;STORE RETURN ADD ON STACK MOV (R1),R3 ;STORE SUB ADD TO START DEGTI4: MOV R2,DEG SIZE BY 2 ASL R0 ;MULT INDEX BY 2 MOV DEDATF+2,R4 ;STORE ADD OF 1ST F.P. BUF DEGPT4: ADD R3,R4 ;ADD SKIPPED BUFFER SIZE STP ;SAVE STACK POINTER MOV R3,@GT40SA ;START GT40 JSR PC,RSTRG ;EXIT RTI .ENDC .ENDC .IFDF GT40$ ADGTON=DEGTON AND ADD R0,R4 ;INDEX TO ADD OF 1ST BUF DEGPT1: JMP @16(SP) ;RETURN,LEAVE PC ON STACK. .IFDF GT40$ ;SUBROUTINE TO TURNADGTOF=DEGTOF .ENDC ;***CORRECT TABLE CONDITIONAL ; FREE CURSOR DISPLAY .IFDF GT40$ DEGFCJ: 160000,DEGLIX .IFDF GT40 ON .IFDF RT11$ DEGTON: .START ;VTMAC CALL - TURN GT40 ON RTS PC DEGTOF: .STOP ;VTMAC CALL - TURN GT40 OFF RT DA$5 DEGFC: 117000 ;SET GRAPHIC MODE, POINT,LEFT CURSOR DEGXL: 40000 ;X POSITION DEGYL: 0 ;Y POSITION 173400 .+4 S PC .ENDC .IFDF CAPS$ DEGTON: TST DEGTXF ;TEST IF ON BEQ DEGON1 DEGON2: RTS PC ;RETURN IF SO DEGON1: COM DEGTXF ;SE DEGFCS 117000 ;RIGHT CURSOR DEGXR: 40000 ;X POSITION DEGYR: 0 ;Y POSITION 173400 .+4 DEGFCS DEGLIJ: 160000,DEGT ON FLAG CLR DEGTDF ;SET CURVE FLAG MOV DEDBCB,DEGTDL ;STORE CURVE ADD MOV #DEGSTK,DEGSTP ;RESET STACK POINTER CLR DEGLIX ; STRAIGHT LINE DISPLAY .IFDF DA$6 DEGLI: 117000 ;SET FOR VECTOR 1 DEGLX1: 40000,0,113400 DEGLX2: 40000,0 ;VESB: 117000,1455,1030,103400 .BYTE 170,154,40,40 DEGCS5: 0,0,0 117000,1455,1000,103400 .BYTE 171,154 DEGCS6: 0,0,0,0,0,0,DIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH0 117000,1455,750,103400 .BYTE 170,162,40,40 DEGCS7: 0,0,0 117000,1455,720,103400 .BYTE 171,162 DEGCS8: 0,0,0,0,0,0,0 IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ; ASSEMBLY PARAMETERS ;GT40$ ;IF DEFINED G .ENDC .ENDC DEGCX: 173400, 0 .IFDF DA$5 ;FREE CURSOR SUBROUTINE DEGFCS: 107400 ;SET RELATIVE VECTOR MODE 44000,T40 IS DISPLAY, ELSE VR14 ;DA$4 ;DEFINED=DUAL DISPLAY ;DA$5 ;DEFINED=FREE CURSORS ;DA$6 ;DEFINED=LINE ;DA$7 ;DEF70000,44000,40020,40140,40020 173400,0 ;DSTOP .ENDC .ENDC .END DESTRT INED=LESS THAN 12 BIT A/D, ELSE 12 BIT ;DA$8 ;DEFINED=WINDOW ;LPS11$ ;DEFINED = LPS HARDWARE ;AR11$ ;DEFINED=AR11 HA.ENDC .ENDC ; CURVE ID DISPLAY DEGLIX: 160000 DEGIDX .IFDF DA$12 DEGCID: 117000 ;POINT MODE 01700 ;X 1360 ;Y 103400 ;CHARACTER MODE .BYTE 'S,'0,'0,'0 ;S#00 160000 DEGIDX DEG2ID: 117000,01700,10,102600 .BYTE 'S,'0,'0,'0 .ENDC DEGIDX: 160000,DEGFCX .IFDF DA$10 DEGFCL: 117000 ;POSITION X LEFT 1455,1330 103400 ;CHARACTER MODE .BYTE 'X,'L DGFCL1: 0,0,0,0,0,0,0 117000 ;POSITION Y LEFT 1455,1300,103400 .BYTE 'Y,'L DGFCL2: .BYTE '0,'+,'0,'0,'0,'0,'0,'.TITLE SPCDIS ;LAB APPLICATION-11 DATA EDITOR ROOT SECTION ;DEC-11-SLABA-C-LA14 ;FILE SPCDIS.MAC ;FILE ID SPCDIS.1 .CSECT S0,'0 .BYTE '.,'E,'+,'0,'0 117000 ;POSITION X RIGHT 1455,1250,103400 .BYTE 'X,'R DGFCL3: 0,0,0,0,0,0,0 117000 ;POSPCDIS ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSEITION OF Y RIGHT 1455,1220,103400 .BYTE 'Y,'R DGFCL4: 0,0,0,0,0,0,0 .ENDC ;DISPLAY FIX CURSOR VALUES DEGFCX: 16000 FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFT0,DEGCX .IFDF DA$11 DEGCST: 117000,1455,1170,103400 .BYTE 170,154,40,40 ;X,L DEGCS1: 0,0,0 117000,1455,1140,103400 .WARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCBYTE 171,154 ;Y,L DEGCS2: .BYTE '0,'+,'0,'0,'0,'0,'0,'0,'0 .BYTE '.,'E,'+,'0,'0 117000,1455,1110,103400 .BYTE 170,162,40H SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN D,40 ;X,R DEGCS3: 0,0,0 117000,1455,1060,103400 .BYTE 171,162 ;Y,R DEGCS4: 0,0,0,0,0,0,0 .IFDF DA$4 160000,DEGCX DEGCEC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY L 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 ,GTDISP,DEGTON,DISSKP,GTSET .GLOBL DEGFXF,DEDCVZ,DEGCUF,DEPTCC,DISMPO .IFDF DA$11 .GLOBL DFXCT3,DFXCTA,DFXCT4 .ENDC .IFD DEC R0 BNE DE3 .ENDC DE2: TSTB DEFLG1+1 ;TEST FOR FREE CURSORS BNE DE2A MOV R1,DED1P1 ;STORE POT VALUES FOR MOV R2,F DA$10!DA$11 .GLOBL FORMAB,DFXCTB,DFXCT5,$CMR,$MLR .ENDC .IFDF DA$10 .GLOBL DFCVT2,DFCVT4 .ENDC .IFDF DA$4 .GLOBL DEDED1P2 ;FIX CURSOR IN DISPLAY .IFDF DA$4 MOV R3,DED2P1 ;POTS 2 AND 3 FOR BOTTOM DISPLAY MOV R4,DED2P2 .ENDC DE2A: ASL RG2RC .ENDC .IFDF DA$5 .GLOBL DEGXL,DEGYL,DEGXR,DEGYR .IFDF DA$6 .GLOBL DEGLX1,DEGLX2,DEGLX3,DEGLX4,DEGLX5 .ENDC .END1 ;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,DE4POC .ENDC .IFDF VR14$ .GLOBL DISPLY,DISET,DEPTCC .ENDC ;DISPLAY GLOBALS .GLOBL DISBUF,DISYBU,DISTYP,DISST,DISN,DISTT ;SAVE NEW SUM CMPB #1,DEFLG1 BHI DE30J ;NO DISPLAY, TEST FOR ANY ;COMMANDS ;SHOW DISPLAY .IFDF VR14$ JSR PC,DIRDWARE ;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 R5SR 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 OF POT 2 MOV DESM1S,R1 ;ROTATE POT 2 VALUE TO BEQ DE4 ;ACCOMODATE THE INDEX RANGE DE5: ASL R0 ;DETERMINED BY THE MAX VALVR14$ JSR PC,DISET .ENDC .IFDF GT40$ MOVB #1,DISSKP(R1) ;SET TO RECAL. DISP. JSR PC,GTSET .ENDC DE60: MOV DEPOT1,R0UE 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 DESM ;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 DI1L,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 ;PSPLAY SUB DEOFYD,R0 MOV DELST+2,R1 MOV R0,DISOFY(R1) MOV R1,R0 ;CALL DISPLAY SETUP .IFDF VR14$ JSR PC,DISET .ENDCASS ADD. OF DISPLY TABLE. .IFDF VR14$ JSR PC,DISET ;CALL DISPLAY TO SET START ADD. .ENDC .IFDF GT40$ MOVB #1,DISSKP(R1 .IFDF GT40$ MOVB #1,DISSKP(R1) ;SET TO RECAL DISP. JSR PC,GTSET .ENDC ;MOVE DISPLAYS HORIZONTALLY FOR BOTH ;DSP ASPLY .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 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 ADD #-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 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 OR SINGLE DISPLAY BR DFXCV5 DFXCV4: CMPB #1,DEFLG1 ;TEST FOR SINGLE DISPLAY BEQ DFXCVE CMP R1,#DEDIT2 ;TEST IF DUAL OUTMOV #4,R0 DEFRC3: TSTB VCSTAT(R5) BPL DEFRC3 BIC #4,VCSTAT(R5) ;INTENSIFY ON Y ADD #-10,VCX(R5) ADD #-10,VCY(R5) DEFRPUT DONE. BEQ DFXCVE MOV #DEDIT2,R1 ;DO BOTTOM DISPLAY DFXCV5: MOV R1,R2 ;CALCULATE POINTER TO CURSOR ADD #DISXC1,R2 ;OUC2: TSTB VCSTAT(R5) BPL DEFRC2 ADD #4,VCY(R5) DEC R0 BNE DEFRC2 DEFRC4: TSTB VCSTAT(R5) BPL DEFRC4 .ENDC RTS PC TPUT MOV #2,R3 ;X POSITION =(T-CURSOR VAL)*N+S+1 DFXCV3: MOV DIST(R1),R0 ;GET # OF POINTS TO DISPLAY SUB (R2)+,R0 ;SU .ENDC DE29JJ: JMP DERTN .IFNDF DA$5 & DA$11 DE14: BR DE29JJ .ENDC .IFDF DA$5 .IFDF VR14$ ;SHOW FREE CURSORS DBTRACT CURSOR OUTPUT POSITION FROM MOV DISN(R1),R5 ;# OF POINTS AND MULT. RESULT JSR PC,MULT ;BY THE TABLE DELTA INC R5 ;ABOVE SCREEN TOP MOV DEDYSZ,R3 ;SAVE VALUE IN R3 DE14A: MOV R3,DEGYL CMP DEPOTS,DEPOT1 ;TEST IF LEFT CURSOR TO LEFT OR RIOFFSET 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 DGHT CURSOR. BLO DE15 MOV DEPOTS,DEPOT1 DE15: MOV DEPOT1,R0 ;LOAD RIGHT X ADD #40000,R0 MOV R0,DEGXR MOV DEPOT3,R2 ;LOFCV2 BMI DFCV3 DFCV4: ASR R0 ;POSITIVE SCALE NUMBER DEC R5 BNE DFCV4 BR DFCV2 DFCV3: ASL R0 ;NEG SCALE NUMBER INAD RIGHT Y VALUE CMP R2,DEDYSZ ;TEST IF POT VALUE IS BLE DE15A ;ABOVE SCREEN TOP MOV DEDYSZ,R2 ;SAVE VALUE IN R2 DE15A: 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 12;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, ;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 JS 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 R 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)+),-(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 R4,$POLSH $CMR ;CMP LIM, N AND BRANCH .+2 ;IF LIM.GT.N, STACK=LIM,10 BGT DFXCS1 DEC DEDCVZ ;SET # OF DECIMAL PLACIVD MOV R0,DEDLYF ;FRACTIONAL DELTA Y MOV #DELTA1,R5 ;CALCULATE VECTOR 1 JSR PC,DELS MOV #DELTA2,R5 ;CALCULATE VECTOR 2 ES=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 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 BMOV 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,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 SP ;DONE POP LIM, 10 OFF STACK ADD #200,DEDCVZ ;SET COMMAND TABLE MOVB DEDCVZ,DFXCT5+1 ;WORD FOR DECIMAL PLACES ;TO OUR3 ;TEST IF DELTA Y DONE BEQ DEL7 ;BRANCH IF YES TSTB DELMDY ;CHANGE Y UP OR DOWN BEQ DEL8 ;DEPENDING ON THE SLOPE A(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 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 @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 NEGA5 ;TEST FOR 0 DX. MOV DEPOTS,DEX0 ;SET INITIAL X CLR DEY0 ;SET INITIAL Y MOV #41.,DEDELY ;SET DELTA Y CLR DEDLYF ;CLRTE DELTA Y VALUE ADC DEDELY NEG DEDELY DE26: MOV R0,DEDLYF ;STORE DELTA Y FRACTION MOV DEDELY,R1 ;SET DELTA Y=R1, R0 M DELTA Y FRACTION CLR DEDELX ;CLR DELTA X MOV #100.,DEDRBS ;SET #PTS JMP DE27 ;DISPLY LINE DE55: MOV #41.,DEDELX ;SET SOV 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: TSTTANDARD DELTA X SUB R3,R2 ;DY BPL DE16 NEG R2 ;NEGATIVE DY INCB DELMDY ;SET MINUS DY FLAG DE16: MOV R1,R0 MOV R3,R 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 5 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 ;T .IFDF AR11$ CMP #1777,R3 .ENDC .ENDC BLO DE22 ;YES .IFDF VR14$ .IFDF LPS11$ CMP #7777,R4 ;TEST IF X TOO BIG .DD 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 ABA 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 1,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 ;TEST IF DONE. BNE DE28 .ENDC .ENDC .ENDC DERTN: RTS PC ;A/D POT INTERRUPT READ ROUTINE DEPOTR: MOV R0,-(SP) MOV.TITLE SPCQA ;LAB APPLICATION-11 DATA EDITOR ROOT SECTION ;DEC-11-SLABA-C-LA14 ;FILE SPCQA.MAC ;FILE ID SPCQA.1 .CSECT SPCQ R1,-(SP) MOV LPSSAD,R1 .IFDF LPS11$ MOV #1,@LPSSAD ;START A/D .ENDC .IFDF AR11$ .IFNDF ARPOL$ MOV #20001,@LPSSAD A ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR;UNIPOLAR DATA .ENDC .IFDF ARPOL$ MOV #1,@LPSSAD ;BIPOLAR DATA .ENDC .ENDC DEPOTH: TSTB @LPSSAD ;WAIT FOR A/D BP USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWAREL DEPOTH ADD #400,@LPSSAD ;SET TO NEXT CHANNEL MOV ADBUF(R1),R0 ;READ VALUE,AND 0 TWO LOWER BITS. .IFDF LPS11$ CMP R0,#7, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYENDC .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 ATA ;MOP ;MCL ;MRE .ASCII /DDU/ ;DLI=DRAW LINE ;DWI=WINDOW DISPLAY ;UNO=NO STORE ;SINGLE PRECISI .ASCII /UXNEAOTRDPLE/ .ASCII /IIO/ .ASCII /OA/ .ASCII /SNUCODUUIIPV/ .ASCII /TOPCONBLDVVEMREMT/ .ASCII /DIU/ .AON ARG. ONLY DECJT2 .ASCII /DD/ ;DPO=SET # OF SCOPE POINTS ;DTA=SET TABLE DELTA ;COMMANDS WITH BUFFERS AND OPTIONASCII /UD/ .BYTE 0 ;BUFFER TYPE COMMAND DEBUCT: .BYTE 3,1,'S,'F,0 ;S=0, F=1 .EVEN ;ALWAYS INSERT NEW COMMANDS IN SSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. L ARGS ;COMMANDS NEED A BUF DECJT3 ;ARG ARE OPTIONAL .ASCII /DMMFBBBBBDDD/ ;DAS=ASSIGN BUFFERS ;MIN=MASS STOR ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGIAGE OUTPUT ;MOU=MASS STORAGE OUTPUT ;FCC=CROSS CORRELATION ;BMO=MOVE DATA TO BUFFER ;BAD=ADD DATA IN BUF TAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS ;BSU=SUBTRACT DATA IN BUF ;BMU=MULT 2 BUFFERS ;BDI=DIVIDE 2 BUFFERS. ;DDI=DISPLAY ;DSP=DISPLAY SPLIT SCREENOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;GT40$ ;IF DEFINED GT40 IN ;DOV=DISPLAY OVER ;OPTIONAL BUFFER AND ARG ;BUF INPUT IS OPTIONAL DECJT4 .ASCII /FFFFDBDBDDDBBPPBB/ S DISPLAY, ELSE VR14 ;DA$2 ;IF DEFINED ADDITIONAL FUNCTION CHECK MADE ;VR14$ ;IF DEFINED VR14 IN USE ;DEFINITIONS ;FFT=FFT ;FPO=POWER SPECTRUM ;FMP=PHASE OF FFT ;FAC=AUTO CORRELATION ;DNO=NORMALIZE ;BIN=INTEGRATE R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;VALUE DEFINITIONS FOR QA CALL QASP=1 QAFLO=10 QAALP=20 QAMIX=100 ;DTB=DUAL DISPLAY DEFAULT POINTER ;BAL=A LIGN TWO BUFFERS ;DID=DISPLAY ID ;DFV=DISPLAY FREE CURSOR VALUES ; QASIL=400 QADWA=1000 QAAO=4000 ;EXTERNAL GLOBAL SYMBOLS. .GLOBL DENOST,DEXFG,DEE30,DEEXIT .GLOBL QADATF,QAERR,QAANS,QADCV=DISPLAY FIX CURSOR VALUES ;BDE=DERIVATIVE ;BMM=MIN-MAX SEARCH ;PWR=WRITE DATA ;PRE=READ INPUT, PAPER TAP,QAXCHS .IFDF DA$2 .GLOBL DETBX .ENDC .GLOBL DEFORE,DECMD,DECMD1,DEDATS,DECJT,DECOMT,DECJTE ;-----COMMAND TABLES----- E ;BSM=SMOOTH DATA ;BST=STRIP DATA ;COMMANDS WITH BUFFERS AND VALUES .ASCII /SSS/ ;NEED ARG AND OPTIONAL BUF DECOMT: .BYTE 52. ;NUMBER OF COMMANDS +1 .BYTE 3 ;FIRST COMMAND ;COMMANDS WITH NO ARGUMENTS ;COMMAND SET DECJT-DEDECJT5 ;SAD=OFFSET Y ;SDI=DIVIDE BY SCALAR ;SMU=MULTIPLY BY SCALES ;NEED BUFFER AND ARG DECJT6 .ASCII /BCJT1 .ASCII /DDDDDDEDBMMM/ ;DCU=CURSOR ;DEX=EXPAND SCOPE ;DIN=MORE SCOPE POINTS X2 ;DDE=LESS SCOPE POINTS /2 A/ ;BBU=BUFFER SETUP ;AAD=AD SAMPLING .BYTE 0 ;TABLE OF SECOND LETTERS. .ASCII /CEIDRLXFDOCR/ .ASCII /LWN/ .AS ;DRA=SCALE SCOPE UP X2 ;DLO=SCALE SCOPE DOWN/2 ;EXT=EXIT TO MONITOR ;DFR=FREE CURSOR ;BDD=BUFFER DEFINE DCII /PT/ .ASCII /AIOCMASMDDSO/ .ASCII /FPMANITAIFCDMWRSS/ .ASCII /ADM/ .ASCII /BA/ .BYTE 0 ;TABLE OF THIRD LETTERS GT40$ .IFDF SPDFR$ .GLOBL DEDTA DEDTA .ENDC .IFNDF SPDFR$ 0 .ENDC 0 .ENDC .ENDC .IFDF SPNDI$ 0,0 .ENDC.IFDF SPSAD$ .GLOBL DEOF,DEDV,DEMU DEOF,DEDV DECJT5: DEMU .ENDC .IFNDF SPSAD$ 0,0 DECJT5: 0 .ENDC .IFDF SPBBU$ .IFDF SPMOP$ .GLOBL DEINP,DEOUT DEINP,DEOUT .ENDC .IFNDF SPMOP$ 0,0 .ENDC .IFDF SPFAC$ .GLOBL DECC DECC . .GLOBL DEBU DEBU .ENDC .IFNDF SPBBU$ 0 .ENDC DECJT6: .IFDF SPAAD$ .GLOBL DESAD DESAD .ENDC .IFNDF SPAAD$ ENDC .IFNDF SPFAC$ 0 .ENDC .IFDF SPBMO$ .GLOBL DEMO DEMO .ENDC .IFNDF SPBMO$ 0 .ENDC .IFDF SPBAD$ .GLOBL 0 .ENDC DECJTE: 177777 DESET1=DECJT1-DECJT+2 DESET2=DECJT2-DECJT DESET3=DECJT3-DECJT DESET4=DECJT4-DECJT+2 DESET5= DEAD,DESU,DEBMU,DEBDI DEAD,DESU,DEBMU,DEBDI .ENDC .IFNDF SPBAD$ 0,0,0,0 .ENDC .IFDF SPDDI$ .GLOBL DEDI DEDI .DECJT5-DECJT+2 DESET6=DECJT6-DECJT ; TEST FOR ANY COMMAND DEE30: CLR DEXFG JSR R5,QA QAAO+QADWA+QAALP DECOMT TSTBENDC .IFNDF SPDDI$ 0 .ENDC .IFDF SPDSP$ .GLOBL DESPLT,DEDOV DESPLT DECJT3: DEDOV .ENDC .IFNDF SPDSP$ 0 DECJT QADATF ;TEST FOR COMMAND BNE DE32 TSTB QAERR ;TEST FOR BLANK LINE BNE DE53 JMP DE001 ;NO COMMAND ! DE53: JMP DE002 ECTION, ;ABOVE LAST ELEMENT OF SECTION ;-----COMMAND JUMP TABLE----- DECJT: .IFDF SPDFR$ .GLOBL DEXCUR DEXCUR .EN3: 0 .ENDC .IFDF SPFFT$ .GLOBL DEFF DEFF .ENDC .IFNDF SPFFT$ 0 .ENDC .IFDF SPFPO$ .GLOBL DEPW,DEPH DEPW,DEDC .IFNDF SPDFR$ 0 .ENDC .IFNDF SPNDI$ .IFDF SPDIS$ .IFDF VR14$ .GLOBL DIXCMD,DIICMD,DIDCMD,DIRCMD,DILCMD DIXCMD,PH .ENDC .IFNDF SPFPO$ 0,0 .ENDC .IFDF SPFAC$ .GLOBL DEAC DEAC .ENDC .IFNDF SPFAC$ 0 .ENDC .IFDF SPDNO$ DIICMD,DIDCMD,DIRCMD,DILCMD .ENDC .IFDF GT40$ .GLOBL GTXCMD,GTICMD,GTDCMD,GTRCMD,GTLCMD GTXCMD,GTICMD,GTDCMD,GTRCMD,GTLCMD .GLOBL DENO DENO .ENDC .IFNDF SPDNO$ 0 .ENDC .IFDF SPBIN$ .GLOBL DEIN DEIN .ENDC .IFNDF SPBIN$ 0 .ENDC .ENDC .ENDC .ENDC .IFDF SPNDI$ 0,0,0,0,0 .ENDC DEEXIT .IFDF SPDFR$ .GLOBL DEFR DEFR .ENDC .IFNDF SPDFR$ .IFDF SPDTB$ .GLOBL DETOPB DETOPB .ENDC .IFNDF SPDTB$ 0 .ENDC .IFDF SPBAL$ .GLOBL DEALGN DEALGN .ENDC . 0 .ENDC .IFDF SPBDD$ .GLOBL DEDEFD DEDEFD .ENDC .IFNDF SPBDD$ 0 .ENDC .IFDF SPMOP$ .GLOBL DEOPN,DECLO,DEREIFNDF SPBAL$ 0 .ENDC .IFDF SPDID$ .GLOBL DEID,DEDFRC,DEDFXC DEID,DEDFRC,DEDFXC .ENDC .IFNDF SPDID$ 0,0,0 .ENDCW DEOPN,DECLO,DEREW .ENDC .IFNDF SPMOP$ 0,0,0 .ENDC .IFDF SPDFR$ .GLOBL DEDR,DEWI DEDR,DEWI .ENDC .IFNDF SPD .IFDF SPBDE$ .GLOBL DEDE DEDE .ENDC .IFNDF SPBDE$ 0 .ENDC .IFDF SPBMM$ .GLOBL DEMM DEMM .ENDC .IFNDF SPFR$ 0,0 .ENDC DECJT1: DENOST .IFDF SPDFR$ .GLOBL DEDPO DEDPO .ENDC .IFNDF SPDFR$ 0 .ENDC DECJT2: .IFNDF SPBMM$ 0 .ENDC .IFDF SPPWR$ .GLOBL DEWR,DERE DEWR,DERE .ENDC .IFNDF SPPWR$ 0,0 .ENDC .IFDF SPBSM$ .GLOBL DESNDI$ .IFDF VR14$ .GLOBL DINCMD DINCMD .IFDF SPBBU$ .GLOBL DEAS DEAS .ENDC .IFNDF SPBBU$ 0 .ENDC .ENDC .IFDFM DESM .ENDC .IFNDF SPBSM$ 0 .ENDC DECJT4: .IFDF SPBST$ .GLOBL DEST DEST .ENDC .IFNDF SPBST$ 0 .ENDC ;BAD INPUT VALUE BR DE33B DE31: TSTB QAXCHS ;TEST FOR EXCESS CHARACTERS BNE DE33 TST DECJT(R1) ;TEST FOR NON EXISTENT CITH END CODE .IFDF DA$2 DE57: TSTB DEXFG ;TEST FOR EXTENSION COMMAND BEQ DE41 ;NO MOV DETBXX,R0 ;GET ADD. OF X TABLE OMMAND. BEQ DE33 CMP R0,#DESET2 ;TEST IF COMMAND HAS BHI DE35 ;MULTIPLE ARGS. CMP R0,#DESET1 ;TEST FOR SINGLE ARGUMENT. MOV R4,R1 ADD @-2(R0),R1 ;GET ADD OF JUMP TABLE JMP DE45A .ENDC .IFNDF DA$2 DE57: .ENDC ;TEST FOR INPUT FORMAT E BLO DE34 ;COMMAND HAS ONE S.P. ARG. JSR R5,QA QASIL+QASP TSTB QAERR BEQ DE34A JMP DEFORB DE34A: MOV QAANS,R0 RRORS. DE41: CMP R4,#DESET3 ;TEST FOR COMMANDS WITH BHI DE42 ;BUFFERS NECESSARY DECJT3 TST DECMD ;BUF. NECESSARY, TEST FO BLE DE33F DE34: MOV DECJT(R1),R1 JMP DE45A DE35: MOV R0,R4 ;SOME COMMAND INDEX ;GET ARGUMENTS. MOV #DECMD,R1 ;SET R IT. BMI DE33D BR DE45 DE42: CMP R4,#DESET5 ;TEST FOR BUF OPTIONAL DECJT4,5 BLO DE43 ;YES BEQ DE45 ;BU COMMAND. CMPOINTERS FOR COMMAND MOV #4,R2 ;PARAMETERS. DE36: JSR R5,QA QASIL+QAMIX DEBUCT TSTB QAERR ;NOT BUFFER ARG IF ERROR. P R4,#DESET6 ;TEST FOR BUF AND ARG NECESSARY. ;DECJT6 BHI DE45 ;BUF AND ARG OPTIONAL. TST DECMD ;BUF AND ARG NECESSAR BNE DE37 TSTB DEXFG ;TEST FOR EXPAND TABLE. BNE DE56 CMP R4,#DESET5 ;TEST FOR BU COMMAND BEQ DE46 ;TEST FOR BUFFEY DECJT6 BMI DE33D BR DE44 DE43: CMP R4,#DESET4 ;TEST FOR OPTIONAL ARG BLO DE45 DE44: CMP DECMD1,#177777 ;ARGUMENTS NECER NUMBER DE56: MOV R0,R3 ;TEST S.P. OR F.P. BUY # ASL R3 ASL R3 CMP QAANS,DEDATS(R3) ;COMPARE INPUT TO BUF BHI DE33C SSARY BEQ DEFORB DE45: MOV DECJT(R4),R1 DE45A: ADD #2,(SP) ;CALL THE COMMAND ASKED FOR DE001: ADD #2,(SP) ;SET UP FOR NXT;NUMBERS SIT BY COMMAND. ;BRANCH ON ERROR. DE46: MOVB QAANS,(R1)+ ;STORE BUF NUMBER. BEQ DE33C ;BUFFER # CAN'T BE 0 B POT SCAN DE002: ADD #2,(SP) ;OUTPUT A # ON TERMINAL DEFORB: RTS PC ;ERROR RETURN .END ;ONLY A CR ! DE32: ASL R0 ;MULTIPLY COMMAND # BY 2 TO RELATE ;TO WORDS. MOV R0,R1 BPL DE31 ;TEST FOR COMMAND ERROR IT #177600,QAANS ;TEST FOR TOO MANY BUFFERS BNE DE33E MOVB R0,(R1)+ ;AND BUFFER TYPE 0=SP, 1=FP. DE49: DEC R2 ;TEST FOR 3 .IFDF DA$2 TST DETBXX ;TEST FOR EXTENSION TABLE BEQ DE33 ;NO JSR R5,QA ;TEST FOR X COMMAND. QASIL+QAALP DETBXX: DEBUFFER ARGS. BNE DE36 BR DE38 DE37: MOV #177777,(R1)+ ;STORE BUF ARG END CODE. BR DE49 ;FILL REMAINING SPACE WITH END COTBX ;LOCATION TO LINK IN ADDRESS ;OF COMMAND TABLE INCB DEXFG ;SET X FLAG. ASL R0 ;SHIFT FOR WORDS. BPL DE35 ;TEDE DE38: MOV #DECMD1,R1 ;GET FLOATING INPUT MOV #5,R2 DE40: JSR R5,QA QAFLO+QASIL TSTB QAERR ;NO MORE INPUT ON ERROR. ST FOR COMMAND ERROR. .ENDC DE33: MOV #50,R0 ;BAD COMMAND NAME DE33B: JMP DEFORE DE33C: MOV #57,R0 ;NON-EXISTENT BUF. B BNE DE39 MOV QAANS,(R1)+ ;STORE F.P. NUMBER IN MOV QAANS+2,(R1)+ ;PARAMETER TABLE. DE50: DEC R2 ;TEST IF 4 FOUND. BNE DR DE33B DE33D: MOV #2,R0 ;SPECIFY A BUF. BR DE33B DE33E: MOV #61,R0 ;MAX # OF BUFFERS =127 BR DE33B DE33F: MOV #13.,R0 E40 BR DE57 DE39: MOV #177777,(R1)+ ;STORE BUF END CODE IF MOV #177777,(R1)+ ;LESS THAN 4 FOUND. BR DE50 ;FILL NUMBERS W.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 FETCHEDN 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=%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 LPISE 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;OUTPUT USAGE ;OUTPUT IS MADE TO THE TERMINAL, EITHER ;ONE CHARACTER AT A TIME OR A MESSAGE. THE OUTPUT CAN ;GO TO THE TTY, CHARACTER. TTYECH: .BYTE 0 ;ECH/NO ECHO FLAG - NOT USED BY THIS ROUTINE TTYEOL: .BYTE 15 ;TTYEOL ALSO NOT USED BY THIS ROUTINLPT, 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 E ;KEPT FOR COMPATIBILITY WITH OTHER TTY ROUTINE ;ROUTINE TO TEST IF A LINE IS IN ;JSR,PC,TTYTST ;NO DATA RETURN ;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- ;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 ADDRD 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 ; ;FOUND ONE DEC R0 ;SEARCHED ALL OF BUFR? BNE TYTS3A ;NO BR TYTS3C ;YES TYTS3B: INCB TTYCON ;SET CONTINUATION FLG 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 ;TES.ENDC TYTS3C: ADD #2,20(SP) ;EXIT, VIA SUCESS EXIT BR TYTS2 ;INPUT INITIATION ROUTINE, TO GET A LINE OF INPUT. ;JSR PC,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 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 ;ROUTINEONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR STARG MUST BE USED TOGETHER ;THE STACK AFTER A CALL TO SAVRG IS ;PC TO SAVRG, R1, R2, R3, R4 IS AT THE TOP OF THE STACK ;THE ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM STACK AFTER A CALL TO SAVARG IS ;PC TO SAVARG, R0, R5, PC TO SAVRG, R1, R2, R3, R4 AT THE ;TOP OF THE STACK. .IFDF SAVRG$ AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;TSAVRG: MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) JMP @10(SP) ;RETURN VIA PC LEFT ON THE STACK ;TO BE CLEHE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EANED UP BY RSTRG. ;SUBROUTINE TO RESTORE REGISTERS RSTRG: MOV (SP)+,10(SP) ;STORE RETURN PC IN PC ;LEFT BY SAVRG. MQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 RTS PC SAVARG: MOV R0,-(SP) MOV R5,-(SP) JSR PC,SAVRG JMP @1UPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;THIS MODULE IS A COLLECTION OF USEFUL SUBROUTINES ;AS6(SP) ;RETURN VIA PC LEFT ON STACK ;RSTARG WILL CLEAN PC OFF STACK. RSTARG: MOV (SP)+,16(SP) ;STORE RETURN PC IN OLD PCSEMBLY PARAMETERS ;IF DEFINED INCLUDE ;SAVRG$ SAVE REGISTER ;LISTC$ LIST COMPARE ;MULT$ MULTIPLY ;MULTS$ SIGN MULTIPLY ;DI ;LEFT ON THE STACK BY SAVARG JSR PC,RSTRG MOV (SP)+,R5 MOV (SP)+,R0 RTS PC .ENDC .IFDF LISTC$ ;LISTCP ;SUBBUFSIZ-BYTES .BYTE 0,0 ;FORMATTED ASCII 1 ;BYTE COUNT CAPSDA: .BYTE 0 ;DATA BYTE .EVEN CAPFLG: 0 .ENDC .END V$ DIVIDE ;MULR0$ SIMULATE MUL SRC,REG ;DIVR0$ SIMULATE DIV SRC,REG ;EAE EXTENDED ARITHMETIC UNIT AVAILABLE ;EIS EXTENDED INSTRUCTION SET ABAILABLE ;REGISTER DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .IFDF EAE DIV=177300 AC=177302 MQ=177304 MUL=177306 EAESR=177311 .ENDC ;EXTERNAL GLOBAL SYMBOLS .IFDF SAVRG$ .GLOBL SAVRG,RSTRG,SAVARG,RSTARG .ENDC .IFDF LISTC$ .GLOBL LISTCP .ENDC .IFDF MULT$ .GLOBL MULT .IFDF MULTS$ .GLOBL MULTS .ENDC .ENDC .IFDF D.TITLE GENS ;LAB APPLICATIONS-11 GENERAL SUBROUTINES ;DEC-11-SLABA-C-LA4 ;FILENAME GENS.MAC ;FILE ID GENS.4 .CSECT GENS IV$ .GLOBL DIVR,DIVD,DIVQH,DIVRH,DIVDSH,DIVDNH .ENDC .IFNDF EIS .IFDF MULR0$ .GLOBL MULR0 .ENDC .IFDF DIVR0$ .GLOBL DIVR;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE 0 .ENDC .ENDC ;SUBROUTINE TO SAVE REGISTERS ;THE SUBROUTINES SAVRG AND RSTRG MUST BE USED TOGETHER ;THE SUB. SAVARG AND RDESTROYED, ANSWER IS RETURNED ;IN IT ;THE CTRL TABLE LOOKS LIKE FOR EXAMPLE ;.BYTE 'A,'B,'C,'D,0 ;.EVEN LISTCP: JSR PC,SA6.,R4 MULT2: ROR R5 ;MULTIPLIERS IN R0,R5. BCC MULT1 ;BINARY MULTIPLY, TEST IF 0,1. ADD R0,R2 ;ADD R3,R0 TO PRODUCT ADVRG MOV 14(SP),R2 ;GET ADDRESS OF LIST CLR R3 ;CLEAR COUNT LISTC4: TSTB (R2) BEQ LISTC3 CMPB R0,(R2)+ ;COMPARE LIST VAC R1 ADD R3,R1 MULT1: ASL R0 ;SHIFT R3,R0 ONE BIT LEFT. ROL R3 DEC R4 ;TEST IF DONE BNE MULT2 MOV R1,R0 ;RETURN ANLUE BEQ LISTC1 INC R3 ;INC COUNT BR LISTC4 ;TEST FOR END LISTC3: MOV #-1,R3 ;END, FOUND 0, NEGATIVE ANS. LISTC1: MOV SWER IN R0,R5. MOV R2,R5 TST (SP)+ ;TEST FOR NEG OUTPUT .IFDF MULTS$ .IFNDF EIS ! EAE BEQ MULT6 NEG R5 ;NEGATE ANSR3,R0 JSR PC,RSTRG MOV (SP)+,(SP) ;POP AND SAVE RETURN ADD. RTS PC ;OVER INPUT ADD. .ENDC ;SINGLE PRECISION MULTIPLY. ADC R0 NEG R0 .ENDC .ENDC MULT6: JSR PC,RSTRG RTS PC .ENDC ;DOUBLE PRECISION DIVIDE ROUTINE ;BOTH NUMBERS A ROUTINE ;CALLING SEQUENCE ;FOR ABSOLUTE MULTIPLICATION ;2 VALUES IN R0,R5 ;JSR PC,MULT ;FOR SIGN MULT. THE CALLING SEQ. RE CONSIDERED TO BE POSITIVE ;THE DIVIDE ROUTINE CAN BE CALLED EITHER AS A ;SINGLE OR DOUBLE PRECISION ROUTINE ;THE DIVIDENIS ;PUT THE VALUES IN R0,R5 ;JSR PC, MULTS ;IN BOTH CASES THE ANSWER IS RETURNED IN ;R0,R5, R5 IS THE LOW ORDER PORTION. ;TD DIVDNH WITH THE LOW ORDER ;PART IN R5. ;THE DIVISOR DIVDSH WITH THE LOW ORDER ;PART IN R0. ;THE QUOTIENT IS IN DIVQH AND THE MULTIPLICATION IS DONE BY BINARY ;MULTIPLICATION ;ONLY R0,R5 ARE CHANGED .IFDF MULTS$ MULT$=1 .ENDC .IFDF MULT$ HE LOW ORDER PART ;IS IN R0 ;THE REMAINDER IS IN DIVRH AND THE LOW ORDER PART ;IS IN R5 ;THE DIVIDE ROUTINE IS CALLED AS FOL .IFDF MULTS$ MULTS: .IFDF EIS MOV R4,-(SP) ;SAVE REG CLR R4 ;CLR HIGH ORDER PART MUL R0,R4 MOV R4,R0 ;HIGH ORDER PARLOWS. ;LOAD THE LOW ORDER DIVISOR IN R0 ;LOAD THE LOW ORDER DIVIDEND IN R5 ;SET DIVDSH AND DIVDNH THE HIGH ORDER PART OF ;THT MOV (SP)+,R4 ;RESTORE REG RTS PC .ENDC .IFDF EAE MOV R5,@#MQ ;PUT 1ST # IN MQ MOV R0,@#MUL ;MULT BY 2ND # MOV @E DIVISOR AND DIVIDEND RESPECTIVELY. ;AND CALL ; JSR PC,DIVD ;FOR SINGLE PRECISION DIVISION JUST USE R0 FOR ;THE DIVISOR AND#MQ,R5 ;LOW ORDER PORDUCT MOV @#AC,R0 ;HIGH ORDER PRODUCT RTS PC .ENDC .IFNDF EIS ! EAE JSR PC,SAVRG ;SIGNED MULT R5 FOR THE DIVIDEND AND CALL ; JSR PC,DIVR ;ONLY REGISTERS R0,R5 ARE CHANGED. ;IF THE DIVISOR IS 0 ;THE QUOTIENT IS ALL 1'SROUTINE TO COMPARE A LIST OF CTRL ;VALUES IN BYTES AGAINST AN 8 BIT ;VALUE IN R0 ;THE LIST IS IN BYTES AND ENDS WITH ZERO. ;CLR -(SP) ;CLEAR SING VALUE TST R0 ;TEST FOR NEG R0 BPL MULT4 NEG R0 ;SET POS. COM (SP) ;SET NEG OUTPUT SIGN MULT4:THE INDEX INTO THE LIST IS RETURNED IN ;R0, 0 IS THE FIRST VALUE ;A -R0 IS RETURNED IF NO MATCH ;CTRL TABLE MUST HAVE AT LEAS TST R5 ;TEST FOR NEG R5 BPL MULT5 NEG R5 COM (SP) ;RESET SIGN BR MULT5 .ENDC .ENDC MULT: JSR PC,SAVRG CLR -(SPT 1 NON ZERO VALUE. ;TO CALL PUSH ADD OF LIST ONTO STACK ;PUT CHARACTER VALUE IN R0 ;JSR PC,LISTCP ;R0 IS THE ONLY REGISTER ) ;CLEAR SIGN MULT5: CLR R1 ;HIGH ORDER PRODUCT CLR R2 ;LOW ORDER PRODUCT CLR R3 ;SHIFT REGISTER FOR R0 VALUE. MOV #1 .IFDF DIV$ DIVR: CLR DIVDNH CLR (PC)+ DIVDSH: 0 ;DIVISOR DIVD: JSR PC,SAVRG ;SAVE REGISTERS CLR R4 ;CLEAR REMAINDAE MOV R2,-(SP) ;PUSH TWO REGISTERS AND A FLAG MOV R4,-(SP) CLR -(SP) TST R0 ;CHECK SIGNS BPL 2$ NEG R0 ;TAKE ABSOER CLR DIVRH CLR R3 ;CLEAR QUOTIENT CLR DIVQH MOV #32.,R2 TST DIVDNH ;TEST IF DIVIDEN HIGH IS 0. BNE DIV1 MOV #1LUTE VALUES INC @SP ;AND FLAG NEGATIONS 2$: TST R1 BPL 4$ NEG R1 DEC @SP ;MINUS*MINUS=PLUS 4$: MOV #17.,R2 ;COUNT I6.,R2 MOV R5,DIVDNH DIV1: ASL R5 ;SHIFT NEXT DIVIDEN BIT INTO. ROL (PC)+ ;THE REMAINDER. DIVDNH: 0 ;DIVIDEND ROL R4 TERATIONS CLR R4 ;HIGH ORDER PRODUCT BUILT HERE 6$: CLC ;CLEAR CARRY FOR ROTATES ROR R4 ;SHIFT MULTIPLIER AND PARTIAL P ROL (PC)+ DIVRH: 0 ;REMAINDER ASL R3 ;SHIFT QUOTIENT ROL (PC)+ DIVQH: 0 ;QUOTIENT CMP DIVDSH,DIVRH ;TEST IF DIVISRODUCT ROR R1 BCC 8$ ;NO ADD NEEDED ADD R0,R4 8$: DEC R2 ;COUNT ITERATION BGT 6$ TST R4 ;WAS RESULT DOUBLE? BNE OR IS GREATER BHI DIV2 ;THAN REMAINDER BLO DIV3 CMP R0,R4 ;HIGH ORDER EQUAL, LIST LOW. BHI DIV2 DIV3: INC R3 ;NO, SH10$ ;YES CMP R1,#100000 ;MAYBE BLO 12$ ;DEFINITELY NOT BHI 10$ ;DEFINITELY TST @SP ;SPECIAL CASE -2**15 OK BNE 12$IFT A 1 INTO QUOTIENT. SUB R0,R4 ;SUBTRACT DIVISOR FROM REMAINDER. SBC DIVRH SUB DIVDSH,DIVRH DIV2: DEC R2 BNE DIV1 ;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 MOV R3,R0 MOV R4,R5 JSR PC,RSTRG RTS PC .ENDC .IFNDF EIS .IFDF MULR0$ ;MULR0 SUBROUTINE TO SERVE $MUL SRC,REG MACR 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 .ENO ;USED TO SIMULATE THE INTEGER MULTIPLY INSTRUCTION WHEN THE USER ;DOES NOT HAVE THE EXTENDED INSTRUCTION SET (EIS). ;CALLEDC .IFDF DIVR0$ ;DIVR0 32 BY 16 BIT DIVIDE TO SUPPORT MACRO $DIV SRC,R0 ;CALLED BY USING THE MACRO $DIV SRC,R0 ;WHICHD BY THE FOLLOWING ; MOV SRC,R1 ; JSR PC,MULR0 ; RETURNS HIGH PRODUCT IN R0, LOW IN R1 ;ON RETURN ONLY C-BIT OF CONDITION CO EXPANDS TO THE FOLLOWING WHEN EIS IS NOT AVAILABLE: ; MOV SRC,-(SP) ; JSR PC,DIVR0 ; ON RETURN R0 CONTAINS QUOTIENT, R1 CODES IS MEANINGFUL ;C=1 IMPLIES MORE THAN 16-BIT PRODUCT, C=0 IMPLIES SINGLE PREC. OK ;THE MACRO $MUL SRC,REG WILL ALSO GENERNTAINS REMAINDER ; SIGN OF REMAINDER SAME AS SIGN OF DIVIDEND ; CONDITION CODES N AND V CORRECTLY SET, Z AND C NOT DIVR0: .ATE THIS CALLING SEQUENCE ;WHEN THE CONDITIONAL ASSEMBLY PARAMETER 'EIS' IS NOT DEFINED. MULR0: .IFDF EAE MOV R1,@#MQ ;PUIFDF EAE MOV R1,@#MQ ;LOW ORDER DIVEND MOV R0,@#AC ;HIGH ORDER DIFIDEND MOV 2(SP),@#DIV ;DIVIDE MOV (SP)+,@SP ;PUT RETT 1ST NUMBER IN MQ MOV R0,@#MUL ;MULTIPLY BY SECOND NUMBER MOV @#MQ,R1 ;LOW ORDER PRODUCT MOV @#AC,R0 ;HIGH ORDER PRODUCURN ADDR WHERE NEEDED MOV @#MQ,R0 ;QUOTIENT MOV @#AC,R1 ;REMAINDER ROLB @#EAESR ;SET N AND V RTS PC .ENDC .IFNDF T 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 ;AND ;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 INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIBEQ 11$ ;CHECK FOR OVERFLOW 9$: TST (SP)+ ;TEST FOR QUOTIENT ADJUSTMENT BEQ 10$ ;IF ZERO NONE NEEDED NEG R1 10$: MOV R0PMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPP,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 ;QAFLO$ FLOATI FILL IT WITH SOURCE MOV R3,-(SP) ;SAVE ANOTHER REGISTER CLR -(SP) ;SET UP A SIGN CONTROL WORD TST R0 BGE 1$ DECB 1(S 11$: TST @SP ;TEST FOR NEGATIVE BNE 9$ ;IF NEGATIVE, OK 12$: TST (SP)+ ;REMOVE SIGN WORD SEC ;MARK OVERFLOW 13$: MOVP) ;KEEP TRACK OF THE ORIGINAL NEG R0 ;SIGN AND NEGATE NEG R1 ;THE ORIGINAL NUMBER SBC R0 ; I 1$: TST R2 BEQ 12$ (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 .E;DIVISION BY ZERO IS A NO-NO BGT 2$ ;-> CHECK THE SIGN INC @SP ;AND KEEP TRACK AS ABOVE NEG R2 ; I 2$: MOV R2,R3 ;<-ND MOVE THE DIVISOR AND NEG R3 ;NEGATE FOR THE ALGORITHM ADD R3,R0 ;PREFORM THE INITIAL SUBTRACTION BCS 12$ ;CARRY SET IS 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 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.TITLE QA ;LAB APPLICATIONS-11 QUESTIONS AND ANSWERS ;DEC-11-SLABA-C-LA9 ;FILENAME QA.MAC ;FILE ID QA.1 .CSECT QAMOD ;CO 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 CARRPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY POSSIBLE 6$: DEC 2(SP) ;DECREMENT COUNTER BGT 3$ ;BRANCH IF MORE TO DO ROR R1 ;SEE ABOUT THE LAST CYCLE BCS 7$ ;OMIY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANYT CORRECTION IF ONE ADD R2,R0 ;CORRECT REMAINDER CLC 7$: ROL R1 ;REPLACE THE LAST BIT CMP (SP)+,(SP)+ ;POP TWO WORDS OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ANDTST @SP ;TEST FOR REMAINDER CHANGES BGE 8$ ;OMIT IF POSITVE NEG R0 ;NEGATE REMAINDER CLRB 1(SP) ;CLEAR SIGN DEC @SP TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE PE ;ADD ;ADDRESS OF MESSAGE, OPTIONAL ;ADD ;ADDRESS OF COMMAND TABLE, OPTIONAL. ;QA CAN BE CALLED WITH AN OFFSET ADDRESS I THE NUMBER CONVERTED ; TO A S.P. VALUE. ;8. SILENT QUESTION - NO QUESTION IS ASKED, AND THE ; NEXT ASCII ENTITY ON THF ;BIT 40000 IS SET IN THE TYPE WORD ;JSR R5,QA ;TYPE ;BIT 40000 MUST BE SET. ;MESS ADD-.-2 ;COM ADD-.-2 ;THE ANSWE LINE IS PROCESSED. THIS ; MODE IS USED TO PROCESS MORE THAN ONE INPUT ON ; A LINE. DOES NOT RESET BUFFER POINTER TO 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 THE BEGINING ; OF THE BUFFER. ;9. DON'T WAIT FOR ANSWER - AFTER THE QUESTION IS ; TYPED OUT, RETURN TO THE USER AND DOTYPE WORD. A CALL ;TO QA CAN GET ONE RESUET ONLY, BUT MULTIPLE CALLS ;CAN GET SEVERAL ANSWERS ON ONE LINE. HENCE IF 3 ANSWERN'T ; WAIT FOR AN ANSWER. ;10. MESSAGE ONLY - THE MESSAGE IS TYPED OUT, AND ; NO RETURN IS EXPECTED. ;11. ANSWER ONLY,S ;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 I DIDN'T WAIT FOR ANSWER - AFTER, ; A QUESTION IS ASKED AND THE ANSWER WAS NOT WAITED ; FOR, THE USER CAN RETURN TO GET TS USUALLY ENDED BY A CARRIAGE RETURN. ;LINE FEEDS ARE IGNORED, ONE CHAR CAN BE IGNORED. THE TTY ;MODULE DETERMINES THE LINE THE ANSWER ; LATER VIA THIS MODE. THIS MODE WILL RESET THE ; BUFFER TO THE BEGINING OF THE LINE. ;12. NULL QUESTION - 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. .IFDF QAFLO$ .GLOBL SAVARG,RSTARG,$RCI .IFNDF QASDO$ .GLOBL IFIX .ENDC .ENDC .IFDF QAALP$ .GLOBL LISTCP .ENDC ;3. OCTAL - CONVERT TO A D.P. OCTAL NUMBER. ;4. FLOATING - CONVERT THE ASCII TO A F.P. NUMBER ;5. ALPHANUMERIC COMMAND - .IFDF QASDO$ .GLOBL MULT .ENDC ;GLOBAL SYMBOLS INTERNAL .GLOBL QADATF,QAERR,QACONT,QADLIM,QACSKP .GLOBL QAANS,QA,QANCBTHE ASCII ENTITY BEING ; PROCESSED IS TO BE TESTED AGAINST A COMMAND LIST. ;6. STRING - THE ASCII ENT@Tt IS TO BE STORED ID,QANCDF,QANCMF,QABUFP,QAXCHS .IFDF QASDO$ .GLOBL QANCLL,QANCHL .ENDC ;QUESTION AND ANSWER ROUTINE ;THE QA ROUTINE IN A BUFFER ; THE STRING MUST START AND END WITH A DOUBLE QOUTE ; MARK ;7. MIXED MODE - THE ASCII ENTITY CONSISTS OF A S USED TO INTERPRET A COMMAND ;CONVERT A NUMBER, OR PRINT A COMMAND MESSAGE ;QA IS CALLED AS FOLLOWS ;JSR R5,QA ;ANSWER TY ; ALPHANUMERIC COMMAND AND A NUMBER (S.P.) ; TOGETHER, FOR EXAMPLE ST25. THE LETTERS ARE ; TREATED AS A COMMAND AND A REGULAR MESSAGE ; LINE FORMAT: ; AN EXAMPLE OF AN INPUT LINE COULD BE ; CA 25. S1 ; TO INTERPRET THIS LIN- = 0 IF INPUT WAS GOOD, ELSE =1 ; QANCBD - BYTE - = # OF PLACES BEFORE THE DECIMAL POINT IN ; S.P. AND D.P. INPUT E, 3 CALLS TO QA ARE NECESSARY. ; THE FIRST CALL COULD PRINT THE MESSAGE AND WAIT FOR ; THE ANSWER WITH THE TYPE, ALPHAN ; 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.UMERIC COMMAND. ; THE SECOND CALL WOULD BE SILENT QUESTION AND FLOATING ; INPUT, THE THIRD COULD BE SILENT QUESTION AND P. INPUT ; QANCMF - BYTE - = 1 IF S.P. OR D.P. # WAS NEGATIVE. ; QACONF-BYTE-SET =1 IF CONTINUATION CHAR. FOUND ; OTHERWIMIXED ; MODE. ; MESSAGE ADDRESS: ; IF A MESSAGE IS TO GE PRINTED, THE ADDRESS OF THE ; MESSAGE AS ADD-.-2 SHOUSE=0 ; QABUFP -WORD- POINTER TO INPUT BUFFER ; QAXCHS-BYTE-=1 IF THERE WERE EXCESS CHAR. ; TO AN ALP COMMAND ; OTHERWISE=0LD FOLLOW THE ; TYPE. THE MESSAGE FORMAT IS A CHARACTER A BYTE ; ENDED BY A 0 BYTE. ; COMMAND ADDRESS: ; IF A ; QANCLL - WORD - LOW ORDER ; QANCHL - WORD - HIGH ORDER INTEGER MAX LIMIT INPUT. ; IF A BIT IN QANCLL OR QANCH COMMAND IS ASKED THE COMMAND TABLE ADDRESS ; AS ADD-.-2 COMES NEXT IN THE LIST OF THE QA CALL. ; THE COMMAND TABLE IS SL IS ALSO ; SET IN THE ABSOLUTE VALUE OF INTEGER INPUT ; THE ERROR BYTE IS SET ; ERRORS: ; IF AN ERROR OCCHOWN BELOW AT QAALP:. THE ; COMMAND TABLE CONSISTS OF ALL POSSIBLE COMMANDS. ; THE TABLE FORMAT IS. ; BYTE1 = # OF CURS ON INPUT THE BUFFER POINTER ; IS SET BACK TO THE BEGINING OF THE INPUT ENTITY, SO ; THAT IT CAN BE REPROSSED. ;INPUOMMANDS +1 ; BYTE2 = # OF LETTERS PER COMMAND ; FOLLOWED BY ALL THE FIRST LETTERS OF EACH COMMAND ; ENDED BY A 0, FOT NEEDED - BEFORE QA IS CALLED THE ;BUFFER ADDRESSES TTYBUT MUST BE SET IN TTY ROUTINE. ;JSR R5,QA ;ANSWER TYPE ;MESSAGE ADDLLOWED BY ALL SECOND LETTERS ENDED ; BY A 0, ETC ; ANSWERS: ; 1. NUMBERS ARE RETURNED IN QAANS AND QAANS+2. ; RESS/OPTIONAL2 ;COMMAND ADDRESS/OPTIONAL2 ;ANSWER TYPE ;BIT 0 SINGLE PRECISION 1 ; 1 DOUBLE PRECISION 2 ; 2 OCTAL 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 RQUESTION, MESSAGE ; ONLY, ANSWER ONLY, OR NULL QUESTION ; C. DON'T WAIT - CAN BE USED WITH NULL QUESTION, OR ; ETURNED IN IT. ; USER VARIABLES: ; QADATF - BYTE - = 0 IS NO DATA IS FOUND, =1 IF DATA IS FOUND. ; QAERR - BYTE 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 ER ANSWERS ARE IN QAANS ;COMMANDS IN R0 ;STRING ADDRESS IN R0 ;LINE FEEDS ARE IGNORED BY QA ;POINTER SET BY QA ROUTINE T#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,QO INPUT BUFFER ;FLAGS CLEARED BY QA ROUTINE QADATF: .BYTE 0 ;SET 1 IF DATA IS FOUND QANCBD: .BYTE 0 ;# OF DECIMAL PLACESABUFP ;SET POINTER TO TOP OF BUFFER QA2: MOV QABUFP,R2 QA10: JSR PC,QAGETV ;GET NEXT VALUE BR QA9 INCB QADATF ;FOUND GOOD BEFORE THE POINT. QAERR: .BYTE 0 ;SET 1 IF AN ERROR OCCURS QACONT: .BYTE 0 ;SET TO THE NUMBER OF DECIMAL ;POINTS FOR S DATA BR QA7 QA9: CMPB R0,QADLIM ;TEST FOR DELIMETER BNE QA18 ;NO DATA INC (PC)+ ;YES MOVE POINTER UP ONE QABUFP: 0 ING AND DOUB PRECISIONS ;NUMBERS QANCDF: .BYTE 0 ;DECIMAL PT. FLAG QANCMF: .BYTE 0 ;NEG. NUMBER FLAG QAFSP: .BYTE 0 ; ;PTR TO INPUT BUFFER BR QA2 QA18: BIT #20000,R1 ;TEST IF NO DATA OK. BNE QA8 QA16: INCB QAERR QA8: BIT #120,R1 ;TESTSET 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 FOR ALPH,MIXED BEQ QAEXIT TST (R5)+ ;SKIP OVER COM. ADD. BR QAEXIT QA7: DEC R2 ;SET R2 TO POINT TO 1ST ;DATA VATHIS CHARACTER QADLIM: .BYTE 40 ;LINE DELIMETER QAXCHS: .BYTE 0 ;SET =1 IF EXCESS CHAR. IN ALP MODE ;OTHERWISE =0 QAHNLUE OF INTEREST. CLR R0 MOV R1,R3 BIT #177,R3 BNE QA11 BR QA16 QAERRO: INCB QAERR ;ERROR IN CALL QA17: TST (SP)+ V: .BYTE 72 ;=72 FOR DECIMAL,=70 FOR OCTAL ;NUMBER ANSWER QAANS: 0 ;SINGLE PRECISION, LOW 0 ;DOUBLE PRECISION, HIGH ;POP PC OFF STACK BR QAEXIT QA11: ROR R3 ;TEST TO FIND JUMP ADDRESS. BCS QA12 ADD #2,R0 BR QA11 QA12: JSR PC,@QA QA: JSR PC,SAVRG ;SAVE REGISTERS 1-4 MOV R0,-(SP) CLR QANCDF ;CLEAR FLAGS CLR QADATF ;CLEAR FLAGS CLR QAERR CLRB JMP1(R0) ;JUMP TO ROUTINE QA14: MOV R2,QABUFP ;PUT BUFFER POINTER TO NEXT BR QAEXIT QA20: TST (SP)+ BR QA16 QAJMP1: QAXCHS CLR QAFSP MOV (R5)+,R1 ;PUT ANSWER TYPE IN R1. MOV R1,(PC)+ QATYPE: 0 ;SAVE QA TYPE BIT #4000,R1 ;TEST FOR ANS ;JUMP TABLE TO ROUTINES .IFDF QASDO$ ! QAFLO$ QANUM,QANUM,QANUM .ENDC .IFNDF QASDO$ & QAFLO$ QA20,QA20,QA20 .ENDC WER ONLY BNE QA5 BIT #400,R1 ;TEST FOR SILENT QUESTION BNE QA2 JSR PC,TTYITY TSTB TTYICH ;TEST FOR H.S. READER INPU .IFDF QAFLO$ QAFLOA .ENDC .IFNDF QAFLO$ QA20 .ENDC .IFDF QAALP$ QAALP .ENDC .IFNDF QAALP$ QA20 .ENDC . 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 INC QAALP1 ;SAVE ADD. OF NEXT LIST ELEMENT. QAALP3: DEC R4 ;TEST IF DONE, ALL LETTERS CHECKED. BNE QAALP2 QAALP6: JSR PC, R1 ADC R3 NEG R3 QANUM4: MOV R1,QAANS ;STORE ANSWER. MOV R3,QAANS+2 RTS PC ;NUMBER CONVERSION ROUTINE ;CREATES A 3QAGETV ;SCAN OFF UNUSED CHARACTERS BR QAALP7 ;EXIT INCB QAXCHS ;SET EXCESS CHAR FLAG BR QAALP6 QAALP7: MOV R3,2(SP) ;2 BIT POSITIVE NUMBER, MAXIMUM ;TESTS AGAINST SMALLER MAXIMUM CRITERIOR ;CALLING SEQUENCE ;SET RADIX FOR CONVERSION IN R4 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 ND OF STRING BNE QASTR1 RTS PC ;FOUND END, SET .ENDC ;COMMAND INPUT INTERPRETER ROUTINE ;THE CALL TO QA HAD A COMMANDQAMIXS,R4 ;RESTORE # OF COM. LETTERS. BR QAALP4 QAALPE: MOV #177777,2(SP) ;SET R0 -1 ON ERROR BR QAERRO .ENDC ;NUMBER C ADDRESS. ;THE COMMAND TABLE IS ; .BYTE # OF COMMANDS +1 ; .BYTE # OF LETTERS/COMMAND ; A1 ; A2 ; . ; . ; AM ; 0 ; B1 ONVERT SUBROUTINE ;IS USED TO CONVERT ASCII TO INTEGER OR OCTAL ;IT WILL COUNT THE DECIMAL PLACES IF A DECIMAL ;POINT IS PRES ; B2 ; . ; . ; BM ; 0 ; ETC .IFDF QAALP$ QAALP: MOV (R5)+,R1 ;GET COMMAND LIST ADDRESS BIT #40000,QATYPE ;TEST FOR ENT. ;THE INPUT IS IN THE TELETYPE BUFFER. ;OUTPUT IS IN QAANS, QAANS+2 WHERE QAANS ;IS THE LOW ORDER PART. ;OCTAL NUMBER OFFSET CALL. BEQ QA22 ADD R5,R1 QA22: MOVB (R1)+,QACOMC ;GET # OF COMMANDS MOVB (R1)+,R4 ;GET # OF LETTERS/COMMAND MOV CAN BE D.P. .IFDF QASDO$ QANUM: MOV #10.,R4 ;TEST FOR OCTAL OR DECIMAL MOVB #72,QAHNV ;SET HIGH ASCII VALUE BIT #4,R1 R4,(PC)+ ;USED IN MIXED INPUT QAMIXS: 0 MOV R1,(PC)+ ;STORE ADDRESS OF FIRST LETTER IN QAALP1: 0 ;LIST OF COMMANDS CLR R ;AND STORE RADIX IN R4. BEQ QANUM1 MOV #8.,R4 MOVB #70,QAHNV ;SET HIGH ASCII # VALUE BR QANUM2 QANUM1: MOV #100000,QAN3 ;R3 HOLDS THE COMMAND ;INDEX WHICH IS BEING TESTED MOV R2,(PC)+ ;SAVE POINTER TO 1ST COMMAND QASAV2: 0 ;CHARACTER 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,QAQAALP4: JSR PC,QAGETV ;GET 1ST COMMAND CHARACTER. BR QAALPE ;ERROR MOV QAALP1,-(SP) JSR PC,LISTCP ;COMPARE COMMAND CHARACNC ;CALL NUMBER CONVERT BR QANUM5 ;ERROR RETURN JSR PC,QAGETV ;TEST THAT THE NUMBER BR QANUM3 ;IS FOLLOWED BY A DELIMITTER ;AGAINST TABLE TST R0 BMI QAALPE ;NO MATCH,ERROR ADD R0,R3 ADD R0,R1 ;INDEX INTO NEXT LIST. MOV R1,QAALP1 ER QANUM5: JMP QAERRO QANUM3: TSTB QANCF ;TEST FOR NUMBER BEQ QANUM5 TSTB QANCMF ;TEST FOR NEG. VALUE BEQ QANUM4 NEG ;ONLY ONE DECIMAL PT ALLOWED BNE QANCER INCB QANCDF ;SET DECIMAL PT FLAG BR QANC2 QANC1: CMP R0,#60 ;TEST FOR A NUMBCLR -(SP) JSR PC,$RCI MOV (SP)+,QAANS ;HIGH ORDER VALUE MOV (SP)+,QAANS+2 ;LOW ORDER BCS QAFLO2 ;TEST FOR ERROR .IFNDER BMI QANCEX ;EXIT IF NOT, AND STILL POINT CMPB R0,QAHNV ;TO CHAR BPL QANCEX TSTB QANCDF BNE QANC8 INCB QANCBD ;CF QASDO$ TSTB QAFSP ;TEST TO FIX VALUE BEQ QAFLO4 JSR R5,IFIX ;FIX F.P. NUMBER BR QAFLO5 QAANS QAFLO5: MOV R0,QAANSOUNT PLACES BEFORE DECIMAL BR QANC3 QANC8: INCB QACONT ;COUNT DECIMAL PTS AFTER IF FLAG ;SET QANC3: SUB #60,R0 ;SAME ;STORE IN QAANS .ENDC QAFLO4: JSR PC,RSTARG ;RETURN RTS PC QAFLO2: JSR PC,RSTARG ;ERROR. JMP QAERRO .ENDC ;QAMIXDIGIT MOV R0,(PC)+ QANCTM: 0 MOV R4,R0 ;MULTIPLY NUMBER BY RADIX MOV R3,R5 ;IN R4 ;HIGH ORDER PART FIRST BEQ QANC4 COMMAND TO INTERPRET A COMMAND AND ;NUMBER WHICH ARE TOGETHER. ;THE COMMAND LIST FORMAT IS THE SAME ;AS THE ALPHANUMERIC COMJSR PC,MULT TST R0 BNE QANCER MOV R5,R3 ;SAVE HIGH ORDER PRODUCT QANC4: MOV R4,R0 ;MULTIPLY LOW ORDER PART BY MOV R1,MAND. 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 ;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 MORE 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 V (SP)+,R5 RTS PC QANCEX: DEC R2 ;RETAIN CURRENT CHAR QANCDO: ADD #2,2(SP) ;NORMAL EXIT BR QANCER .ENDC .IFNDF QASDOLOW QANCHL: 0 ;INPUT LIMIT HIGH QANCF: .BYTE 0 ;NUMBER FOUND FLAG .BYTE 0 ;LOC. NOT USED. QANC: MOV R5,-(SP) CLR QANC$ .IFDF QAFLO$ QANUM: BIT #6,R1 ;TEST D.P. OR OCTAL BNE QANUME INCB QAFSP ;SET S.P. FLOATING FLAG. BR QAFLOA ;CONVERF CMPB (R2),#'- ;TEST FOR + OR -, AND SET BNE QANC5 ;MINUS FLAG IF - INCB QANCMF BR QANC6 QANC5: CMPB (R2),#'+ BNE QT VAI FLOATING. QANUME: JMP QAERRO .ENDC .ENDC ;---FLOATING POINT INPUT ;FPMP FLOATING POINT INPUT ROUTINE IS USED ANC7 QANC6: INC R2 ;IF + OR - SKIP TO NEXT CHAR. QANC7: CLR R1 ;LOW ORDER OF NUMBER CLR R3 ;HIGH ORDER OF NUMBER QANC2: ;FOR THE CONVERSION .IFDF QAFLO$ QAFLOA: CLR R3 MOV R2,R1 ;BUFFER ADDRESS QAFLO3: JSR PC,QAGETV ;COUNT FIELD SIZE BRJSR PC,QAGETV ;GET NEXT CHAR BR QANCDO ;DONE IF TERMINATE CHAR CMP R0,#56 ;TEST FOR DECIMAL PT. BNE QANC1 TSTB QANCDF QAFLO1 INC R3 BR QAFLO3 QAFLO1: JSR PC,SAVARG MOV R1,-(SP) ;STORE BUFFER ADD MOV R3,-(SP) ;FIELD SIZE CLR -(SP) C,QAGETV ;RETURN FOR EOL,@,AND SPACE ;RETURN FOR GOOD DATA QAGETV: CMP R2,TTYBUB ;TEST FOR BUFFER OVER READ. BLOS QAGET6 TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE CLR R0 BR QAGET1 QAGET6: MOVB (R2),R0 BEQ QAGET1 ;TEST FOR NULL CHAR. CMPB R0,QACSKP ;TEST FOR SKIP CHAR. BNE QAGETINFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUI3 QAGET5: INC R2 BR QAGETV QAGET3: CMP R0,#12 ;AND LINE FEEDS BEQ QAGET5 CMPB R0,QADLIM ;TEST FOR LINE DELIMITER BEQ PMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPQAGET1 CMPB R0,TTYCVA ;COMPARE TO CONTINUATION BEQ QAGET2 CMPB R0,TTYEOL ;TEST AGAINST EOL. BEQ QAGET1 ADD #2,(SP) ;RLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;IF DEFINED INCLUDE ;FORTX$ TEXT ETURN TO LOCATION CALL+4 INC R2 ;POINT TO NEXT VALUE RTS PC QAGET2: INCB QACONF ;SET CONTINUATION FLAG ;RETURN TO ;FORSP$ SINGLE PRECISION OUTPUT ;FORFL$ FLOATING OUTPUT ;REGISTER DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SCALL+2 BR QAGET5 QAGET1: RTS PC .END P=%6 PC=%7 ;EXTERNAL GLOBAL SYMBOLS .GLOBL SAVARG,RSTARG,TYPCH .IFDF FORFL$ .GLOBL $ECO,$FCO,FORBUF .ENDC .IFDF FORSP$ .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 ITHE OTHER COMMAND ;COMMAND LIST IS AS FOLLOWS ;.BYTE # OF COMMAND +1 (=3) ;.BYTE # OF LETTER PER COMMAND (=1) ;S ;F ;0 .IFDF QAMIX$ QAMIX: MOV R2,(PC)+ ;SAVE BUFFER POINTER QAMXR2: 0 TST (SP)+ ;POP PC JSR PC,QAALP ;CALL COMMAND INTERPRETE.TITLE OUTF ;LAB APPLICATIONS-11 OUTPUT FORMATTER ;DEC-11-SLABA-C-LA8 ;FILENAME OUTF.MAC ;FILE ID OUTF.2 .CSECT OUTF ;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 ONL QAMIXS,R2 ;NUMBER PART CMPB (R2),QADLIM ;TEST FOR DELIMITER BEQ QAMIX3 JSR PC,QANUM ;EVALUATE NUMBER QAMIX1: JMP QA14 ;Y ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANYRETURN EXIT QAMIX3: TST -(SP) ;CALL ERROR JMP QAERRO .ENDC ;SUBROUTINE TO GET A VALUE OF INPUT ;FOR QA ROUTINE ;JSR P OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ANDRMAT ; LIST OF COMMANDS ; EXIT ;OR ; STORE ADDRESS OF LIST IN R0 ; JSR PC,FORMAA ;OR, TO STORE ASCII IN A BUFFER RATHER ; ;5. SET COLUMN END POINTER ; .BYTE COLEND,COLUMN # ; COLUMN 1 HAS THE COLUMN #=1 ;6. SET COLUMN START ; .BYTE COLST,COLUMNTHAN TO AN OUTPUT DEVICE ;STORE ADDRESS OF LIST IN R0 ;STORE ADDRESS OF BUFFER IN R5 ; JSR PC,FORMAB ;THE FORMAT OF THE COMM # ;7. OUTPUT TEXT ; .BYTE TEXT ; .ASCII /TEXT TO OUTPUT/ ; .BYTE 0 ;10. OUTPUT TEXT VIA AN ADDRESS ; .EVEN ; ADDRESS ;1AND LIST IS AS FOLLOWS. ;1. THE COMMAND LIST CONSISTS OF COMMANDS IN BYTE ; FORMAT. ;2. THE LIST OF COMMANDS IS ENDED BY TH1. OCTAL NUMBER OUTPUT ; .BYTE OCTAL,N ; .EVEN ; .ADDRESS OR VALUE ;N=0-5 BITS,#OF DECIMAL PLACES ; BIT 6 ,=1 IF VALUE IE EXIT COMMAND. ;3. EACH COMMAND CONSIST OF A COMMAND DIRECTIVE ; FOLLOWED BY THE COMMAND PARAMETERS. ;4. ADDRESSES AND WORS ABSOLUTE ; BIT7 ,=1 IF THE ADDRESS/VALUE WORD IS THE OUTPUT VALUE ; =0 IF ADDRESS OF VALUE. ;12. SINGLE NUMBED OR FLOATING VALUES ARE IN ; WORD OR 2 WORD FORMAT. ;AN EXAMPLE OF A COMMAND LIST TO DO A CARRIAGE ;RETURN, LINE FEED ANR OUTPUT ; .BYTE SINGL,N ; .EVEN ; .ADDRESS OR VALUE ; N=SAME AS ABOVE ;13. DOUBLE OCTAL OUTPUT ; .BYTE DOOCT,N ; .EVEND 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 ; ADDRESS OR VALUE ; N=SAME AS ABOVE ;14. DOUBLE NUMBER OUTPUT ; .BYTE DOUB,N ; .EVEN ; .ADDRESS OR VALUE ; N=SAME AS ET 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 FT GLOBAL ;THE AREA MUST BE LARGE ENOUGH(IN BYTES) ;TO ACCOMMODATE THE OUTPUT,FROM FPMP. ;OUTPUT FORMATTER ; TO USE THE OUT13 ;DOUB=14 ;FLOAT=15 ;EXP=16 ;COMMANDS. ;1. SPACES: ; .BYTE SPACE,# OF SPACES ;2. LINES ; .BYTE LINES,# OF LINES ;3. SPUT FORMATTER A COMMAND LIST ;MUST BE MADE AND THE THE O.F. CALLED AS FOLLOWS. ;OUTPUT FORMATTER CALLING SEQUENCE ; JSR R5,FOET COLUMN TO FIRST COLUMN. ; AND TYPE A CRLF ; .BYTE CRLFC0 ;4. SET COLUMN TO COLUMN 1 AND ; OUTPUT ONLY A CR. ; .BYTE CRC0IA 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 ;PRECISIOORFL$ FORERR,FORERR .ENDC FORSFG: .BYTE 0 ;=1 FOR SINGLE, 0 FOR DOUBLE ;-1 FOR OCTAL FORDMI: .BYTE 0 ;NEGATIVE SI INC R2 BR FORS2 ;OUTPUT SPACES. FORSPA: CLR R2 ;TYPE R1 SPACES. FORS2: SUB R2,R1 JSR PC,FORSPS RTS PC ;ROUTINE GN FLAG ;OUTPUT FORMATTER. FORMAB: MOV R5,FOROTB ;GET ADDRESS OF STORE BUF. MOV #1,FOROTF ;SET BUF OUTPUT FLAG BR FOR6TO TYPE SPACES FORSPS: DEC R1 ;R1 HAS # OF SPACES TO TYPE BPL FORSP1 RTS PC FORSP1: MOV #40,R0 ;TYPE SPACE JSR PC,FO FORMAA: CLR FOROTF ;SET OUTPUT TO A DEVICE FOR6: MOV R0,FORSFG ;SAVE ADDRESS TO COMMAND LIST. MOV (SP)+,FOREXT ;SAVE RETROUT INC FORCCP ;MOVE COLUMN POINTER BR FORSPS ;OUTPUT LINES FORLIN: DEC R1 ;PRINT R1 LINES. BPL FORL1 RTS PC FURN ADDRESS BR FOR5 FORMAT: MOV R5,FORSFG ;STORE ADDRESS TO COMMAND LIST CLR (PC)+ ;NO RETURN ADDRESS YET. FOREXT: 0 ORL1: MOV #12,R0 JSR PC,FOROUT BR FORLIN ;SET COUNTER AT ZERO. FORCLZ: MOV #15,R0 ;DO CR. LF. JSR PC,FOROUT MOV #12;RETURN ADDRESS CLR FOROTF ;SET OUTPUT TO A DEVICE FOR1: MOV (SP)+,R5 ;RESTORE THE VALUE OF R5 FOR5: JSR PC,SAVARG ;SAVE AL,R0 JSR PC,FOROUT BR FORCZ1 FORCZ: MOV #15,R0 ;DO ONLY CR. JSR PC,FOROUT FORCZ1: CLR FORCCP CLR (PC)+ ;NUMBER OF SL REGISTERS. MOV FORSFG,R4 ;STORE ADDRESS TO COMMAND LIST FORNXT: CLR FORSFG MOVB (R4)+,R0 ;GET COMMAND BNE FOR2 ;EXIT OPACES TO USE IN FORDEL: 0 ;THE NEXT OUTPUT. DEC R4 ;MOVE COMMAND POINTER BACK. RTS PC ;CALCULATE NUMBER OF SPACES TO N 0 COMMAND. TST FOREXT ;RETURN ADDRESS SAVED? BNE FOR3 BIT #1,R4 ;NO, TEST FOR EVEN ADDRESS BEQ FOR4 INC R4 FOR4: USE IN NEXT OUTPUT. FORCED: SUB FORCCP,R1 MOV R1,FORDEL RTS PC .IFDF FORTX$ ;TEXT OUTPUT FORTXA: BIT #1,R4 ;TEST FOR AMOV R4,FOREXT FOR3: JSR PC,RSTARG ;RESTORE ALL REGISTERS JMP @FOREXT FOR2: MOVB (R4)+,R1 ;STORE 1ST COMMAND BYTE BIC #17N ODD ADDRESS BEQ FORTX1 DEC R4 ;AND SET IT BACK IF ODD. FORTX1: MOV (R4)+,R3 ;ADD. IN R3 MOV R4,R2 ;SAVE COMMAND ADDRE7400,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 FORORD13: 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 FORMR 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),-(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 OCTALL PT IF REQUIRED. INC R2 FORD5: TST DIVQH ;TEST IF QUOTIENT IS 0. BNE FORD6 TST R0 BEQ FORD14 FORD6: MOV DIVQH,DIVDNH OR DECIMAL FOROCT: INCB FORSFG ;SET SING. FLAG FORDOC: MOV #8.,(PC)+ ;SET RADIX. FORRAD: 0 ;OUTPUT RADDIX BR FORD15 FO ;NO DIVIDE QUOTIENT MOV R0,R5 ;BY 10. BR FORD4 FORD14: TST R1 ;DON'T END UNTIL DECIMAL BPL FORD6 ;PT. IS PRINTED IFRSNG: INCB FORSFG ;SET SINGLE FLAG. FORDBL: MOV #10.,FORRAD ;SET RADIX. FORD15: BIT #1,R4 ;TEST ADDRESS FOR EVEN BEQ FORD1 REQUIRED ;OR ALL OCTAL DONE TST R2 ;OR AT LEAST ONE VALUE BEQ FORD6 ;IS OUTPUT FORD7: TSTB FORDMI ;DONE, TEST TO P ;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 RINT - SIGN. BEQ FORD8 MOVB #55,-(SP) INC R2 FORD8: MOV FORDEL,R1 ;OUTPUT LEADING SPACES. SUB R2,R1 JSR PC,FORSPS FOMOV (R4)+,R2 ;DECIMAL PLACES. IF NEXT WORD BR FORD3 ;NOT ADD, IT IS THE VALUE. FORD2: MOV R4,R2 ;STORE ADDRESS OF THE OURD11: MOVB (SP)+,R0 ;OUTPUT NUMBER. JSR PC,FOROUT INC FORCCP ;COUNT UP POINTER. DEC R2 BNE FORD11 .ENDC .IFDF FORSPTPUT ADD #4,R4 ;VALUE FORD3: MOV (R2)+,R5 ;GET VALUE TO OUTPUT, LOW MOV (R2),R3 ;ORDER IN R5, HIGH IN R3. TSTB FORSFG $!FORFL$ FORD16: CLR FORDEL ;CLEAR LEADING 0 COUNT. RTS PC .ENDC .IFDF FORFL$ ;FLOATING POINT OUTPUT ROUTINE ;F FORMAT ;TEST FOR SINGLE PRECISION BEQ FORD9 CLR R3 ;YES, CLEAR HIGH ORDER. TSTB R1 ;TEST FOR ADDRESS POINTER BPL FORD9 SUB ENTRY FORFLO: CLR R0 BR FORF1 ;E FORMAT ENTRY FOREXP: MOV #5,R0 FORF1: MOVB (R4)+,R3 ;GET # OF SIGNIFIGANT DIGITS MOV #2,R4 ;YES, READJUST ADDRESS TO COMMANDS FORD9: BIT #100,R1 ;TEST FOR ABSOLUTE VALUE BNE FORD12 ;BRANCH IF YES. TSTB FORR3,R5 ;SAVE # OF SIGNIFICANT DIGITS ADD #2,R3 ;ADD COUNT FOR . AND SIGN BIT #1,R4 ;SET ADDRESS EVEN. BEQ FORF2 INC R4SFG ;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,R.TITLE GTDISP ;LAB APPLICATIONS-11 GT40 DISPLAY ;DEC-11-SLABA-C-LA1 ;FILE GTDISP.MAC ;FILE ID GTDISP.1 .CSECT GTSUBS ;COINT=2000 .ENDC DSTOP= 173400 ;DISPLAY STOP COMMAND DJSR= 173400 ;PSUEDO DISPLAY SUBROUTINE CALL DJMP= 160000 ;DISPLAYPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONL JUMP INSTRUCTION DNOP= 164000 ;DISPLAY NOP .IFDF RT11$ .MACRO ADDR,A,B ;MACRO TO PUT ADDR OF A IN B MOV #A,B ;NON PY 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 TSP) ;STORE F.P. VALUE MOV (R2),-(SP) TST R0 ;CALL OUTPUT ROUTINE BEQ FORF7 JSR PC,$ECO BR FORF8 FORF7: JSR PC,$FCO LIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; LARRY PEARSON 15-JAN-74 ;DEFINITIONS R0= %0 R1= %1 R2= %2 R3= %FORF8: JSR PC,RSTARG MOV (PC)+,R2 ;OUTPUT LEADING SPACES FORBUA: FORBUF MOV FORDEL,R1 SUB R3,R1 JSR PC,FORSPS CLR R1 3 R4= %4 R5= %5 SP= %6 PC= %7 .IFDF RT11$ .MACRO SYMDEF,SYM,DEF ;MACRO TO DEFINE GT40/44 DPU INSTRUCTIONS SYM= ^ FORF9: MOVB (R2)+,R0 ;OUTPUT ASCII STRING. CMP R0,#40 ;TEST FOR SPACE AFTER E BNE FORF10 CMP R1,#'E BNE FORF10 MOV #O4000*DEF!^O100000 .ENDM SYMDEF SETCHR,0 ;SET CHARACTER MODE SYMDEF SETSVC,1 ;SET SHORT VECTOR MODE SYMDEF SETLVC,2 ;S'+,R0 ;PUT IN + IF SO FORF10: JSR PC,FOROUT MOV R0,R1 INC FORCCP DEC R3 BNE FORF9 BR FORD16 .ENDC .END ET LONG VECTOR MODE SYMDEF SETPNT,3 ;SET POINT MODE SYMDEF SETGRA,5 ;SET GRAPH Y MODE SYMDEF SETRLP,6 ;SET RELATIVE POINT MODE INT= ^B10000000000 ;AS PART OF ANY OF THE ABOVE COMMANDS ;IT CAUSES BITS 9-7 TO BE LOADED INTO ;THE INTENSITY REGISTER .ENDC .IFDF CAPS$ SETCHR=100000 SETSVC=104000 SETLVC=110000 SETPNT=114000 SETGRA=124000 SETRLP=130000 . ; IF NOT DEFINED,DEFAULT VALUES ARE USED. ;GTD$8- IF DEFINED WILL ASSEMBLE CODE NEEDED FOR IMPLIMENTING THE ; 'DBA' COMMANFDF GTD$D ;SPECIAL GRAPH MODE? .GLOBL DISGRA .ENDC ; .SBTTL VARIABLES AND MACRO DEFINITIONS ;COMMAND LIST TO POSITION D ;GTD$9- IF DEFINED WILL ASSEMBLE CODE NEEDED FOR IMPLIMENTING THE ; 'DEX' COMMAND ;GTD$A- IF DEFINED, CODE WILL BE ASSEMBBEAM AND CALL CURSOR SUBROUTINE .IFDF GTD$6 ;FIXED CURSORS? GTCRSR: 4 ;NUMBER OF WORDS IN THE LIST GTCINT: SETPNT!INT ;POLED TO DISPLAY FLOATING POINT ; DATA. ;GTD$B- IF DEFINED, CODE WILL BE ASSEMBLED FOR A GT44. ; IF UNDEFINED, CODE WILL BE ASSINT MODE - POSTION FOR LEFT CURSOR 0 ;X VALUE POSITION 0 ;Y VALUE POSITION GTCRSE: DJMP ;CHANGED TO DJSR FOR CURSOR CALLEMBLED FOR A GT40 ;GTD$C- IF DEFINED, TEST EACH I/D TABLE FLAG FOR RECALCULATION. ;GTD$D- IF DEFINED, CODE WILL BE ASSEMBLED T ; .+4 ;CALLER MUST COMPUTE THIS VALUE ; FIXCUR ;AND FILL THIS ONE IN THE DISPLAY FILE .IFDF RT11$ .MACRO DLTAXY,$DX,$O OPTIONALLY ; GENERATE GRAPH-Y MODE DISPLAYS. ; .SBTTL GLOBAL SYMBOLS ;GLOBAL SYMBOLS - DEFINED LOCALLY .GLOBL GTRCAL,DY $$DX= $DX $$DY= $DY .IIF LT $DX,$$DX=-$DX!100 .IIF LT $DY,$$DY=-$DY!100 $$DX*200!$$DY!40000 .ENDM .ENDC FIXCGINIT,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 ;O CONTROL A SPECIAL FUNCTIONAL DATA ; TABLE DELTA. **** THIS FEATURE HAS NOT BEEN IMPLEMENTED.**** ;GTD$5- IF DEFINED WILL ASSCC,GTBCMD .ENDC .IFDF GTD$9 ;DEX COMMAND? .GLOBL DISSTX,DISTX,GTXCMD .ENDC .IFDF GTD$2 ;SPECIAL FUNCTION DELTA-SEMBLE CODE TO GRAPH XY-DATA AS WELL AS ; Y-DATA WHICH IS ALWAYS ACTIVE. ;GTD$6- IF DEFINED WILL ASSEMBLE CODE NEEDED FOR ENX? .GLOBL NEWDX ;USER PROVIDED SUBROUTINE .ENDC .IFDF GTD$5 ;XY DATA? .GLOBL DISXBU .ENDC .IFDF GTD$A ;FLOATIABLING FIX CURSORS ;GTD$7- IF DEFINED WILL ASSEMBLE CODE NEEDED FOR X-AXIS & Y-AXIS OFFSET, ; SCOPESIZE,TOP & BOTTOM OF DISPLYNG POINT DATA? .GLOBL DISMPO,$POLSH,$SBR,$MLR,$RI .ENDC .IFDF GTD$C ;SPECIAL RECAL FLAG? .GLOBL DISSKP .ENDC .INON-ZERO INDICATES AN ERROR CONDITION .IFDF GTD$5 ;XY DISPLAYS? GTXVAL: .BYTE 0 ;NON-ZERO VALUE MEANS FETCH X VALUE .END #1,GTRCAL ;SET RECALCULATE SWITCH MOV R0,R1 ;R1=ADR OF I/D TBL ;DETERMINE TABLE DELTA = N FOR BYTE DISPLY ; = 2*N FORC .IFDF GTD$6 ;FIXED CURSORS? GTCURC: .BYTE 0 ;LEFT OR RIGHT CURSOR SWITCH .ENDC GTRCAL: .BYTE 0 ;SET BY CALLING PRO WORD DISPLY ; = 4*N FOR DBL PREC DISPLY MOV DISN(R1),R0 ;TBLDLT=N JSR PC,GTMTYP ;CONVERT TO BYTES ;DETERMINE DX & RGRAM, CLEARED BY GTDISP ;=+1 CREATE A NEW DISPLAY FILE ;= 0 DO NOT CHANGE FILE. UPDATE CURSORS. ;=-1 MODIFY AN EX 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 DISXBISTING FILE IN PLACE .EVEN .IFDF GTD$2>D$D .ERROR ;GTD$2 & GTD$D ARE MUTUALLY EXCLUSIVE .ENDC ; .SBTTL GINIT - SUBU(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,GTROUTINE ;--- INIT ROUTINE --- ;AN I/O TABLE IS USED TO SETUP PARAMS FOR ;'GTSET' & 'GTDISP' ;ADR OF I/D TBL TO BE INITED IS MTYP ADD DISXBU(R1),R0 ;COMPUTE X POINTER MOV R0,DISDX(R1) ;STORE IT BR DI3 .ENDC ;Y-DATA SNGL PREC DIV: (SCOPE SIZE)PASSED 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/T = Q1 + R1 ; DX=Q1 ; DBL PREC DIV: R1.0/T = Q2 + R2 ; FRACTURAL REMAINDER = Q2 DT1: .IFDF GTD$7 ;SCOPE SIZE & OFFSETS 0),DISNC(R0) MOV DIST(R0),DISTC(R0) MOVB DISCU(R0),DISCUC(R0) MOVB DISSC(R0),DISSCC(R0) .ENDC .IFDF GTD$9 ;"DEX" C MOV DISSZX(R1),R5 ;SCOPE SIZE X-DIRECTION FROM TBL .ENDC .IFNDF GTD$7 ;NO SCOPE SIZE & OFFSETS MOV #2000,R5 ;DEFAULT SMD CLR DISTX(R0) ;SET FLG FOR 'OK' TO EXPAND .ENDC JSR PC,GTSET ;CALL SETUP RTS PC ; .SBTTL GINIT0 - SUBROUTINE IZE .ENDC .IFNDF GTD$2 ;NO SPECIAL FUNCTIONAL DELTA-X? MOV DIST(R1),R2 MOV R2,R0 JSR PC,DIVR ;USES R5 & R0 MOV R;---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 DISSISPLAY 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 MOV #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 ;SPGTBUFP,R5 ;GET POINTER TO BUFFER CONTROL BLOCK TSTB GTRCAL ;TIME TO RECALCULATE? BEQ GTDIS2 ;BR IF NOT CLR 4(R5) ;CLEARMPUTE FIRST DX .ENDC MOV DISYBS(R1),R0 ;GET STARTING ADDRESS OF DISPLAYED ;POINTS JSR PC,GTFIXS ;SET PNTR FOR SUBR BUFFER OFFSET GTDIS1: JSR PC,GTDSP0 ;RECALCULATE CLRB GTRCAL ;CLEAR RECALCULATE SWITCH TST R0 ;ANY ERRORS? BNE GTDRTN GETV MOV DIST(R1),GTNPTS ;NUMBER OF POINTS IN THE DISPLAY CLRB GTCURC ;CLEAR SWITCH FOR LEFT CURSOR ;R2 = INTEGER PORTIO ;BR IF ANY ERRORS GTDIS2: .IFDF GTD$6 ;FIXED CURSORS? MOV GTLST,R0 ;PNTR TO LIST OF I/D TABLES TO DISPLAY MOV GTCRVP,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 = HALFR2 ;PNTR TO LIST OF STARTING ADDRESSES OF ;CURVES IN THE DISPLAY FILE .IFDF GTD$5 ;XY DISPLAYS? CLRB GTXVAL ;CLEAR DELTA-X MOV DISR(R1),R4 ASR R2 ROR R4 .IFDF GTD$D ;SPECIAL GRAPH-Y MODE? TSTB DISGRA(R1) ;USE GRAPH MODE? BEQ GTSWITCH TO GET Y VALUES .ENDC GTDCUR: MOV (R0)+,R1 ;R1 = I/D TABLE POINTER BEQ GTDRTZ ;BR IF ALL DONE MOV (R2)+,R3 ;R3 GP3 ;BR IF NOT GRAPH MODE CLR R4 ;CLEAR FRACTIONAL DELTA-X .ENDC GTGP3: MOV R2,-(SP) ;INTEGER PORTION OF HALF DELTA-X = STARTING ADDR OF CURVE IN THE ;DISPLAY FILE .IFDF GTD$5 ;XY DISPLAYS? TST DISXBU(R1) ;IF XBU=0, Y DISPLAY, ELSE .IFDF GTD$7 ;OFFSETS & SCOPE SIZE? ADD DISOFX(R1),R2 ;X OFFSET .ENDC MOV DISCU1(R1),R5 ;R5 = CURRENT CURSOR VALUE ;XY AND NO CURSORS BNE GTDCUR ;BR IF NO CURSORS .ENDC TSTB DISCU(R1) ;FIXED CURSORS FOR THIS DISPLAY? BNE GTDCUP ;BTST (R3)+ ;INCREMENT DISPLAY BUFFER POINTER ;TO X COORDINATE GTDCL: CMP R5,R2 ;TIME TO SET CURSOR COORDINATES BLOS GTDR IF CURSORS ARE UP MOV #DJMP,6(R3) ;REPLACE "DJSR" WITH "DJMP" ON LEFT MOV #DJMP,22(R3) ;AND RIGHT CURSOR CALLS BR GTDCURC1 ;BR IF TIME ADD DISDLT(R1),R0 ;UPDATE Y BUFFER POINTER CMP R0,GTBEND ;IS Y-BUFFER POINTER WITHIN BUFFER? BLO GTDCND ; ;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 #16 BYTES IN ;THE DATA ELEMENT AS SPECIFIED IN THE I/D TABLE POINTED TO BY R1. ;CALLING SEQUENCE: ; MOV IDPNTR,R1 ;R1 = STARTINGMI GTSRTN ;BR IF SPECIAL RECALCULATION .ENDC MOV #DSTOP,R0 ;TERMINATE THE DISPLAY JSR PC,GTPUT0 CLR R0 JSR PC,GTPUT 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 ECIAL GRAPH-Y MODE? TSTB DISGRA(R1) ;USE GRAPH MODE? BNE GTGP4 ;BR IF GRAPH MODE .ENDC ADD DISR(R1),R4 ;ADD DELTA-X FOF 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 BRACTION ADC R2 ;ADD CARRY BIT GTGP4: ADD DISDX(R1),R2 ;ADD DELTA-X TO X .IFDF GTD$2 ;SPECIAL FUNCTIONAL DELTA-X? MOV LOCK GTBUFP: 0 MOV (R4)+,R3 ;R3 = ADDR OF BUFFER MOV (R4)+,GTBUFE ;BUFE = SIZE OF BUFFER IN BYTES ADD R3,(PC)+ ; = ADR0,-(SP) ;SAVE Y BUFFER POINTER MOV GTNPTS,R0 ;PASS NUMBER OF POINTS REMAINING JSR PC,NEWDX ;LET USER COMPUTE NEXT X MOV RDR OF WORD IMMEDIATELY GTBUFE: 0 ;FOLLOWING THE END OF THE BUFFER. TST (R4) ;IF OFFSET = 0, THEN THERE IS NO BEQ GTDS1 0,R2 ;STORE X MOV (SP)+,R0 ;POP Y BUFFER POINTER .ENDC DEC GTNPTS ;DECREASE POINT COUNTER BNE GTDCL ;GO DO NEXT POI;TERMINATING DSTOP/0 TO OVERLAY SUB #4,(R4) ;THIS SUBROUTINE ASSUMES THAT IF ;SOMETHING IS IN THE DISPLAY FILE, ;ITNT BR GTDCFI ;DONE ALL GTDCRC: MOV GTNPTS,DISXC2(R1) ;STORE RELATIVE CURSOR POSITION GTDCFI: TST (SP)+ ;POP HALF DELTA-X IS TERMINATED WITH A DSTOP/0. GTDS1: ADD (R4),R3 ;R3 = ADDR OF NEXT AVAILABLE LOC IN ;THE DISPLAY FILE CMP R3,GTBUFE ; 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 TEST 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 ADDR .ENDC ; .SBTTL GTMTYP - SUBROUTINE ;--- GTMTYP SUBROUTINE --- ;SUBROUTINE TO MULTIPLY THE CONTENTS OF R0 BY THE NUMBER OF BNE GTID ;ZERO TERMINATES THE LIST .IFDF GTD$C ;SPECIAL RECAL FLAG? TSTB GTRCAL ;IS THIS AN INITIAL CALCULATION? B ;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,GTJSR PC,GTGETV ;GET VALUE OF X MOV R0,R5 ;UPDATE X ADDR IN R0 MOV (SP)+,X1 ;STORE NEXT X .ENDC .ENDC GTGETX: .IFDF GTCINT ;SET INTENSITY .ENDC .IFDF GTD$6 ;FIXED CURSORS? .IFDF RT11$ ADDR GTCRSR,R0 ;R0 = ADDR OF CURSOR CODE .ENDC D$2 ;SPECIAL FUNCTIONAL DELTA-X? MOV GTNPTS,R0 ;PASS NUMBER OF POINTS REMAINING JSR PC,NEWDX ;LET USER COMPUTE NEXT DX .E.IFDF CAPS$ MOV #GTCRSR,R0 .ENDC JSR PC,GTCPYC ;COPY DISPLAY CODE FOR LEFT CURSOR JSR PC,GTCPYC ;AND FOR RIGHT CURSOR NDC ;GET NEXT Y VALUE MOV R4,R0 ;NEXT Y ADDR IN R0 .IFDF GTD$5 ;XY DISPLAYS? CLRB GTXVAL ;CLEAR SWITCH FOR Y VA.ENDC MOV #SETPNT!INT,R0 ;POSITION CMD FOR FIRST PNT BIS R2,R0 ;SET INTENSITY VALUE JSR PC,GTPUT0 ;STORE IN BUFFER MOLUE .ENDC CMP R0,GTBEND ;TEST TO SEE IF CURRENT Y ADDR ;IS WITHIN THE Y BUFFER BHIS GTPFIN ;BR IF Y ADDR IS OUT OFV 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)+,(S(R0),(PC)+ ;SAVE PNTR TO NEXT I/D TABLE GTNXID: 0 .ENDC MOV R3,(R2)+ ;STORE STARTING ADDR OF NEXT CURVE MOV R4,-(SP) ;S1),R0 ;COMPUTE ADDR OF FIRST POINT OUTSIDE MOV R0,(PC)+ ;OF THE BUFFER GTBEND: 0 .IFDF GTD$6 ;FIXED CURSORS? MOV #1,DIAVE ADDR OF "BUFSPC" .IFDF GTD$C ;SPECIAL RECAL FLAG? TSTB DISSKP(R1) ;RECALCULATE THIS CURVE? BNE GTID2 ;BR IF RECAL SXC1(R1) ;INITIALIZE CURSOR POSITIONS, LEFT MOV #1,DISXC2(R1) ;AND RIGHT .ENDC ;GET NEXT POINT GTGETP: .IFDF GTD$5 ;X JMP GTNRCL GTID2: .ENDC MOV R2,-(SP) ;SAVE CURVE LIST POINTER .IFDF GTD$6 ;FIXED CURSORS? MOV R3,-(SP) ;SAVE STAY DISPLAYS? TST DISXBU(R1) ;IF XBU=0, Y DISPLAY ELSE XY BEQ GTGETX ;BR IF Y DISPLAY, GO GET X .IFNDF GTD$2 ;NO SPECIRTING ADDR OF CURRENT CURVE .ENDC MOVB DISCI(R1),R2 ;R2 = INTENSITY VALUE BIC #177770,R2 ;REMOVE ANY GARBAGE SWAB R2 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 KIP IF PLUS NEG (SP) ;GET MAGNITUDE OF DX BIS #100,(SP) ;MAKE SIGNED MAGNITUDE NEG R0 ;MAKE DX PLUS GTGXP: CMP R0,#77 0 ;COMMAND WITH INTEGER DELTA-X ADD #174100,R0 JSR PC,GTPUT0 ;STORE IT MOV #SETGRA,R0 ;STORE A GRAPH-Y MODE COMMAND JSR ;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 PC,GTPUT0 MOV Y1,R0 ;STORE FIRST Y AGAIN BECAUSE JSR PC,GTPUT0 ;GRAPH-Y INCREMENTS AFTER DISPLAY INCB GTDMOD ;SET THE NOIN? GTDMOD: 0 ;0=POINT MODE, 177=RELATIVE PT MODE BNE GTGTDX ;BR IF WE ARE IN REL MODE COMB GTDMOD ;MAKE IT REL MODE T FIRST POINT SWITCH BR GTGP5 .ENDC ;POINT HAS BEEN ENTERED INTO THE DISPLAY FILE GTGP2: MOV X1,X0 ;MOVE NEW TO OLD MOV #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 BIT 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 S 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 D ;COMPUTE NEXT X VALUE ADD DISR(R1),(PC)+ ;ADD DELTA X FRACTION XF: 0 ;CURRENT X FRACTION ADC X1 ;ADD CARRY BIT GTGPY IS GREATER THAN +77 OR LESS THAN - 77 GTPTMX: TST (SP)+ ;POP DX OFF THE STACK GTPTMY: TST (SP)+ ;POP DY OFF THE STACK 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 ;TSTB GTDMOD ;WHAT MODE ARE WE IN? BEQ GTPTPT ;BR IF WE ARE IN PNT MODE .IFDF GTD$D ;SPECIAL GRAPH-Y MODE? BPL GTGP1 WITHIN BRANCH RANGE? BNE GTGETP ;BR IF MORE POINTS .ENDC .IFGE .-GTGETP-376 ;OUT OF BRANCH RANGE? BEQ GTPFIN ;BR IF ;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 FORA(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 DP) ;COMPUTE DX X0: 40000 ;PREVIOUS X VALUE MOV (SP),R0 ;TEST FOR ABS(DX) WITH RANGE FOR ;REL PNT MODE BPL GTGXP ;SN 77, BGT GTGP1A ;THEN USE 77 FOR GRAPH INCREMENT MOV #77,R0 MOV R0,DISDX(R1) ;CHANGE DELTA-X ALSO GTGP1A: BIC #177700,RHI 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 SUBROUTINEISSKP(R1) ;RECAL THIS TABLE? BNE GTPFI4 ;BR IF RECAL GTPFI1: CMP R3,(R2) ;CHECK IF RECAL ANYWAY BLOS GTPFI2 ;BR IF UNN ;R3 CONTAINS ADDR OF NEXT LOC IN BUFFER ; MOV #LIST,R0 ;R0 = ADDR OF CURSOR CODE ; JSR PC,GTCPYC GTCPYC: MOV R0,-(SP)ECESSARY INCB DISSKP(R1) ;FORCE RECAL BR GTPFI4 GTPFI2: BEQ GTPFI4 ;BR IF NO FILLING REQUIRED MOV #DNOP,R0 ;FILL BUFFE ;SAVE R0 JSR PC,GTCPYB ;COPY FROM "SETPNT" TO "DSTOP" MOV R3,R0 ;MOV "." TO R0 CMP (R0)+,(R0)+ ;COMPUTE ".+4" RELATIVE TR WITH DISPLAY NOP'S JSR PC,GTPUT0 ;STORE IT BR GTPFI1 ;GO SEE IF THAT FILLED IT GTPFI3: .IFDF GTD$D ;SPECIAL GRAPH-Y MO START OF DISPLAY FILE JSR PC,GTPUT0 ;STASH IT IN THE DISPLAY FILE .IFDF RT11$ ADDR FIXCUR,R0 ;R0 = ADDR OF FIXED CURSOR ODE? TSTB GTRCAL ;ANY SIZE CHANGES? BPL GTPFI4 ;BR IF SIZE CHANGES GTPF3A: CMP #DSTOP,(R3) ;ARE WE AT THE END? BEQ GTPFDISPLAY SUB .ENDC .IFDF CAPS$ MOV #FIXCUR,R0 .ENDC JSR PC,GTPUT0 ;STASH IT IN THE DISPLAY FILE MOV (SP)+,R0 ;RESTOREI4 ;BR IF DONE MOV #DNOP,(R3)+ ;FILL WITH DISPLAY NOP'S BR GTPF3A ;CHECK NEXT .ENDC GTPFI4: .ENDC MOV (SP)+,R4 ;P PNTR TO DISPLAY CODE RTS PC .ENDC ; .SBTTL GTSAVR - SUBROUTINE ;PAIR OF SUBROUTINES TO SAVE AND RESTORE REGISTERS 1 THRUOP ADDR OF "BUFSPC" GTPFI5: MOV (SP)+,R0 ;POP TABLE LIST POINTER JMP GTLOOP ;GO TEST FOR ANOTHER I/D TABLE .IFDF GTD$C 5 GTSAVR: MOV (SP)+,GTSRTA ;STORE RETURN ADDR MOV R1,-(SP) ;SAVE R1-R5 MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV ;SPECIAL RECAL FLAG? GTNRCL: MOV (R2),R3 ;R3 = ADDR OF NEXT CURVE INCB DISSKP(R1) ;LEAVE IT AT 1 BR GTPFI4 .ENDC ;ERRR5,-(SP) GTRRTN: JMP @(PC)+ ;RETURN TO LOC SPECIFIED BELOW GTSRTA: GTRRTA: 0 ; .SBTTL GTRSTR - SUBROUTINE ;RESTORE R5-R1OR ROUTINE LINKAGE GTERR1: JMP GTERR ; .SBTTL GTCPYB - SUBROUTINE ;SUBROUTINE TO COPY A LIST TO THE DISPLAY FILE ;CALLING GTRSTR: MOV (SP)+,GTRRTA ;STORE RETURN ADDR MOV (SP)+,R5 ;RESTORE R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (S 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 BR 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 M, THE POINTER VARIABLE "GTFSBP" MUST ;HAVE BEEN SET TO POINT TO EITHER "GTFBYT", "GTFINT", "GTFDBL", OR ;"GTFFLT" ACCORDING TOC,GTSAVR ;SAVE R1-R5 .IFDF GTD$5 ;XY DISPLAYS? TSTB GTXVAL ;TEST FOR X VALUE BNE GTFX1 ;BR IF GETTING AN X VALUE .E THE DATA TYPE TO BE FETCHED: BYTE, SINGLE ;PRECISION INTEGER, DOUBLE PRECISION INTEGER, OR FLOATING POINT. ;GTXVAL MUST BE CLNDC MOV DISMPO+2(R1),-(SP) ;STACK LOW ORDER OF MULTIPLIER MOV DISMPO(R1),-(SP) ;AND HIGH ORDER MOV 2(R0),-(SP) ;STACK LOEARED (CLRB) TO FETCH A Y VALUE AND SET TO FETCH AN ;X VALUE. ;CALLING SEQUENCE: ; R0 = ADDRESS OF THE DATA ELEMENT ; R1 = IW ORDER OF ELEMENT MOV (R0),-(SP) ;AND HIGH ORDER MOV DISMPO+6(R1),-(SP) ;STACK LOW ORDER OF OFFSET MOV DISMPO+4(R1),-(SP)/D TABLE POINTER ; JSR PC,GTGETV ;GET VALUE FROM A BUFFER ; *** ;RETURN HERE IF NO ERROR OCCURRED WITH ;R0 UPDATED TO T ;AND HIGH ORDER JSR R4,$POLSH ;COMPUTE (Y-OFFSET)*MULTIPLIER $SBR ;SUBTRACT OFFSET FROM Y $MLR ;AND MULTIPLY BY THE MHE NEXT ELEMENT GTGETV: MOV (SP),-(SP) ;MAKE A HOLE IN THE STACK FOR THE RESULT MOV R0,-(SP) ;SAVE ELEMENT POINTER AND JSULTIPLIER .+2 ;EXIT POLISH MODE ;MAKE SURE FLOATING POINT VALUE IS SMALL ENOUGH TO BE CONVERTED TO AN ;INTEGER. THIS PRR PC,GTSAVR ;R1-R5 JMP @(PC)+ ;DISPATCH TO ELEMENT FETCH ROUTINE ;FBYT, FINT, FDBL, OR FFLT GTFSBP: 0 ;ADDR OF SUBROUTEVENTS THE FLOATING POINT PACKAGE FROM ABORTING THE ;DISPLAY. GTFFIX: MOV (SP),R0 ;PERMITTED RANGE OF EXPONENT IS 000-436 INE TO FETCH A DATA ELEMENT, ;NORMALIZE IT, AND INCREMENT THE POINTER TO ;THE NEXT ELEMENT. SUB CAN BE ANY LISTED IN BIC #100177,R0 ;CLEAR EVERTHING BUT THE EXPONENT CMP #043600,R0 ;TEST EXP FOR MAXIMUM VALUE BGT GTFFL1 ;BR IF EXP IS OK ;THE GTFSUB TABLE. ;ROUTINE TO FETCH A BYTE GTFBYT: MOVB (R0),R2 ;FETCH BYTE AND TRANSFORM TO ;DOUBLE PRECISION MOV #77777,2(SP) ;MAKE A MAXIMUM VALUE TST (SP)+ ;CHECK SIGN BPL GTFFL2 ;BR IF SIGN IS PLUS NEG (SP) ;MAKE VALUE NEGATI SIGN EXTENSION GTGFIP: ADD R5,R2 ;DOUBLE PRECISION ADD ADC R0 ADD R4,R0 .ENDC .IFNDF GTD$7 ;NO SCOPE SIZE & OFFSETLOW .ENDC ;WRAP-AROUND OCCURRED, BUT NOT VIA OVERFLOW. MOVE SIGN INTO CARRY ;AND TREAT AS OVERFLOW GTWRPO: ROL R0 ;SE GTGFI3: .ENDC .IFNDF GTD$1 ;NO WRAP-AROUND CHECK BIC #176000,R2 ;CLEAR EVERYTHING BUT THE RESULT .ENDC .IFDF GTT CARRY = SIGN BR GTWRAP ;CHECK FOR UNDERFLOW GTLCHK: .IFDF GTD$5 ;XY DISPLAYS? TSTB GTXVAL ;X OR Y VALUE? BNE GTLD$1 ;WRAP-AROUND CHECK BVS GTWRAP ;BR IF WRAP-AROUND BNE GTWRPO ;BR IF OVERFLOW .IFDF GTD$5 ;XY DISPLAYS? TSTB GTXCX ;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 GVAL ;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) ;PUTOVB 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 ;SI5 ;BR IF X BR GTGFI4 ;IT WAS Y GTWNEG: TSTB GTXVAL ;X OR Y UNDERFLOW BNE GTLCX1 ;BR IF X BR GTLCY1 GTGFIX: .IFDF CALING RIGHT GTGFI0: ASR R0 ;SCALE HIGH ORDER THEN ROR R2 ;THE LOW ORDER INCB R3 ;DONE YET? BMI GTGFI0 ;BR IF MORE GTD$7 ;SCOPE SIZE & OFFSETS? CMP DISSZX(R1),R2 ;X GREATER THAN SIZE-X BGE GTLCHK ;BR IF OK GTGFI5: MOV DISSZX(R1),R2 ;SETTO DO BR GTGFI2 ;SCALING LEFT GTGFI1: ASL R2 ;SCALE LOW ORDER ROL R0 ;THE HIGH ORDER .IFDF GTD$1 ;WRAP AROUND C X TO SIZE-X .ENDC .IFNDF GTD$7 ;NO SCOPE SIZE & OFFSETS? CMP #1777,R2 ;X GREATER THAN XMAX? BGE GTLCHK ;BR IF OK GHECK? BVS GTWRAP ;BR IF WRAP-AROUND .ENDC DECB R3 ;DONE YET? BGT GTGFI1 ;BR IF MORE TO DO GTGFI2: .IFDF GTD$7 ;TGFI5: MOV #1777,R2 ;SET X TO XMAX .ENDC .IFZ GTD$1 ;SET WRAP-AROUND FLAG? MOVB #1,DEWRFL ;INDICATE X-WRAP OCCURRED .SCOPE SIZE & OFFSET? MOV DISOFY(R1),R5 ;ADD THE Y OFFSET GTGFI3: BPL GTGFIP ;BR IF HIGH ORDER OFFSET OK COM R4 ;THIS IS AENDC BR GTGRTN .ENDC .IFNDF GTD$5 ;NO XY DISPLAYS? GTWRAP: BCC GTGFI4 ;BR IF OVERFLOW BR GTLCY1 ;IT WAS UNDERFFFSET .ENDC BR GTGFI3 .ENDC ; .SBTTL GTFIXS - SUBROUTINE ;SUBROUTINE TO SET THE DISPATCH POINTER ACCORDING TO THE DATA MOV GTIDTB,R2 ;GET TBL LST DIX4: MOV (R2)+,R1 ;GET TBL BEQ DIX2 ;NO MORE TBLS TSTB DISCU(R1) BEQ DIX2 ;IGNORE CM ;TYPE BEING FETCHED. GTFIXS: MOV R0,-(SP) ;SAVE R0 MOV DISTYP(R1),R0 ;TYPE = 1, 0, -1, & -2 FOR DATA NEG R0 ;TYPES INTED, CURSORS AREN'T UP TST DISTX(R1) ;EXPAND OR RESTORE? BNE DIX1 MOV DISST(R1),DISSTX(R1) ;EXPAND! SAVE ST MOV DIST(R1),GER, BYTE, DOUBLE INC R0 ;PRECISION INTEGER, AND FLOATING ASL R0 ;POINT. COMPUTE ADDRESS OF MOV GTFSUB(R0),GTFSBP ;SUBRDISTX(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 PRODUCOUTINE TO FETCH AN ;ELEMENT, NORMALIZE IT, AND INCREMENT ;THE POINTER MOV (SP)+,R0 ;RESTORE R0 RTS PC ; .SBTTL 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 GTCCMD - SUBROUTINE ;--- 'DCU' CMD --- ;THIS CMD COMPLIMENTS BYTE 2 OF DISCU ;0=ELIMINATE CURSORS, 377=ACTIVATE CURSORS . DIX3: MOV R1,R0 ;GTSET NEED TBLADR IN R0 JSR PC,GTSET ;CALL 'GTSET' BR DIX4 DIX2: JSR PC,RSTARG ;RESTORE R1 RTS PC IFDF GTD$6 ;FIXED CURSORS? GTCCMD: JSR PC,SAVARG MOV GTIDTB,R1 ;GET LST OF I/D TBLS DIC2: MOV (R1)+,R0 ;GET TBL BEQ DIDIX1: MOV DISSTX(R1),DISST(R1) ;RESTORE! ST & T MOV DISTX(R1),DIST(R1) CLR DISTX(R1) ;USED AS A FLG TOO BR DIX3 .ENDC C1 ;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, TX(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)+,R0 RESULT IN OUR LITTLE HOLE MOV (SP)+,R0 ;GET DATA POINTER ADD DISDLT(R1),R0 ;UPDATE IT FOR NEXT VALUE RTS PC ;RETURN WITHROUTINE ;--- 'DEX' CMD --- ;IF DISCU = 377 & DISTX=0 THEN OK TO EXPAND BETWEEN CURSURS ; FOR DISPLAYS POINTED TO BY 'GTIDT RESULT ON THE STACK .IFDF GTD$5 ;XY DISPLAYS? GTGFI6: .IFDF GTD$7 ;SCOPE SIZE & OFFSET? MOV DISOFX(R1),R5 ;ADD THE X OB' ;IF DISCU=377 & DISTX=1 THEN OK TO RESTORE ;IF DISCU=0, IGNORE THIS CMD. .IFDF GTD$9 GTXCMD: JSR PC,SAVARG ;SAV R0-R5BR DIN2 DIN1: JSR PC,RSTARG RTS PC .END REG CLPRE=6 ;BUFR PRESET REG .IFDF LPS11$ DICSR=16 ;DISPLAY STATUS DISX=20 ;X-DAC DISY=22 ;Y-DAC .ENDC .IFDF AR11$ ;GET TABLE BEQ DID1 ;NO MORE TABLES MOV DIST(R0),R5 ;GET TOTAL POINTS ASR R5 ;HALF THE TOTAL POINTS BEQ DID2 ;NEED 1 POINT TO DISPLAY ASR DIST(R0) ASL DISN(R0) JSR PC,GTSET BR DID2 DID1: JSR PC,RSTARG RTS PC ; .SBTTL GTRCMD - SUBROUTINE ;---'DRA' CMD--- ;RAISE (SCALE UP) DATA BY 2 GTRCMD: JSR PC,SAVARG MOV GTIDTB,R1 ;GET TABLE LIST DIR2: MOV (R1)+,R0 ;GET TABLE BEQ DIR1 ;NO MORE TABLES INCB DISSC(R0) ;SCAFAC=SCAFAC+1 JSR PC,GTSET BR DIR2 DIR1: JSR PC,RSTA.TITLE VRDISP ;LAB APPLICATIONS-11 DISPLAY MODULE (VR14) ;DEC-11-SLABA-C-LA3 ;FILE ID VRDISP.1 ;FILE: VRDISP.MAC .CSECT VRDRG RTS PC ; .SBTTL GTLCMD - SUBROUTINE ;---'DLO' CMD--- ;LOWER (SCALE DOWN) DATA BY 2 GTLCMD: JSR PC,SAVARG MOV (PC)ISP ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE F+,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 POR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWAC,GTSET BR DIL2 DIL1: JSR PC,RSTARG RTS PC ; .SBTTL GTTCMD - SUBROUTINE ;---'DPO #' CMD ;CHANGE THE TOTAL NUMBER OF PORE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH INTS, T TO # ;CALL JSR PC,GTTCMD ; R0=#POINTS GTTCMD: JSR PC,SAVARG MOV R0,R3 ;GET #POINTS & SAV IN R3 BLE DIT1 ;NEEDSYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC 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 DIGTSET BR DIT2 DIT1: JSR PC,RSTARG RTS PC ; .SBTTL GTNDMD - SUBROUTINE ;---'DTA #' CMD--- ;CHANGE THE TABLE DELTA, N TOGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH I # ;CALL JSR PC,GTNCMD ; R0=TBLDLTA GTNCMD: JSR PC,SAVARG MOV R0,R3 ;GET TABLE DELTA & SAV IN R3 BLE DIN1 ;TABLE DELTS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 RA 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 5=%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 ,RSTARG,DIVDNH,DIVR,MULT,DISPLY .GLOBL DIICMD,DIDCMD,DISET,DIVD,DIVDSH .GLOBL DIRCMD,DILCMD,DITCMD,DINCMD,DINIT,DINIT0 .GLOBL2*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 DISOFX,DISOFY,DISSZX,DISTOP,DISBOT .GLOBL DISYBU,DISTYP,DISST,DISN,DIST,DISSC,DISR,DISDX .GLOBL DISYBS,DISDLT,DISCI,DISBUF,DI 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: MSDDN,LPSSAD .IFDF DIS$1 .GLOBL DISCU,DISCU1,DISCU2,DISXC1,DISXC2,DICCMD .ENDC .IFDF DIS$3 .GLOBL DISSTC,DISNC,DISTC,DISCUC,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,DDISSCC,DIBCMD .ENDC .IFDF DIS$4 .GLOBL DISSTX,DISTX,DIXCMD .ENDC .IFDF LAB$5 .GLOBL DISXBU .ENDC .IFDF LAB$4 .GLOBL NEWONE CTR = T, ELSE DONE CTR = QUOT+1 MOV DIST(R1),DISDDN(R1) ;HOPEFULLY DNCTR=T! .IFNDF LAB$3 MOV DISN(R1),R0 ;DIVISOR 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,DINIT0PLOTTER. HOWEVER ; USER MUST STILL SET THE 'PLOTFL' FLAG TO ENABLE THE PLOTTER CODE ;DIS$1- IF DEFINED WILL ASSEMBLE CODE NE ;WHERE, PNTR:DSPLST ;PTR TO LIST OF I/D TBLS TO BE DISPLAYED ; UPDLST ; " " " " " " " " UPDATED ; WHENEVEDED FOR ENABLING FIX CURSORS ;DIS$3- IF DEFINED WILL ASSEMBLE CODE NEEDED FOR IMPLIMENTING THE ; 'DBA' COMMAND ;DIS$4- IF DER A DISPLY-RELATED-CMD IS GIVEN DINIT0: MOV (R0)+,DILST MOV (R0),DIIDTB RTS PC ;--- SETUP ROUTINE --- ;THIS ROUTINE EFINED WILL ASSEMBLE CODE NEEDED FOR IMPLIMENTING THE ; 'DEX' COMMAND .IFDF VRD$1 DIS$1=0 .ENDC .IFDF VRD$4 DIS$4=0 .ENDCIS 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. .IFDF DIS$4 DIS$1=0 ;'EXPAND CODE' NEEDS 'FIX CURSOR CODE' .ENDC ;GLOBAL SYMBOLS .GLOBL DIDLT,DITCNT .GLOBL SAVARG DISET: JSR PC,SAVARG ;SAVE R0-R5 MOV R0,R1 ;R1=ADR OF I/D TBL ;DETERMINE TABLE DELTA = N FOR BYTE DISPLY ; = .IFNDF LAB$2 ;IF DF, USE SPECIAL DX MOV DISSZX(R1),R5 ;SCOPE SIZE X-DIRECTION FROM TBL SUB DISOFX(R1),R5 ;SCOPE SIZE-OFF: .IFDF DIS$1 ;IF DF, ENABLE CURSOR CODE MOV #10000,(PC)+ ;INITIALY SET TO NON-DISPLY VAL DIHOLE: 0 ;CURRENT CURSOR VX 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 DIVALUE (0-4095) TSTB DISCU(R1) ;C-BYTE=0? BEQ DI5 ;YES, FORGET CURSORS CLR (PC)+ ;NO, IMPLEMENT CURSORS DICCNT: 0 ;IDEND H.O.WORD CLR R5 ; " " " L.O.WORD MOV R2,R0 ;DIVISOR=T (AGAIN) CLR DIVDSH JSR PC,DIVD MOV R0,DISR(R1ST CUR=0, =1 FOR 2ND CUR MOV DISCU1(R1),DIHOLE ;DIHOLE=XCUR1 .ENDC DI5: MOV DISCI(R1),DICSR(R4) ;SET 'CSR' TO USER SPECS 1) ;FRACTIONAL REMAINDER .ENDC ;DETERMINE BASE YPTR IN ANY CASE DI3: MOV DISST(R1),DISYBS(R1) TST DISTYP(R1) BEQ DI4 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 ;BYTE DISPL BPL DII4 ASL DISYBS(R1) ;DBL PREC DISPLY DII4: ASL DISYBS(R1) ;WD DISPL DI4: ADD DISYBU(R1),DISYBS(R1) ;G X-POS ON SCOPE DISMDX: 0 ;Y-DATA DISPL-HOLDS CURRENT X-VAL CLR (PC)+ DISMFR: 0 ;HOLDS FR. SUM OF REMAINDER .ENDC YPTR = YBUFR + (2^TYPE)*ST JSR PC,RSTARG ;RESTORE R0-R5 RTS PC ;--- DISPLY ROUTINE --- ;THIS ROUTINE IS CALLED TO DISPLADI55: TSTB DICSR(R4) ;OK TO DISPLAY NXT PT? BPL DI55 ;NO CLR (PC)+ ;KEEP TEMP WRAP-AROUND FLG CLR DIWRFL: 0 ;WRAP-AY (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 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 DATA= 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 NDC ; 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),(REC DIV: (SCOPE SIZES-OFFSETX VALUE)/T = Q1 + R1 ; DX=Q1 ; DBL PREC DIV: R1.0/T = Q2 + R2 ; FRACTURAL REMAINDER = Q2 DT1: PC)+ ;DNCTR DITCNT: 0 ;REMAINING PTS YET TO BE DISPLAYED BGT DI21 JMP DII5 ;DNCTR IS <= 0,HENCE NO PTS TO DISPLY DI21 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 P) ;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 FFOR VERTICAL WRAPAROUND BMI DI12 MOV R2,DISY(R4) ;LOAD Y-DAC & INTENSIFY DI12: ADD #20,(SP) SUB (SP),R2 BMI DI13 ;CHAC POWER BEQ DI8 ;NO SCALING BPL DI9 DI10: CLC ROR (SP) ;SCALE RIGHT ROR R2 INC R3 BNE DI10 BR DI8 DI9: TST K FOR VERTICAL WRAPAROUND MOV R2,DISY(R4) ;LOAD Y-DAC & INTENSIFY DI13: DEC R3 ;CURSUR FULLY DISP? BNE DI14 ;NO BIC (SP) ;H.O. WD ALREADY SET? BEQ DII9 ;NO INC DIWRFL ;YES, THUS WRAP AROUND SO SOON DII9: ASL R2 ;SCALE LEFT ROL (S#2,DICSR(R4) ;CLR FAST INTENSITY BIT .ENDC .IFDF AR11$ BIC #176000,R2 ;CURSORS RELATE ONLY TO 10 BIT DATA MOV #3,R3 P) DEC R3 BNE DII9 DI8: ADD DISOFY(R1),R2 ;ADD IN OFFY ;DO SOMETHING ABOUT WRAP-AROUND .IFDF LAB$1 ;IF DF, ENABLECLR (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 & WRAP-AROUND CODE BCS DINC ;ADDING IN OFFSET CAUSED WRAP TST DIWRFL ;WRAP FOUND EARLIER? BNE DINC ;YES TST (SP) INTENSIFY DI1A4: TSTB DICSR(R4) BPL DI1A4 DI12: ADD #4,(SP) SUB (SP),R2 BMI DI13 MOV R2,DISY(R4) DI13: DEC R3 BNE ;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(RDI14 .ENDC ;PUT TCNT IN XC1 OR XC2 & UPDATE CHOLE TST DICCNT ;1ST CURSORS DISPLAYED? BNE DI15 ;NO, THE 2ND MOV DI1),R2 BLOS DIOK ;NO WRAP-AROUND .IFNZ LAB$1 MOV DISBOT(R1),R2 BR DIOK DINC: MOV DISTOP(R1),R2 .ENDC .IFZ LAB$1 DTCNT,DISXC1(R1) ;SET XC1 IN THE I/O TBL INC DICCNT ;SET FLG FOR 2ND CUR MOV DISCU2(R1),DIHOLE ;DIHOLE=XCUR2 BR DI11 DI1INC: COMB DISWRP(R1) ;SET WARNING FLAG BEQ DINC .ENDC .ENDC ;TIME TO DO DISPLAY OR OUTPUT PT TO XY-PLOTTER DIOK: MOV5: MOV DITCNT,DISXC2(R1) ;SET XC2 IN THE I/O TBL MOV #10000,DIHOLE ;SET TO NON-DISPLY VAL .ENDC DI11: TST (SP)+ ;MOV STA? 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,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 RESUPDATE R0, THE RELATIVE DATA BASE PTR BY DIDLT DI16: .IFDF LAB$3 ;IF DF, ENABLE SPECIAL TBL DLTA JSR PC,NEWDN ;ROUTINETORE? BNE DIX1 MOV DISST(R1),DISSTX(R1) ;EXPAND! SAVE ST MOV DIST(R1),DISTX(R1) ;AND T MOV DIST(R1),R0 ;T SUB DISXC1( SETS DIDLT EACH TIME .ENDC ADD DIDLT,R0 .IFDF LAB$5 ;IF DF,ENABLE XY-DATA CODE ADD DIDLT,R5 .ENDC ;TEST IF CURRR1),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 DENT DISPLY OR PLOT IS DONE. DEC DITCNT ;DONE? BEQ DII5 JMP DI55 ;NO ;GET READY FOR NEXT DISPLAY IN LIST DII5: MOV ISXC1(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 PCDITEMP,R0 ;GET PTR TO CURRENT TBLADR IN LIST JMP DILOOP ;--- 'DCU' CMD --- ;THIS CMD COMPLIMENTS BYTE 2 OF S/C (COPY) ;0=,DISET ;CALL 'DISET' BR DIX4 DIX2: JSR PC,RSTARG ;RESTORE R1 RTS PC DIX1: MOV DISSTX(R1),DISST(R1) ;RESTORE! ST & T MOELIMINATE CURSORS, 377=ACTIVATE CURSORS .IFDF DIS$1 DICCMD: JSR PC,SAVARG MOV DIIDTB,R1 ;GET LST OF I/D TBLS DIC2: MOV V DISTX(R1),DIST(R1) CLR DISTX(R1) ;USED AS A FLG TOO BR DIX3 .ENDC ;---'DIN' CMD--- ;DOUBLE THE TOTAL #PTS DISPLAYED(R1)+,R0 ;GET TBL BEQ DIC1 ;NO MORE TBLS COMB DISCU(R0) BR DIC2 DIC1: JSR PC,RSTARG RTS PC .ENDC ;--- 'DBA' CMD & HALF THE TBL DLTA DIICMD: JSR PC,SAVARG MOV DIIDTB,R1 ;GET TBL LST DII2: MOV (R1)+,R0 ;GET TBL BEQ DII1 ;NO MORE --- ;RE-INITIALIZE THE DISPLAY AS IT ORIGINALLY WAS IN THE BEGINNING .IFDF DIS$3 DIBCMD: JSR PC,SAVARG MOV DIIDTB,R1 DTBLS MOV DISN(R0),R5 ;TBLDLT ASR R5 ;HALF TBLDLT BEQ DII2 ;TBLDLT MUST BE > 0 ASR DISN(R0) ;IT IS ASL DIST(R0) IB2: 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 DI;DBL TOTAL PTS JSR PC,DISET BR DII2 DII1: JSR PC,RSTARG RTS PC ;---'DDE' CMD--- ;HALF THE TOTAL #PTS DISPLAYED & DBL CMD ; R0=TBLDLTA DINCMD: JSR PC,SAVARG MOV R0,R3 ;GET TBLDLTA & SAV IN R3 BLE DIN1 ;TBLDLT MUST BE > 0 MOV DIIDTB,F DEFINED THE A/D START IS DELAYED ;BY A USER SUBROUTINE AFTER ;THE MUX IS CHANGED. ;AD$3 ;DEFINE IF MUTI CHANNEL CAPABIR1 ;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 LITY DESIRED ;AD$4 ;DEFINE IF FAST SAMPLING DESIRED ;AD$5 ;DEFINE IF LED READOUT DESIRED ;GT40$ ;GT40 IF DEFINED ;AD$INT RTS PC .END ;SAMPLING PRIOROTY FOR FAST SAMPLE MODE ;ADDTYP=-1 ;SET AD$INT =200 FOR PRIORITY 4 ; =240 5 ; =30THE 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 ADSAM ;LAB APPLICATION-11 SMALL A/D SAMPLE MODULE ;DEC-11-SLABA-C-LA7 ;FILE ADSAM.MAC ;FILE ID ADSAM.3 .CSECT ADSAMPSN(R0) JSR PC,DISET BR DID2 DID1: JSR PC,RSTARG RTS PC ;---'DRA' CMD--- ;RAISE (SCALE UP) DATA BY 2 DIRCMD: JSR PC ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR ,SAVARG MOV DIIDTB,R1 ;GET TBL LST DIR2: MOV (R1)+,R0 ;GET TBL BEQ DIR1 ;NO MORE TBLS INCB DISSC(R0) ;SCAFAC=SCAFAC+USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE,1 JSR PC,DISET BR DIR2 DIR1: JSR PC,RSTARG RTS PC ;---'DLO' CMD--- ;LOWER (SCALE DOWN) DATA BY 2 DILCMD: JSR PC,SA OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSVARG 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 TEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. BEQ DIL1 DECB DISSC(R0) ;SCAFAC=SCAFAC-1 JSR PC,DISET BR DIL2 DIL1: JSR PC,RSTARG RTS PC ;---'DPO #' CMD ;CHANGE ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGIT 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 AL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS N ;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=#OT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;CONDITIONAL ASSEMBLY PARAMETERS ;AD$1 ;SHOW DISP JSR PC,DISET BR DIT2 DIT1: JSR PC,RSTARG RTS PC ;---'DTA #' CMD--- ;CHANGE THE TABLE DELTA, N TO # ;CALL JSR PC,DINLAY 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 ;IA 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, 0 6 ;IF NOT DEFINED , THE DEFAULT VALUE IS 200 ;ADFRQ$ ;=1 FOR 60 CPS ;=0 FOR 50 CPS ;VR14$ ;IF DEFINED, THE SCO WHILE SAMPLING ;4. START CLOCK OFF OF SCHMITT 1 AND SAMPLE ; CHANNELS VIA CLOCK TIMING. CLOCK FIRES A/D. ; TO CALL THPE IS VR14. ;AR11$ ;IF DEFINED, SYSTEM HAS AR11 RATHER THAN LPS .IFDF AR11$ & AD$5 NOLEDS ;AR11 HAS NO LEDS, CAUSE UNDEFINEE ROUTINE THE USER MUST DO THE FOLLOWING. ;1. DEFINE THE VECTOR ADDRESS BY PUTTING IT IN A LOCATION ; LPSVEC AND THE ADDRESD GLOBAL ;IF AR11 AND AD$5 IS DEFINED. .ENDC ;LPS11$ ;IF DEFINED, SYSTEM HAS LPS ;RT11$ ;RT-11 O.S. ;CONDITIONAL CHECS OF THE STATUS REGISTERS IN A LOCATION ; LPSSAD. LPSVEC,LPSSAD MUST BE SET GLOBAL. ;2. IF A DISPLAY IS TO BE USED, DEFINEKS .IFNDF AD$INT AD$INT= 200 ;DEFAULT TO PRIORITY 4 .ENDC .IFDF GT40$ & VR14$ ERROR=XXXX ;CAN NOT HAVE BOTH DISPLAYS DE THE ENTRY ; IN THE DISPLAY TABLE, Y BUFFER ADD=DISYBY, TO ADDTYB, ; SET ADDTAB TO THE DISPLAY TABLES FIRST ; VALUE ANDFINED. .ENDC .IFDF AD$1 .IFNDF GT40$ & VR14$ ERROR = XXXX ;IF AD$1 DEFINED, A DISPLAY MUST BE DEFINED .ENDC .ENDC ;DE SET BOTH GLOBAL ;3. INCLUDE THE MULTIPLY AND DIVIDE ROUTINE FROM THE ; GENERAL SUBROUTINE MODULE ; FOR A GT40 DISPLAY , 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$ ADFRIF ADSAM IS CALLED WITH F TYPE ; DISPLAY, THE DISPLAY MUST BE ON. ; THE GT40 DISPLAY IS ALWAYS TURNED OFF ON EXIT. ;4. A Q$=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, 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, BUTLOCKED 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 THE SUM ; BUFFER FOR DMA IS UPDATED AT THE END OF THE SWEEP ; IF A GT40 DISPLAY IS USED THE FOLLOWING VARIABLES ; MUNEEDED ;12. ADGRAB DISPLAY BUFFER FOR GRAPH PLOT ON GT-40,ADDRESS OF BUFFER ;13. ADGRAS SIZE OF DISPLAY BUFFER FOR GRAPH PLOT ST 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 2 FOR ; SECOND, ETC. ; TYPYING A C WILL VIEW THE CURRENT SWEEP ; FOR DMA SAMPLING. ; IF A GT40 DISPLAY IS USED THERE IR D.P. BUFFER ;6. ADCHN THE FIRST CHANNEL TO SAMPLE FROM, 0 ; IS CHANNNEL 0. ;7. ADNOFC IS THE # OF CHANNELS -1 TO SAMPLE.S THE POSSIBILITY ; OF 2 DISPLAYS OR NO DISPLAY ; A FULL DISPLAY WILL SHOW THE DISPLAY VIA THE ; GT40 DISPLAY MODULE. ;8. ADCOUT IS THE # OF POINTS SAMPLED PER CHANNEL. ;9. ADNOFS IS THE # OF SWEEPS. ;10. ADBADM IS THE ADDRESS OF THE TEMP BTHIS DISPLAY IS UPDATED 10 ; TIMES A SWEEP, THE DMA BUFFERS WILL BE UPDATED AT ; THE END OF THE SWEEP. ; A PARTIAL DIUFFER FOR ; DMA ONLY. CAN = ADBUFA FOR ONE SWEEP & BOTH S.P. ;11. ADDTYP DISPLAY TYPE FOR VR14 AND GT40 ; SET=0 FOR FULL DISPLAY IS A GRAPH PLOT DISPLAY AND DOES ; NOT COVER THE WHOLE SCREEN. IN THIS DISPLAY, THE ; INCREASE AND DECREASE COMMANDSPLAY ; =1 FOR GRAPH PLOT DISPLAY, GT40 ONLY ; =-1 FOR NO DISPLAY AND FAST SAMPLE MODE ; IN THE MODE TERMINAL IS A, ELSE 0 ADDONE: .BYTE 0 ;SAMPLING DONE FLAG. .IFDF AD$5 ADLEDC: .BYTE 0,0,0,0,0,0 ;LED COUNTERS .ENDC ;FLAGS ADDOU 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 ERP: .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,'ROR RTS PC ADSER1: MOV #1,R0 ;CLOCK ERROR RTS PC ADSER: CLR R0 ;DELAY ERROR RTS PC AD4: TSTB ADDOUX(R4) ;TEST BUFFEL,'I,'D,'C,0 ;EXTERNAL INPUT VALUES. ;THIS TABLE REPRESENTS THE USER'S TABLE THAT MUST ;BE SET BEFORE CALLING THE ROUTINR TYPE BNE AD35 ;D.P. BUFFER INPUT MOV #2,ADPRE ;SINGLE PRECISION, SET BUFFER MOV #-2,ADBUFS ;VALUES. AD5: MOV ADCOUX(R4E ADBUFX =0 ;ADDRESS OF FIRST BUFFER OF BUFFERS. ADRATE =2 ;INPUT RATE, PTS/SEC, IN MICRO SECONDS ;DOUBLE PRECISION ),R0 ;CALCULATE DISTANCE TO CURRENT ;VALUE IN NEXT BUFFER, ;FOR MULTI CHANNEL COLLECTION TSTB ADDOUX(R4) ;DOUBLE DISADDELY =6 ;DELAY IN MICRO SECONDS ;DOUBLE PRECISION ADCHTX =12 ;CHANNEL TYPE 0=REG CHANNEL ; 1=DMA ADTANCE BEQ AD6 ;IF FLOATING ASL R0 AD6: ASL R0 MOV R0,(PC)+ ;SAVE BUFFER SIZE IN BYTES ADBUFZ: 0 ADD R0,ADBUFS ;USED TDOUX =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,(PCIN 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 VN 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 DMDOUX(R4) ;BUFFER MUST BE FLOATING BEQ ADSER2 ;ERROR AD35: MOV #4,(PC)+ ;SET UP D.P. BUFFER VALUES. ADPRE: 0 ;=2 FOR S.P.,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 BUFFALUE FOR DELAY ADCKBD: 0 BEQ AD39 ;TEST FOR 0. .ENDC .IFDF AR11$ MOV R0,(PC)+ ;SET HIGH 16 BITS OF DELAY ADCDCT: 0 INCB ADDOUP TST (R0)+ AD18: TST ADNOFX(R4) ;TEST FOR MULTI CHANNEL BEQ AD19 MOV #4,R0 AD19: TSTB ADCHTX(R4) ;TEST FOR DBEQ ADDL1 ;CHECK FOR DELAY OF ZERO ADDL2: MOVB ADCDCT,ADCDRM ;SET LOW 8 BITS OF DELAY IN BYTE CLRB ADCDCT ;CLEAR OUT THAT BMA BEQ AD20A INCB ADCHTY MOV ADBADX(R4),(PC)+ ;DMA TEMP BUF ADBADM: 0 MOV #6,R0 BR AD20 AD20A: .IFDF AD$4 TSTB ADDYTE ADD @#DIVQH,ADCDCT ;ADD HIGH BYTE IN AT LOW BYTE SWAB ADCDCT ;HIGH 16 BITS NOW IN PROPER ORDER COMB ADCDCT ;MAKE LOWTYP ;TEST FOR NO DISPLAY BPL AD20 ADD #10,R0 ;CALCULATE NO DISPLAY TST ADNOFX(R4) ;TEST FOR MULTI CHARACTERS BEQ AD20 BYTE POS COUNT BR ADDL3 ADDL1: TST @#DIVQH ;CHECK HIGH ORDER FOR ZERO BNE ADDL2 ;NOT ZERO, BACK TO LOOP CLRB ADCDRM ; TSTB ADDOUP ;INTERRUPT ROUTINE ADD. BEQ AD20 TST (R0)+ ;ADD 2 .ENDC AD20: MOV PC,R1 ;GET ADDRESS OF OF A/D ADD #ADCLEAR REMAINDER ADDL3: MOV R1,(PC)+ ;SET DELAY RATE ADCDRT: 0 CMP R1,ADCSRT ;TEST IF DELAY FASTER THAN SAMPLING .ENDC .ISAML-AD20-2,R1 ;ADDRESS TABLE ADD R0,R1 AD32: MOV PC,R0 ;GET ADDRESS OF A/D ADD (R1),R0 ;INTERRUPT ROUTINE MOV @#LPSVECFDF LPS11$ MOV R1,(PC)+ ;STORE CLOCK RATE FOR DELAY ADCKSD: 0 CMP R1,ADCKSS ;TEST IF DELAY CLOCK RATE .ENDC BLO ADSER ,R5 ;GET VECTOR ADDRESS MOV R0,(R5) MOV #300,2(R5) ;GET REST OF VARIABLES FROM THE INPUT TABLE. MOV ADBUFX(R4),ADBUFA ;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 NEGDDRESS 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 ET 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 RIGER BHI AD60 MOV R4,R0 AD60: CMP #1024.,R0 BHI AD62 MOV #1024.,R0 AD62: CMP R0,#1024. ;TEST IF DATA TO DISPLAY GREATER ADNC2 ;READ TTY INPUT BIC #200,ADNC2 ;CLEAR PARITY BIT CMP ADNC2,ADNC3 ;TST IF VALUE CHANGED BEQ ADN2 ;NO MOV ADNC2,ADN BHI AD50 ;THAN GT-40 ABILILY MOV R0,R3 ;NO, CALCULATE THE DISPLAY LESS THAN AD52: ASL R3 CMP R3,#1024. ;TEST TO DOUBLE C3 ;YES,SAVE NEW VALUE CMP #'S,ADNC3 ;TEST FOR S BEQ AD42A CMP #'X,ADNC3 ;TEST FOR X BNE ADN2 JMP AD25A .ENDC AD2DELTA BHI AD50 ASL R1 BIT #100,R1 ;TEST FOR MAX DISPLAY DELTA BEQ AD52 DEC R1 ;SET TO MAX DISPLAY DELTA AD50: CMP R4: JSR R5,QA QADWA+QANQ AD36: TSTB ADDONE ;TEST IF SWEEP DONE .IFDF AD$1 BEQ AD34 .ENDC .IFNDF AD$1 BEQ AD42 .EN4,R0 BLOS AD51 MOV R4,R3 AD61: ASL R2 ASR R3 CMP R3,R0 BHI AD61 MOV R3,R0 ;CALCULATE THE DATA BUFFER DELTA DC AD38: ADD #2,(SP) ;SWEEP DONE RETURN TO USER. .IFDF GT40$ JSR PC,@#ADGTOF TSTB ADDTYP ;TEST TO STOP DISPLAY BNE AD ;SAVE THE DISPLAY BUFFER SIZE AD51: MOV R2,(PC)+ ;SAVE DATA BUFFER DELTA ADGPDE: 0 MOV R5,R2 ;BUILD THE DISPLAY BUFFER 38D RTS PC .ENDC AD38D: .IFDF AD$4 TSTB ADDTYP ;TEST FOR NO DISP. BMI AD38C RTS PC AD38C: MOV ADTBUF,R0 ;CLEAR TTY ADD #174100,R1 MOV #114000,(R2)+ ;SET POINT MODE CLR (R2)+ CLR (R2)+ MOV R1,(R2)+ ;STORE THE GRAPH DELTA MODE WORD MBUF. CLR PS ;RESET THE STATUS .ENDC RTS PC .IFDF VR14$ AD34: JSR PC,@#DISPLY ;SET DISPLAY .ENDC .IFDF GT40$ AOV #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 ADT SAMPLING JMP AD33 AD25: CMP R0,#2 .IFDF AD$1 BGE AD37 .ENDC .IFNDF AD$1 BGE AD24 .ENDC AD25A: MOV @#LPSSAD,RON BUFFER ADSAMA: ADD @ADBUSA,@ADBUFP ;ADD DATA TO BUFFER ADD #2,(PC)+ ADBUFP: 0 ;RELATIVE POSITION IN BUF ADSAM2: INC 0 ;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: TSHT ROR R4 ROR R5 INC R3 BNE AD46 AD47A: CMP R5,ADMAXV ;TEST FOR A VALUE TOO LARGE FOR SCREEN BLO AD47 MOV ADMAXV,R5S11$ TSTB ADCHTY ;TEST FOR DMA BUFFER BEQ AD24J MOV ADBADM,@#ADDTYB BR AD41 .ENDC .IFDF AR11$ BR AD24J .ENDC AD47: MOV R5,(R1)+ ;STORE VALUE IN DISPLAY DEC R0 ;BUFFER TEST IF DONE BEQ AD42 MOV ADGPDE,R4 ;GET DATA BUF. DELTA AD5 AD29: JSR R5,QA QASIL+QASP TSTB @#QAERR BNE AD24J MOV @#QAANS,R0 ;GET CHAN. # BEQ AD24J DEC R0 CMP R0,ADNOFC ;BUF4: DEC R4 ;SKIP POINTS IF NECC. BEQ AD49 TST (R2)+ ;SKIP POINTS TSTB ADDOUP ;TEST FOR D.P. SKIP. BEQ AD54 TST (R2)+FER. BHI AD24J MOV ADBUFA,R1 ;CALCULATE NEW BUFFER AD31: DEC R0 ;ADDRESS. BMI AD30 ADD ADBUFZ,R1 BR AD31 AD30: MOV ;ADD 2 BR AD54 .ENDC AD42: JSR R5,QA QAAO+QADWA+QAALP ADCOML TSTB @#QADATF ;TEST FOR A LINE INPUT BEQ AD36 TSTR1,@#ADDTYB ;STORE IN DISPLAY TABLE AD41: MOV #ADDTAB,R0 ;RESET DISPLAY .IFDF VR14$ JSR PC,@#DISET .ENDC .IFDF GT40$ R0 ;TEST FOR NON VALID COMMAND. BMI AD29 BNE AD25 AD42A: MOV @#LPSSAD,R0 CLR (R0) CLR CKSTAT(R0) INCB ADSAMP ;STARJSR PC,@#GTSET .ENDC AD24J: JMP AD24 .ENDC .IFNDF AD$1 AD29: BR AD24 .ENDC ;SINGLE CHANNEL SAMPLING ;SINGLE PRECISIP BUFFER POINTER FOR NEXT VALUE. MOV ADSTAV,@ADCSR ;RESET A/D CSR MOV (SP)+,R1 MOV (SP)+,R0 BR ADSAM2 ;EXIT. .ENDC DD #400,(R3) ADD (R4),(R1)+ ADC (R1)+ JSR PC,ADXWAT ;GO TO USER WAIT ROUTINE INC (R3) .ENDC MOV ADNOFC,ADNC1 ;SET # .IFNDF AD$3 ADSAMC: HLT .ENDC ;SINGLE CHANNEL N MODE ;SINGLE PRECISION .IFDF AD$4 ADSN1: ADD (R4),(R1)+ ;ADD DATA TO BOF CHAN -1 MOV R1,R0 ;SAVE BUFFER POINTER BR ADSN45 .IFNDF AD$2 ADSN41: ADD #401,(R3) ;CHANGE CHANNELS, START NEXT CHAN UFFER ADSN12: INC R2 ;TEST IF SWEEP DONE BEQ ADSN11 RTI ADSN11: JMP ADSWPD ;DOUBLE PRECISION ADSN2: ADD (R4),(R1)+ ; ADD (R4),(R1)+ ADC (R1)+ .ENDC .IFDF AD$2 ADSN41: ADD #400,(R3) ADD (R4),(R1)+ ADC (R1)+ JSR PC,ADXWAT ;GO TO USADD DATA LOW TO BUFFER ADC (R1)+ ;ADD HIGH ORDER BR ADSN12 ;MULTI CHANNEL N MODE ;SINGLE PRECISION .IFDF AD$3 .IFNDER WAIT ROUTINE INC (R3) .ENDC ADSN45: ADD ADBUFS,R1 ;SET TO NEXT CHANNEL'S BUF. DEC (PC)+ ;TEST IF LAST CHANNEL ADNC1: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 R1) ;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 TB @ADCSR ;WAIT FOR THE A/D CONVERSION BMI ADSAM3 ;TO COMPLETE. BR ADSAM6 ADSAM7: TSTB @ADCSR ;WAIT FOR A/D. BPL ADSSWEEP DONE BEQ ADSN32 RTI ;NO ADSN32: JMP ADSWPD ;YES ;MULTI CHANNEL N MODE ;DOUBLE PRECISION .IFNDF AD$2 ADSN4:AM7 ADD @ADBUSA,(R0)+ ;ADD VALUE MOVB ADDOUP,R1 ;TEST FOR D.P. BUFFER BEQ ADSAM5 ADC (R0) ADSAM5: ADD ADPRE,ADBUFP ;STE ADD #401,(R3) ;CHANGE CHANNELS, START NEXT CHAN ADD (R4),(R1)+ ;ADD DATA TO BUFFER ADC (R1)+ .ENDC .IFDF AD$2 ADSN4: A .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,@CIN LEDS BIC #177400,(SP) ADD (SP)+,R1 MOV R1,@ADBUSA ADSLD3: MOV (SP)+,R1 .ENDC MOV @#LPSSAD,R0 ;GET LPS ADDRESS CLDC ADSAS1: INC CKSTAT(R0) ;START CLOCK ADSAS2: TSTB CKSTAT(R0) ;WAIT TO BE DONE. BPL ADSAS2 .IFDF AR11$ MOV R1,-(SP) ;SAR CKSTAT(R0) CLR (R0) MOV (SP)+,R0 .IFDF GT40$ MOVB #1,@#GTRCAL MOV ADFDST,ADFDSC ;RESET REFRESH COUNT FOR ;TYPE VE R1 MOV @#LPSVEC,R1 ;VECTOR ADDRESS MOV #ADCIN4,CLKVEC(R1) ;SET ADDRESS FOR EXTERNAL EVENT INT MOV (SP)+,R1 ;RESTORE R1 DISPLAY .ENDC TSTB ADSAMP .IFDF AR11$ BNE ADSWP2 .ENDC .IFDF LPS11$ BNE ADSWP3 .ENDC JSR PC,ADZBUF BR ADSWP1 BIS #40000,CKSTAT(R0) ;SET IEXT EV INT JMP ADSAS4 ;EXIT AND WAIT FOR INTERRUPT ADCIN4: MOV R0,-(SP) MOV @#LPSSAD,R0 ;STA .IFDF LPS11$ ADSWP3: TSTB ADCHTY ;TEST FOR DMA BEQ ADSWP2 ;BRANCH IF NOT CMP ADBADM,ADBUFA ;TEST FOR SINGLE BEQ ADTUS ADDRESS TST CKSTAT(R0) ;CHECK FOR EXTERNAL INT BPL ADSAS6 ;NO INTERRUPT, RETURN MOV ADCDCT,(PC)+ ;SET DELAY COUNT HIGSWP2 ;BUFFER DMA MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV ADBADM,R0 ;ADD THE CURRENT BUFFER MOV ADCOUT,R1 ;TO THE SH ORDER ADCCLK: 0 BEQ ADSAS7 ;IF ZERO FORGET DOUBLE PRECISION MOV ADCDRM,ADCREM ;SET LOW ORDER BYTE OF DELAY COUNT MOV RUM BUFFER. MOV ADBUFA,R2 ADSWP4: ADD (R0)+,(R2)+ BITB #1,ADDOUP ;TEST FOR D.P. SUM BUFFER BEQ ADSWP5 ADC (R2)+ ADSWP5:1,-(SP) ;SAVE R1 MOV @#LPSVEC,R1 ;VECTOR ADDRESS MOV #ADCIN1,CLKVEC(R1) ;SET INTERRUPT ADDRESS FOR CLOCK MOV (SP)+,R1 ;RES 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 CL 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 #1CHECK 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 ;DIVIDKBUFF ;SET REMAINDER IN CLOCK BUFFER RTS PC ADCI2: CLRB ADSMFL ;CLEAR SAMPLING FLAG SO THAT A/D CAN ;BE TURNED ON AFTERINC ADCCLK ;COUNT REMAINDER AS A COUNT COMB ADSMFL ;SET CLEAR FLAG TO -1 RTI ADCIN5: BIC #40,@ADCSR RTI ADSAS3: JSR PC NEXT INTERRUPT RTS PC ;INTERRUPT ROUTINE FOR SINGLE COUNT REMAINDER ADCINT: MOV R0,-(SP) MOV @#LPSSAD,R0 JSR PC,ADCSMS ,ADCSMS ;SET UP SAMPLING COUNT BR ADSAS6 ;EXIT .ENDC .IFDF LPS11$ ADSAS6: MOV ADCKBD,CKBUF(R0) ;LOAD CLOCK FOR DELAY B;SET UP SAMPLING COUNT BR ADCIN2 ;EXIT ;ROUTINE TO SET UP SAMPLING COUNT ADCSMS: MOV ADCSCT,ADCCLK ;SET HIGH ORDER SAMPLINGEQ ADSAS3 ;TEST FOR NO DELAY MOV ADCKSD,CKSTAT(R0) ;SET CLOCK RATE FOR DELAY. ADD #20100,CKSTAT(R0) ;START CLOCK WITH SCHMI COUNT BNE ADCIN6 ;SET UP DOUBLE PRECISION COUNTER ADSIN7: MOVB ADCSRM,CKBUF(R0) ;SET COUNT IN CLK BUFFER JSR PC,ADADST ;STT 1 BR ADSAS6 ;NO DELAY ADSAS3: JSR PC,ADADST ;SET A/D STATUS MOV ADCKBS,CKBUF(R0) ;LOAD CLOCK BUFFER MOV ADCKSS,CKET AD TO START OFF CLOCK MOV ADCSRT,CKSTAT(R0) ;SET CLOCK RATE ADD #401,CKSTAT(R0) ;START CLOCK, REPEAT INT MODE RTS PC ASTAT(R0) ;SET CLOCK STATUS ADD #20400,CKSTAT(R0) ;START CLOCK VIA SCHMITT 1, MODE 1 .ENDC ;REPEATED INTERVAL ADSAS4: MOV DCIN6: MOV ADCSRT,CKSTAT(R0) ;SET SAMPLING RATE MOVB ADCSRM,ADCREM ;SET UP REMINDER COUNT MOVB ADCREM,CKBUF(R0) ;PUT REMAIND(SP)+,R0 RTS PC .IFDF LPS11$ ADCINT: JSR PC,ADADST ;LOAD A/D STATUS MOV R0,-(SP) MOV @#LPSSAD,R0 MOV ADCKBS,CKBUF(RER 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) ADD #2,(SP) ;RETURN. ADCRS4: RTS PC ;SUBROUTINE TO SET UP A/D FOR SAMPLING ADADST: MOV @ADBUSA,-(SP) ;CLEAR ADFLAG, WITIN DEC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENTH A DUMMY MOVE TST (SP)+ .IFDF LPS11$ TSTB ADCHTY ;TEST FOR DMA BNE ADADS1 .ENDC MOV ADSTAV,@ADCSR ;SET REGULAR CHA BY DIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WNNEL STATUS RTS PC .IFDF LPS11$ ;DMA SAMPLING ADADS1: MOV R0,-(SP) MOV @#LPSSAD,R0 MOV #6,(R0) ;SET CURRENT ADDRESS HICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;VR14$ ;VR14 CODE MOV ADBADM,DMASTA(R0) MOV #4,(R0) ;SET COUNT AS NEG. VALUE MOV ADCOUT,DMASTA(R0) MOV #2,(R0) ;ENABLE DMA MOV #10000, IF DEFINED ;GT40$ ;GT40 CODE IF DEFINED ;RT11$ ;DEFINE = RT11 SYSTEM ;CAPS$ ;DEFINED = CAPS11 SYSTEM ;DATA EDITODMASTA(R0) MOV ADSTAV,(R0) ;SET A/D STATUS, INTERRUPT MOV (SP)+,R0 RTS PC ;ON, CLOCK DRIVEN. .ENDC .END R ELIMINATE COMMAND AND PROGRAM INITIALIZATION .GLOBL DE0,DETOP,DEEND,TYPMS .GLOBL $ERVEC,DEERFP,DESTAK,DEHARE .IFDF GT40$ .GLOBL DEDYSZ,DENORM,DEOFY,DEOFYD,GINIT0,DEGTPT .IFDF CAPS$ .GLOBL GT40VC,DEGTIN,DERSTR .ENDC .GLOBL GT40SA .ENDC .IFDF VR14$ .GLOBL DINIT0,DEGTPT .ENDC .IFDF CAPS$ .GLOBL DERSTR .ENDC .IFDF RT11$ .GLOBL DEBOT .ENDC R0=%E # OF TICKS, UNTIL # OF TICKS .IFDF AR11$ TSTB @#DIVQH+1 ;CHECK FOR HIGH ORDER BYTE .ENDC BEQ ADCRS1 ;FITS IN A WORD . 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 SLOW.TITLE SPINIT ;LAB APPLICATION-11 ELIMINATE AND INITIALIZATION ;DEC-11-SLABA-C-LA24 ;FILE SPINIT.MAC ;FILE ID SPINIT.1 .CSEER RATE CMP R1,#12 ;TEST FOR SLOWEST RATE BHI ADCRS2 ;SET TO LINE FREQUENCY IF NECESSARY. JSR PC,@#DIVD ;DIVIDE # OF TICCT SPINIT ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICKS BY 10. BR ADCRS3 ADCRS2: MOV #16,R1 ;SET TO LINE FREQUENCY. MOV #ADL100,R0 ;CONVERT 100 HZ TO LINE FREQUENCY. JSR PENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS 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 SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON 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 SUCH SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN 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 ADDRESAVES THE RT-11 VECTORS FOR RT-11 SYSTEM ;9. SET DATA ANALYSIS FREE CORE BOTTOM, AND TOP AND ; DOES AN RT-11 SETTOP. ;10. S MOV #DEERFP,$ERVEC ;SET TOP OF CORE AVAILABLE .IFDF RT11$ BIS #20100,@#44 ;SET JOB STATUS TO BE RESTARTED ;& PSETS VECTORS IF THE PAPER TAPE TTY MODULE IS ; BEING USED UNDER RT-11 SYSTEMS. ;11. JUMP TO START THE DATA ANALYSIS ROUTINEROMPT RTN FROM MONITR ON TTYINR (F/B) MOV @#54,R0 ;GET BOTTOM OF RT-11 ;USR IS NOT RESIDENT TST -(R0) ;SUBTRACT 2 M ; IN RT-11 & CAPS11 THE LINKER SETS THE STACK ; AT THE LOAD POINT DEEND: MOV DESTR3,DESTAK ;GET STACK FOR RT-11 OR CAOV DESTR3+2,DEBOT ;SET BOTTOM ADDRESS FOR DAEDITOR .MCALL .SETTOP .SETTOP ;DO RT-11 TOP OF CORE EMT MOV R0,DETOP ;SET TOPS11 DESTR1: MOV #DEHARE,@#4 CLR @#6 .IFDF VR14$ MOV #DEGTPT,R0 JSR PC,DINIT0 .ENDC .IFDF GT40$ .IFDF RT11$ .LNP ADDRESS FOR DAEDITOR .ENDC .IFDF CAPS$ IOT .BYTE 1,0 ;RESET 0 IOT .BYTE 2,0 ;RESTART DERSTR MOV @#42,DETKRT ;VTMAC CALL 'IF R0<0 ON RTN,ERROR TST R0 ;IF R0>=0 ON RTN, THEN OK BPL DESG0 JMP @#DEHARE ;VT11 HARDWARE PROBLEM OP ;'HIFREE' LOCATION .ENDC MOV DESTAK,SP ;RESET THE STACK MOV #DEVERM,R0 ;PRINT VERSION # JSR PC,TYPMS JMP DE0 DEVER.ENDC DESG0: MOV #DEGTPT,R0 JSR PC,GINIT0 ;SET DISPLAY TABLES .IFDF CAPS$ MOV GT40SA,R1 MOV GT40VC,R0 MOV #DEGTIN,(R0M: .BYTE 15,12 .ASCII /SPARTA V/ .IFNDF SPNDI$ .IFDF GT40$ .ASCII /G/ .ENDC .IFDF VR14$ .ASCII /V/ .ENDC .ENDC)+ MOV #200,(R0) MOV #DESGD,(R1)+ ;TEST FOR GT40 OR GT44 ;BY MOVING A POINT OFF SCREEN .ENDC .IFDF RT11$ .INSRT .IFDF SPNDI$ .ASCII /N/ .ENDC .IFDF LPS11$ .ASCII /L/ .ENDC .IFDF AR11$ .ASCII /A/ .ENDC .IFNDF LPS11$ & AR#DESGD ;VTMAC CALL MOV GT40SA,R1 MOV R1,R2 TST (R1)+ ;R1=ADDR OF GT40 STATUS REG .ENDC DESG1: .IFDF RT11$ CMP (R211$ .ASCII /N/ .ENDC .ASCII /3-00/ .BYTE 0 .EVEN DESTR3: .LIMIT ;GENERATE THE STACK AT THE LOAD POINT ;FOLLOWE0 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 MOD .IFDF RT11$ .GLOBL DEGFCJ .ENDC .GLOBL DEDBCB,DEGTOF .ENDC ;ROUTINES CALLED: IFIX, MULT,DEFORE,FORMAT,DETLE,$POLSH,DEE 173000 ;STOP DESGYS: 1377 DESGYO: 600 DESGNO: 42277,100000 ;.FLT2 383 .ENDC SCRBUF: .BYTE 0,0 0 .END EOL ;--- 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 BNELY 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 INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQU BUFS? BEQ DEBU2 ;SNGL CLR R2 ;FLOAT, R2 = S.P. # = 0 MOV R5,R4 ; R4 = F.P. # ASL R5 ASL R5 ;# = # *4 (F.P. IPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPTAKES 4 BYTES) JSR PC,@#MULT ;R0 = BUSIZ, R5 = # *4 MOV R5,R3 ; R3 = TOTAL BYTES FOR F.P. CLR R1 ; R1 = " PLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;GT40$ IF DEFINED = GT40 CODE ;VR1 " " S.P. = 0 BR DEBU3 DEBU2: MOV R5,R2 ; R2 = S.P. # CLR R4 ; R4 = F.P. # = 0 ASL R5 ;#=#*2 (S.P. TA4$ 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 KES 2 BYTES) JSR PC,@#MULT ;R0 = BUSIZ, R5 = #*2 MOV R5,R1 ; R1 = TOT BYTES OF S.P. CLR R3 ; R3 = " " " COLST=6 TEXT=7 SING=12 FFLOAT=15 .IFDF SPBBU$ .IFDF CAPS$ .GLOBL DEEOL .ENDC .GLOBL DEBU,IFIX,DECMD,DEDATA,MUL 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 T,DETOP,DEBOT,DEFREE,DETLE .GLOBL DEFLG1,DEASGN,DEFORE,FORMAT,$IR,DEBTOP,DECMD1,DEDIT1 .GLOBL DIST,DEDID,$POLSH .IFDF GT40$ MOVB @#DECMD+2,R5 ;GET # OF BUFS BMI DEBU4A ;NONE, THEREFORE GO ON TO NEXT STEP TSTB @#DECMD+3 ;WHAT KIND OF BUFS? BEQ DBUF TOP = DEFREE CLRB @#DEFLG1 ;DISPL INACTIVE CLR @#DEDID ;CLR I/D TBLS WHICH CLR @#DEDID+2 ;WERE BEING DISPLAYED C MOVB @#DECMD+2,@#DEASGN+13 ;SET 1ST WD OF 2ND ENTRY OF CLRB @#DEASGN+12 ;THE ASIGN TBL DEAS2: MOVB @#DECMD,@#DEASGN+1 ;SETLR @#DEASGN ;CLR ASSIGN TBL CLR @#DEASGN+12 ;TIME TO OUTPUT SIZE OF FREE CORE MOV @#DETOP,R0 SUB @#DEFREE,R0 ADD #2, 1ST WD OF 1ST ENTRY OF CLRB @#DEASGN ;THE ASSIGN TBL RTS PC ;ERRORS DEASE1: MOV #7,R0 ;MUST BE S.P. BUFR TST (SPR0 ;#BYTES CLC ROR R0 ;#WORDS MOV R0,-(SP) JSR R4,@#$POLSH $IR,.+2 ;#WORDS FLOATED MOV (SP)+,DECMD MOV (SP))+ ;GET NORMAL RTN OFF STACK JMP @#DEFORE .ENDC .ENDC ;--- WRITE COMMAND --- .IFDF SPPWR$ .IFDF CAPS$ .GLOBL DEEBU5 ;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#*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 ;-- 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 - DAS S1 [S2] --- ;SNGL PREC BUFS S1 AND S2 (OPTINAL), PREVIOUSLY ;DEFINE, ARE ASSIGNED FOR F.P. DATA BUF CONVERSIONS. .IF ADD R1,@#DEFREE ;CURRENT BOTTOM OF FREE CORE DEBU6: MOV R4,@#DEDATA+10 ;#F.P. BUFS BEQ DEBU7 ;#F.P. BUFS COULD =0 MOVDF VR14$ .GLOBL DEAS DEAS: MOVB @#DECMD+1,R0 ;GET S1 TYPE BNE DEASE1 ;ERR, TYPE WAS NOT S.P. MOVB @#DECMD+3,R1 ;GET S @#DEFREE,@#DEDATA+12 ;ST.ADDR. OF F.P. BUFS ADD R3,@#DEFREE ;CURRENT BOTTOM OF FREE CORE DEBU7: MOV @#DEFREE,@#DEBTOP ;SET 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. WR1 ;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 ;N OUTPUT MOV #15,@#DECMD+4 ;#SIG.DIG. IN FLD WIDTH MOV R4,R0 ;ROUTINE 'DEGET' USES R0 AS INDEX PTR TSTB @#TTYOCH BMI DO, 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 EWR15 DEWR14: JSR R5,@#FORMAT ;YES .BYTE CRLFC0,EXIT ;OUTPUT A CRLF TO BEGIN WITH .EVEN DEWR15: TST @#DECMD+2 ;SUPPRESSDEFAULTED TST R0 ;WAS IT? BMI DEWR2 ;YES MOV #8.,R0 JMP DEPREE ;NO (FMT ERR) DEWR2: CLR R0 ;DEFAULT DEV=0(T) DEWR3 LINE #S & COLUMNS? BEQ DEB7 ;NO ;THIS OUTPUT DOESNOT USE LINE #S & COLUMNS MOVB #16,DEWRI1 JSR PC,DEWRI CMP R0,R5 : 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,@# ;REACHED THE LAST PT? BEQ DEB13 ;YES INC R0 BR DEWR14 ;THIS OUTPUT DOES USE LINE #S & COLUMNS DEB7: MOV R2,R3 ;RESTTYOCH ;SET DEV FOR 'QA' (T,L,H) JSR PC,@#DECHR TST R0 ;WAS A SWITCH SPECIF? BMI DEWR7 ;NO CMP R0,#2 ;MAYBE! BHI DEET CTR. R3=#COLUMNS/LINE MOV R0,DEB8 ;GET CURRENT PT# INC DEB8 JSR R5,@#FORMAT .BYTE CRLFC0,COLEND,5 .BYTE SING,200 WR6 ;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 DE ;SNGL PREC. OUTPUT .BYTE 5 ;#SIG. DIGITS .EVEN DEB8: 0 ;VALUE OF CURRENT # .BYTE EXIT .EVEN MOV #5,R1 ;R1 HOLFLCK,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 TOWRI: 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' MOVGET NORMAL RTN OFF STACK CLRB @#TTYOCH ;ALWAYS LEAVE IN TTY MODE JMP @#DEFORE ;---READ COMMAND--- .GLOBL DERE,IFIX,DEC R0,@#DECMD1+20 MOV R1,@#DECMD1+22 DERE1: JSR PC,@#RSTARG DERE2: CMP @#DECMD1+10,#177777 ;BUF POSITION SPECIF ? BNE DERE2AMD,DECMD1,QA,QADATF,TTYICH,QAERR .GLOBL FORMAT,QAANS,$POLSH,$CMR,SAVARG,RSTARG,DEPUT .GLOBL DEFORE,DEDATA,TTYECH,DEFLCK,DETLE, ;YES CLR -(SP) ;PUT DEFAULT-1 ON STACK TST @#DECMD1+4 ;#SKP SPECIF ? BPL DERE3 ;YES CLR -(SP) ;NO PUT DEFAULT DEEOL ;ROUTINES CALLED IFIX,QA,FORMAT,$POLSH,SAVARG,RSTARG,DEPUT,DECHR ; DEOPBU,DETLE,DEEOL ;--- PRE [B] [#PTS [#SKP[BUF#SKP ON STACK TST @#DECMD1 ;#PTS SPECIF? BPL DERE5 ;YES MOV @#DEDATA,R3 ;NO R3=DATASIZE DEFAULT #PTS BR DERE6A DE 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)RE2A: JSR R5,@#IFIX BR DERE2B DECMD1+10 DERE2B: DEC R0 BPL DERE03 MOV #11.,R0 JMP DEREEE ;BUF POSITION-1 < 0 ? (ERR ;SKIP - NUMBER OF PTS TO SKIP OVER BEFORE READING IN # ; SKIP DEFAULTS TO 0 ;BUF POSITION - IS THE NUMBERED POSITION WITHIN ) DERE03: MOV R0,-(SP) ;SAV BUF POSITION ON STACK DERE3: JSR R5,@#IFIX BR DERE4 DECMD1+4 DERE4: MOV R0,-(SP) ;SAVE #SKPB WHERE THE INPUT ; DATA WILL BEGIN. DEFAULT = 1 ;L & H - ALL DATA OUTSIDE THESE LIMITS, WOULD BE SET TO THE ; CORRESPONS TILL 'IFIX' IS DONE DERE5: JSR R5,@#IFIX BR DERE66 DECMD1 DERE66: MOV R0,R3 ;SAVE #PTS IN R3 BGT DERE6A CMP (SP)+,(DS 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 @#D 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 H: 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 MAT ;TTY - TELL USER # PTS HE ENTERED .BYTE CRLFC0,TEXT ; SO FAR. .ASCII /PTS=/ ;OUTPUT # PTS READ IN SO FAR .BYTE 0,COLS MOV @#DECMD,@#DECMD+2 ;CHK TO SEE IF BUFR IS F.P. JSR PC,@#DEFLCK ;BUFR MUST BE IN 'DECMD+2' FOR 'DEFLCK' RTS PC ;WE ARET,5,SING .BYTE 300 ;UNSIGNED VALUE + 'DERE30' HOLDS VALUE. .EVEN DERE30: 0 ;CONTAINS VALUE TO BE OUTPUT .BYTE EXIT . DONE! ;SEE IF MORE DATA IS IN QA BUFR DERE13: JSR R5,QA 400+10 ;SILENT QUEST & F.P. INPUT TSTB QADATF BEQ DERE29 ;NOEVEN ;GET A NEW LINE OF DATA DERE7: JSR R5,@#QA 10000+10 ;NULL QUEST (CRLF) & F.P. INPUT TSTB @#QADATF BEQ DEREDN ;REA MORE DATA, GO GET MORE BR DERE8 ;SOMEONE IS MIXED UP IF WE GET HERE, AS THIS MEANS THE INPUT ;DATA REACHED AN END TOO SOON CHED E.O. DATA DERE8: TSTB @#QAERR BNE DEREE2 ;BAD DATA (ERR) TST R4 ;SKIP OVER THIS DATUM? BEQ DERE9 ;NO! DEC R4 ; DEREDN: TSTB @#TTYICH BEQ DERE29 ;TTY - FORCE USER TO ENTER MORE DATA BR DEREE3 ;H.S.R. - STILL NEED MORE DATA (ERR) ;YES! DECR SKIP CTR DEC R3 ;DECR DONE CTR BEQ DERE14 INC DERE30 ;INCR CURRENT DATA CTR. BR DERE13 DERE9: JSR PC,@#SAVERRORS DEREE1: MOV #9.,R0 ;BAD DEVICE NAME BR DEREEE DEREE2: MOV #13.,R0 ;BAD DATA VALUE! BR DEREEE DEREE3: MOV #14.,ARG MOV @#QAANS+2,-(SP) MOV @#QAANS,-(SP) ;PUT DATUM ON STACK MOV @#DECMD1+22,-(SP) MOV @#DECMD1+20,-(SP) ;PUT 'H' ON STR0 ;E.O.PAPERTAPE DEREEE: TST (SP)+ ;POP THE REGULAR RTN ADDR OFF STACK CLRB @#TTYECH CLRB @#TTYICH ;ALWAYS RESET TTY & ESP)+ ;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 ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ;R4= (OPTION 0=L, 1=E) JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES MOV @#DEDATA,R1 SUB #5,R1 ;R1=DATASIZE -5 BPL AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;DEDE1A JMP DEDEE1 ;DATASIZE MUST BE > 4 PTS (ERR) DEDE1A: INC R1 ;R1=DATASIZE -4 (DONE CTR) MOV #4,R0 ;R0=INDEX PTR FCHO JMP @#DEFORE ;CALL ERROR ROUTN .GLOBL QA,QADATF,DEFORE ;ROUTINES CALLED: QA,DEFORE ;---DECHR--- ;CALL QA TO GET 'THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL DEV' OR 'SUPPRESS SWITCH' ;DEV=TTY(T), L.S.R. OR LPT (L), H.S.R. OR H.S.P. (H) ;SUPPRESS SWITCH= NO(N) OR YES(Y) ;RETURN EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT R0=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 OKSUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETERS ;VR14$ ;ASSEMBLE CODE FOR VR14 ;+SILENT QUEST+ALPHANU CMD DEVADR TSTB @#QADATF BNE DECHR1 MOV #177777,R0 ;NO DATA, SIGNAL DEFAULT R0=-1 RTS PC DECHR1GT40$ ;ASSEMBLE CODE FOR GT40 ;DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .IFDF SPBDE$ .I: TST R0 BMI DEVEE1 ;OTHER THAN T,L,H,Y,N SPECIF (ERR) RTS PC ;R0=0(T), 1(L), 2(H), 3(N), 4(Y) DEVEE1: CMP (SP)+,(SP)+ ;PFDF CAPS$ .GLOBL DEOPBU,DEFLCK,DEEOL .ENDC .GLOBL DEDE,DECMD,DEDATA,SAVARG,RSTARG,DEGET,DEPUT,DETLE .GLOBL $POLSH,$NGR,$SBROP 2 RETURNS OFF STACK MOV #9.,R0 ;BAD DEV OR SWITCH JMP @#DEFORE ;COMMAND LIST USED BY QA TO FIND 'DEV' DEVADR: .BYT,$MLR,$ADR,$DVR,DEFORE,QA,QADATF,DECMD1 ;ROUTINES CALLED: SAVARG,RSTARG,DEGET,DEPUT,$POLSH,DEFORE,DEOPBU ; QA,DEFLCK,DETLE,E 6 .BYTE 1 ;1 CHAR CMD .BYTE 'T ;TTY .BYTE 'L ;L.S.R. OR LPT .BYTE 'H ;H.S.R. OR H.S.P. .BYTE 'N ;NO .BYTE 'Y ;YES DEEOL ;--- BDE B1 B2 OPTION --- ;THE DERIVATIVE OF THE ENTIRE DATA OF B1 IS TAKEN AND STORED IN B2. ;B2 DEFAULTS TO B1 IF NO .BYTE 0 .EVEN .ENDC 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 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 ONFINAL 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 TO 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 INDEX 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 ONTO STACK JSR R4,@#$POLSH $SBR,$MLR,.+2 JMP DEDEBK ;GO BACK ;QUADRATIC 5-PT LEAST-SQUARES-FIT DERIVATIVE ;Y(I)=(Y(IOR '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 ;'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 '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 @#QA&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 ENDDATF BNE DEIN0 CLR R0 ;NO DATA--DEFAULT OPTION BR DEIN2 DEIN0: TST R0 BPL DEIN2 JMP DEINE1 ; (BAD OPTION) DEIN2: MPT VALUE IN RING BUF DENDPT: JSR PC,@#SAVARG MOV @#DECMD1+12,-(SP) ;GET X MOV @#DECMD1+10,-(SP) MOV @#DECMD1+6,-(SP) ;GOV R0,@#DECMD+4 ;SAV OPTION AWAY JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES CLR @#DECMD1 CLR @#DECMD1+2 ;'MPIVOT'=0 C+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 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 1+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 MOV4,R0 MOV (SP)+,(R2)+ MOV (SP)+,(R2)+ ;PUT 2ND PT IN RING BUF JSR PC,DEINCK ;E.O.RING BUF CHK ;REMAINING PTS FOUND USI DECMD1+20,R2 DEINC: RTS PC DESUBB: CLR -(SP) MOV #40500,-(SP) JMP @(R4)+ ;ERRORS DEINE1: MOV #15.,R0 TST (SP)+ NG 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) MO JMP @#DEFORE ;COMMAND LIST USED BY 'QA' TO FIND OPTION DEINAD: .BYTE 3,1 .BYTE 'A ;ABSOLUTE INTEGRAL .BYTE 'R ;RUNNILR @#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$JOB/RT11 TTYIO .R MACRO *BIN:SPCORE