1 ;;;; Wrapper for 2.11BSD/m11/code.m11 2 .list 3 .list 4 .list 5 000001 debug = 1 6 .include "2.11BSD/m11/at.sml" 1 .title at.sml - assembler/translator system macros 2 ; @(#)at.sml 1.3 11/3/82 3 4 .ident /10may4/ 5 6 .macro always ;all files of macro 7 8 .macro .data 9 entsec .data 10 .endm .data 11 12 .macro .text 13 entsec .text 14 .endm 15 16 .macro .bss 17 entsec .bss 18 .endm 19 20 mk.symbol=1 ;one to make symbols, 0 otherwise 21 x40= 0 22 pdpv45= 0 ; host machine has 'mul', 'div', sob' instrucs. 23 ; if not you will have to write macros for them 24 $timdf= 7 ; California Time Zone 25 ; should really use ftime(2) for this and for 26 ; DST. 27 ;xfltg= 0 ;define to assmbl out floating hardware 28 rsx11d = 0 ; rsx11d features 29 debug = 0 ; <<< REEDS if non zero includes debug junk 30 31 ft.id= 1 ;have set i & d. set =0 if not 32 33 ft.unx = 1 ; this macro-11 is for UNIX. =0 if not. 34 35 .nlist bex 36 37 tab= 11 38 lf= 12 39 vt= 13 40 ff= 14 41 cr= 15 42 space= 40 43 44 bpmb = 20 ;bytes per macro block 45 46 47 48 49 50 .psect .text con, shr, gbl,ins 51 .psect .data con, dat, prv, gbl 52 .psect .bss con, bss, gbl 53 54 .psect dpure con, dat, prv, gbl 55 .psect mixed con, prv, gbl 56 .psect errmes con, dat, prv, gbl 57 .psect impure con, bss, gbl 58 .psect imppas con, bss, gbl 59 .psect implin con, bss, gbl 60 .psect swtsec con, dat, prv, gbl ; unix command line flags 61 .psect cndsec con, dat, prv, gbl ; gt, le, equ, etc. for '.if' 62 .psect crfsec con, dat, prv, gbl ; args for -cr flag 63 .psect edtsec con, dat, prv, gbl ; args for .enabl 64 .psect lctsec con, dat, prv, gbl ; args for .list 65 .psect psasec con, dat, prv, gbl 66 .psect pstsec con, dat, prv, gbl 67 .psect rolbas con, dat, prv, gbl ; core allocation: starts of tables 68 .psect rolsiz con, dat, prv, gbl ; sizes of table entries 69 .psect roltop con, dat, prv, gbl ; tops of tables 70 .psect xpcor con,bss , gbl ; this one MUST come last in core 71 72 72 73 .macro entsec name ;init a section 74 .psect name con 75 .endm entsec 76 77 78 79 .macro jeq x,?fred 80 bne fred 81 jmp x 82 fred: 83 .endm 84 .macro jne x,?fred 85 beq fred 86 jmp x 87 fred: 88 .endm 89 .macro xitsec 90 entsec .text 91 .endm xitsec 92 93 94 .macro call address 95 jsr pc,address 96 .endm 97 98 .macro return 99 rts pc 100 .endm 101 102 103 .macro always 104 .nlist bex 105 .endm always 106 .endm always 107 108 109 000001 .if ne debug 110 111 .macro ndebug n 112 .globl ndebug,..z 113 mov n,..z 114 call ndebug 115 .endm 116 117 .macro sdebug string 118 .globl sdebug,..z,..zbuf 119 x = 0 120 .irpc t, 121 movb #''t,..zbuf+x 122 x = x+1 123 .endm 124 movb #0,..zbuf+x 125 mov #..zbuf,..z 126 call sdebug 127 .endm 128 129 .iff 130 131 .macro ndebug n 132 .endm 133 134 .macro sdebug string 135 .endm 136 137 .endc 138 139 140 .macro param mne, value ;define default parameters 141 .iif ndf mne, mne= value 142 .list 143 mne= mne 144 .nlist 145 .endm 145 146 .macro putkb addr ;list to kb 147 .globl putkb 148 mov addr,r0 149 call putkb 150 .endm 151 152 .macro putlp addr ;list to lp 153 .globl putlp 154 mov addr,r0 155 call putlp 156 .endm 157 158 .macro putkbl addr ;list to kb and lp 159 .globl putkbl 160 mov addr,r0 161 call putkbl 162 .endm 163 164 165 .macro xmit wrdcnt ;move small # of words 166 .globl xmit0 167 call xmit0- 168 .endm xmit 169 170 171 ;the macro "genswt" is used to specify a command 172 ;string switch (1st argument) and the address of 173 ;the routine to be called when encountered (2nd arg). 174 ; the switch is made upper-case. 175 176 .macro genswt mne,addr,?label 177 entsec swtsec 178 label: .irpc x,mne 179 .if ge ''x-141 180 .if le ''x-172 181 .byte ''x-40 182 .iff 183 .byte ''x 184 .endc 185 .iff 186 .byte ''x 187 .endc 188 .endm 189 .iif ne <.-label&1>, .byte 0 190 .word addr 191 xitsec 192 .endm 192 193 .macro zread chan 194 .globl zread 195 mov #chan'chn,r0 196 call zread 197 .endm zread 198 199 .macro zwrite chan 200 .globl zwrite 201 mov #chan'chn,r0 202 call zwrite 203 .endm zwrite 203 204 .macro genedt mne,subr ;gen enable/disable table 205 entsec edtsec 206 .rad50 /mne/ 207 .if nb subr 208 .word subr 209 .iff 210 .word cpopj 211 .endc 212 .word ed.'mne 213 xitsec 214 .endm genedt 215 216 217 ;the macro "gencnd" is used to specify conditional 218 ;arguments. it takes two or three arguments: 219 220 ; 1- mnemonic 221 ; 2- subroutine to be called 222 ; 3- if non-blank, complement condition 223 224 .macro gencnd mne,subr,toggle ;generate conditional 225 entsec cndsec 226 .rad50 /mne/ 227 .if b 228 .word subr 229 .iff 230 .word subr+1 231 .endc 232 xitsec 233 .endm 233 234 .macro ch.mne 235 236 ch.ior= '! 237 ch.qtm= '" 238 ch.hsh= '# 239 ch.dol= '$ 240 ch.pct= '% 241 ch.and= '& 242 ch.xcl= '' 243 244 ch.lp= '( 245 ch.rp= ') 246 ch.mul= '* 247 ch.add= '+ 248 ch.com= ', 249 ch.sub= '- 250 ch.dot= '. 251 ch.div= '/ 252 253 ch.col= ': 254 ch.smc= '; 255 ch.lab= '< 256 ch.equ= '= 257 ch.rab= '> 258 ch.qm= '? 259 260 ch.ind= '@ 261 ch.bsl= '\ 262 ch.uar= '^ 263 264 let.a= 'a&^c40 265 let.b= 'b&^c40 266 let.c= 'c&^c40 267 let.d= 'd&^c40 268 let.e= 'e&^c40 269 let.f= 'f&^c40 270 let.g= 'g&^c40 271 let.o= 'o&^c40 272 let.p= 'p&^c40 273 let.r= 'r&^c40 274 let.z= 'z&^c40 275 276 dig.0= '0 277 dig.9= '9 278 .macro ch.mne 279 .endm ch.mne 280 .endm ch.mne 281 282 .macro error num,arg, mess ,?x 283 sdebug 284 .globl err.'arg,ern'num, errbts,errref 285 .if b 286 deliberate error mistake 287 .endc 288 .if dif 0,num 289 .globl err.xx 290 tst err.xx 291 bne x 292 mov #ern'num,err.xx 293 x: 294 .endc 295 bis #err.'arg,errbts 296 .endm 297 298 299 300 .macro setnz addr ;set addr to non-zero for t/f flags 301 mov sp,addr 302 .endm 303 304 305 .macro bisbic arg ; used by .list/.nlist, .enabl/.dsabl 306 .globl bisbic 307 mov #arg,-(sp) 308 call bisbic 309 tst (sp)+ 310 .endm 310 311 ;roll handler calls 312 313 .macro search rolnum ;binary search 314 mov #rolnum,r0 315 .globl search 316 call search 317 .endm 318 319 .macro scan rolnum ;linear scan 320 mov #rolnum,r0 321 .globl scan 322 call scan 323 .endm 324 325 .macro scanw rolnum ;linear scan, one word 326 mov #rolnum,r0 327 .globl scanw 328 call scanw 329 .endm 330 331 .macro next rolnum ;fetch next entry 332 mov #rolnum,r0 333 .globl next 334 call next 335 .endm 336 337 .macro append rolnum ;append to end of roll 338 mov #rolnum,r0 339 .globl append 340 call append 341 .endm 342 343 .macro zap rolnum ;clear roll 344 mov #rolnum,r0 345 .globl zap 346 call zap 347 .endm 348 349 ; call insert ;insert (must be preceded by one 350 ;of the above to set pointers) 351 ; call setrol ;save and set regs for above 351 352 ;flags used in symbol table mode 353 354 .macro st.flg 355 356 .if le ft.unx 357 358 ovrflg= 000004 ;overlay (psect only) 359 defflg= 000010 ;defined 360 relflg= 000040 ;relocatable 361 glbflg= 000100 ;global 362 dfgflg= 000200 ; default global ... reeds's guess 363 364 365 .endc 366 367 .if gt ft.unx 368 369 ; ****** these should not be changed!! ****** 370 shrflg= 000001 ;shareable (psect only) 371 .if gt ft.id 372 insflg= shrflg*2 ;instruction space (psect only) 373 bssflg= insflg*2 ;blank section (psect only) 374 m.idf= shrflg!insflg!bssflg ;mask to turn them off 375 .iff 376 bssflg= shrflg*2 377 m.idf= shrflg!bssflg 378 .endc 379 b.idf= 1 ;shift count to make above bits word offset 380 ; *********************************** 381 defflg= 000010 ;defined 382 ovrflg= 000020 ;overlay (psect only) 383 relflg= 000040 ;relocatable 384 glbflg= 000100 ;global 385 dfgflg= 000200 ; default global ... reeds's guess 386 387 .endc 388 389 ; 390 ; default psect attribs. 391 ; can be changed, but make sure all customers know about 392 ; it, including all the linkers. 393 ; 394 pattrs=relflg!defflg ; For .psects and blank .csects 395 aattrs=glbflg!defflg!ovrflg ; For .asect 396 cattrs=glbflg!relflg!defflg!ovrflg ; For named .csects 397 398 regflg= 000001 ;register 399 lblflg= 000002 ;label 400 mdfflg= 000004 ;multilpy defined 401 .macro st.flg 402 .endm 403 .endm st.flg 404 405 406 407 .macro ct.mne 408 .globl cttbl 409 ct.eol = 000 ; eol 410 ct.com = 001 ; comma 411 ct.tab = 002 ; tab 412 ct.sp = 004 ; space 413 ct.pcx = 010 ; printing character 414 ct.num = 020 ; numeric 415 ct.alp = 040 ; alpha, dot, dollar 416 ct.lc = 100 ; lower case alpha 417 ct.smc = 200 ; semi-colon (sign bit) 418 419 ct.pc = ct.com!ct.smc!ct.pcx!ct.num!ct.alp 420 .macro ct.mne 421 .endm ct.mne 422 .endm ct.mne 423 424 425 .end 425 7 .include "2.11BSD/m11/code.m11" 1 .title code 2 3 .ident /10may4/ 4 5 .mcall (at)always,st.flg,xmit,zwrite 6 000000 always 1 2 .macro .data 3 entsec .data 4 .endm .data 5 6 .macro .text 7 entsec .text 8 .endm 9 10 .macro .bss 11 entsec .bss 12 .endm 13 14 000001 mk.symbol=1 ;one to make symbols, 0 otherwise 15 000000 x40= 0 16 000000 pdpv45= 0 ; host machine has 'mul', 'div', sob' instrucs. 17 ; if not you will have to write macros for them 18 000007 $timdf= 7 ; California Time Zone 19 ; should really use ftime(2) for this and for 20 ; DST. 21 ;xfltg= 0 ;define to assmbl out floating hardware 22 000000 rsx11d = 0 ; rsx11d features 23 000000 debug = 0 ; <<< REEDS if non zero includes debug junk 24 25 000001 ft.id= 1 ;have set i & d. set =0 if not 26 27 000001 ft.unx = 1 ; this macro-11 is for UNIX. =0 if not. 28 29 .nlist bex 30 31 000011 tab= 11 32 000012 lf= 12 33 000013 vt= 13 34 000014 ff= 14 35 000015 cr= 15 36 000040 space= 40 37 38 000020 bpmb = 20 ;bytes per macro block 39 40 41 42 43 ./2.11BSD/m11/code.m11:6->ALWAYS:44: ***ERROR Unknown flag SHR given to .PSECT directive 44 .psect .text con, shr, gbl,ins ./2.11BSD/m11/code.m11:6->ALWAYS:45: ***ERROR Unknown flag DAT given to .PSECT directive 45 .psect .data con, dat, prv, gbl ./2.11BSD/m11/code.m11:6->ALWAYS:46: ***ERROR Unknown flag BSS given to .PSECT directive 46 .psect .bss con, bss, gbl 47 ./2.11BSD/m11/code.m11:6->ALWAYS:48: ***ERROR Unknown flag DAT given to .PSECT directive 48 .psect dpure con, dat, prv, gbl ./2.11BSD/m11/code.m11:6->ALWAYS:49: ***ERROR Unknown flag PRV given to .PSECT directive 49 .psect mixed con, prv, gbl ./2.11BSD/m11/code.m11:6->ALWAYS:50: ***ERROR Unknown flag DAT given to .PSECT directive 50 .psect errmes con, dat, prv, gbl ./2.11BSD/m11/code.m11:6->ALWAYS:51: ***ERROR Unknown flag BSS given to .PSECT directive 51 .psect impure con, bss, gbl ./2.11BSD/m11/code.m11:6->ALWAYS:52: ***ERROR Unknown flag BSS given to .PSECT directive 52 .psect imppas con, bss, gbl ./2.11BSD/m11/code.m11:6->ALWAYS:53: ***ERROR Unknown flag BSS given to .PSECT directive 53 .psect implin con, bss, gbl ./2.11BSD/m11/code.m11:6->ALWAYS:54: ***ERROR Unknown flag DAT given to .PSECT directive 54 .psect swtsec con, dat, prv, gbl ; unix command line flags ./2.11BSD/m11/code.m11:6->ALWAYS:55: ***ERROR Unknown flag DAT given to .PSECT directive 55 .psect cndsec con, dat, prv, gbl ; gt, le, equ, etc. for '.if' ./2.11BSD/m11/code.m11:6->ALWAYS:56: ***ERROR Unknown flag DAT given to .PSECT directive 56 .psect crfsec con, dat, prv, gbl ; args for -cr flag ./2.11BSD/m11/code.m11:6->ALWAYS:57: ***ERROR Unknown flag DAT given to .PSECT directive 57 .psect edtsec con, dat, prv, gbl ; args for .enabl ./2.11BSD/m11/code.m11:6->ALWAYS:58: ***ERROR Unknown flag DAT given to .PSECT directive 58 .psect lctsec con, dat, prv, gbl ; args for .list ./2.11BSD/m11/code.m11:6->ALWAYS:59: ***ERROR Unknown flag DAT given to .PSECT directive 59 .psect psasec con, dat, prv, gbl ./2.11BSD/m11/code.m11:6->ALWAYS:60: ***ERROR Unknown flag DAT given to .PSECT directive 60 .psect pstsec con, dat, prv, gbl ./2.11BSD/m11/code.m11:6->ALWAYS:61: ***ERROR Unknown flag DAT given to .PSECT directive 61 .psect rolbas con, dat, prv, gbl ; core allocation: starts of tables ./2.11BSD/m11/code.m11:6->ALWAYS:62: ***ERROR Unknown flag DAT given to .PSECT directive 62 .psect rolsiz con, dat, prv, gbl ; sizes of table entries ./2.11BSD/m11/code.m11:6->ALWAYS:63: ***ERROR Unknown flag DAT given to .PSECT directive 63 .psect roltop con, dat, prv, gbl ; tops of tables ./2.11BSD/m11/code.m11:6->ALWAYS:64: ***ERROR Unknown flag BSS given to .PSECT directive 64 .psect xpcor con,bss , gbl ; this one MUST come last in core 65 66 67 68 .macro entsec name ;init a section 69 .psect name con 70 .endm entsec 71 72 73 74 .macro jeq x,?fred 75 bne fred 76 jmp x 77 fred: 78 .endm 79 .macro jne x,?fred 80 beq fred 81 jmp x 82 fred: 83 .endm 84 .macro xitsec 85 entsec .text 86 .endm xitsec 87 88 89 .macro call address 90 jsr pc,address 91 .endm 92 93 .macro return 94 rts pc 95 .endm 96 97 98 .macro always 99 .nlist bex 100 .endm always 7 000000 st.flg 1 2 000001 .if le ft.unx 3 4 ovrflg= 000004 ;overlay (psect only) 5 defflg= 000010 ;defined 6 relflg= 000040 ;relocatable 7 glbflg= 000100 ;global 8 dfgflg= 000200 ; default global ... reeds's guess 9 10 11 .endc 12 13 000001 .if gt ft.unx 14 15 ; ****** these should not be changed!! ****** 16 000001 shrflg= 000001 ;shareable (psect only) 17 000001 .if gt ft.id 18 000002 insflg= shrflg*2 ;instruction space (psect only) 19 000004 bssflg= insflg*2 ;blank section (psect only) 20 000007 m.idf= shrflg!insflg!bssflg ;mask to turn them off 21 .iff 22 bssflg= shrflg*2 23 m.idf= shrflg!bssflg 24 .endc 25 000001 b.idf= 1 ;shift count to make above bits word offset 26 ; *********************************** 27 000010 defflg= 000010 ;defined 28 000020 ovrflg= 000020 ;overlay (psect only) 29 000040 relflg= 000040 ;relocatable 30 000100 glbflg= 000100 ;global 31 000200 dfgflg= 000200 ; default global ... reeds's guess 32 33 .endc 34 35 ; 36 ; default psect attribs. 37 ; can be changed, but make sure all customers know about 38 ; it, including all the linkers. 39 ; 40 000050 pattrs=relflg!defflg ; For .psects and blank .csects 41 000130 aattrs=glbflg!defflg!ovrflg ; For .asect 42 000170 cattrs=glbflg!relflg!defflg!ovrflg ; For named .csects 43 44 000001 regflg= 000001 ;register 45 000002 lblflg= 000002 ;label 46 000004 mdfflg= 000004 ;multilpy defined 47 .macro st.flg 48 .endm 8 9 .mcall (at)genedt,setnz,next,append,zap,error 10 11 .globl objchn, objlen 12 .globl savreg, ioftbl, buftbl, cnttbl 13 14 .globl dmprld, endp1c, endp2c, pcroll, prgttl 15 .globl setdsp, setimm, setrld, stcode 16 17 .globl abserr, clcloc, clcnam, clcsec 18 .globl codrol, endvec, mode, objsec 19 ;.globl pass, psaflg, rolupd, secrol 20 .globl pass, rolupd, secrol 21 .globl sector, setpf0, setpf1, setsec, setxpr 22 .globl symbol, symrol, value 23 .globl edmask, ed.abs, ed.pnc 24 .globl dflgbm, opclas 24 25 000040 cc.opr = 040 26 000020 cc.nam = 020 27 000010 cc.sec = 010 28 000004 cc.val = 004 29 000002 cc.dsp = 002 30 31 32 000000 gsdt00= 00*400 ; object module name 33 000400 gsdt01= 01*400 ; program section name 34 001000 gsdt02= 02*400 ; internal symbol table 35 001400 gsdt03= 03*400 ; transfer address 36 002000 gsdt04= 04*400 ; symbol declaration 37 002400 gsdt05= 05*400 ; local section name 38 003000 gsdt06= 06*400 ; version identification 39 40 000001 blkt01= 01 ; gsd 41 000002 blkt02= 02 ; gsd end 42 000003 blkt03= 03 ; text block 43 000004 blkt04= 04 ; rld block 44 000005 blkt05= 05 ; isd 45 000006 blkt06= 06 ; module end 46 000017 blkt17= 17 46 47 .sbttl expression to code-roll conversions 48 49 000000 xitsec ;start in default psect 1 000000 entsec .text 1 000000 .psect .text con 50 51 setimm: ; 52 000000 call savreg 1 000000 004767 000000G jsr pc,savreg 53 000004 call setxpr 1 000004 004767 000000G jsr pc,setxpr 54 000010 005046 clr -(sp) 55 000012 132713 000100 bitb #glbflg,(r3) 56 000016 001047 bne setds3 57 000020 032713 000040 bit #relflg,(r3) 58 000024 001446 beq setdsx 59 000026 121267 000000G cmpb (r2),clcsec 60 000032 001022 bne setds1 61 000034 052716 000010 bis #cc.sec,(sp) 62 000040 000440 br setdsx 63 64 setdsp: 65 000042 call savreg 1 000042 004767 000000G jsr pc,savreg 66 000046 call setxpr 1 000046 004767 000000G jsr pc,setxpr 67 000052 012746 000002 mov #cc.dsp,-(sp) 68 000056 032713 000100 bit #glbflg,(r3) 69 000062 001025 bne setds3 70 000064 121267 000000G cmpb (r2),clcsec 71 000070 001410 beq setds2 72 000072 032713 000040 bit #relflg,(r3) 73 000076 001421 beq setdsx 74 000100 setds1: call setsec 1 000100 004767 000000G jsr pc,setsec 75 000104 052716 000030 bis #cc.sec!cc.nam,(sp) 76 000110 000414 br setdsx 77 78 000112 005013 setds2: clr (r3) 79 000114 005016 clr (sp) 80 000116 116700 000000C movb <^pl rolsiz>+codrol+1,r0 81 ;movb @(pc)+,r0 82 ; .word <^pl rolsiz>+codrol+1 83 000122 005200 inc r0 84 000124 006300 asl r0 85 000126 066700 000000G add clcloc,r0 86 000132 160014 sub r0,(r4) 87 000134 000402 br setdsx 88 89 000136 052716 000020 setds3: bis #cc.nam,(sp) 90 000142 032767 000000G 000000G setdsx: bit #dflgbm,opclas 91 000150 001415 beq 4$ 92 000152 105724 tstb (r4)+ 93 000154 111400 movb (r4),r0 94 000156 001402 beq 1$ 95 000160 005200 inc r0 96 000162 001003 bne 2$ 97 000164 032716 000010 1$: bit #cc.sec,(sp) 98 000170 001402 beq 3$ 99 000172 2$: call abserr 1 000172 004767 000000G jsr pc,abserr 100 000176 105014 3$: clrb (r4) 101 000200 052716 000200 bis #200,(sp) 102 000204 112612 4$: movb (sp)+,(r2) 103 000206 return 1 000206 000207 rts pc 103 104 .globl limit 105 106 limit: 107 000210 call setrld 1 000210 004767 001270 jsr pc,setrld 108 000214 005203 1$: inc r3 109 000216 112722 000040 movb #cc.opr,(r2)+ 110 000222 110322 movb r3,(r2)+ 111 000224 110322 movb r3,(r2)+ 112 000226 call dmprld 1 000226 004767 001166 jsr pc,dmprld 113 000232 012700 000000G mov #symbol,r0 114 000236 005020 clr (r0)+ 115 000240 010320 mov r3,(r0)+ 116 000242 012720 010000 mov #cc.nam*400,(r0)+ 117 000246 005020 clr (r0)+ 118 000250 call stcode 1 000250 004767 000552 jsr pc,stcode 119 000254 020327 000002 cmp r3,#2 120 000260 103755 blo 1$ 121 000262 return 1 000262 000207 rts pc 122 123 .globl ident, rad50 124 ident: ;"ident" directive 125 000264 call rad50 ;treat as rad 50 1 000264 004767 000000G jsr pc,rad50 126 000270 005067 000000G clr rolupd ;point to start of code roll 127 000274 012702 000010' mov #prgidn,r2 ; and to ident block 128 000300 1$: next codrol ;get the next entry 1 000300 012700 000000G mov #codrol,r0 2 .globl next 3 000304 call next 1 000304 004767 000000G jsr pc,next 129 000310 016722 000000G mov value,(r2)+ ;stuff it 130 000314 020227 000014' cmp r2,#prgidn+4 ;two words? 131 000320 103767 blo 1$ ; no 132 000322 012722 003000 mov #gsdt06,(r2)+ ;yes, set gsd type 133 000326 zap codrol ;clear code 1 000326 012700 000000G mov #codrol,r0 2 .globl zap 3 000332 call zap 1 000332 004767 000000G jsr pc,zap 134 000336 return 1 000336 000207 rts pc 135 136 137 000340 entsec impure 1 000000 .psect impure con 138 000000 prgttl: .blkw 4 ;title block 139 000010 prgidn: .blkw 4 ;ident " 140 000020 xitsec 1 000020 entsec .text 1 000340 .psect .text con 140 141 .sbttl object code handlers 142 143 endp1c: ;end pass1 code init 144 000340 105767 000000C tstb ioftbl+objchn ;any obj file? 145 000344 001522 beq 9$ ; no 146 000346 call objini ;init output 1 000346 004767 001030 jsr pc,objini 147 000352 012777 000001 000000C mov #blkt01,@buftbl+objchn ;set block type 1 148 000360 012701 000000' mov #prgttl,r1 ;set "from" index 149 000364 call gsddmp ;output gsd block 1 000364 004767 000230 jsr pc,gsddmp 150 000370 012701 000010' mov #prgidn,r1 ;point to sub-ttl buffer 151 000374 005761 000004 tst 4(r1) ;set? 152 000400 001402 beq 1$ ; no 153 000402 call gsddmp ;yes, stuff it 1 000402 004767 000212 jsr pc,gsddmp 154 000406 005046 1$: clr -(sp) ;init for sector scan 155 000410 012667 000000G 2$: mov (sp)+,rolupd ;set scan marker 156 000414 next secrol ;get the next sector 1 000414 012700 000000G mov #secrol,r0 2 .globl next 3 000420 call next 1 000420 004767 000000G jsr pc,next 157 000424 001446 beq 6$ ;branch if through 158 000426 016746 000000G mov rolupd,-(sp) ;save marker 159 000432 012701 000002G mov #value+2,r1 160 000436 011141 mov (r1),-(r1) 161 000440 005005 clr r5 162 000442 154105 bisb -(r1),r5 163 000444 112711 000005 movb #gsdt05/400,(r1) 164 ;tst psaflg ; who cares? a .csect is a 165 ;bne 3$ ;special kind of .psect 166 ;movb #gsdt01/400,(r1) ; so dont need this code 167 ;bicb #^c,-(r1) ; j reeds sept 81. 168 000450 005067 000000G 3$: clr rolupd ;set for inner scan 169 000454 012701 000000G 4$: mov #symbol,r1 170 000460 call gsddmp ;output this block 1 000460 004767 000134 jsr pc,gsddmp 171 000464 5$: next symrol ;fetch the next symbol 1 000464 012700 000000G mov #symrol,r0 2 .globl next 3 000470 call next 1 000470 004767 000000G jsr pc,next 172 000474 001745 beq 2$ ; finished with this guy 173 000476 032767 000100 000000G bit #glbflg,mode ;global? 174 000504 001767 beq 5$ ; no 175 000506 032767 000001 000000G bit #regflg,mode ;is register (prevent god's wrath) 176 000514 001363 bne 5$ ;no global registers with ==* 177 000516 126705 000000G cmpb sector,r5 ;yes, proper sector? 178 000522 001360 bne 5$ ; no 179 000524 042767 177427 000000G bic #^c,mode ;clear most (leave hk up) 180 000532 052767 002000 000000G bis #gsdt04,mode ;set type 4 181 000540 000745 br 4$ ;output it 182 183 184 000542 042767 177737 000004G 6$: bic #^c,endvec+4 ;clear all but rel flag 185 000550 052767 001410 000004G bis #gsdt03+defflg,endvec+4 186 000556 012701 000000G mov #endvec,r1 187 000562 call gsddmp ;output end block 1 000562 004767 000032 jsr pc,gsddmp 188 000566 call objdmp ;dump it 1 000566 004767 000542 jsr pc,objdmp 189 000572 012777 000002 000000C mov #blkt02,@buftbl+objchn ;set "end of gsd" 190 000600 call objdmf 1 000600 004767 000552 jsr pc,objdmf 191 000604 012777 000017 000000C mov #blkt17,@buftbl+objchn ;init for text blocks 192 9$: 193 000612 005267 000000G inc pass ;set for pass 2 194 000616 return 1 000616 000207 rts pc 195 196 197 gsddmp: ;dump a gsd block 198 000620 call setrld 1 000620 004767 000660 jsr pc,setrld 199 000624 xmit 4 1 .globl xmit0 2 000624 call xmit0-<4*2> 1 000624 004767 177770G jsr pc,xmit0-<4*2> 200 000630 000167 000564 jmp dmprld 200 201 endp2c: 202 000634 005767 000022' tst objpnt ;any object output? 203 000640 001426 beq 1$ ; no 204 000642 call objdmp ;yes, dump it 1 000642 004767 000466 jsr pc,objdmp 205 000001 .if ne,mk.symbol 206 000646 005767 000020' tst out$ym 207 000652 001422 beq 22$ 208 .endc 209 000654 012777 000006 000000C 32$: mov #blkt06,@buftbl+objchn ;set end 210 000662 call objdmf ;dump it 1 000662 004767 000470 jsr pc,objdmf 211 .if ndf xedabs 212 000666 032767 000000G 000000G bit #ed.abs,edmask ;abs output? 213 000674 001010 bne 1$ ; no 214 000676 016700 000022' mov objpnt,r0 215 000702 016720 000006G mov endvec+6,(r0)+ ;set end vector 216 000706 010067 000022' mov r0,objpnt 217 000712 call objdmp 1 000712 004767 000416 jsr pc,objdmp 218 .endc 219 000716 1$: return 1 000716 000207 rts pc 220 221 000001 .if ne,mk.symbol 222 000720 012777 000022 000000C 22$: mov #blkssym,@buftbl+objchn 223 000726 005067 000000G clr rolupd 224 000732 3$: next symrol 1 000732 012700 000000G mov #symrol,r0 2 .globl next 3 000736 call next 1 000736 004767 000000G jsr pc,next 225 000742 001411 beq 31$ 226 000744 032767 000100 000000G bit #glbflg,mode 227 000752 001367 bne 3$ 228 000754 012701 000000G mov #symbol,r1 229 000760 call gsddmp 1 000760 004767 177634 jsr pc,gsddmp 230 000764 000762 br 3$ 231 232 000766 005767 000022' 31$: tst objpnt 233 000772 001402 beq 30$ 234 000774 call objdmp 1 000774 004767 000334 jsr pc,objdmp 235 30$: 236 001000 call locdmp 1 001000 004767 000506 jsr pc,locdmp 237 001004 012777 000021 000000C mov #blksye,@buftbl+objchn 238 001012 005767 000022' tst objpnt 239 001016 001716 beq 32$ 240 001020 call objdmf 1 001020 004767 000332 jsr pc,objdmf 241 001024 000713 br 32$ 242 243 001026 entsec impure 1 000020 .psect impure con 244 000020 out$ym: .blkw 1 245 000022 xitsec 1 000022 entsec .text 1 001026 .psect .text con 246 247 000021 blksye=21 248 000022 blkssys=22 249 250 .globl out$ym 251 .endc 252 252 253 .sbttl code roll handlers 254 255 001026 stcode: append codrol ;append to codrol 1 001026 012700 000000G mov #codrol,r0 2 .globl append 3 001032 call append 1 001032 004767 000000G jsr pc,append 256 001036 return 1 001036 000207 rts pc 257 258 .globl pcrcnt 259 pcroll: ; 260 001040 next codrol 1 001040 012700 000000G mov #codrol,r0 2 .globl next 3 001044 call next 1 001044 004767 000000G jsr pc,next 261 001050 001477 beq 9$ 262 001052 call savreg 1 001052 004767 000000G jsr pc,savreg 263 001056 116704 000000G movb sector,r4 264 001062 005767 000000G tst pass 265 001066 001453 beq 7$ 266 001070 005267 000000' inc pcrcnt 267 001074 001002 bne 1$ 268 001076 call setpf0 1 001076 004767 000000G jsr pc,setpf0 269 001102 1$: call setpf1 1 001102 004767 000000G jsr pc,setpf1 270 001106 005767 000022' tst objpnt 271 001112 001441 beq 7$ 272 .if ndf xedpnc 273 001114 032767 000000G 000000G bit #ed.pnc,edmask 274 001122 001035 bne 7$ 275 .endc 276 001124 call setrld 1 001124 004767 000354 jsr pc,setrld 277 001130 010446 mov r4,-(sp) 278 001132 012704 000070 mov #cc.sec!cc.nam!cc.opr,r4 279 001136 126767 000000G 000001' cmpb clcsec,objsec 280 001144 001006 bne 2$ 281 001146 026767 000000G 000002' cmp clcloc,objloc 282 001154 001411 beq 3$ 283 001156 042704 000020 bic #cc.nam,r4 284 001162 012701 000000G 2$: mov #clcnam,r1 285 001166 call pcrolx 1 001166 004767 000060 jsr pc,pcrolx 286 001172 105022 clrb (r2)+ 287 001174 call dmprld 1 001174 004767 000220 jsr pc,dmprld 288 001200 012604 3$: mov (sp)+,r4 289 001202 012701 000000G mov #symbol,r1 290 001206 call pcrolx 1 001206 004767 000040 jsr pc,pcrolx 291 001212 call dmprld 1 001212 004767 000202 jsr pc,dmprld 292 001216 005267 000000G 7$: inc clcloc 293 001222 105704 tstb r4 294 001224 100402 bmi 8$ 295 001226 005267 000000G inc clcloc 296 001232 116767 000000G 000001' 8$: movb clcsec,objsec 297 001240 016767 000000G 000002' mov clcloc,objloc 298 001246 setnz r0 1 001246 010600 mov sp,r0 299 001250 9$: return 1 001250 000207 rts pc 299 300 pcrolx: 301 001252 110422 movb r4,(r2)+ 302 001254 032704 000020 bit #cc.nam,r4 303 001260 001405 beq 3$ 304 000004 .rept 4 305 movb (r1)+,(r2)+ 306 .endm 1 001262 112122 movb (r1)+,(r2)+ 1 001264 112122 movb (r1)+,(r2)+ 1 001266 112122 movb (r1)+,(r2)+ 1 001270 112122 movb (r1)+,(r2)+ 307 001272 024141 cmp -(r1),-(r1) 308 001274 062701 000006 3$: add #6,r1 309 001300 005711 tst (r1) 310 001302 001407 beq 4$ 311 001304 112122 movb (r1)+,(r2)+ 312 001306 152767 000004 000024' bisb #cc.val,rldtmp 313 001314 105704 tstb r4 314 001316 100401 bmi 4$ 315 001320 112122 movb (r1)+,(r2)+ 316 001322 4$: return 1 001322 000207 rts pc 317 318 001324 entsec implin 1 000000 .psect implin con 319 000000 pcrcnt: .blkw ;extension line flag 319 320 000002 entsec imppas 1 000000 .psect imppas con 321 000000 000 .odd 322 000001 objsec: .blkb 1 ;object file sector 323 000002 objloc: .blkw 1 ;object file location 324 325 326 327 328 329 .if ndf xedpnc 330 000004 genedt pnc,pncset ;punch control 1 000004 entsec edtsec 1 000000 .psect edtsec con 2 000000 063063 .rad50 /pnc/ 3 .if nb pncset 4 000002 001324' .word pncset 5 .iff 6 .word cpopj 7 .endc 8 000004 000000G .word ed.pnc 9 000006 xitsec 1 000006 entsec .text 1 001324 .psect .text con 331 332 001324 112767 000377 000001' pncset: movb #377,objsec ;force sequence break 333 001332 return 1 001332 000207 rts pc 334 .endc 334 335 objdmp: ;dump the object buffer 336 001334 005767 000022' tst objpnt 337 001340 001426 beq objinx ;exit if not pre-set 338 001342 016700 000000C mov buftbl+objchn,r0 339 001346 005720 tst (r0)+ ;ignore first word 340 001350 026700 000022' cmp objpnt,r0 ;anything in rld? 341 001354 101412 blos objini ; no, just init 342 objdmf: 343 001356 016777 000022' 000000C mov objpnt,@cnttbl+objchn 344 001364 166777 000000C 000000C sub buftbl+objchn,@cnttbl+objchn ;compute byte count 345 001372 zwrite obj 1 .globl zwrite 2 001372 012700 000000G mov #objchn,r0 3 001376 call zwrite 1 001376 004767 000000G jsr pc,zwrite 346 347 001402 016767 000000C 000022' objini: mov buftbl+objchn,objpnt 348 001410 062767 000002 000022' add #2,objpnt ;reserve word for block type 349 001416 objinx: return 1 001416 000207 rts pc 350 351 001420 005767 000022' dmprld: tst objpnt 352 001424 001427 beq setrld 353 001426 010146 mov r1,-(sp) ;save byte count 354 001430 012701 000024' mov #rldtmp,r1 355 001434 010200 mov r2,r0 356 001436 160100 sub r1,r0 357 001440 001420 beq 9$ 358 001442 066700 000022' add objpnt,r0 359 001446 166700 000000C sub buftbl+objchn,r0 360 001452 020027 000000G cmp r0,#objlen ;room to store? 361 001456 101402 blos 1$ ; yes 362 001460 call objdmp ;no, dump current 1 001460 004767 177650 jsr pc,objdmp 363 001464 016700 000022' 1$: mov objpnt,r0 ;return with pointer in r2 364 001470 112120 2$: movb (r1)+,(r0)+ 365 001472 020102 cmp r1,r2 366 001474 103775 blo 2$ 367 001476 010067 000022' mov r0,objpnt 368 001502 012601 9$: mov (sp)+,r1 369 001504 012702 000024' setrld: mov #rldtmp,r2 370 001510 return 1 001510 000207 rts pc 371 372 001512 entsec impure 1 000022 .psect impure con 373 000022 objpnt: .blkw 374 000024 rldtmp: .blkb 100. 375 000170 xitsec 1 000170 entsec .text 1 001512 .psect .text con 376 377 378 001512 xitsec 1 001512 entsec .text 1 001512 .psect .text con 379 .globl sx.flg ,lsyrol 380 locdmp: 381 001512 call savreg 1 001512 004767 000000G jsr pc,savreg 382 001516 010046 mov r0,-(sp) 383 001520 005767 000000G tst sx.flg 384 001524 001427 beq 9$ 385 001526 005067 000000G clr rolupd 386 1$: 387 001532 next lsyrol 1 001532 012700 000000G mov #lsyrol,r0 2 .globl next 3 001536 call next 1 001536 004767 000000G jsr pc,next 388 001542 001413 beq 2$ 389 001544 032767 000100 000000G bit #glbflg,mode 390 001552 001367 bne 1$ 391 001554 call unlocl 1 001554 004767 000030 jsr pc,unlocl 392 001560 012701 000000G mov #symbol,r1 393 001564 call gsddmp 1 001564 004767 177030 jsr pc,gsddmp 394 001570 000760 br 1$ 395 2$: 396 001572 005767 000022' tst objpnt 397 001576 001402 beq 9$ 398 001600 call objdmp 1 001600 004767 177530 jsr pc,objdmp 399 9$: 400 001604 012600 mov (sp)+,r0 401 001606 return 1 001606 000207 rts pc 402 403 .globl dnc ,chrpnt, getsym,..z 404 unlocl: 405 001610 call savreg 1 001610 004767 000000G jsr pc,savreg 406 001614 010046 mov r0,-(sp) 407 001616 012702 000000' mov #work.x,r2 408 001622 016701 000002G mov symbol+2,r1 409 001626 call dnc 1 001626 004767 000000G jsr pc,dnc 410 001632 112722 000044 movb #'$,(r2)+ 411 001636 112722 000000 movb #0,(r2)+ 412 001642 call tor50 1 001642 004767 000004 jsr pc,tor50 413 001646 012600 mov (sp)+,r0 414 001650 return 1 001650 000207 rts pc 415 001652 entsec mixed 1 000000 .psect mixed con 416 000000 work.x: .blkw 5 417 000012 xitsec 1 000012 entsec .text 1 001652 .psect .text con 418 tor50: 419 001652 call savreg 1 001652 004767 000000G jsr pc,savreg 420 001656 012704 000000' mov #work.x,r4 421 001662 call 1$ 1 001662 004767 000022 jsr pc,1$ 422 001666 010067 000000G mov r0,symbol 423 001672 012704 000003' mov #3+work.x,r4 424 001676 call 1$ 1 001676 004767 000006 jsr pc,1$ 425 001702 010067 000002G mov r0,2+symbol 426 001706 return 1 001706 000207 rts pc 427 1$: 428 001710 005003 clr r3 429 001712 105714 tstb (r4) 430 001714 001402 beq 10$ 431 001716 112400 movb (r4)+,r0 432 001720 000401 br 20$ 433 001722 111400 10$: movb (r4),r0 434 001724 010002 20$: mov r0,r2 435 001726 call 40$ 1 001726 004767 000062 jsr pc,40$ 436 001732 010003 mov r0,r3 437 001734 010301 mov r3,r1 438 001736 070127 000050 mul #50,r1 439 001742 010103 mov r1,r3 440 001744 105714 tstb (r4) 441 001746 001402 beq 12$ 442 001750 112400 movb (r4)+,r0 443 001752 000401 br 21$ 444 001754 111400 12$: movb (r4),r0 445 001756 010002 21$: mov r0,r2 446 001760 call 40$ 1 001760 004767 000030 jsr pc,40$ 447 001764 060003 add r0,r3 448 001766 010301 mov r3,r1 449 001770 070127 000050 mul #50,r1 450 001774 010103 mov r1,r3 451 001776 111400 movb (r4),r0 452 002000 010002 mov r0,r2 453 002002 call 40$ 1 002002 004767 000006 jsr pc,40$ 454 002006 060003 add r0,r3 455 002010 010300 mov r3,r0 456 002012 return 1 002012 000207 rts pc 457 40$: 458 002014 122702 000044 cmpb #44,r2 459 002020 001005 bne 30$ 460 002022 012700 000033 mov #33,r0 461 002026 000401 br 9$ 462 002030 005000 14$: clr r0 463 002032 9$: return 1 002032 000207 rts pc 464 002034 105702 30$: tstb r2 465 002036 001774 beq 14$ 466 002040 122702 000040 cmpb #40,r2 467 002044 001771 beq 14$ 468 002046 110200 movb r2,r0 469 002050 062700 177756 add #-22,r0 470 002054 000766 br 9$ 471 .end 472 473 .end 473 7 Symbol table $TIMDF= 000007 4$6 001322R L 002 CLCLOC= ****** G LBLFLG= 000002 RLDTMP 000024R 008 . ******R 002 40$9 002014R L 002 CLCNAM= ****** G LF = 000012 ROLUPD= ****** G ..Z = ****** G 5$3 000464R L 002 CLCSEC= ****** G LIMIT 000210RG 002 RSX11D= 000000 1$0 000164R L 002 6$3 000542R L 002 CNTTBL= ****** G LOCDMP 001512R 002 SAVREG= ****** G 1$1 000214R L 002 7$5 001216R L 002 CODROL= ****** G LSYROL= ****** G SECROL= ****** G 1$2 000300R L 002 8$5 001232R L 002 CR = 000015 M.IDF = 000007 SECTOR= ****** G 1$3 000406R L 002 9$3 000612R L 002 DEBUG = 000000 MDFFLG= 000004 SETDS1 000100R 002 1$4 000716R L 002 9$5 001250R L 002 DEFFLG= 000010 MK.SYM= 000001 SETDS2 000112R 002 1$5 001102R L 002 9$7 001502R L 002 DFGFLG= 000200 MODE = ****** G SETDS3 000136R 002 1$7 001464R L 002 9$8 001604R L 002 DFLGBM= ****** G NEXT = ****** G SETDSP 000042RG 002 1$8 001532R L 002 9$9 002032R L 002 DMPRLD 001420RG 002 OBJCHN= ****** G SETDSX 000142R 002 1$9 001710R L 002 AATTRS= 000130 DNC = ****** G OBJDMF 001356R 002 SETIMM 000000RG 002 10$9 001722R L 002 ABSERR= ****** G ED.ABS= ****** G OBJDMP 001334R 002 SETPF0= ****** G 12$9 001754R L 002 APPEND= ****** G ED.PNC= ****** G OBJINI 001402R 002 SETPF1= ****** G 14$9 002030R L 002 B.IDF = 000001 EDMASK= ****** G OBJINX 001416R 002 SETRLD 001504RG 002 2$0 000172R L 002 BLKSSY= 000022 ENDP1C 000340RG 002 OBJLEN= ****** G SETSEC= ****** G 2$3 000410R L 002 BLKSYE= 000021 ENDP2C 000634RG 002 OBJLOC 000002R 009 SETXPR= ****** G 2$5 001162R L 002 BLKT01= 000001 ENDVEC= ****** G OBJPNT 000022R 008 SHRFLG= 000001 2$7 001470R L 002 BLKT02= 000002 FF = 000014 OBJSEC 000001RG 009 SPACE = 000040 2$8 001572R L 002 BLKT03= 000003 FT.ID = 000001 OPCLAS= ****** G STCODE 001026RG 002 20$9 001724R L 002 BLKT04= 000004 FT.UNX= 000001 OUT$YM 000020RG 008 SX.FLG= ****** G 21$9 001756R L 002 BLKT05= 000005 GETSYM= ****** G OVRFLG= 000020 SYMBOL= ****** G 22$4 000720R L 002 BLKT06= 000006 GLBFLG= 000100 PASS = ****** G SYMROL= ****** G 3$0 000176R L 002 BLKT17= 000017 GSDDMP 000620R 002 PATTRS= 000050 TAB = 000011 3$3 000450R L 002 BPMB = 000020 GSDT00= 000000 PCRCNT 000000RG 010 TOR50 001652R 002 3$4 000732R L 002 BSSFLG= 000004 GSDT01= 000400 PCROLL 001040RG 002 UNLOCL 001610R 002 3$5 001200R L 002 BUFTBL= ****** G GSDT02= 001000 PCROLX 001252R 002 VALUE = ****** G 3$6 001274R L 002 CATTRS= 000170 GSDT03= 001400 PDPV45= 000000 VT = 000013 30$4 001000R L 002 CC.DSP= 000002 GSDT04= 002000 PNCSET 001324R 002 WORK.X 000000R 006 30$9 002034R L 002 CC.NAM= 000020 GSDT05= 002400 PRGIDN 000010R 008 X40 = 000000 31$4 000766R L 002 CC.OPR= 000040 GSDT06= 003000 PRGTTL 000000RG 008 XMIT0 = ****** G 32$4 000654R L 002 CC.SEC= 000010 IDENT 000264RG 002 RAD50 = ****** G ZAP = ****** G 4$0 000204R L 002 CC.VAL= 000004 INSFLG= 000002 REGFLG= 000001 ZWRITE= ****** G 4$3 000454R L 002 CHRPNT= ****** G IOFTBL= ****** G RELFLG= 000040 Program sections: . ABS. 000000 000 (RW,I,GBL,ABS,OVR,NOSAV) 000000 001 (RW,I,LCL,REL,CON,NOSAV) .TEXT 002056 002 (RW,I,LCL,REL,CON,NOSAV) .DATA 000000 003 (RW,I,LCL,REL,CON,NOSAV) .BSS 000000 004 (RW,I,LCL,REL,CON,NOSAV) DPURE 000000 005 (RW,I,LCL,REL,CON,NOSAV) MIXED 000012 006 (RW,I,LCL,REL,CON,NOSAV) ERRMES 000000 007 (RW,I,LCL,REL,CON,NOSAV) IMPURE 000170 008 (RW,I,LCL,REL,CON,NOSAV) IMPPAS 000004 009 (RW,I,LCL,REL,CON,NOSAV) IMPLIN 000002 010 (RW,I,LCL,REL,CON,NOSAV) SWTSEC 000000 011 (RW,I,LCL,REL,CON,NOSAV) CNDSEC 000000 012 (RW,I,LCL,REL,CON,NOSAV) CRFSEC 000000 013 (RW,I,LCL,REL,CON,NOSAV) EDTSEC 000006 014 (RW,I,LCL,REL,CON,NOSAV) LCTSEC 000000 015 (RW,I,LCL,REL,CON,NOSAV) PSASEC 000000 016 (RW,I,LCL,REL,CON,NOSAV) PSTSEC 000000 017 (RW,I,LCL,REL,CON,NOSAV) ROLBAS 000000 018 (RW,I,LCL,REL,CON,NOSAV) ROLSIZ 000000 019 (RW,I,LCL,REL,CON,NOSAV) ROLTOP 000000 020 (RW,I,LCL,REL,CON,NOSAV) XPCOR 000000 021 (RW,I,LCL,REL,CON,NOSAV)