1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-01 01:19:17 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

386 lines
13 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 BE USED
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
; 1973,1974,1975,1976,1977,1978,1979,1980,1984,1986,1988.
;ALL RIGHTS RESERVED.
.CPYRT<1973,1988>
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