Trailing-Edge
-
PDP-10 Archives
-
decuslib20-02
-
decus/20-0066/star11.snb
There are 2 other files named star11.snb in the archive. Click here to see a list.
**
************************************
** MACHINE DEPENDENT* PDP11 *
************************************
**
INIT BSIZE = 8
WSIZE = 16
HSIZE = 9999
MAXSIZE = 2 ** 16 - 1
ADDR.WORD = 2
JUMPLOC = FILLTAB( TABLE(14,5) ,
. 'GOTO,GOTO"<-[,MOVA"<-,MOV"+,ADD"-,SUB"!,BIS"'
. '/&/,BIC"&,BIC"X!,XOR"'
. '/,DIV"*,MUL"MOD,MOD"<-<-,ASL"->->,ASR"'
. '\,COM"'
. )
LOGOP = FILLTAB( TABLE(11) ,
. '<=,LE"\>,LE">=,GE"\<,GE"<,LT"\>=,LT"'
. '>,GT"\<=,GT"=,EQ"\=,NE"<>,R"'
. )
SC = '$'
VER = VER '0 STAR11'
MOV = 'MOV'
SW.PIC = '+'
BASE.REG = '%4'
REENT.REG = '%5'
MOVA.PARSE = POS(1) BREAK('(') . OFF
. '(' BREAK(')') . LREG
DEFINE('ASSCK(OP,L.ADDR)')
DEFINE('GETROFF(LAB)')
DEFINE('GENONE(OP)')
DEFINE('GENTWO(OP)')
:(RETURN)
**
BEGIN STARTLAB = LABEL
ASSNL('.TITLE',LABEL)
ASSNL('.GLOBL',LABEL)
GENLAB(LABEL)
( \( IDENT(SW.DEBUG) IDENT(SW.REENT) ) ASSNL(MOV,'%5,-(%6)') )
DIFFER(SW.REENT)
. ASSNL('SUB','$$REENT,%6')
. ASSNL(MOV,'%6,' REENT.REG)
IDENT(OPERAND) :S(RETURN)
OPERAND = DIFFER(SW.REENT)
. GETROFF(OPERAND)
ASSNL(MOV,'%5,' OPERAND)
ASSNL('ADD','#2,' OPERAND)
:(RETURN)
**
FINISH ( DIFFER(SW.REENT) ASSNL('ADD','$$REENT,%6') )
( \( IDENT(SW.DEBUG) IDENT(SW.REENT) ) ASSNL(MOV,'(%6)+,%5') )
ASSNL('RTS','%5')
( DIFFER(SW.REENT) ASS('$$REENT','.WORD',RADIX(TOTSTORE)) )
DSLOOP SAVEDS BREAK.TAB =
. GENLAB(T1) PUT('.=.+' RADIX(T2)) :S(DSLOOP)
DCLOOP SAVEDC BREAK.TAB = ASS(T1,'.ASCIZ','"' T2 '"') :S(DCLOOP)
ASSNL('.END',STARTLAB) :(RETURN)
**
COMMENT STATE LEN(69) . T1 = PUT(';' T1) :S(COMMENT)
PUT(';' STATE) :(RETURN)
**
RADIX RADIX = DEC2OCT(RADIX) :(RETURN)
**
STATSRT DIFFER(SW.DEBUG) \(
. DIFFER(OPCODE,'DO') DIFFER(OPCODE,'IF')
. DIFFER(OPCODE,'IFANY') DIFFER(OPCODE,'CALLS')
. ) ASS(LABEL,MOV,'#' RADIX(STATENO) ',' REENT.REG)
. :S(RETURN)
( DIFFER(OPCODE,'BEGIN') GENLAB(LABEL) ) :(RETURN)
**
GENTWO ( DIFFER(OP,'CMP') OFFLOC(L.ADDR) )
OP = IDENT(LR,'YY') OP 'B'
ASSNL(OP,R.ADDR ',' L.ADDR) :(RETURN)
**
ASSCK L.ADDR POS(0) BREAK(',') . T1
OFFLOC(T1)
GENONE OP = IDENT(R.F,'Y') OP 'B'
OFFLOC(L.ADDR)
ASSNL(OP,L.ADDR) :(RETURN)
**
CALLSRT DIFFER(SW.REENT) :F(RETURN)
BLOCK = GETLAB()
DS(BLOCK,2) :(RETURN)
**
GENCALL ASSNL('.GLOBL ',LOC)
( NE(NARG) DIFFER(SW.REENT) ) :S(RENCALL)
ASSNL('JSR','%5,' LOC)
EQ(NARG,0) :S(RETURN)
NARG = NARG * 2
ARGLAB = GETLAB()
ASSNL('BR',ARGLAB)
GENLAB(CALLLAB)
PUT('.=.+' RADIX(NARG))
GENLAB(ARGLAB) :(RETURN)
RENCALL L1 = GETLAB() ; L2 = GETLAB()
BLOCK = GETROFF(CALLLAB)
BLOCK POS(0) BREAK('(') . OFF
DS(CALLLAB,NARG * ADDR.WORD)
ASSNL(MOV,'#' NARG ',' BLOCK)
ASSNL('INCB','1+' BLOCK)
( ASSNL(MOV,'#207,2+' (2 * NARG) '+' BLOCK) )
ASSNL('JSR','%7,' L2)
ASSNL('BR',L1)
( ASS(L2,MOV,'%5,-(%6)') )
ASSNL(MOV,'%3,%5')
ASSNL('ADD','#' OFF ',%5')
ASSNL('JMP',LOC)
GENLAB(L1) :(RETURN)
**
GENLOG IDENT(OP,'R') :S(GENLB)
IDENT(L.F,'1') :S(GENL1)
( IDENT(R.ADDR,'#0') GENONE('TST') ) :S(GENLB)
( FLIP() GENTWO('CMP') )
GENLB ASSNL('B' OP,LOC) :(RETURN)
GENL1 R.A = R.ADDR ; R.ADDR = '#' TAB.MASK(R.ENTRY)
GENTWO('BIT')
IDENT(R.A,'#0') :S(GENLB)
OP = IDENT(R.A,'#1') IDENT(OP,'EQ') 'NE' :S(GENLB)
OP = IDENT(R.A,'#1') IDENT(OP,'NE') 'EQ' :S(GENLB)
( ERROR('BIT TESTS SUPPORT ONLY (EQ,NE) FOR (0,1)') ) :(RETURN)
**
ASS T1 = IDENT(T2) DIFFER(T1) T1 '=.' :S(ASS1)
T1 = DIFFER(T1) T1 ':'
ASS1 T4 = T4 SAVECOM
SAVECOM =
T2 = GE(SIZE(T2),5) T2 ' '
T3 = DIFFER(T4) RPAD(T3,20) ';' T4
( PUT( RPAD(T1,10) RPAD(T2,5) T3) ) :(RETURN)
**
GENLOAD ASSNL(MOV,ADDR ',' R) :(RETURN)
**
GETREG GETREG = '%' (WHEN + 1) :(RETURN)
**
TABSTM MASK = CKTYPE(LF,'1') RADIX( 2 ** (WSIZE - LOW - 1) )
IDENT(BASE,'REG') DIFFER(SW.REG) PUT('REG=' BASE.REG)
CKTYPE(LF,'Y') :F(RETURN)
OFF = OFF + 1 - (LOW / BSIZE) :(RETURN)
**
GETROFF GETROFF = REENT.OFF<LAB> '(' REENT.REG ')' :(RETURN)
********
** OPTIMIZATION
********
CKREGD DIFFER(SW.OPT2) :F(RETURN)
ADDR POS(0) '@' :S(RETURN)
BASELOC = EQ(OFF,0) '@' ADDR :F(RETURN)
LREG = :(FRETURN)
********
** OPERATIONS
********
O.MOVA OP = MOV
CKTYPET(TF,'B',R.TYPE) :F(O.TWO)
R.ADDR = '#' R.ADDR
R.ADDR POS(0) '#@' = :S(O.TWO)
R.ADDR MOVA.PARSE :S(REGOFF)
DIFFER(SW.PIC) :F(O.TWO)
R.ADDR POS(0) '#' REM . OFF :F(O.TWO)
OFF = OFF '-.'
LREG = '%7'
REGOFF LREG = '%0'
. DIFFER(SW.REENT SW.PIC)
. ASSNL(MOV,LREG ',%0')
R.ADDR = LREG
( DIFFER(OFF) OFFREG(R.ADDR)
. ASSNL('ADD','#' OFF ',' R.ADDR) ) :(O.TWO)
**
O.ADD OP = IDENT(R.ADDR,'#1') 'INC' :S(O.ONE)F(O.TWOCK)
**
O.SUB OP = IDENT(R.ADDR,'#1') 'DEC' :S(O.ONE)F(O.TWOCK)
**
O.TWOCK IDENT(R.F,'Y') :S(O.40)F(O.TWO)
**
O.BIS :(O.TWO)
**
O.MOV IDENT(L.F,'1') :S(MOV1)
OP = IDENT(R.ADDR,'#0') 'CLR' :S(O.ONE)F(O.TWO)
MOV1 R.A = R.ADDR ; R.ADDR = '#' TAB.MASK(L.ENTRY)
OP = IDENT(R.A,'#0') 'BIC' :S(O.TWO)
OP = IDENT(R.A,'#1') 'BIS' :S(O.TWO)
GENTWO('BIC')
( ASSNL('BIT','#' TAB.MASK(R.ENTRY) ',' R.A) )
LAB = GETLAB()
ASSNL('BEQ',LAB)
( GENTWO('BIS') GENLAB(LAB) ) :(RETURN)
**
O.MUL DIFFER(SW.M40) :S(O.40)
ASSNL(MOV,'#177304,%0')
( ASSCK(MOV,L.ADDR ',(%0)+') )
( ASSCK(MOV,R.ADDR ',(%0)') )
R.ADDR = '-(%0)' ; OP = MOV :(O.TWO)
**
O.MOD
O.DIV DIFFER(SW.M40) :S(O.40)
ASSNL(MOV,'#177304,%0')
( ASSCK(MOV,L.ADDR ',(%0)') )
ASSCK(MOV,R.ADDR ',@#177300')
R.ADDR = '(%0)'
R.ADDR = IDENT(OP,'MOD') '-' R.ADDR
OP = MOV :(O.TWO)
**
O.ASR IDENT(R.ADDR,'#1') :S(O.ONE)
R.ADDR '#' = '#-' :S(O.ASH)
O.ASL IDENT(R.ADDR,'#1') :S(O.ONE)
O.ASH OP = 'ASH'
( IDENT(SW.M40) ERROR('SHIFTING OTHER THAN 1 NOT SUPPORTED')
. ) :S(RETURN)F(O.40)
**
O.BIC ASSCK(MOV,R.ADDR ',%0')
ASSNL('COM','%0')
R.ADDR = '%0' :(O.TWO)
**
O.COM IDENT(L.F,'1') :F(O.ONE)
OP = 'XOR'
R.ADDR = '#' TAB.MASK(L.ENTRY)
L.F = 'W' ; R.F = 'W'
O.XOR DIFFER(SW.M40) :S(O.X40)
ASSCK(MOV,R.ADDR ',%0')
ASSCK('BIC',L.ADDR ',%0')
ASSCK('BIC',R.ADDR ',' L.ADDR)
R.ADDR = '%0' ; OP = 'BIS' :(O.TWO)
O.X40 ASSCK(MOV,R.ADDR ',%0')
ASSCK(OP,'%0,' L.ADDR) :(RETURN)
**
O.40 ASSCK(MOV,L.ADDR ',%0')
R.ADDR = IDENT(R.F,'Y') ASSNL('MOVB',R.ADDR ',%1') '%1'
( IDENT(OP,'MOD') ASSNL('DIV', R.ADDR ',%0')
. ASSCK(MOV,'%1,' L.ADDR) ) :S(RETURN)
ASSNL(OP,R.ADDR ',%0')
ASSCK(MOV,'%0,' L.ADDR) :(RETURN)
**
O.GOTO ASSNL('JMP',LEFT) :(RETURN)
**
O.ONE GENONE(OP) :(RETURN)
**
O.TWO GENTWO(OP) :(RETURN)
**
END