📄 parse.c
字号:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include "jtag.h"
#include "debug.h"
#include "memory.h"
#include "regs.h"
char previous_command_line[128] = "";
unsigned long hex_to_num(char * value)
{
int temp;
unsigned long number;
unsigned base = 16;
number = 0;
for (temp=0; temp < strlen(value); temp ++) {
if (value[temp] < 58 && value[temp] > 47)
/* number */
number = (number * base) + (value[temp] - 48);
else if (value[temp] < 103 && value[temp] > 96)
/* letter */
number = (number * base) + (value[temp] - 97 + 10);
else if (value[temp] == 43) {
number = 0;
base = 10;
} else
/* illegal character */
return(number);
}
return(number);
}
int parse_script(void)
{
FILE * script_file;
char script_line[128];
char * value;
value = strtok(NULL, " ");
if (value == 0) {
printf("Usage: script <file_name>\n");
return(1);
}
script_file = fopen(value, "r");
if (script_file == 0) {
printf("Error opening script file : %s\n", value);
return(1);
}
while (fgets(script_line, sizeof(script_line), script_file)) {
if(parse_main(script_line)) {
printf("Abborted - Error running:\n%s\n", script_line);
break;
}
}
fclose(script_file);
/* rebuild previous_command_line */
strcpy(previous_command_line, "script ");
strcat(previous_command_line, value);
return(0);
}
int parse_echo(void)
{
char * value;
value = strtok(NULL, " ");
while (value ) {
printf("%s ", value);
value = strtok(NULL, " ");
}
printf("\n");
return(0);
}
int parse_pause(void)
{
char * value;
unsigned long snooze;
value = strtok(NULL, " ");
if (value ) {
snooze = hex_to_num(value);
printf("Pausing for 0x%8.8X seconds\n", snooze);
sleep(snooze);
}
return(0);
}
int parse_poke(void)
{
unsigned long address;
unsigned long data;
unsigned long length = 1;
char * value;
value = strtok(NULL, " ");
if (value == 0) {
printf("Usage: poke <address> <data> [<length>]\n");
return(1);
}
address = hex_to_num(value);
value = strtok(NULL, " ");
if (value == 0) {
printf("Usage: poke <address> <data> [<length>]\n");
return(1);
}
data = hex_to_num(value);
value = strtok(NULL, " ");
if (value != 0)
length = hex_to_num(value);
memory_poke(address, data, length);
return(0);
}
int parse_peek(void)
{
char * value;
unsigned long address;
unsigned long data = 0;
value = strtok(NULL, " ");
if (value == 0) {
printf("Usage: peek <address>\n");
return(1);
}
address = hex_to_num(value);
memory_peek(address, &data);
return(0);
}
int parse_load(void)
{
char * value;
FILE * data_file;
unsigned long address;
unsigned long * data;
unsigned long * data_start;
unsigned long length;
unsigned long temp;
unsigned long temp2;
unsigned char data_byte;
unsigned char data_ended = 0;
value = strtok(NULL, " ");
if (value == 0) {
printf("Usage: load <file_name> <address> [<length>]\n");
return(1);
}
data_file = fopen(value, "rb");
if (data_file == 0) {
printf("Error opening file : %s\n", value);
return(1);
}
value = strtok(NULL, " ");
if (value == 0) {
printf("Usage: load <file_name> <address> [<length>]\n");
return(1);
}
address = hex_to_num(value);
value = strtok(NULL, " ");
if (value != 0)
/* length in long words */
length = hex_to_num(value)/4;
else
/* do whole file */
length = 0xFFFFFFFF;
data_start = malloc(1024 * sizeof(unsigned long));
if (data_start == NULL) {
printf("Unable to allocate temporary storage\n");
fclose(data_file);
return(1);
}
data = data_start;
while (length) {
for (temp = 0; temp < 1024; temp++) {
*data = 0;
/* read in bytes convert to long words */
for (temp2 = 0; temp2 < 4; temp2++) {
#if 1
if (fread(&data_byte, sizeof(data_byte), 1, data_file) == 0) {
data_ended = (unsigned char) EOF;
break;
}
#else
data_byte = fgetc(data_file);
if (data_byte == (unsigned char)EOF)
break;
#endif
*data = (*data >> 8) + (data_byte << 24);
}
if (data_ended == (unsigned char)EOF) {
length = temp + 1;
break;
}
data++;
}
if (length < 1024 ) {
memory_write(address, data_start, length);
length = 0;
} else {
memory_write(address, data_start, temp);
address = address + 4096;
length = length - 1024;
data = data_start;
}
}
fclose(data_file);
free(data_start);
return(0);
}
int parse_run(void)
{
char * value;
value = strtok(NULL, " ");
if (value == 0) {
printf("Usage: run <address>\n");
return(1);
}
arm_regs.pc = hex_to_num(value);
debug_restart();
return(0);
}
int parse_regs(void)
{
int reg;
unsigned long data;
char * value;
value = strtok(NULL, " ");
if (value == 0) {
regs_print();
return(0);
}
/* ok trying to set a register value */
reg = (int) hex_to_num(value);
value = strtok(NULL, " ");
if (value == 0) {
printf("Usage: regs [<reg> <value>]\n");
return(1);
}
data = hex_to_num(value);
regs_set(reg, data);
#if 0
regs_write();
regs_read();
#endif
regs_print();
return(0);
}
int parse_main(char * command_line)
{
char * command;
if (*command_line == '.')
strcpy(command_line, previous_command_line);
else
strcpy(previous_command_line, command_line);
/* strip off \n and get commmand head */
command = strtok(command_line, "\n");
command = strtok(command, " ");
if (command) {
/* basic commands */
if (strcmp(command, "#") == 0)
return(0);
if (strcmp(command, "script") == 0)
return(parse_script());
if (strcmp(command, "echo") == 0)
return(parse_echo());
if (strcmp(command, "pause") == 0)
return(parse_pause());
/* jtag commands */
if (strcmp(command, "jtag") == 0)
return(jtag_reset());
if (strcmp(command, "idcode") == 0)
return(jtag_idcode());
if (strcmp(command, "quit") == 0)
exit(0);
/* debug commands */
if (strcmp(command,"poll") == 0)
return(debug_poll());
if (strcmp(command,"halt") == 0)
return(debug_halt());
if (strcmp(command,"restart") == 0)
return(debug_restart());
if (strcmp(command,"run") == 0)
return(parse_run());
/* memory commands */
if (strcmp(command, "poke") == 0)
return(parse_poke());
if (strcmp(command, "peek") == 0)
return(parse_peek());
if (strcmp(command, "load") == 0)
return(parse_load());
/* register commands */
if (strcmp(command, "regs") == 0)
return(parse_regs());
printf("Unknown command: %s\n", command);
}
return(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -