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 + -
显示快捷键?