mirror of
https://github.com/brouhaha/dis6502.git
synced 2024-11-30 10:50:20 +00:00
Add jtab.
This commit is contained in:
parent
7493ac11e0
commit
2857fc340e
5
dis.h
5
dis.h
@ -119,8 +119,9 @@ char *get_name(addr_t loc);
|
|||||||
#define TSTOP 262
|
#define TSTOP 262
|
||||||
#define TRTSTAB 263
|
#define TRTSTAB 263
|
||||||
#define TJTAB2 264
|
#define TJTAB2 264
|
||||||
#define EQS 265
|
#define TJTAB 265
|
||||||
#define OFS 266
|
#define EQS 266
|
||||||
|
#define OFS 267
|
||||||
|
|
||||||
extern FILE *yyin, *yyout;
|
extern FILE *yyin, *yyout;
|
||||||
int lineno;
|
int lineno;
|
||||||
|
2
lex.l
2
lex.l
@ -62,6 +62,8 @@ alphanum [0-9a-zA-Z_]
|
|||||||
|
|
||||||
\.[Jj][Tt][Aa][Bb]2 { return TJTAB2; }
|
\.[Jj][Tt][Aa][Bb]2 { return TJTAB2; }
|
||||||
|
|
||||||
|
\.[Jj][Tt][Aa][Bb] { return TJTAB; }
|
||||||
|
|
||||||
{digit}+ {
|
{digit}+ {
|
||||||
(void)sscanf(yytext, "%d", &token.ival);
|
(void)sscanf(yytext, "%d", &token.ival);
|
||||||
return NUMBER;
|
return NUMBER;
|
||||||
|
37
main.c
37
main.c
@ -45,6 +45,12 @@ int rtstab_addr [RTSTAB_MAX]; /* .rtstab directive */
|
|||||||
int rtstab_size [RTSTAB_MAX];
|
int rtstab_size [RTSTAB_MAX];
|
||||||
int rtstab_count = 0;
|
int rtstab_count = 0;
|
||||||
|
|
||||||
|
#define JTAB_MAX 50
|
||||||
|
|
||||||
|
int jtab_addr [JTAB_MAX]; /* .jtab directive */
|
||||||
|
int jtab_size [JTAB_MAX];
|
||||||
|
int jtab_count = 0;
|
||||||
|
|
||||||
#define JTAB2_MAX 50
|
#define JTAB2_MAX 50
|
||||||
|
|
||||||
int jtab2_addr_low [JTAB2_MAX]; /* .jtab2 directive */
|
int jtab2_addr_low [JTAB2_MAX]; /* .jtab2 directive */
|
||||||
@ -249,6 +255,22 @@ void do_rtstab (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void do_jtab (void)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < jtab_count; i++)
|
||||||
|
{
|
||||||
|
int loc = jtab_addr [i];
|
||||||
|
for (int j = 0; j < jtab_size [i]; j++)
|
||||||
|
{
|
||||||
|
char *trace_sym = (char *) malloc (6);
|
||||||
|
int code = d [loc] + (d [loc + 1] << 8);
|
||||||
|
sprintf (trace_sym, "T%04x", code);
|
||||||
|
start_trace (code, trace_sym);
|
||||||
|
loc += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void do_jtab2 (void)
|
void do_jtab2 (void)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < jtab2_count; i++)
|
for (int i = 0; i < jtab2_count; i++)
|
||||||
@ -302,6 +324,7 @@ int main (int argc, char *argv[])
|
|||||||
|
|
||||||
do_ptrace ();
|
do_ptrace ();
|
||||||
do_rtstab ();
|
do_rtstab ();
|
||||||
|
do_jtab ();
|
||||||
do_jtab2 ();
|
do_jtab2 ();
|
||||||
|
|
||||||
trace_all ();
|
trace_all ();
|
||||||
@ -340,6 +363,20 @@ void get_predef (void)
|
|||||||
rtstab_addr [rtstab_count] = loc;
|
rtstab_addr [rtstab_count] = loc;
|
||||||
rtstab_size [rtstab_count++] = size;
|
rtstab_size [rtstab_count++] = size;
|
||||||
break;
|
break;
|
||||||
|
case TJTAB:
|
||||||
|
if (yylex() != NUMBER)
|
||||||
|
crash(".jtab needs an address operand");
|
||||||
|
loc = token.ival;
|
||||||
|
if (loc > 0x10000 || loc < 0)
|
||||||
|
crash("Number out of range");
|
||||||
|
if (yylex() != ',')
|
||||||
|
crash(".jtab needs a comma");
|
||||||
|
if (yylex() != NUMBER)
|
||||||
|
crash(".jtab needs a comma");
|
||||||
|
size = token.ival;
|
||||||
|
jtab_addr [jtab_count] = loc;
|
||||||
|
jtab_size [jtab_count++] = size;
|
||||||
|
break;
|
||||||
case TJTAB2:
|
case TJTAB2:
|
||||||
if (yylex() != NUMBER)
|
if (yylex() != NUMBER)
|
||||||
crash(".jtab2 needs a number operand");
|
crash(".jtab2 needs a number operand");
|
||||||
|
Loading…
Reference in New Issue
Block a user