mame/src/emu/cpu/pic16c62x/dis16c62x.c
Scott Stone b6cd64c7ab "English doesn't borrow from other languages. English follows other languages down dark alleys, knocks them over and goes through their pockets for loose grammar!"
Hand-checked the most popular English word misspellings and made the appropriate changes.  Nearly all of the changes made were in commented areas. (no whatsnew)
2011-08-23 04:59:11 +00:00

137 lines
3.7 KiB
C

/**************************************************************************\
* Microchip PIC16C62X Emulator *
* *
* Based On *
* Microchip PIC16C5X Emulator *
* Copyright Tony La Porta *
* Originally written for the MAME project. *
* *
* *
* Notes : Data is expected to be read from source file as LSB first. *
* *
\**************************************************************************/
#include <stdio.h>
#include <string.h>
#include "16c62xdsm.c"
unsigned char *Buffer;
int main(int argc,char *argv[])
{
int length=0, length_to_dump=0, offset=0, disasm_words=0;
int filelength=0, bytes_read;
int Counter=0;
FILE *F;
char *String_Output;
if(argc<2)
{
printf("\n");
printf("PIC16C5x Disassembler 1.0 by Tony La Porta (C)2003+\n\n");
printf("Usage: dis16c5x <input-file> [ <start-addr> [ <num-of-addr> ] ]\n");
printf(" <input-file> source file data must be MSB first\n");
printf(" <start-addr> starting address to disassemble from (decimal)\n");
printf(" <num-of-addr> number of addresses to disassemble (decimal)\n");
printf(" Precede values with 0x if HEX values preffered\n");
exit(1);
}
if(!(F=fopen(argv[1],"rb")))
{
printf("\n%s: Can't open file %s\n",argv[0],argv[1]);
exit(2);
}
argv++; argc--;
if (argv[1])
{
offset = strtol(argv[1],NULL,0);
argv++; argc--;
}
if (argv[1])
{
length = strtol(argv[1],NULL,0);
argv++; argc--;
}
fseek(F,0, SEEK_END);
filelength = ftell(F);
length *= 2;
if ((length > (filelength - (offset*2))) || (length == 0)) length = filelength - (offset*2);
printf("Length=%04Xh(words) Offset=$%04Xh filelength=%04Xh(words) %04Xh(bytes)\n",length/2,offset,filelength/2,filelength);
length_to_dump = length;
printf("Starting from %d, dumping %d opcodes (word size)\n",offset,length/2);
Buffer = calloc((filelength+1),sizeof(char));
if (Buffer==NULL)
{
printf("Out of Memory !!!");
fclose(F);
exit(3);
}
String_Output = calloc(80,sizeof(char));
if (String_Output==NULL)
{
printf("Out of Memory !!!");
free(Buffer);
fclose(F);
exit(4);
}
if (fseek(F,0,SEEK_SET) != 0)
{
printf("Error seeking to beginning of file\n");
free(String_Output);
free(Buffer);
fclose(F);
exit(5);
}
Counter = offset;
bytes_read = fread(Buffer,sizeof(char),filelength,F);
if (bytes_read >= length)
{
for (; length > 0; length -= (disasm_words*2))
{
int ii;
disasm_words = Dasm16C5x(String_Output,Counter);
printf("$%03X: ",Counter);
for (ii = 0; ii < disasm_words; ii++)
{
if (((Counter*2) + ii) > filelength) /* Past end of length to dump ? */
{
sprintf(String_Output,"???? dw %02.2X%02.2Xh (Past end of disassembly !)",Buffer[((Counter-1)*2)+1],Buffer[((Counter-1)*2)]);
}
else
{
printf("%02.2x%02.2x ",Buffer[(Counter*2)+1],Buffer[(Counter*2)]);
}
Counter++ ;
}
for (; ii < 4; ii++)
{
printf(" ");
}
printf("\t%s\n",String_Output);
}
}
else
{
printf("ERROR length to dump was %d ", length_to_dump/2);
printf(", but bytes read from file were %d\n", bytes_read/2);
free(String_Output);
free(Buffer);
fclose(F);
exit(7);
}
free(String_Output);
free(Buffer);
fclose(F);
return(0);
}