Ultrix-3.1/src/ucb/m11/macro.m11
;//////////////////////////////////////////////////////////////////////
;/ Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. /
;/ All Rights Reserved. /
;/ Reference "/usr/src/COPYRIGHT" for applicable restrictions. /
;//////////////////////////////////////////////////////////////////////
.title main
.ident /03apr4/
.mcall (at)always,ch.mne,st.flg
always
ch.mne
st.flg
.mcall (at)xmit,param
.mcall (at)genedt,gencnd,setnz
.mcall (at)search,scanw,next
.if df rsx11d
.mcall (at)scan
.endc
.globl endp2l
.globl secini, stmnt
.globl setmax, propc
.globl exmflg, xctpas, xctlin
.globl objchn, openo
;
.globl clcfgs, clcloc, clcmax
.globl clcnam, clcsec, cpopj
.globl errbts
.globl flags, insert
.globl mode, rellvl
.globl rolupd
.globl sector, setnb
.globl setxpr
.globl symbol, value
.globl endp1c, endp2c
.globl prop1, endp1, prop2, endp2
.globl bksiz
.if ndf xswit
.globl pass, prosw
.endc
.globl savreg, xmit0
.globl endflg, endlin
.globl getlin
.sbttl roll definitions
entsec rolbas
rolbas = .
entsec roltop
entsec rolsiz
xitsec
.macro genrol name, limits, size
entsec rolbas
.globl name'rol
name'rol= .-rolbas
.if nb <limits>
.word <^pl limits>
.iff
.word 0
.endc
entsec roltop
.if nb <limits>
.word <^ph limits>
.iff
.word 0
.endc
entsec rolsiz
.word size*2
xitsec
.iif gt size-maxxmt, maxxmt=size
.endm genrol
.iif ndf maxxmt, maxxmt= 0
.if df rsx11d
genrol reg, ,4 ;register symbols
.endc
genrol sym, ,4 ;symbol table
.if ndf xmacro
genrol mac, ,4 ;macro roll
genrol dma, ,2 ;dummy argument roll
.endc
.if ndf xedlsb
genrol lsy, ,4 ;local symbol roll
.endc
genrol sec, ,5 ;section roll
genrol cod, ,4 ;code roll
genrol dum, ,0 ;dummy (separates variable from fixed)
genrol cnd,cndsec,2 ;conditional arguments
genrol swt,swtsec,2 ;command string switches
genrol edt,edtsec,3 ;enabl/dsabl
genrol lcd,lctsec,1 ;listing control
genrol psa,psasec,2 ;psect attributes
genrol pst,pstsec,4 ;permanent symbol table
genrol crf,crfsec,3 ;cref options
.sbttl assembler proper
entsec impure
pass: .blkw
bksiz: .blkw 2
;next group must stay together
entsec imppas
symbol: .blkw 2 ;symbol accumulator
mode:
flags: .blkb 1 ;flag bits
sector: .blkb 1 ;symbol/expression type
value: .blkw 1 ;expression value
rellvl: .blkw 1
.rept maxxmt-<<.-symbol>/2> ;end of grouped data
.blkw
.endm
clcnam: .blkw 2 ;current location counter symbol
clcfgs: .blkb 1
clcsec: .blkb 1
clcloc: .blkw 1
clcmax: .blkw 1
xitsec ;return to normal
prop1: ;process pass 1
mov #regtbl,r1 ;set to init regs
clr r2
2$: mov #symbol,r4
mov (r1)+,(r4)+ ;set mnemonic
clr (r4)+
.if df rsx11d
scan regrol ;set indices
.iff
search symrol ;set indices
.endc
mov #defflg!regflg,(r4)+
mov r2,(r4)
call insert
inc r2
cmp r2,#10 ;end?
blo 2$ ; no
br prop2 ; yes, exit through pass 2
entsec dpure
regtbl: .rad50 /r0 r1 r2 r3 r4 r5 sp pc /
xitsec
prop2: ;macro pass 2
call xctpas
call secini ;init the sector roll
3$: call getlin ;get the next input line
bne 4$ ; branch if eof
call stmnt ;process the statement
4$: call endlin ;polish off line
tst endflg ;end seen?
beq 3$ ; no, continue
return
endp1: ;end of pass handler
.if ndf xrel
call setmax ;set max location
.iftf
mov #objchn,r0
call openo ;open output file
call endp1c ;init binary
clr rolupd ;set for re-init scan
31$: next secrol ;get the next entry
beq 32$ ; branch if finished
clr value ;found, reset pc
call insert ;put back in table
br 31$
32$:
.endc
return
endp2: ;end of pass 2
.if ndf xrel
call setmax ;set max location
.endc
call endp2c ;clean up binary
jmp endp2l ;output listing of table
.if ndf xswit
prosw: ;process switch
;in - ascii in r0
;out- .ne. 0 if ok
call savreg
call setnb
call setxpr ;set expression-type registers
mov r0,(r1)+ ;set "symbol"
call xctlin ;zero line-oriented flags
scanw swtrol ;scan for switch
beq 9$ ; not found, exit zero
clr (r3) ;clear "mode"
mov (r1),(r4) ;address to "value"
inc exmflg ;flag exec mode
call propc ;process as op-code
clr r0 ;assume error
bis errbts,r5 ;error or not terminator?
bne 9$ ; yes, error
com r0 ;ok, set .ne. zero
9$: return
.endc
entsec implin
exmflg: .blkw ;exec mode flag
xitsec
.end