Firmware: reworked 65(c)02 disassembler

Change-Id: Id151d9391e774a18c4b81c377630687820ecbf41
This commit is contained in:
David Banks 2019-11-10 16:18:23 +00:00
parent 726e3f4ffa
commit 0437543149
6 changed files with 213 additions and 95 deletions

View File

@ -1,6 +1,17 @@
#ifndef __ATOMBUSMON_DEFINES__
#define __ATOMBUSMON_DEFINES__
#include <stdio.h>
typedef uint8_t data_t;
typedef uint16_t addr_t;
typedef uint8_t offset_t;
typedef uint16_t modes_t;
typedef uint8_t trigger_t;
typedef uint16_t cmd_t;
typedef uint16_t param_t;
typedef int16_t bknum_t;
#include "status.h"
#include "dis.h"
@ -18,15 +29,6 @@
else __builtin_avr_delay_cycles((unsigned long) ( F_CPU/1000.0 * __ms))
typedef uint8_t data_t;
typedef uint16_t addr_t;
typedef uint8_t offset_t;
typedef uint16_t modes_t;
typedef uint8_t trigger_t;
typedef uint16_t cmd_t;
typedef uint16_t param_t;
typedef int16_t bknum_t;
uint8_t hwRead8(offset_t offset);
uint16_t hwRead16(offset_t offset);

View File

@ -6,6 +6,6 @@
#define PDC_DDR DDRA
#define PDC_DIN PINA
unsigned int disassemble(unsigned int addr);
addr_t disassemble(addr_t addr);
#endif

View File

