File: VE.TK of Tape: Sources/Multi8/multi8-1
(Source file text)
/VE.TK 9-SEP-80 /EMULATOR FOR VENUS INPUT/OUTPUT VIA PDP8 /SERIAL INTERFACE. /THIS TASK IS USED TO CONNECT A VENUS TERMINAL /VIRTUALLY TO A USER TERMINAL. ONCE CONNECTED, THE TASK /IS UNACCESSABLE FOR OTHER USERS, UNTIL THE USER RETURNS /TO THE OS/8 MONITOR (JMP TO 07600). /THIS EMULATOR EMULATES ALL REASONABLE INSTRUCTIONS /WITH DEVICE CODE XX/YY / 6XX1 /SKIP IF INPUT FROM VENUS FLAG SET / 6XX2 /CLEAR INPUT FLAG / 6XX4 /CLEAR FLAG, READ INPUT CHAR. / 6XX6 /CLEAR FLAG, READ INPUT CHAR. / / 6YY1 /SKIP IF OUTPUT TO VENUS IS DONE / 6YY2 /CLEAR OUTPUT FLAG / 6YY4 /CLEAR FLAG, SEND CHAR TO VENUS / 6YY6 /CLEAR FLAG, SEND CHAR TO VENUS / /ALL OTHER IOTS WITH DEVICE CODE XX/YY ARE TREATED AS NOP. /CHARACTERS SEND TO THE VENUS ARE "DIRECTLY" EMULATED. /CHARACTERS RECIEVED FROM THE VENUS ARE STORED INTO /A CYCLIC BUFFER (400 LOCS) IN ORDER TO PREVENT OVERRUN /DUE TO HIGH BAUDRATE. /REMEMBER IT IS NOT ALWAYS POSSIBLE TO STOP OUTPUT FROM /THE VENUS-PROCESSOR. /IF OVERRUN OCCURS, THE THE NEXT CHARACTER TAKEN FROM THE /INPUT BUFFER (IOT 6XX4/6XX6) IS FLAGGED WITH AN ERROR BIT /(BIT 0), SO THE BG CAN TEST FOR THIS CONDITION. / XXIOT=VENUS&770;YYIOT=XXIOT+10 /DEVICE CODE=XX/YY / *0 /PUT "VE" IN EMTAB CDF 10 /EMTAB IS IN FLD 1 XXIOT%10+EMTAB "V^100+"E /"VE" *0 CDF 10 YYIOT%10+EMTAB "V^100+"E PAGE "V^100+"E /NAME IS "VE" 601 /3 PAGES, 1 CONNECT VENUSI /CONNECT "VENUSI" VENINP /TO VENINP FNCTAB, IFZERO VENUS&10 < VENOP /6XX0 IS NOP VESKP /6XX1 IS SKIP IF INPUT FLAG VECLR /6XX2 IS CLEAR FLAG VENOP /6XX3 IS NOP VEINP /6XX4 IS INPUT CHAR VENOP /6XX5 IS NOP VEINP /6XX6 IS INPUT CHAR VENOP /6XX7 IS NOP > VONOP /6YY0 IS NOP VOSKP /6YY1 IS SKIP ON FLAG VOCLR /6YY2 IS CLEAR FLAG VONOP /6YY3 IS NOP VOOUT /6YY4 IS OUTPUT CHAR VONOP /6YY5 IS NOP VOOUT /6YY6 IS OUTPUT CHAR VONOP /6YY7 IS NOP IFNZRO VENUS&10 < VENOP /6XX0 IS NOP VESKP /6XX1 IS SKIP IF INPUT FLAG VECLR /6XX2 IS CLEAR FLAG VENOP /6XX3 IS NOP VEINP /6XX4 IS INPUT CHAR VENOP /6XX5 IS NOP VEINP /6XX6 IS INPUT CHAR VENOP /6XX7 IS NOP > XINIT, VEINIT /INITIALIZE XBUF, VEBUF PUTPNT, VEBUF GETPNT, VEBUF INPCNT, 0 /FREE LOCS FOR INPUT CHARS / VE, JMS I XINIT //INIT, WILL BE SZL CLA JMP VEQUIT //USER WANTS TO QUIT TAD I VEUINS //EXAMINE INSTRUCTION AND C17 //GET CODE TAD (JMP I FNCTAB //MAKE INDIRECT JUMP DCA .+1 //EXECUTE INLINE JMP I FNCTAB / VOOUT, TAD (-DGNTICK JMS MONITOR /WAIT FOR OUTPUT READY WAIT VENUSO /TRANSMITTER AC0003 /READY OR TIMEOUT XXIOT+6005 /ENABLE INTERRUPT&ERRORS CLA CLL CDF 10 TAD I VEUAC //GET CHAR. YYIOT+6006 //SEND IT OVER VERET, DCA VENOUT //SET OR CLEAR OUT SWITCH VENOP, VONOP, JMS MONITOR //AND RETURN RETURN VOSKP, ISZ I VEUPC //UPDATE UPC JMP VONOP /SKIP IF CHARACTER IN INPUT BUFFER / VESKP, TAD INPCNT /SEE IF EMPTY TAD (400 SZA CLA JMP VOSKP /NOT EMPTY TAD VENOUT /DID USER USE VENUS OUT ? TAD I VEUFIN /DOES USER HAVE TYPE-IN ? SZA CLA JMP VERET /YES, BUT VENUS EMPTY JMS MONITOR STALL /WAIT A WHILE 1 CLA JMP VERET /TRY AGAIN / /INPUT A CHARACTER FROM THE BUFFER / VEINP, CDTOIF TAD INPCNT /NO:WAS THERE A CHARACTER ?? TAD (400 /-400 IS EMPTY SZA CLA JMP NOWAIT /YES, PROCES CHAR. TAD VECHR /GIVE BG LAST CHAR. JMP CHRPUT NOWAIT, CLA CMA /DECREMENT COUNT IOF /DON'T LET VENUS INTERFERE TAD INPCNT DCA INPCNT ION /INTRPT ON AFTER NEXT INSTR TAD I GETPNT /GET NEW CHAR. TAD ERRBIT /ADD ERROR BIT IF ANY CDF 10 DCA I VEUAC //STORE CHAR IN UAC TAD GETPNT //UPDATE PNTR IAC AND (377 //WRAP IF NECESSARY TAD XBUF DCA GETPNT DCA ERRBIT //CLEAR ERROR BIT JMP VENOP / VECLR, CDTOIF DCA I GETPNT JMP VEINP VOCLR, /CLEAR IS CLEAR AC CHRPUT, CDF 10 DCA I VEUAC //TO USER AC JMP VENOP / VEQUIT, JMS MONITOR //SWAP OUT RETURN CLEAR SWPOUT /VENUS CAUSES AN INTERRUPT / VENINP, XXIOT+6006 ///CLEAR,READ CHAR. DCA VECHR ///SAVE TEMP. TAD INPCNT ///SEE IF THERE IS SPACE SNA JMP INPERR ///NO SPACE IAC DCA INPCNT ///UPDATE COUNT TAD VECHR ///GET CHAR. DCA I PUTPNT ///TO BUFFER TAD PUTPNT ///UPDATE PNTR IAC AND (377 TAD XBUF DCA PUTPNT JMP INPRET INPERR, CLA CLL CML RAR ///SET ERROR BIT TO 4000 DCA ERRBIT INPRET, CIF CDF 00 /// JMP I ZFSTEXT ///EXIT VECHR, 0 /TEMP. VEUAC, X /WILL BE INITIALIZED VEUINS, X /WILL BE INITIALIZED VEUPC, X /WILL BE INITIALIZED VEUFIN, X /WILL BE INITIALIZED ERRBIT, 0 /4000 IF OVERRUN VENOUT, 1 /OUTPUT SWITCH PAGE /THIS PAGE IS USED ONCE FOR INITIALIZING, THEN /IT IS USED FOR BUFFER SPACE. / VEBUF, VE XVEUAC, VEUAC XVEUIN, VEUINS XVEUPC, VEUPC XVEUFI, VEUFIN XVECNT, INPCNT VEBASE, 0 /0 VEINIT, 0 /INITIALIZE SOME POINTERS DCA VEBASE TAD VEBASE CDTOIF TAD (UAC DCA I XVEUAC /SET VEUAC TAD VEBASE TAD (UINST DCA I XVEUIN /SET VEUINS TAD VEBASE TAD (UPC /SET VEUPC DCA I XVEUPC TAD VEBASE TAD (UBUFIN DCA I XVEUFI /SET UBUFIN TAD (SZL CLA DCA I VEBUF /CHANGE JMS INIT TAD C7400 /OPEN INPUT DCA I XVECNT TAD VEBASE TAD (UASEM-1 /FIND FREE UASEM ENTRY DCA ZTEM1 VEUALP, CDF 10 ISZ ZTEM1 TAD I ZTEM1 /SEARCH SNA /IS IT FREE ? JMP VEUAFR /YES CIA TAD VENAME /IS IT MY NAME ? SZA CLA JMP VEUALP /NO, SEARCH VEUAFR, TAD VENAME DCA I ZTEM1 /STORE NAME ISZ VEINIT /SKIP OVER JMP VEQUIT JMP I VEINIT /RETURN VENAME, "V^100+"E&3777 PAGE ZBLOCK 200 /BUFFER SPACE $$$$