1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;; This program is free software; you can redistribute it and/or
4 ;;; modify it under the terms of the GNU General Public License as
5 ;;; published by the Free Software Foundation; either version 3 of the
6 ;;; License, or (at your option) any later version.
8 ;;; This program is distributed in the hope that it will be useful,
9 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 ;;; General Public License for more details.
13 ;;; You should have received a copy of the GNU General Public License
14 ;;; along with this program; if not, write to the Free Software
15 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 DIS==130 ;DISPLAY PROCESSOR
20 DISMAP==134 ;MEM PROT & REL
24 ADSTAR: CONO PI,CLKOFF ;TURN OFF CLOCK TO PREVENT POSSIBLE GOBBLING BY ANOTHER USER
25 PUSHJ P,DISCHK ;CHECK IF THIS USER OWNS THE DISPLAY
26 JRST CLKONJ ;RESTART THE CLOCK
27 SETZM E.SPGH ; QSWI1 switch
28 SETZM E.SCLS ; clear clobber switch
29 SKIPL DISUSR ; no user
30 CAMN U,DISUSR ; skips if different index
31 JRST NOCLBR ; dont untie pages
32 MOVEM U,E.SCLS ; else remember to untie
33 SKIPA ; and dont hack disusr
34 NOCLBR: MOVEM U,DISUSR ;GIVE IT TO HIM IF NO ONE ELSE OWNS IT
35 CONO PI,CLKON ;RESTORE THE CLOCK
36 CONO DIS,5010 ;SET STOP, CLEAR PIA
37 XCTR XR,[HRRZ A,(C)] ; causes pg ld, fetches droot
38 HRRM A,DSTADD ; remember for restarts
39 XCTR XR,[MOVE B,(A)] ; load display page
40 PUSHJ P,SWTL ; circular switch gobble
42 LSH A,-10. ; page number
43 SKIPN E.SCLS ; clobbering old user index ?
44 JRST RDSCLB ; if not, skip it
45 MOVE U,DISUSR ; old useri
46 PUSHJ P,E.SCLB ; untie pages
48 EXCH U,E.SCLS ; clear switch, fetch new usri
50 RDSCLB: PUSHJ P,UPLC ; users pg n into circular pointer
51 PUSHJ P,CHACK ; go in circles
52 SKIPL C ; 4.9 implies real core in loop
53 JRST NOTIED ; if not, dont tie down -- still swapped out
54 MOVE T,J ; MEMPNT INDEX
56 PUSHJ P,E.SPG1 ; go tie it down
57 NOTIED: PUSHJ P,LSWPOP ; clear switch
60 HRLI T,<NUVPG/2>_1 ;DBL left 1 relative to 10
65 ; now start (or restart if from E.SPGI) E&S
67 RDSTAR: CONO DIS,515330 ;RESET THE WORLD
68 SETOM E.SSYS ;FLAG=MAP ON (USER MODE)
69 CONO DIS,515330 ;CLEAR 3D CLIPPER
70 MOVEI I,1000 ;SET COUNT FOR TIMEOUT
71 MOVE H,DSTADD ; fetch c(0)
72 MOVEM H,E.SPM ; store in status block
73 MOVSI H,140000 ; status bits -- map high and low
74 MOVEM H,E.SPM+1 ; set status
75 SKIPA H,[-ADSTN,,ADSTL-1]
77 CONSO DIS,604000 ;SKIP IF DONE OR ERROR
80 JUMPE I,CPOPJ ;FAIL IF TIME OUT ON START
81 CONSZ DIS,600000 ;CHECK FOR EXECUTIVE ERRORS
82 JRST ADXIT ;GIVE INTERRUPT, NO SKIP
85 ADCON1: CONO DIS,400 ;RUN
86 ADXIT: CONO DIS,222010+DISCHN ;ALARM+MPV+STOP+PIA
89 ADSTPX: CONSZ DIS,1040 ;FAIL TO SKIP IF MEM OR SEL STOP
90 JRST ILUUO ;ERROR IF STOP
91 ADSTOP: CAME U,DISUSR ;SKIP IF USER OF SCOPE
92 JRST URET ;EXIT IF NOT SCOPE USER
93 ADSTPY: CONO DIS,5000 ; IOSTOP+STOP.INT.OFF
94 CONO DIS,300 ;LR.PROG+CLR.HIT
95 CONSO DIS,640000 ;SKIP IF PARITY, NXM, MPV ON
96 JRST E.SUSM ;MAP IS STILL ON
97 CONO DIS,400000 ;CLEAR MASTER STUFF (TURNS OFF MAP)
98 CONO DIS,400000 ;CLEAR 3D CLIPPER
100 AOS E.SSYS ;REMEMBER PAGING IS OFF
101 E.SUSM: CONSO DIS,4000 ;SKIP IF STOPPED AND READY
102 PUSHJ P,UFLS ;ELSE WAIT UNTIL READY
105 ADCONT: PUSHJ P,ADSTPX ;ILLEGAL IF MEM OR SEL STOP
106 PUSHJ P,E.SFU ; force user mode if necessary
107 POPJ P,0 ; gross lossage (hardware)
110 ADSTEP: PUSHJ P,ADSTPX ;ILLEGAL IF MEM OR SEL STOP
111 PUSHJ P,E.SFU ; Force User mode (reloads map and skips)
112 POPJ P,0 ; lossage if here
116 ADWORD: XCTR XR,[MOVE J,(J)] ; fetch c(AC)
117 PUSHJ P,ADSTOP ;MAKE SURE IT IS STOPPED
118 PUSHJ P,E.SFU ;RELOAD MAP IF NECESSARY
119 POPJ P,0 ;MAP NOT IN USER MODE
123 ADCLOS: CAME U,DISUSR
125 CONO DIS,5010 ;STOP, PI OFF
126 SETZM E.SPGW ;CLEAR PAGE WAIT
127 PUSHJ P,SWTL ;LOCK CIRCULAR SWITCH
130 PUSHJ P,LSWPOP ;RESTORE SWITCH
134 DISCHK: MOVE B,UNAME(U)
139 ADRSTA: ;READ STATE, WRITE STATE NOT IN.
142 ;E&S PAGER HAS TO REFERENCE 0 TO INITIALLIZE MAP.
146 JRST POPJ1 ;SKIP IF MAP OFF
147 E.SFU2: MOVSI T,140000 ;ENTRY FOR DCRRST
148 MOVEM T,E.SPM+1 ;RESETS STATUS
149 DATAO DIS,[NWSTK 1] ;STORE SP AT 0
150 PUSHJ P,E.SWT ;CANNOT UFLS -- NWSTK MIGHT BE REISSUED
151 POPJ P,0 ;HARDWARE LOSSAGE
152 DATAO DIS,E.SPM ;OUTPUTS C(0) (RELOADS SP)
155 SETOM E.SSYS ;REMEMBER MAP ON
159 MOVEI J,100 ;COUNT FOR TIMEOUT
160 CONSZ DIS,4000 ;STOPPED AND READY? ELSE SKIP
161 JRST POPJJ1 ;SKIP RET IF READY
162 CONSO DIS,640000 ;OTHER FLAVORS OF LOSSAGE
163 SOJG J,E.SWT+2 ;COUNT IF STILL OK
164 CONO DIS,10 ;STOP FOR GOOD
165 JRST POPJJ ;LOSES, NO SKIP RETURN
167 ADSTL: 000501052405 ;LI DIR,052405(PROGM)
168 300541,,[-1,,] ;LOCLA SELINT,[-1,,](1)
169 300441,,[102521,,] ;LOCLA CDIR,[102521,,](1)
170 302641,,[3777,,3777] ;LOCLSA VIEW,[3777,,3777](1)
171 302701,,[377777377777] ;LOCLSA WIND,[377777377777](1)
172 100,,0 ; (JMP 0) load page map and go
176 DSTADD: 000100,, ;JMP TO CODE (FILL IN ADDRESS)
178 ; E&S PAGE MAP STATUS BLOCK
184 MXDISP==16. ; maximum number of tied pages
185 DISPGP: -MXDISP,,0 ; page pointer for mmp pages
186 DISSWP: BLOCK MXDISP ; MMSWP INDICES TIED
187 E.SPGW: 0 ; if non zero, E&S page wait page
188 E.SPGH: 0 ; flag for QSWI1
189 E.SCLS: 0 ; if non zero, new userI flushing disusr
190 E.SSYS: 0 ; flag for pager on/off
191 E.SIST: 0 ; ststus word at last interrupt
193 ; counts for debugging
195 E.SNTI: 0 ; # pages tied down (total during system run)
196 E.SNUT: 0 ; # pages untied (should = .-1 after dclose)
198 E.SREL: 0 ; # times pages in DISSWP table were relocated
200 ; end of debug counts
203 DSTPCT: -1 ; STOP COUNT TO HANDLE REDUNDANT STOPS
204 DSCONI: 0 ;LAST CONI FROM DISPLAY
205 EBRKA: 0 ;INTERRUPT SAVE AC
208 ESBRK: 0 ;HANDLE E&S INTERRUPT
212 CONSO DIS,7 ;PI CHAN ASSIGNED?
213 JRST 12,@ESBRK ;NO, CANNOT INTERRUPT
215 CONO DIS,10 ;DEASSIGN PI CHANNEL
216 MOVEM U,EBRKU ;SAVE AC'S
218 MOVEI A,%PILTP ;GIVE "LTPEN" INT (CLASS 3)
219 CONSZ DIS,640040 ;PAR, NXM, MPV, SELECT
220 JRST E.SFLT ; check page fault
221 E.SUIN: SKIPL U,DISUSR
223 E.SPFR: MOVE A,EBRKA ;UNSAVE AC'S
225 JRST 12,@ESBRK ;RETURN
227 E.SFLT: CONSZ DIS,200000 ; skip if not NXM (ie not fault)
228 SKIPL E.SPM+1 ; error bit set in status word ?
229 JRST E.SILM ; if not, real illegal mem
230 LDB U,[121000,,E.SPM+1] ; get page #
231 HRROM U,E.SPGW ; save for loading (LH is flag)
232 MOVE U,E.SPM+1 ; get status
233 MOVEM U,E.SIST ; save status for later (debugging)
234 LDB U,[330300,,U] ; access and pgerr
235 CAIE U,2 ; read write/first error
236 SKIPN U ; no access -- page fault
237 JRST E.SPFR ; gives a page fault
238 E.SILM: SETZM E.SPGW ; if not page fault, don't rq load
239 MOVEI A,%PIDIS; mem fault bits
240 JRST E.SUINT ; give user interrupt
242 DCRSTP: CAMN U,DISUSR ;IS THIS U ON DIS
243 AOSE DSTPCT ; HERE IF THIS USER, SKIP IF FIRST CALL TO STOP
244 POPJ P, ;RETURN IF NOT
245 CONSO DIS,7 ; SKIP IF CURRENTLY RUNNING
246 POPJ P, ; RETURN IF NOT RUNNING NOW
247 CONI DIS,DSCONI ;SAVE STATE FOR RESTART
248 CONO DIS,5000 ;OTHERWISE STOP IT
250 CONSO DIS,4000 ;SKIP IF STOP ACTUALLY TAKES HOLD
251 SOJG TT,.-1 ;TIME-OUT LOOP
252 JUMPG TT,CPOPJ ;DID NOT TIME OUT, OK
253 CONO DIS,10 ;DISABLE DISPLAY (CLEAR PIA)
254 AOS DISSTQ ;CAUSE "SYSTEM CLOBBERED" ... ON SYS CONSOLE
258 E.SLPM: PUSHJ P,DCRSTP ; stop before loading page map
259 DCRRST: CAMN U,DISUSR ;IS THE CURRENT U ON DISPLAY?
260 SOSL T,DSTPCT ; SKIP IF LAST START CALL, (FROM MORE THAN 1 STOP)
262 AOSE T ;SKIP IF ONLY ONE STOP
263 JRST 4,. ;SOME ONE IS OUT OF PHASE!
265 CONSZ DIS,7 ;SKIP IF NOT RUNNABLE
266 TRNE T,4000 ;1=> WAS STOPPED
268 PUSHJ P,E.SFU2 ; load E&S page map
269 POPJ P,0 ; lost somehow
270 CONO DIS,400 ;ELSE SET RUN
271 CONO DIS,2000 ;THEN ALLOW STOP INT
276 ;E.SPCH checks MMSWP ind in T against DISSWP
277 ; R0 if already there, R1 if not. ret index in H
279 E.SPCH: MOVSI H,-MXDISP
282 AOBJN H,.-2 ; look some more
283 JRST POPJ1 ; not found, skip
285 E.SCLB: MOVSI H,-MXDISP
286 SKIPE T,DISSWP(H) ; VALID IF NON-ZERO
287 PUSHJ P,UNTIE ; UNTIE PAGE IN T (MMSWP INDEX)
291 ; UNTIE PG T/ MMSWP index
292 ; H/ display table index
294 UNTIE: AOS E.SNUT ; count unties
297 ADDB H,MMSWP(T) ; sos # exec pgs
298 SKIPGE H ; if less than zero, untied an untied page
299 JRST 4,. ; exec pg count < 0
301 SETZM DISSWP(H) ; clear table entries
304 ; ties down page. T/ MMSWP ind.
306 E.SPG1: SKIPL MEMBLT(T) ; frozen, so dont tie
307 PUSHJ P,E.SPCH ; skips if not there
309 AOS E.SNTI ; count number of ties.
311 ADDM H,MMSWP(T) ; aos # exec pgs
312 MOVE H,DISPGP ; fetch dis pg pointer
314 MOVSI H,-MXDISP ; reset pointer if table full
315 MOVEM H,DISPGP ; update pointer
316 PUSH P,T ; now checks if slot in use
318 PUSHJ P,UNTIE ; untie page in T
320 MOVEM T,DISSWP(H) ; remember mmswp ind
323 ; E.SPGI called from CFHPI on page in core after fault
325 E.SPGI: SKIPGE U,DISUSR
326 JRST 4,. ; why here ?
327 HRRO I,CFHUVP ; user virtul page from CFH...
328 CAME I,E.SPGW ; is the sam as E&S rq ?
329 POPJ P,0 ; no, return
330 SETOM E.SPGH ; set flag for QSWI1 (read/write/first hack)
331 PUSHJ P,E.SPG1 ; tie down
332 SETZM E.SPGW ; clear page wait
333 PUSHJ P,RDSTART ; restart display
335 POPJ P,0 ; skip return from rdstart if wins