4 extern unsigned char fontdata[]; // @fontdata.c
\r
6 const char *searchArg(int argc, const char **argv, const char *tag, int i)
\r
8 // 引数リストargvの中から、文字列tagが前方一致する引数のi番目を探し出し、
\r
9 // その引数の文字列の、tagに続く部分の文字へのポインタを返す。
\r
11 const char *r = NULL;
\r
14 l = (int)strlen(tag);
\r
15 for (j = 1; j < argc; j++) {
\r
16 if (strncmp(argv[j], tag, l) == 0) {
\r
28 for (j = 1; j < argc; j++) {
\r
29 if (strchr(argv[j], ':') == NULL) {
\r
45 void devFunc0001(int len, unsigned char *puc, HOSECPU_RuntimeEnvironment *r)
\r
49 putOsaskChar(*puc++, r);
\r
55 void devFunc0006(int mod, int sx, int sy, int x, int y, int c, int len, unsigned char *puc, HOSECPU_RuntimeEnvironment *r)
\r
60 int i, ddx, ddy, j, ch, dx, dy;
\r
67 if (xx <= 0 || xx > mainWindow.xsize || yy <= 0 || yy > mainWindow.ysize){
\r
70 if (x < 0 || x >= mainWindow.xsize || y < 0 || y >= mainWindow.ysize){
\r
75 if ((mod & 3) == 0 && sx == 1 && sy == 1) {
\r
77 for (i = 0; i < len; i++) {
\r
79 if (0x10 <= ch && ch <= 0x1f)
\r
80 ch = "0123456789ABCDEF"[ch & 0x0f];
\r
81 for (dy = 0; dy < 16; dy++) {
\r
82 j = fontdata[(ch - ' ') * 16 + dy];
\r
83 for (dx = 0; dx < 8; dx++) {
\r
84 if ((j & (0x80 >> dx)) != 0){
\r
85 mainWindow.vram[(x + dx) + (y + dy) * mainWindow.xsize] = c;
\r
93 for (i = 0; i < len; i++) {
\r
95 if (0x10 <= ch && ch <= 0x1f)
\r
96 ch = "0123456789ABCDEF"[ch & 0x0f];
\r
97 for (dy = 0; dy < 16; dy++) {
\r
98 j = fontdata[(ch - ' ') * 16 + dy];
\r
99 for (ddy = 0; ddy < sy; ddy++) {
\r
100 for (dx = 0; dx < 8; dx++) {
\r
101 if ((j & (0x80 >> dx)) != 0) {
\r
102 for (ddx = 0; ddx < sx; ddx++) {
\r
105 mainWindow.vram[x + y * mainWindow.xsize] = c;
\r
108 mainWindow.vram[x + y * mainWindow.xsize] |= c;
\r
111 mainWindow.vram[x + y * mainWindow.xsize] ^= c;
\r
114 mainWindow.vram[x + y * mainWindow.xsize] &= c;
\r
133 void devFunc0004(int mod, int x0, int y0, int x1, int y1, int c)
\r
138 for (y = y0; y <= y1; y++) {
\r
139 for (x = x0; x <= x1; x++) {
\r
140 mainWindow.vram[x + y * mainWindow.xsize] = c;
\r
145 for (y = y0; y <= y1; y++) {
\r
146 for (x = x0; x <= x1; x++) {
\r
149 mainWindow.vram[x + y * mainWindow.xsize] |= c;
\r
152 mainWindow.vram[x + y * mainWindow.xsize] ^= c;
\r
155 mainWindow.vram[x + y * mainWindow.xsize] &= c;
\r
164 int devFunc0016(int buflen, unsigned char *buf, int plen, unsigned char *p, int qlen, int *q, HOSECPU_RuntimeEnvironment *r)
\r
167 int i = 0, base, j, k;
\r
172 (*(r->errHndl))(r);
\r
182 (*(r->errHndl))(r);
\r
189 #if (REVISION == 1)
\r
197 if (base < 0 || base > 16){
\r
198 (*(r->errHndl))(r);
\r
200 if (q[1] + i > buflen){
\r
201 (*(r->errHndl))(r);
\r
204 if ((q[2] & 4) == 0) {
\r
206 if ((q[2] & 8) != 0 && j > 0){
\r
210 sign = '-'; j *= -1;
\r
214 if ((q[2] & 8) != 0 && j != 0){
\r
218 for (k = q[1] - 1; k >= 0; k--) {
\r
219 buf[i + k] = (j % base) + 0x10;
\r
220 j = ((unsigned)j) / base;
\r
223 if ((q[2] & 2) == 0 && j == 0) {
\r
224 for (k = 0; k < q[1] - 1; k++) {
\r
225 if (buf[i + k] != 0x10){
\r
237 if ((q[2] & 1) != 0 && buf[i] == ' ') {
\r
238 for (j = 0; k < q[1]; k++, j++){
\r
239 buf[i + j] = buf[i + k];
\r
251 void devFunc(HOSECPU_RuntimeEnvironment *r)
\r
255 int x, y, len, dx, dy;
\r
256 unsigned char *puc;
\r
257 unsigned char pucbuf[256];
\r
259 //サイズを節約するためにEBPを128バイトずらしているのを元に戻す
\r
260 r = (HOSECPU_RuntimeEnvironment *) (((char *)r) - jitCompA0001_EBP128);
\r
262 if (r->winClosed != 0){
\r
263 longjmp(r->setjmpEnv, 1);
\r
265 if (0xff44 <= r->ireg[0x30] && r->ireg[0x30] <= 0xff48) {
\r
266 if (mainWindow.vram == NULL) {
\r
267 mainWindow.xsize = 640;
\r
268 mainWindow.ysize = 480;
\r
269 mainWindow.vram = malloc(640 * 480 * 4);
\r
270 drv_openWin(640, 480, (void *)mainWindow.vram, &r->winClosed);
\r
272 for (i = 640 * 480 - 1; i >= 0; i--){
\r
273 mainWindow.vram[i] = 0;
\r
278 switch (r->ireg[0x30]){
\r
280 printf("R31=%d(dec)\n", r->ireg[0x31]);
\r
284 // junkApi_fopenRead(_filesize, _p, arg)
\r
285 // args: R31=arg, R30=_filesize, P31=_p
\r
287 if (r->buf0 == NULL){
\r
288 r->buf0 = malloc(1024 * 1024);
\r
290 if (r->mainArgc <= r->ireg[0x31]) {
\r
291 fprintf(stderr, "devFunc: error: R30=ff01: argc error: R31=%08X\n", r->ireg[0x31]);
\r
294 fp = fopen(r->mainArgv[r->ireg[0x31]], "rb");
\r
296 fprintf(stderr, "devFunc: error: R30=ff01: fopen error: '%s'\n", r->mainArgv[r->ireg[0x31]]);
\r
299 i = (int)fread(r->buf0, 1, 1024 * 1024 - 4, fp);
\r
300 if (i >= 1024 * 1024 - 4 || i < 0) {
\r
301 fprintf(stderr, "devFunc: error: R30=ff01: fread error: '%s'\n", r->mainArgv[r->ireg[0x31]]);
\r
305 r->preg[0x31].p = r->buf0;
\r
306 r->preg[0x31].p0 = r->buf0;
\r
307 r->preg[0x31].p1 = r->buf0 + i;
\r
308 r->preg[0x31].typ = 3; // T_UINT8
\r
313 // junkApi_fopenWrite(arg, filesize, p)
\r
314 // args: R31=arg, R32=filesize, P31=p
\r
316 if (r->mainArgc <= r->ireg[0x31]) {
\r
317 fprintf(stderr, "devFunc: error: R30=ff02: argc error: R31=%08X\n", r->ireg[0x31]);
\r
320 fp = fopen(r->mainArgv[r->ireg[0x31]], "wb");
\r
322 fprintf(stderr, "devFunc: error: R30=ff02: fopen error: '%s'\n", r->mainArgv[r->ireg[0x31]]);
\r
325 if (r->ireg[0x32] >= 1024 * 1024 || r->ireg[0x32] < 0){
\r
326 fprintf(stderr, "devFunc: error: R30=ff02: fwrite error: R02=%08X\n", r->ireg[0x32]);
\r
329 fwrite(r->preg[0x31].p, 1, r->ireg[0x32], fp);
\r
334 // junkApi_allocBuf(_p)
\r
337 if (r->buf1 == NULL){
\r
338 r->buf1 = malloc(1024 * 1024);
\r
340 r->preg[0x31].p = r->buf1;
\r
341 r->preg[0x31].p0 = r->buf1;
\r
342 r->preg[0x31].p1 = r->buf1 + 1024 * 1024;
\r
346 printf("P31.(p-p0)=%d(dec)\n", (int)(r->preg[0x31].p - r->preg[0x31].p0));
\r
350 // junkApi_writeStdout(len, p)
\r
351 // args: R31=len, P31=p
\r
353 fwrite(r->preg[0x31].p, 1, r->ireg[0x31], stdout);
\r
360 r->appReturnCode = r->ireg[31];
\r
361 longjmp(r->setjmpEnv, 1);
\r
365 // junkApi_putConstString0(s)
\r
366 // DB(0xff,0x00,0x00); DB%(s,0x00);
\r
368 // OSASK文字列に対応.offにすれば通常の文字列処理もできる.
\r
370 checkString(r, 0x31, 0x31);
\r
371 devFunc0001(r->ireg[0x31], r->preg[0x31].p, r);
\r
375 // junkApi_jitc2(_rc, _p, mod, lev, di1, len, s)
\r
376 // R31=mod; R32=lev; R33=di1; R34=len; P31=s; _rc=R30; _p=P31
\r
378 // R31: 言語(back-end, front-end, ...
\r
381 checkString(r, 0x34, 0x31);
\r
382 if (r->ireg[0x33] < 0 || r->ireg[0x33] > 15 || r->debugInfo1 > 15){
\r
383 (*(r->errHndl))(r);
\r
385 for (i = 0; i < r->maxLabels; i++){
\r
386 r->label[i].opt = 0;
\r
388 puc = r->preg[0x31].p;
\r
389 i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], di1_serial, JITC_NOSTARTUP + 0);
\r
391 i = jitCompiler(r->jitbuf, r->jitbuf1, puc, puc + r->ireg[0x34], puc, r->label, r->maxLabels, r->ireg[0x32], di1_serial, JITC_NOSTARTUP + JITC_PHASE1 + 0);
\r
393 r->mapDi1s[r->debugInfo1][r->ireg[0x33]] = di1_serial;
\r
396 r->preg[0x31].p = r->jitbuf;
\r
397 r->preg[0x31].typ = 0; // TYP_CODE
\r
398 r->preg[0x31].p0 = r->jitbuf;
\r
399 r->preg[0x31].p1 = r->jitbuf + 1;
\r
400 //int j; for (j = 0; j < i; j++) printf("%02X ", r->jitbuf[j]); putchar('\n');
\r
402 static unsigned char ff08_ret[3] = { 0x1e, 0x3f, 0x30 };
\r
403 i = jitCompiler(r->jitbuf, r->jitbuf1, ff08_ret, ff08_ret + 3, puc, r->label, r->maxLabels, r->ireg[0x32], -1, JITC_NOSTARTUP + JITC_PHASE1 + 0);
\r
408 r->ireg[0x30] = -1;
\r
413 // たぶんbit7を使ったテキストはうまく処理できない(これはもはや仕様にしても問題ないかも).
\r
414 checkString(r, 0x31, 0x31);
\r
415 len = devFunc0016(sizeof pucbuf, pucbuf, r->ireg[0x31], r->preg[0x31].p, r->ireg[0x32], (int *)r->preg[0x32].p, r);
\r
416 devFunc0001(len, pucbuf, r);
\r
420 // junkApi_openWin(xsiz, ysiz) R31=xsiz; R32=ysiz;
\r
421 /* R31とR32でサイズを指定 */
\r
422 mainWindow.xsize = r->ireg[0x31];
\r
423 mainWindow.ysize = r->ireg[0x32];
\r
424 if (mainWindow.xsize <= 0 || mainWindow.ysize <= 0){
\r
425 (*(r->errHndl))(r);
\r
427 r->preg[0x31].p = (void *)(mainWindow.vram = malloc(mainWindow.xsize * mainWindow.ysize * 4));
\r
428 r->preg[0x31].p0 = r->preg[0x31].p;
\r
429 r->preg[0x31].p1 = r->preg[0x31].p + mainWindow.xsize * mainWindow.ysize * 4;
\r
430 drv_openWin(r->ireg[0x31], r->ireg[0x32], r->preg[0x31].p, &r->winClosed);
\r
431 // drv_flshWin(r->ireg[1], r->ireg[2], 0, 0);
\r
433 for (i = mainWindow.xsize * mainWindow.ysize - 1; i >= 0; i--){
\r
434 mainWindow.vram[i] = 0;
\r
439 // junkApi_flushWin(xsiz, ysiz, x0, y0)
\r
440 // R31=xsiz; R32=ysiz; R33=x0; R34=y0
\r
441 /* R31とR32でサイズを指定、R33とR34でx0,y0指定 */
\r
442 if (r->ireg[0x31] == -1) {
\r
443 r->ireg[0x31] = mainWindow.xsize; r->ireg[0x33] &= 0;
\r
445 if (r->ireg[0x32] == -1) {
\r
446 r->ireg[0x32] = mainWindow.ysize; r->ireg[0x34] &= 0;
\r
448 checkRect(r, 0x31);
\r
449 drv_flshWin(r->ireg[0x31], r->ireg[0x32], r->ireg[0x33], r->ireg[0x34]);
\r
453 // junkApi_sleep(opt, msec) R31=opt; R32=msec
\r
455 // 1 = ついでにウィンドウを更新する
\r
456 // 2 = キー入力されるまでずっと待つ
\r
457 if (r->ireg[0x32] == -1) {
\r
458 // sleep forever (事実上実行は終了)
\r
460 longjmp(r->setjmpEnv, 1);
\r
462 if (r->ireg[0x32] < 0){
\r
463 // マイナス秒スリープするなんておかしい
\r
464 (*(r->errHndl))(r);
\r
466 //スリープしたので終了時の自動スリープ無効
\r
468 if ((r->ireg[0x31] & 1) == 0 && mainWindow.vram != NULL){
\r
469 // opt1:ついでにウィンドウを更新する
\r
470 drv_flshWin(mainWindow.xsize, mainWindow.ysize, 0, 0);
\r
473 if (r->winClosed != 0){
\r
474 longjmp(r->setjmpEnv, 1);
\r
476 drv_sleep(r->ireg[0x32]);
\r
477 if ((r->ireg[0x31] & 2) != 0 && keybuf_c <= 0){
\r
478 // opt2:キー入力があったので戻る
\r
487 // junkApi_inkey(_i, mod) R31=mod; _i=R30
\r
488 // 1:peek(キーを「のぞき見る」だけで、バッファは進めない)
\r
491 // 16: shift, lock系を有効化.
\r
492 // 32: 左右のshift系を区別する.
\r
493 // カーソルキーの左右でR32は減少,増加する。
\r
494 // カーソルキーの上下でR33は減少,増加する。
\r
495 if (r->ireg[0x31] == 2) {
\r
497 r->ireg[0x30] = fgetc(stdin);
\r
498 if (r->ireg[0x30] == EOF){
\r
499 r->ireg[0x30] = KEY_EMPTY;
\r
503 r->ireg[0x30] |= -1;
\r
504 if (keybuf_c > 0) {
\r
506 r->ireg[0x30] = keybuf[keybuf_r];
\r
507 if ((r->ireg[0x31] & 16) == 0){
\r
508 // shift, lockキー([C]マークのあるキー)の無効化
\r
509 r->ireg[0x30] &= 0x3e3effff;
\r
511 if ((r->ireg[0x31] & 32) == 0){
\r
513 r->ireg[0x30] |= (r->ireg[0x30] >> 8) & 0xff0000;
\r
515 if ((r->ireg[0x31] & 1) != 0) {
\r
516 // peekでないならバッファを進める
\r
518 keybuf_r = (keybuf_r + 1) & (KEYBUFSIZ - 1);
\r
521 r->ireg[0x32] = r->ireg[0x33] = 0;
\r
522 if (r->ireg[0x30] == KEY_LEFT){
\r
525 if (r->ireg[0x30] == KEY_UP){
\r
528 if (r->ireg[0x30] == KEY_RIGHT){
\r
531 if (r->ireg[0x30] == KEY_DOWN){
\r
537 // junkApi_drawPoint(mod, x, y, c) R31=mod; R32=x; R33=y; R34=c
\r
538 c = loadColor(r, 0x34);
\r
539 if (r->ireg[0x32] < 0 || r->ireg[0x32] >= mainWindow.xsize ||
\r
540 r->ireg[0x33] < 0 || r->ireg[0x33] >= mainWindow.ysize){
\r
541 (*(r->errHndl))(r);
\r
544 switch ((r->ireg[0x31] & 3)) {
\r
546 mainWindow.vram[r->ireg[0x32] + r->ireg[0x33] * mainWindow.xsize] = c;
\r
549 mainWindow.vram[r->ireg[0x32] + r->ireg[0x33] * mainWindow.xsize] |= c;
\r
552 mainWindow.vram[r->ireg[0x32] + r->ireg[0x33] * mainWindow.xsize] ^= c;
\r
555 mainWindow.vram[r->ireg[0x32] + r->ireg[0x33] * mainWindow.xsize] &= c;
\r
561 // 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
\r
563 c = loadColor(r, 0x36);
\r
564 if (r->ireg[0x32] < 0 || r->ireg[0x32] >= mainWindow.xsize ||
\r
565 r->ireg[0x33] < 0 || r->ireg[0x33] >= mainWindow.ysize){
\r
566 (*(r->errHndl))(r);
\r
568 if (r->ireg[0x34] < 0 || r->ireg[0x34] >= mainWindow.xsize ||
\r
569 r->ireg[0x35] < 0 || r->ireg[0x35] >= mainWindow.ysize){
\r
570 (*(r->errHndl))(r);
\r
572 dx = r->ireg[0x34] - r->ireg[0x32];
\r
573 dy = r->ireg[0x35] - r->ireg[0x33];
\r
574 x = r->ireg[0x32] << 10;
\r
575 y = r->ireg[0x33] << 10;
\r
583 len = dx + 1; dx = 1024;
\r
584 if (r->ireg[0x32] > r->ireg[0x34]){
\r
587 if (r->ireg[0x33] > r->ireg[0x35]){
\r
590 dy = (dy << 10) / len;
\r
592 len = dy + 1; dy = 1024;
\r
593 if (r->ireg[0x33] > r->ireg[0x35]){
\r
596 if (r->ireg[0x32] > r->ireg[0x34]){
\r
599 dx = (dx << 10) / len;
\r
601 if ((r->ireg[0x31] & 3) == 0) {
\r
602 for (i = 0; i < len; i++) {
\r
603 mainWindow.vram[(x >> 10) + (y >> 10) * mainWindow.xsize] = c;
\r
609 for (i = 0; i < len; i++) {
\r
610 // if ((r->ireg[0x31] & 3) == 0) vram[(x >> 10) + (y >> 10) * v_xsiz] = c;
\r
611 switch ((r->ireg[0x31] & 3)) {
\r
613 mainWindow.vram[(x >> 10) + (y >> 10) * mainWindow.xsize] |= c;
\r
616 mainWindow.vram[(x >> 10) + (y >> 10) * mainWindow.xsize] ^= c;
\r
619 mainWindow.vram[(x >> 10) + (y >> 10) * mainWindow.xsize] &= c;
\r
630 // fillRect(opt:R31, xsiz:R32, ysiz:R33, x0:R34, y0:R35, c:R36)
\r
631 c = loadColor(r, 0x36);
\r
632 if (r->ireg[0x32] == -1) { r->ireg[0x32] = mainWindow.xsize; r->ireg[0x34] &= 0; }
\r
633 if (r->ireg[0x33] == -1) { r->ireg[0x33] = mainWindow.ysize; r->ireg[0x35] &= 0; }
\r
634 checkRect(r, 0x32);
\r
635 int mod3 = r->ireg[0x31] & 3, x0 = r->ireg[0x34], y0 = r->ireg[0x35], x1 = r->ireg[0x34] + r->ireg[0x32] - 1, y1 = r->ireg[0x35] + r->ireg[0x33] - 1;
\r
636 if ((r->ireg[0x31] & 0x20) == 0) {
\r
637 devFunc0004(mod3, x0, y0, x1, y1, c);
\r
638 } else { // drawRect
\r
639 devFunc0004(mod3, x0, y0, x1, y0, c);
\r
640 devFunc0004(mod3, x0, y1, x1, y1, c);
\r
641 devFunc0004(mod3, x0, y0, x0, y1, c);
\r
642 devFunc0004(mod3, x1, y0, x1, y1, c);
\r
647 // fillOval(opt:R31, xsiz:R32, ysiz:R33, x0:R34, y0:R35, c:R36)
\r
648 // これの計算精度はアーキテクチャに依存する.
\r
649 c = loadColor(r, 0x36);
\r
650 if (r->ireg[0x32] == -1) {
\r
651 r->ireg[0x32] = mainWindow.xsize; r->ireg[0x34] &= 0;
\r
653 if (r->ireg[0x33] == -1) {
\r
654 r->ireg[0x33] = mainWindow.ysize; r->ireg[0x35] &= 0;
\r
656 checkRect(r, 0x32);
\r
657 double dcx = 0.5 * (r->ireg[0x32] - 1);
\r
658 double dcy = 0.5 * (r->ireg[0x33] - 1);
\r
659 double dcxy = (dcx + 0.5) * (dcy + 0.5) - 0.1;
\r
661 mod3 = r->ireg[0x31] & 3;
\r
662 x1 = r->ireg[0x32];
\r
663 y1 = r->ireg[0x33];
\r
664 if (mod3 == 0 && (r->ireg[0x31] & 0x20) == 0) {
\r
665 for (y = 0; y < y1; y++) {
\r
666 double dty = (y - dcy) * dcx;
\r
667 for (x = 0; x < x1; x++) {
\r
668 double dtx = (x - dcx) * dcy;
\r
669 if (dtx * dtx + dty * dty > dcxy){
\r
672 mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] = c;
\r
676 #define DRAWOVALPARAM 1
\r
677 double dcx1 = 0.5 * (r->ireg[0x32] - (1 + DRAWOVALPARAM * 2));
\r
678 double dcy1 = 0.5 * (r->ireg[0x33] - (1 + DRAWOVALPARAM * 2));
\r
679 double dcxy1 = (dcx1 + 0.5) * (dcy1 + 0.5) - 0.1;
\r
681 for (y = 0; y < y1; y++) {
\r
682 double dty = (y - dcy) * dcx;
\r
683 double dty1 = (y - dcy) * dcx1;
\r
684 for (x = 0; x < x1; x++) {
\r
685 double dtx = (x - dcx) * dcy;
\r
686 double dtx1 = (x - dcx) * dcy1;
\r
687 if (dtx * dtx + dty * dty > dcxy){
\r
690 if (DRAWOVALPARAM <= x && x < x1 - DRAWOVALPARAM && DRAWOVALPARAM <= y && y < y1 - DRAWOVALPARAM) {
\r
691 if (dtx1 * dtx1 + dty1 * dty1 < dcxy1){
\r
697 mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] = c;
\r
700 mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] |= c;
\r
703 mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] ^= c;
\r
706 mainWindow.vram[(x + r->ireg[0x34]) + (y + r->ireg[0x35]) * mainWindow.xsize] &= c;
\r
715 // drawString(opt:R31, xsiz:R32, ysiz:R33, x0:R34, y0:R35, c:R36, s.len:R37, s.p:P31)
\r
716 checkString(r, 0x37, 0x31);
\r
717 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);
\r
721 // junkApi_rand(_r, range) R31=range; _r=R30
\r
722 // **** junkApi_rand(i, max) ****
\r
723 // 0 <= i <= maxとなるiを返す。
\r
724 // max==0のとき、iはSINT32全体を範囲とする乱数となる。
\r
725 r->ireg[0x30] = randGetNextUInt32();
\r
726 if (r->ireg[0x31] > 0){
\r
727 r->ireg[0x30] = (r->ireg[0x30] & 0x7fffffff) % (r->ireg[0x31] + 1);
\r
733 randStatInit(r->ireg[0x31]);
\r
738 r->ireg[0x30] = (int)(time(NULL) ^ (long)0x55555555);
\r
743 checkString(r, 0x37, 0x31);
\r
744 len = devFunc0016(sizeof pucbuf, pucbuf, r->ireg[0x37], r->preg[0x31].p, r->ireg[0x38], (int *)r->preg[0x32].p, r);
\r
745 devFunc0006(r->ireg[0x31], r->ireg[0x32], r->ireg[0x33], r->ireg[0x34], r->ireg[0x35], loadColor(r, 0x36), len, pucbuf, r);
\r
749 // bitblt(mod, xsiz, ysiz, xscale, yscale, x0, y0, lineskip, inv, p_buf, typ0, p_table, typ1);
\r
750 // mod: 0x20:use_table, 0x40:inv_is_visible & typ1_is_color
\r
751 puc = r->preg[0x31].p;
\r
752 mod3 = r->ireg[0x31] & 3;
\r
753 dx = r->ireg[0x34];
\r
754 dy = r->ireg[0x35];
\r
758 if (r->ireg[0x32] == -1) {
\r
759 r->ireg[0x32] = mainWindow.xsize / dx; r->ireg[0x36] &= 0;
\r
761 if (r->ireg[0x33] == -1) {
\r
762 r->ireg[0x33] = mainWindow.ysize / dy; r->ireg[0x37] &= 0;
\r
764 for (y = 0; y < r->ireg[0x33]; y++) {
\r
765 y0 = y * dy + r->ireg[0x37];
\r
766 for (x = 0; x < r->ireg[0x32]; x++) {
\r
767 x0 = x * dx + r->ireg[0x36];
\r
768 c = iColor1[*puc++];
\r
769 devFunc0004(mod3, x0, y0, x0 + dx, y0 + dy, c);
\r
771 puc += r->ireg[0x38];
\r
776 printf("devFunc: error: R30=%08X\n", r->ireg[0x30]);
\r
777 exit(EXIT_FAILURE);
\r