|
|
Initial revision
#include "../h/config.h"
/*
* Long integer arithmetic routines with overflow checking.
*/
Global(_runerr) /* Run-time error routine */
Global(_ckadd)
Global(_cksub)
Global(_ckmul)
#ifdef VAX
.text
.align 1
/*
* Addition.
*/
_ckadd: Mask 0
addl3 4(ap),8(ap),r0 # Perform addition
jvs oflow # Branch if overflow
ret # Return result in r0
.align 1
/*
* Subtraction.
*/
_cksub:Mask 0
subl3 8(ap),4(ap),r0 # Perform subtraction
jvs oflow # Branch if overflow
ret # Return result in r0
.align 1
/*
* Multiplication.
*/
_ckmul: Mask 0
mull3 4(ap),8(ap),r0 # Perform multiplication
jvs oflow # Branch if overflow
ret # Return result in r0
oflow: # Got overflow on an operation
pushl $0
pushl $203
calls $1,_runerr # runerr(203,0)
#endif VAX
#ifdef PORT
DummyFcn(_ckadd)
DummyFcn(_cksub)
DummyFcn(_ckmul)
#endif PORT
#ifdef PDP11
/ Long integer arithmetic routines with overflow checking
Global(csv)
Global(cret)
.text
_ckadd:
mov r5,-(sp)
mov sp,r5
mov 6(r5),r1
mov 4(r5),r0
add 12(r5),r1
adc r0
bvs oflow
add 10(r5),r0
bvs oflow
br return
_cksub:
mov r5,-(sp)
mov sp,r5
mov 6(r5),r1
mov 4(r5),r0
sub 12(r5),r1
sbc r0
bvs oflow
sub 10(r5),r0
bvs oflow
return:
mov r5,sp
mov (sp)+,r5
rts pc
_ckmul:
jsr r5,csv
mov 6(r5),r2
sxt r1
sub 4(r5),r1
mov 10.(r5),r0
sxt r3
sub 8.(r5),r3
mul r0,r1
mul r2,r3
add r1,r3
mul r2,r0
sub r3,r0
jmp cret
oflow:
clr -(sp)
mov $203.,-(sp)
jsr pc,_runerr
#endif PDP11
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.