📄 mvp.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 + -