* junkなpage #0002 * junkなpage #0003 -(by [[K]], 2013.06.27) ** (0) はじめに -[[jpag0002]]をさらに改造 ** (1) SMEM0PPとLMEM0PP -配列を使っていると、ある要素にアクセスした後で、その次の要素にアクセスしたくなることがよくあります。 -OSECPUではそれに配慮して、 SMEM0(Rxx, typ, Pxx); LIMM(R3F, 1); PADD(Pxx, typ, Pxx, R3F); -をひとまとめにした命令があります。それが SMEM0PP(Rxx, typ, Pxx); です。 -同様にLMEM0PPもあります。これを使って[[jpag0002]]のプログラムを書き直してみたいと思います。 -つぎにPADDIという命令を紹介したいと思います。PADDでは定数を足すことができず、一度適当なレジスタに代入する必要がありました(上記でもまさにそうしています)。しかしこれは面倒です。ということで、それを自動でやってくれるPADDIというのがあります。PADDIの定義は次のとおりです。 #define PADDI(preg0, typ, preg1, imm) LIMM(R3F, imm); PADD(preg0, typ, preg1, R3F) -「エラトステネスのふるい」のアルゴリズムを使った素数表示プログラムです。 #include "osecpu_ask.h" #define L_putDec LOCAL(0) LOCALLABELS(1); #define putDec(i) R30=i; CALL(L_putDec) // main do { int32s i:R00, j:R02; VoidPtr p:P01, ptmp:P02; junkApi_malloc(P01, T_UINT1, 1000); // p PADD(ptmp, T_UINT1, p, 2); R01 = 0; for (i = 2; i != 1000; i++) { SMEM0PP(R01, UINT1, ptmp); } R01 = 1; for (i = 2; i != 1000; i++) { j = i * 2; for (;;) { if (j >= 1000) break; PASMEM0(R01, T_UINT1, p, j); j += i; } } PADD(ptmp, T_UINT1, p, 2); for (i = 2; i != 1000; i++) { LMEM0PP(R01, T_UINT1, ptmp); if (R01 == 0) { putDec(i); junkApi_putConstString(' '); } } } beginFunc(L_putDec); do { 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(); * こめんと欄 #comment