Author: greatlrd Date: Sun Dec 31 17:59:07 2006 New Revision: 25251
URL: http://svn.reactos.org/svn/reactos?rev=25251&view=rev Log: initate work of a CPUtranslator, example M68k to Intel. it is writen so not only M68k can be added. it does not work at all. it is a ground layout how I should code it.
Added: trunk/rosapps/devutils/cputointel/ trunk/rosapps/devutils/cputointel/CpuToIntel.c (with props) trunk/rosapps/devutils/cputointel/cputointel.rbuild (with props) trunk/rosapps/devutils/cputointel/m68k/ trunk/rosapps/devutils/cputointel/m68k/M68kBrain.c (with props) trunk/rosapps/devutils/cputointel/m68k/M68kBrain.h (with props) trunk/rosapps/devutils/cputointel/m68k/M68kopcode.c (with props) trunk/rosapps/devutils/cputointel/m68k/m68k.h (with props) trunk/rosapps/devutils/cputointel/misc.c (with props) trunk/rosapps/devutils/cputointel/misc.h (with props)
Added: trunk/rosapps/devutils/cputointel/CpuToIntel.c URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/devutils/cputointel/CpuToIn... ============================================================================== --- trunk/rosapps/devutils/cputointel/CpuToIntel.c (added) +++ trunk/rosapps/devutils/cputointel/CpuToIntel.c Sun Dec 31 17:59:07 2006 @@ -1,0 +1,27 @@ + + +#include <stdio.h> +#include "m68k/m68k.h" +#include "misc.h" + +int main(int argc, char * argv[]) +{ + printf("Usage :\n"); + printf(" -cpu m68000 : convert motorala 68000/68008 to intel asm \n"); + printf(" -cpu m68010 : convert motorala 68010 to intel asm \n"); + printf(" -cpu m68020 : convert motorala 68020 to intel asm \n"); + printf(" -cpu m68030 : convert motorala 68030 to intel asm \n"); + printf(" -cpu m68040 : convert motorala 68040 to intel asm \n"); + printf("--------------------------------------------------------------\n"); + printf(" -inBin filename : the bin file you whant convert\n"); + printf(" -OutAsm filename : the Asm file you whant create\n"); + printf("--------------------------------------------------------------\n"); + printf("More cpu will be added with the time or options, this is \n"); + printf("version 0.0.1 of the cpu to intel converter writen by \n"); + printf("Magnus Olsen (magnus@greatlord.com), it does not do anything \n"); + printf("yet, more that basic desgin how it should be writen. \n"); + printf("Copyright 2006 by Magnus Olsen, licen under GPL 2.0 for now. \n"); + + return 0; +} +
Propchange: trunk/rosapps/devutils/cputointel/CpuToIntel.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/devutils/cputointel/cputointel.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/devutils/cputointel/cputoin... ============================================================================== --- trunk/rosapps/devutils/cputointel/cputointel.rbuild (added) +++ trunk/rosapps/devutils/cputointel/cputointel.rbuild Sun Dec 31 17:59:07 2006 @@ -1,0 +1,15 @@ +<module name="cputointel" type="win32cui" installbase="system32" installname="cputointel.exe" stdlib="host"> + <include base="cputointel">.</include> + <define name="__USE_W32API" /> + <define name="_WIN32_IE">0x0501</define> + <define name="_WIN32_WINNT">0x0501</define> + <library>kernel32</library> + <library>user32</library> + + <file>CpuToIntel.c</file> + <file>misc.c</file> + + <file>m68k/M68kBrain.c</file> + <file>m68k/M68kopcode.c</file> + +</module>
Propchange: trunk/rosapps/devutils/cputointel/cputointel.rbuild ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/devutils/cputointel/m68k/M68kBrain.c URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/devutils/cputointel/m68k/M6... ============================================================================== --- trunk/rosapps/devutils/cputointel/m68k/M68kBrain.c (added) +++ trunk/rosapps/devutils/cputointel/m68k/M68kBrain.c Sun Dec 31 17:59:07 2006 @@ -1,0 +1,209 @@ + +#include <stdio.h> +#include <stdlib.h> +#include "M68kBrain.h" +#include "m68k.h" +#include "../misc.h" + +/* retun + * 0 = Ok + * 1 = unimplemt + * 2 = Unkonwn Opcode + * 3 = can not open read file + * 4 = can not open write file + * 5 = can not seek to end of read file + * 6 = can not get the file size of the read file + * 7 = read file size is Zero + * 8 = can not alloc memory + * 9 = can not read file + */ + +CPU_INT M68KBrain(char *infileName, char *outputfileName, CPU_UNINT BaseAddress) +{ + FILE *infp; + FILE *outfp; + CPU_BYTE *cpu_buffer; + CPU_UNINT cpu_pos = 0; + CPU_UNINT cpu_oldpos; + CPU_UNINT cpu_size=0; + CPU_INT cpuint; + CPU_INT retcode = 0; + CPU_INT retsize; + + /* Open file for read */ + if (!(infp = fopen(infileName,"RB"))) + { + printf("Can not open file %s\n",infileName); + return 3; + } + + /* Open file for write */ + if (!(outfp = fopen(outputfileName,"WB"))) + { + printf("Can not open file %s\n",outputfileName); + return 4; + } + + /* Load the binary file to a memory buffer */ + fseek(infp,0,SEEK_END); + if (!ferror(infp)) + { + printf("error can not seek in the read file"); + fclose(infp); + fclose(outfp); + return 5; + } + + /* get the memory size buffer */ + cpu_size = ftell(infp); + if (!ferror(infp)) + { + printf("error can not get file size of the read file"); + fclose(infp); + fclose(outfp); + return 6; + } + + if (cpu_size==0) + { + printf("error file size is Zero lenght of the read file"); + fclose(infp); + fclose(outfp); + return 7; + } + + /* alloc memory now */ + if (!(cpu_buffer = (unsigned char *) malloc(cpu_size))) + { + printf("error can not alloc %uld size for memory buffer",cpu_size); + fclose(infp); + fclose(outfp); + return 8; + } + + /* read from the file now in one sweep */ + fread(cpu_buffer,1,cpu_size,infp); + if (!ferror(infp)) + { + printf("error can not read file "); + fclose(infp); + fclose(outfp); + return 9; + } + fclose(infp); + + /* now we start the process */ + while (cpu_pos<cpu_size) + { + cpu_oldpos = cpu_pos; + + cpuint = cpu_buffer[cpu_pos]; + + /* Abcd */ + if ((cpuint - (cpuint & GetMaskByte(cpuint_table_Abcd))) == ConvertBitToByte(cpuint_table_Abcd)) + { + retsize = M68k_Abcd(outfp, cpu_buffer, cpu_pos, cpu_size, BaseAddress); + if (retsize<0) + retcode = 1; + else + cpu_pos += retsize; + } + /* Add */ + if ((cpuint - (cpuint & GetMaskByte(cpuint_table_Add))) == ConvertBitToByte(cpuint_table_Add)) + { + retsize = M68k_Add(outfp, cpu_buffer, cpu_pos, cpu_size, BaseAddress); + if (retsize<0) + retcode = 1; + else + cpu_pos += retsize; + } + /* Addi */ + if ((cpuint - (cpuint & GetMaskByte(cpuint_table_Addi))) == ConvertBitToByte(cpuint_table_Addi)) + { + retsize = M68k_Addi(outfp, cpu_buffer, cpu_pos, cpu_size, BaseAddress); + if (retsize<0) + retcode = 1; + else + cpu_pos += retsize; + } + /* Addq */ + if ((cpuint - (cpuint & GetMaskByte(cpuint_table_Addq))) == ConvertBitToByte(cpuint_table_Addq)) + { + retsize = M68k_Addq(outfp, cpu_buffer, cpu_pos, cpu_size, BaseAddress); + if (retsize<0) + retcode = 1; + else + cpu_pos += retsize; + } + /* Addx */ + if ((cpuint - (cpuint & GetMaskByte(cpuint_table_Addx))) == ConvertBitToByte(cpuint_table_Addx)) + { + retsize = M68k_Addx(outfp, cpu_buffer, cpu_pos, cpu_size, BaseAddress); + if (retsize<0) + retcode = 1; + else + cpu_pos += retsize; + } + /* And */ + if ((cpuint - (cpuint & GetMaskByte(cpuint_table_And))) == ConvertBitToByte(cpuint_table_And)) + { + retsize = M68k_Add(outfp, cpu_buffer, cpu_pos, cpu_size, BaseAddress); + if (retsize<0) + retcode = 1; + else + cpu_pos += retsize; + } + /* Andi */ + if ((cpuint - (cpuint & GetMaskByte(cpuint_table_Andi))) == ConvertBitToByte(cpuint_table_Andi)) + { + retsize = M68k_Andi(outfp, cpu_buffer, cpu_pos, cpu_size, BaseAddress); + if (retsize<0) + retcode = 1; + else + cpu_pos += retsize; + } + /* AndToCCR */ + if ((cpuint - (cpuint & GetMaskByte(cpuint_table_AndToCCRF))) == ConvertBitToByte(cpuint_table_AndToCCRF)) + { + cpuint = cpu_buffer[cpu_pos+1]; + if ((cpuint - (cpuint & GetMaskByte(cpuint_table_AndToCCRS))) == ConvertBitToByte(cpuint_table_AndToCCRS)) + { + cpu_pos++; + retsize = M68k_AndToCCR(outfp, cpu_buffer, cpu_pos, cpu_size, BaseAddress); + if (retsize<0) + retcode = 1; + else + cpu_pos += retsize; + } + else + { + cpuint = cpu_buffer[cpu_pos]; + } + } + + /* Found all Opcode and breakout and return no error found */ + if (cpu_pos >=cpu_size) + { + break; + } + + /* Check if we have found a cpu opcode */ + if (cpu_oldpos == cpu_pos) + { + if (retcode == 0) + { + /* no unimplement error where found so we return a msg for unknown opcode */ + printf("Unkonwn Opcode found at 0x%8x opcode 0x%2x\n",cpu_oldpos+BaseAddress,(unsigned int)cpu_buffer[cpu_oldpos]); + retcode = 2; + } + } + + /* Erorro Found ? */ + if (retcode!=0) + { + /* Erorro Found break and return the error code */ + break; + } + } + return retcode; +}
Propchange: trunk/rosapps/devutils/cputointel/m68k/M68kBrain.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/devutils/cputointel/m68k/M68kBrain.h URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/devutils/cputointel/m68k/M6... ============================================================================== --- trunk/rosapps/devutils/cputointel/m68k/M68kBrain.h (added) +++ trunk/rosapps/devutils/cputointel/m68k/M68kBrain.h Sun Dec 31 17:59:07 2006 @@ -1,0 +1,23 @@ + +#include "../misc.h" + +CPU_BYTE cpuint_table_Abcd[16] = {1,1,1,1,2,2,2,1,0,0,0,0,2,2,2,2}; +CPU_BYTE cpuint_table_Add[16] = {1,1,0,1,2,2,2,2,2,2,2,2,2,2,2,2}; +CPU_BYTE cpuint_table_Addi[16] = {0,0,0,0,0,1,1,0,2,2,2,2,2,2,2,2}; +CPU_BYTE cpuint_table_Addq[16] = {0,1,0,1,2,2,2,0,2,2,2,2,2,2,2,2}; +CPU_BYTE cpuint_table_Addx[16] = {1,1,0,1,2,2,2,1,2,2,0,0,2,2,2,2}; +CPU_BYTE cpuint_table_And[16] = {1,1,0,0,2,2,2,2,2,2,2,2,2,2,2,2}; +CPU_BYTE cpuint_table_Andi[16] = {0,0,0,0,0,0,1,0,2,2,2,2,2,2,2,2}; +CPU_BYTE cpuint_table_AndToCCRF[16] = {0,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0}; +CPU_BYTE cpuint_table_AndToCCRS[16] = {0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2}; +CPU_BYTE cpuint_table_Asl[16] = {1,1,1,0,2,2,2,0,2,2,2,0,0,2,2,2}; +CPU_BYTE cpuint_table_Asr[16] = {1,1,1,0,2,2,2,1,2,2,2,0,0,2,2,2}; + + +CPU_BYTE table_Rx[16] = {0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0}; +CPU_BYTE table_RM[16] = {0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0}; +CPU_BYTE table_Ry[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1}; +CPU_BYTE table_Opmode[16] = {0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0}; +CPU_BYTE table_Mode[16] = {0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0}; +CPU_BYTE table_Size[16] = {0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0}; +
Propchange: trunk/rosapps/devutils/cputointel/m68k/M68kBrain.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/devutils/cputointel/m68k/M68kopcode.c URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/devutils/cputointel/m68k/M6... ============================================================================== --- trunk/rosapps/devutils/cputointel/m68k/M68kopcode.c (added) +++ trunk/rosapps/devutils/cputointel/m68k/M68kopcode.c Sun Dec 31 17:59:07 2006 @@ -1,0 +1,150 @@ + +#include <stdio.h> +#include <stdlib.h> +#include "m68k.h" +#include "misc.h" + + +CPU_INT M68k_Abcd(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress) +{ + fprintf(out,"Line_0x%8x :\n",BaseAddress + cpu_pos); + + printf(";Abcd unimplement\n"); + return -1; +} + +CPU_INT M68k_Add(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress) +{ + CPU_INT opmode; + CPU_INT mode; + CPU_INT Rx; + CPU_INT Ry; + //CPU_INT cpuint; + + opmode = ConvertBitToByte(table_Opmode); + mode = ConvertBitToByte(table_Mode); + Rx = ConvertBitToByte(table_Rx); + Ry = ConvertBitToByte(table_Ry); + + fprintf(out,"Line_0x%8x :\n",BaseAddress + cpu_pos); + + if (opmode == 0x00) + { + /* <ea> + Dn -> Dn */ + printf(";Add unimplement of "<ea> + Dn -> Dn" \n"); + + } + + if (opmode == 0x01) + { + /* <ea> + Dn -> Dn */ + printf(";Add unimplement of "<ea> + Dn -> Dn" \n"); + } + + if (opmode == 0x02) + { + /* <ea> + Dn -> Dn */ + printf(";Add unimplement of "<ea> + Dn -> Dn" \n"); + } + + if (opmode == 0x03) + { + /* <ea> + An -> An */ + printf(";Add unimplement of "<ea> + An -> An" \n"); + } + + if (opmode == 0x04) + { + /* Dn + <ea> -> <ea> */ + printf(";Add unimplement of "Dn + <ea> -> <ea>" \n"); + } + + if (opmode == 0x05) + { + /* Dn + <ea> -> <ea> */ + printf(";Add unimplement of "Dn + <ea> -> <ea>" \n"); + } + + if (opmode == 0x06) + { + /* Dn + <ea> -> <ea> */ + printf(";Add unimplement of "Dn + <ea> -> <ea>" \n"); + } + + if (opmode == 0x07) + { + /* <ea> + An -> An */ + printf(";Add unimplement of "<ea> + An -> An" \n"); + } + + + + + + return -1; +} + +CPU_INT M68k_Addi(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress) +{ + fprintf(out,"Line_0x%8x :\n",BaseAddress + cpu_pos); + + printf(";Addi unimplement\n"); + return -1; +} + +CPU_INT M68k_Addq(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress) +{ + fprintf(out,"Line_0x%8x :\n",BaseAddress + cpu_pos); + + printf(";Addq unimplement\n"); + return -1; +} + +CPU_INT M68k_Addx(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress) +{ + fprintf(out,"Line_0x%8x :\n",BaseAddress + cpu_pos); + + printf(";Addx unimplement\n"); + return -1; +} + +CPU_INT M68k_And(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress) +{ + fprintf(out,"Line_0x%8x :\n",BaseAddress + cpu_pos); + + printf(";And unimplement\n"); + return -1; +} + +CPU_INT M68k_Andi(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress) +{ + fprintf(out,"Line_0x%8x :\n",BaseAddress + cpu_pos); + + printf(";Andi unimplement\n"); + return -1; +} + +CPU_INT M68k_AndToCCR(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress) +{ + fprintf(out,"Line_0x%8x :\n",BaseAddress + cpu_pos); + + printf(";AndToCCR unimplement\n"); + return -1; +} + +CPU_INT M68k_Asl(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress) +{ + fprintf(out,"Line_0x%8x :\n",BaseAddress + cpu_pos); + + printf(";Asl unimplement\n"); + return -1; +} + +CPU_INT M68k_Asr(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress) +{ + fprintf(out,"Line_0x%8x :\n",BaseAddress + cpu_pos); + + printf(";Asr unimplement\n"); + return -1; +} +
Propchange: trunk/rosapps/devutils/cputointel/m68k/M68kopcode.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/devutils/cputointel/m68k/m68k.h URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/devutils/cputointel/m68k/m6... ============================================================================== --- trunk/rosapps/devutils/cputointel/m68k/m68k.h (added) +++ trunk/rosapps/devutils/cputointel/m68k/m68k.h Sun Dec 31 17:59:07 2006 @@ -1,0 +1,20 @@ + +#include "../misc.h" + +CPU_INT M68k_Abcd(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress); +CPU_INT M68k_Add(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress); +CPU_INT M68k_Addi(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress); +CPU_INT M68k_Addq(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress); +CPU_INT M68k_Addx(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress); +CPU_INT M68k_And(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress); +CPU_INT M68k_Andi(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress); +CPU_INT M68k_AndToCCR(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress); +CPU_INT M68k_Asl(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress); +CPU_INT M68k_Asr(FILE *out, CPU_BYTE * cpu_buffer, CPU_UNINT cpu_pos, CPU_UNINT cpu_size, CPU_UNINT BaseAddress); + +extern CPU_BYTE table_Rx[16]; +extern CPU_BYTE table_RM[16]; +extern CPU_BYTE table_Ry[16]; +extern CPU_BYTE table_Opmode[16]; +extern CPU_BYTE table_Mode[16]; +extern CPU_BYTE table_Size[16];
Propchange: trunk/rosapps/devutils/cputointel/m68k/m68k.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/devutils/cputointel/misc.c URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/devutils/cputointel/misc.c?... ============================================================================== --- trunk/rosapps/devutils/cputointel/misc.c (added) +++ trunk/rosapps/devutils/cputointel/misc.c Sun Dec 31 17:59:07 2006 @@ -1,0 +1,34 @@ + +#include <stdio.h> +#include "misc.h" + + +/* Conveting bit array to a int byte */ +CPU_UNINT ConvertBitToByte(CPU_BYTE *bit) +{ + CPU_UNINT Byte = 0; + CPU_UNINT t; + + for(t=15;t>0;t--) + { + if (bit[15-t] != 2) + Byte = Byte + (bit[15-t]<<t); + } + return Byte; +} + +/* Conveting bit array mask to a int byte mask */ +CPU_UNINT GetMaskByte(CPU_BYTE *bit) +{ + CPU_UNINT MaskByte = 0; + CPU_UNINT t; + + for(t=15;t>0;t--) + { + if (bit[15-t] == 2) + { + MaskByte = MaskByte + ( (bit[15-t]-1) <<t); + } + } + return MaskByte; +}
Propchange: trunk/rosapps/devutils/cputointel/misc.c ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rosapps/devutils/cputointel/misc.h URL: http://svn.reactos.org/svn/reactos/trunk/rosapps/devutils/cputointel/misc.h?... ============================================================================== --- trunk/rosapps/devutils/cputointel/misc.h (added) +++ trunk/rosapps/devutils/cputointel/misc.h Sun Dec 31 17:59:07 2006 @@ -1,0 +1,14 @@ + +#define CPU_UNINT unsigned int +#define CPU_INT int + +#define CPU_BYTE unsigned char + +/* Prototypes for misc stuff */ + + +/* Convert Bit index to int */ +CPU_UNINT ConvertBitToByte(CPU_BYTE *bit); +CPU_UNINT GetMaskByte(CPU_BYTE *bit); + +
Propchange: trunk/rosapps/devutils/cputointel/misc.h ------------------------------------------------------------------------------ svn:eol-style = native