mirror of
https://github.com/hoglet67/AtomBusMon.git
synced 2024-12-21 09:29:52 +00:00
6502: Implemented exec command
Change-Id: I6089c925c35ba6141fafc92c48fcb120019ea03d
This commit is contained in:
parent
e8c34bbed7
commit
9434397d32
@ -52,6 +52,7 @@ char *cmdStrings[] = {
|
||||
"fill",
|
||||
#if defined(CPU_6502) || defined(CPU_65C02)
|
||||
"go",
|
||||
"exec",
|
||||
#endif
|
||||
"crc",
|
||||
"copy",
|
||||
@ -103,6 +104,7 @@ void (*cmdFuncs[])(char *params) = {
|
||||
doCmdFill,
|
||||
#if defined(CPU_6502) || defined(CPU_65C02)
|
||||
doCmdGo,
|
||||
doCmdExec,
|
||||
#endif
|
||||
doCmdCrc,
|
||||
doCmdCopy,
|
||||
@ -157,6 +159,7 @@ static const char ARGS12[] PROGMEM = "<start> <end> [ <test num> ]";
|
||||
static const char ARGS13[] PROGMEM = "<start> <end> <to>";
|
||||
static const char ARGS14[] PROGMEM = "[ <value> ]";
|
||||
static const char ARGS15[] PROGMEM = "[ <command> ]";
|
||||
static const char ARGS16[] PROGMEM = "<op1> [ <op2> [ <op3> ] ]";
|
||||
|
||||
static const char * const argsStrings[] PROGMEM = {
|
||||
ARGS00,
|
||||
@ -175,57 +178,59 @@ static const char * const argsStrings[] PROGMEM = {
|
||||
ARGS13,
|
||||
ARGS14,
|
||||
ARGS15,
|
||||
ARGS16
|
||||
};
|
||||
|
||||
// Must be kept in step with cmdStrings (just above)
|
||||
static const uint8_t helpMeta[] PROGMEM = {
|
||||
#if defined(COMMAND_HISTORY)
|
||||
17, 7, // history
|
||||
18, 7, // history
|
||||
#endif
|
||||
16, 15, // help
|
||||
17, 15, // help
|
||||
9, 8, // continue
|
||||
22, 7, // next
|
||||
30, 6, // step
|
||||
25, 7, // regs
|
||||
23, 7, // next
|
||||
31, 6, // step
|
||||
26, 7, // regs
|
||||
12, 10, // dis
|
||||
15, 7, // flush
|
||||
16, 7, // flush
|
||||
13, 11, // fill
|
||||
#if defined(CPU_6502) || defined(CPU_65C02)
|
||||
14, 0, // go
|
||||
15, 16, // exec
|
||||
#endif
|
||||
11, 9, // crc
|
||||
10, 13, // copy
|
||||
8, 13, // compare
|
||||
21, 1, // mem
|
||||
24, 2, // rd
|
||||
39, 3, // wr
|
||||
22, 1, // mem
|
||||
25, 2, // rd
|
||||
40, 3, // wr
|
||||
#if defined(CPU_Z80)
|
||||
19, 1, // io
|
||||
18, 2, // in
|
||||
23, 3, // out
|
||||
20, 1, // io
|
||||
19, 2, // in
|
||||
24, 3, // out
|
||||
#endif
|
||||
31, 12, // test
|
||||
20, 0, // load
|
||||
27, 9, // save
|
||||
29, 7, // srec
|
||||
28, 14, // special
|
||||
26, 7, // reset
|
||||
32, 6, // trace
|
||||
32, 12, // test
|
||||
21, 0, // load
|
||||
28, 9, // save
|
||||
30, 7, // srec
|
||||
29, 14, // special
|
||||
27, 7, // reset
|
||||
33, 6, // trace
|
||||
1, 7, // blist
|
||||
6, 4, // breakx
|
||||
38, 4, // watchx
|
||||
39, 4, // watchx
|
||||
4, 4, // breakr
|
||||
36, 4, // watchr
|
||||
37, 4, // watchr
|
||||
5, 4, // breakw
|
||||
37, 4, // watchw
|
||||
38, 4, // watchw
|
||||
#if defined(CPU_Z80)
|
||||
2, 4, // breaki
|
||||
33, 4, // watchi
|
||||
35, 4, // watchi
|
||||
3, 4, // breako
|
||||
35, 4, // watcho
|
||||
36, 4, // watcho
|
||||
#endif
|
||||
7, 0, // clear
|
||||
33, 5, // trigger
|
||||
34, 5, // trigger
|
||||
0, 0
|
||||
};
|
||||
|
||||
@ -1475,6 +1480,27 @@ void doCmdGo(char *params) {
|
||||
logAddr();
|
||||
}
|
||||
|
||||
void doCmdExec(char *params) {
|
||||
data_t op1 = 0;
|
||||
data_t op2 = 0;
|
||||
data_t op3 = 0;
|
||||
params = parsehex2(params, &op1);
|
||||
params = parsehex2(params, &op2);
|
||||
params = parsehex2(params, &op3);
|
||||
// Read the current PC value
|
||||
addr_t addr = hwRead16(OFFSET_IAL);
|
||||
// Execute the specifed opcode
|
||||
loadData(op1);
|
||||
loadAddr(op2 + (op3 << 8));
|
||||
hwCmd(CMD_EXEC_GO, 0);
|
||||
// JMP back to the original PC value
|
||||
loadData(0x4C);
|
||||
loadAddr(addr);
|
||||
hwCmd(CMD_EXEC_GO, 0);
|
||||
// Log where we are
|
||||
logAddr();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void doCmdCrc(char *params) {
|
||||
|
@ -53,6 +53,7 @@ void doCmdContinue(char *params);
|
||||
void doCmdCopy(char *params);
|
||||
void doCmdCrc(char *params);
|
||||
void doCmdDis(char *params);
|
||||
void doCmdExec(char *params);
|
||||
void doCmdFlush(char *params);
|
||||
void doCmdFill(char *params);
|
||||
void doCmdGo(char *params);
|
||||
|
@ -450,7 +450,7 @@ begin
|
||||
-- 10101 Read IO and Auto Inc Address
|
||||
-- 10110 Write IO
|
||||
-- 10111 Write IO and Auto Inc Address
|
||||
-- 11000 Exec Go
|
||||
-- 11000 Execute 6502 instruction
|
||||
-- 111xx Unused
|
||||
-- 11x1x Unused
|
||||
-- 11xx1 Unused
|
||||
|
@ -114,6 +114,7 @@ architecture behavioral of MOS6502CpuMonCore is
|
||||
|
||||
signal exec : std_logic;
|
||||
signal exec_held : std_logic;
|
||||
signal op3 : std_logic;
|
||||
|
||||
begin
|
||||
|
||||
@ -238,6 +239,31 @@ begin
|
||||
Addr_int(15 downto 0) <= std_logic_vector(cpu_addr_us);
|
||||
end generate;
|
||||
|
||||
-- 00 IMP, INDX, IMP, IMP, ZP, ZP, ZP, IMP, IMP, IMM, IMPA, IMP, ABS, ABS, ABS, IMP,
|
||||
-- 10 BRA, INDY, IND, IMP, ZP, ZPX, ZPX, IMP, IMP, ABSY, IMPA, IMP, ABS, ABSX, ABSX, IMP,
|
||||
-- 20 ABS, INDX, IMP, IMP, ZP, ZP, ZP, IMP, IMP, IMM, IMPA, IMP, ABS, ABS, ABS, IMP,
|
||||
-- 30 BRA, INDY, IND, IMP, ZPX, ZPX, ZPX, IMP, IMP, ABSY, IMPA, IMP, ABSX, ABSX, ABSX, IMP,
|
||||
-- 40 IMP, INDX, IMP, IMP, ZP, ZP, ZP, IMP, IMP, IMM, IMPA, IMP, ABS, ABS, ABS, IMP,
|
||||
-- 50 BRA, INDY, IND, IMP, ZP, ZPX, ZPX, IMP, IMP, ABSY, IMP, IMP, ABS, ABSX, ABSX, IMP,
|
||||
-- 60 IMP, INDX, IMP, IMP, ZP, ZP, ZP, IMP, IMP, IMM, IMPA, IMP, IND16, ABS, ABS, IMP,
|
||||
-- 70 BRA, INDY, IND, IMP, ZPX, ZPX, ZPX, IMP, IMP, ABSY, IMP, IMP, IND1X, ABSX, ABSX, IMP,
|
||||
-- 80 BRA, INDX, IMP, IMP, ZP, ZP, ZP, IMP, IMP, IMM, IMP, IMP, ABS, ABS, ABS, IMP,
|
||||
-- 90 BRA, INDY, IND, IMP, ZPX, ZPX, ZPY, IMP, IMP, ABSY, IMP, IMP, ABS, ABSX, ABSX, IMP,
|
||||
-- A0 IMM, INDX, IMM, IMP, ZP, ZP, ZP, IMP, IMP, IMM, IMP, IMP, ABS, ABS, ABS, IMP,
|
||||
-- B0 BRA, INDY, IND, IMP, ZPX, ZPX, ZPY, IMP, IMP, ABSY, IMP, IMP, ABSX, ABSX, ABSY, IMP,
|
||||
-- C0 IMM, INDX, IMP, IMP, ZP, ZP, ZP, IMP, IMP, IMM, IMP, IMP, ABS, ABS, ABS, IMP,
|
||||
-- D0 BRA, INDY, IND, IMP, ZP, ZPX, ZPX, IMP, IMP, ABSY, IMP, IMP, ABS, ABSX, ABSX, IMP,
|
||||
-- E0 IMM, INDX, IMP, IMP, ZP, ZP, ZP, IMP, IMP, IMM, IMP, IMP, ABS, ABS, ABS, IMP,
|
||||
-- F0 BRA, INDY, IND, IMP, ZP, ZPX, ZPX, IMP, IMP, ABSY, IMP, IMP, ABS, ABSX, ABSX, IMP
|
||||
|
||||
-- Detect forced opcodes that are 3 bytes long
|
||||
op3 <= '1' when memory_dout(7 downto 0) = "00100000" else
|
||||
'1' when memory_dout(4 downto 0) = "11011" else
|
||||
'1' when memory_dout(3 downto 0) = "1100" else
|
||||
'1' when memory_dout(3 downto 0) = "1101" else
|
||||
'1' when memory_dout(3 downto 0) = "1110" else
|
||||
'0';
|
||||
|
||||
Din_int <= memory_dout( 7 downto 0) when state = idle and Sync_int = '1' and exec_held = '1' else
|
||||
memory_addr( 7 downto 0) when state = exec1 else
|
||||
memory_addr(15 downto 8) when state = exec2 else
|
||||
@ -303,7 +329,11 @@ begin
|
||||
state <= nop0;
|
||||
-- exec1 is the LSB of a forced JMP
|
||||
when exec1 =>
|
||||
state <= exec2;
|
||||
if op3 = '1' then
|
||||
state <= exec2;
|
||||
else
|
||||
state <= idle;
|
||||
end if;
|
||||
-- exec2 is the MSB of a forced JMP
|
||||
when exec2 =>
|
||||
state <= idle;
|
||||
@ -333,7 +363,7 @@ begin
|
||||
|
||||
-- Data is captured by the bus monitor on the rising edge of cpu_clk
|
||||
-- that sees done = 1.
|
||||
memory_done <= '1' when state = rd or state = wr or state = exec2 else '0';
|
||||
memory_done <= '1' when state = rd or state = wr or (op3 = '0' and state = exec1) or state = exec2 else '0';
|
||||
|
||||
memory_din <= Din;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user