Trailing-Edge
-
PDP-10 Archives
-
bb-x130a-sb
-
disser.mac
There are 8 other files named disser.mac in the archive. Click here to see a list.
TITLE DISSER - DISPLAY SERVICE ROUTINE FOR TYPES 340, VP10, & 30 V042
SUBTTL R. GRUEN/CHW/RCC/DAL 02 OCT 79
SEARCH F,S
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
.CPYRT<
COPYRIGHT (C) 1973,1974,1975,1976,1977,1978,1979,1980,1984 BY DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
>
XP VDISSR,042
ENTRY DISSER
DISSER::
;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 POINTER LIST IS AS FOLLOWS:
; RH=0 END OF COMMAND POINTER LIST
;
; RH=ADR LH=0 ADR IS ADDRESS OF THE NEXT SECTION OF THE
; RH=0 LH=N SET INTENSITY TO N ONLY FOR VP10 & TYPE 30. N IS
; 3 BITS WIDE FOR 30 2 BITS WIDE FOR VP10.
; RH=L-1 LH=-N OUTPUT TO THE DISPLAY THE N WORDS OF COMMANDS
; BEGINNING AT LOCATION L.
; NOTE THAT THE CHECK FOR END OF LIST IS MADE FIRST.
; ALL ADDRESSES ARE CHECKED FOR VALIDITY (I.E., THEY MUST
; BE WITHIN USER AREA) BEFORE ANY MEM REF IS MADE.
;DIS DEVICE DATA BLOCK
DISDDB::SIXBIT /DIS/
XWD 6*HUNGST,0 ;HUNG TIME IS 63 SECONDS
DISIOS: 0
EXP DISDSP
XWD DVDIS+DVOUT+DVIN+DVLNG,20000
0
0
XWD R,0
0
DISSTS::0
DISSTA: XWD .TYDIS,0
DISXTR: 0
DISEVM: 0
DISPSI: 0
DISESE: 0
DISHCW: 0
DISCPU: 0
DISJOB: 0
PENLOC::0
DISPNT: 0
DISBKO::0
DISHI: 0
DISONE: 0
DISAV: 0
DISAV1: 0
DISREL::XWD T1,0
XP PENDDB,0 ;TO SATISFY AREQUEST IN COMMON.
; THERE REALLY IS NO PEN DDB.
DISTAR==100 ;CLOCK FINISHED BEFORE PICTURE
DISWAT==200 ;PICTURE FINISHED BEFORE CLOCK
DISCKR==400 ;CLOCK REQUEST IN CLOCK QUEUE
DISUUI==1000
DEFINE ADRCHK(A)
<
CAILE A,JOBPFI##
CAMLE A,DISHI
JRST EXIT2
>
JRST ECOD2## ;SPECIAL ERROR STATUS
JRST REGSIZ## ;BUFFER LENGTH CAN BE GOTTEN FROM DDB
JRST DISINI ;INITILIZATION
POPJ P, ;PRINT ERROR AND STOP JOB
DISDSP::JRST DISSTP ;RELEASE
JRST DISSTP ;CLOSE
JRST UUOERR## ;OUTPUT
JRST UUOERR## ;INPUT
JRST CPOPJ1## ;ENTER
JRST CPOPJ1## ;LOOKUP
JRST DISOUT ;DUMP OUTPUT (THAT'S US)
JRST DISIN ;DUMP INPUT (AS IN PEN)
POPJ P, ;SETO
POPJ P, ;SETI
POPJ P, ;GETF
JRST CPOPJ1## ;RENAME
POPJ P, ;CLOSE INPUT
POPJ P, ;DIRECTORY CLEAR
POPJ P, ;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 TURNS 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 CHANNEL'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 P,DISINI OR A JRST DISINI.
DISINI: JRST SETCON## ;GOES OFF TO COMMON - SETS UP THE DISPLAY
;& RETURNS TO DISIN1
DISSTP:
DISIN1::SETOM PENLOC
MOVSI S,DISWAT+DISUUI ;IGNORE FURTHER TRAPS
HRRI S,IOACT ;INDICATE DEVICE INACTIVE
ANDCAB S,DISIOS ;INTO DEVICE DATA BLOCK
;IN I/O WAIT?
PUSHJ P,SETIOD## ;YES, UNWAIT HIM
DISOFF: XCT DISCNO## ;REMOVE THE DISPLAY'S CHANNEL ASSIGNMENTS
HLLZS PENINT## ;DON'T EXPECT ANY ON LITE PEN
CONO PI,DISPOF## ;TURN OFF DISPLAY'S BLKO CHANNEL
POPJ P,
DISINT::SKIPA
JRST .-1 ;WILL BE CHANGED BY SYSINI
XCT DISCNI## ;STORE CONI STATUS
JRST DISFIN
;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 FURTHER 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 DISBKO AND THE ROUTINE RETURNS TO THE CALLING
; LOCATION +3.
DISNXT: 0 ;JSR AT INTERRUPT OR UUO LEVELS
DISNX1::AOSA T1,DISPNT ;GET NEXT POINTER FROM LIST
ILUP: HRRZM T1,DISPNT ;UPDATE POINTER POINTER
ADRCHK T1
MOVE T1,@DISREL ;GET NEXT WORD IN POINTER LIST
MOVEM T1,DISBKO ;PLACE IN BLKO POINTER
HLROM T1,DISAV1 ;GET NEGATIVE WORD COUNT(MAKE LH NEG. TOO)
JRST ENDCHK## ;GOES OFF TO COMMON - CHECKS FOR END OF LIST
;(AND INTENSITY CHANGES FOR VP10 &T30)
;& RETURNS TO EXIT0
EXIT0:: TLZN T1,-1 ;NO. POINTER TO NEW LIST?
JRST ILUP ;YES.
CAIL T1,JOBPFI## ;NO. ADDRESS IN BOUNDS?
CAML T1,DISHI
JRST EXIT2 ;NO
SUB T1,DISAV1 ;YES, ADR. OF LAST WORD IN BLOCK.
ADRCHK T1
HRRZ T1,DISREL ;FORM ABSOLUTE ADDR
ADDM T1,DISBKO ;IN THE BLKO POINTER WORD
AOS DISNXT ;RETURN 2,4
EXIT1:: AOS DISNXT
EXIT2: MOVE T1,DISAV
JRST 2,@DISNXT ;...
;DISFIN RECEIVES CONTROL WHEN THE DISPLAY'S BLKO POINTER REACHES
; ZERO. IT SAVES THE TWO AC'S WHICH DISNXT USES AND
; DOES A JSR TO DISNXT. ON A NORMAL RETURN IT RESTORES THE
; AC'S AND DISMISSES THE INTERRUPT. ON A "NO MORE DATA"
; RETURN IT TRANSFERS CONTROL TO OVT2 FOR FURTHER
; DECISION AS TO WHETHER OR NOT TO CONTINUE DISPLAYING.
DISFIN::MOVEM T1,DISAV ;SAVE AC'S
JSR DISNXT ;SETUP NEXT BLKO POINTER
JRST ADRER
JRST OVT2 ;RETURN HERE IF NO NEXT POINTER
JEN @DISCHL## ;LET THE SCOPE DO THE REST
;OVT2 RECEIVES 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 RETURNS 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.
OVT2: JSR DISSAV## ;ASK EXEC TO SAVE AC'S
MOVEI F,DISDDB ;SETUP ACS
LDB J,PJOBN##
PUSHJ P,DISOFF
MOVSI T1,SHF!CMWB ;SEE IF SYSTEM WAITING TO SHUFFLE OR EXECUTE A COMMAND
MOVSI S,DISWAT ;INDICATE PICTURES FINISHED
IORB S,DISIOS ;...
TLON S,DISUUI ;RESUME DISPLAY, NEW UUO.
JRST OVT6 ;YES, STAY IN IO WAIT
OVT4: TLNE S,DISTAR ;DID CLOCK FINISH BEFORE PICTURE?
PUSHJ P,CLKREQ ;YES, PUT IN CLOCK REQUEST.
OVT3: TRZ S,IOACT ;SIGNAL DISPLAY CAN BE CLOSED
;IS DISPLAY CAUSING AN IO-WAIT?
PUSHJ P,SETIOD## ;UNWAIT THE JOB
MOVEM S,DISIOS ;RESTORE IO CONTROL WORD
JRST DISRET## ;RESTORE AC'S AND DISMISS
OVT6: MOVEM S,DISIOS
TDNE T1,JBTSTS##(J) ;DOES SYSTEM WANT TO SHUFFLE THIS JOB?
JRST OVT4 ;YES
PUSHJ P,DISBEG ;START NEW COMMAND LIST
JRST DISRET##
;DISBEG IS CALLED WITH A PUSHJ P,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 ASKS 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 QUEQUE 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 S,DISTAR+DISWAT ;INDICATE FRESH DISPLAY
ANDCAB S,DISIOS ;...
HRRZ T2,DISONE ;GET POINTER LIST ADDR (-1)
HRRZM T2,DISPNT ;RESET POINTER POINTER WITH IT
CONO PI,DISPOF##
JSR DISNXT ;ASK FOR FIRST WORD FOR BLKO
JRST ADRER1
JRST DISSTP ;NULL LIST, CLOSE
PUSHJ P,CLKREQ ;ENTER CLOCK QUEUE REQUEST
XCT DISCNA## ;INITIALIZE THE DISPLAY
MOVEI T1,PENON## ;ALLOW SPECIAL PI INTERRUPTS
HRRM T1,PENINT## ;...
CONO PI,DISPON## ;ALLOW BLKO INTERRUPTS
POPJ P, ;RETURN
CLKREQ: MOVSI S,DISCKR ;IF NO CLOCK INTERRUPT REQUESTED
MOVE T1,CLOKRT ;RESET TIMER
PIOFF ;INHIBIT INTERRUPTS
TDON S,DISIOS ;ENTER ONLY A SINGLE CLOCK REQUEST
JRST [IDPB T1,CLOCK## ;PLACE REQUEST IN QUEUE
IBP CLOCK## ;TWO ENTRIES / REQUEST
JRST .+1]
IORM S,DISIOS ;PROTECT AGAINST A DUPLICATE REQUEST
PJRST ONPOPD##
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 P,
CLOK: MOVSI S,DISCKR ;INDICATE CLOCK REQUEST SERVICED
ANDCAB S,DISIOS ;...
TLOE S,DISUUI
MOVSI S,DISTAR ;ASK DISPLAY TO RESTART
IORB S,DISIOS ;...
TLNN S,DISWAT ;HAS DISPLAY FINISHED?
POPJ P, ;NO, WAIT FOR IT TO DO SO
MOVEI F,DISDDB
LDB J,PJOBN##
MOVM T2,FINISH## ;JOB NUMBER OF JOB BEING SWAPPED IN OR OUT
SKIPE T1,JBTADR##(J) ;IS THE JOB IN CORE
CAMN J,T2 ;AND NOT ON THE WAY OUT OR IN?
JRST CLOK1 ;NO, CANNOT RESUME DISPLAY
; GO CAUSE IT TO BE SWAPPED IN
HLRZM T1,DISHI ;RESET DISHI AND DISREL AFTER SHUFFLING
HRRM T1,DISREL
MOVEI S,IOACT ;MAKE THE JOB I/O ACTIVE
IORM S,DISIOS ;SO IT WON'T GET SHUFFLED OR SWAPPED
JRST DISBEG ;RESART DISPLAY AND RETURN
CLOK1: SKIPE FIT## ;SOME JOB WANT TO COME IN?
PJRST CLKREQ ;YES, LET IT
CAME J,FINISH## ;DON'T BOTHER IF ALREADY COMING IN
MOVEM J,FIT## ;SET FIT SO THE SWAPPER WILL SWAP IT IN
PJRST CLKREQ ;AND PUT IN A CLOCK REQUEST FOR LATER CHECK
;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 P,DISDSP+DCL ;DO A CLOSE
MOVEI F,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 COORDINATES SEEN.
DISIN: MOVNI T1,1
EXCH T1,PENLOC ;GET LATEST COORDINATES.
PJRST PUTWDU## ;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 LOCATION AND A JSR TO DISFIN IN THE ODD LOCATION.
; THE NON-DATA CHANNEL CONSO IS SETUP TO BELIEVE IN THE
; A POPJ P, IT RETURNS ON BEHALF OF THE OUTPUT UUO.
DISOUT: XCT DISCZA## ;DISPLAY ALREADY IN USE?
JRST DISOU2 ;YES
DISOU1: XCT DISTST## ;NO,CONO DIS,DISCHN
XCT DISCNI## ;READ STATUS
SKIPE DISSTS ;IS IT REALLY THERE?
JRST DISOU2 ;YES
PUSHJ P,HNGSTP## ;NO, GIVE ERROR MESSAGE
JRST DISOU1 ;AND TRY AGAIN
DISOU2: TLO S,IO+DISWAT ;INDICATE OUTPUT; REQUEST START UP
TRO S,IOACT ;INDICATE DEVICE ACTIVE
SUBI M,1 ;ALLOW FOR INCREMENT AT INTERRUPT
MOVE T1,BLKLIT## ;FEEDS WORDS TO THE DISPLAY
MOVEM T1,DISBLK## ;FROM EVEN NUMBERED INTERRUPT LOC
MOVE T1,JSRLIT ;SERVICE THE END OF BLKO
MOVEM T1,DISJSR## ;FROM ODD INTERRUPT LOC
MOVEI T1,PENON## ;SETUP CONSO BITS ON SPECIAL CHANNEL
HRRM T1,PENINT## ;...
IORB S,DISIOS ;SET IOACT ON; INDICATE OUTPUT
HRRZM M,DISONE ;SET NEW COMMAND LIST ORIGIN
MOVSI S,DISUUI
IORM S,DISIOS ;ALLOW DISPLAY
XCT DISCZA## ;DISPLAY ALREADY IN USE
ANDCAM S,DISIOS ;YES
JRST CLKREQ ;ENTER CLOCK QUEUE REQUEST AND POPJ
JSRLIT: JSR DISCHL##
END
DISEND: