/ / / routine to add the two centennial numbers / pointed to by r2 and r3. / a pointer to the result is returned in r1 / r2 and r3 are preserved / / mov ptr1,r2 / mov ptr2,r3 / jsr pc,add3 / mov r1,... / add3: mov r0,-(sp) mov r4,-(sp) mov r5,-(sp) mov r3,-(sp) mov r2,-(sp) / / allocate a new string whose length is / the max of the two addends. / mov w(r2),r0 sub a(r2),r0 mov w(r3),r4 sub a(r3),r4 cmp r0,r4 bgt 1f mov r4,r0 1: mov r0,r4 jsr pc,allocate mov r1,-(sp) / / get everything ready / mov 2(sp),r1 jsr pc,rewind mov 4(sp),r1 jsr pc,rewind clr carry / / now add them / 2: dec r4 blt 3f mov 2(sp),r1 /r2 jsr pc,getchar mov r0,r5 mov 4(sp),r1 /r3 jsr pc,getchar add r5,r0 add carry,r0 clr carry cmp r0,$100. blt 1f sub $100.,r0 mov $1,carry 1: tstb r0 bpl 1f add $100.,r0 mov $-1,carry 1: mov (sp),r1 /r1 jsr pc,putchar br 2b / / perhaps there is an extra digit / 3: mov carry,r0 beq 2f mov (sp),r1 /r1 jsr pc,putchar / / strip leading zeros / 2: jsr pc,fsfile 2: jsr pc,backspace bes 2f beq 2b inc r(r1) 2: mov r(r1),w(r1) / / strip leading 99's / jsr pc,fsfile jsr pc,backspace cmpb r0,$-1 bne 1f 2: jsr pc,backspace bes 2f cmpb r0,$99. beq 2b jsr pc,getchar 2: mov $-1,r0 jsr pc,alterchar mov r(r1),w(r1) / / restore and return / 1: mov (sp)+,r1 mov (sp)+,r2 mov (sp)+,r3 mov (sp)+,r5 mov (sp)+,r4 mov (sp)+,r0 rts pc / .bss carry: .=.+2 .text / / / routine to change the sign of the centennial number / pointed to by r1. / negative numbers are stored in 100's complement form with / -1 as the high order digit; the second digit is not 99. / / mov ...,r1 / jsr pc,chsign / chsign: mov r1,-(sp) mov r0,-(sp) jsr pc,rewind clr chcarry / 1: jsr pc,lookchar bes 1f negb r0 sub chcarry,r0 mov $1,chcarry add $100.,r0 cmpb $100.,r0 bgt 2f sub $100.,r0 clr chcarry 2: jsr pc,alterchar br 1b / 1: clr r0 sub chcarry,r0 beq 2f jsr pc,putchar jsr pc,fsfile jsr pc,backspace jsr pc,backspace cmp r0,$99. bne 1f mov r(r1),w(r1) mov $-1,r0 jsr pc,putchar br 1f / 2: jsr pc,fsfile jsr pc,backspace bne 1f mov r(r1),w(r1) / 1: mov (sp)+,r0 mov (sp)+,r1 rts pc / .bss chcarry: .=.+2 .text / / / / / routine to multiply the two centennial numbers / pointed to by r2 and r3. / a pointer to the result is returned in r1 / r2 and r3 are preserved / / mov ptr1,r2 / mov ptr2,r3 / jsr pc,mul3 / mov r1,... / / save registers and make space for temps / mul3: mov r5,-(sp) mov r3,-(sp) /arg2 mov r2,-(sp) /arg1 mov r0,-(sp) tst -(sp) /result tst -(sp) /arg1 tst -(sp) /arg2 tst -(sp) /carry / / compute sign of result and make args positive / clr outsign mov r2,r1 jsr pc,fsfile jsr pc,backspace bmi 2f mov r2,4(sp) /arg1 br 1f 2: jsr pc,length jsr pc,allocate mov r1,4(sp) mov r2,r0 jsr pc,move jsr pc,chsign com outsign 1: mov r3,r1 jsr pc,fsfile jsr pc,backspace bmi 2f mov r3,2(sp) /arg2 br 1f 2: mov r3,r1 jsr pc,length jsr pc,allocate mov r1,2(sp) mov r3,r0 jsr pc,move jsr pc,chsign com outsign 1: / / compute the length of the result and / allocate space for it / mov w(r2),r0 sub a(r2),r0 add w(r3),r0 sub a(r3),r0 jsr pc,allocate jsr pc,zero mov r1,6(sp) /result clr offset mov 2(sp),r1 /arg2 jsr pc,rewind / / work on next digit of arg2, starting over on arg1 / 1: mov 4(sp),r1 /arg1 jsr pc,rewind mov 2(sp),r1 /arg2 jsr pc,getchar bes 3f mov r0,r2 mov 6(sp),r1 /result jsr pc,rewind add offset,r(r1) clr 0(sp) /carry / / work on next digit of arg3 / form the product of the two digits, / add to what is already there and add in old carry / to generate new dit and new carry. / 2: mov 4(sp),r1 /arg1 jsr pc,getchar bes 2f mov r0,r3 mpy r2,r3 add (sp),r3 /carry mov 6(sp),r1 /result jsr pc,lookchar add r0,r3 mov r3,r1 clr r0 dvd $100.,r0 mov r0,(sp) /carry mov r1,r0 mov 6(sp),r1 /result jsr pc,alterchar br 2b / 2: inc offset tst (sp) /carry beq 1b mov 6(sp),r1 /result jsr pc,lookchar add (sp),r0 /carry jsr pc,alterchar br 1b / 3: / / change sign of result if necessary / tst outsign bpl 1f mov 6(sp),r1 /result jsr pc,chsign / / release dregs if necessary / 1: cmp 2(sp),14(sp) beq 1f mov 2(sp),r1 jsr pc,release 1: cmp 4(sp),12(sp) beq 1f mov 4(sp),r1 jsr pc,release 1: / / restore registers and return / tst (sp)+ tst (sp)+ tst (sp)+ mov (sp)+,r1 mov (sp)+,r0 mov (sp)+,r2 mov (sp)+,r3 mov (sp)+,r5 rts pc / .bss outsign: .=.+2 offset: .=.+2 k: .=.+2 kptr: .=.+2 .text / sqrt: mov r4,-(sp) mov r3,-(sp) mov r2,-(sp) mov r0,-(sp) / / check for zero or negative / mov w(r1),r2 sub a(r1),r2 / / look at the top one or two digits / mov r1,r3 jsr pc,fsfile jsr pc,backspace mov r0,r4 bit $1,r2 bne 2f mov r4,r1 mul $100.,r1 mov r1,r4 mov r3,r1 jsr pc,backspace add r0,r4 2: / / allocate space for result / inc r2 asr r2 mov r2,r0 jsr pc,allocate jsr pc,zero mov r2,r0 jsr pc,seekchar mov r1,r2 / / get high order digit of arg and square root it / mov $1,r0 2: sub r0,r4 blt 2f add $2,r0 br 2b 2: inc r0 asr r0 mov r0,r4 mov r2,r1 jsr pc,fsfile jsr pc,backspace cmp r4,$100. blt 1f sub $100.,r4 mov r4,r0 jsr pc,alterchar mov $1,r0 jsr pc,putchar br 2f 1: mov r4,r0 jsr pc,alterchar 2: mov r1,-(sp) mov r3,-(sp) / / get successive approx. from Newton / 1: mov (sp),r3 /arg mov 2(sp),r2 /approx jsr pc,div3 mov r1,r3 jsr pc,add3 mov r1,-(sp) mov r3,r1 jsr pc,release mov r4,r1 jsr pc,release mov (sp)+,r1 mov sqtemp,r2 mov r1,r3 jsr pc,div3 mov r1,-(sp) mov r3,r1 jsr pc,release mov r4,r1 jsr pc,release mov (sp)+,r3 mov 2(sp),r1 jsr pc,length jsr pc,allocate mov 2(sp),r0 jsr pc,move jsr pc,chsign mov r1,r2 jsr pc,add3 jsr pc,fsfile jsr pc,backspace jsr pc,release mov r2,r1 jsr pc,release tst r0 bpl 2f / / loop if new < old mov 2(sp),r1 jsr pc,release mov r3,2(sp) br 1b / 2: mov r3,r1 jsr pc,release mov (sp)+,r1 jsr pc,release mov (sp)+,r1 mov (sp)+,r0 mov (sp)+,r2 mov (sp)+,r3 mov (sp)+,r4 rts pc