583
/* TODO support DTV stack relocation, check memspace handling, move somewhere else */
585
sp = (monitor_cpu_type.mon_register_get_val)(default_memspace, e_SP);
586
for(i = sp + 0x100 + 1; i < 0x1ff; i++) {
587
addr = mon_get_mem_val(default_memspace, i);
588
addr += ((WORD)mon_get_mem_val(default_memspace, (WORD)(i + 1))) << 8;
590
opc = mon_get_mem_val(default_memspace, addr);
591
if(opc == 0x20 /* JSR */) {
592
mon_out("(%d) %04x\n", n, addr);
598
/* TODO move somewhere else */
599
cpuhistory_t cpuhistory[CPUHISTORY_SIZE];
602
void monitor_cpuhistory_store(WORD addr, BYTE op, BYTE p1, BYTE p2)
605
cpuhistory_i &= (CPUHISTORY_SIZE-1);
606
cpuhistory[cpuhistory_i].addr = addr;
607
cpuhistory[cpuhistory_i].op = op;
608
cpuhistory[cpuhistory_i].p1 = p1;
609
cpuhistory[cpuhistory_i].p2 = p2;
612
void mon_cpuhistory(int count)
614
#ifdef FEATURE_CPUMEMHISTORY
615
BYTE op, p1, p2, p3 = 0;
619
const char *dis_inst;
623
if((count<1)||(count>CPUHISTORY_SIZE)) {
624
count = CPUHISTORY_SIZE;
627
pos = (cpuhistory_i + 1 - count) & (CPUHISTORY_SIZE-1);
629
for(i=0; i < count; ++i) {
630
addr = cpuhistory[pos].addr;
631
op = cpuhistory[pos].op;
632
p1 = cpuhistory[pos].p1;
633
p2 = cpuhistory[pos].p2;
635
mem = addr_memspace(addr);
636
loc = addr_location(addr);
638
dis_inst = mon_disassemble_to_string_ex(mem, loc, op, p1, p2, p3, hex_mode,
641
/* Print the disassembled instruction */
642
mon_out(".%s:%04x %s\n", mon_memspace_string[mem], loc, dis_inst);
644
pos = (pos+1) & (CPUHISTORY_SIZE-1);
647
mon_out("Disabled. configure with --enable-memmap and recompile.\n");
652
/* TODO move somewhere else */
659
static void mon_memmap_init(void)
661
#ifdef FEATURE_CPUMEMHISTORY
662
mon_memmap_picx = 0x100;
663
if (machine_class == VICE_MACHINE_C64DTV) {
664
mon_memmap_picy = 0x2000;
666
mon_memmap_picy = 0x100;
668
mon_memmap_size = mon_memmap_picx * mon_memmap_picy;
669
mon_memmap = lib_malloc(mon_memmap_size);
678
void mon_memmap_zap(void)
680
#ifdef FEATURE_CPUMEMHISTORY
681
memset(mon_memmap, 0, mon_memmap_size);
683
mon_out("Disabled. configure with --enable-memmap and recompile.\n");
687
void mon_memmap_show(int mask, MON_ADDR start_addr, MON_ADDR end_addr)
689
#ifdef FEATURE_CPUMEMHISTORY
693
if(machine_class == VICE_MACHINE_C64DTV) {
694
mon_out(" addr: IO ROM RAM\n");
696
mon_out("addr: IO ROM RAM\n");
699
if(start_addr == BAD_ADDR) start_addr = 0;
700
if(end_addr == BAD_ADDR) end_addr = mon_memmap_size-1;
701
if(start_addr>end_addr) start_addr = end_addr;
703
for(i = start_addr; i <= end_addr; ++i) {
705
if ((b & mask)!= 0) {
706
if(machine_class == VICE_MACHINE_C64DTV) {
707
mon_out("%06x: %c%c %c%c%c %c%c%c\n",i,
708
(b&MEMMAP_I_O_R)?'r':'-',
709
(b&MEMMAP_I_O_W)?'w':'-',
710
(b&MEMMAP_ROM_R)?'r':'-',
711
(b&MEMMAP_ROM_W)?'w':'-',
712
(b&MEMMAP_ROM_X)?'x':'-',
713
(b&MEMMAP_RAM_R)?'r':'-',
714
(b&MEMMAP_RAM_W)?'w':'-',
715
(b&MEMMAP_RAM_X)?'x':'-');
717
mon_out("%04x: %c%c %c%c%c %c%c%c\n",i,
718
(b&MEMMAP_I_O_R)?'r':'-',
719
(b&MEMMAP_I_O_W)?'w':'-',
720
(b&MEMMAP_ROM_R)?'r':'-',
721
(b&MEMMAP_ROM_W)?'w':'-',
722
(b&MEMMAP_ROM_X)?'x':'-',
723
(b&MEMMAP_RAM_R)?'r':'-',
724
(b&MEMMAP_RAM_W)?'w':'-',
725
(b&MEMMAP_RAM_X)?'x':'-');
730
mon_out("Disabled. configure with --enable-memmap and recompile.\n");
734
void monitor_memmap_store(unsigned int addr, BYTE type)
736
BYTE op = cpuhistory[cpuhistory_i].op;
738
if (inside_monitor) return;
740
/* Ignore reg_pc+2 reads on branches & JSR
741
and return address read on RTS */
742
if(type & (MEMMAP_ROM_R|MEMMAP_RAM_R)
743
&&(((op & 0x1f) == 0x10)||(op == OP_JSR)
744
||((op == OP_RTS) && ((addr>0x1ff)||(addr<0x100)))))
747
mon_memmap[addr & (mon_memmap_size-1)] |= type;
750
#ifdef FEATURE_CPUMEMHISTORY
751
BYTE mon_memmap_palette[256*3];
753
void mon_memmap_make_palette(void)
756
for(i=0; i<256; ++i) {
757
mon_memmap_palette[i*3+0] = (i&(MEMMAP_RAM_W))?0x80:0+(i&(MEMMAP_ROM_W))?0x60:0+(i&(MEMMAP_I_O_W))?0x1f:0;
758
mon_memmap_palette[i*3+1] = (i&(MEMMAP_RAM_X))?0x80:0+(i&(MEMMAP_ROM_X))?0x60:0+(i&(MEMMAP_I_O_W|MEMMAP_I_O_R))?0x1f:0;
759
mon_memmap_palette[i*3+2] = (i&(MEMMAP_RAM_R))?0x80:0+(i&(MEMMAP_ROM_R))?0x60:0+(i&(MEMMAP_I_O_R))?0x1f:0;
764
void mon_memmap_save(const char* filename, int format)
766
#ifdef FEATURE_CPUMEMHISTORY
786
if(memmap_screenshot_save(drvname, filename, mon_memmap_picx, mon_memmap_picy, mon_memmap, mon_memmap_palette)) {
787
mon_out("Failed.\n");
790
mon_out("Disabled. configure with --enable-memmap and recompile.\n");
794
void mon_screenshot_save(const char* filename, int format)
815
if(screenshot_save(drvname, filename, machine_video_canvas_get(0))) {
816
mon_out("Failed.\n");
820
void mon_show_pwd(void)
822
mon_out("%s\n", ioutil_current_dir());
825
void mon_show_dir(const char *path)
827
struct ioutil_dir_s *dir;
834
mpath=ioutil_current_dir();
836
mon_out("Displaying directory: `%s'\n", mpath);
838
dir = ioutil_opendir(mpath);
840
mon_out("Couldn't open directory.\n");
844
while ( (name = ioutil_readdir(dir)) ) {
845
unsigned int len, isdir;
847
ret = ioutil_stat(name, &len, &isdir);
850
mon_out(" <dir> %s\n", name);
852
mon_out("%10d %s\n", len, name);
854
mon_out("%-20s?????\n", name);
856
ioutil_closedir(dir);
859
void mon_resource_get(const char *name)
861
switch(resources_query_type(name)) {
864
mon_out("%s\n",resources_write_item_to_string(name,""));
867
mon_out("Unknown resource \"%s\".\n",name);
872
void mon_resource_set(const char *name, const char* value)
874
switch(resources_query_type(name)) {
877
if(resources_set_value_string(name,value)) {
878
mon_out("Failed.\n");
883
mon_out("Unknown resource \"%s\".\n",name);
888
void mon_reset_machine(int type)
892
machine_trigger_reset(MACHINE_RESET_MODE_HARD);
899
drivecpu_trigger_reset(type-8);
902
machine_trigger_reset(MACHINE_RESET_MODE_SOFT);
908
void mon_tape_ctrl(int command)
910
if((command<0)||(command>6)) {
911
mon_out("Unknown command.\n");
913
datasette_control(command);
917
void mon_cart_freeze(void)
919
if(mon_cart_cmd.cartridge_trigger_freeze != NULL) {
920
(mon_cart_cmd.cartridge_trigger_freeze)();
922
mon_out("Unsupported.\n");
531
926
/* *** MISC COMMANDS *** */
533
928
void monitor_init(monitor_interface_t *maincpu_interface_init,
604
1012
montor_list_destroy(list);
605
1013
list = list_next;
1015
#ifdef FEATURE_CPUMEMHISTORY
1016
lib_free(mon_memmap);
1020
static int monitor_set_initial_breakpoint(const char *param, void *extra_param)
1024
val = strtoul(param, NULL, 0);
1025
if (val >= 0 && val < 65536)
1026
mon_init_break = val;
1031
static const cmdline_option_t cmdline_options[] = {
1032
{ "-moncommands", CALL_FUNCTION, 1,
1033
set_playback_name, NULL, NULL, NULL,
1034
USE_PARAM_ID, USE_DESCRIPTION_ID,
1035
IDCLS_P_NAME, IDCLS_EXECUTE_MONITOR_FROM_FILE,
1037
{ "-initbreak", CALL_FUNCTION, 1,
1038
monitor_set_initial_breakpoint, NULL, NULL, NULL,
1039
USE_PARAM_ID, USE_DESCRIPTION_ID,
1040
IDCLS_P_VALUE, IDCLS_SET_INITIAL_BREAKPOINT,
1045
int monitor_cmdline_options_init(void)
1047
mon_cart_cmd.cartridge_attach_image = NULL;
1048
mon_cart_cmd.cartridge_detach_image = NULL;
1049
mon_cart_cmd.cartridge_trigger_freeze = NULL;
1050
mon_cart_cmd.cartridge_trigger_freeze_nmi_only = NULL;
1052
return cmdline_register_options(cmdline_options);
609
1055
monitor_interface_t *monitor_interface_new(void)
714
1170
mon_out("Changing to directory: `%s'\n", path);
717
void mon_load_symbols(MEMSPACE mem, const char *filename)
719
/* Switched to a command-line format for the symbol file
720
* so loading just involves "playing back" the commands.
721
* It is no longer possible to just load symbols from a
722
* single memory space.
724
playback_commands(filename);
728
char memspace[MAX_MEMSPACE_NAME_LEN], name[MAX_LABEL_LEN];
731
int rc, line_num = 2;
733
if (NULL == (fp = fopen(filename, MODE_READ))) {
734
mon_out("Loading for `%s' failed.\n", filename);
738
mon_out("Loading symbol table from `%s'...\n", filename);
740
if (mem == e_default_space) {
741
if (fscanf(fp, "%10s\n", name) == 1) {
742
for (mem = FIRST_SPACE; mem <= LAST_SPACE; mem++) {
743
if (strcmp(name, mon_memspace_string[mem]) == 0) {
751
"Bad label file : expecting a memory space in the first line but found %s\n",
758
rc = fscanf(fp, "%6x %255s\n", (int *) &adr, name);
761
"Bad label file: (line %d) cannot parse argument %d.\n",
765
/* FIXME: Check name is a valid label name */
766
name_ptr = (char *)lib_malloc((strlen(name) + 1) * sizeof(char));
767
strcpy(name_ptr, name);
768
mon_out("Read ($%x:%s)\n", adr, name_ptr);
769
mon_add_name_to_symbol_table(new_addr(mem, adr), name_ptr);
778
1173
void mon_save_symbols(MEMSPACE mem, const char *filename)