home *** CD-ROM | disk | FTP | other *** search
- /
- /
- / 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
- /
-