X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fopcode2c.pl;h=a72c8f766319c9888f71a039bb8d93b79c312368;hb=3615ed71ecaa97d539debdf803fa5f3ea21e4a1e;hp=cf9aa60e068d7097cb9d29f91998c9fd8e0398c2;hpb=fc4dd8fa3aab94a5f63c097ed9809c75560abd7d;p=emu8051.git diff --git a/src/opcode2c.pl b/src/opcode2c.pl index cf9aa60..a72c8f7 100755 --- a/src/opcode2c.pl +++ b/src/opcode2c.pl @@ -78,7 +78,7 @@ print DISASM_H " * along with this program; if not, write to the Free Software\n print DISASM_H " * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n"; print DISASM_H "*/\n\n"; print DISASM_H "#ifndef DISASM_H\n"; -print DISASM_H "#define DISASM_H 1\n\n\n"; +print DISASM_H "#define DISASM_H 1\n\n"; $nbinst=0; $nbaddr=0; @@ -116,7 +116,7 @@ while($ligne=) { $instargs[($instnumb << 2) + $i + 1]=$argstypes{$argslist[$i]}; } } - + if (not exists $insttext{$wordlist[2]}) { $insttext[$nbinst]=$wordlist[2]; $insttext{$wordlist[2]}=$nbinst++; @@ -136,9 +136,12 @@ while($ligne=) { $instnumb++; } # ------------------------------------------------------------------------------ -print DISASM_H "// For all 256 opcodes, the value in this table gives the instruction type\n"; -print DISASM_H "// ex.: MOV, INC, CLR, CPL,...\n"; -print DISASM_H "// To know what is the instruction type, use the number as an offset in the InstTextTbl[]\n"; +print DISASM_H "/*\n"; +print DISASM_H " * For all 256 opcodes, the value in this table gives the instruction type\n"; +print DISASM_H " * ex.: MOV, INC, CLR, CPL,...\n"; +print DISASM_H " * To know what is the instruction type, use\n"; +print DISASM_H " * the number as an offset in the InstTextTbl[]\n"; +print DISASM_H " */\n"; print DISASM_H "static int InstTypesTbl[] = {\n"; for($i=0;$i<256;$i++) { print DISASM_H " $insttype[$i]"; @@ -146,9 +149,9 @@ for($i=0;$i<256;$i++) { if (($i+1) % 16 == 0) { print DISASM_H "\n"; } } print DISASM_H "};\n"; -print DISASM_H "\n\n"; +print DISASM_H "\n"; # ------------------------------------------------------------------------------ -print DISASM_H "// Size(in bytes) of each instruction (offset in table is instruction opcode)\n"; +print DISASM_H "/* Size(in bytes) of each instruction (offset in table is instruction opcode) */\n"; print DISASM_H "static int InstSizesTbl[] = {\n"; for($i=0;$i<256;$i++) { print DISASM_H " $nbbytes[$i]"; @@ -156,9 +159,9 @@ for($i=0;$i<256;$i++) { if (($i+1) % 16 == 0) { print DISASM_H "\n"; } } print DISASM_H "};\n"; -print DISASM_H "\n\n"; +print DISASM_H "\n"; # ------------------------------------------------------------------------------ -print DISASM_H "// List of instructions types referenced by InstTypesTbl[]\n"; +print DISASM_H "/* List of instructions types referenced by InstTypesTbl[] */\n"; $nbelement=@insttext; print DISASM_H "\#define InstTextTblLength $nbelement\n"; $elementnb=0; @@ -169,14 +172,16 @@ foreach $instruc (@insttext) { print DISASM_H "\n"; } print DISASM_H "};\n"; -print DISASM_H "\n\n"; +print DISASM_H "\n"; # ------------------------------------------------------------------------------ -print DISASM_H "// Table describing all arguments types of an instruction\n"; -print DISASM_H "// The table is indexed InstArgTbl[ opcode * 4]\n"; -print DISASM_H "// InstArgTbl[opcode*4 + 1] gives the number of arguments the instruction has\n"; -print DISASM_H "// InstArgTbl[opcode*4 + i] for i=1,2 and 3 give the type of each argument\n"; -print DISASM_H "// for most instructions, the 3rd argument isn't used\n"; -print DISASM_H "// the argument type is referecing to ArgsTextTbl[]\n"; +print DISASM_H "/*\n"; +print DISASM_H " * Table describing all arguments types of an instruction\n"; +print DISASM_H " * The table is indexed InstArgTbl[ opcode * 4]\n"; +print DISASM_H " * InstArgTbl[opcode*4 + 1] gives the number of arguments the instruction has\n"; +print DISASM_H " * InstArgTbl[opcode*4 + i] for i=1,2 and 3 give the type of each argument\n"; +print DISASM_H " * for most instructions, the 3rd argument isn't used\n"; +print DISASM_H " * the argument type is referecing to ArgsTextTbl[]\n"; +print DISASM_H " */\n"; print DISASM_H "\#define InstArgTblLength 256\n"; print DISASM_H "static int InstArgTbl[] = {\n"; for($i=0;$i<1024;$i++) { @@ -185,10 +190,12 @@ for($i=0;$i<1024;$i++) { if (($i+1) % 16 == 0) { print DISASM_H "\n"; } } print DISASM_H "};\n"; -print DISASM_H "\n\n"; +print DISASM_H "\n"; # ------------------------------------------------------------------------------ -print DISASM_H "// List all types of arguments available to instructions\n"; -print DISASM_H "// Referenced by InstArgsTbl[]\n"; +print DISASM_H "/*\n"; +print DISASM_H " * List all types of arguments available to instructions\n"; +print DISASM_H " * Referenced by InstArgsTbl[]\n"; +print DISASM_H " */\n"; $nbelement=@argstypes; print DISASM_H "\#define ArgsTextTblLength $nbelement\n"; $elementnb=0; @@ -199,7 +206,7 @@ foreach $args (@argstypes) { print DISASM_H "\n"; } print DISASM_H "};\n"; -print DISASM_H "\n\n"; +print DISASM_H "\n"; # ------------------------------------------------------------------------------ for ($i=0 ; $i< 256; $i++) { @@ -207,9 +214,7 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP " * Instruction \"$a_instruction[$i]\" takes $a_cycles[$i] cycle(s) and $a_bytes[$i] byte(s).\n"; print INST_IMP " ","*"x76,"/\n"; print INST_IMP "int\n"; - print INST_IMP "cpu8051_OP_$a_opcodehex[$i]( void )\n"; -# TEST hugo new... -# print INST_DEF "int OP_$a_opcodehex[$i]( );\n"; + print INST_IMP "cpu8051_OP_$a_opcodehex[$i](void)\n"; print INST_IMP "{\n"; if( $i == 0x85 ) { @@ -225,7 +230,8 @@ for ($i=0 ; $i< 256; $i++) { if ($instargs[$i*4] > 0) { $op_destination=$instargs[$i*4+1]; if ($op_destination == 0) { # addr11 - print INST_IMP " unsigned int addr11 = ( ( memory_read8( PGM_MEM_ID, cpu8051.pc - 1 ) << 3 ) & 0xF00 ) + memory_read8( PGM_MEM_ID, cpu8051.pc++ );\n"; + print INST_IMP " unsigned int addr11 = ( ( memory_read8( PGM_MEM_ID, cpu8051.pc - 1 ) << 3 ) & 0xF00 ) + memory_read8( PGM_MEM_ID, cpu8051.pc );\n"; + print INST_IMP " cpu8051.pc++;\n"; } if ($op_destination == 1) { # addr16 print INST_IMP "unsigned int addr16 = ( memory_read8( PGM_MEM_ID, cpu8051.pc++ ) << 8 );\n"; @@ -244,7 +250,7 @@ for ($i=0 ; $i< 256; $i++) { if ($op_destination == 5) { # @R1 print INST_IMP "unsigned char destination = cpu8051_ReadI ( cpu8051_ReadD( BANKPSW + _R1_ ) );\n"; } - + if ($op_destination == 6) { # R0 print INST_IMP "unsigned char destination = cpu8051_ReadD( BANKPSW + _R0_ );\n"; } @@ -275,7 +281,7 @@ for ($i=0 ; $i< 256; $i++) { } if ($op_destination == 15) { # reladdr print INST_IMP "cpu8051.pc++;\n"; - print INST_IMP "unsigned int destination = ( ( memory_read8( PGM_MEM_ID, cpu8051.pc - 1 ) + cpu8051.pc ) & 0xFF ) + ( cpu8051.pc & 0xFF00 );\n"; + print INST_IMP "unsigned int destination = ((char) memory_read8(PGM_MEM_ID, cpu8051.pc - 1)) + cpu8051.pc;\n"; } if ($op_destination == 16) { # #data print INST_IMP "unsigned char destination = memory_read8( PGM_MEM_ID, cpu8051.pc++ );\n"; @@ -284,7 +290,7 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP "unsigned char destination = ( cpu8051_ReadD( _PSW_ ) >> 7 );\n"; } if ($op_destination == 18) { # @A+DPTR - print INST_IMP "unsigned int destination = cpu8051_ReadI( cpu8051_ReadD( _ACC_ ) + cpu8051_ReadD( _DPTRLOW_ ) + ( cpu8051_ReadD( _DPTRHIGH_ ) << 8 ) );\n"; + print INST_IMP "unsigned int destination = cpu8051_ReadD( _ACC_ ) + memory_sfr_read_dptr();\n"; } # Mis en commentaire car donnait un warning (destination et source unused variables...) # if ($op_destination == 20) { # AB @@ -292,7 +298,7 @@ for ($i=0 ; $i< 256; $i++) { # print INST_IMP "unsigned char source = cpu8051_ReadD( _B_ );\n"; # } if ($op_destination == 21) { # DPTR - print INST_IMP "unsigned int destination = ( cpu8051_ReadD( _DPTRHIGH_ ) << 8 ) + cpu8051_ReadD( _DPTRLOW_ );\n"; + print INST_IMP "unsigned int destination = memory_sfr_read_dptr();\n"; } if ($op_destination == 22) { # #data16 print INST_IMP "unsigned char destination = ( memory_read8( PGM_MEM_ID, (cpu8051.pc)++ ) << 8 );\n"; @@ -303,7 +309,7 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP "destination = ( cpu8051_ReadB( dstbitaddr ) ^ 1 );\n"; } if ($op_destination == 24) { # @DPTR - print INST_IMP "unsigned char destination = cpu8051_ReadI( ( cpu8051_ReadD( _DPTRHIGH_ ) << 8 ) + cpu8051_ReadD( _DPTRLOW_) );\n"; + print INST_IMP "unsigned char destination = cpu8051_ReadI(memory_sfr_read_dptr());\n"; } } @@ -360,7 +366,7 @@ for ($i=0 ; $i< 256; $i++) { } if ($op_source == 15) { # reladdr print INST_IMP "(cpu8051.pc)++;\n"; - print INST_IMP "unsigned int source = ( ( memory_read8( PGM_MEM_ID, cpu8051.pc - 1 ) + cpu8051.pc ) & 0xFF ) + ( cpu8051.pc & 0xFF00 );\n"; + print INST_IMP "unsigned int source = ((char) memory_read8(PGM_MEM_ID, cpu8051.pc - 1)) + cpu8051.pc;\n"; } if ($op_source == 16) { # #data print INST_IMP "unsigned char source = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );\n"; @@ -369,13 +375,13 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP "unsigned char source = ( cpu8051_ReadD( _PSW_ ) >> 7 );\n"; } if ($op_source == 18) { # @A+DPTR - print INST_IMP "unsigned char source = memory_read8( PGM_MEM_ID, cpu8051_ReadD( _ACC_ ) + cpu8051_ReadD( _DPTRLOW_ ) + ( cpu8051_ReadD( _DPTRHIGH_ ) << 8 ) );\n"; + print INST_IMP "unsigned char source = memory_read8( PGM_MEM_ID, cpu8051_ReadD( _ACC_ ) + memory_sfr_read_dptr());\n"; } if ($op_source == 19) { # @A+PC print INST_IMP "unsigned char source = memory_read8( PGM_MEM_ID, cpu8051_ReadD( _ACC_ ) + ( ++cpu8051.pc ) );\n"; } if ($op_source == 21) { # DPTR - print INST_IMP "unsigned int source = ( cpu8051_ReadD( _DPTRHIGH_ ) << 8 ) + cpu8051_ReadD( _DPTRLOW_ );\n"; + print INST_IMP "unsigned int source = memory_sfr_read_dptr();\n"; } if ($op_source == 22) { # #data16 print INST_IMP "unsigned char source = ( memory_read8( PGM_MEM_ID, (cpu8051.pc)++ ) << 8 );\n"; @@ -386,7 +392,7 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP "source = ( cpu8051_ReadB( srcbitaddr ) ^ 1 );\n"; } if ($op_source == 24) { # @DPTR - print INST_IMP "unsigned char source = cpu8051_ReadI( ( cpu8051_ReadD( _DPTRHIGH_ ) << 8 ) + cpu8051_ReadD( _DPTRLOW_) );\n"; + print INST_IMP "unsigned char source = cpu8051_ReadI(memory_sfr_read_dptr());\n"; } } @@ -462,7 +468,7 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP " cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x80 ) );\n"; print INST_IMP " if ( ( destination & 0x7F ) + ( source & 0x7F ) < 0x80 ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x04 ) );\n"; print INST_IMP "} else if ( ( destination & 0x7F ) + ( source & 0x7F ) > 0x7F ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x04 ) );\n"; - print INST_IMP "if ( ( destination & 0x0F ) + ( source & 0x0F ) > 0x0F ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x04 ) );\n"; + print INST_IMP "if ( ( destination & 0x0F ) + ( source & 0x0F ) > 0x0F ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x40 ) );\n"; print INST_IMP "destination += source;\n"; } @@ -477,6 +483,7 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP "unsigned char SP = cpu8051_ReadD( _SP_ );\n"; print INST_IMP "cpu8051.pc = ( cpu8051_ReadI( SP-- ) << 8 );\n"; print INST_IMP "cpu8051.pc += cpu8051_ReadI( SP-- );\n"; + print INST_IMP "cpu8051_WriteD( _SP_, SP );\n"; } # RLC @@ -505,13 +512,7 @@ for ($i=0 ; $i< 256; $i++) { # ORL if ($insttype[$i] == 19) { - if ($instargs[$i*4+1] == 17) { - # sur des bits - print INST_IMP "cpu8051_WriteD( _PSW_ , ( ( destination | source ) << 7 ) );\n"; - } else { - # sur des bytes - print INST_IMP "destination |= source;\n"; - } + print INST_IMP "destination |= source;\n"; } # JNC @@ -521,13 +522,7 @@ for ($i=0 ; $i< 256; $i++) { # ANL if ($insttype[$i] == 21) { - if ($instargs[$i*4+1] == 17) { - # sur des bits - print INST_IMP "cpu8051_WriteD( _PSW_, ( ( destination & source) << 7 ) );\n"; - } else { - # sur des bytes - print INST_IMP "destination &= source;\n"; - } + print INST_IMP "destination &= source;\n"; } # JZ @@ -602,10 +597,10 @@ for ($i=0 ; $i< 256; $i++) { # CJNE if ($insttype[$i] == 34) { - print INST_IMP "unsigned int reladdr = ( ( memory_read8( PGM_MEM_ID, cpu8051.pc ) + ( ( cpu8051.pc + 1 ) & 0x00FF ) ) & 0x00FF ) + ( ( cpu8051.pc + 1 ) & 0xFF00 );\n"; + print INST_IMP "unsigned int reladdr = ((char) memory_read8(PGM_MEM_ID, cpu8051.pc)) + (cpu8051.pc + 1);\n"; print INST_IMP "cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) & 0x7F ) );\n"; print INST_IMP "if ( destination < source ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x80 ) );\n"; - print INST_IMP "if ( destination != source ) cpu8051.pc = reladdr;\n"; + print INST_IMP "if ( destination != source ) cpu8051.pc = reladdr; else cpu8051.pc++; \n"; } # PUSH @@ -732,14 +727,13 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP "cpu8051_WriteD( _PSW_, ( ( cpu8051_ReadD( _PSW_ ) & 0x7F) | ( destination << 7 ) ) );\n"; } if ($op_destination == 21) { # DPTR - print INST_IMP "cpu8051_WriteD( _DPTRHIGH_, ( destination >> 8 ) );\n"; - print INST_IMP "cpu8051_WriteD( _DPTRLOW_, ( destination & 0xFF ) );\n"; + print INST_IMP "memory_sfr_write_dptr(destination);\n"; } if ($op_destination == 23) { # /bitaddr print INST_IMP "cpu8051_WriteB( dstbitaddr, destination );\n"; } if ($op_destination == 24) { # @DPTR - print INST_IMP "cpu8051_WriteI( ( cpu8051_ReadD( _DPTRHIGH_ ) << 8 ) + cpu8051_ReadD( _DPTRLOW_ ), destination );\n"; + print INST_IMP "cpu8051_WriteI(memory_sfr_read_dptr(), destination);\n"; } } @@ -795,14 +789,13 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP "cpu8051_WriteD( _PSW_, ( ( cpu8051_ReadD( _PSW_ ) & 0x7F) | ( source << 7 ) ) );\n"; } if ($op_source == 21) { # DPTR - print INST_IMP "cpu8051_WriteD( _DPTRHIGH_, ( source >> 8 ) );\n"; - print INST_IMP "cpu8051_WriteD( _DPTRLOW_, ( source & 0xFF ) );\n"; + print INST_IMP "memory_sfr_write_dptr(source);\n"; } if ($op_source == 23) { # /bitaddr print INST_IMP "cpu8051_WriteB( srcbitaddr, source );\n"; } if ($op_source == 24) { # @DPTR - print INST_IMP "cpu8051_WriteI( ( cpu8051_ReadD( _DPTRHIGH_ ) << 8 ) + cpu8051_ReadD( _DPTRLOW_ ), source );\n"; + print INST_IMP "cpu8051_WriteI(memory_sfr_read_dptr(), source);\n"; } } } @@ -841,11 +834,11 @@ print INST_DEF "*/\n\n"; print INST_DEF "#ifndef INSTRUCTIONS_8051_H\n"; print INST_DEF "#define INSTRUCTIONS_8051_H 1\n\n\n"; -print INST_DEF "#define BANKPSW ( cpu8051_ReadD( _PSW_ ) & 0x18 )\n\n"; -print INST_DEF "typedef int (*OPCODE_FP)( void );\n\n\n"; +print INST_DEF "#define BANKPSW (cpu8051_ReadD(_PSW_) & 0x18)\n\n"; +print INST_DEF "typedef int (*OPCODE_FP)(void);\n\n\n"; for( $i=0; $i<256; $i++ ) { print INST_DEF "int\n"; - print INST_DEF "cpu8051_OP_$a_opcodehex[$i]( void );\n\n"; + print INST_DEF "cpu8051_OP_$a_opcodehex[$i](void);\n\n"; } print INST_DEF "\n"; print INST_DEF "/* Exported variables. */\n"; @@ -868,12 +861,7 @@ print INST_DEF "#endif\n\n\n"; print INST_DEF "#endif /* INSTRUCTIONS_8051_H */\n"; - - - - - -print DISASM_H "\n\n#endif /* DISASM_H */\n"; +print DISASM_H "#endif /* DISASM_H */\n"; close DISASM_H; close OPCODELST;