DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦2b3ff6def⟧ TextFile

    Length: 2457 (0x999)
    Types: TextFile
    Notes: UNIX file
    Names: »ddiv.s«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦f4b8d8c84⟧ UNIX Filesystem
        └─ ⟦this⟧ »libc/crt/ddiv.s« 

TextFile

/ floating point package for segmented z-8001
/ timothy s. murphy  10/84
/ IEEE format
/ double:	63 62		52 51				0
/	      sign  bin exp +1022   fraction (missing hi bit)
/ float:	31 30		23 22				0
/	      sign  bin exp +126    fraction (missing hi bit)
/
	.globl	SS

	.globl	drdiv, dldiv
/
/ divide a/b  result in rq4
/ see knuth "art of computer programming" vol.2
/  for explanation of double precision divide
/ life is complicated further by the lack of unsigned multply & divide
/
/ drdiv( da, db)
/ dldiv( da, &db)

drdiv:
	lda	rr2, SS|12(r15)
	jr	un, 0f
dldiv:
	ldl	rr2, SS|12(r15)
0:
	sub	r15, $16
	ldm	(rr14), r6, $8

	ld	r0, SS|20(r15)
	ldl	rr4, SS|22(r15)
	ld	r6, SS|26(r15)
	sub	r7, r7

	ld	r8, (rr2)
	ldl	rr12, rr2(2)
	ld	r10, rr2(6)
	sub	r11, r11

	ld	r1, $32768
	ld	r9, r1
	and	r1, r0
	xor	r0, r1
	cp	r0, $16
	jr	lt, retz
	and	r9, r8
	xor	r8, r9
	xor	r1, r9		/ result sign

	cp	r8, $16
	jr	lt, retinf
	cp	r0, $2047*16
	jr	ge, retinf
	cp	r8, $2047*16
	jr	ge, retz
	ldb	rl1, $4		/ form exponents, fractions
0:
	srl	r0
	rrc	r4
	rrc	r5
	rrc	r6
	rrc	r7
	srl	r8
	rrc	r12
	rrc	r13
	rrc	r10
	rrc	r11
	dbjnz	rl1, 0b

	setflg	C
	rrc	r4
	rrc	r5
	rrc	r6
	rrc	r7

	setflg	C
	rrc	r12
	rrc	r13
	rrc	r10
	rrc	r11

	sub	r0, r8
	add	r0, $1023
	jr	le, retz	/ exp will only get smaller	▶08◀▶08◀▶08◀▶08◀▶08◀
	cp	r0, $2048
	jr	ge, retinf	/ by at most 1

	srll	rr12		/ make divisor positive
	rrc	r10
	rrc	r11

	srll	rr4		/ make quotient defined & positive
	rrc	r6
	rrc	r7
	srll	rr4
	rrc	r6
	rrc	r7
	srll	rr4
	rrc	r6
	rrc	r7

	divl	rq4, rr12	/ rr6 = good approx to hi part of quotient
				/ we adjust using 1st term of power series
				/ as in knuth
	srll	rr10
	ld	r9, $-1
	com	r10
	neg	r11
	sbc	r10, r9

	multl	rq8, rr6	/ - vl x ww▶08◀m  ( cf knuth)
	srll	rr4, $1
	addl	rr8, rr4	/ + r ( no ovflw since opp signs)
	sral	rr8
	rrc	r10
	rrc	r11
	divl	rq8, rr12
	extsl	rq8

	slll	rr10		/ undo shifts for positiveness
	rlc	r9
	slll	rr10
	rlc	r9

	addl	rr8, rr6	/ form quotient of fractions
	
	slll	rr10
	rlc	r9
	rlc	r8
	slll	rr10
	rlc	r9
	rlc	r8
	jr	c, 0f
	slll	rr10
	rlc	r9
	rlc	r8
	dec	r0
	jr	le, retz
0:	
	cp	r0, $2047
	jr	ge, retinf

	slll	rr10
	rlc	r9
	rlc	r8
	rlc	r0
	slll	rr10
	rlc	r9
	rlc	r8
	rlc	r0
	slll	rr10
	rlc	r9
	rlc	r8
	rlc	r0
	slll	rr10
	rlc	r9
	rlc	r8
	rlc	r0

	or	r0, r1
	ld	r1, r8
	ld 	r2, r9
	ld 	r3, r10
9:
	ldm	r6, (rr14), $8
	inc	r15, $16
	ret
retz:
	subl	rr0, rr0
	subl	rr2, rr2
	jr	un, 9b
retinf:
	ld	r0, $2047*16
	or	r0, r1
	sub	r1, r1
	subl	rr2, rr2
	jr	un, 9b