Add original unix v6
This commit is contained in:
+460
@@ -0,0 +1,460 @@
|
||||
/
|
||||
/
|
||||
/ 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
|
||||
/
|
||||
Reference in New Issue
Block a user