X-Git-Url: http://gitweb.hugovil.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fopcode2c.pl;h=da2f235ab2b46d1d24bbbdcd24c309202cb3b85e;hb=82819ebb72819f4a39c5a9aa95fbb2cef22d510f;hp=a72c8f766319c9888f71a039bb8d93b79c312368;hpb=3615ed71ecaa97d539debdf803fa5f3ea21e4a1e;p=emu8051.git diff --git a/src/opcode2c.pl b/src/opcode2c.pl index a72c8f7..da2f235 100755 --- a/src/opcode2c.pl +++ b/src/opcode2c.pl @@ -51,6 +51,7 @@ 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 @@ -287,7 +288,7 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP "unsigned char destination = memory_read8( PGM_MEM_ID, cpu8051.pc++ );\n"; } if ($op_destination == 17) { # C - print INST_IMP "unsigned char destination = ( cpu8051_ReadD( _PSW_ ) >> 7 );\n"; + print INST_IMP "unsigned char destination = psw_read_cy();\n"; } if ($op_destination == 18) { # @A+DPTR print INST_IMP "unsigned int destination = cpu8051_ReadD( _ACC_ ) + memory_sfr_read_dptr();\n"; @@ -372,7 +373,7 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP "unsigned char source = memory_read8( PGM_MEM_ID, (cpu8051.pc)++ );\n"; } if ($op_source == 17) { # C - print INST_IMP "unsigned char source = ( cpu8051_ReadD( _PSW_ ) >> 7 );\n"; + print INST_IMP "unsigned char source = psw_read_cy();\n"; } 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"; @@ -417,25 +418,19 @@ for ($i=0 ; $i< 256; $i++) { # 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"; + print INST_IMP "stack_push16(cpu8051.pc);\n"; } # 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"; + print INST_IMP "stack_push16(cpu8051.pc);\n"; } # 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"; + print INST_IMP "unsigned char new_cy = destination & 0x01;\n"; + print INST_IMP "destination = ( destination >> 1 ) | (psw_read_cy() << 7);\n"; + print INST_IMP "psw_write_cy(new_cy);\n"; } # DEC @@ -450,10 +445,7 @@ for ($i=0 ; $i< 256; $i++) { # 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"; + print INST_IMP "cpu8051.pc = stack_pop16();\n"; } # RL @@ -463,12 +455,24 @@ for ($i=0 ; $i< 256; $i++) { # ADD if ($insttype[$i] == 13) { - print INST_IMP "cpu8051_WriteD( _PSW_, ( cpu8051_ReadD( _PSW_ ) & 0x3B ) );\n"; + print INST_IMP "psw_clr_cy();\n"; + print INST_IMP "psw_clr_ac();\n"; + print INST_IMP "psw_clr_ov();\n"; + # 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. 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"; + # Carry from bit 7 + print INST_IMP " psw_set_cy();\n"; + # If no carry from bit 6, set OV + print INST_IMP " if (((destination & 0x7F) + (source & 0x7F)) < 0x80)\n"; + print INST_IMP " psw_set_ov();\n"; + # If no carry from bit 7, but caary from bit 6, set OV + print INST_IMP "} else if (((destination & 0x7F) + (source & 0x7F)) > 0x7F ) psw_set_ov();\n"; + print INST_IMP "if (((destination & 0x0F) + (source & 0x0F)) > 0x0F) psw_set_ac();\n"; print INST_IMP "destination += source;\n"; } @@ -480,34 +484,34 @@ for ($i=0 ; $i< 256; $i++) { # 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"; + print INST_IMP "cpu8051.pc = stack_pop16();\n"; } # 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"; + print INST_IMP "unsigned char new_cy = destination & 0x80;\n"; + print INST_IMP "destination = ( destination << 1 ) | psw_read_cy();\n"; + print INST_IMP "psw_write_cy(new_cy);\n"; } # 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 "unsigned char carryflag = psw_read_cy();\n"; + print INST_IMP "psw_clr_cy();\n"; + print INST_IMP "psw_clr_ac();\n"; + print INST_IMP "psw_clr_ov();\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 " psw_set_cy();\n"; + print INST_IMP " if (((destination & 0x7F) + (source & 0x7F) + carryflag) < 0x80);\n"; + print INST_IMP " psw_set_ov();\n"; + print INST_IMP "} else if (((destination & 0x7F) + (source & 0x7F) + carryflag) > 0x7F) psw_set_ov();\n"; + print INST_IMP "if (((destination & 0x0F) + (source & 0x0F) + carryflag) > 0x0F) psw_set_ac();\n"; print INST_IMP "destination += source;\n"; } # JC if ($insttype[$i] == 18) { - print INST_IMP "if ( cpu8051_ReadD( _PSW_ ) > 0x7F) { cpu8051.pc = destination; }\n"; + print INST_IMP "if (psw_read_cy()) { cpu8051.pc = destination; }\n"; } # ORL @@ -517,7 +521,7 @@ for ($i=0 ; $i< 256; $i++) { # JNC if ($insttype[$i] == 20) { - print INST_IMP "if ( cpu8051_ReadD( _PSW_ ) < 0x80 ) { cpu8051.pc = destination; }\n"; + print INST_IMP "if (psw_read_cy() == 0) { cpu8051.pc = destination; }\n"; } # ANL @@ -563,30 +567,41 @@ for ($i=0 ; $i< 256; $i++) { # 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 "psw_clr_cy();\n"; + # If B is zero, the OV flag will be set indicating a + # division-by-zero error 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"; + print INST_IMP " cpu8051_WriteD( _ACC_, A/B ); cpu8051_WriteD( _B_, A%B );\n"; + print INST_IMP " psw_clr_ov();\n"; + print INST_IMP "} else {\n"; + print INST_IMP " psw_set_ov();\n"; + print INST_IMP "}\n"; } # 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 "unsigned char carryflag = psw_read_cy();\n"; + print INST_IMP "psw_clr_cy();\n"; + print INST_IMP "psw_clr_ac();\n"; + print INST_IMP "psw_clr_ov();\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 " psw_set_cy();\n"; + print INST_IMP " if ((destination & 0x7F) > ((source + carryflag) & 0x7F)) psw_set_ov();\n"; + print INST_IMP "} else if ((destination & 0x7F) < ((source + carryflag) & 0x7F)) psw_set_ov();\n"; + print INST_IMP "if ((destination & 0x0F) < ((source + carryflag) & 0x0F)) psw_set_ac();\n"; print INST_IMP "destination -= source + carryflag;\n"; } # 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 "psw_clr_cy();\n"; + print INST_IMP "psw_clr_ov();\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"; + print INST_IMP "if (cpu8051_ReadD(_B_) > 0)\n"; + print INST_IMP " psw_set_ov();\n"; + print INST_IMP "else\n"; + print INST_IMP " psw_clr_ov();\n"; } # CPL @@ -598,16 +613,14 @@ for ($i=0 ; $i< 256; $i++) { # 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 "psw_clr_cy();\n"; + print INST_IMP "if ( destination < source ) psw_set_cy();\n"; print INST_IMP "if ( destination != source ) cpu8051.pc = reladdr; else cpu8051.pc++; \n"; } # 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"; + print INST_IMP "stack_push8(destination);\n"; } # CLR @@ -629,9 +642,7 @@ for ($i=0 ; $i< 256; $i++) { # 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"; + print INST_IMP "destination = stack_pop8();\n"; } # SETB @@ -641,12 +652,12 @@ for ($i=0 ; $i< 256; $i++) { # 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 "if (((destination & 0x0F) > 9) || psw_read_ac()) {\n"; + print INST_IMP " if ( ( destination + 6 ) > 0xFF) psw_set_cy();\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 "if ( psw_read_cy() || ( ( destination & 0xF0 ) > 0x90 ) ) {\n"; + print INST_IMP " if ( ( destination + 0x60 ) > 0xFF ) psw_set_cy();\n"; print INST_IMP " destination += 0x60;\n"; print INST_IMP "}\n"; } @@ -724,7 +735,7 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP "cpu8051_WriteB( dstbitaddr, destination );\n"; } if ($op_destination == 17) { # C - print INST_IMP "cpu8051_WriteD( _PSW_, ( ( cpu8051_ReadD( _PSW_ ) & 0x7F) | ( destination << 7 ) ) );\n"; + print INST_IMP "psw_write_cy(destination);\n"; } if ($op_destination == 21) { # DPTR print INST_IMP "memory_sfr_write_dptr(destination);\n"; @@ -786,7 +797,7 @@ for ($i=0 ; $i< 256; $i++) { print INST_IMP "cpu8051_WriteB( srcbitaddr, source );\n"; } if ($op_source == 17) { # C - print INST_IMP "cpu8051_WriteD( _PSW_, ( ( cpu8051_ReadD( _PSW_ ) & 0x7F) | ( source << 7 ) ) );\n"; + print INST_IMP "psw_write_cy(source);\n"; } if ($op_source == 21) { # DPTR print INST_IMP "memory_sfr_write_dptr(source);\n";