diff --git a/include/system4/instructions.h b/include/system4/instructions.h index cb2dd17..d5d1d34 100644 --- a/include/system4/instructions.h +++ b/include/system4/instructions.h @@ -40,6 +40,7 @@ enum syscall_code { SYS_OPEN_WEB = 0x0B, SYS_GET_SAVE_FOLDER_NAME = 0x0C, SYS_GET_TIME = 0x0D, + SYS_GET_GAME_NAME = 0x0E, SYS_ERROR = 0x0F, SYS_EXISTS_SAVE_FILE = 0x10, SYS_IS_DEBUG_MODE = 0x11, @@ -47,8 +48,12 @@ enum syscall_code { SYS_GET_FUNC_STACK_NAME = 0x13, SYS_PEEK = 0x14, SYS_SLEEP = 0x15, + SYS_RESUME_WRITE_COMMENT = 0x16, + SYS_RESUME_READ_COMMENT = 0x17, SYS_GROUP_SAVE = 0x18, SYS_GROUP_LOAD = 0x19, + SYS_DELETE_SAVE_FILE = 0x1A, + SYS_EXIST_FUNC = 0x1B, SYS_COPY_SAVE_FILE = 0x1C, NR_SYSCALLS }; @@ -348,6 +353,19 @@ enum instruction_argtype { T_DLG, }; +// TODO: Need to know which class a method belongs to +// in order to use this. Should be replaced with +// "this." in disassembled output. +#define T_MEMB T_INT + +// TODO: As above, but for member of a member, etc. +#define T_MEMB2 T_INT +#define T_MEMB3 T_INT + +// TODO: Similar to above, but for member of local variable. +// Only used in one instruction--maybe special case? +#define T_LOCMEMB T_INT + struct instruction { const enum opcode opcode; // the opcode const char * const name; // assembler name diff --git a/src/ain.c b/src/ain.c index aeb5613..62b0e0d 100644 --- a/src/ain.c +++ b/src/ain.c @@ -444,6 +444,7 @@ static bool read_tag(struct ain_reader *r, struct ain *ain) instructions[CALLHLL].nr_args = 3; instructions[S_MOD].nr_args = 1; instructions[OBJSWAP].nr_args = 1; + instructions[DG_STR_TO_METHOD].nr_args = 1; } } else if (TAG_EQ("KEYC")) { ain->keycode = read_int32(r); diff --git a/src/instructions.c b/src/instructions.c index b681acd..b9b1b9e 100644 --- a/src/instructions.c +++ b/src/instructions.c @@ -50,6 +50,7 @@ const struct syscall syscalls[NR_SYSCALLS] = { TODO ( SYS_OPEN_WEB, OpenWeb ), SYS ( SYS_GET_SAVE_FOLDER_NAME, GetSaveFolderName ), SYS ( SYS_GET_TIME, GetTime ), + TODO ( SYS_GET_GAME_NAME, GetGameName ), SYS ( SYS_ERROR, Error ), SYS ( SYS_EXISTS_SAVE_FILE, ExistsSaveFile ), SYS ( SYS_IS_DEBUG_MODE, IsDebugMode ), @@ -59,6 +60,10 @@ const struct syscall syscalls[NR_SYSCALLS] = { SYS ( SYS_SLEEP, Sleep ), SYS ( SYS_GROUP_SAVE, GroupSave ), SYS ( SYS_GROUP_LOAD, GroupLoad ), + TODO ( SYS_RESUME_WRITE_COMMENT, ResumeWriteComment ), + TODO ( SYS_RESUME_READ_COMMENT, ResumeReadComment ), + TODO ( SYS_DELETE_SAVE_FILE, DeleteSaveFile ), + TODO ( SYS_EXIST_FUNC, ExistFunc ), TODO ( SYS_COPY_SAVE_FILE, CopySaveFile ), }; @@ -277,69 +282,69 @@ struct instruction instructions[NR_OPCODES] = { // FIXME: all types are guesses TODO ( SH_SR_ASSIGN, 0 ), - TODO ( SH_MEM_ASSIGN_LOCAL, 2, T_INT, T_LOCAL ), + TODO ( SH_MEM_ASSIGN_LOCAL, 2, T_MEMB, T_LOCAL ), TODO ( A_NUMOF_GLOB_1, 1, T_GLOBAL ), - TODO ( A_NUMOF_STRUCT_1, 1, T_INT ), - TODO ( SH_MEM_ASSIGN_IMM, 2, T_INT, T_INT ), + TODO ( A_NUMOF_STRUCT_1, 1, T_MEMB ), + TODO ( SH_MEM_ASSIGN_IMM, 2, T_MEMB, T_INT ), TODO ( SH_LOCALREFREF, 1, T_LOCAL ), - TODO ( SH_LOCALASSIGN_SUB_IMM, 2, T_INT, T_INT ), + TODO ( SH_LOCALASSIGN_SUB_IMM, 2, T_LOCAL, T_INT ), TODO ( SH_IF_LOC_LT_IMM, 3, T_LOCAL, T_INT, T_ADDR ), TODO ( SH_IF_LOC_GE_IMM, 3, T_LOCAL, T_INT, T_ADDR ), - TODO ( SH_LOCREF_ASSIGN_MEM, 2, T_INT, T_INT ), + TODO ( SH_LOCREF_ASSIGN_MEM, 2, T_LOCAL, T_MEMB ), TODO ( PAGE_REF, 1, T_INT ), TODO ( SH_GLOBAL_ASSIGN_LOCAL, 2, T_GLOBAL, T_LOCAL ), - TODO ( SH_STRUCTREF_GT_IMM, 2, T_INT, T_INT ), - TODO ( SH_STRUCT_ASSIGN_LOCALREF_ITOB, 2, T_INT, T_INT ), - TODO ( SH_LOCAL_ASSIGN_STRUCTREF, 2, T_INT, T_INT ), - TODO ( SH_IF_STRUCTREF_NE_LOCALREF, 3, T_STRUCT, T_LOCAL, T_ADDR ), - TODO ( SH_IF_STRUCTREF_GT_IMM, 3, T_INT, T_INT, T_ADDR ), - TODO ( SH_STRUCTREF_CALLMETHOD_NO_PARAM, 2, T_INT, T_FUNC ), - TODO ( SH_STRUCTREF2, 2, T_INT, T_INT ), - TODO ( SH_REF_STRUCTREF2, 2, T_INT, T_INT ), - TODO ( SH_STRUCTREF3, 3, T_INT, T_INT, T_INT ), - TODO ( SH_STRUCTREF2_CALLMETHOD_NO_PARAM, 3, T_INT, T_INT, T_FUNC ), - TODO ( SH_IF_STRUCTREF_Z, 2, T_INT, T_ADDR ), - TODO ( SH_IF_STRUCT_A_NOT_EMPTY, 2, T_INT, T_ADDR ), - TODO ( SH_IF_LOC_GT_IMM, 3, T_INT, T_INT, T_ADDR ), - TODO ( SH_IF_STRUCTREF_NE_IMM, 3, T_INT, T_INT, T_ADDR ), + TODO ( SH_STRUCTREF_GT_IMM, 2, T_MEMB, T_INT ), + TODO ( SH_STRUCT_ASSIGN_LOCALREF_ITOB, 2, T_MEMB, T_LOCAL ), + TODO ( SH_LOCAL_ASSIGN_STRUCTREF, 2, T_LOCAL, T_MEMB ), + TODO ( SH_IF_STRUCTREF_NE_LOCALREF, 3, T_MEMB, T_LOCAL, T_ADDR ), + TODO ( SH_IF_STRUCTREF_GT_IMM, 3, T_MEMB, T_INT, T_ADDR ), + TODO ( SH_STRUCTREF_CALLMETHOD_NO_PARAM, 2, T_MEMB, T_FUNC ), + TODO ( SH_STRUCTREF2, 2, T_MEMB, T_MEMB2 ), + TODO ( SH_REF_STRUCTREF2, 2, T_MEMB, T_MEMB2 ), + TODO ( SH_STRUCTREF3, 3, T_MEMB, T_MEMB2, T_MEMB3 ), + TODO ( SH_STRUCTREF2_CALLMETHOD_NO_PARAM, 3, T_MEMB, T_MEMB2, T_FUNC ), + TODO ( SH_IF_STRUCTREF_Z, 2, T_MEMB, T_ADDR ), + TODO ( SH_IF_STRUCT_A_NOT_EMPTY, 2, T_MEMB, T_ADDR ), + TODO ( SH_IF_LOC_GT_IMM, 3, T_LOCAL, T_INT, T_ADDR ), + TODO ( SH_IF_STRUCTREF_NE_IMM, 3, T_MEMB, T_INT, T_ADDR ), TODO ( THISCALLMETHOD_NOPARAM, 1, T_FUNC ), TODO ( SH_IF_LOC_NE_IMM, 3, T_LOCAL, T_INT, T_ADDR ), - TODO ( SH_IF_STRUCTREF_EQ_IMM, 3, T_INT, T_INT, T_ADDR ), + TODO ( SH_IF_STRUCTREF_EQ_IMM, 3, T_MEMB, T_INT, T_ADDR ), TODO ( SH_GLOBAL_ASSIGN_IMM, 2, T_GLOBAL, T_INT ), - TODO ( SH_LOCALSTRUCT_ASSIGN_IMM, 0 ), // TODO: args? - TODO ( SH_STRUCT_A_PUSHBACK_LOCAL_STRUCT, 2, T_INT, T_INT ), - TODO ( SH_GLOBAL_A_PUSHBACK_LOCAL_STRUCT, 2, T_INT, T_INT ), - TODO ( SH_LOCAL_A_PUSHBACK_LOCAL_STRUCT, 2, T_INT, T_INT ), - TODO ( SH_IF_SREF_NE_STR0, 2, T_INT, T_ADDR ), + TODO ( SH_LOCALSTRUCT_ASSIGN_IMM, 3, T_LOCAL, T_LOCMEMB, T_INT ), + TODO ( SH_STRUCT_A_PUSHBACK_LOCAL_STRUCT, 2, T_MEMB, T_LOCAL ), + TODO ( SH_GLOBAL_A_PUSHBACK_LOCAL_STRUCT, 2, T_GLOBAL, T_LOCAL ), + TODO ( SH_LOCAL_A_PUSHBACK_LOCAL_STRUCT, 2, T_LOCAL, T_LOCAL ), + TODO ( SH_IF_SREF_NE_STR0, 2, T_STRING, T_ADDR ), TODO ( SH_S_ASSIGN_REF, 0 ), - TODO ( SH_A_FIND_SREF, 0 ), // TODO: args? + TODO ( SH_A_FIND_SREF, 0 ), TODO ( SH_SREF_EMPTY, 0 ), - TODO ( SH_STRUCTSREF_EQ_LOCALSREF, 2 , T_STRUCT, T_LOCAL ), - TODO ( SH_LOCALSREF_EQ_STR0, 2, T_INT, T_INT ), - TODO ( SH_STRUCTSREF_NE_LOCALSREF, 2, T_INT, T_INT ), - TODO ( SH_LOCALSREF_NE_STR0, 2, T_INT, T_INT ), - TODO ( SH_STRUCT_SR_REF, 2, T_INT, T_INT ), - TODO ( SH_STRUCT_S_REF, 1, T_INT ), - TODO ( S_REF2, 1, T_INT ), - TODO ( SH_REF_LOCAL_ASSIGN_STRUCTREF2, 0 ), + TODO ( SH_STRUCTSREF_EQ_LOCALSREF, 2 , T_MEMB, T_LOCAL ), + TODO ( SH_LOCALSREF_EQ_STR0, 2, T_LOCAL, T_STRING ), + TODO ( SH_STRUCTSREF_NE_LOCALSREF, 2, T_MEMB, T_LOCAL ), + TODO ( SH_LOCALSREF_NE_STR0, 2, T_LOCAL, T_STRING ), + TODO ( SH_STRUCT_SR_REF, 2, T_MEMB, T_STRUCT ), + TODO ( SH_STRUCT_S_REF, 1, T_MEMB ), + TODO ( S_REF2, 1, T_MEMB ), + TODO ( SH_REF_LOCAL_ASSIGN_STRUCTREF2, 3, T_INT, T_INT, T_INT ), // FIXME: arguments types unknown TODO ( SH_GLOBAL_S_REF, 1, T_GLOBAL ), - TODO ( SH_LOCAL_S_REF, 1, T_INT ), - TODO ( SH_LOCALREF_SASSIGN_LOCALSREF, 2, T_INT, T_INT ), - TODO ( SH_LOCAL_APUSHBACK_LOCALSREF, 2, T_INT, T_INT ), + TODO ( SH_LOCAL_S_REF, 1, T_LOCAL ), + TODO ( SH_LOCALREF_SASSIGN_LOCALSREF, 2, T_LOCAL, T_LOCAL ), + TODO ( SH_LOCAL_APUSHBACK_LOCALSREF, 2, T_LOCAL, T_LOCAL ), TODO ( SH_S_ASSIGN_CALLSYS19, 0 ), - TODO ( SH_S_ASSIGN_STR0, 1, T_INT ), - TODO ( SH_SASSIGN_LOCALSREF, 1, T_INT ), - TODO ( SH_STRUCTREF_SASSIGN_LOCALSREF, 2, T_INT, T_INT ), - TODO ( SH_LOCALSREF_EMPTY, 1, T_INT ), - TODO ( SH_GLOBAL_APUSHBACK_LOCALSREF, 2, T_INT, T_INT ), - TODO ( SH_STRUCT_APUSHBACK_LOCALSREF, 2, T_INT, T_INT ), - TODO ( SH_STRUCTSREF_EMPTY, 1, T_INT ), + TODO ( SH_S_ASSIGN_STR0, 1, T_STRING ), + TODO ( SH_SASSIGN_LOCALSREF, 1, T_LOCAL ), + TODO ( SH_STRUCTREF_SASSIGN_LOCALSREF, 2, T_MEMB, T_LOCAL ), + TODO ( SH_LOCALSREF_EMPTY, 1, T_LOCAL ), + TODO ( SH_GLOBAL_APUSHBACK_LOCALSREF, 2, T_GLOBAL, T_LOCAL ), + TODO ( SH_STRUCT_APUSHBACK_LOCALSREF, 2, T_MEMB, T_LOCAL ), + TODO ( SH_STRUCTSREF_EMPTY, 1, T_MEMB ), TODO ( SH_GLOBALSREF_EMPTY, 1, T_GLOBAL ), - TODO ( SH_SASSIGN_STRUCTSREF, 1, T_INT ), - TODO ( SH_SASSIGN_GLOBALSREF, 1, T_INT ), - TODO ( SH_STRUCTSREF_NE_STR0, 2, T_INT, T_INT ), - TODO ( SH_GLOBALSREF_NE_STR0, 2, T_INT, T_INT ), - TODO ( SH_LOC_LT_IMM_OR_LOC_GE_IMM, 3, T_INT, T_ADDR, T_ADDR ), + TODO ( SH_SASSIGN_STRUCTSREF, 1, T_MEMB ), + TODO ( SH_SASSIGN_GLOBALSREF, 1, T_GLOBAL ), + TODO ( SH_STRUCTSREF_NE_STR0, 2, T_MEMB, T_STRING ), + TODO ( SH_GLOBALSREF_NE_STR0, 2, T_GLOBAL, T_STRING ), + TODO ( SH_LOC_LT_IMM_OR_LOC_GE_IMM, 3, T_LOCAL, T_INT, T_INT ), TODO ( A_SORT_MEM, 0 ), TODO ( DG_ADD, 0 ), @@ -357,7 +362,7 @@ struct instruction instructions[NR_OPCODES] = { TODO ( DG_MINUSA, 0 ), TODO ( DG_CALLBEGIN, 1, T_DLG ), TODO ( DG_NEW, 0 ), - TODO ( DG_STR_TO_METHOD, 1, T_INT ), + TODO ( DG_STR_TO_METHOD, 0, T_DLG ), // XXX: changed in ain version > 8 TODO ( OP_0x102, 0 ), TODO ( OP_0x103, 2, T_INT, T_INT ),