return;
}
+// drawString
void devFunc0006(int mod, int sx, int sy, int x, int y, int c, int len, unsigned char *puc, HOSECPU_RuntimeEnvironment *r)
{
int xx;
printf("R31=%d(dec)\n", r->ireg[0x31]);
break;
- case 0xff01:
+ case 0xff01: // junkApi_fopenRead(_filesize, _p, arg) R31=arg; PCALL(P28); _filesize=R30; _p=P31
+
/* return: R30, P31 */
if (r->buf0 == NULL){
r->buf0 = malloc(1024 * 1024);
r->ireg[0x30] = i;
break;
- case 0xff02:
+ case 0xff02: // junkApi_fopenWrite(arg, filesize, p) R31=arg; R32=filesize; P31=p;
/* return: none */
if (r->mainArgc <= r->ireg[0x31]) {
fprintf(stderr, "devFunc: error: R30=ff02: argc error: R31=%08X\n", r->ireg[0x31]);
fclose(fp);
break;
- case 0xff03:
+ case 0xff03: // junkApi_allocBuf(_p) _p=P31
/* return: P31 */
if (r->buf1 == NULL){
r->buf1 = malloc(1024 * 1024);
printf("P31.(p-p0)=%d(dec)\n", (int)(r->preg[0x31].p - r->preg[0x31].p0));
break;
- case 0xff05:
+ case 0xff05: // junkApi_writeStdout(len, p) R31=len; P31=p;
fwrite(r->preg[0x31].p, 1, r->ireg[0x31], stdout);
break;
- case 0xff06:
+ case 0xff06: // jnukApi_exit(i) R31=i;
// R31はリターンコード.
// これを反映すべきだが、現状は手抜きでいつも正常終了.
longjmp(*(r->setjmpEnv), 1);
break;
- case 0xff07:
+ case 0xff07: // junkApi_putConstString0(s) DB(0xff,0x00,0x00); DB%(s,0x00);
// マシになった文字列表示.OSASK文字列に対応.offにすれば通常の文字列処理もできる.現状はonのみサポート.
checkString(r, 0x31, 0x31);
devFunc0001(r->ireg[0x31], r->preg[0x31].p, r);
break;
- case 0xff08:
+ case 0xff08: // junkApi_jitc2(_rc, _p, mod, lev, di1, len, s) R31=mod; R32=lev; R33=di1; R34=len; P31=s; _rc=R30; _p=P31
// JITC on JITC
// R31: 言語(back-end, front-end, ...
// R32: level
r->ireg[0x30] = -1;
break;
- case 0xff09:
+ case 0xff09: //putStringDec
// たぶんbit7を使ったテキストはうまく処理できない(これはもはや仕様にしても問題ないかも).
checkString(r, 0x31, 0x31);
len = devFunc0016(sizeof pucbuf, pucbuf, r->ireg[0x31], r->preg[0x31].p, r->ireg[0x32], (int *)r->preg[0x32].p, r);
devFunc0001(len, pucbuf, r);
break;
- case 0xff40:
+ case 0xff40: // junkApi_openWin(xsiz, ysiz) R31=xsiz; R32=ysiz;
/* R31とR32でサイズを指定 */
mainWindow.xsize = r->ireg[0x31];
mainWindow.ysize = r->ireg[0x32];
}
break;
- case 0xff41:
+ case 0xff41: // junkApi_flushWin(xsiz, ysiz, x0, y0) R31=xsiz; R32=ysiz; R33=x0; R34=y0
/* R31とR32でサイズを指定、R33とR34でx0,y0指定 */
if (r->ireg[0x31] == -1) {
r->ireg[0x31] = mainWindow.xsize; r->ireg[0x33] &= 0;
drv_flshWin(r->ireg[0x31], r->ireg[0x32], r->ireg[0x33], r->ireg[0x34]);
break;
- case 0xff42:
+ case 0xff42: // junkApi_sleep(opt, msec) R31=opt; R32=msec
if (r->ireg[0x32] == -1) {
r->autoSleep = 1;
longjmp(*(r->setjmpEnv), 1);
}
break;
- case 0xff43:
+ case 0xff43: // junkApi_inkey(_i, mod) R31=mod; _i=R30
// 1:peek
// 2:stdin
// 4,8: ソース指定.
if (r->ireg[0x30] == 4135) r->ireg[0x33]++;
break;
- case 0xff44:
+ case 0xff44: // junkApi_drawPoint(mod, x, y, c) R31=mod; R32=x; R33=y; R34=c
c = loadColor(r, 0x34);
if (r->ireg[0x32] < 0 || r->ireg[0x32] >= mainWindow.xsize ||
r->ireg[0x33] < 0 || r->ireg[0x33] >= mainWindow.ysize){
}
break;
- case 0xff45:
+ case 0xff45: // junkApi_drawLine(mod, x0, y0, x1, y1, c) DB(0xfe,0x05,0x01); DDBE(0x0003); R30=0xff45; R31=mod; R32=x0; R33=y0; R34=x1; R35=y1; R36=c
//drawLine
c = loadColor(r, 0x36);
if (r->ireg[0x32] < 0 || r->ireg[0x32] >= mainWindow.xsize ||
devFunc0006(r->ireg[0x31], r->ireg[0x32], r->ireg[0x33], r->ireg[0x34], r->ireg[0x35], loadColor(r, 0x36), r->ireg[0x37], r->preg[0x31].p, r);
break;
- case 0xff49:
+ case 0xff49: // junkApi_rand(_r, range) R31=range; _r=R30
// **** junkApi_rand(i, max) ****
// 0 <= i <= maxとなるiを返す。
// max==0のとき、iはSINT32全体を範囲とする乱数となる。
r->ireg[0x30] = (int)(time(NULL) ^ (long)0x55555555);
break;
- case 0xff4c:
+ case 0xff4c: // drawStringDec
checkString(r, 0x37, 0x31);
len = devFunc0016(sizeof pucbuf, pucbuf, r->ireg[0x37], r->preg[0x31].p, r->ireg[0x38], (int *)r->preg[0x32].p, r);
devFunc0006(r->ireg[0x31], r->ireg[0x32], r->ireg[0x33], r->ireg[0x34], r->ireg[0x35], loadColor(r, 0x36), len, pucbuf, r);
if (cp != NULL){
stacksiz = strtol(cp, NULL, 0);
}
+
+ // jitbufは先頭。 jpは現在位置
jp = jitbuf; /* JIT-pointer */
/* フロントエンドコードをバックエンドコードに変換する */
- if ((env.appBin[2] & 0xf0) != 0) {
+ if ((env.appBin[2] & 0xf0) != 0) { // 3バイト目が00なら処理しない
systmp0[0] = env.appBin[0];
systmp0[1] = env.appBin[1];
env.preg[2].p = systmp0 + 2;
}
env.buf0 = env.buf1 = NULL;
- env.preg[0x28].p = p28;
+
+ // p28にapiをコールするアドレスを設定
+ env.preg[0x28].p = p28; // p28には、devFuncをコールするコードが書かれている
env.preg[0x28].typ = 0; // TYP_CODE
- env.preg[0x28].p0 = p28;
- env.preg[0x28].p1 = p28 + 1;
+ env.preg[0x28].p0 = p28; // アドレス演算できる範囲を制限
+ env.preg[0x28].p1 = p28 + 1; // アドレス演算できる範囲を制限
+
//env.preg[0x00].p = malloc(1024 * 1024) + (1024 * 1024 - 32);
env.junkStack = malloc(stacksiz << 20);
env.junkStack1 = env.junkStack + (stacksiz << 20);