1 ;This code runs MIMI20 by interpretting TOPS20 instructions and building
4 INTERP: MOVEM 0,ACS0 ; first save user ACS
6 BLT 0,@[MIMSEC,,ACS0+17]
7 XMOVEI P,INTPDL ; get us a pdl
9 JRST INTER2 ; already open
11 INTER1: HRROI A,[asciz /Output file for trace: /]
13 MOVE A,[gj%sht+gj%fns]
14 MOVE B,[.priin,,.priout]
17 MOVE b,[440000,,300000] ;7-bit read/write
19 JRST INTER1 ;clever error handling
21 INTER2: HRROI A,[ASCIZ /Place start PC in PCWD (global PC)
26 ILOOP: MOVE A,@PCWD ; get next instruction
28 JRST ILOOP ; do it for a long time...
30 ;Instruction interpreter for producing page trace for multi-section
31 ;analysis, ins is in A
34 MOVE A,PCWD ; record pc page
35 PUSHJ P,PAGNOT ; note page
39 INSIN1: LDB B,[331100,,A] ;OPCODE.
40 LDB C,[270400,,A] ;GET AC FIELD
41 LDB D,[220400,,A] ;INDX FIELD
43 MOVEI F,0 ; SEE IF IND
44 TLNE A,20 ; SKIP IN NOT IND
46 PUSHJ P,EFFADR ; COMPUTE EFFECTIVE ADDRESS
50 JRST DPUSHJ ;CALCULATE EA AND INTERPRET
55 ; CAIN B,<JSYS_<-27.>>
88 ANDI 0,770 ; REMOVE LOW 3 BITS OF OPCODE
89 CAIE 0,<AOJ_<-27.>> ; AOJ-SOMETHING
92 CAIN 0,<JUMP_<-27.>> ; SOME FLAVOR JUMP
95 ; here for unexciting run of the mill instructions
97 DOINS: PUSHJ P,MEMTOU ; see if we touch memory
98 JRST NOTOU ; no don't hack data structure
102 PUSHJ P,PAGNOT ; record page
106 MOVEM A,@[MIMSEC+1,,INSDO]
109 HLLM A,@[MIMSEC+1,,INSDIS]
118 BLT 0,@[MIMSEC,,ACS0+17]
122 ; interpret XCT instruction (E is effective address)
124 DXCT: MOVE A,E ;record page
127 PUSHJ P,GETVAL ;get value
128 PUSHJ P,INSIN1 ;do the instruction
131 ; here to inteprer PUSHJ
133 DPUSHJ: MOVE B,PCWD ;get PC to push
134 MOVE A,ACS0(C) ;get stack pointer
135 ADJSP A,1 ; bump stack pointer
137 SKIPGE A ; skip if global
138 HLL A,PCWD ; else use PC sect
139 MOVEM B,(A) ; store PC
141 PUSHJ P,PAGNOT ; and note page
147 DJSP: MOVE B,PCWD ; set up PC to save
148 MOVEM B,ACS0(C) ; save it
154 DPOPJ: MOVE A,ACS0(C) ; get stack pointer
158 PUSHJ P,PAGNOT ; note access
170 DJFFO: HRROI A,[ASCIZ /Not implemented...
178 DBLT: MOVE C,ACS0(C) ; get BLT register
181 HLL A,E ; use eff addr of ins for sect
203 ; here to record PUSH
206 MOVE A,ACS0(C) ;get stack pointer
207 ADJSP A,1 ; bump stack pointer
208 SKIPGE A ; skip if global
209 HLL A,PCWD ; else use PC sect
225 ; here for some byte pointe instructions
228 PUSHJ P,GETVAL ; get the byte pointer
229 LDB 0,[360600,,A] ; get shift
230 CAILE 0,44 ; skip if not single word global bp
232 TLNE A,40 ; skip if not 2 word global bp
234 LDB D,[220400,,A] ; index field
237 TLNE A,20 ; indirect?
239 DILDB3: PUSHJ P,EFFADR ; compute its effective address
252 DILDB2: LDB D,[360400,,A]
260 ; here to handle many of the possible jump instructions
262 DJMP: LSH B,27. ; start rebuilding jump instruction
263 TLO B,<<D>_5> ; will use D for test etc.
264 HRRI B,DJMP1 ; where it will go
265 MOVE D,ACS0(C) ; get users register
269 DJMP1: MOVEM E,PCWD ; store jumped PC
270 MOVEM D,ACS0(C) ; may have changed
275 DJRST: CAIE C,5 ; only funny one is JRST 5, (XJRST)
279 PUSHJ P,GETVAL ; get PC word
286 ; Compute effective address
287 ; E/ initial rh of instruction
288 ; F/ 0 ==> no ind, 1 ==> ind
293 MOVEI 0,100 ; Maximum indirection count
294 HRRES E ; make negative offsets work
296 EFF1: JUMPE D,EFF2 ; jump if no index field
298 SKIPN D,ACS0(D) ; get its contents
299 JRST EFF2 ; zero in index, ignore
301 TLNE D,-1 ; skip if rh only (local index)
302 JUMPG D,EFF3 ; jump if global index
304 ADD E,D ; do local indexing
305 ANDI E,-1 ; but prevent overflowing
308 EFF3: ADD E,D ; add global index
310 EFF2: CAIGE E,17 ; AC?
312 TLNN E,400000 ; negative addr also get current section
313 TLNN E,-1 ; skip if section already here
314 HLL E,PCWD ; use PC section
316 EFF6: JUMPE F,EFF5 ; no indirection, leave
318 SOJGE 0,EFF4 ; too much indirection
319 HRROI A,[ASCIZ /Too many levels of indirection
324 EFF4: MOVE A,E ; get page
328 PUSHJ P,GETVAL ; get indirect word
330 JUMPGE A,EFF7 ; jump if global ind
332 LDB D,[220400,,A] ; get index field
333 TLNN A,20 ; skip if indirect
334 MOVEI F,0 ; turn it on
335 HRRE E,A ; keep original section with new address
336 JRST EFF1 ; loop back
338 EFF7: LDB D,[360400,,A]
339 TLNN A,200000 ; global indirect bit?
341 TLZ A,770000 ; kill index and indirect
349 ; here to extract value
351 GETVAL: CAILE E,17 ; skip if register
352 SKIPA A,(E) ; get word
356 ; here to take note of page being accessed (A is address)
358 PAGNOT: CAIG A,17 ; not register
362 SKIPE CONFLI ; only recording conflicts?
377 MOVE B,[444400,,PAGN]
390 LSH A,-9. ; get to page group
393 TRZ A,777400 ; kill sect # but not odd/even
399 TRZ C,3 ; kill low order bits
407 MOVSI C,-CTBL ; see if this happened before
415 HRROI A,[ASCIZ /Conflict table full?
420 PALP2: MOVEM B,CTB(C)
423 PACON1: MOVEM B,PTBL(A)
430 MOVE B,[444400,,CTB-1]
443 REPEAT <<512./36.>+1>,SDEF \.RPCNT
445 DEFINE OPTAB OP,IMM,\NIMM,LOP,N,FIRST,DONE
451 IFSE [X]T,[IFN FIRST,[IRPC Y,,[XR]
475 DEFINE SYMHACK SNM,IMM,OP
476 OPS!SNM==OPS!SNM\<IMM_<OP-<36.*<OP/36.>>>>
865 REPEAT <<512./36.>+1>,SYMDEP \.RPCNT
867 ;Determine if opcode touches memory, get opcode in B skips if touches mem