221 lines
2.1 KiB
ArmAsm
221 lines
2.1 KiB
ArmAsm
/
|
|
/
|
|
|
|
/ a7 -- pdp-11 assembler pass 1
|
|
|
|
expres:
|
|
mov r5,-(sp)
|
|
mov $'+,-(sp)
|
|
clr opfound
|
|
clr r2
|
|
mov $1,r3
|
|
br 1f
|
|
advanc:
|
|
jsr pc,readop
|
|
1:
|
|
mov r4,r0
|
|
jsr r5,betwen; 0; 177
|
|
br .+4
|
|
br 7f
|
|
movb (r4),r0
|
|
mov 2(r4),r1
|
|
br oprand
|
|
7:
|
|
cmp r4,$141
|
|
blo 1f
|
|
cmp r4,$141+10.
|
|
bhis 2f
|
|
movb curfbr-141(r4),r0
|
|
asl r4
|
|
mov curfb-[2*141](r4),r2
|
|
bpl oprand
|
|
jsr r5,error; 'f
|
|
br oprand
|
|
2:
|
|
clr r3
|
|
clr r2
|
|
br oprand
|
|
1:
|
|
mov $esw1,r1
|
|
1:
|
|
cmp (r1)+,r4
|
|
beq 1f
|
|
tst (r1)+
|
|
bne 1b
|
|
tst opfound
|
|
bne 2f
|
|
jsr pc,errore
|
|
2:
|
|
tst (sp)+
|
|
mov (sp)+,r5
|
|
rts pc
|
|
1:
|
|
jmp *(r1)
|
|
|
|
esw1:
|
|
'+; binop
|
|
'-; binop
|
|
'*; binop
|
|
'/; binop
|
|
'&; binop
|
|
037; binop
|
|
035; binop
|
|
036; binop
|
|
'%; binop
|
|
'[; brack
|
|
'^; binop
|
|
1; exnum
|
|
'!; binop
|
|
0; 0
|
|
|
|
binop:
|
|
cmpb (sp),$'+
|
|
beq 1f
|
|
jsr pc,errore
|
|
1:
|
|
movb r4,(sp)
|
|
br advanc
|
|
|
|
exnum:
|
|
mov numval,r1
|
|
mov $1,r0
|
|
br oprand
|
|
|
|
brack:
|
|
mov r2,-(sp)
|
|
mov r3,-(sp)
|
|
jsr pc,readop
|
|
jsr pc,expres
|
|
cmp r4,$']
|
|
beq 1f
|
|
jsr r5,error; ']
|
|
1:
|
|
mov r3,r0
|
|
mov r2,r1
|
|
mov (sp)+,r3
|
|
mov (sp)+,r2
|
|
|
|
oprand:
|
|
inc opfound
|
|
mov $exsw2,r5
|
|
1:
|
|
cmp (sp),(r5)+
|
|
beq 1f
|
|
tst (r5)+
|
|
bne 1b
|
|
br eoprnd
|
|
1:
|
|
jmp *(r5)
|
|
|
|
exsw2:
|
|
'+; exadd
|
|
'-; exsub
|
|
'*; exmul
|
|
'/; exdiv
|
|
037; exor
|
|
'&; exand
|
|
035;exlsh
|
|
036;exrsh
|
|
'%; exmod
|
|
'!; exnot
|
|
'^; excmbin
|
|
0; 0
|
|
|
|
excmbin:
|
|
mov r0,r3 / give left flag of right
|
|
br eoprnd
|
|
|
|
exrsh:
|
|
neg r1
|
|
beq exlsh
|
|
inc r1
|
|
clc
|
|
ror r2
|
|
exlsh:
|
|
jsr r5,combin; 0
|
|
als r1,r2
|
|
br eoprnd
|
|
|
|
exmod:
|
|
jsr r5,combin; 0
|
|
mov r1,-(sp)
|
|
mov r2,r1
|
|
clr r0
|
|
dvd (sp)+,r0
|
|
mov r1,r2
|
|
br eoprnd
|
|
|
|
exadd:
|
|
jsr r5,combin; 0
|
|
add r1,r2
|
|
br eoprnd
|
|
|
|
exsub:
|
|
jsr r5,combin; 1
|
|
sub r1,r2
|
|
br eoprnd
|
|
|
|
exand:
|
|
jsr r5,combin; 0
|
|
com r1
|
|
bic r1,r2
|
|
br eoprnd
|
|
|
|
exor:
|
|
jsr r5,combin; 0
|
|
bis r1,r2
|
|
br eoprnd
|
|
|
|
exmul:
|
|
jsr r5,combin; 0
|
|
mpy r2,r1
|
|
mov r1,r2
|
|
br eoprnd
|
|
|
|
exdiv:
|
|
jsr r5,combin; 0
|
|
mov r1,-(sp)
|
|
mov r2,r1
|
|
clr r0
|
|
dvd (sp)+,r0
|
|
mov r0,r2
|
|
br eoprnd
|
|
|
|
exnot:
|
|
jsr r5,combin; 0
|
|
com r1
|
|
add r1,r2
|
|
br eoprnd
|
|
|
|
eoprnd:
|
|
mov $'+,(sp)
|
|
jmp advanc
|
|
|
|
combin:
|
|
mov r0,-(sp)
|
|
bis r3,(sp)
|
|
bic $!40,(sp)
|
|
bic $!37,r0
|
|
bic $!37,r3
|
|
cmp r0,r3
|
|
ble 1f
|
|
mov r0,-(sp)
|
|
mov r3,r0
|
|
mov (sp)+,r3
|
|
1:
|
|
tst r0
|
|
beq 1f
|
|
tst (r5)+
|
|
beq 2f
|
|
cmp r0,r3
|
|
bne 2f
|
|
mov $1,r3
|
|
br 2f
|
|
1:
|
|
tst (r5)+
|
|
clr r3
|
|
2:
|
|
bis (sp)+,r3
|
|
rts r5
|
|
|