📄 dc3.s
字号:
/// 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 eh1:// 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 1f2: jsr pc,chsign mov r1,divisor com divsign1: 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 1f2: jsr pc,chsign mov r1,dividend com divsign com remsign1:/// 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 magic2: 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,r52:// 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 r22:/ tst magic beq 3f ashc $3,r23: mov r5,r0 tst divoffset beq 2f inc r02: 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 2b2: mov divxyz,r1 mov (sp)+,r0 jsr pc,alterchar3:// 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)+,dividend1: mov 0(sp),r1 /result jsr pc,rewind clr divcarry1: jsr pc,lookchar bes 1f bic $!377,r0 add divcarry,r0 clr divcarry cmp r0,$100. blt 2f sub $100.,r0 inc divcarry2: jsr pc,alterchar br 1b/1: tst divcarry beq 1f mov $1.,r0 jsr pc,alterchar1: jsr pc,fsfile1: jsr pc,backspace bes 1f bne 1f mov r(r1),w(r1) br 1b1:// change sign of result if necessary/ tst divsign bpl 1f jsr pc,chsign1: mov dividend,r1 jsr pc,fsfile1: jsr pc,backspace bes 1f bne 1f mov r(r1),w(r1) br 1b1: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////.bssdivisor: .=.+2dividend: .=.+2divxyz: .=.+2divoffset:.=.+2divcarry: .=.+2divsign: .=.+2trial: .=.+2remsign: .=.+2magic: .=.+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,release2: 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 1b1: tst exptemp beq 1f mov 10(sp),r1 jsr pc,length bne 2f jmp eh2: cmp r0,$1 blos 2f mov 4(sp),r1 jsr pc,create br 1f2: jsr pc,rewind jsr pc,getchar cmp r0,$1 bgt 2f mov 4(sp),r1 jsr pc,create jsr pc,putchar br 1f2: mov 4(sp),r1 jsr pc,create1: 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/.bssexptemp: .=.+2.text/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -