diff examples/erat-sieve.asm @ 57:2088fd998865

sbc09 directry clean up
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 23 Jul 2018 16:07:12 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/erat-sieve.asm	Mon Jul 23 16:07:12 2018 +0900
@@ -0,0 +1,67 @@
+; ERATOSTHENES SIEVE PRIMES  
+; BYTE MAGAZINE 9/1981 BENCHMARK 
+; Adapted by Johann Klasek, j AT klasek at
+; Previously implemented for a Dragon 32, 
+; later also for a the sim6809 simulator.
+;
+	org	$c000
+
+FLAG	EQU	$5000		; array of bytes, length SIZE
+SIZE	EQU	$2000
+
+START	
+
+        lds	#FLAG		; stack below flags array
+
+;	lda	#$42
+;	jsr	>$b54a		; char out Dragon Basic
+	ldb	#'B
+	swi2
+
+	lda	#$0a
+	pshs	a
+
+ITER	ldx	#FLAG		; array
+	ldu	#$ffff		; filled with
+	ldd	#(SIZE/2)	; words
+CLEAR	stu	,x++		; word fill
+	decb			; byte decrement works only
+	bne	CLEAR		; low byte of count is 0
+	deca	
+	bne	CLEAR
+
+	leau	1,u		; prime counter to 0
+	ldy	#FLAG		; array
+
+PRIMES	tst	,y+		; is prime? 
+	beq	NPRIME
+	leax	-1,y		; prime found
+	tfr	x,d
+	suba	#(FLAG>>8)
+	lslb	
+	rola	
+	addd	#3		; prime = step 
+	bra	STEP
+
+NMARK	clr	,x		; mark all non-primes 
+STEP	leax	d,x		; step to next
+	cmpx	#(FLAG+SIZE)
+	bcs	NMARK
+
+	leau	1,u		; count primes
+NPRIME	cmpy	#(FLAG+SIZE)
+	bcs	PRIMES
+
+	ldb	#'.	
+	swi2			; print
+;	lda	#$2e
+;	jsr	>$b54a		; char out Dragon Basic
+
+	dec	,s
+	bne	ITER
+
+	puls	a		; drop counter
+	pshs	u		; store count on stack
+;	rts
+	sync
+