/ P?S P H O C A L XLIST 1 IFNDEF ON IFNDEF OFF XLIST ON / LAST EDIT: 17-APR-1977 04:40:59 CJL /PHOCAL.AAB / P H O C A L /THE P?S HIGH-LEVEL OPERATIONS CALCULATOR /FOR FORMULATING HIGH-LEVEL OPERATIONAL CALCULATIONS IN ALGEBRAIC LANGUAGE /ON THE FOLLOWING COMPUTERS: /DEC PDP-8, PDP-8/I, PDP-8/L, LINC-8, LAB-8, PDP-12, PDP-8/E, PDP-8/F, PDP-8/M, PDP-8/A /DCC DCC-112, DCC-112H /FABRITEK MP-12 /INTERSIL IM6100 INCLUDING: / INTERSIL INTERCEPT 1 / PCM PCM-12, PCM-12A / TFL MINI-12, DATA-12 /HUNGARIAN TPA (ALSO VARIOUS OTHER EASTERN EUROPEAN PDP-8 RIPOFFS) /WRITTEN BY: CHARLES J. LASNER P?S N. Y. PAGE 0 /OF PHOCAL FEXIT= . /FLOATING POINT EXIT . /FILLED BY INTERRUPTS INTRPT, JMP I INTRPT /HANDLE INTERRUPTS THROUGH HERE INPUT, TTYR /INPUT POINTER OUTPUT, TTYP /OUTPUT POINTER ODTBRK, 7756 /CONSTANT 7756 RESERVED FOR P?S ODT DBUGSW, 1 /SWITCH FOR DEBUGGING (TRACE) DUMPSW, 1 /SWITCH FOR DEBUGGING (DUMP) FLOAT, FPNT /FLOATING INTERPRETER ENTRY FENTER= JMS I FLOAT /CALL FPP THIS WAY (IN GENERAL) /AUTO-INDEX DEFINITIONS PDLXR, 0 /PUSH-DOWN INDEX FLTXR1, 0 /FLOATING FLTXR2, 0 /INDICES TXR1, 0 /TEMPORARY TXR2, 0 /INDICES /3 FREE XR'S *20 /GET PAST XR'S PC, /PROGRAM COUNTER GETBASE,0 /GET A CHARACTER BASE GETNDX, 0 /GET A CHARACTER INDEX PFRST, FRST /POINTER TO DUMMY LINE EFUN3I, EFUN3 /FUNCTIONAL RETURN RETURN= JMP I EFUN3I /RETURN FROM FUNCTION TEMP, 0 /TEMPORARY PUTBASE,0 /PUT A CHARACTER BASE PUTNDX, 0 /PUT A CHARACTER INDEX THISLN, 0 /CURRENT LINE POINTER LASTLN, 0 /PREVIOUS LINE POINTER STARTV= . /START OF VARIABLES BUFFER, BUFBEG /BUFFER POINTER LASTV, BUFBEG /END OF VARIABLES BOTTOM, BEGIN-1 /LAST PDL LOCATION AVAILABLE SORTCN, 0 /SORTC INDEX NUMBER THISOP, 0 /CURRENT "EVAL" OPERATION LASTOP, 0 /PREVIOUS "EVAL" OPERATION INBUF, 0 /TTY INPUT BUFFER XINPUT, INPUTX /FLOATING INPUT ROUTINE;MAY BECOME TTY: PT1, 0 /VARIABLE POINTER /FLOATING DEFINITIONS FIXMRI FGET= 0000 /FLOATING LOAD FIXMRI FADD= 1000 /FLOATING ADD FIXMRI FSUB= 2000 /FLOATING SUBTRACT FIXMRI FDIV= 3000 /FLOATING DIVIDE FIXMRI FMUL= 4000 /FLOATING MULTIPLY FIXMRI FPOW= 5000 /FLOATING POWER FIXMRI FPUT= 6000 /FLOATING STORE FNOR= 7000 /NORMALIZE EX1, 0 /\ AC1H, 0 / >FLOATING OPERAND AC1L, 0 // OVER1, 0 /OVERFLOW WORD FLAC, /FLOATING ACCUMULATOR EXP, 0 /EXPONENT HORD, 0 /HIGH ORDER MANTISSA LORD, 0 /LOW ORDER MANTISSA OVER2, 0 /OVERFLOW SIGNF, 0 /SIGN CHANGE SWITCH MINSKI, ACMINS /FLAC= -FLAC NEGATE= JMS I MINSKI /NEGATE FLAC DECIMAL FISW, 8^128+04 /(%8.04 INITIAL) OUTPUT FORMAT CONTROL OCTAL INTEGER,FIX /FIX THE FLAC CNTR, -20 /COUNTER FOR FPP + OTHER ITERATIONS T1, 0 /\ T2, 0 / >GENERAL TEMPORARIES T3, 0 // EFOP, 0 /FUNCTION CODE ATSW, 0 /ASK-TYPE SWITCH /THE FOLLOWING ARE SAVED AS A GROUP (USING PUSHF) AND MUST BE TOGETHER HIARCY, 0001 /NOT ALL AND/OR GROUP SWITCH CHAR, 0 /SCANNING ROUTINE'S BUFFER LINENO, 0 /LINE NUMBER OF CURRENT LINE MCOMMA, -",+200 /COMMA CONSTANT COLUMN, 0 /COLUMN COUNTER SETUP, XSETUP /OUTPUT SETUP P6CH, XP6CH /SIX-BIT OUTPUT GETHAF, XGETHAF /GET A HALF-WORD ROUTINE PUTHAF, XPUTHAF /PUT A HALF-WORD ROUTINE /CONSTANTS WHICH MAY BECOME PAGE ZERO LITERALS IF DESIRED /N. B. SOME MAY BE CALLED UPON TO BE AT SPECIFIC LOCATIONS EVENTUALLY /AND THEN CANNOT BE LITERALS! L4, 4 /CONSTANT 0004 L5, 5 /CONSTANT 0005 L12, 12 /CONSTANT 0012 L15, 15 /CONSTANT 0015 L20, 20 /CONSTANT 0020 L36, 36 /CONSTANT 0036 L37, 37 /CONSTANT 0037 L40, 40 /CONSTANT 0040 L41, 41 /CONSTANT 0041 L52, 52 /CONSTANT 0052 L56, 56 /CONSTANT 0056 L60, 60 /CONSTANT 0060 L63, 63 /CONSTANT 0063 L77, 77 /CONSTANT 0077 L100, 100 /CONSTANT 0100 L175, 175 /CONSTANT 0175 L200, 200 /CONSTANT 0200 L7600, 7600 /CONSTANT 7600 L7700, 7700 /CONSTANT 7700 L7701, 7701 /CONSTANT 7701 L7740, 7740 /CONSTANT 7740 L7741, 7741 /CONSTANT 7741 L7752, 7752 /CONSTANT 7752 L7760, 7760 /CONSTANT 7760 L7767, 7767 /CONSTANT 7767 L7773, 7773 /CONSTANT 7773 L7774, 7774 /CONSTANT 7774 /INPUT CHARACTERS OF SPECIAL NOTE INCHRS, /USED BY READC L177, 177 / L137, 137 / L25, 25 /<^U> L22, 22 /<^R> MODZAP, -1 /**** MODIFY ACTIVE **** 0001 (<^A>) L7, 7 / L13, 13 /<^K> L23, 23 /<^S> MPER, -56 /THIS TERMINATES THE LIST /MICRO-OPERATE DEFINITIONS NL0001= CLA IAC /LOAD AC WITH 0001 NL0002= CLA CLL CML RTL /LOAD AC WITH 0002 NL2000= CLA CLL CML RTR /LOAD AC WITH 2000 NL3777= CLA CLL CMA RAR /LOAD AC WITH 3777 NL4000= CLA CLL CML RAR /LOAD AC WITH 4000 NL5777= CLA CLL CMA RTR /LOAD AC WITH 5777 NL7775= CLA CLL CMA RTL /LOAD AC WITH 7775 NL7776= CLA CLL CMA RAL /LOAD AC WITH 7776 /THE FOLLOWING LINE ALLOWS THE USE OF PAGE ZERO LITERALS WHICH /DO NOT INTERFERE WITH NORMAL OPERATIONS: START= [SKP /WE NEED THIS AT 177 PUSHA= JMS I [XPUSHA /SAVE AC ON STACK PUSHF= JMS I [XPUSHF /SAVE FLOATING NUMBER ON STACK PUSHJ= JMS I [XPUSHJ /RECURSIVE PUSH JUMP POPA= TAD I PDLXR /RETREIVE AC FROM STACK POPF= JMS I [XPOPF /RETREIVE FLOATING NUMBER FROM STACK POPJ= JMP I [XPOPJ /RECURSIVE RETURN GETC= JMS I [XGETC /GET A CHARACTER PACKC= JMS I [XPACKC /PUT A CHARACTER SORTC= JMS I [XSORTC /SORT CHARACTER SORTJ= JMS I [XSORTJ /SORT AND BRANCH READC= JMS I [XREADC /READ FROM TTY: INTO CHAR PRNTLN= JMS I [XPRNTLN/PRINT LINE # GETLIN= JMS I [XGETLN /GET A LINE # FINDLIN=JMS I [XFINDLN/FIND A GIVEN LINE # MAKE6= JMS I [XMAKE6 /CONVERT ASCII TO SIX-BIT ROL6= JMS I [XROL6 /ROTATE AC LEFT SIX BITS TESTC= JMS I [XTESTC /TEST CHAR FOR T,N,F,L TESTN= JMS I [XTESTN /TEST CHAR FOR .,OTHER,# TSPACE= JMS I [XTSPACE/TEST (THEN IGNORE) OR TSTLPR= JMS I [LPRTST /SKIP IF LEGAL LPAREN (5 ENCOUNTERED, START OVER PACKC /PUT INTO BUFFER JMP .-3 /GO BACK IF NOT TAD COMBEG /SETUP INPUT POINTERS NXTLINE,DCA GETBASE /WHICH ALSO SETS PC TAD L4 /COMES HERE ALSO TO DCA GETNDX /START UP NEXT LINE GETC /GET FIRST CHARACTER TSPACE /IGNORE SPACES AND TABS TAD BOTTOM /INITIALIZE DCA PDLXR /PUSHDOWN TESTN /TEST FOR LINE # ERROR1 /PERIOD IS ILLEGAL HERE JMP CALMODE /GO DO IMMEDIATE MODE COMMAND ISZ DBUGSW /LINE MAY CONTAIN "?" GETLINE /GO COMPUTE LINE # NL4000 /ONLY SINGLE LINES TAD HIARCY /ALLOWED JUST NOW SZA CLA /CHECK IF ALL OR GROUP ERROR1 /BARF ON BAD LINE # MODENT, TAD BUFFER /GO SETUP OUTPUT POINTERS TO JMS I SETUP /PACK INTO THE TEXT BUFFER TSPACE /THROW AWAY SPACES OR TABS AFTER LINE # SKP /DON'T THROW AWAY GOOD STUFF GETC /GET THE CHARACTER PACKC /STUFF IT IN JMP .-2 /GO BACK IF NOT DELETE /REMOVE OLD LINE, IF ANY /NOW THAT LINE IS FORMED, CHAIN IT INTO TEXT POINTERS TAD I LASTLN /GET PREVIOUS FORWARD POINTER DCA I PUTBASE /MAKE IT OURS TAD PUTBASE /GET OUR POINTER DCA I LASTLN /MAKE THEM POINT TO US NL0001 /GET ROUNDUP FACTOR TAD PUTNDX /GET CHARACTER COUNT CLL RAR /NOW WE HAVE WORD COUNT TAD PUTBASE /ADD ON BASE TO POINT TO FIRST FREE WORD DCA BUFFER /SAVE AS NEW BUFFER SPACE ISZ PUTBASE /BUMP TO LINE # SLOT TAD LINENO /PUT LINE # DCA I PUTBASE /INTO ITS SLOT TAD BUFFER /DESTROY DCA LASTV /VARIABLES JMP START2 /GO BACK FOR MORE CALMODE,PUSHJ /CALCULATOR OR IMMEDIATE MODE PROC /GO PROCESS DIRECT COMMAND TAD I PC /GET NEXT LINE (IF THEY SETUP ONE) SNA /END OF PROGRAM? JMP START2 /YES, RESTART COMMAND DRIVER JMP NXTLINE /NO, GO STARTUP NEXT LINE /BUFFER PACKING SUBROUTINE: "PACKC" XPACKC, 0 /PACK A CHARACTER ROUTINE SZA /TRYING TO DO ? ISZ XPACKC /NO, DO SKIP RETURN JMS I PUTHAF /DO REAL PACKING NOW ISZ PUTNDX /BUMP TO NEXT CHARACTER POSITION JMP I XPACKC /RETURN XLIST ON; IFZERO 1 < TEXT BUFFER LINE FORMAT: WORD 0: TEXT POINTER (0000 IF LAST) WORD 1: LINE NUMBER IN GGGGG.LLLLLLL FORMAT WORD 2 :TEXT IN P?S SIX-BIT STARTS HERE;LAST HALFWORD=00 IF OCCURS ON ODD BOUNDARY THEN LAST HALFWORD IS FILLED IN WITH A NON-ZERO (IGNORABLE GARBAGE) > XLIST ON /PHOCAL MODIFY COMMAND MODIFY, GETLINE /GET REQUESTED LINE # FINDLINE /LOCATE IT ERROR1 /NOT THERE TAD CHAR /\ TAD MCOMMA / >IS THERE A SECOND ARGUMENT? SZA CLA // JMP MRESET /NO, USE FIRST ONE GETC /BUMP PAST COMMA GETLINE /GET OUTPUT LINE # MRESET, TAD COMEND /SETUP BUFFER DCA PDLXR /PROTECTION TAD COMBEG /SETUP THE JMS I SETUP /BUFFER POINTERS SMATCH, NL7776 /INDICATE MODIFY IS CALLING READC /GET KEYBOARD INPUT JMP MRESET /<^U> HIT, RESET POINTERS AND RESTART PACKC /NOTHING SPECIAL, JUST PUT INTO BUFFER JMP SMATCH /KEEP GOING JMP MODENT / SEEN, FINISH UP CNTRLG, JMS I INPUT /GET SEARCH TEST ASCII CHARACTER MAKE6 /CONVERT TO P?S SIX-BIT SZL /ILLEGAL? JMP I PBDCHAR /YES CIA /INVERT CNTRLS, DCA SRCHAR /SAVE FOR TESTS LATER ISZ DBUGSW /PREVENT INADVERTENT ECHO CNTRLA, GETC /GET NEXT CHARACTER TAD CHAR /GET ITS VALUE SNA /? JMP SMATCH /YES, TAKE MORE USER INPUT NOW, LINE IS EXHAUSTED TAD SRCHAR /MATCH SEARCH CHARACTER? SNA CLA /SKIP IF NOT JMP SMATCH /JUMP IF SO JMS I P6CH /PRINT NON-DESCRIPT CHARACTER PACKC /PUT INTO OUTPUT BUFFER JMP CNTRLA /TRY NEXT COMBEG, INBEG /BEGINNING OF BUFFER COMEND, INEND+12 /END OF BUFFER + PROTECTION FUDGE SRCHAR, 0 /SEARCH CHARACTER RESTRT, RCOVER /RESTARTS THROUGH HERE PBDCHAR,BDCHAR /BAD CHARACTERS GO THERE PAGE /CHARACTER INPUT ROUTINE: "READC" XREADC, 0 /GET INPUT CHARACTER ROUTINE CMA /NOW HAVE 7777 UNLESS MODIFY CALLED (0001 FOR <^A>) DCA MODZAP /ENABLE/DISABLE MODIFY COMMANDS XRGNOR, JMS I INPUT /GET TTY: CHARACTER SORTJ /TEST IT FOR INCHRS-1 /SPECIAL INJMPS-INCHRS /CHARACTERS MAKE6 /CONVERT TO P?S SIX-BIT SZL /LEGAL CHARACTER? JMP BDCHAR /NO, GET ANOTHER ONE DCA CHAR /SAVE IT ISZ XREADC /BUMP TO GOOD RETURN CNTUENT,JMS I P6CH /PRINT IT JMP I XREADC /RETURN /READC DISPATCH TABLE INJMPS, RUBOUT / BKARRW / CNTRLU /<^U> CNTRLR /<^R> CNTRLA /<^A> IF MODIFY IS ACTIVE ONLY CNTRLG /<^G> IF MODIFY IS ACTIVE ONLY CNTRLK /<^K> IF MODIFY IS ACTIVE ONLY CNTRLS /<^S> IF MODIFY IS ACTIVE ONLY BDCHAR, TAD L7 /GET A JMS I OUTPUT /RING IT TAD INPUT /GET CURRENT POINTER DCA TXR1 /STASH IT JMP I TXR1 /GO TO TOP OF ROUTINE CNTRLU, TAD L36 /GET AN "^" JMS I P6CH /PRINT IT TAD L25 /GET A "U" JMS I P6CH /PRINT IT JMP CNTUENT /THEN , AND RETURN CNTRLK, TAD L4 /RESET DCA PUTNDX /OUTPUT CNTRLR, PUSHF /SAVE THE PC AND GETBASE /TEXT POINTERS NL7775 /-3 TAD PUTNDX /NOW HAVE CHARACTER COUNT CIA /INVERT FOR COUNTING DCA TEMP /SAVE IT TAD L4 /RESET DCA GETNDX /INPUT TAD PUTBASE /POINTERS DCA GETBASE /FOR DISPLAY SKP /DON'T DO IT YET ECHAGN, GETC /GET NEXT CHARACTER JMS I P6CH /PRINT IT ISZ TEMP /DONE ALL YET? JMP ECHAGN /NO, GO GET ANOTHER ONE POPF /RESTORE GETBASE /POINTERS JMP XRGNOR /BACK FOR MORE BKARRW, / COMES HERE RUBOUT, TAD PUTNDX /GET CURRENT OUTPUT COUNT TAD L7773 /BACK UP SPA CLA /ANYTHING THERE? JMP XRGNOR /NO, IGNORE IT STA /\ TAD PUTNDX / >BACK UP INDEX DCA PUTNDX // TAD L137 /GET A JMS I OUTPUT /PRINT IT JMP XRGNOR /GO GET ANOTHER /ASCII-P?S SIXBIT CONVERSION ROUTINE /CHARACTERS ARE CONVERTED AS FOLLOWS: / 000 NULL ILLEGAL / 001-010 CONTROL CHARS ILLEGAL / 011 TAB 37 / 012-014 CONTROL CHARS ILLEGAL / 015 RETURN 00 / 016-037 CONTROL CHARS ILLEGAL / 040-077 VALID ASCII 40-77 / 100 AT SIGN ILLEGAL / 101-136 VALID ASCII 01-36 / 137 BACK ARROW ILLEGAL / 140 ACCENT GRAVE ILLEGAL / 141-176 LOWER CASE 01-36 / 177 RUBOUT ILLEGAL /ILLEGAL CHARACTERS RETURN WITH LINK=1, AC=0 / LEGAL CHARACTERS RETURN WITH LINK=0, AC=CONVERTED CHAR XMAKE6, 0 /CONVERT 7-BIT TO P?S SIX-BIT SNA /GOT CHARACTER ALREADY? TAD CHAR /NO, GET ONE TAD L7700 /<100? SPA /NO, CHECK FURTHER FOR LETTERS, ETC. JMP MAKECR /YES, FILTER OUT ANYTHING WORTH KEEPING AND L37 /IGNORE CASE BITS SZA /AT SIGN OR ACCENT? TAD L7741 / (UNDERSCORE) OR ? SNA /SKIP IF OK JMP ILLEGL /JUMP IF BAD MAKTAB, TAD L37 /RESTORE TO SIX-BIT MAKEXT, CLL /INDICATE GOOD CHARACTER JMP I XMAKE6 /RETURN MAKECR, TAD L63 /? SNA /SKIP IF NOT JMP MAKEXT /JUMP IF YES TAD L4 /? SNA /SKIP IF NOT JMP MAKTAB /JUMP IF SO TAD L7752 /40-77? SMA SZA /SKIP IF NOT (BAD CONTROL CHARACTERS) JMP MAKTAB /RESTORE ILLEGL, STL CLA /INDICATE BAD RETURN JMP I XMAKE6 /RETURN IN SHAME /OUTPUT SETUP ROUTINE XSETUP, 0 /SETUP DCA PUTBASE /SET BASE TO PASSED VALUE TAD L4 /RESET INDEX TO DCA PUTNDX /FIRST TEXT WORD JMP I XSETUP /RETURN PAGE 26 /INTERRUPT SERVICE PUT HERE TO SAVE A PAGE ZERO LOCATION! AC, 0 /AC SAVED HERE INTER, DCA AC /SAVE AC RAR /GET LINK DCA LINK /SAVE ALSO TSF /TTY:? JMP KEY /NO, TRY KEYBOARD TCF /CLEAR FLAG NO MATTER WHAT ELSE STA CLL /BACKUP TAD NOWTTY /GET COUNTER DCA NOWTTY /DECREMENT IT SNL CLA /ANY MORE TO PRINT? JMP KEY /NO, BUFFER IS EMPTY TAD I TTYHEAD /GET NEXT CHARACTER TO PRINT TPC /GO PRINT IT NL4000 /INDICATE OUTPUT UPDATE JMS NXTSLT /BUMP THE TTYHEAD,TTYBUF /REMOVAL POINTER KEY, KSF /KEYBOARD? JMP OTHER /NO, TRY ANOTHER TAD L7600 /GET PARITY FORCED ON KRS /READ IT IN TAD L175 /COMPARE TO ^C SNA CLA /SKIP IF NOT JMP I L7600 /BOOTSTRAP KRB /READ IN ,CLEARING FLAG FOR OTHERS AND L177 /NO PARITY BITS,PLEASE SNA /NULL? JMP INTXIT /YES, IGNORE TAD L7760 /^P? SNA /SKIP IF NOT JMP RECOVER /JUMP IF SO TAD L20 /RESTORE CHARACTER ISZ NOWKEY /BUMP COUNTER DCA I KEYTAIL /PUT INTO BUFFER JMS NXTSLT /BUMP THE KEYTAIL,KEYBUF+1 /INSERTION POINTER TAD NOWKEY /GET CURRENT COUNT TAD L7760 /DID WE BLOW THE BUFFER? SMA SZA CLA /SKIP IF NOT ERROR1 /BARF OTHER, NOP /HOOK OTHER DEVICES IN HERE INTXIT, TAD LINK /GET THE LINK CLL RAR /PUT IT BACK TAD AC /RESTORE AC RMF /AND MEMORY FIELDS ION /AND INTERUPT JMP I 0 /BYE, BYE /TELETYPE OUTPUT ROUTINE TTYP, 0 /TTY: OUTPUT ION /MAKE SURE OF THIS HERE! TAD L200 /USE MARK STATE PARITY ISZ NOWTTY /CHECK IF EMPTY JMP TTYENQ /NOT SO TPC /PRINT IT YOURSELF CLA /CLEAN UP JMP I TTYP /RETURN TTYENQ, DCA I TTYTAIL /PUT INTO BUFFER NL4000 /INDICATE OUTPUT UPDATE JMS NXTSLT /BUMP THE TTYTAIL,TTYBUF /INSERTION POINTER TTYWAIT,NL0001 /ADD ONE FOR ORIGIN 0 TAD NOWTTY /GET THE COUNT TAD L7760 /COMPARE TO LIMIT SPA CLA /SKIP IF FULL JMP I TTYP /RETURN JMP TTYWAIT /WAIT UNTIL ROOM FOR OTHERS /TELETYPE INPUT ROUTINE TTYR, 0 /KEYBOARD READ STA CLA /SETUP FOR BACKING UP TAD NOWKEY /GET COUNTER SNL /SKIP IF SOME THERE JMP NULJOB /GO DO SOMETHING ELSE FOR A WHILE DCA NOWKEY /DECREMENT COUNT JMS NXTSLT /BUMP THE KEYHEAD,KEYBUF /REMOVAL POINTER TAD I KEYHEAD /GET THE CHARACTER JMP I TTYR /RETURN NXTSLT, 0 /BUFFER POINTER UPDATE SMA CLA /OUTPUT UPDATE? TAD L7760 /NO, INPUT UPDATE TAD TTYLIM /NOW HAVE CORRECT BUFFER LIMIT DCA POSEND /SAVE IT TAD POSEND /GET IT BACK CIA /INVERT FOR OTHERS DCA NEGEND /SAVE IT NL0001 /GET UPDATE FACTOR TAD I NXTSLT /GET CURRENT VALUE TAD NEGEND /AT LIMIT? SNA /SKIP IF NOT TAD L7760 /ADD ON BACKUP IF SO TAD POSEND /NOW HAVE CORRECTED VALUE DCA I NXTSLT /UPDATE POINTER ISZ NXTSLT /BUMP PAST POINTER JMP I NXTSLT /RETURN NULJOB, ION /MAKE SURE IF THIS HERE! ISZ FOO /BUMP TO NEXT TAD FOO /GET THE RESULT MQL /PUT IN SOME NICE LIGHTS LAS /GET ADDRESS SWITCHES DCA TTYP /SAVE IT TAD I TTYP /GET CORRESPONDING VALUE ISZ BAR /WAIT A WHILE JMP .-1 /SO IT CAN BE SEEN JMP TTYR+1 /KEEP GOING BAR, 0 /NULL TEMPORARY FOO, 0 /NULL TEMPORARY LINK, 0 /LINK STORED HERE POSEND, 0 /POSITIVE LIMIT HERE NEGEND, 0 /NEGATIVE LIMIT HERE TTYLIM, TTYEND /TTY BUFFER LIMIT NOWTTY, -1 /OUTPUT COUNT;-1 MEANS IDLE NOWKEY, 0 /INPUT COUNT;0 MEANS EMPTY KEYBUF, ZBLOCK 20 /KEYBOARD INPUT BUFFER KEYEND=. /END OF KEYBOARD BUFFER TTYBUF, ZBLOCK 20 /TELETYPE OUTPUT BUFFER TTYEND= . /END OF TELETYPE BUFFER IFNZRO KEYBUF-KEYEND+20 IFNZRO TTYBUF-TTYEND+20 /THESE ARE HERE TO PREVENT ASSEMBLY ERRORS UNTIL THIS /DAMNED THING IS DONE ! XPUSHA, 0 XPUSHF, 0 XPUSHJ, 0 XPOPF, 0 XPOPJ, 0 XGETC, 0 XSORTC, 0 XSORTJ, 0 XPRNTLN,0 XGETLN, 0 XFINDLN,0 XROL6, 0 XTESTC, 0 XTESTN, 0 XTSPACE,0 LPRTST, 0 GRPTST, 0 XDELETE,0 XERR, 0