//BASIC CROSS ASSEMBLER

//
Extra Opcode Routines - for the Xerox LCC processor
//
Q[uit] X will time stamp and compile.
//

//

//
last modified (8 Sept. 1982 12:07 pm PDT (Wednesday))

get "bcastruct.bcpl"

let OpcodeDefRtn() be
[ NoParClass(0)
PgZClass(0)
ImmClass(0)
I40DClass(0)
I40DAClass(0)
I40DDClass(0)
I40AClass(0)
LccIOClass(0)
LccCompareAndJumpClass(0)
LccNoOp2Class(0)
Lcc3BitOpClass(0)
ADMmpmOp(0)
]

//We whimsically decided to add another op class here for the ADM
// --G&D enterprises
and ADMmpmOp(pass, value) = valof //this is a special op to generate the mpm instruction
[ switchon pass into
[
case 0:AddOpcodeClass("@ADMmpmOp", ADMmpmOp)
endcase
case 1: resultis 2

case 2:
[ let Expr = vec size E/WORDSIZE
MustHaveKExpressions(1,1, Expr)
ValueGen(255)
ValueGen(value+FORCEFIELD(Expr, -16, 15, 12, 15))
]
endcase
default:
]
resultis 0
]

and NoParClass(pass, value) = valof
[ switchon pass into
[
case 0: AddOpcodeClass("@noparclass", NoParClass)
endcase
case 1:resultis 1//Total bytes of code generated this line.

case 2: ValueGen(value)
endcase
default:
]
resultis 0
]

and PgZClass(pass, value) = valof
[ switchon pass into
[
case 0: AddOpcodeClass("@pgzclass", PgZClass)
endcase
case 1:resultis 2

case 2:
[ ValueGen(value)
let Expr = vec size E/WORDSIZE
MustHaveKExpressions(1, 1, Expr)
ExprGen(Expr, EntireAddr)
]
endcase

default:
]
resultis 0
]

and ImmClass(pass, value) = valof
[ switchon pass into
[
case 0: AddOpcodeClass("@immclass", ImmClass)
endcase
case 1:resultis 2

case 2:
[ ValueGen(value)
let Expr = vec size E/WORDSIZE
let Expr2 = vec size E/WORDSIZE
let k = MustHaveKExpressions(2, 1, Expr, Expr2)
let relocation = AnyByte
if k gr 1 then
relocation = selecton FORCEFIELD(Expr2, 0, 2, 0, 15) into[
case 0: EntireAddr
case 1: HighByte
case 2: LowByte
]
ExprGen(Expr, relocation)
]
endcase
default:
]
resultis 0
]

and Lcc3BitOpClass(pass, value) = valof
[ switchon pass into
[
case 0:AddOpcodeClass("@lcc3bitopclass", Lcc3BitOpClass)
endcase
case 1: resultis 1

case 2:
[ let Expr = vec size E/WORDSIZE
MustHaveKExpressions(1,1, Expr)
ValueGen(value+FORCEFIELD(Expr, 0, 7, 13, 15))
]
endcase
default:
]
resultis 0
]


and LccIOClass(pass, value) = valof
[ switchon pass into
[
case 0:AddOpcodeClass("@lccioopclass", LccIOClass)
endcase
case 1: resultis 2

case 2:
[ let Expr = vec size E/WORDSIZE
let Expr2 = vec size E/WORDSIZE
MustHaveKExpressions(2,2, Expr, Expr2)
ValueGen(value+FORCEFIELD(Expr, -16, 15, 12, 15))
ExprGen(Expr2, EntireAddr)
]
endcase
default:
]
resultis 0
]

and I40DClass(pass, value) = valof
[ switchon pass into
[
case 0:AddOpcodeClass("@40dclass", I40DClass)
endcase
case 1: resultis 1

case 2:
[ let Expr = vec size E/WORDSIZE
MustHaveKExpressions(1,1, Expr)
ValueGen(value+FORCEFIELD(Expr, -16, 15, 12, 15))
]
endcase
default:
]
resultis 0
]


and I40DAClass(pass, value) = valof
[ switchon pass into
[ case 0:AddOpcodeClass("@40daclass", I40DAClass)
endcase
case 1: resultis 2

case 2:
[ let Expr = vec size E/WORDSIZE
let Expr2 = vec size E/WORDSIZE
MustHaveKExpressions(2,2, Expr, Expr2)
ValueGen(value+FORCEFIELD(Expr, -16, 15, 12, 15))
let DestPC = FORCEFIELD(Expr2, 0, 4095, 0, 15)
ValueGen(FORCEVALUE(DestPC xor
((PCAtBegin+1)᳨), 0, 255, 8, 15))
]
endcase
default:
]
resultis 0
]


and I40DDClass(pass, value) = valof

[ switchon pass into
[ case 0:AddOpcodeClass("@40ddclass", I40DDClass)
endcase

case 1: resultis 2

case 2:
[ let Expr = vec size E/WORDSIZE
let Expr2 = vec size E/WORDSIZE
MustHaveKExpressions(2,2, Expr, Expr2)
ValueGen(value+FORCEFIELD(Expr, -16, 15, 12, 15))
ExprGen(Expr2, AnyByte)
]
endcase

default:
]

resultis 0
]


and I40AClass(pass, value) = valof
[ switchon pass into
[
case 0:AddOpcodeClass("@40aclass", I40AClass)
endcase
case 1: resultis 2

case 2:
[ let Expr = vec size E/WORDSIZE
MustHaveKExpressions(1,1, Expr)
Expr>>E.value = Expr>>E.value+(value lshift 8)
ExprGen(Expr, HighByte)
ExprGen(Expr, LowByte)
]
endcase
default:
]
resultis 0
]


and LccCompareAndJumpClass(pass, value) = valof
[ switchon pass into
[
case 0:AddOpcodeClass("@lcccompareandjumpclass",
LccCompareAndJumpClass)
endcase
case 1: resultis 3

case 2:
[ let Expr = vec size E/WORDSIZE
let Expr2 = vec size E/WORDSIZE
let Expr3 = vec size E/WORDSIZE
MustHaveKExpressions(3,3, Expr, Expr2, Expr3)
ValueGen(value+FORCEFIELD(Expr, 0, 15, 12, 15))
ValueGen(FORCEFIELD(Expr2, -128, 255, 8, 15))
let DestPC = FORCEFIELD(Expr3, 0, 4095, 0, 15)
ValueGen(FORCEVALUE(DestPC xor
((PCAtBegin+2)᳨), 0, 255, 8, 15))
]
endcase
default:
]
resultis 0
]

and LccNoOp2Class(pass, value) = valof
[ switchon pass into
[
case 0:AddOpcodeClass("@lccnoop2class", LccNoOp2Class)
endcase
case 1: resultis 3

case 2: ValueGen(value)
ValueGen(0)
ValueGen(0)
endcase
default:
]
resultis 0
]