メモリダンプタイプ B 作成中っぽい何か。2


計算できました。
まだ確認用に上から順で printf してます。




寝る前に悶々と考えて寝起きで書いてみると結構上手くいくみたいです。>俺の場合
次は昨日書いた描画処理と連携する部分を書こうと思います。


適当に書きなぐったコードとか。
余計にある構造体とかは他モジュールと連動した際を想定したものです。
ダンプモジュール用構造体のメンバ変数名とかは一応まだ仮名です。


main.c

/*---------------------------------------------------------------------------------
	
	dumpB module routine
	
	version 0.01
	Nov 25, 2009
	
	By. REGEKATSU
	
---------------------------------------------------------------------------------*/

#include <nds.h>

#include <stdio.h>
#include <string.h>


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 ram[0x60];
	
}MemoryStatus;

MemoryStatus St_memory;


typedef struct{
	
	u32 kdr;
	
}KeyStatus;

KeyStatus St_key;


typedef struct{
	
	u8 cur_addr;
	u8 offset_addr;
	int operand_size;
	
	int draw_posx;
	int draw_posy;
	
	
}DumpStatus;

DumpStatus st_dump;


void clearRAM(void);


//---------------------------------------------------------------------------------
void clearRAM(void) {
//---------------------------------------------------------------------------------
	
	u8 i;
	
	for(i = 0;i < 0x60;i++){
		St_memory.ram[i] = (i < 0x10) ? i:0x0F;
	}
	
}



//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------
	
	consoleDemoInit();
	keysSetRepeat(30, 10);
	
	clearRAM();
	
	memset(&st_dump, 0, sizeof(st_dump));
	st_dump.draw_posx = 2;
	st_dump.draw_posy = 2;
	
	
	printf("ADDR CODE SYM\n");
	
	
	st_dump.operand_size = 0;
	
	for(st_dump.cur_addr = 0;st_dump.cur_addr < 0x16;st_dump.cur_addr++){
		
		swiWaitForVBlank();
		
		
		printf("%02X   %01X    ", 
			st_dump.cur_addr, St_memory.ram[st_dump.cur_addr]);
		
		
		//draw dis asm
		if(st_dump.operand_size == 0){
			printf("%s\n", 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){
			printf("<%X> \n", St_memory.ram[st_dump.cur_addr]);
			st_dump.operand_size--;
			
		}else{ //(st_dump.operand_size == -1)
			printf("%s\n", ex_mnemonic[ St_memory.ram[st_dump.cur_addr] ]);
			st_dump.operand_size = 0;
			
		}
		
	}
	
	return 0;
	
}

//---------------------------------------------------------------------------------