1: .title main 2: 3: .ident /03apr4/ 4: 5: .mcall (at)always,ch.mne,st.flg 6: always 7: ch.mne 8: st.flg 9: 10: .mcall (at)xmit,param 11: .mcall (at)genedt,gencnd,setnz 12: .mcall (at)search,scanw,next 13: .if df rsx11d 14: .mcall (at)scan 15: .endc 16: 17: 18: .globl endp2l 19: .globl secini, stmnt 20: .globl setmax, propc 21: .globl exmflg, xctpas, xctlin 22: .globl objchn, openo 23: 24: 25: ; 26: .globl clcfgs, clcloc, clcmax 27: .globl clcnam, clcsec, cpopj 28: .globl errbts 29: .globl flags, insert 30: .globl mode, rellvl 31: .globl rolupd 32: .globl sector, setnb 33: .globl setxpr 34: .globl symbol, value 35: .globl endp1c, endp2c 36: .globl prop1, endp1, prop2, endp2 37: .globl bksiz 38: 39: .if ndf xswit 40: .globl pass, prosw 41: .endc 42: 43: .globl savreg, xmit0 44: 45: .globl endflg, endlin 46: .globl getlin 47: .sbttl roll definitions 48: 49: entsec rolbas 50: rolbas = . 51: entsec roltop 52: entsec rolsiz 53: xitsec 54: 55: .macro genrol name, limits, size 56: entsec rolbas 57: .globl name'rol 58: name'rol= .-rolbas 59: .if nb <limits> 60: .word <^pl limits> 61: .iff 62: .word 0 63: .endc 64: entsec roltop 65: .if nb <limits> 66: .word <^ph limits> 67: .iff 68: .word 0 69: .endc 70: entsec rolsiz 71: .word size*2 72: xitsec 73: .iif gt size-maxxmt, maxxmt=size 74: .endm genrol 75: 76: .iif ndf maxxmt, maxxmt= 0 77: 78: .if df rsx11d 79: genrol reg, ,4 ;register symbols 80: .endc 81: genrol sym, ,4 ;symbol table 82: .if ndf xmacro 83: genrol mac, ,4 ;macro roll 84: genrol dma, ,2 ;dummy argument roll 85: .endc 86: .if ndf xedlsb 87: genrol lsy, ,4 ;local symbol roll 88: .endc 89: genrol sec, ,5 ;section roll 90: genrol cod, ,4 ;code roll 91: 92: genrol dum, ,0 ;dummy (separates variable from fixed) 93: 94: genrol cnd,cndsec,2 ;conditional arguments 95: genrol swt,swtsec,2 ;command string switches 96: genrol edt,edtsec,3 ;enabl/dsabl 97: genrol lcd,lctsec,1 ;listing control 98: genrol psa,psasec,2 ;psect attributes 99: genrol pst,pstsec,4 ;permanent symbol table 100: genrol crf,crfsec,3 ;cref options 101: .sbttl assembler proper 102: 103: entsec impure 104: 105: pass: .blkw 106: 107: bksiz: .blkw 2 108: ;next group must stay together 109: entsec imppas 110: 111: symbol: .blkw 2 ;symbol accumulator 112: mode: 113: flags: .blkb 1 ;flag bits 114: sector: .blkb 1 ;symbol/expression type 115: value: .blkw 1 ;expression value 116: rellvl: .blkw 1 117: .rept maxxmt-<<.-symbol>/2> ;end of grouped data 118: .blkw 119: .endm 120: 121: clcnam: .blkw 2 ;current location counter symbol 122: clcfgs: .blkb 1 123: clcsec: .blkb 1 124: clcloc: .blkw 1 125: clcmax: .blkw 1 126: 127: xitsec ;return to normal 128: prop1: ;process pass 1 129: mov #regtbl,r1 ;set to init regs 130: clr r2 131: 2$: mov #symbol,r4 132: mov (r1)+,(r4)+ ;set mnemonic 133: clr (r4)+ 134: .if df rsx11d 135: scan regrol ;set indices 136: .iff 137: search symrol ;set indices 138: .endc 139: mov #defflg!regflg,(r4)+ 140: mov r2,(r4) 141: call insert 142: inc r2 143: cmp r2,#10 ;end? 144: blo 2$ ; no 145: br prop2 ; yes, exit through pass 2 146: 147: entsec dpure 148: regtbl: .rad50 /r0 r1 r2 r3 r4 r5 sp pc / 149: xitsec 150: prop2: ;macro pass 2 151: call xctpas 152: call secini ;init the sector roll 153: 3$: call getlin ;get the next input line 154: bne 4$ ; branch if eof 155: call stmnt ;process the statement 156: 4$: call endlin ;polish off line 157: tst endflg ;end seen? 158: beq 3$ ; no, continue 159: return 160: 161: 162: 163: endp1: ;end of pass handler 164: .if ndf xrel 165: call setmax ;set max location 166: .iftf 167: mov #objchn,r0 168: call openo ;open output file 169: call endp1c ;init binary 170: clr rolupd ;set for re-init scan 171: 31$: next secrol ;get the next entry 172: beq 32$ ; branch if finished 173: clr value ;found, reset pc 174: call insert ;put back in table 175: br 31$ 176: 177: 32$: 178: .endc 179: return 180: 181: 182: 183: 184: endp2: ;end of pass 2 185: .if ndf xrel 186: call setmax ;set max location 187: .endc 188: call endp2c ;clean up binary 189: jmp endp2l ;output listing of table 190: .if ndf xswit 191: 192: prosw: ;process switch 193: ;in - ascii in r0 194: ;out- .ne. 0 if ok 195: call savreg 196: call setnb 197: call setxpr ;set expression-type registers 198: mov r0,(r1)+ ;set "symbol" 199: call xctlin ;zero line-oriented flags 200: scanw swtrol ;scan for switch 201: beq 9$ ; not found, exit zero 202: clr (r3) ;clear "mode" 203: mov (r1),(r4) ;address to "value" 204: inc exmflg ;flag exec mode 205: call propc ;process as op-code 206: clr r0 ;assume error 207: bis errbts,r5 ;error or not terminator? 208: bne 9$ ; yes, error 209: com r0 ;ok, set .ne. zero 210: 9$: return 211: 212: 213: .endc 214: 215: 216: entsec implin 217: exmflg: .blkw ;exec mode flag 218: xitsec 219: 220: 221: .end