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

📄 monitor.cc

📁 AVR 单片机程序设计用到的模拟器
💻 CC
字号:
/* $Id: Monitor.cc,v 1.9 2000/10/01 17:00:42 pure Exp $ */#include "Monitor.h"#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>Monitor::Monitor(Server& _server, unsigned ramsize, unsigned romsize, 		 unsigned model, unsigned mhz) : server(_server),AVR_BDM(ramsize, romsize, model, mhz){}Monitor::~Monitor(){}bool Monitor::readline(char* line, int max){	char* p = line;	while (1) {		unsigned char ch;		if (read(server.fd(), &ch, 1) != 1) {			return false;		}		switch (ch) {		case 0x3: 			*line = 0;			return true;		case 0xa:		case 0xd:			*p = 0;			return true;		}		*p++ = ch;		if (p >= line+max-1) {			*p = 0;			return true;		}	}}unsigned Monitor::gethex(const char* p, int n){	unsigned r = 0;	while (n--) {		unsigned q = *p++;				r = r*16;		if (q >= '0' && q <= '9') q = q - '0';		else if (q >= 'A' && q <= 'F') q = q - 'A' + 10;		else q = 0;		r += q;	}	return r;}void Monitor::cmd_show_registers(){	for (int i = 0; i < 32; i++) {		server << "r" << dec << i << "=" << setw(2) << setfill('0') << hex << reg(i) << ' ';		if ((i+1) % 8 == 0) server << endl;	}		server << "X=" << setw(4) << setfill('0') << hex << reg("X") << ' ';	server << "Y=" << setw(4) << setfill('0') << hex << reg("Y") << ' ';	server << "Z=" << setw(4) << setfill('0') << hex << reg("Z") << endl;	int sreg = reg("SREG");	server << "SREG=" << setw(2) << setfill('0') << hex << sreg << ' ';	server << "C=" << !!(sreg&1) << ' ';	server << "Z=" << !!(sreg&2) << ' ';	server << "N=" << !!(sreg&4) << ' ';	server << "V=" << !!(sreg&8) << ' ';	server << "S=" << !!(sreg&16) << ' ';	server << "H=" << !!(sreg&32) << ' ';	server << "T=" << !!(sreg&64) << ' ';	server << "I=" << !!(sreg&128) << ' ';	server << endl;	server << "PC=" << setw(5) << setfill('0') << hex << reg("PC")*2 << ' ';	server << "SP=" << setw(4) << setfill('0') << hex << reg("SP") << ' ';	server << "FP=" << setw(4) << setfill('0') << hex << reg("Y") << endl;}void Monitor::cmd_set_register(char* regname, int value){	server << regname << " " << value << endl;}void Monitor::cmd_read_memory(int addr, int count){	server << "0x" << setw(4) << setfill('0') << hex << addr;	if ((addr & 0x800000) == 0) { /* .text */	    	while (count--) {			server << " 0x" << hex << (int)ROM.readb(addr++);		}	} else {		while (count--) {			server << " 0x" << hex << (int)RAM.readb((addr++) & 0x7ffff);		}	}	server << endl;}void Monitor::cmd_write_memory(int addr, int value){	if ((addr & 0x800000) == 0) /* .text */	        ROM.writeb(addr, value);	else	    	RAM.writeb(addr & 0x7ffff, value);}void Monitor::cmd_step(){	singlestep();}void Monitor::cmd_run(){	run();}void Monitor::cmd_setbp(int addr){	setbp(addr);}void Monitor::cmd_clearbp(int addr){	clearbp(addr);}void Monitor::cmd_load(){	server << endl;	int address = 0;				while (1) {		char line[200];		readline(line, sizeof(line));		if (!*line) return;		const char* p = line;		if (*p != 'S') {			cerr << "Error: SREC expected" << endl;			return;		}		p++;		int type = gethex(p,1);		p++;		int len = gethex(p, 2);		if (len == 0) {			return;		}		p += 2;		int crc;		for (int i = 0, crc = len; i < len; i++) {			crc += gethex(p,2);			p += 2;		}		if (crc & 0xff != 0xff) {			cerr << "Error: SRC crc failure" << endl;			return;		}		p = line + 4;		len--; // strip CRC		switch (type) {		case 0: //cerr << "Warning: SREC ignored (" << line << ")" << endl;			continue; 		case 1: p+= 4; len -= 2; break;		case 2: p+= 6; len -= 3; break;		case 3: p+= 8; len -= 4; break;		case 4:		case 5:		case 6: return; /* termination record */		}		while (len--) {		        int value = gethex(p,2);			p += 2;			ROM.writeb(address++, value);		}			}}		int Monitor::waitcmd(char* cmd, int& arg1, int& arg2){	char line[200];	while (1) {		readline(line, sizeof(line));		server << line << '\n';		server.flush();		if (!*line) {			server << "db>";			server.flush();		} else break;	}	//cout << line << endl;		char str[20];	int n;	n = sscanf((const char*)line, "%s %i %i", cmd, &arg1, &arg2);	return n;}void Monitor::prompt(){	server << "db>"	;	server.flush();}void Monitor::main(){	while(1) {		char cmd[20];		int n, address, data;				n = waitcmd(cmd, address, data);				if ((cmd == "Q") && (n == 1)) {			return;		} else if (!strcmp(cmd, "R") && (n == 1)) {			cmd_show_registers();			prompt();		} else if (!strcmp(cmd, "r") && (n >= 2)) {			cmd_read_memory(address, n == 3 ? data : 1);			prompt();		} else if (!strcmp(cmd, "w") && (n == 3)) {			cmd_write_memory(address, data);			prompt();		} else if (!strcmp(cmd, "bp") && (n == 2)) {			cmd_setbp(address);			prompt();		} else if (!strcmp(cmd, "bc") && (n == 2)) {			cmd_clearbp(address);			prompt();		} else if (!strcmp(cmd, "q") && (n == 1)) {			cmd_run();		} else if (!strcmp(cmd, "n") && (n == 1)) {			cmd_step();			prompt();		} else if (!strcmp(cmd, "u") && (n == 1)) {			cmd_load();			prompt();		} else if (n == 1) {			char *p = strchr(cmd, '=');			if (p) {				*p++ = 0;				reg((const char *)cmd, atoi(p));			}			prompt();		}	}}		

⌨️ 快捷键说明

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