fx9860-emulator-playground/fx9860-emulator/syscalls/syscalls.c

75 lines
3.7 KiB
C

#include "../headers/syscalls/syscalls.h"
// Syscall entry point
void run_syscall(cpu_t* cpu) {
uint32_t syscall_code = R0;
int arg1 = cpu->r[4];
int arg2 = cpu->r[5];
int arg3 = cpu->r[6];
int arg4 = cpu->r[7];
if (syscall_code == 0x135) syscall_GetVRAMAddress(cpu);
else if (syscall_code == 0x143) syscall_Bdisp_AllClr_VRAM(cpu);
else if (syscall_code == 0x144) syscall_Bdisp_AllClr_DDVRAM(cpu);
else if (syscall_code == 0x028) syscall_Bdisp_PutDisp_DD(cpu);
else if (syscall_code == 0x146) syscall_Bdisp_SetPoint_VRAM(cpu, arg1, arg2, arg3);
else if (syscall_code == 0x030) syscall_Bdisp_DrawLine_VRAM(cpu, arg1, arg2, arg3, arg4);
else if (syscall_code == 0x813) syscall_SaveDisp(cpu, arg1);
else if (syscall_code == 0x814) syscall_RestoreDisp(cpu, arg1);
else if (syscall_code == 0x807) syscall_Locate(cpu, arg1, arg2);
else if (syscall_code == 0x808) syscall_Print(cpu, arg1);
else if (syscall_code == 0x9AD) syscall_PrintXY(cpu, arg1, arg2, arg3, arg4);
else if (syscall_code == 0xC4F) syscall_PrintMiniSd(cpu, arg1, arg2, arg3, arg4);
else if (syscall_code == 0xACD) syscall_Malloc(cpu, arg1, 0);
else if (syscall_code == 0xE6B) syscall_Malloc(cpu, arg1, 1); // Calloc
else if (syscall_code == 0xE6D) syscall_Realloc(cpu, arg1, arg2);
else if (syscall_code == 0xACC) syscall_Free(cpu, arg1);
else if (syscall_code == 0x462) syscall_GetAppName(cpu, arg1);
else if (syscall_code == 0x014) syscall_GlibGetAddinLibInf(cpu, arg1, arg2, arg3);
else if (syscall_code == 0x015) syscall_GlibGetOSVersionInfo(cpu, arg1, arg2, arg3, arg4);
else if (syscall_code == 0x90F) syscall_GetKey(cpu, arg1);
else if (syscall_code == 0x03B) syscall_RTC_GetTicks(cpu);
else if (syscall_code == 0x420) syscall_OS_inner_Sleep(cpu, arg1);
else if (syscall_code == 0x434) syscall_Bfile_CreateEntry(cpu, arg1, arg2, arg3);
else if (syscall_code == 0x439) syscall_Bfile_DeleteEntry(cpu, arg1, arg2);
else if (syscall_code == 0x42C) syscall_Bfile_OpenFile(cpu, arg1, arg2, arg3);
else if (syscall_code == 0x42D) syscall_Bfile_CloseFile(cpu, arg1);
else if (syscall_code == 0x435) syscall_Bfile_WriteFile(cpu, arg1, arg2, arg3);
else if (syscall_code == 0x432) syscall_Bfile_ReadFile(cpu, arg1, arg2, arg3, arg4);
else if (syscall_code == 0x431) syscall_Bfile_SeekFile(cpu, arg1, arg2);
else if (syscall_code == 0x43B) { // Bfile_FindFirst
printf("Skipped syscall: Bfile_FindFirst\n");
}
// else if (syscall_code == 0x840) syscall_MCSGetDlen2(cpu, arg1, arg2, arg3);
// else if (syscall_code == 0x841) syscall_MCSGetData1(cpu, arg1, arg2, arg3);
// else if (syscall_code == 0x82B) syscall_MCSPutVar2(cpu, arg1, arg2, arg3, arg4);
// else if (syscall_code == 0x830) syscall_MCSOvwDat2(cpu, arg1, arg2, arg3, arg4, cpu->r[15]);
else if (syscall_code == 0x24C) { // Keyboard_IsSpecialKeyDown
printf("Skipped syscall: Keyboard_IsSpecialKeyDown\n");
}
else if (syscall_code == 0x3ED) { // Interrupt_SetOrClrStatusFlags
// https://bible.planet-casio.com/simlo/chm/v20/fx_legacy_INTERRUPT.HTM
printf("[Error] Blocking syscall not implemented: Interrupt_SetOrClrStatusFlags 0x%X\n", arg2);
}
// Can be ignored
else if (syscall_code == 0x494) { // void SetQuitHandler( void (*callback)(void) );
printf("Ignored syscall: SetQuitHandler\n");
}
else if (syscall_code == 0x013) { // GlibAddinAplExecutionCheck
printf("Ignored syscall: GlibAddinAplExecutionCheck\n");
}
else if (syscall_code == 0x3FA) { // Hmem_SetMMU
printf("Ignored syscall: Hmem_SetMMU\n");
}
else {
printf("[Warning] Syscall not implemented, skipping: 0x%03X\n", syscall_code);
}
cpu->pc = cpu->pr;
}