メモリダンプタイプ B 作成中っぽい何か。4
一筆書きですが動くようになりました。
ダンプモジュールの状態遷移部分は見直ししてみたら結構書き直さないと駄目そうです。
日曜日くらいまでに本ちゃんの方に統合できれば良いかなーと思ってます。
毎フレーム、ユーザメモリ全てを最初から最後まで逆アセンブルし、そのうち表示すべきアドレス16行分のみ
画面に逆アセンブル結果を表示するようにしてます。
GMC-4 専用な書き方してます。妥協です(苦笑)。
逆アセンブル用に読み込んでるプログラムは
GMC-4 を入手して間もない頃に書いた簡易スロットゲームです。
C 言語用配列データとして別途読み込ませてます。
main.c
/*--------------------------------------------------------------------------------- DumpB module routine version 0.01 Nov 25, 2009 By. REGEKATSU ---------------------------------------------------------------------------------*/ //temporary include #include <nds.h> #include "PrgVal.h" //DumpB include #include <nds/ndstypes.h> #include <nds/arm9/input.h> #include <stdio.h> #include <string.h> //Cpu module status typedef struct{ u8 pc; bool flag; }CpuStatus; CpuStatus st_cpu; //Memory module define typedef enum{ Ar = 0x6F, Br = 0x6C, Yr = 0x6E, Zr = 0x6D, A_r = 0x69, B_r = 0x67, Y_r = 0x68, Z_r = 0x66 }GMC4_REGISTER; //Memory module status typedef struct{ u8 ram[0x80]; }MemoryStatus; MemoryStatus St_memory; //keyState module status typedef struct{ u32 kdr; }KeyStatus; KeyStatus St_key; //DumpB module const char *mnemonic[] = { // 1 nibble opereation "KA ", "AO ", "CH ", "CY ", "AM ", "MA ", "M+ ", "M- ", // 2 nibble operation "TIA ", "AIA ", "TIY ", "AIY ", "CIA ", "CIY ", // 2 nibble sub routine "CAL_", // 3 nibble operation "JUMP" }; const char *ex_mnemonic[] = { "RSTO", "SETR", "RSTR", "INPT", "CMPL", "CHNG", "SIFT", "ENDS", "ERRS", "SHTS", "LONS", "SUND", "TIMR", "TIMR", "DEM-", "DEM+" }; typedef struct{ u8 cur_addr; u8 draw_addr; bool is_draw_addr; int operand_size; int draw_posx; int draw_posy; }DumpStatus; DumpStatus st_dump; //temporary function void clearRAM(void); void loadData(void); //--------------------------------------------------------------------------------- void clearRAM(void) { //--------------------------------------------------------------------------------- int i; for(i = 0;i < 0x80;i++){ St_memory.ram[i] = 0x0F; } } //--------------------------------------------------------------------------------- void loadData(void) { //--------------------------------------------------------------------------------- int i; for(i = 0;i < 0x60;i++){ St_memory.ram[i] = prg_val[i]; } } //--------------------------------------------------------------------------------- int main(void) { //--------------------------------------------------------------------------------- int i; consoleDemoInit(); keysSetRepeat(12, 6); st_cpu.pc = 0x00; st_cpu.flag = 1; clearRAM(); loadData(); //initDumpBStatus memset(&st_dump, 0, sizeof(st_dump)); st_dump.draw_posx = 15; st_dump.draw_posy = 5; //drawDumpBTitle printf("\x01b[1;6HDUMP MEMORY TYPE-B"); printf("\x01b[3;2HREG DATA ADDR SYM CODE"); while(1) { swiWaitForVBlank(); //drawRegister printf( "\x01b[5;2HAr %01X" "\x01b[6;2HA_r %01X" "\x01b[8;2HBr %01X" "\x01b[9;2HB_r %01X" "\x01b[11;2HYr %01X" "\x01b[12;2HY_r %01X" "\x01b[14;2HZr %01X" "\x01b[15;2HZ_r %01X" "\x01b[17;2HPC %02X" "\x01b[19;2HF %01X", St_memory.ram[Ar], St_memory.ram[A_r], St_memory.ram[Br], St_memory.ram[B_r], St_memory.ram[Yr], St_memory.ram[Y_r], St_memory.ram[Zr], St_memory.ram[Z_r], st_cpu.pc, st_cpu.flag ); //drawData for(i = 0;i < 0x10;i++){ printf("\x01b[%d;9H%02X %01X", i + 5, 0x50 + i, St_memory.ram[ 0x50 + i ]); } //drawAddress st_dump.operand_size = 0; for(st_dump.cur_addr = 0;st_dump.cur_addr < 0x60;st_dump.cur_addr++){ if( ( st_dump.cur_addr >= st_dump.draw_addr ) && ( st_dump.cur_addr < (st_dump.draw_addr + 0x10) ) ){ st_dump.is_draw_addr = true; }else{ st_dump.is_draw_addr = false; } if(st_dump.is_draw_addr){ printf("\x01b[%d;%dH%02X %01X", st_dump.draw_posy + (st_dump.cur_addr - st_dump.draw_addr), st_dump.draw_posx, st_dump.cur_addr, St_memory.ram[st_dump.cur_addr]); } if(st_dump.operand_size == 0){ if(st_dump.is_draw_addr){ printf("\x01b[%d;20H%s", st_dump.draw_posy + (st_dump.cur_addr - st_dump.draw_addr), mnemonic[ St_memory.ram[st_dump.cur_addr] ]); } if(St_memory.ram[st_dump.cur_addr] <= 0x07){ st_dump.operand_size = 0; }else if(St_memory.ram[st_dump.cur_addr] >= 0x08 && St_memory.ram[st_dump.cur_addr] <= 0x0D){ st_dump.operand_size = 1; }else if(St_memory.ram[st_dump.cur_addr] == 0x0F){ st_dump.operand_size = 2; }else if(St_memory.ram[st_dump.cur_addr] == 0x0E){ st_dump.operand_size = -1; } }else if(st_dump.operand_size >= 1){ if(st_dump.is_draw_addr){ printf("\x01b[%d;20H<%X> ", st_dump.draw_posy + (st_dump.cur_addr - st_dump.draw_addr), St_memory.ram[st_dump.cur_addr]); } st_dump.operand_size--; }else{ //}else if(st_dump.operand_size == -1){ if(st_dump.is_draw_addr){ printf("\x01b[%d;20H%s", st_dump.draw_posy + (st_dump.cur_addr - st_dump.draw_addr), ex_mnemonic[ St_memory.ram[st_dump.cur_addr] ]); } st_dump.operand_size = 0; } } scanKeys(); St_key.kdr = keysDownRepeat(); //moveAddress if(St_key.kdr & KEY_DOWN){ if(st_dump.draw_addr < (0x60 - 0x10)){ st_dump.draw_addr++; } }else if(St_key.kdr & KEY_UP){ if(st_dump.draw_addr > 0x00){ st_dump.draw_addr--; } }else if(St_key.kdr & KEY_RIGHT){ if((st_dump.draw_addr + 0x10) < (0x60 - 0x10)){ st_dump.draw_addr += 0x10; }else{ st_dump.draw_addr = 0x60 - 0x10; } }else if(St_key.kdr & KEY_LEFT){ if( ((st_dump.draw_addr - 0x10) > 0x00) && ((st_dump.draw_addr - 0x10) < 0x60)){ st_dump.draw_addr -= 0x10; }else{ st_dump.draw_addr = 0x00; } } } } //---------------------------------------------------------------------------------
PrgVal.h
/*--------------------------------------------------------------------------------- スロットゲーム レトロゲーム活用研究同好会 By. REGEKATSU ---------------------------------------------------------------------------------*/ #ifndef _PRG_VAL_H_ #define _PRG_VAL_H_ #include <nds/ndstypes.h> extern const u8 prg_val[96]; #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif //_PRG_VAL_H_
PrgVal.c
/*--------------------------------------------------------------------------------- スロットゲーム レトロゲーム活用研究同好会 By. REGEKATSU ---------------------------------------------------------------------------------*/ #include "PrgVal.h" const u8 prg_val[96] = { 0x08, 0x00, 0x0A, 0x00, 0x03, 0x09, 0x01, 0x01, 0x03, 0x09, 0x01, 0x0F, 0x00, 0x04, 0x00, 0x0F, 0x00, 0x09, 0x08, 0x00, 0x00, 0x0F, 0x01, 0x04, 0x08, 0x00, 0x0F, 0x00, 0x04, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F };