mirror of
https://github.com/kichikuou/xsystem35-sdl2.git
synced 2026-10-05 05:07:58 +03:00
Refactor variable access code
This commit is contained in:
+14
-79
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -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;
|
||||
|
||||
+53
-37
@@ -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
|
||||
|
||||
+25
-21
@@ -27,9 +27,6 @@
|
||||
#include <sys/types.h>
|
||||
#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__ */
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user