OpenCores
URL https://opencores.org/ocsvn/raptor64/raptor64/trunk

Subversion Repositories raptor64

[/] [raptor64/] [trunk/] [software/] [sample code/] [sieve.c] - Rev 46

Compare with Previous | Blame | View Log

/*#include <stdio.h>*/
 
#define LIMIT 1500000 /*size of integers array*/
#define PRIMES 100000 /*size of primes array*/
 
nocall my_org() {
	asm {
		org	0x100800200
		db	"BOOT"
		jmp	crt_start
		.align 8
sp_save:
		dw	0
	}
}
 
int main(){
    int i,j,numbers[LIMIT];
    int primes[PRIMES];
	int limit;
	int start_tick,end_tick;
 
	asm {
		lw		r1,#0xAB
		outb	r1,0xdc0600
	}
	start_tick = get_tick();
	asm {
		lw		r1,#0xAC
		outb	r1,0xdc0600
	}
	printf("Start tick %d\r\n", start_tick);
	asm {
		lw		r1,#0xAD
		outb	r1,0xdc0600
	}
 
	limit=LIMIT;
 
    /*fill the array with natural numbers*/
	for (i=0;i<limit;i++){
		numbers[i]=i+2;
	}
 
    /*sieve the non-primes*/
    for (i=0;i<limit;i++){
        if (numbers[i]!=-1){
            for (j=2*numbers[i]-2;j<limit;j+=numbers[i])
                numbers[j]=-1;
        }
    }
 
    /*transfer the primes to their own array*/
    j = 0;
    for (i=0;i<limit&&j<PRIMES;i++)
        if (numbers[i]!=-1)
            primes[j++] = numbers[i];
 
	end_tick = get_tick();
	printf("Clock ticks %d\r\n", end_tick-start_tick);
 
    /*print*/
    for (i=0;i<PRIMES;i++)
        printf("%d\n",primes[i]);
 
return 0;
}
 
int printf(char *p)
{
	int *q;
	asm {
		lw		r1,#0xAE
		outb	r1,0xdc0600
	}
	q = &p;
 
	for (; *p; p++) {
		if (*p=='%') {
			p++;
			switch(*p) {
			case '%':
				putch('%');
				break;
			case 'c':
				q++;
				putch(*q);
				break;
			case 'd':
				q++;
				putnum(*q);
				break;
			case 's':
				q++;
				putstr(*q);
				break;
			}
		}
		else
			putch(*p);
	}
}
 
void putch(char ch)
{
	asm {
		lw		r1,#0xAF
		outb	r1,0xdc0600
	}
	asm {
		lw		r1,#0x0a
		lw		r2,24[bp]
		lw		r3,#1
		syscall	#410
	}
	asm {
		lw		r1,#0xB0
		outb	r1,0xdc0600
	}
}
 
void putnum(int num)
{
	asm {
		lw		r1,#0xB1
		outb	r1,0xdc0600
	}
	asm {
		lw		r1,#0x15
		lw		r2,24[bp]
		lw		r3,#5
		syscall	#410
	}
	asm {
		lw		r1,#0xB2
		outb	r1,0xdc0600
	}
}
 
void putstr(char *p)
{
	asm {
		lw		r1,#0x14
		lw		r2,24[bp]
		syscall	#410
	}
}
 
int get_tick()
{
	asm {
		lw		r1,#0
		syscall	#416
	}
}
 
void crt_start()
{
	asm {
		lw		r1,#0xAA
		outb	r1,0xdc0600
		sw		sp,sp_save
		lw		sp,#0x1_07FFFFF8
		lea		xlr,prog_abort
		call	main
		lw		sp,sp_save
		bra		retcode
prog_abort:
	}
	putstr("Program aborted abnormally.");
	asm {
		lw	sp,sp_save
retcode:
	}
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.