File: LE.TK of Disk: V50/Multi8/Multi-1
(Source file text)
/LE.TK 9-JUN-80 /**UASEM VERSION** / IOTS ARE EMULATED AS FOLLOWS: / 6000 :BACKUP PC, EXIT FROM EMULATOR / 6660 :OVERLAYED BY A PERMANENT NOP / 6570 :OVERLAYED BY A PERMANENT SKIP / 6XY1 :OVERLAYED BY A PERMANENT SKIP / 6XY2 :OVERLAYED BY A PERMANENT NOP / 6XY3 :OVERLAYED BY A PERMANENT NOP / 6XY4 :SEND CHARACTER / 6XY5 :OVERLAYED BY A PERMANENT NOP / 6XY6 :SEND CHARACTER / 6XY7 :OVERLAYED BY A PERMANENT NOP / 6000 :SEND ONE BUFFER (USED BY FAKE HANDLER) /AS COMPARED TO THE VERSION 6 LINEPRINTER EMULATOR, /THE FOLLOWING DIFFERENCES SHOULD BE NOTED: /* THE PATCHING OF 6661 ETC. IS NO LONGER / DONE BY LE, BUT IS LEFT TO / THE CENTRAL EMULATOR. PATCHING IS / SIGNALED BY TAKING THE NEW INSTRUCTION / IN THE AC WHEN RETURNING TO THE CENTRAL / EMULATOR. (AC<0, IF AC>0 THEN ERROR) /* THE LINEPRINTER BLOCKDRIVER (LP OR LPSPL) / IS CALLED A FINAL TIME / WITH AC IS 0 TO SIGNAL END OF FILE /* NO DOUBLE BUFFERING. (NOT NECESSARY BECAUSE / OF THE SPOOLED DRIVER) /* IF 6000 WHILE IN CHARACTER MODE, OR 666X WHILE IN / BLOCK MODE, THE EMULATOR CLOSES THE CURRENT FILE / AND EXITS WITH THE INSTRUCTION IN AC. SO / THE CENTRAL EMULATOR WILL PATCH THE INSTRUCTION / BY ITSELF AND RESTART THE BG AT PC-1. AT THAT / POINT A FRESH COPY OF LE IS CALLED THAT / STARTS WORKING IN THE PROPER MODE. / LEBUFMAX=400 /LENGTH OF BUFFER, MUST BE 400 IFNZRO BGMAX-1 <IFNZRO BGFLDS-4&4000 < IFNDEF SINGL8 <FLIP=1 /DE- OR ACTIVATE BG >>> /SETUP EMTAB *0 CDF 10 /EMTAB IS IN FIELD 1 EMTAB+66 /DEVICE CODE 66 "L^100+"E&3777 /NAME OF THIS EMULATOR TASK IFNDEF FLIP < *0 CDF 10 EMTAB+57 /OTHER (PDP8A) DEVICE CODE "L^100+"E&3777 /SAME TASK > *200 "L^100+"E&3777 /"LE" 200+400 /ONE PAGE PLUS BUFFER LEBUFI, LEBUF /START OF BUFFER LETVI, LETV /POINTER TO TRANSFER VECTOR LEUSTAT,. LECA, 0 LE, JMS I LEBUFI /DO INITIALISATION. OVERLAYED WITH: / SZL CLA JMP LECLR /END OF JOB TAD I LEUINST /FETCH INSTRUCTION IFNDEF FLIP < TAD LM6660 /SET LINK IF STANDARD LP > AND C7 /GET FUNCTION BITS TAD LEJMP /MAKE BRANCH INSTRUCTION DCA LEPACK LEPACK, 0 /ROUTINE TO PACK CHAR'S IN OS/8 FORMAT AND K377 /TAKE 8 BITS ONLY CDTOIF /BUFFER IS IN THIS FIELD JMP I LEP /COROUTINES ! LEP, 0 /ROUTINE TO GET NEXT CHAR FROM THE USER JMP I LEPACK JMP0, JMP LEERR /6000,6660,6570=GO DECIDE WHICH JMP LESKIP /6661=SKP K377, 377 /6662=NOP JMP LENOOP /6663=NOP JMP LEOUT /6664=OUTPUT LESKP, SKP /6665=NOP JMP LEOUT /6666=OUTPUT LENOOP, TAD LENOP /(NOP-SKP 6667=NOP LESKIP, TAD LESKP /(SKP JMP LERET /THE CENTRAL EMULATOR DOES THE PATCHING LEOUT, TAD I LEUAC /6666 OR 6664 IFNDEF FLIP < SNL /PRINTING ON 6666 DEVICE? CMA /NO, COMPLEMENT THE COMPLEMENTED AC FOR 6574 DCA LEPACK /STORE A WEE WHILE TAD LEPACK / > TAD LE7546 /-232 SNA CLA /A ^Z IS CONSIDERRED END OF INPUT JMP LECLR /SO THE EDITOR VIEW COMMAND WILL TERMINATE IFNDEF FLIP <TAD LEPACK / > IFDEF FLIP <TAD I LEUAC/ > JMS LEPACK /PACK CHARACTER IN BUFFER LERET, JMS MONITOR /RETURN TO CENTRAL EMULATOR RETURN LEP0, JMS LEP /GET FIRST CHAR LEP1, DCA I LECA /STORE IN BUFFER JMS LEP /GET SECOND CHAR DCA LETMP /SET ASIDE FOR A WILE JMS LEP /GET THIRD CHAR RTL RTL DCA ZTEM1 /8 BITS LEFT JUSTIFIED TAD ZTEM1 AND C7400 /TAKE FOUR HIGH ORDER BITS TAD I LECA /ADD INTO FIRST BUFFER WORD DCA I LECA /THATS ONE ISZ LECA /BUMP POINTER TO NEXT BUFFER WORD TAD ZTEM1 RTL RTL AND C7400 /FOR LOW ORDER BITS TAD LETMP /ADD SECOND CHAR DCA I LECA /STORE IN SECOND BUFFER WORD ISZ LECA /BUMP POINTER FOR NEXT TIME ISZ LEWC /INCREMENT DOUBLE-WORD COUNTER JMP LEP0 /BUFFER NOT FULL YET, GO ON LEPAT1, IFNDEF FLIP <NOP / > IFDEF FLIP <JMS LEFLIP /DEACTIVATE THE BG > TAD LEBUFI DCA LECA TAD M200 /-LEBUFMAX%2!4000 DCA LEWC /RESET WORDCOUNT LECALL, TAD LETVI /GET POINTER TO TRANSFER VECTOR JMS MONITOR CALL "L^100+"P&3777 JMP LEWAIT /PRINTER ALREADY IN USE BY FOREGROUND, WAIT DCA .+3 /THIS IS THE EVENT # JMS MONITOR /GO WAIT FOR COMPLETION WAIT LETMP, 0 /SHARED LOCATION SZA /ERRORS ? JMP LERET /YES, FORCE EMULATION ERROR (AC IS POS.) LEPAT2, IFNDEF FLIP <NOP / > IFDEF FLIP <JMS LEFLIP /ACTIVATE THE BG > JMP LEP0 /AND CONTINUE (ZEROED FOR CLOSE) CDF 10 JMS MONITOR EXIT SWPOUT LEERR, IFNDEF FLIP < SZL /WAS IT EITHER 6000 OR 6570? JMP LENOOP /NO, IT WAS 6660 - NOP IT TAD I LEUINST /DECODE DEVICE CODE AND LE770 SZA CLA /IF ZERO GO TO FAKE-HANDLER JMP LESKIP /NO, IT WAS 6570, THE PDP8A SKIP > TAD I LEUINST /LET THIS INSTRUCTION BE PATCHED... DCA LETRIK /TO ITSELF AND FALL INTO SHUTUP ROUTINE LECLR, DCA LEPAT1 /DISABLE LEFLIP CALLS DCA LEPAT2 TAD C232 /ADD A CONTROL/Z JMS LEPACK ISZ LEPCNT /ONCE-ONLY COUNTER JMP .-2 /BE SURE TO WRITE THE BUFFER DCA LEPAT2+1 /MAKE SKIP OUT OF LOOP DCA LETVI /FOR CLOSE CALL TAD LETRIK /WAS IT AN ERROR? SNA /IF SO, PATCH 6000 TO 6000 JMP LECALL /NO, CALL LP FOR CLOSE JMS MONITOR /NO CLEAR, WE COME BACK RETURN SWPOUT IFDEF FLIP < LEFLIP, 0 /ACTIVAT/DEACTIVATE BG CDF 10 TAD I LEUSTAT RAL CML RAL /COMPLEMENT INACTIVE BIT CML RTR /COMPLEMENT EMULATE BIT DCA I LEUSTAT JMS MONITOR /KICK THE BG-SCHEDULER SO HE KNOWS SIGNAL BSSLOT CDTOIF JMP I LEFLIP / > LEWAIT, JMS MONITOR STALL DGNTICK / CLA JMP LECALL LETV, ZBLOCK 2 /THIS IS THE ACTUAL TRANSFER VECTOR /BLOCK NUMBER NOT USED LETRIK, 0 LEUAC, 0 LEPCNT, -600 LEWC, -200 LENOP, NOP-SKP LEJMP, JMP JMP0 LE7546, -232 LEUINST, 0 C232, 232 IFNDEF FLIP < LM6660, -6660 LE770, 770 / > PAGE /THIS IS THE FIRST PAGE OF THE BUFFER AND CONTAINS /A LOT OF INITIALISATION CODE. LEBUF0, LEBUFI LEBUF1, LETV LEBUF2, LETV+1 LEBUF3, LE LEBUF5, LEUSTAT LEBUF6, LEUINST LEBUF7, LEUAC LEBUF8, LEP LEBUF9, LEP1 LBUF11, .&7600 /START ADDRESS OF THIS PAGE LBUF12, LECA LBUF14, LE&7600+400+2 LBUF15, 200+2 LBUF17, L2UAC LBUF19, L2UDTV LBUF20, L2UDT2 LBUF21, L2USLT LBUF22, L2UINST LBUF23, L2USTAT LBUF24, L2CAO LBUF25, L2TV LEBUF, 0 /INITIALISATION SUBROUTINE SZL /JUST A CLOSE ? JMP ICLOSE /YES, DO NOTHING ! ISZ LEBUF /ADJUST RETURN ADDRESS DCA ZTEM1 /POINTER TO BG-AREA TAD ZTEM1 /GET BG-USTAT AGAIN TAD (UASEM-1 /SETUP POINTER TO UASEM DCA ZTEM7 /IN OUR BG TABLE LEASLP, ISZ ZTEM7 TAD I ZTEM7 /LOOK AT ENTRY SNA /IS IT FREE ? JMP LEASFR /YES, GO PUT IN MY NAME CIA TAD LENAME /WAS IT ALREADY USED BY ME ? SZA CLA JMP LEASLP /NO, SOME OTHER TASK, LOOK FOR MORE LEASFR, TAD LENAME DCA I ZTEM7 /OK, PUT MY NAME IN UASEM TABLE TAD ZTEM1 TAD (UINST JMS DEFER /GET UINST TAD (-6000 /IS IT 6000 SNA CLA /NO JMP LEFAK /Y:MOVE FAKE EMULATOR CDTOIF TAD ZTEM1 DCA I LEBUF5 /SET UP LEUSTAT TAD ZTEM1 TAD (UAC DCA I LEBUF7 /SET UP LEUAC TAD ZTEM1 TAD (UINST DCA I LEBUF6 /SET UP LEUINST TAD (4200 RIF DCA I LEBUF1 /FIRST WRD OF TRANSFER VECTOR TAD LBUF11 DCA I LEBUF2 /BUFFER ADDRESS IN TRANSFER VECTOR TAD LBUF11 DCA I LEBUF0 /BUFFER POINTER TAD (SZL CLA DCA I LEBUF3 /PATCH INITIALISATION CALL TAD LEBUF9 DCA I LEBUF8 /INITILAISE COROUTINES TAD LBUF11 DCA I LBUF12 /INITIALISE BUFFER POINTER INEX, CDF 10 CLL JMP I LEBUF LENAME, "L^100+"E&3777 LEFAK, CDTOIF TAD I LBUF14 /MOVE FAKE HANDLER EMULATOR DCA I LBUF15 ISZ LBUF14 ISZ LBUF15 ISZ LEFT /READY? JMP LEFAK+1 /N TAD ZTEM1 DCA I LBUF23 /SET L2USTAT TAD ZTEM1 TAD (UAC DCA I LBUF17 /SET L2UAC TAD ZTEM1 TAD (UDTV DCA I LBUF19 /SET L2UDTV CLA IAC TAD I LBUF19 /SET L2UDTV+1 DCA I LBUF20 TAD ZTEM1 TAD (USLOT CDF 10 JMS DEFER CDTOIF DCA I LBUF21 /SET L2USLT TAD ZTEM1 TAD (UINST DCA I LBUF22 /SET UINST TAD LBUF11 DCA I LBUF24 /SET BUFFER POINTER TAD (4200 RDF DCA I LBUF25 /SET FUNCTION WORD FOR LINEPRINTER CALL TAD ZTEM1 /GET ORIG. AC CONTENTS JMP INEX /START TASK ICLOSE, CLA JMS MONITOR EXIT SWPOUT LEFT, -200+2 /FOR ONE PAGE PAGE /THIS IS THE EMULATOR FOR THE FAKE LPT HANDLER /THE PROGRAM IS MOVED BY THE INITIALIZE ROUTINE /AT THE FIRST CALL TROUGH THE FAKE HANDLER /IT COPIES THE BG-DATA TO THE BUFFER /AND CALLS "LP" / RELOC 200 LRESET, . 200+400 /DON'T TOUCH, V7A NEEDS IT ! L2TV, . /XFER WORDS L2BUFI, 400 /---------- L2TVI, L2TV L2CAI, 0 /NOTE: LE MUST BE ON THE SAME PAGE LOC. AS LE LE, SZL CLA /AC=POINTER TO USERS DTV JMP L2CLR /LINK=1: JUST A "CLEAR" AC2000 /IS THIS REALY 6000 ? TAD I L2UINST SZA CLA /Y JMP L2ERR /N:ERROR DCA I L2UAC /CLEAR USERS AC TAD I L2UDTV /GET FUNCTION SMA /WRITE IS OK JMP L2ERR1 /READ IS BAD BSW AND C37 SNA JMP L2RET /WC=0 : OS/8 CLOSE , IGNORE CMA DCA L2CNTI /SAVE -# OF PAGES-1 TAD I L2UDTV / AND C70 /GET VIRTUAL BUFFER FIELD IFNZRO INCORE-100 <INCORE,Q> TAD C100 /(INCORE DCA L2BFLD /SAVE IT TAD I L2UDT2 /GET CA DCA L2CAI L2NEW, JMS L2FLD /SETUP CDF TO REAL BUFFER FLD TAD L2BUFI / DCA L2CAO / ACM2 / DCA L2CNTO / L2CONT, JMS MONITOR /GIVE OTHERS A CHANCE PRECEDE / ISZ L2CNTI /DONE ALL INPUT ? JMP L2LP1 /N: CONTINUE L2RET, JMS MONITOR RETURN L2LP1, TAD M200 /SET TALLY FOR ONE PAGE DCA L2PGCT L2LP2, L2CDFI, CDF /'CDF INPUT FLD TAD I L2CAI /GET A WORD FROM BG ISZ L2CAI / CDTOIF /BUFFER IS IN THIS FIELD DCA I L2CAO /TO BUFFER ISZ L2CAO / ISZ L2PGCT /DONE 200 WORDS ? JMP L2LP2 /N ISZ L2CNTO /OUTPUT BUFFER FULL? JMP L2CONT /NO IFNDEF SINGL8 < AC2000 /(INACTIVE-EMULATE JMS L2FLIP /SET BG INACTIVE > IFDEF SINGL8 < CDF 10 / CLA / > JMS L2OUT /CALL LP TO OUTPUT BUFFER IFNDEF SINGL8 < AC4000 /(-INACTIVE > JMP L2NEW /GET BUFFER FLD IN CORE AND SETUP L2CDFI L2CNTO, L2FLD, -2 /GET BUFFER FIELD IN CORE TAD L2BFLD /VIRTUAL FIELD BITS+INCORE JMS L2FLIP /CHANGE STATUS AND SIGNAL BS JMS MONITOR /GO WAIT FOR FIELD SWAP NOW WAIT L2USLT, 0 TAD C6201 /REAL FIELD BITS IN AC DCA L2CDFI / JMP I L2FLD L2WAIT, JMS MONITOR STALL DGNTICK SKP CLA L2CAO, L2OUT, .&7600+200 /OUTPUT BUFFER CDTOIF TAD L2TVI JMS MONITOR /OUTPUT BUFFER CALL "L^100+"P&3777 JMP L2WAIT /LP IS BUSY DCA L2PGCT /SAVE SLOT # JMS MONITOR WAIT L2PGCT, 0 /SLOTNUMBER/COUNTER SNA CLA /ERROR ? JMP I L2OUT /NO, RETURN L2ERR1, AC4000 CDF 10 DCA I L2UAC /FORCE FATAL HANDLER ERROR DCA L2TVI /DO CLOSE CALLS ONLY JMP L2RET /AND RETURN NOW L2FLIP, 0 /ACTIVATE/DEACTIVATE BG CDF 10 TAD I L2USTAT AND CLONG /CLEAR LONG SO WE GET PRIORITY DCA I L2USTAT JMS MONITOR /KICK BS SIGNAL BSSLOT / JMP I L2FLIP /RETURN L2ERR, TAD I L2UINST /SET L2TRIK TO INSTRUCTION L2CLR, DCA L2TRIK /OR ZERO CDTOIF /MAKE SURE THAT THERE IS TAD L2C232 /A CONTROL/Z IN THE DCA I L2CAO / JMS L2OUT /OUTPUT LAST BUFFER TAD L2TRIK /WAS IT AN ERROR OR CLOSE? SZA JMP L2PATC /GO PATCH DCA L2TVI /NO, MAKE A CLOSE CALL JMS L2OUT /CALL LP CDF 10 // JMS MONITOR / EXIT EXIT SWPOUT L2PATC, JMS MONITOR /RETURN AND PATCH RETURN SWPOUT L2CNTI, 0 L2USTAT,0 L2UAC, 0 L2UDTV, 0 L2UDT2, 0 L2UINST, 0 L2BFLD, 0 IFNDEF SINGL8 < CLONG, -LONG-1 /> IFDEF SINGL8 < CLONG, -LONG-EMULATE-1 / > L2C232, 232 LEERST=L2BFLD L2TRIK=L2CDFI PAGE RELOC BUFEND=.-1 $