/* アドバンスROM吸出し用プログラム romcap15.c 01/6/11 あさ PC/AT互換機Win9xDOS窓用 コンパイラはLSI-C試食版を使用 */ #include #include #define BLOCK (512*16) static int wait; /* ウエイト値 */ static int port; /* ポートアドレス */ /* ポート入出力用定義 */ 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(int wt) { 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" "/Pn\tn=16進\t先頭ポートアドレスを指定します\n" "/Wn\tn=数値\tWait値を設定します\n" "/Sn\tn=数値\t読み出しサイズを設定します\n\t\t(単位1kバイト、ただし16k単位の半端は切捨て)\n\n"; /* reg0 設定用 */ #define ADON (0x00) #define ADOFF (0x80) #define RDON (0x00) #define RDOFF (0x01) #define CSON (0x00) #define CSOFF (0x02) /* HC138制御用 */ #define SEL00 (0x02) #define SEL01 (0x00) #define SEL10 (0x06) #define SEL11 (0x04) #define GON (0x00) #define GOFF (0x01) /* レジスタにデータ出力 */ void out_8(int sel, int data) { _outp(port+2, (sel)|GOFF); waitgetsec(wait); _outp(port+0, data); _outp(port+2, (sel)|GON); waitgetsec(wait); _outp(port+2, (sel)|GOFF); waitgetsec(wait); } /* 16ビットデータを読み出す */ int in_16(void) { int ret; _outp(port+2, SEL10|GOFF); waitgetsec(wait); ret = (_inp(port+1)>>3)&0x000f; _outp(port+2, SEL11|GOFF); waitgetsec(wait); ret |= (_inp(port+1)<<1)&0x00f0; _outp(port+2, SEL00|GOFF); waitgetsec(wait); ret |= (_inp(port+1)<<5)&0x0f00; _outp(port+2, SEL01|GOFF); waitgetsec(wait); ret |= (_inp(port+1)<<9)&0xf000; ret = ((ret & 0x8888)>>2)|((ret & 0x2222)<<2)|(ret & 0x5555); return ret; } int main(int argc, char* argv[]) { int getsize = 16/16; /* 16kバイト単位 */ int bflag = 0; /* ウェイト値を計る(オフ) */ char *filename = "out.gba"; /* ファイル名 */ FILE *fp; int i, j; int data; wait = 0; /* デフォルトWait値 */ port = 0x378; /* ポートアドレス */ /* ソフト名表示 */ printf("ROMCAP15.EXE GameBoyAdvance ROMdataCAPture V1.50 (c) 2001 acer\n"); /* コマンドラインオプション */ for(i=1; i>8)|((i<<5)&0xe0)); out_8(SEL11, i>>3); out_8(SEL00, ADON|CSOFF|RDOFF); waitgetsec(wait); out_8(SEL00, ADON|CSON|RDOFF); waitgetsec(wait); out_8(SEL00, ADOFF|CSON|RDON); data = in_16(); putc(data&0xff, fp); putc(data>>8, fp); } printf(" Write\n"); } /* 初期状態へ戻す */ _outp(port+2, SEL00|GOFF); /* DATAを出力に */ waitgetsec(wait); fclose(fp); printf("conplete.\n\n"); return 0; }