Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / 20 / insint.mid
diff --git a/mim/development/mim/20/insint.mid b/mim/development/mim/20/insint.mid
new file mode 100644 (file)
index 0000000..b9131cd
--- /dev/null
@@ -0,0 +1,900 @@
+;This code runs MIMI20 by interpretting TOPS20 instructions and building
+;  a page trace
+
+INTERP:        MOVEM   0,ACS0          ; first save user ACS
+       MOVE    0,[1,,ACS0+1]
+       BLT     0,@[MIMSEC,,ACS0+17]
+       XMOVEI  P,INTPDL        ; get us a pdl
+       SKIPE   PGJFN
+        JRST   INTER2          ; already open
+       SETZM   PAGNP
+INTER1:        HRROI   A,[asciz /Output file for trace: /]
+       PSOUT
+       MOVE    A,[gj%sht+gj%fns]
+       MOVE    B,[.priin,,.priout]
+       GTJFN
+        JRST   INTER1
+       MOVE    b,[440000,,300000]      ;7-bit read/write
+       OPENF
+        JRST   INTER1                  ;clever error handling
+       MOVEM   A,PGJFN
+INTER2:        HRROI   A,[ASCIZ /Place start PC in PCWD (global PC)
+/]
+       PSOUT
+       HALTF
+
+ILOOP: MOVE    A,@PCWD                 ; get next instruction
+       PUSHJ   P,INSINT
+       JRST    ILOOP                   ; do it for a long time... 
+
+;Instruction interpreter for producing page trace for multi-section
+;analysis, ins is in A
+
+INSINT:        PUSH    P,A
+       MOVE    A,PCWD          ; record pc page
+       PUSHJ   P,PAGNOT        ; note page
+       POP     P,A
+       AOS     PCWD            ; bunp pc
+
+INSIN1:        LDB     B,[331100,,A]   ;OPCODE.
+       LDB     C,[270400,,A]   ;GET AC FIELD
+       LDB     D,[220400,,A]   ;INDX FIELD
+       HRRZ    E,A             ; EA FIELD
+       MOVEI   F,0             ; SEE IF IND
+       TLNE    A,20            ; SKIP IN NOT IND
+        MOVEI  F,1
+       PUSHJ   P,EFFADR        ; COMPUTE EFFECTIVE ADDRESS
+       CAIN    B,<XCT_<-27.>>
+        JRST   DXCT
+       CAIN    B,<PUSHJ_<-27.>>
+        JRST   DPUSHJ          ;CALCULATE EA AND INTERPRET
+       CAIN    B,<JSR_<-27.>>
+        JRST   DJSR
+       CAIN    B,<JSA_<-27.>>
+        JRST   DJSA
+;      CAIN    B,<JSYS_<-27.>>
+;       JRST   DJSYS
+       CAIN    B,<JSP_<-27.>>
+        JRST   DJSP
+       TRNN    B,700
+        JRST   DUUO
+       CAIN    B,<POPJ_<-27.>>
+        JRST   DPOPJ
+       CAIN    B,<JRA_<-27.>>
+        JRST   DJRA
+       CAIN    B,<AOBJN_<-27.>>
+        JRST   DJMP
+       CAIN    B,<AOBJP_<-27.>>
+        JRST   DJMP
+       CAIN    B,<JFFO_<-27.>>
+        JRST   DJFFO
+       CAIN    B,<JRST_<-27.>>
+        JRST   DJRST
+       CAIN    B,<BLT_<-27.>>
+        JRST   DBLT
+       CAIN    B,<123>
+        JRST   DXBLT
+       CAIN    B,<PUSH_<-27.>>
+        JRST   DPUSH
+       CAIN    B,<POP_<-27.>>
+        JRST   DPOP
+       CAIN    B,<ILDB_<-27.>>
+        JRST   DILDB
+       CAIN    B,<IDPB_<-27.>>
+        JRST   DILDB
+       CAIN    B,<LDB_<-27.>>
+        JRST   DILDB
+       MOVEI   0,(B)
+       ANDI    0,770           ; REMOVE LOW 3 BITS OF OPCODE
+       CAIE    0,<AOJ_<-27.>>  ; AOJ-SOMETHING
+       CAIN    0,<SOJ_<-27.>>
+        JRST   DJMP
+       CAIN    0,<JUMP_<-27.>> ; SOME FLAVOR JUMP
+        JRST   DJMP
+
+; here for unexciting run of the mill instructions
+
+DOINS: PUSHJ   P,MEMTOU        ; see if we touch memory
+        JRST   NOTOU           ; no don't hack data structure
+
+       EXCH    A,E
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT        ; record page
+       EXCH    A,E
+
+NOTOU: MOVEM   A,INSDO
+       MOVEM   A,@[MIMSEC+1,,INSDO]
+       HLLZ    A,PCWD
+       HLLM    A,INSDIS
+       HLLM    A,@[MIMSEC+1,,INSDIS]
+       MOVEM   17,SAV17
+       MOVSI   17,ACS0
+       BLT     17,17
+       JRST    @INSDIS
+INSRET:        CAIA
+       AOS     PCWD
+       MOVEM   0,ACS0
+       MOVE    0,[1,,ACS0+1]
+       BLT     0,@[MIMSEC,,ACS0+17]
+       MOVE    17,SAV17
+       POPJ    P,
+
+; interpret XCT instruction (E is effective address)
+
+DXCT:  MOVE    A,E             ;record page
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT
+       PUSHJ   P,GETVAL        ;get value
+       PUSHJ   P,INSIN1        ;do the instruction
+       POPJ    P,
+
+; here to inteprer PUSHJ
+
+DPUSHJ: MOVE   B,PCWD          ;get PC to push
+       MOVE    A,ACS0(C)       ;get stack pointer
+       ADJSP   A,1             ; bump stack pointer
+       MOVEM   A,ACS0(C)
+       SKIPGE  A               ; skip if global
+        HLL    A,PCWD          ; else use PC sect
+       MOVEM   B,(A)           ; store PC
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT        ; and note page
+       MOVEM   E,PCWD
+       POPJ    P,
+
+; do JSP interp
+
+DJSP:  MOVE    B,PCWD          ; set up PC to save
+       MOVEM   B,ACS0(C)       ; save it
+       MOVEM   E,PCWD
+       POPJ    P,
+
+; here to do POPJ
+
+DPOPJ: MOVE    A,ACS0(C)       ; get stack pointer
+       SKIPGE  A
+        HLL    A,PCWD
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT        ; note access
+       MOVE    B,(A)
+       MOVE    A,ACS0(C)
+       ADJSP   A,-1
+       MOVEM   A,ACS0(C)
+       MOVEM   B,PCWD
+       POPJ    P,
+
+DUUO:
+DJRA:
+DJSA:
+DJSR:
+DJFFO: HRROI   A,[ASCIZ /Not implemented...
+/]
+       PSOUT
+       HALTF
+
+
+; here to do BLT
+
+DBLT:  MOVE    C,ACS0(C)       ; get BLT register
+       PUSH    P,A
+       HLRZ    A,C
+       HLL     A,E             ; use eff addr of ins for sect
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT
+       HRRZ    A,C
+       HLL     A,E
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT
+       POP     P,A
+       JRST    DOINS
+
+; here to do XBLT
+
+DXBLT: PUSH    P,A
+       MOVE    A,ACS0+1(C)
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT
+       MOVE    A,ACS0+2(C)
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT
+       POP     P,A
+       JRST    DOINS
+
+; here to record PUSH
+
+DPUSH: PUSH    P,A
+       MOVE    A,ACS0(C)       ;get stack pointer
+       ADJSP   A,1             ; bump stack pointer
+       SKIPGE  A               ; skip if global
+        HLL    A,PCWD          ; else use PC sect
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT
+       POP     P,A
+       JRST    DOINS
+
+; here to record POP
+
+DPOP:  PUSH    P,A
+       SKIPG   A,ACS0(C)
+        HLL    A,PCWD
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT
+       POP     P,A
+       JRST    DOINS
+
+; here for some byte pointe instructions
+
+DILDB: PUSH    P,A
+       PUSHJ   P,GETVAL                ; get the byte pointer
+       LDB     0,[360600,,A]           ; get shift
+       CAILE   0,44                    ; skip if not single word global bp
+        JRST   DILDB1
+       TLNE    A,40                    ; skip if not 2 word global bp
+        JRST   DILDB2
+       LDB     D,[220400,,A]           ; index field
+       HRRZ    E,A
+       MOVEI   F,0
+       TLNE    A,20                    ; indirect?
+        MOVEI  F,1
+DILDB3:        PUSHJ   P,EFFADR                ; compute its effective address
+       MOVE    A,E
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT
+       POP     P,A
+       JRST    DOINS
+
+DILDB1:        TLZ     A,770000
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT
+       POP     P,A
+       JRST    DOINS
+
+DILDB2:        LDB     D,[360400,,A]
+       MOVE    E,A
+       TLZ     E,770000
+       MOVEI   F,0
+       TLNE    A,200000        
+        MOVEI  F,1
+       JRST    DILDB3
+
+; here to handle many of the possible jump instructions
+
+DJMP:  LSH     B,27.           ; start rebuilding jump instruction
+       TLO     B,<<D>_5>       ; will use D for test etc.
+       HRRI    B,DJMP1         ; where it will go
+       MOVE    D,ACS0(C)       ; get users register
+       XCT     B
+       CAIA
+
+DJMP1: MOVEM   E,PCWD          ; store jumped PC
+       MOVEM   D,ACS0(C)       ; may have changed
+       POPJ    P,
+
+; here for jrst
+
+DJRST: CAIE    C,5             ; only funny one is JRST 5, (XJRST)
+        JRST   DJRST1
+
+       ADDI    E,1
+       PUSHJ   P,GETVAL        ; get PC word
+       MOVEM   A,PCWD
+       POPJ    P,
+
+DJRST1:        MOVEM   E,PCWD
+       POPJ    P,      
+
+; Compute effective address 
+;      E/      initial rh of instruction
+;      F/      0 ==> no ind, 1 ==> ind
+;      D/      indx field
+
+EFFADR:        PUSH    P,A
+       PUSH    P,0
+               MOVEI   0,100           ; Maximum indirection count
+       HRRES   E               ; make negative offsets work
+
+EFF1:  JUMPE   D,EFF2          ; jump if no index field
+
+       SKIPN   D,ACS0(D)       ; get its contents
+        JRST   EFF2            ; zero in index, ignore
+
+       TLNE    D,-1            ; skip if rh only (local index)
+        JUMPG  D,EFF3          ; jump if global index
+
+       ADD     E,D             ; do local indexing
+       ANDI    E,-1            ; but prevent overflowing
+       JRST    EFF2
+
+EFF3:  ADD     E,D             ; add global index
+
+EFF2:  CAIGE   E,17            ; AC?
+        JRST   EFF6
+       TLNN    E,400000        ; negative addr also get current section
+        TLNN   E,-1            ; skip if section already here
+         HLL   E,PCWD          ; use PC section
+
+EFF6:  JUMPE   F,EFF5          ; no indirection, leave
+
+       SOJGE   0,EFF4          ; too much indirection
+       HRROI   A,[ASCIZ /Too many levels of indirection
+/]
+       PSOUT
+       HALTF
+
+EFF4:  MOVE    A,E             ; get page
+       SKIPN   PCONLY
+        PUSHJ  P,PAGNOT
+
+       PUSHJ   P,GETVAL        ; get indirect word
+
+       JUMPGE  A,EFF7          ; jump if global ind
+
+       LDB     D,[220400,,A]   ; get index field
+       TLNN    A,20            ; skip if indirect
+        MOVEI  F,0             ; turn it on
+       HRRE    E,A             ; keep original section with new address
+       JRST    EFF1            ; loop back
+
+EFF7:  LDB     D,[360400,,A]
+       TLNN    A,200000        ; global indirect bit?
+        MOVEI  F,0
+       TLZ     A,770000        ; kill index and indirect
+       MOVE    E,A
+       JRST    EFF1
+
+EFF5:  POP     P,0
+       POP     P,A
+       POPJ    P,
+
+; here to extract value
+
+GETVAL:        CAILE   E,17            ; skip if register
+        SKIPA  A,(E)           ; get word
+         MOVE  A,ACS0(E)
+       POPJ    P,
+
+; here to take note of page being accessed (A is address)
+
+PAGNOT:        CAIG    A,17            ; not register
+        POPJ   P,
+
+       AOS     PREFS
+       SKIPE   CONFLI          ; only recording conflicts?
+        JRST   PACON
+
+       PUSH    P,B
+       AOS     B,PAGNP
+       MOVEM   A,PAGN-1(B)
+       CAIL    B,512.
+        JRST   PAGNO1
+       
+       POP     P,B
+       POPJ    P,
+
+PAGNO1:        PUSH    P,A
+       PUSH    P,C
+               MOVE    A,PGJFN
+       MOVE    B,[444400,,PAGN]
+       MOVNI   C,512.
+       SOUT
+       SETZM   PAGNP
+       POP     P,C
+       POP     P,A
+       POP     P,B     
+       POPJ    P,
+
+
+PACON: PUSH    P,A
+       PUSH    P,B
+       PUSH    P,C
+       LSH     A,-9.           ; get to page group
+       MOVE    B,A
+       LSH     A,-2
+       TRZ     A,777400        ; kill sect # but not odd/even
+       TRZE    A,200
+        TRC    A,20
+       SKIPN   C,PTBL(A)
+        JRST   PACON1
+       XOR     C,B
+       TRZ     C,3             ; kill low order bits
+       JUMPE   C,PACON1
+       MOVE    C,PTBL(A)
+       MOVEM   B,PTBL(A)
+       CAMG    B,C
+        EXCH   B,C
+       HRL     B,C
+
+       MOVSI   C,-CTBL         ; see if this happened before
+PALP:  CAMN    B,CTB(C)
+        JRST   PALP1
+       SKIPN   CTB(C)
+        JRST   PALP2
+       AOBJP   C,.+2
+       AOBJN   C,PALP
+
+       HRROI   A,[ASCIZ /Conflict table full? 
+/]
+       PSOUT
+       HALTF
+
+PALP2: MOVEM   B,CTB(C)
+PALP1: AOSA    CTB+1(C)
+
+PACON1:        MOVEM   B,PTBL(A)
+       POP     P,C
+       POP     P,B
+       POP     P,A
+       POPJ    P,
+
+CONOUT:        MOVE    A,PGJFN
+       MOVE    B,[444400,,CTB-1]
+       MOVNI   C,CTBL
+       SOUT
+       MOVE    A,PGJFN
+       CLOSF
+       JFCL
+       HALTF
+
+IF1,[
+DEFINE SDEF N
+       OPS!N==0
+       TERMIN
+
+REPEAT <<512./36.>+1>,SDEF \.RPCNT
+
+DEFINE OPTAB OP,IMM,\NIMM,LOP,N,FIRST,DONE
+       DONE==0
+       FIRST==1
+       LOP==<<OP>_<-27.>>
+       IFSE IMM,,[NIMM==0
+                 IRPC X,XR,[OP]
+                 IFSE [X]T,[IFN FIRST,[IRPC Y,,[XR]
+                                       IFSE [Y]L,NIMM==1
+                                       IFSE [Y]R,NIMM==1
+                                       .ISTOP
+                                       TERMIN
+                                       DONE==1
+]]
+                 IFN DONE,.ISTOP
+                 IFSE [X]I,NIMM==1
+                 IFSN [X]I,NIMM==0
+                 FIRST==0
+                 TERMIN
+]
+       IFSN IMM,,NIMM==IMM
+       N==<LOP/36.>
+       SYMHACK \N,NIMM,LOP
+       EXPUNGE N,NIMM,LOP
+       TERMIN
+
+DEFINE PRV A,B,C
+       PRINTC /A B C
+/
+       TERMIN
+
+DEFINE SYMHACK SNM,IMM,OP
+       OPS!SNM==OPS!SNM\<IMM_<OP-<36.*<OP/36.>>>>
+       TERMIN
+        
+OPTAB  JSYS,1          
+OPTAB  ADJSP,1         
+OPTAB  DFAD            
+OPTAB  DFSB            
+OPTAB  DFMP            
+OPTAB  DFDV            
+OPTAB  DADD            
+OPTAB  DSUB            
+OPTAB  DMUL            
+OPTAB  DDIV            
+OPTAB  DMOVE           
+OPTAB  DMOVN           
+OPTAB  FIX             
+OPTAB  EXTEND  
+OPTAB  DMOVEM  
+OPTAB  DMOVNM  
+OPTAB  FIXR            
+OPTAB  FLTR            
+OPTAB  UFA             
+OPTAB  DFN             
+OPTAB  FSC,1
+OPTAB  IBP
+OPTAB  ILDB
+OPTAB  LDB
+OPTAB  IDPB
+OPTAB  DPB
+OPTAB  FAD
+OPTAB  FADL            
+OPTAB  FADM
+OPTAB  FADB
+OPTAB  FADR
+OPTAB  FADRI           
+OPTAB  FADRM
+OPTAB  FADRB
+OPTAB  FSB
+OPTAB  FSBL            
+OPTAB  FSBM
+OPTAB  FSBB
+OPTAB  FSBR
+OPTAB  FSBRI           
+OPTAB  FSBRM
+OPTAB  FSBRB
+OPTAB  FMP
+OPTAB  FMPL            
+OPTAB  FMPM
+OPTAB  FMPB
+OPTAB  FMPR
+OPTAB  FMPRI           
+OPTAB  FMPRM
+OPTAB  FMPRB
+OPTAB  FDV
+OPTAB  FDVL            
+OPTAB  FDVM
+OPTAB  FDVB
+OPTAB  FDVR
+OPTAB  FDVRI           
+OPTAB  FDVRM
+OPTAB  FDVRB
+OPTAB  MOVE
+OPTAB  MOVEI
+OPTAB  MOVEM
+OPTAB  MOVES
+OPTAB  MOVS
+OPTAB  MOVSI
+OPTAB  MOVSM
+OPTAB  MOVSS
+OPTAB  MOVN
+OPTAB  MOVNI
+OPTAB  MOVNM
+OPTAB  MOVNS
+OPTAB  MOVM
+OPTAB  MOVMI
+OPTAB  MOVMM
+OPTAB  MOVMS
+OPTAB  IMUL
+OPTAB  IMULI
+OPTAB  IMULM
+OPTAB  IMULB
+OPTAB  MUL
+OPTAB  MULI
+OPTAB  MULM
+OPTAB  MULB
+OPTAB  IDIV
+OPTAB  IDIVI
+OPTAB  IDIVM
+OPTAB  IDIVB
+OPTAB  DIV
+OPTAB  DIVI
+OPTAB  DIVM
+OPTAB  DIVB
+OPTAB  ASH,1
+OPTAB  ROT,1
+OPTAB  LSH,1
+OPTAB  JFFO    
+OPTAB  ASHC,
+OPTAB  ROTC,1
+OPTAB  LSHC,1
+OPTAB  CIRC    
+OPTAB  EXCH
+OPTAB  BLT
+OPTAB  AOBJP
+OPTAB  AOBJN
+OPTAB  JRST
+OPTAB  JFCL
+OPTAB  XCT
+OPTAB  MAP     
+OPTAB  PUSHJ
+OPTAB  PUSH
+OPTAB  POP
+OPTAB  POPJ
+OPTAB  JSR
+OPTAB  JSP
+OPTAB  JSA
+OPTAB  JRA
+OPTAB  ADD
+OPTAB  ADDI
+OPTAB  ADDM
+OPTAB  ADDB
+OPTAB  SUB
+OPTAB  SUBI
+OPTAB  SUBM
+OPTAB  SUBB
+OPTAB  CAI
+OPTAB  CAIL,1
+OPTAB  CAIE,1
+OPTAB  CAILE,1
+OPTAB  CAIA,1
+OPTAB  CAIGE,1
+OPTAB  CAIN,1
+OPTAB  CAIG,1
+OPTAB  CAM
+OPTAB  CAML
+OPTAB  CAME
+OPTAB  CAMLE
+OPTAB  CAMA
+OPTAB  CAMGE
+OPTAB  CAMN
+OPTAB  CAMG
+OPTAB  JUMP
+OPTAB  JUMPL
+OPTAB  JUMPE
+OPTAB  JUMPLE
+OPTAB  JUMPA
+OPTAB  JUMPGE
+OPTAB  JUMPN
+OPTAB  JUMPG
+OPTAB  SKIP
+OPTAB  SKIPL
+OPTAB  SKIPE
+OPTAB  SKIPLE
+OPTAB  SKIPA
+OPTAB  SKIPGE
+OPTAB  SKIPN
+OPTAB  SKIPG
+OPTAB  AOJ
+OPTAB  AOJL
+OPTAB  AOJE
+OPTAB  AOJLE
+OPTAB  AOJA
+OPTAB  AOJGE
+OPTAB  AOJN
+OPTAB  AOJG
+OPTAB  AOS
+OPTAB  AOSL
+OPTAB  AOSE
+OPTAB  AOSLE
+OPTAB  AOSA
+OPTAB  AOSGE
+OPTAB  AOSN
+OPTAB  AOSG
+OPTAB  SOJ
+OPTAB  SOJL
+OPTAB  SOJE
+OPTAB  SOJLE
+OPTAB  SOJA
+OPTAB  SOJGE
+OPTAB  SOJN
+OPTAB  SOJG
+OPTAB  SOS
+OPTAB  SOSL
+OPTAB  SOSE
+OPTAB  SOSLE
+OPTAB  SOSA
+OPTAB  SOSGE
+OPTAB  SOSN
+OPTAB  SOSG
+OPTAB  SETZ,1
+OPTAB  SETZI
+OPTAB  SETZM
+OPTAB  SETZB
+OPTAB  AND
+OPTAB  ANDI
+OPTAB  ANDM
+OPTAB  ANDB
+OPTAB  ANDCA
+OPTAB  ANDCAI
+OPTAB  ANDCAM
+OPTAB  ANDCAB
+OPTAB  SETM
+OPTAB  SETMI
+OPTAB  SETMM
+OPTAB  SETMB
+OPTAB  ANDCM
+OPTAB  ANDCMI
+OPTAB  ANDCMM
+OPTAB  ANDCMB
+OPTAB  SETA,1
+OPTAB  SETAI
+OPTAB  SETAM
+OPTAB  SETAB
+OPTAB  XOR
+OPTAB  XORI
+OPTAB  XORM
+OPTAB  XORB
+OPTAB  IOR
+OPTAB  IORI
+OPTAB  IORM
+OPTAB  IORB
+OPTAB  ANDCB
+OPTAB  ANDCBI
+OPTAB  ANDCBM
+OPTAB  ANDCBB
+OPTAB  EQV
+OPTAB  EQVI
+OPTAB  EQVM
+OPTAB  EQVB
+OPTAB  SETCA,1
+OPTAB  SETCAI
+OPTAB  SETCAM
+OPTAB  SETCAB
+OPTAB  ORCA
+OPTAB  ORCAI
+OPTAB  ORCAM
+OPTAB  ORCAB
+OPTAB  SETCM
+OPTAB  SETCMI
+OPTAB  SETCMM
+OPTAB  SETCMB
+OPTAB  ORCM
+OPTAB  ORCMI
+OPTAB  ORCMM
+OPTAB  ORCMB
+OPTAB  ORCB
+OPTAB  ORCBI
+OPTAB  ORCBM
+OPTAB  ORCBB
+OPTAB  SETO,1
+OPTAB  SETOI
+OPTAB  SETOM
+OPTAB  SETOB
+OPTAB  HLL
+OPTAB  HLLI
+OPTAB  HLLM
+OPTAB  HLLS
+OPTAB  HRL
+OPTAB  HRLI
+OPTAB  HRLM
+OPTAB  HRLS
+OPTAB  HLLZ
+OPTAB  HLLZI
+OPTAB  HLLZM
+OPTAB  HLLZS
+OPTAB  HRLZ
+OPTAB  HRLZI
+OPTAB  HRLZM
+OPTAB  HRLZS
+OPTAB  HLLO
+OPTAB  HLLOI
+OPTAB  HLLOM
+OPTAB  HLLOS
+OPTAB  HRLO
+OPTAB  HRLOI
+OPTAB  HRLOM
+OPTAB  HRLOS
+OPTAB  HLLE
+OPTAB  HLLEI
+OPTAB  HLLEM
+OPTAB  HLLES
+OPTAB  HRLE
+OPTAB  HRLEI
+OPTAB  HRLEM
+OPTAB  HRLES
+OPTAB  HRR
+OPTAB  HRRI
+OPTAB  HRRM
+OPTAB  HRRS
+OPTAB  HLR
+OPTAB  HLRI
+OPTAB  HLRM
+OPTAB  HLRS
+OPTAB  HRRZ
+OPTAB  HRRZI
+OPTAB  HRRZM
+OPTAB  HRRZS
+OPTAB  HLRZ
+OPTAB  HLRZI
+OPTAB  HLRZM
+OPTAB  HLRZS
+OPTAB  HRRO
+OPTAB  HRROI
+OPTAB  HRROM
+OPTAB  HRROS
+OPTAB  HLRO
+OPTAB  HLROI
+OPTAB  HLROM
+OPTAB  HLROS
+OPTAB  HRRE
+OPTAB  HRREI
+OPTAB  HRREM
+OPTAB  HRRES
+OPTAB  HLRE
+OPTAB  HLREI
+OPTAB  HLREM
+OPTAB  HLRES
+OPTAB  TRN
+OPTAB  TLN
+OPTAB  TRNE
+OPTAB  TLNE
+OPTAB  TRNA
+OPTAB  TLNA
+OPTAB  TRNN
+OPTAB  TLNN
+OPTAB  TDN
+OPTAB  TSN
+OPTAB  TDNE
+OPTAB  TSNE
+OPTAB  TDNA
+OPTAB  TSNA
+OPTAB  TDNN
+OPTAB  TSNN
+OPTAB  TRZ
+OPTAB  TLZ
+OPTAB  TRZE
+OPTAB  TLZE
+OPTAB  TRZA
+OPTAB  TLZA
+OPTAB  TRZN
+OPTAB  TLZN
+OPTAB  TDZ
+OPTAB  TSZ
+OPTAB  TDZE
+OPTAB  TSZE
+OPTAB  TDZA
+OPTAB  TSZA
+OPTAB  TDZN
+OPTAB  TSZN
+OPTAB  TRC
+OPTAB  TLC
+OPTAB  TRCE
+OPTAB  TLCE
+OPTAB  TRCA
+OPTAB  TLCA
+OPTAB  TRCN
+OPTAB  TLCN
+OPTAB  TDC
+OPTAB  TSC
+OPTAB  TDCE
+OPTAB  TSCE
+OPTAB  TDCA
+OPTAB  TSCA
+OPTAB  TDCN
+OPTAB  TSCN
+OPTAB  TRO
+OPTAB  TLO
+OPTAB  TROE
+OPTAB  TLOE
+OPTAB  TROA
+OPTAB  TLOA
+OPTAB  TRON
+OPTAB  TLON
+OPTAB  TDO
+OPTAB  TSO
+OPTAB  TDOE
+OPTAB  TSOE
+OPTAB  TDOA
+OPTAB  TSOA
+OPTAB  TDON
+OPTAB  TSON
+
+DEFINE SYMDEP N
+       OPS!N
+       TERMIN
+]
+
+OPTB:
+
+REPEAT <<512./36.>+1>,SYMDEP \.RPCNT
+
+;Determine if opcode touches memory, get opcode in B skips if touches mem
+
+MEMTOU:        PUSH    P,B
+       PUSH    P,C
+       IDIVI   B,36.
+       MOVE    B,OPTB(B)
+       MOVNS   C
+       ROT     B,-1(C)
+       POP     P,C
+       SKIPL   B
+        AOS    -1(P)
+       POP     P,B
+       POPJ    P,              
+
+
+CONSTANTS
+
+
+PAGNP: 0
+PAGN:  BLOCK   512.
+PAGNEN:
+
+PGJFN: 0
+ACS0:  BLOCK   20
+PCWD:  0
+INTPDL:        BLOCK   100
+SAV17: 0
+PREFS: 0
+PTBL:  BLOCK   200
+CTBL==10000
+CTB:   BLOCK   CTBL
+CONFLI:        0
+PCONLY:        -1
+MUMBLE:        -1
\ No newline at end of file