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

Subversion Repositories raptor64

[/] [raptor64/] [trunk/] [software/] [sample code/] [sieve.c] - Blame information for rev 46

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 46 robfinch
/*#include <stdio.h>*/
2
 
3
#define LIMIT 1500000 /*size of integers array*/
4
#define PRIMES 100000 /*size of primes array*/
5
 
6
nocall my_org() {
7
        asm {
8
                org     0x100800200
9
                db      "BOOT"
10
                jmp     crt_start
11
                .align 8
12
sp_save:
13
                dw      0
14
        }
15
}
16
 
17
int main(){
18
    int i,j,numbers[LIMIT];
19
    int primes[PRIMES];
20
        int limit;
21
        int start_tick,end_tick;
22
 
23
        asm {
24
                lw              r1,#0xAB
25
                outb    r1,0xdc0600
26
        }
27
        start_tick = get_tick();
28
        asm {
29
                lw              r1,#0xAC
30
                outb    r1,0xdc0600
31
        }
32
        printf("Start tick %d\r\n", start_tick);
33
        asm {
34
                lw              r1,#0xAD
35
                outb    r1,0xdc0600
36
        }
37
 
38
        limit=LIMIT;
39
 
40
    /*fill the array with natural numbers*/
41
        for (i=0;i<limit;i++){
42
                numbers[i]=i+2;
43
        }
44
 
45
    /*sieve the non-primes*/
46
    for (i=0;i<limit;i++){
47
        if (numbers[i]!=-1){
48
            for (j=2*numbers[i]-2;j<limit;j+=numbers[i])
49
                numbers[j]=-1;
50
        }
51
    }
52
 
53
    /*transfer the primes to their own array*/
54
    j = 0;
55
    for (i=0;i<limit&&j<PRIMES;i++)
56
        if (numbers[i]!=-1)
57
            primes[j++] = numbers[i];
58
 
59
        end_tick = get_tick();
60
        printf("Clock ticks %d\r\n", end_tick-start_tick);
61
 
62
    /*print*/
63
    for (i=0;i<PRIMES;i++)
64
        printf("%d\n",primes[i]);
65
 
66
return 0;
67
}
68
 
69
int printf(char *p)
70
{
71
        int *q;
72
        asm {
73
                lw              r1,#0xAE
74
                outb    r1,0xdc0600
75
        }
76
        q = &p;
77
 
78
        for (; *p; p++) {
79
                if (*p=='%') {
80
                        p++;
81
                        switch(*p) {
82
                        case '%':
83
                                putch('%');
84
                                break;
85
                        case 'c':
86
                                q++;
87
                                putch(*q);
88
                                break;
89
                        case 'd':
90
                                q++;
91
                                putnum(*q);
92
                                break;
93
                        case 's':
94
                                q++;
95
                                putstr(*q);
96
                                break;
97
                        }
98
                }
99
                else
100
                        putch(*p);
101
        }
102
}
103
 
104
void putch(char ch)
105
{
106
        asm {
107
                lw              r1,#0xAF
108
                outb    r1,0xdc0600
109
        }
110
        asm {
111
                lw              r1,#0x0a
112
                lw              r2,24[bp]
113
                lw              r3,#1
114
                syscall #410
115
        }
116
        asm {
117
                lw              r1,#0xB0
118
                outb    r1,0xdc0600
119
        }
120
}
121
 
122
void putnum(int num)
123
{
124
        asm {
125
                lw              r1,#0xB1
126
                outb    r1,0xdc0600
127
        }
128
        asm {
129
                lw              r1,#0x15
130
                lw              r2,24[bp]
131
                lw              r3,#5
132
                syscall #410
133
        }
134
        asm {
135
                lw              r1,#0xB2
136
                outb    r1,0xdc0600
137
        }
138
}
139
 
140
void putstr(char *p)
141
{
142
        asm {
143
                lw              r1,#0x14
144
                lw              r2,24[bp]
145
                syscall #410
146
        }
147
}
148
 
149
int get_tick()
150
{
151
        asm {
152
                lw              r1,#0
153
                syscall #416
154
        }
155
}
156
 
157
void crt_start()
158
{
159
        asm {
160
                lw              r1,#0xAA
161
                outb    r1,0xdc0600
162
                sw              sp,sp_save
163
                lw              sp,#0x1_07FFFFF8
164
                lea             xlr,prog_abort
165
                call    main
166
                lw              sp,sp_save
167
                bra             retcode
168
prog_abort:
169
        }
170
        putstr("Program aborted abnormally.");
171
        asm {
172
                lw      sp,sp_save
173
retcode:
174
        }
175
}

powered by: WebSVN 2.1.0

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