「エラトステネスのふるい」のアルゴリズムを使った素数表示プログラムです。
#include "osecpu_ask.h"
// osecpu049に書き忘れたので自分で書く(すみません!).
#define my_malloc(_p, typ, len) R38=typ; R39=len; DB(0x32,_p&0x3f,0x38,0x39)
#define T_UINT1 0x0d
#define L_putDec LOCAL(0)
LOCALLABELS(1);
#define putDec(i) R30=i; CALL(L_putDec)
// main
for (;0;) {
int32s i:R00, j:R02;
my_malloc(P01, T_UINT1, 1000);
R01 = 0;
for (i = 2; i != 1000; i++) {
PADD(P02, T_UINT1, P01, R00); // i
SMEM(R01, T_UINT1, P02); DB(0);
}
R01 = 1;
for (i = 2; i != 1000; i++) {
j = i * 2;
for (;;) {
if (j >= 1000) break;
PADD(P02, T_UINT1, P01, R02); // j
SMEM(R01, T_UINT1, P02); DB(0);
j += i;
}
}
for (i = 2; i != 1000; i++) {
PADD(P02, T_UINT1, P01, R00); // i
LMEM(R01, T_UINT1, P02); DB(0);
if (R01 == 0) {
putDec(i);
junkApi_putConstString(' ');
}
}
}
jnukApi_exit(0);
beginFunc(L_putDec);
for (;0;) {
int32s i:R00, flag:R01, j:R02, ii:R03;
i = R30;
flag = 0;
if (i < 0) {
junkApi_putConstString('-');
i *= -1;
}
for (j = 1000000000; j >= 10; j /= 10) {
ii = i / j;
i %= j;
if (!(flag == 0 & ii == 0)) {
flag = 1;
ii += '0';
junkApi_putchar(ii);
}
}
i += '0';
junkApi_putchar(i);
}
endFunc();