mirror of
https://github.com/digarok/gsplus.git
synced 2024-11-27 12:50:04 +00:00
Merge branch 'ksherlock-master'
This commit is contained in:
commit
4805720545
43
mini-asm.md
Normal file
43
mini-asm.md
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
GS+ Pro Extreme Max HD Performance Edition includes a sweet-16 mini assembler as well as a 65816 mini assembler.
|
||||||
|
|
||||||
|
## Sweet-16
|
||||||
|
From the Debug shell, enter `!!` to enter the sweet-16 mini asembler.
|
||||||
|
|
||||||
|
Enter `^D` or a blank line to exit back to the debug shell.
|
||||||
|
|
||||||
|
Lines consist of an optional address, an opcode, and operands.
|
||||||
|
|
||||||
|
All numbers are hexadecimal.
|
||||||
|
The `*` operand is the current address/PC. +/- offsets may also be applied.
|
||||||
|
|
||||||
|
Registers are named `R0`-`R15` (decimal). `ACC`, `PC` and `SR` aliases are also valid for `R0`, `R15`, and `R14`, respectively.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
0300: set R1, #0300
|
||||||
|
ld @R1
|
||||||
|
br *-3
|
||||||
|
|
||||||
|
## 65816
|
||||||
|
From the Debug shell, enter `!` to enter the sweet-16 mini asembler.
|
||||||
|
|
||||||
|
Enter `^D` or a blank line to exit back to the debug shell.
|
||||||
|
|
||||||
|
Lines consist of an optional address, an opcode, and operands.
|
||||||
|
|
||||||
|
All numbers are hexadecimal.
|
||||||
|
The `*` operand is the current address/PC. +/- offsets may also be applied.
|
||||||
|
|
||||||
|
The M/X bits are automatically set via `REP`/`SEP` instructions. Additionally, the `long` and `short` directives
|
||||||
|
may be used to set them explicitly.
|
||||||
|
|
||||||
|
long mx
|
||||||
|
short m
|
||||||
|
|
||||||
|
Toolbox, GS/OS, ProDOS-16, and P8 MLI macros are auto generated from the NiftyList.Data file.
|
||||||
|
|
||||||
|
_NewHandle
|
||||||
|
_OpenGS 123456
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -50,7 +50,7 @@ static int g_templates_loaded = 0;
|
|||||||
extern void debug_load_templates(const char *path);
|
extern void debug_load_templates(const char *path);
|
||||||
extern word32 debug_apply_template(word32 address, const char *name);
|
extern word32 debug_apply_template(word32 address, const char *name);
|
||||||
extern void debug_load_nifty(const char *path);
|
extern void debug_load_nifty(const char *path);
|
||||||
extern const char *debug_tool_name(unsigned, unsigned vector);
|
extern const char *debug_tool_name(unsigned number, unsigned vector, unsigned full);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -240,6 +240,57 @@ static void do_handle(word32 value, int action) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
word32 tool_lookup(unsigned tool) {
|
||||||
|
enum {
|
||||||
|
TPtr = 0xe103c0,
|
||||||
|
UTPtr = 0xe103c4,
|
||||||
|
};
|
||||||
|
|
||||||
|
unsigned tn = tool & 0xff;
|
||||||
|
unsigned ix = (tool >> 8) & 0xff;
|
||||||
|
word32 ptr;
|
||||||
|
word32 count;
|
||||||
|
|
||||||
|
ptr = get_memory32_c(TPtr, 0);
|
||||||
|
if (ptr == 0 || ptr > 0xffffff) return 0;
|
||||||
|
|
||||||
|
count = get_memory32_c(ptr, 0);
|
||||||
|
if (count == 0 || count > 255 || count < tn) return 0;
|
||||||
|
ptr = get_memory32_c(ptr + tn * 4, 0);
|
||||||
|
if (ptr == 0 || ptr > 0xffffff) return 0;
|
||||||
|
|
||||||
|
count = get_memory32_c(ptr, 0);
|
||||||
|
if (count == 0 || count > 255) return 0;
|
||||||
|
if (ix && ix > count) return 0;
|
||||||
|
|
||||||
|
/* if ix == 0, list all tool calls in the set */
|
||||||
|
/* otherwise, just the specific tool call */
|
||||||
|
|
||||||
|
/* todo -- also lookup tool name */
|
||||||
|
word32 addr = 0;
|
||||||
|
const char *cp;
|
||||||
|
if (ix) {
|
||||||
|
unsigned n = tn + (ix << 8);
|
||||||
|
addr = get_memory24_c(ptr + ix * 4, 0);
|
||||||
|
if (addr) ++addr;
|
||||||
|
cp = debug_tool_name(n, 0xe10000, 1);
|
||||||
|
if (!cp) cp = "---unknown---";
|
||||||
|
printf("%04x (%06x) %s\n", n, addr, cp);
|
||||||
|
} else {
|
||||||
|
for(ix = 1; ix < count; ++ix) {
|
||||||
|
unsigned n = tn + (ix << 8);
|
||||||
|
|
||||||
|
addr = get_memory24_c(ptr + ix * 4, 0);
|
||||||
|
if (addr) ++addr;
|
||||||
|
cp = debug_tool_name(n, 0xe10000, 1);
|
||||||
|
if (!cp) cp = "---unknown---";
|
||||||
|
printf("%04x (%06x) %s\n", n, addr, cp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
word32 do_hexdump(word32 address, int lines) {
|
word32 do_hexdump(word32 address, int lines) {
|
||||||
static char hex[] = "0123456789abcdef";
|
static char hex[] = "0123456789abcdef";
|
||||||
|
|
||||||
@ -624,7 +675,7 @@ word32 do_list(word32 address, int lines) {
|
|||||||
if (!comment) {
|
if (!comment) {
|
||||||
bank = pc >> 16;
|
bank = pc >> 16;
|
||||||
if (bank == 0xe0 || bank == 0xe1 || bank == 0x01 || bank == 0xff)
|
if (bank == 0xe0 || bank == 0xe1 || bank == 0x01 || bank == 0xff)
|
||||||
comment = debug_tool_name(pc & 0xffff, bank);
|
comment = debug_tool_name(pc & 0xffff, bank, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
@ -640,7 +691,7 @@ word32 do_list(word32 address, int lines) {
|
|||||||
case 0xa2: /* ldx # */
|
case 0xa2: /* ldx # */
|
||||||
if (is_jsl_e10000(address)) {
|
if (is_jsl_e10000(address)) {
|
||||||
/* tool call ... */
|
/* tool call ... */
|
||||||
const char *name = debug_tool_name(operand, 0xe10000);
|
const char *name = debug_tool_name(operand, 0xe10000, 0);
|
||||||
if (name) {
|
if (name) {
|
||||||
opcode_string = name;
|
opcode_string = name;
|
||||||
buffer[0] = 0;
|
buffer[0] = 0;
|
||||||
@ -668,7 +719,7 @@ word32 do_list(word32 address, int lines) {
|
|||||||
if (operand == 0xe100a8) {
|
if (operand == 0xe100a8) {
|
||||||
/* inline GS/OS call? */
|
/* inline GS/OS call? */
|
||||||
unsigned num = get_memory16_c(address, 0);
|
unsigned num = get_memory16_c(address, 0);
|
||||||
const char *name = debug_tool_name(num, operand);
|
const char *name = debug_tool_name(num, operand, 0);
|
||||||
if (name) {
|
if (name) {
|
||||||
comment = NULL;
|
comment = NULL;
|
||||||
opcode_string = name;
|
opcode_string = name;
|
||||||
@ -685,7 +736,7 @@ word32 do_list(word32 address, int lines) {
|
|||||||
ea = (operand | (address & 0xff0000));
|
ea = (operand | (address & 0xff0000));
|
||||||
if (ea == 0x00bf00) {
|
if (ea == 0x00bf00) {
|
||||||
unsigned num = get_memory_c(address, 0);
|
unsigned num = get_memory_c(address, 0);
|
||||||
const char *name = debug_tool_name(num, operand);
|
const char *name = debug_tool_name(num, operand, 0);
|
||||||
if (name) {
|
if (name) {
|
||||||
opcode_string = name;
|
opcode_string = name;
|
||||||
unsigned parms = get_memory16_c(address + 1, 0);
|
unsigned parms = get_memory16_c(address + 1, 0);
|
||||||
@ -1666,6 +1717,11 @@ command:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"t" {
|
||||||
|
g_prev_address = tool_lookup(addr & 0xffff);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
@ -401,6 +401,7 @@ word32 debug_apply_template(word32 address, const char *name) {
|
|||||||
|
|
||||||
struct tool {
|
struct tool {
|
||||||
char *name;
|
char *name;
|
||||||
|
char *fullname;
|
||||||
unsigned number;
|
unsigned number;
|
||||||
unsigned vector;
|
unsigned vector;
|
||||||
};
|
};
|
||||||
@ -426,6 +427,7 @@ static void add_tool(struct tool *t) {
|
|||||||
tools[tool_count++] = *t;
|
tools[tool_count++] = *t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static word32 to_hex(const char *iter, const char *end) {
|
static word32 to_hex(const char *iter, const char *end) {
|
||||||
word32 rv = 0;
|
word32 rv = 0;
|
||||||
while(iter != end) {
|
while(iter != end) {
|
||||||
@ -513,7 +515,7 @@ void debug_load_nifty(const char *path) {
|
|||||||
for (line = 1;;++line) {
|
for (line = 1;;++line) {
|
||||||
const char *start;
|
const char *start;
|
||||||
const char *end;
|
const char *end;
|
||||||
struct tool tool = { 0, 0, vector };
|
struct tool tool = { 0, 0, 0, vector };
|
||||||
|
|
||||||
const char *cp = fgets(buffer, sizeof(buffer), f);
|
const char *cp = fgets(buffer, sizeof(buffer), f);
|
||||||
if (!cp) break;
|
if (!cp) break;
|
||||||
@ -566,12 +568,15 @@ prefix:
|
|||||||
if (end > start) {
|
if (end > start) {
|
||||||
int l = end - start;
|
int l = end - start;
|
||||||
|
|
||||||
|
|
||||||
|
tool.fullname = NULL;
|
||||||
if (vector > 0x0100) {
|
if (vector > 0x0100) {
|
||||||
/* add a leading _ */
|
/* add a leading _ */
|
||||||
tool.name = malloc(l + 2);
|
tool.name = malloc(l + 2);
|
||||||
tool.name[0] = '_';
|
tool.name[0] = '_';
|
||||||
strncpy(tool.name + 1, start, l);
|
strncpy(tool.name + 1, start, l);
|
||||||
tool.name[l + 1] = 0;
|
tool.name[l + 1] = 0;
|
||||||
|
tool.fullname = strdup(start);
|
||||||
}
|
}
|
||||||
else tool.name = strndup(start, l);
|
else tool.name = strndup(start, l);
|
||||||
add_tool(&tool);
|
add_tool(&tool);
|
||||||
@ -606,14 +611,15 @@ prefix:
|
|||||||
qsort(tool_names, tool_name_count, sizeof(struct tool), tool_name_compare);
|
qsort(tool_names, tool_name_count, sizeof(struct tool), tool_name_compare);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *debug_tool_name(unsigned number, unsigned vector) {
|
const char *debug_tool_name(unsigned number, unsigned vector, unsigned full) {
|
||||||
|
|
||||||
if (!tool_count) return NULL;
|
if (!tool_count) return NULL;
|
||||||
|
|
||||||
struct tool tmp = { 0, number, vector };
|
struct tool tmp = { 0, 0, number, vector };
|
||||||
struct tool *t = bsearch(&tmp, tools, tool_count, sizeof(struct tool), tool_compare);
|
struct tool *t = bsearch(&tmp, tools, tool_count, sizeof(struct tool), tool_compare);
|
||||||
if (t) return t->name;
|
if (!t) return NULL;
|
||||||
return NULL;
|
if (full && t->fullname) return t->fullname;
|
||||||
|
return t->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -621,9 +627,8 @@ int lookup_tool_number(const char *name, unsigned vector) {
|
|||||||
|
|
||||||
if (!tool_name_count) return 0;
|
if (!tool_name_count) return 0;
|
||||||
|
|
||||||
struct tool tmp = { (char *)name, 0, vector};
|
struct tool tmp = { (char *)name, 0, 0, vector};
|
||||||
struct tool *t = bsearch(&tmp, tool_names, tool_name_count, sizeof(struct tool), tool_name_compare);
|
struct tool *t = bsearch(&tmp, tool_names, tool_name_count, sizeof(struct tool), tool_name_compare);
|
||||||
if (!t) return 0;
|
if (!t) return 0;
|
||||||
return t->number;
|
return t->number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user