@ -3,7 +3,7 @@
enum
{
IMP, IMPA, MARK2, BRA, IMM, ZP, ZPX, ZPY, INDX, INDY, IND, MARK3, ABS, ABSX, ABSY, IND16
IMP, IMPA, MARK2, BRA, IMM, ZP, ZPX, ZPY, INDX, INDY, MARK3, ABS, ABSX, ABSY, IND16
};
enum
@ -167,77 +167,116 @@ static const unsigned char dopaddr[256] PROGMEM =
/*F0*/ BRA, INDY, IMP, IMP, ZP, ZPX, ZPX, IMP, IMP, ABSY, IMP, IMP, ABS, ABSX, ABSX, IMP
};
unsigned int disassemble(unsigned int addr)
addr_t disassemble(addr_t addr)
{
unsigned int temp;
unsigned int op = readMemByteInc();
int mode = pgm_read_byte(dopaddr + op);
unsigned int p1 = (mode > MARK2) ? readMemByteInc() : 0;
unsigned int p2 = (mode > MARK3) ? readMemByteInc() : 0;
char buffer[32];
uint8_t temp;
data_t op = readMemByteInc();
data_t p1 = 0;
data_t p2 = 0;
uint8_t mode = pgm_read_byte(dopaddr + op);
char *ptr;
int opIndex = pgm_read_byte(dopname + op) * 3;
log0("%04X : ", addr);
for (temp = 0; temp < 3; temp++) {
log0("%c", pgm_read_byte(opString + opIndex + temp));
// 012345678901234567890123456789
// AAAA : 11 22 33 : III MMMMMMMM
// Template
strfill(buffer, ' ', sizeof(buffer));
buffer[5] = ':';
buffer[16] = ':';
// Address
strhex4(buffer, addr++);
// Hex
strhex2(buffer + 7, op);
if (mode > MARK2) {
p1 = readMemByteInc();
strhex2(buffer + 10, p1);
addr++;
}
log0(" ");
if (mode > MARK3) {
p2 = readMemByteInc();
strhex2(buffer + 13, p2);
addr++;
}
uint16_t opIndex = pgm_read_byte(dopname + op) * 3;
ptr = buffer + 18;
for (temp = 0; temp < 3; temp++) {
*ptr++ = pgm_read_byte(opString + opIndex + temp);
}
ptr++;
switch (mode)
{
case IMP:
log0(" ");
break;
case IMPA:
log0("A ");
*ptr++ = 'A';
break;
case BRA:
temp = addr + 2 + (signed char)p1;
log0("%04X ", temp);
addr++;
ptr = strhex4(ptr, addr + (int8_t)p1);
break;
case IMM:
log0("#%02X ", p1);
addr++;
break;
*ptr++ = '#';
// Fall through to
case ZP:
log0("%02X ", p1);
addr++;
ptr = strhex2(ptr, p1);
break;
case ZPX:
log0("%02X,X ", p1);
addr++;
ptr = strhex2(ptr, p1);
*ptr++ = ',';
*ptr++ = 'X';
break;
case ZPY:
log0("%02X,Y ", p1);
addr++;
ptr = strhex2(ptr, p1);
*ptr++ = ',';
*ptr++ = 'Y';
break;
case INDX:
log0("(%02X,X) ", p1);
addr++;
*ptr++ = '(';
ptr = strhex2(ptr, p1);
*ptr++ = ',';
*ptr++ = 'X';
*ptr++ = ')';
break;
case INDY:
log0("(%02X),Y ", p1);
addr++;
*ptr++ = '(';
ptr = strhex2(ptr, p1);
*ptr++ = ')';
*ptr++ = ',';
*ptr++ = 'Y';
break;
case ABS:
log0("%02X%02X ", p2, p1);
addr += 2;
ptr = strhex2(ptr, p2);
ptr = strhex2(ptr, p1);
break;
case ABSX:
log0("%02X%02X,X ", p2, p1);
addr += 2;
ptr = strhex2(ptr, p2);
ptr = strhex2(ptr, p1);
*ptr++ = ',';
*ptr++ = 'X';
break;
case ABSY:
log0("%02X%02X,Y ", p2, p1);
addr += 2;
ptr = strhex2(ptr, p2);
ptr = strhex2(ptr, p1);
*ptr++ = ',';
*ptr++ = 'Y';
break;
case IND16:
log0("(%02X%02X) ", p2, p1);
addr += 2;
*ptr++ = '(';
ptr = strhex2(ptr, p2);
ptr = strhex2(ptr, p1);
*ptr++ = ')';
break;
}
log0("\n");
addr++;
*ptr++ = '\n';
*ptr++ = '\0';
logs(buffer);
return addr;
}

View File

@ -187,85 +187,129 @@ static const unsigned char dopaddr[256] PROGMEM =
/*F0*/ BRA, INDY, IND, IMP, ZP, ZPX, ZPX, IMP, IMP, ABSY, IMP, IMP, ABS, ABSX, ABSX, IMP
};
unsigned int disassemble(unsigned int addr)
addr_t disassemble(addr_t addr)
{
unsigned int temp;
unsigned int op = readMemByteInc();
int mode = pgm_read_byte(dopaddr + op);
unsigned int p1 = (mode > MARK2) ? readMemByteInc() : 0;
unsigned int p2 = (mode > MARK3) ? readMemByteInc() : 0;
char buffer[32];
uint8_t temp;
data_t op = readMemByteInc();
data_t p1 = 0;
data_t p2 = 0;
uint8_t mode = pgm_read_byte(dopaddr + op);
char *ptr;
int opIndex = pgm_read_byte(dopname + op) * 3;
log0("%04X : ", addr);
for (temp = 0; temp < 3; temp++) {
log0("%c", pgm_read_byte(opString + opIndex + temp));
// 012345678901234567890123456789
// AAAA : 11 22 33 : III MMMMMMMM
// Template
strfill(buffer, ' ', sizeof(buffer));
buffer[5] = ':';
buffer[16] = ':';
// Address
strhex4(buffer, addr++);
// Hex
strhex2(buffer + 7, op);
if (mode > MARK2) {
p1 = readMemByteInc();
strhex2(buffer + 10, p1);
addr++;
}
log0(" ");
if (mode > MARK3) {
p2 = readMemByteInc();
strhex2(buffer + 13, p2);
addr++;
}
uint16_t opIndex = pgm_read_byte(dopname + op) * 3;
ptr = buffer + 18;
for (temp = 0; temp < 3; temp++) {
*ptr++ = pgm_read_byte(opString + opIndex + temp);
}
ptr++;
switch (mode)
{
case IMP:
log0(" ");
break;
case IMPA:
log0("A ");
*ptr++ = 'A';
break;
case BRA:
temp = addr + 2 + (signed char)p1;
log0("%04X ", temp);
addr++;
ptr = strhex4(ptr, addr + (int8_t)p1);
break;
case IMM:
log0("#%02X ", p1);
addr++;
break;
*ptr++ = '#';
// Fall through to
case ZP:
log0("%02X ", p1);
addr++;
ptr = strhex2(ptr, p1);
break;
case ZPX:
log0("%02X,X ", p1);
addr++;
ptr = strhex2(ptr, p1);
*ptr++ = ',';
*ptr++ = 'X';
break;
case ZPY:
log0("%02X,Y ", p1);
addr++;
ptr = strhex2(ptr, p1);
*ptr++ = ',';
*ptr++ = 'Y';
break;
case IND:
log0("(%02X) ", p1);
addr++;
*ptr++ = '(';
ptr = strhex2(ptr, p1);
*ptr++ = ')';
break;
case INDX:
log0("(%02X,X) ", p1);
addr++;
*ptr++ = '(';
ptr = strhex2(ptr, p1);
*ptr++ = ',';
*ptr++ = 'X';
*ptr++ = ')';
break;
case INDY:
log0("(%02X),Y ", p1);
addr++;
*ptr++ = '(';
ptr = strhex2(ptr, p1);
*ptr++ = ')';
*ptr++ = ',';
*ptr++ = 'Y';
break;
case ABS:
log0("%02X%02X ", p2, p1);
addr += 2;
ptr = strhex2(ptr, p2);
ptr = strhex2(ptr, p1);
break;
case ABSX:
log0("%02X%02X,X ", p2, p1);
addr += 2;
ptr = strhex2(ptr, p2);
ptr = strhex2(ptr, p1);
*ptr++ = ',';
*ptr++ = 'X';
break;
case ABSY:
log0("%02X%02X,Y ", p2, p1);
addr += 2;
ptr = strhex2(ptr, p2);
ptr = strhex2(ptr, p1);
*ptr++ = ',';
*ptr++ = 'Y';
break;
case IND16:
log0("(%02X%02X) ", p2, p1);
addr += 2;
*ptr++ = '(';
ptr = strhex2(ptr, p2);
ptr = strhex2(ptr, p1);
*ptr++ = ')';
break;
case IND1X:
log0("(%02X%02X,X)", p2, p1);
addr += 2;
*ptr++ = '(';
ptr = strhex2(ptr, p2);
ptr = strhex2(ptr, p1);
*ptr++ = ',';
*ptr++ = 'X';
*ptr++ = ')';
break;
}
log0("\n");
addr++;
*ptr++ = '\n';
*ptr++ = '\0';
logs(buffer);
return addr;
}

View File

@ -42,14 +42,18 @@ void logpgmstr(const char *s) {
} while (c);
}
void loghex1(uint8_t i) {
char hex1(uint8_t i) {
i &= 0x0f;
if (i < 10) {
i += '0';
} else {
i += ('A' - 10);
}
logc(i);
return i;
}
void loghex1(uint8_t i) {
logc(hex1(i));
}
void loghex2(uint8_t i) {
@ -62,6 +66,30 @@ void loghex4(uint16_t i) {
loghex2(i);
}
char *strfill(char *buffer, char c, uint8_t i) {
while (i-- > 0) {
*buffer++ = c;
}
return buffer;
}
char *strhex1(char *buffer, uint8_t i) {
*buffer++ = hex1(i);
return buffer;
}
char *strhex2(char *buffer, uint8_t i) {
buffer = strhex1(buffer, i >> 4);
buffer = strhex1(buffer, i);
return buffer;
}
char *strhex4(char *buffer, uint16_t i) {
buffer = strhex2(buffer, i >> 8);
buffer = strhex2(buffer, i);
return buffer;
}
//void loglong(long i) {
// char buffer[16];
// // ltoa adds 176 bytes

View File

@ -34,6 +34,11 @@ void logpgmstr(const char *s);
void loghex1(uint8_t i);
void loghex2(uint8_t i);
void loghex4(uint16_t i);
char *strfill(char *buffer, char c, uint8_t i);
char *strhex1(char *buffer, uint8_t i);
char *strhex2(char *buffer, uint8_t i);
char *strhex4(char *buffer, uint16_t i);
//void loglong(long i);
//void logint(int i);