diff options
Diffstat (limited to 'lib/simulator/engine/engine_instructions.tcl')
-rw-r--r--[-rwxr-xr-x] | lib/simulator/engine/engine_instructions.tcl | 184 |
1 files changed, 97 insertions, 87 deletions
diff --git a/lib/simulator/engine/engine_instructions.tcl b/lib/simulator/engine/engine_instructions.tcl index d732414..19c45af 100755..100644 --- a/lib/simulator/engine/engine_instructions.tcl +++ b/lib/simulator/engine/engine_instructions.tcl @@ -2,7 +2,7 @@ # Part of MCU 8051 IDE ( http://mcu8051ide.sf.net ) ############################################################################ -# Copyright (C) 2007-2009 by Martin Ošmera # +# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 by Martin Ošmera # # martin.osmera@gmail.com # # # # This program is free software; you can redistribute it and#or modify # @@ -21,6 +21,11 @@ # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ############################################################################ +# >>> File inclusion guard +if { ! [ info exists _ENGINE_INSTRUCTIONS_TCL ] } { +set _ENGINE_INSTRUCTIONS_TCL _ +# <<< File inclusion guard + # -------------------------------------------------------------------------- # DESCRIPTION # Part of simulator engine functionality. @@ -41,7 +46,7 @@ private method ins_acall {haddr laddr} { stack_push [expr {($pc & 255)}] stack_push [expr {($pc & 0xFF00) >> 8}] - incr laddr [expr {$haddr << 8}] + incr laddr [expr {($haddr << 8) | $pc & 0x0f800}] incr run_statistics(6) $this subprograms_call 1 $pc $laddr $this stack_monitor_set_last_values_as 1 2 @@ -70,7 +75,7 @@ private method ins_add_D {addr} { } if {$addr < 128} { ins_add $ram($addr) - } { + } else { ins_add [read_sfr $addr] } } @@ -83,7 +88,7 @@ private method ins_add_ID {addr} { incr_pc 1 if {[check_address_validity I $addr]} { alo_add [undefined_octet] - } { + } else { alo_add $ram($addr) } evaluate_sfr 224 @@ -111,7 +116,7 @@ private method ins_addc_D {addr} { } if {$addr < 128} { ins_addc $ram($addr) - } { + } else { ins_addc [read_sfr $addr] } } @@ -125,7 +130,7 @@ private method ins_addc_ID {addr} { if {[check_address_validity I $addr]} { alo_addc [undefined_octet] return - } { + } else { alo_addc $ram($addr) } } @@ -136,7 +141,7 @@ private method ins_addc_ID {addr} { # @return void private method ins_ajmp {haddr laddr} { set time 2 - incr laddr [expr {$haddr << 8}] + incr laddr [expr {($haddr << 8) | $pc & 0x0f800}] set pc $laddr } @@ -155,7 +160,7 @@ private method ins_anl {addr val} { if {$sync_ena} { $this Simulator_sync_reg $addr } - } { + } else { set rmw_instruction 1 write_sfr $addr [expr {[read_sfr $addr] & $val}] evaluate_sfr $addr @@ -185,7 +190,7 @@ private method ins_anl_A_D {addr} { if {$sync_ena} { $this Simulator_sync_reg $addr } - } { + } else { ins_anl_A [read_sfr $addr] evaluate_sfr $addr } @@ -222,7 +227,7 @@ private method ins_anl_C_N {addr} { set time 2 if {[check_address_validity B $addr]} { setBit $symbol(C) [expr {rand() > 0.5}] - } { + } else { if {[getBit $addr]} {setBit $symbol(C) 0} } evaluate_bit $symbol(C) @@ -235,10 +240,10 @@ private method ins_anl_C_N {addr} { private method ins_cjne_AD {addr roff} { if {[check_address_validity D $addr]} { set val [undefined_octet] - } { + } else { if {$addr < 128} { set val $ram($addr) - } { + } else { set val $sfr($addr) } } @@ -254,15 +259,14 @@ private method ins_cjne {val0 val1 roff} { set time 2 if {$val0 != $val1} { - if {$val0 < $val1} { - setBit $symbol(C) 1 - } { - setBit $symbol(C) 0 - } - if {$roff > 127} {incr roff -256} incr_pc $roff } + if {$val0 < $val1} { + setBit $symbol(C) 1 + } else { + setBit $symbol(C) 0 + } } ## Instruction: CJNE @Ri, ... @@ -275,19 +279,18 @@ private method ins_cjne_ID {addr val1 roff} { if {[check_address_validity I $addr]} { set val0 [undefined_octet] - } { + } else { set val0 $ram($addr) } if {$val0 != $val1} { - if {$val0 < $val1} { - setBit $symbol(C) 1 - } { - setBit $symbol(C) 0 - } - if {$roff > 127} {incr roff -256} incr_pc $roff } + if {$val0 < $val1} { + setBit $symbol(C) 1 + } else { + setBit $symbol(C) 0 + } } ## Instruction: CLR @@ -309,7 +312,7 @@ private method ins_clr {opr} { setBit $symbol(C) 0 evaluate_bit $symbol(C) # Some bit - } { + } else { if {[check_address_validity B $opr]} {return} set rmw_instruction 1 setBit $opr 0 @@ -335,17 +338,17 @@ private method ins_cpl {opr} { } elseif {$opr == {C}} { if {[getBit $symbol(C)]} { setBit $symbol(C) 0 - } { + } else { setBit $symbol(C) 1 } evaluate_bit $symbol(C) # Some bit - } { + } else { if {[check_address_validity B $opr]} {return} set rmw_instruction 1 if {[getBit $opr]} { setBit $opr 0 - } { + } else { setBit $opr 1 } evaluate_bit $opr @@ -423,7 +426,7 @@ private method ins_div {} { setBit $symbol(OV) 1 set sfr(224) 0 set sfr($symbol(B)) 0 - } { + } else { setBit $symbol(OV) 0 set A $sfr(224) set sfr(224) [expr {$A / $sfr($symbol(B))}] @@ -449,7 +452,7 @@ private method ins_djnz {addr roff} { incr_pc $roff } evaluate_sfr $addr - } { + } else { if {$ram($addr) != 0} { if {$roff > 127} {incr roff -256} incr_pc $roff @@ -517,7 +520,7 @@ private method ins_jb {addr roff} { set time 2 if {[check_address_validity B $addr]} { set val [expr {rand() > 0.5}] - } { + } else { set val [getBit $addr] } if {$val} { @@ -534,7 +537,7 @@ private method ins_jnb {addr roff} { set time 2 if {[check_address_validity B $addr]} { set val [expr {rand() > 0.5}] - } { + } else { set val [getBit $addr] } if {!$val} { @@ -552,7 +555,7 @@ private method ins_jbc {addr roff} { set time 2 if {[check_address_validity B $addr]} { set val [expr {rand() > 0.5}] - } { + } else { set val [getBit $addr] } if {$val} { @@ -653,7 +656,7 @@ private method ins_mov {addr val} { if {$sync_ena} { $this Simulator_sync_reg $addr } - } { + } else { write_sfr $addr $val evaluate_sfr $addr } @@ -670,7 +673,7 @@ private method ins_mov_D {addr1 addr0} { if {[check_address_validity D $addr0]} {return} if {[check_address_validity D $addr1]} { set val [undefined_octet] - } { + } else { if {$addr1 < 128} { set val $ram($addr1) } { @@ -686,7 +689,7 @@ private method ins_mov_D {addr1 addr0} { if {$sync_ena} { $this Simulator_sync_reg $addr0 } - } { + } else { write_sfr $addr0 $val evaluate_sfr $addr0 } @@ -699,10 +702,10 @@ private method ins_mov_D {addr1 addr0} { private method ins_mov_ID2 {addr0 addr1} { if {[check_address_validity D $addr1]} { ins_mov_ID0 $addr0 [undefined_octet] - } { + } else { if {$addr1 < 128} { ins_mov_ID0 $addr0 $ram($addr1) - } { + } else { ins_mov_ID0 $addr0 [read_sfr $addr1] } } @@ -720,7 +723,7 @@ private method ins_mov_ID1 {addr addr_id} { if {[check_address_validity D $addr]} {return} if {[check_address_validity I $addr_id]} { set val [undefined_octet] - } { + } else { set val $ram($addr_id) } if {$addr < 128} { @@ -731,7 +734,7 @@ private method ins_mov_ID1 {addr addr_id} { if {$sync_ena} { $this Simulator_sync_reg $addr } - } { + } else { write_sfr $addr $val evaluate_sfr $addr } @@ -788,7 +791,7 @@ private method ins_mov_Rx_ADDR {idx addr} { } if {$addr < 128} { set ram($t_addr) $ram($addr) - } { + } else { set ram($t_addr) [read_sfr $addr] } @@ -806,21 +809,21 @@ private method ins_mov_bit {dest source} { if {$dest == {C}} { if {[check_address_validity B $source]} { set val [expr {rand() < 0.5}] - } { + } else { set val [getBit $source] } if {$val} { setBit $symbol(C) 1 - } { + } else { setBit $symbol(C) 0 } - } { + } else { set rmw_instruction 1 incr time if {[check_address_validity B $dest]} {return} if {[getBit $symbol(C)]} { setBit $dest 1 - } { + } else { setBit $dest 0 } } @@ -837,7 +840,7 @@ private method ins_movc {arg} { if {$arg == {DPTR}} { set addr [expr {($sfr(224) + $sfr($symbol($DPL))) + ($sfr($symbol($DPH)) << 8)}] # MOVC A, @A+PC - } { + } else { set addr $pc incr addr $sfr(224) } @@ -853,7 +856,7 @@ private method ins_movc {arg} { set sfr(224) [undefined_octet] } elseif {$code($addr) != {}} { set sfr(224) $code($addr) - } { + } else { set sfr(224) [undefined_octet] } @@ -885,14 +888,14 @@ private method ins_movx {opr0 opr1} { if {$Saddr < $eram_size && !$controllers_conf(EXTRAM)} { if {[check_address_validity E $Saddr]} { set sfr(224) [undefined_octet] - } { + } else { set sfr(224) $eram($Saddr) } # Read from data EEPROM } elseif {$Saddr < $eeprom_size && $controllers_conf(EEMEN)} { if {[check_address_validity P $Saddr]} { set sfr(224) [undefined_octet] - } { + } else { set complement_MSB 0 foreach reg $eeprom_prev { if {$Saddr == [lindex $reg 0]} { @@ -902,13 +905,13 @@ private method ins_movx {opr0 opr1} { } if {$complement_MSB} { set sfr(224) [expr {$eeprom($Saddr) ^ 0x80}] - } { + } else { set sfr(224) $eeprom($Saddr) } } # Read from external data memory } else { - if {$feature_avaliable(xram) && [$this pale_is_enabled]} { + if {$feature_available(xram) && [$this pale_is_enabled]} { for {set i -3} {$i < 0} {incr i} { if {!$controllers_conf(X2)} { $this pale_WPBBL $PIN(RD) {X} $i @@ -918,7 +921,7 @@ private method ins_movx {opr0 opr1} { $this pale_WPBBL $PIN(RD) {X} $i $this pale_WPBL 0 X $i $this pale_WPBL 2 X $i - } { + } else { incr i $this pale_WPBL 0 X [expr {int($i / 2)}] $this pale_WPBL 2 X [expr {int($i / 2)}] @@ -928,7 +931,7 @@ private method ins_movx {opr0 opr1} { } if {[check_address_validity X $Saddr]} { set sfr(224) [undefined_octet] - } { + } else { set sfr(224) $xram($Saddr) } } @@ -978,7 +981,7 @@ private method ins_movx {opr0 opr1} { set eeprom_WR_ofs "0x$offset" ::X::eeprom_write_buffer_set_offset $eeprom_WR_ofs $this - # Start EEPROM programing cycle + # Start EEPROM programming cycle if {!$controllers_conf(EELD)} { # Write data to data EEPROM set eeprom_prev {} @@ -993,7 +996,7 @@ private method ins_movx {opr0 opr1} { set eeprom_WR_buff($i) {} } - # Clear write buffer hexeditor + # Clear write buffer hex editor ::X::eeprom_write_buffer_set_offset {} $this ::X::clear_eeprom_write_buffer $this @@ -1017,7 +1020,7 @@ private method ins_movx {opr0 opr1} { # Write to external data memory } else { - if {$feature_avaliable(xram) && [$this pale_is_enabled]} { + if {$feature_available(xram) && [$this pale_is_enabled]} { for {set i -3} {$i < 0} {incr i} { if {!$controllers_conf(X2)} { $this pale_WPBBL $PIN(WR) {X} $i @@ -1027,7 +1030,7 @@ private method ins_movx {opr0 opr1} { $this pale_WPBBL $PIN(WR) {X} $i $this pale_WPBL 0 X $i $this pale_WPBL 2 X $i - } { + } else { incr i $this pale_WPBL 0 X [expr {int($i / 2)}] $this pale_WPBL 2 X [expr {int($i / 2)}] @@ -1037,6 +1040,7 @@ private method ins_movx {opr0 opr1} { } if {[check_address_validity X $Daddr]} {return} + stepback_reg_change X $Daddr set xram($Daddr) $sfr(224) } @@ -1062,7 +1066,7 @@ private method ins_mul {} { if {$result > 255} { set sfr(240) [expr {($result & 0xFF00) >> 8}] setBit $symbol(OV) 1 - } { + } else { set sfr(240) 0 setBit $symbol(OV) 0 } @@ -1096,7 +1100,7 @@ private method ins_orl {addr val} { if {$sync_ena} { $this Simulator_sync_reg $addr } - } { + } else { set rmw_instruction 1 write_sfr $addr [expr {[read_sfr $addr] | $val}] evaluate_sfr $addr @@ -1113,7 +1117,7 @@ private method ins_orl_D {addr0 addr1} { ins_orl $addr0 [undefined_octet] } elseif {$addr1 < 128} { ins_orl $addr0 $ram($addr1) - } { + } else { ins_orl $addr0 [read_sfr $addr1] } } @@ -1129,7 +1133,7 @@ private method ins_orl_ID {addr addr_id} { if {[check_address_validity D $addr]} {return} if {[check_address_validity I $addr_id]} { set val [undefined_octet] - } { + } else { set val $ram($addr_id) } if {$addr < 128} { @@ -1140,7 +1144,7 @@ private method ins_orl_ID {addr addr_id} { if {$sync_ena} { $this Simulator_sync_reg $addr } - } { + } else { set rmw_instruction 1 write_sfr $addr [expr {[read_sfr $addr] | $val}] evaluate_sfr $addr @@ -1157,7 +1161,7 @@ private method ins_orl_not_bit {addr} { setBit $symbol(C) [expr {rand() < 0.5}] } elseif {[getBit $symbol(C)] || ![getBit $addr]} { setBit $symbol(C) 1 - } { + } else { setBit $symbol(C) 0 } } @@ -1172,7 +1176,7 @@ private method ins_orl_bit {addr} { setBit $symbol(C) [expr {rand() < 0.5}] } elseif {[getBit $symbol(C)] || [getBit $addr]} { setBit $symbol(C) 1 - } { + } else { setBit $symbol(C) 0 } } @@ -1193,7 +1197,7 @@ private method ins_pop {addr} { if {$sync_ena} { $this Simulator_sync_reg $addr } - } { + } else { write_sfr $addr [stack_pop] evaluate_sfr $addr } @@ -1243,13 +1247,15 @@ private method ins_reti {} { $this interrupt_monitor_reti [lindex $inter_in_p_flags end] set interrupts_in_progress [lreplace $interrupts_in_progress end end] set inter_in_p_flags [lreplace $inter_in_p_flags end end] - if {[llength $interrupts_in_progress]} { - set vector [format %X [intr2vector [lindex $interrupts_in_progress end]]] - simulator_Sbar [mc "Interrupt at vector 0x%s " $vector] 1 $this - } { - simulator_Sbar {} 0 $this + if {$::GUI_AVAILABLE} { + if {[llength $interrupts_in_progress]} { + set vector [format %X [intr2vector [lindex $interrupts_in_progress end]]] + simulator_Sbar [mc "Interrupt at vector 0x%s " $vector] 1 $this + } else { + simulator_Sbar {} 0 $this + } } - } { + } else { $this simulator_invalid_reti_dlg $pc $Line($pc) } @@ -1295,7 +1301,7 @@ private method ins_rlc {} { if {$sfr(224) > 255} { incr sfr(224) -256 setBit $symbol(C) 1 - } { + } else { setBit $symbol(C) 0 } @@ -1313,7 +1319,7 @@ private method ins_rr {} { } if {[expr {$sfr(224) % 2}]} { set C 1 - } { + } else { set C 0 } @@ -1335,7 +1341,7 @@ private method ins_rrc {} { } if {[expr {$sfr(224) % 2}]} { set C 1 - } { + } else { set C 0 } @@ -1347,7 +1353,7 @@ private method ins_rrc {} { if {$C} { setBit $symbol(C) 1 - } { + } else { setBit $symbol(C) 0 } @@ -1363,7 +1369,7 @@ private method ins_setb {opr} { if {$opr == {C}} { setBit $symbol(C) 1 - } { + } else { if {[check_address_validity B $opr]} {return} set rmw_instruction 1 setBit $opr 1 @@ -1399,7 +1405,7 @@ private method ins_subb_D {addr} { ins_subb [undefined_octet] } elseif {$addr < 128} { ins_subb $ram($addr) - } { + } else { ins_subb $sfr($addr) } } @@ -1412,7 +1418,7 @@ private method ins_subb_ID {addr} { incr_pc 1 if {[check_address_validity I $addr]} { ins_subb [undefined_octet] - } { + } else { alo_subb $ram($addr) } evaluate_sfr 224 @@ -1457,7 +1463,7 @@ private method ins_xch {addr} { if {$sync_ena} { $this Simulator_sync_reg $addr } - } { + } else { set sfr(224) [read_sfr $addr] write_sfr $addr $A evaluate_sfr $addr @@ -1499,14 +1505,14 @@ private method ins_xchd {addr} { set val [undefined_octet] } elseif {$addr < 128} { set val $ram($addr) - } { + } else { set val $sfr($addr) } if {${::Simulator::reverse_run_steps}} { stepback_reg_change S 224 if {$addr < 128} { stepback_reg_change I $addr - } { + } else { stepback_reg_change S $addr } } @@ -1518,7 +1524,7 @@ private method ins_xchd {addr} { set val [expr {($val & 240) + $nibble0}] if {$addr < 128} { set ram($addr) $val - } { + } else { set sfr($addr) $val } @@ -1545,7 +1551,7 @@ private method ins_xrl {addr val} { if {$sync_ena} { $this Simulator_sync_reg $addr } - } { + } else { set rmw_instruction 1 write_sfr $addr [expr {[read_sfr $addr] ^ $val}] evaluate_sfr $addr @@ -1561,7 +1567,7 @@ private method ins_xrl_D {addr0 addr1} { ins_xrl $addr0 [undefined_octet] } elseif {$addr1 < 128} { ins_xrl $addr0 $ram($addr1) - } { + } else { ins_xrl $addr0 [read_sfr $addr1] } } @@ -1577,7 +1583,7 @@ private method ins_xrl_ID {addr addr_id} { if {[check_address_validity I $addr_id]} { set val [undefined_octet] - } { + } else { set val $ram($addr_id) } if {$addr < 128} { @@ -1588,9 +1594,13 @@ private method ins_xrl_ID {addr addr_id} { if {$sync_ena} { $this Simulator_sync_reg $addr } - } { + } else { set rmw_instruction 1 write_sfr $addr [expr {[read_sfr $addr] ^ $val}] evaluate_sfr $addr } } + +# >>> File inclusion guard +} +# <<< File inclusion guard |