From 78cc18127126d55bfc3da2b4efdfbfaae6a79eb1 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sun, 24 Oct 2021 14:22:44 +0900 Subject: [PATCH] Refactor variable access code --- src/cali.c | 93 +++++++--------------------------------------- src/debugger_cui.c | 2 +- src/debugger_dap.c | 8 ++-- src/variable.c | 90 ++++++++++++++++++++++++++------------------ src/variable.h | 46 ++++++++++++----------- src/xsystem35.h | 5 --- 6 files changed, 97 insertions(+), 147 deletions(-) diff --git a/src/cali.c b/src/cali.c index f55621c..500e999 100644 --- a/src/cali.c +++ b/src/cali.c @@ -48,92 +48,27 @@ int getCaliValue(); int *getCaliVariable(); int *getVariable(); -int preVarPage; /* 直前にアクセスした変数のページ */ -int preVarIndex; /* 直前にアクセスした変数のINDEX */ -int preVarNo; /* 直前にアクセスした変数の番号 */ - static int buf[CALI_DEPTH_MAX]; /* 計算式バッファ */ static int *cali = buf; /* インデックス */ -static void undeferr() { - SYSERROR("Undefined Command:@ %03d,%05x\n", sl_getPage(), sl_getIndex()); -} - -/* 配列のオフセットを確定する */ -static int *fixOffset(int base, int offset2) { - int page, offset; - int *index; - - preVarPage = sysVarAttribute[base].page; - preVarNo = base; - if (sysVarAttribute[base].page == 0) { - if (offset2 == -1) { - if (base >= SYSVAR_MAX) { - WARNING("%03d:%05x: ArrayIndexOutOfBounds (%d, %d)\n", sl_getPage(), sl_getIndex(), base, offset2); - return NULL; - } - preVarIndex = base; - return sysVar + base; - } else { - if ((base + offset2) >= SYSVAR_MAX) { - WARNING("%03d:%05x: ArrayIndexOutOfBounds (%d, %d)\n", sl_getPage(), sl_getIndex(), base, offset2); - return NULL; - } - preVarIndex = base + offset2; - return sysVar + base + offset2; - } - } else { - if (offset2 == -1) { - index = sysVarAttribute[base].pointvar; - page = sysVarAttribute[base].page; - offset = sysVarAttribute[base].offset; - if (*index + offset >= arrayVarBuffer[page - 1].size) { - WARNING("%03d:%05x: ArrayIndexOutOfBounds (%d, %d, %d, %d, %d)\n", sl_getPage(), sl_getIndex(), base, offset2, *index, page, offset); - return NULL; - } - preVarIndex = offset + *index; - return arrayVarBuffer[page - 1].value + offset + *index; - } else { - page = sysVarAttribute[base].page; - offset = sysVarAttribute[base].offset; - if (offset + offset2 >= arrayVarBuffer[page - 1].size) { - WARNING("%03d:%05x: ArrayIndexOutOfBounds (%d, %d, %d, %d)\n", sl_getPage(), sl_getIndex(), base, offset2, page, offset); - return NULL; - } - preVarIndex = offset + offset2; - return arrayVarBuffer[page - 1].value + offset + offset2; - } - } -} - /* 変数番号を返す */ static int *getVar(int c0) { - int c1; - - if ((c0 & 0x40) != 0) { /* 2byte系 */ + if ((c0 & 0x40) == 0) + return v_ref(c0 & 0x3f); // 0 - 0x3f + + int c1 = sl_getc(); + if (c0 != 0xc0) + return v_ref(((c0 & 0x3f) * 256) + c1); // 0x100 - 0x3fff + + if (c1 == 1) { + c0 = sl_getc(); c1 = sl_getc(); - if (c0 == 0xc0) { - if (c1 == 0) { - SYSERROR("Unknown Parameter\n"); - } else if (c1 == 1) { - /* SYSTEM35拡張 */ - c0 = (sl_getc() << 8) + sl_getc(); /* varbase */ - c1 = getCaliValue(); /* offset */ - return fixOffset(c0, c1); - } else if (c1 < 0x40) { - WARNING("Unknown Parameter\n"); - undeferr(); - } else { /* 2byte系 40h - ffh */ - return fixOffset(c1, -1); - } - } else { /* 2byte系 100h - 3fffh */ - return fixOffset(((c0 & 0x3f) * 256) + c1, -1); - } - } else { /* 1byte系 */ - return fixOffset(c0 & 0x3f, -1); + int index = getCaliValue(); + return v_ref_indexed(c0 << 8 | c1, index); + } else if (c1 >= 0x40) { + return v_ref(c1); // 0x40 - 0xff } - /* 来ないはず */ - SYSERROR("Something was wrong\n"); + SYSERROR("Invalid variable reference at %d:0x%x\n", sl_getPage(), sl_getIndex() - 2); return NULL; } diff --git a/src/debugger_cui.c b/src/debugger_cui.c index 3faaf40..36da755 100644 --- a/src/debugger_cui.c +++ b/src/debugger_cui.c @@ -282,7 +282,7 @@ static CommandResult cmd_print(void) { printf("Unrecognized variable name \"%s\".\n", arg); return CONTINUE_REPL; } - printf("%s = %d\n", arg, sysVar[var]); + printf("%s = %d\n", arg, *v_ref(var)); return CONTINUE_REPL; } diff --git a/src/debugger_dap.c b/src/debugger_dap.c index 877e447..60eab0c 100644 --- a/src/debugger_dap.c +++ b/src/debugger_dap.c @@ -214,7 +214,7 @@ static void cmd_evaluate(cJSON *args, cJSON *resp) { } char result[20]; - sprintf(result, "%d", sysVar[var]); + sprintf(result, "%d", *v_ref(var)); cJSON *body; cJSON_AddBoolToObject(resp, "success", true); @@ -302,7 +302,7 @@ static void cmd_variables(cJSON *args, cJSON *resp) { cJSON_AddItemToArray(variables, var); cJSON_AddStringToObject(var, "name", dsym_variable_name(symbols, i)); char value[20]; - sprintf(value, "%d", sysVar[i]); + sprintf(value, "%d", *v_ref(i)); cJSON_AddStringToObject(var, "value", value); cJSON_AddNumberToObject(var, "variablesReference", 0); } @@ -358,13 +358,13 @@ static void cmd_setVariable(cJSON *args, cJSON *resp) { cJSON_AddStringToObject(resp, "message", "syntax error"); return; } - sysVar[var] = parsed_value & 0xffff; + *v_ref(var) = parsed_value & 0xffff; cJSON *body; cJSON_AddBoolToObject(resp, "success", true); cJSON_AddItemToObjectCS(resp, "body", body = cJSON_CreateObject()); char new_value[20]; - sprintf(new_value, "%d", sysVar[var]); + sprintf(new_value, "%d", *v_ref(var)); cJSON_AddStringToObject(body, "value", new_value); } else if (cJSON_IsNumber(vref) && vref->valueint == VREF_STRINGS) { int idx; diff --git a/src/variable.c b/src/variable.c index 9c2c065..1de3f96 100644 --- a/src/variable.c +++ b/src/variable.c @@ -44,6 +44,10 @@ static char **strVar; int strvar_cnt = STRVAR_MAX; int strvar_len = STRVAR_LEN; +int preVarPage; /* 直前にアクセスした変数のページ */ +int preVarIndex; /* 直前にアクセスした変数のINDEX */ +int preVarNo; /* 直前にアクセスした変数の番号 */ + static char *advance(const char *s, int n) { while (*s && n > 0) { s = advance_char(s, nact->encoding); @@ -52,6 +56,55 @@ static char *advance(const char *s, int n) { return (char *)s; } +int *v_ref(int var) { + arrayVarStruct *attr = &sysVarAttribute[var]; + preVarPage = attr->page; + preVarNo = var; + + if (attr->page == 0) { + // Normal variable access + preVarIndex = var; + return sysVar + var; + } + + // Implicit array access + int *index = attr->pointvar; + int page = attr->page; + int offset = attr->offset; + if (*index + offset >= arrayVarBuffer[page - 1].size) { + WARNING("%03d:%05x: ArrayIndexOutOfBounds (%d, %d, %d, %d)\n", sl_getPage(), sl_getIndex(), var, *index, page, offset); + return NULL; + } + preVarIndex = offset + *index; + return arrayVarBuffer[page - 1].value + offset + *index; +} + +int *v_ref_indexed(int var, int index) { + arrayVarStruct *attr = &sysVarAttribute[var]; + preVarPage = attr->page; + preVarNo = var; + + if (attr->page == 0) { + // If VAR_n is not an array variable, VAR_n[i] points to VAR_(n+i). + if ((var + index) >= SYSVAR_MAX) { + WARNING("%03d:%05x: ArrayIndexOutOfBounds (%d, %d)\n", sl_getPage(), sl_getIndex(), var, index); + return NULL; + } + preVarIndex = var + index; + return sysVar + var + index; + } + + // Indexed array access + int page = attr->page; + int offset = attr->offset; + if (offset + index >= arrayVarBuffer[page - 1].size) { + WARNING("%03d:%05x: ArrayIndexOutOfBounds (%d, %d, %d, %d)\n", sl_getPage(), sl_getIndex(), var, index, page, offset); + return NULL; + } + preVarIndex = offset + index; + return arrayVarBuffer[page - 1].value + offset + index; +} + /* 配列バッファの確保 DC ,page = 1~ */ extern boolean v_allocateArrayBuffer(int page, int size, boolean saveflag) { if (page <= 0 || page > 256) { return false; } @@ -305,40 +358,3 @@ void svar_replaceAll(int no, int pattern, int replacement) { svar_append(no, start); free(src); } - -#ifdef DEBUG - -void debug_showvariable() { - int i,j,k; - int *var; - FILE *fp = fopen("VARIABLES.TXT","a"); - if (fp == NULL) return; - - fprintf(fp, "Page = %d, index = %x\n", sl_getPage(), sl_getIndex()); - - var = &sysVar[0]; - fprintf(fp, "sysVar\n"); - for (i = 0; i < SYSVAR_MAX; i+=10) { - for (j = 0; j < 10; j++) { - fprintf(fp, "%d,", *var); var++; - } - fprintf(fp, "\n"); - } - - for (i = 0; i < ARRAYVAR_PAGEMAX; i++) { - if (arrayVarBuffer[i].value != NULL) { - fprintf(fp, "ArrayPage[%d],size=%d\n",i,arrayVarBuffer[i].size); - var = arrayVarBuffer[i].value; - for (j = 0; j < arrayVarBuffer[i].size; j+=10) { - for (k = 0; k < 10; k++) { - fprintf(fp, "%d,", *var); var++; - } - fprintf(fp, "\n"); - } - } - } - - fclose(fp); -} - -#endif diff --git a/src/variable.h b/src/variable.h index 2f75da6..0de9232 100644 --- a/src/variable.h +++ b/src/variable.h @@ -27,9 +27,6 @@ #include #include "portab.h" - -// #define SYSVAR_MAX 1024 -//#define SYSVAR_MAX 8192# #define SYSVAR_MAX 65536 #define SYSVARLONG_MAX 128 #define STRVAR_MAX 5000 @@ -52,24 +49,31 @@ extern int sysVar[]; extern arrayVarStruct sysVarAttribute[]; extern arrayVarBufferStruct arrayVarBuffer[]; extern double longVar[]; -extern boolean v_allocateArrayBuffer(int page, int size, boolean saveflag); -extern boolean v_defineArrayVar(int datavar, int *pointvar, int offset, int page); -extern boolean v_releaseArrayVar(int datavar); -extern boolean v_getArrayBufferStatus(int page); -extern boolean v_initVars(); -extern void svar_init(int cnt, int len); -extern int svar_count(void); -extern const char *svar_get(int no); -extern void svar_set(int no, const char *str); -extern void svar_copy(int dstno, int dstpos, int srcno, int srcpos, int len); -extern void svar_append(int no, const char *str); -extern size_t svar_length(int no); -extern int svar_width(int no); -extern int svar_find(int no, int start, const char *str); -extern void svar_fromVars(int no, const int *vars); -extern int svar_toVars(int no, int *vars); -extern int svar_getCharType(int no, int pos); -extern void svar_replaceAll(int no, int pattern, int replacement); +extern int preVarPage; +extern int preVarIndex; +extern int preVarNo; + +int *v_ref(int var); +int *v_ref_indexed(int var, int index); +boolean v_allocateArrayBuffer(int page, int size, boolean saveflag); +boolean v_defineArrayVar(int datavar, int *pointvar, int offset, int page); +boolean v_releaseArrayVar(int datavar); +boolean v_getArrayBufferStatus(int page); +boolean v_initVars(); + +void svar_init(int cnt, int len); +int svar_count(void); +const char *svar_get(int no); +void svar_set(int no, const char *str); +void svar_copy(int dstno, int dstpos, int srcno, int srcpos, int len); +void svar_append(int no, const char *str); +size_t svar_length(int no); +int svar_width(int no); +int svar_find(int no, int start, const char *str); +void svar_fromVars(int no, const int *vars); +int svar_toVars(int no, int *vars); +int svar_getCharType(int no, int pos); +void svar_replaceAll(int no, int pattern, int replacement); #endif /* !__VARIABLE__ */ diff --git a/src/xsystem35.h b/src/xsystem35.h index 7539375..5f168af 100644 --- a/src/xsystem35.h +++ b/src/xsystem35.h @@ -49,11 +49,6 @@ #define DEBUG_MESSAGE(...) #endif -/* defined in cali.c */ -extern int preVarPage; /* 直前にアクセスした変数のページ */ -extern int preVarIndex; /* 直前にアクセスした変数のINDEX */ -extern int preVarNo; /* 直前にアクセスした変数の番号 */ - #define System_idle(msec) usleep(1000l * (msec)); // extern void System_idle(int msec);