⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mvp.c

📁 msc1201 编程4
💻 C
字号:
// MSC1210 Versatile Programmer 		HC 12/16/2002
#include <REG1210.H>
#include "mvp.h"
unsigned int t0, t1, t2;	// global timers
xdata at 0x0400 NV ping;
xdata at 0x0480 NV pong;
NV xdata * data nvcp; // current pointer
NV xdata * data nvnp; // next pointer
// Serial0
unsigned char xdata *rx_hdptr;
unsigned char xdata * rx_tailptr;
unsigned char xdata * tx_hdptr;
unsigned char xdata * tx_tailptr;
bit txmt, rxmt, txfull, rxfull;
void version (void)
{
	putstr("\x1b[1;37;46m\x1b[2J");
	putstr("\nMSC Versatile Programmer\tVer:");
	tx_hex(HWPC1);	tx_hex(HWPC0);	tx_hex(HWID);	tx_byte('F');
	tx_hex(FWVer); putcr();
}
void initsfr(void)
{
	PASEL=0x10;		// PSEN output OscClk
	CKCON &= 0xf8; 	// 0 MOVX cycle stretch
	PDCON=0x05;		// tone/pwm/adc/systimer
	// ADC setup
	ACLK=kACLK;
	DECIMATION=27;	// 800 sample per sec
	ADCON0 = 0x00;			   // Vref Off, Buff on, BOD off, PGA 1
	ADCON1=0x41;			  // Unipolar, Self Cal
	ADMUX=0x08;
	// UART setup
	THL2=0xffff;
  	RCAP2  = kRCAP2;  // 57600 Baud @ 11.0592MHz
	T2CON  = 0x34;  // T2 as baudrate generator 
  	SCON   = 0x52;  // Async mode 1, 8-bit UART, enable rcvr, TI=1, RI=0	
  	// System timer setup
	USEC = kUSEC;
	MSEC = kMSEC;  
	// ALE setup
	PASEL=2;			// ALE pin = 0;
	// Int Setup
	MSINT=0x81;			// Interrupt per 2 ms
	AIE=0x30;		// MSec Int and ADC Int
	EAI=1;			// enable AuxInt
	// Setup serial port interrupt
	rx_hdptr=RX_BEG; rx_tailptr=RX_BEG;	tx_hdptr=TX_BEG; tx_tailptr=TX_BEG;
	txmt=1; rxmt=1; txfull=0; rxfull=0; TI=0; RI=0; 
	EA=1; ES0=1;
}

void nvnew(void)
{
//		putstr("NV Clear\n");
		beep(700,100);
		EA=0; EAI=0; nvcp=&ping; nvnp=&pong;
		page_erase(nvcp,0xff,FDM); EAI=1; EAI=0;
		page_erase(nvnp,0xff,FDM);EAI=1; EAI=0;
		write_flash_chk(&(nvcp->valid), Yes,FDM);
		write_flash_chk(&(nvcp->cpu), CPUA,FDM);
		write_flash_chk(&(nvcp->hexdlto), Master,FDM);
		write_flash_chk(&(nvcp->speaker), On,FDM);
		write_flash_chk(&(nvcp->mem),Target,FDM);
		write_flash_chk(&(nvcp->memaddrl),0,FDM);
		write_flash_chk(&(nvcp->memaddrh),0,FDM);
		write_flash_chk(&(nvcp->forcesecure),None,FDM);
		write_flash_chk(&(nvcp->mode),Program,FDM);
		EAI=1; EA=1;
		beep(300,100); 
}
void nvinit(void)
{
	if (ping.valid==Yes && pong.valid!=Yes) {nvcp=&ping; nvnp=&pong;}
	else if (pong.valid==Yes && ping.valid!=Yes) {nvcp=&pong; nvnp=&ping;}
	else nvnew();
}

void updatenv(void)
{
	NV xdata * data nvtp; // temp pointer
	EAI=0; EA=0;
	write_flash_chk(&(nvnp->valid), Yes,FDM);	
	if (nvnp->cpu == 0xff) 			write_flash_chk(&(nvnp->cpu),				(nvcp->cpu),FDM);	
	if (nvnp->hexdlto == 0xff) 	write_flash_chk(&(nvnp->hexdlto),		(nvcp->hexdlto),FDM);	
	if (nvnp->speaker == 0xff) 	write_flash_chk(&(nvnp->speaker),		(nvcp->speaker),FDM);	
	if (nvnp->mem == 0xff) 			write_flash_chk(&(nvnp->mem),				(nvcp->mem),FDM);	
	if (nvnp->memaddrl == 0xff) 	write_flash_chk(&(nvnp->memaddrl),		(nvcp->memaddrl),FDM);
	if (nvnp->memaddrh == 0xff) 	write_flash_chk(&(nvnp->memaddrh),		(nvcp->memaddrh),FDM);
	if (nvnp->forcesecure == 0xff)write_flash_chk(&(nvnp->forcesecure),	(nvcp->forcesecure),FDM);
	if (nvnp->mode == 0xff) 		write_flash_chk(&(nvnp->mode),			(nvcp->mode),FDM);		
	EAI=1; EAI=0; page_erase(nvcp,0xff,FDM);	EAI=1; EA=1;
	nvtp=nvcp;	nvcp=nvnp;	nvnp=nvtp; // pingpong swap, nvcp <-> nvnp	
}

void modeswitch(void)
{
	if (high(k1) && !high(k2) && !high(k3)) {
		EAI=0; EA=0; write_flash_chk(&(nvnp->mode),Bake,FDM);EAI=1; EA=1;
		updatenv();
		beep(500,200); 
	} 
	if (!high(k1) && high(k2) && !high(k3)) {
		EAI=0; EA=0; write_flash_chk(&(nvnp->mode),Program,FDM);EAI=1; EA=1;
		updatenv();
		beep(500,200); 
	} 
	if (nvcp->mode==Bake){ led(GREEN,ON);  led(RED,OFF);}
	if (nvcp->mode==Program)  { led(GREEN,ON); led(RED,ON);}
	nokey();
} 

void main(void)
{
	char sfrinit=START, sfradr, sfrdata;
	unsigned char c;
	initsfr();	
	while(sfrinit!=END){ // 
		sfradr=faddr_data_read(sfrinit++);
		sfrdata=faddr_data_read(sfrinit++);
		if (sfradr!=0xff) {//host initialized 
			sfr_wr(sfradr|0x80,sfrdata);
		} else
			sfrinit=END; // host never init sfr, or END reached
	}
	if (faddr_data_read(2)==0) { // (8002H)==0 => autobaud
		SCON=0;
    	TR2 = 0;
		T2CON=0;
		THL2=0;
		autobaud();
	}
	if (faddr_data_read(3)==0) { // (8003H)==0 => Toggle Test
		while(1) {
				al=c; CP=0; CP=1; id=c;
				CMD0=(c&1)?1:0; CMD1=(c&2)?1:0; CMD2=(c&4)?1:0;
				REQA=(c&1)?1:0; REQS=(c&2)?1:0;
				c++;
		}
	}	
	version(); 
	putstr("H)help\n");
	nvinit();
	c=resetpfpm();
	if(c==0){
		modeswitch();
		cmd_parser(); 
	} else {putstr("Err="); tx_hex(c); cmd_parser();}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -