/* returns -1 on error, else a positive CRT ID */ int crt_getid(const char *filename) { crt_header_t header; FILE *fd; fd = crt_open(filename, &header); if (fd == NULL) { return -1; } fclose(fd); return header.type; }
int main() { int a; handle = crt_open(); crt_printf(handle,"Creating port %d\n",P); if (ipc_create_port(P) != IPC_OK) { crt_printf(handle,"Error creating port!\n"); return 0; } crt_printf(handle,"Port Created\n"); while (1) { crt_printf(handle,"Starting to Receive\n"); if (ipc_receive(P,x,M_SIZE) != IPC_OK) { crt_printf(handle,"ipc_receive didnt return OK!\n"); return 0; } crt_printf(handle,"Got send, Verifying x[] with f1\n"); if (!verify(x,f1)) { crt_printf(handle,"ERROR!! Didnt get correct answer!\n"); return 0; } crt_printf(handle,"Verify good.\nReplying\n"); if (ipc_reply(P,&a,sizeof(int)) != IPC_OK) { crt_printf(handle,"ipc_reply didnt return OK!\n"); return 0; } crt_printf(handle,"Done reply\n\n"); } crt_printf(handle,"Closing port %d\n",P); ipc_close_port(P); crt_printf(handle,"Port closed\nTerminating\n"); return 0; }
/* returns -1 on error, else a positive CRT ID FIXME: to simplify this function a little bit, all subfunctions should also return the respective CRT ID on success */ int crt_attach(const char *filename, BYTE *rawcart) { crt_header_t header; int rc, new_crttype; FILE *fd; DBG(("crt_attach: %s\n", filename)); fd = crt_open(filename, &header); if (fd == NULL) { return -1; } new_crttype = header.type; if (new_crttype & 0x8000) { /* handle our negative test IDs */ new_crttype -= 0x10000; } DBG(("crt_attach ID: %d\n", new_crttype)); /* cart should always be detached. there is no reason for doing fancy checks here, and it will cause problems incase a cart MUST be detached before attaching another, or even itself. (eg for initialization reasons) most obvious reason: attaching a different ROM (software) for the same cartridge (hardware) */ cartridge_detach_image(new_crttype); switch (new_crttype) { case CARTRIDGE_CRT: rc = generic_crt_attach(fd, rawcart); if (rc != CARTRIDGE_NONE) { new_crttype = rc; } break; case CARTRIDGE_ACTION_REPLAY: rc = actionreplay_crt_attach(fd, rawcart); break; case CARTRIDGE_ACTION_REPLAY2: rc = actionreplay2_crt_attach(fd, rawcart); break; case CARTRIDGE_ACTION_REPLAY3: rc = actionreplay3_crt_attach(fd, rawcart); break; case CARTRIDGE_ACTION_REPLAY4: rc = actionreplay4_crt_attach(fd, rawcart); break; case CARTRIDGE_ATOMIC_POWER: rc = atomicpower_crt_attach(fd, rawcart); break; case CARTRIDGE_CAPTURE: rc = capture_crt_attach(fd, rawcart); break; case CARTRIDGE_COMAL80: rc = comal80_crt_attach(fd, rawcart); break; case CARTRIDGE_DELA_EP256: rc = delaep256_crt_attach(fd, rawcart); break; case CARTRIDGE_DELA_EP64: rc = delaep64_crt_attach(fd, rawcart); break; case CARTRIDGE_DELA_EP7x8: rc = delaep7x8_crt_attach(fd, rawcart); break; case CARTRIDGE_DIASHOW_MAKER: rc = dsm_crt_attach(fd, rawcart); break; case CARTRIDGE_DINAMIC: rc = dinamic_crt_attach(fd, rawcart); break; case CARTRIDGE_EASYFLASH: rc = easyflash_crt_attach(fd, rawcart, filename); break; case CARTRIDGE_EPYX_FASTLOAD: rc = epyxfastload_crt_attach(fd, rawcart); break; case CARTRIDGE_EXOS: rc = exos_crt_attach(fd, rawcart); break; case CARTRIDGE_EXPERT: rc = expert_crt_attach(fd, rawcart, filename); break; case CARTRIDGE_FINAL_I: rc = final_v1_crt_attach(fd, rawcart); break; case CARTRIDGE_FINAL_III: rc = final_v3_crt_attach(fd, rawcart); break; case CARTRIDGE_FINAL_PLUS: rc = final_plus_crt_attach(fd, rawcart); break; case CARTRIDGE_FORMEL64: rc = formel64_crt_attach(fd, rawcart); break; case CARTRIDGE_FREEZE_FRAME: rc = freezeframe_crt_attach(fd, rawcart); break; case CARTRIDGE_FREEZE_MACHINE: rc = freezemachine_crt_attach(fd, rawcart); break; case CARTRIDGE_FUNPLAY: rc = funplay_crt_attach(fd, rawcart); break; case CARTRIDGE_GAME_KILLER: rc = gamekiller_crt_attach(fd, rawcart); break; case CARTRIDGE_GS: rc = gs_crt_attach(fd, rawcart); break; case CARTRIDGE_IDE64: rc = ide64_crt_attach(fd, rawcart); break; case CARTRIDGE_IEEE488: rc = tpi_crt_attach(fd, rawcart); break; case CARTRIDGE_ISEPIC: rc = isepic_crt_attach(fd, rawcart, filename); break; case CARTRIDGE_KCS_POWER: rc = kcs_crt_attach(fd, rawcart); break; case CARTRIDGE_KINGSOFT: rc = kingsoft_crt_attach(fd, rawcart); break; case CARTRIDGE_MACH5: rc = mach5_crt_attach(fd, rawcart); break; case CARTRIDGE_MAGIC_DESK: rc = magicdesk_crt_attach(fd, rawcart); break; case CARTRIDGE_MAGIC_FORMEL: rc = magicformel_crt_attach(fd, rawcart); break; case CARTRIDGE_MAGIC_VOICE: rc = magicvoice_crt_attach(fd, rawcart); break; case CARTRIDGE_MIKRO_ASSEMBLER: rc = mikroass_crt_attach(fd, rawcart); break; case CARTRIDGE_MMC64: rc = mmc64_crt_attach(fd, rawcart); break; case CARTRIDGE_MMC_REPLAY: rc = mmcreplay_crt_attach(fd, rawcart, filename); break; case CARTRIDGE_OCEAN: rc = ocean_crt_attach(fd, rawcart); break; case CARTRIDGE_P64: rc = p64_crt_attach(fd, rawcart); break; case CARTRIDGE_PAGEFOX: rc = pagefox_crt_attach(fd, rawcart); break; case CARTRIDGE_RETRO_REPLAY: rc = retroreplay_crt_attach(fd, rawcart, filename); break; case CARTRIDGE_REX_EP256: rc = rexep256_crt_attach(fd, rawcart); break; case CARTRIDGE_REX: rc = rex_crt_attach(fd, rawcart); break; case CARTRIDGE_ROSS: rc = ross_crt_attach(fd, rawcart); break; case CARTRIDGE_SILVERROCK_128: rc = silverrock128_crt_attach(fd, rawcart); break; case CARTRIDGE_SIMONS_BASIC: rc = simon_crt_attach(fd, rawcart); break; case CARTRIDGE_STARDOS: rc = stardos_crt_attach(fd, rawcart); break; case CARTRIDGE_SNAPSHOT64: rc = snapshot64_crt_attach(fd, rawcart); break; case CARTRIDGE_STRUCTURED_BASIC: rc = stb_crt_attach(fd, rawcart); break; case CARTRIDGE_SUPER_GAMES: rc = supergames_crt_attach(fd, rawcart); break; case CARTRIDGE_SUPER_SNAPSHOT: rc = supersnapshot_v4_crt_attach(fd, rawcart); break; case CARTRIDGE_SUPER_SNAPSHOT_V5: rc = supersnapshot_v5_crt_attach(fd, rawcart); break; case CARTRIDGE_SUPER_EXPLODE_V5: rc = se5_crt_attach(fd, rawcart); break; case CARTRIDGE_WARPSPEED: rc = warpspeed_crt_attach(fd, rawcart); break; case CARTRIDGE_WESTERMANN: rc = westermann_crt_attach(fd, rawcart); break; case CARTRIDGE_ZAXXON: rc = zaxxon_crt_attach(fd, rawcart); break; default: archdep_startup_log_error("unknown CRT ID: %d\n", new_crttype); rc = -1; break; } fclose(fd); if (rc == -1) { DBG(("crt_attach error (%d)\n", rc)); return -1; } DBG(("crt_attach return ID: %d\n", new_crttype)); return new_crttype; }