/TK4013.PA-GRAPHICS TERMINAL SIMULATOR / / /JOHN P. RANCK /DEPARTMENT OF CHEMISTRY /ELIZABETHTOWN COLLEGE /ELIZABETHTOWN, PENNA. 17022 / / / / / /A PROGRAM TO SIMULATE A TEKTRONIX 4013 GRAPHICS TERMINAL /CONNECTED TO A HOST COMPUTER (DEC-10 IN THIS APPLICATION) / / /HARDWARE REQUIRED: / / 1. PDP-8 WITH 8K MEMORY (OR CONDITIONALLY 4K; SEE BELOW) / 2. TEKTRONIX 613 (OR 611 PRESUMABLY) OR SIMILAR STORAGE MONITOR / 3. VC8E X-Y INTERFACE FOR STORAGE MONITOR / 4. KL8E OR SIMILAR SERIAL LINE INTERFACE FOR HOST COMPUTER / 5. TELETYPE OR SIMILAR TERMINAL. DECWRITER WITH NUMERIC KEYPAD / FOR CURSOR CONTROL IS EXCELLENT / 6. (OPTIONAL) 10 V. FULL SCALE X-Y PLOTTER WITH REMOTE PEN LIFT / SUCH AS HEWLETT PACKARD 7015A / 7. (OPTIONAL) USER CONSTRUCTED ANALOG SWITCH CIRCUIT FOR COMPUTER / MUTING OF PLOTTER SERVO MOTORS /PROGRAM DESCRIPTION: / /THE PROGRAM ITSELF OCCUPIES ALL OF MEMORY FIELD 0 EXCEPT FOR THE LAST /PAGE (7600-7777) WHICH IS LEFT FOR THE MONITOR. A SHORTENED /VERSION OF UTIL10.PA (DECUS NO. 8-XXX) WHICH CONTAINS A GROUP OF /ROUTINES TO LOG ON AND OFF THE DEC-10 AND TO SET LINE CHARACTERISTICS /RESIDES IN LOCATIONS 6600-7577. THESE ROUTINES MAY BE REPLACED BY /OTHERS ADAPTED TO OTHER HOST COMPUTERS OR THESE FUNCTIONS MAY /BE PERFORMED MANUALLY, IN WHICH CASE THESE MEMORY LOCATIONS ARE NOT USED. / /THE ENTIRE MEMORY FIELD 1 (EXCEPT FOR 17600-17777) IS USED AS A CIRCULAR /BUFFER FOR CHARACTERS RECEIVED FROM THE HOST COMPUTER. THIS IS /EXTRAVAGANT AND UNNECESSARY; IT WAS DONE ONLY BECAUSE THE MEMORY WAS /AVAILABLE. IF UTIL10 OR ITS EQUIVALENT IS NOT USED IN FIELD 0, THIS /BUFFER MAY BE SHORTENED AND PLACED IN LOCATIONS 6600-7577 AND THE ENTIRE /PROGRAM CAN BE PACKED INTO A 4K SYSTEM. IT MAY BE NECESSARY TO USE /THE XON AND XOF COMMANDS TO THE HOST MONITOR TO PREVENT THE HOST FROM /OVERFILLING THIS SMALLER BUFFER. NORMALLY THE PROGRAM CAN KEEP UP /WITH A 1200 BAUD SERIAL TRANSMISSION FROM THE HOST COMPUTER AND THE /LARGER BUFFER IS SUPERFLUOUS. AN EXCEPTION OCCURS WHEN THE (SLOW) /PLOTTER IS USED. / /IN THIS IMPLEMENTATION LOCATION 17777, WHICH IS IN THE SYS AREA BUT /WHICH IS UNUSED BY THE MONITOR, HAS BEEN USED AS A STATUS WORD /FOR THE HOST COMPUTER. / /THE MAIN PROGRAM (BEGINNING AT LOCATION 200) IS A SHORT ENDLESS LOOP WHICH / 1. CHECKS THE HEYBOARD FOR A CHARACTER AND UPON FINDING ONE EITHER / A. EXERCISES THE APPROPRIATE "TERMINAL" CONTROL OR / B. TRANSMITS THE CHARACTER TO THE HOST COMPUTER / AND 2. CHECKS THE BUFFER AREA FOR UNTREATED CHARACTERS FROM THE HOST AND / UPON FINDING ONE, INITIATES THE APPROPRIATE "GRAPHICS TERMINAL" / RESPONSE. /COMMUNICATION WITH THE HOST COMPUTER IS HANDLED BY THE INTERRUPT SERVICE /ROUTINE IN LOCATIONS 50-101. /SPECIAL KEYBOARD FUNCTIONS / /PAGE, RESET, VIEW, ETC., KEYS AND CURSOR CONTROLS NORMALLY /FOUND ON THE TEKTRONIX TERMINALS ARE ABSENT FROM THE DECWRITER KEYBOARD /AND MUST BE SIMULATED. / / TILDE- (ASCII 176) IS USED FOR THE PAGE COMMAND. / GRAVE- (ASCII 140) IS USED TO RESTORE OR INTENSIFY THE DISPLAY / AS WELL AS A TRAP CHARACTER. / / THE FOLLOWING CONTROL CHARACTERS HAVE SPECIAL EFFECTS WHEN THEY / IMMEDIATELY FOLLOW THE TRAP CHARACTER (GRAVE). / / CTRL R- RESET. / CTRL A- SELECT ALTERNATE (APL) CHARACTER SET (CRT ONLY). / CTRL N- SELECT NORMAL CHARACTER SET. / CTRL T- PRINT ALPHANUMERICS ON TTY. / CTRL D- PRINT ALPHANUMERICS ON CRT DISPLAY. / CTRL P- PLOTTER ON (CRT OFF). / CTRL C- PLOTTER OFF (CRT ON). / CTRL E- EXIT TO OS/8 MONITOR. / CTRL K- LOG OFF HOST AND EXIT TO OS/8 MONITOR. / /THE NUMERIC KEYPAD IS USED FOR CURSOR CONTROL. ON DECWRITERS WITHOUT /NUMERIC KEYPAD, ANOTHER GROUP OF 3 X 3 KEYS MAY BE USED. PRESSING /ANY OF THE 8 CHARACTERS AROUND THE PERIPHERY OF THE 3 X 3 ARRAY /(I.E., 1 THROUGH 4 AND 6 THROUGH 9) RESULTS IN MOVING THE CURSOR ONE /STEP IN THE DIRECTION THAT THE KEY IS FROM THE CENTER OF THE ARRAY /(I.E., 1=SOUTHWEST, 2=SOUTH, 6=EAST, 7=NORTHWEST, ETC.). /LARGE (8 RASTER POINTS) AND SMALL (1 RASTER POINT) STEPSIZES EXIST. /THE LARGE STEP IS INITIALLY CHOSEN. THE SMALL STEP IS SPECIFIED BY /PRESSING THE "." (PERIOD) KEY (THE SMALLER KEY AT THE BOTTOM OF THE NUMERIC /KEYPAD) AND THE LARGER STEP IS SPECIFIED BY PRESSING THE "0" (ZERO) /KEY (THE LARGER KEY AT THE BOTTOM OF THE NUMERIC KEYPAD). THE REPEAT KEY IS /USEFUL FOR MOVING THE CURSOR LONG DISTANCES. PRESSING THE "5" KEY IN THE /CENTER OF THE NUMERIC KEYPAD RETURNS THE CURSOR TO ITS ORIGINAL OR /HOME POSITION (WHERE IT WAS BEFORE CURSOR CONTROL WAS EXERCISED). /THE PROGRAM IS THOROUGHLY DOCUMENTED WITH COMMENTS IN NEARLY EVERY LINE OF THE /LISTING AND A LOGIC FLOW CHART IS GIVEN AT THE BEGINNING OF EACH SUBROUTINE. / / /ALL PARAMETERS TO BE SET BY THE USER ARE CONTAINED IN THE FIRST PAGE OF CODE. /CONDITIONAL ASSEMBLY PARAMETERS KEEP THE CODE AS SHORT AS POSSIBLE. /THE CODE ACTUALLY ASSEMBLED WILL BE SSHORTER IF (1) THE EXTENDED ARITHMETIC /ELEMENT WITH HARDWARE MULTIPLY/DIVIDE IS PRESENT, OR (2) NO PLOTTER /IS PRESENT. /ASSEMBLY PARAMETERS TO BE SET BY USER EAE=0 /=1 IF EXTENDED ARITHMETIC ELEMENT (HARDWARE /MULTIPLY-DIVIDE) IS AVAILABLE PLOTER=1 /=1 IF X-Y PLOTTER IS AVAILABLE /DEVICE CODES TO BE SET BY USER DISDEV=05 /DEVICE CODE SET FOR VC8E (OS/8 DEC STANDARD=05) INTEN=16 /DEVICE CODE FOR INPUT FROM HOST COMPUTER (SET ON KL8-E BOARD) OUTTEN=17 /DEVICE CODE FOR OUTPUT FROM HOST COMPUTER (SET ON KL8-E BOARD) /VC8E COMMANDS DICL=10^DISDEV+6001 DISD=10^DISDEV+6002 DILX=10^DISDEV+6003 DILY=10^DISDEV+6004 DIXY=10^DISDEV+6005 DILE=10^DISDEV+6006 DIRE=10^DISDEV+6007 /KL8E INPUT COMMANDS TENKCF=10^INTEN+6000 TENKSF=10^INTEN+6001 TENKIE=10^INTEN+6005 TENKRB=10^INTEN+6006 /KL8E OUTPUT COMMANDS TENTFL=10^OUTTEN+6000 TENTSF=10^OUTTEN+6001 TENTCF=10^OUTTEN+6002 TENTLS=10^OUTTEN+6006 /DEFINITION OF MULTIPLY AND DIVIDE COMMANDS, DEPENDING ON WHETHER EAE PRESENT IFZERO EAE < MUY=JMS I [MULTPY DVI=JMS I [DIVIDE > IFNZRO EAE < MUY=7405 DVI=7407 > FIXTAB /INTERRUPT IS VECTORED TO LOCATION 0 *0 0 JMP INTER /JUMP TO INTERRUPT WERVICE ROUTINE /STATUS REGISTER STATUS, 0 /A SOFTWARE STATUS REGISTER USED FOR MANY HOUSEKEEPING /FUNCTIONS (SEE FOLLOWING) /BITS FOR STATUS REGISTER MODMSK, 6000 /COMBIIATION OF BITS 0 AND 1 GRMODE, 4000 /BIT 0; GRAPHICS (GR) MODE GIMODE, 2000 /BIT 1; GRAPHIC INPUT (GI) MODE IFNZRO PLOTER < ALTDIS, /BIT 2; ALTERNATE DISPLAY DEVICE (PLOTTER) HCMODE, 1000 /OR HARDCOPY (HC) MODE > ALTAN, 0400 /BIT 3; ALTERNATE ALPHANUMERIC DEVICE (TTY) ALTCHR, 0200 /BIT 4; ALTERNATE CHARACTER SET MARGIN, 0100 /BIT 5; MARGIN 1 (ALTERNATE MARGIN) ESCTRP, 0040 /BIT 6; ESCAPE CHARACTER RECEIVED FROM HOST KBTRAP, 0020 /BIT 7; TRAP CHARACTER RECEIVED FROM KEYBOARD /AUTO-INDEX REGISTERS (BE SURE NOT TO MOVE FROM MEMORY LOCATIONS 10-17) RECPT, -1 /POINTER TO BUFFER FOR INCOMING CHARACTER GETPT, -1 /POINTER TO BUFFER FOR OUTGOING CHARACTER /BITS FOR VC8E STATUS REGISTER CRSBT, 0040 /CURSOR BIT MCRSBT, 7737 /COMPLEMENT OF CURSOR BIT STORE, 0020 /STORE BIT ERASBT, 0010 /ERASE BIT IFNZRO PLOTER < PLTON, 0004 /PLOTTER SERVO ON BIT PLTOF, 7773 /COMPLEMENT OF PLOTTER SERVO BIT PEN, 0002 /PEN DOWN BIT PENUP, 7775 /COMPLEMENT OF PEN DOWN BIT > /SOME CONSTANTS AND VARIABLES CONVENIENTLY STORED ON PAGE ZERO HOMEX, -1000 /X COORDINATE OF "HOME" LOCATION HOMEY, 577 /Y COORDINATE OF "HOME" LOCATION LASTX, 0 /LAST X COORDINATE DISPLAYED LASTY, 0 /LAST Y COORDINATE DISPLAYED NEWX, 0 /NEXT X COORDINATE TO BE DISPLAYED NEWY, 0 /NEXT Y COORDINATE TO BE DISPLAYED CURSX, 0 /X COORDINATE OF CURSOR CURSY, 0 /Y COORDINATE OF CURSOR KBMON, 7600 /ADDRESS TO RETURN TO OS/8 IFNZRO PLOTER < VECTIM, -2400 /TIME CONSTANT IN VECTOR PLOTTING ROUTINE PENTIM, -3000 /TIME CONSTANT IN PEN RAISE/LOWER ROUTINE > MTTWID, -204 /MINUS NO. CHARACTERS PER LINE ON CONSOLE OUTPUT DEVICE /132 DECIMAL = 204 OCTAL FOR DECWRITER; 72 DECIMAL = 110 OCTAL FOR TTY) MDIWID, -112 /74 CHARACTERS LINE WIDTH FOR DISPLAY DKVECT, 0 /FLAG FOR DARK VECTOR PNTTAB, 0 /POINTER TO CHARACTER TABLES CHARCT, 0 /COUNT OF CHARACTERS IN PRESENT LINE LINECT, 0 /COUNT OF LINES IN THIS COLUMN ON DISPLAY DEVICE TENTPF, 0 /SOFTWARE FLAG FOR OUTPUT SIDE OF HOST COMPUTER INTERFACE /INTERRUPT SERVICE ROUTINE / SAVE ACCUMULATOR AND LINK / SELECT (DEVICE) / / (DEC-10 INPUT) / / / READ CHARACTER / / / STORE CHARACTER IN BUFFER / / / IF (END OF BUFFER) RESET POINTER / / ////////FIN / / (DEC-10 OUTPUT) / / / CLEAR HARDWARE FLAG / / / SET SOFTWARE FLAG / / ////////FIN / ////////FIN / RESTORE ACCUMULATOR AND LINK / TURN INTERRUPT FACILITY ON ////////FIN INTER, DCA SAVEAC /SAVE AC RAL DCA SAVEL /AND LINK TENKSF /IS INTERRUPT FOR HOST INPUT? JMP OUTFLT /NO; TRY HOST OUTPUT TENKRB /YES; READ CHARACTER CDF 10 /CHANGE TO FIELD 1 DCA I RECPT /AND STORE CHAR IN BUFFER AND INCREMENT POINTER CDF 0 /RESET FIELD 0 TAD RECPT /CHECK BUFFER POINTER TAD M7577 /IS IT POINTING SZA CLA /TO SYSTEM AREA? JMP INTEX /NO; EXIT INTERRUPT SERVICE ROUTINE CMA /YES; RESET POINTER TO -1 DCA RECPT /SO IT INCREMENTS TO LOCATION 0 NEXT JMP INTEX /AND EXIT INTERRUPT SERVICE ROUTINE OUTFLT, TENTSF /IS INTERRUPT BECAUSE HOST OUTPUT CHARACTER CLEAR? JMP INTEX /NO; EXIT INTERRUPT SERVICE ROUTINE TENTCF /YES; CLEAR FLAG SO NO FURTHER INTERRUPTS OCCUR ISZ TENTPF /AND SET SOFTWARE FLAG INTEX, CLA CLL /EXIT INTERRUPT SERVICE ROUTINE TAD SAVEL /GET LINK RAR /AND RESTORE IT TAD SAVEAC /GET AC ION /TURN INTERRUPT FACILITY ON JMP I 0 /AND RETURN FROM WHENCE INTERRUPT OCCURRED SAVEAC, 0 /LOCATION TO HOLD AC DURING INTERRUPT SAVEL, 0 /LOCATION TO HOLD LINK DURING INTERRUPT M7577, -7577 /ADDRESS BEFORE BEGINNING OF SYSTEM AREA /TO INITIALIZE- / FIX ALL DEVICE FLAGS / SET DISPLAY TO STORE / ERASE- / SET AN MODE / SET AND DEVICE TO DISPLAY / SET GR DEVICE TO DISPLAY / SET NORMAL CHARACTER SET / HOME- / LOGIN DEC-10 / TURN DEC-10 INTERRUPT ON ////////FIN INIT, 0 /BEGINNING OF INITIALIZE PROCEDURE KSF; TENKCF; TFL; TENTFL; DICL /INITIALIZE ALL FLAGS TAD STORE /SET DISPLAY DILE /TO STORE JMS ERASE /ERASE SCREEN DCA STATUS /CLEAR STATUS REGISTER (AN MODE;NORMAL DEVICES AND CHAR SET) JMS HOME /MOVE BEAM TO HOME POSITION JMS UTIL10 /USE UTILITY ROUTINE TO LOGIN DEC-10 IF NECESSARY 4000 /ARGUMENT FOR LOGIN KIE /SET TTY INTERRUPT OFF IAC TENKIE /SET HOST INTERRUPT ON CLA ION /ENABLE INTERRUPT FACILITY JMP I INIT /EXIT INITIALIZE PROCEDURE /TO EXIT- / ERASE AND SET TO NON-STORE / TURN DEC-10 INTERRUPT OFF / IF (PLOTTER PRESENT) TURN PLOTTER OFF PROPERLY / IF (^K ON KEYBOARD) LOG OFF DEC-10 / RETURN TO KEYBOARD MONITOR ////////FIN EXIT, IOF /TURN INTERRUPT FACILITY OFF TAD ERASBT /CLEAR ALL BITS IN DISPLAY REGISTER DILE /EXCEPT ERASE BIT WHICH WILL CLEAR AFTER ERASE CLA TENKIE /SET HOST COMPUTER INTERRUPT OFF IFNZRO PLOTER < TAD HCMODE /GET HC MODE BIT AND STATUS /FROM STATUS REGISTER SZA CLA /IF PLOTTER IS TURNED ON JMS CLRHC /TURN IT OFF PROPERLY > TAD KBCHAR /GET LAST CHARACTER ENTERED FROM KEYBOARD TAD MCTRLK /AND COMPARE TO ^K SZA CLA /IS IT ^K? JMP .+3 /NO; MUST BE ^E; SIMPLE EXIT JMS UTIL10 /YES; LOG OFF DEC-10 0 /ARGUMENT FOR LOG OFF JMP I KBMON /AND EXIT THE PROGRAM BY RETURNING TO KB MONITOR /TO HOME- / MOVE TO HOME POSITION / FIX AN CURSOR / SET MARGIN 0 / RESET CHARACTER COUNTER / RESET LINE COUNTER ////////FIN HOME, 0 TAD HOMEX /GET X COORDINATE OF HOME LOCATION DCA NEWX /AND STORE IT AS NEXT LOCATION TAD HOMEY /GET Y COORDINATE OF HOME LOCATION DCA NEWY /AND STORE IT AS NEXT LOCATION ISZ DKVECT /SET DARK VECTOR JMS DISVEC /AND MOVE TO HOME JMS ACRSON /TURN ALPHANUMERIC CURSOR ON /(SUBROUTINE WILL CHECK FOR AN MODE) TAD MARGIN /GET MASK FOR ALTERNATE MARGIN BIT CMA /COMPLEMENT IT AND STATUS /SO IT MASKS ALL OTHER BITS FROM STATUS REGISTER DCA STATUS /AND EFFECTIVELY CLEARS THE MARGIN BIT DCA CHARCT /SET CHARACTER COUNTER TO ZERO DCA LINECT /SET LINE COUNTER TO ZERO JMP I HOME /EXIT HOME SUBROUTINE PAGE /TEKTRONIX 4010 GRAPHICS TERMINAL PROGRAM--BEGINNING OF PROGRAM / INITIALIZE- / WHILE (TRUE) ,I.E. FOREVER / / IF (CHARACTER AT KEYBOARD) / / / READ KEYBOARD / / / HANDLE-KEYBOARD-CHARACTER / / ////////FIN / / TEST-FOR-HOST-CHARACTER AND IF PRESENT HANDLE-HOST-CHARACTER / ////////FIN ////////FIN JMS INIT /INITIALIZE- FOREVR, KSF /HAS CHARACTER BEEN RECEIVED FROM KEYBOARD? JMP .+3 /NO; CHECK HOST FOR INPUT KRB /YES; READ IT JMS KBHNDL /AND TAKE CARE OF IT JMS HOCHIN /TO CHACK FOR CHARACTER FROM HOST AND TAKE CARE OF IT IF ANY JMP FOREVR /LOOP ENDLESSLY; THE PROGRAM IS EXITED BY KEYBOARD COMMAND /TO TEST-FOR-HOST-CHARACTER / IF (CHARACTER PRESENT) / / IF (END OF BUFFER) RESET POINTER / / GET CHARACTER FROM HOST / / HANDLE HOST CHARACTER / ////////FIN ////////FIN HOCHIN, 0 TAD RECPT /GET INPUT POINTER TO BUFFER CIA /AND COMPARE IT TAD GETPT /TO OUTPUT POINTER SNA CLA /SAME? JMP HOINEX /YES; NOTHING FROM HOST COMPUTER SO LEAVE CDF 10 /NO; CHANGE TO FIELD 1 TAD GETPT /GET BUFFER OUTPUT POINTER TAD M7576 /COMPARE TO NEXT TO LAST LOCATION IN BUFFER SZA CLA /SAME? JMP NOTLST /NO; LEAVE IT ALONE CMA /YES; RESET DCA GETPT /POINTER TO -1 TAD I L7577 /GET LAST CHARACTER SKP NOTLST, TAD I GETPT /GET NEXT CHARACTER CDF 0 /RESET DATA FIELD JMP HOHNDL /GO HANDLE HOST CHARACTER HOINEX, JMP I HOCHIN /EXIT FROM HOST CHARACTER SUBROUTINE M7576, -7576 L7577, 7577 /TO ERASE- / WHEN (HC MODE) / / TYPE MESSAGE FOR NEW SHEET / / MOVE PEN AWAY / / WAIT-FOR-KEYBOARD-ENTRY / / MOVE PEN BACK / ////////FIN / ELSE ERASE DISPLAY ////////FIN ERASE, 0 IFNZRO PLOTER < TAD HCMODE /GET HC MODE BIT AND STATUS /MASK FROM STATUS WORD SNA CLA /HC MODE? JMP ERAS /NO; SO ERASE SCREEN TAD (ERATXT /YES; GET STARTING ADDRESS OF TELETYPE MESSAGE DCA TYTXPT /AND STORE AS POINTER JMS TYPTXT /GO TYPE THE MESSAGE JMS KBWAIT /AND WAIT FOR USER RESPONSE ON KEYBOARD JMP ERASEX /GO TO EXIT > ERAS, TAD ERASBT /GET ERASE BIT MQL /PUT IT IN MQ DIRE /READ VC8E REGISTER MQA /ADD ERASE BIT DILE /AND STORE IN VC8E REGISTER ERASEX, JMP I ERASE /EXIT ERASE SUBROUTINE IFNZRO PLOTER < ERATXT, TEXT /PUT CLEAN PAPER ON PLOTTER; PRESS KEY WHEN READY/ /TO SET-HC-MODE//////////////////////////////////////////// / SET STATUS WORD / TURN CURSOR OFF / TURN ON SERVO / TYPE MESSAGE / MOVE PEN AWAY / WAIT-FOR-KB-INPUT / MOVE PEN BACK ////////FIN SETHC, 0 TAD HCMODE /GET HC MODE BIT MQL /STORE IN MQ REGISTER TAD STATUS /GET STATUS REGISTER MQA /SET HC MODE BIT DCA STATUS /AND PUT ALL BACK IN STATUS REGISTER TAD PLTON /GET PLOTTER SERVO ON BIT MQL /PUT IT IN MQ DIRE /READ BC8E REGISTER AND MCRSBT /MASK ALL BUT CURSOR BIT(I.E.,TURN CURSOR OFF) MQA /SET PLOTTER SERVO BIT DILE /AND RELOAD VC8E REGISTER TAD (SETTXT /GET BEGINNING OF TELETYPE MESSAGE DCA TYTXPT /STORE IT AS A POINTER JMS TYPTXT /GO TYPE IT JMS KBWAIT /AND WAIT FOR USER RESPONSE JMP I SETHC /EXIT SET HARD COPY ROUTINE SETTXT, TEXT /PREPARE PLOTTER; PRESS KEY WHEN READY/ /TO CLEAR-HC-MODE / CLEAR STATUS WORD / TURN CURSOR ON / MOVE PEN AWAY / TURN SERVO OFF ////////FIN CLRHC, 0 TAD P777 /GET VALUE OF MAXIMUM X COORDINATE DILX /AND LOAD IT INTO X DAC JMS WAITSL /WAIT FOR PEN TO SLEW OFF PAGE TAD HCMODE /GET HC MODE BIT CMA /COMPLEMENT IT TO MAKE MASK TO AND STATUS /MASK ALL OTHER BITS FROM STATUS REGISTER DCA STATUS /RESTORE STATUS REGISTER WITH HC BIT OFF DIRE /READ VC8E REGISTER AND PLTOF /MASK ALL BITS EXCEPT PLOTTER SERVO BIT /(I.E., TURN SERVO OFF) DILE /AND RELOAD VC8E REGISTER JMS ACRSON /TURN AN CURSOR ON (IF AN MODE) JMP I CLRHC /EXIT CLEAR HC MODE SUBROUTINE P777, 777 /MAXIMUM X COORDINATE > PAGE /TO HANDLE-KB-CHARACTER / WHEN (KEYBOARD TRAP SET) / / CLEAR KEYBOARD TRAP / / SELECT (CHARACTER) / / / (^R) RESET- / / / (^N) SET NORMAL CHARACTER SET / / / (^A) / / / / SET ALTERNATE CHARACTER SET / / / / SET AN DEVICE TO DISPLAY / / / ////////FIN / / / (^D) SET AN DEVICE TO DISPLAY / / / (^T) UNLESS (ALTERNATE CHARACTER SET) SET AN DEVICE TO TELETYPE / / / (^P) IF (PLOTTER) SET-HC-MODE / / / (^C) IF (PLOTTER) CLEAR-HC-MODE / / / (^E) EXIT- / / / (^K) EXIT-(WITH LOG OFF) / / / (`) / / / / VIEW- / / / / SET KEYBOARD TRAP / / / ////////FIN / / ////////FIN / ////////FIN / ELSE / / SELECT (CHARACTER) / / / (~) PAGE- / / / (`) / / / / VIEW- / / / / SET KEYBOARD TRAP / / / ////////FIN / / / (OTHERWISE) / / / / WHEN (GI MODE) / / / / / SELECT (CHARACTER) / / / / / / (CR) RETURN-CHARACTER-AND-COORDIANTES / / / / / / (NUMERAL OR PERIOD) CONTROL CURSOR / / / / / / (OTHERWISE) HOLD CHARACTER FOR TRANSMIT / / / / / ////////FIN / / / / ////////FIN / / / / ELSE TRANSMIT-TO-HOST / / / ////////FIN / / ////////FIN / /////////FIN ////////FIN KBHNDL, 0 DCA KBCHAR /STORE CHARACTER TEMPORARILY TAD STATUS /GET STATUS WORD AND KBTRAP /MASK KEYBOARD TRAP BIT SNA CLA /IS TRAP SET? JMP KBTPCL /NO; JUMP AHEAD TAD KBTRAP /YES; GET TRAP BIT CMA /AND FORM MASK TO CLEAR IT AND STATUS /MASK ALL OTHER BITS FROM STATUS WORD DCA STATUS /AND RESET STATUS WORD WITH TRAP BIT CLEAR SELCTR, TAD KBCHAR /GET KEYBOARD CHARACTER TAD MCTRLR /ADD MINUS ^R SZA CLA /IS IT ^R? JMP SELCTN /NO; CHECK NEXT OPTION JMS RESET /YES; RESET JMP KBHNEX /AND JUMP TO SUBROUTINE EXIT SELCTN, TAD KBCHAR /GET KEYBOARD CHARACTER TAD MCTRLN /ADD MINUS ^N SZA CLA /IS IT ^N? JMP SELCTA /NO; CHECK NEXT OPTION TAD ALTCHR /YES; GET ALTERNATE CHARACTER SET BIT JMP CLRSTA /AND EXIT SUBROUTINE THROUGH BIT CLEAR SEQUENCE SELCTA, TAD KBCHAR /GET KEYBOARD CHARACTER TAD MCTRLA /ADD MINUS ^A SZA CLA /IS IT ^A? JMP SELCTD /NO; CHECK NEXT OPTION TAD ALTAN /YES; GET ALTERNATE ALPHANUMERIC DEVICE BIT CMA /AND FORM COMPLEMENTARY MASK AND STATUS /MASK ALL OTHER BITS FROM STATUS WORD DCA STATUS /AND RESET STATUS WORD TAD ALTCHR /GET ALTERNATE CHARACTER SET BIT JMP SETSTA /AND EXIT SUBROUTINE THROUGH BIT SET SEQUENCE SELCTD, TAD KBCHAR /GET KEYBOARD CHARACTER TAD MCTRLD /ADD MINUS ^D SZA CLA /IS IT ^D? JMP SELCTT /NO; CHECK NEXT OPTION JMS ACRSON /YES; TURN ALPHANUMERIC CURSOR ON TAD ALTAN /GET ALTERNATE ALPHANUMERIC DEVICE (TTY) BIT JMP CLRSTA /AND EXIT SUBROUTINE THROUGH BIT CLEAR SEQUENCE SELCTT, TAD KBCHAR /GET KEYBOARD CHARACTER TAD MCTRLT /ADD MINUS ^T SZA CLA /IS IT ^T? JMP SELCTP /NO; CHECK NEXT OPTION TAD ALTCHR /YES; GET ALTERNATE CHARACTER SET BIT AND STATUS /AND MASK FROM STATUS WORD SZA CLA /IS ALTERNATE CHARACTER SET REQUIRED? JMP KBHNEX /YES; SO EXIT SUBROUTINE WITHOUT SWITCHING TO TTY /WHICH CAN'T PRINT ALTERNATE CHARACTER SETS JMS ACRSOF /NO; TURN ALPHANUMERIC CURSOR OFF TAD ALTAN /GET ALTERNATE ALPHANUMERIC DEVICE BIT JMP SETSTA /AND EXIT SUBROUTINE THROUGH BIT SET SEQUENCE SELCTP, TAD KBCHAR /GET KEYBOARC CHARACTER IFNZRO PLOTER < TAD MCTRLP /ADD MINUS ^P SZA CLA /IS IT ^P? JMP SELCTC /NO; CHECK NEXT OPTION JMS SETHC /YES; SET HC MODE JMP KBHNEX /AND EXIT SUBROUTINE SELCTC, TAD KBCHAR /GET KEYBOARD CHARACTER TAD MCTRLC /ADD MINUS ^C SZA CLA /IS IT ^C? JMP SELCTE /NO; CHECK NEXT OPTION JMS CLRHC /YES; CLEAR HC MODE JMP KBHNEX /AND EXIT SUBROUTINE SELCTE, TAD KBCHAR /GET KEYBOARD CHARACTER > TAD MCTRLE /ADD MINUS ^E SNA CLA /IS IT ^E? JMP EXIT /YES; EXIT PROGRAM SELCTK, TAD KBCHAR /GET KEYBOARD CHARACTER TAD MCTRLK /ADD MINUS ^K SNA CLA /IS IT ^K? JMP EXIT /YES; EXIT THE PROGRAM SELVIE, TAD KBCHAR /GET KEYBOARD CHARACTER TAD MVIEW /ADD MINUS ` SZA CLA /IS IT `? JMP KBHNEX /NO; EXIT SUBROUTINE VIE, JMS VIEW /YES; INTENSIFY SCREEN TAD KBTRAP /GET KEYBOARD TRAP BIT JMP SETSTA /AND EXIT SUBROUTINE THROUGH BIT SET SEQUENCE KBTPCL, TAD KBCHAR /KEYBOARD TRAP IS CLEAR; GET KEYBOARD CHARACTER TAD MPAGE /ADD MINUS ~ SZA CLA /IS IT ~? JMP SELVU /NO; CHECK NEXT OPTION JMS NEWPAG /YES; GO TO NEW PAGE SEQUENCE JMP KBHNEX /AND EXIT SUBROUTINE SELVU, TAD KBCHAR /GET KEYBOARD CHARACTER TAD MVIEW /ADD MINUS ` SNA CLA /IS IT `? JMP VIE /YES; GO TO INTENSIFY SEQUENCE SELOTH, TAD GIMODE /GET GI MODE BIT AND STATUS /AND MASK FROM STATUS WORD SNA CLA /IS GI MODE SET? JMP SENDIT /NO; CHARACTER IS TO BE TRANSMITTED TO HOST TAD KBCHAR /YES; GET KEYBOARD CHARACTER TAD MCRET /ADD MINUS SZA CLA /IS IT ? JMP CURS /NO; SO IT MUST BE CURSOR CONTROL JMP CLSGIN /YES; SO PREPARE TO CLESE GI MODE SENDIT, TAD KBCHAR /GET KEYBOARD CHARACTER JMS XMITEN /AND GO SEND IT TO HOST KBHNEX, JMP I KBHNDL /EXIT FROM KEYBOARD SUBROUTINE KBCHAR, 0 /STORAGE FOR KEYBOARD CHARACTER MCTRLR, -222 /MINUS ^R MCTRLN, -216 /MINUS ^N MCTRLA, -201 /MINUS ^A MCTRLD, -204 /MINUS ^D MCTRLT, -224 /MINUS ^T MCTRLC, -203 /MINUS ^C MCTRLP, -220 /MINUS ^P MCTRLE, -205 /MINUS ^E MCTRLK, -213 /MINUS ^K MVIEW, -340 /MINUS ` MPAGE, -376 /MINUS ~ MCRET, -215 /MINUS PAGE CLRSTA, CMA /COMPLEMENT AC TO FORM MASK TO CLEAR ALL BITS SAVE THOSE IN AC AND STATUS /AND MASK ALL OTHERS FROM STATUS WORD JMP DCASTA /AND RESET STATUS WORD AS THE SUBROUTINE IS EXITED SETSTA, MQL /PUT BITS TO BE SET INTO MQ REGISTER TAD STATUS /GET STATUS WORD MQA /INCLUSIVE OR ALL BITS TO BE ADDED TO STATUS WORD DCASTA, DCA STATUS /AND RESTORE STATUS WORD JMP KBHNEX /AND EXIT THE SUBROUTINE CLSGIN, TAD GICHAR /GET GRAPHIC INPUT CHARACTER JMS XMITEN /AND SEND IT TO HOST JMS RETCOR /GO TO SUBROUTINE TO SEND COORDINATES TO HOST JMP KBHNEX /AND EXIT THIS SUBROUTINE /TO READ-CURSOR-INPUT / SELECT (CHARACTER) / / (0) SET LARGE STEP SIZE / / (.) SET SMALL STEP SIZE / / (5) RESET CURSOR TO INITIAL VALUE / / (1) DECREMENT X; DECREMENT Y / / (2) DECREMENT Y / / (3) INCREMENT X; DECREMENT Y / / (4) DECREMENT X / / (6) INCREMENT X / / (7) DECREMENT X; INCREMENT Y / / (8) INCREMENT Y / / (9) INCREMENT X; INCREMENT Y / / (OTHERWISE) STORE GI CHARACTER / ////////FIN / MOVE-CURSOR ////////FIN CURS, TAD KBCHAR /GET KEYBOARD CHARACTER TAD MZERO /ADD MINUS 0 SZA CLA /IS IT 0? JMP TRYPER /NO; TRY NEXT OPTION TAD LGSTEP /YES; GET LARGE CURSOR STEP SIZE DCA CURSTP /AND SET CURSOR STEP SIZE WORD JMP KBHNEX /AND EXIT SUBROUTINE TRYPER, TAD KBCHAR /GET KEYBOARD CHARACTER TAD MPER /ADD MINUS . SZA CLA /IS IT .? JMP TRYFIV /NO; CHECK NEXT OPTION TAD SMSTEP /YES; GET SMALL CURSOR STEP SIZE DCA CURSTP /AND SET CURSOR STEP SIZE WORD JMP KBHNEX /AND EXIT SUBROUTINE TRYFIV, TAD KBCHAR /GET KEYBOARD CHARACTER TAD M265 /ADD MINUS 5 SZA CLA /IS IT 5? JMP TRYNUM /NO; CHECK NUXT OPTION TAD LASTX /YES; GET LAST X COORDINATE (BEFORE CURSOR MOVEMENT) DILX /AND RESTORE X DAC DCA CURSX /ALSO SET LAST CURSOR VALUE OF X TAD LASTY /GET LAST Y COORDINATE (BEFORE CURSOR MOVEMENT) DILY /RESTORE Y DAC DCA CURSY /AND SET LAST CURSOR VALUE OF Y JMP KBHNEX /EXIT SUBROUTINE TRYNUM, TAD KBCHAR /GET KEYBOARD CHARACTER TAD M261 /ADD MINUS 1 SPA CLA /IS IT LESS THAN 1? JMP NOTCUR /YES; THEREFORE CHARACTER CANNOT BE CURSOR CONTROL TAD KBCHAR /NO; GET CHARACTER AGAIN TAD M272 /ADD MINUS 10 SMA CLA /IS IT LESS THAN 10? JMP NOTCUR /NO; THEREFORE CHARACTER CANNOT BE CURSOR CONTROL TAD KBCHAR /YES; CHARACTER IS CURSOR CONTROL; GET IT AGAIN AND IIOO /MASK 10'S (OCTAL) AND 4'S BIT SZA CLA /IS EITHER BIT SET? JMP .+3 /YES; JUMP AHEAD CMA /NO; CHARACTER IS 1,2,OR 3; SET AC TO -1 JMP LOADMQ /AND SET IT IN MQ FOR Y CONTROL IAC /CHARACTER IS 4,5,7,8,OR 9; SET AC=1 TAD KBCHAR /AND ADD CHARACTER (CHAR IS INCREMENTED) AND IOOO /MASK 10'2 BIT SZA CLA /IS 10'S BIT SET? IAC /YES; CHAR IS 7,8,OR 9 (REMEMBER INCREMENT);SET AC=1 LOADMQ, MQL /AND SET IT IN MQ FOR Y CONTROL TAD KBCHAR /GET KEYBOARC CHARACTER AGAIN CLL RTR /DO SOME FUNNY STUFF TAD KBCHAR /AND SOME MORE AND OOIO /MASK 2'S BIT FROM MODIFIED CHARACTER SZA CLA /IS 2'S BIT SET JMP .+3 /YES; JUMP AHEAD CMA /NO; CHARACTER MUST BE 1,4,OR 7;SET AC=-1 FOR X MOVEMENT JMP DONCUR /AND JUMP TO CURSOR EXIT TAD KBCHAR /2'S BIT IS NOT SET; GET CHARACTER AGAIN CLL RTR /DO THE SAME FUNNY TAD KBCHAR /STUFF TO THE CHARACTER AGAIN AND OOOI /MASK THE 1'S BIT SZA CLA /IS THE 1'S BIT SET? IAC /YES; CHARACTER IS 3,6,OR 9; SET AC=1 FOR +X MOVEMENT OF CURSOR DONCUR, JMS MOVCUR /+1 OR -1 IS IN MQ FOR Y MOVEMENT OF CURSOR /+1 OR -1 IS IN ACCUMULATOR FOR X MOVEMENT OF CURSOR /GO TO A SUBROUTINE WHICH CAN USE THESE TO MOVE THE CURSOR JMP KBHNEX /AND EXIT THE KEYBOARD SUBROUTINE NOTCUR, TAD KBCHAR /CHARACTER IS NOT CURSOR CONTROL; GET IT AGAIN DCA GICHAR /IT IS A GRAPHIC INPUT CHARACTER; PUT IT AWAY WHERE IT CAN BE USED JMP KBHNEX /AND EXIT KEYBOARD SUBROUTINE MZERO, -260 /MINUS 0 MPER, -256 /MINUS . M265, -265 /MINUS 5 M261, -261 /MINUS 1 M272, -272 /MINUS 2 IIOO, 0014 /MASK FOR SELECTING CURSOR CONTROL CHARACTERS IOOO, 0010 /MASK FOR SELECTING CURSOR CONTROL CHARACTERS OOIO, 0002 /MASK FOR SELECTING CURSOR CONTROL CHARACTERS OOOI, 0001 /MASK FOR SELECTING CURSOR CONTROL CHARACTERS GICHAR, 0 /SOTRAGE OF GRAPHIC INPUT CHARACTER /TO MOVE-CURSOR / IF (MOVE X) / / GET STEPSIZE / / IF (NEGATIVE MOVEMENT) NEGATE STEPSIZE / / ADD TO OLD X VALUE OF CURSOR / ////////FIN / ELSE GET OLD X VALUE OF CURSOR / LOAD X DAC / STORE X VALUE OF CURSOR / IF (MOVE Y) / / GET STEPSIZE / / IF (NEGATIVE MOVEMENT) NEGATE STEPSIZE / / ADD TO OLD Y VALUE OF CURSOR / ////////FIN / ELSE GET OLD Y VALUE OF CURSOR / LOAD Y DAC / STORE Y VALUE OF CURSOR ////////FIN MOVCUR, 0 CLL RAL /MOVE SIGN TO LINK SZA CLA /IS X MOVEMENT OF CURSOR ZERO? TAD CURSTP /NO; GET STEP SIZE SZL /YES; ALSO HERE WITH STEP SIZE IN AC; IS MOVEMENT NEGATIVE? CIA CLL /YES: SO NEGATE STEPSIZE (NEGATING ZERO DOES NOTHING) TAD CURSX /ADD STEP TO OLD VALUE OF X COORDINATE OF CURSOR DILX /LOAD X DAC DCA CURSX /AND STORE UPDATED VALUE OF X COORDINATE OF CURSOR MQA /GET THE Y INCREMENT FROM THE MQ REGISTER CLL RAL /MOVE SIGN TO LINK SZA CLA /IS Y MOVEMENT OF CURSOR ZERO? TAD CURSTP /NO; GET STEP SIZE SZL /YES; ALSO HERE WITH STEP SIZE IN AC; IS MOVEMENT NEGATIVE? CIA CLL /YES; SO NEGATE STEPSIZE (INCLUDING ZERO) TAD CURSY /ADD STEP TO OLD VALUE OF Y COORDINATE OF CURSOR DILY /LOAD Y DAC DCA CURSY /AND STORE UPDATED VALUE OF Y COORDINATE OF CURSOR JMP I MOVCUR /EXIT SUBROUTINE LGSTEP, 0020 /LARGE CURSOR STEP = 16 RASTER UNITS SMSTEP, 0002 /SMALL CURSOR STEP = 2 RASTER UNITS CURSTP, 0 /STORAGE OF PRESENT CURSOR STEP SIZE /TO TYPE A CHARACTER / REPEAT UNTIL (TELEPRINTER READY) / ////////FIN / TYPE CHARACTER / CLEAR AC ////////FIN TYPE, 0 TSF /IS TELEPRINTER FLAG SET? JMP .-1 /NO; GO BACK AND TRY AGAIN TLS /YES; TYPE CHARACTER CLA /CLEAR AC ALWAYS BEFORE RETURN JMP I TYPE /AND RETURN FROM SUBROUTINE /TO RESET- / SET ALPHANUMERIC (AN) MODE / HOME- ////////FIN RESET, 0 TAD MODMSK /GET BITS FOR GI AND GR MODES CMA /COMPLEMENT TO MAKE MASK AND STATUS /TO GET ALL OTHER BITS FROM STATUS WORD DCA STATUS /AND RESET STATUS WORD WITH GI AND GR MODE BITS CLEAR JMS HOME /MOVE BEAM TO HOME POSITION JMP I RESET /AND LEAVE RESET SUBROUTINE PAGE /TO VIEW- / UNLESS (HC MODE) RESTORE TO FULL INTENSITY ////////FIN VIEW, 0 IFNZRO PLOTER < TAD HCMODE /GET HC MODE BIT AND STATUS /MASK IT FROM STATUS WORD SNA CLA /HC MODE? > DIXY /NO; INTENSIFY JMP I VIEW /RETURN FROM INTENSIFY SUBROUTINE (DOING NOTHING IF HC MODE) /TO HANDLE-HOST-CHARACTER / WHEN (ESCAPE TRAP SET) / / CLEAR ESCAPE TRAP / / SELECT (CHARACTER) / / / (FF) PAGE- / / / (ENQ) / / / / UNLESS (GI MODE) RETURN-STATUS / / / / RETURN COORDINATES / / / ////////FIN / / / (SUB) SET GI MODE / / / (OTHERWISE) ERROR- / / ////////FIN / ////////FIN / ELSE / / WHEN (CONTROL CHARACTER) / / / SELECT (CHARACTER) / / / / (EXC) SET EXCAPE TRAP / / / / (CR) / / / / / UNLESS (AN MODE) SET AN MODE / / / / / MARGIN- / / / / ////////FIN / / / / (LF) LINEFEED- / / / / (GS) SET GR MODE / / / / (US) SET AN MODE / / / / (HT) SPACE- / / / / (VT) LINEFEED- / / / / (BS) BACKSPACE / / / / (BEL) RING BELL / / / / (SO) SET ALTERNATE CHARACTER SET / / / / (SI) SET NORMAL CHARACTER SET / / / / (OTHERWISE) ERROR- / / / ////////FIN / / ////////FIN / / ELSE / / / CONDITIONAL / / / / (GR MODE) TREAT-COORDINATE-CHARACTER / / / / (OTHERWISE) /PRINT-CHARACTER / / / ////////FIN / / ////////FIN / ////////FIN ////////FIN HOHNDL, DCA HOCHAR /STORE CHARACTER FROM HOST TEMPORARILY TAD ESCTRP /GET ESCAPE TRAP BIT AND STATUS /AND MASK FROM STATUS WOOD SNA CLA /IS ESCAPE TRAP SET? JMP ESCCLR /NO; JUMP AHEAD TO NEXT SECTION TAD ESCTRP /YES; GET ESCAPE TRAP BIT AGAIN CMA /AND FORM COMPLEMENTARY MASK AND STATUS /TO CLEAR BIT FROM STATUS WORD DCA STATUS /RESET STATUS WORD SELENQ, TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MENQ /ADD MINUS ENQ SZA CLA /IS IT ENQ? JMP SELFF /NO; CHECK NEXT OPTION JMS RETCOR /YES; RETURN COORDINATES JMP HOHNEX /AND EXIT SUBROUTINE SELFF, JMS CLRGI /PRESUME GI MODE AND CLEAR IT TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MFF /ADD MINUS FF SZA CLA /IS IT FF? JMP SELSUB /NO; CHECK NEXT OPTION JMS NEWPAG /YES; GO TO NEW PAGE JMP HOHNEX /AND EXIT SUBROUTINE SELSUB, TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MSUB /ADD MINUS SUB SZA CLA /IS IT SUB? JMP SELERR /NO; CHECK NEXT OPTION TAD GIMODE /YES; GET GI MODE BIT MQL /PUT IT IN MQ REGISTER TAD STATUS /GET STATUS WORD MQA /INCLUSIVE OR GI MODE BIT INTO STATUS WORD DCA STATUS /AND RESTORE STATUS WORD JMS CURSON /TURN CURSOR ON JMP HOHNEX /AND EXIT SUBROUTINE SELERR, JMP HOHNEX /NO ERROR ROUTINE AT PRESENT; SIMPLY EXIT SUBROUTINE ESCCLR, TAD HOCHAR /ESCAPE TRAP NOT SET; GET CHARACTER RECEIVED FROM HOST AND BITS56 /GET MASK FOR 100'S AND 40'S BITS SZA CLA /IS EITHER BIT SET? (IF NOT, IT IS A CONTROL CHARACTER) JMP NOTCTL /BITS NOT SET; CHARACTER IS CONTROL CHARACTER TAD HOCHAR /BITS SET; CHARACTER IS NOT A CONTROL CHARACTER; GET IT AGAIN TAD MESC /ADD MINUS ESC SZA CLA /IS IT ESC? JMP SELCR /NO; CHECK NEXT OPTION TAD ESCTRP /YES; GET EXCAPE TRAP BIT JMP SETST /AND EXIT SUBROUTINE THROUGH BIT SET SEQUENCE SELCR, TAD HOCHAR /GET CHARACTER RECEIVED FFOM HOST TAD MCR /ADD MINUS CR SZA CLA /IS IT CR? JMP SELLF /NO; CHECK NEXT OPTION TAD STATUS /YES; GET STATUS WORD AND GIMODE /AND MASK GI MODE BIT SZA CLA /IS GI MODE SET? JMS CLRGI /YES; CLEAR GI MODE JMS GOMARG /MOVE TO MARGIN TAD GRMODE /GET GR MODE BIT TAD GIMODE /AND GI MODE BIT AND STATUS /MASK BOTH FROM STATUS WORD SNA CLA /IS EITHER SET? JMP HOHNEX /NO; EXIT SUBROUTINE JMP SETAN /YES; SET ALPHANUMERIC MODE (AND EXIT SUBROUTINE) SELLF, TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MLF /ADD MINUS LF SZA CLA /IS IT LF? JMP SELGS /NO; CHECK NEXT OPTION JMS LINFED /YES; LINEFEED JMP HOHNEX /AND EXIT SUBROUTINE SELGS, TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MGS /ADD MINUS GS SNA CLA /IS IT GS? JMP SETGR /YES; SET GR MODE (AND EXIT SUBROUTINE) SELUS, TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MUS /ADD MINUS US SNA CLA /IS IT US? JMP SETAN /YES; SET ALPHANUMERIC MODE (AND EXIT SUBROUTINE) SELHT, TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MHT /ADD MINUS HT SZA CLA /IS IT HT? JMP SELVT /NO; CHECK NEXT OPTION JMS SPACE /YES; SPACE JMP HOHNEX /AND EXIT SUBROUTINE SELVT, TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MVT /ADD MINUS VT SZA CLA /IS IT VT? JMP SELBS /NO; CHECK NEXT OPTION JMS LINFED /YES; LINEFEED JMP HOHNEX /AND EXIT SUBROUTINE SELBS, TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MBS /ADD MINUS BS SZA CLA /IS IT BS? JMP SELBEL /NO; CHECK NEXT OPTION JMS BACKSP /YES; BACKSPACE JMP HOHNEX /AND EXIT SUBROUTINE HOCHAR, 0 /TEMPORARY STORAGE ON THIS PAGE OF CHARACTER RECEIVED FROM HOST /FOLLOWING CHARACTERS ARE SET FOR EVEN PARITY /RECEIVED FROM HOST COMPUTER. MFF, -14 /MINUS FF MENQ, -5 /MINUS ENQ MSUB, -232 /MINUS SUB MESC, -33 /MINUS ESC MCR, -215 /MINUS CR MLF, -12 /MINUS LF MGS, -35 /MINUS GS MUS, -237 /MINUS US MHT, -11 /MINUS HT MVT, -213 /MINUS VT MBS, -210 /MINUS BS BITS56, 140 /MASK FOR BITS WHICH INDICATE NON-CONTROL CHARACTER IF EITHER SET PAGE SELBEL, TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MBEL /ADD MINUS BEL SZA CLA /IS IT BEL? JMP SELSO /NO; CHECK NEXT OPTION TAD BEL /YES; GET ASCII FOR BELL JMS TYPE /AND TRANSMIT TO TELETYPE JMP HOHNEX /AND EXIT SUBROUTINE SELSO, TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MSO /ADD MINUS SO SZA CLA /IS IT SO? JMP SELSI /NO; CHECK NEXT OPTION TAD ALTCHR /YES; GET ALTERNATE CHARACTER SET BIT JMP SETST /AND LEAVE SUBROUTINE THROUGH BIT SET SEQUENCE SELSI, TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST TAD MSI /ADD MINUS SI SZA CLA /IS IT SI? JMP SELOT /NO; CHECK NEXT OPTION MQL /YES; CLEAR MQ REGISTER TAD ALTCHR /AND GET ALTERNATE CHARACTER SET BIT IN AC JMP CLRST /AND EXIT SUBROUTINE THROUGH BIT CLEAR SEQUENCE SELOT, JMP HOHNEX /NO ERROR HANDLING ROUTINE SO JUST EXIT NOTCTL, TAD STATUS /CHARACTER IS NOT CONTROL CHARACTER; GET STATUS WORD AND GRMODE /AND MASK GR MODE BIT SNA CLA /IS GR MODE SET? JMP NOTGR /NO; JUMP AHEAD JMS COORD /YES; TREAT CHARACTER AS A COORDINATE JMP HOHNEX /AND EXIT SUBROUTINE NOTGR, JMS PRCHAR /NOT GR MODE SO PRINT CHARACTER JMP HOHNEX /AND EXIT SUBROUTINE SETGR, ISZ DKVECT /BEGINNING OF SEQUENCE TO SET GR MODE; SET DARK VECTOR FLAG FIRST JMS ACRSOF /TURN AN CURSOR OFF TAD GRMODE /GET GR MODE BIT SKP SETAN, JMS ACRSON /BEGINNING OF SEQUENCE TO SET AN MODE; TURN AN CURSOR ON MQL /LOAD MQ (GR MODE BIT OR 0 IF AN MODE) IFNZRO PLOTER < TAD HCMODE /GET HC MODE BIT AND STATUS /AND MASK FROM STATUS WORD SZA CLA /IS HC MODE SET? TAD HCMODE /YES; GET HC MODE BIT AGAIN MQA /INCLUSIVE OR GR MODE BIT IF SET ABOVE MQL /MOVE ALL THESE BITS (HC AND PERHAPS GR) TO MQ REGISTER > DCA CHARCT /RESET CHARACTER COUNTER (THIS LINE) TO ZERO TAD LASTX /GET LAST VALUE OF X COORDINATE DILX /LOAD IT INTO X DAC TAD K1000 /ADD 1000 TO X COORDINATE (OFFSET IT) SO THAT IT IS POSITIVE TAD M16 /SUBTRACT ONE CHARACTER WIDTH SMA /IF THE RESULT IS NEGATIVE, EXIT THE LOOP ISZ CHARCT /OTHERWISE INCREMENT THE CHARACTER COUTN SMA /STILL PART OF THE EXIT JMP .-4 /IF THE RESULT IS NOT NEGATIVE, GO SUBTRACT ANOTHER CHARACTER WIDTH CLA /OUT OF THE LOOP HERE; GET RID OF RESIDUAL IN AC DCA LINECT /CLEAR LINE COUNTER (THIS COLUMN) TAD LASTY /GET LASY VALUE OF Y COORDINATE DILY /LOAD Y DAC TAD M767 /OFFSET Y COORDINATE SO IT IS ALWAYS NEGATIVE TAD D22 /AND ADD HEIGHT OF ONE CHARACTER (AND SPACE BETWEEN LINES) SPA /IF RESULT IS POSITIVE, EXIT LOOP ISZ LINECT /OTHERWISE, INCREMENT LINE COUNTER SPA /STILL PART OF THE EXIT JMP .-4 /IF RESULT WAS NOT POSITIVE, GO ADD ANOTHER LINE HEIGHT CLA /OUT OF LOOP; GET RID OF RESIDUE IN AC TAD GRMODE /GET GR MODE BIT TAD MARGIN /GET ALTERNATE MARGIN BIT CLRST, CMA /COMPLEMENT THESE BITS TO FORM MASK TO CLEAR THESE BITS AND STATUS /CLEAR THE BITS FROM THE STATUS WORD JMP .+3 /AND JUMP AHEAD SETST, MQL /PUT ALL BITS IN AC INTO MQ REGISTER TAD STATUS /GET STATUS WORD MQA /AND INCLUSIVE OR (SET) THE REQUIRED BITS (IF NOT ALREADY SET) DCAST, DCA STATUS /RESTORE STATUS WORD HOHNEX, JMP HOINEX /EXIT THIS ROUTINE BY JUMPING BACK TO HOST INPUT ROUTINE MBEL, -207 /MINUS BEL BEL, 207 /BEL FOR TTY MSO, -216 /MINUS SO MSI, -17 /MINUS SI K1000, 1000 /A NEEDED CONSTANT M16, -16 /MINUS THE WIDTH OF A CHARACTER SPACE IN RASTER UNITS M767, -767 /A NEEDED CONSTANT D22, 26 /THE HEIGHT OF A CHARACTER SPACE IN RASTER UNITS /TO CLEAR-GI-MODE / CLEAR BI MODE BIT IN STATUS WORD / CLEAR CURSOR BIT IN VC8E REGISTER ////////FIN CLRGI, 0 TAD GIMODE /GET GI MODE BIT CMA /COMPLEMENT IT TO FORM MASK TO AND STATUS /CLEAR BIT FROM STATUS WORD DCA STATUS /AND RESTORE STATUS WORD DIRE /READ VC8E REGISTER AND MCRSBT /MASK ALL BUT CURSOR BIT DILE /AND RESOTRE VC8E REGISTER JMP I CLRGI /EXIT SUBROUTINE /TO TURN-CURSOR-ON / SET CURSOR BIT IN VC8E REGISTER / INTENSIFY / SET LARGE STEP / SET LAST CURSOR COORDINATES TO REMEMBER / PRESET GRAPHIC INPUT DEFAULT CHARACTER (SPACE) ////////FIN CURSON, 0 DIRE /READ VC8E REGISTER AND MCRSBT /MASK ALL BUT CURSOR BIT TAD CRSBT /ADD CURSOR BIT DILE /RESTORE VC8E REGISTER DISD /SKIP IF DISPLAY READY JMP .-1 /ELSE TRY AGAIN DIXY /INTENSIFY TAD LGSTEP /GET LARGE STEP VALUE FOR CURSOR MOVEMENT DCA CURSTP /STORE LARGE VALUE AS DEFAULT CURSOR STEP SIZE TAD LASTX /GET LAST VALUE OF X DISPLAYED DCA CURSX /AND STORE IT TAD LASTY /GET LAST VALUE OF Y DISPLAYED DCA CURSY /AND STORE IT TAD ASCSP /GET ASCII FOR SPACE DCA GICHAR /AND STORE IT AS DEFAULT FOR GRAPHIC INPUT CHARACTER JMP I CURSON /EXIT SUBROUTINE ASCSP, 240 /TO TRANSMIT-A-CHARACTER-TO-HOST / REPEAT UNTIL (SOFTWARE TELEPRINTER FLAG SET) / ////////FIN / CLEAR SOFTWARE TELEPRINTER FLAG / TRANSMIT CHARACTER ////////FIN XMITEN, 0 DCA CHRHLD /STORE CHARACTER TO BE TRANSMITTED TAD TENTPF /GET SOFTWARE TELEPRINTER FLAG SNA CLA /IS FLAG SET? JMP .-2 /NO; TRY AGAIN DCA TENTPF /YES; CLEAR FLAG TAD CHRHLD /GET CHARACTER BACK TENTLS /AND TRANSMIT IT TO HOST CLA /CLEAR AC JMP I XMITEN /AND EXIT SUBROUTINE CHRHLD, 0 /TEMPPRARY STORAGE FOR CHARACTER TO BE TRANSMITTED PAGE IFNZRO PLOTER < /TO TYPE-A-TEXT-MESSAGE / DO (I=1,2) / / GET NEXT WORD FROM TEXT / / IF (I=2) INTERCHANGE BYTES / / GET MOST SIGNIFICANT BYTE / / FIX SEVENTH BIT / / IF (END OF MESSAGE,I.E.,NULL) EXIT / / TYPE-CHARACTER / / IF (I=2) BUMP WORD POINTER / ////////FIN / SEND CR AND LF ////////FIN TYPTXT, 0 CLL /CLEAR LINK AS LOOP COUNTER SEC, TAD I TYTXPT /GET WORD CONTAINING TWO CHARACTERS SZL /DO NOTHING FIRST TIME, BUT BSW /EXCHANGE BYTES SECOND TIME AND MSBYTE /MASK THE LEFT-HAND BYTE WHICH IS THE SIXBIT CHARACTER SMA SZA /SKIP IF SIXTH BIT IS SET OF IF CHAR IS NULL IAC /ELSE SET 7TH BIT; AT THE MOMENT IT IS IN THE WRONG PLACE BSW CML /BUT NOW IT AND THE LS SIX BITS ARE ALL PROPERLY /IN THE 7 LS BITS OF THE 12-BIT WORD; /ALSO, COMPLEMENT LOOP COUNTER WHILE CONVENIENT SNA /IS THE CHARACTER A NULL? JMP END /YES; END OF TEXT SO JUMP TO EXIT JMS TYPE /NO; GO TYPE THE CHARACTER SNL /SKIP FIRST TIME THROUGH (COUNTER WAS COMPLEMENTED ALREADY) ISZ TYTXPT /BUMP TEXT POINTER SECOND TIME ONLY JMP SEC /LOOP ENDLESSLY; (EXIT UPON FINDING A NULL CHARACTER) END, TAD CR /EXIT SEQUENCE; GET ASCII FOR CR JMS TYPE /AND TYPE IT TAD LF /GET ASCII FOR LF JMS TYPE /AND TYPE IT JMP I TYPTXT /EXIT SUBROUTINE TYTXPT, 0 /STORAGE FOR POINTER TO TEXT MSBYTE, 7700 /MASK FOR MOST SIGNIFICANT BYTE /TO WAIT-FOR-USER-RESPONSE / REMEMBER PEN STATUS / IF (PEN DOWN) RAISE PEN / REMEMBER PRESENT PEN LOCATION / MOVE PEN TO RIGHT MARGIN / WAIT FOR KEYBOARD ENTRY / MOVE PEN BACK TO WHERE IT WAS / RESTORE PEN STATUS ////////FIN KBWAIT, 0 DIRE /GET VC8E REGISTER DCA HOLDDI /AND PUT IT AWAY TAD HOLDDI /GET IT AGAIN AND PENUP /CLEAR PEN-DOWN BIT DILE /AND SET REGISTER TO EFFECT ACTION JMS WAITPN /WAIT FOR PEN TO MOVE TAD LASTX /GET PRESENT VALUE OF PEN X COORDINATE DCA HOLDX /AND STORE IT TAD L777 /GET X COORDINATE FOR RIGHT MARGIN DILX /AND LOAD DAC TO MOVE PEN KSF /HAS A CHARACTER BEEN ENTERED AT KEYBOARD? JMP .-1 /NO; LOOK AGAIN UNTIL KCF /IT IS THERE AND THEN LOWER THE FLAG IGNORING THE CHARACTER TAD HOLDX /GET X COORDINATE BACK DILX /AND LOAD DAC TO MOVE THE PEN BACK CLA /CLEAR THE AC SINCE DILX DOESN'T DO IT TAD HOLDDI /GET BACK VC8E STATUS DILE /AND RESTORE IT. THIS INCLUDES PEN UP/DOWN INFO JMP I KBWAIT /EXIT THE SUBROUTINE HOLDDI, 0 /STORAGE FOR VC8E REGISTER HOLDX, 0 /STORAGE FOR X COORDINATE OF PEN L777, 777 /X COORDINATE OF RIGHT-HAND MARGIN > /TO RETURN-STATUS-AND-COORDINATES / UNLESS (GI MODE) SEND STATUS / SEND HI X / SEND LO X / SEND HI Y / SEND LO Y / IF (CR TERMINATOR) / / SEND CR / / IF (EOT TERMINATOR) SEND EOT / ////////FIN ////////FIN RETCOR, 0 TAD GIMODE /GET GI MODE BIT AND STATUS /AND MASK IT FROM STATUS WORD SZA CLA /IS GI MODE SET? JMP CRSCRD /YES; SKIP STATUS WORD AND SEND COORDINATES ONLY TAD GRMODE /GET GR MODE BIT AND STATUS /AND MASK IT FROM STATUS WORD SZA CLA /IS GR MODE SET? IAC /YES; SET BIT IN STATUS REPORT CHARACTER CLL RAL /MOVE BIT LEFT PREPARATORY TO SETTING MARGIN BIT MQL /STORE STATUS REPORT WORD THAT IS BEING FORMED TAD MARGIN /GET ALTERNATE MARGIN BIT AND STATUS /AND MASK IT FROM STATUS WORD SZA CLA /IS ALTERNATE MARGIN SET? IAC /YES; SET A BIT MQA /BRING BACK THE GR MODE BIT CLL RAL /SHIFT ONCE MORE AND STATUS BITS ARE READY TO SEND TO HOST TAD GINTAG /ADD THE IDENTIFYING TAG BITS AND THE ENTIRE CHARACTER IS READY TO SEND JMS XMITEN /SEND THE STATUS CHARACTER ALCORD, TAD LASTX /GET THE LAST X COORDINATE DCA CORDX /AND STORE IT AS THE CURSOR COORDINATE TAD LASTY /GET THE LAST Y COORDINATE DCA CORDY /AND STORE IT AS THE CURSOR COORDINATE JMP SENCOR /JUMP OVER THE NEXT FEW LINES CRSCRD, TAD CURSX /COME HERE IF GI MODE; GET THE LAST CURSOR X COORDINATE DCA CORDX /AND STORE IT WHERE IT CAN BE FOUND TO SEND TAD CURSY /LIKEWISE GET THE LAST CURSOR Y COORDINATE DCA CORDY /AND STORE IT WHERE IT CAN BE FOUND TO SEND SENCOR, TAD CORDX /NOW GET THE PROPER X COORDINATE TAD L1000 /RESTORE IT TO THE EXPECTED RANGE RAL /MOVE IT OVER SO MS 5 BITS IN MS HALF OF WORD BSW /MOVE THE MS 5 BITS TO THE LS BYTE OF THE WORD AND FIVBTS /MASK THE 5 LS BITS TAD GINTAG /ADD THE TAG BITS JMS XMITEN /AND SEND THE HI HALF OF THE X COORDINATE TAD CORDX /GET THE X COORDINATE AGAIN TAD L1000 /RESTORE THE RANGE AGAIN AND FIVBTS /MASK THE LS 5 BITS TAD GINTAG /ADD THE TAG BITS JMS XMITEN /AND SEND THE LO HALF OF THE X COORCINATE TAD CORDY /GET THE Y COORDINATE TAD P600 /RESOTRE TO THE EXPECTED RANGE RAL /MOVE 5 MS BITS TO MS BYTE OF WORD BSW /MOVE 5 MS BITS TO LS BYTE OF WORD AND FIVBTS /MASK THE 5 LS BITS TAD GINTAG /ADD THE TAG BITS JMS XMITEN /AND SEND THE HIGH HALF OF THE Y COORDINATE TAD CORDY /GET THE Y COORDINATE AGAIN TAD P600 /AND RESTORE THE RANGE AGAIN AND FIVBTS /MASK THE 5 LS BITS TAD GINTAG /ADD THE TAG BITS JMS XMITEN /AND SEND THE LO HALF OF THE Y COORDINATE TAD TRMNTR /GET THE TERMINATOR CODE WORD CLL RAL /MOVE EOT BIT INTO LINK AND CR BIT INTO SIGN SNA CLA /IS CR BIT SET? JMP RETCEX /NO; SKIP TERMINATORS; GO TO END OF ROUTINE TAD CR /YES; GET ASCII FOR CR JMS XMITEN /AND SEND IT SNL /IS EOT BIT SET? JMP RETCEX /NO; SKIP TO END OF ROUTINE TAD EOT /YES; GET ASCII FOR EOT JMS XMITEN /AND SEND IT RETCEX, JMP I RETCOR /LEAVE SUBROUTINE GINTAG, 240 /TAG BITS FOR STATUS AND COORDINATE RETURN CHARACTERS CORDX, 0 /STORAGE FOR PROPER (ALPHANUMERIC OF GRAPHIC) CURSOR X COORDINATE CORDY, 0 /DITTO FOR Y COORDINATE L1000, 1000 /SCALE RESTORATION FACTOR; SOFTWARE X COORDINATES RANGE FROM 0-1777; /HARDWARE COORDINATES ARE SET FOR -1000 TO 777 BY HARDWARE JUMPER P600, 600 /SCALE RESTORATION FACTOR; SOFTWARE Y COORDINATES RANGE FROM 780 TO 0 /HARDWARE COORDINATES RANGE FROM -1000 TO 777 BY HARDWARE JUMPER FIVBTS, 37 /MASK FOR 5 LS BITS EOT, 204 /ASCII FOR EOT TRMNTR, 2000 /TERMINATOR CODE SET BY USER; BIT 0 SET FOR EOT; BIT 1 SET FOR CR CR, 215 /ASCII FOR CR /TO PAGE- / ERASE- / RESET- ////////FIN NEWPAG, 0 JMS ERASE /ERASE SCREEN JMS RESET /RESET JMP I NEWPAG /LEAVE NEW PAGE SUBROUTINE PAGE /TO TREAT-COORDINATE-CHARACTER / WHEN (HI) / / WHEN (LAST=X) SET HI Y / / ELSE SET HI X / ////////FIN / ELSE / / WHEN (Y) SET LO Y / / ELSE / / / SET LO X / / / DISPLAY-VECTOR / / ////////FIN / ////////FIN / UPDATE LAST ////////FIN COORD, 0 TAD HOCHAR /GET CHARACTER RECEIVED FROM HOST AND LOBIT /MASK THE LO BIT SZA CLA /IS IT A LO HALF OF A COORDINTAE? JMP LO /YES; JUMP AHEAD TAD LAST /NO; SO IT MUST BE A HI HALF; GET LAST FLAG SZA CLA /WAS LAST CHARACTER AN X COORDINATE? JMP SETHIX /NO; THE PRESENT CHARACTER IS THE HI HALF OF AN X COORDINATE JMS FIXHI /YES; THE PRESENT CHARACTER IS THE HI HALF OF A Y COORDINATE /GO TO A SUBROUTINE THAT FIXES THE CHARACTER AS A HI HALF TAD NEWY /GET THE HOLDING REGISTER FOR Y COORDINATES BEING FORMED AND LS5BTS /MASK THE 5 LS BITS MQA /AND BRING IN THE 5 MS BITS WHICH WERE STORED IN MQ BY THE SUBROUTINE FIXHI TAD M600 /OFFSET PROPERLY FOR THE HARDWARE DCA NEWY /STORE THE RESULTING Y COORDINATE IAC /SET THE AC DCA LAST /AND SET THE LAST = Y FLAG JMP COOREX /AND EXIT THE SUBROUTINE SETHIX, JMS FIXHI /GO TO A SUBROUTINE THAT FIXES THE CHARACTER AS A HI HALF MQA /BRING THE HI HALF INTO THE AC TAD M1000 /SET THE OFFSET EXPECTED BY THE HARDWARE DCA NEWX /AND STORE THE COORDINTE THAT IS BEING FORMED DCA LAST /CLEAR THE LAST = Y FLAG JMP COOREX /AND EXIT THE SUBROUTINE LO, TAD HOCHAR /CHARACTER IS THE LO HALF OF A COORDINATE; GET CHARACTER AGAIN AND YBIT /MASK THE Y BIT SNA CLA /IS THE Y BIT SET? JMP LOX /NO; SO IT MUST BE LO X TAD HOCHAR /YES; IT IS LO Y; GET THE CHARACTER AGAIN AND LS5BTS /MASK THE 5 LS BITS MQL /PUT THEM IN MQ TAD NEWY /GET THE MS 5 BITS AND OFFSET AND MS7BTS /MASK OUT ALL OLD JUNK MQA /AND SET THE LS BITS DCA NEWY /AND STORE THE COMPLETED COORDINATE IAC /SET THE AC DCA LAST /AND THE LAST = Y FLAG JMP COOREX /EXIT THE SUBROUTINE LOX, TAD NEWX /GET THE X COORDINTAE THAT IS BEING FORMED AND MS7BTS /CANCEL OUT ALL THE OLD JUNK IN THE LS 5 BITS MQL /STORE THE HI 5 BITS AND OFFSET IN THE MQ TAD HOCHAR /GET THE CHARACTER AGAIN AND LS5BTS /MASK THE 5 LS BITS MQA /AND BRING BACK THE HI HALF AND OFFSET FROM THE MQ DCA NEWX /STORE THE COMPLETE X COORDINATE DCA LAST /CLEAR THE LAST = Y FLAG JMS DISVEC /ALL COORDINATE SETS END WITH LO X SO GO DISPLAY THE VECTOR COOREX, JMP I COORD /AND LEAVE THE SUBROUTINE LOBIT, 100 /BIT IDENTIFYING THE LO HALF OF A COORDINATE PAIR M600, -600 /OFFSET FOR Y COORDINATES; (SEE SUBROUTINE RETCOR (ABOVE)) M1000, -1000 /OFFSET FOR X COORDINATES; (SEE SUBROUTINE RETCOR (ABOVE)) YBIT, 40 /A BIT IDENTIFYING THE CHARACTER AS PART OF A Y COORDINATE LAST, 0 /=1 IF LAST CHARACTER RECEIVED AND TREATED WAS PART OF A Y COORDINAAE MS7BTS, 7740 /MASK FOR THE MS 7 BITS LS5BTS, 37 /MASK FOR THE LS 5 BITS FIXHI, 0 /A SUBROUTINE TO STRIP THE COORDINATE BITS FROM A HI CHARACTER /SHIFT THEM TO THE RIGHT LOCATION, AND STORE IN MQ TAD HOCHAR /GET THE CHARACTER THAT WAS RECEIVED FROM HOST AND LS5BTS /MASK OUT THE COORDINATE BITS (FROM TAG BITS, ETC.) BSW /MOVE THEM LEFT 6 PLACES CLL RAR /AND RIGHT ONE PLACE; NET = LEFT 5 PLACES MQL /PUT THE RESULT IN MQ JMP I FIXHI /AND RETURN /TO DISPLAY-VECTOR / IF (HC MODE) FIX-PEN / WHEN (LIGHT VECTOR) USE VECTOR SUBROUTINE / ELSE / / UNLESS (HC MODE) MOVE BEAM INSTANTLY / ////////FIN / UPDATE LAST X, LAST Y / SET LIGHT VECTOR ////////FIN DISVEC, 0 IFNZRO PLOTER < TAD HCMODE /GET HC MODE BIT AND STATUS /AND MASK FROM STATUS WORD SNA CLA /IS HC MODE SET? JMP .+3 /NO; SKIP PEN STUFF JMS FIXPEN /YES; FIS PEN AS NECESSARY JMP GOVECT /AND GO TO THE VECTOR DRAWING PART > JMS ACRSOF /HC MODE NOT SET; TURN THE AN CURSOR OFF TAD DKVECT /GET THE DARK VECTOR FLAG SNA CLA /IS IT A DARK (INVISIBLE) VECTOR? JMP GOVECT /NO; GO TH THE VECTOR DRAWING PART TAD NEWX /YES; GET THE NEW X DILX /AND LOAD THE DAC INSTANTLY CLA /DILX DOES NOT CLEAR AC SO DO IT TAD NEWY /GET THE NEW Y DILY /AND LOAD THE Y DAC CLA /CLEAR AC AGAIN SKP /SKIP THE VECTOR DRAWING ROUTINE SINCE THE VECTOR IS DARK GOVECT, JMS VECT /THE VECTOR IS LIGHT (DISPLAYED) SO GO DRAW IT TAD NEWX /UPDATE SOME REGISTERS DCA LASTX TAD NEWY DCA LASTY IFNZRO PLOTER < TAD HCMODE /GET HC MODE BIT AND STATUS /AND MASK IT FROM STATUS WORD SNA CLA /IS HC MODE SET? > JMS ACRSON /NO; TURN AN CURSOR BACK ON DCA DKVECT /BECAUSE A VECTOR WAS JUST DISPLAYED, NEXT VECTOR SHOULD ALSO BE /DISPLAYED UNLESS THIS FLAG IS TURNED OFF ELSEWHERE JMP I DISVEC /LEAVE THE SUBROUTINE IFNZRO PLOTER < /TO FIX-PEN / WHEN (DARK VECTOR) / / IF (DOWN) RAISE PEN / ////////FIN / ELSE / / IF (UP) LOWER PEN / ////////FIN ////////FIN FIXPEN, 0 TAD DKVECT /GET DARK VECTOR FLAG SNA CLA /IS DARK VECTOR FLAG SET: JMP LTVECT /NO; SO VECTOR IS TO BE DISPLAYED DIRE /YES; VECTOR IS NOT TO BE DISPLAYED; GET VC8E REGISTER AND PEN /MASK THE PEN BIT SNA CLA /IS PEN ALREADY UP? JMP FIXEX /YES; NOTHING TO DO SO LEAVE DIRE /NO; GET VC8E REGISTER AGAIN AND PENUP /AND MASK ALL BITS EXCEPT PEN BIT (I.E., CLEAR PEN BIT) DILE /AND RESTORE VC8E REGISTER TO INITIATE PEN CHANGE JMS WAITPN /JUMP TO A SOFTWARE TIMING LOOP TO WAIT FOR PEN CHANGE JMP FIXEX /AND LEAVE THE SUBROUTINE LTVECT, DIRE /VECTOR IS TO BE DISPLAYED; PEN MUST BE DOWN; GET VC8E REGISTER AND PEN /MASK THE PEN BIT SZA CLA /IS PEN ALREADY DOWN? JMP FIXEX /YES; NOTHING TO DO SO LEAVE THE SUBROUTINE DIRE /NO; IT MUST BE LOWERED; GET VC8E REGISTER TAD PEN /ADD THE PEN DOWN BIT DILE /AND RESTORE VC8E REGISTER TO INITIATE PEN CHANGE JMS WAITPN /WAIT IN A SOFTWARE TIMING LOOP UNTIL PEN IS CHANGED FIXEX, JMP I FIXPEN /EXIT FROM PEN FIX SUBROUTINE WAITPN, 0 /A SOFTWARE TIMING LOOP TO WAIT FOR PEN CHANGE TAD PENTIM /GET TIMING CONSTANT SET BY USER ON PAGE ZERO DCA WAIT /STORE LOCALLY ISZ WAIT /INCREMENT COUNTER JMP .-1 /GO BACK AS OFTEN AS NECESSARY UNTIL COUNTER IS SATISFIED JMP I WAITPN /THEN LEAVE LOOP AND LEAVE TIMING SUBROUTINE WAIT, 0 /LOCAL STORAGE OF LOOP COUNTER > PAGE /TO PRINT-CHARACTER / UNLESS (RUBOUT) / / WHEN (ALTAN) / / / TYPE-CHARACTER / / / INCREMENT CHARACTER COUNT / / / IF (CHARACTER COUNT > TTY WIDTH) NEXTLINE- / / ////////FIN / / ELSE / / / WHEN (SCOPE) / / / / POINT TO CHARACTER IN TABLE / / / / DISPLAY-CHARACTER / / / ////////FIN / / / ELSE / / / / POINT TO CHARACTER IN TABLE / / / / PLOT-CHARACTER / / / ////////FIN / / / INCREMENT CHARACTER COUNT / / / IF (CHARACTER COUNT > DISPLAY WIDTH) NEXTLINE- / / ////////FIN / ////////FIN ////////FIN PRCHAR, 0 TAD HOCHAR /GET CHARACTER THAT WAS RECEIVED FROM HOST TAD MRO /SUBTRACT ASCII FOR RO SNA CLA /IS IT RO? JMP PREXIT /YES; IGNORE IT TAD ALTAN /NO; GET ALTERNATE ALPHANUMERIC DEVICE BIT AND STATUS /AND MASK FROM STATUS WORD SNA CLA /IS IT SET? JMP NOTTTY /NO; DEVICE IS NOT ALT AN DEVICE (TTY) TAD HOCHAR /YES; GET THE CHARACTER AGAIN JMS TYPE /AND TYPE IT ON THE ALTERNATE AN DEVICE (CONSOLE TTY) TAD MTTWID /GET NEGATIVE OF TTY LINE WIDTH (SET BY USER ON PAGE ZERO) JMP PRCHEX /AND GO CHECK AGAINST ACTUAL CHARACTER COUNT NOTTTY, TAD HOCHAR /GET CHARACTER AGAIN TAD M40 /SUBTRACT 40 FROM ASCII VALUE OF CHARACTER TO GET PLACE VALUE IN TABLE /(FIRST 0-37 CHARACTERS ARE NON-PRINTING, SO THEY DO NOT EXIST IN TABLE) AND MASK7 /MASK ALL BUT THE TABLE PLACE BITS DCA TABPOS /STORE TABLE PLACE VALUE IFNZRO PLOTER < TAD ALTDIS /GET ALTERNATE DISPLAY (PLOTTER) BIT AND STATUS /AND MASK IT FROM STATUS WORD SZA CLA /IS ALTERNATE DISPLAY (PLOTTER) BIT SET? JMP PLTER /YES; GO TO THE PLOTTER PART > TAD ALTCHR /NO; GET ALTERNATE CHARACTER SET BIT AND STATUS /AND MASK FROM STATUS WORD SZA CLA /IS ALTERNATE CHARACTER SET REQUIRED? TAD PNTOF /YES; ADD ADDITIONAL OFFSET FOR DOT CHARACTER TABLE TAD TABPOS /TO THE PREVIOUSLY STOREC TABLE PLACE VALUE CLL RAL /JUGGLE SOME MORE TO FIX IT RIGHT TAD TABPOS /AND JUGGLE SOME MORE TAD DOTTBP /AND ADD THE POINTER TO THE BEGINNING OF THE TABLE DCA PNTTAB /STORE THE POINTER TO THE CHARACTER IN THE DOT TABLE JMS DICHAR /GO DISPLAY THE CHARACTER IFNZRO PLOTER < JMP PRCHEX-1 /AND PREPARE TO LEAVE THE PRINT SUBROUTINE PLTER, TAD ALTCHR /CHARACTER IS TO BE PRINTED ON PLOTTER; GET ALTERNATE CHARACTER SET BIT AND STATUS /AND MASK IT FROM STATUS WORD SZA CLA /IS ALTERNATE CHARACTER SET REQUIRED? TAD VECOF /YES; GET OFFSET FACTOR FOR ALT CHAR SET IN VECTOR TABLE TAD TABPOS /ADD TO PREVIOUSLY STOREC TABLE POSITION VALUE TAD VECTBP /AND ADD POINTER TO BEGINNING OF VECOTR TABLE DCA PNTTAB /AND STORE POINTER TO CHARACTER IN VECTOR TABLE TAD I PNTTAB /VECTOR TABLE IS DOUBLY INDEXED SO USE POINTER AS A POINTER TO DCA PNTTAB /A POINTER AND SET UP CHARACTER POINTER CORRECTLY JMS PLCHAR /NOW GO PLOT THE CHARACTER > TAD MDIWID /GET THE NEGATIVE OF THE MAXIMUM CHARACTER COUNT ON THE DISPLAY DEVICE PRCHEX, ISZ CHARCT /INCREMENT THE CHARACTER COUNTER TAD CHARCT /COMPARE THE CURRENT CHARACTER COUNT WITH THE MAXIMUM VALUE SMA CLA /IS MAXIMUM EXCEEDED? JMS NXTLIN /YES; GO TO THE NEXT LINE PREXIT, JMP I PRCHAR /NO; EXIT THE SUBROUTINE MRO, -377 /NEGATIVE OF ASCII FOR RO PNTOF, 220 /A CONSTANT USED IN CALCULATING OFFSET IN THE DOT TABLE DOTTBP, DOTTAB /POINTER TO THE BEGINNING OF THE DOT TABLE IFNZRO PLOTER < VECOF, 140 /A CONSTANT USED IN CALCULATING OFFSET IN THE VECTOR TABLE VECTBP, VECTAB /POINER TO BEGINNING OF VECTOR TABLE > M40, -40 /CONSTANT TO SUBTRACT TO ACCOUNT FOR NON-PRINTING (CONTROL) CHARACTERS MASK7, 177 /MASK FOR 7 LS BITS TABPOS, 0 /VALUE OF CHARACTER POISTION IN TABLE /TO DISPLAY-CHARACTER / IF (SUBSCRIPT) SHIFT DOWN / REPEAT UNTIL (ALL BITS USED) / / GET BIT / / IF (BIT SET) DISPLAY-POINT / / IF (12 BITS) / / / IF (3 WORDS) / / / / MOVE TO NEW CHARACTER START POSITION / / / / EXIT THE ROUTINE / / / ////////FIN / / / NEW WORD / / / RESET 12 BITS PER WORD COUNTER / / ////////FIN / / WHEN (<7 BITS) INCREMENT Y / / ELSE / / / RESET 7 BITS PER COLUMN COUNTER / / / INCREMENT X / / ////////FIN / ////////FIN ////////FIN DICHAR, 0 JMP SETDOT /OUT OF SPACE ON THIS PAGE SO GO TO A SMALL PART ELSEWHERE TAD I PNTTAB /GET FIRST WORD OF CHARACTER DOT MATRIX INFORMATION SPA CLA /IS FIRST BIT SET: TAD M6 /YES; CHARACTER IS SUBSCRIPTED; ADD -6 TO Y COORDINATE TAD LASTY /ADD Y COORDINATE OF BEGINNING OF CHARACTER DCA BASEY /AND STORE AS A BASE LINE VALUE FOR THE CCARACTER TAD BASEY /GET THE BASELINE VALUE BACK DCA RUNY /AND STORE IT AS A RUNNING VALUE FOR Y COORD@NATE TAD LASTX /GET THE INITIAL VALUE FOR THE X COORDINATE OF THE CHARACTER DCA RUNX /AND STORE IT AS A RUNNING VALUE FOR X COORDINATE TAD M7 /GET A MINUS 7 DCA COUNT7 /AND STORE IT AS A COUNTER FOR 7 DOT POSITIONS PER COLUMN TAD M3 /GET A MINUS 3 DCA COUNT3 /AND STORE IT AS A COUNTER FOR 3 12-BIT WORDS PER 35 BIT CHARACTER TAD M14 /GET A MINUS 12 (DECIMAL) DCA COUN14 /AND STORE IT AS A COUNTER FOR 12 BITS PER WORD TAD I PNTTAB /GET THE WORD POINTED TO IN THE TABLE CLL RAL /MOVE THE SUBSCRIPT BIT OUT AND MOVE THE FIRST BIT TO SIGN DCA SHREG /STORE THE SHIFTED WORD ISZ COUN14 /INCREMENT THE BITS PER WORD COUNTER DOTLOP, TAD SHREG /GET THE SHIFTED DOT INFORMATION CLL RAL /SHIFT THE NEXT DOT BIT TO THE LINK DCA SHREG /AND STORE THE SHIFTED WORD AGAIN SZL /IS BIT SET? JMS DISPPT /YES; GO DISPLAY A POINT ISZ COUN14 /INCREMENT THE BITS PER WORD COUNTER JMP NOT14 /IF THE WORD IS NOT FININSHED, SKIP THE TERMINATE STUFF ISZ COUNT3 /ALL 12 BITS HAVE BEEN TAKEN OUT OF A WORD SO INCREMENT /THE WORDS PER CHARACTER COUNTER JMP NOT3 /IF THREE WORDS HAVE NOT BEEN USED UP, SKIP THE TERMINATE CHARACTER STUFF TAD D14 /ALL 3 WORDS HAVE BEEN USED AND CHARACTER IS COMPLETE SO /GET A (DECIMAL) 14 TO TAD LASTX /ADD TO THE BEGINNING X COORDINATE DCA LASTX /AND STORE THE VALUE AS THE BEGINNING COORDINATE OF THE NEXT CHARACTER JMS ACRSON /TURN THE ALPHANUMERIC CURSOR ON JMP I DICHAR /AND LEAVE THE SUBROUTINE NOT3, ISZ PNTTAB /POINT TO THE NEXT WORD IN THE DOT TABLE TAD I PNTTAB /AND GET IT DCA SHREG /AND STORE IT IN THE SHIFT REGISTER TAD M14 /GET THE VALUE TO DCA COUN14 /RESET THE BITS PER WORD COUNTER NOT14, ISZ COUNT7 /INCREMENT THE BITS PER COLUMN COUNTER JMP NOT7 /NOT YET 7 BITS THIS COLUMN SO SKIP THE COLUMN TERMINATE STUFF TAD M7 /7 BITS HAVE BEEN USED IN THIS COLUMN SO GET A MINUS 7 DCA COUNT7 /TO RESET THE COUNTER CLA CLL IAC RAL /SET AC=2 TAD RUNX /ADD TO RUNNING X COORDINTE DCA RUNX /TO FORM NEW RUNNING X COORDINATE TAD BASEY /GET BASE VALUE FOR Y COORDINATE JMP .+3 /SKIP THIS STUFF FROM ANOTHER BRANCH NOT7, CLA CLL IAC RAL /NOT AT END OF COLUMN SO ADD 2 TAD RUNY /TO THE RUNNING Y COORDINATE DCA RUNY /AND SET NEW RUNNING Y JMP DOTLOP /AND GO THROUGH THE CHECK IF BIT SET AND INTENSIFY LOOP AGAIN BASEY, 0 /THE Y COORDINATE OF THE LOWER LEFT CORNER OF THE CHARACTER RUNX, 0 /THE X COORDINATE OF THE DOT IN THE 5 X 7 MATRIX THAT IS BEING CONSIDERED NOW RUNY, 0 /THE Y COORDINATE OF THE DOT IN THE 5 X 7 MATRIX THAT IS BEING CONSIDERED NOW D14, 16 /DECIMAL 14: THE WIDTH OF THE CHARACTER CELL M3, -3 /TO RESET THE 3 WORDS PER CHARACTER COUNTER M6, -6 /TO DEPRESS THE CHARACTER CELL 6 UNITS IF THE CHARACTER IS PRINTED BELOW THE LINE M7, -7 /TO RESET THE 7 DOTS PER COLUMN COUNTER M14, -14 /MINUS (DECIMAL) 12 TO RESET THE 12 BITS PER WORD COUNTER COUNT3, 0 /THE WORDS PER CHARACTER COUNTER COUNT7, 0 /THE BITS PER COLUMN COUNTER COUN14, 0 /THE BITS PER WORD WOUNTER SHREG, 0 /TEMPORARY HOLDING FOR THE TABLE WORD AS THE BITS ARE BEING UNPACKED PAGE SETDOT, DCA LX /BECAUSE THIS IS A NEW CHARACTER, CLEAR THE VALUE REMEMBERED FOR DCA LY /THE LAST VALUES OF THE X AND Y DAC'S JMS ACRSOF /TURN THE ALPHANUMERIC CURSOR OFF JMP DICHAR+2 /AND RETURN TO THE PART ON THE PREVIOUS PAGE /TO DISPLAY-A-POINT / IF (NEW VALUE FOR Y) SET Y DAC / IF (NEW VALUE FOR X) SET X DAC / INTENSIFY ////////FIN DISPPT, 0 TAD RUNY /GET PRESENT Y COORDINATE FOR POINT CIA /AND SUBTRACT IT FROM TAD LY /THE LAST VALUE SET IN THE Y DAC SNA CLA /IS IT THE SAVME? JMP .+4 /YES; SKIP AHEAD TAD RUNY /NO; GET THE PRESENT Y VALUE DILY /LOAD IT IN THE Y DAC DCA LY /AND REMEMBER IT TAD RUNX /GET PRESENT X COORDINATE FOR POINT CIA /AND SUBTRACT IT FROM TAD LX /THE LAST VALUE SET IN THE X DAC SNA CLA /IS IT THE SAME? JMP .+4 /YES; SKIP AHEAD TAD RUNX /NO; GET THE PRESENT X VALUE DILX /LOAD IT IN THE X DAC DCA LX /AND REMEMBER IT DISD /ARE THE DAC'S SETTLED? JMP .-1 /NO; TRY AGAIN DIXY /YES; INTENSIFY THE POINT JMP I DISPPT /AND LEAVE THE SUBROUTINE LX, 0 /THE LAST VALUE SET IN THE X DAC LY, 0 /THE LAST VALUE SET IN THE Y DAC IFNZRO PLOTER < /TO PLOT-CHARACTER / GET COORDINATE WORD / REPEAT UNTIL (FIRST WORD OF NEXT CHARACTER) / / SET UP X COORDINATE OF VECTOR / / SET UP Y COORDINATE OF VECTOR / / IF (DARK VECTOR) SET DARK VECTOR FLAG / / DISPLAY-VECTOR / / GET NEXT COORDINATE WORD / ////////FIN ////////FIN PLCHAR, 0 TAD I PNTTAB /GET WORD CONTAINING VECTOR COORDINATES FROM TABLE NXTVEC, BSW /INTERCHANGE BYTES SPA /IS BIT 6 OF ORIGINAL WORD SET? ISZ DKVECT /YES; VECTOR IS DARK SO SET FLAG CLL RAR /MOVE SIGN BIT TO LINK AND SET COORDINATE VALUES UP PROPERLY AND LS4BTS /MASK THE COORDINATE INFORMATION SZL /IS THE NEGATIVE BIT SET? CIA /YES; NEGATE THE RELATIVE COORDINATE AND THEN TAD LASTX /ADD THE LAST VALUE TO THE NEW (RELATIVE) COORDINATE DCA NEWX /STORE THE VALUE AS THE NEW X COORDINATE TAD I PNTTAB /GET THE COORDINATE WORD AGAIN CLL RAR /MOVE THE SIGN BIT TO THE LINK AND SET UP THE COORDINATE INFO PROPERLY AND LS4BTS /MASK THE COORDINATE INFORMATION SZL /IS THE NEGATIVE BIT SET? CIA /YES; NEGATE THE RELATIVE COORDINATE AND THEN TAD LASTY /ADD THE LAST VALUE TO THE NEW (RELATIVE) COORDINATE DCA NEWY /AND STORE THE VALUE AS THE NEW Y COORDINATE JMS DISVEC /NOW GO DISPLAY THE VECTOR ISZ PNTTAB /POINT TO THE NEXT WORD (COORDINATE PAIR) TAD I PNTTAB /GET IT SMA /IS IT THE FIRST WORD OF THE NEXT CHARACTER? JMP NXTVEC /NO; IT IS THE NEXT VECTOR OF THIS CHARACTER SO TREAT IT AS SUCH CLA /YES; CLEAR THE AC JMP I PLCHAR /AND LEAVE THE SUBROUTINE LS4BTS, 17 /MASK FOR THE LEAST SIGNIFICANT 4 BITS (THE COORDINATE INFO) /TO NEXTLINE- / LINEFEED- / MARGIN- ////////FIN NXTLIN, 0 JMS LINFED /LINEFEED JMS GOMARG /GO TO MARGIN JMP I NXTLIN /LEAVE THE SUBROUTINE /TO LINEFEED- / WHEN (TTY) MOVE DOWN ONE LINE / ELSE / / COUNT LINE / / WHEN (LINE # < 35) MOVE DOWN ONE LINE / / ELSE / / / CHANGE MARGIN / / / MOVE TO LINE 1 / / / WHEN (MARGIN 1) / / / / WHEN (CHARACTER COUNT > 37) / / / / / SET CHARACTER COUNT = 37 / / / / / X COORDINATE = 0 / / / / ////////FIN / / / / ELSE / / / / / SET CHARACTER COUNT = CHARACTER COUNT + 37 / / / / / SET X COORDINATE = LAST X COORDINATE + 1000 / / / / ////////FIN / / / ////////FIN / / / ELSE / / / / SET CHARACTER COUNT = CHARACTER COUNT - 37 / / / / SET X COORDINATE = LAST X COORDINATE - 1000 / / / ////////FIN / / ////////FIN / ////////FIN ////////FIN LINFED, 0 TAD ALTAN /GET ALT ALPHANUMERIC DEVICE (TTY) BIT AND STATUS /FROM THE STATUS WORD SNA CLA /IS IT SET? JMP NTTY /NO; DEVICE IS NOT TTY TAD LF /DEVICE IS TTY SO GET LF CHARACTER JMS TYPE /AND TYPE IT JMP LINFEX /AND GO TO EXIT POINT NTTY, ISZ LINECT /DEVICE IS NOT TTY SO INCREMENT THE LINECOUNT TAD LINECT /GET THE LINECOUNT TAD MD35 /AND SUBTRACT (DECIMAL) 35 SMA CLA /DOES THIS MAKE THE NEW LINE NUMBER > 35? JMP MARG1 /YES; GO CHECK SOME MORE STUFF TAD LASTX /NO; GET THE LAST X COORDINATE DCA NEWX /AND STORE IT AS THE NEW VALUE TAD LASTY /GET THE LAST Y COORDINATE TAD MD22 /AND SUBTRACT (DECIMAL) 22 JMP GOLIN /AND GO DO THE LINEFEED MARG1, TAD MARGIN /GET THE ALTERNATE MARGIN BIT AND STATUS /FROM THE STATUS WORD SNA CLA /IS IT SET? TAD MARGIN /NO; GET MARGIN BIT MQL /AND STORE IT (OR ZERO) IN THE MQ REGISTER TAD MARGIN /GET THE MARGIN BIT AGAIN CMA /COMPLEMENT IT; I.E., COMPLEMENT THE MASK AND STATUS /AND MASK ALL BUT THE MARGIN BIT FROM THE STATUS WORD MQA /BRING IN WHAT WAS STORED IN MQ; THIS SEQUENCE ALWAYS REVERSES /THE MARGIN BIT IN THE STATUS WORD DCA STATUS /AND RESTORE THE STATUS WORD DCA LINECT /RESET THE LINECOUNTER SINCE A NEW MARGIN HAS BEEN SET TAD MARGIN /GET THE MARGIN BIT AGAIN AND STATUS /FROM THE STATUS WORD SNA CLA /IS IT SET? JMP MR0 /NO; SO THE MARGIN IS THE NORMAL ONE; GO TO THE RIGHT SEQUENCE TAD CHARCT /YES; MARGIN IS ALTERNATE ONE; GET CHARACTER COUNT TAD MD37 /AND SUBTRACT 37 SPA CLA /IS COUNT > 37? JMP .+4 /NO; JUMP AHEAD TAD D37 /YES; CHARACTER WILL BE OFF RIGHT OF SCREEN SO DCA CHARCT /SET CHARACTER COUNT = 37 (= ALTERNATE MARGIN VALUE) JMP GOLIN-2 /AND GO WRAP THE SUBROUTINE UP TAD D37 /CHARACTER COUNT IS < 37 SO X VALUE IS OK; ADD 37 TAD CHARCT /TO THE CHARACTER COUNT DCA CHARCT /AND STORE THE NEW VALUE TAD P1000 /ADD 1000 (OCTAL) JMP GOLIN-3 /TO THE LAST X VALUE AND WRAP UP THE ROUTINE MR0, TAD MD37 /NORMAL MARGIN IS SPECIFIED SO SUBTRACT 37 TAD CHARCT /FROM THE CHARACTER COUNT DCA CHARCT /AND STORE THE NEW VALUE TAD M1000 /SUBTRACT 1000 (OCTAL) FROM THE TAD LASTX /LAST X VALUE DCA NEWX /AND STORE IT TAD HOMEY /GET THE HOME VALUE FOR THE Y COORDINATE (TOP OF SCREEN) GOLIN, DCA NEWY /AND STORE IT AS THE NEX Y COORDINATE ISZ DKVECT /SET THE DARK VECTOR FLAG JMS DISVEC /AND GO DISPLAY THE DARK VECTOR I.E., MOVE TO THE NEW MARGIN LINFEX, JMP I LINFED /LEAVE THE SUBROUTINE MD35, -43 /MINUS (DECIMAL) 35 MD22, -26 /MINUS (DECIMAL) 22 MD37, -45 /MINUS (DECIMAL) 37 P1000, 1000 /OFFSET VALUE FOR HALF OF SCREEN IN X DIRECTION LF, 212 /ASCII FOR LF PAGE /TO SPACE- / GET ASCII FOR SPACE / PRINT IT ////////FIN SPACE, 0 TAD SPAC /GET ASCII FOR SPACE DCA HOCHAR /PRETEND IT CAME FROM HOST JMS PRCHAR /AND USE PRINT ROUTINE JMP I SPACE /LEAVE SUBROUTINE SPAC, 40 /ASCII FOR SPACE /TO BACKSPACE- / DECREMENT CHARACTER COUNT / IF (TTY) PRINT BACKSPACE CHARACTER / ELSE MOVE BEAM BACK ONE CHARACTER CELL ////////FIN BACKSP, 0 CMA /SET AC = -1 TAD CHARCT /AND ADD THE CHARACTER COUNT DCA CHARCT /AND STORE THE DECREMENTED VALUE TAD ALTAN /GET THE ALTERNATE ALPHANUMERIC DEVICE (TTY) BIT AND STATUS /FROM THE STATUS WORD SZA CLA /IS ALT DEVICE BIT SET? JMP PRBACK /YES; GO TO THE PROPER PLACE TAD MD14 /NO; ADD MINUS (DECIMAL) 14 TO TAD LASTX /THE PRESENN CHARACTER ORIGIN POSITION DCA LASTX /AND STORE AS THE NEW CHARACTER X ORIGIN JMP BACKEX /AND GO TO THE EXIT POINT PRBACK, TAD BAKSP /GET ASCII FOR BACKSPACE JMS TYPE /AND TYPE IT BACKEX, JMP I BACKSP /AND LEAVE THE SUBROUTINE BAKSP, 210 /ASCII FOR BACKSPACE MD14, -16 /MINUS (DECIMML) 14 (THE WIDTH OF A CHARACTER CELL) /TO GO-TO-MARGIN / WHEN (TTY) / / CARRAIGE RETURN / / SET CHARACTER COUNT = 0 / ////////FIN / ELSE / / WHEN (MARGIN 0) / / / MOVE TO MARGIN 0 / / / SET CHARACTER COUTN = 0 / / ////////FIN / / ELSE / / / MOVE TO MARGIN 1 / / / SET CHARACTER COUNT = 37 / / ////////FIN / ////////FIN ////////FIN GOMARG, 0 TAD ALTAN /GET THE ALTERNATE ALPHANUMERIC DEVICE (TTY) BIT AND STATUS /FROM THE STATUS WORD SNA CLA /IS TTY BIT SET? JMP .+5 /NO; JUMP AHEAD TAD CR /YES; GET ASCII FOR CR JMS TYPE /AND TYPE IT DCA CHARCT /SET CHARACTER COUNT = 0 JMP MARGEX /AND GO TO EXIT POINT TAD MARGIN /GET MARGIN BIT AND STATUS /FROM STATUS WORD SZA CLA /WHICH MARGIN? JMP MAR1 /MARGIN 1 (ALTERNATE MARGIN) DCA CHARCT /MARGIN 0; RESET CHARACTER COUNTER = 0 TAD MAR0X /GET X COORDINATE OF MARGIN 0 JMP GOMAEX /AND GO TO THAT VALUE MAR1, TAD D37 /MARGIN 1; GET (DECIMAL) 37 DCA CHARCT /AND SET CHARACTER COUNTER GOMAEX, DCA NEWX /SET NEW X COORDINATE =0 FOR MARGIN 1 OR = -1000 FOR MARGIN 0 ISZ DKVECT /SET DARK VECTOR FLAG JMS DISVEC /AND GO DISPLAY VECTOR (MOVE TO MARGIN ) MARGEX, JMP I GOMARG /AND EXIT THE SUBROUTINE D37, 45 /DECIMAL 37 = CHARACTER COUNT OF HALF SCREEN (MARGIN 1) MAR0X, -1000 /X COORDINATE OF LEFT MMRGIN (MARGIN 0) /TO TURN-ALPHANUMERIC-CURSOR-ON / IF (AN MODE) / / SET CURSOR BIT IN VC8E REGISTER / / ADD ONE HALF CELL WIDTH TO X COORDINATE AND SET DAC / / ADD ONE HALF CELL HEIGHT TO Y COORDINATE AND SET DAC / ////////FIN ////////FIN ACRSON, 0 TAD MODMSK /GET MASK FOR MODE BITS IFNZRO PLOTER < TAD HCMODE /AND MASK FOR HC MODE BIT IF THERE IS A PLOTTER > AND STATUS /MASK THE MODE BITS FROM THE STATUS WORD SZA CLA /IS ANY OF THE BITS SET JMP I ACRSON /YES; MODE IS NOT AN SO LEAVE THE SUBROUTINE TAD CRSBT /NO; GET THE CURSOR BIT MQL /PUT IT IN THE MQ REGISTER DIRE /READ THE VC8E REGISTER MQA /AND SET THE CURSOR BIT DILE /AND SET THE VC8E REGISTER TAD P5 /GET PLUS 5 TAD LASTX /AND ADD THE LAST X COORDINATE DILX /SET THE CENTER OF CHARACTER CELL VALUE IN THE X DAC CLA /DILX DOESN'T CLEAR AC SO DO IT TAD P6 /GET PLUS SIX TAD LASTY /AND ADD THE LAST Y COORDINATE DILY /SET THE CENTER OF CHARACTER CELL VALUE IN THE Y DAC CLA /DILY DOESN'T CLEAR THE AC SO DO IT JMP I ACRSON /LEAVE THE SUBROUTINE P5, 5 /HALF THE CHARACTER CELL WIDTH TO PUT THE CURSOR OVER THE CENTER OF CELL P6, 6 /HALF THE CHARACTER CELL HEIGHT TO PUT THE CURSOR OFER THE CENTER OF CELL /TO TURN-ALPHANUMERIC-CURSOR-OFF / CLEAR CURSOR BIT IN VC8E REGISTER / WAIT FOR REGISTER SETTLE ////////FIN ACRSOF, 0 DIRE /GET VC8E REGISTER AND MCRSBT /MASK ALL BUT CURSOR BIT DILE /RELOAD THE REGISTER WITH CURSOR BIT CLEAR JMS WAITCR /GO TO A WAIT LOOP JMP I ACRSOF /AND EXIT THE SUBROUTINE /TO WAIT-FOR-CURSOR-TO-TURN-ON-OR-OFF WAITCR, 0 TAD CURWAT /GET TIMING CONSTANT DCA WAIT2 /SET COUNTER ISZ WAIT2 /INCREMENT COUNTER JMP .-1 /INCREMENT AGAIN UNTIL ZERO THEN JMP I WAITCR /EXIT THE WAIT SUBROUTINE CURWAT, -3000 /TIMING CONSTANT FOR CURSOR WAIT WAIT2, 0 /COUNTER FOR TIMING LOOP IFNZRO PLOTER < /TO WAIT-FOR-PEN-TO-SLEW-OFF-PAGE WAITSL, 0 CLA /CLEAR AC BECAUSE IT IS NOT ALWAYS DONE ELSEWHERE TAD MIN40 /GET TIMEING CONSTANT DCA WAIT1 /AND SET OUTER LOOP COUNTER ISZ WAIT2 /INCREMENT INNER LOOP COUNTER JMP .-1 I/GO BACK TO DO IT AGAIN UNLESS COUNT = 0 THEN ISZ WAIT1 /LEAVE INNER LOOP AND INCREMENT OUTER LOOP COUNTER JMP .-3 /GO BACK TO THE INNER LOOP UNLESS OUTER LOOP COUNT = 0 THEN JMP I WAITSL /LEAVE THE SUBROUTINE MIN40, -40 /LOOP COUNTER FOR WAIT WAIT1, 0 /COUNTER FOR OUTER LOOP > PAGE /TO DISPLAY-A-VECTOR / GET X1, X2, Y1, Y2 / CALCULATE DX = ABS (X2-X1) / CALCULATE DY = ABS (Y2-Y1) / CALCULATE SLOPE = DY/DX AND SIGN OF SLOPE / IF (SLOPE > 1) REVERSE DY AND DX / IF (DX=0) EXIT / SET STEP DIRECTION / IF (PLOTTER) SET X2 OVERSHOOT TO ALLOW FOR PEN DRAG, BUT DO NOT WRAP AROUND END OF PAGE / REPEAT UNTIL (RUNNING X = X2) / / STEP X / / LOAD X DAC / / MULTIPLY-SLOPE-TIMES-RUNNING-X / / ADD INTERCEPT TO GET RUNNING Y / / LOAD Y DAC / / WHEN (PLOTTER) ENTER WAIT LOOP / / ELSE INTENSIFY / ////////FIN ////////FIN VECT, 0 /ENTRY TAD LASTX /=X1 DCA VECX1 /STORE LOCALLY TAD LASTY /=Y1 DCA VECY1 /STORE LOCALLY TAD NEWX /=X2 DCA VECX2 /STORE LOCALLU TAD NEWY /=Y2 DCA VECY2 /STORE LOCALLY DCA SIGNSL /CLEAR SIGN TAD VECX1 /GET X1 CIA /AND SUBTRACT FROM TAD VECX2 /X2 SMA /IF POSITIVE JMP .+3 /JUMP AHEAD CIA /ELSE NEGATE TO MAKE IT POSITIVE ISZ SIGNSL /AND COMPLEMENT THE SIGN FLAG TO REMEMBER ONE OF THE /QUANTITIES USED TO COMPUTE THE SLOPE IS NEGATIVE DCA DX /AND STORE ABS (X2-X1) TAD VECY1 /GET Y1 CIA /AND SUBTRACT IT FROM TAD VECY2 /Y2 SMA /IF POSITIVE JMP .+3 /JUMP AHEAD CIA /ELSE NEGATE IT TO MAKE IT POSITIVE ISZ SIGNSL /COMPLEMENT THE SIGN FLAG BECAUSE ONE OF THE /QUANTITIES USED TO CALCULATE THE SLOPE IS NEGATIVE DCA DY /AND STORE ABS (Y2-Y1) TAD SIGNSL /GET SIGN OF SLOPE AND RAR /MOVE PARITY BIT TO LINK CLA /THROW AWAY THE REST TAD LNOP /=7000 SZL /IS SIGN OF SLOPE NEGATIVE? TAD L41 /YES; CHANGE NOP TO CIA DCA SIGNSL /NOP (7000) IF SLOPE POS; CIA (7041) IF NEG TAD DX /GET DX CIA /AND SUBTRACT FROM TAD DY /DY SMA SZA CLA /IF DY > DX, SLOPE.GT.1 SO JMP REVERS /REVERSE X AND Y IN CALCULATION AND FOR LOADING DACS SLOPOK, TAD LDILX /OTHERWISE, SET DISPLAY COMMANDS NORMAL; GET THE DILX COMMAND DCA LDX /AND PUT IT IN THE NORMAL PLACE TO LOAD X DAC TAD LDILY /GET THE DILY COMMAND DCA LDY /AND PUT IT IN THE NORMAL PLACE TO LOAD Y DAC SETSTP, TAD VECX1 /GET X1 CIA /AND COMPARE TO TAD VECX2 /X2 SNA /IF X1=X2, VECTOR LENGTH IS ZERO SO JMP I VECT /EXIT THE SUBROUTINE CLL RAL /OTHERWISE, ROTATE THE SIGN OF X2-X1 INTO LINK CLA CML RAL /AC=1 FOR POSITIVE DIRECTION; =0 FOR NEG SNA /IF NEGATIVE DIRECTION, CLL STA /SET AC =-1 DCA STEP /STORE SIGNED STEPSIZE IFNZRO PLOTER < TAD HCMODE /GET PLOT (HC MODE) BIT AND STATUS /FROM STATUS WORD SNA CLA /IS IT SET? JMP .+6 /NO; JUMP AHEAD TAD STEP /YES; INCREMENT X2 BY TAD STEP /THREE STEPSIZES; THIS OVERSHOOT COMPENSATES FOR TAD STEP /THE PEN DRAG AND DEAD BAND IN THE HP 7015 PLOTTER TAD VECX2 /USERS OF OTHER PLOTTERS MAY ADJUST THIS PART FOR BEST RESULTS DCA VECX2 /STORE THE X2 PLUS OVERSHOOT TAD VECX2 /GET X2 (WITH OVERSHOOT IF HC MODE) CLL RTL /MOVE 10-BIT VALUE TO MS 10 BITS SO SIGN IS IN MS BIT SMA /IS X DAC VALUE NEGATIVE? JMP POSAC /NO; GO TO THE POSITIVE BRANCH SZL CLA /YES; WAS X COORDINATE (12-BIT VALUE) NEGATIVE? JMP X2OK /YES; X COORDINATE AND DAC LOAD AGREE WITH NO ROLLOVER TAD (777 /NO; ROLLOVER HAS OCCURRED, GET MAXIMUM X SCREEN VALUE JMP .+4 /AND TAKE IT AHEAD POSAC, SNL CLA /X DAC VALUE WAS POSITIVE; WAS 12-BIT COORDINATE POSITIVE? JMP X2OK /YES; EVERYTHING OK TAD (-1000 /NO; ROLLOVER HAS OCCURRED; GET MINIMUM X SCREEN VALUE DCA VECX2 /DEPOSIT PROPER (NON-ROLLOVER) VALUE IN X2 > X2OK, TAD VECX1 /GET X1 JMP VECTGO /AND JUMP INTO THE LOOP AT THE PROPER PLACE VECLOP, TAD VECX /GET THE OLD RUNNING VALUE OF X CIA /AND COMPARE IT TO TAD VECX2 /THE FINAL VALUE OF X (PERHAPS WITH OVERSHOOT) SNA CLA /DO THEY AGREE? JMP I VECT /YES; VECTOR IS FINISHED; LEAVE THE SUBROUTINE TAD VECX /NO; GET THE RUNNING VALUE BACK TAD STEP /INCREMENT IT BY A STEP OF THE PROPER SIGN VECTGO, DCA VECX /AND STORE THE NEW RUNNING VALUE OF X TAD VECX /GET THE NEW VALUE AGAIN LDX, 0 /DILX (OR, IF REVERSED, DILY) WILL HAVE BEEN PUT HERE CIA /COMPARE THE VALUE JUST LOADED TO TAD VECX1 /X1 SZA /ARE THEY THE SAME? JMS VECMUL /NO; GO MULTIPLY (X1-RUN X) BY THE SLOPE AND RETURN WITH VALUE IN AC CIA /CHANGE SIGN BECAUSE DX = (RUN X - X1),NOT (X1-RUN X) TAD VECY1 /ADD Y1 AND RESULT IS RUNNING VALUE OF Y LDY, 0 /DILY (OR, IF REVERSED, DILX) WILL HAVE BEEN PUT HERE CLA CLL /CLEAR ALL UNNECESSARY JUNK BECAUSE DILX AND DILY DON'T DO IT IFNZRO PLOTER < TAD STATUS /GET THE STATUS WORD AND HCMODE /AND MASK THE HC (PLOT) MODE BIT SZA CLA /IS HC MODE SET? JMP .+6 /YES; GO TO THE PLOT PART > TAD DKVECT /NO; GET DARK VECTOR FLAG SZA CLA /IS FLAG SET? JMP VECLOP /YES; NOTHING TO DISPLAY SO LOOP TO NEXT POINT IN VECTOR DIXY /NO; POINT MUST BE DISPLAYED; INTENSIFY THE POINT JMP VECLOP /NOW LOOP FOR THE NEXT POINT IFNZRO PLOTER < JMS WAITVC /THE PLOTTER SERVOS ARE DRIVEN DIRECTLY FROM THE DACS AND /THE SERVOS NEED TIME TO MOVE, SO GO TO A WAIT LOOP JMP VECLOP /AND NOW GO CALCULATE AND PLOT THE NEXT POINT IN THE VECTOR > VECX1, 0 /LOCAL STORAGE OF X COORDINATE OF BEGINNING POINT OF VECTOR VECY1, 0 /LOCAL STORAGE OF Y COORDINATE OF BEGINNING POINT OF VECTOR VECX2, 0 /LOCAL STORAGE OF X COORDINATE OF ENDING POINT OF VECTOR VECY2, 0 /LOCAL STORAGE OF Y COORDINATE OF ENDING POINT OF VECTOR VECX, 0 /RUNNING VALUE OF X STEP, 0 /THE SIGNED VALUE OF THE STEP IN X TO BE USED TO CALCULATE THE NEW RUNNING X LDILX, DILX /A COMMAND TO BE READ AND INSERTED AT PROPER PLACE LDILY, DILY /DITTO LNOP, NOP /DITTO L41, 41 /THE VALUE TO CHANGE A NOT (7000) TO A CIA (7041) /TO WAIT FOR PLOTTER SERVOS TO RESPOND TO VALUES LOADED INTO DAC'S IFNZRO PLOTER < WAITVC, 0 TAD VECTIM /GET TIME CONSTANT SET BY USER ON PAGE ZERO DCA VCTIMC /AND STORE AS LOCAL COUNTER ISZ VCTIMC /INCREMENT THE COUNTER JMP .-1 /REPEAT IF COUNTER NOT RUN OUT JMP I WAITVC /WHEN COUNTER RUNS OUT, LEAVE THE WAIT SUBROUTINE VCTIMC, 0 /LOCAL STORAGE OF THE COUNTER > PAGE /TO MULTYPLY-AC-BY-SLOPE-AND-RETURN-RESULT-IN-AC / IF (AC NEGATIVE) / / CHANGE TO POSITIVE / / REMEMBER SIGN CHANGE / ////////FIN / WHEN (DY=0) EXIT WITH AC CLEAR / ELSE / / MULTIPLY-BY-DY / / DIVIDE-BY-DX / / NEGATE RESULL IF AC WAS NEGATIVE UPON ENTRY / ////////FIN ////////FIN VECMUL, 0 SMA /IS AC NEGATIVE? JMP .+3 /NO; SKIP NEXT PART CIA /YES; MAKE IT POSITIVE ISZ VECMUL /AND CHANGE THE RETURN POINT SO A CIA IS SKIPPED MQL /PUT THE VALUE IN THE MQ TO SET UP FOR THE TWO REGISTER MULTIPLY-DIVIDE TAD DY /GET DY IN THE AC SNA CLA /IS IT ZERO? JMP I VECMUL /IF SO, RETURN 0 MUY /IF NOT, GO MULTIPLY AC (NOW IN MQ) BY DY DY, 0 /ARGUMENT FOR MULTIPLICATION (DY) IS STORED HERE DVI /NOW DIVIDE BY DX DX, 0 /WHICH IS STORED HERE CLA MQA /BRING THE RESULT OF THE MULTIPLY AND DIVIDE /(WHICH IS SINGLE PRECISION) BACK INTO THE AC SIGNSL, 0 /NOP OR CIA JMP I VECMUL /AND RETURN WITH THE RESULT REVERS, TAD VECY2 /REPLACE X2 WITH Y2 DCA VECX2 TAD LASTY /REVERSE THE INITIAL VALUES OF X AND Y DCA VECX1 TAD LASTX DCA VECY1 TAD DX /INTERCHANGE DX AND DY DCA VCTEM TAD DY DCA DX TAD VCTEM DCA DY TAD LDILX /SET DISPLAY COMMANDS REVERSE DCA LDY TAD LDILY DCA LDX JMP SETSTP /AND GO BACK TO REGULAR SEQUENCE VCTEM, 0 /TEMPORARY STORAGE FOR REVERSAL OV VALUES /TO MULTIPLY (MULTIPLIER IN MQ, MULTIPLICAND IN ARGUMENT POSITION) / IF (MULTIPLICAND NEGATIVE) / / TAKE ABSOLUTE VALUE OF MULTIPLICAND / / REMEMBER SIGN CHANGE / ////////FIN / IF (MULTIPLIER NEGATIVE) / / TAKE ABSOLUTE VALUE OF MULTIPLIER / / REMEMBER SIGN CHANGE / ////////FIN / DO (12 TIMES) / / IF (LS BIT IN MULTIPLIER = 1) ADD MULTIPLICAND TO AC / / SHIFT AC AND MQ, DROPPING LS BIT OF MQ / ////////FIN / FIX SIGN OF PRODUCT ////////FIN IFZERO EAE < MULTPY, 0 /ENTRY TO MULTIPLY ROUTINE CLA CLL /CLEAR AC AND LINK (MULTIPLIER IS IN MQ) TAD MDCONS /GET DECIMAL -12 TO DCA MDCOUN /SET UP COUNTER TAD I MULTPY /GET THE MULTIPLICAND FROM THE ARGUMENT POSITION ISZ MULTPY /BUMP POINTER TO THE RETRUN ADDRESS SPA CLL /IS MULTIPLICAND POSITIVE? CIA STL /NO, MAKE IT POSITIVE AND SET LINK AS REMINDER DCA MPCND /STORE THE ABS VALUE OF MULTIPLICAND CLA MQA /BRING MULTIPLIER INTO AC SPA /IS MULTIPLIER NEGATIVE? CIA CML /YES; MAKE IT POSITIVE AND COMPLEMENT LINK AS REMINDER RAR /BEGINNING OF MULTIPLY LOOP; MOVE LS BIT OF MULTIPLIER INTO LINK /(FIRST TIME THROUGH THIS LOOP, SIGN OF PRODUCT GOES INTO SIGN POSITION; /THEREAFTER IT IS SHIFTED RIGHT) SWP /PUT PARTIAL MULTIPLIER (AND SIGN OF PRODUCT) BACK INTO MQ SZL /WAS LS BIT SHIFTED OUT OF MULTIPLIER 1? TAD MPCND /YES; ADD MULTIPLICAND INTO PARTIAL PRODUCT AT THIS POSITION CLL RAR /NOW THROW AWAY THE MULTIPLIER BIT AND SHIFT PARTIAL PRODUCT /(LS BIT GOES INTO LINK) SWP /PARTIAL PRODUCT TO MQ, PARTIAL MULTIPLIER INTO AC ISZ MDCOUN /INCREMENT THE 12 BIT COUNTER JMP .-7 /GO AROUND THE LOOP AGAIN IF NOT DONE 12 TIMES RAR /MOVE THE SIGN OF THE PRODUCT INTO LINK SZL /IF BIT IS SET, CIA /COMPLEMENT AND INCREMENT THE LS HALF OF THE PRODUCT SWP /REVERSE THE PARTS OF THE PRODUCT (MS HALF NOW IN AC) SZL /IF SIGN BIT IS SET, CMA /AIMPLY COMPLEMENT THE MS HALF CLL /NOW THROW AWAY THE SIGN JMP I MULTPY /AND LEAVE THE SUBROUTINE WITH MS PART IN AC, LS PART IN MQ /TO DIVIDE (MS PART OF DIVIDEND IN AC, LS PART IN MQ; SIGN PROPERLY SET) / IF (DIVIDEND NEGATIVE) / / TAKE ABSOLUTE VALUE / / REMEMBER SIGN CHANGE / ////////FIN / IF (DIVISOR NEGATIVE) / / TAKE ABSOLUTE VALUE / / REMEMBER SIGN CHANGE / ////////FIN / DO (12 TIMES) / / SUBTRACT DIVISOR / / WHEN (DIVIDEND GOES NEGATIVE) ADD DIVISOR BACK TO DIVIDEND / / ELSE SET LS BIT OF QUOTIENT / / SHIFT PARTIAL QUOTIENT AND DIVIDEND / ////////FIN / FIX SIGN OF QUOTIENT ////////FIN DIVIDE, 0 /ENTRY TO DIVIDE ROUTINE CLL /CLEAR LINK AS PLACE TO REMEMBER NUMBER OF SIGN CHANGES SPA /IS DIVIDEND NEGATIVE? CMA STL /YES; COMPLEMENT THE MS PART AND SET LINK TO REMEMBER SWP /GET THE LS PART INTO AC SZL /ARE WE NEGATING DIVIDEND? CIA /YES; COMPLEMENT AND INCREMENT THE LS PART DCA MDTEMP /STORE THE LS PART SOMEPLACE SO WE HAVE AC FREE TEMPORARILY TAD I DIVIDE /GET THE DIVISOR FROM THE ARGUMENT POSITION SPA /IS IT NEGATIVE? CML /YES; COMPLEMENT THE LINK TO REMEMBER THIS SMA /IS DIVISOR NEGATIVE (SORRY, WE MUST ASK AGAIN) CIA /NO; MAKE IT NEGATIVE DCA DIVSOR /AND STORE NEGATIVE OF ABS VALUE OF DIVISOR TO USE IN SUBTRACTIONS TAD MDCONS /GET MINUS DECIMAL 12 DCA MDCOUN /AND SET 12 BIT COUNTER TAD MDTEMP /GET BACK LS PART OF DIVIDEND RAL /SHIFT SIGN OF QUOTIENT INTO LS END OF QUOTIENT, SHIFT DIVIDEND SWP /ONE PLACE TO THE LEFT AND EXCHANGE SO MS PART OF DIVIDEND IS IN AC AND RAL /SHIFT SIGN OF DIVIDEND (NECESSARILY ZERO) INTO LINK /HERE IS AN ERROR CHECKING PART THAT WILL TRAP EITHER ZERO DIVISOR OR QUOTIENT OVERFLOW. /LINK WILL BE SET UPON RETURN TO INDICATE ERROR CGNDITION AND WILL BE CLEAR TO INDICATE NO /ERROR. /BECAUSE OF PREVIOUS CHECK FOR DX = 0, A ZERO DIVISOR CAN NEVER OCCUR IN THIS GRAPHICS PROGRAM /AND BECAUSE THIS DIVIDE ROUTINE IS CALLED ONLY IN THE CONTEXT OF SOME X COORDINATE * DY / DX /AND IT HAS BEEN CAREFULLY ARRANGED THAT DY IS LESS THAN OR EQUAL TO DX, THE QUOTIENT OVERFLOW /CONDITION CAN NEVER ARISE IN THIS GRAPHICS PROGRAM. THE ERROR EXIT, THEREFORE, CAN NEVER /BE TAKEN AND THE SET LINK IS NOT CHECKED FOR UPON RETURN. THE CODE IS LEFT IN ONLY FOR /GENERALITY. TAD DIVSOR /SUBTRACT THE DIVISOR (STARTING AT THE MS END) SPA /IS THE RESULT NEGATIVE? JMP .+10 /YES; NO QUOTIENT OVERFLOW CONDITION OR ZERO DIVISOR SO GO ON WITH DIVISION STL /NO; QUOTIENT OVERFLOW OR ZERO DIVISOR; SET LINK AS ERROR FLAG JMP I DIVIDE /AND RETURN /END OF ERROR CHECKING PART SWP /JUMP BACK POINT IN LOOP; PUT MS PART OF DIVIDEND IN AC RAL /AND SHIFT LEFT; MS BIT FROM LS PART COMES INTO LS BIT OF AC TAD DIVSOR /SUBTRACT DIVISOR SMA /IS RESULT NEGATIVE: JMP .+4 /NO; JUMP AHEAD TO PROPER BRANCH TAD I DIVIDE /YES; ADD DIVISOR BACK CLL /SET ZERO BIT TO BE PUT INTO QUOTIENT SKP /AND JOIN THE POSITIVE BRANCH ONE STEP AHEAD STL /RESULT OF SUBTRACTION WAS POSITIVE WHICH IS OK SO SET BIT IN QUOTIENT SWP /LS PART OF DIVIDEND TO AC RAL /QUOTIENT BIT FROM LINK INTO LS BIT; SHIFT LS PART LEFT AND MS BIT INTO LINK ISZ MDCOUN /BUMP 12 BIT COUNTER JMP .-14 /AND GO AROUND THE LOOP AGAIN IF NOT DONE 12 TIMES SZL CLL /OR LEAVE THE LOOP; CLEAR THE LINK TO INDICATE NO ERROR; WAS LINK SET? CIA /YES; QUOTIENT MUST BE NEGATIVE SO NEGATE IT SWP /AND PUT IT INTO THE MQ ISZ DIVIDE /POINT TO RETURN ADDRESS JMP I DIVIDE /AND RETURN FROM SUBROUTINE MDCONS, -14 /MINUS DECIMAL 12 FOR BIT COUNTER FOR MULTIPLY/DIVIDE LOOPS MDCOUN, 0 /12 BIT COUNTER FOR MULTIPLY/DIVIDE LOOPS MDTEMP, 0 /TEMPORARY STORAGE FOR PART OF DIVIDEND WHILE DIVIDE IS BEING SET UP MPCND, 0 /MULTIPLICAND DIVSOR, 0 /NEGATIVE OF DIVISOR > PAGE /HERE BEGINNETH THE TABLE OF DOT MATRIX INFORMATION FOR THE STANDARD CHARACTER SET. /THE MATRIX IS A 5 X 7 MATRIX WITH 35 BITS OF INFORMATION STORED IN THREE 12-BIT WORDS /LET THE WORDS BE DESIGNATED "A", "B", AND "C", IN ORDER. THE MATRIX IS STORED: / / A07 B02 B09 C04 C11 / A06 B01 B08 C03 C10 / A05 B00 B07 C02 C09 / A04 A11 B06 C01 C08 / A03 A10 B05 C00 C07 / A02 A09 B04 B11 C06 / A01 A08 B03 B10 C05 / /IF BIT A00 IS SET, THE ENTIRE 5 X 7 MATRIX IS TO BE SHIFTED DOWN 3 MATRIX POSITIONS /BEFORE PRINTING. THIS ALLOWS CHARACTERS WITH TAILS BELOW THE LINE. /THE CHARACTERS ARE IN ORDER OF THEIR ASCII CODES BEGINNING WITH 040 AND /ENDING WITH 177. DOTTAB, 0 /SPACE 0 0000 0000 /! 0576 0000 0000 /" 7000 1600 0517 /# 7123 7624 1105 /$ 2655 2422 3062 /% 3043 1143 1551 /& 1531 0120 0000 /' 7034 0000 0003 /( 4212 0200 0010 /) 1210 7000 1243 /* 4370 7052 0201 /+ 0370 2010 0013 /, 0340 0000 0201 /- 0040 2010 0014 /. 0600 0000 3002 // 0040 1003 1752 /0 1446 1276 0010 /1 2776 0000 3451 /2 1446 2306 1050 /3 1446 2266 0602 /4 4113 7620 1170 /5 5426 1271 1711 /6 2446 2260 3022 /7 1044 1203 1551 /8 1446 2266 0151 /9 1445 2236 0006 /: 6330 0000 0013 /; 3354 0000 0001 /< 0121 0501 0502 /= 4120 5024 2024 /> 2120 2000 0040 /? 1544 1400 1451 /AT 1746 0276 3702 /A 2104 4574 2037 /B 7446 2266 1750 /C 1406 0242 2037 /D 7406 0276 3771 /E 1446 0301 3761 /F 1044 0201 1750 /G 1406 2371 3761 /H 0040 2177 0010 /I 1776 0200 1010 /J 0402 0077 3761 /K 0121 0501 3770 /L 0402 0100 3760 /M 2020 0577 3760 /N 2020 2177 1750 /O 1406 0276 3761 /P 1044 2206 1750 /Q 1505 0336 3761 /R 1145 2306 1050 /S 5446 4242 0020 /T 1774 0201 1770 /U 0402 0077 0764 /V 0401 0037 3764 /W 0101 0177 3062 /X 4040 5143 0020 /Y 2760 0401 3032 /Z 1446 1303 0017 /[ 7406 0200 0060 /\ 4040 4140 0010 /] 1407 7600 0100 /^ 2374 0404 0203 /_ 4250 2010 0000 /` 1010 1000 1012 /a 4522 5070 3771 /b 0442 2060 1411 /c 0442 2020 1411 /d 0442 2177 1612 /e 4522 5010 0217 /f 6044 0202 5151 /g 1446 2276 3761 /h 0040 2160 0012 /i 0752 0000 5010 /j 0401 7600 3762 /k 0242 1000 0010 /l 1776 0000 3601 /m 0700 2160 3601 /n 0040 2160 1411 /o 0442 2060 7761 /p 1044 2206 4141 /q 1047 7700 2117 /r 0440 2020 0212 /s 4522 5040 0107 /t 6422 0040 1610 /u 0402 0170 0604 /v 0401 0030 1610 /w 0202 0070 0011 /x 0301 4110 5171 /y 0442 2077 0011 /z 0642 6110 0206 /{ 6406 0200 0000 /| 0734 0000 0010 /} 1405 5410 0200 /~ 4040 4010 3777 /RUBOUT 7777 7777 /HERE BEGINNETH THE DOT MATRIX TABLE FOR THE ALTERNATE (APL) CHARACTER SET. /USER MAY SUBSTITUTE ANOTHER ALTERNATE SET OBSERVING TWO RULES: / 1. THREE WORDS PER CHARACTER WITH BITS AS ABOVE / 2. ASCII 40 THROUGH 177 IN ORDER /THIS TABLE IS FOR THE APL CHARACTER SET ALTDOT, 0000 /SPACE 0000 0000 0060 /UMLAUT 3000 0603 0010 /) 1210 7000 0001 /< 0121 0501 0011 /=< 0523 0501 0502 /= 4120 5024 2024 /> 2120 2000 0010 /] 1407 7600 0061 /OR 4300 3003 3003 /AND 0030 6140 1502 /=/ 4160 5026 0201 /DIVIDE 0250 2010 4005 /, 4160 0000 0201 /+ 0370 2010 0014 /. 0600 0000 3002 // 0040 1003 1752 /0 1446 1276 0010 /1 2776 0000 3451 /2 1446 2306 1050 /3 1446 2266 0602 /4 4113 7620 1170 /5 5426 1271 1711 /6 2446 2260 3022 /7 1044 1203 1551 /8 1446 2266 0151 /9 1445 2236 0003 /( 4212 0200 0017 /[ 7406 0200 0013 /; 3354 0000 1042 /TIMES 4040 5042 0006 /: 6330 0000 0060 /\ 4040 4140 0020 /NEGATIVE 1004 0201 0704 /ALPHA 2120 2024 1004 /DECODE 0371 0040 1700 /DOWN 2010 0474 0017 /MINIMUM 7402 0000 0705 /EPSILON 2251 0400 2010 /UNDERLINE 0402 0100 0141 /DEL 2110 2406 1405 /DELTA 0221 2060 0000 /IOTA 4361 0000 0302 /DEGREE 2110 3000 0000 /' 0070 0000 3750 /QUAD 2412 0576 0000 /ABSOLUTE 0774 0000 0040 /ENCODE 2370 0402 0704 /CIRCLE 2211 0434 1243 /* 4370 7052 0040 /? 1544 1400 2017 /RHO 4110 4414 0017 /MAXIMUM 7004 0200 0200 /TILDE 4040 4010 0404 /DOWN ARROW 0775 0020 0744 /UP 0201 0036 0604 /OMEGA 0101 0030 1044 /LEFT 2211 0434 0100 /UP ARROW 2374 0404 0704 /RIGHT 2211 0442 0203 /LEFT ARROW 4250 2010 1741 /LEFT BAR 0040 2010 0201 /RIGHT ARROW 0250 7010 2034 />= 2522 2000 0201 /- 0040 2010 0202 /DIAMOND 4210 5010 3702 /A 2104 4574 2037 /B 7446 2266 1750 /C 1406 0242 2037 /D 7406 0276 3771 /E 1446 0301 3761 /F 1044 0201 1750 /G 1406 2371 3761 /H 0040 2177 0010 /I 1776 0200 1010 /J 0402 0077 3761 /K 0121 0501 3770 /L 0402 0100 3760 /M 2020 0577 3760 /N 2020 2177 1750 /O 1406 0276 3761 /P 1044 2206 1750 /Q 1505 0336 3761 /R 1145 2306 1050 /S 5446 4242 0020 /T 1774 0201 1770 /U 0402 0077 0764 /V 0401 0037 3764 /W 0101 0177 3062 /X 4040 5143 0020 /Y 2760 0401 3032 /Z 1446 1303 0206 /{ 6406 0200 0201 /RIGHT BAR 0040 2076 0010 /} 1405 5410 1105 /$ 2655 2422 3777 /RUBOUT 7777 7777 IFNZRO PLOTER < /TABLE OF POINTERS TO VECTOR TABLE FOR STANDARD CHARACTER SET /VECTOR CHARACTERS MUST BE SET UP WITH A DOUBLE POINTER SINCE THE NUMBER OF VECTORS /PER CHARACTER IS NOT CONSTANT. HENCE, THE POINTERS OCCUR HERE FROM ASCII 040 TO 177 /IN ORDER AND ONE POINTER PER WORD. THE POINTER IS TO THE FIRST VECTOR FOR EACH CHARACTER. VECTAB, SP EX QUO NU DO PC AM AP LP RP AS PL COM DA PE SL N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 COL SC LAN EQ RAN QUS AT A B C D E F G H UCI J K L M N O P Q R S T U V W X Y UCZ LBK RSL RBK UA LA AG LCA LCB LCC LCD LCE LCF LCG LCH LCI LCJ LCK LCL LCM LCN LCO LCP LCQ LCR LCS LCT LCU LCV LCW LCX LCY LCZ LBC VER RBC TIL RO /TABLE OF POINTERS TO VECTOR TABLE FOR ALTERNATE CHARACTER SET /NOTE THAT SOME CCARACTERS IN THIS SET ARE THE SAME AS IN THE STANDARD /SO THAT SOME POINTERS IN THIS SET POINT TO THE SAME PLACE AS SOME POINTERS /OF THE STANDARD SET APLVTB, SP APLUML RP APLLT APLLE EQ APLGT RBK APLOR APLAND APLNE APLDIV COM PL PE SL N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 LP LBK SC APLMPY COL RSL APLNEG APLALP APLDEC APLDOW APLMIN APLEPS APLUND APLDEL APLDLT APLIOT APLDEG APLAPO APLQUA APLABS APLENC APLCIR APLSTR QUS APLRHO APLMAX TIL APLDA APLUP APLOME APLLFT UA APLRT LA APLLBR APLRA APLGE DA APLDIA A B C D E F G H UCI J K L M N O P Q R S T U V W X Y UCZ LBC APLRBR RBC DO RO /TABLE OF VECTORS FOR STANDARD CHARACTER SET. /EACH 12-BIT WORD CONTAINS ALL THE INFORMATION FOR THE NEXT VECTOR. /THE CHARACTER CELL IS A 10 X 14 MATRIX WITH 4 ADDITIONAL BLANK SPACES TO THE RIGHT /OF THE CELL AND 8 ADDITIONAL BLANK SPAAES ABOVE THE CELL (I.E., THE SPACE BETWEEN CELLS /IN THE SAME LINE IS 4 RASTER UNITS AND THE SPACE BETWEEN LINES IS 8 RASTER UNITS). /THE BEAM (OR PEN) IS ASSUMED AT THE LOWER LEFT CORNER OF THE CHARACTER CELL INITIALLY, /AND THE BEAM (OR PEN) MUST BE PUT AT THE LOWER LEFT CORNER OF THE NEXT /CHARACTER CELL AT THE COMPLETION OF THE PRESENT CHARACTER. EACH 12-BIT WORD IS /CONSTRUCTED AS FOLLOWS: / / BIT 00 SET IF THIS IS THE FIRST VECTOR OF A CHARACTER / BITS 01-04 X COORDINATE OF TIP COMPARED TO TAIL, I.E., RELATIVE X COMPONENT / BIT 05 SET IF X COMPONENT OF VECTOR IS NEGATIVE / BIT 06 SET IF VECTOR IS NOT TO BE DISPLAYED OR DRAWN, I.E., DARK VECTOR / BITS 07-10 Y COORDINATE OF TIP COMPARED TO TAIL, I.E., RELATIVE Y COMPONENT / BIT 11 SET IF Y COMPONENT OF VECTOR IS NEGATIVE / SP, 7440 /SPACE EX, 5040 /! 0400 0004 0500 0005 0252 0222 0500 0223 2253 QUO, 4472 /" 0500 0004 0400 0005 0507 1646 0500 0004 0400 0005 0507 1665 NU, 4642 /# 0030 0011 0500 2000 0500 0010 0031 0010 0400 2100 3253 DO, 4246 /$ 0405 1000 0404 0004 0504 1100 0504 0004 0404 1000 0405 1150 0037 0003 2242 PC, 6434 /% 1543 0007 0700 0006 0600 0463 0007 0600 0006 0700 2051 AM, 6440 /& 2524 0004 0404 0400 0405 0005 1515 0005 0405 1400 0404 0004 1051 AP, 5064 /' 0406 0004 0500 0005 0400 2073 LP, 5474 /( 0507 0021 0407 2040 RP, 5074 /) 0407 0021 0507 2240 AS, 4646 /* 1020 0511 0510 1021 0510 1100 2000 1257 PL, 5246 /+ 0020 0011 1100 2000 1257 COM, 5047 /, 0406 0004 0500 0005 0400 2040 DA, 4256 /- 2000 1257 PE, 5040 /. 0400 0004 0500 0005 2440 SL, 6434 // 1075 N0, 6434 /0 0303 0302 1500 0507 0021 0407 1400 0406 0020 0506 1475 N1, 4464 /1 0610 0035 1100 2000 1240 N2, 4070 /2 0404 1400 0405 0007 0505 1500 0505 0013 2400 1040 N3, 4070 /3 0404 1400 0405 0007 0505 1100 1000 0405 0007 0505 1500 0504 3445 N4, 6040 /4 0034 1723 2000 1253 N5, 4044 /5 0405 1400 0404 0010 0504 2100 0014 2400 1075 N6, 4056 /6 2000 0405 0007 0505 1500 0504 0024 0404 1400 0405 1071 N7, 6434 /7 2500 3475 N8, 4456 /8 1400 0404 0006 0504 1500 0505 0007 0405 0505 0007 0405 1400 0404 0006 0504 1457 N9, 4044 /9 0405 1400 0404 0024 0504 1500 0505 0007 0405 2000 1057 COL, 5044 /: 0400 0004 0500 0005 0060 0400 0004 0500 0005 2465 SC, 5064 /; 0400 0004 0500 0005 0461 0500 0004 0400 0005 0507 2442 LAN, 6274 /< 2117 2017 1240 EQ, 4262 /= 2000 0051 2100 3253 RAN, 4240 /> 2016 2116 3275 QUS, 4470 /? 0404 0400 0405 0007 0707 0005 0245 0500 0005 0400 0004 2045 AT, 5654 /@ 0010 0500 0305 0205 1000 0010 0504 1100 0505 0015 0405 1000 0404 1251 A, 5234 /A 1235 0512 1500 3053 B, 4034 /B 2000 0405 0007 0505 2100 2000 0405 0007 0505 2100 3440 C, 6470 /C 0504 1500 0505 0025 0405 1400 0404 1045 D, 4034 /D 2000 0405 0025 0505 2100 3440 E, 6474 /E 2500 0017 1400 1500 0017 2400 1040 F, 6474 /F 2500 0017 1400 1500 0017 3440 G, 6470 /G 0504 1500 0505 0025 0405 1400 0404 0012 1100 2057 H, 4034 /H 0017 2400 0016 0035 1040 UCI, 4274 /I 2000 1100 0035 1100 2000 1240 J, 4050 /J 0005 0405 1400 0404 0030 1075 K, 4034 /K 0021 2020 1313 1423 1040 L, 4074 /L 0035 2400 1040 M, 4034 /M 1217 1216 0035 1040 N, 4034 /N 2435 0034 1075 O, 4440 /O 0504 0024 0404 1400 0405 0025 0505 1500 3040 P, 4034 /P 2000 0405 0007 0505 2100 3457 Q, 4440 /Q 0504 0024 0404 1400 0405 0023 0707 1300 1246 0607 1040 R, 4034 /R 2000 0405 0007 0505 2100 1200 1217 1040 S, 4044 /S 0405 1400 0404 0006 0504 1500 0504 0006 0404 1400 0405 1071 T, 4074 /T 2400 1300 0035 2240 U, 4074 /U 0031 0405 1400 0404 0030 1075 V, 4074 /V 1235 1234 1075 W, 4074 /W 0435 0634 0635 0434 1075 X, 6434 /X 1317 1316 2435 1040 Y, 4074 /Y 1217 1216 1317 0017 2240 UCZ, 4074 /Z 2400 2535 2400 1040 LBK, 6074 /[ 1500 0035 1400 1440 RSL, 4074 /\ 2435 1040 RBK, 4474 /] 1400 0035 1500 3040 UA, 4260 /^ 1014 1015 1114 0035 2240 LA, 5246 /_(LEFT ARROW) 1310 1210 1311 2400 1057 AG, 4674 /` 1011 1665 LCA, 6052 /a 1100 0505 0003 0405 1000 0012 0504 0700 2657 LCB, 4474 /b 0035 1000 0404 0006 0504 1100 3057 LCC, 6052 /c 0504 0500 0505 0007 0405 0400 0404 1445 LCD, 6074 /d 0035 1100 0504 0006 0404 1000 1457 LCE, 4446 /e 1400 0004 0504 0500 0505 0007 0405 0600 1640 LCF, 5040 /f 0030 0404 0400 0557 1100 3057 LCG, 4445 /g 0405 0400 0404 0022 1100 0505 0007 0405 1000 1440 LCH, 4440 /h 0034 0017 1000 0405 0013 1440 LCI, 5240 /i 0016 0046 0002 0300 0003 0200 2265 LCJ, 4447 /j 0400 0404 0020 0046 0002 0300 0003 0200 2265 LCK, 4440 /k 0034 0023 1212 0707 1017 1440 LCL, 4674 /l 0400 0035 0500 1000 1640 LCM, 4240 /m 0016 0005 0404 0405 0013 0012 0404 0405 0013 1240 LCN, 4440 /n 0016 0005 0404 0400 0405 0013 1440 LCO, 5040 /o 0504 0006 0404 0400 0405 0007 0505 0500 2440 LCP, 4451 /p 0026 1000 0405 0007 0505 1100 3040 LCQ, 6051 /q 0026 1100 0505 0007 0405 1000 1440 LCR, 4440 /r 0016 0007 0606 0400 1657 LCS, 4440 /s 1000 0404 1506 0404 1000 1457 LCT, 4260 /t 1400 0750 0025 0405 0400 1440 LCU, 4456 /u 0013 0405 0400 0404 0012 0017 1440 LCV, 4456 /v 0617 0616 1457 LCW, 4256 /w 0417 0416 0417 0416 1257 LCX, 4440 /x 1416 1540 1417 1440 LCY, 4456 /y 0013 0405 1000 0016 0023 0505 1100 3050 LCZ, 4456 /z 1400 1517 1400 1440 LBC, 5674 /{ 0505 0007 0505 0405 0007 0405 1640 VER, 5274 /| 0013 0051 0013 2240 RBC, 4674 /} 0405 0007 0405 0505 0007 0505 2440 TIL, 4254 /~ 0404 1005 0404 1261 RO, 6404 /RUBOUT 2504 2404 2504 2404 2504 2404 1075 /TABLE OF VECTORS FOR ALTERNATE (APL) CHARACTER SET APLUML, 4270 /UMLAUT 0004 0400 0005 0500 1440 0400 0004 0500 0005 1671 APLLE, 4240 /=< 2000 2340 APLLT, 2270 /< 2113 2013 1245 APLGE, 4240 />= 2000 2340 APLGT, 0244 /> 2012 2112 3271 APLOR, 4070 /OR 1225 1224 1071 APLAND, 4044 /AND 1224 1225 1045 APLNE, 4450 /=/ 2024 0047 2100 0053 2000 1253 APLDIV, 4256 /DIVIDE 2000 0744 0500 0004 0400 0005 0051 0005 0500 0004 0400 2053 APLMPY, 4246 /MULTIPLY 2020 1111 1110 2021 1247 APLNEG, 4274 /NEGATE 2000 1275 APLALP, 6264 /ALPHA 1115 0500 0504 0004 0404 0400 1015 1251 APLDEC, 4244 /DECODE 2000 1100 0024 2271 APLDOW, 4244 /DOWN 0020 0404 1000 0405 0021 1245 APLMIN, 4470 /MINIMUM 0025 1400 1445 APLEPS, 6066 /EPSILON 1300 0505 0005 1200 1300 0005 0405 1200 1447 APLUND, 4240 /UNDERLINN 2000 1240 APLDEL, 5250 /DEL 1120 2000 1121 2251 APLDLT, 4244 /DELTA 1220 1221 2100 3245 APLIOT, 4664 /IOTA 0400 0021 0400 1645 APLDEG, 5052 /DEGREE 0400 0404 0004 0504 0500 0505 0005 0405 2453 APLAPO, 5060 /APOSTROPHE 0010 2271 APLQUA, 4244 /QUAD 0024 2000 0025 2100 3245 APLABS, 5274 /ABSOLUTE 0035 2240 APLENC, 4270 /ENCODE 2000 1100 0025 2245 APLCIR, 4644 /CIRCLE 1000 0606 0010 0706 1100 0707 0011 0607 2645 APLSTR, 4446 /STAR 0610 1102 1003 0012 0013 1002 1103 0611 1447 APLRHO, 4440 /RHO 0022 0404 0400 0405 0005 0505 1100 3053 APLMAX, 4444 /MAXIMUM 0024 1400 1471 APLDA, 4274 /DOWN ARROW 0035 1114 1015 1014 1255 APLUP, 4270 /UP 0021 0405 1000 0404 0020 1271 APLOME, 4264 /OMEGA 0015 0405 0400 0010 0011 0400 0404 0014 1265 APLLFT, 4244 /LEFT 1400 0404 0014 0504 1500 3271 APLRT, 6270 /RIGHT 1500 0505 0015 0405 1400 1245 APLLBR, 4244 /LEFT BAR 0024 0013 2000 1257 APLRA, 4056 /RIGNT ARROW 2400 1312 1213 1313 2247 APLDIA, 5244 /DIAMOND 1012 1112 1113 1013 2245 APLRBR, 4256 /RIGHT BAR 2000 0012 0025 1245 STOPCH, 4000 /A STOP CHARACTER MUST END THIS TABLE > PAGE /THIS IS A SHORTENED VERSION OF THE PROGRAM UTIL10 WHICH IS USED /TO LOGIN AND LOGOUT THE DEC-10. ONE ARGUMENT IS USED. IF THE /ARGUMENT IS 1, THE ACTION IS LOGIN; IF 0 THE ACTION IS LOGOUT. /WORD 7777 OF FIELD 1 (SYS AREA) IS PRESUMED AS A STATUS WORD. /BIT 11 IF SET INDICATES LOGGED IN; IF CLEAR,LOGGED OUT. /OTHER BITS ARE USED FOR OTHER PUTPOSES BY OTHER PROGRAMS, BUT /ARE NOT RELEVANT HERE. UTIL10, 0 /STARTING ADDRESS FOR SUBROUTINE TENTFL /SET THE DEC-10 OUTPUT FLAG (IT IS KEPT CLEAR IN MAIN PROGRAM) CDF 10 /POINT TO DF 1 FOR C.D. TABLES AND STATUS WORD TAD I STATPT /GET STATUS WORD DCA OLDST /AND STORE IT CDF 0 /NO; ENTRY IS BY SUBROUTINE CALL; CHANGE TO DF 0 TAD I UTIL10 /GET ARGUMENT ISZ UTIL10 /POINT TO RETURN ADDRESS DCA NEWST /STORE ARG AS STATUS TO BE ACHIEVED BY SUBROUTINE / BEGLPS, TAD NEWST /COME HERE AFTER NEW STATUS WORD IS SET CMA /COMPUTE BITS TO BE CLEARED AS AND OLDST / OLD.AND.NOT.NEW DCA CLRREG /STORE BITS TO BE CLEARED TAD OLDST /COMPUTE BITS TO BE SET AS CMA / NEW.AND.NOT.OLD AND NEWST DCA SETREG /STORE BITS TO BE SET TAD (SETCLR+27 /BEGIN CLEAR ROUTINE BY DCA SCPT /SETTING POINTER TO BOTTOM OF TABLE NXTCLR, TAD CLRREG /GET CLEAR WORD SNA /ZERO? JMP CLRDON /YES; NO MORE CLEARING NECESSARY CLL RAR /NO; SHIFT RIGHT-MOST BIT INTO LINK DCA CLRREG /STORE SHIFTED WORD SZL /TAKE CLEAR ACTION FOR THIS BIT? JMS TRAREC /YES STA CLL RAL /NO; TAD (-2 TAD SCPT /DECREMENT POINTER BY 2 DCA SCPT /AND STORE IT JMP NXTCLR /GO BACK AND CLEAR MORE CLRDON, TAD (SETCLR /BEGIN SET ROUTINE BY DCA SCPT /SETTING POINTER TO TOP OF TABLE NXTSET, TAD SETREG /GET SET WORD SNA /ZERO? JMP FIXSTA /YES; NO MORE SETTING NECESSARY CLL RAL /NO; SHIFT LEFT-MOST BIT TO LINK DCA SETREG /STORE SHIFTED WORD SZL /TAKE SET ACTION FOR THIS BIT? JMS TRAREC /YES ISZ SCPT /NO; INCREMENT POINTER ISZ SCPT /BY 2 JMP NXTSET /GO BACK AND SET MORE STATPT, 7777 /POINTER TO STATUS WORD IN FIELD 1 OLDST, 0 /LOCALLY STORED VALUE OF 17777 (OLD STATUS WORD) NEWST, 0 /STATUS WORD AS IT SHOULD APPEAR AFTER EXECUTION OF THIS SUBROUTINE FIXSTA, CDF 10 /CHANGE TO DF 1 TAD NEWST /GET NEW STATUS WORD DCA I STATPT /AND PUT IT IN 17777 CDF 0 /RESET DATA FIELD 0 RETURN, JMP I UTIL10 /ULTIMATELY COME HERE TO LEAVE ROUTINE / CLRREG, 0 /BITS TO BE CLEARED SETREG, 0 /BITS TO BE SET / TRAREC, 0 /SUBROUTINE TO TAKE ACTION ASSOCIATED WITH SET OR CLEAR BIT TAD (BUFFER /GET ADDRESS OF DEC-10 TEXT RETURN BUFFER DCA IBP /AND SET FILL POINTER TAD (BUFFER /LIKEWISE DCA OBP /SET EMPTY POINTER TAD I SCPT /GET APPROPRIATE WORD FROM SET/CLEAR TABLE DCA TRPT /AND STORE AS A POINTER MORE, JMS TRANS /TRANSMIT THE APPROPRIATE COMMAND ISZ TRPT /POINT TO THE EXPECTED RETURN STRING TAD I TRPT /GET THE FIRST CHARACTER FROM THE RETURN STRING SNA /IS IT ZERO? JMP GOTALL+1 /YES; NOTHING TO COME BACK SO SKIP RECAGN, JMS RECV /NO; SOMETHING IS EXPECTED; /LOOK; BUT COME BACK IMMEDIATELY IF NOTHING IN FROM DEC-10 TAD NXTMSG /GET FLAG SZA CLA /HAS EVERYTHING BEEN RECEIVED? JMP GOTALL /YES JMS LISTKB /NO; CHECK KB SO WE HAVE A WAY TO ESCAPE THIS /WAIT LOOP IF NECESSARY JMP RECAGN-3 /NOW CHECK FOR NEXT STUFF BACK FROM DEC-10 GOTALL, DCA NXTMSG /END OF EXPECTED RESPOINSE ISZ TRPT /POINT TO NEXT COMMAND TAD I TRPT /GET IT SZA CLA /ZERO? JMP MORE /NO; GO BACK AND SEND NEXT COMMAND JMP I TRAREC /YES; END OF COMMAND/RESPONSE SEQUENCE; RETURN / SCPT, 0 /POINTER TO SET/CLEAR TABLE TRPT, 0 /POINTER FOR COMMAND/RESPONSE TABLE / TRANS, 0 /SUBROUTINE TO TRANSMIT A COMMAND TO DEC-10 TAD I TRPT /GET COMMAND POINTER DCA TRANSP /AND STORE AS CHARACTER POINTER NXTCHR, TAD I TRANSP /GET CHAR SNA SPA /NULL? (CLOSE WITH LF) OR -1? (CLOSE WITH CR) JMP CLOSE /YES; END OF COMMAND JMS TCHAR /NO; TRANSMIT IT ISZ TRANSP /POINT TO NEXT CHAR JMP NXTCHR /GET IT AND GO AROUND AGAIN / CLOSE, SZA CLA /SKIP IF LAST CHAR IN STRING = 0; CLA IAC STL RAL /=TAD (3; TO SET CR AS BREAK CHAR WHEN LF ADDED IN NEXT STEP TAD (212 /GET BREAK CHAR (LF) TO CLOSE COMMAND; =(CR) IF STRING CLOSED WITH -1 JMS TCHAR /AND TRANSMIT IT JMP I TRANS /RETURN TRANSP, 0 / TCHAR, 0 /SUBROUTINE TO TRANSMIT A CHARACTER TO DEC-10 AND (177 /MASK TO 7 BITS TRYSND, TENTSF /DEC-10 READY? JMP TRYGET /NO; SEE IF ANYTHING COMING BACK; /DON'T HANG UP HERE AND MISS WHAT THE DEC-10 IS SENDING TENTLS /YES; TRANSMIT CLA CLL /CLEAR AC AND L JMP I TCHAR / AND RETURN TRYGET, TENKSF /ANYTHING COMING BACK? JMP TRYSND /NO; TRY SENDING AGAIN DCA HOLCHR /YES; STORE THE CHARACTER WAITING TO BE SENT JMS RECV /GET THE CHARACTER COMING IN TAD HOLCHR /NOW GET BACK THE CHARACTER TO BE SENT JMP TRYSND /AND TRY AGAIN HOLCHR, 0 /TEMP STORAGE FOR CHARACTER TO BE TRANSMITTED / LISTKB, 0 /SUBROUTINE TO CHECK KEYBOARD FOR ^C KSF /CHECK KB FLAG JMP I LISTKB /NO INPUT; RETURN KRB /READ KB INPUT TAD (-203 /CHECK FOR SNA CLA / ^C JMP MON /YES; RETURN TO KB MONITOR JMP I LISTKB /RETURN FROM SUBROUTINE PAGE RECV, 0 /SUBROUTINE TO RECEIVE MESSAGES FROM DEC-10 DCA TPT /STORE POINTER ON THIS PAGE LIST10, TENKSF /ANYTHING IN? JMP I RECV /NO; GO BACK IMMEDIATELY TENKRB /CHAR IN BUFFER; READ IT DCA TEMP /PUT IT AWAY NEARBY TAD TEMP /AND GET IT BACK TAD (-377 /RUBOUT? SNA CLA JMP LIST10 /YES; IGNORE IT TAD TEMP /NO; GET IT AGAIN CDF 10 /POINT TO BUFFER FIELD DCA I IBP /PUT IT IN BUFFER CDF 0 /AND POINT TO PRESENT FIELD ONCE AGAIN ISZ IBP /AND INCREMENT POINTER TAD TRPFLG /GET TRAP FLAG SZA CLA /AND TEST IT JMP TRFLST /FLAG SET; JUMP AHEAD BACK, TAD TPT /FLAG CLEAR; GET POINTER TO CURRENT TRAP PHRASE DCA TRAPP /STORE IT AS A CHAR POINTER TAD IBP /GET CURRENT INPUT BUFFER POINTER DCA TRPBEG /AND STORE IT AS POSSIBLE BEGINNING OF TRAP TRFLST, TAD TEMP /GET CHAR CIA /AND COMPARE IT WITH TAD I TRAPP /NEXT TRAP CHAR SNA CLA /SAME? JMP AHEAD /YES; GO AHEAD TAD TRPFLG /NO; GET TRAP FLAG SNA CLA /WAS TRAP SET? JMP LIST10 /NO; GET NEXT CHAR DCA TRPFLG /YES; CLEAR FLAG JMP BACK /GO BACK AND CHECK CHAR AGAINST FIRST IN TRAP STRING AHEAD, IAC /SET DCA TRPFLG / TRAP FLAG ISZ TRAPP /BUMP POINTER IN TRAP TEXT TAD I TRAPP /GET NEXT CHAR IN TRAP TEXT SZA CLA /NULL? JMP LIST10 /NO; GO BACK FOR MORE TAD (BUFFER /YES; RESET DCA IBP /BUFFER INPUT POINTER DCA TRPFLG /CLEAR TRAP FLAG / NXTTYP, TAD OBP /GET BUFFER OUTPUT POINTER CMA /AND COMPARE WITH TAD TRPBEG /TRAP BEGINNING POINTER SNA CLA /SAME? JMP ENDOUT /YES; END OF OUTPUT CDF 10 /CHANGE TO BUFFER FIELD TAD I OBP /NO; GET CHAR AND CDF 0 /AND RETURN TO PRESENT FIELD ISZ OBP /INCREMENT POINTER JMS TYPE /TYPE IT JMP NXTTYP /GET ANOTHER CHAR TO TYPE ENDOUT, TAD (BUFFER /GET RESET VALUE OF BUFFER POINTER DCA OBP /AND RESET OUTPUT POINTER ISZ NXTMSG /SET FLAG TO INDICATE RESPONSE AND TYPEOUT COMPLETED JMP I RECV /RETURN / IBP, 0 /FILL POINTER FOR BUFFER OBP, 0 /EMPTY POINTER FOR BUFFER TEMP, 0 /TEMP STORAGE TRPFLG, 0 /TRAP FLAG TPT, 0 /POINTER TO TRAP PHRASE ON THIS PAGE TOO TRAPP, 0 /CHAR POINTER FOR TRAP TEXT TRPBEG, 0 /POINTER (IN BUFFER) TO POSSIBLE BEGINNING OF TRAP SEQUENCE NXTMSG, 0 /FLAG; SET = RESPOINSE AND TYPEOUT COMPLETE MON, TAD I (7600 /BRANCH HERE BECAUSE OF ^C ON KEYBOARD; RETURN TO MONITOR / /TABLE OF POINTERS FOR SET AND CLEAR SEQUENCES FOR EACH BIT / /BITS ARE FIRST CLEARED IN ORDER 11-0 /AND THEN BITS ARE SET IN ORDER 0-11 / SETCLR, LOG; KILL /BIT0 KILL; URESET /BIT1 KILL; STOP /BIT2 KILL; STOP /BIT3 ZBLOCK 20 /ADJUST THIS NUMBER AS ADDITIONS ARE MADE TO TABLE / /TABLE OF COMMAND AND RESPONSE PAIRS /END EACH SEQUENCE WITH A ZERO / NICHTS=0 /JUST A CONVENIENT DEFINITION / LOG, CTRLC; CRLFPD LOGIN; PWDCLN PASSWD; CRLFPD 0 / STOP, DCTRLC; CRLFPD 0 / URESET, CTRLC; CRLFPD CTRLS; UPS NTAPE; PERIOD SFILL1; CRLFPD SFORM; CRLFPD SCRLF; CRLFPD NTAB; CRLFPD ECHO; CRLFPD 0 / KILL, DCTRLC; CRLFPD KF; CRLFPD 0 / PAGE / /COMMANDS--THE ACTUAL CHARACTERS TO BE TRANSMITTED /EACH STRING ENDS WITH A 0 TO CLOSE WITH A LF OR WITH -1 /TO CLOSE WITH A CR / CTRLC, 203;0 DCTRLC, 203;203;0 LOGIN, "L;"O;"G;" ;"2;"7;"0;"1;"7;",;"2;"7;"0;"0;-1 PASSWD, "P;"D;"P;"8;"E;0 SFILL1, "T;"T;"Y;" ;"F;"I;"L;"L;" ;"1;0 SCRLF, "T;"T;"Y;" ;"C;"R;"L;"F;0 NTAB, "T;"T;"Y;" ;"N;"O;" ;"T;"A;"B;0 ECHO, "T;"T;"Y;" ;"E;"C;"H;"O;0 NTAPE, "T;"T;"Y;" ;"N;"O;" ;"T;"A;"P;"E;0 SFORM, "T;"T;"Y;" ;"F;"O;"R;"M;0 CTRLS, 223;0 KF, "K;"/;"F;215;0 / /TRAPS--THE SEQUENCE OF CHARACTERS TO BE RECEIVED--BUT NOT PRINTED!! / CRLFPD, 12;56;0 PWDCLN, 120;341;363;363;167;157;162;344;72;240;0 UPS, 136;123;56;0 PERIOD, 56; 0 / /BUFFER FOR TEXT COMING FROM DEC-10 COULD BEGIN HERE IF THERE WERE /ENOUGH ROOM. SINCE THERE ISN'T, PUT IN IN NEXT FIELD. /IT OCCUPIES THE SAME SPACE AS THE BUFFER FOR THE MAIN PROGRAM, /BUT SO WHAT? / FIELD 1 *0 BUFFER, 0 /BEGINNING OF TEXT BUFFER $