IFNDEF T30,;ASSUME TYPE 30 DISPLAY IF T30 IS UNDEFINED IFN T30,< TITLE DIST30 - TYPE 30 DISPLAY SERVICE ROUTINES ENTRY DIST30 DIST30: > IFE T30,< TITLE DIS340 - TYPE 340 DISPLAY SERVICE ROUTINES ENTRY DIS340 DIS340: > SUBTTL R. GRUEN/RCC TS 03 JUN 69 V004 XP VDISSR,004 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP ; THESE ROUTINES HANDLE INTERRUPTS FROM THE DISPLAY DATA ; CHANNEL. THEY SEARCH THE COMMAND POINTER LIST SUPPLIED ; BY THE USER AND OUTPUT SECTIONS OF DATA AS SPECIFIED THEREIN. ; ALL OUTPUT IS DONE USING THE BLKO COMMAND. ; THE FORMAT OF THE COMMAND POINTE RLIST IS AS FOLLOWS: ; RH=0 END OF COMMAND POINTER LIST ; ; RH=ADR LH=0 ADR IS ADDRESS OF THE NEXT SECTION OF THE ; COMMAND POINTER LIST ; RH=L-1 LH=-N OUTPUT TO DISPLAY THE N WORDS OF COMMANDS ; BEGINNING AT LOCATION L. ; NOTE THAT THE CHECK FOR END OF LIST IS MADE FIRST. ; ALL ADDRESS ARE CHECKED FOR VALIDITY (I.E.. THEY MUST ; BE WITHIN USER ARE) BEFORE ANY MEM REF IS MAD. ;IF THE T30 SWITCH = 1 THIS IS THE ROUTINE FOR A DEC ;TYPE 30 DISPLAY WITH A TYPE 348 INTERFACE. ;OTHERWISE IT IS THE ROUTINE FOR A DEC TYPE 340. INTERNAL FTCHECK,FTMONP IFN FTCHECK+FTMONP,< EXTERNAL DISDDB,DISIOS,PENLOC,DISNT,DISBKO,DISHI,DISONE,DISAV,OFFDIS EXTERNAL DISAV1,DISREL,DISCON,DISNXT INTERNAL DISNX1 > IFE FTCHECK+FTMONP,< ;DIS DEVICE DATA BLOCK INTERN DISDDB DISDDB: SIXBIT /DIS/ XWD ^D60*HUNGST,0 DISIOS: 0 EXP DISDSP XWD DVDIS+DVOUT+DVIN+DVLNG,2000 0 0 XWD PROG,0 0 PENLOC: 0 DISPNT: 0 DISBKO: 0 DISHI: 0 DISONE: 0 DISAV: 0 DISAV1: 0 DISREL: XWD TAC,0 XP OFFDIS,0 IFE T30,< DISCON: EXP ONDIS> IFN T30,< DISCON: 0> XP PENDDR,0 ;TO SATISFY A REQUEST IN COMMON. ; THERE IS NOT REALLY A PEN DDB. > IFN T30,< DIS=134 ;TYPE 30 DISPLAY DEVICE NUMBER > DISTAR=100 ;CLOCK FINISHED BEFORE PICTURE DISWAT=200 ;PICTURE FINISHED BEFORE CLOCK DISCKR=400 ;CLOCK REQUEST IN CLOCK QUEU DISUUI=1000 IFE T30,< DISBSY=77 PENON=7400 >IFN T30,< DISBSY=2000 PENON=1000 > EXTERN JOBPFI EXTERN DISSAV,DISBLK,DISJSR,PENSAV EXTERN DISCHN,PENCHN EXTERN DISCHL,PENCHL EXTERN DISSAV,DISRET EXTERN DISPON,DISPOF EXTERN ADRERR,SETIOD EXTERN PION,PIOFF,CLOCK EXTERN CPOPJ1,UERROR,URREL,STOTAC,JOB,JBTSTS,JBTADR,PJOBN IFE T30,< EXTERN ONDIS,NONDIS> INTERN PENINT,DISINT,DISFIN ENTRY DISDSP DEFINE ADRCHK(A) < CAILE A,JOBPFI CAMLE A,DISHI JRST EXIT2 > JRST DISINI ;INITIALIZATION POPJ PDP, ;PRINT ERROR AND STOP JOB DISDSP: JRST DISSTP ;RELEASE JRST DISSTP ;CLOSE JSP DAT,UERROR ;OUTPUT JSP DAT,UERROR ;INPUT JRST CPOPJ1 ;ENTER JRST CPOPJ1 ;LOOKUP JRST DISOUT ;DUMP OUPUT (THAT'S US) JRST DISIN ;DUMP INPUT (AS IN PEN) POPJ PDP, ;SETO POPJ PDP, ;SETI POPJ PDP, ;GETF JRST CPOPJ1 ;RENAME POPJ PDP, ;CLOSE INPUT POPJ PDP, ;DIRECTORY CLEAR POPJ PDP, ;MTAPE ;DISINI IS CALLED FOR RELEASE, CLOSE, AND SUNDRY ILLEGAL CONDITIONS ; WHICH WANT TO TURN THE DISPLAY OFF. IT FIRST CONVINCES ; THE INTERRUPT LEVEL ROUTINES TO GO BACK TO SLEEP AND THEN ; TELLS THE MONITOR THAT THE DEVICE IS INACTIVE, LASTLY, ; IT TUERNS OFF THE INTERRUPT ASSIGNMENTS OF THE DISPLAY ; AND THE PI CHANNEL ASSOCIATED WITH THE DIS BLKO. IT RETURNS ; WITH A POPJ , SOMETIMES TO ITS CALLING ROUTINE AND SOMETIMES ; TO THE CHANNLE'S DISMISS ROUTINE, THE ADDRESS OF WHICH ; WAS CLEVERLY PLACED ON THE PUSHDOWN LIST WHEN AC'S ; WERE SAVED. THUS IT CAN BE CALLED WITH EITHER A ; PUSHJ PDP,DISINI OR A JRST DISINI. DISINI: IFE T30,< CONO DIS,100 ;PARAMETER MODE> IFN T30,< MOVEI TAC,PENCHN ;SET UP CONO WORD WITH PROPER ASH TAC,3 ; CHANNEL ASSIGNMENTS ADDI TAC,DISCHN TRO TAC,4000 ;SET DISPLAY READY BIT IN CONO WORD MOVEM TAC,DISCON> JRST DISIN1 DISSTP: MOVE ITEM,JOB ;CLEAR NSHF SO JOB CAN BE SHUFFLED MOVSI TAC,NSHF+NSWP ;CLEAR NSWP SO JOB CAN BE SWAPPED(IN CASE THIS IS A SWAPPING SYSTEM ANDCAM TAC,JBTSTS(ITEM) DISIN1: SETOM PENLOC MOVSI TAC,DISWAT+DISUUO ;IGNORE FURTHER TRAPS HRRI TAC,IOACT ;INDICATED DEVICE INACTIVE ANDCAM TAC,DISIOS ;INTO DEVICE DATA BLOCK DISOFF: CONO DIS,OFFDIS ;REMOVE THE DISPLAY'S CHANNE; ASSIGNMENTS HLLZS PENINT ;DON'T EXPECT ANY ON LITE PEN CONO PI,DISPOF ;TURN OFF DISPLAY'S BLKO CHANNEL POPJ PDP, DISINT: JRST DISFIN JRST DISINT ;... ;PENINT RECIEVES CONTROL ON INTERRUPTS ON THE DISPLAY NON-DATA ; CHANNEL (SPECIAL CHANNEL). IT DECIDES IF THE INTERRUPT ; WAS VALID, AND IF SO, TRANSFERS CONTROL TO AN APPROPRIATE ROUTINE IFE T30,< PENINT: CONSO DIS,0 ;CHECK FOR CONI FLAGS JRST PENINT ;TO OTHER DEVICES ON SAME CHANNEL CONSZ DIS,400 ;STOP FLAG JRST STPFLG CONSZ DIS,2000 ;PEN FLAG? PENFLG: DATAI DIS,PENLOC ;STORE CURRENT LITE PEN LOC CONO DIS,NONDIS ;CLEAR FLAG JEN @PENCHL ;DISMISS INTERRUPT ;STPFLG SERVICES STOP FLAGS (DISPLAY PROGRAMMED) BY DOING ; A CLOSE ON THE DISPLAY STPFLG: JSR PENSAV ;STOP FLAG, SAVE AC'S AND SETUP RETURN JRST DISDSP+DCL ;DO A CLOSE AND DISMISS INTERRUPT > IFN T30,< PENINT: CONSO DIS,0 ;CHECK FOR CONI FLAGS JRST PENINT ;TO OTHER DEVICES ON SAME CHANNEL DATAI DIS,PENLOC ;CLEAR PEN INTERRUPT MOVEM TAC,PENLOC ;SAVE AC TAC MOVE TAC,DISBKO ;GET ABSOLUTE ADR OF NEXT DATA ELEMENT SUB TAC,DISREL ;MAKE ADDRESS RELATIVE HRRZS TAC ;CLEAR OUT GARBAGE IN THE LEFT HALF EXCH TAC,PENLOC ;SAVE ADR IN PENLOC AND RESTORE TAC JEN @PENCHL ;DISMIS THE INTERRUPT > ;DISNXT IS CALLED WITH A JSR DISNXT, IT SETS UP THE NEXT ; POINTER FOR THE DISPLAY'S BLKO BY INTERPRETING A ; COMMAND LIST SUPPLIED BY THE USER, THIS COMMAND LIST ; IS DESCRIBED AT THE BEGINNING OF THE PROGRAM. IF THE ; DATA TO BE TRANSMITTED TO THE DISPLAY WOULD VIOLATE THE ; MEMORY PROTECTION, THEN THE ROUTINE RETURNS TO THE ; CALLING LOCATION +1. OTHERWISE, IF THERE ; IS NO FURRTHER DATA TO BE OUTPUT (AS INDICATED BY THE ; USER'S COMMAND LIST) THE ROUTINE RETURNS TO THE CALLING ; LOCATION +2. OTHERWISE, THE NEXT POINTER FOR THE BLKO ; IS PLACED IN DISBLKO AND THE ROUTINE RETURNS TO THE CALLING ; LOCATION +3. IFE FTCHECK+FTMONP,< DISNXT: 0 ;JSR AT INTERRUPT OF UUO LEVELS > DISNX1: AOS TAC,DISPNT ;GET NEXT POINTER FROM LIST ILUP: HRRZM TAC,DISPNT ;UPDATE POINTER POINTER ADRCHK TAC MOVE TAC,@DISREL ;GET NEXT WORD IN POINTER LIST MOVEM TAC,DISBKO ;PLACE IN BLOK POINTER HLROM TAC,DISAV1 ;GET NEGATIVE WORD COUNT(MAKE LH NEG. TOO) IFN T30,< JUMPE TAC,EXIT1 ;END OF COMMAND LIST? TRNN TAC,-1 ;INTENSITY? JRST INTCHK ;YES> IFE T30,< TRNN TAC,-1 ;END OF COMMAND LIST? JRST EXIT1 ;YES> TLZN TAC,-1 ;NO. POINTER TO NEW LIST? JRST ILUP ;YES. CAIL TAC,JOBPFI ;NO. ADDRESS IN BOUNDS? CAML TAC,DISHI JRST EXIT2 ;NO SUB TAC,DISAV1 ;YES. ADR. OF LAST WORD IN BLOCK. ADRCHK TAC HRRZ TAC,DISREL ;FORM ABSOLUTE ADDR ADDM TAC,DISBKO ;IN THE BLKO POINTER WORD AOS DISNXT ;RETURN 2,4 EXIT1: AOS DISNXT EXIT2: MOVE TAC,DISAV CONO DIS,@DISCON ;SET UP DISPLAY STATUS WORD JRST 2,@DISNXT ;... IFN T30,< INTCHK: MOVSS TAC ;PLACE INTENSITY IN CONO WORD DPB TAC,INTPNT JRST DISNX1 ;GET NEXT POINTER INTPNT: POINT 3,DISCON,29> ;DISFIN RECEIVES CONTROL WHEN THE DISPLAY'S BLKO POINTER REACHES ; ZERO. IT SAVES THE TWO AC'S WHICH DISNXT USES AND ; DOES A JRST TO DISNXT. ON A NORMAL RETURN IT RESTORES THE ; AC'S AND DISMISSES THE INTERPUT. ON A "NO MORE DATA" ; RETURN IT TRANSFERS CONTROL TO OVT2 FOR FURTHER ; DECISION AS TO WHETHER OR NOT TO CONTINUE DISPLAYING. DISFIN: MOVEM TAC,DISAV ;SAVE AC'S JSR DISNXT ;SETUP NEXT BLKO POINTER JRST ADRER JRST DVT2 ;RETURN HERE IF NO NEXT POINTER JEN @DISCHL ;LET THE SCOPE DO THE REST ;DVT2 RECIVES CONTROL AT INTERRUPT LEVEL WHEN THE COMMAND LIST ; (SUPPLIED BY THE USER) RUNS OUT. IT SAVES THE AC'S FOR ; THIS CHANNEL AND IN THE PROCESS ENABLES REUTRNS BY POPJ ; AND SIMILAR GOOD THINGS SINCE IT ALSO STORES THE PC FROM ; THE JSR IN THE GENERAL PC LOCATION FOR THIS CHANNEL ; IF THE DISPLAY IS OFF. IT DOES NOT RESTART IT. ; IT CHECKS TO SEE IF THE CLOCK HAS RUN OUT BEFORE THE PICTURE; ; IF SO, IT CALLS DISBEG TO RESTART THE DISPLAY WITH A NEW ; COMMAND LIST. IT TURNS OFF THE IO ACTIVE BIT WHICH WAS ; TURNED ON BY THE OUTPUT ROUTINE; THIS INSURES THAT ANY ; OUTPUT COMMAND WILL DISPLAY AT LEAST ONE PICTURE. IF ; THE JOB WAS IN AN IO-WAIT, IT IS RELEASED. DVT2: JSR DISSAV ;ASK EXEC TO SAVE AC'S MOVEI DEVDAT,DISDDB ;SETUP ACS MOVSI TAC,SHF MOVSI DAT,NSHF LDB ITEM,PJOBN PUSHJ PDP,DISOFF MOVSI IOS,DISWAT ;INDICATE PICTURES FINISHED IORB IOS,DISIOS ;... TLON IOS,DISUUI ;RESUME DISPLAY, NEW UUO. JRST DVT6 ;YES, STAY IN IO WAIT TDNE TAC,JBTSTS(ITEM) ;DOES SYSTEM WANT TO SHUFFLE THIS JOB?> JRST DVT4 ;YES TLNE IOS,DISTAR ;HAS CLOCK TRIGGERED? PUSHJ PDP,DISBEG ;YES, RESTART DISPLAY JRST DVT3 DVT4: TLNE IOS,DISTAR ;DID CLOCK FINISH BEFORE PICTURE? PUSHJ PDP,CLKREQ ;YES, PUT IN CLOCK REQUEST. DVT5: ANDCAM DAT,JBTSTS(ITEM) ;TURN OFF NSHF SO JOB CAN BE SHUFFLED DVT3: MOVE IOS,DISIOS ;BIT FIDDLING TIME TRZ IOS,IOACT ;SIGNAL DISPLAY CAN BE CLOSED TLZE IOS,IOW ;IS DISPLAY CAUSING AN IO-WAIT? PUSHJ PDP,SETIOD ;UNWAIT THE JOB MOVEM IOS,DISIOS ;RESTORE IO CONTROL WORD JRST DISRET ;RESTORE AC'S AND DISMISS DVT6: MOVEM IOS,DISIOS PUSHJ PDP,DISBEG ;START NEW COMMAND LIST JRST DISRET ;DISREG IS CALLED WITH A PUSHJ PDP,DISBEG, IT DISABLES THE ; DISPLAY ITSELF (BY USING DISOFF) AND ALSO DISABLES THE ; CLOK RESTART AND RESETS THE POINTER TO THE USER'S ; COMMAND LIST TO THAT SPECIFIED ON THE LAST OUTPUT ; MINUS ONE. IT ASKES DISNXT TO SET UP THE NEXT BLKO POINTER ; IF DISNXT IS UNSUCCESSFUL (I.E., IF THE USER COMMAND LIST ; IS NULL), THEN THE ROUTINE DOES A CLOSE. OTHERWISE, A ; REQUEST IS ENTERED FOR A CLOCK INTERRUPT AT THE END OF ; AT MOST TWO JIFFIES. THIS CLOCK QUEUE REQUEST IS ENTERED ; ONLY IF THERE IS NONE ALREADY IN THE QUEUE. THE PI ; CHANNELS FOR THE DISPLAY ARE TURNED ON AGAIN AND THE ; DISPLAY IS INITIALIZED BY A CONO. IT SHOULD THEN REQUEST ; DATA AS SOON AS THE PI CHANNEL FOR THE BLKO IS TURNED ON. ; IT TURNS THIS CHANNEL ON AND RETURNS TO ITS CALLER. DISBEG: MOVSI IOS,DISTAR+DISWAT ;INDICATE FRESH DISPLAY ANDCAM IOS,DISIOS ;... HRRZ TAC1,DISONE ;GET POINTER LIST ADDR (-1) HRRZM TAC1,DISPNT ;RESET POINTER POINTER WITH IT JSR DISNXT ;ASK FOR FIRST WORD FOR BLKO JRST ADRER1 JRST DISSTP ;NULL LIST, CLOSE PUSHJ PDP,CLKREQ ;ENTER CLOCK QUEUE REQUEST CONO DIS,@DISCON ;INITIALIZE THE DISPLAY MOVEI TAC,PENON ;ALLOW SPECIAL PI INTERRUPTS HRRM TAC,PENINT ;... CONO PI,DISPON ;ALLOW BLKO INTERRUPTS POPJ PDP, ;RETURN CLKREQ: MOVSI IOS,DISCKR ;IF NO CLOCK INTERRUPT REQUESTED MOVE TAC,CLOKRT ;RESET TIMER CONO PI,PIOFF ;INHIBIT INTERRUPTS TDON IOS,DISIOS ;ENTER ONLY A SINGLE CLOCK REQUEST IDPB TAC,CLOCK ;PLACE REUQEST IN QUEUE IORM IOS,DISIOS ;PROTECT AGAINST A DUPLICATE REQUEST CONO PI,PION ;UNINHIBIT INTERRUPTS POPJ PDP, ;RETURN CLOKRT: XWD CLOK,2 ;CONTROL FOR CLOCK QUEUE: 2 JIFFIES ;TWO JIFFIES ;CLOK IS CALLED AT THE CLOCK LEVEL IN RESPONSE TO A REQUEST ; IN THE CLOCK QUEUE. A BIT IS SET TO INDICATE THAT THE ; CLOCL PERIOD HAS ELAPSED. IF THE DISPLAY IS STILL IN ; PROGRESS, CLOK RETURNS AT THIS POINT. OTHERWISE, CLOK ; GOES TO DISBEG TO START UP THE DISPLAY. DISBEG RETURNS ; WITH A POPJ PDP, CLOK: MOVSI IOS,DISCKR ;INDICATE CLOCK REQUEST SERVICED ANDCAB IOS,DISIOS ;... TLDE IOS,DISUUI MOVSI IOS,DISTAR ;ASK DISPLAY TO RESTART IORB IOS,DISIOS ;... TLNN IOS,DISWAT ;HAS DISPLAY FINISHED? POPJ PDP, ;NO. WIAT FOR IT TO DO SO MOVEI DEVDAT,DISDDB MOVSI TAC,NSHF LDB ITEM,PJOBN TDNE TAC,JBTSTS(ITEM) ;IS SHUFFLE LOCKED OUT? JRST DISBEG ;YES, RESTART DISPLAY AND RETURN IORM TAC,JBTSTS(ITEM) ;NO. LOCK IT OUT. MOVE TAC,JBTADR(ITEM) ;RESET DISHI AND DISREL AFTER SHUFFLING HLRZM TAC,DISHI HRRM TAC,DISREL JRST DISBEG ;RESART DISPLAY AND RETURN ;ADRER SERVICES PROTECTION VIOLATIONS DISCOVERED BY DISNXT. ; IT DOES A CLOSE AND THEN CALLS THE MONITOR'S ERROR PRINTING ; ROUTINES TO INFORM THE USER. ADRER: JSR DISSAV ;SAVE AC'S AGAIN ADRER1: PUSHJ PDP,DISDSP+DCL ;DO A CLOSE MOVEI DEVDAT,DISDDB ;TELL ERROR ROUTINE WHO'S UNHAPPY JRST ADRERR ;GO GRIPE ;DISIN HANDLES LITE PEN UUO (INPUT) IN A RUDIMENTARY FASHION ; BY RETURNING (TO THE ADDR SPECIFIED BY THE ADDR FIELD ; OF THE INPUT UUO) THE LAST PEN COORIDNATES SEEN, DISIN: MOVNI TAC,1 EXCH TAC,PENLOC ;GET LATEST COORDINATES, JRST STOTAC ;STORE AND RETURN ;DISOUT DOES THE WORK OF THE OUTPUT UUO. IT SETS A BIT TO ; INDICATE THAT THE DEVICE IS ACTIVE AND INHIBITS ; INTERUPTS WHICH MAY STILL BE IN PROGRESS. SINCE THE ; MONITOR CALLS WSYNCE BEFORE COMING HERE. THE USER IS ; GUARANTEED AT LEAST ONE PICTURE/OUTPUT. THE USERS MEMORY ; BOUNDS ARE STORED FOR QUICK USE AT INTERRUPT LEVEL W/0 ; SAVING AC'S. THE LOCATION OF THE COMMAND LIST (-1) IS ; STORED FOR USE IN SETTING UP BLKO POINTERS. THE PI ; LOCATIONS (40 + 2J) ARE INITIALIZED WITH A BLKO IN ; THE EVEN LOCATIONS AND A JSR TO DISFIN IN THE ODD LOCATION, ; THE NON-DATA CHANNEL CONSO IS SETUP TO BELIEVE IN THE ; A POPJ PDP, IT RETURNS ON BEHALF OF THE OUTPUT UUO. DISOUT: TLO IOS,IO+DISWAT ;INDICATE OUTPUT; REQUEST START UP TRO IOS,IOACT ;INDICATE DEVICE ACTIVE SUBI UUO,1 ;ALLOW FOR INCREMENT AT INTERRUPT MOVE TAC,BLKLIT ;FEEDS WORDS TO THE DISPLAY MOVEM TAC,DISBLK ;FROM EVEN NUMBERED INTERRUPT LOC MOVE TAC,JSRLIT ;SERVICE THE END OF BLKO MOVEM TAC,DISJSR ;FROM ODD INTERRUPT LOC MOVEI TAC,PENON ;SETUP CONSO BITS ON SPECIAL CHANNEL HRRM TAC,PENINT ;... IORB IOS,DISIOS ;SET IOACT ON; INDICATE OUTPUT HRRZM UUO,DISONE ;SET NEW COMMAND LIST ORIGIN MOVSI IOS,DISUUI IORM IOS,DISIOS ;ALLOW DISPLAY CONSZ DIS,@DISCON ;DISPLAY ALREADY IN USE ANDCAM IOS,DISIOS JRST CLKREQ ;ENTER CLOCK QUEUE REQUEST AND POPJ BLKLIT: BLKO DIS,DISBKO JSRLIT: JSR DISCHL END