This is mon.h in view mode; [Download] [Up]
/*
* mon.h - The VICE built-in monitor.
*
* Written by
* Daniel Sladic (sladic@eecg.toronto.edu)
* Ettore Perazzoli (ettore@comm2000.it)
*
* This file is part of VICE, the Versatile Commodore Emulator.
* See README for copyright notice.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
* 02111-1307 USA.
*
*/
#ifndef _MON_H
#define _MON_H
#include <stdio.h>
#include <assert.h>
#include "mos6510.h"
#include "mem.h"
#include "interrupt.h"
/* Types */
typedef int bool;
struct mon_cmds {
const char *str;
const char *abbrev;
int token;
int next_state;
const char *param_names;
const char *description;
};
enum mon_int {
MI_NONE = 0,
MI_BREAK = 1 << 0,
MI_WATCH = 1 << 1,
MI_STEP = 1 << 2,
};
enum t_reg_id {
e_A,
e_X,
e_Y,
e_PC,
e_SP
};
typedef enum t_reg_id REG_ID;
enum t_memory_op {
e_load,
e_store,
e_load_store
};
typedef enum t_memory_op MEMORY_OP;
enum t_memspace {
e_default_space = 0,
e_comp_space,
e_disk_space,
e_invalid_space
};
typedef enum t_memspace MEMSPACE;
typedef unsigned int MON_ADDR;
typedef unsigned int MON_REG;
enum t_conditional {
e_INV,
e_EQU,
e_NEQ,
e_GT,
e_LT,
e_GTE,
e_LTE,
e_AND,
e_OR
};
typedef enum t_conditional CONDITIONAL;
enum t_radixtype {
e_default_radix,
e_hexadecimal,
e_decimal,
e_octal,
e_binary
};
typedef enum t_radixtype RADIXTYPE;
enum t_action {
e_ON,
e_OFF,
e_TOGGLE
};
typedef enum t_action ACTION;
struct t_cond_node {
int operation;
int value;
MON_REG reg_num;
bool is_reg;
bool is_parenthized;
struct t_cond_node *child1;
struct t_cond_node *child2;
};
typedef struct t_cond_node CONDITIONAL_NODE;
struct t_breakpoint {
int brknum;
MON_ADDR start_addr;
MON_ADDR end_addr;
bool trace;
bool enabled;
bool watch_load;
bool watch_store;
int hit_count;
int ignore_count;
CONDITIONAL_NODE *condition;
char *command;
};
typedef struct t_breakpoint breakpoint;
struct t_break_list {
breakpoint *brkpt;
struct t_break_list *next;
};
typedef struct t_break_list BREAK_LIST;
typedef void monitor_toggle_func_t(int value);
/* This is the standard interface through which the monitor accesses a
certain CPU. */
struct monitor_interface {
/* Pointer to the registers of the CPU. */
mos6510_regs_t *cpu_regs;
/* Pointer to the alarm/interrupt status. */
cpu_int_status_t *int_status;
/* Pointer to the machine's clock counter. */
CLOCK *clk;
/* Pointer to a function that writes to memory. */
read_func_t *read_func;
/* Pointer to a function that reads from memory. */
store_func_t *store_func;
/* Pointer to a function to disable/enable watchpoint checking. */
monitor_toggle_func_t *toggle_watchpoints_func;
};
typedef struct monitor_interface monitor_interface_t;
/* Defines */
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define HI16(x) ((x)&0xffff0000)
#define LO16(x) ((x)&0xffff)
#define LO16_TO_HI16(x) (((x)&0xffff)<<16)
#define HI16_TO_LO16(x) (((x)>>16)&0xffff)
#define STATE_INITIAL 0
#define STATE_FNAME 1
#define STATE_REG_ASGN 2
#define STATE_ROL 3
#define FIRST_SPACE e_comp_space
#define LAST_SPACE e_disk_space
#define NUM_MEMSPACES 3
#define DEFAULT_DISASSEMBLY_SIZE 40
#define check_breakpoints(mem, addr) mon_check_checkpoint(mem, addr, breakpoints[mem])
#define any_breakpoints(mem) (breakpoints[(mem)] != NULL)
#define any_watchpoints_load(mem) (watchpoints_load[(mem)] != NULL)
#define any_watchpoints_store(mem) (watchpoints_store[(mem)] != NULL)
#define any_watchpoints(mem) (watchpoints_load[(mem)] || watchpoints_store[(mem)])
#define new_cond ((CONDITIONAL_NODE *)(xmalloc(sizeof(CONDITIONAL_NODE))))
#define addr_memspace(ma) (HI16_TO_LO16(ma))
#define addr_location(ma) (LO16(ma))
#define new_addr(m, l) (LO16_TO_HI16(m) | (l))
#define new_reg(m, r) (LO16_TO_HI16(m) | (r))
#define reg_memspace(mr) (HI16_TO_LO16(mr))
#define reg_regid(mr) (LO16(mr))
/* Global variables */
extern const char *_mon_space_strings[];
extern char *register_string[];
extern struct mon_cmds mon_cmd_array[];
extern char *memspace_string[];
extern FILE *mon_output;
extern int sidefx;
extern int exit_mon;
extern RADIXTYPE default_radix;
extern MEMSPACE default_memspace;
extern bool asm_mode;
extern MEMSPACE caller_space;
extern unsigned mon_mask[NUM_MEMSPACES];
extern char *playback_name;
extern bool playback;
extern BREAK_LIST *breakpoints[NUM_MEMSPACES];
extern BREAK_LIST *watchpoints_load[NUM_MEMSPACES];
extern BREAK_LIST *watchpoints_store[NUM_MEMSPACES];
/* Function declarations */
extern void monitor_init(monitor_interface_t *maincpu_interface,
monitor_interface_t *true1541_interface_init);
extern bool mon_force_import(MEMSPACE mem);
extern void mon_check_icount(ADDRESS a);
extern void mon_check_watchpoints(ADDRESS a);
extern void mon(ADDRESS a);
extern void mon_add_number_to_buffer(int number);
extern void mon_add_string_to_buffer(char *str);
extern int mon_cmd_lookup_index(char *str);
extern int mon_cmd_get_token(int index);
extern int mon_cmd_get_next_state(int index);
extern void mon_start_assemble_mode(MON_ADDR addr, char *asm_line);
extern void mon_disassemble_lines(MON_ADDR start_addr, MON_ADDR end_addr);
extern int mon_assemble_instr(char *opcode_name, unsigned operand);
extern void mon_display_memory(int radix_type, MON_ADDR start_addr, MON_ADDR end_addr);
extern void mon_display_data(MON_ADDR start_addr, MON_ADDR end_addr, int x, int y);
extern void mon_move_memory(MON_ADDR start_addr, MON_ADDR end_addr, MON_ADDR dest);
extern void mon_compare_memory(MON_ADDR start_addr, MON_ADDR end_addr, MON_ADDR dest);
extern void mon_fill_memory(MON_ADDR start_addr, MON_ADDR end_addr, unsigned char *data);
extern void mon_hunt_memory(MON_ADDR start_addr, MON_ADDR end_addr, unsigned char *data);
extern void mon_load_file(char *filename, MON_ADDR start_addr);
extern void mon_save_file(char *filename, MON_ADDR start_addr, MON_ADDR end_addr);
extern void mon_verify_file(char *filename, MON_ADDR start_addr);
extern void mon_instructions_step(int count);
extern void mon_instructions_next(int count);
extern void mon_instruction_return(void);
extern void mon_stack_up(int count);
extern void mon_stack_down(int count);
extern void mon_block_cmd(int op, int track, int sector, MON_ADDR addr);
extern void mon_print_convert(int val);
extern void mon_change_dir(char *path);
extern void mon_execute_disk_command(char *cmd);
extern void mon_print_help(char *cmd);
extern unsigned int mon_get_reg_val(MEMSPACE mem, REG_ID reg_id);
extern void mon_set_reg_val(MEMSPACE mem, REG_ID reg_id, WORD val);
extern void mon_print_registers(MEMSPACE mem);
extern void mon_jump(MON_ADDR addr);
extern char *mon_symbol_table_lookup_name(MEMSPACE mem, ADDRESS addr);
extern int mon_symbol_table_lookup_addr(MEMSPACE mem, char *name);
extern void mon_add_name_to_symbol_table(MON_ADDR addr, char *name);
extern void mon_remove_name_from_symbol_table(MEMSPACE mem, char *name);
extern void mon_print_symbol_table(MEMSPACE mem);
extern void mon_load_symbols(MEMSPACE mem, char *filename);
extern void mon_save_symbols(MEMSPACE mem, char *filename);
extern void mon_record_commands(char *filename);
extern void mon_end_recording(void);
extern int mon_check_checkpoint(MEMSPACE mem, ADDRESS addr, BREAK_LIST *list);
extern int mon_add_checkpoint(MON_ADDR start_addr, MON_ADDR end_addr, bool is_trace, bool is_load, bool is_store);
extern void mon_delete_checkpoint(int brknum);
extern void mon_print_checkpoints(void);
extern void mon_switch_checkpoint(int op, int breakpt_num);
extern void mon_set_ignore_count(int breakpt_num, int count);
extern void mon_set_checkpoint_condition(int brk_num, CONDITIONAL_NODE *cnode);
extern void mon_set_checkpoint_command(int brk_num, char *cmd);
extern void mon_watch_push_load_addr(ADDRESS addr, MEMSPACE mem);
extern void mon_watch_push_store_addr(ADDRESS addr, MEMSPACE mem);
#endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.