X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;f=src%2Fopcode2c.pl;h=035c71809b22790687c49211b8269ebcd654b10f;hb=ce24c216aa7eaf099dda2c9efeb9603a4076c93e;hp=a72c8f766319c9888f71a039bb8d93b79c312368;hpb=3615ed71ecaa97d539debdf803fa5f3ea21e4a1e;p=emu8051.git diff --git a/src/opcode2c.pl b/src/opcode2c.pl index a72c8f7..035c718 100755 --- a/src/opcode2c.pl +++ b/src/opcode2c.pl @@ -22,61 +22,58 @@ open INST_IMP, ">instructions_8051.c" or die "Error creating : $!\n"; open DISASM_H, ">disasm.h" or die "Error creating : $!\n"; +# Write GPL license +# Argument 0 is file descriptor +sub write_header +{ + my $fd = $_[0]; + + print $fd " *\n"; + print $fd " * Do not modify this file directly, as it was created by opcode2c.pl\n"; + print $fd " * Any modifications made directly to this file will be lost.\n"; + print $fd " *\n"; + print $fd " * Copyright (C) 1999 Jonathan St-André\n"; + print $fd " * Copyright (C) 1999 Hugo Villeneuve \n"; + print $fd " *\n"; + print $fd " * This program is free software; you can redistribute it and/or modify\n"; + print $fd " * it under the terms of the GNU General Public License as published by\n"; + print $fd " * the Free Software Foundation; either version 2 of the License, or\n"; + print $fd " * (at your option) any later version.\n"; + print $fd " *\n"; + print $fd " * This program is distributed in the hope that it will be useful,\n"; + print $fd " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"; + print $fd " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"; + print $fd " * GNU General Public License for more details.\n"; + print $fd " *\n"; + print $fd " * You should have received a copy of the GNU General Public License\n"; + print $fd " * along with this program; if not, write to the Free Software\n"; + print $fd " * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n"; + print $fd " */\n\n"; +} + +# Write C function source code line to INST_IMP file. +# Prefix each line with a tab (indentation) and add newline character at the end. +sub cfw +{ + print INST_IMP "\t",$_[0],"\n"; +} + # Header for instructions_8051.c print INST_IMP "/*\n"; print INST_IMP " * instructions_8051.c\n"; -print INST_IMP " *\n"; -print INST_IMP " * Do not modify this file directly, as it was created by opcode2c.pl\n"; -print INST_IMP " * Any modifications made directly to this file will be lost.\n"; -print INST_IMP " *\n"; -print INST_IMP " * Copyright (C) 1999 Jonathan St-André\n"; -print INST_IMP " * Copyright (C) 1999 Hugo Villeneuve \n"; -print INST_IMP " *\n"; -print INST_IMP " * This program is free software; you can redistribute it and/or modify\n"; -print INST_IMP " * it under the terms of the GNU General Public License as published by\n"; -print INST_IMP " * the Free Software Foundation; either version 2 of the License, or\n"; -print INST_IMP " * (at your option) any later version.\n"; -print INST_IMP " *\n"; -print INST_IMP " * This program is distributed in the hope that it will be useful,\n"; -print INST_IMP " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"; -print INST_IMP " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"; -print INST_IMP " * GNU General Public License for more details.\n"; -print INST_IMP " *\n"; -print INST_IMP " * You should have received a copy of the GNU General Public License\n"; -print INST_IMP " * along with this program; if not, write to the Free Software\n"; -print INST_IMP " * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n"; -print INST_IMP "*/\n\n"; +write_header(INST_IMP); print INST_IMP "/* Define only here, for not having extern scope on local variables. */\n"; print INST_IMP "#define INSTRUCTIONS_8051_M 1\n\n\n"; print INST_IMP "#include \"reg8051.h\"\n"; print INST_IMP "#include \"cpu8051.h\"\n"; print INST_IMP "#include \"memory.h\"\n"; +print INST_IMP "#include \"psw.h\"\n"; print INST_IMP "#include \"instructions_8051.h\"\n\n\n"; # Header for disasm.h print DISASM_H "/*\n"; print DISASM_H " * disasm.h\n"; -print DISASM_H " *\n"; -print DISASM_H " * Do not modify this file directly, as it was created by opcode2c.pl\n"; -print DISASM_H " * Any modifications made directly to this file will be lost.\n"; -print DISASM_H " *\n"; -print DISASM_H " * Copyright (C) 1999 Jonathan St-André\n"; -print DISASM_H " * Copyright (C) 1999 Hugo Villeneuve \n"; -print DISASM_H " *\n"; -print DISASM_H " * This program is free software; you can redistribute it and/or modify\n"; -print DISASM_H " * it under the terms of the GNU General Public License as published by\n"; -print DISASM_H " * the Free Software Foundation; either version 2 of the License, or\n"; -print DISASM_H " * (at your option) any later version.\n"; -print DISASM_H " *\n"; -print DISASM_H " * This program is distributed in the hope that it will be useful,\n"; -print DISASM_H " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"; -print DISASM_H " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"; -print DISASM_H " * GNU General Public License for more details.\n"; -print DISASM_H " *\n"; -print DISASM_H " * You should have received a copy of the GNU General Public License\n"; -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"; +write_header(DISASM_H); print DISASM_H "#ifndef DISASM_H\n"; print DISASM_H "#define DISASM_H 1\n\n"; @@ -230,444 +227,450 @@ 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 " cpu8051.pc++;\n"; + cfw("unsigned int addr11 = ( ( memory_read8( PGM_MEM_ID, cpu8051.pc - 1 ) << 3 ) & 0xF00 ) + memory_read8( PGM_MEM_ID, cpu8051.pc );"); + cfw("cpu8051.pc++;"); } if ($op_destination == 1) { # addr16 - print INST_IMP "unsigned int addr16 = ( memory_read8( PGM_MEM_ID, cpu8051.pc++ ) << 8 );\n"; - print INST_IMP "addr16 += memory_read8( PGM_MEM_ID, cpu8051.pc++ );\n"; + cfw("uint16_t addr16 = pgm_read_addr16(cpu8051.pc);"); + cfw("cpu8051.pc += 2;"); } if ($op_destination == 2) { # A - print INST_IMP "unsigned char destination = cpu8051_ReadD( _ACC_ );\n"; + cfw("unsigned char destination = cpu8051_ReadD( _ACC_ );"); } if ($op_destination == 3) { # direct - print INST_IMP "unsigned char destaddr = memory_read8( PGM_MEM_ID, cpu8051.pc++ );\n"; - print INST_IMP "unsigned char destination = cpu8051_ReadD( destaddr );\n"; + cfw("unsigned char destaddr = memory_read8( PGM_MEM_ID, cpu8051.pc++ );"); + cfw("unsigned char destination = cpu8051_ReadD( destaddr );"); } if ($op_destination == 4) { # @R0 - print INST_IMP "unsigned char destination = cpu8051_ReadI ( cpu8051_ReadD( BANKPSW + _R0_ ) );\n"; + cfw("unsigned char destination = cpu8051_ReadI ( cpu8051_ReadD( BANKPSW + _R0_ ) );"); } if ($op_destination == 5) { # @R1 - print INST_IMP "unsigned char destination = cpu8051_ReadI ( cpu8051_ReadD( BANKPSW + _R1_ ) );\n"; + cfw("unsigned char destination = cpu8051_ReadI ( cpu8051_ReadD( BANKPSW + _R1_ ) );"); } - if ($op_destination == 6) { # R0 - print INST_IMP "unsigned char destination = cpu8051_ReadD( BANKPSW + _R0_ );\n"; + cfw("unsigned char destination = cpu8051_ReadD( BANKPSW + _R0_ );"); } if ($op_destination == 7) { # R1 - print INST_IMP "unsigned char destination = cpu8051_ReadD( BANKPSW + _R1_ );\n"; + cfw("unsigned char destination = cpu8051_ReadD( BANKPSW + _R1_ );"); } if ($op_destination == 8) { # R2 - print INST_IMP "unsigned char destination = cpu8051_ReadD( BANKPSW + _R2_ );\n"; + cfw("unsigned char destination = cpu8051_ReadD( BANKPSW + _R2_ );"); } if ($op_destination == 9) { # R3 - print INST_IMP "unsigned char destination = cpu8051_ReadD( BANKPSW + _R3_ );\n"; + cfw("unsigned char destination = cpu8051_ReadD( BANKPSW + _R3_ );"); } if ($op_destination == 10) { # R4 - print INST_IMP "unsigned char destination = cpu8051_ReadD( BANKPSW + _R4_ );\n"; + cfw("unsigned char destination = cpu8051_ReadD( BANKPSW + _R4_ );"); } if ($op_destination == 11) { # R5 - print INST_IMP "unsigned char destination = cpu8051_ReadD( BANKPSW + _R5_ );\n"; + cfw("unsigned char destination = cpu8051_ReadD( BANKPSW + _R5_ );"); } if ($op_destination == 12) { # R6 - print INST_IMP "unsigned char destination = cpu8051_ReadD( BANKPSW + _R6_ );\n"; + cfw("unsigned char destination = cpu8051_ReadD( BANKPSW + _R6_ );"); } if ($op_destination == 13) { # R7 - print INST_IMP "unsigned char destination = cpu8051_ReadD( BANKPSW + _R7_ );\n"; + cfw("unsigned char destination = cpu8051_ReadD( BANKPSW + _R7_ );"); } if ($op_destination == 14) { # bitaddr - print INST_IMP "unsigned char destination, dstbitaddr = memory_read8( PGM_MEM_ID, cpu8051.pc++ );\n"; - print INST_IMP "destination = cpu8051_ReadB( dstbitaddr );\n"; + cfw("unsigned char destination, dstbitaddr = memory_read8( PGM_MEM_ID, cpu8051.pc++ );"); + cfw("destination = cpu8051_ReadB( dstbitaddr );"); } if ($op_destination == 15) { # reladdr - print INST_IMP "cpu8051.pc++;\n"; - print INST_IMP "unsigned int destination = ((char) memory_read8(PGM_MEM_ID, cpu8051.pc - 1)) + cpu8051.pc;\n"; + cfw("cpu8051.pc++;"); + cfw("unsigned int destination = ((char) memory_read8(PGM_MEM_ID, cpu8051.pc - 1)) + cpu8051.pc;"); } if ($op_destination == 16) { # #data - print INST_IMP "unsigned char destination = memory_read8( PGM_MEM_ID, cpu8051.pc++ );\n"; + cfw("unsigned char destination = memory_read8( PGM_MEM_ID, cpu8051.pc++ );"); } if ($op_destination == 17) { # C - print INST_IMP "unsigned char destination = ( cpu8051_ReadD( _PSW_ ) >> 7 );\n"; + cfw("unsigned char destination = psw_read_cy();"); } if ($op_destination == 18) { # @A+DPTR - print INST_IMP "unsigned int destination = cpu8051_ReadD( _ACC_ ) + memory_sfr_read_dptr();\n"; + cfw("unsigned int destination = cpu8051_ReadD( _ACC_ ) + memory_sfr_read_dptr();"); } -# Mis en commentaire car donnait un warning (destination et source unused variables...) -# if ($op_destination == 20) { # AB -# print INST_IMP "unsigned char destination = cpu8051_ReadD( _ACC_ );\n"; -# print INST_IMP "unsigned char source = cpu8051_ReadD( _B_ );\n"; -# } + if ($op_destination == 20) { # AB + cfw("unsigned char destination = cpu8051_ReadD( _ACC_ );"); + cfw("unsigned char source = cpu8051_ReadD( _B_ );"); + } if ($op_destination == 21) { # DPTR - 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"; - print INST_IMP "destination += memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );\n"; + cfw("unsigned int destination = memory_sfr_read_dptr();"); } if ($op_destination == 23) { # /bitaddr - print INST_IMP "unsigned char destination, dstbitaddr = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );\n"; - print INST_IMP "destination = ( cpu8051_ReadB( dstbitaddr ) ^ 1 );\n"; + cfw("unsigned char destination, dstbitaddr = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );"); + cfw("destination = ( cpu8051_ReadB( dstbitaddr ) ^ 1 );"); } if ($op_destination == 24) { # @DPTR - print INST_IMP "unsigned char destination = cpu8051_ReadI(memory_sfr_read_dptr());\n"; + cfw("unsigned char destination = cpu8051_ReadI(memory_sfr_read_dptr());"); } } if ($instargs[$i*4] > 1) { $op_source=$instargs[$i*4+2]; if ($op_source == 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"; + cfw("unsigned int addr11 = ( ( memory_read8( PGM_MEM_ID, cpu8051.pc - 1 ) << 3 ) & 0xF00 ) + memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );"); } if ($op_source == 1) { # addr16 - print INST_IMP "unsigned int addr16 = ( memory_read8( PGM_MEM_ID, (cpu8051.pc)++ ) << 8 );\n"; - print INST_IMP "addr16 += memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );\n"; + cfw("uint16_t addr16 = pgm_read_addr16(cpu8051.pc);"); + cfw("cpu8051.pc += 2;"); } if ($op_source == 2) { # A - print INST_IMP "unsigned char source = cpu8051_ReadD( _ACC_ );\n"; + cfw("unsigned char source = cpu8051_ReadD( _ACC_ );"); } if ($op_source == 3) { # direct - print INST_IMP "unsigned char srcaddr = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );\n"; - print INST_IMP "unsigned char source = cpu8051_ReadD( srcaddr );\n"; + cfw("unsigned char srcaddr = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );"); + cfw("unsigned char source = cpu8051_ReadD( srcaddr );"); } if ($op_source == 4) { # @R0 - print INST_IMP "unsigned char source = cpu8051_ReadI ( cpu8051_ReadD( BANKPSW + _R0_ ) );\n"; + cfw("unsigned char source = cpu8051_ReadI ( cpu8051_ReadD( BANKPSW + _R0_ ) );"); } if ($op_source == 5) { # @R1 - print INST_IMP "unsigned char source = cpu8051_ReadI ( cpu8051_ReadD( BANKPSW + _R1_ ) );\n"; + cfw("unsigned char source = cpu8051_ReadI ( cpu8051_ReadD( BANKPSW + _R1_ ) );"); } if ($op_source == 6) { # R0 - print INST_IMP "unsigned char source = cpu8051_ReadD( BANKPSW + _R0_ );\n"; + cfw("unsigned char source = cpu8051_ReadD( BANKPSW + _R0_ );"); } if ($op_source == 7) { # R1 - print INST_IMP "unsigned char source = cpu8051_ReadD( BANKPSW + _R1_ );\n"; + cfw("unsigned char source = cpu8051_ReadD( BANKPSW + _R1_ );"); } if ($op_source == 8) { # R2 - print INST_IMP "unsigned char source = cpu8051_ReadD( BANKPSW + _R2_ );\n"; + cfw("unsigned char source = cpu8051_ReadD( BANKPSW + _R2_ );"); } if ($op_source == 9) { # R3 - print INST_IMP "unsigned char source = cpu8051_ReadD( BANKPSW + _R3_ );\n"; + cfw("unsigned char source = cpu8051_ReadD( BANKPSW + _R3_ );"); } if ($op_source == 10) { # R4 - print INST_IMP "unsigned char source = cpu8051_ReadD( BANKPSW + _R4_ );\n"; + cfw("unsigned char source = cpu8051_ReadD( BANKPSW + _R4_ );"); } if ($op_source == 11) { # R5 - print INST_IMP "unsigned char source = cpu8051_ReadD( BANKPSW + _R5_ );\n"; + cfw("unsigned char source = cpu8051_ReadD( BANKPSW + _R5_ );"); } if ($op_source == 12) { # R6 - print INST_IMP "unsigned char source = cpu8051_ReadD( BANKPSW + _R6_ );\n"; + cfw("unsigned char source = cpu8051_ReadD( BANKPSW + _R6_ );"); } if ($op_source == 13) { # R7 - print INST_IMP "unsigned char source = cpu8051_ReadD( BANKPSW + _R7_ );\n"; + cfw("unsigned char source = cpu8051_ReadD( BANKPSW + _R7_ );"); } if ($op_source == 14) { # bitaddr - print INST_IMP "unsigned char source, srcbitaddr = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );\n"; - print INST_IMP "source = cpu8051_ReadB( srcbitaddr );\n"; + cfw("unsigned char source, srcbitaddr = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );"); + cfw("source = cpu8051_ReadB( srcbitaddr );"); } if ($op_source == 15) { # reladdr - print INST_IMP "(cpu8051.pc)++;\n"; - print INST_IMP "unsigned int source = ((char) memory_read8(PGM_MEM_ID, cpu8051.pc - 1)) + cpu8051.pc;\n"; + cfw("(cpu8051.pc)++;"); + cfw("unsigned int source = ((char) memory_read8(PGM_MEM_ID, cpu8051.pc - 1)) + cpu8051.pc;"); } if ($op_source == 16) { # #data - print INST_IMP "unsigned char source = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );\n"; + cfw("unsigned char source = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );"); } if ($op_source == 17) { # C - print INST_IMP "unsigned char source = ( cpu8051_ReadD( _PSW_ ) >> 7 );\n"; + cfw("unsigned char source = psw_read_cy();"); } if ($op_source == 18) { # @A+DPTR - print INST_IMP "unsigned char source = memory_read8( PGM_MEM_ID, cpu8051_ReadD( _ACC_ ) + memory_sfr_read_dptr());\n"; + cfw("unsigned char source = memory_read8( PGM_MEM_ID, cpu8051_ReadD( _ACC_ ) + memory_sfr_read_dptr());"); } if ($op_source == 19) { # @A+PC - print INST_IMP "unsigned char source = memory_read8( PGM_MEM_ID, cpu8051_ReadD( _ACC_ ) + ( ++cpu8051.pc ) );\n"; + cfw("unsigned char source = memory_read8( PGM_MEM_ID, cpu8051_ReadD( _ACC_ ) + ( ++cpu8051.pc ) );"); } if ($op_source == 21) { # DPTR - print INST_IMP "unsigned int source = memory_sfr_read_dptr();\n"; + cfw("unsigned int source = memory_sfr_read_dptr();"); } if ($op_source == 22) { # #data16 - print INST_IMP "unsigned char source = ( memory_read8( PGM_MEM_ID, (cpu8051.pc)++ ) << 8 );\n"; - print INST_IMP "source += memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );\n"; + cfw("uint16_t source = pgm_read_addr16(cpu8051.pc);"); + cfw("cpu8051.pc += 2;"); } if ($op_source == 23) { # /bitaddr - print INST_IMP "unsigned char source, srcbitaddr = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );\n"; - print INST_IMP "source = ( cpu8051_ReadB( srcbitaddr ) ^ 1 );\n"; + cfw("unsigned char source, srcbitaddr = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );"); + cfw("source = ( cpu8051_ReadB( srcbitaddr ) ^ 1 );"); } if ($op_source == 24) { # @DPTR - print INST_IMP "unsigned char source = cpu8051_ReadI(memory_sfr_read_dptr());\n"; + cfw("unsigned char source = cpu8051_ReadI(memory_sfr_read_dptr());"); } } ############################################################################## $modifysrc=0; -# print INST_IMP "\n// Inserer le code ici\n\n"; # RR if ($insttype[$i] == 3) { - print INST_IMP "destination = ( destination >> 1 ) | ( destination << 7 );\n"; + cfw("destination = ( destination >> 1 ) | ( destination << 7 );"); } # INC if ($insttype[$i] == 4) { - print INST_IMP "destination++;\n"; + cfw("destination++;"); } # JBC if ($insttype[$i] == 5) { - print INST_IMP "if ( destination == 1 ) { cpu8051.pc = source; destination = 0; }\n"; + cfw("if ( destination == 1 ) { cpu8051.pc = source; destination = 0; }"); } # ACALL if ($insttype[$i] == 6) { - print INST_IMP "unsigned char SP = cpu8051_ReadD( _SP_ );\n"; - print INST_IMP "cpu8051_WriteI( ++SP, ( cpu8051.pc & 0x00FF ) );\n"; - print INST_IMP "cpu8051_WriteI( ++SP, ( cpu8051.pc >> 8 ) );\n"; - print INST_IMP "cpu8051_WriteD( _SP_, SP );\n"; + cfw("stack_push16(cpu8051.pc);"); } # LCALL if ($insttype[$i] == 7) { - print INST_IMP "unsigned char SP = cpu8051_ReadD( _SP_ );\n"; - print INST_IMP "cpu8051_WriteI( ++SP, ( cpu8051.pc & 0x00FF ) );\n"; - print INST_IMP "cpu8051_WriteI( ++SP, ( cpu8051.pc >> 8 ) );\n"; - print INST_IMP "cpu8051_WriteD( _SP_, SP );\n"; + cfw("stack_push16(cpu8051.pc);"); } # RRC if ($insttype[$i] == 8) { - print INST_IMP "unsigned char tmpval = destination;\n"; - print INST_IMP "destination = ( destination >> 1 ) | ( cpu8051_ReadD( _PSW_ ) & 0x80 );\n"; - print INST_IMP "cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) & 0x7F ) | ( tmpval << 7 ) );\n"; + cfw("unsigned char new_cy = destination & 0x01;"); + cfw("destination = ( destination >> 1 ) | (psw_read_cy() << 7);"); + cfw("psw_write_cy(new_cy);"); } # DEC if ($insttype[$i] == 9) { - print INST_IMP "destination--;\n"; + cfw("destination--;"); } # JB if ($insttype[$i] == 10) { - print INST_IMP "if ( destination == 1 ) { cpu8051.pc = source; }\n"; + cfw("if ( destination == 1 ) { cpu8051.pc = source; }"); } # RET if ($insttype[$i] == 11) { - 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"; + cfw("cpu8051.pc = stack_pop16();"); } # RL if ($insttype[$i] == 12) { - print INST_IMP "destination = ( destination << 1 ) | ( destination >> 7 );\n"; + cfw("destination = ( destination << 1 ) | ( destination >> 7 );"); } # ADD if ($insttype[$i] == 13) { - print INST_IMP "cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) & 0x3B ) );\n"; - print INST_IMP "if ( destination + source > 0xFF ) {\n"; - 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_ ) | 0x40 ) );\n"; - print INST_IMP "destination += source;\n"; + cfw("psw_clr_cy();"); + cfw("psw_clr_ac();"); + cfw("psw_clr_ov();"); + # The Overflow (OV) bit is set if there is a carry-out of bit 6 or + # out of bit 7, but not both. In other words, if the addition of the + # Accumulator, operand and (in the case of ADDC) the Carry flag + # treated as signed values results in a value that is out of the + # range of a signed byte (-128 through +127) the Overflow flag is + # set. Otherwise, the Overflow flag is cleared. + cfw("if ( destination + source > 0xFF ) {"); + # Carry from bit 7 + cfw(" psw_set_cy();"); + # If no carry from bit 6, set OV + cfw(" if (((destination & 0x7F) + (source & 0x7F)) < 0x80)"); + cfw(" psw_set_ov();"); + # If no carry from bit 7, but caary from bit 6, set OV + cfw("} else if (((destination & 0x7F) + (source & 0x7F)) > 0x7F ) psw_set_ov();"); + cfw("if (((destination & 0x0F) + (source & 0x0F)) > 0x0F) psw_set_ac();"); + cfw("destination += source;"); } # JNB if ($insttype[$i] == 14) { - print INST_IMP "if ( destination == 0 ) { cpu8051.pc = source; }\n"; + cfw("if ( destination == 0 ) { cpu8051.pc = source; }"); } # RETI if ($insttype[$i] == 15) { - print INST_IMP "cpu8051.active_priority = -1;\n"; - 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"; + cfw("cpu8051.active_priority = -1;"); + cfw("cpu8051.pc = stack_pop16();"); } # RLC if ($insttype[$i] == 16) { - print INST_IMP "unsigned char tmpval = destination;\n"; - print INST_IMP "destination = ( destination << 1 ) | ( ( cpu8051_ReadD( _PSW_ ) & 0x80 ) >> 7 );\n"; - print INST_IMP "cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) & 0x7F ) | ( tmpval & 0x80 ) );\n"; + cfw("unsigned char new_cy = destination & 0x80;"); + cfw("destination = ( destination << 1 ) | psw_read_cy();"); + cfw("psw_write_cy(new_cy);"); } # ADDC if ($insttype[$i] == 17) { - print INST_IMP "unsigned char carryflag = ( cpu8051_ReadD( _PSW_ ) >> 7 );\n"; - print INST_IMP "cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) & 0x3B ) );\n"; - print INST_IMP "if ( destination + source + carryflag > 0xFF ) {\n"; - print INST_IMP " cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x80 ) );\n"; - print INST_IMP " if ( ( destination & 0x7F ) + ( source & 0x7F ) + carryflag < 0x80 ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x04 ) );\n"; - print INST_IMP "} else if ( ( destination & 0x7F ) + ( source & 0x7F ) + carryflag > 0x7F ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x04 ) );\n"; - print INST_IMP "if ( ( destination & 0x0F ) + ( source & 0x0F ) + carryflag > 0x0F ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x40 ) );\n"; - print INST_IMP "destination += source;\n"; + cfw("unsigned char carryflag = psw_read_cy();"); + cfw("psw_clr_cy();"); + cfw("psw_clr_ac();"); + cfw("psw_clr_ov();"); + cfw("if ( destination + source + carryflag > 0xFF ) {"); + cfw(" psw_set_cy();"); + cfw(" if (((destination & 0x7F) + (source & 0x7F) + carryflag) < 0x80);"); + cfw(" psw_set_ov();"); + cfw("} else if (((destination & 0x7F) + (source & 0x7F) + carryflag) > 0x7F) psw_set_ov();"); + cfw("if (((destination & 0x0F) + (source & 0x0F) + carryflag) > 0x0F) psw_set_ac();"); + cfw("destination += source;"); } # JC if ($insttype[$i] == 18) { - print INST_IMP "if ( cpu8051_ReadD( _PSW_ ) > 0x7F) { cpu8051.pc = destination; }\n"; + cfw("if (psw_read_cy()) { cpu8051.pc = destination; }"); } # ORL if ($insttype[$i] == 19) { - print INST_IMP "destination |= source;\n"; + cfw("destination |= source;"); } # JNC if ($insttype[$i] == 20) { - print INST_IMP "if ( cpu8051_ReadD( _PSW_ ) < 0x80 ) { cpu8051.pc = destination; }\n"; + cfw("if (psw_read_cy() == 0) { cpu8051.pc = destination; }"); } # ANL if ($insttype[$i] == 21) { - print INST_IMP "destination &= source;\n"; + cfw("destination &= source;"); } # JZ if ($insttype[$i] == 22) { - print INST_IMP "if ( cpu8051_ReadD( _ACC_ ) == 0 ) { cpu8051.pc = destination; }\n"; + cfw("if ( cpu8051_ReadD( _ACC_ ) == 0 ) { cpu8051.pc = destination; }"); } # XRL if ($insttype[$i] == 23) { - print INST_IMP "destination ^= source;\n"; + cfw("destination ^= source;"); } # JNZ if ($insttype[$i] == 24) { - print INST_IMP "if ( cpu8051_ReadD( _ACC_ ) != 0 ) { cpu8051.pc = destination; }\n"; + cfw("if ( cpu8051_ReadD( _ACC_ ) != 0 ) { cpu8051.pc = destination; }"); } # JMP if ($insttype[$i] == 25) { - print INST_IMP "cpu8051.pc = destination;\n"; + cfw("cpu8051.pc = destination;"); } # MOV if ($insttype[$i] == 26) { - print INST_IMP "destination = source;\n"; + cfw("destination = source;"); } # SJMP if ($insttype[$i] == 27) { - print INST_IMP "cpu8051.pc = destination;\n"; + cfw("cpu8051.pc = destination;"); } # MOVC if ($insttype[$i] == 28) { - print INST_IMP "destination = source;\n"; + cfw("destination = source;"); } # DIV if ($insttype[$i] == 29) { - print INST_IMP "unsigned char A = cpu8051_ReadD( _ACC_ ), B = cpu8051_ReadD( _B_ );\n"; - print INST_IMP "cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) & 0x7B ) );\n"; - print INST_IMP "if ( B != 0 ) {\n"; - print INST_IMP "cpu8051_WriteD( _ACC_, A/B ); cpu8051_WriteD( _B_, A%B );\n"; - print INST_IMP "} else cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x04 ) );\n"; + # A = destination + # B = source + cfw("psw_clr_cy();"); + # If B is zero, the OV flag will be set indicating a + # division-by-zero error + cfw("if (source != 0) {"); + cfw(" cpu8051_WriteD(_ACC_, destination/source);"); + cfw(" cpu8051_WriteD( _B_, destination%source);"); + cfw(" psw_clr_ov();"); + cfw("} else {"); + cfw(" psw_set_ov();"); + cfw("}"); } # SUBB if ($insttype[$i] == 30) { - print INST_IMP "unsigned char carryflag = cpu8051_ReadD( _PSW_ ) >> 7;\n"; - print INST_IMP "cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) & 0x3B ) );\n"; - print INST_IMP "if ( destination < ( source + carryflag ) ) {\n"; - print INST_IMP " cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x80 ) );\n"; - print INST_IMP " if ( ( destination & 0x7F ) > ( ( source + carryflag ) & 0x7F ) ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x04 ) );\n"; - print INST_IMP "} else if ( ( destination & 0x7F ) < ( ( source + carryflag ) & 0x7F ) ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x04 ) );\n"; - print INST_IMP "if ( ( destination & 0x0F ) < ( ( source + carryflag ) & 0x0F ) ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x40 ) );\n"; - print INST_IMP "destination -= source + carryflag;\n"; + cfw("unsigned char carryflag = psw_read_cy();"); + cfw("psw_clr_cy();"); + cfw("psw_clr_ac();"); + cfw("psw_clr_ov();"); + cfw("if ( destination < ( source + carryflag ) ) {"); + cfw(" psw_set_cy();"); + cfw(" if ((destination & 0x7F) > ((source + carryflag) & 0x7F)) psw_set_ov();"); + cfw("} else if ((destination & 0x7F) < ((source + carryflag) & 0x7F)) psw_set_ov();"); + cfw("if ((destination & 0x0F) < ((source + carryflag) & 0x0F)) psw_set_ac();"); + cfw("destination -= source + carryflag;"); } # MUL if ($insttype[$i] == 31) { - print INST_IMP "unsigned char A = cpu8051_ReadD( _ACC_ ), B = cpu8051_ReadD( _B_ );\n"; - print INST_IMP "cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) & 0x7B ) );\n"; - print INST_IMP "cpu8051_WriteD( _ACC_ , ( ( A * B ) & 0x00FF ) ); cpu8051_WriteD( _B_, ( A * B ) / 0x100 );\n"; - print INST_IMP "if ( cpu8051_ReadD( _B_ ) > 0) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x04 ) );\n"; + # A = destination + # B = source + cfw("psw_clr_cy();"); + cfw("cpu8051_WriteD(_ACC_, destination * source);"); + cfw("cpu8051_WriteD(_B_, (destination * source) / 0x100);"); + cfw("if (cpu8051_ReadD(_B_) > 0)"); + cfw(" psw_set_ov();"); + cfw("else"); + cfw(" psw_clr_ov();"); } # CPL if ($insttype[$i] == 33) { - if ($instargs[$i*4+1] == 2) { print INST_IMP "destination ^= 0xFF;\n"; } - else { print INST_IMP "destination ^= 0x01;\n"; } + if ($instargs[$i*4+1] == 2) { cfw("destination ^= 0xFF;"); } + else { cfw("destination ^= 0x01;"); } } # CJNE if ($insttype[$i] == 34) { - 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; else cpu8051.pc++; \n"; + cfw("unsigned int reladdr = ((char) memory_read8(PGM_MEM_ID, cpu8051.pc)) + (cpu8051.pc + 1);"); + cfw("psw_clr_cy();"); + cfw("if ( destination < source ) psw_set_cy();"); + cfw("if ( destination != source ) cpu8051.pc = reladdr; else cpu8051.pc++;"); } # PUSH if ($insttype[$i] == 35) { - print INST_IMP "unsigned char SP = cpu8051_ReadD( _SP_ );\n"; - print INST_IMP "cpu8051_WriteI( ++SP, destination );\n"; - print INST_IMP "cpu8051_WriteD( _SP_, SP );\n"; + cfw("stack_push8(destination);"); } # CLR if ($insttype[$i] == 36) { - print INST_IMP "destination = 0;\n"; + cfw("destination = 0;"); } # SWAP if ($insttype[$i] == 37) { - print INST_IMP "destination = ( destination << 4 ) + ( destination >> 4 );\n"; + cfw("destination = ( destination << 4 ) + ( destination >> 4 );"); } # XCH if ($insttype[$i] == 38) { - print INST_IMP "unsigned char tmpval = destination;\n"; - print INST_IMP "destination = source; source = tmpval;\n"; + cfw("unsigned char tmpval = destination;"); + cfw("destination = source; source = tmpval;"); $modifysrc=1; } # POP if ($insttype[$i] == 39) { - print INST_IMP "unsigned char SP = cpu8051_ReadD( _SP_ );\n"; - print INST_IMP "destination = cpu8051_ReadI( SP-- );\n"; - print INST_IMP "cpu8051_WriteD( _SP_, SP );\n"; + cfw("destination = stack_pop8();"); } # SETB if ($insttype[$i] == 40) { - print INST_IMP "destination = 1;\n"; + cfw("destination = 1;"); } # DA if ($insttype[$i] == 41) { - print INST_IMP "if ( ( ( destination & 0x0F ) > 9) || ( cpu8051_ReadD( _PSW_ ) | 0x40)) {\n"; - print INST_IMP " if ( ( destination + 6 ) > 0xFF) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x80 ) );\n"; - print INST_IMP " destination += 6;\n"; - print INST_IMP "}\n"; - print INST_IMP "if ( ( cpu8051_ReadD( _PSW_ ) & 0x80) || ( ( destination & 0xF0 ) > 0x90 ) ) {\n"; - print INST_IMP " if ( ( destination + 0x60 ) > 0xFF ) cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) | 0x80 ) );\n"; - print INST_IMP " destination += 0x60;\n"; - print INST_IMP "}\n"; + cfw("if (((destination & 0x0F) > 9) || psw_read_ac()) {"); + cfw(" if ( ( destination + 6 ) > 0xFF) psw_set_cy();"); + cfw(" destination += 6;"); + cfw("}"); + cfw("if ( psw_read_cy() || ( ( destination & 0xF0 ) > 0x90 ) ) {"); + cfw(" if ( ( destination + 0x60 ) > 0xFF ) psw_set_cy();"); + cfw(" destination += 0x60;"); + cfw("}"); } # DJNZ if ($insttype[$i] == 42) { - print INST_IMP "destination--;\n"; - print INST_IMP "if ( destination != 0 ) cpu8051.pc = source;\n"; + cfw("destination--;"); + cfw("if ( destination != 0 ) cpu8051.pc = source;"); } # XCHD if ($insttype[$i] == 43) { - print INST_IMP "unsigned char tmpval = ( destination & 0x0F );\n"; - print INST_IMP "destination = ( destination & 0xF0 ) + ( source & 0x0F );\n"; - print INST_IMP "source = ( source & 0xF0 ) + tmpval;\n"; + cfw("unsigned char tmpval = ( destination & 0x0F );"); + cfw("destination = ( destination & 0xF0 ) + ( source & 0x0F );"); + cfw("source = ( source & 0xF0 ) + tmpval;"); $modifysrc=1; } # MOVX if ($insttype[$i] == 44) { - print INST_IMP "destination = source;\n"; + cfw("destination = source;"); } @@ -678,62 +681,62 @@ 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 "cpu8051.pc = ( cpu8051.pc & 0xF800 ) | addr11;\n"; + cfw("cpu8051.pc = ( cpu8051.pc & 0xF800 ) | addr11;"); } if ($op_destination == 1) { # addr16 - print INST_IMP "cpu8051.pc = addr16;\n"; + cfw("cpu8051.pc = addr16;"); } if ($op_destination == 2) { # A - print INST_IMP "cpu8051_WriteD( _ACC_, destination );\n"; + cfw("cpu8051_WriteD( _ACC_, destination );"); } if ($op_destination == 3) { # direct - print INST_IMP "cpu8051_WriteD( destaddr, destination );\n"; + cfw("cpu8051_WriteD( destaddr, destination );"); } if ($op_destination == 4) { # @R0 - print INST_IMP "cpu8051_WriteI( cpu8051_ReadD( BANKPSW + _R0_ ), destination );\n"; + cfw("cpu8051_WriteI( cpu8051_ReadD( BANKPSW + _R0_ ), destination );"); } if ($op_destination == 5) { # @R1 - print INST_IMP "cpu8051_WriteI( cpu8051_ReadD( BANKPSW + _R1_ ), destination );\n"; + cfw("cpu8051_WriteI( cpu8051_ReadD( BANKPSW + _R1_ ), destination );"); } if ($op_destination == 6) { # R0 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R0_, destination );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R0_, destination );"); } if ($op_destination == 7) { # R1 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R1_, destination );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R1_, destination );"); } if ($op_destination == 8) { # R2 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R2_, destination );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R2_, destination );"); } if ($op_destination == 9) { # R3 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R3_, destination );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R3_, destination );"); } if ($op_destination == 10) { # R4 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R4_, destination );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R4_, destination );"); } if ($op_destination == 11) { # R5 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R5_, destination );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R5_, destination );"); } if ($op_destination == 12) { # R6 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R6_, destination );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R6_, destination );"); } if ($op_destination == 13) { # R7 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R7_, destination );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R7_, destination );"); } if ($op_destination == 14) { # bitaddr - print INST_IMP "cpu8051_WriteB( dstbitaddr, destination );\n"; + cfw("cpu8051_WriteB( dstbitaddr, destination );"); } if ($op_destination == 17) { # C - print INST_IMP "cpu8051_WriteD( _PSW_, ( ( cpu8051_ReadD( _PSW_ ) & 0x7F) | ( destination << 7 ) ) );\n"; + cfw("psw_write_cy(destination);"); } if ($op_destination == 21) { # DPTR - print INST_IMP "memory_sfr_write_dptr(destination);\n"; + cfw("memory_sfr_write_dptr(destination);"); } if ($op_destination == 23) { # /bitaddr - print INST_IMP "cpu8051_WriteB( dstbitaddr, destination );\n"; + cfw("cpu8051_WriteB( dstbitaddr, destination );"); } if ($op_destination == 24) { # @DPTR - print INST_IMP "cpu8051_WriteI(memory_sfr_read_dptr(), destination);\n"; + cfw("cpu8051_WriteI(memory_sfr_read_dptr(), destination);"); } } @@ -741,68 +744,68 @@ for ($i=0 ; $i< 256; $i++) { if ($instargs[$i*4] > 1) { $op_source=$instargs[$i*4+2]; if ($op_source == 0) { # addr11 - print INST_IMP "cpu8051.pc = ( cpu8051.pc & 0xF800 ) | addr11;\n"; + cfw("cpu8051.pc = ( cpu8051.pc & 0xF800 ) | addr11;"); } if ($op_source == 1) { # addr16 - print INST_IMP "cpu8051.pc = addr16;\n"; + cfw("cpu8051.pc = addr16;"); } if ($op_source == 2) { # A - print INST_IMP "cpu8051_WriteD( _ACC_, source );\n"; + cfw("cpu8051_WriteD( _ACC_, source );"); } if ($op_source == 3) { # direct - print INST_IMP "cpu8051_WriteD( srcaddr, source );\n"; + cfw("cpu8051_WriteD( srcaddr, source );"); } if ($op_source == 4) { # @R0 - print INST_IMP "cpu8051_WriteI( cpu8051_ReadD( BANKPSW + _R0_ ), source );\n"; + cfw("cpu8051_WriteI( cpu8051_ReadD( BANKPSW + _R0_ ), source );"); } if ($op_source == 5) { # @R1 - print INST_IMP "cpu8051_WriteI( cpu8051_ReadD( BANKPSW + _R1_ ), source );\n"; + cfw("cpu8051_WriteI( cpu8051_ReadD( BANKPSW + _R1_ ), source );"); } if ($op_source == 6) { # R0 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R0_, source );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R0_, source );"); } if ($op_source == 7) { # R1 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R1_, source );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R1_, source );"); } if ($op_source == 8) { # R2 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R2_, source );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R2_, source );"); } if ($op_source == 9) { # R3 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R3_, source );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R3_, source );"); } if ($op_source == 10) { # R4 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R4_, source );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R4_, source );"); } if ($op_source == 11) { # R5 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R5_, source );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R5_, source );"); } if ($op_source == 12) { # R6 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R6_, source );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R6_, source );"); } if ($op_source == 13) { # R7 - print INST_IMP "cpu8051_WriteD( BANKPSW + _R7_, source );\n"; + cfw("cpu8051_WriteD( BANKPSW + _R7_, source );"); } if ($op_source == 14) { # bitaddr - print INST_IMP "cpu8051_WriteB( srcbitaddr, source );\n"; + cfw("cpu8051_WriteB( srcbitaddr, source );"); } if ($op_source == 17) { # C - print INST_IMP "cpu8051_WriteD( _PSW_, ( ( cpu8051_ReadD( _PSW_ ) & 0x7F) | ( source << 7 ) ) );\n"; + cfw("psw_write_cy(source);"); } if ($op_source == 21) { # DPTR - print INST_IMP "memory_sfr_write_dptr(source);\n"; + cfw("memory_sfr_write_dptr(source);"); } if ($op_source == 23) { # /bitaddr - print INST_IMP "cpu8051_WriteB( srcbitaddr, source );\n"; + cfw("cpu8051_WriteB( srcbitaddr, source );"); } if ($op_source == 24) { # @DPTR - print INST_IMP "cpu8051_WriteI(memory_sfr_read_dptr(), source);\n"; + cfw("cpu8051_WriteI(memory_sfr_read_dptr(), source);"); } } } } - print INST_IMP "return $a_cycles[$i];\n"; + cfw("return $a_cycles[$i];"); print INST_IMP "}\n"; - print INST_IMP "\n\n"; + print INST_IMP "\n"; } # ------------------------------------------------------------------------------ @@ -810,28 +813,7 @@ for ($i=0 ; $i< 256; $i++) { # Header for instructions_8051.h print INST_DEF "/*\n"; print INST_DEF " * instructions_8051.h\n"; -print INST_DEF " *\n"; -print INST_DEF " * Do not modify this file directly, as it was created by opcode2c.pl\n"; -print INST_DEF " * Any modifications made directly to this file will be lost.\n"; -print INST_DEF " *\n"; -print INST_DEF " * Copyright (C) 1999 Jonathan St-André\n"; -print INST_DEF " * Copyright (C) 1999 Hugo Villeneuve \n"; -print INST_DEF " *\n"; -print INST_DEF " * This program is free software; you can redistribute it and/or modify\n"; -print INST_DEF " * it under the terms of the GNU General Public License as published by\n"; -print INST_DEF " * the Free Software Foundation; either version 2 of the License, or\n"; -print INST_DEF " * (at your option) any later version.\n"; -print INST_DEF " *\n"; -print INST_DEF " * This program is distributed in the hope that it will be useful,\n"; -print INST_DEF " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"; -print INST_DEF " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"; -print INST_DEF " * GNU General Public License for more details.\n"; -print INST_DEF " *\n"; -print INST_DEF " * You should have received a copy of the GNU General Public License\n"; -print INST_DEF " * along with this program; if not, write to the Free Software\n"; -print INST_DEF " * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n"; -print INST_DEF "*/\n\n"; - +write_header(INST_DEF); 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";