Consolidate license copies
[its.git] / system / itsdis.50
1 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
2 ;;;
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.
7 ;;;
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.
12 ;;;
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.
16
17
18 ;DEVICE CODES
19 DIS==130        ;DISPLAY PROCESSOR
20 DISMAP==134     ;MEM PROT & REL
21 LIPSH==(040000)
22 NWSTK==LIPSH 3,
23
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
41                 CIRPSW
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
47         MOVEI   U,0
48         EXCH    U,E.SCLS        ; clear switch, fetch new usri
49         MOVEM   U,DISUSR
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
55         MOVE    E,D     ; MMP INDEX
56         PUSHJ   P,E.SPG1        ; go tie it down
57 NOTIED: PUSHJ   P,LSWPOP        ; clear switch
58         ; now set up E&S dbrs
59         MOVEI T,UDBR1A(U)
60         HRLI T,<NUVPG/2>_1      ;DBL left 1 relative to 10
61         MOVEM T,E.SPM+2
62         HRRI T,UDBR2A(U)
63         MOVEM T,E.SPM+3
64
65         ; now start (or restart if from E.SPGI) E&S
66
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]
76         BLKO DIS,H
77         CONSO DIS,604000 ;SKIP IF DONE OR ERROR
78         SOJG I,.-1
79         JUMPL H,.-3
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
83
84         AOS (P)
85 ADCON1: CONO DIS,400    ;RUN
86 ADXIT:  CONO DIS,222010+DISCHN  ;ALARM+MPV+STOP+PIA
87         POPJ P,
88
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
99
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
103         POPJ P,
104
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)
108         JRST ADCON1
109
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
113         CONO DIS,40
114         POPJ P,
115
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
120         DATAO DIS,J
121         POPJ P,
122
123 ADCLOS: CAME U,DISUSR
124         POPJ P,
125         CONO DIS,5010   ;STOP, PI OFF
126         SETZM   E.SPGW          ;CLEAR PAGE WAIT
127         PUSHJ   P,SWTL          ;LOCK CIRCULAR SWITCH
128                 CIRPSW
129         PUSHJ   P,E.SCLB
130         PUSHJ   P,LSWPOP        ;RESTORE SWITCH
131         SETOM DISUSR
132         POPJ P,
133
134 DISCHK: MOVE B,UNAME(U)
135         SKIPL T,DISUSR
136         CAMN B,UNAME(T)
137         AOS (P)
138
139 ADRSTA:         ;READ STATE, WRITE STATE NOT IN.
140 ADSSTA: POPJ P,
141
142 ;E&S PAGER HAS TO REFERENCE 0 TO INITIALLIZE MAP.
143 ;E&S FORCE USER MODE
144
145 E.SFU:  SKIPGE  E.SSYS
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)
153         PUSHJ   P,E.SWT
154         POPJ    P,0     ;LOST
155         SETOM   E.SSYS  ;REMEMBER MAP ON
156         JRST    POPJ1
157
158 E.SWT:  PUSH    P,J
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
166
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
173 ADSTN==.-ADSTL
174 EBLK
175
176 DSTADD: 000100,,        ;JMP TO CODE (FILL IN ADDRESS)
177
178 ; E&S PAGE MAP STATUS BLOCK
179 E.SPM:  0       ; c(0)
180         0       ; status word
181         0       ; dbr low
182         0       ; dbr high
183
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
192
193 ; counts for debugging
194
195 E.SNTI: 0       ; # pages tied down (total during system run)
196 E.SNUT: 0       ; # pages untied    (should = .-1 after dclose)
197
198 E.SREL: 0       ; # times pages in DISSWP table were relocated
199
200 ; end of debug counts
201
202 \f
203 DSTPCT: -1              ; STOP COUNT TO HANDLE REDUNDANT STOPS
204 DSCONI: 0       ;LAST CONI FROM DISPLAY
205 EBRKA:  0       ;INTERRUPT SAVE AC
206 EBRKU:  0       ; DITTO
207
208 ESBRK:  0       ;HANDLE E&S INTERRUPT
209
210 BBLK
211
212         CONSO DIS,7     ;PI CHAN ASSIGNED?
213         JRST 12,@ESBRK  ;NO, CANNOT INTERRUPT
214         CONI DIS,DSCONI
215         CONO DIS,10     ;DEASSIGN PI CHANNEL
216         MOVEM U,EBRKU   ;SAVE AC'S
217         MOVEM A,EBRKA
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
222         IORM A,PIRQC(U)
223 E.SPFR: MOVE A,EBRKA    ;UNSAVE AC'S
224         MOVE U,EBRKU
225         JRST 12,@ESBRK  ;RETURN
226
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
241
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
249 DISSTQ: MOVEI TT,100
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
255         POPJ P,
256
257
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)
261         POPJ P, ;NO
262         AOSE T  ;SKIP IF ONLY ONE STOP
263         JRST 4,.        ;SOME ONE IS OUT OF PHASE!
264         MOVE T,DSCONI
265         CONSZ DIS,7     ;SKIP IF NOT RUNNABLE
266         TRNE T,4000     ;1=> WAS STOPPED
267         POPJ P, ;SO QUIT
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
272         POPJ P,
273
274         ; tie down hacks
275
276 ;E.SPCH checks MMSWP ind in T against DISSWP
277 ; R0 if already there, R1 if not. ret index in H
278
279 E.SPCH: MOVSI   H,-MXDISP
280         CAMN    T,DISSWP(H)
281         POPJ    P,0     ; found
282         AOBJN   H,.-2   ; look some more
283         JRST    POPJ1   ; not found, skip
284
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)
288         AOBJN   H,E.SCLB+1
289         POPJ    P,0
290
291 ; UNTIE PG  T/ MMSWP index
292 ;               H/ display table index
293
294 UNTIE:  AOS     E.SNUT  ; count unties
295         PUSH    P,H
296         MOVSI   H,-1
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
300         POP     P,H
301         SETZM   DISSWP(H)       ; clear table entries
302         POPJ    P,0
303
304 ; ties down page.  T/ MMSWP ind.
305
306 E.SPG1: SKIPL   MEMBLT(T)       ; frozen, so dont tie
307         PUSHJ   P,E.SPCH        ; skips if not there
308         POPJ    P,0             ; dont tie
309         AOS     E.SNTI          ; count number of ties.
310         MOVSI   H,1
311         ADDM    H,MMSWP(T)      ; aos # exec pgs
312         MOVE    H,DISPGP        ; fetch dis pg pointer
313         AOBJN   H,.+2
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
317         SKIPE   T,DISSWP(H)
318         PUSHJ   P,UNTIE ; untie page in T
319         POP     P,T
320         MOVEM   T,DISSWP(H)     ; remember mmswp ind
321         POPJ    P,0
322
323 ; E.SPGI called from CFHPI on page in core after fault
324
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
334         POPJ    P,0
335         POPJ    P,0     ; skip return from rdstart if wins
336 \f