Trailing-Edge
-
PDP-10 Archives
-
scratch
-
10,7/unsmon/vbcser.mac
There are 8 other files named vbcser.mac in the archive. Click here to see a list.
TITLE VBCSER - SERVICE ROUTINE FOR DEC VB10C (5.02 OR LATER) - V035
SUBTTL P. M. HURLEY/DAL 14 APR 87
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<1973,1986>
;COPYRIGHT (C) 1973,1974,1975,1976,1977,1978,1979,1980,1984,1986
;BY DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
;ALL RIGHTS RESERVED.
;
XP VVBCSR,035
ENTRY VBCSER
VBCSER:
;THIS SERVICE ROUTINE ALLOWS THE DISPLAY TO BE USED AS A STANDARD DEVICE
;THE I/O INSTRUCTIONS ARE AS FOLLOWS:
; INIT D,15 ;INITIALIZE DISPLAY ON SOFTWARE CHANNEL D
; ;IN DUMP MODE (ONLY DUMP MODE IS ALLOWED ON DISPLAY)
; SIXBIT /DIS/
; 0 ;NO BUFFERS
; ERROR RETURN
; NORMAL RETURN
; CLOSE D, ;STOPS THE DISPLAY
; OR ; AND
; RELEASE D, ;RELEASES THE DEVICE
; INPUT D,ADR ;RECEIVE LIGHT PEN AND ERROR CONDITIONS
; SERVICE ROUTINE RETURNS WITH:
; ADR/ Y,X COORDINATES OF LAST LIGHT PEN HIT
; ADR+1/ DISPLAY ADDRESS COUNTER OF LAST LIGHT PEN HIT
; ADR+2/ Y,X COORDINATES OF FIRST ERROR SINCE LAST INPUT INSTRUCTION
; ADR+3/ ERROR BITS, ADDRESS OF DISPLAY INSTRUCTION CAUSING ERROR
; OUTPUT D,ADR ;START THE DISPLAY
; WHERE:
; ADR/ USER ERROR FLAG ADDRESS, STARTING ADDRESS OF DISPLAY PROGRAM
; ADR+1/ 0 OR DESIRED VIRTUAL PROTECTION AND VIRTUAL RELOCATION
; PROTECTION AND RELOCATION FORMAT IS SIMILAR TO THAT USED BY THE SYSTEM
; I.E. HIGH ORDER 8 PROTECTION BITS ARE LEFT JUSTIFIED IN LEFT HALF
; HIGH ORDER 8 RELOCATION BITS ARE LEFT JUSTIFIED IN RIGHT HALF
; IF 0 IS USED THE PROTECTION AND RELOCATION IS THAT OF THE USER'S JOB
;THE USER ERROR FLAG IS SET TO -1 IF AN ERROR OR A LIGHT PEN HIT OCCURS ON THE DISPLAY
;THE SERVICE ROUTINE HANDLES DISPLAY INTERRUPTS AS FOLLOWS:
; STOP INTERRUPT RESTART AT BEGINING OF DISPLAY PROGRAM AFTER TWO
; JIFFIES HAVE ELAPSED SINCE LAST START OF PICTURE
; ILLEGAL ADDRESS LET THE DISPLAY HANG.
; IT IS UP TO THE USER TO REMEDY THE SITUATION.
; EDGE VIOLATION TREAT AS STOP FLAG, BUT SET USER ERROR FLAG
; LIGHT PEN RESUME DISPLAYING
;DEVICE DATA BLOCK
ENTRY VBCDDB
PENDDB::
VBCDDB::
SIXBIT /DIS/ ;DEVNAM
XWD ^D60*HUNGST,0 ;DEVCHR
DISIOS: 0 ;DEVIOS
EXP VBCDSP ;DEVSER
XWD DVOUT+DVIN+DVLNG,20000 ;DEVMOD
0 ;DEVLOG
0 ;DEVBUF
XWD R,0 ;DEVIAD
0 ;DEVOAD
0 ;DEVSTS
XWD .TYDIS*.TYEST,0 ;DEVSTA
BLOCK 3 ;OTHER DDB LOCATIONS
0 ;(16) DEVESE
0 ;(17) DEVHCW
0 ;(20) DEVCPU
0 ;(21) DEVISN
0 ;(22) DEVDRV
0 ;(23) DEVJOB
BLOCK 1 ;MSGE DDB LOCATIONS
;DISPLAY DISPATCH TABLE
ENTRY VBCDSP
JRST ECOD2## ;SPECIAL ERROR STATUS
JRST REGSIZ## ;GET BUFFER SIZE
JRST DISINI ;INITIALIZATION
POPJ P, ;HUNG DEVICE - STOP JOB AND PRINT ERROR
VBCDSP:: JRST DISRLS ;RELEASE
JRST DISOFF ;CLOSE
JSP U,UUOERR## ;OUTPUT
JSP U,UUOERR## ;INPUT
JRST CPOPJ1## ;ENTER
JRST CPOPJ1## ;LOOKUP
JRST DISOUT ;DUMP OUTPUT
JRST DISIN ;DUMP INPUT (LITE PEN AND ERRORS)
POPJ P, ;SETO
POPJ P, ;SETI
POPJ P, ;GETF
JRST CPOPJ1## ;RENAME
POPJ P, ;CLOSE INPUT
POPJ P, ;DIRECTORY CLEAR
POPJ P, ;MTAPE
; CONSTANTS AND VARIABLES FOR THE NIH DISPLAY SERVICE ROUTINE
IFNDEF FTFBX,<FTFBX==0>
IFNDEF FTGFN,<FTGFN==0>
IFN FTGFN,<>
IFN FTFBX,<>
ENTRY VBCINT
DIS==130 ;DISPLAY DEVICE NUMBER
DISCKR==100 ;DISPLAY CLOCK REQUEST PENDING
DISTAR==400 ;CLOCK REQUEST SERVICED BEFORE PICTURE FINISHED
DISTPR==400000 ;DISPLAY STOPED, DISIOS NEGATIVE
DISWAT==2000 ;DISPLAY IS WAITING FOR CLOCK REQUEST TO BE SERVICED
DISAV: Z ;AC STORAGE AT INTERRUPT LEVEL
DISBEG: Z ;LH=PROTECT AND RELOCATE FOR THE DISPLAY
;RH=STARTING ADDRESS OF DISPLAY PROGRAM
DISCON: EXP VBCCHN## ;DISPLAY GO WORD FOR CONO INSTRUCTION
DISPRT: Z ;DISPLAY PROTECTION LIMIT
DISREL: Z ;RELATIVE DISPLAY RELOCATION AMOUNT
FLAG: Z ;RELATIVE ERROR FLAG ADDRESS
FLGADR: Z ;ABSOLUTE ERROR FLAG ADDRESS
PPRT: POINT 8,DISBEG,8 ;BYTE POINTER FOR PROTECTION
PREL: POINT 8,DISBEG,17 ;BYTE POINTER FOR RELOCATION
PENLOC: Z ;X,Y COORDINATE OF LAST PEN HIT
PENADR: Z ;PROGRAM ADDRESS WHERE HIT OCCURED
ERRLOC: Z ; X,Y COORDINATE OF FIRST ERROR REACHED
ERRADR: Z ; DISPLAY PROGRAM ADDRESS AND ERROR BITS OF ERROR
;DISINI IS CALLED DURING SYSTEM INITIALIZATION TIME OR AFTER
; A 140 RESTART. IT FIRST STOPS THE DISPLAY, PROTECTS AGAINST
; THE DISPLAY BEING RESTARTED AT CLOCK LEVEL, AND CLEARS
; THE LITE PEN AND ERROR LOCATIONS.
DISINI: CONO DIS,20000 ;LOCK DISPLAY OUT OF MEMORY
MOVEI T1,1000 ;LOOP UNTIL DISPLAY HAS STOPPED
SOJGE T1,. ;LOOP...
CONO DIS,40 ;CLEAR FLAGS
MOVEI T1,VBCCHN## ;SET UP DISCON
ADDI T1,20 ;RESUME=20+VBCCHN
HRRM T1,DISIN4 ;STORE IN DISINT
ADDI T1,120 ;DISCON=VBCCHN+140
MOVEM T1,DISCON ;STORE IT IN DISCON
JRST DISIN1
DISRLS:
;DISOFF IS CALLED WHENEVER A CLOSE OR A RELEASE IS DONE. THIS ROUTINE
; ALLOWS THE JOB TO BE SWAPPED OR SHUFFLED, AND CLEARS
; THE LITE PEN AND ERROR LOCATIONS.
DISOFF: MOVE J,.CPJOB## ;PICK UP CURRENT JOB #
PUSHJ P,DISSTP ;TURN DISPLAY OFF
IFN FTFBX,< SKIPN FBXCON## ;IS FUNCTION BOX ON?
JRST .+3 ;NO,CONTINUE
PUSHJ P,FBXSTP## ;YES,STOP THE BOX
JRST UUOERR## ;PRINT ERROR MESSAGE>
DISIN1: MOVSI T1,DISWAT+DISTAR ;IGNOR FURTHER TRAPS BY CLOCK LEVEL
ANDCAM T1,DISIOS ;CLEAR DISPLAY WAIT BIT IN DISIOS
DISIN2: SETOM PENLOC ;INITIALIZE LITE PEN AREA
SETZM PENADR
SETOM ERRLOC ;INITIALIZE ERROR AREA
SETZM ERRADR
POPJ P, ;RETURN
;DISSTP IS CALLED TO STOP THE DISPLAY. IT IS CALLED WITH A
; PUSHJ P,DISSTP
; RETURN HERE AFTER DISPLAY IS STOPPED
; THE DISPLAY IS STOPPED BY SETTING THE LOCK OUT BIT ON THE DISPLAY
; THE JOB THEN GOES INTO A WAIT TO INSURE THAT THE DISPLAY HAS
; COMPLETELY FINISHED
DISSTP: MOVSI S,DISTPR ;FLAG THAT DISPLAY IS BEING STOPPED
IORM S,DISIOS ;FLAG IT IN DISIOS
CONO DIS,20000 ;LOCK DISPLAY OUT OF MEMORY
MOVSI T1,CLKR ;DOES JOB HAVE CLK REQ IN
TDNE T1,JBTSTS##(J) ;I.E. IS IT ALREADY SLEEPING?
POPJ P, ;YES, DON'T SLEEP IT AGAIN
MOVEI T1,^D751 ;SET UP FOR SLEEP ROUTINE
JRST SLEEP## ;SLEEP 4 JIFFIES, RETURN TO CALLER
DISLOK: MOVSI T1,NSHF!NSWP ;CHECK IF JOB LOCKED
TDNE T1,JBTSTS##(J)
JRST CPOPJ1## ;YES IT IS
MOVEI S,IOIMPM ;NO, SET THE IMPROPER MODE BIT
IORB S,DISIOS
POPJ P, ;GIVE ERROR RETURN
;USER IS REQUIRED TO LOCK HIS JOB FIRST
;DISINT RECEIVES CONTROL WHENEVER THE DISPLAY INITIATES AN
; INTERRUPT ON THE P-10. IT INTERPRETS THE INTERRUPT AND
; PERFORMS THE NECESSARY ACTIONS.
; STOP CONDITION - CHECKS TO SEE IF THE DISPLAY SHOULD BE RESTARTED
; IF TWO JIFFIES HAVE ELAPSED SINCE THE START OF THE PICTURE
; THE DISPLAY WILL BE RESTARTED AT THE BEGINING I.E. THE
; ADDRESS GIVEN AT THE LAST OUTPUT COMMAND
; LITE PEN HIT - SAVE THE X AND Y COORDINATES AND THE ADDRESS COUNTER
; ERROR CONDITION - SAVE THE X AND Y COORDINATES AND ADDRESS COUNTER
; IF THE ERROR IS NOT AN ILLEGAL ADDRESS, CLEAR THE FLAGS
; AND RESUME, OTHERWISE JUST DISMISS THE INTERUPT LEAVING
; THE DISPLAY STOPPED.
PENINT::
VBCINT::
DISINT: CONSO DIS,47400 ;WAS THIS A DISPLAY INTERRUPT
JRST DISINT ;NO, MOVE ON TO NEXT ROUTINE IN CHAIN
CONI DIS,DISAV ;PICK UP ERROR BITS
EXCH T1,DISAV ;SAVE T1
TRNE T1,2000 ;LIGHT PEN HIT?
JRST LPHIT ;YES
CONO DIS,40 ;CLEAR FLAGS
TRNE T1,400 ;STOP FLAG?
JRST STPFLG ;YES
SKIPL ERRLOC ;HAS THERE BEEN AN ERROR SINCE THE LAST INPUT
JRST DISIN3 ;YES, DONT STORE THIS ERROR
DATAI DIS,ERRLOC ;GET THE X AND Y COORDINATES
DATAI 134,ERRADR ;GET THE ADDRESS COUNTER
SOS ERRADR ;MAKE IT POINT TO CORRECT LOCATION
HRLM T1,ERRADR ;STORE ERROR BITS
DISIN3: SKIPE FLAG ;WAS AN ERROR FLAG SPECIFIED
SETOM @FLGADR ;YES, SET ERROR FLAG IN USER AREA
SKIPL DISIOS ;DISPLAY BEING STOPPED?
TRNE T1,45000 ;ILLEGAL ADDRESSOR EDGE FLAG
JRST DISIN6 ;YES, DO NOT RESUME
DISIN4: CONO DIS,VBCCHN## ;RESUME
DISIN5: MOVE T1,DISAV ;RESTORE T1
JEN @VBCCHL## ;DISMISS THE INTERRUPT
DISIN6: TRNN T1,40000 ;ILLEGAL ADDR
JRST STPFLG ;NO, GO TREAT EDGE FLAG LIKE A STOP FLAG
CONO DIS,40 ;CLEAR FLAGS
JRST DISIN5 ;DO NOT RESUME
LPHIT: DATAI DIS,PENLOC ;PICK UP X AND Y COORDINATES
DATAI 134,PENADR ;GET ADDRESS COUNTER
SOS PENADR ;DECREMENT ADDRESS COUNTER
HRRZS PENADR ;MASK OUT PROTECTION AND RELOCATION BITS
JRST DISIN3 ;RESUME DISPLAY AND DISMISS INTERRUPT
;STPFLG IS CALLED WHENEVER A STOP CONDITION IS DETECTED.
; THE PURPOSE OF THIS ROUTINE IS TO RESTART THE DISPLAY IF THE CLOCK
; HAS RUN OUT OR TO MARK THAT THE DISPLAY NEEDS TO BE STARTED
; AS SOON AS THE THE CLOCK REQUEST DOES RUN OUT. IF THE MONITOR HAS
; REQUESTED THAT THIS JOB BE SHUFFLED THIS ROUTINE WILL TURN OFF
; THE NSHF BIT AND GO BACK TO SLEEP, ALLOWING THE JOB TO BE MOVED.
STPFLG: EXCH T1,DISAV ;RESTORE T1
JSR VBCSAV## ;SAVE THE AC'S AND SET UP P
MOVSI S,DISWAT ;INDICATE THAT THE DISPLAY IS WAITING
IORB S,DISIOS ;PICK UP DISIOS
TLNE S,DISTPR ;IS DISPLAY BEING STOPPED?
JRST VBCRET## ;YES, DO NOT RESTART IT
TLNE S,DISTAR ;HAS CLOCK TRIGGERED YET
PUSHJ P,DISTR1 ;YES, RESTART THE DISPLAY
JRST VBCRET## ;RESTORE AC'S AND DISMISS THE INTERRUPT
;DISIN IS CALLED ON AN INPUT UUO. IT RETURNS TO THE USER
; THE COORDINATES AND ADDRESS OF THE LAST LIGHT PEN HIT AND
; THE ADDRESS, COORDINATES AND ERROR BITS OF THE FIRST ERROR
; ENCOUNTERED SINCE THE LAST INPUT COMMAND.
; THE USER COMMAND IS AS FOLLOWS:
; INPUT D,ADDRESS
; THE SERVICE ROUTINE RETURNS THE FOLLOWING INFORMATION IN ADDRESS
; ADDRESS/ XWD X,Y OF LAST LITE PEN HIT
; ADDRESS+1/ ADDRESS COUNTER
; ADDRESS+2/ XWD X,Y OF FIRST ERROR SINCE LAST INPUT
; ADDRESS+3/ XWD ERROR BITS,ADDRESS COUNTER
DISIN: SOS M ;PUTWD1 WILL INCREMENT M
MOVE T2,[XWD -4,PENLOC]
MOVE T1,(T2) ;GET ADR OF NEXT DATA WORD TO BE STORED
PUSHJ P,PUTWD1## ;STORE WORD IN USER'S AREA
AOBJN T2,.-2 ;LOOP FOR ALL 4 ARGUMENTS
JRST DISIN2 ;INITIALIZE THE INPUT AREA AND RETURN
;DISOUT IS CALLED WHEN AN OUTPUT COMMAND IS EXECUTED. IT SETS
; UP THE PROTECTION AND RELOCATION REGISTER AND STARTS THE
; DISPLAY AT THE SPECIFIED ADDRESS
; IT ALSO SETS UP THE ADDRESS OF THE ERROR FLAG IN THE USER AREA
; THE FORMAT OF THE CALL IS THE FOLLOWING:
; OUTPUT D,ADDRESS
; WHERE,
; ADDRESS/ XWD FLAG ADDRESS, DISPLAY STARTING ADDRESS
; ADDRESS+1/ XWD PROTECTION, RELOCATION (RELATIVE)
DISOUT: MOVE J,.CPJOB## ;PICK UP JOB NUMBER
PUSHJ P,DISSTP ;STOP DISPLAY
PUSHJ P,GETWDU## ;GET FIRST ARGUMENT
HRRM T1,DISBEG ;STORE STARTING ADDRESS
HLRZS T1 ;GET FLAG ADDRESS
SKIPE T1 ;IF ZERO THEN NO FLAG ADDRESS
PUSHJ P,UADRCK## ;CHECK THE FLAG ADDRESS
MOVEM T1,FLGADR ;STORE ADDRESS OF FLAG
MOVEM T1,FLAG ;SAVE RELATIVE ADDRESS OF FLAG
PUSHJ P,GETWD1## ;GET SECOND ARGUMENT
SKIPN T1 ;ZERO?
DISOU1: HLLZ T1,R ;SUBSTITUTE JOBS PROTECTION AND RELOCATION
HLRZM T1,DISPRT ;SAVE PROTECTION
HRRZM T1,DISREL ;SAVE RELOCATION
HLRZ T1,R ;GET JOBS PROTECTION
SUB T1,DISREL ;SUBTRACT RELATIVE RELOCATION
SUB T1,DISPRT ;SUBTRACT PROTECTION
JUMPL T1,DISOU1 ;IF NOT, USE JOB'S PROTECTION AND RELOCATION
HRRZ T1,R ;PICK UP JOB'S RELOCATION
ADDM T1,FLGADR ;RELOCATE FLAG ADDRESS
ADD T1,DISREL ;DISREL HAS RELATIVE RELOCATION OF JOB
ASH T1,-12 ;SHIFT OUT LOW ORDER 10 BITS
DPB T1,PREL ;DEPOSIT RELOCATION BYTE
MOVE T1,DISPRT ;GET PROTECTION
ASH T1,-12 ;SHIFT OUT LOW ORDER 10 BITS
DPB T1,PPRT ;DEPOSIT PROTECTION BYTE
PUSHJ P,DISLOK ;GO SEE IF USER IS LOCKED IN CORE
JRST DISRLS ;NOT LOCKED, GO RELEASE DEVICE
DISTR1: MOVSI S,DISTAR+DISWAT+DISTPR ;INDICATE FRESH PICTURE
ANDCAM S,DISIOS ;IN DISIOS WORD
CONO DIS,20140
CONO DIS,20040
DATAO 134,DISBEG ;LOAD PROT, RELOC, AND STARTING ADDRESS
CONO DIS,@DISCON ;START THE DISPLAY
;CLKREQ IS CALLED TO PUT A TWO JIFFY WAIT REQUEST IN THE
; CLOCK QUEUE. IF THERE IS ALREADY ONE THERE IT JUST RETURNS
CLKREQ:
SYSPIF
CLKRQ0: MOVSI S,DISCKR ;CHECK FOR PREVIOUS REQUEST
MOVE T1,CLOKRT ;PICK UP CLOCK RQUEST WORD
TDOE S,DISIOS ;ENTER ONLY A SINGLE CLOCK REQUEST
JRST CLKRQ1
IDPB T1,CLOCK## ;PLACE REQUEST IN QUEUE
IBP CLOCK## ;2 WORDS/ENTRY
SETOM CLKNEW## ;INDICATE NEW ENTRY
CLKRQ1: IORM S,DISIOS ;PROTECT AGAINST DUPLICATE REQUEST
JRST ONPOPJ## ;RETURN
CLOKRT: XWD CLOK,1 ;CONTROL FOR CLOCK QUEUE, 1 JIFFY
;CLOK IS ENTERED AT CLOCK LEVEL IN RESPONSE TO A CLOCK REQUEST IN THE
; CLOCK QUEUE. A BIT IS SET TO INDICATE THAT THE CLOCK PERIOD HAS
; ELAPSED. IF THE DISPLAY IS STILL IN PROGRESS CLOK DOES NOTHING
; OTHERWISE IT RESTARTS THE JOB
CLOK: MOVSI S,DISCKR ;INDICATE CLOK REQ SERVICED
ANDCAB S,DISIOS ;AND SET UP S
TLNE S,DISTPR ;TRYING TO STOP DIS (RELEASE?)
POPJ P, ;YES,EXIT
MOVSI S,DISTAR ;MARK THAT DISPLAY IS READY
SYSPIF ;TURN OFF PI SYSTEM FOR CHECK
IORM S,DISIOS ; TO BE RESTARTED
MOVSI S,DISWAT ;IS DISPLAY WAITING ALREADY
TDNN S,DISIOS ; TO BE RESTARTED?
JRST CLKRQ0 ;NO, JUST PUT IN A CLOCK REQUEST
SYSPIN ;TURN INTERUPTS BACK ON
JRST DISTR1 ;YES, GO RESTART IT
END