📄 e2emu.c
字号:
#include "REG1210.H"
#define OneMsConst (1843-1)
#define OneUsConst (2-1)
//#define OneMsConst (22118-1)
//#define OneUsConst (22-1)
#define FDM 1 // Flash Data Memory
#define FPM 0 // Flash Program Memory
#define CR 0x0a
#define LF 0x0d
#define BS 0x08
extern void autobaud(void);
extern char faddr_data_read(char);
extern void put_string(char code *string);
extern void putcr(void);
extern void tx_byte(char);
extern char rx_byte_echo(void);
extern char page_erase (int faddr, char fdata, char fdm);
extern char write_flash_chk (int faddr, char fdata, char fdm);
sbit P17 = P1^7;
char rmw(unsigned char faddr, unsigned char fdata) //read-modify-write FDM
{ unsigned char i,c;
unsigned char xdata * ptr;
unsigned char xdata * bufptr;
P17=!P17;
page_erase(0x0400, 0xff, FDM); // temp buf 0x400~0x047f
P17=!P17;
ptr = 0x0480; // source page begin adr
bufptr=0x0400;
// backup target page to temp buf
for (i=0; i<128; i++) write_flash_chk(bufptr++,*ptr++,FDM);
P17=!P17;
page_erase(0x0480, 0xff, FDM); // erase destination page
P17=!P17;
write_flash_chk((unsigned int)(0x0480+faddr),fdata,FDM);
bufptr=0x0400; // source page
ptr= 0x0480; // destination page
for (i=0; i<128; i++) {
if (i==faddr)c=fdata; else c=*bufptr;
write_flash_chk((unsigned int)(0x0480+i),c,FDM);
bufptr++;
}
P17=!P17;
}
void main(void)
{
unsigned char xdata * msgptr;
unsigned char xdata * ptr;
char i,c, cursor_ptr;
CKCON &= 0xf8; // 0 MOVX cycle stretch
PDCON &= 0x0ed; //turn on tone gen & sys timer
//Flash Related Timer Setup
USEC = OneUsConst;
MSEC = OneMsConst;
FTCON=0xa5;
T2CON = 0x34; // T2 as baudrate generator
RCAP2 = 65535; // 57600 Baud @ 1.8432MHz
// RCAP2 = 65524; // 57600 Baud @ 22.1184MHz
SCON = 0x52; // Async mode 1, 8-bit UART, enable rcvr, TI=1, RI=0
put_string("\x1b[46;37m\x1b[25C\x1b[2JMSC1210 E2PROM Emulation\nAny key to start:");
while(RI==0) {;} // get a key
RI=0;
put_string("\x1b[2;1HInput message: ");
msgptr=0x0480;
while(1) {
ptr=msgptr;
put_string("\x1b[3;1H'"); //set cursor
for (i=0; i<128; i++) tx_byte(*ptr++);
put_string("'\x1b[2;15H");
while(RI==0) {;} // get a key
c=rx_byte_echo();
if (c==CR || c==LF) cursor_ptr=0;
else if (c==BS) {cursor_ptr--; rmw(cursor_ptr,' ');}
else rmw(cursor_ptr++,c);
if (cursor_ptr<0) cursor_ptr=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -