.title at.sml - assembler/translator system macros ; @(#)at.sml 1.3 11/3/82 .ident /10may4/ .macro always ;all files of macro .macro .data entsec .data .endm .data .macro .text entsec .text .endm .macro .bss entsec .bss .endm mk.symbol=1 ;one to make symbols, 0 otherwise x40= 0 pdpv45= 0 ; host machine has 'mul', 'div', sob' instrucs. ; if not you will have to write macros for them $timdf= 7 ; California Time Zone ; should really use ftime(2) for this and for ; DST. ;xfltg= 0 ;define to assmbl out floating hardware rsx11d = 0 ; rsx11d features debug = 0 ; <<< REEDS if non zero includes debug junk ft.id= 1 ;have set i & d. set =0 if not ft.unx = 1 ; this macro-11 is for UNIX. =0 if not. .nlist bex tab= 11 lf= 12 vt= 13 ff= 14 cr= 15 space= 40 bpmb = 20 ;bytes per macro block .psect .text con, shr, gbl,ins .psect .data con, dat, prv, gbl .psect .bss con, bss, gbl .psect dpure con, dat, prv, gbl .psect mixed con, prv, gbl .psect errmes con, dat, prv, gbl .psect impure con, bss, gbl .psect imppas con, bss, gbl .psect implin con, bss, gbl .psect swtsec con, dat, prv, gbl ; unix command line flags .psect cndsec con, dat, prv, gbl ; gt, le, equ, etc. for '.if' .psect crfsec con, dat, prv, gbl ; args for -cr flag .psect edtsec con, dat, prv, gbl ; args for .enabl .psect lctsec con, dat, prv, gbl ; args for .list .psect psasec con, dat, prv, gbl .psect pstsec con, dat, prv, gbl .psect rolbas con, dat, prv, gbl ; core allocation: starts of tables .psect rolsiz con, dat, prv, gbl ; sizes of table entries .psect roltop con, dat, prv, gbl ; tops of tables .psect xpcor con,bss , gbl ; this one MUST come last in core .macro entsec name ;init a section .psect name con .endm entsec .macro jeq x,?fred bne fred jmp x fred: .endm .macro jne x,?fred beq fred jmp x fred: .endm .macro xitsec entsec .text .endm xitsec .macro call address jsr pc,address .endm .macro return rts pc .endm .macro always .nlist bex .endm always .endm always .if ne debug .macro ndebug n .globl ndebug,..z mov n,..z call ndebug .endm .macro sdebug string .globl sdebug,..z,..zbuf x = 0 .irpc t, movb #''t,..zbuf+x x = x+1 .endm movb #0,..zbuf+x mov #..zbuf,..z call sdebug .endm .iff .macro ndebug n .endm .macro sdebug string .endm .endc .macro param mne, value ;define default parameters .iif ndf mne, mne= value .list mne= mne .nlist .endm .macro putkb addr ;list to kb .globl putkb mov addr,r0 call putkb .endm .macro putlp addr ;list to lp .globl putlp mov addr,r0 call putlp .endm .macro putkbl addr ;list to kb and lp .globl putkbl mov addr,r0 call putkbl .endm .macro xmit wrdcnt ;move small # of words .globl xmit0 call xmit0- .endm xmit ;the macro "genswt" is used to specify a command ;string switch (1st argument) and the address of ;the routine to be called when encountered (2nd arg). ; the switch is made upper-case. .macro genswt mne,addr,?label entsec swtsec label: .irpc x,mne .if ge ''x-141 .if le ''x-172 .byte ''x-40 .iff .byte ''x .endc .iff .byte ''x .endc .endm .iif ne <.-label&1>, .byte 0 .word addr xitsec .endm .macro zread chan .globl zread mov #chan'chn,r0 call zread .endm zread .macro zwrite chan .globl zwrite mov #chan'chn,r0 call zwrite .endm zwrite .macro genedt mne,subr ;gen enable/disable table entsec edtsec .rad50 /mne/ .if nb subr .word subr .iff .word cpopj .endc .word ed.'mne xitsec .endm genedt ;the macro "gencnd" is used to specify conditional ;arguments. it takes two or three arguments: ; 1- mnemonic ; 2- subroutine to be called ; 3- if non-blank, complement condition .macro gencnd mne,subr,toggle ;generate conditional entsec cndsec .rad50 /mne/ .if b .word subr .iff .word subr+1 .endc xitsec .endm .macro ch.mne ch.ior= '! ch.qtm= '" ch.hsh= '# ch.dol= '$ ch.pct= '% ch.and= '& ch.xcl= '' ch.lp= '( ch.rp= ') ch.mul= '* ch.add= '+ ch.com= ', ch.sub= '- ch.dot= '. ch.div= '/ ch.col= ': ch.smc= '; ch.lab= '< ch.equ= '= ch.rab= '> ch.qm= '? ch.ind= '@ ch.bsl= '\ ch.uar= '^ let.a= 'a&^c40 let.b= 'b&^c40 let.c= 'c&^c40 let.d= 'd&^c40 let.e= 'e&^c40 let.f= 'f&^c40 let.g= 'g&^c40 let.o= 'o&^c40 let.p= 'p&^c40 let.r= 'r&^c40 let.z= 'z&^c40 dig.0= '0 dig.9= '9 .macro ch.mne .endm ch.mne .endm ch.mne .macro error num,arg, mess ,?x sdebug .globl err.'arg,ern'num, errbts,errref .if b deliberate error mistake .endc .if dif 0,num .globl err.xx tst err.xx bne x mov #ern'num,err.xx x: .endc bis #err.'arg,errbts .endm .macro setnz addr ;set addr to non-zero for t/f flags mov sp,addr .endm .macro bisbic arg ; used by .list/.nlist, .enabl/.dsabl .globl bisbic mov #arg,-(sp) call bisbic tst (sp)+ .endm ;roll handler calls .macro search rolnum ;binary search mov #rolnum,r0 .globl search call search .endm .macro scan rolnum ;linear scan mov #rolnum,r0 .globl scan call scan .endm .macro scanw rolnum ;linear scan, one word mov #rolnum,r0 .globl scanw call scanw .endm .macro next rolnum ;fetch next entry mov #rolnum,r0 .globl next call next .endm .macro append rolnum ;append to end of roll mov #rolnum,r0 .globl append call append .endm .macro zap rolnum ;clear roll mov #rolnum,r0 .globl zap call zap .endm ; call insert ;insert (must be preceded by one ;of the above to set pointers) ; call setrol ;save and set regs for above ;flags used in symbol table mode .macro st.flg .if le ft.unx ovrflg= 000004 ;overlay (psect only) defflg= 000010 ;defined relflg= 000040 ;relocatable glbflg= 000100 ;global dfgflg= 000200 ; default global ... reeds's guess .endc .if gt ft.unx ; ****** these should not be changed!! ****** shrflg= 000001 ;shareable (psect only) .if gt ft.id insflg= shrflg*2 ;instruction space (psect only) bssflg= insflg*2 ;blank section (psect only) m.idf= shrflg!insflg!bssflg ;mask to turn them off .iff bssflg= shrflg*2 m.idf= shrflg!bssflg .endc b.idf= 1 ;shift count to make above bits word offset ; *********************************** defflg= 000010 ;defined ovrflg= 000020 ;overlay (psect only) relflg= 000040 ;relocatable glbflg= 000100 ;global dfgflg= 000200 ; default global ... reeds's guess .endc ; ; default psect attribs. ; can be changed, but make sure all customers know about ; it, including all the linkers. ; pattrs=relflg!defflg ; For .psects and blank .csects aattrs=glbflg!defflg!ovrflg ; For .asect cattrs=glbflg!relflg!defflg!ovrflg ; For named .csects regflg= 000001 ;register lblflg= 000002 ;label mdfflg= 000004 ;multilpy defined .macro st.flg .endm .endm st.flg .macro ct.mne .globl cttbl ct.eol = 000 ; eol ct.com = 001 ; comma ct.tab = 002 ; tab ct.sp = 004 ; space ct.pcx = 010 ; printing character ct.num = 020 ; numeric ct.alp = 040 ; alpha, dot, dollar ct.lc = 100 ; lower case alpha ct.smc = 200 ; semi-colon (sign bit) ct.pc = ct.com!ct.smc!ct.pcx!ct.num!ct.alp .macro ct.mne .endm ct.mne .endm ct.mne .end