スーファミ版のmruby/cのコードを読む
#mruby/c #SNES
参考
スーパーファミコンで mruby/c を動かす
gedorinku/snes-ruby - Github
mruby/cの初期化処理の比較
snes-ruby の main と、sample_c/sample_no_scheduler.c の main を比較。
snes-ruby に mrbc_init_alloc(memory_pool, MRBC_MEMORY_SIZE); が無いぐらいで、他は一緒だった。
snes-ruby の main はこちら。
code:src/sa1/main.c
int run() {
// mrbc_init_alloc(memory_pool, MRBC_MEMORY_SIZE);
mrbc_init_global();
mrbc_init_class();
mrbc_vm *vm = mrbc_vm_open(NULL);
if (vm == NULL) {
return -1;
}
snes_init_class_snes(vm);
snes_bg_set_default_tile_map(1, &tiles_map, (&tiles_map_end - &tiles_map),
SNES_BG2_TILE_MAP_VRAM_ADDR);
if (mrbc_load_mrb(vm, mrbbuf) != 0) {
return -1;
}
mrbc_vm_begin(vm);
int ret = mrbc_vm_run(vm);
mrbc_vm_end(vm);
mrbc_vm_close(vm);
return ret;
}
sample_c/sample_no_scheduler.c の main はこちら。
code:sample_c/sample_no_scheduler.c
int main(int argc, char *argv[])
{
if( argc != 2 ) {
printf("Usage: %s <xxxx.mrb>\n", argv0);
return 1;
}
uint8_t *mrbbuf = load_mrb_file( argv1 );
if( mrbbuf == 0 ) return 1;
/*
start mruby/c with LOW LEVEL functions.
*/
hal_init();
mrbc_init_alloc(memory_pool, MRBC_MEMORY_SIZE);
mrbc_init_global();
mrbc_init_class();
mrbc_vm *vm = mrbc_vm_open(NULL);
if( vm == NULL ) {
fprintf(stderr, "Error: Can't assign VM.\n");
return 1;
}
if( mrbc_load_mrb(vm, mrbbuf) != 0 ) {
mrbc_print_exception(&vm->exception);
return 1;
}
mrbc_vm_begin( vm );
int ret = mrbc_vm_run( vm );
mrbc_vm_end( vm );
mrbc_vm_close( vm );
/*
Done
*/
return ret == 1 ? 0 : ret;
}