*20 / / / F P P S U P P O R T P A C K A G E. / / COPYRIGHT 1971, / DIGITAL EQUIPMENT CORPORATION, / 146 MAIN STREET, / MAYNARD, MASSACHUSSETTS. / 01754 / / / THIS IS THE USER SUPPORT PACKAGE FOR THE FLOATING / POINT HARDWARE FOR THE PDP-12 [COMMONLY / KNOWN AS THE "FPP"]. / / WRITTEN BY JACK BURNESS. / / / / / / / FPPOLD=. /SAVE THE CURRENT LOCATIONS AS WE ARE /TEMPORARILY GOING TO CHANGE THE PC. / / / ORG 0 /SET UP COMMUNICATIONS POINTERS. / 0 /FOR INTERUPTS. JMP I .+1 /ON INTERUPT [OR PHONEY INTERUPT] FPPINT /GO AND SEE WHATS HAPPENING. FPPXXX /USERS ADDITIONAL VECTORS. FPPCTL /POINTER TO FPP SUPPORT OVERLORD. FPPTAB /POINTER TO FPP PARAMETER TABLE. / / / / / / / ORG 200 /ORIGIN AT LOCATION 200 / / / IFREF FPPORG /IF FPPORG IS DEFINED, ORIGIN IT THERE. / / ORG FPPORG / / / $ / / / / PAGE /MUST BEGIN ON AN EVEN PAGE BOUNDRY. / / / / / / FPPCTL, 0 /FPP OVERLORD COMMAND DISPTACHER. CLA /CLEAR THE AC TO BE SURE. TAD I FPPCTL /PICK UP FUNCTION. ISZ FPPCTL /SKIP PAST FUNCTION. AND (17 /ONLY USE BITS 8-11 TO GET FUNCTION. TAD FPPJMP /CREATE THE CORRECT JUMP INSTRUCTION. DCA .+1 /SAVE AWAY. 0 /AND NOW DISPATCH. / FPPJMP, JMP I .+1 /PROTOTYPE INSTRUCTION. / FPPPCS /0=SET FPP P.C. IN PARAMETER TABLE. FPPDV0 /1=SET DIVIDE BY 0 EXIT. FPPOVR /2=SET EXPONENT OVERFLOW EXIT. FPPUND /3=SET EXPONENT UNDERFLOW EXIT. FPPFRO /4=SET FRACTION OVERFLOW EXIT. FPPTRP /5=SET INSTRUCTION TRAP EXIT [EXCEPT TRAP 7]. FPPEXT /6=SET FPP EXIT EXIT [THE COMMONLY USED CONDITION.] FPPIOT /7=SET FPP IOT EXIT. FPPSRT /10=START FPP RUNNING. FPPCLR /11=CLEAR FPP AND OWN I-O SYSTEM. FPPTTY /12=SET FPP CHARACTER RECEIVED EXIT. FPPFAL /13=SET FPP FAIL TO START EXIT. FPPKNO /14-17=NOT USED. FPPKNO FPPKNO FPPKNO / / / / / FPPKNO, CLA /CLA NECESSARY BECUASE FPPSRT NEEDS IT. JMP I FPPCTL /EXIT IF NOT A LEGAL COMMAND. / / / / / FPPPCS, TAD FPPTAB+1 /SET FPP P.C. AND (7770 /ZERO OUT HIGH ORDER BITS OF PC IN TABLE DCA FPPTAB+1 JMS FPPARG /GET FIRST ARGUMENT OF CALL. AND (7 /REMOVE EXTRANEOUS GARBAGE. TAD FPPTAB+1 /AND ADD IN OTHER FACTS. DCA FPPTAB+1 /AND STORE BACK. JMS FPPARG /NOW GET LOW ORDER BITS OF P.C. DCA FPPTAB+2 /AND STORE AWAY. JMP I FPPCTL /AND RETURN NOW. / / / FPPDV0, JMS FPPRET /SET UP DIVIDE BY 0 RETURN. FPPDER / FPPOVR, JMS FPPRET /AND OVERFLOW RETURN. FPPOER / FPPUND, JMS FPPRET /AND UNDERFLOW RETURN. FPPUER / FPPFRO, JMS FPPRET /AND FRACTIONAL OVERFLOW RETURN. FPPFER / FPPTRP, JMS FPPRET /AND TRAP RETURN. FPPTER / FPPEXT, JMS FPPRET /AND FEXIT RETURN. FPPEER / FPPIOT, JMS FPPRET /AND IOT EXIT RETURN. FPPIER / / FPPSRT, TAD FPPTAB /PREPARE TO START FPP RUNNING. FPCOM /LOAD COMMAND REGISTER NOW. CLA /CLEAR AC BECAUSE OF FEEBLE CONTROLLER. TAD (FPPTAB+1 /GET ADDRESS OF ACTIVE PARAMETER TABLE. FPST /START FPP RUNNING. SKP CLA /IT DIDN T START. CLEAR AC BECAUSE OF FEBBLENESS. JMP FPPKNO /IT DID. EXIT THIS WAY BECAUSE OF FEEBLE CONTROLLER. JMS I FPPLER /FPP FAILED TO START. TAKE FAILING EXIT. CLA /HE RETURNED. CLEAR AC TO BE SURE. JMP FPPSRT /AND RETRY NOW. / / / FPPLER, .+1 /INITIALLY POINTS TO DUMMY ROUTINE. / 0 FPICL /DO A CLEAR ON THE FPP. THEN RETRY JMP I FPPLER+1 /BY RETURNING. / / FPPCLR, FPICL /A CLEAR COMMAND. CLEAR FPP FIRST. TAD (2400 DCA FPPTAB /RESET STATUS REGISTER. JMS I FPPOOO /MJOR BUFFER RESETER. JMP I FPPCTL /AND RETURN NOW. / FPPOOO, .+2 /DUMMY POINTER TO NOTHING ROUTINE IN CASE .+1 /I-O IS NOT LOADED. / 0 JMP I .-1 / REAL DO NOTHING ROUTINE. / / / / FPPTTY, JMS FPPRET /ESTABLISH TTY CHARACTER RETURN. FPPOOO+1 /WHERE TO PUT TTY POINTER. / / FPPFAL, JMS FPPRET /FAIL TO START POINTER FPPLER / / FPPRET, 0 /ROUTINE WHICH SETS UP POINTERS FOR DIFFERENT CALLS. TAD I FPPRET /GET WHERE TO STICK POINTER. DCA FPPRET /AND SAVE JMS FPPARG /GET THE USERS POINTER NOW. DCA I FPPRET /AND STASH IT AWAY CORRECTLY. JMP I FPPCTL /AND RETURN TO THE USER. / / FPPARG, 0 /GETS A USERS ARGUMENT. TAD I FPPCTL /GET HIS ARGUMENT ISZ FPPCTL /AND BOP UP THE POINTER. JMP I FPPARG /AND RETURN TO THE USER NOW. / / / / / / / / / / / / FPPDUT, 0 /ROUTINE TO DISPATCH TO CORRECT USER ADDRESS. CLA /CLEAR THE AC TO BE SURE. TAD I FPPDUT /GET THE POINTER. DCA FPPDUT /AND SAVE AWAY. JMS I FPPDUT /CALL THE CORRECT ROUTINE NOW. / / FPPOUT, CLA CLL /EXIT FROM INTERUPT ROUTINE. AC CAN BE NON-ZERO. TAD 3 /GET USERS INTERUPT VECTOR. DCA FPPDUT /SAVE FOR A SECOND. TAD FPPMQ /RESOTRE THE MQ. 7421 /MQL. LOAD MQ FROM AC. CLEAR AC. TAD FPPLNC /GET THE LINC. CLL RAL /AND RELOAD IT. TAD FPPAC /FINALLY RELOAD THE AC. JMP I FPPDUT /AND EXIT TO WHERE EVER WE HAVE TO. / / / / / FPPXXX, JMP I 0 /PHONEY EXIT INCASE USER WANTS TO SUPPLY ONE. / / / / / / / / / / MAJOR FIXED LOCATIONS WITH RESPECT TO "FPPTAB" / / / FPPMQ, 0 /HOLDS MQ DURING INTERUPT. FPPLNC, 0 /HOLDS LINC DURING INTERUPT. FPPAC, 0 /HOLDS AC DURING INTERUPT. / 0 /STATUS OF FPP AFTER AN INTERUPT. / FPPTAB, 2400 /FPP CPMMAND REGISTER. 0 /FPP EXTENED BITS REGISTER. 0 /FPP P.C. LOW ORDER REGISTER. 0 /LOW ORDER BITS OF LOCATION OF INDEX 0. 0 /LOW ORDER BITS OF BASE REGISTER. 0 /LOW ORDER BITS OF OPERAND. 0 /EXPONENT OF AC. 0 /HIGH WORD OF AC. 0 /LOW WORD OF AC. / / / / / / PAGE / / / / / / FPPINT, DCA I (FPPAC /FPP INTERUPT PRCESSOR. SAVE AC. RAR DCA I (FPPLNC /AND LINC 7701 /MQA. GET THE MQ INTO THE AC FOR SAVING. DCA I (FPPMQ /AND SAVE THE MQ. JMS I FPPITS /CHECK FOR OTHER SUPPORT PACKAGE DEVICES. FPIST /IS IT THE FPP? JMP I (FPPOUT /NOPE. CONTINUE. DCA I (FPPTAB-1 /YEP. SAVE THE STATUS NOW. CLA CLL CML RAR /TURN ON THE DOUBLE MODE BIT. AND I (FPPTAB-1 /AND LEAVE IT ON IF IN DOULB E MODE. TAD (2400 /PUT ON CORRECT COMMAND MODE BITS. DCA I (FPPTAB /AND STASH AWAY. TAD I (FPPTAB-1 /RETREIVE STATUS AND TEST. RTL /ROTATE TO LINC AND SIGN. SZL /TEST FOR INSTRUCTION TRAP JMP FPITRP /ITS AN INSTRUCTION TRAP. SPA /TEST FOR IOT EXIT. JMP FPIOTT /ITS AN IOT EXIT. RTL /ROTATE NEXT TWO BITS OVER. SZL /TEST FOR DIVIDE BY 0. JMP FPDIV0 /ITS A DIVIDE BY 0. SPA /TEST FOR FRACTION OVERFLOW. JMP FPFRCO /ITS A FRACTION OVERFLOW. RTL /GET THE NEXT TWO BITS. SZL /TEST FOR EXPONENT OVERFLOW JMP FPEXOV /ITS AN EXPONENT OVERFLOW SPA CLA /TEST FOR UNDERFLOW. JMP FPEXUD /ITS AN EXPONENT UNDERFLOW. / JMS I (FPPDUT /ITS NONE OF THESE. THEN ITS AN "FEXIT". FPPEER, FPPOOO+2 /ON EXIT DO NOTHING, JUST RETURN IF THIS IS NOT OVERLAYED. / / / FPEXUD, JMS I (FPPDUT /UNDERFLOW EXIT. FPPUER, .+1 /OVERLAYED BY COMMAND DECODER IF CALLED. / 0 /ROUTINE TO FIX UP UNDERFLOWS. DCA I (FPPTAB+6 /ZERO OUT THE FPP FAC. DCA I (FPPTAB+7 DCA I (FPPTAB+10 JMP FPPIST /AND NOW START FPP GOING AGAIN. / / FPFRCO, JMS I (FPPDUT /FRACTIONAL OVERFLOW FROCESSOR. FPPFER, .+1 /NO OVERLAYED RETURN(AS USUAL). / 0 /FRACTIONAL OVERFLOW FIXER-UPPER. CLA CLL CML RAR /TURN ON HIGH ORDER BIT OF AC [SIGN BIT]. AND I (FPPTAB+7 /LEAVE ON IF AC WAS NEGATIVE. SMA /WAS IT ON? CLA CLL CMA RAR /NOPE. SET TO A BIG NUMBER. DCA I (FPPTAB+7 /AND STORE AWAY. SZL /IF THE LINC IS ZERO IT SHOULD BE NEGATIVE. CMA /IF ONE IT IS POSITIVE. DCA I (FPPTAB+10 /AND NOW SAVE AWAY AS LOW ORDER WORD. JMP FPPIST /AND THEN START FPP GOING AGAIN. / / / FPDIV0, JMS I (FPPDUT /A DIVIDE BY 0. FPPDER, FPPOER+1 /SET TO BIGGEST NUMBER [SAME AS EXPONENT OVERFLOW]. / / / / / / FPIOTT, JMS I (FPPDUT /ITS AN IOT EXIT. FPPIER, .+1 /IOT EXIT POINTER. INITIALLY POINTS TO NEXT ROUTINE. / 0 /THIS ROUTINE JUST RESTARTS THE FPP. JMS I 4 /CALL THE COMMAND DECODER. 10 /START CODE. JMP I FPPIER+1 /AND RETURN NOW. / / / / FPITRP, CLA CLL CMA RAL /ITS A TRAP. BACK UP PC NOW. TAD I (FPPTAB+2 /GET THE PC. DCA FPPIER+1 /SAVE FOR A SECOND. SZL /DID IT CHANGE FIELDS. CMA /YES. BACK UP THE FIELD ALSO. TAD I (FPPTAB+1 /GET THE FIELD BITS. RTL RAL /ROTATE INTO A DESIRABLE POSITON. AND (70 /CHOP OFF CRAP. TAD FPPCDF /CREATE THE CORRECT CDF INSTRUCTION. DCA .+1 /STORE AWAY, BUBBY. 0 TAD I FPPIER+1 /GET THE FPP TRAP INSTRUCTION. FPPCDF, CDF 0 /RESET TO THIS FIELD. SPA CLA /IF ITS OURS [3XXX] THEN AC IS POSITIVE. JMP FPPTTT /NOPE. LET USER TAKE CARE OF IT. TAD I (FPPTAB+1 /GET THE OPERAND FIELD BITS. RTR RTR RTR AND (70 /ROATE TO A GOOD PLACE AND CHOP OFF CRAP. TAD (6203 /MAKE IT A GOOD CIF-CDF DCA .+2 /SAVE AWAY. TAD I (FPPTAB+5 /GET OPERAND ADDRESS. 0 /SET TO CORRECT FIELD. DCA FPPIER+1 /SAVE AWAY ADDRESS. JMS I FPPIER+1 /AND GO TO IT. / FPPIST, CLA /CLEAR AC ON RETURN TO BE SURE. JMS FPPIER+1 /RESTART FPP. JMP I (FPPOUT /AND EXIT. / / / FPPTTT, JMS I (FPPDUT /USER TRAP. FPPTER, FPPIER+1 /ON TRAP JUST RESTART IT. / / / / FPEXOV, JMS I (FPPDUT /EXPONENT OVERFLOW. FPPOER, .+1 /SYSTEM FIXER-UPPER / 0 /COME HERE IF HE WANTS US TO HANDLE OVERFLOW. CLA CLL CMA RAR /SET THE EXPONENT DCA I (FPPTAB+6 /TO A MAXIMUM JMS FPPFER+1 /AND THEN FAKE OUT FRACTIONAL OVERFLOW TO DO THE REST. / / / / / / FPPITS, FPPOOO+2 /PHONEY TTY CHECKER UNTIL OVERLAYED. / / / / / / / / / / / / / / / / / / / PAGE / / / / / IFREF BUFFER / / / / / / B U F F E R E D - I \ O R O U T I N E S / - - - - - - - - - - - - - - - - - - - - / / / / / / / COPYRIGHT 1971 / DIGITAL EQUIPMENT CORPORATION / 146 MAIN STREET, / MAYNARD, MASSACHUSSETTS. / 01754 / / / / WRITTEN BY JACK BURNESS. / / / / / / / / / / / / / / FPP INPUT AND OUTPUT BUFFERRING ROUTINES. / / / COPYRIGHT 1971 / DIGITAL EQUIPMENT CORPORATION / MAYNARD, MASS. / 01754 / / / WRITTEN BY JACK BURNESS. / / / / / / / / PAGE /ORIGIN PAST PREVIOUS LITTERALS. / / / / / / / / / / BUFFER=. /SAVE ORIGIN FOR LATER. / / / ORG FPPOOO / GTREST /ADDRESS OF CLEAR / / ORG FPPITS /OVER ITERUPT VECTOR. / GTGTGT /TO INTERUPT ROUTINE / / / / ORG BUFFER /RESOTRE OLD ORIGIN. / / / / / GETCCC, 0 /AFTER TRAP COMES HERE. TAD I GETCPP /GET A CHARACTER. DCA I GETFPP /STORE IN THE FPP AC. CLA CMA /DECREMENT THE CHARACTER COUNT. TAD GTCUNT DCA GTCUNT TAD I GETCPP /GET THE LAST CHARACTER. TAD I (GTM215 /WAS IT A CARRIAGE RETURN. SZA CLA JMP .+4 /NO. NOTHING SPECIAL. CLA CMA /YES. DECREMENT NUMBER TAD GTLN /OF CARRIAGE RETURNS IN BUFFER. DCA GTLN JMS I (GPPBOP /NOW BOP UP CHARACTER POINTER. GETCPP, GPLOW /POINTER TO NEXT CHARACTER TO GET. JMP I GETCCC /AND RETURN TO RESTART FPP. / / / / 27 /EXPONENT FOR FIXED GTLN 0 GTLN, 0 /IF YOU REMEMBER, GTLN WAS NUMBER OF C.R.S IN BUFFER. GTCUNT, 0 /NUMBER OF CHARACTERS IN BUFFER. GTMAX, GPLOW-GPHIGH-1 /-MAXIMUM NUMBER OF CHARACTERS IN BUFFER. GTTCAR, 0 /LAST CHARACTER TYPED IN. GTRUBS, 0 /WHETHER OR NOT WE RE RUBBING OUT. GPPRST, GPLOW /FOR RESETING BUFFER POINTERS WITH VIRGIN STUFF. / / / / GTREST, 0 /THIS RESETS ALL POINTERS IN CASE OF RESTART. DCA GTCUNT DCA GTLN DCA GTRUBS TAD GPPRST DCA GETCPP TAD GPPRST DCA I (GPPONT JMS I (PUREST /RESET OUTPUT NOW. JMP I GTREST /RETURN. ALL IS DONE. / / / / / / / / / / / / / GTTEST, 0 /THIS ROUTINES CHECKS KSF /AND GETS A CHARACTER FFROM THE TTY JMP I GTTEST /NO CHARACTER, RETURN. KRB /YES, ITS A CHARACTER. READ IT IN. AND GT177 /CHOP OFF STUFF. TAD GT200 /AND PUT IT BACK ON. DCA GTTCAR /FINALLY SAVE IT AWAY. TAD I GTTGOT /SET UP THE CHECKER. DCA GTREST /AND SAVE FOR A SECOND TAD GTTCAR /RECALL THE CARACTER. JMS I GTREST /GO DO THE SUBROUTINE NOW. SKP CLA /ALL IS WELL. JMP GTTCLA /DONT PROCESS THIS CHARACTER. TAD GTTCAR /PROCESS THIS CHARACTER. TAD I (GTM215 /IS IT A CARRIAGE RETURN? SNA JMP GTMCRF /YEP. TAD GTM10 /NOPE. HOW ABOUT A CONTROL U <^U>? SNA JMP I (GTMDEL /YEP. DELETE THE LINE. TAD GTM152 /NOPE. HOW ABOUT A RUBOUT. SNA CLA JMP GTMRUB /YEP. DELETE ONE CHARACTER. TAD GTTCAR /RECALL THE CHARACTER. JMS I (GPPUTI /INSERT IT IN THE BUFFER. TAD GTRUBS /CHECK THE SWITCH. SNA CLA JMP GTTRPS /RUBOUTS NOT ON NOW. DCA GTRUBS /RUBOUTS ON. TURN THEM OFF. TAD GT334 /SEND OUT A FORM CHARACTER. JMS GTPRT /BYE BYE. / GTTRPS, TAD GTTCAR /RECALL THE CHARACTER. JMS GTPRT /SEND IT OUT. GTTCLA, CLA /CLA EXIT. JMP I GTTEST /RETURN NOW TO NORM STRUCTURE. / / / / / / / / / / / / / GTPRT, 0 /THIS ROUTINE TYPES OUT A CHAR IF PUT IS CLEAR. DCA I (GTBACK /SAVE CHARACTER FOR A SECOND. TAD I GPUCUNT /GET OUTPUT COUNT. TAD I GPUMOST /CHECK AGAINST UPPER LIMIT. SNA CLA /HOW ABOUT IT. JMP I GTPRT /ITS BUSY. DONT WAIT FOR IT. TAD I (GTBACK /RECALL MY CHARACTER. JMS I GPUTMY /PRINT IT. JMP I GTPRT /AND RETURN. / / / / / / / GTMCRF, ISZ GTLN /BOP UP NUMBER OF LINES ON A C.R. TAD GT215 /PLACE A CARRIAGE RETURN IN THE BUFFER. JMS I (GPPUTI /BY CALLING THIS ROUTINE. / GTEXXT, CLA /THIS RUTINE TERMINATES A TYY LINE. TAD GTRUBS /ARE WE DOING RUBOUTS? SNA CLA /? JMP .+4 /NOPE. DCA GTRUBS /YEP. CLEAR OUT FLAG. TAD GT334 /THEN TYPE A FORM. JMS GTPRT TAD GT215 /THEN PRINT A C.R. L.F. JMS GTPRT /ON THE TELETYPE. TAD GT212 JMS GTPRT /OUT GOES THE LINE FEED. JMP I GTTEST /AND RETURN / / / / / GTMRUB, TAD GTRUBS /CHECK THE RUBOUT FLAG. SZA CLA JMP GTMRB2 /DON T FUDGE UP MULTIPLE RUBOUTS. ISZ GTRUBS /SET RUBOUT FLAG. TAD GT334 /PRINT A LEADING SLASH. JMS GTPRT / GTMRB2, JMS I (GTBACK /BACK UP ONE CHARACTER. SPA SNA /ANY THERE? JMP GTEXXT /NOPE. JMS GTPRT /YEP. PRINT IT. JMP I GTTEST /AND EXIT / / / / / / / / / GPPFUL, TAD GT207 /RING BELL IF INPUT BUFFER FULL. JMS GTPRT JMP I GTTEST /AND EXIT FROM THIS ROUTINE. / / / / / GT177, 177 GT200, 200 GTM10, -10 GTM152, -152 GT334, 334 GT215, 215 GT212, 212 GT207, 207 GPUCUNT,PUCUNT GPUMOST,PUMOST GPUTMY, PUTMY GETFPP, FPPTAB+10 GTTGOT, FPPOOO+1 / / / / / / / PAGE / / / / / / / / GTMDEL, JMS GTBACK /BACK UP ONE CHARACTER, SMA SZA CLA /UNTIL THE END OF LINE HAS BEEN REACHED. JMP .-2 /LOOP IF NOT DONE JMP I (GTMRUB /WHEN DONE, SIMULATE ONE RUBOUT CHARACTER. / / / / / / / / / / / / / / / / / GPPUTI, 0 /THIS ROUTINE PUTS A CHARACTER IN THE BUFFER. DCA I (GTPRT /SAVE FOR SECOND. TAD I (GTCUNT /TEST THE COUNT TAD I (GTMAX /AGAINST MAXIMUM ALLOWED. SNA CLA /TOOOO BIIGGG? JMP I (GPPFUL /YEP. RETURN WITHOUT STICKING IT IN. TAD I (GTPRT /RECALL THE CHARACTER DCA I GPPONT /STICK IT IN. ISZ I (GTCUNT /BOP THE COUNTER. JMS GPPBOP /AND BOP THE POINTER GPPONT, GPLOW /INITIAL WALUE. JMP I GPPUTI /AND THEN EXIT. / / / / / / / / / / / GPPBOP, 0 /POINTER BOPPER. ISZ I GPPBOP /BOP THE POINTER. TAD I GPPBOP /GET THE POINTER. TAD GPPUPL /CHECK AGAINST THE LIMIT. SZA CLA /OK? JMP GPPBEX /YEP. EXIT TAD I (GPPRST /RESET THE POINTER DCA I GPPBOP GPPBEX, ISZ GPPBOP /BOP OVER ARGUMENT JMP I GPPBOP /AND RETURN. / / / / / / / / / / GTBACK, 0 /THIS ROUTINE BACKS UP THE BUFFER CLA CMA /BOP DOWN THE COUNT TAD I (GTCUNT SPA /IF YOU CAN, THAT IS! JMP I GTBACK /ELSE RETURN. DCA I (GTCUNT /STORE BACK CORRECT COUNT. CLA CMA /BOP DOWN THE INPUT POINTER ALSO. TAD GPPONT DCA GPPONT TAD GPPONT /TEST FOR LOWER END WRAP ARAOUND. TAD GPTST1 /-LOWER BUFFER-1 SZA CLA /TOO FAR? JMP .+3 /NOPE. TAD GPRST1 /YEP. RESET POINTER. DCA GPPONT TAD I GPPONT /RECALL THE OLD CHARACTER. TAD GTM215 /IS IT A CARRIAGE RETURN? SNA CLA JMP GPRINS /YEP. TAD I GPPONT /NOPE. REFETCH CHAR AND RETURN. JMP I GTBACK / GPRINS, TAD I (GT215 /TOO FAR. STICK C.R. BACK IN. JMS GPPUTI JMP I GTBACK /AND EXIT NOW. / / / / / / / / / / / / NECESSARY CONSTANTS AND VALUES. / / / GTM215, -215 GPRST1, GPHIGH GPTST1, -GPLOW+1 GPPUPL, -GPHIGH-1 / / / / / / / / / / / / / / / / / / / / / / / / / PUTMY2, 0 /THIS SHALL GET THE CHARACTER. TAD I (FPPTAB+10 /GET THE CHARACTER. JMS PUTMY /AND SEND IT OUT JMP I PUTMY2 /AND RETURN. / / / / PUTMY, 0 DCA GTBACK /SAVE FOR A SECOND. TAD PUCUNT /CHECK THE COUNT. TAD PUMOST SNA CLA JMP PUBUSY /ITS STILL FULL. DELAY. TAD GTBACK /RECALL THE CHARACTER. DCA I PUPUNT /SAVE IN BUFFER ISZ PUCUNT /BOP THE COUNT. JMS PUTEST /TEST ALL FLAGS. JMS PUBOP /BOP MY POINTER. PUPUNT, PULOWER JMP I PUTMY /AND RETURN. / / PUBUSY, JMS I 4 /RESET FPP PC 0 JA PUTDLY /TO A DO NOTHING ROUTINE. JMP I PUTMY /AND RETURN FOR NOW. / PUBOP, 0 TAD I PUBOP /GET THE POINTER. TAD PUUPTS /CHECK THE UPPER LIMIT. SNA TAD PURST /ITS THERE RESET TAD PUFUDGE /AND STORE BACK AFTER CRRRECTING. DCA I PUBOP /AWAY IT GOES. ISZ PUBOP /BOP PAST THE ARG. JMP I PUBOP /AND RETURN / / / / / PUCUNT, 0 PUMOST, PULOWER-PUUPPER-1 PUUPTS, -PUUPPER PURST, PULOWER-PUUPPER-1 PUFUDGE,PUUPPER+1 PUFLAG, 0 / / / / / PUTEST, 0 TSF /READY JMP .+3 /NOT NOW. TCF /CLEAR IT DCA PUFLAG /AND RECARD SAID FACT. TAD PUCUNT /TEST BUFFER SNA CLA JMP I PUTEST /EXIT ON NO CHARS. TAD PUFLAG /TEST TTY FLAG SZA CLA JMP I PUTEST /EXIT IF NOT READY. TAD I PUPONT /GET A CHARACTER TLS /OUTPUT IT. CLA CMA /BOP DOWN THE COUNT TAD PUCUNT DCA PUCUNT ISZ PUFLAG /RESET FLAG. JMS PUBOP /AND BOP THE POINTER. PUPONT, PULOWER JMP I PUTEST / / / / / / / / / / / PUREST, 0 TAD PUPUNT DCA PUPONT DCA PUCUNT DCA PUFLAG /TURN OFF ALL FLAGS. JMP I PUREST / / / / / / / / / / / / / / / / PAGE / / / / / / / / / / GTTEST PUTEST / GTGTGT, 0 JMS I GTGTGT-1 /CHECK BOTH BUFFERS JMS I GTGTGT-2 /THEN EXIT WHEN DONE. JMP I GTGTGT / / / / / GETC, JA . /THIS ROUTINE GETS A CHARACTER FROM THE TTY BUFFER. FLDA GTLN-2 /GET NUMBER OF LINES IN BUFFER. JEQ GETC+2 /IF NO LINES IN BUFFER LOOP. TRAP3 GETCCC /IF THERE ARE CHARACTERS THERE, FNORM /GET ONE BY TRAPPING AND BRING IT OUT. JA GETC /THEN RETURN WITH THE CHARACTER IN THE AC. / / / / / / / / / / PUTC, JA . /THE ROUTINE TO PUT A CHARACTER IN THE BUFFER. ALN 0 /FIX THE CHARACTER. PUTLOP, TRAP3 PUTMY2 /TRAP OUT NOW JA PUTC /AND EXIT WHEN DONE. / / / / / PUTDLY, LDX -1000,0 /THIS ROUTINE DELAYS IF NECESSARY. JXN .,0+ /BECAUSE THIS WILL LEAVE THE FPP RUNNING. JA PUTLOP /WHEN DONE, WE WILL TRAP AGAIN. / / / / IOOUTW, JA . /THIS WAITS FOR ALL OUTPUT TO BE FINISHED. STARTD FLDA PUCUNT-1 /GET NUMBER OF CHARACTERS TO DO. ATX 0 /PLACE IN AN INDEX. STARTF /IN FLOATING MODE AGAIN. JXN IOOUTW+2,0 /WAIT IF NOT DONE. JA IOOUTW /EXIT IF OK. / / / / / / / / / / / / / GPLOW=. / PAGE / GPHIGH=.-1+13 / PULOWER=GPHIGH+1 / PUUPPER=.+177 / / / / 0 / / PAGE / / / / / / / $ / / / / / / / / IFPOS FPPOLD-. /FIND OUT WHERE WE ARE. / ORG FPPOLD /IF WE DON T OVERLAP, ORIGIN WHERE WE LEFT OFF. / $ / / / / / / CHAIN "FPPLB1S"1