LIST 17 ============================================================================ #include #include #include main(){ int d; printf("\n\t########## [transfer.hex] --> ROM Emulator ##########\n"); system_init(); /* システムの初期設定 */ if(hex_file_send()==1){ /* ターゲットファイルをロード */ printf("\n\n\t !!! Target File Missing !!!\n"); exit(0); } system_start(); /* システムをスタート */ printf("\n\n\t########## Let's Start ([r]eset/[s]end) ##########\n"); while(1){ /* 無限ループ */ if(kbhit()!=0){ d=getch(); /* キー入力をチェック */ if(d==0x1b) break; else if(d=='r'){ /* [r]ならリセット */ system_init(); system_reset(); printf("\n\n\t !!! Reset !!!\n"); } else if(d=='s'){ /* [s]なら再ロード */ system_init(); hex_file_send(); system_start(); printf("\n\n\t !!! Re-Send !!!\n"); } } } } system_init(){ set_4bit(6,0x02); /* 010 */ /* Bus Disable */ } system_start(){ int i,j=0; set_4bit(6,0x06); /* 110 */ /* Bus Enable */ for(i=0;i<10000;i++) j++; set_4bit(6,0x07); /* 111 */ /* Go ! */ } system_reset(){ int i,j=0; set_4bit(6,0x06); /* 110 */ /* Reset ! */ for(i=0;i<30000;i++) j++; set_4bit(6,0x07); /* 111 */ /* Go ! */ } setting_1byte(unsigned int address, int data, int head){ set_address(address); set_data(data); set_4bit(6,0x00); /* 000 */ /* Write Pulse */ set_4bit(6,0x02); /* 010 */ /* Bus Disable */ if(head!=0){ printf("\n\t\tAddress = %04X , Data = %02X ",address,data); } else if(address%16==0) putchar('.'); return(0); } set_address(unsigned int address){ unsigned int add; add=address; set_4bit(2,add%16); /* アドレスA3-A0のセット */ add=add/16; set_4bit(3,add%16); /* A7-A4 */ add=add/16; set_4bit(4,add%16); /* A11-A8 */ add=add/16; set_4bit(5,add%16); /* A15-A12 */ } set_data(int data){ set_4bit(0,data%16); /* データD0-D3のセット */ set_4bit(1,data/16); /* D4-D7 */ } set_4bit(int add, int data){ outport(0x0040,16*add+data); /* 7ビットのデータをセットして */ outport(0x0046,0x0e); /* ラッチパルスを下げて */ outport(0x0046,0x0f); /* 上げる。このエッジで書き込み */ } conv(int a){ if(a<'9'+1) return(a-'0'); else return(a-'A'+10); } hex_file_send(){ /* インテルHEXファイルを読み込んでロードする */ FILE *fds; unsigned int address,head=0; int data,d,a,dd[10],i,count; if((fds=fopen("transfer.hex","rb"))==NULL) return(1); while(1){ d=fgetc(fds); if(d!=':') break; dd[0]=fgetc(fds); dd[1]=fgetc(fds); dd[2]=fgetc(fds); dd[3]=fgetc(fds); dd[4]=fgetc(fds); dd[5]=fgetc(fds); fgetc(fds); d=fgetc(fds); if(d=='1') break; a=dd[0]; count=16*conv(a); a=dd[1]; count=count+conv(a); a=dd[2]; address=4096*conv(a); a=dd[3]; address=address+256*conv(a); a=dd[4]; address=address+16*conv(a); a=dd[5]; address=address+conv(a); head=1; for(i=0;i