#include "osecpu_ask.h" #define L_func LOCAL(0) LOCALLABELS(1); #define func(_r, a, b) R30=a; R31=b; CALL(L_func); _r=R30 // main do { func(R00, 2, 3); api_fillRect(MODE_COL3, R00, 16, 16, 0, 0); } api_end(); // これがないと下の関数を再度実行して無限ループになってしまう. beginFunc(L_func); do { Int32s a:R30, b:R31, r:R30; r = a + b; } endFunc();
#define func(_r, a, b) R30=a; R31=b; CALL(L_func); _r=R30
#include "osecpu_ask.h" #define L_func LOCAL(0) LOCALLABELS(1); #define func(_r, a) R30=a; CALL(L_func); _r=R30 // main do { Int32s ans:R00; func(ans, 10); api_putStringDec('\1', ans, 10, 1); // 「OSECPU-ASKA入門 #0015」で解説します. } api_end(); // これがないと下の関数を再度実行して無限ループになってしまう. beginFunc(L_func); do { Int32s _a:R30, _r:R30, a:R00, b:R01; a = _a; // R30以降のレジスタは、関数呼び出しやAPI呼び出しをすると壊れてしまうので、a(=R00)に保存する. if (a > 1) { b = a - 1; func(b, b); // b = func(a - 1); a *= b; // a = a * func(a - 1); } _r = a; } endFunc();
#include "osecpu_ask.h" #define L_func LOCAL(0) LOCALLABELS(1); #define func_R00_R30() CALL(L_func) // R00で値を渡す. R30で値を返す. // main do { Int32s ans:R00; R00 = 10; func_R00_R30(); ans = R30; api_putStringDec('\1', ans, 10, 1); } api_end(); // これがないと下の関数を再度実行して無限ループになってしまう. beginFunc(L_func); do { Int32s _r:R30, a:R00, b:R01; _r = a; if (a > 1) { b = a; a--; func_R00_R30(); _r *= b; // _r = a * func(a - 1); } } endFunc();
コメント | お名前 | NameLink | |