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