*
* @return なし
*
- * @param cmdtype コマンドの種類
- * @param *cmdname コマンドの名前
* @param word ワード値
- * @param adr アドレス値
* @param pradr 次に実行すべき命令語の先頭アドレス
*/
void disassemble_dc(WORD word, WORD pradr);
void disassemble_puts_code(int ascol, WORD pradr, int wordc, WORD wordv[])
{
- int i;
- for(i = 0; i < codecol-ascol; i++){
+ for(int i = 0; i < codecol-ascol; i++){
fprintf(stdout, " ");
}
if(wordc == 1) {
}
void disassemble_cmd_adr_x(CMDTYPE cmdtype, const char *cmdname, WORD word, WORD adr, WORD pradr)
{
- WORD x;
- char *g;
+ WORD x = 0;
+ char *g = NULL;
int cnt = 0;
+
cnt += fprintf(stdout, " %-7s ", cmdname);
if(cmdtype == R_ADR_X) {
cnt += fprintf(stdout, "%s,", g = grstr((word & 0x00F0) >> 4));
void disassemble_cmd_r(CMDTYPE cmdtype, const char *cmdname, WORD word, WORD pradr)
{
- char *g, *g1, *g2;
+ char *g = NULL;
+ char *g1 = NULL;
+ char *g2 = NULL;
int cnt = 0;
+
cnt += fprintf(stdout, " %-7s ", cmdname);
if(cmdtype == R1_R2) {
g1 = grstr((word & 0x00F0) >> 4);
void disassemble_dc(WORD word, WORD pradr)
{
int cnt = 0;
+
cnt = fprintf(stdout, " DC %-5d ", word);
disassemble_puts_code(cnt, pradr, 1, (WORD []){word});
fprintf(stdout, " ::" );
void disassemble_ds(WORD wcnt, WORD pradr)
{
- int cnt = 0, i;
+ int cnt = 0;
+
cnt = fprintf(stdout, " DS %-5d ", wcnt);
disassemble_puts_code(cnt, pradr, 1, (WORD []){0});
- for(i = 0; i < wcnt - 1; i++) {
+ for(int i = 0; i < wcnt - 1; i++) {
fprintf(stdout, "\n");
disassemble_puts_code(0, pradr+1, 1, (WORD []){0});
}
WORD zero_data_cnt(FILE *stream)
{
- WORD cnt = 0, word = 0;
+ WORD cnt = 0;
+ WORD word = 0;
+
while(!feof(stream) && word == 0) {
word = fgetword(stream);
cnt++;
bool disassemble_file(const char *file)
{
bool stat = true;
- FILE *fp;
- WORD i = 0, word, cmd, zcnt;
+ FILE *fp = NULL;
+ WORD i = 0;
+ WORD word = 0;
+ WORD cmd = 0;
+ WORD zcnt = 0;
CMDTYPE cmdtype = 0;
- char *cmdname;
+ const char *cmdname = NULL;
bool inst = true;
assert(file != NULL);
return false;
}
- create_code_cmdtype(); /* 命令のコードとタイプがキーのハッシュ表を作成 */
+ create_cmdtable(HASH_CODE); /* 命令のコードとタイプがキーのハッシュ表を作成 */
fprintf(stdout, "MAIN START\n");
for(word = fgetword(fp); !feof(fp); i++, word = fgetword(fp)) {
- cmdname = getcmdname(cmd = word & 0xFF00);
+ cmd = word & 0xFF00;
+ cmdname = getcmdname(cmd);
cmdtype = getcmdtype(cmd);
if(word == 0){
if(inst == true) { /* プログラム領域の場合 */
disassemble_cmd_r(NONE, "nop", 0, i);
} else { /* データ領域の場合 */
- if((zcnt = zero_data_cnt(fp)) == 1) { /* 1つだけの0はDCとみなす */
+ zcnt = zero_data_cnt(fp);
+ if(zcnt == 1) { /* 1つだけの0はDCとみなす */
disassemble_dc(0, i);
} else { /* 連続する0はDSとみなす */
disassemble_ds(zcnt, i);
fprintf(stdout, "\n");
}
fprintf(stdout, " END\n");
- free_code_cmdtype();
+ free_cmdtable(HASH_CODE);
fclose(fp);
return stat;
}
void disassemble_memory(WORD start, WORD end)
{
- WORD i, word, cmd;
+ WORD cmd = 0;
CMDTYPE cmdtype = 0;
- char *cmdname;
+ const char *cmdname = NULL;
bool inst = true;
- for(i = start; i <= end; i++) {
- word = sys->memory[i];
- cmdname = getcmdname(cmd = word & 0xFF00);
+ for(int i = start; i <= end; i++) {
+ cmd = sys->memory[i] & 0xFF00;
+ cmdname = getcmdname(cmd);
cmdtype = getcmdtype(cmd);
- if(word == 0) {
+ if(sys->memory[i] == 0) {
if(inst == true) { /* プログラム領域の場合 */
disassemble_cmd_r(NONE, "nop", 0, i);
} else { /* データ領域の場合。メモリーでは、DC 0とみなす */
disassemble_dc(0, i);
}
} else if(cmd == 0) {
- disassemble_dc(word, i);
+ disassemble_dc(sys->memory[i], i);
} else {
if(cmdtype == R_ADR_X || cmdtype == ADR_X) {
- disassemble_cmd_adr_x(cmdtype, cmdname, word, sys->memory[i+1], i);
+ disassemble_cmd_adr_x(cmdtype, cmdname, sys->memory[i], sys->memory[i+1], i);
i++;
} else {
- disassemble_cmd_r(cmdtype, cmdname, word, i);
+ disassemble_cmd_r(cmdtype, cmdname, sys->memory[i], i);
}
inst = (cmd != 0x8100) ? true : false;
}