/* アドバンスROM吸出し用プログラム romcap.c 01/5/30 あさ PC/AT互換機DOS窓用 コンパイラはLSI-C試食版用 */ #include #include /* ポート入出力用定義 */ char _asm_c(char *, int); char _asm_cc(char *, char, int); #define _inp(p) _asm_c("\n\tPUSH\tDX\n\tMOV\tDX,AX\n\tIN\tAL,DX\n\tPOP\tDX\n", p) #define _outp(p, c) _asm_cc("\n\tPUSH\tDX\n\tPUSH\tBX\n\tMOV\tDX,BX\n\tOUT\tDX,AL\n\tPOP\tBX\n\tPOP\tDX\n", c, p) /* 986 = 0x03DA */ int _asm_s(char *); /* 現時刻の秒を得る */ char getsec(void) { int ret; do { ret = _asm_s("\n\tPUSH\tDX\n\tPUSH\tCX\n\tMOV\tAH,44\n\tINT\t33\n" "\tMOV\tAH,DH\n\tPOP\tCX\n\tPOP\tDX\n"); } while(ret & 0xff != 0); return ret>>8; } /* Waitを実行 */ void waitgetsec(long wait) { int i; for(i=0; i cnt[i]) min = cnt[i]; } ave = ave/8; printf("max: %08x, ", max); printf("min: %08x, ", min); printf("ave: %08x, ", ave); printf("wait: %08x\n\n", max/1024+1); return max/0x1024+1; } char usage[] = "機 能:GBAカートリッジを読み出します\n" "使用法:ROMCAP [オプション] [出力ファイル名]\n" "オプション\n" "/B\t\tWait値を算出してから実行します\n" "/Wn\tn=数値\tWait値を設定します\n" "/Sn\tn=数値\t読み出しサイズを設定します\n\t\t(単位1kバイト、ただし16k単位の半端は切捨て)\n\n"; #define ADON (1) #define ADOFF (0) #define RDON (2) #define RDOFF (0) #define CSON (4) #define CSOFF (0) #define SEL00 (0x00) #define SEL01 (0x08) #define SEL10 (0x10) #define SEL11 (0x18) #define setsig(_a, _b, _c) (((~(_a))&(~(_b))&(~(_c))&7)|0xe0) int main(int argc, char* argv[]) { long wait = 10; /* デフォルトWait値 */ int getsize = 16/16; /* 16kバイト単位 */ int bflag = 0; /* ウェイト値を計る(オフ) */ int i, j; char data; char *filename = "out.gba"; FILE *fp; /* ソフト名表示 */ printf("ROMCAP.EXE GameBoyAdvance ROMdataCapture V1.00 (c) 2001 acer\n"); /* コマンドラインオプション */ for(i=1; i>3)&0x000f; _outp(0x0378, setsig(ADOFF,RDON,CSON)|SEL11); /* SEL 11 */ waitgetsec(wait); data = data |((_inp(0x0379)<<1)&0x00f0); // _outp(0x0378, setsig(ADOFF,RDON,CSON)|SEL10); /* SEL 10 */ // waitgetsec(wait); data = ((data & 0x88)>>2)|((data & 0x22)<<2)|(data & 0x55); putc(data, fp); _outp(0x0378, setsig(ADOFF,RDON,CSON)|SEL00); /* SEL 00 */ waitgetsec(wait); data = (_inp(0x0379)>>3)&0x000f; _outp(0x0378, setsig(ADOFF,RDON,CSON)|SEL01); /* SEL 01 */ waitgetsec(wait); data = data |((_inp(0x0379)<<1)&0x00f0); data = ((data & 0x88)>>2)|((data & 0x22)<<2)|(data & 0x55); putc(data, fp); } printf(" Write\n"); } _outp(0x0378, setsig(ADOFF,RDOFF,CSOFF)|SEL11); /* 初期状態へ戻す */ waitgetsec(wait); fclose(fp); printf("conplete.\n\n"); return 0; }