TITLE ECMSER - PDP-8 CONNECTED TO PDP-10 MEMORY SERVICE ROUTINE SUBTTL PETER M. HURLEY JULY 30,1969 V001 ENTRY ECMSER ECMSER: INTERNAL ECMDSP,ECMDDB,ECMDDS,ECMTYP,AOSPC INTERNAL DVAINT,DVBINT,ERRCNT INTERNAL DEVTRP,DEVIPC ;ECMDSP - ECM DISPATCH TABLE JRST ECMINI ;INITIALIZATION JRST ECMHNG ;HUNG DEVICE ECMDSP: JRST ECMRLS ;RELEASE POPJ PDP, ;CLOSE POPJ PDP, ;NON-DUMP OUTPUT POPJ PDP, ;NON-DUMP INPUT JRST ECMENT ;ENTER (SET PDP-8 OUTPUT ADDRESS) JRST ECMLKP ;LOOKUP (SET PDP-8 INPUT ADDRESS) JRST ECMOUT ;DUMP OUTPUT JRST ECMIN ;DUMP INPUT JRST ECMRQ ;USETO (GENERATE INTERRUPT) JRST ECMSET ;USETI (SET INTERRUPT ENTRY) JRST ECMDSM ;UGETF (DISMISS INTERRUPT) POPJ PDP, ;RENAME POPJ PDP, ;CLOSE INPUT POPJ PDP, ;UTPCLR POPJ PDP, ;MTAPE ;ECMDDB - ECM DEVICE DATA BLOCK ECMDDB: SIXBIT /ECM0/ ;DEVNAM XWD 4*HUNGST,0 ;DEVCHR 0 ;DEVIOS EXP ECMDSP ;DEVSER XWD DVLNG+DVDIR+DVIN+DVOUT,140000 0 ;DEVLOG 0 ;DEVBUF - POINTER TO COMMAND LIST 0 ;DEVCIA - STARTING ADDRESS OF PDP-8 INPUT 0 ;DEVCOA - STARTING ADDRESS OF PDP-8 OUTPUT 0 ;DEVCTR - NEXT IOWD TO BE DONE 0 ;DEVTRP 0 ;DEVIPC 0 ;DEVINF 0 ;DEVREQ 0 ;DEVICW 0 ;DEVSTS 10*2000 ;DEVLIM - ASSUME 8K PDP-8 ECMDDS=.-ECMDDB ;DEVICE DATA BLOCK SIZE ;BIT DEFINITIONS ;DEVIOS DEVICE DEPENDENT BIT ASSIGNMENTS RDY=400000 ;READY TO SEND OUT INFORMATION TO THE PDP-8 REPT=200000 ;REPEATING TRANSFER CP=100000 ;CHARACTER PENDING TO GO OUT IRP=40000 ;INTERRUPT REQUEST PENDING IOP=20000 ;IO PENDING IOIP=4000 ;IO IN PROGRESS EIP=2000 ;ECHO IN PROGRESS RIP=1000 ;REQUEST IN PROGRESS RCB=400 ;REQUEST OR CHARACTER BIT RF8=200 ;REQUEST FROM PDP-8 JSI=100 ;JOB IS CURRENTLY SERVICING AN INTERRUPT PARITY=400 ;REQUEST DEFINITIONS CHREQ=1 ;CHARACTER REQUEST INTREQ=2 ;INTERRUPT REQUEST INREQ=4 ;INPUT REQUEST OUTREQ=3 ;OUTPUT REQUEST ;DDB DEFINITIONS DEVCIA=7 DEVCOA=10 DEVTRP=12 DEVIPC=13 DEVINF=14 DEVREQ=15 DEVICW=16 DEVSTS=17 DEVLIM=20 ;OTHER DEFINITIONS ;AC DEFINITIONS DDB=DEVDAT CHREC=TEM LINE=TAC1 STS=DAT DEVA=450 DEVB=454 ;DA-25 FLAGS EOT=20 WCOF=40 INOUT=4000 REQ=10 SCAN=20000 DONE=10 AOSPC=2 ;EXTERNAL DEFINITIONS EXTERNAL ADRERR,COMCHK,CPOPJ,CPOPJ1,PIOFF,PION,PJOBN,PUNIT EXTERNAL SETACT,SETIOD,UADCK1,UADRCK,JBTADR,ERRDEV,PCSTOP,WSYNC EXTERNAL RECINT,XMTINT EXTERNAL CLKFLG,IRQUE,IRQU1,JBTADR,JBTSTS,JOB,JOBPD1,REQCLK EXTERNAL TIMSKP,UUOTRP EXTERNAL DVACHN,DVACHL,DVASAV,DVBCHN,DVBCHL,DVBSAV EXTERNAL ECMN,ECONLN,ETYTAB MLON ECMINI: SETZM DAFLG ;MARK DA25 NOT IN USE SETZM ERRCNT ;CLEAR OUT ERROR COUNT MOVNI TAC1,ECMN ;GET # OF PDP-8'S HRLZS TAC1 ;SET UP LOOP COUNTER MOVEI DDB,ECMDDB ;GET FIRST PDP-8 DDB ADDRESS INILOP: SETZM DEVSTS(DDB) ;CLEAR OUT DEVICE DEPENDENT BITS HLRZ TEM,ETYTAB(TAC1) ;GET PDP-8 CORE SIZE MOVEM TEM,DEVLIM(DDB) ;STORE IN DDB HRRM DDB,ETYTAB(TAC1) ;SAVE DDB ADDRESS IN ETYTAB HLRZ DDB,DEVSER(DDB) ;GET NEXT DDB ADDRESS AOBJN TAC1,INILOP ;LOOP BACK CONO DEVA,SCAN+DVACHN ;SET SCAN MODE POPJ PDP, ;RETURN ECMRLS: SETZM DEVCOA(DDB) ;CLEAR DDB LOCATIONS SETZM DEVCIA(DDB) SETZM DEVTRP(DDB) SETZM DEVIPC(DDB) SETZM DEVINF(DDB) MOVSI TAC,IRP+IOP+IOIP+JSI ;CLEAR IOS BITS ANDCAB TAC,DEVSTS(DDB) JRST RDYCK ;RETURN ECMHNG: MOVSI TAC,IOP+IOIP+IRP+RIP ;CLEAR DEVIOS ANDCAB TAC,DEVSTS(DDB) RDYCK: CONO PI,PIOFF ;TURN OFF INTERRUPTS MOVE TAC,DEVSTS(DDB) ;GET IOS WORD TLNN TAC,CP ;CHARACTER? TLZ TAC,RDY ;NO, TURN OFF RDY BIT MOVEM TAC,DEVSTS(DDB) ;STORE IT AWAY CONO PI,PION ;ENABLE INTERRUPTS AGAIN POPJ PDP, ;RETURN ECMOUT: TLOA IOS,IO ;OUTPUT ECMIN: TLZ IOS,IO ;INPUT PUSHJ PDP,COMCHK ;CHECK VALIDITY OF COMMAND LIST JRST ADRERR ;ERROR RETURN MOVSI STS,IOP+RDY ;MARK IO PENDING SOS UUO ;TO BE COUNTED UP LATER MOVEM UUO,DEVBUF(DDB) ;STORE LIST POINTER SETREQ: PUSHJ PDP,SETACT ;SET DEVICE ACTIVE BIT AND STORE IOS PUSHJ PDP,GETDA ;GET CONTROL OF THE DA-25 SKIPN DAFLG ;DA-25 FREE? PUSHJ PDP,DELYC1 ;YES, USE IT MOVE IOS,DEVIOS(DDB) ;RESTORE IOS JRST WSYNC ;PUT JOB IN A WAIT ECMRQ: HRLM UUO,DEVICW(DDB) ;STORE REQUEST BITS MOVSI STS,IRP+RDY ;SET READY BITS JRST SETREQ ;GO PROCESS REQUEST ECMTYP: PUSH PDP,LINE ;SCNSRF NEEDS THIS SAVED PUSH PDP,DDB ;SAVE THIS ALSO PUSH PDP,ITEM ;AND THIS SUBI LINE,ECONLN ;GET LINE # OF PDP-8 MOVE DDB,ETYTAB(LINE) ;GET DDB ADDRESS HRRM CHREC,DEVICW(DDB) ;STORE CHARACTER MOVSI STS,CP+RDY ;SET PROPER BITS PUSHJ PDP,GETDA ;GET CONTROL OF DA-25 SKIPN DAFLG ;IS THE DA-25 FREE? PUSHJ PDP,DELYC1 ;YES,GO USE IT POP PDP,ITEM ;RESTORE ITEM POP PDP,DDB ;RESTORE DDB POP PDP,LINE ;RESTORE LINE POPJ PDP, ;NO, JUST RETURN GETDA: CONO PI,PIOFF ;DISALLOW INTERRUPTS SKIPN DAFLG ;IS THE 25-25 FREE? CONO DEVA,0 ;YES, TURN IT OFF IORM STS,DEVSTS(DDB) ;STORE STS CONO PI,PION ;TURN INTERRUPT SYSTEM BACK ON POPJ PDP, ;RETURN ECMENT: SKIPN TEM,[XWD 400000+DDB,DEVCOA] ECMLKP: MOVE TEM,[XWD DDB,DEVCIA] HRRZ AC1,UUO ;GET USER ADDRESS PUSHJ PDP,UADCK1 ;IS IT LEGAL HRRZ TAC,@UUO ;YES, GET PDP-8 ADDRESS CAML TAC,DEVLIM(DDB) ;IS IT LEGAL POPJ PDP, ;NO, TAKE THE ERROR RETURN TRO TAC,100000 ;SET THE ENABLE BIT HRRM TAC,@TEM ;STORE ADDRESS IN DDB JRST CPOPJ1 ;TAKE SKIP RETURN ECMSET: MOVEI AC1,1(UUO) ;CHECK USER ENTRY POINT + 1 PUSHJ PDP,UADRCK ;IS IT LEGAL HRLI AC1,USRMOD ;YES, FORM PC WORD TLO AC1,200 ;PREVENT SYSTEM FROM INCREMENTING IT MOVEM AC1,DEVTRP(DDB) ;STORE TRAP ADDRES IN DDB POPJ PDP, ;AND RETURN ECMDSM: SKIPN TEM,DEVIPC(DDB) ;IS THERE REALLY AN INTERRUPT IN PROGRESS POPJ PDP, ;NO, JUST IGNORE IT MOVSI TAC1,JSI ;CLEAR JSI BIT CONO PI,PIOFF SKIPN TAC,DEVINF(DDB) ;IS INTERRUPT IN PROGRESS ANDCAM TAC1,DEVSTS(DDB) ;CLEAR SERVICE BIT CONO PI,PION ;ENABLE PI AGAIN JUMPE TAC,ECMDS1 ;IF NO FURTHER REQUESTS GO RESTORE USER SETZ TAC, MOVE TAC1,DEVTRP(DDB) ;GET TRAP PC MOVEM TAC1,JOBPD1(JDAT) ;STORE OVER HIS RETURN PC ADDI TAC1,-1(PROG) ;TAC1: = ABSOLUTE INTERRUPT ENTRY -1 EXCH TAC,DEVINF(DDB) ;GET AND CLEAR LATEST BITS MOVEM TAC,(TAC1) ;GIVE BITS TO USER POPJ PDP, ;TRAP BACK ECMDS1: SETZM DEVIPC(DDB) ;CLEAR USERS SAVED PC MOVE ITEM,JOB ;GET CURRENT JOB# MOVE TAC,JBTSTS(ITEM);GET JOB STATUS TLZE TAC,AOSPC ;DID SYSTEM TRY TO SKIP RETURN TO USER AOS TEM ;YES, INCREMENT PC MOVEM TAC,JBTSTS(ITEM);STORE STATUS MOVEM TEM,JOBPD1(JDAT) ;RESTORE USERS INTERRUPT PC POPJ PDP, DVAINT: CONSO DEVA,3770 ;REQUEST, EOT, OR ERRORS JRST .-1 JSR DVASAV ;SAVE THE ACS SETOM DAFLG ;MARK THAT THE DA-25 IS IN USE CONI DEVA,TAC ;GET THE STATUS BITS LDB LINE,[POINT 4,TAC,21] ;GET LINE # CAIL LINE,ECMN ;IS THIS LINE # TOO HIGH? JRST DELYC1 ;YES MOVE DDB,ETYTAB(LINE);GET DDB ADDRESS MOVE IOS,DEVIOS(DDB) ;SET UP PROPER IOS MOVE STS,DEVSTS(DDB) ;SET UP STATUS WORD TRNN TAC,REQ ;REQUEST INTERRUPT? JRST EOT8 ;NO, TRY 8-EOT TLNN STS,IOIP ;INPUT TO PDP-10 READY? JRST REQFR8 ;NO, MUST BE 8 REQUEST DATAO DEVA,DEVCTR(DDB);SET UP -WC,,SA-1 DATAO DEVB,[0] ;CLEAR THE DATA BUFFER MOVEI TAC,243460+DVBCHN ;GET CONO DEVB BITS TRNE IOS,1 ;PACKED OR UNPACKED MODE TRZ TAC,2000 ;UNPACKED! CONO DEVB,(TAC) ;INITIATE TRANSFER POPJ PDP, ;DISMISS REQFR8: TLO STS,RF8 ;MARK THIS AS REQUEST FROM PDP-8 MOVEM STS,DEVSTS(DDB) ;STORE STS DATAO DEVB,[0] ;CLEAR DEVB DATA BUFFER CONO DEVB,243060+DVBCHN ;INITIATE TRANSFER POPJ PDP, ;DISMISS EOT8: TRNN TAC,EOT+WCOF ;IS IT AN EOT? JRST DAERR ;NO, MUST BE AN ERROR TLZE STS,RF8 ;IS THIS THE END OF A PDP-8 REQUEST? JRST DELYCK ;YES, WE ARE THROUGH NXTIO: TLZN STS,IOIP ;IO IN PROGRESS? JSR SYNCER ;SYNC ERROR HLRE TAC,DEVCTR(DDB) ;PICK UP LAST IOWD MOVNS TAC ;MAKE IT POSITIVE TRNN IOS,1 ;PACKED OR UNPACKED MODE IMULI TAC,3 ;PACKED MODE TLNE IOS,IO ;OUTPUT? JRST [ADDB TAC,DEVCOA(DDB) ;YES JRST CHKSIZ] ADDB TAC,DEVCIA(DDB) ;YES CHKSIZ: TRZ TAC,700000 ;CUT ADDRESS TO 15 BITS CAMGE TAC,DEVLIM(DDB) ;IS IT TOO LARGE? JRST DELYCK ;NO, GO DO IT MOVEM STS,DEVSTS(DDB) ;STORE STS PUSHJ PDP,ECMRLS ;GO RELEASE DEVICE JSP TAC,ERRDEV ;PRINT OUT ERROR MESSAGE ASCIZ /TRIED TO ACCESS NON EXISTENT PDP-8 CORE/ JOBSTP: PUSHJ PDP,DELYC1 ;START DA25 GOING LDB ITEM,PJOBN ;GET JOB NUMBER JRST PCSTOP ;AND STOP JOB NXTCOM: AOSA TAC,DEVBUF(DDB) ;GET NEXT IOWD HRRM TAC,DEVBUF(DDB) ;STORE NEW POINTER MOVE TAC,@TAC ;GET ACTUAL COMMAND JUMPL TAC,CPOPJ ;COMMAND? YES, RETURN JUMPG TAC,NXTCOM+1 ;GO-TO-WORD GET NEXT COMMAND POP PDP,TAC ;COMMAND LIST IS DONE TLZ STS,IOIP+IOP ;CLEAR BITS ENDIO: TLZE IOS,IOW ;IS JOB IN A WAIT PUSHJ PDP,SETIOD ;YES, SET IO DONE TRZ IOS,IOACT ;CLEAR IO ACTIVE BIT ENDREQ: TLNN STS,IOP+IRP+CP ;ANY OTHER DELAYED REQUESTS? TLZ STS,RDY ;NO, CLEAR RDY BIT MOVEM STS,DEVSTS(DDB) ;STORE STS WORD MOVEM IOS,DEVIOS(DDB) ;STORE THIS IOS WORD POP PDP,DDB ;RESTORE DDB FROM DELYCK JRST DELYC1 ;LOOK FOR MORE REQUESTS DVBINT: CONSO DEVB,DONE JRST .-1 JSR DVBSAV ;SAVE THE AC'S CONI DEVA,TAC ;READ IN THE STATUS BITS LDB LINE,[POINT 4,TAC,21] ;GET PDP-8 LINE # CAIL LINE,ECMN ;IS THIS LINE TOO BIG JRST DELYC1 ;YES HRRZ DDB,ETYTAB(LINE);GET DDB ADDRESS MOVE IOS,DEVIOS(DDB) ;SET UP IOS MOVE STS,DEVSTS(DDB) ;SET UP STS TLNE STS,RF8 ;REQUEST FROM PDP-8 JRST REQ8 ;YES TLZN STS,RIP ;REQUEST DONE? JRST NXTIO ;NO, CHECK FOR IO BEING DONE TLNE STS,IOIP ;WAS THIS AN IO REQUEST JRST DOIO ;YES PUSH PDP,DDB ;STORE FOR LATER RESTORE TLZN STS,RCB ;CHAR OR INTERRUPT TLZA STS,IRP ;INTERRUPT TLZA STS,CP ;CHARACTER JRST ENDIO ;DO A SETIOD JRST ENDREQ ;LOOK FOR OTHER COMMANDS IOREQ: TLO STS,IOIP ;MARK THAT IO IS IN PROGRESS LDB ITEM,PJOBN ;GET JOB # MOVE PROG,JBTADR(ITEM) ;SET UP RELOCATION CONSTANT PUSHJ PDP,NXTCOM ;GET NEXT IOWD ADDI TAC,(PROG) ;RELOCATE MOVEM TAC,DEVCTR(DDB) ;STORE IT FOR LATER USE HLRES TAC ;GET -WC TRNN IOS,1 ;PACKED OR UNPACKED MODE? IMULI TAC,3 ;PACKED MODE MOVEM TAC,DEVREQ(DDB) ;STORE IT IN REQUEST WORD MOVE TAC,DEVCIA(DDB) ;GET INPUT STARTING ADDRESS TLNE IOS,IO ;INPUT OR OUTPUT? MOVE TAC,DEVCOA(DDB) ;OUTPUT, SO GET PROPER ADDRESS DPB TAC,[POINT 18,DEVREQ(DDB),23] MOVEI TAC,INREQ ;INPUT REQUEST # TLNE IOS,IO ;IN OR OUT MOVEI TAC,OUTREQ ;REALLY WANT OUTREQ JRST ROUT ;GO SEND REQUEST OUT DOIO: MOVEM STS,DEVSTS(DDB) ;STORE STS TLNN IOS,IO ;IS THIS AN INPUT REQUEST JRST DELYC1 ;YES, GO WAIT FOR PDP-8 REQUEST CONI DEVA,TAC ;GET STATUS BITS TRO TAC,INOUT+DVACHN TRZ TAC,33770 ;CLEAR UNWANTED BITS CONO DEVA,(TAC) ;SET STATUS BITS DATAO DEVA,DEVCTR(DDB);OUTPUT WC AND SA DATAO DEVB,[0] ;ZERO DEVB DATA BUFFER MOVEI TAC,3460+DVBCHN TRNE IOS,1 ;PACKED OR UNPACKED MODE? TRZ TAC,2000 ;SET PACKING MODE TO 1 CONO DEVB,(TAC) ;SET DEVB CONTROL BITS POPJ PDP, ;DISMISS REQ8: DATAI DEVB,TAC ;READ IN REQUEST MOVEM TAC,ECMREQ ;SAVE IT FOR LATER TLNE TAC,100 ;CHARACTER? PUSHJ PDP,INCHAR ;YES MOVE TAC,ECMREQ ;SET UP TAC AGAIN TLNE TAC,200 ;ECHO? PUSHJ PDP,ECHOCH ;YES MOVE TAC,ECMREQ ;RESTORE TAC ONCE MORE TLNE TAC,400 ;INTERRUPT REQUEST PUSHJ PDP,INTUSR ;YES POPJ PDP, ;DISMISS AND WAIT FOR EOT DELYCK: MOVEM IOS,DEVIOS(DDB) MOVEM STS,DEVSTS(DDB) ;STORE STS DELYC1: PUSH PDP,DDB ;SAVE DDB DELYC2: MOVEI TAC1,ECMN ;GET # OF PDP-8'S MOVEI DDB,ECMDDB ;GET ADDRESS OF FIRST DDB CHKLOP: SKIPGE STS,DEVSTS(DDB) ;PICK UP STS WORD REQUESTS JRST PROCES ;GO PROCESS THIS REQUEST NOPROC: HLRZ DDB,DEVSER(DDB) ;GET NEXT DDB ADDRESS SOJG TAC1,CHKLOP ;LAST ONE? SETZM DAFLG ;MARK THAT DA-25 IS NOT BUSY CONO DEVA,SCAN+DVACHN ;SET TO SCANNING MODE POP PDP,DDB ;RESTORE DDB POPJ PDP, ;RETURN PROCES: TLNE STS,IOIP ;IO IN PROGRESS JRST NOPROC ;YES, DON'T DO ANYTHING MOVE IOS,DEVIOS(DDB) ;GET IOS WORD LDB TAC1,PUNIT ;GET UNIT # MOVEI TAC,4000+DVACHN ;SET UP CONO BITS DPB TAC1,[POINT 4,TAC,21] SETOM DAFLG ;MARK DA25 IN USE CONO DEVA,(TAC) ;SET UP FOR REQUEST TLNE STS,IOP ;IO PENDING? JRST IOREQ ;YES TLNE STS,IRP ;INTERRUPT REQUEST JRST INTRPT ;YES, GO GET IT TLNN STS,CP ;CHARACTER? JSR SYNC1 ;NO,SYNC ERROR TLO STS,EIP ;ARE WE STILL ECHOING LAST CHAR HRRZ TAC,DEVICW(DDB) ;PICK UP CHARACTER TO GO OUT DPB TAC,[POINT 12,DEVREQ(DDB),35] MOVEI TAC,CHREQ ;GET REQUEST NUMBER TLOA STS,RCB ;MARK THAT A CHARACTER IS GOING OUT ROUT: TLZ STS,RCB ;MARK INTERRUPT REQUEST GOING OUT DPB TAC,[POINT 6,DEVREQ(DDB),5] TLO STS,RIP ;MARK THAT REQUEST IS IN PROGRESS MOVEM STS,DEVSTS(DDB) ;STORE STS DATAO DEVB,DEVREQ(DDB);SEND OUT REQUEST CONO DEVB,43060+DVBCHN POP PDP,DDB ;RESTORE DDB POPJ PDP, ;DISMISS INTRPT: HLRZ TAC,DEVICW(DDB) ;GET INTERRUPT REQUEST WORD DPB TAC,[POINT 12,DEVREQ(DDB),23] MOVEI TAC,INTREQ ;GET REQUEST NUMBER JRST ROUT ;SEND OUT REQUEST INCHAR: PUSH PDP,LINE ;SAVE LINE # LDB CHREC,[POINT 7,ECMREQ,35] ;GET CHARACTER ADDI LINE,ECONLN ;GET LINE # IN TTYTAB PUSHJ PDP,RECINT ;SEND OUT CHARACTER EDONE: POP PDP,LINE ;RESTORE LINE MOVE DDB,ETYTAB(LINE);AND DDB POPJ PDP, ;RETURN ECHOCH: PUSH PDP,LINE ;SAVE LINE HRRZ CHREC,DEVICW(DDB) ;GET LAST CHARACTER ADDI LINE,ECONLN ;GET LINE # IN TTYTAB MOVSI TAC,EIP ;MARK THAT ECHO IS DONE ANDCAM TAC,DEVSTS(DDB) PUSHJ PDP,XMTINT ;ECHO THE CHARACTER JRST EDONE INTUSR: SKIPN TAC1,DEVTRP(DDB);IS USER ENABLED FOR INTERRUPTS POPJ PDP, ;NO, IGNORE IT MOVE STS,DEVSTS(DDB) ;PICK UP STS WORD LDB ITEM,[POINT 12,ECMREQ,23] ;GET PDP-8 REQUEST WORD MOVNS ITEM ;MAKE IT NEGATIVE MOVSI TEM,400000 LSH TEM,(ITEM) ;SET APPROPRIATE BIT IN INTERRUPT LOCATION IORM TEM,DEVINF(DDB) ;STORE IN DDB TLOE STS,JSI ;JOB SERVICING INTERRUPT POPJ PDP, ;YES MOVEM STS,DEVSTS(DDB) ;RESTORE STS LDB ITEM,PJOBN ;GET JOB # SETZM DEVINF(DDB) ;CLEAR BITS MOVE PROG,JBTADR(ITEM) ;GET STARTING ADDRESS OF JOB ADDI PROG,-1(TAC1) ;ADD USER'S INTERRUPT ADDRESS MOVEM TEM,(PROG) ;GIVE USER THE BITS MOVE DAT,DVBCHL ;GET INTERRUPT PC TLNE DAT,USRMOD ;IS IT IN USER MODE? CAME ITEM,JOB ;IS CURRENT JOB THE RIGHT ONE JRST RSCHED ;NO, GO MAKE SCHEDULER REQUEST MOVEM TAC1,DVBCHL ;YES, TRAP IMMEDIATELY MOVEM DAT,DEVIPC(DDB) ;SAVE THE INTERRUPT PC MOVEM ITEM,TIMSKP ;GUARANTEE ONE CLOCK TICK POPJ PDP, RSCHED: HRLM DDB,ITEM ;FORM REQUEST WORD, XWD DDB ADR, JOB# AOS TAC1,IRQUE ;INCREMENT REQUEST QUEUE POINTER MOVEM ITEM,IRQUE(TAC1) ;STORE REQUEST SETZM IRQU1(TAC1) ;CLEAR NEXT WORD IN QUEUE SETOM UUOTRP ;SCHEDULE NEXT TIME SETOM CLKFLG ;CAUSE A CLOCK INTERRUPT CONO PI,REQCLK ;ON PI LEVEL 7 POPJ PDP, ;DISMISS ;STORAGE LOCATIONS DAFLG: Z ECMREQ: Z ERRCNT: Z DAERR: TRNE TAC,PARITY ;WAS THIS A PARITY ERROR JRST RETRY ;YES, GO TRY IT AGAIN DAER1: SETZM DEVSTS(DDB) ;CLEAR OUT ALL BITS PUSHJ PDP,ECMRLS ;RELEASE THE DEVICE LDB TAC,[POINT 6,DEVNAM(DDB),23] ADDI TAC,40 ;PUT DEVICE NUMBER IN ERROR MESSAGE DPB TAC,[POINT 7,MESS+1,20] LDB TAC,[POINT 6,DEVNAM(DDB),29] ADDI TAC,40 DPB TAC,[POINT 7,MESS+1,27] PUSHJ PDP,DELYC1 ;GO GET NEXT REQUEST FROM DA-25 JSP TAC,ERRDEV ;PRINT OUT THE FOLLOWING MESSAGE MESS: ASCIZ /PDP-8 # NOT RESPONDING/ JRST JOBSTP ;STOP THE JOB RETRY: CONI DEVB,TAC ;READ THE STATUS BITS DATAI DEVB,TAC1 ;READ IN THE BAD DATA LDB TEM,PTRST ;PICK UP STATE SKIPE TEM ;MEMORY MODE PARITY ERROR JRST DAER1 ;NO, NO WAY OUT OF ERROR TRZ TAC,500000 ;CLEAR UNWANTED BITS CONO DEVB,200020(TAC) ;CLEAR ERRORS AND CONTINUE AOS ERRCNT ;COUNT UP ERROR COUNT POPJ PDP, ;DISMISS PTRST: POINT 3,TAC,23 SYNC1: Z POP PDP,DDB ;RESTORE DDB HALT SYNC2 ;CHANGE HALT TO A JRST ******** SYNCER: Z HALT .+1 ;REMOVE THIS LINE ************* SYNC2: SETZM DEVSTS(DDB) ;ZERO STATUS WORD AOS ERRCNT ;COUNT UP ERROR COUNT JRST DELYC1 ;RETURN TO NORMAL FLOW END