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


一筆書きですが動くようになりました。
ダンプモジュールの状態遷移部分は見直ししてみたら結構書き直さないと駄目そうです。
日曜日くらいまでに本ちゃんの方に統合できれば良いかなーと思ってます。


毎フレーム、ユーザメモリ全てを最初から最後まで逆アセンブルし、そのうち表示すべきアドレス16行分のみ
画面に逆アセンブル結果を表示するようにしてます。
GMC-4 専用な書き方してます。妥協です(苦笑)。


アセンブル用に読み込んでるプログラムは
GMC-4 を入手して間もない頃に書いた簡易スロットゲームです。
C 言語用配列データとして別途読み込ませてます。


DUMP MEMORY TYPE-B


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
	
};