fzq.h
来自「自己写的C51仿真器代码」· C头文件 代码 · 共 262 行
H
262 行
#ifndef __FZQ_H
#define __FZQ_H
#ifndef __STDIO_H
#include <stdio.h>
#endif
#include <assert.h>
#ifndef __dos_h
#include <dos.h>
#endif
typedef struct
{
unsigned long padd;
// unsigned char al;
// unsigned char am;
// unsigned char ah;
unsigned char flag;
} RAM;
typedef unsigned char byte;
const int BASE = 0x378;
const int pdata = BASE;
const int pctrl = BASE + 2;
const int pstat = BASE + 1;
const byte pin = 0x04;
const byte pout = 0x04;
const byte wr = 0x01;
const byte rd = 0x02;
const byte clk = 0x08;
const byte PA = 0x3f;
const byte PB = 0x7f;
const byte PC = 0xbf;
const byte PW = 0xff;
const char c374_inside = 0x03 ; // a1 a0 *** 010
const char c374_port = 0x05 ; // a1 a0 *** 101
const char c374_write = 0x02 ;
const char c374_e373 = 0x04;
const char c374_de373 = 0xfb;
const char pc_373 = 0x40 ; //enable PC6(LE) and disable PC3(~OE)
const char pc_doe = 0x08 ;
const char pc_nul = 0xb0 ;
RAM sram, *pram = &sram;
//const unsigned char FOR_READ = 1;
//const unsigned char FOR_WRITE = 2;
byte _p374 = 0xff;
void put374(byte c)
{
_p374 = c;
outportb(pctrl,pout);
outportb(pdata,c);
outportb(pctrl,pout|clk);
outportb(pctrl,pout);
}
void put_8255(byte PN,byte c)
{
put374(PN&(_p374|0xc0));
outportb(pdata,c);
outportb(pctrl,pout|wr);
outportb(pctrl,pout);
}
unsigned char get_8255(byte PN)
{
// byte c;
// put374(PN);
// outportb(pctrl,pout);
//outportb(pctrl,pin|rd);
// c = inportb(BASE + 4);
// outportb(pctrl,pin);
// return c;
}
int rseek(unsigned long offset)
{
if(pram->flag == 1)
{
pram->padd = offset;
//(char)pram->padd = (unsigned char)pram->padd;
//(char)(pram->padd >> 8) = (unsigned char)(pram->padd >> 8);
//(char)(pram->padd >> 16) = (unsigned char)(pram->padd >> 16);
put_8255(PC,(pc_doe | pc_373));
put_8255(PB,(char)(pram->padd >> 8));
put_8255(PC,((char)(pram->padd >> 16) | pc_nul) & (~pc_373));
put_8255(PB,(char)(pram->padd >> 8));
return 1;
}
else
{
return 0;
}
}
int rrewind()
{
if(pram->flag == 1)
{
pram->padd = 0;
//(char)(pram->padd >> 8) = (char)(pram->padd >> 8) = (char)(pram->padd >> 16) = 0;
put_8255(PC,(pc_doe | pc_373));
put_8255(PB,(char)(pram->padd >> 8));
put_8255(PC,((char)(pram->padd >> 16) | pc_nul) & (~pc_373));
put_8255(PB,(char)(pram->padd >> 8));
return 1;
}
else
{
return 0;
}
}
RAM *ropen(const char *flag)
{
//static char ram_exist;
sram.padd = 0;
if(*flag=='r')
{
sram.flag = 'r';
put374(c374_inside);
put_8255(PC,pc_doe);
put_8255(PW,0x90); //8255 Pa input,Pb,Pc output
put_8255(PC,(pc_doe | pc_373));
put_8255(PB,(char)(pram->padd >> 8));
put_8255(PC,((char)(pram->padd >> 16) | pc_nul) & (~pc_373));
put_8255(PB,(char)pram->padd);
return pram;
}
else if(*flag=='w')
{
sram.flag = 'w';
put374(c374_inside);
put_8255(PC,0x08);
put_8255(PW,0x80); //8255 all output
put_8255(PC,(pc_doe | pc_373));
put_8255(PB,(char)(pram->padd >> 8));
put_8255(PC,((char)(pram->padd >> 16) | pc_nul) & (~pc_373));
put_8255(PB,(char)pram->padd);
return pram;
}
else
{
return NULL;
}
}
/*int rclose()
{
if(pram->flag)
{
pram->flag = 0 ;
return 0;
}
else
{
return EOF;
}
}
*/
int reof()
{
if(pram->padd > 0x7ffff)
{
return 1;
}
else
{
return 0;
}
}
int rputc(int c)
{
assert(pram->flag == 'w');
// rputc must be user in write mode
if(c == EOF)
{
return EOF;
}
if(pram->padd > 0x7ffff)
{
return EOF;
}
else
{
put_8255(PA, (char)c);
put374(c374_write);
put374( c374_inside);
if((char)(++(pram->padd)) == 0)
{
//(char)pram->padd = (unsigned char)pram->padd;
//(char)(pram->padd >> 8) = (unsigned char)(pram->padd >> 8);
//(char)(pram->padd >> 16) = (unsigned char)(pram->padd >> 16);
put_8255(PC, (pc_doe | pc_373));
put_8255(PB, (char)(pram->padd >> 8));
put_8255(PC, ((char)(pram->padd >> 16) | pc_nul) & (~pc_373));
put_8255(PB, (char)pram->padd);
}
else
{
put_8255(PB, (char)pram->padd);
}
return c;
}
}
int rgetc()
{
unsigned char c;
assert(pram->flag == 'r');
// rgetc must be use only in read mode
if(pram->padd > 0x7ffff)
{
return EOF;
}
else
{
put_8255(PC, ((char)(pram->padd >> 16) | pc_nul) & ~pc_doe);
c = get_8255(PA);
put_8255(PC, ((char)(pram->padd >> 16) | pc_nul));
if((char)(++(pram->padd)) == 0)
{
//(char)pram->padd = (unsigned char)pram->padd;
//(char)(pram->padd >> 8) = (unsigned char)(pram->padd >> 8);
//(char)(pram->padd >> 16) = (unsigned char)(pram->padd >> 16);
put_8255(PC, (pc_doe | pc_373));
put_8255(PB, (char)(pram->padd >> 8));
put_8255(PC, ((char)(pram->padd >> 16) | pc_nul) & (~pc_373));
put_8255(PB, (char)pram->padd);
}
else
{
put_8255(PB, (char)pram->padd);
}
return c;
}
}
void fz()
{
put374(c374_inside); //pull high
put_8255(PW,0x9b);
put374(c374_port); // simulate
put_8255(PW,0x9b);
}
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?