Добавил:
Fragga
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:CC++ / Симулятор УРТК 1.76M / urtk_1_76M / BCPP31 / INCLUDE / EMURTK / EMURTK
.H//-----------------------------Version 0.42-----------------------------
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <process.h>
#include <share.h>
#include <stdio.h>
#include <string.h>
#include <alloc.h>
#include <windows.h>
// тут слегка перепутаны названия DVG0 и DVG1, но тк всё работает как надо
// исправлять не охота
void outp_emu ( unsigned AdrPorta, int ValuePorta );
int inp_emu(unsigned AdrPorta);
void derlay(int ){
Yield();
}
#undef inp(__portid)
#undef inportb(__portid)
#undef outp(__portid,__value)
#undef outportb(__portid,__value)
#define inp(port) (inp_emu(port))
#define inportb(port) (inp_emu(port))
#define outp(port, data) (outp_emu(port,data))
#define outportb(port, data) (outp_emu(port,data))
#define delay(x) (derlay(x))
struct zmURTK
{
unsigned char wstep[6];
unsigned char rstep[6];
unsigned char SNS0;
unsigned char SNS1;
unsigned char SNS2;
unsigned char DVG0;
unsigned char DVG1;
HWND SIMURTKDD_HWND;//FILE *DataURTKFile;
HWND SIMURTK_HWND; //FILE *DataUserFile;
int DataURTKTxt;
int DataUserTxt;
int GlobalUserData;
int GlobalURTKData;
int mode;
int WhatDVG;
int WhatSNS;
int BufData;
} eURTK={
0,0,0,0,0,0,
0,0,0,0,0,0,
0,
0,
0,
0,
0,//DVG1
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
};
int OpenURTKData(void){
eURTK.SIMURTKDD_HWND=FindWindow("URTK_Datchik_Data_window",NULL);
if(eURTK.SIMURTKDD_HWND!=NULL)eURTK.DataURTKTxt=1;else return 0;
return 1;
}
int OpenUserData(void){//poisk okna Sim URTK
eURTK.SIMURTK_HWND=FindWindow ("URTK_main_window",NULL);
if((eURTK.SIMURTK_HWND == NULL)) { MessageBox(NULL,"Sim URTK not found!","Error",MB_OK); return 0;}
eURTK.DataUserTxt=1;
// SendMessage(eURTK.SIMURTK_HWND, 0x1300, 0, 1313);
return 1;
}
unsigned char GetURTKData(void)
{
// MSG msg;
if(eURTK.WhatSNS==1)
{
eURTK.WhatSNS=2;
return (eURTK.SNS1);
}
if(eURTK.WhatSNS==2)
{
eURTK.WhatSNS=0;
return (eURTK.SNS2);
}
if(eURTK.DataURTKTxt ==0){ if(!OpenURTKData()) return 0;}
char urtkdatabuf[9]="";
GetWindowText(eURTK.SIMURTKDD_HWND,urtkdatabuf,9);
sscanf(urtkdatabuf,"%x %x %x",&eURTK.SNS0,&eURTK.SNS1,&eURTK.SNS2);
eURTK.WhatSNS=1;
return (eURTK.SNS0);
}
void WriteUserData(void)
{
//if(((eURTK.WhatDVG==0) &&(eURTK.BufData==eURTK.DVG0)) ||((eURTK.WhatDVG==1)&&(eURTK.BufData==eURTK.DVG1))) return;//budem pisat tolko raznye dannye
if(eURTK.WhatDVG==0) {eURTK.DVG0=eURTK.BufData; return;}
if(eURTK.WhatDVG==1) eURTK.DVG1=eURTK.BufData;
if(eURTK.DataUserTxt ==0){ if(!OpenUserData()) return;}//nashli li
SendMessage(eURTK.SIMURTK_HWND, 0x1300, eURTK.DVG1,eURTK.DVG0);
}
int inp_emu(unsigned eAdr)
{
unsigned char eData=0;
if(eAdr!=(0x378))return 0;
if(eURTK.rstep[2]) {eData=GetURTKData();eURTK.rstep[3]=1;}
//printf("inp=%d\n", eData);
return (eData);
}
void outp_emu ( unsigned eAdr, int eData )
{
int RD,A0,WR,A1,B5;
//printf("outp_emu mode=%d\n",eURTK.mode);
if(eAdr==(0x378))
{
if((eURTK.rstep[1]==0)&&(eURTK.mode==(0x13))&&(eData==(0xFF))){eURTK.rstep[1]=1;return;}
if(eURTK.wstep[1]==1){
eURTK.BufData=eData;
eURTK.wstep[2]=1;
return;
}
}
if(eAdr!=(0x37A))return;
RD=(eData&(0x1));
A0=(eData&(0x2))>>1;
WR=(eData&(0x4))>>2;
A1=(eData&(0x8))>>3;
B5=(eData&(0x20))>>5;
//printf("RD=%d,A0=%d,WR=%d,A1=%d,B5=%d\n",RD,A0,WR,A1,B5);
if(eData&(0xD0)) return;
if(eURTK.rstep[3])
{
if((WR==1)&&(RD==0)){
eURTK.rstep[1]=0;
eURTK.rstep[2]=0;
eURTK.rstep[3]=0;
eURTK.wstep[1]=0;
eURTK.wstep[2]=0;
eURTK.wstep[3]=0;
}
return;
}
if((A0==0)&&(A1==0))//piwem v RC (opredelyaem re*im)
{
if(eURTK.wstep[1]==0)
{
if((RD==0)&&(WR==1)&&(B5==0)){eURTK.wstep[1]=1;return;}
}
if(eURTK.wstep[2]==1)
{
if((RD==0)&&(WR==0)&&(B5==0)){eURTK.wstep[3]=1;return;}
}
if(eURTK.wstep[3]==1)
{
if((RD==0)&&(WR==1)&&(B5==0))
{
//eURTK.wstep[4]=1;
eURTK.mode=eURTK.BufData;
eURTK.wstep[1]=0;
eURTK.wstep[2]=0;
eURTK.wstep[3]=0;
return;
}
}
}
if((A0==1)&&(A1==1))//piwem v RD (idet zapis) ili 4itaem
{
if(eURTK.rstep[1]==1)
{
if((B5)&&(RD)&&(A0)&&(A1)&&(WR)){eURTK.rstep[2]=1;return;}
}
if(eURTK.wstep[2]==1)
{
if((RD==0)&&(WR==0)&&(B5==0)){eURTK.wstep[3]=1;return;}
}
if(eURTK.wstep[3]==1)
{
if((RD==0)&&(WR==1)&&(B5==0))
{
if(eURTK.mode==0x11)
{
WriteUserData();
//printf("piwem=%d",eURTK.BufData);
if(eURTK.WhatDVG==0)eURTK.WhatDVG=1;else eURTK.WhatDVG=0;
}
eURTK.wstep[1]=0;
eURTK.wstep[2]=0;
eURTK.wstep[3]=0;
return;
}
}
//if(eURTK.wstep[1]==0)
// {
if((RD==0)&&(WR==1)&&(B5==0)){eURTK.wstep[1]=1;return;}
// }
}
}