461 lines
5.7 KiB
ArmAsm
461 lines
5.7 KiB
ArmAsm
/
|
|
/
|
|
/ routine to divide the two centennial numbers pointed
|
|
/ to by r2 (the divisor) and r3 (the dividend).
|
|
/ A pointer to the result is returned in r1. All other
|
|
/ registers are preserved. If the divisor is zero, zero
|
|
/ is returned and the carry bit is set.
|
|
/ Remainder is returned in r4 and has the sign
|
|
/ of the dividend.
|
|
/
|
|
/
|
|
/ mov divisor,r2
|
|
/ mov dividend,r3
|
|
/ jsr pc,div3
|
|
/ mov r1,result
|
|
/ mov r4,remainder
|
|
/
|
|
/
|
|
div3:
|
|
mov r5,-(sp)
|
|
mov r3,-(sp) /dividend
|
|
mov r2,-(sp) /divisor
|
|
mov r0,-(sp)
|
|
tst -(sp) /result
|
|
/
|
|
/ allocate space for result; allocate temps if necessary
|
|
/
|
|
clr r0
|
|
jsr pc,allocate
|
|
mov r1,0(sp) /result
|
|
/
|
|
/
|
|
/ check for divisor zero
|
|
/
|
|
mov 4(sp),r2 /divisor
|
|
mov w(r2),r0
|
|
sub a(r2),r0
|
|
bne 1f
|
|
jmp eh
|
|
1:
|
|
/
|
|
/ compute sign of result and make arguments positive
|
|
/
|
|
clr divsign
|
|
mov r2,r1
|
|
jsr pc,length
|
|
jsr pc,allocate
|
|
mov r1,divisor
|
|
mov r2,r0
|
|
jsr pc,move
|
|
jsr pc,fsfile
|
|
jsr pc,backspace
|
|
bpl 1f
|
|
2:
|
|
jsr pc,chsign
|
|
mov r1,divisor
|
|
com divsign
|
|
1:
|
|
clr remsign
|
|
mov r3,r1
|
|
jsr pc,length
|
|
jsr pc,allocate
|
|
mov r1,dividend
|
|
mov r3,r0
|
|
jsr pc,move
|
|
jsr pc,fsfile
|
|
jsr pc,backspace
|
|
bpl 1f
|
|
2:
|
|
jsr pc,chsign
|
|
mov r1,dividend
|
|
com divsign
|
|
com remsign
|
|
1:
|
|
/
|
|
/
|
|
/ find out how many digits in the quotient result
|
|
/
|
|
1:
|
|
mov dividend,r2
|
|
mov divisor,r3
|
|
mov w(r2),r0
|
|
sub a(r2),r0
|
|
add a(r3),r0
|
|
sub w(r3),r0
|
|
jlo bugout
|
|
mov r0,divoffset
|
|
mov 0(sp),r1 /result
|
|
inc r0
|
|
jsr pc,seekchar
|
|
clr r0
|
|
mov dividend,r1
|
|
jsr pc,putchar
|
|
/
|
|
/ load r5 with binary divisor for finding
|
|
/ trial quotient digits. If leading digit of
|
|
/ divisor is <10, it is scaled
|
|
/
|
|
clr magic
|
|
mov divisor,r1
|
|
jsr pc,fsfile
|
|
jsr pc,backspace
|
|
mov r0,r5
|
|
cmp r5,$10.
|
|
bge 2f
|
|
inc magic
|
|
2:
|
|
mpy $100.,r5
|
|
jsr pc,backspace
|
|
add r0,r5
|
|
tst magic
|
|
beq 2f
|
|
mov r5,r4
|
|
mpy $100.,r4
|
|
jsr pc,backspace
|
|
add r0,r5
|
|
adc r4
|
|
asl r5
|
|
rol r4
|
|
dvd $25.,r4
|
|
mov r4,r5
|
|
2:
|
|
/
|
|
/ compute trial quotient digit
|
|
/
|
|
1:
|
|
mov dividend,r1
|
|
jsr pc,fsfile
|
|
jsr pc,backspace
|
|
bec 9f; 4; 9:
|
|
mov r0,r3
|
|
mpy $100.,r3
|
|
mov r3,r2
|
|
jsr pc,backspace
|
|
add r0,r2
|
|
mpy $100.,r2
|
|
jsr pc,backspace
|
|
add r0,r3
|
|
adc r2
|
|
tst divoffset
|
|
bne 2f
|
|
add $1,r3
|
|
adc r2
|
|
2:
|
|
/
|
|
tst magic
|
|
beq 3f
|
|
ashc $3,r2
|
|
3:
|
|
mov r5,r0
|
|
tst divoffset
|
|
beq 2f
|
|
inc r0
|
|
2:
|
|
dvd r0,r2
|
|
mov r2,trial
|
|
/
|
|
/
|
|
/ multiply divisor by trial digit
|
|
/
|
|
mov divisor,r1
|
|
jsr pc,rewind
|
|
jsr pc,length
|
|
inc r0
|
|
mov divxyz,r1
|
|
jsr pc,rewind
|
|
clr -(sp)
|
|
2:
|
|
mov divisor,r1
|
|
jsr pc,getchar
|
|
bes 2f
|
|
mov r0,r3
|
|
mpy trial,r3
|
|
add (sp),r3 /carry
|
|
clr r2
|
|
dvd $100.,r2
|
|
mov r2,(sp) /carry
|
|
mov r3,r0
|
|
mov divxyz,r1
|
|
jsr pc,alterchar
|
|
br 2b
|
|
2:
|
|
mov divxyz,r1
|
|
mov (sp)+,r0
|
|
jsr pc,alterchar
|
|
3:
|
|
/
|
|
/ and subtract from dividend
|
|
/
|
|
jsr pc,rewind
|
|
mov divoffset,r0
|
|
mov dividend,r1
|
|
jsr pc,seekchar
|
|
clr -(sp)
|
|
/
|
|
2: mov dividend,r1
|
|
jsr pc,lookchar
|
|
bes 2f
|
|
mov r0,r2
|
|
/
|
|
mov divxyz,r1
|
|
jsr pc,getchar
|
|
sub r0,r2
|
|
sub (sp),r2
|
|
clr (sp)
|
|
mov r2,r0
|
|
bpl 3f
|
|
add $100.,r0
|
|
mov $1.,(sp)
|
|
3: mov dividend,r1
|
|
jsr pc,alterchar
|
|
br 2b
|
|
/
|
|
/ put away the quotient digit
|
|
/
|
|
2:
|
|
mov (sp)+,divcarry
|
|
mov 0(sp),r1 /result
|
|
jsr pc,backspace
|
|
mov trial,r0
|
|
jsr pc,alterchar
|
|
jsr pc,backspace
|
|
/
|
|
/ and go for another digit
|
|
/
|
|
dec divoffset
|
|
bmi 1f
|
|
mov dividend,r1
|
|
dec w(r1)
|
|
cmp w(r1),a(r1)
|
|
bhis 9f; 4; 9:
|
|
jmp 1b
|
|
/
|
|
/ fix up the result
|
|
/
|
|
1:
|
|
tst divcarry
|
|
beq 1f
|
|
mov trial,r0
|
|
dec r0
|
|
jsr pc,alterchar
|
|
mov dividend,r1
|
|
mov $-1,r0
|
|
jsr pc,alterchar
|
|
mov divisor,r2
|
|
mov dividend,r3
|
|
jsr pc,add3
|
|
mov r1,-(sp)
|
|
mov r3,r1
|
|
jsr pc,release
|
|
mov (sp)+,dividend
|
|
1:
|
|
mov 0(sp),r1 /result
|
|
jsr pc,rewind
|
|
clr divcarry
|
|
1:
|
|
jsr pc,lookchar
|
|
bes 1f
|
|
bic $!377,r0
|
|
add divcarry,r0
|
|
clr divcarry
|
|
cmp r0,$100.
|
|
blt 2f
|
|
sub $100.,r0
|
|
inc divcarry
|
|
2: jsr pc,alterchar
|
|
br 1b
|
|
/
|
|
1:
|
|
tst divcarry
|
|
beq 1f
|
|
mov $1.,r0
|
|
jsr pc,alterchar
|
|
1:
|
|
jsr pc,fsfile
|
|
1:
|
|
jsr pc,backspace
|
|
bes 1f
|
|
bne 1f
|
|
mov r(r1),w(r1)
|
|
br 1b
|
|
1:
|
|
/
|
|
/ change sign of result if necessary
|
|
/
|
|
tst divsign
|
|
bpl 1f
|
|
jsr pc,chsign
|
|
1:
|
|
mov dividend,r1
|
|
jsr pc,fsfile
|
|
1:
|
|
jsr pc,backspace
|
|
bes 1f
|
|
bne 1f
|
|
mov r(r1),w(r1)
|
|
br 1b
|
|
1:
|
|
bugout:
|
|
tst remsign
|
|
bpl 1f
|
|
mov dividend,r1
|
|
jsr pc,chsign
|
|
/
|
|
/ clean up junk, restore registers, and return
|
|
/
|
|
1:
|
|
mov divisor,r1
|
|
jsr pc,release
|
|
mov (sp)+,r1
|
|
mov (sp)+,r0
|
|
mov (sp)+,r2
|
|
mov (sp)+,r3
|
|
mov dividend,r4
|
|
mov (sp)+,r5
|
|
clc
|
|
rts pc
|
|
/
|
|
/
|
|
/
|
|
/
|
|
.bss
|
|
divisor: .=.+2
|
|
dividend: .=.+2
|
|
divxyz: .=.+2
|
|
divoffset:.=.+2
|
|
divcarry: .=.+2
|
|
divsign: .=.+2
|
|
trial: .=.+2
|
|
remsign: .=.+2
|
|
magic: .=.+2
|
|
.text
|
|
/
|
|
/
|
|
/
|
|
/ routine to exponentiate the two centennial numbers
|
|
/ pointed to by r2 (the base) and r3 (the exponent).
|
|
/ A pointer to the result is returned in r1.
|
|
/
|
|
/ mov base,r2
|
|
/ mov exp,r3
|
|
/ jsr pc,exp3
|
|
/ mov r1,...
|
|
/
|
|
/
|
|
/ save registers
|
|
/
|
|
exp3:
|
|
mov r3,-(sp) /exponent
|
|
mov r2,-(sp) /base
|
|
mov r0,-(sp)
|
|
/
|
|
/
|
|
1:
|
|
mov $1,r0
|
|
jsr pc,allocate
|
|
mov r1,-(sp) /accumulated result
|
|
mov $1,r0
|
|
jsr pc,putchar
|
|
/
|
|
mov r2,r1
|
|
jsr pc,length
|
|
jsr pc,allocate
|
|
mov r1,-(sp) /powers of the base
|
|
mov r2,r0
|
|
jsr pc,move
|
|
/
|
|
mov r3,r1
|
|
jsr pc,length
|
|
jsr pc,allocate
|
|
mov r1,-(sp) /exponent
|
|
mov r3,r0
|
|
jsr pc,move
|
|
jsr pc,fsfile
|
|
clr exptemp
|
|
jsr pc,backspace
|
|
bpl 1f
|
|
inc exptemp
|
|
jsr pc,chsign
|
|
/
|
|
1:
|
|
mov 0(sp),r1
|
|
jsr pc,length
|
|
beq 1f
|
|
mov sqtemp,r2
|
|
mov 0(sp),r3
|
|
jsr pc,div3
|
|
mov r1,0(sp)
|
|
mov r3,r1
|
|
jsr pc,release
|
|
mov r4,r1
|
|
jsr pc,length
|
|
jsr pc,release
|
|
tst r0
|
|
beq 2f
|
|
/
|
|
/
|
|
/
|
|
mov 2(sp),r2
|
|
mov 4(sp),r3
|
|
jsr pc,mul3
|
|
mov r1,4(sp)
|
|
mov r3,r1
|
|
jsr pc,release
|
|
2:
|
|
mov 2(sp),r3
|
|
mov r3,r1
|
|
jsr pc,length
|
|
jsr pc,allocate
|
|
mov r1,r2
|
|
mov r3,r0
|
|
jsr pc,move
|
|
jsr pc,mul3
|
|
mov r1,2(sp)
|
|
mov r3,r1
|
|
jsr pc,release
|
|
mov r2,r1
|
|
jsr pc,release
|
|
br 1b
|
|
1:
|
|
tst exptemp
|
|
beq 1f
|
|
mov 10(sp),r1
|
|
jsr pc,length
|
|
bne 2f
|
|
jmp eh
|
|
2:
|
|
cmp r0,$1
|
|
blos 2f
|
|
mov 4(sp),r1
|
|
jsr pc,create
|
|
br 1f
|
|
2:
|
|
jsr pc,rewind
|
|
jsr pc,getchar
|
|
cmp r0,$1
|
|
bgt 2f
|
|
mov 4(sp),r1
|
|
jsr pc,create
|
|
jsr pc,putchar
|
|
br 1f
|
|
2:
|
|
mov 4(sp),r1
|
|
jsr pc,create
|
|
1:
|
|
mov (sp)+,r1
|
|
jsr pc,release
|
|
mov (sp)+,r1
|
|
jsr pc,release
|
|
mov (sp)+,r1
|
|
/
|
|
mov (sp)+,r0
|
|
mov (sp)+,r2
|
|
mov (sp)+,r3
|
|
rts pc
|
|
/
|
|
.bss
|
|
exptemp: .=.+2
|
|
.text
|
|
/
|