summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabricio Alcalde <f@lcald.com.ar>2013-04-27 15:40:07 +0000
committerAndrej Shadura <andrewsh@debian.org>2018-05-08 15:59:32 +0200
commitf2c36099f70ef41e23ca09bff36a6f83de07b519 (patch)
tree3c14798b7caa7a9837a40e1eb272787dc9a75d89
parent9ac60f8220b3fc4dfe973dfd97b6b7a05a76ae72 (diff)
parent47aa8b00b2b11df13a100489e0f904a4947177ef (diff)
Import Debian changes 1.4.7-1
mcu8051ide (1.4.7-1) unstable; urgency=low * New upstream release. * Fixed spelling error in the manpage.
-rw-r--r--CMakeLists.txt76
-rw-r--r--ChangeLog113
-rw-r--r--MicrosoftWindows_compatibility/external_command.bat1
-rw-r--r--MicrosoftWindows_compatibility/mcu8051ide_win_setup.iss66
-rw-r--r--MicrosoftWindows_compatibility/sdcc.bat2
-rw-r--r--README58
-rw-r--r--TODO15
-rw-r--r--application-x-mcu8051ide.xml11
-rwxr-xr-xclear_all.sh11
-rwxr-xr-xconfigure8
-rw-r--r--data/license.txt (renamed from data/licence.txt)0
-rw-r--r--data/mcus.xml103
-rw-r--r--data/project.dtd12
-rw-r--r--data/tips.xml105
-rw-r--r--debian/README.source2
-rw-r--r--debian/changelog7
-rw-r--r--debian/control25
-rw-r--r--debian/mcu8051ide.113
-rw-r--r--debian/mcu8051ide.install9
-rw-r--r--debian/patches/addlaunchscript.patch9
-rw-r--r--debian/patches/debian-changes-1.3.7-142
-rw-r--r--debian/patches/fixdesktopfile.patch23
-rw-r--r--debian/patches/series3
-rwxr-xr-xdebian/rules5
-rw-r--r--debian/watch21
-rw-r--r--demo/Demo project.mcu8051ide127
-rw-r--r--demo/LCD.adf65
-rw-r--r--demo/LCD.asm52
-rw-r--r--demo/LCD.hex8
-rw-r--r--demo/LCD.lst273
-rw-r--r--demo/LCD.vhc4
-rw-r--r--demo/demo0.adf6
-rw-r--r--demo/demo0.asm4
-rw-r--r--demo/demo0.bin1
-rw-r--r--demo/demo0.hex2
-rw-r--r--demo/demo0.lst14
-rw-r--r--demo/demo0.sim6
-rw-r--r--demo/demo1.adf8
-rw-r--r--demo/demo1.asm10
-rw-r--r--demo/demo1.binbin15 -> 0 bytes
-rw-r--r--demo/demo1.hex6
-rw-r--r--demo/demo1.lst74
-rw-r--r--demo/demo1.sim16
-rw-r--r--demo/demo2.adf60
-rw-r--r--demo/demo2.asm12
-rw-r--r--demo/demo2.binbin42 -> 0 bytes
-rw-r--r--demo/demo2.hex8
-rw-r--r--demo/demo2.lst67
-rw-r--r--demo/demo2.sim47
-rw-r--r--demo/demo3.adf14
-rw-r--r--demo/demo3.asm38
-rw-r--r--demo/demo3.bin1
-rw-r--r--demo/demo3.sim6
-rw-r--r--demo/demo4.adf6
-rw-r--r--demo/demo4.binbin66 -> 0 bytes
-rw-r--r--demo/demo4.hex7
-rw-r--r--demo/demo4.lst253
-rw-r--r--demo/demo4.sim42
-rw-r--r--demo/demo5.adf6
-rw-r--r--demo/demo5.asm2
-rw-r--r--demo/demo5.bin1
-rw-r--r--demo/demo5.hex2
-rw-r--r--demo/demo5.lst4
-rw-r--r--demo/demo5.sim2
-rw-r--r--demo/demo_c_0bin1425 -> 0 bytes
-rw-r--r--demo/demo_c_0.adb106
-rw-r--r--demo/demo_c_0.asm529
-rw-r--r--demo/demo_c_0.c2
-rw-r--r--demo/demo_c_0.hashes2
-rw-r--r--demo/demo_c_0.hex34
-rw-r--r--demo/demo_c_0.lnk19
-rw-r--r--demo/demo_c_0.lst4
-rw-r--r--demo/demo_c_0.map488
-rw-r--r--demo/demo_c_0.mem28
-rw-r--r--demo/demo_c_0.rel378
-rw-r--r--demo/demo_c_0.rst529
-rw-r--r--demo/demo_c_0.sym659
-rw-r--r--demo/file.hex5
-rw-r--r--demo/file.lst92
-rw-r--r--demo/keypad_displaybin1614 -> 0 bytes
-rw-r--r--demo/keypad_display.adb106
-rw-r--r--demo/keypad_display.asm624
-rw-r--r--demo/keypad_display.c2
-rw-r--r--demo/keypad_display.hashes2
-rw-r--r--demo/keypad_display.hex49
-rw-r--r--demo/keypad_display.lnk19
-rw-r--r--demo/keypad_display.lst4
-rw-r--r--demo/keypad_display.map536
-rw-r--r--demo/keypad_display.mem28
-rw-r--r--demo/keypad_display.rel490
-rw-r--r--demo/keypad_display.rst624
-rw-r--r--demo/keypad_display.sym712
-rw-r--r--demo/keypad_display.vhw2
-rw-r--r--demo/ledmatrix.adb102
-rw-r--r--demo/ledmatrix.asm494
-rw-r--r--demo/ledmatrix.hex26
-rw-r--r--demo/ledmatrix.lnk19
-rw-r--r--demo/ledmatrix.lst4
-rw-r--r--demo/ledmatrix.m5ihib599
-rw-r--r--demo/ledmatrix.map454
-rw-r--r--demo/ledmatrix.mem28
-rw-r--r--demo/ledmatrix.rel328
-rw-r--r--demo/ledmatrix.rst494
-rw-r--r--demo/ledmatrix.sym634
-rw-r--r--demo/mleddisplay.adf8
-rw-r--r--demo/mleddisplay.asm2
-rw-r--r--demo/mleddisplay.binbin38 -> 0 bytes
-rw-r--r--demo/mleddisplay.hex8
-rw-r--r--demo/mleddisplay.lst32
-rw-r--r--demo/mleddisplay.vhw9
-rw-r--r--doc/handbook/img/001.pngbin0 -> 42619 bytes
-rw-r--r--doc/handbook/img/002.pngbin0 -> 3863 bytes
-rw-r--r--doc/handbook/img/003.pngbin0 -> 9934 bytes
-rw-r--r--doc/handbook/img/004.pngbin0 -> 7930 bytes
-rw-r--r--doc/handbook/img/005.pngbin0 -> 17949 bytes
-rw-r--r--doc/handbook/img/006.pngbin0 -> 32410 bytes
-rw-r--r--doc/handbook/img/007.pngbin0 -> 21423 bytes
-rw-r--r--doc/handbook/img/008.pngbin0 -> 40114 bytes
-rw-r--r--doc/handbook/img/009.pngbin0 -> 34483 bytes
-rw-r--r--doc/handbook/img/010.pngbin0 -> 29364 bytes
-rw-r--r--doc/handbook/img/011.pngbin0 -> 19727 bytes
-rw-r--r--doc/handbook/img/012.pngbin0 -> 10189 bytes
-rw-r--r--doc/handbook/img/013.pngbin0 -> 12857 bytes
-rw-r--r--doc/handbook/img/014.pngbin0 -> 17060 bytes
-rw-r--r--doc/handbook/img/015.pngbin0 -> 10687 bytes
-rw-r--r--doc/handbook/img/016.pngbin0 -> 8818 bytes
-rw-r--r--doc/handbook/img/017.pngbin0 -> 19690 bytes
-rw-r--r--doc/handbook/img/018.pngbin0 -> 58667 bytes
-rw-r--r--doc/handbook/img/019.pngbin0 -> 40791 bytes
-rw-r--r--doc/handbook/img/020.pngbin0 -> 19755 bytes
-rw-r--r--doc/handbook/img/021.pngbin0 -> 10489 bytes
-rw-r--r--doc/handbook/img/022.pngbin0 -> 22759 bytes
-rw-r--r--doc/handbook/img/023.pngbin0 -> 60741 bytes
-rw-r--r--doc/handbook/img/024.pngbin0 -> 175503 bytes
-rw-r--r--doc/handbook/img/025.pngbin0 -> 32484 bytes
-rw-r--r--doc/handbook/img/026.pngbin0 -> 159611 bytes
-rw-r--r--doc/handbook/img/027.pngbin0 -> 42723 bytes
-rw-r--r--doc/handbook/img/028.pngbin0 -> 30951 bytes
-rw-r--r--doc/handbook/img/029.pngbin0 -> 19450 bytes
-rw-r--r--doc/handbook/img/030.pngbin0 -> 18582 bytes
-rw-r--r--doc/handbook/img/031.pngbin0 -> 53631 bytes
-rw-r--r--doc/handbook/img/032.pngbin0 -> 23686 bytes
-rw-r--r--doc/handbook/img/033.pngbin0 -> 19009 bytes
-rw-r--r--doc/handbook/img/034.pngbin0 -> 26381 bytes
-rw-r--r--doc/handbook/img/035.pngbin0 -> 55804 bytes
-rw-r--r--doc/handbook/img/036.pngbin0 -> 1491 bytes
-rw-r--r--doc/handbook/img/037.pngbin0 -> 8250 bytes
-rw-r--r--doc/handbook/img/038.pngbin0 -> 20271 bytes
-rw-r--r--doc/handbook/img/039.pngbin0 -> 70771 bytes
-rw-r--r--doc/handbook/img/040.pngbin0 -> 54135 bytes
-rw-r--r--doc/handbook/img/041.pngbin0 -> 28198 bytes
-rw-r--r--doc/handbook/img/042.pngbin0 -> 35517 bytes
-rw-r--r--doc/handbook/img/043.pngbin0 -> 25437 bytes
-rw-r--r--doc/handbook/img/044.pngbin0 -> 32454 bytes
-rw-r--r--doc/handbook/img/045.pngbin0 -> 15477 bytes
-rw-r--r--doc/handbook/img/046.pngbin0 -> 15279 bytes
-rw-r--r--doc/handbook/img/047.pngbin0 -> 23908 bytes
-rw-r--r--doc/handbook/img/048.pngbin0 -> 25624 bytes
-rw-r--r--doc/handbook/img/049.pngbin0 -> 26851 bytes
-rw-r--r--doc/handbook/img/050.pngbin0 -> 34145 bytes
-rw-r--r--doc/handbook/img/1rightarrow.pngbin0 -> 807 bytes
-rw-r--r--doc/handbook/img/2rightarrow.pngbin0 -> 1084 bytes
-rw-r--r--doc/handbook/img/545px-Intel_8051_arch.pngbin0 -> 42349 bytes
-rw-r--r--doc/handbook/img/asem51.pngbin0 -> 711 bytes
-rw-r--r--doc/handbook/img/bh.pngbin0 -> 333 bytes
-rw-r--r--doc/handbook/img/button_cancel.pngbin0 -> 779 bytes
-rw-r--r--doc/handbook/img/configure.pngbin0 -> 1839 bytes
-rw-r--r--doc/handbook/img/down0.pngbin0 -> 593 bytes
-rw-r--r--doc/handbook/img/editdelete.pngbin0 -> 951 bytes
-rw-r--r--doc/handbook/img/exit.pngbin0 -> 1221 bytes
-rw-r--r--doc/handbook/img/filenew.pngbin0 -> 1369 bytes
-rw-r--r--doc/handbook/img/fork.pngbin0 -> 1263 bytes
-rw-r--r--doc/handbook/img/goto.pngbin0 -> 896 bytes
-rw-r--r--doc/handbook/img/goto2.pngbin0 -> 1246 bytes
-rw-r--r--doc/handbook/img/hb.pngbin0 -> 334 bytes
-rw-r--r--doc/handbook/img/help.pngbin0 -> 1587 bytes
-rw-r--r--doc/handbook/img/hh.pngbin0 -> 278 bytes
-rw-r--r--doc/handbook/img/launch.pngbin0 -> 828 bytes
-rw-r--r--doc/handbook/img/messagebox_info.pngbin0 -> 2362 bytes
-rw-r--r--doc/handbook/img/rebuild.pngbin0 -> 672 bytes
-rw-r--r--doc/handbook/img/reload.pngbin0 -> 463 bytes
-rw-r--r--doc/handbook/img/sb.pngbin0 -> 374 bytes
-rw-r--r--doc/handbook/img/sdcc-0.pngbin0 -> 416 bytes
-rw-r--r--doc/handbook/img/sh.pngbin0 -> 360 bytes
-rw-r--r--doc/handbook/img/ssp89s_sceenshot.pngbin0 -> 39679 bytes
-rw-r--r--doc/handbook/img/symbol0.pngbin0 -> 312 bytes
-rw-r--r--doc/handbook/img/symbol1.pngbin0 -> 252 bytes
-rw-r--r--doc/handbook/img/symbol2.pngbin0 -> 341 bytes
-rw-r--r--doc/handbook/img/symbol3.pngbin0 -> 263 bytes
-rw-r--r--doc/handbook/img/symbol4.pngbin0 -> 247 bytes
-rw-r--r--doc/handbook/img/symbol5.pngbin0 -> 278 bytes
-rw-r--r--doc/handbook/img/undo.pngbin0 -> 683 bytes
-rw-r--r--doc/handbook/img/up0.pngbin0 -> 572 bytes
-rw-r--r--doc/handbook/mcu8051ide.en.pdf31865
-rw-r--r--doc/handbook/mcu8051ide.en.tex3914
-rw-r--r--doc/man/mcu8051ide.1.gzbin2334 -> 2370 bytes
-rw-r--r--hwplugins/README3
-rw-r--r--hwplugins/plug-in_template.txt47
-rw-r--r--icons/16x16/_1leftarrow.pngbin0 -> 3216 bytes
-rw-r--r--icons/16x16/_1rightarrow.pngbin0 -> 3226 bytes
-rw-r--r--icons/16x16/__blockdevice.pngbin0 -> 785 bytes
-rw-r--r--icons/16x16/_chardevice.pngbin0 -> 787 bytes
-rw-r--r--icons/16x16/_player_pause.pngbin0 -> 3661 bytes
-rw-r--r--icons/16x16/asem51.pngbin0 -> 711 bytes
-rw-r--r--icons/16x16/compfile1.pngbin0 -> 3469 bytes
-rw-r--r--icons/16x16/d52.pngbin0 -> 333 bytes
-rw-r--r--icons/16x16/dot_gray.pngbin0 -> 251 bytes
-rw-r--r--icons/16x16/ds1620.pngbin0 -> 134 bytes
-rw-r--r--icons/16x16/hd44780.pngbin0 -> 1172 bytes
-rw-r--r--icons/16x16/idea.pngbin0 -> 669 bytes
-rw-r--r--icons/16x16/player_play.pngbin0 -> 3638 bytes
-rw-r--r--icons/16x16/sdcc.pngbin0 -> 325 bytes
-rw-r--r--icons/16x16/set_lcd_size.pngbin0 -> 191 bytes
-rw-r--r--icons/16x16/sort_incr.pngbin0 -> 2981 bytes
-rw-r--r--icons/16x16/symbol0.pngbin0 -> 312 bytes
-rw-r--r--icons/16x16/symbol1.pngbin0 -> 252 bytes
-rw-r--r--icons/16x16/symbol2.pngbin0 -> 341 bytes
-rw-r--r--icons/16x16/symbol3.pngbin0 -> 263 bytes
-rw-r--r--icons/16x16/symbol4.pngbin0 -> 247 bytes
-rw-r--r--icons/16x16/symbol5.pngbin0 -> 278 bytes
-rw-r--r--icons/16x16/text_x_makefile.pngbin0 -> 670 bytes
-rw-r--r--icons/22x22/__blockdevice.pngbin0 -> 4148 bytes
-rw-r--r--icons/22x22/_blockdevice.pngbin0 -> 1402 bytes
-rw-r--r--icons/22x22/compfile1.pngbin0 -> 3856 bytes
-rw-r--r--icons/22x22/d52.pngbin0 -> 397 bytes
-rw-r--r--icons/22x22/ds1620.pngbin0 -> 246 bytes
-rw-r--r--icons/22x22/hd44780.pngbin0 -> 1176 bytes
-rw-r--r--icons/flag/Afghanistan.pngbin0 -> 3234 bytes
-rw-r--r--icons/flag/Albania.pngbin0 -> 3124 bytes
-rw-r--r--icons/flag/Algeria.pngbin0 -> 3139 bytes
-rw-r--r--icons/flag/American_Samoa.pngbin0 -> 3337 bytes
-rw-r--r--icons/flag/Andorra.pngbin0 -> 3166 bytes
-rw-r--r--icons/flag/Angola.pngbin0 -> 3112 bytes
-rw-r--r--icons/flag/Anguilla.pngbin0 -> 3310 bytes
-rw-r--r--icons/flag/Antigua_and_Barbuda.pngbin0 -> 3284 bytes
-rw-r--r--icons/flag/Argentina.pngbin0 -> 2991 bytes
-rw-r--r--icons/flag/Armenia.pngbin0 -> 2937 bytes
-rw-r--r--icons/flag/Aruba.pngbin0 -> 2981 bytes
-rw-r--r--icons/flag/Australia.pngbin0 -> 3368 bytes
-rw-r--r--icons/flag/Austria.pngbin0 -> 2881 bytes
-rw-r--r--icons/flag/Azerbaijan.pngbin0 -> 3087 bytes
-rw-r--r--icons/flag/Bahamas.pngbin0 -> 3087 bytes
-rw-r--r--icons/flag/Bahrain.pngbin0 -> 2968 bytes
-rw-r--r--icons/flag/Bangladesh.pngbin0 -> 3173 bytes
-rw-r--r--icons/flag/Barbados.pngbin0 -> 3186 bytes
-rw-r--r--icons/flag/Belarus.pngbin0 -> 3001 bytes
-rw-r--r--icons/flag/Belgium.pngbin0 -> 3046 bytes
-rw-r--r--icons/flag/Belize.pngbin0 -> 3243 bytes
-rw-r--r--icons/flag/Benin.pngbin0 -> 2991 bytes
-rw-r--r--icons/flag/Bermuda.pngbin0 -> 3288 bytes
-rw-r--r--icons/flag/Bhutan.pngbin0 -> 3276 bytes
-rw-r--r--icons/flag/Bolivia.pngbin0 -> 3043 bytes
-rw-r--r--icons/flag/Bosnia.pngbin0 -> 3316 bytes
-rw-r--r--icons/flag/Botswana.pngbin0 -> 2903 bytes
-rw-r--r--icons/flag/Brazil.pngbin0 -> 3331 bytes
-rw-r--r--icons/flag/British_Virgin_Islands.pngbin0 -> 3320 bytes
-rw-r--r--icons/flag/Brunei.pngbin0 -> 3273 bytes
-rw-r--r--icons/flag/Bulgaria.pngbin0 -> 2882 bytes
-rw-r--r--icons/flag/Burkina_Faso.pngbin0 -> 2998 bytes
-rw-r--r--icons/flag/Burundi.pngbin0 -> 3417 bytes
-rw-r--r--icons/flag/Cambodia.pngbin0 -> 3185 bytes
-rw-r--r--icons/flag/Cameroon.pngbin0 -> 3097 bytes
-rw-r--r--icons/flag/Canada.pngbin0 -> 3208 bytes
-rw-r--r--icons/flag/Cape_Verde.pngbin0 -> 3195 bytes
-rw-r--r--icons/flag/Cayman_Islands.pngbin0 -> 3351 bytes
-rw-r--r--icons/flag/Central_African_Republic.pngbin0 -> 3150 bytes
-rw-r--r--icons/flag/Chad.pngbin0 -> 3055 bytes
-rw-r--r--icons/flag/Chile.pngbin0 -> 3006 bytes
-rw-r--r--icons/flag/China.pngbin0 -> 2999 bytes
-rw-r--r--icons/flag/Christmas_Island.pngbin0 -> 3342 bytes
-rw-r--r--icons/flag/Colombia.pngbin0 -> 2916 bytes
-rw-r--r--icons/flag/Comoros.pngbin0 -> 3159 bytes
-rw-r--r--icons/flag/Cook_Islands.pngbin0 -> 3376 bytes
-rw-r--r--icons/flag/Costa_Rica.pngbin0 -> 2915 bytes
-rw-r--r--icons/flag/Cote_dIvoire.pngbin0 -> 3026 bytes
-rw-r--r--icons/flag/Croatia.pngbin0 -> 3113 bytes
-rw-r--r--icons/flag/Cuba.pngbin0 -> 3121 bytes
-rw-r--r--icons/flag/Cyprus.pngbin0 -> 2998 bytes
-rw-r--r--icons/flag/Czech_Republic.pngbin0 -> 3085 bytes
-rw-r--r--icons/flag/Democratic_Republic_of_the_Congo.pngbin0 -> 3151 bytes
-rw-r--r--icons/flag/Denmark.pngbin0 -> 3037 bytes
-rw-r--r--icons/flag/Djibouti.pngbin0 -> 3088 bytes
-rw-r--r--icons/flag/Dominica.pngbin0 -> 3227 bytes
-rw-r--r--icons/flag/Dominican_Republic.pngbin0 -> 3046 bytes
-rw-r--r--icons/flag/Ecuador.pngbin0 -> 3072 bytes
-rw-r--r--icons/flag/Egypt.pngbin0 -> 2952 bytes
-rw-r--r--icons/flag/El_Salvador.pngbin0 -> 3000 bytes
-rw-r--r--icons/flag/Equatorial_Guinea.pngbin0 -> 3174 bytes
-rw-r--r--icons/flag/Eritrea.pngbin0 -> 3282 bytes
-rw-r--r--icons/flag/Estonia.pngbin0 -> 2908 bytes
-rw-r--r--icons/flag/Ethiopia.pngbin0 -> 3089 bytes
-rw-r--r--icons/flag/Falkland_Islands.pngbin0 -> 3348 bytes
-rw-r--r--icons/flag/Faroe_Islands.pngbin0 -> 3069 bytes
-rw-r--r--icons/flag/Fiji.pngbin0 -> 3302 bytes
-rw-r--r--icons/flag/Finland.pngbin0 -> 3003 bytes
-rw-r--r--icons/flag/France.pngbin0 -> 3037 bytes
-rw-r--r--icons/flag/French_Polynesia.pngbin0 -> 3077 bytes
-rw-r--r--icons/flag/Gabon.pngbin0 -> 2922 bytes
-rw-r--r--icons/flag/Gambia.pngbin0 -> 2921 bytes
-rw-r--r--icons/flag/Georgia.pngbin0 -> 3337 bytes
-rw-r--r--icons/flag/Germany.pngbin0 -> 2909 bytes
-rw-r--r--icons/flag/Ghana.pngbin0 -> 3016 bytes
-rw-r--r--icons/flag/Gibraltar.pngbin0 -> 2984 bytes
-rw-r--r--icons/flag/Greece.pngbin0 -> 3076 bytes
-rw-r--r--icons/flag/Greenland.pngbin0 -> 3115 bytes
-rw-r--r--icons/flag/Grenada.pngbin0 -> 3351 bytes
-rw-r--r--icons/flag/Guam.pngbin0 -> 3128 bytes
-rw-r--r--icons/flag/Guatemala.pngbin0 -> 3140 bytes
-rw-r--r--icons/flag/Guinea.pngbin0 -> 3041 bytes
-rw-r--r--icons/flag/Guinea_Bissau.pngbin0 -> 3030 bytes
-rw-r--r--icons/flag/Guyana.pngbin0 -> 3347 bytes
-rw-r--r--icons/flag/Haiti.pngbin0 -> 2904 bytes
-rw-r--r--icons/flag/Honduras.pngbin0 -> 2980 bytes
-rw-r--r--icons/flag/Hong_Kong.pngbin0 -> 3171 bytes
-rw-r--r--icons/flag/Hungary.pngbin0 -> 2888 bytes
-rw-r--r--icons/flag/Iceland.pngbin0 -> 3114 bytes
-rw-r--r--icons/flag/India.pngbin0 -> 3013 bytes
-rw-r--r--icons/flag/Indonesia.pngbin0 -> 2878 bytes
-rw-r--r--icons/flag/Iran.pngbin0 -> 3042 bytes
-rw-r--r--icons/flag/Iraq.pngbin0 -> 3061 bytes
-rw-r--r--icons/flag/Ireland.pngbin0 -> 3045 bytes
-rw-r--r--icons/flag/Israel.pngbin0 -> 3044 bytes
-rw-r--r--icons/flag/Italy.pngbin0 -> 3028 bytes
-rw-r--r--icons/flag/Jamaica.pngbin0 -> 3396 bytes
-rw-r--r--icons/flag/Japan.pngbin0 -> 3023 bytes
-rw-r--r--icons/flag/Jordan.pngbin0 -> 3129 bytes
-rw-r--r--icons/flag/Kazakhstan.pngbin0 -> 3190 bytes
-rw-r--r--icons/flag/Kenya.pngbin0 -> 3217 bytes
-rw-r--r--icons/flag/Kiribati.pngbin0 -> 3402 bytes
-rw-r--r--icons/flag/Kuwait.pngbin0 -> 3043 bytes
-rw-r--r--icons/flag/Kyrgyzstan.pngbin0 -> 3081 bytes
-rw-r--r--icons/flag/Laos.pngbin0 -> 3114 bytes
-rw-r--r--icons/flag/Latvia.pngbin0 -> 2907 bytes
-rw-r--r--icons/flag/Lebanon.pngbin0 -> 3070 bytes
-rw-r--r--icons/flag/Lesotho.pngbin0 -> 3315 bytes
-rw-r--r--icons/flag/Liberia.pngbin0 -> 3006 bytes
-rw-r--r--icons/flag/Libya.pngbin0 -> 2902 bytes
-rw-r--r--icons/flag/Liechtenstein.pngbin0 -> 3017 bytes
-rw-r--r--icons/flag/Lithuania.pngbin0 -> 2919 bytes
-rw-r--r--icons/flag/Luxembourg.pngbin0 -> 2896 bytes
-rw-r--r--icons/flag/Macao.pngbin0 -> 3345 bytes
-rw-r--r--icons/flag/Macedonia.pngbin0 -> 3311 bytes
-rw-r--r--icons/flag/Madagascar.pngbin0 -> 2924 bytes
-rw-r--r--icons/flag/Malawi.pngbin0 -> 3019 bytes
-rw-r--r--icons/flag/Malaysia.pngbin0 -> 3136 bytes
-rw-r--r--icons/flag/Maldives.pngbin0 -> 3177 bytes
-rw-r--r--icons/flag/Mali.pngbin0 -> 3048 bytes
-rw-r--r--icons/flag/Malta.pngbin0 -> 3004 bytes
-rw-r--r--icons/flag/Marshall_Islands.pngbin0 -> 3357 bytes
-rw-r--r--icons/flag/Martinique.pngbin0 -> 3037 bytes
-rw-r--r--icons/flag/Mauritania.pngbin0 -> 3192 bytes
-rw-r--r--icons/flag/Mauritius.pngbin0 -> 2911 bytes
-rw-r--r--icons/flag/Mexico.pngbin0 -> 3188 bytes
-rw-r--r--icons/flag/Micronesia.pngbin0 -> 3156 bytes
-rw-r--r--icons/flag/Moldova.pngbin0 -> 3166 bytes
-rw-r--r--icons/flag/Monaco.pngbin0 -> 2889 bytes
-rw-r--r--icons/flag/Mongolia.pngbin0 -> 3140 bytes
-rw-r--r--icons/flag/Montserrat.pngbin0 -> 3264 bytes
-rw-r--r--icons/flag/Morocco.pngbin0 -> 3015 bytes
-rw-r--r--icons/flag/Mozambique.pngbin0 -> 3102 bytes
-rw-r--r--icons/flag/Myanmar.pngbin0 -> 3050 bytes
-rw-r--r--icons/flag/Namibia.pngbin0 -> 3399 bytes
-rw-r--r--icons/flag/Nauru.pngbin0 -> 3045 bytes
-rw-r--r--icons/flag/Nepal.pngbin0 -> 3330 bytes
-rw-r--r--icons/flag/Netherlands.pngbin0 -> 2899 bytes
-rw-r--r--icons/flag/Netherlands_Antilles.pngbin0 -> 3119 bytes
-rw-r--r--icons/flag/New_Zealand.pngbin0 -> 3283 bytes
-rw-r--r--icons/flag/Nicaragua.pngbin0 -> 3004 bytes
-rw-r--r--icons/flag/Niger.pngbin0 -> 2978 bytes
-rw-r--r--icons/flag/Nigeria.pngbin0 -> 3057 bytes
-rw-r--r--icons/flag/Niue.pngbin0 -> 3149 bytes
-rw-r--r--icons/flag/Norfolk_Island.pngbin0 -> 3240 bytes
-rw-r--r--icons/flag/North_Korea.pngbin0 -> 3106 bytes
-rw-r--r--icons/flag/Norway.pngbin0 -> 3100 bytes
-rw-r--r--icons/flag/Oman.pngbin0 -> 3038 bytes
-rw-r--r--icons/flag/Pakistan.pngbin0 -> 3181 bytes
-rw-r--r--icons/flag/Palau.pngbin0 -> 3185 bytes
-rw-r--r--icons/flag/Panama.pngbin0 -> 3145 bytes
-rw-r--r--icons/flag/Papua_New_Guinea.pngbin0 -> 3296 bytes
-rw-r--r--icons/flag/Paraguay.pngbin0 -> 3004 bytes
-rw-r--r--icons/flag/Peru.pngbin0 -> 3014 bytes
-rw-r--r--icons/flag/Philippines.pngbin0 -> 3131 bytes
-rw-r--r--icons/flag/Pitcairn_Islands.pngbin0 -> 3340 bytes
-rw-r--r--icons/flag/Poland.pngbin0 -> 2847 bytes
-rw-r--r--icons/flag/Portugal.pngbin0 -> 3155 bytes
-rw-r--r--icons/flag/Puerto_Rico.pngbin0 -> 3136 bytes
-rw-r--r--icons/flag/Qatar.pngbin0 -> 2974 bytes
-rw-r--r--icons/flag/Republic_of_the_Congo.pngbin0 -> 3231 bytes
-rw-r--r--icons/flag/Romania.pngbin0 -> 3055 bytes
-rw-r--r--icons/flag/Russian_Federation.pngbin0 -> 2894 bytes
-rw-r--r--icons/flag/Rwanda.pngbin0 -> 3024 bytes
-rw-r--r--icons/flag/Saint_Kitts_and_Nevis.pngbin0 -> 3343 bytes
-rw-r--r--icons/flag/Saint_Lucia.pngbin0 -> 3170 bytes
-rw-r--r--icons/flag/Saint_Pierre.pngbin0 -> 3413 bytes
-rw-r--r--icons/flag/Saint_Vicent_and_the_Grenadines.pngbin0 -> 3187 bytes
-rw-r--r--icons/flag/Samoa.pngbin0 -> 3084 bytes
-rw-r--r--icons/flag/San_Marino.pngbin0 -> 2848 bytes
-rw-r--r--icons/flag/Sao_Tome_and_Principe.pngbin0 -> 3197 bytes
-rw-r--r--icons/flag/Saudi_Arabia.pngbin0 -> 3213 bytes
-rw-r--r--icons/flag/Senegal.pngbin0 -> 3116 bytes
-rw-r--r--icons/flag/Seychelles.pngbin0 -> 3329 bytes
-rw-r--r--icons/flag/Sierra_Leone.pngbin0 -> 2900 bytes
-rw-r--r--icons/flag/Singapore.pngbin0 -> 2995 bytes
-rw-r--r--icons/flag/Slovakia.pngbin0 -> 3146 bytes
-rw-r--r--icons/flag/Slovenia.pngbin0 -> 3067 bytes
-rw-r--r--icons/flag/Soloman_Islands.pngbin0 -> 3339 bytes
-rw-r--r--icons/flag/Somalia.pngbin0 -> 3095 bytes
-rw-r--r--icons/flag/South_Africa.pngbin0 -> 3267 bytes
-rw-r--r--icons/flag/South_Georgia.pngbin0 -> 3298 bytes
-rw-r--r--icons/flag/South_Korea.pngbin0 -> 3259 bytes
-rw-r--r--icons/flag/Spain.pngbin0 -> 2906 bytes
-rw-r--r--icons/flag/Sri_Lanka.pngbin0 -> 3290 bytes
-rw-r--r--icons/flag/Sudan.pngbin0 -> 3070 bytes
-rw-r--r--icons/flag/Suriname.pngbin0 -> 3012 bytes
-rw-r--r--icons/flag/Swaziland.pngbin0 -> 3273 bytes
-rw-r--r--icons/flag/Sweden.pngbin0 -> 3064 bytes
-rw-r--r--icons/flag/Switzerland.pngbin0 -> 3147 bytes
-rw-r--r--icons/flag/Syria.pngbin0 -> 3044 bytes
-rw-r--r--icons/flag/Taiwan.pngbin0 -> 3059 bytes
-rw-r--r--icons/flag/Tajikistan.pngbin0 -> 3000 bytes
-rw-r--r--icons/flag/Tanzania.pngbin0 -> 3305 bytes
-rw-r--r--icons/flag/Thailand.pngbin0 -> 2903 bytes
-rw-r--r--icons/flag/Timor-Leste.pngbin0 -> 3159 bytes
-rw-r--r--icons/flag/Togo.pngbin0 -> 3080 bytes
-rw-r--r--icons/flag/Tonga.pngbin0 -> 3034 bytes
-rw-r--r--icons/flag/Trinidad_and_Tobago.pngbin0 -> 3324 bytes
-rw-r--r--icons/flag/Tunisia.pngbin0 -> 3155 bytes
-rw-r--r--icons/flag/Turkey.pngbin0 -> 3143 bytes
-rw-r--r--icons/flag/Turkmenistan.pngbin0 -> 3141 bytes
-rw-r--r--icons/flag/Turks_and_Caicos_Islands.pngbin0 -> 3293 bytes
-rw-r--r--icons/flag/Tuvalu.pngbin0 -> 3363 bytes
-rw-r--r--icons/flag/UAE.pngbin0 -> 3005 bytes
-rw-r--r--icons/flag/US_Virgin_Islands.pngbin0 -> 3306 bytes
-rw-r--r--icons/flag/Uganda.pngbin0 -> 3094 bytes
-rw-r--r--icons/flag/Ukraine.pngbin0 -> 2892 bytes
-rw-r--r--icons/flag/United_Kingdom.pngbin0 -> 3484 bytes
-rw-r--r--icons/flag/United_States_of_America.pngbin0 -> 3049 bytes
-rw-r--r--icons/flag/Uruguay.pngbin0 -> 3052 bytes
-rw-r--r--icons/flag/Uzbekistan.pngbin0 -> 2989 bytes
-rw-r--r--icons/flag/Vanuatu.pngbin0 -> 3190 bytes
-rw-r--r--icons/flag/Vatican_City.pngbin0 -> 3105 bytes
-rw-r--r--icons/flag/Venezuela.pngbin0 -> 3007 bytes
-rw-r--r--icons/flag/Vietnam.pngbin0 -> 3051 bytes
-rw-r--r--icons/flag/Wallis_and_Futuna.pngbin0 -> 3239 bytes
-rw-r--r--icons/flag/Yemen.pngbin0 -> 2877 bytes
-rw-r--r--icons/flag/Zambia.pngbin0 -> 3061 bytes
-rw-r--r--icons/flag/Zimbabwe.pngbin0 -> 3129 bytes
-rw-r--r--icons/flag/empty.pngbin0 -> 118 bytes
-rw-r--r--icons/mcu/AT89S51.pngbin0 -> 5458 bytes
-rw-r--r--icons/other/choff.pngbin194 -> 194 bytes
-rw-r--r--icons/other/chon.pngbin277 -> 277 bytes
-rw-r--r--icons/other/raoff.pngbin288 -> 288 bytes
-rw-r--r--icons/other/raon.pngbin310 -> 390 bytes
-rw-r--r--icons/other/splash.pngbin44991 -> 58386 bytes
-rwxr-xr-xinstall.sh102
-rw-r--r--[-rwxr-xr-x]lib/X.tcl3079
-rw-r--r--[-rwxr-xr-x]lib/bottompanel/bottomnotebook.tcl291
-rw-r--r--[-rwxr-xr-x]lib/bottompanel/calculator.tcl291
-rw-r--r--[-rwxr-xr-x]lib/bottompanel/cvarsview.tcl142
-rw-r--r--[-rwxr-xr-x]lib/bottompanel/find_in_files.tcl133
-rw-r--r--[-rwxr-xr-x]lib/bottompanel/graph.tcl171
-rw-r--r--[-rwxr-xr-x]lib/bottompanel/graph_wdg.tcl97
-rw-r--r--[-rwxr-xr-x]lib/bottompanel/messages.tcl172
-rw-r--r--[-rwxr-xr-x]lib/bottompanel/terminal.tcl49
-rw-r--r--[-rwxr-xr-x]lib/bottompanel/todo.tcl258
-rw-r--r--[-rwxr-xr-x]lib/cli.tcl203
-rw-r--r--[-rwxr-xr-x]lib/compiler/assembler.tcl71
-rw-r--r--[-rwxr-xr-x]lib/compiler/codelisting.tcl210
-rw-r--r--[-rwxr-xr-x]lib/compiler/compiler.tcl248
-rw-r--r--[-rwxr-xr-x]lib/compiler/compilerconsts.tcl44
-rw-r--r--[-rwxr-xr-x]lib/compiler/disassembler.tcl149
-rw-r--r--[-rwxr-xr-x]lib/compiler/external_compiler.tcl220
-rw-r--r--[-rwxr-xr-x]lib/compiler/preprocessor.tcl1564
-rwxr-xr-xlib/configdialogs/global_config.tcl318
-rw-r--r--[-rwxr-xr-x]lib/configdialogues/compiler_config.tcl (renamed from lib/configdialogs/compiler_config.tcl)885
-rw-r--r--[-rwxr-xr-x]lib/configdialogues/configdialogues.tcl (renamed from lib/configdialogs/configdialogs.tcl)35
-rw-r--r--[-rwxr-xr-x]lib/configdialogues/custom_commands_config.tcl (renamed from lib/configdialogs/custom_commands_config.tcl)172
-rw-r--r--[-rwxr-xr-x]lib/configdialogues/editor_config.tcl (renamed from lib/configdialogs/editor_config.tcl)1016
-rw-r--r--lib/configdialogues/global_config.tcl535
-rw-r--r--[-rwxr-xr-x]lib/configdialogues/rightpanel_config.tcl (renamed from lib/configdialogs/rightpanel_config.tcl)105
-rw-r--r--[-rwxr-xr-x]lib/configdialogues/shortcuts_config.tcl (renamed from lib/configdialogs/shortcuts_config.tcl)128
-rw-r--r--[-rwxr-xr-x]lib/configdialogues/simulator_config.tcl (renamed from lib/configdialogs/simulator_config.tcl)222
-rw-r--r--[-rwxr-xr-x]lib/configdialogues/terminal_config.tcl (renamed from lib/configdialogs/terminal_config.tcl)74
-rw-r--r--[-rwxr-xr-x]lib/configdialogues/toolbar_config.tcl (renamed from lib/configdialogs/toolbar_config.tcl)146
-rw-r--r--[-rwxr-xr-x]lib/custom_command.tcl48
-rw-r--r--[-rwxr-xr-x]lib/dialogues/errorhandler.tcl (renamed from lib/dialogs/errorhandler.tcl)77
-rw-r--r--[-rwxr-xr-x]lib/dialogues/fsd.tcl (renamed from lib/dialogs/fsd.tcl)558
-rw-r--r--[-rwxr-xr-x]lib/dialogues/my_tk_messageBox.tcl (renamed from lib/dialogs/my_tk_messageBox.tcl)36
-rw-r--r--[-rwxr-xr-x]lib/dialogues/selectmcu.tcl (renamed from lib/dialogs/selectmcu.tcl)305
-rw-r--r--[-rwxr-xr-x]lib/dialogues/tips.tcl (renamed from lib/dialogs/tips.tcl)149
-rw-r--r--[-rwxr-xr-x]lib/editor/ASMsyntaxhighlight.tcl302
-rw-r--r--[-rwxr-xr-x]lib/editor/Csyntaxhighlight.tcl145
-rw-r--r--[-rwxr-xr-x]lib/editor/LSTsyntaxhighlight.tcl87
-rw-r--r--[-rwxr-xr-x]lib/editor/R_ASMsyntaxhighlight.tcl157
-rw-r--r--[-rwxr-xr-x]lib/editor/autocompletion.tcl135
-rw-r--r--[-rwxr-xr-x]lib/editor/commandline.tcl119
-rw-r--r--[-rwxr-xr-x]lib/editor/editor.tcl652
-rw-r--r--[-rwxr-xr-x]lib/editor/eventhandlers.tcl166
-rw-r--r--[-rwxr-xr-x]lib/editor/exports.tcl159
-rw-r--r--[-rwxr-xr-x]lib/editor/generalproc.tcl539
-rw-r--r--lib/editor/spell_check.tcl1325
-rw-r--r--[-rwxr-xr-x]lib/environment.tcl941
-rw-r--r--[-rwxr-xr-x]lib/external_command.tcl60
-rw-r--r--[-rwxr-xr-x]lib/leftpanel/filelist.tcl842
-rw-r--r--[-rwxr-xr-x]lib/leftpanel/fsbrowser.tcl158
-rw-r--r--[-rwxr-xr-x]lib/leftpanel/sfrwatches.tcl89
-rw-r--r--lib/lib/FSnotifications.tcl340
-rw-r--r--[-rwxr-xr-x]lib/lib/Math.tcl49
-rw-r--r--[-rwxr-xr-x]lib/lib/hexeditor.tcl311
-rw-r--r--[-rwxr-xr-x]lib/lib/ihextools.tcl38
-rw-r--r--[-rwxr-xr-x]lib/lib/innerwindow.tcl54
-rw-r--r--lib/lib/modern_notebook.tcl691
-rw-r--r--[-rwxr-xr-x]lib/lib/settings.tcl35
-rw-r--r--lib/list_of_files.txt136
-rwxr-xr-xlib/main.tcl390
-rw-r--r--[-rwxr-xr-x]lib/maintab.tcl120
-rw-r--r--lib/pale/ds1620.tcl1730
-rw-r--r--lib/pale/file_interface.tcl983
-rw-r--r--lib/pale/hd44780_cgrom.tcl1624
-rw-r--r--lib/pale/lcd_hd44780.tcl2954
-rw-r--r--[-rwxr-xr-x]lib/pale/leddisplay.tcl133
-rw-r--r--[-rwxr-xr-x]lib/pale/ledmatrix.tcl132
-rw-r--r--[-rwxr-xr-x]lib/pale/ledpanel.tcl97
-rw-r--r--[-rwxr-xr-x]lib/pale/matrixkeypad.tcl110
-rw-r--r--[-rwxr-xr-x]lib/pale/multiplexedleddisplay.tcl142
-rw-r--r--[-rwxr-xr-x]lib/pale/pale.tcl185
-rw-r--r--[-rwxr-xr-x]lib/pale/simplekeypad.tcl108
-rw-r--r--[-rwxr-xr-x]lib/pale/virtual_hw_component.tcl142
-rw-r--r--lib/pale/virtual_uart_term.tcl1682
-rw-r--r--[-rwxr-xr-x]lib/project.tcl137
-rw-r--r--lib/receive_and_print.tcl102
-rw-r--r--[-rwxr-xr-x]lib/rightpanel/hwmanager.tcl340
-rw-r--r--[-rwxr-xr-x]lib/rightpanel/instructiondetails.tcl98
-rw-r--r--[-rwxr-xr-x]lib/rightpanel/regwatches.tcl273
-rw-r--r--[-rwxr-xr-x]lib/rightpanel/rightpanel.tcl262
-rw-r--r--[-rwxr-xr-x]lib/rightpanel/subprograms.tcl107
-rw-r--r--[-rwxr-xr-x]lib/simulator/bitmap.tcl45
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_auxiliary_alo_functions.tcl23
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_backward_stepping.tcl13
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_control.tcl174
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_core.tcl31
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_external_interface_management.tcl162
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_hibernation.tcl39
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_initialization_cleanup.tcl57
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_instructions.tcl184
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_mcu_configuration.tcl107
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_memory_management.tcl85
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_opcodes.tcl11
-rw-r--r--lib/simulator/engine/engine_text_based_interface.tcl1087
-rw-r--r--[-rwxr-xr-x]lib/simulator/engine/engine_virtual_hw_controller.tcl143
-rw-r--r--[-rwxr-xr-x]lib/simulator/hibernate.tcl107
-rw-r--r--[-rwxr-xr-x]lib/simulator/interruptmonitor.tcl154
-rw-r--r--[-rwxr-xr-x]lib/simulator/sfrmap.tcl83
-rw-r--r--[-rwxr-xr-x]lib/simulator/simulator.tcl165
-rw-r--r--[-rwxr-xr-x]lib/simulator/simulator_gui.tcl470
-rw-r--r--[-rwxr-xr-x]lib/simulator/stackmonitor.tcl65
-rw-r--r--[-rwxr-xr-x]lib/simulator/stopwatch.tcl118
-rw-r--r--lib/simulator/uart_monitor.tcl886
-rwxr-xr-xlib/simulator/virtual_uart_term.tcl646
-rw-r--r--[-rwxr-xr-x]lib/utilities/asciichart.tcl89
-rw-r--r--[-rwxr-xr-x]lib/utilities/baseconverter.tcl (renamed from lib/utilities/baseconvertor.tcl)132
-rw-r--r--[-rwxr-xr-x]lib/utilities/eightsegment.tcl64
-rw-r--r--[-rwxr-xr-x]lib/utilities/hexeditdlg.tcl257
-rw-r--r--[-rwxr-xr-x]lib/utilities/notes.tcl51
-rw-r--r--[-rwxr-xr-x]lib/utilities/rs232debugger.tcl166
-rw-r--r--[-rwxr-xr-x]lib/utilities/speccalc.tcl611
-rw-r--r--[-rwxr-xr-x]lib/utilities/symbol_viewer.tcl104
-rw-r--r--lib/utilities/table_of_instructions.tcl692
-rwxr-xr-xmake-launcher59
-rw-r--r--mcu8051ide.desktop2
-rw-r--r--pkgs/Debian/control11
-rw-r--r--pkgs/Gentoo/README37
-rw-r--r--pkgs/Gentoo/mcu8051ide.ebuild45
-rw-r--r--pkgs/README76
-rw-r--r--pkgs/RedHat/mcu8051ide.spec53
-rw-r--r--pkgs/Windows/exec.icobin0 -> 4286 bytes
-rw-r--r--pkgs/Windows/external_command.bat1
-rw-r--r--pkgs/Windows/mcu8051ide.ico (renamed from MicrosoftWindows_compatibility/mcu8051ide.ico)bin16958 -> 16958 bytes
-rw-r--r--pkgs/Windows/mcu8051ide_win_setup.iss52
-rw-r--r--pkgs/Windows/readme.txt8
-rw-r--r--pkgs/Windows/setup_image.bmpbin0 -> 57166 bytes
-rw-r--r--pkgs/Windows/setup_small_image.bmpbin0 -> 4326 bytes
-rw-r--r--pkgs/Windows/startasem.bat17
-rw-r--r--pkgs/Windows/startsdcc.bat17
-rwxr-xr-xpkgs/create_installation_packages.sh1168
-rw-r--r--regression_tests/README129
-rw-r--r--regression_tests/assembler/README14
-rw-r--r--regression_tests/assembler/modify_output_file.hex.awk13
-rw-r--r--regression_tests/assembler/modify_output_file.lst.awk23
-rw-r--r--regression_tests/assembler/process_in_file30
-rwxr-xr-xregression_tests/assembler/runtest32
-rw-r--r--regression_tests/assembler/testcases/001_Trivial_test.asm7
-rw-r--r--regression_tests/assembler/testcases/001_Trivial_test.hex.exp2
-rw-r--r--regression_tests/assembler/testcases/001_Trivial_test.in20
-rw-r--r--regression_tests/assembler/testcases/001_Trivial_test.lst.exp7
-rw-r--r--regression_tests/assembler/testcases/002_Dummy_test.asm7
-rw-r--r--regression_tests/assembler/testcases/002_Dummy_test.hex.exp2
-rw-r--r--regression_tests/assembler/testcases/002_Dummy_test.in4
-rw-r--r--regression_tests/assembler/testcases/002_Dummy_test.lst.exp7
-rw-r--r--regression_tests/assembler/testcases/003 dummy test.asm7
-rw-r--r--regression_tests/assembler/testcases/003 dummy test.hex.exp2
-rw-r--r--regression_tests/assembler/testcases/003 dummy test.in0
-rw-r--r--regression_tests/assembler/testcases/003 dummy test.lst.exp7
-rw-r--r--regression_tests/rte.lib.sh654
-rw-r--r--regression_tests/simulator/README12
-rw-r--r--regression_tests/simulator/modify_output_file.out.awk18
-rwxr-xr-xregression_tests/simulator/runtest23
-rw-r--r--regression_tests/simulator/testcases/001_Trivial_test.adf7
-rw-r--r--regression_tests/simulator/testcases/001_Trivial_test.in29
-rw-r--r--regression_tests/simulator/testcases/001_Trivial_test.out.exp66
-rwxr-xr-xtest-lib.sh41
-rw-r--r--translations/README43
-rw-r--r--translations/languages.txt11
-rw-r--r--translations/template.txt13797
-rwxr-xr-xtranslations/tool.tcl697
-rw-r--r--translations/zh_CN.msg13729
616 files changed, 96715 insertions, 20113 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c8e16d6..7db10e6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,88 +1,61 @@
-PROJECT(mcu8051ide)
+PROJECT(mcu8051ide "NONE")
+SET(mcu8051ide_version 1.4.7)
#
# INITIALIZE
#
-CMAKE_MINIMUM_REQUIRED(VERSION 2.4.2)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
SET(CMAKE_BUILD_TYPE None)
SET(CMAKE_COLOR_MAKEFILE ON)
SET(CMAKE_VERBOSE_MAKEFILE ON)
SET(CMAKE_INCLUDE_CURRENT_DIR TRUE)
# target directory (for data files)
-SET(target_installation_directory /usr/share/mcu8051ide)
+SET(target_installation_directory share/mcu8051ide)
#
-# CONFIGURE
-#
-
-MESSAGE("Check for Tcl Interpreter")
-FIND_PACKAGE(TCL)
-IF(NOT TCL_FOUND)
- MESSAGE("!!! TCL interpreter not found !!!")
-ENDIF(NOT TCL_FOUND)
-
-FOREACH(library
- "BWidget 1.8"
- "Itcl 3.4"
- "Tcl 8.5"
- "md5 2.0"
- "Tk 8.5"
- "img::png 1.3"
- "tdom 0.8"
- "Tclx 8.4"
-)
- STRING(REGEX REPLACE "\t+.*$" "" library_name ${library})
- MESSAGE("Check for ${library_name}")
-
- EXECUTE_PROCESS(
- COMMAND "./test-lib.sh ${library}"
- RESULT_VARIABLE library_found
- )
-
- IF(NOT library_found)
- MESSAGE(FATAL_ERROR "Unable to find library: ${library}")
- ENDIF(NOT library_found)
-
-ENDFOREACH(library)
-
-
-#
-# BUILD
+# PREPARATION
#
# create launcher
FILE(WRITE mcu8051ide
"#!/bin/sh\n"
- "exec tclsh ${target_installation_directory}/lib/main.tcl \"$@\"\n"
+ "exec tclsh8.5 ${CMAKE_INSTALL_PREFIX}/${target_installation_directory}/lib/main.tcl \"$@\" || \\\n"
+ "\tprintf \"Unable to execute, TCL interpreter is not reachable.\n\" > /dev/stderr"
)
#
-# INSTALL
+# INSTALLATION
#
# Install icons
-FOREACH(subdir mcu other 16x16 22x22 32x32)
+FOREACH(subdir mcu flag other 16x16 22x22 32x32)
FILE(GLOB_RECURSE icons icons/${subdir}/*.png)
INSTALL(FILES ${icons} DESTINATION ${target_installation_directory}/icons/${subdir})
ENDFOREACH(subdir)
# Install source code files
-FOREACH(subdir . bottompanel compiler configdialogs dialogs editor leftpanel lib pale rightpanel simulator simulator/engine utilities)
+FOREACH(subdir . bottompanel compiler configdialogues dialogues editor leftpanel lib pale rightpanel simulator simulator/engine utilities)
FILE(GLOB lib lib/${subdir}/*.tcl)
INSTALL(FILES ${lib} DESTINATION ${target_installation_directory}/lib/${subdir})
ENDFOREACH(subdir)
+# Install contents of directory hwplugins
+FILE(GLOB file hwplugins/*)
+INSTALL(FILES ${file} DESTINATION ${target_installation_directory}/hwplugins)
+
# Install documentation files
FOREACH(subdir handbook)
- FILE(GLOB doc doc/${subdir}/*)
- INSTALL(FILES ${doc} DESTINATION ${target_installation_directory}/doc/${subdir})
+ FOREACH(ext pdf)
+ FILE(GLOB doc doc/${subdir}/*.${ext})
+ INSTALL(FILES ${doc} DESTINATION ${target_installation_directory}/doc/${subdir})
+ ENDFOREACH(ext)
ENDFOREACH(subdir)
# Install manual page(s)
FILE(GLOB man doc/man/*)
-INSTALL(FILES ${man} DESTINATION /usr/share/man/man1)
+INSTALL(FILES ${man} DESTINATION share/man/man1)
# Install demonstration project files
FILE(GLOB demo demo/*)
@@ -96,14 +69,15 @@ INSTALL(FILES ${data} DESTINATION ${target_installation_directory}/data)
FILE(GLOB translations translations/*)
INSTALL(FILES ${translations} DESTINATION ${target_installation_directory}/translations)
-# Incstall .desktop spec and application icon
-INSTALL(FILES mcu8051ide.png DESTINATION /usr/share/pixmaps/)
-INSTALL(FILES mcu8051ide.desktop DESTINATION /usr/share/applications/)
+# Install .desktop spec and application icon
+INSTALL(FILES mcu8051ide.png DESTINATION share/pixmaps/)
+INSTALL(FILES mcu8051ide.desktop DESTINATION share/applications/)
+INSTALL(FILES application-x-mcu8051ide.xml DESTINATION share/mime/packages/)
# Install launcher
INSTALL(
FILES mcu8051ide
- DESTINATION /usr/bin
+ DESTINATION bin
PERMISSIONS
WORLD_EXECUTE WORLD_READ
OWNER_WRITE OWNER_READ OWNER_EXECUTE
@@ -112,6 +86,6 @@ INSTALL(
# Install misc. files
INSTALL(
- FILES ChangeLog LICENSE TODO
+ FILES ChangeLog LICENSE
DESTINATION ${target_installation_directory}
)
diff --git a/ChangeLog b/ChangeLog
index 0138273..a51e85a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,75 @@
Change log for MCU 8051 IDE
-1.3.7 -> 1.3.7
+1.4.6 -> 1.4.7
+ * Bug fixes
+
+1.4.5 -> 1.4.6
+ * Bug fixes
+ * Added support for SDCC configuration on Windows
+ * Added support for ASEM-51 on Windows
+ * Added a few new shortcuts to editor
+
+1.4.4 -> 1.4.5
+ * Bug fixes
+
+1.4.3 -> 1.4.4
+ * Bug fixes
+
+1.4.2 -> 1.4.3
+ * Bug fixes
+ * Added support for configurable width of tabulator character
+ * Minor improvements
+ * A little more modern look (or at least I hope)
+
+1.4.1 -> 1.4.2
+ * Bug fixes
+ * Added support for watching for modifications made to the opened files by other programs
+ * Improved handling of memory segmentation directives by the native assembler
+ * Minor improvements
+
+1.4 -> 1.4.1
+ * Bug fixes
+ * Added support for 0x.. notation as radix specifier for hexadecimal numbers
+ * Added support for makefiles
+
+1.3.11 -> 1.4
+ * Bug fixes
+ * Added new Virtual HW component: LCD display controlled by HD44780
+ * Added new Virtual HW component: simulated DS1620 temperature sensor
+ * Added new Virtual HW component: File interface
+ * Added AT89S51
+ * Improved performance of Virtual HW
+ * Added support for spelling checker (Hunspell)
+ * Added 8051 Instruction table
+ * Improved table of symbols on the right panel
+ * Final draft of the handbook
+
+1.3.10 -> 1.3.11
+ * Bug fixes
+ * New interface for hardware control plug-ins
+ * Added new assembler directives: ELSEIF ELSEIFN ELSEIFDEF ELSEIFNDEF
+ * Removed assembler directive: EXITM
+
+1.3.9 -> 1.3.10
+ * Bug fixes
+ * Extended help menu
+ * Extended global configuration dialog
+ * Added support for multiple widget styles and GUI background colors
+ * Added draft of handbook
+ * Added basic support for assembler and simulator regression testing
+ * Added regular support for i18n (internationalization)
+ * Modified welcome dialog
+ * Added support for external links in the GUI
+
+1.3.8 -> 1.3.9
+ * Bug fixes
+
+1.3.7 -> 1.3.8
+ * Bug fixes
+ * Added feature "Global Font Size Factor" (see MCU 8051 IDE configuration dialog)
+ * Added breakpoint validation
+
+1.3.6 -> 1.3.7
* Bug fixes
1.3.5 -> 1.3.6
@@ -41,12 +110,12 @@ Change log for MCU 8051 IDE
1.1 -> 1.1.1
* Added "Special calculator"
- * Added "Base convertor"
+ * Added "Base converter"
* Many tiny improvements
1.0.9 -> 1.1
* Added support for new MCUs from Intel®: 8031, 8751, 8032, 8752, 80C31, 87C51, 80C52, 87C52, 80C32, 80C54, 87C54, 80C58, 87C58
- * Added support for simulationg virtual hardware
+ * Added support for simulating virtual hardware
* Improved simulator (Implemented UART (experimental support), improved support for timers, etc.)
* Improved register watches
* Improved editor (improved autocompletion and many other things)
@@ -54,7 +123,7 @@ Change log for MCU 8051 IDE
* Improved 8-segment editor
* Bug fixes in assembler, disassembler and simulator engine
* Some other bug fixes
- * Added utility "Scrible notepad"
+ * Added utility "Scribble notepad"
* Improved graph panel
1.0.7 -> 1.0.9
@@ -67,7 +136,7 @@ Change log for MCU 8051 IDE
* Some bug fixes
1.0.5 -> 1.0.6
- * Fixed critical bug in Assembler v1.0.5 (related to peerhole optimalizations)
+ * Fixed critical bug in Assembler v1.0.5 (related to peephole code optimization)
* Added 8 segment LED display editor
* Added ASCII chart
* Added Assembly symbol table viewer
@@ -79,17 +148,17 @@ Change log for MCU 8051 IDE
* Added embedded terminal emulator (rxvt-unicode)
* Added function "File statistics"
* Improved assembler
- * Added syntaxt highlight for code listing (*.lst)
+ * Added syntax highlight for code listing (*.lst)
* Added search bars for "Messages" and "Todo"
* Removed dependency on "tcl-thread" and "tclxml"
* Added dependency on "TkImg" and "tdom"
- * Improved hexeditor
- * Improved simulator (especialy simulation across multiple files)
+ * Improved hex editor
+ * Improved simulator (especially simulation across multiple files)
* Added panel "Find in files"
* Modified GUI
* New error handling dialog
- * Some bug fixes (especialy critical bug in disassembler and a few bugs in assembler)
- * All images are now in PNG (Portable Network Graphics) (Reguires TkImg)
+ * Some bug fixes (especially critical bug in disassembler and a few bugs in assembler)
+ * All images are now in PNG (Portable Network Graphics) (Requires TkImg)
* Some more improvements
0.9.5 -> 1.0
@@ -101,7 +170,7 @@ Change log for MCU 8051 IDE
AT87C58X2, TS80C54X2, TS80C58X2, TS87C54X2, TS87C58X2, TS80C31X2,
AT80C31X2
)
- * Added supprort for peerhole optimalizations
+ * Added support for peephole optimization
* Faster project opening
* Added interrupt monitor
* Added subprograms monitor
@@ -118,11 +187,11 @@ Change log for MCU 8051 IDE
* Implemented support for 80C51, 8052, AT89C2051, AT89C4051, AT89C51, AT89C51RC, AT89C52, AT89C55WD, AT89LV51, AT89LV52 and AT89LV55
* Simulator can now step back
* Added popup-based completion for editor
- * Added tooltips for bits in simulator control panel
+ * Added tool tips for bits in simulator control panel
* Added simulator configuration dialog
- * Added autosave function
+ * Added auto save function
* Manual page
- * Added support for multiview (editor can be now splitted verticaly or horizontaly)
+ * Added support for multi-view (editor can be now splitted vertically or horizontally)
* Many bug fixes (in compiler, editor, file selection dialog, syntax highlight, simulator, etc.)
* Some minor improvements (graph, disassembler, etc.)
* Thread extension is no longer required to run this program (but custom commands will won't work without it)
@@ -130,8 +199,8 @@ Change log for MCU 8051 IDE
0.9.0 -> 0.9.1
* New hexadecimal editor
* New file selection dialog
- * Added filesystem browser tab on left panel
- * Added tips on startup
+ * Added file system browser tab on left panel
+ * Added tips on start-up
* Added editor command line
* Improved editor configuration dialog
* A few bug fixes
@@ -148,8 +217,8 @@ Change log for MCU 8051 IDE
* Support for various encodings and EOLs
* Added "Tools" -> "Change letter case", "Normalize HEX" and "SIM -> BIN"
* Added editor functions "Lowercase", "Uppercase" and "Capitalize"
- * Added helpwindows for opened and project files and opened projects
- * Added popup menus for entry and text widgets (globaly)
+ * Added help windows for opened and project files and opened projects
+ * Added pop-up menus for entry and text widgets (globally)
* Fixed problem with fonts (bad sizes)
* Implemented support for line wrapping (experimental)
* Added new command line options (see `mcu8051ide --help')
@@ -174,7 +243,7 @@ Change log for MCU 8051 IDE
* Fixed many bugs in GUI
* Improved editor
* Extended calculator
- * Redesigned editor config dialog
+ * Redesigned editor configuration dialog
* Added functions "Tools -> Reformat code" and "Tools -> Sim2Hex"
* Extended CLI (--reset-user-settings, --config-file, --compile, --hex2bin ...)
@@ -189,10 +258,10 @@ Change log for MCU 8051 IDE
* Added splash screen
* Added support for command line options
* All images are now *.XPM (X PixMap) (require Tix package)
- * Changed instalation procedure
+ * Changed installation procedure
0.8.0 -> 0.8.1
* Fixed some bugs in compiler (not critical)
- * Fixed bug in todo list (saving text as SGML)
+ * Fixed bug in to do list (saving text as SGML)
* Fixed bug in project management
- * Added popup menu to todo list
+ * Added pop-up menu to to do list
diff --git a/MicrosoftWindows_compatibility/external_command.bat b/MicrosoftWindows_compatibility/external_command.bat
deleted file mode 100644
index 934e804..0000000
--- a/MicrosoftWindows_compatibility/external_command.bat
+++ /dev/null
@@ -1 +0,0 @@
-@tclsh85.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file
diff --git a/MicrosoftWindows_compatibility/mcu8051ide_win_setup.iss b/MicrosoftWindows_compatibility/mcu8051ide_win_setup.iss
deleted file mode 100644
index 3ad777b..0000000
--- a/MicrosoftWindows_compatibility/mcu8051ide_win_setup.iss
+++ /dev/null
@@ -1,66 +0,0 @@
-; Script generated by the Inno Setup Script Wizard.
-; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
-
-[Setup]
-; NOTE: The value of AppId uniquely identifies this application.
-; Do not use the same AppId value in installers for other applications.
-; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
-AppId={{E0D2EFF2-AF92-403C-88F6-6188F369D6BB}
-AppName=MCU 8051 IDE
-AppVerName=MCU 8051 IDE 1.3.6
-AppPublisher=Martin Omera
-AppPublisherURL=http://mcu8051ide.sf.net/
-AppSupportURL=http://mcu8051ide.sf.net/
-AppUpdatesURL=http://mcu8051ide.sf.net/
-DefaultDirName={pf}\MCU 8051 IDE
-DefaultGroupName=MCU 8051 IDE
-AllowNoIcons=yes
-LicenseFile=W:\mcu8051ide\LICENSE
-OutputDir=W:\
-OutputBaseFilename=mcu8051ide-1.3.6-setup
-Compression=lzma
-SolidCompression=yes
-SetupIconFile="W:\mcu8051ide\MicrosoftWindows_compatibility\mcu8051ide.ico"
-WizardImageFile=compiler:WIZMODERNIMAGE-IS.BMP
-
-[Languages]
-Name: "english"; MessagesFile: "compiler:Default.isl"
-
-[Tasks]
-Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
-Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
-
-[Files]
-Source: "W:\mcu8051ide\lib\*.tcl"; DestDir: "{app}\lib"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\bottompanel\*.tcl"; DestDir: "{app}\lib\bottompanel"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\compiler\*.tcl"; DestDir: "{app}\lib\compiler"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\configdialogs\*.tcl"; DestDir: "{app}\lib\configdialogs"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\dialogs\*.tcl"; DestDir: "{app}\lib\dialogs"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\editor\*.tcl"; DestDir: "{app}\lib\editor"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\leftpanel\*.tcl"; DestDir: "{app}\lib\leftpanel"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\lib\*.tcl"; DestDir: "{app}\lib\lib"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\pale\*.tcl"; DestDir: "{app}\lib\pale"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\rightpanel\*.tcl"; DestDir: "{app}\lib\rightpanel"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\simulator\*.tcl"; DestDir: "{app}\lib\simulator"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\simulator\engine\*.tcl"; DestDir: "{app}\lib\simulator\engine"; Flags: ignoreversion
-Source: "W:\mcu8051ide\lib\utilities\*.tcl"; DestDir: "{app}\lib\utilities"; Flags: ignoreversion
-Source: "W:\mcu8051ide\icons\16x16\*.png"; DestDir: "{app}\icons\16x16"; Flags: ignoreversion
-Source: "W:\mcu8051ide\icons\22x22\*.png"; DestDir: "{app}\icons\22x22"; Flags: ignoreversion
-Source: "W:\mcu8051ide\icons\32x32\*.png"; DestDir: "{app}\icons\32x32"; Flags: ignoreversion
-Source: "W:\mcu8051ide\icons\mcu\*.png"; DestDir: "{app}\icons\mcu"; Flags: ignoreversion
-Source: "W:\mcu8051ide\icons\other\*.png"; DestDir: "{app}\icons\other"; Flags: ignoreversion
-Source: "W:\mcu8051ide\data\*"; DestDir: "{app}\data"; Flags: ignoreversion
-Source: "W:\mcu8051ide\demo\*"; DestDir: "{app}\demo"; Flags: ignoreversion
-Source: "W:\mcu8051ide\translations\*"; DestDir: "{app}\translations"; Flags: ignoreversion
-Source: "W:\mcu8051ide\MicrosoftWindows_compatibility\mcu8051ide.ico"; DestDir: "{app}"; Flags: ignoreversion
-Source: "W:\mcu8051ide\MicrosoftWindows_compatibility\*.bat"; DestDir: "{app}\lib"; Flags: ignoreversion
-; NOTE: Don't use "Flags: ignoreversion" on any shared system files
-
-[Icons]
-Name: "{group}\MCU 8051 IDE"; Filename: "{app}\lib\main.tcl"; IconFilename: "{app}\mcu8051ide.ico"
-Name: "{commondesktop}\MCU 8051 IDE"; Filename: "{app}\lib\main.tcl"; Tasks: desktopicon; IconFilename: "{app}\mcu8051ide.ico"
-Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\MCU 8051 IDE"; Filename: "{app}\lib\main.tcl"; Tasks: quicklaunchicon; IconFilename: "{app}\mcu8051ide.ico"
-
-[Run]
-Filename: "{app}\lib\main.tcl"; Description: "{cm:LaunchProgram,MCU 8051 IDE}"; Flags: shellexec postinstall skipifsilent
-
diff --git a/MicrosoftWindows_compatibility/sdcc.bat b/MicrosoftWindows_compatibility/sdcc.bat
deleted file mode 100644
index ffe50ee..0000000
--- a/MicrosoftWindows_compatibility/sdcc.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-@cd %1
-@sdcc --iram-size %2 --xram-size %3 --code-size %4 --nooverlay --noinduction --verbose --debug -V --std-sdcc89 --model-small --pack-iram %5 \ No newline at end of file
diff --git a/README b/README
index c002f60..1dd097f 100644
--- a/README
+++ b/README
@@ -1,10 +1,10 @@
-MCU 8051 IDE v1.3.0
+MCU 8051 IDE v1.4.7
DESCRIPTION:
-------------
-Integrated development enviromet for MCS-51 based processors.
-Written in Tcl/Tk, for POSIX Systems (GNU/Linux etc.)
+Integrated development environment for MCS-51 based processors.
+Written in Tcl/Tk, for POSIX Systems (GNU/Linux, etc.)
@@ -14,24 +14,24 @@ INSTALLATION:
At first make sure than you have all dependencies installed and install the missing ones.
(http://mcu8051ide.sourceforge.net/dependencies)
-1) INSTALL DEPENDENCIES
+1) DEPENDENCIES
-----------------------------------------------------------------------------------------------------
- Package min. Version Where it's avaible
+ Package min. Version Where it's available
-----------------------------------------------------------------------------------------------------
REQUIRED PACKAGES: (Without these packages this program WILL NOT run)
- tcl 8.5 http://www.tcl.tk/software/tcltk/downloadnow84.html
- tk 8.5 http://www.tcl.tk/software/tcltk/downloadnow84.html
+ tcl 8.5.9 http://www.tcl.tk/software/tcltk/downloadnow84.html
+ tk 8.5.9 http://www.tcl.tk/software/tcltk/downloadnow84.html
bwidget 1.8 http://sourceforge.net/projects/tcllib
itcl 3.4 http://sourceforge.net/projects/incrtcl
- tdom 0.8 http://www.tdom.org
+ tdom 0.8 http://tdom.github.com/
tkimg 1.3 http://sourceforge.net/projects/tkimg
tcllib 1.6 http://sourceforge.net/projects/tcllib
Tclx 8.4 http://tclx.sourceforge.net
-----------------------------------------------------------------------------------------------------
- OPTIONAL PACKAGES: (Without these packages some features will not be avaliable)
+ OPTIONAL PACKAGES: (Without these packages some features will not be available)
cmake 2.4.3 http://www.cmake.org/HTML/Download.html
- (If you want to install it using "./configure && make && make install")
+ (If you want to install it using "./configure && make && make install".)
rxvt-unicode 8.3 http://software.schmorp.de/
asem-51 1.3 http://plit.de/asem-51/download.htm
asl (I don't know. My e-mail is <martin.osmera@mail.com>)
@@ -39,39 +39,49 @@ At first make sure than you have all dependencies installed and install the miss
emacs http://www.gnu.org/software/emacs/
nano http://www.nano-editor.org/
le http://www.gnu.org/directory/text/editors/le-editor.html
+ hunspell
+ (If you want the spelling checker function available.)
-----------------------------------------------------------------------------------------------------
NOTE:
If you had any problems with installation of any of these packages
please mention it at http://mcu8051ide.sourceforge.net/dependencies .
-2) INSTALL MCU 8051 IDE
- You can install this program in two ways:
+2) INSTALLING MCU 8051 IDE
+ You can install this IDE in two ways:
- A) The recomended one (CMake)
- ./configure
+ A) General
+ cmake . # <-- In case you want to install to a different
+ # directory that /usr/local, for example to /usr,
+ # then run cmake with this option:
+ # "-DCMAKE_INSTALL_PREFIX=/usr".
make
- # here you must be root
- make install
+ make install # <-- Here you must be root.
- B) (Bash script)
- ./install.sh
+ A) OS specific:
+ If possible, download installation files/package specific for you OS, i.e.
+ - .ebuild (Gentoo)
+ - .rpm (RedHat)
+ - .deb (Debian)
+ - PKGBUILD (Arch)
+ - .exe (Windows)
+ - Makefile, ... (freeBSD)
Tip:
You can check if all needed libraries are properly installed by this command:
mcu8051ide --check-libraries
- If you are upgrading from some previous version and the program won't run, try this:
+ If you are upgrading from some previous version and the IDE won't run, try this:
mcu8051ide --reset-user-settings --ignore-last-session
-
-3) If you failed installing this software, plese let me know at the project web page.
+3) If you have failed to install this software, please let me know at the project web page.
-PROBLEMS & SUGESTIONS:
+
+PROBLEMS & SUGGESTIONS:
-----------------------
Project web page:
http://mcu8051ide.sf.net
-
+
E-mail to the author:
martin.osmera@gmail.cz (Only English or Czech please)
@@ -79,7 +89,7 @@ PROBLEMS & SUGESTIONS:
BUGS:
------
Currently I don't know about any bug.
- If you find some bug, plese let me know <martin.osmera@gmail.cz>.
+ If you find some bug, please let me know <martin.osmera@gmail.cz>.
NOTE:
-----
diff --git a/TODO b/TODO
index 7fb5b90..c62e597 100644
--- a/TODO
+++ b/TODO
@@ -1,5 +1,16 @@
TODO list for MCU 8051 IDE
- (I don't know ...)
+* ADC (Analogue to Digital Converter)
+* Full simulation of UART (including tools)
+* Simulation of SPI
+* Simulation of MCU power down modes
+* PCA (Programmable Counter Array)
+* New virtual HW: stepper motors, new displays, digital potentiometers
+* New MCUs, possibly some from NXP and Mentor Graphics
+* I2C based RTC(DS1307)
+* EEPROM(AT24C02)
+* ADC(MAX1036/11600)
+* SPI based MAX7219
+* CAN BASED PROTOCOLS
-Comments and suggestions: http://mcu8051ide.sf.net or martin.osmera@gmail.com
+Comments and suggestions: http://mcu8051ide.sf.net or mailto:martin.osmera@gmail.com
diff --git a/application-x-mcu8051ide.xml b/application-x-mcu8051ide.xml
new file mode 100644
index 0000000..f662b83
--- /dev/null
+++ b/application-x-mcu8051ide.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/x-mcu8051ide-project">
+ <sub-class-of type="text/plain"/>
+ <comment xml:lang="en">MCU 8051 IDE project</comment>
+ <comment xml:lang="cs">Projekt MCU 8051 IDE</comment>
+ <icon name="mcu8051ide"/>
+ <glob-deleteall/>
+ <glob pattern="*.mcu8051ide" />
+ </mime-type>
+</mime-info>
diff --git a/clear_all.sh b/clear_all.sh
deleted file mode 100755
index 26b85a7..0000000
--- a/clear_all.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#! /bin/bash
-
-for i in *~ */*~ */*/*~ */*/*/*~; do
- rm -fv $i
-done
-
-rm -fv CMakeCache.txt
-rm -fv cmake_install.cmake
-rm -fv Makefile
-rm -fv mcu8051ide
-rm -rfv CMakeFiles
diff --git a/configure b/configure
deleted file mode 100755
index 11fd4f8..0000000
--- a/configure
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-
-if [ ! -z "$@" ]; then
- printf "\nThis is not real configure script.\n"
- printf "This script only calls 'cmake .'\n"
- printf "All options are ignored.\n"
-fi
-cmake .
diff --git a/data/licence.txt b/data/license.txt
index 6904999..6904999 100644
--- a/data/licence.txt
+++ b/data/license.txt
diff --git a/data/mcus.xml b/data/mcus.xml
index 3c75a4a..4755c75 100644
--- a/data/mcus.xml
+++ b/data/mcus.xml
@@ -11,22 +11,22 @@
<!-- MCU definition tag -->
<!ELEMENT mcu (timers, more, bits, writeonly, sfr)>
-
+
<!-- Detailed specification of MCU parameters (all of them must not be an empty string)
vendor - Vendor name
name - Processor type
xdata - External data memory connectable
- xcode - External program memoryconnectable
+ xcode - External program memoryconnectable
code - Capacity of internal program memory in kilo bytes (not bytes !)
frequency - Operating oscilator frequency (e.g "0 to 24 MHz")
ram - Capacity of internal data memory in bytes
portbits - Number of IO lines
- uart - UART avaliable
+ uart - UART available
interrupts - Number of interrupts
voltage - Oprating voltage (e.g "2.7 to 5.5 V")
- timer2 - Timer 2 avaliable
- watchdog - Watchdog timer avaliable
- eram - Size of ERAM (0 means no eram avaliable) (> 0 requires intelpe="no")
+ timer2 - Timer 2 available
+ watchdog - Watchdog timer available
+ eram - Size of ERAM (0 means no eram available) (> 0 requires intelpe="no")
dualdtpr - Dual Data Pointer (includes register AUXR1 if wdtcon="no")
auxr - Register AUXR
t2mod - Register T2MOD
@@ -34,14 +34,14 @@
0 - Bit not implemented
1 - Bit implemented
e.g. port0="11110011" means:
- P0.0 - implemented
- P0.1 - implemented
- P0.2 - implemented
- P0.3 - implemented
- P0.4 - not implemented
- P0.5 - not implemented
- P0.6 - implemented
- P0.7 - implemented
+ P0.0 - implemented
+ P0.1 - implemented
+ P0.2 - implemented
+ P0.3 - implemented
+ P0.4 - not implemented
+ P0.5 - not implemented
+ P0.6 - implemented
+ P0.7 - implemented
pof - Power Off Flag implemented
gf0 - PCON.3 (General purpose flag) implemented
gf1 - PCON.4 (General purpose flag) implemented
@@ -132,12 +132,12 @@
<!-- Hexadecimal addresses of write only registers (e.g. AF 85 4B) -->
<!ELEMENT writeonly (#PCDATA)>
-
- <!-- List of SFR and SFB which are avaliable on the choosen MCU
+
+ <!-- List of SFR and SFB which are available on the choosen MCU
Implicit SFR and SFB:
B ACC A TMOD TH0 TH1 SP DPL DPH PCON
TL0 TL1 AB
-
+
PSW C CY AC F0 RS1 RS0 OV P
IE EA ET1 EX1 ET0 EX0
IP PT1 PX1 PT0 PX0
@@ -145,7 +145,7 @@
-->
<!ELEMENT sfr (#PCDATA)>
]>
-<mcus lastupdate="02/10/09">
+<mcus lastupdate="11/02/11">
<mcu
vendor="Intel" name="8051"
xdata="yes" xcode="yes"
@@ -384,7 +384,7 @@
</writeonly><sfr>
P0 P1 P2 P3 SBUF ES PS ET2 PT2
RCAP2L RCAP2H TL2 TH2
-
+
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
</sfr>
@@ -422,7 +422,7 @@
</writeonly><sfr>
P0 P1 P2 P3 SBUF ES PS ET2 PT2
RCAP2L RCAP2H TL2 TH2
-
+
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
</sfr>
@@ -460,7 +460,7 @@
</writeonly><sfr>
P0 P1 P2 P3 SBUF ES PS ET2 PT2
RCAP2L RCAP2H TL2 TH2
-
+
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
</sfr>
@@ -505,9 +505,9 @@
C903 B83F A8BF 878F
</bits><writeonly>
</writeonly><sfr>
- P0 P1 P2 P3 SBUF ES PS ET2 PT2
+ P0 P1 P2 P3 SBUF ES PS ET2 PT2
SADEN SADDR RCAP2L RCAP2H TL2 TH2 T2MOD IPH FE
-
+
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
</sfr>
@@ -554,7 +554,7 @@
</writeonly><sfr>
P0 P1 P2 P3 SBUF ES PS ET2 PT2
SADEN SADDR RCAP2L RCAP2H TL2 TH2 T2MOD IPH FE
-
+
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
</sfr>
@@ -601,7 +601,7 @@
</writeonly><sfr>
P0 P1 P2 P3 SBUF ES PS ET2 PT2
SADEN SADDR RCAP2L RCAP2H TL2 TH2 T2MOD IPH FE
-
+
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
</sfr>
@@ -648,7 +648,7 @@
</writeonly><sfr>
P0 P1 P2 P3 SBUF ES PS ET2 PT2
SADEN SADDR RCAP2L RCAP2H TL2 TH2 T2MOD IPH FE
-
+
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
</sfr>
@@ -695,7 +695,7 @@
</writeonly><sfr>
P0 P1 P2 P3 SBUF ES PS ET2 PT2
SADEN SADDR RCAP2L RCAP2H TL2 TH2 T2MOD IPH FE
-
+
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
</sfr>
@@ -742,7 +742,7 @@
</writeonly><sfr>
P0 P1 P2 P3 SBUF ES PS ET2 PT2
SADEN SADDR RCAP2L RCAP2H TL2 TH2 T2MOD IPH FE
-
+
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
</sfr>
@@ -789,7 +789,7 @@
</writeonly><sfr>
P0 P1 P2 P3 SBUF ES PS ET2 PT2
SADEN SADDR RCAP2L RCAP2H TL2 TH2 T2MOD IPH FE
-
+
SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
</sfr>
@@ -1136,6 +1136,51 @@
T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
</sfr>
</mcu><mcu
+ vendor="Atmel" name="AT89S51"
+ xdata="yes" xcode="yes"
+ code="4" frequency="0 to 33 MHz"
+ ram="128" portbits="32"
+ uart="yes" interrupts="6"
+ voltage="4.0 to 5.5" timer2="no"
+ watchdog="yes" eram="0"
+ dualdtpr="yes" auxr="yes"
+ t2mod="no" port0="11111111"
+ port1="11111111" port2="11111111"
+ port3="11111111" port4=""
+ pof="yes" gf0="yes"
+ gf1="yes" pd="no"
+ idl="no" smod0="no"
+ iph="no" acomparator="no"
+ euart="no" clkreg="no"
+ pwdex="no" spi="no"
+ wdtcon="no" eeprom="0"
+ intelpe="no" pwm="no"
+ x2reset="no" ckcon="no"
+ auxr1gf3="no" ao="no"
+ wdtprg="no" hddptr="no"
+ auxrwdidle="yes" auxrdisrto="yes">
+ <timers>Two 16-bit</timers>
+ <more>
+ Three-level Program Memory Lock
+ Low-power Idle and Power-down Modes
+ Interrupt Recovery from Power-down Mode
+ Watchdog Timer
+ Dual Data Pointer
+ Power-off Flag
+ Fast Programming Time
+ Flexible ISP Programming (Byte and Page Mode)
+ </more><bits>
+ B83F A8BF A201 8E19 878F
+ </bits><writeonly>
+ A6
+ </writeonly><sfr>
+ P0 P1 P2 P3 SBUF
+ T2MOD AUXR AUXR1 WDTRST
+ DP0H DP0L DP1H DP1L
+ SCON SM0 SM1 SM2 REN TB8 RB8 TI RI
+ T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2
+ </sfr>
+ </mcu><mcu
vendor="Atmel" name="AT89S52"
xdata="yes" xcode="yes"
code="8" frequency="0 to 33 MHz"
diff --git a/data/project.dtd b/data/project.dtd
index 8663e17..ba880f4 100644
--- a/data/project.dtd
+++ b/data/project.dtd
@@ -9,7 +9,7 @@
<!-- Root element Parameters:
version - Project version (user defined)
date - Project last update (user defined)
- creator_ver - MCU 8051 IDE version (hardcoded in program)
+ creator_ver - MCU 8051 IDE version (hardcoded in the program)
-->
<!ATTLIST tk_mcuide_project
version CDATA #IMPLIED
@@ -68,9 +68,9 @@
grid - Grid mode
magnification - Magnification level (must be an integer between 0 and 3)
enabled - Graph enable flag (Boolean value 0 or 1)
- marks_s - List of state graph marks (String of zeros and ones, e.g. 00100110)
- marks_l - List of laches graph marks (String of zeros and ones, e.g. 00100110)
- marks_o - List of output graph marks (String of zeros and ones, e.g. 00100110)
+ marks_s - List of state graph marks (String of zeros and ones perfixed with 'X', and converted to hexadecimal)
+ marks_l - List of laches graph marks (String of zeros and ones perfixed with 'X', and converted to hexadecimal)
+ marks_o - List of output graph marks (String of zeros and ones perfixed with 'X', and converted to hexadecimal)
active_page - Active page
-->
<!ATTLIST graph
@@ -190,10 +190,10 @@
<!-- File path -->
<!ELEMENT path (#PCDATA)>
-<!-- Bookmarks: string of zeros and ones -->
+<!-- Bookmarks: list of line numbers -->
<!ELEMENT bookmarks (#PCDATA)>
-<!-- Breakpoints: string of zeros and ones -->
+<!-- Breakpoints: list of line numbers -->
<!ELEMENT breakpoints (#PCDATA)>
<!-- End Of Line character name -->
diff --git a/data/tips.xml b/data/tips.xml
index 3fca882..6b658c6 100644
--- a/data/tips.xml
+++ b/data/tips.xml
@@ -1,15 +1,28 @@
-<?xml version='1.0' encoding='utf-8'?>
+<?xml version='1.0' encoding='utf-8' standalone='yes'?>
+
+<!--
+ This is the file containing "Tip of the Day" messages. Format of the
+ file is XML (eXtensible Markup Language) and is described on the inline
+ DTD (Document Type Definition).
+-->
+
<!DOCTYPE tips [
<!-- ROOT ELEMENT -->
<!ELEMENT tips (tip)*>
<!-- Tip text (Text must be in CDATA section)
- <b>Bold text</b> normal text
+ Available formatting tags:
+ <b>Bold text</b>
+ <c>Source code</c>
+
+ Note that if you want ``<'' or ``>'' character in the text, all
+ you have to do is just write it there. No HTML entities or
+ anything like that is used here.
-->
<!ELEMENT tip EMPTY>
<!-- Parameters for tag "tip":
- lang - Text language
+ lang - Language of the text
-->
<!ATTLIST tip
lang CDATA #REQUIRED
@@ -18,23 +31,23 @@
<tips>
<tip lang="en">
<![CDATA[
- You can cycle through all opened documents by pressing <b>Alt+Left</b> or <b>Alt+Right</b>. The next/previous document will immediately be displayed in the active frame.
+ You can cycle through all opened documents by pressing <b>Alt+Left</b> or <b>Alt+Right</b>. The next/previous document will immediately be displayed in the active frame.
]]>
</tip><tip lang="en">
<![CDATA[
- Graph (tab "IO Ports") significantly slows down MCU simulation ! It is a good to keep it off unless you need it.
+ Graph ("IO Ports" tab) significantly slows down MCU simulation! It is a good idea to keep it off unless you need it.
]]>
</tip><tip lang="en">
<![CDATA[
- You can repeat your last search by just pressing <b>F3</b>, or <b>Shift+F3</b> if you want to search backwards.
+ You can repeat your last search by just pressing <b>F3</b>, or <b>Shift+F3</b>, if you want to search backwards.
]]>
</tip><tip lang="en">
<![CDATA[
- You can swap the characters on each side of the cursor just by pressing <b>Ctrl+T</b>
+ You can swap the characters on each side of the cursor just by pressing <b>Ctrl+T</b>.
]]>
</tip><tip lang="en">
<![CDATA[
- You can configure syntax highlighting in <b>Editor configuration dialog</b>.
+ You can configure syntax highlighting in the <b>Editor configuration dialog</b>.
<b>Configure</b> -> <b>Editor Configuration</b>
]]>
</tip><tip lang="en">
@@ -53,29 +66,31 @@
]]>
</tip><tip lang="en">
<![CDATA[
- Sometimes you can make your work easier with editor command line. Inkove it by <b>F10</b> and type <b>help list</b> to get list of avaliable commands.
+ Sometimes you can make your work easier with the editor command line. Invoke it with <b>F10</b> and type <b>help list</b> to get a list of available commands.
]]>
</tip><tip lang="en">
<![CDATA[
- Use <b>quick search bars</b>. For instance you need to find a file in list of opened file. Write the name of that file to entrybox below the list and it's done.
+ Use <b>quick search bars</b>. For instance, you need to find a file in list of opened file. Write the name of that file to entrybox below the list and it's done.
]]>
</tip><tip lang="en">
<![CDATA[
- Burn your MSC51 manual (or better colleague's manual). Tab <b>"Instruction details"</b> (<b>Ctrl+0</b>) in the right panel gives you a list of all possible operands for instruction on current line in the editor.
+ Burn your MSC51 manual (or better, colleague's manual). Tab <b>"Instruction details"</b> (<b>Ctrl+0</b>) in the right panel gives you a list of all possible operands for the instruction on the current line in the editor.
]]>
</tip><tip lang="en">
<![CDATA[
You can use function <b>Auto-indent</b> to make badly formated code more readable.
- main: mov A, #55h
- mov R0,#20h
- movx @R0, A
- sjmp main
+ <c> main: mov A, #55h</c>
+ <c> mov R0, #20h</c>
+ <c> movx @R0, A</c>
+ <c> sjmp main</c>
+
<b>Tools</b> -> <b>Auto indent</b>
- main: mov A, #55h
- mov R0, #20h
- movx @R0, A
- sjmp main
+
+ <c> main: mov A, #55h</c>
+ <c> mov R0, #20h</c>
+ <c> movx @R0, A</c>
+ <c> sjmp main</c>
]]>
</tip><tip lang="en">
<![CDATA[
@@ -83,7 +98,7 @@
]]>
</tip><tip lang="en">
<![CDATA[
- You can edit content of external data memory and program memory with embedded hexadecimal editor. <b>Simulator</b> -> <b>Show ... memory</b>. So you can write programs directly in machine code (but is's better to use compiler).
+ You can edit the content of external data memory and program memory with the embedded hexadecimal editor. <b>Simulator</b> -> <b>Show ... memory</b>. You can write programs directly in machine code, (but it's better to use the compiler).
]]>
</tip><tip lang="en">
<![CDATA[
@@ -91,15 +106,15 @@
]]>
</tip><tip lang="en">
<![CDATA[
- This program have also supprot for command line interaface (CLI). Run <b>mcu8051ide --help</b> to get list of possible options.
+ This program also has support for a command line interface (CLI). Run <b>mcu8051ide --help</b> to get a list of possible options.
]]>
</tip><tip lang="en">
<![CDATA[
- Sometimes you might need to run an external program (e.g program uploader). In MCU 8051 IDE it can be accomplished by <b>Custom commands</b> ( <b>Configure</b> -> <b>Custom commands</b> ).
+ Sometimes you might need to run an external program (e.g program uploader). In MCU 8051 IDE, it can be accomplished by <b>Custom commands</b> ( <b>Configure</b> -> <b>Custom commands</b> ).
]]>
</tip><tip lang="en">
<![CDATA[
- You can export current document (assembly language source) as XHTML-1.1 or LaTeX.
+ You can export the current document (assembly language source) as XHTML-1.1 or LaTeX.
<b>Tools</b> -> <b>Export as ...</b>
]]>
</tip><tip lang="en">
@@ -109,7 +124,7 @@
]]>
</tip><tip lang="en">
<![CDATA[
- Right panel provides list of bookmarks and breakpoints defined in the editor.
+ The right panel provides a list of bookmarks and breakpoints defined in the editor.
]]>
</tip><tip lang="en">
<![CDATA[
@@ -118,21 +133,21 @@
]]>
</tip><tip lang="en">
<![CDATA[
- <b>Register watches</b> can make your work much easier. You can find them in the Right panel. Enter hexadecimal address of register which you want to watch to entry box with label "Addr" and press Enter. (1 or 2 hexadecimal digits means <b>IDATA</b> and 3 or 4 digits means <b>XDATA</b>)
+ <b>Register watches</b> can make your work much easier. You can define them in the Right panel. Enter the hexadecimal address of the register you want to watch in the text box at the bottom of the right panel with the label "Addr" and press Enter. (1 or 2 hexadecimal digits means <b>IDATA</b> and 3 or 4 digits means <b>XDATA</b>).
]]>
</tip><tip lang="en">
<![CDATA[
You can discuss this project at <b>http://mcu8051ide.sourceforge.net</b>.
- If you do find a bug, please report it either via <b>http://sourceforge.net/tracker/?func=add&group_id=185864&atid=914981</b> or via mail <b>martin.osmera@gmail.com</b>.
+ If you do find a bug, please report it via <b>http://sourceforge.net/tracker/?func=add&group_id=185864&atid=914981</b>
]]>
</tip><tip lang="en">
<![CDATA[
- You can customize compiler behavior in <b>Compiler config</b> dialog.
+ You can customize compiler behavior in the <b>Compiler config</b> dialog.
]]>
</tip><tip lang="en">
<![CDATA[
- You can enable/disable <b>popup-based completion</b> in editor configuration dialog.
+ You can enable/disable <b>popup-based completion</b> in the editor configuration dialog.
]]>
</tip><tip lang="en">
<![CDATA[
@@ -142,44 +157,44 @@
]]>
</tip><tip lang="en">
<![CDATA[
- Editor can be splitted vertical or horizontal. It Right click on editor status bar and choose split.
+ The editor can be split vertically or horizontally. Right click on the editor status bar and choose split.
]]>
</tip><tip lang="en">
<![CDATA[
- You can step your program back, default key shortcut is: <b>Ctrl+F7</b>. Behavior of this capability can be modified in simulator configuration dialog.
+ You can step your program back using the default key shortcut <b>Ctrl+F7</b>. Behavior of this capability can be modified in the simulator configuration dialog.
]]>
</tip><tip lang="en">
<![CDATA[
- MCU 8051 IDE can "hibernate" running program into a file. Later you can resume the hibernated program excatly from the same point where it was hibernated.
+ MCU 8051 IDE can "hibernate" the running program into a file. Later you can resume the hibernated program exactly from the same point where it was hibernated.
<b>Simulator</b> -> <b> Hibernate program </b>
<b>Simulator</b> -> <b> Resume hibernated program </b>
]]>
</tip><tip lang="en">
<![CDATA[
- You can navigate simulator to certain line in your source code. Press <b>Ctrl+G</b> in simulator mode and choose line. Simulator will set PC (Program Counter) to address in program memory coresponding to your choosen line.
+ You can navigate the simulator to a certain line in your source code. Press <b>Ctrl+G</b> in simulator mode and choose line. The simulator will set the PC (Program Counter) to the address in program memory corresponding to your chosen line.
]]>
</tip><tip lang="en">
<![CDATA[
- MCU 8051 IDE assembler can perform certain code optimalizations. They are enabled by default but you can disable the in compiler configuration dialog.
+ MCU 8051 IDE assembler can perform certain code optimizations. They are enabled by default but you can disable them in the compiler configuration dialog.
- More about optimalizations:
- LJMP code11 --> AJMP code11
- LJMP code8 --> SJMP code11
- LJMP code8 --> SJMP code8
- AJMP code8 --> SJMP code8
- LCALL code11 --> ACALL code11
- MOV 224d, ... --> MOV A, ...
- MOV ..., 224d --> MOV ..., A
- SETB 215 --> SETB C
- CLR 215 --> CLR C
+ More about optimizations:
+ <c>LJMP code11 </c>--> <c>AJMP code11</c>
+ <c>LJMP code8 </c>--> <c>SJMP code11</c>
+ <c>LJMP code8 </c>--> <c>SJMP code8</c>
+ <c>AJMP code8 </c>--> <c>SJMP code8</c>
+ <c>LCALL code11 </c>--> <c>ACALL code11</c>
+ <c>MOV 224d, ... </c>--> <c>MOV A, ...</c>
+ <c>MOV ..., 224d </c>--> <c>MOV ..., A</c>
+ <c>SETB 215 </c>--> <c>SETB C</c>
+ <c>CLR 215 </c>--> <c>CLR C</c>
]]>
</tip><tip lang="en">
<![CDATA[
- Sometimes it is not easy to track subprograms and interrupts invocations. In this IDE you can track them quite easily usining "Interrupt monitor" (<b>Simulator -> Interrupt Monitor</b>) and "List of subprograms" (<b>Ctrl+0</b>).
+ Sometimes it is not easy to track subprograms and interrupt invocations. In this IDE, you can track them quite easily using the "Interrupt monitor" (<b>Simulator -> Interrupt Monitor</b>) and "List of subprograms" (<b>Ctrl+0</b>).
]]>
</tip><tip lang="en">
<![CDATA[
- <b>Map of SFR</b> (<b>Simulator -> Map of SFR</b>) can provide you a transparent view of all special function registers avaliable on your choosen MCU.
+ <b>Map of SFR</b> (<b>Simulator -> Map of SFR</b>) can provide a transparent view of all special function registers available on your chosen MCU.
]]>
</tip>
<!--
diff --git a/debian/README.source b/debian/README.source
index 889d1ea..5191129 100644
--- a/debian/README.source
+++ b/debian/README.source
@@ -4,3 +4,5 @@ mcu8051ide for Debian
CMAKE isn't used because nothing is compiled. Instead all files are copied
with the dh_install script.
+
+
diff --git a/debian/changelog b/debian/changelog
index c228a78..374c77f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+mcu8051ide (1.4.7-1) unstable; urgency=low
+
+ * New upstream release.
+ * Fixed spelling error in the manpage.
+
+ -- Fabricio Alcalde <f@lcald.com.ar> Sat, 27 Apr 2013 15:40:07 +0000
+
mcu8051ide (1.3.7-1) unstable; urgency=low
* Initial release (Closes: #546549)
diff --git a/debian/control b/debian/control
index 4ed9b1e..5c6bbd6 100644
--- a/debian/control
+++ b/debian/control
@@ -3,22 +3,15 @@ Section: electronics
Priority: extra
Maintainer: Fabricio Alcalde <f@lcald.com.ar>
Build-Depends: debhelper (>= 7.0.50~)
-Standards-Version: 3.9.0
-Homepage: http://mcu8051ide.sourceforge.net/
-#Vcs-Git: git://git.debian.org/collab-maint/mcu8051ide.git
-#Vcs-Browser: http://git.debian.org/?p=collab-maint/mcu8051ide.git;a=summary
+Standards-Version: 3.9.4
+Homepage: http://mcu8051ide.sf.net
Package: mcu8051ide
Architecture: all
-Depends: ${misc:Depends}, bwidget (>= 1.8), itcl3 (>> 3.3), tcl8.5, tcllib, tk8.5, libtk-img, tdom (>= 0.8), tclx8.4
-Recommends: sdcc, doxygen
-Suggests: rxvt-unicode
-Description: Integrated development enviroment for MCS-51 based microcontrollers
- MCU 8051 IDE is a tool for developing programs in assembly or C languages
- (with SDCC) for microcontrollers based on industrial standard MCS-51.
- .
- It consist of editor with syntax highlight, auto completion, syntax validation
- and command line; compiler with support for macro-instructions (even
- macro in macro); simulator/debugger with small hardware simulation; scientific
- calculator, (rich) text editor for writing to do lists, hexadecimal editor and
- many other tools.
+Depends: ${misc:Depends}, bwidget (>= 1.8.0), itcl3, tdom (>= 0.8), tcllib (>= 1.10), tcl8.5, tk8.5, tclx8.4, libtk-img
+Suggests: rxvt-unicode, sdcc, doxygen, hunspell, make
+Description: Graphical Integrated Development Environment for 8051
+ MCU 8051 IDE is integrated development environment for microcontrollers based
+ on 8051. Supported programming languages are C and assembly. It has its own
+ assembler and support for 2 external assemblers. For C language it uses the
+ SDCC compiler.
diff --git a/debian/mcu8051ide.1 b/debian/mcu8051ide.1
index b010eea..4782038 100644
--- a/debian/mcu8051ide.1
+++ b/debian/mcu8051ide.1
@@ -1,5 +1,5 @@
.\"
-.\" MCU 8051 IDE - Itegrated development enviroment for MCS-51 based microcontrollers
+.\" MCU 8051 IDE - Itegrated development environment for MCS-51 based microcontrollers
.\" Copyright (C) 2007 Martin Osmera
.\"
.\" This program is free software; you can redistribute it and/or modify
@@ -16,12 +16,14 @@
.\" along with this program; if not, write to the Free Software
.\" Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
.\"
-.TH "MCU8051IDE" 1 "16 December 2007"
-.SH NAME MCU8051IDE \- Itegrated development enviroment for MCS-51 based microcontrollers
+.TH MCU8051IDE "1" "16 December 2007" "User Commands"
+.SH NAME MCU8051IDE \- Integrated development environment for MCS-51 based microcontrollers
.SH SYNOPSIS
.B mcu8051ide
.RB [ \-\-help ]
.RB [ \-h ]
+.RB [ \-\-assemble
+.IR asm_file ]
.RB [ \-\-compile
.IR asm_file ]
.RB [ \-\-iram\-size
@@ -134,8 +136,11 @@ Reformat indention in source code
\fB\-\-disassemble \fIinput\fR
Disaseble IHEX8 code and store result in input.asm
.TP
+\fB\-\-assemble \fIasm_file\fR
+Assemble the asm_file and exit program
+.TP
\fB\-\-compile \fIasm_file\fR
-Compile asm_file and exit program
+The same as \-\-assemble
.TP
\fB\-\-iram\-size \fIsize\fR
Set size of internal data memory (eg. 1K or 1024) (default: 0x100)
diff --git a/debian/mcu8051ide.install b/debian/mcu8051ide.install
index 402be1e..f3acbd3 100644
--- a/debian/mcu8051ide.install
+++ b/debian/mcu8051ide.install
@@ -5,6 +5,7 @@ icons/22x22/ usr/share/mcu8051ide/icons/
icons/32x32/ usr/share/mcu8051ide/icons/
icons/16x16/ usr/share/mcu8051ide/icons/
icons/mcu/ usr/share/mcu8051ide/icons/
+icons/flag/ usr/share/mcu8051ide/icons/
lib/ usr/share/mcu8051ide/
lib/pale/ usr/share/mcu8051ide/lib/
lib/utilities/ usr/share/mcu8051ide/lib/
@@ -14,12 +15,16 @@ lib/compiler/ usr/share/mcu8051ide/lib/
lib/simulator/ usr/share/mcu8051ide/lib/
lib/simulator/engine/ usr/share/mcu8051ide/lib/simulator/
lib/rightpanel/ usr/share/mcu8051ide/lib/
+lib/leftpanel/ usr/share/mcu8051ide/lib/
lib/bottompanel/ usr/share/mcu8051ide/lib/
-lib/dialogs/ usr/share/mcu8051ide/lib/
-lib/configdialogs/ usr/share/mcu8051ide/lib/
+lib/dialogues/ usr/share/mcu8051ide/lib/
+lib/configdialogues/ usr/share/mcu8051ide/lib/
demo/ usr/share/mcu8051ide/
+doc/handbook/ usr/share/mcu8051ide/doc/
+translations/ usr/share/mcu8051ide/
# Install execution wrappers
mcu8051ide usr/bin/
mcu8051ide.png usr/share/pixmaps/
mcu8051ide.desktop usr/share/applications/
+application-x-mcu8051ide.xml usr/share/mime/packages/
diff --git a/debian/patches/addlaunchscript.patch b/debian/patches/addlaunchscript.patch
new file mode 100644
index 0000000..19339ec
--- /dev/null
+++ b/debian/patches/addlaunchscript.patch
@@ -0,0 +1,9 @@
+Description: Added launch script
+Author: Fabricio Alcalde <f@lcald.com.ar>
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- /dev/null
++++ b/mcu8051ide
+@@ -0,0 +1,2 @@
++#!/bin/sh
++exec tclsh8.5 /usr/share/mcu8051ide/lib/main.tcl "$@"
diff --git a/debian/patches/debian-changes-1.3.7-1 b/debian/patches/debian-changes-1.3.7-1
deleted file mode 100644
index ee6a045..0000000
--- a/debian/patches/debian-changes-1.3.7-1
+++ /dev/null
@@ -1,42 +0,0 @@
-Description: Upstream changes introduced in version 1.3.7-1
- This patch has been created by dpkg-source during the package build.
- Here's the last changelog entry, hopefully it gives details on why
- those changes were made:
- .
- mcu8051ide (1.3.7-1) unstable; urgency=low
- .
- * Initial release (Closes: #546549)
- * This is my first Debian package.
- .
- The person named in the Author field signed this changelog entry.
-Author: Fabricio Alcalde <f@lcald.com.ar>
-Bug-Debian: http://bugs.debian.org/546549
-
----
-The information above should follow the Patch Tagging Guidelines, please
-checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
-are templates for supplementary fields that you might want to add:
-
-Origin: <vendor|upstream|other>, <url of original patch>
-Bug: <url in upstream bugtracker>
-Bug-Debian: http://bugs.debian.org/<bugnumber>
-Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
-Forwarded: <no|not-needed|url proving that it has been forwarded>
-Reviewed-By: <name and email of someone who approved the patch>
-Last-Update: <YYYY-MM-DD>
-
---- /dev/null
-+++ mcu8051ide-1.3.7/mcu8051ide
-@@ -0,0 +1,2 @@
-+#!/bin/sh
-+exec tclsh8.5 /usr/share/mcu8051ide/lib/main.tcl "$@"
---- mcu8051ide-1.3.7.orig/mcu8051ide.desktop
-+++ mcu8051ide-1.3.7/mcu8051ide.desktop
-@@ -12,7 +12,6 @@ Name=MCU 8051 IDE
- Name[en_US]=MCU 8051 IDE
- StartupNotify=false
- Terminal=false
--TerminalOptions=
- TryExec=mcu8051ide
- Type=Application
- Version=1.0
diff --git a/debian/patches/fixdesktopfile.patch b/debian/patches/fixdesktopfile.patch
new file mode 100644
index 0000000..81f6797
--- /dev/null
+++ b/debian/patches/fixdesktopfile.patch
@@ -0,0 +1,23 @@
+Description: Removed deprecated options in .desktop file
+ Removed TerminalOptions and Encoding=UTF8.
+Author: Fabricio Alcalde <f@lcald.com.ar>
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/mcu8051ide.desktop
++++ b/mcu8051ide.desktop
+@@ -2,7 +2,6 @@
+ Categories=Development;
+ Comment=Graphical IDE for MCS-51 based microcontrollers
+ Comment[en_US]=Graphical IDE for MCS-51 based microcontrollers
+-Encoding=UTF-8
+ Exec=mcu8051ide
+ GenericName=MCU 8051 IDE
+ GenericName[en_US]=MCU 8051 IDE
+@@ -12,7 +11,6 @@
+ Name[en_US]=MCU 8051 IDE
+ StartupNotify=false
+ Terminal=false
+-TerminalOptions=
+ TryExec=mcu8051ide
+ Type=Application
+ Version=1.0
diff --git a/debian/patches/series b/debian/patches/series
index d8c397d..c3f1811 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1 +1,2 @@
-debian-changes-1.3.7-1
+fixdesktopfile.patch
+addlaunchscript.patch
diff --git a/debian/rules b/debian/rules
index ef5b18b..ae593ac 100755
--- a/debian/rules
+++ b/debian/rules
@@ -15,6 +15,9 @@ build-stamp:
dh_testdir
touch build-stamp
+build-arch: build
+build-indep: build
+
binary: binary-arch binary-indep
binary-arch: build
@@ -26,7 +29,7 @@ binary-indep: build
dh_prep
#Install files
- dh_install -Xlicence
+ dh_install --exclude=license.txt
dh_installdocs
dh_installmenu
dh_installman
diff --git a/debian/watch b/debian/watch
index b40eb34..8d74d48 100644
--- a/debian/watch
+++ b/debian/watch
@@ -1,23 +1,4 @@
-# Example watch control file for uscan
-# Rename this file to "watch" and then you can run the "uscan" command
-# to check for upstream updates and more.
-# See uscan(1) for format
-
# Compulsory line, this is a version 3 file
version=3
-# Uncomment to examine a Webpage
-# <Webpage URL> <string match>
-#http://www.example.com/downloads.php mcu8051ide-(.*)\.tar\.gz
-
-# Uncomment to examine a Webserver directory
-#http://www.example.com/pub/mcu8051ide-(.*)\.tar\.gz
-
-# Uncommment to examine a FTP server
-#ftp://ftp.example.com/pub/mcu8051ide-(.*)\.tar\.gz debian uupdate
-
-# Uncomment to find new files on sourceforge, for devscripts >= 2.9
- http://sf.net/mcu8051ide/mcu8051ide-(.*)\.tar\.gz
-
-# Uncomment to find new files on GooglePages
-# http://example.googlepages.com/foo.html mcu8051ide-(.*)\.tar\.gz
+http://sf.net/mcu8051ide/mcu8051ide-(.*)\.tar\.gz
diff --git a/demo/Demo project.mcu8051ide b/demo/Demo project.mcu8051ide
index 21f2ef6..707a648 100644
--- a/demo/Demo project.mcu8051ide
+++ b/demo/Demo project.mcu8051ide
@@ -12,7 +12,7 @@
<!-- Root element Parameters:
version - Project version (user defined)
date - Project last update (user defined)
- creator_ver - MCU 8051 IDE version (hardcoded in program)
+ creator_ver - MCU 8051 IDE version (hardcoded in the program)
-->
<!ATTLIST tk_mcuide_project
version CDATA #IMPLIED
@@ -71,9 +71,9 @@
grid - Grid mode
magnification - Magnification level (must be an integer between 0 and 3)
enabled - Graph enable flag (Boolean value 0 or 1)
- marks_s - List of state graph marks (String of zeros and ones, e.g. 00100110)
- marks_l - List of laches graph marks (String of zeros and ones, e.g. 00100110)
- marks_o - List of output graph marks (String of zeros and ones, e.g. 00100110)
+ marks_s - List of state graph marks (String of zeros and ones perfixed with 'X', and converted to hexadecimal)
+ marks_l - List of laches graph marks (String of zeros and ones perfixed with 'X', and converted to hexadecimal)
+ marks_o - List of output graph marks (String of zeros and ones perfixed with 'X', and converted to hexadecimal)
active_page - Active page
-->
<!ATTLIST graph
@@ -193,10 +193,10 @@
<!-- File path -->
<!ELEMENT path (#PCDATA)>
- <!-- Bookmarks: string of zeros and ones -->
+ <!-- Bookmarks: list of line numbers -->
<!ELEMENT bookmarks (#PCDATA)>
- <!-- Breakpoints: string of zeros and ones -->
+ <!-- Breakpoints: list of line numbers -->
<!ELEMENT breakpoints (#PCDATA)>
<!-- End Of Line character name -->
@@ -222,12 +222,12 @@
value CDATA #IMPLIED
>
]>
-<tk_mcuide_project version="0.9.5" date="03/02/09" creator_ver="1.3.3">
+<tk_mcuide_project version="1.0" date="11/28/2011" creator_ver="1.4.3">
<general>
<authors><![CDATA[Martin Osmera &lt;martin.osmera@gmail.com&gt;
]]></authors>
<copyright><![CDATA[]]></copyright>
- <licence><![CDATA[GPLv2]]></licence>
+ <license><![CDATA[GPLv2]]></license>
<processor type="AT89S2051" clock="12000" xdata="0" xcode="0"/>
<options
watches_file="demo.wtc"
@@ -238,13 +238,13 @@
<graph
grid="y"
magnification="0"
- enabled="1"
- marks_s="00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
- marks_l="00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
- marks_o="00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
+ enabled="0"
+ marks_s="X0000000000000000000000000000000000000000000"
+ marks_l="X0000000000000000000000000000000000000000000"
+ marks_o="X0000000000000000000000000000000000000000000"
active_page="output"
/>
- <description><![CDATA[This is demonstration project for MCU 8051 IDE and nothing more.
+ <description><![CDATA[This is demonstration project for MCU 8051 IDE and nothing less, nothing more.
Thank you for using MCU 8051 IDE.
]]></description>
@@ -290,24 +290,24 @@ Thank you for using MCU 8051 IDE.
/>
</general>
<other_options><![CDATA[]]></other_options>
- <compiler_options><![CDATA[{_title 0 _list 0 _print 0 _nomod 0 max_ihex_rec_length 255 _object 0 _pagelength 0 QUIET 0 _symbols 0 CREATE_SIM_FILE 1 CREATE_BIN_FILE 1 _pagewidth 0 optim_ena 0 _date 0 _paging 0 WARNING_LEVEL 0} 0 {--verbose 1 -i {} custom {} --columns 0 --omf-51 0} {adf 1} {-L 1 -M 0 custom {} -n 0 -P 0 -A 0 -a 0 -r {} -C 0 -c 0 -s 1 -U 0 -u 0 -g MAP -w 0 -cpu 8051 -x 0 -h 0 -quiet 0 -i {} -I 1} {ihex 1 adf 1} {--out-fmt-s19 0 --fdollars-in-identifiers 0 --nogcse 0 --nooverlay 1 --no-peep-comments 0 --no-c-code-in-asm 0 --print-search-dirs 0 --nostdlib 0 --peep-asm 0 --nolabelopt 0 --short-is-8bits 0 --cyclomatic 0 --compile-only 0 --no-reg-params 0 --noinvariant 0 --profile 0 --out-fmt-ihx 0 --noinduction 1 --opt-code-size 0 --nojtbound 0 --no-peep 0 --less-pedantic 0 --no-xinit-opt 0 --xstack 0 --funsigned-char 0 --verbose 1 -S 0 --debug 1 --preprocessonly 0 --opt-code-speed 0 --parms-in-bank1 0 --float-reent 0 -V 1 --c1mode 0 --fverbose-asm 0 --fommit-frame-pointer 0 --xram-movc 0 --main-return 0 --nostdinc 0 --noloopreverse 0 --stack-probe 0 --all-callee-saves 0 --int-long-reent 0 --stack-auto 0 --use-stdout 0} {standard --std-sdcc89 model --model-small stack --pack-iram custom {}} {--stack-size {} --code-loc {} --constseg {} --codeseg {} --xram-loc {} --data-loc {} --stack-loc {} --xstack-loc {} --lib-path {}} {--disable-warning {} -L {} -l {} -I {}} {} {}]]></compiler_options>
+ <compiler_options><![CDATA[{_title 0 _list 0 _print 0 _nomod 0 max_ihex_rec_length 255 _object 0 _pagelength 0 QUIET 0 _symbols 0 CREATE_SIM_FILE 1 CREATE_BIN_FILE 1 optim_ena 0 _pagewidth 0 WARNING_LEVEL 0 _paging 0 _date 0} 0 {--verbose 1 -i {} --omf-51 0 --columns 0 custom {}} {adf 1} {-L 1 -M 0 custom {} -n 0 -P 0 -A 0 -a 0 -r {} -C 0 -c 0 -s 1 -u 0 -U 0 -w 0 -g MAP -quiet 0 -h 0 -x 0 -cpu 8051 -I 1 -i {}} {ihex 1 adf 1} {--out-fmt-s19 0 --fdollars-in-identifiers 0 --nogcse 0 --nooverlay 1 --no-peep-comments 0 --no-c-code-in-asm 0 --print-search-dirs 0 --nostdlib 0 --compile-only 0 --peep-asm 0 --nolabelopt 0 --short-is-8bits 0 --cyclomatic 0 --profile 0 --noinvariant 0 --no-reg-params 0 --noinduction 1 --out-fmt-ihx 0 --nojtbound 0 --opt-code-size 0 --less-pedantic 0 --no-peep 0 -S 0 --verbose 1 --funsigned-char 0 --xstack 0 --no-xinit-opt 0 --debug 1 --preprocessonly 0 --c1mode 0 -V 1 --float-reent 0 --parms-in-bank1 0 --opt-code-speed 0 --nostdinc 0 --main-return 0 --xram-movc 0 --fommit-frame-pointer 0 --fverbose-asm 0 --int-long-reent 0 --all-callee-saves 0 --stack-probe 0 --noloopreverse 0 --stack-auto 0 --use-stdout 0} {model --model-small standard --std-sdcc89 stack {} custom {}} {--codeseg {} --constseg {} --code-loc {} --stack-size {} --xram-loc {} --lib-path {} --xstack-loc {} --stack-loc {} --data-loc {}} {-l {} -L {} --disable-warning {} -I {}} {-l 1 -A {} -F hex custom {}} {adf 1}]]></compiler_options>
<files
- count="9"
- current_file="8"
+ count="10"
+ current_file="0"
current_file2="-1"
pwin_sash="304"
selected_view="0"
pwin_orient="horizontal">
- <file name="demo0.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="0" read_only="0" highlight="0">
+ <file name="demo0.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="0" read_only="1" highlight="0">
<actual_line value="1"/>
- <md5_hash value="433B30D0A7A37EA31EA1FC96F9A63294"/>
+ <md5_hash value="477C5C6C6472852B9BCD48A6D3A103DF"/>
<path><![CDATA[]]></path>
<bookmarks>
- 00000000000000001000000000000
+ 16
</bookmarks>
<breakpoints>
- 00000000000000000100000000000
+ 17
</breakpoints>
<eol value="lf"/>
<encoding value="utf-8"/>
@@ -315,31 +315,31 @@ Thank you for using MCU 8051 IDE.
]]></notes>
</file>
- <file name="demo1.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="1" read_only="0" highlight="0">
+ <file name="demo1.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="1" read_only="1" highlight="0">
<actual_line value="1"/>
- <md5_hash value="D9C47EC024BB961B1F86B2A2C82D6D7A"/>
+ <md5_hash value="2078A8D0F7F402380D20B396DE54ECD6"/>
<path><![CDATA[]]></path>
<bookmarks>
- 00000000000000000000000000000000000000000000000000000000000000000
+ 0
</bookmarks>
<breakpoints>
- 00000000000000000000000000000000000000000000000000000000000000000
+ 0
</breakpoints>
<eol value="lf"/>
<encoding value="utf-8"/>
- <notes><![CDATA[Quite more advance demonstration code ...
+ <notes><![CDATA[A little more advanced demonstration code ...
]]></notes>
</file>
- <file name="demo2.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="2" read_only="0" highlight="0">
+ <file name="demo2.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="2" read_only="1" highlight="0">
<actual_line value="1"/>
- <md5_hash value="016FCF566042EC66EE9118BAFA4D4A35"/>
+ <md5_hash value="37AFD8BE8D1F3D6436C93B0B9616E95A"/>
<path><![CDATA[]]></path>
<bookmarks>
- 00000000000000000000000000000000000000000000000000000000000000000000000000000000
+ 0
</bookmarks>
<breakpoints>
- 00000000000000000000000000000000000000000000000000000000000000000000000000000000
+ 0
</breakpoints>
<eol value="lf"/>
<encoding value="utf-8"/>
@@ -347,90 +347,105 @@ Thank you for using MCU 8051 IDE.
]]></notes>
</file>
- <file name="demo3.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="3" read_only="0" highlight="0">
+ <file name="demo3.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="3" read_only="1" highlight="0">
<actual_line value="1"/>
- <md5_hash value="6180D365C7F535CABD42C3E78A0798B9"/>
+ <md5_hash value="5B8A70E1D6517500E2AE4F4FA5B98BC5"/>
<path><![CDATA[]]></path>
<bookmarks>
- 00000000000000000000000000000000000000000000000000000000000000000000000000
+ 0
</bookmarks>
<breakpoints>
- 00000000000000000000000000000000000000000000000000000000000000000000000000
+ 0
</breakpoints>
<eol value="lf"/>
<encoding value="utf-8"/>
<notes><![CDATA[]]></notes>
</file>
- <file name="demo5.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="4" read_only="0" highlight="0">
- <actual_line value="13"/>
- <md5_hash value="8A77C444C26BA55C5A8AC82FE0C8CFA9"/>
+ <file name="demo5.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="4" read_only="1" highlight="0">
+ <actual_line value="1"/>
+ <md5_hash value="83FBE8C57ABDDCD92CDD70B3C5326563"/>
<path><![CDATA[]]></path>
<bookmarks>
- 000000000000000000000000000000000000
+ 0
</bookmarks>
<breakpoints>
- 000000000000000000000000000000000000
+ 0
</breakpoints>
<eol value="lf"/>
<encoding value="utf-8"/>
<notes><![CDATA[]]></notes>
</file>
- <file name="demo_c_0.c" active="yes" o_bookmark="0" p_bookmark="0" file_index="5" read_only="0" highlight="1">
+ <file name="demo_c_0.c" active="yes" o_bookmark="0" p_bookmark="0" file_index="5" read_only="1" highlight="1">
<actual_line value="1"/>
- <md5_hash value="79C98C5ADE29831807D59F6BC438063A"/>
+ <md5_hash value="A958F84B552CBBD6CB8D8FA776FEB327"/>
<path><![CDATA[]]></path>
<bookmarks>
- 0000000000000000000000000000000000000000000
+ 0
</bookmarks>
<breakpoints>
- 0000000000000000000000000000000000000000000
+ 0
</breakpoints>
<eol value="lf"/>
<encoding value="utf-8"/>
<notes><![CDATA[]]></notes>
</file>
- <file name="ledmatrix.c" active="yes" o_bookmark="0" p_bookmark="0" file_index="6" read_only="0" highlight="1">
+ <file name="ledmatrix.c" active="yes" o_bookmark="0" p_bookmark="0" file_index="6" read_only="1" highlight="1">
<actual_line value="1"/>
<md5_hash value="517133F895352F3918C3E1250EA990A5"/>
<path><![CDATA[]]></path>
<bookmarks>
- 000000000000000000000000000000000000000000000
+ 0
+ </bookmarks>
+ <breakpoints>
+ 0
+ </breakpoints>
+ <eol value="lf"/>
+ <encoding value="utf-8"/>
+ <notes><![CDATA[]]></notes>
+ </file>
+
+ <file name="keypad_display.c" active="yes" o_bookmark="0" p_bookmark="0" file_index="7" read_only="1" highlight="1">
+ <actual_line value="1"/>
+ <md5_hash value="250BC76DCCF444C4F982EB733E057F5E"/>
+ <path><![CDATA[]]></path>
+ <bookmarks>
+ 0
</bookmarks>
<breakpoints>
- 000000000000000000000000000000000000000000000
+ 0
</breakpoints>
<eol value="lf"/>
<encoding value="utf-8"/>
<notes><![CDATA[]]></notes>
</file>
- <file name="keypad_display.c" active="yes" o_bookmark="0" p_bookmark="0" file_index="7" read_only="0" highlight="1">
- <actual_line value="10"/>
- <md5_hash value="E44E4DC2094E8EB729FE653002B40A33"/>
+ <file name="mleddisplay.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="8" read_only="1" highlight="0">
+ <actual_line value="1"/>
+ <md5_hash value="8BF7EBDCE29A2FCF7D73079108BBAD39"/>
<path><![CDATA[]]></path>
<bookmarks>
- 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+ 0
</bookmarks>
<breakpoints>
- 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+ 0
</breakpoints>
<eol value="lf"/>
<encoding value="utf-8"/>
<notes><![CDATA[]]></notes>
</file>
- <file name="mleddisplay.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="8" read_only="0" highlight="0">
- <actual_line value="15"/>
- <md5_hash value="BFC1B21D558BFAE2B1E43162DAEFE347"/>
+ <file name="LCD.asm" active="yes" o_bookmark="0" p_bookmark="0" file_index="9" read_only="1" highlight="0">
+ <actual_line value="1"/>
+ <md5_hash value="03C83A56F6DD9B68A2D385DD90C81D42"/>
<path><![CDATA[]]></path>
<bookmarks>
- 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+ 0
</bookmarks>
<breakpoints>
- 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+ 0
</breakpoints>
<eol value="lf"/>
<encoding value="utf-8"/>
@@ -438,4 +453,4 @@ Thank you for using MCU 8051 IDE.
</file>
</files>
-</tk_mcuide_project> \ No newline at end of file
+</tk_mcuide_project>
diff --git a/demo/LCD.adf b/demo/LCD.adf
new file mode 100644
index 0000000..96f4a33
--- /dev/null
+++ b/demo/LCD.adf
@@ -0,0 +1,65 @@
+# Assembler debug file for MCU 8051 IDE v1.4.7
+# Used assembler: MCU 8051 IDE
+# Date: 12/28/2012
+03C83A56F6DD9B68A2D385DD90C81D42 "LCD.asm"
+0 14 0 2 0 28
+0 27 3 87
+0 27 4 101
+0 27 5 108
+0 27 6 99
+0 27 7 111
+0 27 8 109
+0 27 9 101
+0 27 10 32
+0 27 11 116
+0 27 12 111
+0 27 13 32
+0 27 14 77
+0 27 15 67
+0 27 16 85
+0 27 17 32
+0 27 18 56
+0 27 19 48
+0 27 20 53
+0 27 21 49
+0 27 22 32
+0 27 23 73
+0 27 24 68
+0 27 25 69
+0 27 26 33
+0 27 27 0
+0 29 28 117 144 0
+0 30 31 194 177
+0 31 33 144 0 3
+0 33 36 194 176
+0 34 38 210 178
+0 34 40 117 144 1
+0 34 43 194 178
+0 35 45 210 178
+0 35 47 117 144 2
+0 35 50 194 178
+0 36 52 210 178
+0 36 54 117 144 6
+0 36 57 194 178
+0 37 59 210 178
+0 37 61 117 144 15
+0 37 64 194 178
+0 38 66 210 178
+0 38 68 117 144 30
+0 38 71 194 178
+0 39 73 210 178
+0 39 75 117 144 60
+0 39 78 194 178
+0 40 80 210 178
+0 40 82 117 144 129
+0 40 85 194 178
+0 43 87 210 176
+0 44 89 120 0
+0 45 91 232
+0 46 92 8
+0 47 93 147
+0 48 94 210 178
+0 48 96 245 144
+0 48 98 194 178
+0 49 100 180 0 244
+0 50 103 128 187 \ No newline at end of file
diff --git a/demo/LCD.asm b/demo/LCD.asm
new file mode 100644
index 0000000..9a1909f
--- /dev/null
+++ b/demo/LCD.asm
@@ -0,0 +1,52 @@
+; Very basic demonstration example for HD44780 simulator
+; * Click on "Virtual HW" in the main menu,
+; * choose "Open",
+; * change filter to VH Component,
+; * open "LCD.vhc",
+; * press F2,
+; * press F6,
+; * enjoy ... :-)
+; * press F2 to end.
+;
+; Note: simulated delays are skipped in this example.
+;
+ org 0
+ jmp start
+
+RS bit P3.0
+RW bit P3.1
+E bit P3.2
+D equ P1
+
+cmd macro cmd_code
+ setb E
+ mov D, cmd_code
+ clr E
+endm
+
+string: db 'Welcome to MCU 8051 IDE!\0'
+
+start: mov D, #0
+ clr RW
+ mov DPTR, #string
+
+main: clr RS
+ cmd #00000001b ; Clear display
+ cmd #00000010b ; Cursor home
+ cmd #00000110b ; Entry mode set
+ cmd #00001111b ; Display ON/OFF control
+ cmd #00011110b ; Cursor/display shift
+ cmd #00111100b ; Function set
+ cmd #10000001b ; Set DDRAM address
+
+ ; Print the string ...
+ setb RS
+ mov R0, #0
+print: mov A, R0
+ inc R0
+ movc A, @A+DPTR
+ cmd A
+ cjne A, #0, print
+ sjmp main
+
+ end
diff --git a/demo/LCD.hex b/demo/LCD.hex
new file mode 100644
index 0000000..832f623
--- /dev/null
+++ b/demo/LCD.hex
@@ -0,0 +1,8 @@
+:1000000002001C57656C636F6D6520746F204D4353
+:0F00100055203830353120494445210075900086
+:10001F00C2B1900003C2B0D2B2759001C2B2D2B2D7
+:0E002F00759002C2B2D2B2759006C2B2D2B2C1
+:0E003D0075900FC2B2D2B275901EC2B2D2B28E
+:10004B0075903CC2B2D2B2759081C2B2D2B0780078
+:0E005B00E80893D2B2F590C2B2B400F480BBB4
+:00000001FF
diff --git a/demo/LCD.lst b/demo/LCD.lst
new file mode 100644
index 0000000..f1217ff
--- /dev/null
+++ b/demo/LCD.lst
@@ -0,0 +1,273 @@
+LCD PAGE 1
+ 1 ; Very basic demonstration example for HD44780 simulator
+ 2 ; * Click on "Virtual HW" in the main menu,
+ 3 ; * choose "Open",
+ 4 ; * change filter to VH Component,
+ 5 ; * open "LCD.vhc",
+ 6 ; * press F2,
+ 7 ; * press F6,
+ 8 ; * enjoy ... :-)
+ 9 ; * press F2 to end.
+ 10 ;
+ 11 ; Note: simulated delays are skipped in this example.
+ 12 ;
+ 13 org 0
+0000 02001C 14 jmp start
+ 15
+ 00B0 16 RS bit P3.0
+ 00B1 17 RW bit P3.1
+ 00B2 18 E bit P3.2
+ 0090 19 D equ P1
+ 20
+ 21 cmd macro cmd_code
+ 22 setb E
+ 23 mov D, cmd_code
+ 24 clr E
+ 25 endm
+ 26
+0003 57656C636F 27 string: db 'Welcome to MCU 8051 IDE!\0'
+ 6D6520746F
+ 204D435520
+ 3830353120
+ 4944452100
+ 28
+001C 759000 29 start: mov D, #0
+001F C2B1 30 clr RW
+0021 900003 31 mov DPTR, #string
+ 32
+0024 C2B0 33 main: clr RS
+ 34 +1 cmd #00000001b ; Clear display
+0026 D2B2 35 +1 setb e
+0028 759001 36 +1 mov d , #00000001b
+002B C2B2 37 +1 clr e
+ 38 +1 cmd #00000010b ; Cursor home
+002D D2B2 39 +1 setb e
+002F 759002 40 +1 mov d , #00000010b
+0032 C2B2 41 +1 clr e
+ 42 +1 cmd #00000110b ; Entry mode set
+0034 D2B2 43 +1 setb e
+0036 759006 44 +1 mov d , #00000110b
+0039 C2B2 45 +1 clr e
+ 46 +1 cmd #00001111b ; Display ON/OFF control
+003B D2B2 47 +1 setb e
+003D 75900F 48 +1 mov d , #00001111b
+0040 C2B2 49 +1 clr e
+ 50 +1 cmd #00011110b ; Cursor/display shift
+0042 D2B2 51 +1 setb e
+0044 75901E 52 +1 mov d , #00011110b
+0047 C2B2 53 +1 clr e
+ 54 +1 cmd #00111100b ; Function set
+0049 D2B2 55 +1 setb e
+004B 75903C 56 +1 mov d , #00111100b
+004E C2B2 57 +1 clr e
+ 58 +1 cmd #10000001b ; Set DDRAM address
+0050 D2B2 59 +1 setb e
+0052 759081 60 +1 mov d , #10000001b
+0055 C2B2 61 +1 clr e
+ 62
+ 63 ; Print the string ...
+0057 D2B0 64 setb RS
+0059 7800 65 mov R0, #0
+005B E8 66 print: mov A, R0
+005C 08 67 inc R0
+005D 93 68 movc A, @A+DPTR
+ 69 +1 cmd A
+005E D2B2 70 +1 setb e
+0060 F590 71 +1 mov d , A
+0062 C2B2 72 +1 clr e
+0064 B400F4 73 cjne A, #0, print
+0067 80BB 74 sjmp main
+ 75
+ 76 end
+ASSEMBLY COMPLETE, NO ERRORS FOUND, NO WARNINGS
+
+
+SYMBOL TABLE:
+??MCU_8051_IDE . . . . . . . . . . . N NUMB 8051H NOT USED
+??VERSION. . . . . . . . . . . . . . N NUMB 0147H NOT USED
+AC . . . . . . . . . . . . . . . . . B ADDR 00D6H NOT USED
+ACC. . . . . . . . . . . . . . . . . D ADDR 00E0H NOT USED
+ACSR . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED
+ADCF . . . . . . . . . . . . . . . . D ADDR 00F6H NOT USED
+ADCLK. . . . . . . . . . . . . . . . D ADDR 00F2H NOT USED
+ADCON. . . . . . . . . . . . . . . . D ADDR 00F3H NOT USED
+ADDH . . . . . . . . . . . . . . . . D ADDR 00F5H NOT USED
+ADDL . . . . . . . . . . . . . . . . D ADDR 00F4H NOT USED
+AUXR . . . . . . . . . . . . . . . . D ADDR 008EH NOT USED
+AUXR1. . . . . . . . . . . . . . . . D ADDR 00A2H NOT USED
+B. . . . . . . . . . . . . . . . . . D ADDR 00F0H NOT USED
+BDRCON . . . . . . . . . . . . . . . D ADDR 009BH NOT USED
+BDRCON_1 . . . . . . . . . . . . . . D ADDR 009CH NOT USED
+BRL. . . . . . . . . . . . . . . . . D ADDR 009AH NOT USED
+CCAP0H . . . . . . . . . . . . . . . D ADDR 00FAH NOT USED
+CCAP0L . . . . . . . . . . . . . . . D ADDR 00EAH NOT USED
+CCAP1H . . . . . . . . . . . . . . . D ADDR 00FBH NOT USED
+CCAP1L . . . . . . . . . . . . . . . D ADDR 00EBH NOT USED
+CCAP2H . . . . . . . . . . . . . . . D ADDR 00FCH NOT USED
+CCAP3H . . . . . . . . . . . . . . . D ADDR 00FDH NOT USED
+CCAP4H . . . . . . . . . . . . . . . D ADDR 00FEH NOT USED
+CCAPL2H. . . . . . . . . . . . . . . D ADDR 00FCH NOT USED
+CCAPL2L. . . . . . . . . . . . . . . D ADDR 00ECH NOT USED
+CCAPL3H. . . . . . . . . . . . . . . D ADDR 00FDH NOT USED
+CCAPL3L. . . . . . . . . . . . . . . D ADDR 00EDH NOT USED
+CCAPL4H. . . . . . . . . . . . . . . D ADDR 00FEH NOT USED
+CCAPL4L. . . . . . . . . . . . . . . D ADDR 00EEH NOT USED
+CCAPM0 . . . . . . . . . . . . . . . D ADDR 00DAH NOT USED
+CCAPM1 . . . . . . . . . . . . . . . D ADDR 00DBH NOT USED
+CCAPM2 . . . . . . . . . . . . . . . D ADDR 00DCH NOT USED
+CCAPM3 . . . . . . . . . . . . . . . D ADDR 00DDH NOT USED
+CCAPM4 . . . . . . . . . . . . . . . D ADDR 00DEH NOT USED
+CCF0 . . . . . . . . . . . . . . . . B ADDR 00D8H NOT USED
+CCF1 . . . . . . . . . . . . . . . . B ADDR 00D9H NOT USED
+CCF2 . . . . . . . . . . . . . . . . B ADDR 00DAH NOT USED
+CCF3 . . . . . . . . . . . . . . . . B ADDR 00DBH NOT USED
+CCF4 . . . . . . . . . . . . . . . . B ADDR 00DCH NOT USED
+CCON . . . . . . . . . . . . . . . . D ADDR 00D8H NOT USED
+CFINT. . . . . . . . . . . . . . . . C ADDR 0033H NOT USED
+CH . . . . . . . . . . . . . . . . . D ADDR 00F9H NOT USED
+CKCON. . . . . . . . . . . . . . . . D ADDR 008FH NOT USED
+CKCON0 . . . . . . . . . . . . . . . D ADDR 008FH NOT USED
+CKRL . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED
+CKSEL. . . . . . . . . . . . . . . . D ADDR 0085H NOT USED
+CL . . . . . . . . . . . . . . . . . D ADDR 00E9H NOT USED
+CLKREG . . . . . . . . . . . . . . . D ADDR 008FH NOT USED
+CMOD . . . . . . . . . . . . . . . . D ADDR 00D9H NOT USED
+CPRL2. . . . . . . . . . . . . . . . B ADDR 00C8H NOT USED
+CR . . . . . . . . . . . . . . . . . B ADDR 00DEH NOT USED
+CT2. . . . . . . . . . . . . . . . . B ADDR 00C9H NOT USED
+CY . . . . . . . . . . . . . . . . . B ADDR 00D7H NOT USED
+D. . . . . . . . . . . . . . . . . . N NUMB 0090H
+DP0H . . . . . . . . . . . . . . . . D ADDR 0083H NOT USED
+DP0L . . . . . . . . . . . . . . . . D ADDR 0082H NOT USED
+DP1H . . . . . . . . . . . . . . . . D ADDR 0085H NOT USED
+DP1L . . . . . . . . . . . . . . . . D ADDR 0084H NOT USED
+DPH. . . . . . . . . . . . . . . . . D ADDR 0083H NOT USED
+DPL. . . . . . . . . . . . . . . . . D ADDR 0082H NOT USED
+E. . . . . . . . . . . . . . . . . . B ADDR 00B2H
+EA . . . . . . . . . . . . . . . . . B ADDR 00AFH NOT USED
+EC . . . . . . . . . . . . . . . . . B ADDR 00AEH NOT USED
+EECON. . . . . . . . . . . . . . . . D ADDR 0096H NOT USED
+ES . . . . . . . . . . . . . . . . . B ADDR 00ACH NOT USED
+ET0. . . . . . . . . . . . . . . . . B ADDR 00A9H NOT USED
+ET1. . . . . . . . . . . . . . . . . B ADDR 00ABH NOT USED
+ET2. . . . . . . . . . . . . . . . . B ADDR 00ADH NOT USED
+EX0. . . . . . . . . . . . . . . . . B ADDR 00A8H NOT USED
+EX1. . . . . . . . . . . . . . . . . B ADDR 00AAH NOT USED
+EXEN2. . . . . . . . . . . . . . . . B ADDR 00CBH NOT USED
+EXF2 . . . . . . . . . . . . . . . . B ADDR 00CEH NOT USED
+EXTI0. . . . . . . . . . . . . . . . C ADDR 0003H NOT USED
+EXTI1. . . . . . . . . . . . . . . . C ADDR 0013H NOT USED
+F0 . . . . . . . . . . . . . . . . . B ADDR 00D5H NOT USED
+FE . . . . . . . . . . . . . . . . . B ADDR 009FH NOT USED
+IE . . . . . . . . . . . . . . . . . D ADDR 00A8H NOT USED
+IE0. . . . . . . . . . . . . . . . . B ADDR 0089H NOT USED
+IE1. . . . . . . . . . . . . . . . . B ADDR 008BH NOT USED
+INT0 . . . . . . . . . . . . . . . . B ADDR 00B2H NOT USED
+INT1 . . . . . . . . . . . . . . . . B ADDR 00B3H NOT USED
+IP . . . . . . . . . . . . . . . . . D ADDR 00B8H NOT USED
+IPH. . . . . . . . . . . . . . . . . D ADDR 00B7H NOT USED
+IPH0 . . . . . . . . . . . . . . . . D ADDR 00B7H NOT USED
+IPH1 . . . . . . . . . . . . . . . . D ADDR 00B3H NOT USED
+IPL0 . . . . . . . . . . . . . . . . D ADDR 00B8H NOT USED
+IPL1 . . . . . . . . . . . . . . . . D ADDR 00B2H NOT USED
+IT0. . . . . . . . . . . . . . . . . B ADDR 0088H NOT USED
+IT1. . . . . . . . . . . . . . . . . B ADDR 008AH NOT USED
+KBE. . . . . . . . . . . . . . . . . D ADDR 009DH NOT USED
+KBF. . . . . . . . . . . . . . . . . D ADDR 009EH NOT USED
+KBLS . . . . . . . . . . . . . . . . D ADDR 009CH NOT USED
+MAIN . . . . . . . . . . . . . . . . C ADDR 0024H
+OSCCON . . . . . . . . . . . . . . . D ADDR 0086H NOT USED
+OV . . . . . . . . . . . . . . . . . B ADDR 00D2H NOT USED
+P. . . . . . . . . . . . . . . . . . B ADDR 00D0H NOT USED
+P0 . . . . . . . . . . . . . . . . . D ADDR 0080H NOT USED
+P1 . . . . . . . . . . . . . . . . . D ADDR 0090H NOT USED
+P1M1 . . . . . . . . . . . . . . . . D ADDR 00D4H NOT USED
+P1M2 . . . . . . . . . . . . . . . . D ADDR 00E2H NOT USED
+P2 . . . . . . . . . . . . . . . . . D ADDR 00A0H NOT USED
+P3 . . . . . . . . . . . . . . . . . D ADDR 00B0H NOT USED
+P3M1 . . . . . . . . . . . . . . . . D ADDR 00D5H NOT USED
+P3M2 . . . . . . . . . . . . . . . . D ADDR 00E3H NOT USED
+P4 . . . . . . . . . . . . . . . . . D ADDR 00C0H NOT USED
+P4M1 . . . . . . . . . . . . . . . . D ADDR 00D6H NOT USED
+P4M2 . . . . . . . . . . . . . . . . D ADDR 00E4H NOT USED
+P5 . . . . . . . . . . . . . . . . . D ADDR 00E8H NOT USED
+PC . . . . . . . . . . . . . . . . . B ADDR 00BEH NOT USED
+PCON . . . . . . . . . . . . . . . . D ADDR 0087H NOT USED
+PPCL . . . . . . . . . . . . . . . . B ADDR 00BEH NOT USED
+PRINT. . . . . . . . . . . . . . . . C ADDR 005BH
+PS . . . . . . . . . . . . . . . . . B ADDR 00BCH NOT USED
+PSL. . . . . . . . . . . . . . . . . B ADDR 00BCH NOT USED
+PSW. . . . . . . . . . . . . . . . . D ADDR 00D0H NOT USED
+PT0. . . . . . . . . . . . . . . . . B ADDR 00B9H NOT USED
+PT0L . . . . . . . . . . . . . . . . B ADDR 00B9H NOT USED
+PT1. . . . . . . . . . . . . . . . . B ADDR 00BBH NOT USED
+PT1L . . . . . . . . . . . . . . . . B ADDR 00BBH NOT USED
+PT2. . . . . . . . . . . . . . . . . B ADDR 00BDH NOT USED
+PT2L . . . . . . . . . . . . . . . . B ADDR 00BDH NOT USED
+PX0. . . . . . . . . . . . . . . . . B ADDR 00B8H NOT USED
+PX0L . . . . . . . . . . . . . . . . B ADDR 00B8H NOT USED
+PX1. . . . . . . . . . . . . . . . . B ADDR 00BAH NOT USED
+PX1L . . . . . . . . . . . . . . . . B ADDR 00BAH NOT USED
+RB8. . . . . . . . . . . . . . . . . B ADDR 009AH NOT USED
+RCAP2H . . . . . . . . . . . . . . . D ADDR 00CBH NOT USED
+RCAP2L . . . . . . . . . . . . . . . D ADDR 00CAH NOT USED
+RCLK . . . . . . . . . . . . . . . . B ADDR 00CDH NOT USED
+RD . . . . . . . . . . . . . . . . . B ADDR 00B7H NOT USED
+REN. . . . . . . . . . . . . . . . . B ADDR 009CH NOT USED
+RESET. . . . . . . . . . . . . . . . C ADDR 0000H NOT USED
+RI . . . . . . . . . . . . . . . . . B ADDR 0098H NOT USED
+RS . . . . . . . . . . . . . . . . . B ADDR 00B0H
+RS0. . . . . . . . . . . . . . . . . B ADDR 00D3H NOT USED
+RS1. . . . . . . . . . . . . . . . . B ADDR 00D4H NOT USED
+RW . . . . . . . . . . . . . . . . . B ADDR 00B1H
+RXD. . . . . . . . . . . . . . . . . B ADDR 00B0H NOT USED
+SADDR. . . . . . . . . . . . . . . . D ADDR 00A9H NOT USED
+SADDR_0. . . . . . . . . . . . . . . D ADDR 00A9H NOT USED
+SADDR_1. . . . . . . . . . . . . . . D ADDR 00AAH NOT USED
+SADEN. . . . . . . . . . . . . . . . D ADDR 00B9H NOT USED
+SADEN_0. . . . . . . . . . . . . . . D ADDR 00B9H NOT USED
+SADEN_1. . . . . . . . . . . . . . . D ADDR 00BAH NOT USED
+SBUF . . . . . . . . . . . . . . . . D ADDR 0099H NOT USED
+SCON . . . . . . . . . . . . . . . . D ADDR 0098H NOT USED
+SINT . . . . . . . . . . . . . . . . C ADDR 0023H NOT USED
+SM0. . . . . . . . . . . . . . . . . B ADDR 009FH NOT USED
+SM1. . . . . . . . . . . . . . . . . B ADDR 009EH NOT USED
+SM2. . . . . . . . . . . . . . . . . B ADDR 009DH NOT USED
+SP . . . . . . . . . . . . . . . . . D ADDR 0081H NOT USED
+SPCON. . . . . . . . . . . . . . . . D ADDR 00C3H NOT USED
+SPCR . . . . . . . . . . . . . . . . D ADDR 00D5H NOT USED
+SPDAT. . . . . . . . . . . . . . . . D ADDR 00C5H NOT USED
+SPDR . . . . . . . . . . . . . . . . D ADDR 0086H NOT USED
+SPSR . . . . . . . . . . . . . . . . D ADDR 00AAH NOT USED
+SPSTA. . . . . . . . . . . . . . . . D ADDR 00C4H NOT USED
+START. . . . . . . . . . . . . . . . C ADDR 001CH
+STRING . . . . . . . . . . . . . . . C ADDR 0003H
+T0 . . . . . . . . . . . . . . . . . B ADDR 00B4H NOT USED
+T1 . . . . . . . . . . . . . . . . . B ADDR 00B5H NOT USED
+T2CON. . . . . . . . . . . . . . . . D ADDR 00C8H NOT USED
+T2MOD. . . . . . . . . . . . . . . . D ADDR 00C9H NOT USED
+TB8. . . . . . . . . . . . . . . . . B ADDR 009BH NOT USED
+TCLK . . . . . . . . . . . . . . . . B ADDR 00CCH NOT USED
+TCON . . . . . . . . . . . . . . . . D ADDR 0088H NOT USED
+TF0. . . . . . . . . . . . . . . . . B ADDR 008DH NOT USED
+TF1. . . . . . . . . . . . . . . . . B ADDR 008FH NOT USED
+TF2. . . . . . . . . . . . . . . . . B ADDR 00CFH NOT USED
+TH0. . . . . . . . . . . . . . . . . D ADDR 008CH NOT USED
+TH1. . . . . . . . . . . . . . . . . D ADDR 008DH NOT USED
+TH2. . . . . . . . . . . . . . . . . D ADDR 00CDH NOT USED
+TI . . . . . . . . . . . . . . . . . B ADDR 0099H NOT USED
+TIMER0 . . . . . . . . . . . . . . . C ADDR 000BH NOT USED
+TIMER1 . . . . . . . . . . . . . . . C ADDR 001BH NOT USED
+TIMER2 . . . . . . . . . . . . . . . C ADDR 002BH NOT USED
+TL0. . . . . . . . . . . . . . . . . D ADDR 008AH NOT USED
+TL1. . . . . . . . . . . . . . . . . D ADDR 008BH NOT USED
+TL2. . . . . . . . . . . . . . . . . D ADDR 00CCH NOT USED
+TMOD . . . . . . . . . . . . . . . . D ADDR 0089H NOT USED
+TR0. . . . . . . . . . . . . . . . . B ADDR 008CH NOT USED
+TR1. . . . . . . . . . . . . . . . . B ADDR 008EH NOT USED
+TR2. . . . . . . . . . . . . . . . . B ADDR 00CAH NOT USED
+TXD. . . . . . . . . . . . . . . . . B ADDR 00B1H NOT USED
+WDTCON . . . . . . . . . . . . . . . D ADDR 00A7H NOT USED
+WDTPRG . . . . . . . . . . . . . . . D ADDR 00A7H NOT USED
+WDTRST . . . . . . . . . . . . . . . D ADDR 00A6H NOT USED
+WR . . . . . . . . . . . . . . . . . B ADDR 00B6H NOT USED \ No newline at end of file
diff --git a/demo/LCD.vhc b/demo/LCD.vhc
new file mode 100644
index 0000000..16d8582
--- /dev/null
+++ b/demo/LCD.vhc
@@ -0,0 +1,4 @@
+# MCU 8051 IDE: Virtual HW configuration file
+# Project: Demo project
+
+LcdHD44780 {2 24 633x172+515+234 {0 3 4 1 8 1 1 3 5 1 9 1 10 1 2 3 6 1 3 1 7 1} {0 7 4 1 8 5 1 6 5 2 9 6 10 7 2 5 6 3 3 0 7 4} {} 1 1 0 0 0 1 1x1+0+0 withdrawn {0 {}} {0 {}} 1}
diff --git a/demo/demo0.adf b/demo/demo0.adf
index 7de7de2..488eaa3 100644
--- a/demo/demo0.adf
+++ b/demo/demo0.adf
@@ -1,7 +1,7 @@
-# Assembler debug file for MCU 8051 IDE v1.1
+# Assembler debug file for MCU 8051 IDE v1.4.7
# Used assembler: MCU 8051 IDE
-# Date: 03/02/09
-87B0FFA871A3B2978A4FD4309AE5D3D4 "demo0.asm"
+# Date: 12/28/2012
+477C5C6C6472852B9BCD48A6D3A103DF "demo0.asm"
0 8 0 8
0 9 1 6
0 10 2 184 127 251
diff --git a/demo/demo0.asm b/demo/demo0.asm
index f44ee47..52bc58a 100644
--- a/demo/demo0.asm
+++ b/demo/demo0.asm
@@ -1,10 +1,10 @@
-; MCU 8051 IDE - Demostration code
+; MCU 8051 IDE - Demonstration code
; Very simple code
; Press F2 and F6 to run the program (start simulator and animate)
org 0h
-
+
main: inc R0
inc @R0
cjne R0, #07Fh, main
diff --git a/demo/demo0.bin b/demo/demo0.bin
deleted file mode 100644
index 5511873..0000000
--- a/demo/demo0.bin
+++ /dev/null
@@ -1 +0,0 @@
- \ No newline at end of file
diff --git a/demo/demo0.hex b/demo/demo0.hex
index d34107a..191e6c0 100644
--- a/demo/demo0.hex
+++ b/demo/demo0.hex
@@ -1,2 +1,2 @@
:090000000806B87FFB780080F7C8
-:00000001FF \ No newline at end of file
+:00000001FF
diff --git a/demo/demo0.lst b/demo/demo0.lst
index 2a87958..962e719 100644
--- a/demo/demo0.lst
+++ b/demo/demo0.lst
@@ -1,22 +1,24 @@
demo0 PAGE 1
- 1 ; MCU 8051 IDE - Demostration code
+ 1 ; MCU 8051 IDE - Demonstration code
2 ; Very simple code
3
4 ; Press F2 and F6 to run the program (start simulator and animate)
5
6 org 0h
7
-0000 06 8 main: inc R0
-0001 B87FFB 9 inc @R0
-0002 7800 10 cjne R0, #07Fh, main
-0005 80F7 11 mov R0, #0d
- 12 sjmp main
+0000 08 8 main: inc R0
+0001 06 9 inc @R0
+0002 B87FFB 10 cjne R0, #07Fh, main
+0005 7800 11 mov R0, #0d
+0007 80F7 12 sjmp main
13
14 end
ASSEMBLY COMPLETE, NO ERRORS FOUND, NO WARNINGS
SYMBOL TABLE:
+??MCU_8051_IDE . . . . . . . . . . . N NUMB 8051H NOT USED
+??VERSION. . . . . . . . . . . . . . N NUMB 0147H NOT USED
AC . . . . . . . . . . . . . . . . . B ADDR 00D6H NOT USED
ACC. . . . . . . . . . . . . . . . . D ADDR 00E0H NOT USED
ACSR . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED
diff --git a/demo/demo0.sim b/demo/demo0.sim
deleted file mode 100644
index a2482bc..0000000
--- a/demo/demo0.sim
+++ /dev/null
@@ -1,6 +0,0 @@
-458DB610414A7EC882B8DFA06C1D6748 12/21/07 demo0.asm
-8 0 8
-9 1 6
-10 2 184 127 251
-11 5 120 0
-12 7 128 247 \ No newline at end of file
diff --git a/demo/demo1.adf b/demo/demo1.adf
index e4387cf..0a7873a 100644
--- a/demo/demo1.adf
+++ b/demo/demo1.adf
@@ -1,7 +1,7 @@
-# Assembler debug file for MCU 8051 IDE v1.1
+# Assembler debug file for MCU 8051 IDE v1.4.7
# Used assembler: MCU 8051 IDE
-# Date: 03/02/09
-D9C47EC024BB961B1F86B2A2C82D6D7A "demo1.asm"
+# Date: 12/28/2012
+2078A8D0F7F402380D20B396DE54ECD6 "demo1.asm"
0 48 0 128 0
0 52 2 117 144 15
0 53 5 117 176 30
@@ -16,4 +16,4 @@ D9C47EC024BB961B1F86B2A2C82D6D7A "demo1.asm"
0 58 24 35
0 58 25 245 144
0 59 27 128 237
-0 17 29 4 \ No newline at end of file
+0 17 511 4 \ No newline at end of file
diff --git a/demo/demo1.asm b/demo/demo1.asm
index 3ba82dd..0587166 100644
--- a/demo/demo1.asm
+++ b/demo/demo1.asm
@@ -1,11 +1,11 @@
-; MCU 8051 IDE - Demostration code
+; MCU 8051 IDE - Demonstration code
; Macro instructions, conditional compilation and constants
; Try tab "Graph" on bottom panel
; Press F2 and F6 to run the program (start simulator and animate)
$TITLE('DEMO 2') ; Set title for code listing
-$DATE(36/-4/1907) ; Set date for code listing
+$DATE(11/29/1182) ; Set date for code listing (the 29th of November 1182, welcome back to the Medieval Era)
; Constant definitions
; --------------------
@@ -16,10 +16,10 @@ inc_dec equ 100 / X ; Flag: Increment/Decrement counter
cseg at 1FFh ; Code segment starts at 0x1FF
something: db 4d ; Reserve 4 bytes in this segment
-; Macro instructions
+; Macro instructions
; --------------------
-;; Shift the given registeres
+;; Shift the given registers
shift macro reg0, reg1
; Increment / Decrement counter
@@ -42,7 +42,7 @@ shift macro reg0, reg1
mov reg0, A
endm
-; Program initilization
+; Program initialization
; --------------------
org 0h
sjmp start
diff --git a/demo/demo1.bin b/demo/demo1.bin
deleted file mode 100644
index 4f74af1..0000000
--- a/demo/demo1.bin
+++ /dev/null
Binary files differ
diff --git a/demo/demo1.hex b/demo/demo1.hex
index f83cb51..1e95cae 100644
--- a/demo/demo1.hex
+++ b/demo/demo1.hex
@@ -1,2 +1,4 @@
-:1E000000800075900F75B01E8000E50F04F50F8590B085B090D3E59023F59080ED04A4
-:00000001FF \ No newline at end of file
+:0F000000800075900F75B01E8000E50F04F50F9E
+:0E000F008590B085B090D3E59023F59080EDFC
+:0101FF0004FB
+:00000001FF
diff --git a/demo/demo1.lst b/demo/demo1.lst
index 25d0ef4..687181e 100644
--- a/demo/demo1.lst
+++ b/demo/demo1.lst
@@ -1,12 +1,12 @@
-demo1 DEMO 2 36/-4/1907 PAGE 1
- 1 ; MCU 8051 IDE - Demostration code
+demo1 DEMO 2 11/29/1182 PAGE 1
+ 1 ; MCU 8051 IDE - Demonstration code
2 ; Macro instructions, conditional compilation and constants
3 ; Try tab "Graph" on bottom panel
4
5 ; Press F2 and F6 to run the program (start simulator and animate)
6
7 $TITLE('DEMO 2') ; Set title for code listing
- 8 $DATE(36/-4/1907) ; Set date for code listing
+ 8 $DATE(11/29/1182) ; Set date for code listing (the 29th of November 1182, welcome back to the M
9
10 ; Constant definitions
11 ; --------------------
@@ -15,12 +15,12 @@ demo1 DEMO 2
0001 14 inc_dec equ 100 / X ; Flag: Increment/Decrement counter
15
16 cseg at 1FFh ; Code segment starts at 0x1FF
- 17 something: db 4d ; Reserve 4 bytes in this segment
+01FF 04 17 something: db 4d ; Reserve 4 bytes in this segment
18
19 ; Macro instructions
20 ; --------------------
21
- 22 ;; Shift the given registeres
+ 22 ;; Shift the given registers
23 shift macro reg0, reg1
24
25 ; Increment / Decrement counter
@@ -42,40 +42,50 @@ demo1 DEMO 2
42 mov reg0, A
43 endm
44
- 45 ; Program initilization
+ 45 ; Program initialization
46 ; --------------------
-0000 75900F 47 org 0h
-0002 75B01E 48 sjmp start
+ 47 org 0h
+****WARNING: This ORG has lower value than the previous one
+0000 8000 48 sjmp start
49
50 ; Program start
51 ; --------------------
-0005 8000 52 start: mov P1, #00Fh
-0008 E50F 53 mov P3, #01Eh
- 54 +1 sjmp main
- 55 +1
-000A 04 56 +1 mov a, counter
-000C F50F 57 +1 inc a
-000D 8590B0 58 +1 mov counter, a
+0002 75900F 52 start: mov P1, #00Fh
+0005 75B01E 53 mov P3, #01Eh
+0008 8000 54 sjmp main
+ 55
+ 56 ; Main loop
+ 57 ; --------------------
+ 58 +1 main: shift P1, P3
59 +1
-000F 85B090 60 +1 mov p3, p1
-0012 D3 61 +1 mov p1, p3
-0015 E590 62 +1 setb c
-0016 23 63 +1 mov a, p1
-0018 F590 64 +1 rl a
-0019 80ED 65 +1 mov p1, a
- 66
- 67 ; Main loop
- 68 ; --------------------
- 69 main: shift P1, P3
- 70 sjmp main
- 71
- 72 ; Program end
- 73 ; --------------------
- 74 end
-ASSEMBLY COMPLETE, NO ERRORS FOUND, NO WARNINGS
+000A E50F 60 +1 mov a , counter
+ 61 +1 if inc_dec <> 0
+000C 04 62 +1 inc a
+ 63 +1 else
+ 64 +1 dec a
+ 65 +1 endif
+000D F50F 66 +1 mov counter , a
+ 67 +1
+000F 8590B0 68 +1 mov P3 , P1
+0012 85B090 69 +1 mov P1 , P3
+0015 D3 70 +1 setb c
+0016 E590 71 +1 mov a , P1
+0018 23 72 +1 rl a
+0019 F590 73 +1 mov P1 , a
+001B 80ED 74 sjmp main
+ 75
+ 76 ; Program end
+ 77 ; --------------------
+ 78 end
+ASSEMBLY COMPLETE, NO ERRORS FOUND, 1 WARNING
+ERROR SUMMARY:
+Line 49, WARNING: This ORG has lower value than the previous one
+
SYMBOL TABLE:
+??MCU_8051_IDE . . . . . . . . . . . N NUMB 8051H NOT USED
+??VERSION. . . . . . . . . . . . . . N NUMB 0147H NOT USED
AC . . . . . . . . . . . . . . . . . B ADDR 00D6H NOT USED
ACC. . . . . . . . . . . . . . . . . D ADDR 00E0H NOT USED
ACSR . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED
@@ -221,7 +231,7 @@ SINT . . . . . . . . . . . . . . . . C ADDR 0023H NOT USED
SM0. . . . . . . . . . . . . . . . . B ADDR 009FH NOT USED
SM1. . . . . . . . . . . . . . . . . B ADDR 009EH NOT USED
SM2. . . . . . . . . . . . . . . . . B ADDR 009DH NOT USED
-SOMETHING. . . . . . . . . . . . . . C ADDR 001DH NOT USED
+SOMETHING. . . . . . . . . . . . . . C ADDR 01FFH NOT USED
SP . . . . . . . . . . . . . . . . . D ADDR 0081H NOT USED
SPCON. . . . . . . . . . . . . . . . D ADDR 00C3H NOT USED
SPCR . . . . . . . . . . . . . . . . D ADDR 00D5H NOT USED
diff --git a/demo/demo1.sim b/demo/demo1.sim
deleted file mode 100644
index 1d235f3..0000000
--- a/demo/demo1.sim
+++ /dev/null
@@ -1,16 +0,0 @@
-C4FD5C3C2DF98DDEE6FE5ACA0FD745A8 12/21/07 demo1.asm
-48 0 128 0
-52 2 117 144 15
-53 5 117 176 30
-54 8 128 0
-58 10 229 15
-58 12 4
-58 13 245 15
-58 15 133 176 144
-58 18 133 144 176
-58 21 211
-58 22 229 144
-58 24 35
-58 25 245 144
-59 27 128 237
-17 511 4 \ No newline at end of file
diff --git a/demo/demo2.adf b/demo/demo2.adf
index f542c32..365403a 100644
--- a/demo/demo2.adf
+++ b/demo/demo2.adf
@@ -1,13 +1,13 @@
-# Assembler debug file for MCU 8051 IDE v1.3.1
+# Assembler debug file for MCU 8051 IDE v1.4.7
# Used assembler: MCU 8051 IDE
-# Date: 10/27/2009
-016FCF566042EC66EE9118BAFA4D4A35 "demo2.asm"
+# Date: 12/28/2012
+37AFD8BE8D1F3D6436C93B0B9616E95A "demo2.asm"
0 47 0 128 28
0 50 11 128 0
0 56 13 127 26
0 57 15 126 0
0 58 17 238
-0 58 18 144 0 47
+0 58 18 144 0 208
0 58 21 147
0 58 22 141 130
0 58 24 240
@@ -22,29 +22,29 @@
0 69 41 210 140
0 70 43 128 0
0 74 45 128 254
-0 28 47 87
-0 28 48 101
-0 28 49 108
-0 28 50 99
-0 28 51 111
-0 28 52 109
-0 28 53 101
-0 28 54 32
-0 28 55 105
-0 28 56 110
-0 28 57 32
-0 28 58 77
-0 28 59 67
-0 28 60 85
-0 28 61 32
-0 28 62 56
-0 28 63 48
-0 28 64 53
-0 28 65 49
-0 28 66 32
-0 28 67 73
-0 28 68 68
-0 28 69 69
-0 28 70 32
-0 28 71 33
-0 28 72 32 \ No newline at end of file
+0 28 208 87
+0 28 209 101
+0 28 210 108
+0 28 211 99
+0 28 212 111
+0 28 213 109
+0 28 214 101
+0 28 215 32
+0 28 216 105
+0 28 217 110
+0 28 218 32
+0 28 219 77
+0 28 220 67
+0 28 221 85
+0 28 222 32
+0 28 223 56
+0 28 224 48
+0 28 225 53
+0 28 226 49
+0 28 227 32
+0 28 228 73
+0 28 229 68
+0 28 230 69
+0 28 231 32
+0 28 232 33
+0 28 233 32 \ No newline at end of file
diff --git a/demo/demo2.asm b/demo/demo2.asm
index d3f595d..9573416 100644
--- a/demo/demo2.asm
+++ b/demo/demo2.asm
@@ -1,4 +1,4 @@
-; MCU 8051 IDE - Demostration code
+; MCU 8051 IDE - Demonstration code
; Interrupts, hexadecimal editor and code validator
; ------------------------------------------------------
; THIS REQUIRES ANOTHER MCU THAN AT89C2051 BECAUSE
@@ -18,7 +18,7 @@ if 0
mov A, #55d, B ; too many operands
inc 0FFh,, 04x4h ; invalid operands
db (4 *** 5) ; invalid expression
-label?: mul B ; ivalid label and invalid operand
+label?: mul B ; invalid label and invalid operand
endif
list ; Enable code listing
@@ -41,7 +41,7 @@ write_to_xdata macro str, code_ptr, xdata_ptr
inc code_ptr
endm
-; Program initilization
+; Program initialization
; --------------------
org 0h ; Reset vector
sjmp start
@@ -49,10 +49,10 @@ endm
org 0Bh ; Interrupt vector - T0
sjmp T0_int
-; Subprograms
+; Sub-programs
; --------------------
-;; Hadnle interrupt from TF0
+;; Handle interrupt from TF0
T0_int: mov R7, #string_legth
mov R6, #0h
loop: write_to_xdata string, R6, R5
@@ -71,7 +71,7 @@ start: ; Start timer 0 in mode 2
; Main loop
; --------------------
-main: sjmp $ ; Inifinite loop
+main: sjmp $ ; Infinite loop
; Program end
; --------------------
diff --git a/demo/demo2.bin b/demo/demo2.bin
deleted file mode 100644
index 031c85b..0000000
--- a/demo/demo2.bin
+++ /dev/null
Binary files differ
diff --git a/demo/demo2.hex b/demo/demo2.hex
index 1139f92..6449cc4 100644
--- a/demo/demo2.hex
+++ b/demo/demo2.hex
@@ -1,3 +1,7 @@
:02000000801C62
-:3E000B0080007F1A7E00EE90002F938D82F00D0EDFF4327D0075A8FF758AFF758903D28C800080FE57656C636F6D6520696E204D4355203830353120494445202120C4
-:00000001FF \ No newline at end of file
+:10000B0080007F1A7E00EE9000D0938D82F00D0E53
+:10001B00DFF4327D0075A8FF758AFF758903D28CDA
+:04002B00800080FED3
+:1000D00057656C636F6D6520696E204D4355203800
+:0A00E000303531204944452021202D
+:00000001FF
diff --git a/demo/demo2.lst b/demo/demo2.lst
index 4ce2673..2414232 100644
--- a/demo/demo2.lst
+++ b/demo/demo2.lst
@@ -1,5 +1,5 @@
demo2 PAGE 1
-0048 80FE 1 ; MCU 8051 IDE - Demostration code
+ 1 ; MCU 8051 IDE - Demonstration code
2 ; Interrupts, hexadecimal editor and code validator
3 ; ------------------------------------------------------
4 ; THIS REQUIRES ANOTHER MCU THAN AT89C2051 BECAUSE
@@ -20,7 +20,12 @@ demo2
25 ; Constants
26 ; --------------------
27 cseg at 0D0h
- 28 string: db 'Welcome in MCU 8051 IDE ! '
+00D0 57656C636F 28 string: db 'Welcome in MCU 8051 IDE ! '
+ 6D6520696E
+ 204D435520
+ 3830353120
+ 4944452021
+ 20
29
001A 30 string_legth equ 26d
31
@@ -36,54 +41,58 @@ demo2
41 inc code_ptr
42 endm
43
- 44 ; Program initilization
+ 44 ; Program initialization
45 ; --------------------
-0000 801C 46 org 0h ; Reset vector
- 47 sjmp start
+ 46 org 0h ; Reset vector
+****WARNING: This ORG has lower value than the previous one
+0000 801C 47 sjmp start
48
49 org 0Bh ; Interrupt vector - T0
- 50 sjmp T0_int
+000B 8000 50 sjmp T0_int
51
- 52 ; Subprograms
+ 52 ; Sub-programs
53 ; --------------------
54
- 55 ;; Hadnle interrupt from TF0
- 56 T0_int: mov R7, #string_legth
- 57 mov R6, #0h
+ 55 ;; Handle interrupt from TF0
+000D 7F1A 56 T0_int: mov R7, #string_legth
+000F 7E00 57 mov R6, #0h
58 +1 loop: write_to_xdata string, R6, R5
- 59 +1 mov a, r6
- 60 +1 mov dptr, #string
- 61 +1 movc a, @a+dptr
- 62 +1 mov dpl, r5
- 63 +1 movx @dptr, a
- 64 +1 inc r5
- 65 +1 inc r6
- 66 djnz R7, loop
- 67 reti
+0011 EE 59 +1 mov a , R6
+0012 9000D0 60 +1 mov dptr , #string
+0015 93 61 +1 movc a , @a+dptr
+0016 8D82 62 +1 mov dpl , R5
+0018 F0 63 +1 movx @dptr , a
+0019 0D 64 +1 inc R5
+001A 0E 65 +1 inc R6
+001B DFF4 66 djnz R7, loop
+001D 32 67 reti
68
69 ; Program start
70 ; --------------------
71 start: ; Start timer 0 in mode 2
- 72 mov R5, #0h
- 73 mov IE, #0FFh
- 74 mov TL0, #255d
- 75 mov TMOD, #03h
- 76 setb TR0
- 77 sjmp main
+001E 7D00 72 mov R5, #0h
+0020 75A8FF 73 mov IE, #0FFh
+0023 758AFF 74 mov TL0, #255d
+0026 758903 75 mov TMOD, #03h
+0029 D28C 76 setb TR0
+002B 8000 77 sjmp main
78
79 ; Main loop
80 ; --------------------
- 81 main: sjmp $ ; Inifinite loop
+002D 80FE 81 main: sjmp $ ; Infinite loop
82
83 ; Program end
84 ; --------------------
85 end
-ASSEMBLY COMPLETE, NO ERRORS FOUND, NO WARNINGS
+ASSEMBLY COMPLETE, NO ERRORS FOUND, 1 WARNING
+ERROR SUMMARY:
+Line 48, WARNING: This ORG has lower value than the previous one
+
SYMBOL TABLE:
??MCU_8051_IDE . . . . . . . . . . . N NUMB 8051H NOT USED
-??VERSION. . . . . . . . . . . . . . N NUMB 0131H NOT USED
+??VERSION. . . . . . . . . . . . . . N NUMB 0147H NOT USED
AC . . . . . . . . . . . . . . . . . B ADDR 00D6H NOT USED
ACC. . . . . . . . . . . . . . . . . D ADDR 00E0H NOT USED
ACSR . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED
@@ -236,7 +245,7 @@ SPDR . . . . . . . . . . . . . . . . D ADDR 0086H NOT USED
SPSR . . . . . . . . . . . . . . . . D ADDR 00AAH NOT USED
SPSTA. . . . . . . . . . . . . . . . D ADDR 00C4H NOT USED
START. . . . . . . . . . . . . . . . C ADDR 001EH
-STRING . . . . . . . . . . . . . . . C ADDR 002FH
+STRING . . . . . . . . . . . . . . . C ADDR 00D0H
STRING_LEGTH . . . . . . . . . . . . N NUMB 001AH
T0 . . . . . . . . . . . . . . . . . B ADDR 00B4H NOT USED
T0_INT . . . . . . . . . . . . . . . C ADDR 000DH
diff --git a/demo/demo2.sim b/demo/demo2.sim
deleted file mode 100644
index 4230f05..0000000
--- a/demo/demo2.sim
+++ /dev/null
@@ -1,47 +0,0 @@
-3E5C5EAE0BA81D024AAE08DD4B210650 12/21/07 demo2.asm
-47 0 128 28
-50 11 128 0
-56 13 127 26
-57 15 126 0
-58 17 238
-58 18 144 0 208
-58 21 147
-58 22 141 130
-58 24 240
-58 25 13
-58 26 14
-59 27 223 244
-60 29 50
-65 30 125 0
-66 32 117 168 255
-67 35 117 138 255
-68 38 117 137 3
-69 41 210 140
-70 43 128 0
-74 45 128 254
-28 208 87
-28 209 101
-28 210 108
-28 211 99
-28 212 111
-28 213 109
-28 214 101
-28 215 32
-28 216 105
-28 217 110
-28 218 32
-28 219 77
-28 220 67
-28 221 85
-28 222 32
-28 223 56
-28 224 48
-28 225 53
-28 226 49
-28 227 32
-28 228 73
-28 229 68
-28 230 69
-28 231 32
-28 232 33
-28 233 32 \ No newline at end of file
diff --git a/demo/demo3.adf b/demo/demo3.adf
index 64c2b62..a1b6fa0 100644
--- a/demo/demo3.adf
+++ b/demo/demo3.adf
@@ -1,9 +1,9 @@
-# Assembler debug file for MCU 8051 IDE v1.1
+# Assembler debug file for MCU 8051 IDE v1.4.7
# Used assembler: MCU 8051 IDE
-# Date: 03/02/09
-6180D365C7F535CABD42C3E78A0798B9 "demo3.asm"
+# Date: 12/28/2012
+5B8A70E1D6517500E2AE4F4FA5B98BC5 "demo3.asm"
0 67 0 128 254
-0 35 2 51
-0 35 3 52
-0 36 4 51
-0 36 5 52 \ No newline at end of file
+0 35 32 51
+0 35 33 52
+0 36 34 51
+0 36 35 52 \ No newline at end of file
diff --git a/demo/demo3.asm b/demo/demo3.asm
index d93d260..c55a966 100644
--- a/demo/demo3.asm
+++ b/demo/demo3.asm
@@ -1,23 +1,23 @@
-; MCU 8051 IDE - Demostration code
+; MCU 8051 IDE - Demonstration code
; Compiler directives
-$DATE(32/13/1907)   ; Places date in page header
+$DATE(32/13/1907)   ; Places date in page header
; $EJECT ; Places a form feed in listing
-; $INCLUDE(file.asm) ; Inserts file in source program
+; $INCLUDE(file.asm) ; Inserts file in source program
; $LIST ; Allows listing to be output
-; $NOLIST ; Stops outputting the listing
+; $NOLIST ; Stops outputting the listing
; $NOMOD ; No predefined symbols used
$OBJECT(file.hex) ; Places object output in file
-; $NOOBJECT ; No object file is generated
+; $NOOBJECT ; No object file is generated
$PAGING ; Break output listing into pages
-; $NOPAGING ; Print listing w/o page breaks
+; $NOPAGING ; Print listing w/o page breaks
$PAGELENGTH(10) ; No. of lines on a listing page
$PAGEWIDTH(20)    ; No. of columns on a listing page
$PRINT(file.lst) ; Places listing output in file
-; $NOPRINT ; Listing will not be output
+; $NOPRINT ; Listing will not be output
; $SYMBOLS ; Append symbol table to listing
-; $NOSYMBOLS ; Symbol table will not be output
+; $NOSYMBOLS ; Symbol table will not be output
$TITLE('demo - 3') ; Places string in page header
@@ -27,29 +27,28 @@ $TITLE('demo - 3') ; Places string in page header
a EQU 54d ; Define symbol
b0 DATA a / 2 ; Define internal memory symbol
c IDATA (b0*2-5) ; Define indirectly addressed internal memory
-d BIT 070Q ; Define internal bit memory symbol
+d BIT 070Q ; Define internal bit memory symbol
e CODE 0FFA5h ; Define program memory symbol
var SET (A * 44) MOD 9 - 14 ; Variable defined by an expression
- CSEG at 20h ; Select program memory space
-x: DB '34' ; Store byte values in program memory
-y: DW 3334h ; Store word values in program memory
+ CSEG at 20h ; Select program memory space
+x: DB '34' ; Store byte values in program memory
+y: DW 3334h ; Store word values in program memory
DSEG at 5d ; Select internal memory data space
m: DS 1 ; Reserve bytes of data memory
- xseg ; Select external memory data space
+ xseg ; Select external memory data space
n: DS 1 ; Reserve bytes of data memory
ISEG ; Select indirectly addressed internal memory space
-o: DS 1 ; Reserve bytes of data memory
+o: DS 1 ; Reserve bytes of data memory
NOLIST ; Disable code listing
BSEG ; Select bit addressable memory space
r: DBIT 4 ; Reserve bits of bit memory
LIST ; Enable code listing
-
mc macro label ; Define macro instruction
IF 2 <> 2 OR 1 = 4
EXITM ; Exit macro
@@ -57,14 +56,15 @@ mc macro label ; Define macro instruction
sjmp label
endm ; End of definition
-main: ORG 0 ; Set segment location counter
- IF 0 ; Begin conditional assembly block
+ CSEG ; <-- From now on, ORG refers to the code segment
+main: ORG 0 ; Set segment location counter
+ IF 0 ; Begin conditional assembly block
USING 2 ; Select register bank (define AR0..7)
- ELSE ; Alternative conditional assembly block
+ ELSE ; Alternative conditional assembly block
USING 2 ; Select register bank (define AR0..7)
ENDIF ; End conditional assembly block
- mc main ; Macro instuction
+ mc main ; Macro instruction
END ; End of assembly language source file
diff --git a/demo/demo3.bin b/demo/demo3.bin
deleted file mode 100644
index 45d3d20..0000000
--- a/demo/demo3.bin
+++ /dev/null
@@ -1 +0,0 @@
-3 \ No newline at end of file
diff --git a/demo/demo3.sim b/demo/demo3.sim
deleted file mode 100644
index ef0cd1f..0000000
--- a/demo/demo3.sim
+++ /dev/null
@@ -1,6 +0,0 @@
-6180D365C7F535CABD42C3E78A0798B9 12/21/07 demo3.asm
-67 0 128 254
-35 32 51
-35 33 52
-36 34 51
-36 35 52 \ No newline at end of file
diff --git a/demo/demo4.adf b/demo/demo4.adf
index fb6a934..bde9028 100644
--- a/demo/demo4.adf
+++ b/demo/demo4.adf
@@ -1,8 +1,8 @@
-# Assembler Debug File created by MCU 8051 IDE v1.0.5
+# Assembler debug file for MCU 8051 IDE v1.4.7
# Used assembler: MCU 8051 IDE
-# Date: 04/30/08
+# Date: 12/28/2012
7E1BFADD8BDB7A40D6B8CA5161E3113A "demo4.asm"
-0 27 0 128 64
+0 27 0 1 66
0 30 3 210 152
0 30 5 210 153
0 30 7 17 58
diff --git a/demo/demo4.bin b/demo/demo4.bin
deleted file mode 100644
index 413b6f7..0000000
--- a/demo/demo4.bin
+++ /dev/null
Binary files differ
diff --git a/demo/demo4.hex b/demo/demo4.hex
index 20def10..330d4f5 100644
--- a/demo/demo4.hex
+++ b/demo/demo4.hex
@@ -1,9 +1,10 @@
-:0200000080403E
+:020000000142BB
:07000300D298D299113A32A4
:07000B00D298D299113A329C
:07001300D298D299113A3294
:07001B00D298D299113A328C
:07002300D298D299113A3284
:07002B00D298D299113A327C
-:1E003300D298D299113A327F10113F22DFFE22D28DD28FD289D28B75A8FFD2BC80FEBD
-:00000001FF \ No newline at end of file
+:0F003300D298D299113A327F10113F22DFFE226C
+:0F004200D28DD28FD289D28B75A8FFD2BC80FE0F
+:00000001FF
diff --git a/demo/demo4.lst b/demo/demo4.lst
index 867750e..ccc5390 100644
--- a/demo/demo4.lst
+++ b/demo/demo4.lst
@@ -1,4 +1,4 @@
-demo4 PAGE 1
+demo4 PAGE 1
1 ; MCU 8051 IDE - Demostration code
2 ; Interrupt monitor and list of active subprograms
3
@@ -25,98 +25,98 @@ demo4
24 ; Interrupt vectors
25 ; -----------------
26 org 00h ; Reset
-0000 D298 27 ajmp start
+0000 0142 27 ajmp start
28
- 29 +1 org 03h ; External 0
- 30 +2
- 31 +3
- 32 +4
- 33 +5
- 34 +6
- 35 +7
- 36 +7
- 37 +7 setb RI
-000B 113F 38 +7 setb TI
-000D 22 39 +7
- 40 +7 acall wait
-000F DFFE 41 +7 reti
- 42 +6 setb RI
-0011 22 43 +6 setb TI
- 44 +6
- 45 +6 acall wait
-0013 D28F 46 +6 reti
- 47 +5 setb RI
-0015 D289 48 +5 setb TI
- 49 +5
-0017 D28B 50 +5 acall wait
-0019 75A8FF 51 +5 reti
- 52 +4 setb RI
- 53 +4 setb TI
- 54 +4
-001B 80FE 55 +4 acall wait
- 56 +4 reti
- 57 +3 setb RI
- 58 +3 setb TI
- 59 +3
- 60 +3 acall wait
- 61 +3 reti
- 62 +2 setb RI
- 63 +2 setb TI
- 64 +2
- 65 +2 acall wait
- 66 +2 reti
- 67 +1 setb RI
- 68 +1 setb TI
- 69 +1
- 70 +1 acall wait
- 71 +1 reti
- 72 intr
+ 29 org 03h ; External 0
+ 30 +1 intr
+ 31 +1
+0003 D298 32 +1 setb ri
+0005 D299 33 +1 setb ti
+ 34 +1
+0007 113A 35 +1 acall wait
+0009 32 36 +1 reti
+ 37
+ 38 org 0Bh ; Timer 0
+ 39 +1 intr
+ 40 +1
+000B D298 41 +1 setb ri
+000D D299 42 +1 setb ti
+ 43 +1
+000F 113A 44 +1 acall wait
+0011 32 45 +1 reti
+ 46
+ 47 org 13h ; External 0
+ 48 +1 intr
+ 49 +1
+0013 D298 50 +1 setb ri
+0015 D299 51 +1 setb ti
+ 52 +1
+0017 113A 53 +1 acall wait
+0019 32 54 +1 reti
+ 55
+ 56 org 1Bh ; Timer 1
+ 57 +1 intr
+ 58 +1
+001B D298 59 +1 setb ri
+001D D299 60 +1 setb ti
+ 61 +1
+001F 113A 62 +1 acall wait
+0021 32 63 +1 reti
+ 64
+ 65 org 23h ; UART and SPI
+ 66 +1 intr
+ 67 +1
+0023 D298 68 +1 setb ri
+0025 D299 69 +1 setb ti
+ 70 +1
+0027 113A 71 +1 acall wait
+0029 32 72 +1 reti
73
- 74 org 0Bh ; Timer 0
- 75 intr
- 76
- 77 org 13h ; External 0
- 78 intr
- 79
- 80 org 1Bh ; Timer 1
- 81 intr
+ 74 org 2Bh ; Timer 2
+ 75 +1 intr
+ 76 +1
+002B D298 77 +1 setb ri
+002D D299 78 +1 setb ti
+ 79 +1
+002F 113A 80 +1 acall wait
+0031 32 81 +1 reti
82
- 83 org 23h ; UART and SPI
- 84 intr
- 85
- 86 org 2Bh ; Timer 2
- 87 intr
- 88
- 89 org 33h ; Analog comparator
- 90 intr
+ 83 org 33h ; Analog comparator
+ 84 +1 intr
+ 85 +1
+0033 D298 86 +1 setb ri
+0035 D299 87 +1 setb ti
+ 88 +1
+0037 113A 89 +1 acall wait
+0039 32 90 +1 reti
91
92 ; Subprograms
93 ; -----------------
94 wait: ; Wait for 24 cycles
- 95 mov R7, #10h
- 96 acall wait_aux
- 97 ret
+003A 7F10 95 mov R7, #10h
+003C 113F 96 acall wait_aux
+003E 22 97 ret
98
99 wait_aux:
- 100 djnz R7, $
- 101 ret
+003F DFFE 100 djnz R7, $
+0041 22 101 ret
102
103
104 ; Program start
105 ; -----------------
106 start:
107 ; Set some interrupt bits
- 108 setb TF0
- 109 setb TF1
- 110 setb IE0
- 111 setb IE1
+0042 D28D 108 setb TF0
+0044 D28F 109 setb TF1
+0046 D289 110 setb IE0
+0048 D28B 111 setb IE1
112
113 ; Enable all interrupts and set priorities
- 114 mov IE, #0FFh
- 115 setb PS
+004A 75A8FF 114 mov IE, #0FFh
+004D D2BC 115 setb PS
116
117 ; Infinite loop
- 118 sjmp $
+004F 80FE 118 sjmp $
119
120
121 ; End of code
@@ -126,15 +126,57 @@ ASSEMBLY COMPLETE, NO ERRORS FOUND, NO WARNINGS
SYMBOL TABLE:
+??MCU_8051_IDE . . . . . . . . . . . N NUMB 8051H NOT USED
+??VERSION. . . . . . . . . . . . . . N NUMB 0147H NOT USED
AC . . . . . . . . . . . . . . . . . B ADDR 00D6H NOT USED
ACC. . . . . . . . . . . . . . . . . D ADDR 00E0H NOT USED
ACSR . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED
+ADCF . . . . . . . . . . . . . . . . D ADDR 00F6H NOT USED
+ADCLK. . . . . . . . . . . . . . . . D ADDR 00F2H NOT USED
+ADCON. . . . . . . . . . . . . . . . D ADDR 00F3H NOT USED
+ADDH . . . . . . . . . . . . . . . . D ADDR 00F5H NOT USED
+ADDL . . . . . . . . . . . . . . . . D ADDR 00F4H NOT USED
AUXR . . . . . . . . . . . . . . . . D ADDR 008EH NOT USED
AUXR1. . . . . . . . . . . . . . . . D ADDR 00A2H NOT USED
B. . . . . . . . . . . . . . . . . . D ADDR 00F0H NOT USED
+BDRCON . . . . . . . . . . . . . . . D ADDR 009BH NOT USED
+BDRCON_1 . . . . . . . . . . . . . . D ADDR 009CH NOT USED
+BRL. . . . . . . . . . . . . . . . . D ADDR 009AH NOT USED
+CCAP0H . . . . . . . . . . . . . . . D ADDR 00FAH NOT USED
+CCAP0L . . . . . . . . . . . . . . . D ADDR 00EAH NOT USED
+CCAP1H . . . . . . . . . . . . . . . D ADDR 00FBH NOT USED
+CCAP1L . . . . . . . . . . . . . . . D ADDR 00EBH NOT USED
+CCAP2H . . . . . . . . . . . . . . . D ADDR 00FCH NOT USED
+CCAP3H . . . . . . . . . . . . . . . D ADDR 00FDH NOT USED
+CCAP4H . . . . . . . . . . . . . . . D ADDR 00FEH NOT USED
+CCAPL2H. . . . . . . . . . . . . . . D ADDR 00FCH NOT USED
+CCAPL2L. . . . . . . . . . . . . . . D ADDR 00ECH NOT USED
+CCAPL3H. . . . . . . . . . . . . . . D ADDR 00FDH NOT USED
+CCAPL3L. . . . . . . . . . . . . . . D ADDR 00EDH NOT USED
+CCAPL4H. . . . . . . . . . . . . . . D ADDR 00FEH NOT USED
+CCAPL4L. . . . . . . . . . . . . . . D ADDR 00EEH NOT USED
+CCAPM0 . . . . . . . . . . . . . . . D ADDR 00DAH NOT USED
+CCAPM1 . . . . . . . . . . . . . . . D ADDR 00DBH NOT USED
+CCAPM2 . . . . . . . . . . . . . . . D ADDR 00DCH NOT USED
+CCAPM3 . . . . . . . . . . . . . . . D ADDR 00DDH NOT USED
+CCAPM4 . . . . . . . . . . . . . . . D ADDR 00DEH NOT USED
+CCF0 . . . . . . . . . . . . . . . . B ADDR 00D8H NOT USED
+CCF1 . . . . . . . . . . . . . . . . B ADDR 00D9H NOT USED
+CCF2 . . . . . . . . . . . . . . . . B ADDR 00DAH NOT USED
+CCF3 . . . . . . . . . . . . . . . . B ADDR 00DBH NOT USED
+CCF4 . . . . . . . . . . . . . . . . B ADDR 00DCH NOT USED
+CCON . . . . . . . . . . . . . . . . D ADDR 00D8H NOT USED
+CFINT. . . . . . . . . . . . . . . . C ADDR 0033H NOT USED
+CH . . . . . . . . . . . . . . . . . D ADDR 00F9H NOT USED
CKCON. . . . . . . . . . . . . . . . D ADDR 008FH NOT USED
+CKCON0 . . . . . . . . . . . . . . . D ADDR 008FH NOT USED
+CKRL . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED
+CKSEL. . . . . . . . . . . . . . . . D ADDR 0085H NOT USED
+CL . . . . . . . . . . . . . . . . . D ADDR 00E9H NOT USED
CLKREG . . . . . . . . . . . . . . . D ADDR 008FH NOT USED
+CMOD . . . . . . . . . . . . . . . . D ADDR 00D9H NOT USED
CPRL2. . . . . . . . . . . . . . . . B ADDR 00C8H NOT USED
+CR . . . . . . . . . . . . . . . . . B ADDR 00DEH NOT USED
CT2. . . . . . . . . . . . . . . . . B ADDR 00C9H NOT USED
CY . . . . . . . . . . . . . . . . . B ADDR 00D7H NOT USED
DP0H . . . . . . . . . . . . . . . . D ADDR 0083H NOT USED
@@ -144,60 +186,98 @@ DP1L . . . . . . . . . . . . . . . . D ADDR 0084H NOT USED
DPH. . . . . . . . . . . . . . . . . D ADDR 0083H NOT USED
DPL. . . . . . . . . . . . . . . . . D ADDR 0082H NOT USED
EA . . . . . . . . . . . . . . . . . B ADDR 00AFH NOT USED
+EC . . . . . . . . . . . . . . . . . B ADDR 00AEH NOT USED
EECON. . . . . . . . . . . . . . . . D ADDR 0096H NOT USED
ES . . . . . . . . . . . . . . . . . B ADDR 00ACH NOT USED
ET0. . . . . . . . . . . . . . . . . B ADDR 00A9H NOT USED
ET1. . . . . . . . . . . . . . . . . B ADDR 00ABH NOT USED
+ET2. . . . . . . . . . . . . . . . . B ADDR 00ADH NOT USED
EX0. . . . . . . . . . . . . . . . . B ADDR 00A8H NOT USED
EX1. . . . . . . . . . . . . . . . . B ADDR 00AAH NOT USED
EXEN2. . . . . . . . . . . . . . . . B ADDR 00CBH NOT USED
EXF2 . . . . . . . . . . . . . . . . B ADDR 00CEH NOT USED
+EXTI0. . . . . . . . . . . . . . . . C ADDR 0003H NOT USED
+EXTI1. . . . . . . . . . . . . . . . C ADDR 0013H NOT USED
F0 . . . . . . . . . . . . . . . . . B ADDR 00D5H NOT USED
-IE . . . . . . . . . . . . . . . . . D ADDR 00A8H NOT USED
-IE0. . . . . . . . . . . . . . . . . B ADDR 0089H NOT USED
-IE1. . . . . . . . . . . . . . . . . B ADDR 008BH NOT USED
+FE . . . . . . . . . . . . . . . . . B ADDR 009FH NOT USED
+IE . . . . . . . . . . . . . . . . . D ADDR 00A8H
+IE0. . . . . . . . . . . . . . . . . B ADDR 0089H
+IE1. . . . . . . . . . . . . . . . . B ADDR 008BH
INT0 . . . . . . . . . . . . . . . . B ADDR 00B2H NOT USED
INT1 . . . . . . . . . . . . . . . . B ADDR 00B3H NOT USED
IP . . . . . . . . . . . . . . . . . D ADDR 00B8H NOT USED
IPH. . . . . . . . . . . . . . . . . D ADDR 00B7H NOT USED
+IPH0 . . . . . . . . . . . . . . . . D ADDR 00B7H NOT USED
+IPH1 . . . . . . . . . . . . . . . . D ADDR 00B3H NOT USED
+IPL0 . . . . . . . . . . . . . . . . D ADDR 00B8H NOT USED
+IPL1 . . . . . . . . . . . . . . . . D ADDR 00B2H NOT USED
IT0. . . . . . . . . . . . . . . . . B ADDR 0088H NOT USED
IT1. . . . . . . . . . . . . . . . . B ADDR 008AH NOT USED
+KBE. . . . . . . . . . . . . . . . . D ADDR 009DH NOT USED
+KBF. . . . . . . . . . . . . . . . . D ADDR 009EH NOT USED
+KBLS . . . . . . . . . . . . . . . . D ADDR 009CH NOT USED
+OSCCON . . . . . . . . . . . . . . . D ADDR 0086H NOT USED
OV . . . . . . . . . . . . . . . . . B ADDR 00D2H NOT USED
P. . . . . . . . . . . . . . . . . . B ADDR 00D0H NOT USED
P0 . . . . . . . . . . . . . . . . . D ADDR 0080H NOT USED
P1 . . . . . . . . . . . . . . . . . D ADDR 0090H NOT USED
+P1M1 . . . . . . . . . . . . . . . . D ADDR 00D4H NOT USED
+P1M2 . . . . . . . . . . . . . . . . D ADDR 00E2H NOT USED
P2 . . . . . . . . . . . . . . . . . D ADDR 00A0H NOT USED
P3 . . . . . . . . . . . . . . . . . D ADDR 00B0H NOT USED
+P3M1 . . . . . . . . . . . . . . . . D ADDR 00D5H NOT USED
+P3M2 . . . . . . . . . . . . . . . . D ADDR 00E3H NOT USED
P4 . . . . . . . . . . . . . . . . . D ADDR 00C0H NOT USED
+P4M1 . . . . . . . . . . . . . . . . D ADDR 00D6H NOT USED
+P4M2 . . . . . . . . . . . . . . . . D ADDR 00E4H NOT USED
+P5 . . . . . . . . . . . . . . . . . D ADDR 00E8H NOT USED
+PC . . . . . . . . . . . . . . . . . B ADDR 00BEH NOT USED
PCON . . . . . . . . . . . . . . . . D ADDR 0087H NOT USED
-PS . . . . . . . . . . . . . . . . . B ADDR 00BCH NOT USED
+PPCL . . . . . . . . . . . . . . . . B ADDR 00BEH NOT USED
+PS . . . . . . . . . . . . . . . . . B ADDR 00BCH
+PSL. . . . . . . . . . . . . . . . . B ADDR 00BCH NOT USED
PSW. . . . . . . . . . . . . . . . . D ADDR 00D0H NOT USED
PT0. . . . . . . . . . . . . . . . . B ADDR 00B9H NOT USED
+PT0L . . . . . . . . . . . . . . . . B ADDR 00B9H NOT USED
PT1. . . . . . . . . . . . . . . . . B ADDR 00BBH NOT USED
+PT1L . . . . . . . . . . . . . . . . B ADDR 00BBH NOT USED
+PT2. . . . . . . . . . . . . . . . . B ADDR 00BDH NOT USED
+PT2L . . . . . . . . . . . . . . . . B ADDR 00BDH NOT USED
PX0. . . . . . . . . . . . . . . . . B ADDR 00B8H NOT USED
+PX0L . . . . . . . . . . . . . . . . B ADDR 00B8H NOT USED
PX1. . . . . . . . . . . . . . . . . B ADDR 00BAH NOT USED
+PX1L . . . . . . . . . . . . . . . . B ADDR 00BAH NOT USED
RB8. . . . . . . . . . . . . . . . . B ADDR 009AH NOT USED
RCAP2H . . . . . . . . . . . . . . . D ADDR 00CBH NOT USED
RCAP2L . . . . . . . . . . . . . . . D ADDR 00CAH NOT USED
RCLK . . . . . . . . . . . . . . . . B ADDR 00CDH NOT USED
RD . . . . . . . . . . . . . . . . . B ADDR 00B7H NOT USED
REN. . . . . . . . . . . . . . . . . B ADDR 009CH NOT USED
-RI . . . . . . . . . . . . . . . . . B ADDR 0098H NOT USED
+RESET. . . . . . . . . . . . . . . . C ADDR 0000H NOT USED
+RI . . . . . . . . . . . . . . . . . B ADDR 0098H
RS0. . . . . . . . . . . . . . . . . B ADDR 00D3H NOT USED
RS1. . . . . . . . . . . . . . . . . B ADDR 00D4H NOT USED
RXD. . . . . . . . . . . . . . . . . B ADDR 00B0H NOT USED
SADDR. . . . . . . . . . . . . . . . D ADDR 00A9H NOT USED
+SADDR_0. . . . . . . . . . . . . . . D ADDR 00A9H NOT USED
+SADDR_1. . . . . . . . . . . . . . . D ADDR 00AAH NOT USED
SADEN. . . . . . . . . . . . . . . . D ADDR 00B9H NOT USED
+SADEN_0. . . . . . . . . . . . . . . D ADDR 00B9H NOT USED
+SADEN_1. . . . . . . . . . . . . . . D ADDR 00BAH NOT USED
SBUF . . . . . . . . . . . . . . . . D ADDR 0099H NOT USED
SCON . . . . . . . . . . . . . . . . D ADDR 0098H NOT USED
+SINT . . . . . . . . . . . . . . . . C ADDR 0023H NOT USED
SM0. . . . . . . . . . . . . . . . . B ADDR 009FH NOT USED
SM1. . . . . . . . . . . . . . . . . B ADDR 009EH NOT USED
SM2. . . . . . . . . . . . . . . . . B ADDR 009DH NOT USED
SP . . . . . . . . . . . . . . . . . D ADDR 0081H NOT USED
+SPCON. . . . . . . . . . . . . . . . D ADDR 00C3H NOT USED
SPCR . . . . . . . . . . . . . . . . D ADDR 00D5H NOT USED
+SPDAT. . . . . . . . . . . . . . . . D ADDR 00C5H NOT USED
SPDR . . . . . . . . . . . . . . . . D ADDR 0086H NOT USED
SPSR . . . . . . . . . . . . . . . . D ADDR 00AAH NOT USED
-START. . . . . . . . . . . . . . . . C ADDR 0042H NOT USED
+SPSTA. . . . . . . . . . . . . . . . D ADDR 00C4H NOT USED
+START. . . . . . . . . . . . . . . . C ADDR 0042H
T0 . . . . . . . . . . . . . . . . . B ADDR 00B4H NOT USED
T1 . . . . . . . . . . . . . . . . . B ADDR 00B5H NOT USED
T2CON. . . . . . . . . . . . . . . . D ADDR 00C8H NOT USED
@@ -205,13 +285,16 @@ T2MOD. . . . . . . . . . . . . . . . D ADDR 00C9H NOT USED
TB8. . . . . . . . . . . . . . . . . B ADDR 009BH NOT USED
TCLK . . . . . . . . . . . . . . . . B ADDR 00CCH NOT USED
TCON . . . . . . . . . . . . . . . . D ADDR 0088H NOT USED
-TF0. . . . . . . . . . . . . . . . . B ADDR 008DH NOT USED
-TF1. . . . . . . . . . . . . . . . . B ADDR 008FH NOT USED
+TF0. . . . . . . . . . . . . . . . . B ADDR 008DH
+TF1. . . . . . . . . . . . . . . . . B ADDR 008FH
TF2. . . . . . . . . . . . . . . . . B ADDR 00CFH NOT USED
TH0. . . . . . . . . . . . . . . . . D ADDR 008CH NOT USED
TH1. . . . . . . . . . . . . . . . . D ADDR 008DH NOT USED
TH2. . . . . . . . . . . . . . . . . D ADDR 00CDH NOT USED
-TI . . . . . . . . . . . . . . . . . B ADDR 0099H NOT USED
+TI . . . . . . . . . . . . . . . . . B ADDR 0099H
+TIMER0 . . . . . . . . . . . . . . . C ADDR 000BH NOT USED
+TIMER1 . . . . . . . . . . . . . . . C ADDR 001BH NOT USED
+TIMER2 . . . . . . . . . . . . . . . C ADDR 002BH NOT USED
TL0. . . . . . . . . . . . . . . . . D ADDR 008AH NOT USED
TL1. . . . . . . . . . . . . . . . . D ADDR 008BH NOT USED
TL2. . . . . . . . . . . . . . . . . D ADDR 00CCH NOT USED
@@ -220,8 +303,8 @@ TR0. . . . . . . . . . . . . . . . . B ADDR 008CH NOT USED
TR1. . . . . . . . . . . . . . . . . B ADDR 008EH NOT USED
TR2. . . . . . . . . . . . . . . . . B ADDR 00CAH NOT USED
TXD. . . . . . . . . . . . . . . . . B ADDR 00B1H NOT USED
-WAIT . . . . . . . . . . . . . . . . C ADDR 003AH NOT USED
-WAIT_AUX . . . . . . . . . . . . . . C ADDR 003FH NOT USED
+WAIT . . . . . . . . . . . . . . . . C ADDR 003AH
+WAIT_AUX . . . . . . . . . . . . . . C ADDR 003FH
WDTCON . . . . . . . . . . . . . . . D ADDR 00A7H NOT USED
WDTPRG . . . . . . . . . . . . . . . D ADDR 00A7H NOT USED
WDTRST . . . . . . . . . . . . . . . D ADDR 00A6H NOT USED
diff --git a/demo/demo4.sim b/demo/demo4.sim
deleted file mode 100644
index 52643cc..0000000
--- a/demo/demo4.sim
+++ /dev/null
@@ -1,42 +0,0 @@
-7E1BFADD8BDB7A40D6B8CA5161E3113A 01/14/08 demo4.asm
-27 0 128 64
-30 3 210 152
-30 5 210 153
-30 7 17 58
-30 9 50
-33 11 210 152
-33 13 210 153
-33 15 17 58
-33 17 50
-36 19 210 152
-36 21 210 153
-36 23 17 58
-36 25 50
-39 27 210 152
-39 29 210 153
-39 31 17 58
-39 33 50
-42 35 210 152
-42 37 210 153
-42 39 17 58
-42 41 50
-45 43 210 152
-45 45 210 153
-45 47 17 58
-45 49 50
-48 51 210 152
-48 53 210 153
-48 55 17 58
-48 57 50
-53 58 127 16
-54 60 17 63
-55 62 34
-58 63 223 254
-59 65 34
-66 66 210 141
-67 68 210 143
-68 70 210 137
-69 72 210 139
-72 74 117 168 255
-73 77 210 188
-76 79 128 254 \ No newline at end of file
diff --git a/demo/demo5.adf b/demo/demo5.adf
index de35ed8..9cd1274 100644
--- a/demo/demo5.adf
+++ b/demo/demo5.adf
@@ -1,5 +1,5 @@
-# Assembler debug file for MCU 8051 IDE v1.1
+# Assembler debug file for MCU 8051 IDE v1.4.7
# Used assembler: MCU 8051 IDE
-# Date: 03/02/09
-8A77C444C26BA55C5A8AC82FE0C8CFA9 "demo5.asm"
+# Date: 12/28/2012
+83FBE8C57ABDDCD92CDD70B3C5326563 "demo5.asm"
0 32 0 128 254 \ No newline at end of file
diff --git a/demo/demo5.asm b/demo/demo5.asm
index 9c3bc68..8729c7e 100644
--- a/demo/demo5.asm
+++ b/demo/demo5.asm
@@ -32,4 +32,4 @@
sjmp $
end
-; !!! HAVE A GOOD LUCK WITH THIS IDE !!! \ No newline at end of file
+; !!! HAVE A GOOD LUCK WITH THIS IDE !!!
diff --git a/demo/demo5.bin b/demo/demo5.bin
deleted file mode 100644
index 5416677..0000000
--- a/demo/demo5.bin
+++ /dev/null
@@ -1 +0,0 @@
- \ No newline at end of file
diff --git a/demo/demo5.hex b/demo/demo5.hex
index 0df57c5..53b1f23 100644
--- a/demo/demo5.hex
+++ b/demo/demo5.hex
@@ -1,2 +1,2 @@
:0200000080FE80
-:00000001FF \ No newline at end of file
+:00000001FF
diff --git a/demo/demo5.lst b/demo/demo5.lst
index 3468d65..66d4d77 100644
--- a/demo/demo5.lst
+++ b/demo/demo5.lst
@@ -30,12 +30,14 @@ demo5
29 ; !!! HAVE A GOOD LUCK WITH THIS IDE !!!
30
31 org 0
- 32 sjmp $
+0000 80FE 32 sjmp $
33 end
ASSEMBLY COMPLETE, NO ERRORS FOUND, NO WARNINGS
SYMBOL TABLE:
+??MCU_8051_IDE . . . . . . . . . . . N NUMB 8051H NOT USED
+??VERSION. . . . . . . . . . . . . . N NUMB 0147H NOT USED
AC . . . . . . . . . . . . . . . . . B ADDR 00D6H NOT USED
ACC. . . . . . . . . . . . . . . . . D ADDR 00E0H NOT USED
ACSR . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED
diff --git a/demo/demo5.sim b/demo/demo5.sim
deleted file mode 100644
index 7f2a49c..0000000
--- a/demo/demo5.sim
+++ /dev/null
@@ -1,2 +0,0 @@
-7D9DA265AF8276820125E7E130CFFF37 12/21/07 demo4.asm
-32 0 128 254 \ No newline at end of file
diff --git a/demo/demo_c_0 b/demo/demo_c_0
deleted file mode 100644
index 671d577..0000000
--- a/demo/demo_c_0
+++ /dev/null
Binary files differ
diff --git a/demo/demo_c_0.adb b/demo/demo_c_0.adb
deleted file mode 100644
index 30be84d..0000000
--- a/demo/demo_c_0.adb
+++ /dev/null
@@ -1,106 +0,0 @@
-M:demo_c_0
-F:G$someFunction$0$0({2}DF,SV:S),C,0,0,0,0,0
-F:G$main$0$0({2}DF,SI:S),C,0,0,0,0,0
-F:G$main$0$0({2}DF,SI:S),C,0,0,0,0,0
-S:G$some_variable$0$0({4}SL:U),E,0,0
-S:G$i$0$0({2}SI:S),E,0,0
-S:LsomeFunction$somevalue$1$1({1}SC:U),R,0,0,[r2]
-S:G$P0$0$0({1}SC:U),I,0,0
-S:G$SP$0$0({1}SC:U),I,0,0
-S:G$DPL$0$0({1}SC:U),I,0,0
-S:G$DPH$0$0({1}SC:U),I,0,0
-S:G$PCON$0$0({1}SC:U),I,0,0
-S:G$TCON$0$0({1}SC:U),I,0,0
-S:G$TMOD$0$0({1}SC:U),I,0,0
-S:G$TL0$0$0({1}SC:U),I,0,0
-S:G$TL1$0$0({1}SC:U),I,0,0
-S:G$TH0$0$0({1}SC:U),I,0,0
-S:G$TH1$0$0({1}SC:U),I,0,0
-S:G$P1$0$0({1}SC:U),I,0,0
-S:G$SCON$0$0({1}SC:U),I,0,0
-S:G$SBUF$0$0({1}SC:U),I,0,0
-S:G$P2$0$0({1}SC:U),I,0,0
-S:G$IE$0$0({1}SC:U),I,0,0
-S:G$P3$0$0({1}SC:U),I,0,0
-S:G$IP$0$0({1}SC:U),I,0,0
-S:G$PSW$0$0({1}SC:U),I,0,0
-S:G$ACC$0$0({1}SC:U),I,0,0
-S:G$A$0$0({1}SC:U),I,0,0
-S:G$B$0$0({1}SC:U),I,0,0
-S:G$P0_0$0$0({1}SX:U),J,0,0
-S:G$P0_1$0$0({1}SX:U),J,0,0
-S:G$P0_2$0$0({1}SX:U),J,0,0
-S:G$P0_3$0$0({1}SX:U),J,0,0
-S:G$P0_4$0$0({1}SX:U),J,0,0
-S:G$P0_5$0$0({1}SX:U),J,0,0
-S:G$P0_6$0$0({1}SX:U),J,0,0
-S:G$P0_7$0$0({1}SX:U),J,0,0
-S:G$IT0$0$0({1}SX:U),J,0,0
-S:G$IE0$0$0({1}SX:U),J,0,0
-S:G$IT1$0$0({1}SX:U),J,0,0
-S:G$IE1$0$0({1}SX:U),J,0,0
-S:G$TR0$0$0({1}SX:U),J,0,0
-S:G$TF0$0$0({1}SX:U),J,0,0
-S:G$TR1$0$0({1}SX:U),J,0,0
-S:G$TF1$0$0({1}SX:U),J,0,0
-S:G$P1_0$0$0({1}SX:U),J,0,0
-S:G$P1_1$0$0({1}SX:U),J,0,0
-S:G$P1_2$0$0({1}SX:U),J,0,0
-S:G$P1_3$0$0({1}SX:U),J,0,0
-S:G$P1_4$0$0({1}SX:U),J,0,0
-S:G$P1_5$0$0({1}SX:U),J,0,0
-S:G$P1_6$0$0({1}SX:U),J,0,0
-S:G$P1_7$0$0({1}SX:U),J,0,0
-S:G$RI$0$0({1}SX:U),J,0,0
-S:G$TI$0$0({1}SX:U),J,0,0
-S:G$RB8$0$0({1}SX:U),J,0,0
-S:G$TB8$0$0({1}SX:U),J,0,0
-S:G$REN$0$0({1}SX:U),J,0,0
-S:G$SM2$0$0({1}SX:U),J,0,0
-S:G$SM1$0$0({1}SX:U),J,0,0
-S:G$SM0$0$0({1}SX:U),J,0,0
-S:G$P2_0$0$0({1}SX:U),J,0,0
-S:G$P2_1$0$0({1}SX:U),J,0,0
-S:G$P2_2$0$0({1}SX:U),J,0,0
-S:G$P2_3$0$0({1}SX:U),J,0,0
-S:G$P2_4$0$0({1}SX:U),J,0,0
-S:G$P2_5$0$0({1}SX:U),J,0,0
-S:G$P2_6$0$0({1}SX:U),J,0,0
-S:G$P2_7$0$0({1}SX:U),J,0,0
-S:G$EX0$0$0({1}SX:U),J,0,0
-S:G$ET0$0$0({1}SX:U),J,0,0
-S:G$EX1$0$0({1}SX:U),J,0,0
-S:G$ET1$0$0({1}SX:U),J,0,0
-S:G$ES$0$0({1}SX:U),J,0,0
-S:G$EA$0$0({1}SX:U),J,0,0
-S:G$P3_0$0$0({1}SX:U),J,0,0
-S:G$P3_1$0$0({1}SX:U),J,0,0
-S:G$P3_2$0$0({1}SX:U),J,0,0
-S:G$P3_3$0$0({1}SX:U),J,0,0
-S:G$P3_4$0$0({1}SX:U),J,0,0
-S:G$P3_5$0$0({1}SX:U),J,0,0
-S:G$P3_6$0$0({1}SX:U),J,0,0
-S:G$P3_7$0$0({1}SX:U),J,0,0
-S:G$RXD$0$0({1}SX:U),J,0,0
-S:G$TXD$0$0({1}SX:U),J,0,0
-S:G$INT0$0$0({1}SX:U),J,0,0
-S:G$INT1$0$0({1}SX:U),J,0,0
-S:G$T0$0$0({1}SX:U),J,0,0
-S:G$T1$0$0({1}SX:U),J,0,0
-S:G$WR$0$0({1}SX:U),J,0,0
-S:G$RD$0$0({1}SX:U),J,0,0
-S:G$PX0$0$0({1}SX:U),J,0,0
-S:G$PT0$0$0({1}SX:U),J,0,0
-S:G$PX1$0$0({1}SX:U),J,0,0
-S:G$PT1$0$0({1}SX:U),J,0,0
-S:G$PS$0$0({1}SX:U),J,0,0
-S:G$P$0$0({1}SX:U),J,0,0
-S:G$FL$0$0({1}SX:U),J,0,0
-S:G$OV$0$0({1}SX:U),J,0,0
-S:G$RS0$0$0({1}SX:U),J,0,0
-S:G$RS1$0$0({1}SX:U),J,0,0
-S:G$F0$0$0({1}SX:U),J,0,0
-S:G$AC$0$0({1}SX:U),J,0,0
-S:G$CY$0$0({1}SX:U),J,0,0
-S:G$someFunction$0$0({2}DF,SV:S),C,0,0
-S:G$main$0$0({2}DF,SI:S),C,0,0
diff --git a/demo/demo_c_0.asm b/demo/demo_c_0.asm
deleted file mode 100644
index 8338791..0000000
--- a/demo/demo_c_0.asm
+++ /dev/null
@@ -1,529 +0,0 @@
-;--------------------------------------------------------
-; File Created by SDCC : free open source ANSI-C Compiler
-; Version 2.9.0 #5416 (Oct 6 2009) (UNIX)
-; This file was generated Tue Oct 27 23:03:10 2009
-;--------------------------------------------------------
- .module demo_c_0
- .optsdcc -mmcs51 --model-small
-
-;--------------------------------------------------------
-; Public variables in this module
-;--------------------------------------------------------
- .globl _main
- .globl _someFunction
- .globl _CY
- .globl _AC
- .globl _F0
- .globl _RS1
- .globl _RS0
- .globl _OV
- .globl _FL
- .globl _P
- .globl _PS
- .globl _PT1
- .globl _PX1
- .globl _PT0
- .globl _PX0
- .globl _RD
- .globl _WR
- .globl _T1
- .globl _T0
- .globl _INT1
- .globl _INT0
- .globl _TXD
- .globl _RXD
- .globl _P3_7
- .globl _P3_6
- .globl _P3_5
- .globl _P3_4
- .globl _P3_3
- .globl _P3_2
- .globl _P3_1
- .globl _P3_0
- .globl _EA
- .globl _ES
- .globl _ET1
- .globl _EX1
- .globl _ET0
- .globl _EX0
- .globl _P2_7
- .globl _P2_6
- .globl _P2_5
- .globl _P2_4
- .globl _P2_3
- .globl _P2_2
- .globl _P2_1
- .globl _P2_0
- .globl _SM0
- .globl _SM1
- .globl _SM2
- .globl _REN
- .globl _TB8
- .globl _RB8
- .globl _TI
- .globl _RI
- .globl _P1_7
- .globl _P1_6
- .globl _P1_5
- .globl _P1_4
- .globl _P1_3
- .globl _P1_2
- .globl _P1_1
- .globl _P1_0
- .globl _TF1
- .globl _TR1
- .globl _TF0
- .globl _TR0
- .globl _IE1
- .globl _IT1
- .globl _IE0
- .globl _IT0
- .globl _P0_7
- .globl _P0_6
- .globl _P0_5
- .globl _P0_4
- .globl _P0_3
- .globl _P0_2
- .globl _P0_1
- .globl _P0_0
- .globl _B
- .globl _A
- .globl _ACC
- .globl _PSW
- .globl _IP
- .globl _P3
- .globl _IE
- .globl _P2
- .globl _SBUF
- .globl _SCON
- .globl _P1
- .globl _TH1
- .globl _TH0
- .globl _TL1
- .globl _TL0
- .globl _TMOD
- .globl _TCON
- .globl _PCON
- .globl _DPH
- .globl _DPL
- .globl _SP
- .globl _P0
- .globl _i
- .globl _some_variable
-;--------------------------------------------------------
-; special function registers
-;--------------------------------------------------------
- .area RSEG (DATA)
-G$P0$0$0 == 0x0080
-_P0 = 0x0080
-G$SP$0$0 == 0x0081
-_SP = 0x0081
-G$DPL$0$0 == 0x0082
-_DPL = 0x0082
-G$DPH$0$0 == 0x0083
-_DPH = 0x0083
-G$PCON$0$0 == 0x0087
-_PCON = 0x0087
-G$TCON$0$0 == 0x0088
-_TCON = 0x0088
-G$TMOD$0$0 == 0x0089
-_TMOD = 0x0089
-G$TL0$0$0 == 0x008a
-_TL0 = 0x008a
-G$TL1$0$0 == 0x008b
-_TL1 = 0x008b
-G$TH0$0$0 == 0x008c
-_TH0 = 0x008c
-G$TH1$0$0 == 0x008d
-_TH1 = 0x008d
-G$P1$0$0 == 0x0090
-_P1 = 0x0090
-G$SCON$0$0 == 0x0098
-_SCON = 0x0098
-G$SBUF$0$0 == 0x0099
-_SBUF = 0x0099
-G$P2$0$0 == 0x00a0
-_P2 = 0x00a0
-G$IE$0$0 == 0x00a8
-_IE = 0x00a8
-G$P3$0$0 == 0x00b0
-_P3 = 0x00b0
-G$IP$0$0 == 0x00b8
-_IP = 0x00b8
-G$PSW$0$0 == 0x00d0
-_PSW = 0x00d0
-G$ACC$0$0 == 0x00e0
-_ACC = 0x00e0
-G$A$0$0 == 0x00e0
-_A = 0x00e0
-G$B$0$0 == 0x00f0
-_B = 0x00f0
-;--------------------------------------------------------
-; special function bits
-;--------------------------------------------------------
- .area RSEG (DATA)
-G$P0_0$0$0 == 0x0080
-_P0_0 = 0x0080
-G$P0_1$0$0 == 0x0081
-_P0_1 = 0x0081
-G$P0_2$0$0 == 0x0082
-_P0_2 = 0x0082
-G$P0_3$0$0 == 0x0083
-_P0_3 = 0x0083
-G$P0_4$0$0 == 0x0084
-_P0_4 = 0x0084
-G$P0_5$0$0 == 0x0085
-_P0_5 = 0x0085
-G$P0_6$0$0 == 0x0086
-_P0_6 = 0x0086
-G$P0_7$0$0 == 0x0087
-_P0_7 = 0x0087
-G$IT0$0$0 == 0x0088
-_IT0 = 0x0088
-G$IE0$0$0 == 0x0089
-_IE0 = 0x0089
-G$IT1$0$0 == 0x008a
-_IT1 = 0x008a
-G$IE1$0$0 == 0x008b
-_IE1 = 0x008b
-G$TR0$0$0 == 0x008c
-_TR0 = 0x008c
-G$TF0$0$0 == 0x008d
-_TF0 = 0x008d
-G$TR1$0$0 == 0x008e
-_TR1 = 0x008e
-G$TF1$0$0 == 0x008f
-_TF1 = 0x008f
-G$P1_0$0$0 == 0x0090
-_P1_0 = 0x0090
-G$P1_1$0$0 == 0x0091
-_P1_1 = 0x0091
-G$P1_2$0$0 == 0x0092
-_P1_2 = 0x0092
-G$P1_3$0$0 == 0x0093
-_P1_3 = 0x0093
-G$P1_4$0$0 == 0x0094
-_P1_4 = 0x0094
-G$P1_5$0$0 == 0x0095
-_P1_5 = 0x0095
-G$P1_6$0$0 == 0x0096
-_P1_6 = 0x0096
-G$P1_7$0$0 == 0x0097
-_P1_7 = 0x0097
-G$RI$0$0 == 0x0098
-_RI = 0x0098
-G$TI$0$0 == 0x0099
-_TI = 0x0099
-G$RB8$0$0 == 0x009a
-_RB8 = 0x009a
-G$TB8$0$0 == 0x009b
-_TB8 = 0x009b
-G$REN$0$0 == 0x009c
-_REN = 0x009c
-G$SM2$0$0 == 0x009d
-_SM2 = 0x009d
-G$SM1$0$0 == 0x009e
-_SM1 = 0x009e
-G$SM0$0$0 == 0x009f
-_SM0 = 0x009f
-G$P2_0$0$0 == 0x00a0
-_P2_0 = 0x00a0
-G$P2_1$0$0 == 0x00a1
-_P2_1 = 0x00a1
-G$P2_2$0$0 == 0x00a2
-_P2_2 = 0x00a2
-G$P2_3$0$0 == 0x00a3
-_P2_3 = 0x00a3
-G$P2_4$0$0 == 0x00a4
-_P2_4 = 0x00a4
-G$P2_5$0$0 == 0x00a5
-_P2_5 = 0x00a5
-G$P2_6$0$0 == 0x00a6
-_P2_6 = 0x00a6
-G$P2_7$0$0 == 0x00a7
-_P2_7 = 0x00a7
-G$EX0$0$0 == 0x00a8
-_EX0 = 0x00a8
-G$ET0$0$0 == 0x00a9
-_ET0 = 0x00a9
-G$EX1$0$0 == 0x00aa
-_EX1 = 0x00aa
-G$ET1$0$0 == 0x00ab
-_ET1 = 0x00ab
-G$ES$0$0 == 0x00ac
-_ES = 0x00ac
-G$EA$0$0 == 0x00af
-_EA = 0x00af
-G$P3_0$0$0 == 0x00b0
-_P3_0 = 0x00b0
-G$P3_1$0$0 == 0x00b1
-_P3_1 = 0x00b1
-G$P3_2$0$0 == 0x00b2
-_P3_2 = 0x00b2
-G$P3_3$0$0 == 0x00b3
-_P3_3 = 0x00b3
-G$P3_4$0$0 == 0x00b4
-_P3_4 = 0x00b4
-G$P3_5$0$0 == 0x00b5
-_P3_5 = 0x00b5
-G$P3_6$0$0 == 0x00b6
-_P3_6 = 0x00b6
-G$P3_7$0$0 == 0x00b7
-_P3_7 = 0x00b7
-G$RXD$0$0 == 0x00b0
-_RXD = 0x00b0
-G$TXD$0$0 == 0x00b1
-_TXD = 0x00b1
-G$INT0$0$0 == 0x00b2
-_INT0 = 0x00b2
-G$INT1$0$0 == 0x00b3
-_INT1 = 0x00b3
-G$T0$0$0 == 0x00b4
-_T0 = 0x00b4
-G$T1$0$0 == 0x00b5
-_T1 = 0x00b5
-G$WR$0$0 == 0x00b6
-_WR = 0x00b6
-G$RD$0$0 == 0x00b7
-_RD = 0x00b7
-G$PX0$0$0 == 0x00b8
-_PX0 = 0x00b8
-G$PT0$0$0 == 0x00b9
-_PT0 = 0x00b9
-G$PX1$0$0 == 0x00ba
-_PX1 = 0x00ba
-G$PT1$0$0 == 0x00bb
-_PT1 = 0x00bb
-G$PS$0$0 == 0x00bc
-_PS = 0x00bc
-G$P$0$0 == 0x00d0
-_P = 0x00d0
-G$FL$0$0 == 0x00d1
-_FL = 0x00d1
-G$OV$0$0 == 0x00d2
-_OV = 0x00d2
-G$RS0$0$0 == 0x00d3
-_RS0 = 0x00d3
-G$RS1$0$0 == 0x00d4
-_RS1 = 0x00d4
-G$F0$0$0 == 0x00d5
-_F0 = 0x00d5
-G$AC$0$0 == 0x00d6
-_AC = 0x00d6
-G$CY$0$0 == 0x00d7
-_CY = 0x00d7
-;--------------------------------------------------------
-; overlayable register banks
-;--------------------------------------------------------
- .area REG_BANK_0 (REL,OVR,DATA)
- .ds 8
-;--------------------------------------------------------
-; internal ram data
-;--------------------------------------------------------
- .area DSEG (DATA)
-G$some_variable$0$0==.
-_some_variable::
- .ds 4
-G$i$0$0==.
-_i::
- .ds 2
-;--------------------------------------------------------
-; overlayable items in internal ram
-;--------------------------------------------------------
- .area OSEG (OVR,DATA)
-;--------------------------------------------------------
-; Stack segment in internal ram
-;--------------------------------------------------------
- .area SSEG (DATA)
-__start__stack:
- .ds 1
-
-;--------------------------------------------------------
-; indirectly addressable internal ram data
-;--------------------------------------------------------
- .area ISEG (DATA)
-;--------------------------------------------------------
-; absolute internal ram data
-;--------------------------------------------------------
- .area IABS (ABS,DATA)
- .area IABS (ABS,DATA)
-;--------------------------------------------------------
-; bit data
-;--------------------------------------------------------
- .area BSEG (BIT)
-;--------------------------------------------------------
-; paged external ram data
-;--------------------------------------------------------
- .area PSEG (PAG,XDATA)
-;--------------------------------------------------------
-; external ram data
-;--------------------------------------------------------
- .area XSEG (XDATA)
-;--------------------------------------------------------
-; absolute external ram data
-;--------------------------------------------------------
- .area XABS (ABS,XDATA)
-;--------------------------------------------------------
-; external initialized ram data
-;--------------------------------------------------------
- .area XISEG (XDATA)
- .area HOME (CODE)
- .area GSINIT0 (CODE)
- .area GSINIT1 (CODE)
- .area GSINIT2 (CODE)
- .area GSINIT3 (CODE)
- .area GSINIT4 (CODE)
- .area GSINIT5 (CODE)
- .area GSINIT (CODE)
- .area GSFINAL (CODE)
- .area CSEG (CODE)
-;--------------------------------------------------------
-; interrupt vector
-;--------------------------------------------------------
- .area HOME (CODE)
-__interrupt_vect:
- ljmp __sdcc_gsinit_startup
-;--------------------------------------------------------
-; global & static initialisations
-;--------------------------------------------------------
- .area HOME (CODE)
- .area GSINIT (CODE)
- .area GSFINAL (CODE)
- .area GSINIT (CODE)
- .globl __sdcc_gsinit_startup
- .globl __sdcc_program_startup
- .globl __start__stack
- .globl __mcs51_genXINIT
- .globl __mcs51_genXRAMCLEAR
- .globl __mcs51_genRAMCLEAR
- G$main$0$0 ==.
- C$demo_c_0.c$10$1$1 ==.
-; demo_c_0.c:10: unsigned long some_variable=0; ///< Documentation for this variable comes here
- clr a
- mov _some_variable,a
- mov (_some_variable + 1),a
- mov (_some_variable + 2),a
- mov (_some_variable + 3),a
- .area GSFINAL (CODE)
- ljmp __sdcc_program_startup
-;--------------------------------------------------------
-; Home
-;--------------------------------------------------------
- .area HOME (CODE)
- .area HOME (CODE)
-__sdcc_program_startup:
- lcall _main
-; return from main will lock up
- sjmp .
-;--------------------------------------------------------
-; code
-;--------------------------------------------------------
- .area CSEG (CODE)
-;------------------------------------------------------------
-;Allocation info for local variables in function 'someFunction'
-;------------------------------------------------------------
-;somevalue Allocated to registers r2
-;------------------------------------------------------------
- G$someFunction$0$0 ==.
- C$demo_c_0.c$20$0$0 ==.
-; demo_c_0.c:20: void someFunction(unsigned char somevalue)
-; -----------------------------------------
-; function someFunction
-; -----------------------------------------
-_someFunction:
- ar2 = 0x02
- ar3 = 0x03
- ar4 = 0x04
- ar5 = 0x05
- ar6 = 0x06
- ar7 = 0x07
- ar0 = 0x00
- ar1 = 0x01
- mov r2,dpl
- C$demo_c_0.c$23$1$1 ==.
-; demo_c_0.c:23: P1=somevalue;
- mov _P1,r2
- C$demo_c_0.c$24$1$1 ==.
-; demo_c_0.c:24: P3=somevalue^0xFF;
- mov a,#0xFF
- xrl a,r2
- mov _P3,a
- C$demo_c_0.c$25$1$1 ==.
- XG$someFunction$0$0 ==.
- ret
-;------------------------------------------------------------
-;Allocation info for local variables in function 'main'
-;------------------------------------------------------------
-;------------------------------------------------------------
- G$main$0$0 ==.
- C$demo_c_0.c$28$1$1 ==.
-; demo_c_0.c:28: int main()
-; -----------------------------------------
-; function main
-; -----------------------------------------
-_main:
- C$demo_c_0.c$31$1$1 ==.
-; demo_c_0.c:31: while(1) {
-00102$:
- C$demo_c_0.c$32$2$2 ==.
-; demo_c_0.c:32: for(i=0; i<255; i++) {
- clr a
- mov _i,a
- mov (_i + 1),a
-00104$:
- clr c
- mov a,_i
- subb a,#0xFF
- mov a,(_i + 1)
- xrl a,#0x80
- subb a,#0x80
- jnc 00107$
- C$demo_c_0.c$33$3$3 ==.
-; demo_c_0.c:33: someFunction(i+2);
- mov r2,_i
- mov a,#0x02
- add a,r2
- mov dpl,a
- lcall _someFunction
- C$demo_c_0.c$34$3$3 ==.
-; demo_c_0.c:34: some_variable++;
- inc _some_variable
- clr a
- cjne a,_some_variable,00114$
- inc (_some_variable + 1)
- cjne a,(_some_variable + 1),00114$
- inc (_some_variable + 2)
- cjne a,(_some_variable + 2),00114$
- inc (_some_variable + 3)
-00114$:
- C$demo_c_0.c$32$2$2 ==.
-; demo_c_0.c:32: for(i=0; i<255; i++) {
- inc _i
- clr a
- cjne a,_i,00104$
- inc (_i + 1)
- sjmp 00104$
-00107$:
- C$demo_c_0.c$36$2$2 ==.
-; demo_c_0.c:36: some_variable-=22;
- mov a,_some_variable
- add a,#0xea
- mov _some_variable,a
- mov a,(_some_variable + 1)
- addc a,#0xff
- mov (_some_variable + 1),a
- mov a,(_some_variable + 2)
- addc a,#0xff
- mov (_some_variable + 2),a
- mov a,(_some_variable + 3)
- addc a,#0xff
- mov (_some_variable + 3),a
- C$demo_c_0.c$40$1$1 ==.
-; demo_c_0.c:40: return 0;
- C$demo_c_0.c$41$1$1 ==.
- XG$main$0$0 ==.
- sjmp 00102$
- .area CSEG (CODE)
- .area CONST (CODE)
- .area XINIT (CODE)
- .area CABS (ABS,CODE)
diff --git a/demo/demo_c_0.c b/demo/demo_c_0.c
index 9655334..944786e 100644
--- a/demo/demo_c_0.c
+++ b/demo/demo_c_0.c
@@ -3,7 +3,7 @@
* @file demo_c_0.c
*/
-// This file defines registers avaliable in AT89x51 MCUs
+// This file defines registers available in AT89x51 MCUs
// See /usr/share/sdcc/include/mcs51/ for alternatives
#include <at89x51.h>
diff --git a/demo/demo_c_0.hashes b/demo/demo_c_0.hashes
index aa19cb5..b2854fe 100644
--- a/demo/demo_c_0.hashes
+++ b/demo/demo_c_0.hashes
@@ -1 +1 @@
-79C98C5ADE29831807D59F6BC438063A "demo_c_0.c"
+A958F84B552CBBD6CB8D8FA776FEB327 "demo_c_0.c"
diff --git a/demo/demo_c_0.hex b/demo/demo_c_0.hex
deleted file mode 100644
index 6160cd7..0000000
--- a/demo/demo_c_0.hex
+++ /dev/null
@@ -1,34 +0,0 @@
-:03000000020008F3
-:06006100E4F508F509F5C5
-:030067000AF50B8C
-:03006A000200038E
-:0500030012007780FEF1
-:0A006D00AA828A9074FF6AF5B0229F
-:05007700E4F50CF50D9D
-:0A007C00C3E50C94FFE50D648094C9
-:0B008600805026AA0C74022AF582129A
-:06009100006D0508E4B556
-:05009700080C0509B58D
-:05009C000907050AB58B
-:0400A1000A02050B3F
-:0700A500050CE4B50CD105C8
-:0300AC000D80CDF7
-:0700AF00E50824EAF508E56D
-:0600B6000934FFF509E525
-:0600BC000A34FFF50AE51D
-:0700C2000B34FFF50B80AECB
-:06003700E478FFF6D8FD9D
-:080015007900E94400601B7A48
-:05001D00009000CD7809
-:030022000075A0C6
-:0A00250000E493F2A308B8000205FE
-:08002F00A0D9F4DAF275A0FF7C
-:08003D007800E84400600A7934
-:030045000075A0A3
-:0600480000E4F309D8FCFE
-:08004E007800E84400600C7921
-:0B00560000900000E4F0A3D8FCD9FAF1
-:0300080075810DF2
-:0A000B001200C9E582600302000341
-:0400C900758200221A
-:00000001FF
diff --git a/demo/demo_c_0.lnk b/demo/demo_c_0.lnk
deleted file mode 100644
index 4e51a94..0000000
--- a/demo/demo_c_0.lnk
+++ /dev/null
@@ -1,19 +0,0 @@
--myuxi
--Y
--a 0x0100
--v 0x0000
--w 0x0800
--z
--b HOME = 0x0000
--b ISEG = 0x0000
--b BSEG = 0x0000
--k /usr/libexec/sdcc/../share/sdcc/lib/small
--k /usr/share/sdcc/lib/small
--l mcs51
--l libsdcc
--l libint
--l liblong
--l libfloat
-demo_c_0.rel
-
--e
diff --git a/demo/demo_c_0.lst b/demo/demo_c_0.lst
index ec4c901..3053251 100644
--- a/demo/demo_c_0.lst
+++ b/demo/demo_c_0.lst
@@ -1,7 +1,7 @@
1 ;--------------------------------------------------------
2 ; File Created by SDCC : free open source ANSI-C Compiler
- 3 ; Version 2.9.0 #5416 (Oct 6 2009) (UNIX)
- 4 ; This file was generated Tue Oct 27 23:03:10 2009
+ 3 ; Version 2.9.0 #5416 (Feb 3 2010) (UNIX)
+ 4 ; This file was generated Sun Dec 16 06:02:12 2012
5 ;--------------------------------------------------------
6 .module demo_c_0
7 .optsdcc -mmcs51 --model-small
diff --git a/demo/demo_c_0.map b/demo/demo_c_0.map
deleted file mode 100644
index d1247dd..0000000
--- a/demo/demo_c_0.map
+++ /dev/null
@@ -1,488 +0,0 @@
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-CABS 0000 0000 = 0. bytes (ABS,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:FFFFFF00 s_BSEG
- 0C:0000 l_BIT_BANK
- 0C:0000 l_BSEG
- 0C:0000 l_BSEG_BYTES
- 0C:0000 l_CABS
- 0C:0000 l_CONST
- 0C:0000 l_GSINIT1
- 0C:0000 l_GSINIT5
- 0C:0000 l_IABS
- 0C:0000 l_ISEG
- 0C:0000 l_OSEG
- 0C:0000 l_PSEG
- 0C:0000 l_REG_BANK_1
- 0C:0000 l_REG_BANK_2
- 0C:0000 l_REG_BANK_3
- 0C:0000 l_RSEG
- 0C:0000 l_XABS
- 0C:0000 l_XINIT
- 0C:0000 l_XISEG
- 0C:0000 l_XSEG
- 0C:0000 l__CODE
- 0C:0000 s_BSEG_BYTES
- 0C:0000 s_CABS
- 0C:0000 s_DSEG
- 0C:0000 s_HOME
- 0C:0000 s_IABS
- 0C:0000 s_ISEG
- 0C:0000 s_PSEG
- 0C:0000 s_REG_BANK_0
- 0C:0000 s_XABS
- 0C:0000 s_XISEG
- 0C:0000 s_XSEG
- 0C:0003 l_GSFINAL
- 0C:0003 l_GSINIT0
- 0C:0008 l_HOME
- 0C:0008 l_REG_BANK_0
- 0C:0008 s_GSINIT0
- 0C:0008 s_REG_BANK_1
- 0C:0009 l_GSINIT
- 0C:000A l_GSINIT2
- 0C:000B s_GSINIT1
- 0C:000B s_GSINIT2
- 0C:000E s_RSEG
- 0C:000E s_SSEG
- 0C:0010 s_REG_BANK_2
- 0C:0015 s_GSINIT3
- 0C:0018 s_BIT_BANK
- 0C:0018 s_OSEG
- 0C:0018 s_REG_BANK_3
- 0C:0020 s__CODE
- 0C:0022 l_GSINIT3
- 0C:002A l_GSINIT4
- 0C:0037 s_GSINIT4
- 0C:0060 l_CSEG
- 0C:0061 s_GSINIT
- 0C:0061 s_GSINIT5
- 0C:006A s_GSFINAL
- 0C:006D s_CSEG
- 0C:0080 l_DSEG
- 0C:00CD s_CONST
- 0C:00CD s_XINIT
- 0C:00F2 l_SSEG
- 0C:0100 l_IRAM
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-. .ABS. 0000 0000 = 0. bytes (ABS,CON)
-
- Value Global
- -------- --------------------------------
- 0080 G$P0$0$0
- 0080 G$P0_0$0$0
- 0080 _P0
- 0080 _P0_0
- 0081 G$P0_1$0$0
- 0081 G$SP$0$0
- 0081 _P0_1
- 0081 _SP
- 0082 G$DPL$0$0
- 0082 G$P0_2$0$0
- 0082 _DPL
- 0082 _P0_2
- 0083 G$DPH$0$0
- 0083 G$P0_3$0$0
- 0083 _DPH
- 0083 _P0_3
- 0084 G$P0_4$0$0
- 0084 _P0_4
- 0085 G$P0_5$0$0
- 0085 _P0_5
- 0086 G$P0_6$0$0
- 0086 _P0_6
- 0087 G$P0_7$0$0
- 0087 G$PCON$0$0
- 0087 _P0_7
- 0087 _PCON
- 0088 G$IT0$0$0
- 0088 G$TCON$0$0
- 0088 _IT0
- 0088 _TCON
- 0089 G$IE0$0$0
- 0089 G$TMOD$0$0
- 0089 _IE0
- 0089 _TMOD
- 008A G$IT1$0$0
- 008A G$TL0$0$0
- 008A _IT1
- 008A _TL0
- 008B G$IE1$0$0
- 008B G$TL1$0$0
- 008B _IE1
- 008B _TL1
- 008C G$TH0$0$0
- 008C G$TR0$0$0
- 008C _TH0
- 008C _TR0
- 008D G$TF0$0$0
- 008D G$TH1$0$0
- 008D _TF0
- 008D _TH1
- 008E G$TR1$0$0
- 008E _TR1
- 008F G$TF1$0$0
- 008F _TF1
- 0090 G$P1$0$0
- 0090 G$P1_0$0$0
- 0090 _P1
- 0090 _P1_0
- 0091 G$P1_1$0$0
- 0091 _P1_1
- 0092 G$P1_2$0$0
- 0092 _P1_2
- 0093 G$P1_3$0$0
- 0093 _P1_3
- 0094 G$P1_4$0$0
- 0094 _P1_4
- 0095 G$P1_5$0$0
- 0095 _P1_5
- 0096 G$P1_6$0$0
- 0096 _P1_6
- 0097 G$P1_7$0$0
- 0097 _P1_7
- 0098 G$RI$0$0
- 0098 G$SCON$0$0
- 0098 _RI
- 0098 _SCON
- 0099 G$SBUF$0$0
- 0099 G$TI$0$0
- 0099 _SBUF
- 0099 _TI
- 009A G$RB8$0$0
- 009A _RB8
- 009B G$TB8$0$0
- 009B _TB8
- 009C G$REN$0$0
- 009C _REN
- 009D G$SM2$0$0
- 009D _SM2
- 009E G$SM1$0$0
- 009E _SM1
- 009F G$SM0$0$0
- 009F _SM0
- 00A0 G$P2$0$0
- 00A0 G$P2_0$0$0
- 00A0 _P2
- 00A0 _P2_0
- 00A0 __XPAGE
- 00A1 G$P2_1$0$0
- 00A1 _P2_1
- 00A2 G$P2_2$0$0
- 00A2 _P2_2
- 00A3 G$P2_3$0$0
- 00A3 _P2_3
- 00A4 G$P2_4$0$0
- 00A4 _P2_4
- 00A5 G$P2_5$0$0
- 00A5 _P2_5
- 00A6 G$P2_6$0$0
- 00A6 _P2_6
- 00A7 G$P2_7$0$0
- 00A7 _P2_7
- 00A8 G$EX0$0$0
- 00A8 G$IE$0$0
- 00A8 _EX0
- 00A8 _IE
- 00A9 G$ET0$0$0
- 00A9 _ET0
- 00AA G$EX1$0$0
- 00AA _EX1
- 00AB G$ET1$0$0
- 00AB _ET1
- 00AC G$ES$0$0
- 00AC _ES
- 00AF G$EA$0$0
- 00AF _EA
- 00B0 G$P3$0$0
- 00B0 G$P3_0$0$0
- 00B0 G$RXD$0$0
- 00B0 _P3
- 00B0 _P3_0
- 00B0 _RXD
- 00B1 G$P3_1$0$0
- 00B1 G$TXD$0$0
- 00B1 _P3_1
- 00B1 _TXD
- 00B2 G$INT0$0$0
- 00B2 G$P3_2$0$0
- 00B2 _INT0
- 00B2 _P3_2
- 00B3 G$INT1$0$0
- 00B3 G$P3_3$0$0
- 00B3 _INT1
- 00B3 _P3_3
- 00B4 G$P3_4$0$0
- 00B4 G$T0$0$0
- 00B4 _P3_4
- 00B4 _T0
- 00B5 G$P3_5$0$0
- 00B5 G$T1$0$0
- 00B5 _P3_5
- 00B5 _T1
- 00B6 G$P3_6$0$0
- 00B6 G$WR$0$0
- 00B6 _P3_6
- 00B6 _WR
- 00B7 G$P3_7$0$0
- 00B7 G$RD$0$0
- 00B7 _P3_7
- 00B7 _RD
- 00B8 G$IP$0$0
- 00B8 G$PX0$0$0
- 00B8 _IP
- 00B8 _PX0
- 00B9 G$PT0$0$0
- 00B9 _PT0
- 00BA G$PX1$0$0
- 00BA _PX1
- 00BB G$PT1$0$0
- 00BB _PT1
- 00BC G$PS$0$0
- 00BC _PS
- 00D0 G$P$0$0
- 00D0 G$PSW$0$0
- 00D0 _P
- 00D0 _PSW
- 00D1 G$FL$0$0
- 00D1 _FL
- 00D2 G$OV$0$0
- 00D2 _OV
- 00D3 G$RS0$0$0
- 00D3 _RS0
- 00D4 G$RS1$0$0
- 00D4 _RS1
- 00D5 G$F0$0$0
- 00D5 _F0
- 00D6 G$AC$0$0
- 00D6 _AC
- 00D7 G$CY$0$0
- 00D7 _CY
- 00E0 G$A$0$0
- 00E0 G$ACC$0$0
- 00E0 _A
- 00E0 _ACC
- 00F0 G$B$0$0
- 00F0 _B
-
-
-
-
-
-
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-DSEG 0000 0080 = 128. bytes (REL,CON)
-
- Value Global
- -------- --------------------------------
- 0008 G$some_variable$0$0
- 0008 _some_variable
- 000C G$i$0$0
- 000C _i
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-SSEG 000E 00F2 = 242. bytes (REL,OVR)
-
- Value Global
- -------- --------------------------------
- 000E __start__stack
-
-
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-HOME 0000 0008 = 8. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0000 A$demo_c_0$385
- 0C:0003 A$demo_c_0$415
- 0C:0003 __sdcc_program_startup
- 0C:0006 A$demo_c_0$417
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSINIT0 0008 0003 = 3. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0008 __sdcc_gsinit_startup
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSINIT3 0015 0022 = 34. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0015 __mcs51_genXINIT
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSINIT4 0037 002A = 42. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0037 __mcs51_genRAMCLEAR
- 0C:003D __mcs51_genXRAMCLEAR
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSINIT 0061 0009 = 9. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0061 A$demo_c_0$402
- 0C:0061 C$demo_c_0.c$10$1$1
- 0C:0062 A$demo_c_0$403
- 0C:0064 A$demo_c_0$404
- 0C:0066 A$demo_c_0$405
- 0C:0068 A$demo_c_0$406
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSFINAL 006A 0003 = 3. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:006A A$demo_c_0$408
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-CSEG 006D 0060 = 96. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:006D A$demo_c_0$442
- 0C:006D C$demo_c_0.c$20$0$0
- 0C:006D G$someFunction$0$0
- 0C:006D _someFunction
- 0C:006F A$demo_c_0$445
- 0C:006F C$demo_c_0.c$23$1$1
- 0C:0071 A$demo_c_0$448
- 0C:0071 C$demo_c_0.c$24$1$1
- 0C:0073 A$demo_c_0$449
- 0C:0074 A$demo_c_0$450
- 0C:0076 A$demo_c_0$453
- 0C:0076 C$demo_c_0.c$25$1$1
- 0C:0076 XG$someFunction$0$0
- 0C:0077 A$demo_c_0$470
- 0C:0077 C$demo_c_0.c$28$1$1
- 0C:0077 C$demo_c_0.c$31$1$1
- 0C:0077 G$main$0$0
- 0C:0077 _main
- 0C:0078 A$demo_c_0$471
- 0C:007A A$demo_c_0$472
- 0C:007C A$demo_c_0$474
- 0C:007D A$demo_c_0$475
- 0C:007F A$demo_c_0$476
- 0C:0081 A$demo_c_0$477
- 0C:0083 A$demo_c_0$478
- 0C:0085 A$demo_c_0$479
- 0C:0087 A$demo_c_0$480
- 0C:0089 A$demo_c_0$483
- 0C:0089 C$demo_c_0.c$33$3$3
- 0C:008B A$demo_c_0$484
- 0C:008D A$demo_c_0$485
- 0C:008E A$demo_c_0$486
- 0C:0090 A$demo_c_0$487
- 0C:0093 A$demo_c_0$490
- 0C:0093 C$demo_c_0.c$34$3$3
- 0C:0095 A$demo_c_0$491
- 0C:0096 A$demo_c_0$492
- 0C:0099 A$demo_c_0$493
- 0C:009B A$demo_c_0$494
- 0C:009E A$demo_c_0$495
- 0C:00A0 A$demo_c_0$496
- 0C:00A3 A$demo_c_0$497
- 0C:00A5 A$demo_c_0$501
- 0C:00A5 C$demo_c_0.c$32$2$2
- 0C:00A7 A$demo_c_0$502
- 0C:00A8 A$demo_c_0$503
- 0C:00AB A$demo_c_0$504
- 0C:00AD A$demo_c_0$505
- 0C:00AF A$demo_c_0$509
- 0C:00AF C$demo_c_0.c$36$2$2
- 0C:00B1 A$demo_c_0$510
- 0C:00B3 A$demo_c_0$511
- 0C:00B5 A$demo_c_0$512
- 0C:00B7 A$demo_c_0$513
- 0C:00B9 A$demo_c_0$514
- 0C:00BB A$demo_c_0$515
- 0C:00BD A$demo_c_0$516
- 0C:00BF A$demo_c_0$517
- 0C:00C1 A$demo_c_0$518
- 0C:00C3 A$demo_c_0$519
- 0C:00C5 A$demo_c_0$520
- 0C:00C7 A$demo_c_0$525
- 0C:00C7 C$demo_c_0.c$40$1$1
- 0C:00C7 C$demo_c_0.c$41$1$1
- 0C:00C7 XG$main$0$0
- 0C:00C9 __sdcc_external_startup
-
-
- ASxxxx Linker V01.75 + NoICE + SDCC Feb 1999, page 1.
-
-Files Linked [ module(s) ]
-
-demo_c_0.rel
-
-Libraries Linked [ object file ]
-
-/usr/share/sdcc/lib/small/mcs51.lib [ crtclear.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtxinit.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtxclear.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtpagesfr.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtstart.rel ]
-/usr/share/sdcc/lib/small/libsdcc.lib [ _startup.rel ]
-
- ASxxxx Linker V01.75 + NoICE + SDCC Feb 1999, page 2.
-
-User Base Address Definitions
-
-HOME = 0x0000
-ISEG = 0x0000
-BSEG = 0x0000
-
- \ No newline at end of file
diff --git a/demo/demo_c_0.mem b/demo/demo_c_0.mem
deleted file mode 100644
index 01837e4..0000000
--- a/demo/demo_c_0.mem
+++ /dev/null
@@ -1,28 +0,0 @@
-Internal RAM layout:
- 0 1 2 3 4 5 6 7 8 9 A B C D E F
-0x00:|0|0|0|0|0|0|0|0|a|a|a|a|a|a|S|S|
-0x10:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x20:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x40:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x80:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x90:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xa0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xb0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xc0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xd0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xe0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xf0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute
-
-Stack starts at: 0x0e (sp set to 0x0d) with 242 bytes available.
-
-Other memory:
- Name Start End Size Max
- ---------------- -------- -------- -------- --------
- PAGED EXT. RAM 0 0
- EXTERNAL RAM 0 0
- ROM/EPROM/FLASH 0x0000 0x00cc 205 2048
diff --git a/demo/demo_c_0.rel b/demo/demo_c_0.rel
deleted file mode 100644
index 172db17..0000000
--- a/demo/demo_c_0.rel
+++ /dev/null
@@ -1,378 +0,0 @@
-;!FILE demo_c_0.asm
-XH
-H 1A areas 117 global symbols
-M demo_c_0
-O -mmcs51 --model-small
-S G$EX0$0$0 Def00A8
-S G$IT0$0$0 Def0088
-S G$TH1$0$0 Def008D
-S _P1 Def0090
-S _A Def00E0
-S G$RXD$0$0 Def00B0
-S G$EX1$0$0 Def00AA
-S G$TB8$0$0 Def009B
-S G$IT1$0$0 Def008A
-S G$IE$0$0 Def00A8
-S _P2 Def00A0
-S _B Def00F0
-S _SP Def0081
-S _P3 Def00B0
-S _PS Def00BC
-S G$TXD$0$0 Def00B1
-S G$SM0$0$0 Def009F
-S G$TL0$0$0 Def008A
-S _T0 Def00B4
-S G$SM1$0$0 Def009E
-S G$TL1$0$0 Def008B
-S _T1 Def00B5
-S _OV Def00D2
-S G$FL$0$0 Def00D1
-S G$SM2$0$0 Def009D
-S _ACC Def00E0
-S __mcs51_genRAMCLEAR Ref0000
-S G$PT0$0$0 Def00B9
-S G$RS0$0$0 Def00D3
-S G$PT1$0$0 Def00BB
-S _WR Def00B6
-S G$F0$0$0 Def00D5
-S G$RS1$0$0 Def00D4
-S G$RD$0$0 Def00B7
-S G$TR0$0$0 Def008C
-S G$TR1$0$0 Def008E
-S G$PX0$0$0 Def00B8
-S G$ES$0$0 Def00AC
-S G$PX1$0$0 Def00BA
-S G$IP$0$0 Def00B8
-S G$PSW$0$0 Def00D0
-S G$RI$0$0 Def0098
-S _P0_0 Def0080
-S G$CY$0$0 Def00D7
-S _PCON Def0087
-S _SBUF Def0099
-S _P0_1 Def0081
-S _P1_0 Def0090
-S _P Def00D0
-S G$TI$0$0 Def0099
-S _P0_2 Def0082
-S _P1_1 Def0091
-S _P2_0 Def00A0
-S _P0_3 Def0083
-S _P1_2 Def0092
-S _P2_1 Def00A1
-S _P3_0 Def00B0
-S _SCON Def0098
-S _P0_4 Def0084
-S _P1_3 Def0093
-S _P2_2 Def00A2
-S _P3_1 Def00B1
-S G$P0$0$0 Def0080
-S _TCON Def0088
-S _TMOD Def0089
-S _P0_5 Def0085
-S _P1_4 Def0094
-S _P2_3 Def00A3
-S _P3_2 Def00B2
-S G$A$0$0 Def00E0
-S G$P1$0$0 Def0090
-S _P0_6 Def0086
-S _P1_5 Def0095
-S _P2_4 Def00A4
-S _P3_3 Def00B3
-S G$B$0$0 Def00F0
-S G$P2$0$0 Def00A0
-S _P0_7 Def0087
-S _P1_6 Def0096
-S _P2_5 Def00A5
-S _P3_4 Def00B4
-S G$PS$0$0 Def00BC
-S G$P3$0$0 Def00B0
-S G$SP$0$0 Def0081
-S _P1_7 Def0097
-S _P2_6 Def00A6
-S _P3_5 Def00B5
-S G$T0$0$0 Def00B4
-S _P2_7 Def00A7
-S _P3_6 Def00B6
-S G$OV$0$0 Def00D2
-S G$T1$0$0 Def00B5
-S _P3_7 Def00B7
-S G$ACC$0$0 Def00E0
-S _INT0 Def00B2
-S _DPH Def0083
-S _INT1 Def00B3
-S G$WR$0$0 Def00B6
-S _IE0 Def0089
-S _IE1 Def008B
-S _DPL Def0082
-S G$P0_0$0$0 Def0080
-S G$P$0$0 Def00D0
-S G$P1_0$0$0 Def0090
-S G$P0_1$0$0 Def0081
-S G$SBUF$0$0 Def0099
-S G$PCON$0$0 Def0087
-S _AC Def00D6
-S G$P2_0$0$0 Def00A0
-S G$P1_1$0$0 Def0091
-S G$P0_2$0$0 Def0082
-S _REN Def009C
-S G$P3_0$0$0 Def00B0
-S G$P2_1$0$0 Def00A1
-S G$P1_2$0$0 Def0092
-S G$P0_3$0$0 Def0083
-S _EA Def00AF
-S G$P3_1$0$0 Def00B1
-S G$P2_2$0$0 Def00A2
-S G$P1_3$0$0 Def0093
-S G$P0_4$0$0 Def0084
-S G$SCON$0$0 Def0098
-S G$P3_2$0$0 Def00B2
-S G$P2_3$0$0 Def00A3
-S G$P1_4$0$0 Def0094
-S G$P0_5$0$0 Def0085
-S G$TMOD$0$0 Def0089
-S G$TCON$0$0 Def0088
-S G$P3_3$0$0 Def00B3
-S G$P2_4$0$0 Def00A4
-S G$P1_5$0$0 Def0095
-S G$P0_6$0$0 Def0086
-S _ET0 Def00A9
-S G$P3_4$0$0 Def00B4
-S G$P2_5$0$0 Def00A5
-S G$P1_6$0$0 Def0096
-S G$P0_7$0$0 Def0087
-S _TF0 Def008D
-S _ET1 Def00AB
-S G$P3_5$0$0 Def00B5
-S G$P2_6$0$0 Def00A6
-S G$P1_7$0$0 Def0097
-S _TF1 Def008F
-S G$P3_6$0$0 Def00B6
-S G$P2_7$0$0 Def00A7
-S _TH0 Def008C
-S _RB8 Def009A
-S __mcs51_genXINIT Ref0000
-S G$P3_7$0$0 Def00B7
-S _TH1 Def008D
-S _IT0 Def0088
-S _EX0 Def00A8
-S _IE Def00A8
-S _IT1 Def008A
-S _TB8 Def009B
-S _EX1 Def00AA
-S _RXD Def00B0
-S G$INT0$0$0 Def00B2
-S G$INT1$0$0 Def00B3
-S G$DPH$0$0 Def0083
-S _TL0 Def008A
-S _SM0 Def009F
-S _TXD Def00B1
-S _TL1 Def008B
-S _SM1 Def009E
-S G$IE0$0$0 Def0089
-S _SM2 Def009D
-S _FL Def00D1
-S G$IE1$0$0 Def008B
-S G$DPL$0$0 Def0082
-S _PT0 Def00B9
-S _PT1 Def00BB
-S _RS0 Def00D3
-S _TR0 Def008C
-S _RD Def00B7
-S _RS1 Def00D4
-S _F0 Def00D5
-S _TR1 Def008E
-S G$AC$0$0 Def00D6
-S _ES Def00AC
-S _PX0 Def00B8
-S G$REN$0$0 Def009C
-S _IP Def00B8
-S _PX1 Def00BA
-S G$EA$0$0 Def00AF
-S _PSW Def00D0
-S __sdcc_gsinit_startup Ref0000
-S _RI Def0098
-S _CY Def00D7
-S G$ET0$0$0 Def00A9
-S _TI Def0099
-S G$ET1$0$0 Def00AB
-S G$TF0$0$0 Def008D
-S G$TF1$0$0 Def008F
-S __mcs51_genXRAMCLEAR Ref0000
-S G$RB8$0$0 Def009A
-S G$TH0$0$0 Def008C
-S _P0 Def0080
-A _CODE size 0 flags 0 addr 0
-A RSEG size 0 flags 0 addr 0
-A REG_BANK_0 size 8 flags 4 addr 0
-A DSEG size 6 flags 0 addr 0
-S _i Def0004
-S G$some_variable$0$0 Def0000
-S G$i$0$0 Def0004
-S _some_variable Def0000
-A OSEG size 0 flags 4 addr 0
-A SSEG size 1 flags 0 addr 0
-S __start__stack Def0000
-A ISEG size 0 flags 0 addr 0
-A IABS size 0 flags 8 addr 0
-A BSEG size 0 flags 80 addr 0
-A PSEG size 0 flags 50 addr 0
-A XSEG size 0 flags 40 addr 0
-A XABS size 0 flags 48 addr 0
-A XISEG size 0 flags 40 addr 0
-A HOME size 8 flags 20 addr 0
-S __sdcc_program_startup Def0003
-S A$demo_c_0$415 Def0003
-S A$demo_c_0$417 Def0006
-S A$demo_c_0$385 Def0000
-A GSINIT0 size 0 flags 20 addr 0
-A GSINIT1 size 0 flags 20 addr 0
-A GSINIT2 size 0 flags 20 addr 0
-A GSINIT3 size 0 flags 20 addr 0
-A GSINIT4 size 0 flags 20 addr 0
-A GSINIT5 size 0 flags 20 addr 0
-A GSINIT size 9 flags 20 addr 0
-S A$demo_c_0$402 Def0000
-S A$demo_c_0$403 Def0001
-S A$demo_c_0$404 Def0003
-S A$demo_c_0$405 Def0005
-S A$demo_c_0$406 Def0007
-S C$demo_c_0.c$10$1$1 Def0000
-A GSFINAL size 3 flags 20 addr 0
-S A$demo_c_0$408 Def0000
-A CSEG size 5C flags 20 addr 0
-S A$demo_c_0$494 Def002E
-S A$demo_c_0$485 Def0020
-S A$demo_c_0$476 Def0012
-S A$demo_c_0$449 Def0006
-S C$demo_c_0.c$40$1$1 Def005A
-S C$demo_c_0.c$31$1$1 Def000A
-S A$demo_c_0$495 Def0031
-S A$demo_c_0$486 Def0021
-S A$demo_c_0$477 Def0014
-S C$demo_c_0.c$41$1$1 Def005A
-S C$demo_c_0.c$23$1$1 Def0002
-S A$demo_c_0$496 Def0033
-S A$demo_c_0$487 Def0023
-S A$demo_c_0$478 Def0016
-S C$demo_c_0.c$24$1$1 Def0004
-S A$demo_c_0$497 Def0036
-S A$demo_c_0$479 Def0018
-S C$demo_c_0.c$32$2$2 Def0038
-S C$demo_c_0.c$25$1$1 Def0009
-S _main Def000A
-S XG$someFunction$0$0 Def0009
-S C$demo_c_0.c$33$3$3 Def001C
-S C$demo_c_0.c$28$1$1 Def000A
-S C$demo_c_0.c$36$2$2 Def0042
-S C$demo_c_0.c$34$3$3 Def0026
-S G$someFunction$0$0 Def0000
-S XG$main$0$0 Def005A
-S G$main$0$0 Def000A
-S A$demo_c_0$510 Def0044
-S A$demo_c_0$501 Def0038
-S A$demo_c_0$520 Def0058
-S A$demo_c_0$511 Def0046
-S A$demo_c_0$502 Def003A
-S A$demo_c_0$512 Def0048
-S A$demo_c_0$503 Def003B
-S A$demo_c_0$513 Def004A
-S A$demo_c_0$504 Def003E
-S A$demo_c_0$450 Def0007
-S A$demo_c_0$514 Def004C
-S A$demo_c_0$505 Def0040
-S A$demo_c_0$442 Def0000
-S _someFunction Def0000
-S A$demo_c_0$515 Def004E
-S A$demo_c_0$470 Def000A
-S A$demo_c_0$525 Def005A
-S A$demo_c_0$516 Def0050
-S A$demo_c_0$480 Def001A
-S A$demo_c_0$471 Def000B
-S A$demo_c_0$453 Def0009
-S A$demo_c_0$517 Def0052
-S A$demo_c_0$490 Def0026
-S A$demo_c_0$472 Def000D
-S A$demo_c_0$445 Def0002
-S C$demo_c_0.c$20$0$0 Def0000
-S A$demo_c_0$518 Def0054
-S A$demo_c_0$509 Def0042
-S A$demo_c_0$491 Def0028
-S A$demo_c_0$519 Def0056
-S A$demo_c_0$492 Def0029
-S A$demo_c_0$483 Def001C
-S A$demo_c_0$474 Def000F
-S A$demo_c_0$493 Def002C
-S A$demo_c_0$484 Def001E
-S A$demo_c_0$475 Def0010
-S A$demo_c_0$448 Def0004
-A CONST size 0 flags 20 addr 0
-A XINIT size 0 flags 20 addr 0
-A CABS size 0 flags 28 addr 0
-T 00 00
-R 00 00 00 02
-T 00 00
-R 00 00 00 03
-T 00 00
-R 00 00 00 03
-T 00 04
-R 00 00 00 03
-T 00 04
-R 00 00 00 03
-T 00 00
-R 00 00 00 05
-T 00 00
-R 00 00 00 05
-T 00 00
-R 00 00 00 0D
-T 00 00 02 00 00
-R 00 00 00 0D 02 03 00 BA
-T 00 00 E4 F5 00 00 00 F5 00 00 01 F5
-R 00 00 00 14 F1 21 04 00 03 F1 21 08 00 03
-T 00 06 00 00 02 F5 00 00 03
-R 00 00 00 14 F1 21 02 00 03 F1 21 06 00 03
-T 00 00 02 00 03
-R 00 00 00 15 00 03 00 0D
-T 00 03
-R 00 00 00 0D
-T 00 03 12 00 0A 80 FE
-R 00 00 00 0D 00 03 00 16
-T 00 00
-R 00 00 00 16
-T 00 00 AA 82 8A 90 74 FF 6A F5 B0 22
-R 00 00 00 16
-T 00 0A
-R 00 00 00 16
-T 00 0A
-R 00 00 00 16
-T 00 0A E4 F5 00 00 04 F5 00 00 05
-R 00 00 00 16 F1 21 04 00 03 F1 21 08 00 03
-T 00 0F
-R 00 00 00 16
-T 00 0F C3 E5 00 00 04 94 FF E5 00 00 05 64 80 94
-R 00 00 00 16 F1 21 04 00 03 F1 21 0A 00 03
-T 00 19 80 50 26 AA 00 00 04 74 02 2A F5 82 12
-R 00 00 00 16 F1 21 06 00 03
-T 00 24 00 00 05 00 00 00 E4 B5
-R 00 00 00 16 00 02 00 16 F1 21 05 00 03
-T 00 2A 00 00 00 0C 05 00 00 01 B5
-R 00 00 00 16 F1 21 02 00 03 F1 21 07 00 03
-T 00 2F 00 00 01 07 05 00 00 02 B5
-R 00 00 00 16 F1 21 02 00 03 F1 21 07 00 03
-T 00 34 00 00 02 02 05 00 00 03
-R 00 00 00 16 F1 21 02 00 03 F1 21 07 00 03
-T 00 38
-R 00 00 00 16
-T 00 38 05 00 00 04 E4 B5 00 00 04 D1 05
-R 00 00 00 16 F1 21 03 00 03 F1 21 08 00 03
-T 00 3F 00 00 05 80 CD
-R 00 00 00 16 F1 21 02 00 03
-T 00 42
-R 00 00 00 16
-T 00 42 E5 00 00 00 24 EA F5 00 00 00 E5
-R 00 00 00 16 F1 21 03 00 03 F1 21 09 00 03
-T 00 49 00 00 01 34 FF F5 00 00 01 E5
-R 00 00 00 16 F1 21 02 00 03 F1 21 08 00 03
-T 00 4F 00 00 02 34 FF F5 00 00 02 E5
-R 00 00 00 16 F1 21 02 00 03 F1 21 08 00 03
-T 00 55 00 00 03 34 FF F5 00 00 03 80 AE
-R 00 00 00 16 F1 21 02 00 03 F1 21 08 00 03
diff --git a/demo/demo_c_0.rst b/demo/demo_c_0.rst
deleted file mode 100644
index cc9b36a..0000000
--- a/demo/demo_c_0.rst
+++ /dev/null
@@ -1,529 +0,0 @@
- 1 ;--------------------------------------------------------
- 2 ; File Created by SDCC : free open source ANSI-C Compiler
- 3 ; Version 2.9.0 #5416 (Oct 6 2009) (UNIX)
- 4 ; This file was generated Tue Oct 27 23:03:10 2009
- 5 ;--------------------------------------------------------
- 6 .module demo_c_0
- 7 .optsdcc -mmcs51 --model-small
- 8
- 9 ;--------------------------------------------------------
- 10 ; Public variables in this module
- 11 ;--------------------------------------------------------
- 12 .globl _main
- 13 .globl _someFunction
- 14 .globl _CY
- 15 .globl _AC
- 16 .globl _F0
- 17 .globl _RS1
- 18 .globl _RS0
- 19 .globl _OV
- 20 .globl _FL
- 21 .globl _P
- 22 .globl _PS
- 23 .globl _PT1
- 24 .globl _PX1
- 25 .globl _PT0
- 26 .globl _PX0
- 27 .globl _RD
- 28 .globl _WR
- 29 .globl _T1
- 30 .globl _T0
- 31 .globl _INT1
- 32 .globl _INT0
- 33 .globl _TXD
- 34 .globl _RXD
- 35 .globl _P3_7
- 36 .globl _P3_6
- 37 .globl _P3_5
- 38 .globl _P3_4
- 39 .globl _P3_3
- 40 .globl _P3_2
- 41 .globl _P3_1
- 42 .globl _P3_0
- 43 .globl _EA
- 44 .globl _ES
- 45 .globl _ET1
- 46 .globl _EX1
- 47 .globl _ET0
- 48 .globl _EX0
- 49 .globl _P2_7
- 50 .globl _P2_6
- 51 .globl _P2_5
- 52 .globl _P2_4
- 53 .globl _P2_3
- 54 .globl _P2_2
- 55 .globl _P2_1
- 56 .globl _P2_0
- 57 .globl _SM0
- 58 .globl _SM1
- 59 .globl _SM2
- 60 .globl _REN
- 61 .globl _TB8
- 62 .globl _RB8
- 63 .globl _TI
- 64 .globl _RI
- 65 .globl _P1_7
- 66 .globl _P1_6
- 67 .globl _P1_5
- 68 .globl _P1_4
- 69 .globl _P1_3
- 70 .globl _P1_2
- 71 .globl _P1_1
- 72 .globl _P1_0
- 73 .globl _TF1
- 74 .globl _TR1
- 75 .globl _TF0
- 76 .globl _TR0
- 77 .globl _IE1
- 78 .globl _IT1
- 79 .globl _IE0
- 80 .globl _IT0
- 81 .globl _P0_7
- 82 .globl _P0_6
- 83 .globl _P0_5
- 84 .globl _P0_4
- 85 .globl _P0_3
- 86 .globl _P0_2
- 87 .globl _P0_1
- 88 .globl _P0_0
- 89 .globl _B
- 90 .globl _A
- 91 .globl _ACC
- 92 .globl _PSW
- 93 .globl _IP
- 94 .globl _P3
- 95 .globl _IE
- 96 .globl _P2
- 97 .globl _SBUF
- 98 .globl _SCON
- 99 .globl _P1
- 100 .globl _TH1
- 101 .globl _TH0
- 102 .globl _TL1
- 103 .globl _TL0
- 104 .globl _TMOD
- 105 .globl _TCON
- 106 .globl _PCON
- 107 .globl _DPH
- 108 .globl _DPL
- 109 .globl _SP
- 110 .globl _P0
- 111 .globl _i
- 112 .globl _some_variable
- 113 ;--------------------------------------------------------
- 114 ; special function registers
- 115 ;--------------------------------------------------------
- 116 .area RSEG (DATA)
- 0080 117 G$P0$0$0 == 0x0080
- 0080 118 _P0 = 0x0080
- 0081 119 G$SP$0$0 == 0x0081
- 0081 120 _SP = 0x0081
- 0082 121 G$DPL$0$0 == 0x0082
- 0082 122 _DPL = 0x0082
- 0083 123 G$DPH$0$0 == 0x0083
- 0083 124 _DPH = 0x0083
- 0087 125 G$PCON$0$0 == 0x0087
- 0087 126 _PCON = 0x0087
- 0088 127 G$TCON$0$0 == 0x0088
- 0088 128 _TCON = 0x0088
- 0089 129 G$TMOD$0$0 == 0x0089
- 0089 130 _TMOD = 0x0089
- 008A 131 G$TL0$0$0 == 0x008a
- 008A 132 _TL0 = 0x008a
- 008B 133 G$TL1$0$0 == 0x008b
- 008B 134 _TL1 = 0x008b
- 008C 135 G$TH0$0$0 == 0x008c
- 008C 136 _TH0 = 0x008c
- 008D 137 G$TH1$0$0 == 0x008d
- 008D 138 _TH1 = 0x008d
- 0090 139 G$P1$0$0 == 0x0090
- 0090 140 _P1 = 0x0090
- 0098 141 G$SCON$0$0 == 0x0098
- 0098 142 _SCON = 0x0098
- 0099 143 G$SBUF$0$0 == 0x0099
- 0099 144 _SBUF = 0x0099
- 00A0 145 G$P2$0$0 == 0x00a0
- 00A0 146 _P2 = 0x00a0
- 00A8 147 G$IE$0$0 == 0x00a8
- 00A8 148 _IE = 0x00a8
- 00B0 149 G$P3$0$0 == 0x00b0
- 00B0 150 _P3 = 0x00b0
- 00B8 151 G$IP$0$0 == 0x00b8
- 00B8 152 _IP = 0x00b8
- 00D0 153 G$PSW$0$0 == 0x00d0
- 00D0 154 _PSW = 0x00d0
- 00E0 155 G$ACC$0$0 == 0x00e0
- 00E0 156 _ACC = 0x00e0
- 00E0 157 G$A$0$0 == 0x00e0
- 00E0 158 _A = 0x00e0
- 00F0 159 G$B$0$0 == 0x00f0
- 00F0 160 _B = 0x00f0
- 161 ;--------------------------------------------------------
- 162 ; special function bits
- 163 ;--------------------------------------------------------
- 164 .area RSEG (DATA)
- 0080 165 G$P0_0$0$0 == 0x0080
- 0080 166 _P0_0 = 0x0080
- 0081 167 G$P0_1$0$0 == 0x0081
- 0081 168 _P0_1 = 0x0081
- 0082 169 G$P0_2$0$0 == 0x0082
- 0082 170 _P0_2 = 0x0082
- 0083 171 G$P0_3$0$0 == 0x0083
- 0083 172 _P0_3 = 0x0083
- 0084 173 G$P0_4$0$0 == 0x0084
- 0084 174 _P0_4 = 0x0084
- 0085 175 G$P0_5$0$0 == 0x0085
- 0085 176 _P0_5 = 0x0085
- 0086 177 G$P0_6$0$0 == 0x0086
- 0086 178 _P0_6 = 0x0086
- 0087 179 G$P0_7$0$0 == 0x0087
- 0087 180 _P0_7 = 0x0087
- 0088 181 G$IT0$0$0 == 0x0088
- 0088 182 _IT0 = 0x0088
- 0089 183 G$IE0$0$0 == 0x0089
- 0089 184 _IE0 = 0x0089
- 008A 185 G$IT1$0$0 == 0x008a
- 008A 186 _IT1 = 0x008a
- 008B 187 G$IE1$0$0 == 0x008b
- 008B 188 _IE1 = 0x008b
- 008C 189 G$TR0$0$0 == 0x008c
- 008C 190 _TR0 = 0x008c
- 008D 191 G$TF0$0$0 == 0x008d
- 008D 192 _TF0 = 0x008d
- 008E 193 G$TR1$0$0 == 0x008e
- 008E 194 _TR1 = 0x008e
- 008F 195 G$TF1$0$0 == 0x008f
- 008F 196 _TF1 = 0x008f
- 0090 197 G$P1_0$0$0 == 0x0090
- 0090 198 _P1_0 = 0x0090
- 0091 199 G$P1_1$0$0 == 0x0091
- 0091 200 _P1_1 = 0x0091
- 0092 201 G$P1_2$0$0 == 0x0092
- 0092 202 _P1_2 = 0x0092
- 0093 203 G$P1_3$0$0 == 0x0093
- 0093 204 _P1_3 = 0x0093
- 0094 205 G$P1_4$0$0 == 0x0094
- 0094 206 _P1_4 = 0x0094
- 0095 207 G$P1_5$0$0 == 0x0095
- 0095 208 _P1_5 = 0x0095
- 0096 209 G$P1_6$0$0 == 0x0096
- 0096 210 _P1_6 = 0x0096
- 0097 211 G$P1_7$0$0 == 0x0097
- 0097 212 _P1_7 = 0x0097
- 0098 213 G$RI$0$0 == 0x0098
- 0098 214 _RI = 0x0098
- 0099 215 G$TI$0$0 == 0x0099
- 0099 216 _TI = 0x0099
- 009A 217 G$RB8$0$0 == 0x009a
- 009A 218 _RB8 = 0x009a
- 009B 219 G$TB8$0$0 == 0x009b
- 009B 220 _TB8 = 0x009b
- 009C 221 G$REN$0$0 == 0x009c
- 009C 222 _REN = 0x009c
- 009D 223 G$SM2$0$0 == 0x009d
- 009D 224 _SM2 = 0x009d
- 009E 225 G$SM1$0$0 == 0x009e
- 009E 226 _SM1 = 0x009e
- 009F 227 G$SM0$0$0 == 0x009f
- 009F 228 _SM0 = 0x009f
- 00A0 229 G$P2_0$0$0 == 0x00a0
- 00A0 230 _P2_0 = 0x00a0
- 00A1 231 G$P2_1$0$0 == 0x00a1
- 00A1 232 _P2_1 = 0x00a1
- 00A2 233 G$P2_2$0$0 == 0x00a2
- 00A2 234 _P2_2 = 0x00a2
- 00A3 235 G$P2_3$0$0 == 0x00a3
- 00A3 236 _P2_3 = 0x00a3
- 00A4 237 G$P2_4$0$0 == 0x00a4
- 00A4 238 _P2_4 = 0x00a4
- 00A5 239 G$P2_5$0$0 == 0x00a5
- 00A5 240 _P2_5 = 0x00a5
- 00A6 241 G$P2_6$0$0 == 0x00a6
- 00A6 242 _P2_6 = 0x00a6
- 00A7 243 G$P2_7$0$0 == 0x00a7
- 00A7 244 _P2_7 = 0x00a7
- 00A8 245 G$EX0$0$0 == 0x00a8
- 00A8 246 _EX0 = 0x00a8
- 00A9 247 G$ET0$0$0 == 0x00a9
- 00A9 248 _ET0 = 0x00a9
- 00AA 249 G$EX1$0$0 == 0x00aa
- 00AA 250 _EX1 = 0x00aa
- 00AB 251 G$ET1$0$0 == 0x00ab
- 00AB 252 _ET1 = 0x00ab
- 00AC 253 G$ES$0$0 == 0x00ac
- 00AC 254 _ES = 0x00ac
- 00AF 255 G$EA$0$0 == 0x00af
- 00AF 256 _EA = 0x00af
- 00B0 257 G$P3_0$0$0 == 0x00b0
- 00B0 258 _P3_0 = 0x00b0
- 00B1 259 G$P3_1$0$0 == 0x00b1
- 00B1 260 _P3_1 = 0x00b1
- 00B2 261 G$P3_2$0$0 == 0x00b2
- 00B2 262 _P3_2 = 0x00b2
- 00B3 263 G$P3_3$0$0 == 0x00b3
- 00B3 264 _P3_3 = 0x00b3
- 00B4 265 G$P3_4$0$0 == 0x00b4
- 00B4 266 _P3_4 = 0x00b4
- 00B5 267 G$P3_5$0$0 == 0x00b5
- 00B5 268 _P3_5 = 0x00b5
- 00B6 269 G$P3_6$0$0 == 0x00b6
- 00B6 270 _P3_6 = 0x00b6
- 00B7 271 G$P3_7$0$0 == 0x00b7
- 00B7 272 _P3_7 = 0x00b7
- 00B0 273 G$RXD$0$0 == 0x00b0
- 00B0 274 _RXD = 0x00b0
- 00B1 275 G$TXD$0$0 == 0x00b1
- 00B1 276 _TXD = 0x00b1
- 00B2 277 G$INT0$0$0 == 0x00b2
- 00B2 278 _INT0 = 0x00b2
- 00B3 279 G$INT1$0$0 == 0x00b3
- 00B3 280 _INT1 = 0x00b3
- 00B4 281 G$T0$0$0 == 0x00b4
- 00B4 282 _T0 = 0x00b4
- 00B5 283 G$T1$0$0 == 0x00b5
- 00B5 284 _T1 = 0x00b5
- 00B6 285 G$WR$0$0 == 0x00b6
- 00B6 286 _WR = 0x00b6
- 00B7 287 G$RD$0$0 == 0x00b7
- 00B7 288 _RD = 0x00b7
- 00B8 289 G$PX0$0$0 == 0x00b8
- 00B8 290 _PX0 = 0x00b8
- 00B9 291 G$PT0$0$0 == 0x00b9
- 00B9 292 _PT0 = 0x00b9
- 00BA 293 G$PX1$0$0 == 0x00ba
- 00BA 294 _PX1 = 0x00ba
- 00BB 295 G$PT1$0$0 == 0x00bb
- 00BB 296 _PT1 = 0x00bb
- 00BC 297 G$PS$0$0 == 0x00bc
- 00BC 298 _PS = 0x00bc
- 00D0 299 G$P$0$0 == 0x00d0
- 00D0 300 _P = 0x00d0
- 00D1 301 G$FL$0$0 == 0x00d1
- 00D1 302 _FL = 0x00d1
- 00D2 303 G$OV$0$0 == 0x00d2
- 00D2 304 _OV = 0x00d2
- 00D3 305 G$RS0$0$0 == 0x00d3
- 00D3 306 _RS0 = 0x00d3
- 00D4 307 G$RS1$0$0 == 0x00d4
- 00D4 308 _RS1 = 0x00d4
- 00D5 309 G$F0$0$0 == 0x00d5
- 00D5 310 _F0 = 0x00d5
- 00D6 311 G$AC$0$0 == 0x00d6
- 00D6 312 _AC = 0x00d6
- 00D7 313 G$CY$0$0 == 0x00d7
- 00D7 314 _CY = 0x00d7
- 315 ;--------------------------------------------------------
- 316 ; overlayable register banks
- 317 ;--------------------------------------------------------
- 318 .area REG_BANK_0 (REL,OVR,DATA)
- 0000 319 .ds 8
- 320 ;--------------------------------------------------------
- 321 ; internal ram data
- 322 ;--------------------------------------------------------
- 323 .area DSEG (DATA)
- 0000 324 G$some_variable$0$0==.
- 0008 325 _some_variable::
- 0008 326 .ds 4
- 0004 327 G$i$0$0==.
- 000C 328 _i::
- 000C 329 .ds 2
- 330 ;--------------------------------------------------------
- 331 ; overlayable items in internal ram
- 332 ;--------------------------------------------------------
- 333 .area OSEG (OVR,DATA)
- 334 ;--------------------------------------------------------
- 335 ; Stack segment in internal ram
- 336 ;--------------------------------------------------------
- 337 .area SSEG (DATA)
- 000E 338 __start__stack:
- 000E 339 .ds 1
- 340
- 341 ;--------------------------------------------------------
- 342 ; indirectly addressable internal ram data
- 343 ;--------------------------------------------------------
- 344 .area ISEG (DATA)
- 345 ;--------------------------------------------------------
- 346 ; absolute internal ram data
- 347 ;--------------------------------------------------------
- 348 .area IABS (ABS,DATA)
- 349 .area IABS (ABS,DATA)
- 350 ;--------------------------------------------------------
- 351 ; bit data
- 352 ;--------------------------------------------------------
- 353 .area BSEG (BIT)
- 354 ;--------------------------------------------------------
- 355 ; paged external ram data
- 356 ;--------------------------------------------------------
- 357 .area PSEG (PAG,XDATA)
- 358 ;--------------------------------------------------------
- 359 ; external ram data
- 360 ;--------------------------------------------------------
- 361 .area XSEG (XDATA)
- 362 ;--------------------------------------------------------
- 363 ; absolute external ram data
- 364 ;--------------------------------------------------------
- 365 .area XABS (ABS,XDATA)
- 366 ;--------------------------------------------------------
- 367 ; external initialized ram data
- 368 ;--------------------------------------------------------
- 369 .area XISEG (XDATA)
- 370 .area HOME (CODE)
- 371 .area GSINIT0 (CODE)
- 372 .area GSINIT1 (CODE)
- 373 .area GSINIT2 (CODE)
- 374 .area GSINIT3 (CODE)
- 375 .area GSINIT4 (CODE)
- 376 .area GSINIT5 (CODE)
- 377 .area GSINIT (CODE)
- 378 .area GSFINAL (CODE)
- 379 .area CSEG (CODE)
- 380 ;--------------------------------------------------------
- 381 ; interrupt vector
- 382 ;--------------------------------------------------------
- 383 .area HOME (CODE)
- 0000 384 __interrupt_vect:
- 0000 02 00 08 385 ljmp __sdcc_gsinit_startup
- 386 ;--------------------------------------------------------
- 387 ; global & static initialisations
- 388 ;--------------------------------------------------------
- 389 .area HOME (CODE)
- 390 .area GSINIT (CODE)
- 391 .area GSFINAL (CODE)
- 392 .area GSINIT (CODE)
- 393 .globl __sdcc_gsinit_startup
- 394 .globl __sdcc_program_startup
- 395 .globl __start__stack
- 396 .globl __mcs51_genXINIT
- 397 .globl __mcs51_genXRAMCLEAR
- 398 .globl __mcs51_genRAMCLEAR
- 0000 399 G$main$0$0 ==.
- 0000 400 C$demo_c_0.c$10$1$1 ==.
- 401 ; demo_c_0.c:10: unsigned long some_variable=0; ///< Documentation for this variable comes here
- 0061 E4 402 clr a
- 0062 F5 08 403 mov _some_variable,a
- 0064 F5 09 404 mov (_some_variable + 1),a
- 0066 F5 0A 405 mov (_some_variable + 2),a
- 0068 F5 0B 406 mov (_some_variable + 3),a
- 407 .area GSFINAL (CODE)
- 006A 02 00 03 408 ljmp __sdcc_program_startup
- 409 ;--------------------------------------------------------
- 410 ; Home
- 411 ;--------------------------------------------------------
- 412 .area HOME (CODE)
- 413 .area HOME (CODE)
- 0003 414 __sdcc_program_startup:
- 0003 12 00 77 415 lcall _main
- 416 ; return from main will lock up
- 0006 80 FE 417 sjmp .
- 418 ;--------------------------------------------------------
- 419 ; code
- 420 ;--------------------------------------------------------
- 421 .area CSEG (CODE)
- 422 ;------------------------------------------------------------
- 423 ;Allocation info for local variables in function 'someFunction'
- 424 ;------------------------------------------------------------
- 425 ;somevalue Allocated to registers r2
- 426 ;------------------------------------------------------------
- 0000 427 G$someFunction$0$0 ==.
- 0000 428 C$demo_c_0.c$20$0$0 ==.
- 429 ; demo_c_0.c:20: void someFunction(unsigned char somevalue)
- 430 ; -----------------------------------------
- 431 ; function someFunction
- 432 ; -----------------------------------------
- 006D 433 _someFunction:
- 0002 434 ar2 = 0x02
- 0003 435 ar3 = 0x03
- 0004 436 ar4 = 0x04
- 0005 437 ar5 = 0x05
- 0006 438 ar6 = 0x06
- 0007 439 ar7 = 0x07
- 0000 440 ar0 = 0x00
- 0001 441 ar1 = 0x01
- 006D AA 82 442 mov r2,dpl
- 0002 443 C$demo_c_0.c$23$1$1 ==.
- 444 ; demo_c_0.c:23: P1=somevalue;
- 006F 8A 90 445 mov _P1,r2
- 0004 446 C$demo_c_0.c$24$1$1 ==.
- 447 ; demo_c_0.c:24: P3=somevalue^0xFF;
- 0071 74 FF 448 mov a,#0xFF
- 0073 6A 449 xrl a,r2
- 0074 F5 B0 450 mov _P3,a
- 0009 451 C$demo_c_0.c$25$1$1 ==.
- 0009 452 XG$someFunction$0$0 ==.
- 0076 22 453 ret
- 454 ;------------------------------------------------------------
- 455 ;Allocation info for local variables in function 'main'
- 456 ;------------------------------------------------------------
- 457 ;------------------------------------------------------------
- 000A 458 G$main$0$0 ==.
- 000A 459 C$demo_c_0.c$28$1$1 ==.
- 460 ; demo_c_0.c:28: int main()
- 461 ; -----------------------------------------
- 462 ; function main
- 463 ; -----------------------------------------
- 0077 464 _main:
- 000A 465 C$demo_c_0.c$31$1$1 ==.
- 466 ; demo_c_0.c:31: while(1) {
- 0077 467 00102$:
- 000A 468 C$demo_c_0.c$32$2$2 ==.
- 469 ; demo_c_0.c:32: for(i=0; i<255; i++) {
- 0077 E4 470 clr a
- 0078 F5 0C 471 mov _i,a
- 007A F5 0D 472 mov (_i + 1),a
- 007C 473 00104$:
- 007C C3 474 clr c
- 007D E5 0C 475 mov a,_i
- 007F 94 FF 476 subb a,#0xFF
- 0081 E5 0D 477 mov a,(_i + 1)
- 0083 64 80 478 xrl a,#0x80
- 0085 94 80 479 subb a,#0x80
- 0087 50 26 480 jnc 00107$
- 001C 481 C$demo_c_0.c$33$3$3 ==.
- 482 ; demo_c_0.c:33: someFunction(i+2);
- 0089 AA 0C 483 mov r2,_i
- 008B 74 02 484 mov a,#0x02
- 008D 2A 485 add a,r2
- 008E F5 82 486 mov dpl,a
- 0090 12 00 6D 487 lcall _someFunction
- 0026 488 C$demo_c_0.c$34$3$3 ==.
- 489 ; demo_c_0.c:34: some_variable++;
- 0093 05 08 490 inc _some_variable
- 0095 E4 491 clr a
- 0096 B5 08 0C 492 cjne a,_some_variable,00114$
- 0099 05 09 493 inc (_some_variable + 1)
- 009B B5 09 07 494 cjne a,(_some_variable + 1),00114$
- 009E 05 0A 495 inc (_some_variable + 2)
- 00A0 B5 0A 02 496 cjne a,(_some_variable + 2),00114$
- 00A3 05 0B 497 inc (_some_variable + 3)
- 00A5 498 00114$:
- 0038 499 C$demo_c_0.c$32$2$2 ==.
- 500 ; demo_c_0.c:32: for(i=0; i<255; i++) {
- 00A5 05 0C 501 inc _i
- 00A7 E4 502 clr a
- 00A8 B5 0C D1 503 cjne a,_i,00104$
- 00AB 05 0D 504 inc (_i + 1)
- 00AD 80 CD 505 sjmp 00104$
- 00AF 506 00107$:
- 0042 507 C$demo_c_0.c$36$2$2 ==.
- 508 ; demo_c_0.c:36: some_variable-=22;
- 00AF E5 08 509 mov a,_some_variable
- 00B1 24 EA 510 add a,#0xea
- 00B3 F5 08 511 mov _some_variable,a
- 00B5 E5 09 512 mov a,(_some_variable + 1)
- 00B7 34 FF 513 addc a,#0xff
- 00B9 F5 09 514 mov (_some_variable + 1),a
- 00BB E5 0A 515 mov a,(_some_variable + 2)
- 00BD 34 FF 516 addc a,#0xff
- 00BF F5 0A 517 mov (_some_variable + 2),a
- 00C1 E5 0B 518 mov a,(_some_variable + 3)
- 00C3 34 FF 519 addc a,#0xff
- 00C5 F5 0B 520 mov (_some_variable + 3),a
- 005A 521 C$demo_c_0.c$40$1$1 ==.
- 522 ; demo_c_0.c:40: return 0;
- 005A 523 C$demo_c_0.c$41$1$1 ==.
- 005A 524 XG$main$0$0 ==.
- 00C7 80 AE 525 sjmp 00102$
- 526 .area CSEG (CODE)
- 527 .area CONST (CODE)
- 528 .area XINIT (CODE)
- 529 .area CABS (ABS,CODE)
diff --git a/demo/demo_c_0.sym b/demo/demo_c_0.sym
deleted file mode 100644
index 9d943ba..0000000
--- a/demo/demo_c_0.sym
+++ /dev/null
@@ -1,659 +0,0 @@
- ASxxxx Assembler V01.70 + NoICE + SDCC mods + Flat24 Feb-1999 (Intel 8051), page 1.
-
-Symbol Table
-
- A 00D6
- D A$demo_c_0$385 0000 GR
- 14 A$demo_c_0$402 0000 GR
- 14 A$demo_c_0$403 0001 GR
- 14 A$demo_c_0$404 0003 GR
- 14 A$demo_c_0$405 0005 GR
- 14 A$demo_c_0$406 0007 GR
- 15 A$demo_c_0$408 0000 GR
- D A$demo_c_0$415 0003 GR
- D A$demo_c_0$417 0006 GR
- 16 A$demo_c_0$442 0000 GR
- 16 A$demo_c_0$445 0002 GR
- 16 A$demo_c_0$448 0004 GR
- 16 A$demo_c_0$449 0006 GR
- 16 A$demo_c_0$450 0007 GR
- 16 A$demo_c_0$453 0009 GR
- 16 A$demo_c_0$470 000A GR
- 16 A$demo_c_0$471 000B GR
- 16 A$demo_c_0$472 000D GR
- 16 A$demo_c_0$474 000F GR
- 16 A$demo_c_0$475 0010 GR
- 16 A$demo_c_0$476 0012 GR
- 16 A$demo_c_0$477 0014 GR
- 16 A$demo_c_0$478 0016 GR
- 16 A$demo_c_0$479 0018 GR
- 16 A$demo_c_0$480 001A GR
- 16 A$demo_c_0$483 001C GR
- 16 A$demo_c_0$484 001E GR
- 16 A$demo_c_0$485 0020 GR
- 16 A$demo_c_0$486 0021 GR
- 16 A$demo_c_0$487 0023 GR
- 16 A$demo_c_0$490 0026 GR
- 16 A$demo_c_0$491 0028 GR
- 16 A$demo_c_0$492 0029 GR
- 16 A$demo_c_0$493 002C GR
- 16 A$demo_c_0$494 002E GR
- 16 A$demo_c_0$495 0031 GR
- 16 A$demo_c_0$496 0033 GR
- 16 A$demo_c_0$497 0036 GR
- 16 A$demo_c_0$501 0038 GR
- 16 A$demo_c_0$502 003A GR
- 16 A$demo_c_0$503 003B GR
- 16 A$demo_c_0$504 003E GR
- 16 A$demo_c_0$505 0040 GR
- 16 A$demo_c_0$509 0042 GR
- 16 A$demo_c_0$510 0044 GR
- 16 A$demo_c_0$511 0046 GR
- 16 A$demo_c_0$512 0048 GR
- 16 A$demo_c_0$513 004A GR
- 16 A$demo_c_0$514 004C GR
- 16 A$demo_c_0$515 004E GR
- 16 A$demo_c_0$516 0050 GR
- 16 A$demo_c_0$517 0052 GR
- 16 A$demo_c_0$518 0054 GR
- 16 A$demo_c_0$519 0056 GR
- 16 A$demo_c_0$520 0058 GR
- 16 A$demo_c_0$525 005A GR
- AC 00D6
- ACC 00E0
- ACC.0 00E0
- ACC.1 00E1
- ACC.2 00E2
- ACC.3 00E3
- ACC.4 00E4
- ACC.5 00E5
- ACC.6 00E6
- ACC.7 00E7
- B 00F0
- B.0 00F0
- B.1 00F1
- B.2 00F2
- B.3 00F3
- B.4 00F4
- B.5 00F5
- B.6 00F6
- B.7 00F7
- 14 C$demo_c_0.c$10$1$1 = 0000 GR
- 16 C$demo_c_0.c$20$0$0 = 0000 GR
- 16 C$demo_c_0.c$23$1$1 = 0002 GR
- 16 C$demo_c_0.c$24$1$1 = 0004 GR
- 16 C$demo_c_0.c$25$1$1 = 0009 GR
- 16 C$demo_c_0.c$28$1$1 = 000A GR
- 16 C$demo_c_0.c$31$1$1 = 000A GR
- 16 C$demo_c_0.c$32$2$2 = 0038 GR
- 16 C$demo_c_0.c$33$3$3 = 001C GR
- 16 C$demo_c_0.c$34$3$3 = 0026 GR
- 16 C$demo_c_0.c$36$2$2 = 0042 GR
- 16 C$demo_c_0.c$40$1$1 = 005A GR
- 16 C$demo_c_0.c$41$1$1 = 005A GR
- CPRL2 00C8
- CT2 00C9
- CY 00D7
- DPH 0083
- DPL 0082
- EA 00AF
- ES 00AC
- ET0 00A9
- ET1 00AB
- ET2 00AD
- EX0 00A8
- EX1 00AA
- EXEN2 00CB
- EXF2 00CE
- F0 00D5
- G$A$0$0 = 00E0 G
- G$AC$0$0 = 00D6 G
- G$ACC$0$0 = 00E0 G
- G$B$0$0 = 00F0 G
- G$CY$0$0 = 00D7 G
- G$DPH$0$0 = 0083 G
- G$DPL$0$0 = 0082 G
- G$EA$0$0 = 00AF G
- G$ES$0$0 = 00AC G
- G$ET0$0$0 = 00A9 G
- G$ET1$0$0 = 00AB G
- G$EX0$0$0 = 00A8 G
- G$EX1$0$0 = 00AA G
- G$F0$0$0 = 00D5 G
- G$FL$0$0 = 00D1 G
- G$IE$0$0 = 00A8 G
- G$IE0$0$0 = 0089 G
- G$IE1$0$0 = 008B G
- G$INT0$0$0 = 00B2 G
- G$INT1$0$0 = 00B3 G
- G$IP$0$0 = 00B8 G
- G$IT0$0$0 = 0088 G
- G$IT1$0$0 = 008A G
- G$OV$0$0 = 00D2 G
- G$P$0$0 = 00D0 G
- G$P0$0$0 = 0080 G
- G$P0_0$0$0 = 0080 G
- G$P0_1$0$0 = 0081 G
- G$P0_2$0$0 = 0082 G
- G$P0_3$0$0 = 0083 G
- G$P0_4$0$0 = 0084 G
- G$P0_5$0$0 = 0085 G
- G$P0_6$0$0 = 0086 G
- G$P0_7$0$0 = 0087 G
- G$P1$0$0 = 0090 G
- G$P1_0$0$0 = 0090 G
- G$P1_1$0$0 = 0091 G
- G$P1_2$0$0 = 0092 G
- G$P1_3$0$0 = 0093 G
- G$P1_4$0$0 = 0094 G
- G$P1_5$0$0 = 0095 G
- G$P1_6$0$0 = 0096 G
- G$P1_7$0$0 = 0097 G
- G$P2$0$0 = 00A0 G
- G$P2_0$0$0 = 00A0 G
- G$P2_1$0$0 = 00A1 G
- G$P2_2$0$0 = 00A2 G
- G$P2_3$0$0 = 00A3 G
- G$P2_4$0$0 = 00A4 G
- G$P2_5$0$0 = 00A5 G
- G$P2_6$0$0 = 00A6 G
- G$P2_7$0$0 = 00A7 G
- G$P3$0$0 = 00B0 G
- G$P3_0$0$0 = 00B0 G
- G$P3_1$0$0 = 00B1 G
- G$P3_2$0$0 = 00B2 G
- G$P3_3$0$0 = 00B3 G
- G$P3_4$0$0 = 00B4 G
- G$P3_5$0$0 = 00B5 G
- G$P3_6$0$0 = 00B6 G
- G$P3_7$0$0 = 00B7 G
- G$PCON$0$0 = 0087 G
- G$PS$0$0 = 00BC G
- G$PSW$0$0 = 00D0 G
- G$PT0$0$0 = 00B9 G
- G$PT1$0$0 = 00BB G
- G$PX0$0$0 = 00B8 G
- G$PX1$0$0 = 00BA G
- G$RB8$0$0 = 009A G
- G$RD$0$0 = 00B7 G
- G$REN$0$0 = 009C G
- G$RI$0$0 = 0098 G
- G$RS0$0$0 = 00D3 G
- G$RS1$0$0 = 00D4 G
- G$RXD$0$0 = 00B0 G
- G$SBUF$0$0 = 0099 G
- G$SCON$0$0 = 0098 G
- G$SM0$0$0 = 009F G
- G$SM1$0$0 = 009E G
- G$SM2$0$0 = 009D G
- G$SP$0$0 = 0081 G
- G$T0$0$0 = 00B4 G
- G$T1$0$0 = 00B5 G
- G$TB8$0$0 = 009B G
- G$TCON$0$0 = 0088 G
- G$TF0$0$0 = 008D G
- G$TF1$0$0 = 008F G
- G$TH0$0$0 = 008C G
- G$TH1$0$0 = 008D G
- G$TI$0$0 = 0099 G
- G$TL0$0$0 = 008A G
- G$TL1$0$0 = 008B G
- G$TMOD$0$0 = 0089 G
- G$TR0$0$0 = 008C G
- G$TR1$0$0 = 008E G
- G$TXD$0$0 = 00B1 G
- G$WR$0$0 = 00B6 G
- 3 G$i$0$0 = 0004 GR
- 16 G$main$0$0 = 000A GR
- 16 G$someFunction$0$0 = 0000 GR
- 3 G$some_variable$0$0 = 0000 GR
- IE 00A8
- IE.0 00A8
- IE.1 00A9
- IE.2 00AA
- IE.3 00AB
- IE.4 00AC
- IE.5 00AD
- IE.7 00AF
- IE0 0089
- IE1 008B
- INT0 00B2
- INT1 00B3
- IP 00B8
- IP.0 00B8
- IP.1 00B9
- IP.2 00BA
- IP.3 00BB
- IP.4 00BC
- IP.5 00BD
- IT0 0088
- IT1 008A
- OV 00D2
- P 00D0
- P0 0080
- P0.0 0080
- P0.1 0081
- P0.2 0082
- P0.3 0083
- P0.4 0084
- P0.5 0085
- P0.6 0086
- P0.7 0087
- P1 0090
- P1.0 0090
- P1.1 0091
- P1.2 0092
- P1.3 0093
- P1.4 0094
- P1.5 0095
- P1.6 0096
- P1.7 0097
- P2 00A0
- P2.0 00A0
- P2.1 00A1
- P2.2 00A2
- P2.3 00A3
- P2.4 00A4
- P2.5 00A5
- P2.6 00A6
- P2.7 00A7
- P3 00B0
- P3.0 00B0
- P3.1 00B1
- P3.2 00B2
- P3.3 00B3
- P3.4 00B4
- P3.5 00B5
- P3.6 00B6
- P3.7 00B7
- PCON 0087
- PS 00BC
- PSW 00D0
- PSW.0 00D0
- PSW.1 00D1
- PSW.2 00D2
- PSW.3 00D3
- PSW.4 00D4
- PSW.5 00D5
- PSW.6 00D6
- PSW.7 00D7
- PT0 00B9
- PT1 00BB
- PT2 00BD
- PX0 00B8
- PX1 00BA
- RB8 009A
- RCAP2H 00CB
- RCAP2L 00CA
- RCLK 00CD
- REN 009C
- RI 0098
- RS0 00D3
- RS1 00D4
- RXD 00B0
- SBUF 0099
- SCON 0098
- SCON.0 0098
- SCON.1 0099
- SCON.2 009A
- SCON.3 009B
- SCON.4 009C
- SCON.5 009D
- SCON.6 009E
- SCON.7 009F
- SM0 009F
- SM1 009E
- SM2 009D
- SP 0081
- T2CON 00C8
- T2CON.0 00C8
- T2CON.1 00C9
- T2CON.2 00CA
- T2CON.3 00CB
- T2CON.4 00CC
- T2CON.5 00CD
- T2CON.6 00CE
- T2CON.7 00CF
- TB8 009B
- TCLK 00CC
- TCON 0088
- TCON.0 0088
- TCON.1 0089
- TCON.2 008A
- TCON.3 008B
- TCON.4 008C
- TCON.5 008D
- TCON.6 008E
- TCON.7 008F
- TF0 008D
- TF1 008F
- TF2 00CF
- TH0 008C
- TH1 008D
- TH2 00CD
- TI 0099
- TL0 008A
- TL1 008B
- TL2 00CC
- TMOD 0089
- TR0 008C
- TR1 008E
- TR2 00CA
- TXD 00B1
- 16 XG$main$0$0 = 005A GR
- 16 XG$someFunction$0$0 = 0009 GR
- _A = 00E0 G
- _AC = 00D6 G
- _ACC = 00E0 G
- _B = 00F0 G
- _CY = 00D7 G
- _DPH = 0083 G
- _DPL = 0082 G
- _EA = 00AF G
- _ES = 00AC G
- _ET0 = 00A9 G
- _ET1 = 00AB G
- _EX0 = 00A8 G
- _EX1 = 00AA G
- _F0 = 00D5 G
- _FL = 00D1 G
- _IE = 00A8 G
- _IE0 = 0089 G
- _IE1 = 008B G
- _INT0 = 00B2 G
- _INT1 = 00B3 G
- _IP = 00B8 G
- _IT0 = 0088 G
- _IT1 = 008A G
- _OV = 00D2 G
- _P = 00D0 G
- _P0 = 0080 G
- _P0_0 = 0080 G
- _P0_1 = 0081 G
- _P0_2 = 0082 G
- _P0_3 = 0083 G
- _P0_4 = 0084 G
- _P0_5 = 0085 G
- _P0_6 = 0086 G
- _P0_7 = 0087 G
- _P1 = 0090 G
- _P1_0 = 0090 G
- _P1_1 = 0091 G
- _P1_2 = 0092 G
- _P1_3 = 0093 G
- _P1_4 = 0094 G
- _P1_5 = 0095 G
- _P1_6 = 0096 G
- _P1_7 = 0097 G
- _P2 = 00A0 G
- _P2_0 = 00A0 G
- _P2_1 = 00A1 G
- _P2_2 = 00A2 G
- _P2_3 = 00A3 G
- _P2_4 = 00A4 G
- _P2_5 = 00A5 G
- _P2_6 = 00A6 G
- _P2_7 = 00A7 G
- _P3 = 00B0 G
- _P3_0 = 00B0 G
- _P3_1 = 00B1 G
- _P3_2 = 00B2 G
- _P3_3 = 00B3 G
- _P3_4 = 00B4 G
- _P3_5 = 00B5 G
- _P3_6 = 00B6 G
- _P3_7 = 00B7 G
- _PCON = 0087 G
- _PS = 00BC G
- _PSW = 00D0 G
- _PT0 = 00B9 G
- _PT1 = 00BB G
- _PX0 = 00B8 G
- _PX1 = 00BA G
- _RB8 = 009A G
- _RD = 00B7 G
- _REN = 009C G
- _RI = 0098 G
- _RS0 = 00D3 G
- _RS1 = 00D4 G
- _RXD = 00B0 G
- _SBUF = 0099 G
- _SCON = 0098 G
- _SM0 = 009F G
- _SM1 = 009E G
- _SM2 = 009D G
- _SP = 0081 G
- _T0 = 00B4 G
- _T1 = 00B5 G
- _TB8 = 009B G
- _TCON = 0088 G
- _TF0 = 008D G
- _TF1 = 008F G
- _TH0 = 008C G
- _TH1 = 008D G
- _TI = 0099 G
- _TL0 = 008A G
- _TL1 = 008B G
- _TMOD = 0089 G
- _TR0 = 008C G
- _TR1 = 008E G
- _TXD = 00B1 G
- _WR = 00B6 G
- D __interrupt_vect 0000 R
- __mcs51_genRAMCLEAR **** GX
- __mcs51_genXINIT **** GX
- __mcs51_genXRAMCLEAR **** GX
- __sdcc_gsinit_startup **** GX
- D __sdcc_program_startup 0003 GR
- 5 __start__stack 0000 GR
- 3 _i 0004 GR
- 16 _main 000A GR
- 16 _someFunction 0000 GR
- 3 _some_variable 0000 GR
- a 00D6
- ac 00D6
- acc 00E0
- acc.0 00E0
- acc.1 00E1
- acc.2 00E2
- acc.3 00E3
- acc.4 00E4
- acc.5 00E5
- acc.6 00E6
- acc.7 00E7
- ar0 = 0000
- ar1 = 0001
- ar2 = 0002
- ar3 = 0003
- ar4 = 0004
- ar5 = 0005
- ar6 = 0006
- ar7 = 0007
- b 00F0
- b.0 00F0
- b.1 00F1
- b.2 00F2
- b.3 00F3
- b.4 00F4
- b.5 00F5
- b.6 00F6
- b.7 00F7
- cprl2 00C8
- ct2 00C9
- cy 00D7
- dph 0083
- dpl 0082
- ea 00AF
- es 00AC
- et0 00A9
- et1 00AB
- et2 00AD
- ex0 00A8
- ex1 00AA
- exen2 00CB
- exf2 00CE
- f0 00D5
- ie 00A8
- ie.0 00A8
- ie.1 00A9
- ie.2 00AA
- ie.3 00AB
- ie.4 00AC
- ie.5 00AD
- ie.7 00AF
- ie0 0089
- ie1 008B
- int0 00B2
- int1 00B3
- ip 00B8
- ip.0 00B8
- ip.1 00B9
- ip.2 00BA
- ip.3 00BB
- ip.4 00BC
- ip.5 00BD
- it0 0088
- it1 008A
- ov 00D2
- p 00D0
- p0 0080
- p0.0 0080
- p0.1 0081
- p0.2 0082
- p0.3 0083
- p0.4 0084
- p0.5 0085
- p0.6 0086
- p0.7 0087
- p1 0090
- p1.0 0090
- p1.1 0091
- p1.2 0092
- p1.3 0093
- p1.4 0094
- p1.5 0095
- p1.6 0096
- p1.7 0097
- p2 00A0
- p2.0 00A0
- p2.1 00A1
- p2.2 00A2
- p2.3 00A3
- p2.4 00A4
- p2.5 00A5
- p2.6 00A6
- p2.7 00A7
- p3 00B0
- p3.0 00B0
- p3.1 00B1
- p3.2 00B2
- p3.3 00B3
- p3.4 00B4
- p3.5 00B5
- p3.6 00B6
- p3.7 00B7
- pcon 0087
- ps 00BC
- psw 00D0
- psw.0 00D0
- psw.1 00D1
- psw.2 00D2
- psw.3 00D3
- psw.4 00D4
- psw.5 00D5
- psw.6 00D6
- psw.7 00D7
- pt0 00B9
- pt1 00BB
- pt2 00BD
- px0 00B8
- px1 00BA
- rb8 009A
- rcap2h 00CB
- rcap2l 00CA
- rclk 00CD
- ren 009C
- ri 0098
- rs0 00D3
- rs1 00D4
- rxd 00B0
- sbuf 0099
- scon 0098
- scon.0 0098
- scon.1 0099
- scon.2 009A
- scon.3 009B
- scon.4 009C
- scon.5 009D
- scon.6 009E
- scon.7 009F
- sm0 009F
- sm1 009E
- sm2 009D
- sp 0081
- t2con 00C8
- t2con.0 00C8
- t2con.1 00C9
- t2con.2 00CA
- t2con.3 00CB
- t2con.4 00CC
- t2con.5 00CD
- t2con.6 00CE
- t2con.7 00CF
- tb8 009B
- tclk 00CC
- tcon 0088
- tcon.0 0088
- tcon.1 0089
- tcon.2 008A
- tcon.3 008B
- tcon.4 008C
- tcon.5 008D
- tcon.6 008E
- tcon.7 008F
- tf0 008D
- tf1 008F
- tf2 00CF
- th0 008C
- th1 008D
- th2 00CD
- ti 0099
- tl0 008A
- tl1 008B
- tl2 00CC
- tmod 0089
- tr0 008C
- tr1 008E
- tr2 00CA
- txd 00B1
-
- ASxxxx Assembler V01.70 + NoICE + SDCC mods + Flat24 Feb-1999 (Intel 8051), page 2.
-
-Area Table
-
- 0 _CODE size 0 flags 0
- 1 RSEG size 0 flags 0
- 2 REG_BANK_0 size 8 flags 4
- 3 DSEG size 6 flags 0
- 4 OSEG size 0 flags 4
- 5 SSEG size 1 flags 0
- 6 ISEG size 0 flags 0
- 7 IABS size 0 flags 8
- 8 BSEG size 0 flags 80
- 9 PSEG size 0 flags 50
- A XSEG size 0 flags 40
- B XABS size 0 flags 48
- C XISEG size 0 flags 40
- D HOME size 8 flags 20
- E GSINIT0 size 0 flags 20
- F GSINIT1 size 0 flags 20
- 10 GSINIT2 size 0 flags 20
- 11 GSINIT3 size 0 flags 20
- 12 GSINIT4 size 0 flags 20
- 13 GSINIT5 size 0 flags 20
- 14 GSINIT size 9 flags 20
- 15 GSFINAL size 3 flags 20
- 16 CSEG size 5C flags 20
- 17 CONST size 0 flags 20
- 18 XINIT size 0 flags 20
- 19 CABS size 0 flags 28
diff --git a/demo/file.hex b/demo/file.hex
index b6d53b5..98475a7 100644
--- a/demo/file.hex
+++ b/demo/file.hex
@@ -1,2 +1,3 @@
-:0600000080FE33343334AE
-:00000001FF \ No newline at end of file
+:0200000080FE80
+:04002000333433340E
+:00000001FF
diff --git a/demo/file.lst b/demo/file.lst
index 5ca698c..dc76e40 100644
--- a/demo/file.lst
+++ b/demo/file.lst
@@ -1,5 +1,5 @@
demo3 demo - 3 32/13/1907 PAGE 6
- 1 ; MCU 8051 IDE - Demostration code
+ 1 ; MCU 8051 IDE - Demonstration code
2 ; Compiler directives
3
4
@@ -33,47 +33,51 @@ demo3 demo - 3 32/13/1907 PAGE 6
0038 30 d BIT 070Q ; Define inte
demo3 demo - 3 32/13/1907 PAGE 9
FFA5 31 e CODE 0FFA5h ; Define prog
-****WARNING: Exceeding code memory capacity: e = 65445
- FFF2 33 var SET (A * 44) MOD 9 - 14 ;
- 34
- 35 CSEG at 20h ; Select prog
- 36 x: DB '34' ; Store byte
- 37 y: DW 3334h ; Store word
- 38
- 39 DSEG at 5d ; Select inte
- 40 m: DS 1 ; Reserve byt
+ FFF2 32 var SET (A * 44) MOD 9 - 14 ;
+ 33
+ 34 CSEG at 20h ; Select prog
+0020 3334 35 x: DB '34' ; Store byte
+0022 3334 36 y: DW 3334h ; Store word
+ 37
+ 38 DSEG at 5d ; Select inte
+ 39 m: DS 1 ; Reserve byt
+ 40
demo3 demo - 3 32/13/1907 PAGE 10
- 41
- 42 xseg ; Select exte
- 43 n: DS 1 ; Reserve byt
- 44
- 45 ISEG ; Select indi
- 46 o: DS 1 ; Reserve byt
- 47
- 48 NOLIST ; Disable code listin
- 51 LIST ; Enable code listing
- 52
+ 41 xseg ; Select exte
+ 42 n: DS 1 ; Reserve byt
+ 43
+ 44 ISEG ; Select indi
+ 45 o: DS 1 ; Reserve byt
+ 46
+ 47 NOLIST ; Disable code listin
+ 50 LIST ; Enable code listing
+ 51
+ 52 mc macro label ; Define macr
demo3 demo - 3 32/13/1907 PAGE 11
- 53
- 54 +1 mc macro label ; Define macr
- 55 +1 sjmp main
- 56 IF 2 <> 2 OR 1 = 4
- 57 EXITM ; Exit macro
- 58 ENDIF
- 59 sjmp label
- 60 endm ; End of defi
- 61
- 62 main: ORG 0 ; Set segment
+ 53 IF 2 <> 2 OR 1 = 4
+ 54 EXITM ; Exit macro
+ 55 ENDIF
+ 56 sjmp label
+ 57 endm ; End of defi
+ 58
+ 59 CSEG ; <-- From now on, OR
+ 60 main: ORG 0 ; Set segment
+****WARNING: This ORG has lower value than the previous one
+ 61 IF 0 ; Begin conditional a
demo3 demo - 3 32/13/1907 PAGE 12
- 63 IF 0 ; Begin conditional a
+ 62 USING 2 ; Sel
+ 63 ELSE ; Alternative conditi
64 USING 2 ; Sel
- 65 ELSE ; Alternative conditi
- 66 USING 2 ; Sel
- 67 ENDIF ; End conditional ass
- 68
- 69 mc main ; Macro instu
- 70
- 71 END ; End of assembly lan
+ 65 ENDIF ; End conditional ass
+ 66
+ 67 +1 mc main ; Macro instr
+ 68 +1 IF 2 <> 2 OR
+ 69 +1 EXITM
+ 70 +1 ENDIF
+0000 80FE 71 +1 sjmp main
+ demo3 demo - 3 32/13/1907 PAGE 13
+ 72
+ 73 END ; End of assembly lan
ASSEMBLY COMPLETE, NO ERRORS FOUND, 1 WARNING
@@ -81,7 +85,7 @@ ASSEMBLY COMPLETE, NO ERRORS FOUND, 1 WARNING
demo3 demo - 3 32/13/1907 PAGE 2
ERROR SUMMARY:
-Line 31, WARNING: Exceeding code memory capacity: e = 65445
+Line 62, WARNING: This ORG has lower value than the previous one
demo3 demo - 3 32/13/1907 PAGE 3
@@ -89,6 +93,8 @@ Line 31, WARNING: Exceeding code memory capacity: e = 65445
demo3 demo - 3 32/13/1907 PAGE 4
SYMBOL TABLE:
+??MCU_8051_IDE . . . . . . . . . . . N NUMB 8051H NOT USED
+??VERSION. . . . . . . . . . . . . . N NUMB 0147H NOT USED
A. . . . . . . . . . . . . . . . . . N NUMB 0036H NOT USED
AC . . . . . . . . . . . . . . . . . B ADDR 00D6H NOT USED
ACC. . . . . . . . . . . . . . . . . D ADDR 00E0H NOT USED
@@ -155,9 +161,9 @@ D. . . . . . . . . . . . . . . . . . B ADDR 0038H NOT USED
DP0H . . . . . . . . . . . . . . . . D ADDR 0083H NOT USED
DP0L . . . . . . . . . . . . . . . . D ADDR 0082H NOT USED
DP1H . . . . . . . . . . . . . . . . D ADDR 0085H NOT USED
+ demo3 demo - 3 32/13/1907 PAGE 5
DP1L . . . . . . . . . . . . . . . . D ADDR 0084H NOT USED
DPH. . . . . . . . . . . . . . . . . D ADDR 0083H NOT USED
- demo3 demo - 3 32/13/1907 PAGE 5
DPL. . . . . . . . . . . . . . . . . D ADDR 0082H NOT USED
E. . . . . . . . . . . . . . . . . . C ADDR FFA5H NOT USED
EA . . . . . . . . . . . . . . . . . B ADDR 00AFH NOT USED
@@ -224,9 +230,9 @@ PT2. . . . . . . . . . . . . . . . . B ADDR 00BDH NOT USED
PT2L . . . . . . . . . . . . . . . . B ADDR 00BDH NOT USED
PX0. . . . . . . . . . . . . . . . . B ADDR 00B8H NOT USED
PX0L . . . . . . . . . . . . . . . . B ADDR 00B8H NOT USED
+ demo3 demo - 3 32/13/1907 PAGE 6
PX1. . . . . . . . . . . . . . . . . B ADDR 00BAH NOT USED
PX1L . . . . . . . . . . . . . . . . B ADDR 00BAH NOT USED
- demo3 demo - 3 32/13/1907 PAGE 6
R. . . . . . . . . . . . . . . . . . B ADDR 0000H NOT USED
RB8. . . . . . . . . . . . . . . . . B ADDR 009AH NOT USED
RCAP2H . . . . . . . . . . . . . . . D ADDR 00CBH NOT USED
@@ -288,5 +294,5 @@ WDTCON . . . . . . . . . . . . . . . D ADDR 00A7H NOT USED
WDTPRG . . . . . . . . . . . . . . . D ADDR 00A7H NOT USED
WDTRST . . . . . . . . . . . . . . . D ADDR 00A6H NOT USED
WR . . . . . . . . . . . . . . . . . B ADDR 00B6H NOT USED
-X. . . . . . . . . . . . . . . . . . C ADDR 0002H NOT USED
-Y. . . . . . . . . . . . . . . . . . C ADDR 0004H NOT USED \ No newline at end of file
+X. . . . . . . . . . . . . . . . . . C ADDR 0020H NOT USED
+Y. . . . . . . . . . . . . . . . . . C ADDR 0022H NOT USED \ No newline at end of file
diff --git a/demo/keypad_display b/demo/keypad_display
deleted file mode 100644
index 4bea3f5..0000000
--- a/demo/keypad_display
+++ /dev/null
Binary files differ
diff --git a/demo/keypad_display.adb b/demo/keypad_display.adb
deleted file mode 100644
index ff7f769..0000000
--- a/demo/keypad_display.adb
+++ /dev/null
@@ -1,106 +0,0 @@
-M:keypad_display
-F:G$main$0$0({2}DF,SI:S),C,0,0,0,0,0
-S:G$state$0$0({1}SC:S),E,0,0
-S:G$row$0$0({2}SI:S),E,0,0
-S:G$P0$0$0({1}SC:U),I,0,0
-S:G$SP$0$0({1}SC:U),I,0,0
-S:G$DPL$0$0({1}SC:U),I,0,0
-S:G$DPH$0$0({1}SC:U),I,0,0
-S:G$PCON$0$0({1}SC:U),I,0,0
-S:G$TCON$0$0({1}SC:U),I,0,0
-S:G$TMOD$0$0({1}SC:U),I,0,0
-S:G$TL0$0$0({1}SC:U),I,0,0
-S:G$TL1$0$0({1}SC:U),I,0,0
-S:G$TH0$0$0({1}SC:U),I,0,0
-S:G$TH1$0$0({1}SC:U),I,0,0
-S:G$P1$0$0({1}SC:U),I,0,0
-S:G$SCON$0$0({1}SC:U),I,0,0
-S:G$SBUF$0$0({1}SC:U),I,0,0
-S:G$P2$0$0({1}SC:U),I,0,0
-S:G$IE$0$0({1}SC:U),I,0,0
-S:G$P3$0$0({1}SC:U),I,0,0
-S:G$IP$0$0({1}SC:U),I,0,0
-S:G$PSW$0$0({1}SC:U),I,0,0
-S:G$ACC$0$0({1}SC:U),I,0,0
-S:G$B$0$0({1}SC:U),I,0,0
-S:G$P0_0$0$0({1}SX:U),J,0,0
-S:G$P0_1$0$0({1}SX:U),J,0,0
-S:G$P0_2$0$0({1}SX:U),J,0,0
-S:G$P0_3$0$0({1}SX:U),J,0,0
-S:G$P0_4$0$0({1}SX:U),J,0,0
-S:G$P0_5$0$0({1}SX:U),J,0,0
-S:G$P0_6$0$0({1}SX:U),J,0,0
-S:G$P0_7$0$0({1}SX:U),J,0,0
-S:G$IT0$0$0({1}SX:U),J,0,0
-S:G$IE0$0$0({1}SX:U),J,0,0
-S:G$IT1$0$0({1}SX:U),J,0,0
-S:G$IE1$0$0({1}SX:U),J,0,0
-S:G$TR0$0$0({1}SX:U),J,0,0
-S:G$TF0$0$0({1}SX:U),J,0,0
-S:G$TR1$0$0({1}SX:U),J,0,0
-S:G$TF1$0$0({1}SX:U),J,0,0
-S:G$P1_0$0$0({1}SX:U),J,0,0
-S:G$P1_1$0$0({1}SX:U),J,0,0
-S:G$P1_2$0$0({1}SX:U),J,0,0
-S:G$P1_3$0$0({1}SX:U),J,0,0
-S:G$P1_4$0$0({1}SX:U),J,0,0
-S:G$P1_5$0$0({1}SX:U),J,0,0
-S:G$P1_6$0$0({1}SX:U),J,0,0
-S:G$P1_7$0$0({1}SX:U),J,0,0
-S:G$RI$0$0({1}SX:U),J,0,0
-S:G$TI$0$0({1}SX:U),J,0,0
-S:G$RB8$0$0({1}SX:U),J,0,0
-S:G$TB8$0$0({1}SX:U),J,0,0
-S:G$REN$0$0({1}SX:U),J,0,0
-S:G$SM2$0$0({1}SX:U),J,0,0
-S:G$SM1$0$0({1}SX:U),J,0,0
-S:G$SM0$0$0({1}SX:U),J,0,0
-S:G$P2_0$0$0({1}SX:U),J,0,0
-S:G$P2_1$0$0({1}SX:U),J,0,0
-S:G$P2_2$0$0({1}SX:U),J,0,0
-S:G$P2_3$0$0({1}SX:U),J,0,0
-S:G$P2_4$0$0({1}SX:U),J,0,0
-S:G$P2_5$0$0({1}SX:U),J,0,0
-S:G$P2_6$0$0({1}SX:U),J,0,0
-S:G$P2_7$0$0({1}SX:U),J,0,0
-S:G$EX0$0$0({1}SX:U),J,0,0
-S:G$ET0$0$0({1}SX:U),J,0,0
-S:G$EX1$0$0({1}SX:U),J,0,0
-S:G$ET1$0$0({1}SX:U),J,0,0
-S:G$ES$0$0({1}SX:U),J,0,0
-S:G$EA$0$0({1}SX:U),J,0,0
-S:G$P3_0$0$0({1}SX:U),J,0,0
-S:G$P3_1$0$0({1}SX:U),J,0,0
-S:G$P3_2$0$0({1}SX:U),J,0,0
-S:G$P3_3$0$0({1}SX:U),J,0,0
-S:G$P3_4$0$0({1}SX:U),J,0,0
-S:G$P3_5$0$0({1}SX:U),J,0,0
-S:G$P3_6$0$0({1}SX:U),J,0,0
-S:G$P3_7$0$0({1}SX:U),J,0,0
-S:G$RXD$0$0({1}SX:U),J,0,0
-S:G$TXD$0$0({1}SX:U),J,0,0
-S:G$INT0$0$0({1}SX:U),J,0,0
-S:G$INT1$0$0({1}SX:U),J,0,0
-S:G$T0$0$0({1}SX:U),J,0,0
-S:G$T1$0$0({1}SX:U),J,0,0
-S:G$WR$0$0({1}SX:U),J,0,0
-S:G$RD$0$0({1}SX:U),J,0,0
-S:G$PX0$0$0({1}SX:U),J,0,0
-S:G$PT0$0$0({1}SX:U),J,0,0
-S:G$PX1$0$0({1}SX:U),J,0,0
-S:G$PT1$0$0({1}SX:U),J,0,0
-S:G$PS$0$0({1}SX:U),J,0,0
-S:G$P$0$0({1}SX:U),J,0,0
-S:G$F1$0$0({1}SX:U),J,0,0
-S:G$OV$0$0({1}SX:U),J,0,0
-S:G$RS0$0$0({1}SX:U),J,0,0
-S:G$RS1$0$0({1}SX:U),J,0,0
-S:G$F0$0$0({1}SX:U),J,0,0
-S:G$AC$0$0({1}SX:U),J,0,0
-S:G$CY$0$0({1}SX:U),J,0,0
-S:G$main$0$0({2}DF,SI:S),C,0,0
-S:Fkeypad_display$keypad$0$0({4}DA4,SC:S),D,0,0
-S:Fkeypad_display$display_0$0$0({4}DA4,SC:S),D,0,0
-S:Fkeypad_display$display_1$0$0({4}DA4,SC:S),D,0,0
-S:Fkeypad_display$display_2$0$0({4}DA4,SC:S),D,0,0
-S:Fkeypad_display$display_3$0$0({4}DA4,SC:S),D,0,0
diff --git a/demo/keypad_display.asm b/demo/keypad_display.asm
deleted file mode 100644
index a216cbe..0000000
--- a/demo/keypad_display.asm
+++ /dev/null
@@ -1,624 +0,0 @@
-;--------------------------------------------------------
-; File Created by SDCC : free open source ANSI-C Compiler
-; Version 2.9.0 #5416 (Oct 6 2009) (UNIX)
-; This file was generated Tue Oct 27 23:03:55 2009
-;--------------------------------------------------------
- .module keypad_display
- .optsdcc -mmcs51 --model-small
-
-;--------------------------------------------------------
-; Public variables in this module
-;--------------------------------------------------------
- .globl _main
- .globl _CY
- .globl _AC
- .globl _F0
- .globl _RS1
- .globl _RS0
- .globl _OV
- .globl _F1
- .globl _P
- .globl _PS
- .globl _PT1
- .globl _PX1
- .globl _PT0
- .globl _PX0
- .globl _RD
- .globl _WR
- .globl _T1
- .globl _T0
- .globl _INT1
- .globl _INT0
- .globl _TXD
- .globl _RXD
- .globl _P3_7
- .globl _P3_6
- .globl _P3_5
- .globl _P3_4
- .globl _P3_3
- .globl _P3_2
- .globl _P3_1
- .globl _P3_0
- .globl _EA
- .globl _ES
- .globl _ET1
- .globl _EX1
- .globl _ET0
- .globl _EX0
- .globl _P2_7
- .globl _P2_6
- .globl _P2_5
- .globl _P2_4
- .globl _P2_3
- .globl _P2_2
- .globl _P2_1
- .globl _P2_0
- .globl _SM0
- .globl _SM1
- .globl _SM2
- .globl _REN
- .globl _TB8
- .globl _RB8
- .globl _TI
- .globl _RI
- .globl _P1_7
- .globl _P1_6
- .globl _P1_5
- .globl _P1_4
- .globl _P1_3
- .globl _P1_2
- .globl _P1_1
- .globl _P1_0
- .globl _TF1
- .globl _TR1
- .globl _TF0
- .globl _TR0
- .globl _IE1
- .globl _IT1
- .globl _IE0
- .globl _IT0
- .globl _P0_7
- .globl _P0_6
- .globl _P0_5
- .globl _P0_4
- .globl _P0_3
- .globl _P0_2
- .globl _P0_1
- .globl _P0_0
- .globl _B
- .globl _ACC
- .globl _PSW
- .globl _IP
- .globl _P3
- .globl _IE
- .globl _P2
- .globl _SBUF
- .globl _SCON
- .globl _P1
- .globl _TH1
- .globl _TH0
- .globl _TL1
- .globl _TL0
- .globl _TMOD
- .globl _TCON
- .globl _PCON
- .globl _DPH
- .globl _DPL
- .globl _SP
- .globl _P0
- .globl _row
- .globl _state
-;--------------------------------------------------------
-; special function registers
-;--------------------------------------------------------
- .area RSEG (DATA)
-G$P0$0$0 == 0x0080
-_P0 = 0x0080
-G$SP$0$0 == 0x0081
-_SP = 0x0081
-G$DPL$0$0 == 0x0082
-_DPL = 0x0082
-G$DPH$0$0 == 0x0083
-_DPH = 0x0083
-G$PCON$0$0 == 0x0087
-_PCON = 0x0087
-G$TCON$0$0 == 0x0088
-_TCON = 0x0088
-G$TMOD$0$0 == 0x0089
-_TMOD = 0x0089
-G$TL0$0$0 == 0x008a
-_TL0 = 0x008a
-G$TL1$0$0 == 0x008b
-_TL1 = 0x008b
-G$TH0$0$0 == 0x008c
-_TH0 = 0x008c
-G$TH1$0$0 == 0x008d
-_TH1 = 0x008d
-G$P1$0$0 == 0x0090
-_P1 = 0x0090
-G$SCON$0$0 == 0x0098
-_SCON = 0x0098
-G$SBUF$0$0 == 0x0099
-_SBUF = 0x0099
-G$P2$0$0 == 0x00a0
-_P2 = 0x00a0
-G$IE$0$0 == 0x00a8
-_IE = 0x00a8
-G$P3$0$0 == 0x00b0
-_P3 = 0x00b0
-G$IP$0$0 == 0x00b8
-_IP = 0x00b8
-G$PSW$0$0 == 0x00d0
-_PSW = 0x00d0
-G$ACC$0$0 == 0x00e0
-_ACC = 0x00e0
-G$B$0$0 == 0x00f0
-_B = 0x00f0
-;--------------------------------------------------------
-; special function bits
-;--------------------------------------------------------
- .area RSEG (DATA)
-G$P0_0$0$0 == 0x0080
-_P0_0 = 0x0080
-G$P0_1$0$0 == 0x0081
-_P0_1 = 0x0081
-G$P0_2$0$0 == 0x0082
-_P0_2 = 0x0082
-G$P0_3$0$0 == 0x0083
-_P0_3 = 0x0083
-G$P0_4$0$0 == 0x0084
-_P0_4 = 0x0084
-G$P0_5$0$0 == 0x0085
-_P0_5 = 0x0085
-G$P0_6$0$0 == 0x0086
-_P0_6 = 0x0086
-G$P0_7$0$0 == 0x0087
-_P0_7 = 0x0087
-G$IT0$0$0 == 0x0088
-_IT0 = 0x0088
-G$IE0$0$0 == 0x0089
-_IE0 = 0x0089
-G$IT1$0$0 == 0x008a
-_IT1 = 0x008a
-G$IE1$0$0 == 0x008b
-_IE1 = 0x008b
-G$TR0$0$0 == 0x008c
-_TR0 = 0x008c
-G$TF0$0$0 == 0x008d
-_TF0 = 0x008d
-G$TR1$0$0 == 0x008e
-_TR1 = 0x008e
-G$TF1$0$0 == 0x008f
-_TF1 = 0x008f
-G$P1_0$0$0 == 0x0090
-_P1_0 = 0x0090
-G$P1_1$0$0 == 0x0091
-_P1_1 = 0x0091
-G$P1_2$0$0 == 0x0092
-_P1_2 = 0x0092
-G$P1_3$0$0 == 0x0093
-_P1_3 = 0x0093
-G$P1_4$0$0 == 0x0094
-_P1_4 = 0x0094
-G$P1_5$0$0 == 0x0095
-_P1_5 = 0x0095
-G$P1_6$0$0 == 0x0096
-_P1_6 = 0x0096
-G$P1_7$0$0 == 0x0097
-_P1_7 = 0x0097
-G$RI$0$0 == 0x0098
-_RI = 0x0098
-G$TI$0$0 == 0x0099
-_TI = 0x0099
-G$RB8$0$0 == 0x009a
-_RB8 = 0x009a
-G$TB8$0$0 == 0x009b
-_TB8 = 0x009b
-G$REN$0$0 == 0x009c
-_REN = 0x009c
-G$SM2$0$0 == 0x009d
-_SM2 = 0x009d
-G$SM1$0$0 == 0x009e
-_SM1 = 0x009e
-G$SM0$0$0 == 0x009f
-_SM0 = 0x009f
-G$P2_0$0$0 == 0x00a0
-_P2_0 = 0x00a0
-G$P2_1$0$0 == 0x00a1
-_P2_1 = 0x00a1
-G$P2_2$0$0 == 0x00a2
-_P2_2 = 0x00a2
-G$P2_3$0$0 == 0x00a3
-_P2_3 = 0x00a3
-G$P2_4$0$0 == 0x00a4
-_P2_4 = 0x00a4
-G$P2_5$0$0 == 0x00a5
-_P2_5 = 0x00a5
-G$P2_6$0$0 == 0x00a6
-_P2_6 = 0x00a6
-G$P2_7$0$0 == 0x00a7
-_P2_7 = 0x00a7
-G$EX0$0$0 == 0x00a8
-_EX0 = 0x00a8
-G$ET0$0$0 == 0x00a9
-_ET0 = 0x00a9
-G$EX1$0$0 == 0x00aa
-_EX1 = 0x00aa
-G$ET1$0$0 == 0x00ab
-_ET1 = 0x00ab
-G$ES$0$0 == 0x00ac
-_ES = 0x00ac
-G$EA$0$0 == 0x00af
-_EA = 0x00af
-G$P3_0$0$0 == 0x00b0
-_P3_0 = 0x00b0
-G$P3_1$0$0 == 0x00b1
-_P3_1 = 0x00b1
-G$P3_2$0$0 == 0x00b2
-_P3_2 = 0x00b2
-G$P3_3$0$0 == 0x00b3
-_P3_3 = 0x00b3
-G$P3_4$0$0 == 0x00b4
-_P3_4 = 0x00b4
-G$P3_5$0$0 == 0x00b5
-_P3_5 = 0x00b5
-G$P3_6$0$0 == 0x00b6
-_P3_6 = 0x00b6
-G$P3_7$0$0 == 0x00b7
-_P3_7 = 0x00b7
-G$RXD$0$0 == 0x00b0
-_RXD = 0x00b0
-G$TXD$0$0 == 0x00b1
-_TXD = 0x00b1
-G$INT0$0$0 == 0x00b2
-_INT0 = 0x00b2
-G$INT1$0$0 == 0x00b3
-_INT1 = 0x00b3
-G$T0$0$0 == 0x00b4
-_T0 = 0x00b4
-G$T1$0$0 == 0x00b5
-_T1 = 0x00b5
-G$WR$0$0 == 0x00b6
-_WR = 0x00b6
-G$RD$0$0 == 0x00b7
-_RD = 0x00b7
-G$PX0$0$0 == 0x00b8
-_PX0 = 0x00b8
-G$PT0$0$0 == 0x00b9
-_PT0 = 0x00b9
-G$PX1$0$0 == 0x00ba
-_PX1 = 0x00ba
-G$PT1$0$0 == 0x00bb
-_PT1 = 0x00bb
-G$PS$0$0 == 0x00bc
-_PS = 0x00bc
-G$P$0$0 == 0x00d0
-_P = 0x00d0
-G$F1$0$0 == 0x00d1
-_F1 = 0x00d1
-G$OV$0$0 == 0x00d2
-_OV = 0x00d2
-G$RS0$0$0 == 0x00d3
-_RS0 = 0x00d3
-G$RS1$0$0 == 0x00d4
-_RS1 = 0x00d4
-G$F0$0$0 == 0x00d5
-_F0 = 0x00d5
-G$AC$0$0 == 0x00d6
-_AC = 0x00d6
-G$CY$0$0 == 0x00d7
-_CY = 0x00d7
-;--------------------------------------------------------
-; overlayable register banks
-;--------------------------------------------------------
- .area REG_BANK_0 (REL,OVR,DATA)
- .ds 8
-;--------------------------------------------------------
-; internal ram data
-;--------------------------------------------------------
- .area DSEG (DATA)
-G$state$0$0==.
-_state::
- .ds 1
-G$row$0$0==.
-_row::
- .ds 2
-;--------------------------------------------------------
-; overlayable items in internal ram
-;--------------------------------------------------------
- .area OSEG (OVR,DATA)
-;--------------------------------------------------------
-; Stack segment in internal ram
-;--------------------------------------------------------
- .area SSEG (DATA)
-__start__stack:
- .ds 1
-
-;--------------------------------------------------------
-; indirectly addressable internal ram data
-;--------------------------------------------------------
- .area ISEG (DATA)
-;--------------------------------------------------------
-; absolute internal ram data
-;--------------------------------------------------------
- .area IABS (ABS,DATA)
- .area IABS (ABS,DATA)
-;--------------------------------------------------------
-; bit data
-;--------------------------------------------------------
- .area BSEG (BIT)
-;--------------------------------------------------------
-; paged external ram data
-;--------------------------------------------------------
- .area PSEG (PAG,XDATA)
-;--------------------------------------------------------
-; external ram data
-;--------------------------------------------------------
- .area XSEG (XDATA)
-;--------------------------------------------------------
-; absolute external ram data
-;--------------------------------------------------------
- .area XABS (ABS,XDATA)
-;--------------------------------------------------------
-; external initialized ram data
-;--------------------------------------------------------
- .area XISEG (XDATA)
- .area HOME (CODE)
- .area GSINIT0 (CODE)
- .area GSINIT1 (CODE)
- .area GSINIT2 (CODE)
- .area GSINIT3 (CODE)
- .area GSINIT4 (CODE)
- .area GSINIT5 (CODE)
- .area GSINIT (CODE)
- .area GSFINAL (CODE)
- .area CSEG (CODE)
-;--------------------------------------------------------
-; interrupt vector
-;--------------------------------------------------------
- .area HOME (CODE)
-__interrupt_vect:
- ljmp __sdcc_gsinit_startup
-;--------------------------------------------------------
-; global & static initialisations
-;--------------------------------------------------------
- .area HOME (CODE)
- .area GSINIT (CODE)
- .area GSFINAL (CODE)
- .area GSINIT (CODE)
- .globl __sdcc_gsinit_startup
- .globl __sdcc_program_startup
- .globl __start__stack
- .globl __mcs51_genXINIT
- .globl __mcs51_genXRAMCLEAR
- .globl __mcs51_genRAMCLEAR
- .area GSFINAL (CODE)
- ljmp __sdcc_program_startup
-;--------------------------------------------------------
-; Home
-;--------------------------------------------------------
- .area HOME (CODE)
- .area HOME (CODE)
-__sdcc_program_startup:
- lcall _main
-; return from main will lock up
- sjmp .
-;--------------------------------------------------------
-; code
-;--------------------------------------------------------
- .area CSEG (CODE)
-;------------------------------------------------------------
-;Allocation info for local variables in function 'main'
-;------------------------------------------------------------
-;------------------------------------------------------------
- G$main$0$0 ==.
- C$keypad_display.c$38$0$0 ==.
-; keypad_display.c:38: int main()
-; -----------------------------------------
-; function main
-; -----------------------------------------
-_main:
- ar2 = 0x02
- ar3 = 0x03
- ar4 = 0x04
- ar5 = 0x05
- ar6 = 0x06
- ar7 = 0x07
- ar0 = 0x00
- ar1 = 0x01
- C$keypad_display.c$40$1$1 ==.
-; keypad_display.c:40: while(1) {
-00123$:
- C$keypad_display.c$41$2$2 ==.
-; keypad_display.c:41: for(row=0; row<4; row++) {
- clr a
- mov _row,a
- mov (_row + 1),a
-00118$:
- clr c
- mov a,_row
- subb a,#0x04
- mov a,(_row + 1)
- xrl a,#0x80
- subb a,#0x80
- jnc 00123$
- C$keypad_display.c$42$3$3 ==.
-; keypad_display.c:42: P1=keypad[row];
- mov a,_row
- add a,#_keypad
- mov dpl,a
- mov a,(_row + 1)
- addc a,#(_keypad >> 8)
- mov dph,a
- clr a
- movc a,@a+dptr
- mov _P1,a
- C$keypad_display.c$48$3$3 ==.
-; keypad_display.c:48: _endasm;
-
- mov _state, P1
-
- C$keypad_display.c$53$3$3 ==.
-; keypad_display.c:53: state&=0x0f;
- anl _state,#0x0F
- C$keypad_display.c$54$3$3 ==.
-; keypad_display.c:54: state^=0x0f;
- xrl _state,#0x0F
- C$keypad_display.c$56$3$3 ==.
-; keypad_display.c:56: if(state & 1) {
- mov a,_state
- jnb acc.0,00111$
- C$keypad_display.c$57$4$4 ==.
-; keypad_display.c:57: state=0;
- mov _state,#0x00
- sjmp 00112$
-00111$:
- C$keypad_display.c$58$3$3 ==.
-; keypad_display.c:58: } else if(state & 2) {
- mov a,_state
- jnb acc.1,00108$
- C$keypad_display.c$59$4$5 ==.
-; keypad_display.c:59: state=1;
- mov _state,#0x01
- sjmp 00112$
-00108$:
- C$keypad_display.c$60$3$3 ==.
-; keypad_display.c:60: } else if(state & 4) {
- mov a,_state
- jnb acc.2,00105$
- C$keypad_display.c$61$4$6 ==.
-; keypad_display.c:61: state=2;
- mov _state,#0x02
- sjmp 00112$
-00105$:
- C$keypad_display.c$62$3$3 ==.
-; keypad_display.c:62: } else if(state & 8) {
- mov a,_state
- jb acc.3,00142$
- ljmp 00120$
-00142$:
- C$keypad_display.c$63$4$7 ==.
-; keypad_display.c:63: state=3;
- mov _state,#0x03
- C$keypad_display.c$65$3$3 ==.
-; keypad_display.c:65: continue;
-00112$:
- C$keypad_display.c$68$3$3 ==.
-; keypad_display.c:68: switch(row) {
- clr a
- cjne a,_row,00143$
- clr a
- cjne a,(_row + 1),00143$
- sjmp 00113$
-00143$:
- mov a,#0x01
- cjne a,_row,00144$
- clr a
- cjne a,(_row + 1),00144$
- sjmp 00114$
-00144$:
- mov a,#0x02
- cjne a,_row,00145$
- clr a
- cjne a,(_row + 1),00145$
- sjmp 00115$
-00145$:
- mov a,#0x03
- cjne a,_row,00146$
- clr a
- cjne a,(_row + 1),00146$
- sjmp 00116$
-00146$:
- C$keypad_display.c$69$4$9 ==.
-; keypad_display.c:69: case 0:
- sjmp 00120$
-00113$:
- C$keypad_display.c$70$4$9 ==.
-; keypad_display.c:70: P3=display_0[state];
- mov a,_state
- mov dptr,#_display_0
- movc a,@a+dptr
- mov _P3,a
- C$keypad_display.c$71$4$9 ==.
-; keypad_display.c:71: break;
- C$keypad_display.c$72$4$9 ==.
-; keypad_display.c:72: case 1:
- sjmp 00120$
-00114$:
- C$keypad_display.c$73$4$9 ==.
-; keypad_display.c:73: P3=display_1[state];
- mov a,_state
- mov dptr,#_display_1
- movc a,@a+dptr
- mov _P3,a
- C$keypad_display.c$74$4$9 ==.
-; keypad_display.c:74: break;
- C$keypad_display.c$75$4$9 ==.
-; keypad_display.c:75: case 2:
- sjmp 00120$
-00115$:
- C$keypad_display.c$76$4$9 ==.
-; keypad_display.c:76: P3=display_2[state];
- mov a,_state
- mov dptr,#_display_2
- movc a,@a+dptr
- mov _P3,a
- C$keypad_display.c$77$4$9 ==.
-; keypad_display.c:77: break;
- C$keypad_display.c$78$4$9 ==.
-; keypad_display.c:78: case 3:
- sjmp 00120$
-00116$:
- C$keypad_display.c$79$4$9 ==.
-; keypad_display.c:79: P3=display_3[state];
- mov a,_state
- mov dptr,#_display_3
- movc a,@a+dptr
- mov _P3,a
- C$keypad_display.c$81$2$2 ==.
-; keypad_display.c:81: }
-00120$:
- C$keypad_display.c$41$2$2 ==.
-; keypad_display.c:41: for(row=0; row<4; row++) {
- inc _row
- clr a
- cjne a,_row,00147$
- inc (_row + 1)
-00147$:
- C$keypad_display.c$84$1$1 ==.
- XG$main$0$0 ==.
- ljmp 00118$
- .area CSEG (CODE)
- .area CONST (CODE)
-Fkeypad_display$keypad$0$0 == .
-_keypad:
- .db #0xEF
- .db #0xDF
- .db #0xBF
- .db #0x7F
-Fkeypad_display$display_0$0$0 == .
-_display_0:
- .db #0xF9
- .db #0x64
- .db #0x70
- .db #0x48
-Fkeypad_display$display_1$0$0 == .
-_display_1:
- .db #0x59
- .db #0x52
- .db #0x42
- .db #0x40
-Fkeypad_display$display_2$0$0 == .
-_display_2:
- .db #0xF8
- .db #0x40
- .db #0x50
- .db #0xC6
-Fkeypad_display$display_3$0$0 == .
-_display_3:
- .db #0x79
- .db #0xC0
- .db #0x49
- .db #0xC0
- .area XINIT (CODE)
- .area CABS (ABS,CODE)
diff --git a/demo/keypad_display.c b/demo/keypad_display.c
index e6cadf6..0601a74 100644
--- a/demo/keypad_display.c
+++ b/demo/keypad_display.c
@@ -8,7 +8,7 @@
*
* Notes:
* F9 - stop simulation
- * F2 - shutdown simulator
+ * F2 - shut down simulator
*
* @file keypad_display.c
*/
diff --git a/demo/keypad_display.hashes b/demo/keypad_display.hashes
index 55868bd..260da7a 100644
--- a/demo/keypad_display.hashes
+++ b/demo/keypad_display.hashes
@@ -1 +1 @@
-E44E4DC2094E8EB729FE653002B40A33 "keypad_display.c"
+250BC76DCCF444C4F982EB733E057F5E "keypad_display.c"
diff --git a/demo/keypad_display.hex b/demo/keypad_display.hex
deleted file mode 100644
index b62bfae..0000000
--- a/demo/keypad_display.hex
+++ /dev/null
@@ -1,49 +0,0 @@
-:03000000020008F3
-:0300610002000397
-:0500030012006480FE04
-:05006400E4F509F50AB6
-:0A006900C3E5099404E50A648094DD
-:0A0073008050EEE509241AF582E53D
-:0A007D000A3401F583E493F5908541
-:06008700900853080F630E
-:08008D00080FE50830E00575DD
-:040095000800801FC0
-:0A009900E50830E105750801801547
-:0A00A300E50830E205750802800B45
-:0800AD00E50820E30302010B4A
-:0300B500750803C8
-:0A00B800E4B50906E4B50A0280234E
-:0A00C2007401B50906E4B50A0280D6
-:0100CC002211
-:0A00CD007402B50906E4B50A0280CA
-:0100D7002107
-:0A00D8007403B50906E4B50A0280BE
-:0100E20020FD
-:0200E300802675
-:0A00E500E50890011E93F5B0801CA1
-:0A00EF00E50890012293F5B080129D
-:0A00F900E50890012693F5B0800899
-:08010300E50890012A93F5B014
-:07010B000509E4B509020536
-:010112000AE2
-:030113000200697E
-:04011A00EFDFBF7FD5
-:04011E00F9647048C8
-:0401220059524240AC
-:04012600F84050C687
-:04012A0079C049C08F
-:06003700E478FFF6D8FD9D
-:080015007900E94400601B7A48
-:05001D000090012E78A7
-:030022000075A0C6
-:0A00250000E493F2A308B8000205FE
-:08002F00A0D9F4DAF275A0FF7C
-:08003D007800E84400600A7934
-:030045000075A0A3
-:0600480000E4F309D8FCFE
-:08004E007800E84400600C7921
-:0B00560000900000E4F0A3D8FCD9FAF1
-:0300080075810AF5
-:0A000B00120116E5826003020003F3
-:0401160075820022CC
-:00000001FF
diff --git a/demo/keypad_display.lnk b/demo/keypad_display.lnk
deleted file mode 100644
index 9287b22..0000000
--- a/demo/keypad_display.lnk
+++ /dev/null
@@ -1,19 +0,0 @@
--myuxi
--Y
--a 0x0100
--v 0x0000
--w 0x0800
--z
--b HOME = 0x0000
--b ISEG = 0x0000
--b BSEG = 0x0000
--k /usr/libexec/sdcc/../share/sdcc/lib/small
--k /usr/share/sdcc/lib/small
--l mcs51
--l libsdcc
--l libint
--l liblong
--l libfloat
-keypad_display.rel
-
--e
diff --git a/demo/keypad_display.lst b/demo/keypad_display.lst
index 439d5d9..82a9049 100644
--- a/demo/keypad_display.lst
+++ b/demo/keypad_display.lst
@@ -1,7 +1,7 @@
1 ;--------------------------------------------------------
2 ; File Created by SDCC : free open source ANSI-C Compiler
- 3 ; Version 2.9.0 #5416 (Oct 6 2009) (UNIX)
- 4 ; This file was generated Tue Oct 27 23:03:55 2009
+ 3 ; Version 2.9.0 #5416 (Feb 3 2010) (UNIX)
+ 4 ; This file was generated Sun Dec 16 06:02:14 2012
5 ;--------------------------------------------------------
6 .module keypad_display
7 .optsdcc -mmcs51 --model-small
diff --git a/demo/keypad_display.map b/demo/keypad_display.map
deleted file mode 100644
index 276738d..0000000
--- a/demo/keypad_display.map
+++ /dev/null
@@ -1,536 +0,0 @@
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-CABS 0000 0000 = 0. bytes (ABS,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:FFFFFF00 s_BSEG
- 0C:0000 l_BIT_BANK
- 0C:0000 l_BSEG
- 0C:0000 l_BSEG_BYTES
- 0C:0000 l_CABS
- 0C:0000 l_GSINIT
- 0C:0000 l_GSINIT1
- 0C:0000 l_GSINIT5
- 0C:0000 l_IABS
- 0C:0000 l_ISEG
- 0C:0000 l_OSEG
- 0C:0000 l_PSEG
- 0C:0000 l_REG_BANK_1
- 0C:0000 l_REG_BANK_2
- 0C:0000 l_REG_BANK_3
- 0C:0000 l_RSEG
- 0C:0000 l_XABS
- 0C:0000 l_XINIT
- 0C:0000 l_XISEG
- 0C:0000 l_XSEG
- 0C:0000 l__CODE
- 0C:0000 s_BSEG_BYTES
- 0C:0000 s_CABS
- 0C:0000 s_DSEG
- 0C:0000 s_HOME
- 0C:0000 s_IABS
- 0C:0000 s_ISEG
- 0C:0000 s_PSEG
- 0C:0000 s_REG_BANK_0
- 0C:0000 s_XABS
- 0C:0000 s_XISEG
- 0C:0000 s_XSEG
- 0C:0003 l_GSFINAL
- 0C:0003 l_GSINIT0
- 0C:0008 l_HOME
- 0C:0008 l_REG_BANK_0
- 0C:0008 s_GSINIT0
- 0C:0008 s_REG_BANK_1
- 0C:000A l_GSINIT2
- 0C:000B s_GSINIT1
- 0C:000B s_GSINIT2
- 0C:000B s_RSEG
- 0C:000B s_SSEG
- 0C:0010 s_REG_BANK_2
- 0C:0014 l_CONST
- 0C:0015 s_GSINIT3
- 0C:0018 s_BIT_BANK
- 0C:0018 s_OSEG
- 0C:0018 s_REG_BANK_3
- 0C:0020 s__CODE
- 0C:0022 l_GSINIT3
- 0C:002A l_GSINIT4
- 0C:0037 s_GSINIT4
- 0C:0061 s_GSFINAL
- 0C:0061 s_GSINIT
- 0C:0061 s_GSINIT5
- 0C:0064 s_CSEG
- 0C:0080 l_DSEG
- 0C:00B6 l_CSEG
- 0C:00F5 l_SSEG
- 0C:0100 l_IRAM
- 0C:011A s_CONST
- 0C:012E s_XINIT
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-. .ABS. 0000 0000 = 0. bytes (ABS,CON)
-
- Value Global
- -------- --------------------------------
- 0080 G$P0$0$0
- 0080 G$P0_0$0$0
- 0080 _P0
- 0080 _P0_0
- 0081 G$P0_1$0$0
- 0081 G$SP$0$0
- 0081 _P0_1
- 0081 _SP
- 0082 G$DPL$0$0
- 0082 G$P0_2$0$0
- 0082 _DPL
- 0082 _P0_2
- 0083 G$DPH$0$0
- 0083 G$P0_3$0$0
- 0083 _DPH
- 0083 _P0_3
- 0084 G$P0_4$0$0
- 0084 _P0_4
- 0085 G$P0_5$0$0
- 0085 _P0_5
- 0086 G$P0_6$0$0
- 0086 _P0_6
- 0087 G$P0_7$0$0
- 0087 G$PCON$0$0
- 0087 _P0_7
- 0087 _PCON
- 0088 G$IT0$0$0
- 0088 G$TCON$0$0
- 0088 _IT0
- 0088 _TCON
- 0089 G$IE0$0$0
- 0089 G$TMOD$0$0
- 0089 _IE0
- 0089 _TMOD
- 008A G$IT1$0$0
- 008A G$TL0$0$0
- 008A _IT1
- 008A _TL0
- 008B G$IE1$0$0
- 008B G$TL1$0$0
- 008B _IE1
- 008B _TL1
- 008C G$TH0$0$0
- 008C G$TR0$0$0
- 008C _TH0
- 008C _TR0
- 008D G$TF0$0$0
- 008D G$TH1$0$0
- 008D _TF0
- 008D _TH1
- 008E G$TR1$0$0
- 008E _TR1
- 008F G$TF1$0$0
- 008F _TF1
- 0090 G$P1$0$0
- 0090 G$P1_0$0$0
- 0090 _P1
- 0090 _P1_0
- 0091 G$P1_1$0$0
- 0091 _P1_1
- 0092 G$P1_2$0$0
- 0092 _P1_2
- 0093 G$P1_3$0$0
- 0093 _P1_3
- 0094 G$P1_4$0$0
- 0094 _P1_4
- 0095 G$P1_5$0$0
- 0095 _P1_5
- 0096 G$P1_6$0$0
- 0096 _P1_6
- 0097 G$P1_7$0$0
- 0097 _P1_7
- 0098 G$RI$0$0
- 0098 G$SCON$0$0
- 0098 _RI
- 0098 _SCON
- 0099 G$SBUF$0$0
- 0099 G$TI$0$0
- 0099 _SBUF
- 0099 _TI
- 009A G$RB8$0$0
- 009A _RB8
- 009B G$TB8$0$0
- 009B _TB8
- 009C G$REN$0$0
- 009C _REN
- 009D G$SM2$0$0
- 009D _SM2
- 009E G$SM1$0$0
- 009E _SM1
- 009F G$SM0$0$0
- 009F _SM0
- 00A0 G$P2$0$0
- 00A0 G$P2_0$0$0
- 00A0 _P2
- 00A0 _P2_0
- 00A0 __XPAGE
- 00A1 G$P2_1$0$0
- 00A1 _P2_1
- 00A2 G$P2_2$0$0
- 00A2 _P2_2
- 00A3 G$P2_3$0$0
- 00A3 _P2_3
- 00A4 G$P2_4$0$0
- 00A4 _P2_4
- 00A5 G$P2_5$0$0
- 00A5 _P2_5
- 00A6 G$P2_6$0$0
- 00A6 _P2_6
- 00A7 G$P2_7$0$0
- 00A7 _P2_7
- 00A8 G$EX0$0$0
- 00A8 G$IE$0$0
- 00A8 _EX0
- 00A8 _IE
- 00A9 G$ET0$0$0
- 00A9 _ET0
- 00AA G$EX1$0$0
- 00AA _EX1
- 00AB G$ET1$0$0
- 00AB _ET1
- 00AC G$ES$0$0
- 00AC _ES
- 00AF G$EA$0$0
- 00AF _EA
- 00B0 G$P3$0$0
- 00B0 G$P3_0$0$0
- 00B0 G$RXD$0$0
- 00B0 _P3
- 00B0 _P3_0
- 00B0 _RXD
- 00B1 G$P3_1$0$0
- 00B1 G$TXD$0$0
- 00B1 _P3_1
- 00B1 _TXD
- 00B2 G$INT0$0$0
- 00B2 G$P3_2$0$0
- 00B2 _INT0
- 00B2 _P3_2
- 00B3 G$INT1$0$0
- 00B3 G$P3_3$0$0
- 00B3 _INT1
- 00B3 _P3_3
- 00B4 G$P3_4$0$0
- 00B4 G$T0$0$0
- 00B4 _P3_4
- 00B4 _T0
- 00B5 G$P3_5$0$0
- 00B5 G$T1$0$0
- 00B5 _P3_5
- 00B5 _T1
- 00B6 G$P3_6$0$0
- 00B6 G$WR$0$0
- 00B6 _P3_6
- 00B6 _WR
- 00B7 G$P3_7$0$0
- 00B7 G$RD$0$0
- 00B7 _P3_7
- 00B7 _RD
- 00B8 G$IP$0$0
- 00B8 G$PX0$0$0
- 00B8 _IP
- 00B8 _PX0
- 00B9 G$PT0$0$0
- 00B9 _PT0
- 00BA G$PX1$0$0
- 00BA _PX1
- 00BB G$PT1$0$0
- 00BB _PT1
- 00BC G$PS$0$0
- 00BC _PS
- 00D0 G$P$0$0
- 00D0 G$PSW$0$0
- 00D0 _P
- 00D0 _PSW
- 00D1 G$F1$0$0
- 00D1 _F1
- 00D2 G$OV$0$0
- 00D2 _OV
- 00D3 G$RS0$0$0
- 00D3 _RS0
- 00D4 G$RS1$0$0
- 00D4 _RS1
- 00D5 G$F0$0$0
- 00D5 _F0
- 00D6 G$AC$0$0
- 00D6 _AC
- 00D7 G$CY$0$0
- 00D7 _CY
- 00E0 G$ACC$0$0
- 00E0 _ACC
- 00F0 G$B$0$0
- 00F0 _B
-
-
-
-
-
-
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-DSEG 0000 0080 = 128. bytes (REL,CON)
-
- Value Global
- -------- --------------------------------
- 0008 G$state$0$0
- 0008 _state
- 0009 G$row$0$0
- 0009 _row
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-SSEG 000B 00F5 = 245. bytes (REL,OVR)
-
- Value Global
- -------- --------------------------------
- 000B __start__stack
-
-
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-HOME 0000 0008 = 8. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0000 A$keypad_display$381
- 0C:0003 A$keypad_display$403
- 0C:0003 __sdcc_program_startup
- 0C:0006 A$keypad_display$405
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSINIT0 0008 0003 = 3. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0008 __sdcc_gsinit_startup
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSINIT3 0015 0022 = 34. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0015 __mcs51_genXINIT
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSINIT4 0037 002A = 42. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0037 __mcs51_genRAMCLEAR
- 0C:003D __mcs51_genXRAMCLEAR
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSFINAL 0061 0003 = 3. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0061 A$keypad_display$396
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-CSEG 0064 00B6 = 182. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0064 A$keypad_display$434
- 0C:0064 C$keypad_display.c$38$0$0
- 0C:0064 C$keypad_display.c$40$1$1
- 0C:0064 G$main$0$0
- 0C:0064 _main
- 0C:0065 A$keypad_display$435
- 0C:0067 A$keypad_display$436
- 0C:0069 A$keypad_display$438
- 0C:006A A$keypad_display$439
- 0C:006C A$keypad_display$440
- 0C:006E A$keypad_display$441
- 0C:0070 A$keypad_display$442
- 0C:0072 A$keypad_display$443
- 0C:0074 A$keypad_display$444
- 0C:0076 A$keypad_display$447
- 0C:0076 C$keypad_display.c$42$3$3
- 0C:0078 A$keypad_display$448
- 0C:007A A$keypad_display$449
- 0C:007C A$keypad_display$450
- 0C:007E A$keypad_display$451
- 0C:0080 A$keypad_display$452
- 0C:0082 A$keypad_display$453
- 0C:0083 A$keypad_display$454
- 0C:0084 A$keypad_display$455
- 0C:0086 A$keypad_display$459
- 0C:0086 C$keypad_display.c$48$3$3
- 0C:0089 A$keypad_display$463
- 0C:0089 C$keypad_display.c$53$3$3
- 0C:008C A$keypad_display$466
- 0C:008C C$keypad_display.c$54$3$3
- 0C:008F A$keypad_display$469
- 0C:008F C$keypad_display.c$56$3$3
- 0C:0091 A$keypad_display$470
- 0C:0094 A$keypad_display$473
- 0C:0094 C$keypad_display.c$57$4$4
- 0C:0097 A$keypad_display$474
- 0C:0099 A$keypad_display$478
- 0C:0099 C$keypad_display.c$58$3$3
- 0C:009B A$keypad_display$479
- 0C:009E A$keypad_display$482
- 0C:009E C$keypad_display.c$59$4$5
- 0C:00A1 A$keypad_display$483
- 0C:00A3 A$keypad_display$487
- 0C:00A3 C$keypad_display.c$60$3$3
- 0C:00A5 A$keypad_display$488
- 0C:00A8 A$keypad_display$491
- 0C:00A8 C$keypad_display.c$61$4$6
- 0C:00AB A$keypad_display$492
- 0C:00AD A$keypad_display$496
- 0C:00AD C$keypad_display.c$62$3$3
- 0C:00AF A$keypad_display$497
- 0C:00B2 A$keypad_display$498
- 0C:00B5 A$keypad_display$502
- 0C:00B5 C$keypad_display.c$63$4$7
- 0C:00B8 A$keypad_display$508
- 0C:00B8 C$keypad_display.c$65$3$3
- 0C:00B8 C$keypad_display.c$68$3$3
- 0C:00B9 A$keypad_display$509
- 0C:00BC A$keypad_display$510
- 0C:00BD A$keypad_display$511
- 0C:00C0 A$keypad_display$512
- 0C:00C2 A$keypad_display$514
- 0C:00C4 A$keypad_display$515
- 0C:00C7 A$keypad_display$516
- 0C:00C8 A$keypad_display$517
- 0C:00CB A$keypad_display$518
- 0C:00CD A$keypad_display$520
- 0C:00CF A$keypad_display$521
- 0C:00D2 A$keypad_display$522
- 0C:00D3 A$keypad_display$523
- 0C:00D6 A$keypad_display$524
- 0C:00D8 A$keypad_display$526
- 0C:00DA A$keypad_display$527
- 0C:00DD A$keypad_display$528
- 0C:00DE A$keypad_display$529
- 0C:00E1 A$keypad_display$530
- 0C:00E3 A$keypad_display$534
- 0C:00E3 C$keypad_display.c$69$4$9
- 0C:00E5 A$keypad_display$538
- 0C:00E5 C$keypad_display.c$70$4$9
- 0C:00E7 A$keypad_display$539
- 0C:00EA A$keypad_display$540
- 0C:00EB A$keypad_display$541
- 0C:00ED A$keypad_display$546
- 0C:00ED C$keypad_display.c$71$4$9
- 0C:00ED C$keypad_display.c$72$4$9
- 0C:00EF A$keypad_display$550
- 0C:00EF C$keypad_display.c$73$4$9
- 0C:00F1 A$keypad_display$551
- 0C:00F4 A$keypad_display$552
- 0C:00F5 A$keypad_display$553
- 0C:00F7 A$keypad_display$558
- 0C:00F7 C$keypad_display.c$74$4$9
- 0C:00F7 C$keypad_display.c$75$4$9
- 0C:00F9 A$keypad_display$562
- 0C:00F9 C$keypad_display.c$76$4$9
- 0C:00FB A$keypad_display$563
- 0C:00FE A$keypad_display$564
- 0C:00FF A$keypad_display$565
- 0C:0101 A$keypad_display$570
- 0C:0101 C$keypad_display.c$77$4$9
- 0C:0101 C$keypad_display.c$78$4$9
- 0C:0103 A$keypad_display$574
- 0C:0103 C$keypad_display.c$79$4$9
- 0C:0105 A$keypad_display$575
- 0C:0108 A$keypad_display$576
- 0C:0109 A$keypad_display$577
- 0C:010B A$keypad_display$583
- 0C:010B C$keypad_display.c$41$2$2
- 0C:010B C$keypad_display.c$81$2$2
- 0C:010D A$keypad_display$584
- 0C:010E A$keypad_display$585
- 0C:0111 A$keypad_display$586
- 0C:0113 A$keypad_display$590
- 0C:0113 C$keypad_display.c$84$1$1
- 0C:0113 XG$main$0$0
- 0C:0116 __sdcc_external_startup
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-CONST 011A 0014 = 20. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:011A Fkeypad_display$keypad$0$0
- 0C:011E Fkeypad_display$display_0$0$0
- 0C:0122 Fkeypad_display$display_1$0$0
- 0C:0126 Fkeypad_display$display_2$0$0
- 0C:012A Fkeypad_display$display_3$0$0
-
- ASxxxx Linker V01.75 + NoICE + SDCC Feb 1999, page 1.
-
-Files Linked [ module(s) ]
-
-keypad_display.rel
-
-Libraries Linked [ object file ]
-
-/usr/share/sdcc/lib/small/mcs51.lib [ crtclear.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtxinit.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtxclear.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtpagesfr.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtstart.rel ]
-/usr/share/sdcc/lib/small/libsdcc.lib [ _startup.rel ]
-
- ASxxxx Linker V01.75 + NoICE + SDCC Feb 1999, page 2.
-
-User Base Address Definitions
-
-HOME = 0x0000
-ISEG = 0x0000
-BSEG = 0x0000
-
- \ No newline at end of file
diff --git a/demo/keypad_display.mem b/demo/keypad_display.mem
deleted file mode 100644
index a205eff..0000000
--- a/demo/keypad_display.mem
+++ /dev/null
@@ -1,28 +0,0 @@
-Internal RAM layout:
- 0 1 2 3 4 5 6 7 8 9 A B C D E F
-0x00:|0|0|0|0|0|0|0|0|a|a|a|S|S|S|S|S|
-0x10:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x20:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x40:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x80:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x90:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xa0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xb0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xc0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xd0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xe0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xf0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute
-
-Stack starts at: 0x0b (sp set to 0x0a) with 245 bytes available.
-
-Other memory:
- Name Start End Size Max
- ---------------- -------- -------- -------- --------
- PAGED EXT. RAM 0 0
- EXTERNAL RAM 0 0
- ROM/EPROM/FLASH 0x0000 0x012d 302 2048
diff --git a/demo/keypad_display.rel b/demo/keypad_display.rel
deleted file mode 100644
index c4d3129..0000000
--- a/demo/keypad_display.rel
+++ /dev/null
@@ -1,490 +0,0 @@
-;!FILE keypad_display.asm
-XH
-H 1A areas 147 global symbols
-M keypad_display
-O -mmcs51 --model-small
-S G$EX0$0$0 Def00A8
-S G$IT0$0$0 Def0088
-S G$TH1$0$0 Def008D
-S _P1 Def0090
-S G$RXD$0$0 Def00B0
-S G$EX1$0$0 Def00AA
-S G$TB8$0$0 Def009B
-S G$IT1$0$0 Def008A
-S G$IE$0$0 Def00A8
-S _P2 Def00A0
-S _B Def00F0
-S _SP Def0081
-S _P3 Def00B0
-S _PS Def00BC
-S G$TXD$0$0 Def00B1
-S G$SM0$0$0 Def009F
-S G$TL0$0$0 Def008A
-S _T0 Def00B4
-S G$SM1$0$0 Def009E
-S G$TL1$0$0 Def008B
-S _T1 Def00B5
-S _OV Def00D2
-S G$SM2$0$0 Def009D
-S _ACC Def00E0
-S __mcs51_genRAMCLEAR Ref0000
-S G$PT0$0$0 Def00B9
-S G$RS0$0$0 Def00D3
-S G$PT1$0$0 Def00BB
-S _WR Def00B6
-S G$F0$0$0 Def00D5
-S G$RS1$0$0 Def00D4
-S G$RD$0$0 Def00B7
-S G$TR0$0$0 Def008C
-S G$F1$0$0 Def00D1
-S G$TR1$0$0 Def008E
-S G$PX0$0$0 Def00B8
-S G$ES$0$0 Def00AC
-S G$PX1$0$0 Def00BA
-S G$IP$0$0 Def00B8
-S G$PSW$0$0 Def00D0
-S G$RI$0$0 Def0098
-S _P0_0 Def0080
-S G$CY$0$0 Def00D7
-S _PCON Def0087
-S _SBUF Def0099
-S _P0_1 Def0081
-S _P1_0 Def0090
-S _P Def00D0
-S G$TI$0$0 Def0099
-S _P0_2 Def0082
-S _P1_1 Def0091
-S _P2_0 Def00A0
-S _P0_3 Def0083
-S _P1_2 Def0092
-S _P2_1 Def00A1
-S _P3_0 Def00B0
-S _SCON Def0098
-S _P0_4 Def0084
-S _P1_3 Def0093
-S _P2_2 Def00A2
-S _P3_1 Def00B1
-S G$P0$0$0 Def0080
-S _TCON Def0088
-S _TMOD Def0089
-S _P0_5 Def0085
-S _P1_4 Def0094
-S _P2_3 Def00A3
-S _P3_2 Def00B2
-S G$P1$0$0 Def0090
-S _P0_6 Def0086
-S _P1_5 Def0095
-S _P2_4 Def00A4
-S _P3_3 Def00B3
-S G$B$0$0 Def00F0
-S G$P2$0$0 Def00A0
-S _P0_7 Def0087
-S _P1_6 Def0096
-S _P2_5 Def00A5
-S _P3_4 Def00B4
-S G$PS$0$0 Def00BC
-S G$P3$0$0 Def00B0
-S G$SP$0$0 Def0081
-S _P1_7 Def0097
-S _P2_6 Def00A6
-S _P3_5 Def00B5
-S G$T0$0$0 Def00B4
-S _P2_7 Def00A7
-S _P3_6 Def00B6
-S G$OV$0$0 Def00D2
-S G$T1$0$0 Def00B5
-S _P3_7 Def00B7
-S G$ACC$0$0 Def00E0
-S _INT0 Def00B2
-S _DPH Def0083
-S _INT1 Def00B3
-S G$WR$0$0 Def00B6
-S _IE0 Def0089
-S _IE1 Def008B
-S _DPL Def0082
-S G$P0_0$0$0 Def0080
-S G$P$0$0 Def00D0
-S G$P1_0$0$0 Def0090
-S G$P0_1$0$0 Def0081
-S G$SBUF$0$0 Def0099
-S G$PCON$0$0 Def0087
-S _AC Def00D6
-S G$P2_0$0$0 Def00A0
-S G$P1_1$0$0 Def0091
-S G$P0_2$0$0 Def0082
-S _REN Def009C
-S G$P3_0$0$0 Def00B0
-S G$P2_1$0$0 Def00A1
-S G$P1_2$0$0 Def0092
-S G$P0_3$0$0 Def0083
-S _EA Def00AF
-S G$P3_1$0$0 Def00B1
-S G$P2_2$0$0 Def00A2
-S G$P1_3$0$0 Def0093
-S G$P0_4$0$0 Def0084
-S G$SCON$0$0 Def0098
-S G$P3_2$0$0 Def00B2
-S G$P2_3$0$0 Def00A3
-S G$P1_4$0$0 Def0094
-S G$P0_5$0$0 Def0085
-S G$TMOD$0$0 Def0089
-S G$TCON$0$0 Def0088
-S G$P3_3$0$0 Def00B3
-S G$P2_4$0$0 Def00A4
-S G$P1_5$0$0 Def0095
-S G$P0_6$0$0 Def0086
-S _ET0 Def00A9
-S G$P3_4$0$0 Def00B4
-S G$P2_5$0$0 Def00A5
-S G$P1_6$0$0 Def0096
-S G$P0_7$0$0 Def0087
-S _TF0 Def008D
-S _ET1 Def00AB
-S G$P3_5$0$0 Def00B5
-S G$P2_6$0$0 Def00A6
-S G$P1_7$0$0 Def0097
-S _TF1 Def008F
-S G$P3_6$0$0 Def00B6
-S G$P2_7$0$0 Def00A7
-S _TH0 Def008C
-S _RB8 Def009A
-S __mcs51_genXINIT Ref0000
-S G$P3_7$0$0 Def00B7
-S _TH1 Def008D
-S _IT0 Def0088
-S _EX0 Def00A8
-S _IE Def00A8
-S _IT1 Def008A
-S _TB8 Def009B
-S _EX1 Def00AA
-S _RXD Def00B0
-S G$INT0$0$0 Def00B2
-S G$INT1$0$0 Def00B3
-S G$DPH$0$0 Def0083
-S _TL0 Def008A
-S _SM0 Def009F
-S _TXD Def00B1
-S _TL1 Def008B
-S _SM1 Def009E
-S G$IE0$0$0 Def0089
-S _SM2 Def009D
-S G$IE1$0$0 Def008B
-S G$DPL$0$0 Def0082
-S _PT0 Def00B9
-S _PT1 Def00BB
-S _RS0 Def00D3
-S _TR0 Def008C
-S _RD Def00B7
-S _RS1 Def00D4
-S _F0 Def00D5
-S _TR1 Def008E
-S _F1 Def00D1
-S G$AC$0$0 Def00D6
-S _ES Def00AC
-S _PX0 Def00B8
-S G$REN$0$0 Def009C
-S _IP Def00B8
-S _PX1 Def00BA
-S G$EA$0$0 Def00AF
-S _PSW Def00D0
-S __sdcc_gsinit_startup Ref0000
-S _RI Def0098
-S _CY Def00D7
-S G$ET0$0$0 Def00A9
-S _TI Def0099
-S G$ET1$0$0 Def00AB
-S G$TF0$0$0 Def008D
-S G$TF1$0$0 Def008F
-S __mcs51_genXRAMCLEAR Ref0000
-S G$RB8$0$0 Def009A
-S G$TH0$0$0 Def008C
-S _P0 Def0080
-A _CODE size 0 flags 0 addr 0
-A RSEG size 0 flags 0 addr 0
-A REG_BANK_0 size 8 flags 4 addr 0
-A DSEG size 3 flags 0 addr 0
-S _state Def0000
-S G$row$0$0 Def0001
-S G$state$0$0 Def0000
-S _row Def0001
-A OSEG size 0 flags 4 addr 0
-A SSEG size 1 flags 0 addr 0
-S __start__stack Def0000
-A ISEG size 0 flags 0 addr 0
-A IABS size 0 flags 8 addr 0
-A BSEG size 0 flags 80 addr 0
-A PSEG size 0 flags 50 addr 0
-A XSEG size 0 flags 40 addr 0
-A XABS size 0 flags 48 addr 0
-A XISEG size 0 flags 40 addr 0
-A HOME size 8 flags 20 addr 0
-S A$keypad_display$403 Def0003
-S A$keypad_display$405 Def0006
-S A$keypad_display$381 Def0000
-S __sdcc_program_startup Def0003
-A GSINIT0 size 0 flags 20 addr 0
-A GSINIT1 size 0 flags 20 addr 0
-A GSINIT2 size 0 flags 20 addr 0
-A GSINIT3 size 0 flags 20 addr 0
-A GSINIT4 size 0 flags 20 addr 0
-A GSINIT5 size 0 flags 20 addr 0
-A GSINIT size 0 flags 20 addr 0
-A GSFINAL size 3 flags 20 addr 0
-S A$keypad_display$396 Def0000
-A CSEG size B2 flags 20 addr 0
-S _main Def0000
-S XG$main$0$0 Def00AF
-S A$keypad_display$510 Def0058
-S A$keypad_display$520 Def0069
-S A$keypad_display$511 Def0059
-S A$keypad_display$502 Def0051
-S A$keypad_display$530 Def007D
-S A$keypad_display$521 Def006B
-S A$keypad_display$512 Def005C
-S A$keypad_display$440 Def0008
-S A$keypad_display$540 Def0086
-S A$keypad_display$522 Def006E
-S A$keypad_display$450 Def0018
-S A$keypad_display$441 Def000A
-S A$keypad_display$550 Def008B
-S A$keypad_display$541 Def0087
-S A$keypad_display$523 Def006F
-S A$keypad_display$514 Def005E
-S A$keypad_display$451 Def001A
-S A$keypad_display$442 Def000C
-S A$keypad_display$551 Def008D
-S A$keypad_display$524 Def0072
-S A$keypad_display$515 Def0060
-S A$keypad_display$470 Def002D
-S A$keypad_display$452 Def001C
-S A$keypad_display$443 Def000E
-S A$keypad_display$434 Def0000
-S A$keypad_display$570 Def009D
-S A$keypad_display$552 Def0090
-S A$keypad_display$534 Def007F
-S A$keypad_display$516 Def0063
-S A$keypad_display$453 Def001E
-S A$keypad_display$444 Def0010
-S A$keypad_display$435 Def0001
-S G$main$0$0 Def0000
-S A$keypad_display$562 Def0095
-S A$keypad_display$553 Def0091
-S A$keypad_display$526 Def0074
-S A$keypad_display$517 Def0064
-S A$keypad_display$508 Def0054
-S A$keypad_display$463 Def0025
-S A$keypad_display$454 Def001F
-S A$keypad_display$436 Def0003
-S A$keypad_display$590 Def00AF
-S A$keypad_display$563 Def0097
-S A$keypad_display$527 Def0076
-S A$keypad_display$518 Def0067
-S A$keypad_display$509 Def0055
-S A$keypad_display$491 Def0044
-S A$keypad_display$482 Def003A
-S A$keypad_display$473 Def0030
-S A$keypad_display$455 Def0020
-S A$keypad_display$564 Def009A
-S A$keypad_display$546 Def0089
-S A$keypad_display$528 Def0079
-S A$keypad_display$492 Def0047
-S A$keypad_display$483 Def003D
-S A$keypad_display$474 Def0033
-S A$keypad_display$447 Def0012
-S A$keypad_display$438 Def0005
-S A$keypad_display$583 Def00A7
-S A$keypad_display$574 Def009F
-S A$keypad_display$565 Def009B
-S A$keypad_display$538 Def0081
-S A$keypad_display$529 Def007A
-S A$keypad_display$466 Def0028
-S A$keypad_display$448 Def0014
-S A$keypad_display$439 Def0006
-S A$keypad_display$584 Def00A9
-S A$keypad_display$575 Def00A1
-S A$keypad_display$539 Def0083
-S A$keypad_display$449 Def0016
-S C$keypad_display.c$40$1$1 Def0000
-S A$keypad_display$585 Def00AA
-S A$keypad_display$576 Def00A4
-S A$keypad_display$558 Def0093
-S A$keypad_display$459 Def0022
-S A$keypad_display$586 Def00AD
-S A$keypad_display$577 Def00A5
-S A$keypad_display$496 Def0049
-S A$keypad_display$487 Def003F
-S A$keypad_display$478 Def0035
-S A$keypad_display$469 Def002B
-S A$keypad_display$497 Def004B
-S A$keypad_display$488 Def0041
-S A$keypad_display$479 Def0037
-S C$keypad_display.c$41$2$2 Def00A7
-S A$keypad_display$498 Def004E
-S C$keypad_display.c$38$0$0 Def0000
-S C$keypad_display.c$60$3$3 Def003F
-S C$keypad_display.c$42$3$3 Def0012
-S C$keypad_display.c$81$2$2 Def00A7
-S C$keypad_display.c$84$1$1 Def00AF
-S C$keypad_display.c$62$3$3 Def0049
-S C$keypad_display.c$53$3$3 Def0025
-S C$keypad_display.c$54$3$3 Def0028
-S C$keypad_display.c$65$3$3 Def0054
-S C$keypad_display.c$61$4$6 Def0044
-S C$keypad_display.c$56$3$3 Def002B
-S C$keypad_display.c$48$3$3 Def0022
-S C$keypad_display.c$58$3$3 Def0035
-S C$keypad_display.c$70$4$9 Def0081
-S C$keypad_display.c$68$3$3 Def0054
-S C$keypad_display.c$63$4$7 Def0051
-S C$keypad_display.c$57$4$4 Def0030
-S C$keypad_display.c$71$4$9 Def0089
-S C$keypad_display.c$72$4$9 Def0089
-S C$keypad_display.c$73$4$9 Def008B
-S C$keypad_display.c$59$4$5 Def003A
-S C$keypad_display.c$74$4$9 Def0093
-S C$keypad_display.c$75$4$9 Def0093
-S C$keypad_display.c$76$4$9 Def0095
-S C$keypad_display.c$77$4$9 Def009D
-S C$keypad_display.c$78$4$9 Def009D
-S C$keypad_display.c$69$4$9 Def007F
-S C$keypad_display.c$79$4$9 Def009F
-A CONST size 14 flags 20 addr 0
-S Fkeypad_display$keypad$0$0 Def0000
-S Fkeypad_display$display_0$0$0 Def0004
-S Fkeypad_display$display_1$0$0 Def0008
-S Fkeypad_display$display_2$0$0 Def000C
-S Fkeypad_display$display_3$0$0 Def0010
-A XINIT size 0 flags 20 addr 0
-A CABS size 0 flags 28 addr 0
-T 00 00
-R 00 00 00 02
-T 00 00
-R 00 00 00 03
-T 00 00
-R 00 00 00 03
-T 00 01
-R 00 00 00 03
-T 00 01
-R 00 00 00 03
-T 00 00
-R 00 00 00 05
-T 00 00
-R 00 00 00 05
-T 00 00
-R 00 00 00 0D
-T 00 00 02 00 00
-R 00 00 00 0D 02 03 00 B8
-T 00 00 02 00 03
-R 00 00 00 15 00 03 00 0D
-T 00 03
-R 00 00 00 0D
-T 00 03 12 00 00 80 FE
-R 00 00 00 0D 00 03 00 16
-T 00 00
-R 00 00 00 16
-T 00 00
-R 00 00 00 16
-T 00 00 E4 F5 00 00 01 F5 00 00 02
-R 00 00 00 16 F1 21 04 00 03 F1 21 08 00 03
-T 00 05
-R 00 00 00 16
-T 00 05 C3 E5 00 00 01 94 04 E5 00 00 02 64 80 94
-R 00 00 00 16 F1 21 04 00 03 F1 21 0A 00 03
-T 00 0F 80 50 EE E5 00 00 01 24 00 00 00 F5 82 E5
-R 00 00 00 16 F1 21 06 00 03 F1 01 0A 00 17
-T 00 19 00 00 02 34 00 00 00 F5 83 E4 93 F5 90 85
-R 00 00 00 16 F1 21 02 00 03 F1 81 06 00 17
-T 00 23 90 00 00 00 53 00 00 00 0F 63
-R 00 00 00 16 F1 21 03 00 03 F1 01 07 00 03
-T 00 29 00 00 00 0F E5 00 00 00 30 E0 05 75
-R 00 00 00 16 F1 01 02 00 03 F1 21 07 00 03
-T 00 31 00 00 00 00 80 1F
-R 00 00 00 16 F1 21 02 00 03
-T 00 35
-R 00 00 00 16
-T 00 35 E5 00 00 00 30 E1 05 75 00 00 00 01 80 15
-R 00 00 00 16 F1 21 03 00 03 F1 21 0A 00 03
-T 00 3F
-R 00 00 00 16
-T 00 3F E5 00 00 00 30 E2 05 75 00 00 00 02 80 0B
-R 00 00 00 16 F1 21 03 00 03 F1 21 0A 00 03
-T 00 49
-R 00 00 00 16
-T 00 49 E5 00 00 00 20 E3 03 02 00 A7
-R 00 00 00 16 F1 21 03 00 03 00 0A 00 16
-T 00 51
-R 00 00 00 16
-T 00 51 75 00 00 00 03
-R 00 00 00 16 F1 21 03 00 03
-T 00 54
-R 00 00 00 16
-T 00 54 E4 B5 00 00 01 06 E4 B5 00 00 02 02 80 23
-R 00 00 00 16 F1 21 04 00 03 F1 21 0A 00 03
-T 00 5E
-R 00 00 00 16
-T 00 5E 74 01 B5 00 00 01 06 E4 B5 00 00 02 02 80
-R 00 00 00 16 F1 21 05 00 03 F1 21 0B 00 03
-T 00 68 22
-R 00 00 00 16
-T 00 69
-R 00 00 00 16
-T 00 69 74 02 B5 00 00 01 06 E4 B5 00 00 02 02 80
-R 00 00 00 16 F1 21 05 00 03 F1 21 0B 00 03
-T 00 73 21
-R 00 00 00 16
-T 00 74
-R 00 00 00 16
-T 00 74 74 03 B5 00 00 01 06 E4 B5 00 00 02 02 80
-R 00 00 00 16 F1 21 05 00 03 F1 21 0B 00 03
-T 00 7E 20
-R 00 00 00 16
-T 00 7F
-R 00 00 00 16
-T 00 7F 80 26
-R 00 00 00 16
-T 00 81
-R 00 00 00 16
-T 00 81 E5 00 00 00 90 00 04 93 F5 B0 80 1C
-R 00 00 00 16 F1 21 03 00 03 00 07 00 17
-T 00 8B
-R 00 00 00 16
-T 00 8B E5 00 00 00 90 00 08 93 F5 B0 80 12
-R 00 00 00 16 F1 21 03 00 03 00 07 00 17
-T 00 95
-R 00 00 00 16
-T 00 95 E5 00 00 00 90 00 0C 93 F5 B0 80 08
-R 00 00 00 16 F1 21 03 00 03 00 07 00 17
-T 00 9F
-R 00 00 00 16
-T 00 9F E5 00 00 00 90 00 10 93 F5 B0
-R 00 00 00 16 F1 21 03 00 03 00 07 00 17
-T 00 A7
-R 00 00 00 16
-T 00 A7 05 00 00 01 E4 B5 00 00 01 02 05
-R 00 00 00 16 F1 21 03 00 03 F1 21 08 00 03
-T 00 AE 00 00 02
-R 00 00 00 16 F1 21 02 00 03
-T 00 AF
-R 00 00 00 16
-T 00 AF 02 00 05
-R 00 00 00 16 00 03 00 16
-T 00 00
-R 00 00 00 17
-T 00 00 EF DF BF 7F
-R 00 00 00 17
-T 00 04
-R 00 00 00 17
-T 00 04 F9 64 70 48
-R 00 00 00 17
-T 00 08
-R 00 00 00 17
-T 00 08 59 52 42 40
-R 00 00 00 17
-T 00 0C
-R 00 00 00 17
-T 00 0C F8 40 50 C6
-R 00 00 00 17
-T 00 10
-R 00 00 00 17
-T 00 10 79 C0 49 C0
-R 00 00 00 17
diff --git a/demo/keypad_display.rst b/demo/keypad_display.rst
deleted file mode 100644
index e013b8e..0000000
--- a/demo/keypad_display.rst
+++ /dev/null
@@ -1,624 +0,0 @@
- 1 ;--------------------------------------------------------
- 2 ; File Created by SDCC : free open source ANSI-C Compiler
- 3 ; Version 2.9.0 #5416 (Oct 6 2009) (UNIX)
- 4 ; This file was generated Tue Oct 27 23:03:55 2009
- 5 ;--------------------------------------------------------
- 6 .module keypad_display
- 7 .optsdcc -mmcs51 --model-small
- 8
- 9 ;--------------------------------------------------------
- 10 ; Public variables in this module
- 11 ;--------------------------------------------------------
- 12 .globl _main
- 13 .globl _CY
- 14 .globl _AC
- 15 .globl _F0
- 16 .globl _RS1
- 17 .globl _RS0
- 18 .globl _OV
- 19 .globl _F1
- 20 .globl _P
- 21 .globl _PS
- 22 .globl _PT1
- 23 .globl _PX1
- 24 .globl _PT0
- 25 .globl _PX0
- 26 .globl _RD
- 27 .globl _WR
- 28 .globl _T1
- 29 .globl _T0
- 30 .globl _INT1
- 31 .globl _INT0
- 32 .globl _TXD
- 33 .globl _RXD
- 34 .globl _P3_7
- 35 .globl _P3_6
- 36 .globl _P3_5
- 37 .globl _P3_4
- 38 .globl _P3_3
- 39 .globl _P3_2
- 40 .globl _P3_1
- 41 .globl _P3_0
- 42 .globl _EA
- 43 .globl _ES
- 44 .globl _ET1
- 45 .globl _EX1
- 46 .globl _ET0
- 47 .globl _EX0
- 48 .globl _P2_7
- 49 .globl _P2_6
- 50 .globl _P2_5
- 51 .globl _P2_4
- 52 .globl _P2_3
- 53 .globl _P2_2
- 54 .globl _P2_1
- 55 .globl _P2_0
- 56 .globl _SM0
- 57 .globl _SM1
- 58 .globl _SM2
- 59 .globl _REN
- 60 .globl _TB8
- 61 .globl _RB8
- 62 .globl _TI
- 63 .globl _RI
- 64 .globl _P1_7
- 65 .globl _P1_6
- 66 .globl _P1_5
- 67 .globl _P1_4
- 68 .globl _P1_3
- 69 .globl _P1_2
- 70 .globl _P1_1
- 71 .globl _P1_0
- 72 .globl _TF1
- 73 .globl _TR1
- 74 .globl _TF0
- 75 .globl _TR0
- 76 .globl _IE1
- 77 .globl _IT1
- 78 .globl _IE0
- 79 .globl _IT0
- 80 .globl _P0_7
- 81 .globl _P0_6
- 82 .globl _P0_5
- 83 .globl _P0_4
- 84 .globl _P0_3
- 85 .globl _P0_2
- 86 .globl _P0_1
- 87 .globl _P0_0
- 88 .globl _B
- 89 .globl _ACC
- 90 .globl _PSW
- 91 .globl _IP
- 92 .globl _P3
- 93 .globl _IE
- 94 .globl _P2
- 95 .globl _SBUF
- 96 .globl _SCON
- 97 .globl _P1
- 98 .globl _TH1
- 99 .globl _TH0
- 100 .globl _TL1
- 101 .globl _TL0
- 102 .globl _TMOD
- 103 .globl _TCON
- 104 .globl _PCON
- 105 .globl _DPH
- 106 .globl _DPL
- 107 .globl _SP
- 108 .globl _P0
- 109 .globl _row
- 110 .globl _state
- 111 ;--------------------------------------------------------
- 112 ; special function registers
- 113 ;--------------------------------------------------------
- 114 .area RSEG (DATA)
- 0080 115 G$P0$0$0 == 0x0080
- 0080 116 _P0 = 0x0080
- 0081 117 G$SP$0$0 == 0x0081
- 0081 118 _SP = 0x0081
- 0082 119 G$DPL$0$0 == 0x0082
- 0082 120 _DPL = 0x0082
- 0083 121 G$DPH$0$0 == 0x0083
- 0083 122 _DPH = 0x0083
- 0087 123 G$PCON$0$0 == 0x0087
- 0087 124 _PCON = 0x0087
- 0088 125 G$TCON$0$0 == 0x0088
- 0088 126 _TCON = 0x0088
- 0089 127 G$TMOD$0$0 == 0x0089
- 0089 128 _TMOD = 0x0089
- 008A 129 G$TL0$0$0 == 0x008a
- 008A 130 _TL0 = 0x008a
- 008B 131 G$TL1$0$0 == 0x008b
- 008B 132 _TL1 = 0x008b
- 008C 133 G$TH0$0$0 == 0x008c
- 008C 134 _TH0 = 0x008c
- 008D 135 G$TH1$0$0 == 0x008d
- 008D 136 _TH1 = 0x008d
- 0090 137 G$P1$0$0 == 0x0090
- 0090 138 _P1 = 0x0090
- 0098 139 G$SCON$0$0 == 0x0098
- 0098 140 _SCON = 0x0098
- 0099 141 G$SBUF$0$0 == 0x0099
- 0099 142 _SBUF = 0x0099
- 00A0 143 G$P2$0$0 == 0x00a0
- 00A0 144 _P2 = 0x00a0
- 00A8 145 G$IE$0$0 == 0x00a8
- 00A8 146 _IE = 0x00a8
- 00B0 147 G$P3$0$0 == 0x00b0
- 00B0 148 _P3 = 0x00b0
- 00B8 149 G$IP$0$0 == 0x00b8
- 00B8 150 _IP = 0x00b8
- 00D0 151 G$PSW$0$0 == 0x00d0
- 00D0 152 _PSW = 0x00d0
- 00E0 153 G$ACC$0$0 == 0x00e0
- 00E0 154 _ACC = 0x00e0
- 00F0 155 G$B$0$0 == 0x00f0
- 00F0 156 _B = 0x00f0
- 157 ;--------------------------------------------------------
- 158 ; special function bits
- 159 ;--------------------------------------------------------
- 160 .area RSEG (DATA)
- 0080 161 G$P0_0$0$0 == 0x0080
- 0080 162 _P0_0 = 0x0080
- 0081 163 G$P0_1$0$0 == 0x0081
- 0081 164 _P0_1 = 0x0081
- 0082 165 G$P0_2$0$0 == 0x0082
- 0082 166 _P0_2 = 0x0082
- 0083 167 G$P0_3$0$0 == 0x0083
- 0083 168 _P0_3 = 0x0083
- 0084 169 G$P0_4$0$0 == 0x0084
- 0084 170 _P0_4 = 0x0084
- 0085 171 G$P0_5$0$0 == 0x0085
- 0085 172 _P0_5 = 0x0085
- 0086 173 G$P0_6$0$0 == 0x0086
- 0086 174 _P0_6 = 0x0086
- 0087 175 G$P0_7$0$0 == 0x0087
- 0087 176 _P0_7 = 0x0087
- 0088 177 G$IT0$0$0 == 0x0088
- 0088 178 _IT0 = 0x0088
- 0089 179 G$IE0$0$0 == 0x0089
- 0089 180 _IE0 = 0x0089
- 008A 181 G$IT1$0$0 == 0x008a
- 008A 182 _IT1 = 0x008a
- 008B 183 G$IE1$0$0 == 0x008b
- 008B 184 _IE1 = 0x008b
- 008C 185 G$TR0$0$0 == 0x008c
- 008C 186 _TR0 = 0x008c
- 008D 187 G$TF0$0$0 == 0x008d
- 008D 188 _TF0 = 0x008d
- 008E 189 G$TR1$0$0 == 0x008e
- 008E 190 _TR1 = 0x008e
- 008F 191 G$TF1$0$0 == 0x008f
- 008F 192 _TF1 = 0x008f
- 0090 193 G$P1_0$0$0 == 0x0090
- 0090 194 _P1_0 = 0x0090
- 0091 195 G$P1_1$0$0 == 0x0091
- 0091 196 _P1_1 = 0x0091
- 0092 197 G$P1_2$0$0 == 0x0092
- 0092 198 _P1_2 = 0x0092
- 0093 199 G$P1_3$0$0 == 0x0093
- 0093 200 _P1_3 = 0x0093
- 0094 201 G$P1_4$0$0 == 0x0094
- 0094 202 _P1_4 = 0x0094
- 0095 203 G$P1_5$0$0 == 0x0095
- 0095 204 _P1_5 = 0x0095
- 0096 205 G$P1_6$0$0 == 0x0096
- 0096 206 _P1_6 = 0x0096
- 0097 207 G$P1_7$0$0 == 0x0097
- 0097 208 _P1_7 = 0x0097
- 0098 209 G$RI$0$0 == 0x0098
- 0098 210 _RI = 0x0098
- 0099 211 G$TI$0$0 == 0x0099
- 0099 212 _TI = 0x0099
- 009A 213 G$RB8$0$0 == 0x009a
- 009A 214 _RB8 = 0x009a
- 009B 215 G$TB8$0$0 == 0x009b
- 009B 216 _TB8 = 0x009b
- 009C 217 G$REN$0$0 == 0x009c
- 009C 218 _REN = 0x009c
- 009D 219 G$SM2$0$0 == 0x009d
- 009D 220 _SM2 = 0x009d
- 009E 221 G$SM1$0$0 == 0x009e
- 009E 222 _SM1 = 0x009e
- 009F 223 G$SM0$0$0 == 0x009f
- 009F 224 _SM0 = 0x009f
- 00A0 225 G$P2_0$0$0 == 0x00a0
- 00A0 226 _P2_0 = 0x00a0
- 00A1 227 G$P2_1$0$0 == 0x00a1
- 00A1 228 _P2_1 = 0x00a1
- 00A2 229 G$P2_2$0$0 == 0x00a2
- 00A2 230 _P2_2 = 0x00a2
- 00A3 231 G$P2_3$0$0 == 0x00a3
- 00A3 232 _P2_3 = 0x00a3
- 00A4 233 G$P2_4$0$0 == 0x00a4
- 00A4 234 _P2_4 = 0x00a4
- 00A5 235 G$P2_5$0$0 == 0x00a5
- 00A5 236 _P2_5 = 0x00a5
- 00A6 237 G$P2_6$0$0 == 0x00a6
- 00A6 238 _P2_6 = 0x00a6
- 00A7 239 G$P2_7$0$0 == 0x00a7
- 00A7 240 _P2_7 = 0x00a7
- 00A8 241 G$EX0$0$0 == 0x00a8
- 00A8 242 _EX0 = 0x00a8
- 00A9 243 G$ET0$0$0 == 0x00a9
- 00A9 244 _ET0 = 0x00a9
- 00AA 245 G$EX1$0$0 == 0x00aa
- 00AA 246 _EX1 = 0x00aa
- 00AB 247 G$ET1$0$0 == 0x00ab
- 00AB 248 _ET1 = 0x00ab
- 00AC 249 G$ES$0$0 == 0x00ac
- 00AC 250 _ES = 0x00ac
- 00AF 251 G$EA$0$0 == 0x00af
- 00AF 252 _EA = 0x00af
- 00B0 253 G$P3_0$0$0 == 0x00b0
- 00B0 254 _P3_0 = 0x00b0
- 00B1 255 G$P3_1$0$0 == 0x00b1
- 00B1 256 _P3_1 = 0x00b1
- 00B2 257 G$P3_2$0$0 == 0x00b2
- 00B2 258 _P3_2 = 0x00b2
- 00B3 259 G$P3_3$0$0 == 0x00b3
- 00B3 260 _P3_3 = 0x00b3
- 00B4 261 G$P3_4$0$0 == 0x00b4
- 00B4 262 _P3_4 = 0x00b4
- 00B5 263 G$P3_5$0$0 == 0x00b5
- 00B5 264 _P3_5 = 0x00b5
- 00B6 265 G$P3_6$0$0 == 0x00b6
- 00B6 266 _P3_6 = 0x00b6
- 00B7 267 G$P3_7$0$0 == 0x00b7
- 00B7 268 _P3_7 = 0x00b7
- 00B0 269 G$RXD$0$0 == 0x00b0
- 00B0 270 _RXD = 0x00b0
- 00B1 271 G$TXD$0$0 == 0x00b1
- 00B1 272 _TXD = 0x00b1
- 00B2 273 G$INT0$0$0 == 0x00b2
- 00B2 274 _INT0 = 0x00b2
- 00B3 275 G$INT1$0$0 == 0x00b3
- 00B3 276 _INT1 = 0x00b3
- 00B4 277 G$T0$0$0 == 0x00b4
- 00B4 278 _T0 = 0x00b4
- 00B5 279 G$T1$0$0 == 0x00b5
- 00B5 280 _T1 = 0x00b5
- 00B6 281 G$WR$0$0 == 0x00b6
- 00B6 282 _WR = 0x00b6
- 00B7 283 G$RD$0$0 == 0x00b7
- 00B7 284 _RD = 0x00b7
- 00B8 285 G$PX0$0$0 == 0x00b8
- 00B8 286 _PX0 = 0x00b8
- 00B9 287 G$PT0$0$0 == 0x00b9
- 00B9 288 _PT0 = 0x00b9
- 00BA 289 G$PX1$0$0 == 0x00ba
- 00BA 290 _PX1 = 0x00ba
- 00BB 291 G$PT1$0$0 == 0x00bb
- 00BB 292 _PT1 = 0x00bb
- 00BC 293 G$PS$0$0 == 0x00bc
- 00BC 294 _PS = 0x00bc
- 00D0 295 G$P$0$0 == 0x00d0
- 00D0 296 _P = 0x00d0
- 00D1 297 G$F1$0$0 == 0x00d1
- 00D1 298 _F1 = 0x00d1
- 00D2 299 G$OV$0$0 == 0x00d2
- 00D2 300 _OV = 0x00d2
- 00D3 301 G$RS0$0$0 == 0x00d3
- 00D3 302 _RS0 = 0x00d3
- 00D4 303 G$RS1$0$0 == 0x00d4
- 00D4 304 _RS1 = 0x00d4
- 00D5 305 G$F0$0$0 == 0x00d5
- 00D5 306 _F0 = 0x00d5
- 00D6 307 G$AC$0$0 == 0x00d6
- 00D6 308 _AC = 0x00d6
- 00D7 309 G$CY$0$0 == 0x00d7
- 00D7 310 _CY = 0x00d7
- 311 ;--------------------------------------------------------
- 312 ; overlayable register banks
- 313 ;--------------------------------------------------------
- 314 .area REG_BANK_0 (REL,OVR,DATA)
- 0000 315 .ds 8
- 316 ;--------------------------------------------------------
- 317 ; internal ram data
- 318 ;--------------------------------------------------------
- 319 .area DSEG (DATA)
- 0000 320 G$state$0$0==.
- 0008 321 _state::
- 0008 322 .ds 1
- 0001 323 G$row$0$0==.
- 0009 324 _row::
- 0009 325 .ds 2
- 326 ;--------------------------------------------------------
- 327 ; overlayable items in internal ram
- 328 ;--------------------------------------------------------
- 329 .area OSEG (OVR,DATA)
- 330 ;--------------------------------------------------------
- 331 ; Stack segment in internal ram
- 332 ;--------------------------------------------------------
- 333 .area SSEG (DATA)
- 000B 334 __start__stack:
- 000B 335 .ds 1
- 336
- 337 ;--------------------------------------------------------
- 338 ; indirectly addressable internal ram data
- 339 ;--------------------------------------------------------
- 340 .area ISEG (DATA)
- 341 ;--------------------------------------------------------
- 342 ; absolute internal ram data
- 343 ;--------------------------------------------------------
- 344 .area IABS (ABS,DATA)
- 345 .area IABS (ABS,DATA)
- 346 ;--------------------------------------------------------
- 347 ; bit data
- 348 ;--------------------------------------------------------
- 349 .area BSEG (BIT)
- 350 ;--------------------------------------------------------
- 351 ; paged external ram data
- 352 ;--------------------------------------------------------
- 353 .area PSEG (PAG,XDATA)
- 354 ;--------------------------------------------------------
- 355 ; external ram data
- 356 ;--------------------------------------------------------
- 357 .area XSEG (XDATA)
- 358 ;--------------------------------------------------------
- 359 ; absolute external ram data
- 360 ;--------------------------------------------------------
- 361 .area XABS (ABS,XDATA)
- 362 ;--------------------------------------------------------
- 363 ; external initialized ram data
- 364 ;--------------------------------------------------------
- 365 .area XISEG (XDATA)
- 366 .area HOME (CODE)
- 367 .area GSINIT0 (CODE)
- 368 .area GSINIT1 (CODE)
- 369 .area GSINIT2 (CODE)
- 370 .area GSINIT3 (CODE)
- 371 .area GSINIT4 (CODE)
- 372 .area GSINIT5 (CODE)
- 373 .area GSINIT (CODE)
- 374 .area GSFINAL (CODE)
- 375 .area CSEG (CODE)
- 376 ;--------------------------------------------------------
- 377 ; interrupt vector
- 378 ;--------------------------------------------------------
- 379 .area HOME (CODE)
- 0000 380 __interrupt_vect:
- 0000 02 00 08 381 ljmp __sdcc_gsinit_startup
- 382 ;--------------------------------------------------------
- 383 ; global & static initialisations
- 384 ;--------------------------------------------------------
- 385 .area HOME (CODE)
- 386 .area GSINIT (CODE)
- 387 .area GSFINAL (CODE)
- 388 .area GSINIT (CODE)
- 389 .globl __sdcc_gsinit_startup
- 390 .globl __sdcc_program_startup
- 391 .globl __start__stack
- 392 .globl __mcs51_genXINIT
- 393 .globl __mcs51_genXRAMCLEAR
- 394 .globl __mcs51_genRAMCLEAR
- 395 .area GSFINAL (CODE)
- 0061 02 00 03 396 ljmp __sdcc_program_startup
- 397 ;--------------------------------------------------------
- 398 ; Home
- 399 ;--------------------------------------------------------
- 400 .area HOME (CODE)
- 401 .area HOME (CODE)
- 0003 402 __sdcc_program_startup:
- 0003 12 00 64 403 lcall _main
- 404 ; return from main will lock up
- 0006 80 FE 405 sjmp .
- 406 ;--------------------------------------------------------
- 407 ; code
- 408 ;--------------------------------------------------------
- 409 .area CSEG (CODE)
- 410 ;------------------------------------------------------------
- 411 ;Allocation info for local variables in function 'main'
- 412 ;------------------------------------------------------------
- 413 ;------------------------------------------------------------
- 0000 414 G$main$0$0 ==.
- 0000 415 C$keypad_display.c$38$0$0 ==.
- 416 ; keypad_display.c:38: int main()
- 417 ; -----------------------------------------
- 418 ; function main
- 419 ; -----------------------------------------
- 0064 420 _main:
- 0002 421 ar2 = 0x02
- 0003 422 ar3 = 0x03
- 0004 423 ar4 = 0x04
- 0005 424 ar5 = 0x05
- 0006 425 ar6 = 0x06
- 0007 426 ar7 = 0x07
- 0000 427 ar0 = 0x00
- 0001 428 ar1 = 0x01
- 0000 429 C$keypad_display.c$40$1$1 ==.
- 430 ; keypad_display.c:40: while(1) {
- 0064 431 00123$:
- 0000 432 C$keypad_display.c$41$2$2 ==.
- 433 ; keypad_display.c:41: for(row=0; row<4; row++) {
- 0064 E4 434 clr a
- 0065 F5 09 435 mov _row,a
- 0067 F5 0A 436 mov (_row + 1),a
- 0069 437 00118$:
- 0069 C3 438 clr c
- 006A E5 09 439 mov a,_row
- 006C 94 04 440 subb a,#0x04
- 006E E5 0A 441 mov a,(_row + 1)
- 0070 64 80 442 xrl a,#0x80
- 0072 94 80 443 subb a,#0x80
- 0074 50 EE 444 jnc 00123$
- 0012 445 C$keypad_display.c$42$3$3 ==.
- 446 ; keypad_display.c:42: P1=keypad[row];
- 0076 E5 09 447 mov a,_row
- 0078 24 1A 448 add a,#_keypad
- 007A F5 82 449 mov dpl,a
- 007C E5 0A 450 mov a,(_row + 1)
- 007E 34 01 451 addc a,#(_keypad >> 8)
- 0080 F5 83 452 mov dph,a
- 0082 E4 453 clr a
- 0083 93 454 movc a,@a+dptr
- 0084 F5 90 455 mov _P1,a
- 0022 456 C$keypad_display.c$48$3$3 ==.
- 457 ; keypad_display.c:48: _endasm;
- 458
- 0086 85 90 08 459 mov _state, P1
- 460
- 0025 461 C$keypad_display.c$53$3$3 ==.
- 462 ; keypad_display.c:53: state&=0x0f;
- 0089 53 08 0F 463 anl _state,#0x0F
- 0028 464 C$keypad_display.c$54$3$3 ==.
- 465 ; keypad_display.c:54: state^=0x0f;
- 008C 63 08 0F 466 xrl _state,#0x0F
- 002B 467 C$keypad_display.c$56$3$3 ==.
- 468 ; keypad_display.c:56: if(state & 1) {
- 008F E5 08 469 mov a,_state
- 0091 30 E0 05 470 jnb acc.0,00111$
- 0030 471 C$keypad_display.c$57$4$4 ==.
- 472 ; keypad_display.c:57: state=0;
- 0094 75 08 00 473 mov _state,#0x00
- 0097 80 1F 474 sjmp 00112$
- 0099 475 00111$:
- 0035 476 C$keypad_display.c$58$3$3 ==.
- 477 ; keypad_display.c:58: } else if(state & 2) {
- 0099 E5 08 478 mov a,_state
- 009B 30 E1 05 479 jnb acc.1,00108$
- 003A 480 C$keypad_display.c$59$4$5 ==.
- 481 ; keypad_display.c:59: state=1;
- 009E 75 08 01 482 mov _state,#0x01
- 00A1 80 15 483 sjmp 00112$
- 00A3 484 00108$:
- 003F 485 C$keypad_display.c$60$3$3 ==.
- 486 ; keypad_display.c:60: } else if(state & 4) {
- 00A3 E5 08 487 mov a,_state
- 00A5 30 E2 05 488 jnb acc.2,00105$
- 0044 489 C$keypad_display.c$61$4$6 ==.
- 490 ; keypad_display.c:61: state=2;
- 00A8 75 08 02 491 mov _state,#0x02
- 00AB 80 0B 492 sjmp 00112$
- 00AD 493 00105$:
- 0049 494 C$keypad_display.c$62$3$3 ==.
- 495 ; keypad_display.c:62: } else if(state & 8) {
- 00AD E5 08 496 mov a,_state
- 00AF 20 E3 03 497 jb acc.3,00142$
- 00B2 02 01 0B 498 ljmp 00120$
- 00B5 499 00142$:
- 0051 500 C$keypad_display.c$63$4$7 ==.
- 501 ; keypad_display.c:63: state=3;
- 00B5 75 08 03 502 mov _state,#0x03
- 0054 503 C$keypad_display.c$65$3$3 ==.
- 504 ; keypad_display.c:65: continue;
- 00B8 505 00112$:
- 0054 506 C$keypad_display.c$68$3$3 ==.
- 507 ; keypad_display.c:68: switch(row) {
- 00B8 E4 508 clr a
- 00B9 B5 09 06 509 cjne a,_row,00143$
- 00BC E4 510 clr a
- 00BD B5 0A 02 511 cjne a,(_row + 1),00143$
- 00C0 80 23 512 sjmp 00113$
- 00C2 513 00143$:
- 00C2 74 01 514 mov a,#0x01
- 00C4 B5 09 06 515 cjne a,_row,00144$
- 00C7 E4 516 clr a
- 00C8 B5 0A 02 517 cjne a,(_row + 1),00144$
- 00CB 80 22 518 sjmp 00114$
- 00CD 519 00144$:
- 00CD 74 02 520 mov a,#0x02
- 00CF B5 09 06 521 cjne a,_row,00145$
- 00D2 E4 522 clr a
- 00D3 B5 0A 02 523 cjne a,(_row + 1),00145$
- 00D6 80 21 524 sjmp 00115$
- 00D8 525 00145$:
- 00D8 74 03 526 mov a,#0x03
- 00DA B5 09 06 527 cjne a,_row,00146$
- 00DD E4 528 clr a
- 00DE B5 0A 02 529 cjne a,(_row + 1),00146$
- 00E1 80 20 530 sjmp 00116$
- 00E3 531 00146$:
- 007F 532 C$keypad_display.c$69$4$9 ==.
- 533 ; keypad_display.c:69: case 0:
- 00E3 80 26 534 sjmp 00120$
- 00E5 535 00113$:
- 0081 536 C$keypad_display.c$70$4$9 ==.
- 537 ; keypad_display.c:70: P3=display_0[state];
- 00E5 E5 08 538 mov a,_state
- 00E7 90 01 1E 539 mov dptr,#_display_0
- 00EA 93 540 movc a,@a+dptr
- 00EB F5 B0 541 mov _P3,a
- 0089 542 C$keypad_display.c$71$4$9 ==.
- 543 ; keypad_display.c:71: break;
- 0089 544 C$keypad_display.c$72$4$9 ==.
- 545 ; keypad_display.c:72: case 1:
- 00ED 80 1C 546 sjmp 00120$
- 00EF 547 00114$:
- 008B 548 C$keypad_display.c$73$4$9 ==.
- 549 ; keypad_display.c:73: P3=display_1[state];
- 00EF E5 08 550 mov a,_state
- 00F1 90 01 22 551 mov dptr,#_display_1
- 00F4 93 552 movc a,@a+dptr
- 00F5 F5 B0 553 mov _P3,a
- 0093 554 C$keypad_display.c$74$4$9 ==.
- 555 ; keypad_display.c:74: break;
- 0093 556 C$keypad_display.c$75$4$9 ==.
- 557 ; keypad_display.c:75: case 2:
- 00F7 80 12 558 sjmp 00120$
- 00F9 559 00115$:
- 0095 560 C$keypad_display.c$76$4$9 ==.
- 561 ; keypad_display.c:76: P3=display_2[state];
- 00F9 E5 08 562 mov a,_state
- 00FB 90 01 26 563 mov dptr,#_display_2
- 00FE 93 564 movc a,@a+dptr
- 00FF F5 B0 565 mov _P3,a
- 009D 566 C$keypad_display.c$77$4$9 ==.
- 567 ; keypad_display.c:77: break;
- 009D 568 C$keypad_display.c$78$4$9 ==.
- 569 ; keypad_display.c:78: case 3:
- 0101 80 08 570 sjmp 00120$
- 0103 571 00116$:
- 009F 572 C$keypad_display.c$79$4$9 ==.
- 573 ; keypad_display.c:79: P3=display_3[state];
- 0103 E5 08 574 mov a,_state
- 0105 90 01 2A 575 mov dptr,#_display_3
- 0108 93 576 movc a,@a+dptr
- 0109 F5 B0 577 mov _P3,a
- 00A7 578 C$keypad_display.c$81$2$2 ==.
- 579 ; keypad_display.c:81: }
- 010B 580 00120$:
- 00A7 581 C$keypad_display.c$41$2$2 ==.
- 582 ; keypad_display.c:41: for(row=0; row<4; row++) {
- 010B 05 09 583 inc _row
- 010D E4 584 clr a
- 010E B5 09 02 585 cjne a,_row,00147$
- 0111 05 0A 586 inc (_row + 1)
- 0113 587 00147$:
- 00AF 588 C$keypad_display.c$84$1$1 ==.
- 00AF 589 XG$main$0$0 ==.
- 0113 02 00 69 590 ljmp 00118$
- 591 .area CSEG (CODE)
- 592 .area CONST (CODE)
- 0000 593 Fkeypad_display$keypad$0$0 == .
- 011A 594 _keypad:
- 011A EF 595 .db #0xEF
- 011B DF 596 .db #0xDF
- 011C BF 597 .db #0xBF
- 011D 7F 598 .db #0x7F
- 0004 599 Fkeypad_display$display_0$0$0 == .
- 011E 600 _display_0:
- 011E F9 601 .db #0xF9
- 011F 64 602 .db #0x64
- 0120 70 603 .db #0x70
- 0121 48 604 .db #0x48
- 0008 605 Fkeypad_display$display_1$0$0 == .
- 0122 606 _display_1:
- 0122 59 607 .db #0x59
- 0123 52 608 .db #0x52
- 0124 42 609 .db #0x42
- 0125 40 610 .db #0x40
- 000C 611 Fkeypad_display$display_2$0$0 == .
- 0126 612 _display_2:
- 0126 F8 613 .db #0xF8
- 0127 40 614 .db #0x40
- 0128 50 615 .db #0x50
- 0129 C6 616 .db #0xC6
- 0010 617 Fkeypad_display$display_3$0$0 == .
- 012A 618 _display_3:
- 012A 79 619 .db #0x79
- 012B C0 620 .db #0xC0
- 012C 49 621 .db #0x49
- 012D C0 622 .db #0xC0
- 623 .area XINIT (CODE)
- 624 .area CABS (ABS,CODE)
diff --git a/demo/keypad_display.sym b/demo/keypad_display.sym
deleted file mode 100644
index eded721..0000000
--- a/demo/keypad_display.sym
+++ /dev/null
@@ -1,712 +0,0 @@
- ASxxxx Assembler V01.70 + NoICE + SDCC mods + Flat24 Feb-1999 (Intel 8051), page 1.
-
-Symbol Table
-
- A 00D6
- D A$keypad_display$381 0000 GR
- 15 A$keypad_display$396 0000 GR
- D A$keypad_display$403 0003 GR
- D A$keypad_display$405 0006 GR
- 16 A$keypad_display$434 0000 GR
- 16 A$keypad_display$435 0001 GR
- 16 A$keypad_display$436 0003 GR
- 16 A$keypad_display$438 0005 GR
- 16 A$keypad_display$439 0006 GR
- 16 A$keypad_display$440 0008 GR
- 16 A$keypad_display$441 000A GR
- 16 A$keypad_display$442 000C GR
- 16 A$keypad_display$443 000E GR
- 16 A$keypad_display$444 0010 GR
- 16 A$keypad_display$447 0012 GR
- 16 A$keypad_display$448 0014 GR
- 16 A$keypad_display$449 0016 GR
- 16 A$keypad_display$450 0018 GR
- 16 A$keypad_display$451 001A GR
- 16 A$keypad_display$452 001C GR
- 16 A$keypad_display$453 001E GR
- 16 A$keypad_display$454 001F GR
- 16 A$keypad_display$455 0020 GR
- 16 A$keypad_display$459 0022 GR
- 16 A$keypad_display$463 0025 GR
- 16 A$keypad_display$466 0028 GR
- 16 A$keypad_display$469 002B GR
- 16 A$keypad_display$470 002D GR
- 16 A$keypad_display$473 0030 GR
- 16 A$keypad_display$474 0033 GR
- 16 A$keypad_display$478 0035 GR
- 16 A$keypad_display$479 0037 GR
- 16 A$keypad_display$482 003A GR
- 16 A$keypad_display$483 003D GR
- 16 A$keypad_display$487 003F GR
- 16 A$keypad_display$488 0041 GR
- 16 A$keypad_display$491 0044 GR
- 16 A$keypad_display$492 0047 GR
- 16 A$keypad_display$496 0049 GR
- 16 A$keypad_display$497 004B GR
- 16 A$keypad_display$498 004E GR
- 16 A$keypad_display$502 0051 GR
- 16 A$keypad_display$508 0054 GR
- 16 A$keypad_display$509 0055 GR
- 16 A$keypad_display$510 0058 GR
- 16 A$keypad_display$511 0059 GR
- 16 A$keypad_display$512 005C GR
- 16 A$keypad_display$514 005E GR
- 16 A$keypad_display$515 0060 GR
- 16 A$keypad_display$516 0063 GR
- 16 A$keypad_display$517 0064 GR
- 16 A$keypad_display$518 0067 GR
- 16 A$keypad_display$520 0069 GR
- 16 A$keypad_display$521 006B GR
- 16 A$keypad_display$522 006E GR
- 16 A$keypad_display$523 006F GR
- 16 A$keypad_display$524 0072 GR
- 16 A$keypad_display$526 0074 GR
- 16 A$keypad_display$527 0076 GR
- 16 A$keypad_display$528 0079 GR
- 16 A$keypad_display$529 007A GR
- 16 A$keypad_display$530 007D GR
- 16 A$keypad_display$534 007F GR
- 16 A$keypad_display$538 0081 GR
- 16 A$keypad_display$539 0083 GR
- 16 A$keypad_display$540 0086 GR
- 16 A$keypad_display$541 0087 GR
- 16 A$keypad_display$546 0089 GR
- 16 A$keypad_display$550 008B GR
- 16 A$keypad_display$551 008D GR
- 16 A$keypad_display$552 0090 GR
- 16 A$keypad_display$553 0091 GR
- 16 A$keypad_display$558 0093 GR
- 16 A$keypad_display$562 0095 GR
- 16 A$keypad_display$563 0097 GR
- 16 A$keypad_display$564 009A GR
- 16 A$keypad_display$565 009B GR
- 16 A$keypad_display$570 009D GR
- 16 A$keypad_display$574 009F GR
- 16 A$keypad_display$575 00A1 GR
- 16 A$keypad_display$576 00A4 GR
- 16 A$keypad_display$577 00A5 GR
- 16 A$keypad_display$583 00A7 GR
- 16 A$keypad_display$584 00A9 GR
- 16 A$keypad_display$585 00AA GR
- 16 A$keypad_display$586 00AD GR
- 16 A$keypad_display$590 00AF GR
- AC 00D6
- ACC 00E0
- ACC.0 00E0
- ACC.1 00E1
- ACC.2 00E2
- ACC.3 00E3
- ACC.4 00E4
- ACC.5 00E5
- ACC.6 00E6
- ACC.7 00E7
- B 00F0
- B.0 00F0
- B.1 00F1
- B.2 00F2
- B.3 00F3
- B.4 00F4
- B.5 00F5
- B.6 00F6
- B.7 00F7
- 16 C$keypad_display.c$38$0$0 = 0000 GR
- 16 C$keypad_display.c$40$1$1 = 0000 GR
- 16 C$keypad_display.c$41$2$2 = 00A7 GR
- 16 C$keypad_display.c$42$3$3 = 0012 GR
- 16 C$keypad_display.c$48$3$3 = 0022 GR
- 16 C$keypad_display.c$53$3$3 = 0025 GR
- 16 C$keypad_display.c$54$3$3 = 0028 GR
- 16 C$keypad_display.c$56$3$3 = 002B GR
- 16 C$keypad_display.c$57$4$4 = 0030 GR
- 16 C$keypad_display.c$58$3$3 = 0035 GR
- 16 C$keypad_display.c$59$4$5 = 003A GR
- 16 C$keypad_display.c$60$3$3 = 003F GR
- 16 C$keypad_display.c$61$4$6 = 0044 GR
- 16 C$keypad_display.c$62$3$3 = 0049 GR
- 16 C$keypad_display.c$63$4$7 = 0051 GR
- 16 C$keypad_display.c$65$3$3 = 0054 GR
- 16 C$keypad_display.c$68$3$3 = 0054 GR
- 16 C$keypad_display.c$69$4$9 = 007F GR
- 16 C$keypad_display.c$70$4$9 = 0081 GR
- 16 C$keypad_display.c$71$4$9 = 0089 GR
- 16 C$keypad_display.c$72$4$9 = 0089 GR
- 16 C$keypad_display.c$73$4$9 = 008B GR
- 16 C$keypad_display.c$74$4$9 = 0093 GR
- 16 C$keypad_display.c$75$4$9 = 0093 GR
- 16 C$keypad_display.c$76$4$9 = 0095 GR
- 16 C$keypad_display.c$77$4$9 = 009D GR
- 16 C$keypad_display.c$78$4$9 = 009D GR
- 16 C$keypad_display.c$79$4$9 = 009F GR
- 16 C$keypad_display.c$81$2$2 = 00A7 GR
- 16 C$keypad_display.c$84$1$1 = 00AF GR
- CPRL2 00C8
- CT2 00C9
- CY 00D7
- DPH 0083
- DPL 0082
- EA 00AF
- ES 00AC
- ET0 00A9
- ET1 00AB
- ET2 00AD
- EX0 00A8
- EX1 00AA
- EXEN2 00CB
- EXF2 00CE
- F0 00D5
- 17 Fkeypad_display$display_0$0$0 = 0004 GR
- 17 Fkeypad_display$display_1$0$0 = 0008 GR
- 17 Fkeypad_display$display_2$0$0 = 000C GR
- 17 Fkeypad_display$display_3$0$0 = 0010 GR
- 17 Fkeypad_display$keypad$0$0 = 0000 GR
- G$AC$0$0 = 00D6 G
- G$ACC$0$0 = 00E0 G
- G$B$0$0 = 00F0 G
- G$CY$0$0 = 00D7 G
- G$DPH$0$0 = 0083 G
- G$DPL$0$0 = 0082 G
- G$EA$0$0 = 00AF G
- G$ES$0$0 = 00AC G
- G$ET0$0$0 = 00A9 G
- G$ET1$0$0 = 00AB G
- G$EX0$0$0 = 00A8 G
- G$EX1$0$0 = 00AA G
- G$F0$0$0 = 00D5 G
- G$F1$0$0 = 00D1 G
- G$IE$0$0 = 00A8 G
- G$IE0$0$0 = 0089 G
- G$IE1$0$0 = 008B G
- G$INT0$0$0 = 00B2 G
- G$INT1$0$0 = 00B3 G
- G$IP$0$0 = 00B8 G
- G$IT0$0$0 = 0088 G
- G$IT1$0$0 = 008A G
- G$OV$0$0 = 00D2 G
- G$P$0$0 = 00D0 G
- G$P0$0$0 = 0080 G
- G$P0_0$0$0 = 0080 G
- G$P0_1$0$0 = 0081 G
- G$P0_2$0$0 = 0082 G
- G$P0_3$0$0 = 0083 G
- G$P0_4$0$0 = 0084 G
- G$P0_5$0$0 = 0085 G
- G$P0_6$0$0 = 0086 G
- G$P0_7$0$0 = 0087 G
- G$P1$0$0 = 0090 G
- G$P1_0$0$0 = 0090 G
- G$P1_1$0$0 = 0091 G
- G$P1_2$0$0 = 0092 G
- G$P1_3$0$0 = 0093 G
- G$P1_4$0$0 = 0094 G
- G$P1_5$0$0 = 0095 G
- G$P1_6$0$0 = 0096 G
- G$P1_7$0$0 = 0097 G
- G$P2$0$0 = 00A0 G
- G$P2_0$0$0 = 00A0 G
- G$P2_1$0$0 = 00A1 G
- G$P2_2$0$0 = 00A2 G
- G$P2_3$0$0 = 00A3 G
- G$P2_4$0$0 = 00A4 G
- G$P2_5$0$0 = 00A5 G
- G$P2_6$0$0 = 00A6 G
- G$P2_7$0$0 = 00A7 G
- G$P3$0$0 = 00B0 G
- G$P3_0$0$0 = 00B0 G
- G$P3_1$0$0 = 00B1 G
- G$P3_2$0$0 = 00B2 G
- G$P3_3$0$0 = 00B3 G
- G$P3_4$0$0 = 00B4 G
- G$P3_5$0$0 = 00B5 G
- G$P3_6$0$0 = 00B6 G
- G$P3_7$0$0 = 00B7 G
- G$PCON$0$0 = 0087 G
- G$PS$0$0 = 00BC G
- G$PSW$0$0 = 00D0 G
- G$PT0$0$0 = 00B9 G
- G$PT1$0$0 = 00BB G
- G$PX0$0$0 = 00B8 G
- G$PX1$0$0 = 00BA G
- G$RB8$0$0 = 009A G
- G$RD$0$0 = 00B7 G
- G$REN$0$0 = 009C G
- G$RI$0$0 = 0098 G
- G$RS0$0$0 = 00D3 G
- G$RS1$0$0 = 00D4 G
- G$RXD$0$0 = 00B0 G
- G$SBUF$0$0 = 0099 G
- G$SCON$0$0 = 0098 G
- G$SM0$0$0 = 009F G
- G$SM1$0$0 = 009E G
- G$SM2$0$0 = 009D G
- G$SP$0$0 = 0081 G
- G$T0$0$0 = 00B4 G
- G$T1$0$0 = 00B5 G
- G$TB8$0$0 = 009B G
- G$TCON$0$0 = 0088 G
- G$TF0$0$0 = 008D G
- G$TF1$0$0 = 008F G
- G$TH0$0$0 = 008C G
- G$TH1$0$0 = 008D G
- G$TI$0$0 = 0099 G
- G$TL0$0$0 = 008A G
- G$TL1$0$0 = 008B G
- G$TMOD$0$0 = 0089 G
- G$TR0$0$0 = 008C G
- G$TR1$0$0 = 008E G
- G$TXD$0$0 = 00B1 G
- G$WR$0$0 = 00B6 G
- 16 G$main$0$0 = 0000 GR
- 3 G$row$0$0 = 0001 GR
- 3 G$state$0$0 = 0000 GR
- IE 00A8
- IE.0 00A8
- IE.1 00A9
- IE.2 00AA
- IE.3 00AB
- IE.4 00AC
- IE.5 00AD
- IE.7 00AF
- IE0 0089
- IE1 008B
- INT0 00B2
- INT1 00B3
- IP 00B8
- IP.0 00B8
- IP.1 00B9
- IP.2 00BA
- IP.3 00BB
- IP.4 00BC
- IP.5 00BD
- IT0 0088
- IT1 008A
- OV 00D2
- P 00D0
- P0 0080
- P0.0 0080
- P0.1 0081
- P0.2 0082
- P0.3 0083
- P0.4 0084
- P0.5 0085
- P0.6 0086
- P0.7 0087
- P1 0090
- P1.0 0090
- P1.1 0091
- P1.2 0092
- P1.3 0093
- P1.4 0094
- P1.5 0095
- P1.6 0096
- P1.7 0097
- P2 00A0
- P2.0 00A0
- P2.1 00A1
- P2.2 00A2
- P2.3 00A3
- P2.4 00A4
- P2.5 00A5
- P2.6 00A6
- P2.7 00A7
- P3 00B0
- P3.0 00B0
- P3.1 00B1
- P3.2 00B2
- P3.3 00B3
- P3.4 00B4
- P3.5 00B5
- P3.6 00B6
- P3.7 00B7
- PCON 0087
- PS 00BC
- PSW 00D0
- PSW.0 00D0
- PSW.1 00D1
- PSW.2 00D2
- PSW.3 00D3
- PSW.4 00D4
- PSW.5 00D5
- PSW.6 00D6
- PSW.7 00D7
- PT0 00B9
- PT1 00BB
- PT2 00BD
- PX0 00B8
- PX1 00BA
- RB8 009A
- RCAP2H 00CB
- RCAP2L 00CA
- RCLK 00CD
- REN 009C
- RI 0098
- RS0 00D3
- RS1 00D4
- RXD 00B0
- SBUF 0099
- SCON 0098
- SCON.0 0098
- SCON.1 0099
- SCON.2 009A
- SCON.3 009B
- SCON.4 009C
- SCON.5 009D
- SCON.6 009E
- SCON.7 009F
- SM0 009F
- SM1 009E
- SM2 009D
- SP 0081
- T2CON 00C8
- T2CON.0 00C8
- T2CON.1 00C9
- T2CON.2 00CA
- T2CON.3 00CB
- T2CON.4 00CC
- T2CON.5 00CD
- T2CON.6 00CE
- T2CON.7 00CF
- TB8 009B
- TCLK 00CC
- TCON 0088
- TCON.0 0088
- TCON.1 0089
- TCON.2 008A
- TCON.3 008B
- TCON.4 008C
- TCON.5 008D
- TCON.6 008E
- TCON.7 008F
- TF0 008D
- TF1 008F
- TF2 00CF
- TH0 008C
- TH1 008D
- TH2 00CD
- TI 0099
- TL0 008A
- TL1 008B
- TL2 00CC
- TMOD 0089
- TR0 008C
- TR1 008E
- TR2 00CA
- TXD 00B1
- 16 XG$main$0$0 = 00AF GR
- _AC = 00D6 G
- _ACC = 00E0 G
- _B = 00F0 G
- _CY = 00D7 G
- _DPH = 0083 G
- _DPL = 0082 G
- _EA = 00AF G
- _ES = 00AC G
- _ET0 = 00A9 G
- _ET1 = 00AB G
- _EX0 = 00A8 G
- _EX1 = 00AA G
- _F0 = 00D5 G
- _F1 = 00D1 G
- _IE = 00A8 G
- _IE0 = 0089 G
- _IE1 = 008B G
- _INT0 = 00B2 G
- _INT1 = 00B3 G
- _IP = 00B8 G
- _IT0 = 0088 G
- _IT1 = 008A G
- _OV = 00D2 G
- _P = 00D0 G
- _P0 = 0080 G
- _P0_0 = 0080 G
- _P0_1 = 0081 G
- _P0_2 = 0082 G
- _P0_3 = 0083 G
- _P0_4 = 0084 G
- _P0_5 = 0085 G
- _P0_6 = 0086 G
- _P0_7 = 0087 G
- _P1 = 0090 G
- _P1_0 = 0090 G
- _P1_1 = 0091 G
- _P1_2 = 0092 G
- _P1_3 = 0093 G
- _P1_4 = 0094 G
- _P1_5 = 0095 G
- _P1_6 = 0096 G
- _P1_7 = 0097 G
- _P2 = 00A0 G
- _P2_0 = 00A0 G
- _P2_1 = 00A1 G
- _P2_2 = 00A2 G
- _P2_3 = 00A3 G
- _P2_4 = 00A4 G
- _P2_5 = 00A5 G
- _P2_6 = 00A6 G
- _P2_7 = 00A7 G
- _P3 = 00B0 G
- _P3_0 = 00B0 G
- _P3_1 = 00B1 G
- _P3_2 = 00B2 G
- _P3_3 = 00B3 G
- _P3_4 = 00B4 G
- _P3_5 = 00B5 G
- _P3_6 = 00B6 G
- _P3_7 = 00B7 G
- _PCON = 0087 G
- _PS = 00BC G
- _PSW = 00D0 G
- _PT0 = 00B9 G
- _PT1 = 00BB G
- _PX0 = 00B8 G
- _PX1 = 00BA G
- _RB8 = 009A G
- _RD = 00B7 G
- _REN = 009C G
- _RI = 0098 G
- _RS0 = 00D3 G
- _RS1 = 00D4 G
- _RXD = 00B0 G
- _SBUF = 0099 G
- _SCON = 0098 G
- _SM0 = 009F G
- _SM1 = 009E G
- _SM2 = 009D G
- _SP = 0081 G
- _T0 = 00B4 G
- _T1 = 00B5 G
- _TB8 = 009B G
- _TCON = 0088 G
- _TF0 = 008D G
- _TF1 = 008F G
- _TH0 = 008C G
- _TH1 = 008D G
- _TI = 0099 G
- _TL0 = 008A G
- _TL1 = 008B G
- _TMOD = 0089 G
- _TR0 = 008C G
- _TR1 = 008E G
- _TXD = 00B1 G
- _WR = 00B6 G
- D __interrupt_vect 0000 R
- __mcs51_genRAMCLEAR **** GX
- __mcs51_genXINIT **** GX
- __mcs51_genXRAMCLEAR **** GX
- __sdcc_gsinit_startup **** GX
- D __sdcc_program_startup 0003 GR
- 5 __start__stack 0000 GR
- 17 _display_0 0004 R
- 17 _display_1 0008 R
- 17 _display_2 000C R
- 17 _display_3 0010 R
- 17 _keypad 0000 R
- 16 _main 0000 GR
- 3 _row 0001 GR
- 3 _state 0000 GR
- a 00D6
- ac 00D6
- acc 00E0
- acc.0 00E0
- acc.1 00E1
- acc.2 00E2
- acc.3 00E3
- acc.4 00E4
- acc.5 00E5
- acc.6 00E6
- acc.7 00E7
- ar0 = 0000
- ar1 = 0001
- ar2 = 0002
- ar3 = 0003
- ar4 = 0004
- ar5 = 0005
- ar6 = 0006
- ar7 = 0007
- b 00F0
- b.0 00F0
- b.1 00F1
- b.2 00F2
- b.3 00F3
- b.4 00F4
- b.5 00F5
- b.6 00F6
- b.7 00F7
- cprl2 00C8
- ct2 00C9
- cy 00D7
- dph 0083
- dpl 0082
- ea 00AF
- es 00AC
- et0 00A9
- et1 00AB
- et2 00AD
- ex0 00A8
- ex1 00AA
- exen2 00CB
- exf2 00CE
- f0 00D5
- ie 00A8
- ie.0 00A8
- ie.1 00A9
- ie.2 00AA
- ie.3 00AB
- ie.4 00AC
- ie.5 00AD
- ie.7 00AF
- ie0 0089
- ie1 008B
- int0 00B2
- int1 00B3
- ip 00B8
- ip.0 00B8
- ip.1 00B9
- ip.2 00BA
- ip.3 00BB
- ip.4 00BC
- ip.5 00BD
- it0 0088
- it1 008A
- ov 00D2
- p 00D0
- p0 0080
- p0.0 0080
- p0.1 0081
- p0.2 0082
- p0.3 0083
- p0.4 0084
- p0.5 0085
- p0.6 0086
- p0.7 0087
- p1 0090
- p1.0 0090
- p1.1 0091
- p1.2 0092
- p1.3 0093
- p1.4 0094
- p1.5 0095
- p1.6 0096
- p1.7 0097
- p2 00A0
- p2.0 00A0
- p2.1 00A1
- p2.2 00A2
- p2.3 00A3
- p2.4 00A4
- p2.5 00A5
- p2.6 00A6
- p2.7 00A7
- p3 00B0
- p3.0 00B0
- p3.1 00B1
- p3.2 00B2
- p3.3 00B3
- p3.4 00B4
- p3.5 00B5
- p3.6 00B6
- p3.7 00B7
- pcon 0087
- ps 00BC
- psw 00D0
- psw.0 00D0
- psw.1 00D1
- psw.2 00D2
- psw.3 00D3
- psw.4 00D4
- psw.5 00D5
- psw.6 00D6
- psw.7 00D7
- pt0 00B9
- pt1 00BB
- pt2 00BD
- px0 00B8
- px1 00BA
- rb8 009A
- rcap2h 00CB
- rcap2l 00CA
- rclk 00CD
- ren 009C
- ri 0098
- rs0 00D3
- rs1 00D4
- rxd 00B0
- sbuf 0099
- scon 0098
- scon.0 0098
- scon.1 0099
- scon.2 009A
- scon.3 009B
- scon.4 009C
- scon.5 009D
- scon.6 009E
- scon.7 009F
- sm0 009F
- sm1 009E
- sm2 009D
- sp 0081
- t2con 00C8
- t2con.0 00C8
- t2con.1 00C9
- t2con.2 00CA
- t2con.3 00CB
- t2con.4 00CC
- t2con.5 00CD
- t2con.6 00CE
- t2con.7 00CF
- tb8 009B
- tclk 00CC
- tcon 0088
- tcon.0 0088
- tcon.1 0089
- tcon.2 008A
- tcon.3 008B
- tcon.4 008C
- tcon.5 008D
- tcon.6 008E
- tcon.7 008F
- tf0 008D
- tf1 008F
- tf2 00CF
- th0 008C
- th1 008D
- th2 00CD
- ti 0099
- tl0 008A
- tl1 008B
- tl2 00CC
- tmod 0089
- tr0 008C
- tr1 008E
- tr2 00CA
- txd 00B1
-
- ASxxxx Assembler V01.70 + NoICE + SDCC mods + Flat24 Feb-1999 (Intel 8051), page 2.
-
-Area Table
-
- 0 _CODE size 0 flags 0
- 1 RSEG size 0 flags 0
- 2 REG_BANK_0 size 8 flags 4
- 3 DSEG size 3 flags 0
- 4 OSEG size 0 flags 4
- 5 SSEG size 1 flags 0
- 6 ISEG size 0 flags 0
- 7 IABS size 0 flags 8
- 8 BSEG size 0 flags 80
- 9 PSEG size 0 flags 50
- A XSEG size 0 flags 40
- B XABS size 0 flags 48
- C XISEG size 0 flags 40
- D HOME size 8 flags 20
- E GSINIT0 size 0 flags 20
- F GSINIT1 size 0 flags 20
- 10 GSINIT2 size 0 flags 20
- 11 GSINIT3 size 0 flags 20
- 12 GSINIT4 size 0 flags 20
- 13 GSINIT5 size 0 flags 20
- 14 GSINIT size 0 flags 20
- 15 GSFINAL size 3 flags 20
- 16 CSEG size B2 flags 20
- 17 CONST size 14 flags 20
- 18 XINIT size 0 flags 20
- 19 CABS size 0 flags 28
diff --git a/demo/keypad_display.vhw b/demo/keypad_display.vhw
index 0a716f1..6df481e 100644
--- a/demo/keypad_display.vhw
+++ b/demo/keypad_display.vhw
@@ -3,4 +3,4 @@
# Project: Demo-project
LedDisplay {{4 3 0 3 5 3 1 3 6 3 2 3 7 3 3 3} {4 3 0 7 5 2 1 6 6 0 2 5 7 - 3 4} 230x170+335+204 {Number of pressed key} red 1}
-MatrixKeyPad {{4 1 0 1 5 1 1 1 6 1 2 1 7 1 3 1} {4 7 0 3 5 6 1 2 6 5 2 1 7 4 3 0} 225x235+79+174 {Pres any button and wait ...} {0 0 1 0 2 1 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0} 1}
+MatrixKeyPad {{4 1 0 1 5 1 1 1 6 1 2 1 7 1 3 1} {4 7 0 3 5 6 1 2 6 5 2 1 7 4 3 0} 225x235+79+174 {Click on any button and wait ...} {0 0 1 0 2 1 3 0 4 0 5 0 6 0 7 0 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0} 1}
diff --git a/demo/ledmatrix.adb b/demo/ledmatrix.adb
deleted file mode 100644
index d573f21..0000000
--- a/demo/ledmatrix.adb
+++ /dev/null
@@ -1,102 +0,0 @@
-M:ledmatrix
-F:G$main$0$0({2}DF,SI:S),C,0,0,0,0,0
-S:Lmain$i$1$1({2}SI:S),R,0,0,[r2,r3]
-S:G$P0$0$0({1}SC:U),I,0,0
-S:G$SP$0$0({1}SC:U),I,0,0
-S:G$DPL$0$0({1}SC:U),I,0,0
-S:G$DPH$0$0({1}SC:U),I,0,0
-S:G$PCON$0$0({1}SC:U),I,0,0
-S:G$TCON$0$0({1}SC:U),I,0,0
-S:G$TMOD$0$0({1}SC:U),I,0,0
-S:G$TL0$0$0({1}SC:U),I,0,0
-S:G$TL1$0$0({1}SC:U),I,0,0
-S:G$TH0$0$0({1}SC:U),I,0,0
-S:G$TH1$0$0({1}SC:U),I,0,0
-S:G$P1$0$0({1}SC:U),I,0,0
-S:G$SCON$0$0({1}SC:U),I,0,0
-S:G$SBUF$0$0({1}SC:U),I,0,0
-S:G$P2$0$0({1}SC:U),I,0,0
-S:G$IE$0$0({1}SC:U),I,0,0
-S:G$P3$0$0({1}SC:U),I,0,0
-S:G$IP$0$0({1}SC:U),I,0,0
-S:G$PSW$0$0({1}SC:U),I,0,0
-S:G$ACC$0$0({1}SC:U),I,0,0
-S:G$A$0$0({1}SC:U),I,0,0
-S:G$B$0$0({1}SC:U),I,0,0
-S:G$P0_0$0$0({1}SX:U),J,0,0
-S:G$P0_1$0$0({1}SX:U),J,0,0
-S:G$P0_2$0$0({1}SX:U),J,0,0
-S:G$P0_3$0$0({1}SX:U),J,0,0
-S:G$P0_4$0$0({1}SX:U),J,0,0
-S:G$P0_5$0$0({1}SX:U),J,0,0
-S:G$P0_6$0$0({1}SX:U),J,0,0
-S:G$P0_7$0$0({1}SX:U),J,0,0
-S:G$IT0$0$0({1}SX:U),J,0,0
-S:G$IE0$0$0({1}SX:U),J,0,0
-S:G$IT1$0$0({1}SX:U),J,0,0
-S:G$IE1$0$0({1}SX:U),J,0,0
-S:G$TR0$0$0({1}SX:U),J,0,0
-S:G$TF0$0$0({1}SX:U),J,0,0
-S:G$TR1$0$0({1}SX:U),J,0,0
-S:G$TF1$0$0({1}SX:U),J,0,0
-S:G$P1_0$0$0({1}SX:U),J,0,0
-S:G$P1_1$0$0({1}SX:U),J,0,0
-S:G$P1_2$0$0({1}SX:U),J,0,0
-S:G$P1_3$0$0({1}SX:U),J,0,0
-S:G$P1_4$0$0({1}SX:U),J,0,0
-S:G$P1_5$0$0({1}SX:U),J,0,0
-S:G$P1_6$0$0({1}SX:U),J,0,0
-S:G$P1_7$0$0({1}SX:U),J,0,0
-S:G$RI$0$0({1}SX:U),J,0,0
-S:G$TI$0$0({1}SX:U),J,0,0
-S:G$RB8$0$0({1}SX:U),J,0,0
-S:G$TB8$0$0({1}SX:U),J,0,0
-S:G$REN$0$0({1}SX:U),J,0,0
-S:G$SM2$0$0({1}SX:U),J,0,0
-S:G$SM1$0$0({1}SX:U),J,0,0
-S:G$SM0$0$0({1}SX:U),J,0,0
-S:G$P2_0$0$0({1}SX:U),J,0,0
-S:G$P2_1$0$0({1}SX:U),J,0,0
-S:G$P2_2$0$0({1}SX:U),J,0,0
-S:G$P2_3$0$0({1}SX:U),J,0,0
-S:G$P2_4$0$0({1}SX:U),J,0,0
-S:G$P2_5$0$0({1}SX:U),J,0,0
-S:G$P2_6$0$0({1}SX:U),J,0,0
-S:G$P2_7$0$0({1}SX:U),J,0,0
-S:G$EX0$0$0({1}SX:U),J,0,0
-S:G$ET0$0$0({1}SX:U),J,0,0
-S:G$EX1$0$0({1}SX:U),J,0,0
-S:G$ET1$0$0({1}SX:U),J,0,0
-S:G$ES$0$0({1}SX:U),J,0,0
-S:G$EA$0$0({1}SX:U),J,0,0
-S:G$P3_0$0$0({1}SX:U),J,0,0
-S:G$P3_1$0$0({1}SX:U),J,0,0
-S:G$P3_2$0$0({1}SX:U),J,0,0
-S:G$P3_3$0$0({1}SX:U),J,0,0
-S:G$P3_4$0$0({1}SX:U),J,0,0
-S:G$P3_5$0$0({1}SX:U),J,0,0
-S:G$P3_6$0$0({1}SX:U),J,0,0
-S:G$P3_7$0$0({1}SX:U),J,0,0
-S:G$RXD$0$0({1}SX:U),J,0,0
-S:G$TXD$0$0({1}SX:U),J,0,0
-S:G$INT0$0$0({1}SX:U),J,0,0
-S:G$INT1$0$0({1}SX:U),J,0,0
-S:G$T0$0$0({1}SX:U),J,0,0
-S:G$T1$0$0({1}SX:U),J,0,0
-S:G$WR$0$0({1}SX:U),J,0,0
-S:G$RD$0$0({1}SX:U),J,0,0
-S:G$PX0$0$0({1}SX:U),J,0,0
-S:G$PT0$0$0({1}SX:U),J,0,0
-S:G$PX1$0$0({1}SX:U),J,0,0
-S:G$PT1$0$0({1}SX:U),J,0,0
-S:G$PS$0$0({1}SX:U),J,0,0
-S:G$P$0$0({1}SX:U),J,0,0
-S:G$FL$0$0({1}SX:U),J,0,0
-S:G$OV$0$0({1}SX:U),J,0,0
-S:G$RS0$0$0({1}SX:U),J,0,0
-S:G$RS1$0$0({1}SX:U),J,0,0
-S:G$F0$0$0({1}SX:U),J,0,0
-S:G$AC$0$0({1}SX:U),J,0,0
-S:G$CY$0$0({1}SX:U),J,0,0
-S:G$main$0$0({2}DF,SI:S),C,0,0
-S:Fledmatrix$image$0$0({8}DA8,SC:S),D,0,0
diff --git a/demo/ledmatrix.asm b/demo/ledmatrix.asm
deleted file mode 100644
index d1b8e55..0000000
--- a/demo/ledmatrix.asm
+++ /dev/null
@@ -1,494 +0,0 @@
-;--------------------------------------------------------
-; File Created by SDCC : free open source ANSI-C Compiler
-; Version 2.9.0 #5416 (Oct 6 2009) (UNIX)
-; This file was generated Mon Oct 19 23:11:07 2009
-;--------------------------------------------------------
- .module ledmatrix
- .optsdcc -mmcs51 --model-small
-
-;--------------------------------------------------------
-; Public variables in this module
-;--------------------------------------------------------
- .globl _main
- .globl _CY
- .globl _AC
- .globl _F0
- .globl _RS1
- .globl _RS0
- .globl _OV
- .globl _FL
- .globl _P
- .globl _PS
- .globl _PT1
- .globl _PX1
- .globl _PT0
- .globl _PX0
- .globl _RD
- .globl _WR
- .globl _T1
- .globl _T0
- .globl _INT1
- .globl _INT0
- .globl _TXD
- .globl _RXD
- .globl _P3_7
- .globl _P3_6
- .globl _P3_5
- .globl _P3_4
- .globl _P3_3
- .globl _P3_2
- .globl _P3_1
- .globl _P3_0
- .globl _EA
- .globl _ES
- .globl _ET1
- .globl _EX1
- .globl _ET0
- .globl _EX0
- .globl _P2_7
- .globl _P2_6
- .globl _P2_5
- .globl _P2_4
- .globl _P2_3
- .globl _P2_2
- .globl _P2_1
- .globl _P2_0
- .globl _SM0
- .globl _SM1
- .globl _SM2
- .globl _REN
- .globl _TB8
- .globl _RB8
- .globl _TI
- .globl _RI
- .globl _P1_7
- .globl _P1_6
- .globl _P1_5
- .globl _P1_4
- .globl _P1_3
- .globl _P1_2
- .globl _P1_1
- .globl _P1_0
- .globl _TF1
- .globl _TR1
- .globl _TF0
- .globl _TR0
- .globl _IE1
- .globl _IT1
- .globl _IE0
- .globl _IT0
- .globl _P0_7
- .globl _P0_6
- .globl _P0_5
- .globl _P0_4
- .globl _P0_3
- .globl _P0_2
- .globl _P0_1
- .globl _P0_0
- .globl _B
- .globl _A
- .globl _ACC
- .globl _PSW
- .globl _IP
- .globl _P3
- .globl _IE
- .globl _P2
- .globl _SBUF
- .globl _SCON
- .globl _P1
- .globl _TH1
- .globl _TH0
- .globl _TL1
- .globl _TL0
- .globl _TMOD
- .globl _TCON
- .globl _PCON
- .globl _DPH
- .globl _DPL
- .globl _SP
- .globl _P0
-;--------------------------------------------------------
-; special function registers
-;--------------------------------------------------------
- .area RSEG (DATA)
-G$P0$0$0 == 0x0080
-_P0 = 0x0080
-G$SP$0$0 == 0x0081
-_SP = 0x0081
-G$DPL$0$0 == 0x0082
-_DPL = 0x0082
-G$DPH$0$0 == 0x0083
-_DPH = 0x0083
-G$PCON$0$0 == 0x0087
-_PCON = 0x0087
-G$TCON$0$0 == 0x0088
-_TCON = 0x0088
-G$TMOD$0$0 == 0x0089
-_TMOD = 0x0089
-G$TL0$0$0 == 0x008a
-_TL0 = 0x008a
-G$TL1$0$0 == 0x008b
-_TL1 = 0x008b
-G$TH0$0$0 == 0x008c
-_TH0 = 0x008c
-G$TH1$0$0 == 0x008d
-_TH1 = 0x008d
-G$P1$0$0 == 0x0090
-_P1 = 0x0090
-G$SCON$0$0 == 0x0098
-_SCON = 0x0098
-G$SBUF$0$0 == 0x0099
-_SBUF = 0x0099
-G$P2$0$0 == 0x00a0
-_P2 = 0x00a0
-G$IE$0$0 == 0x00a8
-_IE = 0x00a8
-G$P3$0$0 == 0x00b0
-_P3 = 0x00b0
-G$IP$0$0 == 0x00b8
-_IP = 0x00b8
-G$PSW$0$0 == 0x00d0
-_PSW = 0x00d0
-G$ACC$0$0 == 0x00e0
-_ACC = 0x00e0
-G$A$0$0 == 0x00e0
-_A = 0x00e0
-G$B$0$0 == 0x00f0
-_B = 0x00f0
-;--------------------------------------------------------
-; special function bits
-;--------------------------------------------------------
- .area RSEG (DATA)
-G$P0_0$0$0 == 0x0080
-_P0_0 = 0x0080
-G$P0_1$0$0 == 0x0081
-_P0_1 = 0x0081
-G$P0_2$0$0 == 0x0082
-_P0_2 = 0x0082
-G$P0_3$0$0 == 0x0083
-_P0_3 = 0x0083
-G$P0_4$0$0 == 0x0084
-_P0_4 = 0x0084
-G$P0_5$0$0 == 0x0085
-_P0_5 = 0x0085
-G$P0_6$0$0 == 0x0086
-_P0_6 = 0x0086
-G$P0_7$0$0 == 0x0087
-_P0_7 = 0x0087
-G$IT0$0$0 == 0x0088
-_IT0 = 0x0088
-G$IE0$0$0 == 0x0089
-_IE0 = 0x0089
-G$IT1$0$0 == 0x008a
-_IT1 = 0x008a
-G$IE1$0$0 == 0x008b
-_IE1 = 0x008b
-G$TR0$0$0 == 0x008c
-_TR0 = 0x008c
-G$TF0$0$0 == 0x008d
-_TF0 = 0x008d
-G$TR1$0$0 == 0x008e
-_TR1 = 0x008e
-G$TF1$0$0 == 0x008f
-_TF1 = 0x008f
-G$P1_0$0$0 == 0x0090
-_P1_0 = 0x0090
-G$P1_1$0$0 == 0x0091
-_P1_1 = 0x0091
-G$P1_2$0$0 == 0x0092
-_P1_2 = 0x0092
-G$P1_3$0$0 == 0x0093
-_P1_3 = 0x0093
-G$P1_4$0$0 == 0x0094
-_P1_4 = 0x0094
-G$P1_5$0$0 == 0x0095
-_P1_5 = 0x0095
-G$P1_6$0$0 == 0x0096
-_P1_6 = 0x0096
-G$P1_7$0$0 == 0x0097
-_P1_7 = 0x0097
-G$RI$0$0 == 0x0098
-_RI = 0x0098
-G$TI$0$0 == 0x0099
-_TI = 0x0099
-G$RB8$0$0 == 0x009a
-_RB8 = 0x009a
-G$TB8$0$0 == 0x009b
-_TB8 = 0x009b
-G$REN$0$0 == 0x009c
-_REN = 0x009c
-G$SM2$0$0 == 0x009d
-_SM2 = 0x009d
-G$SM1$0$0 == 0x009e
-_SM1 = 0x009e
-G$SM0$0$0 == 0x009f
-_SM0 = 0x009f
-G$P2_0$0$0 == 0x00a0
-_P2_0 = 0x00a0
-G$P2_1$0$0 == 0x00a1
-_P2_1 = 0x00a1
-G$P2_2$0$0 == 0x00a2
-_P2_2 = 0x00a2
-G$P2_3$0$0 == 0x00a3
-_P2_3 = 0x00a3
-G$P2_4$0$0 == 0x00a4
-_P2_4 = 0x00a4
-G$P2_5$0$0 == 0x00a5
-_P2_5 = 0x00a5
-G$P2_6$0$0 == 0x00a6
-_P2_6 = 0x00a6
-G$P2_7$0$0 == 0x00a7
-_P2_7 = 0x00a7
-G$EX0$0$0 == 0x00a8
-_EX0 = 0x00a8
-G$ET0$0$0 == 0x00a9
-_ET0 = 0x00a9
-G$EX1$0$0 == 0x00aa
-_EX1 = 0x00aa
-G$ET1$0$0 == 0x00ab
-_ET1 = 0x00ab
-G$ES$0$0 == 0x00ac
-_ES = 0x00ac
-G$EA$0$0 == 0x00af
-_EA = 0x00af
-G$P3_0$0$0 == 0x00b0
-_P3_0 = 0x00b0
-G$P3_1$0$0 == 0x00b1
-_P3_1 = 0x00b1
-G$P3_2$0$0 == 0x00b2
-_P3_2 = 0x00b2
-G$P3_3$0$0 == 0x00b3
-_P3_3 = 0x00b3
-G$P3_4$0$0 == 0x00b4
-_P3_4 = 0x00b4
-G$P3_5$0$0 == 0x00b5
-_P3_5 = 0x00b5
-G$P3_6$0$0 == 0x00b6
-_P3_6 = 0x00b6
-G$P3_7$0$0 == 0x00b7
-_P3_7 = 0x00b7
-G$RXD$0$0 == 0x00b0
-_RXD = 0x00b0
-G$TXD$0$0 == 0x00b1
-_TXD = 0x00b1
-G$INT0$0$0 == 0x00b2
-_INT0 = 0x00b2
-G$INT1$0$0 == 0x00b3
-_INT1 = 0x00b3
-G$T0$0$0 == 0x00b4
-_T0 = 0x00b4
-G$T1$0$0 == 0x00b5
-_T1 = 0x00b5
-G$WR$0$0 == 0x00b6
-_WR = 0x00b6
-G$RD$0$0 == 0x00b7
-_RD = 0x00b7
-G$PX0$0$0 == 0x00b8
-_PX0 = 0x00b8
-G$PT0$0$0 == 0x00b9
-_PT0 = 0x00b9
-G$PX1$0$0 == 0x00ba
-_PX1 = 0x00ba
-G$PT1$0$0 == 0x00bb
-_PT1 = 0x00bb
-G$PS$0$0 == 0x00bc
-_PS = 0x00bc
-G$P$0$0 == 0x00d0
-_P = 0x00d0
-G$FL$0$0 == 0x00d1
-_FL = 0x00d1
-G$OV$0$0 == 0x00d2
-_OV = 0x00d2
-G$RS0$0$0 == 0x00d3
-_RS0 = 0x00d3
-G$RS1$0$0 == 0x00d4
-_RS1 = 0x00d4
-G$F0$0$0 == 0x00d5
-_F0 = 0x00d5
-G$AC$0$0 == 0x00d6
-_AC = 0x00d6
-G$CY$0$0 == 0x00d7
-_CY = 0x00d7
-;--------------------------------------------------------
-; overlayable register banks
-;--------------------------------------------------------
- .area REG_BANK_0 (REL,OVR,DATA)
- .ds 8
-;--------------------------------------------------------
-; internal ram data
-;--------------------------------------------------------
- .area DSEG (DATA)
-;--------------------------------------------------------
-; overlayable items in internal ram
-;--------------------------------------------------------
- .area OSEG (OVR,DATA)
-;--------------------------------------------------------
-; Stack segment in internal ram
-;--------------------------------------------------------
- .area SSEG (DATA)
-__start__stack:
- .ds 1
-
-;--------------------------------------------------------
-; indirectly addressable internal ram data
-;--------------------------------------------------------
- .area ISEG (DATA)
-;--------------------------------------------------------
-; absolute internal ram data
-;--------------------------------------------------------
- .area IABS (ABS,DATA)
- .area IABS (ABS,DATA)
-;--------------------------------------------------------
-; bit data
-;--------------------------------------------------------
- .area BSEG (BIT)
-;--------------------------------------------------------
-; paged external ram data
-;--------------------------------------------------------
- .area PSEG (PAG,XDATA)
-;--------------------------------------------------------
-; external ram data
-;--------------------------------------------------------
- .area XSEG (XDATA)
-;--------------------------------------------------------
-; absolute external ram data
-;--------------------------------------------------------
- .area XABS (ABS,XDATA)
-;--------------------------------------------------------
-; external initialized ram data
-;--------------------------------------------------------
- .area XISEG (XDATA)
- .area HOME (CODE)
- .area GSINIT0 (CODE)
- .area GSINIT1 (CODE)
- .area GSINIT2 (CODE)
- .area GSINIT3 (CODE)
- .area GSINIT4 (CODE)
- .area GSINIT5 (CODE)
- .area GSINIT (CODE)
- .area GSFINAL (CODE)
- .area CSEG (CODE)
-;--------------------------------------------------------
-; interrupt vector
-;--------------------------------------------------------
- .area HOME (CODE)
-__interrupt_vect:
- ljmp __sdcc_gsinit_startup
-;--------------------------------------------------------
-; global & static initialisations
-;--------------------------------------------------------
- .area HOME (CODE)
- .area GSINIT (CODE)
- .area GSFINAL (CODE)
- .area GSINIT (CODE)
- .globl __sdcc_gsinit_startup
- .globl __sdcc_program_startup
- .globl __start__stack
- .globl __mcs51_genXINIT
- .globl __mcs51_genXRAMCLEAR
- .globl __mcs51_genRAMCLEAR
- .area GSFINAL (CODE)
- ljmp __sdcc_program_startup
-;--------------------------------------------------------
-; Home
-;--------------------------------------------------------
- .area HOME (CODE)
- .area HOME (CODE)
-__sdcc_program_startup:
- lcall _main
-; return from main will lock up
- sjmp .
-;--------------------------------------------------------
-; code
-;--------------------------------------------------------
- .area CSEG (CODE)
-;------------------------------------------------------------
-;Allocation info for local variables in function 'main'
-;------------------------------------------------------------
-;i Allocated to registers r2 r3
-;------------------------------------------------------------
- G$main$0$0 ==.
- C$ledmatrix.c$27$0$0 ==.
-; ledmatrix.c:27: int main()
-; -----------------------------------------
-; function main
-; -----------------------------------------
-_main:
- ar2 = 0x02
- ar3 = 0x03
- ar4 = 0x04
- ar5 = 0x05
- ar6 = 0x06
- ar7 = 0x07
- ar0 = 0x00
- ar1 = 0x01
- C$ledmatrix.c$30$1$1 ==.
-; ledmatrix.c:30: while(1) {
-00102$:
- C$ledmatrix.c$31$2$2 ==.
-; ledmatrix.c:31: for(i=0; i<8; i++) {
- mov r2,#0x00
- mov r3,#0x00
-00104$:
- clr c
- mov a,r2
- subb a,#0x08
- mov a,r3
- xrl a,#0x80
- subb a,#0x80
- jnc 00102$
- C$ledmatrix.c$32$3$3 ==.
-; ledmatrix.c:32: P1 = 0xff;
- mov _P1,#0xFF
- C$ledmatrix.c$33$3$3 ==.
-; ledmatrix.c:33: P0 = image[i];
- mov a,r2
- add a,#_image
- mov dpl,a
- mov a,r3
- addc a,#(_image >> 8)
- mov dph,a
- clr a
- movc a,@a+dptr
- mov _P0,a
- C$ledmatrix.c$34$3$3 ==.
-; ledmatrix.c:34: P1 = (1 << i) ^ 255;
- mov b,r2
- inc b
- mov r4,#0x01
- mov r5,#0x00
- sjmp 00115$
-00114$:
- mov a,r4
- add a,r4
- mov r4,a
- mov a,r5
- rlc a
- mov r5,a
-00115$:
- djnz b,00114$
- mov a,#0xFF
- xrl a,r4
- mov _P1,a
- C$ledmatrix.c$31$2$2 ==.
-; ledmatrix.c:31: for(i=0; i<8; i++) {
- inc r2
- cjne r2,#0x00,00104$
- inc r3
- C$ledmatrix.c$37$1$1 ==.
- XG$main$0$0 ==.
- sjmp 00104$
- .area CSEG (CODE)
- .area CONST (CODE)
-Fledmatrix$image$0$0 == .
-_image:
- .db #0xB1
- .db #0x9D
- .db #0xBD
- .db #0xB1
- .db #0xB7
- .db #0xB7
- .db #0x11
- .db #0xFF
- .area XINIT (CODE)
- .area CABS (ABS,CODE)
diff --git a/demo/ledmatrix.hex b/demo/ledmatrix.hex
deleted file mode 100644
index 339b4c0..0000000
--- a/demo/ledmatrix.hex
+++ /dev/null
@@ -1,26 +0,0 @@
-:03000000020008F3
-:0300610002000397
-:0500030012006480FE04
-:040064007A007B00A3
-:0E006800C3EA9408EB6480948050F17590FF19
-:0A007600EA24A7F582EB3400F583BD
-:0E008000E493F5808AF005F07C017D00800697
-:06008E00EC2CFCED33FD3B
-:0E009400D5F0F774FF6CF5900ABA00C80B8027
-:0100A200C598
-:0800A700B19DBDB1B7B711FF17
-:06003700E478FFF6D8FD9D
-:080015007900E94400601B7A48
-:05001D00009000AF7827
-:030022000075A0C6
-:0A00250000E493F2A308B8000205FE
-:08002F00A0D9F4DAF275A0FF7C
-:08003D007800E84400600A7934
-:030045000075A0A3
-:0600480000E4F309D8FCFE
-:08004E007800E84400600C7921
-:0B00560000900000E4F0A3D8FCD9FAF1
-:03000800758107F8
-:0A000B001200A3E582600302000367
-:0400A3007582002240
-:00000001FF
diff --git a/demo/ledmatrix.lnk b/demo/ledmatrix.lnk
deleted file mode 100644
index b4c7fe4..0000000
--- a/demo/ledmatrix.lnk
+++ /dev/null
@@ -1,19 +0,0 @@
--myuxi
--Y
--a 0x0100
--v 0x0000
--w 0x2000
--z
--b HOME = 0x0000
--b ISEG = 0x0000
--b BSEG = 0x0000
--k /usr/libexec/sdcc/../share/sdcc/lib/small
--k /usr/share/sdcc/lib/small
--l mcs51
--l libsdcc
--l libint
--l liblong
--l libfloat
-ledmatrix.rel
-
--e
diff --git a/demo/ledmatrix.lst b/demo/ledmatrix.lst
index 43d46a4..e96764e 100644
--- a/demo/ledmatrix.lst
+++ b/demo/ledmatrix.lst
@@ -1,7 +1,7 @@
1 ;--------------------------------------------------------
2 ; File Created by SDCC : free open source ANSI-C Compiler
- 3 ; Version 2.9.0 #5416 (Oct 6 2009) (UNIX)
- 4 ; This file was generated Mon Oct 19 23:11:07 2009
+ 3 ; Version 2.9.0 #5416 (Feb 3 2010) (UNIX)
+ 4 ; This file was generated Sun Dec 16 06:02:13 2012
5 ;--------------------------------------------------------
6 .module ledmatrix
7 .optsdcc -mmcs51 --model-small
diff --git a/demo/ledmatrix.m5ihib b/demo/ledmatrix.m5ihib
deleted file mode 100644
index 40d686b..0000000
--- a/demo/ledmatrix.m5ihib
+++ /dev/null
@@ -1,599 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<!--
- This is MCU 8051 IDE hibernation data file.
- It does not contain program code, only data.
-
- PLEASE DO NOT EDIT THIS FILE MANUALY, BECAUSE
- BAD FORMATING OF THIS FILE WILL LEAD MCU 8051 IDE TO CRASH !
--->
-<!DOCTYPE m5ihib [
-
- <!-- ROOT ELEMENT -->
- <!ELEMENT m5ihib (currentstate, subprograms, stepback)>
- <!-- Root element Parameters:
- version - File version
- datetime - Date and time of creation
- source_file - Souce code compiled and loaded in simulator before hibernation
- processor - Processor type
- xdata - Size of External data memory
- eeprom - Size of data EEPROM
- md5 - MD5 hash of the source code file
- -->
- <!ATTLIST m5ihib
- version CDATA #REQUIRED
- datetime CDATA #REQUIRED
- source_file CDATA #REQUIRED
- processor CDATA #REQUIRED
- xdata CDATA #REQUIRED
- eeprom CDATA #REQUIRED
- md5 CDATA #REQUIRED
- >
-
-
- <!-- Current state of MCU -->
- <!ELEMENT currentstate (iram, eram, xram, eeprom, sfr, special)>
-
- <!-- Internal data memory in decimal -->
- <!ELEMENT iram (#PCDATA)>
-
- <!-- Expanded data memory in decimal -->
- <!ELEMENT eram (#PCDATA)>
-
- <!-- External data memory in decimal -->
- <!ELEMENT xram (#PCDATA)>
-
- <!-- Data EEPROM in decimal -->
- <!ELEMENT eeprom (#PCDATA)>
-
- <!-- Special function registers -->
- <!ELEMENT sfr (addresses, values)>
-
- <!-- SFR decimal addresses in the same order as in tag values -->
- <!ELEMENT addresses (#PCDATA)>
-
- <!-- SFR decimal values in the same order as in tag values -->
- <!ELEMENT values (#PCDATA)>
-
- <!-- Special engine variables -->
- <!ELEMENT special (#PCDATA)>
-
-
- <!-- Content of list of active interrupts -->
- <!ELEMENT subprograms (sub)*>
- <!-- Parameters of tag "subprograms":
- count - Number of recorded subprograms
- -->
- <!ATTLIST subprograms
- count CDATA #REQUIRED
- >
-
- <!-- Active interrupt -->
- <!ELEMENT sub EMPTY>
- <!-- Parameters of tag "sub":
- source - Source address
- target - Target address
- type - Type
- -->
- <!ATTLIST sub
- source CDATA #REQUIRED
- target CDATA #REQUIRED
- type CDATA #REQUIRED
- >
-
-
- <!-- Stack for stepback function (backward stepping) -->
- <!ELEMENT stepback (step)*>
- <!-- Parameters of tag "stepback":
- stacklength - Number of recorded program steps
- -->
- <!ATTLIST stepback
- stacklength CDATA #REQUIRED
- >
-
- <!-- One program step -->
- <!ELEMENT step (spec, normal)>
-
- <!-- Special engine variables -->
- <!ELEMENT spec (#PCDATA)>
-
- <!-- Ordinary registers -->
- <!ELEMENT normal (reg)*>
-
- <!-- One register -->
- <!ELEMENT reg EMPTY>
- <!-- Parameters of tag "reg":
- type - Memory type (E == ERAM; I == IDATA; X == XDATA; S == SFR)
- addr - Register address
- val - Previous register value
- -->
- <!ATTLIST reg
- type CDATA #REQUIRED
- addr CDATA #REQUIRED
- val CDATA #REQUIRED
- >
-
-]>
-<m5ihib
- version="1.0"
- datetime="02/27/09 04:45:11"
- source_file="ledmatrix.c"
- processor="AT89C51"
- xdata="2809"
- eeprom="0"
- md5="517133F895352F3918C3E1250EA990A5">
- <currentstate>
- <iram>
- 0 0 0 0 0 0 0 0
- 6 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- </iram>
- <eram>
-
- </eram>
- <xram>
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0
- 0
- </xram>
- <eeprom>
-
- </eeprom>
- <sfr>
- <addresses>
- 152 135 153 136 137 138 139
- 140 176 141 240 160 224 144
- 208 128 129 130 409 131 184
- 168
- </addresses>
- <values>
- 0 0 247 0 0 0 0
- 0 255 0 0 255 0 255
- 0 255 9 0 120 0 0
- 0
- </values>
- </sfr>
- <special>
- 0 {255 255 255 255 0} 100 0 {} 0 0 0 0 415 415 {} 0 0 0 0 0 0 0 0 2
- </special>
- </currentstate>
- <subprograms count="1">
- <sub source="6" target="100" type="0"/>
- </subprograms>
- <stepback stacklength="10">
- <step>
- <spec>
- 0 {255 255 255 255 0} 61 0 {} 0 0 0 0 401 401 {} 0 0 0 0 0 0 0 0 1
- </spec><normal>
- <reg type="I" addr="0" val="0"/>
- </normal>
- </step>
- <step>
- <spec>
- 0 {255 255 255 255 0} 63 0 {} 0 0 0 0 402 402 {} 0 0 0 0 0 0 0 0 1
- </spec><normal>
- <reg type="S" addr="224" val="0"/>
- <reg type="S" addr="208" val="0"/>
- </normal>
- </step>
- <step>
- <spec>
- 0 {255 255 255 255 0} 64 0 {} 0 0 0 0 403 403 {} 0 0 0 0 0 0 0 0 1
- </spec><normal>
- <reg type="S" addr="224" val="0"/>
- <reg type="S" addr="208" val="0"/>
- </normal>
- </step>
- <step>
- <spec>
- 0 {255 255 255 255 0} 66 0 {} 0 0 0 0 404 404 {} 0 0 0 0 0 0 0 0 2
- </spec><normal>
- </normal>
- </step>
- <step>
- <spec>
- 0 {255 255 255 255 0} 78 0 {} 0 0 0 0 406 406 {} 0 0 0 0 0 0 0 0 1
- </spec><normal>
- <reg type="I" addr="0" val="0"/>
- </normal>
- </step>
- <step>
- <spec>
- 0 {255 255 255 255 0} 80 0 {} 0 0 0 0 407 407 {} 0 0 0 0 0 0 0 0 1
- </spec><normal>
- <reg type="S" addr="224" val="0"/>
- <reg type="S" addr="208" val="0"/>
- </normal>
- </step>
- <step>
- <spec>
- 0 {255 255 255 255 0} 81 0 {} 0 0 0 0 408 408 {} 0 0 0 0 0 0 0 0 1
- </spec><normal>
- <reg type="S" addr="224" val="0"/>
- <reg type="S" addr="208" val="0"/>
- </normal>
- </step>
- <step>
- <spec>
- 0 {255 255 255 255 0} 83 0 {} 0 0 0 0 409 409 {} 0 0 0 0 0 0 0 0 2
- </spec><normal>
- </normal>
- </step>
- <step>
- <spec>
- 0 {255 255 255 255 0} 97 0 {} 0 0 0 0 411 411 {} 0 0 0 0 0 0 0 0 2
- </spec><normal>
- </normal>
- </step>
- <step>
- <spec>
- 2 {255 255 255 255 0} 3 0 {} 0 0 0 0 413 413 {} 0 0 0 0 0 0 0 0 2
- </spec><normal>
- <reg type="S" addr="129" val="7"/>
- <reg type="I" addr="8" val="0"/>
- <reg type="I" addr="9" val="0"/>
- </normal>
- </step>
- </stepback>
-</m5ihib>
diff --git a/demo/ledmatrix.map b/demo/ledmatrix.map
deleted file mode 100644
index 0fdab15..0000000
--- a/demo/ledmatrix.map
+++ /dev/null
@@ -1,454 +0,0 @@
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-CABS 0000 0000 = 0. bytes (ABS,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:FFFFFF00 s_BSEG
- 0C:0000 l_BIT_BANK
- 0C:0000 l_BSEG
- 0C:0000 l_BSEG_BYTES
- 0C:0000 l_CABS
- 0C:0000 l_GSINIT
- 0C:0000 l_GSINIT1
- 0C:0000 l_GSINIT5
- 0C:0000 l_IABS
- 0C:0000 l_ISEG
- 0C:0000 l_OSEG
- 0C:0000 l_PSEG
- 0C:0000 l_REG_BANK_1
- 0C:0000 l_REG_BANK_2
- 0C:0000 l_REG_BANK_3
- 0C:0000 l_RSEG
- 0C:0000 l_XABS
- 0C:0000 l_XINIT
- 0C:0000 l_XISEG
- 0C:0000 l_XSEG
- 0C:0000 l__CODE
- 0C:0000 s_BSEG_BYTES
- 0C:0000 s_CABS
- 0C:0000 s_DSEG
- 0C:0000 s_HOME
- 0C:0000 s_IABS
- 0C:0000 s_ISEG
- 0C:0000 s_PSEG
- 0C:0000 s_REG_BANK_0
- 0C:0000 s_XABS
- 0C:0000 s_XISEG
- 0C:0000 s_XSEG
- 0C:0003 l_GSFINAL
- 0C:0003 l_GSINIT0
- 0C:0008 l_CONST
- 0C:0008 l_HOME
- 0C:0008 l_REG_BANK_0
- 0C:0008 s_GSINIT0
- 0C:0008 s_REG_BANK_1
- 0C:0008 s_RSEG
- 0C:0008 s_SSEG
- 0C:000A l_GSINIT2
- 0C:000B s_GSINIT1
- 0C:000B s_GSINIT2
- 0C:0010 s_REG_BANK_2
- 0C:0015 s_GSINIT3
- 0C:0018 s_BIT_BANK
- 0C:0018 s_OSEG
- 0C:0018 s_REG_BANK_3
- 0C:0020 s__CODE
- 0C:0022 l_GSINIT3
- 0C:002A l_GSINIT4
- 0C:0037 s_GSINIT4
- 0C:0043 l_CSEG
- 0C:0061 s_GSFINAL
- 0C:0061 s_GSINIT
- 0C:0061 s_GSINIT5
- 0C:0064 s_CSEG
- 0C:0080 l_DSEG
- 0C:00A7 s_CONST
- 0C:00AF s_XINIT
- 0C:00F8 l_SSEG
- 0C:0100 l_IRAM
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-. .ABS. 0000 0000 = 0. bytes (ABS,CON)
-
- Value Global
- -------- --------------------------------
- 0080 G$P0$0$0
- 0080 G$P0_0$0$0
- 0080 _P0
- 0080 _P0_0
- 0081 G$P0_1$0$0
- 0081 G$SP$0$0
- 0081 _P0_1
- 0081 _SP
- 0082 G$DPL$0$0
- 0082 G$P0_2$0$0
- 0082 _DPL
- 0082 _P0_2
- 0083 G$DPH$0$0
- 0083 G$P0_3$0$0
- 0083 _DPH
- 0083 _P0_3
- 0084 G$P0_4$0$0
- 0084 _P0_4
- 0085 G$P0_5$0$0
- 0085 _P0_5
- 0086 G$P0_6$0$0
- 0086 _P0_6
- 0087 G$P0_7$0$0
- 0087 G$PCON$0$0
- 0087 _P0_7
- 0087 _PCON
- 0088 G$IT0$0$0
- 0088 G$TCON$0$0
- 0088 _IT0
- 0088 _TCON
- 0089 G$IE0$0$0
- 0089 G$TMOD$0$0
- 0089 _IE0
- 0089 _TMOD
- 008A G$IT1$0$0
- 008A G$TL0$0$0
- 008A _IT1
- 008A _TL0
- 008B G$IE1$0$0
- 008B G$TL1$0$0
- 008B _IE1
- 008B _TL1
- 008C G$TH0$0$0
- 008C G$TR0$0$0
- 008C _TH0
- 008C _TR0
- 008D G$TF0$0$0
- 008D G$TH1$0$0
- 008D _TF0
- 008D _TH1
- 008E G$TR1$0$0
- 008E _TR1
- 008F G$TF1$0$0
- 008F _TF1
- 0090 G$P1$0$0
- 0090 G$P1_0$0$0
- 0090 _P1
- 0090 _P1_0
- 0091 G$P1_1$0$0
- 0091 _P1_1
- 0092 G$P1_2$0$0
- 0092 _P1_2
- 0093 G$P1_3$0$0
- 0093 _P1_3
- 0094 G$P1_4$0$0
- 0094 _P1_4
- 0095 G$P1_5$0$0
- 0095 _P1_5
- 0096 G$P1_6$0$0
- 0096 _P1_6
- 0097 G$P1_7$0$0
- 0097 _P1_7
- 0098 G$RI$0$0
- 0098 G$SCON$0$0
- 0098 _RI
- 0098 _SCON
- 0099 G$SBUF$0$0
- 0099 G$TI$0$0
- 0099 _SBUF
- 0099 _TI
- 009A G$RB8$0$0
- 009A _RB8
- 009B G$TB8$0$0
- 009B _TB8
- 009C G$REN$0$0
- 009C _REN
- 009D G$SM2$0$0
- 009D _SM2
- 009E G$SM1$0$0
- 009E _SM1
- 009F G$SM0$0$0
- 009F _SM0
- 00A0 G$P2$0$0
- 00A0 G$P2_0$0$0
- 00A0 _P2
- 00A0 _P2_0
- 00A0 __XPAGE
- 00A1 G$P2_1$0$0
- 00A1 _P2_1
- 00A2 G$P2_2$0$0
- 00A2 _P2_2
- 00A3 G$P2_3$0$0
- 00A3 _P2_3
- 00A4 G$P2_4$0$0
- 00A4 _P2_4
- 00A5 G$P2_5$0$0
- 00A5 _P2_5
- 00A6 G$P2_6$0$0
- 00A6 _P2_6
- 00A7 G$P2_7$0$0
- 00A7 _P2_7
- 00A8 G$EX0$0$0
- 00A8 G$IE$0$0
- 00A8 _EX0
- 00A8 _IE
- 00A9 G$ET0$0$0
- 00A9 _ET0
- 00AA G$EX1$0$0
- 00AA _EX1
- 00AB G$ET1$0$0
- 00AB _ET1
- 00AC G$ES$0$0
- 00AC _ES
- 00AF G$EA$0$0
- 00AF _EA
- 00B0 G$P3$0$0
- 00B0 G$P3_0$0$0
- 00B0 G$RXD$0$0
- 00B0 _P3
- 00B0 _P3_0
- 00B0 _RXD
- 00B1 G$P3_1$0$0
- 00B1 G$TXD$0$0
- 00B1 _P3_1
- 00B1 _TXD
- 00B2 G$INT0$0$0
- 00B2 G$P3_2$0$0
- 00B2 _INT0
- 00B2 _P3_2
- 00B3 G$INT1$0$0
- 00B3 G$P3_3$0$0
- 00B3 _INT1
- 00B3 _P3_3
- 00B4 G$P3_4$0$0
- 00B4 G$T0$0$0
- 00B4 _P3_4
- 00B4 _T0
- 00B5 G$P3_5$0$0
- 00B5 G$T1$0$0
- 00B5 _P3_5
- 00B5 _T1
- 00B6 G$P3_6$0$0
- 00B6 G$WR$0$0
- 00B6 _P3_6
- 00B6 _WR
- 00B7 G$P3_7$0$0
- 00B7 G$RD$0$0
- 00B7 _P3_7
- 00B7 _RD
- 00B8 G$IP$0$0
- 00B8 G$PX0$0$0
- 00B8 _IP
- 00B8 _PX0
- 00B9 G$PT0$0$0
- 00B9 _PT0
- 00BA G$PX1$0$0
- 00BA _PX1
- 00BB G$PT1$0$0
- 00BB _PT1
- 00BC G$PS$0$0
- 00BC _PS
- 00D0 G$P$0$0
- 00D0 G$PSW$0$0
- 00D0 _P
- 00D0 _PSW
- 00D1 G$FL$0$0
- 00D1 _FL
- 00D2 G$OV$0$0
- 00D2 _OV
- 00D3 G$RS0$0$0
- 00D3 _RS0
- 00D4 G$RS1$0$0
- 00D4 _RS1
- 00D5 G$F0$0$0
- 00D5 _F0
- 00D6 G$AC$0$0
- 00D6 _AC
- 00D7 G$CY$0$0
- 00D7 _CY
- 00E0 G$A$0$0
- 00E0 G$ACC$0$0
- 00E0 _A
- 00E0 _ACC
- 00F0 G$B$0$0
- 00F0 _B
-
-
-
-
-
-
-
-
-
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-SSEG 0008 00F8 = 248. bytes (REL,OVR)
-
- Value Global
- -------- --------------------------------
- 0008 __start__stack
-
-
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-HOME 0000 0008 = 8. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0000 A$ledmatrix$376
- 0C:0003 A$ledmatrix$398
- 0C:0003 __sdcc_program_startup
- 0C:0006 A$ledmatrix$400
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSINIT0 0008 0003 = 3. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0008 __sdcc_gsinit_startup
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSINIT3 0015 0022 = 34. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0015 __mcs51_genXINIT
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSINIT4 0037 002A = 42. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0037 __mcs51_genRAMCLEAR
- 0C:003D __mcs51_genXRAMCLEAR
-
-
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-GSFINAL 0061 0003 = 3. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0061 A$ledmatrix$391
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-CSEG 0064 0043 = 67. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:0064 A$ledmatrix$430
- 0C:0064 C$ledmatrix.c$27$0$0
- 0C:0064 C$ledmatrix.c$30$1$1
- 0C:0064 G$main$0$0
- 0C:0064 _main
- 0C:0066 A$ledmatrix$431
- 0C:0068 A$ledmatrix$433
- 0C:0069 A$ledmatrix$434
- 0C:006A A$ledmatrix$435
- 0C:006C A$ledmatrix$436
- 0C:006D A$ledmatrix$437
- 0C:006F A$ledmatrix$438
- 0C:0071 A$ledmatrix$439
- 0C:0073 A$ledmatrix$442
- 0C:0073 C$ledmatrix.c$32$3$3
- 0C:0076 A$ledmatrix$445
- 0C:0076 C$ledmatrix.c$33$3$3
- 0C:0077 A$ledmatrix$446
- 0C:0079 A$ledmatrix$447
- 0C:007B A$ledmatrix$448
- 0C:007C A$ledmatrix$449
- 0C:007E A$ledmatrix$450
- 0C:0080 A$ledmatrix$451
- 0C:0081 A$ledmatrix$452
- 0C:0082 A$ledmatrix$453
- 0C:0084 A$ledmatrix$456
- 0C:0084 C$ledmatrix.c$34$3$3
- 0C:0086 A$ledmatrix$457
- 0C:0088 A$ledmatrix$458
- 0C:008A A$ledmatrix$459
- 0C:008C A$ledmatrix$460
- 0C:008E A$ledmatrix$462
- 0C:008F A$ledmatrix$463
- 0C:0090 A$ledmatrix$464
- 0C:0091 A$ledmatrix$465
- 0C:0092 A$ledmatrix$466
- 0C:0093 A$ledmatrix$467
- 0C:0094 A$ledmatrix$469
- 0C:0097 A$ledmatrix$470
- 0C:0099 A$ledmatrix$471
- 0C:009A A$ledmatrix$472
- 0C:009C A$ledmatrix$475
- 0C:009C C$ledmatrix.c$31$2$2
- 0C:009D A$ledmatrix$476
- 0C:00A0 A$ledmatrix$477
- 0C:00A1 A$ledmatrix$480
- 0C:00A1 C$ledmatrix.c$37$1$1
- 0C:00A1 XG$main$0$0
- 0C:00A3 __sdcc_external_startup
-
-Hexadecimal
-
-Area Addr Size Decimal Bytes (Attributes)
--------------------------------- ---- ---- ------- ----- ------------
-CONST 00A7 0008 = 8. bytes (REL,CON,CODE)
-
- Value Global
- -------- --------------------------------
- 0C:00A7 Fledmatrix$image$0$0
-
- ASxxxx Linker V01.75 + NoICE + SDCC Feb 1999, page 1.
-
-Files Linked [ module(s) ]
-
-ledmatrix.rel
-
-Libraries Linked [ object file ]
-
-/usr/share/sdcc/lib/small/mcs51.lib [ crtclear.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtxinit.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtxclear.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtpagesfr.rel ]
-/usr/share/sdcc/lib/small/mcs51.lib [ crtstart.rel ]
-/usr/share/sdcc/lib/small/libsdcc.lib [ _startup.rel ]
-
- ASxxxx Linker V01.75 + NoICE + SDCC Feb 1999, page 2.
-
-User Base Address Definitions
-
-HOME = 0x0000
-ISEG = 0x0000
-BSEG = 0x0000
-
- \ No newline at end of file
diff --git a/demo/ledmatrix.mem b/demo/ledmatrix.mem
deleted file mode 100644
index 0275aa5..0000000
--- a/demo/ledmatrix.mem
+++ /dev/null
@@ -1,28 +0,0 @@
-Internal RAM layout:
- 0 1 2 3 4 5 6 7 8 9 A B C D E F
-0x00:|0|0|0|0|0|0|0|0|S|S|S|S|S|S|S|S|
-0x10:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x20:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x40:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x80:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0x90:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xa0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xb0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xc0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xd0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xe0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0xf0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
-0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute
-
-Stack starts at: 0x08 (sp set to 0x07) with 248 bytes available.
-
-Other memory:
- Name Start End Size Max
- ---------------- -------- -------- -------- --------
- PAGED EXT. RAM 0 0
- EXTERNAL RAM 0 0
- ROM/EPROM/FLASH 0x0000 0x00ae 175 8192
diff --git a/demo/ledmatrix.rel b/demo/ledmatrix.rel
deleted file mode 100644
index e4cdd26..0000000
--- a/demo/ledmatrix.rel
+++ /dev/null
@@ -1,328 +0,0 @@
-;!FILE ledmatrix.asm
-XH
-H 1A areas FD global symbols
-M ledmatrix
-O -mmcs51 --model-small
-S G$EX0$0$0 Def00A8
-S G$IT0$0$0 Def0088
-S G$TH1$0$0 Def008D
-S _P1 Def0090
-S _A Def00E0
-S G$RXD$0$0 Def00B0
-S G$EX1$0$0 Def00AA
-S G$TB8$0$0 Def009B
-S G$IT1$0$0 Def008A
-S G$IE$0$0 Def00A8
-S _P2 Def00A0
-S _B Def00F0
-S _SP Def0081
-S _P3 Def00B0
-S _PS Def00BC
-S G$TXD$0$0 Def00B1
-S G$SM0$0$0 Def009F
-S G$TL0$0$0 Def008A
-S _T0 Def00B4
-S G$SM1$0$0 Def009E
-S G$TL1$0$0 Def008B
-S _T1 Def00B5
-S _OV Def00D2
-S G$FL$0$0 Def00D1
-S G$SM2$0$0 Def009D
-S _ACC Def00E0
-S __mcs51_genRAMCLEAR Ref0000
-S G$PT0$0$0 Def00B9
-S G$RS0$0$0 Def00D3
-S G$PT1$0$0 Def00BB
-S _WR Def00B6
-S G$F0$0$0 Def00D5
-S G$RS1$0$0 Def00D4
-S G$RD$0$0 Def00B7
-S G$TR0$0$0 Def008C
-S G$TR1$0$0 Def008E
-S G$PX0$0$0 Def00B8
-S G$ES$0$0 Def00AC
-S G$PX1$0$0 Def00BA
-S G$IP$0$0 Def00B8
-S G$PSW$0$0 Def00D0
-S G$RI$0$0 Def0098
-S _P0_0 Def0080
-S G$CY$0$0 Def00D7
-S _PCON Def0087
-S _SBUF Def0099
-S _P0_1 Def0081
-S _P1_0 Def0090
-S _P Def00D0
-S G$TI$0$0 Def0099
-S _P0_2 Def0082
-S _P1_1 Def0091
-S _P2_0 Def00A0
-S _P0_3 Def0083
-S _P1_2 Def0092
-S _P2_1 Def00A1
-S _P3_0 Def00B0
-S _SCON Def0098
-S _P0_4 Def0084
-S _P1_3 Def0093
-S _P2_2 Def00A2
-S _P3_1 Def00B1
-S G$P0$0$0 Def0080
-S _TCON Def0088
-S _TMOD Def0089
-S _P0_5 Def0085
-S _P1_4 Def0094
-S _P2_3 Def00A3
-S _P3_2 Def00B2
-S G$A$0$0 Def00E0
-S G$P1$0$0 Def0090
-S _P0_6 Def0086
-S _P1_5 Def0095
-S _P2_4 Def00A4
-S _P3_3 Def00B3
-S G$B$0$0 Def00F0
-S G$P2$0$0 Def00A0
-S _P0_7 Def0087
-S _P1_6 Def0096
-S _P2_5 Def00A5
-S _P3_4 Def00B4
-S G$PS$0$0 Def00BC
-S G$P3$0$0 Def00B0
-S G$SP$0$0 Def0081
-S _P1_7 Def0097
-S _P2_6 Def00A6
-S _P3_5 Def00B5
-S G$T0$0$0 Def00B4
-S _P2_7 Def00A7
-S _P3_6 Def00B6
-S G$OV$0$0 Def00D2
-S G$T1$0$0 Def00B5
-S _P3_7 Def00B7
-S G$ACC$0$0 Def00E0
-S _INT0 Def00B2
-S _DPH Def0083
-S _INT1 Def00B3
-S G$WR$0$0 Def00B6
-S _IE0 Def0089
-S _IE1 Def008B
-S _DPL Def0082
-S G$P0_0$0$0 Def0080
-S G$P$0$0 Def00D0
-S G$P1_0$0$0 Def0090
-S G$P0_1$0$0 Def0081
-S G$SBUF$0$0 Def0099
-S G$PCON$0$0 Def0087
-S _AC Def00D6
-S G$P2_0$0$0 Def00A0
-S G$P1_1$0$0 Def0091
-S G$P0_2$0$0 Def0082
-S _REN Def009C
-S G$P3_0$0$0 Def00B0
-S G$P2_1$0$0 Def00A1
-S G$P1_2$0$0 Def0092
-S G$P0_3$0$0 Def0083
-S _EA Def00AF
-S G$P3_1$0$0 Def00B1
-S G$P2_2$0$0 Def00A2
-S G$P1_3$0$0 Def0093
-S G$P0_4$0$0 Def0084
-S G$SCON$0$0 Def0098
-S G$P3_2$0$0 Def00B2
-S G$P2_3$0$0 Def00A3
-S G$P1_4$0$0 Def0094
-S G$P0_5$0$0 Def0085
-S G$TMOD$0$0 Def0089
-S G$TCON$0$0 Def0088
-S G$P3_3$0$0 Def00B3
-S G$P2_4$0$0 Def00A4
-S G$P1_5$0$0 Def0095
-S G$P0_6$0$0 Def0086
-S _ET0 Def00A9
-S G$P3_4$0$0 Def00B4
-S G$P2_5$0$0 Def00A5
-S G$P1_6$0$0 Def0096
-S G$P0_7$0$0 Def0087
-S _TF0 Def008D
-S _ET1 Def00AB
-S G$P3_5$0$0 Def00B5
-S G$P2_6$0$0 Def00A6
-S G$P1_7$0$0 Def0097
-S _TF1 Def008F
-S G$P3_6$0$0 Def00B6
-S G$P2_7$0$0 Def00A7
-S _TH0 Def008C
-S _RB8 Def009A
-S __mcs51_genXINIT Ref0000
-S G$P3_7$0$0 Def00B7
-S _TH1 Def008D
-S _IT0 Def0088
-S _EX0 Def00A8
-S _IE Def00A8
-S _IT1 Def008A
-S _TB8 Def009B
-S _EX1 Def00AA
-S _RXD Def00B0
-S G$INT0$0$0 Def00B2
-S G$INT1$0$0 Def00B3
-S G$DPH$0$0 Def0083
-S _TL0 Def008A
-S _SM0 Def009F
-S _TXD Def00B1
-S _TL1 Def008B
-S _SM1 Def009E
-S G$IE0$0$0 Def0089
-S _SM2 Def009D
-S _FL Def00D1
-S G$IE1$0$0 Def008B
-S G$DPL$0$0 Def0082
-S _PT0 Def00B9
-S _PT1 Def00BB
-S _RS0 Def00D3
-S _TR0 Def008C
-S _RD Def00B7
-S _RS1 Def00D4
-S _F0 Def00D5
-S _TR1 Def008E
-S G$AC$0$0 Def00D6
-S _ES Def00AC
-S _PX0 Def00B8
-S G$REN$0$0 Def009C
-S _IP Def00B8
-S _PX1 Def00BA
-S G$EA$0$0 Def00AF
-S _PSW Def00D0
-S __sdcc_gsinit_startup Ref0000
-S _RI Def0098
-S _CY Def00D7
-S G$ET0$0$0 Def00A9
-S _TI Def0099
-S G$ET1$0$0 Def00AB
-S G$TF0$0$0 Def008D
-S G$TF1$0$0 Def008F
-S __mcs51_genXRAMCLEAR Ref0000
-S G$RB8$0$0 Def009A
-S G$TH0$0$0 Def008C
-S _P0 Def0080
-A _CODE size 0 flags 0 addr 0
-A RSEG size 0 flags 0 addr 0
-A REG_BANK_0 size 8 flags 4 addr 0
-A DSEG size 0 flags 0 addr 0
-A OSEG size 0 flags 4 addr 0
-A SSEG size 1 flags 0 addr 0
-S __start__stack Def0000
-A ISEG size 0 flags 0 addr 0
-A IABS size 0 flags 8 addr 0
-A BSEG size 0 flags 80 addr 0
-A PSEG size 0 flags 50 addr 0
-A XSEG size 0 flags 40 addr 0
-A XABS size 0 flags 48 addr 0
-A XISEG size 0 flags 40 addr 0
-A HOME size 8 flags 20 addr 0
-S A$ledmatrix$400 Def0006
-S A$ledmatrix$376 Def0000
-S A$ledmatrix$398 Def0003
-S __sdcc_program_startup Def0003
-A GSINIT0 size 0 flags 20 addr 0
-A GSINIT1 size 0 flags 20 addr 0
-A GSINIT2 size 0 flags 20 addr 0
-A GSINIT3 size 0 flags 20 addr 0
-A GSINIT4 size 0 flags 20 addr 0
-A GSINIT5 size 0 flags 20 addr 0
-A GSINIT size 0 flags 20 addr 0
-A GSFINAL size 3 flags 20 addr 0
-S A$ledmatrix$391 Def0000
-A CSEG size 3F flags 20 addr 0
-S _main Def0000
-S A$ledmatrix$430 Def0000
-S A$ledmatrix$431 Def0002
-S A$ledmatrix$450 Def001A
-S A$ledmatrix$460 Def0028
-S A$ledmatrix$451 Def001C
-S A$ledmatrix$442 Def000F
-S A$ledmatrix$433 Def0004
-S A$ledmatrix$470 Def0033
-S A$ledmatrix$452 Def001D
-S A$ledmatrix$434 Def0005
-S A$ledmatrix$480 Def003D
-S A$ledmatrix$471 Def0035
-S A$ledmatrix$462 Def002A
-S A$ledmatrix$453 Def001E
-S A$ledmatrix$435 Def0006
-S A$ledmatrix$472 Def0036
-S A$ledmatrix$463 Def002B
-S A$ledmatrix$445 Def0012
-S A$ledmatrix$436 Def0008
-S XG$main$0$0 Def003D
-S A$ledmatrix$464 Def002C
-S A$ledmatrix$446 Def0013
-S A$ledmatrix$437 Def0009
-S A$ledmatrix$465 Def002D
-S A$ledmatrix$456 Def0020
-S A$ledmatrix$447 Def0015
-S A$ledmatrix$438 Def000B
-S A$ledmatrix$475 Def0038
-S A$ledmatrix$466 Def002E
-S A$ledmatrix$457 Def0022
-S A$ledmatrix$448 Def0017
-S A$ledmatrix$439 Def000D
-S C$ledmatrix.c$30$1$1 Def0000
-S A$ledmatrix$476 Def0039
-S A$ledmatrix$467 Def002F
-S A$ledmatrix$458 Def0024
-S A$ledmatrix$449 Def0018
-S A$ledmatrix$477 Def003C
-S A$ledmatrix$459 Def0026
-S A$ledmatrix$469 Def0030
-S C$ledmatrix.c$31$2$2 Def0038
-S C$ledmatrix.c$27$0$0 Def0000
-S G$main$0$0 Def0000
-S C$ledmatrix.c$32$3$3 Def000F
-S C$ledmatrix.c$37$1$1 Def003D
-S C$ledmatrix.c$33$3$3 Def0012
-S C$ledmatrix.c$34$3$3 Def0020
-A CONST size 8 flags 20 addr 0
-S Fledmatrix$image$0$0 Def0000
-A XINIT size 0 flags 20 addr 0
-A CABS size 0 flags 28 addr 0
-T 00 00
-R 00 00 00 02
-T 00 00
-R 00 00 00 05
-T 00 00
-R 00 00 00 05
-T 00 00
-R 00 00 00 0D
-T 00 00 02 00 00
-R 00 00 00 0D 02 03 00 BA
-T 00 00 02 00 03
-R 00 00 00 15 00 03 00 0D
-T 00 03
-R 00 00 00 0D
-T 00 03 12 00 00 80 FE
-R 00 00 00 0D 00 03 00 16
-T 00 00
-R 00 00 00 16
-T 00 00
-R 00 00 00 16
-T 00 00 7A 00 7B 00
-R 00 00 00 16
-T 00 04
-R 00 00 00 16
-T 00 04 C3 EA 94 08 EB 64 80 94 80 50 F1 75 90 FF
-R 00 00 00 16
-T 00 12 EA 24 00 00 00 F5 82 EB 34 00 00 00 F5 83
-R 00 00 00 16 F1 01 04 00 17 F1 81 0B 00 17
-T 00 1C E4 93 F5 80 8A F0 05 F0 7C 01 7D 00 80 06
-R 00 00 00 16
-T 00 2A
-R 00 00 00 16
-T 00 2A EC 2C FC ED 33 FD
-R 00 00 00 16
-T 00 30
-R 00 00 00 16
-T 00 30 D5 F0 F7 74 FF 6C F5 90 0A BA 00 C8 0B 80
-R 00 00 00 16
-T 00 3E C5
-R 00 00 00 16
-T 00 00
-R 00 00 00 17
-T 00 00 B1 9D BD B1 B7 B7 11 FF
-R 00 00 00 17
diff --git a/demo/ledmatrix.rst b/demo/ledmatrix.rst
deleted file mode 100644
index 9a26795..0000000
--- a/demo/ledmatrix.rst
+++ /dev/null
@@ -1,494 +0,0 @@
- 1 ;--------------------------------------------------------
- 2 ; File Created by SDCC : free open source ANSI-C Compiler
- 3 ; Version 2.9.0 #5416 (Oct 6 2009) (UNIX)
- 4 ; This file was generated Mon Oct 19 23:11:07 2009
- 5 ;--------------------------------------------------------
- 6 .module ledmatrix
- 7 .optsdcc -mmcs51 --model-small
- 8
- 9 ;--------------------------------------------------------
- 10 ; Public variables in this module
- 11 ;--------------------------------------------------------
- 12 .globl _main
- 13 .globl _CY
- 14 .globl _AC
- 15 .globl _F0
- 16 .globl _RS1
- 17 .globl _RS0
- 18 .globl _OV
- 19 .globl _FL
- 20 .globl _P
- 21 .globl _PS
- 22 .globl _PT1
- 23 .globl _PX1
- 24 .globl _PT0
- 25 .globl _PX0
- 26 .globl _RD
- 27 .globl _WR
- 28 .globl _T1
- 29 .globl _T0
- 30 .globl _INT1
- 31 .globl _INT0
- 32 .globl _TXD
- 33 .globl _RXD
- 34 .globl _P3_7
- 35 .globl _P3_6
- 36 .globl _P3_5
- 37 .globl _P3_4
- 38 .globl _P3_3
- 39 .globl _P3_2
- 40 .globl _P3_1
- 41 .globl _P3_0
- 42 .globl _EA
- 43 .globl _ES
- 44 .globl _ET1
- 45 .globl _EX1
- 46 .globl _ET0
- 47 .globl _EX0
- 48 .globl _P2_7
- 49 .globl _P2_6
- 50 .globl _P2_5
- 51 .globl _P2_4
- 52 .globl _P2_3
- 53 .globl _P2_2
- 54 .globl _P2_1
- 55 .globl _P2_0
- 56 .globl _SM0
- 57 .globl _SM1
- 58 .globl _SM2
- 59 .globl _REN
- 60 .globl _TB8
- 61 .globl _RB8
- 62 .globl _TI
- 63 .globl _RI
- 64 .globl _P1_7
- 65 .globl _P1_6
- 66 .globl _P1_5
- 67 .globl _P1_4
- 68 .globl _P1_3
- 69 .globl _P1_2
- 70 .globl _P1_1
- 71 .globl _P1_0
- 72 .globl _TF1
- 73 .globl _TR1
- 74 .globl _TF0
- 75 .globl _TR0
- 76 .globl _IE1
- 77 .globl _IT1
- 78 .globl _IE0
- 79 .globl _IT0
- 80 .globl _P0_7
- 81 .globl _P0_6
- 82 .globl _P0_5
- 83 .globl _P0_4
- 84 .globl _P0_3
- 85 .globl _P0_2
- 86 .globl _P0_1
- 87 .globl _P0_0
- 88 .globl _B
- 89 .globl _A
- 90 .globl _ACC
- 91 .globl _PSW
- 92 .globl _IP
- 93 .globl _P3
- 94 .globl _IE
- 95 .globl _P2
- 96 .globl _SBUF
- 97 .globl _SCON
- 98 .globl _P1
- 99 .globl _TH1
- 100 .globl _TH0
- 101 .globl _TL1
- 102 .globl _TL0
- 103 .globl _TMOD
- 104 .globl _TCON
- 105 .globl _PCON
- 106 .globl _DPH
- 107 .globl _DPL
- 108 .globl _SP
- 109 .globl _P0
- 110 ;--------------------------------------------------------
- 111 ; special function registers
- 112 ;--------------------------------------------------------
- 113 .area RSEG (DATA)
- 0080 114 G$P0$0$0 == 0x0080
- 0080 115 _P0 = 0x0080
- 0081 116 G$SP$0$0 == 0x0081
- 0081 117 _SP = 0x0081
- 0082 118 G$DPL$0$0 == 0x0082
- 0082 119 _DPL = 0x0082
- 0083 120 G$DPH$0$0 == 0x0083
- 0083 121 _DPH = 0x0083
- 0087 122 G$PCON$0$0 == 0x0087
- 0087 123 _PCON = 0x0087
- 0088 124 G$TCON$0$0 == 0x0088
- 0088 125 _TCON = 0x0088
- 0089 126 G$TMOD$0$0 == 0x0089
- 0089 127 _TMOD = 0x0089
- 008A 128 G$TL0$0$0 == 0x008a
- 008A 129 _TL0 = 0x008a
- 008B 130 G$TL1$0$0 == 0x008b
- 008B 131 _TL1 = 0x008b
- 008C 132 G$TH0$0$0 == 0x008c
- 008C 133 _TH0 = 0x008c
- 008D 134 G$TH1$0$0 == 0x008d
- 008D 135 _TH1 = 0x008d
- 0090 136 G$P1$0$0 == 0x0090
- 0090 137 _P1 = 0x0090
- 0098 138 G$SCON$0$0 == 0x0098
- 0098 139 _SCON = 0x0098
- 0099 140 G$SBUF$0$0 == 0x0099
- 0099 141 _SBUF = 0x0099
- 00A0 142 G$P2$0$0 == 0x00a0
- 00A0 143 _P2 = 0x00a0
- 00A8 144 G$IE$0$0 == 0x00a8
- 00A8 145 _IE = 0x00a8
- 00B0 146 G$P3$0$0 == 0x00b0
- 00B0 147 _P3 = 0x00b0
- 00B8 148 G$IP$0$0 == 0x00b8
- 00B8 149 _IP = 0x00b8
- 00D0 150 G$PSW$0$0 == 0x00d0
- 00D0 151 _PSW = 0x00d0
- 00E0 152 G$ACC$0$0 == 0x00e0
- 00E0 153 _ACC = 0x00e0
- 00E0 154 G$A$0$0 == 0x00e0
- 00E0 155 _A = 0x00e0
- 00F0 156 G$B$0$0 == 0x00f0
- 00F0 157 _B = 0x00f0
- 158 ;--------------------------------------------------------
- 159 ; special function bits
- 160 ;--------------------------------------------------------
- 161 .area RSEG (DATA)
- 0080 162 G$P0_0$0$0 == 0x0080
- 0080 163 _P0_0 = 0x0080
- 0081 164 G$P0_1$0$0 == 0x0081
- 0081 165 _P0_1 = 0x0081
- 0082 166 G$P0_2$0$0 == 0x0082
- 0082 167 _P0_2 = 0x0082
- 0083 168 G$P0_3$0$0 == 0x0083
- 0083 169 _P0_3 = 0x0083
- 0084 170 G$P0_4$0$0 == 0x0084
- 0084 171 _P0_4 = 0x0084
- 0085 172 G$P0_5$0$0 == 0x0085
- 0085 173 _P0_5 = 0x0085
- 0086 174 G$P0_6$0$0 == 0x0086
- 0086 175 _P0_6 = 0x0086
- 0087 176 G$P0_7$0$0 == 0x0087
- 0087 177 _P0_7 = 0x0087
- 0088 178 G$IT0$0$0 == 0x0088
- 0088 179 _IT0 = 0x0088
- 0089 180 G$IE0$0$0 == 0x0089
- 0089 181 _IE0 = 0x0089
- 008A 182 G$IT1$0$0 == 0x008a
- 008A 183 _IT1 = 0x008a
- 008B 184 G$IE1$0$0 == 0x008b
- 008B 185 _IE1 = 0x008b
- 008C 186 G$TR0$0$0 == 0x008c
- 008C 187 _TR0 = 0x008c
- 008D 188 G$TF0$0$0 == 0x008d
- 008D 189 _TF0 = 0x008d
- 008E 190 G$TR1$0$0 == 0x008e
- 008E 191 _TR1 = 0x008e
- 008F 192 G$TF1$0$0 == 0x008f
- 008F 193 _TF1 = 0x008f
- 0090 194 G$P1_0$0$0 == 0x0090
- 0090 195 _P1_0 = 0x0090
- 0091 196 G$P1_1$0$0 == 0x0091
- 0091 197 _P1_1 = 0x0091
- 0092 198 G$P1_2$0$0 == 0x0092
- 0092 199 _P1_2 = 0x0092
- 0093 200 G$P1_3$0$0 == 0x0093
- 0093 201 _P1_3 = 0x0093
- 0094 202 G$P1_4$0$0 == 0x0094
- 0094 203 _P1_4 = 0x0094
- 0095 204 G$P1_5$0$0 == 0x0095
- 0095 205 _P1_5 = 0x0095
- 0096 206 G$P1_6$0$0 == 0x0096
- 0096 207 _P1_6 = 0x0096
- 0097 208 G$P1_7$0$0 == 0x0097
- 0097 209 _P1_7 = 0x0097
- 0098 210 G$RI$0$0 == 0x0098
- 0098 211 _RI = 0x0098
- 0099 212 G$TI$0$0 == 0x0099
- 0099 213 _TI = 0x0099
- 009A 214 G$RB8$0$0 == 0x009a
- 009A 215 _RB8 = 0x009a
- 009B 216 G$TB8$0$0 == 0x009b
- 009B 217 _TB8 = 0x009b
- 009C 218 G$REN$0$0 == 0x009c
- 009C 219 _REN = 0x009c
- 009D 220 G$SM2$0$0 == 0x009d
- 009D 221 _SM2 = 0x009d
- 009E 222 G$SM1$0$0 == 0x009e
- 009E 223 _SM1 = 0x009e
- 009F 224 G$SM0$0$0 == 0x009f
- 009F 225 _SM0 = 0x009f
- 00A0 226 G$P2_0$0$0 == 0x00a0
- 00A0 227 _P2_0 = 0x00a0
- 00A1 228 G$P2_1$0$0 == 0x00a1
- 00A1 229 _P2_1 = 0x00a1
- 00A2 230 G$P2_2$0$0 == 0x00a2
- 00A2 231 _P2_2 = 0x00a2
- 00A3 232 G$P2_3$0$0 == 0x00a3
- 00A3 233 _P2_3 = 0x00a3
- 00A4 234 G$P2_4$0$0 == 0x00a4
- 00A4 235 _P2_4 = 0x00a4
- 00A5 236 G$P2_5$0$0 == 0x00a5
- 00A5 237 _P2_5 = 0x00a5
- 00A6 238 G$P2_6$0$0 == 0x00a6
- 00A6 239 _P2_6 = 0x00a6
- 00A7 240 G$P2_7$0$0 == 0x00a7
- 00A7 241 _P2_7 = 0x00a7
- 00A8 242 G$EX0$0$0 == 0x00a8
- 00A8 243 _EX0 = 0x00a8
- 00A9 244 G$ET0$0$0 == 0x00a9
- 00A9 245 _ET0 = 0x00a9
- 00AA 246 G$EX1$0$0 == 0x00aa
- 00AA 247 _EX1 = 0x00aa
- 00AB 248 G$ET1$0$0 == 0x00ab
- 00AB 249 _ET1 = 0x00ab
- 00AC 250 G$ES$0$0 == 0x00ac
- 00AC 251 _ES = 0x00ac
- 00AF 252 G$EA$0$0 == 0x00af
- 00AF 253 _EA = 0x00af
- 00B0 254 G$P3_0$0$0 == 0x00b0
- 00B0 255 _P3_0 = 0x00b0
- 00B1 256 G$P3_1$0$0 == 0x00b1
- 00B1 257 _P3_1 = 0x00b1
- 00B2 258 G$P3_2$0$0 == 0x00b2
- 00B2 259 _P3_2 = 0x00b2
- 00B3 260 G$P3_3$0$0 == 0x00b3
- 00B3 261 _P3_3 = 0x00b3
- 00B4 262 G$P3_4$0$0 == 0x00b4
- 00B4 263 _P3_4 = 0x00b4
- 00B5 264 G$P3_5$0$0 == 0x00b5
- 00B5 265 _P3_5 = 0x00b5
- 00B6 266 G$P3_6$0$0 == 0x00b6
- 00B6 267 _P3_6 = 0x00b6
- 00B7 268 G$P3_7$0$0 == 0x00b7
- 00B7 269 _P3_7 = 0x00b7
- 00B0 270 G$RXD$0$0 == 0x00b0
- 00B0 271 _RXD = 0x00b0
- 00B1 272 G$TXD$0$0 == 0x00b1
- 00B1 273 _TXD = 0x00b1
- 00B2 274 G$INT0$0$0 == 0x00b2
- 00B2 275 _INT0 = 0x00b2
- 00B3 276 G$INT1$0$0 == 0x00b3
- 00B3 277 _INT1 = 0x00b3
- 00B4 278 G$T0$0$0 == 0x00b4
- 00B4 279 _T0 = 0x00b4
- 00B5 280 G$T1$0$0 == 0x00b5
- 00B5 281 _T1 = 0x00b5
- 00B6 282 G$WR$0$0 == 0x00b6
- 00B6 283 _WR = 0x00b6
- 00B7 284 G$RD$0$0 == 0x00b7
- 00B7 285 _RD = 0x00b7
- 00B8 286 G$PX0$0$0 == 0x00b8
- 00B8 287 _PX0 = 0x00b8
- 00B9 288 G$PT0$0$0 == 0x00b9
- 00B9 289 _PT0 = 0x00b9
- 00BA 290 G$PX1$0$0 == 0x00ba
- 00BA 291 _PX1 = 0x00ba
- 00BB 292 G$PT1$0$0 == 0x00bb
- 00BB 293 _PT1 = 0x00bb
- 00BC 294 G$PS$0$0 == 0x00bc
- 00BC 295 _PS = 0x00bc
- 00D0 296 G$P$0$0 == 0x00d0
- 00D0 297 _P = 0x00d0
- 00D1 298 G$FL$0$0 == 0x00d1
- 00D1 299 _FL = 0x00d1
- 00D2 300 G$OV$0$0 == 0x00d2
- 00D2 301 _OV = 0x00d2
- 00D3 302 G$RS0$0$0 == 0x00d3
- 00D3 303 _RS0 = 0x00d3
- 00D4 304 G$RS1$0$0 == 0x00d4
- 00D4 305 _RS1 = 0x00d4
- 00D5 306 G$F0$0$0 == 0x00d5
- 00D5 307 _F0 = 0x00d5
- 00D6 308 G$AC$0$0 == 0x00d6
- 00D6 309 _AC = 0x00d6
- 00D7 310 G$CY$0$0 == 0x00d7
- 00D7 311 _CY = 0x00d7
- 312 ;--------------------------------------------------------
- 313 ; overlayable register banks
- 314 ;--------------------------------------------------------
- 315 .area REG_BANK_0 (REL,OVR,DATA)
- 0000 316 .ds 8
- 317 ;--------------------------------------------------------
- 318 ; internal ram data
- 319 ;--------------------------------------------------------
- 320 .area DSEG (DATA)
- 321 ;--------------------------------------------------------
- 322 ; overlayable items in internal ram
- 323 ;--------------------------------------------------------
- 324 .area OSEG (OVR,DATA)
- 325 ;--------------------------------------------------------
- 326 ; Stack segment in internal ram
- 327 ;--------------------------------------------------------
- 328 .area SSEG (DATA)
- 0008 329 __start__stack:
- 0008 330 .ds 1
- 331
- 332 ;--------------------------------------------------------
- 333 ; indirectly addressable internal ram data
- 334 ;--------------------------------------------------------
- 335 .area ISEG (DATA)
- 336 ;--------------------------------------------------------
- 337 ; absolute internal ram data
- 338 ;--------------------------------------------------------
- 339 .area IABS (ABS,DATA)
- 340 .area IABS (ABS,DATA)
- 341 ;--------------------------------------------------------
- 342 ; bit data
- 343 ;--------------------------------------------------------
- 344 .area BSEG (BIT)
- 345 ;--------------------------------------------------------
- 346 ; paged external ram data
- 347 ;--------------------------------------------------------
- 348 .area PSEG (PAG,XDATA)
- 349 ;--------------------------------------------------------
- 350 ; external ram data
- 351 ;--------------------------------------------------------
- 352 .area XSEG (XDATA)
- 353 ;--------------------------------------------------------
- 354 ; absolute external ram data
- 355 ;--------------------------------------------------------
- 356 .area XABS (ABS,XDATA)
- 357 ;--------------------------------------------------------
- 358 ; external initialized ram data
- 359 ;--------------------------------------------------------
- 360 .area XISEG (XDATA)
- 361 .area HOME (CODE)
- 362 .area GSINIT0 (CODE)
- 363 .area GSINIT1 (CODE)
- 364 .area GSINIT2 (CODE)
- 365 .area GSINIT3 (CODE)
- 366 .area GSINIT4 (CODE)
- 367 .area GSINIT5 (CODE)
- 368 .area GSINIT (CODE)
- 369 .area GSFINAL (CODE)
- 370 .area CSEG (CODE)
- 371 ;--------------------------------------------------------
- 372 ; interrupt vector
- 373 ;--------------------------------------------------------
- 374 .area HOME (CODE)
- 0000 375 __interrupt_vect:
- 0000 02 00 08 376 ljmp __sdcc_gsinit_startup
- 377 ;--------------------------------------------------------
- 378 ; global & static initialisations
- 379 ;--------------------------------------------------------
- 380 .area HOME (CODE)
- 381 .area GSINIT (CODE)
- 382 .area GSFINAL (CODE)
- 383 .area GSINIT (CODE)
- 384 .globl __sdcc_gsinit_startup
- 385 .globl __sdcc_program_startup
- 386 .globl __start__stack
- 387 .globl __mcs51_genXINIT
- 388 .globl __mcs51_genXRAMCLEAR
- 389 .globl __mcs51_genRAMCLEAR
- 390 .area GSFINAL (CODE)
- 0061 02 00 03 391 ljmp __sdcc_program_startup
- 392 ;--------------------------------------------------------
- 393 ; Home
- 394 ;--------------------------------------------------------
- 395 .area HOME (CODE)
- 396 .area HOME (CODE)
- 0003 397 __sdcc_program_startup:
- 0003 12 00 64 398 lcall _main
- 399 ; return from main will lock up
- 0006 80 FE 400 sjmp .
- 401 ;--------------------------------------------------------
- 402 ; code
- 403 ;--------------------------------------------------------
- 404 .area CSEG (CODE)
- 405 ;------------------------------------------------------------
- 406 ;Allocation info for local variables in function 'main'
- 407 ;------------------------------------------------------------
- 408 ;i Allocated to registers r2 r3
- 409 ;------------------------------------------------------------
- 0000 410 G$main$0$0 ==.
- 0000 411 C$ledmatrix.c$27$0$0 ==.
- 412 ; ledmatrix.c:27: int main()
- 413 ; -----------------------------------------
- 414 ; function main
- 415 ; -----------------------------------------
- 0064 416 _main:
- 0002 417 ar2 = 0x02
- 0003 418 ar3 = 0x03
- 0004 419 ar4 = 0x04
- 0005 420 ar5 = 0x05
- 0006 421 ar6 = 0x06
- 0007 422 ar7 = 0x07
- 0000 423 ar0 = 0x00
- 0001 424 ar1 = 0x01
- 0000 425 C$ledmatrix.c$30$1$1 ==.
- 426 ; ledmatrix.c:30: while(1) {
- 0064 427 00102$:
- 0000 428 C$ledmatrix.c$31$2$2 ==.
- 429 ; ledmatrix.c:31: for(i=0; i<8; i++) {
- 0064 7A 00 430 mov r2,#0x00
- 0066 7B 00 431 mov r3,#0x00
- 0068 432 00104$:
- 0068 C3 433 clr c
- 0069 EA 434 mov a,r2
- 006A 94 08 435 subb a,#0x08
- 006C EB 436 mov a,r3
- 006D 64 80 437 xrl a,#0x80
- 006F 94 80 438 subb a,#0x80
- 0071 50 F1 439 jnc 00102$
- 000F 440 C$ledmatrix.c$32$3$3 ==.
- 441 ; ledmatrix.c:32: P1 = 0xff;
- 0073 75 90 FF 442 mov _P1,#0xFF
- 0012 443 C$ledmatrix.c$33$3$3 ==.
- 444 ; ledmatrix.c:33: P0 = image[i];
- 0076 EA 445 mov a,r2
- 0077 24 A7 446 add a,#_image
- 0079 F5 82 447 mov dpl,a
- 007B EB 448 mov a,r3
- 007C 34 00 449 addc a,#(_image >> 8)
- 007E F5 83 450 mov dph,a
- 0080 E4 451 clr a
- 0081 93 452 movc a,@a+dptr
- 0082 F5 80 453 mov _P0,a
- 0020 454 C$ledmatrix.c$34$3$3 ==.
- 455 ; ledmatrix.c:34: P1 = (1 << i) ^ 255;
- 0084 8A F0 456 mov b,r2
- 0086 05 F0 457 inc b
- 0088 7C 01 458 mov r4,#0x01
- 008A 7D 00 459 mov r5,#0x00
- 008C 80 06 460 sjmp 00115$
- 008E 461 00114$:
- 008E EC 462 mov a,r4
- 008F 2C 463 add a,r4
- 0090 FC 464 mov r4,a
- 0091 ED 465 mov a,r5
- 0092 33 466 rlc a
- 0093 FD 467 mov r5,a
- 0094 468 00115$:
- 0094 D5 F0 F7 469 djnz b,00114$
- 0097 74 FF 470 mov a,#0xFF
- 0099 6C 471 xrl a,r4
- 009A F5 90 472 mov _P1,a
- 0038 473 C$ledmatrix.c$31$2$2 ==.
- 474 ; ledmatrix.c:31: for(i=0; i<8; i++) {
- 009C 0A 475 inc r2
- 009D BA 00 C8 476 cjne r2,#0x00,00104$
- 00A0 0B 477 inc r3
- 003D 478 C$ledmatrix.c$37$1$1 ==.
- 003D 479 XG$main$0$0 ==.
- 00A1 80 C5 480 sjmp 00104$
- 481 .area CSEG (CODE)
- 482 .area CONST (CODE)
- 0000 483 Fledmatrix$image$0$0 == .
- 00A7 484 _image:
- 00A7 B1 485 .db #0xB1
- 00A8 9D 486 .db #0x9D
- 00A9 BD 487 .db #0xBD
- 00AA B1 488 .db #0xB1
- 00AB B7 489 .db #0xB7
- 00AC B7 490 .db #0xB7
- 00AD 11 491 .db #0x11
- 00AE FF 492 .db #0xFF
- 493 .area XINIT (CODE)
- 494 .area CABS (ABS,CODE)
diff --git a/demo/ledmatrix.sym b/demo/ledmatrix.sym
deleted file mode 100644
index e61476a..0000000
--- a/demo/ledmatrix.sym
+++ /dev/null
@@ -1,634 +0,0 @@
- ASxxxx Assembler V01.70 + NoICE + SDCC mods + Flat24 Feb-1999 (Intel 8051), page 1.
-
-Symbol Table
-
- A 00D6
- D A$ledmatrix$376 0000 GR
- 15 A$ledmatrix$391 0000 GR
- D A$ledmatrix$398 0003 GR
- D A$ledmatrix$400 0006 GR
- 16 A$ledmatrix$430 0000 GR
- 16 A$ledmatrix$431 0002 GR
- 16 A$ledmatrix$433 0004 GR
- 16 A$ledmatrix$434 0005 GR
- 16 A$ledmatrix$435 0006 GR
- 16 A$ledmatrix$436 0008 GR
- 16 A$ledmatrix$437 0009 GR
- 16 A$ledmatrix$438 000B GR
- 16 A$ledmatrix$439 000D GR
- 16 A$ledmatrix$442 000F GR
- 16 A$ledmatrix$445 0012 GR
- 16 A$ledmatrix$446 0013 GR
- 16 A$ledmatrix$447 0015 GR
- 16 A$ledmatrix$448 0017 GR
- 16 A$ledmatrix$449 0018 GR
- 16 A$ledmatrix$450 001A GR
- 16 A$ledmatrix$451 001C GR
- 16 A$ledmatrix$452 001D GR
- 16 A$ledmatrix$453 001E GR
- 16 A$ledmatrix$456 0020 GR
- 16 A$ledmatrix$457 0022 GR
- 16 A$ledmatrix$458 0024 GR
- 16 A$ledmatrix$459 0026 GR
- 16 A$ledmatrix$460 0028 GR
- 16 A$ledmatrix$462 002A GR
- 16 A$ledmatrix$463 002B GR
- 16 A$ledmatrix$464 002C GR
- 16 A$ledmatrix$465 002D GR
- 16 A$ledmatrix$466 002E GR
- 16 A$ledmatrix$467 002F GR
- 16 A$ledmatrix$469 0030 GR
- 16 A$ledmatrix$470 0033 GR
- 16 A$ledmatrix$471 0035 GR
- 16 A$ledmatrix$472 0036 GR
- 16 A$ledmatrix$475 0038 GR
- 16 A$ledmatrix$476 0039 GR
- 16 A$ledmatrix$477 003C GR
- 16 A$ledmatrix$480 003D GR
- AC 00D6
- ACC 00E0
- ACC.0 00E0
- ACC.1 00E1
- ACC.2 00E2
- ACC.3 00E3
- ACC.4 00E4
- ACC.5 00E5
- ACC.6 00E6
- ACC.7 00E7
- B 00F0
- B.0 00F0
- B.1 00F1
- B.2 00F2
- B.3 00F3
- B.4 00F4
- B.5 00F5
- B.6 00F6
- B.7 00F7
- 16 C$ledmatrix.c$27$0$0 = 0000 GR
- 16 C$ledmatrix.c$30$1$1 = 0000 GR
- 16 C$ledmatrix.c$31$2$2 = 0038 GR
- 16 C$ledmatrix.c$32$3$3 = 000F GR
- 16 C$ledmatrix.c$33$3$3 = 0012 GR
- 16 C$ledmatrix.c$34$3$3 = 0020 GR
- 16 C$ledmatrix.c$37$1$1 = 003D GR
- CPRL2 00C8
- CT2 00C9
- CY 00D7
- DPH 0083
- DPL 0082
- EA 00AF
- ES 00AC
- ET0 00A9
- ET1 00AB
- ET2 00AD
- EX0 00A8
- EX1 00AA
- EXEN2 00CB
- EXF2 00CE
- F0 00D5
- 17 Fledmatrix$image$0$0 = 0000 GR
- G$A$0$0 = 00E0 G
- G$AC$0$0 = 00D6 G
- G$ACC$0$0 = 00E0 G
- G$B$0$0 = 00F0 G
- G$CY$0$0 = 00D7 G
- G$DPH$0$0 = 0083 G
- G$DPL$0$0 = 0082 G
- G$EA$0$0 = 00AF G
- G$ES$0$0 = 00AC G
- G$ET0$0$0 = 00A9 G
- G$ET1$0$0 = 00AB G
- G$EX0$0$0 = 00A8 G
- G$EX1$0$0 = 00AA G
- G$F0$0$0 = 00D5 G
- G$FL$0$0 = 00D1 G
- G$IE$0$0 = 00A8 G
- G$IE0$0$0 = 0089 G
- G$IE1$0$0 = 008B G
- G$INT0$0$0 = 00B2 G
- G$INT1$0$0 = 00B3 G
- G$IP$0$0 = 00B8 G
- G$IT0$0$0 = 0088 G
- G$IT1$0$0 = 008A G
- G$OV$0$0 = 00D2 G
- G$P$0$0 = 00D0 G
- G$P0$0$0 = 0080 G
- G$P0_0$0$0 = 0080 G
- G$P0_1$0$0 = 0081 G
- G$P0_2$0$0 = 0082 G
- G$P0_3$0$0 = 0083 G
- G$P0_4$0$0 = 0084 G
- G$P0_5$0$0 = 0085 G
- G$P0_6$0$0 = 0086 G
- G$P0_7$0$0 = 0087 G
- G$P1$0$0 = 0090 G
- G$P1_0$0$0 = 0090 G
- G$P1_1$0$0 = 0091 G
- G$P1_2$0$0 = 0092 G
- G$P1_3$0$0 = 0093 G
- G$P1_4$0$0 = 0094 G
- G$P1_5$0$0 = 0095 G
- G$P1_6$0$0 = 0096 G
- G$P1_7$0$0 = 0097 G
- G$P2$0$0 = 00A0 G
- G$P2_0$0$0 = 00A0 G
- G$P2_1$0$0 = 00A1 G
- G$P2_2$0$0 = 00A2 G
- G$P2_3$0$0 = 00A3 G
- G$P2_4$0$0 = 00A4 G
- G$P2_5$0$0 = 00A5 G
- G$P2_6$0$0 = 00A6 G
- G$P2_7$0$0 = 00A7 G
- G$P3$0$0 = 00B0 G
- G$P3_0$0$0 = 00B0 G
- G$P3_1$0$0 = 00B1 G
- G$P3_2$0$0 = 00B2 G
- G$P3_3$0$0 = 00B3 G
- G$P3_4$0$0 = 00B4 G
- G$P3_5$0$0 = 00B5 G
- G$P3_6$0$0 = 00B6 G
- G$P3_7$0$0 = 00B7 G
- G$PCON$0$0 = 0087 G
- G$PS$0$0 = 00BC G
- G$PSW$0$0 = 00D0 G
- G$PT0$0$0 = 00B9 G
- G$PT1$0$0 = 00BB G
- G$PX0$0$0 = 00B8 G
- G$PX1$0$0 = 00BA G
- G$RB8$0$0 = 009A G
- G$RD$0$0 = 00B7 G
- G$REN$0$0 = 009C G
- G$RI$0$0 = 0098 G
- G$RS0$0$0 = 00D3 G
- G$RS1$0$0 = 00D4 G
- G$RXD$0$0 = 00B0 G
- G$SBUF$0$0 = 0099 G
- G$SCON$0$0 = 0098 G
- G$SM0$0$0 = 009F G
- G$SM1$0$0 = 009E G
- G$SM2$0$0 = 009D G
- G$SP$0$0 = 0081 G
- G$T0$0$0 = 00B4 G
- G$T1$0$0 = 00B5 G
- G$TB8$0$0 = 009B G
- G$TCON$0$0 = 0088 G
- G$TF0$0$0 = 008D G
- G$TF1$0$0 = 008F G
- G$TH0$0$0 = 008C G
- G$TH1$0$0 = 008D G
- G$TI$0$0 = 0099 G
- G$TL0$0$0 = 008A G
- G$TL1$0$0 = 008B G
- G$TMOD$0$0 = 0089 G
- G$TR0$0$0 = 008C G
- G$TR1$0$0 = 008E G
- G$TXD$0$0 = 00B1 G
- G$WR$0$0 = 00B6 G
- 16 G$main$0$0 = 0000 GR
- IE 00A8
- IE.0 00A8
- IE.1 00A9
- IE.2 00AA
- IE.3 00AB
- IE.4 00AC
- IE.5 00AD
- IE.7 00AF
- IE0 0089
- IE1 008B
- INT0 00B2
- INT1 00B3
- IP 00B8
- IP.0 00B8
- IP.1 00B9
- IP.2 00BA
- IP.3 00BB
- IP.4 00BC
- IP.5 00BD
- IT0 0088
- IT1 008A
- OV 00D2
- P 00D0
- P0 0080
- P0.0 0080
- P0.1 0081
- P0.2 0082
- P0.3 0083
- P0.4 0084
- P0.5 0085
- P0.6 0086
- P0.7 0087
- P1 0090
- P1.0 0090
- P1.1 0091
- P1.2 0092
- P1.3 0093
- P1.4 0094
- P1.5 0095
- P1.6 0096
- P1.7 0097
- P2 00A0
- P2.0 00A0
- P2.1 00A1
- P2.2 00A2
- P2.3 00A3
- P2.4 00A4
- P2.5 00A5
- P2.6 00A6
- P2.7 00A7
- P3 00B0
- P3.0 00B0
- P3.1 00B1
- P3.2 00B2
- P3.3 00B3
- P3.4 00B4
- P3.5 00B5
- P3.6 00B6
- P3.7 00B7
- PCON 0087
- PS 00BC
- PSW 00D0
- PSW.0 00D0
- PSW.1 00D1
- PSW.2 00D2
- PSW.3 00D3
- PSW.4 00D4
- PSW.5 00D5
- PSW.6 00D6
- PSW.7 00D7
- PT0 00B9
- PT1 00BB
- PT2 00BD
- PX0 00B8
- PX1 00BA
- RB8 009A
- RCAP2H 00CB
- RCAP2L 00CA
- RCLK 00CD
- REN 009C
- RI 0098
- RS0 00D3
- RS1 00D4
- RXD 00B0
- SBUF 0099
- SCON 0098
- SCON.0 0098
- SCON.1 0099
- SCON.2 009A
- SCON.3 009B
- SCON.4 009C
- SCON.5 009D
- SCON.6 009E
- SCON.7 009F
- SM0 009F
- SM1 009E
- SM2 009D
- SP 0081
- T2CON 00C8
- T2CON.0 00C8
- T2CON.1 00C9
- T2CON.2 00CA
- T2CON.3 00CB
- T2CON.4 00CC
- T2CON.5 00CD
- T2CON.6 00CE
- T2CON.7 00CF
- TB8 009B
- TCLK 00CC
- TCON 0088
- TCON.0 0088
- TCON.1 0089
- TCON.2 008A
- TCON.3 008B
- TCON.4 008C
- TCON.5 008D
- TCON.6 008E
- TCON.7 008F
- TF0 008D
- TF1 008F
- TF2 00CF
- TH0 008C
- TH1 008D
- TH2 00CD
- TI 0099
- TL0 008A
- TL1 008B
- TL2 00CC
- TMOD 0089
- TR0 008C
- TR1 008E
- TR2 00CA
- TXD 00B1
- 16 XG$main$0$0 = 003D GR
- _A = 00E0 G
- _AC = 00D6 G
- _ACC = 00E0 G
- _B = 00F0 G
- _CY = 00D7 G
- _DPH = 0083 G
- _DPL = 0082 G
- _EA = 00AF G
- _ES = 00AC G
- _ET0 = 00A9 G
- _ET1 = 00AB G
- _EX0 = 00A8 G
- _EX1 = 00AA G
- _F0 = 00D5 G
- _FL = 00D1 G
- _IE = 00A8 G
- _IE0 = 0089 G
- _IE1 = 008B G
- _INT0 = 00B2 G
- _INT1 = 00B3 G
- _IP = 00B8 G
- _IT0 = 0088 G
- _IT1 = 008A G
- _OV = 00D2 G
- _P = 00D0 G
- _P0 = 0080 G
- _P0_0 = 0080 G
- _P0_1 = 0081 G
- _P0_2 = 0082 G
- _P0_3 = 0083 G
- _P0_4 = 0084 G
- _P0_5 = 0085 G
- _P0_6 = 0086 G
- _P0_7 = 0087 G
- _P1 = 0090 G
- _P1_0 = 0090 G
- _P1_1 = 0091 G
- _P1_2 = 0092 G
- _P1_3 = 0093 G
- _P1_4 = 0094 G
- _P1_5 = 0095 G
- _P1_6 = 0096 G
- _P1_7 = 0097 G
- _P2 = 00A0 G
- _P2_0 = 00A0 G
- _P2_1 = 00A1 G
- _P2_2 = 00A2 G
- _P2_3 = 00A3 G
- _P2_4 = 00A4 G
- _P2_5 = 00A5 G
- _P2_6 = 00A6 G
- _P2_7 = 00A7 G
- _P3 = 00B0 G
- _P3_0 = 00B0 G
- _P3_1 = 00B1 G
- _P3_2 = 00B2 G
- _P3_3 = 00B3 G
- _P3_4 = 00B4 G
- _P3_5 = 00B5 G
- _P3_6 = 00B6 G
- _P3_7 = 00B7 G
- _PCON = 0087 G
- _PS = 00BC G
- _PSW = 00D0 G
- _PT0 = 00B9 G
- _PT1 = 00BB G
- _PX0 = 00B8 G
- _PX1 = 00BA G
- _RB8 = 009A G
- _RD = 00B7 G
- _REN = 009C G
- _RI = 0098 G
- _RS0 = 00D3 G
- _RS1 = 00D4 G
- _RXD = 00B0 G
- _SBUF = 0099 G
- _SCON = 0098 G
- _SM0 = 009F G
- _SM1 = 009E G
- _SM2 = 009D G
- _SP = 0081 G
- _T0 = 00B4 G
- _T1 = 00B5 G
- _TB8 = 009B G
- _TCON = 0088 G
- _TF0 = 008D G
- _TF1 = 008F G
- _TH0 = 008C G
- _TH1 = 008D G
- _TI = 0099 G
- _TL0 = 008A G
- _TL1 = 008B G
- _TMOD = 0089 G
- _TR0 = 008C G
- _TR1 = 008E G
- _TXD = 00B1 G
- _WR = 00B6 G
- D __interrupt_vect 0000 R
- __mcs51_genRAMCLEAR **** GX
- __mcs51_genXINIT **** GX
- __mcs51_genXRAMCLEAR **** GX
- __sdcc_gsinit_startup **** GX
- D __sdcc_program_startup 0003 GR
- 5 __start__stack 0000 GR
- 17 _image 0000 R
- 16 _main 0000 GR
- a 00D6
- ac 00D6
- acc 00E0
- acc.0 00E0
- acc.1 00E1
- acc.2 00E2
- acc.3 00E3
- acc.4 00E4
- acc.5 00E5
- acc.6 00E6
- acc.7 00E7
- ar0 = 0000
- ar1 = 0001
- ar2 = 0002
- ar3 = 0003
- ar4 = 0004
- ar5 = 0005
- ar6 = 0006
- ar7 = 0007
- b 00F0
- b.0 00F0
- b.1 00F1
- b.2 00F2
- b.3 00F3
- b.4 00F4
- b.5 00F5
- b.6 00F6
- b.7 00F7
- cprl2 00C8
- ct2 00C9
- cy 00D7
- dph 0083
- dpl 0082
- ea 00AF
- es 00AC
- et0 00A9
- et1 00AB
- et2 00AD
- ex0 00A8
- ex1 00AA
- exen2 00CB
- exf2 00CE
- f0 00D5
- ie 00A8
- ie.0 00A8
- ie.1 00A9
- ie.2 00AA
- ie.3 00AB
- ie.4 00AC
- ie.5 00AD
- ie.7 00AF
- ie0 0089
- ie1 008B
- int0 00B2
- int1 00B3
- ip 00B8
- ip.0 00B8
- ip.1 00B9
- ip.2 00BA
- ip.3 00BB
- ip.4 00BC
- ip.5 00BD
- it0 0088
- it1 008A
- ov 00D2
- p 00D0
- p0 0080
- p0.0 0080
- p0.1 0081
- p0.2 0082
- p0.3 0083
- p0.4 0084
- p0.5 0085
- p0.6 0086
- p0.7 0087
- p1 0090
- p1.0 0090
- p1.1 0091
- p1.2 0092
- p1.3 0093
- p1.4 0094
- p1.5 0095
- p1.6 0096
- p1.7 0097
- p2 00A0
- p2.0 00A0
- p2.1 00A1
- p2.2 00A2
- p2.3 00A3
- p2.4 00A4
- p2.5 00A5
- p2.6 00A6
- p2.7 00A7
- p3 00B0
- p3.0 00B0
- p3.1 00B1
- p3.2 00B2
- p3.3 00B3
- p3.4 00B4
- p3.5 00B5
- p3.6 00B6
- p3.7 00B7
- pcon 0087
- ps 00BC
- psw 00D0
- psw.0 00D0
- psw.1 00D1
- psw.2 00D2
- psw.3 00D3
- psw.4 00D4
- psw.5 00D5
- psw.6 00D6
- psw.7 00D7
- pt0 00B9
- pt1 00BB
- pt2 00BD
- px0 00B8
- px1 00BA
- rb8 009A
- rcap2h 00CB
- rcap2l 00CA
- rclk 00CD
- ren 009C
- ri 0098
- rs0 00D3
- rs1 00D4
- rxd 00B0
- sbuf 0099
- scon 0098
- scon.0 0098
- scon.1 0099
- scon.2 009A
- scon.3 009B
- scon.4 009C
- scon.5 009D
- scon.6 009E
- scon.7 009F
- sm0 009F
- sm1 009E
- sm2 009D
- sp 0081
- t2con 00C8
- t2con.0 00C8
- t2con.1 00C9
- t2con.2 00CA
- t2con.3 00CB
- t2con.4 00CC
- t2con.5 00CD
- t2con.6 00CE
- t2con.7 00CF
- tb8 009B
- tclk 00CC
- tcon 0088
- tcon.0 0088
- tcon.1 0089
- tcon.2 008A
- tcon.3 008B
- tcon.4 008C
- tcon.5 008D
- tcon.6 008E
- tcon.7 008F
- tf0 008D
- tf1 008F
- tf2 00CF
- th0 008C
- th1 008D
- th2 00CD
- ti 0099
- tl0 008A
- tl1 008B
- tl2 00CC
- tmod 0089
- tr0 008C
- tr1 008E
- tr2 00CA
- txd 00B1
-
- ASxxxx Assembler V01.70 + NoICE + SDCC mods + Flat24 Feb-1999 (Intel 8051), page 2.
-
-Area Table
-
- 0 _CODE size 0 flags 0
- 1 RSEG size 0 flags 0
- 2 REG_BANK_0 size 8 flags 4
- 3 DSEG size 0 flags 0
- 4 OSEG size 0 flags 4
- 5 SSEG size 1 flags 0
- 6 ISEG size 0 flags 0
- 7 IABS size 0 flags 8
- 8 BSEG size 0 flags 80
- 9 PSEG size 0 flags 50
- A XSEG size 0 flags 40
- B XABS size 0 flags 48
- C XISEG size 0 flags 40
- D HOME size 8 flags 20
- E GSINIT0 size 0 flags 20
- F GSINIT1 size 0 flags 20
- 10 GSINIT2 size 0 flags 20
- 11 GSINIT3 size 0 flags 20
- 12 GSINIT4 size 0 flags 20
- 13 GSINIT5 size 0 flags 20
- 14 GSINIT size 0 flags 20
- 15 GSFINAL size 3 flags 20
- 16 CSEG size 3F flags 20
- 17 CONST size 8 flags 20
- 18 XINIT size 0 flags 20
- 19 CABS size 0 flags 28
diff --git a/demo/mleddisplay.adf b/demo/mleddisplay.adf
index f3c5764..470e81d 100644
--- a/demo/mleddisplay.adf
+++ b/demo/mleddisplay.adf
@@ -1,7 +1,7 @@
-# Assembler debug file for MCU 8051 IDE v1.1
+# Assembler debug file for MCU 8051 IDE v1.4.7
# Used assembler: MCU 8051 IDE
-# Date: 03/02/09
-BFC1B21D558BFAE2B1E43162DAEFE347 "mleddisplay.asm"
+# Date: 12/28/2012
+8BF7EBDCE29A2FCF7D73079108BBAD39 "mleddisplay.asm"
0 37 0 2 0 37
0 51 3 6
0 52 4 182 10 9
@@ -32,7 +32,7 @@ BFC1B21D558BFAE2B1E43162DAEFE347 "mleddisplay.asm"
0 113 57 17 17
0 116 59 120 32
0 117 61 17 3
-0 120 63 1 55
+0 120 63 128 246
0 21 65 192
0 22 66 249
0 23 67 164
diff --git a/demo/mleddisplay.asm b/demo/mleddisplay.asm
index 8e2add9..be9acf2 100644
--- a/demo/mleddisplay.asm
+++ b/demo/mleddisplay.asm
@@ -46,7 +46,7 @@ numbers:db 11000000b ; 0
;
; Affected registers: R0
; Interrupts: None
- ; Notes: Recursive subprogram
+ ; Notes: Recursive sub-program
inrement_number:
inc @R0
cjne @R0, #0Ah, inc_num_end
diff --git a/demo/mleddisplay.bin b/demo/mleddisplay.bin
deleted file mode 100644
index 18d8eb4..0000000
--- a/demo/mleddisplay.bin
+++ /dev/null
Binary files differ
diff --git a/demo/mleddisplay.hex b/demo/mleddisplay.hex
index abf8563..4dc2bcd 100644
--- a/demo/mleddisplay.hex
+++ b/demo/mleddisplay.hex
@@ -1,2 +1,6 @@
-:4B00000002002506B60A09760008B824012211032218E5F003F5F0E69375B0FFF59085F0B0B820ED2275200075210075220075230075F0EE90004178241111782011030137C0F9A4B0999282F8809027
-:00000001FF \ No newline at end of file
+:1000000002002506B60A09760008B8240122110369
+:0E0010002218E5F003F5F0E69375B0FFF590C9
+:10001E0085F0B0B820ED2275200075210075220004
+:0F002E0075230075F0EE900041782411117820B1
+:0E003D00110380F6C0F9A4B0999282F8809069
+:00000001FF
diff --git a/demo/mleddisplay.lst b/demo/mleddisplay.lst
index f87d046..f92f61a 100644
--- a/demo/mleddisplay.lst
+++ b/demo/mleddisplay.lst
@@ -35,7 +35,7 @@ mleddisplay
34 ; -----------------------------------------------
35 ; Reset vector
36 org 0
-0000 06 37 jmp start
+0000 020025 37 jmp start
38
39 ; -----------------------------------------------
40 ; SUBPROGRAMS
@@ -47,18 +47,18 @@ mleddisplay
46 ;
47 ; Affected registers: R0
48 ; Interrupts: None
- 49 ; Notes: Recursive subprogram
+ 49 ; Notes: Recursive sub-program
50 inrement_number:
-0003 B60A09 51 inc @R0
-0004 7600 52 cjne @R0, #0Ah, inc_num_end
+0003 06 51 inc @R0
+0004 B60A09 52 cjne @R0, #0Ah, inc_num_end
53
-0007 08 54 mov @R0, #0
-0009 B82401 55 inc R0
-000A 22 56 cjne R0, #data_ptr+data_len, $+4
- 57 ret
-000E 0137 58 call inrement_number
+0007 7600 54 mov @R0, #0
+0009 08 55 inc R0
+000A B82401 56 cjne R0, #data_ptr+data_len, $+4
+000D 22 57 ret
+000E 1103 58 call inrement_number
59 inc_num_end:
-0010 7820 60 ret
+0010 22 60 ret
61
62 ;; Display the number on the LED display
63 ;
@@ -111,14 +111,14 @@ mleddisplay
110 main:
111 ; Show the number on the LED display
0037 7824 112 mov R0, #data_ptr+data_len
- 113 call display_number
+0039 1111 113 call display_number
114
115 ; Increment the number
- 116 mov R0, #data_ptr
- 117 call inrement_number
+003B 7820 116 mov R0, #data_ptr
+003D 1103 117 call inrement_number
118
119 ; Close main loop
- 120 jmp main
+003F 80F6 120 jmp main
121
122 ; -----------------------------------------------
123 ; PROGRAM END
@@ -128,6 +128,8 @@ ASSEMBLY COMPLETE, NO ERRORS FOUND, NO WARNINGS
SYMBOL TABLE:
+??MCU_8051_IDE . . . . . . . . . . . N NUMB 8051H NOT USED
+??VERSION. . . . . . . . . . . . . . N NUMB 0147H NOT USED
AC . . . . . . . . . . . . . . . . . B ADDR 00D6H NOT USED
ACC. . . . . . . . . . . . . . . . . D ADDR 00E0H NOT USED
ACSR . . . . . . . . . . . . . . . . D ADDR 0097H NOT USED
@@ -179,7 +181,7 @@ CPRL2. . . . . . . . . . . . . . . . B ADDR 00C8H NOT USED
CR . . . . . . . . . . . . . . . . . B ADDR 00DEH NOT USED
CT2. . . . . . . . . . . . . . . . . B ADDR 00C9H NOT USED
CY . . . . . . . . . . . . . . . . . B ADDR 00D7H NOT USED
-DATA_LEN . . . . . . . . . . . . . . N NUMB 0004H NOT USED
+DATA_LEN . . . . . . . . . . . . . . N NUMB 0004H
DATA_PTR . . . . . . . . . . . . . . D ADDR 0020H
DISPLAY_NUMBER . . . . . . . . . . . C ADDR 0011H
DP0H . . . . . . . . . . . . . . . . D ADDR 0083H NOT USED
diff --git a/demo/mleddisplay.vhw b/demo/mleddisplay.vhw
index ecdf182..bb55c14 100644
--- a/demo/mleddisplay.vhw
+++ b/demo/mleddisplay.vhw
@@ -1,5 +1,6 @@
-# MCU 8051 IDE: Virtual HW configuration file
-# Date: 05/10/2010
-# Project: Demo-project
+# MCU 8051 IDE: Virtual HW component configuration file
+# Date: 03/02/09
+# Project: DEBUG
+# Component: Multiplexed LED display
-MultiplexedLedDisplay {{0 1 1 1 2 1 3 1 4 1 T0 3 5 1 T1 3 6 1 T2 3 7 1 T3 3} {0 7 1 6 2 5 3 4 4 3 T0 7 5 2 T1 6 6 1 T2 5 7 0 T3 4} 425x225+850+345 {Demo for "leddisplay.asm"} red 50 1}
+MultiplexedLedDisplay {{0 1 1 1 2 1 3 1 4 1 T0 3 5 1 T1 3 6 1 T2 3 7 1 T3 3} {0 7 1 6 2 5 3 4 4 3 T0 7 5 2 T1 6 6 1 T2 5 7 0 T3 4} {} {Demo for "leddisplay.asm"} blue 50}
diff --git a/doc/handbook/img/001.png b/doc/handbook/img/001.png
new file mode 100644
index 0000000..736c0cb
--- /dev/null
+++ b/doc/handbook/img/001.png
Binary files differ
diff --git a/doc/handbook/img/002.png b/doc/handbook/img/002.png
new file mode 100644
index 0000000..4036e59
--- /dev/null
+++ b/doc/handbook/img/002.png
Binary files differ
diff --git a/doc/handbook/img/003.png b/doc/handbook/img/003.png
new file mode 100644
index 0000000..0205888
--- /dev/null
+++ b/doc/handbook/img/003.png
Binary files differ
diff --git a/doc/handbook/img/004.png b/doc/handbook/img/004.png
new file mode 100644
index 0000000..8930edd
--- /dev/null
+++ b/doc/handbook/img/004.png
Binary files differ
diff --git a/doc/handbook/img/005.png b/doc/handbook/img/005.png
new file mode 100644
index 0000000..16eb13b
--- /dev/null
+++ b/doc/handbook/img/005.png
Binary files differ
diff --git a/doc/handbook/img/006.png b/doc/handbook/img/006.png
new file mode 100644
index 0000000..2e72cbc
--- /dev/null
+++ b/doc/handbook/img/006.png
Binary files differ
diff --git a/doc/handbook/img/007.png b/doc/handbook/img/007.png
new file mode 100644
index 0000000..7200814
--- /dev/null
+++ b/doc/handbook/img/007.png
Binary files differ
diff --git a/doc/handbook/img/008.png b/doc/handbook/img/008.png
new file mode 100644
index 0000000..88d7b91
--- /dev/null
+++ b/doc/handbook/img/008.png
Binary files differ
diff --git a/doc/handbook/img/009.png b/doc/handbook/img/009.png
new file mode 100644
index 0000000..494e4d1
--- /dev/null
+++ b/doc/handbook/img/009.png
Binary files differ
diff --git a/doc/handbook/img/010.png b/doc/handbook/img/010.png
new file mode 100644
index 0000000..b6138c9
--- /dev/null
+++ b/doc/handbook/img/010.png
Binary files differ
diff --git a/doc/handbook/img/011.png b/doc/handbook/img/011.png
new file mode 100644
index 0000000..04e5acb
--- /dev/null
+++ b/doc/handbook/img/011.png
Binary files differ
diff --git a/doc/handbook/img/012.png b/doc/handbook/img/012.png
new file mode 100644
index 0000000..a83d150
--- /dev/null
+++ b/doc/handbook/img/012.png
Binary files differ
diff --git a/doc/handbook/img/013.png b/doc/handbook/img/013.png
new file mode 100644
index 0000000..61b273b
--- /dev/null
+++ b/doc/handbook/img/013.png
Binary files differ
diff --git a/doc/handbook/img/014.png b/doc/handbook/img/014.png
new file mode 100644
index 0000000..e0a6771
--- /dev/null
+++ b/doc/handbook/img/014.png
Binary files differ
diff --git a/doc/handbook/img/015.png b/doc/handbook/img/015.png
new file mode 100644
index 0000000..7012ae6
--- /dev/null
+++ b/doc/handbook/img/015.png
Binary files differ
diff --git a/doc/handbook/img/016.png b/doc/handbook/img/016.png
new file mode 100644
index 0000000..afab2d9
--- /dev/null
+++ b/doc/handbook/img/016.png
Binary files differ
diff --git a/doc/handbook/img/017.png b/doc/handbook/img/017.png
new file mode 100644
index 0000000..ceaa301
--- /dev/null
+++ b/doc/handbook/img/017.png
Binary files differ
diff --git a/doc/handbook/img/018.png b/doc/handbook/img/018.png
new file mode 100644
index 0000000..c84e7f7
--- /dev/null
+++ b/doc/handbook/img/018.png
Binary files differ
diff --git a/doc/handbook/img/019.png b/doc/handbook/img/019.png
new file mode 100644
index 0000000..216b6d2
--- /dev/null
+++ b/doc/handbook/img/019.png
Binary files differ
diff --git a/doc/handbook/img/020.png b/doc/handbook/img/020.png
new file mode 100644
index 0000000..4351064
--- /dev/null
+++ b/doc/handbook/img/020.png
Binary files differ
diff --git a/doc/handbook/img/021.png b/doc/handbook/img/021.png
new file mode 100644
index 0000000..fa433bf
--- /dev/null
+++ b/doc/handbook/img/021.png
Binary files differ
diff --git a/doc/handbook/img/022.png b/doc/handbook/img/022.png
new file mode 100644
index 0000000..67096eb
--- /dev/null
+++ b/doc/handbook/img/022.png
Binary files differ
diff --git a/doc/handbook/img/023.png b/doc/handbook/img/023.png
new file mode 100644
index 0000000..78fae27
--- /dev/null
+++ b/doc/handbook/img/023.png
Binary files differ
diff --git a/doc/handbook/img/024.png b/doc/handbook/img/024.png
new file mode 100644
index 0000000..8d4152e
--- /dev/null
+++ b/doc/handbook/img/024.png
Binary files differ
diff --git a/doc/handbook/img/025.png b/doc/handbook/img/025.png
new file mode 100644
index 0000000..1e4f56c
--- /dev/null
+++ b/doc/handbook/img/025.png
Binary files differ
diff --git a/doc/handbook/img/026.png b/doc/handbook/img/026.png
new file mode 100644
index 0000000..3cafb90
--- /dev/null
+++ b/doc/handbook/img/026.png
Binary files differ
diff --git a/doc/handbook/img/027.png b/doc/handbook/img/027.png
new file mode 100644
index 0000000..12e3bab
--- /dev/null
+++ b/doc/handbook/img/027.png
Binary files differ
diff --git a/doc/handbook/img/028.png b/doc/handbook/img/028.png
new file mode 100644
index 0000000..4ef405d
--- /dev/null
+++ b/doc/handbook/img/028.png
Binary files differ
diff --git a/doc/handbook/img/029.png b/doc/handbook/img/029.png
new file mode 100644
index 0000000..c5e0f8e
--- /dev/null
+++ b/doc/handbook/img/029.png
Binary files differ
diff --git a/doc/handbook/img/030.png b/doc/handbook/img/030.png
new file mode 100644
index 0000000..501cd57
--- /dev/null
+++ b/doc/handbook/img/030.png
Binary files differ
diff --git a/doc/handbook/img/031.png b/doc/handbook/img/031.png
new file mode 100644
index 0000000..536d592
--- /dev/null
+++ b/doc/handbook/img/031.png
Binary files differ
diff --git a/doc/handbook/img/032.png b/doc/handbook/img/032.png
new file mode 100644
index 0000000..7a666ad
--- /dev/null
+++ b/doc/handbook/img/032.png
Binary files differ
diff --git a/doc/handbook/img/033.png b/doc/handbook/img/033.png
new file mode 100644
index 0000000..12d56a4
--- /dev/null
+++ b/doc/handbook/img/033.png
Binary files differ
diff --git a/doc/handbook/img/034.png b/doc/handbook/img/034.png
new file mode 100644
index 0000000..d4e7502
--- /dev/null
+++ b/doc/handbook/img/034.png
Binary files differ
diff --git a/doc/handbook/img/035.png b/doc/handbook/img/035.png
new file mode 100644
index 0000000..02340e3
--- /dev/null
+++ b/doc/handbook/img/035.png
Binary files differ
diff --git a/doc/handbook/img/036.png b/doc/handbook/img/036.png
new file mode 100644
index 0000000..a0fd5cb
--- /dev/null
+++ b/doc/handbook/img/036.png
Binary files differ
diff --git a/doc/handbook/img/037.png b/doc/handbook/img/037.png
new file mode 100644
index 0000000..709effe
--- /dev/null
+++ b/doc/handbook/img/037.png
Binary files differ
diff --git a/doc/handbook/img/038.png b/doc/handbook/img/038.png
new file mode 100644
index 0000000..a5cf73a
--- /dev/null
+++ b/doc/handbook/img/038.png
Binary files differ
diff --git a/doc/handbook/img/039.png b/doc/handbook/img/039.png
new file mode 100644
index 0000000..a49ced3
--- /dev/null
+++ b/doc/handbook/img/039.png
Binary files differ
diff --git a/doc/handbook/img/040.png b/doc/handbook/img/040.png
new file mode 100644
index 0000000..8dd30bb
--- /dev/null
+++ b/doc/handbook/img/040.png
Binary files differ
diff --git a/doc/handbook/img/041.png b/doc/handbook/img/041.png
new file mode 100644
index 0000000..bfed481
--- /dev/null
+++ b/doc/handbook/img/041.png
Binary files differ
diff --git a/doc/handbook/img/042.png b/doc/handbook/img/042.png
new file mode 100644
index 0000000..773762d
--- /dev/null
+++ b/doc/handbook/img/042.png
Binary files differ
diff --git a/doc/handbook/img/043.png b/doc/handbook/img/043.png
new file mode 100644
index 0000000..c16835c
--- /dev/null
+++ b/doc/handbook/img/043.png
Binary files differ
diff --git a/doc/handbook/img/044.png b/doc/handbook/img/044.png
new file mode 100644
index 0000000..cbdf420
--- /dev/null
+++ b/doc/handbook/img/044.png
Binary files differ
diff --git a/doc/handbook/img/045.png b/doc/handbook/img/045.png
new file mode 100644
index 0000000..dae5658
--- /dev/null
+++ b/doc/handbook/img/045.png
Binary files differ
diff --git a/doc/handbook/img/046.png b/doc/handbook/img/046.png
new file mode 100644
index 0000000..a72788d
--- /dev/null
+++ b/doc/handbook/img/046.png
Binary files differ
diff --git a/doc/handbook/img/047.png b/doc/handbook/img/047.png
new file mode 100644
index 0000000..ad6b98f
--- /dev/null
+++ b/doc/handbook/img/047.png
Binary files differ
diff --git a/doc/handbook/img/048.png b/doc/handbook/img/048.png
new file mode 100644
index 0000000..e51986e
--- /dev/null
+++ b/doc/handbook/img/048.png
Binary files differ
diff --git a/doc/handbook/img/049.png b/doc/handbook/img/049.png
new file mode 100644
index 0000000..53d9c27
--- /dev/null
+++ b/doc/handbook/img/049.png
Binary files differ
diff --git a/doc/handbook/img/050.png b/doc/handbook/img/050.png
new file mode 100644
index 0000000..25bfd5d
--- /dev/null
+++ b/doc/handbook/img/050.png
Binary files differ
diff --git a/doc/handbook/img/1rightarrow.png b/doc/handbook/img/1rightarrow.png
new file mode 100644
index 0000000..8356b71
--- /dev/null
+++ b/doc/handbook/img/1rightarrow.png
Binary files differ
diff --git a/doc/handbook/img/2rightarrow.png b/doc/handbook/img/2rightarrow.png
new file mode 100644
index 0000000..f57b483
--- /dev/null
+++ b/doc/handbook/img/2rightarrow.png
Binary files differ
diff --git a/doc/handbook/img/545px-Intel_8051_arch.png b/doc/handbook/img/545px-Intel_8051_arch.png
new file mode 100644
index 0000000..d93237e
--- /dev/null
+++ b/doc/handbook/img/545px-Intel_8051_arch.png
Binary files differ
diff --git a/doc/handbook/img/asem51.png b/doc/handbook/img/asem51.png
new file mode 100644
index 0000000..fe660ee
--- /dev/null
+++ b/doc/handbook/img/asem51.png
Binary files differ
diff --git a/doc/handbook/img/bh.png b/doc/handbook/img/bh.png
new file mode 100644
index 0000000..a8807dc
--- /dev/null
+++ b/doc/handbook/img/bh.png
Binary files differ
diff --git a/doc/handbook/img/button_cancel.png b/doc/handbook/img/button_cancel.png
new file mode 100644
index 0000000..f9e820e
--- /dev/null
+++ b/doc/handbook/img/button_cancel.png
Binary files differ
diff --git a/doc/handbook/img/configure.png b/doc/handbook/img/configure.png
new file mode 100644
index 0000000..1141564
--- /dev/null
+++ b/doc/handbook/img/configure.png
Binary files differ
diff --git a/doc/handbook/img/down0.png b/doc/handbook/img/down0.png
new file mode 100644
index 0000000..a526541
--- /dev/null
+++ b/doc/handbook/img/down0.png
Binary files differ
diff --git a/doc/handbook/img/editdelete.png b/doc/handbook/img/editdelete.png
new file mode 100644
index 0000000..6fb193f
--- /dev/null
+++ b/doc/handbook/img/editdelete.png
Binary files differ
diff --git a/doc/handbook/img/exit.png b/doc/handbook/img/exit.png
new file mode 100644
index 0000000..b266020
--- /dev/null
+++ b/doc/handbook/img/exit.png
Binary files differ
diff --git a/doc/handbook/img/filenew.png b/doc/handbook/img/filenew.png
new file mode 100644
index 0000000..6e838b3
--- /dev/null
+++ b/doc/handbook/img/filenew.png
Binary files differ
diff --git a/doc/handbook/img/fork.png b/doc/handbook/img/fork.png
new file mode 100644
index 0000000..da97aef
--- /dev/null
+++ b/doc/handbook/img/fork.png
Binary files differ
diff --git a/doc/handbook/img/goto.png b/doc/handbook/img/goto.png
new file mode 100644
index 0000000..1088baf
--- /dev/null
+++ b/doc/handbook/img/goto.png
Binary files differ
diff --git a/doc/handbook/img/goto2.png b/doc/handbook/img/goto2.png
new file mode 100644
index 0000000..639bdcf
--- /dev/null
+++ b/doc/handbook/img/goto2.png
Binary files differ
diff --git a/doc/handbook/img/hb.png b/doc/handbook/img/hb.png
new file mode 100644
index 0000000..db8c800
--- /dev/null
+++ b/doc/handbook/img/hb.png
Binary files differ
diff --git a/doc/handbook/img/help.png b/doc/handbook/img/help.png
new file mode 100644
index 0000000..93bf094
--- /dev/null
+++ b/doc/handbook/img/help.png
Binary files differ
diff --git a/doc/handbook/img/hh.png b/doc/handbook/img/hh.png
new file mode 100644
index 0000000..84fcf65
--- /dev/null
+++ b/doc/handbook/img/hh.png
Binary files differ
diff --git a/doc/handbook/img/launch.png b/doc/handbook/img/launch.png
new file mode 100644
index 0000000..838c38b
--- /dev/null
+++ b/doc/handbook/img/launch.png
Binary files differ
diff --git a/doc/handbook/img/messagebox_info.png b/doc/handbook/img/messagebox_info.png
new file mode 100644
index 0000000..96642db
--- /dev/null
+++ b/doc/handbook/img/messagebox_info.png
Binary files differ
diff --git a/doc/handbook/img/rebuild.png b/doc/handbook/img/rebuild.png
new file mode 100644
index 0000000..9e3f403
--- /dev/null
+++ b/doc/handbook/img/rebuild.png
Binary files differ
diff --git a/doc/handbook/img/reload.png b/doc/handbook/img/reload.png
new file mode 100644
index 0000000..e002141
--- /dev/null
+++ b/doc/handbook/img/reload.png
Binary files differ
diff --git a/doc/handbook/img/sb.png b/doc/handbook/img/sb.png
new file mode 100644
index 0000000..dcc952e
--- /dev/null
+++ b/doc/handbook/img/sb.png
Binary files differ
diff --git a/doc/handbook/img/sdcc-0.png b/doc/handbook/img/sdcc-0.png
new file mode 100644
index 0000000..976bbbb
--- /dev/null
+++ b/doc/handbook/img/sdcc-0.png
Binary files differ
diff --git a/doc/handbook/img/sh.png b/doc/handbook/img/sh.png
new file mode 100644
index 0000000..4da7d1f
--- /dev/null
+++ b/doc/handbook/img/sh.png
Binary files differ
diff --git a/doc/handbook/img/ssp89s_sceenshot.png b/doc/handbook/img/ssp89s_sceenshot.png
new file mode 100644
index 0000000..1b0d695
--- /dev/null
+++ b/doc/handbook/img/ssp89s_sceenshot.png
Binary files differ
diff --git a/doc/handbook/img/symbol0.png b/doc/handbook/img/symbol0.png
new file mode 100644
index 0000000..c085511
--- /dev/null
+++ b/doc/handbook/img/symbol0.png
Binary files differ
diff --git a/doc/handbook/img/symbol1.png b/doc/handbook/img/symbol1.png
new file mode 100644
index 0000000..d208023
--- /dev/null
+++ b/doc/handbook/img/symbol1.png
Binary files differ
diff --git a/doc/handbook/img/symbol2.png b/doc/handbook/img/symbol2.png
new file mode 100644
index 0000000..24daa0c
--- /dev/null
+++ b/doc/handbook/img/symbol2.png
Binary files differ
diff --git a/doc/handbook/img/symbol3.png b/doc/handbook/img/symbol3.png
new file mode 100644
index 0000000..7adeb2c
--- /dev/null
+++ b/doc/handbook/img/symbol3.png
Binary files differ
diff --git a/doc/handbook/img/symbol4.png b/doc/handbook/img/symbol4.png
new file mode 100644
index 0000000..e58cf30
--- /dev/null
+++ b/doc/handbook/img/symbol4.png
Binary files differ
diff --git a/doc/handbook/img/symbol5.png b/doc/handbook/img/symbol5.png
new file mode 100644
index 0000000..2454bed
--- /dev/null
+++ b/doc/handbook/img/symbol5.png
Binary files differ
diff --git a/doc/handbook/img/undo.png b/doc/handbook/img/undo.png
new file mode 100644
index 0000000..d4b682b
--- /dev/null
+++ b/doc/handbook/img/undo.png
Binary files differ
diff --git a/doc/handbook/img/up0.png b/doc/handbook/img/up0.png
new file mode 100644
index 0000000..47c9c0c
--- /dev/null
+++ b/doc/handbook/img/up0.png
Binary files differ
diff --git a/doc/handbook/mcu8051ide.en.pdf b/doc/handbook/mcu8051ide.en.pdf
new file mode 100644
index 0000000..7704800
--- /dev/null
+++ b/doc/handbook/mcu8051ide.en.pdf
@@ -0,0 +1,31865 @@
+%PDF-1.4
+%
+1 0 obj
+<< /S /GoTo /D (chapter*.2) >>
+endobj
+4 0 obj
+(Preface)
+endobj
+5 0 obj
+<< /S /GoTo /D (section*.3) >>
+endobj
+8 0 obj
+(Goals of the project)
+endobj
+9 0 obj
+<< /S /GoTo /D (section*.6) >>
+endobj
+12 0 obj
+(Requirements)
+endobj
+13 0 obj
+<< /S /GoTo /D (section*.8) >>
+endobj
+16 0 obj
+(Intended Audience)
+endobj
+17 0 obj
+<< /S /GoTo /D (chapter.1) >>
+endobj
+20 0 obj
+(Brief introduction)
+endobj
+21 0 obj
+<< /S /GoTo /D (section.1.1) >>
+endobj
+24 0 obj
+(Main components of MCU 8051 IDE)
+endobj
+25 0 obj
+<< /S /GoTo /D (section.1.2) >>
+endobj
+28 0 obj
+(What is MCS-51)
+endobj
+29 0 obj
+<< /S /GoTo /D (section.1.3) >>
+endobj
+32 0 obj
+(What is the Assembly language)
+endobj
+33 0 obj
+<< /S /GoTo /D (chapter.2) >>
+endobj
+36 0 obj
+(Quick start)
+endobj
+37 0 obj
+<< /S /GoTo /D (section.2.1) >>
+endobj
+40 0 obj
+(Demonstration project)
+endobj
+41 0 obj
+<< /S /GoTo /D (section.2.2) >>
+endobj
+44 0 obj
+(Your first project in MCU 8051 IDE)
+endobj
+45 0 obj
+<< /S /GoTo /D (chapter.3) >>
+endobj
+48 0 obj
+(Detailed introduction to GUI)
+endobj
+49 0 obj
+<< /S /GoTo /D (section.3.1) >>
+endobj
+52 0 obj
+(Source code editor)
+endobj
+53 0 obj
+<< /S /GoTo /D (subsection.3.1.1) >>
+endobj
+56 0 obj
+(Syntax highlight and validation)
+endobj
+57 0 obj
+<< /S /GoTo /D (subsection.3.1.2) >>
+endobj
+60 0 obj
+(Spell checking)
+endobj
+61 0 obj
+<< /S /GoTo /D (subsection.3.1.3) >>
+endobj
+64 0 obj
+(Auto-completion)
+endobj
+65 0 obj
+<< /S /GoTo /D (subsection.3.1.4) >>
+endobj
+68 0 obj
+(Editor command line)
+endobj
+69 0 obj
+<< /S /GoTo /D (section.3.2) >>
+endobj
+72 0 obj
+(Bottom panel)
+endobj
+73 0 obj
+<< /S /GoTo /D (subsection.3.2.1) >>
+endobj
+76 0 obj
+(Main panel of the MCU simulator)
+endobj
+77 0 obj
+<< /S /GoTo /D (subsection.3.2.2) >>
+endobj
+80 0 obj
+(C variables)
+endobj
+81 0 obj
+<< /S /GoTo /D (subsection.3.2.3) >>
+endobj
+84 0 obj
+(Graph showing voltage levels)
+endobj
+85 0 obj
+<< /S /GoTo /D (subsection.3.2.4) >>
+endobj
+88 0 obj
+(Messages panel)
+endobj
+89 0 obj
+<< /S /GoTo /D (subsection.3.2.5) >>
+endobj
+92 0 obj
+(Notes)
+endobj
+93 0 obj
+<< /S /GoTo /D (subsection.3.2.6) >>
+endobj
+96 0 obj
+(Calculator)
+endobj
+97 0 obj
+<< /S /GoTo /D (subsection.3.2.7) >>
+endobj
+100 0 obj
+(Find in files)
+endobj
+101 0 obj
+<< /S /GoTo /D (subsection.3.2.8) >>
+endobj
+104 0 obj
+(Terminal emulator)
+endobj
+105 0 obj
+<< /S /GoTo /D (section.3.3) >>
+endobj
+108 0 obj
+(Left panel)
+endobj
+109 0 obj
+<< /S /GoTo /D (subsection.3.3.1) >>
+endobj
+112 0 obj
+(List of opened files)
+endobj
+113 0 obj
+<< /S /GoTo /D (subsection.3.3.2) >>
+endobj
+116 0 obj
+(List of project files)
+endobj
+117 0 obj
+<< /S /GoTo /D (subsection.3.3.3) >>
+endobj
+120 0 obj
+(SFR watches)
+endobj
+121 0 obj
+<< /S /GoTo /D (subsection.3.3.4) >>
+endobj
+124 0 obj
+(File system browser)
+endobj
+125 0 obj
+<< /S /GoTo /D (section.3.4) >>
+endobj
+128 0 obj
+(Right panel)
+endobj
+129 0 obj
+<< /S /GoTo /D (subsection.3.4.1) >>
+endobj
+132 0 obj
+(List of bookmarks)
+endobj
+133 0 obj
+<< /S /GoTo /D (subsection.3.4.2) >>
+endobj
+136 0 obj
+(List of breakpoints)
+endobj
+137 0 obj
+<< /S /GoTo /D (subsection.3.4.3) >>
+endobj
+140 0 obj
+(Instruction details)
+endobj
+141 0 obj
+<< /S /GoTo /D (subsection.3.4.4) >>
+endobj
+144 0 obj
+(Data register watches)
+endobj
+145 0 obj
+<< /S /GoTo /D (subsection.3.4.5) >>
+endobj
+148 0 obj
+(Subprograms call monitor)
+endobj
+149 0 obj
+<< /S /GoTo /D (subsection.3.4.6) >>
+endobj
+152 0 obj
+(List of symbols)
+endobj
+153 0 obj
+<< /S /GoTo /D (subsection.3.4.7) >>
+endobj
+156 0 obj
+(HW plug-ins manager)
+endobj
+157 0 obj
+<< /S /GoTo /D (section.3.5) >>
+endobj
+160 0 obj
+(Other tools)
+endobj
+161 0 obj
+<< /S /GoTo /D (subsection.3.5.1) >>
+endobj
+164 0 obj
+(SFR map)
+endobj
+165 0 obj
+<< /S /GoTo /D (subsection.3.5.2) >>
+endobj
+168 0 obj
+(Map of bit addressable area)
+endobj
+169 0 obj
+<< /S /GoTo /D (subsection.3.5.3) >>
+endobj
+172 0 obj
+(Stack monitor)
+endobj
+173 0 obj
+<< /S /GoTo /D (subsection.3.5.4) >>
+endobj
+176 0 obj
+(Symbol viewer)
+endobj
+177 0 obj
+<< /S /GoTo /D (subsection.3.5.5) >>
+endobj
+180 0 obj
+(ASCII chart)
+endobj
+181 0 obj
+<< /S /GoTo /D (subsection.3.5.6) >>
+endobj
+184 0 obj
+(8051 Instruction Table)
+endobj
+185 0 obj
+<< /S /GoTo /D (subsection.3.5.7) >>
+endobj
+188 0 obj
+(8-segment editor)
+endobj
+189 0 obj
+<< /S /GoTo /D (subsection.3.5.8) >>
+endobj
+192 0 obj
+(Stopwatch)
+endobj
+193 0 obj
+<< /S /GoTo /D (subsection.3.5.9) >>
+endobj
+196 0 obj
+(Scribble notepad)
+endobj
+197 0 obj
+<< /S /GoTo /D (subsection.3.5.10) >>
+endobj
+200 0 obj
+(Base converter)
+endobj
+201 0 obj
+<< /S /GoTo /D (subsection.3.5.11) >>
+endobj
+204 0 obj
+(RS-232 debugger)
+endobj
+205 0 obj
+<< /S /GoTo /D (subsection.3.5.12) >>
+endobj
+208 0 obj
+(Hexadecimal editors)
+endobj
+209 0 obj
+<< /S /GoTo /D (subsection.3.5.13) >>
+endobj
+212 0 obj
+(Hibernation of simulated program)
+endobj
+213 0 obj
+<< /S /GoTo /D (subsection.3.5.14) >>
+endobj
+216 0 obj
+(Interrupt monitor)
+endobj
+217 0 obj
+<< /S /GoTo /D (subsection.3.5.15) >>
+endobj
+220 0 obj
+(Conversions between *.hex, *.bin and *.adf files)
+endobj
+221 0 obj
+<< /S /GoTo /D (subsection.3.5.16) >>
+endobj
+224 0 obj
+(Normalization of source code indentation)
+endobj
+225 0 obj
+<< /S /GoTo /D (subsection.3.5.17) >>
+endobj
+228 0 obj
+(Change letter case)
+endobj
+229 0 obj
+<< /S /GoTo /D (subsection.3.5.18) >>
+endobj
+232 0 obj
+(User defined commands)
+endobj
+233 0 obj
+<< /S /GoTo /D (subsection.3.5.19) >>
+endobj
+236 0 obj
+(Clean-up project folder)
+endobj
+237 0 obj
+<< /S /GoTo /D (subsection.3.5.20) >>
+endobj
+240 0 obj
+(File statistic)
+endobj
+241 0 obj
+<< /S /GoTo /D (section.3.6) >>
+endobj
+244 0 obj
+(Configuration dialogues)
+endobj
+245 0 obj
+<< /S /GoTo /D (chapter.4) >>
+endobj
+248 0 obj
+(Build-in macro-assembler)
+endobj
+249 0 obj
+<< /S /GoTo /D (section.4.1) >>
+endobj
+252 0 obj
+(Statements)
+endobj
+253 0 obj
+<< /S /GoTo /D (section.4.2) >>
+endobj
+256 0 obj
+(Symbols)
+endobj
+257 0 obj
+<< /S /GoTo /D (section.4.3) >>
+endobj
+260 0 obj
+(Constants)
+endobj
+261 0 obj
+<< /S /GoTo /D (section.4.4) >>
+endobj
+264 0 obj
+(Expressions)
+endobj
+265 0 obj
+<< /S /GoTo /D (section.4.5) >>
+endobj
+268 0 obj
+(The instruction set processing)
+endobj
+269 0 obj
+<< /S /GoTo /D (section.4.6) >>
+endobj
+272 0 obj
+(Assembler directives)
+endobj
+273 0 obj
+<< /S /GoTo /D (section.4.7) >>
+endobj
+276 0 obj
+(Assembler Controls)
+endobj
+277 0 obj
+<< /S /GoTo /D (section.4.8) >>
+endobj
+280 0 obj
+(Predefined Symbols)
+endobj
+281 0 obj
+<< /S /GoTo /D (section.4.9) >>
+endobj
+284 0 obj
+(Segment type)
+endobj
+285 0 obj
+<< /S /GoTo /D (section.4.10) >>
+endobj
+288 0 obj
+(Conditional Assembly)
+endobj
+289 0 obj
+<< /S /GoTo /D (section.4.11) >>
+endobj
+292 0 obj
+(Macro Processing)
+endobj
+293 0 obj
+<< /S /GoTo /D (section.4.12) >>
+endobj
+296 0 obj
+(Reserved keywords)
+endobj
+297 0 obj
+<< /S /GoTo /D (section.4.13) >>
+endobj
+300 0 obj
+(Compatibility with ASEM-51)
+endobj
+301 0 obj
+<< /S /GoTo /D (section.4.14) >>
+endobj
+304 0 obj
+(List File Format)
+endobj
+305 0 obj
+<< /S /GoTo /D (section.4.15) >>
+endobj
+308 0 obj
+(Specification of Intel\2568 HEX Format)
+endobj
+309 0 obj
+<< /S /GoTo /D (chapter.5) >>
+endobj
+312 0 obj
+(Disassembler)
+endobj
+313 0 obj
+<< /S /GoTo /D (chapter.6) >>
+endobj
+316 0 obj
+(MCU simulator)
+endobj
+317 0 obj
+<< /S /GoTo /D (section.6.1) >>
+endobj
+320 0 obj
+(Short introduction)
+endobj
+321 0 obj
+<< /S /GoTo /D (section.6.2) >>
+endobj
+324 0 obj
+(Modes of simulation)
+endobj
+325 0 obj
+<< /S /GoTo /D (section.6.3) >>
+endobj
+328 0 obj
+(Waring conditions)
+endobj
+329 0 obj
+<< /S /GoTo /D (section.6.4) >>
+endobj
+332 0 obj
+(Limitations)
+endobj
+333 0 obj
+<< /S /GoTo /D (section.6.5) >>
+endobj
+336 0 obj
+(Virtual hardware)
+endobj
+337 0 obj
+<< /S /GoTo /D (subsection.6.5.1) >>
+endobj
+340 0 obj
+(DS1620 temperature sensor)
+endobj
+341 0 obj
+<< /S /GoTo /D (subsection.6.5.2) >>
+endobj
+344 0 obj
+(File interface)
+endobj
+345 0 obj
+<< /S /GoTo /D (subsection.6.5.3) >>
+endobj
+348 0 obj
+(LED Panel)
+endobj
+349 0 obj
+<< /S /GoTo /D (subsection.6.5.4) >>
+endobj
+352 0 obj
+(Single LED Display)
+endobj
+353 0 obj
+<< /S /GoTo /D (subsection.6.5.5) >>
+endobj
+356 0 obj
+(Multiplexed LED Display)
+endobj
+357 0 obj
+<< /S /GoTo /D (subsection.6.5.6) >>
+endobj
+360 0 obj
+(LED Matrix)
+endobj
+361 0 obj
+<< /S /GoTo /D (subsection.6.5.7) >>
+endobj
+364 0 obj
+(Matrix Keypad)
+endobj
+365 0 obj
+<< /S /GoTo /D (subsection.6.5.8) >>
+endobj
+368 0 obj
+(Simple Keypad)
+endobj
+369 0 obj
+<< /S /GoTo /D (subsection.6.5.9) >>
+endobj
+372 0 obj
+(LCD display controlled by HD44780)
+endobj
+373 0 obj
+<< /S /GoTo /D (chapter.7) >>
+endobj
+376 0 obj
+(Writing hardware tool control plug-ins)
+endobj
+377 0 obj
+<< /S /GoTo /D (section.7.1) >>
+endobj
+380 0 obj
+(Foreword)
+endobj
+381 0 obj
+<< /S /GoTo /D (section.7.2) >>
+endobj
+384 0 obj
+(How to write your own plug-in)
+endobj
+385 0 obj
+<< /S /GoTo /D (section.7.3) >>
+endobj
+388 0 obj
+(Using MCU 8051 IDE API)
+endobj
+389 0 obj
+<< /S /GoTo /D (section.7.4) >>
+endobj
+392 0 obj
+(A basic example)
+endobj
+393 0 obj
+<< /S /GoTo /D (section.7.5) >>
+endobj
+396 0 obj
+(Random remarks)
+endobj
+397 0 obj
+<< /S /GoTo /D (chapter.8) >>
+endobj
+400 0 obj
+(Command Line Interface)
+endobj
+401 0 obj
+<< /S /GoTo /D (chapter.9) >>
+endobj
+404 0 obj
+(Translating the IDE into different languages)
+endobj
+405 0 obj
+<< /S /GoTo /D (appendix.A) >>
+endobj
+408 0 obj
+(License)
+endobj
+409 0 obj
+<< /S /GoTo /D (appendix.B) >>
+endobj
+412 0 obj
+(Regression testing)
+endobj
+413 0 obj
+<< /S /GoTo /D (section.B.1) >>
+endobj
+416 0 obj
+(Foreword)
+endobj
+417 0 obj
+<< /S /GoTo /D (section.B.2) >>
+endobj
+420 0 obj
+(More about the implementation)
+endobj
+421 0 obj
+<< /S /GoTo /D (appendix.C) >>
+endobj
+424 0 obj
+(Project web page and other media)
+endobj
+425 0 obj
+<< /S /GoTo /D (section.C.1) >>
+endobj
+428 0 obj
+(Official project web page)
+endobj
+429 0 obj
+<< /S /GoTo /D (section.C.2) >>
+endobj
+432 0 obj
+(Other media)
+endobj
+433 0 obj
+<< /S /GoTo /D (section.C.3) >>
+endobj
+436 0 obj
+(GIT repository)
+endobj
+437 0 obj
+<< /S /GoTo /D (appendix.D) >>
+endobj
+440 0 obj
+(8051 Instructions in numerical Order)
+endobj
+441 0 obj
+<< /S /GoTo /D (appendix.E) >>
+endobj
+444 0 obj
+(8051 Instructions in alphabetical order)
+endobj
+445 0 obj
+<< /S /GoTo /D (appendix.F) >>
+endobj
+448 0 obj
+(List of supported micro-controllers)
+endobj
+449 0 obj
+<< /S /GoTo /D (subsection.F.0.1) >>
+endobj
+452 0 obj
+(Intel\256)
+endobj
+453 0 obj
+<< /S /GoTo /D (subsection.F.0.2) >>
+endobj
+456 0 obj
+(Atmel\256)
+endobj
+457 0 obj
+<< /S /GoTo /D (appendix.G) >>
+endobj
+460 0 obj
+(Change log)
+endobj
+461 0 obj
+<< /S /GoTo /D [462 0 R /Fit ] >>
+endobj
+464 0 obj <<
+/Length 211
+/Filter /FlateDecode
+>>
+stream
+xuPN@ +|Hz
+A[ⲜöIKH/v{G x|Vֲp
+endstream
+endobj
+462 0 obj <<
+/Type /Page
+/Contents 464 0 R
+/Resources 463 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 469 0 R
+>> endobj
+465 0 obj <<
+/D [462 0 R /XYZ 80.963 747.976 null]
+>> endobj
+466 0 obj <<
+/D [462 0 R /XYZ 81.963 715.221 null]
+>> endobj
+463 0 obj <<
+/Font << /F19 467 0 R /F20 468 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+472 0 obj <<
+/Length 1022
+/Filter /FlateDecode
+>>
+stream
+xڥs6+(U?-oIrm:ӆLr
+6kR@,ɻ,G,at9}{#t9ʹdq!iʒȄ&yz2sE|`'<>|eQ/?F,S$Ӕj%a\D_Fl;OvWDGI*wǒI!պqZeXpaH[j>/6(್9r&x>U
+ pƵfBnq%_?HјuOE#Xpn\t/Փ+ðC}qQ{p UREpkNi*åue^&Wra+xA*IivYǚ/`gTHAz"!xň (("%uG %-}31YX
+#H+cZw}Vَ Yv\ua= h8a~[WC3Fy*^$x.1\biAdu/Jo-Z?ҽu6`~m .apa>+ɨkl uM뫲9- bk?"(z(jEЩNlhY_ղЃJ@J hJGm˩oBo
+endstream
+endobj
+471 0 obj <<
+/Type /Page
+/Contents 472 0 R
+/Resources 470 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 469 0 R
+>> endobj
+473 0 obj <<
+/D [471 0 R /XYZ 122.806 747.976 null]
+>> endobj
+470 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F24 476 0 R /F26 477 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+509 0 obj <<
+/Length 1079
+/Filter /FlateDecode
+>>
+stream
+xXMw6W (|Oz&=szz]hbng}%$HbcVxwߕ"oEb~;D=ØR=p8f`ě''??E-яqh^ @HCw.G1*7EA4f#/`sB=[ b At>CJ4BijBf`@qoFꕲ(,ꌂP?A;DBXG{IHK&-ڤ?1<=`^ hA`<Q&IU'7لO/zE,I 8bL)WNAԪ͢Nl*:Wpy^F:[l2(~Y] 4bˏ(n?NPxG)@]FVmwok
+)`yU!웽|˾
+Lq 삳jz!
+[[mNJ^6BU;Q0
+ uT
+ђ+&{7@ k%Ef CaM ;PnGa6RkFfg:G#>s_[\vWq:'ȣ=I{^;$ 2=j8?;?>m{f\%B:Q_pl
+endstream
+endobj
+508 0 obj <<
+/Type /Page
+/Contents 509 0 R
+/Resources 507 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 469 0 R
+/Annots [ 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 504 0 R 505 0 R ]
+>> endobj
+478 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 554.078 126.528 564.321]
+/A << /S /GoTo /D (chapter*.2) >>
+>> endobj
+479 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 537.308 202.737 549.859]
+/A << /S /GoTo /D (section*.3) >>
+>> endobj
+480 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 522.862 170.309 535.413]
+/A << /S /GoTo /D (section*.6) >>
+>> endobj
+481 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 510.741 196.407 520.967]
+/A << /S /GoTo /D (section*.8) >>
+>> endobj
+482 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 484.592 206.749 494.834]
+/A << /S /GoTo /D (chapter.1) >>
+>> endobj
+483 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 467.822 315.703 480.372]
+/A << /S /GoTo /D (section.1.1) >>
+>> endobj
+484 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 455.7 213.312 465.926]
+/A << /S /GoTo /D (section.1.2) >>
+>> endobj
+485 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 438.93 289.513 451.48]
+/A << /S /GoTo /D (section.1.3) >>
+>> endobj
+486 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 412.781 166.789 425.348]
+/A << /S /GoTo /D (chapter.2) >>
+>> endobj
+487 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 398.335 243.389 410.886]
+/A << /S /GoTo /D (section.2.1) >>
+>> endobj
+488 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 383.889 314.077 396.44]
+/A << /S /GoTo /D (section.2.2) >>
+>> endobj
+489 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 360.064 273.828 370.307]
+/A << /S /GoTo /D (chapter.3) >>
+>> endobj
+490 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 345.618 222.032 355.845]
+/A << /S /GoTo /D (section.3.1) >>
+>> endobj
+491 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 328.849 326.451 341.399]
+/A << /S /GoTo /D (subsection.3.1.1) >>
+>> endobj
+492 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 314.403 237.052 326.953]
+/A << /S /GoTo /D (subsection.3.1.2) >>
+>> endobj
+493 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 299.957 250.376 312.507]
+/A << /S /GoTo /D (subsection.3.1.3) >>
+>> endobj
+494 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 287.835 272.972 298.061]
+/A << /S /GoTo /D (subsection.3.1.4) >>
+>> endobj
+495 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 271.065 197.486 283.616]
+/A << /S /GoTo /D (section.3.2) >>
+>> endobj
+496 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 256.619 339.508 269.17]
+/A << /S /GoTo /D (subsection.3.2.1) >>
+>> endobj
+497 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 244.498 221.837 254.724]
+/A << /S /GoTo /D (subsection.3.2.2) >>
+>> endobj
+498 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 227.728 313.658 240.278]
+/A << /S /GoTo /D (subsection.3.2.3) >>
+>> endobj
+499 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 213.282 242.769 225.832]
+/A << /S /GoTo /D (subsection.3.2.4) >>
+>> endobj
+500 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 201.16 193.875 211.386]
+/A << /S /GoTo /D (subsection.3.2.5) >>
+>> endobj
+501 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 186.714 218.196 196.941]
+/A << /S /GoTo /D (subsection.3.2.6) >>
+>> endobj
+502 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 172.269 225.899 182.495]
+/A << /S /GoTo /D (subsection.3.2.7) >>
+>> endobj
+503 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 157.823 259.808 168.049]
+/A << /S /GoTo /D (subsection.3.2.8) >>
+>> endobj
+504 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 141.053 179.281 153.603]
+/A << /S /GoTo /D (section.3.3) >>
+>> endobj
+505 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 126.607 261.399 139.157]
+/A << /S /GoTo /D (subsection.3.3.1) >>
+>> endobj
+510 0 obj <<
+/D [508 0 R /XYZ 80.963 747.976 null]
+>> endobj
+512 0 obj <<
+/D [508 0 R /XYZ 81.963 581.223 null]
+>> endobj
+507 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F16 475 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+555 0 obj <<
+/Length 1404
+/Filter /FlateDecode
+>>
+stream
+xZMw8W'eIiĞ3NQ><G 84q7 p~&#@Ĕ"gv@B'aBK<Qٛ{?{=9M@u#ߡ
+Fli1jl2nC7ɲȬ|b hT2yucb0l@AW,5DwlҫEQ7jȲи$2
+*dn|Ƣ=Ex'R=٢
+5g|<NJd\@P_ť(qr"%.qGF[ltvb
+!'dF{+lQ6b)LC ^Zui)@aC@˩0Ұ$bJw,sdG!P@W3OB<TS{C(X<$vlbڊ෍uc@vnmF$뭞ebX a1 P/tSTj|Cj߅S כ tѬ__4?^si>E_ɕ|ޔfuUX.GY$BDn~"3w׼HM
+endstream
+endobj
+554 0 obj <<
+/Type /Page
+/Contents 555 0 R
+/Resources 553 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 469 0 R
+/Annots [ 506 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R ]
+>> endobj
+506 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 697.455 303.242 710.005]
+/A << /S /GoTo /D (subsection.3.3.2) >>
+>> endobj
+513 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 685.333 273.104 695.559]
+/A << /S /GoTo /D (subsection.3.3.3) >>
+>> endobj
+514 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 668.563 308.183 681.114]
+/A << /S /GoTo /D (subsection.3.3.4) >>
+>> endobj
+515 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 654.117 228.926 666.668]
+/A << /S /GoTo /D (section.3.4) >>
+>> endobj
+516 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 641.996 299.666 652.222]
+/A << /S /GoTo /D (subsection.3.4.1) >>
+>> endobj
+517 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 625.226 303.242 637.776]
+/A << /S /GoTo /D (subsection.3.4.2) >>
+>> endobj
+518 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 613.104 300.151 623.33]
+/A << /S /GoTo /D (subsection.3.4.3) >>
+>> endobj
+519 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 596.334 317.221 608.884]
+/A << /S /GoTo /D (subsection.3.4.4) >>
+>> endobj
+520 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 581.888 339.426 594.439]
+/A << /S /GoTo /D (subsection.3.4.5) >>
+>> endobj
+521 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 567.442 284.452 579.993]
+/A << /S /GoTo /D (subsection.3.4.6) >>
+>> endobj
+522 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 552.997 319.263 565.547]
+/A << /S /GoTo /D (subsection.3.4.7) >>
+>> endobj
+523 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 540.875 227.53 551.101]
+/A << /S /GoTo /D (section.3.5) >>
+>> endobj
+524 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 524.105 255.484 536.655]
+/A << /S /GoTo /D (subsection.3.5.1) >>
+>> endobj
+525 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 509.659 349.24 522.209]
+/A << /S /GoTo /D (subsection.3.5.2) >>
+>> endobj
+526 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 497.537 278.895 507.764]
+/A << /S /GoTo /D (subsection.3.5.3) >>
+>> endobj
+527 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 480.767 281.17 493.318]
+/A << /S /GoTo /D (subsection.3.5.4) >>
+>> endobj
+528 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 468.646 269.455 478.872]
+/A << /S /GoTo /D (subsection.3.5.5) >>
+>> endobj
+529 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 454.2 322.518 464.426]
+/A << /S /GoTo /D (subsection.3.5.6) >>
+>> endobj
+530 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 437.43 291.638 449.98]
+/A << /S /GoTo /D (subsection.3.5.7) >>
+>> endobj
+531 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 422.984 259.714 435.534]
+/A << /S /GoTo /D (subsection.3.5.8) >>
+>> endobj
+532 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 408.538 292.548 421.089]
+/A << /S /GoTo /D (subsection.3.5.9) >>
+>> endobj
+533 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 396.417 281.721 406.643]
+/A << /S /GoTo /D (subsection.3.5.10) >>
+>> endobj
+534 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 379.647 293.359 392.197]
+/A << /S /GoTo /D (subsection.3.5.11) >>
+>> endobj
+535 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 367.525 310.164 377.751]
+/A << /S /GoTo /D (subsection.3.5.12) >>
+>> endobj
+536 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 350.755 381.034 363.305]
+/A << /S /GoTo /D (subsection.3.5.13) >>
+>> endobj
+537 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 336.309 297.746 348.86]
+/A << /S /GoTo /D (subsection.3.5.14) >>
+>> endobj
+538 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 321.863 451.387 335.144]
+/A << /S /GoTo /D (subsection.3.5.15) >>
+>> endobj
+539 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 309.742 417.444 319.968]
+/A << /S /GoTo /D (subsection.3.5.16) >>
+>> endobj
+540 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 292.972 301.066 305.522]
+/A << /S /GoTo /D (subsection.3.5.17) >>
+>> endobj
+541 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 280.85 328.109 291.076]
+/A << /S /GoTo /D (subsection.3.5.18) >>
+>> endobj
+542 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 264.08 325.708 276.63]
+/A << /S /GoTo /D (subsection.3.5.19) >>
+>> endobj
+543 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 251.958 270.408 262.185]
+/A << /S /GoTo /D (subsection.3.5.20) >>
+>> endobj
+544 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 235.188 290.273 247.739]
+/A << /S /GoTo /D (section.3.6) >>
+>> endobj
+545 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [122.809 211.363 291.854 221.606]
+/A << /S /GoTo /D (chapter.4) >>
+>> endobj
+546 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 196.918 226.23 207.144]
+/A << /S /GoTo /D (section.4.1) >>
+>> endobj
+547 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 180.148 211.926 192.698]
+/A << /S /GoTo /D (section.4.2) >>
+>> endobj
+548 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 168.026 220.443 178.252]
+/A << /S /GoTo /D (section.4.3) >>
+>> endobj
+549 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 151.256 229.121 163.806]
+/A << /S /GoTo /D (section.4.4) >>
+>> endobj
+550 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 136.81 323.302 149.36]
+/A << /S /GoTo /D (section.4.5) >>
+>> endobj
+551 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 124.688 273.494 134.915]
+/A << /S /GoTo /D (section.4.6) >>
+>> endobj
+556 0 obj <<
+/D [554 0 R /XYZ 122.806 747.976 null]
+>> endobj
+553 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+594 0 obj <<
+/Length 1400
+/Filter /FlateDecode
+>>
+stream
+xՙ[{64:˾K,uϓ6#IdJ0Yblw7kqA9_Pw$A(7zwwQ@8o{q  ($}BTCBoi<gTSoZ`rubsuQp,=P %ձ@!쿮*?(YuY]u3w7A:UZ
+ rrkm)M@ϐNX@vZk#ؤFT Cʺ)'zƀwIٌ,`~؁i\ /Cd$eHMt_.MJt۪t1ʵ5yoV{ʟvtU" ҵCM[VL$4b26YjUk}\⚸Ұ5V
+`Xqǧu$Kjۙ:XYqϤP>.6vQ'kSgO tl䟏 T2;q(]UjG4ch_D2U~'-(9j.4@ṫ[nN> EFA92# %uDUY+o%YAEZe#4CS¿MDفwھض.>HR SR
+endstream
+endobj
+593 0 obj <<
+/Type /Page
+/Contents 594 0 R
+/Resources 592 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 469 0 R
+/Annots [ 552 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R 567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R 586 0 R 587 0 R 588 0 R 589 0 R ]
+>> endobj
+552 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 699.779 226.775 710.005]
+/A << /S /GoTo /D (section.4.7) >>
+>> endobj
+557 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 683.009 228.11 695.559]
+/A << /S /GoTo /D (section.4.8) >>
+>> endobj
+558 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 668.563 197.001 681.114]
+/A << /S /GoTo /D (section.4.9) >>
+>> endobj
+559 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 654.117 239.713 666.668]
+/A << /S /GoTo /D (section.4.10) >>
+>> endobj
+560 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 639.672 217.442 652.222]
+/A << /S /GoTo /D (section.4.11) >>
+>> endobj
+561 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 625.226 223.948 637.776]
+/A << /S /GoTo /D (section.4.12) >>
+>> endobj
+562 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 610.78 278.425 623.33]
+/A << /S /GoTo /D (section.4.13) >>
+>> endobj
+563 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 598.658 211.526 608.884]
+/A << /S /GoTo /D (section.4.14) >>
+>> endobj
+564 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 581.888 321.095 594.439]
+/A << /S /GoTo /D (section.4.15) >>
+>> endobj
+565 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 558.063 176.802 568.306]
+/A << /S /GoTo /D (chapter.5) >>
+>> endobj
+566 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 531.914 192.852 542.157]
+/A << /S /GoTo /D (chapter.6) >>
+>> endobj
+567 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 517.468 222.358 527.695]
+/A << /S /GoTo /D (section.6.1) >>
+>> endobj
+568 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 503.022 230.936 513.249]
+/A << /S /GoTo /D (section.6.2) >>
+>> endobj
+569 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 486.253 220.468 498.803]
+/A << /S /GoTo /D (section.6.3) >>
+>> endobj
+570 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 474.131 186.173 484.357]
+/A << /S /GoTo /D (section.6.4) >>
+>> endobj
+571 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 459.685 215.201 469.911]
+/A << /S /GoTo /D (section.6.5) >>
+>> endobj
+572 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 442.915 305.611 455.465]
+/A << /S /GoTo /D (subsection.6.5.1) >>
+>> endobj
+573 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 430.793 231.686 441.02]
+/A << /S /GoTo /D (subsection.6.5.2) >>
+>> endobj
+574 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 416.348 221.439 426.574]
+/A << /S /GoTo /D (subsection.6.5.3) >>
+>> endobj
+575 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 399.578 265.716 412.128]
+/A << /S /GoTo /D (subsection.6.5.4) >>
+>> endobj
+576 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 385.132 296.27 397.682]
+/A << /S /GoTo /D (subsection.6.5.5) >>
+>> endobj
+577 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 373.01 228.101 383.236]
+/A << /S /GoTo /D (subsection.6.5.6) >>
+>> endobj
+578 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 356.24 243.22 368.79]
+/A << /S /GoTo /D (subsection.6.5.7) >>
+>> endobj
+579 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 341.794 242.574 354.345]
+/A << /S /GoTo /D (subsection.6.5.8) >>
+>> endobj
+580 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [125.439 327.348 350.725 339.899]
+/A << /S /GoTo /D (subsection.6.5.9) >>
+>> endobj
+581 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 301.199 328.214 313.766]
+/A << /S /GoTo /D (chapter.7) >>
+>> endobj
+582 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 289.078 174.73 299.304]
+/A << /S /GoTo /D (section.7.1) >>
+>> endobj
+583 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 272.308 285.096 284.858]
+/A << /S /GoTo /D (section.7.2) >>
+>> endobj
+584 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 257.862 265.466 270.412]
+/A << /S /GoTo /D (section.7.3) >>
+>> endobj
+585 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 243.416 211.365 255.966]
+/A << /S /GoTo /D (section.7.4) >>
+>> endobj
+586 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [98.521 231.294 215.106 241.521]
+/A << /S /GoTo /D (section.7.5) >>
+>> endobj
+587 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 205.145 246.936 215.388]
+/A << /S /GoTo /D (chapter.8) >>
+>> endobj
+588 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 176.672 360.915 189.239]
+/A << /S /GoTo /D (chapter.9) >>
+>> endobj
+589 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 152.847 143.348 163.09]
+/A << /S /GoTo /D (appendix.A) >>
+>> endobj
+595 0 obj <<
+/D [593 0 R /XYZ 80.963 747.976 null]
+>> endobj
+592 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F36 596 0 R /F24 476 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+610 0 obj <<
+/Length 755
+/Filter /FlateDecode
+>>
+stream
+xWKS0W(,~ % L -Lb;v0l9@Pmp,ֻLQtވ+qJq"T##4Zx.#4></$8(bODEpyMn J辛Z a-QR@?GhBմ_(%(o?v<Vi]g,QI&M;"2q-LJEFLT4D)"&/HXg(Uz’e5Y&a(UoY0go)ួH5Nnbi nY1"6Ij;1yP/0rׄߪ:HǍ7}(8No<&Se$Ka+%V+*8Kr/ּ,m,\t`h k[/ =AŐr/j8Vҹ:kZ!BȔy>CDP-UoYTqO, /ݮjaF g)CPЭP$Mz6HʍH1;% >/[֋XVMge2+MUyZi
+endstream
+endobj
+609 0 obj <<
+/Type /Page
+/Contents 610 0 R
+/Resources 608 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 469 0 R
+/Annots [ 590 0 R 591 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R 605 0 R 606 0 R 607 0 R ]
+>> endobj
+590 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [122.809 697.455 249.715 710.022]
+/A << /S /GoTo /D (appendix.B) >>
+>> endobj
+591 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 685.333 216.573 695.559]
+/A << /S /GoTo /D (section.B.1) >>
+>> endobj
+597 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 668.563 332.791 681.114]
+/A << /S /GoTo /D (section.B.2) >>
+>> endobj
+598 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [122.809 642.414 345.78 654.981]
+/A << /S /GoTo /D (appendix.C) >>
+>> endobj
+599 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 627.968 296.71 640.519]
+/A << /S /GoTo /D (section.C.1) >>
+>> endobj
+600 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 615.847 233.642 626.073]
+/A << /S /GoTo /D (section.C.2) >>
+>> endobj
+601 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.364 599.077 246.462 611.627]
+/A << /S /GoTo /D (section.C.3) >>
+>> endobj
+602 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [122.809 575.252 360.863 585.495]
+/A << /S /GoTo /D (appendix.D) >>
+>> endobj
+603 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [122.809 546.778 371.045 559.345]
+/A << /S /GoTo /D (appendix.E) >>
+>> endobj
+604 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [122.809 520.629 347.374 533.196]
+/A << /S /GoTo /D (appendix.F) >>
+>> endobj
+605 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 506.183 242.082 518.734]
+/A << /S /GoTo /D (subsection.F.0.1) >>
+>> endobj
+606 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.282 491.737 249.884 504.288]
+/A << /S /GoTo /D (subsection.F.0.2) >>
+>> endobj
+607 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [122.809 465.589 208.067 478.156]
+/A << /S /GoTo /D (appendix.G) >>
+>> endobj
+611 0 obj <<
+/D [609 0 R /XYZ 122.806 747.976 null]
+>> endobj
+608 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F36 596 0 R /F24 476 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+615 0 obj <<
+/Length 1603
+/Filter /FlateDecode
+>>
+stream
+xڵWQs6~$@>㴙Ğv& @7츿Z94w'oWjՒE(N~8yci]<Fy)RYH2<hqIV*9IKQbu0V5oުFg/E1rV H̪n$boQӍ&`&h+V [2`MW2ᨌ_xJ PC.ItKV";5I'U|k[hioMb dy%89udQz]#X8? ՞QzݓSnV;Mr5/hH5.n7+: 'Vq3;aFwB n7E+өNrWlVy@4Ύv"+H<Ғ(KE-i0 ,M>]eXc
+P3y$ҬLxw$ Zݸb\^RζD2-*yF3@%L7t/,i J,$CQYirWAbٙAuAS "4 t;7jV(ݎzdE|=CNM(aV4Y_2QrMFuY<cP8;YcU&Fδ38dxeFk@Ҁ}T@2Y#LS{
+w$*%
+[3N@5&f8x{v
+Hq/NwfY+c8yoI*]
+ Fq1Ӑ5u\ReQ4\Rl|Sxc%Тr=껙<hDZט^<ee/NjA\
+LsjꥳE;E"=M/^( %LsQ=ܨxNx\D U6Luk&J-Pc5<2W <0{M?f.y9:u矚 ޹|*
+endstream
+endobj
+614 0 obj <<
+/Type /Page
+/Contents 615 0 R
+/Resources 613 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 625 0 R
+/Annots [ 612 0 R ]
+>> endobj
+612 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [175.091 356.354 244.741 368.904]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://gnu.cz/article/30/pdf/gpl-cz.pdf)>>
+>> endobj
+616 0 obj <<
+/D [614 0 R /XYZ 80.963 747.976 null]
+>> endobj
+2 0 obj <<
+/D [614 0 R /XYZ 81.963 581.223 null]
+>> endobj
+6 0 obj <<
+/D [614 0 R /XYZ 81.963 544.123 null]
+>> endobj
+619 0 obj <<
+/D [614 0 R /XYZ 81.963 302.851 null]
+>> endobj
+620 0 obj <<
+/D [614 0 R /XYZ 81.963 307.833 null]
+>> endobj
+622 0 obj <<
+/D [614 0 R /XYZ 81.963 289.07 null]
+>> endobj
+623 0 obj <<
+/D [614 0 R /XYZ 81.963 258.186 null]
+>> endobj
+624 0 obj <<
+/D [614 0 R /XYZ 81.963 195.917 null]
+>> endobj
+613 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F38 617 0 R /F16 475 0 R /F36 596 0 R /F24 476 0 R /F39 618 0 R /F17 621 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+645 0 obj <<
+/Length 2963
+/Filter /FlateDecode
+>>
+stream
+x\K8ׯn6v{#6bfl
+gY8{uj$͖38Qa4yDT$f@ͯ}x|~y׫˫?( h9F8l{l7'jv]3y9|ϫТ h|K$l!ciPM螂GGb },ڼM|~YV5&W9SAZ禥*MϬ2O]þ<]iDW?gEn$\dMZf2m;nen4{:ϊ4λFAom|env* K BK'$a)P0hhDbFűUq‚~|ƴn֜r|]"눳`)l}]tk.Mu(WvΜ5 9 n0D1n| #
+0>eiN>~ִ#~eXw3iy_~׿CAfzR})&Tn!xMu=)T5nE%sKw̻M OwYP
+ tЁoaU4m]Z43=a"p>CܧKkۈ6^ƨb6 e[N&Zէz2Z
+& y0=
+we#P%,$J$19H8>$#; V)swi` # WQ\ GM
+֩(Ys4wQYY0Y'hHD|&01EjŦmOH0J-09B
+|T$"(I41IhvUmG\_j*}*U0K rO"6gOpJ"M\.O)9E_*%|)\e:9E%nt*WF,Fuyw
+Oa0)N.UbA#*U0&I\q9<]T!nBV*=
+/*  UsLub[7z\! lY>sbVgե},|OWp)!.g)HN9s`-u;DU0,a
+Jгi
+H4-O`M\G0aEe(bΕ6zRJ`vi7"pMeq߼z~9N2 tȕB0:c+l4 &mIv&Xg.$;K1:r.ۂn]V.r>`\a] Ron yUsq1ksݚ}uܧNoe)vME]D$ ]dXM ,xh1h9S+P #HE/ <ӳp(=3n.H}&ɸyĈR6笿~iBo':YЇqJo#RZ6۪谉38Ʌt:t"aHGckDvzmOa{nrI)8 &^)d+'rGk'28هa9ī|t.ẗ́l`BLEI]!)D]FMSk&po3uw*O4 M%OwD"bQ\Na8M$fn8*F-y_&#E:Ѽ ^;")~"Jh:)%aN{>3/)ҙfv_ cI1Q] zl}QS7p1:= w 2ۇ+UUŵ|u7lR|BńGax +G2H 6
+KX
+z=K',HAgs!FX*̷mummnޕ^=Sh&?bR˄ }ᯜ]|4}v3Eno.(j829s<w!$a̋ԮCZ(PDMŲW{ճl ,d<VdO؟<nEt3ϚN'a7xu6> ܓ)H8BgWNt#&'o pvq"fJjZo0llyYďnЛ)BUO+0|0*W3
+}fT>; $w 愎PU0Dﰁ#ߐ
+г%Cp:$=5\ v_H%;G+@ TV׶Ԡ>=ye_ ҕQ:p2g?W?!g
+endstream
+endobj
+644 0 obj <<
+/Type /Page
+/Contents 645 0 R
+/Resources 643 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 625 0 R
+/Annots [ 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R 631 0 R 632 0 R 633 0 R 634 0 R 635 0 R 636 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R ]
+>> endobj
+626 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 482.435 472.053 494.39]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.tcl.tk/software/tcltk/downloadnow85.html)>>
+>> endobj
+627 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 472.074 472.053 484.029]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.tcl.tk/software/tcltk/downloadnow85.html)>>
+>> endobj
+628 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 461.713 417.023 473.668]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://sourceforge.net/projects/tcllib)>>
+>> endobj
+629 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 451.352 421.256 463.307]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://sourceforge.net/projects/incrtcl)>>
+>> endobj
+630 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 440.991 336.594 452.946]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.tdom.org)>>
+>> endobj
+631 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 430.63 412.79 442.585]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://sourceforge.net/projects/tkimg)>>
+>> endobj
+632 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 420.268 417.023 432.224]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://sourceforge.net/projects/tcllib)>>
+>> endobj
+633 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 399.546 370.459 411.501]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://tclx.sourceforge.net)>>
+>> endobj
+634 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 379.222 421.256 391.178]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.cmake.org/HTML/Download.html)>>
+>> endobj
+635 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 358.899 366.226 370.854]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://software.schmorp.de)>>
+>> endobj
+636 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 338.176 404.822 350.132]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://plit.de/asem-51/download.htm)>>
+>> endobj
+637 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 317.454 374.692 329.409]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://sdcc.sourceforge.net/)>>
+>> endobj
+638 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 296.732 323.895 308.687]
+/Subtype/Link/A<</Type/Action/S/URI/URI(www.doxygen.org/)>>
+>> endobj
+639 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 276.01 404.323 287.965]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.gnu.org/software/indent/)>>
+>> endobj
+640 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 255.287 387.391 267.242]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://hunspell.sourceforge.net)>>
+>> endobj
+641 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 234.565 463.587 246.52]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://tiswww.case.edu/php/chet/bash/bashtop.html)>>
+>> endobj
+642 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [254.173 213.843 395.857 225.798]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.gnu.org/software/gawk/)>>
+>> endobj
+646 0 obj <<
+/D [644 0 R /XYZ 122.806 747.976 null]
+>> endobj
+10 0 obj <<
+/D [644 0 R /XYZ 123.806 629.225 null]
+>> endobj
+647 0 obj <<
+/D [644 0 R /XYZ 123.806 521.738 null]
+>> endobj
+643 0 obj <<
+/Font << /F25 474 0 R /F17 621 0 R /F16 475 0 R /F38 617 0 R /F40 648 0 R /F36 596 0 R /F41 649 0 R /F42 650 0 R /F44 651 0 R /F43 652 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+655 0 obj <<
+/Length 759
+/Filter /FlateDecode
+>>
+stream
+xmTKO0WHyR@-UEzB7qc$,$[@{x7c V3z &JX$Xg9dL<YQG~㾸/M$ۘoλ.?^y E!+;I
+lwLr %-{~zm/2gaDaE +]l 쇼2/5vqoA #Q4fD,!TG9UKUo@DI9կ2/OHSnulqaOFFcE@ȸƩ{@S`aqJԠ{8:AZm<WdnU_Ϫ֋/" QkR@ϯ'18(T}?l}2QH|dU-L35ʒf
+>;5}@X:6:~%J
+endstream
+endobj
+654 0 obj <<
+/Type /Page
+/Contents 655 0 R
+/Resources 653 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 625 0 R
+>> endobj
+656 0 obj <<
+/D [654 0 R /XYZ 80.963 747.976 null]
+>> endobj
+14 0 obj <<
+/D [654 0 R /XYZ 81.963 688.939 null]
+>> endobj
+653 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F16 475 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+659 0 obj <<
+/Length 132
+/Filter /FlateDecode
+>>
+stream
+x]
+@})srU"".2hc
++_C,jaw0Nw5B$1*Q vBN |T lZ΃w=uNOĐ3uif,%ڌ]a9Xt!7q"J
+endstream
+endobj
+658 0 obj <<
+/Type /Page
+/Contents 659 0 R
+/Resources 657 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 625 0 R
+>> endobj
+660 0 obj <<
+/D [658 0 R /XYZ 122.806 747.976 null]
+>> endobj
+657 0 obj <<
+/Font << /F25 474 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+664 0 obj <<
+/Length 1958
+/Filter /FlateDecode
+>>
+stream
+xڵXɎ6W܊],ΆA2$-h )y<X>PX$*voNw_}RQIp:Y^Fq^eZDU6x*u],`M$YTV5Ǵ̣.RyTּۋc4C
+3s|U+~ubXz^d'~!{!uc/d
+Fun&V|\Vwhْ"n:?
+UV /yٕB ' ój`ȕ=_G_~ĤD[!]1_ߎՍLG4QoZ6H]J1gMOp8PEEwߴʨ.cBߤhiEi}_X6*SWybHSjg*DG ^̑yTT٭=ndY%y5uXg/"iI l72ݍ4{CAwxn> GC7
+ 5se@p7| nD]3͸ϓ,amjυv!HѴ&b9rp?"m5RBdD t7uF:Lž<(5&!<EzRi-P! )nP(Zݺ6ʩyϠ+[~5$:o9ThOfYE5Ѐ~0rʟyEJ=?7b"I 5_01v>iy7Z^4 Xj0z܅ .IxW2,fra>k/E.lv %0Bd]5FknB."%E"Y}ģ:ғy^%!)}Q(\2pupZg3c׀M%-zw4@4D鞙/PB71[x3Hܣs~4RPcH簒ݦ5y^N]vֽq0#5i6ʼރNQ0ӴDdsfA /gb67E
+endstream
+endobj
+663 0 obj <<
+/Type /Page
+/Contents 664 0 R
+/Resources 662 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 625 0 R
+/Annots [ 661 0 R ]
+>> endobj
+661 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [341.92 375.204 348.643 389]
+/A << /S /GoTo /D (Hfootnote.1) >>
+>> endobj
+665 0 obj <<
+/D [663 0 R /XYZ 80.963 747.976 null]
+>> endobj
+18 0 obj <<
+/D [663 0 R /XYZ 81.963 712.73 null]
+>> endobj
+22 0 obj <<
+/D [663 0 R /XYZ 81.963 438.846 null]
+>> endobj
+666 0 obj <<
+/D [663 0 R /XYZ 81.963 404.069 null]
+>> endobj
+667 0 obj <<
+/D [663 0 R /XYZ 81.963 272.8 null]
+>> endobj
+669 0 obj <<
+/D [663 0 R /XYZ 99.891 150.061 null]
+>> endobj
+662 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F16 475 0 R /F38 617 0 R /F36 596 0 R /F45 668 0 R /F43 652 0 R /F24 476 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+672 0 obj <<
+/Length 2700
+/Filter /FlateDecode
+>>
+stream
+xڥْܶ}bʕ*s+;IWdVˑFU!13xyhKYel4Fߍ6ǍՋA}7 `;l@mbI7b[ Ĺvwo*߽&v^{ͨwoyvw_v?\~Do\M^_)`4ٜި$qC
+dlϩ pGlx$Z^Fk=)>IU0f (;cm 9kh?tmzo~M2 |
+<{Бlah&cTDz)z&bbX4 Y=&pxJ\?6
+ s`ܿn3ЗOG_FBO,,d$e "H|yYZ;"J4lCUP`0OɺRhâbj+ %47 *b+-^%R`
+NhO'7bŜE†R2i׍ÔXͅ>ӏ{! M35X+yMēًl:<fj{y}ځX7M7d. dM)t.=T ُ#HqÝyr _]ns4I0:r ["rMuQ,^9i%BjlsyԎä%{"`w#`fZ W `rlo.~Xs{@le#.x2 8f .*lBD>A٠NeiQX )~Fz q@Õ(0XFݢ2k݌^h7
+_J#Bƅ8ҵ\)@"ʏW`-`k,_1H@L 0d|>d5<?Uyގa!u%nCc 1Xs
+FG*pd~ʏdů#3>+J
+:H?c/˚#4~<yP”+5DHQ72}?' |/n@D9rV~^.rlR° +LGeL =eQe0e+r
+mvii0QE. ۀѬ6&MJ"q d7]&!eoN/HGOV0%v<cyv ¯_|]?,:,:=a̵{=6QE:<tm͐t
+endstream
+endobj
+671 0 obj <<
+/Type /Page
+/Contents 672 0 R
+/Resources 670 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 625 0 R
+>> endobj
+673 0 obj <<
+/D [671 0 R /XYZ 122.806 747.976 null]
+>> endobj
+675 0 obj <<
+/D [671 0 R /XYZ 123.806 506.882 null]
+>> endobj
+670 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F46 674 0 R /F17 621 0 R /F36 596 0 R /F24 476 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+679 0 obj <<
+/Length 2587
+/Filter /FlateDecode
+>>
+stream
+xڍY[s۶~􉚉h/Sۭ;v(s2&!5/* FgoDi",˷ [l○7A}7`,2 p%b].~w|w,׷o7^] o>"9\Ns
+{Uʼn?ֿ]\/$?ma/?E c-<7̳Łf608
+.s}6i̷ywpS
+#QFw Oea'a+s Y5pٌmaUueA<3Wua#۫ktpfGY+?r(#<<Gp8u
+UIA& yn9t?{aT;Ft햻d@\t-
+؎{^JəE~
+ğVZ'|(!7+ĔW58B,+>[O
+]?:~ᅭC3վkC?w xc!FKחܫuo@J_
+>RܘuON3*~a'CQqҩzKy|'NsٛЋV @]A* Oʟx{Ap8 oK
+7\ҥKu <9}L
+endstream
+endobj
+678 0 obj <<
+/Type /Page
+/Contents 679 0 R
+/Resources 677 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 686 0 R
+/Annots [ 676 0 R ]
+>> endobj
+676 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.199 124.619 404.156 137.568]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.8052.com/users/disasm/)>>
+>> endobj
+680 0 obj <<
+/D [678 0 R /XYZ 80.963 747.976 null]
+>> endobj
+681 0 obj <<
+/D [678 0 R /XYZ 81.963 712.73 null]
+>> endobj
+682 0 obj <<
+/D [678 0 R /XYZ 81.963 568.484 null]
+>> endobj
+683 0 obj <<
+/D [678 0 R /XYZ 81.963 477.206 null]
+>> endobj
+684 0 obj <<
+/D [678 0 R /XYZ 81.963 373.806 null]
+>> endobj
+685 0 obj <<
+/D [678 0 R /XYZ 81.963 241.514 null]
+>> endobj
+677 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F46 674 0 R /F36 596 0 R /F24 476 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+691 0 obj <<
+/Length 2431
+/Filter /FlateDecode
+>>
+stream
+xks۸gԌG:ϱ/QIL.|XPd2~žgΏ'?,O^\aτBA$<8recRp$r$͂3ݫ˫wo,:Xv€c 9yu)''y:rx"/'< vI"HM6@^\x3?IQ$xUak)RWO$-6}Ek"7K
+7-}{]cTKT5ڡgeXGQL6w /{
+ݫP]sLɉRw=U7ʆvHF`hU%1s { tX4"EM TW>0!g>K1<oJpE!<{\g7WP 槓X DIh!J+kW %PAF;Yto/׊>2:p<\ hQl,tQ u~u3t[K<_;:Oc4s@W^B~RLkBWR P7(k}8@}oҸ :pb?FTtcsnK#?Kӑo^G\<v kUnngҝHpTcơ\@=[+*LPj]U!PJ( /8X@ꛤcқbou@?!ɮ#)5r\1a,dmc/ojr1kP֔Rd(Uϒga]ԍBk=瀉Y ?h?()I9QE&z49g 89؊S%~Dd}4x23n{b3L2_&!ycY=)v"LvAjP{s("a>DWs^5}pd $0FuxI8<`5\bTc/m ]|}s"5Jm٦EHʖf#4(gQYH(q4L6uOki7ևUZPgԞG10k ;(6z #-M=YзMIhO Ľg) uթc5,KQE xwwۮWUuF@/ib|T
+($<NlSFŦރM`+3VUe怀R3W0/o-?΍AA
+.OR֪ơN [;SnwTڛ ـp2-%ףvJҤ
+5W"iG,37Sr e dü"T'n Ź875*6֌iwqX`awsvMZT;S06fc}0JBJlǨBJYB2Rn5ȕaz(cӹfK.1_Fij0תUEP ֬m|:NCLCADO 7la1aFZKm X|=4;Pqf 'Ӂ,v҄9[D&n&Rf'WҶ涟 ?t#zVܮ;y#Rs
+
+endstream
+endobj
+690 0 obj <<
+/Type /Page
+/Contents 691 0 R
+/Resources 689 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 686 0 R
+/Group 688 0 R
+>> endobj
+687 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 545
+/Height 599
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 697 0 R
+/Length 19799
+/Filter /FlateDecode
+>>
+stream
+x xU޲ +k]YDB@ MYE@`xPtB#Sѫ\GAFYDG^}OgޝMg>wL]Kz|UWWW9}u8
+T rj]Lۅ4K2x]Lvϕ;g`;sr㰽Tܽt5>5Sƒ6/, oMX~/|WnI訾G}vPqw؉K]yxQuVLi{CF
+[h{YkkfEw6rdnݲ=~ݺiiN1&7k}%d6kPYYm۶
+ V]]mkD!
+#Q^^ު)08..FxUAv-2^1_
+ Z K#9ŀlqj*.P b
+df{CH۫{VP b<o5_~2R<ϊ0 .Z ҇"O{k׎(ŠyU _3%Q pp_PcDin/+bB1+)2Ubhw
+_@>˙ʏI]!j];7m-&L0VʖQQQӳIAhEPzdU
+KfOÇTL@1(&X`в̏bc[]{#QHMIVҬjӃWLqLV٤0J-RVn >Se-[`Avș_F A1WB͠e]cA^<#7) i%wPn&*,j\)++S"󫪪
+Š(R5ܮ*&(-j~f@13aBA m6A1&T̉7^xM1^ۋ,MNzPmbL[YpTl/
+<(EP1r e܎/"mk( #Z<a/_0K,^:te!Ev o(_/(4h[;r)--t /&ѥˀVLh1b<[ db9 X/0Ũڋ\hA%^sa:_9q@^J,N2uFbrc4n/-. ħ ǎ۲.Z~tL&p2qxB1(FZ(%9ۓOEѽ'T8 ?Ҭ7W f}}bm7%&&(5ɓon(&V1N6(DP1ah ݾr-.u#oʯqe(F\xEQ,wˀ$<-1 3+&蘶,Ii9ՆW"AMߨ/x$Q&DY8q|0qm,]<Nq0iܨ(R1g-&I(4E\1ZLzZ0(A(ڃBԏbB&1`ebLIF_LdqrbP A1(2A1(ŠbP A1(ŠbP bP A1mE1(Š:bP A1OcU зhҹ[<?пOwҷUO*,;#د bsbB5N{(ŘQVEEEN ((ŠḅQ8GyQVVf~cbPL(NYVD{EFŘDf(hCkTd<)oM碘XSLmmm!ҴĚbU bh(3_ %֜;_?<FE$@2E?~t$"ۻtb t{8Wӽk!ܵpAhߕB.J=B6W])Wɯː!^sOݡ}W
+zuoӦ yDD1a^@رi.EGPL e(bY~vbL|ŠP)--vƒeqX/̦.cKPb
+c1h"ӬZƘ+cJts 0̪W(&?f}1 k&B}}0 *Ls <fz 뭮VUb؉i@blD7(p5yᇭQr2C4pt
+dh |I"r0[l8pUW]U\\L D52eJVVִiӤ1?H^D7$j_~?Lwh5&Wh5&ŠNpF\P A1d6.Bb0bP eqA1O4}n=ORb1리ȓ|YxB1-,5+ɞO&^]8QN٢J~@ת4g=A1VDRb9ztH<ӧŠ#֨XO1ihh?D<Cfӵª,))(,S1aY
+y0r#5d9+[*mȠe wi?1ګ0np%`#WQVʓeeeVJs}1Z9w
+!Q A1aDx}A16ń11)++<Ěvk)`IJ@*55up>Ɔ\SvKA,CA2[.v#bHrm|C1a}[Yb苡bP bP1P ,)@¢bP %! =lj(Š
+XRV1i(Š
+XRC1~TrkJ~͖\壩)ɵkŧw9r:ͤqa?ǎ|hĐ
+'1,
+XRխ,=-uvV,et=Bbe)#ynKLLVtp0·vIkP <2(<DYYj1o\μrfFXsGi!o(,OQ~d~8`|l
+
+XRx䇑&)ַ$&\4on_h Y8q|0]/FEb,5qec<-EwZj'Q_roIl&0a3Ta V酢irb,P@ݏbVk1rrii)A1zSSSS)`Ihhh0[Fs|s@FZWG@Jy'1PȈK*+kHTWW$GDbl1V@I3Va(`I])))1[j O,N7>gyY9+s}Ybf+ZP1^GS9*|A?h dI4*ѽba~p=GRr9Œ$/CelEߜ8Zn25{6h2英vuU/>k['@K
+Ezzz׎1н[B-̯u-v"QCW$(沔oO_Rd(k1UCbwohըj\
+XR (ڵmsޡOϫ̯}z?_,طהܑC]N?>\S||6 _,IHHr e^'bPLN{ɀ}{]m~D|в*.AbP A1(,WgL
+bP A1(1Z A1(XR1/o/OMINNr)ZdƋ `12 Z_,^G ŖZu A1+&-5=y-mn-y㬖-vmߪQgc
+q('bYb4W_ΙS-g;$'}mp}ʍ hW[;ݢy/'beyla+ʛ
+EEwR+hCK
+his$ז>1/55U/1:3aP ҒLxdv4=B}?<+11!WL |bP e9k1rr9˙G
+Pnc]@1(ĦbQA_ g)bQL4*J5T׃moVdDpb"Qm1;睯vsxMVG/^wܱ=A11rTCCI2LyWjjjb${qNJR)Q*0<b,v )WQ uQIIIt>0 9KRK,#^@pzd8(\TZZjl%nb0n
+CRc@EyMP)S-6 bH
+crHuuuFFmkU>Zv赃<_O*|A1(]wAM:د NԖ̞Ǐh;W߻
+.#د\ӻ;@#6; t-v̛V`‰ڪ%s 8H+8%C1b7=d@?sNIA_d8BG1(Š:bP A1(E;7G1(@83lٱcGuuGń]+."6bM|||CĂ{j,o&gwzs(&$ڽ(zrmT7bA MQL QxjZ<l֬}w /x;~v-j1A%U[P-$n_1/A+I*z(o?"*+;(&Z#нM,)b\U<=Mfgy9cV1$bx[2܏b\k{}|Tz \1r ;A1ŜRT̓[ڽ]e\~
+Rwmw~ߟy;?PUA~OTo^%f޴sSI)6[SrY6h2WGwglaN|~dAݫr<acc?$B1hekȗ &Mr9W魸)Y9whbk.H_IINzj9#^_3{K!>>^wYO"y(ƒ eq~`ſ2TҨe~ȷ'Q<E:fD
+-3hA1_JhlgS|⯻_׻{^p_V*vmzA~P=RrQJM2(@())z㓈͋ pвQLp2b pȢuQIg:fbP 1qb5Y-[(x2A1bP iR1]O˳=uF1(P wZ*v_h!M
+S1Ww8
++:E>o93n}dz9-) )bdzuu!z^WB1юgCYFZ )zО㯿Lv_͉_TIN+
+FR0?";rt )Qy9wt}/)Ƿ?ҬҚ5
+P
+qA5<X߮N:-^H*\?۴Bv6{GWEP1Ũ:&M:aV$//pկ9S__8|ފ>wXXriυ];}Lq#C1恾3(F&L2/ufi(Šb2/Ϗ/(ŠbbA1-O1bP抡ŘY1x~~A1(xH;ijW1n}V P3b<-_OňwfܑC̞;)(PQZFoA4OO I.@1)Fزe~A1(&R ei%(ƒ8Ӫ!"}+^S]]-^[[bPN96o|C{
+'C1"?WEVף͡i%11&S6UAyxy{yjJrrkMтAFmbBg/r͖حӕGw?b\̽3}ǎ(}ZŠen":\x~7-5=y-U.1fв+&A1(xH[L1-ϟJOKsYS׮X$ j\ݾ|:% Ssq%,wʑܰj] '1 x[yoƍsRm\壢ZT[Vރ}v\A1(&"ٲeln|-F5I.XҚ]&w?:pjv; wΜ:oo?oo)Or^th!=lOOQT J1R?3^1KINAUrv Hˢ̗!8l(*/j)٭œxEa?g-FB.g|93#]!SSSS}i *#]jUv(2z_˚Ŕ?1nwd# )wϷl *_y9Å/f͚x][$n 7pa.ӏbzl}K2qoR~Tc3Bϕ>y%sUTT>C1k277RzbjY|T׎?~ń6dB5LgY"MFYyIw?}1z識:*)о}d# NR)y1)F96CYS@
+ (Oc*ǎ|hĐ
+')G\8C0y1tsKCȚl?G1(4Ẃ+U,˗ubA<?Kk1ʱ)Iߟy[TS! _0fHX>zb.TPCo%(ŘV1WQC
+嫟O} @1(zm+.ʕ}B!9s:lЬYK/ PL 3"~!Dt>|Q n:5EbXvf4n2<T(_}}gl b̦@ 䗾o]bT $@1Qy[p8ҏb.չ},C.w%OWeKߏN0v(+(Rr/p=ǿb\XԾZT6ȓU}ٷOۓ;_9q
+BŠbPŐ TdF1(ŠfաӤbdl5A1l&A1(Qx=gFZ*A1 ˮghr3ڶibPL+yzO_JNrMϵ|45%tt.sYN_4nx3|qؑVᤠ)%"5Q QǏh F1(&RwmwKołPF#!V&b/H>ie||Gw |x`&ܩbHM+а>|P?bbV̛/gfeQy9wt}/ɊB9Ƌ2G(FTOyP(ŠUSouI3Mbh ݾrA 7pa.3pŨ,ҭ~PL (ŠH7k\0B0XѠ0Šc̟^(j1iV/D[`6@1(F'Hk/o/OMINNr)Z YE(Š^JP "(|}|?_EU8ï1' SnD1(&3gM{F /*)ݻvzzT6lJF^@D[c
+6bP A1(L%sbP A1i dLE1(Š.-h(C1(Š=8ŠbP A1(ŠP A1(=k;gNMLLŠbP P1y9k{a~}ŠbP A1ij1yc^_(ŠbPL8%A1(gc
+b% 7?ĈbBߞ<߿F}mbHD
+kW,|D펊1Ye(&J=L E-&=-uAb|ID
+7͉f0zN#룫
+ݣ,44yLI8!{cpFB $ꠘ7bHQwWm05$Yxk"b̀Cῃ^[Κz뇢#V.<9ti콓^gKQJ1پ* c*DMM~غefZZefk7ŸNGSSkK*gzUߞW''lDy^O=yzZOo۷8H{cBp>)V><\ӥCf]#k[GYu/K2[;*W_0xǑ|c
+1ϱ03>gؼiI#ϼrfFÔ8wLf!Ϥ`a1-s
+ƂE;7[1>͖حӕGw?+V$&bD%5%Yf+ΙS۠q CL,PNsM8/&/g4CL,P 1L1#BzZj||D">ŠbPL+ƳŠbbP S1P 3@1(h`ej1(X0 (Pr& b(P PbP 3@1(&R$Xe^ A1ŠAw?C1LbP !3A1(P L\ݥ!=u sR{jٲ%C1L6,DF1!
+=l O<ծD~ȀX.4苁19?ϏN{ x,6/3g7
+K??r
+A153?=jK2Q b N3oH,pA1bϙ$
+A1(Fovbb3.Q A1ѨbC,Q̤ql9֮X8rMV7F|0qȺ-P \*F׳psMy 5%93oKnÁb
+#@⠘"sx$@z%g11Vb 'rII ɂbyCC1BC'2ib@CCE^%Cy"&(Ƅ?4c bCII A1(&ڑO人:RŘ Uj#PLNdŘR0+.:CpkrGjo=ŕWս&gfZu],) GGLx,6/k3& ˅}1UZ}1cr9S^B1(ŠC_ A1(ŠbP @1(ŠbPLlQ A1(
+03#zvmzAr1 F@1b̟((a^Lģm0AW0hŠb
+͛gfoڵ.ob@C
+endstream
+endobj
+697 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 545
+/Height 599
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 12939
+/Filter /FlateDecode
+>>
+stream
+x `_bH!-\
+FP0TԔ"ADT4GQAԓ-g-R/D ܄+ ߛ\wgwgݙ{ex#
+,I-B<b'}(J*2Az}l?{^QFY10Q3Q`iAΡ}Xl(uW&ȥ2Scw'3d52ꈒNx=
+/C _4t9#FMƾBc5S3ߴPrݻ۝Jq0fZH Aգ
+"w5op9M̵U!O(/[2O Vk>'="g!:c:cTgu))n*nQYRqUW%WFIy2[&藡B_b~m BdNBڢ~-DoV6F Id
+1BA1:b\ݝ1 `#_) ~X@<]0]d!N#1ՇGdg_"3ثs2[ 2T̮=}"bLgLeM+d/Wuey\rycc] !}
+M.\>ʒ:wܱ@_)&m qct fn9mzYG󇖓POT24n0b̼‡>,'|aO[ŭdOk@W쒞gQ`CSz–beAnпpkaVI'NYS*wtTMyگ ԜG U9t㢸)SGz{O)` 6LؘAsh/6kn
+1񹹖dUtwLqDCY_:ic$:_iAA.Zz2ſ)_3F,ّ\4[ll|XNnL+ 5SP= "1 A*kZ蔺q+5$ xPYAA}<اp7edk^$8~i)DP]r:ZBk,GA:tȇtEweEj!^vGRpvWHFZ@YM Zo읦>M_/Z!g&sd~ ,7t<w4߽`
+^c#á^Ku1cNH%`8kRcWLF}. 1,H2{r<[c=ABH~;ۄXG|UBT/wŲ MW, vLROr[zAbVVoX222>9bQA~駟 ߽F-,((8\=io_Ȗ0;G< b"^(Ch3A"x'AAAAAPixy̥kA23Axyn. IiRIj ǟJC2AKAxB9$mRN\?E b[T\&t37,Ij*~O 2{I?Ⳛv531q A~&KE' bb:xi8Ԏr$VLR\~Rh`Y|6s=We2*I j]ACt v3A{6E7ArAAA1,bAL@ƒ|2?q>c+u}srva%TKR-d&#MEP<)?ɒbKAoa-+;> j\`UAL0 R!U أ[o}JQuE͍mA!QIz}ҷ+By<+6WL T~ԆwFaGk vW@ˠO0^Xj?PU>t3i coXC [%NqGg0I$O'( +ȵRMd%]]m*6INgL~xtB dŶlJ
+wM6;Y aKN !A nbALM/AXl澸X;oHqӂ;; 7 TcFGVs-$Cq#PbP&Ĉsm^x8F:y钐0R;Re0Ho]heh12tq5C0F C2!b I@ WY8=&c4UY5XKU&҂W{IȟZB|J6H bf@Լc.ӆ1[9by1$0jw{L ӆq & n:/!lt nrAA#AL|AfT%c>?7Č揜 &_sd@]Ϋ=ZWQE(ն'շ9wHaOA^]O?e[
+rI)w֊MALLR/>vgNޜ<ǎq's1ߧ5fۆt5J>T"ոOn\G"G㮫Y(TTgsF]X?-,h zt=x39̌ uS/ejLt+KCQQ'-#bF:K
+2~*H
+m$sdc^Vd.‚|oe&M䛷K$֓QK*f.%\{$rM}Aʚ ֺNCpOA:t@8DD|Վ Un"H11oAAAA[\A4s}>yA[vd@A$aŌXu\K۴bZ\տǖ/_d٧=ACrRݛVA
+ H`"1 f7s$ʂ1KՔBJ & K
+b5bALjҧ {$~J H buf 6IRF (IEAAx>fW@H85~R#̭eXҥӬo% gg 9H^v?U6ν~\A2"l BQA8JR]~ H
+"w^ ~ GAL|TLRjw?$ cA!wkD6!e/?ģ &>77V I$jGa~ ~
+NAZͫWd>R֊yZ2!|Gt[Yrl$H?kO&HO7nA}G7Nt{RRwR"ٯVQ[tGF0I xj8YG g&|fn
+x; ZA ?}uA<mA=A 2K<hr?&bDAz|p_|R!GO1c֑TA\I Fy׋#$wbȡۋs&ۇ ޺6h&
+6ܜ +Atu D K_f]ZiRKE 2D؋&U"Hv1F n}A7k a`LfYǍEi{;"8X  7 2ǞT4U ٧ϣ)Ex$U
+5$͆5>fxi%6EDwIj߾ -c^SXl c"fQ<#K3.4kA"GiQ(bsJ 'OjL(ݛAzU}a< b^/s3qz{ibOAf9nUl9+6|`1P12~U$r4=89^vpSz StuTuI *KoBvg]afQst@jz~֥a~߂2v8ʅAލh:2g9/f2_ fi}A @311\HV2 krm '6k Gnْ 2aUɺWpox]P)1'FkrҿGӳ |{ gf4q<83$i֊]qmw1A5|zP$^.P}8SDKtADb0]vWۧ BFP^(v;sb#Allt3*cNi Ǣwrw\GRn$kW [@>*opSrLA2p$D7$ T!9Hnb sA<:AϛqA<: Ő&&brTb.HU77{?`+
+88\qO;ʺ0UmOeR㇗lm<nj"Krb,LRW:[\|A.Wv$G&GE׫weZծc q"HCӯָt XGT&_t@p0}s k$>DJť[%G.ۦ)W.v]A,'H0]q
+]{~#ŗFSǭ.FtߐJw1AXx7!H|
+4b=ArsAœ 9   xU+APgvtMwTzlheE]d]Jݘ$9355!̂$LJ{'\oA&zS!NlS>A+O֥MffqN+ FgڶAuX[a 2`qN8c8Z[>B8O՞D>`Y.5EyMVw1N.O:MWUgoA8UFq{X>9Ou|s,-DžL~cMTt[c=O btaTWMjIФR&+O^g}NR'wV _ Dt7?$uKjAt<)'eweHou[}Y:Mx'#-HA5jI)7% xG4 b⹘5sJ-9ȥ\ `SH &w$U|`2dբu<T)H@\zw fn՛T z hH0z^w}7#ԓ>>%G:Or+H0WE]۱qyxB0-g? *`ZD˸I8Kz :kF\Y?}!#{4GOVkb}러xYc6̣H H-6=~vp<&쑡.>($W$mu:!*yޛkq`|$OY[w!Ex3VuN%rNYފ)^pnmzx<W N?tOHkFxR=ϴv4)?⍳N+/#>7I&w5OGR0gN`gW,O͋;. *zȾnX{mirXʻ#)H@IqN_A/:uwۗ:/ /9H#$HY[շv׍YAd]AT|4yѩ)7h A3dSAN2|̵g-~bĸH_5Yz,X‡J1_so sчҍ>{e [D<
+׫z4|+?ŖἆvFծw1
+EC$z=Ym)H,ݼ#I$rzzMRC(L|^ AD &AAAbQ v$4^en"7Ĭ &Gk/f_ 1nwʭi퉻mq$ո+Q4np㊔ED蕻.b:peGA2ۻ $kGA23#(ȸ𰻑={fE 5s5 "HxU+%NAA/e-zMYAn ^Ǻ y/]J#e4xJ.'ߞ}-x*D-ȫ&R⍉1ҩĨ6]9H Xkpmo6&D<ŶI~~Imxfn(\.߄m")v$a6gk{s*H)[FTO|ӔZ–+;8i‘/;= ;zN qx޲X:l5 HTAAqA:t@UjG Ҫ\NҦ 9  x 7A$: B3  $] "  H4T 4sm.Ȝ9BJ    и1 \ oBr܁ "/ȘrKRg˺Y ~qN/a>QNbbTol,).K̨ҵD^ecA"܂D
+RG)Drؑnt篷 FY'JR, kAT 5]cAqȶ wۘ A!o E
+]7L :Ywo̴q㩗M7z:-!gH HL bb(AAAAAbc$N@#BncAHRAA&^ AjMՂ3-Im}ֿ֦E5*IR%WK =7Yq`Ql1.ɖ%"zL.:A>5dSA,GCFk^bZ1m\Z H*/l+HV)/GPHں}uRtj7AӅk]گu[*ȟGz`SZFgOz2hb?&7s_2m!  H| b]P!1 O]jkj#H\$;^C8n  H
+R='>*H K' lkAjuYA9nbS~[#lHu%Ws~\ u'P X$74Rƞ ɰ,A\ћVL4= %Y3A!HϱXA&p$J9HQ+yu۶m^{\ڕg/(f+&|i^CefnVw$59X;Pf"؊LŌ :q$V"I*  Ā &vA vDl}M*E IRY 5I}g9'țdO[c A=G]Q[j~/*gv,LW:G[.&N^U|E FP978Ge& s82Wo4!ڤ>=p- <K ')3$!\>~v [ o4kl2 [UB$b<GDq|E0!Xd=xhQB!r/."q$AfѢAn&#"Ӣ+D֢' b(ȟ+k!>,R.?Ȫa;¹y=U0M?HhāBtj3>5UO\rd{PY9M[? AAAAĂԪeZhoOBB3A ssAHRA$AB 55ieJyk7kH{ Oیޝ_T% ЯMES2H%f?!^^=^><*ٽYoZs1kΘ˙l,s93˙&18b(&f[gLe: iw'>٬bnW7^vo=飯> jCUX Y2j;h,bLD,"Wb^ZG  Hۍ7ULb~"3E\$=˟П
+'w [<*71oul.9cs,gc˙\KD;bS1f;G̥1\\g!]bS׼}TBUq{]'U-آf*~F4w#2*|e4w.\v1AAAdx~w3 AWSl*jHM(dXߺu}Ə gB[ ry/bv1~1E;~{&_/t?^wy˱n.{3iw'=PSpq_m.o?
+
+~g.WE[ rʌǪ>Gnt
+"f>81x47i 䮶>K&{[<92nܸ]sOo[l}jbg!V'\HY{uko|U%rhewq|V$,%<ѶaOYb9^Om)ԟXy?CBLL[ɧxA ۊRE{#}%U.8W.W<O[vŋ՞jMBdj5ՠWW?VWb
+1|ڮ.xSq>x܎32N <\j0,Sϫ7CͅH]YIX5CT 4~YvI i ڻAAj;S5P3DU)+AJZi9(-gV/[<v1^VփdeUYYйtwc/P$Wl@裣܌RZtA96Mc-^YT 69*OR^<7c9YZU/(pS<X/0A6UWTfo>kydZYBr[ЎH9˩BQRXRK zc-^<oJ~T dnt3VhniAԿm1Drٳ/;4}݄G݌Uf 2xZ<XK
+pGózh*-+RnƍF5':92
+
+endstream
+endobj
+688 0 obj
+<</Type/Group /S/Transparency /CS/DeviceRGB /I true>>
+endobj
+692 0 obj <<
+/D [690 0 R /XYZ 122.806 747.976 null]
+>> endobj
+693 0 obj <<
+/D [690 0 R /XYZ 123.806 712.73 null]
+>> endobj
+694 0 obj <<
+/D [690 0 R /XYZ 123.806 652.835 null]
+>> endobj
+26 0 obj <<
+/D [690 0 R /XYZ 123.806 562.594 null]
+>> endobj
+695 0 obj <<
+/D [690 0 R /XYZ 392.797 517.198 null]
+>> endobj
+30 0 obj <<
+/D [690 0 R /XYZ 123.806 337.479 null]
+>> endobj
+696 0 obj <<
+/D [690 0 R /XYZ 123.806 173.962 null]
+>> endobj
+689 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F46 674 0 R /F36 596 0 R /F24 476 0 R /F38 617 0 R /F44 651 0 R /F43 652 0 R /F41 649 0 R >>
+/XObject << /Im1 687 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+703 0 obj <<
+/Length 997
+/Filter /FlateDecode
+>>
+stream
+xڵVM6 W7zRft&Ɍ;=4=h-Kt%9
+`<ke8ttHBMCyk44gR}ު59i#}<1,(\
+7 Ԃ=wS<̈́iv1I
+o8ckdNd@RՁVRA)wMXiٻ0\C9f}p+IKdIsy*P:^]ʻEp8^sȠ\^ Hː6ovE! ik^0y]_O*k9mjm۸ym-W7gCz+xE+Rx\r\
+%_cHe%غ-xRf< X{9[qQrh}L@`$FhO@I8MH+Ո+xu;(qqX’==9Rp'Rilf Z6n%; CVlq< RDRo8DنME3}ڄvX@IR؆`0c}W|*C&B?Fw@v]k]orڔءK <7rK/}|V:@SN gxX@3wiLcQ_WH_,\W֚UiD
+)A
+ \ڀU剅
+endstream
+endobj
+702 0 obj <<
+/Type /Page
+/Contents 703 0 R
+/Resources 701 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 686 0 R
+/Group 688 0 R
+>> endobj
+698 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 32
+/Height 32
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 706 0 R
+/Length 2219
+/Filter /FlateDecode
+>>
+stream
+xڥS[Wݝݝf7c;
+VVVvww9Y-7?^]\ O,ʔKշskco
+:nȰNb$lY6)XB<x`N>?k?$SGPt8uC::8&OFcZ#O>$fA1Aq41x
+E +.;I.ۺrکKkk.8u@C]g܋]<=oI8A6FPn!)HIE3 B dܑyn=N=
+9\ ăg7\n-; ':8$KQ`s4X
+n0.1 +!/QC/!ؔ>-d5zX7
+r:x3RE}tL|žι5DΡ,/m 4ݎOH0m
+|D\e~,"1.:H X_
+,
+,)  W*+arTY6P</ ,Mϸс7'Z]]]ZZszimOBڒŔ4TL]=ƎTk@cXEL2e4u2J\b𡹼kZTQ45PE]+s'SelS4
+=P(:L
+ghq@t]<oڜOso&RT###L^Oŝ ipPPz}I
+endstream
+endobj
+706 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 32
+/Height 32
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 164
+/Filter /FlateDecode
+>>
+stream
+xc`;!`&hФdٸX
+F(
+endstream
+endobj
+699 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 1368
+/Height 732
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 707 0 R
+/Length 133054
+/Filter /FlateDecode
+>>
+stream
+x]TW5{E&*aAEE^邊
+ޫ{o
+H+blvew3gx̫3o;oщ/ŵد8un(xPXh\$D"H$D'-Lݩ*:bh.a!ٙ uߖmqY5gm$MSsC8_{D"H$D"$Ew׉Dn <+ez.{+ѸH$D"H$O[gglŸ
+k Cc4LCp퍚h vZs%ܤ?6 3RgJTB oH$؉2 *2-yœv9e"
+"-3/ nW `C>o;SQoo`Åx
+{
+d[Uѳĝtame`bû+\L#~VjadRl vw!ѫ@H/ݏ=ggi<GMY4l->QNos'cI ƒ@=z[dg $e$.(>Q/X/ս{~$ vEsuL?Jj4*M#3~J&~*%Gv۵jJdw0xv~C~ J.~޾K5ei pE Hde&[ԹҸ̚/HXIg$Ÿ":BsqJ8ĥdCڊ%ɸH$Rw+ a zWB;j\qVR27iƂB;jQlcz!iBaĩRo/,gen<nҢvkEf XBZ_V/'/\wϗ?P2T4 dY~rBˁ'_0Rԕ1R_ޗ$uݠ
+ s{i]zrу 6hpX/liYЉJRZ^38OK^ݾn Jw\4;nM6T40Hgۅ :|T5<!Ym gB@ь"QgtF+}ͨan!yJoo O]VseځWz;ԃɤjE)k=_ổں7;1D"_ԶҸ+ v IBK:(*d9[>|
+i%cz@7!
+(C}~շoD";"Y%*.f:.3ٖi>
+OG:vRZ~ u/؞4Ћ]qH{_mӍtdM,c0CGa;Oq-mja
+OoH$ٵd>-׮$5)k[ie2j{I2@v|S K*)T
+2ELdj"ȝ
+GchE.\O lsGb
+&I4쓺Nsջg,ۮb{:Q4S֐΃OZIe3>y$c[NK#dػ c!p21M}9<wzD;&MǞ[]fOc7nYzӫߠkZX_pJ5SH(Ɛ7$SΰӉ~5d匴|v_pn \^T:C/Z_pfLD\F?fث4бSW"g.2L1[E
+S*z[7b7`_ UN+0Ŀ#zD"Y"e+rےcul+_΁kCx.ڇ3[żb}qH$<b
+ԲU
+R 3pÑj6W.[XB"ܔks:PCPD+[^#r] >o@խ@,ΙEH={-nC؇* ;fV;@84\'DM˛GB^W гѲ}Hm-8\
+"y4oH$e&>bb'&8dg7[NEY\[}.F"H$ U<UEPPE&F7|t$PePC dSfT )zB,"{ G"J(
+
+.CFkh\$DWY.65 'zU-;?wؘH$D~e&'O]Czn H8(7D"]5Mе=m,b.Z0{-D"H7oQfH$D"&[FH#qD%(Y8iSaE"H$o6U/$D"H$D"'lF @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 1 <>{lWtt޹())߿?P~znWUUd ٻwѣGS
+ 6ш#444~o
+@DDĒ%Kz͒԰ku5kֺ<yN(%%iiixq}pdSSSj
+JeeeQe'KKK!ׯByzQYYnX]/3nI[l= n"cǎ^zݹsKok@ mջhLtoohgS>
+hѣGs 
+ȝttt綝|嚒VH AKBBBFF&;;{Ȑ!p8G ʷ`L2%..vO*j1p@rV(wjpIjN;g:r'G @tvvPZ@ω...i_8ԤWRRR~zzz3)< ;
+ccc&
+(Qt>
+Kww^7<v/N`*vOiEe䶥ozE*o%%p{ձ?UL@hp?uh)-(DHLbQ^YӉE5JmU5vG,|<RiVvQxd*wCd\6(Н25r r@E:e.ݭ-3Z}J؊ʕð]XFF7/傂.XheUlm]jcST\PsfcSs[M..5**/֯l}
+>fhkk77z%((ɓN`%yRV?yZ'=5|
+v?x-<SSff5M?񲡡6+ӳ&Gf'fkFk]
+ }i45O>:~tu˘5֥G9YEiR3&f~D|cEI^l``0raA9RYYY>@}˭PWWbՋ[,..b
+
+ಟB')< >'<9="9P=#?:>@ϳd|
+" 0UJoF~5BCܠ/)+ً7ֺN9
+('w*/fSoll1SL,ҥ>@MMbR7rw^|vw\
+!#FW =)||UZZ0ZhϤfi7/ٯZ-Muxަ!-5g#9{Ӱ)c,mJ
+aq}`ȔٳNz,/D;3""0TY+)VV%0EC &-kךEE!:uڙ
+
+srS2>J}(qjFVʪF|
+V]||(D.v~-<37㬝[{%0/'O;s
+1}-*,`5Ŀ/v54!ȕ?Y>@i"Ӌll={Y]X\\U0&= _~C_.߇/`kEwyfh ~(|
+$?++Rܹ[8Śk?,"m[X:Y0r k$%!$?"r׮&QQk}
+\?'HgU]AǦ16~.uwۧ7O;>"G5Z(e#rmR~q6rl 5@ PPLKN{w444wZ5oN m99)-WĤ^4rT &@'%
+\# %T]o5 ء,
+Κ o?q)s0Iobj~/0/"͋xpt;5!X[].
+Wo2>Rc>1644C4]|݌_U=G?EAB?\WW_ZZQPP۶Rcaa)wXdbB,jʹl'dФYbDǷ/O=;m̅ +/_˗ U֊4OWbDE!:uao2͠
+d. >|/{oȎԥx2"kW+ ک;ժ6W<Hz[IEA[4hNEYK
+JKʉkvZ8+J:vz{ɞICC79wsNz죏+n%C@ {>
+˭=B1t-Ocr>Qsq{
+[D,4|9
+jSi]Ãw6~Y IbftM`RX\YP^YKJJ#,
+iH+4$&
+;h{ݺ=ESԨa?DMO )Ґ
++]t
+"#sCCRKpssrc|>nv-sYg]Gd1oiR:~7LM|utx
+6oL'O|{ 46]QD囉i
+N{ "= >'"iye9E%Քw˕e Љ>
+  lzJF◷0:>K#K~t8sEOMm0ffwXuG}%X!@H?hv1!hnD+ߙG@|
+ k:`H:_<t7rС᧳#}}KrWD& 6g=>j`Euu5IMnH:WmCŁXƍ7?~
+ xs.,yUy12?ZU}JC%" Y].*n˖[֬^ y ?
+;Cfoa{C;km^h6-p_g+`cǎitܿ>@>G :7n`
+F uo$fOAx׻/c"&|
+@j:»*=,:JÇ |_ |ʇ>9{Ӛlho9L3rúuŇѮmU3|ܻD[~x;﻽D5>׶.֩@ =O05q ep}}TwoAf& :>xDLK*< Kn4]${{'޻fkdaglH}u3<wA݄P"M_K+wvz6ƞ45]_wpѹ3s66i7mEV8|1c6$`==X%+۵k їK=;0`@њ5Ylvm˦Mnm[ʕ׺ڙ^`acՒ/{9W~^
+&\W槨X|l^륅6Gt謻zk|~`IbNH@ :n0J<)`m-1P),$S`G|#c}*6g,<w/`G
+FFFF܈e}4 >bIBC@GFF2poOIïN<%˿Mv@0^@|g/o$K--Q;k}ΚrQ֠
+xwcr)񓭨#٨9;wʝx@ }
+Q$(9p@I#
+ -]vjǎ ۶lr~&׭_FNDDFHܪUgpojeOo9͍4׮<K荐7m?ySxSrg]gX* EtJ% B@46 {"('eݙyvvw>; 5=~?qBU֯{b}@áCNKXz5@۶enDZ~˖;"
+.,Zxq JK.8lYٲe˗Μ6D#>tq#$I݋
+He*ɬf)JnnnNNNyy9r漫Yɟ
+?,Lh'
+
+:mӄJÿh77䴴h#WWW
++Q%bi+)>|M:@ll/?O3P|}i4ڍ7lX{ÿd2n<sL䆣SSSBBTI9bBwO9l6;))iW._NB@l}&W^^꣣]
+|[F@f_Q0v֤e&@8?6p9}:.jpSL;D}-%%<3>>t
+6>lfAd]@ގ o=*~~~St\`
+ "@_P3`+
+7
+bTD2~!ר<SM5Pk4&v5fs@
+^
+Z$Dz_"\}Q;q䆼R0snEمapptkEEW^8ANNرc2F,I1`^⪪Xt&}􉼽;輓q~t
+
+Sk'Ax\[hm#WSpl.5ʠTRFJyt
+#o^rܹs'O
+q
+^p`w޶uoWsIJ쐐,"j?ɡ1## Y,4eٹ=1_{uJxݥ{__{v^[G2V)>;^oߥ6h'FF(+++**
+D
+$ZWu5 m Fzc>zO>s' WP]
+"^U8ӧ {[_~ժUҷͿRJUVv`mm\61&DNO/,$KSVxxN\y׼9nZꖜrp|9+Gm7LʾananddPW%"yySN>|x};vظi{hiiݿ֭:f<}i D)K,q$uEjŸ
+ڔ5'm8 MDu U;->L$_t`}eS^YBvz%cǗy /CcW(_blɗ4Xn^&ɩE!FF&&ܟ<7tqIHNkW
+5gVb/Ú4Ǽ[̀U\]]>}&/?GGGq/~3E^<r|}ƍ6suqA-VXXrhTmHH0Jp<=208q_ǑBAw[ƒB~JJ
+D={e:::jeiiiNvğ&uM}:
+z۷n!+:U^^޸?`0fϚ%z
+DyYU?<n>NW'gH<() lv>!XY<аCմF<fv꿮܌5z>:Jm䑿t
+#eNh|>6KM-*YUPEؔɓ&%}&W.ggN{ܟhYgjzmzq/q?UQQ!MYϻ~>3.ϸ1C!R6i"]U>t)gvj/:
+m֡
+x<k33r䴋/_6^@#G߿k.
++Aˢ/[#mmmmnnFw+QPC
+Rп^%DsdGfgh>_k&T23rw|7?/C#.(\g#Ǥ)/ubgߌ_t'qr+Q歺\%yᝄY73Z[`:`NSBg`@}ƌSkT_W8>tz]Kk*QZɡED>xcnV%ҔK4\wm+Fi'Kþ꠿l{m#4=6},e()))t8i5k,_c*މ 4](wFN0{;wD9i˖-`̙3L*evhiF50dT`Vxlw;8"ʌO=vRaIiTiZ@ǧ l^G!g̟&xm)YPk2|/L``ԦAA/*)![<]θ~c=0J[QQU-O4,.9}Wg ʈ0`s MEQWH$&''755!ZZEN~/_I");'b'M
+ Fwv--?VG;hLnaahgn^:tPIW4A>{lvYYm[eT-Qnܰq
+zӅ!d2u(l9_F)9plLֆčHtUoJٳg =u'&NhB@Ě{6:sάLm#Gd/<Ba@!J(_vvt7׿|RMGLh`?VX EBv=1u
+]]Y󕕕ZWF'i>NLф:XC5imDu
+82/7f(;?6mo2! ><O_r3:(eB (cFԈٯ&<tkL>\JJiFFAdre|s!.P7j홵O]~4K]YSSSt548r>kW;fϓl
+Udcǩ wor1#G7m:3w-[K3Ү/!QitS+jNg0_!L14۱hס4g~a㢣վk%cl9sqC~y:?N#Sklk"}܂N*/[)X]λjwI'y
+zْ~Yo`
+uWzbZغ#Y<Ó3c
+9/f֖nD䬹W033 x7M#Pm;~/Ě{6进6nD4rtM y6668 Dܼi:eZ ( #A>Մ xevZt]Shî't
+l inF)(9'e9
+l['NtJ‡=] :֣5i/+u(n
+"hii *
+
+ edd"𰰰aXL+Z9((- COOm2MMME T&}}}Q%=zٳ&<ʪ\~VV9ZUVVֻr
+fff_\6<h:[[[;_YY+,>|yQMPp[OOwǍڄqvv t.466Ƣݢ5<嗔NHH@/..FL&OGG zZ.
+"
+Jr
+YtK+^Y^:
+ 666hnn󣣣H;d%'''w乣B̐mqY
+MۋMO48xPk~;"b2*:YYɤT*BWTT+#hݍbUV;릐+p<P= :@
+)I湔<E9ٹkht.-+kQNɧKn4@rk~r?.jr-kyuUU3ӢgA/p8Hndypχx
+FBB78ou
+ {jϽm:8bYD2ãN4,)*I Tc
+vedAkE*OQ>uc}Q^WGםzQRR:@t
+D
+#03)*8X[GWoݎjСs%?57[\ۺm Y<t'svЂZ87xܲoܯ\ubQ7ƏtO+]?t/}HV^]]3Qaie||AHX*϶OAFW=xYVE
+tB9,W/?PR.<<VWDd,w4^IkM򆘷\3@Jzz :{=zT4
+W'׮hGs3|ha ff.\RKhÁgryl444q B>;;{P^=A^|9..N$\>
+
+]ѯiO3 754(pPߖڞ0p@߂9b1ޅ z%%N, @hثvx|א͵`D
+q̻w/}o0`KapJ"uʁG+g/n(3VCiA!gϞ +|###IKp F=A BJAﲔpuu5}o9/P^; 999tH9 =洮T(L&c8.ESS}=s<O৊
+PA{`n~|>> 2ϯVDzs
+[DXP}
+fp>
+rӎ
+B`.}Vر<#uP}
+$BY@f=.- K. Zہ}G
+aAm"mZO3t2'Lq<, MIII e},;`ëQQQ=e;O@]vd
+Z lУͅ7:؞cqǸ8=C;;P|T< ZPyZu<A˪WTt=S惀5Y?o`OOٺoz.'`{2Oc5OhhPB2U) UGG¸|V>@Μy~7Ц`H
+fr}ߋ<jtAvj=¹Dʱw0Qpޒ{p<?ҥK#;O@B5M`` udGziii`{ګ+!yE~zLL凔Ḇz3ÃjCm硶箮Ap6
+
+
+u|esUUUDD\{MYG}IzA{qnGEE|?Nõ4}@׮] <˾C.ᐡ( 3p}ov&{gς<v(**3ÐiYy.yP2&T o)Cs)0FK7f96"T*(2
+9~,2CBGy.H@{vwrnqzTARRG_Сf$&?(> ^Cx!٘>8WJj\}cdjd6Q0]Up6K%yZ{7 0˔;Xg"?F
+ KpP^D0$̓~CYO=WM
+,lυU1UO//3Zo^KEPwNW~ȾljA=joZxV?Xʊּz2hB)cSMy8
+8(ddIM  >g~gaA*[ndk
+ )@bFS3»YW?[7%nMjX9èٳ!7ng~ݍ
+{Qd
+[z|
+i  >
+CJ 3Sm>x N`z.
+jILl5o-[ {d!٘><r>@SSӨQN
+|ҤIdXA3fdׯ_?w>@TzyyZ8tPW^m頠 { ooouBBŠ+`|>s9}ttt_|A|{G
+ϯur'p¸(҈Vx}P޵k!(-޸q#(q睝MOO|LKJJ cسg!7[(ɨV`K???Llll{{;@
+AA͋)]_":V@s?ۋt7(k6[i")
+te_
+(KcyyvH>DGG@:WQSS3P/Y 0YŠ׬YAe9>H$*..j'˗CLJ[]]Z{G
+!ftAe
+;%/}6C}b&O<}M6ܸqcҥOYpaaa=%^^^hѢ1c̚5+99 _M˖-;vK/tEz_V>F裏Ə?eH> <==Gk
+}
+jggRS`^vDwD
+ji4}&<B>̙3˗>/<Sn̔Lu<OAA
+jNZoƶOvfs  >F >ۻ3}
+ʛX.TDGG=jjj*%K@&Dbɞ8q) iz㺺6>
+}
+)  X
+}<y/
+|ҤIdXA3fdׯ_?w>@TzyyZ8tPt}}} .կ~Rٝ=vb
+(9??>9sN>_`@
+!n:R~ #G0!4ƍ'NHgΜ}AO>!>>
+jILl52}
+ƍ㸹575Qꆸ{|H̙er{E"]~$8 XB(ߊnP Tٳ"-
+ϯ˝z{
+4,smn
+@Ay>SxUر$Kԭ_ADr WBCVʷYȂ%ڞU9`Ua{\yTGu<"ߟAݑTMz1;[ȁ*+{ݽ gdϞeeaa\6AICBvr==;9@+
+Oi۷$+h!ҢvOg}3ϐm0< 5+ ^mU~y>
+HZ.省 Pyh@74(ܽ<|33Sxfm& @,
+/@D;_JTHj@d䏶|
+'8|bWW5k֘ړ
+>??>9sN>_`x>aAAx,
+11T?,FӇm>Ā7Q ">@rr2$e27n%򼳳o Y\%%%ޱc)\v -Z0BA=V~~~m}
+2loK:OꨮGDs:H;2@9 IP7fg9Re%uϽ ٳ,3,f#H"iH7 Nw`'h{C! 2^=xd-d[Z)vss<<<y2
+}
+HZ.省 Pyh@74(ܽ<|33Sxfm& @,
+XT"ӟd[
+
+<!k*>S
+uun^|˨ V}
+BI}e?6>Zm:qZ^xRTf`ΜiFXaֿsyB ;zKv<4Pp|&|m٩ojzy| >
+R k3Tl}Tt}>X=FeLO@/L>G
+. . .X@@\p\pA
+ϯs"wwHn!iX@1ΜTQ#}
+@75EdKJ4 _{ 99Az+4k|$ z liI{8'&oUNi,8kd&.u:Q]-h$%uxyywd$r@h^orJ{ww/C³gEYY"gX?FEEҐn@
+B@eZ54p{(m
+ZȶSx{{}g<JD
+a_t?!8r%?_b4#-,XH$ޛEuDK6ڴICRolIk&4ƤyV,FYDPT@MA@ *,2 30 3^L~}_=sϽs|Ylmm.]Ji777
+|Jj91-]z
+ L
+ӮF05֑g)?p2u$¸?i?VڍrXwϼVcvoV:u|WbK+//pʡ1ྉao81'ALk^:IO
+(YNDPGklH,*L醈~pWq3V0cHQa~u?=\;L|rvΆ/MyzS(T@S>
+g6[WN|
+n|/ϕK7Zc_z>
+})yFf͚SN<_/g&|~
+%i E\$<~48C`ni{л+ >%{M"`ĈF} tvn6Mlo/j^珉WupsTg꓂Mï]k2tY}:;H7_*S^f۵n`KK|
+: E6.0x{&,_ IzLdE9O$3#8|v^f@ |
+NY$ ~_.X~6pr if
+64믿^`ȑ#,uѱNNN۶m{׭4#00jOQ'| { J,-
+6$c8]TbzG;
+@ 
+Қ&ʷP}:%m%-&˼&Vʛܹ#Gj{jX+;\CBej4'DU{sJ呑NEGQ;}|EE]Hنݻ;wBCŶh{vrcr>_M]=S7nMDEeeC3IիW;88L2-%o6>
+ 5SZ}u>wQV; ]'5,<X)Uv6j\k
+
+
+et3j]k̈́Hjй((RwjlܴiWXX=<<f\ 33g5kˤ>qٳgpvv?#<sϽw_TTܰaÌ3ΩS[rɺ
+ /ItUUSU`ӧLlݺr|}}+bݰatttodFF|
+5:\Q4B_֬D
+w6L
+sY2 ;k Xp:e*_ND=]]w+;Oc~
+$u&'MƇ_Be>@ Ӛpu)H/uZ7?>
+;;{*ݽ6'N,[O<Q CܹsSRRd>
+g,-.qb8
+?w`Ά7<A+6w5ߎ_,~ܯ93+t?G;H3"Ll:lMyyPE
+ImܸMߚ̈́0 ~N/:S:..n/Se"}Ŋ?_^SIZߒ`dO <<|ƌikk˚aIf}
+/Xё{`` %,Y4-[{+> {뭷hWnn&bll;^&.55!3}|PVM~"{8CNif<ΰu+k2?
+l&|?޾8qYnJmTTL.>#>gyڵkyS[p@
+c}ĉ_vm/͏?/,,4Ni||κu(i۶mԀ:?TleGZ߿hp'?!3wT?t!; *|9z;|-/R@Ǒ)GKkȩM]WFM{K|YZpcť
+Fu @"kԨQk֬:uɓzf@"ld˗_x1>sL3Mb;v~&}4gΜj*,YPP`2TIR\7zHO֫lX/TR;{^%@VG) 6C/u%޽x͛D-^mR^J>K
+)#0|Ē^r
+
+&֭<|
+ĉK/dVt=zʸd2^kSbϞ=T`LdNY^yJSzʕ|V[[BBtqqg}vҤIte˖~<{6]|skTz=wCA%/.iQ*!,*
+|Lʹ0z-ڕ|
+Ş}Q'?"
+|I*mԩtɺ38dر~aGG&Tfɔ0<سぉ`M`'k;t5
+WWd~SS/:Uw7^70(d[ߺwo9 #bGGG;;9s$''0\}
+r&9ZSm];*
+Ϟmؽ[s(4^M--ZR&Ar+MH(3r׷UD-)Q59R-߻VcvKDT6 qV ziȑWvpp2eR
+g_amm
+
+Dooqff3|A'--M(
+թZ=%h Xz`|sf0 0,x
+ ՜fC
+s?kByph9-o]>@1I2O]
+2`Wbݜ9sKF
+>
+VolUeew:Umm N>%SS$%5xz4N7[޺\РJ2jիrK%P*F+*Hy;ŎsMII 
+IBPfub
+|
+77Q@@%oRw=mvMtz(G"QmbGGG;;9s$''[Ʉ
+>\zPDҖs q
+*@wo9ߊRZX0r")낂P4t^wwR1ŎsMII 
+=>89r-sPa
+O26`>F?s]P?vҥvss1 
+vU#iKT۔Z;}B].UG=%%;nkB{{(n] <!<_߀-'-Z$~sr醐<k%3RNL%w6uC红ϓBׯCB"q#7~#B {#|
+'--dM(a6>
+ڕ]:<xS # I {PEBJu'8RƢn }R$+[}Mu'z{sqq򡄏~^=o@@Xbb8I`쬟4#.3-MdWDcb؞ 1W˟;o\yM%xxx]Ohh4U
+wP>=E>XPȂTɭRu萀}@Wҳq󙔔MOܹ-7WFs1 >t'QT߽>u :ZjO1U6AYF}Lj=TX*Ugg˩%P 11dƍoNol&|
+
+ciI 'IGސHڵ&~^G}ndY773grwW
+{v-q=gG׷E4yNzYс$)MՒi摤%[R|+5$>))e+HSb(;uDņ}>郣t?F7M &^ fwo0
+l&|
+
+HI)4y9*ܹ^9*VJ.;㡡`m~t13R>qwbb{]60(.Rt 0&z`~ARxq5י=/7^Rwt+|}HlMRXU&־qn˩SXp=H#3=n,WY#'6IDv=+Wjng<he]s{bHvv=<Hmٷ/;)&S R#@|F 
+A(;X,vtt3gNrrL
+ژzaiim8w ӎ>Ͽf%EEezn~A+((g>=v??p0lǀױwƓ
+vNs7zgsԆsXѹt 6E9$K;}lDci^W@@XdYPM޿=TϬ,)BЧO}w`۵x>[e4q
+Ŕ Pѡ/P]xg??4 1FIcb.011s;>fSR
+<J'$diii"6T!96߷ I Sl}]?6c
+f+ ᧣s!8-ahh,TV64>/Oa=f8s vetQt:u~{:cSlR}~Hi.졥clA}>|O7Z:ˤۗ7@ 
+ ;:!}"
+~Nw>$t_
+ǏX |TŋCCC|ǃ}R唠_pF
+6>Wbbɓ'YZ(袌O
+
+ I"yK+??|b+ǏGGG[&]\\@7<Ӌ=J2$]!~!㪂QF&Q{J%B>..q=999,rg<88|$vFc/ݨXkb.KE(`G@&Q:wGDcz;oܰu;ܿ@
+tbbbO*%GGGxI
+o>YKII p|ϳgϮ]M C13gٿqqqtPÇȳlmm |||hBiii~%MjO@<͗{!Csr|;{?66Vzy(N~1:
+oO<IѮP(x
+s
+
+a
+x
+%@1v1%n܇=^a(ѩݴb?C~@I
+
+8gBuN[zRO?SN5waLApJ2wJPO
+a
+<
+ar|UZU+Uv)P{8?ܑ,\ c৖
+]% 함͒ >ؘ`F<
+)l+l.QSR$}a{#ف$K4n,b@&R{T
+hcOHz咇bm ^ ` w
+
+~+
+s
+|&{OV*jנVI|g7
+sn~
+$#ɤfPJhjRoga-x
+A+x䕀KH?)LҒ4(s
+\rZj{>
+"}}}DEnͦёy?@pppVj֬<
+)!=
+͛7?Qt_K;RJt&MTNrQ=)PP0kxy~~gG S˭{ ~ <
+l.Qߩ&Q]lXE|L%G+k䉷C{
+ֺhO#a
+;e(op
+%b
+F`fffll| .9sGt߷o箝[l믿P
+u+/g9۷k7oU K$'gD! 7Fˍ<
+Л;v5jֱ#^ԩ^}_oh߰M?S
+quTTRM3g8pرc zevv˗X&HF)'w7w"b^ ['7OO=S>yxxxАt+Z]iSr5
+C=]=;>w;vl,
+;%`ƍn>g!Q[׮_
+‚i٢9ETwMTGƥ\ڲ#Uv78m^yMk7<iY_1yU@
+խC+flLOL8dAߚիT"\k]7^-/h'''oo
+NG掑IgG-7:ygΘm~㻣>]v*VVV\Ci:j) 8 *.U%ӵUˁ$HTxՅ7kJK.^-Ξ9C>r0kp9W\a/ʽL1Wʬba%٠~+V*(_Vgz'OR"_ᴓ 4PPE{vVegpgXėxNi[iׇ9WޱZ꿭VaeoZٳP}K)Tox{yQ}Cv6gaQx
+mڪ(%$iggM5Wٳg;vУG^zOO#Gy?P7,dWpikVb'9 W7L3-
+SSW/\~<t{
+3HR
+w dd[T7T=ˋw|͟d1uHГ&M޲ ϧL[[['_C5ss#FSeJ@hgKב_~x⠰mw/ wP:8eRl8i%$iooԬy*TReoؽ{Ν?$ TXw111.\P2 D&޾]2_|Ii/\ 5:2&2.>>11!%%199!1I {54ghQ/<k0\zUWzmZ(v`8xp۴^ZSSs…gϞǴ&=Z~'ճ'L7j$u
+TfE +IVĠQ!qi[Ҡ~=vNPm+>3EXi9˹Γx9y9/x90{?aRV7ޑ
+کT]$z.y?[K@W).b'n 8]JdĞ$SRR6lX|y55k7hmۨQuVZ'""By{
+
+*jtqqqC WK^6kfƍ
+4/p`Vk׬f.k )]YJ?xyyRGn~ppL5-?D]yex~2:Ia)t~/^z5#(Fe<
+QQQ˗-.]:ܕ.X>'#(,}8"6]b85-?qT;Nٖz1e޺uX:aؓcjjj6mԩӪUmk߮]ǎ۵kG9 6Xb~Õ{
+ qJ'ՙ۷_xwﲘps~aiisp(iD%/]3ݳ;zeۻ#ef:ydXD{Py^={߿viXؓӻwtҢEΝ;ߟuuu55COP7P^+ȨX] ^ftWOib;v'&>5̸(]:oڸ
+KF
++͛~~~qqqD2ꙍ5zUCC{܄B!]4nDWp JLݩ
+ݨa?M1b8>>{+@[E֬<@sN>}
+Bd<@ %u(<~n^+ѷzʔ)ƍ1"W[Z
+%
+
+
+*(7oڵ+|yv
+~._hs5mڴbŊÆ (CW\$ܽg6!Eұ-@ZHK(
+֭[4_1b Q2 '''Md,?11?Zjڵ׮]{-R/^dOܹsr(5MܠAХ2ʕ+wرcl?
+!%MF LO*ڵkWPF|ˤ©SMGϞ=SqŌ!
+Nܿvvvʕk֬UD)fԔ4kmmmR0N=difG,X@w҅&NeՠAM6j
+[Nf|l;]
+0[jU؍x
+ۙ5k%BCC)5pvvf4Z<dVv~jԨ+dO(и-eHVV^/omm} )QqT7Lt1chR700wŏ:]"֬\pٳN6a„FJIRS޽6;:D+斒LUn mf o
+ x
+\@!Ќ(;gskpyyM͛7~u#k@_OW"=
+ՅB ՚(**} +}6mT
+0[r%U?~L/jԩSiVVV4ׯhi)ؘk0l0*.ʴL
+)0;ՓYcJwܙy
+éVC܇ν
+6E%N)" ```@CհmҺP-pVn:o<?W ҥ _
+*Ye„ :t`Ӈz!󽀼<(k
+ݻwjբa()ѻwo%ӧ0.+V+{ F)SF t)̘}ɅI}t2ba={6O*dƍ/f ?#
+[z%2ٝÇ*_H??DW'&&jբEVVe&%%ߟ|-Zرc#}Q6)/6
+ ɩii!|
+H
+]`]pvw? {I
+շ)
+ ӧ /L6ZRR҂ hahGbb"erjj˖-_rN0zk^xqzz:ׯ[lIi@di7n\|ֹH/1c6oL ٶmF={,rS2ʭ_<l'PI<230~sΥ
+BugM
+hsqt^(<x]],ׯKJӌh[()˭P
+
+
+gΜ)
+YnbbPbԨQ'O=_qFqX"FD%@I)r+}LŮtxD#ح.\r\ D9BCx
+
+8wɓ'ߥgdddfffgggef&># 
+w(x;awEw7{z,xJ%ԩST\zIhŋVVVEżE^ 2/
+V5jL2N1/ey
+_+<]vcϯʭa
+ %r=<<Xٵk6m #FДOG^q֭z~͍*fӧOGoddNa(ppn/Pyٳg_.@OO k?D[SQʷ_Q;u
+G-..<->6`^A03M^1m4N ˟5k2:
+'??ё; r5muuu)+2H]7!!UVf̘A OOϰ0=믿b[ K8N:qIIIԯ"rРAx
+穘H$ҢQ:x!C@}ϧիc~xãzQׁ ߿I>S
+ %`
+EGcbb.^dU۷oӧOV]]mkkwwXf̈́ /㜚F
+aÆBtn(t (~ ˗&͙3g޼yd$ߕڷo,x3:
+c
+orrr9<k.xr
+/_rRRR('!!҅Ncee;Oxx8tzuuu_wt3fhL=۷o'QQQ...] L^xuV*O 6.\`_Q#GP7LBBnnnU/qfߟ.*=<
+7QX})9r혢y(%KBBBko[[w6kzȬ;`N:QԢ*Bp6lt
+֬YOo _c)CtĬaP4J.l<;}J?^WW\Gً޺uKQKJJ;:p@; gܹ~)7_(?##P<y2?|pv(Ssl:Ԯ޷T%;$\O{x
+ǖ~Ō3>쳙3g~:t5!Ю5k155?(!pΝ;keV!ߏ̜篐LiMM۷os9%%%F`!""MɫPtR%?=zM>l_CRmfZlGwUSSSy!g)_CC~\ʳ
+̂b~;&w'0eE/|Wjjj<uӝj*B
+靥7**gϞTlҥT
+
+2Q.\o5^2...o}
+U,--lڿ.](֭E@@
+~u֑I ŋg̘L=۷o'SZd^HHHu-u^8pƍGqqq4[n,mʕ%%%s1n~Ɓ߿?5F2GQ;y/
+ |hhhhBi6J7obÇ_~=|]n%(.qFFFɓs+vF?eoS=設mxQ/E
+/_L ĜIN%œK6.vש!q e{>k.]DݻBΝ;ɫ_V ÜŔ&'\NIIɡC"""(F
+K.ULѣG) _Q2Y~rkٽ-[qHUĚ5kƌý{SN7{HHO?-//8~8w^_guYMWN
+xjj
+^v\sܺb|ִo^a^%7<ywrѓpO?dmmmeeE9mڴ43;%OGG<~q3offfaaݜ!88lL+WH"{"SNz>,Yɔ)Su]?Sɿ5559rP(dkkk5JrUFAn?#;;ŅBH[n;/
+{I(ꫯ(EٙB~)^\D!>(3Mm-Z~Z~,RQ=r3
+eee<xc
+
+dͨkW^}Uè~
+{/_߿֭[%s=jjj :D~ %(?%%jHHHtaa!y,MUYYOڥ&''y]rɃ%688
+oذg,X@hPo%;d==Z233)3<<jQt]JݻwȐ!fKѸ).
+9JFr$Imuuue ;Ɔ"h<q-mmm.,0|ƌ |\B ]K3KJJEEEPaʡ)00a[[[MQxMuh:ˋ}>}||G
+
+
+ܹdp]55겲(SS :JQo%[ճgO</?|KJDuݥLHUYYyA`=7?9YYYPXXZYn=z8pΝVZ?vm۶m7ER~EM
+
+]ܜYzn&{ڵuK\
+Æ [d ]]*v;++.L!UTTT$J[Y{
+u
+Y5
+r<0%O0554hPk8zh߾}uttG|y REE200):}>}(YSN{Y
+
+&et
+3ٚ)xt/_;w~!@f$[[Ç4MdN]˖-[$O,--mٲ%M)h׮RG=z'}P>~Sr:@=-LH:
+Y6;TId۶mKhذavTt
+纸Y\%LPuuuaa!ٱ06
+]|gnnnR
+<CVWdKZ2q#FϹ}
+ɉʓUdjwن*M$
+99Kոȑ1
+<)~6hc DTߝ{x񢭭[6I,Y
+
+ lϞ=ۺuRU|||llkoaPPћ6mb/MF/ٜwvv011/(G,S+W;v쨳}}lrԩEEE,.gjjrJѣncbbWUUUkrAEFFr%[[[ü
+PQRk}=8qb[jE)S|EԮ0a=TҒݾ>|N\
+u
+Ey:88(@JKKɀHT".\`nnnffv%.sƍ+//gs\\\lkk
+233觟~`@Q :allLVNr|zdKimmM%9--o߾TޚO>0ؿ?]<eR2<x@ῦ& ĉ)^zM ӎjj^L6*ʿkYXXH$ڵ۰aWODD,ž+ɕwww'0,
+zШ(WW7CTrEUU#G4*--&lS
+퍍}||V^pArglذё* h&
+E ~RUUutt<ut
+4ht:^Jr|ΝwFGG'O<tVNf۶mtnzBB-닻
+ӧrOR #GpҥKmC=
+endstream
+endobj
+707 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 1368
+/Height 732
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 1965
+/Filter /FlateDecode
+>>
+stream
+x!
+endstream
+endobj
+704 0 obj <<
+/D [702 0 R /XYZ 80.963 747.976 null]
+>> endobj
+34 0 obj <<
+/D [702 0 R /XYZ 81.963 712.73 null]
+>> endobj
+38 0 obj <<
+/D [702 0 R /XYZ 81.963 526.592 null]
+>> endobj
+705 0 obj <<
+/D [702 0 R /XYZ 81.963 375.365 null]
+>> endobj
+701 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F38 617 0 R /F16 475 0 R /F46 674 0 R /F24 476 0 R /F44 651 0 R /F43 652 0 R >>
+/XObject << /Im2 698 0 R /Im3 699 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+711 0 obj <<
+/Length 2243
+/Filter /FlateDecode
+>>
+stream
+xڭrί@N+&7lQ"3Еr>@DSD@kyK7hć\ׯ߾5Eo7*8VHL$A(KL/_Blw2N$|w?nw:Cmw|?iMx#ۼo~H`'9"eph6& D,x"&YFú>m~؈: d)BDi*R Hm.҃V#} U 8߿%}*8rQ"3T eCm(tN8~sטTvnƌaLGy4u L6R6mp-hi4P g<Nt#%N.Xڄcա˪2ͭLS$WѾ٪I*:& k렍e| tnN;O|G_ (&2q%O{g^WDLx7z
+u 윷F0Zyk jCWH"bDR,'TLh,iKlO^o<U2au1!RFY0ȳH9\_Uiy3),!"뛁yyv2Z!뺣" 'SD,RPE?/dsLpY%p'MEaZ
+4(Q)R6'! k0,m5G$KX}b)0pq
+i#J8qfu %T*~T
+YVd_P&>-o /$49 M7;7`Ę*$~{}/QOgT5';"ǐǦΆl:fD#DUx\GӸj?.+@^r?\L`g
+-⑵zzz"82h'7k샘~.XWOa+1r/n6ȗW[=ѩ@g,N_OCx?IP3r$ݿZ談k&u@eKpؠw+M ԂxL=ˆ{c/n t$H+XT59=sI jޖ.'pd31_ q9 9pc*u{"n]/KG4+ўEeErDYAEڟiN h>-PC*Y |{&rW/[W
+endstream
+endobj
+710 0 obj <<
+/Type /Page
+/Contents 711 0 R
+/Resources 709 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 686 0 R
+/Group 688 0 R
+>> endobj
+700 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 408
+/Height 429
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 714 0 R
+/Length 23557
+/Filter /FlateDecode
+>>
+stream
+xXY1 kuEYX;VlQ PLA:1P@lU Z|@e y̩9=y{9BuLLplCl<22223mX`p&###9slcbC5=Ӷ$QJF˒%P*96&YȦoٵ;pd|ztѨqGF
+?wchؐ%C87ZI 9
+7
+2X➱=cХ׬Ek:'LOzG*% fŦgЅ-)Kϱ;?
+CB=~"x'Gqtf͂[[$\!}Ǟ̒RRr9&IeKhpVl ah1lyPLp9آ^:أ-nUJ5mj5V'&*Yz:k%wkdaw-2uʧ}up0wߦ;Z~WF-Nl:;U  3m-R\3H GW]S=j%5V^6r=Vޱ]
+eqb˖Xٯfo4lqc*U2oS/!q3Ͷiը3aCjZkO#t0\mw;C mMj%[nY?d}uEX=~S\J7\c;xu!VlOoT ;"#ng*q
+C3)v8cњC9nB9bå-sO&Z%KaC
+J[m;s@p F-:>ttM}ذ;"18胒
+DE6|wxW) Ǿ~ P<V2Dm} xNu[%{ŅbLO [dMXOօdKOD)Ѳ%4IeEE|}_o#VɖkZz5!U+m񋜽-I'v9rtǍnFoP 6m׌?bgѶf
+[
+WSQTvdԪ=E\0Vf~hvh]b{222s|d֌YN鿘c#BW=ܖ4YܽZzͽ)|B]CR#wD.)\6`_^mr٫sz'O^noR("ֆ Y#v#Uúf߄< pAVS~>f:#]bӿ~ HYh;1c_߃޿y#qô3q%13sEرtM%¸<(%lILJY~B-V_o#C?[j}/Z) ʛwE9|1]M0oO5^hkɦ]hО;9_s=[Ls;gFz?CE&lNAf}~9񘘞ReF-vs#z;F
+J*:M6Za:-'4Y/5asmi5gCB.(U1^qZy(Zzc3U5LMo^_|aXf81x4UWqhǠYQ,T?dӝJXg.^.(e_[RcSND߻((̓^Yۺؚ2dYM!FP(JI*[I/-[vFZ)H!<
+(cԦhj-'/N0vMj/BsFty{
+ϔq8cXQ;3'[Zd9Ywa q52d?4O.=lmq?T5nCl!<㰥O?c|Wl’bY$*p2PAۛv^0QV:t}@
+#&^4.eu\ܲǮԨp5}x]cEncka4gO/|sL4vr{ň`gYnm`ShKфX
+kAgZl|MvRԼ%pӋ7:pL犌4]rS6dM,JI)+݊-+jU{ێ nUo ,t)?^2ޘ\R*ջykњ٠UN3O<TCJ _,=cX[M߶swE%eE6[zFMgԓI6I?QTRQPVk7%m{+|:|N{%N0
+a<"mtDlضMR+yx; 6\pqk:! =4nQcZac▎-gnUԴ: 5o8ha zYrho,&g8
+@@AQIcM:ld+yծ
+0qfEbXhщ]@}(.cӝO?d=|t㶀?lؕR2ZTlq<2p<k0u.H_/ݞ+5\N:DoGpt)[حхEe.V+ZYQ& ~ Wxz"ibm
+_直+uUlzbꞎDX[xFǰ7ƣoH1r;#0LDvQΧ渞X퓼/~/vk|WAt{of > K=wo E?+jnmglEc.*qgZG:.Å:1t'y-oec,*"cL'IIZ>]S L=(v1Ӣf :z*4V<v2s[Wd%v^F)-[* :0z[$/{r(`哼;yg,RTsy'p5jYcQ˽̼XmO^]gzjQO1ܢQKpaeԓ.@\wraAn}0v(YxA~"l̥髼lOƿK< ]O,|Rz;u.#Ge^i !ʢc&λ6x`W!uw?fS8b03BlOlGث`Vy-'{*j;kL@fM؜8&~I啡%A l&nNѲeFY`3:ea9dXeJdt J{]&&6$_-[mIlLA٥6<N/O%P96,Y9f>i'gonj<h$ʬ96l!22220F-!!9D"Ɉʈc$8ӧ/r,GcK"d5~Z?>JK"d2_prw''=Sy{Km:cH#O"]8?}e36=|~3寳߿/x^ׯ_}6ӧO׭[רQʕ+kkk\ɓ'_Sa*U?~,rԩ͛W 95Xun*kP?v^t)/ҥKߧ/ZlY-:tf͚mذ8;ohh(qp͙ނ77sN ^ ^ ބ ޅ
+
+M]vMQQ1++K9xApp=z,Zd((('77e޼ysZ~;vx WNNNGG޽{bp-ˏ/_Qn]tV?۷`pܫW////6!C C=*zu۷o_>j0`˗1鉾a&Lo/J8v/V7t݂[H>/
+
+
+ԩSX骪sO޽kll gϞUWW?y$ĩSE8I*q |
+"Ǹ&g̘ǀqb?kjj R<vˋ6uo{>D>wA .=̘/iӦaaa׮]jҤ 6zl_ɭ .ԬY3&&qڵk 2K͛}A,q a"$1I"^RQQp
+@rrrSr'Y=y(W^ʕ֭΂
+JBBB7nXE__} SKK K 1ooow]UU+Z'IepLl 1(ԵkW ׿^ɿ:PPP@6+ŶTV-EEdzppuϞ=Ze1}ǽDPN@N?r9;.z+Ԟn"[WHEо$dc^]#(
+
+]=о`.]­ ˎOHH̱8=Ic/.Y .^i]:}8999""sQQQhÆ$KIIQSS۸q#^W N}8)w;ucǎN0?F"dc\"<gyD
+CӾ/޽bG?XXX~_I">Ǟ}C𬬬I&ܹwA"dcBJHHxꕍ͔)Sk׮yYfͪW>5nݺ5$5IΖ}%ܺuKCCC٧Oڶh#VFSrqc- ZFRqA| 7;#8eeknҤ c7n`o]}%H؜9s7nzʕQF5lؐ{qL&fU~oK'e%lߘcp?(//իecb
+%;ľ5{-Urr2+}SN6MEEE]] +ڮ($9lRfM\qHIJJegcJR'Biaa!cGQQٳ{n 9VLLL02uԑ^2^q}Ϙطq-FGGs3%e3.}$=MKؾ}̱6n}
+P%S^=a+)N*oP^q&___ŽܹsRžY!=gll,N~(c GFı 6A+ cX&wE{&=cbN&22}ګW/_K>R%lߞcؓ'O0zK,ñ_(!oqVX,-cbI%Y|q/Ml=Xñc0Vׯ_Hk}Qcs"r^r%^YD)P".>#&El^q1o'嘤wθlCӶm[///"%U+7/a.788ğ
+dwk|fϞU$_N*os;zy͚5-Z@gΝ(]ž(19G^AעKLLYx >#&El^q1o'嘤wθ鳳(c."I&5jԈsGU:Kؾ pEnݺzꜜeJ!<R(}'4pR8[OVV{ذo͢*Ea|Iω;2{i1=K :q>CY\,{$F^g$=cbN&1(ϸ+ɇM98tg;9Vn^]8Vn:-kr 1裸±{zp{7ntёkWk}QX͹gϞի{lu`܃0q{1uFDDĭ ԅ^>ܽ{իW1Gnذ!]CۨX}Ϙطq-r)ec)'IڵG;vݽKؾrss1tAw !WɓTS,X \畢裸1Z*L(8p"yľ؜`8 5c8ę3g*))nnnR8&ףϸp}
+ ^ r^CۨX=1o'Z^)eܱpT~Ž Xy pBmfe0$#Jwʍ>o61D;vDqF PFo2'e͗}GAfff'N08Kq_f} ؝;w>|HDEH$qD"c$8F"H1D"H$qD"H$8F"H1D#H$D"H$pƵn4w$8F"c1$~Z&WRE]]}G|EGhќ8F"c.[cnjjذŜ31$;qDAArJQ#qp_&MwHOAJbBLΝC䦭J挋9h!"=ry͚5kז5G#H1{;.K'Urg`1EEE@ ZmCrc***SNNNMITSSK=k8kƄcc$8fraC@OZtu#c.]<|: ijj\Sȴh`8\DiΘ.2f-H$RplF$B&MMTUUׯLCCpYl8&6'8fΘ֬YN:H$R)r,=5jժcׯ^E[gm5e$YD~؜>;psq"HR0b4ǰ^^nNf$E;Nmp ^V,erLlN>ǬV[:ѽc$9X6o@RJ:]) UT99)Vs 駮45;oVMMa qD"$8F#H1D"H
+1D"H$qD"c$s,וıš< ###ܙbQU#HX1D#H$D"H$q{q,~I"Ljc18F#H2ͱ5k}RZ,-J
+KhUTaT8F"Jcv>}9XP۽=c$p,l9h!;Nu֑ӻ׉iBXpq{7}7yaڊ~{LիW7B6ux<uuu
+e閫%@]!gN'LԪeK?f͚*((pNW$RXd%%ԩa@͞Ν64|k45AY3v.oQZZZQ:lh<@9Pڕ\/ʥ$%E55c,gJ<ܜ/Gm:8pu "*ǔA*UUUbv+. (4qxp 8sئF mq yL),P
+(c,d_,BgȘU_D J!~7w;n@4+qlGZj,;8vن3-5;zbS
+;Qg3{t2q%qjE}#Dݻ8X
+ ҥ jժ<13g(++'''455чk޼y#Gs X^:h \BϞ=x5k={ܯ_?;;;HʱgϞeAAAӦM>|8b,n7og޿/1$1D_lm'O <1VzJ_(dddq?իW||| 7o
+ǏcaUbx$RXd%%X***SNN2{Bw\8w`҄9JT
+9eh8ng$FGkiiE:x&뤾JRp vp禎zׁmBl"駮NCI9ZRS _Uvd
+or/?[gm5e$vڕ\Tpn9sfDl8.2f(%1ۄ+Y7vt.,#?$7ǰkdݕs> |׷Xzjrl:Gb؁=H
+?٣{7AGjհD0ֻwODY8MҎ$jjjM%qD*9:lSG[^^WWz{5ht휜7nF͊~1 Rv"y&Vڒ8MvXBX͹Di}}`˚c@?Ta9wOHfMe``[>$Hca3LF9欤f#}DND"H$qD"c$8F#H1D"H$؍kyLFFV},pcN22eŲqL@"ʑc$8F#H2{=ޱ'wۿ>"H$۾gq#r1//RީS*++$*U޽{W{VZ}VR9cc}6}Ob9pѣwY]3NoM2'O>}
+}1R ߝ{ϭs.>{௿
+w޻kd/C#ן3gJ@6m(**.X
+ZxuXr &p [~=4yd$bϜ9Sh;žn:vܬY3p  Bdll,+lllZn "-Z{b96n8zzzIII
+/_i&.v]Bp > 7fϞBHc#7+(큑ӝ=G_|KB]?})O^&+:0$sss5kV^X Srq^z֭[8z\,ǰeQ֩Sc\[l;w.? qwwgXqt q ̕+WD.crnU'{þ &]jTfi%{q n$¦R1[[~={ӧࡗcP]5|C4w1 >|8Bn߾]Vtl*t׮]cO=`
+Fؽdg
+5<%W+MEzəw@)Sb9k׎c@ǰa344|5I#^zΝ;uttP'~^4 KpVK$͟r7
+l v~淭RyO59ru3$uݺuKLLf3M4sK}`I$YXg+c%\y Zw{׫^}w=f\w!j=SaKj֬>(DP4UDņj$/XFFF6mIcg-_}٢ՋOO/<vrµبK}'G];p/شnݺT8x?{ݓݸ_SS.Fۿtǁw=߉HLa;hiϦy?/=|u 0&Єy?_1 8F&##Z!##3BD"YH$q8F"c$D#H1D"H$qD" P97c eddddsD"ʈc$8F"H1D"H$qD"H$8F"H1D#H$D"H$8F"c1D#H$D"H$qFD"H$8F"Hn\+FK"Ljc$8F#Hec5k֐ڵjYYZH$qlΠٙ٧{zVRP~D-Eվ};[ q11lҸ1֭#//ߧwXN{[mmmEEQȽp)~M4A3Sr9 㔕Ԍ"~~hrI$X9q@IIiG?02uhΝ64uz+͖?45|sgٶ99th^ڑD Ą;@K"NJ#DUURJS\zAtd
+b9~ܘܳ)b'H1>?D"H$q8F"c18FQ$H1D"H$qD"Ǥ+וıš< ###ܙbQU#HX1D#H$D"H$q8F"c1D#H$D"H$q8F"Aoߦ<~aĈcTeJRu$qJ$\@ZWı;mlecu?-5s Ljcıb9V&LjcbK}LLjc1cIC=ULxGr"xı[n5iDKKƍ}駟D;pIkkkmmU&&&nnnח4hЅ Xbttbz왜=<<tttTҡCXo>t
+
+
+jݺ5KDիuHKK3f(++Y<zن\5vMyyV&'W?|QG.5fJ44mKVBcg!'':u =z4npy%cߟ<x5`]c
+*կ]&cҥK1
+.f
+DO<:uHضmرcYp
+!{؜ǡ
+?<y2;kܹpľ}0&L1JǸY 1ٍ'n}7齏?vy͊+/Yro [}/lmmG2^U
+iD (,љ_{_ʫ_ܺW($yچ p6,"NĞ]`vaa;9a!L6N1o9@OzqCBh>~q -9{>ULL 6k׮@'؎;eczyyj IDMsE> ]sժUf  }c<a# l֨Q#((aÆ͛75gRRZp.=+W2><||c!$O;~8.FǎĞElcC~>سM.1e7F X8bӁ Hs
+Agf̘14q]y%D}}}+Ǎgdd@X*9KzPs^gk֬ ^O?aoߎD%`st4+++<} D#oTʎ?ι&D4׷aÆHĭ}R,dcc 5j{>d`926W\^
+q+ |w<&* {XXDZ1cc#,qN 9V.U9o%''#Dyq8V.1>n$+w<ƥLjc/㣌~_Y^H"}PɊ|8F2LjcLk ,x<FﬦZn39VDNo1}E#H1D"H$qD"Ljc$8F#H1D"H$qD"Ljc$8F"H1D#H$qD"H$sƵ<b4_d12q8F#ǤpZjrVJr R982ёa-Z4JzУ{iׯ^lҸ1|rx:r7_)HLKM|B UTTLfNfTcuuutJ7o/.ں^W9;zDl
+8!"c:m! zΎg9q<rİ1GqgNjn,u7unbǬZpxsec'SNn@uСuG/#+c}9|͚5V,Eә ?lLJ±8sAȌ+_t;_ߑcFmdzgz^kڤ< #=b!21cLLܹg&r9&Ԯ]H)wO_v qcGstۇkh]Kcf+mڸ^8Ӹq"fzYxj:g}"6314.$r
+.ʱ/ZPNJ %
+M4vX)K☤̨WceOo=CPXWqjN4=gC
+s$+Q]&򥻷$}~Gar?vڬ0z3px\w1dpnFpWܑq
+!q61vAsl>! gku7&HhQCJ.c2Z08hZ9&~2h B@uv.v$IWZٻwOTM'^TUU1,B+nXFV̤\t4ߑc|\d21 =Xlje;h'v
+,<sƴf͚vQ__Ov: AGwl:`9p=_eVMџ6[!(I<&uI#viYL؀y+&Z`cnj5b1I;їs7_{2!jRc%qT\Nc輕/$gylWv
+o[ gjI\P`5!'Ǹ;-I{,_x>^a|9&_0Zb9iœ;QZ1qw;TWA?}@vQy]qMXIh{[Db"ʒ8cUVŠq}gceJAp[lִ b;wb?s/dc`WHyV,e5OJzc PB\eaƶ'uttx@31HWݻM:{HG?б۲@GRb9&%3Mv2'v>3,bEQtWٰs !%w.I}xbQˏ=rd#ŵc%tT7j08tfNlå_4_ecN[.1v'E 
+|IlllDDOl1233qNJJD?ݻ }Gn<F~B+񘣣Orssc bF%Q>~899?YUȏ"1<~8Ɗ</j<F~B+عs~$恜O
+gLLrΝr᎜'YSh<F~Bc&^lIYl(8ȈΊ6Dc'ı2 }{쁛! ٷo>z())9-ؼ<y$ qL?gpKgfO)<<HgN?:{7He-#?!I2cJRYOӾDJq8F"c1qD#OHıeR1o?ırW%qqPJc?p쳬brsTQe1O8n\k쬤%P;~CHHH^^޷Cߘc'?ıp<8Çsssÿ
+8F8V0==ˋɓ'1XP'/^ҥK1r?ıQQQ{e~r!6:Kqq<a\\ܮ];~8V^ѣ>>>O233IX)==;w +O*1
+?ır'?ecRq=#?!߉|wd1zow;rDC#?ceO1o?17qqD#Ljc$8F"?$?!H1qs26YٷYIp9}b{PFFV|/H$ҷ|dA#H1D"H$qD"Ljc$rBFFVFe{N_!##+3_MbH$RqD"H$8F"H1D#H$D"H$8F"c1D#H$D"H$q8F"c$D+}6 #FXH"}>֛d&>O@q8vT2I 8F#Ljc$ZecI:uAG8F#}_t$MLF{bPoa ]y-c1wX;vA'd8uԊu68B|kkf͚URz'N<}4X8H +8Ot fqǂ]UMLThРAʕk׮x7oײeKqrGky}bǾr"ڢ㾎uݮ{I<ӧOoذ_VVVllutt.\Pn8!
+l_{O36&
+;%fem"E4T)Ѳ
+
+
+GG zzz-8\N0~>H +]~{jZÇeOj, bgϞUTTLMMRvٿǍ5kj֬ }IIIHIII]p:F YN'''U=H iڴ|=N<I#eSRUzsƕ;mT)K#|]zAlYD₵8U߿|^H +ֺeJKEI===;t ȯ_zu،3Vk׮ر#[G[nإb^Z5P.//oΜ9]v%Ljcy<ɽ)оaGrrr
+fos5GRO2E(q3,qƕ] je)y7m$
+y&Q,Y2b1MMM
+#BDw9??H$BPe52ˡ9F[w {#QKޫ+Sf٩#!?cHbwG{h'
+"6cHb<%
+_-1*ȱ눏sFr(("("(112i]XQ"hjᚦiZDDьiZ~q
+endstream
+endobj
+714 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 408
+/Height 429
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 376
+/Filter /FlateDecode
+>>
+stream
+x
+endstream
+endobj
+708 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 32
+/Height 32
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 715 0 R
+/Length 1098
+/Filter /FlateDecode
+>>
+stream
+xՖO[uGW0p1sY1&[,sqE#M'n1怲 ,RbdEc^zN=
+\lvhS7pP sJf0 RE`J-rZud^| BX, $# F; sNWY7hC
+ *b1j#v؆Q@>++OXT&ˡc0+9v؞Q.CLbq.Rak0#ffvܭbG>V{9wvuڰgjhOmi;X4fM`ٞ_eb -ab9|qbX+/Ll)x"56Q}>Fϭ}u=|>n68o;,ͷ7EvA0ߌuv^z:nq!N%V(cA,>5C>o?uB+=*ş84#^@>3ՁmJ$ o)>ZCM/OKrz9sw$G>͐<^^SĊ^4d"/iH:щ_QK=G>/A"™Ǽd03` ĉKs`2芓/ZI(%YQ֨6 P%*IDIBJS[/6v[If&$o!! *_Z"=_<2xF;Ưӄ۟rկ9W^zD>6Z*!_}bM'xO3ZP;ޓF~=F_^>"Ժh^^+ofvS'{d %W$֬zlXq}by8z^a6vn^Ed(1#2~5~sXcB9`.[ݷ]"4^¯G2_Tn/qUvx2 ]j|{k?EL̎
+endstream
+endobj
+715 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 32
+/Height 32
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 375
+/Filter /FlateDecode
+>>
+stream
+xc`
+
+qd_dsme )EN7 [>}YxXߡCv^ɓ'V6 N/-?ӻޕ,E/_] jLn=wv5$gw~gKgg
+endstream
+endobj
+712 0 obj <<
+/D [710 0 R /XYZ 122.806 747.976 null]
+>> endobj
+42 0 obj <<
+/D [710 0 R /XYZ 123.806 712.73 null]
+>> endobj
+713 0 obj <<
+/D [710 0 R /XYZ 352.946 674.973 null]
+>> endobj
+709 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F44 651 0 R /F43 652 0 R /F16 475 0 R /F46 674 0 R /F24 476 0 R >>
+/XObject << /Im4 700 0 R /Im5 708 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+720 0 obj <<
+/Length 1273
+/Filter /FlateDecode
+>>
+stream
+xڝr6)i5uIomSLB],(}hFbEE7v{EehT,+\*?1Ϸذ Pi^$2RV(<Kv4D2
+oj0ƜZFph2E:)ڛw|F%>{T<#S M9BrQśR4W2K}_;i HK jQ`2Qm< v,UzaÜD>m X2 YRb䞶L8rA`q]0f
+endstream
+endobj
+719 0 obj <<
+/Type /Page
+/Contents 720 0 R
+/Resources 718 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 686 0 R
+>> endobj
+716 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 181
+/Height 58
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 1309
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 181/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xoHg'2c&0,PWt&x͜ؼpH*a)s"nUN/|0+}1|%B4Q
+Cfvns,ꌍtkn/1Wyy/~yN.QIJ,:vG&|ps.:R0ĩ.
+T`
+G(jii)++L(>/}8?ǹ[WԔtN9NLf6}> ++3MmL|\SV/_2);!Y__C|]ٿ B"$=aۛ7jZV~+Q"G˺?J( {o{‘9 weƫu
+@S$*:nnCAҜG[ɩ# G*I#|Ԙ|߹STo|9+BW܅#ҾiB>Ay;2;>$; =&x>6+nR쟝S]B80XF:S&q6H`
+endstream
+endobj
+721 0 obj <<
+/D [719 0 R /XYZ 80.963 747.976 null]
+>> endobj
+46 0 obj <<
+/D [719 0 R /XYZ 81.963 712.73 null]
+>> endobj
+50 0 obj <<
+/D [719 0 R /XYZ 81.963 531.41 null]
+>> endobj
+54 0 obj <<
+/D [719 0 R /XYZ 81.963 497.656 null]
+>> endobj
+722 0 obj <<
+/D [719 0 R /XYZ 370.879 458.038 null]
+>> endobj
+58 0 obj <<
+/D [719 0 R /XYZ 81.963 155.404 null]
+>> endobj
+718 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F38 617 0 R /F39 618 0 R /F44 651 0 R /F43 652 0 R /F16 475 0 R /F24 476 0 R >>
+/XObject << /Im6 716 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+728 0 obj <<
+/Length 2387
+/Filter /FlateDecode
+>>
+stream
+xڍ˒_*;7Z%G),1$'ƒÛק_
+3lJU=xBەzr|4v%Ox ?;0>GThHF_>xA0kmPz- dbUd-YYZ+ȽLr)ں e@noNh9.mudpXVvP kV'&%;*qr91ƲB/]C/"е5CƱH{/2h/+#n5y)ڬ
+8`Sqlx[S S
+ë8zUNN5 KjaXmnP
+@* DAg,
+L`+8[lS3&  NW:iO-2Ln}[Nl@Ћ
+ש[bfY&)fn/yT,
+5 Dbᡈ W=Zdq W4%)Ry;K
+4Z]b7TΰՐ:ͤADo6&I'm,n1,bV;Dm"ڟڱ* na9ai27ǞFW-=,^ZHzp}"\ƃ]_dU: c򷘸
+RB @w& '=kE-vߡ4^FDld_DA~\tE:M@iRHdcamЊ\wMs
+VZ]fյ,`$[B?q?}Ah൒VZYu\ABO-#?4(ʪ&"
+k q'qAll[,Pͧ߃,ﺏ@3&(~W^21uI|$
+ 0@~OEG' &)}DqDXq\T)5tjpFN:V^=+'͊˗;vlRTt#M֌e^iǞ 4}5==$܆HFػ8,{x}?vYQZ<yAX;ꢙ%%088#SDl Y${gyA-3IKC4҇ hk&in:έTM ~m?p]&Y }s4//[w"ryoXv'cDMoOw
+e 2 lG0?7TI
+Bo!ɠI(a_Dqk74 ON
+4~9R ;<,t0ފ Mz%
+endstream
+endobj
+727 0 obj <<
+/Type /Page
+/Contents 728 0 R
+/Resources 726 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 686 0 R
+/Annots [ 723 0 R 724 0 R 734 0 R ]
+>> endobj
+717 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 288
+/Height 149
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 8172
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 288/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+x{XSW;HH
+ 1!P` @LbB (0Ąb <L&z$0
+_=~B0w,نeMG!KJJD"V%,7 rRMMMJR.<x0(((440sG%XH$RT*
+B
+׿F)aΜ9᭭F<Y[[wwwO6??>\d
+r`0lf
+Nc
+$))ikׄBaGGGUUZ>pϹMMM&СC/d"AN) f| XWWӧO<yhtΝ;
+͛===͛uuu#K1 emme˖'Ooݺd2׮]
+\~r͛7
+CTzՏ?_
+7+,,LJJvZuu{FUTUUL>/RSSuh4#
+LBwuy3?`eE!@X夢"T.  ;w:޸6
+aqSk4
+@R.Yr­[\N./'tj4!!eeNjs ԒR5
+[wVϗ_tu)֭%\XYaK
+
+<ZPeӱ/(zz
+/6Pzc?;٤77j P.G>?c+W5
+DXeeXy9J
+ 1!P` @LbB,k~H|%s
+ߓŲb}0 1!P` @LbB (0Ą@A &
+ 1!P` @LE <$$bX:#t:]2OQ,x<
+"***,,?::v*vС2rYTK\۷bq8^{
+ԩSiii ,
+efsrrrvv޶m[aaL&CQʕ+\.W(n߾=))I n߾
+Ç
+
+
+z{{SRRpˇJ+W'_=2ܘ-[j8cU^iiѣG򪪪A
+̔hrF$-[;
+P(rrrv?
+¼<DBD"=zzz/_?4
+ [[[0w0յwѢEFWP( ď]6y4` ^R\ThB[v嘘D"mܸqʕeeel6{͍999nnnŹ\nss3~2S#㊊ }?DR龸:222jjjJJJuGZS---'^)#؟ӈO'xL˫ XBBBJJJۻ\RTTzꈈb\~ĉ>HQQQiiieee===ob~/`yՒnF!JdH$JOOW(6ُ?֍:JKK/^888g.\и+5oKNNOhT#> 7r{uҾrfgg斔78;;dzg...U}_K_\.w޽://[:88m###nzΝ/quu$FOcccϟ?oooƍ .T#'((h߾}zxx8gӦM~~~7o6`t2%X&;ͪU<b"o&
+ 1!P` @LE &tݬr@Io f,Q`N^ZZ:Lz37#+N? x
+Io Gg0N#_~$ x
+ NIq%:|YДب@ iT"[9 :[1w1xOF6\V|W}m͊mn.v~|sW"PL3wwϟ??66
+Z>_
+g.i
+KI k2Ь+U!ۚ {18γq(~NF>aÆŋ9sڵxUDc ?pG]?a,b]Ec
+@oߺlŞUVfZvxwO<Ν;?㏽ܹ3^`6$? Z8űfPz> ĹLjk?t؟X<8w]l(Waaaaaa#xxxܾ}[2#1<KoU;wZ^Nߪ#B&ҭ7a :p$ pi]s QmKo
+ 1!P` O%
+endstream
+endobj
+725 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 430
+/Height 225
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 20050
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 430/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xw|EswI.wz/I.%
+AM T6@ *E:A^.]H!z a7;;ϳ乙g~CZ*,,, G5j\E kl5YIŧ)ݑn*s`BL
+9|ocD
+6)=[Z&l h<Lya)[wFo IXxc\ Ffm܌;cd
+?o ?Q޺kvRJ(gu
+Y)vdK6
+ؽIj.1Ac]ʉs wrO,
+=<on*1xT{ȬAxN Bo:-T1b;
+E%h۷ܸ&[[<\*J8(rC;歺t[2k+0nσҽW6 ͹sگ)n82;k4s_i>֯nw+dI.l_j+@+}߾+qA
+I`%I^! s2w0R
+CcBjqCfm
+_X
+˩M%ϑWr;[YTQ^ۉ241T;V'ohC VZ&y}UєwQuEc8VXߨjSvS֞cj/-*Rj0]5ms5ס􌘊.FJRti=v9Fև
+>Cf q 2":Ȼ`i<M=,u༩â3VIES4
+ PncoՒ@0 lxbBdYWgKbڪOYK0õT!E@YD4Ş]2E.v| bϸ׵%b~Vyvv;m'릃 *
+WAy8Ê LƟ@0xmR.<-s p˖% 8
+
+ y 7ck'`fWDV ? :
+ۮcD,%Bv4Kxn8׼hvGm M!~^5a|',Of5gu4`NL
+/;6M~rK/òc+78en
+k}eߨf?LlG{V姝e u"lo ky&}N BBK
+%#"R`PK RPX"6C ^t,A  9|aW4ˤ>
+HWxkMZ,zH/ gQ1`4
+og&_TH
+)5z ޅ=kqo 
+#ky#0kyO -
+;c͏:aa '.Bl tsK"䓩3ѿgjȻB=i?/ςڒ Ok7߹镆Lc h)Foq GcI욣5
+ Ꙇ# s~BmdVKykܶIvW|jȝW=
+~CUD Tjժ5YnMfUSj3Zr#UJoujYyeҠD5:ϭ}3:H 1$J.}o ",
+c 
+[.P^~.$d<_KPG<xp
+"d2/9kFQ)u6mT?#6X)jA厖vJKr_R$by?~#\qSޥ|}9.N$w/*R}N~f?8@VԾֈ^e!^]T*x>%_ɴ"o~ц9m؂`–=<3opx]Bvy^6Nt $7{"kV(pw8
+mOi:^]l8/ pPF](ٶfiݧOn,$gs3WO$#4\L
+39*`4-x$=2¦VtauVr_n?AV K3tYgnzӵ
+9O"cLEvԩ3^{{nVOҴoncgcq]ʍ Oq%~\QOrEM
+iZUZXS݆DXfP5.!5ݨ'e K;Fł.m?GLڴ@"ݳiŸ
+W\Vɰ<+;'dܭݧ/tM;9X798>hYݳ/ M?fUV/ }9/]ӴdkڷpbpABkp9!~ѧL9 K0<뉬٢2իW84obd)2$.#1Vs߽%,lׯ߸~VĽb>ԇ׮߼(
+61t2];Nm DwHM%>>ȲU<smEA\<vOwk@fqnvsrL5|e*b<0
+)Z> 8Ŋ
+YWOŽ s(qN[mr5NSBAq
+>a1fjЈ]pdnω?; ofa Rm].D햎4 k HN}c`Pc7n(KF{O
+
+3tM
+"˙.ItDLMuJEN|r?I+,R"] |O.xinFhx,:e~+h6eb%/C4v!\NFƟd,0%̀7غN(gi@g;] a:έi1nԨ(FcA'
+_6$ Ɗ+,N!BK EE[B`Y_ r: hI=}6=_WQ9P0n죝+j ZPnxL;]EB ̘iP7Gŀh""V ϭwW]1^>u=ar~^Qx:|Ǭ6O ~3f7sӕ/Fykh*Qa1\8neXW
+G;W'; \kT
+)<зb"] s.OH-1cٖ+a<NŴ7l;v׮]qYUWH2$=C|Rsu/4::JXm2
+kH4!4t(^_LL`O!@SK 9{LIO,|,ufY 6Up;.\)mcϜ(#APq5L;s̻_]ιӇ=o6~K ͎w﮼RUG())Gu_eYyt#zs#2Eۊ۞+ 9TXxݼ^?|MUiG;Aa{oڸiȏK7w^<S1AP-?b
+
+32䍝dsG]%y.uy
+/LvCBVݝBh>!ܙ3 wN(ſ3xs^+NϾ)(( ٠vm"qF-u%84eF\>pmuV.Mp[ǚ6nc, %4
+RbtȨfVjS:5bW*>Ǽ"],iݣM%^gc[P
+*k|qkNSMx@\f)4,@8[I?.2pDqyhZt,3EK
+ h<\e1/E.TSO0HhZٹ3ʣu4Z[`|.`R$~paG YhI"mM~ά9haV]%h/^;
+c//z,z@
+^'>ߚ&nlի5خ,lvӍU?t27WC
+C%zC~ 2JHȞi(3cf15Z ܟ'cPo%=?+ۺ`sR _;W[M:qE +ZQ4zMySp_jv}Tn{}gO&efNkbۭџϭ+#PFU1M<
+uy޻a
+
+a0Q(/o;űB&^or`q5LLH@ SM~ʾ'HV_yzϡ8
+>Cf q 2":Gj)P?VViwKeE-iqͥiN4aAEƋpE?RI0&359D
+)
+vMՋtQހ>;L(ߎ :
+O
+[x<aP#uLxɰNм="Qk?dkbq 
+8ڔR?/%NG;@S7p<?uj—m%.ex]߬F}u·I
+?mkE!}R
+] ֙cx&Q
+R7n#K E6Rqb5)O&i1HEsb#VET[B{
+bth%+:OIu/&޿hz}U޼VXKPsD jJ9|~kR6{I .Qc+eO{ GWvs{ibɼB
+#ev#U Ba$oHWT>67)$nŞqi7z0^~-q=:$嫎ʔ@] O|e} K_n%Tnn^ћ5@_׹~D~{^@sxYfug }W>}'#mQNk~veeCR~҆/Dk\h-:g<j[/tj |RmpjZ_k~ۃh
+S3-04OXԜu 0m
+N7;3(@Q6C{qbrYܚR̖k*PAۭw(*0Zۧ}/rrmHxSL"]h]z
+r45ZSLꡧ5kmFPً@hu:_PNLNm1t[^Pv&bx([
+ | 窈3jp`(*ef->͓}$ӷ5?ox6'gsPJsxwX 5'v7kkT+U ]'`bϗx'l*+yfi"w,(O{c4.vFv}B}ˣLsK`}
+ /5
+ zD@ H($
+ fD=8ypX%O>y>S. /&ݾv6C톹ۧdlmGLlXJ0HW#k:
+ߎbn/M,W !r/-CCw,J?ޛDg3&%C
+ r>\c89eξȧ~'nE!BbPva-!BEE[B:oY" "aMcv._'>؈WYxkwڻ_ZҎ&-{xdglߜz횿@i[RV=*N<7cuPL
+39*`4-[p]Ӳ@` bٗtuJ
+OK|E|4xQ?ӬG|_*]X;JC
+:'qFijЩ 4U]Uν+ɤ{?Ye/U`73T"],
+._l֌"x1?w߬g>|܇S5۱{ <
+@?&8~7D'BEs jP?rsY٣
+b(\~G6q:6 Ƅ2A6;jT{Jj ޡ8쳤 !J[bӔŐغDtXX#
+nMT~T2eC=O6_z.e9
+塍
+D4aIK!K!BӤ(13٤BtnLy˦L6 ]k`}|1y!8+\*u /in^Y6djsϮZ\i Ӌj oiQ@BP
+>i?.v_H4$p=&- ~㭥'"&Vo{ulX {$̑X_>mQQQ6!PQ?^(BGYxk|ӕ^
+_ b@NxLD$5ώ/[S}o;"G(V 5(
+vW~HZ)Η/,DDеI׀ؙeK#_H':6RMk,/AD+ݚtoO=fGKJ&]޹DDҫIQ &];5_ů- IL"&R(TcBI
+endstream
+endobj
+723 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [255.545 668.563 262.269 682.359]
+/A << /S /GoTo /D (Hfootnote.2) >>
+>> endobj
+724 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [427.687 150.927 513.345 163.501]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://hunspell.sourceforge.net)>>
+>> endobj
+734 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [122.809 137.598 203.239 150.039]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://hunspell.sourceforge.net)>>
+>> endobj
+729 0 obj <<
+/D [727 0 R /XYZ 122.806 747.976 null]
+>> endobj
+730 0 obj <<
+/D [727 0 R /XYZ 123.806 715.203 null]
+>> endobj
+62 0 obj <<
+/D [727 0 R /XYZ 123.806 551.714 null]
+>> endobj
+731 0 obj <<
+/D [727 0 R /XYZ 333.021 514.42 null]
+>> endobj
+66 0 obj <<
+/D [727 0 R /XYZ 123.806 280.528 null]
+>> endobj
+732 0 obj <<
+/D [727 0 R /XYZ 141.734 166.092 null]
+>> endobj
+726 0 obj <<
+/Font << /F25 474 0 R /F44 651 0 R /F43 652 0 R /F16 475 0 R /F36 596 0 R /F39 618 0 R /F45 668 0 R /F47 733 0 R >>
+/XObject << /Im7 717 0 R /Im8 725 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+737 0 obj <<
+/Length 2585
+/Filter /FlateDecode
+>>
+stream
+x[]ۺ}_G,
+ݟU|0l5s aS]ԉ%"DDzHp$`F{ 8J8Y4Ru4-"\%a.@P7vٖmYP*}Д&i q
+pH#Dx!ú_F$uI_Ų\g1ƻ `EF.Ma3? `0|_3~dטO{';e.T%%CiB0 B  Aiky^e
+wēcm4߭/wm8s
+lr7PPKJ>
+;lC0N<yf,I b7I{~Yw<kA
+>Jl4ؾ]Vq~m7J;7TY zQU94HELqUT>dݯM -ϱz;S+vȫ!c[^^&jvֿپ{F0?Ѐg,A$MeSGv_K I0uƶk\LJzfc<S/ Txя'tRygs2V;h1e;O&ϣ,!$HGN&l]I|Sn7U9xr
+V1~4>ˆp/ 'Mc?غNT n kk+י`NHcJD8v<Ap8 ^8Gm@ʺfߦt۳t]6x[W(" z
+W6~PvqS-yl)/<4HтA~b9[5WEM:;ƤwyhP7D_!:PZ(n;KO1AH ȺB錨H>]Td,P!Nz.}atM<zCTaBzI6<+1l;9un%( @ 2uD,xPTsm}'Nc@os@p(egT=ܯ~r5ƭS6s ($U䪯e[h:z:w #}բ&}ʮJjo .T=@ͥ3_wYPś/9"-U$OO'
+>'i rtZ2A1F>m z@e
+z@ڈ=[.a 2(&yD30H(I:¢cP<}J?[HF!]{3H#&ĵ{#2>tU
+endstream
+endobj
+736 0 obj <<
+/Type /Page
+/Contents 737 0 R
+/Resources 735 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 740 0 R
+>> endobj
+738 0 obj <<
+/D [736 0 R /XYZ 80.963 747.976 null]
+>> endobj
+739 0 obj <<
+/D [736 0 R /XYZ 81.963 674.61 null]
+>> endobj
+735 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F46 674 0 R /F40 648 0 R /F41 649 0 R /F36 596 0 R /F44 651 0 R /F43 652 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+755 0 obj <<
+/Length 2198
+/Filter /FlateDecode
+>>
+stream
+xڥrFZ˜0MDSDHT@@k_ARсŞ~OwchOW?޼&")!R%6͢\etD2],UT|V`X%VB׷~)Ww %Ooܬn?}dvꗫw(Fb"W&Jh4
+:|U:FHFYIF%ri^?A+Sćq5<HD<FKY$yVEʪAdxp1pey<#>|aL_3Ǻڎʼnl
+"v\>vZÌsE&o
+f0A9j:i5$AS УRgm~h1N 9aJa"ZhZZ?+tZ[P[T0hҡkD4DT<˛N#ۯSY@2UbL_T%Pߺ apBAz..RDఓ}\Fp;aIg=d}SFs)nL]- O|:uXu%yϗۭ߀czt8WQam
+[x
+0hGSTm+JH2r2|:Iӄx]%}ӓswAAE+Cf` UhS:θH|aɡ xlkH<6
+endstream
+endobj
+754 0 obj <<
+/Type /Page
+/Contents 755 0 R
+/Resources 753 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 740 0 R
+/Group 688 0 R
+>> endobj
+741 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 759 0 R
+/Length 451
+/Filter /FlateDecode
+>>
+stream
+xc` 10<W}gL Xơg~g`xVĚ'V劺{{'_zUZ$o|xtfmgg؆x1vq+AfW<<#ÜsnX÷
+I4uR\?k<o<_j6LYa.?7_;0C<|PCM '=*mej7^wv3Шa``=WB`S|>fΪP!oטv.S8ӝ?3U_{n7N{jmbT7=;9An.@Sp3iyjڑHf2X]7w쾟rT%/ß\h a
+endstream
+endobj
+759 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 109
+/Filter /FlateDecode
+>>
+stream
+xQ J$ R& 8@ 6ڲ r%%z;
+endstream
+endobj
+742 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 760 0 R
+/Length 1100
+/Filter /FlateDecode
+>>
+stream
+xڕ[LSY5>xW&&>HoE[z;=4"P5A AP NdRĖOFI*6dPCi 983,f<Yi׷^{km+߱㧸8d
+4&jWUmfh !d2ÇG$X3\nbSEII@" IK2V 
+K&[V*pa R}g0
+endstream
+endobj
+760 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 52
+/Filter /FlateDecode
+>>
+stream
+xړ?9_f,
+endstream
+endobj
+743 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 761 0 R
+/Length 496
+/Filter /FlateDecode
+>>
+stream
+xs"rov¡EcÊySHDΗN1*n>j-SWw&U5AH ?1d4;XÎ7/:cg? L:ן?}l9Jzׯ?O<J"F=b_)O|}Jg>`_~U9?fM4-aȔӁ*!ꁆ{zQl㭇n  ]w]{>sb ڇMje
+Tq-eƍIWb/8L,u*kS2Q߂3aټdEI[ꩻ/:bgsw=nZ9+a2a]:ejq-
+endstream
+endobj
+761 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 176
+/Filter /FlateDecode
+>>
+stream
+x;7 ނaӎwo@$d8! ٿ1000p؀| S̀ ee''0lr'DzD*Ŀ3`
+endstream
+endobj
+744 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 762 0 R
+/Length 335
+/Filter /FlateDecode
+>>
+stream
+x*/H8Ѵ4jgʆ'Go_}L'"0D]xԻP78Qÿ1DHrd7[/,¾WdTτw@!
+endstream
+endobj
+762 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 127
+/Filter /FlateDecode
+>>
+stream
+xc`!H? c
+) DF" # o
+΃D88`#}B! j{,@},~PL#(D
+endstream
+endobj
+745 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 763 0 R
+/Length 346
+/Filter /FlateDecode
+>>
+stream
+xڝMo@iAP(X5U* ۘGCDb;jP]B0ͦ
+v0 a8 PmF$~B ?L~xE U~Yj
+T^% Fj1hZtrȎt:eYuv[xD>y2
+ I3ikVf<L0q%:=2(L0 h]vl%5œ\tá(
+B۝f?0 N4 !
+O^.b=@x;"a21{
+endstream
+endobj
+763 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 262
+/Filter /FlateDecode
+>>
+stream
+xc`ٔ7p2
+B[$G!Yf !)5.x=k$ȿnh[0!|46J#L
+ѓA&r"IP#Hu.~WO‚www"J&(ivu402A
+endstream
+endobj
+746 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 764 0 R
+/Length 655
+/Filter /FlateDecode
+>>
+stream
+xc` at
+U`` YVǓoxT3RuL` @(+q5?r_h-y<J|ydRRRJ@AA 0:~-Vs?~Ȃً_6M^f.֖
+J%bUk6 ^.;UI`Q
+endstream
+endobj
+764 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 328
+/Filter /FlateDecode
+>>
+stream
+xc`
+B[$G!Yf !)5.x=k$ȿnh[0!|46J#L
+B4&:_Vdwww2D"MQ Lj^Y|%ޟ_@-zaLYh?`d
+endstream
+endobj
+747 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 765 0 R
+/Length 493
+/Filter /FlateDecode
+>>
+stream
+xԒ&U٩U>pPX;nX%岌$TbwX#aXj>&(En3_;:ԟBELg L'F|
+E{q~ Ę AwQ<Kyz: Fcё$[9D RycXlZ3X Tv=֤ؑJq aHb8Rw>"\&Y o[<&
+FRF
+endstream
+endobj
+765 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 98
+/Filter /FlateDecode
+>>
+stream
+xѱ @ ACB tHI. 6
+endstream
+endobj
+748 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 766 0 R
+/Length 694
+/Filter /FlateDecode
+>>
+stream
+xRO5aJ.튡[b EbVEdT
+ݵ[_l69uJ)4+= *qE>Hmv_ ^`(u|z3T0MPa %D-<Hy_$n4÷1Ϳ_2vYfOR;WCoX3
+tf_zOy+lPpASdŗ+}gӘW 7A>`ڌ3΢[,)%Yi23{9Yߵ
+S7BG- xwF~""Rgn# PAh
+I@>+swghPhRE:3tL
+endstream
+endobj
+766 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 115
+/Filter /FlateDecode
+>>
+stream
+xc`
+endstream
+endobj
+749 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 956
+/Height 175
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 42481
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 956/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xyxUևU{gB6BBd [dG0(
+ 0ʈ`A@( !a'$!!d_]UUTwz˂_O휮s9.ӷνev@DDDDDDDDD#&""""""""""- &""""""""""- &""""""""""- &""""""""""- &""""""""""- &""""""""""- &""""""""""- i˶mXmӞnUO
+m0<ĤYYL]*۶U[dIf?qR#u7^guH8XS`ic !ՙ?@+m@MM… K
+: HܵZ}ӧ!䴥z4CO>C <O?9s388pB
+\fʘͯmϛ S4jWeHx^[ZܺVWGI<?&
+w<]
+vsSH<ee4pl eΛ-6bo|vr e֬Y h0 mJiz[o|ͺl*l4KY0Ayd͜i>~~~#F~eɓ'>|wSN2eʰa.]g>00
+
+W;ns[qLq1o0۶m
+::%۷6u>̉zZ{9k9N2D8$wa%rNܡf^5FpݻG{%˖-kuAh;.M =gΜkڤ0Mm/n
+0 ü lcFq֭7o޴EE*v޽kIIIo
+
+2_6x7x^8x`޽:SN<?te˖g]͛/KP\W˛婐45e[g؅8d0oURi=:'vQR?t1Kf 0 8 Lc
+(
+j5E11OEEDH\Bt__;7T", Vt$ôV[qc/v
+ v0<2:߻s4i9c6oT-qx{X(@yK]#0{ס˗kڅ Z*888<<wi3uAhM̴)e>}-|n&fɔSڻ RSS?(sܸL{{{<yr999dYsŊ^^wwHHH0`@~6nX=--m݉:uo^z饑#G6NED L5
+U*W_}e̙3ͯygD$"D=&=tsUSJF SiX0&;.=h~Ru| tk㭔6C!i^Aa)|-[m0<\4߁ syHv
+,k-n0(*BX!ڡn :
+
+^_vf8d5SjdYΎDu5a0$IF0
+$mit5_pϭ{stӕg.qNN3H%
+2$/X3M3R=YjH/EUϏhܨ: kuUt|/Zf6׿q 'tF}%Fu=[{E$IؔV4C7تafV~K/]W(f"""""md[62Kя?&>UsnrϻgդI<ˍN41b^"Fn׿ 0E/QD [h 'ԑjLR*8(* ~ MKp j/޽n, k꯽7y$2
+Gbfhf;3
+Y#gyR$/ũso%N
+ [- T>M
+*=G"Ӓ:٢z
+oJSҐ+dߪM ` 3Q+kXڵŋy?ĮX7O1{pĦ' .D{G׊FFYzuENq-4&]ʵkU?.0obZ yF]ZFݻd::;>#GO^^^V__oIؾf}}aG׬ћj]0111
+ŋ tE/-KJ#GXуB w._|\\իMA]ᴆ1cDJJa w=gϞ[n=3Xp
+4Z/d$Y%Kc/+;cЕ[ڋkOHF[_K*IsZ-
+^{*"_.Mdݾ ySW3
+ $28`0ZYáeT}⦟Eh/'OtIW[Q0A?Y￯_B rʞUpj
+<|<MnJR5LBNjfaGH7n{Oqu2<Z[ee?'hVLWffjkyooMŋ
+Le_NVeW3+r
+z/iFgg#}PJ&#&$K}J܅&رc|󍯯oJJJj.˙0;ym]4Сҿ]UW']Kg}0vX, %ͦTʀ}
+ |)JHCZB8@To/uX8d0
+L ګI\`ҡK++fMqS棼vޒKȇ|ZFr \(ykX,I5z뭒5VcV(PHI!;{ ͭ]z$5`t|P#vFve%"$T!^
+ jM'2 Z =R
+|u֕zy^!T2;tob-{7<_q2٨79zwgd
+©SC~jG~w^{/:]TUG[>]18xpr[R| ԛ
+*=G"Ӓ:٢zK1ܬML >}IDW3DW^^9q 6eeeV5bЕgzL OMC}Y]A&o˳7O ί QvܒKFLoK=j繒{'#Ma#ֆX<]I8Vw3< 9@ҬP 87n_pLï
+n59.-uϥg^jB>S䙟(v 0JD
+߸ғn&*+/jk;&KF
+*.Eaɵ>nJ4ñqMՕKHG i*$$4h G@Gɏ Q>Uo"|ډGbjT<(|qK({)[xq<kl3Ln9E<GoT]D/ ܒ;UT3[Bqg*4ʵ) #ݙZ-
+Se6yO+WZg_:T"'#NSPW|xO\A\+D㟪K
+
+oU-^lCo@˪U
+ sM=I\xS
+0 s -uHMX~cu׿cM?R_홤[8vXLL E턪¿/-z㫫aOiek[~=a$ۣׯׯY0]?UJ%fԶ8 Ǐ]2 ִVjڵ5kԽ{K֭mB6={y~ԩ:nɒ%  Zh 
+3P\W z*"_.MuqT덊p#]9Er*[t pۻ+VMi:VϾ;[O{S$h^aA\x@NNAaQxG"
+Mw$yE
+\K =3г88q.8jӦMӦMȈOL3
+V51zSe=#R?!*
+ 7lpGqJ5kV@@ڵklo7.(Ⱦ?7‘<Ƣ7lOxaz:f˓SuHxxClGx)M/yF?n1jKo7j3~8끻AcdOd$IQ6.ۇ]2n C}i͵]FI>>qOk7PeNh7Uc#b5g Ob<BJ\l٪UVZSOVܱ9q)Fx)́ 򡡤)Q6oXZ-@"iH/(+ ?Iβx}^SwO,:wӧ322O$$$|3gδ+ja/5|}SaI ֚-'?2DHOY1ثO-튈8LT9l$[GqK4o%?[:SSOWJ"_  l .9AM]hu
+:"%ĘG֟Do׃3ܼ3{:L荒kt`|ȔjJ.^U~Fce)d
+*msM
+nzWoLw1 ؾy5[7'07<yķnjKۯLK|v<0ZO+|c~v]h{PN
+mW}BqIoRr/{C5Ws{Nr_X={RK(
+
+2=XiHgo6rg-=A6
+=6-5sWdl l}Y٩<Gxmem-a6f<ET#aY.]{NBnެ4IE>I.];ٳ9S6lzanfX-M~:$۶M?o1*s3~<;r鵱W/
+ h,(
+
+`v$5Kn9
+!Z,)9УæD~~ MnJKhKdG @xޥ5k<~qBg&'"""鴇\DY.^Dq1""0`
+A@#*+
+A_[EUЃ~I3S/(ivեo$J_0BZ4>ڞ_
+Ku#f$*RBۃݦyyR`JtJ~Meo &y'/0@A=
+\QAqA51J\q7$7 E͍7QD
+
+AC Ɛa %BF
+333
+~Oj 77VPG߈;AAN_~V,{P]"r^I Tw<tHRaY,҅յ+awS'Օcvww0
+Lm
+/9F۶Y;;[w&شa >GGiqlhJG61te럫aܫhFN6㱫UUu322!!77d$LV3;&_XRzر1c%%wfYp:7T|ȐϙCv9sFlfӧaHL&ӥ@ᅬW9:r<:5UUWs.^9"[tsSyx BBot4Ymҵk)}}G#G1:6mp46$*aN
+70j۩;Ѧ`<v
+[Rrr(C\9kפѲe
+
+eK
+<#CO's&bPvva
+0?M 6Ʈ_HG1wmD+sJ,9xu=ɓ'yxx\2%%_Ө4HsJU5hhx<(H(?
+usg#ѣ7L
+׬**۷%]HvYCYZ$$ܚ_5ʀ
+yMJح2So5EWu\a">‚DU4/__):eLI͕dzG
+ђݾ]f '\\w)bKIB{ZZmШ:,~M@@.FPC^Z.Vԩk#z *TO|u:}hv%SӢJ5LC?6
+<O>a"mШ''mb1
+ps$ųR&ZK50vIɵ%8k^zLy<OYY4_h
+
+TV-
+M0<+eX%Iw(1
+
+S68
+ NWRv>sIh&f{{4$
+& 746Gf s̩@eP
+Rpϛ7 [| aD%ٻec̬p
+ oM6_~iƊcI?( 㷶޽{Ɔ
+5}$2mHȇ;?i<+Nô =J\w5,
+?i$-3@ 񶁒f@ BZKK~~mWW@ u0YҌ@ ~eҴ
+6c;f@
+L[PףlɊևӨ1$|~]i96!-%Hp6ܹرpʕg׮]7n8`
+o3ږV3':BQ7|ԩ W@m^?(:u-F8{;uG 8,k֭_|JqY^^^׼ޕ.]8p^##مFx<ԉ''@6$'M*T
+WCAH$K$
+p;w^rF9sh^֯_=z:tH{
+
+S@np^B
+
+ ܸ=}9>
+lQ̘_9sF1mUL*ULgG3C1
+ w?^p};MC|!+ؼT*L"!4Q9;vNJ
+m
+ޮ]XQ1aVRNK#5d 1zOq#PIJ$_7ߌaIUٯ_
+<ŋ/^ptto~gb10aP(}]ixڴi
+kOMHXux̙&bFo ƢQ
+v*/52b,Y_yc6ol\?|c:b_/]]+^/K]äQQ(*'.իWeKȘ<(f̠c4SJGT
+4K\ϝ;ʕ+s)++ y2A@ BDvF=Z;^\eHOO
+m] &XNK6!zuomwCˏ_ q;<^w Lϛ7/111,,ɓ'BΓfvmcKC
+ Is0p | $ nn@QPT2x..u/ҡCÇ'%%-^8!!vBProD[Օ\4
+ m
+0 ֭⡡z:eaaܙ3~8
+xF?qPGUЦݻ&M⤤(JT"ϞQ &Fz:tbjw ҹt
+Ncbd4mܭkPC˩u#MQÇ$nbt͚+4VX1{l
+x?:UF0C ۻWy3TDBhL!:&TQ,oW'x>]t\6R#o(iFfF!_Ň 1hmJEPӧ-p6lг&[SCl$δi"2"B)McuF;>}((R((.Wmp"#yw/['m"'O*-]Р%:λx(
+
+qt%IF|25u;wʷnYZbYY{OIL$vo*()Q ?̨uF
+M9Ӧz-L
+̙
+
+
+󽼼RSSuAԽXY
+
+I3ݻfða`a
+
+@£hl p2ӧ>n TƇ&M[jUiiiJJ
+EN*L=rQ,cz
+usgc}0w.߾]OnR`bh.HxJ__DBFe
+ZOA
+
+T:m* m?Ozoj%6 o Xᑆ!i/$ (
+
+d2pq
+T:m* ъ0$͕påp.fN#v@ @ h;(iF NR̚%7ݛ_Eq||}'OhE<' >>#{dlm0It4x>l(.?_W
+)-[h+UyPXWxVmQ?viEZX*E bEKP<fcb2eϙ?&?{pΝ=s<
+:.e]e{nl446|}9
+GL8=1GРʲ\]Qa
+(
+koFp̏-:ƽw'e
+8;YPۼy/ JbbbbbkZZV011BAy{
+ÇW(+Vؾ}СC
+k)MP|&,sذ
+ǍWSSc!`ĉP_]]}
+VPS̛g~bL[/:d^-p6 3Œ͛iHn`GJIIMʄDj*-
+,3́ DE  I
+ϟ
+<v,
+sP^^ŋ)\s-MPGS11Eꨠ II搚
+lgϣn8tRQF}Qo)> 
+ w*Vࡡ>P߿O}8˹/ҴPJ]S{NDZlQr)][ee' bwJկZ>2RXTd?~8!
+AqhV(Jک\5‚2&7{JU/b0qK2c#JdWgg{$'d!ܟ~◕a/+ø/j79f;k]ڡn|sWdeЌ@8giRfRf@@ecN1om>DWUEGl8W׫wt܊
+@.
+zN~xΜ'yUU G7 NkOUUٲ{2S}Tw-wq
+Sr@ @c6@ 4hF @ @ ̋
+endstream
+endobj
+750 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 165
+/Height 97
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 3785
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 165/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xPgǟl6 ?rUuꯢRu(K`bE YlmxX b*]{Q)(Iȯݽ?B#BAI $}y!y"2 KN@y7n!!0+.} %% |fnDjiQ?
+I"2mMk1,]V˗>>ի@
+EG+3k$nL5UIo7Y
+r㟗\$sP*4< .NGY6{͝;AGǃ##O~1Y^['$`R)U\RYwHȢիٛ6Nojj?~ggJNGFFZd CQT}sb"
+J%M
+z-BBBiooV
+//ydϵF ghByca܎I <=,p}@(K
+|}]׮eO4YuKf,7OV\ j''ig:)?Fdezj/Կ:'6)% RRNiمNnnHFiNcne#W_"IƍǹXs3
+)]bPa!朑>m:_FUZ:jmuIMUn~h8팪x务egs . hn623
+@̞m<D̟ݸ
+~˹s--k
+bitxM A}\wRϾzx-p
+YQ߹ɦ/wޡC,Mv6Ob_8
+endstream
+endobj
+751 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 363
+/Height 81
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 9741
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 363/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xw\GǟGSzU0 "XD{CQQ`+DA ( آ"pHk.畽c<̳ss;%N9~O/ApppApppσ(G}]5~ =z
+m]#?ÿ
+gaʩS
+ ,}\//N@
+>>ZDW --'9?
+P~k͏XC5[S;6] ' 3q"p*6YfQϝ#YcR]ㄆ]
+PԏU#'& :ujKd$=5UJ%ppIݱC5:Z"c~<{;a-&FA\^.!$av` eUƍm!l6=z<=)ggǏHSr,w.p8]XH=]'dиUUh^F=]28pDi%sjreE)..31$$$smh°>gvLu{--mzN_ 7..zeU:gvLnmw'c ax:,=Y;;bXmBAOWJJ˖ׯW7v䈆+~f&7?rJRܹ4SiӧyE]
+
+zc"a|f`W{/cv,
+}|cS
+3:s ϲ Ik<|1 w~~C'Ef}}N2F۲2sŋחTdd\N=pI4 H<lV9W=~\y{u̶SNJM=H"i
+3^Xh)?_~N),|rC 888
+B Xt>7L""=qRsskGO;#_MBdϞ-01c̙ Gppp5uuu2CAբL"_jb5nީڼEE w矂O?U7JHE[#DEԟ888_˗/Y
+]RD~ p!ckxOe&;{O| am KXPMjىoҒ
+t<}蒾[>͊[ifjb=a8N+WR{2bW/DJ|~ʹr77cǶxk  0R9sÆ(aehZi;wN:_npP7;bKK^CN ~­['=]'N[t Z,'Ewzu3{ÇjfjqU}YyF׳{$ƍF eeYF-%5ngϲ<BdYVf&銸dZ3,.C7g 枂GS)R;ElMԳCVϔS|] @%@e^?|xH~>kfXX ZjU= <-!AKWU@5`@_557}}.\fX[[BvjT+D HD"
+қRD,KA5T7,*jyV\ݝ?%?RAƖ>z[\\$;*G?/'RN SJ9˘1-@%
+I'WNܣœKH mg[
+;[M{rV(T*,Zؘ|Ty`zA?ڊ8kkikjsvޝVUŽ{nvJ.pj]4"hYT
+,@fWlD)Nrkه*WXY~_aeP۷ <(url~żP3j;_)Ԍy `)5<7!z"zS^:uaYC
+Mdbb.Ҫǃ%'ex䚒!ԳC)eꝜhǎi]:qb-x{W9Ӳpa͛uLϻ
+.~~| SOJ!9}RԖpb{ @!X$TR^^O#>GR
+V~z/(FU۠W̨y!~Jih;ǭѭ&F;vwH
+.15thGO1Paӂu3v/0;aӧܹ͑-kJjDwuH=;dL"Qx$=[[}{OhtQ{֩!lظqcXwZ O
+#4UC&+6H;v'-]c!1\RP5%CvH=;d̙3CFݧNad_ܨ\7s=_v^C `y%g޼yA8JpY\9g}ѷ(sW׭:.4 B X:;~ |0F)-'o)w1888'w1888ʃ 888ʃ 888ʃ 888ʃ 888ʃ 888ʃ 888ʃ 888ʃ 888ʃ 888ʃ 888?w' I
+endstream
+endobj
+752 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 134
+/Height 158
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 7749
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 134/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xy\$vd)[EJ R}Zgֶ۟ʫ}jյbk]jڊEZWpAQѺ)< –3?HBHHbg10sg"=A 7JJ .nX¦Sz麉v\|X.Si0 Q2.p~φ&3bs8i(
+I^n썧{48s*mzƗHV)n~Ɩ[0b%cf`7vz0
+Uq]c81 )Wj 5Ir vʬIީ8pϕYܩ
+
+
+B$))I_H"eɘJfVU~nW?{t_K,_xH$JNNκku%7A
+((( %kL)5]\A2uUrfw
+I85oTvV
+|Du z(j<
+HR
+ͅ;?UO +n.h,me? oL7鉾8 6a„+V<ocYbzw{ ~
++n 
+*v%v%vj|ElZS
+j1na֖̽;pp 
+{s1kגB]#5Ub){ݻiiM
+(koUʻBFrfC}m
+]hCffB! &
+K'd?.cSd,{i%ef6ddF1kܶ|VVMrڲbfhK2gwtʛ; -%% L6'(rWhΝ<kgg^JJj^^&
+E7)Tƛ:1'. ݷyjF':<]AQT*uhXg_luZvi֐BN1q KT[o]n* ;v\o_~Ywm{_ (
+|ӕVTxޢF:pbÇU.rռ#|hĚw=Ba/
+MGL(߿`AbA@!BÆ_QǎmKH
+D.nܸ7G[EZ1LMܳ筙39fѢ
+L::=^yGh@~\B9w\TԽ~|j
+I%kI%
+Tmn!u _
+\ qVKwuN:xU^ȣ?/ (jSmZH-a뽍GDml]tqzU c~wM_.̒*M4%ђ1@>-֟CNxL0?w:.<Vkn0|jI!MljY5Z#V.;R@ y^.vF
+)u+G
+
+ibS;^f*:hKKKKKK@  ɓ'(ӧ[RZZ:m/\FђA|q-
+U첲cR(Ç[HK.-++qFYYÇsssݻnݺUVY1{/;;\,YD.?DL6w 6d?~u67f̙ ,ųfZ|,Hpcc3
+
+ ]zur}k1_b|I_%Ԍ=6J޽HCf@cC1u]:\Ia&ԟlĉݛ6PN:rrtD1Æ.1c`А)B#6[`$B#hD V.FxL˅GА¾lU4cN 2Q o\8
+mQ$ m[`$B[BV. Նk#q,ڢHڴr6GTj#q,ڢHꘘ"5N"io!nhqNh ə33`&9k֬. KJJ1EhĦM!ZF,߯{<r臂_]r(!ݻI--O?UGD(Vt-utC>t9R ʤ$
+endstream
+endobj
+756 0 obj <<
+/D [754 0 R /XYZ 122.806 747.976 null]
+>> endobj
+70 0 obj <<
+/D [754 0 R /XYZ 123.806 712.73 null]
+>> endobj
+74 0 obj <<
+/D [754 0 R /XYZ 123.806 685.592 null]
+>> endobj
+757 0 obj <<
+/D [754 0 R /XYZ 123.806 538.909 null]
+>> endobj
+758 0 obj <<
+/D [754 0 R /XYZ 123.806 418.443 null]
+>> endobj
+78 0 obj <<
+/D [754 0 R /XYZ 123.806 276.282 null]
+>> endobj
+753 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F39 618 0 R /F16 475 0 R /F44 651 0 R /F43 652 0 R >>
+/XObject << /Im9 741 0 R /Im10 742 0 R /Im11 743 0 R /Im12 744 0 R /Im13 745 0 R /Im14 746 0 R /Im15 747 0 R /Im16 748 0 R /Im17 749 0 R /Im18 750 0 R /Im19 751 0 R /Im20 752 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+773 0 obj <<
+/Length 1544
+/Filter /FlateDecode
+>>
+stream
+xڍW[w6 ~У|V(겷5mMzgmTe˙I @F V6+!`s@<(xyls4^Ge!W7ͻuāo~[Gxluvfb? I]s΂m5 j Wevv/Xd6}}dI =_eNpi=Q_uh~ȭ%~-D(u#o[O-j/h앪}RQ%ѫUٽ%bYe9{7[ la{ VñDQ( 5)G(K`1R5ӱk[ٞ9m(9f/g^$lzª҆vɾ&A N;o1c^RQxN;*aʰ^3s+1$o&Km;5솫ZȽ3 y\:Q&'bK^`g+Rɳ8婇8haI^iy5OL]]5gpV'hc֐V
+YsJrlHu-K|H7!zrG*Fx}ID9^*]#<.u}(X'eDSnp=%J+<3NUk!q6[޵!7K`8=M`qRdJU6i',䲴$0E&.eitM"o*:rS-˂
+i%B%3 Fe!|\6Q+*A( `JΉ*fEvM=c?59R(H
+=L4P8TA(pZڜ tWW--3痆Q C 2P3
+e gǟ˒XTqϊA/^[Y
+8`O܇%<Rv!dq{u o o
+endstream
+endobj
+772 0 obj <<
+/Type /Page
+/Contents 773 0 R
+/Resources 771 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 740 0 R
+/Annots [ 767 0 R ]
+>> endobj
+768 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 914
+/Height 183
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 17847
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 914/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xw\Ѣ8jAq
+f}ɴ[49h -)!"dH kƏWjϟhb&}VVVdggwرj.$$DAV_
+
+
+~}-^XG||EttPMyZQ.J5 688t:`gשZ핕*AUU&D|[\53LN>|mQ(|6177=//wo:1'8xݴΝ{dm:;6vIxˊHԬuy8::޻wO~ѣGQg=<xЩSjhNG5x;vTLr}葚999ViܸM#"⺃
+!gN暜zUAVYArSꫯFGG_|rݺu/eQzz?XQQֶ_~M9]bֲҿ6x'OuP(ܱc|Vx9Cbl޼Nzy<{c<wpǎ7UUIGx߯ի'%uG"a,zlJ&RUz85fL|yeiŊLwS}>vL
+<ĉiӀ#/v߿?O,?<$jG_Ϟ{fu; cbI$lN_bذkbF
+
+u`1\db2%~sFV[VgBV;g;N)-I
+@8Ӧǘ6&iA_ᚵ"H ^4o8$$믿vph! i?j8pNFOVn1D!!!gڎH){wyG-mϛ?F
+~
+ p8DTVV0?&
+nz@`~=Ot##WÈ}ml뜝eN4
+ڲ68X6(o<f%"d2bEf.
+0tΫs%___=$888..oVT=z֭[===>䓟WNJJڵkgϞID۷o2eJmmmPP>rȜdeW\rl2}#CPVhF*K?,pZ8;X[q87nEP(N!!l۶w߽|˃NS>}3fhM/^GGG}GSLosss<FD111$''pĈ'O֖'T6KEr4 7bqΝ[w<NGy7X&% Vwa
+
+
+FLhWO# QlkŐjbbb~?3777<<|ɒ%gNMM>|x]],rh.e˖ӧ^:))i׮]-R}'OΟ?֭[<w^XX<x%
+oܸ1dVWWϞ=;33o>e":{lDDDmm88qB4 011 Iscr4$ gm7U_8ѻmj2 (d4ymJ
+oʔᆱ_A/Wbiϟ"/FDDXXX<aaaW^-//=ztVV\PPm۶_~%00ĉ[n-,,1bĭ[ܹ]ɓ'W\?lݺ˿˹s&L [U̙͛7}G111~ѣG>|8rȜsi|I_~ׯ1bjsz${;>Z#2
+su Vw]D))z
+.\hxg{҈_m۹kƃl$b)1fffXtwhhr>,{/;;u׮]Xν{߹s'9::o۶&͝;wӦMcƌIKKOu%>}ܸq;vPΪ9%K6oܷoowU~-q
+m$QD؊ ^no?.ɚjwyy->f@iR
+
+Jʜ:؉,-+*mT
+펢h7B[ A޽cE&=tC^ze=4gǢRv,`iYDz66gap80F pPxy&
+
+
+7{ԌNIIϾOƍ#GJJJ3 (vޱcGJJW_}g4V322R!<sܖxM3 `{H;LtW^YzZɓ6AAU[kf3V5KoCN V<֦M|bn]uhh&& jm
+۶m3tG ak;H;-j:IB-R.©n?/NYk臱˟4,K:SS\#"Ys
+EBHxa (ɟE@zjx[T! kx$P |ooVk{RߕsssЏ?V4w/
+L12>kZABo$n:8;w2Ŷ
+
+
+TVVja$/IQ4bitn;HK*RJ
+Ycٳ6vvҥ°$<0>i++Wsҥ@IDeeeؑa]2u-!!a ̜9sԩk׮;v,qK.mڴa^{ogg1 b=W##3?.)-HX1"HM&bOD$/(IHtpŸq+]M).jg}n5:.^Kx㍉'ѠA.\zj///DҫW{5W_}URRݻwwߍŋSRR6o<k֬P___D}ѣGO>{5uԏ?x,˺)
+߾B-N>p8L&suuWo
+MG[M2T[gYV<eJɑ_2d֞+8I
+endstream
+endobj
+769 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 1023
+/Height 187
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 21321
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 1023/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+x{\T? ad." 0'-/
+Dv!MꈞIIǼY&bbEx[vDI㈅P:"0\M#0kkouf8 B!<
+B!?!B!
+B!?!B!
+U+J>QGڄI!BH<hV3;
+HKaWpK!BH7߸aܷY5 EBXbI@!74G’6-nSGA!~֍{!wyZH4"+caV<CC
+ z}bll׵Ubee9cƌfB@ѿ`wuC|SKqr6&P6xPfQӕM?:th\\\O*$pUr8=pwfNjf^tY|Ƚ}655[[[']B!SN+vj@da5޷vm 7aݣ;
+6|m%u?-Z.4Ң&!0<ψ+lA Z[ړږ|g: 2e
+nVECR%jux /
+
+
+FkioB!SBRC.ϐU)ndgeٽ{w]QQQ\.wĉocYYY-]T5jT}Gx$Pi30{TyG}s^3j(dG ٲ{f܄L&~n%В\|<&ۊDF[-<15J3N{yf=+v|eD\u7o+PYXSUzk9])}kP>0u4551 w@6ĉfff [9s'|\@]]ohh(++spp8}СC㩧255rsso޼wA!<WRupQ[z掆G͛mDr%.D
+Ԛ֚\o#
+\]]]]]/_;|7oP/022177 BlwQ[WKל$U=ewuJ搢"5-e7Fy ++mnܺpg Kˢm7P ghmm?úA ~hjdf,d`jflDZy}Gb3Ym7qEô4470-L]iiiD=@JJJ~~ѣGӾD")-mb^^U*U];[l1cƪU
+H0Ҷ|B!@B!B:'55~A!B3t^DB!>PZZgv3tdO>.\:ޯB!tKm}cO|ow/VH!B?n`Yfɓ'GED<ej*!B>d2Yw ѿ\.p8222R5Jw̙7oEe˖EGGwNB!v/
+ ce2ƍ
+
+
+x1c8;;=zٹP]p֬Y=/o߾3gZXXt3;;[(޽;//o׮]cƌ2dȱcd2YzzzhhhyyOaaeˊ?suC ,X`ѣ;Kuuϟ?bccϟبo[wwnlp
+!B-ǫ5GGGHRggw}W#899&$$)Sdffj(///66N60l0Phmm"̛7ёDWvBCC s)hpBe]\={
+Bc
+
+o绹HOOTﲲoiind
+B}ns\g
+
+
+jhhؿ?{uB!/>U/>6¯PmllRw pssΝS(g…]5k
+...2]8q`hh(˧L `˖-
+:AP(D"ZPh}q
+ 555""bƌH^z:ut'By@ ?T*uU~~~KKK!H6o `ݺu]ϔJ3gN:5ydyF0LfffAAA@@ |777
+111)))l=
+8tT*Sc:uJ"|l'
+34<q℧ŋmۦ;H^غ:5V\*H!sj;RSS###s4R455U?Ё}ZZO_7Cg^"B?JKKܨ.sض)8%m{&;;}NRR_ߍ5[C5%B!S(///88a''CzB!D#C!BȃfB!BF}V&Y[[ѣGgeeRPȨc B!=7pFrΝ;7HTXXqF=/[,::sz\\\.!B#j@=m۶3f|>-!B ν
+ GZ[[~횚CCFk<YfM4v͚53gάnii {wn޼i``sNNNUUU|뭷>!BGjiwv挛@ `ooٲ%66L&0o<GGG$^5k
+Ekk+˭a%Re
+8tT*Ug厎SN]nݰa
+ `cccooΨqwwds̑dܹsՖ---BHII9pP(IIIx;w|wO<~}jZZکS$ɇ~tT V"!B鬶QO9wFFFv{{4D_JԴVl
+...P8O>-VZ,d2Xc\;DO۷o5jMPPԩS%INNѹC4#ԓ8ܸq#00P$I;vmqB!<DU^^~Ç2dȱcW\~5o6++x
+
+
+bbb{]vi Ich<G{qN>ɩo֟CtI!PhT7o#
+
+DW^Ug
+]\\d2Ɛ:wH[/$܄CCC\>eʔLmuI!P+WfddHIIJ2LP4553;88/}||:x͕\.X,60еBiiСCۧ(
+###H~V(VڎsuC:x,!!uH[/$Β
+
+U~~z2zsq ݹs'::ѣ+L[H;Dcqmԓ8ݥRU*UssѣG
+
+u8_윑eh̩"!BH ѿ\.?W@@CR'N433[xmDwwwL?gL,ݹsի---[ZZ/'N
+ggȤ8p@(Ĥ1N
+]\\d28l
+O&+QxTTTrMxa
+@MMM3 -N[[k׮i,pDTֲ+**,--mݺO>yW;!By SS/ssO?4:::<<\>S*gΜ9uɓ|JmMxxx:t=TC"l޼u[\[sMLLtӧOO2t0rDa233
+
+
+o?ǩ˜'<==/^m61TSM$B!þaooӿa(JSSZB!hTZZgzidMUYS!/i0?ٷ$%%ПB!7j߇B^^^pp00NNNIII!By>𣎽^]Qk[^`
+B!2̟^Yn|D['!lͰ_?X {`Ξ
+ :K}Aolso9{RBy1ȑ04x%[J_!!pPWw=L<̉aab?Gr ) #Fit}痷>/WViٯ !pNdUBB`nwEu5vFKK߿|56b,bnc8:jl`WQ}Ӻ<<};.^/1vy?\T^
+]oݺ>1jzL˗>aah,A602Bj*ouB|]zέQA.@3]ٹ
+ZZcVq[˗8qffJcG[zFZ孭テ'ܰy3vSsNOƞ
+K&P}"-Wq}_ذ֟ݢO']q}h<G
+blSS=ec~O? kkXz m04g,\'
+yI[ft9]!!EC##BNZ]3<?ty?P?c׳#BN]( {+BBUzRVW$B!违fb޼B!>迮meS᭷eGy[?W[zL 8x{i` `p8o8Yӧۖ@` Ξ"/c%B!>X66wGAO2̙mmYY07jXX
+F!!
+blSS=;j
+ XSv;~B!0ѿXhQL#+ /9?1}gcr88 9^^
+,-1Bs wEx85mlXV!0[]:t<^۽y>#GMߴ --
+-iʼnrċe,9qwfneā[,lednq²쏡؀ CGkq(2qmH9mO)/J>yyy
+
+V+ϟpO?N&ر#33fUTTl߾bLOO߿xx8 ^'눸cQIIIzz@VV!d)4⢡ ̖-{j_|!kv!'Ng;ã
+ 4FQ(jwk˛xcr~888XPPP]]T*t۵k!d˖-Ѯkv! md`]G:<
+
+ag#:|T*Ds, z>00pֆXGQ@!Νobb)JMM=t}2c-2X-v
+pQBΞ=j"
+
+2 ޴4X,JKJJ
+d
+d
+endstream
+endobj
+767 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [464.778 597.295 471.502 611.09]
+/A << /S /GoTo /D (Hfootnote.3) >>
+>> endobj
+774 0 obj <<
+/D [772 0 R /XYZ 80.963 747.976 null]
+>> endobj
+82 0 obj <<
+/D [772 0 R /XYZ 81.963 638.389 null]
+>> endobj
+775 0 obj <<
+/D [772 0 R /XYZ 81.963 536.107 null]
+>> endobj
+86 0 obj <<
+/D [772 0 R /XYZ 81.963 398.5 null]
+>> endobj
+776 0 obj <<
+/D [772 0 R /XYZ 81.963 262.678 null]
+>> endobj
+777 0 obj <<
+/D [772 0 R /XYZ 99.891 141.392 null]
+>> endobj
+771 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F39 618 0 R /F36 596 0 R /F44 651 0 R /F43 652 0 R /F45 668 0 R >>
+/XObject << /Im21 768 0 R /Im22 769 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+784 0 obj <<
+/Length 1515
+/Filter /FlateDecode
+>>
+stream
+xڅWw8QyKe{o@ [>ʖpb9kGlJȉۆK$GInzzVdqe"E\ȸHTK* bJJW73&v]_$YKή/>^] >_n߯.+$_+b)yT/_hQ˲jɢTDVid4z|$<XzyhF-W<$F`[oD&}%{X@|rfw!ל؈ӻ>hz4?
+jZTТ39Y'ig]P#9"eY0??\[H
+]Ьv{mNVK%8b˷v? xFȹ0N*_m*oS
+{o_Umj kFv<i IhaZ3LWT>sbG2OH;;w4g&_ݚhM`
+ ']`{4r@*3L&uhi7g
+
+EM QDO ֎K>)0~" ]@u[5a ́1Y7A$5rB#Yl( x㇊G#-e[<CS i2AF1 6<#Uy p))o
+F,._ʏqYx%<,Nyv@"! ?^/B3 -IP6u `ʷyXƵ??hQy&%y* _పB8s[qzLzΩ?U;
+endstream
+endobj
+783 0 obj <<
+/Type /Page
+/Contents 784 0 R
+/Resources 782 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 740 0 R
+/Annots [ 778 0 R ]
+>> endobj
+770 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 977
+/Height 190
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 32296
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 977/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xw\SW
+B6dh~yt<{so''PEEEB!j1t[B!snB!Z!B,̹B!jYs#B!Բ0F!Bea΍B!Pœ!B97B!B- snB!Zh Eϝj([`3 ۶!Bmȹϟ;Qڡ#:
+B6ȹc7%b[Tr!Bm s#vYt`:
+BҘynIEu>iV!rжf&
+f*SRRS^%%%*TWv: g)=F&\W\Ѱje7M
+ <{lEEa,Y"
+\B
+/_bmm{磻4V&$RT*H[ĩHyӶAזp\+ܷOe^nţl{8V>+|zե~RO<!OaÆ-_ѱsgΜ!ׯ_/
+~e#u>8ku
+b@xzX|
+``ڢ#F (0esQ!]TV2RcƩwWF'N$7vT\ׅ ݫWnnn>[ZBBBΝmmmg̘QUU
+WW׆wnݺܿ?0[loR
+[Evb[o^H o
+?w,?WP8;UdƵVèQ_"O %3f4=hР2
+1i˖-
+ ߞ8qbGC%offX"((سgϠA6l
+(;<xx`
+I["BiwD=$[(` `X`(
+];i71]@Iݑu{Ѻiޔ7M zn'(7-KzB!ѱ|>EQE ༼tޔ^ANov^Fڷ<d70CO`Y(
+srrƌchhhff6}*
+R޷o_՝ھ};)֭á(*;;[Cj;Lryyy[aR_j v4rmllF}-Rahhhii:5J z{{?{'&&
+BSS'&&zyy|UVi>>>|>7++KY^ZZ:m4KKK@VRR
+BP5#G.\pܸqnnnvvvgΜQw4iHSj3ϭ'UUU۷oz*ݻwii!Cllm94
+ _BQwS 3**eX `v4N/mD?$66?'+={޽{G]PPn:[[M삂mr|>VԩSI+8pӧΝ|;B^lfRS]>gϞݻ{VZl
+uر:t6_u4NxM]\DVV֟'
+BZp͹
+ ,
+
+
+
+##"GczFX(
+jtΝA4~KB!Ԍ=zŤ:
+mlljWvuuxbr@e˖-[[X,էuMfI-Ɋmmm2ًTd)`?VB!^G
+xI,EQ, 333(~1Ͳ
+Z$^BZΜ8=Z$IyneY
+^vXEQyn7!Bu
+
+蓧OZ-z K
+
+
+=ʽ#8M,]ڵkoքEΝ_l!~R/(P
+u9
+'M$BP(\j<x}}}3f̨&奥ӦMaaa%%%FϞ=obbP(455T6"~ҔϷQW<tP'''.:TW3,,L(fffN>](n5`>#P4rmllF}-RX8ڿ^@^Æ 0a\.5σttt&YYY\.,F ƫ:[uS
+V̹<waa\.~:
+ŬYHիD"QQQQ\\~ǎ1m4Fܹ˗ݿ_y
+
+
+
+\noop?~\TTD4
++}5.P~)BIKH ЫO[@(
+!B׍ yüH|Y
+'M$BP(\j
+ssssku*++;x<^TTTLLjثW/
+",,lРA3g$%deHhh(9aWQQadd痗7.;;{̘1?/B \.p8ry߅n
+
+
+j\0 T!
+=tpj{I~Y9V B!B
+h?̄97B!Bw[܌!H~%,
+D!Bo֛fdtp`@h>
+x/P
+킎h8B!B֛$cI슊
+`YxD*JMכ.<!BZqRIR RSS""".^p/Y
+
+ȲyofH ܸqcܹ* oƍ I=7:߆츆8_zSNMQh̙#ITTԾ}0 3|#Fڵ]xWBmڌb3'e)J
+޿׮] N<I
+_.
+r;w,
+4k׮}k׮]llѣG trERX6667n\
+8uT<y]v5
+G=xࢢ &={ѣe &DFFjZC
+***󽼼,X@*kƌR455O6Ms;7n`Y6//s,<x޾ᥥ *999~nmq?f5oyr<NJ
+r3hKϱV
+okj-!3ǼH~#]r< EEE^^^mmm-d2d ybnx<^^^R]]daaaaaammbp\.}4''篮s1De_
+BP6nkf}}R*ח!`9MMME}}}_=%sՉb4#jjjB-Nr. n޼駟t\STkJQQ
+R__…^+
+
+dz`>>>111zzzN/?|G^~]2F\Z9<ѱAUUɓSLAYYYt##PUUUGYII !TQQ3--?0{l''k׮PֶyI؂ h4:ɬQ/
+CD!u:":P
+ELAbD!(!1"-DD \WP._2ߖ-[ADDPW
+t3-Rj"P$L#
+p6MX
+d9<222ۡ
+}KZZژ1c$JKlll455_x:t(%.$$͛+V8x}vjjΝ;%cG)++O2EWW7,,vjjjVrrrи>Baܹ***8AG9r@KKСC***2ʑv^Ү
+DATTTرC DW]BrVV<}<靝]'N."999t:=55 kGF^zǎ#!jjj"F450[l)**BSN)))_A\xqĈt>RԤ--y߿ 'O\xQ tttXZZ>HJ3P^xxǏLBXN%:*++OFiɨ#a '@N3VW/ϖwX
+#Tښ
+(VzrF0[޼o~:;;W\ٳ_~%6J<ʳE,3 +++rSqq<ݺu?0a
+QUU%ȭ\.Arx<ޢE&M
+8\.wٲe+WSMLLz=.B(33
+_}UHHȔ)S>}ڽ{CPPTTTB
+
+
+}.|y<Guvvxcǒ)2YSSCPX,VSS0a?!؈YzCWX1U qqq\.wӦMr>o޼ɓ'# ^]>vvvnll={6jhh066F 2L*;DB2 H'
+wyQsss:>sLkkkrpQx^2
+_,** [[[ܹ#
+BА{ljjGĥKΞ={nr+˵Bdoiiw ۵kYy[òȐֶ011 7oMNjmm
+qqqJXWW$eeeuߟ?ZϦ+Ws ={~;w899}uttܹs{c\HDrr#OMMįcbb_.YNAF;ӣjkjj߿/曢"r
+x|Olٲ+Vh4+9^099KFp8ҿ/ŋϟ?[Ο??##!piwwwWW_~$oh"\\\===7l zzzaaaÇ?z%cAy<cCCɓ'ez,DqFYYYt##Pr6ӧOX,]]hE'bݫzAcccvcccI,X@ՙL&#555,KCC#(((>>^
+
+***O+f~>xuo
+>b27o><
+!1RSS322ڶmJ'iii^^^/u-8);;[$I>nR]]daaaaaammbBNNNvڴiv@@
+
+gϞZɽ۩xߘׯK/C^C̽֒[edd7|vߞZx庽Z[[޽;i$uuuwwwD!|>аעTTT<xĤΝ; h4uuu&YUU
+ FFF`oddDcooӽ{)fx\<ӶñVRR':#""=vV酅>ѣׯ_# ߶mBB|嗸WIyInҎ
+
+
+)))aaah4UJJ
+~%555MMMO;
+ ;rBHGG',,,,, bffP( yr]=СCa/h4----^}`󫪪*,,\nN1cBɓ'l6{UUUl6fx/VSS[h91c/^<akkk//^p,--L{mm-Nd0ګVlT7;;;&}ޖYf-]T$
+
+
+ Brl6~jjj!Grqq]p9W^]r#G֮];o<9X\\
+꫐)S ֬YS##
+"bڄ w
+lg666nذa`JEEŻwݻwե3g<v옱UUUqqq֭[bbbŋ+++#-[pǏ>+B7n3gA
+o1b9~{E%սr띝lv*
+BD<X%!TYYo*ٳg `466~ggΜ7oB߿OH _tR5g eO g܃?$^Һxd} ^ MJJ}-Nv횏Bٳggp8qUUU'']FL&ѱm8V~d]\\ǷH?uTkkP(PA:OOO&&&rbPSSӕ+WB d
+M(Q( ..\@ċ/M8 }w}JEsC];.!t]%'''|CC^wSUU;{lBB¤IBiii***71ɘ!'|sH
+/w}}}bWX===IO>]TTbtuuqdzƒ)+++|>.*44ߟN"jjjY,FPPP||<s||͛_xǤaׯ_| ~Wy_G-9l
+endstream
+endobj
+779 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 880
+/Height 171
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 34357
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 880/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xy< 3c-,EDB(%WZEqs[V7Wk%{H)JH2u}4!K_^<sfYQ
+^}}6繹ee(>PpݬȘ3B,[n(dӋ4T7nE'=*}FX__ RSG(ؤ0{h^{j<u
++ګ::ci'&& ܹ*ںpl/ʂ6<?>+B(KtR*XspW_!1st4խ$>y1gS__4 (qh<}:84?Tef}ѷAKԥKRN@xغ Tc3x?dMϟ,={NuL&_|oѢu?3)*?}KQ998
+m8
+
+_or^x>|0k\t
+
+
+22Ӿ/eu
+r&/uǎ/7X'))y[Rx-[S(xAA
+l~K${:w*C<P(ΞXL&u޻>m_ƤjhHJKnJnt"v=J,#~
+==ܜ;v89u<LJZ!', tDtkiS::;/޾ֶAR\I$qqr645٘}./qumlj13ڽKTKAP'ed8 >ju5*"
+/|S8ȓ'JJ#(~jf05]Qt\>~YNX@Xc!WB$YX'$<|C@H
+B]σe+N7!48|9io05ǽfIv]/o,ΘEWn̜̯ ؙ0E .<\B1Nu>t46Kۗ/ W"nKd|y" Nttڬ(L4iۺu uϟzzn]F[ݍx ]].Nи8Ʀ&GPp|G2nn3jEӥLcg #\\x^oVPZZ}!Ɩ[[[N?{IX7--M>> ұkj*44ԸommTP+,,J71&gaaWYI,/\^덮_ߺF_+(}^T尉[YT+?.;|pB^B[hthF܋isG^Y^XT
+ҷԏWQ6Z4m3r0mִ5W_?Cȣk<N@V|T~lYoYQ޳wܳVLX怫+
+%*:ee_g?֛}pv]6A,B!=X̭3]nۮ@7k}C| MJBW|f4~N;iom_`X1
+yX{eG}T- I--MV BVԩV~jopa2,7ڍsoux9_d O{O=0;ZoieCbMKB
+w~,Շ@6a>zz&& H ?H)4ucJPB gcmLLxd0FS@ ` % 
+277ݻӦMcggWSSA?~,''ᬭ[[[6ZWWWĝ;w
+?8,%%ۆiF@@(J@&3,?̠իWwARffGTq_D"… _|&+W<tPeee{{Ç
+CYB(r$Hb @=АHsi%F |: Sgy@ ׯgΜy͚''@MMcǎ9;;<{Ν;SNݼys[[`:t
+
+
+h4رc &88x…HpsA))0GGGUUU
+͎
+
+
+Ro޼y;{6R>| !!9ʲ &
+ Q!555uttaaakQVVЭvZ!̌!d|Ғ1.b`z: sZFS|bjjb
+UUGEE%%%-Yd֭&&&5wyyyN ssUV\RBBСCzzz
+ꚕ
+:~dU1Sshi
+))+W㘘{RR2 0`kj*LMWL&H,b|]IYJs3itG
+
+;矑cc痦|2b3%ee= .!tPP5uC*+?7554
+B q1Ru 8494~65$19v5uecg
+ (͜
+
+>vvgϞdirr 8؏c F_8pMP<1^d[s.YGKKOox+WO
+ ,@"'EE樨([[ۙ3g
+e񎌻xs{G77mlj
+ a*+?75շ(
+͆Ui8YX&*:Y*" 7[M&
+
+ehQHTŏ]8qYQQNSeeY9r3{{T֊ ;pu
+OpwĈC"ՒHlll||ӧf0ʶ/w
+ 
+7AUqW\z
+(h߼nh~*b355uuu5008u[wٲeʗ.]055ݺu&32i${{{GGǿ[AAǏZn݈FB0==[[_@HIIYd Oo>E `ndbi_ho#kaa,^&..gOR40j//ov\lڴ޾gǎ
+ ȸyfMMMMMNj坝/ܴB= fff+V 
+(KlQs2,JZb=õ3Kߧn
+ñ%quu;wƍݻgjjzQeeeQQQKKKu͙3êpFFc(!:W'%=N
+ (!LTx
+/B4W& Oo$ $
+
+UW0ƫg
+//PZz6sʆڽ{z"H
+Nbft䶰ƿ}NMZjخ
+Y%'DkWJ,MN]7Nl@ $#(1XowAO
+ 9ynqAA\<\x~<#ևMB7Of-Xr加ׯ\\abIow%4m
+"UW/%K"o񗁁z1@z{{
+
+r(Ҋ܈F3yr^'..=0m^;m;P(ǏP(AALTX{'
+qii''6 _ :e=LM̈0@ɯeV>eTUj_ S|
+WXxÇe<eys+>|OOÇ?KJlmE,y}wx h66bG7ojXZ^W37?r%LںƍzA M
+W z{{
+ Ν;Ç
+n==zѱ ++f0:CB7Jdg*/_Wz jzUJ
+9rp66rX3mϟ}llZmlV{y5UUPSC
+3
+&ܹS@@H$
+׬YSXX8ڤjiiQTTd\2EEE
+LzSTll%e%v._ɦ 7c9AA
+䦀6ɉq1̌lrrn6m 暙hts͟,*5bqFH@VD)glmMȝ d
+ɓ'szJAQgmz}zfCmy>ninɄf!/qC+
+ /_Nghh˛|}}7o<{yy)))?~-bŊ!!!+Wưuc5XxqBBBOOB]t)N d9sS"""
+%""ÑdggSNnIc``&--mmmD #=<<\EEҥKvvvIII
+鱅˗/
+
+>}t"%DDD_jlls̙cǎ!+͙3gժU+999`ff1KJJcccϢQYY
+Q!!?.\ȒA@@O[)
+
+_foNΥ))EEwzrӧKں506Dxa56q3ʰ7
+e) &SǙD$tsd0a
+itT*`,o"d"gLX2Hec4A!q&߂~wlݺu6)'***==I+++O>]PP~ɨ;…*
+߹s"*O?i'%E3d T(7:~
+H${{uwd99mmsCCk!!_gozc2Pܷogώvz*
+ά[LׯQSپ}b"ky3'ŝ--
+c||jiYj6 z} ,$zzXɷhh۲
+
+
++V(d2YWWWAAa͚5uui
+
+ׯ?}ُSgJ k#˖/*߾cוИ b?~;773 =::ƆסCߴiG*H!<yHocׯ_"iUUU
+5 L]]]!!!BBB
+aaa^ 
+:8
+
+s'yW:AۃbPܨ  H+J[,z D2Xb
+ IJ N  |µHJ
+jnќCIՍ(!!f>~}:
+QE000u Z P$ގ
+ IwQι;eEeoF7ݰ\uyX`؊_Vl vmKK gfSI߽g̠=CB֯_{qg溺Y lx
+ B
+t(++O>]PPP\\ձL{-]
+_jj
+Åo޼H$ڵk/
+3^vwQ]]ADeC*}}ħ==AA?d¼kr*?ʰ u޹s[^|Ixhk[蠞G }Я 7oޤ.[NLL?sѢE-g eeeCsF
+lÆ 6l@k׮g<kܹt```MM΅ ]\\&8$PSq萗mm`X,?l9V]]of6[pڳiVAA_OK''gBB„.٥|Fh`si;u!  J  h\n7>),)Oƒ! IFPSʹ(7)+0160q26sKOʨ<IObP>
+;# E) c_'rL:d0 141~ȫv?9-9LCO{!'L
+ߘݛcc(!hۻg/U2-2A7k֬j$FϟĉiӦ1rմ݃&{OA ASyIK8Mnz]ii'OwKNN!٬ PBTjM x~~~iii''w!bbb?See%
+%A̅Bii<@>***=ŋY>xL&䴴mݺ
+Է+<==nݪP Қ>}ҥKVqijgzyy
+rqdvhh(
+"ɚ
+
+
+[bb%KҺ ,..M]]D"!C/ hbL2j  l""tteQM|];__O:
+
+QNA:XGXH#%HEEE,ZH3"=tjKHH zTJJ:;ۚ^hX
+,..b]]])1&!innnKKKmm☘;wЯScaaw
+
+BPyYYY#eaaq;vXYYhcc؞Ç#C0#""]]])JYYYYYG& srrbbbhKm755/**
+ֽ{d~(g\\\6Jx(411:i
+#74...ooA;1҉xy 8@lчAЄ8[[[dٮ]/8998]TTDK_tiH;Ν;eee޽:th#]zzzrrr]xi7
+e9(+63j$fnWUԗ>A )y|
+ʳ1@ԋ!1 )c)JdHQѐ#b{hJ)&'2b  +0B ס  Nʁ  !.o b ,MY_Q V(! qc(! qJ  h\`  X  V(! qJ  h\`  X  V(! qJ  h\hd
+endstream
+endobj
+778 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [122.809 322.067 129.533 333.538]
+/A << /S /GoTo /D (Hfootnote.4) >>
+>> endobj
+785 0 obj <<
+/D [783 0 R /XYZ 122.806 747.976 null]
+>> endobj
+90 0 obj <<
+/D [783 0 R /XYZ 123.806 712.73 null]
+>> endobj
+786 0 obj <<
+/D [783 0 R /XYZ 123.806 626.224 null]
+>> endobj
+94 0 obj <<
+/D [783 0 R /XYZ 123.806 490.849 null]
+>> endobj
+787 0 obj <<
+/D [783 0 R /XYZ 123.806 316.338 null]
+>> endobj
+788 0 obj <<
+/D [783 0 R /XYZ 141.734 190.575 null]
+>> endobj
+782 0 obj <<
+/Font << /F25 474 0 R /F39 618 0 R /F16 475 0 R /F44 651 0 R /F43 652 0 R /F36 596 0 R /F45 668 0 R >>
+/XObject << /Im23 770 0 R /Im24 779 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+799 0 obj <<
+/Length 2229
+/Filter /FlateDecode
+>>
+stream
+xڭXK۸ϯ-T֢ Y'J6U8$$L2Ix JDC."h
+z^^ӱTDZVk/ab$ADު>&bjf44"W\\,Ufշ+E燞:cW>z셁39wɲ ﷫]sM(0Qr&cidLIH${N%R@%qXơm=`[,uӯ!=,@8gYB,X\wM#InGi2%
+k[E+FD=k^[^:ƙPrA
+jQ:iDnUI-g8ھ%I_m-HIK!~ػrR!}:ⷍ}nX KeH4spV+CS0!Ned#-1!!9ٺqf QXa,aC#metL^_eoZ$tbH_v}Nz:;JyKeX+"%u8T [(2B!]]xCG8L R,b,rd{VxQHZ0Ices__#v,ә C.~e*YbCx[w (^vNrE<˜eO6"4.Vowa|dm+X؀gQq^wAmmO.EΌ4(a {D!%)(_Wܷ2w[Qv4p=}2L(Yd*og0:%i=yMHYdiz(@{{.JH:/OC$?UUՂwu[4Rna(Q5lץP6?} @Ȥ$~ t TYabyzI=A8=;<E#m1e= ıHw{d@L˝>)7ŭ 2Yfc(U -nM@qê)-#RM+Nƿ3EXU%/>3{n\,㘎w4e(\x|rϣW|?-Eh+U 8y Ē-%릗}Ivn4%=шJF@+pr=(<(|s4VN4"S0傂w63)(Xeۺh r=_*F+kw4Zb< Ķs|1UA.˾ܹMQЛ;m*\::si`ybRN!q!2jA%pSA'sUC#Olq@ht=V릑Qk]'.^
+
+'*Zk
+FS#[28vF t
+Y-Q[PPs R
+&9U%;
+endstream
+endobj
+798 0 obj <<
+/Type /Page
+/Contents 799 0 R
+/Resources 797 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 740 0 R
+/Annots [ 780 0 R 781 0 R 789 0 R 790 0 R 791 0 R 795 0 R 796 0 R ]
+>> endobj
+792 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 984
+/Height 306
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 53481
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 984/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xwXG^(` *Ŋb-$k4b/1gލb%Fc;oǞyQdݝݛfggAAQxN
+rߓCR=zZK_^|y9*1 w޵Jl0
+(.6Uƈ
+E
+ (N 'L>=t3f 93lYȯfU{Z*IWC¾4۷QJRRR233߅`q}sE .=vO3OOæ |`7o7r[][hckִhק۷q˗/ m8~<eez6qЯǏJ_ zz|ccCc#3cPhldhdd`eeq_WÇ<>|m5ϟ˖5h2i&ݱ(O$h?bhZ_H ЮOg%CJ=Ⓖ6;f%1 (Cj{Nԭ窲ɋ9xqot{&ʉX$4
+SD8'3(WNg%$ǧ&zc`lnY=/DeGs\zmll""#=EaOħ?Uۇ77˗/(߹}{@M=tݿo0*():c'N8mڴٳg-iK^z7o٢ky⤇sɊu~6ͽ[jJ
+wlwovM9UɈT5t<zoW,_&`L&۸Wz46dKSV
+SRSRվ
+$::j=gϭ]G=:::j}*k֫WoEK~^t2
+;% (r<.p.= [
+W2
+)y!+!mC}=䌈ocD"X;w+6)rvvqÆÇ>}_'OqwwWW}}}7n[}IJL\"WwռEǏYt)_~@6m~|tt SRRƎrL`^.w߮}My;w
+07w-Z6}zlli4XaaÇ(jqԮ/J_|Bs@)\g!@N|&&&+K 3tm=cף6󯞺Ae|GLȬLO6\#6P1:3F֧oݻvwG%+l8EA$R{Cvc9+6<[>zBᯟWj-IeLLE%gJ"♧>:``ycd _^
+aر"HGDՅ_,:矊<ii婶d&R*rh
+܇dg'3i.
+޿%]pߖ ڶ]z?\.ۥkEDߌpҥ5~> lFv>FGqN
+N"HL <ԋYf .b_tI%N%6/!N\ ߘ\Ȼ"\MzʄY7kְn]Xi*8m#YeV.>??Zh
+ď$ܬd'I1&N|5:yD@熏ﶭ[~?[gwG%+ b W_ϠOc
+9*h(uZlNM>ӟ(GiԨbś'O6j֬ausaFf
+#h3'QԾZzi7:/Zx/
+Z9jiXϕ˗_~5rԨv8{Ɗj;:}P( 9jAW\^byzzҥlFXjJJ;[9SNql+W.{*P3ekg[w'6tPY ;;j.c"<r\4^1z
+蔉
+/Z?xSBJFm^Jl(=q w?;nQfɉo5sUϯ4W(?>-WY=~xZ<Miwt`*9l;[F%J+ka$T*gë]3i# xz11镉}}WW Ӧ3lR#sr2T&c޼ HJLfddbo_pM{/w0 MM6Qo"r\Pђ t"22Ç
+
+NN ٳ+6%ozD<NM%#FiV<"#_V0hGu2o j/2dȐ!xc+HZ
+ѫ {w,Z#з/Ξj8o ;OԖ3
+/m+
+am-?[a>֭CL -<)|
+Ѧ /&] 
+RgS\GcE7))=gAQKe+ٔ~JK@ha!Ñ˾c x#5 E_?[v4ˣ25U_ ˃AGc7) u`lތ!bddea,8i4|MLT OU  H:j[Y'No+ÔOJD_XUmOʏ,,1v,4ly1%ffc(
+PggbNŐJA&+ڵCJVjplތPŸoon!:-Z$\qׯ#5]\`h(eChwlxy/=~4Wgڟ%(7~x<ΪS-Z!Mԫ33<
+u7lh]?Ԗ U.YS9Cq(ȥRݻl~|ɸq222Rk
+o{KLݿ/œ'֭m9q"u֭;"#t|(ˌF ķixx Ep(aT0 eR9t(w,FjE5kVXXXϞ='LΜ93l0
+;v3fL񄅅={رc<^z;wzѣx;;M+y
+U}E
+*ϟ?֚Zkd h('jP|qW2_w\ ӻ9Ǝ5l͙P>qc) ޼\F
+w@ӌ-֖'}) o p) KƆsKWgʕ+Çwqq9~]bbǏ?~ثW"[nǜ ̙bŊݻ yi[Adq JF"W/| -Է8.0@kQɷ=Wd<
+3L0@ P,ݾ}ȑ#y.$P0]ٴ133qF]mذ@pp?Qm<AeEOSo:uvW ˪=x0֮ڰ!@q{H
+d|2dii2o車N @o:<E[0 VVp*1YY޽9IfexxK6/T1|Vxllj^haa&k͚57n(%ɝ;w޿.zjRR
+8
+řڻ7DzmС}]&+(6V:rdjW\*Sx P5h!66v̙...NAԭ[tӦ گftPw͚3.A달FCnݺuu* |I޽#p 8 4ѮJGz z=V_}͚AAA4 ?]C
+ԩRR:ulYy(O *җQozqC<._P3aV+q&m<woM߿'+VzI̢E1LΝ03ˤSJ| +65o~ݻ%|߷m[~uԷ:A[Ba=\zG !p[U<ff==߹DeGDG$m* okMm(
+%!R
+VF(7+Wnqq')U["c׀*sGNNׯ%_:|'O>=…Iɝ[z.O!*С+4D1խmfiW99zV[ T,:Pdd
++թv/"))}7
+^nxrr4W#Ro g=\ze?tի:"h,?/z5lYg%gO{NaXG6;,0Ț)
+$6
+Sa[Mϟ .(n ӌa%%5پ^IZV-Z0L3Y\]VV#?Ͼ4c?M?w 4-qee`{MmL;;.Ϟ5lҠW+9In=ZysvEƯ+G 33?d~}ܹ#h
+R)d[$
+Tݺ’oovr:By~qV5U+o/g9.UZ'۴)Ԕ۶a ѣF~U^R֭,奵k ^vC1VwdGD|U6~*熸1|8wGp0'_4cplUoOOܸgѾ};v-Lٳ)~
+޿*~pjܹh
+7n` ̚
+)!4'ǃڶODqW/ۃЩ c
+ATagΠgVƳgpw?۵p!ךq8?e ia4{??\
+
+ptImK_Mټ9Q,֮J$trrd
+_rzl{qEFR)hq8IRi3c`iG`Bzg?EΰΝ!DGݼ)\0V\qf~Hn.|ԩ
+hvv4$%a
+
+o۶%QCutO?(Zjס
+iWн{u9|}ѹ3~Sz'+t耍E@,Ft4 С7V 8u
+^^]:{4Ywwo"+ +Ve2lߎѣ^ƍJ:/ݻhWcq
+^^4WCĉ6z.PBccպp 04(o,=p%3HלY@[EÇ ss=\-\OmظajmֆM,ZTC۶%^Z?+sҢF|UnwYc9v%>aB #o (:^aqc4''Lz2XuJII177OM-b޽{L~^F@7ǃ`֫Pn`qaO@Dq}*zuEF>E,<ݶÇ8t
+Y (#aaD] (eo^*AhǏUbUO?AAT 24   tmX{x [zUd.B 1ܢ" *LE4ħL1ZҤ`Ӧ7o*SO Bj2/l޽)Z=</Z{g{u^zb
+mொ'AZ x
+eMpGQfqQq'2
+2"@٤-eP(vC&m#i4IK"9}{{sZnŊ)S< -hˊ<,'?p noY47嵵xcI?X1bD_y]m߀kh!`0T3
+`]R`(0x8 \Z ċO
+ⷿ,X+.i4ܱc+h=z0v9V>*. Dao-.Vc1γܖ->P^[k鋊lWrW7)tx8~/Xά{ob,ֲ/h&''lַff3o6.W[,ƍQy\Nuu. 
+dg
+uukn5ץ7g)JK퉉53gj,|bѣk ۿSzf {?!nO>iJOxCJ|PC e"Q7oyJ t;O*>^yxYG2E,PNj4q  g~!s~5֬Q(4c, (
+jjZ;Ap0ҕ+=XuS"11 à̾xLd\u\`$x pw0Ц_kן} #
+Xm`{Ntd;}٤$[om6\d;xВ'Y,JŨTȟ:e-kfYѣW }qb##X ?ɨ@:2NI77}:EtӦKKU|_t&ߛ{fcQQL|<fMó//)qع4y@FP~eK_yEHbGYPR{ttm }q,̙߰!e@*l6^*zHҳ'c4RiWw
+_(6o6inGII6n4ɁKlEE "#$
+nN!70 xX
+쬨RuunV xnmm-W_ed\m[>~)S˗eeWU[9 ]7\'@v;\ MSo_6:+#1KI}HKS6m2nR^ okHDd 5QKPώ/<w*OgVhܞe
+44
+ En헼(,ӌ|̏u1.=PP`]Q9-M|yTJUW۟{
+ Uz=p1Un޼^
+?UM@wzøq->y˗ܼy8,~zObCbN>I[۳ =&]ĹY_֭_so?1'gk-ggpn*ŋRܹ]va)52­\
+EerdWYE\^=z >|]eeZUFRC* g\vԨOVT$<q׊ z:TUV6Ƚz۞.dHu?9!P[^-+kz'(*tI{$&
+.Խڃ[VMN;ۙ!gŊele<0 - gZ.ԝ9HQ(^}U6}X"o7=|wQӦ|2 )Iim
+MMun5>SRI\:Tp}ӧy;4G2M n|b  l
+wР++z2<Ґ!_]k6ztg
+GQ*9|1%wCCn~رkk8*eH3"#ϵ*=w !!Ex/0,Z7Y0?ګsqxv~jY@xȯ- l6̘!Y~;\=LڵC:Je k׸8nV˭X8eؓ/'whl'Z{|Ǥ1t 7W(*Ҷ8d
+/+ .Z|MSu]{L 0(+/^,S*+Wl~cn3YS&˫ 39il T;Nq#b.j{܈!64Dj418w**46s#
+8kvLNo̲
+ߴɸm[Hy3r"%Q_<,h3Xɓ}',>Dq}=rWBӔK+:}
+G$Tu N @,:Ùh BQ|j7V…L&xDMBA(lJHgH"|hFQ(kh}YINEEJs
+bpaltf(,`jyޛLnn+TJY(.?^|\`mlG6vN 6yJE+ /J{o~#>rRQђ~!:wyٲF?j{a͵xEScEΙ]L.KiZK"%9n1?x
+ 'MСL
+
+l
+ sh[~aܸu޼˃ǀZn޼zWD@Vw ymO*3uQ_s~%znBŋ>"Џ=&]ĹլY_\mDɓٳf.ԭZxQUZj;۳(Fj[v-^p~άG|wiOs?wEvA
+`Ϟ=ڴi7ǣ3g/v{@  q @ n8@ B7@q@  8@ n:'/u%zMĉoV$;[0xg#@c
+
+ UlUT p\x5%[ng괢1G>bc 1q55!!))ߊDo#F|i}GyK 1psxqI^DFɹMLIG``K0VbN9r%oBBʯ]'8!BX]߽<0.%e\^c2
+
+&9v" Q~|GA+<߁
+8 S
+룲R2dfKQ>vl6ܯM̏?>0VƧ0d3#". w߽h(4{tuu+;@#˫M&
+ z:Dj7:Ri=Ms"1q q
+
+
+&FGLzjkj
+ٱcqEE{{p
+"RՃ{\3;gp0֡C7VU%8J
+̙Zմۅ4Y,={
+ !a&)򔘘`./lp
+
+N"i(+014,슟&7pKRS@U
+|3Ot=
+-*R+_|1Ч/) xQ?< OK
+ vI,8CN{<r|VuvH`o`T,@Oρov:o
+
+pv4M,!Tmju8G%K䯼@&H:%n޼7ސIwB٧<FKK۶]竾nYڙ35:a3UK{\z
+ō,@P
+k4W
+lR^<6`ÿO1d
+m{:nd*+=;Jhj@&
+gL\ WT؋lO=@Q;V>mqص
+{i4U:t^$D"m099`ټ<<j޽eݽOX=i8$ dZ-WP`Ҟ]u}^
+>UmEo_@
+ Vy 8<
+'@cy8 kLhw -?/ "
+ĜcSS(
+ٱcqEE{%&% zKo%L«TJSbٲXVfykbWmMMի\IMdzk49#^  <
+ v;z
+gOhNNXNNذa7Zfw ai/L.޳'#GCBh|s`eCBhwM^BBk8
+%~̜)<Ğ;ZÖ-Y$/WV
+aaFӒaq`_PrĀ
+KLV>9IWLA}дRWJuQ$jq 18HƎ]R]i}괔o^qE ""
+BPؔb64D
+EEPPk=h2u:k]?1HSP*.9<OUU%$%6|P*p!m !UG6\y#\^-65.ixQ~עp}iQsŲ>\<)rlZyw/Lnn+TJY(.?^Z"=ʯٞz*0v(69|eu+Wl}-J/\66F L0?p`DÀa(ǁF|䈥uHG˽P]m/, <}
+
+s߮,.nR~~
+?-]ee'N|F
+zWX
+ȝ;+- =QK U =}Jy۶Xyy+.^PΦM{Pi}edd̕J򫯴ϛضrL;7735&-PDb_46q !AY;"D+WSa~_oqr Œ3w
+jVffHjӶV9L昒2(/=MIrLZ$ʎTRez@+(
+GB;t8LwhXb
+>ѩ
+
+Z<,9yhp!6[
+Ayn-/dj|mY];VuU*xPu",LU [?G)ۊǏX,
+M.4^*%Y,FISW|>C*5}IwK;;3Hݶ
+ 5):Z>|8
+b8`ݥV_^}ouqԝ #If~?mOם~~4ہ7s8RCM?u&I&23cc'լ-aa[T*nP3s+++PVaǏ6l:iqo[QZ^~H꽦G %Tf򬪲pmݳg<=gʳg)<A({zu(gmLW=ii8".nRpaVn#h5IkJJ4\
+ T,Vs
+v Df˄<+Wf̙T^R"->ɓnT**\\]UTl4FDi׎rr۳  zj]uueJJ%ItPWt[t=Rk:PC2A
+;Arc۶L5qqyc*?r+@!4>
+_:`wbPj4DE
+
+
+
+<y%67y5wK|[\36F_X,
+k'U/XP
+
+
+ln1GU\ٲQYk:<(''荈pe TԵk~tfǻ/_zzk&VtHMU'SYFIBB
+޺kcoOwޑ+vQ7,)6jLJh׮1Rz a; /t;, j/+
+ȝ;+- *#x{<{?y >]0wn‰ J궈ł Ced
+ ϜH
+˯_Wo1
+uCݨJ
+[
+b_|'
+&L0aҜZm]z]gNz:f\97Kiӆ$I] @peD2x`jyJJʭ[֬YfJoJ~׮]/n߾=
+45<k֬Y|yHH[~omfjڸqc~~>AԳjg`4,/cBru;L~]+`{Sz
+
+s݀E.QK~~+v)ݻСC3f7nyʚ1cݽ{w
+Ņ v
+
+JtRzzSm۶MII)**-I?eʔ7>x
+ׯ_ɸqL擓
+
+  .օhz`!d4LX`GY-?~וJ۫<wrhXZjdA/
+"666X?
+isj>^4f W;}ڬ ?Ú5*j#%o߾o0~<<~lݺukQQL&۵kvڟMpRso&UPPC4@m 222~mR_BI\v^nπRRRd2٭[BBBW`*P(r1V?Ɩ[Z pqYLvΝݻWΆ3W/3n0w3/yZZʰ9"8,,ڵkǏgߪ;
+,\=ų~}lrǎϭt a205Q͡JLL'44ŋu-=<cgg7o޼}yxxT]@.oe5>С _? z۶ի?)տ~DÇ>%>>*+L=g;vÂ0|89Æʕ0e
+ Ǐק GP,^ݻ|󍧧gu+ ;TX= 0c ȑpMG… O>H$UUUF
+þ}p$Cx8 + BTr\Nު{7̛]L}pjuzFr2 TaDl{d-l6{ƌ3f̸w^aaj
+?}gXsݻw:TP BCWڴѦ8u뚹.] %:͓' 4?]\\>իWZew￁ 1!:&Ma :dzfݾ}{<(( /=eX>ʞ[[LnZP;$++߯B' K,mgW90 5U+W̽c%wߥ:gaZ Kض NyGVhbbbƍpFQXXxG$в%<x}ky`zn\8@HG"7@QЄ~~~,ѣG6m|).ܴ鼽!3D^/y*%0@Ow>#RS |}woѩcutw.]jzD"Qdd %0x0
+
+BoooOO &lݺcǎի{^__zWڙ핱zf2!, .\
+Xْp:;?>l7 a28{ iiRbmܸׯ_ѵk '…
+wW/k܊L޽{KKK-[x<g׃A;obkJgΜ٢E gg?}бc~MC. Jx:th۷3s+VTG
+3k7-[j m*++Ϟ=ѽ{f"?? 
+$%UmuJr9ro)HWn >nCF|ɓKh
+X, /熬5w۫
+GɄ5k޽8
+ToyBVF;ab[!-zЗ
+ԩS#B!M`8B!Bt&L{M=SIa B!Qd¡)!B
+B!S7hQB!zyqB!l
+endstream
+endobj
+780 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [210.178 660.844 216.902 674.64]
+/A << /S /GoTo /D (Hfootnote.5) >>
+>> endobj
+781 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [364.112 574.169 370.836 587.965]
+/A << /S /GoTo /D (Hfootnote.6) >>
+>> endobj
+789 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [234.063 503.19 240.787 516.985]
+/A << /S /GoTo /D (Hfootnote.7) >>
+>> endobj
+790 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [464.778 503.19 471.502 516.985]
+/A << /S /GoTo /D (Hfootnote.8) >>
+>> endobj
+791 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [357.779 488.744 424.464 501.294]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://software.schmorp.de/pkg/rxvt-unicode.html)>>
+>> endobj
+795 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [193.738 262.589 250.816 274.887]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://software.schmorp.de/pkg/rxvt-unicode.html)>>
+>> endobj
+796 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [373.756 262.589 471.502 274.887]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.midnight-commander.org/)>>
+>> endobj
+800 0 obj <<
+/D [798 0 R /XYZ 80.963 747.976 null]
+>> endobj
+98 0 obj <<
+/D [798 0 R /XYZ 81.963 712.73 null]
+>> endobj
+102 0 obj <<
+/D [798 0 R /XYZ 81.963 546.608 null]
+>> endobj
+801 0 obj <<
+/D [798 0 R /XYZ 81.963 411.905 null]
+>> endobj
+802 0 obj <<
+/D [798 0 R /XYZ 99.891 230.539 null]
+>> endobj
+803 0 obj <<
+/D [798 0 R /XYZ 99.891 206.628 null]
+>> endobj
+804 0 obj <<
+/D [798 0 R /XYZ 99.891 170.763 null]
+>> endobj
+805 0 obj <<
+/D [798 0 R /XYZ 99.891 146.852 null]
+>> endobj
+797 0 obj <<
+/Font << /F25 474 0 R /F39 618 0 R /F16 475 0 R /F36 596 0 R /F24 476 0 R /F44 651 0 R /F43 652 0 R /F45 668 0 R >>
+/XObject << /Im25 792 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+810 0 obj <<
+/Length 1751
+/Filter /FlateDecode
+>>
+stream
+xڝWIw8 WVZHj[.3sȌVNҖ3j'o." $
+[ͭ /l
+buKɻ]B~
+.;tzYf2f (zՈ3%ݚ6?v?#Gwam)4{uV=deKp
+܊\2E
+i\3&8%A]e k)!Ma@=0>`nꇼpt<|?N?/EOI(y ~'4ูflRؐc/ XU]J#Ka}{ $霘wk!k9j9-cŷ׬=E(@ ӈ"Yv,H01+8nxcn8[՞l 7 "C)dd
+N)^aS'~Dž$/3C|([0xٮ !;<h6<;^\
+%
+~oYl!샔 xYqBUIa;o.o&y@ihZf7Xݎ^EՒ+$Q)@\㿊E)DVݚ ufIP(3VjNV*' D@/wbY)DµʜWmnfHæd+du@yG
+S8Hj"m +y "?J~zM
+endstream
+endobj
+809 0 obj <<
+/Type /Page
+/Contents 810 0 R
+/Resources 808 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 740 0 R
+/Group 688 0 R
+>> endobj
+806 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 251
+/Height 294
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 813 0 R
+/Length 15704
+/Filter /FlateDecode
+>>
+stream
+x\A).XOPT8^Cϟb/YPQb/EPA)6P@iJK!!J -\؄@ٗ27v`KB9 <f Z9|aYFkNMVSګV| {MiZ_[Mwn̷$nKF{ILL fK6}[/&s-SG2'K)K>u8#wx)+Vp0"F.AD~PROMM |?ATj:Uӝx~/
+hn";泲sc|ΐ@8۟r6p͙oÙn3x2"Y.ӛF_i1E.]|9] *U +W ,{!]ކFht6S#Yyηo^9``
+EӧO;fn5sVwioF~Briy$( s Ηs>6SҎV5:Sg軪vI]}w'L+)a2 ,fJJ`Ǚ#߽ͥӧXZYnhWZeHD9{!cdZgW
+QUTa1CR&
+*|$1m, BR|>Aӑ>)#(矯K6Fa{z9^ ~M֭;r-L&TlmmϞ9{q }oc#˖ϞHH \yN
+Iu9";Yg0^o0kmTOJ9]dfV ҉À736Z4jкѽD6WW·žbxeSWUu~xg|#|C5ީ׮{e˖7Z~$UXQQQxR9{qkÇw467[|٢ fϞ>}v#_dsu_)6?ue|@?~~N '/Z v59?ig_"_?ZkF[ i_-3O@0R3>nGr˯ez?l]
+cGGD64]5<w wйyGy⚗W@||Unsp}xRF'h77mZf-Z7}A?H[R8r6p(r޷GEo8g9L~;K xcU_V&̃fLQ)SV|:r\9'݊Kz Bt'J#ONNr~o9}w+e|65=|ھ}v>!Vǯoxpxabl׮]&&&6mZf+-^4GoΌ3ut~DZc6yG(~E;YUs?uWR27SyD؀a=px -7>3c}i̟M r5=4ٌ
+ Ǧ&ub򭁕ppp9L?:ގy+,\gE3۶Y]ktM|||nnnC,6M7]vŊ,͌g
+ ϔ"S1m?<($sݯ'L frr\57yro~97m `nn7E[ 6Z[ S_WC%KΝ4?Ӹq54 qL/8Vᜍ*dϲXA'KN+IN#Fh~沤@;1=0($jZ-s~|=O\0WrM!PLYgC
+B9*gԉ{]tuVX6h,(^nzt
+.䟁(b$0"ߥq˻q33rn'
+w{P:n~"MyH֮Dz[f\CTaiiiRyڔskuhoGm3cnwV]ZSGcc5?F?-fp%iJHL95"Yd[8-
+xV
+2Yyh^|H5xi
+pd]0b<Srt~<
+
+
+
+ 行GO *)Q! q2t:[U5 ]jj7@ohEY>+d߶M:YMM7oވPʴE L**jbb`WWA޽>5
+nA~Ҥ,͂yyڇ\ ]Q]եAS
+->}:7oӧO߾}KKK)e"^;99ua„ χٳl6pڵKt߼/eBťe@vvpd Ӯ8yyKB̙3/?}T)1>11qĉK{ŋKRR8kkgKKn<VC>.0 ~C82%e ߔC<xz
+TWʫVVVJ =y0!K`Ъ(t
+Cɽ{`dõϞ=<jRL[ڥA6|3g΄WTT#h޽i]t:[EvZR]=FNK"+hY###޽{fi*e"^3UVP?~<TTT
+UU0 {`x//7:uJLqEai߾iU^^͂`MǬɓp
+ CĪQ2y[T.[Fov @  ZmmmIϟ?o(vv<^TTn7榤Tݬf=
+z4eeSS]73ã-,F$eBPޙK 'iw \/nq27@=BB/k7#OD>1M5-{n
+!jej}
+'1 <qBAP)ˮE:ٖ\x"E ̀@ <i8iA|7!OH"@02[
+O:;psܱ&H|୬ :] gϝѣun|jhL8vڵG6b):uKTɫ4+ ѥ:eB:g?;ܵֈ?`8hw+6a|^^lceW=ϜwagϾC֭O_^^E@߷޶mGWϛsrʀb`I|raS82Freqc<os2LtsB/ׯ{_iպuG[;8:޳.v_o9g&k Ђo7b 9 ϝ ޽ϵk<=?ϘT_9Te˙ ?ر'<oܹ;JP!yJ5b?YˡxT`H{rk׽eLLN?y*zhchx]Gj]1cYc@,yc.WbOS|x?tȭSn/ G%4R](po.ÊϮ bwйyGy⚗W@||UnspџGៃ.UM
+ ]m`Ѓkbj0jo^ uNƍ',M]%/=|Ha,(2]]<
+ ͧ, CsMLlftvsZ4;ik/FڵGkiM[ -[vŋC軤J^t)ti}aw1hoAp5=rrr wﮨ8fWWz
+SʴEaW>|Qz
+dx,-I
+|zX] `$kn8I <^u0X~ ߨV9Ҳ G5x
+ɴ$$4OW0Nip#h$#wVToʪߓVZ{iC-:-)$e @77SvQE@L:x sJFc=oxa Sutrʃ[.*u1޿/_7K|Q9^v .//?}8
+\FMee,%\p/O*))paeBB6/&Ld}@+'wiO:7 "Ç4iRdd.~
+|ø9À d?(]!CHdik3..JfffSLN*ߖѩSŋ_| J]]] Gv~qڵޣ%vW5\5!ZG
++Y&HC[xa '9 3x)@ j/k4ta@"^
+75ҕXhpB/.)^gPéﱔ]
+|v{ - }ǎT ojJ\ǎ5F 8
+
+
+r2%%C$ @JNؑ`iSjii5= xyyÇ; ۷q
+D'us+iFR z-{_p+6٧Wqq”2m/S/\pRVf̘Sg'%ASyǎ44,-G\"Ē@;nL,9ع3i'1f^
+p7*e"^&5epcP޽ 7z{B<)OlЯ_2kְxWWbA0?pR-be < T?|7mϥټxCɓSR8ݺܹkRRԁvt}x" ={p>Jix=
+< lllܘA+2$w
+d͛'
+
+
+cǎuttDw睊F߿ pY+Wrپ}Bmp/|CgixyxR?xOZ[zc[Zф|ǫ%1x <?⇁očXZ``1X0x,x < < ǂcc``c
+?V ~
+endstream
+endobj
+813 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 251
+/Height 294
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 167
+/Filter /FlateDecode
+>>
+stream
+x
+endstream
+endobj
+811 0 obj <<
+/D [809 0 R /XYZ 122.806 747.976 null]
+>> endobj
+106 0 obj <<
+/D [809 0 R /XYZ 123.806 712.73 null]
+>> endobj
+110 0 obj <<
+/D [809 0 R /XYZ 123.806 685.592 null]
+>> endobj
+114 0 obj <<
+/D [809 0 R /XYZ 123.806 572.009 null]
+>> endobj
+118 0 obj <<
+/D [809 0 R /XYZ 123.806 471.849 null]
+>> endobj
+812 0 obj <<
+/D [809 0 R /XYZ 123.806 434.555 null]
+>> endobj
+122 0 obj <<
+/D [809 0 R /XYZ 123.806 330.676 null]
+>> endobj
+126 0 obj <<
+/D [809 0 R /XYZ 123.806 212.459 null]
+>> endobj
+130 0 obj <<
+/D [809 0 R /XYZ 123.806 177.683 null]
+>> endobj
+808 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F39 618 0 R /F16 475 0 R /F44 651 0 R /F43 652 0 R >>
+/XObject << /Im26 806 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+821 0 obj <<
+/Length 1811
+/Filter /FlateDecode
+>>
+stream
+xڍWK6WpUEO <fM%Rlaljlp
+ 謈.w)kUFI1T
+Ԛb ,lG2iɆz:{0,VGxLTXwC3M2ˎq'bNF% IZ񁽻vE ڑs5G/pWe/-=|xt`0oD;~⥺) vͪw2 {n=/*MqHes^q@-rPg-( UHs "6$dq/DҭdR[1_ܧRdkgV%qooZ//
+ Fܗh)Kr&2H>r2oш ܬ ƣcp?VR]&t3VRS?@FN19xfc?0/HiMExyP2nkwP,?>CիyΆOۥiǂ3dt"%"fU
+X2
+U];UTq,d PsaBw0S&e5<_e~oM(rZeDQ"-H(<,2W-*nbM/S~BJ/#3Z }8 fF+Ӣ,ootnkm۽.aO9]?t"(.1:}*.p2E52Z5:4Uptx%@BcZ+͝2&JY8IeY1KOmBmPSPZγsf] cg *d 8U*SH% 䢔JiBhcaN4OtXsop=)уkGޭj^wH5\&L*Dݻt?kYWJAwO("@
+TC ͇O:1Z
+]dGfd.^^;"apO+*`'Tzp;U|OɑO ޷f"ah8燧LVMd%(su4k'0
+_nn#Kۭ9=5E anm>y6f"%F͜)I:aD74
+endstream
+endobj
+820 0 obj <<
+/Type /Page
+/Contents 821 0 R
+/Resources 819 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 825 0 R
+/Group 688 0 R
+>> endobj
+807 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 826 0 R
+/Length 558
+/Filter /FlateDecode
+>>
+stream
+xڕkQƳr]*.݈t릸܈ ݉ q؄VEK Ehb#y6&L23yype 33s|?!oxp@/ϑݏ[7</|`Ųn_WLj+ս!$0hw5YaحT%2L*kNA< +=EFtXa(nH)ԉ'
+ѝLd;=wH/:;ځo1F wӴ@kT~7]Ly}Ɗz?U<î]&\%)y6ô%?,W߽Οb9rAOrݣ{kF@KMsn:v%(J7 W_ڷ.:
+endstream
+endobj
+826 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 22
+/Height 22
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 39
+/Filter /FlateDecode
+>>
+stream
+x!
+endstream
+endobj
+814 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 600
+/Height 457
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 827 0 R
+/Length 25664
+/Filter /FlateDecode
+>>
+stream
+xXSWE8=kQZZ{o⨫n=
+ zd]]VԖ}*rV(װr @V<XɎIgGEKNNtf~aI9*}!
+o5ukz~hd\zwٿIǦ[5Z~Auc&>e1wKPo'IӧM5|g{A̹_>}'ݻ\AddRppO^ s_'N:yiA Z%.?砽ġxk}]<}"kx/㇌4Ip+W.^xy
+l7_>eY5gV S6 տ399Y|Խw컮pQW=G/i~F2[厚K:-'!vX`{YP\9=bc߿y)fg&%=~EԉxU V['riCmv1eO}.e1s|͎;&kxqcc$$A}Nz+,Y3o̙S&L0jhxs\ã󢵄o:Ѣ:>=SեI"wZl@j^i#2.s?k]ɭcjߜ洛^vS/>>^L;t\HsţzN]V?Y
+P>6IW+牺0w-Y=DR+ zseI4Fըd=x7h]^.^ߴFǢZ_ͮٻf-]>\'**J㡱ڱ'=ɵ-^q _^w[V;\Bpw(O:VΟ?l Ipܸq$AI0;4cO;'[Yy:t_EEc8z ~8qqG6Y9d*IwXlXц;T Ip׮][6|.Ip')'L :_~
+)+|M ) G= {pȆ/ǙpYf#WXtbZo?x{V 7uIuf͚9unj3tI@=X>yჺ\WsnP]w$usѽ[*T[Qd/d{g;Ņ':4k(Tqsyk-~ 05us a0qӌ|\ }:5}FBJ39S }'z<ms
+wN1M|F=2koMz}2lñ^~,9xA I];v 1&I]wyDmׯ> 񉱴46~`k"2-:C-Ĵ
+W3Cnfbb͛%?UW-]t1 ?@!
+
+"'&ŋO6d~n<&&SVnzftr@ S,T_dVkGA
+TT˗g^N7wyOǎoۖ=09uc`)UR"(á |ɩ?%Nb<Ά'Ÿ
+.8Ã
+k{NأGl@ ~?̽7s O+^ˬw$ w
+{d 6,< =H4jԨAc(kۻd=8vX 
+
+ի)/ Ei W\ᯕСòehgϞURR珵ٳGt~ȽK܃otttRTTl۶(Pܞ;wZ ۗ/ %Dfk֬ߊIY4P?ϗ%{06GkС*իzdf͚&MSǟ>i;NgiO2^+ރE=ؾ}{zQJKcdd=
+~~"O&:t1)+=ǏXE`~Eի:A
+]0GGxL2uݥܹsNx
+*󓘘߃QQQԟ<y2<
+ħ.9(u"
+A
+ ,g'2SY~\g`?n9H-SWg>>];f`ʬgOnccc&MZvŋɆ***qqqئ7W***0\lGvٜ#|S_|DTQ+$<{3k,+}:ahȝ"Ը^ȏE2mzff\VxD6O߸q
+ej]rn3 1
+z Rɮ_V蝹zٳR5~'пȌ
+v
+
+
+txB M@x
+`x AR :W+D sueժqM^n< `5k_Hvvғ'U-->Ԋ$޽{S'{͛7722g_zzz7VTT޽{NN 
+իצM;w׏ޢ4l2Ϛ5k'N$H
+###I.JJJ3fHKKKJJ*uƒ
+iOGwMr~VƢgJރϞ9Qҷnݿܼ2 V>w1!;?)2CC*H+$`Imݝޖ&&&#G>|Pz &`pp0 nOJw
+
+LWsחz/#1񩹹M3OE|KK s>߹sg999___>|uH<y"uƒ
+
+
+Z:{,?M*YW:A
+o-,,Nx
+{
+[w
+Kl
+KBiwPt^c$&ʺRŘNx
+KC0չZ^TVwbL\'<
+IDsQWW TQCC\ Iă^wiNn ҩԢE!=&&F`]"Ѹ%Sw)((:K,8t)[:+b]]VԖﻭoj}7! <Xu>6kU\[h(TVzVwHa͍q_ȮQƬYJAG84 2/,I<;n<Q M"]:?E=}
+]4i|FF?AKKYf_gecނml\"ߑBHώ|II4hz+Pgm.4N
+Yiv;vܦ'Nx ݸqkwt/=2n݆.7o&}<{}
+t6xip<
+ %OZ& DڬY۔4nܚo**.5OW+CԻ]˗ <XFYw2N= jh*6(.=|rrrM6<ixp~ǎ+ixYϩ]>3 nyY
+Ge9gƌY0}KynO韓k~^[.Qh%3gn)iٲ-9\N]O9/?x/<.Jm]G/>x,kDtuʕܠ J.600իo߾-uV;RccO{{k-n[<#ɹ_6=YU;v8z--4hBڵ"ݹye@NiܸU2[׬Y[M{DRi 9<xrdzjFFϚ7o
+Q7<y:EKk^ރE2Q.<kluDdeq?&S:<(Tw C2pnOJymFk?!;W0qF99 5O|_A;;%(USᳯ_S$\))աu ۭ
+];>\DkԨ5dowfw ][THΝ6%xpӦTx`]yAԛ˶]vQALߣ?w#b~׉nujg sNx.;/%8M&.;f.իW-uV=q-`asV;ߪS~+L_.5;:33$/ogo/ECux̸K 1qB%ރ/y&~qQI՛icCpۯM5k|A˰ Ǟ^V.eg;-nѣXHRyyy}:+e%g眛w y_vfro1,4JYwѥ wqc:__HzQ##3f}ux$Pw)<.yx޽3
+
+LS].??X^1cDDDH ~OTe*
+"{?Iِ&իWܹS4,C޽{?xɓs̡۶mSN 9e37<H.ؽ{wǎI˖-En-
+{g/
+%=X7oqAH2Ϗ?ӟjĈK,_[Pa=*y̙3 ,?ӼK'^C'%=lH7=xb~Z^^rС/r+6_|b6X7oސ:$rD[˿>*񐃶nik=XY~uA///^=H"D e9R^|YskA
+ݢonݢE5j92Օ-ݴn׮W#KfHĔ}7CN3f -N:s̤AJ UTTHVE)P۠A\_{"'N ժU~<+9s=z OΝEj
+?~tsskԨQ\<
+nڸqcҪZ䴰]6
+
+n:Օ{%&fQ2Xxʶ>=L>֭[N߃[}| "N_@ `O ɃB011CMMMMo<+Z޽˿
+we˼h~($XSN{<xpwo,A}޽cǎ˖-#o<m۶:uCCC
+gjUZ-jaaay.(U<(TA乼屸r?tGﰰdBƙa|c56W'V… _|Ŷmٓ!0K8p@x݉#[o!vys3S;!+tA>
+}<=<<b MKpmDJJJKKKE.^SSRR"""
+ cccEZ[[ܹ}v9/RGq=uP.NU\\wBV Aݙ/]81ʕ;WC2z)8;v쨯Wv0EEE`mGpǏOOOGUpۻw2N@FwBV b(Z3]VF|UJdJS
+
+
+"##ykOl$]v믿+'Nxt;/WE% BCCy'd:WqV\Fs3ѯ\y1"<6/П^iJNNNAVViYYٞ={JSS-+WQQSo߾}!W_:`/jw&zQƍdJSf^~?ǃ JN<)rVUU%'&;;t~B bDb$XW`П^ihܾ}{]]͛w{kAo^3--Gh(SiiΝ;EN
+0;}GCWqfQ6%55/,..OiFDD;whMMk2@o޽=uPMbW B<Tw33& !N]Z9׶mWۿ/ KHH?钹.'>B#={VR睐:`uP5%b[eٲ{>_ɀt'VkGpU// q+V\0tçtAAA::aAG@
+͜4.S'Oqrr :1c$''l޼bp`))"a,Е5-"jnؐ<9>9Jr߾"O8iĖ 9֮<vjҤ﹃r:zo!fsEEnAnl]{׬&;8jTΝ-]_zxRĉqW1L+ʽ rw^MM\;vd :Aۍ7W M&_CCsŶ[AAQ21{mȕjN2\A:إ!!WbD2n(froʋ"rc^ޝ=dtv\A:ؽ￟--^`v>o7>&%2::{?c@:tP d4{zƥ'[v;b$XW׶`ζMM:89xF{{;nA`wv9pXlW}}5Qiׯ멃ΝU? 1}z8gcvp]vmUmm-nA`v73N(OtpVkKokk,[r
+^z,:8z@</zHɔ)񮮧ϋ
+k}6FP*Ոqb``^u
+endstream
+endobj
+827 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 600
+/Height 457
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 1521
+/Filter /FlateDecode
+>>
+stream
+xA
+_W|+_
+_W|+_
+W||+_WW||+_WW||+_WW||+_WW|+|+_WW|+|+_WW|+|+_W&|+_+_W|+_+_W|+_+_W|+_+_W|+_
+_W|+_
+_W|+_
+_W򕯰|+_WW||+_WW||+_WW||+_WW||+_WW|+|+_WW|+|+_WW|+l+_W|+_+_W|+_+_W|+_+_W|+_+_W|+_
+_W|+_
+_W|+_
+W|
+_+|W
+|
+_+W+|W
+_WW
+_
+_+|+|WW
+_
+_+|W
+|[Uq|+_WW||+_WW||+_WW||+_WW|+|+_WW|+|+_WW|+|+_WW|++_W|+_+_W|+_+_W|+_+_Wn|+_
+_W|+_
+_W|+_
+_W|+_
+W||+_WW||+_WW||+_WW|[|+_WW|+|+_WW|+|+_WW|+|+_W-|+_+_
+
+endstream
+endobj
+815 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 32
+/Height 32
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 828 0 R
+/Length 962
+/Filter /FlateDecode
+>>
+stream
+xڵoLQ
+HD-]bD-"4RPJJ"XZF;Ny̼i$n>̽g>ᄏ{Kf!{hz&MˌG{,1Q4e;_ggZ|JC
+-BςLvy^jOS»6c5IB tBK&KkV\f\UW B>q M ;wQwhnUYh91rIkFRpze)Q} VGp&}In,~qTJZnz{ksUGH?VADLuODOnqːdc.`y _ ^<TRᷫ}̯ ` Fm ;@*5$ۤqJGd}1/$I]~\s7Te%3x_vI_REkxZ>`0e[˫(0|ŏ}|DZ؏LZJ^[.U@jp 9p%gr
+BiãWAh rZ&R,SY]xH61`aʓةo:KH#UV>6acZk*w0LvY=op uvgq9ߧȘTY5ܬ+h'oYvFQ6~4.8r`gߵ-Ώe(Mj>k\bfo
+>,t_pW9ހC8G%<CW
+ηCh1qA~\>~ 4
+endstream
+endobj
+828 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 32
+/Height 32
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+xK
+f1E]أ7ryf`­4=G{ A5Y:Q}?48__/Oox}^.
+endstream
+endobj
+816 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 314
+/Height 299
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 18813
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 314/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xw|TU{)'$PTŲ+.~kUWW A $d2}?& If k^p̙9f>{s0 "] Nne]  k鮀֭[wĠ.k m#9򾮌Vx{]++X\")b+U/W^^Az'p]1_W^^bK꒫?Gx`?q Ν7j]MMm{<9L(4[͒M7/m6)innH
+#AvV XXN 
+L'M| OaK9ڗa?]4O6mD̒_bݺu4M4C4E {G\2(u d4m孵X:;6^"@UWў={O=e͚5>p  I☃d!T_<9NlG~8D IF1'hXV)$
+--
+
+qux!q]
+}M-.;
+t[yy[{; ef30 $ƃT&*l<A 7ڔz 
+c<@5kPBB͊ T` `?~F
+l8x`
+=bqZs&32R3d_ #ʊ s90,-ʒO&G۴T
+܅;b&X!_ʍyiϟVhDF%QܬŻw(n]&U@i 8J͉%C-={.'aV@)؅ /!k1ckvbA 
+@nl4]Ap'#[ORjc\{UÊó
+yRm嵳s8MU2MS]WziӦ G#1X,F
+pBrQ {-@0lńlTGÖ9 ofJr
+M{1}w
+ʕqa"㸈 p p<8*$kkTo}67hISN+JNrSyn/o]`FuS/7jMg01三u~ѨvzA
+gd2qLQ$
+8c2a%@A$Kv)B˕ pQKљ
+BDx4ϱ.fs9n"I<buս3
+eNt?ێ$&oU}tq7VWOsWF)+hhtN7t!H~#5k=ȕxqOM9{С7ܐtkjZRScV>(͚7V%U:Yn=ZGأ+O~}z妭nAy(^o+RajRǸ'Hܝe
+
+
+cr.)xUey5Jw3W`#'~o_yyi 3/g?Z޺
+o),0CQTU!
+^Θ1ٮ~^^W]]2//`AP䚘mۡxqHTv|KK_X2.7pT, &y().Պv;Q^'ɃWĀ >t:`
+
+kUR,gwO}Ӓ
+Tx?jpUSlĄx`XdJf|N,
+Mhh:Z<N[e#äܘ\?69XYpjK8[A5[$5 tm]U<Y4/Bǧ%Kvo]_UˏGg[_U
+"鿺3m>\~>Y?=~'}_yҨn\rcEhΜEs{pPP{
+vF꯮z6u`fF$Ri YAՎ
+6hFfݻu^]F9Y<
+v2h5/WkIĐAr9jSl`vƍW(sђ֭d;f>~G ~洴cGk5al tAOAD? "NZFNP gcX/CfWir
++$#*)onStS8
+
+
+
+
+
+OWw.+>l{I1F4qb؄ a
+O߽|%Q5^V"##%Ӧd4jL
+Uӗ^z=z Obaj󕕌\0
+
+
+
+d;w
+>l>Q]Μ)_(cq`@1
+Z]=ɽOE9^^:#%ex02 "!`4ӗ9@9_iҐ<pz
+O!׶@hACp~ 0b
+
+a6
+
+ۿ}D2k2l`zPO
+&aEi<os1c4cXY'[ =S4GGK 7hrD \WVgA'4j<aG:A/9?!_wC1 T ̞m /Yyݧn)jwQY"GV4>lݰe8tRRb??\kٰ*?1^U
+#
+hDJ%ۦܭq c
+ۭn9r{hѢ~C@C
+*pF
+Ru F1,=\m%૓'8ō cy#5fWZI=;+LFNI6>TmBȔoN579TuLK B+Pb;dmszL.Ƭ ǯ=\hs]b-#u7fF7[H3#ԗٿ1 v=lɌP7I][&%Jm?ʼf
+
+dGj$.!p
+ǰ08ŠN.}L|j1zXlB~uuˀa
+;ŦTkM :<kUc
+K7=-|͡g[ )R^oulqHjSQTt8ʙ}D肙 lJ<;Rh#+kzdr.:gݺu{-
+ aGj-k6C\i\N!yff.5:N@ z@ 7ͦE;f;DpC +uoюw o 1;Ԥ3F S ,+\z! 42l6/|7>2L?"Ir:}
+
+m +]$x\.C+… l0 }ŋ~=/ 0=c _K<yrBBX,3g΀ȍ7MTTgΜy|T{G.8ph4n۶m@=o?fGA;q[xaɘݹK>_?)TlSRKlm1[#`G׫ ΠKF|rXyT.o'Eb MClAURnW~
+ġO׏5qqq?MHHX|ĉ'O<?<K_v-0*w?؛xQǽ 򨨨uۏ/ix(}=aS֜`^Mع2N*Y=fRCҡ8bߧ!  r@3ࡀ_<M yDxH1?E=48`w v@
+'>5##cݺux\␋xoܸh4l:;111III%=3[nųf͚?~FF`
+R H.dJ$㏊0:2Nx օQb1Yw撓l- P({LqK/ *q\^߽8f͚Ɔ ֬Ysٿ '.a~5}Q_ս~ŋc50lѢE!ܴ4O>8?fwn֮Qq[&
+ﮟ/QAb꿹,53QU2Y\׽X<pT.%z~ZYB$(qU>X䗥v eWH2TάQSgGď޸&4
+endstream
+endobj
+822 0 obj <<
+/D [820 0 R /XYZ 80.963 747.976 null]
+>> endobj
+134 0 obj <<
+/D [820 0 R /XYZ 81.963 667.28 null]
+>> endobj
+138 0 obj <<
+/D [820 0 R /XYZ 81.963 596.012 null]
+>> endobj
+823 0 obj <<
+/D [820 0 R /XYZ 261.29 558.718 null]
+>> endobj
+142 0 obj <<
+/D [820 0 R /XYZ 81.963 322.502 null]
+>> endobj
+824 0 obj <<
+/D [820 0 R /XYZ 81.963 285.208 null]
+>> endobj
+819 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F39 618 0 R /F44 651 0 R /F43 652 0 R >>
+/XObject << /Im27 807 0 R /Im28 814 0 R /Im29 815 0 R /Im30 816 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+839 0 obj <<
+/Length 2150
+/Filter /FlateDecode
+>>
+stream
+xڭXMs۶Wp%
+&$xu+><Sbm=^{Z.GCňd/u/ʸ"[]0≴ 7̇+;8ZNY
+֞XDI-=g 4[5.sNCNZZy)ϕh̩9AnL됱ϵOdtE?9u 菘^ژVqV/07 s*}¹Hڹ Se*;>[I4jR&@3(Un`c4DMKFdM
+5Wϙ0'Zv8
+eKOo;]2>gϒIcS75|x=ŜW;,w9!S4p
+S<=9fw -$a+Ӗ&.[ǞOM_Sjl\lxWߺɯ]-(5+O[-]$;bӭ4xyW<seCn>qmx,ן1: 4L_+f)5BeBY: Nѯox!eGXi6i=1s(%oH%EͿO=;WBhԦ؆VvH 2wяA/?:%]0BTK yy{NX&ّKG+*Y
+endstream
+endobj
+838 0 obj <<
+/Type /Page
+/Contents 839 0 R
+/Resources 837 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 825 0 R
+/Group 688 0 R
+/Annots [ 817 0 R 818 0 R ]
+>> endobj
+829 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 364
+/Height 304
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 26267
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 364/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xwXW]zG DDA4 vcbblQ&ZbD]co5-vcAvm3 ,3g윙{g\ D[smNxsC mfK;h566;( ꅩi3Ϛ
+BԚD96ɭ m[͓A
+CE]I=ܻY2wEQMƒ}H˔ءKqF_uӗR4FSFe,Cf7UP&Xso'+ Lکi6joݺէOMΝ;NZ;zN$z;ݔݩv}  30h
++?]9bb.2@zX5;~MPbݻ"UŴ64ˢ_-6,Wvgax|
+.ݻts60d
+CCBAZنqmB.pZsN9AꝥQxSgI;^. K(0
+h'ó/(''X,c$Iʊ
+)rpHL̳1b0d͛^evfyxauf1,]O6!G;
+5+! Bee2 EeK
+ _𣽁JPP*X%<̐ F
+LQU>%4P 9ArصkW_MUK?otxwk"
+$7ɽ-flE̾ F[Mn^x:+003ÄB0A>^XTD
+8 %8H]ΜI(dH0IeHn=+"Iq
+wSr\k'/Pg[X**qF^P$34QԺ7D
+4[Q`'p=p2YIu+~7z O?t1іIiX
+
+zD 
+9Ah9!?zH`yl@Wf|BJE2 WW[ggk \(䔖u1IJEER3t2iiQ
+b2+
+)$ӆ:i +
+zDG+mz]P1^FL qq<O6$U,{CJ*((B/PbT32˾
+̿A|
+iiA)_&S08ŕ律s>.v(H7K+f;Rb7 ^ ɜ2kgj^qEތ5t76^K)Er<+~CȊ3eƜ
+Ba
+qRȉ
+,lt6Pd߰h;
+eI2IySσ]BBa
+ V\9ϟ5y
+(T: 
+
+ 9\Rh5wsbǣԯf
+s ٲ)#-DPfi7Ɇ Y%ZVAPW@J"B'PA : DN$@ t%( @I@J"B'PA :Љ&)0aĦRo"?LpxHO>S&n3/Q&|AP-yu쿼z?>mڴjgϞӄI΁",666((MASG43M5&BNٳg5pphMDCmA~ᇖvh$2i$zɫa```xW\-mniiٷoϟŠQFY[[>}7nfĈ@m9rvڴiRT>:::88M:vcu:Bks`ȑ*[nC.]OsYoǏ9s㭭{_(Ι3CH&㪦>]YfZ
+
+ \ҥ0\nyyKtA @=?{E ݻwC
+-ɱcǪ֬Ycaay=p߿_.oܸqM1QC㭍C9r$!!A$-[Liii999vR߽{wlllIIիt )
+&9q„Ñuѻݖ}Fܝyߎ-^Bw}BoDeѣGni/M'@ t%;hTTT}lK{T ndd^4D 6W22r6,Ӗv$h5T-B MD~S)ǣMhHR_
+7}dr,-y{v02䷬;NIDPQ Daӟ&d~W/ZGXLV'UdRl/-Юy+U8_8fh$M@$rK!J)D"qUD,!~uHBQQ՛߮
+ĦeTGT
+VbPf
+B*WIIM{ (?{%DU9I
+U{5JJJV.wMUKZ!<*g˃3
+1%kb_CTTT|ǎSם۸qt.30
+R1{.AAA>ܴiS^^^qqӧ޽ۻwJ12… {_W@dP8-b(R06
+zeMtt 7n.\mUV~~~~+V5kȑ#cBԀhyt*<eV
+tx*읥 ÷f 5RRlf,WTH%+T0y2q%&)P07[ݙAX0CGbQ:Tx,\񴙤1CڝAw3HL-v7W"#dNIDT^!,,)0 yR2HRI SVR՗z
+REo"6SP1dА;jjcgR ##eD$R!޾x6<z"U$@$IQEbq+Jqq
+
+255=yH$1c… lz/^BիjuEǎ[v-]{5M7 H6߿5d26yږ/rsqsiDD߶g0^9slu3pvmQP@?D[Ac"ڵ
+{ʔ)
+L 6ƦWmٶR"V*WI UJ/7_yyDDݙ'O<yRjggG<}4==ѣl6
+fUUUFFFg޽gΜQhfffeeeBرcgΜ)++#"44|… N&FmQ(5k֜>}˗Owuu*ύM>_&]~vDqD+cűly^D??888H$k׮1={qM>=00p…t>}_~۶mggϞ <wA#ӧϨQ>_ܷo_JJȑ#wڥ>kW(W_^z[lY|V!
+bR
+x &NXڷnj0'Ov\ С;^99M~RM\;;> F?I$==]sUT@n<xƍ^rqq4i҂ 0 2Vg
+×/Z[_n kP9͚kݴ{5J=z
+";;{ƍ#F066&Irݾ}O>4i
+jd>RTTԵk>`Сr
+
+ tuu ѭ[ www ?77Ąo>w\ZZZ?w>tPII\.;vlII_|ɓtը-
+ .\xϟ<x0''S
+
+
+ (9
+
+
+ rwu}7(%Hkܹs/_֔kAjժYf-\>,,gӦM
+oߞ3gΝ;>'@4aV֭[Νb
+''C,^eDV[ ׯ_۴i?pţG:::jmrkSBWZC J" T*Ge
+DsH-4&@ t%;5񮁒;ݻZ_><ڿ)QiH.
+1L_ ʒufDKR#]nx־}ۻ̄ 'rt BCQpBQ^ܜ5`Ņ E6eVT(CB,5w<v,?i&0?~KΖ ,Y`k#ӣGwvw=مc0kJ6m,*"Y-Tښ#6nxXhV6Ds$aa5돧=̌d^ a؃jcS(??+))OӼ]r N֒gTV>u?z
+?gguٙSfUUʽ{sJJ d^(vTѩA\\eq1!>[;vKӥr[ߡRIEG(
+^p8zA?ݙ'O ?ZXYYfmmmSSS/^|޽ϫ+ֶ/eѫWgk6ݻ`WRJ=ZQܷ/
+z0vtRIů<b$)
+'Lh$tBU2x:/\(ԩX'iC4zaÆu҅f߹sZ$y#ݫTZ
+>@y.o[o &Bl#v-[)7l1 kmm%MII6m
+ ]]] Laد:f1v;ww}ƍ &0L.;|~>fSRR^ݮҵ(
+L&dRݻ7""TPcVPPY^^d
+ٷoʌrss)} ]]]8 ><**_~Ylو#ϟ޽ԩSYYY}ٳgmmmG=ydkkX,imm]lYiiiZZڡC*hB"lٲĉ555'NxɨQ(
+GQ=zdkk[^35eB&
+FݾyȘ1{(ǎ[f)4,}ĈJ#f2nՋD;6
+  6566:::]hpٰ *sfeeEFFΟ?_UUU___TTtСZMn)uP(<w\ee-[Ο?t>dɒ䦦&OOOb#ICCCbb?6y{իW/\PUU-)]SvtC޽Į#eN
+B(T'O<h3)@zzz?b^RSSUTTD5jԲeD ϟ={6p8K,tkdd4tДqƉDR777վ} cbb:::D"я?HKWUU)<eʔ!C;رc\."(11qȐ!g׮]DcuJE)ɓMLLcWF%}ԨQ"PԔŋO:u떦2-*Ro|*W;ni=ڙF@!bBK$R c޺u}+==ҥKgSNݾ};!ńxChɿ=L&S.e2
+jniiYbEGGD"9rȌ3p]3K9 ::[.Ϝ9sӦM}vYtFG4vkjnmڸ1O'zރ74Fy8*_G ttu@ TDD@E@ TDDxKﯪR]
+@."ѡ
+R<{lB0((,QjA "tʊF91iii666[l>|Imfll|Ye2YEEٳRu|rwwӧO@VVV"cɓ'<غun wuujPSS#
+jjjnݺEbԀΝ;wڴi
+)}ːuRz .J\qqqQ *"@0T3r8Qc=<FxI%Op8fffNNN .>arsy
+9-R 0gY,&NrX,rJ@@
+ {zz .TVVzbX{_+W000q=!H/@EDQ
+"$E020r:7z+VXXX奦t {Yx=;x a>|ipp0!R~~~NNND-ʕ+F窱"t$R
+endstream
+endobj
+817 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [401.951 697.455 408.674 711.25]
+/A << /S /GoTo /D (Hfootnote.9) >>
+>> endobj
+818 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [461.423 654.117 468.147 667.913]
+/A << /S /GoTo /D (Hfootnote.10) >>
+>> endobj
+840 0 obj <<
+/D [838 0 R /XYZ 122.806 747.976 null]
+>> endobj
+841 0 obj <<
+/D [838 0 R /XYZ 123.806 619.497 null]
+>> endobj
+146 0 obj <<
+/D [838 0 R /XYZ 123.806 509.472 null]
+>> endobj
+842 0 obj <<
+/D [838 0 R /XYZ 382.834 472.178 null]
+>> endobj
+150 0 obj <<
+/D [838 0 R /XYZ 123.806 380.42 null]
+>> endobj
+154 0 obj <<
+/D [838 0 R /XYZ 123.806 222.477 null]
+>> endobj
+843 0 obj <<
+/D [838 0 R /XYZ 141.734 160.76 null]
+>> endobj
+844 0 obj <<
+/D [838 0 R /XYZ 141.734 148.805 null]
+>> endobj
+837 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F36 596 0 R /F40 648 0 R /F44 651 0 R /F43 652 0 R /F39 618 0 R /F46 674 0 R /F45 668 0 R /F47 733 0 R >>
+/XObject << /Im31 829 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+849 0 obj <<
+/Length 1978
+/Filter /FlateDecode
+>>
+stream
+xڝWK8W(W _$Iv9Le砶嶪p$9]p$PF~ky^'R"KOҙ(5Nxg1ΧIq߷;>mwZ&Z:unQ ZFj1*:ԛsFRGϴ"*F(Q['ITZ:e#sVbIӤҼSFG?p#c"ԅ2༿1؍fȇERЅ9QKo*4ziˌR83 p-{\5n]5dmy52k[Zlg2n|}2C~Z*yUdՋ_=p_ﰆ/4myWU]+VT"a>=aҞӵ9 e|%F[֐s=߾6•RRS„8o3-7
+%-=[c4&>UL a )Vb汿r"S<"0ag]ጥCLJr:;>ou
+1Z0ghAߠ6~K> L.P%)O< %W >SVXb ,ݡ
+p /Z^zE˹<ةjp T=Pws1 מbveBZלC9SpU^Q/R`2>@69|6/A7ŁVW \i+\v`"Y_F`YnY!8,?oauh,28<+_,9t=AaEE2* F;IapI:'IrwiPL#a`L>cȜdA,l6J
+DTb>
+,l-k[IQTnKh̍2ǡ/I*]+-\D|(O>?
+^A\P! "0P97 f(^p
+HBEGG^7"_Tyַ)3 *g?zog)$NfsOYP [XѼy,x<!@shQZ)[ (h4@CU'm)LhPks9
+SDL
+endstream
+endobj
+848 0 obj <<
+/Type /Page
+/Contents 849 0 R
+/Resources 847 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 825 0 R
+/Group 688 0 R
+/Annots [ 836 0 R ]
+>> endobj
+830 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 854 0 R
+/Length 73
+/Filter /FlateDecode
+>>
+stream
+xc`ϟ "I1 ?܉"b텨"bLEVOk!s-z<ůZJ
+endstream
+endobj
+854 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 105
+/Filter /FlateDecode
+>>
+stream
+xڝNA 8]ð%[pߠs}i8~1vO85\3`X &3_C}oQ-?M] BUԅ4 hH
+endstream
+endobj
+831 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 855 0 R
+/Length 104
+/Filter /FlateDecode
+>>
+stream
+xڥK PfTJhJfLD#^H; mc-z҅~vh^y_ײx~._6xs.Չ
+endstream
+endobj
+855 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 108
+/Filter /FlateDecode
+>>
+stream
+x}O 1F$H '1tPjQ&4BI3 Lko7LXDؑh=S=1gﱫy+{CBAǂwL
+endstream
+endobj
+832 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 856 0 R
+/Length 136
+/Filter /FlateDecode
+>>
+stream
+xڭҽ 0]6 V>SIX9.<t`!8K?W4Vc;x4^jflWe?gC9el:3fҕh+M2F <n?>
+endstream
+endobj
+856 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 94
+/Filter /FlateDecode
+>>
+stream
+xc`
+endstream
+endobj
+833 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 857 0 R
+/Length 73
+/Filter /FlateDecode
+>>
+stream
+xc`K "I1x/|
+endstream
+endobj
+857 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 88
+/Filter /FlateDecode
+>>
+stream
+xc` ,?d>BGpðڄa.T?d7dVz1!0#$( _
+endstream
+endobj
+834 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 858 0 R
+/Length 110
+/Filter /FlateDecode
+>>
+stream
+xڭ EQA;0c0 @R<!|rKۓdc-li:eR8K= ϧ ~ >FIwcs?1}cNǯczH}
+endstream
+endobj
+858 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 60
+/Filter /FlateDecode
+>>
+stream
+xc`
+endstream
+endobj
+835 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 859 0 R
+/Length 93
+/Filter /FlateDecode
+>>
+stream
+xڭ
+endstream
+endobj
+859 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 94
+/Filter /FlateDecode
+>>
+stream
+xc`
+endstream
+endobj
+845 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 628
+/Height 165
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 19461
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 628/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xy|EM6wJ[((R*
+(
+
+
+x ⋾E TNR9SA r -
+-4ik%MMIJJSgH&s<<3nA
+B4n Q?K¿HXl.}y(+:'rZ:ox:AF "-؆]r&n5!
+¿HXl.Cs(BR}5˖s:)
+WveI~Y7/Ws,kΫ}'^MjXp/U{"FG.2Ph7ʣH8)ոmokZ]'C?i1QP2
+ B
+#'Жi͎ګ͝NW
+z׀ 
+?$PN~ZҒI1Ɨ.]۝zL"܂@n#88N,*j{|Dڳk5C5j\CuۯqlC_⚶Ѣ
+˧_WO!QIqBiǗMy.ZBr뚓xP0 ~+T;z?rڿyYXKKK.^,(}*%Юr
+1]z^ǺeJss|kp"5vd[MQ4Uznh < TB
+T9!eo[Sv1e~Wͱ^)Mj}
+
+e 25棁'~O*ϦI-t(7HXl5d<?8Jl,r׋bN'h6"!
+ F٩YD
+.\uG~5<ധc>)A QCNo5Ey vx3e={~H*QN$XDKR Kmk1Z!1ƕ
+(=;
+Qvt[z`i "Uc۪ǒbY_[j#hF$!ꅷ?}O{coNJkޭz_nB3:ӑ_Vqyڹm9.)u*\.:'N<T2۱lKEY+޵}Kl4JЩĿ8vV߱thUv)5"P:ټz)❮'~Y13eVh{i_'ݔ iIy]4"8{+F]HBg0)*LFO3%N=mw3\wd;x 򹣿ZgLL
+٭y~%gzF 2/R~>DQdukDG$,p
+@M eZ,p"1
+ ޮA€TU(y J)
+V~D9Q«LO/x*-I aJ¸LdJyFCI
+<“R yGvV tCx;k閮 f;w®㜩Aͽ xoꡊNobҳFGfx
+\WIᕡk|QG !H]`\XM\t |!Jũ^b;[%%U4pۀ
+9R:qF
+9O</sĸRQ[j3K"R&j˼ȉ($ufTT1\3 <޺1]
+U^
+ܯ_6!3j.%fs%!J B!Ε@ 0C+@ a8W@  q@ :\-u
+&ٳ%sj7<XRo/zÆzӧ+VՉy!Ԓn٘j}Tl-ʩ`b*Z$+WQ)y^:ߞn_r*"y!DhWA48ՠ@4]S$D'-|~+UD*q~jm @Q}rwͫT8/_D"jE[[@sy$F6w(h)St|<,ZQ"@zļG}ϛ7ggz5Oז r^(bEQ?U#F:EX*E!伈gj[@ˣVi?EqQXbO=ի V VX[TaI-U1V]n.%$M/(5tU!7fXBݬYM7E/Z+w
+
+ Nƍsk4pmBvž=uh^ȔR
+}8AQ<2 t$vPbbRGm$T oy"P
+[MH4]Y
+-c0#Gc䀪VE
+[xs+Bm:ϚyɄ32vzܭWZQ,êxP-6ڇz'Ed֢ r^Ta2/=cXZRQA΋ȡs]D3~/yn f'Cr
+>cc_;{OK饗=zۀ-"@h =4*u-1Wݴiαc M$'K 89}g MDEiӜ|-4^݇h >lQ'E2$?<bKD*1ոVTg"B@9b N B_o/ί3@ s%!ԁ{ss)[kZ?_kZKs#mAW?T[{DZFEuj0>*?|_eD<7$C7֗HCרȀl fBsR#B]j"_hR#B]j"_h:Cաq@sT/\]MD m[8\!"*@ T/\]MDR#B]:Յ1_u}>!նYbW_u˟g%B(E7TWڮ3_Ź0^u%x@ WH|9װTL@gPpu5/mᰄTL@Ppu5/4zb٘WOَ AFU|⤕+}=rm
+
+>U?
+p#Gd8Crr3~J s/I @R4ijLy66?\֫@wvOww4C5C.;ysǎAW'] >o#1+@ T MCMӉjp8`R&'ÁKy6vLpNxUjI5õOMõIEwCqUII{rs} v*D@ۍ 3?
+
+LUfD"",R0q@ Z-Ջ5K;}c<Ʉ32K)d::a+Wk,k\õ7]!.JPa+ULXE41 I@ 1msXC&1҂:`Eז ɳv<[5g!4(\A0z4;z7=@ ('\YL@1'O<K B#/u<kV"ȶ",čV]ՍEd:sŶܯ_!N2jI9ۋɶ0@ a8W@  q@ \ @3Ĺfs].S1c sL»3j@75fd,aԮ@YYtQ 1GZ_yVu7 E[2P-hBj
+埆؇$Vsgf'QI*={W36íZd& P+(ڢ
+E @R4ijLCeU/[$Hrb Eնy-ec-T-fgǣx
+G=7pX
+<ynbf 9s+V?\;M6.((Νۼy󔔔oV,믿 8bL0ڢ]{:N!DEEEGGƎ;$77>
+SvVM5+̞=Ӎ5z饗
+vZ:N_]3<)vf
+bKU.s.Ks soU
+
+:uJuݦkjujj$(Bjjҥ.]OwUǺ1cl{ϵ*,gժUx뭷zpǏ駞k֬ޖ߲e q3glaZ!wfeeeٳG8ge0Z ,y
+"ԱEݻ[t
+endstream
+endobj
+846 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 253
+/Height 252
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 860 0 R
+/Length 16395
+/Filter /FlateDecode
+>>
+stream
+x\#Z+h%Bأ-A슈=bƎ{CXQDޤtX{wy>vggg3s}EvUOrNBl;g%kEjb PEj7kP6ŭ7ŵ QaZ!k3^y_`es̍š#"y"O<y&Ϟ=yUd@^Z V9 -,o#ʑwD9(G>@%䣄|)yD JDTB"B+!o
+KA~Q#E
+Tp)))#y 8)0MEmO>ULq )pj4]^e`/jNy$_ 7oD+_p<O>zHeɇE3/¾E؋1Vy^ŘǕ<9d^OdbMMϼ srM g^'YYYIIIᱱ 11H'''LCPΣ訨x#YsHKKKLL|a*e< yɗ xIE)ds2xF٧
+oKJZ?= ͐DfG$C}=(/<, E}iT'""DFDs ̾})b G}_o#yyM=L:  qR)Sأ>At2YI9Y"䞐ҙV' 7H2 WJ=Cw
+
+QE  / QHhH\4?+o`ڥ_̿b_` 'K~=z*<|%yGޅǑ^^RSadᣜ={[>>՗/$킛|??R7C
+ǧ4bP5yz]zSnM`7wd{;fmzk7oުc~{w0tϑ ѧ/KCWQ{7}q/ 0pֶV<4(
+9cl0:s,?n,)<v^W90:5yy#o}nf5AmsZa$ylH#ž8{y5>GAÊOvC;BTT ]i?#[yy>U6G &&91gz,]
+a?)<߾;2>3WK+`ql码aHDG1ɓ<ggSe/j}spY0%s[ig~~劉f[>k=,-o]{ڃXIqvviiiRaz8?s]{B>=J$-޽{$dx'''+>k~O]}i?\a A/Cy^iß:nIkXqGVChU0
+0{wO=#ߧ>2] k`,tov'm>3hYHӒ~>)%bgަ{̢<Ӏ]b<f0)K/
+3/|Fg&))vwpv6>m
+IL$Rc
+ ;u/R{G>E3{ƛ7OvAs(CDXQ;z40 #C`$b<qT pr␎:,#>>%xɱݹmy˹?i̱LΟcӧ۽kOXh(
+_Ipܱ
+
+pw[66,m'7I!"QnUMk١p
+v㐅Bnߺ 461_4ާ} Mv}mipZ4#:7kҪE_Z}sHS mεN~Y`36?/ŦϿ`+*3"v4-g;v-)!Wm6ú(1̈́׭mf 0 x;Qle"#ޓ*ሄx.R/ ?:*>/wh sqڵ!!An| 0(6,,ҥKR ?K"%Ȉ˗/W7wWwwDQ[|?/oE}^>o>O߿}}~8]>y;}<C[^3-) <%&鏢4߿y-m6OE:e<<0va2LK
+ :+U>Ff=|aefsgdʪOA]N=b׮У'Yb
+r8޼ycӦMwn
+~Lr/Zz0 41a}ܲiJ=x`=_
+LJJvp?uCq'99 OB_ E"ؖoPUK
+y){=]`rg\`Bܗ\*𙓓"#1<.]Jȭˢ)9:YG:",*D9t>UT %W|?]#&o"@"wQN;y;j~7W?&&>!>#I3VY"ﰧ>@+$8H#RmYKϯgkD}͙:s'ZA=B
+W.vim!+p۟=ϑ (~ch#?KUd/ׯebKگWx»
+&',
+TSRvIVl ޚbOc.Ca+ ށJ?اBbsn޽Ef{]4Xz=9T(?o߾䰿~:N={6҇3?cYno+UTvܺu̙375J'wڵѣGe<tPT>44bePڰg
+
+Hr=OUT2e
+466nР[ɔl%-
+ѫ\رag^~}<իy3
+k3o޼͛7/YDڵÓb/Y$H7.88N:ҪU~<wx_rE^$wƌH={$lذ+d Mk.rG;t}mۄ-[o-Jq۷w6mBSZ0)mأ`J-Z@֭[qׯGy3
+ #
+Xfc4Gs߾}H RT_$?oA7:u)-H`a 'DxxS|riqJCC§RUUk\qϞ=qI+ 6}āpLJõ$گYFϘ"ѣGe|~A3AXrUViѢEZ N#9Fp'EHۓ./b/ Cy>%5qZc=e(bDXt)!7`O: j [DŽq3Ǫ@
+̝V(f2$66V1'Q8p!@&L=z…Z%`6=gB{6laBK^,e/?~Z=;03fcJr[XX`H؃}}}v%'
+{J =o+ǎcgTJ{ɓbm= X`_B"Qk&ܚb_pyB+()-Ş
+Şg*TʔRR*gbO\c@NB/{$=~UttZZ +ra߼ys&MLkk-Zu]vu?w%oIIIRJ۶m]\\Hup:*9d~2yH}}:u=NLh7nV}m[7}ʆFԩ`߰a =rY^d͚5y1VZiii
+oO>ծ][GGgƍ-DD\eFFFի_ׯ9D$
+)te
+};wE@lJC"miiI^ėk3Q
+2w/ -?ŋw^#"5Da'/_s5y%ɯ!ݻ'W;4mtذaQQQ+V͇^fVscǎEAz>aYH)tʔ ={ln2 ѰaCPž@.'NxzSӽ7[] gus{%/իW)Сr\ɓ'_^^^5j 9Wxd''zyyĺIb?R
++G-p(Vssβ+Ϋ3WÙ?uI\؏3Uy.
+)jժm]]]8p444RSSI6Z
+>͆ x!~(S 2e
+[nq2pVkkZ{eVf#๓Ǐ8رcH]`ޮ]#d[{!G
+?]2bOٳyM2ÇC 2v4%Kvo
+dq>^r%27/NԕM۷Oxm?ikV]KB"H+Pfde:;;ڔqžT:~\MMڵ+9\!GGGG4hٲef͂SfMdcN7o<LH{)W#`UO$(}($$D2ᘹsbL[.1;|rHDO^&H
+?]x"yddd$9z4Hv.^(o{
+ŞbObOROyMR'SP)T*P'ӫVG9~7*US֯}YYɋͷJ2WfD; b߭[e#CzyNв%W5kf˅ͷJ2WfD)bu'V_3!/6 21\oe
+ҷ,S% fOY{MMDuA81rp|/SxmfITb/0{bg΄u|fO1[&Á@|/SxmfITb/گO,,˵Vk/LU%Q
+d 3=!sI~…7|/SxmfITcO {Z45֮]
+|J2WfD)4o|nD+YӠOl-u{!e
+ҷ,W<쓠--r=C==Ş
+ŞbObOBW!Q Kn<&z`VjM9#73ש믿yX
+,WG<5+O>9) *cdș4xp/o&/b :t
+ӈ4qŞRjǧ S)Vi'A)Tʱ'_LS8֞bOZ{=jo<&:q^[y:tgNV._,W; ,c P6]!K"6dKccce*^r1oC5UTTrپ}kךתUzO>MNNW )W;HYZMWx⒈,򐴴4{ycʻiTfG_m >(! mFPk n_a"6]!K"6ʓƏvb%lbȹBx g6 ~S̷##+7o[*b~eA$b# <mllU(F~ѣGʴ'_{ލ>mknֺb/^fJ,ѣ1^*b~eA$b# ˗/oߎ$WKB6'(=cjqgF)bqFeڳo|470bSmE,.+1UUUtK.E 'O,F.n<u 6.o3m)s8 X>qM^*o#H +t$b# CmFd#Wy77C>o ~7?Ciܸakii{NFX2 t,.+ϊp#W(%73@r@[
+b((D(҂KA-d%YxyW q1PJƞ}\l bOcO HBSSP)T!P6cOUT[wn}ӈ4WĞ\^%7y|lv+mM-M\OF<.ػ'DCxv{륭4k*oWF<؃ xLM^4!#hctbϞ=s)Z8=x4iLޘWUgnF<.>4$Xk/>#ߛ}oF<.;NNTލHYՌ3yxL#V''Ӆ"xLLr1L7_uQLF<>*4䋵w1wxkU@`nغ=xL#AxpPӷT4`/NŞJ)-ŞJZH(ŞJƞGŞ
+ŞbOBa U`[{ZТje&Z佭k׮ zjځ7>p4iR`nV2%OW>tYĞ@./>ը]N9tۅio<H!ymllj^OOf&a%+XtJWE<j{X+QWAɍQv /_^%IXJF<qa=":YF52PJu,cڳRRRh IW֡C'''ig&a%)Xʄ.G@x 'M6Mt2 TS]%}@3f1Qh%IW*1\.y7__=a֊DrNlH> ?^xkCױ¯^"+=3Llf$e)񸤱?r KtpIc/+ZcI"#n<(^m~1^2>pttA-[6k,x85kքJJf*XɈNh ÞwQף;FwhجVɻXI%w֭[jp^z(rx7 +XɈǼWNJaOR)_'EEC)T5 {*{{*T(TW##¡{*{=}bO\c@NBSSRαwKR쩔c {*{=}(bO\c@NBSSRrK
+ R쩔c {*(ŞJƞ{"Ş
+ŞbObO
+r}XhbO,bTF /}0bO,b/P {*{='bOMi)T({*А (ŞJ;>bO FR=/{*ɑdbO"bST)-Ş
+؇A)T1rBB)T"w`)TUOU0Wq
+ III$
+x鯃qʜXDQFp_1/5w*ؓ!$!SF$}]W.M݄bO/־ۇbO/~׮]φ /;99ݻHEׯniР͛bKm9߿/GOˢߵkYa5k-[W,ZZZ7OHH@e˖+WԜ0aSdOډwѧO޽;o߾$%
+,\0>>[jاk&&&ĘdeeoܸӧO^__hddFF!_&7kl^8;;Ekk'ߺ~իWE͙3GIkVpBHHH``Ç ;Zѣ~~~o_6m,!( XbffSP%bϝ;5iѢʕ+>:p600&;::K.{2
+W^E7c<k̩S*io޼ٱcG t]uuuWWW՝?Sb{41X9(=: X<6̙30b؟={VWWWMM Xf *zv9h=zȋ}FF9rիWSSSO=Zjk׮! ˃?aA%GЩ'L6@^zU;lbnnj*eg0~ѣ,0hsg<tiȋ=Dico޼9 P
+m`_zuSǭmܸqp caVZZpEp\.''H'= 6°Hc'cP(CWZti>3fΜ2uʄ G=`PakvY&"%,o&v5&YN=2|{C0SǏgG!5 fH쁙d_<b ¯EFFb>|8d^|46  ϟ 9+9cڗE'u ,
+VGjժk׮zbsocqGL <VZҷ}ff&x@zΝɷ'2{oq#G*MDҷYǤR)
+4Aθn:=hLP9N )aOةj{'^Y1P {t4_ aaa0b^oOVrpwkiiխ[](,`5}tƁC/s;v SHPgݴiSbѣGc'Y'p'6zĊ+c9w]GG3\ŋ8i:9`69Xx33Ν;#!znWT{f
+(
+NXل䔖+Wru{6mڐn_FӧM1?vĈCߧO_LCXUQQ,oرOQ{ac` 3N_ޣG<MѾ}#G4j7հaC0OsJ%;.%>gϞhC YI[ZavӦO<a?`
++j-H䑼ؓFѕ*
+{ɩI_~~mKcMLTGTc1WŜ}ݺu ѶRBbO
+2K/TV,7DS){=ŞbOϟPQ\\L gR)2~f5RSSԩի_.^ Yn;!スWneʚ 4 }+WVQn:yRFcqKWoR}ޫN/&a?qTiӖCLnܸŎ׾ru>H_zX9H׮[O~IУCy&$޼IW n {kx...ի4nX~;T$Ξ}СC gǎ=t髮^uܸ9$ݻm Sʪc9}
+-&(DSS \؟<gEtyk'F:#Oz$?s)cїdѯOԫ5
+8knFwX}d?סG5u5V.o#WDL݆u'̟S,̤>}t&Z*U44093WmXqޝ~UwprA=;vۥKUu9!–-b[gۇgϢi7ȟnaW\f>ufsvkѯOF+ q\uet.r md>} p XqS^ȼr%Jڑ{t3W^milݺ=8`/{'NjVV@}d^EEeܜqm"&j߬ T6ܪWQ-Wo0v{kiB`ZZaZ*f֪SK { Dfn
+1v:Wo2I칙29r$2_3M_V&gjMK pnlۙ1c#Dxv$nItzSӽ"בwV%]7f 5L.#:ܚvOpZĬ=a(D΢q]s 2aŰ瞾:67k:1( ?_gy3\9csb (ps3#!xCfڋ]boEw[146l
+fIZu0E;w칁T2W^ڑ؛"[GOb_H4/gTUbV۬u3ǏbV[S&[.ljLtNOx ?x,q-kin١%|akToޖyV̙\0-!;~<8[v D+9ҰsiĻ~TV-Lf7͝ ?jbOfML 0cmMg<v^[n{R_$/\ {ɓթS3<sƷkן1wڶޡCK;R{&ORj׮{[۔v֫W<ċC4a`Whd\q0B~[aVr>rKXn0 mڲ)<ļt0)3x`\G"
+߆N]:udMRK9>ޞށA!{%ayž4cwr|L"lEr s;]Cؗ{a >s0+ fGR-Jh'ɑdAlI+}KA;|QkӮRړ.ˎן`T÷2NdKj9Sc '.D?
+endstream
+endobj
+860 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 253
+/Height 252
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 418
+/Filter /FlateDecode
+>>
+stream
+x
+]JWҕЕt+]
+]JWҕЕt+]
+]JWҕtt+]JWJWҕtt+]JWJWҕtt+]JWJWҕtt+]JWJWҕt+t+]JWBWҕt+t+]JWBWҕt+t+]JWBWҕt+]+]JWҕt+]+]JWOuN
+endstream
+endobj
+836 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [383.885 575.412 391.729 587.963]
+/A << /S /GoTo /D (chapter.7) >>
+>> endobj
+850 0 obj <<
+/D [848 0 R /XYZ 80.963 747.976 null]
+>> endobj
+851 0 obj <<
+/D [848 0 R /XYZ 81.963 719.953 null]
+>> endobj
+158 0 obj <<
+/D [848 0 R /XYZ 81.963 558.397 null]
+>> endobj
+162 0 obj <<
+/D [848 0 R /XYZ 81.963 526.967 null]
+>> endobj
+166 0 obj <<
+/D [848 0 R /XYZ 81.963 412.361 null]
+>> endobj
+852 0 obj <<
+/D [848 0 R /XYZ 81.963 372.743 null]
+>> endobj
+170 0 obj <<
+/D [848 0 R /XYZ 81.963 252.094 null]
+>> endobj
+853 0 obj <<
+/D [848 0 R /XYZ 380.842 214.8 null]
+>> endobj
+847 0 obj <<
+/Font << /F25 474 0 R /F36 596 0 R /F44 651 0 R /F43 652 0 R /F16 475 0 R /F38 617 0 R /F39 618 0 R >>
+/XObject << /Im32 830 0 R /Im33 831 0 R /Im34 832 0 R /Im35 833 0 R /Im36 834 0 R /Im37 835 0 R /Im38 845 0 R /Im39 846 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+866 0 obj <<
+/Length 1397
+/Filter /FlateDecode
+>>
+stream
+xڅVKs6WR37ve:v+$$)B!ʹr'-an1y><),BodT^ (o~Ng*VʿxyqVI`:Ksfڿ}{ÒTIb~=?|O,>Mn O o'~
+6QXNU}
+urb'wb>f¸H_۲ "L`6yQomS.(wA"LgN RV%_>">$ZC
+] fBxx C0x@lk<
+"L$PT&Hߕ@ȡ$?F41SB7PJPB0ԱzǑzdY__9~
+endstream
+endobj
+865 0 obj <<
+/Type /Page
+/Contents 866 0 R
+/Resources 864 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 825 0 R
+/Group 688 0 R
+>> endobj
+861 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 528
+/Height 381
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 40560
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 528/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xw\ǟ۫^&EŮQQM,_kϘkclDQi厃vow'D;_<73yvfvgI
+R^Zڞy@19#_OssH{R-YճV#7M4w6}c!U߫G*0g WM)ɭ][EyMSGQ.-!>r$VZi`fÜon[ہC5`<oː |Ee<W
+%L~(J"JD{_Yf*!EFbC
+!|27!B.mdbjܦ
+9(%48wW[wwb듢 DNa
+[J3@
+#I9bK).:6iij(x[5l%1H?=w܉ݦv:{aB(o,)ʤ)/Sh@hhF99bHd"51J0%R
+qL,J,8OCcT*!׏)
+R!%* ITArcA8(
+14D8\^{f}5xMs9dYh0(@>L9sOV\d4jf6^J
+p A+Y!lpr~r
+-|V}2@0E\EA#߮)D,'%>5AՏ]Q?.oqT)岢lߕ֬ |:ڳƴX#hL-^.բBX*S=1|ѳäJ)I]>ߕҼ_(LȘB;@TМGPԽ
+8LA|N?~(i4M4is5WhS1 H8MZu
+'Il6f+nI.-2JZb|,;)?߈U=ʅƶ>pRF
+8¬ڢtv!UM=V ,oj76Ƭ
+
+b+ <r7.1)Ĺ"n,yUl$%xcq7
+$  EO
+
+70*:"]:0J˫yP5BBy$qw!
+|
+b y4@J`FA*! 1Fe* @%h$K^
+VeIyid}
+Q
+#9 PqZrS3pB4()LFq=cnJG"@PPDA@F`9 92OE JZHAB/J}{bS h,Ka(hiZ+' ~^!P{UMه4 en?:c٤7|D(QאTyYjfVظ]RhCL@qHqkaYG
+jPvv5T3r͐[4dB1!Դ0e@F}37de><P×u %$Ƹ2DRF
+/W>f5
+^ye^^&
+Uլ-
+5h~jctQt
+)Յ HeFJ{1륲+^1_~
+Ջ5C#E*>U)H.NaQbԀu Ua TWc\,uPՈ_=t =EbԄu U(7+ޙ˫C8J :R? gрԺf\hZ.2 &0|%)|| Hix0cܺ!,)|| HmkZinjm=[in9C gʤ7>eaaaa a0XXXXXu,,,,,zN*^'е
+PH̕L͌oNJP7))ĉ޽-[w1wI&5nܸwމL7ovmԨQ=Wf6mܸqC0lڵ\.Ww^233%ԩSΝ. Q<vUTD"ȑ#8p+3_611qtt IM}q̙3m۶usso}ݻwlյ_~/^`;vhѢEf[g۷bx֬Y&&&-bz!!!o߾eo߾ʪK.ϟ?Kj
+
+
+
+lmm$hoo
+JRx;,xcߏmƍ*իW7宮C|֒dtR߾}+
+K.r###q…1c4o
+
+
+ԅӠA7 8n``0cƌ3f85eʔSN\xeB֭[Bslmm͌fgg{{{3FɎ/_ZXXT7,p;emNG5k AxT@t_V! tS"EҒbI+q ' g"$\(1KpI'5|Dq;w|֭4MGeòEeffZYY 8۷o߾yÇ 5gϞ2e
+sr{O 3QOtAAΝ;8Nw2뗐
+ ᦦ
+BI\T:65:^HHHHHHU}FݧOPXyZ_cE|~EF|_8ԴO+-C/O˗.ѵǀdRP–/=ew!6DԷ
+*0k[,_.vZd®"¢`aaaa a0XXXXXu,,,,,z: X>@7*y{Μ9UPYo!tIMK}
+F6m6n8z> E"
+8W=>rallRÇJ%
+
+z捞`at
+DXX؉':t]v]k=QT oРÇ;VhCϸ; HqF3i$o6##
+A̝;QFF>
+Y4h|K={vϞ=+Vٳ]TT3c2A9XX>=?XzymРA0LmE:uiӦeaaa$Iٳgԩ<_
+|b*wRȑ#&L(:88
+ urrիСC1kRVX,6m s^m6lioo?l0.+??Z̸q㼽OU 3f0LVXXwaꥌ'NX&>|V2Zl...UߺKkJR[[uֶNNN8whkkۨQǫ/ŋ5/QF5hqԨQ(޴JXk
+WߟHBNƑ܁\:Cc1óPEz-&N>p8 ɱ;uN1cRSS+/
+}|KxykzjRƍCBBLMMu~F2˗/ׯKxyyyE>}Ϗ$ɧOWo֬1k4h6}􂂂
+APPavA`jTdO`*,ps N{7<1&~Et
+˗`@M*\2|
+;FL*dSd)2u@͖N̯}h۶3337l0mڴp~J5ydkk˗3%IrѢEO.?±k׮ɓ';99a6vX؏V0i[7ҥZimFjj{o>gΜnݺo^>ePB\}۷5kΜ9N:{٦邂++2љzUGR,((ce0P7f{抾-MLňjx}׋2hڵkf$IN:5//LTQ~]]][*_gΜ
+"Y}"營8_fC_D*(u=R1}t=<<_5AAAŋ33 5_M,\.WT[
+wg ۔&@Eر}
+Y|/
+aT.E!]X`z^j ݻw7n455С
+O
+`@_
+P m;C
++CJAy \\P
+0
+'o
+
+
+N<Y<]orssA
+X
+[ff&7nQOnݺlٲN+TJǎq3f8;;o۶MEkT45aT8y@K >~9Id2^*۫hii9lZPP$ϼyԒJJJŒtz^^;ׯ_5777oϛ7OCCvȐ!ǎ㹉Yv
+jj%f'>qo rE~m36<gΜ~8ݤA>$]M
+
+:6~u^ *A޽{g͚5e
+4`cO)D
+
+KYL#t
+ʭLӻf,S`;,UQQwukkkYYk&ml6{Μ9;fF"֯_.PȈH2?4j{UZ̷0_^WW7uTDk|| ~G{{iӦEFF <; A-uʒ{%
+ZfX8E[:
+
+WX;nLjv
+Ba@0 њ >|xʔ)֭ؗ[]\\?~lkk+
+;]G$)jkk[ZZtuuonggL& vltst:]thjjڵkWppYuuҴiCǏ
+09Jv%@DaTm
+<p
+
+jj6E6;w(9p&0?}.< /۶m322RSS0a‡Dhjjjhh@}}=ϙ7ɓ''Naaań/ᝉ o*,VUo
+UUǎm˓gw())-Y޼y3b%%W޽{ǧ
+A*Vs簧.ka`O~Vx&VMPQDqrr?>>|(
+eܹP5iΞ|%7oaJJDCCb 7nwttĎJt&?v옱ԩS:Ԅ:w\EEE {eeev $2\*ZvjD}Gev2IڿSԴP(7755ꖗ k700߿޽{L?tAssѣG {Spuu=~[|}}[ 9sj oa1
+
+7D
+Pf…+V3fmtt4͞4i߼yɓXK~ !={c
+0㭭
+PBAd  XЏA 0{F! Q=~{}0KD m`vdrtAd2NǞԐd2ldd4rȘvxbƌfffT*F=
+=I D ZÇO2
+Pb2fjhh8w",SGbFLĖD%sCb>}FYYN ks $IWWW*E3f̰(Oږzoᔖr
+}}Vvl!-@.33FQ(;;;RԣGҶ2SSS
+\$߹tttx?ya/-\P__ӦM2([]vϞ=ŽdȫNaT,h9sS_/By#11``w| Ree%JUTT400xDuDFF޾}[[[[D6f%J@bk"06ρH 6 4GBKKD"UTT,ZhѢEBk'xb08,H6?~tss:0UV]x דW"(hoŗJ%wMb(EEEeddddddff^r[ZZ=z4
+7|t/)AD,h@AĂ AD,h@AĂ AD,h@A"0*?-G[#]LA"&   X$0ߪ ڄI)iXӜg'/﹧Do "<>sy _9 ]2/^<rtjDnO=ӧ=z̛-\}}
+
+
+?[ݧ`kSS˗ aTWUkkiqxM}!"bYuMO{H$QLZCG2oTQQ%wKJ<Ď|Z[[UUU ?˖<rhEELhkkVW
+ }$C/%<-|gH~Y-QY
+e H-A @AĂ AD,h@AĂ AD,h@AĂ AD,h@AĂ AD,h@AĂ AD,h@AĂ AD,R9'OΒ޻wDw5]twޒźFvw0f<o3yOf<ѺKݥ.׉
+ r.NNN?|PUUvځVVVkiW~ꕻ{DDȑ#SSST˱nSL1005jTvv6x9kkkCC25zFm޼W^VVVׯ_/
+snܸ1tPCCC??>X?Ò%KxVٳg/^<c ѣGY*%O0aaXcǎr
+9 ѣݻw?Ǐܑŗ h"߿{fNe&)bB:KrY.Du޽^lYLLʖ/|i FSS7o677+((8qBb}'M
+ 355MMM=p
+ ]*.uvA(Z4~aP7͎ӳܶm~k<6o>'''
+ү_p<LDu߾}y
+
+:ptts-c,//'{[^`? 4Zty{BpN:%ՠlDP-[N:w {iժUشiӳgbcc=<<y/^,bff&Dž/^2e3z,Q_픱 hWe#"tL?_N=z4B5jTTT;qD\\͡CLLLDyK8,ȥs+hiiikkS(E/H8$Hg^z5O/K(ްa!w_-l|i+++*ԄϤ[AwbPvKKKDD͛F{]dz߾} [\]]@ZZژ1cEΝyԲù|U=:^8$sʕt:;^Ieggg755<yKI:oc7''gÆ O+--guw 섄gϞ=y$##СC^=pBVVRwǏǏ<
+1III}Do$<uzfW3Z
+
+ݴi򖕕'h1)R?T 3|𜜜W^-[zz:}
+
+
+f)NNF5XFpg_w+,6a'0b@;MMM=z3By_\Abc[bcyE^s!F//////Ơ vzGܗEb
+;++ /ݻs>})SLMM7n/J~ɓ';88_/_vJ:IKK ӧO4hЦM\]]|Y=<<LMMn݊ _W ez#oooy} =IZooEq_a
+ 2Roa$MNNׯ_^.\jժ3g 8ETTTppǏGn|̘1k֬E@b{ӗUVז=h] ̊g^zZ-|I0[I$2_~: &*++ ;A/tĂ?2
+'Wtۛʻ
+ҧOK.w[ 7"%hl@ILoAD,vuټbAD%'#BiMu򀁾 AV "4`  be3gK.^a h0f<o3yOf< DD;&&A!ɓmL
+kOK晤ݔ7nhii \qR?SA)?o3TTTjkk񧕕'۷YYYϞ= L$
+
+:Eh
+
+
+
+
+
+
+7[D
+endstream
+endobj
+862 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 603
+/Height 489
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 870 0 R
+/Length 52170
+/Filter /FlateDecode
+>>
+stream
+x} xU=  *Ȣ"#DE-( 2B ,8@B6U!BK ^v:N'OBQz*w?RNݪ W#F1bMkpa:bĈ#Fi&Rj8|1bĈkZEQ"qBbĈ#FiLA:?¿YǣK1bn۸LA2/k-uÑ_w.%F1bw7u\ %[`%mKߗ+y#{õ}I]K1bĸü_3̮t  U^_bĈ#V-e:_U䘄j_ b_bĈ#V3?ySi{cf|
+O>&N&֪e u5GVmKϽrS_Q:eg:U_.Ϥi.]y30+)O*:J-ʮ?\qNLxNmUo7#oz-R[-35qd2]bJMW#Fchn󰿸iE;h#;:_}jڨk?Ŵ;iC/c_gu8lbKM:cΩKv@/MgRs>ݝhwcvQhWVJuS>:pwo/]/;qe52wn+:#U(4ciruu&Vs<!=~WԺj]pHaGQmr%'4sٟF (?eϾj,/.^}nkgYWG3:Sc)sC oψ7*kkʕǘNw_Ҷt\<=ř'8ʫ^1b^sa.̴[ ]imuq5+c=jCjڨ,Q¾zi.
+˾N=5P^*9KS]v_#v^g~fAi#SD<2}L؍_3>YT'E|uBjǾJ2Ѯa !JyEB #GsOyΪUkv&wWe-ZU&\#uUJYqAml&`Gvj˯_\ZեƴVy ivd6VR4G "vf,_ _%G͋L]XXwalژpW8gĹVW)WgV{=RҢg?LV!sJKf3 ,쾽Fۘ*]Wl7|\UoE1Kס Cr J`/mpXMu% %;˹/ A#/N!=HO]=4$gXq-ψzỮw@ڹUՎ}?p"4oELR8 <zol)uRyx܉΍ϘK!Yrۏʮ_y%%:eؾk>Ah Ru~mU豼ɮTJslVR4y4Ou]7!7#ciTƄȼن"Q3_i?yI)aW<(Qns~Rh6ŨZo 93"jO5$2rLNNzm|B.m {bg#FL
+NAQ ߕ;",gtmK!q}FrYcjL6Arܝ>9,g-,&ݢҴ5ohFաy~qL|Pqr3$e WH~6ttW)#ʿ$ޛvC,2*ݽ:uTYWF1`e}g?
+6<kWfϨe_9֥b]ONPU
+.?Z{fI`/:_O1wCKGfu1,5·h!RS;a1岯7ƽ/^.N,fFoқ+6Ew%𜷣2?}qѡb|"%*MiD^{q*j4V>
+^s`ɢWM7I>>_c>2)#0'0_xEcnwhI@/w}=L{'IWv i?`2/cɾm  .\c,m{WU)y_-̫w8;\Z132u(BȤ*Q!z= |3^
+|_v`8x\ОD"O:gp:vݨF_X4_X9ӎє qRkgVdDW-]Wb,^;e
+js3'S5feԕүsL*tsFkm6vl_|ʥuq? <Y:kxhhޒm2K8=3#rވ'U!SY͂7b
+^T ]𶯜C1>!"S0/`xĭ#b+c{G5ζ谄iE/ƽ/֔YsK2Ѱ OWVkKw%應:b͹oϭ8=*G'r]#{&*%ޡ2{G.6 =3J*'9evxJ5G҂8kwޗW5*UThs8gdW׵U&`L8z=b2'(jAݐ}eL4F0Vk/ܓ:6cjT]Ҡ")Qm9maThiD6[ ٬cϬsJd̫=iLe]~\A1LڠPW,NԼgkuR#Ygcd(Mo\9W8 #FWsߥ
+8apw:=(1oz/m/n<1WCطĦK0&gLx$lwqGgϋ4.mY/.ŝ<6ã$#vΌ,.븴%.}59&cYsGfcd [1RV9$1
+D*EyǪܷo_j3FHHf%xps_w.D-ϟߢE (,,&ٌXF8ŋa0֬Y3~xQm͓'O(%vޗچu86C}vбcG-={[&ޥ>llҤ)FFѡ7bgȑ.aequ~z` YfQyyyPazoA5mٲe~@~ήXؼ3͛7ͥ@nj#l fdd3x#܅ e*(VM6M:ڮBDa `u8
+dwD\uR.@tԩGA+@jaٺukp6l1RO?zĹs7 6>pB, ӭ:ѝޅhٲ /
+<hЄ) raO?7ҥ rlK۷w.оtiҤ D
+%#sΥ
+
+%G:Ν;c ϜD<)sN$ml(&&^>q:AIJ]vBO((VĵkΞ=E/H8X #⮯KrIaߏ$0B*yiС qƌo9F={޶-+
+ƨ"w}7&AGm(;Au m6X`y#8guxR!__5Qrrr333QLp0o
+""" nٲeڴiLt &. rp
+ )D"(9c9S_~6b rOSԷo_sts˾.]'An:g+3ZdɢERHm%.@SLiժm۶clxg~O?*_=޽o~%Ýc*DSӦͣK "F{| 
+u۷o(\M=JbELGqA1L\YZN< m„ X/NkҤ 3lJtO9tTPi[&MD^z%''8Х:@> "]v 4Hho^ ,HIbP(
+kҍ5†SQ:[xqI'aC.]zmڔxq61KA\j?t۶+(-{+ߌՑocbb_KEzbX%?C8 ko,  #
+yxmƍhΟCرc۸qCb"\9;-e믿.JcqƶmB,X`6Y2}t#`1_oClݺݽToX\sXU" A 1!=3{bnbXX@Qwo @|{=|S :ˆ09Aʚ藎xt@~`F~ mY(~7GA$cTsFw,R!UFaD D2FaDA$ABaDFDIA$cDF7OiFiNZHHƈ0"HH D2FaD" "d#ˆ"D$DF  T7{R0ݸAzΒea|էG.^,<XԼ9d#sVj˖^%i^Gړ4h`fOm%~/48tWz-eevuč%H$?pBx K,(,syLgQBoGyRwHYǟo63G8Qw.f+x)PLwZ~+-Q#c)/YTYo)'Gu%
+Ց6 Ob4XS9M
+ xj[qc+Ҕ/DEP W+hEtn.} 'hA4a1ix#*=tk~ۥWDgDaɣ z
+"WICl'(!{Ky,:xFXy6oiTUmjK$(E~tGK4w^K=>G 2}hC~'ے#TjYgDK<Sb:!c9>Ct RU*׮QU6 V`܃1R.ol%CV|U O{9L̼-So8=Cdx[)* 32! Q=ݯ~qjLII?Ked KqISv6}!p,7>$i( Ѿ0|Ǟ!҈[s^eZ~5D"(c }<;?CDϚ79C풷qIJiӊ6c"hn?ˣ_rRR VwBKYzn$@M xߌ Y`
+.bN!<Fe>W^q[X,q[
+DL?ld
+"y'9{?[$዇;f:nnm6\'5=uGZr\yA+U\x|ԪTb)-ycl{)Έò [DJD$޻w%K&.oc }#64-s%<aU#>iLdw)8-DٻXT7#7j$nN`Ydg>pNs_/|VU{Atp:, M>X{ J0A9o9]oFvc\҅٣N>}Ë1 d'R+W"܅쁘tQvռ)7Cnm,حj1DaY- "UV#o;/]<; :2!G8Fyč:w~q㦯:1ia;C#o=A{j[:ˆ0"xĄm6KF٣xс.3DIA$QGFn]b[ڲ%CDZ쳃=jٳߚ5.#0"H0"A;wӰaS4hB, ӭ:a$5FDIF}#3f}6A(ݞ/ܶ-+ *"Hj" #C?dӘ_Bs 2$a$5FDIF} ٳOi
+wJw۾}_~`9&ˆ":ˆ0?1!AC֭K<|8xɓ!C.6mJ^8oxa$5FDIF}#~8ٱcfZxӧnB
+yDA$QGF ޱԔOz੦eV_c0.DcM P& ?п!] F֛vvE_,zp(O'uyq^WpuX/1y(.ǔJ+p]~WW ~ZZ1ڢQұY,Q:+v#{GiUDǐݴaÒM6@ҟ&췕vvk1c˕-7-BDBqN {!onuXHPAܶ- Uo:&M PG(,ѥ]ty{_
+mz!Z+q+@i]mmS)@YLLwQ=..=*yGA&bDY:e2LX 2uGFK+"W~/l &Rz;$FF)d|/Uo+Dd澅}m̔ǥc#:k<xm\tR.@r}~ P:&͌R,|SE7D 61fɲq]Jb[p:CnA ycmG[z^&%a76kc:TNP\ut3d$ 4FX#c\7]a+K FX?̒B)*\1 <زe?o  wFry@ǔbB3٠L !wp[b+Aܤ4l*]eBDa `:\tR.@I:I;yD.@(:v",[[Ccn(bD {Ĺ7 |{!w=$5Ӵ9aI7Zh•Q9!Tq+{ rlK{](vQK F(?ϥv %G:XdᙓG1]vVD6b41{čvvBO((Vĵkgg7%" _d.rw.]'AޯُZ$0B*yihmBܣ θ[p~='jTV@nTQ'g$(؆
+u z,^X|>1B __+VB0J'4fz}v7
+ת_' <Y%~ g臌D,"66 /N/' CCOxKϡo3ڬ M|P
+
+4.qDW>#G`D誁_Q:!2 xgzίc'<iy?W+,TD\NND~Em~Yoa_5:.sץK
+u{5{iA| E& ~GI@袟#(ő`;; mlK3Ӛ03T_|zȧ[b+ADvtH&"LM
+RQWAd}rhuw@> "]]+W~!K`g15@
+(ҍaᩨCeRn5_KNM Ձǎ[]~(SWP3w+)P!#hbeŗ/$\(/V 1F0,LP<@ F.˘%P~W[~&FFWiXM,~ce*΃QQ}gAO\ncb-e 2Q-S.@o~
+}R N`|/ls4@LtiA^?￯pjjTȈtGt:Uݻc HXf@ Č@nx
+ f6#X`d"ʎb0(׬/Zm,<{ADDF_C*- ̒˔ߞ)V-2kLX
+o_տͅyDv;yekUS@`gqƑ /[:-3gpO2F=wLxO?@C7pXDӷe^߂/Hv @O[VWcIm/
+p4ukӵk1!> "UitMa|٘C V슅 >L&,e&R`L9s~ʼn Hm6t\6ynW~ȣ 3g_T
+"y%n
+ƛ FY"YPa-d_؇ۥ82bE ͆t_e{
+LKǍBSRcd1ԦJZFʦMx*2wdfyD͛KyʦNjVoV,Y)zb[,?{{T D &iiʥ82bE "6JFBzɁ:gƈ]ٽN
+b%9ޫ tDž)5xa>CՄ <<Cd+7~-S*gϮXT~"|zN5+I/-SwMD f/-""J>k<]
+䑑
+V+X($qf?ٯ_OVzDy),,[K5,o~tĈ}1VWϝ+ @\Ah񞗟CmxycdIOA JxFm|<w,ATGFE<2r
+VСCbbh4iRPPv ^z%''8""aDF})h'Oٳg-ƏO}q}TH/RU91ITSMEM'&>X:6۔M_grb/hM'QtC@7XeeQ {ZZz {.@32dprL9+wxU FT1ڢQұY,(RU}ߑ*Yƈcna&IHINO oI5o喛!" Ea~ޅj
+C7L7:,DTFkH"
+bthdiwR +͔K
+ԡ7bgdHtVMq䳨<STcbqye>((A+0/26ysQ\S.}Z1BVb!Py&c`]DAUIij٭<ZQX#ñGIډf겯;rb##XR,Ek7
+jQ邧! :Q'&OU?+^{(H+Pe Ĉn4-{WCF 45Habsn\j\H.8ҁ" V2f!*G1]vVDb41߁,X6b|DA \;[>E/H8X 1uץK
+T,YXDmZJ!U,
+VaTCpZ& `WD%d^]ymQ/#,gȴ=
+zcő`;; mlK3ӰcΆDg  #OLŪoovtH&"LM
+RQWAd}rhuLu`2uٗ=%|D.@ԻW207B@Lc&3!jR),
+P0,7SQ.@51M`UW8R Fȷ1l|YKE/ ubb apI1
+Λ[\WǬA3tR~CƢCKb"\9;-pu8P^H2ڨV*@l30e|:bt>Zzr9˓k.~xregig*'!{<F9D3bnb:LF!#ˆ0"]FD #ˆ0"#ˆ"aDFaDA$#ˆ0"#"aDFaD0"#ˆ0" FaDFOiFiF*Dˆ0"#ˆ0"L #ˆ0"#ˆ"aDFaDA 2:zTi,/[pXDa%baDFD~&(ΝÇlؠ2LhFΜ>:U(,E#F<dAvyG)+Y#Yf˓j+-ALC޾"%ƌ)3rY(io6M{e6¨?U'O C~T!
+"u*‚N,C:}<;MsHhOʮY<p@+8ͨQ%V+W=F_ ;ԺBhV!@gςF[}?D
+
+VԚ"i
+R8JPԝ:I7u*m\jfX(p "xGY@V#j.Ԣ+Z)tԡd#Z_<B`ҥ<SSw, AEΙSk/"wW!*(  lBpORs>(VU d2߾e
+rB1
+KM;KQP9&bQ1xp}0(ݻ߹Cb?#yR#XFUmڈa۷WcD5H!RXDY_֨F.MK3$&j?L8>SQM "ۿѥKAWsǏ|C%݇> @ mw "*D_
+T\P#"~`Adi'ONz(P*7֮ a%Rx! @beW1n\L&oyĺp&5
+}v)##;}Yn՗#ABFaD+j;t萘h4'Mty[C^CCCܵkנAČf7HFaDF ޴gɞ={hbW^MG!!! .lP !#ˆ0"'AcdIO<Ttl
+zmZm^\ eʪ)죷`tt 2A1º-ƨZ( )n%åG%(聿
+ J)a?:#Ku
+" L! U
+A0fg0x#/"
+UqjԲ[
+" vtEk71ROC=
+" duQ%:K;OMZQ F?U4t{e E@-#$4-{W7oХ D
+%#sR; T#,
+ͅB0ڠ0d8h*j!!'2ZZtN&0ѱ;ͪP@_MGy󚋚#D_Q:!2 xgziD9WXO%fp᝜z%n}! rOSԷ/}
+\|யKrI
+lKF{5{iA\2x:LG&%1¢~ƇLۣ;F\P0\ ho&&`;#8 <f0cb3D@>2^ "C6elR"
+z%Q,vԻ%e_I
+dp|ꐅZAi첯;@ " vt~!!NP@ ?뼹eyo}z8KG;/11m,j<d(&pQ@
+$%AQ*5C50d:m*eV O>Y 1DЀXnP KiJ^"UukUuuj%Q F*u}6!]3j% K˕ 뮶mJk`lL9<tm۶jD<YOmc=T8b>~y"A1,LMklÒ"|ŋ`Y?^&h@nެ<Y& "ț5Y,GݩSz:
+Q 1=={&L0L,\0***$$dW^%G&D<D[}wbNMMtcƌznݺI$պ`#G"BD!IڧNj߾}Q- ^v߿ .o]d$"BDj![nԩ\VZ6 TBLIIٸq o^vF]~"BDQM"ĕ+WΜ9k!t[233۵kQ^tTof~H!"D$BܰaCRRoh}r'O7oT({[PPˌF# !"DCgϞEUȵccc۴isϡ1|W999uEHFB!"Dbi޼yZZ8q ~[غuk||9~8.r
+_|qܸqd$"BDj!"x׮]uTPlRT9M6_>Pt[zwEPI< FIB$!T:۷
+QS9Op`hy{GyǺYu]_b(0Lqqq kB Q
+!BEoK!x3/07?"bH64+[؜,xqXWs;o?_UDTΰnj=()(o$me E)(Bс 1SDD\[-(BT/Vvf<jmF>)d\θgsEAXt"^< ;Я@zz )#D(?_{¥@_Ru  Wtd*|Hq%Dtl܌vwSZ/Q(s!2Uqeʙڙbp \|kGǙGY}KR!"D0{{[[(J=)""aX%D!NNnK3NNG$
+޷oqY7 DffWWPL=]8nPKkeq$& Cs5GB}Z_."XH*\uZ֚]ӕjJ!)7ɗ{/<foc@Jɵ2SR!"D@(@0*
+ SDD~!2G;J55#G~* U$:%hIYyE` zzpbCi8iKE$P $ ?W_R/.7Q5$.!!޳#mUۢ/Fv.zx(P
+
+\撱 ~T)Bǩh? *cA@켑|ݽ9Ee-uH(
+(ym}}+xيє)d4p[Nbhy7O܃K_E[}qS?78gщ&HEѥ,DB`gpGus 2^30hH|#W⣄Xz(PQPKLuU]e,i-5p^ɰel5nWcaո
+΋)ݷQM_'LGW(0L:P8HɪFB5 "Duh,_QvV^(|7V@t~ .! Rb6tdj VezZ~Iމ_ENNwޣ?g?t?ZdnnWEW\HcDG+Ww
+QTr'ȏ!rs& K$rl>+qjo/<.$o/ٷ,-U(nN;
+7-[6m2ӕ羏7TL=9{vNJ.֯7g2tQ۰SG͚WmvvX-b|bŷߚz={s{񢝅sᶰvCV(bwCcy*(DKBBѱcV0"Č +HcF_.Zk';3_Ӧia~VWt]D Q"qm+BF*CB$9|*%,rdv+y;+@KI4;5׬1 6=ZyDxvOR"A~ݹ,x^2%D> ?t׼ZAɯ^@ǎaD/W,I?ogjuuU\JB &H~.."DBw)!"_{9m%Y"{D SBt@QV׏ Q#B4o.SJ?܅O% c,Ȕ^u`x+B @6o6*^k3"뤥TBp%%B,W0 ʙ#"D!$2&y 94B͘q7;W#DjN!~aA <%ԷoE`'M?_<e<nݬG'6S~Q\Ȱڽz)Q}#F 0IY`.駅AՃ""< 긣ukSBՕj]Su!FDHy H+=z(s'eyr$Dܪ)Rq!X
+N:F"N8ax|֮-A$XXiLpObϞ+W:y-Zp`u(O"q:d)=+ٷߚCdzׯ7X,?
+΅(4ԅ] щS˯ROPx򤍇jUAu'Dm6{+7n,x7gѣWC9kgG̟
+ᇕ5%'ɓ&iӹE@4~[?qF!E8ۦ08l*E 2~fpQƍ=!ޟ:"=D]Fj)򽔔Uّ簷o;QeW oU&D$c3gj,cC%\BXr! ^<C
+PF [u]WAS'9,A}2=A?heapstQ,_gȾLRw:^*~վ|sn5 /h۶!VD}6da,\L,/#CAl]w8y
+mmR,*vᡇ$LwohH'O.e_sv}M@ȐN{buClHlŦWM#֩զl(h!SkW彇mJ Dڵˆpj"ĊuH^SJm_DNibD# RΚ|~XɈ֯/U뢢? jŠ޽{ &LD7nM'礤ܳgGXV%F\ qU\ !"D=8*B%:::55UӍ3f… =hРu 
+ $}* !"D" 1---66k:u}hlٲ%!!]~I&Nd$"BDㄸnݺSrZjl6P!1%%eƍ&L~{Ν=zOH!"Dʕ+gΜɵQuGəڵCRx v<"DBD!"D57lؐ[!Zwr >|\?.#B$D"BT# qqq\ٳ
+vzzzlll6m._LѴiH&gΜ!#!D"BTcb4o<--pL8qEůcbb222nxt:7zj:u5d$"BDj !B?޵kװD=dnT8p-[Ӓ)!"DJ6ݖ]=T:A3)
+Q9c?(\BHcYYwtVt#@fI&qIhn쑌8);e;I[~Ql,h`FF ý?O!=b=G浱@ty=B q6AHi$S0Y3yvFYs$./obd !\2uaїDD$ (5|X! o!f2(ǝɸ LH
+@|L\EUe+DDX/
+aQHHSL)Q CGZj߲T"^۔KB@ȵa@Xm7oUZP#0Bx<ED_=xxڌ}Rɸq>U6#D1y&vVY_.$@R"/̵."ԗK ,
+*(@/ Tty):F(NY
+<,{bGR@ưfD>*AOxE$ɬY"0!:Ć҆5HyHQ_R/.7Q5$.!!޳#mUۢ/Fv.zx(P
+
+\撱 ~T)Bǩ}~t)UƂٙ;%B\Hgg[
+Q!
+Qd(W߳||w'ESDD]:<!r.}nupMML?("$]3qD..e!ŕ@8;D7gȗDGACyp7b!
+@EA-2U\<͒2Q3qn1 [Vxu<2pdAה7>V!
+Qu!J3!jRFM~qriR\:4/~T(;C/SX dDa& Rbm ]#S֠]]:.NN/vw>nL99p\ܮ֭"@#:"]_
+T;?qF~T\I5\1O*_`ŸwEѷ.ٷ,-U(n~0K
+ ]EL(B[U
+^gLRqFIȰaHZY]ɽӌReOGZZd`99.+
+`
+bÆR-Ukƍa 6Ks). -n$>?۽
+UqBLW"D"DqazC:u}TfM|cBe觟CQHHmfm y2+]*>h1_zZN6`~u_A]g!ma֮5J )SrKZc
+r%"Z,oK*!"D5Q%bh!B ӻw:a}\C uOFML!"B$BD([r3xu"hXSSSu:ݘ1c.\Xڵkw)ohȑ !"D5+mr>Vc*ĴX k߾}Q- ^v߿pԯ_MȄ"BD ![nԩ\VZ6 TBLIIٸq ۷o7nxm۶?~\.'#!D"BTqʕ3g(
+:f̘nK* `£zQ٣[rH(䩜n8o0EݼcݬT./1B),_%
+ P 'pIxf/DQ
+EǬ@ |[A ql2nB8@/xuU!fff&~jI̱{/<N£q 9I~~Q_RJ[֐
+Qĥ& +(fsB vY rf]_(^տId4%D!h
+!Bfqy W.F?}kq {<oF"]GDli:πe ˎ`y_E"L|WR:ú^x¢#R@|3xxTRe-kH(⥍M(Dd\_e#i#;DkgՆq(\B(ĉO{6Y䢈!ey3ϰ:
+
+t'|1B弗
+}K%xgd:2q8n.~~QK"(i9
+R`LL~aO`8T^xIxhc4[
+Q!
+W^^V
+"
+d%M,DMòsKB)/.ݜD# `oeo'"BЋE_$on2ldͮ8z.9..KA#GY7O"I[ʚ#!>-ԯLcF\,$. :h-k.J5VYB`ؐKVO֔£ׂTVR[rH(
+*q
+TB?%d".=9Uq{/<ς=EX7;ggpprzwNY}KR!"D!l^[e
+{":7ߘϝď
+<q""BTGaށŏegubwc D엚H2D4H="
+cuL~Ad߲TTqBhn߻9y<F`'(p_Re*d*DQ`":l=!aÐ{!J1@ʐ'#.H
+[3d6SRRnM5O3C\wuGtㆳGE~Tp-Ҭeǟ$B$B gʕDDX5`*u:wZt $DD!Vk -ZW/vS9O>S$6Vyႝ-[m4-/[iSY&ҷ3%"JFV(\L5kgk'jV}V-~Iarvؽb<]F֭eYB ]sNU_Bp 1C&GgOE_cduK0tL.%WEd3&';;$yW-;BU+ TUXy-}Nr +W͚.]aò?Ç`ógѣ"2<sԕP!B;-eW:?͔auH<u DARQ5"քoNEL
+zT yFĔ}o>`+ D(r7l0TټȵQ#+Rw4i"sXԩ`y`dʷ"D6f8҅!Z;BQ#)*z"Dx+o73%D~
+S2o,![nx钝,u͞O
+O.ձ&D`K\V|8"B GF8U3gB jbIY0n\l~gĈD #] ڵd4?C[Y~GGˮ\qxF̆0B
+iSٹsvO>d. :q†r z$Q5 1=݆N!VM5(Q$^hg> 5\[c3DZ?%_uE78!NE54*^Ǹ HN E`wb""ڴCgsg.!ANVǚ~ --[0tKDU~[:Tt] m]Gg3e޽{ &Le͛7wڵjJ5 QGt5͟4GCG5QEbDGGt1c,\[7d0# !"Dǭݻ+=w$ <樂rgO"DBĜbccSڷo_T D='N9W"BTAz/׷h!kL3gk?oYc #D qݺuSNڅjղlBbJJ
+J &odܸq>lvƎ+HH!"D$B\r̙36ANWwff&J.[_|!J̙ӷo_o9"BD!.aÆ$
+j'O̵׬Y3bmCCCJ% !"DCgϞEUȵccc۴ise{nGsrrH!"DBX,͛7OKKM8q\ uxc45kc4/^裏"BD!IXT'x׮]uTPlRT㲐aÆIR2BD!"D5+ l-{$tfS
+Q9c?(\BHcYYwtVt#@fI&qIhn쑌*j'owvJи5)."aqzkcz4 "m:"]HQ`f 팲H]_l)kE8Bd΅B/OhI?j=
+EǬ@ |[A ql2nB8@(
+
+"2Uqa{_
+?3gQ`Pڔշ!66EHlr}a@Xm7oUZP#0Bąr Q"Dummkƣf(==> ++ХH
+ϗ^*\
+E/U@8Ya#VD"/!ffDc4DGü_%DԒ9Jb"D!,X9S;/x PT.w/.ݜ:BE׼ո5YtIw BӰa,yEm"ݖfvYIO[IeI[ [F3Y++(}}K8nP{/e}},ƍ#D 0IrK0WYs$Dѧi!b@RpֲbTSj% IIo@ɚ| *]
+T;?qF~T Θ0IX&+f\ U0. (oYZ*8!
+Q4O7ݜ<w#DG$Q`/)2tY2qoU*x
+19cKE
+#D!ҬڵyBKZ:|b␥VfM.އp{(EoyK"ӧm2p,^8m!uˉo>Kb棏 A1;GÇgOajuQw4]k=;#"ֈ"DvTjN,*|m}
+P0
+ѲoY]&ؿݸlɪBD|
+b _ 4j! ]޳̔W.@1fLhs(QöV`FFm6m/;Z^xA hGݓl#<>*"AAAjev3= ,vҴ9;'̩Æe{t:7g6{bP;j̋\2<(v" pGֲ`WҲb><\#GgO ]v7&FaۺD)mBlv.T۶rxkԌ;̕ҖL=]ՋeWwzw~n8jT6,$$.Su="RFw
+M"BDj![nԩ\VZ(z Ĕ7N0={<3d$"BDj!\r̙\ Q+~e833]v(Uy<޽{_v"BDQ # 6$%%VVÇO<9"BDQ#Dp\\\>{,BۦM>_
+ P 'pIxf/DtS]s\c(xhaCkYzzLG&9My}Zޣ0GM[EN%b3 F|IީNVVVEnXژvV^^ͻ!t*-N5ܺ19cKb}\zzk oH(33a0%D!.9&k}GNgEg8 Dinn+8 |$PQ;ySSy[(b6n4zd0##DS\Dם#Ⱦgi !Fb
+<5ghg5GMbKY..&F%\w.}yJDDKZB11PÇVb-r9D,
+Q:K#P}ԯ2sD[[lU*gËww¾.4Ǜo}ѸqGWDc-:"[@WocsƲVeCD#y
+"2U*uuSs)EHSL)Q cL35BFަ\BE2@ l$mbhy{Ђ".P
+
+t'|1B弗¥@_Ru  Wtd*|Hq%Dtl܌vwSZ6GIXQPTW"ĕ+gjg k|KFA&r|7ԦEApEƭDDȢKXa,yEm"ݖfvYI/.ݜD&NDDzѲh-[\Q-S>8nPKkeq$H$LU Qi~eG0rb1G pIx{侵5X+ՔZe qaCRn/[^x>Y-}v[rH(
+*q
+TB?d".=9US{~t)UƂ|g77۷!((BQy=g+#z#\;ǝ
+$Dє)d4fp[NX m"WVW)?("$]3qD..e!ŕ@8;D7gȗDGACyp7%B3DZ2e2m.kfICl@EL-cqk:w\wI}SoEAE_NP' ;[^q\;#&eH֡DNV4<hy//H /ŕ!#0@cqGU
+d`Ÿ}-K@E'D!Gcvl%Q"KB!*XA3&gz[o$dX0$-.x(Ŕ(C~o?FJ#渼
+1cO?TM6MOOH$=؊+
+ƍ`[RwCv#D$oβ/!άU+gXMX"D׬YՃb&M 4@s\*oѢEsss˺` ;ʽ{nݺsB_ M%~( 6n֭yB,}`FߨU+綾v$ב$/2..Lvv6Adʓ#Of޽;
+Fz<!WzO5G/nذa{Ҹq/ްsIw̗!͟_Nۗ$ׯ׫W|ǟٱcGTTNT"
+:H'DR/x_{57zӧsңGްX֒)v V}H7oF#D$$$$&!BfϞݹs]vݺuk:uZhLyBDOSOb9rYfR'/_Jz*~u˖-U?B3D]^×!k%=.W^QtbٿߝkJI)~ukDHBBBb^^ŋ[n]NVZ !J%D\BBBdd$>?_^k׮_ĉ1>>><<m۶; 8Gei6?B\ʇ=D۰~G:uQQyf}`*"D$B$!!!!B| >FBBBBHHHBBBBHHHBBBB`"`"FL"D"Ī/wn]a1=̉A#įtAtԌ o^tAtԀşJrbpHBBBBBRȝ[D(yb/++"j*~Ւ|]!VG(ChHȮȮSr7_W?&#=9%.Inȁ/:9nd%'o;p9"VZ G}4tPRiF*r#x<^!~ΝRSݻw 0adN2==zt8N{uVnݦM&%%ݸqqV}
+7ݻ'|›
+|DDU9BL&?g?~>| ?KϜy؅rbDGG"33vڝ:uJh4 3fر#37oM/i߾D"I(pΝ4i޽}t;TeBs۫]]tiر=/!;vGn7b!]vudff̧~:p|$|V\ ?çO_QQQ7^x1KKD<x78oʞ{yz"`2y
+ l\nع#;BZZs&3 Q~
+р~ƍ]B;sLNNOJJݻw#2Çsԓp<?S!|2"3|rjZU*ٳYvB;qժݽD
+/ݻ7~G9|555#pj(p
+
++ x^TJ|9zW.]_喞xB,$!zR7!nW''2:"xիQ`H?jĉ?,) s9W_}_Wd~E'ᕼpgx劌vd&`p_ uYY:|Y;8DΤhMNApQ̛7_GȝDqљ_L{@+ ]ޱcGTTI/w*K%D F.w\-UuIB,&Ѯ"DZ2xf͚8p
+_G Cl
+ѣG SY7Ji*&,EFFb QO_Z|VDi.AlƸjL\e*AA4A999 }/fƍ۳g!|H"ȥ޽{@ݺuCF`])t6gQ]\\:uꄭݑҖcpptPYBBď׵ڢr7p"PtY=Df\3&Bii)Ӿ}{%K:ٳ'PmaZ-ڵX,_)\ oo>} 0/uzOc
+WN1Wbm^*o³WJ_y뀬 6"ض2IJR]
+]qqMaau^^FSPA㊂FIK=&$BYY-W+
+Dxp6
+WiuȅZ?#Lb\1(BDDd@@3l߾Sn f"_qEA$0/BWD!m&c"_qŸ Q2"+)Dh[j1c`
+"O3
+e&B}i
+O6FD\d"_D
+̝;733SX!6n8pKݼ><L[3$%%p38+
+
+S`7nصkW.]N<iƂ(}zzALLFTTٳə7sn;dL"ŋM 0֯_occzT*>LٳgPPjJ[Ne[!׬Y3tа0Ɖ'0YO{w`5#DsQuUѣG{9LnMvUqϞ=;w^xpGl> ߡC1cvT| R逸cX4iҪU,]zmee)bL"TUh*ubKAAU^^Ehh|teÉy" V/P\!^t#ˎicŖ/LF-<y&j;#7(ʜ=10
+BT!ŤDJFYIS^9_}Ւ%K\]];v!_ݷo_l8sL֊i`+
+s笭
+GҔ"q׮]Ȉkb cA0h4:t84 B155]vx\F(ȈQ'4"# Ganݺ e˼>!eQ`eō:lذ .C0NS&Bu]222͛5;88>`˗/cl|'5TQ͞~i<*L[0xǺ#BmFY3g3 b%wz-bIS^6r !~<l`sW_}UxM84 Vݺu;.^r[ʾqŊƍLRHya"!bXV8خKJJ>裡C"PdÉ לּ\&fy
+F&Buuuǎ!LPQv0|da/T-_;wDjjjL(+slؿP-[4pDKPPP拉Q#iFq"y csʕ~؎׵kd.ZP-3m۶a$4bZ2Iի}]$1>!
+VvGN:a+wwwĿtV8u:?*'\ 5Uuss{"˫E5Bbbbpa-#~2g|f}i߾=)))
+b!Bd} e#N>1l 18hǑ52].(f)IR"UT芋k
+ *4*&_yX ¹S
+WiuȅZ?#Lh :@A$ ""?2
+vo)S[3/
+"uHda"X(uHdжb` ֏Rq\W㐶!10XB B!DB!H!P !
+"!BA$B(BB B!-/؜Fh4?,&h4f&9B1c(BB B!DB!H!fZ慣e1
+"!|
+8?H! B(;F>;bDnLA$b䔰ti²e]^<VᑵjrS^]DB!f)gKs+-Ȩ*-,))vM]vXaaLA$b9|ŋ3oڽڵjko޸sV_MrtncKllt/FwATR !*A<=lXcWɕ+K:q"3kÆ͛7o4m+Y*}]*JFRR<HA$jСa%Yॐ+[?\Oϟ׭+S)v-[RAAsss!#GܿB2e
+V}Ƞ Bi=xbȐsu똋˵%K2jj*ZNM͍3gJ_|DH!qΝ6mrss)SB!_ٝEIHaĈ'..:Y?/\X8~Ej6c:KK.VӫW/=**+D
+"!/G %;;5ztC  g7QRΘRA;/^8qܹsyQ !6!ˆyaaunŌ5TL b Pò9sTW39e
+><|޽{>}H! bP߾Fx8
+"!P}Nwpȏw!̙yӧk̩
+ E̙7sCܱc,pرE}Atttڵ+2%ҪMfϘ_RRTW_jX`:j! q}xLf4'*,ɟ_|QPC:S ! 1I%3gjg*wu-vu7OKNG"By;ս{nLA$bBiC"O3(b`Ճ
+O30bDB!D
+B B!DB!H!4)&h4f9&ȟTi4F@D<h4b jc Hh4? Y
+endstream
+endobj
+870 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 603
+/Height 489
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 619
+/Filter /FlateDecode
+>>
+stream
+xA
+endstream
+endobj
+863 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 666
+/Height 429
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 871 0 R
+/Length 39792
+/Filter /FlateDecode
+>>
+stream
+xXTWY7?Шٍ-&Ƹ%fYݘ&K>R%nc4뢉&*) Rk"EJQ
+0000000xy)bn6 c7QINWL6)8孧Ig<˺<D5v7ONޝ:+37՞wL:b````+!EI ?~/hZ|qn3/c{e۹>ϣLNn~$2_.aVFdVP 6s\d2;f\ $槵v5wu10000yI(;C_So|' 61̽{ze{4QWja] ~}e"v~Io}_H9N())IIIپ}q,Ls2/
+6999W\9'UV7uq1@f#iFC@-&LuL
+H/u^~Ŧܠaeᰫbuϒ抔eYګxSs=rօ՛:s&AtiZ+Y[ kUO~#/Q6i,=3WvVoGbJ%WҊgoy窘'd=B3[&ϼ)&w %oժm)<V΄v΃Qm N Z7&{{07{+d|g%bC e{#2kgXkP0kq.:S輭ZƢHe2BQ;rEȲJBC+elItsEV>#hm*+mJX}DV֚$.K*;pJ%gig@{+ @~zf$HV5
+<FLvB6$:ZfH#Qe\%+u2kZ3Y?1 JTq?pf)G~Ҏg1o5%jZohZk#|T#Wn߫_ѩVF̌{OZ'Juaʵ#J'n\[a!\eAA*NX}dzO`>WZLYC Vݍf-'FO t](ad6t;}{L=N)IxZlޅ"LX딣2Ƶ&N!#Lc$ *)1N5(S:FEh|JǤmѷ YsO'W<TkErT((aKxli٤UfvגI^c5o}[*7Yǭ+"/|B<"gZ%^V[*+7D$>o[*-}PhYz_ը ~w$(t~bFZ!j6(08Jw̎mTiWN^y{?׮1V]!? 6*%&x{<ww;CU_]%Sj NWn=9i1v/W׈8ߥʅK,73Pk+d)(dQݷ*fFY̭
+ςz홦F'~w M J=ۃ]100ȋPoȬvr&q7<^zF{a#Xy6+7nzr9-35yO! c{#2kgXK-D]Eei!t:!])<Lt"1{CT颈3,IĜfM.'bAhjfb~1ns3;j=&ǒKbS3Vϓ6xN\_XZ!&SLbZYKdr
+qjZƮ؂Qay݉*ZS&SNN)@Ds3 ߩYKx{r}ET{$)c{7t ,{o.B}w&ݤFB n&X.H[>`E^۳#ytdraX<fpu l2YKg޻mVcI&~R*L(J{"]dmP]c7QeEˮVH.ˍ+^/OFXǕ?w#''닩Ƶ|C 1q$X7B-vFvhvD7 Y!UɚkSy^Lr;s"榶Ԋ'殌;\[wVQnl)oJ=YIU: vΚ~{&+(dYr#K2 n1_ҪRsX=UVFޙOTORwܤNѵ|L젘e͌?ܽIf1$ǒo{ MI1?{oYqU-Qi%*F*%MRb~Vxᯍu
+FHriSs2︓J7XOE|>UANI:LBM]ugLQIM,`|xp`sZ ǁ%}WbQ,jf"=5F/MVz+<78#0ص}Qٔe)7Ӿ+7F|ךEq|2 6B@-u퉞5e}Iyn- dB<Jj꨻U\7
+Eςsݟyr>+i8{>ʷ&;9gUY&BMv;9guE寯)y;
+ [EbfK*Q-HZ&'ݑhrƔϏ|k-%\E`Yȕ|[%N\rZhDo|]tG<h<AjHO
+)&9{}j#[mf79Өo}Tl`>)ͺV@P{1%col]z"RՉK9}j3OޚSC+1}
+kċhe@Q};n)+"/Za1# %LLĆ[ *QL8͹oܾ:_|gB~hw
+dRW] ,0 lԵ=k^nVհ8p!"ޜXv8K,Vk
+UnYw{i4}UF̵L*}'}jMhUҠ8F*Wz_Sf͓J|82+)VFPg
+Y֚oP +24閰^ Ƴlq{t~
+ t{Sj1{iLX COwE7Jqe.n7r; qLaB
+|A-<F0'Kc1 ;MBw; ySJw%}L?̜_7TΣ@-~ [n/TϡT>%J '!g'o笥TΉa_\gԜ] ۨ7>09r#@QyB.mw7muaܘu= _
+sne͢_Kjގ1 $̗R$4Є[?Ԭ=z[o+deE@s} A8\SjH6Ij@yՇucflղԢv.5EE#6V|D-Ǖ3Ǘ}B#J>_3 lylCgylXuśJWU-{a\(8lV{̎_ du\*MaW
+
+
+`=N322&M4rbwҥz!CC&//﯐IYͥR#h4R
+
+
+bĉYYYӦMj=0
+șDSx~LNaQ _6Yg[n{YԵ33Bm4i5ɒ뒨~j)Slv:H2"#2:,%GyYYYY2=b2y
+*\y^әtFyi7'R`C5{t;Pܩ˒ mY;3*$#g.mlpO$uURZ`Cfm9H5RG=eK2"׍ ,<j3DZrȈ<r.j'ٍj]alSəuj0ְlyvWE1lE2Y+5
+duIcy\OЯl,:}y Bd1%'D76>+PN"g"zBtqYYVlh7fmeў+˜3wIZԪ],.~p2"#2:4CQtylxoR>X!Lș./i`ih7fmdaށ6\4duIcyHǻ!#2"#2"#2v5M+HȈȈȈ8"ȈȈȈ8q!#2"#2"#E7oƄ &L0iµ9C"#2"#2"#qDqD͓Yv'uu_J !SY |i:]ous~ZZk&%oP̜1n|&[$~7\EdDFdDFd$Qӓ7R7qb "mlLV*_numfR\77i")\EdDFdDFd$Q|2ԩu99rCϤHx
+b\svŋ2pmbK[$%q֑ȈȈ$*MN~bʔ:gBBvO.,L z'Xkͼ$nn޸ERgȈȈHbpsN=kWshS(tvʽ7>^%KxǎBZk%Its-8HWDFdDFdDF]O@y}kiR%'%I|}yȉDAFǎeʜ5K߽[X,7ظERf]o("#2"#2"#.oIM* jUz޽-ÇgrRt}kMM_PĈR>_-f$YnnqdͺPDFdDFdDF]͡+^xfhvpp}$Bo'xnykPE7aEܰ0,8,"RR[aظERwi"2"#2"#2n1awwwwnsypQdDFdDFd|HwsT:|(@0`kңGa'#ȈȈ$nN&MDnjӦ~؛o4WJJR|_dDFdDFdDFgs˗V777\>nyQUUU1wQF`8"ȈȈȈN{Yz57@ |YYѣa^WWN<9##l>{E㎌Ȉ?H>|8 xm.ɈF*8﯐amE
+
+`=Na>iҤ#GÿyإR rqDa=bT*}}}SL81+++<<|ڴiZ6)) Ν;~߾};lAFdDFdDFdt7tڵ<xɒ%CBB㯽ZXXNۻw/nE4)mjTb27;u8چ4-j.їߝ8vuyLDe:/ם>=.M%Q"UӤSHkP y,iӹE.H\D;h֚",9dDFdtG)HU唚P@VeAqScW,g"zDxdcELy0=:G%|Mؔ:gme#SׂyѤ`$KKNL.#YrȈ<reeefx]nt7Tw+qwz] AbW0.ћTș 뛕]*Up;
+)-KζÂ2%IFs9dDFdt9vsN{`X
+ Wl.ч0VmܩLD:gkX<ݘu"X \敚?v F$J1rȈ<r.'Wq6>˼!Vw}noA(Z'3=!:Fwظ,X+_ζhǎٙ$PjծH\DIz8FG΅|i!,)i0ޛc!S$r&KKaf/ڍYg[E%Yw q &#Yr]%9dDFdt9psCFdDFdDFdjB7YȈȈ8"ȈȈȈ8"ȈȈȈ8g2"#2"#2g7oƄ &L0iµ9C"#2"#2"#qDqDm'ޕ+[~E|Annt:]eQ5qOXjU00bHNuy_ZfHvMEK4 1t(wy2gK{CIT?nnzo~jܜ9ɓZss;:VV__|xӓ)$6uw}w4V<)"k"2"#2"#2oZ-BODY eӦ[ss__ޫv|O>9^PuRÆ[^븵3]dͺPDFdDFdDF߼5kz(&)RLGc֋"6qS$vZdܾ$5rnl?Hu+"#2"#2"#%8)&t|2KkN65i9u?!uC0 ,Ư x-;UDFdDFdDF]Op 7_qÆƞjz ǎeʜ5c.G98 41'M-*R_(&wt*Hu+"#2"#2"#.pW*U*u&ܽJNO5Rr119s:V&rC3W0/\!%
+ڲe
+sζ\FC9t+oI#H\D|@?Y<Ig$KG^urh$3q\c\~*8TuN"gLO8EAE$u6xQlk
+*\y^әtFy\WW٫VyN]T_hWmټߝQ$q9sQmvgNw{$4lA
+>,8((]ntl`Q/>=CFdDFsa7W4>%npV}xcf˝JDTS|e˳*ڍYg[.ʀe^Sh`$KK_=#Ȉ#n~~gckbu')9!FYRu9ntϊBbE1lm/L\̘{H
+VzduIcy\͗˲!K`=2N"g"!jݘuZT{RGp[l҈k0%%QүCFdDF3]L lk;o壛##2"#2"#2:l&tsdDFdDFdDFtsdDFdDFdDFtsuȈȈȈ͘0a„ >M6{HdDFdDFdĵ92"#2"#2"#92"#2"#2"#ûrE- F]]C[~E|Z堮NZ*ooСLhmfr73gr2bcuj!YV5/Pmi@'H}'lߓ.vM\иaĉ5p$\8#qj(h75U%SDFdDFdtbpsOOf@
+Da _bqf"2"#2"/[Ɵ:.'Gn|9:rZɋeMI aŒ9xpDj^~Di׮]ͽ澾W_|7qsH/T[Qꆛ[l8ݳϲA6u Ϭ^RDFdDFdtbpsX+L1v7F|raa"h O>pCBa,k$׬i;6 N9ܶ͞gYy``;p  AMfn5qfYl8d>T@<]Y1:Z܍3OÆSD7Ht`=4Kr,Y;vL߷ M):%IquL{fɓ"fGiU7<tHԤFGVD{[l8drr瞫!^fƙȈȈSt=7}>5vz ^i!6lh4 br~XСYFIJ<HJ,$͏(WjksJ;YnnҥT50 a8 4Zk8q yn0"2"#2"]aY*U*u&ܽ29{[g''KT%9~ Url4:Z.8)Œd EtMg Җ-$dISϘQ7*HwsƭGr- >zCa`/P3z4
+y<!푃E7شaEܰ0307ި53ϰvBbIցHͷX]Z %0%L|ϞzK SzrDhoI)o<'gȈȈS 7Ș0aXluNniQdDFdDFd|HwsT:|(@0`Bkr/,qDi4ڤI|NNΘ1c
+{7u:FJII1ś8"ȈȈȈN桡˗/'򭭭nnn7<zq{Gy|Ϟ=W&7/++=z4, ZK/T^^l]ߚ?Ȉ؇WHdĹn~က
+
+j[1qĬiӦiAw8"ȈȈȈNm_?~,YB|<$$x>k㽇]DҦM5/&(}sSmH2٫}y?cWIGDT|Ҥi}رS4v}Hj4bj)r Y!ſ76m}:%ɒCFdDF{Կ ObzTJXN H Th;:#w)$?!Fs9##(bσ)QW!reE7F &lJgme#Sׂy%ɒCFdDFs7/++ 0K["XBpY҈׿%^[_ӗ$HX%>7zs#9 Abb}K ]CFX!n'p
+m?BsE{zv'uu_4 A}LN7CZ`w,"꿨<8 -⦦J!SY ݻu.0֪[}Gs$$t`ӆb7,`=EdDFd췌.?YO}W,z+xʎe_[_|xӓ)6 k#2ggܼۊ:94'-H3gDjN"m";]P6(,FE.):
+46j |J-{Wj nnQnsخ^=zI- ի2X
+=\ Z,CCpE+{ۍGo("#2"cet7CWy<L|b
+~gV>_uϽXM5=v,{PYz$QѶYT7y}ki鹛Ao)~YvF|<.J?x"$Il=qvȈo]i4ipy:]5r$Y[X) jUf̨_79s:\FITt niޖY=ws 3 i47c7͞1S}&/„$up_S(yE,*{ۍGo("#2"ce 7Ș0aXl5Ç?36mZYYY``,0%ZjC{<nDai^Eaa"m;5u+z%|@t &oBM rnʴ<x擙)o<ރw]o|֮]ܔ,bOάvA"2"#2[F\*><**J ̟??88آݻwܹ7~D#ڈ.9F4i3fL=a:NxyyTUU=Se޽sAFdDFdDFd쉛ێ.yhhˉ|kk\.7<z78p ,ҫqDdmgϞիWyXw_ ȗ=uu߼ysWTرX #2"#2"#2:kscD/Xv-Cwwwq.2p̈ #2"c^!c776OOO"'&M9rdqq1W_}.Bnr #2"#2"#2:\*1F7(('feeO6MyzzXoݺ_AFdDFdDFd쉛6od!!!w^{-,, 򑑑cƌ8pٳlv&Mj^LQt.GېƹeW-%3~ǮN:L'3DZǥIzѶ\Gp^nی;ֶ(nsn9cuVfcM[-rqs16w _ßR7Ţ JRvG1RI~CLB$r&GG1Q?CS*m9}(SlhfݱE!)EcgEL] >>3#9Fj\EFdo6^*++ 0K["X pYt҈׿%^[_ 6qI˺*CG1r&Ażfe@JUի`< ,kmwmQH`?o|N7͘Pkӭqgd1:8鵹\'j<Oh!m-L\!X_
+y2vc䬽UՓ Ы}?/Cn0Xۢ&\֨ҿ]U;,F0W J`C5{t;Pܩ˒ mY;3*$#g.mlpO$9Ѷ
+Zsn3X7eh~x(3fÂ2%DZ?UdD~ni|r K^XaԺDXr3U><aal0ږmf쉛GQύn<E#X \敚?rqs1_Ƣg N]QrBoA(Z'3=!:Fwظ,X+UFrی=q;JppCO2/iTzʸ,3qE3cv!I+ZcȈх|i!"C0% {tBILD40SUFrی=qsCusی-*m-&ѩƱ?UdDnbrȈȈȈ]M8GGg2"#2"#2͛1a„ &L}zW98!F>5p"#2g2\EFdD7G73 *2"#9kdnn7|Mĉ5VTZ`w,"/8i~ET=#rx+~榲R:Ӭݻu:%f7e4p#YBzqأG_{mϝTTN3F@l@9bkHvbL^U ? %l9sF5qbk_c1 ayz c%]7>p
+E m66jMc$H(Z^k/^}<]b͛k4hK{[OR[}2ĭ)b˱cg!|S1aѕחGt|VbQI$kKJ`1>r51-Mdzi Xŋ2yt [,$H&z _R &Fl<ɑ6d6V4wモ/˗;ݾ]l>,Z&nnhp cGdDF'gt%7 lx.RzpIXYk6m>-̧
+ vmct aLGo^!!`vK`$KZXU(t p'L
+Lﳇ?oqqϠ mwio+yzWF ]fϓ;w>i7l}j8?#2"3:%:tHԤ+Wd`@֙͂'EĽ jj:`p\w޼vj /Wa,${,!k=cV gs<ʏ47S.h֭ɓ9:ks(?|8;!Acq=m0ȈNbnkzqtx`7R[T gy,!E"A cC2g**<9)I˳X,7UF, ј1Z<LYYΝ;) N<ō|vʈ< /ԝ< SAP׭`G(,n}j8?#2"3CfƌzpUj1<\ߠ=`xsM_` Ip:kX矯ֿ }z
+El$Ynޫ$
+Y4tڴz( y:]5r$YT s6rkLtcgXF]ۊnP NL^r=ĸTSOōO 0qDFdtrFs! CU rgA@33 t$޴@Eaawxзv?e%"RR[tc$Wȼgl޽{[FbCWb/ ee_y66faaX?`u3V 2mYhjaO?%rƍV7>5{5jc>))bk}{Obonbb3~{L"c\EFdt@"Ҥÿ"*!A-^v/>2cB7G7ǹ$n״瞛GbsFగ^zeݥKvN ?cXxx|Yng99UdDFgpuBV777M>nm[MGw7\hݯbTj9Y8W?hς<?ylѰTkOǰK3gňNro͎wdtFtGQ?Uwl`ùJ_x
+QdDFdt=7__
+]di֢,;8چ b|CҼC`J'g"j,Q;lϺ>aƙ97h5fyOƱWHLj"#2"빹c~2D=*2"9:dD7qDFdD7G7Y8WB7G7ǹȈn͑q!#9#2"cvfL0a„ S9_!' 92##2"#928"#2"#!UW,>jUPfA |]LqC1s&'rǏt!]"vM{AŰ}8$.WC̈9}Zd67/4^*`lO0:Z J7vn߱0+*TST@K$nq=E癫Ȉѕ\$Ҏ>sFV$ݖ-s9`+?_C]qOL\wКQ%;='SlI:mZ/(PLVO[.9s@
+E qB3-b;x{Oy*2"c?gt%7VHZm/ז(7ߴC7onB^(3t^}}~!R-ba<,acZϏד'B7_#7yJJaELWrsc):\EFd献k4FFvMOnifn&)I|h,y``;p CiЂ0Eb!!Y1:ZLx~bʔ:l4Ä$ka;x{Oy*2"c?g~h<nniWl,8yRdh4m=tsx d,;jO:$ljz{s`#+"BYgަ5p
+xVs5K09d>P$*4T(t=tssLssGc):\EFd`vS
+<ܨBԜrkFNPO϶9)TsOΐ[x=i#mMs-x]ja6D7K哌מ_zgٮEt;ҷߓ篽һ "o疸RNKzT?F8=ڨT̻~[\O?FfƜ
+{b).oGHic+W<$=!DcSvNH@p;Q66tc?+&^2qs]hn4BG_FxQ4n#d(H#XmcN
+
+Qʳ|NsU#m]''F=S<#cm;{5cM#n=}
+M#,.!;88%IsU#mWI_ {*SUb4d*I٧+{C8=h`g^ <V S\ޞ6wdq1c8Vi#m|W#9HsҜc6FҜ=BIsҜ6FHGh#i~6u4X4 EQEs Ii#m9{6FHi#m$#6FHi#iU52
+%+:˖;ݳghTݾk|R2[3smT/1!ᙱq8~D~mRUY5&Խ{Ï4&*S2"TW"m6w[;;.XpW#I/4W9xzzcm#))7۷Ɯ}-2ܼh%j,TKc*sDejՊɆZ"m6wrsx>B+I4+Qؓ'߻[̙'HјS_4X2[ڵcnO_4ύ5Ucs%FHiJ|h}KJ?4GO׏}<G4W? R }\clt)Rv|(QcY58WMkP[hcHi#m+ݣyǎ ;v(>޵kJ4Gok:Uhw Zɓ 9Es%*.W.rzo%j,4T*urHi#m+9C3
+*U*UJֲe2U=s?٣ƃ/=#QcN}\c*׽xynP$.n`]<Ε{3gVHi#m+֭IIπԴR@sSLdhglQ<Ҁ~m}9Es%*sDj,{QzilYZ"m6wX䀤)̓'471A(?UqI8GNw9KRxU/1++1B BU]bԸqiWZ{SBtSm̽i#m`%̓Wnjjڽ{k4FJBG徹oӿFHi#m,>,S͛SSS۶m;n8-4MVlgϞGh#m6<y@@<yߵ6m^׭[w޽@y]=Bi#m69-Z_ F?~7m믿v]ͱuXd(Ꭳ6FHi#m#Ϝ9sРA"O\\RbE걱K(aiiinn^P!DMn~6桍 ߏ|;͗,Y?zHtuuuwwqAPLqҥK9s+Hi#m1}׭[WAg"dggw_i֭#6FHicÇ666=z;v =qtt<v؆ 7nsgammm6FHPPPPժUͻv*|;8%J4i>(Q*?WYzS MwyOeHorT[$a@FU 
+ xQ^{5B?'dUT
+M~2e"*_%[[^dGJ'\y?8Hi#m4dq]pK.50v[IlK7nY{?]`q}}?ŖgO2t!]ҳ5N_PťgcߊZSl}rũ:!m]yFm•-v`aGGi#m,._ʕ+jWoc;'vF$QQѝ(g[/ݹ]|4(\~7<Vpct*NMgtpGAi{q*?Ff<nl]l`bu5hh#mѐŽi:Jf8c.mF82&u7pg ZB8=R$<sOԝڋH#u/Nc?6mU5fnXEl:tGGi#m,L#L|16ӝVߚűI>
+z)NB[U}s]Xh}-e2g~̯=KK?vq6Fh
+4͟f<:c 뙧ϺZ`g 4÷{/֑1t*Noqý ztHȣ"[C&d Sm6MVeFXo=}muh~_/ B\C#R.~yIXhA V2+{ޭ[Lxmi:+޲VGgi0FHi!+4*+\
+2l_, {uWIh")ܕ=!U -(4?ڛDT|l9&;{V@EGGi#m,1ޥh#m6Ʒ0-OI.?MFHi#mZEFHi#m9{6FHi#m$9h#m67HHs:Hi#m7׈7\NQEQTJJ:s Ii#m
+"2Sk>}2zni)gJho[-6®~_=<-7+5{R6F`~c((4j׎5?aulLx#4xV4#QP Z.`Bso5 }Uyhg+4{?SʳG(QP]s  ~=Zh r]m>
+ f fVkȥi#mכֿ9
+/(
+Hs(")(")(")(4'uTk?a"EQi{ȟAQEQELHs(4')(Ҝ4')_͛7RIsҜ4(" LٳgWVp¥KqTLW5kV&J(cf//3gTZ5{̙3Gw/ٲĮI../7;7q.\pͺ5k&֪ibnnѼytPP
+oL52
+wuakժ$'˱I
+H-&::M&}q(yР7LI/]ШQTb~(IS*l̳8?'LFQÇ;88TReƍHIHHܹsŊׯ1֭[Ӹqc;;#%66M6]Ms
+7o|`}DDbϞ=@pXX؆ )r֭[_|"99= B,KZ8?ۻwnWq2ש]=}4n0 r//2$-LL{#ͭ#/A^6N&ڵB䵱hˉ%DfQ_|ŤrdgΤH4/SF&ڮ]4~֬0044۷'qB(\Җ-[  \rRR?<l0Y\rpcA'<ysssqg&b4?ydѢE/\쪃cƌ4GI>_~y L˗/GCnnnhZ
+SSӖ-[J>ԩSK*eii w[]Ѐȉ~rJ&Oh"As([Ν;qqqAG8998eq]vC͊W|%T̢؝w(o Fٳ@-[^kΜG?L~#͝Dzl_~}^4sf<(Ȼo_;F{x
+ 0
+eVVV)WoZm'OC/\vMڊݕͷVҺ%Kw/u4?{sg…g}TvwkիfW'6mXaEwKuGSoʹΝSTiȸLG)2aذؾ})_B\9ّ#|E5mmeǎEiu<ROMJzuO4I\߾}{Ү7_vmڵ7o|)S*<<<fϞrc„ O Wb믿۷o {yyaP,--ϟ?/;88.Ek>ҥrU˭s&.79y$h~ظEcƓ&&'cNv,dNHlxAsO
+2qҥT ؘ&OVo^?'E y-[ '..hGרQCyY%:/a/pҝŦ}s,K5k)WoQF dO<o߾ʾ9?ϛ7 +HWvUh.='<WV-Ď=* yTTi~Sqc_WJ4~Ӵӆ9\WmW-
+NIa |WYb;[LΥb sgyDb#F98ȊHr*IEE+W4jhW <%%e֬Y 1ڳgׯKWZp!ѣG|b]reMMM]]]iǑ/- ?*ٳgU|Ŭhqǻ o~˗/g>'Mg&,`YҼy~z[$n8RJv!|˖z 75 +/DE@3pNrQ9ASoʡƌklpEI' ׬I䰰Dٳ)GHfTh!4(ѻ.8?riӦaɡ%ڵ+SڏOqsa5uEڑ6_)AKoɉҚ4icHsҥzNHYIQ~\ͮ99Ž;T' 4EQ*ܪiNQE9iNQEHs(Ҝ4Uݾj@lg(|ڵFFFEIHPOo߾٨Q#ed2Ҝ(rNsr[( F~-'x')(\y*U͛N::;;ÃڵkѢE7m$|=1MLL<<<:u۶m:j(KKK !C EoH777/S̊+p䰰?-Wܚ5kHs(4#{_}DsGdҥ&LTR``@az-H=zhDV^ٳPB˖-S?Dslª
+5hM͑^zr+8n)8?p̙!hq.]ƏLsh\%
+3_DȥK@^4ѣ%Kzzz:88` q֭
+7
+™%&>}l^X̋oEo{K?
+xsj|xqa+V>b|ʕh.49w\<qļy󌍍.}qڵ+MY|H~
+6<xP֭[nppq$%o.]4nX\7y0QiFQ5kJb#PotI<88x֭ 駟"CpZt}2ssst.'Y3:F )
+:c(0T7@aOOO\\oDecwѿ֭ˊp웣}TZ@ıi""g E4wss)s7JixL'^Hs_i?$x6 o׮|pJʟ,9Xz)\9"%As1cvpp.3W_}UF {<ĕxaGD|c߹s֩ShvDy>ourJ5"pc˰l<44 ]<i$ RFcǎd2.Tv 81lAs4/Utt4⾹d(r(CQzLVAq}@#Q
+8ZXXl , Oo44n޼X<cnlQ#qF]Ӈkzp9p@D蚉'~w@*<q LV̙bڄ9`FUu۶mU(q(t? gJ\iӧ~BGf0A0aTsb ltqqA#H4z<<ޫW/ )CJ8+,VVoKsDB)P J,)%%3
+h 6D
+zV₁iNur
+
+˰8Ks +|&9iNQTEܩS'HsҜ4')*@JKK3ncccllhѢfWҜ("Is("Is("Is(4׉>niNQEQ9iNQEQ9iNQE9iNQEB⥸[nanݺueoooP&߹sGzpB~'$zˇ5OQGiܸqL5o<$$$%XJWWڅTDE
+3,uh^i+ƀ
+k٤X5= NHM=z/zO{^ɓ8 "˗/߿?ϟ۷o̙ %&&)SfҤI۷oe5aaa:(\]t7k֬[n֠ ʕ+ܹSy"E(J@0ƕ~Ǐz}ѣGWV+={
+K.mbb@7l؀-텁-1c ٳ%M-\<;;;ssc{Vwލ
+*̚5 E_ԪU X/kQ7eǭ]v1Q=\qL8,LQ
+z$~8>q&M1"}̙X'`ίSΩS/[~`%j$+ 6DEBԩSZZZzyyX7*W`׮]
+݇5DsW֭J8p
+3
+1L"ַhFqWy(D̆u։bw  .p'SN8??qX
+ TqvȨvA_~yٕjժXF:14LʇD<J-B'JB|Æ 0!00P)\SerZҨ
+\#aر5j7 `,%IhӦ ޼ys $>|cǎa 4g s,BqgEPG T
+Z\ǘgkz[ Bs @: #ͳqڵ UMP",Bw#bF&gEsԐ*48^h=I&
+>Xy&su@A̜;c 8yi0-38V<ӫp7*T
+,}ϴܹVZ@ٳgi'BųXhNNN7n6333Vp9%$Ӎ7.V#M€xӦMK,l+V sY&,<wgi.|
+I@#%<"=
+|͚5}cbQnCvQ<D\ChL.4Ϫ>^8,A^KlU4قE4!Y\cf-5
+.5Ϋr}<NgOJp>h _Lhnx K)J|+iNQE9iNQE9EQE9EQEsQ@SEQiNSEQiNSEQ9iNSEQ]r… +64(O?C|UV"HSEQTP׮]w&K… C|fm۶)))qqqH/ZM
+.ۆmmm7xWXQ|++I;(ztU#5߿_D^)%$$ipk8OOyOt)UE#+-;>2;;y:R72J㏬
+Jڰb(cyKsDzȀFHPPzRJÇ733˫9$}a4(Ns̓-bbdell'O<8QCxهF.?aBȑE
+@oތ]RY"2ɫQ1nnanE'4'O>-a͛7c^L+++<x@kR޽v&&&*T5kVZZ?V8ou?hB.ǀ('۵k(}C-55uȑJ*R&O 6lT ^̘1CYtiL8BN+{ϸcFC+%̝`70o[~ݺהaaۧxE3ȥK‚M4Ao|ɮ/.Y2/\Wݺumݺu|/mڴRׇz)oi&6":t?~^/)[,F"m;sLL9?<Z;dHDb:z@lEm+OJBĬX
+(<+q*UJ*%h7`yu366O>Yh Ug_hze63a<}8io-ZD5ie1 8vB}:m0P戋+?zR-ZP9` ';EQ-(]trr4B/v9nݚ{O?HvҢ'̙7|Q)S@nlqq#ʔ8Q-[J[\\Y/ѭ{= '"Æi,4[}ϟ?cr~#}ڵHDzzܼy3=<<-ZTbJ*adyߜCdРAGDlB*T0rH[[[swܹu)\kr2:ո{щ;-hWpSӈbbz&?}"ŋ/yc -[7YŊ zѤy:q`-=ӾsZj={xHo9c WSS͛={Vg)z?iiF&&&m۶uqq K,7n*U
+_ren̟*9ޝ47$)\{+!!!ɓ Pnq^$bIsҜ(]xcIǎ;ux@@ 9iNQUgaѢEyNG9EQEEQEEQEEQiNEQiNSEQiNSEQiNSEQ9ih=H\
+oÛ{mum߾ѱlٲ')(*Wi_/^;PѴi÷gi[?عN޹32;wܾ}J*>>> .tvvPy=GSEQ!7-{O.;;8q{ÆȖ-]]"};v 1m/ҥ uӕiްabŊv(4ח\μW~Ea \Cʯu?.8(o4_S oc}iw;Ԯ@92EQh:u›4]][LkZަMR6:vLYBϖ7')(*i~h-+Qِ4(FwO9EQ?iB1Hs(* &Ġ{@EQ4((Ҝ((Ҝ((Ҝ(Hs 3000000 حNsi8CA @`:CA @'r
+endstream
+endobj
+871 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 666
+/Height 429
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 607
+/Filter /FlateDecode
+>>
+stream
+x
+endstream
+endobj
+867 0 obj <<
+/D [865 0 R /XYZ 122.806 747.976 null]
+>> endobj
+174 0 obj <<
+/D [865 0 R /XYZ 123.806 582.93 null]
+>> endobj
+868 0 obj <<
+/D [865 0 R /XYZ 123.806 543.312 null]
+>> endobj
+869 0 obj <<
+/D [865 0 R /XYZ 123.806 406.095 null]
+>> endobj
+864 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F39 618 0 R /F44 651 0 R /F43 652 0 R >>
+/XObject << /Im40 861 0 R /Im41 862 0 R /Im42 863 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+876 0 obj <<
+/Length 1957
+/Filter /FlateDecode
+>>
+stream
+xڝ˒D jH3zr#$()
+9J㵈FǻOdi*.VOwOwOOơwwͳW*((Dyj/iw`˳/۝po;&*U}arkЋfI*:v}U@ ]ޅ8[Oy{y.ӅŁ'ael^EQ߼ }M3?}^E򬡷S*RmlwqTuU`JWD2U~c8{4R7_;fm yqzxtx"-k4LmGҟh3#S `V_Y=.2R#G;H˾/VK `
+c=NDD4Xh'^ Xu|#H&-8C F
+FAy
+K.TU="Lz*
+0E>P8P+K* ΕpvLCC'3y@2T#]գ7.Rjvr 0e:naX1'ہK|[~Xa;}Wq
+qVY KETRD,3RϓUI> ծI
+kgjpgqRU1<`\i@.0W4eyԑ_8r4ف ȸcdBHf8`&uW9 Ep"aˡ-A> ,e%赀hg>H+V8"^J F3SUhgGm^{)I~薼W7DXs{2/+-\I /L3'At(dÑqIb"<yEjnv4sZN9 Zz4/nbr3|Ci[L[bG!nv6zό{0H=POB z +." O;3 TO\Q2Ύ&ZtψC>M9Zx~0A#WO$J#V!\(Y> łqҏ&Q+̙LК{j*͡ pk hxwdv{aW9  =Z#+oShC4]>t,2%w4ńMϊ8w\soV+{G[cNc5sIwTrmGg~ N$H ٧>_c^ #`|Fg 6udzJH}2x`~>k
+endstream
+endobj
+875 0 obj <<
+/Type /Page
+/Contents 876 0 R
+/Resources 874 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 825 0 R
+>> endobj
+872 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 361
+/Height 269
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 19568
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 361/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xy\ǟB
+"VW[rd} q7!Cf45͡u_¦W׭:;a>w~ZO@cc% A^?9ԦOV]U~hɇb/tH8Nb8auDеȤvioWIv9ﴍ¬gj'I#.a
+"秉jխ7P+:0m;
+}lj {F{j݈YہMIxܥ?vhǐDĖ`ǐ taK~ì=9EJk[Yþx%}=DҊFVXED}!׍mÖ
+{("1 ~۸(.+*&:khG.Jߗ^;kwmBq
+\M떨/+[G]1}&<±}<aę4RHI{! ¡ ˺Ysa柳"k#Y2zdS#+)|]jm+ (2VdqCl~1x:EߵdS=G=T̪VqN޵t 3~8`hNbM0QMf]RCs![?
+m1 ߿)Gv,KQJЂ8ϫybM}Vũ0dbD݊UF
+0lA ԩ h8KHza^(VPiEb:FѤIA+ "J 0C
+ȗڐB.aHF1LL-]]͕'$,{G;9WEŬ̜}=5<4xP{NȰ9XY{$$T\~JUHXV2[V\\ÿ1:@J'HLx؞(X̮4
+
+rss۷G
+\nMMk*e\\\öw8p 99iii)))'N[n4ussͥ
+_zEm8;;3&333333##ѣ{;99>;vyZCc)S7.55ի .2e
+}oܸ!Hy?B7t㋋kjjl6ɬػwD",ʥq~猌իWS3hРSN]vM$%&&Λ7ϰqZ6 ~ &;رcKɇfhtvŊM60a¼y
+4Qw7$̘1#>>>""oMJJ3lnH;Jڟ\Ґպemh|ô?mll=v\~ݝz?66666ihY*NQA=z=ԃ }9uU
+
+
+D"QJx&xxɉMTJ㴬^^:7tjV&~ݮQ7npqq G===/]GiXF~ `Guuu]xE-P8
+Ɔ @Ued<
+tذY*E˱Ɨ?ɓ'Tرck
+F LFJˠ0h3 I#`fͼr€>RN1B0
+_ZF3T( f1)|||/[lmɓ'/^XGCaU#VFfffNNǏnj3i$Ly݌H~I^}%4Z;&&&!!9;;kX֭[
+
+wtttwwOgϞi&<55k׮#Fϧ
+۶m9}tj=>lŚH';ߩY3oWWW//2Fz@ /
+Æ ۿ?Uegg'RDX4<
+
+
+<SJiC'`<h,)))]t>陙Gwqqy5ݻw"_' }ҕ(_ѣG>>>,K(FFFv͛V%ph$42wTUUx<HtŤ$jQOzTTԸqƌ߻wo
+#&
+C7 0,H;O0DCbfiӦ={z?_`V>}:!!mڴIHH0H;
+
+,Xm۶]n߾}ƌiiin0c>l,f~[UCg0
+[lz*ڵkwءvܸq#444""
+w_jVSyy 6oܹsG7nUkJ*߼ڵ QtL,ŧ^a-D"CBBN8F8((0/t@@.]]
+ ÒI7
+h޼m1SSSv1bĈz?%f"R Rn_;Ӄ[l)/ɓ'߾}{vv9۷o?''eǎKOO߿?uyWULggϟϚ5kժUxbڵ'O 駟TUQ<---))СC7o޼uUhʔ) Ϟ=kӦԩSFcRwwwo;wnذa
+{С
+w_PNNN,ZA֖*0Ln|]%5
+B(yTJ֭4xYY|@-**JIIkkk[QQP1KxxxVV⒨W^ݰa|T.[SSӤI}QPzn<HKKKII8qnrssWf:;;3&333333##ѣ 8ϵ B^1eʔqƥ^zu…SLq>:~7)Gkjjl6ɬػwD"*xTT?QZZzjJq tԩk׮Dy(kHY/8q"G???dDz
+XbŘ1cbcc[n=}1c̛7
+zeHJ`22
+Ov l,K.)^p8 
+4Fvss)*?.s~・wΜ9EEEL&s
+>}8ۻ1$%
+>O"H$3L&痕)-tssӷ抗E
+'
+?G,ްa
+!R)F2h4 gi$˷џ|'>}cǎ˖-_PDOzX) 
+ FU_eD>z,DiieuvکBD>a4CB tƍѣ͛ ~F2谢p}|1 1cƌ3 O-v tBv#Zaq$ iYYϽ;toԬF2bXv tAxP#`5>
+^|ݐO{ t-0pP\r`ܹ&L%6
+\`*{oR/1e&JAMkOMM ?|3Oz t0PP'M~޽{@
+ d/_OzOtҗ/_̘1cȐ!oְ:NLL\t_ݥKn\I4UU/L%gΜ 314l2!O͌9cǎSqꫯ  y^z8-v'dːh\P(<wܺuΜ9cCC&{A z9H;`taGDD믿"ӇNQUUӯ_?CfMXv t`hL!>p
+
+WXPiu#4)YAS>жV#c'=&&&!!|r͚5~ӧOccc{?M6EFF'=--ӓ/ƍn:J)1sLu3Ɣ>馛 Im۶mҤ˗ZC}WZEi̙3=[T+>}ګ 2o<
+֭n jfQw9φhbShG0 H$Bp׮]gXӧOq_~w
+PNa|9kG]l6Mm:)&B/U Shٳg9IϞ=6m|P&ca<t{{7s
+I[j{)O:|葯/^je}|ҭP;> 
+-4$k/N֭[{բE]d
+4fA FF,I9K|prLFd'O"1Kyy/^<xp׮]`…;w
+
+PTZZX"
+80n8yIYY7hkk[QQ1x༼3gr!C,ZҥK=zr&4fA F*1=۵a24FޢnذZ*V*)ڵ={&/~Mll-RPP@mx<PիaÆ_%99I&ÇOOOOOO7___ H;Fٰ3fi4:VzK8 m'Nٕ7N5Wڴi/bwyy?sw2@ HHH`XΝ?>e2
+ǫ2mCkv Zj޼a99I٭,0AJi5#FY40H;8|X0 ykEajEځh,888qEh @ H;. @ no+
+0stUo h[g6aY`Xi KϽ+c
+endstream
+endobj
+877 0 obj <<
+/D [875 0 R /XYZ 80.963 747.976 null]
+>> endobj
+178 0 obj <<
+/D [875 0 R /XYZ 81.963 712.73 null]
+>> endobj
+182 0 obj <<
+/D [875 0 R /XYZ 81.963 646.085 null]
+>> endobj
+186 0 obj <<
+/D [875 0 R /XYZ 81.963 561.339 null]
+>> endobj
+878 0 obj <<
+/D [875 0 R /XYZ 331.029 524.045 null]
+>> endobj
+190 0 obj <<
+/D [875 0 R /XYZ 81.963 346.582 null]
+>> endobj
+194 0 obj <<
+/D [875 0 R /XYZ 81.963 235.269 null]
+>> endobj
+874 0 obj <<
+/Font << /F25 474 0 R /F39 618 0 R /F16 475 0 R /F44 651 0 R /F43 652 0 R >>
+/XObject << /Im43 872 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+886 0 obj <<
+/Length 2379
+/Filter /FlateDecode
+>>
+stream
+xڝXYs~[AоxZ'&>lHh
+ґI$IlvoN៛5Rh,Vq7<rf2t{n旋 @U2ؖ. HlBS@[XC.u!Ƨѫ@ƑiD&p")pa ԰Bѿ5kYO(ih)kQү a4V2MIqআ26[vsšUJT2>fB1?}CgpdƒB=ZQZ؊Vx](nj,(A%x򒭅t5gL洊 6Q",U*|Cu-Œꡩ,G|K) .
+״屁J(@8)=X,lgՑb@xit"%~#-/o 9oLJ[8#gJ+ԂU T_x͐w}qyYN;"l-ޯu{Xr;B/4S,I /}^3!{,ܜT;uܜ^DQ'tCܐ 4esBs8B/F/SJźIa0/ nep32#GQpY;, _4aΑڠ1q7qWfbHI8kfxd{``( syxǤvfgiV8&^U8_ {*6n[?=Wܭk .k:&fEM!lL,T^*P
+o,u }ۃq#~烦rHp_6\q aJf21lH8V8,($~'dp3PqH8M{v䯁L#cV;0k۾t޻Zv@q@F}h筏sc2/AS18RW6[^ #%N\h
+]k\uw&J9b00HM^J(I[Ф8D<n6މ14>Ĭѝ5$0bf6 `j"!G#P F=.ӣܣ%<70dj>,; =u3o™NV(V9nlqC~[E§~2 0l佧>1=74u8W_JȪc~YSm+I ЦXcds-;#91ԺIbJ:Tf
+-1q^1kzzTəNKމT"ԭFBǐd>NA5Cr䩯8shTScVYpGJP#'PkP Ў[G+]vPA,$3c(TjY˱6
+dg⑊J WhE:hvmy!Liϙ
+ZC
+3xeNsjӠoI Y1;.O);~0 X51=Ah;RHjڎI c)'Ç` ֻN.//~C;Ԍҿ^g,dpLA<L Md'̉] $_غjG9/qb,:2~Q.#Ѹ(Co@OO8޳Wz|Ko>{U䎍 V~#p )898-Ss?{c`}})RrGҘ(ʅ $D`wjet&d]%EG駱q`Ԝj~C< hirʼkhĻwnæhS%GܹL ()Yq:o}-;I@Xb/RN_KၟAnAfZy5$ykٌ6Sf[ljt
+endstream
+endobj
+885 0 obj <<
+/Type /Page
+/Contents 886 0 R
+/Resources 884 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 825 0 R
+/Group 688 0 R
+/Annots [ 880 0 R 881 0 R 882 0 R ]
+>> endobj
+873 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 340
+/Height 129
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 10301
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 340/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xy\'D}r5"^E*ZڟxVūԣO E(E-
+TbPpH6!H6al~>|>̛7oewfwޒZZii
+|
+U D>4QM&Ȳ(g4Z yh3UL=,b4\.7DNZn>?\DNӿϔ>lk8JvTKc适z l Xޘ72r[I$ɓ>|x(_f,Ô)?N(/?~6
+^Ν;jii8?j&9qdkkRTT~G~pĉ7nyzz
+OR===0޹s?'H?bT#;5gΜǏKҸ8GGGwwQF)((9r.??_ }MOO?{#G"##Νkkkd:>jK_3A#/^<x~nر***
+%''ǁq<x\QQ
+8Nb{?h̛7QCvvvoOFFHҁ׼2L4СC,kɒ%B
+fb8U\~}
+͛555AAAKBB#G'O<~811׷k}
+C_3A#
+kpkA0I}PD`?S#?hMu T2!c"!qB܇pQ}m>9
+ܼpBuuu
+bggwΝg#""H$҂ `FFٵkB4iP^QQ$''gii! Qi:H .ztw88u~VYY}zjҥ詺{⬀dYf۶meee
+ft""
+ &&4PeeexxxkkWdd_~yYSSӰ0tn(fqȁ 3g455:;;"󻹹 
+ fϞM@`_ Ax͂@͉8]FdwKrtYshD‚0S
+k ! >a3jfPk
+rtcXqR\Ky/oye:9mhoo7&K8y,t`PL{
+kdy؉ |NkDu_߯LȢ39ck렬K5eeϝpoZZGի˖9rzMaa ,dߟ|-2jEGGS~~/|'
+
+kid.V's%'')yŊ"AWwD)
+k2}wߛ
+$u0%((/aAرcAAAAAAk֬K#=66zϞ= 7n
+m[n8qbKKKll9s4DёLKK,:]]˭ޯ[NXǣGѣG [6&&
+DxϢE09s /~:⦵UHN),3"1FuM!ؕ )? a١Ț?<ه{
+Blk_‡6HMMW_}n:%C@>h$qpc2b77h04ˈnISj9 )FN
+Nx۶oCe5
+˕MpǷ&]zUpe˖/n??V^MǍ_ܻwog̘cǎ N>}޼yG O<m6CC3g.pd]E<ʕ+;o
+N 'pcƍ0Yqqx$(..nmm2e
+
+endstream
+endobj
+879 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 526
+/Height 361
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 893 0 R
+/Length 40244
+/Filter /FlateDecode
+>>
+stream
+x\V[E)iP 1"آ*%bUFi T, ̼3^s%䁽> >Yg9dM2M˜(QDe_idzuD%J(R0aUN(QD<}*
+]mھqxCȏR|Z(QD1vm++kT0 _ⵥGȆ}̂V4b<ZEN_n}O%J7g96iI 3z×/_UUUU0I<}ƍ^Zf, lױ+/0
+ӲD%MYNM)Iͅ o&;w<}ׯ3 .0}{,QD~Siv}˫3226nܸlذ!!!R0f;U%J(or2m.Uϟ??bĈ9s*tq?y,YpѮ`ӸjgaπR9.fYʱl^hq={@=5 Kܘ| ^(.++8|2dyyy///B"YpIje%,P%eٗ.MX)=.sSPi>EHTb,:]PX¨%HS?);TUNzKe/B-]bwDEdՋA"bRç-[v8$oQhg0̕711iS-2)|1M1eL s&$* 7xf xwh!aRin[uJLZnYnM{ 
++7t>,|s#}]SL# M)2|{${03טv!@URZcjwFiJ3t55YT琤% $vϾ蕝Ek Dz=-+OL޾ke8 giJ+8(@XLr˞#.a)xQCO,68e
+o9ܴǪm0Z ~lqbڔ_YriZUM1X5C qն2})ܘ>ԪIII222
+l-
+]}oX>vڲfEV;&:; Ow Op.upl#;4w?ݰ hѐQ|ϲM} Oxͤjrs34EĤ{K|&}3 yLnbL׸& 3\Iyk|Σe]tU&Y =}JAA#q0FYo44&1rJh:/;azIWG7 rLM[c6j#Y[yO 7wokt^%2`#m8n^3H,'ñ]7`y$BVxs};3gٳ֎g'/@T02&+M̂15~FQɱ6ey[mReNWڝj>LЖfwq?%(,`/g^vEv\0_wШ)cv"P3 d^i==n=gկ
+ #\Zg{bIg/+?%`wv$aQqft8ˏr2e)q?ӿۻӜ
+o
+2,0__p$]pŞV'J]Fb/BVZdI;r8+ GIpeYiwRPXA#gjQ}86*
+Á;gj7G<~V_.,k|Mf'\jܼ3WxǤ~9ي] ?:dyPHmqi-`TL[^pDL\92K[_\;D\F&`g,|M");]:h
+PBen'q뺞(@ -je\AnGiet"<NJ;\n|,8 =MǷPVaUF#]+]6ylϋ`ӦE,czKa{j !o/.)IN¾:' ԢQq gHy'R_gmc~+l.X/Hqpť퐃qJxϘ%JA)e[<2ei;W|8$$JU=z?i&,*!%#&)+[骐{:Sԁi侮_–kg@nUIsdƽ ϖ"8 poϨMegi
+I
+xڜeR&)f~յGN[xhT,
+={ 6dxFZ8;@bBr~͛%YۭʡjY8Ӱd64;F~60^{dÐ <+&m1z8 Q,8CO tX_4爌.abΑDĥ,\6W;cà1ʇc{Ӱ^P!0=bx*N¾:.K˔iGUс|vܱ87X.[.z7yFm׵k Q:ᦟo9/8Yw!I_cþ :=(˦@Y2Te{˶]~TE9STLDzETo?|,epoIqn'O6ZI}j=XiHC)/]gTx SUI)IY4{-^Yi5i:Zu_vN_Mq"4O?7]֔gǩEs!\ӊ}Ey% %f_tӖP[bxqoD:V8Į<ki@}*)/vXl!1]^gYhafSqqr ̵[kc|b1 F.MzE<YBl[MV!W3kJFAuLj#YJ~ȲMB
+c#<Nu }
+KS]7g}PWLi(rjz9C-ç-q>j3 4EzXk3E}a!%+R
+cgySä[8ebb_t+{KQ4vZ&n;y-SskSBQ ގ:v'9;n6$#yF4 yNEb׾z*3_sbmO~S +>/&=:-*:<(k1a;5cD4BLVþ Cdci7vK5 -q٫Lyd6ekZVdwH[U}YMM;D :
+J<bPm#Qaby䧵{\qu9ex[XjVRޱ.DE yfEL4g|sۑȃ}x
+Vޱ>G36퓕W8r<Gj2K{6uLgtkMm\-ȜUj:Eij ?&'6y`Mae"a#9b,ʢ"dڤ?"o>ZKk\n0޸iJ˘8jtm2)JiY>mA®;FDejorre6M9̳/kƈ\`|6" GnНiZ{S"s"h^R?Ër\lzM?i\sT6}W <&c]dn ╟VXV|cZӼSEl"
+f]47VySx3g tt5nvލʱp@ BnYmo46,있eaӰ/ô-iX8:}Uv^wʣ}hZ,zۍdڤ?}.MtLOԶD?}OestUxAVrEŤ4BtevYiv%\]瞴-%>-KËCom .[4ث^ۤ;nL[$~h)QDKK좯9Fz(Q~T&)A׹_&J(QDXHG"D!BY(XR!BB
+"DZ޽-3ӧϟ<yv{YR!B><.-}Yjj^݁l"Dy8qƍ?%%!BHAs粞<?Gǿq +***Y533{gPDKKmXHHHCC#77;;;~MRR!9ӧ3>mEf浒?/"11-7R(((l߾]OO ӧСCSRR<x^%$$)گ B
+B
+"D:\p}dSRK׿{o/OX"… IIMI522B:11qĉ<ǧKmmm80n8*ٲe #G
+
+
+xV֗vf``e:̙ÜNPLFFˋ2;w0,-,,,=Deaa!'' &ZCR!rˆkrsz7ϟ׿xpతޤ<<<ITZZ*""ҿGGǩSGyNqqq ::CB{5~{8o߾ <jݻ7?KIIc߽{veee 055&)/HKKO<!mfD$'&6ѡEUˊyy%)㎔Ez‘LgA|ɒ%ܴi>˜ӧWXQRR£6a,..Fi
+CCC˙ov}8Sz$?~ 'OI
+VYYgϞ1P-R|WR!r^^Q~~'bS#ƽ; ="^<qzdzOLaN9EZB
+GGGӑ>s ޽{&UgRR.]b" +줠um'ÕC"Dt t*s;y_J~:%Ӥ'e~?-0hPiJoRܻwODDd...ӧOGG1cЗ!ׯ_qԨQnnn(޿oƛ0Ϸ@ڵkH(**s$>~#\B&m!&>qa^ ˛={H^\\^<..nȐ!z_
+
+
+>6?GVVsiӦaᖓ)C|)oЧqV`{)<Hx񢒒A8pI
+x`e;wd<vذaèuKjM
++))iooOQ(얖IQRR2~x!!˗0l=$@|WWWW[[-n:߾} cEUUU666XS0o޼qrrB`"!!aȑeee0bb$#Hʍۇ~*bOE>_xqʏ_,aڤn$44tԩT hc_bcEc|ɓRj҂MMMn9Rx>SiO?y
+~
+ӏ_:%ue`ժUu"݁k֬w >@bb"e_|Iq(j5 r-9鶒s:8{㒟D/=ollDѯ_={6,00f'T`?~xڇxyy-ZHNNn޼yΝϜ>}ZAA!""iG=7s!m:?fmrH%7 fJJJS@:>>+W:Da%44544^;wз@!,E@1'"DR0SlݺpD̜K.=x K0aWWWikkkn^z54 {N"D!ؿ?uӧO%$$<==?~\YYy1117n0FFFgSRR勊P
+sr޹ s$$`vBC
+L-,,Ԩs2pfffo޼illϟsߚ^Hy7orч={2/=nH
+n )& BI!,222;WXz,ܬJnn.i+""bԨQo͚5ԝ없[<s;ı6!ۄDtBRHIIQ8;>>gΜlc999#SB
+"]uuubbb]5ˠAΝ;G?|
+{Z.&8[RzԿzߕMz~zlk < 5~Py`k?Nx|NqIp]C|Jw<x߼Ѵ3&>>%;)XD{N~|nOb <V}ljL_jM
+|>9?8,5ԙI!//OAۣF3?XM),,7n\f^7RbgeS&)-.T
+?bQ^uEtf@,s
+ӏ 3\9*ق)$,^:/^ܹs͛׬Yv𞙓g;\mQc?39_F,Zwh KCo3*qgOϡ{?⧧'=lP'`z&((ä@% tW15WE}ء%:*P*Eϋ`>k?c9y#gpO}O9+wޱcκuVXh"_?z}LB}ţꝬ_ڔx#!y+~i:ܺ~gUO}v6i}w"ldTU@0iyApp0H1rHSSSII\xGespp -[! KL>p@7~ooo4G:eʔ7or$ETTĉ({ttA/^SXnܸ1gssstupg!ER]:H8v##%#eiEĕ#Ǝ[6'ڇZrJK!
+fO+7D*6m<H_K@٫^z)R
+WiH/**RYQL>KqLTRRJKK:u*∲2iiiIߧOZ555x
+nݒB/_G(Rb)"T@LJLx`"v"&`E72r2dzW1>w:^^W-ʂQIQt%PJD\9&^:kč2r љT
+ @2T}<O5I8b( fUUU'
+]֚=\{Ƕ=_hR$F,B;kio{ѣ(6G 4IA=$!!! ```
+ݻw>ݶn9eID;[S[2>bCLB >V- s*a'ÿ=CPoT:"{if-KBBJ-z!vomcm jV1NÇ#|x1"55D|˗/¤yA=L0CX ?Q UGXRIL?_TY"d盆:?)璞={FOtv ,8qb S̘v=4)28pHk׮1c A
+---iMMMgǏt'}:$[M9ϒJ(RXzXK:Rp!&Sgҕ ja98}: ~1tx"Euq-mjfLD~;&Iښ>k|oL2eltIR|3puEIg<),Z{mhwLConeo4Ǣ
+/ u
+m&):;k,YRR ɓٳgФJx4Շ뇘m۶1c
+P `^vHGAn݂rK.SݭK_5S uEc6X}T$wi_Hk~'M0 ܃YSP\C S'PcN vR:u
+Q#Gq`YVu>a„GR`~p+|c8nF)-혆j|%y-3?NV՗u.C2|?"ߟ&Evvv߾}1#SWWG444MMMn|NQ\\,%%+ z&l&)>'Obt' 5˝+<v&LkNeNA+w%
+#fQtөB!1oFjiw"0,ƝwwB·e>dT+{ʉܧ_c,߰خ}BfeeEx"n*LII1//+{?z n[bCfF<^ڬHnb,j':n:O~i-+_C]=(daaa ===9>r 6
+ҭK3g
+E SHHISEE z/]o]rŋ1|6mOQ#ŏ}`q,n]G@O+v)ӸO ~֝=̿ uNR|\tz RP'ZYStg߽{wAP^KK-v̙SLA+5> {lcCh7vLCM/ SD!CkR~:;;O>Fal_Y<U{Ϟ=e˖竪N6m„ &M:w\ E5#)iWR8qBTT4$$]{_5L?|dɒӧϞ=ϯ<hK҄D)}]+WowRmK|M{t>j RR/Ro' U&.O#B]^0IZ.m~$EKիŋ tRvw% J!E J466RWdXHJ!!9|3O!+ZZZLR0s>1aN 5uM|8oR{o~WB
+B
+B
+BnKwÄ ON$E)))):):Ux-#GLKKꤤAA -]1//o邂JJJٔ1!!aȹ|rFBOݻw.[ !E '|eeS~v RdeeIKK_tÇ7oٳg`mll >}*''\VV6]vq3R).^XSRROkh555H{{{ÍO2͛\zUYYL{zz!;::ƍs177>c^'/Z<xp}}=Qթ/n
+
+%ԽO}t钏<g555
+0#abb/P9aݏ?vXbΝ܌6_{) )hd~UVV;""v닊***0}BN
+B
+B
+BK~MWWwݺuO<XU
+B
+BA =n 1)~!BξʝTBH 61bbx{{9ߧ hgkwR$Rt#)))):T0rH
+"7OMMM: )3JĥRRtU&W )n߾mll̲ļ2M9!!!!E"8.wɲ1I9!!!!E!Eee7NH% 蜤
+
+A)TOI!//O߿?oJnn/BLRRt6R]})NAHAHHNNfȜ@HAHљIB}">@@Dt{{{c(0eʔ7o~lĜ9sGI2x5k۷aΝ觲N<I堠
+ wԩS#F@N{qq1!EW%Euuzhjj}R"??_TT4))DOO"[>!;w.eQRRJKK$quuuss`]p\WWwr"222rbUTTZI3#::cΝkׄ]bbbRRR
+8w}t˗A߿$~DH8::jkkSs8p@KKYUU +c
+ (,,A0&KZާn?BA3goIRڵk̘1ӧOWSSI1rH*+ ,8qℷ7pV")W4lmmi D"zaԠŸ;&)~:) ̛7oԨQUػd+a )u
+J7o4IA#):;k֬˗/wUf|f13x)ǜӣ)))uuumr?>P;;GR#w")㣡Qu7)9XYY *B&Evvŋˁ rˉUpBUUu\$'++ POOv)>vK$S}B6'
+I.3RR٧db'):{))B3!ʭ[-Z9DHAHAHAHAHIظ|ruuk:DHAHAHAHAOIqR{WILAHAHAHAOIаpJ&)]l0RR#))رck<$**jƍ,F
+B
+lذa͓uttlS!!wtR*-//>eʔ7o2|g_$Ųe-Z$$$nj)Jjkkl6IJJش)
+
+
+p?{ !!a)>v?L
+xuV$JKKLLL
+B&>6_{;88PҦ<4)4Mp$رc_X]]݆*''BEE6KLK/_XbܹׯoS|<!!Ec
+`׮]cƌ>};)8.IL6-))WWѣG%ƀNTWW ng1AHe\\c& aR)7o4B
+nKiR ̘%%%aɓ'gisRXYYikkS>
+@<S`IqF
+ȗ/_ٍ? A 555fosR`հ.\x1D7v):`Ν쎝KHAϲƌOΝ+++;uԈIIIx~1ǥ4)ttt@AAAd@@SP/YDXXXBBBOOL?7o$&TdӦM?^׽ַF$E6!EFFu{%)HL}% ~̙3HZYY5662SRRRRRt >RRRR)~́WUULlNH%B
+B
+B
+B
+BK={t]V_GCRtRN:U]]}OP `J"|EiiiHWcrQXpBjٳgmxh\.!!!E$ŏ񜜜;vp$E YNP+')٧I)~)>~ /^DСCS7) |v~g+]v7'w?VWW;wի7]<N=xAHAHAHAHAHHђsJ] ~=ޤTV~zH{ѣG̻~ܹAllŋ )-˛={HS}?\TTƍY`R,Z} h[^)NcM]>u#EXv%EQQQYYٝ;w嫪)ڜo߾Ŷuss6lۜ555 ?IIIwEHAH槤{<J{;ooVeDDڕy޽̙3g#ʀĉ#F”Tfgg})))eee1Iqʕ믄`
+
+
+Rh|aŊ6<xp}}}ttA>}J@[[[CCĉ`: )-[9<b7?1]smm-[$%%A#vm۶ݛywԟ;J5Mv=4HNHq
+vXے QtZHAԘ1kR L@^:U0205j&4)P!⑛7oR0~32ڟ:;; hi0:LR
+BQOIޛΪnPղwRP>bF*++{ &)TNNܹs#&O q=88=m+RRRڐ| ֓DPYYy1l7nPNW lҏ_D|:@dd$bhƏB
+F5kg MHѵI0jȌ3:y&-pemx$EEE`srr` fΜ)##3i$x]ȀڐSdggϙ3GDD{IԊå+(( /\i"}T,Yj1Lzzz/RRR)36͟fiW<MHAHAHѩHљaAHAHAHAHAHIHiaAHAHAHAHAHyH9aAHHAHAHAHѩH aAHAHAHmIjT _GuԟRR7)0qoǣw5
+>$>:,!)3:FIOB
+B
+" BN.-<Wy%g:RRRԃcǎ ɱݻ,cccW\Y[[KHA‚/Hs"=="44TLL,55&ErrrCPr5,,Zf͖-[)tCXR))=*OOqqpwv>vFB
+(,,:99Q(Hˣ޽{W߻wOBB6B ˗V2|OӴշ`f+V'$$R&E^^l Iaooc*Mt w~&@[8Xt0)BB┕zxD޼o?>A~߯9>00)߿/ @BLLL 0lzzz>}j6m)nIHݺMRPPдi3-,h%BqF#q|mǓɚ~~>|ɋjhiiGϟ>}uh
+2p,jkk{ٯ_?KKgϞ1f̘nS9sWy>>>.'c]ZZZ/YFiiiTY\]]9 ,Ǝ;x`쨶,RJ`RL*(LP‘/;)jjj~
+)˟ji坕uڵ?KK޼x}CC͛O]\—/V^Ň9ٳ;w I])^|1h]c
+MJydܹ̰ .eií,KC@۷o# t)""31 pϘ1,v/RvoooyyyHSLy&Ee˖-ZHHHHII & ).]4j(aaauuG1[qƜ9s|
+Q]eφ>hkkkhh'6ϟ# ST:4h.^<5mRdd䨨l;{t??}++$&&S<eo<y+L^ZZϧ-'O\p! )06V{X7o,&&&!!affFe;uԈ# +k׮!)7OOϮG
+'DxKH?|HR!
+
+
+ ;EEKH &&ZN
+)pÇϧw!셟ihhFOOOcFagg7tP$4)bCUUUR޺ucN|jjjطR>Пc9V0AYi[-`2Oyy?}:h[
+-2RS6i
+gLM:i$Q
+8wqikk PFt@8 )
+:׿b|:t踊ٳuWQYoat^^^T(FG(
+?~Nr+XIHH"111-Eg w?3BT&Ů]ࣦO>M
+-PRRM
+2 ů"-- A
+91]cc6هDvR:;;
+ OYyVuu}eu.L DBhhRtl𴦦+[[[c=PW)٧Lv˜,KCOF(AtR_â];a)hI1 sqqq4)
+-qF]+Guz@Ә#(
+"H!,222]-!YYY?@
+ EDDA0C[fMuuuǟ;:t@LSr
+Lha7{TUU) N(""a*aφ>,X
+
+
+L~hK@Mm㏈_,ٹpG40Qmf,[~,65LL 
+ySH Tgy_S&MZv݇<=c\lqٴa߾Xssի-nj|"yF@
+`R|}̤hGOzK3Î66Glm8:㧖٤I<V`EǓJ''$!Ღ3ׯ\[_mVw*+^LܹD@"D') VSS{'%%D!1!"D) *)!"D:R0KτDR!! BB
+"D)! BB
+"DR! BH Iw7aJHA(V"DB
+"D!BHAdWdЉ! iAB
+"ƵAB
+"<FnAB  4ťGjI-Vr]4jffcgz^^.vW^ 6,##}Emq|#SBAAaO??nHU"/?n6{]4)qXX?'L>?x
+
+N81++ ƍG͑l1-̜<BBBa-ƦO>XYe
+&iVA6Qo߾!E˯5(17vСI_qg֣4+BCt}?sْ|L"s!MhwڵJ*(Ƣ- ])
+7R`(Q)h&A9K٢v9R|I>k&]
+bB+Hq PE,_eP"D U:ШQ#''7x_Ɯ<p
+&5`HA1xЙ)tKp?311R0i( t&&F
+&&&&&F
+&&&&&;!ҥNӐ
+b˽-ԙx9 1Rpv"*r%픒  =B0:ϱ2B|!<s9I#  BF
+N, X)8XA)8 B"ZA BCAZ@ wYݤ g>4<~lvb.\0 o""3QQl${j7S?u
+ U_NҨC#bNV.;QS 670F2 B"E'A(*M*
+= 0ܼiHJ C_p!CZ8"UnXu~ֲ t!>p
+^'"a6lP:u<sie*8jjcϨr|&7 ]"UQ(FkkPDz  7+ Hp/y#H&"eeZC6jGí& 'N<1!4گƎ)bfL ޢc-_{LSty)Ru֐+Xy3\Ar )XX
+ ˧ii~({%a 2竚R@CPtر,
+6;
+(]V׾m8tmQcǔ
+ )SA8gFhgD<,ݲrN WcǴXch^Ւ/sv;t>1oQ@kLj8 #ÊVqn,gX8pdN>|齵G|,LzX{C[{HP( R^,RSL)={<yҴ\'$W)՞cQQ"ħÊ߹ca+PvL
+ ). BA(g0P\5ZVyZ˳PhfD}^7g{p;v11VB0!{6]ոzXlu7]M@<z)RM6~i,*b[774Q幇,,BOw$ BMA-w|8
+PAd#q<ڵ
+g߸Q{DFJVcܸ!rlRtcϟ7o8|X1nQ# %6MMu͏|u,uhײʖP|XXazC[o1
+A R6ZJBܘ.;F, !ByX+:xPә122 CCMAYm(\yy5jϮx'.WR/sMCQ)LXׯWv;:;VkPmjT:Fn>jca~S gTkyDdA`A(4hsz:_MS;ڜXH)8=>  #  Hwc,,8`9ĉ! #'F
+N,)*")-7R0 AȓOL, ,,Kl:[rL, H@)~M,9(9v"_( >HHHHHHq)]H>#EEY(PhQ\B
+/9i 42Ʈ.F´R?~y&yС{Ai<|ɓ111.\x.?'
+h_Feedd<x
+1a^
+yddzb4yWtgΜ?#A֭[P.]zd$g'NHAD)}B$[``aC
+(%JHHxʕ{k׆
+F<<<wNe˖Ì4yd:ӄ nnn~a sHQbaYHAkbvBKb^Gaѳ8Hq5o%`!{@j/rll,):T6e߷o_n
+hK1cƼ+,ƍȎuqq1oaH@
+5=찖aKUn_|E>!TG֭k֬xbkv5ßc}R{T4Wʠ0aʑb\x'
+5V`١vr{K>ť,RCI9&8pN8qqoڴ*{.ڌq$@oYh
+<)mCk&H~!kUCF@![}߿?*)
+C{舘>aLq =h
+է}_aG
+> yZ&}
+rCB{ɭ(ԳgOm۶our#G?ٳ'P㫯"BC, (a'<6Fۃ=W~'x#Œ%KvZ7}
+/9
+bc!$R*9*\$Ă|bbI!mPctKb'vHAzX)t۸OAKX(L"E( wB0o}u σR^r! &کqƤ}]1ʫ.J'.]j5rrrY
+3\c+XJ\0aBD; ׯ_?̙cGBKbhbT{O!>AQhNh]B@ .
+QH^}Rd hlڃ]'R|𡴣ADM+jgtxi޽ 15,:DԆkP/G7/4ߧ8rVE0e$F4C}
+ii̙%rE5jt>oN<"{nhΝ;dJ*]ڞ";
+-[|J`4/ك=:>]͚5/xiS<x`p*T6mZӦMnENJ_rnAxވ ߼S@ -CQ||<l2>iQ;wn `׉ 'zRz!UkO)P|l$7ɡBӦgB
+onP<FF7;?UVkOXbPSG VZ8;;iFى~u:::ja<<o߾Zlk.….p%KC Ͼz?h3h!P'R;TУyOHHHHQx}
+&F
+F
+F
+F
+m=G)#E>G
+OHHH:###S:?HH)-.^Bu˰i:Z%BD&AϜ9yqobNa?{"b)pǥK_0D:+ID)X}
+#ho R,_.F|P<{!$D \~[nNNN򓍐:+VaÆQQQjRÆ+ ]v?NK׮D$ۻ.m 0Ck/=']v֬Y)$z뭷r)-CQ#//S%uJpaã4)L*R ǭM2'; 칆h'"33W1>B/޹sy +R@po߰֡>>-iҤɔ)SMVL%KbQީS'HA*VHoS޲T"N }+W]A
+ԞHd{R4j-wpp$!EvƎ (D>222,,lȑ={ğmڴA:7t>Ƀ2޽b~6էlľV3l8yr"z¤"pV5^I+1lUϞ;HA!gW)X^dtD5+R@$Y0ƾ2]kY(v1塯 "E@Q8w͊R:Æ yٲe%LMY)L*R|"$ۻ.~]ff";t9c =O:S6b
+=rˤ}+žV3lxJrB"鉬bhT|G5_;
+ زE`whRDlǾV3lZrR"gn"`|W\|NM#U1:#-".QFzA,8͍VO-yŮ!\gp*5k֤HC
+O]It]. E+U+7ި_|@$?( dJI¢SZl"`gO[TdDٵdN96<|9Ra΅OAk"8o`#Rz.X$tʔ)o߾ݢSDµÆ{zz:::9r̘1ڵkCZj<~v&u9˗/7A
+ jԨ!ߧ>w!Ez-d{&)hy }
+c_ۂAmG
+'Ϯ$yhI(: Z
+f /TrUyi-DµÆʹ(w6B^gn-]Hi&CBLߪV ,2ʕ+wNR[#C_W>d!bp†K$_/ZB0)qdWk9)lgqSXh Ѫ+WwiJVQҷVs)6n}PgQP#tKjդiҳw СC)b{޲+F*lDǣ%EY&2׮D:՚d{ R@R/^D={VR
+?,,lȐ9rvvvwwhCP L!#ns\#b_+F*lZ&M%ɮ)6\ͻt-GHߟء/9R
+<D{_d׏v]ξyvZTjՙ3gҞ rDl(&G
+5j
+;ڌLLLLL)\'
+& B!<ۖ3R01R0R01R0R01R0R01RP:mx,c ^j#ICݻw[js…GQmGK%RFbwaBEvÆ5^gpvZ2]v8C  ) B7Ap'Ah)fAh$P]!TAxx.:t?===իWhʕ+O4Iȑ# psssttlܸѣGQXtiaÆ)nذŋ ٓ2eʠ&M\wK/9;;׭[7 Ə1f͚x&]~W> <,ԩS R(FPåKbu91'ӧ333Qx)+Wp>ء
+E. B}AIU_FѣG?A;x z1f̘.]K`/_{.Ě5k ß{Ç9TR... (oӦ 0?,WqAH6R(SIkR
+ D~
+Y"PyLBթQ6†5ZPkvtM[Pp0D1Irbrr۷PPQ$ݓEgLDTUҕ"[)ב\ϽP*k=b> A/RPYQQQry {P(v
+\Ŋ'N+RhD{#ŵkLCDC_N"Znh0G@y\\";Ņ|ϥ|It¤BE^p[2]v8}UHh0\BR0OBu,݊.& Gɖڄ r ZBANF r.H8~xRN͚5̙EuSd@'@̜973ߧP%ҥ I-4`
+.H1k,hO>>nQٳlق_V
+Z]u5BV!b;MA@OjHJuX}+
+:w@iӦUPGڵٳb#!APw)ȑRA8&8վ}\@u*bbKs)ctΑV5 N)7ِB
+M m]hN WkUHaN!ӵk) 5F)(t%)LNRYT&H!1><5
+d)elLөY~RsF
+$rܹ둡fʫ퍢K|XXt*݄%KX,4'hc2exv0IO8QcBV!y;͛ڥhH!.@@
+ʘWF_>sիW fsCA_M1b"RB_|*xv:0퍫a)'Xtjj,A#:%ETB
+T{j&dcp[6ܤC+nG'0ߧe{x@m{dS N~\NaD'jAj&RDAڳR <7cb< R\`٧ƌ)'tc9#2&ݺu,R?tJ
+ZZ@0n錨v m+W6D"""O}\]]5>)6~Ȑ!PjUdȷx&Ѷm[|K,I~SךM:A)`P'_>S@Ῠ:<<`Rl9spe~ P1#5=˖-? ,܉:q#,O#2Ҏo)X Z*1Pns$T?Rj‹b96\ÆSt'7>3Rdwgۮ^`@@
+G@KHaZQ
+'':u{BCoZtãy%J@[hl'gyfѢETuJ` ꫯJDm.^8 UVŌD;L6hs4&F
+F
+&F
+F
+&/o)_!E6ZHHHX*, >ċz"{ߧ`b`````b```(,H| C@k'oxQ|-æM9j!ݻ<u<,ZնGX%tV
+a):Dl1'Np)߆۷86z!!!Xf1APPг>crj8jԨʕ+LzӤlٲ{N4IWZjI%իWWݺusuuE-[ܵk>}CŊkذaTTrԦtE-Rsj~+[?*#ظM]T`JuIIW*PW>>O"</D
+qqq{322mKhjUu<33U
+zKΤO3R`d15kV. ťKC iiO0Zʲ ò~PYR/W^J#4|pp{xxtޝ EŊ;S" )|jUS)SL6L2%KFyN f(*/ڷO*UTp2)!E+R
+#^~7Zz1'Й )-L2+2]+:h bZFX}Φȼ{/)Im .*).?!!eMQ\} 6uTA t1eȸrٹ$dB `Z*5#00 "!...1()^|
+R^;!ŸqpQHa0E*RHϞ=Q8w\Jq!L<rGA
+ƅxBBQ47n
+c5(L{G6mDa~#GijGbXA yH_աEH)g 퇕NH~MӦM-:>+L1NqVB^
+o*.wu\Yi >ҹ=
+R@GyoowV\|@ƍ>`,Yv>WÐ>vjx[-[|rnS]{ <t6c#)Im ً:N4D-iLx)4Y_}1OȂbqkDcnhGG>`ad#Dݻwr ^jڵix@s&Hyh}
+5A@c2w.U˗G?Bܹ5N8 Ѓ5/=K8j^)!
+|}^@A/d>a-RdD4-Qܡ?>O> J)Cg
+\$S:NF]d0ɳeKuH?ŦRstppxwcNV!yїt4UR 8^اxxŕ?O 
+/2C_F+^K|>"ƍ nJO|<~,?>·~Ms6ym'jp)_i"=;ҷ3
+jgBW<״~U_nNBO Ra+F*ݻ]ӦMB1]]]TPF H}/6χHjzg`t2 dHSZMQ#ouK[RD!ṾCQB|p. E`
+9!,_Sh&j${˔)\{
+7h V&/(Yh^TG~=F *z_nիWS᯿
+SN=,"2\s<)T(ѦSd;;va͛7CK_Kg2R0M 7|"Zzb`(H'ǧy殮wMHa& _3J|ߌ\Uo0R0RI"""WHʗ
+
+og|OaXrF
+&>b`b``b``b``bHu|6X
+TF
+F:vqmA`bH3e/8wQ>N )n^RY:-L)t
+B6#aHI *F
+F5)̣[&Fz!Q)8ݼHT IqH!<8P#3S\pA??F
+F&Q-
+#S&QǍk2DEyzD))
+RJ$:nQ)
+
+RXlD
+mAFqO'ߗOJOF O"03R0R's0A
+Ũ`>iBu"#yGSH RE&FO&6#S6h3R01R0R01R0R01R0R01R`bo11R0 0R0=bm@YԐNpɔ zb rS"wuT~PS,y.0y*mh#/ l1ىX h#Ex#7|h/S'=Ha~``ţ
+;Gy
+͛Zݻw?|eOѡC1om%J*Ur+Vdǎ[4h׾g wDh/B÷ 1~-+V$ǦܟbŮ9S \6k\֢%z{wgPfSOQQQ4ҥKbb4Ì}&zȅ4cǏ_\2eʌ5D!
+39eʔ-Z_dIww0{)Hgn-~! _~!&\S$J%]lQx05
+wFUR%0p7򆅄lD-P;oUwG}6nXwpښࠥK._{H;ooo//ϝ;OcF\1҈їFO<?|}+N=L"X U֛o I?rT80c%ϓJ6ظq#aK&
+a…0wGGGCcwtNIY뵛d'uQ<JRDX+V/ _j%,\_}Z^ Mknٽ{74hh(O?],4}u?ϫW؉oWR
+ZC)Q
+[?g}pν߅cOu~Kίy-&ܾY
+(I&ur6Lf,gĈt%Ԃ9R<s۷o ƭ%S%xvS}vbB]BfO9ݻ]?s;Z
+fW3Y;c 4B1azy?rHZĐ늂;
+#;gl_=.õf1wŃ"N>̈BkPDH1aÆӧOG9#(Y=/h/X|9gϞjכ>Iy#Et= q{۷ Aoȏō0RV5ፊ#B)"wmX
+ ꡮ![@)p)࿊7ԮP
+O R(^9d#ZEIqySj@Q3}c^zj=jD@iD%K@Ϭ[NqXBnݺ͝;WZH1QP#_uݺu+Tп4;K:J$J:Jz&CGYtZjj|\\rRRJr2R-{pmbxBHƟ&ygi }- W| )NO((Ee ][wu;%j>رc?Cd?XZ2dT Ox)ƏxWjUіB/]}O;6qqF[TћF"HĈyݹ 徔N޺%oE@*Rםd;W޲yxCD*S(^~ݚ
+[Ϗg社^_9~1g=gy`\(͛oB^vԩdRo߾0hs&
+!""V2qqq/T%S%xvS@NO- q\$d_ysoVzDVgџR/;<v"@Кŋ%0?'SF!v ,
+އ6ߊu;&A0a'N$iϞ=˗
+
+~7
+ \ Rvu۷mARqף$?,Om3z' Laݻ7))
+Mq)"ʕ+i9v#@6ۿJJ
+t̙3,(H:*==]z&CG E#\t
+߶h-CX%8p`ڵիWתUtvL2s޶mvU )Q
+r]]]80V!b&#_}U'''W^e~g{BM)^${[6oNLLtOLHxs9cLOCl
+`?qĨQZ/17o߰TRWD7
+s4
+Ō l#Ŧ kU A7Z<4s6__}
+__)z:(;F{En_&!6@+P:5||> <7T^<wH# QPaaaׯOKKr+WBBBxCsm,)vlw{!|Yd d -a"{d0۵] \C
+S~H!n3K=8巸O y>$&&›HIIaW"_!ܷF
+ pHSPOϑ)אS))xQ`bx|
+Vi~Nyxx8YD
+@=oYy;bW<M5`sĔ?H )g))))))))))))))))))'N8q"PD
+N8qIH<'N8qd
+endstream
+endobj
+893 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 526
+/Height 361
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 418
+/Filter /FlateDecode
+>>
+stream
+xڡ
+endstream
+endobj
+883 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 14
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 894 0 R
+/Length 55
+/Filter /FlateDecode
+>>
+stream
+x0 8
+!
+endstream
+endobj
+894 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 14
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 186
+/Filter /FlateDecode
+>>
+stream
+xc`
+6(`*mkgrTjZ'wx1y鍝g.\YQ̝?}kĔ8osX+hf(cáS9P폟ߐXצqz5;QAgma`qp3fn۾EB`yKls)0wήC'/:iYp?b
+endstream
+endobj
+880 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [213.236 346.321 224.192 357.792]
+/A << /S /GoTo /D (Hfootnote.11) >>
+>> endobj
+881 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.114 286.213 200.071 300.009]
+/A << /S /GoTo /D (Hfootnote.12) >>
+>> endobj
+882 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [243.187 286.213 254.144 300.009]
+/A << /S /GoTo /D (Hfootnote.13) >>
+>> endobj
+887 0 obj <<
+/D [885 0 R /XYZ 122.806 747.976 null]
+>> endobj
+198 0 obj <<
+/D [885 0 R /XYZ 123.806 712.73 null]
+>> endobj
+888 0 obj <<
+/D [885 0 R /XYZ 123.806 679.09 null]
+>> endobj
+202 0 obj <<
+/D [885 0 R /XYZ 123.806 531.873 null]
+>> endobj
+889 0 obj <<
+/D [885 0 R /XYZ 323.059 492.255 null]
+>> endobj
+890 0 obj <<
+/D [885 0 R /XYZ 141.734 178.916 null]
+>> endobj
+891 0 obj <<
+/D [885 0 R /XYZ 141.734 155.005 null]
+>> endobj
+892 0 obj <<
+/D [885 0 R /XYZ 141.734 143.05 null]
+>> endobj
+884 0 obj <<
+/Font << /F25 474 0 R /F39 618 0 R /F44 651 0 R /F43 652 0 R /F16 475 0 R /F46 674 0 R /F36 596 0 R /F45 668 0 R /F47 733 0 R >>
+/XObject << /Im44 873 0 R /Im45 879 0 R /Im46 883 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+898 0 obj <<
+/Length 1992
+/Filter /FlateDecode
+>>
+stream
+xڍX[s۶~ׯ[9M:NNSLg>$,q̋q^
+~ *rf^AG 7=A%Q N$dѥnAUjT,MóaզGI(͑jie;k}Ѝ.G]V~¸av"8eK6d^m܋ꆶ=C9x>:#{R5VC3z3fyG<=[O&^0
+0i$]@!i`a՛e1XsuTty F;x'ӷ|w65RJuVFƭ`@x CTxKgi/ ֋0# 9I"8*Fl
+y >ԇ$2/X֥qP6409t+ͯ-ܙyeAp؊Tx"+8$RLwY,ᅽuj"m7
+Z,|_Ӏe & lBOÚd, ĿUwX8|߃fq_a T, 9
+l g[W6z&Pp)3M<¹J@ab9+#|G()H&!lR>TGk|Bi}Ǩt[LmyU70̪dž/:""yӲQPu5Zy
+m_e{Z$8|ج?)P Ւ.VгD `5,DP430!D .U
+endstream
+endobj
+897 0 obj <<
+/Type /Page
+/Contents 898 0 R
+/Resources 896 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 904 0 R
+>> endobj
+895 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 639
+/Height 521
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 60479
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 639/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xyxEǿ}}$@8A꺮׺+*"xªx"h
+գG/},˵s@jue(D@ Zp#ς4Ϸ}~w1nc=l6Fl6kݺu-2+CQ ˡ5N ~1.-+KO5g(m?ҥEO-u`0͍2Qd
+ױc0DPp
+*'^^h$r{=.4Ͳh5YSVh=4M/ڷw.Ț{~S{ssy\sλsުO O(Z⳧?`zښ|~("E!E8{vkO}o~UQVJQ$[6mп@ze?x/#6nw̛7o)~4W^jזq"J1-P4l۾sWTT?~{
+,)ǫ7YY)fe jZ 0FK TU!GtCZ+MVi:F~㍫i7~?x
+<DfHQVc԰
+`(ZiX Р֤0"zĤ$kHkeIh
+
+)ǫ$JF|
+sQ><Km޲YxǛ&W_.Y|}…PhիKqp-
+( (4݅"@SNse_[2t`Xz%)5CLfa.y?Ckچ+bsؾoyi[vu+eJ4? .dk+ֺO*^'%aTn
+aSB}u7Y+ CTht~bB4
+Ck'f|Ţ/eM6Ǎs;O̘+?jXu30 Mx| /;hlqӧϙG<|jjѣMMcKT3:"v1bHki|@׭]?zM4MiX-hL%QƎ=gi~iOϏ?!IR6mOI6ss"ΝTIx9Ppl'~/=b6|ؑ#
+$Ii2M&k.JZr``^e=36ʢKˡ5iS
+3B[\Bl֢«` dhf1 C[SN
+;HĈ^322ӬFVۨB7KH;M$#F$ RS3u+2l d1,z6TT}\4N}MCָ7 ̄*6@`D>LJܬqtyEo56tk?!B
+:{$IO^;bM C &A4zV@rhnCTo~(z^(
+zy$!@T޷yYYY*;l'
+q\1bDAAUF|۷\oC 1 !S3@ Hmݺ[o5y֭[_~>vضA,_|РA<Ȅ !C4]ջw(<+v1%%%333ꫯ{ケgΜ={6ǙG@ P3Ocw^j{@2ٹ}[~۶m-]HV$0f5 JT!&'D BD95#@ d@ x_@ } @hj%!ޗ@ x_@ } @hjzw<s՗ʀʕ;@֭VD`/%!!lXbI*GL䩓֭h:/B/@ ._'j5bKx߰"G~Jrgh*5אW(qٳ?w&FQiA͜im2Q!7,HMϔ.՜(8ZkHrSU'/,ii(EӴIygB,!Bמ}IM֖yQDA԰ < K plEw>dGT...- ai:eAuz;Ӈ)zcEc5d&&_M\%ۮ6H).(JhO_M{x6mJ@}j4Շ(m
+Z6{yc2.Ϋ7ٻ轹k~kD2G^4Cjī_q,:Vwrd$^V:uO6L<:!bDIejV۶.=hpUVJKGkjP}u?33pIy߲
+ߧ_bhwwIM֥&Xָ=xx9
+By޴ÒAՙdi2~q^ADDAAEgu\jE}NQD^QLv,<) Y~Or9>@
+4M_e}%+ 7`N}eIi(>}
+`iaٮM~Ԛ5;dz
+ /J$$.|sĬ@px  0~\] h5ƍ`1N-m((S6
+(n?QV9jԥ@ }Vo2;~k x-֕+\aVc xɋc@ O .֖-GToJ%9@  JjJƱqFd/=R]]}R\ٹ#ˊ!._Pk{} {K mV V4rߗ@ x_@ } @hj%!ޗ@ x_@ } @hj%!ޗ@ 悵*RA M˞ܥ6#jN{lMV$K<`Km!ƍS'}%{?=@k|9B8
+:
+ł~Ю]\{kW,jjo`6t:
+{
+w݅{a`<)m@ÁsTp^X?nsl|1V# lȲ,aH7MZTgw ƞ9^yxA44 H-ecl.$d%&ӆ5.\݉X "%32gD(B8xh7 eeW
+?Iyxw{e
+,ͣ RdB(*4p8K ѣG삁KCgXRe*t*))Y8UFFӚB
+
+q=~#E_PBR^,1 ABaGl\-B0.gXں(ڟDMW!k\^ "g \^}_
+M#pvl݊ MC "$ 4980aDTP!'4+8x0F^bdfbh /]p ؿ{Cz%6"+G޽ *(s[FLkٳ *dFnE@2Qpf<H w®]TںW*OȖDMW!kJQsȒe YZT{4g0z.oNAZ$a$
+O(aDT:y//p~W{y˒$mJV!kz W /Jf2RZ{
+wmyN޽hm
+&`2e!IR<{ǎ!'ϕEc1q
+ϾAk]%ꩴuO7)Va4)\sKRi^wp!Kf2RZ{c2Z}{Ȳ ;i'QYuл;"OzSf
+ڝ_0,
+vs(,dהFK[%jz= WTNZRJzkTiqD͘>mcq>ߡN9V\6w˟FU4Ԝq'㨺\-[wm݅}_@ ~ K BSC/@ Me4*;ኁܽ }_@ ˢX&@ ~k=fm9*Hߗ@ x_@ } @hjz߬,L{ĉ/ަ
+
+
+
+
+
+^uuh,X,}tZ6M•̌ӊϞ8~l7k͓ϡC,ǎ| 9"˲|4o`С^{mu]7`
+U!N3 pE+6``ݺuUV(,,lJ rYYEQ3gG}4555E-:kc \>|4vUy U
+wkYs/B<+oP^u)e-KbaaÆF
+,[n~+UUU)AzXHhzA?jk]2!/IIaѢE'O~m۶{jy睁L&b1+]i .RSs]^paVVV~/X Oy;X`
+ w֬Y;v۷o<*6- Mɹs|5khYbErrmlqsnr?Q1so'
+
+
+
+nQ@HxS
+W$ z*bl2Wpڵkm6[{*=zh֬YAAAĤU,t8(//svᲢ}_jiS{<pӶ[,GێtdWx/N޲u^~۶m-]@ hH}_@ ѓ@ } @hjHߗ@ 5j„ ^LWVmJO 7"*lܸ[nzk׮ׯrS8LB]HrrrM*Ȳ/nZ_{6l„gyɒ%Z[l lZz5Հb>}Di,˯jvvFiӦͬYQLtyyyӦMSPh~{c˲`l[Ō؊M48h3Rb;cn:P'u9r/'hE5%oj*AJ
+E4MEZUbsرQFegg/[}cǎ=rHMX,׿ͦp[=C=zjqZ,kFW_;w.qÆ ۻwozp333c;gΜsLo9;Ν;s?6l~ٳgy_|w߭͋T# Bز.ChFcM4MRauT
+[lgyedd 6,5'%)9x7|c]jC..*e„ {|ľ(43O+.>{߬7OV>ɲ,;&|,#7]+)o,˲t5XNj\.,'--IG}455T~8UVSL„gĉUUUF1kժU
+ ϯ`8KKK{G#
+;>-w!B%tL"((D)PYh>(D A%JhI džrevs9~wwvfwnf ڳgOkhh(j90
+B eeݞVZqo޼Yd!'B0 bvi^?h׮ݐ!Cl竩{B.z;we,˼y/^^<6ݸq!C؛ܒ) E&''gӦMs̩oG:ERK\pPJ`((W\N2!: " a 0<=HCK*+W:On$#777--f۵"w%
+
+
+ \?XL](؂nԴ8r0lF|ґ k\YYuiӦSL\|SNoGBitǏϾ^x.jEq1
+(f
+AW Lt` xzz,6lPg
+˹\TT{zLq!<˗ݾ3]x>x`Q&HrO8 8\mcjf^&7X<f>F]R
+k0ƍ;w&B69^mcr`/wp^y=zT'nԥI$$$
+B_ַ 믿ƍsڗBP(|?L&[pBۧ/BP(x/\Vtj/,k|{.J"|Upe!/<J9i9t 0@xǍǝz^X`΍v84]RyH$:})
+B'U(k= >ƈ0-vI
+ 'xvl$Ҵi?ʕ+?3̙3]¼|| dW@,
+ϟߢE cbLq{.]zh4?<wÇzÇE־,nLF}5"}XXuO<"Q *:{ҌÛ 5>Zeh577Y_d~4ϿWvFN۶V~iX7ޒ3zF
++Ry'ڙ3|ڥ{
+O<kXS81t*
+ Og7,64pZly -~&qҧǮ;"ؾ"L
+UWJӦMS*[}%ѻrmzT+2uir@IIӭj(ОC
+%j
+S%YYD]3 mV}m)77a\=o۷r06zYt":&!!o߾<**,,ȑ#X û 6pB̯k]p㪷/FӪU,
+
+oc 3D]I<yɓ'ccc
+
+/B6[NtR$?K&^N4:Tw8uDҁ#9fNnpxGl~^eO\gN]V*ŕJ镫hX.UT(*
+3AE89Cg1veH+ ؤٕZjmvK嚠=d!B" 64ps)ʤ$
+
+”Z ]?rˌ)+,S@
+Ȁ۵|`"6
+a
+~v\YYPd`]!I:sǜ<sv½AT)կ/UR9|`vlt:vffb136HF0y((mpƑMV9SZZZVB,wVmZzvA靂7"H:usqqq͛7k5R|0
+LTHkthκU<|'g g8gQi@yu=X*X#'J7j#״Ee17Ǻ*0hpjuH5hUP0\}B?@~ϲ2
+zvqIcnlTXV~{g$OlMc2_Joy?vu-ui56Yc}g=쉳LwÏJʬMn3Fzט*?J*$_t +b`l9WƘ7v%V0P#,& _X/jL! 9S8)
+BP
+})
+BkhKP(J]`.a;#0̙b1 ])u*Hi0FBirp{<Ӷ/BP(uڷeK<$^xf3S.;ӦatiTA>&MV}p)b
+Ξ=&ɍ /q7r9BĻ\eglBh ņ.a,YҺukBѪUŋ1|j;wflH$۶mΆ $I+4H"[MH0|ᥔx~*i^^:;w-SVV2 \ŧd%""yyyiӦ˗/羊,8nܸwyCgΜy/>|xBBB^j!O>?yYf<yO<|򘘘G
+JLYtߒ%K4ͪU ƭ
+t#G6?Gm+2?<""⣏>իիGYKA
+0LZpիO>`0ddd0v,Z(00> A!~Bk#d2駟
+`0 ϺEP<"۵k7d1]Cn1^^^7od <]WV6_uÊnBz!]I`X͛xbsYB(^lؤK.;
+(**ʿMIII9BBBo
+ܴnݺ_/]c]rs!4~ϰR¾ E!&Sܞd
+fު~K2q*9sYN@> 6m /r>bџ~}vT*or7YPվd 2 sjվ3fΝd{v7d粠 bìYsrr1
+ִ`X6Baq͛7Ϛ5+22LHH;w`<y˂=4LҥK:`<|G# Ÿa0syzzJ$NW\\dڶmRUmXŽq_|˧`P8}M7CTt \k@DC`v LjwϞ=rN>MNY7;;P#A
+ ZPP
+Bo/X a9 V{999~~~\5jԨmH$(b6T*5.AED"qR̞ѣGٳfn#,kS8}V
+ /-YɄ'е+|}!l hHgayZb&AGǎxv;6n;v$ L1rȱc?ᇳoSA`0ݻڵkEEE۷W:]t7&ʕ+SCر~\ȂmlWKWEEEZZZpp0gСÚ5k
+
+
+j4{h0rÇ#z{{ggg3 couBkZ821n%1116gFWVU$[ʘ }f&
+g Ôru.Μ9C*JR#::AqBa4gϞ}֭Z
+)6p]tQT;wϟgýyׯR~3
+RڗBP(־
+B5P(
+/BP(uڷeK<$^xfұ#^z /f±
+)nClV Vg =(/\T*ON
+`(++把
+bE.nP///7o_.@V &b̛7o***RRR9z!M kHl8LkY$ڵ2dE()nA^J`/(W\N2o39 _v-"""==}ĉ)==]ө]8p@d
+ $777--@QQnj
+`O<?](zRr
+
+\t-S8u {HReBBB/ԩ'
+֒ݻwZjpN7#{nbO?aÆqu}Ŋb$L ),.v)Ajy[ ?49ۊi0=ڗۤ2/QQùFqc D`
+_FJrw@&=7C6j!!'G
+B5P(
+/BP(u ]}s[BP$1>C۾
+B5N۾-[&%&"5UԿ?:tCAp[)
+Bp20t()^bQ(
+rOW ."(] .NIJ};>scQ(
+rˮ|<,;r#L,V+,?n3AX
+B?8hJ`+(W\թ۰!#?ǏuAm(
+Bpԩ'8 hh#FY3A
+BPCH}fsuﱠ)5!7:D t 
+B?8hLUp իu V+p
+r?xsf&
+~{3gV+N6 d2
+ !lgddǢP(
+~to3)
+B{Q(
+RڗBP(־
+B5#;BPWc})
+Bk}[HLDj(F޽ѪT*1ǢP(
+q? oodС65
+PP^~~±(
+Bp\@*ŕ+k\]:uBFBT _B,
+BP7<7o
+
+!ڴ?Dy9
+Uc(zj1Is36'C0wY%4bL7nd ?byq^vjDJy^%y¿޸hn}ϜAPFkZ8}Z?hm" u/;ňBOlj
+VFF_5slO9=p8}sr>}<zn rs**p"E#m]ci^JaWdʊWeVhרx
+GD"e*ʾ rjk+˟zֆ {45=u¿9ԩw(q:9=56]kjB/$vOf~|}iʛ9Z/U,:ͼY|##/''QfZZM*u J%ɽPXD*}V*ZqXUd5RY
+L[I$ W&`n[ͱN}@OaB8rNRJ\&eZbH$REƞ켒WH`o:s}#Gl-Ȋ8+RAg
+6DCi)W@
+Dahёm݊A
+"q`];Z}מ2y&A=
+B&K|%ϢȜ9{-cȁT"+,|c"bjP]LA<|;c)D*],d[d
+Lu+J ĵCwI
+Mo g
+oJzmcU%ͳyt|jABz?))WZ%VRp_j9
+ys?|72v8}}|`WСعj.dFMcQ(u|\aѷ8S툏άQI*$:ikV]y.^?B6Lpu?:Rx΃C
+o ؔ(^A<8?gbS޺w6jdsl4mwiƑWߩcLؔs,]Lg=kߐHrqq8AAҥjg@g&_]0`
+]cQb\iKy2_Є*-`N놳僫 Iɲ;3V#q 
+fܿ|_ٌ)L*ZxXJ`Z.#VaAqYE2u\n{pو_yʮ(D"8+7.ZC"T!/QQùhT[gk%ĢPU!ܛ^o%f]T&7*JUM4UHerH$BM#;Ek>P5Պb
+~-J4sF5TVVd]OUj ¿޸hn=ϙhDppU 5v;cQ({Gh>e%yHr ɽ >V޸h x׾g (F#F
+:|q훓XS0ѣRLp,&R_m›i 04nU./8^RxӶmNDE#7P^P( _F+ກ]P(
+/BP(u })
+BkHk]1/_o(
+R}& bdmR(
+R8ml TQѥ <<PR3g?bQ(
+r_デ7d2xyaP
+&z< ڶEP(7$R)\_%HE.q6m} (
+Bp\6o
+
+
+Zn-+
+@pP*ooi퍱cWao2q$<=ѭut;& H74X6oVaaa~i߾}}}9sF",XnBG  #兦MTmpԸ* tR<@ӦMx≌
+NTQ"*C&!$ IX9sϹsÅ={&!!Ad_ѣo߾Xz5{gϞ~䉂B<q)))T*5;;{Ŋ;v
+
+hnQQ
+
+
+BBBq6b
+諠
+BCeRQ!! )ٖqY
+)[Fi{C ^y
+,
+ll@M RRT
+m}P! %
+1nB v,sI
+
+d2E 8`ePUyJc,Xк uu mI~a9;;666VXoiiyر04޽رcٲ&M}<
+ <.m'X
+!82PS
+!
+8_y.(
+
+nܸ1Z--7o(((tZ###SRRaa׮]zo1̙3gΜY`г⛡!1#!ABB5B|s!$
+ 7n
+㭭,X3;JΜ9s߾}
+
+d2EEE?}́L8q޾m=4K] 
+
+!j8_y.(
+|KW)Bh<Ջ`he0y 0j
+
+%%%ӧNNN ɼ~|nn={"""mmm<
+
+>}SrWϟ՝;w KHHHLL$r#""^|{ĉ7ožASW`ePUy1Q ч9uBG~~~
+
+T* <bY5AB TTZ
+!cccccco2.ijjt!!!
+0~|WK!4\mmmmmmsss/^*((7emVAԩS]v
+MOO諧cQQΞ=u3gΤӊyzz^~=--8ckhh
+
+ZnϞ=kii ''cggFJgffVWW'))IP***N>
+
+ "##YqW^%))yԩtS;7oܐp^ӨaE}CelK'.&sjDDC
+jzqB;;3f0 ''UVVWq Ԁ@U
+IxTB )}TyypsEγxY)BhP|knd2@L 89!XX@LL'Y!3cKKJ!BC諮
+uJۮS(mvbQ{{o]ȀX^bE0D7Lhn&{Y=!:866.TT@HHJ};fBFFW+D~E_d.ǬJ{]ه. 
+
+:%t;e0vpp׷_[:^zΏq~ 04}} ưd0 5,SWqNK!¤lHA*+.p~Q.jjٺu~QF:th7nTdЏ.W’KVX1H
+K|иa
++%qRjP]#B"}(O ɱǏX)
+
+8 BC((HP)y))
+F "GCCc׮]vvvӦM
+
+5jTpp;w]LW("PЈa14L-:9mN>s\WW׿KNNe]p݀2BPDn~r^zdd6CTnnǂ7oްaCQQg}rJ
+ ՕX^jժUzVif!B"WWL
+d斤t|WMnB|knd2@L 89!XX # Ϟ}$F[BH0F鍺v_QGx֋Pp>UW
+uJۮS(mvbѣa ^bE.]_7a`o'{4=GL&47ٽUP%W9:wvqvK>]UmC}[** $$%YX>vs!
+>ibc2}B!?}B!AB F_BH0"B!4!aE! /B!$hi1 Bh1<B!4!u#9pRM]2ɜiieLtC#CZ{W ˖VvFfDG
+v=nt!Q'%IE3>ee5,,uV **h˖ U+߼}[QAӕT43BIzMy6u7zId2
+1q1GeeM |
+uQ'v,ݏ=zJe))+{0eǫWeo<|
+N>v<,m>M>vDaaQYY'׽p}+--he3"]`
+x4"4<E! /B!$h}B!AhW/S;P7k=nD߫_S.g? MOt{IC3<BE! /B!$h}B!AB Z;bGuڋ߲=*&`ƕL_/RL^ ' j/_P.кD]'_ͻw1QR%+B>cýڋ~U |j "}_BH0"B!^T*J*((?,CCCegg
+
+=z]ZZZQ// L{{{1cƼzH
+
+РP(vvviiiW
+
+tO?-1//ȑ#ӦM#
+ ӯ[
+<..3}}}III
+222/_죖%~q~Q+<zB,7-[
+
+
+255
+oTTԸqXUUUWꫯ޼y3l0"Ç[|y϶~ِD"H$aaa֓ĩHH]])
+Kuְ0iӦK.ݾ}
+
+n)T*ؘNG ֮Z!3#}x^|wu3 ;+0껜O?eW8~g$0BEYaOCML?K~NB!AB F_BH0"BƯ} 8C~Aw`.]_7aHq+a_:tV`^E ?
+
+
+0===aaaKKd"ɉkNVƍ#\\\"""TÇYEܹճyyyedd>WCG'ጌ ))vmhU
+ہzW7Իjkkuuuۥ3Ç;88[YY>2LggѣG777[CAEߍ7;vl۶m/_믿jjj&MD
+
+JOO?vXxxC
+e}]ǂvÇn5h=|MMMt*{p@A~S'N*((?g! Qtt.+L&/\СC#F055500`eo}0y{{iii
+
+
+yyybbb/_ߴ333GA9bĈz11&yu333yyvY6l}6b8nӼ_z­_fW{FG'nᬬ#Gܼy3<<Հ_%?7!x+ёXf0N"H~~~;wP(na;ѷTMM]FQQQiirj?~<LfDDĊ+8 **ZRRbhhi& ;wN>=11NKJJލ$ɓ$
+{]~{z5Oo]OP(˖-۷oL} l
+,?r%%%nIII&&&
+uCD_EEv%%%NZhxXZZ_PPpE[[[
+ȋkmHmiy9>kO1L'NHMMMLLow
+777K/!DT*JGy`XBV7nw[f/_pO?=ÇWTTtvvSrH.%(^NΛ:\b
+bYnNR,MGڅ|ZDJeHPUUu'O^parr҃N\.^ȨsNGGGNNNooonnnhhH$ڶm[}}Pcc{'Ynjjjoo7|}>FhF@vvk״Zx<^hhhRRҭ[z#Gl|jcccwUT
+bʕVcمeeeMrHރ,//Wmmm t:-..εSgW8eHY44>>^_t;rrr~瑑RYRR/>|>bX%K[mFps;RΝ;rBEjjj4>ìXe)0rh#}W$@ `X*܂3g~%KƒWkf͚'xB(ɳoFEEY~i`^NiЫP7L&fe˖h46Sv{S6)KJIIIbw^PXXXv|PG6mh6mقp;z%ݹ
+az6aP
+_Ȭ^N/7|p?KM1ܦ&UO
+ E"с&&&bc!X,!\zU,:u꣏>H$1꒒zRinnnqqqkk9htBxOOϜ
+߿?""ݻr<''BۗYAAAO+TVVM~ҙ4L=$%%m޼yzDtUVmذV_}T.[ZZl3Owk#l;/
+EJJk}\HJX,G>ѿ
+ e2Y|CCZ=u_n\_
+U
+}
+endstream
+endobj
+899 0 obj <<
+/D [897 0 R /XYZ 80.963 747.976 null]
+>> endobj
+206 0 obj <<
+/D [897 0 R /XYZ 81.963 640.713 null]
+>> endobj
+900 0 obj <<
+/D [897 0 R /XYZ 81.963 601.095 null]
+>> endobj
+901 0 obj <<
+/D [897 0 R /XYZ 81.963 364.879 null]
+>> endobj
+902 0 obj <<
+/D [897 0 R /XYZ 81.963 261.479 null]
+>> endobj
+903 0 obj <<
+/D [897 0 R /XYZ 81.963 172.525 null]
+>> endobj
+896 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F39 618 0 R /F44 651 0 R /F43 652 0 R >>
+/XObject << /Im47 895 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+908 0 obj <<
+/Length 1667
+/Filter /FlateDecode
+>>
+stream
+xڕWY6~_GO#dK{P&P!<h=Ӈn <ՒZwIf< Y B%R{Eko{}.W*V?y%WbJ{zYf~{v3˥
+ӏ'{n.zufqY|_ٹP*W0ƓBewGK+O>,X_"I"ͺ΋=H5:/W:T7y)Qr2mߠآσx~H(C!| `PeEۡ9T="-wߡyo5\Zh
+ W5{=X\7^Y {2,mڞ5t.MEwS-%2E%/ <lDǢ}x}/R鲘<L qovWNSLfrŤ5վ,~0u]mSfhyoz ׏vxX V<Qeov|D>N[:i{JӢ:+gv7i0whp:Y2ew^+v1f8D,-4\Oŀ3
+SE"';,/(iGᮕypicXE CE(E$)R$@m7 s|$
+vӚ!a(A~C
+endstream
+endobj
+907 0 obj <<
+/Type /Page
+/Contents 908 0 R
+/Resources 906 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 904 0 R
+>> endobj
+905 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 768
+/Height 361
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 58392
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 768/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xw|?{5wHHHtPHo)AE@P* ~ T%4$!]ݻk\ yug}f]y
+Б~P__C];2;jwHbf8~e~!&n-nÿACCT{ɺ,:3s蛢J$of4W@K{zpH,mblWѝy:#҂ ;W߿aTEWQv]#Z5>#d
+ ƟNnʢު[E.9Wܺšڴ*\tQEBp9yn_9+;cR<ˉۨ.kFtWs|_>d)HڼS.=̠{],rh7{n,@+em1B6LסK`.ZE9z.x%xpX0ReRaIȤHВ \s BLRB`>TQ%(
+L_|wmId//>9nFr<cR_+<oѥp^>k [,˳ ϵc"m+K tҷnYO ߺU$\
+iE1*ӧ7ˋpiݵOz]:2d|?s蝋S*,J
+@Qء(bE(K *rUE T{vdN}@$X3)[Z݅G~~˩BV Hg (bXbeִf\iB]±H/b!:֎odJ VbNFF:D[QB~4RmY.+r
+W:0MrҖk Rpi+e|1/. ^+ɣtŁܤkrzJ5ʖ]N6x
+ͼunp
+lorPxs"-PeY^3!^zq2Z
+ 4Xx8]V\nU͵T7ܱ"{Os2t*ˊx۩k}G{
+ oݸZʨ
+<%H+P*wz/N}v έZ R^Ǩv/H8Jt6U)wvojh$ئF^7UJ)wЯe 3jV)-Oy4HG,˼}Bq$.bУ\ /K8Rs)+_{Cc8[r9qܯGFY*+N:q9Gg?S;Jѽ"DQ2Y5lT<sN}^̃IGYZʡoKŜV
+h)F]v)7JQqt>\k긐3 b:ot0}@
+2?~g$חmksܧFI\>?| Xq_<mLiyA!<Ԇ Ѥ*&~<
+Vb9ŌT*(^$t-#q
+7V'ҀZ&k"^$+-iN3KjyJQ<椅TK'^q(feÉT^Ry("FJH,'9RO3vX5'8pRE\_͒812 c<!OL1E&D :fs]e_=QVeiTR3ӾڜXSg
+ﮅZZjl/~UhS[|c7"Q^ŕI9V{s,Oe])P,/%by*KJ)qCH(E)aZ<x<E)g3 ͉%%Y*W
+
+YBY?Ƹ,֤-3P,P(K4k< 81~v3
+PI]G%@Ux4Ѕ%PIow{@ 8oş@d.@ g
+W+$2wybA"PZ֏T1
+A?>:Qa2bSjf͚bThΟ??ũT7 `̘1nnn<Ͽm۶MNN駟Ā
+aeU*e"ˮ.= APCQ % 6zϟZp!+W;m۶
+`ƍN~zdd$MӺS nV&YPP`
+ONNЮ];kIKXv-1cТE*0)JC32Sd<ڦcyFBJ7z[nVb
+P2_Q4;)E iZNS2
+O
+e@ttu뒒nܸѬY3'Lp MA,d2a><l0׬Yc~2ds=eaKbN 6|O9r#&Lk׮j '::Z.4=wܯZ&_>-- @Ϟ=[jEQ_bRV-`6lhsGkvw
+;#<% f%\v6mӧOtt3gzϧ 皓'O^&EQ={<x={qL&3N|LLJкu#FԷo <|瞋*((-sH X1>>>s̙;w={?,ӧo߾E?߶mێ;4M,4H$2}cǎݴiƍmۦh>@^z<vkL?斅 <V[YGJ7z[YTm2,=Gf]ѩ[ouQ,_zyX}S]pk`Anݺ H Oq۫ }@#Gƺ_v-??UVKl2ԩS:0 5o޼M6 K/9sfppFiժns9,4Fx(Vtҏ?8$$e٨(]6aQY
+ᩳ[cj6WMjk}E[ vд^g<,(*ɹn6ec-|kӼW켬-r~
+ԥ~('ɖ29dR r-?s!
+1*`j"@xZp @ 
+yԾrVPK˫> ~>q:Wc܊4+egpz׾[/x s & vKa"#1HvuM!؎BVafN\; ,?kc&Z(=*}U40X ob6uR~PܚC 7Y Mp,YG(/t506r_){<뵏 m~~ɷlR5k5Xn-ڭ
+){<Z7I¢{>r YS`giu`pxӖa,c"%Qms|z\vOҩN]U8 M3ܗKg9es-A|ʷLC
+aPBpwnN!!
+hWd>w9K+_6wyh>aD*4\yXZ;Gp`8xJGH'P4N
+[̲GIGPZJΣ<%~w
+;xshӝ;|\uGʼLkUsĻ1D_]GwL,x?:w~
+|XPjbe*u<_(sS?RMhҝ[M&qη [pݪoche?6
+k?:J6xiFxXPTs݄Xo<=OZB*S=`uNR,, bjh(T(v9vHIiibя$}M5v[N)[g`zw , ~ptK^MqWiai9[ڏIحe0?n#AeYUgfܔ 4 63O
+bME)t ,ߜCĿ &蠕5~z]I& Yޅ|MiOڑYP vK|K-^I}'oc, gؾBu2]u;شd5l}8 o Џmf-60/oLtaq
+@ gD ݐL < @ VYM3z`7GJU}-5Ұ!/O+[ᩆ
+&W_ҥe%<[,B%]JHH(,,[f̙3/^oDDĂ c}JX 
+y:rVPZ(^Ym v`K.]~=<<ŋJ]t޸qcԩ[l }xG)))F:pk׮Ç1coQz lY2J'͓k b^|uU@ <Q2 Gc~CrVafN\%,C3\{%؇wH$&Oܳgk׮DxTz!ٞ={Fѭ[7
+Y<C3C1VڭMX
+
+#5³t|/᭎?U]l$
+\~=(84Z'Н!ǥqwyTk͑q`
+nvöx|¿9:<K@H㑐&>H-'!̣ґZ(k]w0 <2ߨС;PBwUk{}
+Ju
+T
+SLmkg(_0#q ^ ~FM<(Er!UQ8i(c 
+v\3f̘1֤<q.=,}K 84@J͵ <0Z||+Nh,y
+PiW&|!V~eK]^]KaAI?y?
+긞wb`xƗ? wY4Ŵ`4ϗ#\ԏGt'Vɭ?lܹHZVDVxòBe?T@?zjnO"BaPju˟x3M+v9(ATœw;$>ʢOb}ct- 7|h9-*?̰BJΣ n Ş|)N?@!?u/N4t_m;W_Q1 K,KB଍G{zXrXcӣfY8udž3
+e}m~U j[pj3Q+] 7PkooĤm90 ˰4˜ʗI*vg,9@!]@0͜%U-6Һ}K$K=蓷߸nG8G`_1z
+BbccǏ?jԨ۷oK$O:gg_$믿0dȐ3gꢢׯwժU&o߾ݺu4h}ʔ);vpB)ߒ%KL*_СCz
+y-h;|SPU?֨KԒf}15e֭W*>6EQ˖-k޼yϞ=O:ˮ3KXdsm!tGw)B.y<9@X{2sΑ#G
+ck&\lKMM=zhÆ i˗7nܨ! J\ @E"0C:tŋ"hŊYɔ˖-СcP&mС|{Ç3g4!ݻw\q[ }bkKHHHx:wXÍ7^zŋgϞ<y.^gZݻ!!!L6L y_k6"v4Fþ:){8Fѿ3mѥ=-8> I۰ ~YЧkC;w9r3hРɓ4M/Ydʔ)waQ\] MTcc5b6 El+vY0-b0k(A vHDP) HY`?ו]`Y@3{9;ÞX3f
+
++,,ܴioXL6/))quuԩSV޽\VNNNK.p¤IW\痚YWN&tvɒ%AAAfffݻwo~6[[=..nر
+b c
+D Ҿd*IMMuqqqqq2eJtt4T[(ܪ. '8- 0 К4#"BSi_ыBs20k>|ɓ'Qc[&'p%pLhkͪsֿeI?n
+!wݻwIJJjkk{xxTUU5숞pVX"--mnnF5Q+XmvTh'Q:OvGVQUņ ٳ`0jh
+4u+""[
+Q
+ߴik֌j&!ґNeر~~~uM=iVKKyϟ?~6 >/Pleߥ <էH&[P<ƏPTT[ ",33o߾]tA]&qX:wƂ1Wb^&E^@Qze1uq7Xi3:/@M ^
+aObCu"<<<##cƌ<Q bggfggfvBŔ)
+TȌ[ 5z#!<'@ E)0~E1BN^z ]L#ɝ>,ʨQ☑|;w2."Dgnn9l6
+-^u
+Tb
+'jx *,C
+4B|<Μ>dd0i8n
+M]$TdƌGLCP˝
+kG)))vG F/5F-B4!c0NX !(
+ˣjťE m۶mͱ)@ 2sLvJΝ[ „ ϟ?%XVV֌1~^TXXX(J cJJ֭[k,L 9gΜ6yg
+T
+&Æ Ug3 xXG8 \|`'Pi-y6/7l/8qyϞ=4dɒG={U`;}{ԩQF <oٿ+e֯_ÇO4iĈ=JOO_~ׯ/^xQ}}@qkk hX{y
+;Y%ޑ
+ZTd_d}z~Y5){A~!#@B['%g3ORs6b.*! cp35Jh x5$XT^ +Z_vF+_BY+gZ*r)Wz8 M51 #@BBF\~/)|Ssvn߯P;a 
+"JWU&aw>w. MЮzԱҺrh ^`gHGUgf1U9/E:ø,峾jbPEQKq(%Mq(.8VJăLm4Ǧ8
+Vۭ-B$5T
+h
+*r
+nuMbnY͞<[46 xqP^MQ}?/ЫFZ)
+S"<au$!7W$$/R5};`cVjŒ,,,l٢{ &CXXX޽eeeǍUPC=:__cZ$Np*~0?ƟEj!"h/:᫓W}=:}HW9`AO5.:f|&K?C%gBJ&S+Ձʹ+8\!wjB(EQݯWly?
+4%: SA } 1ڽjP
+:JQZ
+w(`Fp| &[ðSq
+jbFDVؕz<DuN>ݯ_?
+?.gh:caجW,''fv%RA|p6~ꍜɚѧk.'rGs2IB:!?e-9Z}?e7f[sPPڭꯅzXU~*3|/7:WǯvJnsX{r\.<llh;ݮ bՎTWWOMMe
+
+TTT
+ s3uԫWlݺ֩kJOO.++'55uܹ}ff9sZ,ǩ-l!g-la C0^H@BHVk4Q1ZBMMm޼y~~~
+=bu{+VOă{Xy;(&6?jXg޳(Kq9\aC3_Byzq/~9$"ӦM>|c]]];uTO~#%%5u~AFF;'Oݳgz>}5\x1<<… 4M{ Ap%*c$vb.q1Nppa&)@ˏwrrrssd
+RTT$%U70dcc}9s :  f^pYiݭ`K%_HV3 4:Vb{?
+
+
+~g[[[ooT 8
+L$
+E"O=\Kơq@E%nASo222˻[􃢊|N
+}(Ь1Ak<2yegf Qd? P.ekvY$""|ƪNΉ1RTJRa: dMz"Ҽx9y0T0\/1䥐
+
+
+_ Z"7ab䲼"#myMbET
+WR
+Fq8\Zp>lLW.
+kqmP9={Y94uԹ<~Up&X{r\.<lhRCe&J `#?[3%8Q ՚*x_@b Tg5QeRs̛-xv+Xc¬zfIPyT^ U*q]ϫ➞ǏOYhڵ葒l&3gL4)++ڲ#FpVX"--mnnC1:/^^<88xccc+^H333XD;V_ Y2Qx0=OE[BۤGYnoep_VO?\:SSǯ?lhK(WZ | CVC;N/+tdcHbPK,ov֦)`~ C%
+jAk^:ЉDama{a\τϙnEoO_w2
++qs**kl毁^,y?y+
+fgmvFH Q17|˱ ZVR( | !C\Tp=yyaÆ ݻq^?+//? &TUU:uJOOOVVvM||ƍ{vݺuuҥKվ;v찳 +))ٳgںu+EQ
+
+
+np۷/\0###99y>>>GYdxܹ2III[lQVVսqKSSSJJj 5s EEE&M߿TTTʅ`ٗ/_zxx
+
+R31(B&jSYh)0c*2_n}=O
+Q\_;!  "P'̂vvvwڼyRSSÍԘ
+1v̙37o;v쯿ە.ʬ诬'BAA& s6TSSc%
+ׯ_,66vbtqq,)
+FA
+Cӳd4@ =77W]]5?1Þ={_?Ml6'""m3h~ٳguttW[=H: :Uꠥi>с23ѳ'
+Ꝺu@K|wCYYqD>@рS4lAEh
+۵kWcc+W̝;^Cm':l-|o3ۯA;J޽۷oߍ7믿9ys}ȑSN޽{޼y
+ǕtD¡- 'k`` g
+wޕݺu9N>tR˗h
+ ifivl@$a} _e",F6wlds@Ehz&:eʔG]t|s&x{{у{[ NPVVVTTęx UVVw ˗AGǏ!l؀
+HH `bp"$뗗oYAđg͚_/^xȐ!M-rb$$$,,,n*))Iu떜hWNǥ諄[Y
+7x3s]`x{m@CзlaaqgϞq82hgϞolzo`\bj-obbΝ;I?SaTVV&$$O~Q2qDqXXX4-ܞ}WGp$*PDTLQM<sddddutttuu 8_}#G DFbj[]]r;a):?|LLI |4mlợɓ'cƌ)--p5:7%,y
+ՠ &0|~K6L<7{-3vE1aTSkr㌥%,y?ƍ|[h~E
+_a4ܻ `1(
+RΣOE Й;tv)klp򺫨`l R&Ǫy d`$vTE @ O$]̞2 ΗU2o]4nQ=m4%K^Z6$$$jkk[5QsI---IIIsss%kkk\/X#F$-bDGG[_7o)0,uL [[ookkkϟ??vy葽]FǭoaddsqtttNNNV aeTZ6Gu9۷eddƌ ..NOOOJJjԩsѣ222􊊊ǏGJJjƌÇMLL֭[7`
+;xܿ<8ݛ;vȑ#{@SS 'NAAݻwI;n*++<xek 0'N'@qzibbrܹ$1zh
+
+
+#FKBBBrrrƌC=zMMMΝK ]i7oL4),,q+{6l7n 333 k׮L__%K{{{/\$ tﯠ0~xz֔P~~z'8uT33۷7ik{c 95a-p/(.}&[C
+) `
+XX[[I[`Ayyyk{K  YG*Ðڨ͇ۖm 
+7kqe>txCSԋ<#ԐX:;u;9[(ȻPkLM=8*2PŶjM )C~aQbQ5nkIkitffm޽۷oߍ7믿9㹉>rȩSv=o޼tΥ8 wwwN&#pa
+z|
+xkyocC+t3'fE[]uN|W()6WxVjO2EP`QmmQ]AN8Yfq ƞ={Lr-0//O>y޽k,kkk
+}mg6f)
+
+PRUWq8} -59 E zn󜾒Fi.ҮQJb3_h*4x=W_|!݆u+ۖ4Tu)CQj(ŚxD*.. (
+ܹs>â={4pرr///UUՁ#nJNNnc[#|ga.vCj?444VZeiinʕbbbx̙#&&|sss99+W*++effz{{7%)x!:s)SQBV
+RުȠ
+ڵkuB1bDbb"}٤%>Є&[ p! ??o֭[n#p… ?۷sB7=yI %$$l,@x8 `?d]w>
+ǹg2j6N>#MT:قլ&v
+v%k4O2_5+EJS(iSx#2z\K&-j3Ooƌ5vIQPPT\\LQTpp0Y 
+@8
+mAYUMvjs(7Dgr=%ד6iú3I44U.vb0۶mɓ'w@hot+S5Q
+_=?ɟ%Z?煉HHۖ!)wnwgH6x@ 4.R'w{̍
++++77?#s @Ox#x36tyQa81Ѧc 7|Gыf0G`0v`0VX1dIIIKKˊ
+
+z.]ݹs.ܴi1cyXdyyyڵW\~| &deebwww:fffmۮ]d2'LGKFGGΚ5k޼yuuu%yyy ,طo_QQO+ԍȐsww353<s+}2@:+nh>UmAF/G?~#Ϝ9`ʔ)܆«W._|С?;wlh" e˖7QQQw0agvvU
+
+P__ܷo_nVVV
+m~
+Ĵծ-
+G G\\˗ن
+7kqe>txCk7B ;fXe3"Ul[)'@E(UdC6At<쁑 8A$D7)0Y _|(;)6>&Xpg
+Jv
+ÊaSD}(¯0 B!ah:'8ptA%S3.OΝW"wG gxgy5kz/{!mKPEqOPUâg޲W@@t4kBa}o:.ڠ n`
+e%!2|u
+RުȠ
+j
+/\aA+E?iGY,FpȳPFOGϟ&Ln`XT ^
+Ag]6tк7n̟?Ç\پ} zl М5C^6En!
+lI
+
+
+6m+ZYY
+Fp(By3X Fp0P@! ag  Bp0BC
+
+:ctuu922j.ЧVHHSNNΘ1c"""Clٲ/^>|AAA C__?<<|ƍaaafff@ |v;tvfjwo5L(t^q믽OqMqqq7nܠwl>
+`P,EX A @  W ;TWC_<ܕpPD~wrPwטzFqTd[;wQO2bQ5,bQ,-=i-
+|<6Wx./_CQ,ŢXEFeBwUt~ @ |9@`| zw |P-0H*(
+,
+fGE {IqX%~
+Ժʸ%,/j]ͺi_(4* Mjm5[htDV,]buAg`f"`_d``sg79͹X@TJ+<m8k;)o-^?]tФь-s?^JvfQa
+Fҏ` 
+ r? :6AR3
+7!$ 4mڴCBB
+
+
+,IIIIIIUTgΜyID
+
+endstream
+endobj
+909 0 obj <<
+/D [907 0 R /XYZ 122.806 747.976 null]
+>> endobj
+910 0 obj <<
+/D [907 0 R /XYZ 123.806 712.73 null]
+>> endobj
+210 0 obj <<
+/D [907 0 R /XYZ 123.806 623.942 null]
+>> endobj
+214 0 obj <<
+/D [907 0 R /XYZ 123.806 468.324 null]
+>> endobj
+911 0 obj <<
+/D [907 0 R /XYZ 123.806 346.948 null]
+>> endobj
+906 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F36 596 0 R /F24 476 0 R /F39 618 0 R /F46 674 0 R /F44 651 0 R /F43 652 0 R >>
+/XObject << /Im48 905 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+920 0 obj <<
+/Length 2425
+/Filter /FlateDecode
+>>
+stream
+xZKs8WpkKO <l&q&$5RUh 8EIF)ъ-{S
+CGM2΂?6tpԣ<ⵅTncٿ̩\crO-y7fH&xx ^y!prǷGLp _E<og%K@\-Sqxn(Kkhp2c^tI o(^v,4=%0 }Хi  y$<xl)E̛w#S#e\{"+eR4a4-^/z?s=;ydtLtoK364aڰu&'wI()ϔ7Ah*.X*#) <
+=kx/N}^Ekirs BĊS2r@ PJ(b;o\e5YC&oORJI 4TibޝA밤ҮJvarAiB
+^%X
+?9_(ȑvVe5
+D2h|D̤3GnRkaTeTe\;hZfuLZ<{t6>
+]%xRO/64kۆ.m
+h)XS:ooXvp11
+$r}v>[1/7).,h
+p;uӎq
+ziv][(N&^WS 'ܕE%t[c EqgS"` ܍,.}A2_ҬU]|IGh\5pOK :iy 0`㸹mZDH~lWq1өm{i ;ΰLlkAoFӤɘ&a"3L(-ai2ӽx{JpV'L6("llS8 Lj,$^̫d,]QO}֝{@W 
+9ؕ#ßv 8t!2)l2]}]!Sr1h7R*{fA=ϝ%!o
+ڽ74q]'H|>y>NO>"B0jqzqB$99$
+xs6 XDp2%}0C~*TwO`dӂg|-;FcӤ;q[-d8"_3> iKT?C ҁqpc ϯswGঢ়J3!LJ= nT5,uA>#`^V_3^GXbOzû;MPkyu $muNm3fvܞgq1Z1k<B 0f{D0-d2|S`L !sΞ6 P' PX~ʟ.:=VWZNǵ[#b+bSTߣ#Bq?M N cߨPw Qs)S&}9]'2Ws_,mۺg4v>1ma
+endstream
+endobj
+919 0 obj <<
+/Type /Page
+/Contents 920 0 R
+/Resources 918 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 904 0 R
+/Group 688 0 R
+>> endobj
+912 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 923 0 R
+/Length 40
+/Filter /FlateDecode
+>>
+stream
+xc`9hdAhWh2!T-r
+endstream
+endobj
+923 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 100
+/Filter /FlateDecode
+>>
+stream
+xc`
+;dc5/-(ڴ3ƨdC7;wA6Wa
+endstream
+endobj
+913 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 924 0 R
+/Length 43
+/Filter /FlateDecode
+>>
+stream
+xc`HU{>BzdD 4r?V
+endstream
+endobj
+924 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 97
+/Filter /FlateDecode
+>>
+stream
+xc`
+H0_C|' l3yG8
+endstream
+endobj
+914 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 925 0 R
+/Length 45
+/Filter /FlateDecode
+>>
+stream
+xc` XT=-C#qGFPO#
+endstream
+endobj
+925 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 122
+/Filter /FlateDecode
+>>
+stream
+xc` y^O?@'ɂP~@\>{_䧚zd72Wb(?v/a Jż -¯a4
+endstream
+endobj
+915 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 926 0 R
+/Length 41
+/Filter /FlateDecode
+>>
+stream
+xc` XT=-CTGTD|$Q ꇜ{
+endstream
+endobj
+926 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 142
+/Filter /FlateDecode
+>>
+stream
+xc` y^O?@'ɂP~@\>{_䧚zd72I4MAU~!
+endstream
+endobj
+916 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 927 0 R
+/Length 34
+/Filter /FlateDecode
+>>
+stream
+xc`9hdAhWhu
+endstream
+endobj
+927 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 87
+/Filter /FlateDecode
+>>
+stream
+xc`
+;dc50L&j Pi` _!
+qF
+endstream
+endobj
+921 0 obj <<
+/D [919 0 R /XYZ 80.963 747.976 null]
+>> endobj
+218 0 obj <<
+/D [919 0 R /XYZ 81.963 712.73 null]
+>> endobj
+222 0 obj <<
+/D [919 0 R /XYZ 81.963 422.998 null]
+>> endobj
+226 0 obj <<
+/D [919 0 R /XYZ 81.963 144.347 null]
+>> endobj
+918 0 obj <<
+/Font << /F25 474 0 R /F39 618 0 R /F16 475 0 R /F36 596 0 R /F24 476 0 R /F46 674 0 R /F48 922 0 R /F40 648 0 R /F41 649 0 R >>
+/XObject << /Im49 912 0 R /Im50 913 0 R /Im51 914 0 R /Im52 915 0 R /Im53 916 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+934 0 obj <<
+/Length 2448
+/Filter /FlateDecode
+>>
+stream
+xڭZKs8WpF6g'([53Ze!_
+Vu)i&!~Mh?x9qG=D8Rm
+wRvG,6‚BҕbfX`"Y[)vsBs{N ?Ԛ MbFrvĩ[2P=;zvњe="ȏ3oHy灺I7ju7 @a]~l ^xjܸH I3U9cqWW޺lҺ3TK֝G.@OYM&|c&݁CܗOr;;PuwүzHl}k#x988Dʪ\n>pj,֐uv+1utI~g}qXyU=~ڄ
+:
+nŒUIm1zLPП
+f8wo!xCz u0=
+K>{Ϲ;] 0 w`!GwEthmz a
+;bDp% c]_V(
+8gk0"DN
+Bɮ'tP=Ƚ(Ƕt%y?w"BO|,1+ <:Xڗ1/{L&
+endstream
+endobj
+933 0 obj <<
+/Type /Page
+/Contents 934 0 R
+/Resources 932 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 904 0 R
+/Group 688 0 R
+>> endobj
+917 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 557
+/Height 314
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 940 0 R
+/Length 20332
+/Filter /FlateDecode
+>>
+stream
+xXGǯJEĈb&M{GTQA)QJEnl(E(~);0qݻ\pg;;fɊŰ0 Uމ`0 VHq`ʴ^kٲ045
+ `i| MژQ!6/m/oeN=ݗS)5- `;rV1sbn0zZY11I/ڪea0L}GΪ:f2Xz}q`:`R{Z}RŠSYl}PZRjZo8UH| [$alD
+W߆E\0gفNʙ} 3P)EeXVDKXVmmժW׶aa8[-W/C֝0C$:'onL),J)SVtMė?rVV{>BHGϠn]&x vN, ;VSb,p[ϴQ .e_;'جi: [vdWi|PE̺N,ZKD
+WOq}CzL^=KG0E
+S$}CS_şYy?mx/֞r$*cVj}IK[. 96yg]s/I|<]vHW2qmefhM8xo]'.31oRCG',N2+'pŁGݷspC֓7G-{o`µ;o\. G,=d3jp/ar]7;A1{&៤%]G0'E.^#Ĉߖ9{Zrt$ _G,L0?YyY:J)*rGQY%eLYwhy1xϐeaqs}i=yvZifwNi":im֤%Rʐ;)gQFu9G.;b†MSKt7ohWǝ[(w<lٜ,~Ѥ  J4?ۡ͘%F}IGF/k֡ՁUAN㈅tXĬyJ0|bn>I) ;|eۡٛ$>~Pn=XxxG6$8~OZ$=C.SNM;5cYd:̯B ]SiS{&fNiCL8䊦=f%FN>l7 1hDV(JrE-Z3deD*%Q)7)*i6ؘ t.~',Lg'yn_]tǠ >n5cS*q5<bO)׮)glJlتiooO <<-ЬWNcZfө8;vX<d%E4 EQݶwX|EvLG܂OLU^dN- =tR4GyʪU `iXݒH;/(ڦF/ޠ̥alkn?%03 7mI>M~G&-?PB)e7F&"q_ImӚ|aV']m83m;U~_6iÙnmZ;,n.c*+($I`FoE!B+b61˷bʀ!*%,K&< ahYRbY%澏FWXd{3\׮R
+0-TߠʈcSyɮ'l142O/9qq5z{$Lf[c7W^c=hzuY%'mU!/A43h
+MIK^Ɯ5"~ܼsyxs SY]V̕;Hq36Uǫmea:#$ڭ;QHwMO3Z㼪CNZKWpK)1yG/=hnј2ԼMGWW㵓vM`iC3XKmB1z6~;YivӤ?zw`C\v7t 5 tm^-b2*&zrG_.gl)Ͽ "͖Bh_j9cG|D*%,)*+]j;׫ 6vqy)Ixl9rr.bڒj3ͤ^#]}C2]=Gz朸twslqIͧ(l7kV432 L2p$!@8lN->ͳ.FQgnI1}ڦ)gIt֭~dn7ΎWq5>w&[nVD(Fu_0Nv,k][c
+MZw*Ҁ:Eɶ+nׇp*|vu7DP7:%!'<C]k{`mEZ; [w>;'Ȩ9|N.:'"3Z*p$F]ۖ9ÐC&M❋vemxX"JU$+3kbӼSġn{ؐxj۞u8^a :Eĉٵ0Æx޽ :5ySlhu(Z U_w] 1Gg(zFjH$w5 :=}/=nMxyǭM!}v,q̪i <mNʰ#L7[Ɩ4E5O76 =[cQӼG~5֜ERz;kX|;{!^a=Î\b`h~b7K78ۨE ϠMլU/،-gءrG%wjY.{a=}6J1^a'<MZF!Jp':
+Gq`+q̜1d鼜wzD6%wg˙\3eRʖheRڲԫ%ona-K' 8״L(7u
+:C9fh"='-(S]œsO7nݵs>NO]u~Eۊ?bMzf^ۅ^'ᎇ_hik~4Y濍2YmSY^ݾS9i6pa4^'<M:fn1uaЩhMt%E!)^'?QQWш=k;׆_ lҶ{KmܪivC^M%M=٢H ǀ6m[|aˏ78mٚAg;^W+ke!uNЂ7,DS΂ #pҨq%7QHCLt+U
+?fzRH>xA$(g4uٝ-MS*%QVJ,+ZcEի=6y'ӄ\GfmدS4}uͼ1Үd]=f : #9nUu/2o.ۊFIN뫡Fu.mF-x0n29臆F_/ߡ'Mjg[߀P׎(<ͩ+[~ZtNI+Ł~DOG6ee''.͵W8ĵIz Juk~ŽZlN{'8h^HKkj6libx4[]44e`ǕQ'g|Ȝu)eQKbWG%䆻[ς]q7-~n^F- Kۿ?*8Yf/($7fF0~cN)[.
+Oʻktr9m95*efH^}be'E$zD. 9Ks!aV9mq\ DHٲ%}*I CϬNXs|¼ l?燤:&8Lr ;=="x;L#᪨c(qfPt^4?B&8N").挠ޑZHZ$;+s:?0 3S6j(Â3N9NCqrQhc#<e:6b GDʜWE)s"}ST;/;2d ckiWGߴ؆M{=⍣c%}"E$yE$-MNN2&䬖/u*0CHnm`=*e..
+MO^L :8,u~h:}J*mϣq#9n)^)aOQ"T.p#4oM ֐<S~|ɞΡgf] 2 N/N,h5mӈ'ߡЦJhoK#=iHYDlV%NGDڢ_ tB2#NW8̠E}_:!QY:Bt<Sp
+9KS&YtH~AE"8cߣ,Ң<^n5M+3ڧ ֦#X^b$ڮ=p%{rEM\{rD5- + Zm\BG@ФE^q4v
+@qz?H%922F9)iYX)U1+lIY!,03u*^>샯`o]#ӗENuLz>*chZu>0 }hcБBAЇ#0ACA0 AAA AA0ACA AAAC+77_hc;Y J?L!
+CT: 99`i
+CTjdEVJV*?~L%C&&&3gNAAѣYf9;;w1 _|?OLL\j9tqq
+sε*jժEdܳg}D'NسgƍY_PCU7oNGekkKG.L(إKiӦ{zzѣGٳaÆTXsQZΘ1FǏ> bPjHDU\bdd$ %0D#G޽˖`:M6lFuҥK?ѿ߿? 5==ӧOvvvv:u ?>]l̙3ِK5*$$>>E>֏cǎ%uԉ*<ӧիmVH:t`@PS 
+TV駟~*m;@0rs1_UV|.CՋ=sT* 222ڶm;{lwݏ rG"9 I-CK)wyۊ~~"( Cߟ vBzߋ 3Çimll?]vIceѢE#"taIIIFl6lؐZ"2oK.^"س|INNK!踸AJ1jذa-Ljfw6-oT644433 cw𠁝jCv6ܹs9sf͚K{vsJJ
+}˿/홻~ennNCO?~̆/2wЁF-[ :])hT57Ke^v-..N"]6DӨQŋ\[n/Zhν u9&_K˿t~ ڵ1b٭ {iڴ)Lt}ʆӃR*[f/[,;;ԔF3y<)'4{mпm۶e?ؾ}-[̿z* ߍ0}t⣎g}F[)Μ9~RiРAHH[[I}6-UN~(*NDEOmGQ;=zHQ[G4s_t)Q֖Hd;@0&TY4r+WI"!HկիCO"ZmըQC<b!H1ĮYX(Hs{dA9rW^=tܹs;| AP%(,,CZZp;w, AAACA0AAA AA0ACA AAACA0AAA AA0ACA0 AAA CA0} ͉^Ov0UIM~wo6{~ں9|f)M۽LQ}d>X0;駋w%qcx0QcV?[}:f y9cGL^mtZ/!ݧ{Ťo8u ;<p@h[o0w\Mh,׻XK~f` K!`H{wk9orv}z̐}:.9vWQ' zۓ~7>׻8}F4wK!`H {=빃C^?
+޾.;jݹ}:o8Y?up0w3 _?gӣo׹,ѻ!x) igNϿM7g}oug+w8GxW1AD"}%Ig:er&W#0w O?[-]@Rͷ_OD|[cRz їL~e}^˝~vgԂ~&+O2[wK!`HkuX:dzeMb<PwJ˰]tΟYirrzf3̷iqR/!mݬ?qyζ9s,"}>*`Ufd`֘{vԯ0ޝ z!htǴ ^
+CZ~:xċEMȚ6H%ԗ;S{VR37N׹Im1vG7BR27?xqI),\>姌o'$=dW9.qfԻde9šNK\_ }FO^ z[',}B)S*]䎵^~?3'/nKJdx
+fh^
+CA0AAvܹ}QJ x)0 i._zى'Dfi x)0Tf d2{c511Q>S>Օ֪UƍX>^~n:kk5jݻwOQfKU eee߿ "x'VuUf̘aiigϞ9sfĈM6TDېbСC|򉞞㏔ڥKW^kn޽fsss۷?< u֭];!>-,,OjҥK:u<yr͚5۴iCljѢe>}:+(W8Nlll\\\RbRRRǎYn[:dطo_]]ݶmۦ*:su}͛7I&ʃPZR~ҥJUׇ5)}׮]/uxb|ҍ7~x,㥕ې:b޽{+<y2w\%h#22oذaB ?N(Ġ>}0 ٳfff4mϞ=/_PjvؑOΝ;W\MWt#֮]ۡCAF:dh{kfĢgD/^XQ y/TbrOjʕ K$'$[ i㥕ېcVZ&D]ahͣGfy#S:BQF4ۤ>>bs<5MdV0$CRd4b1Dh`miiI}_^AN:4 6zJ 2 =#j^x"\07%7h@?C!`H0t0NxjNk׾z*+ҫW#Grk-ZԩMYgRHH!uݺuc $m8۶b+:p>DnVG=#d*b 0$Oǐx0 i
+ AA0ACA ipK!J{ x)T1dbb"+VjZlk׮RU@ -"ɓ'27o_N߫iU<7 C 644Sj_Ogy&yiffG_zUTK5]Py0D}{$$S0D b>z%}O6.V\r͚5 ~XU^o>*CSLMM H:xhһ*(( !6'tQ4aѣv.K5=Pbƍԭ
+R1 DJ۷D6. imE"a:!T
+C4G~:#Xl_ F2qppC`m4{JoCqWZ%{ܶ}ݾ&Mڵ+
+?*/oCr"r;rrr:$!QimUN˗/U른SN1=ѢE ׇ@3sCy,Y"wmD]NuN:UF!L A/<ԹsgZX0)yo(Offf{ H}c 4CA0AAHKT%=H^z˛5kVz>hɒ%kY5jԐ{$Cቌ__͛5֭[[EeF/
+c__\uݹs9?~|rrrXEᇤWCrAzD/;4 C۷oWt!ŋ T KTTmdkצ<F4NeȣI. aAy#`%F0$ I{E%ްaڸq#)Sm:::Ϟ=BjٲeFFFAAÇqL"` @w#`%F0$ CPb(&&[0khGprrnΥS_}hbDzeˬ7͜9]0$"`R Mb)ثD{D(?AB"`X ݽ{WWW]Fc:p@ݺu_~ýy/o|2 loݺu#qL"`HCioC7o$/6D].GJaHT!!R6 N9U~LJzcǨ&&&>yxĮ݉vCooobMvvvVV )O>"!ܟ #͟?q4gffgN4aÆ4upՒN9|իW qK&קON9a7ڿVV-;;;DH"##QEXH[i4Yf%M6]~޽{ix/ݣ %!!Bx ϧCRx)0u K!   ` !mCRx)0Up/j0>Pr
+oT OdT*TiiiZKJ7 UUoQ/*K`C"iҡa{HOi;*$*T>B #j:3iգzB.,M$a#ѪUKN9` IDQT0X u2Ѥ7lWHT,Ω|D 1$% u%ђ=+}AHx)ް UB!(*ҟ*Nŏ#Z\CrDqɒ%,ԩSR/!P IQSC
+"Z\!aD-Qg BJMM0$F|_?-:^߆ʌ7TZ )xrs*>D 1$%#8 0$H ~$ZVwCo*,MhVZDFbqNE;?CL:HÐh4Ra#aYx*x)0(h|ډ0/C]ۺ!x)  `   ;/CP ARxc(55[nݻ p
+ݻwfpxjz)0T߆V^M uk߾}H044|ѵk͉)ұC˲(3AC`.:xi1t a"$GG!ܿvڴ}&a6=lAԗ߯>k֬qpp(,饦!vs#G(BG4"0pO-
+:ulbkk[}&a(44A_6|}}'MԵkW6o,C!p**⪻2 q)GGCtv3gׯHѮR1t=WF̭[R_^N
+{~VZxxx^^k֭*A*T|(D#@˗-,,4hfpx)$ ٽ{w}}}Zk׎{"D3%bֶgϞGsj!;hтdD1T "0p@)ԲeiӦI
+B! uСCh*ORmO?D$333viRx[/jva`` *CA AA"Uw^
+/*ARMГ'Od2ÇK̉PU(<رCe A0 <m̧5CBTf/-}h߆Ck֬177ؾ}*($ U$ oЪw|U.]dccbbbbaaqWN<ؘ>.{C BĽ]bBYG/-UoCꅡk׮QpΝkgg0$($6J>|qebxAsׯ_]-**6hrڵkSnEB$!e=xi|R/ }غ&nnn,hD!h,00TN,^"GjٲeFFFAAy2-bH DaD^
+ CٳghѢSN4E0$($>Bܻv ˖-̙3iDL"ѰYG/q>۶m0$($߆8 q>}7nݻwuvZ>!nd۽{7Ð2ADf ߆!Z-#4ݻwC2 #
+Fc*VSNCx4k"_ڵ@B| eddܺuѣGzbR&h,` wi9
+ ݣGSSSJXX1GQD!a4`CL5ܐ" AﯧWV-;;;Ԟ"pidooo``ФI 2Aa!x)TQBx>K!HE{m]^
+ AA0ACA ipK!J{ x)T1ڭ[7bݛ{ nݺ )‚KaoݺU㗎RkDrssMLLJUZ-1^^
+ Ce<xbii^H:zh.O C휜7nٓ{iy$E1ˀrF Z`lzNa{ 0DSJǏs˽ܹs\BhD$zꙚnذI&D옧O
+&WN2.xC]k׮.R!"@K^AuRm~!0T6 xjfo2T"?>rya"(%%szz:-z!!1{W*C {wD!r]U+>G!i9.K^AA-T !rիWۗO^a&c&DaKeT֭+"F#"lq1(vCڀ!aiӦ-Ye#GbH!%BqFW4chG
+ GnnnfffGf7AAACA0pK!J{ x)T1+#(}#Z"<v^4& R Rtmkjچ!x)T~ ީSɓ'׬YM6 [h%i0.Q`
+HcyNNN 4vҥիWڵۻwN2.RRdddF~ݻw%*^^
+ CժU={6mΝ;W\ND=HS*Q`DJcz.tA6h46lvp.V;/x"->>>//~РA6CMX˂ ض%udOECHG R(Z!~ЙVZ*RX:/ӈR/%p/tgϞ)^
+ i3\m+++%> "F4Kdh!r6ÐD^z9\30.^K۷o+^
+ Ce!Tp) -5 Cŵm"--M};8L:%2PbH4t
+a^
+-
+-<K"=.^
+/   ! AKT%=H^RxC*TR9`"x)0Cy0 IBK!m7$"٨Q#߯_{*钟OgahhhllLUKJ{V4 ׫WtÆ M4Qt b s;w{o޼9 U!ҪxC(B/^4PAH(ڠi<̷Đx)=z0 uTќ!##3fs"AॐVF7eB9utt={&҅0Բeˌx K͛ǖۤ0 uTќ!/"AॐVFrrrzmѐ.e˖Y[[Lu̙
+0FR/;v,m>D:hN;H /*ސ0ԩS!K/_| ڸ{nn֮]UwRD:hN;H /*ސ0Ѕ h
+ޥO{*ڵ?W~I4..V4*0$ZDQEsbHEjK!m7$"D6lקON9a瑩ڿFGeggG}_*/ܐy5khvT~}3KQ{HSC*T ^
+ -
+,<vxɓ'vll,^
+/ ֥F:vXi=?bw"x) TPPfnnnff6z'OM ` ! QA0UpAd2L6P*C―U,Ȁ H1S~}74lP__C` ARʏ!URZRv`p\'Nݻnݺ Cx+&0(bJNNHJJر#![qqqjHɰD*ۺVT *'BBBhg)sݴiÐha|~?*U0 ~"wQND27CC\AAeff&Ðha|~?*U0 ~"!CA!ӧÇSSSuFr[7A #RWPbb""!CAS:;;r"ohQ *
+7$޽aH4KjoCi<>|X~}ܹaH4ފ0 ĐD0 ~Tŭ[=zԫW/!Ѩ+,WaTJS mFΝ;m!EVQ(GI I"p
+
+ 4iB80
++˿SNɰD* sCi$ ޢ
+V>]s-1)n=]LKV $*-g32~e}^˝~vgԂs6?gNC_O2[׬K"߀9իW GH&[f…Ce]6(%%;Azb +Eڻwu Rh@"B5ܹ6,[tC~eGe2[!V-EegϞ=i$KG!ZQ3儚<y29ObъrĈeEz[n@'Ϛ6ek3/gH3x(ϗak#|_mN?^_g*%շYX͖ o[1⾥aT'ܮ];~}||=ӧ':t5!+++hDE;YhQw211IKKSk d?d~dERcV:DWC[& d2GGGjʹFʢU/344$,ao#_.sq{fh9 iY!ȑ>*`Ufd`֘{vԯ0ՕJc7ߎ-h~;V /]C@RvajjC+QCBB8 1̙C~rJ;;;crssCoS]P&{ =ɮde^ۼJ,(mZv޼y={RbC|ܹI&V\є&,,7l"^,zhBִ9ݧFz0 iŐٌDDm|ddTCe2Hݛ o>s7Vk2Ŭ]aNpƌwv!Yf .too~Dnܸѽ{*Pll,N8q֭=z;wR8@K*777c(bYт
+# `t`0Ҍ!چ`0$`0 d#?T
+endstream
+endobj
+940 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 557
+/Height 314
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 393
+/Filter /FlateDecode
+>>
+stream
+x
+endstream
+endobj
+928 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 18
+/Height 17
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 941 0 R
+/Length 331
+/Filter /FlateDecode
+>>
+stream
+xc`2f)
+endstream
+endobj
+941 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 18
+/Height 17
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 68
+/Filter /FlateDecode
+>>
+stream
+x10Aq&˱pHRf;F" j`F`F`amI{hBSjMs
+endstream
+endobj
+929 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 18
+/Height 17
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 942 0 R
+/Length 326
+/Filter /FlateDecode
+>>
+stream
+xc`O(N.K2Lז
+YZr<F`g7>_#FWSno'M=bt-,9'cD
+]V!+cDǴ UaIE> rd4daw%z~ p1s3sMRMk뗎?&=w@) 'ןUjZ>,h@G|sgMh9s⋹s^.]~/{oT0-p;ޞ"13<=ríNyOI~
+endstream
+endobj
+942 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 18
+/Height 17
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 68
+/Filter /FlateDecode
+>>
+stream
+xͻ
+J^y l RSZd8-Y(4C2"2Us|
+endstream
+endobj
+930 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 943 0 R
+/Length 293
+/Filter /FlateDecode
+>>
+stream
+xc` <w)uQ]uI^0ߵ{"}U dZ[,\M<E&/\O ā&}z#1Y@bos 4Ҝ\D[h%\S1
+XY qFG
+endstream
+endobj
+943 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 16
+/Height 16
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 73
+/Filter /FlateDecode
+>>
+stream
+xc`
+liz
+endstream
+endobj
+935 0 obj <<
+/D [933 0 R /XYZ 122.806 747.976 null]
+>> endobj
+936 0 obj <<
+/D [933 0 R /XYZ 362.909 715.203 null]
+>> endobj
+230 0 obj <<
+/D [933 0 R /XYZ 123.806 508.874 null]
+>> endobj
+937 0 obj <<
+/D [933 0 R /XYZ 123.806 485.547 null]
+>> endobj
+938 0 obj <<
+/D [933 0 R /XYZ 123.806 348.809 null]
+>> endobj
+939 0 obj <<
+/D [933 0 R /XYZ 123.806 178.212 null]
+>> endobj
+932 0 obj <<
+/Font << /F25 474 0 R /F44 651 0 R /F43 652 0 R /F16 475 0 R /F46 674 0 R /F24 476 0 R /F39 618 0 R /F40 648 0 R /F36 596 0 R >>
+/XObject << /Im54 917 0 R /Im55 928 0 R /Im56 929 0 R /Im57 930 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+947 0 obj <<
+/Length 1872
+/Filter /FlateDecode
+>>
+stream
+xڽWK6WhorHŇzgz:&\6msWJJO/iM%[ڋ
+2z{
+-ᬔM.
+ek6!/>Rݼۍ.Rt<8&MiyTm6LԖ +5Զ/J&:e5~ gY9hE`³o[P%tjO'pJ ̘p]C\BO?YA?6_xU}v #I4Ep{tE?idz
+ɮB9EEu\iB"_0[5ed5)@<"Er*I%gOud DF +Sߑ;R9p"
+ͯA۟$ ^CTUzųA/La^{9mrCx ')8IڒAxi%hu=5A/ΰ X;y3
+PM@ȶ!CW / g*=8#Bx3(
+q|Qfq˼'Aeއ~Zc`T Awof)P<W&I)8Ɗ0$鍂vz6KWˣg.pq~d?|
+endstream
+endobj
+946 0 obj <<
+/Type /Page
+/Contents 947 0 R
+/Resources 945 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 904 0 R
+/Group 688 0 R
+>> endobj
+931 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 468
+/Height 431
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 29104
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 468/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xw|Gǟ]{n:0%BHr$ $$tr@ B1Ā`cl*KV $˲-eyg4iQyy9
+@*H-S.lׯnT0+a]ڠB
+w/^GH)ͽ^93 AA> \]rE̔o&"L ^Zz)jq`BVAS#u׫XT1l]xX!X<p([`oSx1͎kc0h(/zB
+Ue!Bӏe WEu7B`T+4ת<@ARVsᏍs;ܪ'rs'G\F(b62>i{dSЎ/lMqjlœ4^}Ue ԶKkra.saqɃW2q?ڙA[ss=}c4IMab=#jP 
+_Bi'A8`no6vš^Xpu] ̙Fm\x%lY$l>+x
+X?_k1 B)p̜M;v[9#@g}iz{m:8}̋6U%E9-Z
+J#i ȁ$L<-9
+O/f|q
+ar-,*l{:+U83)-԰]?~/s;3,
+ڟwO e2hJbo7A;awr%A`'D: ֞
+>յmXҲ߆~?^
+X*v$IvH,7髑o~@#P˗&ݶ.x_wBkٺ֨
+Q3"zAj
+SPPi>]%{F714D4n3}jߴ!Z\ Et2.ۿc 2 iQ0<A|~o\UF JܨN;kQzf:J,lm1z@?%؜11
+1|s?M;Q9y%ިvXoko~5:W⮍6ģBd'!Ae"
+}ec>eCx$Tɛt?GXmf 0*z]ܵ1ئ
+@IZik
+Ơ9B!J!
+ HU{LX|Ԭ, b0`0n
+B/S]-PWY!Kn tUiֈ`K.3Ȝ__ӎx` r$!0xGD,
+Jx>kfȝ\m<rC!!!M69sFSPPk o/^ܶm[
+l©Lߐ(EH%JRuVL&~sM6'|"\'
+ǥ6l
+
+
+qㆥpbDխ715ŷ{ d1r5猈GPחy.A\/#WљypW<4!r̒;jWRbɣ-rjTYY
+
+M6O8qbll,B襗^JHH͙p?[nqqqZٳd׮]
+q
+`
+QpM
+
+ wM2IoxDlbh
+ID<RX6f[e{c0g_"
+Z7 @Sp(|
+ !# c}2_B@@SM" M
+Can˘LGvɇ.ȅ[sI%N* J5\=50PQ@K\3ݮO^%"$-/>`0/W/=wW"4zSXV\2&R̾.h!^BѲjLEeXJ7{㽯w ca05ɚݗ3sU&dҘ
+
+
+yiii6m|reeٳEFFƍ B`c0c\#AAA;v8x`6m4idɒo,^V4jh…Ǐ_dm:4jȼۡ{SL2dH֭__}ɓ#""<(I7nD"IHHhٲellȑ#۴i3cƌW_}qoVuٳccc?a3c0Li z\*=sU[ $ټyWZ@03IN;~ۄG=r*/?/`07`3Mzzzzz`0/
+x`0n
+Lqv=;;
+
+ 7o.$&&&&& m:KK..\qF@@@JJիiݻwuu|o߾^^^pBحm }.5v[ͺw~̙}
+
+up[]!CFFիk:k\޲ee˖%%%uɓ'N0Cqu@NNΈ#222.^rJ<vlDGPk&Ӄ+7"""$$d֭nݺ],a0Ҷm&ܣ[pIl-ΔBzxx+Wk/y'NTUUM>o߾2F 0~|M|3gΔ|'Vml <xՙJ?4/; gA$''Z*))I˴~ơRdw@n۶mܸqbyXlnmAUw8MY#<<<YvAΝ;\rر{]~lDEE9.k˘1cju@@@߾}Go[q^o~~~yyy}]1%&&&44_(gW|M{rk`gkG!׷oߐw}iTTTMY5]K.^^^uk+g2n@N8Q*Ǐ;ֶbDKn¸:mrS+UŹ߿hs뺁ҁ&?q!:u3gNJJy͂yz(-W[3ΝvWg 9Е70D^t);;gϞ)7 S޽{ y1͂y.3ߧ!C87 |1 fu`0owP0 Y[P_S0 b0`0n
+]`'\#-**)R*
+b**++鯿+tcه
+y.5!*APrʽ D
+ar"I] ,xg͚0p@Do>aڳg۷ݻ$
+
+%Q'>n ̴? k~K'v=q''!
+
+ :uoiԨQ@@@Ϟ=^
+
+"љ:u*8p`ii˗Q?CMM޽{XZZvܹ]veee.\zzz ̡C&Mjjj_KU]Ǝ?$""BEhL5WϿаfIEEEdd'|RPP`eeB"266VSS#"fff챶6{ttt$ N<cbb"ztzb%֤]I>k߾@XɮJcGZZ%%Ν[fIvv6[X\\\^^nhhHo,::ۧNJHH UtY=:cjj?yNmӧlaNNNmF
+7lؠ
+2yyy]t\yWJ;#I閗bŊ GGɓ'ѡCnݺuƍ3gl۶rI?~N7
+K&7֭[{斜$׭6###G^~멩ﷱ
+
+JJJ:}[vA5bn~~ʽ
+
+|
+
+
+$v)鶁d;|I #栢t
+{;
+C"zkӓxb}}(l6S}1c)Vuuuee%aʽqϞ=;w|?;w̘1C6E11 S:7nܸpš%Cuww-<|p-(wZ, ~~~QQQ@ t?^jՐ!C tůZKKfff+V(++QSS=zt[<PWWWkhh0 #8YP,ŋXTVV֎; ND]v=rȌ3hu999m߾S'{Jȝ=K
+
+x/_T}&LcL6f5|V-%,mhoݖ֭322ܹs͍nxa7uݻkhhr{x#"===wQEÔmhٲe<D$
+,4>l
+nJD7ndݺ;::.3..>sII0̈#Q0ebO>FFFUUU#G(**;wŋ6p>[a|%R^ھyT0[(E>ِ=akKIPHD]tZo`ccSaʝ%Eì3F(?~رcVX3[oז}J$c>R>̚ QHH>gΜEkԄL۵7m^ď-[ֵkW__: '11QKKKngXMd:
+<
+H8u/Z%?bJjkZ ߘ$22O$?&Nd'6|*) -&Qa
+O/By=>GTn|횾WFΫ\YުOS'6v/|Zmt<`Xjӭ}N&-
+\ldſWΝ~۷57&9䂼WyouzTܣ#gK۷o8p_~ODɓ* _ǯRι.01͟ƖWfbQ_Tc{W^r˗/]6..n֭M@2 9dOUz)7~ZhhǶR,^xǎͻtҮ]>/^4IU
+ kTTTl߾m޼yРAcƌINN\`ddFD<-o߾={ܥK'Nxzzzzz0@KKXlZ& PYׇ^'/""_ԦLkErss
+򌌌(99ѣ4
+E/4E5ztRt۷322$%.]Z~VLL̝;w>;vX+addߺu+&&0 ϟ?{lTTT_[nf7OE$ $Lsu~Wj|5%7ܹsYYaݻwׂ zFC}!(#ZKCO_+|WS#ʺȽ|„ &M:{P(tŋ?c>_^^.455w`РA"hӦM . -NO랆 !i}Ly!!!ƍ;~xaa۷ß<y¾dMDgώOKKka |ӭCw4x|çOn u:IyMll<~,{W_}_噙ш#]]];v8a„ŋ߿{5|Ǐ/-- ^bٳsrrz?7;؉.^$_ ndɒ;w._ܷo ɓ'w{iP\"OX\u7P1/̋l,ۛt/zM=#zDA^mA^M)J&Y&k ?s&hQd'PY?|
+5!Ԅ lX
+endstream
+endobj
+944 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 358
+/Height 479
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 953 0 R
+/Length 30571
+/Filter /FlateDecode
+>>
+stream
+x\(bA=;zzzv={,ذ H(`CM@"(H/;R7 wRf>W&/oM5#e=7wPQQQ(
+CPQQQ JTX*@X}EJsxuK茍W ?jeQQA]&1Ur5nx>2(8_^u%7֜c~F!'{F-Z%V+23.?鸞:0S. 53۪I'hO+ZJZ_V\3ƛ7a۔l23[TvTUR ,*j[$L=to;Y@j6oSi^UR ,*j[+`mG =`{> ~-b\ѶYq15vsi7W.Ue+kflt_Z"7lV\D#ԪM;jݮnNδ&eJ9+.=aT[Ozzgg''g焇?w+3Sg}3K- PJ
+.[@ TY^G-[uyZluF]q;c)E@l]hqJ)ʾ[MjPG`:J
+GREZzoѪM6z JζR#(9Pk9oA1.{0Uؤo#<Kl9W~Zܭf8 q?t"P6 0ʯ,Z.*˫s¨/кYŕ+㚑6ǫ<٧qcR
+5w5lQsݜ]vvע3Z t4~M-[R3y]յ젩PԳ;ctJ~=FC)(BW}rX؜:lQk'Y}=ZsW8l4a;؄WvNǔ hIUWr=g =?' J< ^3w+
+Kn NR9YkPVp
+B*UW1+u;ܙ~m+[?|ڬ<adh{Zס)}Fo <wݪ^vaŒ[kXrf|Aw]}tRv1.T+vNBͪK;y`c~ca;Q锵Tئ}kڌ
+\E01oYP޽Ma-KoTZVH#P[vۊ*Y;.w<﮳pSaR&5DWo`Vq<j w^uZdީةkZ. k>{A-#:[{PB͛ܭӺ0\O8uZ~6k=59=Ӧ9}Yzv%͡ڎ+v_
+^عNyOކr۠[
+Nn0'v22~ݯj{Vn-VfkOa``^Y1*mǻğUW<w- 6Iz[\*XM37L+eYD([VHWw Z䲤rfl}#K-ʇ-8– +\f)Sc]Bæۈ]2j>Zh(U䲡-jk=O'*父?'n%ƶ7
+qX@^g֡25Ps>.{]AqzKmVlެ(;pˬGasdz`PIoص[x,QjQ)36),gXv֓mۉ+9VyFޓWwW;q1㸬l. 3؄W~~!LLbQF9{'/a'6֥5;hK,
+.7lwiz1{6n̝N9u7&vnQ)d;y.Ugܩs6U3}F=~kp.߈nTp=`m''9lʄ~~ †5ϘY5@Ku34FL|cMfG o'ĵ]@¬|tۭVIW2kf; [NV_kA {l S\'J:aWo1+}k1nگ)w'llEuRE]z\M
+J˲X[_th-:#ArZnӡkˎj F9N1o{y`ަ]aLA^eJ&hj0qVRX[.%t"RfOZzU*&N] N̄>\B4jZ`n+wsںt~.1]Sz.+O1+Yya!iFso8{XJ%jFL̘O:wڡC٭ݫb=Lr%#]Oa2zʬ6bJt3w9Cg.xk &kWp"WLbS{%wu[GMI~sm/BGydUJ5вM%Ǝg ](ݫ i{)96x,~v{W9o|oNg  ]zn3WE#'j8ըzm{%DޯS^ӊ:vVnzW \o8(:sSiUu߳Wo؟1pw0w/BRfM>սf%5.93t;O?> ]xlxc'/p,wߡIKyC8
+˪ZlBj1u]ϮmYs:o&G#}&PeՍu=NzHszu߽:Oa*:d3*Ppstn٣ Iz۴̫_s#>٪7h\e =/{M٪ 1=}t֋cz
+u=aA]//BQ־d@SnwyC7~G社VMoe~ʂp4,. Qۥ]#=R>؄Zigpi׊.xG-"7CW*{q-u~#I-[mݮɋ`
+H $
+
+
+@AAAb 1(((M))\]_||&,)):
+
+)II_\\CB" ;:
+
+
+)QQqffN?p8eg
+J$o!50NJJcy7o%@Aijĸy=뷎 ҲRPPhc
+JS#ڝTWr}eguCLLRaa1S
+^yx3#{E|}f͛׸XJJÇa[h{ՆM`5bܸa5:: ʩcctff8:ps$yi @3nɒ%i)**NM<YAA̙3}CC^vvnVVnxx/ UW2>>y5%xhժ*6ym'''__M)SNEEE q'(یĨ9cdb`HCnTTTR##*1ڷo_+kaÆ|X(m󠤤/_H
+ӧH>D$&~HKKSRR4hP6mzsθ8yg:t~ccc%$$NpCœCs͛7wuugŋedd dСôi l.00]l<wX# . 8;vݻwǹׯ0]^lJo7odw~^uTTb\\2߷y5,,:"" [SSA 6@޽{ٳo߾01\RƏMo _ueӦMPԩS!ZfNp))Ç[~y ^mAg9(8a@eZn :::Ry<==a!~޷fǠu
+3::Ǐ
++0Lu^\:e;f)-)ۮOxa^mbT{#((Ro
+ }w, 1*]ǨIs#Ɗ+ ʊwc쐲vZfgϞQkc„  b&_Lb;6n/!1DS^wdLޙ]8{jnFYAJbbb*
+
+
+/_Vľk.j˖-{2d|2e
+ץaBߏqС;v?y?F1S6S=F)ٹs'dѣٳ%%%!m۶֭;vg!`{ !efwtXá!?@ɀ2~c y&u'Znݽ{wa0`ri``
+
+?G3UCBzn†Duiu['((H :)/⸷g5IBKPMőnYAOo|-oUZ:Rͭ31@AAb 1PPP(((H $
+
+
+@AAAbpjUdqZU94M g%?ZXeR">VInk_QSѴqX.j"1"1\-EJEӪaY@b 1B$@b 1H $-Gb 1H $($;IM m+g{?oT?vxkǦݡ!h}M`li]ӧW -߼qM7͛7f25i눷mۦJW &Ճ Ʒ)Mqq[hc۪:cq%Z[=1BJEm 4ze+5^dq"`VN=gh]t:p?٣cKzU:u:Q#Gbܹӑ||ܱWU"@-#辰^Q <oٸ__c쯣ԵKgG'nٲ33o uUG|"p; Zj`t`S={3TRn6dՊ`gNҗ.Jm : ПjİsuV&t
+3iXj I'ۻsv`OkH #:k҇iG w|
+{7kϖT=;ׯ[N7v@մ==zt   wvo^?nlP u.ܯoM7HHHtڕ';{ZZZZC3'ee{+cYi|C'ƕ!]K2(ǏoVb_^=g9&OOs1 φo7=Bn(W0c0zm-{ 6)?e C䗓iۭ0ڍ,]<_ל]ĥ}E7WiO86."1X[gUW~ܻw9s2ik:]G[cҤ !Zi `rR#i'aF.p/[
+_+*W*3O>x+]ۘ1^N!3h-K 60`($T?b}?*&/Maa
+,{qfM(K pR
+kN Ku쩣,f̈́0f!lڰ\m֜L`nvGn:f)kZҿSu׮]b/k_Uړ 70=][k Ï/ŏ=+*©x G&ƻ}槰w޿Mן+<wkʗƎ
+I f j1/K8~d/ ))N;IsN+bbma;e˖ǎWkN p[6t&Ӽys.o<5yCWJ]7ys2m>z##8K͉uk>ˡ
+!II.]:T8޻w/!|YuK{>E_cjbT7[>vpςچ9}igEb 1]k=:v!aafگo_;w6."1haֶmJݳi}_7eH @b 1H ;$@b 1U%**!/M61RHjx#F6}(MG~61B@Ab.1FVs$zhrmo\H FCb4S-@b 1D31@b`1!1FH $c 1 +_߾RRR?G׮PO_d}ϋ1*}#OzaJe}{d>߻Ab4ڲKν{^&ĨvQQ%1ؚZ^~Ѱb-7ڹoY111 5O)&FkժoS&Sz0fm ll7`@֭[^"1}-[21x+tr8qQPb oD%+Yuﮭ:ݽcL.4t [6oY[7e}߮`{xc WokUr#|g"1D3[7{kMII r~/<o/ M~%ա%ooܸ~1 TL<OܜG7vѳ'.oUڵ[fcgވ;Y_R-RRU7G@ :Y1n]\;!1; J 8@O"l;:X|?oʅ ϣ
+gڴiѣGw*Bm[7S۽zn
+cx#*g}%+;
+'wmM#L<1;Ν=͛MZZ-AFzg+17o|98oibV$F{#*g}%+ WrT8!´rRr5sS=ƌANooW=`}%+V` $K,޴q3 30wZi² Mzzqc!"!׵
+kc~#*g}%+n߲\OL1`֭aڿ"kY[7e}߮`{xXmk%Bv&lL|뫫\/):.7{>H ]IC] =eCd{w)4n72bT7c4& C{əӧ>4⍌U $U%% bF,$;@b 1H |_ *j]S8~IMC E$E
+
+\ԁh۶mXX a 3#Tx+6'gggO>!+3o:!b [NW58yoJ=>$%p.\qߴiXRJ ~9'N| lSW>)Ǩyt"XP.!\.
+N81Q/^LEBG>12>i^u~*쬬\Pt5}؉f`Frٳgw\|$cy a,J֮]xիWa<~ZK48y! 'k%Uڑ/_bNIN
+a孬Ď;P\.X
+c^9.CAץC ߁Jllln߾ Cа,S cIRRLg`Ν;?}Ԓ* NT%%%ETEПGC-nnnT3FLL Xp.)P }?(8J5-0Z"\|$u])bx\[.Ppk׮^jϞ=
+
+
+@AAb 1PPH $@AAAb 1PPH $@AAAb 1PPD\^ԟ 1PP"1ԇ,Y@b 1Pxe\MP*Ab 1P
+.(Ab 1jH t___UUU;;;* ޽{ЄD
+
+
+yKKK  ngggooO L4
+&ׯU`~_Q
+j+"XCYUUUԍښ^ـjittt>|._1ޏ{>Q*A@4w%H $JS$@AAb 1PPKI(( OM(( ͚ս_$
+
+@Fs?-D>D.Č鵅Fs'CtLMjEE|{lEbw%Q<XI~MbAADa!F{@bV%5-C4ѣq.wĔ)81hAt
+AVuZBBȵ!W!PN,̙d~ő<Q$#&% $ϭ̚E=M U
+FnD߾dCT(L ._nsg`-o7!÷+TH 1:ֹ1
+# nMZn#1pqՊk%_JF$ɵTA00 ]݋\W'53&=Z)z5:%ƑKJOϊѥKdCׯ_ǘ7 bcC&RƳgMrz1ZJ71ȠeKרm t$];}| '$1 EVk%\`tHV_;pHB9…DԆ`b2ٹ__r:3aqwYM@+Z kq$OcxgCMCO$QUhJH $F$@AAb 1PP[@AipXo!"1PPGA53I
+=3gV0W> e
+e r/ć Vimm=>\ ?>3
+ɐҀ|"1:T ] ؏pU9QPj]U$@Awb֋"1PPP7Eb4@b|ҬUiI3$
+
+@U$CD^kS._C\4w#1Dŗ̌)~'//l}b<!H0꺇SRfTYa6Q[䷫H $x(tQin1FW^}rCG6[b IeOu]2Fgn]In@cT-Lo%*RE H:LLV@ůdƿ5>`bߞGkvx~FIƳ$I pu]6@9IiPggu6z@b 1
+5菉wff<O;)%YQkb>NYqqZhtqF8 ˾fqddE' _VC#y+h)JpJ7`pҽ` ^a ZP1Af5xV75ƈ3|i~#Pk::,1< !Ās(81tcD>8';P(5$R8Vq8H^C~M@DQL
+ @3x~& o</1Jc?_iNOn ΦF Db40շJp(7pO)Y@eA
+){W(L
+QS *:c}_Pn)
+FVԉI3Ixy͢['c4u D٬47w#?F[>Z+k%$3W]&Z -/1(WpAK^I3Ix7.lcc0u \hLJoO"J漻֡0r:!ΰ3?9MǁpJ8e%1 A%(|c 11PS7FPL50$^$ A Әu1\ 8H VQ`[ֱ!ΧOi`
+
+
+@b71yE(( /M(( Wԃ.YGAAb 1(,h@b48bQQu1묡Fs'CTKZZ#QP÷>99i/_..,PS&FJ"K2"+%n1P+1jU$"5"W.=Y@MBG$ dJH^UU SS";l>u6@#g$Ύ{>Cĉr  ׯvf&-͍Ruu"|%G?2! `̆8B[H&A3%1
+>N;/9wP+I +jQ_C01
+J'((H ቁ@Ay
+
+@as?CwWgZX 957wP[h<|"1DwZ-0K$FyD$hRKe!v41:8޸R9__/gs $fVr$|nPxpinI/U׶H'++-NU(@b 1DkLJt0E
+ЗH KE|"1(U@ij@b 1((H $
+J^DQ޴ #
+
+H TT$qhwA4JH.bA*+
+
+.(Ab4Y {$6l ƌ!#G*="F ڵ#n%SH$/^TdljC]͊o;t >>p!Ĉ GGu:DnlìҒ5,ۻ7)x$F=44
+jUIZ'1H \@bV`ՕPQ!}B.3UBS} UUPu9CF,VV:k rJp?mD^}Pһ![׮?\+") Épd줮 qym[ׅ
+x?G{>H T] ]Eb"1H@ Ak91 EkwG9((O|20
+YJH $+潫H $Fd87$@UqhTE>>&ķjٵkڵT5><y2=4n2RN.&g{rJ*vB
+OkGD*i|RE_r:uVW$&dس'C#/[٦MdJJ(PQ(81BBZ\VƝؿ?B -Ps>1ceecV C$%zȥzU8xplQ'NBM- CÜO!:s&R !TDl5jĨ^u{wj``aiP(,fC2Ę>=!#Q 'N߷/ WËT^Og@i:ilfŠ7mIH $;CU@
+OE&%
+&w|kh<U1hy Jq*mR7jĨ*1Ξ͈.)*<yR
+tƌʑ}}k%@3g2ڴ)DÆ9yCA!>`OW $  +[q!$јgz{>_|!gS$
+4w%HJ }]t<9&>(H $
+
+@b1E(( AH M4k@AAb 1(h@b4&bDiSG=M݇NO$h#NN]_ቹծf\};ĨyQ!%>hK!qQN@b 1DyV(?~x´i22YT" %vӏ.KM-OVf%?vllR4~dLϞt,^"Ǐ/3lT;cgvYVL,vȐ|;;v&
+ogqXXIݵkƙ3HI[I=JK7 ']^:V:xbe#|#"oĉiqCC!14_?p=.-RsfId$gcvx!> _`'U5h(pwt^S'}Yii#CcQH!%^M.3g)Vf%)x!LY>y*?-&"1M>>ةm |_
+hٲRb[o߄?e!M88Tw=9rX`vݺw>5@b
+J$FF)suJͶ!1PPH $
+41MmF}{3b85\4{>fwqTbދe~'>n@bT5#2+AboWˀ[X~}V%@b 1Dr͢F=jEҜgQ6Y 2IGIZϵj
+GK^ L8eJӊ)2vEY`m߾$wVHmya{ _O@b 1R6Q^'<˸>S
+ˡ--#N '%m`%kC|,` ѝl P:|,KGb 1$
+Ģ]m*
+ʄY 1FIl>hߌbKېyC6FPUc .bh$Z ƹwp
+<SY)<|
+
+@b71yE(( N2M(( }{L'CHEb 1(LV 1PFMdA\ utڢӀ4&Fs'C4"үJ{̏ÅHjyD$hl9Z/1$4Y #ÿˢrbQҳ9I6Q
+Y!sA|IVQ=cb,*~O
+qk>*h:MOjY}bdJ>(e:y$<$6)٬$`4ï!~ O-^V
+`*l&1+.41P[]dS~7X!}ieŜbHnx1
+XCA%y 9A4|Ab4Y /.41^%7&7851;b8d8gɝSpL Dg!Htȧ_LH $F]cpAoC
+zyQ%qy>+YaBA)3!ѱXt$Nx(҆BVb6$:Mh* lH \5bHfM~_d5̠"m1cK`֐WѮmhچ31b 'WT _JH $F5O 6.*pR< `BcIv'i#*`9ib|6xUǟtEC_@
+J,eUR\#"lh@jz'{oRHPC*iwg2xaS^}wwoν3sH'?_ Ht-""ADdb
+gz$/<<oᬭ8crR7}7$%J‘oHPE Gr<k|UstTqdWµLP|ػImьvj"fa<
+پ}attXF2nn&. ;)]y^r;DbVU4䁅}ӧJr"~[@o}Ǩsb5c|r 7cb0M$"H+Xc+?7C݆nz O/Mr䯯Tl{=ؿ본8 pYve,4T#~ĸ3aBMEE/^h;)w%|covH- jA<g+\ʲEbl~;\zy̑KSqلBwt-~ {*up?O9Q]Q16iv`ׯ yOO"d
+#tpVML\qތ碣/0DPj|K)KJU8@:_+kH-!]iܑ"1ůH:>Ə!?m0pCh?ؾr:~F?5U/_-CP1cbO
+옒VWn4ܾ-qc}mms+lIؗݺT(s+x$X$FEp䙻#FQY99Y= -J%~ C:FCC=\C^}5=ۇYYݻdjF+áCw@IIl^s}EjbJY.[{^das~^d3C2m#M @jbd
+%dDnSw SzrRcP+ܷŐD bt*αڲԆPVD A"D q?HxD"ubl)MT[
+Y:GΝvА*Ȉy<CN8Hrr[4ܸ\\\1$[F%Cosug)8fiqځCu߱
+sQ;j޽'g'#wp͘]V^;!jնy%xK/ö9I'ڪ}zKp0={^`~_4԰oaC>}٬%pۇ
+Nȿ'+K 7r{WֳPq5""U^.GoiiLqqޙƈ@Ha^o9KKKaA`KEEŮ]PAeؔdMC.\Pyj.]:mbb"vtMGl!IsGapp0j?J||\DbxX̡5c_ɈʂPi<Ӂ
+\?ի6ĥuJƘ%Go npW^`A\X%kJ u@&.yVpe/V
+11b;{CpݸqC555pzdBaªtlJGGGs={Nxdjc AaɍjYSr#
+o+=w.<<5ѬIBlhhh`8H|!\}{‹oB|!vݪC:& P©ɵx u0NW uX1H)
+܉Z"DR1݁!>F%W"Dj[τA"$9zU6kF~kRee%gy[M>#"CTdݕʮvvll,I3"b]c. q~ΈYaS쳦ozT1laO=ƎesEXyyB &DX^6 ˷;mP݈wvU?霱SsR{ON(l7♵o{+JzMJۼ-hjaԉd^@FFFoY2L&!&$#T\~6^s*<K _ؤI_;֭k*LK1"ѻ7۱C@'4‹l9BI[ckڲeN%yֱHm` qFeMy p
+lJU@ׅ..lR!'ߪ qp/)ϋ>-8g( C;̽YW[:ӝrQ/#D\ 1QbB2BEoСC^C]H4q0Օ| Qz:׿W.Uc&bc4#ƾW*
+0rH ucE+d b0
+CLHF
+,8<1<lP棒^N 0SOIb#zbG&=Gsbly+Y> sVI 5c0PAA!BL0`ꄘPkI
+ggg77729#Bx>`3D+Cc5gpU81>P|3 RZP~mә3m& CT#bhP~cư
+Ȉ|i,
+,<#䋅YX&QmB|c91llE
+tݕGVI?_dIB{{aÆp6,J"'ׄeO!g;,63'X&6&BPyxTDhP=.V?YhD**O6M$33s,}ŊO<ij> A$ƸqxM91~`/? ڥ-_(U* 'bI-?eCP^Ch~E
+tL~-1h/xQF1$P$ 賡[FG+O
+/<̺Mv cgNLJG5H҂A]jEbE5OtDbDEbDD|+["D#bлD "qomZm[(ER{G&HD D HD D H](Q,q>$%J(%eb O%JpP(87(QDIu.!
+endstream
+endobj
+953 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 358
+/Height 479
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 389
+/Filter /FlateDecode
+>>
+stream
+x
+
+endstream
+endobj
+948 0 obj <<
+/D [946 0 R /XYZ 80.963 747.976 null]
+>> endobj
+949 0 obj <<
+/D [946 0 R /XYZ 321.066 715.203 null]
+>> endobj
+950 0 obj <<
+/D [946 0 R /XYZ 81.963 684.05 null]
+>> endobj
+234 0 obj <<
+/D [946 0 R /XYZ 81.963 551.759 null]
+>> endobj
+238 0 obj <<
+/D [946 0 R /XYZ 81.963 405.605 null]
+>> endobj
+242 0 obj <<
+/D [946 0 R /XYZ 81.963 335.706 null]
+>> endobj
+951 0 obj <<
+/D [946 0 R /XYZ 81.963 254.012 null]
+>> endobj
+952 0 obj <<
+/D [946 0 R /XYZ 81.963 242.37 null]
+>> endobj
+945 0 obj <<
+/Font << /F25 474 0 R /F44 651 0 R /F43 652 0 R /F16 475 0 R /F39 618 0 R /F46 674 0 R /F24 476 0 R /F38 617 0 R >>
+/XObject << /Im58 931 0 R /Im59 944 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+962 0 obj <<
+/Length 1770
+/Filter /FlateDecode
+>>
+stream
+xڭXKs6WḦ́9tƕę:imy<8J%6łȩ&Ӌ,orvl4y#,Z8'E<pB(Pl|re0d ;}wfv%{|/fX׿]]X>j6{=I;g,aÙ#ggnEL+ ܹ1/k#V턜0Ԥʹl<ƞ(G.ժ&+ D6y
+j.౹Y .kj
+BGAz|9"@3Dy(ET PPʈI?(ßDy1%gQ(S;bQz~_ȁwymsVv봠m=$)VmڻY]+ f?K b$L'OA{G­*I))j!N̈́ ~kj4]yFYe[G|u(K01e (d`<5pCu04!L1+iP $
+1qbQ);aOE}pH؀Yj۬u6rDX&dYLzl"x6'vYCL*VYD)C
+=LŦۚ i6j4NtcQM ˶2ctsH{2& RJ~oRk@vއuwb1jt{ͥ
+ۺӹש:jQ
+M MׂqXY͋m t %$Y^M}=ak,msIxڟ úܤllc^lЊ~qug\@-:7ZRk~>"8iMRA5
+endstream
+endobj
+961 0 obj <<
+/Type /Page
+/Contents 962 0 R
+/Resources 960 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 904 0 R
+/Annots [ 954 0 R 956 0 R 957 0 R 958 0 R 955 0 R 975 0 R ]
+>> endobj
+954 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [205.541 574.25 216.498 585.721]
+/A << /S /GoTo /D (Hfootnote.14) >>
+>> endobj
+956 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.563 557.811 189.52 569.283]
+/A << /S /GoTo /D (Hfootnote.15) >>
+>> endobj
+957 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [182.954 541.373 193.911 552.844]
+/A << /S /GoTo /D (Hfootnote.16) >>
+>> endobj
+958 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [395.365 514.64 406.322 528.436]
+/A << /S /GoTo /D (Hfootnote.17) >>
+>> endobj
+955 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [448.603 197.877 513.345 210.451]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://plit.de/asem-51/home.htm)>>
+>> endobj
+975 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [122.809 184.548 224.653 197.044]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://plit.de/asem-51/home.htm)>>
+>> endobj
+963 0 obj <<
+/D [961 0 R /XYZ 122.806 747.976 null]
+>> endobj
+964 0 obj <<
+/D [961 0 R /XYZ 123.806 712.73 null]
+>> endobj
+965 0 obj <<
+/D [961 0 R /XYZ 123.806 510.655 null]
+>> endobj
+966 0 obj <<
+/D [961 0 R /XYZ 123.806 486.247 null]
+>> endobj
+967 0 obj <<
+/D [961 0 R /XYZ 123.806 446.729 null]
+>> endobj
+968 0 obj <<
+/D [961 0 R /XYZ 123.806 411.241 null]
+>> endobj
+969 0 obj <<
+/D [961 0 R /XYZ 123.806 391.813 null]
+>> endobj
+970 0 obj <<
+/D [961 0 R /XYZ 123.806 367.405 null]
+>> endobj
+971 0 obj <<
+/D [961 0 R /XYZ 123.806 328.551 null]
+>> endobj
+972 0 obj <<
+/D [961 0 R /XYZ 123.806 292.399 null]
+>> endobj
+973 0 obj <<
+/D [961 0 R /XYZ 123.806 246.782 null]
+>> endobj
+974 0 obj <<
+/D [961 0 R /XYZ 141.734 213.041 null]
+>> endobj
+976 0 obj <<
+/D [961 0 R /XYZ 141.734 189.131 null]
+>> endobj
+977 0 obj <<
+/D [961 0 R /XYZ 141.734 177.176 null]
+>> endobj
+978 0 obj <<
+/D [961 0 R /XYZ 141.734 165.221 null]
+>> endobj
+960 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F46 674 0 R /F24 476 0 R /F36 596 0 R /F45 668 0 R /F43 652 0 R /F47 733 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+983 0 obj <<
+/Length 1173
+/Filter /FlateDecode
+>>
+stream
+xVKs8 WHD,zqgLgX,l/@P83'
+1K$S= /,yaU,sUėG"6ve/8ҸNEԏR?#i1 SU,xЬ0()!PGcN^texynP_@E\|LU.GMWk ID9`t5Q$w(
+\چ}>xK
+endstream
+endobj
+982 0 obj <<
+/Type /Page
+/Contents 983 0 R
+/Resources 981 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 991 0 R
+/Group 688 0 R
+/Annots [ 979 0 R ]
+>> endobj
+959 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 1368
+/Height 70
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 28084
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 1368/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xw\le HE+vXIK1,=/&/ɋ1=F1]Q*.w1"e]@gsgs:0 `0 [ `0 `0`0 `0 ;0 `0 
+ MOO`0 V_U<?_ŋ{+.]ʿrJϞ=[ͳs=uuuGv=gΜNEKz+V8w\?
+
+z뭷Ha͛3t< NEp[.D"IOOgYV(o&ŏƍ׬Y_l߾O>AoMےcǞ9sFȐJ?9sf^^^
+ټyغ6m$nwnܺR)t]gQh `0?m:joJJJ{f<xps)//wS
+mUq6\K@6c{eY!{3fuuuݺusQsw-59r%⋎1cƜ9s>..nĉ-++s7ESZ+
+Rh"$L&Sݱc?|r:4}(uI`0 :Z_z%јRC~qqq⶿AAA+FB~~~.V|
+ARtl7j)ݺuQ*Mj"/eDfh4gdd:b(4Mmmm=v7|#8Nܖnٲ%44T޾}Çcnذ!::zܸq$IN87HHH8pZmٳ]裏644̞=7nNN8el#CLXXX!{Or `0Lj_[_9E7y:k/;;;;;;++kbi*_T400P
+^^^EEEeeeF/lfST2Lw4z+N.eKiUm'ڶGapp… ϟcǎK .'u]G5*-r|?c[Dw[%55uٲez^&!7J jO3ݜEi53fsssu:ݺuBMzxD `0̭[VVƍfR玀K. OOO/Yz5aΝǏ_|ܹs 2iҤyFJ|)SH$A|bbjg(92&&ǭz9'&&fժU?xdddYYٚ5kJ\{۷o``ŋScǎCŭY>kVh9s ><11qܹ;}fsttܹs͛wѡ^xxʺK ={lv[ڶllFi$}ݷlٲ}.Z{ůV^3wܾ}=<ǯi[3&44_8q"#G@Vvc)AtXN.+->6Ouk.r~*3f̘zjG:u8yn^ `0?,&N}޽{|M"DӹBaa>(d`0(((hhhS99rwٻwV
+`0 sKٲe˞={֯_|7#0E}}}N q%Kza=`0  jVmY؉w:hVVtٶ嶜״uDLIM;]$X"ƌs9R?`0 ^7`0 `0 s#1 `0 
+ Zm^^=$n`۩ȨE AtuuӠcn k:|irkZ[c({.//$ۙYB
+0|py%&#s옑a%)( 4
+l4&OU(ڗ|[R'IY!r,`0Z
+N߽r>r눷xr v`v`  
+Sdz0*‰̊J}uc4,4_ɱ,q|s0{ 'c/&4Z 
+t9s&^>lG'Dk ( HdžEUvawCl/Jaaeee灿!\ѷse
+Zoi?k߷[E-[8"D]6&n-8H$-K:R
+s-ӦDJ_
+9# ׉STt8I݃5/0\PˋEHݵ5 .u{e9GW;8,M>pC45k~()6lYcc{x]7YssK=y=#QQ_L&( Tzzzi
+]r6?ǻk,]%q㧓cٚt/vPr
+CB bht'uɼZyjkSꫫ;Ac" *:u:7']I{üU}ZW}}öR#ZPFq<%  p="@*rH~߳nY
+@h9ؕ:Yrhe9BG<_x,כjuV[;ma6[׬A&S<#AAz#բ󂷷3^zK@b e^^=7V
+łHRi66=2y`8YZE=Ó, LgNdSzt(`aYH|~Vt s3 ǰ1iPPn
+ Pه \[l0yΥ/;v^ctz &5PII壏W(d5GLAAc6yrz顇fZO?_[P Μ4wB {WVQ]& id"dg,X@ ! Ymu\Ln3p_TC6p3]<k/ f^
+.
+:=+ |Ab
+˖^hKtGy6˻_֎
+qR
+F{vYYN`8>H-V@D9Wr*tnnw vۦmJti
+x)@D'f0p`A ps"SȲ\M.6aʱ{+H4lR*a~
+UpEΝ`F
+ϮA{iԆAk*J"
+ਔX;ӧ^7m.zU"
+>weJ?vQO!y)ի [o="KW=~Y€=R H`N_0tF
+@$y=XJl (̄qEE]Pxoh\[ES _?Ų>-4ArvA04"=6tn{i0a ˎSc' &JEtdjrjZ={2!TiݰރG]WjTZQY:>#(dԹG8u<y\8@O/͹n!~N=͌7#ZvITWKt4yJ҅KyS $WV%OI2MSx#VƼl@rܯKmC|?jvM߲c_@eD
+Yjl,C7җZ
+tm2΍;#cQ@&.
+x˖̹zbUxLMmֿ\Trõx1Y(qL&djZܠ(#eYD"H11"ɋ`X&`AR"As FWVhWf~(@ogDŽ o}ri
+~,$? !COԦ^pQ" / ~PP|pbE{KldUFj}%OZ?z|]vw駟9`2!!O>AAĕB|8whMLieqbh{Rj-amߎq1 $X
+`6AHҰ
+H___ݮj\|
+O>z">y\xβ@Q wYLNw<%IBU9|y~qK|N=S7a^5yh,q.NRZ/6&u7yZM791u|RHz˃:#mUqDo#ƴVJ"?]Uoeeh\{SY+ؙl _[x`yBK%Se޲pkJT*JJ%e28#yeaH IYu}pLR)JBj}l%I5sTCjdK9
+ʾAR2n/Iꌶposk }lSKN9:nk5
+mNEod d>ҧ:8H\Y 䶲[ҎBJ('ӟ]RZvכV
+ V;R @P_b;u67<Hyr
+Aie9XhOTo fV+ynglfy6|rʰD?jiq`rx\qqB! "ϧk
+J֠+ =1_DD"Q*
+BTAG
+vD8BHGh@G]ov<ɡÇ8 %CR
+]
+4?/{[SF+K}b>ƴrfr =q !)P=}Q`3+OW򬇭O}TL{sw݁ez,4k0H=pժ 3g #bhB_x?'Y][eԾigNO?Rnԩ }M,HHiӁ'ߟ<-qߞ]_2sHv33L/-Bsfyt_@s@j////5gI0e;85lre !҈[э߾UZ8 {=&K&vtB@$1UL_L 
+a7n _֮QbOg2VԻG~S(W}H $I d11
+))ZM"kVA,@c
+K!{/RǢOc"n
+硡eeeʖ.]zܹA``>'''GhF)\?5kk^O2*{#
+߲)E aJɡʶV&9R 74L%B"BX$jJ FUIqsPWO3lnNvsKknNveuMnNŹ9ss̹9vGY-kɍ.쮩'oڕӒ{$??޼ymmm>nN(HZVRn?v.Ш%Q)T
+R-ݳX}}:
+BA˲s?&) :^^RRt:ǎ/>E
+VP8&Vc$9 hw},\񡒦 K*דSH /Ihj]iVRT&[QӔn:biU
+d*L Ԙ
+,==px\J_N}o_3^k`dy_v4 *q鿛F>V
+ wx51>b.{V<<AfŋϟoXΜ93gΜFޭW>
+1$8X Y4ќ 2&ezp)N,4 HĔ 'fXŻx
+ʨUR?uVޱ_yݾ
+w)딗,oZ+ykYekeiUynk~-$N,DPH͉<RjL bb{y'犭V$?O-7+|w7ٳ';V\^^0%44P$sU}VׯerNəW 5}bW?~<lQQ}-CzCqqmrr,'ߜDD#G0l/o8w9yhü}$uXG@xx>@hVt'
+::8=n~@~ U7CD gl۟(lv`
+5!DN󧻵uE8w8]HfsI'8)#@LgYRQx^Pۚ(HH(8hA@J%q<'J0uMGa? A(bxOKn-{A,nZlٜ?$Ih4lR81ȑjҦ;׿MɓH9p1??t޼?_s>$M﹧KQU<
+SY8AAg!\/%b]ǡ@
+=`餱( Jݐc}Q}
+
+
+ A9voBz|G"6ЊGHD0} .m$|MkJ;\,4R)w-+٦9J^ϵŪ[Y飏ځyۿ_䦵kfevX&!]8;Y E\v@oHbPiiѣ)*//.[C\lZVv?Uz~{@+b@):
+ym58Twnq%X?kPQd
+@;]v݌a &t:]TT4)KځݽqW $$$==/b @
+zBQBA
+>p^Ɓq6r=#iNqi9t; ٸL镼
+$bc׆b~
+@JڝF% Ɋl"~^+[
+Dj|D`m}v#"q)^x+JH@- oէ':
+36?PCx *>BQ@Qr<Ͱ4ͻ\ò BYkL[%q[0,[_q
+3
+@A6p/t<5( #J"/^Z4] EԤJ֗fEDDT\b# kRe"\pS(#"TڶKw΍|)^` ({}3=F_^>uI;xoym_Zޱvѻߒ|!$&$lJ7[
+V0ٓRO;lb H
+(Lku&Q PRcn* Jbqר@XoW}Poz~!v/#B6) T1t'8.
+dE.PDrԧޯ>=_z |ף
+Di>G[Hʐ1bcǸwgόt1R
+endstream
+endobj
+980 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 388
+/Height 340
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 992 0 R
+/Length 21799
+/Filter /FlateDecode
+>>
+stream
+xXǏQ`ذwML{P1jbb
+**TzUAJGAATDD@;ܛ/777afsvϡx,3gÌDRLɑ#G8kP9rȽp@79rދ:ϑH`\ȑ#^EF?^P|n욽8 *n؂X4.9r
+t+$_>9 ݬG޸}&}癙ECrpU=3V!$]%GN66cgєͱB7u)،kw^U(/3eW=Uw?bk-K]ml
+o,wSrf;"w:FH]ɭCZ9،/ES;+#sDq]xQ
+]F.ݵb:ĪqɑSX!Y/ڿOCW8v,1}iYo'$0
+XU+V~Jh\9_rWn;I)j6`MO]ό#+ZᅔrjFUW%Ss_JÏWZJ*TZv0 KcjF-*2bnn1n_΢YX<EWQSkܴ]oƮ+2ٛ[W#'߿hYټɍyW>|ZXуORSׇ,w< sLL+.6sb 㚊էT
+lC\"w7dlvJW݆Lkѥs* fF^/R[r z?n0 X?懅*տ3Mn6ct،t[gьI|7b@@X~~9}[tnٳQEݕq 998wePX1{",kA0Vѽy\:V]'eq0Yc>W0RQkm[`?QQrw{`<~UT0j+`)O 骇qa6Y
+,
+l\a~'>CQ0K̝܃#,
+)[hX~_O4KjSd}%Y噹~`hVlwʬp&MQz7cYe D.,+߿9E&Ya.#:;϶)M]7w2vu` XX¸p»AX-ƭcq&Xԩ# bG<df mٿ'{č8bsrj}ߨIe0m
+쳺KIsjNMf^q3%D\N.k6uOцB+rt~#pNkFw57jM0uX?sxY$˽aA|報~<'? ~yf}`%;"' FT)+UVް)
+@UXXRvQr^# go<|ܢO _hj ?ks$BD,a*:YqkMQ$oܔͧ[LfQqKv&7RV/ap ϸ9FN[Txˊ~'bm @H"b E3Y돰ާR_u@U"LJ,=hr}U-!~_V3w3b?f(݉=s-xO؆G Soj'vcSƘo|wyj]YzƮ<9Eau^Ên]̴Wk4Emv'皬f. woތt=d]>c˅J2ZJyuի-^Ƶ-,qaƙyabp\[''.?SvS%=n= h8E΍c-q9GI+<))ltg
+]%Zv@`/K"pyжw/)0r"#eKZ߸%Cl;йQ0ZJ{(:SO-੪nkr^E NMjյS@@\.s]S渞c]AcEYQRIU>w37suȾ|،N}G:Fq]ڡ
+/T4_>fTEg}W4^e_rfܷ׆:|'-bɉ+UW4GEX7cΟuQO~_go8mK}WQk)6^ћfؔ28ݺ# /Iy1]zURViܬד*-P3lꫩ7j;quS`E2rJzx(ˌ(sv^!]}p<hfcz?}C6+}Qo 1v?[*Th?2.| =wrw`T]ن.Ei1 ;~چT7B @:h'ՌmYT|uRWU-qP>w :ĪqPug_4Lp1&3IKR<"_6H*OM7qlr>#e8'~׾(3<g<8_띴-_l~nN;5_F߸^g]{Iؾ$
+
++rҔ7q+$߿薮)LUX̯[ Ǹi[OҸ
+hiZ,6ROf|nӷdư8DҸ{:x!Y%/LM?8W"h5r[nw?qcYks˽.Ƞj!8>{fM GwyXRDzb8"H$bD"H$D"E$XD"H"D,"H$bD"H$D"j"z:$}ʕ,/"EXO>?{Ϟ(ЫWrzDzL$(7ԌW^<zoǚG"Eog:Vy?Ͽ=ifx? z^ϟiӦnݺ֭[ok]2weg߿};b.V+?ݯ_|/IYW[$&gV='O>3< anݺ
+ Ӎ7>rp>O>=uTZZZ-bч\EW2 >p=z^T=z[y.zn޳֬Z~̦=&7mۖ`NH>͚5 2ཽ0999GƷjՊo߾darL<>X:BFUߜE|?+#FWڵ>sxb@!NI
+'*,||naN΃\{nݺTjllZ\常4\$%]/V칬Y?.¸<xIʄ 0.Ytu
+ D|BXĢ?^<u}4꫿malْO*[b_oWZ͛7ǣ8x`~@L4h
+vo" s%"p>7oϚ5kNG]ŋڵ3K1 7a.]qV\j{…]vG}}}LU QuuuWX1e 7HɓёxVh޽5 !w}1 /S]Ҕ|!Y<J  lioo!Vff2+>VⲲ?q8JzQRҵ n݌x@ç:O<w wN3wUAZ,iPyyyܲI֭1ߑbСC1 mDmcܸqɰa64N$%СCr֮[eZ8jܹ_/*ڼ|ϟ?IjRjݻ݄-rV٘1c6;2[Ç!?ݻKф=^z=z<~@ZZ X^Z*$w\.zzz]Vl-},hZVyx~F$WvD11CC"p|Vٳw_{/ ' *EѸvtt䪝)ԩSEEEE,& ܺHŝ7o}||8([hfaDCϒ5UA:::
+c:ggffȑǏc"bbk#cQY30WlPYٕXk>KlsaM~O,-=
+y?/DYn_'a
+)EU=`UaԩSimj"Ƣ[+JݘxQ۸jsgYZ_r
+?x1+;9>Ι6;ei]4/$$$!!A1 T{C\o߾R,~-HEWl?Ü
+g-<<yFދ?ۺoJ].ebUb>!>AK.љ2eG7 d &͸qɢ ?f/R3>bgŊ80OTs{ *+رc`Æ c0d*}C-Qk׮I? R3hڵ˗/߿?EMŋW\eRQ6ԛ"ǎ;q6|E`x 6
+"##qתX+++DG`8T8LclBSUfGɢ\nZǕ e?9%ez}S~ a:
+ MNIzpT>A7oܸ~>~CAiiic4h7c ?Q%+%IǍ10"BakM<۷o.jjjHJ[[{ιIy ޭW)=z
+XaqŐ^TeOXN:}Uܢ'O^hma^F{^LLL6mdjjތI-,
+ rmSeYHYLGddܚ>}CJʕ;HKҪ[n{yfwZ"/2ˎJ^[RvưRRVMM͸rk?%H"S?K.9o%9oի H$b;~5ʅ H$b{TzMH$bD"H$D"E$XD"H"D,"H$bD"H$Ţmɑ#G99,*#Hw%H$Z/"H$bD"H$D"H$XD"E$D,"H"D"H$bD"H$DƎu見E$;
+
+ 4hZ0222D=YDvHE0pqAaVpSD5kƷ[`-
+$kgggQVVU ĢRzF,zA3E蛣FRVV|;#G֫WO |oz{{7lLJ
+={߿_͹͢}||Zl<rH2 Az*
+]]]a.Lф;ZAI|ƊqMR,b!8*))7oj6m9 oD,"Ֆ]4;78C&F>Et#$D"E$XD"E"҇½n>J'
+-rUef#j
+IG#E$bD,"H"ҧâJ${Q'")E+99}ԩS]vETTW_}%&11cǎ@">q>|O߯233G,4Y$ܚ^F...M4AsrrjӦMXEvYYYyذal3XR-eL!=$LLLرghZZZZPO֠ARСŋӼys.5!lmmK4j$<<w[0MPHH%bQY$5F lahܹ6 ֡l9`
+
+
+â.]J&5#R
+Mvڵk'"lĈJJJL:5'',.Ж444zڠAU/ h###4iv;chљ5նm[4i]]]Xw"+-- C`G]EUWBBBhh(>tw7,ɇs#0`u 6ӧO{nD'}4,:rbXč7[ryzÒ|871ajkkO4 3wѰUV5iDKKk„ caI>%c@E$bXD"vYRG,"">D,"G,"hFHvMkXD,"E$bD,")E%%%;vԩSݺu5j?ܸqΝ޽XSNJ jNNN9s9{]TTZbQzzD"={ԡhEZ
+{njj̙3;t"@T=ZT¢:u4nܘjXD,lTҊMgxl``pƢ1c|7JJJ=z8{, )<CȢqơ"\aʢ >l֭=zyٳvll.oZR*l~yD+BIPQoqq10_xQ__Ԕےeeٲel1)޽UƃʼrJaŎvҥ
+(3}۷=;nwDĢ"OOOYmp IKKC)**7o!c#:,,,ڵk >dE>MY)+B|K8G;|pǎQJa-JJvrrr~~!C6mF`E-gQBBرcg,B͙3Qbt:p@`G
+}lE:ڶmzhOsv&Eѣ8-^ kx4` X$<lw7X$z
+
+
+5jTVZe
+
+ںu+MzQ'z>`_/=CDw9G{/瀰%#'O{nflXb_p,e˖3Ǐ3:t҃<avadd#XTE0l<X3LŅcAĢj轜–0+DŽ}5j>9rϢpL7|Ѱj` 6H֡8Uza47n <^$zْ֮8g}VX?R4551E <1ԬY3xiSЍJ
+pߣ?уGC
+X$zX&JKKc"]]PHĢN:aS}8>>^[[=XD"UK%%%VVVM67&MĎ_|sS&E$XD,"H" YD!ޯ
+i}{XD"#H4Gs@E$Z&5D,"H"D"ĢpԩSLLLÇkv@)X԰aC֮ԩӥK???}ĉUD ֭G`,BYn]f^xA,")EǎqFzzѣGvvZ;c:5XXiiDM6#իWjj* 奣2ubE.]??Dx2ŋMMMG[jl``p9s_~, zzzk׮p'X
+dх 
++0aĘ'++c)!Ģwfs@`\~=33 fuE˖-Ã߿? "XG zÐ@+*q2.p)Xf,=q,_Z۰V^D8glcb[s@֋Xg߼y3xH(o]{2A ̃hĈhTR'w3@vvv.#J+XE#$,hvD嗖6֋`QQQQhDO zŢzѻ? [[[;44˗6lc
+ߤIL5F$ѓA7
+}*6lmg)!\`x`N$dFC[=TXD"GAH"ZzK'E$bD,"H"D9 "U!O{H${D"H$XD"E$,ںŞ9rH$9D"D"H$bD"H$D"E$XD"H"iQF:utm
+/^ݺu?.? .oU*IԸn+UAA<Iʢ'Oݽ{CMM-::XD,"=u9ΐ_V ؁~vZD9qℬ(ÇպuGqѷnڴiS^zYԧOGAIIɓ'2dhYf!$KjҥO>={6ڰaCP~)s,t;zR~P':u266F:-Z$44A 6͛:9{l\xQ__VҊw7nlmmaGԓDz,B,8_͛7PE***h/_tttDEjv9:+
+X-ZJE]9 999#Gd$ _^N\lڴiΜ93??^zlzE/^`b YQXbX2?E,))px͛7'&&vUVD>=C?t… H޽{0{g-  41cTu)TٹsIp EU'M[ZZ
+sU\gʉȾB\0
+w >3fO,PHHHa 0
+xG9Yĭx " ͚cha_필,.C5? >dD"
+xG9Y4ac߾}fͱH4q9۶m^$k$)`TB^nN$R`wsJQEYf.͚H4q33+W2OؾaU^IȢ2TJmkXwz.*M];U9ߨ"D\aĭqfe$x||<<SRR
+
+
+ Vm{%)!| vA%qA,'
+3~E\2TJmH!aH>XEzg?d"H"9:u;D,"01Ld$E$bD,"H"D"E$bXT-Ё"bXDz7,]"@se==kׂ-:::7䱷jܸ5?,Ht r"nC/Q!
+TTg"B'D]fFZyNѓ}gMR-b5U: XDOXD,"}L,z2R"뫬bXD,z,z1C_>_QAOiEXTcNJsV1>aQ-$<x7/dݺu׍76l('ĉUUU322SvZiaE
+;wD@fц -Nh.45LN˞.jndٗqO>KJJ
+L355X
+ ,?~%Kp Jhhhydgg/ZHWWnnn Uff %`r좄4cǎ!? @QuСECIP999 .Z)oX," Ϛ~nWYὼ+ѯD*Л6nثW/xbށ#tD@fGգUKT[Iwwk~$QEMfdƅwX" +T^nݺ۶md BA@ҥK\\\AAAIMkƌBw€NfffDb,cJJ VK"!Iˠ)@~@9חv˖-n$ƍ% R|pa.LD@f=zH~HK:K)<H^I$a~ oܐwٲe&Rܛ7o@BL<0]o7o L[̆sΡZZZvI[[{޼yhWh'JD ]\\8HVEh ,ܹs>}0
+Y&E!I/n,W6Qn{%9=<< >;;;Tc:tB⚱&m
+
+
+¤OM1q_/_C?L ch,r:Yg{IDR(dJ$[$6{m*(\/BmnMLL!CgJj;lll=|ELaaDb]ׯgffnݺU45V7r `P"zaÆaUE7n400@Enj0·7o4h(P/_/3;`j d+Id}!!!xGi׮\D("""cccoܸ1x` ^ (!-AJ4JT֨l?q{W
+: X'EnU(轳(")}XD,Rԓ 
+cE"3XD,
+'E9YVߛ<k@Eu{ާG{עI$魊XD"E$D,"H"DE Gȑ##Eȑ#E&G
+endstream
+endobj
+992 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 388
+/Height 340
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 306
+/Filter /FlateDecode
+>>
+stream
+x۱
+endstream
+endobj
+979 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [350.506 530.051 417.191 542.602]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://software.schmorp.de/pkg/rxvt-unicode.html)>>
+>> endobj
+984 0 obj <<
+/D [982 0 R /XYZ 80.963 747.976 null]
+>> endobj
+985 0 obj <<
+/D [982 0 R /XYZ 81.963 719.953 null]
+>> endobj
+986 0 obj <<
+/D [982 0 R /XYZ 81.963 651.006 null]
+>> endobj
+987 0 obj <<
+/D [982 0 R /XYZ 81.963 591.109 null]
+>> endobj
+988 0 obj <<
+/D [982 0 R /XYZ 81.963 559.939 null]
+>> endobj
+989 0 obj <<
+/D [982 0 R /XYZ 81.963 485.431 null]
+>> endobj
+990 0 obj <<
+/D [982 0 R /XYZ 370.879 473.789 null]
+>> endobj
+981 0 obj <<
+/Font << /F25 474 0 R /F44 651 0 R /F43 652 0 R /F16 475 0 R /F36 596 0 R /F24 476 0 R >>
+/XObject << /Im60 959 0 R /Im61 980 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+995 0 obj <<
+/Length 172
+/Filter /FlateDecode
+>>
+stream
+x]10ہ(bc"L]dpۈqwSp5en6(`tY
+4щ3D^>(E"+O"OyZR/PJ
+]ԭ &j'd:>@5Qua`aJbY]
+endstream
+endobj
+994 0 obj <<
+/Type /Page
+/Contents 995 0 R
+/Resources 993 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 991 0 R
+>> endobj
+996 0 obj <<
+/D [994 0 R /XYZ 122.806 747.976 null]
+>> endobj
+993 0 obj <<
+/Font << /F25 474 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1001 0 obj <<
+/Length 1793
+/Filter /FlateDecode
+>>
+stream
+xXKsFc
+@xsIgۼHyE,Y5ҴmVĿ-@޼zl ID:.AZDW_OH:/
+bGO^
+oN_U tzIAȉtӅS6 =s <5?\NڋXX|
+D4oUrJII)ڮقl]dĿ^:+bJi2%\Wd\} K)"7"uVe)MDQ
+Sf96sƔe^!7&WH'WXRCwme_)ߐP-Mal {6#}JlCTyK DR ,DI>2H>S,B3  ! {HU`%]
+W#}BڎCIYQ@}?QIȫjz^fSq)/awo؊jIHЍB7TN,(lAzV1ds&~VԈ<>3  h+F @=(K@9󽧤9~7X/.C8<}/L<f2,1J1{2F2Cjca\'aU}x8][\*t 'Z~7%u">3`  1\—LP~2z{Tp@o"&=ErqB,.V̉6@Iejw%qk.&zQdk]q͏H0B&i?4
+|KT Hj\lv,pk @nl0t;#Bjo*S
+?M^{{Y)!ȭk`Œz
+Cb?~[ӎ΍B=D,PYx<CVCnTMpoPUO~ځaDWPX_vA5 kd+%F㸈h-jHȫShϥȢ2B\ܧ> a)I@m1 07:2ۍYe8"8?]nބM{!g{\>ȸ |&}v|zf5LƦu+@YC>Rt7D+jcrR!z QzJ# h<>Vjt7~8GG;plvh-3l,|m}zWc% J&Mm@TNDM:>mmc[-7'pRp?m`4! N04M('ulo(Ǽq 6R4ȝU0wsOsU.n>^
+~Eރ,=ŒwPOnZ`+X_(^Li,iqMCL9fuN7|yvuc&
+,n[Z[t~dp&"?wC:/Y^:v ܎˘I5jZé,6~+쭸T&0<OsefO?D
+endstream
+endobj
+1000 0 obj <<
+/Type /Page
+/Contents 1001 0 R
+/Resources 999 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 991 0 R
+/Annots [ 997 0 R 998 0 R ]
+>> endobj
+997 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 499.198 87.69 512.994]
+/A << /S /GoTo /D (Hfootnote.18) >>
+>> endobj
+998 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [132.721 267.842 139.444 281.637]
+/A << /S /GoTo /D (Hfootnote.19) >>
+>> endobj
+1002 0 obj <<
+/D [1000 0 R /XYZ 80.963 747.976 null]
+>> endobj
+246 0 obj <<
+/D [1000 0 R /XYZ 81.963 712.73 null]
+>> endobj
+250 0 obj <<
+/D [1000 0 R /XYZ 81.963 453.292 null]
+>> endobj
+254 0 obj <<
+/D [1000 0 R /XYZ 81.963 236.381 null]
+>> endobj
+1003 0 obj <<
+/D [1000 0 R /XYZ 99.891 166.23 null]
+>> endobj
+1004 0 obj <<
+/D [1000 0 R /XYZ 99.891 142.32 null]
+>> endobj
+999 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F16 475 0 R /F36 596 0 R /F38 617 0 R /F41 649 0 R /F46 674 0 R /F45 668 0 R /F43 652 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1007 0 obj <<
+/Length 2125
+/Filter /FlateDecode
+>>
+stream
+xko8{~]`e ֒{SmhAi[rܯy*_4ُ͙W* 8VjIH4L,{GbLT<}f ؏2?_/-B_,//^?W=_9 Zxr Ia(>{6'0ϼwDZ{aq|n8Vf)4O?C2Hre vJ\x%( P1
+S9\7նj^Es1߻v5/t9 D{ۇF8΂H2z 1NT*#` *KXjX?oqeURLU;iD#a)fDXE62 |=T("=V?Vt* {ݝ#CC]ILvDEWcZP0)$#-~ kv)ݴhc\Ր5!hN_ґ-5Mπ)jwXܐ<_$vrrɳaIN1 [pˁ{v̢n~~@\X5{Xu{tXW|TEBnm&.œ_ CȪfwi:.`R9qrGS4~4UXs/+  KiXF"dO23̻ӣ p'Yj6l"_s3OqܗR Xs2
+BHsxX6:j{3x
+l!^qb
+$f-
+l5L ]a$XU@)ґ*LYܝ:5  /ds nۖCQ6@$_ {N{wq
+C0$+K֕
+iYS̒@DG]9$3XWQBIh ʶa@Mh2NuH*0N9qcGNY > 1Kq9Ams4H(PNwtG \¿̡0d-,$j|s56diIxiTǔ ugqkvOqDW!^(eӯإ{<ij4ݣ̿ub Gb Cփzs}j_b>,B5XwLT_\_5#SS;2Z/M̋x1W)CP<9)H$:[3U0BQ ,vXD*+v}DZR X]1yE-xƂ$3&&
+ciB`{uq`L| ]Yx8|s 0s=xGbK=ܖ s!j
+endstream
+endobj
+1006 0 obj <<
+/Type /Page
+/Contents 1007 0 R
+/Resources 1005 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 991 0 R
+>> endobj
+1008 0 obj <<
+/D [1006 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1009 0 obj <<
+/D [1006 0 R /XYZ 123.806 719.953 null]
+>> endobj
+258 0 obj <<
+/D [1006 0 R /XYZ 123.806 433.763 null]
+>> endobj
+1005 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F41 649 0 R /F46 674 0 R /F38 617 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1012 0 obj <<
+/Length 2694
+/Filter /FlateDecode
+>>
+stream
+x[[s6~[FpL:I;YI@K]I
+SD7Nc<mnr
+'
+k) ֖_tS#~opcÚ!*iݼq*W0ɾWФpS(c]fG\Jwo.:xX\^M" ݨfkS7fV^ҽ9>&ҡ1q.(!͡OdA ^qsë__!ݨB`tn+.=zkeWFkOB_
+[L-}twGƛxO(bB~c]d#%4VwHA1U'"t~t8M 7;r9
+`cŝGTnҫ 4VvgGq!CB/.aD!`ÎFn !4ҬX&Qr =#z99|k QC_
+o9CL oD{>;L6jhlaV}Q @ u/قAo"Ь~K>4l;ꗈ ҍzF2ؔˢZ:5:Hu.H0^8Hn&[HA-J]ҍz%F;6a¼z.
+p(eH7GDPD&B ^8B.͙䉹$J0z\5̕K\qQ@mvYv=&|tJ7ni1"Z!ܸp2Ljҍ{Wk7<U8 B ./ sIr{~2IDHA $H5Y^u>|oJp\o4Ѳ(n^DRoвhIlJ7" Q9!iOb
+endstream
+endobj
+1011 0 obj <<
+/Type /Page
+/Contents 1012 0 R
+/Resources 1010 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 991 0 R
+>> endobj
+1013 0 obj <<
+/D [1011 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1014 0 obj <<
+/D [1011 0 R /XYZ 81.963 719.953 null]
+>> endobj
+1015 0 obj <<
+/D [1011 0 R /XYZ 81.963 635.598 null]
+>> endobj
+262 0 obj <<
+/D [1011 0 R /XYZ 81.963 494.305 null]
+>> endobj
+1016 0 obj <<
+/D [1011 0 R /XYZ 81.963 404.208 null]
+>> endobj
+1010 0 obj <<
+/Font << /F25 474 0 R /F36 596 0 R /F44 651 0 R /F43 652 0 R /F16 475 0 R /F41 649 0 R /F38 617 0 R /F46 674 0 R /F40 648 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1019 0 obj <<
+/Length 1019
+/Filter /FlateDecode
+>>
+stream
+xXKs6W`cx|Yc{(3nI[E'N~}I i{]|aĒDћżw~%bDRr4G R'yU|t"#xz<tOl6\71X"V[!Jzw)JaQ"}ҪOH!SxY[dPFp1!N̒;d~kP>^JY
+endstream
+endobj
+1018 0 obj <<
+/Type /Page
+/Contents 1019 0 R
+/Resources 1017 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 991 0 R
+>> endobj
+1020 0 obj <<
+/D [1018 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1021 0 obj <<
+/D [1018 0 R /XYZ 123.806 719.953 null]
+>> endobj
+266 0 obj <<
+/D [1018 0 R /XYZ 123.806 607.357 null]
+>> endobj
+1017 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F41 649 0 R /F38 617 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1024 0 obj <<
+/Length 982
+/Filter /FlateDecode
+>>
+stream
+xZn@}WS՛zUU)b+/iTpRK\R@m]lC!s 'zwfvsN#8(0w@6P -pm2hÒ%7=ϭEߓJ=+WW0n3V:" fǸA#hfP)!gTnnT, D
+'v*;p (2oAdV6? 2t#` Ăûnf6SlqԝhrÙY ?ſn+n4"c*{O#
+!aevVD7 JFNhIcqtopO^SάVHX נPf|-ekMA>ുbm˨Cd~ 1B.&Xw/HÏ!h{ rhKgcIM|`8w9J|z.. j(.tH(a c Ru=`v$;
+)
+endstream
+endobj
+1023 0 obj <<
+/Type /Page
+/Contents 1024 0 R
+/Resources 1022 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1026 0 R
+>> endobj
+1025 0 obj <<
+/D [1023 0 R /XYZ 80.963 747.976 null]
+>> endobj
+270 0 obj <<
+/D [1023 0 R /XYZ 81.963 712.73 null]
+>> endobj
+1022 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F40 648 0 R /F36 596 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1029 0 obj <<
+/Length 1141
+/Filter /FlateDecode
+>>
+stream
+xZ[oH~/P܀Z IbU$7CKdmKM 
+@4`j/2 Lh5a!hܨ}1} CG0!
+60`b~vU|vz?)wH.f7n8d«fA 2n[$d$H#(Z.s*J"m +RKo78m;Rb@:N8(ʋbX@F,9ڟ.<65bK)/rM7b4
+`$@YΓmI* n_
+wa4՜^GNtx;ijRbKE]ѵrͰ>r\q#o6^%&=I6R{U9zIE4|D$j'44"VIE|["E,ŗrƫ|E={[u%;ZF.bnSoE+m/ϥx5(Absqc=0
+#~ $Ϥ^v` +;_>ܯ($@ :YVn;TStٷEbt3~,Dw^8whmBE^ȭA(PUХdmϲ )MrZ&iF"ٿC0X^&):G܋|(G{Z@Q8 poO›Af^nƪ]$ѽ@r*ShDu`Еh}<++)}^vt^K6e[̸]OWi<ah`9LsR̪̈́9Q(:p T"j-I. N#zĬdVՙ )'AvW4Kh^]2L3^?^iF!hc`Q&]+=n>B
+endstream
+endobj
+1028 0 obj <<
+/Type /Page
+/Contents 1029 0 R
+/Resources 1027 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1026 0 R
+>> endobj
+1030 0 obj <<
+/D [1028 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1027 0 obj <<
+/Font << /F25 474 0 R /F41 649 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1033 0 obj <<
+/Length 1480
+/Filter /FlateDecode
+>>
+stream
+xZ[s6~Wh/-./;l& L4vOa3ŀm &!mY:>:|9@rV~zOڌ,~kP`RZ\j:4`fLwYTk?6[ᶮnuJ⸕/̿
+ y8h-mͱnV Q_-0
+XMo'^ 'DEV=\u'C}Oa7e٢K*&i0QP]1F8A0EOF Hؒd#sp#
+sKRzyl4/_d2ql:>ߪּ~i#Z|*bV ~;ĬqIQ2kZf!T(7y|uP54L
+糸X]h~+}?
+&I|[CԼcǕ^̀X28\N0
+{A%(1GѺ7Q7lK9|ħ1sFނdV{dCI%yn /Q&f&;rTDq녉[uBߴbPsfa\&o
+hUjzhvnxzB]Fxhɜ'qu!htB.UC--B?R7:δoO聇3:UGշ#w5*,)50>[+~&\tffual@_\^Wq}O嗿/Z0ؼ(j+ǫ{1l[Fn}C D
+gL,ނ+8F%
+MƶpT
+Qz<vgjY8?[X.gO^qAvXi?O611fc1J0I7o
+endstream
+endobj
+1032 0 obj <<
+/Type /Page
+/Contents 1033 0 R
+/Resources 1031 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1026 0 R
+>> endobj
+1034 0 obj <<
+/D [1032 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1031 0 obj <<
+/Font << /F25 474 0 R /F36 596 0 R /F41 649 0 R /F40 648 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1037 0 obj <<
+/Length 1023
+/Filter /FlateDecode
+>>
+stream
+xX[s8~[tNԝ4ڤNbYY߯@6ucuӼX wn 0:n11M[ 6ڜW %n25uÖkwvbǶNv% ;g꺭[XF
+|
+:C/ ⨀7|\O_Ri#xzn?c-efe5$ PĘ͐x9蝟*
+endstream
+endobj
+1036 0 obj <<
+/Type /Page
+/Contents 1037 0 R
+/Resources 1035 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1026 0 R
+>> endobj
+1038 0 obj <<
+/D [1036 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1035 0 obj <<
+/Font << /F25 474 0 R /F41 649 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1041 0 obj <<
+/Length 1070
+/Filter /FlateDecode
+>>
+stream
+xYKw:+\%]rHH]]8Aclj;O7h4|3#)"~yw$R24~AwvO'K`VҺzwǮrx?~rf M%e|;:V!29EΧ/M[D0w5#5óFR֔kDfT`JSЃ(׺c3rb=&L2 Ҏ$R+Lͥwׂ ]Eh* Q\7KLe<wJ㙋lx?M`#)lj',ϳ\0[xbƛ
+.rG?Y2)1-p\$/vvu13Kj$tXs
+iԦ&CpHf:.ֹ#PF&_gi56NUKD38ݦBܼ|xF_[7q̈s;Heys>ߎ>ߞg5YUGU^_b>,0I07o<֫ Dr018P)i> m
+(Iv
+endstream
+endobj
+1040 0 obj <<
+/Type /Page
+/Contents 1041 0 R
+/Resources 1039 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1026 0 R
+>> endobj
+1042 0 obj <<
+/D [1040 0 R /XYZ 80.963 747.976 null]
+>> endobj
+274 0 obj <<
+/D [1040 0 R /XYZ 81.963 712.73 null]
+>> endobj
+1039 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F40 648 0 R /F36 596 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1045 0 obj <<
+/Length 1239
+/Filter /FlateDecode
+>>
+stream
+xYmoF_N*|`[;UT;TR),s0t ;;<3@th>2(Ş cD.m#tm״lƙqzqrilZ.\;gVg/OLNӾ uFoנ5Ate'9h8m\%h7?!)⮋0ѠGAB %ġ!;]^@1A 79tEm#Þʹy{^\(r@<n).qL5o#mwE00( 3= 1B35!a [riQ#(@oKYyzJ
+ģkj|!l,KxsXnDI}նtamaNF0^`.Ĥt
+#} Ă0K/B
+)z2nP}*f3;R0 Ff7*8f FH <%ɯp
+ ej2Խ .ofY:QPJoA֐ORrt:9E:i77A{ټJ
+endstream
+endobj
+1044 0 obj <<
+/Type /Page
+/Contents 1045 0 R
+/Resources 1043 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1026 0 R
+>> endobj
+1046 0 obj <<
+/D [1044 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1043 0 obj <<
+/Font << /F25 474 0 R /F36 596 0 R /F41 649 0 R /F40 648 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1050 0 obj <<
+/Length 2560
+/Filter /FlateDecode
+>>
+stream
+xڭ[o)T
+hye_Rd[mw:“(ck;̷9HYE|+?}H &3J +%K3Ua/(Lqzfff:9=JM.oN?N((6
+ivH
+)8\oɿNH%7R4]Rh-KAC+|
+fXbUnK|/v T~]Un7=oC|`ەƦBg}R_;Ω(P/b % eYQܭm} Mοn{=k? \˧/ϮYC$\*V/_ve˶?x,ꋧ}}Z\[\lUs}?hIg']88 L0:r-~b^~%dBJ "Ut! (X'8O(>oj]Kt]'}YaLagUB ǩUS0ߝu%7<_><lK
+t4{0RChİBkT޹kJ<dj$.=VETEa?R@DjULh¾Hu4>.8&eCci*#xA#KQ7<k4~᪋g-ayt>]L%Z䄐UMӏK"&pym:X\^OgAAht
+B
+eCPÙhuCakBX BC̠Z
+]w~9)6Gzчl~y{ ˎ]9|QUIhO+Gd0qC,v;4!"=2TĂO!
+ؑ#I@~_4i ?%&]95d5a["!ڗ 2`#_p
+EV¥t!` u(3%X3q91&R&6(occ#l
+yj4|ry:?ZEA&IBh$q8Fp ʂ1JjV!-jw_ +=Dܒ') y0ʉ瀰
+endstream
+endobj
+1049 0 obj <<
+/Type /Page
+/Contents 1050 0 R
+/Resources 1048 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1056 0 R
+/Annots [ 1047 0 R ]
+>> endobj
+1047 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [328.157 480.388 334.3 492.344]
+/A << /S /GoTo /D (Hfootnote.20) >>
+>> endobj
+1051 0 obj <<
+/D [1049 0 R /XYZ 80.963 747.976 null]
+>> endobj
+278 0 obj <<
+/D [1049 0 R /XYZ 81.963 712.73 null]
+>> endobj
+1052 0 obj <<
+/D [1049 0 R /XYZ 81.963 622.107 null]
+>> endobj
+1053 0 obj <<
+/D [1049 0 R /XYZ 81.963 541.21 null]
+>> endobj
+1055 0 obj <<
+/D [1049 0 R /XYZ 81.963 460.314 null]
+>> endobj
+1048 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F16 475 0 R /F46 674 0 R /F44 651 0 R /F43 652 0 R /F40 648 0 R /F36 596 0 R /F49 1054 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1060 0 obj <<
+/Length 2366
+/Filter /FlateDecode
+>>
+stream
+xڭKsF8a"*tl*嬴냝Ƶn@h
+2sSz<-QWWRZU]H \+3ac)6Mu<kƔ
+Bc3@
+7R̾?}&o[XȽ
+>k/ g'@a8A“=x kv II`QiX{>pz{-?V9ZnZͱ 36YDp7VOe  YңGG3<JO1iErSyΦt
+iLѶ^ngh-Gpss>ˁ8Hf n0ՀTJ f
+ y@
+š ȣ)Aw=R^H5{2J' R̦2tJ 1jq4vDr^%Y#L1vVלUɪI5ܗs*=>95ߝXGD=a*R2k 1v[̇yNNXv}{h {ΪtjPmUԧ ƣJ X l{;l?UMӍ/W9,Ȥd"2eCm{ȩ@*u76(=>Y4Y!ۥ'&!$im$<9;X_V8 rCGc[C故lJ  îb,x1x4
+N”f(yG(^0rBy'V:5/;NtZ<(
+<s ZK4AuWqʼdq0%V U 2-TA NtpUKn:,Pcj5ÂTXSX ]8@bQo0H1F
+ǁ&R25{Ng & glسw:
+W;V,$>O]@@_K#^yI'Fw]aBmkFјC+g )~X8 \5|5ǥR*2,+{;D/
+WrZͰQwyYN*25}uqE Ҍy*.t@vd` ݩR:`A(:POݩ(`qRԘ=O;|9e
+endstream
+endobj
+1059 0 obj <<
+/Type /Page
+/Contents 1060 0 R
+/Resources 1058 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1056 0 R
+>> endobj
+1061 0 obj <<
+/D [1059 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1062 0 obj <<
+/D [1059 0 R /XYZ 123.806 571.311 null]
+>> endobj
+1058 0 obj <<
+/Font << /F25 474 0 R /F44 651 0 R /F43 652 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1065 0 obj <<
+/Length 1681
+/Filter /FlateDecode
+>>
+stream
+xXms8ί3sջ'Hδ:Nӹq ämjec&_HgVfcɨLh Zx^]#P 2O
+݉Bߍ ~c-yM?j⠛y|JRrzycG;s(
+п񆭋ⓑ@p P
+iB"@LAa$Cdn<GS.kAҾԿ]'iTusl˒Cr1Y&3byGlEag^Z`5M؞Dn|\W]h^ Tht]#J/d& FE%Hi9E%Ɓ`J JCJۀE*(E`8<, =Zp#<=R
+!Pq`́PtGb~wE`v ~' &!Naw` &<,J PGxkpe̔ q3cwO1?/cn.YqT(q$t݇'kx QzF}oC>ܦX+&
+(:铁n* ƕB -iMQfl1 P0#̒҃lx+d;LԒL|n=ڃ.bM!l}.6U0^^K
+`f 5e;ۣC w:
+)[^`ߖ+؁re=X%RzP0}r Ӄt?Otp iv>ك:dˣ|z ˗`ms̪ suq Fs~2EIp@݊'QU94޼.5_7U1-_Uflr̖F\Z|ԊP
+tq |roIg i~^JcQc&XfTi;V d
+]
+endstream
+endobj
+1064 0 obj <<
+/Type /Page
+/Contents 1065 0 R
+/Resources 1063 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1056 0 R
+>> endobj
+1066 0 obj <<
+/D [1064 0 R /XYZ 80.963 747.976 null]
+>> endobj
+282 0 obj <<
+/D [1064 0 R /XYZ 81.963 712.73 null]
+>> endobj
+1067 0 obj <<
+/D [1064 0 R /XYZ 81.963 595.539 null]
+>> endobj
+1068 0 obj <<
+/D [1064 0 R /XYZ 81.963 351.157 null]
+>> endobj
+1063 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F16 475 0 R /F36 596 0 R /F44 651 0 R /F43 652 0 R /F24 476 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1071 0 obj <<
+/Length 1710
+/Filter /FlateDecode
+>>
+stream
+xZQ8~WDJvBB{)l墨mR Yr:ic8!˲q]vߌk hfM[ض4-ַuz,>:e ?.&շ麤=8~;1cA|!w[2Mbڂ@қLò[
+ ֪Nj}c@Аqbӵߏ.S(J +)`THުYV݁1pL
+LYb#ǡ ,}tnQП~ 0 I26ԧihSW "pBc
+ajv^po`t'X=7)ɲcQ~2@!VÎЂFUrc|S%u 
+3]lEZ1(6(+SHOP'Cb\8`@
+?mme-Yp(E8Db&
+xW<<fχt8
+cyj<tgqwX
+7ըQwtiuhuk2\nX}vlXڕٷ63Fv"7_st3@jY|K]o4gճ"BWq/ZrNzQ F~?XC7w0JRͧ_WpeHhu=:=z4Jz_ߤ][/# C LK QQICIC2%
+endstream
+endobj
+1070 0 obj <<
+/Type /Page
+/Contents 1071 0 R
+/Resources 1069 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1056 0 R
+>> endobj
+1072 0 obj <<
+/D [1070 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1073 0 obj <<
+/D [1070 0 R /XYZ 123.806 719.953 null]
+>> endobj
+1069 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1076 0 obj <<
+/Length 1519
+/Filter /FlateDecode
+>>
+stream
+xYYoF~ׯ ً\2I 8\8HKa灒V6IGكIѮ,€w;B֩_zGĵ0v%hfũFSfFNs0e.} GF+ġ[y+0B |J[QQ
+K} s`UE] dQ1^y"{H_c<sO4љ|;溓t;iRe+jIBLDVQìLHnOg4Ka1sa2iD^4|YTEM¸\(3
+K \ .
+?9AM`ir(;]d i8吀I 0旀P\K3gH4f ݍv+a}3_`6qH
+nӆ9΋jFy5|r~v2] ް2st!u2{yoTd\/6kP~ugbf-Ϋx^Т.s\}&+!_vU =X(U(MCVuʢ:`xğ><OaF2힎x.o*~>HP
+qwxc!RJ9Lm)-P2yf -Gq
+endstream
+endobj
+1075 0 obj <<
+/Type /Page
+/Contents 1076 0 R
+/Resources 1074 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1056 0 R
+>> endobj
+1077 0 obj <<
+/D [1075 0 R /XYZ 80.963 747.976 null]
+>> endobj
+286 0 obj <<
+/D [1075 0 R /XYZ 81.963 712.73 null]
+>> endobj
+1078 0 obj <<
+/D [1075 0 R /XYZ 81.963 410.899 null]
+>> endobj
+1074 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F16 475 0 R /F24 476 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1081 0 obj <<
+/Length 1456
+/Filter /FlateDecode
+>>
+stream
+xWKs6WT @
+כM*-{U!=vB髀 ? #@`BBC4 a$P8~1nQT0_&
+a3ABCcTtc>CX*v
+66@mJ_LΧPD*!9߸*ChGpmDeB|׆a;:}sHښNlJ+s_Άͥ$QH|DHHD$0gK˄Nn e/$i' I ӏxiO4^!G'N@褯^}؆4XݔEaMJ ~k%
+pny
+endstream
+endobj
+1080 0 obj <<
+/Type /Page
+/Contents 1081 0 R
+/Resources 1079 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1056 0 R
+>> endobj
+1082 0 obj <<
+/D [1080 0 R /XYZ 122.806 747.976 null]
+>> endobj
+290 0 obj <<
+/D [1080 0 R /XYZ 123.806 712.73 null]
+>> endobj
+1083 0 obj <<
+/D [1080 0 R /XYZ 123.806 581.094 null]
+>> endobj
+1084 0 obj <<
+/D [1080 0 R /XYZ 123.806 473.863 null]
+>> endobj
+1079 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F16 475 0 R /F36 596 0 R /F44 651 0 R /F43 652 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1087 0 obj <<
+/Length 934
+/Filter /FlateDecode
+>>
+stream
+xY[O0~ϯD_lO}CH mJ+&KwmФ
+A?nRpWfMn*<n~Zvsз93Uu$`u^,1fAKqH%Elu k2̋0]O̓zvj w5*zZӵNV Fi-xK8Ki6[1߹ܮdqgۃXd\ctϟOvҝ$e]3?}}VV=2tt0  =L,@$()cƮͶ+XV10 tob ~&A2~n0FBv0uV'</\=絳ә˹FEl+Od6Se2<MbzԹ(
+sAQs[O
+Fz)5FDK(4MBpN{
+zl_o]JӎLD2?D3رdž8k똼1ݘ}3*&q&eߤX/'1?66ſc+@2աTՊU^oeTڵKE#\|j{co 17hd݋\O
+ב
+endstream
+endobj
+1086 0 obj <<
+/Type /Page
+/Contents 1087 0 R
+/Resources 1085 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1091 0 R
+>> endobj
+1088 0 obj <<
+/D [1086 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1089 0 obj <<
+/D [1086 0 R /XYZ 81.963 667.202 null]
+>> endobj
+1090 0 obj <<
+/D [1086 0 R /XYZ 81.963 367.326 null]
+>> endobj
+1085 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1094 0 obj <<
+/Length 717
+/Filter /FlateDecode
+>>
+stream
+xWKo@Wԋ-՛}{ݪR6Q'@ph}^kBR 3aK{9a9Q
+0P"* D1\x Q4./~=:y}ӎGx'3O'
+r;`u5ظ@J193b HC VRBΨү*3Cȸapdp&\T؍/EjXHN$%3WgpG7Km>%VgcM.i>4E>ΓY2ܮ1g 0l1BK`y
+endstream
+endobj
+1093 0 obj <<
+/Type /Page
+/Contents 1094 0 R
+/Resources 1092 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1091 0 R
+>> endobj
+1095 0 obj <<
+/D [1093 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1096 0 obj <<
+/D [1093 0 R /XYZ 123.806 567.077 null]
+>> endobj
+1092 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1099 0 obj <<
+/Length 1055
+/Filter /FlateDecode
+>>
+stream
+x]o6ݿ* X
+)(Pْc-YN(1e)kbRGy<ct0z3u<zrDrNx
+|&@xh sa>~?NlF
+Xz\a3k P%tPcDRzYNjbN%YIڎ_WILmJ>P <L Cc=<dp b0) _@3 `OkLtGg6v?7)8k~CN.+.~a+aVS1骴P4ɤ[p˚W̗˾r3u薷 yK[ռ<-cuh!o֯s&5?ƅԖ pM1{aۣ<۔^'Y\-U}qXWwUy:P!~o`dP􆋠Km2'Y*NzyH0R pi9~r#.{'/M>60FN}1U?fAF]CN9ړT[zГ U_@<Z54<P 0La57c4̟+<ڰy?BcEƦ<$XF;e ܩ~L }oRzwDSz3ˢer:RTW<Nf[4+XFj0YңfdML6'< ƿ @0zHc.'^D/ yF
+endstream
+endobj
+1098 0 obj <<
+/Type /Page
+/Contents 1099 0 R
+/Resources 1097 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1091 0 R
+>> endobj
+1100 0 obj <<
+/D [1098 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1101 0 obj <<
+/D [1098 0 R /XYZ 81.963 699.581 null]
+>> endobj
+1102 0 obj <<
+/D [1098 0 R /XYZ 81.963 255.247 null]
+>> endobj
+1097 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1105 0 obj <<
+/Length 2143
+/Filter /FlateDecode
+>>
+stream
+xڭvz
+,(.XyȎ$dj#3>:$o
+ps״fOǯ7O兇ឩS DnUhS:ёkIWKyB2!k+Ce042x
+W-$hQv)?VgYT:h
+o$JSL[>\y%e*ǡRM[ѳm +aK1A3^4-e'Y˦pbPAVtFTcCdI{2`ոE ]^=!9\*%bdNJծg`lqO/-הI5Otib:S5(V؇b JUpAQWb`&d-Łrm56W% .E"( @<bP8dfoa[y:B@]1Jj<|)eD>bGw\N[uI7}Dݡ9hM@kAzYעJۀF WdFmpԋHѼoBJr,;!0`6.C 6yF~YOqh7lB< YuQQJmJ^<
+rB/֟b~ nX(rڢ1Ϋ@.Om
+͛ tVVprNRՕUR5Aw0ek6l[쪈ƽ5VQiڟ
+q?)pڀDt[ %+RBXjT,]&Jkp;[ٶ ;%.<*]@[ßL[k!lqf|.v-]em$*NfS@ 2
+FȾz͢ :hZj(ric TՁն~X d(Fr2;Q+=LkoB@ߥC~
+endstream
+endobj
+1104 0 obj <<
+/Type /Page
+/Contents 1105 0 R
+/Resources 1103 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1091 0 R
+>> endobj
+1106 0 obj <<
+/D [1104 0 R /XYZ 122.806 747.976 null]
+>> endobj
+294 0 obj <<
+/D [1104 0 R /XYZ 123.806 712.73 null]
+>> endobj
+1107 0 obj <<
+/D [1104 0 R /XYZ 123.806 678.868 null]
+>> endobj
+1108 0 obj <<
+/D [1104 0 R /XYZ 123.806 558.519 null]
+>> endobj
+1109 0 obj <<
+/D [1104 0 R /XYZ 123.806 458.096 null]
+>> endobj
+1110 0 obj <<
+/D [1104 0 R /XYZ 123.806 327.784 null]
+>> endobj
+1111 0 obj <<
+/D [1104 0 R /XYZ 123.806 247.286 null]
+>> endobj
+1103 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F44 651 0 R /F43 652 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1114 0 obj <<
+/Length 258
+/Filter /FlateDecode
+>>
+stream
+xMKOA )z9{@@01AU7aM~-' ܰQb@$
+, @`ɍ$-E&L/9\ۓ.&’(QҌMf"uZ[\!T97:+[!HktX'}vTdMQzox޺43|t_Y9pg\-rRuzrry~vP+y |JV
+endstream
+endobj
+1113 0 obj <<
+/Type /Page
+/Contents 1114 0 R
+/Resources 1112 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1091 0 R
+>> endobj
+1115 0 obj <<
+/D [1113 0 R /XYZ 80.963 747.976 null]
+>> endobj
+298 0 obj <<
+/D [1113 0 R /XYZ 81.963 712.73 null]
+>> endobj
+1112 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F16 475 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1118 0 obj <<
+/Length 2325
+/Filter /FlateDecode
+>>
+stream
+xڭ]s8={UcF`L<7[K2u5&v0xN6&;KV%t^"?:E "/B~|u#6F~>L)ЛLc=+^NN
+C/ ҳ%y4F_PB5
+0t#_<tYeY2D}GZ/XG#7y^)7&*Dy^eV^h;:3(/ky`{%,20Bm+LmM#N<:WeMc0Uf/@HX/+Z-eaň}QyY(@mnޠIA7ح7|4
+S{V튪\z-:ES՛0‘.¯厄xP&z6ΚdKԎm=mRjV1@t n\@!(M2˾plV I1TFvG
+L5#.S3}%òܽ۵ae,,`:9Q~oZ [ԐP6eZ;\l1qj[w]O{()&418
+endstream
+endobj
+1117 0 obj <<
+/Type /Page
+/Contents 1118 0 R
+/Resources 1116 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1091 0 R
+>> endobj
+1119 0 obj <<
+/D [1117 0 R /XYZ 122.806 747.976 null]
+>> endobj
+302 0 obj <<
+/D [1117 0 R /XYZ 123.806 712.73 null]
+>> endobj
+1120 0 obj <<
+/D [1117 0 R /XYZ 123.806 506.54 null]
+>> endobj
+1116 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F16 475 0 R /F36 596 0 R /F24 476 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1123 0 obj <<
+/Length 2811
+/Filter /FlateDecode
+>>
+stream
+x\Ys۶~gJ,%wv&q6ICKV+)I{")qHǾy0<wv,
+
+n<S#9 nEAIE FEE#%yB՛Sb@b( z
+؞Ӏ*qF< .~9@~ƛtDLKjHc`p8ܘ\?bH3I<W >""  Nxv*74^Yf34iD؇i6bv#Ujެ,"f| <Čo)Q$X$zYuk%Кq9D4bGӺ~kp$.*"Rm[?p%dX$t2V6T1wJ+g5oP5X8)AXL6VV Rk (;8★x9Kq7 a(1$̺~~Q 1"~J(E<Um2I %hW5/ƠBv *!ǘ%a
+%1C5,{PMy:T<Px:+[qq,ȩ.̜vXq;8jyQ#!yt9]1== F'๊+t#?eOo݃V+w[y02#]q 32sWU+=<S@UB`+qXvrXyaqA3<,Ӻ>ՊcO$u]f=d&[Ip5 M,6%w`#.Ef<'F2 ϧ逨%%Mv[)89z5ohV[8^ʦaO2q߸?qφOKs`I5fxMG b4`=)&fkh͵H68&-URЯDYXam<=6rop)Nt.ϤdF9۞a- ڪ} s2Xb|ឱ8禰]bJzYyU|r5_$sny)qξMrL0|0GPP?ӿ
+g ޭH#S]~):v'B'"ȭE+֜TSUpa8ϵv</%oL)~7Bi 4"®R$І>\ 4յ@% k8)`4\&~Jf8F
+y"g <Uh˛T'cxVlTKs
+#}fs W#F1(1D27t[S-}nh ½#PDaH3Sl>0Z]絁 B׽ &>
+Ty8}ڸLX&6;\Wci ժ殓܄)q/fH!( Q2@UMJHj#%$mBф( !jYtin+X$i \
+i̮6%ɽs҄Pve={&KU5R%D Mpdy6/\%n@E
+J 5@gc)7vjwMlʛI`]Hv*_qFɰ2}C/Wb_Yԇgk{n.E@ @^ #jNfntbCې.2w^n27_yxK`TOvOѡy"44|{UOv_XƩ 5?;qO% f `Y6Úf>bl۲%TΕІ0'{ۿ mnFgt*m~>_V{@FwcMwͮ756 ul)NSe4ykht+;X"&|}p
+vEt$()2[L1t[VF)" [#~K۴xuh2O("P80R;(Cy3-`Ѯ)0׬`@b_r妵5@l3Ⱥԩ!Bs:*뻖=*c^HYPi u6?I[wI6eVH;?+Va ެ
+`O;٘0ѻ0?MMt:WY=81O$؉JK+þn&e1ϸrRN@2^OVZ
+endstream
+endobj
+1122 0 obj <<
+/Type /Page
+/Contents 1123 0 R
+/Resources 1121 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1128 0 R
+>> endobj
+1124 0 obj <<
+/D [1122 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1125 0 obj <<
+/D [1122 0 R /XYZ 81.963 716.124 null]
+>> endobj
+1126 0 obj <<
+/D [1122 0 R /XYZ 81.963 458.366 null]
+>> endobj
+1127 0 obj <<
+/D [1122 0 R /XYZ 81.963 358.255 null]
+>> endobj
+1121 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F46 674 0 R /F44 651 0 R /F43 652 0 R /F36 596 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1131 0 obj <<
+/Length 2350
+/Filter /FlateDecode
+>>
+stream
+x[[s۶~[
+w}IݞKt&-ItE:Y
+#˰ذs"o/*]݄El,}1yM:7d9G0OEZ*FJjVZ
+|2WJ+q$֞uH(7eo STD*D
+w]ej
+'籝m\i>b;QH=.UHwۃ sٻFurψOp8A6<TpDwʃJ}+};҉ eݐB!B. ;hOhfwCM1߁0GnKM_wݕ0̢ʔmrψx~Y$As}BQ߿ޡܽQwck3*$s ˋs;:{ppyه<>PK=0&\<R|lԣ*t+t+t Ç
+=(+ytn>B7azhMX4BkcVhR-/H_]}|/>QzH4VGM1dD{r8gLAjHs,*ͱF%Y *i}tV8[6ԗ&DwnØ+CyHiD{+TFTb W^F lB:H rztiFԗ&DwnØ+CyHiD$)h"=0-M
+"":Hst ˋt$>{uA=|X+CyHj= >.q~o9b!lTm;4S+>җW&Fgه7Op]ZTi0OVZ/.T"tXlH b.JQ<*EsPǩP22?>X*4A ]3ѤM 餩bIcT<M C'*5G*DWvǏ2OŒSSH0o<(>OҊ#S U}%Rd[7xIqiUzwu1ΒO9/2ˢ'b{ԫv ^r6.ޭ`6VSd4Ͳ}{>ZઉޕZ-!R"Հdʉ\b2e0hUK>[8FT]8]2X/55[L)"3;%Yr_>}j/MP#
+endstream
+endobj
+1130 0 obj <<
+/Type /Page
+/Contents 1131 0 R
+/Resources 1129 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1128 0 R
+>> endobj
+1132 0 obj <<
+/D [1130 0 R /XYZ 122.806 747.976 null]
+>> endobj
+306 0 obj <<
+/D [1130 0 R /XYZ 123.806 712.73 null]
+>> endobj
+1134 0 obj <<
+/D [1130 0 R /XYZ 123.806 564.324 null]
+>> endobj
+1129 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F50 1133 0 R /F16 475 0 R /F36 596 0 R /F24 476 0 R /F46 674 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1138 0 obj <<
+/Length 1988
+/Filter /FlateDecode
+>>
+stream
+x˒4_jHc;OjZ
+iOB@'$\DM)
+^~He܁d?Lę<ŅF;'\P$L.ey{mo]o e9Q+Ze%[Ww v[sODޝrI
+.DSo̗D7)^ov|Vxqew{t=$aYN}ߗ;XˇE9mlGԨ)A|s,ջ_ ‹&~k Ë
+(jԩ?j5~D}b!QQ=, G9? 쇇#Tmbگ{y/(E,1O.>R'?"ɏ` GȾ>1(tz\
+HǾdyaM"z6eՔ9ؼ.DDO1N
++TD51Qc\%2Q|-eSS",ڱP|mSa=}}hGCi0=1qKؔ 17/ Ft8#=u8 /"vTP86pR`fơV쫫'
+endstream
+endobj
+1137 0 obj <<
+/Type /Page
+/Contents 1138 0 R
+/Resources 1136 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1128 0 R
+>> endobj
+1139 0 obj <<
+/D [1137 0 R /XYZ 80.963 747.976 null]
+>> endobj
+310 0 obj <<
+/D [1137 0 R /XYZ 81.963 712.73 null]
+>> endobj
+1136 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F16 475 0 R /F46 674 0 R /F24 476 0 R /F48 922 0 R /F40 648 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1142 0 obj <<
+/Length 2049
+/Filter /FlateDecode
+>>
+stream
+xYKs6WpRӊH;VSg&5=P"$1C%. MjSOۋ
+s'µfK
+ߚ[;._|wf6Oз3D/non?\|;^#W0](FocV
+,xqd*ܺ4b<Փ1' -7vv-qVYD^T0v7qrFvdL+jhc` \vy-@.*:2߃K:@M4@y.k LHwծ}C|"FQ釱$ߢnNjM[oA[-\W˝0襨 8GZj`9:?2DR+ ^Is\|qM aϰ9$Zip8VE&1dj״NNrE| ̸
+1(#Â7V@<>p%k b4WmCZYKh9-U)RN|F*zSV M4ڐOj8|.tƧp2-ETih/G"i =P<Xdv1{!iZ-iZƲ(jd@%T46U!Qڪ;vt9@Ӓ@G--Gs{C w}r ndMPlrȗ#WyӤr_?I²
+Ę)zC^% `*,+Y6Gr-<
+m`H
+y`""})\՚QOVtsv:+
+b؃)!<;;vKX{͙28RQ;\:1tZCi7[k B2: Gפa+ FJ;t^b„jYV,lj*ql6g
+K=~[sox;.:g#{u4 .c%ý(vM=<{F 8A졨Cd|f08_?T UJġ__ =Kf eH%
+<}P>=B7aHX8תf<f=&<\G_V?9TԿhOu mX?e9RzHm3UxE7Ng?
+endstream
+endobj
+1141 0 obj <<
+/Type /Page
+/Contents 1142 0 R
+/Resources 1140 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1128 0 R
+/Annots [ 1135 0 R ]
+>> endobj
+1135 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [191.983 509.327 396.94 522.276]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.8052.com/users/disasm/)>>
+>> endobj
+1143 0 obj <<
+/D [1141 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1140 0 obj <<
+/Font << /F25 474 0 R /F16 475 0 R /F46 674 0 R /F48 922 0 R /F40 648 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1146 0 obj <<
+/Length 1343
+/Filter /FlateDecode
+>>
+stream
+xڝVM6 𑞉[&i;L㴇n\^sV\Jv}ڕNHW|{eVRf1jݯ
+SeiV.,VQ۟r WȪFW&˛r_z{zFhMV%i||vG\FLC@uU)Y]Hv(̫F|: !߯u.b`F?dL;1Uf=8A&ɛj&H!CG˝mvO8ѷMw'gf݅/v'(8p_U
+-H1D΍\ޘo&R籵=MЧJ|--P@R"X8l`|';:kj
+a
+#
+@%
+ӷ@Gҟ*vۇË3bxQwXvJhR~@FZ;*x~H!=6(ۧT Ņ"UrfM3Ǯ?W9 K{’AigGQ1d|^D{L̑!ZBAb
+%46$51~C:/^J1'P u)ŭ]]>'0PN`Ȳ&a e#n?HI]Z;l(23@΄);g
+endstream
+endobj
+1145 0 obj <<
+/Type /Page
+/Contents 1146 0 R
+/Resources 1144 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1128 0 R
+>> endobj
+1147 0 obj <<
+/D [1145 0 R /XYZ 80.963 747.976 null]
+>> endobj
+314 0 obj <<
+/D [1145 0 R /XYZ 81.963 712.73 null]
+>> endobj
+318 0 obj <<
+/D [1145 0 R /XYZ 81.963 531.265 null]
+>> endobj
+322 0 obj <<
+/D [1145 0 R /XYZ 81.963 421.119 null]
+>> endobj
+1144 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F38 617 0 R /F16 475 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1150 0 obj <<
+/Length 800
+/Filter /FlateDecode
+>>
+stream
+x͗R0y
+-充..00 V]dgi`):`0<N AR- >P9 J <& |_Fӹe3߅@+`1;:[uLjH1 1F@Rn0He)xr&9X&1
+endstream
+endobj
+1149 0 obj <<
+/Type /Page
+/Contents 1150 0 R
+/Resources 1148 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1128 0 R
+>> endobj
+1151 0 obj <<
+/D [1149 0 R /XYZ 122.806 747.976 null]
+>> endobj
+326 0 obj <<
+/D [1149 0 R /XYZ 123.806 712.73 null]
+>> endobj
+330 0 obj <<
+/D [1149 0 R /XYZ 123.806 406.918 null]
+>> endobj
+1152 0 obj <<
+/D [1149 0 R /XYZ 123.806 381.134 null]
+>> endobj
+1153 0 obj <<
+/D [1149 0 R /XYZ 123.806 364.696 null]
+>> endobj
+1154 0 obj <<
+/D [1149 0 R /XYZ 123.806 345.933 null]
+>> endobj
+1155 0 obj <<
+/D [1149 0 R /XYZ 123.806 329.495 null]
+>> endobj
+1148 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F24 476 0 R /F16 475 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1163 0 obj <<
+/Length 2671
+/Filter /FlateDecode
+>>
+stream
+xڭYKs6WHUE<V؞L2I<NR[hXH IY
+X46*3#-ib?/2>vqԠfeB*^.2* dÏWW_$L&y"ePlK+xc "Fn5:|땘:@&L"J;: ~$ aMޭ -¼+ѻww2]KF1'+R%I
++YpsB_m* u>oY*\P 7ÅE?Td}_411{ypAKpU>WEOFMU ,GmINáe)YA4?ኇA"6gyFia#ڦlpƏ0a
+Ow]ͻ~q>/BsV瑷bjjNfiu˷VYvy1T͚_l@8䧏7=A }#RڌN38MaYn[-qV`*)_>|ux#7dn;o+/[4uxpN3CF LD[-qpw鶒ƴ
+|1 1rMн
+OImmI*ĵT@ȹg\Pr~񚛪6)/J4qԲ2y"N`|Mͺon']7Fa2糘 ORĔ8ׂ}ϼE0rv/}^9.L؟UR |N1dHwer/r]v }lcDs|WH܄c8)`Y;gLW'x
+Ϸ̈k(n ,@ܣPݽ-OznaMInw>2BvL1{{] *<_@K
+endstream
+endobj
+1162 0 obj <<
+/Type /Page
+/Contents 1163 0 R
+/Resources 1161 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1168 0 R
+/Group 688 0 R
+>> endobj
+1156 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 32
+/Height 32
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 1169 0 R
+/Length 1212
+/Filter /FlateDecode
+>>
+stream
+xڭOWmsֺյ:ئZ.uKٟЬo&4/L%:ۺu
+LeL=eRgd[iuu
+hhxܬhoigX/O!w58t{C0Mmm}]2mu?[豤;H&ߋl865G"Q__ߩTjSe%XSB1ffgAXܿ?޽_bɑGkP2%Q5CrJwDLڹ%fKi,Hf"b4n_,3ovFr6cfnH~%4NqVȋA"v*mu3Uu)^?k"Hte"ω2Ԭ<Ex`P vk _ݪ-cfYĉ-J>:}P޾\sfQ؉-x!x^N˹|+3Mި Q9DGK
+ӑ]sWs4-^2O1Ŭ?AaƗxv4t \4{Q"BS.2p*Y<}ŝAiး PLZ
+endstream
+endobj
+1169 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 32
+/Height 32
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 578
+/Filter /FlateDecode
+>>
+stream
+xc`
+P}
+ (X@@ 0Wp
+pF`H0
+8pDvYąV~Wz3qk֟oߥ~GY<MϽ}e~W,c]& <d'iĉꢘ~L
++WZͬ|R$NoZô ?jܴ^N\3/waJnLa]8,gp*mst;Bw6ӽ^z)z)vF_Mc{ OVzPnrcѿZ޾a3㏻wuŮ&}dHeX;EE)eܳ߼;T;EVZ22H4{\2B$vq9\pky|K}ioɁ7
+endstream
+endobj
+1157 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 508
+/Height 189
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 1170 0 R
+/Length 19221
+/Filter /FlateDecode
+>>
+stream
+xX=n~ؒDMN[TD5ĮQT{7Dc;Ҥޛz. qey{fgfg|WECCCCkA`{#Z6
+Uڰ}kxUhhhhhmD?4J9f>ޖ6%â5Z:]QOcpbwRi8cuܑuҩâ5Z<]QO+>!3S;[ Anւa䴖BRҭr$-PȌ\X44449Pt4rBE B`X44449Pt29;r.3$=@(ɰlV,hhT8o 6+& 5xHcKW?4z0/Yw.31bo/BIe`h RJ +j3yU%啂ʂ⒀cvkvL^_{+qϸ<2X$n1-ty啅|d<FG
+|ai`TyiQ̲J/^(XJފ̂VV ZXsx!yS[Y $[ՍMXmO3jy.҆+2ۀ5SoLQn!9PVY`<jDBO_C4惡PiiYLbAN=X݊(6M伖q$j5Yxt#mu'Tނ]]-WHOH +J +SyÊL^F|q߼W\闝)[:O
+AQG6!0G>kMU,ϸƟ&8?\#*O sNmtk<$OwKWY{8{ K_Iϛ\i 68t4w2&+c<Ҳb.
+-1xmcw֝fKLg6F/Kn2MޣO]BPY[ns]rmVlӏ&P7!'wݢf_}8RPфMqr$j5ĉnK#muo&HQ[{EQwN`vPa4aTRÊLv <[o.(H jZl_|g-jKơM6:%)α,p&Dec[cvhṙO n5l0pN,μm~+- ÏϠfRXUYUUV^QR* n{68EXY\ZŒοO߂A%9zXAe19rz>ҲLk@p'?_mWAxQ\g䅋e$ e=q-撑HOGWP\>1̙>6>R1X&\fV KCRJ=03nk)t(ʊ14 auMiٖ/{ 2RD>49"nƦo)%HB"?&"FnrFq$Uu'[#xS
+C𘔅2r{2fnykUNK r\ZӀFt˻eb-uQb8O_"2C ~-ySL"<6ͯ=cRRcH;YF:Х6*'۝!dX9MjX: :9Š- ݫAM´3n̷Hp(JJ4 W1i24T$bq}zbqK]`8:-\ g$oY2 W5feiqr/aNVe׵viQ/1 tN+zskIH2Ryfvώs^_b`K)I٤:! J! K-j섘!sB"A&{dEXgeۓM>[}cK
+3bיAlmmW77l6~?d:) k,}rvϔC̱]^C喥VaK=)$[Ø´\y$d 6)c"~a!*2[ Yzu>9BXEsEmSyY0/7ꃄ:vJV!Pu'J*HH2x{
+B&DFᒘVKy҄^µ8lrBtҲrAY<#NmpH-mqDzHط[^ki!mqiyjF<OOJ-;-HBN](gqӂ~n1Cj6\n\(jreϦMѓ_]X *Ou;}Q)62~Cqwg.6}(3TcLjbzethY`l)_\Q9$i+jj dr[kVq (05%V{99'sRXFy(i%ೝ^xmy?=q8&EBGvYf&ZPd"d$ꔗ\u}yͱ&:U**ec[UY~^ 3v jmcf>99^쳘"txYLӘU|OUEIcیfL6:fFa'=ef3E7򴌂+cEaΤQC,"UY)KfVa^q6+}ŒxRSTϊα$z7kU7\99kKrCi-4۪d{h=:
+E˟ uqsu]{EXUH59ҳr[o!o0{[jɦ6!u[']ODӜ2S6/E r#‘ڦ3b3Ct[^~MFmV`(jҨ)2}͜nH=3.KEmΈr@(aƇ55s F醖eFXc.3#XeK,2LHMt^fby7/ucE إE٣`kC*Mv#~-b
+.d#6sӃɑ >k֞{]O68eR_oU%!sk7=Msc4_sӵI aueY
+/=XX~yAZ mc&ٱ"SGr{4Y&A4222\U.fd{_PQZBI0" UgᓌC HՒZty %Ue)'y{ғj[:'գ
+ղa) ="7L6ݮ$geEMTm3#{7uqlxv 2htwk '#D,#MNY Ǭ5iw*BCN<W[E'8.ԍ*)qz&V\IYIëMo"k36:할,k'T|yII*QHf2ڊPz*Bxu~~Q [ Fcb8,/1<|^q6yy뀊9_rC&𥴖eo<p;D6*vux҂#6;BYĪHklu]6͏m2ڰD>6e)eIQx ]R4-6K%ۢǹ‚n1Xΰ_ 2&g9;dZY^RY[(fۧgWćC׈DbyqY^(mNm=W[n~E.yfM<,۴jq $j5Bԛn[2Yۑ~{4CQ 2[Ê+B(,&u?x7}u/V|qJPZ{g/)TˊwYǩXīpnV
+KC2y-\UUYZN5ŚLZhPT%e;t,cTY&*.(XMPN0*W'XhPg#y6eU[x;g ʽ<4:}QkVQEN!0Of~@~Zq)bXb{T趙b> fT]sF)$$,.2~Z92o\0/*FP7z‰Ze
+k'焮M+'V]Nvo,DϪy~a 9p6e/q5DYGjsulFjfBrfKR*UEw<6srGV|=VAT{`
+N~愯[o<G"#-ɉ]b뿝 `Zh-dQkȈa&;~sd uRr(I ؓ7I=k뾛&idX{H?Zx%
+a AFa{u5ޤW:tr⻕ &+ /7'F:xSuBxyDUzN?RN$UNo[ܠ95z%jpWǹΈYRh9)J7f\nΊqò ^٬{ $=Yzώm}{GmWrgܦ*+()|gu,@\+֩1ۭI'^ru%þgj|s=7V;f/8=[6>;y:I:)=6^mBqga5Z::A{o,a%/|7N-i/t/x 7^g5Mk&FuMt0DژQc>(
+jsGP(d>
+B(
+BP(
+BP(d>
+BD:u:x`p)**Zpaǎnj&깢bÆ ԨQ^^^#_tNNN:cƌ:svvL55:޽{Tҋ- >|/]wޕG~vȑP|T 4nݺU\> 5k֤ID= 9o(nnngΜoРAO޶mɓ [FFiC^UUuĈr:::nڴ \UUEtRΝl/ҳgϒɬR?x upP|TfϿkQ--+V 1??ޥK<veggիWHMLL`׳gϨ zzz |*$`_vw}.Ν7n\iie~Dk׮ H%J13Zpi o{7Tte߾} `ee.ׯ/Ḣhχ6
+.=҅KW^Ɋ:d(T+a>57 דbckgDYnr7l2h F߾}T`s
+##ŋEVV7n@[n5VQQ23?AhJ'0Jʊu2_j<J|*|ԨQԍWTe񱱱D:Ըk׮ر#x Yq@@=C(0?// v...TV͛OC4:::s3T|2RGH M<ÃBMBň̗Bo7̇ K•#-|IP(d~B1c}iF՜}]g>(1̇>RիW!Na+R={{{0`&Msss...'N<y2wrrR9ٳ~g
+'χ|~3?5{B#CŰF2JQ!֬H B#1mI/ >Ӷ>ok4!P|ɣz(|!zve0$)Κ6f;.2_۶ן5`(E^.~{վ`+X C!q>2Ś`H000H)d)%6dҙ:ujlllܲ`Md0$aoTZ}}}nj,7>6E'/^ܱcÇ߽{ 0=-0_7h )S>Ӗek2iW\T[{|RK
+Mm5C͜9}C Hýǚ`|d~#\aW6zm,8Ege;$=ٍ;vĉSL Oڵkinݺq3_e>d,wXZ G+ 2jh=\|0;wŋ"..͛VVVs־zU\ ̇+DvttDm3,z+opM|)v1|}}}m۶QolY ̧R} Jj$Yߤ̿s=C1_CCz5
+^M 9c[R4uTj>ƍRo)+vY~c0Aڈ,݃޿3ٖWVgZ`G+Wj yXX… -[ְ)'5RG!̡V3X(f5SwbX q`mLC:k5 B2LZ]emb0,
+i_!P c~Sʟϯ׏Bo2yF,z^bmcw>2*p$okWS6-?
+3o^hcO_7{mX Ī򬬬`}ׯSLyW^ǏGĊѣǀ~ e,J[|d>k7)jdk```VRϿ;Qݻdܹ,o%97o ///o¸d=\### >dȐ;w [ U:044lYae0W䷔YբJ1/|2 a4=z~|||`[V;v3Fԥ 㶆p}}}Ḕ„#GͿ ݻGEE5333:t{Ů(|%/:?;8O3X30u˗/_r%\8p̙4avQ#[3SRRhѢ>lĈp2 e,Z])Lذa:lP
+Q30ګB UЯ_ӧO6 r֭[O?M:.?gXA}
+͛ Rl>UUU|8ƍ6...0СCnnnmp###C{ׯ_e7 <Zvw}|zYɤ$qӦwz1} 3e AR05å,َ;&SN:$![_xcBJ Dm¸d=\y(8}}}o޼ٰ6=ap!!!f͂N<900 @@=q̗l|;j^zm߾꺉W:`|z=\Pzz:|hf_| (|yoU [|>ܹ3\q/^< 㶒pep3gΜ>}@/ؘ$C+W]T8Z.\_oٲJ50_R75Q?^vvv _%
+'N}رc]o6c0$JQ\NzM55MNo)j՚?~QQkhhܾ}ߩS']_yu`6,\U[C&߇]Ǻ`2&u|P|d>f-i˘|P|d>f-i9ˌ|P|JV猏ܹsWZE*-o&99YryP$+JKK/Ropd>J-eY0
+/|9g}֯_?vݩS'?|jϋ/~ᇰWryP߾})l̯782%tXlA!E/:'~zK.ߠ !>s3NӲR}JVVlx<G7^s; B2_luN}}nݺKƂ۷)C͛.];wNNӚ<y2ČoLD}~z>_ؔu Y6 X@!E/:̰֭[bG.))G wo̲c0
+/|9/^P~._ ) `FN՜wƍ[|rߚm G>0ˑ (d(Vj+..9rN<I>gZyyy?m۶O>ݮ]3g(8d93bg`>(..NCCcǎݺu[r賚Bad>%P[[#[PJY'  T(U jYf0boK_4+++RB|__1c(]vZ׮]kY櫳2bo/,,2dp...&L8q"bGFA/8 ̀O>iҤ977!'6<y#JNN-j7P|_)p8y+Qe=f0
+߆700۷/Ǝ NAA0zAlGce( ͏2ϿkDFFhii10_=b?|>}z E}Ŧ60 (d~[e~NN 򳲲yⲲ2`>ȟ ʯׯ\nXYY5rnh"qTDK2K.x]t k@ljX/L-
+!B]yDbC_o;WWDͷݞVE?F(lHJFG<{FnܼIf_"y>^ꁌ"FGQYKO<OY@Tao##G>Gdfx7ۗHJӃEDQ T}ܑ#DϞDāDuc~#=t@LDP&@vD@@# (CpR]1AO?$$v JJdnIBi@cczo@hMz{=xP(!CR uEN>rO~?,ѣG73mmm!˗/裏|e(EA0 ӧ MY f
+˕Ă;ĝSĩDĈRLLo&6_ .L$&%OܡfKJ2_2"HS⩔$mmɝ!}mzxqmFDpe2>bl{ _L,L|0[:wu%7LMIG#bFਡAz~] q!QX QKgՙ3ٳdQVFCoOlN'IԎkky:? +IuȍmjU_$7o&.\ &N$ݩzoo!L":(%ѣGo|˗(ߕ+W޻wO8G{DDDSiP3Xiz݀ؔvyrg030qu& G8Mܡ''0a0!cNbgEL#C/2(2qt>b2aHż },!<x@:O;5-X (RCOS:l!v%`ݻH>q" UUbx[7eĦ9'Op@ Hnc#\i6Di)AA)b̗^HHGzB肥y@;6J3''oe~zz;1曚nڴe˖AXZCCo߾*}#F`-{kk:qww؈"h]D$Q̇qannj0Sb&9V%1_tF~yԫq[v$^`O|19ĥ/jRc-!Jd ^Сd!&ȌTnSx߳LP3HN&N3?4Ӈ&L 'm,,H˪'76b.%) ML|5<ykDOTY:M0ayyy UUU@Q5m,ˇ~5-=pI ($n^".u!%2)D҈4Řaڵ5=9&?kL>!|t>z-==k}FNPLxpq!޽K.3 O3O.@L0‡3{{-<lDrRsK AdW .`|>k,X
+f03DǟBPjW.K&zH|(&|bb|Q6.|o:g|aZЉ8@> vg5
+G% e%0
+G% a%1
+>3d?V*a-QmRY B+jX(Ige2
+B%a0
+B%b1
+B%ug2
+޽iӨ_R={v׮]t2aO<QQQڵٳC`aqGSqq+u֯_b]4^]Y|A!QCBBnܸѹsG_9rm/j𰰰r/^8dȐO'&&Rnnn...Ѓ@@"7n\fffDDĀn~: uf  GQ]fݺujjj
+:991O}-AZZZV"/V۔Z \g\e`u4RY BĘC={j Ç;wǏ%ӕd~FFs%:ӧŋ$.--:tիWa;-- ߶
+mmmQR&2ৠHEE144ӅՂ)m۶Xs;(
+<u~rqqwZO>È][[;)cGӗxht^zSpbРSA߾}8uB(
+BP(
+BP|d>
+B!Q(
+GP(2BP|
+B!Q(
+o%
+s444wˀ]-3% ̇rޠ[jq+Gty
+U17d>
+B5KK>H
+J(++GP(Td~eeeHH_xUbb+**(
+Ֆ/
+v?wr~@@[>ǏS+-##É2/۷/ڵkG-e+BP|'_qVV.`07cO7{b :}G_d=gIyL3
+1G o^R 9r(m3~j*gϼJJJR` tҧN>.8/]zu9Zpa{}TØ߻woCCCٳZJ__MHUPPөSaÆ]:pի|C~)Q:v쨪J-UZZ
+9ڵ+abPV|.7Y7nZ[?gdFG'Y6`ng_>ߞCz.,w__0;w0oaaիWٳcǎ >K.KK2O>$00.zIr+6nOKKӧ\ܹsԩ 0~xއZQ(53NRқ'OR߸^T&RQ{C3FSy(Q c
+Оb5kƎ[sԓ&-[ہq8Kpqssc`˗/ǍGmRڵ_r~sι|TUU~d>
+jM۸8QQI Oz;W)(#=2㪏|D5g=)柮<gx}I| *VK.?} bY߼y3D8ZS@<Rݻcbbɓ_~nZ\\GP 7=xׯܣX?yڱQ&&?W!Ն1 777vBBB͛߿80rBY/++ׯzgϞuڕB/_i&z:"222>>\RSSM_!Q(Tg>=-۳go_dy'qc婎Eu gp[r0{ |>ݟ40SpwգG~رX=z;BСC
+nu2Ei^Ax|S q)'',ܳ#4UgE3ժUo߾h"Qw 0]ψ#ڷo?uTî<MMMeYfP(MBr
+x'U?z:yPoe/ѻNڮc~_[h|>wWø50B>q߰*^ߪNva>~{B-惼n<*^Ut:Ҿ꟎O  Q(M2nsцUFݫu9PBPmWˆۮdGP6z V5'pmDE.k(
+zGP(d>
+B!Q(
+ƘOa ExI棡Ue>lmڶ}cm
+endstream
+endobj
+1170 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 508
+/Height 189
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 241
+/Filter /FlateDecode
+>>
+stream
+x۱
+endstream
+endobj
+1158 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 506
+/Height 187
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 1171 0 R
+/Length 20997
+/Filter /FlateDecode
+>>
+stream
+x\GDM4Mlokb[,`Kh|I4QQz4łޫr|N.(ڟ#FX4Ĉ#FU>B4|bĈ#*mc4OH'F1b׿37s}ćT/3-1b^kq鴟x5i y)q!a>~^~AQ=~d11:Xgt,cs̯ww|i#XKVK+ALC{$m ȚTߠlp%%F+b-2Z9n/i@{0sKkV+i_7 bS,KKWZ"dr:+92M <SI!Nzi#XKV[w>i?O
+{n{ظx%&yйTŪR1V6J&-ŦX$ʶ oAe&FYp@i̬LS{\:4=^%ɨ;JSluJV
+ULaRm]'$JS(qrAWY*<lT_H& VR+ uqqZX2VPJef2qz
+rˡ3W}szHh,04MU\/l<Zi}v
++UsVd>O;Zi2*dc gBF+eV"qW2GΣd̯\(C%iykZQXKmmy
+f;fB|aYM;)eTS-1SLbތw+j&Q sRˋn?[w;NʊK#rSʤ"Iewg܌f3v[MbWK
+xeŋ/?,h9Yelߌa)ҜVVeF̓87~͔f%y}KT*)>cox3Y~ABZi5_\Sr\u(H/;x6N&1nE~퐝V^|E#*f匘F;XXr<dYc*2bNY{U\T^*K*BbS$FkF{MkW.{Y+cڅ
+OXÙV)A;nߌcLyy>~n
+iy.-jnjXH"$ETp{YΉe*</m: "Ryn|1+vYɉKnя[QX|k_#dq?v[ނ)v^܎(:AZ]Cߛ_T~2*+B,zG ߭~K$w<I_o"G= "IKjVyM{%<e0 ]p+vgћ@P*U)9^GV|Y&_ݏ9EV$%.ڬ=ѡl]0EdJH"dϣt"ddc gBF+eVLn=gz=WI27%."PIv9pB*fZt3ϯAiAML2=560[jpP
+QAfx*a <יFA©6bϖv^U{'%fZy5.;3ࠎEey62v[lJE=.7㐗Q^pw}
+EUIqǜ4T/kEUI~͔%RMDJ\E*-ͽĦ (a>e] ]qݎ\-ްl=[WcvK X{GhjS{5j!- bp&dUfeNɦILyz>z~[JGJq./R1fs/E%¥Uk OKw Sĥי̲JX!0u;&Zca]TӤ?V%]62i<ש
+VYϪ*J{m,T|}i,9*--)VO˫BG~ez80Z[${MӤYWsdq+0vKk&(9+:Q|bT@A{:X!QZA?֡dJON<UĴ=.)tS 8r[M
+J*R Oߏg*b 8<],)ĕҸ?Vz|UҔ;S,S&V%Ҩ$!;_WDV(R)6[)=2fJYVTyG*|Y4zـQw4-H.*+bzl;6.9bL^R* (./<n:[Eį k)?DI{e&IFORCR|Wȹ֩VRQGdn_3-'B|]U|7`y 'I O18>G;c/ZlcrcAM/k^WHHi<XK7&(TĊ)dm2sSS]ugh+?䓓Wkj%UaGώ Yijdgh2"{
+wZG,HfG~ueV)3-# |+:` pU2;^>u| eY{>? |B hU"*eYZyVal!ȁ['C&,C~Ee
+|++W*ba{>GmjJnG="N ~xI_Gz ؊C (pu2Ke6K-f⻒e8lL¯\k&i2SVכIl>t{'A%ɧg-s,XZ >ziU2auvANV϶DZEo
+n:xuJYTI+# vZjQkrb2q:-.A5_ZFmpAwы,1f2"OH*;( hu$wKYj9aLq66sF˿nDxe2!Pmuq,RY&/ VYxiϿ\Ӷ[W[&̆3-csUR\ͨWWUpX˴*3euhoO/w*XAOӶ&Z&*YD'_mᒔ4uUUf负j}v{9O^vCu 6l` %Z]5kIzYe~auhoMu4U6[mBwڄm].HIW负&1bĈk5خB{/s!#sо)++Kln %'"""jO===QK=Q립 i::-Ȑ ""zhSWDDDD:l"'"""j+9ZJڿ?(<zp*vsc#gbUDTH${q{/X]-KKΟOՋˑ\$@,?I]?^.S!!!!p,++k~(q._yyy9;;O'v΁X[ɓ'=z ph<<<zW6^H:vD/37;nݻ# ;8mhXSLco˄ʐڵu`455_?ɓ:wΞ=G{&&&͐۷aC$ٳUҞ]sh(B$jûоE>[7D]}3(
+~-u <x0}P5(ȑ#Q4|xeD"ރ :r/Je``?Iat 8Z޳ggf⠽1\۷o j
+G-L
+h%
+8׮]8pK.=&kRA>||
+G{㪭FkY_fMhh[=O:$pQXj ׭[5z*ĤӞ9ϱ|оQƤ=2ܛ{oU <̹i .mmmaQK:4b F!&.B p[nsDe 1//nݺUTTaaaäۋÇᔁ \>|⪆Pj 888+WFCd9 Y b1=&.GCh@?an=q֋`PUU~=z2~]'n7D2dE=7Tdi̜X W>e{uh_CZ=)-LYΝ+MJ*p1+m/eB!ܾ];EUU΢Ej3WK{
+mC!)ˇOZ\J_nacB8rH(ڵka[ZZi9\Ox7q^]k\OS ~]'nᆷZDrqq;,YBgfs,+7Uvo*f͘,@k9ܙ=S;;}O&a4~G0I/2( 3f8<ܜ]6OuEM鴧 <I{|U ϟ?v9;;É CNUjјustrSᴇBܹsԺ=qNQJJ
+']?@9XO oщz}ÝҚw$T홙Kʧl/oefۦMӤ뼓*9Νh=D"Ν;[iVCkiիF0eBQƍ ȳi&>^d =VCf͚EeŸ|UI{]pbŊO>9D999>}A?[ D?'=EYD{q_0O-D]޽{yz7pZ
+A`N20C+L0bĈ)SGlp'-jLڃ/_3q۷y&XԮ];8UY#p4
+:ϥCXM݉iQY}ڍÔOj\kޏPD-&hFvY%ǔ ;7 l[3,76OT*NAvWc/S*_[Y΀;jhYf Ot/WchFUUUiiijWVǣ@N:)3gάxy.+:ԝ(+5-*η)T|2iֽZ5uJG(M{%O'JFaUjW;K<RsEwW>UEj b2Z4Qmiߕ"ԱiSWFs?LVǣ׆
+G^SфCS繬WVSw״8ߦvSaʤZj+Y!j5/grGjg
+Lep8nF^^gyJ;W^TtAŗ*gT]!}NљpKӟ4uРA[ldu< ?@V>Ϥ}=2i!DYiiQqMqB{Me+=Q=[Q[fwk"e
+ÕY,e'1 {}{Ӊ+eU }Ν|du<h?|ppss?7RPqZ?u{n=ը8ߦvO{\<+ Z:KL@Cj%.#!zS&<,yGfLC&UI|hS KVFނj\Y~o܌˲4=p^Uf:e I˗{ -Z3Vy
+:ԝ(+QTVߦvO{\<W Z:[hB'C6%"jG_Nh5r}ӈ6%"j*Z=WLķ)Q=1ѫ@{/%""""j)|Fn߈퉈 퉈ӾZGJ
+!!kE֕RS);͞]}:Պ/Ws|B_ڼys߾}MMMÝ?3HKK}1P7v#W7k`m}{vAwV;VӧҜy׮E?s8ӦMC. IXֶ6KqYNcB{Y}).]&!zzzO<HEܼs/A^Y7 C3
+_,6Vvꔄ?QqJUa>PT[4E)0KC9}4O A{.z{NNVhtYK&XW.\pkcc3x`صx␐(ȑ#[m|BR-Y}V#Ϲ<+15O7j^YugЭe3fdÇ0i\^!ehӦBUhߡC!3~7i,.Jq`Z
+!!Lqq{۶mҺBزeK6m &UpC{VtWcq.Yq.\H{v;qH7778a
+wb@͛y5T=jVSϹ<1IӋ1GitО5aֶ#)
+FԐ!C(o&^xVDHҖK.ѣ6>ÑY]RssɊs@ڳ \`8
+i3s5T=j\Umojפ*e͙c\] h_m!AJ%Œ%"}P2o׮ΕEi,n yJK/<y+pƍp\+++>i겖jX.\YioaaѵF0e, z mCoi׸R#g<+ {SSOv+Λ3/Ƭuֶ3覡}
+`G&\=D%| ^Ncg(ťZ~=>u{+p7*sYlV.kF9pe=&'']= .ˬ玃k\Y B{ySz W.Pۛz"p[qޜyz1եZΠ_ڿZQrɩ;9ҧOmLꝜPhi,LTO8!<iOQQQP zw}pڳ:7q.\ڃ<֛;jika}DǔsyW'bwpy9bKA"[v`Æ)e+VvH}z+hEtW3\RA|W qճgOGG܆iO]%%% Eʕ+6l Nsݞ鲖u,n\6= nik\Y VG4﷚z9\SOiYysWjm;~uhvW*>{+ss̔_XV5vƪ^E)!FÀ=[ѪX,xv6܍r<=Zz# { ׆ڃ|֛8噅TKjs^>y\>ÕOojꉘ0%<99bKA7 "p'jJױǷ|'rBǗRu,iaBfHƞW*ZWшXu,iaBWgnOxLDDD*퉿0"""f⩰Q͉qnӂu{B{""""nOhODDD*SGGN/KWŰɉH0^08P,;Z.?ҫ#H Y~>ôm۶cǎ߼8>e/y:'MLL\|yuuu ̄ol۶mTp(oFܹwށRtqqVTi7\i&s7iZ 07V TZ'Ojc5 $uh_fn1v,ݒwG@.wp 7.а*&"85޴ߗ !!µk3^ijjj~j'u={6?° O> }|Y6K>~TٳI Ǐw/\%"7XgOh%*_kJ7
+j.\ukQ)G-5f̘<Fk=k}/ſa>[7D]}3(
+ ]wwwmѾyp-\p„ O^~ ,X
+;Vtի8o.w5r<ɲvN^q,JTyy9`uJ{0\=":tĈhnN |j U8DSQ
+퍍ᦾ}Еh>l[?ϝKӣLk|zm`v#~7o&ya!ʄnI:Td͜.\@Zv|
+ >Ǜm=2*ܛ{oU <9hO:Cx?<]v2= qu/QB}
+Y)r-R9SZϟ)Z`S,ܮNTS|E9^(V|}nr-9̝
+L?Y*箵
+ϝ;Gs;=3Ͷi_C/oefۦMӤ뼓*瓹鲳hKi= I]$E3(MBAHvUkjNo.wE{\_zўƠ=kU\8+9"8qbPw ~B{*w#ګu\ D?aOT>>l[=E-u "ѿp{ӆ UX9aH}z:Tryk>s ܾTtesx)e}JK/ IHHnmm3%q#܁L:
+C
+g>rW[5'YΥƠ=F M16pVqḧȡ0y
+^n)~\1Yk<\Vd ګuԫB{*5Lx,YB=U}|ٶn7OѾeux)
+pxBGEYXXPmyܲjA -KK)0"ghƌԢt_Q}5C*ZSzzzNÈzÒ*QhDDDDDLkn_Ӈ B)--]rkֻwSN5p""""B{8@b
+گ]vϞ=377ر#fNDDDDhχGӃci_\\ >D?wa`` ÉZq^pAot?~SХKB9'19E#3nܸA=%"Oؕ4p$F 㖈9E#38< in8IF """jE#38C~5B-8 DDDD͙^8<w1AE{{_]P4p6Q= ËF.fpoӧ={̛[8+ F """jy{yx 'ݿswm8ҾE#3]yrs pDDDD͍DDDDDDDDDDDDDDDDDDDD͇::/H}5>zTr*bTW_8.]`M,0b†qEv\.NO?_ѫW%TB|sաcǎӧOG{MÐ58|ڶmۣG+WfddpR9%GGG1Z2_]vm:RBsMKԔׂڪh?`@qǎELî5kD8ڛW[BD(T֮뗮[W#KM맼t\4{v?wذaF|Bzؼys߾}MMMÝ?3H>wK}1P}rH$ٳ­ZZh="}cwM)VMFnj'*T#ڵgT0gڴ)zxH$ <qb)'א,--Gf:I).]ЧzzzO<HEܼs/!O6='+9ihQYl) ڣ8ƕ|^۷X#}sc@wwО
+appq駟^~ߧ+!ۣGC1m<xn^5)"Hk׮OFHu tׯ֮][tQqh}gȑ[ފׇvׯٳgQ`llԩS!{vmcc3x`صx␐.#11gzTCqbm^}(3ā2i$ӇkiYO=zU*W3aٌe2Y%Lڟ;WWHZߴP3|wP̟_M{hi .\Hl۶MZW[liӦ Ą79R=w*jA?PW^Υs
+@u(<uD/駟4)2XjU@@
+
+=.VDHhaKK˥KN-pC{VT266~wa0\b9c= N:Unp$@_Í LM}QTC :B1??<~~~<*Τ=4; LGnUfNUʗF]rZ.Ph:4@:|0޿?ThnT=3_ziϬUSNJwոG,.Fli?p`DXDOb4
+YB_-ZfnOJ Qy;SZU
+<\[WZ8gΜe˖ieݞ靊B0
+*
+3 8G`3g믿L385`~aO1JׯtS@鴇 pI \}P3'_Ls*30/R%שt&PAw;ZH3SW_ΝӞY8Y5Kѩr~5gڿZQrɩ;9ҧOmLꝜPܼy:QQQЌAAA@}}gNE /8"lڴ8G`8Íٳx9990=ԩs#+`|8a6m^
+ qδB{V=Aߟjݻ7D(Ν;Nvc-ZWuɓŝY5Kѩтh`A7 +SV퀑}t9WX 3JJJ] ,•+W<<<\]]7lؠ̝=;}M7ܸqcxxk׺wM{#0CCCuuup,ԧ%(6 ] ={TK{tѩX3ОUEbu8 &}E~y;Mۍjik^}HȀǓŝ4z|:bqi5:5ZaZŇ`[|zenә+Ъ&=oEbСCpv8RҞ;pݚ>}SPu G{^bihh3tԧJB8|ph[>?y$L+nUm]LT "LΜ9 1E{AHzjikP}5%=K+Oڳw
+T<sS5Kѩ i4}̢?sC $"JU9 -NIII0ـ3n6KDZ4 Qs}5q|%
+ۯ_Ǐo*i@"hZ4 -$ȗx*$"""jO===}uo߾W^^OV?5ODDDhHgup{ŋ _:ѮB{"">gE}iﯧG})q۶m-HDDDtu{"""VL{|򔖈ӞCDDDDhOhODDDDhOhODDDli0WkiEDDDDݯSJII@ Z.""m I{>R&Mi"" ҈)DDhOD'li>Q1)¢S\|#퉈[C4rL<1ᓐШWg6rv56v!AJiYyeXTJXZQ!
+~5i0z)DDJ=DܕkOh_BQQ)=> {ύΏY'%%8pwݻ!޽{CmxSh+z9sf
+о{*߯ \reɒ%*Æ Sg4"D{>U6WA}tjʤ2_ó&&w;k͛72,((|РAleBHwppH)//ОоނY=^q7i)ԗo~ǗBVH*K+%%Ive СÓ'O[nM:U=o߾=xvM0>|gϞm۶<x
+J>~~~|ݻx @ @P^zA#|ވ3gΜ6mTs?VO4)""G &&o %nz@VɟsS z%M*|Ѳ8*ϟ?_lYNteTˤ(_ELLHe2EV7'޼s̴߯/^1bP nݺqAgϠ%>|gddtRDΝ;^͍VVVϊ+
+L(QٝRWry^t仅^LVk? Wth~m޼y(8 ȣ#kǎp HHH`˗/}
+akbbxgY ìz뭷a%@1La &癙_p!1cPV^#SN-ZИIIIL9r.("@[eeeAC
+MhOԲhA/@@}75|J{sdTb-KgIov?+g9<OOI/d"H駟T{ܹf^
+
+
+!7p
+HڗV
+B?]}* K+g
+0 NNNp_
+tyɒ%qqqk*Y}/ %;]IJ*m{}mooO5gڇ.^=LO<Wr
++l?Q"e2ES#/V[[y3ΝKk;9w2dvrrrKj kcЃXԿ+2**rD(JKe{~hsd;ٳg͛uڷ߿W^=zXhQzz:QKYg0gKF}g'.u
+؟'/)}~?q~o^KvNi"_<&"jo"L퉈 oDDڥ=JD/DD_AM慜EО蕥=>1bĈk5Τ=1bĈk}F=l#Fjz|bĈ#Z P!
+endstream
+endobj
+1171 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 506
+/Height 187
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 236
+/Filter /FlateDecode
+>>
+stream
+x
+
+endstream
+endobj
+1159 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 546
+/Height 183
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 1172 0 R
+/Length 18782
+/Filter /FlateDecode
+>>
+stream
+x]XIFްzzygAX;{ v={=AJ%;ҒВ_X]#$>߳f2;*(hhhhhhr4u/hhhhhhr4BhQACCCCC1n&GW1#8}_?iJ5fY444&kQL~"v5s;j~M&1sեhGo?سvjv{v]#ECCCkXM.̤ۿBPXA %>bHe_ AF6nIJhhhhM+ɥOTAD{埙TP
+@_\.lP]Pl5Q,Z
+nr+f%kqv9 [\QQAH 쀾R]u)s ?נT#ECCCkXM.~z_&T7TgO}9%((DTʘ;fPXńz(UfY_eݦҙ Cg$i5RKo+L*8ECBҙ-vfi5M&1 `+2S h[ {quyzQQQyEEYY,a**PQsw28V*>J(Ul-*#AbKAѪb)YEy6 "-*O×r3yRnmR (_'%|^d,7 S6I _q
+exͩtL&IDJI Y좺x}emvVyK ާ($
+<[ЙO߇[nYEVS>"kdIo<KK+-*R
+L0jUkا9feYhkys%>y% ODsјFI4K$j<䁋u8Su}W9ż2/M$:zp건L'*$Bk}rtt4( eDŠF24w2
+I#
+S/PC)C婑aGSE{·*|HYhɹe$b-5Y}GsQRvN>J'!+VZ9Yl0R}I[ݔ #T8Z1Ҧz0
+R,&jgiY}ze߯2ܻx);ABg.C8:饏nͼKe\V)ǼD.MkuUöxW+{y3)QܤFssDivjAAH05'c!L.Yg<yb[<
+SlʒN18b>&bՃ4V=^x,(12iADa*R#/`(X” "!jѥ{?m9YiDvPzY)MbY0IJLa{qxA/}VE(DN5K 2S8 \7< V̩b_FZi/m|׉>gd\pc*`HJQvQ<u(R9E:WZTM.8)<>,,*mqSCfbppEQSM a" (+()QS%yyr3+0q}_03i!soSz`N5MM/)n936eQeb]M*ІU8laR,NE׏cmf&gH:g7bmΏ#-ǪV%n'grHNf9¾*sx~)KLk떪}hZc3oΛ)Gy!{u^;(^:TTw]dNIxq
+霑)nz곝!981O$EQ.4>YX<c6M‰jaTv\SkbUHkS2i;FT?`oWmF[eNZW,qAnN}80(<><=-/ى|@܃,8"҈r`מ$% kW.1Ia7ns ]JzmxZS2;8?k &ei>M¶E݉,N,~8d*D9U]q
+oX'2ԍ/KMkH)`E3-
+vXzJŐ<nef*۳44 <DGkQu^I<JwƕfmzR6=TN=HK"x?%D(P]Mň0zT=h##"?;S\X0 -T iR ]ӥL;h╘8yIx/y6bVuk{ǾNZu˼j׬[$l+ͨ1\=cTF O×ۤ'q $c0Uҿq㬒#Ԡ̒x5Fh.瞵aJRp ,|1T+JXM߻j1:#fh֮ū>T9YEi-XfU9-d _^RblM~2FQ6?(Ô5Dd.${&%^{Ǟ[XD٘TRZMe=([f:fqM-_) <CfX.(-+UEV&X\vɜi3<2/-=\Ϝe<oIVGUyWLJYm䚵Fzbw0wg[O?SUfrgCj'ouV2!3ݖ,Wo <)fSw[Qm9=YO,5iܒlu| .Rzrp]Ma7@u11g$RpRfcSa̓A SLӶgJ}C2|T]b4TC$rJS3>ZRlN(.v9
+oBg}38CR͔،zn=+]yOYS|L!q5F_i2 ?#g--|he氋Xy1T$l >Kw9g<,7>nSJ%TQu Wk8sM[z<]hiV1Y뭲^q4Myet9
+A/1/2a/{;,v,&hvPzY)MU͔M/,jݳu?M XcUt44#ϒ38Om7DPUiIKYų%Tf}fS.-wt傒
+^Y Zz,废\3%$|UN$okm*ظ2 \l̚!Q{+?ROK <7d%pX-7f>R3fͮ ȵ7u*5ŇSyѦ~s[affoA λ'֢](''YSt&sFKۙNiR₲̂;cgGͶ?=$ru!-[`H5>j2Mv
+ ]Z\k-%7"-f{n1 inXEֹlNʮX5%inYP`@n^r!8Rˌn}i13%e?`j3$|N3?4Re>BذEYXQ
+3bE$pM `(m:#CwSQfa=Q̪ nЇj54F]YJX)Qygб+p*,̼ JaIV ?˽`uM=
+S2mD&
+Kt-4/,=p%z{lYqqEAjefJG\) W蓉Yh~l#4 XIeWU[ӣx\g^ZLJ>CA֌O6*;~%e%T-s)eI LS*q\ pkSC'moMtJ KSNYx/4YYytjQYKi!|RZ,bd"9"Q맗Kd1gj0 s*ޛ<fPfo _e
+\=bS㦙&,qʦ2KK+{sRt3Lr*" ŜO7OwEަ%c%޶^GUZ{iaUP_MZ6}Ei2*2Xxm4e͢$̱0n5ӣ8g'/Jᕘ8c#GiiV%բ2⡵&cPx-uʘ&H^Y^aEe%eV >ohhTZZ
+¢>d?.\T\9ŭʷPe%%jNmhz;y> 5Jݔ.vr?G]LS$HXERs. TW3F1K*ޫĥXI~K*,D4[RBgOA}0J⾈|8b4NSZ)j&=XT E9+.sYiZ}ѫi̓m9r/fLLJ*!4_ ~fNk⎋4n5FmrqtEIY
+vZ fEE2ϰtK)q#I<)8jy\*84+*+qB?;@<`.-_";YU<zpN%֞XO/CMh^%<NQaIIIaAAyyŻ
+> _ ˃ K2W߬t|AF,+TX,=ИʔS^`>1(eYteJR+Efl*{y %f *UKv)3?~֤ax`fhѣgWdzm>jYYKϣ5f UiGj69 ϣ̾[EG< 㔅a9T8ZUVi%omsc9t{fqjLQYWs{<tYOz-) <̀=2\ńwgPB fwu!:
+T
+ Y+2D}G4Ku`01S'AΝ;Пnݺyv*  Tf z Z\|?_Op2_2CDa#ʈߗٻGgEs˗0ID %<4
+)U郆Shh HTU@A PeTU@ 2LAӀk-ﳾvA }Pe>&C2MSe>HT)i'CkC4aAA Mdddr|`r +/?qy*A4
+O+_KG6{_h0ٗxɘŰaڵk7u԰0"QCCc۶mEEt8w'hxZ穷jժ~O=!faNsC~*e-ٸSN]u١>f+kV?Wq\ڶk;uT4*1C'C؇o'NtOr'/^;oa oC`^˫Tq!^Jݔ:gJ=N:955[|V͟E%D{4GE3߈I%x ظ<zkFmwO
+猒twU'>Z|*VS7!٨ qZ
+~B˱]|rTS?l9eq悙P݃U)^{諣{(Dx ~_T!HcgdSN:uVɵk,X@OOOo߾}||gќ M'vsݷwtE4 3 ߰gb07&j$CK7-%2o&As4o%L}AZ@")䵉x`ī;VVUTfӾMĬ $A7m,']]
+])צE~}cڿD['C(t_}5^&fg̐>hhě7<1IчXqK o&ܫ|ZоoɤY'fs3l-0B-N ]isiۜ"tbɘ cϚ- z<;Wđ{"6]R5Qt5`oFI{Ňr<
+}vO*{Ok­;#|҃ï$C R0bJ lݺД~709">-L8'=z 9ܕsX󴚬&oi47@K-eOCrX,/2=g&d`0s`&z6Rhkig̱8ۼh:߮;ߨR6{llT($C\1+/9wr"[S!ur-ĤܴLN]1k`ܦбrcs·/n
+bOh2ͰYxTy?;]MHlGSAqr?5Pq w_5k6*i}uU&_ _PR.An)?'_Xpsbd}EwUDZ:_ta-ltg O~} ÷ѯC3rke(8{_|`mܻp.l_{ 9*aBA } },M𕲨2H̗@lt4 N+UU@A Pe *@ 2 *4A Pef2l6[^{+[-ޚ0@oM>M&</Mxz[3S譩ѧ҄]3N`
+.Eo&oRepC zC0@o2x 5{ӧWOAmڴիʕ+6ׯY}SN %I!<<:M ~7yu)zCo2 L+VknС6662v5zCo 2ИX###EE7o@ƍljjbΝ;hРx&P>O2ePPTbVEe~WyE$We>ׯ_*n߾<|pSoܸ@2FĉGٳgWn3fρJ\u0IKDBoU!tvݻ]$KW7*:XYY>}zƌUr>x`Uh>o<---)i秩YK Q]ЛDo2 @uuuUUU133CejMϥINu֥KVZmذ!77W[[{ڵUrM"
+ MJ,\sΞt)F_jh ,޼ID߿/ׯ Hg8# ۩Sڷo9st5::Z# _R|/'A%/_27P7$ۗP/. mmmMMMЄ@dd$ ӧOx6l0by-6A~G9.]a<oڴGlh1D%K9RFo[lQWW 2,7 n%X5؋˿2i=qTr'|C\}Q!_\^&ɰnP(R <\zٳgBFOOOFo/_ٳ'ZI-88Ne`Kѣ!1xl޼[nQQQx~~~Hk VMrW|/'A%/_27P7$ۗP/.Bhjj
+LȮ2pPkH3gBي!!!x{+ ;vYm߾&5%%]v
+A76Pe> * *4Ao2H*4Ao22 5 p3iW7|#372?@ / YTF@4G 2 *@ʠ PePeT)֭Ϟ= 6l۷o۶mOFS+**nݺvK3==]MMCFmQ92)1sLb?''G[[Ga~w77BaÆ5IHH֭92|>ʔ)+2 ܽ{w~kb/lllVZUvHs]vmРAr"Peu24~
+
+sΩS4)Ν;Pq©LNNZZZuj9\.`q]\\ZHN B9sfӦM;v$U&00͛7Yȝ;w`ܾ}ŋCXJ;vڵ~`0lΝӧO6mFIw^yʕ޽{ŋ$-,,@ڵk2 av *'M4ih"Db&B ɬԩS={8s!R;$:K 4炂*пSVZ2*))iر>l!92T'soootWW^z9;;O2ɓPϠ)
+-::zɄ@i90a$١Hll, 7ԡs7nJ,[ِ"ڵkg͚Uŏ%4/**JEE%B*Sb@CtٵC 09vZ ɉ@AȢ2Zf߾}x"@t%ADRvv6@p1bQê'TF<'q 0177'Tx`M2Çwww͍ʀAdlfЬ^H 0[Dׯ_!ѹĜ_Be
+eeev풒r/]G<V*޽b bڴiA&!'Uą?O<!UF<'A D"N'Tŋׯ'y_!%22rĉzzz*CzXzO8f Ȗ 6*
+Es9Z65˗/ȫ@ 6!öm6m;>'ܵkׂݼyN촜TD=T Yz5qÂ˗/{M|;uTU$
+Bl#U 9 ZA?NP.p9+WHTe7 199fƌUXYYT'0ɹĜ 2* }-8='D 8:9NkD w_xb}QQQU2_zt]h*Z0y=z@{n׮]!LITi4| hӐ!CDccc„ 6wڵҥʕ+WX lfC
+4PEE|LT .ŹĜ_TeTT4~9ommM<\*@ ?}222ΝKޣAAAʠ dGnnӫW $''ʠ PePeTU@A PeTR*((̜9XZZ{nnjS;BPam?6>I!BT٩Lzzܹ>^ZOOo޼y%%%51ZEFfpKoa>>!GP ֦M1D Ne/^<k֬ݻ*ҩS+WBlav+a…ExEA`/1_ o_wLn~92DR;;;ДRea!3vXEEEؙ?~Moz^!AR`9?Br"Pef2Z8pK`TOOOΝ;߿ѢEoll,//@/t s Pef2?ˮ]׾},^Xt˞͆{ֲB9.<υ\HUTd?ϝ;uְ ѣ%j%lX(ң«m>' I 4luw y ޶mL<Tյ';;~Kثg̤)<|Xu艬E;2B*BӾ}oi'l7\8\r
+ T **@ 2 *@ 22 X*sAxAO+zFGhl?  T=}a"̮<Z0EeO'+W$:t0j(__ZMRǏuڹ/}Nko~9MSe` "}*%C.*ciiɫZ
+R]6hР- \vHSڛ_NDKS,GG&n*SY-Se}rܶmۆ>ݻ --:Cʜr"Z2MzQeIe`vݯ_9sX,HhժUqqݻƎSko~9-Je?JGGLB@hY~~a2f2L&3<<|ŊC )++m׮]fffϞ=߼y3eʔdF*#}/'kQqO^>_o *T TͿ7vRGFƐ@e
+\\jsH4iR-EڴiU?:uB5$''KyRjPT2$x<Cܛw(kijo~9_ kĝr.6XQӠ2[~*3&S$4n~~%%<^):UƕL@eUbvvv>GA^e` tˋ
+
+PvoXRe_g߻06{֯[dBy^gi߾fu0
+%,9 m۶y-iJUU5)) RJKK7nعsnݺ
++4hL TLKKlٳeII򙨵kזݼy.gaA087m;Qr"lzmǶǡӆQ'TfåT7II顡_&'gilvJbbgȍV)Q~ҨLrr2ЖB7Dx{{{0f͚%ѣ۷o0a񭃃g tuϞ=?+ 'ODSSqR õLKV$G% Wee吐rGSKnݺ%~޽{甾UfN=;>TBeHiTG"eaX,7~\:Uv Ѐd*sիW +**}B̵k,X@|N wU˖-#a
+#hP@
+w@Upܹ:*蘜 r3c LJJJHHH޽ӏ?>f̘zߗa}qqq)))?~<$A@¦Lr]BeQePeTiT@́'~ߦ]?r{ReٯpY*C"fХ 8|+S W"eԨQ3f߿vTTTg
+
+
+֠@bH
+endstream
+endobj
+1172 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 546
+/Height 183
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 351
+/Filter /FlateDecode
+>>
+stream
+x1
+@!XY-x Sh]у( % D7yF 
+endstream
+endobj
+1164 0 obj <<
+/D [1162 0 R /XYZ 80.963 747.976 null]
+>> endobj
+334 0 obj <<
+/D [1162 0 R /XYZ 81.963 712.73 null]
+>> endobj
+338 0 obj <<
+/D [1162 0 R /XYZ 81.963 482.853 null]
+>> endobj
+1166 0 obj <<
+/D [1162 0 R /XYZ 321.066 442.438 null]
+>> endobj
+342 0 obj <<
+/D [1162 0 R /XYZ 81.963 256.996 null]
+>> endobj
+1167 0 obj <<
+/D [1162 0 R /XYZ 81.963 217.187 null]
+>> endobj
+1161 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F16 475 0 R /F48 922 0 R /F46 674 0 R /F54 1165 0 R /F39 618 0 R /F44 651 0 R /F43 652 0 R /F36 596 0 R /F24 476 0 R >>
+/XObject << /Im62 1156 0 R /Im63 1157 0 R /Im64 1158 0 R /Im65 1159 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+1177 0 obj <<
+/Length 1741
+/Filter /FlateDecode
+>>
+stream
+xڕWKFW(Wayr#$PP!`rž]+Ȓ]ߧ#[fTNӚ~L׭<I$Bd12Y_'B6qfdM>/WBBO|f}vRΤ6[<gƻ߿z,tj,On)%~Sleg}fN-^SU)m/-9-Lh髫g`雥Ӳ hh.Eb,u°ĔC'4xY mDuRdQrÚGwW7.^k7t
+5Pr"
+ p {2Q3x ٱoWK^a<#>C]"&䙴gO4<⟳g0 ~e5Q1U&
+@?00L93, yOr1p P'U"݂:܎*+%
+=w#b{q
+,[z&ʰ}Ñ}pɱm
+endstream
+endobj
+1176 0 obj <<
+/Type /Page
+/Contents 1177 0 R
+/Resources 1175 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1168 0 R
+>> endobj
+1160 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 388
+/Height 161
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 10493
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 388/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xy\TUǿ20($[j"kA.cOe=YiOOPeY<Oei.h
+_h"*Ո}r
+'.+f_K;[-udN[FZ[x㬛` FNhqvp6uIJ SK4,&
+
+U97Ab3amçO<2
+0&o^EEU7_&^}(
+1
+񿯗Df
+
+mteRE
+|~a3wk;?$*1HtO$˵:cY\ă^
+7; S2,;fK5Y6ϼ\Zp
+ ?@
+ۢ2'%%%n\UUmsYQQ$eSI
+-+6hyɯt+wǙnHTc=p]K-DI>SB!70ؼz]Ꮞ3h:
+PЖ)'
+y/-k OahS>ا.,7T\bR8Qb3xO2N1KgLD\;R
+,&<@ nZvǡ5JXc5&FN\IMz+#x3e9{k@}wRaJY9D"<y=RlOĚye"EYa+ǪfX8oԋMr$V='f`PM"M`[:ZU=ص֛3zNe=0y‚ōRW|S;٘ӵTImJYp@MZN2ݱǕ?kXW9
+Aj/4N ؊P$'&yKB
+i/ }h QB`hs /4NOPmd]A^j;M~EO4?4S&&#dE'pw`7Y
+K*j3sa!x8U0|n}qYc:Ղ0M)%__Hg A*T Fb4>sf;w-==d2[2 ROK`YrM,t]F 0i&- HZ0
+a;
+2
+3G6Ej얈^I%ICi&
+ ,))uڂ"m6k*($5cha{K~ ggB4ֱAuTG:`;2ܹȣ#Z lffn{@ ~#d
+0Eի&$
+.:(([Zgҥsszؠ:zpp֭n~~
+ɤPd~*!ii>a0C^.Ĭi2ҀCbgĞ\wP/Q놃&O~lĈ~EE%.]ӏde\y٥TZef_(,j٥^[o8 ; 4(h4d̛77M@
+~X{ Dz 휑;K=̊핽#QvNc9C? Meg-j3z zOBsa.Z HW!`0B'` O9#᯾z3T'}ƾ6j,Vk/z=ݻw333);vteq)(S>E8սǽYOLڥ kw'u_y=^t" ###==W^qKwVw;[4ݡ;O } T{T`D)ݷo_NNNddB?| zt<囁_'>6e@
+٬hX5Lo۾\C&`k{hp.P}Ѥ1Q7y&MP=UqnT:no"
+FӆJ6<T:
+
+z3ToRTGftQS:*P&vTP՛-! Hw>zhGL vڡ:Ϫ[]'Lvg[k̓}ЮϬR,Mu|+ h/՘QB6 u0!
+F'O$T?PH=zBP*3f(--+z왛m({Vqܻ۹sÇ_|;Y[PQ<2;wnJJ,Xp ^?jԨs͟?ǖ-[~iK7|sƍ~iZZڪU>䓍70u7nLIIqӭݻwoݺO?mӦo]ǝ+}j9rȑݻw߻w۷ϟ?qرC@ddٳ^*d6lؘ1c
+'NP*T0`
+F;w$X^ҦM_|>[~~… srr< ̓Z/_^TT"C~~E0!RjD"G}dܹsU*UPPМ9s8^k4)Siy,X0g-[-[dYfl߾W^ǎ[rs;O:5///88aGP`4r/ZHzȑ!6mذѣ
+-ga=zy^^|-]&lܹӣ~"; 0!`0B'` OA1Wzp4%' :r[EAcБu.8cj7 M3B'` OA
+endstream
+endobj
+1173 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 238
+/Height 206
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 9982
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 238/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+x{| W^sM"\" T5R<"x<BU%<AE%EPH"4lnrdnvyb9~ٙ "
+BS3I/_߉\2YRUVt_Υ
+AyRՐmB!_$0 ī 
+c} ;NE
+
+p]SxdXAEdgb5
+-KVZ!
+,Y{
+^5e0̞#KjSC-bf`bUc0YL  BYÏ[rBZJ=w4K8#kE$>`qJ\:"$
+(eq'Ս/W݈^
+d2<=Q@~PX7n677߲e V^ZZ:i$SSy|
+rJzرx9y+usܵwy
+ K j:;w8$ ,DR_%BKB*֬ܭۻMlM
+\. tIC <o޼y摴$~~]8?itAp 
+(e55+
+e98dDe܍7 AyzD ̛u8*+R586J2EayA5
+srrR)<kVG Pʊ )4?)//ǖ?˗/ZHn uL (eef%OJJxwRV#555X,++>GRVig>}jcc ;v,]@p !!ާ"5>gVUU=yJGq!@)SBjnll<uTbbsrr.]JD\ )!!&Ԭ:&\H,BCͲtLR<@" wfzf*=]/I܁vmiGBt10L(~kl|_8W P=A2y
+Bwww,gPPt-FAo|;::>W\^+/X,3>>^Ekա7'Owrʮ.ZЮLvvv|vT -[ֆVVVEEEWVV&;TY^^^WW7tPE{=UE]]?>Ҙ?F dggߺuKCo|Kl릦X@2yFFF<x0,,lڵX5`0111t~WW׾LBo=rΝ; SzI&O[[YfĴ+gM鬕X\WAx<
+u5[YY-_A+WS1[}
+@E͊>u:9ib#ѮLvvv޻w/-h @fUub657P  <7nxu <xfhGWҺung6)Bo|iW8aaa;v9r>|xҤITi
+EB 8 P=J'@)C(e
+V\)wmjj1c4hйsͲ+$2ݹs'((Hb9???888667##ۛ.] &l??,ҥK'""
+~EzO 2;;;KKYf\|=kee644rq=|Gyyy999><pt aCgϞI+θqv9uԯJV
+endstream
+endobj
+1174 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 438
+/Height 256
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 19485
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 438/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xy| ?3{gs8RgDGh)U}:ڪ㇊J*H >611Y{Nvk_3|>yf>\<A
+{@ xŋn$ /%%M @JYZZ PFLZM*@WF pw B 
+fG@8x⣨u_|5l^/^|<SŬa5C)i07V"1F;plCNg'LаaåK#C***bRYwoA9@IQ~nAĉ:;o/-wq2}H[ h9<*d„ 
+:uJ@@2q͛uꨠՏfvif#CL$X ㏌rMC1boM~Ç_ۇ ~}CtRccH 0Nj
+ ޿״Ys
+,..>}ܬY,uA``
+Ln*,dZ-:' L?2a6 B![<Cؕɿ
+ ._Ҩ;7vH$z)~ ( '~;wiQVԏ
+XBeF= ?/]f.dh/_?̥C[XX(}adѣG/( ?}4}<xݷߒ׭_6nIŅ"I&ܹK"Ϝ1)og j
+
+
+oڤ$PإK#=1c ڵ?P_Ic^T\n S&M={6u.YA:uךNAa0cK0\C
+g?8fݹٯfB多5 2Ō:``tl+
+tqsС))EwE#m/((?OuҤ[r:R;Β%7_[w͚Atk׳3_aSX25TI&2M;.ua^~ަ]":EoܨQ1 _bm;oڹWMƌh4Ybe%E+VԗS`nW\U^\z5":/W>M1j{ ʍ~lp8pxki\+4(iPPxЩsPPSdM_)D+_kV͏1 :
+$׬Am[XՕ 
+Z*,
+Pћu޸vm
+
+T+T:Ѯ^ڬ'1iѨSC۷lִH‰ ~ݲe
+JV**{RW7GBUT\o#?/@FVy&'WquL"s!0( LgJh4"ЀhB
+icIrW1ioKw
+BPVNBq֮]7nΟa4yzxw?8>e2AAcN())1B唢ӧ\l>>>z]v-1eK1ը?ܷ@Eb3igCרYs?
+͖>IDbiӗ,Y<bh@бcǦy{ySe6lE>
+rBP ~!"FjX&\0f0ZUA&j|$p ;'oLgX"SdP*DbP((.,!333|튥ޮbSM$pQQU(>.-.*.̯E`bL,ujMJO:rHOF֗23gq[75qภ0 P(\<jigV'#c)f]oT4ܽ{mc3&o׻o8J-
+ |co~\
+h0Z$*DlP Q4@R~@y :PHer[^Q)
+jdG zAi&$L !%Xw-}8~,3)9cmuǺ qq=|ѨRP$T̴ѠEd$I4[c2 i0Є5j\ٔ[` ݽ|8k3*UH*%'>FE"T Ebn/a< f"C(IeS:
+BCZ~9 Vg^^aKKd.xG4| iP3%ePZRdOOC iSZ5Adgfh4W8[a!UG4\z_ӟ̎-p*0j@ ՔAͨOA p4h@Eh>%,E5-n7FY0)inP@U v5eF1"*-=-)
+AbW!!C0"In]Hۅ -vg^WF.**t X[ {=PPv֭nxMFu]Vk$%=|V۶4STTi͚eT AvHZg=\wfdd@z322-zBXӺK>:
+_J6B$M
+\Y!.f5q<.^R f/^gZcF ߙwB%_bX:l݂f}p
+7klۿ]\Z",%d%gh 8]ZK@ 6@vZzZkӃ@ <Ur3G&E3NaRD!0"g,vqj8#U8^kA{-TXy8Led 8F ܒս{wHx
+PZZGI$ >|-5$>>>44EWV3F*%&&7Hߓ<بQ &;9aÆCm۶-88>S*NdffΙ3ީ?s۶m 9r PC&"##;wܽ{{*
+D1xL B̒ޣG?kϞ=O>mԨB}h4!!!V bN >sLpppTT@ <xpNNBto-:mt9222$$dӦMӧOB۩[75mK,OO:uX*z۵kϟ̛[n1115ï1KVVɿYYYJ^ҁ.ccc>nܸRf) BBch׎ih~UVmٲE*@jgT*UL&ryHHǏ3!5.=Ν;999N}m۶խ[wСϟ?/ C` ']AGYmԷWREEE]ɓH2!>r<00?24痝
+rvL$6ˌf[<I/rՇ1š<5I୽wcS 5?
+/_|U" mw
+bĉ/_Y/a>Z?ݻN:˗/oժ-L`5'KT~ܩ
+¥];{
+ŋ/^)ṗt^2رu/i߽zImvDr:"]$u_\;\o+{{9V.%_87#ȶF:ncth_הEL |lG{A P8#-=2fчћ)ڥHugoAsȱ`9}S˕#{NTLcEjJFYulն:eL_5I&7n1˛Q6 41^}/i?Vk{򵊄M]t1FQ`p"Ai HxG8q
+Ha 8Sl
+ aV`GS[Uk@@@kSSSa=m/
+8t[֭4hٳ/cM"I$J |Mxj6B.r߾} (,,|h^f
+./
+r9p>{H'^*=_fU0biA^0"N%`D!ׯnB
+Y=#)[+ᥭKa[0EBX}gA{%^Ñ]d%Bv{Ew`5HB1tFu̙36+++7n\ƍ;ut)
+q T<8w-AkVp,5moE0w׭[7hРٳg_&<FYlٖ-[.]*Hz٪+Z}4hЀbcc_|iG*ߕ+Wvնm[cLK3IȊ~*`d^4%X1/)b-lNJ"ż| ..# XLүnٳȑ#yZZZZZZ^raKj̩}:lHAÓK{R֗z̻1c$''Ϛ5ʕ"Dd…
+8ۜAg6ER8#-=2fy뒜^<ʙ^p6{ڄ?n듮_1ܘYi84 b9ߛ{_3˓wgN<cG
+
+ <r䈽cS
+r=#^R ;*C.\lO+h rX~Np"Cs%(!1B
+VF7pKq0n:Loi0
+D'<55Utm/WEz9}v_G,,WEz]# Y+ҋ"`E*C6jԨcǎgΜQLH}"H/_@ܸqcJJʆ s٢Yi?.]-H/ҋ .2<<<444,,,>>>//F}J3ZcE
+Ez^.Zyi&1+%3%mu$V.جK:^H/Hz-‘4ƍ@ l]$ /@ ltK}ii9/M|ؓF6Z4iҵkכ7o2+,QVV6nܸƍwԩSllڴ)00pժUih4M4 L/
+ŷ~gqdRԠRVkC`3=@sFYlٖ-[.]j0,WQ1x`\NJh4uwwٳgtttxx̙3KJJѫh駨9ss
+}WZմiӼ+Vc\g}<hРRnժUΝT*Uff&7zƍYYY={4^8JcPfHHȭ[vڵyf͚yzz{}ٳȑ#}MKKۻwoqq17z=z4o޼כ]A ,ؿ]]]?&MpwϞ=_|E\\뽼֭ˍގ;^vm׮]+WtwwW7zƍ&J%4qHl|٦_~/_3gNݺuW\i:2ʸ .
+
+{ャ,hw܉1cFӦMKZhoE'
+۴is]
+gϞ8p`yyyii{:t@S###{
+ %CS)RSS
+ETTԢE W^Q6oǏdd[ǎ?
+JRarOhhh>}ȝ7o\rڵ/_~ɇ:txV^T*8|p>KMMMMM}4h`Z???j(77Ġw6S05k>y򄌐V@ǏIIInZ~v4F^fM*-[n߾}K.}Tx>}>GM7pf?O>>}?0k֬I&}oVǏ?cƌ:t}ݫWvss3-0//˗7o^x3
+[jjɉ޺umH-͛7=z4T\l"5|\/rs2:رСCw:̝;722T!՚qcF~c>׋D0EII۷>|إK{w.],\X<" C:tE <Xg @XE"Q[40@ ]dxD1Np
+#8Gٰ&vA @}a"(E"Q"5K8oǤ hԌ:;@ JyE@ xFĬ |Q
+endstream
+endobj
+1178 0 obj <<
+/D [1176 0 R /XYZ 122.806 747.976 null]
+>> endobj
+346 0 obj <<
+/D [1176 0 R /XYZ 123.806 712.73 null]
+>> endobj
+1179 0 obj <<
+/D [1176 0 R /XYZ 333.021 679.583 null]
+>> endobj
+350 0 obj <<
+/D [1176 0 R /XYZ 123.806 554.407 null]
+>> endobj
+1181 0 obj <<
+/D [1176 0 R /XYZ 123.806 517.403 null]
+>> endobj
+354 0 obj <<
+/D [1176 0 R /XYZ 123.806 394.347 null]
+>> endobj
+1182 0 obj <<
+/D [1176 0 R /XYZ 357.928 355.222 null]
+>> endobj
+1175 0 obj <<
+/Font << /F25 474 0 R /F39 618 0 R /F44 651 0 R /F43 652 0 R /F48 922 0 R /F57 1180 0 R >>
+/XObject << /Im66 1160 0 R /Im67 1173 0 R /Im68 1174 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+1188 0 obj <<
+/Length 1808
+/Filter /FlateDecode
+>>
+stream
+xڅXvV+1 CI;'ݲ{dO$A@Sܪz !q6b՛j5@iշo.R*)cTL,)2_,qzS.߻uii1X7kv뻷ʌ.\~ꏕ4Rubկ{?Fib"cd"qրnҹ¦M͞)I4Qi TͲ}5ӤդR0:q&XAi7\.LlwǬt$k3 ̤IF%Ygl3%&}_Ͻ%y?3{5_=)$eZ*NR.)u>hmܵLx5]/k<FD(彺vx;Yy#lAKٟ[
+U{\">7c M2-v WBdx"I8Xv/K][j,<[=xn益{*~ o܁Y`ᥡ:%ڴ`/07x?6"É*H/t ֟5e./$O'9>k(5c۪~ ~ tk#m.ڜJƌĠ]w|%-=qs>
+n ϻ<)rJoĉvrdB)ڽHxN‰=TVxeڎsqE]l?гSmGjl>. h E "tH,n& "FY
+bf,
+<h`$DjWWR7P:U=B~n 9 ~5.79U/osM{ ` &0hd.]Ws
+79Tg<ݼXN⅃x;
+s7,"ʇd&}>"
+mNl
+endstream
+endobj
+1187 0 obj <<
+/Type /Page
+/Contents 1188 0 R
+/Resources 1186 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1168 0 R
+/Annots [ 1185 0 R ]
+>> endobj
+1183 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 288
+/Height 326
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 16843
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 288/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xy\_r "*g"GhyWjL+M3KZZ#4*jgG' q,ȽuYvX>>tv=y|fP(
+rZ6ns
+[l]CA&EhSrIn{hL̒:4SD"
+<z~7Oqޓ>% IeXZC4D*Jb^ ύQSJC
+[SJthrJڿRZ;SwdQ~^G^멅蓔x*Oq>Zk9wc>mh P]teW]}י<42SG/=YH?'EI~ɘw[XiG  ժGM"CӁm{uyuXwl\٤73 v{Ahp"T=j D&o0zAlR `x.<kr;Uhg\ i3݆J}_PEzQN]8usc1bJJ$ZnwT̏[24d-pSh]YAo]߿LB~ݴKZKhK`tw~V+.ᲭeN-6Vd$46Z_a'6{FP&6P~[nJs
+T-HB<3h">p<0%)7ϼxJCu|M;vdkڇے=ߴ'anO
+1vlx
+0s{rNzc
+I&X%c{
+PTܔKvIT.]
+G٘Z0;x];LBoۉs*np[o@o.rmt|$T40k{Rx툷\rtӃht931 P<hz]gB$mq-+s!i%GQ/EeV˷}Ӽp==͢4kWiϨ-ޕ7|'zW6 C)K喥BO1ϻ5-~GRʽ9EPLNE;&@3Cy*o_
+k&5c'L
+3rKvAc{K~bV3"G+;bc|sLvt7 (/lV)`
+RUI*/cRR2."2UDR֌D è!WKK4RFC=
+.2FQN!zҔJPђ'(g{IT'J7mV)TRZRJKKiz0 *6 AefΪɁgsNu+O
+94r·[Ѳ`Ю795M1W1vϭDĐTCoTʝYq)=EƵHZYV !
+E
+iOSO3T. r=
+ !!ҡ}iii͛7ם)
+ jҸq+&'')"eLJ.k
+
+ :Yuڎk|e-KxP?r%Rfy-Z+tE];AyAI&o߾iӦ3g?LS.JTe,شE'jt.fe˖;vҥK(k׮.W_
+ ?v޽u6mx{{dJA۩SMk]VF&I[+>t˗//Z(((("RPo&Mk׮ZcLRc%Ɋ+ؾG;!RD $]@-XJjʀ>U̷Ko'V+)a aA p:9m1RR-I1GWWs"D')d
+@˖>-*.V(52lύ7%7rIT*նm(JNNv`MaÆ)RZZ:}-ZgΜGJPL8y={<{زeKƍcbbie˖7nܸqXXLӮ]7|Ν1S`ffnY:,CVyܧ
+ ׭[_-ðf͚{Ν;ĉxzj6%믿^رcfJLLtf8S]͛7oڴi…ϟDZM6쌖W*._\n8>W\Yren߾=j~{Ȑ!
+
+
+lᐚqqqSNiSN)hIOO<xpZ9n0SzuѼ<;۲eˠAbccIMM >|:
+ n|=i)YxSoߞc{*j4MZj۶m+W4iUqnȑ}YiiR6l5j;0j`R^^^6m
+;wnqqR4MgggcƌYh[36)
+ LHHݻ7tРA
+
+1!fzEUΆV|D^9).`+WfɊ+ؒ\"̳Y^9‰.8¼*WN `,LE< ԳY^Us]p
+a.ӫj` X:׬+HV<<UBQFf; _g0&<P#t!w>c4_VϸZj^A1FpRjdG޻`tlߎƍs' \h8K.iL¤8
+l܈-qe"C=c1B%шCcGA bLw&[QdQ_4Xm&̬},b'atL/A)+0y2<<0(+M ?GZ"g"o͙ 3P f:.<ʇT}!;
+
+
+_:k1`㛸6Dnv)imDI
+ EXt`J34ۏGa\Y~ۅ]f/k.<ʭ7TYI${|kl6K`N-XC9ŭIiPO :Q09弌)7<£ܨQx \x5
+# }w^YWxHGP8>T( 6k,((ȨuF*R ?`准-o?7c|oSv(~
+nŽ7nP%
+jW>%]qUiaJRMQT5
+
+$C ($]E?ͧ<xر'1֥ 
+! b
+U,b P?c|ovH
+IW2! RdA0@!*Ƙ@9BU
+ׂԎDCU¡mJ%
+
+yӣb61oC/<-8yӧcx{O0{rOW
++m9Tė_o >"c2
+{>]E ;(\xTP̜9ۇ}|8}@vP `lQ>))i͛6mZp׬8}@vX`qqqSNiSNo><<<,,W^G qtcqpP
+>|0***66vƍjjР-j<ym1>N[(J*>h6{-vu޼yk׮}aZ9L?v]"J2n ](\ڲe 'RB:yD 㶐U3B1
+d$tjN\+`~*!JCU99'N 5G"#&./?cb`o
+
+Zk"7lTnm-[VTT_:t hSjŽ(8&qlPmDIRwww{ԪN?@p,.<
+
+R5n8&co k"7 0N9}Bf͐gBUjT
+yٗ> ;wbo k"7ix 4eJ}6$]£<0dH%T"aM?"G£<jڷJH
+IW1LFD7qW/ktR;9WX/ tS?x2WhP>T;7CMp $]芈
+:zc&.u8
+>.
+ej{C }Ng£Ç_J*2<,Fo
+DA8ӭMϞ=v޽vZ// qhBi-$\s0BxըڵkGGG[{$£bxɒ%K,DHtF*e$BL]! ] D/HQ]4fͮ'^D
+
+"T=5(.C`$.1 f|:;w~
+"8}j/^<~x-|.qpݻ(..^|ܹs,DA
+`Ŋ\IBA 8`
+uu̘1cƌQ(cƌY|A
+endstream
+endobj
+1184 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 233
+/Height 271
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 12646
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 233/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xwX,ҖtA@i5-Qc$o13b1h1""cA$yݬ̺~{Μ{{/_
+(Ї.ܜId0R3m$6aτh `WcC6Ԗ9ώw
+
+z:!((E#-vR(}eA}Ny,_Tr_>`;VO
+#!]
+=r!Q
+
+wDN9!#`yEQѯ&)(G\~A>͘0-WWWW7Wi|0Ţq. Pob;7ׯ_Lell}vl{yyɓutttzdddKK
+.++h9E"EaƍIII[l)**
+
+
+{͛WXqԩsv/SRR={xxxXXX$%%q[JNNްaCJJ.޹s cX~CzzW^-5 fbb" eeerʉF,00000pȑϟ?/--
+__ߐ
+B\ppqも㏦&ℸIMMuuu={ڵmjj
+uٲed2yРA ipaܸqǎ[nZ OBhw̙-L4i̘1ܟHo=-Ffіcbb?x!ɓ_zܬ
+\>S)RN™|xT
+566߿/Ɏ#GBD>Kرc'O D3gsNllW7olnn>ydfffjjdw@677'O?4sL===El66M*kx
+'@N*XNL;Dyyy:thss<x 5Ɉ"u)yd(`9QE=2cǎ
+2`
+|޹R[NrU.DUQ>hrq#&v9
+Br1|I= @H)|>!Si9S,Bc?xZb6_kx!KzbS9"صsh Z#RD|TPP{-nF|>Ui9S,ߕkx J'
+Pi_Q!9&@r$L;zgϞ-bttth4F'Z
+ښ8"~X,VTTT||<D
+ +**>c\"*++]\\<y"h9
+@9R
+BTG޹R[Nr+f6 {lhaaqm9 #Y(
+|D[Nr U.DUQ>h;zqs\)GN ̕s(BJ+Eiq]+EId8<h\u&rܨ=2soڴ$<b/^lmm=lذk׮ɣ%\hsQQr
+;z+++
+
+֬Yb[reooСCOo!ZfsG6!j]tww_~>R۷g͚ 9*))INNf2FFF}?~…i
+]}Ѩw6JRޏ؃)+JQ̕"50W0Y0Wp0yиMDQ{dhkk;z͛7;;; 3p@uww-WUUE&-,,7hР?SNEJ6iӦMO>%Z޽{YYY/_^~=r
+&$ 2kkkA4EJ
+]cyR J1 QU`BTU3euм[*Rc52ߙ( >Gg[wF=ZJ3Q$rx}玀r.DU QUT&v_Ιxɓ'Ȗ
+@99QmjjZV++d}}}άP'O^fM^^ިQ
+@42ҥ[4GG뎎&ŋf@JsKDQT
+ݒ2/ǖ=>(7v=t_ͺwYEEMqqyUk
+P=߶滛_]Ir^Jѡ0߼]0dW-Wh:::-b2ǏG\x5_2xy% ^j?#ԴpBGGGooW!!9{
+
+e̮zA
+Nwd 
+]j/J^z}{Q:| !SkW5DH;{Zc}
+
+dv"[n}^H챫wqVlƍ X,6G}:w\foo9 LMMg̘\XXc??:
+
+D R#D @U.DU QU`BTU.DU QU`BTMنGGl9da@ JΛ-˻~@AQu D:
+?
+endstream
+endobj
+1185 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [112.906 381.513 119.629 392.605]
+/A << /S /GoTo /D (Hfootnote.21) >>
+>> endobj
+1189 0 obj <<
+/D [1187 0 R /XYZ 80.963 747.976 null]
+>> endobj
+358 0 obj <<
+/D [1187 0 R /XYZ 81.963 712.73 null]
+>> endobj
+1190 0 obj <<
+/D [1187 0 R /XYZ 81.963 679.583 null]
+>> endobj
+362 0 obj <<
+/D [1187 0 R /XYZ 81.963 486.661 null]
+>> endobj
+1191 0 obj <<
+/D [1187 0 R /XYZ 271.253 449.657 null]
+>> endobj
+1192 0 obj <<
+/D [1187 0 R /XYZ 99.891 146.852 null]
+>> endobj
+1186 0 obj <<
+/Font << /F25 474 0 R /F39 618 0 R /F44 651 0 R /F43 652 0 R /F48 922 0 R /F57 1180 0 R /F36 596 0 R /F45 668 0 R >>
+/XObject << /Im69 1183 0 R /Im70 1184 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+1201 0 obj <<
+/Length 1749
+/Filter /FlateDecode
+>>
+stream
+xڭWIwF WHg2ͱ8SiI8BIu} )ʡz!| :٫J,up
+6$HM"lE)L|LI0G\\~tEe2P0F0>d6xX+
+.2[cy~,e|a9n뚼=Ѵ[?ht9!`Fܨƭ4/ۮ-9 U^\v0DᤊX]BR&c-&ࡻ\raD
+:ئ|W̖ ,7y=9)C0) ip%GTDT4A4>|y."8sWzẎv]Kun)ԫ @d]hâ)p#xXP4r5W;fmw5^iLs0g\U`1LpuT
+OcHd[[f
+/5hN$4?l<wO೮^@Q<DbzW+h<w뼌J1Ze"qGq*V
+X7b]>C5"cpпO
+endstream
+endobj
+1200 0 obj <<
+/Type /Page
+/Contents 1201 0 R
+/Resources 1199 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1168 0 R
+/Group 688 0 R
+>> endobj
+1193 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 273
+/Height 156
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 8607
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 273/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xyXևO> ""\!AAET(E%hܒh܂Ch4Q*AFqA>@aYez}.~}NWuMU5"
+maXC~9mP3̍SSW^H
+# סPQ,Bkm/*_
+:"btrA,R|lV^Ws&LZ,*{.{iAc?}:Q(0Ϩ,6
+ng*k>9<
+WaW@dH9Wz11э,?JƑn e
+|dmČȘꇢui#`sqGP(@ޡc[#5r> $u"BG
+BMxoV
+Nc}}]:4ߨgzEpXHJptQ%4*9ْ;`([,p<Dmy\{h`{ &w+v&}X:$>9yb
+hQ!
+`4C%A|f`<4^GGIY
+D{wnUyi&e;i_I^]s<Wh/!'p;><iRBI`Q
+4ϫvM^s󠙦>yc̊Kʢ@}\~MllgsxN^GORNو
+V\!B2c6<#1[_BKOb
+t
+6l$G$˹2[SHT\9)nD;DOޭ:ZƓ8^ɓi( ĪUKuJ`+T@Mϟ[*.
+ylhPt&y[! +/'8O_uAY }+UY,m xQ#p}o]yh cjN[Ou6oͥh@}uP*ZJrO J@e2K}
+$%n] mPrWAKiv+W}ԉfY
+JgV@u
+>hTre*y^fCQLM(ISC؄tP
+sCS\=S[V`*] =a]lPmY1macumVv!4ʦKSa0/}Q;=]e\qD 1 C"sC`0f 1 ڠ|C߄'aX JP3Z ƂXЄmUWmm`Z3@W/SO]n 1{wKo8Qܐ2i
+70|F
+C+#<i0p-r\}(yVO" 
+x+bc~y]IyXcώk'
+/Ay/e|wϭqє_`
+U҈LzM۷#*Wx<''Ν;2 6iŊaQ
+q8''N:uСCN 'ZÇg(XPPmoo߱cѣG?~`NNNhhpŊ6l0i
+l-믺б,~4Q)))>ߩSGR'''__߅ vЁ@ 8z:>|0''kZnz`Lɉ3OP(8q;wիW~h>#^؀
+ƾe\8`/M9`+
+x\vNbI֒gLiiӍ^S$qRSq>>KqA"G&6t3-o3Aq۴d.#?fgɠQ U,Xar03gb>/?s 8jV)7ey!0 6<IߐOVЬh6'Lfe5!
+<d.i0> eڻ CbNs13qz
+ bփY`Abb.]zDyʕŋ'\N?߳gϺurss7mڴf͚={;99ٳ'11Q)߿n:WW3*,[>^z?~W^;{,a779sܺu<tБ#G֭[ WZ
+ bփgJJJȏB&%%YYY <ott9s^{5
+m3 8`0agnܸ/
+L"vލz͹thgϞ3fIgΜ٣GAedd0zwx9$;wؼy3s)J\
+
+
+V^9Xȉ6lؿO<b)5ׯ'1g߾}gΜY~}zzܹsy<9//履~ڱc_}F;v04L͓'O\ʕ+@(2|ڵkrss.\9
+Jb(hcc3bĈ;v͟?Jo&LG.D
+ݻ{=}ͼJ}& ""bʔ)Ofx>n
+O?_5_Z,xСgg1cՕ2ڼysϞ=7nܨ+;4n8DBO0AP1k׮1@YFFFuuuii[&M NIIINNNMMay48PPPPeiiDÇ{T[[.]00!!A,{P'NXxC
+8СCə666]ve(
+~wY`M\.C Nr GSp޼y_|E׮]n¨+W,_aƍƶuo[ HC>ӻwSN:ur?-#ZgbڵkM%e˖-[J
+`W]2z
+endstream
+endobj
+1194 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 641
+/Height 201
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 1205 0 R
+/Length 18873
+/Filter /FlateDecode
+>>
+stream
+xXǍXMIRnLDso1
+(`$5Qb$;ҋ,^sw,˲,,>sswfvg^Ę.~| ]1000000'3
+0000000'D6I׻fSx
+RCYc$PtWGK|'<4؅ղ, Nz aY C5Ӳ^Q/[E^xNSgu[xnb````vC#ja< ]Y C5Ӳn'peqgMJ aY C5Ӳׂ%0 Ut0;XU#z.
++[V?H_K7۪cJ$}W?VRշiի᭑q8"m9KsjxGk4tDuy^o[~skiYE׾[X6j z<W1z6ujB⦪6~Ssf^fgO^jk:<sZI-LXȫouo
+7\^-yɟ1FDH #4Rh%n$1D`Ut0/gw0:^ag
+J,+VJ,,b v _#6v
+>ȍf4Vl2֩znE|撽b}%o
++W^ᄮ^VSn<FN! iYy܋sK9F]./mstKY>gUpгU]f5EzTK^JԜS_c:Z~ Oh +Y*TwZcZ'-Vh#&qi_n]!_J@Mj{EB^j{briƯeLj*{ 3[rHMS$ ;"x5 8LP/Ep?).֫{b07N~1"/KH^Q_IF7[%ݎ%q;ѻVT5rτR=
+[
+eEui;ޮ.OpIR2ƣO-(?wyP(
+ni f^yg2v}s
+*(`11~ua^$,sʻXVY]:$ +BZ#(2S_"R[Sm+V)-mť'9)Xh5?_gM7ugjSAj'^Z[.au񢦰rG
+JJop"ܩm
+;EV! \[]\W`:ƨP%}}_sXJ wDS . /|jA+WL(ճ!pµH UV<ln:U',27[[[ǯ헾γ,n &in6ÂSL;E
+;-@=X|_nAG·;ĮI^fn[Q~}Uג$o*/-\g"Rc[
+C[Xy5 򠚋 F{XcF97onP}H;ͅiU/᫻Y{YQY5%Y;lS몭`yk^a&{fK{l͝›9IUU}sKvQT1G;8=1Ҙ;Z*a{K+\`><j"nkdP$/"nO=n).8
+7sM{}MyvG9Gũwb8ƭr\ ۍS"Cgw˾Qژs) Sec<Nc]jڢM6)]RZݡS뤍yVEWѽ \-I R]@
++J 6i\𓇖O0>J,+cVjsDl>+8;T>Q&~PXXh >f6U}KJ0y?x>WYS#HuHd`/& $mܺ
++ȳu-O7pj5i(wp VQ|'?)4<'))1F˵,p3p ?_^USpY~Һ[5v?4内KY[STY_C3ǘ/R>upR~҃Hܴ}
+SNKuoiojn755*8hw dt7rNpDoWwPm}S㒪?COX%;p=Ă) ΋ozSⲚǗY+مƛ0/F SՐ݀hwA)ӭkp"j@Uť`Kv6whʖ=k昳-;'τۥYlEW*a82ܫtN_W1jо^,"S !z-z+|-)/}A{\3Tϲ2JLUGN1SXl㸆ƪ~H=uvdpf沟4zƚw{ `=D R/g8!vR~\[z5h}]b.9?]8j%r+T-`{IW$E1%u-%\ek\3b6ۥr//u VU*y*K6/זe$PВoO\cUmGa9uk >$'v[AI:w8: 5cwVՀR/Rl3%n!5̽ةںM
+kmKviv\%WCv}*z߿Wµ"FGSj<ۊS܇ǝ2O
+aK3NA;WB,-B.c}>#bSoIE]nfWU;};RWt/f{0Fq=˿^!y)}l[tV|N4;6fBR/# }oK0e39&
+גږIB+ܼ7g.m[ENK[mCsMCKUc[k{;WHA ^9$uw̻^ٜc
+iKf'5=N,\)N=Cv9&\[[Pe:KepïFWUהdf
+_E cϾ_ݮ +
+'@99MeUe,!;%j9d-8_9eF087o/ }9&]+5؅G{lsijÛ/R%鶔4)h޼k].hӂZSJS/F0#ܓxӣSM\G{@MKRa,lYۗ$%@ͷ/g=oN7fImzs跎Yߥ5Ugc'u.vn :ɉ꘶~n엕΅׋[Kr~R?sY=ڃIYۮ'q0 X;F~ ]K`ޢ۱$.}z~\JI)+=^[bH{{[S ?K%˙~ 晳v0]s u̖1u3ڄ~Q1=0'rcZNX*ҁ[n.wֻSʯ)8kwI^kݳm渼'o'CX 3D).[۪kB={kOISm%w#a6,y$[[2:clw0OlZ*u )@ΪUm-0&ogF .@
+XXd8ܽx9<:Håԫ1~Lnn76:zb+w/mn76Gb4kQYoinv 5v'ZۖԬ- u| IXI<;kyF횺Ǧo4D?/4WknaoaķN+y6нC
+ ^KOhN~lHn?^.i+;^ ᣶7&ֻ0FYX#;F~+}z=/)ObH#Z@tſ[߀RCXGu~x|f ?Ȏ[_L)̀#wSJf;r'3m5CF\uFJHor>cw@䔫&
+FSܐ9aYHgG!vN1+KVqß8!HSv>v3mSncŚssB9FA隰".o#3F!'܂-p>ϊUсܰ#ÜCɛ9j]4wsB~2dJUlπ섯Y!t^锫ᔵ5s "hvH~\H|9N.#Wە7o97'G# Y_{VCֹ9kqsxGaq͕Jr׳br-P0{V^1vՐy61262pxvؿ9Q{X]͟Î8 oGك섯N1sx:AN+ AOֈ2nύ0DjN{a?pBP}y/[!Yj`悈0bf/auvC0#Cm
+zRCXGdN0D}ώ6aGuD3cbkY٫0btY\^!3s++f*`>;΄eYLmVnN qiXcN>V ';V+cSRchws21;X8[2]dfmff3 qz^[==v;ڐѭy)hcv=EY?;S;F78,.#ۻV(m_Xqc'}
+ԔѹXzh͵@dбO
+
+hV MgYSg
+־$2@_5+ỎnVIFf'Y6Ok MJoDWʂ@I[!y/ZQw
+vR1uvC0-kˮFYN,K.CXCJ@pVJKGk/xGseg|FS}笀x5vhIoYY+Ga`C5Ӳ^QPqKA2!<ʲRCp%t';K #-sRYtGQ
+G9-윕؝00荡Xo700z\]NvfJo$qsV\9t}n.nFv:% E:+`OP(
+B)R(
+B!Q(
+BJAP(j((
+B >}`}Ao'UIrZj%FP("X2!jcu 'qLL0VUUݺukSS}ݻwo߾-h?|!KrL &h&h&h"ߺ/IJDNN#Jb611=z(LÄ, wY G됋 "MMMFkbMDA ʄ3F 666eee4Bzzz\e`4A4A4y5)YE2E$1OD>v
+
+;w vϟk(
+z7ꐲ5$c MW--- ?ZJ}ÃuuuvI ΝP^^] zxE݄3e9hMcEZv6g5,&rw9EFP?͑ǎ,b( /+#XxёBC
+,XCZa~BO/r&r߯Nޯ>{gҰ4w6Z;le78T#F#`DhBpO5jnn644:uҢE`1Yӗ9990]YY(3f>}F#Q`Yjtڵgyhkk;̙3GD%Q3`ssskkM6^ FP(h,S:4eʔ=qDccc%QP2k,]]f
+=.; 'EK%/i' A;38gb'C[|~F
+Bk}<Hgo=<<ʂ[o.;h5 (1:Tvcޡ}d{,Frz"`D0"!XSבrz"`D0"t!Frz҂`
+BFƵ`jgFP(S`jz"Q(
+!T#ya$'`#Q(
+5Lx0'`>9aܿ&h&h& &h&h&`D0 a(
+B kF_s c(p$?h@SNBn=`D0"F#Apdx<^@@
+BkBV޻wX,\v3g<}ɓW'צMT533?~<X`('O\^^.#҃cY0L1 BVzzz+\pX}"XKm||<7xːC: BO:u`D0 <:4s玗!2~OOcc' ͛utttuu_z%555!Ϟ= r~~>"&`4At悃tuuvI9Ov)؊7nP7?׭[.Dpttx-BP#Z0~~~nnn\4.΂[---)Sx˗m\\cn޼xƍSUU,XCZa~BO/r(xBW3|~2 mg{<CFXv/ٳg+/^455՝9sFQAϟ1cɓ',{ժU۱RRRx eee126liD0"F#G:ARbbҥK%:tܼOlMMM'( eee=3 `D0"<
+<*ƣP(
+5F7}\$w<<N<KC_)OLуvgp -
+O6 C="F#`D0"F#`BP(԰/j#)XNKÓz<|4
+YpOn,b ?Y0-xw QEH<я|JtJ|RRLLpUUUn7FDG#`D0"x"u_•$uxܝF\,)EWʓ(=zaB#G:E#`D0"x#^k$ rqW&1b"$
+666eee)4á .k(
+ׂIפd~"r,)E=瓒DOD>vϟYb,9V' V\[R\8$~ohBp)[C?&o9%!XS$˓([ZZv![[[S>w_`D0"XGr>!$AC|&
+"1$
+«qG4"F##:a! =Y"ELzyJQO$
+FFFVVVO9sP(
+5BwwTp|JDIR`7ў}(]vkPct@mç*nIC6~<C`D0"F#`D0"FP(j8^ FP(
+FP(
+<BP"BP D0
+BP`
+B2(
+B!Q(JALOub`%Gh%[(i OʊP+9B+9,#ϐ3=T_|
+5|,CH7諳P
+fGP("xd!ׁ"B!`D0
+53fLNNNDD;2ϟ"'NV/X <<\A800PX3f>}fWIU\.*%l2eeӧ[XX@dlI//>`K677N:UIIiѢE<fljeep1Xŋy߼<9FPO!MMMΝ;7vX333YQSS3w\u)Cq@D֛6mi???*)J4"x˖-P &|x[[[;{3ga|tIYZ?"x-y5)ϙ3'sssaEMMMEEEх bbb`_k#Q(S`j믿 /mۤ L|) A0`[ZZf͚+_%%V.766N<yǎslll`8YI
+
+<<tД)S
+Lǐ6غ `-Up '41t"kt[<$Ph18MNwGd28'9,ɹ'㩙s;O$0*Os)) ^&/{olR!*W='E>"$9Vb
+ $~ Y=a˜HZUd$2 Ȼ|.GR'e b)Է̚%.:2g|y ,5hjgYDw.ywU pg*sÞɋDp:_8#zitc d4d /I#XYt#| .YzDÈJ ---}||~7r}K,e"; i2'[IUP1h <x
+ d!
+y!D^Hip% H,Z9}$y5<
+"5d|E5LJsxBЙ ȁ8 Oeio&By=Yt#2mwK+a%vAMtfׂa@/y411סɓ'
+y& 嫤*т{A^!} |Wn3gdO%/\
+B6mϽU >=)m_xi6yJxKH3"Fl &u1W>,RŤxC-̄L^#aD ő8 P Gŝ̙9dFC| V&O1"A:D9\ٜ!G
+
+=w]Z DLJ% _װԺ ct8@n$ZZi&/4 a
+b*Jck0:I-˙F9QB,%Kȡ5}9v=Ĉjoޫ.~Ÿ}$ r#rXID;~4w~lYyU*K!!\-_(fҼN| 3S'u!R+iv $Lǩ珒`*O'#L/)qs\/Es )p؃}>8kbp*yՇ G$ Xa=BT`F(7g?c5|'b=g9c>7rXIDDeTM{c[HF0
+Zz6T[n>wXhoo7?cb7nwY!8`w,
+E6]م;t mioݷ pAp`%`
+E36kLҝͭmXj}Xك3c%Gk(iVfzH
+(nuFP(
+5$NBP(쵿ٺ
+B!eA (77.v(tFgtZg
+5,˝i,D7:3:3
+]¯T63:P9P(D0:3:V'%%-[zğ?瞛<y֭[GR(w)(|˅9G:99[%%w o,Y@!q0DgtFS={̙3O>mdd<y$ׁ'N8zĉ׮]+DݹsƎkffFlٲ>0a"X>rʔ)4A999WVUU4iҶm۪z;Ȝ?qIG{ァed9gee}7***sssCgtΊ *ߧ^ aL&SCCY
+E9t5ktrr2(kӦM"aǽdۏ>TaR*#ߗ.]`tFh mmkg}<yR֡Vj-**JHHeΞ= x{{4۷ K/QF~ϋiWWWâG.]d`ѐKvDgh cbbG
+`PvvĉuuuE$v ӡ圙yfhyyzz3:Dgodo$h
+L_3:?AL/.^͸82`tFgtZIpzM=@Q`D0:3:]cx[#KD|ۛT(I+VV|<<lRu-A[TUF#<|뫂s&D0"<$q3{9:3:+Y,ݢWxp.!<ז
+Px;"`MS9'î{"2V̂1 V>:3:+YF+?`D0ގ
+#ZTFi{#`tFgtL'D0"FgtF!A0
+cTUUndeeosrrϟ/z
+ ./^8"3AD0"<8\x!XCCCx./`%=k9;;XYY:yO?[gMMM/)Hrz7|p6nB
+O={
+PoaXhH|z; Oː%3PJHl6 _/Y&n߾ .gwww///Rݣ?|ܹ~Mêo(?YQ? ,XC=}qΜ9#a0ԩS/~7_5d߶mۯJJJ·6m,Uᅬ?yս y֭_paҥSNȠΝ;.m('<4Y}CA "k***7n5l޼YYYy޼yC!_k׮Xgh[g͚F稨(ȯa =`0{UoNJWSS:ϝ;W˯7ԟi5ѯWD0 8_3:?U|/55/99;<<1==`D0"
+B0mkkKL̊NiPff~pp\'Px;"eɂE9Mxd*0f#Y,˽[PP"=?yR
+q`D0FgtFgY`[[/'ۏ (|~DDDrccSCC #`D0"xHg rtFgtV;EEe׮9Xw
+]ƻ~9;[Լ{"ܽ]o40utYp~1$$BYApfz]GC]d>q⺋}_Pa!wYb~~j, `Dc`` ~/p qo^x-?c~ߒS*mTjOH8' #`ZP>,&Idީ1n l4O0''`D0"B˘)΍_V9^3ۙ/9N9R ;j
+B0 UǕ3ڣ_i*W&ܶxςC_+-?t,Baܛ"ܮ?n?JUQ`e'NΙ3G__&rrrV^:iҤm۶UUUqEDDJD0
+YpOpLm~E☪~û`e'O.//"kӦM4?pL-lggG͜9&)u Ba,Q[^u>X#/9`D0"vt!mmmae.]o㩷 ,<ԁ``qYz`ɂ(Ϟ= n~~>`cc'
+8܇en޼B=]f֘,8::z
+F##8&&7NUUUx": Z6..7{xxH "B#`) 64 ~3f8y򤹹WZ%,&&&V]*..FP`D0"/'$$<3ԏ555UTT&NK(7*00B!QY(
+B!("B#Q("BP(Dpj``0~ % ߴiʫIgii/M㶟?^ϊ6A Bs̡Pɓ'Ϙ1ɉ5kֈFP`)SVVf2]%%%~!t钪*/Ɓ{ZXX
+"}}0p`L~رc{?t 6/8gddЂ!pkoo{i.MMM_|E |뭷{wѣ4z7c``&^~ڵka{644m޼F )S*2\hl-nш[nM6 i<ikA)_E:y$8ӒVCg'7c| ׭['Dprr2]۶mmmm?+?<#G^8z(yAAA:::=ܸq#aee'OҘ@ޙ3g;w^:|BP; ID0퐸A2䖭 LܹsK,% 3"""::&355u;wTW<c:>><9 |!"Q(J )))]reҥ .љ^_v {R[[[;pO )SX[[Xbԩ=.yRך{~wZkjj⋴ԓ`^zuӦM4_z%{)"BJAv`a`mmm2''gk֬QVV~Wi %@
+GJZ[[ sk/_BP(
+5:FP(
+BP(S`
+=1!`
+endstream
+endobj
+1205 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 641
+/Height 201
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 1521
+/Filter /FlateDecode
+>>
+stream
+x}hU
+Ep8tf t**)f1aUeոhsxyy}{ϽG%B@!
+
+pyQ{OxKO/{:vuo>K뢦VןƼţ"Z#oĈ[L^Go"2q{^322Oիҟc|fٲeIH~[IIIR6nܸ8~x9ydL<,ۙ
+endstream
+endobj
+1195 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 641
+/Height 199
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 1206 0 R
+/Length 22701
+/Filter /FlateDecode
+>>
+stream
+x |M%+D%EVjM(i(iZ~~FtM%ZJEB"z !jߊ$% L|=ܛy=/N̙3gm4(/Ս5x$l 2222221Fa+/Ս<@ddddddducB'%&Ԉ%v9 ֯6񑪞%####MHUeff]r%IɩQѱaē]_7CEIwu0D1WOӒU]#"8,$HtA(-/?M¹s[liȪcq
+
+ 4
+!u9p"2n[Q*3߷WOkm[a\xDH
+;e_-6&"4HǏSj·ё$7Fu07ӻl̝JO Fᖢq|<GA^AB|B|P`?;ɵ'Oxly}GBbbK%w|W $fd[7%,r!DpbB_fEI@$2ҕJ!-)BZ:%{ (_
+12=vB =
+F+=C_28]sUh=rX{ҩxZuF`͑_4KW, J !S4=pܟs.wr RijGE%~C;~#3s,,vfÇrdb^/}@kǢJmڸ'<sLNL8`;?zvv =Nr
+3B!!)HNJL8RxFE_vWhz~317`0.9zW*mY"tIMW|;Kk.WRH,i%XS%{ ǻI <y'Fff;حˤ'=|(;:"$%9 8t`ɨ
+OJMI pXsTDpjr}{gfڞ]x%%Ā]?
+]xodXPJRdɣ"Uc޲}|Ï Q_Ui~/+;">pVٖI?u2JF8es᯽(<~/ylLԤ#кlŗ}p8>{֬`?ﰠ(h<&Y Ow٣y;_wtj<9x![Qf@~8iAq~>ǼN{8u焯_@PBR2,J~4Bz񴓩I>)Iqxmɉ?@KJ8h}Ϝ>
+x 7‚|*
+v (yD >SVRZ <~?v \쇊~ǁlڢZ(MSDH
+Cʟ=/)&"
+c*8JJMJD1DSh'U3)6#C?D!3
+QL+s"9!_}߱*q؟rb|ttE#BbNtZrB\Txy&F: _ɊcTѪ Ǖ7#Ã<*
+GȐg4:;7wWsPGege&""<4BVOӒձq=ܣU'3/$`ZJ2 Y=8z~p\Txx񑪞%#{K?.2,0*, Z}kdB_x^ع?3Rb’3Nx<5 Y2!/_jpEF8$D"tmu4YFaH$DҦY7-91L"H$Rm $D"I$DzRܠAB0D"HuTS!mN+egAD"H W5` ƍ͚}|B0D" H XQT7>rvG&H$R=kqitI$D&H$D&H$L&H$S`VX[}.'17/v:0XȍĆ7KKKˮ]+ݸ~۶wuy… 'OnݺժUJJJjР͛7]O۲eKjjj-Ug^\\ϝ;WgVE~~>6.]7J%FU<ׯݻ73//oԩM4111qrrzz8Jjٲee;c%NE=2 DO3f!/+g)ֵknf:9d̂Cf.<sʕRs嗒Яڴik9r$$$ѱYfK./ǫ`ѢEa?j
+<s9^jjTσBϜ9:<<7vwwzx0A5iCCo*m$׭ymYONTTJU,|IRSK*c„ 666>!;wpQOzZ\^Z C޽;GpNNA@@
+ر%K C2i۶9sBCCA6HַԾeDM===ƅW_}RU#.>RBa
+Yݡc>#w8j^ 1*b/ǏC.1`aAZ;p6lذ5k0_Wioݺ`ӄQ #ԚAles$!XkO&]*" p'::NodHO--s'(?ծ]33%`C;vv^0fzZLJw s<GGG<=]:3f,͛7m8B+AHÆ =6`&b>ة3eرaĉ<>FM˕?]\\#KRVnpͪ`8h5!Ne>}P3g•$ CRƍ3fIַYlܙ)S`,0b|48>, K`P/3]hl<]4ulp`5CZV4y*[gooly|Lui0TYA3jp_)ZFgOة>YfacĈIE0l{Wx/o\QmT=-`pVOOOt/SS]vZJؙ\"|TGgY$@=n0S#F$5Syy|{r%a~W,Y<7lؠ`
+ci"]j !
+@wm333[[[͛ǘ%YڨoO? >~z6'{`
+o&wnժFԴ4.Zn`~GI.dІhO 1Whz\cK4Uׯ_/`V{A 1kP/22-}vl@oMK 1bGTB0+\uODcدܱB4;gTu,W5ktV𡨀 Ηd>+4aҥ"r RQ!0lvֶL㥤ɓ'O>`ݻO=sv|pv$ƍM;0Dbj׹sgױȑ#ѷqaϮNp)##GAFf
+'ٺut aZޛ5j8/Y_~fl`9z\d1a0009
+~ oʕ+%+diΜ9tڒHCh+V􌚫#LO.^I2(Rڵk$]2駟%
+lpACgϞy*nbb2{l~ &qh
+>tݻs:u}b?D"kvv%NNE#?OW.35QF'؇A1c!B˗/k
+ڸq׭[ _@D"kѶ%%eֹްᾁnܹwHܨ3ng͚Ũzgy&77WlVV
+*UZ߃,sV޾P>lժ˱߿__|}}5WWtذak֬a&1+F]D"`K˜"ĉʏcgfJxw>,S}||ݤ:tCpaa,U_wn/5onnޱcGlP$H$Bp,V|WKmltܷo(ֶ|aPgϞ nlX!l7iҤ@
+VJ(+
+/%H$T!L*I$Dzz\h:04H$4 +$H$_AD"H'H$".DH$DI$D"I$D˗D_NJ.f
+ R:
+ufhh8xmIQO:~pɓ[noeej*7nܰo׮Ɍ3\"յkfϞݾ}{dաCgffVtO6k֬QFyyy@wwwĜ4i$Bp?!B0~1@
+ali]s33%3g 7{v7\)e$)|c¸q+[n/RMgAAE>
+]eW9޽{կϧF( [n?ׯ_?_uaȐ!|BT
+f߾}k<TY&L`ccMf/SEvpN_y֞LHثW/좚mFFF+V
+ʏc-\Xŋq|9+Kmo_`18ٜ<22Ȉkp(+jo>_\b4Ȝ bcc*#i׮F!TsҥZ̯
+lðT$b0^>e#-?@r0^3~- +J ggg}(_ l 4pz- q^6֊. ߱Ű88 X݄q=剉tuuXd׮]%iӦ 5mWӍb܀s|1`!6liST8@q,"0L /ag >SN8͛v7cŋ;V\d!1h~B*{{{v Vso#<F>} [d;P":uJD㫯#\t ׮]+,# 1c
+qtA\  @
+vff&߬Kc&`̠^0hhh֋Rm9b&%%1vN`Jejj
+L&k]Zjc}sEᶶn{(Z{NNNݺucw=np&%# 8zB FT~Z|M
+^lBɲQ]sI"xÆ DU(r%F`۷ cWAC5,DT~9KVDDD;o633ݸq#s޼yV M w3<k.FmM/`v/811QׯVƮo &o
+aI&l^O6 `!ܤKJDtLLqhh1{A?RQ'كᴬ6%\ F7|h9J /,(bee|Tk׮E U@0doضmVOx D= /DW
+eO/#{Ʈ`V
+"L8bշIΝ`8 XD nj3h Z;v
+?daWq,KKtɒ%eǒDXH5be <Xlr->
+wttbw4*ݹsJڷo7zhMC88 #p^D\+J
+97N<Y`ooۣ9!D=ý{ a;r_ƍM;ŕE0R ؾz*\FFFjJJ
+`
+an:(Y_仓1-[m۶p:w̞+5GZ?v[oaX/%I֗#ٳgG Lc[%_˽a{n˦"P}8AAA ,h^>C~^`v-Z1}ʕ+og8;;8Y!Y@md:o<-k+*nsիٓϟ'DpݘI$Dz?PYJD"6=ZLaD"b$D"I$D"I$D&H$!X8bb7#vtmq .L<Miee%z1WVVz-[RxdW\kj^rgk R)99QF,=˛:uj&MLLLTžErT_J!|9iRv횛NN.9`мٳ˿uJ)@KIW3PG qttl֬ҥK*((Xh_ӭݱ63Cp[KZ,\Q|yV3gZ[[<xqs7OO&B0!Z|Vi˖w%,訨bX1iF lll#ڹs'{;jr:H[.--:th9srr ؟#G|
+9!TlgQT;YD|2SSٕo}}}3yyyk׮eddd1аu֟}=Տ=jee{= _}EV}pႎq*mgg'Y©,-|^zaÆH?hyi t|eLԿCrXɒmiժUfffY 7o"KOn~obd~XR%&)a,z聴h|p袖^0""bh-Z|xpZP.]zɶ.]:x` e K%W!RRRH7nDy֭[Jρzzz?i"lFgҌԩ[hX5%y*[ÇF 50p+4aҥ" RQ+$$}ה} ;yBaNV_%=I3&6:W670Í5;5|ƍ]/8((]/+n q%$$xyy+`0 D6113k޼y:Ɓ】wߍxsigϞξ[PPСC3f`lܻw3<R
+v={lھ};FM˕goo.̝;W!dk%%%U\jrfv-22CҲb (cK,a_$Lڶm;gΜ4v$[j_[«w`ayk)t 09s 7ǖ@bJLLDDt9Mx%!;O<)Ԛ.AlePmM|0E Z{0R7mF^|7xCర0Oj\3#4^#nnAUDZ.,D8K>/C0 [ڷop=tc/^Swx8| &" ZףpJa _3suV5SaN۱cG ^M˕b4·~kjj})D,ˤ:Tnpͪ~!.[8OSc
+Rg1{dn޼má"X9B6lз3y,>_WgرcEE!X3ĉy| + (G,^U|& O>̙3JH^ c)\ƍ$[bw,[ ̔)S0rf1Vra>g}ѥc0a(~q.y46cr:J68C0СC-+׏]<r᳷G<>L 4~v*, `寔THV3`'T~Y1b싈"|WKmltܷo(ֶ|*D08')]VZ%W\vf>3,VSG7WW,#`Tps}_^\Iد_|p@Ȓ!xÆ
+ֱ`8&٥f8`R to633_m޼yYz?7a
+noxMk`BrD + d __߰0{ʧ dUkj4˥
+]|_tVRB)`&<Lr;FlZ622:v옰Sy{{crL(gZHO$4{R))%Z3f̠A:ر
+8/z &66=Þ;srrڵk[ ]+[j5-- ֭[k"X$}=}ѣGcD,Y<!#j-l>ڬ^:77Wؒ. .DK"ennn Ş={?4CCCԋDKn߾p=%[S*%%sBlğ,UJ%W+w$ٳ1?Uu0kj{]=|(* %!!{=Mxt\Tyb ݻw-x)iO'i{n瓇`~~uA0cǜ;ܾ]>IqtӦN2! 豘uYu,4rHmGƳj5`p@hQ"kffn:].DCֲ&F$9K_~6X=*Yxz aW_Hׄuipa(y5gڲeڶm GD-Xy0T CշF%*
+þ G!XEkj&<r g<p U@^&&&h;;;v Iԩ{ 7ni4RCpݘlatěrJJ0Y3g$R5ڊ+0=S@/b
+Tv=I~D:mI:@pvvv`` <ngggjG4ԁ)/յK.掎iH$IGGGL0Acz`ZD"H$B0D"H`B0D"`D"<]?\Ppv_gٵk7oDZPo¢aÆSN~zYYYJ uRZD"/%f(Ch(e׮䒙3 ͛=XWD+4o<SS}y{{<[n>DpAAED *'$H$ӆ`6Z|Vi˖w%,訨bX1)}#ZV7o\,[5$$D$D"NMeKN%gd89`<Q8<_4Gc\aaan"(%%+Fx7n<a„̲$E g_۷ozz:KRRR18pzFeGBCC޽{]#95i!fbK  @-Z@L-zGVo'H$ҿˊ=ok_RRfm ϝ[xzA>+|O>+ vww h
+I
+6m x*0r"aϞ=kccoU|qd
+\\\}cccJ. _777Y`lDGGp9`'.B0_<bvܱcGps<ҥK###Oʧbhy`@iQal}:fOOϲ{ID"9EE bk! ̔ <|Xfg2 `q\\G}l>|W.?&Ek[#E>y$WWqpp8q"/ `{{{R>>> 7onذaGU.sssjYnܸ1CpYfƈ#H$!|WKmltܷo(ֶ|aP$cccM&*ѣ'MĖ>po޾}[C;&uIAxy$BrÇ(ƍ͛ d.\O"H`X&w/]*Ҿ^0ߘb":%Ct@JСC?c~/дw\q!:&&%a>\VoڴҒS<w\M]ʊ_S8 '|MП#x׮]|ud|-ZL2eI$1AHu`,2aݺfeJL)lo_^krǏq֭*oΜ9III'EOD ޽;|LFCpnժ@cǎ֭[k"O>=!!TmӦ C0ݳgÇégO[988 jڴidd$}vl;ɓMrEuD"+^J"v/Yǎ9;w>}ۻqtӦN2ݻl28l2c;vذaG0exvvvYYYeV ׊`3{SiԨQNNN<\(`q0I
+d.)VǨėEť%Μ {vŧ_K=}mkݴiSϞ=W4 vNOO={v 8{ܬYӧj-Z>|L2eȑ466ő4h!D"_Wۤ }Y_tH..Ȑׯ_߫WdJI#ryzb?Ҭg>~I}2b lО?رcY)Pjj*&-gΜqpp3f C0|y|,Y2yKM500Ș3g޽L"Hurl W g_lWdH@ /
+Y={$Tg0{{1U6),\|]!9ԇDDD 
+/6hPؠ ͡>--mi֬ĉϞ=+I"7uSNQig-A~;*00ѣl/!D"jdg./_ѠADu,/Dsܢ?}$D_hQ>ٛ]_ .D:tPNS;w $T{^p i,
+&[(UKʿ_.,U?(;SW t钃C6mZn=vtB0D"6!O2Eg1C"WOnusl^U?oZVyo.?"H$B0B055!D"I5`$'$G0 䂎LwCJ"`L"H$fE&H$A00Y&6Y۠Ab222222:3:}
+endstream
+endobj
+1206 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 641
+/Height 199
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 1521
+/Filter /FlateDecode
+>>
+stream
+x}hU
+Ep8tf t*F23ۡS1+ba5$=q FI~?x9{sps}#Q<
+endstream
+endobj
+1196 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 333
+/Height 149
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 1207 0 R
+/Length 11357
+/Filter /FlateDecode
+>>
+stream
+x]|T_OATP<I}
+H O!0齷M&! 
+A/3O LSQZLO,edMS$eq0(GV&YS…4!=*ҐtYh
+ A닝,\[H_Bt(lF޻W1/u(LL/l{rwurdPjJ%P˃W!2?_/E
+|o8_;]'Lx^v#.f.0 ^+ONVF2zGP͘<Eu<♈@ðuа5.}zIOI[8+>OO? TA ZZ|ț[W 1'U.V>_|EOʕ}zvwweLLʆ=t u)SYlNt_Zb}KNB]d~nMҐtDy9|_a0θW^{3S=SBS_,[㣓B‘7|2ч]=Qid|jmRnTH/љ'{>̰(il7
+@ʜE
+5Vjz%m7=<x" p\;n݂1-Be?`?m4p[{HODgY0vPP9!: Q-%.Xlⴔd\cA׮Y,yi⢁/ubB{6G v ΔL͆fHٻۅwhJtb}rb.y9<7;?ℤ8:ѣ6o64r|:1ᣘSxpVƍ,q slK/R'Ft\lf ɒz0/).4۽x71e
+R1B"K'5ڪ^s`Hw?ό>Dǭ?bB^aNV:l&NEjbuIqلWt-..*LѪ`ᡁdn࠱O'cbĵB
+"1|[7+8ܬ‚4 v#;_&.;#%?/[2bgƍ]b~nxy;{mr<4
+h5zMBj
+LF1,4"J:83]pʾBtFESǦDV~n1,Z~}˗"_:
+,ڞ#$%DzkձyY6jk&at[,T+0+;35UN&4fIQ!ҋ
+
+fQRTd:,-#M gaNC"Z *O3M{H!eĵ4]
+ЭMLѪS9H41c ҁo*1HM3I>)?w<Z<")9gY'_ Ib ɺ䤓zKITU0<&}%#,06VXmv1ё!؂U*4 ,yeEMjSؘ9(V*˸uqE~zu|NFJIqQ3XBbd̸sUeE<iڢ\\.a~@cƌPcƭ=eL&Hg0gfP;tNk+8E*&sEY1\s 337#G
+
+E0**.\A33U;qS*U
+]NT*MVY3Dk z},tU;wrX~:wzW`Nʼ˙AӹX)
+EKyB ;*VS M`~yeJcgvN\i0߽;sx|?|s;ΛXnxMk̻ ʨ=5-5]P1\ϳ
+汱:l3ggsŮ]ܑ#Jm 8+<t,/op=yPe..V)LKVWsnnGF0pY,_xո.{=79\7b-y8sAU{*fjnS(*a.cuẗ{x4,Q)ts9
+q VaD,œd@@#fA/аB1I00}0bĵ֫xonZ(n:2rGR|~
+phz`'%5D/vΝzzE-'നՕXxPNU
+Vq!t
+11|f)7VO>
+ |
+ShĆQ&%7 tm&
+E"0ǾœEB&,+T[+
+==DlG(GG[H
+kB@Pi)1'{h 0ʒUt2FܼK }.̍1ӖxCma|55h'L
+,y[ Gp(%6
+
+QHv L2[^TWgU
+(+[HLl[w?Fjq|_t4[tr4\e*4ܜBl kjuBaG4M!1-Ss LN ገ3nQlMf,爏Brc+51kZyϠ0Uc/Pl b]Lg+bHY+
+
+ m8) ks
+a:+a7BɻrvBpgt*)ee7Rt)_a3g~j欅2gh.(JJO[WWn`5ggYx _YYUu=MeD:Xd5',ڜBL)5]aaNQH䶯'(
+H\h.|9baW1欅2gh.(JJO29`gm
+EץnîFz5*aHTa$#C6M9Ea`NQ%KsefZ]n
+2.sc+[Z|t){ ]Ѯc}6gh.JJO[WWe_]a0g```Θ199c-m%Q j3btK=9y"S23b0g0sRcbӧ)׈# &n0%BD1X w9͢3i@!pۥq2S!˄h?Ag&o} /G=0z] u&R+[Ho9j07攷_6<r/C%Ya5M.]&O:eʔ;CRR(>M}` ^Rx%*U) B? odTHr6#łv%b-/G:CwJE}`g5-xIjٴCj_'kb/\[nEEE.))޽ Hk)Y:Zpr^.YuA=jb'CՌ
+)]6LοbC)V0jF]hO&xsi0+I~|=: .^9+,B M6drMɢ?8 b̯zR :sg!*I\!=i! f>an÷ǘ\xUOË^"s׮]?\௃CN***Yz&:PK:tjڃ( e87fR
+n/ܔu,Gy[{Zb޼ ޜtͿ.䂺r7\ . Gq΅vk
+yK{u%.>.gM=bs5vɯJLnLB<Gm9ǐZ}{ѣ|"j__Z
+
+6Sp|;e'
+\شZB#8TrƐ^HhZ6Iaa^υ͟'%o,C~ʁyNFg j!`DA0!.mϜ#"pyjNH.o긫e_`esGZy!=/}{ s7RO߻W܄ _&δacȎ{{ U>12K2n94lj7XїrZںB\ myCCz9+5j׫)-<:w4O~pQv)yR%1Np5 SsJ M_҂ƐZ4˝Q_SjYs\{~I;*.vGlyT{SXU"tSZhz\۲|yf&7g0g```Έ999#ssF[33I: OXNN9BGܹȑ#dfQ)d
+e17їZA q%3fҥKYY,
+1L!Ea9Pl<;nx27=9SUgDҥKދG/]t}-YbB]\&7jo+?z>1\9sFa1BL!SHQخ`~Y5+bvlLJQxU;sʕȟǚ5kYb
+BBsk`kz?5]Ґ uuu
+b:t߼y3RqQ(]c
+BB&Ϗ2(>!ER0M4K0LBݝ3G\J
+'zcvBїip)d
+Yn55\0EE#8b4~rCOi 5Y2`^\̛i[m`-)8єc^ӧ> E!)(PMf5<Ϝ=RFչsG}DJB\WW|b{ssF 13"S23b0g0scZ9^o^^^#F6l,
+1LiV;oNy{LBBWJLFҥɓ]]]LrwT*ZJBP2V?|Ly{GAK|…ݺu+**uIII,X@ZKɢSJfOͮFo( 寫%`
+KiӦ 2\S(2Y 61cn.-68}q]vpQPP:ugQ)d
+%̭cwTWӡCZVVP(-[ܡC''իW#%A)4na&1`t 3 swwtL
+sFZ;kg8_Y]3oCv ^Ï Zv0~˞#OZjU~nxO?DzttСCQɓk׮0`
+ "d`hѢ˗ # :b
+R=zڋ9޾ +sRRy]v#S
+
+¤ca4hp
+
+
+0w&L05kƏ_YYO?!DHLLÇw09ۛÏXԯ"41Ԉ{}m SFN1/"RϚ5kHĆXǎ+>g0oT[[`O>0X0hqc+ww^~e;;;?~;v*$•'b53J
+NZye0gĂvUO!yȀVqsF I>JHך1`Έ}#ssFn̨.d|d|daΈ#sFR3f̸m0)3fX s\3f̸M20P(3f&㕖J
+endstream
+endobj
+1207 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 333
+/Height 149
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 132
+/Filter /FlateDecode
+>>
+stream
+xA
+endstream
+endobj
+1197 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 333
+/Height 149
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 1208 0 R
+/Length 11275
+/Filter /FlateDecode
+>>
+stream
+x]X_4Ƃ=Ѩ䯱KXQ@ (
+
+*l H숨+D#VDѨaoo`Y 7;;ٙy3;G i+֦D@noXbmz8n|+VMO7vC:VX2iLTi֑{|o] CFksІˤ|,USW-/Y~BJH?muD#͋9hCYLe'tq%Ɛ61ɐ7aP,&Mw6ҼX6ȤZ4ߒ![S?]VvˠEu7몐,D&2i>(K2sN?xÇ+{3 WuNNtR/[uUHbmP"rq3xQ^޽o}tXDb)Q[@.qy"OI˭"E8oЮ_}8)<t4%rEAe2i5Es8qvo;wjrrGE%,12j:oE-Ȳ1
+R+*+Ci#jѥ$@&f^
+\254 `
+ 32m>ީ&3!c 99VmQ.ը[vX")jk)UR5BL~#gke5e&-q:0uϳqec<Kg1YL8p1 3E32e{{% .88aWR9 gf"2]D+I+k)qyڲWX 1 i~4QRQ6 c}޵,8v_KyE].wϡktdPUQR^10U/fƲ́ vf\Ja̱s A\< O{ȘTU[ e'+ni]z7Ȇ5bUn}9p=g3L<D8ⲳ".i0e2i->v۞ n7;1&H‰M]]#-r?Xw|ca}VT "H%./JX}s
+^<ʬ ͆|vfѥ,ߕE3숞]s6Vo9KNNnW!A\Jt{spEwYq՛ SRLUTΰ#OI|koǠi+^ᕁp]!| D8#gu8N[ݾu0ek!Ud\& <1V25O]?)$4q}вe[MM,-=?}_sk3 ]}֪qGB.tJhyc(N_+sl8\?|W`8.Fe;3[G#]9L}ɆZk䙇pڪ_xeu -)K(LWfd }3c V@f=bz|ȟlVld"oؾkmaҖcy,w,ؒgm;`sխmvfO
+Rkd,Zs
+N6"_\9"dqR*]`')[ ʭ8ʭELMg|n]gPgMxoXpʝGOn4 I~ qzr 
+yvnyy*+wY>w}4)*dah[+{?L*}֥L=]tݵ,7ZP3"a923#+~6TIyx}-ٕ7tg=M7s d;«G
+CrvW&Xdzn8ءsWH VLt
+Nw{XEe]T-%7s,_=$4ٙGg0ek!Ud\b_v-d<&u~nk~}`LLFzIMaƸtFU1l= TqyP"&җ+3lf`b~Xֶz%:5:g,bČ_}P% HY]DC|۶C۠N`;s
++kaMݎl Kv Np
+o3fѺCw]p:{x1nJ*|7,5zKap0~7e B%݃,LYҪܛ"Hu VzO\k1 7?çn KZfvl-rX5X2.w@Y9v,}|&smXZrc2r wtkWǔ2ՉQ$(NDyJU:vo桘c2#<JO9[8+*)`[65**nJCQEZp]HWTVصזДE"q9"q9Qviìb/Х;n ꠬Ъu۹kp<]t/G|9j:ܣVd/U0!!0>0lCPJj6xJVP0cw?#<Ѽu;8pwRRQ טA˼XY,Y  ʥOL/yRX繤Ylmk3-p3hYqgak[RVS@ Y ;/YꚗO
+~2ef\3^ T]!9$Y!)Ý'9tUZxDnڹnǞ5a;y Qtׅd\%}3r&9F2pWe0$nm3vjE}WԖD]D/.9h!gb
+ 5up93曬=j-9{}=<؀}rgD,l.dS5,żδv
+QqSWw%O=7WoSְ c`Qڣ&**k|=94!(sO{JwVl32.Vx5nou]UYm*\HVLuFœlʉ s$C
+vOY]r5Ҽ"u 03TLǐ̍G 8SI6(#"94%4bS) bwNlsjIc¯U>cW[M)U1\u3:cUU~;#
+N7 * ;>(="5, >8{/U B4 ຆ̴Ҟb: o|y"GwsjoXw\8 ZIh}[ NKL:!~Uu{k}N rtcHCHmP_"3|NY"Sߓsr|O^ l_:1v ϰ.n¥Mp Ve&YP]P#p60ϴW;f/4>Ր8/> nJ.CFeRnc|d03pK_ufo]uM-ckf#X6&gQ.;*LxM^fn2Gbe("Gu0O#͋""[a(_p[uCI&Q~bm V'7e| cVX"Rh!!$VQ]86+ ᩈX"i&4^[KO4'Hmk+(GƉ&C;i?y2A $%@GSn۫W2Q =1!-SdEӧdN:_p^%Y+mbbkר~O2;Paa
+K[*PYIHA=NyDT^(cX{^lВ2oQha-.EGkWʢ9'GscAt -A yf&u.(͋}@x8Y^NJuKHz0*7
+]֭GV4?tdR>M>zDFGS è4t@oޤ\KcFvhp 9p>Wʤ9 #au+8.8LsNhw޽\w4e
+"V:A0'Wޗ#?
+ p3dyuD@t\WYԍZgD%O] k FL Ȝ`%&;wd)$O#M$بUKC!CxZ~׃}!Uy+h^FU$sIх @s7{ 4K\Ҝ: LpS6
+ g A‘4iiAH_D{S"indE>;N4"{/ĵ*wqXӎ4jXC9K 'OiTyW>h&XYYH 9w Aa. TL~&~8ZhLvA}jU#J?91"LGKpp%8TI~ h.&OP%%up;$PJ
+,yXU.˗Xos
+C쯿J{Ɉ__vx=Fp;dGrǕ~B4?*A\:4tW^vMMj%@3ASzМ~4
+j#
+f( 5Ls,X011ͱ`71M4j7m4ǂii^'S9o
+8@=<7o.`lV4C$<,
+p~pOT:,./Jy36 y]i]I$6: .-)*sмlӼ4Ƞ|upݙ4?|DM~߼!hތ6{ i.[?0L!D
+(4oF`4+%T\`oڷokxwy6( y=hFvP攔;T2͛f/A1AscT%z"f l@@Lz9Ep3_v zE¬/^io`4+X`cc444ǂiiiӜER,X+yӾRLs,i~0y6Wl.sl,C#ԔzfۿEE~EGGF EbכNX4xsI7eIKKCWQQ8qbddԩSsrr$^#Ā"1MsH0i^PP@WAFFFĤm۶/_իW544S1H@Ls) ӜccyϞ=Owݘ>5s>}1 D297h^\\`ccUUU.]
+K.%}6ŀ49͹7Gsp݂^͛7 XfMHHH-֯_1)Ҁ"7Is999EtĨGFF
+/q1 i.[?OEPS%ٳg?0c@ (\4vW?]KKKpH?ꚐТE8OOOAO iNY"QӢ7oD.'&&%Zպu봴
+(4/))QWWwqqaF:slN0ǥ9 oĠ"h^^^iddĪgg0 Kpss\1S))5D}@g˗/&LxOF`&0 
+Kc, 99,̈́'N]J`ci^ΓŽO~OW1ͱ`i4q8^y*ݡ58vvoMl_VĘ^VVfgg׭[799?|ʕַo_Ls,͛7cǎ666o4q8^MЂg|Ns ߆_\,2_|o߾ JHHqFbb"3G8kcʾk)ϟWRRˣcbbb&LwΝƍwYu떞+P޽{CѣG:u
+Ӽi͛7x蘃N<G:t('N
+`Pf
+n!Ҏ;E,
+endstream
+endobj
+1208 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 333
+/Height 149
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 135
+/Filter /FlateDecode
+>>
+stream
+xA
+endstream
+endobj
+1198 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 563
+/Height 719
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 1209 0 R
+/Length 20265
+/Filter /FlateDecode
+>>
+stream
+x xսimֶدֶ߽^*"VQd'"/֪ dd2! aAAI$$@VBΛ@d̼k~<>0sr7}BP(}7. _?EP(MVyBP(}3ub=BP(}FxgVOSnZY~^n
+bq׏y?^<>f0E~a}R(^Cu_>LA~[_>:o (c[m]
+b+qicJrƄ%
+ޗWXq~pWdW!ViQ~~R(^C(?JYoҶs<Ui Gz| j=-r+P(+^۽)սǂim;WQQsTYQQ٩SH o[_IgЉk{ѝ[V%%}S׶.KZV.f<__ßly~:3Rr e>ᗼ'.4ͽ<I$|=QsH11l]-6o9{-OJ=gG顕%{|@n{ }nzk׶e4nq`w䵶(Z5Zk()ce[x?0/BiVܒ[XLXz78f)69;_n>yGqLqSXK}9?>7B</w}Q\T=٣U^sLf\81'n/Vt%p爮MDce删sFVV,
+9_ڱ<m~ȫGxM_kOnzU<}^HInomol>S8[]i1%OWVӋwZ!Ȑ†K߇/Yz=-{Uiӽic>xvw ׿~ Z/7wv _,ٞU*rتG䶽u]ۺQxwk͑pOD?Xm]q7Ϙ[WXR_y[ա-UyǞ\e}k|BҐUG]'gs6W>DXqicrY&<[r"4~Þ_(\ȯfIesĠ?{yT7}vpUh_ؓ}|q@Ϡ5*\ЄwU-Ls{e<"2ĭ =M[woK%ԕֹj]˟=\YkBf'_<UY*(u΄O|5;(ϏΨƖLWsWI~|o9n[2'"C󛪋$񂦢#G <^KGy|Q_<:o _㫒>Z~8~i>{xW&eN>>YswtGQ?(g?|M_`Ws~߿eʎ3m/MUmYܶk(toۺQm|re]xG"]q߷<$niH[%mG]EeA]~O/(qQH[O5򭰸Y޲oHEe8O y΄l9RPH֣V. cاbRO7oQ>@bMf][Ck{iyzG\oάo.?=ůNYIm2sO\s-mM͍!>A'^j8ܒ]p`F__ojM*eUhR- [(d?fRqW{Je .tzBH ͇Op*\8mscն҆ wgekz|<"C|CĿw mc謺#+FT|PqyÙ}?y15M 9<- u9M>QNo[ᦓM5U5u c:*JV_[JH@g~#!eb{QyCǎ#wlV._W|Ֆ<nRA_'$M}+fRv?+Cdy-'/),i ~zKR#A'e[seggy6~,xeK{5]ߥ7tmu*dߔ[vmBtEtn^FomMfzӨR?gL~#2G_{ K\UAQ_ ?_g6ל=j!Iӂs?)oNIyҖroHM2~`NWQgL+Lq]ɧ3~H{qAt3YG'g蒓mSV<V_wౠL_-YbO;T[vbn@GM:'gqȑeBRֲO'K|BYvUw]aGo9{j=qQǩҬ{{1~]<z?*C3M?OA&d=߷9g$U)kz^O'r>r:={@Ux:&7{7"vNDgCgq3E'Oܓş(uVWLȓ$$^~U)S2ǨhZӭe<^<ZrhlGlmm젌:ʾ(wVgFԴOܰf#g^110~Y3++NhvqgOו~8tr.
+ԫpwewe5To^1m<j[RJf]W>~)Q Uqѫ ^:_.+ߓMLeG͹k}g?z}x΂3M>3i˺61Swu3rmmHyJkniu7+\[c1uu>\P_92N'++ z[)W߅MC
+շ9bzGvI˹sեk~h|WG )?)#rW'@z =tiC(ɺ#$iNH;OחnH'J~!jW/ؖt_sBL /Nu5}5CC/yhkYtn5 mjpm_vhg߳Ǘ/l0rwioiol v:񽨄gOK램r*mt=kKx3UE9`:N6XfE#u౐#2&LaM˕):ѯwduJcAv; +'IzI"oSyG JK:TXERXqO؋\l{:,AkT6 >07X_blm>)KBLvV]Xϭ sV T\'HRTq
+vt=qaL k+ &?g’RPْJ$w-^c;:عdܘq]::WɶeޱM
+.}|`N_ro'Cpάc5RyEZqڿ&4yz`֨ܙ?]WUfuJ<۶55(JTmI/Y_pgߒ4%jo^[zuֽ
+z{>(S
+][7f]kKy taCd%5lCQq-+OTZMQs]'(G?عAW5VgQDJ_G̸3̩A_V\_: N-O%'ZJ68b/Jnl{מ:!<g3?w<Wcc9y_PǪ;>vpc;usQCR[W}g^ĩ~If+zlTeAC'w׺G =vh#R_bW;nwR8n71.ov߹/~St`Q=uw,ysݽs6nl%Ǽ-z|Sȭv0eۺ1ѕ7- KeŎS% !};hyWwQ>7Rq:獈xomklwuS{۹sƺ϶g]c:XVc)AYwz5*ĥae{㈣w]thOSc+创utZ-
+Q>ӫF煤OGѱ"O76~,Г+\`\鋴^q*ھΠ!/왱i J.rx'tn=п%'g?S,rϗneT/Y*s*uqw+-C|UY<=zWHg[N&%.IpDo)H{
+sεԜZ]^d] θxdmEj|.oQ7V?g9öq B T?XYf!x㹶֖Ɩ֪s\qvrOgNwǯ M~WǷݳB~,)%s= $M{r?o4v;ex׮ڲ\~͋:(g\`;WԗoHPZ֫0y]7uȠso4x;MtEnso_g=J]rGAȭeۺ[j7E {y˒g˜ thőSMA;Ha;>}söCooK|g9'7WvsKGfd ʻ^%;%u-}jX3Y-g %ѐkJs1qKidMk$!Yc/{Ζ6?;vbdp}*Br+gmX.e~T񦦘VE}Ti>bY3m/j>#s|p
+<#^iO6eudy[ڟilw{k*]g?ߗs3kו9vK|J kaTI[^)i*zɞyL[3_6/o)O?{ʒڃqǧn;H}iC{13c*.lЮ:#a qۙ5,+h.J9ʖ1^X}E3B'ڎ*/zMmM~lbu{\mތIz)&-lkUn}94T46:<~eXlsbeձZ?t%a_r~?S'[Nmr>Ut-ߙ&w,/ξoo܈ۃm),?͈9YwOsC_Lohd~7}?Wprɸ_YsGo~c 7 U߻Y^zjm.Cֽ?E* u jis+<giV 53,yyXJ]U_=8 $cbHfLk*}5aCN=g\ʟKWcGmY
+ ZۛZҊ }ΞzHn?o”rWgmO(+P5vW}gGez}зSL]u)\3BLJ:
+:(DCG|*v{񪊦6Yʚ=)rڱˉOemjhmohn;YV+{=R&KzrsɭEuM-IYū|1<e3UisڪO"whyc])zs5VIaGVُ]uqqǎ;'ϳh^XľɃ%.W[{M+HU(OϾŨ}U۰1亲2ZcO|<Lm(Ll?}Y;ܪ寺u|Ld45Hߥ.sO&+'O8[Ǹ}9NFN)}:2iiXeϻ}w>ƽfcWFL_=bs
+=BD\ μМcˎpYXam
+FrGhK[6`To.`?rI7t ͝~9GCk(+c+#4u#EG“~|{ƽ翧 ͞~iG3r$-MtFbY{9"ቯD\YA3l)O8qq{[МE=Hz$4bرH\lsv{9/г/O\~xjGʌpJ k|*M['ZeoYlϘf
+`=aCa=cmٳqhM<G?634n+4|}h{0T9,zIvi/98ڰ%vAǢc_e, ?6[мs$?jϚq =1hXޝ}99e\#I~g+"ٳ揺-sO[列ׂ"y+wKh~4iГ^B8,yXCO;^ݲgSQ><╸
+<9p)ϨK}F[_V:n۳>lO{0,g;8̑=i#e=}a~oϘp-;7{ڢ(KS˽3
+sO^H^qoA`LXIKez]u -+,s#yYiuV/3'Gcw$9=,LhsRڳ'Mv+)nPƆȞȑᩳ9C;ϺK|J ֫[&MU)1G"yc8=pth,{CqGy@S;9uFXoVeTX҈1,ctrץ/p?4PϝaO[is:?QYd< O[Hz\Q8wړ ?6#,…32> SyJ+uazxQ˜8;ٝVчAPWvS)~ttU>y`ȏQPPNN |(<g1`)kϞ=-L|^.Q)}rn?VznKP(V*zK(
+BѷiTi:
+BP/!&Y
+ TwX?^Lrbz] ӧ}O45y?\*ih_UZqP%1|G9ۧ\7
+__EO#Ju
+ 7ď~$n *7soƉnS!|JM%1-_.s) '?]bR%i4qkyWCL+V?ue;3_ZӜ9/
+Cԙ3Joʗ'Uw+/vR?V~A͞-~;s yjI7Qz1%Ѐz{|믋oVn!!UĉJ~!QNjU*"iy0wBzV%1
+w"\~޽W^ "NɦԏySPdz%&y:uB;D1M\ ye23QSQL]\)JUJ%]gzbڴIW9ԩWRJy?l6@jddW-p*!(-˖)QrrT"s|ʳYSWWVxx.I2~r!Ͱǣ6&M(&uϜy b'S5k4\Z?Pq%n٢t)Ɗ3tx)S%ܩN_.T:Nj~&O><SI䁖lH䗿TZ;J /(wE\y4ׅZ?"&Qd9tH-1ɋ3qQlQLr uyL%Nj=-_5xB^,UѣJSñjny,xW*휤$4cu!/
+j>U՝qJ뗞 p}94{ͼ=P1Ƀ~eňⷿU1b#,Y"6oVJ]C<Pǎ*tEFȌC5u-R y'mPZ*Q6nT:{k;Jxy.Z8̎5+ /DlBp2UCLK*j.^}OxIzN1Z%>T|g*bx=JR4Pjl ؍7*75 x*RU=dTz}LeeJ:#"pw&{6oZh-'!Tqg?~o~Wȑ[ĉM5و\-s}@}LrwMaf-kzpq7TyXcXIL
+ʨ</6>U2RڼpT1dzi1Ycw3N<%bBL 1!&ĄbBL 1
+
+nףgp`4}d6co æaJ"bBL 1!&Ąc
+q b6
+nףȘtgi_ 8qTnbBL 1!&ĄbBL 1!&
+
+nףsvqc=|2&siR`Z$Aj 1!&ĄbBL 1!&D
+5V {`xsp/} 1!&ĄbBL 1!&Ąc
+b
+
+ 1q Zx !Vq˘</W_/~S{}bBLixiz_VĄbBLI1I]wy@
+
+A4|&j69 FHiFiBI:ƜݪS!&ĄbBL 1!&Ą`=&
+偞á{bBL 1!.&
+aQy 51}"Jz1ĄbBL(ĴdE[}sbBL 1tc
+
+f
+*5>udތIZIk4߼2x:2UħS{ &ĄbBL:\sx>bBL 1.&
+
+Bh_:5[L
+BX$_S(
+{V7ѩ'
+BPt/Jy
+endstream
+endobj
+1209 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 563
+/Height 719
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 849
+/Filter /FlateDecode
+>>
+stream
+xA 0
+endstream
+endobj
+1202 0 obj <<
+/D [1200 0 R /XYZ 122.806 747.976 null]
+>> endobj
+366 0 obj <<
+/D [1200 0 R /XYZ 123.806 712.73 null]
+>> endobj
+1203 0 obj <<
+/D [1200 0 R /XYZ 123.806 679.583 null]
+>> endobj
+370 0 obj <<
+/D [1200 0 R /XYZ 123.806 583.626 null]
+>> endobj
+1204 0 obj <<
+/D [1200 0 R /XYZ 123.806 382.83 null]
+>> endobj
+1199 0 obj <<
+/Font << /F25 474 0 R /F39 618 0 R /F44 651 0 R /F43 652 0 R /F48 922 0 R >>
+/XObject << /Im71 1193 0 R /Im72 1194 0 R /Im73 1195 0 R /Im74 1196 0 R /Im75 1197 0 R /Im76 1198 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+1213 0 obj <<
+/Length 1443
+/Filter /FlateDecode
+>>
+stream
+xmVK6 WVzҊ"-iĝ2m+.E_i51 H
+N;,9͸]{6e24I]۞Ύ͚&^y菻ԌD:+x)KZˌu|SƗ)=-ۜYOK&q`'<eY]5I7,^䙨d^-tPlKY`w|EzsGHIUQ DCd«6"RAJVMK?j8 L֔A?~ Ao( h~-a
+ ^G|h{uc<]!^1G3o*PcR[O|?Mۃ^WZMf7l-Gtt3g$Px?Nq#Y
+޼8٪ȹ,g $q I"E8>=)EhC] Z@c7]Z6ԥ5
+>ڙ\ uF2ȼ̍&Pa!EWZGbqdzu~
+}T:c~COĊ
+΢s>Dy޽e8J
+}
+endstream
+endobj
+1212 0 obj <<
+/Type /Page
+/Contents 1213 0 R
+/Resources 1211 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1168 0 R
+>> endobj
+1210 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 301
+/Height 546
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 39574
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 301/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xwxUۇ^M$z{54E"*R^A@*$Hm{ғd }q̙S)Aj5ppp eY
+);;̙ N/(-[}fvNd!
+
+lEvO[ijUlf9Ȕ]lT£ŒBSV9Ȕ^`
+]zDx$N8
+
+P獻 1
+M剤2
+jAhOL/(
+ }1@۬W*>CQaXz@ {7 ?Q(0,
+Y]uEa3OgEy`)
+ h.XO>u<j`|kK秤ið0}X0T5ge&G
+B
+9s
+ uAAqbєͭKN{ǟvnj{jøDzssB!.^+(ijUʝ{DM;׸{w:;V݂[OƗ0 (w8q@soa;n+!!kH*5T(+B< "pA jG{/2! WDiQIGV
+:
+>*Ac
+%^hЦ{n2I~s!}O 
+p14Z]-<1|ԉjd)GLy^ᱟm7'|
+ÍHIߧ}
+
+G1WMʛpi Æ 6dȐSFH4uԘj Ϡo\<8bjew-#7o_B$Yƌ#8 !G-wP(ܺu-y*9g̘\Q>xtz8rpN4mZRW/u/88jC]
+
++G|/Y";{5
+CE;*'<?R\*
+r)Čb&=WGkld
+sӆs
+C3f\23l ``ىQnዶ!ܤXT']%WsVP=
+P FX`IH҈ y满nwë
+H,S` bl〩3hxM N0pL=u[|M@E
+c
+@
+Ty/6Bl9ēX0+IR)HВ #z`Bz
+` X+V@-,͐8e^7϶ ߆J?AG
+`
+0o̭Ct= 0H^1y`J7<1
+P+X#4C
+a@dmY~]f7
+`AP'I<a>1&h-}^
+^cos5 $
+͖y#mt4
+uff(*cw'uXTFU}
+° "Eh88 DqIrgQ>R1J`B!bFPU4&-GHEEF<]gxXcA'b7ޙ(aP5eCBL=._dyB)ZNE q'
+ٕKdKw`͜uBCbnȩ9NMC:B#\l|n.?L( iʀһ
+/
+ZU&5Nq}zp.,F$^as8n峂D
+U!s-W3sGvSɕ^_
+>8~9>>2Zh21=gxӠS[{RKcP3u]Ӱ~Z{8
+ٳg{zz"һwoդ k<wܭGYNl)"Lw*8\R[ɵފ?[?
+77S7 rN\/N
+9Q7owZ$Yƌ#HjNtÑBp֭N4qh߇b|g&YΘ1WMZrp<K4=<c^=I}%~˺R5r9/Q_41i{cE?_ qڴW^]˘0;/s߿5N:B4 ؼ?%;,6~Ϋ۶:d{KۻPNYMe/j_ၓoOL 7m^^^֭O8qĉ#G9r͛OՇ4;p{?~~Rxʙ\K nW4"?{}@hX}a??c'^I K=:pxIq:6׮][d
+|ɰauo?z7uɃux۸juIlҼT_fPg<W1HXBK1w8s/ }<֣~?׫_}{W?ɭ.NRB||R1Mͻw}V%K.]d!
+B׷w8_* =?|}+#W\v)ҭ"L
+z+RX˽̻%AcعoOf-}XRS-*s?5tK翝&]+C
+8.
+譬owVe+{bg=;*}KfölsCF7M
+5'$1)JU~wT*DÂH9k!YT
+t|ݩYsuW[͵}/Q3oVj&n5J6\><!(Y$v-#GyV2d*C1N,[et2`GGz+/3Jk5\*}uw]]vֲht6`nByƒtҹe˖D޲e̙3tw&쿔~(x)  Xn^psp<Kp!qp
+s*M(/G+*]w
+Nͪ
+s
+J?<x '4y~G(T( RgU,ӏ&h""~%KgJט PȧݑmwIW: r/ID@Nͪ
+s?ɯNb P>s:ƛ
+s,^(Gsr*I2l/?&`Nu!նڲI=Qa<>sJBuĽy'X4쥌BUNǐ`AFZH#
+WןzmTE H-
+}ĴURsi"cѐb)L7Qo/ƙ<
+}e==
+MoCHVx>@ؼhXRS}ʋ.t
+RT
+ {dcZq:j?ؘxɭWVt
+ }Zq<Ͷ׏.˳ƥ:ex}o0wP_uuQίv j=N싒
+
+;WxAHt=|}Hp;scCBBCw"h-,qL>#|`lKYNDW`wI4EEW/ӳrW6-3mƝqLRfN?B7|WRS)\uCW?r*
+
+<U`hCA'& JE#*Ŀ?X^ЄN]p]/(}"M?!.b"ũ!;2FYCJ2U7F-*|0*=ش@)p~+b
+
+_}65FM?}1j*==mOlo~{ o]1S Ȋe-:2P& `C*Y^;Wxr!Nmhlk^1ќ.;g^vglܲu03ԨAG::HrQ 
+ D"ܰ[ƑC
+iz7^W <&VIK57%JDh&^.;ML
+ČhFvq
+ TpAH!ڡLNql)^xUuw4u| +s
+7IoοR}6/z {(DO8x`*7f7eRh s"0OQW'u]3gffY"lyTl|})G
+2!D&# FA}(ʵѧ:CG/ ]Ko8 0"uz!u3u|ycwp\BꨖL3:'&^rZh/d@$kg-y,MZ0hݾ웵ÚDnᒝgC cG"S/OnQ
+8n<tcQ'c
+Co8grN[A;dJ&E JeǁatV?_8f7`rt(
++K.#|RR=+*Dc
+
+xG8pVm=Z ?oV)9DmIac0mpX.|s D%g*lns
+緧?SztQՠY ^El!BRՙX_/EMJ6'=.)T\
+^r:_
+`= kUq~ȕh3U!KSћ\=)?ޞr r
+yܾuK&s̩'Ǧ Q{9{if3*tQVM!Vh5l৖<;QT@(R77dgT?AYu|ݱBo[ΦjSӾh?OcXfli0X,˝<=kQ(-G#G
+ - aAH$RP(\\\_n4Th_v^8<ֺ/#uXTT$ˉJ_8NA$IbD"e2Rq{o/ utHzƾ]Rjw^Cǿ| őR D"ќ9srss i&$IL&83 F;;[z0&mk,n i;8xHӴuΠ]v8cݱcаtB'Z"A[!ޟ~wу{wS=[ܐלQbӾG};4L'`k%Oeߡ]OJL,F$Iʜ= دG>
+dkžylTᑧx[߾'ԡX,NOOqrr8?i#,rLDHAH@y{|#8G4PDiy+bibi
+bYj?P
+9#) hCo4h㬨5Q}_XɮmZT^nܹsܩy=iNOfPP"ڷk8"lTI옘ҋ^ȝ
+(mաVu@+eǃt@8C4z#x@8Y@:"p<Hi!)EM$F_:"p<HsO^
+ hd).vui}90ܭ) _i<(*3#:i.^C:-+T7ik\Cu#z
+%aS7el+{@e7f$rb'ѐ&b(E0I|
+M G,
+x>%Ƈ9lPhHGÏ\M).YX"Yl8Q@tI#(0HC}5u%L""@,𤟷ٴSmy[~._2j|k{4%ɵY2-*H3. JgX׎s{.SǹYU\x%6xЉeׯU9cdJlDRߥO\B Sܣ]ƿ.g-u u(3@4=.t{okJA:D !x_Qȯ h "p<ȯ ׆@ ǃt@8ZvـAB 8 yֻp"rk>:U.yЍߤ
+
+Vůhc/e G 3R`kMK 
+ox/E !xǃt@8C4x"MɄA:D !xLk9sc6m4PKs̙'N4)
+ g܈%4qIׯ>|+
++Jcn*U?I
+?{W̞=z}f5cWOg7йʉl, :=f;HxqԽrdKo {mcyD&sM|en .Q)[ yG?D}j؛WVn !r0QM 8 ң~xb_%cq7/Y&.pDR94ռ2p28KCi
+Ua:7hNN:-Dt"^ܰ}c GyɭS3VmtG99~'{O\n`WPMuP4kxkxKWTɲgw,|hLRяkxkU2y<o`rUԕpT;m
+0*{L<{"}5`E %]
+{MlqXw
+~]
+ozr (MC!G
+ 
+@
+@
+ Łj͠m
+RT
+Sp% eࠗ6<DO0M<iD&a4X8
+8LprMP@hW &X-[}v?HN[Xz><]~xehjBQ8/0aX:$Hi[U
+8Ś-'.fC hzm~!vzT :Th
+@?+AbRhV\u\6O7xƸFo9.]צ]WuSsI:Zݖ6
+nyvŠ1mI(k NT̆; ^9g/
+S #72\39 ' z͢uz!Jb9~EzH%EDm 3i\:"bmN~76i~^[p Lz$yz<;5;E1}[*Z|93_sɎ cZxّȲs&
+\QV0tLE55OcQj(*UFBV*$ pvzyrp\|U@h:IEq. ܶVO7Iƺr*
+޾H <%
+C(l: ^t>HW$kh֡IJ"!R kQTkI%dH3^Ȭ" ~1>
+F5̾ZT64q_CI?ٲ匂UKO/b7ڬ_ĤnYTlWMhJMtW3RD!Pymɸo/?}5|a竍j:<NII U:KBﶜ%rC(,ڌFcj\=o?t>qwžd`}ytk~N=[~3by7
+6jym9&(,j,|2M^[]b66n- 0K?>D(?$%fyMLd!F|C,RuP&"kr2L:D(sZ J/$ U$uPmmm\1<.EH~X!a"$?Cu!B:DH~X!vtt
+1XB)H
+endstream
+endobj
+1214 0 obj <<
+/D [1212 0 R /XYZ 80.963 747.976 null]
+>> endobj
+374 0 obj <<
+/D [1212 0 R /XYZ 81.963 712.73 null]
+>> endobj
+378 0 obj <<
+/D [1212 0 R /XYZ 81.963 471.888 null]
+>> endobj
+1215 0 obj <<
+/D [1212 0 R /XYZ 350.954 393.327 null]
+>> endobj
+1211 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F38 617 0 R /F44 651 0 R /F43 652 0 R /F48 922 0 R >>
+/XObject << /Im77 1210 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+1218 0 obj <<
+/Length 2035
+/Filter /FlateDecode
+>>
+stream
+xڭW[s۶~`}^#
+Cyhj]1t*üDEN.$X%zP,V@n/km7M:"rQXY(L7jcԪNK"<KUz<'A
+\?yVQ-6h*ϝʚ|F/蛒܍#p/v U'
+$#PWL[b FS,S 0C{.|jU`p/Af aN"8&s\#^VȭXh󄛴% )F-HKS[0_J""b}
+yEI(b|}'/}ɜ7(4
+Fg-%m,6sˮ
+)=dwT*Ӂ<Pi=E^ =1+ڠU-뻦ˇ7s2
+A(s=XUk\oQPimZ.Ă6;|
+endstream
+endobj
+1217 0 obj <<
+/Type /Page
+/Contents 1218 0 R
+/Resources 1216 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1168 0 R
+>> endobj
+1219 0 obj <<
+/D [1217 0 R /XYZ 122.806 747.976 null]
+>> endobj
+382 0 obj <<
+/D [1217 0 R /XYZ 123.806 712.73 null]
+>> endobj
+1220 0 obj <<
+/D [1217 0 R /XYZ 123.806 667.03 null]
+>> endobj
+1222 0 obj <<
+/D [1217 0 R /XYZ 123.806 546.488 null]
+>> endobj
+1223 0 obj <<
+/D [1217 0 R /XYZ 123.806 397.553 null]
+>> endobj
+1224 0 obj <<
+/D [1217 0 R /XYZ 123.806 303.464 null]
+>> endobj
+1216 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F48 922 0 R /F58 1221 0 R /F36 596 0 R /F24 476 0 R /F54 1165 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1228 0 obj <<
+/Length 2305
+/Filter /FlateDecode
+>>
+stream
+xڽXێF}WpS@!ټz7ub{<x lI)R"S]E2{`"ԩjr׳~hyo]/HY8~Zׅ;ʙ/8߾z}9_(4-77u7jPyv?];{q=eP3ԉ7rsZɍ ve{*$:z#|?",h48@ In}w|cܽfn'"H֭$o.Y/6@ȔXݶV%G<pxpEOp!R\y
+GM7*gM7o?Tګ
+eS?/is`7锋apwHW<رxZ-t k8gAOC'MctR l5BYYu^6x ʬgwCNXs
+2*DZA #A7WB 4~4fێG^<31Qpm`f]ʶ7ZbՎ pAH%j#NľfhAxfJ0@Zn˕aM/gexfEzb6iz+[7CEf{]7iuެWr⇖'ES2\[S4wJ e8vdI(u8ph@(L *F*K4"Щyd-c&e;隍ebqƄI Mf([)f 3O)WuWvd&~xVe)(Q1{M142:%&OBZE P.19tM,߮$rEL}fУP1.xGf6&MeV ='1A|LZ(b2٠y>gn(h1~k@vL!@+8qMv6۶4.ON^A"?2?kP=ָi$@>4#2ƕr,FO@-.3E"QR٦$kvu6Af:%OUJtf#!GEp_㎋`gccU7ӝ]I&IDc?ݗxi&x !R%69ӎ(IU*ѽcF [Zp b&z)_жrLH
+n7 f>;`0dNkʐE?_dsj#Os|oȘBv;Xa"#nM!Itg)N7  BCK⻲_^J\T{(Sȫ 
+m.zEGjnI=rw&+{3Se b6雓ͮFO|;N:/)e d,SQߡلLƛB.j[T<0Vi|*j>_W1p8bp#1K>}jH^TpR±FOJʏ{՜]sەTIs{RQ،gqPju
+⊐wsiJ]qS@~eϏqmgWqA 7 5W&!
+ߠ;)ooIr3`O+X/]$)b3;A
+endstream
+endobj
+1227 0 obj <<
+/Type /Page
+/Contents 1228 0 R
+/Resources 1226 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1230 0 R
+/Annots [ 1225 0 R ]
+>> endobj
+1225 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [146.823 567.055 154.239 579.954]
+/A << /S /GoTo /D (Item.14) >>
+>> endobj
+1229 0 obj <<
+/D [1227 0 R /XYZ 80.963 747.976 null]
+>> endobj
+386 0 obj <<
+/D [1227 0 R /XYZ 81.963 472.985 null]
+>> endobj
+1226 0 obj <<
+/Font << /F25 474 0 R /F48 922 0 R /F54 1165 0 R /F58 1221 0 R /F38 617 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1234 0 obj <<
+/Length 1468
+/Filter /FlateDecode
+>>
+stream
+xVIo8WQAiҸh! Ycڪi{"ev@sE-[ʝ+o烃R(%e|PW0x<RU?(L'SILGHc:di:Oߋ3O#jXHLu~qQ]ϧ#FU@Cgַu69x>:Ѝ#VW"8Ϯrߊ
+s]b e6g0ѩ
+
+~FYVy/_7Q. 6UgaDk#EP%t7ND<]'wح>,V?ը(FۓG
+fJJQ6ѝXV퀊P~Sq~ï[>dQ~=]`ǨL%1۩pZ&7\PCLxu×ٺ
+ YAhefSXvy[Wr(U6Q0Qo;^ WO!gPFU spҲUê)x TE nx=&pLuHɹ?yw{7t} :c{3.+?|ݿf ._
+\7qk+n 򓸬 E;#ԤE G4x5#6Tc_я瑈X8$. [\6eɳG!-w^ ?=H%FŚ]'˱
+\@p$rk5.YG([)dOBt:[ɕ4x]˾EТ1ݙ]Y}zn_ޒ$hra\ ,Ƞ xOvS,
+endstream
+endobj
+1233 0 obj <<
+/Type /Page
+/Contents 1234 0 R
+/Resources 1232 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1230 0 R
+>> endobj
+1231 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 322
+/Height 338
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/Length 19348
+/Filter/FlateDecode
+/DecodeParms<</Colors 3/Columns 322/BitsPerComponent 8/Predictor 10>>
+>>
+stream
+xy\ڀ$!BXME dD
+*BhZjMm׫֥ںVZO(Z +} kd;7LH<09sw7d@ ]2 @ ue <!12@tXyhÝ
+AC<vakcTr2VrQR2J$
+ )@(9@_<g
+QU]z
+
+  aӎOMN+W "##17y՜@2.Ƈ.2uu 
+P֭[nݪNYJYoEEo~ " &T "6Ғ"Px<؈R(׼5
+#Pz5 Z30ѧQ*zBd>FFB!JՌ5f{ooDbj'<ӛ=VXno:kO4XTvҀT*U3:rE7~Q5N{c+kASX N
+1kԺeFTLs#6
+
+"HQGN׳7X婯o(@*oUfV(nu~PHED=?
+~7؟ǣU:f A5L 3
+Mv
+s~+9U@b)[R
+E!F ίo> z52{_OP AQ~mfodhm60311%¶n[[ .KKccI
+@ z
+BP(R
+_OOOWw4
+H=W;){ƭf](DXژfa:;\{I4=*E_GAi
+Q@~՚5e`tY@[?zF"Qiimv)@^9GS!;>|E2;A
+Q*D*)
+e>CdekR1Hֳ^1tvI?Wh
+1(];u5 /c*B>AJPhTH)FRT
+EJ WrU^LtSbxMyΤ7JZ^[.>5i$BA; f|,4f1;E]|JAT
+CLܱ&Nk۶m;tH8Jfݾ]ngg2$[+\8a
+f)ohg0Dj_!Cb[_?z镤\
+d0fcZscdHAQƍ{Ѡz @ w͛7y<
+ݻwtsӧ߾}}ii4Znn.^T?MII)7nٽz+((/o~}P3Ȁb%$$lo޼o>5;dVTT
+
+>---U'T`gΜr
+6<}SN9;;Ϙ1Bl޼{FFF}ߦVVV߅d2Nzڵpz{ussÆ***,,,rk׮x6mRb7###W`HRlN8l?nfXdj
+BPXYYN2*mllP޽{? 
+
+toMrc
+@C #}}}'2eK 'ÝYơaϦc@)s6a Y<HtJ5!12@tX3K\P@:
+BT~D"aX VZEPfΜ曰eZZڒ%K<<<ׯfFFFHHHhh(ܼysAA
+ qnn(Y>|3SSS\=(t:'&&Ʀܹs &M255MJJ${;v,;;fk׮JGG 6D˗/򲰰OΔ"w NL~B?ۋ H/ ʢp>-a3%=[ !' a-}}65??_~Ο?9e
+үEFMM3%ȝgCSF<\P%?-y3~\z-SwYRRR۷lH8GsMOO;;;m6yQF-[ѣΝ;wb-ѣ۷oC"q NL
+$V"ieQӒ4_#^K6
+9SNƏoaazj94iRRRҪU<x }}W˗/?sQQQrrr9_>>>+44;VmHgCSrB @j ظvڶ6EdQ XƐ:1*:&3jjDǀ12@tXy`C :ef׭[';rƍl6_NNNlF)B$ɎquuŻrss*jdNWh,P=<(H.]Ν4iX,V&/_>m4y:Nj:>eʔk׮a޾}ٙd
+
+
+Μ9pEEEO&OUQ"aK \_SSC>87&4SPPp鮮$&iDDٳgo޼ݽuP=ϟ~@ ػwƍJII)..noo߲e nR$QB>1p}*Jѣ۷o.,,TbB Jnv 9s挣ŋ?NOhWWם;w._|ܸq\.w޽޽wޱ:|0
+ v_~|B 3
+
+
+>#M
+P%{)ByWdd?PRRں~[jXWW}bccAc\\+Ӆ vuu9;;/Xʕ+
+3rّ+00wߍ hR"lc>cJ$D+dd1D.Iii)^wm۶eff"..-`jcc 233Lǃo S H$-!"׈AM6mڴI-!O8A :,cDe <!12@tXΣ2&`Z&++ p"'99Grr_E
+.r㗢(UUU$R1BzM^<׭[bwء2$k/wԷ~{ѢE3f(..r:4аeammj*>OC6*lȮwX8E6E[Q ITP@q)u #E+>*
+(
+޽{ W<w\BB¤I
+K@Ip{5YuAR욚,--, X__၍quuuuu*&33s[aǒ"&.cLU^^~`V]v
+:WzHHș3g/^xq
+69E
+y`C :,cDe <!12@t(jRMY I5BD{N{dq9rZ^2&~MW^%D("D*2Dݻ;wLKKy&T49I;]M} 2zdQRY"edsss9I\2d27oތ[tG,+11a&\ddde˖?$w#&%%yzz&d>>>111֎ *J$%?kuvv`!΅liӦ;<*744glmmRja B&ЄLX?W򤤤x&-7GŃ~uHī)"@baaaIzJ ]MʣȫA"@QUZZ{0^m۶L봫 ,CjllܰaCff&<~xpp0y{mp5 $ Ce/H{=jITAAM6)z+贫 Ny`C :,cDe <!1@ގ=]m+99M(I<y\K%0<Ƭ_th:7j7nF>ZDKӘahÁ27r
+
+﷽X,V>O{{{++lR7|`M2q@79]\afΜ96mRdAyy.,m?|r@+H6! FVVիKĚ]Aڰ *TC A'@ %e <!12@tXykhlld֭qF6K2=ZyupuuŻrssgdwq /Z.FR%
+ۘ$ɥKgt9wܤI?b:*7X|iӦM2|F
+*1cƄ.ZhƌC *]\
+˘ŵk.
+''L
+
+eVZtiPPPpp0.//__;s
+詆@tXy`C :,cDe <!12@tXy`C :,cDe <!12@tXy`C :πz'O<  {
+
+
+Ʈ9;;&
+endstream
+endobj
+1235 0 obj <<
+/D [1233 0 R /XYZ 122.806 747.976 null]
+>> endobj
+390 0 obj <<
+/D [1233 0 R /XYZ 123.806 510.285 null]
+>> endobj
+1238 0 obj <<
+/D [1233 0 R /XYZ 123.806 445.075 null]
+>> endobj
+1232 0 obj <<
+/Font << /F25 474 0 R /F41 649 0 R /F59 1236 0 R /F34 1237 0 R /F38 617 0 R /F48 922 0 R /F44 651 0 R /F43 652 0 R /F60 1239 0 R >>
+/XObject << /Im78 1231 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+1242 0 obj <<
+/Length 1505
+/Filter /FlateDecode
+>>
+stream
+xڭXYoF~ׯ }CmҸM\ɬyK2`wfgu$'~3|s,WPtqե(c*еϴ5 q\h97j0p|q_C3Odw13[cFyDYz+1}Pt
+|NHfc[0N/z>BWW\-,y₂pFcuXcS}1RhOiduV|.ƴ=vF?6hPAqT'MirD
+-9FT/b}
+Qea. /2l7܃Aɢ233,+lRd9/-SPE&T{e}GπRA)(",D]}MSXghTstCi )d'c{='cZ|ov1/RE\PfEu#7r[5
+
+(# $nRV!f Ma0Mغal؁gCj2f)x>My |.<‡{&QE 8@֝Ë9+l6-YY&D>Pz1ux@u;@z[ܟeI .w/%z1L'O~ ӔŲ;^% 42BY~o\yő{
+ktk(Y[B]
+>mo`C Uj`zjQs^RhyI
+endstream
+endobj
+1241 0 obj <<
+/Type /Page
+/Contents 1242 0 R
+/Resources 1240 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1230 0 R
+>> endobj
+1243 0 obj <<
+/D [1241 0 R /XYZ 80.963 747.976 null]
+>> endobj
+394 0 obj <<
+/D [1241 0 R /XYZ 81.963 248.36 null]
+>> endobj
+1240 0 obj <<
+/Font << /F25 474 0 R /F60 1239 0 R /F38 617 0 R /F24 476 0 R /F48 922 0 R /F58 1221 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1247 0 obj <<
+/Length 1605
+/Filter /FlateDecode
+>>
+stream
+xڽ˒8 ekc,Ϲfb!(a+lov[-1jpZnݎUWgӗ" 8$bp!<JLġȊ`QXN?-^2
+e8_әY͛+B^_L`\$l>qvG1[޾&oS !Q0"u[\.&'~afSTp*@`H70%uv$:D<
+ )pDAV*XmMn*:tm6("q,MCm&nvSVwx47mCG>MXN9ӡĨ82>NQcijG\&unz
+$t’̗ZoQMPFyf[i2V}k ­CXFZ 8Xݺ
+:V1D PGy'H7
+ZY
+mlCַuLٟ܅+9(WL O!䜹 "D#@O_&'ҋH" ׻?TVdR"b$;97Y^:rKUJ{KxaW~θGH3"yX'-Ca&y0;~0 ܔS?GemGE< 8mЀN$a*\W"1XH LRH8[Mnԏ4m*K@!,G70+.zPsnȒN9'L=zR~톚ȯHKQS@׫Դr(
+hخH3 C&bo<c<Ѻ P1gI¾B8`ASla
+(OUOmbG1
+endstream
+endobj
+1246 0 obj <<
+/Type /Page
+/Contents 1247 0 R
+/Resources 1245 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1230 0 R
+/Annots [ 1244 0 R ]
+>> endobj
+1244 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [503.606 499.864 510.33 513.38]
+/A << /S /GoTo /D (Hfootnote.22) >>
+>> endobj
+1248 0 obj <<
+/D [1246 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1249 0 obj <<
+/D [1246 0 R /XYZ 141.734 122.313 null]
+>> endobj
+1245 0 obj <<
+/Font << /F25 474 0 R /F48 922 0 R /F24 476 0 R /F54 1165 0 R /F36 596 0 R /F45 668 0 R /F43 652 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1252 0 obj <<
+/Length 1621
+/Filter /FlateDecode
+>>
+stream
+xڵYr6}WL[k';I;mLgL! o!A_Xh+/&ggΫ_Ξ~X\-e,Jh9Wޝ&~? 6ؓ:,Njg!Y|%ډ'%YQ%rZZVF$\غ LR' ,VLBbޜ3񒐹iB]NB ݟ:IחSɿLJEflur^R5m;3!
+?Ktq1?e]!)“DAe;4+|P38M&&wu}iŽ0i<#[šnZz03au8 /iJM h=XȘFJV+/ξd| x<Y97gsWN#9쯓бf*LS'S?I+Q̏nOB?^C~2F[y
+cI
+ۭ5Z,x R6I^%Xl6A" J[ Zs[G95qz2˂G)!WU
+2z
+ϬX<uGFTgd`IBD1ʅ#r4 ycN L)h$mܶcaC#-f׍wN[0 ]d
+W: aI P6 Q8,<Bf!JS?
+7^81ôCP򡶠pM[{SL- 5bT`AG1ub-.o8Rw$ZC5hpIAns5ޒlС?&o'c?G&,tAPtAv$K\u[;k{cѶBMϝ@'`}Z|cC
+aOl۟ 4@X ^mr ōxc?$E92S/ {ۧ suײf2 3|[N;m4l{'yW6^OK@ t*
+endstream
+endobj
+1251 0 obj <<
+/Type /Page
+/Contents 1252 0 R
+/Resources 1250 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1230 0 R
+>> endobj
+1253 0 obj <<
+/D [1251 0 R /XYZ 80.963 747.976 null]
+>> endobj
+398 0 obj <<
+/D [1251 0 R /XYZ 81.963 700.146 null]
+>> endobj
+1254 0 obj <<
+/D [1251 0 R /XYZ 81.963 467.02 null]
+>> endobj
+1250 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F48 922 0 R /F54 1165 0 R /F40 648 0 R /F41 649 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1257 0 obj <<
+/Length 670
+/Filter /FlateDecode
+>>
+stream
+xڭTO0_ai/C\ĉ7V
+l"Mƥⴅ~8Єxs|\B"2'L JQƱ$1JXY4C7~"0óeD86]_#/$LGgpNϽQ'بIy9"+6]iXD]y?<8(VD:W T*ǒzSp"勦D%X%#)f4qvfB
+`
+a8&V7ڴ6U?cn7{S!0l` RkͦiQd|<r \Y2N֚^+`k-+I3ðZn̾kN.{RF5;Έ ^N3 ?bYy?wYy[7σ*pSS~,7l
+endstream
+endobj
+1256 0 obj <<
+/Type /Page
+/Contents 1257 0 R
+/Resources 1255 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1230 0 R
+>> endobj
+1258 0 obj <<
+/D [1256 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1255 0 obj <<
+/Font << /F25 474 0 R /F41 649 0 R /F36 596 0 R /F48 922 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1261 0 obj <<
+/Length 1796
+/Filter /FlateDecode
+>>
+stream
+xڝ]o6*"eE6m
+daFm-RSGJV
+1"I֩*K@+2-j Dqyfj@+&0fa]D
+?ԕYU h@#ΝxR
+E)<ר*˃_ ڍ{YQuaRk[iuUhk讆`ktgz@JՁ<|И')& NDd?%6JE T+ˮ>>%+OˢUHǛ(:nqUʳW sYZi)IryeiE!K-᧹HBg(N@0b]WMIa2y
+H
+GB`!ϖ$9/hX_Uؘg}!H$Äg^Mid=Abe,Nm}C+hvPK
+v^Z/*ߖdI`3(|_H2f`KS@u j
+uKOoO[
+! q2WBUΣl ;FM6Jܩx\ ::ߝ;^$YGkiH<4C{%i@xԤ]5m!Ay_pQ"KxX-pgՈ[Q]3q٩>ƌQc׸1F~۵KZWy#hp|i^~( <! 4wjYB}'<~xD#Bv<Z
+.5E 6<̗ {%`~pU!P
+iM=J6_*vlXQ^8X9j4~R?~vv>~ɩqMW^M ӜMsu8z:8<um'B 1#?{usz tq]Ln}#9/_st2KNus
+Wjۆz:!>ϫכ6vBP>}
+pC՝W|/EtV4j=~a&q1؅ѵn`4nNtIXٗ Zيr;zny0`$ _;Qp}۔t\$Gy9D/UYmdE o(u[8!qvzIjl/-
+endstream
+endobj
+1260 0 obj <<
+/Type /Page
+/Contents 1261 0 R
+/Resources 1259 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1263 0 R
+>> endobj
+1262 0 obj <<
+/D [1260 0 R /XYZ 80.963 747.976 null]
+>> endobj
+402 0 obj <<
+/D [1260 0 R /XYZ 81.963 700.146 null]
+>> endobj
+1259 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F48 922 0 R /F36 596 0 R /F24 476 0 R /F54 1165 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1266 0 obj <<
+/Length 1466
+/Filter /FlateDecode
+>>
+stream
+xڽX[s8~W;&$M/%Nۙ[[r,;)},6$tl\Wgv_,m͟ky a<~?h^ޱxp~M3w<OOîs?ũDHgghVl7 }ϯ]꜏.kߺiYY5j3p'HZ_Z?hxvWh}Pojve6YդnX%<Ȗ;$huYt>ʗX
+",FyD8%%E
+yRD݉ g(1ɢ@ ltޱ5
+2Wsd0Yg rϿ_?_ӱ}K\z'@w("+6"&b:Zr vk´]ZEaYbyJ18cK
+&Ao(!Q0e^!"}CgB]VԤ$b)P/2Eӌ.2H 㞡YGzoN7R}S4xAD%Fb*"%sp3͗)0
+r9$B06CU& L,
+endstream
+endobj
+1265 0 obj <<
+/Type /Page
+/Contents 1266 0 R
+/Resources 1264 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1263 0 R
+>> endobj
+1267 0 obj <<
+/D [1265 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1264 0 obj <<
+/Font << /F25 474 0 R /F41 649 0 R /F48 922 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1270 0 obj <<
+/Length 4489
+/Filter /FlateDecode
+>>
+stream
+xڥ[Ks8ϯpdWKb+99V^85H$lHB V BdZ"F?8Y\|oMg'x>MOV'/gWjr<<T':]ywu}5g/f,2ulg)o+3K'b[͓7~dr1_&W|6__r}zb6qWok+vNl@Syn9ǵ^yZޞ;婰НgE}طW*W?p-j_MO^V;+xlr9goݜMN?ӯۏ[|l<v++-dn߿&t|'{%MbvO||a~nǔy;̥4c?x._]g1PPZGnߋe&^kI%̥v[T55:..ܕu4\}d^5ະ9pF _˾mwbܰv-unrǫq_g͢(|xnr=Y?Aօ\^qJ6zsb5?؄ū=Ө73-Wv|f7B s/j ]LȰtQJ
+!q4{\v he.)`z{m0U
+j]V;ZA_ҫmz,[~ٲ Ham! K,mmZ6cS#Q?3UQWdwl[.f"٥)5tͺlK .C0n3b!ja⠸#qc̃X <zj+Vrʆ)+ڇXp;\b֖P,7v!ƔMnˁ:M<!O G5=k1@c]ˆۢ1j]߇D
+˫aѰMlSpCEx0NU؎4n'{-u $(ùhz1:ऱrTj>?3)xZaҺݽ3o{V{O/psΧ/߁X.R3H\- } ,A%V' ,?-r&Y dYSha<!!
+GMK;2Aw<Y2֯S 8p|j^4NE#MFYLyؑLPKH(nAe g\ZFNE]GSx;*ԊƯ"}0$2'%J/Zm&D~v<A@CGWFG*\''"(@\Lݳu\B7k=nQ-
+jibG4Xe zYt"&S
+CѼ0s,mzaBIݸdg1oYVs6$ pkrn@T -)qT7+92)58=n1wLoiY}/MQePѠuv*D= cF.>rOω&T v
+ű^4IB7UԔfFyk4+#6^|AaNd>i JyC4 %5|(=X7ZB%")X; CYb'xq=Y'n#l D-S](Ba{"fv!$
+r[ 1 FGpK#q4w7U
+~.`ǃl_e h 8)3m3\1h"$+y2e(sq"9<m"QQ:
+2(%V(f#P]Ww^kLcX*0+
+Y={4+3ŢYJoJ$oE^&W'wӅBvzm8+@q|< ܼeV(i_Dyh.9/,甇C0Ί>mC2uGy;@@9> FƼ追P1H\8
++ZZ;.!g,/b:DYeOn|n(Ҭ)JlUI;[` X؎Yqmy|:#G/Lc'S/텣R>MEWC)LX
+x4>QF~ eVV|mQTPż_
+{mq&ؖĞ~$s|3˕
+0 L?'):}KC,n S^'Ɖ0c=CRS$~Px9sxWy}Khtк# _ymP-*Vu:>2C#,`^/MubȔl_Đv'jmzf_2*EAL/-j`aG͐)x2Qy񼵚T@>tkמ
+endstream
+endobj
+1269 0 obj <<
+/Type /Page
+/Contents 1270 0 R
+/Resources 1268 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1263 0 R
+>> endobj
+1271 0 obj <<
+/D [1269 0 R /XYZ 80.963 747.976 null]
+>> endobj
+406 0 obj <<
+/D [1269 0 R /XYZ 81.963 543.563 null]
+>> endobj
+1268 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F48 922 0 R /F62 1272 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1275 0 obj <<
+/Length 6024
+/Filter /FlateDecode
+>>
+stream
+xڭ\[s~ϯpɮ"qlOvMUn>jInLGKҽSnuU}z::=zxw3}^_\MG˳Oݳ?Wg'z9<p~yqtO>\^pwۻtw=QϬֻ^~|4߼OvϯvU9MԦѧU&Y wz;pq;Ns)qFZ~jDXj5=+ }% EV2o \
+ pѽ4 Z7嶍ɜUKV,h_l[~>;g;?RW<Cmo~%7t~q,?ڐjNܐn KB/kХVxώaMVYUmjdޘo eCl|:ƉS7¬ZkMSy0SϘ8WWKlqY+LɪӆdEVYNu\Jxr6K&!'6wn89ҹP~Oiw-0$0`uS椱$%1b+j4.7CV>6'kEѢVT7Qf(<--3$bA =%|`-z^ѲQnk:XCES:Ħy1L~@
+C+1.0.
+C`U uF
+`t$k48U
+}0PyRnh0#2v/
+L:(Y._5{@׀g7:
+#f+Q˜eFN[-}rWo I5m!(VkrVGsP@8A^IaۮReV5Z4 IrUI4e9CGBHs×n,4ԕ|s=t;9؂.of9FF;Q­෋h MkO2l[,+Ld.+ FYѦ I(v8j3s_]XV$ e&̍cF C/<z(x2GeRU
+=p'9,5'QHx6FPk:v|~;va*I`XHOhx*\(X0<}v60MYV[8!Vu<^bY`
+4 !6Qy us[?t`\=k)#qB\'W 0\⊡qaΨ.("فXd6Ѵ]\n+*kpйPtT'|֤%+PiD2RZt#L9%RmM횝sm!ݲ m~[$ܑ RcT>Pt$
+(trP\N`x
+::j+ے6<?
+JN([}9șu4@d~ְO3J+-
+^ea hX.[:uڳiAHVVL9^Jd9cX~E
+ވZ TیŎbBZu1>%ҹn'/n79r[  Yx7y17|P%Ezb/Buܖ>/lq}qq
+?1^O:s첶F;чi8>ᮕP`Y#[3 &=?BcZdzk= ތa'w=W!z5a@Ů`ؚDɕNQ
+FMz Wi,˽p4 迕@e/̊:Me m]! 7(bp؁!dE`r ]9,Cvb&3
+
+ uܤd6
+L^^eâw A* |qBͅKRbeaGS0WUgACcSg# ]ZT&eU_+Ch:p> 1oa^kDk4WK;6D5W^IUK8
+
+F1iEȤ
+IDۛkB
+Aj.r$OB
+Q}3: v3N^s;L=} Xy
+} Igcj4GRg]vүL^@EZ/q
+WģZ\rw.|*}6E8%o?|~dU79ESy9]2zm6iDd9܌ CZ%OW_
+˃LJttC\w\W#~IT@'Am1O<xX C8 Eh0Ï '0Eč#Ts$.&.wLog޾zMqAC˜Bj 0QA|0}b#2Y06@S;8cY
+S^X/}ԦJ9$>~AۛT%Oh'<H^a+STRN80.V=6g
+o9L]nGD[{#AK(DU_Z Պ:jI/b*JP,97]=Fx+ۜ fw+MKMDu t_P@*tn\睎 0i)xvYcU~S}r4ďc
+O
+ܲ[֭)51Qj^9 VGSOcr47,5/5E?9c{=Rlv2Psm\VzoE\ V$fS
+ X7fxC*FUdb-r2h֗ʝ^ =̢AĪ94^+U{F{z~NcR# K\\{ ;
+#HXg{|Իl^0C8#]E8r^JYI!$jB
+;1q q挻7Z$7Ҹc6Cg[l \}幼&+~U<Hri^]
+֏;8#Ǔ«|H`UgU@hϫjHۋKU K3}gw[\Db!s
+x È(/
+endstream
+endobj
+1274 0 obj <<
+/Type /Page
+/Contents 1275 0 R
+/Resources 1273 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1263 0 R
+>> endobj
+1276 0 obj <<
+/D [1274 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1273 0 obj <<
+/Font << /F25 474 0 R /F62 1272 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1280 0 obj <<
+/Length 1750
+/Filter /FlateDecode
+>>
+stream
+xuWKs6Wfj&dࣷ$Sw&mQDFB*v@ytž"]|xx{IuXJIE$+ź^rԫN
+~_UJ9R՚
+M A>d"#EvyY γjQ,O2-Ñ A F6ؖ /,f;TM O}VFȠgv'Qm`!A"Dᾛ : uڎDO\6Y@l#zڎpy[3 XHo0BOLv{{a(L215[3a~м[@xۏI܀
+kfGO#52:BK t K"<2TԑU C
+퍗!1};ʿO J7)c[4?/h@'`*GUD }{= #sMᐢ^C,&psv84<@e:z RZ3Vy>yPCFE ``5qO0A)M,Pw]zry(f
+rՐwMXbr8v4°p {c0\Qas@h_/j<m; r>.„vga.KRA5%P׺JJfJ<^spw*lF
+3]
+Lr
+endstream
+endobj
+1279 0 obj <<
+/Type /Page
+/Contents 1280 0 R
+/Resources 1278 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1263 0 R
+/Group 688 0 R
+>> endobj
+1277 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 577
+/Height 275
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 1283 0 R
+/Length 14866
+/Filter /FlateDecode
+>>
+stream
+xXSYZ(nD2%uTjR\(.\ ֺPQA*VS܈6ED9yss oAI  HQT^[A)ckt RYxbcda_nM  EM^F4/zԼ`i,<V"ik>e)h.APJ{ٮMXz0lʪU': rm͖ET)HAs!Vv-lpA鏙s+.bedd޹sÇwޥRX,Ofe.oBխga>woc3vK+ 3s3SScccC!C3饦Re~fe(KAs!Vv-lEA% sx]FZ[[ߟFjT8Ms>TAu+EjdR [䩓^0aHaÇG߾}2?qw[V,It/U+]bs$# A4`e㵱OTWROv+ha,(ñ4*&z`cϘ~ճg2oaKHHDYIX?^eɒ+*%6WQpϙ\Q)x8#c6)[JIڮhDv߳5b,y--LLM ,haqqq\ /v䋲Ds~
+U+$
+r!HFBw/+1_5Q+c5I{]A ]& a`kgcemif6|Pc}}}]bcc2?]?xAʒ:reB
+!ñ?5kAz.b.sjO-9ϖ2z6i8j
+:O}&[S6ѥD-5̯0cvԛQ G='gnSJ ?k?YPҶd?v5mފ^9s+NEQ ~ݵ~bYhRz]A .ZPFnȹF9؎6HOoݼy*잳?@ eIۚ\I2ɅB_o{s)ݡ#z 4Xu)%ee9v[onOAJomO-| cCS3aLN[n7fL T5`HP6 u2y7ga6]Ҳ7~o ]>YX&:@IےؙF:[{3G!1=h)|'i߿z~I}
+mAbb"Y݈榦&w qU'io5,DsIG!Dߖ*se )fosA@M>k܄UTy/yn?`ۅI>a)ÕUT9tǹE=llӮLrAgem_KIacq+x۽bٟ'|] 19)-/߸םalzc|!jsnk>vE՛4]qȿ>9e(^ }ARRpv6#̇5j`]DO>daT8oy|1{A͕QrEG-
+oR[Rs#f$FN)w]?ņӤi35nY&5i|͞:Ѕ"WUk:ESoϩ!4ء
+lz!՛
+$P-o1r:CSř#煇nk(}̢CF0"qȿj?cӆe{Ạ&''GDD_xQQQёΝ;Ãga Nt OP u(Kl,+Q-v!J쨸qɎs_{nVvΧfn2eõ_j>e36ESex =gwu~yu{O8[.^t AgodNO\O~쭗_F' %¤K/WةÙ%K2ޏ*=vm3| Z:~qLLϪU֬Y緑詯+-[EF ;'$PeIʭRsߖ͕e04'm1IS>ǭȹ[/}C M=g*rv 6&]dgĤ%RF^;?3k~y9Sǭ<m(Oe6*v[t2/P&A> uUnW¦n)(rK#SX윜²۷KJK3R7oF_z&,U'緟jA JYRr\[B
+!]jpln|ýָI.&tGEFO^weg-Z7mپOn:#sG^Tf_u ~l٦=d̒gu~⒃*[=14j\8K-2$b'Koz?skc+ha_l%({{KjTH'C*R\H!9vy`8J#<w]ڴ쀫3Xxa#~ X R ?l^;wyz\xWmvk U~ƭ-Qe¯#|D>{7[n&VٲoAm
+%mKct8K{{9F4vɱ ˮ9hfE;/- 4oǕ;/v-lZWEgo&/7
+x%]zs[oKwDU`Ԭ`)3jH?$k
+Lb--?o~{Jږ.p 9"~5kx Vݗp,i_U|/(h.APJ{{VS zK/y.;)&Bխ
+ZG@A)-m$7SA$b K(
+ ?T
+
+v1<<<55"d?>aXk׮EXXXXZZU?~<E<<<)=:88#˶dQ=RYGĤ$Jٱc˒XئM輽OӦM@!!!A/ҥK0]Ç+'''[[[Y{P:
+tQʕ+7ے:cǎEEEQK]]ݠ ŋ;t 6JW7L/#u&ǹscII 2=0_h;.K,.S;'0aBpp=x`ѿBSY΄BCC̋0DYY  tuuiŋvQyIVx}&ێ۪r]8q"N)6ŋ*SI%
+mڴ DejLAԔ k~۷&&me:v0cS>ѝ8qFUZE`̌>1Q;tщmGmU2K5kFe)utY
+H2
+jjjQS#99ңh;bEdeeU޹sH8:VRR60Ke@Yljz.u(Mp
+,OOO*0Ee*۷Xl;۪H:p' Cej[ؘ1wJKISӖ"͛@5oދJMY/Z[/:vt4jTFx1CX26FxSva]2
+P 31m[FMj4^ij
+=zP}wFmGh[LP„e:G׮SMMORNR-LtGvLSWw:c<ܩc\hFա-Iڙ>}nڵlCOx76S_%={YMjix߾f
+,
+kaXWN4.F'm `[
+̣YT-26
+۴i?4
+# .8
+4|qƂY[b[-~V.]dky Q/
+Ք k^{[,
+ja***TϧBZZڐ!CG%*̙3GhhDhD[fn Ӟ󻞚4
+# e~
+g;
+
+ysSSY)ܹ 񼻈7boĤhazzzOikk?z
+Yf*+۲G'vWsaaT!\4|+3wӧYUfǑ#THIN RW~/!-H*SɢGjA*۔"-xtv(?/Auhat d||V&''GDD_xQQQёΝ;Ãka>+]"b{؛7w+@l:vro|BS`ZRܰ
+(jmJؖe9:)@T :0rrH||bbb|||VZf??<@O}}}WXl2///r7d5dпpzSHVFСF).6vhg#}c#ß 2-H)3s3RkW._z6tؖe9:)@T ‚|VrJjjjfffnnnQQQyyyYYYAAIKKKJJv Ǩ2A YE0C +).ːzĤI'NJQ5dAPCViq1, nCT .+APZ؝eUCw -۷!޹ :S'*=BGASEEEBB]J0w!"|HHYYiţ4 Dn K.(6,^v?v~ZIq1AעwI]Jj [}nuvnڸ]8tE!}z #%%ߌ~ϋΆAA .@PX @P[A  V-q1 g1%jaA0*CAKII12 R V
+endstream
+endobj
+1283 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 577
+/Height 275
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 344
+/Filter /FlateDecode
+>>
+stream
+xA
+endstream
+endobj
+1281 0 obj <<
+/D [1279 0 R /XYZ 80.963 747.976 null]
+>> endobj
+410 0 obj <<
+/D [1279 0 R /XYZ 81.963 700.146 null]
+>> endobj
+414 0 obj <<
+/D [1279 0 R /XYZ 81.963 513.814 null]
+>> endobj
+1282 0 obj <<
+/D [1279 0 R /XYZ 291.178 471.48 null]
+>> endobj
+418 0 obj <<
+/D [1279 0 R /XYZ 81.963 276.927 null]
+>> endobj
+1278 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F38 617 0 R /F44 651 0 R /F43 652 0 R /F48 922 0 R /F58 1221 0 R /F54 1165 0 R >>
+/XObject << /Im79 1277 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+1286 0 obj <<
+/Length 1409
+/Filter /FlateDecode
+>>
+stream
+x}WK6WXH=(hE7Y-䠕YrEᐒ=qJ(ޭnoyi\9("I<yYE]lIDV͇wsenǻu{OU
+'&QVqQsX}D;`%dtrHH癀u=~_%ng2JJTR$۟XelSe`kNdug\I Kfk|NDau>SdMrߩQH֚pGm۟m[2D~Rk j
+է{7bU @T;ZB?*3u6^Х`@rf .%¡m0n/!FCWBdyhBNȷ,uI:ُxfz4V gY
+9gӷga\^ my
+\ 0.4!E%Aݾ{
+*Tc$0`hrNLzv! fjyږQ[$(z%^ @Y!awN[zL6
+ȱӍvuDk3g'dqY M/<S' ^
+endstream
+endobj
+1285 0 obj <<
+/Type /Page
+/Contents 1286 0 R
+/Resources 1284 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1263 0 R
+>> endobj
+1287 0 obj <<
+/D [1285 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1284 0 obj <<
+/Font << /F25 474 0 R /F48 922 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1293 0 obj <<
+/Length 847
+/Filter /FlateDecode
+>>
+stream
+xuUK8 W2P+zfg:EXl[\[I\Vj;M~)QxY#)@8ys>IC`Iv{MɸҒ]Kd1{Y"4ۂBT,~fҖ>ȍ~F妢\3(5 a_p.H%U~>޵]PO"dRB3 $y`"/-_O
+$s : *|5{p>RLnx6v`\Ho. 2
++$.?MVe_G=c{ c=Vu+;ٵ)ܡJӈt[l0.੊N!
+(8!;J:@A}}.S!G?&0DT%?38
+F *hS(NࡍxNncs@BqSp"E>ې/cqP/
+pGw=TaW+Os7k#` FU1%5Ch^ V=%a!m% Eo`)s9nKx] 86k#a>ðow2`c(5i g
+vtX$, -bھ+N#$O,&~W&,R>|iT*0pפ~K{V
+JaJ׫[k^>J^A-ܲ[ڲ>?6&-
+endstream
+endobj
+1292 0 obj <<
+/Type /Page
+/Contents 1293 0 R
+/Resources 1291 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1296 0 R
+/Group 688 0 R
+/Annots [ 1288 0 R 1289 0 R ]
+>> endobj
+1290 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 1197
+/Height 657
+/BitsPerComponent 8
+/ColorSpace /DeviceRGB
+/SMask 1297 0 R
+/Length 117062
+/Filter /FlateDecode
+>>
+stream
+x|G/{zwnd&眓 6l1`YdL&g09#B 4&IMNzJjiy3tWׯ::6AAAtiPhR9
+
+[j܎k{QLѠA#SG
+9Aώp6Qdq:9Рr7:uƆh^Ø
+!Cg!%x䑅$gDpЀz&/kݡ;
+>'krݏ> ˴T]]_':`U6NF
+gbhu=HQ[>: ;G`f"[t{p
+)~6m?p_ER8Dn;>s?#2 -g:t% 8_Xb©?#GOLX2@'NT2gڃ%/!C6 ేM/}{]I~SͿ+1wPG8|]ryqV
+'NѺٌlm;\oM~_hQ7dTPbȪ> Bi=!l CIVJH
+„W_OE7)rGdU5]'n}J{V z!Fu}W<gnGw8~k87
+ڳݿ@>"Ϻmn3o=۬.ӮtR:}uq
+
+)E*ڷئMo]\b
+ ,(-Z}usnKDtR5-RZn{6[\FUDƤT?:1a',C>?K6ݵ[~.^sy]v߲cv.,zQ/ZL+a߁=z=v†-&}2Yhй B{۴i˦=[f)%wC{hik4]AEA3">5}e=qKV{Ń$6!-9ǿ?x[Zv|r
+
+gӭ[$,2}+d[&D|VW<Mq,y;ŧŊy
+6zfhr+V8IX?0񓁃$exS{sA|7Bͻ-l%d,5,
+6mE~5o [⻅:vru…!,( WnE*8cd aV{V<Mq,y;8Dt/(9
+czzXQ\] vծݺ=uѽ=V3:!e֑Sm۶}VmKmA"Y夌s
+U&E}={qѨJm4`-L5!['.Pmho%UNdBt[R5ӴGh?Jm2%id[Ah^V<Mq,y;8mRژΌ<wF.[
+[%-u/CN'
+[C2xdo~x+ۖvTb|Ki9g7~3cn
+zSWӫ6kly
+S|&<Ny+J^snDE%
+ԖkT=o {swzͪ?]N6KuTSGP?bAȥouAP5uSGg_CC\J[Fq
+ $"l Ah\l򽌍o~~/GdelQza66` +ZToXa]o†^p۷-ː[)ٕbxŒ%IBB[1u9 KqEFl-,^8u%.ޛ t6;12h_8gh5wvHz&ڬ#$LH5
++x{qRj?EuFһ1bIW`Mqk/w&0u~.?7`TyNvku+B8mmS{,^y` <oBIՖ%U|{{IrN$&&f|+99eVE6noDm;<x
+8}Q.?ˈH|7Fx[J.Gdt6U&m[3棢қ
+5}&~n?uހ~g&*U-$F({\3G|rO8[~hOI{闦y'}zzN+y;wpn$7*WGdsfFf6Ev^]nݺ;NtpU^^Nom3gPhѢEcƌD\ާO'N^)Ryرgl6jЮFAw@4ÈyEjJ]k %t'6
+,6WyG*?tp8F5xȻ<"kH:DGȳτ7{w?OѣGW\dɒ+V߿?-- 6@MoשXIʦ<oUfbU;vYǩӑ=$'N4~i ۻ In<Ttr;;μWuEF$U,(:[r9)rlRj?5hn#C{xv8=1W;.S_._ѫZϸ Q*Jy1b+fPʃ+廢9ku6ۨm;aGwV0a,t9w{>l w㸸2I+׬soO |<)Jݯ\2p-Z 6]rt4-(=x:~D^[j=cLb˖- .O˗/z-\J_CCedda:uz)sJJGJ.,==&4nѣGOE{}9r?Vę
+`7l4g͚ݾ}m61L۷{kKJJ :t\x s^֔M9so%ov횰+;wjqt㪱n4C Jťm:pW@d
+x3KRocWq]><nҫxޟ9򁎅GC^Ʉ޽>b}\s/_D/yB 憆Rh4ib$''㏰P "ti`ɡg<6z4?8ءu͆٠!k;#G
+ɔ[sU|P
+zl`ZULtBi#8vӰ9=[g¦J/I)'j2"UVq =,%SnYy~9/NN҇ Z^gn'u|{vѫ
+隮#B{}٨KS x5v]!wˑ{G,|th#ޜ`kqOVJ[-><`>zib^\=Y."JV@1y)r=ooGYh ˯PTCbJ<]Ջ#[.fSNj,
+T4n/h4,}wԩcҥK,[ii/#''SJR5J%5:c))Pؘm ٽʑD[GcZeJ|
+_Db}BAL -Eq{~bz}<$H6Px7/h哀o
+=t=GVڽ[ъL&eJ_bl)ZB ;nܽ*q[Eb'): ^3^AK{
+nE_G%WfW{N`NP5.Gݽ:;0[a:cy&'Ls~z@[@E
+
+h&Ld\R/^~5^\,;z-LTĒ\~\l {OiTK/kBBث`(`m d`a+闦]x{t."1x9J[.{{Ewvv̌Cbw'ܣcS̘oo8QxZfcg<.3QDkzfȼZo:g]>6 ~]1eٙNk4R^uK _CNk3,Ts'ťD:-7
+1c!o.\F $7R-111lSfjS؃r(O?ieeea TP D+ܽ{ONY:5O(6&Uok>^澕|4Fj*FCd2eVǾ+9ć AP8 K_Ӱ٭Z6(6xi7z;s~VLz#PT}WB6w
+Б!+:,ߴi@p4099Yb 8 TW#wje \^|T_b_RO ŋɜ뽠҄Ӂ ,0Z»6XBK۽꜏\_9o<Rø-6ޒhV/YNi1hg ŝE$[^""^=gQJD"X6>_Uľkh.߸% }[=ة~?)2U~^/ZݰwaɬMt>}t;gO:t6suةUփΞyf>}ZhIرB{tڶ-[7^p}7ӆ u_n{&ϛ7Qb$mL
+0p߾}mCmnݺ {!vU?sJo߾mgFk<n%o{z4*/Gnc_{i ( vMl耊ӷ l?df7LD˹@mR嵖%ɳNgl6+ cϟYRȆv!k;6[>dY%|J>|zȑ#Y[^rEyK߳g <tЉ'X]_ jtq.~c3t@mnكwN,q"v˨i $/U7\hoQ(ڳV,|[[]jhУiFo9 9*d),We3nƪ|d(m)1, ]eSp7څogzs~{ysQxBHh6sč^= [ ]ANg4[bux[fd~wCl0/}%{6rΙ-uՓ$A}j:7]8l ؋bʷ|4{o AUz7 'ۏ\M_*L+W>:.?,KZu紧s5dmgWujsȒ.! T[bA@mcȸ7?^Zoeee{eo
+`7m ]0={յaI 1@:܏ψ0"ɳCⳀ}>^K 2S[L!cR&eg_O;J^Wq#tŐ-ZbȢ}d$6w|cb~6zw[[] h[kFd-~廢yqW0a{z+z r2w?[O λ;Lk={7\0EOrQʚUqOte;w=OCNYYYltU& 2d%uS/w!,*[x1J]﫾;..r)@_
+0sm l`@\R=*+&l/| ͩU~+
+'R#'zG z?SGSec1Mbwzͪ?]Rd, -S?bA=z=o>D]g-6Co;s.Qz̯g_$=һwg5fQgv %df=/((Xv%K-[vi| ۹X'.= pl"&>x!\VTb˔[Eb![ҋ--ZzyU(?^ K9sݣv[KI#˥xWG1 
+W_Z uBjUlͅ7gzk. 6>`!3[55dvYBfvG5sx|uq r(@ ,EJ1܊*N-4y[Jh^jzUӣct[s}F_AG
+aqi,5]r`TJ+x[JXWӫz\8:'ElBlIUZNil)  (
+c2֠(50u甧Y<.QD헬TmPܴ+ |)`fEG r7H}1uQO=z@9NA<Pv.!q۶m۷{fl`'7O\(XO+]5+Zr7âGeEK/FR˩+WQmdjU0+DG
+
+ GhllsG/5z`86  8]7
+`!  
+ lD(h6P_YLӆ's: l^\lS*:juR]V0bYiʺ|,QESuN  z8(d: ZM Ցhx'PZj7=},49i6&Xi,@KZĖ
+4t  zl`=z@ceU{sc86(6n5b2య)9k~~ccl(t6A GvI6( mtFfP`MR6A)9VR6)2AASk?
+ ԹJӉaYR1]eX,Yqnr\Sl*/tY VIHWe)8J\z̕q xG.犋tI" wNwLf%Ǘk-,@r<x5*Ѻx 5pJcg},"H^OjѦX2+%,Y,>jVR;G BA5yX'`@m9H+T+i'8vva< CQl
+,[JФ/-)$HBp$4%j9dNv;r2#%/S9IAN))\f&P,M[, |1+Fc
+Hl;-Lki4L@+̝Ux"Iej:
+~f 2+UDTWh)ՅAAM֟ 46h6PUPy/vb>rcD"WWRHJFXKN C* G*zGsqq\L$
+V=Qacl;QKN; AAPq Ԋbݟ wSѯI6\^Iq&:6Ȱ,rJĊ }r0P\vH=$ӗC~dJKyWHd 5b)C"2F]&ffˣ<BaS8EhQyXe.ϱqɀ ӦXż's! i,X\mLR%&#*q @"KWRȲ2E.@Q'yЏIJ%$xvOd=/oT.6/Tk(ssO%% a Y az~@$Ҭa:׀rUx"6+|GAAAM֣ 466QPqSugŸaЩ%2*~sJ3)o-QR/Ȗf~@\A«r@ϩTeg6b
+iiT8drirM<Kr:n8ZݯKͬ,'v [C?}x=!H-N,  zZl`%X6P-]%ki6+gY6[
+jZnqe6zrRx>?F$OR{saa|! k4lvT2}Q^M!Důtu6mUc77/$WU09>}!/)9 RP! 8 šAAM֋ 46h6k,}$< (̕EO|Ⱦ_ 7J!?(ړ
+v# ʫw\q$ m{䕡*7ZRɥÆ#IvO&X@a^r@Ic-I,kEϢk#kC7NӪwՏ otnqVL"{"4W>Fh֎BA59؈<Qm@zu)GM:C txx'C%K"VQo叿( Poz,|:P6gY}.=XF-Ta)v3#a3CuSQ;>'-2%%A 60,X o
+ݠ *?  ڰB Z(  `knKJ GlE"QRʲUq,l AAAq l$6^HZ~nqZ [ʾ }(E4x  IF䉂hՕe+)Bd{ڎ l"sg08JJT.9f'[Z^`:]p$_:]1&)Z`6Q3ܣX2,Q  ihQ_M~4G7'vтeKV-_] I۷$ޙþRM=}2ٌ˗2o\  2'QNb|^jJ~fFA^NALTjJ" ֗ 46X6P]@)X6dY,NʞgɱdVfj^j,Kf&yÚV
+lf%o7)ѨlFPk¬旲=}<Jvf2XŁl%  h/}գcΊ]8?n钸[q}ҶIv$7cSOH?w6W3o
+~Σ蜄Ԥ<92H-66iW6pX'PkUUb t8=H(+
+!))!WKY$OX;'z))t_gÂC?4O) SI6͐g$!<W,,3+os&Q3B<.w|668Xhw!  $Mhƴ9b̋ ]< 뒶lNڹ=y?9zxg^yFݰȈ訜yuȨ/Zxm`GTJd-ch>/O)yB&?4o2I332cj5ya2 bBِ0cd @aP'3]䡹,㳔9vp{'3kYl E>rZufݬ"UDNet AAF5ӼŨGhllS+uMgKul[6o11Rbct~7w)].m MDDpO<K! a@d:SUP$LTwvkUdcN
+|<O ;X5Pȏ ZaA<0AAP㶁#Sc`,5d ,-咓=8A"1}qqhA".!O'H)KJ ֆvii|ѴLju=GK4Ƞ@mꮱ,B6ܜb\E21EHgڔGCfpAAԈ:f"[mww"wFBlS8(D,@lm
+x(iJܗ:جL4+E4gV= AlFzׇ͊7;"EtE ' 4Baց6pxאC& UYT]@;.oY=v=/qeٵhk"2}kH6zYq/]P# >,ϸ_ӟkՒܙۇ&7r$7~<܊܆ .`=z8*BS§
+IJ2vPoz,|:P6~ԏ}-B`dR h,4^V
+Ff\džmAMUϛ=qQyΏԉ| $VReU^wxCzc.a0Y66vxvVo@%W,M\*)8Ź;7W~{^{k߁ً<7v,'_F`=N2iaV(LI,l 鰚P0m_s'2
+zd#IlEǽ;ég3N@QzQ@@DQQ1 D9eٜwgglkwz'-yU4_^WՍ
+
+}2czw_ih ߫QbZa`I) @++D21B dM'4>>jʹ2Pتz/6J 4}I 1\`؀69CP e@
+%2f} ,6R``GmfX껐DGX$k#jjܶ
+|@_ "㨍Cb55E ;9^SQc=kq<
+UMI׊q<.3]N+W}
+P(J3}M2̏x?t1Zb`]l6rD뒓bn
+y,D&[^r;
+
+(t"d60= DN#Mޔ0p@Ɯ,ȧEU\a]ÜOut/ +Q9[egI
+[5(2X=%K6o߾ӧOqb^b>̀l6Bz:5TWbcM(<<TA>W؄Iw39i 1QWz
+O ǧ5np@͗:"Z ;xH 1^7M` ?1}^6o/?^hW vCRn-$/
+U!HQ(Th̟d\ lђn(ߣGla`<V/AW|PLg\U1g~'>P4(dQΦYY r_R9qfʘHIO
+6}鵖YsD9it{\ ru:$h6cC Ah b(?+_,2ӳ߄
+EG(h֋{NkH7w[p+ !l`V-H9tfQ(Tjɢ˲׬Ή>p?yQҹS``GuF/ּz A"K2M MPVyKJyytp& K W m,Gǭ,'R{|ڎ5 AQ3I,W%*h/`£*T tZ"רt= t O h_h}Mal0"I@\)BEJ^*g(`]lC6DZZ':֡t-;}U6%bL& F̲?ac)@.P 4b% أIZ1UC5Y,p ;[[ɗs`Pª)w2*Ʃ
+3h ^LwTCmws]j_S*X-󰹄,E(<ſ/8%8B)Kws-sT?-` t%1t։Yɷ*Ϲ}.k@'G:Ldɯ貑dЙkĕ(
+6o߾5?~&8 |\Kjuu#-٪G!0ĈYjRhb. t?D{2D
+~ٚkGW?$d,a3=c-I{=#\L7^ }Q|``,A ,0谀Bv
+"(Ab/ DV$vX^d+T>Sy%,}X
+]Ru'g7TelѠAtq'
+=T>"(*&08fhMY{3Z><tr
+fdNG NC 49܏n
+*:qLpZ#"=; 24ÅqDaKV]Zt߽UMa|n ezZJ|Qf8EBP(T\QsgK`` ea`^B"<͗,F.STD7 .ʶ*I+^:kZLwypsnp[t FXZVIw`KBP(*~u\BIRRP DB]S+ #oC[S. "㨍 r×s؋ m6YeXRj>BDmb<t+yb^%%NZ?gWVCBI>oe Y~ y̷2ݎ'
+19BP(*p$|IjJMz@6@?‡Fou*-QLZY\^lrZBl%ӑ*{BAq>7n h0ԟBLb0HOI$=.mvVr},HVK-[]C:BP(*a`2%tka`u5e@AwbDqjDrBvF,"|)?OŖFi/#]^@(rߩS COxZWGb$sU^{#JOy|) ASW2;*OڍSY徙^n
+j86sB?0xKJ…qDZa`vaGY˯pEDLy9IJ'Azv4K&t!0#*c' &%
+ 
+BPqd@ҧ a -0MWٗ,-qc@> Q+RX(p^hR? >j4!X]M23??AJJhmB})ݹzgN5<=pxB1PfԸY8ܶmp1NQ68 vSR8mc_E*T
+BPOv%]Zn'w@n\q)(kMt̆upa`Gm'vbN~9}=+')fB(z{/
+99l;NȠK O~ TzB
+Ů*7؍.c&mzC/{ K6#Fh]MdG}5N2e8̹.7*<I(
+BKS'0H<I1+`;[o00x60\v?,b XPf 
+޲=g9ΙsF8@Lt`夲rqSdP60k4zzg~,Wy*+wsmՎLGE]y. gGZ+{^(*wMh;-.
+(
+BPO8 Gq8Џm$Aq#07$xU3l cpb`GmfU\p^t2hAX|Dii#L {Ugʵ:*3F=`]t@g-]nJkE~pB{Ƃ\*jy'>SLP(
+/ H&r@2)dT[̷.sr…QdLţ)b@nR2җBCBP(
+&^#a&}o1v{d^
+e
+ 18jc@*33[_![PȑxZ?1%CNi =BP(
+DQETf|A>99,OzF00z6V3 &b(
+BP(T0l(2j4y:x]kRl"z˪ &ܱ(
+BP(TI>pE s62NMs' 8jc5,IzϨ3ʬuf Y$±Xʋ*JXmM,XMKø^<?.su
+BPp`׵nSשEZNIv'% 8jc@o[v]P@w(.4B-[GUƷ a(Yq<R
+oY% 1D(
+BPc`u=f]&1`bb00~H3 ̤q}A98'+<YUpd#H={F03}6tr_d!6Ѿ51DN3=ݑel6VwJ7Yoƃ!fs֓zm+vsqWm$q+)2O;Y3)pdG5cWRs[
+UaQ(
+Bݺ[z2<{6\EQƅ!2+.&f3@P@ςot՟BXLɒ,ryD)Բ@QHS0`2Y4ey
+'jSmь Nqf?`@1X LcFI 8V&3cC6
+BP(TSO/t啦\m{zc^=-a>?
+O
+/Fqj޸1
+$MX%lX@Hj P$"4 Lee]P
+Bi"կ+LͷnC[k߾KK',O?muPȑ֗_A'o@ƀ'N 8jc5teQ X@RX(B h @?L<ddP$puظ5/kR],2w-d(8!dj@2ev$'=N_Q÷d98 :AV؉C,DPV˽kI@
+BPcB2:bmXky6g x+\=Q[Q/Gނ;1PF'N:O" $pfdt^#^c7m5PRHΫ3)4Hg8 HgӔ3Sv!'} A4"
+BP(6|Kq&L}_8ǀG 8jc-2lBI1=KNe
+,b񔗻zp
+m
+q*j\l
+BiOR89ӇFqjɂaĸ!ŷhAd6>0'AT[󲄝(׊&Jc\VS t:ܖ
+3g UD`
+BP&`]{ ㈉4TT
+ReWE*1^tԹ]R@
+BP(TDpkc`GmVZr(X@TXm` =BP(
+uڹ3\EQn XHQ30"P(
+BPv }{410FH3 L!IvA`"e$c(6&U^QscBP(JZV޳ۼVk2ykkJOESR=:qge32ii ιܧOOt?>z}A|@%\EQBWy
+cEQ%PP(
+B4d@/qQ$6f譭 ފr07 ̀` u-QO]ޒ%a"tt Bo 047
+BP(f,]t.`@ǀ5\`{J<},Ne ÇQdZb`%JN)gaE EN'`l>NGw ΦD& Cder"wG.41ex\AVjS[i-A{5T!P(
+BP10H+ڰaCjjjN9 ͠q0 ](Xb0xX%%⡐GIA8TW"Ŵ1UB$Fꦼ6RRappe5;8.Z58kJP(
+BPFq&%%R4HNNA1C Euw.dM" Yr -ҪT(6ɉ:<:3nZVjӅVjήYe*tܟUX
+Xc
+BP(ŅqbzP)'40؅DzEQ WZZZUUU#Pmm-dLan 9͒`,~icayr69i%I,R(
+BP(
+(2X0$o(
+BP(Js #&B DP(
+BP(F``B"I8Oog9֊=E DP(
+BPc`Gm'BP(
+B‚qbbX!W8so|"P(
+BP``GmVx0. 1BP(
+BiqDӁ~iAfE DP(
+BPc`GmVx,9,XUBd,b
+BP(
+8jcS܅Q(
+BP(GL&M4#BP(
+B1X0d([OO9BP(
+B4(2p``b
+BP(
+
+Ƌi'3%\#4a-eDbQ(
+BP(EQƃ!P(
+BP(10~(
+xp\퀵E DP(
+BPa(1X08\74;r0"P(
+BP(104SgI}Y/*&(
+BP(J{ 㨍
+"R;.W8?=.X@
+BP(
+9Fqj':d
+BPc`Gmx;,H9(
+BP(*,%QBWG3;X@
+BP(
+9FqjGN
+B4(2pa` b
+BP(
+
+ Ɖij'ȉ2=#BP(
+B‡gc`<b
+BP(
+㈉C 3֭TT58 (
+BP(Js "㨍 q}qqaE DP(
+BPc`Gm'BP(
+B‚qbZacQBB;JǂH,b
+BP(
+8jc5ގpvT"BP(
+B1aro_W/%E DP(
+BPc`GmVx@p7@
+BP(
+=i~az8*pJ=~_z"BP(
+B1X0uBP(
+B48b`>"P(
+BP(b`H+ wacxF8 c16(
+BP(2X 1pd6mmlf
+&TWa,Ɔ!BP(
+SEQrvHr
+a`I-)b% ~XmcQ(
+BPgaA`}{{&[a`FX^*tfA9rذĢP(
+Bb
+8jc=Ʋ5O3
+BY(mp
+BPXx10
+& ^W_c}l,IԠ@"scW`ƚU:0c1c1V]l,+ee`1bN#r}Y L'ݐ/%'GQ799qLֺmO<-t~.pB+k.SbcbAE6bE/c,b,bl豑W᳷~(vZg<,~V_h
+ s~˛-a}o9c OV=UW%QOvq
+ݒc0XlX1p+lr$ׇ:I f[HXɖ8ﺿ;2qɯf$XwwjrR<)d2b,byrw'pNs<JA`<i)uqL#hYbEQ-ƅ8ŷd[ze8k[ԭTy਷KߞO?hO$Z``$#g|sqkF.wy$$lx]Xfym5C0
+DHϿ1}7x
+wə?U5)+e+`n<.00fMK Gvw˲NQ9±_ol߱SnLcמOydʳPdOϳ/t`إǓ>?G?[r3C[m?_%BZ,d gBMgpp
+'`4V%b,bE>8lu'<dGWc,ōizI^^OJi% ր
+qs=>N
+U
+cPe27etxˡl+#z[Mp 2_vֱ2]4xך<> 㨍
+w c/!9
+Ć0p;_zo/fc~:?t}-[O䫖W'CB} M@g#̭;s k!tɳ:}NЦcnCw>ֹ0Nl_|C-[=k.aJAC۴m׶}~>7xacuCv߬qjպMۮ<[z0o @0!
+;Ǖ
+?[KOIBa >5f;k-@θB:K>%o4WH/:rQ )T-
+=kuۅ _ed[PLb`Gmfwi_a{e3"O~<hvߞSd7⍩<PeZ:s](W(l b`,cW34@Ф@_֜JQ`aഥebS
+cPe㝜I;^f@WuB-* &106V+ lpc@XªG[T>)?"5K ܼ1
+rE(m.Ĩ9mwЩ3m;N8B<p~M@>x@>2}kwgݙLYt0W177o)b bZ6!Ì%g):Rg\ [aF] :򴯮ʀ~d'Aa0ͯYҺg "R(@4ˁrX/sP0[VxPXk5*k}3
+ #\`¡8bfz 㨍 wxcjz6ڴ{7Yּ1PZ{89.O;ݒӦBnӖ۵Wek;C#KPp5xukCYˮTR@VZJҳ9[_ҿ`b`8bp`/q("ja b`#0;Mph3hXZp<e)wV|}BVBoΫb`J1o;yܹ+>a 61 10-]WWθ2{Ug
+1c`GmV `Cv?1 100}` f=<ټWo/ϣm@v:YmE }U?# B2e@aU'RP44@
+ "㨍ƒ!!Fe^uL@MEr6qߝhʞt'k-ye2OϧG #C_"樟1cRȏQ(Tx10NL+ ܺ0>r wzm"1 ])T.(xd7ˌ{/sʭͷaě%0fGY8gԙnK'd l1ySX}2
+ Fqjo@
+ոl`&`"ӷD*l
+$[v-\[vSQ-dl|a`C}???ǻÎLp +%ݝe(s9t` BY |lժcnCF2}^&L龏i8U`@f_?ֱUVp| x3miۮmvva |ѧ_hG>&mP(ߦc`˖-[i <O,󀈁hh^V )3^D.!ktsy~ۨ9w4t _ݯU지3` ] ̷ފ
+g?ܥedظwJ-^4@){k?hwSQZa`1fPN|mn;HlJ Mg)(@4444*MeéL6PYqxP?=NΠd. ,: ,bl.U6}I7==FqjUYRXl"Lx@TjO.5
+BԙWAAŻƱ^8oּB([O9vg ,<CP*X{ Nu6,457d89
+1BP` `Pa !=RW;^[)8*oe7LҫǺ_82̹wӌ۩?͜w1CY~h06Ÿr((^)@V4EQBT6AaplgׄhO|@o66ZGhM(2Z=~x>_ئ'%ͶZ2cK[_ (@
+BiDr[J53Og[n{*Nhߒ2Oh .s _[.{ῡgpr{Nw8Mn=Ͼ  l>}/KjoWHBNc eCD d ܭĄڼ4NUQe
+B8jc@v [}VIV6m6+
+ׄMr9eN>!(W6Wq}G`uA!P(
+_ "㨍 xf :t2'epP0Ppi \~qL? k}sM0 6p0(@@
+BPqbZa[ 6)G8diπl>uwn: ᳁ӷ_z
+1BP(T|c`GmHm r6lpoۻĜ7 x6SQ]1OO+:|sU/t{Vϡ4 \@P(
+B8jc5-drWE,d&j
+\)4t M[)UU BP(*~106V+ ys!*'dÍĿo=uy o*^SKs+_==\%ԉ@P(
+B8jcu q޳.Tdl
+BP(
+=Fqjqa DQ(
+B48b"-1pDW VE0(b
+BP(=Q\uڍ\y߳I8± DQ(
+BbZaT藞G bN~եwx*Q(
+M*ᄁ_:
+`Æ7^.]~eqF矫زu5R%\
+BAFJeq
+
+=`x_TWG%)c&`b:q¾1`<=
+F}2_ |ϟvtGb)ԊP(
+
+ϝKRd)ihZ`pX4ثW^ܹW^1@)%>m/3J>Kyh8t(!Jkp ,v YY * Gφ}]-o]%WXaSh3}z-[ a O^'\_GY/:_
+1BP!b ҺuuP!C:޽d6 +/_nBvuP:Mb&UNN55&N ֯ )<kz9Na`j{{uN֬5[>赓g)?y,MQ%$8ĖESP{jRd<#}'%sdK`ls^H<r2何
+ u5#8k&K`UUWz_UۑՅ7ZcSuw(@
+B dfpPsh\zo!PcU-v-9pڭ[NVqWP:Q2}z6QB I);xh ^I0 BV5k + z1^{mhƲ&<uIJRdUeqH$] ]1X0ps:H92&bݖm _Ζ{sQP-(@ٱȲU;b
+B"55 ,+?`~
+VgG6:{]@b:vjBlpաb Wi k\k8nP 4 4WC˕kh9怒=~"IPKiGt♫b`GmlT00<I)v2Nf[ӎ>;{:>j/q1(@
+B5m@~C:֭yy-[f z%:Cp/72[|uNKO—B! _9e/08ldҤj ,+se0M[KJ|s*O8@_djJx[oU3}dΒj56e
+*\Ϫato8`w
+c+ LQq; [ƠRSS[hV\06h>p;EW .ܹ3 5!! hjvRY~{= aZ/.v]Kaj͚:(dTO%G-;w?soHjʔj / wܡcKɓ;Եl* zV0C,ۡgRFή]K``pkk=@SJ?fg"F$)p-9gҚˇ;
+0|OlAҨ.!3Xm10.dߝyg_
+(!7)i n0~X5? K*}
+Aqq}`6C?uýg^]xj1:km{noU.33ʮU`ֳ2Z=nm#oF /ۛmh"0eoD֩<طo_(0֭[䟐
+106V+ Kċ5e=?ã
+F5khO+jŭZcg ^t߁,XM6 5f{JСC <x ?x\uC zW
+BM"j*<Hݻ+i߫(*GLn \ބ)dWO\u㶮y|q-ڽ ~qV#0Pyj^ @ȝ" S hh TX(5 O=zp\%%%<)))?
+Bϟ-M&G}WWS0W׮]'O̲M@ @x2P`
+#R|
+1
+7"|ZG&z]r%Eikrq
+|?6l`OWԕ6-❏?{iPz d6100>7 ,oyԂPO@lZZlB222OQ1r |B' &cuhΜ92 f٬:;w=E_-[
+fǎcp
+x޽{ɯkw̙m۪J^?m#}:}tBdl߾]a PEڵkW=NLLӊ
+=p6JmW蛄j*?HީVy`QQQdZa5Ky}dc=3[t.$<=hqP-V<3QLV:{/JV5 > ,27rB@!)'~?Onn.Z@p,W($9G9#lt:+B6PǏk.@(۷o̘10#FHWP vQ~"?#k@{6mڰ Z}%''ˆ
+8jc@KStuE#/~3c6mbo]nUaֻ^]: Wa6 i<ٷ=_)2xWAy
+_ TuQ(𝊢BJQQdZa All plX)10X--- >mvO>ӦMc+qݺu޽gϞ 'ɓ'ڶm[h
+Oqǎs-h >L83E
+2$XWA[/rž`[~ڵkWo߾+V`! Ζ-[z^hɒ%d vذaׯW{HE7M>-_&O
+8B
+D!P(J٫<QQdaJߥ}d=Rgc=I~u9f/N.e{s-ܟp[y;BP(~m6! 㨍9[,0_Y"& =/ΡؘLvXn0gF{Ymʚ SB DP(Hx!b 8jc+X!8
+5ᏍlOdU.ܟ|鬝;K)..;\~wRٶs%lLQ(
+%֖cfc(2X-10N,޳֦d
+ uoLd}*03~}8#wN5tnN.y`InB/fddo>~WPظM#vmP(Thb *00~H+ \ċ{60`jK-?R; p۹
+%5ɀP{4
+xBӋjf@ޮ]:zm6ۤI:vؽ{yޯ]v1yyq:wPm6 #& z[ANE V{6U*kGc:4d]퉬J D]]%/7?-UikQ-:ha¥K\c`]]… ].b<yAy3f 8z͛7+߯`ذaömQp@*,=Q.\٢j/jxY]Xfټj=
+o&L
+QD.XX0[(
+**HaP3f\/1|=ysB[2FDD;uppϏ7*84"EFFBC*++I9o@ƀ
+ܹsa9y$/dށ,ǧO a"iiiC T낽x*
+Bz8 ;n.`з>8dྤNJzYUp_vռL!s`k?xWsJZ_q,@퍙ҡ+egnf4MR)dV/
+Txd,uM_{Jn8-m+V
+
+Bz8
+SR{P68uUlࢣi -z@F >_K+]z,jU|8so+` d<C+^sTs1}c]EU 0H?, nG*rGbg°J2 p-"P(E2=Dd,+`YEDB_>f
+j^Us1.fff;2..ԩSJ5haa!P1͹q@
+ Eu oK4}P$*HS1̓UQ
+
+V@iOD֪ԛ3 G4}2YN4*1ghď|؀
+T` }ӓ0 @&:͙3̚B7eʔ;wrPȳu5&iS[[K`P+ T孭*ѣb
+hԸuVͿkd2(<\=<<m WWW^ҫ BW^LVmܸrHf aX7B]djt?1BP}8
+e?#2`eg|x.Av1I~!Qv9`r+S Aͪh %K}{b !MwX_@sֲ!+d?Q@^
+
+|5%~r^⯍ 0 ʊP@ lmm7mD
+4 l͓gΜѱj^ ` {Sn
+%o
+ 5jN>=22_( oc({co
+շz𡋋 4?w\a+VZ o>~EP~zءOfgg1R!
+Bzc}}{ 5)K2aoM_S ׇRN?i}y.=p*dVL&7fY]0E?_>BIyۛ367n[}zZ-)VRv (YuЕ]Wkog6E7MU BP(
+Bg 4"k( B:bv}9XE7a7>(-.~])s?aNy|N첇٥,95su@77X*P=[
+H谾(K> RPJP(K<C+թM-}wQ(
+B ` 4kX 4d곁(b
+BP(T?@b"aΘ>mN:FP(
+BP8
+!$ DQ(
+B &D8Sl
+BP\mEdjkU7>cbP2**'TxGߦ:*=JiԑC7Pi#ы{Sd-ma,_S iKo֜,"?uO^VP_RҨ Q(
+v1KG dC Dj2SIoh0x5{ms3h%%dԭ4:0xa1$JlҺ-AQ(
+Ů?/}xYIIT9y?}QucbJ}A]Iiiy pgb w߾y* |%έ ]9n?쩼i 6~J5? SԣPŠ 10pAj/t<)?رH,Ialn!p35BP(]0w3+HUdΰ|Μ|׷zڴrB̘\߼?Yç6<>\NnIb}w@+
+jJ>fL57 4@-S(T() /}iԨw-8$ ^m,Ք3הRcVEQmT2*Tbڟ4HVmd 4"k( $>QX:g}M}60L`{/}^V%o͖2BBᣢ<LEQ(c !d޽vv%
+b 7~
+5
+h6]@iB!P(T?@W_k5wi|\\< @ٳ{8Wvq))Ϻ)^_~yBӳǎ~`@UӤY|:C3ǫTʻTS&s*ߝ*ո?06q5|CunHj o6}k곁by1Pg0hzqqJ0)WP;Q(j` U?yIڵ&;ӥE H.oӧ5xxT!ǁ:ͿPrVRҝl3A #2~L}6i:їx(~:x/.<5D1-0sKZ]E?fQ=iDb
+BPh"Pk&.m#^{Ǫ5ArZ53L#\÷
+lh׀h*gi Zs/5# 65}<MҦ
+B'*32kwcO*%AoT
+G+GxN#1uyo^ Bpye^WR߬bEF D!P( \fS" 1q5̴K3S_@MGASwVVSCVNvOR6kR3W3 |c~O 1BP_2" q5R[/~6#i~Yjuѱ; e7`UTY@b
+Bn?R$h"ɀ> L} ε]]w
+}I?(T0Ј0PD Q$zk{͖?HP(/a }0baOo@ D!ǟ|I{UvveKKˋ A U rPs" h:L{CX;!Ъ^25)Ӗ9YrE~"::Q)|2@6Jfu%Pt>!S$U LOOwwwvvvuVr ,ooo;;#F7.00F#8H;q Q$<PaG__Ca&^m3{T(@#GIRP*995`tGIIIVVV'Nhh .!"@)Eb B8 R::[ D ةV|LEcIƍիP9u/B;;@2>'/_vttСCRӧOAcc DknxÒB;w#&O|IZaÆo@saUu8q"C !Nee%]͛7b\\\bbb ԩS5P#L6 EZ++Eڬ{pcC(H#rDDرc1܃YdCH(>SФv{u"Ż%t@̙3tkabnn^RR"bpZA-әecz.v{2J
+zQ s7
+k۠I{(:bO|q62Q qQ.\Ċ
+1pٲeMMM0NQin90rAypp0mbŊRO%K-Zka H9mB#BF<<</_=nnn g߹s.s! kZח^9sf44LB(f݃` o|Fe\U܃Y}$tXLou{
+|>@.3,!, ,BBBϟ/EKEO
+q5nC3CEn.{8B(
+ ׮];~x5͘15ŋ_~}̘1"EEE WH333hYFqt[PH9]͛7NhaaAvR
+!C5}JJ
+1jn` o|8B{ԩSج P|rrrJSIǮ?Pbn>out )d•aQT@nTQd(>Igq5$vttn!Iwt !@³50VyyE/cfdd@6a=+>Hl:emm=|pr QO5
+5U#^geekÕ"F̈́Z+zYǮ`67PLxzzBww$ˆg`#˻=}^xTB-@.3966vmmm@nJ=zC.EBzc}} ,ڵPIJ}M}6nѴiv'iD:' Q?!c*}w !wf.gM@9wƁҾGZHW!԰
+$yه5\~$$$^Z;NַB Bq2-jgg*qCO4yCuB17Y(z]ݞ)SN]w)K#t֥m= ]*r%Igq5v4 Zb[+jUkkcW=:"ڬ0c<+QKJJ5_ì1c;߿_R#=M2e֭q$V9}Hjɒ%0('IyD^^^>>>50&<==hB#B(aA+W*JP6vdH' Wrp1
+
+w܃6:64w/
+ܧOCeca okY(8!_$^܀PB^k{;."r<egg 6AAAǺ52U(& utu{
+]$U$ghBLd0 E=O!!9o}l[w-wT<-]R! m<Hl1~WV\OkjU밾a1u
+nZ]rݸq?&!n
++h<PYph5O>5@ {mcdUMWSKM?7)0$P0)tQ*T?*5BANVFh*Nx_?ի5TpRѣGbWP(c1G__a`6f0Ց%(]gfKtX'BvcK{
+fgo*D*}/yEڒ<%
+DӘYǫ6{޼—'hREی{H_qS:-9敶~uWJf532. V};e2  Ϡt(QQ(
+B8UkSPga*0|7aK#2V.$lV&q 
+7q5ui
+jڹpߣvW1N&m[
+B@b"aNy"wv2R$aȲ}07j]lRTzYuC sO
+ 4k( 6$
+PQG dGpV
+~7Ҏ'Ջcnͳ|XgEƭZnkG!huc lx<yD/vھ}rssj5\xgZv
+%& ;&/+qWm,
+bܹNhɓ'y1Q7͏-mСC鹞ӧO3vmhY;zh]r;˕$%ܜ[λ/***RKln`]veFFn٭\06o 9k2
+8
+7n31;D{g'@$YH'nkF-:SgX smt|ο[_xݭ
+
+]*:֎&(9;;Ca]] y777}1///z023n;wU"+7>> B%K,ZJ`X WX8
+m\hu ȫ۷oC'C/W 6C:Tx]v;y1D`(//Ur(JW 4&B D `QϗwdR2G״1(z60!!aсǎ8p4-2pubY6Pjggbu9"4"-3<F_j.۞޽Fq˅v1YYY= 
+եKRSSy
+ ˼y,Y駟^pz*ݤn6ou
+.u(&yzz=l w!] bVcbd[% K'O
+=u5<$$wmQDPN"LCvoHbМC%*ZII<5uHvHFd}} L}6o7yӳswrFe0Jߴis6o<՚޻wu.]AaaaFӧO$6@CPH^~HnE-oU ---aK$eD\*)ThcccǏܹsl\hsV{Ϝ9#
+V 29OZ"!!i;pĉ]~&]v
+Y8|`H09Ywo]iԤ~5IJ櫋YY``FFGGF6
+m-TEna{w3jH2HfaqYً` w2%
+BP},ss]-ZTY!@Ia\\_TUz$DYVy2ۻysٳBW6BF,o /\|"@UW㷬yhS&s*ߝ*?02q i`b A?@b
+Brۗ|A_R\4'%%Ϗ?.ٵkƸ*"򊘵k)W3_5+bXAǎտN!L,e9&:98oRy9LEYiAҝFw~ kI
+Y(HͯeXv[߁1{S(b
+1BPCMK(A #2@΀̬d9};`}E Wi_'.%yJVE?"л8*I^$
+BP(>(74w"Pc}} l!3dN;rAruE"Q:Ub+.pJҥ-47a}+),ߕ>k B酁&^ޯz]4(
+K 4!&2v HkoPGu.Q};0fGJ"8aK[uMw6~5K:iknoi(_0
+5x0_mS?9ٳD꥗Ϩ_ߨe˨.IIԿEkԻRSݯ位Blg)`%=J8
+hwM]MT>~I9S:sYG4G°imWiJV B!4AR4gk;F͘A߹#nߦ~SjNVXXīWYeBڊ&C "P,m܍B bG__a&T
+c 8qŋ+++ihXeaa1mڴ<[^^>gΜ#FL<ɓ`bB@ycc-د^p-ARӧO0 =cǎ_pb T)1t UqND&Қ0rv!~=Y4xÆ Gm 999-Uvvvȶ߼y̠]\\`W@vM:5_Kƍ dv)ow˗/;::66
+5tgi@JM'WoԦM:#ع0c307v;;`(x";wmSWWf~~~nnnc0{(y Ł%K,ZX샂/2?%\xJ3אK x+2f_QQS%%`sԛoRڰ|Yٳ!_TTTZMMMХX: @ח^9s&ml2pT۷ 6owARS5xXݳ1@#2@:`Ե.R R
+H,1rgPw`R<PMs=K[#Ph<װ3dV32%};0fD?*M֫S/%7eSw |P(T10::
+U*Fz@{%=y !6Ç~E0ZE9JBɨ#A gv;Ъ٥x 322
+56t&:>Z-Cc9Ͷk:>g?1CP=@2uu2zOHH:g%<%߽{9ƍ/̹*^mjggGiVi,;w:x1pDjʔR6YEnReFEEt@ѣy1PQV)E=LaP( 4k0 @m`ԨM~*^5@
+1P&A&..
+ج\RTݝU*UYY]._({yyj_ hCm<yv/Q: lmmGTȘTJmBi|jj)]0P22(ww͛B>p}[-NbuZ7Zd'a19s@9yrʔ);wWXA-[Rs݅(aB bG__CazmK}k곁(b Feee5}n1`
+c@x>av
+eh(/'qP=P=KC1x0w=Kӡ}q6(H}r)00иqP(quࢺgUJ8
+}S>@
+BP(q]S,ڂB b 11p6+yuWvmF_ֶo[U겚朒LT
+BP(n{6 PhDPrITG7
+BP(ZIRuÈ(0q50vVf֫`6VGE55 O}O>:-QՐ
+BPcG__b&?/k`6}OsO|O>:y]u@4N/Zn=y=/zfT[;BP(
+1Pc}} )fZLuKk곁WrYgߑ^M-wT(Crrrzrv%H~"_[d:<^ܳ<9?YB>9(oP%JUO?hǢʶ[^w+S۳7"f"P(
+B
+q% g~S)jil͒|T^ܶ7颣iGca1;.OшSRT
+2Q 4k( Zu ȇ.,OSV7oMc+ddUM%k0pES%L)bQ
+\Iq11BP(Ia 11pugZhKy'>j!!DKN_A>*I>*R\Hj
+=}|5fɲcU8Kt>^ d<Ћͭ \YMeUm%B
+BP(
+1Є1RKJJnbƜaq8d![̧:mˌcǎ鋁M֫S/%7e)X&o8NVs𕚿..1])uvfSTz]^v3^UQ(
+Bl Wqqq/_>wܷ~{ .DEE鋁9Ͷk:hn P e=@Њ,,4[.E DP(
+B D @
+1BP(
+11pP(
+N:T_<dz(,.n/
+hX| )=QP ?8J/6%QRCG):r@ D DP}?OZZZXٖ 7;?x𠭭-4>)); ׉2]>\gn.'AAQFW{=9JzCūksQE+)&n0 qh#
+B $씅 GE0蘙eff`mf5ɀ-$kcc`"zm||YF%HUpvvvuaSLٶmm>W[#(u eOM``AES)%]@j*/툁՚OڱM]M苾;0PfH#L#6 |^bu/b`@T[[7uT޽{
+Ҿ 0,, U*INNfE1bDBB OlRwb xH=u}B=``Kۤ9Ws;(J/4 TR괙:e"c*E^E da`ttĉ-,,M?P-""bر!<<7ǍCիW/R~eGGaÆAp1\x1҃9ss'O$GFFB#TVVҵܼy.0<(TMK^gN>}\a H'
+ܹsY.GĞ۷V=Z;^vnŻBz lEE4*"-!3g8;;3%%%\c}w.G!vs$r 4U=C̶h\lǏiΝk;0RG'!/17Q}!Yjc, ɿ|h⨶
+pOf1O$l3*PrT5S"PkX_@@~~~nnn\.L||<644`7e˚`۷+V
+(dLX{{{@sQ.\$l.j❅7e@NaZZ w֯FH:=l
+Q}i)CA#TGAPj%KJh` .HO"+=!kғrE^E da \bJJʐ!CC51:u^$ njCO-׌7o21S¢Bu4}Džޖ82rgɍ7ȶ @n^]0ۮ`fVVVChD`G]vQTB=BGKS=n7UdhX (999P4eXIj.?~<͘1̦qwC$""h;˰:xnذ篈m%27>LE>P&0Y?^ߧRޥONSžB*$igPSؑ\D)o"
+=HeÈ7OKzI;YYcTڌU#nXKqާ4}{NA;.Hn0˹qE8NE
+V+ 6C966xMwwQ`J?mj; $Hȝ dY.Zɉ< l,+"?Dfm-0V{>(_kjTT| U_Ry9LEr+)PaNc1pb`tNt+]\u;EE ;pىFEEGXX&`F&M***0m
+o8P1|:u>Cufγ2Թ jdg#m> 9^T
+,X r.#ߑt}/b([[[a@xQx܀0$FM2e֭9s
+x_|Gv+o{:YMZꈁ׮]#o
+ 9r$麒r=sg̘g kll?~<l,
+00"lk^kGO^)jO?w:SC5n&]b#: [ 9Ijii KUy{{C([[M6ѫ
+ tC~Zu1Q}0|q qDGk̙3%ё<`%T8""RSt0 zܹs<!!8q"50pxtk;(TEtt4iք lHպ4UG =x
+dV2n+
+ Ҿի1ׯ'o>ATHƒB D y$U!xSL \崽ÿ 6f G2#\4stnǓY`a1㡖rYr''@8o3fjwӭ HƒB D =rC.I5Zu [Niމ7c@Q nҌ[ .,,GW2MrxK
+B\HAunn
+ NW0K͇|‘9eb
+BzZ$aP:bk5yEyEL0v\߭Y 1b
+Bz"Bur͇^`etsV뎁}З uĕmii <x𠭭-Tg_wK{Й(TX?TFXBP:b %OMmxk1c}q3fcm>&2,{Mnic/gUkݡWO""" I&%084"$"f,;cZA'>sz|ÇdQT>޽{}zI 4*씅TG/"zT,P(@@1Ҧcg|5va:4p(2ǷeH8iW1!4 CJ;XԗqZ[[ 'OЃdsyyq֬YXϟ7oٳyհ"ts.d1>>~С=Eb^hrT݀GC dbsRODQ(@@0&^ȉ'ZYY,^UFGG* iӦ{B1w#FL<Lb{zz"dW7l0zhKKK䐵/_l6låZͳ1""bر6pzJk|mzh̙ӧOǯjŊv(;vVٳ3? .@FR9:jdծ]
+6pGX|9PCнZJd:
+111b`@-,,!PJJʐ!C T(H$1o@~W111|Ν;:2&\_ْEVuׯ_!.d***
+w0ғeGt.^H:th 4.ޙ"xE@fҥdĉB҃ vד9P^!cV'-,,$qqq,55
+H:gpfG'^ Bā
+@E3E}1PûmYN]B[ȉ;e۶m6Q3W
+غu+ZnwEDFF:99 :^cn'{yydL 1 !8#O*RwҤI7oV" rJR www9P
+ 5ja-
+cPh@ȊzSh@@=}!EvӦMd0@IwsmogΜ+spp~*CaރCh(_J 
+uІ
+POnOѰ#ڄ"v"9Ifffmq #
+B D oG/;B|&yǃa O~u(eI[>Wq-.1J@@Jw,?իH4(
+8Hfvqﮍ|la^LQ$]LolbܦA^"N=[jdF%Yج6{S%^P{uՃ;e5Pl)3BȵZ(|T¬uLUPj
+HOqUxQ(>n
+11p;!,
+11pPfj>yI#2%, <~p)! dqӲ_͒Z[YK+Β+6RE0rE=m*t=
+*ci@ p\Ѕg=@]ZED&+w^|b
+BP(b b(! oZ4Ely]fqy>+DG k)K;7{n$\yyr>(~:kxqqg!iD[
+]a;iknTb."E*5O)TQ(
+Bh ]ΩE! mG^G
+BP(@@#QY\6qXL˹.d?u~7y?_;*[PvM@Gy^̰k|Q3w1$-m `vbnF3
+U<zV")>;*PyEu}<MInnM+UPcI P*6DlX bŮ(
+* TY "Vvٝ= [KыgΜwce?QPqB DP(
+B D l=Wܷ|v-REs*#Dn]+
+B!"e3%8P w6UևT [p;SsG1~ʷbËBw[~9Ŀm\t]}~~+JGmT0sK5}ww@-(*&+P7ygdL>=L`r6:*`,dee5~xzĀ-kkɓ' `d2h䖖]tqrr
+_e2eN۷S l0!$0J(
+111DHw
+r!'4Xly_uNp;otz_{t_M8-\yXlƲ99J.4~g/٫3&Ca,JrR1ДRM^ u\ Va>8 k֌-/D"Y`oboo!C1O> ͇&F9o<;;Ɉ+J___.>믿8B(} T5ҚY)c\;t`o;8a{놸w.&b =1=
+
+߿+**1ٳgalߩSvt
+4mmm/_N!HgR~޽{@ CfggdW^^
+@ ,00hvoYB6III7o۷ǑC;e BٳM@PBBBtoho^&8؀}x
+ob7=nٳg̘1BPPI»RZ$VNuߊSV=u)p+Zzk1 d(N˦xYu癃+='LcjMGA-hfVC1<m㧼F<:[#W\W%4XcRUVCYˋrӫj(;wI/7m4vXꏊzxx<KRRB r30 򪮮Kooo~ꄼS
+Ç,ۇzfΜ !khիW2o vo۹" ̛7U^젹pȴ{j4551ҥK]v5-Zdx~3<\6m9 xJrGS|zu[ZxVti77J<Ľv]h*2$_$MQ! %Fb"">IV
+v<v=0L[T W68 BA w7rk,# ,P:Qjm5kM'z'>>̌Wӂ
+ 컻eWWׯ7M'v N:l*/3ϴ~MoGΦjڛ7onڴpp ϜFBg^d ;͕Jno+9)dѹsg~O0e6aTQ67'%%{Jaoߒ
+)z{WkWy.ԷvyycO?|}ᅲYf>} ţ<Og33z+Bf&\Bj 1@MɍZ1+)b b`(
+1 z :ooo__{f tDרYP:͑ ƣ/_B͛7bd?~<I=N<i ,sZZm;;;1fX;786΀xݺu3Ǐ@0@]t6li U Ι34Fuoo~7׍ ܻw/ #lcm>Es1/$de>4>LΩS,;ngW|l} A62Db֍YEw0Og*L7"Y
+w!wL[ɠ11B=$ [<55-&&mDwfmر0DW(rsrrO-kk-[
+ꗙ~|s1 ={6
+gʕc̬vIysC~kV2Hc,඙:;+-X
+mll`Ɖӧ0&'?N@p ̆ blQ(WsmeyTm۶Xd)Xtߑ#G1niaaM4V`X4uԬ={[Y~9Lgpz̄t
+@ vsnСCu!1c޴MKno+9ېg]v,
+1BPbEq E@1XQQ;b
+BP(b bc=Ij8%*APy5rzy-Qhr附ccD
+w^zSB DP(
+B D |g\h:NoufADEŬ&eͷqQF$V-F_mf+C/8
++o[5Eo|Wߔ
+1BP(
+115(m
+@9fK^|4mىA&lO$_je9ࡾ͕3a{yH<2M)Tl[rif&G!P(򚽡E
+ 9 j}mW]r!gtޡ+{kfMۓd{{V)ʥ>-|26qMNV۸bhD]}G D DP(Tu1E[{֞˦8zSAGxjI)#IG<
+ED w]84e9,=~y ʹˬ#.Q \UKKCF)xR"[^?L-M\3BF ,+ɟ
+t5Kia׆ .,Vrs:P'm߾jV6y
+M-VVnC D D D 4,,w$% J3{-iAfI_!.X շ
+fsN_#/$ kXB.Eǟb`3` -۵kڜp_L"Xrrŋ3۷/{IԾvT*;wnZ/??={Be
+Gnx
+}<۷Cd#[G'O"`#4魵k^ؘ"hܸq +:4ƍ!raa!SSShBxĉgϦ%k֬lذP8]+t!"""(c<3>:{}{竎E7rZ:`KUޣ^w0DsrLoRxG qN5%B]<U0cWuu5\z{{@"T*h"fmFq0zzzN6 LBL???6&` +Jc
+I.C^tV޽Z...nڭ[)SDDDwܹ8
+LI-U]ͪ^~fYhr附qA
+]rK&շY\uO%뺬g ,3mC (qZ5TRn- l0UB|zY-
+b]LXDܹ37fH-⥤
+מ_J&ˡ ;Z+zAvs)Ԃ_g)vRXF͛mmmƍL
+ݻn)HGaK.:%+BMgjwwwlJQ'YV\ ~($kP
+9~QFN(ӶSZtM[[ ""P@&KKK!C-[Fv9r.wխ[76|  J/ڵ+Dvpp ( x:u*$bp1P'
+YYY9cƌ=zA ledժUl -
+B.&kѵBr+b b b b`}BQ(
+ղ.Ԣkn~@@@TQ N I*U @b
+BLЇ[yҗD
+K.%zH')*Q(
+BPOl(ﱴyn.>fAD%Q7Żo0ֺsYB DP(
+B D |f6=x|iAgy7jڞ^K?(@
+BP(@'c6P(=pqn;:&TPW].e}ܶ3<30G (k )W
+1BP(b b b`{6
+B D D l)ޟmQ䀕W\1ZѰdJ-r6_xGkͱu_#(@
+BP8ՊS8)H}QBBy1goVvv`-D5pU./ tS`oe.tlw\s(L#,457sYzs#
+BPOl`+VF^v;/JjzWP&]|4 g\|@%)8XBߊ % Dw,:Cq}6>O^SjD ]}qqp,4Y.W?݅{"%P
+B D |w
+mQ$uG_{mt ;!>oD"1:.~Ru8K_kZ!{
+TQ>b]l֠
+B@Mn;uCVsC
+BP(b b?*+vj~~KW]3yqU@m|@ PƝ(}9m\Pn Ιx?Dc Z_㾹]1BP(
+11ɞ 䪨\<b]:v>v%y![7U`8,iƶ|e`k8UzQ0s5.ϲ@ T *̓BP(TX98z7Lɾ?<2׭)h_Q`85 8/;~2$&,&JuX̟eF
+}]Fg($|W?\Z WER;T|S?L-uF!$df제%F)~^8p9Tyh|2 q̓BP(T@d7W[
+v̖]r!U%%9*~ /4DAYGqE(b
+BP-tYb4Bn
+-̈́J 饯0 .]FBx)9Jˀc//z+|my^\;Ә7bF%^[ 11 DQ(
+jYQ Mb]1n(:W߅nIWk=Z&FW K V~ySI4՚<# <\V!
+c1mc 5h233͛gggWXX(GΈƤRYe^a Oy00''<4|ԩ0:
+;vV\TRz kk ,Qnyz ,@aݭi=vO~
+b@7A Æ  C ~O_~ig:88tԉ VǦ2s24!p666PBќn
+(2ػt䬛췁
+!던~u']~O敓*6] 11 hjZ$V]+%\r,-($B 򪮮q wVTTXJYYYK.ut 10 ʘ?痖2v`@r^t6 L`Cv:fb1\se/Gi"-O+A1<[",MceeizzzN6
+I:O;Bj{#%-qOgYօ&K@.SjoJ]_r{=}#'b ebbb#:tH" ^rr2$gYsaSNq)
+zҽ{wSJnfffַ` F0fƍp)K574Vf6/O~'k./MCJnF cJFi7=b`4<h~ VPgҒ} :ufcǎeu#'CIIIJGУ̊q>Suic*<Qa ?Fnׯ_o6j6FGS 6
+666VVVth>7<5<oT+H.ly
+I*19<赴ܗ?`e\c΋NF .,^{N,Sn\ܠ` 7olkk( 3gCb: Rg%44N*--NgOBBBhH\\^?c7 MA/_S<cשԠu1f2<Mȝj~706sgJF48زo@n4
+巳&7~0
+*kHFg(IxcDS*1
+0(66VRi4={a,X
+"g7vxztFә<ׁ;:7kwL^ ^]ƓvQn ez`KKK`B鹁 t0snСC'/^ܵkW0n ΩSBͲe1ԩġ׎9v֭$>|xPP` Fh,?22O>`He4HݒB()u1fӔ2<MT:88 @eee@a;8mr+؂o|(ƞ4
+N&7ž
+6
+.WZsaEPQ<W. K) Vlح n%*ם j*J6Go咫sũ
+B!""(} T5\jVEXJREg/>rNkFaKCTGVѻ<i8&AQ(
+B!"" 0P(ԷK%S֞-é Gƿ\c { 1BP(
+111=)My`L~d(,44taЭar /Ż(4bvP(@
+BPb1ͲSI% TkFmdvن"&nP(
+Buz1 <PoELhri;ײȽQTBNsH2=LzNzU<iveB DP(
+/ET+ޑWe䊤.h֝g}ïx429C7冎PMSAt9{霾?7ժJaaa|k}P(
+=JGclNz7zSȍL ]L\RKN&G,褥GABU6hB D 4e'''YYY9::^xQ6uҒHiܸqp٣G۷B D D DP
+111i=
+B iO8ѻwoKKK:2gϞuppԩOqlmm/_Ǝknn>hРR,OԿHnmm v***\.\
+j^;;; 0SD"ΰ>|TZO߲+N  ݻgeeA*ct k_c?ᦔ<;vԩEC999qڷo7퇑Uaaav/
+! NoƎ9(b b b
+j>Μ9S.(qlٳRRA DwD f͚c<wqq]ɣuG`Ã a cEΝ;=<==Mr3Xx
+U]] Yx{{Ch|`^n MA G~~~ii)Oy2 fdTc[OFX'/Px`x O7֭[)S
+꿂LNz,"ޛnTUkkq?ԓr^KTb0N͛7Ýmll,--.،X4Z{:wU0v0MNF6I  ;MeeeӦM<x>6uJ`0{N}c~Z`1,X9ti?T/^bd26Hر]t4hЦMB D D lZ25>V\P뱋\V.ƟJCCCHCSsga$ipMBBBhH\\\hR[0g,mvv6xw |2w6PgU)hMh=
+`,\27olkkkzNLL' 4:s}Z;O~ѩEYR7[׳gOeN&Nxbcww }mjU/$~e+_}UkC{7yqWmۊ۶???%|\Tg>\ſ/JWo[wUJ_?T䧟$?,/U믒~k'm^ҡcGiNpͤffRs Rje%v"b#v8nR;;i=d=d=e={z.K֧OY߾?A֯_Ye ,st;91nPaaÇ˝Gȝe..rWWHQѣnccǎ?^_ 'NTL(4I1y|bTi
+p
+33g*fR̚3G奜VVΛ?_1r…E+}-Q.Llrrᅰ+V(WTZŸkk׬]n]j6nPnXiS͖5[lZm[5;vvTY{j՞={UU8
+ 2&&ރ$E+։gلd [lQtii)t*ȅcgD?bw1ӱI s T*4Ş={(Sqq޽{釓cĈM@c&77L5ח<~BM,N-Ly.<55 llwh@O: DcMgqbg걱)3_fWį3cu[o]njV.0? ՟|RZ|y_
+ػW$CDـ($
+//ܹux8OSdž .T,^ep R dÕ
+ek)A 4O9rTZk
+| }2NGĈRfٳ8xGkC~ȥT0XjgԮ+[^<{:< AqY^t5Ky%S/JF J^KCE;.VG)&fkÕ]ZVTT4x˗cSPM@TKbq611O ;/``lvc u1>Y[v[(V
+ED w]84/'$ajAh˛W}:6REiNJe*}%!Ns
+#P(󈁨L@9@@@^M٩;Ӎq X(aa0)1p B6?lIV6%T;/UG)DK
+=j9ee՞ VC D D ߣt+L|<ܕrT⼎!bYx<}Z?h 쿣ժj*ůr
+=y-ҪZY;%IrZ?&)GJMIuBZ ޣ
+B5A/<T Z۶O3nqʠ r49B;u);[|N}xGbr2%3fkd2 N$v%!G\8r(rbQP@\cN-/:  KVjػiBthsr+'ĵ&짱}vHn KgB?(Tk׋/>L \K~|Ж٘r9sܾOU <:gd9$y4҅JI0{]9/cCm-˥[ڛιn',PlS# |4`
+n)K 0pX@ُ
+/M)ubí{>}.Y~R
+9]
+$\qK1P%Xh) >EH3gd>+G |\0ppݠARߚHO8ѻwoI={SN))) p ͇ 0332d=Կimm=}􊊊͂ȑ#۷o_\\-K /oaaaggc*oovlhzuL^{g%7o2!UUW[!O^}II!'N0C9GyjJy&qv&2b
+8饗&S]\ٳ9f:/,ID"$
+z2/K$o4r(  cW*>V!P@@=JGJIrz'BrJ0]L4յگ&YUP^qy/8
+^٫h*"Ѐ2 6s>|o(?W[Q0#r+ZlQ(-ef-E |0{jgϞD"x
+ 3gΔ@j`WfgϞ-JJ%k p 8w\rȑrTTTAݐޥƍh,x \n݄ kcB ;@d 5
+'Z%џaaˢn@> zܼ>fA]ĉ(cG?3$ض-o!?S'}ԭwd@2t䯿)dL2w.Yl<D!Zy1i gcut\Mj\MreDCr(@Bv: ٱ)O 9W[8\GGokBBT8B!坉'FDDlݺߟLdfb@ !!!lx~~5w# q\:t/L||YݒJ~ .eF }xx)QcK^TD3<hV[D.7yy/3#|ʙ)E`{(㤗_~|xF~{y'=>ynOi886:G6g$4ēx_'CH`ŤB\̵,ލ ld2uI} 7͆;gSZ^a݇åd(YӏC0004 w
+E D ߣP(@?srrX+++ss
+Z9DsjJ.5%%]viђ{ lccceeeiiI6,! <22NVM&`ɹZ٪WUiu.قII7o0 PV=: \KڴizK1Y(  @.C"y)d=uc 2|5DCL^OG$FK@w;_E%!ϑjO.AA!{xh |KVDǽMަ}<q:vmh:, gQ(@ҥ˰\f4hЎ;s'g^L>-44ȫor1hf rSl+ ԙ qgts_$|PYzS0YBV(W^y4M`>$l;_%gYK
+xGPW,tCѥeee֭r
+DH^eT~1GsrrZre1<111nR77Fa`PP;vǮ4AcǎT(FMg?(Ի_))$7T d ܩ$ !P^}`A0prBR
+yt0@։t[Ǒ:?aɃbZLib akkkaaѻwo???xfcuzZ~KNۛ#m]vAրÇkBBwwwcmŏ`fٲelfݹ33._sÆF`X̜ { _MV xBlO0pDěNɂ'SyL+
+ ?oЅtaC4 `6c!)!ȸ_|$;WȖ D~bW{67 nE,~X,5"TI ``&,11bDA$JUy.9"ܿi1CHbVc{4j}9w9Q(Tk>>8j$i[ԎKyH~H't!d+' y"hYd0۟O7wt'\E/ǁ$$;!
+–خ!kv]GnL-ntÚ7 vNB8b b`*Rd?)6i1m˦E |J00,,{8#BZ^}L >YHѝ<)@[ $ҊX-i d)l@Av1tFg|/ @GtfF4e4V嚴68 *HS%G8>.qR G D l}QZ:.:qe>OFFFB6チF9řd!\.,Ivrm#]ZO3 '|4j~m׎0[="]!ҴWsq1`4<$4^ 7& #y]ơ{4
+/H<u{<& ׏/ĴE DP(bI08٨$yr8Nΰ{,!KD1
+9w]
+N -$B^ٞe
+J߁4t@FphelLs+ȷ@Q(
+7 Zrfk :<! G}0gSX6{ᄁd-Xw7/]1K\z @G;eݵ'5/Vcfe-4Q:v23Е^\uoW n<_lne lto,`cVMGB D DP(T=)~qN޽Z5j#"W 4&\(7_`-t窊fe}W^,c tɝ"U~B ״L'.A04{ y!"P(Mg cX#TUj*hjE-%%$3Ӱ"m
+Ba`sF0pt55ŋܝy{:Aom?{Օl$M6Mog7PT&1%ElQT4V X@F)M,H{g(2H/ә¼8A;|{=㟊*G_}ݻ
+S8f,}o6Hy$!),-!^Kd"S|]- ^V5
+ L)RC @TTO>@K.7.==}ދ!os^4/ .%R38ukjc\EB?uÕy_$΍F(94*)Y#x.]j]ۢpKQ܈X./55+XqFJHV5 ղ``" 80pH&R3-ϨիC5l0PDlR׿'_^'''SH4f̘xZCrʱcǚlٲVO999V266?~… 㔚0a߷Bϛ7(XTm۶M4 w??~8zeCE(??!':@61^7xP@e9OjmU\bjI:Ǣ5p
+
+#4GիW ܾ};"E;8qBk^l\JII+{
+dbEjaU8=ZtZ|z ъ?bcc3k,,_\ԟSYuC,U65 jSRRN0Аj=ޔ>)) ǁ'N$Iytccs ܉yӦ>Y)M;1;j[Z%d[A=["cM8qѫ廃\.u@ͪi v#}6~
+H"a>+b~.x
++;[JE~AO&FUUT*,(22=Z\kчI@:(b @}4IPWo
+@uJPsP(s^L|61uR<֏ٯ J:)j6@qƑ:gΜ'NlٲEWK5:uf,j pF:T{|p8']h$^ tWj~&RN4 eeepw>jeiSXX5yIRt֧fff&ql8?=yU64qĥKd/_j]@?X @8ѣ>ȑ#W\Yus:H1~17u`^)8ޗ_ŗAI1-LTR.
+ )hnK F@u^hRU
+WP,lQ(nMzɄFz **^n!QGs:]R'Hl|ov U[.Rt1 T``J
+J1b`j 
+U@ 6pZnYSRhu~5٦.IFOvbO!dDZixߘWUs+j YZx'`LՁ9V4q>UJ$uBjPji mpꂊwT:GǬI֊ݻ":yX---</8spp k׮ݳgH$KrժUZ絵8MHH+Ihb޽&S4/l6܈b'A
+ZpJRWW@q߿|^acџGJ#YTTDW5%dP___24)11Qm۶Vw JRz=Vh`3A BᬬLs:1?<(a/>? HiUJ|!wߺzw`
+wY?:l .Bypc⑀`+w&!0aBt^q 7b9\3vs }ŻuęYԚoK1$e7B\Ňe`TH1b*@͎? h ŰqA.4vH3Y"p>vh:f^r?X* 2U1P-4I y~Zx:6ڼz<{[nqfۥ}p\(*Dw3+c_"VD6eVE:eN ԩS4HMWK
+ LA)+PK]ZD%v<OAv5rwU5UT;YON㋺][j='U
+7I<?=d"=ˮT+ǫ5\HeY<DtPս9m8_uJU 2+j^iH^ovC_97#<Iy_ީƕ> LMA)ֽ_"F~Sͽlsi&UoZ} @*!99o\U1P-4kO6ռIhc[wފ@Kr) c
+#c_~UiP(T(н@G[u̵[k`^joT{T;z/q/׾9@ 0>b`px@!E୎[{N
+K|B$Px3UHKʄ| .4ߺ}#p@viOHP= 8FAbA>שׁU*+x$fsA _`c>+3tP[>bSGj0ڵkzy1}@8xpohcG ^=P.2+1ͷ?qQז+܎l(W+ÍfYWk@]Bd
+]j>7_iHe5b#1)ɭ{\- d]Ttγn͵ub _[T"1'AHLSS>-2$8#[p>'%zܒ)*96$s.6 I{)R |RLFZ>}?+'f̘!U-/]'>Y|csKYYY+W;vɖ-[jkk֯_ӧ#@&UV!/\0**j ;pYеe SSSvSQtT'^]8=ca}@xp'n Ԥ0~j:.4W:cx7ۮ
+)$^KUY)R |FQQQ $—hԩ))) ƍ022*//PpSivvȑ#VU/:b(V^R؃ԂmjjBJȩgv@7_֭px3R+ǏqPh=V $
+K,qssq8x<p
+jhhkĈ_~=#L_9r[n4WWW̚5 /_^Q$YgmF^: crrrHTTTL֛78yo~${` $ڗvٴ7b ^ec҅gf
+ y@<(R TQ<o^u+nYk|GST2e
+370X#G\r"-r=b=<<@F:3 ,--q]Z#>{hzۜ~6(g>
+:\1PuH =rddPx; |ԕM1b H"tpsAN[ٺWW4!m>@khS6T/!ʕ9::xKaaac%&&yt17n̦… %%(j`ZZڴi\1F Wv߿Ľۼy%##ĄYEV{Y ޑǂ~i&u K>CJ~>&$H=Eʬ{5::
+9.u+rںjke0lNa
+ klT&Ys ^`gEW:$ȪEDelmmuppػwP= .**xS)Ss"WWWPjdd$X
+ә![]~E" P}Pagg'{yyCx*@^ԄpȑݭY<EPȋk?'
+Ғiilq8]\n0=\SSC1j]E#q\RRwݺuJRU` x"3yѱUˠ&[[[ /M+W||<~cccۋ'$$lٲ%%%%::W؜;w.-- l;;k׮=RH58R 8Xjd2]nN9kl8dE?;`my' `}c㹪AtV l67KXnM顀V4|O[Ow<IGH@_\s;j0#A7jfUDJNN%9DdEP! >4v |566ٓ.%1ڲ$2~mf!O E
+
+H1/ʕ
+
+
+222jkk=///+++2
+ϟ'Y0hđ%h`Tahh(JOOyfkk+$nShNI6dW$.ϝ; 6EHʺnŠH1k@****w}0ȃqnnT*lX,VAAAVV3ߟIȒ"AXdr]@@
+𕟟 MMM}2:СCHݻ333}||TGx"0WHAי3gΞ=K)H1bRQ 󟸿zY10===)) E xj
+<x@hK5FYA8?K1b @FQQQ l˟ҭ
+R' ђ@9[[rјwޭ ˳R???0󃂂od/?5w\ b<4zd"[n޿I.uvv"˗/777ɉ$@UH@ OpdEdAx<d~~>Xpwwb޽{vrqqyT
+mlBҡ[=(R HEEE51/@KeWU.d1cZll,ྜCvgٳl*5[){fffaaaQQQʍ7CCC322tgxx)@`F=/RĀn DFPiggSvcR H1FDpӉx<_$ ź _$)*TTTTT?{ !r.r<r
+p3.taP9$&&r\{{{ݡC|lv
+΀W,K 4mll_Ν+7+'4JBw?Z?Z5 !!!K,A zUf0ex__eI1b @-29uss-w՜eg:&/vHZᔼ|j/fgh 2EwTM;{/z{ ]ݭZ#O1Gq@B.|>ɓwQ$HOl{ڊKYYY'Npuu%G}||-[<$ d#G8E\<`#TlXD f6У͛7#|777r&r9}J$%*<MK+JHȏ+H1b St=|SgfVy59|N*Zt
+++Flׂ.[ܘT*/y4tyG[kح>${(bPL3@****@)ffffddLC{XI޽{drEP&Y/bƍq|֭w†
+pٳg=!!AM7̞G$`ill˗srr#0KڐQFoFpp+{
+&MRjke,)>Qj
+Mg϶fZjo< H~x)eZc?nwǫunzz5v; k{>U[6PHypSԧvxߣ֨JE~6u)e"U{ly52H8Y.<ueD&?XTjzRErM5/bcUUC/=1{h 6\KaddD?\1
+ |zƎtR嘘ŋ
+~3N Zk#H)H8...$쐟?~xRc0u.b`4UQOTZ \%zSA>k,2|WOw0ݻu06l1M_<)xd,z*|gΜIMMaڒC
+Q^^zhooy挌 R
+x6CR[U$ʯb{r8|߿rJy}v 'N`ܣ{2`F3m?6{U*|sD 9!!%… \Uik./<}4@^WJUC4<ǎ=۷oszj=TM[kssU3enn}ٲe #Fc
+LGvGcx=f S?COZЂu4mڴh=/@5yd]>s?` &4<
+M||i
+j0 :ŠKQWk Yjs`w~;)>Dž
+_W㺇 *oiu!0._UU'=jH4KC͆b@Һ+Wx9r$;Ȉ@j}MM VgZ~&%`Цh >LXzP Ph`gP.geeBNMןqc֬Qo.)TW !ZhhbM0dM 33ׯ!YԏkZkR . Dg̘6gnM *"iu R@i*ፁ~8lsZYY0ζcb9gΜKCCþ}f@-<
+|޾}[uR޽}"QyBl"##QO>}IW ֭[c8'N<xp۶mV~TTrnnЭ3)~bL۸VSm' w2h.@y, O @1E%b~jcCZH0xY%_ԵZ 9 =z@1P( l6Ə?fL^3] E|
+n711Yj0`Ŋ
+Q-RHEhj Yͣfu%@O~ 40@3+8v՚wƻӞ={
+ jjjݻw庺: ;w1wa<1ɠ𑣣#qDwiJ"BKH'9u 4U/
+oܸuV\^^^xxxo ߿Ν;iii((24FDՆb L_i^M7@vv0b?a:6sCfJ]^qww Qmn (f>7p ԟ1{ YR zjQWCN3m?N4Ik/ O855UWjj$jjXVV<
+ \ten/H2Ͽx3zUy Btmk&X U+b ڐSLqn 5k< *aEEEd?Ora6 d^h
+%6l
+s*LP+ hɑ 
+
+"=bጛ9; nD=Ix8<\~_r$"Ba"#&*Ji%ђU8I\K IH$&J%IҤ$IR$9Y"IIJRSi4tidd(Lf&LW^,22C-<}Z1
+ nwK I EE
+S\0%ߚ9de
+p[~>ˆ
+
+P ]UղjQ{Zalo]]ףGf
+ԩiӧfϘSg?7 _Wٳs(ܹ̟_p!"łŋK
+,X!YRr`*7 ֙ ׭ 6ll(ܴQyp&App+
+TUvvŋ\\.f~[gh^}aVDE6BѡCÇl=*:~Ltx";;}ɓ:O>-:v<h py勄3X|蘐{\QQiƲ2yL Ζt޿&
+Inߖܹ#{W&x-..aR(:ZVP ł=7r;
+ D(U"IKf+4 &K-ɑ#9aawCCۋ%/{]ak{|7(R HE1b @*?7p_?}52S0(0 w%ᚘpȝ07ȟ47y7e*otgf*1Og) s
+  /,Y,XDt P|¬\`U`|Ubp`z!̆ 6 7on"
+ gp8qqqNNN..Z[)۽[ܳG DZE6`CÇEG"ۣc
+O)0P'EN;ϜdR]"҅JzNϻ>3(tW HG<--Wݼ_zellݻ73#t&'KBCbƦ&YHHȕ+gd?@]X|0SvY*+RL00;[arsǎEGor|<D^R"+++䬊zyee{qQ}"(R EEE1b ]mՍ\iK~K1b @P) Gy=>U>}%
+ȃr&AA<PڇvT3
+\ 3@?S7b ᇁAX\qvQ\0t8] `y7=9K{nňb׫]Qc2~smGㅨV8?i>0;l Q+LS80b͚5ٙXF,^844t۶mj
+:oyId4H)\NyA4
+KfjJԉGQs9<>{sq~p=y^Vr!3w[Fqqrp Ĕ L ܿVVnfff&nҤI%%% r7?#3aRiCƽ62stt3<ȞO>eAޔR{!V?o7pdfўuGo>>l"<+\ZL4Ѐm2333{,**jllL$Qzo}3pqPU*v|NySԒ222bKjV~1kP)56{7ʶ(o:ӟ ~SWYZ{tIM)))4幡RC.9LĔ L 4333P|B555%P7 ̦c|!CM;N_6|ijC[ykwRj7>?j|FƓ)Ɠ/>Ns{?7Yc&r 8N@hfff& _ݞ @hfff#d 2P@2P@2P ka
+f-߶ 
+
+
+}wwf
+endstream
+endobj
+1297 0 obj <<
+/Type /XObject
+/Subtype /Image
+/Width 1197
+/Height 657
+/BitsPerComponent 8
+/ColorSpace /DeviceGray
+/Length 1559
+/Filter /FlateDecode
+>>
+stream
+x1
+endstream
+endobj
+1288 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [224.968 404.185 297.837 415.812]
+/Subtype/Link/A<</Type/Action/S/URI/URI(file:www.sourceforge.net)>>
+>> endobj
+1289 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [275.271 390.333 412.557 402.323]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://mcu8051ide.sf.net)>>
+>> endobj
+1294 0 obj <<
+/D [1292 0 R /XYZ 80.963 747.976 null]
+>> endobj
+422 0 obj <<
+/D [1292 0 R /XYZ 81.963 700.146 null]
+>> endobj
+426 0 obj <<
+/D [1292 0 R /XYZ 81.963 509.532 null]
+>> endobj
+1295 0 obj <<
+/D [1292 0 R /XYZ 81.963 375.654 null]
+>> endobj
+1291 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F38 617 0 R /F48 922 0 R /F54 1165 0 R /F44 651 0 R /F43 652 0 R >>
+/XObject << /Im80 1290 0 R >>
+/ProcSet [ /PDF /Text /ImageC ]
+>> endobj
+1301 0 obj <<
+/Length 2226
+/Filter /FlateDecode
+>>
+stream
+xXs6_Mysq&][v&EtIЪ Ev~Ϲ#GJ7"Y>8ԋ]?ɜe|i<C)oo/?eH\EynŒ?_yy %S??\>|7\~IsI;vW) Kn M( `\;gxAeI>ޅK2q7LlUYhٛTxnh^ov|E7UhX(S{u(6vb1_+C6v
+kS_Z 'MnSoU!(ay]pZ%Ǽ@St0 CwyaB k~l:8_tU5dZ XVz`&Ik$ FW1tSkEuv3P$X"?sYcVUX3Y.yv)ׯ/]q6y
+YMݶ$kp?#.wWА20_ 4aT\fc~<OxAa&R"oNT=JbMkWyۍ&3b39N"G"i}-(8$UejG3\ɘb?|ZDǷk
+`>F?nҗcKb.#!jjqho fc
+EB Xd3.'wOXme=s @-Z{H!Q xl0$ $?#2 oXXYmvհ'y7`82 NTѭfDާ|u
+0Ѝi1D<(]lp:TBK?s('<H0NL%ẏd%B`@K mpQ0ncQOR!v<9DŽRZ=&k~h뚍 qḰäQ^q
+ۛ{3Į4N #/!<?<ZEi‰'eĪW‡[E_}s{^|gۼj\]_AD.*:@|g6Uh $E6t,/|-1=-FŖk) w"b}8&o7L3H4;ǕƄ~([޳؆R~?bO7:
+endstream
+endobj
+1300 0 obj <<
+/Type /Page
+/Contents 1301 0 R
+/Resources 1299 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1296 0 R
+/Annots [ 1298 0 R 1303 0 R ]
+>> endobj
+1298 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [483.166 421.579 513.345 433.509]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://mcu8051ide.git.sourceforge.net)>>
+>> endobj
+1303 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [122.809 408.03 305.193 420.02]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://mcu8051ide.git.sourceforge.net)>>
+>> endobj
+1302 0 obj <<
+/D [1300 0 R /XYZ 122.806 747.976 null]
+>> endobj
+430 0 obj <<
+/D [1300 0 R /XYZ 123.806 700.146 null]
+>> endobj
+434 0 obj <<
+/D [1300 0 R /XYZ 123.806 550.441 null]
+>> endobj
+1304 0 obj <<
+/D [1300 0 R /XYZ 123.806 391.297 null]
+>> endobj
+1305 0 obj <<
+/D [1300 0 R /XYZ 123.806 378.374 null]
+>> endobj
+1306 0 obj <<
+/D [1300 0 R /XYZ 123.806 347.661 null]
+>> endobj
+1307 0 obj <<
+/D [1300 0 R /XYZ 123.806 305.216 null]
+>> endobj
+1308 0 obj <<
+/D [1300 0 R /XYZ 123.806 266.357 null]
+>> endobj
+1309 0 obj <<
+/D [1300 0 R /XYZ 123.806 253.306 null]
+>> endobj
+1310 0 obj <<
+/D [1300 0 R /XYZ 123.806 235.274 null]
+>> endobj
+1311 0 obj <<
+/D [1300 0 R /XYZ 123.806 196.718 null]
+>> endobj
+1312 0 obj <<
+/D [1300 0 R /XYZ 123.806 183.667 null]
+>> endobj
+1313 0 obj <<
+/D [1300 0 R /XYZ 123.806 170.616 null]
+>> endobj
+1314 0 obj <<
+/D [1300 0 R /XYZ 123.806 157.565 null]
+>> endobj
+1299 0 obj <<
+/Font << /F25 474 0 R /F38 617 0 R /F48 922 0 R /F49 1054 0 R /F54 1165 0 R /F47 733 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1317 0 obj <<
+/Length 2663
+/Filter /FlateDecode
+>>
+stream
+xڵMs8N{n&))el'^R.qJJ>$ksZ bAN=:<'
+M{U0鿏?aڿO8FJ&9հS55
+G() ƵR5 y?wLJۗ;|TJ?~xw= dd `rntoKAД?܎!T6ڧ}CWI*98o/ԋ?ߏvKʆ
+b6(/ִ VAlibںi߭^3;m<Lu=Lۻ&+IMA:`Cb^
+7gIhғ6v
+&F_5e>75QCD1(bfi2VF ޕQ(vQѦĨĤXaDhX|1yUrJr(Dx]'JuJNr8
+Ej-r<5JESsRmOMZ*B\E9k劁PTRw;F,f2Hԉ"w|kQԨơыPҷ@Щ];_F'9u`|Rv(ID(I r8D
+VkþOk`BlB_dC?JSv(
+R*wɵ9PJ9&b kۉ5((k6xT*}])hW*}V
+53)Vo2*1*ɡ.)@LsLr&DMkѧԤC -quJe<qy^>gtCQ'JuRv(tLԉ29":SN QI#R2kT;hT.LRy'
+'9}LΧȁOBji{j @JBBh]8/bCQ(JRv(tL29"BSP QI#2k
+mXoW0Bɡ(B)@PˌPr&
+EPkQ(ԤSb5\&\W P?)@PԷPgrrw-)`P_|BAjuAjڎMzkki,H$fØ1*&Fg'_ٻwj
+D#lā_unO;RJT
+vegr^`FLB]Zɩ*J*9l8J96g&׈@cץ/0SU
+PԊRwR
+PRy?
+ rkkQ)Sj{jA8RUF-.3
+nX
+P4B9"FSQ ѨI'6klbUYkbuf`hF)@QʞL29"BSP QI#2Hk@yGgqn^c(Bi@Pʝ(e2BFJ!5
+ %HMz/A\%͂RM.f)0O|։2,d"92CwBKCNi_9
+sY 00sYr&DKrfW2,9UHΥāJhBfTisf^8R#%&U00Y
+LTRy%
+&(er2ElFRNScG#$q%+Ea b1yfK:Q*D<uLNȁNԨBji{jȱ !>~Y| B1py,(
+EP
+.rX
+L29"BSP QI#;2k؎CTjuc㼖c)@Q(JRv(R`P 9JZHBmOLII(BYMy,(
+Eo'\7 )W#Sa45sg 5hq  ?;fKQ*V~ բpξȁZԨBjTk{jҰnk2r
+endstream
+endobj
+1316 0 obj <<
+/Type /Page
+/Contents 1317 0 R
+/Resources 1315 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1296 0 R
+>> endobj
+1318 0 obj <<
+/D [1316 0 R /XYZ 80.963 747.976 null]
+>> endobj
+438 0 obj <<
+/D [1316 0 R /XYZ 81.963 700.146 null]
+>> endobj
+1319 0 obj <<
+/D [1316 0 R /XYZ 81.963 476.983 null]
+>> endobj
+1315 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1322 0 obj <<
+/Length 4175
+/Filter /FlateDecode
+>>
+stream
+xڵMo~u{nDِ K
+M I1 Xv> $N53IE;ۏZ'{ɳ'§sfJɟvr>jh|NO^zSl_&|w^}맡[s${Umrw_}s]=vW/ߞ/ ._曯^ܽ|~b|M'{rˎdJ|=}ldM_j5)?~'vdPjJrb]օ_\'n{%hOLź4oq&:_Ϳ >O [ZLy~~۲մ%lc>qjCN˧^&N/~|}'d *՜qq~wc4d>$75?~vpa"Fz^Jk7)|] ?w|jWhDK4.u}Gv{X)'jwm7WhvɮcI8{ܻ%dTZpbj.*>mGFaC!
+>h5C=7 ID'gN{N2=9W")[☓B8-IEO۷ؒ{ƖBrj$ꯒҞ%kMS{Bw^iwo|W3W'^IE.MHl߭Ƥ'D\Fy(r]Eg*VZ*$A+M
+w5k{bd3mh4EB6ZdJ{BZXB(UEw*#VmUHVbjƺq
+V7<kc
+MJ<Uy,}T*IsNL囚lKMF'\'D:@&y$
+]%(X*-#PZ愊@{yn\y7/v$MHmjfS9]EY
+Q Q?&6T#93]%eLvuuf{} .ʑ8߱J&[^l,U!
+Ri*UFRi4)*,u2ԣR&93"gWVcnwi)& V`Fy(Z]Ejdh9
+IJB]V7.X= ʙiG,۳q)تB(oUE(XMUy6gU! ViRhUe
+MJ<Uy@0TmJU$PI!Uf䋄YM*D*z*U\?M%1v~?~b TKwGb]+-/۷vX{SS!B-˟70"[1*Q֒fޯ{8q%1zYAq|ubBT݋ ю 62{a34az}rC-_zcB&c3Ԉ {! 2
+ID&$<󳮒}f[۳Í zߙ*}Oaؾ|bE0Ԉ Wћ[ơB&+`rgH&WIOBvuѺX^_I
+Tg
+vJa<Y4U^EJ:ruBҤ|W3W'^E.MHq|nA,LƣQJ\U亪TVgHVjjֺq@^ψ}UMclM*1BlFVy{+⨕9
+IJB]Z7.h=1ɡI2 S0 a<]4U^EK6bmBҤ|W3֍
+XitXW
+mJV$`I!Vf','S7K$P% (J
+iJҜS"8%E!SfE
+e8@iP(T%
+IJB]T7.P=ҿ@e&?<c{ D
+XiǪPE!K6bmFҤ ®faz'K;/R5,1|^YjDgVy;,ڀu*$g|W[+RgpS7@,5`F7ʫhuU1fFYUHUZjq^_HJYLH.PyC(8ԈV}Q7*mTh#UfXx8q%jc[I?$@gT *T|@OWjD޼#K^EYkR!hu4١%Lkc@[^t6U:ԯHlOt> xR#
+h-)DQ> ir&H9ZGZ]ϴ螙ezt_gK:dI$yV$ZXBa-}6;{Y-;fazt_g̤
+ɋč*G$^OԬ2|M=G5UG8H\
+IJ25n,pt_gv%q<֨4KGQ"jTh#D ʓ&9
+ č?Huy8*R[> G5
+mHDy!$Q!yq^3Igu8ٔe?5Fy(:=
+mtHۜCy$P!yqq^'")UF}&./'54y&2$=#
+iTHBy"gPx1B x4?{"15f
+}FB&Mis@<i#(.@Zʋν75;)E7y4&}H&F (oPE4gPP
+iS(O"C*$/7n#8<$$]{B՘
+mtHۜCy$P!yqq^4"֙t^e$>'4
+uEÖ?E' Cc:g?/ײu:7exO iW(n"Us$<iC(.AZʋ <윜|0U*oP{OiDA!
+QdS#Cg^PHC*$/7n#@<kXv`{iD!QtSCʓ&9
+ɋÍz翚*IYĵ3kGeyr8ӈD%ʣ(q1çFA'"Mr :6nO߷[
+endstream
+endobj
+1321 0 obj <<
+/Type /Page
+/Contents 1322 0 R
+/Resources 1320 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1296 0 R
+>> endobj
+1323 0 obj <<
+/D [1321 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1320 0 obj <<
+/Font << /F25 474 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1326 0 obj <<
+/Length 4053
+/Filter /FlateDecode
+>>
+stream
+xڵ]#fWh+^w,Jpl!a R·zu4.?=W3;OՓW̧sfJɟ^S16Me:x}N7߽xz鋫]'ɝj39Lշߞ S=;ߞB&We)_)OՔZem?kZÞ[8F{*f*0əT껇?onC~oP]Lnb2ه۟ՠ<e](LK?`k;mI\;w_ތ1U.:Z~| ]1Y}09uW?vꁫ %`;_w~ Bf_v=)~_4l|Q 6w_}1Vo4D]gثm[&^?l&5({GQ#[ҷóJ>
+XLNe*c &'iz9"b4Ώ55ex ʣW1Dhv@ "o#$AIQ!!n\%Aܛȹh/By~)'
+p#p(oCFIrȓȡB;ܸJr798KҶ!5B6F8&SJ
+ ʣW1Dhv@ "o#$AIQ!!n\%Aܛxp}ݼ4lpw&9dQPfWXBy4B(/BVD F"88T|ְ\.0[ P$o|OׯTOZ&|쁾}&鎉Ǝ+&Ki J%KÖ]ӪzQ}(*;Uڝ|®;]wX]#Xt^[멶z
+NG?-x)w
+N'Ž!<%1#qA1f'PG"b
+NG;ŏ,(D+$I"O"
+.q*IP@QHF!1d2 HGI"b
+.G-Ky$8(ODD]UĽɁ
+юG/ShBF
+IbȓB;ܸJr79
+p * j$n]eg;9xkOvj4ab`fOIy;Tv<z̞B6r(OCDUýw (=Yafo~likfW1Dhȣ) "o#$AIQ!!n\%Aܛ
+˶ܼC{
+QȫBCKDy $7 MňkMq>Fݻ/`vO!JyW`|O#!%|
+mv'&X&XwtN3 X'Enuw_g:z) k#_{_M/iu|Xᴸn2*ZIśGqc J&O<@q26.xWQZ$}H
+UְT GL] S@^3NG?/
+SvGUvt1;ծS`ts5J1%it֔H7 S1^&xx߻ur a|Ioor LkwĎ씲Xx\И Jw S0^xx˻L|$o
+'U ߍͅ0"SHK!q-!-yh-ukop
+M20'o+݆%vW.%,Gv{&X|ψ=]t ^*j M0զ$X K!eCPOxڛؒp]#\wu^a(L[w}h0%` L!܁COxۛ
+Sh~* Sh
+lU~
+?ˀ);U
+?'X]ESc
+mbHBqplu`nL!I
+E½ދ84 ܾh4Y䘼Iyc֞kFycqĀ:qu0E&/!U (F^Dw
+ڃP\IcӇdr{)D#~'&B;ѻ'
+Qūۺ]s]瑮Ɂ.IƮI]ӹn_&ḳ"ΜwB|/pT3<ykorKkku|\}}
+endstream
+endobj
+1325 0 obj <<
+/Type /Page
+/Contents 1326 0 R
+/Resources 1324 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1296 0 R
+>> endobj
+1327 0 obj <<
+/D [1325 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1324 0 obj <<
+/Font << /F25 474 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1330 0 obj <<
+/Length 4365
+/Filter /FlateDecode
+>>
+stream
+xڵK>r٭"xs GVRA,;W`!؝lks8?r$vᛃ>_}a5`ov0֩!Ylo?|3ۿ˗`>>g/>K橺KAdyۇ[goޙ[s_/x—^<{x~\SR6nzxa'>Sn>ub3TOO}P˃Vnʇ嬂w埿;y'z9h1R0bҭg>Lq;CRS|zeB{9|8(_| ^|eU@&͛]ʘ,w!*=}vO?ͱ9mӈ0H5rmkX?MlۇƮ^cy`)+k"VnOךx/>>;fUB"2>o/^:}Ԓ[Uy߆.O9wn~dbÚ.[c>;ۗ3ÍФrpSɩ|`r32>_$&c1t?"3}cj Gv)M_iPCh _8n _Ɇ/ԋGguOHH"Z)/%pt9]8o p't )]Ɇ.ԋGӉ/W>_8\_@Ѫk~#@ ׏wі>|g
+D+K}t"8W+%[&0<T.g?ޙr/WTW<{بu"^15
+DWʯW\^?=_NqHV8ʟjg"H,et"\ͤ2
+4VʏVKMP巁*jSW*PC-PPZ:XD%UU0M}dE;JM0+R4i(;X (w!BjmA>-"a*MBÔPbt
+TM*IڕM0H.P7ITpMx>3D>
+roq(ԧ*Tqt*
+TqϧmUdL;R4)'}4+ߨ\9z)׏V*XW*UKX*nSV*N2ZjuM3/RN"j.IY~3*Xqt+
+Xq:+ Xq*Xq?Ղu0T6P. |V}ъGwW'ۀ)Ɋ'XS-XwC:kS;/-wr֧}ъGwWk ۀ)Ɋ'XS-XwC:kqq\qP4qij>VhŊ;XU`"MaHV8ʟjs*^-mu&*ŚRK(Vkr) N&(MR~eʨ@]L!>GkmX>-"*$[wcצ@WV2~|,4_͛^Fq  0N.wnbE8k6>"*' :(Y)Ѭ
+qC~E;:)Ɇ+ +G^g2}I5|gW~w±SDws
++M>őpJk'hI$%7pm XHEQ.J|S?)ѬqKbק@$(S
+qx)8lO3#_$u&x߹)Ѭp;՛@DDx7nR) 'oͫ+|?E`E%UZO&(EV{ ѩ`??SYU߆w~s0 :߭S Z$M񱿑OYV1.ϻ|[><>zb4xO<l\}]?2>u|E\Z _ުi~hV_8_8<op5lOڙ~d|V'rEB4U>:|oHV^];?wdҞ-~l:EkؠzE\e]?1>w׷"fR"[*?7NfAOYSƂ S܉Q;VR׎Ocݦ-*szexyy}oJVU8W8`/sσ,d&S/vfՑcE)_<wv(Kq#T^md Gwy ?x ?%0kgcd|R۔2rƛl:3%^mjl~竱M26lOhloj3MX$]ϽDtS<߰%pt? p!\拟_8OM6|^|\}]?2>C|Eb*g?/bXID//~SF __;3W_׏j+,HHJ;|h (ha2_<yh?kg׳:+*?*Iu𩿱I"Z}%8(˶6 ԁS˧7@ss#^[ޕYd~{lM
+$OM*qM^+ q _I 4q4pşyqEN\U]?0> wϭ"6(:YM#;77 4*ܼMb7nj&HM`A=" OߚtNy>$K $ҔQI.
+d>J\Ȫo>޳_Demޏ>1ID+@3B
+qu]|thlJX^ 1AE4|Ie'rϟ0%<9f0^yM4ϗ
+M{;yȏS*~I"DisSƹrZ5S`s3S Yyn;S$<m{,"'hW6'm4h剣;<U붴'P@(O͡U(NBGm{."3݋MIuK𩿷M"ZP~꺱mX("' ts)f`˅S/\Dw>BcCݧ8h;BU;n(
+0q d0<Lv`n;%0q9kq*[/1%*Nm3d3V8c_
+qx J'? <7GoV8I Y,*2EA9~꠿AP"ZqN~p*p($y
+'Yq$s4faķ_)%u.gm9ӺKa(@qt(
+@q@@P~n<߬@q
+"Uo(7,MIh߽-_w\W-p4@ş~f|*=IZDP%w*%ҿM
+pXm` )[Ɇ-33K\ƂHl7"S>Gf_=M- P4Zlp]9M_#9'[2\m`
+V ޸o{hVLIkb7ӦIXb.6zNVz;Oh _ 7)'{ޖw<JD+>}[c͑R N $ I
+h?uU3tUud?rVu}D?  ~Hfb_p\'}IϏk)q8l)*sw,bJmg֔3u}ߗ(qt#? qz(9ǩ';~8$őwnd8l#cϿ?qҽ
+endstream
+endobj
+1329 0 obj <<
+/Type /Page
+/Contents 1330 0 R
+/Resources 1328 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1296 0 R
+>> endobj
+1331 0 obj <<
+/D [1329 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1328 0 obj <<
+/Font << /F25 474 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1334 0 obj <<
+/Length 4096
+/Filter /FlateDecode
+>>
+stream
+xڵK
+.T^ջHC81P$E0K.ŞS<'+]ip82yw>3SJ~ﻘi/w&7nonyڿiwnWۿîɔw~{{ޫ5aɟvVbh?֔njJrZemZ5׉[Z8F+f*Fga̓3Ox~wxAua2=d|~w )FgJ^z_փm%zpmϮo~XhW'Sk9B6bʓ}09o~\#mWE av/7FfS0ƬN|NO]Y &oM`=uiR}l?,T65zxT㽔LSHƖ?دxET,m۞ދz%vErŚ2<Vƣ ΣB{2mpm< 4pT(vǭE9W1%'dlM8N GyiuGxHȽ:HGyiP [ -bJ5b>&`Gƅ/(<:
+3mxmΣ< 4xT(vǭٔ͞KldJ (#iQކG<ʓHGb8Hxܚ\tj[шDO&:w GyiuGxH686QGd8*;E"ϯx mo?-7;{3Mp$u]#icb0HҜEyIKĭT~ְÚ뢭qQC\P
+i 3PZBZJ0H Bq\ n .dXt4%$48MڀUڠB+<RtxCvxf$*$ų5G5nN.:pQLIDm`m{hGV_Q
+i_2UUۚ$CC\$ ^D]Uw%Bۋ/dl)-?~>OpB88Glk|h bMvtUCF>~1kߧ=CL1Z%#Ke~%Br&/Eɇ(:4CClSk5% Q)Zq?}Q(D@B;Ɠ< O4ɽ SHgɻ<.LUSўM
+ǿ2"~'rx˶p)85yiL>4ѡwp[=}(tNØO
+QՁ0jFq0FmM^
+ a!Ύ1uH*=ƗV7sN!
+a:Ph!m&Ka!l04]?4ٶFw{7|{sSB)T0Z}[ɇ0:'lkR|h aMvvVYO]$=>mϧ6&B"ч|"3p/ug.~f~f|n2ҏ_g̉4qh󫯏 /q]܏޿~ơƙ`}|~ gp[pq[j5lUa0蜩sM!
+W̱Pj7H)aƹKUj04\]?4YHX&[dY&;0GE7rE˫>.g^xɧ_4]#-27'RŒk\V&g:0]YuFƳ?*ĻƳ8QϒFƳ"qkrAA"F)ZS"nn3p
+Qhջ/
+Fp
+II< ~4S(v~mRK;ܛBhŐ!iY :4:O! 4hT(viܚ\TU8~`5v>~`)DV]# {(#s/$0$Q1.&dSǹUֈqO"H9)FZcTw4m<4a'&
+Ŏqp5
+}0T栜BBCkO s3(d*@okpq;o5|2oi|5S 2'Mѱ@y5_'OC MsEE< .
+77Ib?%\j]_՞)WM*8z`)DV]! ;66PCd*;E䢁 <M{ɵ}nnS"-*E^w
+mXm΢< 4XT(vŭEW#]QY}sxO!-U5kN-
+n,EEv5!ZLc~
+QXձEpHkN Y'a&
+nqp5h QqQzk߆b|T"-*E^w
+mXm΢< 4XT(vŭ]WY=mJoԞM
+QXձEpHkN Y'a&
+nqp5h ^z_W5Th"?I!>PFR,n-^ڒ [df܂ɖދYhOb66=sPބ,]%x
+΋W$n-^ [ꑱ3ЅmiC
+Q/\
+.
+ur<Z4νpmM^ڒ \thC].+CCՐӉMTBPh ϱ,yh5y)K>4dѡ9YMv\WYõ?Kڟ{怟Bh5BâQ< N4q'd~ۡP ~[۾OaN=&ϧ~
+Qo 4H;K]򡡋~hnrƋOuO3]YuK#,=B:3/uFCw\ɦs*kT۶]U_q9.ZRw\4mBhõ5yK>4p &:OQ CF&p`o1GEc\
+ᎋs-yh5yiK>4l &{: v!^#[Ӱ՞p=sXN Z$:H;9W[3?3X]?sΩ"3FL:vɟ΢vVϝܷàEc[nE9Ζ8 Z4X%##&Qa{8BhuJ!]0ds%oms&/eɇРudO$f!]OVe;^OOzZ< ]<֥h_0钷9][CC`h~h Q)ا';S{-BhulK!m0Z%oms&/mɇаudOmc/
+endstream
+endobj
+1333 0 obj <<
+/Type /Page
+/Contents 1334 0 R
+/Resources 1332 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1336 0 R
+>> endobj
+1335 0 obj <<
+/D [1333 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1332 0 obj <<
+/Font << /F25 474 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1339 0 obj <<
+/Length 700
+/Filter /FlateDecode
+>>
+stream
+xڵMs0:VZI:dHL&
+npZLߵ$.4=cyגR|]O[kH $H::Iτ0
+B0V#GiKAgSH:KVOtOaq;, WQcIVt;*nOA
+G
+8voeB` \\F"C%:P
+U;d+Iه]I0NQ.ApRkjԬGu~]\xO4)W`܆m+8ϳ]>&kEiIS;l9Χh%(%ż:'v\T~v Ƿ5PcXPrmd^7Y;8?Qkmvpo\BE)ʭVAukM8 3߆wnQ#J:)՘o,-[ c٪եԹ նQqhh-yr5sPo]]U~w5?
+pWs]z+]UoܵG]k4on7&?cJʦc'd5g5H@<プGOPXynLOb]~z2ˋDq-g|54\NeYƗW^;j
+endstream
+endobj
+1338 0 obj <<
+/Type /Page
+/Contents 1339 0 R
+/Resources 1337 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1336 0 R
+>> endobj
+1340 0 obj <<
+/D [1338 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1337 0 obj <<
+/Font << /F25 474 0 R /F40 648 0 R /F36 596 0 R /F44 651 0 R /F43 652 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1343 0 obj <<
+/Length 2745
+/Filter /FlateDecode
+>>
+stream
+xڵKo=
+,dmM§&] SOͮ^'J0q "ãdWSc<'c<.ۚ1OM&c/F&a/\-}$cxZc
+ad%c[3dSk;װĔ c}_bb+%c֘B~u8q1|j205{)>5Bb[ŘJׂ1064?WSc`lskc
+ScKSctm|'Ї5hϦfSJ(յϯ3Kƶ&gS˧fv
+Q(^P: +bxׂ+pśgهx*%W
+،Gdml~a3CT6n-q5rb5^9AMTINyT7I
+lj)KN`ʋSx(bʇn,HLaM}N YpG *PC$z?[*'<
+A'ATdua#,`g_5^R1_%u_xLU!:NDUU*$USՅ [Hlm04x͇;7UG +X$z*~Zd%
+a'ATdua#䬑+ ^?5^>5~xlU!:NêyoUޖ*$USՅ [FB.3x 猷YdӏϸFg`U^*DItXUMVy[VyOEV6nM6555Fs=S_ V(YU٪BtXD Xd%
+a'ATdua#䬑# ]7kbE.d
+&GT/BsPTEitPMU=NU$QUjP]ڈAusrWX ^ZS8'1H@oU*4TP
+Bn>ycw±_(9RPP'u'd#a'ATdO%Yݚqҟy*kjʝ |{x3AN*D+.xU
+uWʓ W|*ʧnM2
+T,C
+Qʫ \뤺BBrhIP+>i]Һ59Ĺ Kpe\ ޚGpX!JZyuABuhTVV*$VSօ [JJJ4x [LjAC&U:
+Qʫ ZC뤺$BU!9$.laݚEZkV?]5kA8 %*cըꊣ
+mVʓVF Hl04x.(1 '*.PUN++T*Pyt5.l1Z8QIN+ poR]`GIt`<MJyZbR^C҅m :x5r6.6͸m pWILyuBu8TW
+Qʫ X뤺$BU!9$.laݚE}kԟڤp=bl:N+D +.`U
+mVʓ V|*ºukrI45gFj/&7:am+D +^|Vʫ'<.0ܜOM&Z/]&?\1ݷAG.RZ'Z<.ښOM&Z/]n-ƿ0?~/q6
+endstream
+endobj
+1342 0 obj <<
+/Type /Page
+/Contents 1343 0 R
+/Resources 1341 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1336 0 R
+>> endobj
+1344 0 obj <<
+/D [1342 0 R /XYZ 80.963 747.976 null]
+>> endobj
+442 0 obj <<
+/D [1342 0 R /XYZ 81.963 700.146 null]
+>> endobj
+1345 0 obj <<
+/D [1342 0 R /XYZ 81.963 476.983 null]
+>> endobj
+1341 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1348 0 obj <<
+/Length 4230
+/Filter /FlateDecode
+>>
+stream
+xڵK~E,̺w dXas1ߧ&dxzz{]a8|{7o~!6C Ʌ:޾;jL}7tɥT>~͛/x}kzt75Wmy˷O__}z_oo߾~tnd鋧ǧW_<}p|?~_:/: ._pb_݋|`:ҡJ?gK9ι atc!NiՍuG4E]|6O}/]eR)|?|׿,\?)P+CZ<we=y,17?;~|m{yf!M%n`8K>xgq:1I6B("CJ( M~wiњOm}Y`Q qpz~/qLo"K?Tp.8Jͮh14F7}v!S z*AJuTZuG!ZEe%Z2A 2-Y}-<δd\7@ ƜS ɵ(&ҘVShDn«LKVG 3-hM.g}1gu傎CU5eVqx51[EAd,ʲdy8˒qM,|gYs&YOyZōy
+A:*+ֽB Jdt^eZ<ZxiɸFkor>39˧,tnWQZtDQe%Z2A 2-Y}-<δd\7@ ƜS :C$- I+uYM%?S\Mv%4tuJg-_y_8i&X"-&l } LyZ!#b8jph} *dJ&uThIɤ0o?|h+Ϫd?*P3&Rraԥ8
+˺E(YQ"e⯟"g2x)ʤFOō${
+o3CIv(C<I7 .z`4zWV~-g JQrXᬭ84HYRqh<;:ȳ"|]D8RrqJ?]h$2Cģ q%Ulk$CI "$I/7Rlv8ö"JeTGY%xoT(q(; ǻ 5x,n%Y\0Y R'ߓ]nXh%2[ģlQF':Fe]È'5x0n%a\&RM0Bw/,QF_~T4U(71fջʆ O9eA}NoOT| .Zi>L|i ( x}lSqavk<0O9'děS&{(*Cf0\Lc]M)8(挛FtE)ϻONQTl-6{Al8Cp~ګkOLܐ6٥lj\\AV9;KH(ePQ/,a@7 2&*ڴn}E\K2eabrBM<8gg^É7L*<Y8Av6?}]a%252PY=>s^`B TNHjd3
+нe9>H_$hnϧ6`}EP@e)]
+ҀI:;PI@eR7£w$W7-[ ܭo#P
+u*qtM'E9%7lM952i:K<.9TER9{s<zkABv bhn|~}APgOJ(eS};dy}oq<g$\3
+(<ɠdRyN3HҫQ** $p(I~AN+9,'t[O_TZ4
+&rq/{ŢA,oCEf(BτËdO?DC|ͭB*Q~M':=dSS<dT&x΄INYt%\+u`1H &"_wȰ'9Q$Dٓjf{ YI,r-Cb4}ZXD(sQ3H IF5N{ YI,G7 'm~iǻ_%EHɨN
+2)U&MM(|$jc$9u\6 oԐ\{HXDI(Q9
+o(DM.gM6&M.\ n2 9|Ƨ Ӟr~,2YTlO&5Pe03IAsx@o F{ևl|˯ߥ"JdTGYjidQڛ\ϚDmLD]>g˘p up9Fwm,$JFuQxEɨћM%QIƤIs8ƈc)C_D7ޯIDS7ٓhjidN"i[\ЄO4s&LOp_XA蚷رspu.߲IdS7ْlj'ْLjv,s&JS&KX.=
+atC3cpô"JdOx= o'<Iz,y|m?\}qƫ?\< ڻ
+endstream
+endobj
+1347 0 obj <<
+/Type /Page
+/Contents 1348 0 R
+/Resources 1346 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1336 0 R
+>> endobj
+1349 0 obj <<
+/D [1347 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1346 0 obj <<
+/Font << /F25 474 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1352 0 obj <<
+/Length 3974
+/Filter /FlateDecode
+>>
+stream
+xڵIF+tu&
+PۄtI R^nNFEOCpf}Uos){xo Ι%%xCLشƗKzۛ^Ƶߴwwr8͇~{kR9Cդڿ>O7ZRMINfq
+\=,T|=NYg|;yq&4~B|'Յv65d /zsd] LWݿ^|-=ں-iЃk>;6FAZ%ϯ_FWLVC>׎; a[OϸDt$ dv Bgcٟ}^( ná.xl>W՛,*vkXT\gͶ?kWk1jeY8D6t,ɡ㩛rABζەoG`XL-a8 ԁa
+n݌ax2 En CadЬspv[O6C^2lM\ A2Kq@2jS~F2<ICH"IAhlhXFlcB%;Oָɲa8 ԁa
+nÌax2 En CadٹeϠ
+5B6F԰SŔȰga8 ԁa
+nax2 En CadЬSMpа+E\0 a:0L c1 Aaȭaxh2l u+f_c׷b_ LA~)@_ z3zH/Ak LvəIr{P&S@֦BnBdgԂ],< 5j&ɪY/'`iIYRd*զLVeݫ }e4wb]@|Y#d,26~m4NAvWEDmgT jL6 PSe]>}ׂ8TF6&xhɧY'65J4 J1`͂Q8T(h7C %8T"BIAhjhUXF>MBb|O4l¡$B)@Pp( šPȭPxhj5MZP)Zi
+$B)@P*ޠp&ęOȭOxhi|q^\]O1=$L/TO*
+PSe'=z'I>q,r|&>@jm΁>O>ua֠lZK
+Ҋ<$H&DɣY#<2y$F&Gfݛ k
+$8Si M> BOC>v.53\鳼X>];'J>qġϿu©dJF"F(Z, N4eٚ5Fb>mCk¡d>R`v8o?zy_y
+)H0""I0Zlh1&XFנ!X
+u`8ۧ-K IdO!6&xhɰYga;^ðۛ-a8 [I0f3&8[y>j&IY;pծJ PЪ5zyEz3*{*f1?%Wz5K
+g&XfɧYpJ ƭ}tB$g~+͂%| f xp%fl*5lkž9SžI
+Wz+~
+MZM\Γ0%jbJX5%ҰV8ԗϞ|)fq,L
+pRÅVȭZxhRtJKPگUZ8ԗn,Nfqd,rk%f5*5N% ![cuEبLJfq7ߝA.p<|}~ӇkBOzqG._޸LuDaj4TpJM.Ї..e
+PґS:*|޾Q\H<H7Y0<4CK7YgGpѯJКi (z!YۥvFfb]P-OjxV7 ܊G&ҍkd\R'R,$8t,^qiGI,ΗԚ$n͂#X<ȬK@KE Th-d5SY:6K`z,Ojq,r%f}u*5l2kl{~Զ[ǘ}R
+LҋAv)p]KNɅI.ܚ%n3[,̬pvMNs}FZJYMp&šcpn7s#`<ZĭYpdG]@)j͋rJɕƒ0JJjqX-pw(i
+.@5ꅇ&xha
+5v
+xҋ%f[Ф 4?4kDX F&0ʕ`*LR^:K`H<^ȭ^xhkuVqs\L*LR@\ :vKb\H:YĭYxf2KLb:olXF\Lu
+\,a$8tlbq.7Kx$N'8]2k L^ "X#~N5ҴXf?M\W%WaԱY
+sKn"rɮAhkh>f%bl
+NnוU
+x%f[$ 4ɵ?4uJb0ygvk6U^:KO%CiC ̃FnCb<Ьܺb{x5}{s:
+endstream
+endobj
+1351 0 obj <<
+/Type /Page
+/Contents 1352 0 R
+/Resources 1350 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1336 0 R
+>> endobj
+1353 0 obj <<
+/D [1351 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1350 0 obj <<
+/Font << /F25 474 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1356 0 obj <<
+/Length 4186
+/Filter /FlateDecode
+>>
+stream
+xڵ[o{rC"`gsZ&L ȅc99HKm3;UdXTh7W=cݜs8<Ctm* u><;f.~!LnjK|o>?Śo]M>o~<|7S_t_O_BÝ,y_`:eGjگ޿ӟû9L./}b_,bu>C٫.-Z8sEOKi:T7ɿ):?>wӳԧ˻W]e Zu >ۯ~ZCLi/c"sqz-JfQM]sf%M%ϳwk6ͳ&#θ83^#П뤭Q |bCJ 7˫0g+K;kΣWt7E8ۻ\cy̮l-y|yNSv-^DK.-Ƿ8:Gfz
+2EJuTWZgr-u2h.ìK_ޕP⋲m]xuɸ O7Q޽N&qIqopA) /kbL.͙9mM(cx9/ۻ]y_*">}M
+0|j6]?q |Կ/GXf$`2: _ 30׀M
+*tb"5L];y8x<g㌚ʡ1 "|u2SAx^?f0h1`f}ykԟC?q_o2/Ke<y
+/|j5x]?ֵθ |Q/̭Z]c LF0r0<d^7 &`,u /R jKu!- Jdt 30~ L5`{+ `hvr[O6Eru*ŵG60(10<dxk^g_“'?oϢ2HGY>jwp]A3N _$Ec2!Ө,QF0{ax<j#g2x9ʤO${bL$|;`± ~>"Jet3G^8z#g2qēQ&5x8$q\Cz<, 5M8 ZI¸$,S\Q}[p)k
+ +\A<HH}ǃ/ҿ"|\?|$a.& ͱAejop ʴ.2BYER8xpgo}qA"SpSM< 0p\/(A1D<e%E"fQēlQ&5x0$a\3]CfjR}/y?lf=Y<-Y-mmxV,$YRh<Y=ȓu9@iR#yiS,QF0ka֘x5ʶOF4I8xqop݀//Rbqgrxq 4(iѱF<e5fE#fiēQ&5x4$i\30
+BXLN1J \VhFcÌQcQ0m(F<eRÈ' Aƽu)eH\h8х>"JetFfUшYlk$kIM#$I L-Eb4k_)7/צ?ng$2:ƈ v7dW8u(ip+𩉗ZurSWrErboY܏'Y$Ihq]%˝4ZxiF" d3G9,ggugER%cVhQr;0MfS2\!NLk畻xB/(Ydj%-Do?\}ELfU2
+LÅlk&WpSЄι.EJ>8=<ϵ0 ,L~`0d[7" &a,G/ Y$W7Ek^&7-ז?ne%]2:օY 4]xuɶkorE>5 Myӥ?°X$Wj8#KϮ.ìK^`.ͺd[ӵ7 t &],tB/ڶY1yRI$Dz,Z| 0^fWKYS7
+T#';٣a,M1u
+o)$Ua^Ǵ8˒q*?.Y|E: 񬨜I nߋoooA8$x rl \h4G#^g.<~I$
+1|n6&֌]?5&3m.xē1 J8d͓~G KF/A]ɺr;WJ~f=z "VJ|2-mQ%Ͼ}) ؗ *&W|S/9A宮e6LZ쓯)\ZQ%/<ʾdpy%ڛa2}“Q7u d?{y~N.,m{;ZDOϢ*F(a<^ dX4Hųb yxVܶ;.`B϶YMy,dcgiNQ(E<eӶ LQƕ+1H2E(I8xDqop@_N.W(rmiQ(:E<e3 LQ5x)ʤFO${
+endstream
+endobj
+1355 0 obj <<
+/Type /Page
+/Contents 1356 0 R
+/Resources 1354 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1336 0 R
+>> endobj
+1357 0 obj <<
+/D [1355 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1354 0 obj <<
+/Font << /F25 474 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1360 0 obj <<
+/Length 4103
+/Filter /FlateDecode
+>>
+stream
+xڵɎ<E LL6)ق Ñ-AЁ&iA(y`ɉ?&?VYm?ያW}9Rۿb*Ʀv(>_V|۫^'j39k|x}_ sVb՟쥾Ւr$ǎ{f3iµqcC;V;Fg4L*4Ǔ!^O ~65f>g?| -FgJ׃}%zp}Oo~ec4ѫtZz ]1Y}09uۻFG{#v$4qg{I62C|L~/Xws b>pZm W7_ ՛ښJZ>9gOeM5!S_ i-j$cOOh/3P iG,^nH<F+a9skj%PE;TCEq(oCʓ&
+Epqp69\9W!)BY谝GfkbKsơ<iw4 PF9'!M2p lr-bC1ba2)"8,q(CZ*D!Osۏ2qH㞁/5[$ya$J8J8}YHaMQ94SJ
+cd+6[M 0y4h-Ci.9`!3sxt(N# /f/j_HBPV1]Ba c5qF`
+I3:&EҖQ,UCG)G>0:QA
+˓UOh&9KFKFK4Yť4qOR)&[
+QD'y9$I!yyon<~i/phlrbC1껬0#`9(:՛B&PD41M$4jژ4jz*%H4>N)Zc`iGQvM^sl
+a E)yI$GJ! l4MFGgC%#BT)ln<i D*@U`(RQ}QI(:iN'MVrQA<F!*dy.&(ZPQzd<ɓ&6$< *p(lr}!1|_i<W!/\M|KϷ*cP^FK{D %2b?eb
+1oPf7dbO[d<ȉF|{4G¥GhS%/-^dm?/Nr浜xNȔΉ{ܛ,}cXolU\&c >@GQ*nHUUZP
+uJU$XIU+u69PL~('"6gtfʲA凭*D[ը^`7a
+q35¤y
+UJכ{`*msV`&eVB&Fl?YLalMQj>0
+7XG*nXUUZE㪼Vi4)*Z8hu694c;5(l)_:*UZݰPV=cUFYUHUYO
+n:5}^siˎ*UZݰPVcUFYUHUYO
+n:)}*cv~+ޫ;ו##UD$U!
+PIFƩ<NIcP(S**"-qu1\3E[7n$ &=(-sBAI2)!ύs>CV^e WpC]vs.s](
+
+U0J{nF)UHS9O
+n:»k*܉7ZY*s'^(ZUުF[**m3V5`&EV&V7XNRc\4 G\꛿>q^?cH_>M$0]%9S[FS4r~ԐyPSRR0U)N82*4~sfQU4R]:uR]$ܒ~d
+ KS/A82*4$4z\8zqOD4xT(ǍDɡ'/j Ac.#82*4#4[8zqΣ<iPgTTƈp/
+MH<*#﹪Vi(O"Gd8*A"Aޗ@eЉ8Bhfy\/PDKsE4P\{.U(#ĥ1d*
+qH{uUh#E(ʓh&
+Eqq69t#P&}z̵TwUiuG8p=*#msIH G"p8H82)Ijҧ[_s˕GU(x\UwyԈ_<{_UhU5[ CYxO1j<ky} E
+QH<*#VUi(OGd<*AA7@e{O{ QVyTGs=B=6QD4xT(ǍDɁ~PJl)^0(D#/
+u
+Eq(r69w
+MHğƖ#CG4\+>[oJ<e$E̙zq)uvB
+cř}H&W?3_ӣETʣR*%6@aH 0fm'褙/ L$v!4nn}:YA(ʢU^Bdί Q#+I|HF"0E1n69$[UpעqrOcn
+QH<E(P} (9$JIFB$"'q69PUưdF{SEKTD<i{#ED4@T(čD!(=1k}vl
+Q574
+mtHۜCy$P7&?(6$X;/K0}UE;TCݳPis(OCd*ApĆcdk\q
+߰X6Pdf_B(P
+Is~B4"$iΠI!!(ң1Fl:pɟ' &Q^
+itA6mΠ<iAP
+gXtߌUϓ lA(*U^B
+mTHۜBy$P
+7&HUppޙB^2;Vy
+QpH{v
+*!msItHC"88Ht84 ~?q
+endstream
+endobj
+1359 0 obj <<
+/Type /Page
+/Contents 1360 0 R
+/Resources 1358 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1362 0 R
+>> endobj
+1361 0 obj <<
+/D [1359 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1358 0 obj <<
+/Font << /F25 474 0 R /F40 648 0 R /F36 596 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1365 0 obj <<
+/Length 686
+/Filter /FlateDecode
+>>
+stream
+xڵMO@{GoBD! 8" ߱ dg}wVՇ O[V@d*E)o *4:?QV [tQ2YdzNf?ȇafҼuLzvQ .>vzy{ZD0^u6IãްMzy#1
+ixm@-j#:Ί_. #f]1 R?xd,6\5_|u,;m ?׈X6 ڈ][` 2鯌c:*i}Lj66vuYwͪYL1޼YZWVZJ<.}- Q&dJSTsV\DQ~s|?_IiY<Lǣr|1)>
+endstream
+endobj
+1364 0 obj <<
+/Type /Page
+/Contents 1365 0 R
+/Resources 1363 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1362 0 R
+>> endobj
+1366 0 obj <<
+/D [1364 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1363 0 obj <<
+/Font << /F25 474 0 R /F40 648 0 R /F36 596 0 R /F44 651 0 R /F43 652 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1406 0 obj <<
+/Length 781
+/Filter /FlateDecode
+>>
+stream
+xWMo@+^~yw{TH!5UEl'ARYIK$'<v߾y3c\ :oN00FRDD*MAY\[%{ZG5 1`\ZQ!SF 綛f iKK պtE\^мX #Ƙ
+3EyUfit I*dXqx#mdPC
+'1rK(0p j&|y;' fx I,qXp7\sap Erhlu_
+rõ
+Z vu c EF*}[-J2W9E[}6l[gX>'(t
+endstream
+endobj
+1405 0 obj <<
+/Type /Page
+/Contents 1406 0 R
+/Resources 1404 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1362 0 R
+/Annots [ 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R ]
+>> endobj
+1367 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [167.863 438.258 419.607 450.213]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://download.intel.com/design/MCS51/MANUALS/27238302.pdf)>>
+>> endobj
+1368 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [167.863 428.296 419.607 440.251]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://download.intel.com/design/MCS51/MANUALS/27238302.pdf)>>
+>> endobj
+1369 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [167.863 418.333 419.607 430.288]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://download.intel.com/design/MCS51/MANUALS/27238302.pdf)>>
+>> endobj
+1370 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 348.315 418.245 360.27]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc0368.pdf)>>
+>> endobj
+1371 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 338.352 418.245 350.307]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc1001.pdf)>>
+>> endobj
+1372 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 328.39 418.245 340.345]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc0265.pdf)>>
+>> endobj
+1373 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 318.427 418.245 330.382]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc1920.pdf)>>
+>> endobj
+1374 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 308.464 418.245 320.419]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc0313.pdf)>>
+>> endobj
+1375 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 298.502 418.245 310.457]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc1921.pdf)>>
+>> endobj
+1376 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 288.539 418.245 300.494]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc0303.pdf)>>
+>> endobj
+1377 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 278.576 418.245 290.531]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc0375.pdf)>>
+>> endobj
+1378 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 268.614 418.245 280.569]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc0811.pdf)>>
+>> endobj
+1379 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 237.52 418.245 249.475]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc1919.pdf)>>
+>> endobj
+1380 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 227.557 418.245 239.512]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc3053.pdf)>>
+>> endobj
+1381 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 217.594 418.245 229.55]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc2601.pdf)>>
+>> endobj
+1382 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 207.632 418.245 219.587]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc3286.pdf)>>
+>> endobj
+1383 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 197.669 418.245 209.624]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc3390.pdf)>>
+>> endobj
+1384 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 187.707 418.245 199.662]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc3390.pdf)>>
+>> endobj
+1385 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 156.613 456.343 168.568]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc3c0c80904bc57.pdf)>>
+>> endobj
+1386 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 146.65 456.343 158.605]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc3c0c80904bc57.pdf)>>
+>> endobj
+1387 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 136.687 418.245 148.643]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4184.pdf)>>
+>> endobj
+1388 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 126.725 418.245 138.68]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4184.pdf)>>
+>> endobj
+1389 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 116.762 418.245 128.717]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4184.pdf)>>
+>> endobj
+1390 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [158.034 106.799 418.245 118.755]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4431.pdf)>>
+>> endobj
+1407 0 obj <<
+/D [1405 0 R /XYZ 80.963 747.976 null]
+>> endobj
+446 0 obj <<
+/D [1405 0 R /XYZ 81.963 700.146 null]
+>> endobj
+450 0 obj <<
+/D [1405 0 R /XYZ 81.963 488.938 null]
+>> endobj
+1408 0 obj <<
+/D [1405 0 R /XYZ 81.963 449.217 null]
+>> endobj
+454 0 obj <<
+/D [1405 0 R /XYZ 81.963 407.374 null]
+>> endobj
+1409 0 obj <<
+/D [1405 0 R /XYZ 81.963 370.442 null]
+>> endobj
+1404 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F39 618 0 R /F44 651 0 R /F50 1133 0 R /F36 596 0 R /F41 649 0 R /F58 1221 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1412 0 obj <<
+/Length 479
+/Filter /FlateDecode
+>>
+stream
+xՖMo0 :ԗ%ֹI"X
+Űnw,Nߏ)0 >KRi:&G"zt*49 ,dńqr_,SɔʂvXLgq"S'FJ~),cN? 42vyfLIAaޫY%E>d!(kı '6w`(^`Y]["eZIWn"6Ccq87CZ2M2cXfT
+endstream
+endobj
+1411 0 obj <<
+/Type /Page
+/Contents 1412 0 R
+/Resources 1410 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1362 0 R
+/Annots [ 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R ]
+>> endobj
+1391 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 663.726 498.186 675.681]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc3c0c80904bc57.pdf)>>
+>> endobj
+1392 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 653.763 460.088 665.719]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4184.pdf)>>
+>> endobj
+1393 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 643.801 460.088 655.756]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4184.pdf)>>
+>> endobj
+1394 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 633.838 460.088 645.793]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4431.pdf)>>
+>> endobj
+1395 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 623.875 460.088 635.831]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4431.pdf)>>
+>> endobj
+1396 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 613.913 460.088 625.868]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4431.pdf)>>
+>> endobj
+1397 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 603.95 460.088 615.905]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4431.pdf)>>
+>> endobj
+1398 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 593.988 460.088 605.943]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4431.pdf)>>
+>> endobj
+1399 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 584.025 460.088 595.98]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4431.pdf)>>
+>> endobj
+1400 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 574.062 460.088 586.017]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4184.pdf)>>
+>> endobj
+1401 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 564.1 460.088 576.055]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4431.pdf)>>
+>> endobj
+1402 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 533.657 460.088 545.612]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4428.pdf)>>
+>> endobj
+1403 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [199.877 523.694 460.088 535.65]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.atmel.com/dyn/resources/prod_documents/doc4428.pdf)>>
+>> endobj
+1413 0 obj <<
+/D [1411 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1410 0 obj <<
+/Font << /F25 474 0 R /F58 1221 0 R /F36 596 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1416 0 obj <<
+/Length 886
+/Filter /FlateDecode
+>>
+stream
+xڵVˎ6WYdI])2Yt@-Q2aHj" yK^ջII2'aES/$ͽe7!^yZ;eyJ!RhQy>
+iESwUK{`wJ͊)DakQY[ h8zmm!Et L]3K+Qm
+励s'~
+i(ȦؗR
+5G+Ŷac6ߺSZ/ 8 ,txCw]L~d.wegH wjVjVXXwj}eM}ZjJܒ:HY#(+AZW햇Ŧs#_#rVP\e=BT-Ho Q͑*BBb/k2W\0Ȇu]۽V
+ψG 8P>
+OHP(P(8K^}Ȼի
+?7[\4zԽbPz3ٛlCzc]q7-S2ObiOWr~z?|y?x
+endstream
+endobj
+1415 0 obj <<
+/Type /Page
+/Contents 1416 0 R
+/Resources 1414 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1362 0 R
+>> endobj
+1417 0 obj <<
+/D [1415 0 R /XYZ 80.963 747.976 null]
+>> endobj
+458 0 obj <<
+/D [1415 0 R /XYZ 81.963 700.146 null]
+>> endobj
+1414 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1420 0 obj <<
+/Length 1504
+/Filter /FlateDecode
+>>
+stream
+xڭXK8+j
+r*8f<ɤ-@c[0mYm^3$_-i-)ҸjoG)5MMVrGiKfȚՕPPR So7z;t-2cٲncm7߼5۫`GRڕ--ڗoInGzYȦIڿ5
+P%KZc5-mImP*2u߯?QFH- 4Leqa+2s !
+U3;;)-$&) ^e=|Φ|9M,_r}IEFmsIZe6\!LVlݥ耓=r@iQda C+h.l{ ]-.Ock(\"qB49"ieoP1z&OO~&;9
+٠L(NQ@f;#C ]ZlF&1w!z3ܬ(#i, AR>΋| wneϝ-, Zln`]8~s(;@443/ys)'+t0q4
+KĹםMgT11p&v)SPK?k+;#D.$H<O &"D"
+|>"ޥVU'1&Iz]#ܢP-oE"ޛ¢;_S!~LDɆQ(T M>0܃=
+@ZB&id
+)\@Mqd`Ӧ_uӌ_EZ+KY+U0U_rx~,S,1쪕bGGD ۇRm z96-.`Aa.(&Tة3_CA,u:xٵJ-oq[vdv%<V;-;d fqθt0jirۀi&c<zAѩ1iw]}I,HE݂T: eLZ5 (gZՂWRێ58TM06˨u#s[mx#^1pJ"77~>0b_M㙋ip}i&G9`G),B7G?Ԥ@$ ֙1Ekr#A>/gB||I'iI$[G9JԖC}~63AAP qoieh
+&mvIzr/z#̧ETNr
+kq`Op/Q/Q6QߚmN^_;b7
+endstream
+endobj
+1419 0 obj <<
+/Type /Page
+/Contents 1420 0 R
+/Resources 1418 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1362 0 R
+>> endobj
+1421 0 obj <<
+/D [1419 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1418 0 obj <<
+/Font << /F25 474 0 R /F41 649 0 R /F59 1236 0 R /F34 1237 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1424 0 obj <<
+/Length 1437
+/Filter /FlateDecode
+>>
+stream
+xڥrHWh8)hA .SEEve"RLԈKjE,Mrzy8Vj9CX;g-(p?&hM2޸mw}﹀Xط&t88}X }4fna8 F>9G5N'+kI8P3:ɭa8Y<u3K(m˒V\-ִR\}2T[bIQ6J9*@",J
+3Vm[M޵^s&gzJqZ7/;DKGx֋ho69`v]\OԹFp _Rh*bpƩjX'
+
+lF&*FwÌQ[8d\BI4TqIo[$EX׆<y`MQrƂ! bȁI)p ygn]]ksYV☠V~((N
+>vj 磈p'̖4
+|AcܜFb |}
+UwŸ% r]v١Ghz=D?.-4U&`Z[T;&jGGɉ l*[\BcVN6CJ? ! F%ZNnsɱkXM\zV͂ 8>Pk?ˣqq,c/ͬeFb_юM]|
+endstream
+endobj
+1423 0 obj <<
+/Type /Page
+/Contents 1424 0 R
+/Resources 1422 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1426 0 R
+>> endobj
+1425 0 obj <<
+/D [1423 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1422 0 obj <<
+/Font << /F25 474 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1429 0 obj <<
+/Length 1506
+/Filter /FlateDecode
+>>
+stream
+xڕXn8}W~m@꺩4&ζ@RmDb_C͗O.9sfdqy~c\w`ֆ3ZS{lL#k0sQtFpܻeqno'nꛓѬ7p}wn?>vί؆Sufd46ma[Fp:֡cWcb&S:̑Xmkf9}:=/+n1 aάx(CG887,I(;=.55),\W;Pt6ţzTy׹׮;FD;hc뻺jr Pn00<( L^(TX8NCSn>f:t$dTi
+2?f^3ofG
+H>/KL0bTorGdK&%GmP@N4Vp,:vg͔ `5 D37M/>ߦj*Iٝo40.h!]\2S[a
+\?\S( /m'lR}p5@-x_]Cg7!^ރ|ԣkqլw^00L{`PxJlcdJZ޷\"?Di
+ye 넖ݻLc#G;E`R @Zj>ZE\̲ksk5. ){Oձƛknxf¿ @oE͏-R7kBh1㣝*<Oyn1_T f\2ՕfEPmFXKAm~s6)ԥ`:Q
+ͿlFL5XTEUwCŪ?jE
+endstream
+endobj
+1428 0 obj <<
+/Type /Page
+/Contents 1429 0 R
+/Resources 1427 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1426 0 R
+>> endobj
+1430 0 obj <<
+/D [1428 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1427 0 obj <<
+/Font << /F25 474 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1433 0 obj <<
+/Length 747
+/Filter /FlateDecode
+>>
+stream
+xڍVMo0+6QeTj$MHiJn&`;~4 `<̼1@>tNSE!$.408zA4GGǏs:Wa4YbxtyxQHuYp>ivw߆b{Icq̓'XQ'6+j+Zm1?W
+KXME6 Ϸ|M`UGcKrvs_~nC[*Zڸ`KƋp!{HUXIzyEv<Bnz$i^JB-M6.gu.t$$I}:F P M@*X)1y8k--ګETk^JWtMF74I}!)8$F*inGDv)Yr_[];k(XZf9h3UYC"5&*8n76c-_5Yi)Q@͗V$apF{; v v+*z+;*e.a({
+endstream
+endobj
+1432 0 obj <<
+/Type /Page
+/Contents 1433 0 R
+/Resources 1431 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1426 0 R
+>> endobj
+1434 0 obj <<
+/D [1432 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1431 0 obj <<
+/Font << /F25 474 0 R /F41 649 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1437 0 obj <<
+/Length 155
+/Filter /FlateDecode
+>>
+stream
+x]N= @߯xco}XoJ'.vp[T eYFk+2CT>b/(X튪v;R{[$)JobVm?Đ3<Br8Ll6HRǀwtBF'8} (
+endstream
+endobj
+1436 0 obj <<
+/Type /Page
+/Contents 1437 0 R
+/Resources 1435 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1426 0 R
+>> endobj
+1438 0 obj <<
+/D [1436 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1435 0 obj <<
+/Font << /F25 474 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1462 0 obj <<
+/Length 976
+/Filter /FlateDecode
+>>
+stream
+x՘]o8+;lJJ 0mi&5Mlpgsk`ϳ7W
+$؏bI
+Gg4gu[эUbEHD8ǃCҽ)@|Ɣ%K@
+endstream
+endobj
+1461 0 obj <<
+/Type /Page
+/Contents 1462 0 R
+/Resources 1460 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1426 0 R
+/Annots [ 1439 0 R 1440 0 R 1441 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 1446 0 R 1447 0 R 1448 0 R 1449 0 R 1450 0 R 1451 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R ]
+>> endobj
+1439 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 551.973 229.402 563.6]
+/A << /S /GoTo /D (table.caption.7) >>
+>> endobj
+1440 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 530.582 220.656 540.088]
+/A << /S /GoTo /D (table.3.1) >>
+>> endobj
+1441 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 514.912 311.909 526.539]
+/A << /S /GoTo /D (table.caption.35) >>
+>> endobj
+1442 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 501.363 327.524 512.989]
+/A << /S /GoTo /D (table.caption.37) >>
+>> endobj
+1443 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 487.814 236.006 499.44]
+/A << /S /GoTo /D (table.caption.53) >>
+>> endobj
+1444 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 464.302 198.579 475.928]
+/A << /S /GoTo /D (table.caption.69) >>
+>> endobj
+1445 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 450.753 223.345 462.379]
+/A << /S /GoTo /D (table.caption.70) >>
+>> endobj
+1446 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 439.324 196.375 448.83]
+/A << /S /GoTo /D (table.caption.71) >>
+>> endobj
+1447 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 423.654 358.163 435.281]
+/A << /S /GoTo /D (table.caption.72) >>
+>> endobj
+1448 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 412.226 263.719 421.732]
+/A << /S /GoTo /D (table.caption.73) >>
+>> endobj
+1449 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 398.677 246.843 408.182]
+/A << /S /GoTo /D (table.caption.74) >>
+>> endobj
+1450 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 383.007 192.939 394.633]
+/A << /S /GoTo /D (table.caption.75) >>
+>> endobj
+1451 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 369.458 296.817 381.084]
+/A << /S /GoTo /D (table.caption.76) >>
+>> endobj
+1452 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 355.908 258.695 367.535]
+/A << /S /GoTo /D (table.caption.77) >>
+>> endobj
+1453 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 344.48 232.47 353.986]
+/A << /S /GoTo /D (table.caption.78) >>
+>> endobj
+1454 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 330.931 171.096 340.436]
+/A << /S /GoTo /D (table.caption.79) >>
+>> endobj
+1455 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 315.261 223.345 326.887]
+/A << /S /GoTo /D (table.caption.80) >>
+>> endobj
+1456 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 303.832 213.249 313.338]
+/A << /S /GoTo /D (table.caption.81) >>
+>> endobj
+1457 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 288.162 310.59 299.789]
+/A << /S /GoTo /D (table.caption.82) >>
+>> endobj
+1458 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 266.771 299.672 276.277]
+/A << /S /GoTo /D (table.D.1) >>
+>> endobj
+1459 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 243.259 283.405 252.765]
+/A << /S /GoTo /D (table.E.1) >>
+>> endobj
+1463 0 obj <<
+/D [1461 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1464 0 obj <<
+/D [1461 0 R /XYZ 81.963 568.639 null]
+>> endobj
+1460 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F48 922 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1467 0 obj <<
+/Length 151
+/Filter /FlateDecode
+>>
+stream
+x]? 0)nLIF X
+"V:Yt_ߢ;70u6@,bI\#Zol( &%tevN DZŠN݇EghQC;zl+ J6׸4͌e3{q9p)ݦLu5'
+endstream
+endobj
+1466 0 obj <<
+/Type /Page
+/Contents 1467 0 R
+/Resources 1465 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1426 0 R
+>> endobj
+1468 0 obj <<
+/D [1466 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1465 0 obj <<
+/Font << /F25 474 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1503 0 obj <<
+/Length 1363
+/Filter /FlateDecode
+>>
+stream
+xZ[s6}ϯn\Mti&>m b6_ n}K BvsuiysY;s'DdB,  Cn<Dsbǃ0cyP7X7Wv2@GŝDs
+h; y@pg0pE|u1r3c2݈ǵzފ^@#w>|
+&UmO/n{tϱ<1{QzMiFV≽ O/Y{Jh8XwY!0svJ{<<Yy=vH:/:hJsBI#>&eu!E/<ZE>ǍB{;Cm
+,\YZkԪEi4]Qffu7V 7ySV1"]uP
+-JwT/js5Av*itKQ4hgm2.ElpcHofWAPھ]ѩhbk^":Mym(prPу@M {njYi.L]Xʋzh$( )l\Y$GހH Lf(2H^ʸ$QxYDGP{M.bjʇd"׾U⽰NE(l޺nD
+#Et|`LmO6y._|'g]!„OձP("PA0d#k]jzafk&!>9p^.3mޏM&bz'"?y<o5fUb-Yføx[Ȋ\x I|d|B I?/&ۤPҤ[ELr6 8\TyTlq|DA(>l x^'
+.L7U|b~=S/=Ǿu]d3/Q.?-<QUzF fzl1tlrʅ\xVG#l,t U0.eMpO=ۋV
+endstream
+endobj
+1502 0 obj <<
+/Type /Page
+/Contents 1503 0 R
+/Resources 1501 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1509 0 R
+/Annots [ 1469 0 R 1470 0 R 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1506 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R 1483 0 R 1484 0 R 1485 0 R 1507 0 R 1508 0 R 1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R 1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R ]
+>> endobj
+1469 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 543.617 238.988 553.123]
+/A << /S /GoTo /D (figure.caption.19) >>
+>> endobj
+1470 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 517.704 432.48 529.33]
+/A << /S /GoTo /D (figure.caption.20) >>
+>> endobj
+1471 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 503.874 232.509 515.501]
+/A << /S /GoTo /D (figure.caption.21) >>
+>> endobj
+1472 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 480.082 308.596 491.708]
+/A << /S /GoTo /D (figure.caption.22) >>
+>> endobj
+1473 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 466.252 286.6 477.879]
+/A << /S /GoTo /D (figure.caption.23) >>
+>> endobj
+1474 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 452.422 471.502 464.049]
+/A << /S /GoTo /D (figure.caption.24) >>
+>> endobj
+1506 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 438.873 236.278 450.5]
+/A << /S /GoTo /D (figure.caption.24) >>
+>> endobj
+1475 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 425.044 256.521 436.67]
+/A << /S /GoTo /D (figure.caption.25) >>
+>> endobj
+1476 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 411.214 242.355 422.84]
+/A << /S /GoTo /D (figure.caption.26) >>
+>> endobj
+1477 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 397.384 305.953 409.011]
+/A << /S /GoTo /D (figure.caption.26) >>
+>> endobj
+1478 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 383.554 402.767 395.181]
+/A << /S /GoTo /D (figure.caption.26) >>
+>> endobj
+1479 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 369.725 186.237 381.351]
+/A << /S /GoTo /D (figure.caption.27) >>
+>> endobj
+1480 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 355.895 196.372 367.522]
+/A << /S /GoTo /D (figure.caption.28) >>
+>> endobj
+1481 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 344.186 192.851 353.692]
+/A << /S /GoTo /D (figure.caption.29) >>
+>> endobj
+1482 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 330.356 173.597 339.862]
+/A << /S /GoTo /D (figure.caption.30) >>
+>> endobj
+1483 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 314.406 471.502 326.032]
+/A << /S /GoTo /D (figure.caption.31) >>
+>> endobj
+1484 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [175.096 314.406 237.053 326.032]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://software.schmorp.de/pkg/rxvt-unicode.html)>>
+>> endobj
+1485 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [369.805 314.406 471.502 326.032]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.midnight-commander.org/)>>
+>> endobj
+1507 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [80.966 300.857 223.617 312.483]
+/A << /S /GoTo /D (figure.caption.31) >>
+>> endobj
+1508 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[0 1 1]
+/Rect [80.966 300.857 159.731 312.483]
+/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.midnight-commander.org/)>>
+>> endobj
+1486 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 289.148 185.702 298.654]
+/A << /S /GoTo /D (figure.caption.32) >>
+>> endobj
+1487 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 275.318 210.783 284.824]
+/A << /S /GoTo /D (figure.caption.33) >>
+>> endobj
+1488 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 259.368 226.6 270.994]
+/A << /S /GoTo /D (figure.caption.34) >>
+>> endobj
+1489 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 245.538 247.178 257.164]
+/A << /S /GoTo /D (figure.caption.36) >>
+>> endobj
+1490 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 231.708 274.963 243.335]
+/A << /S /GoTo /D (figure.caption.38) >>
+>> endobj
+1491 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 219.999 191.072 229.505]
+/A << /S /GoTo /D (figure.caption.39) >>
+>> endobj
+1492 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 204.049 193.18 215.675]
+/A << /S /GoTo /D (figure.caption.40) >>
+>> endobj
+1493 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 192.34 182.323 201.846]
+/A << /S /GoTo /D (figure.caption.41) >>
+>> endobj
+1494 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 178.51 231.511 188.016]
+/A << /S /GoTo /D (figure.caption.41) >>
+>> endobj
+1495 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 162.56 202.886 174.186]
+/A << /S /GoTo /D (figure.caption.42) >>
+>> endobj
+1496 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 150.851 194.296 160.357]
+/A << /S /GoTo /D (figure.caption.43) >>
+>> endobj
+1497 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 134.294 241.072 147.193]
+/A << /S /GoTo /D (figure.caption.44) >>
+>> endobj
+1498 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 121.071 248.309 132.697]
+/A << /S /GoTo /D (figure.caption.45) >>
+>> endobj
+1499 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [97.237 107.241 208.548 118.867]
+/A << /S /GoTo /D (figure.caption.50) >>
+>> endobj
+1504 0 obj <<
+/D [1502 0 R /XYZ 80.963 747.976 null]
+>> endobj
+1505 0 obj <<
+/D [1502 0 R /XYZ 81.963 563.587 null]
+>> endobj
+1501 0 obj <<
+/Font << /F25 474 0 R /F28 511 0 R /F48 922 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1533 0 obj <<
+/Length 943
+/Filter /FlateDecode
+>>
+stream
+xݙMw8Z,KK
+$M',.(=39xND g3CEn&4̖bz}$b:i3w=8p=>Yo[aƌ:<| PH
+FLڛ(H (7`dM^??J[).K{ D@bp'g}93 aH~yi}L uYخ(C07fcXxr#lUd JN |
+BBJ#xY^!hx+=<RTAAefC t":F1j-54$c#!xL0qxxh`9M1')uKUd)%eSauX[u|] gV;<$λpp9v_,)vjyެ~F_!/#G6:mD/ sᇁAcئ@Iz3<É#QeD"q"E@vM  '̓ʹϟ@&O1n-ĸw
+endstream
+endobj
+1532 0 obj <<
+/Type /Page
+/Contents 1533 0 R
+/Resources 1531 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1509 0 R
+/Annots [ 1500 0 R 1510 0 R 1511 0 R 1512 0 R 1513 0 R 1514 0 R 1515 0 R 1516 0 R 1517 0 R 1518 0 R 1519 0 R 1520 0 R 1521 0 R 1522 0 R 1523 0 R 1524 0 R 1525 0 R 1526 0 R 1527 0 R 1528 0 R 1529 0 R 1530 0 R ]
+>> endobj
+1500 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 685.074 285.412 696.701]
+/A << /S /GoTo /D (figure.caption.51) >>
+>> endobj
+1510 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 671.525 354.165 683.151]
+/A << /S /GoTo /D (figure.caption.55) >>
+>> endobj
+1511 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 657.976 293.939 669.602]
+/A << /S /GoTo /D (figure.caption.58) >>
+>> endobj
+1512 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 646.547 228.091 656.053]
+/A << /S /GoTo /D (figure.caption.63) >>
+>> endobj
+1513 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 630.877 295.069 642.504]
+/A << /S /GoTo /D (figure.caption.68) >>
+>> endobj
+1514 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 607.365 343.169 618.992]
+/A << /S /GoTo /D (figure.caption.83) >>
+>> endobj
+1515 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 593.21 260.173 606.109]
+/A << /S /GoTo /D (figure.caption.84) >>
+>> endobj
+1516 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 582.388 218.441 591.894]
+/A << /S /GoTo /D (figure.caption.85) >>
+>> endobj
+1517 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 566.718 227.542 578.344]
+/A << /S /GoTo /D (figure.caption.86) >>
+>> endobj
+1518 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 553.169 241.096 564.795]
+/A << /S /GoTo /D (figure.caption.87) >>
+>> endobj
+1519 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 541.74 224.616 551.246]
+/A << /S /GoTo /D (figure.caption.88) >>
+>> endobj
+1520 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 526.07 238.63 537.697]
+/A << /S /GoTo /D (figure.caption.89) >>
+>> endobj
+1521 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 512.521 238.031 524.148]
+/A << /S /GoTo /D (figure.caption.90) >>
+>> endobj
+1522 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 498.972 276.662 510.598]
+/A << /S /GoTo /D (figure.caption.91) >>
+>> endobj
+1523 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 485.423 230.794 497.049]
+/A << /S /GoTo /D (figure.caption.91) >>
+>> endobj
+1524 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 473.994 208.412 483.5]
+/A << /S /GoTo /D (figure.caption.91) >>
+>> endobj
+1525 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 460.445 208.636 469.951]
+/A << /S /GoTo /D (figure.caption.91) >>
+>> endobj
+1526 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 446.896 250.898 456.402]
+/A << /S /GoTo /D (figure.caption.91) >>
+>> endobj
+1527 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 421.263 331.137 432.89]
+/A << /S /GoTo /D (figure.caption.92) >>
+>> endobj
+1528 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 407.714 301.981 419.341]
+/A << /S /GoTo /D (figure.caption.93) >>
+>> endobj
+1529 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 384.202 407.088 395.829]
+/A << /S /GoTo /D (figure.caption.94) >>
+>> endobj
+1530 0 obj <<
+/Type /Annot
+/Subtype /Link
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.08 360.69 393.21 372.317]
+/A << /S /GoTo /D (figure.caption.95) >>
+>> endobj
+1534 0 obj <<
+/D [1532 0 R /XYZ 122.806 747.976 null]
+>> endobj
+1531 0 obj <<
+/Font << /F25 474 0 R /F48 922 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1057 0 obj
+[462 0 R /Fit]
+endobj
+1535 0 obj <<
+/Length 134
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0W5V0T0TH1*24
+(Ads< =\
+%E\N
+@QhX.O7310X0T0
+endstream
+endobj
+1536 0 obj <<
+/Length 134
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0V5V04U0TH1*24
+ 2ɹ\N\
+\@a.}O_T.}
+9~  2>
+endstream
+endobj
+1537 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x=
+Pa!L#' BB4A;ͣxN.̷3)-ڂqtVv|0bu?Y,wyoׇE…18`ޣQo/Kư**:py)V
+endstream
+endobj
+1538 0 obj <<
+/Length 135
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0A ebUehr
+ɹ\N\
+\@Q.}O_T.}
+endstream
+endobj
+1539 0 obj <<
+/Length 101
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0W5S04S0SH1*
+(Aēs<,=\
+%E\N
+\.
+\.
+6u|r5?
+\=
+
+endstream
+endobj
+1540 0 obj <<
+/Length 88
+/Filter /FlateDecode
+>>
+stream
+x3230U0P
+endstream
+endobj
+1541 0 obj <<
+/Length 141
+/Filter /FlateDecode
+>>
+stream
+xڍ˽ P
+RKAeF(w3;4N*tehjfkգy^hJ*!iD` ,x7D]/| 0
+endstream
+endobj
+1542 0 obj <<
+/Length 95
+/Filter /FlateDecode
+>>
+stream
+x3230U0P
+
+endstream
+endobj
+1543 0 obj <<
+/Length 108
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0W5S0" CB. D"9ɓK?\K(ʥPRTʥ`ȥm``S6 ``SW__o'WՓ+
+endstream
+endobj
+1544 0 obj <<
+/Length 106
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0W04V04S0PH1*
+%E\N
+\.
+\.
+lr6<߿:.WO@.
+endstream
+endobj
+1545 0 obj <<
+/Length 88
+/Filter /FlateDecode
+>>
+stream
+x1@@lBVb
+ BT(#׽,\gEMqBͿC}=;$ 8+K a}O;
+endstream
+endobj
+1546 0 obj <<
+/Length 100
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0Q0" #3CB.CcD&9ɓK?\ИK(̥PRTʥ`ȥm`颐`>
+endstream
+endobj
+1547 0 obj <<
+/Length 128
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+
+endstream
+endobj
+1548 0 obj <<
+/Length 134
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b# 2UH1*2
+endstream
+endobj
+1549 0 obj <<
+/Length 132
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0a 2UH1*24\Dr.'~9PKW4K)YKE!P Es r 6  `6(
+endstream
+endobj
+1550 0 obj <<
+/Length 125
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b# 2UH1*2
+endstream
+endobj
+1551 0 obj <<
+/Length 122
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+endstream
+endobj
+1552 0 obj <<
+/Length 120
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+endstream
+endobj
+1553 0 obj <<
+/Length 140
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+endstream
+endobj
+1554 0 obj <<
+/Length 104
+/Filter /FlateDecode
+>>
+stream
+x3230U0
+endstream
+endobj
+1555 0 obj <<
+/Length 100
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0bCK#SCB.C HrW04
+endstream
+endobj
+1556 0 obj <<
+/Length 114
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0a 2UH1*24\Dr.'~9PKW4K)YKE!P E? CJa
+endstream
+endobj
+1557 0 obj <<
+/Length 146
+/Filter /FlateDecode
+>>
+stream
+xA
+@ EN@s3PtP+ҕTz9J3/ĹUYqV)-Ɋ&2 G~~2iǖLW5;
+-OEQCCF2b%;jΑNfH2t?a(
+endstream
+endobj
+1558 0 obj <<
+/Length 109
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+
+endstream
+endobj
+1559 0 obj <<
+/Length 119
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+h".WO@.
+endstream
+endobj
+1560 0 obj <<
+/Length 133
+/Filter /FlateDecode
+>>
+stream
+x3230U0
+
+endstream
+endobj
+1561 0 obj <<
+/Length 116
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0a 2UH1*24\Dr.'~9PKW4K)YKE!P EA?  0 h.WO@.
+endstream
+endobj
+1562 0 obj <<
+/Length 131
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b# 2UH1*2
+endstream
+endobj
+1563 0 obj <<
+/Length 142
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0R5S0Ҧ
+)\\@AcCLr.'~9PKW4K)YwQ6T0tQ`?C?ġ 7|PQ 4h ?;qzrr
+endstream
+endobj
+1564 0 obj <<
+/Length 132
+/Filter /FlateDecode
+>>
+stream
+x3230U0
+ ճ'W 
+endstream
+endobj
+1565 0 obj <<
+/Length 147
+/Filter /FlateDecode
+>>
+stream
+xɿ
+0o#{JB`A'utP:Qv3CiL
+ڕXI*zS_j>j#6܎߯ϝT_!ɰ>X #^b0=x
+endstream
+endobj
+1566 0 obj <<
+/Length 107
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+endstream
+endobj
+1567 0 obj <<
+/Length 113
+/Filter /FlateDecode
+>>
+stream
+x3230U0
+endstream
+endobj
+1568 0 obj <<
+/Length 129
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+endstream
+endobj
+1569 0 obj <<
+/Length 128
+/Filter /FlateDecode
+>>
+stream
+x3230U0
+endstream
+endobj
+1570 0 obj <<
+/Length 147
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+endstream
+endobj
+1571 0 obj <<
+/Length 122
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+
+endstream
+endobj
+1572 0 obj <<
+/Length 140
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0a#C CB.CK
+endstream
+endobj
+1573 0 obj <<
+/Length 136
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+
+endstream
+endobj
+1574 0 obj <<
+/Length 119
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C CB.C3 I$r9yr+q{
+endstream
+endobj
+1575 0 obj <<
+/Length 136
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+endstream
+endobj
+1576 0 obj <<
+/Length 136
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0aC CB.Cs I$r9yr+s{
+endstream
+endobj
+1577 0 obj <<
+/Length 118
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0aK#SCB.Cs
+endstream
+endobj
+1578 0 obj <<
+/Length 161
+/Filter /FlateDecode
+>>
+stream
+x-1
+0@t(Ao h BB`A'qRGEAGQ::cDOIӘ5LlxA.SMpڡr+]'TzNޣk({Q 2a`=ɅAY
+endstream
+endobj
+1579 0 obj <<
+/Length 117
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+endstream
+endobj
+1580 0 obj <<
+/Length 107
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b# 2SH1*2 \.'O.pCS.}(BIQi*S!BA,;3@d.WO@.
+endstream
+endobj
+1581 0 obj <<
+/Length 122
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0RеT04S02SH1*24
+(Bds< =\
+%E\N
+\.
+\.
+  ? `A L \\\
+endstream
+endobj
+1582 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x3230U0
+endstream
+endobj
+1583 0 obj <<
+/Length 104
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0a 2UH1*24\Dr.'~9PKW4K)YKE!P E
+endstream
+endobj
+1584 0 obj <<
+/Length 108
+/Filter /FlateDecode
+>>
+stream
+x3230U0
+%E\N
+@QhX.O?6 dQA\\\
+endstream
+endobj
+1585 0 obj <<
+/Length 112
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#CC CB.CK
+endstream
+endobj
+1586 0 obj <<
+/Length 124
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0aC CB.Cs I$r9yr+s{
+
+ʀZ\=
+endstream
+endobj
+1587 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0TеT02T0PH1*2
+(Cds< -=\
+%E\N
+\.
+\.
+0?|{92dH
+endstream
+endobj
+1588 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0TеT02R0PH1*22P
+endstream
+endobj
+1589 0 obj <<
+/Length 120
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#CC CB.CK
+endstream
+endobj
+1590 0 obj <<
+/Length 126
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0bCKC CB.C HrW04
+endstream
+endobj
+1591 0 obj <<
+/Length 119
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0aK#cCB.Cs
+endstream
+endobj
+1592 0 obj <<
+/Length 111
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#CC CB.CK
+endstream
+endobj
+1593 0 obj <<
+/Length 117
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#CC CB.CK
+endstream
+endobj
+1594 0 obj <<
+/Length 122
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#CC CB.CK
+endstream
+endobj
+1595 0 obj <<
+/Length 134
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#CC CB.CK
+endstream
+endobj
+1596 0 obj <<
+/Length 147
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0TеT02T0PH1*2
+(Cds< -=\
+%E\N
+\.
+\.
+
+endstream
+endobj
+1597 0 obj <<
+/Length 129
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0a 2UH1*24\Dr.'~9PKW4K)YKE!P E? r6 |   +
+endstream
+endobj
+1598 0 obj <<
+/Length 107
+/Filter /FlateDecode
+>>
+stream
+x3230U0P
+endstream
+endobj
+1599 0 obj <<
+/Length 148
+/Filter /FlateDecode
+>>
+stream
+x%1
+@Ё- 7iBVb)- =G{
+endstream
+endobj
+1600 0 obj <<
+/Length 145
+/Filter /FlateDecode
+>>
+stream
+x̽
+@xtbAPK E!ybf`CXD7OO.=on%w~}d=ٞOݙbzIh3A)@h` RxI(7M?t? $
+endstream
+endobj
+1601 0 obj <<
+/Length 147
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0b#C#SCB.CK
+endstream
+endobj
+1602 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0a 2UH1*24\Dr.'~9PKW4K)YKE!P E?C=0`A0cg0`g``o``nH`n
+
+endstream
+endobj
+1603 0 obj <<
+/Length 152
+/Filter /FlateDecode
+>>
+stream
+x-=
+@.fo?҈EVbe,(
+)si)Foaƹٰȹt%[$cqPI)%7|=Τ-͑|ETb.N
+endstream
+endobj
+1604 0 obj <<
+/Length 132
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0a 2SH1*24\Dr.'~9PKW4K)YKE!P E  CC @t .WO@.
+endstream
+endobj
+1605 0 obj <<
+/Length 127
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0a 2UH1*24\Dr.'~9PKW4K)YKE!P E 5 0CQ;H(Q`#
+endstream
+endobj
+1606 0 obj <<
+/Length 152
+/Filter /FlateDecode
+>>
+stream
+x3230U0P0a 2UH1*24\Dr.'~9PKW4K)YKE!P E? 6r  P17|`o(oo s;13T1T
+endstream
+endobj
+1272 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F62
+/FontMatrix [0.02409 0 0 0.02409 0 0]
+/FontBBox [ 0 -10 22 29 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 34
+/LastChar 121
+/Widths 1607 0 R
+/Encoding 1608 0 R
+/CharProcs 1609 0 R
+>> endobj
+1607 0 obj
+[22.05 0 0 0 0 0 22.05 22.05 0 0 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 0 22.05 0 0 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 0 0 0 0 0 0 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 22.05 ]
+endobj
+1608 0 obj <<
+/Type /Encoding
+/Differences [34/a34 35/.notdef 40/a40/a41 42/.notdef 44/a44/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58/a59/a60 61/.notdef 62/a62 63/.notdef 65/a65/a66/a67/a68/a69/a70/a71/a72/a73/a74/a75/a76/a77/a78/a79/a80/a81/a82/a83/a84/a85/a86/a87/a88/a89 90/.notdef 96/a96/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121]
+>> endobj
+1609 0 obj <<
+/a34 1546 0 R
+/a40 1535 0 R
+/a41 1536 0 R
+/a44 1539 0 R
+/a45 1545 0 R
+/a46 1540 0 R
+/a47 1541 0 R
+/a48 1597 0 R
+/a49 1598 0 R
+/a50 1599 0 R
+/a51 1600 0 R
+/a52 1601 0 R
+/a53 1602 0 R
+/a54 1603 0 R
+/a55 1604 0 R
+/a56 1605 0 R
+/a57 1606 0 R
+/a58 1542 0 R
+/a59 1543 0 R
+/a60 1537 0 R
+/a62 1538 0 R
+/a65 1547 0 R
+/a66 1548 0 R
+/a67 1549 0 R
+/a68 1550 0 R
+/a69 1551 0 R
+/a70 1552 0 R
+/a71 1553 0 R
+/a72 1554 0 R
+/a73 1555 0 R
+/a74 1556 0 R
+/a75 1557 0 R
+/a76 1558 0 R
+/a77 1559 0 R
+/a78 1560 0 R
+/a79 1561 0 R
+/a80 1562 0 R
+/a81 1563 0 R
+/a82 1564 0 R
+/a83 1565 0 R
+/a84 1566 0 R
+/a85 1567 0 R
+/a86 1568 0 R
+/a87 1569 0 R
+/a88 1570 0 R
+/a89 1571 0 R
+/a96 1544 0 R
+/a97 1572 0 R
+/a98 1573 0 R
+/a99 1574 0 R
+/a100 1575 0 R
+/a101 1576 0 R
+/a102 1577 0 R
+/a103 1578 0 R
+/a104 1579 0 R
+/a105 1580 0 R
+/a106 1581 0 R
+/a107 1582 0 R
+/a108 1583 0 R
+/a109 1584 0 R
+/a110 1585 0 R
+/a111 1586 0 R
+/a112 1587 0 R
+/a113 1588 0 R
+/a114 1589 0 R
+/a115 1590 0 R
+/a116 1591 0 R
+/a117 1592 0 R
+/a118 1593 0 R
+/a119 1594 0 R
+/a120 1595 0 R
+/a121 1596 0 R
+>> endobj
+1610 0 obj <<
+/Length 112
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P04T5U0T01PH1*24(Bs< ͹=\
+%E\N
+\.
+\.
+o
+endstream
+endobj
+1611 0 obj <<
+/Length 112
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0R5U02P01PH1*24
+\.'O.pCs.}0BIQi*S!BA,B?]Q=^ \\\
+endstream
+endobj
+1612 0 obj <<
+/Length 134
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0V5U0P01PH1*22
+(Bds<L=\
+%E\N
+\.
+\.
+ ~Q ف<7b~
+endstream
+endobj
+1613 0 obj <<
+/Length 147
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0V5U0P01PH1*22
+(Bds<L=\
+%E\N
+\.
+\.
+ 3g`TW?}
+endstream
+endobj
+1614 0 obj <<
+/Length 148
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0V5U0P01PH1*22
+(Bds<L=\
+%E\N
+\.
+\.
+ 0PC1g`"l=q@vm .WO@.
+endstream
+endobj
+1615 0 obj <<
+/Length 97
+/Filter /FlateDecode
+>>
+stream
+x5=@@wwZ-$T
+QTj7$bL"b()iLF
+!=M
+A|c?mKj㠩Fx+uT+
+endstream
+endobj
+1616 0 obj <<
+/Length 117
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P04PеP02TPH1*A *ɥr{
+endstream
+endobj
+1617 0 obj <<
+/Length 89
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P04F
+
+)\\@NrW
+%E\N
+\.
+@u\.
+6uΆՓ+
+endstream
+endobj
+1618 0 obj <<
+/Length 95
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P04F@dbUey`\.'O.p .}(BIQi*S!B4Pa,M a
+endstream
+endobj
+1619 0 obj <<
+/Length 108
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0R04T0T02QH1*2 (Cds≮=\
+%E\N
+\.
+\.
+7
+endstream
+endobj
+1620 0 obj <<
+/Length 100
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0U04T02S04UH1*22P
+endstream
+endobj
+1621 0 obj <<
+/Length 110
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0S0T02U06WH1*2
+(
+endstream
+endobj
+1622 0 obj <<
+/Length 188
+/Filter /FlateDecode
+>>
+stream
+xM=
+@ M&FI1BBBQċ #L8H@{N'M]j(N)ѴqJMIl8P(NP\*t٣-:"lB
+‚Iِ
+86W_sys^<ʗғ'ߩ
+endstream
+endobj
+1623 0 obj <<
+/Length 205
+/Filter /FlateDecode
+>>
+stream
+x-?n0e p|(vK,QRS
+endstream
+endobj
+1624 0 obj <<
+/Length 179
+/Filter /FlateDecode
+>>
+stream
+x];
+@ER^3;8Re Fp
+A+ RK Ea!5)V88Ѳ)tZRP%;$Ѭs8ߠd7 \nx]Wk:@k3XKpiVh& ɪҥn-`14mF ^k=a-a?ηK
+endstream
+endobj
+1625 0 obj <<
+/Length 147
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0aKcsCB.# HrW02
+endstream
+endobj
+1626 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b#Kc3CB.#s
+endstream
+endobj
+1627 0 obj <<
+/Length 179
+/Filter /FlateDecode
+>>
+stream
+xڅ̱0# $ж . &v08F7"}&*w*yFIJN _
+JeJ!P!_5rvD^f$״$vj>M` &6a}¹CdAG?h\L{~:Zm \?_aFX
+endstream
+endobj
+1628 0 obj <<
+/Length 151
+/Filter /FlateDecode
+>>
+stream
+x36г0S0
+endstream
+endobj
+1629 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0bc 2SH1*2
+endstream
+endobj
+1630 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b#Kc3CB.#s
+endstream
+endobj
+1631 0 obj <<
+/Length 113
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0bc 2SH1*2
+endstream
+endobj
+1632 0 obj <<
+/Length 99
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b#sc3CB.#C
+@-\.
+# TGszrr
+endstream
+endobj
+1633 0 obj <<
+/Length 106
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0aKc3CB.# HrW02
+endstream
+endobj
+1634 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0bc 2SH1*2
+endstream
+endobj
+1635 0 obj <<
+/Length 156
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0bc 2SH1*2
+endstream
+endobj
+1636 0 obj <<
+/Length 134
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0V5T0P06WH1*22
+- 2ɹ\N\
+F&\@a.}O_T.}
+endstream
+endobj
+1637 0 obj <<
+/Length 145
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b# c3CB.# HrW02
+endstream
+endobj
+1638 0 obj <<
+/Length 170
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0T5T0"3CB.#K9D&9ɓK?\ȒK(̥PRTʥ`ȥm`P@? u@l@,ru =@@3F n5p?00r
+
+endstream
+endobj
+1639 0 obj <<
+/Length 174
+/Filter /FlateDecode
+>>
+stream
+x5=
+@@ i@ sL!he!Vj)D6z2Qr[,;Nދi:bDw,*T;T+ɨ5o3bUIV%9s=fmk@4z 
+endstream
+endobj
+1640 0 obj <<
+/Length 120
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0bc 2SH1*2
+endstream
+endobj
+1641 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x36г0S0
+%E\N
+\.
+\.
+QAl4P@?30g` \=
+endstream
+endobj
+1642 0 obj <<
+/Length 146
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0T5T06P06SH1*2
+\.'O.p# .}0BIQi*S!BA,B?@ -
+endstream
+endobj
+1643 0 obj <<
+/Length 166
+/Filter /FlateDecode
+>>
+stream
+x-ʱ
+@ HB>B]A(
+ NVھ}{Gc
+%|?R=_-IS:2,fI&Yq,,,%\Q=_;!!}A[R4
+endstream
+endobj
+1644 0 obj <<
+/Length 156
+/Filter /FlateDecode
+>>
+stream
+x36г0S0
+endstream
+endobj
+1645 0 obj <<
+/Length 142
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b#s#SCB.##
+endstream
+endobj
+1646 0 obj <<
+/Length 164
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0bcCc3CB.#
+
+endstream
+endobj
+1647 0 obj <<
+/Length 153
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b#s#SCB.#
+%E\N
+\.
+\.
+  j`?`T S`gP'?0P
+endstream
+endobj
+1648 0 obj <<
+/Length 140
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b#sc3CB.#S
+endstream
+endobj
+1649 0 obj <<
+/Length 198
+/Filter /FlateDecode
+>>
+stream
+xUν
+0 -} hE j;:9::(IۭG#TPWDA$ ($<|i Soiw8E&/B9ez@/Lh㒳4!
+Vw
+endstream
+endobj
+1650 0 obj <<
+/Length 136
+/Filter /FlateDecode
+>>
+stream
+x36г0S0
+endstream
+endobj
+1651 0 obj <<
+/Length 119
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b#scsCB.##
+ ekHF# Փ+
+endstream
+endobj
+1652 0 obj <<
+/Length 141
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0V54V02V06WH1*2(¤s< -=\
+%E\N
+\.
+\.
+ PP?R?`?.WO@.
+endstream
+endobj
+1653 0 obj <<
+/Length 175
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0bc 2SH1*2
+endstream
+endobj
+1654 0 obj <<
+/Length 115
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b#Kc3CB.#S
+
+endstream
+endobj
+1655 0 obj <<
+/Length 132
+/Filter /FlateDecode
+>>
+stream
+x36г0S0
+%E\N
+\.
+\.
+55 7@~ <A0co$׷?? bszrr
+endstream
+endobj
+1656 0 obj <<
+/Length 129
+/Filter /FlateDecode
+>>
+stream
+x36г0S0
+%E\N
+\.
+\.
+?z f'?7??? 6'W 
+endstream
+endobj
+1657 0 obj <<
+/Length 139
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b# #SCB.#
+endstream
+endobj
+1658 0 obj <<
+/Length 169
+/Filter /FlateDecode
+>>
+stream
+x36г0S0
+endstream
+endobj
+1659 0 obj <<
+/Length 138
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b#K#SCB.#s
+endstream
+endobj
+1660 0 obj <<
+/Length 156
+/Filter /FlateDecode
+>>
+stream
+x;
+@E_H!%VLo!1),J-#,%KxC88t+8G;:Ecs/(&?$cS5{㲐6>U& DhMЎ<›:&S$
+endstream
+endobj
+1661 0 obj <<
+/Length 140
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b#sc#CB.#S
+
+endstream
+endobj
+1662 0 obj <<
+/Length 127
+/Filter /FlateDecode
+>>
+stream
+x36г0S0
+%E\N
+\.
+\.
+ 
+
+endstream
+endobj
+1663 0 obj <<
+/Length 138
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0bc#SCB.# I$r9yr+Yp{
+endstream
+endobj
+1664 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0bc#SCB.# I$r9yr+Yp{
+endstream
+endobj
+1665 0 obj <<
+/Length 156
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0aK#SCB.# HrW02
+endstream
+endobj
+1666 0 obj <<
+/Length 179
+/Filter /FlateDecode
+>>
+stream
+xE
+a# u7?1D1,+ YaiAţ}2#J}ůNܮg'uiaDjOj"=hiKj8C*Mjy$'B
+endstream
+endobj
+1667 0 obj <<
+/Length 163
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0R5T0T06WH1*2 ([@ds≮=\
+%E\N
+\.
+\.
+ 00 5 v`leՀE!
+endstream
+endobj
+1668 0 obj <<
+/Length 130
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0b#scsCB.#C
+@-\.
+   ? 0P$E!@dpzrr
+endstream
+endobj
+1669 0 obj <<
+/Length 174
+/Filter /FlateDecode
+>>
+stream
+x-=
+@'X^anTYL!he!Vji(X%/)S,Y7⛉Ed#0h׀Qr y0&+bǯF2ۯ9 )`LE
+endstream
+endobj
+1670 0 obj <<
+/Length 174
+/Filter /FlateDecode
+>>
+stream
+x-ͱ
+0Wny?IڢZ N⤎q)B#
+gԬ҂]4195VcvK늲ڭHI֔ il J
+endstream
+endobj
+1671 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+xu1
+@49B&"n!heB.`[[[ThIs|wڟ~8߸4dhY<+rU%u,ĦD%
+"( Bon)蠵BDrh`
+endstream
+endobj
+1672 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+x36г0S0P0V5T0P06SH1*22
+!2ɹ\N\
+F&\@a.}O_T.}
+:
+endstream
+endobj
+1239 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F60
+/FontMatrix [0.01721 0 0 0.01721 0 0]
+/FontBBox [ 0 -14 31 40 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 34
+/LastChar 125
+/Widths 1673 0 R
+/Encoding 1674 0 R
+/CharProcs 1675 0 R
+>> endobj
+1673 0 obj
+[30.86 0 30.86 30.86 0 0 0 0 0 0 30.86 30.86 30.86 0 30.86 30.86 30.86 30.86 30.86 30.86 0 0 0 0 30.86 0 0 30.86 0 0 30.86 30.86 30.86 30.86 30.86 30.86 30.86 0 30.86 30.86 0 0 30.86 30.86 30.86 30.86 30.86 0 30.86 30.86 30.86 30.86 30.86 0 0 0 0 30.86 30.86 30.86 0 30.86 0 30.86 30.86 30.86 30.86 30.86 30.86 30.86 30.86 30.86 30.86 30.86 30.86 30.86 30.86 30.86 30.86 0 30.86 30.86 30.86 30.86 30.86 30.86 30.86 30.86 0 30.86 0 30.86 ]
+endobj
+1674 0 obj <<
+/Type /Encoding
+/Differences [34/a34 35/.notdef 36/a36/a37 38/.notdef 44/a44/a45/a46 47/.notdef 48/a48/a49/a50/a51/a52/a53 54/.notdef 58/a58 59/.notdef 61/a61 62/.notdef 64/a64/a65/a66/a67/a68/a69/a70 71/.notdef 72/a72/a73 74/.notdef 76/a76/a77/a78/a79/a80 81/.notdef 82/a82/a83/a84/a85/a86 87/.notdef 91/a91/a92/a93 94/.notdef 95/a95 96/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117/a118/a119/a120/a121 122/.notdef 123/a123 124/.notdef 125/a125]
+>> endobj
+1675 0 obj <<
+/a34 1621 0 R
+/a36 1622 0 R
+/a37 1623 0 R
+/a44 1616 0 R
+/a45 1620 0 R
+/a46 1617 0 R
+/a48 1667 0 R
+/a49 1668 0 R
+/a50 1669 0 R
+/a51 1670 0 R
+/a52 1671 0 R
+/a53 1672 0 R
+/a58 1618 0 R
+/a61 1619 0 R
+/a64 1624 0 R
+/a65 1625 0 R
+/a66 1626 0 R
+/a67 1627 0 R
+/a68 1628 0 R
+/a69 1629 0 R
+/a70 1630 0 R
+/a72 1631 0 R
+/a73 1632 0 R
+/a76 1633 0 R
+/a77 1634 0 R
+/a78 1635 0 R
+/a79 1636 0 R
+/a80 1637 0 R
+/a82 1638 0 R
+/a83 1639 0 R
+/a84 1640 0 R
+/a85 1641 0 R
+/a86 1642 0 R
+/a91 1610 0 R
+/a92 1612 0 R
+/a93 1611 0 R
+/a95 1615 0 R
+/a97 1643 0 R
+/a98 1644 0 R
+/a99 1645 0 R
+/a100 1646 0 R
+/a101 1647 0 R
+/a102 1648 0 R
+/a103 1649 0 R
+/a104 1650 0 R
+/a105 1651 0 R
+/a106 1652 0 R
+/a107 1653 0 R
+/a108 1654 0 R
+/a109 1655 0 R
+/a110 1656 0 R
+/a111 1657 0 R
+/a112 1658 0 R
+/a114 1659 0 R
+/a115 1660 0 R
+/a116 1661 0 R
+/a117 1662 0 R
+/a118 1663 0 R
+/a119 1664 0 R
+/a120 1665 0 R
+/a121 1666 0 R
+/a123 1613 0 R
+/a125 1614 0 R
+>> endobj
+1676 0 obj
+[1062.5]
+endobj
+1677 0 obj <<
+/Length 152
+/Filter /FlateDecode
+>>
+stream
+x3231S0P0T5T02S06PH1*22
+(Bds<L=\
+%E\N
+@BA,? Q1?c
+endstream
+endobj
+1236 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F59
+/FontMatrix [0.02007 0 0 0.02007 0 0]
+/FontBBox [ 1 -1 26 30 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 82
+/LastChar 82
+/Widths 1678 0 R
+/Encoding 1679 0 R
+/CharProcs 1680 0 R
+>> endobj
+1678 0 obj
+[26.46 ]
+endobj
+1679 0 obj <<
+/Type /Encoding
+/Differences [82/a82]
+>> endobj
+1680 0 obj <<
+/a82 1677 0 R
+>> endobj
+1681 0 obj <<
+/Length 206
+/Filter /FlateDecode
+>>
+stream
+xڕ=
+@F?X&G\@7,b),J--x4RuUP;U{kfr)7r˘6dLe>Z2'xݯHw=Iys4π @Zz uApFxrt87ԮzPBsA9A!}Y7%U h;yI_$i(+.<{~ANz
+endstream
+endobj
+1682 0 obj <<
+/Length 207
+/Filter /FlateDecode
+>>
+stream
+xڕ=
+@F`&G\@7(hSZYZZ(r!e
+&
+Nx,;Ǿ. dp9iZ˜Tz 5YN%egKIP)0la0* @ ܀ 5vPJ)TOeag~,&$bak5i$M%Sb&<m>Af b)
+endstream
+endobj
+1683 0 obj <<
+/Length 98
+/Filter /FlateDecode
+>>
+stream
+x3633R0P0T04S0T02QH1*22
+(X@$s<̹=,=}JJS ]  b<]
+
+endstream
+endobj
+1684 0 obj <<
+/Length 183
+/Filter /FlateDecode
+>>
+stream
+x̱
+0_:n#رP+AAA9}>JCAg/q9Ә#Nli b:v9r='KR *|܎ՌcRo0w{!aD*`$uX~~ d-B;jd/~b:r靰
+endstream
+endobj
+1685 0 obj <<
+/Length 266
+/Filter /FlateDecode
+>>
+stream
+x}бN0a["ݒG
+n]h} &$$NEȀ܃6JJYK&0xx\G Tzq A9x`I5 dK'h>,(l
+endstream
+endobj
+1686 0 obj <<
+/Length 279
+/Filter /FlateDecode
+>>
+stream
+xڵJ@"0M^@ȼrpp`
+A+J--+Gˣoˍ;š~;3~36|\`sO{˧5k6s*Le}oT.o/r^1LZy XVh
+endstream
+endobj
+1687 0 obj <<
+/Length 221
+/Filter /FlateDecode
+>>
+stream
+x=0o|': &2`A3x&)%/|0a#qc)rx48wkgf 3`iPb.i)K|E4Zo '^QZp6*/?aT|bUYeTݍ'e[x?
+endstream
+endobj
+1688 0 obj <<
+/Length 198
+/Filter /FlateDecode
+>>
+stream
+x}ѽ
+0
+vtr'utPQ|xm.Id)LqDƨ*:mv`wd*dN]H^$r-qCKPx "oS%zgs6QTֽ1(#ǘYIY{sop oCGqjc1[¬-GǏ
+endstream
+endobj
+1689 0 obj <<
+/Length 169
+/Filter /FlateDecode
+>>
+stream
+x3332W0P0b3C3#CB.S3
+endstream
+endobj
+1690 0 obj <<
+/Length 102
+/Filter /FlateDecode
+>>
+stream
+x3гP0P0as3#CB.c
+%E\N
+\.
+\.
+`0J@ l!
+endstream
+endobj
+1691 0 obj <<
+/Length 269
+/Filter /FlateDecode
+>>
+stream
+xڅҿJP2\8Kޠ9O`"Z B:H(t2|lF\v(^j $| w&';?!pS,z(KyqAɌsRR\ %)cwW82b}bܷG+q cǕW?61粅ϣl:^ÑIw(v6 ň kUňhFL>#lk|U9W,I]+~:|nV:hmtV%}fo
+endstream
+endobj
+1692 0 obj <<
+/Length 268
+/Filter /FlateDecode
+>>
+stream
+xe1J@R^lN&2`
+A+ RK EA',{[n!7//";0{3a^h]e;hmnkeҵ S9eߟ;cدUp5+HD]Ě45H-X
+Cn *Ci(v2h> G o
+endstream
+endobj
+1693 0 obj <<
+/Length 269
+/Filter /FlateDecode
+>>
+stream
+xڽ=NP e%G/^4e H0u@sr%GȘ!4AEy{~ ͨT\soX)kyzeaKí1TwayÚsZ
+, [qmpS~
+endstream
+endobj
+1694 0 obj <<
+/Length 169
+/Filter /FlateDecode
+>>
+stream
+x37г4V0P
+@-\.
+A@ pLCih2v4v텹>(q0}
+endstream
+endobj
+1695 0 obj <<
+/Length 247
+/Filter /FlateDecode
+>>
+stream
+xڭ=0pWHHd08Fg{4B1¢ 䗖*D/0."CtpDOw8蚑F |쁏cOpad*o)ӍRwOa-z;P<brUVC?uꕛvPs`Otۈrgz2YYŦƮwGm$2E{9J TJt[tX>IlĮ:$~5LX
+endstream
+endobj
+1696 0 obj <<
+/Length 273
+/Filter /FlateDecode
+>>
+stream
+x]бN0 `W*e#$/
+endstream
+endobj
+1697 0 obj <<
+/Length 151
+/Filter /FlateDecode
+>>
+stream
+x3732V0P0b3 3CCB.3 HrW03
+\.
+NC=
+endstream
+endobj
+1698 0 obj <<
+/Length 236
+/Filter /FlateDecode
+>>
+stream
+xұj`{|!&S 5P@2u(ڌ5(>zw\ڽ>X,gR Z#3쩮
+ 9g9EWuD?Q׌7Jb;@\.P
+endstream
+endobj
+1699 0 obj <<
+/Length 226
+/Filter /FlateDecode
+>>
+stream
+xmϽN0-y P'4d-`b@'+Q"`8;UO}ȳf]qShypw-Q7פ=do4M%dWr~0$
+`~@} I VV&$}R˴`\Se^BM#3]Gd>r˽^R|KKJ,
+endstream
+endobj
+1700 0 obj <<
+/Length 205
+/Filter /FlateDecode
+>>
+stream
+xڽѱ
+0 [ж(
+vtr'utPtn-Gء/$fB/r<S@CFC< hhovGS$C\F?]|=/Մ6fiB"OV]<3hT0))E7]DK2)~BGk>K3sjfUف( ](7
+9@
+endstream
+endobj
+1701 0 obj <<
+/Length 207
+/Filter /FlateDecode
+>>
+stream
+xڝα@f`~`w2 ),Bqi|B)}wxwn9z#ιWe;<ke{YEnŘBcrՒϧ==9{3Pw2u i,ڨdW2aCvڑ4C9e
+endstream
+endobj
+1702 0 obj <<
+/Length 211
+/Filter /FlateDecode
+>>
+stream
+xڽ1
+0H[z h vIMJob҈.u^H贗bU5&)8V\c2+d9+
+!x>]g1ruk޳|[h#FWLrH"yDw3+šVDu30/-Oh=ؖ,ҾsRUܯ!QH%iKx.
+endstream
+endobj
+1703 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+xm1j@/T s{h!"eS0)l MGT!4[;]f{gN8Yα{ϔv>˦o**v ٕ^^gEX/8%[6䝪H N@ F>J4^{!g#Ѕwo9&K Ck`DZ8eEotWq
+endstream
+endobj
+1704 0 obj <<
+/Length 160
+/Filter /FlateDecode
+>>
+stream
+x3637Q0P0b3CB.c3 I$r9yr+q{
+endstream
+endobj
+1705 0 obj <<
+/Length 261
+/Filter /FlateDecode
+>>
+stream
+xڍнJ@9Rlo h^j<VbvBhy[nvx)~0Et 7Ϧ ??mgn7@%=z{uƈw|빹3ݎ$Dr+YȜ3)D!
+Syg']T
+endstream
+endobj
+1706 0 obj <<
+/Length 159
+/Filter /FlateDecode
+>>
+stream
+x353W0P0bS33cCB.SC
+@-\.
+ @?B1ӟ
+endstream
+endobj
+1707 0 obj <<
+/Length 129
+/Filter /FlateDecode
+>>
+stream
+x3г0S0P0b#33CB.#C
+@-\.
+?0c  R@@eH?3-?Փ+
+endstream
+endobj
+1708 0 obj <<
+/Length 106
+/Filter /FlateDecode
+>>
+stream
+x3г0S0P0b#s3cCB.##
+endstream
+endobj
+1709 0 obj <<
+/Length 191
+/Filter /FlateDecode
+>>
+stream
+x=
+P ,tvtr'utPG{G*:=GA I/ {n&ʻIyy">
+'Oܖb*i`67dJb$%]S`}F] RqjKOmVulr/=jҏ )0JRw h"o9
+endstream
+endobj
+1710 0 obj <<
+/Length 153
+/Filter /FlateDecode
+>>
+stream
+x353W0P0bS3CCB.SC
+endstream
+endobj
+1711 0 obj <<
+/Length 195
+/Filter /FlateDecode
+>>
+stream
+xڝ0KHnR) bb::htGQxFymٌ3SL0ŹB^Etb: J:a,w+T +<*LN`*31QBWDM4D7dGeYX/ugw7rvNw->=-n'N|Ɛ6;
+endstream
+endobj
+1712 0 obj <<
+/Length 203
+/Filter /FlateDecode
+>>
+stream
+xڵ1
+@ [ h`
+A+ RK Er28ΚbՃ?,;M܋)>u-iDfTvGLR d4s1Lt9_& I:<b:%`
+endstream
+endobj
+1713 0 obj <<
+/Length 154
+/Filter /FlateDecode
+>>
+stream
+x3135Q0P0bCJ1*26" \.'O.pcs.}(BIQi*Sm`?{`Wa
+endstream
+endobj
+1714 0 obj <<
+/Length 223
+/Filter /FlateDecode
+>>
+stream
+x=ϱJ1`
+ ̼f n!he!Vwvr#lE8A dHlϯ/g+B԰zO";J~p5?wܾPf f(pCU|KNC
+endstream
+endobj
+1715 0 obj <<
+/Length 154
+/Filter /FlateDecode
+>>
+stream
+x313T0P0R5T06Q0PH1*26
+(ZBds< =\
+%E\N
+@QhX.O ̏呰=CF fbGŒP9*b9B A@=
+endstream
+endobj
+1716 0 obj <<
+/Length 159
+/Filter /FlateDecode
+>>
+stream
+x10 aW |:V*E"L @07h!8
+endstream
+endobj
+1717 0 obj <<
+/Length 218
+/Filter /FlateDecode
+>>
+stream
+xmͱJA`7OX1WZYU2ABN|Wnn l! S_U\nsuɫ^)9L}z,74o>qS+߶k.Yc^]G!`<2%sJ@!Ꮙ2ShRxV&GL#>|G@#"@&{
+@ωCdw" 1E{rb,mK Sc}
+endstream
+endobj
+1718 0 obj <<
+/Length 267
+/Filter /FlateDecode
+>>
+stream
+xmϱJ@ [!op$zL!he!WBro,X\2őuv6?˂r:bAsz*˜)W fT=f-}<c5=r5Y;@j(ہ b"hP#HStaᓉG9, {GdFr NBm! Cxn@<>$2!jBn܉tZBۥy*ҳȸVA듫D"S *^7x<U}
+endstream
+endobj
+1719 0 obj <<
+/Length 206
+/Filter /FlateDecode
+>>
+stream
+xM1
+@E'X ),J--B<ZBt`fy)|,xHLN9_`lㅫN o3j3BdU@>4(ѷ{RO_OR/0
+endstream
+endobj
+1221 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F58
+/FontMatrix [0.011 0 0 0.011 0 0]
+/FontBBox [ 1 -22 95 68 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 28
+/LastChar 122
+/Widths 1720 0 R
+/Encoding 1721 0 R
+/CharProcs 1722 0 R
+>> endobj
+1720 0 obj
+[57.71 0 0 0 0 0 0 0 0 0 0 0 40.39 40.39 0 0 0 34.62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 78.39 0 75 79.58 68.16 65.27 0 0 38.8 0 0 0 98.47 81.17 78 70.93 0 77.57 57.7 72.23 0 0 0 0 78.39 0 0 0 0 0 0 0 50.49 57.7 46.16 57.7 47.48 31.74 51.93 57.7 28.86 0 0 28.86 86.54 57.7 51.93 57.7 0 42.54 40.97 40.39 57.7 54.81 0 0 54.81 46.16 ]
+endobj
+1721 0 obj <<
+/Type /Encoding
+/Differences [28/a28 29/.notdef 40/a40/a41 42/.notdef 45/a45 46/.notdef 65/a65 66/.notdef 67/a67/a68/a69/a70 71/.notdef 73/a73 74/.notdef 77/a77/a78/a79/a80 81/.notdef 82/a82/a83/a84 85/.notdef 89/a89 90/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105 106/.notdef 108/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117/a118 119/.notdef 121/a121/a122]
+>> endobj
+1722 0 obj <<
+/a28 1684 0 R
+/a40 1681 0 R
+/a41 1682 0 R
+/a45 1683 0 R
+/a65 1685 0 R
+/a67 1686 0 R
+/a68 1687 0 R
+/a69 1688 0 R
+/a70 1689 0 R
+/a73 1690 0 R
+/a77 1691 0 R
+/a78 1692 0 R
+/a79 1693 0 R
+/a80 1694 0 R
+/a82 1695 0 R
+/a83 1696 0 R
+/a84 1697 0 R
+/a89 1698 0 R
+/a97 1699 0 R
+/a98 1700 0 R
+/a99 1701 0 R
+/a100 1702 0 R
+/a101 1703 0 R
+/a102 1704 0 R
+/a103 1705 0 R
+/a104 1706 0 R
+/a105 1707 0 R
+/a108 1708 0 R
+/a109 1709 0 R
+/a110 1710 0 R
+/a111 1711 0 R
+/a112 1712 0 R
+/a114 1713 0 R
+/a115 1714 0 R
+/a116 1715 0 R
+/a117 1716 0 R
+/a118 1717 0 R
+/a121 1718 0 R
+/a122 1719 0 R
+>> endobj
+1723 0 obj
+[602.5]
+endobj
+1724 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0UеP01R03VH1*26
+(Bds<͸=\
+%E\N
+@BA,B
+endstream
+endobj
+1725 0 obj <<
+/Length 180
+/Filter /FlateDecode
+>>
+stream
+xڍN;
+@n!swCM*!Fp A+ RK E;!/^`%mȸ 0Ј2 1<ajf(ͅpהZv rJ 6 -`
+endstream
+endobj
+1726 0 obj <<
+/Length 96
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0@P!Ő H(`\.'O.p
+pV
+endstream
+endobj
+1727 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0UеP01R03VH1*26
+(Bds<͸=\
+%E\N
+@BA,<
+endstream
+endobj
+1728 0 obj <<
+/Length 104
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0@dbUeh䃹`\.'O.pCC.}0BIQi*SPE!'EA0XA0Փ+
+endstream
+endobj
+1729 0 obj <<
+/Length 118
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P04P0"sSsCB.#39T*9ɓK?\ȌK(ΥPRTʥ`ȥm``P
+endstream
+endobj
+1730 0 obj <<
+/Length 172
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0bS3CB.rAɹ\N\
+&\@Q.}O_T.}
+endstream
+endobj
+1731 0 obj <<
+/Length 272
+/Filter /FlateDecode
+>>
+stream
+x}1N0ЉRDr#x.
+()@Сr5|BF*\[L}^u#ԓ+ ^曻GnTyusĪl.ASFU͆cۤ0k?Fvh;!uif B
+"Qc?1X})bԑvI nG/ADk"vAd0ξ 6ae+ ؐmⱹ\5RgR? J
+endstream
+endobj
+1732 0 obj <<
+/Length 141
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0bS3CB.rAɹ\N\
+&\@Q.}O_T.}
+endstream
+endobj
+1733 0 obj <<
+/Length 114
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0bSS3CB.
+%E\N
+\.
+\.
+p,~BĄ'W 
+endstream
+endobj
+1734 0 obj <<
+/Length 201
+/Filter /FlateDecode
+>>
+stream
+xڭ1
+@4 \kP1),J--!9D,,T]S[̃3nQ*9zK5.sWj9!!qSdaV o,cP$nPPBz@Q(>Zll/5.K=&Mإ(o9)[-_m0v`fs8
+endstream
+endobj
+1735 0 obj <<
+/Length 199
+/Filter /FlateDecode
+>>
+stream
+xe1
+0-wӖZtP*AAAQPPRo7iqpT
+I( 8{~B&6}\9Ol[L,7@g@GEq;>:@8w^@8@X&as!eV^zH4 6Q25<Jφ?֮ڪ(hWz2H;z)瑲&0
+endstream
+endobj
+1736 0 obj <<
+/Length 184
+/Filter /FlateDecode
+>>
+stream
+x͐=@XL #V &naRK (҂.C l}/N竌BJh&)^PF ] 厹Fq(Eu1
+}C$QtQZۂgmJ9Հe
+7Fд
+endstream
+endobj
+1737 0 obj <<
+/Length 220
+/Filter /FlateDecode
+>>
+stream
+xu=N@ _b%79
+H" *
+D[n&"ymafYy.\O:/wa\gVVOK{Ǵý~~|m]=(k}fϋ kEm&fhF hrá
++'2ʉ3q4|PY؁0e齳s5\@e'XreSU4Q~MQd
+endstream
+endobj
+1738 0 obj <<
+/Length 206
+/Filter /FlateDecode
+>>
+stream
+xڥϽ
+0+->Z+S*AAAѹ}>b$*.bBz:ԥVDJQܣmT;fiTTf3:; :Yc6\;lhkb⍹/N-Z6*p|ZX?4>usn tn
+endstream
+endobj
+1739 0 obj <<
+/Length 205
+/Filter /FlateDecode
+>>
+stream
+xڍn1 ]1%o )$n@S ZYG!i _ϲ=gzp;:٨T6{hh.DmyءQvF0`80cf̱b9)zA}T$"'S|_Q((M
+I +TPGey?4dѸYz1_
+S
+endstream
+endobj
+1740 0 obj <<
+/Length 220
+/Filter /FlateDecode
+>>
+stream
+xڝ;
+@ )i<BIJ+P5W rod7Qe`gٙz- iJ? [=ʛ{3=vGe;M@xh D&DTv!U־5ƚAKJ*2ۅԪ,\))u8y_yewŲ޽>sJE"b=A aS~
+endstream
+endobj
+1741 0 obj <<
+/Length 216
+/Filter /FlateDecode
+>>
+stream
+xu1N0E*ir ,-D
+$(VT@Iv(>–)VAaYO??V=ϝz`U6]oX?ݕvⷺ}q
+endstream
+endobj
+1742 0 obj <<
+/Length 164
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0bSsCB.c3 I$r9yr+q{
+endstream
+endobj
+1743 0 obj <<
+/Length 275
+/Filter /FlateDecode
+>>
+stream
+xڅ=N@ M_
+endstream
+endobj
+1744 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+xɱ
+@ : Y k
+7:9utPt>ZpcҘ(@>?1t>C1I0IF*x܂ڡA
+ʮv@F
+G` t>'C/fH= b賚'b6l Q"Di
+endstream
+endobj
+1745 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0bCSsCB.cc
+ aDHpzrr
+endstream
+endobj
+1746 0 obj <<
+/Length 168
+/Filter /FlateDecode
+>>
+stream
+x1@!&p,`EVJ--4ͣ(-!5W? 9ER?֔$4hqF=`iP(QͤGet>]ń4֚
+endstream
+endobj
+1747 0 obj <<
+/Length 217
+/Filter /FlateDecode
+>>
+stream
+xڭνn0pH' Q" vP+ċekdUGk?>48^iƏ%Ii?1B4,Ⱦr'd Wwc'/kL8TEk%t:u=|?Q ;DN d~U7 S[v0ؼ?bjv?
+k1N\*7V*=4#S
+endstream
+endobj
+1748 0 obj <<
+/Length 123
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0b#S3CB.c3
+endstream
+endobj
+1749 0 obj <<
+/Length 161
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0
+endstream
+endobj
+1750 0 obj <<
+/Length 159
+/Filter /FlateDecode
+>>
+stream
+x1
+@бa1[ZYZZ(ZoG 2΢]<rArY;#b6uj
+Ձlj#WTnK늪ܭȠhHUE
+endstream
+endobj
+1751 0 obj <<
+/Length 198
+/Filter /FlateDecode
+>>
+stream
+xڍ1@E #0eV$&ZY+h+{4(- 㲘ڼOϛ$ͦ񄇚1'O6MvV6&U~{I7 ֤rkT dR" "/x"o"x Aā, Ң~~5oU9qNȩ9IR 3,hK`
+endstream
+endobj
+1752 0 obj <<
+/Length 221
+/Filter /FlateDecode
+>>
+stream
+xڭбn0bt @Y"QPNt@hycs U.ɺϿm˧ <qֲy[Ўl՜[kIӚwe SVAtZJ10U
+endstream
+endobj
+1753 0 obj <<
+/Length 172
+/Filter /FlateDecode
+>>
+stream
+xڵ1
+A i832VºSZYZZ(ZXYz#llXZO7荆d/9C;GtVibs0W,lQ9O=l1!洖}N
+endstream
+endobj
+1754 0 obj <<
+/Length 218
+/Filter /FlateDecode
+>>
+stream
+xM1J`b`w.~7hXW0VbZ
+*
+vnUra!,ǔK-tgQ ->Gy劲p3%WtpK-Ϗ kxzX 33䎅rCF40@:b
+endstream
+endobj
+1755 0 obj <<
+/Length 160
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0R5T01P05PH1*26
+\.'O.pcs.}0BIQi*Sm`
+endstream
+endobj
+1756 0 obj <<
+/Length 159
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0P0R5T01U0TH1*21
+(@es<L=\
+%E\N
+\.
+\.
+`,dF }H<00g?`G"?\=
+endstream
+endobj
+1757 0 obj <<
+/Length 195
+/Filter /FlateDecode
+>>
+stream
+xuν
+@ <g(xAAAQPhrpn g7T =P%ciZ7qX(Hft:w(E(ƴ5&cJmZ\Ym?m
+endstream
+endobj
+1758 0 obj <<
+/Length 206
+/Filter /FlateDecode
+>>
+stream
+xmν
+0
+zoU YUX)է-ؽFF'{DžyVJtlH!r&u]Ŋ;7RCSQ񋦠iwH>ʳh
+endstream
+endobj
+1759 0 obj <<
+/Length 218
+/Filter /FlateDecode
+>>
+stream
+xڥ1n@E?@#\ ^
+ c)ʅ*q"QQ8%Ŋ2[$r~y.9R3.#OcE_/T_ܙt_?g~)O)'o6`Pv*;k . , UPC< èzDNe{Υ]ɷ~+| 2%E_Iqhҁ x
+endstream
+endobj
+1760 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x31ӳP0PbSsCB.crAɹ\N\
+\@Q.}O_T.}
+endstream
+endobj
+1761 0 obj <<
+/Length 217
+/Filter /FlateDecode
+>>
+stream
+xڭα@4;/@NYYZZ(ښWG#Lq:q5_1xD1 P)<b/!yfE͜hO=4SZ'o
+!f
+endstream
+endobj
+1762 0 obj <<
+/Length 232
+/Filter /FlateDecode
+>>
+stream
+xu=N@"4>`m Z) HPQ *HIh{=KV)yl/[.᳊Rsut_iۑ%e-o﮸"NJ'v\
+5ň>Lr
+endstream
+endobj
+1165 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F54
+/FontMatrix [0.011 0 0 0.011 0 0]
+/FontBBox [ 0 -22 48 63 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 34
+/LastChar 120
+/Widths 1763 0 R
+/Encoding 1764 0 R
+/CharProcs 1765 0 R
+>> endobj
+1763 0 obj
+[46.98 46.98 0 0 46.98 0 0 0 46.98 0 0 0 46.98 46.98 46.98 46.98 0 0 0 46.98 0 0 46.98 0 46.98 0 0 0 0 0 0 0 0 0 0 0 46.98 0 46.98 0 0 0 0 46.98 46.98 46.98 0 0 0 0 0 0 0 0 0 0 0 0 46.98 0 0 0 0 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 46.98 0 46.98 46.98 46.98 46.98 0 46.98 46.98 ]
+endobj
+1764 0 obj <<
+/Type /Encoding
+/Differences [34/a34/a35 36/.notdef 38/a38 39/.notdef 42/a42 43/.notdef 46/a46/a47/a48/a49 50/.notdef 53/a53 54/.notdef 56/a56 57/.notdef 58/a58 59/.notdef 70/a70 71/.notdef 72/a72 73/.notdef 77/a77/a78/a79 80/.notdef 92/a92 93/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117 118/.notdef 119/a119/a120]
+>> endobj
+1765 0 obj <<
+/a34 1729 0 R
+/a35 1730 0 R
+/a38 1731 0 R
+/a42 1725 0 R
+/a46 1726 0 R
+/a47 1727 0 R
+/a48 1759 0 R
+/a49 1760 0 R
+/a53 1761 0 R
+/a56 1762 0 R
+/a58 1728 0 R
+/a70 1732 0 R
+/a72 1733 0 R
+/a77 1734 0 R
+/a78 1735 0 R
+/a79 1736 0 R
+/a92 1724 0 R
+/a97 1737 0 R
+/a98 1738 0 R
+/a99 1739 0 R
+/a100 1740 0 R
+/a101 1741 0 R
+/a102 1742 0 R
+/a103 1743 0 R
+/a104 1744 0 R
+/a105 1745 0 R
+/a106 1746 0 R
+/a107 1747 0 R
+/a108 1748 0 R
+/a109 1749 0 R
+/a110 1750 0 R
+/a111 1751 0 R
+/a112 1752 0 R
+/a114 1753 0 R
+/a115 1754 0 R
+/a116 1755 0 R
+/a117 1756 0 R
+/a119 1757 0 R
+/a120 1758 0 R
+>> endobj
+1766 0 obj
+[1150]
+endobj
+1767 0 obj <<
+/Length 84
+/Filter /FlateDecode
+>>
+stream
+x3435V0P0bCc bU@tr.'~U()*Mw
+pV0wQ6T0tQ\\\
+endstream
+endobj
+1768 0 obj <<
+/Length 140
+/Filter /FlateDecode
+>>
+stream
+xڭM
+AQ
+9/_(utTS~ÙU{E4qqV39Z['c!0
+endstream
+endobj
+1769 0 obj <<
+/Length 93
+/Filter /FlateDecode
+>>
+stream
+x3435V0P0bCc#CCB.
+%E\N
+@BA,B `Փ+
+endstream
+endobj
+1770 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x3232T0P0V5T02U02VH1* (@ds< =\
+%E\N
+@QhX.Oz|gcaF5  ?ac0gH`?C'W 
+endstream
+endobj
+1771 0 obj <<
+/Length 158
+/Filter /FlateDecode
+>>
+stream
+x3633W0P0V5T06R06UH1*2
+ 2ɹ\N\
+F\@a.}O_T.}
+endstream
+endobj
+1772 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x3232T0P0V5T02U02VH1* (@ds< =\
+%E\N
+@QhX.O? 3>c`*~?Հ<C{v:.WO@.
+endstream
+endobj
+1773 0 obj <<
+/Length 123
+/Filter /FlateDecode
+>>
+stream
+x334Q0P0a#c3CB.CK
+
+endstream
+endobj
+1774 0 obj <<
+/Length 184
+/Filter /FlateDecode
+>>
+stream
+xe1
+@, d.$ADSZYZ
+*
+V<J XUFo&:IVu敢ԩ{Zn(IX$GIc>kŤϊ犣iM no\yW꯷ @O@@ [ѲgglDKr QC
+
+endstream
+endobj
+1775 0 obj <<
+/Length 107
+/Filter /FlateDecode
+>>
+stream
+x3435V0P
+@-\.
+< PÀ
+<?Փ+
+endstream
+endobj
+1776 0 obj <<
+/Length 123
+/Filter /FlateDecode
+>>
+stream
+x3Գ0T0P0b ##CB.
+endstream
+endobj
+1777 0 obj <<
+/Length 114
+/Filter /FlateDecode
+>>
+stream
+x3633W0P0a###CB.#
+endstream
+endobj
+1778 0 obj <<
+/Length 138
+/Filter /FlateDecode
+>>
+stream
+x3631Q0P0V5T0P02VH1*2 (
+endstream
+endobj
+1779 0 obj <<
+/Length 116
+/Filter /FlateDecode
+>>
+stream
+x32ֳP0P0b#c##CB.CK
+endstream
+endobj
+1780 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+x3236T0P0V5T02R02VH1*2
+(@ds< -=\
+%E\N
+\.
+@b<]?4oo(`nx
+endstream
+endobj
+1781 0 obj <<
+/Length 131
+/Filter /FlateDecode
+>>
+stream
+x32ֳP0P0R5T02T06TH1*2 (Ads< -=\
+%E\N
+\.
+\.
+ p F``qh`c 5 \\\
+endstream
+endobj
+1782 0 obj <<
+/Length 124
+/Filter /FlateDecode
+>>
+stream
+x3633W0P0V5T06R02RH1*2
+(Cds<,=\
+%E\N
+\.
+\.
+ Pɂ``~3pzrr
+endstream
+endobj
+1783 0 obj <<
+/Length 138
+/Filter /FlateDecode
+>>
+stream
+x3631Q0P0V5T0P06VH1*2 M 2ɹ\N\
+F&\@a.}O_T.}
+endstream
+endobj
+1784 0 obj <<
+/Length 114
+/Filter /FlateDecode
+>>
+stream
+x3631Q0P0b#SccCB.C
+endstream
+endobj
+1785 0 obj <<
+/Length 170
+/Filter /FlateDecode
+>>
+stream
+x-1
+0t{wMtB`A'utP:֣3jox?<gɚ櫢e!˝āg͖_D["QQ<QS3&St^
+7l$}4 7F:
+endstream
+endobj
+1786 0 obj <<
+/Length 166
+/Filter /FlateDecode
+>>
+stream
+xUɽ
+0@
+wr,(}/\ B}>J!c&cP1rl-I4R'd P%= -ib2jE\HNc5>Ȃy-CRL 
+721
+endstream
+endobj
+1787 0 obj <<
+/Length 177
+/Filter /FlateDecode
+>>
+stream
+x5˽
+0S
+Ү4M V8PE?wK%tTc||*)Ťh()Ѥ$1l(V(f-(t>](ń$֒  |gPq_| :2ude{]& kSBhU/4p3
+endstream
+endobj
+1054 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F49
+/FontMatrix [0.02007 0 0 0.02007 0 0]
+/FontBBox [ 2 -12 48 37 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 46
+/LastChar 117
+/Widths 1788 0 R
+/Encoding 1789 0 R
+/CharProcs 1790 0 R
+>> endobj
+1788 0 obj
+[17.53 30.44 30.44 30.44 0 30.44 0 30.44 0 0 30.44 0 17.53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27.21 33.67 27.21 19.14 30.44 0 17.53 0 0 0 49.81 33.67 30.44 0 0 23.98 24.31 23.98 33.67 ]
+endobj
+1789 0 obj <<
+/Type /Encoding
+/Differences [46/a46/a47/a48/a49 50/.notdef 51/a51 52/.notdef 53/a53 54/.notdef 56/a56 57/.notdef 58/a58 59/.notdef 99/a99/a100/a101/a102/a103 104/.notdef 105/a105 106/.notdef 109/a109/a110/a111 112/.notdef 114/a114/a115/a116/a117]
+>> endobj
+1790 0 obj <<
+/a46 1767 0 R
+/a47 1768 0 R
+/a48 1783 0 R
+/a49 1784 0 R
+/a51 1785 0 R
+/a53 1786 0 R
+/a56 1787 0 R
+/a58 1769 0 R
+/a99 1770 0 R
+/a100 1771 0 R
+/a101 1772 0 R
+/a102 1773 0 R
+/a103 1774 0 R
+/a105 1775 0 R
+/a109 1776 0 R
+/a110 1777 0 R
+/a111 1778 0 R
+/a114 1779 0 R
+/a115 1780 0 R
+/a116 1781 0 R
+/a117 1782 0 R
+>> endobj
+1791 0 obj <<
+/Length 198
+/Filter /FlateDecode
+>>
+stream
+xڝ
+0Eoq(PhP+AAQPQO}i,:IΔܓh4 b֜ 9yЙBf%HYAj͡&5}RłہTr@*MzKE΀N@F x-%08W\g-21鐹WZu2sw[Z,巷EVE\'hbD[
+endstream
+endobj
+1792 0 obj <<
+/Length 199
+/Filter /FlateDecode
+>>
+stream
+xڝO
+@Bx @ػ@N( rԪEAEAKQ<Gh|*AVI4c8֬c>t#ps}x4'cZ{RTYpH*}K@
++̌Sv47fUEc]~s|lm[sIaU].Gz]H||-scL
+endstream
+endobj
+1793 0 obj <<
+/Length 182
+/Filter /FlateDecode
+>>
+stream
+x373T0P0W5R03V0PH1*25
+(Bes<LM=\
+%E\N
+\.
+\.
+ `l 0~
+0MQPAvaPA9$tPϼ
+ر
+endstream
+endobj
+1794 0 obj <<
+/Length 179
+/Filter /FlateDecode
+>>
+stream
+x373T0P0W5R03V0PH1*25
+(Bes<LM=\
+%E\N
+\.
+\.
+BA(`k!3D*ilhn^y5̳A1yrȂP%P 6ȆAGPLbD1I6(&4l.WO@.
+endstream
+endobj
+1795 0 obj <<
+/Length 106
+/Filter /FlateDecode
+>>
+stream
+x373T0P0W52T03V54WH1*25
+(@s<LM=L=}JJS ]  b<]0
+rzrr
+endstream
+endobj
+1796 0 obj <<
+/Length 110
+/Filter /FlateDecode
+>>
+stream
+x3234R0P
+endstream
+endobj
+1797 0 obj <<
+/Length 133
+/Filter /FlateDecode
+>>
+stream
+x=1
+@E?
+x+p'c#8ET,mv |>ӜdYx@=w7@p>Å-_ޭp [?"4'ҠK6ɟI&L2LJ%w9 {|ɉ$_
+endstream
+endobj
+1798 0 obj <<
+/Length 108
+/Filter /FlateDecode
+>>
+stream
+x373T0P0U5W03U05VH1*2 (Aes<L-=\
+%E\N
+\.
+\.
+ l 0
+endstream
+endobj
+1799 0 obj <<
+/Length 132
+/Filter /FlateDecode
+>>
+stream
+x=ɱ
+0
+
+ :t AG˛i "~1WOjŊ/|:=PM-_Ul[Q6<*]+a˃.&dR
+1YG$
+endstream
+endobj
+1800 0 obj <<
+/Length 95
+/Filter /FlateDecode
+>>
+stream
+x3234R0P
+endstream
+endobj
+1801 0 obj <<
+/Length 161
+/Filter /FlateDecode
+>>
+stream
+x313R0P0U52V01P0PH1*26(XBs<M=\
+%E\N
+@BA,`F0 $;`| NȀ 8a" DH
+
+endstream
+endobj
+1802 0 obj <<
+/Length 102
+/Filter /FlateDecode
+>>
+stream
+x3234R0P
+endstream
+endobj
+1803 0 obj <<
+/Length 166
+/Filter /FlateDecode
+>>
+stream
+xe1
+@Y>"w7+1] Fp A+ j)D:{=JhT, 30FMk6řᓦ+P*NxҒq\ 5Iq&YnIV׬d+E⟮>|>c*xp.
+endstream
+endobj
+1804 0 obj <<
+/Length 94
+/Filter /FlateDecode
+>>
+stream
+xMɻ@@E|wGb
+ BT(H4]])8+61|cZGHO@BJJ7"
+endstream
+endobj
+1805 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+x3634Q0
+endstream
+endobj
+1806 0 obj <<
+/Length 177
+/Filter /FlateDecode
+>>
+stream
+x3532U0P0b 3CB.3
+ fh gdՓ+
+endstream
+endobj
+1807 0 obj <<
+/Length 181
+/Filter /FlateDecode
+>>
+stream
+xŐ
+@ A xxUp(
+vtr'utPtmh} bIbH `sȑ 3xćd|/'Js61Η|܎Ռ#o򌁎
+endstream
+endobj
+1808 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+x3532U0P0b 3CB.3
+
+
+endstream
+endobj
+1809 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+x;
+1?XS,vNH#.
+endstream
+endobj
+1810 0 obj <<
+/Length 194
+/Filter /FlateDecode
+>>
+stream
+xڍ=
+@R (?`
+A+ T,D=Z,SFbݭFK}SFMׁ%
+9Xb13B1#nc=N1I_1/$()P/q<+&lK
+endstream
+endobj
+1811 0 obj <<
+/Length 248
+/Filter /FlateDecode
+>>
+stream
+xmнj0P6%hHSB;e(Bұd!C_[ǾBNWd,,~r3}iwo;w>ؾt;Ŵ3+mk`<b
+endstream
+endobj
+1812 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+xڕѽ
+@
+endstream
+endobj
+1813 0 obj <<
+/Length 269
+/Filter /FlateDecode
+>>
+stream
+xڵJ@!E`8yHE p`
+A+ T,ɣQ)-[ww"ؙe|SǛN )9?fJEnYJᙶ .rR6L'R۫3H6'@hXkcznL
+0>[DPiG Ѩ zCt`:D_drfZjF=c?`.-l[/Ǎ;b?Oy=^F.Dd/Z{ FF\n\3w* g7tMVXv
+endstream
+endobj
+1814 0 obj <<
+/Length 211
+/Filter /FlateDecode
+>>
+stream
+xڵ10p lAĉ1D'㤎z@j %Ŕp6# 8CWt4G΀)|4.1!Bv<N턵k&JcPIJZkg-1?,՟wknۏ\Z7!G|Cw"^lo}۫V9
+endstream
+endobj
+1815 0 obj <<
+/Length 193
+/Filter /FlateDecode
+>>
+stream
+x}ѱ
+0
+endstream
+endobj
+1816 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+x3гP0P0bSS3#CB.SC
+@-\.
+bH700C(`B1P(|Teb
+P`BPP9J>4 B
+endstream
+endobj
+1817 0 obj <<
+/Length 268
+/Filter /FlateDecode
+>>
+stream
+xڵJ0
+B_`V4*
+ ɃxR(}=ɔai I:S:<&Iso+
++nZT+T|TKQm=b%
+x
+endstream
+endobj
+1818 0 obj <<
+/Length 130
+/Filter /FlateDecode
+>>
+stream
+x3337U0P0b3S3#CB.3C
+@-\.
+? t 0 lPoՓ+
+endstream
+endobj
+1819 0 obj <<
+/Length 106
+/Filter /FlateDecode
+>>
+stream
+x3633V0P
+endstream
+endobj
+1820 0 obj <<
+/Length 170
+/Filter /FlateDecode
+>>
+stream
+x1
+@БbVj(2n6)F#9fÄ4᭤̇1lT+VI9_b1aIJr&S2"/:
+endstream
+endobj
+1821 0 obj <<
+/Length 266
+/Filter /FlateDecode
+>>
+stream
+x];N0RDb}RneHJ$@P'b;NA(s#L`$ɏ؞ln]*[gv~ԅGԜ]1g큳-8ڛ\otdd<KKMKMa;
+.0.
+>>N w&`>koFc7$կHo8={jp?53j~ M7wנuI}Ri"ӡ|V !
+endstream
+endobj
+1822 0 obj <<
+/Length 144
+/Filter /FlateDecode
+>>
+stream
+x353P0P0bS#3#CB. HrW0
+endstream
+endobj
+1823 0 obj <<
+/Length 252
+/Filter /FlateDecode
+>>
+stream
+x}j1 . Wo;OZXB{ -=
+Jt(ڄ$btUd5"|D~8k '9s|)e(gg5JҺ1*/G)g*G=Cl-[VҚCZ
+7=+q,A wTÀ&u4-U(qhK$)n;%<.<2!WxS
+endstream
+endobj
+1824 0 obj <<
+/Length 250
+/Filter /FlateDecode
+>>
+stream
+x]ѱJ@ )O`y),DPN:NEn}$!Grq63ͦXYbl1c7ƞ?ж7#zm)~zw{ix7!pu\ĵ kh
+endstream
+endobj
+1825 0 obj <<
+/Length 261
+/Filter /FlateDecode
+>>
+stream
+xڵn01D%
+endstream
+endobj
+1826 0 obj <<
+/Length 175
+/Filter /FlateDecode
+>>
+stream
+x333T0P0bS33#CB.S#
+(V9(P$
+endstream
+endobj
+1827 0 obj <<
+/Length 330
+/Filter /FlateDecode
+>>
+stream
+xڵAK@
+T@gZ6EIvS@4 k
+ (
+-գ}V蔚rG3$l7ءEs>{F\nhG9SVt6JӘ_q- 8;g4Nu bi
+endstream
+endobj
+1828 0 obj <<
+/Length 230
+/Filter /FlateDecode
+>>
+stream
+xڝ
+@ azyZںfNSu *꬏#x ~iHwfC} /.~?A .Dh~f q+vX+%H cȇ\'izhIi|Ӵ&:/?ռw~R2}6rӿC991uΪ9ɿ66-M쩥]e'(,G%Vɕb0` Ox1
+endstream
+endobj
+1829 0 obj <<
+/Length 266
+/Filter /FlateDecode
+>>
+stream
+xeϽJ@HMګ̾rw y),J--Gˣ#݂ˍ39TWEn0 *L2~5,'itvck]pXgͥy}y{:ۚ[t
+6vZ5'@O
+߄k
+endstream
+endobj
+1830 0 obj <<
+/Length 158
+/Filter /FlateDecode
+>>
+stream
+x3332W0P0b3#J1*2
+endstream
+endobj
+1831 0 obj <<
+/Length 207
+/Filter /FlateDecode
+>>
+stream
+xJ@?Py &^!`B=PBcAE[|4cZ/9avgaϮffzR}\^ 3f/U#n>wX\o;qbLk]Γ4І~,
+endstream
+endobj
+1832 0 obj <<
+/Length 262
+/Filter /FlateDecode
+>>
+stream
+xmбJAYiSݻ ^!he!B@-s >=`y֙]T;3 etd3zJ 킇Y<:G}GvǨkx|FS2oȹ qĕ
+endstream
+endobj
+1833 0 obj <<
+/Length 321
+/Filter /FlateDecode
+>>
+stream
+xuK0+a;h;{A'a,7V4Nz|H&">NN1b\D8!/2Ih2IY.S`e^ Wg`w2]5(kv?=k@@#
+endstream
+endobj
+1834 0 obj <<
+/Length 294
+/Filter /FlateDecode
+>>
+stream
+x]AK0+^= O`, Ƀzh(=P|It'RVۥ~/Nي/OiTm[UEs?T֥*Y5["v?p=
+endstream
+endobj
+1835 0 obj <<
+/Length 251
+/Filter /FlateDecode
+>>
+stream
+x1K@-<J:O%B/nZ ND(c9Y/ppu^r~߽'<)&7JNCOdQ.خĔmue^_.Mven򎫕 !Q/,8@
+B &2t$谜!cA?Xv$F) -KHiDkk@.b@k@Y3#>f݀,b?B_T|ÿ%t_
+endstream
+endobj
+1836 0 obj <<
+/Length 213
+/Filter /FlateDecode
+>>
+stream
+xmο@/, ShuqZZ(ښ<$y<–!q,䎁 1v<qƖ혭᭡ٌcfiNmFzƤw>;Ռ 9ξ(35 !+PLpW.Pe@"Qmڢ i"1Ŕ"?OVHnqLUOUo*D6i|UԴiMעL
+endstream
+endobj
+1837 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+xڽн
+@ B>Bzm=(vtr'utPvIK:
+#=vDzAmHJ]t9UgnHbR2pĻ~E;G3=hNa1/kFˈ܉Slx`p
+endstream
+endobj
+1838 0 obj <<
+/Length 193
+/Filter /FlateDecode
+>>
+stream
+xڝ1
+@E00Mntft`
+A+ RK E;19%Gu`ak?r}YЁ2+bvM6{*+K,Ȥr>bCz+險1C
+endstream
+endobj
+1839 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+xڽ=
+@ )sĬSZYZZDo7hB\gwJ)|浂F3"$;ԎhbR0 9IbcɄE:ŐdH
+endstream
+endobj
+1840 0 obj <<
+/Length 204
+/Filter /FlateDecode
+>>
+stream
+xuο
+0/t(`_@轀:YAAAMj-#8viQp0?K|6隌Nc8Sje57
+ N-鉌IS>N[ِ҃ / '+*F PWR7HU8##;o\]>K-AZ//>L^T^('N"nhAUhwdZ#=d# r!I
+endstream
+endobj
+1841 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x3233V0P0bcc3CB.c
+%E\N
+@QhX.O ?00``?<3c:f 1%P}Pszrr
+endstream
+endobj
+1842 0 obj <<
+/Length 261
+/Filter /FlateDecode
+>>
+stream
+xڕ=N0_4>B|ȏ宴,)@T@IF(' 9e
+kb (H/˛tG}wȣ]>n~ndKuETgK՟秗{V'fӍk^".ٷtD\0_f+`Gt~΀~ܡLcxc㠤2%Ii(ئ4rB8F+ OƬܫ>Q=9'|V)X,i/ mh
+endstream
+endobj
+1843 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+x3532T0P0b 3cCB.S
+
+endstream
+endobj
+1844 0 obj <<
+/Length 124
+/Filter /FlateDecode
+>>
+stream
+x3234R0P
+endstream
+endobj
+1845 0 obj <<
+/Length 150
+/Filter /FlateDecode
+>>
+stream
+x3233V0P5Q5T02P03TH1*2 (Xs<=\
+%E\N
+\.
+\.
+   P( ulj3cP
+endstream
+endobj
+1846 0 obj <<
+/Length 213
+/Filter /FlateDecode
+>>
+stream
+xڽJ@`_@<A71!d `{ ԣW7U|<Blg@-݅`fg&͗yM3~DHK}xx&{iBZd5}<-oVNbx6rp6=p?`.0y
+/ [5H;g6o/su4י P7G i( %!]`ݾtUӆ}{
+endstream
+endobj
+1847 0 obj <<
+/Length 109
+/Filter /FlateDecode
+>>
+stream
+x3234R0P
+F\@Q.}O_T.}
+endstream
+endobj
+1848 0 obj <<
+/Length 186
+/Filter /FlateDecode
+>>
+stream
+xб
+0 
+ Ej3:9::(
+NGˣ:4qqé8Hķ)tJRWI8^0(v$kgfAuFX lYhFAQJ*˂Yu*>P'sx'`‚ʷs3
+endstream
+endobj
+1849 0 obj <<
+/Length 154
+/Filter /FlateDecode
+>>
+stream
+x3532T0P0b CB.S
+endstream
+endobj
+1850 0 obj <<
+/Length 188
+/Filter /FlateDecode
+>>
+stream
+xڍ1
+` _qVdV8h֣;5I䅼Dq><Y>X:SwN'Js2c2 K^nG2jƖL[
+%BxʃAx
+endstream
+endobj
+1851 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+xڭ1
+@YR &] F0X`er%GH!u6
+Z+ٿȧ>u!)P)N}fQrIJr2xޡc
+PƴSkLb
+endstream
+endobj
+1852 0 obj <<
+/Length 223
+/Filter /FlateDecode
+>>
+stream
+xڭϱjAbaH`B*EҔ)H!GGGuγFlbv;x$s ۘ7 }Mes֟4ɼMdN&2~<:ELtjtDEX pPYuwoڽmOX6JCT:knGC_ 8=Pח4%o
+endstream
+endobj
+1853 0 obj <<
+/Length 145
+/Filter /FlateDecode
+>>
+stream
+x3634S0P0bccCB.c4H$r9yr+p{
+endstream
+endobj
+1854 0 obj <<
+/Length 203
+/Filter /FlateDecode
+>>
+stream
+x-AjP?d70sBtB[ܙʷyŷqRq,Q^i4d6Wd4&S/y&3[ْYqgc$Ovw
+x 4tHB8tmԨuUupAD#r&iNBKZӚ.8W
+endstream
+endobj
+1855 0 obj <<
+/Length 151
+/Filter /FlateDecode
+>>
+stream
+x3634S0P0R5T06P05SH1*22
+\.'O.p#s.}0BIQi*S!BA,Vl+313C1#T8f
+
+endstream
+endobj
+1856 0 obj <<
+/Length 160
+/Filter /FlateDecode
+>>
+stream
+x3532T0P0R5T0P01PH1*21
+(Bds<LL=\
+%E\N
+@B4РX.O `G%00a`f$Н l0A?? $@?P'W 
+endstream
+endobj
+1857 0 obj <<
+/Length 193
+/Filter /FlateDecode
+>>
+stream
+x]=
+@YB\@71JL!he!B@- 19%GHi|{
+G.?'T>.o=(D"壜q2|ݣ-䡜К6N(]9' {6*}
+endstream
+endobj
+1858 0 obj <<
+/Length 248
+/Filter /FlateDecode
+>>
+stream
+xmϱJP? Ĝ{j@`N"QPQpNP|
+endstream
+endobj
+1859 0 obj <<
+/Length 224
+/Filter /FlateDecode
+>>
+stream
+xMαJA?lq0lk!< 8B*ERKHzh(ufL4/Y_Ttz%RKxMGnܓtu|9}ۼ<pEn{|n}
+6 bLzhaP
+endstream
+endobj
+1860 0 obj <<
+/Length 239
+/Filter /FlateDecode
+>>
+stream
+x]J@; <Jv!NbMA(BhW.D(KPi|,Bv7gM'g#>x%'S~\#^/4Iq1w-}<9&{@
+7lz P@?[VqtPA8.=փdFDb+8w:+cw9<<#Oʬj\ԯR*ٕmm`giM?AP
+endstream
+endobj
+1861 0 obj <<
+/Length 199
+/Filter /FlateDecode
+>>
+stream
+x5=
+1oI!Ls5"Z-n!he!Vjih9e`i!0 #vܗ|Ltԇ&% {Ov!d%_/#j9osv;*g7  $Oy $m}RK ****IQ
+$ Q&2JuWk
+D$_h^Қ8.G
+endstream
+endobj
+1862 0 obj <<
+/Length 191
+/Filter /FlateDecode
+>>
+stream
+xڽ1
+@EL2͚DL!he!Vjih'(9B -)fsofyH0d@iNjő!5T>'.&Ien(@*/SC^^$N-8b,(p OA-iU۹*m_ ڰ^!c9- @m
+endstream
+endobj
+1863 0 obj <<
+/Length 126
+/Filter /FlateDecode
+>>
+stream
+x313R0P
+endstream
+endobj
+1864 0 obj <<
+/Length 242
+/Filter /FlateDecode
+>>
+stream
+xuJ@% f$,ăSZY<Z%p XX3̲c-u7זLx|U#ŝk)*EsRn.WZ>HV2u@J&llDmwjR_@> ; l?hٝv* ؄'!nE5i>p {Nhd42F
+endstream
+endobj
+1865 0 obj <<
+/Length 246
+/Filter /FlateDecode
+>>
+stream
+xuN@ ed!/
+endstream
+endobj
+1866 0 obj <<
+/Length 185
+/Filter /FlateDecode
+>>
+stream
+xڕϱ
+@ BP:w<w*D((}~AlU2xTΒY%\`̊Yr(XM53mv'L=ϋ=t#"H  8aU1D@*hq#x!A9XOmy)ky e_
+endstream
+endobj
+1867 0 obj <<
+/Length 229
+/Filter /FlateDecode
+>>
+stream
+xڥбj@ @_ 4z|k:ŐPdc! (= t:IÄS~¹ӑB)fgW)NnxfOnk醪9 mvarU();'Q/$C 3!`.z7l(ki?n!a먠luAIu2θ ҫq42BT]E
+endstream
+endobj
+1868 0 obj <<
+/Length 249
+/Filter /FlateDecode
+>>
+stream
+xuϱJ@?LᾀSZY mr| 3J duM/|HհXhS-7YwkH~Ͳݍ~}~JR>Z<JQ
+endstream
+endobj
+1869 0 obj <<
+/Length 202
+/Filter /FlateDecode
+>>
+stream
+xڕ;
+@A  M
+QL!he!9ZGHB;RXW?#l
+hS+z*ߛņBQK'jF;LA0Ӫ]WCȋz&
+endstream
+endobj
+1870 0 obj <<
+/Length 277
+/Filter /FlateDecode
+>>
+stream
+x]J@EoH$j),J-- ɧͧ']ͪ x}|)TrBf1^զUٽʮYVY{#/*^J<?v+'
+endstream
+endobj
+1871 0 obj <<
+/Length 252
+/Filter /FlateDecode
+>>
+stream
+xu1J@?f. ]@lbځuSZY,Vj)h+ Bn+oayTg+ιW?Be9 e\֔]6e?R>炲 o 0@:)vr"yĂILiNיvFoi􇐃 `%<)ơYto%SK u+P ˴N2(vGU*DF I2v:
+endstream
+endobj
+922 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F48
+/FontMatrix [0.011 0 0 0.011 0 0]
+/FontBBox [ -4 -23 91 68 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 16
+/LastChar 122
+/Widths 1872 0 R
+/Encoding 1873 0 R
+/CharProcs 1874 0 R
+>> endobj
+1872 0 obj
+[30.14 30.14 0 0 0 0 0 0 0 0 0 52.76 50.25 50.25 75.37 0 0 25.12 0 0 0 0 0 25.12 35.16 35.16 0 70.29 25.12 30.14 25.12 45.2 45.2 45.2 45.2 45.2 45.2 45.2 45.2 45.2 45.2 45.2 25.12 0 70.29 0 70.29 42.69 0 67.75 64 65.27 69.02 61.49 58.98 70.91 67.75 32.63 46.44 70.26 56.48 82.81 67.75 70.29 61.49 70.29 66.51 50.21 65.27 67.75 67.75 92.85 67.75 67.75 0 0 0 0 0 70.29 0 45.2 50.21 40.18 50.21 40.18 27.63 45.2 50.21 25.12 27.63 47.71 25.12 75.31 50.21 45.2 50.21 47.71 35.16 35.66 35.16 50.21 47.71 65.27 47.71 47.71 40.18 ]
+endobj
+1873 0 obj <<
+/Type /Encoding
+/Differences [16/a16/a17 18/.notdef 27/a27/a28/a29/a30 31/.notdef 33/a33 34/.notdef 39/a39/a40/a41 42/.notdef 43/a43/a44/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58 59/.notdef 60/a60 61/.notdef 62/a62/a63 64/.notdef 65/a65/a66/a67/a68/a69/a70/a71/a72/a73/a74/a75/a76/a77/a78/a79/a80/a81/a82/a83/a84/a85/a86/a87/a88/a89 90/.notdef 95/a95 96/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121/a122]
+>> endobj
+1874 0 obj <<
+/a16 1805 0 R
+/a17 1803 0 R
+/a27 1807 0 R
+/a28 1806 0 R
+/a29 1808 0 R
+/a30 1809 0 R
+/a33 1796 0 R
+/a39 1797 0 R
+/a40 1791 0 R
+/a41 1792 0 R
+/a43 1798 0 R
+/a44 1799 0 R
+/a45 1804 0 R
+/a46 1800 0 R
+/a47 1801 0 R
+/a48 1862 0 R
+/a49 1863 0 R
+/a50 1864 0 R
+/a51 1865 0 R
+/a52 1866 0 R
+/a53 1867 0 R
+/a54 1868 0 R
+/a55 1869 0 R
+/a56 1870 0 R
+/a57 1871 0 R
+/a58 1802 0 R
+/a60 1793 0 R
+/a62 1794 0 R
+/a63 1810 0 R
+/a65 1811 0 R
+/a66 1812 0 R
+/a67 1813 0 R
+/a68 1814 0 R
+/a69 1815 0 R
+/a70 1816 0 R
+/a71 1817 0 R
+/a72 1818 0 R
+/a73 1819 0 R
+/a74 1820 0 R
+/a75 1821 0 R
+/a76 1822 0 R
+/a77 1823 0 R
+/a78 1824 0 R
+/a79 1825 0 R
+/a80 1826 0 R
+/a81 1827 0 R
+/a82 1828 0 R
+/a83 1829 0 R
+/a84 1830 0 R
+/a85 1831 0 R
+/a86 1832 0 R
+/a87 1833 0 R
+/a88 1834 0 R
+/a89 1835 0 R
+/a95 1795 0 R
+/a97 1836 0 R
+/a98 1837 0 R
+/a99 1838 0 R
+/a100 1839 0 R
+/a101 1840 0 R
+/a102 1841 0 R
+/a103 1842 0 R
+/a104 1843 0 R
+/a105 1844 0 R
+/a106 1845 0 R
+/a107 1846 0 R
+/a108 1847 0 R
+/a109 1848 0 R
+/a110 1849 0 R
+/a111 1850 0 R
+/a112 1851 0 R
+/a113 1852 0 R
+/a114 1853 0 R
+/a115 1854 0 R
+/a116 1855 0 R
+/a117 1856 0 R
+/a118 1857 0 R
+/a119 1858 0 R
+/a120 1859 0 R
+/a121 1860 0 R
+/a122 1861 0 R
+>> endobj
+1875 0 obj <<
+/Length 99
+/Filter /FlateDecode
+>>
+stream
+x313T0P04F
+
+)\\@
+p{IO_T.}
+endstream
+endobj
+1876 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+x313T0P0U5W0T0PH1*26
+(Bds<=\
+%E\N
+\.
+\.
+ @
+endstream
+endobj
+1877 0 obj <<
+/Length 107
+/Filter /FlateDecode
+>>
+stream
+x313T0P04F
+f
+)\\@ IrW04
+s{*r;8+
+endstream
+endobj
+1878 0 obj <<
+/Length 103
+/Filter /FlateDecode
+>>
+stream
+x313T0P0W04S06W02TH1*2 (B$s<,=L=}JJS ]  b<]0 szrr
+endstream
+endobj
+1879 0 obj <<
+/Length 218
+/Filter /FlateDecode
+>>
+stream
+xڝ1N@4
+AT
+(
+o̤/`tR27V֯ifhh`+-RN]dvg9
+endstream
+endobj
+1880 0 obj <<
+/Length 183
+/Filter /FlateDecode
+>>
+stream
+x313T0P0bCSCCB.c
+endstream
+endobj
+1881 0 obj <<
+/Length 147
+/Filter /FlateDecode
+>>
+stream
+x313T0P0b#SCCB.c HrW0
+\.
+
+endstream
+endobj
+1882 0 obj <<
+/Length 191
+/Filter /FlateDecode
+>>
+stream
+xm=
+@ x Ղ?`
+A+ RK E[)S,;h%Xfh<
+}:ex\T:8^pVQ>EmqF;)C}FE$
+endstream
+endobj
+1883 0 obj <<
+/Length 182
+/Filter /FlateDecode
+>>
+stream
+xڍ1
+@EIk9
+n!he!Vjihh%GL2Φօ}g?ofǜlS>'t#k5?;2{Zd܆L]rBC\"iJzD=[5/jLAOQ~ߏ@B_Zh4J5Ϋ^RMuZ9uEJ
+endstream
+endobj
+1884 0 obj <<
+/Length 193
+/Filter /FlateDecode
+>>
+stream
+xڕα@ .<} L &`qRG;[pqᾤ 5)+H+9s<^&|XLפ*L,r0S⺡MNMC
+endstream
+endobj
+1885 0 obj <<
+/Length 201
+/Filter /FlateDecode
+>>
+stream
+xmPE4K BBrmM>}}V́;ܹiԥS=T'u9&a+NFF⻥OK+ VZ[( f#2;܃J>PDCv@Z }•cC
+7'* 4u.7mp b2rcZI_
+endstream
+endobj
+1886 0 obj <<
+/Length 154
+/Filter /FlateDecode
+>>
+stream
+x313T0P0asSCCB.c
+%E\N
+@BA,@Az H?*;
+endstream
+endobj
+1887 0 obj <<
+/Length 253
+/Filter /FlateDecode
+>>
+stream
+x}J@#E`}!k.p`
+A+ RK E#U(y[,gǰzqꜟJz`;볟 Z.(wk~x|ws%{/xv
+endstream
+endobj
+1888 0 obj <<
+/Length 161
+/Filter /FlateDecode
+>>
+stream
+x313T0P0bcSCCB.
+%E\N
+@B4Pe,B @d ?  B~o
+endstream
+endobj
+1889 0 obj <<
+/Length 132
+/Filter /FlateDecode
+>>
+stream
+x313T0P0bcKS#CB.cC
+@-\.
+  @x@@?C1;}pA|.WO@.
+endstream
+endobj
+1890 0 obj <<
+/Length 115
+/Filter /FlateDecode
+>>
+stream
+x313T0P0b ebUel䃹 \.'O.pc.}(BIQi*Sm`Pz<7
+endstream
+endobj
+1891 0 obj <<
+/Length 171
+/Filter /FlateDecode
+>>
+stream
+xڽ=
+@[&G\@7!Q1#X^,7[n8ȃW3r9Al&]'-\,cx܎` s0 n ==Cbq1 SeKvI'mr/)T8R`5zf
+endstream
+endobj
+1892 0 obj <<
+/Length 155
+/Filter /FlateDecode
+>>
+stream
+x313T0P0bcc3CB.
+%E\N
+@QhX.O$$PD2`
+endstream
+endobj
+1893 0 obj <<
+/Length 183
+/Filter /FlateDecode
+>>
+stream
+x}=@XLvNBLH0XF[٣Q8ab^2}KJ)*%Kw4 +@@)juE]VQzB[_
+endstream
+endobj
+1894 0 obj <<
+/Length 200
+/Filter /FlateDecode
+>>
+stream
+xڥ=
+@g fI"SZYZZ(ښͣ[.(wS|7q4HRYs_8 LWCNv?$#(%p:lHj&5pGٌs V,S*7;(&A]t, -GT@8=F>
+$_ȥF<5ޯ
+endstream
+endobj
+1895 0 obj <<
+/Length 158
+/Filter /FlateDecode
+>>
+stream
+xڭ1
+@ПJuj!Fp A+ RKAEh9JAqc![̃I`4-ØԈmjw쎜{Vky\Y\/|9êe_Hx+5C8#$RC\B"
+endstream
+endobj
+1896 0 obj <<
+/Length 185
+/Filter /FlateDecode
+>>
+stream
+xM1
+@4!s7q5@T0XErr,,2ԎgDM&rv=pr^ًYMyaoY!RrGB7 }KD#"eZSW!("PB Ca}96A=<Uīwy^A
+endstream
+endobj
+1897 0 obj <<
+/Length 155
+/Filter /FlateDecode
+>>
+stream
+x313T0P0bc 3CB.cS
+endstream
+endobj
+1898 0 obj <<
+/Length 148
+/Filter /FlateDecode
+>>
+stream
+x313T0P0bcc3CB.
+%E\N
+@QhX.O`
+endstream
+endobj
+1899 0 obj <<
+/Length 174
+/Filter /FlateDecode
+>>
+stream
+x313T0P0bcc3CB.
+%E\N
+@QhX.O `?
+endstream
+endobj
+1900 0 obj <<
+/Length 203
+/Filter /FlateDecode
+>>
+stream
+xڝ=
+@_L#8MLRL!he!Vjih'({!q-6߲`}t!'<8 91 ũ piNfqJf)c2ot=̜w{@
+endstream
+endobj
+1901 0 obj <<
+/Length 141
+/Filter /FlateDecode
+>>
+stream
+x313T0P
+endstream
+endobj
+1902 0 obj <<
+/Length 207
+/Filter /FlateDecode
+>>
+stream
+xڥ=
+@4{t&)!BBB,xxqFE惝}ov)ZRGk;Sʱڬ)Nюe6aܠOi(Zb>$\Cǹ.5Tº)7
+P \)'ߘ'-,e$9ґ i `AY ֚
+
+endstream
+endobj
+1903 0 obj <<
+/Length 213
+/Filter /FlateDecode
+>>
+stream
+x}O
+@`qM>!zI
+0XɧSW؈p w3s3Y:'sÄ1P{~s8Ӵ$4'tcot=w {* (D`D:y#jAԠBQS
+ժ?|R3{6nR}Zn
+endstream
+endobj
+733 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F47
+/FontMatrix [0.01204 0 0 0.01204 0 0]
+/FontBBox [ -1 -19 45 58 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 45
+/LastChar 119
+/Widths 1904 0 R
+/Encoding 1905 0 R
+/CharProcs 1906 0 R
+>> endobj
+1904 0 obj
+[43.59 43.59 43.59 43.59 43.59 0 0 0 43.59 0 0 43.59 0 43.59 0 0 0 0 0 0 0 0 43.59 43.59 43.59 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43.59 0 43.59 43.59 43.59 43.59 43.59 43.59 43.59 0 0 43.59 43.59 43.59 43.59 43.59 0 43.59 43.59 43.59 43.59 0 43.59 ]
+endobj
+1905 0 obj <<
+/Type /Encoding
+/Differences [45/a45/a46/a47/a48/a49 50/.notdef 53/a53 54/.notdef 56/a56 57/.notdef 58/a58 59/.notdef 67/a67/a68/a69 70/.notdef 97/a97 98/.notdef 99/a99/a100/a101/a102/a103/a104/a105 106/.notdef 108/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117 118/.notdef 119/a119]
+>> endobj
+1906 0 obj <<
+/a45 1878 0 R
+/a46 1875 0 R
+/a47 1876 0 R
+/a48 1900 0 R
+/a49 1901 0 R
+/a53 1902 0 R
+/a56 1903 0 R
+/a58 1877 0 R
+/a67 1879 0 R
+/a68 1880 0 R
+/a69 1881 0 R
+/a97 1882 0 R
+/a99 1883 0 R
+/a100 1884 0 R
+/a101 1885 0 R
+/a102 1886 0 R
+/a103 1887 0 R
+/a104 1888 0 R
+/a105 1889 0 R
+/a108 1890 0 R
+/a109 1891 0 R
+/a110 1892 0 R
+/a111 1893 0 R
+/a112 1894 0 R
+/a114 1895 0 R
+/a115 1896 0 R
+/a116 1897 0 R
+/a117 1898 0 R
+/a119 1899 0 R
+>> endobj
+1907 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+xڕ1PDXl 磈V&&ZY+h G(ˆAB,ٙ}P!#y8ф.fsULԖI%+]'R5w=%1.iFe:o[ xcmrD/+lQa^n%k\h[%~Ҭ5.NnwZb.HhC5~X
+endstream
+endobj
+1908 0 obj <<
+/Length 204
+/Filter /FlateDecode
+>>
+stream
+xڕ1@EXL `EHaRK &vp4,- JBg7N @\e(D͡+QT쎜⇬Uz`.d㉻<U&);Q rDQMԱ@a1PıMmc ]y Z ~/:]
+ {>tٴc_<y.WL
+endstream
+endobj
+1909 0 obj <<
+/Length 146
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P0P0T06U03TH1*24(As< ͸=\
+%E\N
+\.
+\.
+?ᰞ1aPo
+10pzrr
+endstream
+endobj
+1910 0 obj <<
+/Length 121
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P0QT01W05RH1*21Eɹ\N\
+&F\@Q.}O_T.}
+endstream
+endobj
+1911 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P0P54Q06Q04TH1*24
+(s< M=\
+%E\N
+\.
+\.
+?aC? ??PՓ+
+endstream
+endobj
+1912 0 obj <<
+/Length 99
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P02
+
+)\\@$2ɹ\N\@.}0PRTʥ
+endstream
+endobj
+1913 0 obj <<
+/Length 174
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P0SеP01U0TH1*2
+(Cds<-=\
+%E\N
+\.
+\.
+ @`"j@&~
+endstream
+endobj
+1914 0 obj <<
+/Length 108
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P02
+&
+)\\
+  ,ɥ`hȥU()*Mw
+pV
+
+endstream
+endobj
+1915 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+xڍ1
+1E#ir4;nv
++Pj9J2Egh:X!-pBk3 ȔB3
+G2E|ܟPvau!w+S!7Yfyfo iƑG>b/N9
+endstream
+endobj
+1916 0 obj <<
+/Length 113
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P0Q0T01W01RH1*@hd Irs{
+
+endstream
+endobj
+1917 0 obj <<
+/Length 186
+/Filter /FlateDecode
+>>
+stream
+x5ͱ
+@ B{ ^mNI]mGa| HiJ,rI9s#Dӕ^Ҝ1j#º.Ű.`$>rUJF9z",~4+*Oo">GI?ЅPuWwDC; MݠÚH
+endstream
+endobj
+1918 0 obj <<
+/Length 103
+/Filter /FlateDecode
+>>
+stream
+x3532Q0PP0T01V02UH1*2 (A$s<M≠=}JJS ]  b<]
+endstream
+endobj
+1919 0 obj <<
+/Length 189
+/Filter /FlateDecode
+>>
+stream
+x5=j@'R4'ziU*EH $&n-MGBx o`U+iVgʟԎ!f|Ȧs`,=-fU+fVW
+endstream
+endobj
+1920 0 obj <<
+/Length 103
+/Filter /FlateDecode
+>>
+stream
+x3532Q0PP0T01V02UH1*2 (A$s<M≠=}JJS ]  b<]
+endstream
+endobj
+1921 0 obj <<
+/Length 279
+/Filter /FlateDecode
+>>
+stream
+x}J@H&A'B* NK E;GˣL1fv7//fTЂ*iqI%Ұp{UM+o5ƼWTbǒ'lP~_
+zBRD!t-2f.bamzCξS8̐`.`LcovaW4Uu b譫Tиv7 n{
+endstream
+endobj
+1922 0 obj <<
+/Length 274
+/Filter /FlateDecode
+>>
+stream
+x]ѿJ@_H&Dw8O0XaX{}K"$ΰYl>že'9|Gk|~/S)Vn6%%2%-~|R⌒-?f>Q;`d1 *=CQGz3۪/j)
+:{$ЪbF\bVfg]p65F`%Uo%n~Z.XܒLPV2yuI U
+endstream
+endobj
+1923 0 obj <<
+/Length 205
+/Filter /FlateDecode
+>>
+stream
+x}ϱ
+0[|Fq+
+vtr'utPty>JЂVCAn C>)NB<pmkq
+jZZpTvfJp4A!|ܚRieuݪ,;鷸"Umddgf$/qF+Q+]KC8ptj䐆ŀ
+"#$ʣN[ywa
+endstream
+endobj
+1924 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+xڍб
+0
+oPjT
+߂[|>^Wn\1ڹ^Wöe;>w"ȑbne!'pΈlr1wE@vؒi`b5olOkuV lL$=o
+endstream
+endobj
+1925 0 obj <<
+/Length 244
+/Filter /FlateDecode
+>>
+stream
+xڭбN0 `:TG_
+endstream
+endobj
+1926 0 obj <<
+/Length 200
+/Filter /FlateDecode
+>>
+stream
+xڭб
+0H-} LSZ N⤎Q;\Oh 䃻 jh1W/qz1pAf@Pki|
+}Qa|cpÖqA#
+KN2lɠw:RE99[CO#/Jǎmݐg'7ΐl9gXɣ
+endstream
+endobj
+1927 0 obj <<
+/Length 158
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P0bK3CCB.3
+
+endstream
+endobj
+1928 0 obj <<
+/Length 153
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P0b 3CCB. HrW01
+\.
+A=e?0a``'d~
+endstream
+endobj
+1929 0 obj <<
+/Length 124
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P0bK3CCB.3
+endstream
+endobj
+1930 0 obj <<
+/Length 115
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P
+endstream
+endobj
+1931 0 obj <<
+/Length 250
+/Filter /FlateDecode
+>>
+stream
+xEнJ@
+endstream
+endobj
+1932 0 obj <<
+/Length 128
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P0b 3CCB. HrW01
+\.
+000LC"A"YFsĐ@$R@?,Փ+
+endstream
+endobj
+1933 0 obj <<
+/Length 213
+/Filter /FlateDecode
+>>
+stream
+xڭб
+0-}{O`@U8 kTfИXi${NRuZ:AW` D{JPhݯ=RO39ǰOX"
+nQ6Zi/Zt"Md!N r
+endstream
+endobj
+1934 0 obj <<
+/Length 199
+/Filter /FlateDecode
+>>
+stream
+xe1@5&pj,$&ZY+hGqblGN}<p.;OF9spu ny7.|G
+PA?PI6^-ʘ`W7~Ewٱ0Q fmmmlVR58W. JG0+rc_V`тf
+endstream
+endobj
+1935 0 obj <<
+/Length 177
+/Filter /FlateDecode
+>>
+stream
+x10gLxжXX &v08Fg<G <`v2$)"SUr¢8((kR(J:)g%A[
+endstream
+endobj
+1936 0 obj <<
+/Length 197
+/Filter /FlateDecode
+>>
+stream
+xڽ
+@ p؞:jotr'utPtnG#tt(K>ȟK'S7xp<k8^{HWQ4~{!-6 q{B9QgLEDF31Koc;s@uQVOf.5̤ϖ9_ݴN:+qhŭVWytl#ӗh@
+endstream
+endobj
+1937 0 obj <<
+/Length 215
+/Filter /FlateDecode
+>>
+stream
+xڥϽ
+0H>AAA9>ZL@3wS̰o8xp|)30-l1Y2rf3ǝtC)"l˒PK^Q<vYD;W?o)d<iz89'l&"uQQ}KTwHlJt>tJ*X
+endstream
+endobj
+1938 0 obj <<
+/Length 259
+/Filter /FlateDecode
+>>
+stream
+xuJ@'LyMr.'BBNK Eኃ()2dოgw\nZe+tyiZtW?zEN>?^_K^  )t"Y33BsrA㙢ƑJF
+:jD.$ &0X@ X {i6zCEPL> 
+endstream
+endobj
+1939 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P0bK3CCB.3
+endstream
+endobj
+1940 0 obj <<
+/Length 190
+/Filter /FlateDecode
+>>
+stream
+x1@EXL DhI)L0VjiQ8%q/a67?h!!Jl%r|8IuNW
+6{C6kl< l&E.6*NT+nZ!D~/!rG(Q
+@53`cɭRN=B[
+endstream
+endobj
+1941 0 obj <<
+/Length 221
+/Filter /FlateDecode
+>>
+stream
+xڍ1j@*v.M8`raR.]$؝"`!(:–[,g*_QF)iz4Nii)|}՚)Ǩ%>;T3iTshJ߰
+endstream
+endobj
+1942 0 obj <<
+/Length 243
+/Filter /FlateDecode
+>>
+stream
+x]j@ e<'ZꡐLBcd>?ŏl i$~9h.=SM5\߸l |,;~_X./$5U;lV3xXjrW=
+endstream
+endobj
+1943 0 obj <<
+/Length 225
+/Filter /FlateDecode
+>>
+stream
+x}1n0 Ed0EG0/
+ԡȔdР7 dPK#O'O *k!XnKVz>uөg^3e݋}N7Oo#XnkR 0,H"`nX,2d;F)ԃ"G ٦)eC$9َ}r9H>Gime2bֿɯꢻNǀf
+endstream
+endobj
+1944 0 obj <<
+/Length 223
+/Filter /FlateDecode
+>>
+stream
+xڭ=0 S1T#4T HbF(=BN
+endstream
+endobj
+1945 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+xڕ;n14s5,r%[D
+")S$"r4Gp`(RF}?i7<q\}8YŊEg Mvo|$x_#@݊0"g"HHTMTQ_2)D`o=D?1ΣT*\C i JB! e̥Jփm
+)a*
+endstream
+endobj
+1946 0 obj <<
+/Length 232
+/Filter /FlateDecode
+>>
+stream
+xڥ1N@Y4
+!Xa;b;C̶V۩<9)
+0&L
+endstream
+endobj
+1947 0 obj <<
+/Length 225
+/Filter /FlateDecode
+>>
+stream
+xu1N0E49BM,)@T@"萒(9K. #3?pW=w<~(ё6[;ϝFOْSxϟ_dw7qB#h%^J"s-,&ï& M
+ugTi:
+d)ȧֿHee_3 Y}ETԼ4rs$jYh%t;#
+endstream
+endobj
+1948 0 obj <<
+/Length 166
+/Filter /FlateDecode
+>>
+stream
+xŎ1
+@EH!%q1[ZYPUx!㎝Vd7<[W-SÉ@fޒYFLXr;)svdJ9{
+%_@"-0*rࡐZ'pGb4"mz!IoMSK?7W
+endstream
+endobj
+1949 0 obj <<
+/Length 283
+/Filter /FlateDecode
+>>
+stream
+x}J@Hfa4]<Vr YlWX `D9-4oɿ3eP=յj隣{^u\\:ݙ{z|bu~*.r冻D6 !#"%I\(3}Cc{mPD߄%:N4@&qTDMK2v ;Q9(nhK Idvd="Т>y &ɹf{[ӎ N4:58x'_'/t
+endstream
+endobj
+1950 0 obj <<
+/Length 178
+/Filter /FlateDecode
+>>
+stream
+x=
+@
+L2'pH-,J--ףy2ŒmkO1rX54])/ UԎ
+URvL,=&dk6>s]PFX`* tB &66aQְsdmN|*38w ]ZZ錀
+endstream
+endobj
+1951 0 obj <<
+/Length 141
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P
+
+endstream
+endobj
+1952 0 obj <<
+/Length 177
+/Filter /FlateDecode
+>>
+stream
+xՐ
+P ES
+YgխP+A'qRGAEOS ;\%CA0$B̘F5h>M¶1d4xTvA*^NIlBYڢM
+n ^(gGƒ'gz\9
+%r
+endstream
+endobj
+1953 0 obj <<
+/Length 127
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P0b33CCB.cK
+endstream
+endobj
+1954 0 obj <<
+/Length 175
+/Filter /FlateDecode
+>>
+stream
+x1@O75pD
+,ZZh:JD<@J
+ˆbb%3򎃮i0f3c3n[6DM8eŠ8NDRrpEEVn4TKUT|(UBMҸHȿ(?
+endstream
+endobj
+1955 0 obj <<
+/Length 170
+/Filter /FlateDecode
+>>
+stream
+x1
+P t*d |BB`A'qRGE<G~"^!O2,3+Ze.ʱ JO37؊RS6JnMKnk(QS<Ʌ =!8 *TS C)"=7K5g8E~Pz
+endstream
+endobj
+1956 0 obj <<
+/Length 202
+/Filter /FlateDecode
+>>
+stream
+xڕ=@ #0e't$$RheaB5pJ
+6&Wd^狔cy9ƹjzPRei.;-+RGN
+R[&U|H-+֤|Z3/PDx"_  {MءlQ5򃠳RkD0qM]Is Fk,Uel m*:9n
+endstream
+endobj
+1957 0 obj <<
+/Length 235
+/Filter /FlateDecode
+>>
+stream
+xڵ1N0EEirqd":K" *
+D ra8 j$\<̟|Ҷ9~JSJ/q]Ngr |y@T2bH!iY)0DI
+endstream
+endobj
+1958 0 obj <<
+/Length 230
+/Filter /FlateDecode
+>>
+stream
+xڵ=n@4@XZDGEJJ
+"9G k*U4hgޛq1*=,y\-@~jݜ'~Ӽ"~Jnm}r3;r^pAՒELZ[jCm`&H[d+RAv MFM7#zBL#PoNmz'[z >YgY$jcƛqH"WڔVU!,
+endstream
+endobj
+1959 0 obj <<
+/Length 172
+/Filter /FlateDecode
+>>
+stream
+xڽα
+0@εIG882:Ht>85g<G5oHYc\lːIN͌Od>"YJq&S"EE\-u׋p*X&.EZ7-}K7-^D_~417yi
+endstream
+endobj
+1960 0 obj <<
+/Length 227
+/Filter /FlateDecode
+>>
+stream
+xM=N0j K.
+endstream
+endobj
+1961 0 obj <<
+/Length 177
+/Filter /FlateDecode
+>>
+stream
+xڭб
+0+
+4%q-
+ftr'>#t =/u AIn(ƚ!kxB%N_C!Q-$Ft9_Ռ$h+3;tA|y=8ނM?`|ҋ-xI ,vQOzxE:Vv܄#Jsk|jVmx
+endstream
+endobj
+1962 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+xϱ 0]r cptBp" hX ;;rpcHQT2kv%d‚ϧ˞L%SrPE^ />" _*?_^ӗw/ķ=yD-L@@+z]l
+endstream
+endobj
+1963 0 obj <<
+/Length 201
+/Filter /FlateDecode
+>>
+stream
+x]α0# $XJD1D'㤎]GQx!Ԥ%Coƒb Ly۵-(v$S+NQkg͂g\:]:r9쒮 <
+endstream
+endobj
+1964 0 obj <<
+/Length 194
+/Filter /FlateDecode
+>>
+stream
+xuʱ
+0-yFcB`A'qRGE(}
+1AX>%E4v+g$'txE 9ʵ5o3t <yFkU̶6W߼L0P ^)o|D=+-:Y
+endstream
+endobj
+1965 0 obj <<
+/Length 224
+/Filter /FlateDecode
+>>
+stream
+xen1 } p~r$7 1юZ(yc+ d/dj<JvF ~UT /whZ4+Qtk9~oԠYҮzݒZϬ2+
+#*
+endstream
+endobj
+1966 0 obj <<
+/Length 223
+/Filter /FlateDecode
+>>
+stream
+xڥ@Ba2 .HK^rh(<%anY
+.l;kXㄓ%jP89Ssߤ/]'R5-4GGʷ 
+m chr
+>
+endstream
+endobj
+1967 0 obj <<
+/Length 154
+/Filter /FlateDecode
+>>
+stream
+x3532Q0P04
+fF
+)\\
+  ,ɥ`l̥U()*Mw
+pV0wQ6T0tQ``|F ~8!"AD=$A= HԱ5 ?h .WO@.
+endstream
+endobj
+1968 0 obj <<
+/Length 234
+/Filter /FlateDecode
+>>
+stream
+x}j0h0G=Ae'S!M 
+ԡtJ2vHhʏG#x`t/jJ)TBuuu|F6+9U|Eۖݳ%C̲kqf}N^*)_ %"י2S]`GNMOtdf@C
+endstream
+endobj
+1969 0 obj <<
+/Length 261
+/Filter /FlateDecode
+>>
+stream
+x]=N@ !
+endstream
+endobj
+1970 0 obj <<
+/Length 203
+/Filter /FlateDecode
+>>
+stream
+xڭ1
+0y'0mV Nī&;ƼtxA?Y<I4F88O 4em8]!+@QkPk*6?/cP9bP(0vg* rM/z=wdвaCʚM+z=vdвaCʚM+4gkZNCiRcj$wP vltY
+endstream
+endobj
+1971 0 obj <<
+/Length 228
+/Filter /FlateDecode
+>>
+stream
+xڭбJ1YXf[ x{wVbuZZ(ںytG2E8s
+J#L2ìbSG+t48zr}Gze=k)o-=8qRs+$
+endstream
+endobj
+1972 0 obj <<
+/Length 262
+/Filter /FlateDecode
+>>
+stream
+xm1N0E
+i @%ҲH@m (9,+c7k4V^]#O//~c{~zp#-yn9p"H:QiST.*NU2JUrAd S\1V`"iUǬ(ǯ3&aFEd+B @ogh&ùJe.bA.VFN[Y-bķ?
+endstream
+endobj
+1973 0 obj <<
+/Length 199
+/Filter /FlateDecode
+>>
+stream
+xڝϱ0[|VI;`A<#0:ך@, mD)Π90 R |J_cz<]P
+endstream
+endobj
+1974 0 obj <<
+/Length 256
+/Filter /FlateDecode
+>>
+stream
+xڍN0`?BZcR$2 Ā:c":;G#d8.H7￵QE֖܎5[<Eh{*o'ܷh^hDF>,Z{
+1=ŧď\!Ɯ^3yN9/} m
+endstream
+endobj
+1975 0 obj <<
+/Length 261
+/Filter /FlateDecode
+>>
+stream
+xm1N0ЉRXr#d.
+endstream
+endobj
+674 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F46
+/FontMatrix [0.01004 0 0 0.01004 0 0]
+/FontBBox [ 0 -24 52 69 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 16
+/LastChar 120
+/Widths 1976 0 R
+/Encoding 1977 0 R
+/CharProcs 1978 0 R
+>> endobj
+1976 0 obj
+[51.24 51.24 0 0 0 51.24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 51.24 51.24 0 51.24 51.24 51.24 0 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 0 51.24 0 0 0 51.24 51.24 51.24 51.24 51.24 51.24 0 51.24 51.24 0 51.24 51.24 51.24 51.24 51.24 51.24 0 51.24 51.24 51.24 51.24 0 51.24 51.24 0 0 0 0 0 0 0 0 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 0 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 51.24 ]
+endobj
+1977 0 obj <<
+/Type /Encoding
+/Differences [16/a16/a17 18/.notdef 21/a21 22/.notdef 36/a36/a37 38/.notdef 39/a39/a40/a41 42/.notdef 43/a43/a44/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58/a59 60/.notdef 61/a61 62/.notdef 65/a65/a66/a67/a68/a69/a70 71/.notdef 72/a72/a73 74/.notdef 75/a75/a76/a77/a78/a79/a80 81/.notdef 82/a82/a83/a84/a85 86/.notdef 87/a87/a88 89/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106 107/.notdef 108/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120]
+>> endobj
+1978 0 obj <<
+/a16 1919 0 R
+/a17 1917 0 R
+/a21 1920 0 R
+/a36 1921 0 R
+/a37 1922 0 R
+/a39 1909 0 R
+/a40 1907 0 R
+/a41 1908 0 R
+/a43 1910 0 R
+/a44 1911 0 R
+/a45 1918 0 R
+/a46 1912 0 R
+/a47 1913 0 R
+/a48 1966 0 R
+/a49 1967 0 R
+/a50 1968 0 R
+/a51 1969 0 R
+/a52 1970 0 R
+/a53 1971 0 R
+/a54 1972 0 R
+/a55 1973 0 R
+/a56 1974 0 R
+/a57 1975 0 R
+/a58 1914 0 R
+/a59 1915 0 R
+/a61 1916 0 R
+/a65 1923 0 R
+/a66 1924 0 R
+/a67 1925 0 R
+/a68 1926 0 R
+/a69 1927 0 R
+/a70 1928 0 R
+/a72 1929 0 R
+/a73 1930 0 R
+/a75 1931 0 R
+/a76 1932 0 R
+/a77 1933 0 R
+/a78 1934 0 R
+/a79 1935 0 R
+/a80 1936 0 R
+/a82 1937 0 R
+/a83 1938 0 R
+/a84 1939 0 R
+/a85 1940 0 R
+/a87 1941 0 R
+/a88 1942 0 R
+/a97 1943 0 R
+/a98 1944 0 R
+/a99 1945 0 R
+/a100 1946 0 R
+/a101 1947 0 R
+/a102 1948 0 R
+/a103 1949 0 R
+/a104 1950 0 R
+/a105 1951 0 R
+/a106 1952 0 R
+/a108 1953 0 R
+/a109 1954 0 R
+/a110 1955 0 R
+/a111 1956 0 R
+/a112 1957 0 R
+/a113 1958 0 R
+/a114 1959 0 R
+/a115 1960 0 R
+/a116 1961 0 R
+/a117 1962 0 R
+/a118 1963 0 R
+/a119 1964 0 R
+/a120 1965 0 R
+>> endobj
+1979 0 obj <<
+/Length 181
+/Filter /FlateDecode
+>>
+stream
+xڕͽ
+1
+ݪQխ1ˬ쑝БwvDC'Hnc"pp/Hyef
+endstream
+endobj
+1980 0 obj <<
+/Length 154
+/Filter /FlateDecode
+>>
+stream
+x363P0P0R5T06P0PH1*22
+\.'O.p#s.}0BIQi*S!BA,} ~0703!?
+endstream
+endobj
+1981 0 obj <<
+/Length 116
+/Filter /FlateDecode
+>>
+stream
+x363P0P0b#sc CB.#C
+@-\.
+   ?0m
+endstream
+endobj
+1982 0 obj <<
+/Length 184
+/Filter /FlateDecode
+>>
+stream
+xM=
+P ER[ |/ BlSZY `4G(9,_3q&j5qPr-NFm1cb҉筘t.BKI
+@?PV^F3
+endstream
+endobj
+1983 0 obj <<
+/Length 187
+/Filter /FlateDecode
+>>
+stream
+xU=
+A `!:;,
+[ZYZ
+*
+"ͣ,-
+b%ԩFIK}Xvԭd^.vI*vD-6a\M<V|(JYf vhЃ*Sܿ ;Qș~̉-w2ތxZa.Sy4
+endstream
+endobj
+1984 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+xu;
+P CH1+J|T,]K2Rϛh+)|ƺ-j"9rĥgZ/vYVlJ
+z@KĐ
+endstream
+endobj
+1985 0 obj <<
+/Length 180
+/Filter /FlateDecode
+>>
+stream
+x}α
+`n@@
+`955DTcPQdo֣]o9!kg؋ykH^ SZHL*tّg#6^+JтܺENt@W8H>KZBVa-m+U?@3
+endstream
+endobj
+1986 0 obj <<
+/Length 191
+/Filter /FlateDecode
+>>
+stream
+x]1
+P _,^@\@__PBU8 أ՛;TkTe9>;qW;`獦=} %|&E1}RIS>N[RlȚԈ#F;(:eMS$D!la #
+89=8
+endstream
+endobj
+1987 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+x363P0P0V5T0"KCB.#s T&9ɓK?\ȜK(̥PRTʥ`ȥm```?7p;C0`b .
+endstream
+endobj
+1988 0 obj <<
+/Length 192
+/Filter /FlateDecode
+>>
+stream
+xM
+`pΐ7zn>
+rjjjl(
+J.Kpl pzf!{:v큒Ԋ]L4teO*Y!5 hMF0|1p#n\("Xت޼d?FYkZƂ0~H/viJK
+endstream
+endobj
+1989 0 obj <<
+/Length 191
+/Filter /FlateDecode
+>>
+stream
+x]=
+` 8H 
+-
+I&^EOb hDHFrug%8.72R#CR=Ie}ެsRA=R{N(0Qa^rXX){p_{4?maWm'm<+>H/Mp+gL
+endstream
+endobj
+668 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F45
+/FontMatrix [0.01721 0 0 0.01721 0 0]
+/FontBBox [ 2 -1 47 40 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 48
+/LastChar 82
+/Widths 1990 0 R
+/Encoding 1991 0 R
+/CharProcs 1992 0 R
+>> endobj
+1990 0 obj
+[33.08 33.08 33.08 33.08 33.08 33.08 33.08 33.08 33.08 33.08 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48.18 ]
+endobj
+1991 0 obj <<
+/Type /Encoding
+/Differences [48/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57 58/.notdef 82/a82]
+>> endobj
+1992 0 obj <<
+/a48 1980 0 R
+/a49 1981 0 R
+/a50 1982 0 R
+/a51 1983 0 R
+/a52 1984 0 R
+/a53 1985 0 R
+/a54 1986 0 R
+/a55 1987 0 R
+/a56 1988 0 R
+/a57 1989 0 R
+/a82 1979 0 R
+>> endobj
+1993 0 obj <<
+/Length 189
+/Filter /FlateDecode
+>>
+stream
+xڝ1
+@EL70s
+@BBZZ(
+9Z#XZ:IVt« 3Or#xjBN%7nt8SjImYǤ+]'RzΚT;l@TJ
+@ hxjze/ ]a;
+endstream
+endobj
+1994 0 obj <<
+/Length 188
+/Filter /FlateDecode
+>>
+stream
+xڝ1
+@EL/ :ͮA"EVbE$Nxg1q߄l">h.!Ǧ^OXRcR 7'e|ޏՌ5ٔs
+endstream
+endobj
+1995 0 obj <<
+/Length 109
+/Filter /FlateDecode
+>>
+stream
+x3230W0P
+-@>'W 
+endstream
+endobj
+1996 0 obj <<
+/Length 164
+/Filter /FlateDecode
+>>
+stream
+x3135R0P0U02S06W03RH1*26
+(Ads< =\
+%E\N
+@QhX.O8qs憺 ꛛn 10``
+
+endstream
+endobj
+1997 0 obj <<
+/Length 105
+/Filter /FlateDecode
+>>
+stream
+x333P0P0U5S03P0PH1*25
+M 2ɹ\N\@.}0PRTʥ`ȥm``
+endstream
+endobj
+1998 0 obj <<
+/Length 131
+/Filter /FlateDecode
+>>
+stream
+x-1
+@E?^
+xЙmV"RP:ٙ&Nwo\%红V\xA=y1:nwՇ Y/ t4M22DT&2+<*B#
+endstream
+endobj
+1999 0 obj <<
+/Length 94
+/Filter /FlateDecode
+>>
+stream
+x3230W0P
+endstream
+endobj
+2000 0 obj <<
+/Length 153
+/Filter /FlateDecode
+>>
+stream
+xڅ̽A ɉ̗eSH" ͣxwN5gvZ88Kb񀷲>7TzOoײC _.)k̓<j*zP R.NO|[ƧmdSL6e\6NdV;x*
+endstream
+endobj
+2001 0 obj <<
+/Length 101
+/Filter /FlateDecode
+>>
+stream
+x3230W0P
+endstream
+endobj
+2002 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+xUA
+@7 u XJ0fԪEB ,jmAi"=xj1k)%g/ I|<$7}Mlx]I'$K>&ȔGȽm~i\ԅΏG8¢x8M l
+endstream
+endobj
+2003 0 obj <<
+/Length 94
+/Filter /FlateDecode
+>>
+stream
+xM=@PEx$^!R
+{ T߱4J2:*54`ƴ"f@BJJ7"i
+endstream
+endobj
+2004 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+x323P0P5T06V0P0PH1*2(Bs<Áj=\
+%E\N
+\.
+\.
+ 10703H01X010000$
+
+endstream
+endobj
+2005 0 obj <<
+/Length 172
+/Filter /FlateDecode
+>>
+stream
+x3134V0P0bSKCB.#
+endstream
+endobj
+2006 0 obj <<
+/Length 175
+/Filter /FlateDecode
+>>
+stream
+x331Q0P0bScSKCB.S
+%E\N
+@QhX.O g``~
+endstream
+endobj
+2007 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+xѱ@?Xf!FHJ"BJ--|1}_aau=΁egM]p,+qeL?&wXis)|›p1$Myƀv3|-{Pe!,Gp
+endstream
+endobj
+2008 0 obj <<
+/Length 235
+/Filter /FlateDecode
+>>
+stream
+xmj1 ^=;Od-$AhO=Xބͣ{N"Q6>fB&?N'izmf4Z||DJƠz.rM/T%V~rE
+endstream
+endobj
+2009 0 obj <<
+/Length 209
+/Filter /FlateDecode
+>>
+stream
+xڕ00#pO`Amd3ALd08Fgh<
+@ڴ_e4f, kӄqH2@5(xEB3 i3
+5C8ZA/:L^pXpkFbIF
+endstream
+endobj
+2010 0 obj <<
+/Length 260
+/Filter /FlateDecode
+>>
+stream
+xڭѱJ@? LaZ 4ܪ[-'BBRP̛*y+uvg!B#n;MG4Zly\Ѣ瞚-Sӟ-5#%_v^QdRPDZTRR OԵ@*(AWE
+endstream
+endobj
+2011 0 obj <<
+/Length 194
+/Filter /FlateDecode
+>>
+stream
+x3331V0P
+endstream
+endobj
+2012 0 obj <<
+/Length 181
+/Filter /FlateDecode
+>>
+stream
+xuб
+0
+/0 D4?/iLsqINƪ&v)9
+O44FQ5o3j ioKk2 D
+endstream
+endobj
+2013 0 obj <<
+/Length 166
+/Filter /FlateDecode
+>>
+stream
+x353R0P0bSCSsCB.s
+endstream
+endobj
+2014 0 obj <<
+/Length 254
+/Filter /FlateDecode
+>>
+stream
+xڭѱJ@?l&yM"&`p`
+A+ :--7`kMg+ & XKf]{t\)pp{ =SuV=UvT]j__Z]>5(6S`-̗oնd IS03aLlB".!1Ox&pcJ&HۅrI)ܔ_,v0{ltT颧
+endstream
+endobj
+2015 0 obj <<
+/Length 125
+/Filter /FlateDecode
+>>
+stream
+x333P0P0bSKSsCB.SS
+endstream
+endobj
+2016 0 obj <<
+/Length 106
+/Filter /FlateDecode
+>>
+stream
+x3ԳT0P0aKSsCB.#3
+endstream
+endobj
+2017 0 obj <<
+/Length 243
+/Filter /FlateDecode
+>>
+stream
+x]J@Yr̡@&A[sjsɃxj=
+Qj(y=HДeDz~,//Ue7~_G8"Ǎ;ΟGΗoKWn6^D8I F"!:+2oa[87`d`+hLMfp&byiguf0~5jRryd* Sk_ N9Lxods-5P
+endstream
+endobj
+2018 0 obj <<
+/Length 140
+/Filter /FlateDecode
+>>
+stream
+x35ԳT0P0bKSsCB.S
+endstream
+endobj
+2019 0 obj <<
+/Length 244
+/Filter /FlateDecode
+>>
+stream
+xu?kP
+'%
+ur(vtـ]G|X#y=8.
+[~<
+8:İ˵W|Ք.1wQ@jH>yo瘣1 ý 8hFx]*18yTB
+NZ@fW'coQ!
+endstream
+endobj
+2020 0 obj <<
+/Length 243
+/Filter /FlateDecode
+>>
+stream
+xUпJ@/.0fMN?Sge!VjihkR\AKT֩$EuwM1f``<w>w%=.>jRWRkRnKO/VSYZR7T@fm큼
+endstream
+endobj
+2021 0 obj <<
+/Length 239
+/Filter /FlateDecode
+>>
+stream
+xڭ08#^@D'D::htGxWm~_LyxJsNgo(I
+~j}<C2[|fa?-ȍ֞3oלȾ}]=U;
+endstream
+endobj
+2022 0 obj <<
+/Length 167
+/Filter /FlateDecode
+>>
+stream
+x3535T0P0bS#SsCB.K
+Y;PCuP7 .ĵ'W 
+endstream
+endobj
+2023 0 obj <<
+/Length 221
+/Filter /FlateDecode
+>>
+stream
+xڕѽ
+0𖂁#x/i*U
+~I(}JK "&HrtF*
+ ״ 2o@.08BDu uf,HW lf(ze~ަ_Q@6+L6elZv,XKP~EԺe֩N=v<
+endstream
+endobj
+2024 0 obj <<
+/Length 256
+/Filter /FlateDecode
+>>
+stream
+xUϱN0 )K~h{=B @!Z̏F%Psw|J8êt0r^jE>U KWk=?ܻbuyJz_uEk?ƌ!fl#>3Z;@'7x &
+endstream
+endobj
+2025 0 obj <<
+/Length 150
+/Filter /FlateDecode
+>>
+stream
+x3Գ4W0P0bSsJ1*2" Fr.'~1PKW4K)YKE!P E?<@0g`A bP>T*L`)`J+
+
+endstream
+endobj
+2026 0 obj <<
+/Length 191
+/Filter /FlateDecode
+>>
+stream
+x=
+@B\@7JL!he!Vj)h9G,Sl3X,fuVsmnFlzl @Hw4HH/I'S>[ِ҃C#^(>l
+\3X
+endstream
+endobj
+2027 0 obj <<
+/Length 240
+/Filter /FlateDecode
+>>
+stream
+xm1j0g1<Bf]lH. )C2BXHB;GQt'k?зѲ-HQA7--V Ygqoܔ(|g~ο_(7/[N-YTV k!
+d
+endstream
+endobj
+2028 0 obj <<
+/Length 307
+/Filter /FlateDecode
+>>
+stream
+xu1K0
+ vtr@?')ΝCMHH^K^Y/PX.8\<Rv^,k]bDvJ"NdcE«յWh"k@mD$f~#;
+Hl8@wdFU%[p^q(`J7)IMkTRفRI JN%}<=Dt2lIܩy&F:U; A9O} 5* ĜE'"'E<_g'Ʃ
+endstream
+endobj
+2029 0 obj <<
+/Length 231
+/Filter /FlateDecode
+>>
+stream
+xαJAYL"y.p1bLBASP=p2E8n@,ofgɌKWR+s8 5srzJ 5W7Y ~k%
+endstream
+endobj
+2030 0 obj <<
+/Length 204
+/Filter /FlateDecode
+>>
+stream
+xm;
+@ . Vf.1L!he!Vji(X({8Qښ}i<"Ńf{Qj{T3Qes:.{TŘ4 5E&6%/_x/PAP02g0yp&dBw:+0}ATyM6Ӣ5l.5iK|T
+endstream
+endobj
+2031 0 obj <<
+/Length 198
+/Filter /FlateDecode
+>>
+stream
+x3134V0P0R5T01V0PH1*21P
+endstream
+endobj
+2032 0 obj <<
+/Length 182
+/Filter /FlateDecode
+>>
+stream
+xڍA
+`'?(   AZDjX.̣y҅Tcu 7f:
+5P L % MBb%_/#jƒ&Ύ҄Z{Ue5TƩ-ՇW6j@-OӉ
+w
+endstream
+endobj
+2033 0 obj <<
+/Length 198
+/Filter /FlateDecode
+>>
+stream
+x3134V0P0V5T01Q0PH1*21P
+endstream
+endobj
+2034 0 obj <<
+/Length 189
+/Filter /FlateDecode
+>>
+stream
+x]1
+@\B/ 8M(+Tr!bI
+q23;9nvdC)lGUgwIBf6$32d@fr@&m)2ϩ\^sϵ2HQRQO5QJrh MTrL@V@
+endstream
+endobj
+2035 0 obj <<
+/Length 141
+/Filter /FlateDecode
+>>
+stream
+x3236W0P0bcSKCB.# I$r9yr+Yp{
+endstream
+endobj
+2036 0 obj <<
+/Length 237
+/Filter /FlateDecode
+>>
+stream
+xڍJ1ƿ00 v^@9Å+T[}<J!e89/CCd1g|<|'Oo$w+gqz|uON\7ms@lF7V렒& &xdCUT4QPŎйL76v 0 ]T)eIFI~a
+endstream
+endobj
+2037 0 obj <<
+/Length 155
+/Filter /FlateDecode
+>>
+stream
+x3134V0P0bS CB.C
+@-\.
+?&iNa`D~700n?D䇁$7 \\\
+endstream
+endobj
+2038 0 obj <<
+/Length 122
+/Filter /FlateDecode
+>>
+stream
+x3230W0P0aCS3CB.C
+endstream
+endobj
+2039 0 obj <<
+/Length 150
+/Filter /FlateDecode
+>>
+stream
+x3236W0P5Q54W0P05SH1*22
+(s< =\
+%E\N
+@QhX.O  P?`E6?gc?P~.WO@.
+endstream
+endobj
+2040 0 obj <<
+/Length 196
+/Filter /FlateDecode
+>>
+stream
+xڵ1
+@Еir3'p.#BBRPQr0E:? d37u.{ʧHrCqJzƁGz$15x2`ts [R
+endstream
+endobj
+2041 0 obj <<
+/Length 108
+/Filter /FlateDecode
+>>
+stream
+x3230W0P0aCS CB.C
+endstream
+endobj
+2042 0 obj <<
+/Length 177
+/Filter /FlateDecode
+>>
+stream
+x33R0P
+endstream
+endobj
+2043 0 obj <<
+/Length 147
+/Filter /FlateDecode
+>>
+stream
+x3134V0P0bcsCB.C
+@-\.
+?00`D~70n?D䇁$0
+endstream
+endobj
+2044 0 obj <<
+/Length 188
+/Filter /FlateDecode
+>>
+stream
+xڍ1@E #0e6 &naRK v9GTd)HN^f̦ǚ95(EqߜR{cRkI ? ldM*H&g8
+i~ nN/ookg$AH>
+wlzZIK
+endstream
+endobj
+2045 0 obj <<
+/Length 196
+/Filter /FlateDecode
+>>
+stream
+xڝα
+@ HByuj;:9::(>Zp"]qQ |CB?2ܓ1G!#I:Ramd$V$fO"tٓH$R^K6ʯ\UW0/%>T5*4hy~<ect+|@u1t!Q7Kpi1'4hI/o
+endstream
+endobj
+2046 0 obj <<
+/Length 202
+/Filter /FlateDecode
+>>
+stream
+x31ֳ0R0P0V54S01Q06WH1*21P
+
+endstream
+endobj
+2047 0 obj <<
+/Length 140
+/Filter /FlateDecode
+>>
+stream
+x3635R0P
+endstream
+endobj
+2048 0 obj <<
+/Length 195
+/Filter /FlateDecode
+>>
+stream
+x=αJ@Xf x{`TSwZ
+*
+W6`"8%Gf|q~K.4pR^j<<Sݐr^՘|soO5+^Sb(8A+d̠?
+endstream
+endobj
+2049 0 obj <<
+/Length 151
+/Filter /FlateDecode
+>>
+stream
+x363T0P0T5T0P05TH1*22
+(Ads≮=\
+%E\N
+\.
+\.
+   W  @ @,?(fQ 0pC sC3=;?f.WO@.
+endstream
+endobj
+2050 0 obj <<
+/Length 153
+/Filter /FlateDecode
+>>
+stream
+x3134V0P0R5T01Q06WH1*21
+([@ds<L =\
+%E\N
+@QhX.O `J`
+endstream
+endobj
+2051 0 obj <<
+/Length 183
+/Filter /FlateDecode
+>>
+stream
+xU̱
+P#k[WJ' rjj Ɔh>`Phj @ B\Q#HEldȗ$"Sg3:.{|LVkRj_
+..X ,g0i) <p&A
+endstream
+endobj
+2052 0 obj <<
+/Length 233
+/Filter /FlateDecode
+>>
+stream
+xU=KPs Xxv(zb`A'
+Q|A7|~Lx`7UN?8g!Aj"z$r~nhdHڙdrO/$GcHN* WUP6Aߴ45q " bx%tq_cGŲh;L t5<
+endstream
+endobj
+2053 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+xMν
+@ )(<mm`A'qRGAEI X7G_GL҃\.Qu@nru@{45`~BޜTK&|<6ҹdƤWv8UM-1FStS_v=3S_Zz
+պ-,ؒ^9\u7p38o|U%4#N
+endstream
+endobj
+2054 0 obj <<
+/Length 219
+/Filter /FlateDecode
+>>
+stream
+xUj@Yi
+ nZ$sSEGQ|x I;=F(N8^D!qiIs ǔB3I-1QYAg//74gZv* 0ÿ+]SCE@QsϰF,IqSn/'gCb^mmjg`1'>
+endstream
+endobj
+2055 0 obj <<
+/Length 183
+/Filter /FlateDecode
+>>
+stream
+x%1
+@@$|'0+AA),DQ<e`_췰&# L_MH.bڣ؟$I%ب$Xp ]z?Ju[>I:IUuO)Fh~!;:c̐ېዬQ֑)HpIH]RY#H[m(l2Oe-?uC
+endstream
+endobj
+2056 0 obj <<
+/Length 188
+/Filter /FlateDecode
+>>
+stream
+xڵ1
+@EH!L#d.ͺB`
+A+ RK EBbGRRl6Pt+ǬƬ5$Ii;Xf$#aI,Dv$f,I(K~ |[jWopG!SE /zO6x+ӸY~uд`
+endstream
+endobj
+2057 0 obj <<
+/Length 121
+/Filter /FlateDecode
+>>
+stream
+x3135R0P0bc3SSCB.#
+endstream
+endobj
+2058 0 obj <<
+/Length 228
+/Filter /FlateDecode
+>>
+stream
+xmαJ@o"0M^ป'pWSZY `eh>J+5E~;Yct_^iC-/+9u'Zst }{}<ZFojn(-~ـ8#J^Q0Cc0D_:sNar$_΂[-> ,,
+%s'l"aAZқMY'W Tc|
+endstream
+endobj
+2059 0 obj <<
+/Length 235
+/Filter /FlateDecode
+>>
+stream
+xu1N0ЉRX`3
+endstream
+endobj
+2060 0 obj <<
+/Length 188
+/Filter /FlateDecode
+>>
+stream
+xڕν
+@ + At-('𮶵kotrP?Q_ I+F!=ړ,o)$G$'KROt8oH&{$S^zVSBĢ
+ i
+endstream
+endobj
+2061 0 obj <<
+/Length 226
+/Filter /FlateDecode
+>>
+stream
+xڕϿjAna s=b!j WJ!`R
+nGG8̜EH:_1;dySpnyΟ9)_6[d?9oR&[}";YL9#;e銊Һ„pQ*+j .+xs7xĕ\ }rR /:tKuNTc'ې'jiT2Dׂ+X
+endstream
+endobj
+2062 0 obj <<
+/Length 243
+/Filter /FlateDecode
+>>
+stream
+xmJ@O"p}dXW0 j)h()SDm>{uuVZjG+9}Mjag"VNbkx|JV+-*@ Ps&[ D>#E@rI~2<vKi6 bD1 FŞ~ 00!?*B~I&)=d5!y"`;e+ Mo
+endstream
+endobj
+2063 0 obj <<
+/Length 197
+/Filter /FlateDecode
+>>
+stream
+xڕα
+@ HB}Ѽ]`A'u(GQ|TZ?$w#3ihdȎhC!s8cТZp*Yz?WS2f5wHPQY 4a:B@ 8 1n
+-SQR-8
+d_Ѯ+J_<!t<5~
+endstream
+endobj
+2064 0 obj <<
+/Length 265
+/Filter /FlateDecode
+>>
+stream
+xMJ@Eo[8м$AB`B]W҅E ;#Ǜ*y{wquLZZj}%OR7KmN~&wlֺ₲<>H\i%Jo*-o])L O[
+`;d1a3X`LpM6{{x<P#zz[\6&GiHl]>SHp|tO01l6 i4,e3zwgRS@v
+endstream
+endobj
+2065 0 obj <<
+/Length 237
+/Filter /FlateDecode
+>>
+stream
+xu1N0бRD@\
+
+endstream
+endobj
+652 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F43
+/FontMatrix [0.01204 0 0 0.01204 0 0]
+/FontBBox [ -4 -21 83 62 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 16
+/LastChar 122
+/Widths 2066 0 R
+/Encoding 2067 0 R
+/CharProcs 2068 0 R
+>> endobj
+2066 0 obj
+[27.68 27.68 0 0 0 0 0 0 0 0 0 48.44 46.13 0 69.2 0 0 23.07 0 0 0 0 0 0 32.29 32.29 41.52 64.58 23.07 27.68 23.07 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 41.52 23.07 0 0 0 0 0 0 62.28 58.82 59.97 63.43 56.51 54.2 65.16 62.28 29.99 0 64.58 51.9 76.12 62.28 64.58 56.51 0 61.12 46.13 59.97 62.28 62.28 85.34 0 62.28 0 0 0 0 0 0 0 41.52 46.13 36.91 46.13 36.91 25.37 41.52 46.13 23.07 25.37 43.82 23.07 69.2 46.13 41.52 46.13 43.82 32.52 32.75 32.29 46.13 43.82 59.97 43.82 43.82 36.91 ]
+endobj
+2067 0 obj <<
+/Type /Encoding
+/Differences [16/a16/a17 18/.notdef 27/a27/a28 29/.notdef 30/a30 31/.notdef 33/a33 34/.notdef 40/a40/a41/a42/a43/a44/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58 59/.notdef 65/a65/a66/a67/a68/a69/a70/a71/a72/a73 74/.notdef 75/a75/a76/a77/a78/a79/a80 81/.notdef 82/a82/a83/a84/a85/a86/a87 88/.notdef 89/a89 90/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121/a122]
+>> endobj
+2068 0 obj <<
+/a16 2004 0 R
+/a17 2002 0 R
+/a27 2006 0 R
+/a28 2005 0 R
+/a30 2007 0 R
+/a33 1995 0 R
+/a40 1993 0 R
+/a41 1994 0 R
+/a42 1996 0 R
+/a43 1997 0 R
+/a44 1998 0 R
+/a45 2003 0 R
+/a46 1999 0 R
+/a47 2000 0 R
+/a48 2056 0 R
+/a49 2057 0 R
+/a50 2058 0 R
+/a51 2059 0 R
+/a52 2060 0 R
+/a53 2061 0 R
+/a54 2062 0 R
+/a55 2063 0 R
+/a56 2064 0 R
+/a57 2065 0 R
+/a58 2001 0 R
+/a65 2008 0 R
+/a66 2009 0 R
+/a67 2010 0 R
+/a68 2011 0 R
+/a69 2012 0 R
+/a70 2013 0 R
+/a71 2014 0 R
+/a72 2015 0 R
+/a73 2016 0 R
+/a75 2017 0 R
+/a76 2018 0 R
+/a77 2019 0 R
+/a78 2020 0 R
+/a79 2021 0 R
+/a80 2022 0 R
+/a82 2023 0 R
+/a83 2024 0 R
+/a84 2025 0 R
+/a85 2026 0 R
+/a86 2027 0 R
+/a87 2028 0 R
+/a89 2029 0 R
+/a97 2030 0 R
+/a98 2031 0 R
+/a99 2032 0 R
+/a100 2033 0 R
+/a101 2034 0 R
+/a102 2035 0 R
+/a103 2036 0 R
+/a104 2037 0 R
+/a105 2038 0 R
+/a106 2039 0 R
+/a107 2040 0 R
+/a108 2041 0 R
+/a109 2042 0 R
+/a110 2043 0 R
+/a111 2044 0 R
+/a112 2045 0 R
+/a113 2046 0 R
+/a114 2047 0 R
+/a115 2048 0 R
+/a116 2049 0 R
+/a117 2050 0 R
+/a118 2051 0 R
+/a119 2052 0 R
+/a120 2053 0 R
+/a121 2054 0 R
+/a122 2055 0 R
+>> endobj
+2069 0 obj <<
+/Length 102
+/Filter /FlateDecode
+>>
+stream
+x3235V0P0b#CCcCB.C Hr=BIQi*S!BA,A'W 
+endstream
+endobj
+2070 0 obj <<
+/Length 111
+/Filter /FlateDecode
+>>
+stream
+x3235V0P0b#CcsCB.C HrW04
+endstream
+endobj
+2071 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+xڝ=
+0
+endstream
+endobj
+2072 0 obj <<
+/Length 263
+/Filter /FlateDecode
+>>
+stream
+xڽ=N@ !
+$GQr-7q
+(ETV";Yepš{
+^ux߳=
+endstream
+endobj
+2073 0 obj <<
+/Length 196
+/Filter /FlateDecode
+>>
+stream
+x3732V0P
+endstream
+endobj
+2074 0 obj <<
+/Length 184
+/Filter /FlateDecode
+>>
+stream
+x}б
+0+-}'0t
+I옡ۤVr~>S
+hR(#^- &َ"lU"kgdfA!!)isޝKT oY<py~# ?@IzS=ZAh1s!o9)ʦ:#ǥ-~
+endstream
+endobj
+2075 0 obj <<
+/Length 159
+/Filter /FlateDecode
+>>
+stream
+x333T0P0bS3SsCB.S#
+ (PEqzrr
+endstream
+endobj
+2076 0 obj <<
+/Length 233
+/Filter /FlateDecode
+>>
+stream
+xڥѽ
+0->B4bۭAAAk(>BG3͇uP<hi,QCbK`^{5b/1+3sc5 <pO(q!0\B6DR%=U Z^LoR𨰨>=AYځK]k̵p&˜Mgd ok|xp +@Z/0d73(M\5|3WU =e0>
+endstream
+endobj
+2077 0 obj <<
+/Length 152
+/Filter /FlateDecode
+>>
+stream
+x3331V0P
+endstream
+endobj
+2078 0 obj <<
+/Length 199
+/Filter /FlateDecode
+>>
+stream
+xuν
+0+['0~I훙G#t =猪!ARG4!3vYW}؟pRP>@}vD?YM)C?mFAh0W
+endstream
+endobj
+2079 0 obj <<
+/Length 191
+/Filter /FlateDecode
+>>
+stream
+xڵϱ
+0
+4Bڐ3'`a`Ot턀
+endstream
+endobj
+2080 0 obj <<
+/Length 191
+/Filter /FlateDecode
+>>
+stream
+x]ν
+0S:w#>mб N(Q3
+\'3ʇE)rF2:Rߥ}ה$S2{Z|)/&QR:tCuňC
+P5 ҂5-Qle
+endstream
+endobj
+2081 0 obj <<
+/Length 264
+/Filter /FlateDecode
+>>
+stream
+xڅN0 ]1Drop @ZUt`b81# xlB$7bBb"~??;㺧j|ƶoE]p3A{)~=\SvK;rJ
+endstream
+endobj
+2082 0 obj <<
+/Length 122
+/Filter /FlateDecode
+>>
+stream
+x3235V0P
+@-\.
+0!("3#! F#.WO@.
+endstream
+endobj
+2083 0 obj <<
+/Length 105
+/Filter /FlateDecode
+>>
+stream
+x3235V0P
+endstream
+endobj
+2084 0 obj <<
+/Length 144
+/Filter /FlateDecode
+>>
+stream
+x336V0P0bcsJ1*26" \.'O.pc.}(BIQi*S!BA,? DM}?`@8P
+endstream
+endobj
+2085 0 obj <<
+/Length 149
+/Filter /FlateDecode
+>>
+stream
+x3530U0P0bS#csCB.
+
+endstream
+endobj
+2086 0 obj <<
+/Length 188
+/Filter /FlateDecode
+>>
+stream
+xڵб
+0+-} hP:j3:9SutPt(}Jc quːOTSLf"(I1i_3Ŏ ʍQ5ݮb $,
+endstream
+endobj
+2087 0 obj <<
+/Length 122
+/Filter /FlateDecode
+>>
+stream
+x3137U0P0bCSCB.cc
+endstream
+endobj
+2088 0 obj <<
+/Length 231
+/Filter /FlateDecode
+>>
+stream
+xmJ0,%<mi
+ Ƀxr=zPv>Z%c7!02I|zGƭVx|,͝Gif4ۛ Iody
+ՌJ&E8]&Rj
+Ф KX"9߰C"N +oq @F2h.pFmLF IA.gOլ
+endstream
+endobj
+2089 0 obj <<
+/Length 237
+/Filter /FlateDecode
+>>
+stream
+x}J@ba<BtnqU<VbuZZx(y-S,gX;|r~ov6ur@w:&?<At-ܼpbD(ͅLnbȐT,3s
+]
+endstream
+endobj
+2090 0 obj <<
+/Length 188
+/Filter /FlateDecode
+>>
+stream
+xڕϱ
+@ 
+Y6O`[ҥTAAAQPG#ttt $Byp :D%;摤8ߨ0XnlBuحVK>/'2%;%|AtG*A0`/PuF199a{Db#j3X5SS imhO_o`{
+endstream
+endobj
+2091 0 obj <<
+/Length 229
+/Filter /FlateDecode
+>>
+stream
+xڅϱN@ `G"yh_
+#^%pcHe``\wm# i䶔߸jQD^yݱKղߢ̾{{)oPFn(F
+ѩjd|L@6mБT /刏sg`|8c¨5 M◔i\Qn+ yrevEsᇎw 4s
+endstream
+endobj
+2092 0 obj <<
+/Length 235
+/Filter /FlateDecode
+>>
+stream
+xu=N0
+endstream
+endobj
+2093 0 obj <<
+/Length 200
+/Filter /FlateDecode
+>>
+stream
+xڝϱ
+`{2As3!!(hzĺt~8a@
+R0G=9q|s:.{tń8Mh3L+"dL-VKx{pprm
+endstream
+endobj
+2094 0 obj <<
+/Length 252
+/Filter /FlateDecode
+>>
+stream
+xE;N1 `G)Fr#/
+()@Pg)S{Al)iwiC]4M4O2;nyy~Âm82-}~|p#=yH`xp<WfL >v $",t?JIRsTR/v
+6#`f3G&-]\\\EV>RtU?p"F !SS`%
+^/x?}ϓ
+endstream
+endobj
+2095 0 obj <<
+/Length 237
+/Filter /FlateDecode
+>>
+stream
+xm1N@o4s؊R $(U
+i&d r2!.G?pS8|9]'?XPT)L%[2/jNl>9ے5FX = WUUG@
+endstream
+endobj
+651 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F44
+/FontMatrix [0.01204 0 0 0.01204 0 0]
+/FontBBox [ 2 -17 72 59 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 46
+/LastChar 117
+/Widths 2096 0 R
+/Encoding 2097 0 R
+/CharProcs 2098 0 R
+>> endobj
+2096 0 obj
+[26.53 0 47.75 47.75 47.75 47.75 47.75 47.75 47.75 47.75 47.75 47.75 26.53 0 0 0 0 0 0 0 67.93 68.97 73.23 62.74 60.09 0 0 0 0 0 0 0 0 0 0 0 71.62 0 66.43 0 0 0 0 0 0 0 0 0 0 0 0 46.42 53.05 0 0 43.77 0 47.75 0 26.53 0 0 26.53 0 0 0 0 0 39.33 0 0 53.05 ]
+endobj
+2097 0 obj <<
+/Type /Encoding
+/Differences [46/a46 47/.notdef 48/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58 59/.notdef 66/a66/a67/a68/a69/a70 71/.notdef 82/a82 83/.notdef 84/a84 85/.notdef 97/a97/a98 99/.notdef 101/a101 102/.notdef 103/a103 104/.notdef 105/a105 106/.notdef 108/a108 109/.notdef 114/a114 115/.notdef 117/a117]
+>> endobj
+2098 0 obj <<
+/a46 2069 0 R
+/a48 2086 0 R
+/a49 2087 0 R
+/a50 2088 0 R
+/a51 2089 0 R
+/a52 2090 0 R
+/a53 2091 0 R
+/a54 2092 0 R
+/a55 2093 0 R
+/a56 2094 0 R
+/a57 2095 0 R
+/a58 2070 0 R
+/a66 2071 0 R
+/a67 2072 0 R
+/a68 2073 0 R
+/a69 2074 0 R
+/a70 2075 0 R
+/a82 2076 0 R
+/a84 2077 0 R
+/a97 2078 0 R
+/a98 2079 0 R
+/a101 2080 0 R
+/a103 2081 0 R
+/a105 2082 0 R
+/a108 2083 0 R
+/a114 2084 0 R
+/a117 2085 0 R
+>> endobj
+2099 0 obj <<
+/Length 192
+/Filter /FlateDecode
+>>
+stream
+x334Q0P04P54W06S05PH1*22
+(s<L=\
+%E\N
+\.
+\.
+ @ 6@\RR (,T9L T;7 <C0#kF?4\E̖b| 0Pr
+
+endstream
+endobj
+2100 0 obj <<
+/Length 178
+/Filter /FlateDecode
+>>
+stream
+x334Q0P0T54W02W05PH1*22(Cs<L=\
+%E\N
+\.
+\.
+ 
+.WO@.
+endstream
+endobj
+2101 0 obj <<
+/Length 115
+/Filter /FlateDecode
+>>
+stream
+x32Գ0U0P
+endstream
+endobj
+2102 0 obj <<
+/Length 99
+/Filter /FlateDecode
+>>
+stream
+x323T0P0S04R02Q04WH1*@h
+HrJs{(r{*r;8+r(D*ry(o
+endstream
+endobj
+2103 0 obj <<
+/Length 233
+/Filter /FlateDecode
+>>
+stream
+xڅϱJ1?l0;/I wz'XpQ)8) 3L&{<sg
+A:7 .=9zvw0805)>2:Mh{4 SKNX jIվ5@UqMqG%^\ΌO1XEZ-'=z E4bM L5
+endstream
+endobj
+2104 0 obj <<
+/Length 211
+/Filter /FlateDecode
+>>
+stream
+xM;
+@/XM0BBBN4G(2E0ά>gNs8yҞDƁuaAFvQBv"d)-l!/CVJU<(=Tij
+#\UKYZ
+m{{־}͛n\~Z/4\~ey{
+endstream
+endobj
+2105 0 obj <<
+/Length 215
+/Filter /FlateDecode
+>>
+stream
+xM1j0Ox0!@ ";($@@=)CȔvl|cIV=ǓʙNN/3s?'J2[32ϲ%SAf5
+Ts *XD8
+&}h3Dڪ(6&ZWsbYgJe_ D/(/i)M:+vpC++箳mJz;{\
+endstream
+endobj
+2106 0 obj <<
+/Length 236
+/Filter /FlateDecode
+>>
+stream
+xeϱn0?閬  c)F 5:Tڎ@ REhy?BypVx}1C#֚5 c~ѴHuxFԝIUKnvf[֤(3
+hC!kZ̊M*_O
+endstream
+endobj
+2107 0 obj <<
+/Length 144
+/Filter /FlateDecode
+>>
+stream
+x323P0P0bcSCB.#K
+endstream
+endobj
+2108 0 obj <<
+/Length 238
+/Filter /FlateDecode
+>>
+stream
+xMJ@C`J;O`BBV0AOēz(T ZW'{0| ?c.S6kFdҧuwZ<Sr+SJ;~dy%+~8}rŘu1(v)N0p ][lZ~G$4#ĪUj)%ň3$_q='hu
+6uBz⁾stS _
+endstream
+endobj
+2109 0 obj <<
+/Length 223
+/Filter /FlateDecode
+>>
+stream
+xeαJ@? ¾qpyE p`
+A+ 괴Pn`y<BR"Ag;skv|Χ{~͏j#c1MϴjCZb ?^rAv=;LTL>5dR)e4~fQVb# y{e)+ITJ>cGU3R}I[|H
+endstream
+endobj
+2110 0 obj <<
+/Length 185
+/Filter /FlateDecode
+>>
+stream
+xM1
+0¿?i%E B*AAQPQpG2:oU7|K^aIHS%pMm
+5T9U,Ƙ:xEMq_6r ]HI[oLr+jYμM>PBWV^jyc^/LKXYRTt
+endstream
+endobj
+2111 0 obj <<
+/Length 181
+/Filter /FlateDecode
+>>
+stream
+x3631R0P0W5T06W06PH1*2
+(Bds<,=\
+%E\N
+@BA, 5~` `(
+endstream
+endobj
+2112 0 obj <<
+/Length 180
+/Filter /FlateDecode
+>>
+stream
+x-=0w {-0H;`A AnUؼG``KI~(\ <(BK
+endstream
+endobj
+2113 0 obj <<
+/Length 171
+/Filter /FlateDecode
+>>
+stream
+x363P0P0W5T06Q06PH1*22
+(Bds≮=\
+%E\N
+@BA, v ?0`~~0lob{:$ +fla`>Pj
+endstream
+endobj
+2114 0 obj <<
+/Length 203
+/Filter /FlateDecode
+>>
+stream
+x5;
+@ )Ӥ4 Q>VbBs#lF jmCM|`sQ > эtޏNVStF[a<#
+iJ
+7"%@67-kVuJRSv"g(m%
+8qLt
+endstream
+endobj
+2115 0 obj <<
+/Length 181
+/Filter /FlateDecode
+>>
+stream
+x]=
+@F4{3Ib!bSZYZZ(r!e
+1Y<y3/
+GɄ}Nxp4c@
+c>Gr8SV0&o)bŷD^9T  4VY(keMk5\k0@oPI
+endstream
+endobj
+2116 0 obj <<
+/Length 187
+/Filter /FlateDecode
+>>
+stream
+xe;
+@_,:и>SE+PI<G
+!.3;3[5尡-֌[0+\M+L$ n7QWy锯f] 'X
+%}H0˖K孋˳.:\m~$p 93/-,BE8
+endstream
+endobj
+2117 0 obj <<
+/Length 203
+/Filter /FlateDecode
+>>
+stream
+x51n@om4>`mc $ HPQD2EP!R.#lF3o?͟di <JsMe3<^owH|N\HzYpJzɟ)'_T.pw\alaMO6*0/Fݻ@-
+ߧV4pU_QY>JiO
+endstream
+endobj
+2118 0 obj <<
+/Length 198
+/Filter /FlateDecode
+>>
+stream
+x-=@ l@ hU I0Vj)D. ӹ,%K,Lgy?p؋ԧ_(>>E#8MR~z@99o+[UΗV(E*ý*Dn!R' [CⶂG䐳ɸ6
+dq?F
+endstream
+endobj
+2119 0 obj <<
+/Length 186
+/Filter /FlateDecode
+>>
+stream
+xu=
+@')S$\@7WVbB׊772b0Prr^ҙdC)/IY&$:&Q.zH)Ko$[* x@vFha+iI@uh;;
+/Mf³YXpcih@V|-
+endstream
+endobj
+2120 0 obj <<
+/Length 218
+/Filter /FlateDecode
+>>
+stream
+x-1JA3:lbbeREZy +;0f)=oP+e$G F2<\Nbp5w<]I9awcv<?޲/O`U!淃Y2M.iСI3%WF'`|L>/=M}?yXfI5;Q[j-~^A|V% O
+endstream
+endobj
+2121 0 obj <<
+/Length 161
+/Filter /FlateDecode
+>>
+stream
+x%̱
+0[Pj3:9:
+*S 0!g W%V8HTxpm,L
+Gm@e7|.5tt۠heI(bB|\$dW0Q7iI*-}}
+endstream
+endobj
+2122 0 obj <<
+/Length 232
+/Filter /FlateDecode
+>>
+stream
+xMJ@f1p7yLR4Z,r!ԥE!j|)7Y։oq='eywSy6ʳjf%%g(]p|r(+=kpvm]`ak?BŋU6h/ V-^ ytBE}%b&b#BiWʄ=;& 4,oM`HtZ҂>b
+endstream
+endobj
+2123 0 obj <<
+/Length 201
+/Filter /FlateDecode
+>>
+stream
+x=ɽjA#[ f_@qgElA d A+ RK! ,YHa3싌o0bŢ^֏SméD%s+2'Mq6ިϲ<5g XE<^Dd7\c%'^(<*%@F5C8+lrUaGEo*4zhLWFL
+endstream
+endobj
+2124 0 obj <<
+/Length 174
+/Filter /FlateDecode
+>>
+stream
+x==@![l򚽁 (?k
+D
+,ZZh#8
+GؒKH(IfFGe>xX| AalGu0>;eyGcv&l{Χ39CDUdQF4R1b L!n[ J(XC9J֐?
+endstream
+endobj
+2125 0 obj <<
+/Length 213
+/Filter /FlateDecode
+>>
+stream
+xE1jAoXp5s.gYDA dV)UL1]R9v^c;ۅ4c5zIcv<W>'RcN|3$%>!,lךd>eGvo%3P@KaoN&D?rL05 &ѭ I-AUMUE`PHk[ܨzJiAyRL
+endstream
+endobj
+2126 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+x3630U0P0S5T06Q06PH1*22
+(Bds<̹=\
+%E\N
+@BA,{ 6?@G ~13?`v>
+endstream
+endobj
+2127 0 obj <<
+/Length 166
+/Filter /FlateDecode
+>>
+stream
+x%;
+@YR,L& VbB:h{=”)qBkG^%<-0˥hIJLY^jL}&qK+XJXWÏ i'6¸¸Ӄ}p )nU"]C /x?t80
+endstream
+endobj
+2128 0 obj <<
+/Length 166
+/Filter /FlateDecode
+>>
+stream
+x%1
+@ )S H f , n!he!Vjih'(9BJ !W|I14%txGYS|Z8,PlLF|(݊$`
+PZm/q 
+endstream
+endobj
+2129 0 obj <<
+/Length 185
+/Filter /FlateDecode
+>>
+stream
+x332Q0P0S5T0T06PH1*26
+(Bds<=\
+%E\N
+@BA, r 525 ,j~T
+endstream
+endobj
+2130 0 obj <<
+/Length 179
+/Filter /FlateDecode
+>>
+stream
+x5=
+@YXB/d.YtB`
+A+ RK!B9zS4Z<~6MShBØlD/Yᖒe1,VtOf9u;]LS/6vZKY+)_JU̝g J{֍q^~0KA43
+endstream
+endobj
+2131 0 obj <<
+/Length 222
+/Filter /FlateDecode
+>>
+stream
+xMαJAba
+Bn^@.w&@Vb%(\f|2LbYy9˜_
+ZR50/o4){jDٍƔշxl~wź/,\D.:Q$ҪNJgԸ3V( 5:q 8!~
+H﷾=0'@5Q
+endstream
+endobj
+2132 0 obj <<
+/Length 183
+/Filter /FlateDecode
+>>
+stream
+x36ҳ0U0P0Q5T06S06PH1*26
+(
+@=\.
+ v`>~O;:>urd?0`~
+7TՓ+
+endstream
+endobj
+2133 0 obj <<
+/Length 205
+/Filter /FlateDecode
+>>
+stream
+xEʱjAoba{q^!WIBLJޓM7r 1=󛅝ɋ<Ǭ|y}Td\V }|pFvˌUS x=܃åt{.*|+W^:2^#Ya#
+ Ɛ!\g9(q4(#9
+endstream
+endobj
+650 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F42
+/FontMatrix [0.01506 0 0 0.01506 0 0]
+/FontBBox [ -1 -17 59 50 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 40
+/LastChar 121
+/Widths 2134 0 R
+/Encoding 2135 0 R
+/CharProcs 2136 0 R
+>> endobj
+2134 0 obj
+[29.14 29.14 0 0 0 25.49 0 0 0 0 0 0 0 0 0 0 0 0 21.85 0 0 0 0 0 0 0 0 50.99 53.75 48.29 0 55.1 0 27.38 0 0 0 0 52.88 0 0 0 0 40.06 50.99 0 0 0 0 0 0 0 0 0 0 0 0 36.42 32.78 32.78 36.42 32.78 21.85 32.78 36.42 21.85 0 32.78 18.21 58.27 40.06 36.42 36.42 0 30.05 29.14 23.67 38.24 32.78 47.35 32.85 34.6 ]
+endobj
+2135 0 obj <<
+/Type /Encoding
+/Differences [40/a40/a41 42/.notdef 45/a45 46/.notdef 58/a58 59/.notdef 67/a67/a68/a69 70/.notdef 71/a71 72/.notdef 73/a73 74/.notdef 78/a78 79/.notdef 83/a83/a84 85/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105 106/.notdef 107/a107/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117/a118/a119/a120/a121]
+>> endobj
+2136 0 obj <<
+/a40 2099 0 R
+/a41 2100 0 R
+/a45 2102 0 R
+/a58 2101 0 R
+/a67 2103 0 R
+/a68 2104 0 R
+/a69 2105 0 R
+/a71 2106 0 R
+/a73 2107 0 R
+/a78 2108 0 R
+/a83 2109 0 R
+/a84 2110 0 R
+/a97 2111 0 R
+/a98 2112 0 R
+/a99 2113 0 R
+/a100 2114 0 R
+/a101 2115 0 R
+/a102 2116 0 R
+/a103 2117 0 R
+/a104 2118 0 R
+/a105 2119 0 R
+/a107 2120 0 R
+/a108 2121 0 R
+/a109 2122 0 R
+/a110 2123 0 R
+/a111 2124 0 R
+/a112 2125 0 R
+/a114 2126 0 R
+/a115 2127 0 R
+/a116 2128 0 R
+/a117 2129 0 R
+/a118 2130 0 R
+/a119 2131 0 R
+/a120 2132 0 R
+/a121 2133 0 R
+>> endobj
+2137 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcCcCB.#
+endstream
+endobj
+2138 0 obj <<
+/Length 178
+/Filter /FlateDecode
+>>
+stream
+xu1
+@E Fc@`
+A+ RK E;=Z,S:ٵ^5?ј5 :I9~HEEj&%5;j@XNِ*ycXo*EXW#
+endstream
+endobj
+2139 0 obj <<
+/Length 173
+/Filter /FlateDecode
+>>
+stream
+xu1
+@EX FbVj)hk<#XZq38%S֜0$I{Cg2 5IHvG*- BƤ쒯ہT!UqmXoV|Z4@;DOD/>{
+O,<:!a3\ſ?g)D$:Z
+4h- 6
+endstream
+endobj
+2140 0 obj <<
+/Length 166
+/Filter /FlateDecode
+>>
+stream
+x=!@E OvK+IJIXA
+APD@@G( y?,
+xx_ay)];rجlBل.M±iq[ H4eD×MgT'L;u
+Bt3ۿ;< /7k5&
+endstream
+endobj
+2141 0 obj <<
+/Length 96
+/Filter /FlateDecode
+>>
+stream
+x3632W0P04Q5S02T01SH1*2
+(Aes≮=\
+%E\N
+\.
+\.
+H\\\
+endstream
+endobj
+2142 0 obj <<
+/Length 167
+/Filter /FlateDecode
+>>
+stream
+x-1
+PDW,m<s~~LJ!FVbz4,-$q'Xn 2Pin,AZc2 -Kܮr5WWa4V8T%2} ~"=iЌǠ3t'1,Vmk.U4
+endstream
+endobj
+2143 0 obj <<
+/Length 114
+/Filter /FlateDecode
+>>
+stream
+x3632W0P04V5S06V01SH1*2(As< -=\
+%E\N
+\.
+\.
+
+endstream
+endobj
+2144 0 obj <<
+/Length 114
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0R5S02R01SH1*2
+(Ads< -=\
+%E\N
+\.
+\.
+
+endstream
+endobj
+2145 0 obj <<
+/Length 151
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0Q5S06T01SH1*22
+(Ads≮=\
+%E\N
+\.
+\.
+ ?
+endstream
+endobj
+2146 0 obj <<
+/Length 159
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0V5S06R01SH1*2
+(Ads<,=\
+%E\N
+\.
+\.
+ ``bv0~
+endstream
+endobj
+2147 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0V5S06R01SH1*2
+(Ads<,=\
+%E\N
+\.
+\.
+
+r3@?
+endstream
+endobj
+2148 0 obj <<
+/Length 102
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0Q5W06T5TH1*22
+(A$s≮=BIQi*S!BA,B ?Ab\\\
+endstream
+endobj
+2149 0 obj <<
+/Length 107
+/Filter /FlateDecode
+>>
+stream
+x3632W0P04F
+&F
+)\\@HrW
+endstream
+endobj
+2150 0 obj <<
+/Length 132
+/Filter /FlateDecode
+>>
+stream
+x3632W0P04R0P02U01TH1*
+
+
+endstream
+endobj
+2151 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0Q0S06T06UH1*22(Y%s≮=\
+%E\N
+\.
+\.
+ r `,@Fៜy 7 `A@A@C6Փ+
+endstream
+endobj
+2152 0 obj <<
+/Length 111
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0R0U06V06UH1*26P
+endstream
+endobj
+2153 0 obj <<
+/Length 120
+/Filter /FlateDecode
+>>
+stream
+x3632W0P04RеT02QTH1*24
+-2ɹ\N\
+\@q.}O_T.}
+endstream
+endobj
+2154 0 obj <<
+/Length 96
+/Filter /FlateDecode
+>>
+stream
+x3632W0P04F
+
+)\\@NrW
+%E\N
+\.
+\.
+v `Փ+
+endstream
+endobj
+2155 0 obj <<
+/Length 154
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0Q5S06T01SH1*22
+(Ads≮=\
+%E\N
+\.
+\.
+  |yf`{ : ?@?@03?
+endstream
+endobj
+2156 0 obj <<
+/Length 103
+/Filter /FlateDecode
+>>
+stream
+x3632W0P04F
+F
+)\\@HrW
+endstream
+endobj
+2157 0 obj <<
+/Length 131
+/Filter /FlateDecode
+>>
+stream
+x3632W0P04RеT02Q0TH1*24([@s< =\
+%E\N
+@QhX.Oy0h π@=@؁ 00pzrr
+endstream
+endobj
+2158 0 obj <<
+/Length 108
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0R04R06V0PH1*26P
+endstream
+endobj
+2159 0 obj <<
+/Length 135
+/Filter /FlateDecode
+>>
+stream
+x3632W0P04T02V02Q01SH1*24!Rɹ\N\
+F\@.}O_T.}
+
+endstream
+endobj
+2160 0 obj <<
+/Length 151
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0T02V06Q01TH1*26
+- 2ɹ\N\
+F\@a.}O_T.}
+endstream
+endobj
+2161 0 obj <<
+/Length 101
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0S04R0T04WH1*22
+(B$s<=L=}JJS ]  b<]\\\
+endstream
+endobj
+2162 0 obj <<
+/Length 151
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0T02V06Q01TH1*26
+- 2ɹ\N\
+F\@a.}O_T.}
+endstream
+endobj
+2163 0 obj <<
+/Length 101
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0S04R0T04WH1*22
+(B$s<=L=}JJS ]  b<]\\\
+endstream
+endobj
+2164 0 obj <<
+/Length 108
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0W02R0P01RH1*22P
+endstream
+endobj
+2165 0 obj <<
+/Length 145
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bccCCB.crAɹ\N\
+\@Q.}O_T.}
+
+endstream
+endobj
+2166 0 obj <<
+/Length 209
+/Filter /FlateDecode
+>>
+stream
+xe=0Q MA0sp HRQ *
+endstream
+endobj
+2167 0 obj <<
+/Length 214
+/Filter /FlateDecode
+>>
+stream
+x%1N0бRXf
+Rac`|R@
+endstream
+endobj
+2168 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+xe=AK *#t`Gp@@\C]`X<W*T3/xޫG>}gx|:2#NKL61YrI?L/R=mFa
+endstream
+endobj
+2169 0 obj <<
+/Length 213
+/Filter /FlateDecode
+>>
+stream
+x-αJAR ;/{{S[B*Xe{([n8_ e{]r-_7?<ntUOnuCQwr_VɭsF!XHX"bA2l
+endstream
+endobj
+2170 0 obj <<
+/Length 218
+/Filter /FlateDecode
+>>
+stream
+xM̱JA wp 1WZ+P,\:żA^a)[/^
+>~q^]r=+~. }iyzen;@w3[x|A݊J.Y1D`LN;?B)uNM&1m#`) 5a#hJ 1ic&hls04+dvx=Y
+endstream
+endobj
+2171 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+x}1
+P6=Ob2# A+ RK E;!9?GH\x3L#NUb85|2t8}/TX
+wgtЮ~{),6 ^pt [@< *Z51^yA9HU=t-
+endstream
+endobj
+2172 0 obj <<
+/Length 158
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcc#CB.crAɹ\N\
+\@Q.}O_T.}
+endstream
+endobj
+2173 0 obj <<
+/Length 161
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bc#CCB.#K
+endstream
+endobj
+2174 0 obj <<
+/Length 190
+/Filter /FlateDecode
+>>
+stream
+xڍ=0 ]uGi"" & Pz!#H#t8P#)~BL6Ř3챨P.I(,ft:w(%X1ِWotZ B`/
+endstream
+endobj
+2175 0 obj <<
+/Length 160
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bc#CCB.crAɹ\N\
+\@Q.}O_T.}
+XS
+endstream
+endobj
+2176 0 obj <<
+/Length 131
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcCCB.cC
+endstream
+endobj
+2177 0 obj <<
+/Length 134
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bccCCB.c
+%E\N
+@B4Pe,B` f@`> G11<X=A\A|.WO@.
+endstream
+endobj
+2178 0 obj <<
+/Length 188
+/Filter /FlateDecode
+>>
+stream
+xuα
+@ A>^űP+x8[}M
+r`Z&ː@4SH1M"ҚN^Q+x̠ڑQ1*qFmiQx@ȗ4<n ϥdi^VS񠀑sU{u wӪϑVv•h ۂK[#]
+endstream
+endobj
+2179 0 obj <<
+/Length 114
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcCCB.c#
+endstream
+endobj
+2180 0 obj <<
+/Length 98
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcCCB.#c I$r9yr+s{
+>|
+endstream
+endobj
+2181 0 obj <<
+/Length 138
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0V5T06R01TH1*2
+(Ads<,=\
+%E\N
+\.
+\.
+ 0
+ \=
+endstream
+endobj
+2182 0 obj <<
+/Length 177
+/Filter /FlateDecode
+>>
+stream
+x==
+@4s *v4),J--h9a
+[dywadN5qlb vjbVrT~{9ouh|"҆M?BR $ А `5@Xu2(-vxM ճC^I-Ж6N|-
+endstream
+endobj
+2183 0 obj <<
+/Length 113
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bccCCB.crAɹ\N\
+\@Q.}O_T.}
+endstream
+endobj
+2184 0 obj <<
+/Length 144
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcCCB.c#
+
+endstream
+endobj
+2185 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bccCCB.crAɹ\N\
+\@Q.}O_T.}
+ b(b9(b~$ތ̇C0b(bk0`y(\=
+endstream
+endobj
+2186 0 obj <<
+/Length 150
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0Q5T06T01RH1*22
+!2ɹ\N\
+Ff\@a.}O_T.}
+endstream
+endobj
+2187 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+xڍ-A  HjBeIA
+AP,?G(a
+ByM}m9{PFn)V^.'-NJSriH^]`԰HgD^ *ag
+l~yiwz?`,ZGo 2-m T
+endstream
+endobj
+2188 0 obj <<
+/Length 176
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0QеT06T01RH1*22
+(Bds≮=\
+%E\N
+@BA, 0`?77170?ةA5@C}[@@X\=
+endstream
+endobj
+2189 0 obj <<
+/Length 187
+/Filter /FlateDecode
+>>
+stream
+x}10 PiňTD$02`N6Fp8B!N'*'IH(txF24 ņBpk咮EDQVRò m+
+endstream
+endobj
+2190 0 obj <<
+/Length 204
+/Filter /FlateDecode
+>>
+stream
+xM1j@oT4HVZ݂@T*EH4ncA.GJBh4. T[B+)Z{}/e/~ɰк߼meՈ{VX\ㇸӝRj*Zamb?159:EB#8 'd@
+endstream
+endobj
+2191 0 obj <<
+/Length 123
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bccCCB.crAɹ\N\
+\@Q.}O_T.}
+endstream
+endobj
+2192 0 obj <<
+/Length 144
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0T5T06Q01TH1*26
+(Ads<=\
+%E\N
+\.
+\.
+G h01 Xg` 'W 
+endstream
+endobj
+2193 0 obj <<
+/Length 158
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0T5T06Q01TH1*26
+(Ads<=\
+%E\N
+\.
+\.
+A| ~2FCءb@?? 00r
+
+endstream
+endobj
+2194 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0T5T06Q01TH1*26
+(Ads<=\
+%E\N
+\.
+\.
+0G6 6 lP#P?U1\8c}-*!y8!?3~o`|
+endstream
+endobj
+2195 0 obj <<
+/Length 180
+/Filter /FlateDecode
+>>
+stream
+xEα
+0+['0i NVmGȘR9533h)+*I~8EbGJX+jM㌢,sI><02sD
+endstream
+endobj
+2196 0 obj <<
+/Length 166
+/Filter /FlateDecode
+>>
+stream
+xڕʱ
+0+rO`ڦVV08[>Z1CiM,;lF )OU;  Tr(eYuE/+43qĖr9ހ t
+"xzُ݈
+endstream
+endobj
+2197 0 obj <<
+/Length 174
+/Filter /FlateDecode
+>>
+stream
+xڅ=
+@Y, ( n!he!Vjih=ZGB\_t_fYDA&T.)9+!+ Yz)kue]V\1Ħ2ׅ\C1L{ Z&yp:P?u;=XKHk{W
+endstream
+endobj
+2198 0 obj <<
+/Length 168
+/Filter /FlateDecode
+>>
+stream
+x-̽
+0>B LP)P+AAA9>cR~p;Κ9Vhkr+tm f-S0~.Q= *4qI9bH+MjT
+  3B-). #-%$s|;tI
+endstream
+endobj
+2199 0 obj <<
+/Length 171
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bccCCB.c
+%E\N
+@B4Pe,P1;>| ``0@:(Âj>0PH?`@~?s.WO@.
+endstream
+endobj
+2200 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcC#KCB.#
+%E\N
+\.
+\.
+ a`XA=}C=C=CX0LS|zy
+endstream
+endobj
+2201 0 obj <<
+/Length 172
+/Filter /FlateDecode
+>>
+stream
+xu-0ǻL<#은r $H,Zq9
+endstream
+endobj
+2202 0 obj <<
+/Length 170
+/Filter /FlateDecode
+>>
+stream
+x]
+0E_xK?! L")P+AAAѵͧS Dpz>*NhtxoW銭EA-*yAnQutTv9O `v587PD"D?D0A9J|upeq.L
+endstream
+endobj
+2203 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcCCB. HrW02
+\.
+ 0@l0ر`c`@7
+endstream
+endobj
+2204 0 obj <<
+/Length 214
+/Filter /FlateDecode
+>>
+stream
+xU=n@4 -w.f 4HqT)
+endstream
+endobj
+2205 0 obj <<
+/Length 144
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcCCB.c#
+endstream
+endobj
+2206 0 obj <<
+/Length 119
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcC#CB.#
+endstream
+endobj
+2207 0 obj <<
+/Length 144
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0V54U02U01RH1*22(Cs< =\
+%E\N
+@QhX.O ?PP01 ba? ?`'W 
+endstream
+endobj
+2208 0 obj <<
+/Length 177
+/Filter /FlateDecode
+>>
+stream
+x}1
+@Ѕ)ir l6b#X6XXzs),ZY<^7SDE{1GX05(cnQ)-t6"-yBQ^W/Bg;Ze#R VnVkxS>
+aP9~cs|"Xj
+endstream
+endobj
+2209 0 obj <<
+/Length 112
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bc#CCB. HrW02
+\.
+Gz f8\?aՓ+
+endstream
+endobj
+2210 0 obj <<
+/Length 148
+/Filter /FlateDecode
+>>
+stream
+x3632W0P5f
+F
+)\\@`\.'O.p.}0BIQi*S!B4Pe,B<0H2?'8`@?? b\\\
+endstream
+endobj
+2211 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bc#KCB.c#
+endstream
+endobj
+2212 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcC#KCB.#3
+endstream
+endobj
+2213 0 obj <<
+/Length 178
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0T54U06V0TH1*26(@s< =\
+%E\N
+@QhX.O
+endstream
+endobj
+2214 0 obj <<
+/Length 194
+/Filter /FlateDecode
+>>
+stream
+xڕ=
+@49tlXb+P5/o2)l,l o<
+GhGa؞6{L4%)rjszFy2G'o:%oy2t͛1!.C.åa( _ NۨWqnl?j^w;
+endstream
+endobj
+2215 0 obj <<
+/Length 142
+/Filter /FlateDecode
+>>
+stream
+xڍ;
+AЎ+
+}燈麂(+G(a1 FC?f˾'5&¬9XywYNql-ࡒDE4'L*Jz#R"?OsՎY
+o"G
+endstream
+endobj
+2216 0 obj <<
+/Length 160
+/Filter /FlateDecode
+>>
+stream
+x1
+@D*77@VbBmM<B-77żabJrzXrʰ:|XUdj9e';XZM=QS.oKhp 7Pa@ߠ*D
+endstream
+endobj
+2217 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bc 2WH1* \.'O.p#s.}(BIQi*S!BA,Cܸaz
+endstream
+endobj
+2218 0 obj <<
+/Length 127
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bc#KCB.c#
+endstream
+endobj
+2219 0 obj <<
+/Length 155
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcc#KCB.crAɹ\N\
+\@Q.}O_T.}
+`X```o`r
+
+endstream
+endobj
+2220 0 obj <<
+/Length 154
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bc#KCB.c#
+endstream
+endobj
+2221 0 obj <<
+/Length 170
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcc#KCB.crAɹ\N\
+\@Q.}O_T.}
+endstream
+endobj
+2222 0 obj <<
+/Length 183
+/Filter /FlateDecode
+>>
+stream
+x]
+@ t^vuD CPѩ:}4GA]-~ qh$yS:xAIO&نGP{drI,YE%CҳfaJQi ф
+endstream
+endobj
+2223 0 obj <<
+/Length 167
+/Filter /FlateDecode
+>>
+stream
+xM1
+@EX2'p b+T ģ(9–So?tgunv8^v!ZӮqIg*gVlw2Fj$] Ѽ
+endstream
+endobj
+2224 0 obj <<
+/Length 180
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0V5T06R01RH1*2
+(Cds<,=\
+%E\N
+\.
+\.
+ ``?ȳc`0\b1:03AB A
+
+endstream
+endobj
+2225 0 obj <<
+/Length 131
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bc#CB.#c I$r9yr+s{
+endstream
+endobj
+2226 0 obj <<
+/Length 188
+/Filter /FlateDecode
+>>
+stream
+xM1@!$p.6AL0XF;#{4G҂0bWg<4ih:fxANه
+Ֆtj)WTՊn US]Fn dp֖LAZ\ C>¯  
+
+W
+endstream
+endobj
+2227 0 obj <<
+/Length 198
+/Filter /FlateDecode
+>>
+stream
+x==
+@X!sdn0X{%G#2| 7xhhƜr΃sÅcF2S.9iZ޲^L\z?g.tO**I'* xzy\?«N48=;z_B%jiPK|%͕(iC"S
+endstream
+endobj
+2228 0 obj <<
+/Length 173
+/Filter /FlateDecode
+>>
+stream
+xu1Q(6>["J!*
+B'888R%d3ͬf䜶2]?k)JSu!WHwJl1i*T}* xD ХtA= wлD ]@uaA)yCB
+endstream
+endobj
+2229 0 obj <<
+/Length 178
+/Filter /FlateDecode
+>>
+stream
+xڍ1
+0'
+o]@Ӥ;5P+AAAh9JPqtt<J(TR&h/2aB K|M2G>1rz@^.$WlQWĜ\
+0 {~;V<r>bBހڄߌ] i\}IOh
+endstream
+endobj
+2230 0 obj <<
+/Length 201
+/Filter /FlateDecode
+>>
+stream
+x==
+@ )2M6v ),J--BܣQr--B1 _}3xh&QA
+C#Chf4*/ J;2S+QkgԳ͜r \/ "fw'!I}?.)g"aʷNco=j-+~j?l/idGQSҗHo$AO\
+endstream
+endobj
+2231 0 obj <<
+/Length 170
+/Filter /FlateDecode
+>>
+stream
+xڅ1
+@/49B݈bSZYZ
+Qh9J2E0Βvg; ly 5]Dvr8SڲH-%&vH9kR 4{J
+endstream
+endobj
+2232 0 obj <<
+/Length 189
+/Filter /FlateDecode
+>>
+stream
+xeN;
+@"0Ms&b*1[ZYZZ(ډ(9B5b`x~hǔPJEL^ uޓ e;biPI(=,rP))m%[4A -?!D!o DN@*>o;n+wFaBY^[Yw
+_Y
+endstream
+endobj
+2233 0 obj <<
+/Length 209
+/Filter /FlateDecode
+>>
+stream
+xMαJA?\qa}0{1BVb_lGHqbR5Ӝ/WYMe(,x7On)s\QB{/ַ\SC#Fʀ
+
+ݣ N~d-\PŁ7lQ'I9W'H;~
+endstream
+endobj
+649 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F41
+/FontMatrix [0.01506 0 0 0.01506 0 0]
+/FontBBox [ -1 -16 36 46 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 16
+/LastChar 237
+/Widths 2234 0 R
+/Encoding 2235 0 R
+/CharProcs 2236 0 R
+>> endobj
+2234 0 obj
+[35.27 35.27 0 0 0 35.27 0 0 0 0 0 0 0 0 0 0 0 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 0 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35.27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35.27 ]
+endobj
+2235 0 obj <<
+/Type /Encoding
+/Differences [16/a16/a17 18/.notdef 21/a21 22/.notdef 33/a33/a34/a35/a36/a37/a38/a39/a40/a41/a42/a43/a44/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58/a59/a60/a61/a62/a63/a64/a65/a66/a67/a68/a69/a70/a71/a72/a73/a74/a75/a76/a77/a78/a79/a80/a81/a82/a83/a84/a85/a86/a87/a88/a89/a90/a91/a92/a93 94/.notdef 95/a95/a96/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121/a122/a123/a124/a125 126/.notdef 159/a159 160/.notdef 237/a237]
+>> endobj
+2236 0 obj <<
+/a16 2162 0 R
+/a17 2160 0 R
+/a21 2163 0 R
+/a33 2149 0 R
+/a34 2164 0 R
+/a35 2165 0 R
+/a36 2166 0 R
+/a37 2167 0 R
+/a38 2170 0 R
+/a39 2150 0 R
+/a40 2138 0 R
+/a41 2139 0 R
+/a42 2151 0 R
+/a43 2152 0 R
+/a44 2153 0 R
+/a45 2161 0 R
+/a46 2154 0 R
+/a47 2155 0 R
+/a48 2224 0 R
+/a49 2225 0 R
+/a50 2226 0 R
+/a51 2227 0 R
+/a52 2228 0 R
+/a53 2229 0 R
+/a54 2230 0 R
+/a55 2231 0 R
+/a56 2232 0 R
+/a57 2233 0 R
+/a58 2156 0 R
+/a59 2157 0 R
+/a60 2140 0 R
+/a61 2158 0 R
+/a62 2142 0 R
+/a63 2171 0 R
+/a64 2168 0 R
+/a65 2172 0 R
+/a66 2173 0 R
+/a67 2174 0 R
+/a68 2175 0 R
+/a69 2176 0 R
+/a70 2177 0 R
+/a71 2178 0 R
+/a72 2179 0 R
+/a73 2180 0 R
+/a74 2181 0 R
+/a75 2182 0 R
+/a76 2183 0 R
+/a77 2184 0 R
+/a78 2185 0 R
+/a79 2186 0 R
+/a80 2187 0 R
+/a81 2188 0 R
+/a82 2189 0 R
+/a83 2190 0 R
+/a84 2191 0 R
+/a85 2192 0 R
+/a86 2193 0 R
+/a87 2194 0 R
+/a88 2195 0 R
+/a89 2196 0 R
+/a90 2197 0 R
+/a91 2143 0 R
+/a92 2145 0 R
+/a93 2144 0 R
+/a95 2148 0 R
+/a96 2159 0 R
+/a97 2198 0 R
+/a98 2199 0 R
+/a99 2200 0 R
+/a100 2201 0 R
+/a101 2202 0 R
+/a102 2203 0 R
+/a103 2204 0 R
+/a104 2205 0 R
+/a105 2206 0 R
+/a106 2207 0 R
+/a107 2208 0 R
+/a108 2209 0 R
+/a109 2210 0 R
+/a110 2211 0 R
+/a111 2212 0 R
+/a112 2213 0 R
+/a113 2214 0 R
+/a114 2215 0 R
+/a115 2216 0 R
+/a116 2217 0 R
+/a117 2218 0 R
+/a118 2219 0 R
+/a119 2220 0 R
+/a120 2221 0 R
+/a121 2222 0 R
+/a122 2223 0 R
+/a123 2146 0 R
+/a124 2141 0 R
+/a125 2147 0 R
+/a159 2169 0 R
+/a237 2137 0 R
+>> endobj
+2237 0 obj <<
+/Length 98
+/Filter /FlateDecode
+>>
+stream
+x323T0P0bC CCCB. m
+
+endstream
+endobj
+2238 0 obj <<
+/Length 161
+/Filter /FlateDecode
+>>
+stream
+x3133S0P0Q54W06W05PH1*26(Cs<=\
+%E\N
+\.
+\.
+ @@r@,6@l@\
+endstream
+endobj
+2239 0 obj <<
+/Length 106
+/Filter /FlateDecode
+>>
+stream
+x323T0P0bC cCB.CC
+@-\.
+ ?
+endstream
+endobj
+2240 0 obj <<
+/Length 93
+/Filter /FlateDecode
+>>
+stream
+x3234T0P0T04R02V0TH1*2 (C$s< =̹=}JJS.
+@\.
+D\\\
+endstream
+endobj
+2241 0 obj <<
+/Length 234
+/Filter /FlateDecode
+>>
+stream
+x]1N@EMi -  *
+DERR@HD)B\ ˟qhXrKv) _90(?l_xRq ِsRǜݕL1To ߮Զ$kbA[Rio]
+endstream
+endobj
+2242 0 obj <<
+/Length 158
+/Filter /FlateDecode
+>>
+stream
+x313P0P0b#3CB.rAɹ\N\
+&\@Q.}O_T.}
+endstream
+endobj
+2243 0 obj <<
+/Length 145
+/Filter /FlateDecode
+>>
+stream
+x313P0P0b#3CB.rAɹ\N\
+&\@Q.}O_T.}
+endstream
+endobj
+2244 0 obj <<
+/Length 225
+/Filter /FlateDecode
+>>
+stream
+xm͊0s#tn?{܃7Q#C8Ek fg:1/ܦ<>V.60`)jx9W)&k_t ],xK#\)bZAVucH|tSMl$^=1LdW̙j\ZyQU w-|[
+endstream
+endobj
+2245 0 obj <<
+/Length 191
+/Filter /FlateDecode
+>>
+stream
+x3537R0P0bS3CB.SrAɹ\N\
+\@Q.}O_T.}
+endstream
+endobj
+2246 0 obj <<
+/Length 240
+/Filter /FlateDecode
+>>
+stream
+xڭ=nA a|]#X)[D
+J()@Pހ+(!gvIy_Xs*iE!P
+JQ/ -ѷt܎/Tо
+-}T
+endstream
+endobj
+2247 0 obj <<
+/Length 181
+/Filter /FlateDecode
+>>
+stream
+x3332Q0P0bS 3CB.S HrW05
+endstream
+endobj
+2248 0 obj <<
+/Length 151
+/Filter /FlateDecode
+>>
+stream
+x3530V0P
+endstream
+endobj
+2249 0 obj <<
+/Length 227
+/Filter /FlateDecode
+>>
+stream
+xڥбN02Dŏ{p#H-R)`b@̾GQ3DCW,K|w_\W[je\{{TLɛËtT0<NZ[ymea+D5VQ)9
+65ڜQݜF~Jx c&#iS,w”9*eoͲE n'+ ~g
+endstream
+endobj
+2250 0 obj <<
+/Length 231
+/Filter /FlateDecode
+>>
+stream
+xuбJ` ||C!K Z,Wpw&+
+endstream
+endobj
+2251 0 obj <<
+/Length 216
+/Filter /FlateDecode
+>>
+stream
+xڥ=0 *y @D?`b@L
+endstream
+endobj
+2252 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+x3531S0P0bSC ;Ő7
+&\@Q.}O_T.}
+endstream
+endobj
+2253 0 obj <<
+/Length 212
+/Filter /FlateDecode
+>>
+stream
+xڍб0
+x@dQbO.w
+G[^|߀g5
+9g(rT:cKsTz5mw?3Rԡ9G+󜭳:47Fz?]Դ+3ef7jtTdžMD
+endstream
+endobj
+2254 0 obj <<
+/Length 230
+/Filter /FlateDecode
+>>
+stream
+xM1N@Љ\XGع
+{-3d=Ywo{q2V΂9Kx}L^yӱŒw7~s{)V
+Rj/ˍ1̠Qמ(';25ԊZq ,@"
+endstream
+endobj
+2255 0 obj <<
+/Length 171
+/Filter /FlateDecode
+>>
+stream
+x1
+@/)irYL!he!Vjih'y"8"Xyy0^ܵ솜t tq2$=%%;Gfk2OL>%Sr`A(:72@M*ࢱ6k-mF?I 7jPs
+endstream
+endobj
+2256 0 obj <<
+/Length 236
+/Filter /FlateDecode
+>>
+stream
+xmϱJ@ )#d^@7 L!he!VzvGnm!e+>Yo˪B*(E#o%s`XwUIl{ڰ]=Hv-ϥ/ܭEuD_RuD''E@ D=`wf$ |S
+2 RRg8o\#! h]d8Fs"B)mǏt
+endstream
+endobj
+2257 0 obj <<
+/Length 180
+/Filter /FlateDecode
+>>
+stream
+x]α
+@ 'ZO)NZI7#t4AC|<sDfK].gG#]_8-7 V(=
+endstream
+endobj
+2258 0 obj <<
+/Length 177
+/Filter /FlateDecode
+>>
+stream
+x313P0P0b#3CB.c HrW0
+endstream
+endobj
+2259 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+x3634Q0P0acCB. \.'O.p KLz*r;8+r(D*ry(0c`!=QC}0HM`j0`h] \=
+endstream
+endobj
+2260 0 obj <<
+/Length 178
+/Filter /FlateDecode
+>>
+stream
+xڝ10 E]1T#' -[R$2 Ās>JБ!$NL0IuI~k<a,֔^Eet9_46-ښ
+_o
+endstream
+endobj
+2261 0 obj <<
+/Length 171
+/Filter /FlateDecode
+>>
+stream
+xM=
+@'LGȜd BVb-G#Ld`=)*]Vt.:je\NW =嚯(͆e]RCAꈦ!. e^ bH%>w=Lvo:6!ȳtJ<9 +;|NK!
+endstream
+endobj
+2262 0 obj <<
+/Length 141
+/Filter /FlateDecode
+>>
+stream
+x32ѳ0U0P0bc#3CB.#K
+endstream
+endobj
+2263 0 obj <<
+/Length 223
+/Filter /FlateDecode
+>>
+stream
+xuJ1GLo`4wW.'aW(Z>Z%fs8ˤ%ESK y#u+ c m'7
+hA*Њ
+&d2d;ꬎzM ̖i-äK'L0ÙI?ތ?)u
+endstream
+endobj
+2264 0 obj <<
+/Length 145
+/Filter /FlateDecode
+>>
+stream
+x313P0P0ac3CB.c HrW0
+
+endstream
+endobj
+2265 0 obj <<
+/Length 118
+/Filter /FlateDecode
+>>
+stream
+x323T0P0b#CsCB.C3
+
+endstream
+endobj
+2266 0 obj <<
+/Length 156
+/Filter /FlateDecode
+>>
+stream
+x32ѳ0U0P5Q54V02P01WH1*22
+(s<=\
+%E\N
+\.
+\.
+ 0a"@q,P`d1g? 1pzrr
+endstream
+endobj
+2267 0 obj <<
+/Length 177
+/Filter /FlateDecode
+>>
+stream
+xڝ̽
+0
+ 6K^nGj
+ ;0VA?P"Btaeԝ6L.:g}aC~`#!/
+endstream
+endobj
+2268 0 obj <<
+/Length 99
+/Filter /FlateDecode
+>>
+stream
+x323T0P0b#C3CB.C3
+endstream
+endobj
+2269 0 obj <<
+/Length 171
+/Filter /FlateDecode
+>>
+stream
+x3337W0P0b3scCB.3#
+endstream
+endobj
+2270 0 obj <<
+/Length 138
+/Filter /FlateDecode
+>>
+stream
+x313P0P0accCB.c HrW0
+
+endstream
+endobj
+2271 0 obj <<
+/Length 170
+/Filter /FlateDecode
+>>
+stream
+x3133S0P0bcKcCB.c HrW06
+endstream
+endobj
+2272 0 obj <<
+/Length 179
+/Filter /FlateDecode
+>>
+stream
+xڍ1
+@ a=s]7B@Vb։7QrMqMD4`6!)24ֆ)EG4TQ`>crK&D9J~BQ&Ӥh
+endstream
+endobj
+2273 0 obj <<
+/Length 180
+/Filter /FlateDecode
+>>
+stream
+x31ҳ4R0P0V54V01R06PH1*2
+%E\N
+\.
+\.
+ 0c?`@D H" Tm`
+endstream
+endobj
+2274 0 obj <<
+/Length 135
+/Filter /FlateDecode
+>>
+stream
+x3633T0P0a#cCB.#
+endstream
+endobj
+2275 0 obj <<
+/Length 174
+/Filter /FlateDecode
+>>
+stream
+x-1
+@/4;'p7 m\BBBQx!eu,^1LM̔ "qlҕDfӍ]pPH8JHdKڭ~{I3އl2F-^5ƽFx
+endstream
+endobj
+2276 0 obj <<
+/Length 142
+/Filter /FlateDecode
+>>
+stream
+x3633V0P0b# #CB.#3
+endstream
+endobj
+2277 0 obj <<
+/Length 134
+/Filter /FlateDecode
+>>
+stream
+x313P0P0accCB.c HrW0
+endstream
+endobj
+2278 0 obj <<
+/Length 180
+/Filter /FlateDecode
+>>
+stream
+x]=
+P )fO_A +P,rs!M~00q8sqǀ.%>ÙԖRZRŊoTs@*]A6pJGN W#X3`*'lUoܺ=`
+endstream
+endobj
+2279 0 obj <<
+/Length 220
+/Filter /FlateDecode
+>>
+stream
+xm1N@п4{0'`m+B"T)"*
+K<:RZ^EԠ w  I~Ut;=P:
+:'T AZPZ bвh+
+endstream
+endobj
+2280 0 obj <<
+/Length 185
+/Filter /FlateDecode
+>>
+stream
+x];
+PE#E`Y/B`
+A+ RK E;Ѹp#,L2kŚ;sqsn҈(h]tݑ&95'sݒ|9_d')Gd3Dn)XZH݁ӢSw?%| '
+endstream
+endobj
+2281 0 obj <<
+/Length 216
+/Filter /FlateDecode
+>>
+stream
+x]αJAba{o^@+,J-- bQҤ8K
+ggF[=u^;g'ogL|=b{~&F??_.n/Չ]Q~G3
+%Ay@ @œo`V$>nɆԛ_#.DL
+2! ##̼ ?R9aRͅ/t TB?iS
+endstream
+endobj
+2282 0 obj <<
+/Length 115
+/Filter /FlateDecode
+>>
+stream
+x3133S0P
+endstream
+endobj
+2283 0 obj <<
+/Length 201
+/Filter /FlateDecode
+>>
+stream
+xmλQ Ab1y=s ;X[hhQ<wIHx8k&zH!ѳYfY 1rl5ׄB;.# x@ [GRyi5BSxЅk `!l/ؽP
+'j"tCLw 5gk)^
+endstream
+endobj
+648 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F40
+/FontMatrix [0.01506 0 0 0.01506 0 0]
+/FontBBox [ -4 -17 74 50 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 28
+/LastChar 121
+/Widths 2284 0 R
+/Encoding 2285 0 R
+/CharProcs 2286 0 R
+>> endobj
+2284 0 obj
+[45.18 45.18 0 0 0 0 0 0 40.66 0 0 0 0 0 0 0 0 27.11 22.59 40.66 0 40.66 0 0 0 40.66 0 0 0 0 22.59 0 0 0 0 0 0 61.22 57.72 58.73 62.24 0 51.03 63.87 0 0 0 0 0 76.94 0 61.08 55.46 0 60.76 45.18 0 62.3 61.22 0 0 0 0 0 0 0 0 0 0 39.53 45.18 36.14 45.18 37.25 24.85 40.66 45.18 22.59 24.85 42.92 22.59 67.77 45.18 40.66 45.18 42.92 33.61 32.08 31.63 45.18 42.92 58.73 42.92 42.92 ]
+endobj
+2285 0 obj <<
+/Type /Encoding
+/Differences [28/a28/a29 30/.notdef 36/a36 37/.notdef 45/a45/a46/a47 48/.notdef 49/a49 50/.notdef 53/a53 54/.notdef 58/a58 59/.notdef 65/a65/a66/a67/a68 69/.notdef 70/a70/a71 72/.notdef 77/a77 78/.notdef 79/a79/a80 81/.notdef 82/a82/a83 84/.notdef 85/a85/a86 87/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121]
+>> endobj
+2286 0 obj <<
+/a28 2242 0 R
+/a29 2243 0 R
+/a36 2241 0 R
+/a45 2240 0 R
+/a46 2237 0 R
+/a47 2238 0 R
+/a49 2282 0 R
+/a53 2283 0 R
+/a58 2239 0 R
+/a65 2244 0 R
+/a66 2245 0 R
+/a67 2246 0 R
+/a68 2247 0 R
+/a70 2248 0 R
+/a71 2249 0 R
+/a77 2250 0 R
+/a79 2251 0 R
+/a80 2252 0 R
+/a82 2253 0 R
+/a83 2254 0 R
+/a85 2255 0 R
+/a86 2256 0 R
+/a97 2257 0 R
+/a98 2258 0 R
+/a99 2259 0 R
+/a100 2260 0 R
+/a101 2261 0 R
+/a102 2262 0 R
+/a103 2263 0 R
+/a104 2264 0 R
+/a105 2265 0 R
+/a106 2266 0 R
+/a107 2267 0 R
+/a108 2268 0 R
+/a109 2269 0 R
+/a110 2270 0 R
+/a111 2271 0 R
+/a112 2272 0 R
+/a113 2273 0 R
+/a114 2274 0 R
+/a115 2275 0 R
+/a116 2276 0 R
+/a117 2277 0 R
+/a118 2278 0 R
+/a119 2279 0 R
+/a120 2280 0 R
+/a121 2281 0 R
+>> endobj
+2287 0 obj
+[939 549 855 911 933 911 945 974 755 846 762 761 571 677 763 760 759 754 494 552 537 577 692 786 788 788 790 793 794 816 823 789 841 823 833 816 831 923 744 723 749 790 792 695 776 768 792 759 707 708 682 701 826 815 789 789 707 687 696 689 786 787 713 791 785 791 873 761 762 762 759 759 892 892 788 784 438 138 277 415 392 392 668 668 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 732 544 544 910 667 760 760 776 595 694 626 788 788 788]
+endobj
+2288 0 obj <<
+/Length 242
+/Filter /FlateDecode
+>>
+stream
+xڍP1j@\`=AȪ Q+U2EB$+1-\ĐkteL&3c&ܓAyzyv-Ӝ흧ٖ߱?Jv!.B4 CԻSQ{j @3΀ɸu_(ဖF9⓼% #Q]n៺Ny:]h2ͩu\L=w˒W Zb
+endstream
+endobj
+2289 0 obj <<
+/Length 167
+/Filter /FlateDecode
+>>
+stream
+x3635Q0P04P52V0P04SH1*24
+([s< ͹=\
+%E\N
+\.
+\.
+?0a QՃ aHAj1~``~
+endstream
+endobj
+2290 0 obj <<
+/Length 106
+/Filter /FlateDecode
+>>
+stream
+x3635Q0P04
+f
+)\\@$2ɹ\N\@.}0PRTʥ`ȥm`@#\\\
+endstream
+endobj
+2291 0 obj <<
+/Length 116
+/Filter /FlateDecode
+>>
+stream
+x3635Q0P04
+
+)\\f
+  ,ɥ`hƥU()*Mw
+pV0wQ6T0tQ` O
+endstream
+endobj
+2292 0 obj <<
+/Length 95
+/Filter /FlateDecode
+>>
+stream
+x31ֳ0U0P0T02T06W06RH1*2  !2ɹ\N\
+Ʀ\@a.}O_T.}
+
+endstream
+endobj
+2293 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+x풱@ 0tx &2`A>=@..,:r_{^4ICƸI¾uaw$=(r
+endstream
+endobj
+2294 0 obj <<
+/Length 223
+/Filter /FlateDecode
+>>
+stream
+xӱn0`#HrOP' [%R3TuZsx&yT Xjw><?LF3k>m&Zb&RJ'/Ut1L|L) uUp)v
+-?@׌8;n=pOkq11Ecf՘1>KZ*t}w{7:y+}k(R Qtn
+endstream
+endobj
+2295 0 obj <<
+/Length 327
+/Filter /FlateDecode
+>>
+stream
+xڕӿj0q%C `*B]WC:Nm-vG#dt&?RiD ~i]_\V;WzG*I꒚M dߑ%)YRtZ@m^HwYmVaܶbN4RbXMΔ\uNnnb| mbީLE捴]$ⱱ7!3ilz.2Ob'z>уt!򸴏97 טC.k&) 7Lʬ k ͹!!KkK!#ܥm<Fk(4J@?mG/c
+
+endstream
+endobj
+2296 0 obj <<
+/Length 267
+/Filter /FlateDecode
+>>
+stream
+xڵ=n@Ǣ@f9Al%"C$SX+V*;eDIpJ
+zְ̊շy^O=JftॽEzKIzWQ+DXQ:]L@GjQP
+KPJ~ s uy
+endstream
+endobj
+2297 0 obj <<
+/Length 338
+/Filter /FlateDecode
+>>
+stream
+x͓?N@gC6QڸHaRK vF8%^0 Z-;;3|qvrXЧhsJL6~Em*iS^o*\R[}OT@WdR;Ȉ,Q
+C4qHGnJ谬cC +{7Z۶> ࿢*E!en/
+endstream
+endobj
+2298 0 obj <<
+/Length 258
+/Filter /FlateDecode
+>>
+stream
+x1n0` x'b R"5SS۱Cd(9BFcWGRZ}l_Y1S#=e}EeEzYNzm6|<>I/O^捪ko?n>CK(I֪ov^سs`'rVr\w I˼ދ/np=g?;ؗ= 13rً E7
+kmgj.=WMs
+endstream
+endobj
+2299 0 obj <<
+/Length 228
+/Filter /FlateDecode
+>>
+stream
+xڕ= t y G('v3#NI4:(IӾH~
+HP+whyś(/*P#qRDҥLSc_擽P[+^& I)Jt*Jl)sŪJSN2\U\
+endstream
+endobj
+2300 0 obj <<
+/Length 192
+/Filter /FlateDecode
+>>
+stream
+xڳ033S0P0bs  #CB.sc
+endstream
+endobj
+2301 0 obj <<
+/Length 349
+/Filter /FlateDecode
+>>
+stream
+xՓN0 ]uP
+endstream
+endobj
+2302 0 obj <<
+/Length 123
+/Filter /FlateDecode
+>>
+stream
+x340ҳ0Q0P
+%E\N
+\.
+\.
+AD!o`e
+b gS7\=
+endstream
+endobj
+2303 0 obj <<
+/Length 105
+/Filter /FlateDecode
+>>
+stream
+x331Q0P0bS #CB.C
+@-\.
+A(9TH
+endstream
+endobj
+2304 0 obj <<
+/Length 344
+/Filter /FlateDecode
+>>
+stream
+xڕӱN@%$sT$Ha:--4Zã(<qH  wlwUܘ\۳8μS{{ͷ>V:}6^vTՃy:=d:F]jQہVpe
+`)v⨇v⺁IH6G9͑줅9͑KD:KD:̈1adP[=xW5-7|1ĴN'ڬk%E{^K_= Ї\;"=a7o;uSRJ?[
+endstream
+endobj
+2305 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+x330T0P0bs #CB.3K
+r
+
+endstream
+endobj
+2306 0 obj <<
+/Length 311
+/Filter /FlateDecode
+>>
+stream
+xڍԱN0o#O \<'H3D'㤎H GBI%)+,`z aJOJ}o 9ƙ={MyqB<>@<1f#q8&t3x=%T]_'V1 S>8|bGx ~ه_(Jf2Lc#
+ן8~w[stJptU,r,]#c},=3ֳTc)frLiGvKA;+DE 1]*YB8k
+~
+endstream
+endobj
+2307 0 obj <<
+/Length 316
+/Filter /FlateDecode
+>>
+stream
+xu1N0qG"yLJȀbF Rc@n@G*9~,d4iZZ?Vݣ^6RVyy~}ԺܘT܏R*<Vs[(;(rOηwp(X;уr,
+}S8:S8^b ab`x'ܷ؂ ~|8'`5l8qN Xx> >kJ@
+endstream
+endobj
+2308 0 obj <<
+/Length 209
+/Filter /FlateDecode
+>>
+stream
+xڳԳ0U0P0b c #CB.s
+endstream
+endobj
+2309 0 obj <<
+/Length 290
+/Filter /FlateDecode
+>>
+stream
+xڵӱN 
+~ٜoK<+>Lcuz^aہxĦqkAtwb{%>X<CCm⬩/O?G[gnu vѭ9_XgvUz\:[,{{oy&6 /oE,#|F9%v!_7]}n'X=#cȵ*\ܥt6Yʥ71&ٙO{#u;n
+endstream
+endobj
+2310 0 obj <<
+/Length 346
+/Filter /FlateDecode
+>>
+stream
+x}ѱJ@?lv_@p]
+!p`
+A+ RK E;!hM7HqfwO`vv23)Vf0WI%X8=Uk3UqaUASSbmn*Sުvm|
+endstream
+endobj
+2311 0 obj <<
+/Length 176
+/Filter /FlateDecode
+>>
+stream
+xڳ431W0P0b 3 CCB. rAɹ\N\
+\@Q.}O_T.}
+
+endstream
+endobj
+2312 0 obj <<
+/Length 233
+/Filter /FlateDecode
+>>
+stream
+x퓱
+@ S:Y|]I(>BGLZD''|r7Ѧ;M CA> 0Ym՜՘eTфU8A5!hHpɾe PVr{y%رW Kp,+&uaJNEIM4y0犉%ޭ^ AlH4ȗ6eOE8`|
+endstream
+endobj
+2313 0 obj <<
+/Length 459
+/Filter /FlateDecode
+>>
+stream
+xڭӱn0q
+p#/8$)PکCѩءE ,z=GPZNݸ[wUzmnݷZqu~}ӫOC^׫{w@g/z"Ew l셀;ii24<M <t<|6ZrF2-ʬ e)] abtu A!#G
+endstream
+endobj
+2314 0 obj <<
+/Length 270
+/Filter /FlateDecode
+>>
+stream
+xڕJ@'LsL 'BB<K E뽼Y^^`;M
+-eؙٝgrB䢔M\]1ƫG o-y{'_|-Oܮ +S݃Nu
+endstream
+endobj
+2315 0 obj <<
+/Length 257
+/Filter /FlateDecode
+>>
+stream
+xݑ=N@FJisX[N"GTPR;
+9BJGZ0; Jifw<~EqUQAg9T )fT3j4wTN\IM}MoOhf7s,hSv`ځ_ hv= {H
+ 񞡱B
+[r%k
+endstream
+endobj
+2316 0 obj <<
+/Length 243
+/Filter /FlateDecode
+>>
+stream
+xڵN0/`?BdS` Heꀘh XI-#d`stgۿ~Iy)x
+5_XQ&oG\7vWEF<z{O5 Tb!ȣO!2J`@;PP<;Gg3E9c̈*l09t / inm';)),bߘ^Jq݂zlgF
+endstream
+endobj
+2317 0 obj <<
+/Length 253
+/Filter /FlateDecode
+>>
+stream
+xҽN0T"GȽ
+]6&ܴLpڋ_IHGN!X>]
+7#f
+endstream
+endobj
+2318 0 obj <<
+/Length 244
+/Filter /FlateDecode
+>>
+stream
+xڅJ1g"0M!`Dy[ZYZZ(ںy}<•aǙP1|?IO :1H=>cTPc;Ocw!^_[^ʙ;V8?dmgPj\
+؁ahDBc!D[o1En %in6N:\Z` æ]H_I<?y뭜
+endstream
+endobj
+2319 0 obj <<
+/Length 175
+/Filter /FlateDecode
+>>
+stream
+xн
+0
+
+endstream
+endobj
+2320 0 obj <<
+/Length 324
+/Filter /FlateDecode
+>>
+stream
+xڥ?J@'X&G\@HBL!he!RK E֛L2ɮ9o[,Ƴw565>UU7v1.tqoYKtq
+ˣ
+
+endstream
+endobj
+2321 0 obj <<
+/Length 187
+/Filter /FlateDecode
+>>
+stream
+x373P0P0bsC cCB.33
+endstream
+endobj
+2322 0 obj <<
+/Length 138
+/Filter /FlateDecode
+>>
+stream
+x3635Q0P
+endstream
+endobj
+2323 0 obj <<
+/Length 205
+/Filter /FlateDecode
+>>
+stream
+xѽ
+@
+p kQ)cH__#D[
+ v\o-!_ utòʈe2fx\
+endstream
+endobj
+2324 0 obj <<
+/Length 243
+/Filter /FlateDecode
+>>
+stream
+xѱJ@)nMD BzQ|-#w_Z˷euG|]KkhFrw[r??ܓ[]rKn7-74B,? X -,fXNpMV%\{`r_
+|7fZlP \X~r['-pG NZpZY̊4_HWn$
+endstream
+endobj
+2325 0 obj <<
+/Length 107
+/Filter /FlateDecode
+>>
+stream
+x3635Q0P
+endstream
+endobj
+2326 0 obj <<
+/Length 232
+/Filter /FlateDecode
+>>
+stream
+xҽjA W#>WZL+vrp!ET+ -vXqt;';됱j-->xsiNY-gOّy+#CYEI O$Rx%4DJʤn ׮UH@Y$߸Np⧤D@(Ax^ 9E
+endstream
+endobj
+2327 0 obj <<
+/Length 184
+/Filter /FlateDecode
+>>
+stream
+xѱ@ & &]xHLtr0NUy{ጃ zw6d4JBGqlfiG{1+P)QEz@-ib
+endstream
+endobj
+2328 0 obj <<
+/Length 231
+/Filter /FlateDecode
+>>
+stream
+xڵ0kHnЂ0 &2`A3<#02^KL%!_s{I!.qa@CT9 +@P% 7 v+@x0<Az R 4k̀*jy#,(j-iymkFkV|6mmK35x)X(ɲts}|r9_]7shD6(gu{/)
+endstream
+endobj
+2329 0 obj <<
+/Length 255
+/Filter /FlateDecode
+>>
+stream
+x͒N@ ]uG_
+endstream
+endobj
+2330 0 obj <<
+/Length 169
+/Filter /FlateDecode
+>>
+stream
+x;0
+
+
+E^6ɱC:_:Wѫ}O_ /h m Ij^
+endstream
+endobj
+2331 0 obj <<
+/Length 259
+/Filter /FlateDecode
+>>
+stream
+x]1N@4;
+endstream
+endobj
+2332 0 obj <<
+/Length 186
+/Filter /FlateDecode
+>>
+stream
+x3534S0P0R5T01Q07SH1*21
+(Cds<L =\
+%E\N
+@QhX.OON2bH$;&=A$3?8HAN7PJ`$H `(
+E` qzrr
+endstream
+endobj
+2333 0 obj <<
+/Length 187
+/Filter /FlateDecode
+>>
+stream
+x1
+@   fl1[ZYZZ(Zkyt {O!(VhpZ0(j. 匴F91J3FNPf4W.dI K#ZX+ސ8
+w6 .n N<sUv
+endstream
+endobj
+2334 0 obj <<
+/Length 252
+/Filter /FlateDecode
+>>
+stream
+xڅбJ@YR#d^@7l 'BB+RgvE8X>Y؟/Η%YJyN^RaaB<oq]}|Fh[zxESJ3{
+1k!k/;f8qUڢsf"^xDŘ=
+endstream
+endobj
+2335 0 obj <<
+/Length 309
+/Filter /FlateDecode
+>>
+stream
+xڕ1j@7Xx6l6@RXR%)S$$fB.2Ni!7.V?u~f*U+uW9o(fKUn*< ݖIu>?_dRLjG/zV!C
+evb883MmH Є̎io“z>Ba"0i5s?hb8T0c00c*Cٻ1 i<8^gvJpi\DXו!)
+endstream
+endobj
+2336 0 obj <<
+/Length 270
+/Filter /FlateDecode
+>>
+stream
+xڅN@EPL'~ >X<&ZY+h+|
+K$\gfX){ʪߗu%B-k_Weʡ/ϯ7/ny
+endstream
+endobj
+2337 0 obj <<
+/Length 310
+/Filter /FlateDecode
+>>
+stream
+xڅ1N@б\XG\
+D "To+l"0DQXO]yx:NbYٔOG8'M~ea חG/pl%ގqtg%Qm3 "
+IPZlklku釾2#}UJ.҆Rymaɽ
+endstream
+endobj
+2338 0 obj <<
+/Length 232
+/Filter /FlateDecode
+>>
+stream
+xm1j@*x-"cUZp@R)b.X:#T!vRYH
+~Y7zVƷY v_ԿQ[ݓ;N{{W߹ʭ޵۹[J0)\$x " LY$> LQ~ 3
+ afˈLXF,@' .L
+endstream
+endobj
+2339 0 obj <<
+/Length 229
+/Filter /FlateDecode
+>>
+stream
+x͒1
+@EG,i<slF@T0Xur4,-w3).df3t8H #[>s#Uew4c!r9_lD,lD[ΦB$:[RI9z% 7t |
+
+t}GI%EP
+endstream
+endobj
+2340 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x3337W0P04
+
+)\\&f
+  ,ɥ`bƥU()*Mw
+pV0wQ6T0tQ```c
+endstream
+endobj
+2341 0 obj <<
+/Length 301
+/Filter /FlateDecode
+>>
+stream
+x}MJ0
+endstream
+endobj
+2342 0 obj <<
+/Length 305
+/Filter /FlateDecode
+>>
+stream
+xڍN@LJlA gEr&ZY+h=>
+@IA烋 |gf.K xQz!eY^#[E{_o8_c#>UX>
+endstream
+endobj
+2343 0 obj <<
+/Length 225
+/Filter /FlateDecode
+>>
+stream
+xڽнj0 ['Pt!tP2;4qh~?G$C@Bw&,+]po1}R28^~в$IF~{͒/wu|'ܯ8&旘knLM@;&ED-tw>5 pU/jh:؊,PW+D5^ԝhma#:YVp=Dӊb~9ag/uwiS]
+endstream
+endobj
+2344 0 obj <<
+/Length 285
+/Filter /FlateDecode
+>>
+stream
+xڭѽJ@Y lGȼ&H +PN-`bu>r"X?L6']x\c[awO}͚L<Mo;lֶe[lֶ}ՃhF
+ i
+endstream
+endobj
+2345 0 obj <<
+/Length 314
+/Filter /FlateDecode
+>>
+stream
+xڍ=N0'’!sHRd E"T
+()@ Qa-G#LyxcOx~ar Լ=>٦fqR57-ϱm__l<ږ[Od%2 9SQvTy2S T 2NXFvY
+_C!"%R/Q("!V$M x#$0"W ΈPr($7y?"^\%Id^EARiP7@t4F}ҷ CGɞ~
+endstream
+endobj
+2346 0 obj <<
+/Length 239
+/Filter /FlateDecode
+>>
+stream
+xڭұj0`[heTA@=)Cd̐nQ58@mpCo'J,3~T>LVс%cMq<'$%$w>H?^Y\GGT
+%1s <(Gϋ(nhɝ<A홀OSiX+"]1 n\PrcDާ+"Zl`e1iEWL
+endstream
+endobj
+2347 0 obj <<
+/Length 339
+/Filter /FlateDecode
+>>
+stream
+xU1N0E'JM`_
+jcGYAEJAݫD
+endstream
+endobj
+2348 0 obj <<
+/Length 312
+/Filter /FlateDecode
+>>
+stream
+xڍJ@E_H10y?(uSZY,Vjih|J>!easN2s߽Y'M+u)?Vֵ+nót㺶ȶɖ l]ū{m`Oè@A"dekv"DL8O92!~l@Nc@z.1aiŒBڠv?Q
+IL}~-&\^+vqpڃ :TN&Xa*E3q}Nd!ѫId/;{k?
+endstream
+endobj
+618 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F39
+/FontMatrix [0.00836 0 0 0.00836 0 0]
+/FontBBox [ -7 -25 134 90 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 27
+/LastChar 122
+/Widths 2349 0 R
+/Encoding 2350 0 R
+/CharProcs 2351 0 R
+>> endobj
+2349 0 obj
+[76.74 73.08 0 0 0 0 0 0 0 0 0 0 0 0 0 65.77 0 36.54 43.85 36.54 0 65.77 65.77 65.77 65.77 65.77 65.77 65.77 65.77 65.77 65.77 36.54 0 0 0 0 0 0 99.31 93.5 95.01 100.81 86.31 82.66 103.39 102.84 48.44 0 102.96 79.01 124.77 102.84 0 89.85 0 97.76 73.08 91.47 101.07 0 135.85 0 0 0 0 0 0 0 0 0 65.77 73.08 58.47 73.08 59.81 40.2 65.77 73.08 36.54 40.2 69.43 36.54 109.62 73.08 65.77 73.08 0 53.39 51.89 51.16 73.08 69.43 95.01 69.43 69.43 58.47 ]
+endobj
+2350 0 obj <<
+/Type /Encoding
+/Differences [27/a27/a28 29/.notdef 42/a42 43/.notdef 44/a44/a45/a46 47/.notdef 48/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58 59/.notdef 65/a65/a66/a67/a68/a69/a70/a71/a72/a73 74/.notdef 75/a75/a76/a77/a78 79/.notdef 80/a80 81/.notdef 82/a82/a83/a84/a85 86/.notdef 87/a87 88/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117/a118/a119/a120/a121/a122]
+>> endobj
+2351 0 obj <<
+/a27 2294 0 R
+/a28 2293 0 R
+/a42 2288 0 R
+/a44 2289 0 R
+/a45 2292 0 R
+/a46 2290 0 R
+/a48 2339 0 R
+/a49 2340 0 R
+/a50 2341 0 R
+/a51 2342 0 R
+/a52 2343 0 R
+/a53 2344 0 R
+/a54 2345 0 R
+/a55 2346 0 R
+/a56 2347 0 R
+/a57 2348 0 R
+/a58 2291 0 R
+/a65 2295 0 R
+/a66 2296 0 R
+/a67 2297 0 R
+/a68 2298 0 R
+/a69 2299 0 R
+/a70 2300 0 R
+/a71 2301 0 R
+/a72 2302 0 R
+/a73 2303 0 R
+/a75 2304 0 R
+/a76 2305 0 R
+/a77 2306 0 R
+/a78 2307 0 R
+/a80 2308 0 R
+/a82 2309 0 R
+/a83 2310 0 R
+/a84 2311 0 R
+/a85 2312 0 R
+/a87 2313 0 R
+/a97 2314 0 R
+/a98 2315 0 R
+/a99 2316 0 R
+/a100 2317 0 R
+/a101 2318 0 R
+/a102 2319 0 R
+/a103 2320 0 R
+/a104 2321 0 R
+/a105 2322 0 R
+/a106 2323 0 R
+/a107 2324 0 R
+/a108 2325 0 R
+/a109 2326 0 R
+/a110 2327 0 R
+/a111 2328 0 R
+/a112 2329 0 R
+/a114 2330 0 R
+/a115 2331 0 R
+/a116 2332 0 R
+/a117 2333 0 R
+/a118 2334 0 R
+/a119 2335 0 R
+/a120 2336 0 R
+/a121 2337 0 R
+/a122 2338 0 R
+>> endobj
+2352 0 obj <<
+/Length 114
+/Filter /FlateDecode
+>>
+stream
+x31V0P04F
+
+)\\@
+p{IO_T.}
+endstream
+endobj
+2353 0 obj <<
+/Length 95
+/Filter /FlateDecode
+>>
+stream
+x353S0P0R02S01Q0PH1*21
+(Ads<L =\
+%E\N
+@QhX.O @9
+endstream
+endobj
+2354 0 obj <<
+/Length 223
+/Filter /FlateDecode
+>>
+stream
+x퓱@ 8t
+endstream
+endobj
+2355 0 obj <<
+/Length 286
+/Filter /FlateDecode
+>>
+stream
+x픱N0mut~!)R)`b@Lsh}>B (g
+Q@,eADrbh>e<'U'1)=QJ yHQ%*./ϯT,΢2J5h0M^&yc<.1mYU*d̢} fJހ=oTKߚON Qi^-HgГ'{vXcv}84OlunĺH:`ݟ?ef=~'0nq{5ׇ27tMfz
+endstream
+endobj
+2356 0 obj <<
+/Length 382
+/Filter /FlateDecode
+>>
+stream
+xڝ1N0D,yJȀb J(> U)",eUM~VJ^R,
+bm~|}gOvc;^|}~|p#$˷YU[LU7KeYF-1zVt qV9-Ti̬jcDG:U#F)R]"X
+)h[7(RfRd Vi%(E:8A}$](E7URhw.BL^dx')z TT2%AaΕ[Q/a`D
+a¢jBLx5 J%aQ4>TɨW;N˹IA
+0!@Cn+~?]T
+endstream
+endobj
+2357 0 obj <<
+/Length 312
+/Filter /FlateDecode
+>>
+stream
+xڽj02n#XOPKz)C:NM ?ŏ1U
+ )ϲuwVJK%oݭՍV7+E놪WYztT5Orj|/5US<]bf 
+<^
+endstream
+endobj
+2358 0 obj <<
+/Length 402
+/Filter /FlateDecode
+>>
+stream
+xՔN@l6<
+5wy&RheaBh<
+@9aY]H$;;3;y~ә볍γ-ݙ~իowFߛqEJVW_~xVB*=\g<jK;CO愸@fB1 &0 h%Z/5bd' ql@2Wz Ħ!- b9q$2; ӌ\1#Sj.^@ޱD`t,0^e&a .qua͏l9y9^03q'{5&P{fjUι 7:hk/֠A+}Lv5൜45^0iYjnѪε&rY2e>:Ի@]V}JU!
+endstream
+endobj
+2359 0 obj <<
+/Length 291
+/Filter /FlateDecode
+>>
+stream
+xԱj0` [D% I
+PhS1CB;'G#x_"||2i=iY[{j]L~hڐn3?z_Ӣ!"8;Ly_ORԤVFzf%p3{xc6FrcUCag{i@]yC7xۣ伐G ]
+$@셼*b2@5Bqچ
+endstream
+endobj
+2360 0 obj <<
+/Length 245
+/Filter /FlateDecode
+>>
+stream
+xڝj1 9沏y
+݋k{쩇ғAћ=H؃߲CL`-lo =|oK.aN<|-dT^mlFmٌWcoqn> HɁX 98;[e"D}禇Mw,,#V j su몄=]}cSY}]w`O` V ~֖༶_%j~
+endstream
+endobj
+2361 0 obj <<
+/Length 200
+/Filter /FlateDecode
+>>
+stream
+xڳ432Q0P0bKCK CB. 
+%E\N
+\.
+\.
+᠁L$<Ɏ`2" Hz)ɏNɌHH3 @$+G0L0&D2\d 9iĄQ&$B3L.WO@.
+endstream
+endobj
+2362 0 obj <<
+/Length 410
+/Filter /FlateDecode
+>>
+stream
+xݔJ0Sz!/ 4/mVº=z ԣEoBfQzahL2Il(43I2gKQsqR.,
+,ڰOlU^[,6?X^݈n/dZ<HQ<j-|Lp(B./Z _&C*MĬKEl =t Э3KXo -. bcQK b8++wK"H%LlM@.VtbMIm{ɕ`O>3X{E;Isc!ߩF4A3wh(hm
+wUa7ҨSi4pu?!ʩM*P;RHW7so3)b4*r4)mjRbwyK
+endstream
+endobj
+2363 0 obj <<
+/Length 125
+/Filter /FlateDecode
+>>
+stream
+x342T0P0bCC3K CB.CCARɹ\N\@5\@a.}O_T.}
+A#C.D3
+y9ʣ>:"'W 
+endstream
+endobj
+2364 0 obj <<
+/Length 107
+/Filter /FlateDecode
+>>
+stream
+x3533V0P0acK CB.s
+endstream
+endobj
+2365 0 obj <<
+/Length 169
+/Filter /FlateDecode
+>>
+stream
+xڳ4ҳ4Q0P0b sK CB. C
+@-\.
+
+FL0b3Ŵ'Y`aedddG0=Y`3L~dd$1\=
+endstream
+endobj
+2366 0 obj <<
+/Length 351
+/Filter /FlateDecode
+>>
+stream
+xڕԱJ0
+YF\Z8Oᤎn|nFĘWmb(MP4Z^r/F{&VVrxWwlSRXg٩eUgec!Y;)+Vm#04Zx "H‡ x3 Fs|vACA`6 %lT(\RuABx4b*T8aAj'DTH
+i?4n4ܼt~Hk qy6fD}?_o,p+r<'wabIn
+endstream
+endobj
+2367 0 obj <<
+/Length 382
+/Filter /FlateDecode
+>>
+stream
+xݔ;N0@XM_
+endstream
+endobj
+2368 0 obj <<
+/Length 228
+/Filter /FlateDecode
+>>
+stream
+x34037T0P0bK J1*4" \.'O.pK#.}(BIQi*S!B4ИX.OP
+endstream
+endobj
+2369 0 obj <<
+/Length 328
+/Filter /FlateDecode
+>>
+stream
+xԱN@%[L#ܼO"9D
+,Zx4°96 dJcK<:A_ೂwPYn3Tm>ªެ^ Hztu{
+5>(\vVIWL-{Fv/@^t R!-\9J]5$>Wf/+tgL?lle"h elPTO*@CHEVSt8eT'5<HQz2cik1#Pv2rǪs% ;vJlbwzȡpnIm*~
+endstream
+endobj
+2370 0 obj <<
+/Length 405
+/Filter /FlateDecode
+>>
+stream
+x}=NPLJPwlV$HaRK ֏xQ8³Äw>7kU:YӍR=TYl-{?]#ފE\חGQT%Ty'"" D%ВdЀ(0Z@5QVD5Ǡ}۱(et"+Fr$ ; BI~鞜1P
+endstream
+endobj
+2371 0 obj <<
+/Length 192
+/Filter /FlateDecode
+>>
+stream
+xԱ
+P# YztT\`955DS56Ih>JxUZG`/Wp€zeX]'d
+=dE,zE d1m&19XZHKնo ㇒xdflw4u VP|u+Ӿ0xZA7\a^J(
+endstream
+endobj
+2372 0 obj <<
+/Length 268
+/Filter /FlateDecode
+>>
+stream
+x픱N@ u%
+"\IS<1z7
+_Cae$ސBX|-Uئa&V$ wZCT&O}^&)L=HźD Vx5DW5{eZ
+endstream
+endobj
+2373 0 obj <<
+/Length 385
+/Filter /FlateDecode
+>>
+stream
+xڝN0$P] 3<OуFodx|+v_3.,<=L)<xJ ]4.hz1iy)^_i:Kq+EvG˥Pzho+ YɠoMX)'Uoՠ|VKT2w676+2*TW=JM,frY=-n9*!7.[;l|YA.;V:;J >i[ BP|U͸L|yx7Ps]/b^: ĽtKS@~&
+jTK!1 ?ɻھvo"j3u?x;-֌
+endstream
+endobj
+2374 0 obj <<
+/Length 542
+/Filter /FlateDecode
+>>
+stream
+xڭ=j1q S #HHf'o3"T)Le[vhruAE{woo~yoy{WkO~=|>]u?~|nq!옟3OkddJƬ`*-DPxeZ&ҡ*H іP%[] !,_FX4&d e} M=a'P
+UIe![WI*fBA$Ul~ml!\T}ȆtlAF4BR<2aM;gES!`huhZFs }M!dy]4AMD3ΫM0Т-f1oKt `ˆFL lLK)]`̔.݃i5i?0d;ou4p筊䖿zOwx2yL>V 6@e|wZ|kd>D?/_зd8
+endstream
+endobj
+2375 0 obj <<
+/Length 436
+/Filter /FlateDecode
+>>
+stream
+xڝ1N0Em&GO@bBeHJ
+ٽ{!e
+ c'LKzN<}Ę&ln_P߅>ruWmVp>TFudt>N# %!RD9\# Kdyzx9#pjD@b8=& G@P\%5jsVA5B.(-+Uղd@4@h,BA4QK3,]sl!!/`j'FgF{obkΌZC25R:&]MBEYzDha+Ia+Iexd,CG3UU3*jJZ3^ϢPcY͒^1":^Ʈ\ESjNwr_3l˹+Q 3=A4fF͠}u
+endstream
+endobj
+2376 0 obj <<
+/Length 313
+/Filter /FlateDecode
+>>
+stream
+xԱN0aG"ݒGĕ@eB*E"L 22`Mhy?B Q}>_bpR~[*uq^FRr-w
+A)8/oi~{VPe;
+Z*Iڭ4nagoh~ Qs8f"gU{93F{n
+?l Bt4z UT;n)T_B <6OՇ9?%Ց39D#gl8%>%ZU(B)Ӆ8BǠ*ę>4dbZC! biPHC7ˆ.dCǥ0TEҳTf
+_Mܴ
+endstream
+endobj
+2377 0 obj <<
+/Length 308
+/Filter /FlateDecode
+>>
+stream
+xڥ1N@gCA2 G`.@lI|&Rhea|x <Ć0̲ϼDmd`ggCګT״}Iz>\|ʼn|Ƣ=,VgGTaˊ+l
+^TjCyĺ=LKg 9鏀-uO
+endstream
+endobj
+2378 0 obj <<
+/Length 283
+/Filter /FlateDecode
+>>
+stream
+x퓱N@ e%
+y{{iZQAɿo>%Ct`inCp&YvwsKM1;<f==>a8?>^ҕ%s`Ko F*MwR*^nJom[w)}KDJXĢȾUAB֫~o)2PAշ%{Sh7ԃ]nۅ߶<o^ ArhR*ib.~D׿(XSx~?J
+endstream
+endobj
+2379 0 obj <<
+/Length 274
+/Filter /FlateDecode
+>>
+stream
+xڽ1N0E"4>BHح,-D
+$(PR%>Z#l"WAg}{+nǚ^يXq{NiQy͖K9TꞺ=(te!LJBzp
+endstream
+endobj
+2380 0 obj <<
+/Length 271
+/Filter /FlateDecode
+>>
+stream
+xұj@ 3 Z+4fHS@:u(hy<z0QwPỳt6=[zܠw`,^^aZBy9ftqGr&^)~+IY_'٦U#SYJcljрYvQjE(R>D оY~wW!7˩]%vβ˷<#Z qMUѨL྄Gc
+endstream
+endobj
+2381 0 obj <<
+/Length 275
+/Filter /FlateDecode
+>>
+stream
+xڍj0 e2hCI
+PhS۱C<ZŏC8U+ %Y|r\5]x׶zֳظ'/~te;ܿavn<u
+endstream
+endobj
+2382 0 obj <<
+/Length 191
+/Filter /FlateDecode
+>>
+stream
+x313V0P0bS CCCB.SJrW05
+\.
+ @H2j1
+endstream
+endobj
+2383 0 obj <<
+/Length 369
+/Filter /FlateDecode
+>>
+stream
+xڭN0/K~H*J#HHd@uFL x?GVn*Pb;]V-YsZx]XDsV4a]4ÍzxR-DQ nŰQhk
+endstream
+endobj
+2384 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+xڳ0S0P0b cCCB.ssJrW07
+endstream
+endobj
+2385 0 obj <<
+/Length 146
+/Filter /FlateDecode
+>>
+stream
+x31V0P0bcKCCCB.cb%r9yr+p{=}JJS|hCX.O ?D PB1X/y`i؁A0za?J.WO@.
+endstream
+endobj
+2386 0 obj <<
+/Length 222
+/Filter /FlateDecode
+>>
+stream
+xҽ
+0
+I(>B]*I!a/
+endstream
+endobj
+2387 0 obj <<
+/Length 286
+/Filter /FlateDecode
+>>
+stream
+xAJP.
+:'{
+U,]W҅b/xGR!d̼y$ L'C<GY! ׬'X`n0_Ly/G0˫:0kuh\c6* ѩ~䓊 QwjʬI:Z+UmV5TMU
+!A>i$%!, aJE:ۑ>NAO"j$Jj/XS:Q3j4~7N${%u,JXR7Աn()nͻy#_%\7 vP
+endstream
+endobj
+2388 0 obj <<
+/Length 111
+/Filter /FlateDecode
+>>
+stream
+x31V0P0aCCB.cS
+
+endstream
+endobj
+2389 0 obj <<
+/Length 258
+/Filter /FlateDecode
+>>
+stream
+xӿJ@+ }s8@88O0X`e,,ME}I @Xabfn?w^ͧ{]]"kvfř{~zlu~]+\kv2HɎY@КѩY`;zjeRZ58J$}¤A/y
+endstream
+endobj
+2390 0 obj <<
+/Length 198
+/Filter /FlateDecode
+>>
+stream
+xұ
+@
+*
+nS:vc!K.!K|
+%)E!֒639-ij)UT US*]@c
+endstream
+endobj
+2391 0 obj <<
+/Length 267
+/Filter /FlateDecode
+>>
+stream
+xڽN0utKʼnnJ+ &T9}>Jc(;۲,Ȑ|>.Uu(Gko+.h+u
+#4Ox?wh6tRdD gft: sQģ_zm>rU"Q-Ø whJ"5v[\nil4r?:XTG2oJI~E⁦$lt?,m/p{"
+endstream
+endobj
+2392 0 obj <<
+/Length 285
+/Filter /FlateDecode
+>>
+stream
+xҽN0
+?r^ ;jfԠӪUX{#[t屿-YպvZmc|y'˿ \p [a
+endstream
+endobj
+2393 0 obj <<
+/Length 296
+/Filter /FlateDecode
+>>
+stream
+xӱN@PL#0/g<)L0VjiWM7\qaYO JcC,LvHsтst=晬e&'IyJO,ώ(dE)ͮ\
+CdT@b{uY*$ګ(uoGyCc^ю췻汝a7K* yy/
+%rp`%KA*%Ox\W
+endstream
+endobj
+2394 0 obj <<
+/Length 184
+/Filter /FlateDecode
+>>
+stream
+xѽ
+0
+ftr'uTܚGQ;祝\݃~ +0.0xH:: eOPZPwA%ޮ#r5 )&;3D"Z*rLD^cj&Uؑˈ^t;;jUxa|t-?>
+endstream
+endobj
+2395 0 obj <<
+/Length 296
+/Filter /FlateDecode
+>>
+stream
+x]1N0E"\
+endstream
+endobj
+2396 0 obj <<
+/Length 195
+/Filter /FlateDecode
+>>
+stream
+x=
+@ )2(I#XQr)uv! jc_13{b-lHlH\J@2$]kH)F1!AtG "Ù`*Coz_kjSӵrgFOT&.Y<,I(d&t^Pkԏ-b0P0+f
+endstream
+endobj
+2397 0 obj <<
+/Length 199
+/Filter /FlateDecode
+>>
+stream
+x=
+@ ir &H~@`
+A+ RK Ex
+)SHY,{|
+iP2(mc)}"lǨR.ft:w9X._
+
+endstream
+endobj
+2398 0 obj <<
+/Length 293
+/Filter /FlateDecode
+>>
+stream
+xڍбJ@ W#d^@hs BB>y)l ]>vϞ$x f8? Ky1yvaC,肗!/&&  c
++c,drP
+,fӖO|ٌxHv'T7eX _%~5(PYQTiVw*I]ڪ$u3SXmn'ωS5^%%^dۨ^>AB
+e~OD3j'Pj*[N^soN!
+endstream
+endobj
+2399 0 obj <<
+/Length 370
+/Filter /FlateDecode
+>>
+stream
+xڝұJ@YR#d_@E),J--˂/+_#֙l XowvYcc3?4V?ip97ٰwήLg縮¼<>lyybN͍5.O/B{7
+X5kKHH0ʱ<DS}b )
+A. *XئՉ֬T5TԊm*H]`ZQhQo"Q#: b5Dnj%*X?o%
+JX]A1-
+H"VO1{AYWxK
+endstream
+endobj
+2400 0 obj <<
+/Length 319
+/Filter /FlateDecode
+>>
+stream
+xڍ=N0F'Jɍ$,-D
+$(KI:(VnrR2|Ю%[o쌟f]s֚ڜcjsyazSۓ<}Ӷ[ݕiTu0Tw01T4"LBG `"'$$PƌDPiMB
+A-BsT'!Q(+Β[>5PK9NT<e)JiHc)ޗ7JOQb"YmIF {B{ס=)քОPM5-֔&y w"=w"Is:?4TRםWTJ
+endstream
+endobj
+2401 0 obj <<
+/Length 375
+/Filter /FlateDecode
+>>
+stream
+xڍҽN0:TG_
+endstream
+endobj
+2402 0 obj <<
+/Length 259
+/Filter /FlateDecode
+>>
+stream
+xݒ@WRGp^@79BB+B:y<28d)^y ˷|Y6L08JpRF8J%$in%-j1~@>CcbxDO0 GjK% ,C/ɢn|nc>g=lLHeހ@X)C9;|ʾyXxo~f!K_՜ieu7waEK޴sLLSF;x>l_
+endstream
+endobj
+2403 0 obj <<
+/Length 142
+/Filter /FlateDecode
+>>
+stream
+x373Q0P04ff
+&
+)\\@ IrW05
+s{*r;8+r(D*ry(0
+
+endstream
+endobj
+2404 0 obj <<
+/Length 344
+/Filter /FlateDecode
+>>
+stream
+xڕұN02DGR҅HHd@1#f(yw+R:Ш_e{X6\w ux]i_^cشmaeCxZ
+7}?:
+endstream
+endobj
+2405 0 obj <<
+/Length 348
+/Filter /FlateDecode
+>>
+stream
+xڝ=N0&G/
+n¾ww]ʭo1.|}~p
+S6Ϯ>cL3:'V
+endstream
+endobj
+2406 0 obj <<
+/Length 252
+/Filter /FlateDecode
+>>
+stream
+xұN0Z,G=NDմK"E"L 02*[(y"3$9wYv1Ǔ]jO)i}2 KX>^ɯo7CɎ->*̤޾C0X',Ph
+endstream
+endobj
+2407 0 obj <<
+/Length 328
+/Filter /FlateDecode
+>>
+stream
+xұJ@YR!D +PGG&ŒufgT8Qju492iM4~Me6^{]^)<=>r}~lj]nUmko(O@ gwt(Z NG :ri_ќb%6'Uo)<`/2yI3"oEcQمgRrlM'}9HyHr/͉'cLܓdNq2;S-5vS&{/J3mRy'm$
+endstream
+endobj
+2408 0 obj <<
+/Length 361
+/Filter /FlateDecode
+>>
+stream
+xڝ=N@rai{p"G,  *
+D h%7>EǼYCD ֳow~&Icw;38r\Yismz,a'ƦCt.27y%&jZ@'za Bl&BFdZ6( x$'j s1%3B17%WLI6laڳP\
+"+TxKkX.^k
+endstream
+endobj
+2409 0 obj <<
+/Length 272
+/Filter /FlateDecode
+>>
+stream
+xڽҽJ0r^@ӊv tqRGE7G#tPZ$`q~$)xG'XaYc/z0Ų3ϰ@n1A^a5?\\`rwPm0nM%#4?@ a$ z,:BKhL3+S:+S:;S:Wu!& 05c[bEN=EfF {%;(ž}pB4:
+0DC ?A#T{H&z링
+n
+v
+endstream
+endobj
+2410 0 obj <<
+/Length 395
+/Filter /FlateDecode
+>>
+stream
+xuN0eŏ`
+!"D
+}9$J) e,'ʕkr\ r'2 ,Щ AhA%#{pj"HtC ʺvQ9 ԀT׹
+endstream
+endobj
+2411 0 obj <<
+/Length 362
+/Filter /FlateDecode
+>>
+stream
+xڝұJ@ [ h.rB 8B7;$A ٙnrfOMfM΃7Y&tԤ4l=><ݚtq~2.*s+S.R?1f
+ku8W#N8dc=rO~ z%u9jJQQګ0634rՆ,y )5IIscNJsa>]dj
+endstream
+endobj
+617 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F38
+/FontMatrix [0.00697 0 0 0.00697 0 0]
+/FontBBox [ -8 -30 157 101 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 28
+/LastChar 121
+/Widths 2412 0 R
+/Encoding 2413 0 R
+/CharProcs 2414 0 R
+>> endobj
+2412 0 obj
+[86 0 128.99 0 0 0 0 0 0 0 0 0 0 0 0 0 0 51.6 43 0 77.4 77.4 77.4 77.4 77.4 77.4 77.4 77.4 77.4 77.4 0 0 0 0 0 0 0 116.82 110.01 111.8 118.61 101.54 97.24 121.65 121 56.63 0 0 92.94 146.8 0 116.22 105.71 0 114.67 86 107.62 118.91 116.82 159.82 116.82 116.82 0 0 0 0 0 0 0 77.4 86 68.8 86 70.17 47.3 77.4 86 43 47.3 81.7 43 128.99 86 77.4 86 81.7 62.48 61.06 60.2 86 81.7 111.8 81.7 81.7 ]
+endobj
+2413 0 obj <<
+/Type /Encoding
+/Differences [28/a28 29/.notdef 30/a30 31/.notdef 45/a45/a46 47/.notdef 48/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57 58/.notdef 65/a65/a66/a67/a68/a69/a70/a71/a72/a73 74/.notdef 76/a76/a77 78/.notdef 79/a79/a80 81/.notdef 82/a82/a83/a84/a85/a86/a87/a88/a89 90/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121]
+>> endobj
+2414 0 obj <<
+/a28 2354 0 R
+/a30 2355 0 R
+/a45 2353 0 R
+/a46 2352 0 R
+/a48 2402 0 R
+/a49 2403 0 R
+/a50 2404 0 R
+/a51 2405 0 R
+/a52 2406 0 R
+/a53 2407 0 R
+/a54 2408 0 R
+/a55 2409 0 R
+/a56 2410 0 R
+/a57 2411 0 R
+/a65 2356 0 R
+/a66 2357 0 R
+/a67 2358 0 R
+/a68 2359 0 R
+/a69 2360 0 R
+/a70 2361 0 R
+/a71 2362 0 R
+/a72 2363 0 R
+/a73 2364 0 R
+/a76 2365 0 R
+/a77 2366 0 R
+/a79 2367 0 R
+/a80 2368 0 R
+/a82 2369 0 R
+/a83 2370 0 R
+/a84 2371 0 R
+/a85 2372 0 R
+/a86 2373 0 R
+/a87 2374 0 R
+/a88 2375 0 R
+/a89 2376 0 R
+/a97 2377 0 R
+/a98 2378 0 R
+/a99 2379 0 R
+/a100 2380 0 R
+/a101 2381 0 R
+/a102 2382 0 R
+/a103 2383 0 R
+/a104 2384 0 R
+/a105 2385 0 R
+/a106 2386 0 R
+/a107 2387 0 R
+/a108 2388 0 R
+/a109 2389 0 R
+/a110 2390 0 R
+/a111 2391 0 R
+/a112 2392 0 R
+/a113 2393 0 R
+/a114 2394 0 R
+/a115 2395 0 R
+/a116 2396 0 R
+/a117 2397 0 R
+/a118 2398 0 R
+/a119 2399 0 R
+/a120 2400 0 R
+/a121 2401 0 R
+>> endobj
+2415 0 obj <<
+/Length 164
+/Filter /FlateDecode
+>>
+stream
+x3231V0P0S54W02V05PH1*24͡Rɹ\N\
+f\@q.}O_T.}
+endstream
+endobj
+2416 0 obj <<
+/Length 164
+/Filter /FlateDecode
+>>
+stream
+x3231V0P0Q54W02T05PH1*24(Cs< ͸=\
+%E\N
+\.
+\.
+00X00137070`|V <c :N9@A&3`n`o'
+endstream
+endobj
+2417 0 obj <<
+/Length 153
+/Filter /FlateDecode
+>>
+stream
+x35ѳ0S0P0S5Q0T06WH1*21
+(Bds<L=\
+%E\N
+@BA,
+endstream
+endobj
+2418 0 obj <<
+/Length 150
+/Filter /FlateDecode
+>>
+stream
+x35ѳ0S0P0S5Q0T06WH1*21
+(Bds<L=\
+%E\N
+@BA,
+endstream
+endobj
+2419 0 obj <<
+/Length 103
+/Filter /FlateDecode
+>>
+stream
+x33T0P0S54W0T05PH1*24͡Rɹ\N\
+F\@q.}O_T.}
+endstream
+endobj
+2420 0 obj <<
+/Length 103
+/Filter /FlateDecode
+>>
+stream
+x33T0P0T54W04Q05PH1*24(Cs< =\
+%E\N
+\.
+\.
+?8.WO@.
+endstream
+endobj
+2421 0 obj <<
+/Length 98
+/Filter /FlateDecode
+>>
+stream
+x35ѳ0S0P0S5P0R
+)\\&F@acTr.'~1BIQi*S!BA,8Lrzrr
+endstream
+endobj
+2422 0 obj <<
+/Length 105
+/Filter /FlateDecode
+>>
+stream
+x33T0P0bCSsCB.
+endstream
+endobj
+2423 0 obj <<
+/Length 124
+/Filter /FlateDecode
+>>
+stream
+x33T0P0S02U04S01SH1*(B$s<,=\
+%E\N
+@BA, ClP` l | 2   \\\
+endstream
+endobj
+2424 0 obj <<
+/Length 153
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0Q02T06T05PH1*22
+(YBds≮=\
+%E\N
+\.
+\.
+ < r8ABzz3??``o >H$RRҏ\}\\\
+endstream
+endobj
+2425 0 obj <<
+/Length 111
+/Filter /FlateDecode
+>>
+stream
+x35ѳ0S0P0Q5W05T01PH1*2 !2ɹ\N\
+&f\@a.}O_T.}
+endstream
+endobj
+2426 0 obj <<
+/Length 124
+/Filter /FlateDecode
+>>
+stream
+x33T0P0S54V04SPH1*(B%s<,=\
+%E\N
+@BA, ClP` l | 2   \\\
+endstream
+endobj
+2427 0 obj <<
+/Length 90
+/Filter /FlateDecode
+>>
+stream
+x33T0P0bCS CB.
+endstream
+endobj
+2428 0 obj <<
+/Length 160
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0Q54W06T05PH1*22(Cs≮=\
+%E\N
+\.
+\.
+   @|@2@,@l
+endstream
+endobj
+2429 0 obj <<
+/Length 98
+/Filter /FlateDecode
+>>
+stream
+x33T0P0bCS#KCB.
+endstream
+endobj
+2430 0 obj <<
+/Length 134
+/Filter /FlateDecode
+>>
+stream
+x33T0P0S54V04S0TH1* (Aes<,=\
+%E\N
+\.
+\.
+6 u 7lP` l | 2   \\\
+endstream
+endobj
+2431 0 obj <<
+/Length 101
+/Filter /FlateDecode
+>>
+stream
+x35ѳ0S0P0QP05T02UH1*2(%s<L̸=\
+%E\N
+\.
+\.
+Ad*@6Փ+
+endstream
+endobj
+2432 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x3235T0
+%E\N
+@B4Pq, CEß@?7mfl` vf6 bgccca`((`xpՓ+
+endstream
+endobj
+2433 0 obj <<
+/Length 94
+/Filter /FlateDecode
+>>
+stream
+x3235T0P0T04V0
+)\\@ADr.'~ BIQi*S!B4ИX.O'W 
+endstream
+endobj
+2434 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x3235T0P5T02U02Q01SH1*2 *ɥTåU()*Mw
+pV
+endstream
+endobj
+2435 0 obj <<
+/Length 93
+/Filter /FlateDecode
+>>
+stream
+x3632W0
+endstream
+endobj
+2436 0 obj <<
+/Length 171
+/Filter /FlateDecode
+>>
+stream
+xڝ1
+0‡8;8 hlDQPѽGQ>Kf7t<Ka`d'pg+wq?n^:]%wpFE5EtYα09R%5Q"*E\tP>q=
+2$n@Sԍ#yS'4ͤ
+ /9S
+endstream
+endobj
+2437 0 obj <<
+/Length 231
+/Filter /FlateDecode
+>>
+stream
+xMϱJA9X\"yݽ]1B(|<ŕW?8,_vIyBO dZz})Beq|yZbw1F>^o4cЇLf5%% h$.ĐSo$%ivb ;?'~hJ1ӄ(aЇ2C
+!EO^;&ĝ, ߉\j
+endstream
+endobj
+2438 0 obj <<
+/Length 287
+/Filter /FlateDecode
+>>
+stream
+x%AJ1E+dP s{{셠+ Ka,s+X?E/^J5N?~?XotΛGsw+wknwk?QOQ'w&(6Bfj22EsD_P <SPL(($lBJnN&M).D¦ lqa@9b
+endstream
+endobj
+2439 0 obj <<
+/Length 257
+/Filter /FlateDecode
+>>
+stream
+xڍ1K@00I"xtȝ[.hw) )Sq&"X2ެS+>)yUruƏ%PCᙶ [d2&\dw|WrqO͎z
+endstream
+endobj
+2440 0 obj <<
+/Length 158
+/Filter /FlateDecode
+>>
+stream
+xڽ1
+@/i<s7b-,*ZZ(
+=j"8&a?㲉8fR|t!hC L'cYiKƯv[2@`@
+endstream
+endobj
+2441 0 obj <<
+/Length 148
+/Filter /FlateDecode
+>>
+stream
+x33T0P0bcssCB.cS
+
+endstream
+endobj
+2442 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+x3636T0P0b#KsCB.#
+%E\N
+\.
+@cb<]3 ÂOC]?HȀ @HA$, !l?r\\\
+endstream
+endobj
+2443 0 obj <<
+/Length 202
+/Filter /FlateDecode
+>>
+stream
+x]Ͻ
+@  *xWm[uTt{>P<sj ?H'AvIQ+=!ʶvb?F9'?D9)xBi?rH !8lZXmݭUV{Xsatsv9R@kk -5
+endstream
+endobj
+2444 0 obj <<
+/Length 185
+/Filter /FlateDecode
+>>
+stream
+xڍϽ0#lXjDD'㤎]ƣ M_rm9^,d/_=ԩ-퉕@v&#ۛWd@:n)CV%&0j I`sr6Ki>9魭g '+ or*4+v
+endstream
+endobj
+2445 0 obj <<
+/Length 223
+/Filter /FlateDecode
+>>
+stream
+xڥбjA9 {wl"VB"RK-Qԝ;AmbvfsžRC/J|I[ї冊܂}Fn)}~1J~K9yd@
+lm9
+endstream
+endobj
+2446 0 obj <<
+/Length 175
+/Filter /FlateDecode
+>>
+stream
+x35ֳ0U0P0bSSCB.3 I$r9yr+q{
+endstream
+endobj
+2447 0 obj <<
+/Length 176
+/Filter /FlateDecode
+>>
+stream
+x31׳4W0P0b3SCB.#
+endstream
+endobj
+2448 0 obj <<
+/Length 158
+/Filter /FlateDecode
+>>
+stream
+x3130T0P0bcSCB.rAɹ\N\
+&\@Q.}O_T.}
+`C r N HH DT 0*a A0A0 { 'W 
+endstream
+endobj
+2449 0 obj <<
+/Length 219
+/Filter /FlateDecode
+>>
+stream
+xڝпN@ /= MȀ E $"7ԅ)7?W|3.?X @hsoϔ/oW\P懂g[j  }"H;69 !$߱KpWRf $L_QWЛ?N`7Eu2m;i[njAٳakE\
+endstream
+endobj
+2450 0 obj <<
+/Length 123
+/Filter /FlateDecode
+>>
+stream
+x35ҳ0V0P
+endstream
+endobj
+2451 0 obj <<
+/Length 103
+/Filter /FlateDecode
+>>
+stream
+x323Q0P0acSCB.#rAɹ\N\
+F\@Q.}O_T.}
+endstream
+endobj
+2452 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x3632T0P0V5T06R01UH1*2
+(Ads<,=\
+%E\N
+\.
+@b<]
+? @\ \=
+endstream
+endobj
+2453 0 obj <<
+/Length 221
+/Filter /FlateDecode
+>>
+stream
+xEϽJ@ W0/p&y)+Gˣ72B:Oa?vvK)d>߹j4.,W޷Kp~JJPJAb -ȅd"H)ld07yDUl4fuNɣG/fHW&0/-~7sĸ-c@k
+endstream
+endobj
+2454 0 obj <<
+/Length 133
+/Filter /FlateDecode
+>>
+stream
+x3130U0P0bCSCB.c
+endstream
+endobj
+2455 0 obj <<
+/Length 217
+/Filter /FlateDecode
+>>
+stream
+x333T0P0b3#SCB.S
+m g0@PhPh Xiht f>
+endstream
+endobj
+2456 0 obj <<
+/Length 218
+/Filter /FlateDecode
+>>
+stream
+xMɱJ@Yw Dy)+PZ>|SI%ͮ|03fʔ^r+tCqy#ZSǛUl}wbgyمs=CUk 󭥯kSO6Cp\NZFt$S(Cp$AO:~d柈.?&-#Q- hTO
+endstream
+endobj
+2457 0 obj <<
+/Length 207
+/Filter /FlateDecode
+>>
+stream
+xڝ@ KHID::htEGZf˗k{h:O(&bKQBg7$VNW
+4{YsMyAmdt m^T
+endstream
+endobj
+2458 0 obj <<
+/Length 159
+/Filter /FlateDecode
+>>
+stream
+x31׳4W0P0bSCB.rAɹ\N\
+&\@Q.}O_T.}
+endstream
+endobj
+2459 0 obj <<
+/Length 264
+/Filter /FlateDecode
+>>
+stream
+xڝJ0rymXW=yU<uh}<BnP3HBHfg&Uy^QA%S +z2D ~S/1̯9yg77d0ҽ-X
+eÜ4Q2a{E'ѽx:>R?n26 ^m4yKAI=ȥS"!8fW5Pr
+endstream
+endobj
+2460 0 obj <<
+/Length 194
+/Filter /FlateDecode
+>>
+stream
+x}α
+0 4RZN⤎(>B5 Q4#&4T)Ad}
+t8E B6( = x$2"iBu]
+endstream
+endobj
+2461 0 obj <<
+/Length 212
+/Filter /FlateDecode
+>>
+stream
+xMJ@!0:/KP
+ 詇(E!bhy_`nz(Y'TQ2 ?e{./⍧*WM %쭾6w}{";fOv+I~
+)r!FA ~
+endstream
+endobj
+2462 0 obj <<
+/Length 141
+/Filter /FlateDecode
+>>
+stream
+x35г4Q0P0bKSCB.3
+endstream
+endobj
+2463 0 obj <<
+/Length 172
+/Filter /FlateDecode
+>>
+stream
+x=
+@
+Bp.5?bAPKAE;ͣ)-DNa I>Ft0P{(5~43{R|̚T+LUUZ`t^_`v@"Հ#6R0w
+Y9كz%@C zEH
+endstream
+endobj
+2464 0 obj <<
+/Length 221
+/Filter /FlateDecode
+>>
+stream
+xe1j0bxf˻@")J@@=کC R5
+=C=;]"<!OO'KV<V<|Pt&-ٟhxe-I<5??$VHMR5H[KRqP!r=P{
+endstream
+endobj
+2465 0 obj <<
+/Length 274
+/Filter /FlateDecode
+>>
+stream
+xUбJ@ \`8+ h#*p`
+A+ RPo`XGH"$FcgVl |*Rz|-Ä6%7)1%?R:-ߦQaШCA @a{`0uЍ8
+endstream
+endobj
+2466 0 obj <<
+/Length 241
+/Filter /FlateDecode
+>>
+stream
+x%J0?, }][ma]=yaA=
+U<Q=4L`&g\6WpuڽAUu!<Ӯ%誆-wɷwڕt3{RiZ H?lGӋ NX3܈P6'_N6xf S aziO5OHu(Xq[iMinZzS
+endstream
+endobj
+2467 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+xڽбjA`6;uN\+J!S{s
+endstream
+endobj
+2468 0 obj <<
+/Length 197
+/Filter /FlateDecode
+>>
+stream
+xE1
+0W
+o -8ZN"QPѹ=Z#tt5!A!I*sw*JX˺بuam*d9rZk-&)DͅQ7[*AHI&tRRRMTx'o 2TXQ
+TV
+endstream
+endobj
+2469 0 obj <<
+/Length 177
+/Filter /FlateDecode
+>>
+stream
+x];
+PEo o6<Vbv'غtn2EHFÅs:XsgyӞd>e8%w!܉hr)-lb^gEih
+tP"Y~ЅqdXS(\!(iPC] mj7ҪS n1
+endstream
+endobj
+2470 0 obj <<
+/Length 182
+/Filter /FlateDecode
+>>
+stream
+x33T0P0R5T06W01SH1*26
+(Cds<M=\
+%E\N
+\.
+\.
+ ~NH~ ?j?01?` 0L @e5Ȣ ?Փ+
+endstream
+endobj
+2471 0 obj <<
+/Length 167
+/Filter /FlateDecode
+>>
+stream
+xڍ1
+@YR nv6 n!he!Vjih'qGRZp5Lܔs<6lg  ^9l KQ߮z=g|a9Gt)B(PD 
+endstream
+endobj
+2472 0 obj <<
+/Length 180
+/Filter /FlateDecode
+>>
+stream
+x33T0P0R5T06W01SH1*26
+(Cds<M=\
+%E\N
+\.
+\.
+ ?XN0 @Ar?``?h<x{:;Q'BԠc,
+endstream
+endobj
+2473 0 obj <<
+/Length 174
+/Filter /FlateDecode
+>>
+stream
+x]1
+@RnvA"+P,$(!E n1CXs_qxD:qeı,#e5$_l9eE2hKE T760= ӦAޝG4+ Ya|#xxЂf 8
+endstream
+endobj
+2474 0 obj <<
+/Length 131
+/Filter /FlateDecode
+>>
+stream
+x3235U0P0b#3sCB.#
+endstream
+endobj
+2475 0 obj <<
+/Length 199
+/Filter /FlateDecode
+>>
+stream
+xm=
+@' H2$&L!he!Vji(H ^DoV#*ZX|3Û;=í8ae&=X҈{ p:p"9ӖlȒx)O+G rߜW3=TU4 hʹtCPZa3+eG_5jd4iNB@
+endstream
+endobj
+2476 0 obj <<
+/Length 146
+/Filter /FlateDecode
+>>
+stream
+x33T0P0bcs3CB.c
+endstream
+endobj
+2477 0 obj <<
+/Length 118
+/Filter /FlateDecode
+>>
+stream
+x33T0P0bCs3CB.C
+endstream
+endobj
+2478 0 obj <<
+/Length 145
+/Filter /FlateDecode
+>>
+stream
+x3235U0P5V54Q04S01SH1*2
+(s< -=\
+%E\N
+\.
+\.
+ 
+fȀ@? `CŽ.WO@.
+endstream
+endobj
+2479 0 obj <<
+/Length 186
+/Filter /FlateDecode
+>>
+stream
+xڥ1
+0H LHur N(*=Z##tPZ+ 8 B>tLpȋb zƀS
+.z@)o&(3!DC1U JnjO;'>L^{wf7pz1[y+Y 0/Q
+endstream
+endobj
+2480 0 obj <<
+/Length 105
+/Filter /FlateDecode
+>>
+stream
+x33T0P0bC 3CB.CS
+endstream
+endobj
+2481 0 obj <<
+/Length 164
+/Filter /FlateDecode
+>>
+stream
+x33P0P0bS cCB.SS
+endstream
+endobj
+2482 0 obj <<
+/Length 137
+/Filter /FlateDecode
+>>
+stream
+x33T0P0bcscCB.c
+
+endstream
+endobj
+2483 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0R5T06V06TH1*26P
+endstream
+endobj
+2484 0 obj <<
+/Length 186
+/Filter /FlateDecode
+>>
+stream
+xڍ=
+0'}$ ],
+ftr'utPtp:v( ԡoOeLF4Ԙȥ"ՖvGL55.yDFآΈ }o J`J30V@ AaK}Ư/橀˥5 6?pq_Qn
+endstream
+endobj
+2485 0 obj <<
+/Length 186
+/Filter /FlateDecode
+>>
+stream
+xڍα
+0 
+7A轀&i
+ ING#t jR J&"A"txATPY|K*F9bE<[I"i'I f0)03Jk%/!=a Kr<;v@`_ZK-n;pQ? S
+endstream
+endobj
+2486 0 obj <<
+/Length 124
+/Filter /FlateDecode
+>>
+stream
+x323T0P0a3cCB.#c
+endstream
+endobj
+2487 0 obj <<
+/Length 169
+/Filter /FlateDecode
+>>
+stream
+x%;
+1F?p۩$:(
+_u*[}.  ɖ)\ٟhRް-I/R&]/zIOVS6g5\쨞d-yvT"4h<, "2cA.-^I@aIO0hD8'yMk;
+endstream
+endobj
+2488 0 obj <<
+/Length 138
+/Filter /FlateDecode
+>>
+stream
+x3231V0P0T5T02V01TH1*22
+(Ads< =\
+%E\N
+@QhX.Oz
+endstream
+endobj
+2489 0 obj <<
+/Length 139
+/Filter /FlateDecode
+>>
+stream
+x33T0P0R5T06W06PH1*26
+(Bds<M=\
+%E\N
+@BA, C ?b4"Q  A20
+endstream
+endobj
+2490 0 obj <<
+/Length 167
+/Filter /FlateDecode
+>>
+stream
+x3632V0P0T5T06S0TH1*26
+(Ces<M=\
+%E\N
+\.
+\.
+0?
+endstream
+endobj
+2491 0 obj <<
+/Length 195
+/Filter /FlateDecode
+>>
+stream
+x35г4Q0P0T5T05P0TH1*2
+(Ces<L,=\
+%E\N
+\.
+\.
+c!0`
+endstream
+endobj
+2492 0 obj <<
+/Length 189
+/Filter /FlateDecode
+>>
+stream
+x=
+0b/ X#~,I<c#d #ۍ{'}HS9f|e7D܏a,\llȲ-Wr=NlL2s١s\i^
+j"5=[  LtS1i=A;LR$2`D{xUSZnL
+endstream
+endobj
+2493 0 obj <<
+/Length 204
+/Filter /FlateDecode
+>>
+stream
+xM=
+@Y B. 8f??`
+A+ (X
+endstream
+endobj
+2494 0 obj <<
+/Length 176
+/Filter /FlateDecode
+>>
+stream
+x;
+@3LM'@`
+A+ RP6Ҳ,!e8ds.ГR;U #9jv~}nR5\Zkf(
+%
+1!&h1B:; 2puZgFHo& ;iNT4pY34t?"6
+endstream
+endobj
+2495 0 obj <<
+/Length 163
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0V5T06R01QH1*2
+(Bds<,=\
+%E\N
+\.
+\.
+ ``~P~A@,~a`@ F6.{@"  w
+endstream
+endobj
+2496 0 obj <<
+/Length 116
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0bcCB.#c I$r9yr+s{
+endstream
+endobj
+2497 0 obj <<
+/Length 205
+/Filter /FlateDecode
+>>
+stream
+xE=j@'T,La]Xs'XE``ra $ 60MG#L! !){LOp\db(^4oHo8HJye隷55ja1R[!rҸ%B~q@$X&JDꉜėa`&hЎ
+endstream
+endobj
+2498 0 obj <<
+/Length 201
+/Filter /FlateDecode
+>>
+stream
+xUαJ@_,8tIKB`
+A+ ʃS}<J!e`,>fl}n4Lfn|HZh^Z̳{zډ)oՊj*up Q3X;#pC's0 s/ nRЉ~۞\%D~OI
+endstream
+endobj
+2499 0 obj <<
+/Length 169
+/Filter /FlateDecode
+>>
+stream
+x}ͱ
+@ BP:w<wYԡVA"AU}2Q b
+n!BbQ:-)#Lv hq .-Zf5G.|Y˩$*Y'7l+!7
+ DB 9hhgA޽
+endstream
+endobj
+2500 0 obj <<
+/Length 193
+/Filter /FlateDecode
+>>
+stream
+xڅ=
+@,Ct/ \@7b* V"j)(X٣(9e
+1؈̛ua}pr&,};zG̜ÄXd -t!/كcU*).rx7ZrYzq
+6d[|.l!ViB\[©&QJ3z@
+endstream
+endobj
+2501 0 obj <<
+/Length 204
+/Filter /FlateDecode
+>>
+stream
+xM=n@gm4{<H(TD@HIERJ
+m#lI`׼yW'θ䇜˂w9Xhq5/_Z67\,ȿjLy= W9f0g]D+sbʼn 64ioca\`ۍL{Ӥ^MqlF_R+ L
+endstream
+endobj
+2502 0 obj <<
+/Length 175
+/Filter /FlateDecode
+>>
+stream
+x3632W0P0Q5T06Q01UH1*2
+ 2ɹ\N\
+F\@a.}O_T.}
+ 
+.WO@.
+endstream
+endobj
+2503 0 obj <<
+/Length 217
+/Filter /FlateDecode
+>>
+stream
+xU=j1ߢB0n ?lE \T 6p!{-0(u >4̛fxK~ʹ,x3if\M'-Zr[.f&׾t x[rNnŻwjW CughKJ*e>C# qd /[Đ {@2HC'2;woU#;%҆~-M
+endstream
+endobj
+2504 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+x]jQO케%B f$X%)-
+"|}[:$7 gΙsZS:T1漸N>W49Lz%/T V4;zG0^94gu!Qnh^t =
+\
+endstream
+endobj
+596 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F36
+/FontMatrix [0.01506 0 0 0.01506 0 0]
+/FontBBox [ -3 -18 71 50 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 16
+/LastChar 122
+/Widths 2505 0 R
+/Encoding 2506 0 R
+/CharProcs 2507 0 R
+>> endobj
+2505 0 obj
+[23.51 23.51 0 0 0 35.27 0 0 0 0 0 0 39.19 39.19 0 0 0 19.59 0 58.78 35.27 58.78 0 19.59 27.43 27.43 35.27 54.86 19.59 23.51 19.59 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 35.27 19.59 19.59 54.86 54.86 54.86 33.31 54.86 52.83 49.93 50.94 53.85 47.97 46.01 55.33 52.83 25.4 36.21 54.79 44.05 64.59 52.83 54.86 47.97 54.86 51.89 39.19 50.94 52.83 52.83 72.42 52.83 52.83 43.1 19.59 0 19.59 0 54.86 0 35.27 39.19 31.35 39.19 31.35 21.55 35.27 39.19 19.59 21.55 37.23 19.59 58.78 39.19 35.27 39.19 37.23 27.49 27.82 27.43 39.19 37.23 50.94 37.23 37.23 31.35 ]
+endobj
+2506 0 obj <<
+/Type /Encoding
+/Differences [16/a16/a17 18/.notdef 21/a21 22/.notdef 28/a28/a29 30/.notdef 33/a33 34/.notdef 35/a35/a36/a37 38/.notdef 39/a39/a40/a41/a42/a43/a44/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58/a59/a60/a61/a62/a63/a64/a65/a66/a67/a68/a69/a70/a71/a72/a73/a74/a75/a76/a77/a78/a79/a80/a81/a82/a83/a84/a85/a86/a87/a88/a89/a90/a91 92/.notdef 93/a93 94/.notdef 95/a95 96/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121/a122]
+>> endobj
+2507 0 obj <<
+/a16 2434 0 R
+/a17 2432 0 R
+/a21 2435 0 R
+/a28 2440 0 R
+/a29 2441 0 R
+/a33 2422 0 R
+/a35 2436 0 R
+/a36 2437 0 R
+/a37 2438 0 R
+/a39 2423 0 R
+/a40 2415 0 R
+/a41 2416 0 R
+/a42 2424 0 R
+/a43 2425 0 R
+/a44 2426 0 R
+/a45 2433 0 R
+/a46 2427 0 R
+/a47 2428 0 R
+/a48 2495 0 R
+/a49 2496 0 R
+/a50 2497 0 R
+/a51 2498 0 R
+/a52 2499 0 R
+/a53 2500 0 R
+/a54 2501 0 R
+/a55 2502 0 R
+/a56 2503 0 R
+/a57 2504 0 R
+/a58 2429 0 R
+/a59 2430 0 R
+/a60 2417 0 R
+/a61 2431 0 R
+/a62 2418 0 R
+/a63 2442 0 R
+/a64 2439 0 R
+/a65 2443 0 R
+/a66 2444 0 R
+/a67 2445 0 R
+/a68 2446 0 R
+/a69 2447 0 R
+/a70 2448 0 R
+/a71 2449 0 R
+/a72 2450 0 R
+/a73 2451 0 R
+/a74 2452 0 R
+/a75 2453 0 R
+/a76 2454 0 R
+/a77 2455 0 R
+/a78 2456 0 R
+/a79 2457 0 R
+/a80 2458 0 R
+/a81 2459 0 R
+/a82 2460 0 R
+/a83 2461 0 R
+/a84 2462 0 R
+/a85 2463 0 R
+/a86 2464 0 R
+/a87 2465 0 R
+/a88 2466 0 R
+/a89 2467 0 R
+/a90 2468 0 R
+/a91 2419 0 R
+/a93 2420 0 R
+/a95 2421 0 R
+/a97 2469 0 R
+/a98 2470 0 R
+/a99 2471 0 R
+/a100 2472 0 R
+/a101 2473 0 R
+/a102 2474 0 R
+/a103 2475 0 R
+/a104 2476 0 R
+/a105 2477 0 R
+/a106 2478 0 R
+/a107 2479 0 R
+/a108 2480 0 R
+/a109 2481 0 R
+/a110 2482 0 R
+/a111 2483 0 R
+/a112 2484 0 R
+/a113 2485 0 R
+/a114 2486 0 R
+/a115 2487 0 R
+/a116 2488 0 R
+/a117 2489 0 R
+/a118 2490 0 R
+/a119 2491 0 R
+/a120 2492 0 R
+/a121 2493 0 R
+/a122 2494 0 R
+>> endobj
+2508 0 obj <<
+/Length 97
+/Filter /FlateDecode
+>>
+stream
+x3734T0P0R0P03P05QH1*25
+(Ads<L͹=\
+%E\N
+\.
+@b<]C@@\\\
+endstream
+endobj
+2509 0 obj <<
+/Length 305
+/Filter /FlateDecode
+>>
+stream
+xJ@
+rq
+GW k\ځZ3iL#@JxN@H@C q|BcI}5eoyTK$[NSlGi2PdٸVySlAKiNRan[=PCmI haV) tVPZެd<vl"Djlkl>z
+endstream
+endobj
+2510 0 obj <<
+/Length 497
+/Filter /FlateDecode
+>>
+stream
+xڽֽ0D."#$O@.pw\g8$@]Wv7#Gp5&xĤ 6?^nn:g>\t'~x?~|t=CWŧU0WB?HR $Lh}
+"MU%$U/+Bc$LdzlPT8=l"\F(|f5&>'\ L'e,yH.4 l5(=2mŷY,!Ԙey l?ءvZCR$]l` %fw-b,of5&x6 F
+endstream
+endobj
+2511 0 obj <<
+/Length 422
+/Filter /FlateDecode
+>>
+stream
+xՖN0e%P?iڢJȀbFɣ(~\:sXUaR{ϹrvX/\wOZ쟗Ll! 7)D w"H[*ݕD?b+ɴo#@t@6&RÛJCkB`XƀRՀ\kLk@O3/j"htAwv<Qٷט%KKQ="4P<
+\1<d4kCkTÐX?*<ˆ5}aA1 2d۷%euf(bO _DN=~
+endstream
+endobj
+2512 0 obj <<
+/Length 569
+/Filter /FlateDecode
+>>
+stream
+xn  `^ z)MR{1T͵U(<>X0 kƶcv x ի~뽾pZM t";y}ڛ}V?/<hbŧv ς@ۮ|}EDP8,-@E=@?y]ph,_"R P"((G+*Ԉ
+.|48()sW =ؽ YQŹ ۢ#0`´ G u
+As
+T"lUgEp4<#`<C x xx/F੠' D<xJR1UNrp.i+s b|-Gڪi\1}F,4d8]
+8wbODejCwⴖ$R3ey7rr?yׯ#UQ~
+endstream
+endobj
+2513 0 obj <<
+/Length 386
+/Filter /FlateDecode
+>>
+stream
+x=n0p#$/RJeNNMQr j$[(jA~!Y\ms-MNh~M`_|}ǻO
+ލ|}~tpC(N䙒{2G·BMѦ&FM(2nZ 4m`&&ן)Τ*( [*T-)D
+"QNAM8UZUε:ש7)IMAHA!HG7榓Aȗ: /HITωV,{}+OZ5." t_jwsF
+endstream
+endobj
+2514 0 obj <<
+/Length 319
+/Filter /FlateDecode
+>>
+stream
+xڽֽN02X%`?!`TD$02`<ZCUJKV\l*sr^RnfTF?~cszRC7{Npq9x|b~{B?]>r~6DvI!P@(!P
+"
+7K*dǁX+
+endstream
+endobj
+2515 0 obj <<
+/Length 237
+/Filter /FlateDecode
+>>
+stream
+xս
+0
+<;̓XPe*'NΘ3e}<c}ڑ_ѹȅ=")؏pa
+endstream
+endobj
+2516 0 obj <<
+/Length 566
+/Filter /FlateDecode
+>>
+stream
+x=0
+endstream
+endobj
+2517 0 obj <<
+/Length 116
+/Filter /FlateDecode
+>>
+stream
+x330W0P0bsC#CB.3JrW03
+
+endstream
+endobj
+2518 0 obj <<
+/Length 202
+/Filter /FlateDecode
+>>
+stream
+x1
+P BѩP+A'qRGEz4 ƶvCϔ)C!!E! v@UPrĀc
+endstream
+endobj
+2519 0 obj <<
+/Length 445
+/Filter /FlateDecode
+>>
+stream
+xڭJ@{#>IbP+'I=zPh<J!1dW3t!eJ',9KU`R(9PvbJo \z~zD"^T%7"_V9KK_790s<ͦ|dʺ\{ֳQ_W7´v͸/0AK'XX{䄉=tIo'XFp S0s6XPS +0QqLz2`mrH\$0}c>1Lt VT7a 䢹 xnA.`&Lv ,L;Fga:ӹt.Cl ]lg%$!`8 {8
+\naV͹D7ἠi.ݸ~d(
+endstream
+endobj
+2520 0 obj <<
+/Length 510
+/Filter /FlateDecode
+>>
+stream
+x햱N0 @SP)K?(=+ H01 &`d
+endstream
+endobj
+2521 0 obj <<
+/Length 294
+/Filter /FlateDecode
+>>
+stream
+xֽj0
+z(SЩء%G<jVeϹĄ@i?dXNDs t>@fjd'/HA<y
+7&3+nZX:'.\]YfuF ]8 !G M,.7 o V{ޟcfw"+E~/_tN1kߓNGӀߐ'_nw'c߇,"c+d FΝ0Sxl
+endstream
+endobj
+2522 0 obj <<
+/Length 691
+/Filter /FlateDecode
+>>
+stream
+x=0&G/
+/J!e7s&sb2P`H,TH-cvi;2L bRUt? T mm%CIIh@$ -:ޖU[FLS$AH,m( D +=ȈĤETF 7#.#|_H '?l}ez\uQʶIzYEY54^G\UdUT}^ 9p*cӯgS <!Ƣ:{"vFhS;Z۷A\mߞqCUŽxƧ§
+}
+D^Q{ k_ €_aYD u_;2Ƶq c`;qER%5df>S3l^G`gB9OMR12=oȸ"+M&ƍ!pb nRN p2ljq/e'ˈȗhL;;ۄɰ;XL>ÈʆN1D&N*V<xO a$_?
+endstream
+endobj
+2523 0 obj <<
+/Length 428
+/Filter /FlateDecode
+>>
+stream
+xֱN0pIrջ\.1!9D::htx>cB-kr D~zjs> 'g6-3#o+VW?c./^R;n{$Վ&SI6ZLP = +S͑2 (sHٻT@LNJ¡f1Q%5
+endstream
+endobj
+2524 0 obj <<
+/Length 227
+/Filter /FlateDecode
+>>
+stream
+x;
+@ 49B&k>Vb&GQru7݉),$"?|s}Cpr8
+ Ӡ%!pՁAF J@P  iTWB+USF, 07=1I 
+endstream
+endobj
+2525 0 obj <<
+/Length 328
+/Filter /FlateDecode
+>>
+stream
+xֱN0
+endstream
+endobj
+2526 0 obj <<
+/Length 723
+/Filter /FlateDecode
+>>
+stream
+x=@!$4| $癸Vʳh Z
+$I1yyyC+bUuAUT壢<TuO7c{ctttw|V|m|(U,U1OO"uBr"8+,aByn Pȍ4(߸oʁAۦLʀr:EPMy_z4l!B)8iڢ`o*E ׻ţS g aA3x!wkP>LP9nu(oN9m7:D*5&(.5@='$[z&Mna^QZʡ6D1PzóȺPu!J2 U!]P
+BŒr$BJmz(PFaڤ հ53iB4i ezk,Ms" 1\!,6@Ab"+BXmJ2pEVP% eHEF(J i5JPغib>5@FpkؚӤ)h.!P[(C_UORЏAND\fϏgq00Ngqt9Dp綳x&jPr<'}Pu5R/vkN_y֜JMBKxP䘾H
+endstream
+endobj
+2527 0 obj <<
+/Length 419
+/Filter /FlateDecode
+>>
+stream
+xڽN0[e%`
+``,#9nj,d i|9swV\=PHm`jr 6.@3΁ 0)@p j.> 0 ;`ZB
+endstream
+endobj
+2528 0 obj <<
+/Length 374
+/Filter /FlateDecode
+>>
+stream
+x=N0pG*y @bZUbTD$Sad
+endstream
+endobj
+2529 0 obj <<
+/Length 357
+/Filter /FlateDecode
+>>
+stream
+xՓN@!L#/ӣ<)LXF[QxJ
+roX~,;ULJRD*tuJxMǥ}u ^- ?wӐ.!m7:rWc/ %bvR6PQ)T*R֍<4\m:bE^n@,Iie$Ψ  [6 }ߣ.`q Ǟo1r4p ?_mO~уU`3g;'sJhjXgd9cv؄G53X&
+{4$Vuk3|6(DStSX&ᬆ+x&8HF
+endstream
+endobj
+2530 0 obj <<
+/Length 361
+/Filter /FlateDecode
+>>
+stream
+x핱N0KHDzMd08Fgx4G`d {N[ !\'/6y+Kq"xBgz"7/|WQO;<݋')g^ @;?&yx|*tTT#cF
+1 'tU1@
+endstream
+endobj
+2531 0 obj <<
+/Length 360
+/Filter /FlateDecode
+>>
+stream
+xڽN@Ǘl6<aD<)LXFkx4G 3;;ǡ^q^;sG+N\q3b9:W9l7M:mZ]'nn.\fӭenuoShh
+endstream
+endobj
+2532 0 obj <<
+/Length 227
+/Filter /FlateDecode
+>>
+stream
+xԽ
+@ +ByEn`A'qRGEQ|1XQWG=hsthSL0㫟`6:javةlgx:w``Ǹ5c4"]*E.AbhaȸBԢ¸Rh#LJe@%VJn!9S{HNjHInb_Kďt})]9&9,sp
+endstream
+endobj
+2533 0 obj <<
+/Length 530
+/Filter /FlateDecode
+>>
+stream
+x͕?0&G/
+\??۟=]=}W]>&6{x-5vp{ܼ|;םo߸7GvS Sp
+?^Zr(CqJZC8d\̭X녶%"ju{ww7t6
+endstream
+endobj
+2534 0 obj <<
+/Length 266
+/Filter /FlateDecode
+>>
+stream
+xԽJA
+ɸ?IafabvTP^At=)H ~ ky3@9;B5xBE"vIG5kժT%)K7f̫څWjƫe.h]:2-cBRh
+v*(?Xٟ(U_m~?\0Aֽ
+endstream
+endobj
+2535 0 obj <<
+/Length 174
+/Filter /FlateDecode
+>>
+stream
+x333T0P0bSCCB.3JrW01
+endstream
+endobj
+2536 0 obj <<
+/Length 272
+/Filter /FlateDecode
+>>
+stream
+xԱj@ ` -~ˁ)C:NM -l?Zŏу">nmg8/w84GY y6naUy,([` >;0{`ߠXc ˝%VQFtVc"5!:o^ϟ}|cvϼs48 oo9b[l娖JΘS%کh6lHk8>˩$sq|+Zg)aaА`
+endstream
+endobj
+2537 0 obj <<
+/Length 388
+/Filter /FlateDecode
+>>
+stream
+xձN@`.$#O l;L0XXX><%ƅey\dgg680:GgfqzP&]Kiy{JJsVDW: AD% A#"Dz/̨T!
+endstream
+endobj
+2538 0 obj <<
+/Length 122
+/Filter /FlateDecode
+>>
+stream
+x333T0P0bSSCcCB.b%r9yr+s{=}JJS ]&ry(000700DI2؃Iv$y%? JCrzrr
+endstream
+endobj
+2539 0 obj <<
+/Length 339
+/Filter /FlateDecode
+>>
+stream
+x=J@
+ ;basXX(s}ɲV(6H2g$(ʇ;޶繹2`D]IicKn}b¤]tjOrrj`
+Qp
+endstream
+endobj
+2540 0 obj <<
+/Length 256
+/Filter /FlateDecode
+>>
+stream
+xԽjA4>]C6
+LeR%)SD.p,Haqrpqv%X$Mp`?~bҗMnsM+z2FD; F11Ij 1xHogT 
+endstream
+endobj
+2541 0 obj <<
+/Length 347
+/Filter /FlateDecode
+>>
+stream
+xՔ;N0&Gع
+endstream
+endobj
+2542 0 obj <<
+/Length 380
+/Filter /FlateDecode
+>>
+stream
+x핱N@P\ Š*L0X!|1><%aY@FoٽN;z5W{:TP]hy-u0y CX
+H+ҏݥJKδ
+eRB$Ja>
+ jɡؒK1k(p,y$BL"m#Q# XcEɨLlThLM$# eOC*: jC$(Ӕ~f/Q'N~Cрoԍ]P>m>*#r7}iwFHycNV4DUc@v\uRt<†P <ow%5:O
+endstream
+endobj
+2543 0 obj <<
+/Length 228
+/Filter /FlateDecode
+>>
+stream
+xj@sy7Q@
+T=
+T<Z%c%hv`g; 3D"3D1"4{rV%U,_QbVKy%z|)D57`j
+^EË&k~nu 5Di+hT[Uk>Od
+endstream
+endobj
+2544 0 obj <<
+/Length 394
+/Filter /FlateDecode
+>>
+stream
+xuN@ etK!TJ;E*EL @0Ǐ$k Z*!zڿo:Xla,¼nVrj{Sۺ2ٔb]rgz4RȉdZ"!_ah
+u^ߺGX?JL 3
+<@1dȐ*$  0ShTz 5Dbބ°40Drc-e\FUdh)SV1\\L d
+))8
+endstream
+endobj
+2545 0 obj <<
+/Length 243
+/Filter /FlateDecode
+>>
+stream
+xӱ0H-y hVP?8(}b ZEL nmk [6 ߛ[b'
+ToG j32y+O@>FXA\GU C;s)+य़k,La8ŹIjK3
+DF#behLB,VӨ?"?Ґ
+endstream
+endobj
+2546 0 obj <<
+/Length 258
+/Filter /FlateDecode
+>>
+stream
+xJ1,{e@4!P+AO'CE#8B"x9$|$O'j8#B3H0CX)pw(d\s/ϯOF7HxO'Ќ.LU/3G2(_ɄM$dʬvw*~rMmMUID'N-eUx?&\BJ(^y4l4pV_
+;kY]׊[6-e ,J
+endstream
+endobj
+2547 0 obj <<
+/Length 499
+/Filter /FlateDecode
+>>
+stream
+xڽձn0`
+p#/r)PکCѩ!AZ|3Q5b;R<&Ue2 O>N]w{uWwէw>yS-xuq{|:ު_[eegb{X^.WnH,R헡~%rQ!҄d.S'X>Rr/I"5)L&J\n@CA#/A#1w=)XAtJays@r%ٸiHS"_CF5&! |܍d |i 4&ZHA— H:S`?zJSM)_Gbl2"LLh9R_ 9JcWLS&#/P'
+IG@$hdJJc&7C9K{I3 $Wb,W7@]DҸ69#O-pJI#7Bx*Q"ۄ>$9MI ?_3^
+endstream
+endobj
+2548 0 obj <<
+/Length 415
+/Filter /FlateDecode
+>>
+stream
+xڵN0e%? LJȀbFɛU(}"9MU9_bٟ;ګ {m:k/Ƽ[ <㫷Outu?o޼Xӽ~oK5P
+Jz@ONZTj*,x"a$*TYp\Ra5Va5VaUXUXUXUf7'BjId
+$RK*$sDX1Q
+endstream
+endobj
+2549 0 obj <<
+/Length 349
+/Filter /FlateDecode
+>>
+stream
+xN0K\x
+՘=k"=y0{R4zGQxci_$$A؄c3Wds .+"vBv>~|B|O2Ł3V1JĚphdtC̠ʱU^]ca 
+
+5r2Mv2߫YG Me W#Wѭ4fppd<ЊZ9)]k,eFN,"W!wf3gt\4sԺcK7}D+OjP'u8ѽpPӚ^["o@3=y_s?/sĞ/pS|~
+endstream
+endobj
+2550 0 obj <<
+/Length 160
+/Filter /FlateDecode
+>>
+stream
+x3434W0P
+)\\@0,ɥ`nʥU()*Mw
+pV0wQ6T0tQ`
+endstream
+endobj
+2551 0 obj <<
+/Length 481
+/Filter /FlateDecode
+>>
+stream
+xڝ=0mKW@&B7T)@T@IYe%L1g`b97x8=cyvǧGq4_&^ܟ֟fxf8߾~dh.m}o^IaL*m10RJ4'xݬi[6 ОЭe? ,E%D6rDi&+j{5_ʖéZqvmA]Z<S1~PM\
+H"Go[c08e7KKC]
+dDT?3.N/(n1~ZWv]D
+fˊedd%d4,,BВRR=r
+V8,p!';KGut妭 ƹc.d3ŵQWGYڳEǽ庥} ,7MuV0*vY0Q͋yc~EO
+endstream
+endobj
+2552 0 obj <<
+/Length 484
+/Filter /FlateDecode
+>>
+stream
+xڍ;N0&G/
+8GQr)g֙ᱷȷņg,yqy_ v5d٭gY}ǿ>X3ȞK)[ǩ LQbUJEѰHvP)Cduu(#PZa͢D
+#bjTXsky]L?<`ќ]>ο , gU5 LQά9dm?x ,f<06VAC:9E$"
+$]3|(صGFbl>M:>u(0PB3*ԫ9'FТGՉ<e;4SWf? 0.Y&XxZ£(_YA-{5pig#I%t }#Xlm;l?$FԿ<C1&YOX/?> vS <,
+endstream
+endobj
+2553 0 obj <<
+/Length 321
+/Filter /FlateDecode
+>>
+stream
+x1N0Z,yB'KHd@1#V(9BC҄<g[^sSUlyj<[~<<^զRŽY/Uq=l1/^y|T,b.Mvdp r$kr#;X%Yٓ-,ٞk8ߑȞ7[X=%Yp#ؑ=<[XpKrav#{:HnaA"n`YÚ<D`Gt"a8kX~`Gt#y0zaM#L#{HPX=VWS9#W
+endstream
+endobj
+2554 0 obj <<
+/Length 452
+/Filter /FlateDecode
+>>
+stream
+x=N0
+>6ڳ&B4j)gBEr)Ϻθr%\Cz3* |/^zMcQbee;ϰUDi޺Mع(RKA]X)#D%0fFgB
+%m6 7l8ƥl}ʕ.t7%w14A؉2\4"gx2&,OU5̔ﭬs}v/c֮FiKj]Ɨ1/\
+endstream
+endobj
+2555 0 obj <<
+/Length 497
+/Filter /FlateDecode
+>>
+stream
+xڵϊ0
+ L^`TYv
+Ba]9zڃV<Q=Ρ6~df@0I6m\.^uK1fB_ѵzg[mM6z}㫩߿vom>ݍSO(!6zHH aϷÈ̷O@O_+~ǯ"ecWp2S݀Ìx5 zlӐ> qTQj)f<5jeVe
+v?bpNGRjN2L` Ew2g/6ŞG*hˁ\|R`+~$?%
+F­@U}$i~(UZ"z)7;q
+endstream
+endobj
+2556 0 obj <<
+/Length 344
+/Filter /FlateDecode
+>>
+stream
+xӱN0pH.<B
+%g&`qRGG#02*Q.N|\\򔋌e\\R*]gʆ;4y&}&~ l3ͷTx|jp 6l=ǧY8`#[p=<.i 6.3w)Lj^,svuZmGW}[ҭlK؀anl]U#8`1#p\Oa|qW148:!y #{\,Apy-p|f,?4 s=VrcMN,X
+endstream
+endobj
+2557 0 obj <<
+/Length 568
+/Filter /FlateDecode
+>>
+stream
+xڍ0cƏ`
+b89 acK[ )j1=BN9΍KIeҷz_WvTlhK :.9]"r`8L*&b c8h_ @DvLN9Z0ȝj;cArJ) %aC).ey\e]qT6 nM^VWyY9$ʡ%Gܐ秜jes7湞RKiOFvCLrFba {~UL:lw~1 s_
+endstream
+endobj
+2558 0 obj <<
+/Length 503
+/Filter /FlateDecode
+>>
+stream
+xڵMj0p/ .xP2KBgQhVY.HHv&$>^Oєi0X4IsfV5ߘ5[ѷz>o7bknu?擹{MK1zsi]\s.$lwUBJEunp4͍s<JvĘ:y=jh0Pt-u=`a;oi
+<w{cU7v-z/ֹwqR?%OdsUxKL9ˊ㶂9_G #ڳ V˜-8KY6͔t
+amԻz>~嫦{+8RIBCc_2gR/mt9LVXq1"Abg/aj8fxg7VaX*Ua(rzcT$]r 'i^%ߟ>#6Jq
+endstream
+endobj
+511 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F28
+/FontMatrix [0.00484 0 0 0.00484 0 0]
+/FontBBox [ -11 -42 219 145 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 27
+/LastChar 120
+/Widths 2559 0 R
+/Encoding 2560 0 R
+/CharProcs 2561 0 R
+>> endobj
+2559 0 obj
+[126.2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 72.11 0 0 108.17 108.17 108.17 108.17 108.17 108.17 108.17 108.17 108.17 108.17 0 0 0 0 0 0 0 163.21 153.72 156.25 165.74 141.84 135.83 170.01 0 79.07 0 0 129.82 205.13 0 162.4 147.71 162.4 159.73 0 150.38 166.14 0 223.3 0 0 0 0 0 0 0 0 0 108.17 120.19 96.15 120.19 97.59 66.1 108.17 120.19 60.1 66.1 114.18 60.1 180.29 120.19 108.17 120.19 0 86.55 85.34 84.13 120.19 0 156.25 114.18 ]
+endobj
+2560 0 obj <<
+/Type /Encoding
+/Differences [27/a27 28/.notdef 45/a45 46/.notdef 48/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57 58/.notdef 65/a65/a66/a67/a68/a69/a70/a71 72/.notdef 73/a73 74/.notdef 76/a76/a77 78/.notdef 79/a79/a80/a81/a82 83/.notdef 84/a84/a85 86/.notdef 87/a87 88/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117 118/.notdef 119/a119/a120]
+>> endobj
+2561 0 obj <<
+/a27 2509 0 R
+/a45 2508 0 R
+/a48 2549 0 R
+/a49 2550 0 R
+/a50 2551 0 R
+/a51 2552 0 R
+/a52 2553 0 R
+/a53 2554 0 R
+/a54 2555 0 R
+/a55 2556 0 R
+/a56 2557 0 R
+/a57 2558 0 R
+/a65 2510 0 R
+/a66 2511 0 R
+/a67 2512 0 R
+/a68 2513 0 R
+/a69 2514 0 R
+/a70 2515 0 R
+/a71 2516 0 R
+/a73 2517 0 R
+/a76 2518 0 R
+/a77 2519 0 R
+/a79 2520 0 R
+/a80 2521 0 R
+/a81 2522 0 R
+/a82 2523 0 R
+/a84 2524 0 R
+/a85 2525 0 R
+/a87 2526 0 R
+/a97 2527 0 R
+/a98 2528 0 R
+/a99 2529 0 R
+/a100 2530 0 R
+/a101 2531 0 R
+/a102 2532 0 R
+/a103 2533 0 R
+/a104 2534 0 R
+/a105 2535 0 R
+/a106 2536 0 R
+/a107 2537 0 R
+/a108 2538 0 R
+/a109 2539 0 R
+/a110 2540 0 R
+/a111 2541 0 R
+/a112 2542 0 R
+/a114 2543 0 R
+/a115 2544 0 R
+/a116 2545 0 R
+/a117 2546 0 R
+/a119 2547 0 R
+/a120 2548 0 R
+>> endobj
+2562 0 obj <<
+/Length 236
+/Filter /FlateDecode
+>>
+stream
+x3Գ0V0P04Q52U05T07UH1*26
+% ɹ\N\
+f\ .}O_T.}
+endstream
+endobj
+2563 0 obj <<
+/Length 215
+/Filter /FlateDecode
+>>
+stream
+xڕA AA
+dwd
+!²!L(yOK7?#a̙97J: b2]g#6\b"|cQ p\5Pc
+endstream
+endobj
+2564 0 obj <<
+/Length 143
+/Filter /FlateDecode
+>>
+stream
+x3Գ0W0P0S5T02R04PH1*24(YBs< M=\
+%E\N
+\.
+\.
+ !?d|AA- 
+0`l`n`gJX
+
+endstream
+endobj
+2565 0 obj <<
+/Length 246
+/Filter /FlateDecode
+>>
+stream
+x]ѽj0
+gxonQbGP&QH/X֐`C`^!g i&^2P{ԾQ`|J'Ql¦g9nٞQ7R&Mb?;F;klJjIr~V6̢NM;!) ; {vF=B&?Ň
+endstream
+endobj
+2566 0 obj <<
+/Length 290
+/Filter /FlateDecode
+>>
+stream
+xuN0/<B$AV H01 &@U(~sDr'U]Xn]}şlWo.\4xzbxk*.v2+7;C4o
+0"8/dCB+@{Ҏː/aZB֫rvV/QAlSDs,b¢MnjЄàB&q@k2(񈅤_#Η!$/1 \` N
+s-D%`n"l)P'
+endstream
+endobj
+2567 0 obj <<
+/Length 306
+/Filter /FlateDecode
+>>
+stream
+xڅJ0)=roжKi]X`z ԣAl-G1q&I]D{J?IgZJL1t
+3*FS,~YnkbeR_ǓL dû {Y41 aX]L6
+6
+endstream
+endobj
+2568 0 obj <<
+/Length 281
+/Filter /FlateDecode
+>>
+stream
+xuJ0 9, l=,AГ Gˣra83Iʪ/CӁ2\gƞ#W-Z,e{c>?^\^˵yM
+endstream
+endobj
+2569 0 obj <<
+/Length 164
+/Filter /FlateDecode
+>>
+stream
+x3635V0P0bK3 CB. HrW01
+endstream
+endobj
+2570 0 obj <<
+/Length 350
+/Filter /FlateDecode
+>>
+stream
+xmAJ@7dEzs"SYr!ԥBb+ x
++5|wWטAn֞kIY; a;f׽czD> ȮC
+- ϣA;#:o[sF4P9vcaر?:v9@v ]|hl2g.#_'9.:;G
+U5uC,W
+endstream
+endobj
+2571 0 obj <<
+/Length 281
+/Filter /FlateDecode
+>>
+stream
+xmJ@)=`^yMJڃAГ=g- =H|d! ,dvu~]PF-in%,V\̴"3o0}b 1n1  |90h7 g5E7_({[#W`k51 ` uQ':HU_-h _>/qAzJq;[j{R=ev }!(w5i:5ѝ
+
+endstream
+endobj
+2572 0 obj <<
+/Length 293
+/Filter /FlateDecode
+>>
+stream
+x]бN@Pl} M3D+ cM,h([R\U_e׺toTENE*gyPJ%OUrGeT]%ۇdS~QN@ a{F4讉>C]6q aO̪qӂphA;'[tž {
+endstream
+endobj
+2573 0 obj <<
+/Length 278
+/Filter /FlateDecode
+>>
+stream
+xڝJ@/C hiqV0<'(TQA>ZuvI/Lfwy~rZr\\+TS_hQQrENɵ)VL3J|q@ՒccZ(
+ш
+endstream
+endobj
+2574 0 obj <<
+/Length 283
+/Filter /FlateDecode
+>>
+stream
+x}=N@Fbi|'q4X
+AT(PRM8GHŠAJCV<f<.C{^жy#^ukF;j߇7W7 RMX{o$# 1$R1i%R}f(ssƃx#bU13REXU1N膳?E*.f{@{@I{A{ԡIGRW*ªV#H1Cq;tJ|>/L1a
+endstream
+endobj
+2575 0 obj <<
+/Length 232
+/Filter /FlateDecode
+>>
+stream
+xUϱN0?` @BR$2TuF@R?Z$^ďCUYb컳u/ /l- kZ]W/ﴮ(bk(:Ֆ>(_?ܲT7,vTmr^HT[ s碆ou@3xMT#zU#iGu;*Y}(92&4i)uQEmfbD%bp&a)u=ԯ9ߕUH Z
+endstream
+endobj
+2576 0 obj <<
+/Length 263
+/Filter /FlateDecode
+>>
+stream
+x]J0s/ymYw{qa]=yOQpEaͣ|=tI6?:UX*Tt>+XtZ55tE}/P,o/QA#+dG[;y]Ċ&rG|!nMʶr9&s"s< 8%v\-AEpA&}jXnEr0#SwDJx'4;wsl_o"ٛrwi\p(tg
+endstream
+endobj
+2577 0 obj <<
+/Length 217
+/Filter /FlateDecode
+>>
+stream
+xu=n@4A<ełRa).*J
+CxG.,gD4v! _{x S A^N2TG&(Jܧ7⪵~-uS[
+W
+hƤ!ˌJp3""Q4zj"| Ĉ404Lg(HIBI_YU!'J
+endstream
+endobj
+2578 0 obj <<
+/Length 264
+/Filter /FlateDecode
+>>
+stream
+xUнJ@H&/ d^@\e<VbWZ(څKW L"$d%ewYc1G$bfc9W2F|n^hQx&Z)ncGc
+ )2NAp* Ǐb4(*b FZ¯Z"nTX'{8N<*Z[8Ϳֳh`[Nho.w?uD_ߩn 6+/ި#Mn2&"UFw v
+endstream
+endobj
+2579 0 obj <<
+/Length 263
+/Filter /FlateDecode
+>>
+stream
+xe=NP!L `. ./YD
+0VjiM,J(#aHHUN1-$쌖9=&i˘V㓇gn)P]UqMoO67]B=[耯^+Bϭ3k\3X;o!wZ=|U%mI Zy2VɰȌj"T&vYѷш 1
+Ake;(/xA
+endstream
+endobj
+2580 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+xڍ1J@ [,L^@\@7@B@L@+ yRXE!.#lBM"_39= d鸤P]]h* 
+%Ǩ =?ܣΩDmI
+endstream
+endobj
+2581 0 obj <<
+/Length 182
+/Filter /FlateDecode
+>>
+stream
+xڝ=
+@ [03(@PL!he!Vji(XQ<B! )c?!УKӐTҬkNWSt{UNyA'.I ӄ@TƷf >$-4`yjZ53 yCBE̢1,{ Cw4O
+endstream
+endobj
+2582 0 obj <<
+/Length 251
+/Filter /FlateDecode
+>>
+stream
+xUαJ@ [y#;/I`C8<8O0Ub)
+W'A,7YLNgsz*,?Wf`{%W5W%ޢRlg gl,Rcޜ5C.1y6sNú4KH9 =nNU,uJ7N TlD)bx!?n{Hv1DT7RT5 Y*qwN29"'.޽LVN%#Q a
+endstream
+endobj
+2583 0 obj <<
+/Length 214
+/Filter /FlateDecode
+>>
+stream
+xMϱJ@I&y,GHL!he!V\hy<–[;g(|,?9riU˴b^^hۑ}UMVd;z%aGvOgv ~Ll|*C>pD6aF&y+\(?6/Y g!.)ӼP &!+GeƷfkږ[/д9h}GZ'
+endstream
+endobj
+2584 0 obj <<
+/Length 196
+/Filter /FlateDecode
+>>
+stream
+xU=
+1 S h6l-,J- =x=JrşDDx3j)ƘbSָRĕ1@/9$9 15ޤ
+
+dtsVї(ksiU7ǃU)?aIb cENz'KQPO<6
+endstream
+endobj
+2585 0 obj <<
+/Length 226
+/Filter /FlateDecode
+>>
+stream
+xM1j0d0A.jh ĐPt2mI Cu4%GءDeRI|BTLo t\\>p 3u7Vg-bG}.Vw]:l#RsPI;Rz < H`х#JCs;H ehQHs&I翃edgc6/s~#Cr_ɓǃC
+endstream
+endobj
+2586 0 obj <<
+/Length 189
+/Filter /FlateDecode
+>>
+stream
+xڥͱ
+P# " *C AAM TEk(>chp~pܹC!$txC7!>+)=5( = x$"$iB
+endstream
+endobj
+2587 0 obj <<
+/Length 241
+/Filter /FlateDecode
+>>
+stream
+x]ͱJ@ba
+B4ɑ@*L!he!Vz)
+)vy}K S|30rVr%_d\ S6n^ִ(y%(Y_sFɒ2NZ2R?n-bk#3qnOdzty|.; b+z9lzH#tB8CLFZb3v]zqnwfwaoUdZ ԀT@h6
+endstream
+endobj
+2588 0 obj <<
+/Length 225
+/Filter /FlateDecode
+>>
+stream
+xMϱJAo` f^@7GV؀H"xXpBѮk#\"^r`+f?sx9/yqN^KLq;/*21N>.R]ɓZ 6_`v ̴s( EDynܠ {Ob{b8#%=i2 @'
+Tl(
+endstream
+endobj
+2589 0 obj <<
+/Length 226
+/Filter /FlateDecode
+>>
+stream
+xڝAJ1E"P uM70\+u)(B#^ XEr/p!}O:GZ9t/tM~ח7|swKㆁw84%Ж4(d͓?V'؄ !pДYP1Udm#
+u/-WM&:Q͈j6hb:Ԗ=S5P%kj4t>hBH
+endstream
+endobj
+477 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F26
+/FontMatrix [0.01004 0 0 0.01004 0 0]
+/FontBBox [ 1 -25 97 75 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 40
+/LastChar 122
+/Widths 2590 0 R
+/Encoding 2591 0 R
+/CharProcs 2592 0 R
+>> endobj
+2590 0 obj
+[39.83 39.83 0 0 29.87 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 72.38 68.55 69.7 0 66.06 0 0 0 37.53 0 0 0 87.31 0 0 0 0 71.04 54.77 0 72.38 0 0 0 0 59.75 0 0 0 0 0 0 49.79 0 0 49.79 44.81 0 44.81 49.79 29.87 0 0 24.89 0 54.77 49.79 0 0 41.08 39.83 32.36 52.28 44.81 0 0 0 39.83 ]
+endobj
+2591 0 obj <<
+/Type /Encoding
+/Differences [40/a40/a41 42/.notdef 44/a44 45/.notdef 65/a65/a66/a67 68/.notdef 69/a69 70/.notdef 73/a73 74/.notdef 77/a77 78/.notdef 82/a82/a83 84/.notdef 85/a85 86/.notdef 90/a90 91/.notdef 97/a97 98/.notdef 100/a100/a101 102/.notdef 103/a103/a104/a105 106/.notdef 108/a108 109/.notdef 110/a110/a111 112/.notdef 114/a114/a115/a116/a117/a118 119/.notdef 122/a122]
+>> endobj
+2592 0 obj <<
+/a40 2562 0 R
+/a41 2563 0 R
+/a44 2564 0 R
+/a65 2565 0 R
+/a66 2566 0 R
+/a67 2567 0 R
+/a69 2568 0 R
+/a73 2569 0 R
+/a77 2570 0 R
+/a82 2571 0 R
+/a83 2572 0 R
+/a85 2573 0 R
+/a90 2574 0 R
+/a97 2575 0 R
+/a100 2576 0 R
+/a101 2577 0 R
+/a103 2578 0 R
+/a104 2579 0 R
+/a105 2580 0 R
+/a108 2581 0 R
+/a110 2582 0 R
+/a111 2583 0 R
+/a114 2584 0 R
+/a115 2585 0 R
+/a116 2586 0 R
+/a117 2587 0 R
+/a118 2588 0 R
+/a122 2589 0 R
+>> endobj
+2593 0 obj
+[1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000]
+endobj
+2594 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+xڥ1
+@EX t$
+L!he!Vj)(rM\ ~}>wU>$]HYDQLbJX xɷH"ZMYVx@h egR4ah#Kju4ӒJ&YHrb`.j\+hcc%*t!AfM*
+endstream
+endobj
+2595 0 obj <<
+/Length 207
+/Filter /FlateDecode
+>>
+stream
+xڥ1
+@EXS 8ͮ(VbB9ZRZX&^x hec5a㣤 jtLaLbJXV oD$N8x 0lX@/C7蔻B
+endstream
+endobj
+2596 0 obj <<
+/Length 197
+/Filter /FlateDecode
+>>
+stream
+x37ճ0Q0PP5R0P05RH1*2
+(@ds<L-=\
+%E\N
+\.
+\.
+ 
+endstream
+endobj
+2597 0 obj <<
+/Length 192
+/Filter /FlateDecode
+>>
+stream
+x37ճ0Q0PP5R0P05RH1*2
+(@ds<L-=\
+%E\N
+\.
+\.
+  TJAivFN(͌nь8>f .͎f4ۡꃙÏj^;P 3 A3hڠ\\\
+endstream
+endobj
+2598 0 obj <<
+/Length 104
+/Filter /FlateDecode
+>>
+stream
+x37ճ0Q0PP52T0R
+)\\@aTr.'~% BIQi*S!BA,B08
+endstream
+endobj
+2599 0 obj <<
+/Length 116
+/Filter /FlateDecode
+>>
+stream
+x323P0P
+\@Q.}O_T.}
+endstream
+endobj
+2600 0 obj <<
+/Length 134
+/Filter /FlateDecode
+>>
+stream
+x323P0PP01P02P0TH1*24
+E,!2ɹ\N\
+\@a.}O_T.}
+endstream
+endobj
+2601 0 obj <<
+/Length 183
+/Filter /FlateDecode
+>>
+stream
+xڍN1
+@\IMK1WZYDKENvOLq/ZX2;3ɨ7PD)>%:d2 %Ө̌.U>SULMA
+endstream
+endobj
+2602 0 obj <<
+/Length 112
+/Filter /FlateDecode
+>>
+stream
+x37ճ0Q0P0U5W07T05WH1*23
+(@ds<L=\
+%E\N
+\.
+\.
+ @p
+F0(h3F+Փ+
+endstream
+endobj
+2603 0 obj <<
+/Length 136
+/Filter /FlateDecode
+>>
+stream
+x323P0PP5T02P04PH1*24(YBs< =\
+%E\N
+@QhX.O9 
+endstream
+endobj
+2604 0 obj <<
+/Length 95
+/Filter /FlateDecode
+>>
+stream
+x323P0P
+endstream
+endobj
+2605 0 obj <<
+/Length 166
+/Filter /FlateDecode
+>>
+stream
+x337U0P0U52U01Q
+-
+0\.'O.pc .}BIQi*S!BA, !',@(
+endstream
+endobj
+2606 0 obj <<
+/Length 105
+/Filter /FlateDecode
+>>
+stream
+x323P0P
+\@Q.}O_T.}
+endstream
+endobj
+2607 0 obj <<
+/Length 147
+/Filter /FlateDecode
+>>
+stream
+x323P0PP5T02P01VH1*24(As< =\
+%E\N
+@QhX.O9 Ėc L1?K` @
+endstream
+endobj
+2608 0 obj <<
+/Length 108
+/Filter /FlateDecode
+>>
+stream
+x37ճ0Q0P0U04Q07T06SH1*23
+(Ads<L=\
+%E\N
+\.
+\.
+!Jo`
+endstream
+endobj
+2609 0 obj <<
+/Length 172
+/Filter /FlateDecode
+>>
+stream
+xU˽
+P ( "ǩ rjj@fϥy)gBápe—$>%|4'2$g-?+n}NgAJYM@;V 5&#Q
+SC!6J(l@u C+st5
+endstream
+endobj
+2610 0 obj <<
+/Length 94
+/Filter /FlateDecode
+>>
+stream
+x363U0P0T0P0"CB.#3D"9ɓK?\ȌKCHx*r;8+r(D*ry(
+endstream
+endobj
+2611 0 obj <<
+/Length 172
+/Filter /FlateDecode
+>>
+stream
+xUM
+PE<H6p ^3AP0q.-%
+(@a C aDC=?4wV*n|yh'ѢIyNkzl5
+endstream
+endobj
+2612 0 obj <<
+/Length 129
+/Filter /FlateDecode
+>>
+stream
+x337U0PP05W01T03SH1*26
+(XB$s<=,=}JJS ]  b<]003g`c?0<'W 
+endstream
+endobj
+2613 0 obj <<
+/Length 141
+/Filter /FlateDecode
+>>
+stream
+x337U0P04P06U0T07TH1*2
+F\@q.}O_T.}
+endstream
+endobj
+2614 0 obj <<
+/Length 181
+/Filter /FlateDecode
+>>
+stream
+x1
+@/BnV@`
+A+ RK Er#Ep"[9-6
+:'r"qMg
+Ɂn?QVpZHKXr;V3֤rjvT ,d<[ih1 '
+%WqJ|k;pQvGƺ~J~J
+endstream
+endobj
+2615 0 obj <<
+/Length 193
+/Filter /FlateDecode
+>>
+stream
+xѱ
+0_:n#xO`Rd@+AAA(}j]Arnc6ܗ<2|Lڇ) džBnIK^nGՌ# o#6;JN-(_)/|bAU+V]U"sbh9RI+[9hJm+܇Ͽi&c|/?yJkzo
+endstream
+endobj
+2616 0 obj <<
+/Length 165
+/Filter /FlateDecode
+>>
+stream
+x3534W0P0bSCsCB.
+I;ddG&\=
+endstream
+endobj
+2617 0 obj <<
+/Length 227
+/Filter /FlateDecode
+>>
+stream
+xҿj0d0P= ";͐:v:;4$[@ŏуdPB@
+ohMgsNy#_p{F_Z퓖 skx;|]>?rFm+U%E+H>x(I L:QGӢŒJrѠj0G]rnu\dHHIoDE[UE/t<
+endstream
+endobj
+2618 0 obj <<
+/Length 257
+/Filter /FlateDecode
+>>
+stream
+xuбj0d=A-pHRB;u(@19G#d`d |' 󟖋;}O5\RQ`ȻO}c~[zIc%a,D!Q$mbG2bWh*^jL/.i
+endstream
+endobj
+2619 0 obj <<
+/Length 230
+/Filter /FlateDecode
+>>
+stream
+xڥѽ
+0
+endstream
+endobj
+2620 0 obj <<
+/Length 294
+/Filter /FlateDecode
+>>
+stream
+xڽJ@ƿ%``
+ h`xp`
+A+@--|tv)-­WXZdow*;9-8㒏 >+1*R̸*gZ֔Sz-eJ~{}ty{9+Sb
+頁Ș2ԠFJ -_5J5f҂Fvh4P"VeF T߄iӹ{ =#0s@7IMlVMts~
+endstream
+endobj
+2621 0 obj <<
+/Length 220
+/Filter /FlateDecode
+>>
+stream
+xڽ=0$N`!!U'D::htq@ZmIjlB-$CϐOj^gHs`[1e
+,_z?Kse0C (eml dE|QbM*mhVK;-Fi,IUAmluΧl.CNZ=xں%giz@6
+endstream
+endobj
+2622 0 obj <<
+/Length 202
+/Filter /FlateDecode
+>>
+stream
+xڅѽ
+0+n/ t N&X؏+blkqRv=
+(+%66l8T(ԏPL]jFyb8QbL51|=3;*X(mu }6f\-~ͽ xTk݋6o]ÖoW1\9_?D߭k
+endstream
+endobj
+2623 0 obj <<
+/Length 180
+/Filter /FlateDecode
+>>
+stream
+x3333V0P0b3 PH1*25\Dr.'~)PKW4K)YKE!P E?|@``PL1C(F
+%CA(6ŃF1dP(UPP9J>TxHJ
+endstream
+endobj
+2624 0 obj <<
+/Length 296
+/Filter /FlateDecode
+>>
+stream
+xŒj0OxܢGн@kg!M
+ԡm-@^[^[WI
+qUutqE+
+z+̟00=}c~ =T`!
+&jɤbu 
+endstream
+endobj
+2625 0 obj <<
+/Length 130
+/Filter /FlateDecode
+>>
+stream
+x373T0P0b3K3 CB.3
+%E\N
+\.
+\.
+? Ph707000c~4ȫ_4,q.WO@.
+endstream
+endobj
+2626 0 obj <<
+/Length 112
+/Filter /FlateDecode
+>>
+stream
+x3634W0P0a#3 CB.#
+endstream
+endobj
+2627 0 obj <<
+/Length 171
+/Filter /FlateDecode
+>>
+stream
+x1
+@ [~/1FJL!he!Vjuh%GL7pWjRVsȣ BRJœϲ?SVp\ؚdq$fyQ3ƴ_@ x6QjykaD D~:Vht%
+endstream
+endobj
+2628 0 obj <<
+/Length 295
+/Filter /FlateDecode
+>>
+stream
+xeұJ@ )^@>IDb<VbB29,|2IHyEqwv0Wlfl~_ڑ0)>a:q{q
+kY Ԥ/Mj[:c
+f SZ xv;]EoclZP7cC+O+h8"ΰk=8Eѳ>̡(Ɲ0M4yt^i
+endstream
+endobj
+2629 0 obj <<
+/Length 152
+/Filter /FlateDecode
+>>
+stream
+x33г4R0P0bSs3 CB.S HrW05
+endstream
+endobj
+2630 0 obj <<
+/Length 258
+/Filter /FlateDecode
+>>
+stream
+x}J1 ]
+{-(tdibVp<PYR=w[E{8SzhM $do/C2t{8\) _$CL#wQgzxK))d^1s]\)Jv
+endstream
+endobj
+2631 0 obj <<
+/Length 259
+/Filter /FlateDecode
+>>
+stream
+x]ѱJ@ Lᾁ'p<8O0)V"*+ϑ:Ygw{tx-(9bA1=3?k*hmuAoh]MN-V+rn`f \uǦxY> `=jx烷li'^ b<j#'+ J.r  kF,[mډ&ȉྴXh_ьd21-7 Dhw>8vUx谈
+endstream
+endobj
+2632 0 obj <<
+/Length 280
+/Filter /FlateDecode
+>>
+stream
+xڽn@ Ǎ2 y/D%dCJS کC!Q&<#02\M90qwYSL)ݭ(K(3SR7n oN>f3?_h/{B@J lF3@.!-@A> Aވݜ*PB
+
+`M5(QlWq2
+endstream
+endobj
+2633 0 obj <<
+/Length 184
+/Filter /FlateDecode
+>>
+stream
+x3336Q0P
+endstream
+endobj
+2634 0 obj <<
+/Length 366
+/Filter /FlateDecode
+>>
+stream
+xڽJ@ba b4x;),D)%eGouwf͝XݝG#Oj|ƱOLSs],эJS]sAFSL&*vӺ&h
+|2
+1&@4ncoIe[z YEC>Cf"h Zp f Vkm
+endstream
+endobj
+2635 0 obj <<
+/Length 252
+/Filter /FlateDecode
+>>
+stream
+xڥҽj0p [hd`e3$)C 2@!!G<z0r$|C.́t3Lp/ss̖24 3 *x|Z֘{ vp1*z&  -SCԄ%D F )G×t/i p<TR>3U?&
+w0 ,N=j7>FTҿUx4
+endstream
+endobj
+2636 0 obj <<
+/Length 289
+/Filter /FlateDecode
+>>
+stream
+xe;N@rai=`;qѰR.@T@I.J|7a҈$Ci>˳؝I}^M iI/y78K6'of֘)nb-}~|bvwE)XQd9!a"[d72
+endstream
+endobj
+2637 0 obj <<
+/Length 160
+/Filter /FlateDecode
+>>
+stream
+x3731R0P0b3s3 CB.3
+%E\N
+\.
+\.
+A70``a
+m :
+endstream
+endobj
+2638 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+xҽ
+0+!vuФZj? N⤎nBh>P</mtwsH~p\&m
+z/EMݼZPࣚHxޢ̆#B3"f7
+*8~91d plp/ër
+endstream
+endobj
+2639 0 obj <<
+/Length 280
+/Filter /FlateDecode
+>>
+stream
+xuAK0W
++<4œ`<ya)z^>Z>J](6 SR+4)U%]\KwWfp֠zyTUsG_fk*Q$͜s
+~rFX cu jY1&ANdZ0#0@c+/=lDm
+endstream
+endobj
+2640 0 obj <<
+/Length 333
+/Filter /FlateDecode
+>>
+stream
+xڍAK0
+^{6LSaNAODGaRAaԉ.x ?dJg9*9g9Цӯ'9+ezӉL/h[%=tvuLx0ȶ
+
+ `Q P{&{6Gq.L!qvNCQ&yи7<w砳$kgD3,O7y\pC^xMGZ~G
+endstream
+endobj
+2641 0 obj <<
+/Length 320
+/Filter /FlateDecode
+>>
+stream
+xeJ@ \{O`6
+9z B@=
+*zNn֞<9P)|3<=6ZS^ ~B_ԺU֪s{??Uе6Ax42,$X@9!42;dH?@-9qp(GX ^ ,#%(B°[A I0Fr': sAއEV#a9a?
+endstream
+endobj
+2642 0 obj <<
+/Length 258
+/Filter /FlateDecode
+>>
+stream
+xJ@ P<(=jsɃ
+QPsh(y#3݃HH6쟅Tg',|Vt~AO%aeIʃXSeXԷfwE%[z{o2
+#V]@"  -@2O-s^x½
+endstream
+endobj
+2643 0 obj <<
+/Length 229
+/Filter /FlateDecode
+>>
+stream
+xuϱJAba
+ yh+RPK E;1 tƽpS|?;?xžjs3TC=-r+SrgkkrKyrM͒a{ծlB-`a:`u)xuwGW2&e˯ɦnh huaǨk}
+[ bԪob"EzONoɌla
+endstream
+endobj
+2644 0 obj <<
+/Length 213
+/Filter /FlateDecode
+>>
+stream
+xѱ
+0;
+4X-P
+vtr'uTt<ZAE0ZVTtt07ܑe7&)慤 qW$&$L"n_F]$z<(1j0')QWse8qgk
+\9 ڻNir~Sϗ'>7)7&/
+endstream
+endobj
+2645 0 obj <<
+/Length 203
+/Filter /FlateDecode
+>>
+stream
+xڝ
+0OKдv vtrAPGAEA0G#8:ANȹ-Lp;"dJ Z_V[UglJ#IWc>NҽIs-0pu@܀_
+endstream
+endobj
+2646 0 obj <<
+/Length 212
+/Filter /FlateDecode
+>>
+stream
+xڽϱ0$7 x/$N$ &:9'utf,ƣ Fp $K8q
+b~bNe/DF4AFGi[?2%72byg6Nh:]hBQ֩L)϶?$nId[XmFiǞzՊuA63`
+^j
+endstream
+endobj
+2647 0 obj <<
+/Length 210
+/Filter /FlateDecode
+>>
+stream
+xu1j0g<7 41'z(S$ MHXGQ|JW\(T
+7uN3uki1}.Gq%Cf&u#U])Yϧz\R׹fi WOp_PI! I@*#f%#~,K{ǏT#,ΰq`(nY
+endstream
+endobj
+2648 0 obj <<
+/Length 156
+/Filter /FlateDecode
+>>
+stream
+x33T0P0bc3sCB.cc
+endstream
+endobj
+2649 0 obj <<
+/Length 275
+/Filter /FlateDecode
+>>
+stream
+xڝN0?+C$/~ @pKV*E"L02`ȣD<vzJ ź?}ggjNZ3zjV M^v^zxZ]辥Aw+wcQ~<«=[5=PXH ?7f,@a?Oɣ0F|
+#oD̙#P ^f\XMT2I/JMIA>`7я$7d*:}$ X
+endstream
+endobj
+2650 0 obj <<
+/Length 167
+/Filter /FlateDecode
+>>
+stream
+xα
+@ ;:'zx: 7:9:
+*:{G;s]
+PsNA^/r9E l BuL[VeTɎdÞ@`_wV| 䈚 oafaosK
+endstream
+endobj
+2651 0 obj <<
+/Length 125
+/Filter /FlateDecode
+>>
+stream
+x323P0P0b#S3sCB.#C
+@-\.
+
+endstream
+endobj
+2652 0 obj <<
+/Length 161
+/Filter /FlateDecode
+>>
+stream
+x33T0P5U52P02T03WH1*22
+(Xs<L=\
+%E\N
+\.
+\.
+ 6 !
+Ր#0$z $!03`a |\=
+endstream
+endobj
+2653 0 obj <<
+/Length 220
+/Filter /FlateDecode
+>>
+stream
+x1@`CW ,I0Q ne!V*Z'7J+)Shfe=1fOA2∇n'MxӞ#슓U|<)dg9P1csK^4Ї g Z7-Vj]p azկTP)*ܨF7́
+,a 0@ A/vP`iCiyA_
+endstream
+endobj
+2654 0 obj <<
+/Length 110
+/Filter /FlateDecode
+>>
+stream
+x323P0P0b#S3KCB.#C
+@-\.
+? C 1cqzrr
+endstream
+endobj
+2655 0 obj <<
+/Length 203
+/Filter /FlateDecode
+>>
+stream
+x=@H\@ȜM
+B0X({+ba8垫|>2Pԏ~?Ѥ$|@jRRod5Ԍ;*gX@l$u8lSyEȞn!X#xiTCƩFHjODO'0vBJ#n $"&ݏ
+endstream
+endobj
+2656 0 obj <<
+/Length 159
+/Filter /FlateDecode
+>>
+stream
+x3534W0P0bSCCB. HrW01
+endstream
+endobj
+2657 0 obj <<
+/Length 209
+/Filter /FlateDecode
+>>
+stream
+xڝ=
+@GR2MtbSZYZZ(ډr2EH|((v̛ݝGa_<I=ݗ']QAj-jUz`,
+e㋷(8!"@'-14rSjed=L A ]l V0eeǯ̬sną /Kݴ*Y+~PZ>
+endstream
+endobj
+2658 0 obj <<
+/Length 218
+/Filter /FlateDecode
+>>
+stream
+xڭн0 p[*y#4"t7p 
+}4бCHpH'n[~8{`zz9<l o5Ʉj~iVb3":beGj1gMjߚ*6
+endstream
+endobj
+2659 0 obj <<
+/Length 225
+/Filter /FlateDecode
+>>
+stream
+xڭϱjA`
+H;eTI%>:
+fsᅦ2ts.zwVlJRc铪&^}.I OIEsJՈW@w D[wS`$C F AG# nZѝtz;Ymΐ#[GGq.
+sE3:
+endstream
+endobj
+2660 0 obj <<
+/Length 144
+/Filter /FlateDecode
+>>
+stream
+x36׳4R0P0a3CB.c HrW06
+endstream
+endobj
+2661 0 obj <<
+/Length 213
+/Filter /FlateDecode
+>>
+stream
+xMͱN@б\DTd
+endstream
+endobj
+2662 0 obj <<
+/Length 160
+/Filter /FlateDecode
+>>
+stream
+x36׳4R0P0R5T06V03TH1*26P
+
+endstream
+endobj
+2663 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+x1
+@ᷤL fqC@Vb--+'Gˑ<@Ⱥ!X l3pjZ>DŽm:L#c^[z?.6 6KNJV- -reByDz 7U}`(D,uxI0nҷWR hhKo
+endstream
+endobj
+2664 0 obj <<
+/Length 202
+/Filter /FlateDecode
+>>
+stream
+x]=
+@Y6sݬ+0Z
+*ZGQr!n5|ś7ȈBR[^0$)?G19]/bLւ :c:k{
+endstream
+endobj
+2665 0 obj <<
+/Length 246
+/Filter /FlateDecode
+>>
+stream
+xeɱJ@; $p M!澀dF 1`
+A+ Bv362e]X'qι>giF'5Tkè;.:TQ݆UwG_oTZSE%yB7zȷ CD`Al`^Ѓ\F&i!Qڤ5#+]VڂQS"w)͊S28`?a
+endstream
+endobj
+2666 0 obj <<
+/Length 236
+/Filter /FlateDecode
+>>
+stream
+xMJ0?0<i+=
+ ɃzT&4G#C8򑙄ms^5rk/[C_vRR^?hߓtmGV;N~$??8th8 ňFMq
+endstream
+endobj
+2667 0 obj <<
+/Length 248
+/Filter /FlateDecode
+>>
+stream
+xeпJ@o \`^By]
+ @-G̣R^w]9 Opj8>xPS5ZOLIppu%?^^qDzŷ;JW\ׅˡ~ lr&V
+endstream
+endobj
+2668 0 obj <<
+/Length 197
+/Filter /FlateDecode
+>>
+stream
+x=ϱ
+08nzO`Z j;:9 y<JAu\h)P1+_LEEjzDj!%ob5TیU%ι"s SiƀC EOGWGR R|
+_Q+Hā T-RY_5YI#+UAHgBZ
+endstream
+endobj
+2669 0 obj <<
+/Length 207
+/Filter /FlateDecode
+>>
+stream
+xڽ
+P FҡмVn?`A'qRGE7f}>BŚނ*3$|9VuQۀ}+5͞1%kTڤ|1
+endstream
+endobj
+2670 0 obj <<
+/Length 131
+/Filter /FlateDecode
+>>
+stream
+x337U0P
+endstream
+endobj
+2671 0 obj <<
+/Length 259
+/Filter /FlateDecode
+>>
+stream
+x]J@Of!"." E0pA.Z v |˝gH0??pNNmnҮwYUϹ勧7wk"nssa q[{_AꭅBaD4%;>#p{%*édlW]HO˷df 3ÂױtK҇FoMfl=o,"E"pLΉ~WhFF*4& !3DWZnvj
+endstream
+endobj
+2672 0 obj <<
+/Length 257
+/Filter /FlateDecode
+>>
+stream
+xmJ0'y h[
+
+ 'i((ysƙ$;dfjj5u=5mMrPٿf~jg6wW`G*`
+f͡HmVJ[\8 )qYTN KJ8L3#ęgDUk-2gB8&%1Dw>vq
+endstream
+endobj
+2673 0 obj <<
+/Length 206
+/Filter /FlateDecode
+>>
+stream
+xڥj@@CkB 
+A
+GAẸMb/hffӱZ'd?$u{<l(潽x3\h*fTK</(;[ 6O} HM!8--" 1&hqN!0ghU?{MI秲e-7fK
+endstream
+endobj
+2674 0 obj <<
+/Length 238
+/Filter /FlateDecode
+>>
+stream
+xڭбJ@?4y1[8O0Z
+*ښ<>=BKD+f+.yG\4P -Kn;r׼ΥLGrSm 
+endstream
+endobj
+2675 0 obj <<
+/Length 257
+/Filter /FlateDecode
+>>
+stream
+xuпJ@o"0y!Dr1SZ) ɣQ[X2N[3.脋%?NEav \d^j??^(]_sNs0y
+5poIu~ѽv ڧ5F r
+q/oAz Fx`cο=!)a$ܠkkR:5.̈%
+endstream
+endobj
+2676 0 obj <<
+/Length 219
+/Filter /FlateDecode
+>>
+stream
+xڥJ@ Ci X/b ͡PB,M$G#xP .C3;&z8YQ<RQ\q\2rdq#VTx$ltcuZGaLڨEeT{ؚk.YjX
+-^ 
+:~wßޑ'a%=//]
+endstream
+endobj
+2677 0 obj <<
+/Length 285
+/Filter /FlateDecode
+>>
+stream
+xmN0Fȃ%/~/
+endstream
+endobj
+2678 0 obj <<
+/Length 262
+/Filter /FlateDecode
+>>
+stream
+xuJ@O};/I$7 \`
+A+ RKAE;Gˣ#L2&" _ɚ3.5%LErHk.2J__(\rNorn2
+tچpYzLG%NC:k>
+endstream
+endobj
+475 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F16
+/FontMatrix [0.01004 0 0 0.01004 0 0]
+/FontBBox [ -5 -25 98 75 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 3
+/LastChar 122
+/Widths 2679 0 R
+/Encoding 2680 0 R
+/CharProcs 2681 0 R
+>> endobj
+2679 0 obj
+[48.75 0 0 0 0 0 0 0 0 0 0 0 0 32.5 32.5 0 0 0 0 0 0 0 0 0 56.88 54.17 54.17 81.25 0 0 27.08 48.75 0 0 0 0 27.08 37.92 37.92 48.75 75.84 27.08 32.5 27.08 48.75 48.75 48.75 48.75 48.75 48.75 48.75 48.75 48.75 48.75 48.75 27.08 27.08 75.84 75.84 75.84 0 0 73.09 69.05 70.42 74.46 66.34 63.63 76.5 73.09 35.17 50.09 75.8 60.92 89.34 73.09 75.84 66.34 75.84 71.76 54.17 70.42 73.09 73.09 100.18 73.09 73.09 0 0 0 0 0 75.84 0 48.75 54.17 43.33 54.17 43.33 29.79 48.75 54.17 27.08 29.79 51.46 27.08 81.25 54.17 48.75 54.17 51.46 37.92 38.46 37.92 54.17 51.46 70.42 51.46 51.46 43.33 ]
+endobj
+2680 0 obj <<
+/Type /Encoding
+/Differences [3/a3 4/.notdef 16/a16/a17 18/.notdef 27/a27/a28/a29/a30 31/.notdef 33/a33/a34 35/.notdef 39/a39/a40/a41/a42/a43/a44/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57/a58/a59/a60/a61/a62 63/.notdef 65/a65/a66/a67/a68/a69/a70/a71/a72/a73/a74/a75/a76/a77/a78/a79/a80/a81/a82/a83/a84/a85/a86/a87/a88/a89 90/.notdef 95/a95 96/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112/a113/a114/a115/a116/a117/a118/a119/a120/a121/a122]
+>> endobj
+2681 0 obj <<
+/a3 2612 0 R
+/a16 2611 0 R
+/a17 2609 0 R
+/a27 2615 0 R
+/a28 2614 0 R
+/a29 2616 0 R
+/a30 2617 0 R
+/a33 2599 0 R
+/a34 2613 0 R
+/a39 2600 0 R
+/a40 2594 0 R
+/a41 2595 0 R
+/a42 2601 0 R
+/a43 2602 0 R
+/a44 2603 0 R
+/a45 2610 0 R
+/a46 2604 0 R
+/a47 2605 0 R
+/a48 2669 0 R
+/a49 2670 0 R
+/a50 2671 0 R
+/a51 2672 0 R
+/a52 2673 0 R
+/a53 2674 0 R
+/a54 2675 0 R
+/a55 2676 0 R
+/a56 2677 0 R
+/a57 2678 0 R
+/a58 2606 0 R
+/a59 2607 0 R
+/a60 2596 0 R
+/a61 2608 0 R
+/a62 2597 0 R
+/a65 2618 0 R
+/a66 2619 0 R
+/a67 2620 0 R
+/a68 2621 0 R
+/a69 2622 0 R
+/a70 2623 0 R
+/a71 2624 0 R
+/a72 2625 0 R
+/a73 2626 0 R
+/a74 2627 0 R
+/a75 2628 0 R
+/a76 2629 0 R
+/a77 2630 0 R
+/a78 2631 0 R
+/a79 2632 0 R
+/a80 2633 0 R
+/a81 2634 0 R
+/a82 2635 0 R
+/a83 2636 0 R
+/a84 2637 0 R
+/a85 2638 0 R
+/a86 2639 0 R
+/a87 2640 0 R
+/a88 2641 0 R
+/a89 2642 0 R
+/a95 2598 0 R
+/a97 2643 0 R
+/a98 2644 0 R
+/a99 2645 0 R
+/a100 2646 0 R
+/a101 2647 0 R
+/a102 2648 0 R
+/a103 2649 0 R
+/a104 2650 0 R
+/a105 2651 0 R
+/a106 2652 0 R
+/a107 2653 0 R
+/a108 2654 0 R
+/a109 2655 0 R
+/a110 2656 0 R
+/a111 2657 0 R
+/a112 2658 0 R
+/a113 2659 0 R
+/a114 2660 0 R
+/a115 2661 0 R
+/a116 2662 0 R
+/a117 2663 0 R
+/a118 2664 0 R
+/a119 2665 0 R
+/a120 2666 0 R
+/a121 2667 0 R
+/a122 2668 0 R
+>> endobj
+2682 0 obj <<
+/Length 157
+/Filter /FlateDecode
+>>
+stream
+x͏
+@D'l'_%r#xXiJ E;!~}VV
+endstream
+endobj
+2683 0 obj <<
+/Length 277
+/Filter /FlateDecode
+>>
+stream
+xmJ0Eo XBlN b@W.ĕt(K>PpEj9r߽I89_?|*jY:]uekVmndz-W7յk
++opd+hSFi0pnF Ⴑ@RJQS)5sf2G(ݑrv1ILJ 3y7[h qhZ{k5
+endstream
+endobj
+2684 0 obj <<
+/Length 233
+/Filter /FlateDecode
+>>
+stream
+xڝ=n@raisq:K`$\ %E*PR$JZ|̳҅Y}7>'t*D<ũ$/LJ6k36K$lʕ|n^)=B#5QPDW:%#Jc9уr4vh| }*qlz={[#3CS5=97
+endstream
+endobj
+2685 0 obj <<
+/Length 224
+/Filter /FlateDecode
+>>
+stream
+xڝ1@EPL $&ZY+h+pJ
+"θL&4ٿv<Fq0!liza zlza
+endstream
+endobj
+2686 0 obj <<
+/Length 105
+/Filter /FlateDecode
+>>
+stream
+x3634R0P
+$ɥs{IO_T.}
+endstream
+endobj
+2687 0 obj <<
+/Length 173
+/Filter /FlateDecode
+>>
+stream
+x3530T0P0S52U05P07UH1*21(s<L=@\
+%E\N
+\.
+@b<]@
+endstream
+endobj
+2688 0 obj <<
+/Length 96
+/Filter /FlateDecode
+>>
+stream
+x3636Q0P0T0P06T02WH1*2
+(XB$s<,=BIQi*S!BA,\\\
+endstream
+endobj
+2689 0 obj <<
+/Length 187
+/Filter /FlateDecode
+>>
+stream
+x3332Q0P0bSKsCB.S3
+yP:5>Փ+
+endstream
+endobj
+2690 0 obj <<
+/Length 203
+/Filter /FlateDecode
+>>
+stream
+x= 
+endstream
+endobj
+2691 0 obj <<
+/Length 291
+/Filter /FlateDecode
+>>
+stream
+xڍ1j0a  jR'YbHSB;u(ڎZڭؾI=JIqT`$/VI~k,sOxym ɓYSH{dsf=;#ҍkTNUD38L41裵>+*bT)?d C~yE}QKZq<8ZTb+Ώ1ܼn NqA(F.gEㅸ$ <AG.! P/X-{Uwʒ
+endstream
+endobj
+2692 0 obj <<
+/Length 235
+/Filter /FlateDecode
+>>
+stream
+xڥ
+@\z Z< fNSuPԹG<z]uO
+·  %-@m/7EuEV䠈}$&Y_
+endstream
+endobj
+2693 0 obj <<
+/Length 306
+/Filter /FlateDecode
+>>
+stream
+xŒ=N@ M!
+(
+F L^"$E"Q+=Lp"vz q
+endstream
+endobj
+2694 0 obj <<
+/Length 229
+/Filter /FlateDecode
+>>
+stream
+xҽ
+0-}V NlGpPz&M@ᗄ$$BgK|<p8s93d-!%_Vve9rȑx)QTŔxe4GzMa)["ei=AikLM!Ch.TC#ig^woJ-$KHWeN'Q<6?
+endstream
+endobj
+2695 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+xڍҽ
+0
+2xށc@&]CuŘPq"p3q%ѫ
+endstream
+endobj
+2696 0 obj <<
+/Length 173
+/Filter /FlateDecode
+>>
+stream
+x3731R0P0b3S3 CB.3rAɹ\N\
+f\@Q.}O_T.}
+
+endstream
+endobj
+2697 0 obj <<
+/Length 300
+/Filter /FlateDecode
+>>
+stream
+xҽN@P\2 p
+Xg"V*4Q5&*<
+ƙ`Q{,̿,OsL1Ǔ 3/)7(r^L<k^gHVAƇ k4#g̫`Id KD-XHTHQd[;'n1i/j{;_ZX\?b.
+꿫Q_%5tIs&AciUݠhNN SӤ#vPHDH&4MnLϕO!|&%Ig] r
+endstream
+endobj
+2698 0 obj <<
+/Length 121
+/Filter /FlateDecode
+>>
+stream
+xڳ03T0P0b 3 CB.s HrW0
+4n
+endstream
+endobj
+2699 0 obj <<
+/Length 104
+/Filter /FlateDecode
+>>
+stream
+x3137R0P0aK3 CB.cS
+endstream
+endobj
+2700 0 obj <<
+/Length 172
+/Filter /FlateDecode
+>>
+stream
+x35׳0S0P0V5T05R0PH1*2
+(YBds<L,=\
+%E\N
+\.
+\.
+
+0pzrr
+endstream
+endobj
+2701 0 obj <<
+/Length 290
+/Filter /FlateDecode
+>>
+stream
+xڍ=N@%[l2 G`O hL0XF[h#PRlwgv@~vvڋ_wOh8>az'vPŻPÍo>c<fcse-&Uh4 *6]E)>eF4BHn,
+!QiADIT!Iޛ=ܲ
+EsgY}/+̳
+Lq+qaNXp\$FkU_*K١UqO,-4,iTU< x
+nx?
+endstream
+endobj
+2702 0 obj <<
+/Length 149
+/Filter /FlateDecode
+>>
+stream
+x3336T0P0b3#3 CB.Ss
+endstream
+endobj
+2703 0 obj <<
+/Length 278
+/Filter /FlateDecode
+>>
+stream
+xڍMJ0.
+o Hd8]ʅjtBQ讽WM0ϼW:(yĚt+ܲfshsat}e^-o.V?^RV T+xi[D2h;
+ _Џ.#ğ
+ Gf ,D# H_W3H| gQPMAP]r:)8P]ʂiP]͂.Yc႒4<]:l_@c0ώá%
+endstream
+endobj
+2704 0 obj <<
+/Length 277
+/Filter /FlateDecode
+>>
+stream
+xm1NP!$p*l!YD
+,6Vjid;<e`Ia93o,(H~<+mTъvE-Ur+pcH[>ŲϏW,7Tc]M[
+!
+endstream
+endobj
+2705 0 obj <<
+/Length 286
+/Filter /FlateDecode
+>>
+stream
+xڽN0 sb!~U1U:H01s(};R!F:$_؎k{sqV
+xZa%>Wu
+kyzm 7,C ۻ+du쳇vι:>H%0h}GONhIl+"$>x$OA93H:7ICc0C0” d4rGZƹ3h醥A:w*8,;$qQRrWEg{ !Љ̳A:>6@ chٰu }
+endstream
+endobj
+2706 0 obj <<
+/Length 185
+/Filter /FlateDecode
+>>
+stream
+x3735V0P
+endstream
+endobj
+2707 0 obj <<
+/Length 355
+/Filter /FlateDecode
+>>
+stream
+xڽN0t%o @F `b@L
+endstream
+endobj
+2708 0 obj <<
+/Length 251
+/Filter /FlateDecode
+>>
+stream
+xڭ1n0: w֠4YDH!d̐h9
+G`j1RaKd}22yPD zIP"eDݓ̛ ŖdbQQdoiSEN܍WƩuJ3dkYAW
+fuM<7'Mn݀ASwMR
+\So'%uvrCh2<>\+#_2ocibBר?i h
+endstream
+endobj
+2709 0 obj <<
+/Length 305
+/Filter /FlateDecode
+>>
+stream
+xmJPO"pyfaa]Vbv ɣQ)#\83w.x9zuhI5t^Sҽj-%]2on۸+n$>?^];z,i<H90w{1c]< h=Q=6 zh,݌$d1b׆ا#XA}ăiM֩S-dpAí$ r0cGݑ"y*\'5 К?)ԜhVVQnܽ
+endstream
+endobj
+2710 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+x37׳4T0P0bs3sCB.3K
+endstream
+endobj
+2711 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+x=
+@G, &"),J--mMQ<BJVof[LvD|K''a,E0} c(b3&pڲ̆2H*U}K j_O?J%M~ r*jB!iNRP3^KJU%rTVSZ,ierժ!ܕ,3Ƿ
+endstream
+endobj
+2712 0 obj <<
+/Length 302
+/Filter /FlateDecode
+>>
+stream
+xڍнJ@ )n^@q 'B
+RK E.f{tצ"dUCP#,6?;>A
+'pA~
+3dY/J OurEuR^N7d w\(P?REx:
+ "XԲBR$jXPT舊Ib&|=v,UnX6zmY6^sDVȊ9^[q>'KMT#6QܩN(͍)]SB
+Q*41cXQ3,h
+endstream
+endobj
+2713 0 obj <<
+/Length 378
+/Filter /FlateDecode
+>>
+stream
+xڝN@!H5Z5!%5I=y0ԣ&x#:3/d-:;>Wr!O䑒J|VM(EB./kObߤDt["JbGnֺ
+endstream
+endobj
+2714 0 obj <<
+/Length 322
+/Filter /FlateDecode
+>>
+stream
+xڍN0E'Ji$ᵡ,)@T@I6 "#n0?rDǶ{'مi ?ݱ9sox?xzuYuX_.x|z}{iZ75#3\k:@@ TT9
+endstream
+endobj
+2715 0 obj <<
+/Length 251
+/Filter /FlateDecode
+>>
+stream
+xұN02D%{
+^$7jo*s0ΔwoJGmL ۇܑ"=?ԩ›<I
+endstream
+endobj
+2716 0 obj <<
+/Length 267
+/Filter /FlateDecode
+>>
+stream
+xڍѱJ@9R7p p$p`
+A+J--m<=J!e|3\{% U*4V'o{apqxjC.gU^|$_
+LTOG"'9|d@: f$j%Y#e%!-#,BW .$# 䄔;Y"Hg3xF^Blqb kmCSlʤ*)Y$%ˤKJvIɼtys>|^&
+endstream
+endobj
+2717 0 obj <<
+/Length 232
+/Filter /FlateDecode
+>>
+stream
+x}ϽN0<D%{p" H01 &`
+endstream
+endobj
+2718 0 obj <<
+/Length 229
+/Filter /FlateDecode
+>>
+stream
+xő;
+@72M4(
+CJhVʷ3Fip
+endstream
+endobj
+2719 0 obj <<
+/Length 214
+/Filter /FlateDecode
+>>
+stream
+xڭ1
+@E'l&G\@7E1#BBBQRgEv>'S &3!3c4#NqRdn uS:]L
+endstream
+endobj
+2720 0 obj <<
+/Length 221
+/Filter /FlateDecode
+>>
+stream
+x1
+0yд*N`A'qRGEx 7бC=q(8 vي1&]lwqy,N1y 6n_pa8<C˯d+< >&:2)љBztUUN+IZ^>j$qIMMR'*mse cL@I
+9Lwni
+endstream
+endobj
+2721 0 obj <<
+/Length 226
+/Filter /FlateDecode
+>>
+stream
+xu=n@gbi|eYGH@TDjh> X
+VyyD%JC80/*v[ dvջ\/_Gvxv+١hJʞ2Ն(W FOFFl@&%`}b
+zdeL,>2~dgygL[41Ƕ hKyJ BasQ D
+endstream
+endobj
+2722 0 obj <<
+/Length 167
+/Filter /FlateDecode
+>>
+stream
+x3632V0P
+endstream
+endobj
+2723 0 obj <<
+/Length 281
+/Filter /FlateDecode
+>>
+stream
+xڕ=N0’!sHE"T
+()@`)<؋$'{Iן5-5tA-ukZw75oZOv3RpC/^Rk-=ԣ/qZqg XxqdWjIpnIUi+W%KK"5-C
+k΢SvYlK S^`%*#G4dPɲ1:^.eiiC%>+^ ~
+endstream
+endobj
+2724 0 obj <<
+/Length 167
+/Filter /FlateDecode
+>>
+stream
+x3332Q0P
+endstream
+endobj
+2725 0 obj <<
+/Length 131
+/Filter /FlateDecode
+>>
+stream
+x3634R0P0b#KsCB.#
+%E\N
+\.
+\.
+ 5 7?
+endstream
+endobj
+2726 0 obj <<
+/Length 186
+/Filter /FlateDecode
+>>
+stream
+xՐ@ kH#;#q"ALD'㤎xPK~m<S
+"PcmNJf_w8cfPn)(V4+]'zNʜv=
+q.n1x<}!77AuuڤK<Ӿ+ >
+endstream
+endobj
+2727 0 obj <<
+/Length 220
+/Filter /FlateDecode
+>>
+stream
+xϱn0 HrObB*L 22*+cc" F,YϲA/~o:ϜuʰXoiTYp'3d|6dFcLxsr‘"?D+c~DRdZ+-ЭAR.Z
+endstream
+endobj
+2728 0 obj <<
+/Length 107
+/Filter /FlateDecode
+>>
+stream
+x3634R0P0bc3KCB.#S I$r9yr+r{
+endstream
+endobj
+2729 0 obj <<
+/Length 209
+/Filter /FlateDecode
+>>
+stream
+x?
+P C!;Bs_ZA,T;:9::(
+n>'GoqQzJcߗdڍZE5eujh}OSXcu4vB{%gQh@
+9T`P+XU.<S*0y1 ͟o^_'
+endstream
+endobj
+2730 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+x3332Q0P
+䃹 \.'O.pSS.}(BIQi*S!BA,C}?7
+endstream
+endobj
+2731 0 obj <<
+/Length 213
+/Filter /FlateDecode
+>>
+stream
+xڥ1
+P #B[SV N⤎h=JбC1&E\|>?dј>c
+&tA$GOX4
+"4 %]/#d5#MJ[h6%
+endstream
+endobj
+2732 0 obj <<
+/Length 227
+/Filter /FlateDecode
+>>
+stream
+xڵѱjAY,i|tNWbe!V&e-
+
+endstream
+endobj
+2733 0 obj <<
+/Length 161
+/Filter /FlateDecode
+>>
+stream
+x3137U0P0bcSCB.cK
+endstream
+endobj
+2734 0 obj <<
+/Length 223
+/Filter /FlateDecode
+>>
+stream
+xE1N@ E?b%790;"E"T
+(
+endstream
+endobj
+2735 0 obj <<
+/Length 173
+/Filter /FlateDecode
+>>
+stream
+x3135S0P0R5T0P03VH1*26
+(@ds<M=\
+%E\N
+\.
+\.
+ Xv8'=3,X w'
+
+endstream
+endobj
+2736 0 obj <<
+/Length 166
+/Filter /FlateDecode
+>>
+stream
+x+@i*6#06&$  (D@@/G[58"e9P!Zj Z)%eʡ^Rv3:N[|LuM+C]MD ! a9PIcУd/-x>o;w*!aVB78\ d
+endstream
+endobj
+2737 0 obj <<
+/Length 216
+/Filter /FlateDecode
+>>
+stream
+x}=j` `-A䳋M)PH !SڱCC
+|'ꫯo4J$QLS<Üh'+v 3v/ز^e`7O$e7e*Ɋ*#3Qs
+endstream
+endobj
+2738 0 obj <<
+/Length 276
+/Filter /FlateDecode
+>>
+stream
+xڍJ@ 970&X9z l
+o=3wR<,gN1SZqBxyy*N}8_Ӆz7\-HDHC!ڐ%ZCƫ%\:Pm)(0#tB%S@=ERPGK(b'$GWP$d9Gmj9h m@Mi^Hv:vP{*j1uE!7blEDna^ԟ(¯n 
+endstream
+endobj
+2739 0 obj <<
+/Length 234
+/Filter /FlateDecode
+>>
+stream
+x}N0(C['4R[$2 ĀlUGK$/ 0ղOeu%\s][E;jjXƇZw䟸-?_o-p НiB1
+mQ,GE!A0)29÷N3Dh
+endstream
+endobj
+2740 0 obj <<
+/Length 267
+/Filter /FlateDecode
+>>
+stream
+x}ϽJ@Rn7p h~(b`]VbB
+!y&)Sdw<d>̙SRqKu&Zso\iLs9 gRiή1笹ַRpBGn6b-eFGZ0Ucc^pG))$)Y= Ư㗥itjuGj wAlhA_Bg6UT2u2Ho^_˄>>
+endstream
+endobj
+2741 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+xmA XH0ywGAnSp,괴Py4eJ 1&20$g&{C.'8FTXi_Zk?;7T,9VTtJEͿ㖊u:*kj&D+AZ73C@.ё?|+23F%JUj=p>i05KΓ9ꓶ'-ƮoϽ#MZ'}
+endstream
+endobj
+2742 0 obj <<
+/Length 211
+/Filter /FlateDecode
+>>
+stream
+xő@ kL
+endstream
+endobj
+2743 0 obj <<
+/Length 126
+/Filter /FlateDecode
+>>
+stream
+x3530T0Pb 3SCB.c
+endstream
+endobj
+2744 0 obj <<
+/Length 266
+/Filter /FlateDecode
+>>
+stream
+xmбN0<D%?IHd@1cHG<vzwC>|G/qCyfίF0t^ߟlߣO;O$9 1!rHdڈ4f&pBl9{Ð68,ִ/vKqbҷ+tي%+NC7"EB8сVP #RI*h~j:Rᕤ[Il`Φʗ'&
+endstream
+endobj
+2745 0 obj <<
+/Length 258
+/Filter /FlateDecode
+>>
+stream
+xڅN` {@
+$g%^Ltr0NzGh<
+@= icu]RHRb)U?XHUw>5?1r~geΛ{p~z< 7g!ґRUcR;Q2QP:X Ja2m0{tƔyl[J8 XϠ-AvHxiOzMYSgčV6oGbǝ2ClčLU[ϟ]~(6?d
+endstream
+endobj
+2746 0 obj <<
+/Length 216
+/Filter /FlateDecode
+>>
+stream
+xڭбjP r7DpI *NJ'utP-4|-7_խmzޏs/{Ck#ґS]ŲdbkFR̋&1 {*|ZL4XL_m̛3ul󇚴] I@BI /s's
+endstream
+endobj
+2747 0 obj <<
+/Length 253
+/Filter /FlateDecode
+>>
+stream
+xڥ1N0 `?uGx
+endstream
+endobj
+2748 0 obj <<
+/Length 264
+/Filter /FlateDecode
+>>
+stream
+x}пJ@9Lso &p6p`
+A+ RK EGG#s&~lvf IYI)A+ A+~ub)u?{MZցٷ~sy*h[nB@""^
+endstream
+endobj
+2749 0 obj <<
+/Length 214
+/Filter /FlateDecode
+>>
+stream
+xڥ=
+@ )f.@LVbh)SuvVqvF? "j )iØ 1 Q%S:N[TِT#Zr
+@gϽiKs13޴镻pabgZ] 
+
+endstream
+endobj
+2750 0 obj <<
+/Length 290
+/Filter /FlateDecode
+>>
+stream
+xUN0D7Jɍ?!H"]Z:HPQ *
+endstream
+endobj
+2751 0 obj <<
+/Length 265
+/Filter /FlateDecode
+>>
+stream
+xڍ?J@'Xfo4 Mx>VbvBr%GHEx7I@E ! 3|b}VVRJJb%uNJ_x1,3[.neĘJ^ߟ_KApۃu9=A@u$ұ('ʕLh7XQcWv @8/N`31&BX=c˭fQ:Ń.r$c1aؘV@r&0: SYùZۙZ>mJ狖o3
+endstream
+endobj
+474 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F25
+/FontMatrix [0.01004 0 0 0.01004 0 0]
+/FontBBox [ -6 -25 114 75 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 27
+/LastChar 237
+/Widths 2752 0 R
+/Encoding 2753 0 R
+/CharProcs 2754 0 R
+>> endobj
+2752 0 obj
+[65.35 62.24 0 0 0 0 0 0 0 0 0 0 0 43.56 43.56 0 0 0 37.34 31.12 56.01 56.01 56.01 56.01 56.01 56.01 56.01 56.01 56.01 56.01 56.01 0 0 0 0 0 0 0 84.59 79.64 80.91 85.86 73.53 70.42 88.05 87.59 41.72 57.86 87.71 67.31 106.26 87.59 84.13 76.53 84.13 83.56 62.24 77.91 86.09 84.59 115.71 84.59 84.59 68.46 0 0 0 0 0 0 54.46 62.24 49.79 62.24 51.11 34.23 56.01 62.24 31.12 34.23 59.12 31.12 93.35 62.24 56.01 62.24 0 45.75 44.19 43.56 62.24 59.12 80.91 59.12 59.12 49.79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49.79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31.12 ]
+endobj
+2753 0 obj <<
+/Type /Encoding
+/Differences [27/a27/a28 29/.notdef 40/a40/a41 42/.notdef 45/a45/a46/a47/a48/a49/a50/a51/a52/a53/a54/a55/a56/a57 58/.notdef 65/a65/a66/a67/a68/a69/a70/a71/a72/a73/a74/a75/a76/a77/a78/a79/a80/a81/a82/a83/a84/a85/a86/a87/a88/a89/a90 91/.notdef 97/a97/a98/a99/a100/a101/a102/a103/a104/a105/a106/a107/a108/a109/a110/a111/a112 113/.notdef 114/a114/a115/a116/a117/a118/a119/a120/a121/a122 123/.notdef 186/a186 187/.notdef 237/a237]
+>> endobj
+2754 0 obj <<
+/a27 2690 0 R
+/a28 2689 0 R
+/a40 2684 0 R
+/a41 2685 0 R
+/a45 2688 0 R
+/a46 2686 0 R
+/a47 2687 0 R
+/a48 2742 0 R
+/a49 2743 0 R
+/a50 2744 0 R
+/a51 2745 0 R
+/a52 2746 0 R
+/a53 2747 0 R
+/a54 2748 0 R
+/a55 2749 0 R
+/a56 2750 0 R
+/a57 2751 0 R
+/a65 2691 0 R
+/a66 2692 0 R
+/a67 2693 0 R
+/a68 2694 0 R
+/a69 2695 0 R
+/a70 2696 0 R
+/a71 2697 0 R
+/a72 2698 0 R
+/a73 2699 0 R
+/a74 2700 0 R
+/a75 2701 0 R
+/a76 2702 0 R
+/a77 2703 0 R
+/a78 2704 0 R
+/a79 2705 0 R
+/a80 2706 0 R
+/a81 2707 0 R
+/a82 2708 0 R
+/a83 2709 0 R
+/a84 2710 0 R
+/a85 2711 0 R
+/a86 2712 0 R
+/a87 2713 0 R
+/a88 2714 0 R
+/a89 2715 0 R
+/a90 2716 0 R
+/a97 2717 0 R
+/a98 2718 0 R
+/a99 2719 0 R
+/a100 2720 0 R
+/a101 2721 0 R
+/a102 2722 0 R
+/a103 2723 0 R
+/a104 2724 0 R
+/a105 2725 0 R
+/a106 2726 0 R
+/a107 2727 0 R
+/a108 2728 0 R
+/a109 2729 0 R
+/a110 2730 0 R
+/a111 2731 0 R
+/a112 2732 0 R
+/a114 2733 0 R
+/a115 2734 0 R
+/a116 2735 0 R
+/a117 2736 0 R
+/a118 2737 0 R
+/a119 2738 0 R
+/a120 2739 0 R
+/a121 2740 0 R
+/a122 2741 0 R
+/a186 2683 0 R
+/a237 2682 0 R
+>> endobj
+2755 0 obj <<
+/Length 294
+/Filter /FlateDecode
+>>
+stream
+xڅJ@'Xf! .
+y)+P8Ȃ/v!?yh>6?ϖ)ϸ䣂˂ b θ:)v _5?|ysW|W޶+DtҰ!2&QM.HOJc)]O4eF`&
+endstream
+endobj
+2756 0 obj <<
+/Length 208
+/Filter /FlateDecode
+>>
+stream
+xڳ3T0PT5V0P03RH1*27P
+x` f?
+
+endstream
+endobj
+2757 0 obj <<
+/Length 201
+/Filter /FlateDecode
+>>
+stream
+xڳ3T0PT5V0P03RH1*27P
+endstream
+endobj
+2758 0 obj <<
+/Length 141
+/Filter /FlateDecode
+>>
+stream
+x363S0P04P52V
+
+endstream
+endobj
+2759 0 obj <<
+/Length 98
+/Filter /FlateDecode
+>>
+stream
+x363S0P04
+
+)\\@$2ɹ\N\@.}0PRTʥ
+endstream
+endobj
+2760 0 obj <<
+/Length 407
+/Filter /FlateDecode
+>>
+stream
+xڽJ@'aa(;AF(jsA<G!BAhhM7x!4dD.Mec'3Ͳى9HMvdcgd3?UUR\חGLMNkxh::5\+%>&j_6@.9O(زtD>3\u?ZΝ@QaXԘT$\FtLGa9j<vPYac5b$݊:"r$#%XOpn,/ XW`#i}~Ǯq￐xxFD<NYnG~qg.
+endstream
+endobj
+2761 0 obj <<
+/Length 252
+/Filter /FlateDecode
+>>
+stream
+xӱ@ a<B VC88H+.)S$$>#XZ{x(r\[g '
+DF+<ppm~
+'HRAٯw^nGn-~AEӭZ䬒u/WJmV`ܟ)HZV$& iIʰUbֲdU&yڱW'h^tfMz9t9΁Đΐ˹8k _\J}O{31<(k
+{
+endstream
+endobj
+2762 0 obj <<
+/Length 279
+/Filter /FlateDecode
+>>
+stream
+xڍAK0~ L+%x Ƀxr;
+Mhf7vӃ$QAgi_]Ǻ<Da ᾢ-=YB[iNH`4sVСb5D/{!Or~؅d[O~z*7Yz\ǬKW.(~VA+3x01+1~/3Ưv=c=zZ?-JH%+846o8n
+endstream
+endobj
+2763 0 obj <<
+/Length 316
+/Filter /FlateDecode
+>>
+stream
+xœN0 }>BЖ^*D$n@L
+endstream
+endobj
+2764 0 obj <<
+/Length 253
+/Filter /FlateDecode
+>>
+stream
+x}J0 9`^@輀e͢
+ ɃxR|<J!ƙtEYS$ClA 9:j--Wt N\h5hxmMohW7Ԣ]}KkAQFH0F=`@|(PN;)zVIǁ
+y9~QaKQR^1\yӞN; UXqF"e ΄5
+endstream
+endobj
+2765 0 obj <<
+/Length 246
+/Filter /FlateDecode
+>>
+stream
+xՐJ@'KޠI 
+ ēzTdh(y=F]lvA<yq/?;?GI%Ls>g.rS}g9+YUײݼ<-璱ZM&-W = I?(wta@.(BDa 4`j5,DeDIs_[_ +Θm$@ޑ i xu%2qi֥/+^'
+endstream
+endobj
+2766 0 obj <<
+/Length 230
+/Filter /FlateDecode
+>>
+stream
+xڭ@'l&o`MF,@S^uX`}}}+Sg6ػW33_f8'3]G4fnP)P/XF,|Q׫OQiSfN
+GMwڰMmps$r1'RVIƐ4 9{ qf"1w{4ï}fc
+endstream
+endobj
+2767 0 obj <<
+/Length 236
+/Filter /FlateDecode
+>>
+stream
+xڍбJ@H0MMa!L!heqX偊>>>–WqƋJd횳7Ӗ9wK~j镼<h=g]KLngrKnmxr@Æ[ gdc_>pGSZ֒dլMldPdg߆cl?MY'G-IXE&SbDof{ jp
+endstream
+endobj
+2768 0 obj <<
+/Length 314
+/Filter /FlateDecode
+>>
+stream
+xڝ;N0E’ { Q4DHLEJcD6)k;9>iVRVϢ.R'XQu)KR/oX_+n-DQ& ü&en[Z~
+endstream
+endobj
+2769 0 obj <<
+/Length 130
+/Filter /FlateDecode
+>>
+stream
+x363S0P0b#s CB.##
+endstream
+endobj
+2770 0 obj <<
+/Length 110
+/Filter /FlateDecode
+>>
+stream
+x363S0P0b#  cCB.#c
+endstream
+endobj
+2771 0 obj <<
+/Length 190
+/Filter /FlateDecode
+>>
+stream
+xұ
+P#tU u
+̠;55DS5h>JC-8F4$"1iw_V1Ө֔Ĩ^r;ʖS
+P ߢ109Ӄ~%8{<3
+endstream
+endobj
+2772 0 obj <<
+/Length 170
+/Filter /FlateDecode
+>>
+stream
+xϱ
+0 ): I}<JC$ (/ISbdr:fxE5.3VՖLj US]Fz&
+4_@t)IxZz]/74
+endstream
+endobj
+2773 0 obj <<
+/Length 221
+/Filter /FlateDecode
+>>
+stream
+xڭ0KHnB&N$Ltr0NUx4Gpd &&߯}j>]b UnBIJ9]! BkA > td# #
+:ګ^Ԅ/B/ (/)} f>,E,r3/FדG}oI\2i6C=,c1ҭ5yVvӲ{
+endstream
+endobj
+2774 0 obj <<
+/Length 167
+/Filter /FlateDecode
+>>
+stream
+x3132W0P0aCS#CB.c3
+?0I
+endstream
+endobj
+2775 0 obj <<
+/Length 242
+/Filter /FlateDecode
+>>
+stream
+xUαJ@YR7p4 ; BBQ8Ȁ/6e8ccwf݉JtXQhQ]X/X"Ν\Xl^bqe, z~zb}yJvC'1{<
+[tZ/s
+endstream
+endobj
+2776 0 obj <<
+/Length 168
+/Filter /FlateDecode
+>>
+stream
+x3132W0P0R5T0P07QH1*26
+(Bds<M=\
+%E\N
+\.
+\.
+ ~TBNÉzH07ȃpI("0@"
+endstream
+endobj
+2777 0 obj <<
+/Length 225
+/Filter /FlateDecode
+>>
+stream
+x͑1@EXL (HHaRK v9G$8KDK7d#ɥ!M|::xǢMSGug c4ZV~B+\ωG`2` =n@+JV3AcfhFn
+] 3
+endstream
+endobj
+2778 0 obj <<
+/Length 146
+/Filter /FlateDecode
+>>
+stream
+x35ӳ4V0P04
+
+)\\
+  ,ɥ`lΥU()*Mw
+pV0wQ6T0tQ``c
+
+endstream
+endobj
+2779 0 obj <<
+/Length 293
+/Filter /FlateDecode
+>>
+stream
+xu1J@7Lbs3'0 fWL!XEa !ser%{Fccf?df8].|iKfׅ,ӫY&Ue5y}k??_L^PK;"Jbd([TOnO:PvS2PJ ~#݅w;14ZK-~-΋3z&ۣd*ިALʯR 5
+
+Z0D+5 )) "׈k7r|,GVp(8b"U %|9|1Gla5׵3b
+endstream
+endobj
+2780 0 obj <<
+/Length 333
+/Filter /FlateDecode
+>>
+stream
+xuN0/ɋ
+`Kb_ڔ  q\ԲAOҙi:IM IS&ZѰG:<\' a C,GC6(-w)
++P gMf>LT5Pi 2.W׵O
+endstream
+endobj
+468 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F20
+/FontMatrix [0.00836 0 0 0.00836 0 0]
+/FontBBox [ 2 -25 97 84 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 44
+/LastChar 178
+/Widths 2781 0 R
+/Encoding 2782 0 R
+/CharProcs 2783 0 R
+>> endobj
+2781 0 obj
+[31.6 0 31.6 0 56.93 56.93 56.93 0 0 0 0 0 56.93 0 0 0 88.59 0 88.59 0 88.59 0 0 0 87 0 0 0 0 0 0 0 0 104.4 0 88.59 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 56.93 63.26 50.6 0 50.6 0 56.93 0 31.6 0 0 31.6 94.92 63.26 56.93 0 0 44.27 44.9 44.27 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44.9 ]
+endobj
+2782 0 obj <<
+/Type /Encoding
+/Differences [44/a44 45/.notdef 46/a46 47/.notdef 48/a48/a49/a50 51/.notdef 56/a56 57/.notdef 60/a60 61/.notdef 62/a62 63/.notdef 64/a64 65/.notdef 68/a68 69/.notdef 77/a77 78/.notdef 79/a79 80/.notdef 97/a97/a98/a99 100/.notdef 101/a101 102/.notdef 103/a103 104/.notdef 105/a105 106/.notdef 108/a108/a109/a110/a111 112/.notdef 114/a114/a115/a116 117/.notdef 178/a178]
+>> endobj
+2783 0 obj <<
+/a44 2758 0 R
+/a46 2759 0 R
+/a48 2777 0 R
+/a49 2778 0 R
+/a50 2779 0 R
+/a56 2780 0 R
+/a60 2756 0 R
+/a62 2757 0 R
+/a64 2760 0 R
+/a68 2761 0 R
+/a77 2762 0 R
+/a79 2763 0 R
+/a97 2764 0 R
+/a98 2765 0 R
+/a99 2766 0 R
+/a101 2767 0 R
+/a103 2768 0 R
+/a105 2769 0 R
+/a108 2770 0 R
+/a109 2771 0 R
+/a110 2772 0 R
+/a111 2773 0 R
+/a114 2774 0 R
+/a115 2775 0 R
+/a116 2776 0 R
+/a178 2755 0 R
+>> endobj
+2784 0 obj <<
+/Length 453
+/Filter /FlateDecode
+>>
+stream
+xJ@ 9,@i4IB1PAГ( -u&@Cfwg?INc:$dD/{,יnr.K.J}<h}}D2;W}t_~P@=um,-@@Nukcx]}Ugi|)ҍm&BNCn=GkB8[IKl;{_kFuOt^9S}Ô!8 Ak7fY.K%unA{\ NL
+endstream
+endobj
+2785 0 obj <<
+/Length 319
+/Filter /FlateDecode
+>>
+stream
+x?N@pk;'َd])L0VjiQ8%ad6lh!e\\_Tur<'4~pg_?hWP4*MPRﯟwJv7PF/T \aD?M&([}< p}oyP=fsP6YF4l:b%K%TG'Pp4gdhWAobu^!+or0bbU0m[ yblD.
+sgIY).T":"n}vs
+n z_]]
+endstream
+endobj
+2786 0 obj <<
+/Length 277
+/Filter /FlateDecode
+>>
+stream
+xڭJ0 =`^@t4T Ba]=yOQPћ}}GbLZmgCKB>8\U\IwpQP7.kW(Оq9<ޣ]^CkG +Ci!
+eWK]E
+endstream
+endobj
+2787 0 obj <<
+/Length 129
+/Filter /FlateDecode
+>>
+stream
+x353Q0P04
+
+)\\
+ !,ɥ`lΥU()*Mw
+pV0wQ6T0tQ?``a% ,@ [r
+
+endstream
+endobj
+2788 0 obj <<
+/Length 354
+/Filter /FlateDecode
+>>
+stream
+xڕJ@/ 8ONat ԩCtn
+ЋGoBx83%'tp8O='~nٻGX_3\N@_WCf7%Z##6Ћr-.*mZ[v?Hvv?ii^Mh lAz:[n>:h8>`Jv ؐ:U@"te2`aa0Ŝƀn з1 g]6r5V~Y{%9F;e;X=Ut U}2 HIS g9\/{}
+endstream
+endobj
+2789 0 obj <<
+/Length 289
+/Filter /FlateDecode
+>>
+stream
+xJ0
+%Z7z!tqKxHwSV؉}xߋr„ o<ƦP"uF?‡u |!3A1'.=UCmR*HKPuxJI?(w
+EC|w\CB桋sL
+endstream
+endobj
+2790 0 obj <<
+/Length 338
+/Filter /FlateDecode
+>>
+stream
+xڝJ0
+9ƄuA+Da H v䰉Y]Go<u|B2>آzS*5{u.xpO}|;`Z\K0LWPG6S q.>Po
+endstream
+endobj
+2791 0 obj <<
+/Length 334
+/Filter /FlateDecode
+>>
+stream
+xԱJ@]R}M2p`
+A+ RK EBHKg+ $ba#̬l 8MsL*UʷTD\,1sRJ,>^Qyno/D4;UDŧ+;f>?wbS*V H(蹮I-I26H0g,-f*XJ:
+aN‚rAꭰ읨7<SzU|InFՎCEc/7˴͒4<0Occ3
+(Btխ&^)Se
+endstream
+endobj
+2792 0 obj <<
+/Length 318
+/Filter /FlateDecode
+>>
+stream
+x1K0
+endstream
+endobj
+2793 0 obj <<
+/Length 193
+/Filter /FlateDecode
+>>
+stream
+xӱ
+0
+I]m?Oء̅ wK. Vrƫ
+yr[;cr _ d_3<iTg0
+;O53IC"Db{V%h<*mc+GS: E|0~7^G9̨HHD`c
+endstream
+endobj
+2794 0 obj <<
+/Length 229
+/Filter /FlateDecode
+>>
+stream
+xԽ
+0[|VvP N(G"fc~ H]G Gum:tqpLXc!A>ȣp#yf.9s5U)j 뻲TR(PR\̏SSz<LtVL
+endstream
+endobj
+2795 0 obj <<
+/Length 322
+/Filter /FlateDecode
+>>
+stream
+xԽJ@ #d$ǝw\<VbAhy} 82 jD vwRc1QդT<|fJnêRgPa(3|XUPUkh*II $JYI˪P?@Qn(5,Y6vG^\UG\钵aRlKLDO)^X;R:2@DޒAJ3mu[G{ǚD|HD`7#Y"'z9X!8~7R,앛|pwDp!c=KS롱*4pY
+endstream
+endobj
+2796 0 obj <<
+/Length 220
+/Filter /FlateDecode
+>>
+stream
+x1n0?`-!8Q[H$2 C @ r`@yv]kߖ<Y}M9枬7'Eْ鱜.'Yo'pE
+endstream
+endobj
+2797 0 obj <<
+/Length 286
+/Filter /FlateDecode
+>>
+stream
+xڽN0 ]u䥏P
+s;)䜔, ~8s'ڥV`jzcv [fߝ'%yAssJ`y#r؍ШC7NOTMUB 0r-uTN} ^ś ɋ
+endstream
+endobj
+2798 0 obj <<
+/Length 201
+/Filter /FlateDecode
+>>
+stream
+xѽ
+0+[CP N(GIqpӎxi'0?w%;}<
+y=q<s5-)s
+|tǜN?nЍC4,1MZ
+VU6إ'$ӆLZZ !ReM 5gɕL^sA
+endstream
+endobj
+2799 0 obj <<
+/Length 215
+/Filter /FlateDecode
+>>
+stream
+xҽ
+0
+7 hjA3:9:
+*>Zɘ-tq\.OMsj7m9{P [R+D6ydbFel8G6F1&qy}ó-5i(KwEj1ob5+
+endstream
+endobj
+2800 0 obj <<
+/Length 306
+/Filter /FlateDecode
+>>
+stream
+x픿N@BA2 
+y&RheaR+h}h<=%aف3|,2_RB],XQ%=晩&fƏgr>^1^_SRJXm
+O AWޡ|)ѧabnQ~ΐ#|77|@F>P<_.q.S\Ft
+endstream
+endobj
+2801 0 obj <<
+/Length 162
+/Filter /FlateDecode
+>>
+stream
+x333R0P04f
+
+)\\@0,ɥ`jȥU()*Mw
+pV
+(Dury(0001PudPJBS?9BR)Ȕ 
+endstream
+endobj
+2802 0 obj <<
+/Length 363
+/Filter /FlateDecode
+>>
+stream
+xJ1){X%/ n^@b[A
+A'"QH=H7GGƙL
+؃WN&dUC\ 3n{zRwj45E^ިO痪L ʙGgaEdfrZ,oPw$>me{Q`2
+Xg b&b/Y`ccgXK)_Cy$8o<oeyph? mm*2[ц[_b{4t~avj T_DbnAx{nF8Ա ͛vУuH\\c]Ǹuk>gK:% |/@R(R܊oeM
+endstream
+endobj
+2803 0 obj <<
+/Length 468
+/Filter /FlateDecode
+>>
+stream
+xڕN@ /!-y4ڊJȀbFlUsk"dbl/C+E}zj*lVK:eljS޸Ҕݔ{}y{4UܺLuJ);(e
+ipq:}Q)Ҕ[|̧ DaY,4< $yS[Fe9Aǵ2SrЈmeŶ*`۽XFh Є1lA_0 b@v dm5!6'cdVV ZG[˗An.Fm+ym-
+endstream
+endobj
+467 0 obj <<
+/Type /Font
+/Subtype /Type3
+/Name /F19
+/FontMatrix [0.00581 0 0 0.00581 0 0]
+/FontBBox [ 3 -2 136 121 ]
+/Resources << /ProcSet [ /PDF /ImageB ] >>
+/FirstChar 48
+/LastChar 116
+/Widths 2804 0 R
+/Encoding 2805 0 R
+/CharProcs 2806 0 R
+>> endobj
+2804 0 obj
+[79.62 79.62 0 0 0 79.62 0 0 79.62 0 0 0 0 0 0 0 0 0 0 115.03 121.64 108.35 0 0 0 57.4 0 0 0 145.95 0 0 0 0 0 0 0 119.38 0 0 0 0 0 0 0 0 0 0 0 79.62 88.47 0 88.47 0 48.63 0 88.47 0 0 84.04 0 0 88.47 79.62 0 0 61.91 0 61.91 ]
+endobj
+2805 0 obj <<
+/Type /Encoding
+/Differences [48/a48/a49 50/.notdef 53/a53 54/.notdef 56/a56 57/.notdef 67/a67/a68/a69 70/.notdef 73/a73 74/.notdef 77/a77 78/.notdef 85/a85 86/.notdef 97/a97/a98 99/.notdef 100/a100 101/.notdef 102/a102 103/.notdef 104/a104 105/.notdef 107/a107 108/.notdef 110/a110/a111 112/.notdef 114/a114 115/.notdef 116/a116]
+>> endobj
+2806 0 obj <<
+/a48 2800 0 R
+/a49 2801 0 R
+/a53 2802 0 R
+/a56 2803 0 R
+/a67 2784 0 R
+/a68 2785 0 R
+/a69 2786 0 R
+/a73 2787 0 R
+/a77 2788 0 R
+/a85 2789 0 R
+/a97 2790 0 R
+/a98 2791 0 R
+/a100 2792 0 R
+/a102 2793 0 R
+/a104 2794 0 R
+/a107 2795 0 R
+/a110 2796 0 R
+/a111 2797 0 R
+/a114 2798 0 R
+/a116 2799 0 R
+>> endobj
+2807 0 obj <<
+/Length1 1416
+/Length2 5929
+/Length3 0
+/Length 6890
+/Filter /FlateDecode
+>>
+stream
+xڍwP[5EAHQCE! JBJI Aޑ^RHw &/z?}$g>뜵U@PiSE"0"B Y XKTĄ@ Q
+aՂGqbBe/+
+Cq5[
+4P5
+s׿ H۟6BP(
+ رq E& i>3
+d癁KC侎+*<wfY}kIB_%5><[m)RyO86usͧ>ƾYU672鹤Yٸ`QE@[<Iz6bMRko'`ݎ+1{/}{P`FyLO{?KUO@<|8Ƃ-a;[Zm>F̪~՗52zDsԟGz?YIǕ,Jz6>(TxRzDPPߝ03@zI1&NЂڠJq@e!\ЌR}m#-onV<Ah7VsN|>J%o Кϔ=t,^`ʼ:)jJHDCʍ:T>K7##|3菪J$O:B~N9L7 k[fQ1&c[OƑ7r¯ɷ {5\"{_Mw8%LCeĸCB}ϼtǁ!Ac,
+*7LweQܞgʫyӻeQo%M=1Qn
+6$ `-D>Sğ#NP
+$(Rf?B
+xiwA:˦<w ?ȿ9gݜniiac"2{gLT&5r~2:6ceQMgX;䵇[~]D)X" li\|?OUl`U
+Xz{Fg;{>!l{=9(Z+˷U6s.*- R}jRmQJ71tޓ?Huz9]|Ƿ=S{T]M
+h^ yere$^1ӝ{/x>yه`ȝ+`+PFSѮ*}HY3
+"r+:t!ĥWU\B$q̱/eWjH!"xIh `)@  kU%~ffBD\& l~p>gɬ#)_~)Q&RDC~Kv
+gHU΍$uo8,+*k,5v]IMj.kDLtW.UhyV.RrnU7E )L5E Ղ]-g07ϴmэ wi._}:BiJ04\x7͓08(:cu_0],.lڤF1kZ&TحG'>nGĵ|*ى1/<TBV9vc> v0溂[tomSgNIiB HznzVXF$ID׼Ev}_{]GSM(+|w#dߜ^=.LBLªŸ|-M@4mThE v%;=
+KRv 4:&L,TmnxF@ebUn't3էx@|!s2SkǬy妘D88+Gy'*rؠ$woOi :Jd[RťӶμ.f_y 'R
+/.OcEhri].%NDttii;QOb3kPk,6<le#7芇ؐNZQ=8
+qz-:m+ܿo6\|tr$tː( b
+43{P52zRJ9
+(toy5uZ-0f$Xڷ.ԑ=7.b@H>4 [ypWk] eݲ|T; h#
+t#.f|<vpԴyV`39Y37\o{jkJKtFbl|sP*t2I]yEo-,xS d `hɶN#
+,RY n(Kj-so/MBFkRXV'ejJwPcԑRt3ތb\ 'T__g*%yI2r繖#͒veXn 'ZbnuC܂fJ0TO$*R_mb$" S |`?rv>5$N/_^/5Fy薊(p\ݱa>IrC?dh#=QGC(svhATķQ#ZaBV@+~eyc^W
+4;u7}Z2ga |[`z7F[dEÜyE7]4Cڕ&Y 9n]w8+j(ܿfMc̤&ԭ<ԹOcj x0PJ%МiO-_EqrIw",<RL95l]֏rgQB쫈 u bMn KQ.gF'E L{XP0s09 ybzb> 7+]k3cv4nV_w3fS>@%'-EZŭjk<Dqt~`ij=*BCx-ʖJw3Ь]/TEַwCJ3s9a3fou"TO~ux=
+-IFڝWq˭UTcy8uQp+7S!=GXP6ckX7eqוrNJ/ˤAM؄݄:$ Z)Qwn=qNZ̀)&ݖQٍ׳ _l<GĶWvآIHMؠײ͛~OC%k0i6c^!c`}-5[e{wɭYQ::xv~[Hk q^zy4f>wR=16@CaφEMģ47 -oyzlK(rDZ
+' ]) g,9ҵR{mmUOQ͗
+y[PAƉk5=slH[$ \
+}Nuүs5=v+Căa }_RٯU<ĽX;<5 kޟQOH,*RuT ((дQl\)h}_Y1Sc7]yNQ[F7ZdTFQzAH@ `4M,qwnXeMV)ϬQ۪gx\l,w>)Y7(OŦ0X/˃9uEIL2} +0Z%E%qÿxxjjR5YY8UijDV_˗e~- e+b#H@8U[ ,ׄ
+leE42a\rM0To+FYJ@jiA>kx]tqJ,'9Oǹ|/crj&OR>X4:nǣd^Xɘڜ ,F鲾Vٖn Ep&Q38Ξ(^oL$FM?v
+endstream
+endobj
+2808 0 obj <<
+/Type /FontDescriptor
+/FontName /BBSUPV+CMBSY10
+/Flags 4
+/FontBBox [-26 -940 1332 825]
+/Ascent 750
+/CapHeight 686
+/Descent -194
+/ItalicAngle -14
+/StemV 61
+/XHeight 444
+/CharSet (/circlecopyrt)
+/FontFile 2807 0 R
+>> endobj
+2809 0 obj <<
+/Length1 1416
+/Length2 6049
+/Length3 0
+/Length 7008
+/Filter /FlateDecode
+>>
+stream
+xڍwT6 ""UC'IwTj$RB]zUzP(ETJ˹k}Z3g3zyX@8 H
+ A AHi8,2l*B
+A88u^a<@_@EW8 #ܕPq`8)eq8 +8=8G Ǹ?) ?@Ge`@#H;8H4`
+KOs(;{' h!S$\S`
+o (/- "  Q yue5 ?2j"Q%~ \LH
+>i#/C(K > >N`!N!mՊK2wq=69ٓO>vլ:rgo{/ֱ{ 8A'.'yܞj&zdtSCdMI!ocIWmׇ$.2;Zmze:,f_?Z&Kb; }v ^L˼-~H蟢f}# G*Ϣ"zlI^z&7Tº]YԃZ-ŭu[ɝwmc_4):tL~rݧp6>}YWBLgVgPm񮑹iozCue6p>u#n:fQ>g>%gj;t\B"ݱDdJ25.wDzU/}yE
+ە&ݪ1)̢GG`WeO缕N+ط*m=-ZGTH,`kO 7ˉҿE
+T>q?DgӦ8Ӓ3V<r[l /;"LٲW,mΡ(ߕX̊fz/5nfHؘrO I.ܴj{V1!SNBϽmkN+ʮu-ZO >펱P7a\ wx8
+k m'ZPhRLQLȝ;5!͇sݘ*Zg"ñY9[/T| y2M*n?A6b;Q滓1fNW+ At7`ﷁטMzCMٓ}_3 #0P2w0+'xmr$C?j#sl^
+~3 ޲ ڢl]aey@uoH~8nynAp;[n9#Nd0FcwSndc녝R[9;/Ǚ洆yˍ
+W=VvE.9}?ݰH/*EuCpj7awozNA}!"RӢ
+?>ٷ{dv6lu
+nnd<sThBCc·{t Ey|Kܨλ-i
+O"XW;acVM?,ҧ!RNHЖRbDˆG5b{/z>&u; JwbhI]]u*jq\c#=ؙ:wRͲu 7|RSK]Ez0)[2ZAKHʥf (8 =?,fE}Kok٩ D3jOn>x,!hz?!Y(JlѲÆw(kfu*z7b`ȉ^Nuܹ6ݞNƃG} i{Y @p# ~WV7ܴxq*;
+*6cX\fƷNUr0%3+4
+IKh^X{O(i0 ML^m. P[!Ty Tur ѩr#ͳy:W|kJV#C2>~fgHh=~j>&6&ﴅ=,.-gۏǕInO*I;,ߊaa70@u|Ŝi2zݡ;`gJy_`jCc 7pCOrXwbݕI4o#./}nޕ&ͱ5法{I-jv`(iuR'I`gؚuʵB- D? jIԧuo؀
+<ʃ)'{f\t.=g#4BUa8ބN2j qdċjU2UӗBc7CTHs`3Q1/sm|BwFܥ"'%P3JGN -ew"gh$&=/ V2W+j9~$dqig(V"uV6pjիƸ+Ŧ0P=b}:*;ӣO{JXuez. p !k''?!by-6 f涪cӦWWS0TksJO(uH5+'fs3ĝ$zѼRJ4mZr{Swi߬tV)Rk}ֱNZr~#8븊IElg,o{HJSI_/ڵI^c I,kG϶]ofTV/6a4P҆8uxb% uqg%G̖&d֖ b8$N]P>D Hxn8iqwʽPKڥ́ÛB
+o{rỊ*7>/`.ܥ|YY>o>Cs
+,6Wl }+e1I2Q~wTbT:L@ui)4 yClprӯڞn"]slpYo}FsF
+dUZ70uRyܬrIq}g
+hНWcmPܘ]f:$lqZZDG~˧i.3 {EM3[֦"ת2w7Io?=wnu:!O;TdkZ,J[1KkW>w騯.܂~Z~bKʄ$M: -yϒ$Ľ%YZ,In{ۤCj,yf,vIbn+(%BFE1v ϷYתe$N_Jji$UE
+N(WĕQwxؒ~YPIVcҏu,&ݣ~G `
+6xՀQ2;}3j0Qьx8QerPs
+ " ^VSXa7׍3\ڍG{޻&-Aay/J
+6ǩڝ<_h:F[%Za&WZ74e O3V_)qcAQx{pbj<GOx#id~:#,ħxUȚ]z8޼0j"!DJi@VΚ(+gii#ZfoLH+ðk8*4n s (7# ;"dn&sH9Uw4~\:ұ4+;'3
+
+M/yZY)>zNv?bEV-l5ݑg^Iձ~/ESPZǦo]Nckg|&=}.z͜UǷYx#9i'Z|Q[0i/m>x_"Tϋ^f9Z\
+U@mI% s#ބUч|llE{I0S T@N*2)KVsw5T<F3$ݞb#e*kyAİ-Zŗš7.;ziOןI;{zibڎ㴄jSWXReB_T D-U!GSn;O$*hQhX^d&Ou7W Lݴ*:-Hy=̪>IDM&+{^DB>MyLĤ +׆%n"
+Vd)y-
+"U?Pֳ4zʇ$SQ}ɥ0E!G^T61/>}$O4 !*eIY,Q/\KlѐTM9.>1AWTZRxXY(qg*Jh/7DI7D{qŚlr;4أT5v;Kn^F2}7=)ew#.ײeTAp5.L]0w~| 3,+TCV3U&hԘK+rQ2p$Bv!`9"!PU|.C&zv;`deW{뱼i.mn| tjŐz4yx~sf#;|;bjf:dyM<gOpIy)vyqSɋ|ns/.64mV׿ʘzGũ1o u};ǣĂٕP'pu} --:iO [4ULt nYD_*-DqM38s}0_h~<<̘_> Ng8DHm]LӮk801-ܤ1H3%e~/-#AN.&2XRcwzR
+rZ2Kn*?ó8n9D4E_YIO<}wCy2n8#Ìvu湤}/rY@(vG*g|nb#Ѳbm+>b^Oxfh׸}ri_4I!κ4x&$Nw
+J.k+HM\Wٻ!kNYb$QX/ʮ%v:ٍ^K/ƈ[s#덽-ǚ&/8cφ>o$]HE#Z`V .\fuMK/Z`""UFMCC|°twF'H-ThS'VQ4eD/Ew1\ TfaahQ[{&9$Xʙ2c%#G.ԛ#~F|9ܻP*ag^k+_T͡J|~A@7֎7\<EvMr\ԁȠzT;HAwו Y\ Gk/y{sN
+X,
+
+X&3uV DxR.=hlU C2w PKAO2G}4:*W*$gsGrnm [s}RauѢ\3Xŋe;NAb\lX/
+};Z.],"|jQ28-Qi4vN\dd qb\P}Z2MAU(=^w@J큰Ʌ[  q.8kMZ15Kr~P
+endstream
+endobj
+2810 0 obj <<
+/Type /FontDescriptor
+/FontName /PBPPQD+CMMI10
+/Flags 4
+/FontBBox [-32 -250 1048 750]
+/Ascent 694
+/CapHeight 683
+/Descent -194
+/ItalicAngle -14
+/StemV 72
+/XHeight 431
+/CharSet (/mu)
+/FontFile 2809 0 R
+>> endobj
+2811 0 obj <<
+/Length1 1451
+/Length2 6304
+/Length3 0
+/Length 7291
+/Filter /FlateDecode
+>>
+stream
+xڍxT6"UzHG 齃ޤ@ $ҫ"ҋ TM@s=w<3=dTXD! ,@M
+
+px!
+`'
+g(
+sam?v8F u6c!w3p5p$wpQ@pq-\~g] $k$$`OO)N
+",NGťd ,
+bdb
+@Ypjn%MM_Fph^ ֣7q=ew/ FJKDzæQB1<m+Dp!k>ؤ]G*[xYnd"gS~1~3逝y=+f㼀oߌ5݇Ҿ,œTmKޚeyjô[J ry
+#oE Uuޜ0a}D-c0XݕbJV He 'bME!g.YgHߝr"#=n(ttH;ZIƺp[tEҘmaۏYV=B F|wN5j^t԰|!M1à ZѢLS.6Hψ5 k0F
+D4WLPD^"+>K5Bsx=nOH~( 'gY5cd]|OoaaSe;tZ=Y_8ӗ+1 V)3@hxm =yN0χv҈LoD e{\N/CK;s K]\rI^x*9
+sVHjr:"'N*hDL )Le
+=`ͅS\Gȡ+S* *v]y0+f V?W[̯+r֕oo8a iٮT)1޽eD&__7$ 9'^$yJt+i\Xeq'NoNC1ͬ
+r~с?JzUqs;]MD#yoB _k4A>#H؜9fFkCszqiIn5
+Uǧ YL/iW#ta, 
+?*oDYJ{2vE?44ODŪ_a-L} nc1=k=T\&ix4۪ վ(3 ŌE
+6>B+Jax>ь )$8Wxn7mghcUƍX5EK7?܄о& /YKL^ 3>oϽ"YBK쨫e(6,ϱi(Zmc_vkޜ
+9='yP5!=i6F:ǭ[ SxA YŨ
+yz
+nUbjCaRMf6eͲR|,gajebMEX}dL=F!<;wQu˙{*et_{T-sh')>ST?
+Z@)!~R2pj-K]Pr,>_D]<zjc|{;ɣΫ=lS>vDT#'D%dcL$mrcݚor!u)a
+5/` W8G*ED|^ƚH+='v)xd|h#?<䚴P^?}$֝a:媼i98x_t`kX2!]E.ZA2ٴ˥u9,('i\>m0Gx2(8_u>]wrcR(BQ,_xߏc #c5TЍ_f9mVlE
+7o ŭ+ͩo(F^rB%cpW䚓\=ƽOwrKvjWBŒL8@#nOR7Қ+36ߝݝf-ZxVKաFh|0rCqa\8KN,R9(JcV{ݚ҄?US{4o/<tx{B=VlR7 _ܳ
+1<ʳLǻ(Uy0 䏌j3Nn:TPqvy1mG5*i؉yC]'gh?)m8+C+3)6YxYs˩9?Yʾ:bѺ]hR3S@"1l،m-ehcyEmgK뷓65Dm>Q[,n׬gi13
+Ht՝?~TSQh ^WhTPUu7TF XşqLwfaksq'yqZG89ێ4qmƧٜ@iMڃ>&LHskV;`VBMd-h*tFj67hm%v؈ Q#3_][&?z6[Y_Gn kDawC aEC)GTK=G-ĕf*Z2R{s$GRe_Zʑz-̊&IhIGNӬ8 rCEpln4<Ua*Tq!!XE?(P'5]~B_iiᕻG'CzFiRX,%Év/ rgL32{FοoP!%i.RT\#?k<dP |]Eݱ[|s.iQ$A~vs$XzbyA9T\9&,黊/ӈ
+$ε<]͉^RINΊ Kj#QruV:?kH",|e@?V~h7joڒ1p69ƃB$Ib5nl/$?^vjhf)qPE~y/; MW:ZɹͮMXѿ^[FIgVs :}*zrKtrRZF]Yǚ*D(XGHlH4!sdf8t9&ԋMM&257 Pyؖ|2R u<s/) VJGI+o^lུ=fB*Z,& ~*ÙNFHC~`$9^: ޣh4}DgfoQD֙?9|Ph99/Ii*^Q,p=|ᒦ(~h'HN8ɰ"M{up/dwˢ
+CbҦYomN+}t@Q!wb2̠
+;|-u'
+| >?j
+Ô1ַ}chqÖ́G|GFma\ $>FV8dS$D(fUeepËo) @Z Uּfgh66n[34۸"YԌS:Dnƈ4^ReJͦ Ϊ]6W43I:^9d.1J7_7E}Kuo jXf1L0X
+gǦ[E"t?ZV%L/}@k|-:'ZR㳧[ߢ~L2xCf}>~"B GJ:EE m+xت*=$p{ uaw},bMBʰ]I<G:WyUSYL4xEOYor䩤|n`Oi$V[ŲQbOruM,GZR99R{2ƏFkzvH,Qvx^Q|vj5G0B$Ij~ֿ>I^MS;y%혩7-QU9졉
+ g]m:ҊqU?/;#
+p3];9j55u1yLV \q%<Twj7gk@W\Ӡ R(g`fb]={Tʴ8E"|Pl̥peu fDDxip I:a!]C%wjx>0aMjA(XLPE3ܞyI:"b( #(Xl5<ڞYPU~} {Y$?!$
+endstream
+endobj
+2812 0 obj <<
+/Type /FontDescriptor
+/FontName /GXOBFF+CMSY10
+/Flags 4
+/FontBBox [-29 -960 1116 775]
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/ItalicAngle -14
+/StemV 40
+/XHeight 431
+/CharSet (/arrowright/bullet/circlecopyrt)
+/FontFile 2811 0 R
+>> endobj
+2813 0 obj <<
+/Length1 1401
+/Length2 5973
+/Length3 0
+/Length 6927
+/Filter /FlateDecode
+>>
+stream
+xڍuT[6-  Ct483303t7" ȡA:$D ;Ykg߹}_.6#S!\
+
+jV2@H\pq!.?f
+L4sD`~MQX/\P8@h 9TGhG s6@Qa+\ Hhp 5XA  qpO
+o:Ra:HsKLUW${깟L1wiF%C6m!ϰx]B}'{m[0ðtZ"cD`'+-ku+-H%e ֊3 e<5ac>|A?Rmc<YgJ먔*aeOa{[V<T+IIdg|=O6]B<zYF n<z5gx9Zi#:t:[GU"'aPߴ aoXG<I@wcI,ZY#Te__#O*X%p<*nVF>w^RZD+@V;D>_b:NgY $6%.NLaEemIݫϿv܎ksz_s쿖z[8u-_^eM v )BAJ|G:?EVo*7L ̿ T] &f&'ȡ]%W$EݠQ<vA.IV͝ġb]
+2"bc~_ksMעMw}DCȢ,,U"]:u c"k1K +MpIAĝt 18ԕvr:!=6ݺ+Wo_(v)ͭTaYmf sVP$ /T%n+Xup
+[m~t)[l4DT !9Pz8R@4tKUx"q|(D3KC#ϮA]}@5B{O\RAcY`U/+q2[dCiTHݴ8}j;YaF2 ~d^xi:($숾#IrQ ~KG8 }:P-G $Zh-Yk'{`TF n|<T
+^+!;Hl~'` X5L>aljS݀'e3OيW^Hz) :!ʎpac<")59{}O:}mUs_{j"tn<f́$|.)ʟ@Жz5ЮYjrز5zuDOc&PƕD]o䏢W`Bm!-@y'Apk^>cRhΝr2QRjݝ-RwUu 5t,ϣ I'k Sj>\Tuj0KD%P46.5g=w"#?]wW'Vc3c47]?>{JtNȟ+­\_ 4Q
+]rO6l?J6~i8E]v ZJ`p(5wӁ8R,7=v՟L rrd +apa&0靑, 蟘JUM>" #2Pe9[*`BeˉbbW_Ӹre5fXl|07GKTc>,}_ZL39 a~͝UzT!2,F4$wu)Sէ*@GӣV;Ϩ9f+rvfLCz ~\l3DZ?אx^x0+ua.&w1{I—0{yjKKG#<*Gd~!YhF=Mxf#QˈR@HTC9 nlVЫ
+&v]\e6lDX/h)O35ڑ<Ɣ7dmڽܧ=z6rtJ`Ydlũ
+PZd'3}(9YEċ4cK/߾dgmd3j!. az*$1r)Scʜ=ȻH(it[̥M\UY/nd}ڄf鞾{MtTQnޭWi𦧶Xe6sΨ6J, M$*6,c1R{Y}/ma^u D#탩kWGPHi#& ݅Tgb/)rca'P@c}R&7I
+7VBElL=̯
+fQwX^탺 ܠyЧzlYf.aV )ub]^:zT7#<ִ.62ϛTa}tY_v2 FN"9)yie+Ko+f~9.+5zeCsۀ*怍9&5[4A`{ G. ưm!vx;Eq$0.7q7Έ!x
+H16w{lR}m
+_btgogJayl(?7']!K)/qH ď,MR;$mnpAZJ} j-HeցbKtbuqpn<9uGCڭI`d(ɓFB˚@XriS3{{jܐֳQ6}P
+-_FGn.{zZ'uҢ#Yv:8nj6$gŞv;E<u߼.0(g'SPpHDJ{t]i=h|v3/ x$Xwev4^6D,H
+ȬdKYEKyn`,3Mh-Je60rVT |Gr(H0&Uԏ.q2氈=|?[=ayv[rz] \6R k>QR\ݡmjწ7_n;g4UOo6 HK2SʜVpm<_m"Y _WJ9bMV"@娞6UWD
+g=x&fÀi4W4=klf><ʪyDKMzQsONENp'1&_ˆ$ЧLi]߿|q&^Hlr'Mc.N~"aZd:,|ژ!AwDrqziz;N9]drf?3%_`&^9g'\Ѝ[驃;4FBZE_0lM|P+#^h n]LB"\e\_]ʝA6ƫ˂s"jBSs9$QPdPeǜg$V qmu|H-Rh֜ LJ0#$ac?gF~D8/hU盝F}-O~xCFI=
+9:?A-C K1br|%{r:Ԫt7:0Ĺcs6»!S+4לoYO'^=V 掩ЗeoWMeյ ,GU؞,Oc6PKl)hfyT=/((Xmoi`+*CZe K+Oqi؝Rv3e;d^]wuësS_ڍw[z2 6L蛭I]TowѓBn{D5/u!jO9x$M|i"-?շů%Lv TbhbWʪ@$G C|nY.[`V
+AӟλCYXd].MyIYMv H_RtmE_t;=˵'I(
+
+VMJZ>aOpK5VGɡ7J_XS8K2w=sy=x
+J 8*O/9{[p>݇zS<h h,$\sT[>lFv"MĶPֹ/<w\C8sp OlHx3lɵa]#(E(coI=sVj7VvvoK~p{0fQ快[h|u5b|\yRF%nm"5k )7 /%-xahBP dZ(Û2hyTcÆ8R#VZ~F GiM1^1M\O뮱J#O#,tZ?[ h7][IJ'k&SkBF~^eX .Ԃ65K<}Mmvy<rj~גʁۂ$|,4 KHZe[)
+ P%$ B2=N-1h5J:!⴪6$Bl;yS,zs; /`'Z*lt<kI
+endstream
+endobj
+2814 0 obj <<
+/Type /FontDescriptor
+/FontName /AQKOUH+CMSY8
+/Flags 4
+/FontBBox [-30 -955 1185 779]
+/Ascent 750
+/CapHeight 683
+/Descent -194
+/ItalicAngle -14
+/StemV 46
+/XHeight 431
+/CharSet (/circlecopyrt)
+/FontFile 2813 0 R
+>> endobj
+2815 0 obj <<
+/Length1 1621
+/Length2 3583
+/Length3 0
+/Length 4427
+/Filter /FlateDecode
+>>
+stream
+xڭVy8}ۖ%ԭزDk3ǎ!]DE,Y/Y$!-D1(C<~qur^CQN0m'RH'0 HIl)9Z~~M Z`L 0F
+P3!
+G
+Js##r]V/B $i|&Ϡc`\`.LTBZ/' A8+ Fp@Ba #u(@o+<ܪCBMiɫWʹE6&3ǣI
+/
+/-'10VTRZN.sx]I $
+GJ^8{C{xI$Nr R
+#{t ^ =$H}tW`0
+I9GzWm[ xW:<;38bRq4L_i?ޛnaG6'3/f2 _ KhA3T鍜<2M ޙA|h
+,,BNE ǯ@$[5lI+ HLܐW?̇A&#) &Sn')] oP^Jt9M7et%!"%>7 ΞrӎZ+zW|3Ph (f,nՎh)uNAs7ƈ<r}^-3?#uoNhJr(cՖcF TW<]N>0cx=ԀM}3Mo- JM#F΀XTIgg.@ա140<o3Zo
+omڹ\y^ࢊ
+[Jo玟@Lp|YyJ4iI Yybe&Ydxu2tKslľlDÝ;z̮t
+;F*gnG )Rnư>ҬX(R|S-|B"NO"~j;dHh^
+9"<IΟ'ua1Vv܇v>v;jfl q9@ZڲNdN`yXc̡slsF9JDOAh!("':e6ZMtx0,LF2MqIA =u67*jN6-TI/UWcEyc z49P>uZwP^ Qև+2q &^Dc(m}$ҡHh}h!1;/y9Ƅ /8ſ*SW8;LQ]iHiTᖜ7dI2$`ƮA~g:kaV?iV˼Sp?tcwW~]?Vp KCe?-tkSYbcu9 vzKӎhưC[vQ}\1Ibuۄs<[/}lfdtiluZq-7:n 8ˏ IhK[/K%6LucÑM\Tdbϳfd_+` ?6ܜ=)ԒTݽYK}2azm6TGwǤ 2+*i=ict1,H
+䜔zF0n0{I5N)rgߋzΟh~^Ky{Psے|ЋIW~36cUQ_~k
+?sfx/:7 '-Rb){﹃ !Y&bևGUx*0YkH۾P`J}<)+5R<n.n
+b%CYEW4A44E|,iVQev23I%+mE6<l#_
+8 9ﭱͯАj%ATnG󑷊0G~C`m\н/d|yʸazZB|ŒtYΙ$Pdœȯh E|QKV![^l[dMe>\),̾w'c62BV.'mYFASKleV\,%g0&ƹEVcEÖ&LjҟEʧ X孜ԙ=JsOTBl9JZ~<%s5PVJ
+EKm~"z6RBW#
+K3b~e<tȌZ'=.{#6MIgϩ<mt޹rB.'wO['}X/{GK|JAƭp
+e"1r}hkziu3
+}B=A
+endstream
+endobj
+2816 0 obj <<
+/Type /FontDescriptor
+/FontName /HLHPSF+Dingbats
+/Flags 4
+/FontBBox [-1 -143 981 819]
+/Ascent 708
+/CapHeight 708
+/Descent 0
+/ItalicAngle 0
+/StemV 0
+/XHeight 400
+/CharSet (/a12/a120/a121/a122)
+/FontFile 2815 0 R
+>> endobj
+1133 0 obj <<
+/Type /Font
+/Subtype /Type1
+/BaseFont /BBSUPV+CMBSY10
+/FontDescriptor 2808 0 R
+/FirstChar 13
+/LastChar 13
+/Widths 1766 0 R
+>> endobj
+1180 0 obj <<
+/Type /Font
+/Subtype /Type1
+/BaseFont /PBPPQD+CMMI10
+/FontDescriptor 2810 0 R
+/FirstChar 22
+/LastChar 22
+/Widths 1723 0 R
+>> endobj
+476 0 obj <<
+/Type /Font
+/Subtype /Type1
+/BaseFont /GXOBFF+CMSY10
+/FontDescriptor 2812 0 R
+/FirstChar 13
+/LastChar 33
+/Widths 2593 0 R
+>> endobj
+1237 0 obj <<
+/Type /Font
+/Subtype /Type1
+/BaseFont /AQKOUH+CMSY8
+/FontDescriptor 2814 0 R
+/FirstChar 13
+/LastChar 13
+/Widths 1676 0 R
+>> endobj
+621 0 obj <<
+/Type /Font
+/Subtype /Type1
+/BaseFont /HLHPSF+Dingbats
+/FontDescriptor 2816 0 R
+/FirstChar 43
+/LastChar 174
+/Widths 2287 0 R
+>> endobj
+469 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2817 0 R
+/Kids [462 0 R 471 0 R 508 0 R 554 0 R 593 0 R 609 0 R]
+>> endobj
+625 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2817 0 R
+/Kids [614 0 R 644 0 R 654 0 R 658 0 R 663 0 R 671 0 R]
+>> endobj
+686 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2817 0 R
+/Kids [678 0 R 690 0 R 702 0 R 710 0 R 719 0 R 727 0 R]
+>> endobj
+740 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2817 0 R
+/Kids [736 0 R 754 0 R 772 0 R 783 0 R 798 0 R 809 0 R]
+>> endobj
+825 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2817 0 R
+/Kids [820 0 R 838 0 R 848 0 R 865 0 R 875 0 R 885 0 R]
+>> endobj
+904 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2817 0 R
+/Kids [897 0 R 907 0 R 919 0 R 933 0 R 946 0 R 961 0 R]
+>> endobj
+991 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2818 0 R
+/Kids [982 0 R 994 0 R 1000 0 R 1006 0 R 1011 0 R 1018 0 R]
+>> endobj
+1026 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2818 0 R
+/Kids [1023 0 R 1028 0 R 1032 0 R 1036 0 R 1040 0 R 1044 0 R]
+>> endobj
+1056 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2818 0 R
+/Kids [1049 0 R 1059 0 R 1064 0 R 1070 0 R 1075 0 R 1080 0 R]
+>> endobj
+1091 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2818 0 R
+/Kids [1086 0 R 1093 0 R 1098 0 R 1104 0 R 1113 0 R 1117 0 R]
+>> endobj
+1128 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2818 0 R
+/Kids [1122 0 R 1130 0 R 1137 0 R 1141 0 R 1145 0 R 1149 0 R]
+>> endobj
+1168 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2818 0 R
+/Kids [1162 0 R 1176 0 R 1187 0 R 1200 0 R 1212 0 R 1217 0 R]
+>> endobj
+1230 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2819 0 R
+/Kids [1227 0 R 1233 0 R 1241 0 R 1246 0 R 1251 0 R 1256 0 R]
+>> endobj
+1263 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2819 0 R
+/Kids [1260 0 R 1265 0 R 1269 0 R 1274 0 R 1279 0 R 1285 0 R]
+>> endobj
+1296 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2819 0 R
+/Kids [1292 0 R 1300 0 R 1316 0 R 1321 0 R 1325 0 R 1329 0 R]
+>> endobj
+1336 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2819 0 R
+/Kids [1333 0 R 1338 0 R 1342 0 R 1347 0 R 1351 0 R 1355 0 R]
+>> endobj
+1362 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2819 0 R
+/Kids [1359 0 R 1364 0 R 1405 0 R 1411 0 R 1415 0 R 1419 0 R]
+>> endobj
+1426 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 2819 0 R
+/Kids [1423 0 R 1428 0 R 1432 0 R 1436 0 R 1461 0 R 1466 0 R]
+>> endobj
+1509 0 obj <<
+/Type /Pages
+/Count 2
+/Parent 2820 0 R
+/Kids [1502 0 R 1532 0 R]
+>> endobj
+2817 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 2821 0 R
+/Kids [469 0 R 625 0 R 686 0 R 740 0 R 825 0 R 904 0 R]
+>> endobj
+2818 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 2821 0 R
+/Kids [991 0 R 1026 0 R 1056 0 R 1091 0 R 1128 0 R 1168 0 R]
+>> endobj
+2819 0 obj <<
+/Type /Pages
+/Count 36
+/Parent 2821 0 R
+/Kids [1230 0 R 1263 0 R 1296 0 R 1336 0 R 1362 0 R 1426 0 R]
+>> endobj
+2820 0 obj <<
+/Type /Pages
+/Count 2
+/Parent 2821 0 R
+/Kids [1509 0 R]
+>> endobj
+2821 0 obj <<
+/Type /Pages
+/Count 110
+/Kids [2817 0 R 2818 0 R 2819 0 R 2820 0 R]
+>> endobj
+2822 0 obj <<
+/Type /Outlines
+/First 3 0 R
+/Last 459 0 R
+/Count 17
+>> endobj
+459 0 obj <<
+/Title 460 0 R
+/A 457 0 R
+/Parent 2822 0 R
+/Prev 447 0 R
+>> endobj
+455 0 obj <<
+/Title 456 0 R
+/A 453 0 R
+/Parent 451 0 R
+>> endobj
+451 0 obj <<
+/Title 452 0 R
+/A 449 0 R
+/Parent 447 0 R
+/First 455 0 R
+/Last 455 0 R
+/Count -1
+>> endobj
+447 0 obj <<
+/Title 448 0 R
+/A 445 0 R
+/Parent 2822 0 R
+/Prev 443 0 R
+/Next 459 0 R
+/First 451 0 R
+/Last 451 0 R
+/Count -1
+>> endobj
+443 0 obj <<
+/Title 444 0 R
+/A 441 0 R
+/Parent 2822 0 R
+/Prev 439 0 R
+/Next 447 0 R
+>> endobj
+439 0 obj <<
+/Title 440 0 R
+/A 437 0 R
+/Parent 2822 0 R
+/Prev 423 0 R
+/Next 443 0 R
+>> endobj
+435 0 obj <<
+/Title 436 0 R
+/A 433 0 R
+/Parent 423 0 R
+/Prev 431 0 R
+>> endobj
+431 0 obj <<
+/Title 432 0 R
+/A 429 0 R
+/Parent 423 0 R
+/Prev 427 0 R
+/Next 435 0 R
+>> endobj
+427 0 obj <<
+/Title 428 0 R
+/A 425 0 R
+/Parent 423 0 R
+/Next 431 0 R
+>> endobj
+423 0 obj <<
+/Title 424 0 R
+/A 421 0 R
+/Parent 2822 0 R
+/Prev 411 0 R
+/Next 439 0 R
+/First 427 0 R
+/Last 435 0 R
+/Count -3
+>> endobj
+419 0 obj <<
+/Title 420 0 R
+/A 417 0 R
+/Parent 411 0 R
+/Prev 415 0 R
+>> endobj
+415 0 obj <<
+/Title 416 0 R
+/A 413 0 R
+/Parent 411 0 R
+/Next 419 0 R
+>> endobj
+411 0 obj <<
+/Title 412 0 R
+/A 409 0 R
+/Parent 2822 0 R
+/Prev 407 0 R
+/Next 423 0 R
+/First 415 0 R
+/Last 419 0 R
+/Count -2
+>> endobj
+407 0 obj <<
+/Title 408 0 R
+/A 405 0 R
+/Parent 2822 0 R
+/Prev 403 0 R
+/Next 411 0 R
+>> endobj
+403 0 obj <<
+/Title 404 0 R
+/A 401 0 R
+/Parent 2822 0 R
+/Prev 399 0 R
+/Next 407 0 R
+>> endobj
+399 0 obj <<
+/Title 400 0 R
+/A 397 0 R
+/Parent 2822 0 R
+/Prev 375 0 R
+/Next 403 0 R
+>> endobj
+395 0 obj <<
+/Title 396 0 R
+/A 393 0 R
+/Parent 375 0 R
+/Prev 391 0 R
+>> endobj
+391 0 obj <<
+/Title 392 0 R
+/A 389 0 R
+/Parent 375 0 R
+/Prev 387 0 R
+/Next 395 0 R
+>> endobj
+387 0 obj <<
+/Title 388 0 R
+/A 385 0 R
+/Parent 375 0 R
+/Prev 383 0 R
+/Next 391 0 R
+>> endobj
+383 0 obj <<
+/Title 384 0 R
+/A 381 0 R
+/Parent 375 0 R
+/Prev 379 0 R
+/Next 387 0 R
+>> endobj
+379 0 obj <<
+/Title 380 0 R
+/A 377 0 R
+/Parent 375 0 R
+/Next 383 0 R
+>> endobj
+375 0 obj <<
+/Title 376 0 R
+/A 373 0 R
+/Parent 2822 0 R
+/Prev 315 0 R
+/Next 399 0 R
+/First 379 0 R
+/Last 395 0 R
+/Count -5
+>> endobj
+371 0 obj <<
+/Title 372 0 R
+/A 369 0 R
+/Parent 335 0 R
+/Prev 367 0 R
+>> endobj
+367 0 obj <<
+/Title 368 0 R
+/A 365 0 R
+/Parent 335 0 R
+/Prev 363 0 R
+/Next 371 0 R
+>> endobj
+363 0 obj <<
+/Title 364 0 R
+/A 361 0 R
+/Parent 335 0 R
+/Prev 359 0 R
+/Next 367 0 R
+>> endobj
+359 0 obj <<
+/Title 360 0 R
+/A 357 0 R
+/Parent 335 0 R
+/Prev 355 0 R
+/Next 363 0 R
+>> endobj
+355 0 obj <<
+/Title 356 0 R
+/A 353 0 R
+/Parent 335 0 R
+/Prev 351 0 R
+/Next 359 0 R
+>> endobj
+351 0 obj <<
+/Title 352 0 R
+/A 349 0 R
+/Parent 335 0 R
+/Prev 347 0 R
+/Next 355 0 R
+>> endobj
+347 0 obj <<
+/Title 348 0 R
+/A 345 0 R
+/Parent 335 0 R
+/Prev 343 0 R
+/Next 351 0 R
+>> endobj
+343 0 obj <<
+/Title 344 0 R
+/A 341 0 R
+/Parent 335 0 R
+/Prev 339 0 R
+/Next 347 0 R
+>> endobj
+339 0 obj <<
+/Title 340 0 R
+/A 337 0 R
+/Parent 335 0 R
+/Next 343 0 R
+>> endobj
+335 0 obj <<
+/Title 336 0 R
+/A 333 0 R
+/Parent 315 0 R
+/Prev 331 0 R
+/First 339 0 R
+/Last 371 0 R
+/Count -9
+>> endobj
+331 0 obj <<
+/Title 332 0 R
+/A 329 0 R
+/Parent 315 0 R
+/Prev 327 0 R
+/Next 335 0 R
+>> endobj
+327 0 obj <<
+/Title 328 0 R
+/A 325 0 R
+/Parent 315 0 R
+/Prev 323 0 R
+/Next 331 0 R
+>> endobj
+323 0 obj <<
+/Title 324 0 R
+/A 321 0 R
+/Parent 315 0 R
+/Prev 319 0 R
+/Next 327 0 R
+>> endobj
+319 0 obj <<
+/Title 320 0 R
+/A 317 0 R
+/Parent 315 0 R
+/Next 323 0 R
+>> endobj
+315 0 obj <<
+/Title 316 0 R
+/A 313 0 R
+/Parent 2822 0 R
+/Prev 311 0 R
+/Next 375 0 R
+/First 319 0 R
+/Last 335 0 R
+/Count -5
+>> endobj
+311 0 obj <<
+/Title 312 0 R
+/A 309 0 R
+/Parent 2822 0 R
+/Prev 247 0 R
+/Next 315 0 R
+>> endobj
+307 0 obj <<
+/Title 308 0 R
+/A 305 0 R
+/Parent 247 0 R
+/Prev 303 0 R
+>> endobj
+303 0 obj <<
+/Title 304 0 R
+/A 301 0 R
+/Parent 247 0 R
+/Prev 299 0 R
+/Next 307 0 R
+>> endobj
+299 0 obj <<
+/Title 300 0 R
+/A 297 0 R
+/Parent 247 0 R
+/Prev 295 0 R
+/Next 303 0 R
+>> endobj
+295 0 obj <<
+/Title 296 0 R
+/A 293 0 R
+/Parent 247 0 R
+/Prev 291 0 R
+/Next 299 0 R
+>> endobj
+291 0 obj <<
+/Title 292 0 R
+/A 289 0 R
+/Parent 247 0 R
+/Prev 287 0 R
+/Next 295 0 R
+>> endobj
+287 0 obj <<
+/Title 288 0 R
+/A 285 0 R
+/Parent 247 0 R
+/Prev 283 0 R
+/Next 291 0 R
+>> endobj
+283 0 obj <<
+/Title 284 0 R
+/A 281 0 R
+/Parent 247 0 R
+/Prev 279 0 R
+/Next 287 0 R
+>> endobj
+279 0 obj <<
+/Title 280 0 R
+/A 277 0 R
+/Parent 247 0 R
+/Prev 275 0 R
+/Next 283 0 R
+>> endobj
+275 0 obj <<
+/Title 276 0 R
+/A 273 0 R
+/Parent 247 0 R
+/Prev 271 0 R
+/Next 279 0 R
+>> endobj
+271 0 obj <<
+/Title 272 0 R
+/A 269 0 R
+/Parent 247 0 R
+/Prev 267 0 R
+/Next 275 0 R
+>> endobj
+267 0 obj <<
+/Title 268 0 R
+/A 265 0 R
+/Parent 247 0 R
+/Prev 263 0 R
+/Next 271 0 R
+>> endobj
+263 0 obj <<
+/Title 264 0 R
+/A 261 0 R
+/Parent 247 0 R
+/Prev 259 0 R
+/Next 267 0 R
+>> endobj
+259 0 obj <<
+/Title 260 0 R
+/A 257 0 R
+/Parent 247 0 R
+/Prev 255 0 R
+/Next 263 0 R
+>> endobj
+255 0 obj <<
+/Title 256 0 R
+/A 253 0 R
+/Parent 247 0 R
+/Prev 251 0 R
+/Next 259 0 R
+>> endobj
+251 0 obj <<
+/Title 252 0 R
+/A 249 0 R
+/Parent 247 0 R
+/Next 255 0 R
+>> endobj
+247 0 obj <<
+/Title 248 0 R
+/A 245 0 R
+/Parent 2822 0 R
+/Prev 47 0 R
+/Next 311 0 R
+/First 251 0 R
+/Last 307 0 R
+/Count -15
+>> endobj
+243 0 obj <<
+/Title 244 0 R
+/A 241 0 R
+/Parent 47 0 R
+/Prev 159 0 R
+>> endobj
+239 0 obj <<
+/Title 240 0 R
+/A 237 0 R
+/Parent 159 0 R
+/Prev 235 0 R
+>> endobj
+235 0 obj <<
+/Title 236 0 R
+/A 233 0 R
+/Parent 159 0 R
+/Prev 231 0 R
+/Next 239 0 R
+>> endobj
+231 0 obj <<
+/Title 232 0 R
+/A 229 0 R
+/Parent 159 0 R
+/Prev 227 0 R
+/Next 235 0 R
+>> endobj
+227 0 obj <<
+/Title 228 0 R
+/A 225 0 R
+/Parent 159 0 R
+/Prev 223 0 R
+/Next 231 0 R
+>> endobj
+223 0 obj <<
+/Title 224 0 R
+/A 221 0 R
+/Parent 159 0 R
+/Prev 219 0 R
+/Next 227 0 R
+>> endobj
+219 0 obj <<
+/Title 220 0 R
+/A 217 0 R
+/Parent 159 0 R
+/Prev 215 0 R
+/Next 223 0 R
+>> endobj
+215 0 obj <<
+/Title 216 0 R
+/A 213 0 R
+/Parent 159 0 R
+/Prev 211 0 R
+/Next 219 0 R
+>> endobj
+211 0 obj <<
+/Title 212 0 R
+/A 209 0 R
+/Parent 159 0 R
+/Prev 207 0 R
+/Next 215 0 R
+>> endobj
+207 0 obj <<
+/Title 208 0 R
+/A 205 0 R
+/Parent 159 0 R
+/Prev 203 0 R
+/Next 211 0 R
+>> endobj
+203 0 obj <<
+/Title 204 0 R
+/A 201 0 R
+/Parent 159 0 R
+/Prev 199 0 R
+/Next 207 0 R
+>> endobj
+199 0 obj <<
+/Title 200 0 R
+/A 197 0 R
+/Parent 159 0 R
+/Prev 195 0 R
+/Next 203 0 R
+>> endobj
+195 0 obj <<
+/Title 196 0 R
+/A 193 0 R
+/Parent 159 0 R
+/Prev 191 0 R
+/Next 199 0 R
+>> endobj
+191 0 obj <<
+/Title 192 0 R
+/A 189 0 R
+/Parent 159 0 R
+/Prev 187 0 R
+/Next 195 0 R
+>> endobj
+187 0 obj <<
+/Title 188 0 R
+/A 185 0 R
+/Parent 159 0 R
+/Prev 183 0 R
+/Next 191 0 R
+>> endobj
+183 0 obj <<
+/Title 184 0 R
+/A 181 0 R
+/Parent 159 0 R
+/Prev 179 0 R
+/Next 187 0 R
+>> endobj
+179 0 obj <<
+/Title 180 0 R
+/A 177 0 R
+/Parent 159 0 R
+/Prev 175 0 R
+/Next 183 0 R
+>> endobj
+175 0 obj <<
+/Title 176 0 R
+/A 173 0 R
+/Parent 159 0 R
+/Prev 171 0 R
+/Next 179 0 R
+>> endobj
+171 0 obj <<
+/Title 172 0 R
+/A 169 0 R
+/Parent 159 0 R
+/Prev 167 0 R
+/Next 175 0 R
+>> endobj
+167 0 obj <<
+/Title 168 0 R
+/A 165 0 R
+/Parent 159 0 R
+/Prev 163 0 R
+/Next 171 0 R
+>> endobj
+163 0 obj <<
+/Title 164 0 R
+/A 161 0 R
+/Parent 159 0 R
+/Next 167 0 R
+>> endobj
+159 0 obj <<
+/Title 160 0 R
+/A 157 0 R
+/Parent 47 0 R
+/Prev 127 0 R
+/Next 243 0 R
+/First 163 0 R
+/Last 239 0 R
+/Count -20
+>> endobj
+155 0 obj <<
+/Title 156 0 R
+/A 153 0 R
+/Parent 127 0 R
+/Prev 151 0 R
+>> endobj
+151 0 obj <<
+/Title 152 0 R
+/A 149 0 R
+/Parent 127 0 R
+/Prev 147 0 R
+/Next 155 0 R
+>> endobj
+147 0 obj <<
+/Title 148 0 R
+/A 145 0 R
+/Parent 127 0 R
+/Prev 143 0 R
+/Next 151 0 R
+>> endobj
+143 0 obj <<
+/Title 144 0 R
+/A 141 0 R
+/Parent 127 0 R
+/Prev 139 0 R
+/Next 147 0 R
+>> endobj
+139 0 obj <<
+/Title 140 0 R
+/A 137 0 R
+/Parent 127 0 R
+/Prev 135 0 R
+/Next 143 0 R
+>> endobj
+135 0 obj <<
+/Title 136 0 R
+/A 133 0 R
+/Parent 127 0 R
+/Prev 131 0 R
+/Next 139 0 R
+>> endobj
+131 0 obj <<
+/Title 132 0 R
+/A 129 0 R
+/Parent 127 0 R
+/Next 135 0 R
+>> endobj
+127 0 obj <<
+/Title 128 0 R
+/A 125 0 R
+/Parent 47 0 R
+/Prev 107 0 R
+/Next 159 0 R
+/First 131 0 R
+/Last 155 0 R
+/Count -7
+>> endobj
+123 0 obj <<
+/Title 124 0 R
+/A 121 0 R
+/Parent 107 0 R
+/Prev 119 0 R
+>> endobj
+119 0 obj <<
+/Title 120 0 R
+/A 117 0 R
+/Parent 107 0 R
+/Prev 115 0 R
+/Next 123 0 R
+>> endobj
+115 0 obj <<
+/Title 116 0 R
+/A 113 0 R
+/Parent 107 0 R
+/Prev 111 0 R
+/Next 119 0 R
+>> endobj
+111 0 obj <<
+/Title 112 0 R
+/A 109 0 R
+/Parent 107 0 R
+/Next 115 0 R
+>> endobj
+107 0 obj <<
+/Title 108 0 R
+/A 105 0 R
+/Parent 47 0 R
+/Prev 71 0 R
+/Next 127 0 R
+/First 111 0 R
+/Last 123 0 R
+/Count -4
+>> endobj
+103 0 obj <<
+/Title 104 0 R
+/A 101 0 R
+/Parent 71 0 R
+/Prev 99 0 R
+>> endobj
+99 0 obj <<
+/Title 100 0 R
+/A 97 0 R
+/Parent 71 0 R
+/Prev 95 0 R
+/Next 103 0 R
+>> endobj
+95 0 obj <<
+/Title 96 0 R
+/A 93 0 R
+/Parent 71 0 R
+/Prev 91 0 R
+/Next 99 0 R
+>> endobj
+91 0 obj <<
+/Title 92 0 R
+/A 89 0 R
+/Parent 71 0 R
+/Prev 87 0 R
+/Next 95 0 R
+>> endobj
+87 0 obj <<
+/Title 88 0 R
+/A 85 0 R
+/Parent 71 0 R
+/Prev 83 0 R
+/Next 91 0 R
+>> endobj
+83 0 obj <<
+/Title 84 0 R
+/A 81 0 R
+/Parent 71 0 R
+/Prev 79 0 R
+/Next 87 0 R
+>> endobj
+79 0 obj <<
+/Title 80 0 R
+/A 77 0 R
+/Parent 71 0 R
+/Prev 75 0 R
+/Next 83 0 R
+>> endobj
+75 0 obj <<
+/Title 76 0 R
+/A 73 0 R
+/Parent 71 0 R
+/Next 79 0 R
+>> endobj
+71 0 obj <<
+/Title 72 0 R
+/A 69 0 R
+/Parent 47 0 R
+/Prev 51 0 R
+/Next 107 0 R
+/First 75 0 R
+/Last 103 0 R
+/Count -8
+>> endobj
+67 0 obj <<
+/Title 68 0 R
+/A 65 0 R
+/Parent 51 0 R
+/Prev 63 0 R
+>> endobj
+63 0 obj <<
+/Title 64 0 R
+/A 61 0 R
+/Parent 51 0 R
+/Prev 59 0 R
+/Next 67 0 R
+>> endobj
+59 0 obj <<
+/Title 60 0 R
+/A 57 0 R
+/Parent 51 0 R
+/Prev 55 0 R
+/Next 63 0 R
+>> endobj
+55 0 obj <<
+/Title 56 0 R
+/A 53 0 R
+/Parent 51 0 R
+/Next 59 0 R
+>> endobj
+51 0 obj <<
+/Title 52 0 R
+/A 49 0 R
+/Parent 47 0 R
+/Next 71 0 R
+/First 55 0 R
+/Last 67 0 R
+/Count -4
+>> endobj
+47 0 obj <<
+/Title 48 0 R
+/A 45 0 R
+/Parent 2822 0 R
+/Prev 35 0 R
+/Next 247 0 R
+/First 51 0 R
+/Last 243 0 R
+/Count -6
+>> endobj
+43 0 obj <<
+/Title 44 0 R
+/A 41 0 R
+/Parent 35 0 R
+/Prev 39 0 R
+>> endobj
+39 0 obj <<
+/Title 40 0 R
+/A 37 0 R
+/Parent 35 0 R
+/Next 43 0 R
+>> endobj
+35 0 obj <<
+/Title 36 0 R
+/A 33 0 R
+/Parent 2822 0 R
+/Prev 19 0 R
+/Next 47 0 R
+/First 39 0 R
+/Last 43 0 R
+/Count -2
+>> endobj
+31 0 obj <<
+/Title 32 0 R
+/A 29 0 R
+/Parent 19 0 R
+/Prev 27 0 R
+>> endobj
+27 0 obj <<
+/Title 28 0 R
+/A 25 0 R
+/Parent 19 0 R
+/Prev 23 0 R
+/Next 31 0 R
+>> endobj
+23 0 obj <<
+/Title 24 0 R
+/A 21 0 R
+/Parent 19 0 R
+/Next 27 0 R
+>> endobj
+19 0 obj <<
+/Title 20 0 R
+/A 17 0 R
+/Parent 2822 0 R
+/Prev 3 0 R
+/Next 35 0 R
+/First 23 0 R
+/Last 31 0 R
+/Count -3
+>> endobj
+15 0 obj <<
+/Title 16 0 R
+/A 13 0 R
+/Parent 3 0 R
+/Prev 11 0 R
+>> endobj
+11 0 obj <<
+/Title 12 0 R
+/A 9 0 R
+/Parent 3 0 R
+/Prev 7 0 R
+/Next 15 0 R
+>> endobj
+7 0 obj <<
+/Title 8 0 R
+/A 5 0 R
+/Parent 3 0 R
+/Next 11 0 R
+>> endobj
+3 0 obj <<
+/Title 4 0 R
+/A 1 0 R
+/Parent 2822 0 R
+/Next 19 0 R
+/First 7 0 R
+/Last 15 0 R
+/Count -3
+>> endobj
+2823 0 obj <<
+/Names [(Doc-Start) 466 0 R (Hfootnote.1) 669 0 R (Hfootnote.10) 844 0 R (Hfootnote.11) 890 0 R (Hfootnote.12) 891 0 R (Hfootnote.13) 892 0 R]
+/Limits [(Doc-Start) (Hfootnote.13)]
+>> endobj
+2824 0 obj <<
+/Names [(Hfootnote.14) 974 0 R (Hfootnote.15) 976 0 R (Hfootnote.16) 977 0 R (Hfootnote.17) 978 0 R (Hfootnote.18) 1003 0 R (Hfootnote.19) 1004 0 R]
+/Limits [(Hfootnote.14) (Hfootnote.19)]
+>> endobj
+2825 0 obj <<
+/Names [(Hfootnote.2) 732 0 R (Hfootnote.20) 1057 0 R (Hfootnote.21) 1192 0 R (Hfootnote.22) 1249 0 R (Hfootnote.3) 777 0 R (Hfootnote.4) 788 0 R]
+/Limits [(Hfootnote.2) (Hfootnote.4)]
+>> endobj
+2826 0 obj <<
+/Names [(Hfootnote.5) 802 0 R (Hfootnote.6) 803 0 R (Hfootnote.7) 804 0 R (Hfootnote.8) 805 0 R (Hfootnote.9) 843 0 R (Item.1) 620 0 R]
+/Limits [(Hfootnote.5) (Item.1)]
+>> endobj
+2827 0 obj <<
+/Names [(Item.10) 1152 0 R (Item.11) 1153 0 R (Item.12) 1154 0 R (Item.13) 1155 0 R (Item.14) 1220 0 R (Item.15) 1222 0 R]
+/Limits [(Item.10) (Item.15)]
+>> endobj
+2828 0 obj <<
+/Names [(Item.16) 1223 0 R (Item.17) 1224 0 R (Item.18) 1304 0 R (Item.19) 1305 0 R (Item.2) 622 0 R (Item.20) 1306 0 R]
+/Limits [(Item.16) (Item.20)]
+>> endobj
+2829 0 obj <<
+/Names [(Item.21) 1307 0 R (Item.22) 1308 0 R (Item.23) 1309 0 R (Item.24) 1310 0 R (Item.25) 1311 0 R (Item.26) 1312 0 R]
+/Limits [(Item.21) (Item.26)]
+>> endobj
+2830 0 obj <<
+/Names [(Item.27) 1313 0 R (Item.28) 1314 0 R (Item.3) 623 0 R (Item.4) 965 0 R (Item.5) 966 0 R (Item.6) 967 0 R]
+/Limits [(Item.27) (Item.6)]
+>> endobj
+2831 0 obj <<
+/Names [(Item.7) 969 0 R (Item.8) 970 0 R (Item.9) 971 0 R (appendix*.96) 1464 0 R (appendix*.97) 1505 0 R (appendix.A) 406 0 R]
+/Limits [(Item.7) (appendix.A)]
+>> endobj
+2832 0 obj <<
+/Names [(appendix.B) 410 0 R (appendix.C) 422 0 R (appendix.D) 438 0 R (appendix.E) 442 0 R (appendix.F) 446 0 R (appendix.G) 458 0 R]
+/Limits [(appendix.B) (appendix.G)]
+>> endobj
+2833 0 obj <<
+/Names [(chapter*.1) 512 0 R (chapter*.2) 2 0 R (chapter.1) 18 0 R (chapter.2) 34 0 R (chapter.3) 46 0 R (chapter.4) 246 0 R]
+/Limits [(chapter*.1) (chapter.4)]
+>> endobj
+2834 0 obj <<
+/Names [(chapter.5) 310 0 R (chapter.6) 314 0 R (chapter.7) 374 0 R (chapter.8) 398 0 R (chapter.9) 402 0 R (code.1) 696 0 R]
+/Limits [(chapter.5) (code.1)]
+>> endobj
+2835 0 obj <<
+/Names [(code.10) 1090 0 R (code.11) 1096 0 R (code.12) 1101 0 R (code.13) 1102 0 R (code.14) 1120 0 R (code.15) 1125 0 R]
+/Limits [(code.10) (code.15)]
+>> endobj
+2836 0 obj <<
+/Names [(code.16) 1127 0 R (code.17) 1134 0 R (code.2) 1009 0 R (code.3) 1015 0 R (code.4) 1021 0 R (code.5) 1068 0 R]
+/Limits [(code.16) (code.5)]
+>> endobj
+2837 0 obj <<
+/Names [(code.6) 1073 0 R (code.7) 1078 0 R (code.8) 1084 0 R (code.9) 1089 0 R (figure.caption.19) 695 0 R (figure.caption.20) 705 0 R]
+/Limits [(code.6) (figure.caption.20)]
+>> endobj
+2838 0 obj <<
+/Names [(figure.caption.21) 713 0 R (figure.caption.22) 722 0 R (figure.caption.23) 730 0 R (figure.caption.24) 731 0 R (figure.caption.25) 757 0 R (figure.caption.26) 758 0 R]
+/Limits [(figure.caption.21) (figure.caption.26)]
+>> endobj
+2839 0 obj <<
+/Names [(figure.caption.27) 775 0 R (figure.caption.28) 776 0 R (figure.caption.29) 786 0 R (figure.caption.30) 787 0 R (figure.caption.31) 801 0 R (figure.caption.32) 812 0 R]
+/Limits [(figure.caption.27) (figure.caption.32)]
+>> endobj
+2840 0 obj <<
+/Names [(figure.caption.33) 823 0 R (figure.caption.34) 824 0 R (figure.caption.36) 842 0 R (figure.caption.38) 852 0 R (figure.caption.39) 853 0 R (figure.caption.40) 868 0 R]
+/Limits [(figure.caption.33) (figure.caption.40)]
+>> endobj
+2841 0 obj <<
+/Names [(figure.caption.41) 869 0 R (figure.caption.42) 878 0 R (figure.caption.43) 888 0 R (figure.caption.44) 889 0 R (figure.caption.45) 900 0 R (figure.caption.50) 911 0 R]
+/Limits [(figure.caption.41) (figure.caption.50)]
+>> endobj
+2842 0 obj <<
+/Names [(figure.caption.51) 936 0 R (figure.caption.55) 949 0 R (figure.caption.58) 952 0 R (figure.caption.63) 985 0 R (figure.caption.68) 990 0 R (figure.caption.83) 1166 0 R]
+/Limits [(figure.caption.51) (figure.caption.83)]
+>> endobj
+2843 0 obj <<
+/Names [(figure.caption.84) 1167 0 R (figure.caption.85) 1179 0 R (figure.caption.86) 1181 0 R (figure.caption.87) 1182 0 R (figure.caption.88) 1190 0 R (figure.caption.89) 1191 0 R]
+/Limits [(figure.caption.84) (figure.caption.89)]
+>> endobj
+2844 0 obj <<
+/Names [(figure.caption.90) 1203 0 R (figure.caption.91) 1204 0 R (figure.caption.92) 1215 0 R (figure.caption.93) 1238 0 R (figure.caption.94) 1282 0 R (figure.caption.95) 1295 0 R]
+/Limits [(figure.caption.90) (figure.caption.95)]
+>> endobj
+2845 0 obj <<
+/Names [(page.1) 465 0 R (page.10) 660 0 R (page.100) 1413 0 R (page.101) 1417 0 R (page.102) 1421 0 R (page.103) 1425 0 R]
+/Limits [(page.1) (page.103)]
+>> endobj
+2846 0 obj <<
+/Names [(page.104) 1430 0 R (page.105) 1434 0 R (page.106) 1438 0 R (page.107) 1463 0 R (page.108) 1468 0 R (page.109) 1504 0 R]
+/Limits [(page.104) (page.109)]
+>> endobj
+2847 0 obj <<
+/Names [(page.11) 665 0 R (page.110) 1534 0 R (page.12) 673 0 R (page.13) 680 0 R (page.14) 692 0 R (page.15) 704 0 R]
+/Limits [(page.11) (page.15)]
+>> endobj
+2848 0 obj <<
+/Names [(page.16) 712 0 R (page.17) 721 0 R (page.18) 729 0 R (page.19) 738 0 R (page.2) 473 0 R (page.20) 756 0 R]
+/Limits [(page.16) (page.20)]
+>> endobj
+2849 0 obj <<
+/Names [(page.21) 774 0 R (page.22) 785 0 R (page.23) 800 0 R (page.24) 811 0 R (page.25) 822 0 R (page.26) 840 0 R]
+/Limits [(page.21) (page.26)]
+>> endobj
+2850 0 obj <<
+/Names [(page.27) 850 0 R (page.28) 867 0 R (page.29) 877 0 R (page.3) 510 0 R (page.30) 887 0 R (page.31) 899 0 R]
+/Limits [(page.27) (page.31)]
+>> endobj
+2851 0 obj <<
+/Names [(page.32) 909 0 R (page.33) 921 0 R (page.34) 935 0 R (page.35) 948 0 R (page.36) 963 0 R (page.37) 984 0 R]
+/Limits [(page.32) (page.37)]
+>> endobj
+2852 0 obj <<
+/Names [(page.38) 996 0 R (page.39) 1002 0 R (page.4) 556 0 R (page.40) 1008 0 R (page.41) 1013 0 R (page.42) 1020 0 R]
+/Limits [(page.38) (page.42)]
+>> endobj
+2853 0 obj <<
+/Names [(page.43) 1025 0 R (page.44) 1030 0 R (page.45) 1034 0 R (page.46) 1038 0 R (page.47) 1042 0 R (page.48) 1046 0 R]
+/Limits [(page.43) (page.48)]
+>> endobj
+2854 0 obj <<
+/Names [(page.49) 1051 0 R (page.5) 595 0 R (page.50) 1061 0 R (page.51) 1066 0 R (page.52) 1072 0 R (page.53) 1077 0 R]
+/Limits [(page.49) (page.53)]
+>> endobj
+2855 0 obj <<
+/Names [(page.54) 1082 0 R (page.55) 1088 0 R (page.56) 1095 0 R (page.57) 1100 0 R (page.58) 1106 0 R (page.59) 1115 0 R]
+/Limits [(page.54) (page.59)]
+>> endobj
+2856 0 obj <<
+/Names [(page.6) 611 0 R (page.60) 1119 0 R (page.61) 1124 0 R (page.62) 1132 0 R (page.63) 1139 0 R (page.64) 1143 0 R]
+/Limits [(page.6) (page.64)]
+>> endobj
+2857 0 obj <<
+/Names [(page.65) 1147 0 R (page.66) 1151 0 R (page.67) 1164 0 R (page.68) 1178 0 R (page.69) 1189 0 R (page.7) 616 0 R]
+/Limits [(page.65) (page.7)]
+>> endobj
+2858 0 obj <<
+/Names [(page.70) 1202 0 R (page.71) 1214 0 R (page.72) 1219 0 R (page.73) 1229 0 R (page.74) 1235 0 R (page.75) 1243 0 R]
+/Limits [(page.70) (page.75)]
+>> endobj
+2859 0 obj <<
+/Names [(page.76) 1248 0 R (page.77) 1253 0 R (page.78) 1258 0 R (page.79) 1262 0 R (page.8) 646 0 R (page.80) 1267 0 R]
+/Limits [(page.76) (page.80)]
+>> endobj
+2860 0 obj <<
+/Names [(page.81) 1271 0 R (page.82) 1276 0 R (page.83) 1281 0 R (page.84) 1287 0 R (page.85) 1294 0 R (page.86) 1302 0 R]
+/Limits [(page.81) (page.86)]
+>> endobj
+2861 0 obj <<
+/Names [(page.87) 1318 0 R (page.88) 1323 0 R (page.89) 1327 0 R (page.9) 656 0 R (page.90) 1331 0 R (page.91) 1335 0 R]
+/Limits [(page.87) (page.91)]
+>> endobj
+2862 0 obj <<
+/Names [(page.92) 1340 0 R (page.93) 1344 0 R (page.94) 1349 0 R (page.95) 1353 0 R (page.96) 1357 0 R (page.97) 1361 0 R]
+/Limits [(page.92) (page.97)]
+>> endobj
+2863 0 obj <<
+/Names [(page.98) 1366 0 R (page.99) 1407 0 R (section*.10) 667 0 R (section*.11) 675 0 R (section*.12) 681 0 R (section*.13) 682 0 R]
+/Limits [(page.98) (section*.13)]
+>> endobj
+2864 0 obj <<
+/Names [(section*.14) 683 0 R (section*.15) 684 0 R (section*.16) 685 0 R (section*.17) 693 0 R (section*.18) 694 0 R (section*.3) 6 0 R]
+/Limits [(section*.14) (section*.3)]
+>> endobj
+2865 0 obj <<
+/Names [(section*.4) 619 0 R (section*.46) 901 0 R (section*.47) 902 0 R (section*.48) 903 0 R (section*.49) 910 0 R (section*.5) 624 0 R]
+/Limits [(section*.4) (section*.5)]
+>> endobj
+2866 0 obj <<
+/Names [(section*.52) 937 0 R (section*.54) 939 0 R (section*.56) 950 0 R (section*.57) 951 0 R (section*.59) 964 0 R (section*.6) 10 0 R]
+/Limits [(section*.52) (section*.6)]
+>> endobj
+2867 0 obj <<
+/Names [(section*.60) 968 0 R (section*.61) 972 0 R (section*.62) 973 0 R (section*.64) 986 0 R (section*.65) 987 0 R (section*.66) 988 0 R]
+/Limits [(section*.60) (section*.66)]
+>> endobj
+2868 0 obj <<
+/Names [(section*.67) 989 0 R (section*.8) 14 0 R (section*.9) 666 0 R (section.1.1) 22 0 R (section.1.2) 26 0 R (section.1.3) 30 0 R]
+/Limits [(section*.67) (section.1.3)]
+>> endobj
+2869 0 obj <<
+/Names [(section.2.1) 38 0 R (section.2.2) 42 0 R (section.3.1) 50 0 R (section.3.2) 70 0 R (section.3.3) 106 0 R (section.3.4) 126 0 R]
+/Limits [(section.2.1) (section.3.4)]
+>> endobj
+2870 0 obj <<
+/Names [(section.3.5) 158 0 R (section.3.6) 242 0 R (section.4.1) 250 0 R (section.4.10) 286 0 R (section.4.11) 290 0 R (section.4.12) 294 0 R]
+/Limits [(section.3.5) (section.4.12)]
+>> endobj
+2871 0 obj <<
+/Names [(section.4.13) 298 0 R (section.4.14) 302 0 R (section.4.15) 306 0 R (section.4.2) 254 0 R (section.4.3) 258 0 R (section.4.4) 262 0 R]
+/Limits [(section.4.13) (section.4.4)]
+>> endobj
+2872 0 obj <<
+/Names [(section.4.5) 266 0 R (section.4.6) 270 0 R (section.4.7) 274 0 R (section.4.8) 278 0 R (section.4.9) 282 0 R (section.6.1) 318 0 R]
+/Limits [(section.4.5) (section.6.1)]
+>> endobj
+2873 0 obj <<
+/Names [(section.6.2) 322 0 R (section.6.3) 326 0 R (section.6.4) 330 0 R (section.6.5) 334 0 R (section.7.1) 378 0 R (section.7.2) 382 0 R]
+/Limits [(section.6.2) (section.7.2)]
+>> endobj
+2874 0 obj <<
+/Names [(section.7.3) 386 0 R (section.7.4) 390 0 R (section.7.5) 394 0 R (section.B.1) 414 0 R (section.B.2) 418 0 R (section.C.1) 426 0 R]
+/Limits [(section.7.3) (section.C.1)]
+>> endobj
+2875 0 obj <<
+/Names [(section.C.2) 430 0 R (section.C.3) 434 0 R (subsection.3.1.1) 54 0 R (subsection.3.1.2) 58 0 R (subsection.3.1.3) 62 0 R (subsection.3.1.4) 66 0 R]
+/Limits [(section.C.2) (subsection.3.1.4)]
+>> endobj
+2876 0 obj <<
+/Names [(subsection.3.2.1) 74 0 R (subsection.3.2.2) 78 0 R (subsection.3.2.3) 82 0 R (subsection.3.2.4) 86 0 R (subsection.3.2.5) 90 0 R (subsection.3.2.6) 94 0 R]
+/Limits [(subsection.3.2.1) (subsection.3.2.6)]
+>> endobj
+2877 0 obj <<
+/Names [(subsection.3.2.7) 98 0 R (subsection.3.2.8) 102 0 R (subsection.3.3.1) 110 0 R (subsection.3.3.2) 114 0 R (subsection.3.3.3) 118 0 R (subsection.3.3.4) 122 0 R]
+/Limits [(subsection.3.2.7) (subsection.3.3.4)]
+>> endobj
+2878 0 obj <<
+/Names [(subsection.3.4.1) 130 0 R (subsection.3.4.2) 134 0 R (subsection.3.4.3) 138 0 R (subsection.3.4.4) 142 0 R (subsection.3.4.5) 146 0 R (subsection.3.4.6) 150 0 R]
+/Limits [(subsection.3.4.1) (subsection.3.4.6)]
+>> endobj
+2879 0 obj <<
+/Names [(subsection.3.4.7) 154 0 R (subsection.3.5.1) 162 0 R (subsection.3.5.10) 198 0 R (subsection.3.5.11) 202 0 R (subsection.3.5.12) 206 0 R (subsection.3.5.13) 210 0 R]
+/Limits [(subsection.3.4.7) (subsection.3.5.13)]
+>> endobj
+2880 0 obj <<
+/Names [(subsection.3.5.14) 214 0 R (subsection.3.5.15) 218 0 R (subsection.3.5.16) 222 0 R (subsection.3.5.17) 226 0 R (subsection.3.5.18) 230 0 R (subsection.3.5.19) 234 0 R]
+/Limits [(subsection.3.5.14) (subsection.3.5.19)]
+>> endobj
+2881 0 obj <<
+/Names [(subsection.3.5.2) 166 0 R (subsection.3.5.20) 238 0 R (subsection.3.5.3) 170 0 R (subsection.3.5.4) 174 0 R (subsection.3.5.5) 178 0 R (subsection.3.5.6) 182 0 R]
+/Limits [(subsection.3.5.2) (subsection.3.5.6)]
+>> endobj
+2882 0 obj <<
+/Names [(subsection.3.5.7) 186 0 R (subsection.3.5.8) 190 0 R (subsection.3.5.9) 194 0 R (subsection.6.5.1) 338 0 R (subsection.6.5.2) 342 0 R (subsection.6.5.3) 346 0 R]
+/Limits [(subsection.3.5.7) (subsection.6.5.3)]
+>> endobj
+2883 0 obj <<
+/Names [(subsection.6.5.4) 350 0 R (subsection.6.5.5) 354 0 R (subsection.6.5.6) 358 0 R (subsection.6.5.7) 362 0 R (subsection.6.5.8) 366 0 R (subsection.6.5.9) 370 0 R]
+/Limits [(subsection.6.5.4) (subsection.6.5.9)]
+>> endobj
+2884 0 obj <<
+/Names [(subsection.F.0.1) 450 0 R (subsection.F.0.2) 454 0 R (table.3.1) 739 0 R (table.8.1) 1254 0 R (table.D.1) 1319 0 R (table.E.1) 1345 0 R]
+/Limits [(subsection.F.0.1) (table.E.1)]
+>> endobj
+2885 0 obj <<
+/Names [(table.F.1) 1408 0 R (table.F.2) 1409 0 R (table.caption.35) 841 0 R (table.caption.37) 851 0 R (table.caption.53) 938 0 R (table.caption.69) 1014 0 R]
+/Limits [(table.F.1) (table.caption.69)]
+>> endobj
+2886 0 obj <<
+/Names [(table.caption.7) 647 0 R (table.caption.70) 1016 0 R (table.caption.71) 1052 0 R (table.caption.72) 1053 0 R (table.caption.73) 1055 0 R (table.caption.74) 1062 0 R]
+/Limits [(table.caption.7) (table.caption.74)]
+>> endobj
+2887 0 obj <<
+/Names [(table.caption.75) 1067 0 R (table.caption.76) 1083 0 R (table.caption.77) 1107 0 R (table.caption.78) 1108 0 R (table.caption.79) 1109 0 R (table.caption.80) 1110 0 R]
+/Limits [(table.caption.75) (table.caption.80)]
+>> endobj
+2888 0 obj <<
+/Names [(table.caption.81) 1111 0 R (table.caption.82) 1126 0 R]
+/Limits [(table.caption.81) (table.caption.82)]
+>> endobj
+2889 0 obj <<
+/Kids [2823 0 R 2824 0 R 2825 0 R 2826 0 R 2827 0 R 2828 0 R]
+/Limits [(Doc-Start) (Item.20)]
+>> endobj
+2890 0 obj <<
+/Kids [2829 0 R 2830 0 R 2831 0 R 2832 0 R 2833 0 R 2834 0 R]
+/Limits [(Item.21) (code.1)]
+>> endobj
+2891 0 obj <<
+/Kids [2835 0 R 2836 0 R 2837 0 R 2838 0 R 2839 0 R 2840 0 R]
+/Limits [(code.10) (figure.caption.40)]
+>> endobj
+2892 0 obj <<
+/Kids [2841 0 R 2842 0 R 2843 0 R 2844 0 R 2845 0 R 2846 0 R]
+/Limits [(figure.caption.41) (page.109)]
+>> endobj
+2893 0 obj <<
+/Kids [2847 0 R 2848 0 R 2849 0 R 2850 0 R 2851 0 R 2852 0 R]
+/Limits [(page.11) (page.42)]
+>> endobj
+2894 0 obj <<
+/Kids [2853 0 R 2854 0 R 2855 0 R 2856 0 R 2857 0 R 2858 0 R]
+/Limits [(page.43) (page.75)]
+>> endobj
+2895 0 obj <<
+/Kids [2859 0 R 2860 0 R 2861 0 R 2862 0 R 2863 0 R 2864 0 R]
+/Limits [(page.76) (section*.3)]
+>> endobj
+2896 0 obj <<
+/Kids [2865 0 R 2866 0 R 2867 0 R 2868 0 R 2869 0 R 2870 0 R]
+/Limits [(section*.4) (section.4.12)]
+>> endobj
+2897 0 obj <<
+/Kids [2871 0 R 2872 0 R 2873 0 R 2874 0 R 2875 0 R 2876 0 R]
+/Limits [(section.4.13) (subsection.3.2.6)]
+>> endobj
+2898 0 obj <<
+/Kids [2877 0 R 2878 0 R 2879 0 R 2880 0 R 2881 0 R 2882 0 R]
+/Limits [(subsection.3.2.7) (subsection.6.5.3)]
+>> endobj
+2899 0 obj <<
+/Kids [2883 0 R 2884 0 R 2885 0 R 2886 0 R 2887 0 R 2888 0 R]
+/Limits [(subsection.6.5.4) (table.caption.82)]
+>> endobj
+2900 0 obj <<
+/Kids [2889 0 R 2890 0 R 2891 0 R 2892 0 R 2893 0 R 2894 0 R]
+/Limits [(Doc-Start) (page.75)]
+>> endobj
+2901 0 obj <<
+/Kids [2895 0 R 2896 0 R 2897 0 R 2898 0 R 2899 0 R]
+/Limits [(page.76) (table.caption.82)]
+>> endobj
+2902 0 obj <<
+/Kids [2900 0 R 2901 0 R]
+/Limits [(Doc-Start) (table.caption.82)]
+>> endobj
+2903 0 obj <<
+/Dests 2902 0 R
+>> endobj
+2904 0 obj <<
+/Type /Catalog
+/Pages 2821 0 R
+/Outlines 2822 0 R
+/Names 2903 0 R
+/PageMode/None
+/OpenAction 461 0 R
+>> endobj
+2905 0 obj <<
+/Author()/Title()/Subject(MCU 8051 IDE handbook)/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords(8051, IDE, Linux)
+/CreationDate (D:20121228020226+01'00')
+/ModDate (D:20121228020226+01'00')
+/Trapped /False
+/PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0)
+>> endobj
+xref
+0 2906
+0000000793 65535 f
+0000000015 00000 n
+0000039466 00000 n
+0002236464 00000 n
+0000000061 00000 n
+0000000086 00000 n
+0000039525 00000 n
+0002236394 00000 n
+0000000132 00000 n
+0000000170 00000 n
+0000046527 00000 n
+0002236310 00000 n
+0000000216 00000 n
+0000000247 00000 n
+0000047859 00000 n
+0002236237 00000 n
+0000000294 00000 n
+0000000330 00000 n
+0000050871 00000 n
+0002236112 00000 n
+0000000376 00000 n
+0000000413 00000 n
+0000050930 00000 n
+0002236038 00000 n
+0000000461 00000 n
+0000000511 00000 n
+0000093984 00000 n
+0002235951 00000 n
+0000000559 00000 n
+0000000592 00000 n
+0000094107 00000 n
+0002235877 00000 n
+0000000640 00000 n
+0000000688 00000 n
+0000233859 00000 n
+0002235751 00000 n
+0000000734 00000 n
+0000000764 00000 n
+0000233918 00000 n
+0002235677 00000 n
+0000000812 00000 n
+0000000852 00000 n
+0000262917 00000 n
+0002235603 00000 n
+0000000900 00000 n
+0000000953 00000 n
+0000266321 00000 n
+0002235475 00000 n
+0000000999 00000 n
+0000001046 00000 n
+0000266380 00000 n
+0002235364 00000 n
+0000001094 00000 n
+0000001131 00000 n
+0000266439 00000 n
+0002235290 00000 n
+0000001184 00000 n
+0000001234 00000 n
+0000266561 00000 n
+0002235203 00000 n
+0000001287 00000 n
+0000001320 00000 n
+0000298784 00000 n
+0002235116 00000 n
+0000001373 00000 n
+0000001407 00000 n
+0000298906 00000 n
+0002235042 00000 n
+0000001460 00000 n
+0000001498 00000 n
+0000378285 00000 n
+0002234916 00000 n
+0000001546 00000 n
+0000001577 00000 n
+0000378345 00000 n
+0002234842 00000 n
+0000001630 00000 n
+0000001680 00000 n
+0000378530 00000 n
+0002234755 00000 n
+0000001733 00000 n
+0000001763 00000 n
+0000420550 00000 n
+0002234668 00000 n
+0000001816 00000 n
+0000001863 00000 n
+0000420671 00000 n
+0002234581 00000 n
+0000001916 00000 n
+0000001949 00000 n
+0000490140 00000 n
+0002234494 00000 n
+0000002002 00000 n
+0000002026 00000 n
+0000490262 00000 n
+0002234407 00000 n
+0000002079 00000 n
+0000002108 00000 n
+0000548116 00000 n
+0002234318 00000 n
+0000002161 00000 n
+0000002194 00000 n
+0000548175 00000 n
+0002234241 00000 n
+0000002248 00000 n
+0000002285 00000 n
+0000567012 00000 n
+0002234111 00000 n
+0000002334 00000 n
+0000002364 00000 n
+0000567073 00000 n
+0002234032 00000 n
+0000002418 00000 n
+0000002458 00000 n
+0000567135 00000 n
+0002233939 00000 n
+0000002512 00000 n
+0000002553 00000 n
+0000567197 00000 n
+0002233846 00000 n
+0000002607 00000 n
+0000002638 00000 n
+0000567321 00000 n
+0002233767 00000 n
+0000002692 00000 n
+0000002731 00000 n
+0000567383 00000 n
+0002233636 00000 n
+0000002780 00000 n
+0000002811 00000 n
+0000567445 00000 n
+0002233557 00000 n
+0000002865 00000 n
+0000002902 00000 n
+0000618812 00000 n
+0002233464 00000 n
+0000002956 00000 n
+0000002995 00000 n
+0000618872 00000 n
+0002233371 00000 n
+0000003049 00000 n
+0000003088 00000 n
+0000618994 00000 n
+0002233278 00000 n
+0000003142 00000 n
+0000003183 00000 n
+0000648653 00000 n
+0002233185 00000 n
+0000003237 00000 n
+0000003281 00000 n
+0000648777 00000 n
+0002233092 00000 n
+0000003335 00000 n
+0000003370 00000 n
+0000648838 00000 n
+0002233013 00000 n
+0000003424 00000 n
+0000003463 00000 n
+0000691970 00000 n
+0002232881 00000 n
+0000003512 00000 n
+0000003543 00000 n
+0000692031 00000 n
+0002232802 00000 n
+0000003597 00000 n
+0000003624 00000 n
+0000692092 00000 n
+0002232709 00000 n
+0000003678 00000 n
+0000003725 00000 n
+0000692214 00000 n
+0002232616 00000 n
+0000003779 00000 n
+0000003812 00000 n
+0000829028 00000 n
+0002232523 00000 n
+0000003866 00000 n
+0000003899 00000 n
+0000851430 00000 n
+0002232430 00000 n
+0000003953 00000 n
+0000003984 00000 n
+0000851490 00000 n
+0002232337 00000 n
+0000004038 00000 n
+0000004080 00000 n
+0000851551 00000 n
+0002232244 00000 n
+0000004134 00000 n
+0000004170 00000 n
+0000851674 00000 n
+0002232151 00000 n
+0000004224 00000 n
+0000004253 00000 n
+0000851735 00000 n
+0002232058 00000 n
+0000004307 00000 n
+0000004343 00000 n
+0000907300 00000 n
+0002231965 00000 n
+0000004398 00000 n
+0000004432 00000 n
+0000907422 00000 n
+0002231872 00000 n
+0000004487 00000 n
+0000004522 00000 n
+0000970946 00000 n
+0002231779 00000 n
+0000004577 00000 n
+0000004616 00000 n
+0001032036 00000 n
+0002231686 00000 n
+0000004671 00000 n
+0000004723 00000 n
+0001032098 00000 n
+0002231593 00000 n
+0000004778 00000 n
+0000004815 00000 n
+0001037714 00000 n
+0002231500 00000 n
+0000004870 00000 n
+0000004938 00000 n
+0001037774 00000 n
+0002231407 00000 n
+0000004993 00000 n
+0000005053 00000 n
+0001037835 00000 n
+0002231314 00000 n
+0000005108 00000 n
+0000005146 00000 n
+0001064311 00000 n
+0002231221 00000 n
+0000005201 00000 n
+0000005242 00000 n
+0001127762 00000 n
+0002231128 00000 n
+0000005297 00000 n
+0000005340 00000 n
+0001127823 00000 n
+0002231049 00000 n
+0000005395 00000 n
+0000005429 00000 n
+0001127884 00000 n
+0002230971 00000 n
+0000005478 00000 n
+0000005521 00000 n
+0001188301 00000 n
+0002230838 00000 n
+0000005568 00000 n
+0000005612 00000 n
+0001188362 00000 n
+0002230759 00000 n
+0000005661 00000 n
+0000005691 00000 n
+0001188424 00000 n
+0002230666 00000 n
+0000005740 00000 n
+0000005767 00000 n
+0001191243 00000 n
+0002230573 00000 n
+0000005816 00000 n
+0000005845 00000 n
+0001194518 00000 n
+0002230480 00000 n
+0000005894 00000 n
+0000005925 00000 n
+0001196171 00000 n
+0002230387 00000 n
+0000005974 00000 n
+0000006024 00000 n
+0001197596 00000 n
+0002230294 00000 n
+0000006073 00000 n
+0000006113 00000 n
+0001203906 00000 n
+0002230201 00000 n
+0000006162 00000 n
+0000006200 00000 n
+0001208715 00000 n
+0002230108 00000 n
+0000006249 00000 n
+0000006287 00000 n
+0001213915 00000 n
+0002230015 00000 n
+0000006336 00000 n
+0000006368 00000 n
+0001218195 00000 n
+0002229922 00000 n
+0000006418 00000 n
+0000006458 00000 n
+0001220169 00000 n
+0002229829 00000 n
+0000006508 00000 n
+0000006544 00000 n
+0001227046 00000 n
+0002229736 00000 n
+0000006594 00000 n
+0000006631 00000 n
+0001228079 00000 n
+0002229643 00000 n
+0000006681 00000 n
+0000006727 00000 n
+0001230833 00000 n
+0002229550 00000 n
+0000006777 00000 n
+0000006813 00000 n
+0001237134 00000 n
+0002229471 00000 n
+0000006863 00000 n
+0000006921 00000 n
+0001239668 00000 n
+0002229377 00000 n
+0000006968 00000 n
+0000007000 00000 n
+0001244162 00000 n
+0002229244 00000 n
+0000007047 00000 n
+0000007080 00000 n
+0001244223 00000 n
+0002229165 00000 n
+0000007129 00000 n
+0000007167 00000 n
+0001244285 00000 n
+0002229072 00000 n
+0000007216 00000 n
+0000007255 00000 n
+0001245528 00000 n
+0002228979 00000 n
+0000007304 00000 n
+0000007341 00000 n
+0001245590 00000 n
+0002228886 00000 n
+0000007390 00000 n
+0000007421 00000 n
+0001312089 00000 n
+0002228768 00000 n
+0000007470 00000 n
+0000007506 00000 n
+0001312150 00000 n
+0002228689 00000 n
+0000007560 00000 n
+0000007605 00000 n
+0001312276 00000 n
+0002228596 00000 n
+0000007659 00000 n
+0000007693 00000 n
+0001355386 00000 n
+0002228503 00000 n
+0000007747 00000 n
+0000007776 00000 n
+0001355512 00000 n
+0002228410 00000 n
+0000007830 00000 n
+0000007868 00000 n
+0001355639 00000 n
+0002228317 00000 n
+0000007922 00000 n
+0000007965 00000 n
+0001388201 00000 n
+0002228224 00000 n
+0000008019 00000 n
+0000008049 00000 n
+0001388325 00000 n
+0002228131 00000 n
+0000008103 00000 n
+0000008136 00000 n
+0001490118 00000 n
+0002228038 00000 n
+0000008190 00000 n
+0000008223 00000 n
+0001490244 00000 n
+0002227959 00000 n
+0000008277 00000 n
+0000008330 00000 n
+0001532136 00000 n
+0002227826 00000 n
+0000008377 00000 n
+0000008435 00000 n
+0001532197 00000 n
+0002227747 00000 n
+0000008484 00000 n
+0000008512 00000 n
+0001534803 00000 n
+0002227654 00000 n
+0000008561 00000 n
+0000008610 00000 n
+0001538031 00000 n
+0002227561 00000 n
+0000008659 00000 n
+0000008701 00000 n
+0001559561 00000 n
+0002227468 00000 n
+0000008750 00000 n
+0000008785 00000 n
+0001561679 00000 n
+0002227389 00000 n
+0000008834 00000 n
+0000008868 00000 n
+0001566034 00000 n
+0002227295 00000 n
+0000008915 00000 n
+0000008957 00000 n
+0001569425 00000 n
+0002227201 00000 n
+0000009004 00000 n
+0000009068 00000 n
+0001576230 00000 n
+0002227107 00000 n
+0000009116 00000 n
+0000009143 00000 n
+0001600403 00000 n
+0002226974 00000 n
+0000009191 00000 n
+0000009229 00000 n
+0001600465 00000 n
+0002226895 00000 n
+0000009278 00000 n
+0000009306 00000 n
+0001600590 00000 n
+0002226816 00000 n
+0000009355 00000 n
+0000009404 00000 n
+0001723124 00000 n
+0002226683 00000 n
+0000009452 00000 n
+0000009504 00000 n
+0001723186 00000 n
+0002226604 00000 n
+0000009553 00000 n
+0000009598 00000 n
+0001726396 00000 n
+0002226511 00000 n
+0000009647 00000 n
+0000009678 00000 n
+0001726459 00000 n
+0002226432 00000 n
+0000009727 00000 n
+0000009761 00000 n
+0001730297 00000 n
+0002226338 00000 n
+0000009809 00000 n
+0000009865 00000 n
+0001752800 00000 n
+0002226244 00000 n
+0000009913 00000 n
+0000009972 00000 n
+0001778403 00000 n
+0002226111 00000 n
+0000010020 00000 n
+0000010075 00000 n
+0001778465 00000 n
+0002226007 00000 n
+0000010129 00000 n
+0000010158 00000 n
+0001778590 00000 n
+0002225942 00000 n
+0000010212 00000 n
+0000010241 00000 n
+0001783759 00000 n
+0002225862 00000 n
+0000010289 00000 n
+0000010319 00000 n
+0000010663 00000 n
+0000010904 00000 n
+0000010371 00000 n
+0000010782 00000 n
+0000010843 00000 n
+0002186722 00000 n
+0002177861 00000 n
+0002222948 00000 n
+0000012273 00000 n
+0000012092 00000 n
+0000010989 00000 n
+0000012211 00000 n
+0002167386 00000 n
+0002143506 00000 n
+0002222510 00000 n
+0002117917 00000 n
+0000013899 00000 n
+0000014051 00000 n
+0000014203 00000 n
+0000014355 00000 n
+0000014507 00000 n
+0000014658 00000 n
+0000014811 00000 n
+0000014962 00000 n
+0000015113 00000 n
+0000015264 00000 n
+0000015417 00000 n
+0000015569 00000 n
+0000015720 00000 n
+0000015873 00000 n
+0000016032 00000 n
+0000016191 00000 n
+0000016350 00000 n
+0000016509 00000 n
+0000016662 00000 n
+0000016820 00000 n
+0000016979 00000 n
+0000017138 00000 n
+0000017297 00000 n
+0000017455 00000 n
+0000017614 00000 n
+0000017773 00000 n
+0000017932 00000 n
+0000018085 00000 n
+0000020400 00000 n
+0000018366 00000 n
+0000013544 00000 n
+0000012384 00000 n
+0000018244 00000 n
+0002106958 00000 n
+0000018305 00000 n
+0000020559 00000 n
+0000020718 00000 n
+0000020877 00000 n
+0000021031 00000 n
+0000021190 00000 n
+0000021349 00000 n
+0000021507 00000 n
+0000021666 00000 n
+0000021825 00000 n
+0000021984 00000 n
+0000022143 00000 n
+0000022296 00000 n
+0000022455 00000 n
+0000022613 00000 n
+0000022772 00000 n
+0000022930 00000 n
+0000023089 00000 n
+0000023246 00000 n
+0000023403 00000 n
+0000023562 00000 n
+0000023721 00000 n
+0000023881 00000 n
+0000024041 00000 n
+0000024201 00000 n
+0000024361 00000 n
+0000024520 00000 n
+0000024680 00000 n
+0000024840 00000 n
+0000025000 00000 n
+0000025159 00000 n
+0000025317 00000 n
+0000025477 00000 n
+0000025631 00000 n
+0000025783 00000 n
+0000025936 00000 n
+0000026090 00000 n
+0000026244 00000 n
+0000026398 00000 n
+0000026550 00000 n
+0000028735 00000 n
+0000026766 00000 n
+0000019949 00000 n
+0000018464 00000 n
+0000026704 00000 n
+0000028888 00000 n
+0000029040 00000 n
+0000029193 00000 n
+0000029347 00000 n
+0000029501 00000 n
+0000029655 00000 n
+0000029807 00000 n
+0000029961 00000 n
+0000030115 00000 n
+0000030266 00000 n
+0000030417 00000 n
+0000030570 00000 n
+0000030723 00000 n
+0000030876 00000 n
+0000031029 00000 n
+0000031182 00000 n
+0000031341 00000 n
+0000031499 00000 n
+0000031658 00000 n
+0000031817 00000 n
+0000031975 00000 n
+0000032133 00000 n
+0000032289 00000 n
+0000032448 00000 n
+0000032607 00000 n
+0000032758 00000 n
+0000032910 00000 n
+0000033063 00000 n
+0000033216 00000 n
+0000033369 00000 n
+0000033522 00000 n
+0000033673 00000 n
+0000033824 00000 n
+0000035218 00000 n
+0000035371 00000 n
+0000034036 00000 n
+0000028332 00000 n
+0000026851 00000 n
+0000033975 00000 n
+0002081341 00000 n
+0000035525 00000 n
+0000035679 00000 n
+0000035831 00000 n
+0000035984 00000 n
+0000036138 00000 n
+0000036292 00000 n
+0000036445 00000 n
+0000036598 00000 n
+0000036751 00000 n
+0000036910 00000 n
+0000037069 00000 n
+0000037284 00000 n
+0000034983 00000 n
+0000034147 00000 n
+0000037222 00000 n
+0000039218 00000 n
+0000039888 00000 n
+0000039079 00000 n
+0000037395 00000 n
+0000039405 00000 n
+0002056889 00000 n
+0002033150 00000 n
+0000039584 00000 n
+0000039645 00000 n
+0002222800 00000 n
+0000039706 00000 n
+0000039766 00000 n
+0000039827 00000 n
+0002223066 00000 n
+0000043362 00000 n
+0000043560 00000 n
+0000043759 00000 n
+0000043945 00000 n
+0000044132 00000 n
+0000044299 00000 n
+0000044482 00000 n
+0000044668 00000 n
+0000044843 00000 n
+0000045030 00000 n
+0000045204 00000 n
+0000045387 00000 n
+0000045563 00000 n
+0000045727 00000 n
+0000045909 00000 n
+0000046088 00000 n
+0000046284 00000 n
+0000046650 00000 n
+0000043095 00000 n
+0000040051 00000 n
+0000046465 00000 n
+0000046588 00000 n
+0002011284 00000 n
+0001996235 00000 n
+0001971760 00000 n
+0001960991 00000 n
+0001951340 00000 n
+0000047919 00000 n
+0000047679 00000 n
+0000046839 00000 n
+0000047798 00000 n
+0000048411 00000 n
+0000048230 00000 n
+0000048017 00000 n
+0000048349 00000 n
+0000050661 00000 n
+0000051171 00000 n
+0000050522 00000 n
+0000048483 00000 n
+0000050810 00000 n
+0000050990 00000 n
+0000051051 00000 n
+0001931077 00000 n
+0000051110 00000 n
+0000054358 00000 n
+0000054115 00000 n
+0000051334 00000 n
+0000054234 00000 n
+0001925978 00000 n
+0000054296 00000 n
+0000057302 00000 n
+0000057848 00000 n
+0000057163 00000 n
+0000054495 00000 n
+0000057483 00000 n
+0000057544 00000 n
+0000057604 00000 n
+0000057665 00000 n
+0000057726 00000 n
+0000057787 00000 n
+0002223184 00000 n
+0000060618 00000 n
+0000093728 00000 n
+0000094230 00000 n
+0000060484 00000 n
+0000057972 00000 n
+0000093799 00000 n
+0000093861 00000 n
+0000093922 00000 n
+0000094045 00000 n
+0000094168 00000 n
+0000080610 00000 n
+0000095654 00000 n
+0000098405 00000 n
+0000236709 00000 n
+0000234039 00000 n
+0000095520 00000 n
+0000094442 00000 n
+0000233798 00000 n
+0000233978 00000 n
+0000098064 00000 n
+0000231653 00000 n
+0000261014 00000 n
+0000263039 00000 n
+0000236575 00000 n
+0000234251 00000 n
+0000262855 00000 n
+0000262977 00000 n
+0000260459 00000 n
+0000262303 00000 n
+0000264711 00000 n
+0000269443 00000 n
+0000266621 00000 n
+0000264592 00000 n
+0000263238 00000 n
+0000266260 00000 n
+0000266499 00000 n
+0000298148 00000 n
+0000298302 00000 n
+0000277856 00000 n
+0000299029 00000 n
+0000269288 00000 n
+0000266820 00000 n
+0000298660 00000 n
+0000298722 00000 n
+0000298845 00000 n
+0000298967 00000 n
+0001905728 00000 n
+0000298481 00000 n
+0000302147 00000 n
+0000301907 00000 n
+0000299241 00000 n
+0000302026 00000 n
+0000302087 00000 n
+0002223302 00000 n
+0000304723 00000 n
+0000305651 00000 n
+0000307171 00000 n
+0000308211 00000 n
+0000309041 00000 n
+0000310017 00000 n
+0000311368 00000 n
+0000312327 00000 n
+0000313504 00000 n
+0000356227 00000 n
+0000360252 00000 n
+0000370233 00000 n
+0000378591 00000 n
+0000304589 00000 n
+0000302310 00000 n
+0000378223 00000 n
+0000378406 00000 n
+0000378468 00000 n
+0000305365 00000 n
+0000306942 00000 n
+0000307858 00000 n
+0000308737 00000 n
+0000309578 00000 n
+0000310863 00000 n
+0000312052 00000 n
+0000313212 00000 n
+0000420336 00000 n
+0000380682 00000 n
+0000398771 00000 n
+0000422787 00000 n
+0000420851 00000 n
+0000380543 00000 n
+0000378918 00000 n
+0000420489 00000 n
+0000420610 00000 n
+0000420729 00000 n
+0000420790 00000 n
+0000489924 00000 n
+0000455325 00000 n
+0000546868 00000 n
+0000547021 00000 n
+0000490447 00000 n
+0000422648 00000 n
+0000421052 00000 n
+0000490078 00000 n
+0000490200 00000 n
+0000490323 00000 n
+0000490385 00000 n
+0000547175 00000 n
+0000547328 00000 n
+0000547481 00000 n
+0000493145 00000 n
+0000000794 00000 f
+0000000000 00000 f
+0000547677 00000 n
+0000547873 00000 n
+0000548541 00000 n
+0000492958 00000 n
+0000490648 00000 n
+0000548055 00000 n
+0000548236 00000 n
+0000548297 00000 n
+0000548358 00000 n
+0000548419 00000 n
+0000548480 00000 n
+0000550707 00000 n
+0000569707 00000 n
+0000567507 00000 n
+0000550573 00000 n
+0000548741 00000 n
+0000566950 00000 n
+0000567259 00000 n
+0000566604 00000 n
+0000570672 00000 n
+0000598229 00000 n
+0000599696 00000 n
+0000648221 00000 n
+0000648374 00000 n
+0000619116 00000 n
+0000569573 00000 n
+0000567681 00000 n
+0000618751 00000 n
+0000618933 00000 n
+0000619055 00000 n
+0002223420 00000 n
+0000570456 00000 n
+0000596529 00000 n
+0000599382 00000 n
+0000621712 00000 n
+0000651462 00000 n
+0000652008 00000 n
+0000652588 00000 n
+0000653186 00000 n
+0000653715 00000 n
+0000654253 00000 n
+0000691696 00000 n
+0000649023 00000 n
+0000621550 00000 n
+0000619319 00000 n
+0000648529 00000 n
+0000648591 00000 n
+0000648715 00000 n
+0000648900 00000 n
+0000648961 00000 n
+0000654808 00000 n
+0000674511 00000 n
+0000692335 00000 n
+0000651308 00000 n
+0000649249 00000 n
+0000691848 00000 n
+0000691909 00000 n
+0000692153 00000 n
+0000692275 00000 n
+0000651726 00000 n
+0000652303 00000 n
+0000652915 00000 n
+0000653450 00000 n
+0000654016 00000 n
+0000654537 00000 n
+0000691099 00000 n
+0000694232 00000 n
+0000735034 00000 n
+0000788195 00000 n
+0000829213 00000 n
+0000694098 00000 n
+0000692620 00000 n
+0000828966 00000 n
+0000829089 00000 n
+0000829151 00000 n
+0000787397 00000 n
+0000828180 00000 n
+0000831559 00000 n
+0000854587 00000 n
+0000851796 00000 n
+0000831440 00000 n
+0000829402 00000 n
+0000851369 00000 n
+0000851612 00000 n
+0000865130 00000 n
+0000906773 00000 n
+0000906928 00000 n
+0000907083 00000 n
+0000906164 00000 n
+0000907731 00000 n
+0000854417 00000 n
+0000851957 00000 n
+0000907238 00000 n
+0000907361 00000 n
+0000907484 00000 n
+0000907546 00000 n
+0000907608 00000 n
+0000907670 00000 n
+0000905567 00000 n
+0000906410 00000 n
+0000910164 00000 n
+0000971251 00000 n
+0000910045 00000 n
+0000907972 00000 n
+0000970885 00000 n
+0000971007 00000 n
+0000971068 00000 n
+0000971129 00000 n
+0000971190 00000 n
+0002223538 00000 n
+0000973279 00000 n
+0001032222 00000 n
+0000973160 00000 n
+0000971412 00000 n
+0001031913 00000 n
+0001031975 00000 n
+0001032160 00000 n
+0001035062 00000 n
+0001035570 00000 n
+0001036078 00000 n
+0001036613 00000 n
+0001037164 00000 n
+0001040828 00000 n
+0001037896 00000 n
+0001034928 00000 n
+0001032422 00000 n
+0001037653 00000 n
+0001895957 00000 n
+0001035293 00000 n
+0001035804 00000 n
+0001036314 00000 n
+0001036845 00000 n
+0001037389 00000 n
+0001061925 00000 n
+0001062691 00000 n
+0001063453 00000 n
+0001066901 00000 n
+0001064559 00000 n
+0001040694 00000 n
+0001038165 00000 n
+0001064187 00000 n
+0001064249 00000 n
+0001064373 00000 n
+0001064435 00000 n
+0001064497 00000 n
+0001061353 00000 n
+0001062447 00000 n
+0001063208 00000 n
+0001063937 00000 n
+0001096247 00000 n
+0001128066 00000 n
+0001066767 00000 n
+0001064814 00000 n
+0001127579 00000 n
+0001127640 00000 n
+0001127702 00000 n
+0001127945 00000 n
+0001128006 00000 n
+0001127011 00000 n
+0001130310 00000 n
+0001130927 00000 n
+0001130464 00000 n
+0001130618 00000 n
+0001130773 00000 n
+0001133785 00000 n
+0001132214 00000 n
+0001130131 00000 n
+0001128280 00000 n
+0001131285 00000 n
+0001131347 00000 n
+0001131408 00000 n
+0001131470 00000 n
+0001131532 00000 n
+0001131594 00000 n
+0001131656 00000 n
+0001131718 00000 n
+0001131780 00000 n
+0001131842 00000 n
+0001131904 00000 n
+0001131966 00000 n
+0001131106 00000 n
+0001132028 00000 n
+0001132090 00000 n
+0001132152 00000 n
+0001184589 00000 n
+0001162112 00000 n
+0001185213 00000 n
+0001133631 00000 n
+0001132377 00000 n
+0001184785 00000 n
+0001184846 00000 n
+0001184907 00000 n
+0001184968 00000 n
+0001185029 00000 n
+0001185090 00000 n
+0001185151 00000 n
+0002223656 00000 n
+0001184104 00000 n
+0001185835 00000 n
+0001185654 00000 n
+0001185401 00000 n
+0001185773 00000 n
+0001187931 00000 n
+0001188083 00000 n
+0001188610 00000 n
+0001187782 00000 n
+0001185907 00000 n
+0001188238 00000 n
+0001188486 00000 n
+0001188548 00000 n
+0001191306 00000 n
+0001190993 00000 n
+0001188786 00000 n
+0001191115 00000 n
+0001191179 00000 n
+0001194643 00000 n
+0001194207 00000 n
+0001191431 00000 n
+0001194329 00000 n
+0001194392 00000 n
+0001194455 00000 n
+0001194580 00000 n
+0001196234 00000 n
+0001195921 00000 n
+0001194820 00000 n
+0001196043 00000 n
+0001196107 00000 n
+0001197657 00000 n
+0001197410 00000 n
+0001196346 00000 n
+0001197533 00000 n
+0002223778 00000 n
+0001199192 00000 n
+0001199005 00000 n
+0001197782 00000 n
+0001199128 00000 n
+0001201052 00000 n
+0001200866 00000 n
+0001199304 00000 n
+0001200989 00000 n
+0001202456 00000 n
+0001202269 00000 n
+0001201164 00000 n
+0001202392 00000 n
+0001203967 00000 n
+0001203720 00000 n
+0001202568 00000 n
+0001203843 00000 n
+0001205600 00000 n
+0001205413 00000 n
+0001204092 00000 n
+0001205536 00000 n
+0001208498 00000 n
+0001208964 00000 n
+0001208354 00000 n
+0001205712 00000 n
+0001208652 00000 n
+0001208776 00000 n
+0001208839 00000 n
+0001872411 00000 n
+0001208901 00000 n
+0002223903 00000 n
+0001809105 00000 n
+0001211841 00000 n
+0001211590 00000 n
+0001209142 00000 n
+0001211713 00000 n
+0001211777 00000 n
+0001214102 00000 n
+0001213729 00000 n
+0001211966 00000 n
+0001213852 00000 n
+0001213976 00000 n
+0001214039 00000 n
+0001216309 00000 n
+0001216058 00000 n
+0001214266 00000 n
+0001216181 00000 n
+0001216245 00000 n
+0001218319 00000 n
+0001218009 00000 n
+0001216408 00000 n
+0001218132 00000 n
+0001218256 00000 n
+0001220359 00000 n
+0001219982 00000 n
+0001218444 00000 n
+0001220105 00000 n
+0001220231 00000 n
+0001220295 00000 n
+0001221838 00000 n
+0001221526 00000 n
+0001220510 00000 n
+0001221649 00000 n
+0001221712 00000 n
+0001221775 00000 n
+0002224028 00000 n
+0001222987 00000 n
+0001222736 00000 n
+0001221937 00000 n
+0001222859 00000 n
+0001222923 00000 n
+0001224535 00000 n
+0001224223 00000 n
+0001223086 00000 n
+0001224346 00000 n
+0001224409 00000 n
+0001224472 00000 n
+0001227428 00000 n
+0001226859 00000 n
+0001224634 00000 n
+0001226982 00000 n
+0001227108 00000 n
+0001227172 00000 n
+0001227236 00000 n
+0001227300 00000 n
+0001227364 00000 n
+0001228140 00000 n
+0001227893 00000 n
+0001227553 00000 n
+0001228016 00000 n
+0001230958 00000 n
+0001230646 00000 n
+0001228239 00000 n
+0001230769 00000 n
+0001230895 00000 n
+0001234364 00000 n
+0001233989 00000 n
+0001231096 00000 n
+0001234112 00000 n
+0001234175 00000 n
+0001234238 00000 n
+0001234301 00000 n
+0002224153 00000 n
+0001237260 00000 n
+0001236947 00000 n
+0001234515 00000 n
+0001237070 00000 n
+0002222217 00000 n
+0001237196 00000 n
+0001242168 00000 n
+0001239729 00000 n
+0001239482 00000 n
+0001237412 00000 n
+0001239605 00000 n
+0001242413 00000 n
+0001242024 00000 n
+0001239893 00000 n
+0001242349 00000 n
+0001244347 00000 n
+0001243976 00000 n
+0001242551 00000 n
+0001244099 00000 n
+0001245909 00000 n
+0001245341 00000 n
+0001244459 00000 n
+0001245464 00000 n
+0001245653 00000 n
+0001245717 00000 n
+0001245781 00000 n
+0001245845 00000 n
+0001248912 00000 n
+0001251073 00000 n
+0001270910 00000 n
+0001292518 00000 n
+0001314634 00000 n
+0001312401 00000 n
+0001248774 00000 n
+0001246021 00000 n
+0001312026 00000 n
+0001866218 00000 n
+0001312212 00000 n
+0001312338 00000 n
+0002224278 00000 n
+0001250317 00000 n
+0001270489 00000 n
+0001292102 00000 n
+0001311495 00000 n
+0001325370 00000 n
+0001335594 00000 n
+0001355766 00000 n
+0001314511 00000 n
+0001312688 00000 n
+0001355322 00000 n
+0001355448 00000 n
+0002222364 00000 n
+0001355575 00000 n
+0001355702 00000 n
+0001358007 00000 n
+0001375093 00000 n
+0001387982 00000 n
+0001388514 00000 n
+0001357863 00000 n
+0001355973 00000 n
+0001388138 00000 n
+0001388262 00000 n
+0001388387 00000 n
+0001388451 00000 n
+0001390701 00000 n
+0001399550 00000 n
+0001420319 00000 n
+0001444916 00000 n
+0001456780 00000 n
+0001468565 00000 n
+0001490370 00000 n
+0001390563 00000 n
+0001388732 00000 n
+0001490054 00000 n
+0001490180 00000 n
+0001490307 00000 n
+0001418618 00000 n
+0001443215 00000 n
+0001456468 00000 n
+0001468250 00000 n
+0001489025 00000 n
+0001492256 00000 n
+0001532323 00000 n
+0001492133 00000 n
+0001490608 00000 n
+0001532073 00000 n
+0001532259 00000 n
+0001535120 00000 n
+0001534616 00000 n
+0001532499 00000 n
+0001534739 00000 n
+0001534865 00000 n
+0001854322 00000 n
+0001534928 00000 n
+0001534992 00000 n
+0001535056 00000 n
+0001537817 00000 n
+0001538093 00000 n
+0001537673 00000 n
+0001535286 00000 n
+0001537968 00000 n
+0002224403 00000 n
+0001539906 00000 n
+0001559688 00000 n
+0001539783 00000 n
+0001538233 00000 n
+0001559497 00000 n
+0001842939 00000 n
+0002222655 00000 n
+0001559624 00000 n
+0001840489 00000 n
+0001561740 00000 n
+0001561493 00000 n
+0001559906 00000 n
+0001561616 00000 n
+0001563711 00000 n
+0001563993 00000 n
+0001563567 00000 n
+0001561880 00000 n
+0001563865 00000 n
+0001563929 00000 n
+0001566158 00000 n
+0001565848 00000 n
+0001564145 00000 n
+0001565971 00000 n
+0001566096 00000 n
+0001567249 00000 n
+0001567062 00000 n
+0001566310 00000 n
+0001567185 00000 n
+0001569487 00000 n
+0001569239 00000 n
+0001567361 00000 n
+0001569362 00000 n
+0002224528 00000 n
+0001571374 00000 n
+0001571187 00000 n
+0001569639 00000 n
+0001571310 00000 n
+0001576292 00000 n
+0001576044 00000 n
+0001571473 00000 n
+0001576167 00000 n
+0001824078 00000 n
+0001582698 00000 n
+0001582511 00000 n
+0001576405 00000 n
+0001582634 00000 n
+0001584755 00000 n
+0001600652 00000 n
+0001584617 00000 n
+0001582785 00000 n
+0001600340 00000 n
+0001600527 00000 n
+0001599816 00000 n
+0001602534 00000 n
+0001602347 00000 n
+0001600856 00000 n
+0001602470 00000 n
+0001722715 00000 n
+0001722888 00000 n
+0001603717 00000 n
+0001723311 00000 n
+0001603549 00000 n
+0001602620 00000 n
+0001723061 00000 n
+0001723248 00000 n
+0002224653 00000 n
+0001720975 00000 n
+0001725962 00000 n
+0001727226 00000 n
+0001725809 00000 n
+0001723501 00000 n
+0001726332 00000 n
+0001726148 00000 n
+0001726522 00000 n
+0001726586 00000 n
+0001726650 00000 n
+0001726714 00000 n
+0001726778 00000 n
+0001726842 00000 n
+0001726906 00000 n
+0001726970 00000 n
+0001727034 00000 n
+0001727098 00000 n
+0001727162 00000 n
+0001730422 00000 n
+0001730111 00000 n
+0001727366 00000 n
+0001730234 00000 n
+0001730359 00000 n
+0001734978 00000 n
+0001734791 00000 n
+0001730534 00000 n
+0001734914 00000 n
+0001739398 00000 n
+0001739212 00000 n
+0001735077 00000 n
+0001739335 00000 n
+0001744131 00000 n
+0001743944 00000 n
+0001739497 00000 n
+0001744067 00000 n
+0001748594 00000 n
+0001748408 00000 n
+0001744230 00000 n
+0001748531 00000 n
+0002224778 00000 n
+0001749662 00000 n
+0001749475 00000 n
+0001748693 00000 n
+0001749598 00000 n
+0001752925 00000 n
+0001752614 00000 n
+0001749787 00000 n
+0001752737 00000 n
+0001752862 00000 n
+0001757536 00000 n
+0001757349 00000 n
+0001753037 00000 n
+0001757472 00000 n
+0001761877 00000 n
+0001761691 00000 n
+0001757635 00000 n
+0001761814 00000 n
+0001766431 00000 n
+0001766244 00000 n
+0001761976 00000 n
+0001766367 00000 n
+0001770901 00000 n
+0001770715 00000 n
+0001766530 00000 n
+0001770838 00000 n
+0002224903 00000 n
+0001771955 00000 n
+0001771768 00000 n
+0001771000 00000 n
+0001771891 00000 n
+0001773294 00000 n
+0001773502 00000 n
+0001773710 00000 n
+0001773918 00000 n
+0001774127 00000 n
+0001774337 00000 n
+0001774546 00000 n
+0001774756 00000 n
+0001774966 00000 n
+0001775176 00000 n
+0001775386 00000 n
+0001775596 00000 n
+0001775806 00000 n
+0001776015 00000 n
+0001776225 00000 n
+0001776434 00000 n
+0001776644 00000 n
+0001776854 00000 n
+0001777064 00000 n
+0001777283 00000 n
+0001777501 00000 n
+0001777711 00000 n
+0001777920 00000 n
+0001778130 00000 n
+0001779694 00000 n
+0001779913 00000 n
+0001780123 00000 n
+0001780333 00000 n
+0001780543 00000 n
+0001780753 00000 n
+0001780963 00000 n
+0001781172 00000 n
+0001781382 00000 n
+0001781591 00000 n
+0001781801 00000 n
+0001782009 00000 n
+0001782219 00000 n
+0001778715 00000 n
+0001772943 00000 n
+0001772080 00000 n
+0001778340 00000 n
+0001778527 00000 n
+0001778652 00000 n
+0001782492 00000 n
+0001779442 00000 n
+0001778881 00000 n
+0001782428 00000 n
+0001783821 00000 n
+0001783573 00000 n
+0001782605 00000 n
+0001783696 00000 n
+0001785693 00000 n
+0001785506 00000 n
+0001783920 00000 n
+0001785629 00000 n
+0001787512 00000 n
+0001787326 00000 n
+0001785807 00000 n
+0001787449 00000 n
+0002225028 00000 n
+0001789373 00000 n
+0001789186 00000 n
+0001787598 00000 n
+0001789309 00000 n
+0001790474 00000 n
+0001790288 00000 n
+0001789459 00000 n
+0001790411 00000 n
+0001790984 00000 n
+0001790797 00000 n
+0001790560 00000 n
+0001790920 00000 n
+0001792439 00000 n
+0001792595 00000 n
+0001792747 00000 n
+0001792906 00000 n
+0001793065 00000 n
+0001793223 00000 n
+0001793382 00000 n
+0001793541 00000 n
+0001793699 00000 n
+0001793858 00000 n
+0001794017 00000 n
+0001794176 00000 n
+0001794335 00000 n
+0001794494 00000 n
+0001794653 00000 n
+0001794810 00000 n
+0001794969 00000 n
+0001795128 00000 n
+0001795287 00000 n
+0001795445 00000 n
+0001795597 00000 n
+0001795875 00000 n
+0001792115 00000 n
+0001791057 00000 n
+0001795749 00000 n
+0001795812 00000 n
+0001796394 00000 n
+0001796207 00000 n
+0001795974 00000 n
+0001796330 00000 n
+0001798353 00000 n
+0001798513 00000 n
+0001798671 00000 n
+0001798831 00000 n
+0001798991 00000 n
+0001799149 00000 n
+0001799467 00000 n
+0001799626 00000 n
+0001799785 00000 n
+0001799945 00000 n
+0001800105 00000 n
+0001800265 00000 n
+0001800425 00000 n
+0001800585 00000 n
+0001800745 00000 n
+0001800905 00000 n
+0001801102 00000 n
+0001801627 00000 n
+0001801787 00000 n
+0001801947 00000 n
+0001802105 00000 n
+0001802265 00000 n
+0001802425 00000 n
+0001802585 00000 n
+0001802744 00000 n
+0001802903 00000 n
+0001803062 00000 n
+0001803221 00000 n
+0001803381 00000 n
+0001803541 00000 n
+0001803701 00000 n
+0001805444 00000 n
+0001803987 00000 n
+0001797912 00000 n
+0001796467 00000 n
+0001803861 00000 n
+0001803924 00000 n
+0001799309 00000 n
+0001801285 00000 n
+0001801445 00000 n
+0002225153 00000 n
+0001805604 00000 n
+0001805764 00000 n
+0001805924 00000 n
+0001806084 00000 n
+0001806244 00000 n
+0001806404 00000 n
+0001806563 00000 n
+0001806723 00000 n
+0001806883 00000 n
+0001807043 00000 n
+0001807202 00000 n
+0001807360 00000 n
+0001807520 00000 n
+0001807680 00000 n
+0001807840 00000 n
+0001807998 00000 n
+0001808158 00000 n
+0001808318 00000 n
+0001808477 00000 n
+0001808637 00000 n
+0001808797 00000 n
+0001809019 00000 n
+0001805111 00000 n
+0001804086 00000 n
+0001808955 00000 n
+0001809138 00000 n
+0001809354 00000 n
+0001809570 00000 n
+0001809789 00000 n
+0001810006 00000 n
+0001810189 00000 n
+0001810359 00000 n
+0001810582 00000 n
+0001810759 00000 n
+0001810949 00000 n
+0001811137 00000 n
+0001811307 00000 n
+0001811489 00000 n
+0001811699 00000 n
+0001811915 00000 n
+0001812129 00000 n
+0001812336 00000 n
+0001812540 00000 n
+0001812742 00000 n
+0001812964 00000 n
+0001813150 00000 n
+0001813332 00000 n
+0001813528 00000 n
+0001813756 00000 n
+0001813947 00000 n
+0001814148 00000 n
+0001814363 00000 n
+0001814561 00000 n
+0001814774 00000 n
+0001814998 00000 n
+0001815212 00000 n
+0001815441 00000 n
+0001815630 00000 n
+0001815825 00000 n
+0001816036 00000 n
+0001816246 00000 n
+0001816475 00000 n
+0001816679 00000 n
+0001816901 00000 n
+0001817119 00000 n
+0001817320 00000 n
+0001817538 00000 n
+0001817756 00000 n
+0001817956 00000 n
+0001818199 00000 n
+0001818398 00000 n
+0001818587 00000 n
+0001818791 00000 n
+0001819010 00000 n
+0001819196 00000 n
+0001819386 00000 n
+0001819580 00000 n
+0001819786 00000 n
+0001820011 00000 n
+0001820230 00000 n
+0001820432 00000 n
+0001820640 00000 n
+0001820841 00000 n
+0001821034 00000 n
+0001821233 00000 n
+0001821437 00000 n
+0001821653 00000 n
+0001821882 00000 n
+0001822093 00000 n
+0001822282 00000 n
+0001822512 00000 n
+0001822739 00000 n
+0001822968 00000 n
+0001823187 00000 n
+0001823421 00000 n
+0001823635 00000 n
+0001823844 00000 n
+0001824332 00000 n
+0001824817 00000 n
+0001825255 00000 n
+0001826309 00000 n
+0001826503 00000 n
+0001826697 00000 n
+0001826913 00000 n
+0001827142 00000 n
+0001827372 00000 n
+0001827551 00000 n
+0001827750 00000 n
+0001827921 00000 n
+0001828098 00000 n
+0001828288 00000 n
+0001828470 00000 n
+0001828662 00000 n
+0001828932 00000 n
+0001829219 00000 n
+0001829480 00000 n
+0001829709 00000 n
+0001829948 00000 n
+0001830209 00000 n
+0001830442 00000 n
+0001830667 00000 n
+0001830886 00000 n
+0001831081 00000 n
+0001831262 00000 n
+0001831450 00000 n
+0001831675 00000 n
+0001831913 00000 n
+0001832129 00000 n
+0001832356 00000 n
+0001832608 00000 n
+0001832864 00000 n
+0001833066 00000 n
+0001833285 00000 n
+0001833513 00000 n
+0001833761 00000 n
+0001833999 00000 n
+0001834223 00000 n
+0001834469 00000 n
+0001834704 00000 n
+0001834926 00000 n
+0001835206 00000 n
+0001835424 00000 n
+0001835625 00000 n
+0001835848 00000 n
+0001836105 00000 n
+0001836302 00000 n
+0001836516 00000 n
+0001836727 00000 n
+0001836948 00000 n
+0001837199 00000 n
+0001837419 00000 n
+0001837657 00000 n
+0001837879 00000 n
+0001838088 00000 n
+0001838308 00000 n
+0001838533 00000 n
+0001838771 00000 n
+0001839032 00000 n
+0001839277 00000 n
+0001839489 00000 n
+0001839745 00000 n
+0001840001 00000 n
+0001840245 00000 n
+0001840743 00000 n
+0001841200 00000 n
+0001841749 00000 n
+0001842678 00000 n
+0001842705 00000 n
+0001843191 00000 n
+0001843218 00000 n
+0001843280 00000 n
+0001843318 00000 n
+0001843606 00000 n
+0001843895 00000 n
+0001844075 00000 n
+0001844340 00000 n
+0001844688 00000 n
+0001845049 00000 n
+0001845352 00000 n
+0001845632 00000 n
+0001845883 00000 n
+0001846067 00000 n
+0001846418 00000 n
+0001846768 00000 n
+0001847119 00000 n
+0001847370 00000 n
+0001847699 00000 n
+0001848054 00000 n
+0001848287 00000 n
+0001848605 00000 n
+0001848913 00000 n
+0001849200 00000 n
+0001849489 00000 n
+0001849782 00000 n
+0001850072 00000 n
+0001850314 00000 n
+0001850657 00000 n
+0001850898 00000 n
+0001851109 00000 n
+0001851297 00000 n
+0001851570 00000 n
+0001851805 00000 n
+0001852082 00000 n
+0001852367 00000 n
+0001852603 00000 n
+0001852908 00000 n
+0001853144 00000 n
+0001853385 00000 n
+0001853685 00000 n
+0001854034 00000 n
+0001854572 00000 n
+0001854925 00000 n
+0001855331 00000 n
+0001855919 00000 n
+0001855945 00000 n
+0001856184 00000 n
+0001856446 00000 n
+0001856624 00000 n
+0001856868 00000 n
+0001857054 00000 n
+0001857254 00000 n
+0001857508 00000 n
+0001857862 00000 n
+0001858085 00000 n
+0001858281 00000 n
+0001858564 00000 n
+0001858845 00000 n
+0001859111 00000 n
+0001859413 00000 n
+0001859701 00000 n
+0001859988 00000 n
+0001860290 00000 n
+0001860588 00000 n
+0001860834 00000 n
+0001861191 00000 n
+0001861438 00000 n
+0001861657 00000 n
+0001861907 00000 n
+0001862206 00000 n
+0001862411 00000 n
+0001862654 00000 n
+0001862895 00000 n
+0001863175 00000 n
+0001863478 00000 n
+0001863732 00000 n
+0001864032 00000 n
+0001864274 00000 n
+0001864515 00000 n
+0001864792 00000 n
+0001865080 00000 n
+0001865380 00000 n
+0001865605 00000 n
+0001865904 00000 n
+0001866468 00000 n
+0001866819 00000 n
+0001867238 00000 n
+0001867827 00000 n
+0001867852 00000 n
+0001868018 00000 n
+0001868240 00000 n
+0001868415 00000 n
+0001868634 00000 n
+0001868874 00000 n
+0001869099 00000 n
+0001869304 00000 n
+0001869570 00000 n
+0001869759 00000 n
+0001869964 00000 n
+0001870160 00000 n
+0001870380 00000 n
+0001870578 00000 n
+0001870817 00000 n
+0001871030 00000 n
+0001871236 00000 n
+0001871456 00000 n
+0001871652 00000 n
+0001871904 00000 n
+0001872152 00000 n
+0001872665 00000 n
+0001872914 00000 n
+0001873186 00000 n
+0001873516 00000 n
+0001873796 00000 n
+0001874077 00000 n
+0001874341 00000 n
+0001874602 00000 n
+0001874790 00000 n
+0001874982 00000 n
+0001875197 00000 n
+0001875387 00000 n
+0001875601 00000 n
+0001875778 00000 n
+0001876021 00000 n
+0001876205 00000 n
+0001876453 00000 n
+0001876629 00000 n
+0001876876 00000 n
+0001877135 00000 n
+0001877398 00000 n
+0001877637 00000 n
+0001877927 00000 n
+0001878203 00000 n
+0001878533 00000 n
+0001878825 00000 n
+0001879176 00000 n
+0001879469 00000 n
+0001879744 00000 n
+0001879991 00000 n
+0001880341 00000 n
+0001880553 00000 n
+0001880741 00000 n
+0001880993 00000 n
+0001881341 00000 n
+0001881567 00000 n
+0001881901 00000 n
+0001882233 00000 n
+0001882576 00000 n
+0001882833 00000 n
+0001883245 00000 n
+0001883557 00000 n
+0001883905 00000 n
+0001884145 00000 n
+0001884434 00000 n
+0001884778 00000 n
+0001885181 00000 n
+0001885557 00000 n
+0001885890 00000 n
+0001886185 00000 n
+0001886477 00000 n
+0001886752 00000 n
+0001887044 00000 n
+0001887330 00000 n
+0001887555 00000 n
+0001887898 00000 n
+0001888145 00000 n
+0001888351 00000 n
+0001888583 00000 n
+0001888878 00000 n
+0001889069 00000 n
+0001889337 00000 n
+0001889573 00000 n
+0001889843 00000 n
+0001890133 00000 n
+0001890438 00000 n
+0001890665 00000 n
+0001890950 00000 n
+0001891183 00000 n
+0001891425 00000 n
+0001891700 00000 n
+0001892030 00000 n
+0001892336 00000 n
+0001892657 00000 n
+0001892938 00000 n
+0001893211 00000 n
+0001893419 00000 n
+0001893743 00000 n
+0001894071 00000 n
+0001894338 00000 n
+0001894649 00000 n
+0001894980 00000 n
+0001895264 00000 n
+0001895623 00000 n
+0001896207 00000 n
+0001896749 00000 n
+0001897280 00000 n
+0001898461 00000 n
+0001898642 00000 n
+0001898881 00000 n
+0001899070 00000 n
+0001899255 00000 n
+0001899555 00000 n
+0001899820 00000 n
+0001900049 00000 n
+0001900322 00000 n
+0001900586 00000 n
+0001900861 00000 n
+0001901144 00000 n
+0001901380 00000 n
+0001901715 00000 n
+0001901958 00000 n
+0001902172 00000 n
+0001902369 00000 n
+0001902622 00000 n
+0001902859 00000 n
+0001903124 00000 n
+0001903406 00000 n
+0001903646 00000 n
+0001903913 00000 n
+0001904150 00000 n
+0001904380 00000 n
+0001904636 00000 n
+0001904921 00000 n
+0001905144 00000 n
+0001905433 00000 n
+0001905982 00000 n
+0001906269 00000 n
+0001906591 00000 n
+0001907037 00000 n
+0001907329 00000 n
+0001907615 00000 n
+0001907843 00000 n
+0001908046 00000 n
+0001908271 00000 n
+0001908452 00000 n
+0001908708 00000 n
+0001908898 00000 n
+0001909137 00000 n
+0001909332 00000 n
+0001909600 00000 n
+0001909785 00000 n
+0001910056 00000 n
+0001910241 00000 n
+0001910602 00000 n
+0001910958 00000 n
+0001911245 00000 n
+0001911535 00000 n
+0001911861 00000 n
+0001912143 00000 n
+0001912383 00000 n
+0001912618 00000 n
+0001912824 00000 n
+0001913021 00000 n
+0001913353 00000 n
+0001913563 00000 n
+0001913858 00000 n
+0001914139 00000 n
+0001914398 00000 n
+0001914677 00000 n
+0001914974 00000 n
+0001915315 00000 n
+0001915534 00000 n
+0001915806 00000 n
+0001916109 00000 n
+0001916434 00000 n
+0001916741 00000 n
+0001917046 00000 n
+0001917336 00000 n
+0001917650 00000 n
+0001917957 00000 n
+0001918205 00000 n
+0001918570 00000 n
+0001918830 00000 n
+0001919053 00000 n
+0001919312 00000 n
+0001919521 00000 n
+0001919778 00000 n
+0001920030 00000 n
+0001920314 00000 n
+0001920631 00000 n
+0001920943 00000 n
+0001921197 00000 n
+0001921506 00000 n
+0001921765 00000 n
+0001922012 00000 n
+0001922295 00000 n
+0001922571 00000 n
+0001922877 00000 n
+0001923182 00000 n
+0001923418 00000 n
+0001923734 00000 n
+0001924077 00000 n
+0001924362 00000 n
+0001924672 00000 n
+0001925016 00000 n
+0001925297 00000 n
+0001925635 00000 n
+0001926231 00000 n
+0001926738 00000 n
+0001927262 00000 n
+0001928272 00000 n
+0001928535 00000 n
+0001928771 00000 n
+0001928969 00000 n
+0001929235 00000 n
+0001929504 00000 n
+0001929748 00000 n
+0001930010 00000 n
+0001930283 00000 n
+0001930530 00000 n
+0001930804 00000 n
+0001931328 00000 n
+0001931463 00000 n
+0001931579 00000 n
+0001931757 00000 n
+0001932028 00000 n
+0001932298 00000 n
+0001932489 00000 n
+0001932735 00000 n
+0001932922 00000 n
+0001933135 00000 n
+0001933311 00000 n
+0001933546 00000 n
+0001933729 00000 n
+0001933973 00000 n
+0001934149 00000 n
+0001934396 00000 n
+0001934650 00000 n
+0001934907 00000 n
+0001935197 00000 n
+0001935514 00000 n
+0001935805 00000 n
+0001936147 00000 n
+0001936423 00000 n
+0001936686 00000 n
+0001936934 00000 n
+0001937270 00000 n
+0001937477 00000 n
+0001937665 00000 n
+0001937990 00000 n
+0001938212 00000 n
+0001938538 00000 n
+0001938863 00000 n
+0001939184 00000 n
+0001939433 00000 n
+0001939736 00000 n
+0001940074 00000 n
+0001940306 00000 n
+0001940579 00000 n
+0001940901 00000 n
+0001941290 00000 n
+0001941603 00000 n
+0001941889 00000 n
+0001942169 00000 n
+0001942433 00000 n
+0001942713 00000 n
+0001942984 00000 n
+0001943207 00000 n
+0001943526 00000 n
+0001943763 00000 n
+0001943967 00000 n
+0001944199 00000 n
+0001944477 00000 n
+0001944667 00000 n
+0001944926 00000 n
+0001945155 00000 n
+0001945425 00000 n
+0001945703 00000 n
+0001945987 00000 n
+0001946209 00000 n
+0001946486 00000 n
+0001946719 00000 n
+0001946954 00000 n
+0001947219 00000 n
+0001947534 00000 n
+0001947826 00000 n
+0001948127 00000 n
+0001948392 00000 n
+0001948662 00000 n
+0001948865 00000 n
+0001949175 00000 n
+0001949492 00000 n
+0001949762 00000 n
+0001950070 00000 n
+0001950395 00000 n
+0001950674 00000 n
+0001951021 00000 n
+0001951594 00000 n
+0001952117 00000 n
+0001952616 00000 n
+0001953685 00000 n
+0001953869 00000 n
+0001954062 00000 n
+0001954352 00000 n
+0001954697 00000 n
+0001954975 00000 n
+0001955241 00000 n
+0001955482 00000 n
+0001955797 00000 n
+0001956031 00000 n
+0001956312 00000 n
+0001956585 00000 n
+0001956858 00000 n
+0001957204 00000 n
+0001957408 00000 n
+0001957595 00000 n
+0001957821 00000 n
+0001958052 00000 n
+0001958322 00000 n
+0001958526 00000 n
+0001958839 00000 n
+0001959158 00000 n
+0001959428 00000 n
+0001959739 00000 n
+0001960056 00000 n
+0001960338 00000 n
+0001960672 00000 n
+0001961244 00000 n
+0001961517 00000 n
+0001961854 00000 n
+0001962262 00000 n
+0001962536 00000 n
+0001962796 00000 n
+0001962993 00000 n
+0001963174 00000 n
+0001963489 00000 n
+0001963782 00000 n
+0001964079 00000 n
+0001964397 00000 n
+0001964623 00000 n
+0001964943 00000 n
+0001965248 00000 n
+0001965515 00000 n
+0001965778 00000 n
+0001966040 00000 n
+0001966293 00000 n
+0001966578 00000 n
+0001966841 00000 n
+0001967110 00000 n
+0001967394 00000 n
+0001967674 00000 n
+0001967942 00000 n
+0001968242 00000 n
+0001968485 00000 n
+0001968799 00000 n
+0001969082 00000 n
+0001969338 00000 n
+0001969633 00000 n
+0001969880 00000 n
+0001970128 00000 n
+0001970376 00000 n
+0001970643 00000 n
+0001970904 00000 n
+0001971208 00000 n
+0001971473 00000 n
+0001972014 00000 n
+0001972337 00000 n
+0001972699 00000 n
+0001973233 00000 n
+0001973452 00000 n
+0001973712 00000 n
+0001973967 00000 n
+0001974215 00000 n
+0001974393 00000 n
+0001974642 00000 n
+0001974838 00000 n
+0001975034 00000 n
+0001975267 00000 n
+0001975508 00000 n
+0001975752 00000 n
+0001975936 00000 n
+0001976125 00000 n
+0001976339 00000 n
+0001976578 00000 n
+0001976771 00000 n
+0001976973 00000 n
+0001977151 00000 n
+0001977387 00000 n
+0001977572 00000 n
+0001977785 00000 n
+0001977975 00000 n
+0001978192 00000 n
+0001978425 00000 n
+0001978608 00000 n
+0001978841 00000 n
+0001979024 00000 n
+0001979214 00000 n
+0001979441 00000 n
+0001979732 00000 n
+0001980028 00000 n
+0001980318 00000 n
+0001980613 00000 n
+0001980913 00000 n
+0001981160 00000 n
+0001981400 00000 n
+0001981643 00000 n
+0001981915 00000 n
+0001982157 00000 n
+0001982370 00000 n
+0001982586 00000 n
+0001982856 00000 n
+0001983052 00000 n
+0001983232 00000 n
+0001983452 00000 n
+0001983711 00000 n
+0001983906 00000 n
+0001984132 00000 n
+0001984379 00000 n
+0001984611 00000 n
+0001984850 00000 n
+0001985108 00000 n
+0001985377 00000 n
+0001985663 00000 n
+0001985868 00000 n
+0001986094 00000 n
+0001986334 00000 n
+0001986581 00000 n
+0001986843 00000 n
+0001987091 00000 n
+0001987347 00000 n
+0001987597 00000 n
+0001987850 00000 n
+0001988094 00000 n
+0001988348 00000 n
+0001988600 00000 n
+0001988825 00000 n
+0001989121 00000 n
+0001989347 00000 n
+0001989548 00000 n
+0001989774 00000 n
+0001990033 00000 n
+0001990227 00000 n
+0001990457 00000 n
+0001990676 00000 n
+0001990923 00000 n
+0001991183 00000 n
+0001991459 00000 n
+0001991683 00000 n
+0001991925 00000 n
+0001992150 00000 n
+0001992359 00000 n
+0001992596 00000 n
+0001992832 00000 n
+0001993084 00000 n
+0001993349 00000 n
+0001993598 00000 n
+0001993860 00000 n
+0001994073 00000 n
+0001994343 00000 n
+0001994623 00000 n
+0001994878 00000 n
+0001995138 00000 n
+0001995421 00000 n
+0001995673 00000 n
+0001995944 00000 n
+0001996489 00000 n
+0001997342 00000 n
+0001997890 00000 n
+0001999300 00000 n
+0001999480 00000 n
+0001999723 00000 n
+0001999911 00000 n
+0002000086 00000 n
+0002000402 00000 n
+0002000642 00000 n
+0002000869 00000 n
+0002001176 00000 n
+0002001449 00000 n
+0002001771 00000 n
+0002002034 00000 n
+0002002267 00000 n
+0002002576 00000 n
+0002002889 00000 n
+0002003187 00000 n
+0002003426 00000 n
+0002003720 00000 n
+0002004032 00000 n
+0002004285 00000 n
+0002004603 00000 n
+0002004865 00000 n
+0002005124 00000 n
+0002005368 00000 n
+0002005628 00000 n
+0002005881 00000 n
+0002006104 00000 n
+0002006409 00000 n
+0002006636 00000 n
+0002006836 00000 n
+0002007074 00000 n
+0002007333 00000 n
+0002007514 00000 n
+0002007767 00000 n
+0002007987 00000 n
+0002008239 00000 n
+0002008500 00000 n
+0002008762 00000 n
+0002008979 00000 n
+0002009235 00000 n
+0002009459 00000 n
+0002009675 00000 n
+0002009937 00000 n
+0002010239 00000 n
+0002010506 00000 n
+0002010804 00000 n
+0002011001 00000 n
+0002011538 00000 n
+0002011934 00000 n
+0002012370 00000 n
+0002013074 00000 n
+0002013554 00000 n
+0002013878 00000 n
+0002014127 00000 n
+0002014315 00000 n
+0002014513 00000 n
+0002014690 00000 n
+0002014982 00000 n
+0002015287 00000 n
+0002015696 00000 n
+0002016045 00000 n
+0002016465 00000 n
+0002016805 00000 n
+0002017115 00000 n
+0002017389 00000 n
+0002017820 00000 n
+0002018025 00000 n
+0002018212 00000 n
+0002018638 00000 n
+0002018877 00000 n
+0002019270 00000 n
+0002019668 00000 n
+0002019959 00000 n
+0002020331 00000 n
+0002020759 00000 n
+0002021017 00000 n
+0002021332 00000 n
+0002021873 00000 n
+0002022225 00000 n
+0002022564 00000 n
+0002022889 00000 n
+0002023224 00000 n
+0002023550 00000 n
+0002023807 00000 n
+0002024213 00000 n
+0002024481 00000 n
+0002024701 00000 n
+0002024988 00000 n
+0002025313 00000 n
+0002025502 00000 n
+0002025816 00000 n
+0002026082 00000 n
+0002026395 00000 n
+0002026732 00000 n
+0002026983 00000 n
+0002027324 00000 n
+0002027592 00000 n
+0002027861 00000 n
+0002028195 00000 n
+0002028586 00000 n
+0002028938 00000 n
+0002029330 00000 n
+0002029644 00000 n
+0002029955 00000 n
+0002030174 00000 n
+0002030557 00000 n
+0002030944 00000 n
+0002031251 00000 n
+0002031618 00000 n
+0002032014 00000 n
+0002032335 00000 n
+0002032756 00000 n
+0002033405 00000 n
+0002033868 00000 n
+0002034334 00000 n
+0002035234 00000 n
+0002035430 00000 n
+0002035607 00000 n
+0002035912 00000 n
+0002036280 00000 n
+0002036744 00000 n
+0002037138 00000 n
+0002037622 00000 n
+0002037995 00000 n
+0002038322 00000 n
+0002038604 00000 n
+0002039096 00000 n
+0002039303 00000 n
+0002039492 00000 n
+0002039743 00000 n
+0002040176 00000 n
+0002040640 00000 n
+0002040950 00000 n
+0002041360 00000 n
+0002041847 00000 n
+0002042121 00000 n
+0002042471 00000 n
+0002042938 00000 n
+0002043562 00000 n
+0002044080 00000 n
+0002044475 00000 n
+0002044865 00000 n
+0002045230 00000 n
+0002045586 00000 n
+0002045939 00000 n
+0002046296 00000 n
+0002046569 00000 n
+0002047020 00000 n
+0002047312 00000 n
+0002047540 00000 n
+0002047844 00000 n
+0002048212 00000 n
+0002048405 00000 n
+0002048745 00000 n
+0002049025 00000 n
+0002049374 00000 n
+0002049741 00000 n
+0002050119 00000 n
+0002050385 00000 n
+0002050763 00000 n
+0002051040 00000 n
+0002051321 00000 n
+0002051696 00000 n
+0002052148 00000 n
+0002052549 00000 n
+0002053006 00000 n
+0002053347 00000 n
+0002053571 00000 n
+0002053997 00000 n
+0002054427 00000 n
+0002054761 00000 n
+0002055171 00000 n
+0002055614 00000 n
+0002055968 00000 n
+0002056445 00000 n
+0002057145 00000 n
+0002057552 00000 n
+0002057984 00000 n
+0002058870 00000 n
+0002059116 00000 n
+0002059362 00000 n
+0002059597 00000 n
+0002059829 00000 n
+0002060014 00000 n
+0002060199 00000 n
+0002060379 00000 n
+0002060566 00000 n
+0002060772 00000 n
+0002061007 00000 n
+0002061200 00000 n
+0002061406 00000 n
+0002061578 00000 n
+0002061820 00000 n
+0002062000 00000 n
+0002062216 00000 n
+0002062399 00000 n
+0002062618 00000 n
+0002062794 00000 n
+0002063019 00000 n
+0002063194 00000 n
+0002063447 00000 n
+0002063760 00000 n
+0002064129 00000 n
+0002064468 00000 n
+0002064708 00000 n
+0002064938 00000 n
+0002065182 00000 n
+0002065466 00000 n
+0002065733 00000 n
+0002066038 00000 n
+0002066295 00000 n
+0002066553 00000 n
+0002066793 00000 n
+0002067094 00000 n
+0002067299 00000 n
+0002067484 00000 n
+0002067703 00000 n
+0002068006 00000 n
+0002068221 00000 n
+0002068520 00000 n
+0002068820 00000 n
+0002069109 00000 n
+0002069350 00000 n
+0002069695 00000 n
+0002069971 00000 n
+0002070265 00000 n
+0002070488 00000 n
+0002070742 00000 n
+0002071045 00000 n
+0002071401 00000 n
+0002071724 00000 n
+0002072016 00000 n
+0002072295 00000 n
+0002072554 00000 n
+0002072818 00000 n
+0002073067 00000 n
+0002073329 00000 n
+0002073585 00000 n
+0002073798 00000 n
+0002074079 00000 n
+0002074307 00000 n
+0002074507 00000 n
+0002074734 00000 n
+0002075002 00000 n
+0002075189 00000 n
+0002075435 00000 n
+0002075654 00000 n
+0002075893 00000 n
+0002076161 00000 n
+0002076429 00000 n
+0002076635 00000 n
+0002076886 00000 n
+0002077106 00000 n
+0002077327 00000 n
+0002077576 00000 n
+0002077853 00000 n
+0002078124 00000 n
+0002078410 00000 n
+0002078668 00000 n
+0002078913 00000 n
+0002079111 00000 n
+0002079398 00000 n
+0002079681 00000 n
+0002079932 00000 n
+0002080207 00000 n
+0002080493 00000 n
+0002080750 00000 n
+0002081049 00000 n
+0002081595 00000 n
+0002082188 00000 n
+0002082741 00000 n
+0002084048 00000 n
+0002084227 00000 n
+0002084614 00000 n
+0002085193 00000 n
+0002085697 00000 n
+0002086348 00000 n
+0002086816 00000 n
+0002087217 00000 n
+0002087536 00000 n
+0002088184 00000 n
+0002088382 00000 n
+0002088666 00000 n
+0002089193 00000 n
+0002089785 00000 n
+0002090161 00000 n
+0002090934 00000 n
+0002091444 00000 n
+0002091753 00000 n
+0002092163 00000 n
+0002092968 00000 n
+0002093469 00000 n
+0002093925 00000 n
+0002094364 00000 n
+0002094806 00000 n
+0002095248 00000 n
+0002095557 00000 n
+0002096169 00000 n
+0002096517 00000 n
+0002096773 00000 n
+0002097127 00000 n
+0002097597 00000 n
+0002097801 00000 n
+0002098222 00000 n
+0002098560 00000 n
+0002098989 00000 n
+0002099451 00000 n
+0002099761 00000 n
+0002100237 00000 n
+0002100562 00000 n
+0002100902 00000 n
+0002101483 00000 n
+0002101980 00000 n
+0002102410 00000 n
+0002102652 00000 n
+0002103215 00000 n
+0002103781 00000 n
+0002104184 00000 n
+0002104718 00000 n
+0002105297 00000 n
+0002105723 00000 n
+0002106373 00000 n
+0002107215 00000 n
+0002107660 00000 n
+0002108099 00000 n
+0002108856 00000 n
+0002109174 00000 n
+0002109471 00000 n
+0002109696 00000 n
+0002110024 00000 n
+0002110396 00000 n
+0002110784 00000 n
+0002111147 00000 n
+0002111393 00000 n
+0002111825 00000 n
+0002112188 00000 n
+0002112563 00000 n
+0002112923 00000 n
+0002113288 00000 n
+0002113602 00000 n
+0002113947 00000 n
+0002114246 00000 n
+0002114592 00000 n
+0002114937 00000 n
+0002115229 00000 n
+0002115493 00000 n
+0002115826 00000 n
+0002116122 00000 n
+0002116400 00000 n
+0002116708 00000 n
+0002116979 00000 n
+0002117302 00000 n
+0002117609 00000 n
+0002118170 00000 n
+0002118468 00000 n
+0002118873 00000 n
+0002119303 00000 n
+0002119440 00000 n
+0002119730 00000 n
+0002120019 00000 n
+0002120298 00000 n
+0002120572 00000 n
+0002120758 00000 n
+0002120956 00000 n
+0002121172 00000 n
+0002121437 00000 n
+0002121631 00000 n
+0002121849 00000 n
+0002122026 00000 n
+0002122274 00000 n
+0002122461 00000 n
+0002122690 00000 n
+0002122880 00000 n
+0002123134 00000 n
+0002123310 00000 n
+0002123564 00000 n
+0002123775 00000 n
+0002123998 00000 n
+0002124261 00000 n
+0002124536 00000 n
+0002124783 00000 n
+0002125092 00000 n
+0002125431 00000 n
+0002125743 00000 n
+0002126119 00000 n
+0002126421 00000 n
+0002126705 00000 n
+0002126967 00000 n
+0002127345 00000 n
+0002127557 00000 n
+0002127751 00000 n
+0002128004 00000 n
+0002128381 00000 n
+0002128615 00000 n
+0002128955 00000 n
+0002129296 00000 n
+0002129658 00000 n
+0002129924 00000 n
+0002130372 00000 n
+0002130706 00000 n
+0002131077 00000 n
+0002131319 00000 n
+0002131611 00000 n
+0002131973 00000 n
+0002132388 00000 n
+0002132790 00000 n
+0002133130 00000 n
+0002133441 00000 n
+0002133736 00000 n
+0002134021 00000 n
+0002134315 00000 n
+0002134607 00000 n
+0002134845 00000 n
+0002135202 00000 n
+0002135451 00000 n
+0002135658 00000 n
+0002135901 00000 n
+0002136203 00000 n
+0002136395 00000 n
+0002136680 00000 n
+0002136921 00000 n
+0002137212 00000 n
+0002137512 00000 n
+0002137819 00000 n
+0002138045 00000 n
+0002138340 00000 n
+0002138582 00000 n
+0002138826 00000 n
+0002139110 00000 n
+0002139438 00000 n
+0002139756 00000 n
+0002140086 00000 n
+0002140365 00000 n
+0002140654 00000 n
+0002140867 00000 n
+0002141208 00000 n
+0002141547 00000 n
+0002141835 00000 n
+0002142155 00000 n
+0002142494 00000 n
+0002142795 00000 n
+0002143162 00000 n
+0002143759 00000 n
+0002144356 00000 n
+0002144872 00000 n
+0002146108 00000 n
+0002146347 00000 n
+0002146706 00000 n
+0002147021 00000 n
+0002147327 00000 n
+0002147514 00000 n
+0002147769 00000 n
+0002147947 00000 n
+0002148216 00000 n
+0002148501 00000 n
+0002148874 00000 n
+0002149191 00000 n
+0002149579 00000 n
+0002149890 00000 n
+0002150180 00000 n
+0002150435 00000 n
+0002150817 00000 n
+0002151020 00000 n
+0002151206 00000 n
+0002151460 00000 n
+0002151832 00000 n
+0002152063 00000 n
+0002152423 00000 n
+0002152782 00000 n
+0002153150 00000 n
+0002153417 00000 n
+0002153854 00000 n
+0002154187 00000 n
+0002154573 00000 n
+0002154817 00000 n
+0002155107 00000 n
+0002155491 00000 n
+0002155951 00000 n
+0002156355 00000 n
+0002156688 00000 n
+0002157037 00000 n
+0002157351 00000 n
+0002157662 00000 n
+0002157958 00000 n
+0002158261 00000 n
+0002158569 00000 n
+0002158818 00000 n
+0002159181 00000 n
+0002159430 00000 n
+0002159643 00000 n
+0002159911 00000 n
+0002160213 00000 n
+0002160402 00000 n
+0002160693 00000 n
+0002160937 00000 n
+0002161232 00000 n
+0002161541 00000 n
+0002161784 00000 n
+0002162089 00000 n
+0002162344 00000 n
+0002162592 00000 n
+0002162890 00000 n
+0002163248 00000 n
+0002163564 00000 n
+0002163913 00000 n
+0002164203 00000 n
+0002164496 00000 n
+0002164704 00000 n
+0002165052 00000 n
+0002165392 00000 n
+0002165690 00000 n
+0002166025 00000 n
+0002166371 00000 n
+0002166667 00000 n
+0002167039 00000 n
+0002167641 00000 n
+0002168366 00000 n
+0002168832 00000 n
+0002169860 00000 n
+0002170236 00000 n
+0002170526 00000 n
+0002170809 00000 n
+0002171032 00000 n
+0002171212 00000 n
+0002171701 00000 n
+0002172035 00000 n
+0002172396 00000 n
+0002172794 00000 n
+0002173129 00000 n
+0002173457 00000 n
+0002173769 00000 n
+0002174087 00000 n
+0002174483 00000 n
+0002174695 00000 n
+0002174887 00000 n
+0002175159 00000 n
+0002175411 00000 n
+0002175714 00000 n
+0002175963 00000 n
+0002176287 00000 n
+0002176536 00000 n
+0002176843 00000 n
+0002177071 00000 n
+0002177446 00000 n
+0002178114 00000 n
+0002178498 00000 n
+0002178907 00000 n
+0002179306 00000 n
+0002179841 00000 n
+0002180242 00000 n
+0002180601 00000 n
+0002180812 00000 n
+0002181248 00000 n
+0002181619 00000 n
+0002182039 00000 n
+0002182455 00000 n
+0002182855 00000 n
+0002183130 00000 n
+0002183441 00000 n
+0002183845 00000 n
+0002184147 00000 n
+0002184515 00000 n
+0002184798 00000 n
+0002185095 00000 n
+0002185483 00000 n
+0002185727 00000 n
+0002186172 00000 n
+0002186976 00000 n
+0002187219 00000 n
+0002187574 00000 n
+0002187886 00000 n
+0002194897 00000 n
+0002195133 00000 n
+0002202262 00000 n
+0002202487 00000 n
+0002209899 00000 n
+0002210152 00000 n
+0002217200 00000 n
+0002217434 00000 n
+0002221982 00000 n
+0002225242 00000 n
+0002225362 00000 n
+0002225487 00000 n
+0002225613 00000 n
+0002225693 00000 n
+0002225785 00000 n
+0002236573 00000 n
+0002236777 00000 n
+0002236990 00000 n
+0002237199 00000 n
+0002237392 00000 n
+0002237569 00000 n
+0002237744 00000 n
+0002237921 00000 n
+0002238089 00000 n
+0002238274 00000 n
+0002238469 00000 n
+0002238654 00000 n
+0002238835 00000 n
+0002239012 00000 n
+0002239184 00000 n
+0002239384 00000 n
+0002239635 00000 n
+0002239886 00000 n
+0002240137 00000 n
+0002240388 00000 n
+0002240640 00000 n
+0002240897 00000 n
+0002241154 00000 n
+0002241332 00000 n
+0002241517 00000 n
+0002241690 00000 n
+0002241860 00000 n
+0002242031 00000 n
+0002242201 00000 n
+0002242372 00000 n
+0002242546 00000 n
+0002242723 00000 n
+0002242898 00000 n
+0002243075 00000 n
+0002243249 00000 n
+0002243423 00000 n
+0002243600 00000 n
+0002243775 00000 n
+0002243952 00000 n
+0002244127 00000 n
+0002244304 00000 n
+0002244497 00000 n
+0002244696 00000 n
+0002244895 00000 n
+0002245095 00000 n
+0002245298 00000 n
+0002245495 00000 n
+0002245694 00000 n
+0002245901 00000 n
+0002246108 00000 n
+0002246311 00000 n
+0002246514 00000 n
+0002246717 00000 n
+0002246941 00000 n
+0002247178 00000 n
+0002247420 00000 n
+0002247663 00000 n
+0002247911 00000 n
+0002248162 00000 n
+0002248406 00000 n
+0002248649 00000 n
+0002248892 00000 n
+0002249103 00000 n
+0002249328 00000 n
+0002249574 00000 n
+0002249823 00000 n
+0002249960 00000 n
+0002250078 00000 n
+0002250193 00000 n
+0002250319 00000 n
+0002250446 00000 n
+0002250562 00000 n
+0002250678 00000 n
+0002250797 00000 n
+0002250921 00000 n
+0002251051 00000 n
+0002251185 00000 n
+0002251319 00000 n
+0002251437 00000 n
+0002251553 00000 n
+0002251644 00000 n
+0002251684 00000 n
+0002251809 00000 n
+trailer
+<< /Size 2906
+/Root 2904 0 R
+/Info 2905 0 R
+/ID [<36108AC345591B7959D28A92A59C63A7> <36108AC345591B7959D28A92A59C63A7>] >>
+startxref
+2252173
+%%EOF
diff --git a/doc/handbook/mcu8051ide.en.tex b/doc/handbook/mcu8051ide.en.tex
new file mode 100644
index 0000000..0139b7b
--- /dev/null
+++ b/doc/handbook/mcu8051ide.en.tex
@@ -0,0 +1,3914 @@
+\documentclass[a4paper,twoside,12pt]{book}
+\usepackage[utf8]{inputenc}
+
+\title{MCU 8051 IDE handbook draft}
+\author{Martin Ošmera <martin.osmera@gmail.com>}
+
+\newcommand{\mysubject}{MCU~8051~IDE handbook}
+\newcommand{\mykeywords}{8051, IDE, Linux}
+
+% \usepackage[light,condensed,math]{iwona}
+
+%\usepackage{lmodern}
+%\renewcommand*\familydefault{\sfdefault} %% Only if the base font of the document is to be sans serif
+
+\usepackage[T1]{fontenc}
+\usepackage{float}
+\usepackage{graphicx}
+\usepackage{fancyhdr}
+\usepackage{longtable}
+\usepackage[usenames,dvipsnames]{color}
+\usepackage{pifont}
+\usepackage{wrapfig}
+\usepackage[footnotesize,bf]{caption}
+\usepackage[pdftex,colorlinks=true,linkcolor=blue,urlcolor=blue,pdftitle={\title{}},pdfauthor={\author{}},pdfsubject={\mysubject{}},pdfkeywords={\mykeywords{}},bookmarksopen=false,pdfpagemode=None]{hyperref}
+
+\floatstyle{ruled}
+\newfloat{code}{thp}{lop}
+\floatname{code}{Code}
+
+\definecolor{highlight_constant}{rgb}{0.333, 0.666, 0.0}
+\definecolor{highlight_unknown_base}{rgb}{0.533, 0.133, 0.133}
+\definecolor{highlight_comment}{rgb}{0.533, 0.533, 0.533}
+\definecolor{highlight_symbol}{rgb}{0.666, 0.0, 1.0}
+\definecolor{highlight_oper_sep}{rgb}{0.866, 0.533, 0.0}
+\definecolor{highlight_directive}{rgb}{0.533, 0.533, 1.0}
+\definecolor{highlight_label}{rgb}{0.533, 0.333, 0.0}
+\definecolor{highlight_instruction}{rgb}{0.0, 0.0, 1.0}
+\definecolor{highlight_sfr}{rgb}{0.0, 0.0, 0.866}
+\definecolor{highlight_indirect}{rgb}{0.866, 0.0, 0.0}
+\definecolor{highlight_imm_hex}{rgb}{0.666, 0.0, 0.866}
+\definecolor{highlight_macro}{rgb}{0.8, 0.0, 0.866}
+\definecolor{highlight_imm_dec}{rgb}{0.0, 0.533, 0.866}
+\definecolor{highlight_hex}{rgb}{0.533, 0.0, 0.733}
+\definecolor{highlight_oct}{rgb}{0.533, 0.0, 0.0}
+\definecolor{highlight_dec}{rgb}{0.0, 0.333, 0.666}
+\definecolor{highlight_bin}{rgb}{0.2, 0.2, 0.333}
+\definecolor{highlight_string}{rgb}{0.533, 0.533, 0.0}
+\definecolor{highlight_control}{rgb}{1.0, 0.0, 0.0}
+\definecolor{highlight_imm_oct}{rgb}{0.666, 0.0, 0.0}
+\definecolor{highlight_imm_bin}{rgb}{0.333, 0.333, 0.666}
+\definecolor{highlight_char}{rgb}{0.0, 1.0, 1.0}
+\definecolor{highlight_imm_constant}{rgb}{0.937, 0.737, 0.168}
+\definecolor{highlight_imm_unknown}{rgb}{0.666, 0.2, 0.2}
+\definecolor{highlight_lst_number}{rgb}{0.0, 0.882, 1.0}
+\definecolor{highlight_lst_code}{rgb}{1.0, 0.2, 0.968}
+\definecolor{highlight_lst_address}{rgb}{0.349, 0.356, 1.0}
+\definecolor{highlight_lst_line}{rgb}{0.074, 0.003, 0.513}
+\definecolor{highlight_lst_macro}{rgb}{0.533, 0.533, 0.533}
+\definecolor{highlight_lst_include}{rgb}{0.533, 0.533, 0.533}
+\definecolor{highlight_lst_msg}{rgb}{0.0, 0.0, 0.0}
+
+\renewcommand{\chaptermark}[1]{\markboth{\thechapter.\ \MakeUppercase{#1}}{}}
+\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}}
+
+\newcommand{\menuitem}[1]{\texttt{#1}}
+\newcommand{\fileextension}[1]{\texttt{#1}}
+\newcommand{\mysmallfont}{\fontsize{8pt}{10pt} \selectfont{}}
+\newcommand{\uC}{$\mu$C }
+
+\pdfadjustspacing=1
+\raggedbottom
+
+\pagestyle{fancy}
+\fancyhf{}
+\fancyhead[EL,OR]{\bfseries\thepage}
+\fancyhead[LO]{\bfseries\rightmark}
+\fancyhead[RE]{\bfseries\leftmark}
+
+\fancypagestyle{plain}{
+ \fancyhead{}
+ \fancyhead[EL,OR]{\bfseries\thepage}
+ \renewcommand{\headrulewidth}{0pt}
+}
+
+
+
+\begin{document}
+\maketitle
+\thanks{
+ I would like to thank to the following people for their support during the project development:
+
+ \begin{itemize}
+ \item \textbf{Andre Cunha}~\textit{(Brazil)} for review of this document.
+ \item \textbf{Yuanhui Zhang}~\textit{(China)} for bug reports and help with debugging.
+ \item \textbf{Kara Blackowiak}~\textit{(USA)} for certain code reviews.
+ \item \textbf{Marek Nožka}~\textit{(Moravia, CZ, EU)} for help with debugging.
+ \item \textbf{Kostya V. Ivanov}~\textit{(Russia)} for bug fixes in the simulator engine.
+ \item \textbf{Shakthi Kannan}~\textit{(India)} for adding this software to the FEL project and for a few patches.
+ \item \textbf{Trevor Spiteri}~ for help with debugging (patches) the HD44780 simulator.
+ \item \textbf{Miroslav Hradílek}~\textit{(EU)} for bug reports and suggestions
+ \item \textbf{Fabricio Alcalde}~\textit{(Argentina)} for suggestions and bug reports.
+ \item \textbf{Francisco Albani}~\textit{(Argentina)} for suggestions and a few bug reports.
+ \end{itemize}
+}
+
+\tableofcontents
+\newpage
+
+\chapter*{Preface}
+\addcontentsline{toc}{chapter}{Preface}
+ \section*{Goals of the project}
+ \addcontentsline{toc}{section}{Goals of the project}
+ MCU~8051~IDE is an integrated development environment for microcontrollers based on MCS-51 intended for Assembly language and C language. This IDE is currently available on GNU/Linux and Microsoft\textregistered\~Windows\textregistered\ (since version 1.3.6). This program was originally intended for education purposes, but now the area of potential usage is surely significantly wider. This program was created to fill a gap in the open source software of this kind. User interface, source codes, documentation, web pages, etc., are written in English in order to make this software available to as many user as possible, but there is support for internationalization using i18n since version 1.3.10. This documentation is written in \LaTeX. It is very important to note that this software was not developed for any company, person or something similar and it is completely noncommercial, open source software distributed under \href{http://gnu.cz/article/30/pdf/gpl-cz.pdf}{GNU GPLv2} license intended for a group of people with common interest, in this case 8051.
+
+ \subsection*{MCU 8051 IDE should offer:}
+ \begin{dingautolist}{172}
+ \setlength{\itemsep}{-3pt}
+ \item A transparent view on a simulated program for 8051;
+ \item Easy source code editing even for an user with small knowledge of the assembly language;
+ \item User friendly advanced IDE for MCS-51.
+ \end{dingautolist}
+
+ \subsection*{List of the most important parts of MCU 8051 IDE:}
+ \begin{dinglist}{43}
+ \setlength{\itemsep}{-3pt}
+ \item Source code editor;
+ \item Optimization capable macro-assembler;
+ \item Advanced MCU simulator;
+ \item Hexadecimal editor;
+ \item Interface for hardware tool control plug-ins;
+ \item Scientific calculator and special calculator optimized for 8051.
+ \end{dinglist}
+
+ \section*{Requirements}
+ \addcontentsline{toc}{section}{Requirements}
+ Hardware requirements are not defined. This program should run without problems on all POSIX systems (like GNU/Linux, etc.), where all of the software dependencies were satisfied. The IDE is officially distributed as a source code package (primary programming language is TCL), RPM package (currently available in official RHEL repositories), DEB package (currently available in official Debian repositories) and ebuild for Gentoo Linux (currently NOT available in the portage tree).
+ \begin{table}[h]
+ \centering{}
+ \mysmallfont{}
+ \begin{tabular}{|l|c|l|}
+ \hline
+ \textbf{Package} & \textbf{Min. version} & \textbf{Download location} \\\hline
+ \multicolumn{2}{|l}{\textbf{Required packages:}}
+ & (The IDE will not run without these packages) \\\hline
+ tcl & 8.5 & \url{http://www.tcl.tk/software/tcltk/downloadnow85.html} \\\hline
+ tk & 8.5 & \url{http://www.tcl.tk/software/tcltk/downloadnow85.html} \\\hline
+ bwidget & 1.8 & \url{http://sourceforge.net/projects/tcllib} \\\hline
+ itcl & 3.4 & \url{http://sourceforge.net/projects/incrtcl} \\\hline
+ tdom & 0.8 & \url{http://www.tdom.org} \\\hline
+ tkimg & 1.3 & \url{http://sourceforge.net/projects/tkimg} \\\hline
+ tcllib & 1.6 & \url{http://sourceforge.net/projects/tcllib} \\\hline
+
+ \multicolumn{2}{|l}{\textbf{Optional packages:}}
+ & (Functionality might be unnecessarily limited without these packages) \\\hline
+ Tclx & 8.4 & \url{http://tclx.sourceforge.net} \\
+ & \multicolumn{2}{l|}{\textit{(Signal handling (signals like SIGINT)}} \\\hline
+ cmake & 2.6 & \url{http://www.cmake.org/HTML/Download.html} \\
+ & \multicolumn{2}{l|}{
+ \textit{(If you prefer this way of installation:}
+ \texttt{``./configure \&\& make \&\& make install''})
+ } \\\hline
+ rxvt-unicode & 8.3 & \url{http://software.schmorp.de} \\\hline
+ & \multicolumn{2}{l|}{\textit{(If you want terminal emulator)}} \\\hline
+ asem-51 & 1.3 & \url{http://plit.de/asem-51/download.htm} \\\hline
+ & \multicolumn{2}{l|}{\textit{(If you want to use a really good assembler :) )}} \\\hline
+ sdcc & 2.9 & \url{http://sdcc.sourceforge.net/} \\\hline
+ & \multicolumn{2}{l|}{\textit{(If you want to used C language compiler)}} \\\hline
+ doxygen & 1.3 & \url{www.doxygen.org/} \\\hline
+ & \multicolumn{2}{l|}{\textit{(If you want to use doxygen directly from the IDE)}} \\\hline
+ indent & 1.2 & \url{http://www.gnu.org/software/indent/} \\\hline
+ & \multicolumn{2}{l|}{\textit{(If you want to use auto-indent function for C language)}}\\\hline
+ hunspell & 1.2 & \url{http://hunspell.sourceforge.net} \\\hline
+ & \multicolumn{2}{l|}{\textit{(If you want to have spell checker function available)}} \\\hline
+ bash & 4.0 & \url{http://tiswww.case.edu/php/chet/bash/bashtop.html} \\\hline
+ & \multicolumn{2}{l|}{\textit{(If you want to have spell checker function available)}} \\\hline
+ gawk & 3.1 & \url{http://www.gnu.org/software/gawk/} \\\hline
+ & \multicolumn{2}{l|}{\textit{(If you want to have spell checker function available)}} \\\hline
+ \end{tabular}
+ \caption{Software requirements}
+ \end{table}
+
+
+ \section*{Intended Audience}
+ \addcontentsline{toc}{section}{Intended Audience}
+ This manual is intended for any individual, regardless of his or her experience with assembler, C language, MCU~8051~IDE or Linux, but it is assumed here that the reader is familiar with basic concepts of assembly language programming and with 8051 processor architecture.
+ Advanced users are not likely to read this manual, but all suggestions on documentation will be considered. If you would like to contribute to this project or the documentation, please consult the project web page.
+
+% The preferred way to ask technical questions or start a discussion is to use our mailing list: (mcu8051ide-devel AT lists.sourceforge.net). TODO: finish it
+
+ Thanks for your cooperation which helps to make this software better.
+
+\chapter{Brief introduction}
+
+ This chapter will provide you with a brief introduction about the main components that are part of MCU 8051 IDE. The purpose of this chapter is to contextualize you on the sofware, informing about the parts that composes it. The next chapter will cover rapidly the Graphical User Interface, which will be described in further details on chapter.
+
+ \section{Main components of MCU 8051 IDE}
+ \paragraph{Editor} The code editor is featured with syntax highlighting and validation, auto-completion and spell checking for comments \footnote{Spell checking for comments is available only if you have installed the Hunspell program. This feature is currently not available on MS\textregistered Windows\textregistered OS.}, as well as a command line that speeds up the access to various editor options. It also provides a panel showing line numbers, bookmarks, breakpoints and warnings from syntax validator. Editor is capable to export the source code within it as XHTML and \LaTeX\ and contains a number of useful tools like automatic indentation, searching and replacement of expressions, copy to clipboard, paste from clipboard, among others.
+
+ \paragraph{Assembler} The assembler is one of the integral parts of MCU 8051 IDE. It is a macro assembler with support for dozens of directives and capable of performing peephole optimizations. Support for peephole optimizations means that the assembler can attempt to optimize the resulting code for higher execution speed and lower size without tempering with its very functionality. It is important to note that automatic peephole optimization can sometimes be harmful and so it is disabled by default. A macro assembler is a software that allows the user to define a \textbf{macro instruction}, which consists of a sequence of basic instructions, and use it later instead of repeatedly copying and pasting the set of instructions over and over along the source code. Assembler behavior can be configured either globally, using the proper configuration dialog, or locally in source code, by means of assembler directives and control sequences (e.g. \texttt{\$TITLE('Some title to show in the code listing')}). The assembler is capable of generating four kinds of output code:
+ \begin{dinglist}{43}
+ \setlength{\itemsep}{-3pt}
+ \item Object code (machine code) as an hexadecimal file, with \fileextension{.hex} extension and in Intel\textregistered\ 8 HEX format;
+ \item Object code (machine code) as a binary file, with \fileextension{.bin} extension and in format of raw binary data;
+ \item Code listing, in \fileextension{.lst} extension;
+ \item Code for integrated MCU simulator, in \fileextension{.adf} extension.
+ \end{dinglist}
+
+ \paragraph{Simulator} The simulator is a software component intended for the simulation of the chosen microcontroller in a virtual environment. It allows user to monitor precisely what is happening in the MCU in an exact moment in time, as well as to modify its components, for instance by altering the value of a register, canceling an interrupt or forcing a subprogram to return. In that way it might be possible to ferret out certain flaws in the program being debugged, which would be hard or nearly impossible to find and/or fix in other ways. Even though it is better to have ICD (In-Circuit Debugger) or ICE (In-Circuit Emulator) at hand, MCU~8051~IDE in current version does not support neither of them % \textcolor{blue}{[MARTIN, ARE YOU PLANNING TO ADD SUPPORT ON NEXT VERSIONS? IF SO, IT IS GOOD TO MENTION THIS HERE.]}. :) Sorry Andre, the only think I plan regarding this project is to "retire", I was working on it during my studies on the school, now I've got another responsibilities to attend to, I am really sorry.
+ MCU simulator implemented in this IDE supports dozens of microcontrollers and most of them are treated in slightly different way allowing to take into account most of the nuances between the supported MCUs. User can adjust simulator behavior to fit his or her needs by modifying clock frequency, size of connected external code, data memory and others, or for instance by disabling or enabling certain warnings, which pops up when the simulated program do something ``strange'', like some kind of invalid access into memory or stack overflow or underflow. Besides that, it is possible for the user to modify all registers which the MCU deals with, including those which are not accessible by the running program, like the Program Counter. User have always an overview of all possible, pending and active interrupts and can temper with them at any time. The simulator also allows for altering code memory and all kinds of data memories. The program being simulated can be at any time "hibernated" into a file, preferably with \fileextension{.m5ihib} extension, and resumed later from this same file. Such a file contains the entire state of the simulator at the point in which the program was hibernated.
+
+ \paragraph{Project management} It is a functionality that allows the IDE to remember certain set of source code files along with a set of configuration parameters. Projects are stored in XML (eXtensible Markup Language) files with extension \fileextension{.mcu8051ide}. These files are human readable and their precise formatting is described in their inline DTD (Document Type Declaration). Their encoding is UTF-8 (Unicode Transformation) and as EOL (End Of Line) character they use LF (Line Feed). The reason for that is to make it possible for the user to implement his or her own tools for manipulating with them.
+
+ \paragraph{Scientific calculator} MCU 8051 IDE scientific calculator is implemented as a simple scientific calculator capable of computation in four number systems: hexadecimal, decimal, octal and binary, and with three angle units: radians, degrees and grad. Integral part of the calculator is also a simple tool intended solely for computing preset values for MCU timers.
+
+ \paragraph{Special calculator} The experience in MCU programming shows that it is very useful to have some tools at hand, capable of performing recurrent boring calculations that spend time to be done by hand. MCU 8051 IDE special calculator is intended for performing certain simple specialized calculations related to 8051. For instance, this calculator is capable of generating assembly language code implementing a wait loop with specified parameters.
+
+ \paragraph{Hexadecimal editor} This utility is used here for watching and modifying large blocks of raw data in various memory types of the simulated MCU (Code, IDATA, XDATA, EEPROM, etc.). There is also hexadecimal editor intended for editing Intel\textregistered{}~HEX~8 files. Other hexadecimal editors are specially designed to fit specific needs of the given purpose; for example, there is an hexadecimal editor for viewing and editing code memory, which displays the current position of the program counter in the machine code of the simulated program.
+
+ \paragraph{Disassembler} This tool can translate once assembled code back to source code. It is important to note that it is somewhat improbable that the resulting source code will look "reasonable" It is due to \texttt{DB} and \texttt{DW} and not fixed instruction word length on 8051. Nevertheless, such a generated source code must posses exactly the same functionality when it gets assembled again. Disassembler implemented in this IDE is frankly speaking only a little more that just a toy. If you want a really capable disassembler, maybe you should try some tool like D52 \url{http://www.8052.com/users/disasm/}.
+
+ \paragraph{Notepad} In this IDE, it is a simple rich text editor for writing user notes of whatever kind. Originally, it was intended for writing a list of things which remain to be done in your project.
+
+ \paragraph{Command Line Interface (CLI)} It is an useful tool that allows the use of some IDE functions without entering it's GUI. You can get list of available options by typing \texttt{mcu8051ide -h} or \texttt{mcu8051ide --help} to your terminal emulator. You can, for example, use just the assembler of the IDE or convert an Intel\textregistered{}~HEX~8 file to a raw binary file.
+
+ \section{What is MCS-51}
+ \begin{wrapfigure}{r}{120pt}
+ \centering{}
+ \includegraphics[width=110pt]{img/545px-Intel_8051_arch.png}
+ \caption{i8051 micro-architecture}
+ \end{wrapfigure}
+ The Intel MCS-51 is a Harvard architecture, single chip microcontroller series which was developed by Intel in 1980 for use in embedded systems. Today there is a vast range of enhanced 8051-compatible devices manufactured by a number of independent manufacturers. They have 8-bit ALU, accumulator and 8-bit Registers (hence they are an 8-bit microcontrollers), they have 16-bit address bus, 8-bit data bus, boolean processing engine which allows bit-level boolean logic operations to be carried out directly and efficiently on select internal registers and select RAM locations, etc.
+ \enlargethispage{10\baselineskip}
+
+ \section{What is the Assembly language}
+ An assembly language is a low-level programming language for computers, microprocessors, microcontrollers and other integrated circuits. It implements a symbolic representation of the binary machine codes and other constants needed to program a given CPU architecture. Processors based on MSC-51 have compatible instruction set, similar registers and many other things are generally very similar among them.
+
+ Here is an example of how a piece of 8051 assembly code looks like:
+ \begin{code}[h]
+ \mysmallfont{}
+ {\color{highlight_label}\verb' main:'}\\
+ {\color{highlight_directive}\verb' if'}\verb' '{\color{highlight_constant}\verb'test'}\verb''{\color{highlight_symbol}\verb'='}\verb''{\color{highlight_unknown_base}\verb'2'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'R0'}\verb''{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#25h'}\\
+ \verb' '{\color{highlight_comment}\verb'; Configure EEPROM'}\\
+ \verb' '{\color{highlight_instruction}\verb'orl'}\verb' '{\color{highlight_sfr}\verb'EECON'}\verb''{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#38h'}\\
+ \verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_sfr}\verb'R0'}\\
+ {\color{highlight_directive}\verb' endif'}\\
+ {\color{highlight_label}\verb' X0MI:'}\\
+ \verb' '{\color{highlight_instruction}\verb'anl'}\verb' '{\color{highlight_sfr}\verb'EECON'}\verb''{\color{highlight_oper_sep}\verb','}\verb' #'{\color{highlight_symbol}\verb'('}\verb''{\color{highlight_hex}\verb'0FFh'}\verb' '{\color{highlight_symbol}\verb'-'}\verb' '{\color{highlight_hex}\verb'020h'}\verb''{\color{highlight_symbol}\verb')'}\\
+ \verb' '{\color{highlight_instruction}\verb'movx'}\verb' '{\color{highlight_indirect}\verb'@R0'}\verb''{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'A'}
+ \caption{An example piece of code written in 8051 assembly language}
+ \end{code}
+
+\chapter{Quick start}
+ \section{Demonstration project}
+ The aim of the demonstration project is to provide an easy way to explore the IDE without reading long and boring documents like this one. :) The demonstration project can be opened from the welcome dialog ( ``\menuitem{Main Menu}'' $\rightarrow$ ``\menuitem{Help}'' $\rightarrow$ ``\includegraphics[height=8pt]{img/messagebox_info.png}~\menuitem{Welcome dialog}'' $\rightarrow$ ``\menuitem{Open demonstration project}''. ) Demonstration project should introduce new user into usage of the most common functions of the IDE like assembling the code, running simulator and so on. Demonstration project cannot be modified by the user in order to make it ``less volatile''.
+ \begin{figure}[h!]
+ \centering{}
+ \includegraphics[width=\textwidth]{img/024.png}
+ \caption{MCU~8051~IDE with the demonstration project opened within it}
+ \end{figure}
+
+ \section{Your first project in MCU~8051~IDE}
+ \begin{wrapfigure}{r}{160pt}
+ \centering{}
+ \includegraphics[width=150pt]{img/025.png}
+ \caption{Project creation dialog}
+ \end{wrapfigure}
+ At first let me explain what the MCU~8051~IDE's project really is. It is a set of some files in some directory, let's call this directory the project directory. And this along with the file with extension \fileextension{.mcu8051ide} forms the project. The file with \fileextension{.mcu8051ide} extension defines what source code files belongs to the project and contains additional information about the project, like who is the project author or for what exact MCU is the project intended.
+
+ To create you project in you have to specify the project directory and the MCU type for which you will develop your code. This is done in project creation dialog. This dialog can be accessed from main menu ``\menuitem{Main Menu}'' $\rightarrow$ ``\menuitem{Project}'' $\rightarrow$ ``\includegraphics[height=8pt]{img/filenew.png} \menuitem{New}''. After this step you can specify some additional information about the project in project editing dialog.
+
+ Once you have created a new project you can begin to develop you code from your chosen processor. When you want to save your code press Ctrl+S, Ctrl+N creates a new file and an existing file can be opened by Ctrl+O. Each opened file can be added or removed to/from your current project. Ctrl+B creates or deletes bookmark and Ctrl+Shift+B creates or deletes breakpoint. Project files, the files which are parts of the project, are opened each time you open the project. You can have more than one project opened at the time.
+
+ Simulator can be started and shut down by pressing F2 key and assembler or compiler is run when F11 is pressed. Output from assembler or compiler is displayed on the bottom panel in tab ``Messages''. And main MCU simulator panel is also available on the bottom panel in tab ``Simulator''.
+
+ On the left side you can find list of currently opened source code files and list of project files. And on the right side probably most useful tool at the beginning might be ``Instruction~details'', this tool displays help for instruction in the code editor on line with cursor. In the right panel you can find for example also list of bookmarks and breakpoints.
+
+\chapter{Detailed introduction to GUI}
+ \section{Source code editor}
+ \subsection{Syntax highlight and validation}
+ \begin{wrapfigure}{r}{100pt}
+ \centering{}
+ \includegraphics[width=90pt]{img/036.png}
+ \caption{Syntax validation configuration button}
+ \end{wrapfigure}
+ The editor is equipped with an implementation of a syntax highlighting algorithm based on simplified syntax analysis. And that enables a limited on-line syntax validation. That means that as the user writes down the code, editor tries to check it for syntactical correctness. Syntax validator marks ``strange looking'' lines with exclamation mark and tries to underline exact point of potential syntax errors. This feature can be disabled as well as syntax highlighting can be disabled. By disabling these features you can make the editor work faster, but it would probably mean only a unnecessary limitation.
+ There are three levels of syntax validation:\\
+ \begin{itemize}
+ \item 0: Disabled
+ \item 1: Fast basic validation
+ \item 2: Slow advanced validation
+ \end{itemize}
+ Syntax validation configuration button react to left and right click with the mouse pointer. Right button click decreases the level of validation and the left button click increases it.
+ \subsection{Spell checking}
+ \begin{wrapfigure}{l}{100pt}
+ \centering{}
+ \includegraphics[width=90pt]{img/037.png}
+ \caption{Spell checker configuration button}
+ \end{wrapfigure}
+ There is also configurable spell checking function available. It underlines words which are marked by Hunspell\footnote{Hunspell is a spell checker and morphological analyzer. See \url{http://hunspell.sourceforge.net} for details.} as incorrectly spelled. This function applies to comments in the code or the entire code in case that the syntax highlight function has been disabled. User can choose from any of Hunspell or Myspell dictionaries installed on his or her system. This feature can also be turned off. It makes sense that this function is completely dependent on the Hunspell program, if it is not installed, spell checking won't work here.
+ \subsection{Auto-completion}
+ \begin{wrapfigure}{r}{180pt}
+ \centering{}
+ \includegraphics[width=170pt]{img/038.png}
+ \caption{Syntax highlight, syntax validation and the pop-up based auto-completion all in action}
+ \end{wrapfigure}
+ Pop-up based auto-completion is function which should make it easier to use long names for labels, macros, variables, functions, constants, etc. This function is interconnected with syntax editor's analyzer used for syntax highlight and validation and for the table of symbols in the right panel. So it maintains an overview of all symbols defined in your source code file and then when you write just a few characters which a symbol starts with, this function will pop-up window offering you all defined symbols beginning with that letters. Note that this feature can be disabled in editor configuration dialog and note also that besides symbols it offers also list of assembly language instruction mnemonics and assembler directives.
+ \subsection{Editor command line}
+ Editor is featured with a command line, which can be invoked by pressing F10 key by default. The command line appears below the editor above its status bar. From the command line you can perform variety of operations like conversions between various numerical bases, run simulator, insert current date and many more. In the command line it is sufficient to write just a few characters which the requested command starts with and which are sufficient to uniquely identify the command and press enter. You can see help for each command by running command \texttt{help list}. Command line is featured with its own color highlight, history and auto-completion.
+ {
+ \mysmallfont{}
+ \begin{longtable}{l|ll}
+ \textbf{Command} & \textbf{Arguments} & \textbf{Description} \\\hline
+ \endhead
+ \texttt{d2h} & <decimal number> & Convert decimal number into hexadecimal \\
+ \texttt{d2o} & <decimal number> & Convert decimal number into octal \\
+ \texttt{d2b} & <decimal number> & Convert decimal number into binary \\
+ \texttt{h2d} & <hexadecimal number> & Convert hexadecimal number into decimal \\
+ \texttt{h2o} & <hexadecimal number> & Convert hexadecimal number into octal \\
+ \texttt{h2b} & <hexadecimal number> & Convert hexadecimal number into binary \\
+ \texttt{o2h} & <octal number> & Convert octal number into hexadecimal \\
+ \texttt{o2d} & <octal number> & Convert octal number into decimal \\
+ \texttt{o2b} & <octal number> & Convert octal number into binary \\
+ \texttt{b2h} & <binary number> & Convert binary number into hexadecimal \\
+ \texttt{b2d} & <binary number> & Convert binary number into decimal \\
+ \texttt{b2o} & <binary number> & Convert binary number into octal \\
+ \texttt{animate} & & Animate simulated program \\
+ \texttt{assemble} & & Run assembler \\
+ \texttt{auto-indent} & & Automatically indent the edited code \\
+ \texttt{bookmark} & & Create or delete bookmark on the current line \\
+ \texttt{breakpoint} & & Create or delete breakpoint on the current line \\
+ \texttt{capitalize} & & Capitalize selected text \\
+ \texttt{clear} & & Clear history \\
+ \texttt{comment} & & Comment selection \\
+ \texttt{copy} & & Copy selection \\
+ \texttt{custom} & <command number> & Run user command \\
+ \texttt{cut} & & Cut selection \\
+ \texttt{date} & <date format> & Insert current time and/or date \\
+ \texttt{exit} & & Leave command line \\
+ \texttt{exit-program} & & Exit the IDE \\
+ \texttt{find} & <string> & Find a string \\
+ \texttt{goto} & <line number> & Go to the specified line \\
+ \texttt{help} & <command name> & Display help for the specified command \\
+ \texttt{char} & <character code> & Insert a character \\
+ \texttt{indent} & & Indent selection \\
+ \texttt{kill-line} & & Delete current line \\
+ \texttt{open} & <file name> & Open the specified file \\
+ \texttt{paste} & & Paste text from clipboard \\
+ \texttt{redo} & & Take back last undo \\
+ \texttt{reload} & & Reload current document \\
+ \texttt{replace} & <string> <replacement>& Replace a string with another string \\
+ \texttt{run} & & Run simulator in animation mode \\
+ \texttt{save} & & Save the current file \\
+ \texttt{set-icon-border}& & Show/Hide icon border \\
+ \texttt{set-line-numbers}& & Show/Hide line numbers \\
+ \texttt{sim} & & Engage/Disengage simulator \\
+ \texttt{step} & & Step simulated program \\
+ \texttt{tolower} & & Convert selected text to lowercase \\
+ \texttt{toupper} & & Convert selected text to uppercase \\
+ \texttt{uncomment} & & Comment current line \\
+ \texttt{undo} & & Undo the last text editing operation \\
+ \texttt{unindent} & & Decrease indentation level of the current line \\
+ \texttt{hibernate} & [<target file>] & Hibernate simulated program \\
+ \texttt{resume} & [<source file>] & Resume hibernated program \\
+ \texttt{switch-mcu} & <MCU name> & Switch current MCU simulation mode to another MCU \\
+ \texttt{set-xcode} & <size of XCODE mem.> & Set size external data memory for simulated MCU \\
+ \texttt{set-xdata} & <size of XDATA mem.> & Set size external program memory for simulated MCU \\
+ % Caption:
+ \caption{Available commands}
+ \end{longtable}
+ }
+
+ \section{Bottom panel}
+ \subsection{Main panel of the MCU simulator}
+ This panel is the main part of the simulator user interface. It shows all MCU registers along with content of internal data memory. And contains small toolbar with 6 buttons: ``\includegraphics[height=8pt]{img/launch.png}~Start''/``\includegraphics[height=8pt]{img/exit.png}~Shutdown'', ``\includegraphics[height=8pt]{img/rebuild.png}~Reset'', ``\includegraphics[height=8pt]{img/undo.png}~Step~back'', ``\includegraphics[height=8pt]{img/goto.png}~Step'', ``\includegraphics[height=8pt]{img/goto2.png}~Step~over'', ``\includegraphics[height=8pt]{img/1rightarrow.png}~Animate'' and ``\includegraphics[height=8pt]{img/2rightarrow.png}~Run''. All visible registers can be modified from here and most SFR registers are represented by enumeration of bits, where each particular bit can be modified separately, green color means logical one and red means zero. Each bit has its own tooltip help with short description of its purpose and status bar tip with bit address and bit name.
+ \begin{figure}[h!]
+ \centering{}
+ \caption{Main panel of the simulator}
+ \includegraphics[width=\textwidth]{img/001.png}
+ \end{figure}
+ \begin{figure}[h!]
+ \begin{minipage}[b]{.3\textwidth}
+ \centering{}
+ \includegraphics[width=50pt]{img/002.png}
+ \caption{Highlighted SFR register}
+ \end{minipage}
+ \begin{minipage}[b]{.3\textwidth}
+ \centering{}
+ \includegraphics[width=130pt]{img/003.png}
+ \caption{Tool tip help for a special function bit}
+ \end{minipage}
+ \begin{minipage}[b]{.3\textwidth}
+ \centering{}
+ \includegraphics[width=50pt]{img/004.png}
+ \caption{Representation of a register value in various numeric bases}
+ \end{minipage}
+ \end{figure}
+
+ \subsection{C variables}
+ This panel is a part of simulator user interface that maintains a list of global static variables defined in your C language code. Names of variables are displayed along with their current values in simulated MCU. If you program is not written in C language then this tool has no purpose for you at all. Otherwise the purpose of this panel is to make it easier to simulate a program for 8051 written in C language and see what is ``really'' happening in there. This tool is capable of extracting variable values from multiple registers and the displaying them as one variable, one value. Alteration of variable values is also possible. And search panel in the top right corner of the panel might help you with finding exact variable which you need to see. But note that functionality of this tool is in fact severely limited, it supports only global static variables, integers and floats, but variable value modification is allowed only for integer variables, no floats.
+
+ \subsection{Graph showing voltage levels}
+ This panel might help you to see what is happening on simulated GPIO\footnote{General Purpose Input Output} lines. Resolution and grid can be adjusted to better fit your needs. There are three graphs, one for port latches, one for port outputs (without any virtual HW) and one for the most realistic GPIO simulation which this IDE can do.
+ \begin{figure}[h!]
+ \centering{}
+ \includegraphics[width=\textwidth]{img/005.png}
+ \caption{GPIO Graph}
+ \end{figure}
+
+ \subsection{Messages panel}
+ This panel displays output from the build-in assembler, external assemblers, C compiler and other external tools used in this IDE, which prints something important to standard output. Output from assemblers and SDCC (C compiler) is parsed to highlight warnings and errors and convert them to hyperlinks pointing to source code if possible. The panel also implements a tool for searching strings in the displayed text. User can make this tools visible by pressing Ctrl+F.
+ \begin{figure}[h!]
+ \centering{}
+ \includegraphics[width=\textwidth]{img/007.png}
+ \caption{Messages panel}
+ \end{figure}
+
+ \subsection{Notes}
+ This is your personal notes for whatever you want. Originally it was intended for writing down a list of things which you need to finish in your work, so some sort of a to do list. But it is just a simple rich text editor with separate file specific notepad. User can use it as he or she consider appropriate.
+ \begin{figure}[h!]
+ \centering{}
+ \includegraphics[width=\textwidth]{img/006.png}
+ \caption{Personal notes}
+ \end{figure}
+
+ \subsection{Calculator}
+ Calculator is here more or less just for completeness. But you might still find it to a real asset to your efforts. This calculator is capable of performing common arithmetical operations, computing trigonometric functions, logical operations, etc. Supported numeral systems are hexadecimal, decimal, octal and binary in both integer and real numbers. Supported angular measurement units are degrees, radians and gradians. The calculator is also equipped with three memory cells where you can save arbitrary numbers for future computations. On the right side there is a simple calculator dedicated to calculation timers preset values for the specified time, clock frequency, etc. \footnote{Essentially the same but much more advanced function has also the special calculator.}
+ \begin{figure}[h!]
+ \centering{}
+ \includegraphics[width=\textwidth]{img/009.png}
+ \caption{Calculator}
+ \end{figure}
+
+ \subsection{Find in files}
+ With this tool you can search all files in certain directory which names matches specified GLOB\footnote{An instance of pattern matching behavior, for example ``*.c++'' matches all files with ``.c++'' extension.} pattern. The search is made for a plain string or regular expression match. This tool might be very useful when you are dealing with many, possibly large, source code files and you suddenly want to find something specific in them. Each line printed in the list of found entries is a hypertext link which opens the file mentioned in it in the source code editor and navigates the editor to line matching the item. In other words it generally the same as well known Unix command ``grep''\footnote{A command line text search utility originally written for Unix. The name is taken from the first letters in global/regular expression/print. Its official date of creation is given as March 3, 1973.}, but with graphical user interface.
+
+ \subsection{Terminal emulator}
+ This is a common color VT102\footnote{A video terminal that was made by Digital Equipment Corporation (DEC). Its detailed attributes became the de facto standard for terminal emulators.} terminal emulator for the X Window System\footnote{Computer software system and network protocol that provides a basis for graphical user interfaces.} as you probably know. More precisely It's embedded \href{http://software.schmorp.de/pkg/rxvt-unicode.html}{rxvt-unicode} terminal emulator by Marc A. Lehmann and others. Background and foreground colors used in the terminal emulator are configurable in ``Terminal~configuration~Dialog''. Note that this feature in not available on Microsoft\textregistered{} Windows\textregistered{} operating system and probably will never be, because terminal emulator would have only a little use there.
+ \begin{figure}[h!]
+ \centering{}
+ \includegraphics[width=\textwidth]{img/031.png}
+ \caption{Embedded \href{http://software.schmorp.de/pkg/rxvt-unicode.html}{rxvt-unicode} terminal emulator, with the \href{http://www.midnight-commander.org/}{Midnight Commander} running in it}
+ \end{figure}
+
+ \section{Left panel}
+ \subsection{List of opened files}
+ Shows list of all files opened withing the current project. Each entry has its own pop-up menu. Noteworthy features are search bar, sorting by name, size, etc. and open with an external editor. Each file can be added or removed from the list of project files. There is not much to say about it, it's just a simple list with a few nice features but nothing complex.
+
+ \subsection{List of project files}
+ Shows list of all files assigned to the current project. Each entry has its own pop-up menu. Noteworthy features are search bar, sorting by name, size, etc. and open with an external editor. Each file can be excluded from the list of project files, opened or close withing the project.
+
+ \subsection{SFR watches}
+ \begin{wrapfigure}{l}{130pt}
+ \centering{}
+ \includegraphics[width=110pt]{img/032.png}
+ \caption{SFR watches}
+ \end{wrapfigure}
+ From here you can see all special function registers on your chosen MCU in one compact list. Search panel might help you locating particular SFR in this panel and also in the main simulator panel. Each register has two numerical representations of its value in the simulated MCU, decimal and hexadecimal.
+
+ \subsection{File system browser}
+ This panel should help you quickly navigate in your file system in order to open files you want to see as quickly as possible. But many people generally don't like panels like this and will always use only file selection dialog instead.
+
+ \section{Right panel}
+ \subsection{List of bookmarks}
+ From here you can easily navigate trough all bookmarks made in the current source code file. The panel also highlights item in the list which corresponds to the current line (line with cursor) in the source code editor. You can also remove all bookmarks at once by pressing the ``\includegraphics[height=8pt]{img/editdelete.png}~Clear~all'' button.
+
+ \subsection{List of breakpoints}
+ Pretty much the same as list of bookmarks, but this panel shows breakpoints instead of bookmarks, that is the only difference.
+
+ \subsection{Instruction details}
+ \begin{wrapfigure}{r}{210pt}
+ \centering{}
+ \includegraphics[width=200pt]{img/008.png}
+ \caption{Instruction details}
+ \end{wrapfigure}
+ When you are writing a code in the assembly language, this panel might be a great help for you. It shows all valid sets of operands for the instruction on your current cursor position in the source code and highlights the set which you are probably using. The same works also for directives. Each line in list has its own help window which appears when user points at it by the pointer. This help window shows additional details regarding the exact instruction. Note also the ``\includegraphics[height=8pt]{img/help.png}~Show~legend'' button in the upper right corner of the panel.
+
+ \subsection{Data register watches}
+ \begin{wrapfigure}{l}{130pt}
+ \centering{}
+ \includegraphics[width=120pt]{img/033.png}
+ \caption{Data register watches}
+ \end{wrapfigure}
+ This panel might help you to keep track of specific data registers, except for SFR and EEPROM. User can add arbitrary data memory registers which he or she consider to be the most important for his or her current work. You can add a register in the bottom part of the panel. And you can search for specific register, configure the panel and save or load the list of register in the top panel.
+
+ This tool is capable of extraction of used symbols from a code listing file\footnote{File with \fileextension{.lst} file name extension.} generated by an assembler. This feature can enabled or disabled in the panel's configuration menu. The current list of watched registers can be saved into a file and loaded from a file\footnote{These file usually have extension \fileextension{.wtc}}.
+
+ Memory segments are distinguished by format of the addresses. As you can seen in the example, the meaning is this:
+ \begin{table}[h!]
+ \mysmallfont{}
+ \centering{}
+ \begin{tabular}{l|l}
+ \textbf{Address format} & \textbf{Memory segment} \\
+ \hline
+ 1 or 2 digits & Internal RAM (not SFR) \\
+ 3 digits & Expanded RAM \\
+ 4 digits & External RAM \\
+ dot and 2 digits & Bit (including SFR area) \\
+ \end{tabular}
+ \caption{Data register watches: Register address}
+ \end{table}
+
+ \subsection{Subprograms call monitor}
+ \begin{wrapfigure}{r}{130pt}
+ \centering{}
+ \includegraphics[width=120pt]{img/034.png}
+ \caption{Subprograms call monitor}
+ \end{wrapfigure}
+ From here you can monitor all subprogram and interrupt calls in your program. For each entry there is mentioned the type of call, \texttt{acall}, \texttt{lcall} or interrupt, return address and address from which the call was invoked. And you can force each of them to premature return.
+
+ \subsection{List of symbols}
+ This tools shows a list of symbols defined in source code of your program, works for both assembly language and C language. The list is managed automatically as the user edit the code and is featured with search panel for easy navigation. Types of symbols can be distinguished by their colors and icons. Colors of particular symbols corresponds to the colors used in the source code editor to highlight them.
+ \begin{table}[h]
+ \mysmallfont{}
+ \centering{}
+ \begin{tabular}{ll}
+ \includegraphics[height=8pt]{img/symbol1.png} & {\color{highlight_label} Label} \\
+ \includegraphics[height=8pt]{img/symbol3.png} & {\color{highlight_constant} Constant} \\
+ \includegraphics[height=8pt]{img/symbol2.png} & {\color{highlight_macro} Macro} \\
+ \includegraphics[height=8pt]{img/symbol4.png} & {\color{black} C variable} \\
+ \includegraphics[height=8pt]{img/symbol0.png} & {\color{blue} C function} \\
+ \includegraphics[height=8pt]{img/symbol5.png} & {\color{black} Other} \\
+ \end{tabular}
+ \caption{Symbol colors and icons in default settings}
+ \end{table}
+
+
+ \subsection{HW plug-ins manager}
+ This tool does just one thing, allows user to use plug-ins in MCU~8051~IDE. Primary purpose of these plug-ins should be implementation of inter-operation with certain hardware tools, most probably MCU programmers. if you are interested in writing these plug-ins, please refer to chapter \ref{sec:WritingHardwareToolControlPlugIns}.
+
+ \section{Other tools}
+ \subsection{SFR map}
+ A tabular overview of all available SFRs on your MCU. This tool has similar graphical form as tables of SFR often used in 8051 manuals, but the most important difference is that this one is connected to the simulator and is capable of representing and modifying current values of SFRs in the MCU simulator.
+
+ \subsection{Map of bit addressable area}
+ \begin{wrapfigure}{l}{160pt}
+ \centering{}
+ \includegraphics[width=130pt]{img/017.png}
+ \caption{Map of the bit addressable area}
+ \end{wrapfigure}
+ This tool is a part of the simulator user interface. It shows all bits in the bit addressable area of the simulated MCU. Each square represents one bit, when simulator is on, you can also change value of each one of them by clicking on it. Labels and color used here should be hopefully clear from the legend at the bottom.
+
+ \subsection{Stack monitor}
+ \begin{wrapfigure}{r}{90pt}
+ \centering{}
+ \includegraphics[width=80pt]{img/022.png}
+ \caption{Stack monitor}
+ \end{wrapfigure}
+ This tool makes it possible to see entire MCU stack in one view. You can also push any value you want onto the stack or pop a value from it at any time. However this particular tool does not allow for changing the values on the tack in any other way than these.
+
+ Each line in the stack monitor represents one octet in the stack, each octet is represented in four numerical bases, hexadecimal, decimal, binary and octal and also as a character according to ACII chart. Newly added values are pushed on the top of the list. And their origins are distinguished by background color of the address. These colors are explained in the legend on bottom.
+
+ Note that button ``Clear'' doe not clear the stack but instead it clear only the monitor! Buttons ``POP'' and ``PUSH'' are intended for manipulation with the stack's content.
+
+ \subsection{Symbol viewer}
+ \begin{wrapfigure}{l}{160pt}
+ \centering{}
+ \includegraphics[width=140pt]{img/019.png}
+ \caption{Symbol viewer}
+ \end{wrapfigure}
+ Symbol viewer shows the table of symbols defined in your program, it works only for assembly language. The table content is taken from code listing generated by assembler. In the top part of the window you can find search bar, and in the bottom part you can specify filter criteria for what you want to see in the table and specify sorting order of the symbols displayed. Symbol in this context are various constants and labels.
+
+ \begin{figure}[h!]
+ \begin{minipage}[t]{.5\textwidth}
+ \centering{}
+ \caption{ASCII chart}
+ \includegraphics[width=.9\textwidth]{img/039.png}
+ \end{minipage}
+ \begin{minipage}[t]{.5\textwidth}
+ \centering{}
+ \caption{8051 Instruction Table}
+ \includegraphics[width=.9\textwidth]{img/040.png}
+ \end{minipage}
+ \end{figure}
+
+ \clearpage
+ \subsection{ASCII chart}
+ Colorful interactive ASCII chart, it may proof handy especially when you are dealing with serial communication and this sort of things.
+
+ \subsection{8051 Instruction Table}
+ Colorful interactive 8051 instruction table, very much alike the ASCII chart. But instead of ASCII code you can find there the complete table of 8051 instruction mnemonics, OP codes and related things.
+
+ \subsection{8-segment editor}
+ \begin{wrapfigure}{r}{140pt}
+ \centering{}
+ \includegraphics[width=120pt]{img/020.png}
+ \caption{8-segment editor}
+ \end{wrapfigure}
+ With this tool you can easily determine what value you have to set on a port to display a digit on a numerical LED display. In the left part of the dialog window, you can find numerical values corresponding to the digit displayed in the middle part. These values are represented for both common cathode and anode and in three numerical bases, hexadecimal, decimal and octal. Buttons on left side from entry boxes copies value from adjacent entry box into clipboard. In the right part of the window you can set what port pin is connected to what LED segment.
+
+ \subsection{Stopwatch}
+ Stopwatch is a tool which can measure certain things in the simulated processor, such as number of instructions processed so far, number of microseconds which would it take for a real processor to execute, number of breakpoints met so far etc. User can also set it to stop the simulation when certain limit in the measurement has been met or exceeded.
+
+ \subsection{Scribble notepad}
+ This is something like a small whiteboard, where you can draw of write your notes. It is a little bit more free than conventional text editor. You can also insert images, supported image formats are PNG and a few others. But don't rely on the scribble notepad to much, this tool has no save or load functions, anything you draw or write there is just temporary and it will not recover upon next start of the IDE.
+
+ \subsection{Base converter}
+ \begin{wrapfigure}{l}{120pt}
+ \centering{}
+ \includegraphics[width=110pt]{img/021.png}
+ \caption{Base convertor}
+ \end{wrapfigure}
+ When you are programming micro-controllers, you might want to convert numbers between various numeric bases. One could say that everyone dealing with such things as micro-controllers would be able to do these conversion without use of any tool. But this doesn't mean that such a tool can never be useful. Values written in the entry boxes of the base converter are saved when user leaved the IDE and are recovered upon next start along with all opened base converter tool windows.
+
+ \subsection{RS-232 debugger}
+ \begin{wrapfigure}{r}{190pt}
+ \centering{}
+ \includegraphics[width=180pt]{img/035.png}
+ \caption{UART/RS-232 debugger}
+ \end{wrapfigure}
+ This tool is capable of transmitting and receiving data to/from RS-232 port in your computer, today personal computers usually do not have this type of port, but you can always use something like a USB to RS-232 bridge.
+
+ I assume here that the reader is familiar with the RS-232 communication protocol and related terms. This tool acts as a \texttt{DTE}\footnote{Data Terminal Equipment, the other side is \texttt{DCE} (Data Circuit-terminating Equipment).}.
+
+ On the diagram in the upper left corner you can see current logical level on each of RS-232 wires except for \texttt{RxD} and \texttt{TxD}. You can also set value for wires \texttt{DTR}\footnote{Data Terminal Ready} and \texttt{RTS}\footnote{Ready To Send} and trigger the break by button \texttt{BREAK}.
+
+ Right upper corner contains configuration controls, their functions should be mostly obvious. Check-box ``Enable~reception'' enables or disables writing to hexadecimal editor ``Received~data''. Button ``Close'' closes the opened physical port. And button ``\includegraphics[height=8pt]{img/reload.png}'' refreshes the list of available physical ports.
+
+ In the bottom part you can see two hexadecimal editors: ``Data~to~send'' and ``Received~data''. These are representations of data which we are dealing with. By button ``Receive~here'' you can set address in the hexadecimal editor where the received data will be written. And by button ``Send~selected'' you can trigger transmission over the opened physical port, selected chunk of the data will be send then. Button ``Clear~selected'' are intended for removing data from the hexadecimal editors editors.
+
+ \subsection{Hexadecimal editors}
+ \begin{wrapfigure}{l}{200pt}
+ \centering{}
+ \includegraphics[width=190pt]{img/023.png}
+ \caption{MCU code memory editor}
+ \end{wrapfigure}
+ In this IDE there are several hexadecimal editors used for various purposes. Each of these editors is equipped with a string search tool and address bars of the left and top side. And in some cases with file saving and loading capability, numerical base switch, ASCII view and a navigation bar at the bottom. Editing is allowed only in overwrite mode, copy and paste works as usual, search dialog can be invoked by pressing Ctrl+F and user can switch between view (left and right) by pressing Tab key. Non printable characters in ASCII view are displayed in red color.
+
+ \paragraph{MCU code memory editor} allows user to see and modify contents of the CODE memory of the simulated micro-controller. Special feature of this particular editor is that instruction OP code currently pointed by program counter (PC) is highlighted with dark orange background along with the instruction's operands. And the same applies also for the previously executed instruction but highlight color is light orange in this case.
+
+ \paragraph{MCU data/xdata/eeprom memory editor} allows user to see and modify contents of the IDATA/XDATA/EEPROM memory of the simulated micro-controller. Special features of this editors are that recently changed octets are highlighted with light orange foreground color and octets currently being written into the memory are highlighted with gray background color.
+
+ \paragraph{MCU eeprom write buffer editor} allows to see and modify EEPROM write buffer. Current EEPROM write offset is displayed as well.
+
+ \paragraph{Independent hexadecimal editor} is universal hexadecimal editor with maximum capacity of 64kB and support for Intel\textregistered 8 HEX file format. This tool is completely independent from your project in the IDE. This too might be particularly useful when you want to and possibly modify content of a Intel\textregistered 8 hex file, but do not alter the simulated MCU.
+
+ \subsection{Hibernation of simulated program}
+ The IDE is capable of saving execution state of the simulated program into a file and resuming the program from it anytime later. The file, usually with extension \fileextension{.m5ihib}, contains values of all data registers including SFR in the simulated MCU along with other values determining MCU state as for example list of active interrupts. The file is in XML format, human readable and usually occupies a few tens of kilobytes.The file does not contain content of the CODE memory, so it has to be available somewhere else in a separate file.
+
+ \subsection{Interrupt monitor}
+ Interrupts monitor is a specialized tool intended for viewing and manipulating with interrupts in simulated MCU. With interrupt monitor you can invoke any interrupt you want at any time, force any interrupt at any time to return, change interrupt priorities or disable or enable particular interrupts. You can also see all interrupts synoptically in one window and alter values of their configuration flags.
+ \begin{figure}[h!]
+ \centering{}
+ \includegraphics[width=300pt]{img/018.png}
+ \caption{Interrupt monitor}
+ \end{figure}
+
+ \subsection{Conversions between *.hex, *.bin and *.adf files}
+ Sometimes it might prove helpful to have some tool to convert a binary file to Intel\textregistered 8 Hex and vice versa. For this purpose MCU~8051~IDE is equipped with a simple tool set for this purpose. In the ``\menuitem{Main Menu}'' $\rightarrow$ ``\menuitem{Utilities}'' you can find these tools:
+ \begin{itemize}
+ \setlength{\itemsep}{-3pt}
+ \item \includegraphics[height=8pt]{img/hb.png} \textbf{HEX $\rightarrow$ BIN} \\
+ Convert Intel\textregistered 8 Hex file to raw binary file
+ \item \includegraphics[height=8pt]{img/bh.png} \textbf{BIN $\rightarrow$ HEX} \\
+ Convert raw binary file to Intel\textregistered 8 Hex
+ \item \includegraphics[height=8pt]{img/sh.png} \textbf{SIM $\rightarrow$ HEX} \\
+ Convert simulator assembler debug file (\fileextension{.adf}) to Intel\textregistered 8 Hex file
+ \item \includegraphics[height=8pt]{img/sb.png} \textbf{SIM $\rightarrow$ BIN} \\
+ Convert simulator assembler debug file (\fileextension{.adf}) to raw binary file
+ \item \includegraphics[height=8pt]{img/hh.png} \textbf{Normalize Hex} \\
+ Read and rewrite the given Intel\textregistered 8 Hex file, so that all records satisfies specified maximum length (can be set in the assembler configuration dialog), all records are in incremental order and no records overlaps with others.
+ \end{itemize}
+
+ \subsection{Normalization of source code indentation}
+ Uniformly indented code is always more aesthetically pleasing and more readable. When you don't have the luxury of having such a code from the first hand, perhaps you will find this feature helpful. This function is available for assembly language and C language if program indent is installed on your system. User can access this function from the ``\menuitem{Main Menu}'' $\rightarrow$ ``\menuitem{Tools}'' $\rightarrow$ ``\menuitem{Auto indent}''.
+
+ \noindent
+ \begin{center}
+ \small{A small example of the auto indent function in action}
+ \end{center}
+ \begin{minipage}{\textwidth}
+ \twocolumn
+ \begin{minipage}[t]{.5\textwidth}
+ \mysmallfont{}
+ \textbf{Original code:}\\
+ \verb' '{\color{highlight_constant}\verb'abc'}\verb' '{\color{highlight_directive}\verb'DATA'}\verb' '{\color{highlight_hex}\verb'7Fh'}\\
+ \verb' '{\color{highlight_comment}\verb'; Start at address 0x00'}\\
+ \verb' '{\color{highlight_directive}\verb'ORG'}\verb' '{\color{highlight_hex}\verb'0h'}\\
+ \verb' '{\color{highlight_label}\verb'label0:'}{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_sfr}\verb'R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cjne'}\verb' '{\color{highlight_sfr}\verb'R0'}\verb' '{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_constant}\verb'#abc'}\verb' '{\color{highlight_oper_sep}\verb','}{\color{highlight_constant}\verb'label0'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#0h'}\\
+ \verb' '{\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'label0'}\\
+ \verb' '{\color{highlight_comment}\verb'; End of assembly'}\\
+ \verb' '{\color{highlight_directive}\verb'END'}\\
+ \end{minipage}\begin{minipage}[t]{.5\textwidth}
+ \mysmallfont{}
+ \textbf{Automatically intended code:}\\
+ {\color{highlight_constant}\verb'abc'}\verb' '{\color{highlight_directive}\verb'DATA'}\verb' '{\color{highlight_hex}\verb'7Fh'}\\
+ \verb' '{\color{highlight_comment}\verb'; Start at address 0x00'}\\
+ \verb' '{\color{highlight_directive}\verb'ORG'}\verb' '{\color{highlight_hex}\verb'0h'}\\
+ {\color{highlight_label}\verb'label0:'}\verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_sfr}\verb'R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cjne'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_constant}\verb'#abc'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_constant}\verb'label0'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#0h'}\\
+ \verb' '{\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'label0'}\\
+ \verb' '{\color{highlight_comment}\verb'; End of assembly'}\\
+ \verb' '{\color{highlight_directive}\verb'END'}\\
+ \end{minipage}
+ \onecolumn
+ \end{minipage}
+
+ \subsection{Change letter case}
+ \begin{wrapfigure}{r}{150pt}
+ \centering{}
+ \includegraphics[width=140pt]{img/042.png}
+ \caption{Change letter case dialog}
+ \end{wrapfigure}
+ This tool can change letter casing to upper or lower case of certain types tokens which your source consists of of. For example you can easily convert all instruction mnemonics in the code to uppercase. It is intended for users who strictly prefers one or another convention of letter casing in assembly language. You can invoke the tool from ``\menuitem{Main Menu}'' $\rightarrow$ ``\menuitem{Tools}'' $\rightarrow$ ``\menuitem{Change letter case}''.
+ \begin{itemize}
+ \setlength{\itemsep}{-3pt}
+ \item \includegraphics[height=8pt]{img/up0.png} Convert to uppercase
+ \item \includegraphics[height=8pt]{img/down0.png} Convert to lowercase
+ \item \includegraphics[height=8pt]{img/button_cancel.png} Keep current case
+
+ \end{itemize}
+
+ \subsection{User defined commands}
+ \paragraph{Introduction}
+ This feature was added in order to enable for use of any auxiliary tools which might useful while working in this IDE. For instance, some hardware tools or some sort of a source code management system like Git or SVN. These custom commands are basically mere Bash scripts with some kind of pseudo-variables available in it. These pseudo-variables are formed as strings beginning with ``\texttt{\%}''. Before each script execution they are expanded to values corresponding to their meaning. For instance ``\texttt{\%filename}'' expands to the name of the current file. Note that ``\texttt{\%\%}'' is expanded as single ``\texttt{\%}''.\\
+ \begin{table}[htp]
+ \centering{}
+ \mysmallfont{}
+ \begin{tabular}{|l|l|}
+ \hline
+ \textbf{Pseudo-variable} & \textbf{Meaning} \\
+ \hline
+ \%URL & The full URL of the current file \\
+ \%URLS & List of the URLs of all open documents \\
+ \%directory & Project directory \\
+ \%filename & The file name of the current document \\
+ \%basename & Same as \%filename, but without extension \\
+ \%mainfile & Name of project main file \\
+ \%line & Number of the current line \\
+ \%column & Number of the current column \\
+ \%selection & The selected text in the current file \\
+ \%text & The full text of the current file \\
+ \hline
+ \end{tabular}
+ \caption{List of pseudo-variables}
+ \end{table}
+
+ \paragraph{Configuration}
+ There is specialized configuration dialog for these custom commands.
+ \begin{wrapfigure}{r}{150pt}
+ \centering{}
+ \includegraphics[width=140pt]{img/010.png}
+ \caption{Custom commands configuration dialog}
+ \end{wrapfigure}
+
+ \paragraph{Execution}
+ After the script is executed successfully or not, dialog showing the results will appear upon completion of the script. This dialog contains all textual output from the script caught on standard output and standard error output. If the script outputs anything to the standard error output it is considered unsuccessful.
+
+ \subsection{Clean-up project folder}
+ This tool can proof useful particularly when your project directory gets ``polluted'' with lots of unnecessary files, and you want to get rid of them easily and first of all safely. It removes files with certain file name extensions from the project folder. The list of removed files is then written in results dialog. Available from ``\menuitem{Main Menu}'' $\rightarrow$ ``\menuitem{Tools}'' $\rightarrow$ ``\menuitem{Clean up project folder}''.
+
+ \subsection{File statistic}
+ Display certain statistical information about the current source code file. ``\menuitem{Main Menu}'' $\rightarrow$ ``\menuitem{File}'' $\rightarrow$ ``\menuitem{File statistic}''.
+
+ \section{Configuration dialogues}
+ Configuration dialogues are graphical tools for customization of this integrated development environment. And they comprises of these components:
+
+ \paragraph{Editor configuration}
+ \begin{wrapfigure}{l}{100pt}
+ \centering{}
+ \includegraphics[width=90pt]{img/027.png}
+ \caption{Editor configuration dialog}
+ \end{wrapfigure}
+ In editor configuration dialog user can change preferred editor from default built-in editor to for example Vim or Emacs and modify configuration the built-in editor. Configurable are colors used for syntax highlight, colors for text area background and so on, font used by editor, indentation mode, auto-save interval and others.
+
+ \paragraph{Compiler configuration}
+ Compiler configuration dialog allows user to configure behavior of the built-in assembler, chose another assembler instead of this one. Configure the preferred assembler and configure the C compiler (SDCC). Compiler configuration is stored in the project file (the file with \fileextension{.mcu8051ide} extension). So these setting are specific to the one specific MCU~8051~IDE project.
+
+ Currently supported external assemblers are these:
+ \begin{itemize}
+ \setlength{\itemsep}{-3pt}
+ \item ASEM-51 \footnote{A really useful assembler written by W.W. Heinz. You can find it at \url{http://plit.de/asem-51/home.htm}}
+ \item ASL \footnote{Available at http://linux.maruhn.com/sec/asl.html}
+ \item AS51 \footnote{Available at http://www.pjrc.com/tech/8051}
+ \end{itemize}
+
+ How to link multiple files when using C language:\footnote{This feature is not yet supported on MS Windows.}
+ \begin{enumerate}
+ \item Write makefile,
+ \item set the IDE to use your makefile instead of calling the C compiler directly (Configuration -> Compiler~configuration -> GNU~make~utility),
+ \item start compilation as usual.
+ \end{enumerate}
+
+ \paragraph{Simulator configuration}
+ Simulator configuration dialog configures these:
+ \begin{enumerate}
+ \item How to treat indeterminable values in simulator engine
+ \item How many steps will be remembered during the simulation for later backward steps.
+ \item What warning conditions will be ignored during the simulation
+ \end{enumerate}
+
+ \paragraph{Right panel configuration}
+ Configures colors used in tools ``Instruction details'' and ``Register watches'' in the right panel.
+
+ \paragraph{Main toolbar configuration}
+ Configures contents of main application tool bar.
+ \begin{figure}[h!]
+ \centering{}
+ \includegraphics[width=\textwidth]{img/041.png}
+ \caption{Main toolbar}
+ \end{figure}
+
+ \paragraph{Custom commands configuration}
+ Configures user defined commands, which are essentially Bash scripts. This feature is currently not available on MS\textregistered Windows\textregistered OS.
+
+ \paragraph{Shortcuts configuration}
+ Configures key shortcuts used in the IDE.
+
+ \paragraph{Terminal emulator configuration}
+ Configures terminal emulator at the bottom panel. This terminal emulator is embedded \href{http://software.schmorp.de/pkg/rxvt-unicode.html}{rxvt-unicode}. User can set foreground color and background color of the terminal emulator window and the font. This feature is currently not available on MS\textregistered Windows\textregistered OS.
+
+ \paragraph{Global MCU~8051~IDE configuration}
+ \begin{wrapfigure}{r}{100pt}
+ \centering{}
+ \includegraphics[width=90pt]{img/028.png}
+ \caption{Global configuration dialog}
+ \end{wrapfigure}
+ Changes settings like GUI language, size of fonts used in the GUI, GUI widget style, whether splash screen should be displayed each time when the IDE is started and so on.
+
+\chapter{Build-in macro-assembler}
+ In this chapter we will be concerned with MCU~8051~IDE build-in assembler. \footnote{This assembler manual is inspired by ASEM-51 manual, a great work done by W.W. Heinz} With syntax of its statements, directives and 8051 assembler instructions. I assume that the reader is familiar with general concepts of assembly language programming and 8051 architecture. So I will not explain these here.
+
+ \section{Statements}
+ Source code files for this assembler must be text files where lines are formed like these:\\\bigskip
+ {
+ \mysmallfont{}
+ \texttt{}
+ \begin{tabular}[h!]{llll}
+ \verb'[' { \color{highlight_label} label: } \verb']' &
+ \verb'[' { \color{highlight_instruction} instruction } &
+ \verb'[' { \color{highlight_symbol} operand } \verb'[' , { \color{highlight_symbol} operand } \verb'[' , { \color{highlight_symbol} operand } \verb']' \verb']' \verb']' &
+ \verb'[' { \color{highlight_comment} ;comment } \verb']' \\
+
+ \verb'[' { \color{highlight_label} label: } \verb']' &
+ { \color{highlight_directive} directive } &
+ \verb'[' { \color{highlight_symbol} argument } \verb']' &
+ \verb'[' { \color{highlight_comment} ;comment } \verb']' \\
+
+ { \color{highlight_constant} symbol } &
+ { \color{highlight_directive} directive } &
+ { \color{highlight_symbol} argument } &
+ \verb'[' { \color{highlight_comment} ;comment } \verb']' \\
+ \end{tabular}
+ }
+ \bigskip
+
+ Everything in square brackets is optional. Compilation does not go beyond line containing ``\texttt{end}'' directive, so after that directive the code do not have to be syntactically valid. Empty lines are allowed as well as line containing only comment or label. Statements can be separated by spaces, NBSP characters\footnote{No Breaking Space (0xC2)} and tabs. Statements are case insensitive and their length is not limited, overall line length is also not limited.
+
+ \begin{code}[h!]
+ \mysmallfont{}
+ {\color{highlight_label}\verb'start:'}\verb' '{\color{highlight_comment}\verb'; Start timer 0 in mode 2'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'R5'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#0h'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'IE'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#0FFh'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'TL0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_dec}\verb'#255d'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'TMOD'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#03h'}\\
+ \verb' '{\color{highlight_instruction}\verb'setb'}\verb' '{\color{highlight_sfr}\verb'TR0'}\\
+ \verb' '{\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'main'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; Main loop'}\\
+ {\color{highlight_label}\verb'main:'}\verb' '{\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'$'}\verb' '{\color{highlight_comment}\verb'; Inifinite loop'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; Program end'}\\
+ \verb' '{\color{highlight_directive}\verb'end'}\\
+
+ % Caption
+ \caption{An example of well formed assembly language code}
+ \end{code}
+
+ \section{Symbols}
+ Symbol names for numbers, macros or addresses defined by user in the code using appropriate directive. Like with ``\texttt{equ}'' directive you can define a new symbol and assign a value to it right away. Symbols may consist of upper and lower case letter, digits and underscore character (``\_''), their length is not limited, they are case insensitive and they can be the same as language keywords. Be aware of that there cannot coexists two or more symbols in the same memory segment which differs only by letter casing, in other words symbols ``\texttt{abc}'' and ``\texttt{ABC}'' are completely the same thing.
+
+ \section{Constants}
+ There are two types of constants numeric constants and character constants. Numeric constants consist of a sequence of digits allowed for the numeric base used and followed by the radix specifier. If the number begins with a letter, there must be the zero digit placed before the number. For example ``abh'' is not valid numeric constant, but ``0abh'' is. Character constants consist of sequence of one or more characters enclosed by quote character (\verb"'"). C escape sequences can be used in character constants. If you want to place quote character (\verb"'") into the constant, you can either place two quotes instead of one (``\verb"''''"'') or escape the quote, that means place backslash ``\\\\'' before it. There is significant difference between single character constant and multiple character one. Single character constant is regarded by assembler as 8 bin integer number and multiple character constant is a string, a sequence of characters. Since version 1.4.1 it is possible to use prefix ``0x'' (and ``0X'') as radix specifier for hexadecimal numbers, so ``0xaf'' is the same as ``0afh'', etc.
+
+ \begin{table}[h!]
+ \mysmallfont{}
+ \centering{}
+ \begin{tabular}{|l|l|l|}
+ \hline
+ Constant type & Allowed digits & Radix specifier \\
+ \hline
+ Binary & 0 .. 1 & B \\
+ Octal & 0 .. 7 & O or Q \\
+ Decimal & 0 .. 9 & D or none \\
+ Hexadecimal & 0 .. 9, A .. F & H \\
+ \hline
+ \end{tabular}
+ \caption{Radix specifiers}
+ \end{table}
+
+ \begin{code}[h!]
+ \mysmallfont{}
+ {\color{highlight_comment}\verb'; These are the same number'}\\
+ {\color{highlight_constant}\verb'a'}\verb' '{\color{highlight_directive}\verb'set'}\verb' '{\color{highlight_bin}\verb'100111b'}\verb' '{\color{highlight_comment}\verb'; Binary'}\\
+ {\color{highlight_constant}\verb'a'}\verb' '{\color{highlight_directive}\verb'set'}\verb' '{\color{highlight_oct}\verb'47q'}\verb' '{\color{highlight_comment}\verb'; Octal'}\\
+ {\color{highlight_constant}\verb'a'}\verb' '{\color{highlight_directive}\verb'set'}\verb' '{\color{highlight_dec}\verb'39d'}\verb' '{\color{highlight_comment}\verb'; Decimal'}\\
+ {\color{highlight_constant}\verb'a'}\verb' '{\color{highlight_directive}\verb'set'}\verb' '{\color{highlight_hex}\verb'27h'}\verb' '{\color{highlight_comment}\verb'; Hexadecimal'}\\
+ {\color{highlight_constant}\verb'a'}\verb' '{\color{highlight_directive}\verb'set'}\verb' '{\color{highlight_string}\verb''\verb"'"\verb''\verb"'"\verb''\verb"'"\verb''\verb"'"\verb''}\verb' '{\color{highlight_comment}\verb'; Character'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; This is an example of string'}\\
+ {\color{highlight_directive}\verb'db'}\verb' '{\color{highlight_string}\verb''\verb"'"\verb'string'\verb"'"\verb''}\verb' '{\color{highlight_comment}\verb'; String'}\\
+
+ % Caption
+ \caption{An example of constants}
+ \end{code}
+
+ \section{Expressions}
+ Arithmetical expressions are evaluated at compilation time and replaced by assembler with constant corresponding the their resulting value. Expressions comprises of arithmetical operators, constants, symbols and another expressions. An example of such expression might be \texttt{(~X~XOR~0FF00H~)}
+
+ \begin{table}[h!]
+ \mysmallfont{}
+ \centering{}
+ \begin{tabular}{|l|l|l|}
+ \hline
+ Operator & Description & Example \\\hline
+ \multicolumn{3}{|l|}{\textbf{Unary Operators}} \\\hline
+ NOT & one's complement & NOT 0a55ah \\\hline
+ HIGH & high order byte & HIGH 0a55ah \\\hline
+ LOW & low order byte & LOW 0a55ah \\\hline
+ \multicolumn{3}{|l|}{\textbf{Binary Operators}} \\\hline
+ + & unsigned addition & 11 + 12 \\\hline
+ - & unsigned subtraction & 13 + 11 \\\hline
+ * & unsigned multiplication & 3 * 5 \\\hline
+ / & unsigned division & 20 / 4 \\\hline
+ MOD & unsigned remainder & 21 MOD 4 \\\hline
+ SHL & logical shift left & 32 SHL 2 \\\hline
+ SHR & logical shift right & 32 SHR 2 \\\hline
+ AND & logical and & 48 AND 16 \\\hline
+ OR & logical or & 370q OR 7 \\\hline
+ XOR & exclusive or & 00fh XOR 005h \\\hline
+ . & bit operator & P1.4 \\\hline
+ EQ, = & equal to & 11 EQ 11 \\\hline
+ NE, <> & not equal to & 11 NE 11 \\\hline
+ LT, < & less than & 11 LT 12 \\\hline
+ LE, <= & less or equal than & 11 LT 11 \\\hline
+ GT, > & greater than & 12 GT 11 \\\hline
+ GE, >= & greater or equal than & 12 GT 11 \\\hline
+ \end{tabular}
+ \caption{Expression operators}
+ \end{table}
+
+ \begin{code}[h!]
+ \mysmallfont{}
+ {\color{highlight_constant}\verb'abc'}\verb' '{\color{highlight_directive}\verb'EQU'}\verb' '{\color{highlight_symbol}\verb'('}\verb' '{\color{highlight_unknown_base}\verb'2000'}\verb' '{\color{highlight_symbol}\verb'*'}\verb' '{\color{highlight_unknown_base}\verb'3'}\verb' '{\color{highlight_symbol}\verb'/'}\verb' '{\color{highlight_unknown_base}\verb'100'}\verb' '{\color{highlight_symbol}\verb')'}\\
+ {\color{highlight_constant}\verb'xyz'}\verb' '{\color{highlight_directive}\verb'SET'}\verb' '{\color{highlight_symbol}\verb'( LOW'}\verb' '{\color{highlight_constant}\verb'abc'}\verb' '{\color{highlight_symbol}\verb')'}\\
+ {\color{highlight_directive}\verb'IF'}\verb' '{\color{highlight_symbol}\verb'('}\verb' '{\color{highlight_constant}\verb'abc'}\verb' '{\color{highlight_symbol}\verb'>'}\verb' '{\color{highlight_symbol}\verb'('}\verb' '{\color{highlight_unknown_base}\verb'5'}{\color{highlight_symbol}\verb' MOD'}\verb' '{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_symbol}\verb')'}\verb' '{\color{highlight_symbol}\verb')'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_symbol}\verb'#'}\verb' '{\color{highlight_symbol}\verb'('}\verb' '{\color{highlight_symbol}\verb'('}\verb' '{\color{highlight_hex}\verb'15h'}{\color{highlight_symbol}\verb' XOR'}\verb' '{\color{highlight_unknown_base}\verb'12'}\verb' '{\color{highlight_symbol}\verb') OR'}\verb' '{\color{highlight_constant}\verb'xyz'}\verb' '{\color{highlight_symbol}\verb')'}\\
+ {\color{highlight_directive}\verb'ELSE'}\\
+ \verb' '{\color{highlight_instruction}\verb'ADDC'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_symbol}\verb'#'}\verb' '{\color{highlight_symbol}\verb'( HIGH'}\verb' '{\color{highlight_hex}\verb'1234h'}\verb' '{\color{highlight_symbol}\verb')'}\\
+ {\color{highlight_directive}\verb'ENDIF'}
+
+ % Caption
+ \caption{An example of expressions}
+ \end{code}
+
+ \section{The instruction set processing}
+ This assembler is capable of translating all 8051 instructions with all possible sets of operands. And extends this set with 2 pseudo-instructions: ``CALL'' and ``JMP'' which do not stand for any operation code, but are translated according to the used operand. ``CALL'' can be translated as ``ACALL'' or ``LCALL'', ``JMP addr'' can be translated as ``SJMP'', ``AJMP'' or ``LJMP''.
+
+ \twocolumn
+ \section{Assembler directives}
+ \begin{description}
+ \mysmallfont{}
+ \item[ifn] IF Not, conditional assembly\\
+ Syntax:\\
+ \verb' '{\color{highlight_directive}\verb'IFN'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'IF'}{\color{highlight_symbol}\verb'('}{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_symbol}\verb'*'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_symbol}\verb'-'}\verb' '{\color{highlight_constant}\verb'CND'}{\color{highlight_symbol}\verb')'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#20h'}\\
+ \verb' '{\color{highlight_directive}\verb'ELSE'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#40h'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDIF'}\\
+ \item[ifdef] IF DEFined\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'IFDEF'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'symbol'}{\color{highlight_symbol}\verb'>'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'IFDEF'}\verb' '{\color{highlight_constant}\verb'CND'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#20h'}\\
+ \verb' '{\color{highlight_directive}\verb'ELSE'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#40h'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDIF'}\\
+ \item[ifndef] IF Not DEFined\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'IFNDEF'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'symbol'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'IFNDEF'}\verb' '{\color{highlight_constant}\verb'CND'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#20h'}\\
+ \verb' '{\color{highlight_directive}\verb'ELSE'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#40h'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDIF'}\\
+ \item[rept] REPeaT Macro\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'REPT'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'REPT'}\verb' '{\color{highlight_unknown_base}\verb'5'}\\
+ \verb' '{\color{highlight_instruction}\verb'NOP'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDM'}\\
+ \item[times] REPeaT Macro\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'TIMES'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'TIMES'}\verb' '{\color{highlight_unknown_base}\verb'5'}\\
+ \verb' '{\color{highlight_instruction}\verb'NOP'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDM'}\\
+ \item[if] Conditional assembly\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'IF'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'IF'}{\color{highlight_symbol}\verb'('}{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_symbol}\verb'*'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_symbol}\verb'-'}\verb' '{\color{highlight_constant}\verb'CND'}{\color{highlight_symbol}\verb')'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#20h'}\\
+ \verb' '{\color{highlight_directive}\verb'ELSE'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#40h'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDIF'}\\
+ \item[else] Conditional assembly\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'ELSE'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'IF'}{\color{highlight_symbol}\verb'('}{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_symbol}\verb'*'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_symbol}\verb'-'}\verb' '{\color{highlight_constant}\verb'CND'}{\color{highlight_symbol}\verb')'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#20h'}\\
+ \verb' '{\color{highlight_directive}\verb'ELSE'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#40h'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDIF'}\\
+ \item[elseif] Conditional assembly\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'ELSEIF'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'IF'}{\color{highlight_symbol}\verb'('}{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_symbol}\verb'*'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_symbol}\verb'-'}\verb' '{\color{highlight_constant}\verb'CND'}{\color{highlight_symbol}\verb')'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#20h'}\\
+ \verb' '{\color{highlight_directive}\verb'ELSEIF'}\verb' '{\color{highlight_constant}\verb'SOMETHING_ELSE'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#40h'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDIF'}\\
+ \item[elseifn] Conditional assembly\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'ELSEIF'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'IF'}{\color{highlight_symbol}\verb'('}{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_symbol}\verb'*'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_symbol}\verb'-'}\verb' '{\color{highlight_constant}\verb'CND'}{\color{highlight_symbol}\verb')'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#20h'}\\
+ \verb' '{\color{highlight_directive}\verb'ELSEIF'}\verb' '{\color{highlight_constant}\verb'SOMETHING_ELSE'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#40h'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDIF'}\\
+ \item[elseifdef] Conditional assembly\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'ELSEIF'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'IF'}{\color{highlight_symbol}\verb'('}{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_symbol}\verb'*'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_symbol}\verb'-'}\verb' '{\color{highlight_constant}\verb'CND'}{\color{highlight_symbol}\verb')'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#20h'}\\
+ \verb' '{\color{highlight_directive}\verb'ELSEIFDEF'}\verb' '{\color{highlight_constant}\verb'SOMETHING_ELSE'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#40h'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDIF'}\\
+ \item[elseifndef] Conditional assembly\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'ELSEIF'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'IF'}{\color{highlight_symbol}\verb'('}{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_symbol}\verb'*'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_symbol}\verb'-'}\verb' '{\color{highlight_constant}\verb'CND'}{\color{highlight_symbol}\verb')'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#20h'}\\
+ \verb' '{\color{highlight_directive}\verb'ELSEIFNDEF'}\verb' '{\color{highlight_constant}\verb'SOMETHING_ELSE'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#40h'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDIF'}\\
+ \item[endif] Conditional assembly\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'ENDIF'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'IF'}{\color{highlight_symbol}\verb'('}{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_symbol}\verb'*'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_symbol}\verb'-'}\verb' '{\color{highlight_constant}\verb'CND'}{\color{highlight_symbol}\verb')'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#20h'}\\
+ \verb' '{\color{highlight_directive}\verb'ELSE'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#40h'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDIF'}\\
+ \item[endm] END of Macro definition\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'ENDM'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_macro}\verb'ABC'}\verb' '{\color{highlight_directive}\verb'MACRO'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_sfr}\verb'B'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_dec}\verb'#12d'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDM'}\\
+ \item[end] END of the program\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'END'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'END'}\\
+ \item[list] enable code LISTing\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'LIST'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_instruction}\verb'NOP'}\\
+ \verb' '{\color{highlight_directive}\verb'NOLIST'}\\
+ \verb' '{\color{highlight_instruction}\verb'NOP'}\\
+ \verb' '{\color{highlight_instruction}\verb'NOP'}\\
+ \verb' '{\color{highlight_directive}\verb'LIST'}\\
+ \verb' '{\color{highlight_instruction}\verb'NOP'}\\
+ \item[nolist] disabled code listing\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'NOLIST'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_instruction}\verb'NOP'}\\
+ \verb' '{\color{highlight_directive}\verb'NOLIST'}\\
+ \verb' '{\color{highlight_instruction}\verb'NOP'}\\
+ \verb' '{\color{highlight_instruction}\verb'NOP'}\\
+ \verb' '{\color{highlight_directive}\verb'LIST'}\\
+ \verb' '{\color{highlight_instruction}\verb'NOP'}\\
+ \item[dseg] switch to DATA segment [at address]\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'DSEG'}\verb' '{\color{highlight_constant}\verb'[AT'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}{\color{highlight_constant}\verb']'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'DSEG'}\verb' '{\color{highlight_constant}\verb'at'}\verb' '{\color{highlight_dec}\verb'20d'}\\
+ \item[iseg] switch to IDATA segment [at address]\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'ISEG'}\verb' '{\color{highlight_constant}\verb'[AT'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}{\color{highlight_constant}\verb']'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'ISEG'}\verb' '{\color{highlight_constant}\verb'at'}\verb' '{\color{highlight_dec}\verb'10d'}\\
+ \item[bseg] switch to BIT segment [at address]\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'BSEG'}\verb' '{\color{highlight_constant}\verb'[AT'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}{\color{highlight_constant}\verb']'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'BSEG'}\verb' '{\color{highlight_constant}\verb'at'}\verb' '{\color{highlight_dec}\verb'5d'}\\
+ \item[xseg] switch to XDATA segment [at address]\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'XSEG'}\verb' '{\color{highlight_constant}\verb'[AT'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}{\color{highlight_constant}\verb']'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'XSEG'}\verb' '{\color{highlight_constant}\verb'at'}\verb' '{\color{highlight_dec}\verb'30d'}\\
+ \item[cseg] switch to CODE segment [at address]\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'CSEG'}\verb' '{\color{highlight_constant}\verb'[AT'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}{\color{highlight_constant}\verb']'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'CSEG'}\verb' '{\color{highlight_constant}\verb'at'}\verb' '{\color{highlight_dec}\verb'40d'}\\
+ \item[flag] define a FLAG bit\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_constant}\verb'<symbol>'}\verb' '{\color{highlight_directive}\verb'FLAG'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_constant}\verb'F4'}\verb' '{\color{highlight_directive}\verb'FLAG'}\verb' '{\color{highlight_hex}\verb'16h'}\\
+ \verb''\\
+ {\color{highlight_label}\verb'Note:'}\\
+ \verb' '{\color{highlight_macro}\verb'Deprecated'}\verb' '{\color{highlight_constant}\verb'directive. Consider directive BIT instead.}'}\\
+ \item[skip] SKIP bytes in the code memory\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'SKIP'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'SKIP'}\verb' '{\color{highlight_unknown_base}\verb'5'}\\
+ \item[equ] EQUivalent\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_constant}\verb'<symbol>'}\verb' '{\color{highlight_directive}\verb'EQU'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_constant}\verb'ABC'}\verb' '{\color{highlight_directive}\verb'EQU'}\verb' '{\color{highlight_sfr}\verb'R0'}\\
+ \verb' '{\color{highlight_constant}\verb'XYZ'}\verb' '{\color{highlight_directive}\verb'EQU'}\verb' '{\color{highlight_hex}\verb'4Eh'}{\color{highlight_symbol}\verb'+'}{\color{highlight_unknown_base}\verb'12'}\\
+ \item[bit] define BIT address\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_constant}\verb'<symbol>'}\verb' '{\color{highlight_directive}\verb'BIT'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_constant}\verb'ABC'}\verb' '{\color{highlight_directive}\verb'BIT'}\verb' '{\color{highlight_sfr}\verb'P4'}{\color{highlight_symbol}\verb'.'}{\color{highlight_unknown_base}\verb'5'}\\
+ \item[set] SET numeric variable or variable register\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_constant}\verb'<symbol>'}\verb' '{\color{highlight_directive}\verb'SET'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ \verb' '{\color{highlight_constant}\verb'<symbol>'}\verb' '{\color{highlight_directive}\verb'SET'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'register'}{\color{highlight_symbol}\verb'>'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_constant}\verb'ALPHA'}\verb' '{\color{highlight_directive}\verb'SET'}\verb' '{\color{highlight_sfr}\verb'R0'}\\
+ \verb' '{\color{highlight_constant}\verb'ALPHA'}\verb' '{\color{highlight_directive}\verb'SET'}\verb' '{\color{highlight_unknown_base}\verb'42'}{\color{highlight_symbol}\verb'*'}{\color{highlight_constant}\verb'BETA'}\\
+ \item[code] define address in the CODE memory\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_constant}\verb'<symbol>'}\verb' '{\color{highlight_directive}\verb'CODE'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ \verb''\\
+ Example:\\
+ \verb' '{\color{highlight_constant}\verb'TBL'}\verb' '{\color{highlight_directive}\verb'CODE'}\verb' '{\color{highlight_hex}\verb'600h'}\\
+ \item[data] define address in the DATA memory\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_constant}\verb'<symbol>'}\verb' '{\color{highlight_directive}\verb'DATA'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_constant}\verb'UIV'}\verb' '{\color{highlight_directive}\verb'DATA'}\verb' '{\color{highlight_hex}\verb'20h'}\\
+ \item[idata] define address in the Internal DATA memory\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_constant}\verb'<symbol>'}\verb' '{\color{highlight_directive}\verb'IDATA'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_constant}\verb'UIV'}\verb' '{\color{highlight_directive}\verb'IDATA'}\verb' '{\color{highlight_hex}\verb'20h'}\\
+ \item[xdata] define address in the External DATA memory\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_constant}\verb'<symbol>'}\verb' '{\color{highlight_directive}\verb'XDATA'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_constant}\verb'UIV'}\verb' '{\color{highlight_directive}\verb'XDATA'}\verb' '{\color{highlight_hex}\verb'400h'}\\
+ \item[macro] MACRO definition\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_macro}\verb'<macro>'}\verb' '{\color{highlight_directive}\verb'MACRO'}\verb' '{\color{highlight_constant}\verb'[<arg0> ['}{\color{highlight_oper_sep}\verb','}{\color{highlight_constant}\verb'<arg1> ... ]'}\\
+ Example:\\
+ \verb' '{\color{highlight_macro}\verb'ABC'}\verb' '{\color{highlight_directive}\verb'MACRO'}\verb' '{\color{highlight_constant}\verb'X'}\\
+ \verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_constant}\verb'X'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_dec}\verb'#12d'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDM'}\\
+ \item[local] define a LOCAL label inside a macro\\
+ Syntax:\\
+ \verb' '{\color{highlight_directive}\verb'LOCAL'}\verb' '{\color{highlight_label}\verb'<label>'}\\\\
+ Example:\\
+ \verb' '{\color{highlight_macro}\verb'ABC'}\verb' '{\color{highlight_directive}\verb'MACRO'}\verb' '{\color{highlight_constant}\verb'X'}\\
+ \verb' '{\color{highlight_directive}\verb'LOCAL'}\verb' '{\color{highlight_label}\verb'xyz'}\\
+ \verb' '{\color{highlight_label}\verb'xyz:'}\verb' '{\color{highlight_instruction}\verb'MOV'}\verb' '{\color{highlight_constant}\verb'X'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_dec}\verb'#12d'}\\
+ \verb' '{\color{highlight_directive}\verb'ENDM'}\\
+ \item[ds] Define Space\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'DS'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'DS'}\verb' '{\color{highlight_unknown_base}\verb'2'}{\color{highlight_symbol}\verb'+'}{\color{highlight_unknown_base}\verb'4'}\\
+ \item[dw] Define Words\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'DW'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr1'}{\color{highlight_symbol}\verb'>'}\verb' '{\color{highlight_constant}\verb'[,'}{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr2'}{\color{highlight_symbol}\verb'>'}\verb' '{\color{highlight_constant}\verb'...'}\verb' '{\color{highlight_constant}\verb']'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'DW'}\verb' '{\color{highlight_unknown_base}\verb'0,02009H,2009,4171'}\\
+ \item[db] Define Bytes\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'DB'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr1'}{\color{highlight_symbol}\verb'>'}\verb' '{\color{highlight_constant}\verb'['}{\color{highlight_oper_sep}\verb','}{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr2'}{\color{highlight_symbol}\verb'>'}\verb' '{\color{highlight_constant}\verb'...'}\verb' '{\color{highlight_constant}\verb']'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'DB'}\verb' '{\color{highlight_unknown_base}\verb'24'}{\color{highlight_oper_sep}\verb','}{\color{highlight_string}\verb''\verb"'"\verb'August'\verb"'"\verb''}{\color{highlight_oper_sep}\verb','}{\color{highlight_unknown_base}\verb'09'}{\color{highlight_oper_sep}\verb','}{\color{highlight_symbol}\verb'('}{\color{highlight_unknown_base}\verb'2'}{\color{highlight_symbol}\verb'*'}{\color{highlight_unknown_base}\verb'8'}{\color{highlight_symbol}\verb'+'}{\color{highlight_unknown_base}\verb'24'}{\color{highlight_symbol}\verb')/'}{\color{highlight_unknown_base}\verb'8'}\\
+ \item[dbit] Define BITs\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'DBIT'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'DBIT'}\verb' '{\color{highlight_unknown_base}\verb'4'}{\color{highlight_symbol}\verb'+'}{\color{highlight_unknown_base}\verb'2'}\\
+ \item[include] INCLUDE an external source code\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'INCLUDE'}\verb' '{\color{highlight_string}\verb'<filename>'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'INCLUDE'}\verb' '{\color{highlight_string}\verb''\verb"'"\verb'my file.asm'\verb"'"\verb''}\\
+ \item[org] ORiGin of segment location\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'ORG'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'ORG'}\verb' '{\color{highlight_hex}\verb'0Bh'}\\
+ \item[using] USING register banks\\
+ Syntax:\\\\
+ \verb' '{\color{highlight_directive}\verb'USING'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' '{\color{highlight_directive}\verb'USING'}\verb' '{\color{highlight_unknown_base}\verb'2'}\\
+ \item[byte] define BYTE address in the data memory\\
+ Syntax:\\\\
+ \verb' <symbol> '{\color{highlight_directive}\verb'BYTE'}\verb' '{\color{highlight_symbol}\verb'<'}{\color{highlight_constant}\verb'expr'}{\color{highlight_symbol}\verb'>'}\\
+ Example:\\
+ \verb' UIV '{\color{highlight_directive}\verb'BYTE'}\verb' '{\color{highlight_hex}\verb'20h'}\\
+ {\color{highlight_label}\verb'Note:'}\\
+ \verb' '{\color{highlight_macro}\verb'Deprecated'}\verb' '{\color{highlight_constant}\verb'directive. Consider directive DATA instead.'}\\
+ \end{description}
+ \onecolumn
+
+ \twocolumn
+ \section{Assembler Controls}
+ \begin{description}
+ \mysmallfont{}
+ \item[\$date] Inserts date string into page header\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$DATE'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'string'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$DATE'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'1965-12-31'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$da] Inserts date string into page header\\
+ Syntax:\\
+ \verb' ' {\color{highlight_control}\verb'$DA'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'string'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' ' {\color{highlight_control}\verb'$DA'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'1965-12-31'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$eject] Start a new page in list file\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$EJECT'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$EJECT'}\\
+ \item[\$ej] Start a new page in list file\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$EJ'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$EJ'}\\
+ \item[\$include] Include a source file\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$INCLUDE'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'string'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$INCLUDE'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'somefile.asm'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$inc] Include a source file\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$INC'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'string'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$INC'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'somefile.asm'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$list] List subsequent source lines\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$LIST'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$LIST'}\\
+ \item[\$li] List subsequent source lines\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$LI'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$LI'}\\
+ \item[\$noli] Don't list subsequent source lines\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOLI'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOLI'}\\
+ \item[\$nolist] Don't list subsequent source lines\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOLIST'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOLIST'}\\
+ \item[\$nomod] Disable predefined SFR symbols\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOMOD'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOMOD'}\\
+ \item[\$nomo] Disable predefined SFR symbols\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOMO'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOMO'}\\
+ \item[\$nomod51] Disable predefined SFR symbols\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOMOD51'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOMOD51'}\\
+ \item[\$paging] Enable listing page formatting\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$PAGING'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$PAGING'}\\
+ \item[\$pi] Enable listing page formatting\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$PI'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$PI'}\\
+ \item[\$nopi] Disable listing page formatting\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOPI'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOPI'}\\
+ \item[\$nopaging] Disable listing page formatting\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOPAGING'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOPAGING'}\\
+ \item[\$pagelength] Set lines per page for listing\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$PAGELENGTH'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'int'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$PAGELENGTH'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'64'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$pl] Set lines per page for listing\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$PL'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'int'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$PL'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'64'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$pagewidth] Set columns per line for listing\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$PAGEWIDTH'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'int'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$PAGEWIDTH'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'132'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$pw] Set columns per line for listing\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$PW'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'int'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$PW'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'132'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$symbols] Create symbol table\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$SYMBOLS'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$SYMBOLS'}\\
+ \item[\$sb] Create symbol table\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$SB'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$SB'}\\
+ \item[\$nosymbols] Don't create symbol table\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOSYMBOLS'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOSYMBOLS'}\\
+ \item[\$nosb] Don't create symbol table\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOSB'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOSB'}\\
+ \item[\$title] Inserts title string into page header\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$TITLE'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'string'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$TITLE'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'My firts code'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$tt] Inserts title string into page header\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$TT'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'string'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$TT'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'My firts code'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$noobject] Do not create Intel HEX file\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOOBJECT'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOOBJECT'}\\
+ \item[\$object] Specify file name for Intel HEX\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$OBJECT'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'string'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$OBJECT'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'my_hex.hex'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$print] Specify file name for list file\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$PRINT'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'string'}{\color{highlight_symbol}\verb')'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$PRINT'}{\color{highlight_symbol}\verb'('}{\color{highlight_string}\verb'my_list.lst'}{\color{highlight_symbol}\verb')'}\\
+ \item[\$noprint] Do not create list file at all\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOPRINT'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOPRINT'}\\
+ \item[\$nomacrosfirst] Define and expand macro instructions after! conditional assembly and definitions of constants\\
+ Syntax:\\
+ \verb' '{\color{highlight_control}\verb'$NOMACROSFIRST'}\\
+ Example:\\
+ \verb' '{\color{highlight_control}\verb'$NOMACROSFIRST'}\\
+ \end{description}
+ \onecolumn
+
+ \section{Predefined Symbols}
+ There are symbols which are defined by default by assembler. The aim is to make it a little easier to write code in assembly language for 8051, because user don not have to define all these symbols in his or her code. This feature can be turned of by ``\texttt{\$NOMOD}'' control sequence.
+
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \caption{Code addresses}
+ \begin{tabular}{|ll|ll|ll|ll|}
+ \hline
+ \textbf{Symbol} & \textbf{Value}
+ & \textbf{Symbol} & \textbf{Value}
+ & \textbf{Symbol} & \textbf{Value}
+ & \textbf{Symbol} & \textbf{Value} \\
+ \hline
+ RESET & 000h & EXTI0 & 003h & TIMER0& 00Bh & EXTI1 & 013h \\
+ TIMER1 & 01Bh & SINT & 023h & TIMER2& 02Bh & CFINT & 033h \\
+ \hline
+ \end{tabular}
+ \end{table}
+
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \caption{Plain numbers, these symbols are always defined!}
+ \begin{tabular}{|ll|}
+ \hline
+ \textbf{Symbol} & \textbf{Value} \\
+ \hline
+ ??MCU\_8051\_IDE & 8051h \\
+ ??VERSION & 0139h \footnote{0139h stands for version 1.3.9} \\
+ \hline
+ \end{tabular}
+ \end{table}
+
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \caption{Predefined SFR bit addresses}
+ \begin{tabular}{|ll|ll|ll|ll|}
+ \hline
+ \textbf{Symbol} & \textbf{Value}
+ & \textbf{Symbol} & \textbf{Value}
+ & \textbf{Symbol} & \textbf{Value}
+ & \textbf{Symbol} & \textbf{Value} \\
+ \hline
+ IT0 & 088h & IE0 & 089h & IT1 & 08Ah & IE1 & 08Bh \\
+ TR0 & 08Ch & TF0 & 08Dh & TR1 & 08Eh & TF1 & 08Fh \\
+ RI & 098h & TI & 099h & RB8 & 09Ah & TB8 & 09Bh \\
+ REN & 09Ch & SM2 & 09Dh & SM1 & 09Eh & SM0 & 09Fh \\
+ FE & 09Fh & & & & & & \\
+ EX0 & 0A8h & ET0 & 0A9h & EX1 & 0AAh & ET1 & 0ABh \\
+ ES & 0ACh & ET2 & 0ADh & EC & 0AEh & EA & 0AFh \\
+ RXD & 0B0h & TXD & 0B1h & INT0 & 0B2h & INT1 & 0B3h \\
+ T0 & 0B4h & T1 & 0B5h & WR & 0B6h & RD & 0B7h \\
+ PX0 & 0B8h & PT0 & 0B9h & PX1 & 0BAh & PT1 & 0BBh \\
+ PS & 0BCh & PT2 & 0BDh & PC & 0BEh & & \\
+ PPCL & 0BEh & PT2L & 0BDh & PSL & 0BCh & & \\
+ PT1L & 0BBh & PX1L & 0BAh & PT0L & 0B9h & PX0L & 0B8h \\
+ TF2 & 0CFh & EXF2 & 0CEh & RCLK & 0CDh & TCLK & 0CCh \\
+ EXEN2 & 0CBh & TR2 & 0CAh & CT2 & 0C9h & CPRL2 & 0C8h \\
+ P & 0D0h & OV & 0D2h & RS0 & 0D3h & & \\
+ RS1 & 0D4h & F0 & 0D5h & AC & 0D6h & CY & 0D7h \\
+ CR & 0DEh & CCF4 & 0DCh & & & & \\
+ CCF3 & 0DBh & CCF2 & 0DAh & CCF1 & 0D9h & CCF0 & 0D8h \\
+ \hline
+ \end{tabular}
+ \end{table}
+
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \caption{Predefined SFR addresses}
+ \begin{tabular}{|ll|ll|ll|ll|}
+ \hline
+ \textbf{Symbol} & \textbf{Value}
+ & \textbf{Symbol} & \textbf{Value}
+ & \textbf{Symbol} & \textbf{Value}
+ & \textbf{Symbol} & \textbf{Value} \\
+ \hline
+ P0 & 080h & SP & 081h & DPL & 082h & DPH & 083h \\
+ PCON & 087h & TCON & 088h & TMOD & 089h & TL0 & 08Ah \\
+ TL1 & 08Bh & TH0 & 08Ch & TH1 & 08Dh & P1 & 090h \\
+ SCON & 098h & SBUF & 099h & P2 & 0A0h & IE & 0A8h \\
+ P3 & 0B0h & IP & 0B8h & PSW & 0D0h & ACC & 0E0h \\
+ B & 0F0h & P4 & 0C0h & WDTCON& 0A7h & EECON & 096h \\
+ DP0H & 083h & DP0L & 082h & DP1H & 085h & DP1L & 084h \\
+ T2CON & 0C8h & T2MOD & 0C9h & RCAP2L& 0CAh & RCAP2H& 0CBh \\
+ TL2 & 0CCh & TH2 & 0CDh & AUXR1 & 0A2h & WDTRST& 0A6h \\
+ CLKREG & 08Fh & ACSR & 097h & IPH & 0B7h & SADDR & 0A9h \\
+ SADEN & 0B9h & SPCR & 0D5h & SPSR & 0AAh & SPDR & 086h \\
+ AUXR & 08Eh & CKCON & 08Fh & WDTPRG& 0A7h & & \\
+ \hline
+ CH & 0F9h & CCAP0H& 0FAh & CCAP1H& 0FBh & CCAP2H& 0FCh \\
+ CCAP3H & 0FDh & CCAP4H& 0FEh &CCAPL2H& 0FCh &CCAPL3H& 0FDh \\
+ CCAPL4H & 0FEh & ADCLK & 0F2h & ADCON & 0F3h & ADDL & 0F4h \\
+ ADDH & 0F5h & ADCF & 0F6h & P5 & 0E8h & CL & 0E9h \\
+ CCAP0L & 0EAh & CCAP1L& 0EBh &CCAPL2L& 0ECh &CCAPL3L& 0EDh \\
+ CCAPL4L & 0EEh & CCON & 0D8h & CMOD & 0D9h & CCAPM0& 0DAh \\
+ CCAPM1 & 0DBh & CCAPM2& 0DCh & CCAPM3& 0DDh & CCAPM4& 0DEh \\
+ P1M2 & 0E2h & P3M2 & 0E3h & P4M2 & 0E4h & P1M1 & 0D4h \\
+ P3M1 & 0D5h & P4M1 & 0D6h & SPCON & 0C3h & SPSTA & 0C4h \\
+ SPDAT & 0C5h & IPL0 & 0B8h & IPL1 & 0B2h & IPH1 & 0B3h \\
+ IPH0 & 0B7h & BRL & 09Ah & BDRCON& 09Bh &BDRCON\_1& 09Ch \\
+ KBLS & 09Ch & KBE & 09Dh & KBF & 09Eh &SADEN\_0& 0B9h \\
+ SADEN\_1& 0BAh &SADDR\_0& 0A9h &SADDR\_1& 0AAh & CKSEL & 085h \\
+ OSCCON & 086h & CKRL & 097h & CKCON0& 08Fh & & \\
+ \hline
+ \end{tabular}
+ \end{table}
+
+ \clearpage
+ \section{Segment type}
+ Segment type specifies the address space to which a symbol is assigned. For example if you define symbol ABC using ``XDATA'' directive, then ABS is assigned to XDATA segment. Purpose of this is to semantically distinguish between different types of symbols. For example if we use a symbol as address to program memory it has different meaning that if we used it as address to bit addressable area.
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \begin{tabular}{|ll|}
+ \hline
+ DATA & Internal data memory and SFR \\
+ IDATA & Internal data memory only \\
+ XDATA & External data memory only \\
+ BIT & Bit addressable area only \\
+ CODE & Program memory only \\
+ NUMBER & Arbitrary value \\
+ \hline
+ \end{tabular}
+ \caption{Segment types}
+ \end{table}
+
+ Symbols might be assigned to these segment types by these directives:
+ \begin{itemize}
+ \setlength{\itemsep}{-3pt}
+ \item DATA (segment DATA)
+ \item IDATA (segment IDATA)
+ \item XDATA (segment XDATA)
+ \item BIT (segment BIT)
+ \item CODE (segment CODE)
+ \item EQU, SET (segment NUMBER)
+ \end{itemize}
+ \begin{code}[h!]
+ \mysmallfont{}
+ {\color{highlight_constant}\verb'MY_A'}\verb' '{\color{highlight_directive}\verb'DATA'}\verb' '{\color{highlight_char}\verb''\verb"'"\verb'\n'\verb"'"\verb''}\verb' '{\color{highlight_comment}\verb'; DATA segment (internal data memory and SFR)'}\\
+ {\color{highlight_constant}\verb'MY_B'}\verb' '{\color{highlight_directive}\verb'IDATA'}\verb' '{\color{highlight_hex}\verb'0AAH'}\verb' '{\color{highlight_comment}\verb'; IDATA segment (internal data memory only)'}\\
+ {\color{highlight_constant}\verb'MY_C'}\verb' '{\color{highlight_directive}\verb'XDATA'}\verb' '{\color{highlight_oct}\verb'14Q'}\verb' '{\color{highlight_comment}\verb'; XDATA segment (external data memory only)'}\\
+ {\color{highlight_constant}\verb'MY_D'}\verb' '{\color{highlight_directive}\verb'BIT'}\verb' '{\color{highlight_sfr}\verb'P1'}{\color{highlight_symbol}\verb'.'}{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_comment}\verb'; BIT segment (bit addressable area only)'}\\
+ {\color{highlight_constant}\verb'MY_E'}\verb' '{\color{highlight_directive}\verb'CODE'}\verb' '{\color{highlight_dec}\verb'62348D'}\verb' '{\color{highlight_comment}\verb'; CODE segment (program memory only)'}\\
+ {\color{highlight_constant}\verb'MY_F'}\verb' '{\color{highlight_directive}\verb'EQU'}\verb' '{\color{highlight_oct}\verb'242Q'}\verb' '{\color{highlight_comment}\verb'; Segment NUMBER (arbitrary value)'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; Segment NUMBER (arbitrary value)'}\\
+ {\color{highlight_constant}\verb'MY_G'}\verb' '{\color{highlight_directive}\verb'SET'}\verb' '{\color{highlight_constant}\verb'MY_A'}\verb' '{\color{highlight_symbol}\verb'+'}\verb' '{\color{highlight_constant}\verb'MY_B'}\verb' '{\color{highlight_symbol}\verb'+'}\verb' '{\color{highlight_constant}\verb'MY_C'}\verb' '{\color{highlight_symbol}\verb'+'}\verb' '{\color{highlight_constant}\verb'MY_D'}\verb' '{\color{highlight_symbol}\verb'+'}\verb' '{\color{highlight_constant}\verb'MY_E'}\verb' '{\color{highlight_symbol}\verb'+'}\verb' '{\color{highlight_constant}\verb'MY_F'}\\
+ \caption{Example of symbol definitions}
+ \end{code}
+
+ \clearpage
+ \begin{code}[h!]
+ \mysmallfont{}
+ {\color{highlight_comment}\verb'; CODE segment'}\\
+ \verb' '{\color{highlight_directive}\verb'cseg'}\verb' '{\color{highlight_constant}\verb'at'}\verb' '{\color{highlight_hex}\verb'40h'}\verb' '{\color{highlight_comment}\verb'; Start this segment at address 40 hexadecimal (64d)'}\\
+ {\color{highlight_constant}\verb'my_c'}\verb' '{\color{highlight_directive}\verb'CODE'}\verb' '{\color{highlight_hex}\verb'00abch'}\verb' '{\color{highlight_comment}\verb'; Define an address in code memory'}\\
+ {\color{highlight_label}\verb'word:'}\verb' '{\color{highlight_directive}\verb'DW'}\verb' '{\color{highlight_hex}\verb'01234h'}\verb' '{\color{highlight_comment}\verb'; Define a word in code memory, will be written to code memory'}\\
+ {\color{highlight_label}\verb'my_cs:'}\verb' '{\color{highlight_directive}\verb'DB'}\verb' '{\color{highlight_string}\verb''\verb"'"\verb'abcdef'\verb"'"\verb''}{\color{highlight_comment}\verb'; Define a string in code memory, will be written to code memory'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; DATA segment'}{\color{highlight_macro}\\
+ }\verb' '{\color{highlight_directive}\verb'dseg'}\verb' '{\color{highlight_constant}\verb'at'}\verb' '{\color{highlight_oct}\verb'10q'}\verb' '{\color{highlight_comment}\verb'; Start this segment at address 10 octal (8d)'}\\
+ {\color{highlight_constant}\verb'my_d'}\verb' '{\color{highlight_directive}\verb'DATA'}\verb' '{\color{highlight_char}\verb''\verb"'"\verb'd'\verb"'"\verb''}\verb' '{\color{highlight_comment}\verb'; Define address in internal data memory or SFR area'}\\
+ {\color{highlight_label}\verb'my_ds:'}\verb' '{\color{highlight_directive}\verb'DS'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_comment}\verb'; Reserve 4 bytes here and set ``my_ds'\verb"'"\verb''\verb"'"\verb' to point there'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; IDATA segment'}{\color{highlight_constant}\\
+ }\verb' '{\color{highlight_directive}\verb'iseg'}\verb' '{\color{highlight_constant}\verb'at'}\verb' '{\color{highlight_dec}\verb'10d'}\verb' '{\color{highlight_comment}\verb'; Start this segment at address 10 decimal'}\\
+ {\color{highlight_constant}\verb'my_i'}\verb' '{\color{highlight_directive}\verb'IDATA'}\verb' '{\color{highlight_char}\verb''\verb"'"\verb'i'\verb"'"\verb''}\verb' '{\color{highlight_comment}\verb'; Define address in internal data memory'}\\
+ {\color{highlight_label}\verb'my_is:'}\verb' '{\color{highlight_directive}\verb'DS'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_comment}\verb'; Reserve 4 bytes here and set ``my_is'\verb"'"\verb''\verb"'"\verb' to point there'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; BIT segment'}\\
+ \verb' '{\color{highlight_directive}\verb'bseg'}\verb' '{\color{highlight_constant}\verb'at'}\verb' '{\color{highlight_bin}\verb'10b'}\verb' '{\color{highlight_comment}\verb'; Start this segment at address 10 binary (2d)'}\\
+ {\color{highlight_constant}\verb'my_bit'}\verb' '{\color{highlight_directive}\verb'BIT'}\verb' '{\color{highlight_char}\verb''\verb"'"\verb'b'\verb"'"\verb''}\verb' '{\color{highlight_comment}\verb'; Define address in bit addressable area'}\\
+ {\color{highlight_label}\verb'my_bs:'}\verb' '{\color{highlight_directive}\verb'dbit'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_comment}\verb'; Reserve 4 bits here and set ``my_bs'\verb"'"\verb''\verb"'"\verb' to point there'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; XDATA segment'}{\color{highlight_constant}\\
+ }\verb' '{\color{highlight_directive}\verb'xseg'}\verb' '{\color{highlight_constant}\verb'at'}\verb' '{\color{highlight_unknown_base}\verb'10'}\verb' '{\color{highlight_comment}\verb'; Start this segment at address 10 decimal'}\\
+ {\color{highlight_constant}\verb'my_x'}\verb' '{\color{highlight_directive}\verb'XDATA'}\verb' '{\color{highlight_char}\verb''\verb"'"\verb'x'\verb"'"\verb''}\verb' '{\color{highlight_comment}\verb'; Define address in external data memory'}\\
+ {\color{highlight_label}\verb'my_xs:'}\verb' '{\color{highlight_directive}\verb'DS'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_comment}\verb'; Reserve 4 bytes here and set ``my_xs'\verb"'"\verb''\verb"'"\verb' to point there'}\\
+ \verb''\\
+ \verb''\\
+ {\color{highlight_constant}\verb'address'}\verb' '{\color{highlight_directive}\verb'equ'}\verb' '{\color{highlight_hex}\verb'0h'}\verb' '{\color{highlight_comment}\verb'; Define symbol ``address'\verb"'"\verb' in the NUMBER segment'}\\
+ \verb''\\
+ \verb' '{\color{highlight_directive}\verb'org'}\verb' '{\color{highlight_constant}\verb'address'}\verb' '{\color{highlight_comment}\verb'; Start writing program code at address defined by symbol ``address'\verb"'"\verb''\verb"'"\verb''}\\
+ \verb''\\
+ \verb' '{\color{highlight_comment}\verb'; Clear 1st bit in BIT array ``my_bs'\verb"'"\verb''\verb"'"\verb''}\\
+ \verb' '{\color{highlight_instruction}\verb'clr'}\verb' '{\color{highlight_constant}\verb'my_bs'}{\color{highlight_symbol}\verb'+'}{\color{highlight_unknown_base}\verb'1'}\\
+ \verb''\\
+ \verb' '{\color{highlight_comment}\verb'; Move 10d to 2nd byte in DATA array ``my_ds'\verb"'"\verb''\verb"'"\verb''}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_constant}\verb'my_ds'}{\color{highlight_symbol}\verb'+'}{\color{highlight_unknown_base}\verb'2'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_dec}\verb'#10d'}\\
+ \verb''\\
+ \verb' '{\color{highlight_comment}\verb'; Move 88d to 3rd byte in IDATA array ``my_is'\verb"'"\verb''\verb"'"\verb''}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_constant}\verb'my_is'}{\color{highlight_symbol}\verb'+'}{\color{highlight_unknown_base}\verb'3'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_dec}\verb'#88d'}\\
+ \verb''\\
+ \verb' '{\color{highlight_comment}\verb'; Move 55h to 0th byte in XDATA array ``my_xs'\verb"'"\verb''\verb"'"\verb''}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#55h'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'DPTR'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_symbol}\verb'#('}\verb' '{\color{highlight_constant}\verb'my_xs'}\verb' '{\color{highlight_symbol}\verb'+'}\verb' '{\color{highlight_unknown_base}\verb'0'}\verb' '{\color{highlight_symbol}\verb')'}\\
+ \verb' '{\color{highlight_instruction}\verb'movx'}\verb' '{\color{highlight_indirect}\verb'@DPTR'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'A'}\\
+ \verb''\\
+ \verb' '{\color{highlight_comment}\verb'; Read 1st byte from CODE array ``my_cs'\verb"'"\verb''\verb"'"\verb''}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'DPTR'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_constant}\verb'#my_cs'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_unknown}\verb'#1'}\\
+ \verb' '{\color{highlight_instruction}\verb'movc'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_indirect}\verb'@A+DPTR'}\\
+ \verb''\\
+ \verb' '{\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'$'}\verb' '{\color{highlight_comment}\verb'; Infinite loop (``$'\verb"'"\verb''\verb"'"\verb' stands for address of current instruction)'}\\
+ \verb''\\
+ \verb' '{\color{highlight_directive}\verb'end'}\verb' '{\color{highlight_comment}\verb'; End of assembly, everything after this directive is ignored'}\\
+ \caption{Example of address space reservation}
+ \end{code}
+
+ \section{Conditional Assembly}
+ The aim of conditional assembly to to assemble certain parts of the code if and only if certain arithmetically expressed condition is met. This feature can prove useful particularly when the user want to make the code somehow ``configurable''. This assembler provides these instructions to work with conditional assembly:
+ \begin{itemize}
+ \setlength{\itemsep}{-3pt}
+ \item IF <condition>
+ \item IFN <condition>
+ \item IFDEF <symbol>
+ \item IFNDEF <symbol>
+ \item ELSE
+ \item ELSEIF <condition>
+ \item ELSEIFN <condition>
+ \item ELSEIFDEF <symbol>
+ \item ELSEIFNDEF <symbol>
+ \item ENDIF
+ \end{itemize}
+
+ This can be best demonstrated on an example:
+ \begin{code}[h!]
+ \mysmallfont{}
+ {\color{highlight_constant}\verb'abc'}\verb' '{\color{highlight_directive}\verb'equ'}\verb' '{\color{highlight_unknown_base}\verb'16'}\verb' '{\color{highlight_comment}\verb'; Assign number 14 to symbol abc'}\\
+ {\color{highlight_constant}\verb'xyz'}\verb' '{\color{highlight_directive}\verb'equ'}\verb' '{\color{highlight_unknown_base}\verb'10'}\verb' '{\color{highlight_comment}\verb'; Assign number 10 to symbol abc'}\\
+ \verb''\\
+ {\color{highlight_directive}\verb'ifdef'}\verb' '{\color{highlight_constant}\verb'abc'}\verb' '{\color{highlight_comment}\verb';<--+ Assemble only if symbol abc has been defined'}\\
+ \verb' '{\color{highlight_directive}\verb'if'}\verb' '{\color{highlight_symbol}\verb'('}\verb' '{\color{highlight_constant}\verb'abc'}\verb' '{\color{highlight_symbol}\verb'='}\verb' '{\color{highlight_unknown_base}\verb'13'}\verb' '{\color{highlight_symbol}\verb')'}\verb' '{\color{highlight_comment}\verb'; | <--+ Assemble if 13 has been assigned to symbol abc'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_bin}\verb'#01010101b'}\verb' '{\color{highlight_comment}\verb'; | |'}\\
+ \verb' '{\color{highlight_directive}\verb'elseif'}\verb' '{\color{highlight_symbol}\verb'('}\verb' '{\color{highlight_constant}\verb'abc'}\verb' '{\color{highlight_symbol}\verb'='}\verb' '{\color{highlight_unknown_base}\verb'14'}\verb' '{\color{highlight_symbol}\verb')'}\verb' '{\color{highlight_comment}\verb'; | <--+ Assemble if 14 has been assigned to symbol abc'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#0aah'}\verb' '{\color{highlight_comment}\verb'; | |'}\\
+ \verb' '{\color{highlight_directive}\verb'elseifn'}\verb' '{\color{highlight_symbol}\verb'('}\verb' '{\color{highlight_constant}\verb'abc'}\verb' '{\color{highlight_symbol}\verb'%'}\verb' '{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_symbol}\verb')'}\verb' '{\color{highlight_comment}\verb'; | <--+ Assemble if the value assigned to symbol abc is even'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_constant}\verb'#abc'}\verb' '{\color{highlight_comment}\verb'; | |'}\\
+ \verb' '{\color{highlight_directive}\verb'else'}\verb' '{\color{highlight_comment}\verb'; | <--+ Else ..'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_oct}\verb'#377q'}\verb' '{\color{highlight_comment}\verb'; | |'}\\
+ \verb' '{\color{highlight_directive}\verb'endif'}\verb' '{\color{highlight_comment}\verb'; | <--+'}\\
+ {\color{highlight_directive}\verb'elseifndef'}\verb' '{\color{highlight_constant}\verb'xyz'}\verb' '{\color{highlight_comment}\verb';<--+ Assemble if symbol xyz has NOT been defined'}\\
+ \verb' '{\color{highlight_instruction}\verb'clr'}\verb' '{\color{highlight_sfr}\verb'A'}\verb' '{\color{highlight_comment}\verb'; |'}\\
+ {\color{highlight_directive}\verb'else'}\verb' '{\color{highlight_comment}\verb';<--+ Else ...'}\\
+ \verb' '{\color{highlight_directive}\verb'ifn'}\verb' '{\color{highlight_symbol}\verb'('}{\color{highlight_constant}\verb'xyz'}{\color{highlight_symbol}\verb' mod'}\verb' '{\color{highlight_unknown_base}\verb'2'}{\color{highlight_symbol}\verb')'}\verb' '{\color{highlight_comment}\verb'; | <--+ Assemble if ( yxz modulo 2 ) is 0'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_dec}\verb'#128d'}\verb' '{\color{highlight_comment}\verb'; | |'}\\
+ \verb' '{\color{highlight_directive}\verb'endif'}\verb' '{\color{highlight_comment}\verb'; | <--+'}\\
+ {\color{highlight_directive}\verb'endif'}\verb' '{\color{highlight_comment}\verb';<--+'}\\
+ \verb''\\
+ {\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'$'}\verb' '{\color{highlight_comment}\verb'; Infinite loop'}\\
+ {\color{highlight_directive}\verb'end'}\verb' '{\color{highlight_comment}\verb'; End of assembly'}\\
+ \caption{An example of conditional assembly usage}
+ \end{code}
+
+ \clearpage
+ \section{Macro Processing}
+ Macro is a sequence of instructions which can be expanded anywhere in the code and for any number of times. That may reduce necessity of repeating code fragments as well as source code size and make the solved task easier to comprehend and solve. Unlike subprograms macros do not add extra run-time overhead and repeating usage of macros may significantly increase size of the resulting machine code. Macros supported by this assembler are divided to named and unnamed ones.
+
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \begin{tabular}{|ll|}
+ \hline
+ MACRO & Define a new named macro \\
+ REPT & Define a new unnamed macro and expand it right away for the specified number of times \\
+ TIMES & Exactly the same as ``REPT'' \\
+ ENDM & End of macro definition \\
+ \hline
+ \end{tabular}
+ \caption{Directives directly related to macros}
+ \end{table}
+
+ This can be well demonstrated on examples:
+ \begin{code}[h!]
+ \mysmallfont{}
+ {\color{highlight_directive}\verb'rept'}\verb' '{\color{highlight_unknown_base}\verb'3'}\verb' '{\color{highlight_comment}\verb'; Repeat the code 3 times'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ {\color{highlight_directive}\verb'endm'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; This is the same as if you wrote this:'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \caption{An exaple of REPT directive}
+ \end{code}
+ \begin{code}[h!]
+ \mysmallfont{}
+ {\color{highlight_macro}\verb'abc'}\verb' '{\color{highlight_directive}\verb'macro'}\verb' '{\color{highlight_comment}\verb'; Define named macro ``abc'\verb"'"\verb''\verb"'"\verb''}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ {\color{highlight_directive}\verb'endm'}\\
+ \verb''\\
+ {\color{highlight_macro}\verb'abc'}\verb' '{\color{highlight_comment}\verb'; Expand macro ``abc'\verb"'"\verb''\verb"'"\verb' here'}\\
+ {\color{highlight_macro}\verb'abc'}\verb' '{\color{highlight_comment}\verb'; Expand macro ``abc'\verb"'"\verb''\verb"'"\verb' here'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; This is the same as if you wrote this:'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \caption{An exaple of simple named macro}
+ \end{code}
+ \begin{code}[h!]
+ \mysmallfont{}
+ {\color{highlight_comment}\verb'; Define macro named as ``xyz'\verb"'"\verb''\verb"'"\verb' with 2 mandatory parameters'}\\
+ {\color{highlight_macro}\verb'xyz'}\verb' '{\color{highlight_directive}\verb'macro'}\verb' '{\color{highlight_constant}\verb'foo'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_constant}\verb'bar'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_constant}\verb'foo'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#10h'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_constant}\verb'bar'}\\
+ {\color{highlight_directive}\verb'endm'}\\
+ \verb''\\
+ {\color{highlight_macro}\verb'xyz'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'c'}\verb' '{\color{highlight_comment}\verb'; Expand macro ``xyz'\verb"'"\verb''\verb"'"\verb' here'}\\
+ {\color{highlight_macro}\verb'xyz'}\verb' '{\color{highlight_sfr}\verb'p0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_symbol}\verb'.'}{\color{highlight_unknown_base}\verb'0'}\verb' '{\color{highlight_comment}\verb'; Expand macro ``xyz'\verb"'"\verb''\verb"'"\verb' here'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; This is the same as if you wrote this:'\\
+ }\verb' '{\color{highlight_comment}\verb'; xyz a, c'\\
+ }\verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#10h'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'c'}\\
+ \verb' '{\color{highlight_comment}\verb'; xyz p0, p1.0'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#10h'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_symbol}\verb'.'}{\color{highlight_unknown_base}\verb'0'}\\
+ \caption{An exaple of named macro with two parameters}
+ \end{code}
+ \begin{code}[h!]
+ \mysmallfont{}{\color{highlight_macro}\verb'ijk'}\verb' '{\color{highlight_directive}\verb'macro'}\verb' '{\color{highlight_constant}\verb'foo'}\\
+ \verb' '{\color{highlight_instruction}\verb'add'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb''\\
+ \verb' '{\color{highlight_directive}\verb'if'}\verb' '{\color{highlight_constant}\verb'foo'}\verb' '{\color{highlight_symbol}\verb'='}\verb' '{\color{highlight_dec}\verb'4d'}\\
+ \verb' '{\color{highlight_instruction}\verb'nop'}\\
+ \verb' '{\color{highlight_directive}\verb'endif'}\\
+ \verb''\\
+ \verb' '{\color{highlight_instruction}\verb'subb'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_constant}\verb'#foo'}\\
+ {\color{highlight_directive}\verb'endm'}\\
+ \verb''\\
+ {\color{highlight_macro}\verb'ijk'}\verb' '{\color{highlight_unknown_base}\verb'5'}\\
+ {\color{highlight_macro}\verb'ijk'}\verb' '{\color{highlight_unknown_base}\verb'4'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; This is the same as if you wrote this:'}\\
+ \verb' '{\color{highlight_comment}\verb'; ijk 5'}\\
+ \verb' '{\color{highlight_instruction}\verb'add'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb' '{\color{highlight_directive}\verb'if'}\verb' '{\color{highlight_unknown_base}\verb'5'}\verb' '{\color{highlight_symbol}\verb'='}\verb' '{\color{highlight_dec}\verb'4d'}\\
+ \verb' '{\color{highlight_instruction}\verb'nop'}\\
+ \verb' '{\color{highlight_directive}\verb'endif'}\\
+ \verb' '{\color{highlight_instruction}\verb'subb'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_unknown}\verb'#5'}\\
+ \verb' '{\color{highlight_comment}\verb'; ijk 4'}\\
+ \verb' '{\color{highlight_instruction}\verb'add'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb' '{\color{highlight_directive}\verb'if'}\verb' '{\color{highlight_unknown_base}\verb'4'}\verb' '{\color{highlight_symbol}\verb'='}\verb' '{\color{highlight_dec}\verb'4d'}\\
+ \verb' '{\color{highlight_instruction}\verb'nop'}\\
+ \verb' '{\color{highlight_directive}\verb'endif'}\\
+ \verb' '{\color{highlight_instruction}\verb'subb'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_unknown}\verb'#4'}\\
+ \caption{An exaple of named macro used with if statement}
+ \end{code}
+ \begin{code}[h!]
+ \mysmallfont{}
+ {\color{highlight_comment}\verb'; Suppose we have these macros:'}\\
+ {\color{highlight_macro}\verb'abc'}\verb' '{\color{highlight_directive}\verb'macro'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ {\color{highlight_directive}\verb'endm'}\\
+ {\color{highlight_macro}\verb'ijk'}\verb' '{\color{highlight_directive}\verb'macro'}\verb' '{\color{highlight_constant}\verb'foo'}\\
+ \verb' '{\color{highlight_instruction}\verb'add'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb''\\
+ \verb' '{\color{highlight_directive}\verb'if'}\verb' '{\color{highlight_constant}\verb'foo'}\verb' '{\color{highlight_symbol}\verb'='}\verb' '{\color{highlight_dec}\verb'4d'}\\
+ \verb' '{\color{highlight_instruction}\verb'nop'}\\
+ \verb' '{\color{highlight_directive}\verb'endif'}\\
+ \verb''\\
+ \verb' '{\color{highlight_instruction}\verb'subb'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_constant}\verb'#foo'}\\
+ {\color{highlight_directive}\verb'endm'}\\
+ {\color{highlight_macro}\verb'xyz'}\verb' '{\color{highlight_directive}\verb'macro'}\verb' '{\color{highlight_constant}\verb'foo'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_constant}\verb'bar'}\\
+ \verb' '{\color{highlight_macro}\verb'ijk'}\verb' '{\color{highlight_constant}\verb'foo'}\\
+ \verb' '{\color{highlight_macro}\verb'ijk'}\verb' '{\color{highlight_constant}\verb'bar'}\\
+ \verb''\\
+ \verb' '{\color{highlight_macro}\verb'abc'}\\
+ {\color{highlight_directive}\verb'endm'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; And we expand ``xyz'\verb"'"\verb''\verb"'"\verb' like this:'}\\
+ {\color{highlight_macro}\verb'xyz'}\verb' '{\color{highlight_unknown_base}\verb'4'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_unknown_base}\verb'5'}\\
+ \verb''\\
+ {\color{highlight_comment}\verb'; Then we get this result:'}\\
+ \verb' '{\color{highlight_comment}\verb'; ijk 4'}\\
+ \verb' '{\color{highlight_instruction}\verb'add'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'nop'}\verb' '{\color{highlight_comment}\verb'; <-- Note this'}\\
+ \verb' '{\color{highlight_instruction}\verb'subb'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_unknown}\verb'#4'}\\
+ \verb' '{\color{highlight_comment}\verb'; ijk 5'}\\
+ \verb' '{\color{highlight_instruction}\verb'add'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'subb'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_unknown}\verb'#5'}\\
+ \verb' '{\color{highlight_comment}\verb'; abc'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \caption{An exaple of nested macros}
+ \end{code}
+ \begin{code}[h!]
+ \mysmallfont{}
+ {\color{highlight_macro}\verb'abc'}\verb' '{\color{highlight_directive}\verb'macro'}\\
+ {\color{highlight_comment}\verb' ; Unnamed macro cannot be contained inside a named one'}\\
+ \verb' '{\color{highlight_directive}\verb'times'}\verb' '{\color{highlight_unknown_base}\verb'2'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p1'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ \verb' '{\color{highlight_directive}\verb'endm'}\\
+ {\color{highlight_directive}\verb'endm'}\\
+ \caption{An exaple of nested macros, which will not work}
+ \end{code}
+
+ \clearpage
+ \section{Reserved keywords}
+ \flushbottom
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \caption{Special instruction operands}
+ \begin{tabular}{|ll|}
+ \hline
+ \$ & Location counter \\
+ A & Accumulator \\
+ AB & A/B register pair \\
+ C & Carry flag (in PSW register) \\
+ DPTR & Data pointer \\
+ PC & Program counter \\
+ R0..R7 & Registers \\
+ \hline
+ \end{tabular}
+ \end{table}
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \caption{Instruction mnemonics}
+ \begin{tabular}{|lllllllll|}
+ \hline
+ ACALL & ADD & ADDC & AJMP & ANL & CJNE & CLR & CPL & DA \\
+ DEC & DIV & DJNZ & INC & JB & JBC & JC & JMP & JNB \\
+ JNZ & SJMP & JNC & CALL & JZ & LCALL & LJMP & MOV & MOVC \\
+ MOVX & MUL & NOP & ORL & POP & PUSH & RET & RETI & RL \\
+ RLC & RR & RRC & SETB & SUBB & SWAP & XCH & XCHD & XRL \\
+ \hline
+ \end{tabular}
+ \end{table}
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \caption{Directives}
+ \begin{tabular}{|lllll|}
+ \hline
+ BIT & BSEG & BYTE & CODE & CSEG \\
+ DATA & DB & DBIT & DS & DSEG \\
+ DW & ELSE & ELSEIF & ELSEIFDEF & ELSEIFN \\
+ ELSEIFNDEF & END & ENDIF & ENDM & EQU \\
+ FLAG & IDATA & IF & IFDEF & IFN \\
+ IFNDEF & INCLUDE & ISEG & LIST & MACRO \\
+ NAME & NOLIST & ORG & REPT & SET \\
+ SKIP & TIMES & USING & XDATA & XSEG \\
+ \hline
+ \end{tabular}
+ \end{table}
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \caption{Expression operators}
+ \begin{tabular}{|lllll|}
+ \hline
+ AND & EQ & GE & GT & HIGH \\
+ LE & LOW & LT & MOD & NE \\
+ NOT & OR & SHL & SHR & XOR \\
+ \hline
+ \end{tabular}
+ \end{table}
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \caption{Assembler controls}
+ \begin{tabular}{|llll|}
+ \hline
+ DA & DATE & EJ & EJECT \\
+ LI & LIST & NOLI & NOLIST \\
+ NOMACROSFIRST & NOMO & NOMOD & NOMOD51 \\
+ NOOBJECT & NOPAGING & NOPI & NOPRINT \\
+ NOSB & NOSYMBOLS & OBJECT & PAGELENGTH \\
+ PAGEWIDTH & PAGING & PI & PL \\
+ PRINT & PW & SB & SYMBOLS \\
+ TITLE & TT & & \\
+ \hline
+ \end{tabular}
+ \end{table}
+
+ \clearpage
+ \section{Compatibility with ASEM-51}
+ Not yet specified.
+
+ \clearpage
+ \section{List File Format}
+ Code listing serves as an additional information about the assembled code and the progress of the assembly process. It contains information about all symbols defined in the code. Where and how were they were defined, what are their values and whether they were used in the code. Also detailed information about all macros defined in the code and/or expanded in the code. Conditional compilation configuration, instruction OP codes, address space reservations, inclusion of code from another files. And all warnings, errors and notes generated during the assembly by the assembler. There are assembler control sequences which alters formatting of the code listing file. These control sequences will be discussed here. Format of code listing generated by this assembler is very similar to the one generated Metalink\textregistered ASM51.
+ \begin{code}[h]
+ \mysmallfont{}
+ \verb'demo0 '{\color{highlight_macro}\verb'PAGE'}\verb' '{\color{highlight_unknown_base}\verb'1'}\\
+ {\color{highlight_lst_line}\verb' 1'}\verb' '{\color{highlight_comment}\verb'; MCU 8051 IDE - Demostration code'}\\
+ {\color{highlight_lst_line}\verb' 2'}\verb' '{\color{highlight_comment}\verb'; Very simple code'}\\
+ {\color{highlight_lst_line}\verb' 3'}\\
+ {\color{highlight_lst_line}\verb' 4'}\verb' '{\color{highlight_comment}\verb'; Press F2 and F6 to run the program (start simulator and animate)'}\\
+ {\color{highlight_lst_line}\verb' 5'}\\
+ {\color{highlight_lst_line}\verb' 6'}\verb' '{\color{highlight_directive}\verb'org'}\verb' '{\color{highlight_hex}\verb'0h'}\\
+ {\color{highlight_lst_line}\verb' 7'}\\
+ {\color{highlight_lst_address}\verb'0000'}{\color{highlight_lst_code}\verb' 08'}{\color{highlight_lst_line}\verb' 8'}\verb' '{\color{highlight_label}\verb'main:'}\verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_sfr}\verb'R0'}\\
+ {\color{highlight_lst_address}\verb'0001'}{\color{highlight_lst_code}\verb' 06'}{\color{highlight_lst_line}\verb' 9'}\verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ {\color{highlight_lst_address}\verb'0002'}{\color{highlight_lst_code}\verb' B87FFB'}{\color{highlight_lst_line}\verb' 10'}\verb' '{\color{highlight_instruction}\verb'cjne'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#07Fh'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_constant}\verb'main'}\\
+ {\color{highlight_lst_address}\verb'0005'}{\color{highlight_lst_code}\verb' 7800'}{\color{highlight_lst_line}\verb' 11'}\verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_dec}\verb'#0d'}\\
+ {\color{highlight_lst_address}\verb'0007'}{\color{highlight_lst_code}\verb' 80F7'}{\color{highlight_lst_line}\verb' 12'}\verb' '{\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'main'}\\
+ {\color{highlight_lst_line}\verb' 13'}\\
+ {\color{highlight_lst_line}\verb' 14'}\verb' '{\color{highlight_directive}\verb'end'}\\
+ {\color{highlight_lst_msg}\verb'ASSEMBLY COMPLETE,'}\verb' NO ERRORS FOUND, NO WARNINGS'\\
+ \caption{A simple code listing}
+ \end{code}
+ Code listing contains entire source code which was assembled but with each line prefixed with line number and some additional information which will be explained later. Besides the original code there is also table of symbols defined during the assembly unless it was turned off. Code listing is divided into pages separated by form feed character, this behavior may be altered by certain assembler control sequences as well as page height and width.
+
+ Each line of code listing which contains original source code line may contain beside line number also some additional information regarding the compilation of the given line of code. Such a additional information might look like this and is composed of these parts:
+
+ \begin{code}[h]
+ \verb' '\texttt{\colorbox{Lavender}{0055}}\verb' '\texttt{\colorbox{Goldenrod}{18}}\verb' '\texttt{\colorbox{Gray}{X data 55h}} \\
+ \texttt{\colorbox{Apricot}{0014}}\verb' '\texttt{\colorbox{GreenYellow}{1122}}\verb' '\texttt{\colorbox{LimeGreen}{=1}}\verb' '\texttt{\colorbox{Goldenrod}{33}}\verb' '\texttt{\colorbox{Gray}{l: inc A}} \\
+ \verb' '\texttt{\colorbox{Goldenrod}{35}}\verb' '\texttt{\colorbox{ProcessBlue}{+1}}\verb' '\texttt{\colorbox{Gray}{abc ; Expand macro ``abc'' here}} \\
+ \texttt{\colorbox{Apricot}{001E}}\verb' '\texttt{\colorbox{GreenYellow}{E580}}\verb' '\texttt{\colorbox{Goldenrod}{36}}\verb' '\texttt{\colorbox{ProcessBlue}{+1}}\verb' '\texttt{\colorbox{Gray}{ mov a, p0}} \\
+ \texttt{\colorbox{Apricot}{0020}}\verb' '\texttt{\colorbox{GreenYellow}{F4}}\verb' '\texttt{\colorbox{Goldenrod}{37}}\verb' '\texttt{\colorbox{ProcessBlue}{+1}}\verb' '\texttt{\colorbox{Gray}{ cpl a}} \\
+ \texttt{\colorbox{Apricot}{0021}}\verb' '\texttt{\colorbox{GreenYellow}{F590}}\verb' '\texttt{\colorbox{Goldenrod}{38}}\verb' '\texttt{\colorbox{ProcessBlue}{+1}}\verb' '\texttt{\colorbox{Gray}{ mov p1, a}} \\\\
+ \colorbox{Goldenrod}{\color{Goldenrod}X} Line number \\
+ \colorbox{LimeGreen}{\color{LimeGreen}X} Level of file inclusion \\
+ \colorbox{ProcessBlue}{\color{ProcessBlue}X} Level of macro expansion \\
+ \colorbox{Apricot}{\color{Apricot}X} Address in code memory \\
+ \colorbox{GreenYellow}{\color{GreenYellow}X} Machine code or another value to be stored in the code memory \\
+ \colorbox{Lavender}{\color{Lavender}X} Value of a symbol \\
+ \colorbox{Gray}{\color{Gray}X} Original line \\
+
+ \caption{Explanation code listing format}
+ \end{code}
+
+ \begin{code}[h]
+ \mysmallfont{}
+ \verb'complicated_lst '{\color{highlight_macro}\verb'PAGE'}\verb' '{\color{highlight_unknown_base}\verb'1'}\\
+ {\color{highlight_lst_number}\verb' 001C'}{\color{highlight_lst_line}\verb' 1'}\verb' '{\color{highlight_constant}\verb'abc'}\verb' '{\color{highlight_directive}\verb'equ'}\verb' '{\color{highlight_symbol}\verb'('}\verb' '{\color{highlight_unknown_base}\verb'14'}\verb' '{\color{highlight_symbol}\verb'*'}\verb' '{\color{highlight_unknown_base}\verb'2'}\verb' '{\color{highlight_symbol}\verb')'}\verb' '{\color{highlight_comment}\verb'; Define symbol abc'}\\
+ {\color{highlight_lst_line}\verb' 2'}\verb' '{\color{highlight_directive}\verb'org'}\verb' '{\color{highlight_unknown_base}\verb'0'}\verb' '{\color{highlight_comment}\verb'; Start writing code at address 0'}\\
+ {\color{highlight_lst_line}\verb' 3'}\\
+ {\color{highlight_lst_include}\verb' =1'}{\color{highlight_lst_line}\verb' 4'}\verb' '{\color{highlight_directive}\verb'include'}\verb' '{\color{highlight_string}\verb''\verb"'"\verb'my_macros.asm'\verb"'"\verb' '{\color{highlight_comment}\verb'; Include file my_macros.asm'}}\\
+ {\color{highlight_lst_include}\verb' =1'}{\color{highlight_lst_line}\verb' 5'}\verb' '{\color{highlight_comment}\verb'; This is the beginning of file my_macros.asm'}\\
+ {\color{highlight_lst_include}\verb' =1'}{\color{highlight_lst_line}\verb' 6'}\verb' '{\color{highlight_macro}\verb'my_cpl'}\verb' '{\color{highlight_directive}\verb'macro'}\verb' '{\color{highlight_constant}\verb'foo'}\\
+ {\color{highlight_lst_include}\verb' =1'}{\color{highlight_lst_line}\verb' 7'}\verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_constant}\verb'foo'}\\
+ {\color{highlight_lst_include}\verb' =1'}{\color{highlight_lst_line}\verb' 8'}\verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'A'}\\
+ {\color{highlight_lst_include}\verb' =1'}{\color{highlight_lst_line}\verb' 9'}\verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_constant}\verb'foo'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'A'}\\
+ {\color{highlight_lst_include}\verb' =1'}{\color{highlight_lst_line}\verb' 10'}\verb' '{\color{highlight_directive}\verb'endm'}\\
+ {\color{highlight_lst_include}\verb' =1'}{\color{highlight_lst_line}\verb' 11'}\verb' '{\color{highlight_comment}\verb'; This is the end of file my_macros.asm'}\\
+ {\color{highlight_lst_line}\verb' 12'}\\
+ {\color{highlight_lst_line}\verb' 13'}{\color{highlight_lst_macro}\verb' +1'}\verb' '{\color{highlight_label}\verb'main:'}\verb' '{\color{highlight_macro}\verb'my_cpl'}\verb' '{\color{highlight_sfr}\verb'P0'}\verb' '{\color{highlight_comment}\verb'; Expand macro my_cpl here'}\\
+ {\color{highlight_lst_address}\verb'0000'}{\color{highlight_lst_code}\verb' E580'}{\color{highlight_lst_line}\verb' 14'}{\color{highlight_lst_macro}\verb' +1'}\verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'a'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'p0'}\\
+ {\color{highlight_lst_address}\verb'0002'}{\color{highlight_lst_code}\verb' F4'}{\color{highlight_lst_line}\verb' 15'}{\color{highlight_lst_macro}\verb' +1'}\verb' '{\color{highlight_instruction}\verb'cpl'}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ {\color{highlight_lst_address}\verb'0003'}{\color{highlight_lst_code}\verb' F580'}{\color{highlight_lst_line}\verb' 16'}{\color{highlight_lst_macro}\verb' +1'}\verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'p0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'a'}\\
+ {\color{highlight_lst_address}\verb'0005'}{\color{highlight_lst_code}\verb' 80F9'}{\color{highlight_lst_line}\verb' 17'}\verb' '{\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'main'}\verb' '{\color{highlight_comment}\verb'; Jump back to label main'}\\
+ {\color{highlight_lst_line}\verb' 18'}\verb' '{\color{highlight_directive}\verb'end'}\verb' '{\color{highlight_comment}\verb'; End of assembly'}\\
+ {\color{highlight_lst_msg}\verb'ASSEMBLY COMPLETE,'}\verb' NO ERRORS FOUND, NO WARNINGS'\\
+ \caption{A more complicated example of code listing}
+ \end{code}
+
+ Control sequences affecting format of the generated code listing.
+ \begin{table}[h!]
+ \centering{}
+ \mysmallfont{}
+ \caption{Control sequences affecting code listing}
+ \begin{tabular}{|llll|}
+ \hline
+ \$eject & \$ej & \$nolist & \$noli \\
+ \$list & \$li & \$paging & \$pi \\
+ \$nopaging & \$nopi & \$pagewidth & \$pw \\
+ \$pagelength & \$pl & \$title & \$tt \\
+ \$date & \$da & \$nosb & \$nosymbols \\
+ \$noprint & \$symbols & \$sb & \$print \\
+ \hline
+ \end{tabular}
+ \end{table}
+
+ \clearpage
+ \section{Specification of Intel\textregistered 8 HEX Format}
+ Intel\textregistered 8 HEX is a popular object file format capable of containing up to 64kB of data. Hex files have usually extension \fileextension{.hex} or \fileextension{.ihx}. These files are text files consisting of a sequence of records, each line line can contain at most one record. Records starts with ``:'' (colon) character at the beginning of the line and ends by end of the line. Everything else besides records should be ignored. Records consist of a sequence of 8-bit hexadecimal numbers (e.g. ``a2'' or ``8c''). These numbers are divided into ``fields'' with different meaning, see the example below.
+
+ \begin{code}[h]
+ \caption{An example of an Intel\textregistered 8 hex code}
+ \texttt{\colorbox{Goldenrod}{:}\colorbox{LimeGreen}{0F}\colorbox{ProcessBlue}{0000}\colorbox{Apricot}{00}\colorbox{GreenYellow}{E580F4F590E580F4F590E580F4F590}\colorbox{Lavender}{57}}\\
+ \texttt{\colorbox{Goldenrod}{:}\colorbox{LimeGreen}{0F}\colorbox{ProcessBlue}{000F}\colorbox{Apricot}{00}\colorbox{GreenYellow}{E580F4F590E580F4F590E580F4F590}\colorbox{Lavender}{48}}\\
+ \texttt{\colorbox{Goldenrod}{:}\colorbox{LimeGreen}{0F}\colorbox{ProcessBlue}{001E}\colorbox{Apricot}{00}\colorbox{GreenYellow}{E580F4F590E580F4F590E580F4F590}\colorbox{Lavender}{39}}\\
+ \texttt{\colorbox{Goldenrod}{:}\colorbox{LimeGreen}{10}\colorbox{ProcessBlue}{002D}\colorbox{Apricot}{00}\colorbox{GreenYellow}{E580F4F5907410B3758010B2907410B3}\colorbox{Lavender}{30}}\\
+ \texttt{\colorbox{Goldenrod}{:}\colorbox{LimeGreen}{10}\colorbox{ProcessBlue}{003D}\colorbox{Apricot}{00}\colorbox{GreenYellow}{758010B2902694052600940426940526}\colorbox{Lavender}{0A}}\\
+ \texttt{\colorbox{Goldenrod}{:}\colorbox{LimeGreen}{10}\colorbox{ProcessBlue}{004D}\colorbox{Apricot}{00}\colorbox{GreenYellow}{00940426009404269405E580F4F59026}\colorbox{Lavender}{8A}}\\
+ \texttt{\colorbox{Goldenrod}{:}\colorbox{LimeGreen}{0B}\colorbox{ProcessBlue}{005D}\colorbox{Apricot}{00}\colorbox{GreenYellow}{009404269405E580F4F590}\colorbox{Lavender}{63}}\\
+ \texttt{\colorbox{Goldenrod}{:}\colorbox{LimeGreen}{00}\colorbox{ProcessBlue}{0000}\colorbox{Apricot}{01}\colorbox{Lavender}{FF}}\\\\
+ \colorbox{Goldenrod}{\color{Goldenrod}X} Start code\\
+ \colorbox{LimeGreen}{\color{LimeGreen}X} Byte count\\
+ \colorbox{ProcessBlue}{\color{ProcessBlue}X} Address\\
+ \colorbox{Apricot}{\color{Apricot}X} Record type\\
+ \colorbox{GreenYellow}{\color{GreenYellow}X} Data\\
+ \colorbox{Lavender}{\color{Lavender}X} Checksum (two's complement of 8-bit sum of entire record, except for the start code and the checksum itself)
+ \end{code}
+
+ Record types available in Intel\textregistered 8 HEX
+ \begin{description}
+ \item[00] Data record
+ \item[01] End of file record
+ \end{description}
+
+\chapter{Disassembler}
+ Disassembler is a tool intended to generate assembly language code from an object file. In other words it has certain level of capability of reversing the assembly process and regaining the original source code from any object code. But there are some restriction to that capability and the whole thing is not so simple after all. So let's discuss disassembly process deeper. In MCU~8051~IDE you can invoke disassembler from the main menu ``\menuitem{Main Menu}'' $\rightarrow$ ``\menuitem{Tools}'' $\rightarrow$ ``\menuitem{Disassemble}''.
+
+ \bigskip
+ \noindent
+ \begin{center}
+ \small{A simple example of a code generated by disassembler}
+ \end{center}
+ \begin{minipage}{\textwidth}
+ \twocolumn
+ \begin{minipage}[t]{.6\textwidth}
+ \mysmallfont{}
+ \textbf{Original code:}\\
+ \verb' '{\color{highlight_directive}\verb'org'}\verb' '{\color{highlight_hex}\verb'0h'}\verb' '{\color{highlight_comment}\verb'; Start at address 0x00'}\\
+ \verb''\\
+ {\color{highlight_label}\verb'main:'}\verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_sfr}\verb'R0'}\verb' '{\color{highlight_comment}\verb'; Increment R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cjne'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#07Fh'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_constant}\verb'main'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_dec}\verb'#0d'}\verb' '{\color{highlight_comment}\verb';'}\\
+ \verb' '{\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'main'}\verb' '{\color{highlight_comment}\verb'; Jump back to label main'}\\
+ \verb''\\
+ \verb' '{\color{highlight_directive}\verb'end'}\verb' '{\color{highlight_comment}\verb'; End of assembly'}\\
+ \end{minipage}\begin{minipage}[t]{.4\textwidth}
+ \mysmallfont{}
+ \textbf{Code generated by disassembler}\\
+ \verb' '{\color{highlight_directive}\verb'ORG'}\verb' '{\color{highlight_hex}\verb'0h'}\\
+ {\color{highlight_label}\verb'label0:'}\verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_sfr}\verb'R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'cjne'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#7Fh'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_constant}\verb'label0'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#0h'}\\
+ \verb' '{\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'label0'}\\
+ \verb''\\
+ \verb' '{\color{highlight_directive}\verb'END'}\\
+ \end{minipage}
+ \onecolumn
+ \end{minipage}
+
+ As you can see from the example above, the code generated by disassembler is the same as the original code. But of course original symbol names have vanished as well as comments, indentation and other tiny details which cannot be determined from the object code. This is caused by the simple fact that the object code contains only the machine code. It contains no information regarding how exactly the original code looked like. Just instructions with their operands and data directly written to the code memory by ``DB'' and ``DW'' directives. And here we are getting to the real problem which emerges every time when you try to disassemble ``not exactly a simple'' code.
+
+ 8051 instructions comprises of 1, 2 or 3 bytes, the first byte determinates what instruction are we dealing with and so what is its length in bytes. But if the original code contained directives ``DB'' or ``DW'' then the disassembler ``thinks'' that these values are instructions too. If the disassembler consider a arbitrary value given by ``DB'' or ``DW'' instruction to be an instruction, it determinates its length according to its OP code (the 1st argument to the directive). And so it takes 0, 1 or 2 bytes next and interprets them as operands to that instruction. Then when it encounters a real instruction OP code it might think of it as another operand to something and so misinterpret it. Then you might end up with a code that is completely different from the original code and makes no sense at all to human. But if you reassemble such a ``non sense'' code with disabled peep hole optimization you must get the original object code back, and its functionality must not be changed. Even if the code seems to be absolutely non sense. In that case I strongly recommend to use another disassembler than is the built-in one. Consider for example D52 \url{http://www.8052.com/users/disasm/}. The built-in diassembler is provided just for ``completeness'', but its suitability for a real reverse engineering is highly questionable.
+
+ \bigskip
+ \noindent
+ \begin{center}
+ \small{A simple example of a BADLY generated code by disassembler}
+ \end{center}
+ \begin{minipage}{\textwidth}
+ \twocolumn
+ \begin{minipage}[t]{.6\textwidth}
+ \mysmallfont{}
+ \textbf{Original code:}\\
+ \verb' '{\color{highlight_directive}\verb'org'}\verb' '{\color{highlight_hex}\verb'0h'}\verb' '{\color{highlight_comment}\verb'; Start at address 0x00'}\\
+ \verb''\\
+ {\color{highlight_label}\verb'main:'}\verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_sfr}\verb'R0'}\verb' '{\color{highlight_comment}\verb'; Increment R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'jmp'}\verb' '{\color{highlight_constant}\verb'cont'}\\
+ \verb' '{\color{highlight_directive}\verb'db'}\verb' '{\color{highlight_string}\verb''\verb"'"\verb'some stringx'\verb"'"\verb''}\\
+ {\color{highlight_label}\verb'cont:'}\verb' '{\color{highlight_instruction}\verb'cjne'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#07Fh'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_constant}\verb'main'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_dec}\verb'#0d'}\verb' '{\color{highlight_comment}\verb';'}\\
+ \verb' '{\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'main'}\verb' '{\color{highlight_comment}\verb'; Jump back to label main'}\\
+ \verb''\\
+ \verb' '{\color{highlight_directive}\verb'end'}\verb' '{\color{highlight_comment}\verb'; End of assembly'}\\
+ \end{minipage}\begin{minipage}[t]{.4\textwidth}
+ \mysmallfont{}
+ \textbf{Code generated by disassembler}\\
+ {\color{highlight_constant}\verb'label0'}\verb' '{\color{highlight_directive}\verb'CODE'}\verb' '{\color{highlight_hex}\verb'11h'}\\
+ \verb''\\
+ \verb' '{\color{highlight_directive}\verb'ORG'}\verb' '{\color{highlight_hex}\verb'0h'}\\
+ {\color{highlight_label}\verb'label1:'}\verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_sfr}\verb'R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'inc'}\verb' '{\color{highlight_indirect}\verb'@R0'}\\
+ \verb' '{\color{highlight_instruction}\verb'ljmp'}\verb' '{\color{highlight_constant}\verb'label0'}\\
+ \verb' '{\color{highlight_instruction}\verb'jmp'}\verb' '{\color{highlight_indirect}\verb'@A+DPTR'}\\
+ \verb' '{\color{highlight_instruction}\verb'xrl'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'R7'}\\
+ \verb' '{\color{highlight_instruction}\verb'xrl'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'R5'}\\
+ \verb' '{\color{highlight_instruction}\verb'xrl'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_hex}\verb'20h'}\\
+ \verb' '{\color{highlight_instruction}\verb'jmp'}\verb' '{\color{highlight_indirect}\verb'@A+DPTR'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#72h'}\\
+ \verb' '{\color{highlight_instruction}\verb'xrl'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'R1'}\\
+ \verb' '{\color{highlight_instruction}\verb'xrl'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_sfr}\verb'R6'}\\
+ \verb' '{\color{highlight_instruction}\verb'xrl'}\verb' '{\color{highlight_sfr}\verb'A'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_indirect}\verb'@R1'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#0B8h'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'R7'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#0ECh'}\\
+ \verb' '{\color{highlight_instruction}\verb'mov'}\verb' '{\color{highlight_sfr}\verb'R0'}{\color{highlight_oper_sep}\verb','}\verb' '{\color{highlight_imm_hex}\verb'#0h'}\\
+ \verb' '{\color{highlight_instruction}\verb'sjmp'}\verb' '{\color{highlight_constant}\verb'label1'}\\
+ \verb''\\
+ \verb' '{\color{highlight_directive}\verb'END'}\\
+ \end{minipage}
+ \onecolumn
+ \end{minipage}
+
+\chapter{MCU simulator}
+ \section{Short introduction}
+ The MCU simulator is a tool designed to mimics behavior of a real MCU as much as possible. But it can have certain limitations, the most expectable limitation is of course the speed of simulation. This simulator is very slow, but offers some extra features.
+
+ \section{Modes of simulation}
+ There are 4 modes of simulation:
+ \begin{description}
+ \item[Step]
+ Execute exactly one intruction, no matter how many machine cycles it will take. This does not apply for macro-instruction, in that case each instruction of the macro is executed separately.
+ \item[Step over]
+ Execute as many instructions as possible until simulator cursor changes its location from one line of source code to another.
+ \item[Animate]
+ Do the same as ``step'' but in a loop, one after another until stopped by a waring condition or user request.
+ \item[Run]
+ This is generally the same as ``animate'', but much faster, because GUI is not updated so offten as in the ``animate'' mode.
+ \item[(Step Back)]
+ Take back the last performed step. There is limited number of step which can be taken back.
+ \end{description}
+
+ Virual HW can be enabled or disabled, it significantly affects speed of the simulation. Of course simulation is slower when virtual HW is on.
+
+ \section{Waring conditions}
+ \begin{itemize}
+ \setlength{\itemsep}{-3pt}
+ \item Stack overflow
+ \item Stack underflow
+ \item Invalid instructions
+ \item Watchdog overflow
+ \item Invalid return from interrupt
+ \item Reading from write only register
+ \item Invalid access to IDATA/SFR
+ \item Invalid access to EDATA
+ \item Invalid access to XDATA
+ \item Invalid access to bit
+ \item Invalid access to CODE
+ \item EEPROM write failure
+ \item EEPROM write abort
+ \item UART frame discard
+ \item Illegal UART mode change
+ \item Illegal Timer/Counter mode change
+ \end{itemize}
+
+ \section{Limitations}
+ \begin{enumerate}
+ \setlength{\itemsep}{-3pt}
+ \item UART simualation is limited in current version
+ \item SPI simulation is not implemented
+ \item Simulation of reduced power consumption modes is not supported
+ \item Simulated MCU is many times slower the real one would be on ``normal'' conditions
+ \end{enumerate}
+
+ \clearpage
+ \section{Virtual hardware}
+ MCU~8051~IDE simulator is also equipped with a few simulated simple hardware devices, which can be connected to the simulated MCU. These virtual hardware components are intended primarily to offer a better insight into programs interacting with things like LEDs or keys.
+
+ All wires connected to specific GPIO lines are colored according to the voltage level present on them, colors are the same as for graph in the bottom panel ({\color{Green}\small{GREEN}} == log. 0; {\color{Red}\small{RED}} == log. 1; {\color{Gray}\small{GRAY}} == not connected, etc.) Each of these virtual HW components has its own configuration menu and help text available trough that menu. Configuration can be saved to a file with extension \fileextension{.vhc}, and can be loaded from that file later. The configuration menu is accessible trough the button with this icon: ``\includegraphics[height=8pt]{img/configure.png}''. The \small{``\texttt{\colorbox{Green}{ON}}''/``\texttt{\colorbox{Red}{OFF}}''} button enables or disables entire subsystem of virtual hardware simulation including the graph of GPIO wires on the bottom panel.
+
+ \subsection{DS1620 temperature sensor}
+ \begin{wrapfigure}{r}{150pt}
+ \centering{}
+ \includegraphics[width=110pt]{img/049.png}
+ \includegraphics[width=110pt]{img/050.png}
+ \caption{DS1620 simulator and its log window}
+ \end{wrapfigure}
+ Simulates DALLAS\textregistered DS1620 thermometer along with its 3-wire communication interface. Temperature which this simulated device should measure can be set by used on the scale in DS1620 simulator window. All internal registers of the device are displayed to the user and are modifiable by the user, current configuration of the device simulator including DS1620 non-volatile registers can be save into a file for further use. All communications with the simulated MCU and internal operation of the simulated thermometer are displayed in simulator log, log can be accessed via the DS1620 simulator configuration menu (``\includegraphics[height=8pt]{img/configure.png}'').
+
+% \subsection{Virtual UART terminal}
+% This tool simulated UART device connected to the main MCU simulator, it's purpose is to make it easier to properly simulate programs using the 8051 UART interface. User can set where the TxD and RxD wire are connected to the MCU, baud rate, number of stop bits, etc. and send arbitrary data and see received data.
+
+ \subsection{File interface}
+ \begin{wrapfigure}{l}{185pt}
+ \centering{}
+ \includegraphics[width=110pt]{img/048.png}
+ \caption{PALE I/O interface}
+ \end{wrapfigure}
+ This tool can automatically switch states of GPIO lines of the simulated according to certain definition file and it can also record all changes occurring on arbitrary GPIO line to a specified output file. This function can be particularly useful when you are dealing with a 8051 program which extensively works with I/O ports.
+
+ \subsection{LED Panel}
+ \begin{wrapfigure}{r}{180pt}
+ \centering{}
+ \includegraphics[width=110pt]{img/015.png}
+ \caption{LED Panel}
+ \end{wrapfigure}
+ This is the simplest example of such a virtual hardware component. A simple panel consisting of 8 independent LEDs with common anode. Each LED can be connected to separate port and pin and react immediately to any change in voltage level on that line. Connections with the \uC are made with combo boxes on the bottom side of the panel.
+
+ \subsection{Single LED Display}
+ \begin{wrapfigure}{l}{180pt}
+ \centering{}
+ \includegraphics[width=70pt]{img/012.png}
+ \caption{LED Display}
+ \end{wrapfigure}
+ Single 8 segment LED display with one decimal point. Common electrode for the LEDs can be configured as well as the LED color. Each LED can be independently connected to any port and pin and reacts immediately to any change in voltage level on that pin. Common electrode is statically connected to either common ground or Vcc.
+
+ \subsection{Multiplexed LED Display}
+ \begin{wrapfigure}{r}{155pt}
+ \centering{}
+ \includegraphics[width=130pt]{img/011.png}
+ \caption{M LED Display}
+ \end{wrapfigure}
+ 4 digits LED displays indented for run in multiplexed mode, LEDs are fading with configurable delay. Each digit has its own common electrode which polarity is configurable, this common electrode is connected to output from an inverter or transistor. There are four color shades for each LED segment, one for inactive, one for active, one for fast blinking and one for segment which was recently dimmed, that makes it possible to see an image which would probably appear on a real display when viewed just by the eye. Unit for the fading interval is one instruction cycle.
+ \clearpage
+ \subsection{LED Matrix}
+ \begin{wrapfigure}{l}{150pt}
+ \centering{}
+ \includegraphics[width=80pt]{img/014.png}
+ \caption{LED Matrix}
+ \end{wrapfigure}
+ Simple one color 8 x 8 LED matrix indented for run in multiplexed mode, LEDs are fading with configurable delay. Everything here is the same as for the Multiplexed LED Display, except for one thing, mapping. Mapping can be set to row, column or random, which is default. Row mapping means that row which has been activated right now immediately forgets which LEDs were shinning last time and which were not. Column mapping is the same but for columns and random mapping means that each LED will dim after specified interval and not when its row or column is activated. So in random mapping you have to wait until all LEDs are gray before you can draw a new image without being affected by the last one.
+
+ \subsection{Matrix Keypad}
+ \begin{wrapfigure}{r}{200pt}
+ \centering{}
+ \includegraphics[width=80pt]{img/013.png}
+ \caption{Matrix Keypad}
+ \end{wrapfigure}
+ 4 x 4 Matrix keypad, each row and column can be connected to any GPIO line. Connections with the \uC are made with the combo boxes. Keys can be configured to behave as radio button\footnote{Radio buttons that means that one one key can be pressed at the time and when you press another key, the originally pressed key will return back to non pressed state}. Note that this tool can be also used to interconnect some port pins together statically, like wires in a bread board. Any key press takes effect immediately in all other virtual hardware components connected to the same line.
+
+ \clearpage
+ \subsection{Simple Keypad}
+ \begin{wrapfigure}{l}{180pt}
+ \centering{}
+ \includegraphics[width=110pt]{img/016.png}
+ \caption{Simple Keypad}
+ \end{wrapfigure}
+ Array of 8 independent keys, each one of them can connect any GPIO line to the ground. Any key press takes effect immediately in all other virtual hardware components connected to the same line. Keys can also be configured to behave as radio buttons.
+
+ \enlargethispage{6\baselineskip}
+ \subsection{LCD display controlled by HD44780}
+ This tool simulates a HD44780 character LCD of any size up to 2 rows and 40 columns. There are 11 I/O lines serving as interface for the MCU, ``E'', ``RS'', ``R/W'' and ``D0''..``D7''. User can view end modify content of the display data RAM (DDRAM), the character generator RAM (CGRAM) and certain HD44780 registers: instruction register (IR), data register (DR), address counter (AC) and display shift, these registers are shown in hexadecimal representation.
+ User can also view content of character generator ROM (CGROM) and set font to use. All of the driver commands are fully supported and all important events occurring in the simulated driver (HD44780) are recorded in the simulator log. User can also see and modify certain HD44780 configuration flags like ``B'', ``S'', ``D'' and so on. And the window is collapsible.
+ \begin{figure}[h!]
+ \begin{minipage}[b]{.5\textwidth}
+ \begin{minipage}[b]{\textwidth}
+ \centering{}
+ \includegraphics[width=1\textwidth]{img/043.png}
+ \caption{Simulated LCD display}
+ \end{minipage}
+
+ \begin{minipage}[b]{\textwidth}
+ \centering{}
+ \includegraphics[width=1\textwidth]{img/044.png}
+ \caption{HD44780 Log}
+ \end{minipage}
+
+ \begin{minipage}[b]{\textwidth}
+ \begin{minipage}[b]{.45\textwidth}
+ \centering{}
+ \includegraphics[width=.9\textwidth]{img/045.png}
+ \caption{CGRAM}
+ \end{minipage}
+ \begin{minipage}[b]{.45\textwidth}
+ \centering{}
+ \includegraphics[width=.9\textwidth]{img/046.png}
+ \caption{DDRAM}
+ \end{minipage}
+ \end{minipage}
+ \end{minipage}
+ \begin{minipage}[b]{.5\textwidth}
+ \centering{}
+ \includegraphics[width=\textwidth]{img/047.png}
+ \caption{View on CGROM}
+ \end{minipage}
+ \end{figure}
+
+\chapter{Writing hardware tool control plug-ins}
+ \label{sec:WritingHardwareToolControlPlugIns}
+ \section{Foreword}
+ \begin{wrapfigure}{r}{120pt}
+ \centering{}
+ \includegraphics[width=110pt]{img/ssp89s_sceenshot.png}
+ \caption{An example of HW control plug-in}
+ \end{wrapfigure}
+ It is not surprising that IDE for micro-controllers should be capable of inter-operation with certain hardware tools. MCU~8051~IDE has tool named HW plug-ins manager which is responsible for loading and managing plug-ins written in order to to ``integrate'' exiting hardware tools into this IDE. With this feature every author of a 8051 programmer, ICD, ICE etc. who knows Tcl/Tk language has the opportunity to make his or her own tool working in direct cooperation with the IDE. These plug-ins have to be written at least partially in the TCL language and use the Tk library along with API of MCU~8051~IDE. But that doesn't mean that they should be written entirely in Tcl/Tk. On the contrary I would encourage usage of another languages for example SSP89S, also a part of MCU~8051~IDE project, is written almost completely in C++/Qt4, but only a ``small'' piece of the software is written in Tcl/Tk. Tcl/Tk can easily inter-operate with C and C++, also it is possible to run arbitrary separate process from inside of Tcl/Tk program and control it vie for example TCP sockets or its stdin/stdout or something else.
+
+ \section{How to write your own plug-in}
+ At first take these steps:
+ \begin{enumerate}
+ \item \textbf{Create the plug-in directory}\label{plug-in directory} \\
+ On POSIX system the plug-in directory have to be placed in\\
+ ``/usr/share/mcu8051ide/hwplugins'', on Microsoft\textregistered Windows\textregistered the directory is ``<YourInstallationDirectory>\verb'\'hwplugins''. The plug-in directory must carry the name of your plug-in, where spaces are replaced with ``\_'' (underscore) characters. For example suppose you want to create a plug-in named as ``My~First~Plug-in~v1.0'', then your plug-in directory directory is ``My\_First\_Plug-in\_v1.0''.
+ \item \textbf{Create the plug-in initialization file} \\
+ Plug-in initialization file tells the IDE that there is some plug-in at all. The file contains basic initialization of the plug-in environment and must follow certain rules. The file name must also follow name of the plug-in in the same way as the plug-in directory. But the initialization file have to be placed in directory hwplugins. And must have extension \fileextension{.tcl}! For example consider again our ``My~First~Plug-in~v1.0'' plug-in, as we mentioned before. The plug-in directory is: ``/usr/share/mcu8051ide/\underline{hwplugins}/My\_First\_Plug-in\_v1.0'' then the initialization file is:\\
+ ``/usr/share/mcu8051ide/\underline{hwplugins}/My\_First\_Plug-in\_v1.0\underline{.tcl}''.
+ \item \textbf{Define mandatory variables} \\
+ {
+ \mysmallfont{}
+ \begin{verbatim}
+ set AUTHOR "<your name>" ;# e.g. "Homer Simpson"
+ set EMAIL "<your_email@example.com>" ;# e.g. "superman.spiderman@supehero.ru"
+ set P_VERSION "<version_of_your_plug-in>" ;# e.g. "1.2.3" or "0.9"
+ set MIN_IDE_VER "1.1" ;# Mimimal required version of MCU 8051 IDE
+ \end{verbatim}
+ }
+ \item \textbf{Define mandatory functions} \\
+ {
+ \mysmallfont{}
+ \begin{verbatim}
+ # Free resources occupied by this plugin
+ proc dispose {} { ... }
+
+ # Initialize the plug-in
+ proc init {main_frame current_namespace directory} { ... }
+
+ # Restore previous session
+ proc restore_session {session_data} { ... }
+
+ # Save plug-in session
+ proc save_session {} { ...; return <String> }
+
+ # Is plugin busy ?
+ proc is_busy {} { ...; return <BooleanValue> }
+ \end{verbatim}
+ }
+
+ ``...'' means any code you want there. See ``/usr/share/mcu8051ide/\underline{hwplugins}/plug-in\_template.txt'' or ``<YourInstallationDirectory>\verb'\'hwplugins\verb'\'plug-in\_template.txt'' for more details and for a template for such file.
+ \end{enumerate}
+
+ When you have these steps completed you have prepared basic environment for the plug-in. Then the ``HW plug-ins manager'' in the right panel in IDE's GUI should now recognize your plug-in and be able to attempt to load it. If it is not so, then there is definitely something wrong. Any other files which your plug-in consist of and just whatever you want there should be placed in your plug-in directory (\ref{plug-in directory}). And the initialization file should do nothing else than source some real plug-in's file(s) and call appropriate functions inside them. One more important thing, the plug-in runs it \textbf{dynamically assigned namespace}. Take it into account, otherwise your plug-in wont work! Function ``init'' takes the name of this namespace in parameter ``current\_namespace''. So as you can see, it's quite easy you have just to define 4 variables and 5 functions and you can interface with the IDE.
+
+ \section{Using MCU~8051~IDE API}
+ You can used any part the API you want, but the entire IDE's API is wast and may change in future without notice. So there is special API dedicated to use in hardware control plug-ins, it is located in ``\texttt{::HwManager}'' namespace and consists of merely 10 simple functions. This API is available since version 1.4. Here is the list of its functions:
+
+ {
+ \mysmallfont{}
+ \begin{verbatim}
+ ## Check whether there is some project opened in the IDE
+ # @return Bool - 1 == Yes, there is; 0 == No there is not
+ proc is_project_opened {}
+
+ ## Check whether MCU simulator is engaged
+ # @return Bool - 0 == 1 == Yes, it is; No it is not (or no project is opened)
+ proc is_simulator_engaged {}
+
+ ## Get full name of file which is currently displayed in the source code editor
+ # @return String - Full file name including path or empty string in case there is no project opened
+ proc get_current_file {}
+
+ ## Get full name of file which has been chosen as the project main file
+ # @return String - Full file name or empty string
+ proc get_project_main_file {}
+
+ ## Get path the directory of currently active project
+ # @return String - Directory path or empty string in case there is no project opened
+ proc get_project_dir {}
+
+ ## Get name of the current project
+ # @return String - Name of the current project or empty string in case there is no project opened
+ proc get_project_name {}
+
+ ## Initiate compilation if at least one of the source files was modified
+ # @parm String success_callback - Any command to execute after successful compilation
+ # @parm String failure_callback - Any command to execute after unsuccessful compilation
+ # @return Bool - 1 == Process successfully started; 0 == Unable to comply (no project is opened)
+ proc compile_if_nessesary_and_callback {success_callback failure_callback}
+
+ ## Open the specified Intel® 8 hex file in hexadecimal editor
+ # @parm String filename - Name of file to open (including path)
+ # @return Bool - 1 == Success; 0 == Failure
+ proc open_in_hexeditor {filename}
+
+ ## Start MCU simulator if possible
+ # @return Bool - 1 == Success; 0 == Unable to comply
+ proc start_simulator {}
+
+ ## Shutdown MCU simulator if possible
+ # @return Bool - 1 == Success; 0 == Unable to comply
+ proc shutdown_simulator {}
+ \end{verbatim}
+ }
+
+ \section{A basic example}
+ Lets write just a simple plug-in which merely demonstrates usage of some of the above mentioned functions.
+ \begin{figure}[h!]
+ \centering{}
+ \includegraphics[width=120pt]{img/029.png}
+ \caption{A basic example of a plug-in}
+ \end{figure}
+
+ {
+ \fontsize{7pt}{9pt} \selectfont{}
+ \begin{verbatim}
+ set AUTHOR "Homer Simpson"
+ set EMAIL "superman.spiderman@supehero.ru"
+ set P_VERSION "1.0"
+ set MIN_IDE_VER "1.3.11"
+
+ proc dispose {} {
+ tk_messageBox \
+ -title "My First Plug-in" \
+ -message "Called: dispose {}"
+ }
+
+ proc init {main_frame project_object current_namespace directory} {
+ pack [label $main_frame.l0 -text $current_namespace] -anchor w
+ pack [label $main_frame.l1 -text $directory] -anchor w
+
+ set f [labelframe $main_frame.f -text "My First Plug-in"]
+ pack [label $f.l0 -text "is_project_opened : [::HwManager::is_project_opened]"] -anchor w
+ pack [label $f.l1 -text "is_simulator_engaged : [::HwManager::is_simulator_engaged]"] -anchor w
+ pack [label $f.l2 -text "get_current_file : [::HwManager::get_current_file]"] -anchor w
+ pack [label $f.l3 -text "get_project_main_file : [::HwManager::get_project_main_file]"] -anchor w
+ pack [label $f.l4 -text "get_project_dir : [::HwManager::get_project_dir]" ] -anchor w
+ pack [label $f.l5 -text "l : [::HwManager::get_project_name]"] -anchor w
+
+ pack [ttk::button $f.b0 -text "update" -command "
+ $f.l0 configure -text \"is_project_opened : \[::HwManager::is_project_opened\]\"
+ $f.l1 configure -text \"is_simulator_engaged : \[::HwManager::is_simulator_engaged\]\"
+ $f.l2 configure -text \"get_current_file : \[::HwManager::get_current_file\]\"
+ $f.l3 configure -text \"get_project_main_file : \[::HwManager::get_project_main_file\]\"
+ $f.l4 configure -text \"get_project_dir : \[::HwManager::get_project_dir\]\"
+ $f.l5 configure -text \"get_project_name : \[::HwManager::get_project_name\]\"
+ "] -anchor w
+ pack $f -fill both -expand 1
+
+ pack [ttk::button $main_frame.b1 \
+ -text "start_simulator" \
+ -command {::HwManager::start_simulator} \
+ ] -side left
+ pack [ttk::button $main_frame.b2 \
+ -text "shutdown_simulator" \
+ -command {::HwManager::shutdown_simulator} \
+ ] -side left
+ }
+
+ proc restore_session {session_data} {
+ tk_messageBox \
+ -title "My First Plug-in" \
+ -message "Called: restore_session {$session_data}"
+ }
+
+ proc save_session {} {
+ tk_messageBox \
+ -title "My First Plug-in" \
+ -message "Called: save_session {}"
+ return "my data, time: [clock format [clock seconds] -format {%T}]"
+ }
+
+ proc is_busy {} {
+ return [expr {
+ [tk_messageBox \
+ -title "My First Plug-in" \
+ -message "Called: is_busy {}" \
+ -type {yesno}
+ ]
+ == {yes}}]
+ }
+ \end{verbatim}
+ }
+
+ \section{Random remarks}
+ \begin{itemize}
+ \item Don't forget that your plug-in runs the main thread as well as the GUI of the entire IDE. So if your plug-in does some time expensive operations and it is probable that it does. Then these operations have to be performed in either separate thread or have to run in separate process. It is also possible to regularly ``update'' the application by reentering the event loop using Tcl's \textbf{update} command.
+ \item Plug-in files must use encoding UTF-8 and should use LF (Line Feed) character as line end delimiter. In other words Unix line termination sequence.
+ \item Although it is possible to name the plug-in directory in any way what your OS accept. It is generally a good idea to follow the mentioned recommendation. At least the name of the initialization file have to follow the mentioned recommendation.
+ \item Plug-ins have unrestricted access to the entire application. So they should be written carefully, because plug-ins can theoretically crash down the entire IDE.
+ \item Program errors which occurs during loading or unloading of a plug-in are reported via a special dialog. In this dialog plug-in author and his or her email address are mentioned.
+ \item The above mentioned API provided by ``\texttt{::HwManager}'' is just a facade\footnote{A design pattern as described in the GOF book}. Before version 1.4 plug-ins must have had to be written to access directly the functionality currently hidden behind ``\texttt{::HwManager}'', so it was much more complicated.
+ \item Each instance of a hardware plug-ins manager is bond to its project. But actual plug-ins don't have to be. That's the reason why there is function ``::HwManager::is\_project\_opened {}''. All functions inside the above mentioned API (\texttt{::HwManager::*}) works with the current project, not necessaryly with the project which is the HW manager bond with.
+ \end{itemize}
+
+\chapter{Command Line Interface}
+ MCU~8051~IDE's CLI makes it possible to use entire IDE just as an assembler, disassembler or converter between \fileextension{.hex} files and binary files. MCU~8051~IDE supports these switches:\\
+ {
+ \mysmallfont{}
+ \begin{longtable}{ll}
+ \textbf{\normalsize{Switch}} & \textbf{\normalsize{Meaning}} \\\hline
+ \endhead
+ \\\multicolumn{2}{l}{\textbf{General}} \\\hline
+ \texttt{--help, -h} & Show help for CLI \\
+ \texttt{--quiet, -q} & Do not who initialization progress on start-up \\
+ \texttt{--nosplash} & Do not show the splash screen \\
+ \texttt{--nocolor, -n} & Do not show colorful output in console \\
+ \texttt{--version, -V} & Show program version and exit \\
+ \texttt{--defaults} & Ru program in empty session \\
+ \texttt{--minimalized} & Run in minimalized window \\
+ \texttt{--config-file filename} & Specify path to an alternative configuration file \\
+ \texttt{--check-libraries} & Verify whether all required libraries are available \\
+ \texttt{--ignore-last-session} & Start with an empty session \\
+ \texttt{--open-project project} & Open just this project \\
+ \texttt{--reset-user-settings} & Reset all user setting to defaults \\
+ \\\multicolumn{2}{l}{\textbf{Data conversions}} \\\hline
+ \texttt{--auto-indent input} & Reformat indentation the specified file \\
+ \texttt{--hex2bin input output} & Convert Intel 8 Hex into a binary file \\
+ \texttt{--bin2hex input output} & Convert a binary file in Intel 8 HEX \\
+ \texttt{--sim2hex input output} & Convert MCU~8051~IDE simulator file to Intel 8 Hex file \\
+ \texttt{--sim2bin input output} & Convert MCU~8051~IDE simulator file to binary file \\
+ \texttt{--normalize-hex input} & Normalize Intel 8 HEX (force incremental addressing order) \\
+ \\\multicolumn{2}{l}{\textbf{Assembler/Disassembler}} \\\hline
+ \texttt{--disassemble hex\_file}& Disassemble Intel 8 HEX file to hex\_file.asm \\
+ \texttt{--assemble asm\_file} & Assemble the specified file \\
+ \texttt{--compile asm\_file} & The same as ``--assemble'' \\
+ \texttt{--iram-size size} & Set size of internal data memory for assembler \\
+ \texttt{--code-size size} & Set size of program data memory for assembler \\
+ \texttt{--xram-size size} & Set size of external data memory for assembler \\
+ \texttt{--no-opt} & Disable peephole optimization \\
+ \texttt{--comp-quiet} & Suppress text output from the assembler \\
+ \texttt{--no-sim} & Disable generation of .adf file \\
+ \texttt{--no-bin} & Disable generation of .bin file \\
+ \texttt{--no-lst} & Disable generation of .lst file \\
+ \texttt{--no-hex} & Disable generation of .hex file \\
+ \texttt{--warning-level} 0-3 & Set warning level to the specified level \\
+ \end{longtable}
+ }
+
+ \noindent
+ Interesting examples:
+ {
+ \mysmallfont{}
+ \begin{verbatim}
+ # Reset all IDE settings to defaults
+ mcu8051ide --reset-user-settings
+
+ # Use MCU 8051 IDE as assembler (without GUI)
+ mcu8051ide --compile /some_directory/my_file.asm
+
+ # Use MCU 8051 IDE as disssembler (without GUI)
+ mcu8051ide --disassemble /some_directory/my_file.hex
+
+ # Use MCU 8051 IDE as convertor from binary files to Intel 8 HEX (without GUI)
+ mcu8051ide --bin2hex /some_directory/my_file /some_directory/my_file.hex
+ \end{verbatim}
+ }
+
+\chapter{Translating the IDE into different languages}
+ The IDE can be translated to almost any language. The translation can be accomplished by creating of a translation definition file. Such a file must follow certain strict rules in order to work properly. Translation files are normally located in directory ``/usr/share/mcu8051ide/translations'', on Microsoft\textregistered Windows\textregistered the directory is ``<YourInstallationDirectory>\verb'\'translations''. There you can find file ``template.txt'' which is template of MCU 8051 IDE translation file. Along with it there is also file ``languages.txt'' which defines names of languages to which the IDE was already translated. These names are written in these languages. Translation files look like this ``ru.msg'' (Russian translation) or ``cs.msg'' (Czech translation), these files need to be regularly updated. Note also that these files are quite big, each about 0.5MB and each contains about 4500 translated sentences. Further details regarding the translation are mentioned directly in the files related to translation, particularly in file ``template.txt''. Refer to them if you are interested in making your own translation of the IDE. This is an open-source project so any help is appreciated.
+
+ \bigskip
+ \noindent
+ {
+ The first several lines in file ``template.txt'':\\
+ \mysmallfont{}
+ \begin{verbatim}
+ # This is a template of MCU 8051 IDE translation file
+ #
+ # This file allows to localize the the user environment of the IDE to almost any
+ # language.
+ #
+ # HOW TO MAKE IT WORK:
+ # 1) Copy this file (template.txt) to <lang_code>.msg in the same directory.
+ # Where ``<lang_code>'' is supposed to be replaced with language code of
+ # the translation. For example ``ru'' means Russian, or ``cs'' means Czech.
+ # The language code must be lowercase.
+ # 2) Translate all sentences enclosed by ``§'' (paragraph) character. And be
+ # sure to remove the ``§'' character.
+ # 3) Modify file ``languages.tcl'' and add name of language which you are
+ # making the translation for. Name should be specified in that language.
+ #
+ # IMPORTANT RULES FOR TRANSLATION:
+ # 1) Be aware of that this file is very sensitive.
+ # 2) Everything besides actual sentences for translation must not be modified
+ # in any way! Otherwise the file might cause serious program instability.
+ # 3) Escape sequences and all special characters must be preserved.
+ # 4) Sentences enclosed with ``"'' (double quote) character, can be translated
+ # into sentences with different length. But the same does not apply for
+ # sentences enclosed with ``{'' and ``}'' (curly brackets) characters,
+ # their lengths must stay preserved.
+ # 5) Do not translate ``$'' dollar symbol, it has a special meaning here, not
+ # related to currency.
+ # 6) Keep UTF-8 encoding and if possible, please keep also Unix line ends.
+ #
+ # NOTES:
+ # 1) `` ;# <-- NOT TRANSLATED YET'' is just a comment and can be removed at
+ # any time
+ # 2) Nothing is perfect ... if you find anything strange or not functional
+ # here, please report it as a regular bug.
+ # 3) Recommended syntax highlight pattern for this file is "Tcl/Tk"
+ # 4) Please don't hesitate to ask any questions.
+ #
+ # Thank you for your cooperation, which helps us make the software better!
+ #
+ \end{verbatim}
+ }
+
+ \bigskip
+ \noindent
+ {
+ A random piece of the translation definition file template\\
+ \mysmallfont{}
+ \begin{verbatim}
+ mcset $l "Replace all" \
+ "§Replace all§" ;# <-- NOT TRANSLATED YET
+ mcset $l "Find next" \
+ "§Find next§" ;# <-- NOT TRANSLATED YET
+ mcset $l "Close" \
+ "§Close§" ;# <-- NOT TRANSLATED YET
+ mcset $l "Replace confirmation - %s" \
+ "§Replace confirmation - %s§" ;# <-- NOT TRANSLATED YET
+ mcset $l "Go to line" \
+ "§Go to line§" ;# <-- NOT TRANSLATED YET
+ mcset $l "Ok" \
+ "§Ok§" ;# <-- NOT TRANSLATED YET
+ mcset $l "Cancel" \
+ "§Cancel§" ;# <-- NOT TRANSLATED YET
+ mcset $l "Go to line - MCU 8051 IDE" \
+ "§Go to line - MCU 8051 IDE§" ;# <-- NOT TRANSLATED YET
+ mcset $l "Choose directory - MCU 8051 IDE" \
+ "§Choose directory - MCU 8051 IDE§" ;# <-- NOT TRANSLATED YET
+ \end{verbatim}
+ }
+
+\appendix
+\twocolumn
+\chapter{License}
+ MCU~8051~IDE and all its components is distributed under terms of GNU GPLv2.
+ {
+ \fontsize{5pt}{6pt}\selectfont{}
+ \enlargethispage{10\baselineskip}
+ \begin{verbatim}
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+ freedom to share and change it. By contrast, the GNU General Public
+ License is intended to guarantee your freedom to share and change free
+ software--to make sure the software is free for all its users. This
+ General Public License applies to most of the Free Software
+ Foundations software and to any other program whose authors commit to
+ using it. (Some other Free Software Foundation software is covered by
+ the GNU Library General Public License instead.) You can apply it to
+ your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+ price. Our General Public Licenses are designed to make sure that you
+ have the freedom to distribute copies of free software (and charge for
+ this service if you wish), that you receive source code or can get it
+ if you want it, that you can change the software or use pieces of it
+ in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+ anyone to deny you these rights or to ask you to surrender the rights.
+ These restrictions translate to certain responsibilities for you if you
+ distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+ gratis or for a fee, you must give the recipients all the rights that
+ you have. You must make sure that they, too, receive or can get the
+ source code. And you must show them these terms so they know their
+ rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+ (2) offer you this license which gives you legal permission to copy,
+ distribute and/or modify the software.
+
+ Also, for each authors protection and ours, we want to make certain
+ that everyone understands that there is no warranty for this free
+ software. If the software is modified by someone else and passed on, we
+ want its recipients to know that what they have is not the original, so
+ that any problems introduced by others will not reflect on the original
+ authors reputations.
+
+ Finally, any free program is threatened constantly by software
+ patents. We wish to avoid the danger that redistributors of a free
+ program will individually obtain patent licenses, in effect making the
+ program proprietary. To prevent this, we have made it clear that any
+ patent must be licensed for everyones free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+ modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+ a notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License. The "Program", below,
+ refers to any such program or work, and a "work based on the Program"
+ means either the Program or any derivative work under copyright law:
+ that is to say, a work containing the Program or a portion of it,
+ either verbatim or with modifications and/or translated into another
+ language. (Hereinafter, translation is included without limitation in
+ the term "modification".) Each licensee is addressed as "you".
+
+ Activities other than copying, distribution and modification are not
+ covered by this License; they are outside its scope. The act of
+ running the Program is not restricted, and the output from the Program
+ is covered only if its contents constitute a work based on the
+ Program (independent of having been made by running the Program).
+ Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Programs
+ source code as you receive it, in any medium, provided that you
+ conspicuously and appropriately publish on each copy an appropriate
+ copyright notice and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any warranty;
+ and give any other recipients of the Program a copy of this License
+ along with the Program.
+
+ You may charge a fee for the physical act of transferring a copy, and
+ you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+ of it, thus forming a work based on the Program, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the Program,
+ and can be reasonably considered independent and separate works in
+ themselves, then this License, and its terms, do not apply to those
+ sections when you distribute them as separate works. But when you
+ distribute the same sections as part of a whole which is a work based
+ on the Program, the distribution of the whole must be on the terms of
+ this License, whose permissions for other licensees extend to the
+ entire whole, and thus to each and every part regardless of who wrote it.
+
+ Thus, it is not the intent of this section to claim rights or contest
+ your rights to work written entirely by you; rather, the intent is to
+ exercise the right to control the distribution of derivative or
+ collective works based on the Program.
+
+ In addition, mere aggregation of another work not based on the Program
+ with the Program (or with a work based on the Program) on a volume of
+ a storage or distribution medium does not bring the other work under
+ the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+ under Section 2) in object code or executable form under the terms of
+ Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+ The source code for a work means the preferred form of the work for
+ making modifications to it. For an executable work, complete source
+ code means all the source code for all modules it contains, plus any
+ associated interface definition files, plus the scripts used to
+ control compilation and installation of the executable. However, as a
+ special exception, the source code distributed need not include
+ anything that is normally distributed (in either source or binary
+ form) with the major components (compiler, kernel, and so on) of the
+ operating system on which the executable runs, unless that component
+ itself accompanies the executable.
+
+ If distribution of executable or object code is made by offering
+ access to copy from a designated place, then offering equivalent
+ access to copy the source code from the same place counts as
+ distribution of the source code, even though third parties are not
+ compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt
+ otherwise to copy, modify, sublicense or distribute the Program is
+ void, and will automatically terminate your rights under this License.
+ However, parties who have received copies, or rights, from you under
+ this License will not have their licenses terminated so long as such
+ parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify or
+ distribute the Program or its derivative works. These actions are
+ prohibited by law if you do not accept this License. Therefore, by
+ modifying or distributing the Program (or any work based on the
+ Program), you indicate your acceptance of this License to do so, and
+ all its terms and conditions for copying, distributing or modifying
+ the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program subject to
+ these terms and conditions. You may not impose any further
+ restrictions on the recipients exercise of the rights granted herein.
+ You are not responsible for enforcing compliance by third parties to
+ this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent issues),
+ conditions are imposed on you (whether by court order, agreement or
+ otherwise) that contradict the conditions of this License, they do not
+ excuse you from the conditions of this License. If you cannot
+ distribute so as to satisfy simultaneously your obligations under this
+ License and any other pertinent obligations, then as a consequence you
+ may not distribute the Program at all. For example, if a patent
+ license would not permit royalty-free redistribution of the Program by
+ all those who receive copies directly or indirectly through you, then
+ the only way you could satisfy both it and this License would be to
+ refrain entirely from distribution of the Program.
+
+ If any portion of this section is held invalid or unenforceable under
+ any particular circumstance, the balance of the section is intended to
+ apply and the section as a whole is intended to apply in other
+ circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of any
+ such claims; this section has the sole purpose of protecting the
+ integrity of the free software distribution system, which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is willing
+ to distribute software through any other system and a licensee cannot
+ impose that choice.
+
+ This section is intended to make thoroughly clear what is believed to
+ be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces, the
+ original copyright holder who places the Program under this License
+ may add an explicit geographical distribution limitation excluding
+ those countries, so that distribution is permitted only in or among
+ countries not thus excluded. In such case, this License incorporates
+ the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+ of the General Public License from time to time. Such new versions will
+ be similar in spirit to the present version, but may differ in detail to
+ address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the Program
+ specifies a version number of this License which applies to it and "any
+ later version", you have the option of following the terms and conditions
+ either of that version or of any later version published by the Free
+ Software Foundation. If the Program does not specify a version number of
+ this License, you may choose any version ever published by the Free Software
+ Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the author
+ to ask for permission. For software which is copyrighted by the Free
+ Software Foundation, write to the Free Software Foundation; we sometimes
+ make exceptions for this. Our decision will be guided by the two goals
+ of preserving the free status of all derivatives of our free software and
+ of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+ REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+ possible use to the public, the best way to achieve this is to make it
+ free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+ to attach them to the start of each source file to most effectively
+ convey the exclusion of warranty; and each file should have at least
+ the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the programs name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ Also add information on how to contact you by electronic and paper mail.
+
+ If the program is interactive, make it output a short notice like this
+ when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c for details.
+
+ The hypothetical commands `show w and `show c should show the appropriate
+ parts of the General Public License. Of course, the commands you use may
+ be called something other than `show w and `show c; they could even be
+ mouse-clicks or menu items--whatever suits your program.
+
+ You should also get your employer (if you work as a programmer) or your
+ school, if any, to sign a "copyright disclaimer" for the program, if
+ necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+ This General Public License does not permit incorporating your program into
+ proprietary programs. If your program is a subroutine library, you may
+ consider it more useful to permit linking proprietary applications with the
+ library. If this is what you want to do, use the GNU Library General
+ Public License instead of this License.
+ \end{verbatim}
+ }
+\onecolumn
+
+\chapter{Regression testing}
+ \begin{wrapfigure}{r}{180pt}
+ \centering{}
+ \includegraphics[width=170pt]{img/030.png}
+ \caption{Assembler regression test run in terminal emulator}
+ \end{wrapfigure}
+
+ \section{Foreword}
+ The IDE is featured with a regression testing environment, the aim of this to make the software as reliable as possible. Currently there is prepared environment for testing the simulator engine and the built-in assembler. This allows to write test cases for specific software features and check whether the results of these tests conform to expected results. Regretfully the test cases are \textbf{NOT PREPARED YET}. Each time when a change is made to the IDE's code, these regression test should be run in order to detect possible bug introductions caused by recent changes. Regression test also serves as a proof of certain software functionality and reliability.
+
+ \section{More about the implementation}
+ Additional details can be found in the MCU~8051~IDE development snapshot downloaded from the project's GIT repository in directory ``regression\_tests'' in various ``README'' files. Here we will mention just general overview.
+
+ Each test have its own directory, like 'test\_something' or 'another\_test', let's call this directory the test directory. Each test consist of a set of test cases. Each test case should test one and only one specific function of the tested software. Test cases are represented by files with extension \fileextension{.in} located in directory named 'testcases' inside the test directory.
+
+ Directory ``results'' inside the test directory should be left empty. It is used by the testing environment for storing temporary files generated during the tests. The ``testcases'' directory also contains files intended for comparison with files generated during the test and stored in the ``results'' directory, these files must have extension ``.<x>.exp''. Where ``<x>'' must be substituted with extension of a file which this file is supposed to be compared to. In another words, if I want to check whether for example ``./results/something.abc'' was generated as it should be, I have to create file ``./testcases/something.abc.exp'' and this file will be automatically compared with ``./results/something.abc''.
+
+ And that's it! This is simple, isn't it? It's just about comparing files. But how are the tests run and how the files in the ``results'' directory gets generated? For that we need some Bash script, which is used to run the test, let's call this script the runtest script. The runtest script must be located in the test directory and must include the ``rte.lib.sh'' file, using the ``source'' command (or '.' command). This script should have set permissions to be executable and this script specifies how exactly should be the test performed and also runs the test itself.
+
+ When the script is about to exit, this condition is trapped and the 'rte.lib.sh' reacts by starting the test. So there is no need to explicitly run the test by invoking some function or something like that. It runs the test automatically when there is nothing else left to do.
+
+\chapter{Project web page and other media}
+ \section{Official project web page}
+ Official web page of the MCU~8051~IDE project provides basic presentation of the project. Contains news about the project development, users comments and forums for users. Also the project's hardware tools are described here and there is some personal information about authors of the project. All components of the IDE can be downloaded from \href{www.sourceforge.net}{sourceforge.net}, which provides hosting for the web pages and entire project. The address is \url{http://mcu8051ide.sf.net}.
+ \begin{figure}[h!]
+ \centering{}
+ \includegraphics[width=\textwidth]{img/026.png}
+ \caption{Official web page of the MCU~8051~IDE project}
+ \end{figure}
+
+ \section{Other media}
+ Project has also its own page on Source Forge, ohloh and Fresh meat. Installation packages are in official Fedora repositories and Ubuntu repositories. There is currently also one Gentoo overlay providing ebuild for the IDE. Project has its own IRC channel, although it is rarely used. And wiki pages. Not yet in a good shape. Project is also mentioned on Wikipedia. Project official web page is written in PHP5, XHTML-1.1, CSS2 and JavaScript and uses MySQL as database. Volunteers who would like to improve the web page are also welcomed as contributors to the project.
+
+ \section{GIT repository}
+ GIT is a distributed revision control system originally developed by Linus Torvalds. MCU~8051~IDE also takes advantage of GIT and uses it as its tool for managing current development version. The project's GIT repository is hosted by Source Forge and is available at address ``{\tiny{}git://mcu8051ide.git.sourceforge.net/gitroot/mcu8051ide/mcu8051ide}''. Access to the repository is for reading only unless you posses the required clearance. In the GIT repository you can always find the newest development version with the newest bug fixes and features. List of latest changes is available on \url{http://mcu8051ide.git.sourceforge.net}. Here is a short description to download and install the latest development version of the IDE:
+ \begin{enumerate}
+ \setlength{\itemsep}{-3pt}
+ \small
+ \item Install GIT
+ \item Run ``{\footnotesize{}\texttt{git clone git://mcu8051ide.git.sourceforge.net/gitroot/mcu8051ide/mcu8051ide}}''.\\
+ It will create your own copy of the Git repository in the current directory.
+ \item Once you have an existing copy of the repository you can just update it each time when you want the fresh version by this command:\\
+ ``\texttt{git fetch origin master}''
+ \item Then you can try the downloaded IDE version without installation using the following sequence of commands (for POSIX only)
+ \begin{enumerate}
+ \setlength{\itemsep}{-3pt}
+ \small
+ \item \texttt{cd mcu8051ide/lib}
+ \item \texttt{./main.tcl}
+ \end{enumerate}
+ \item Or install it and the use it using the following sequence of commands (for POSIX only)
+ \begin{enumerate}
+ \setlength{\itemsep}{-3pt}
+ \small
+ \item \texttt{cd mcu8051ide}
+ \item \texttt{./configure \&\& make}
+ \item \texttt{sudo su \# or just "su"}
+ \item \texttt{make install}
+ \end{enumerate}
+ \end{enumerate}
+
+\chapter{8051 Instructions in numerical Order}
+ {
+ \mysmallfont{}
+ \begin{longtable}{|c|l|lll|c|llll|c|}
+ % Table header:
+ \hline
+ \textbf{Opcode} &
+ \textbf{Mnemonic} &
+ \multicolumn{3}{c|}{\textbf{Operands}} &
+ \textbf{Bytes} &
+ \multicolumn{4}{c|}{\textbf{Flags}} &
+ \textbf{Cycles} \\\hline
+ \endhead
+
+ % Table body:
+ 0x00 & NOP & & & & 1 & & & & & 1 \\\hline
+ 0x01 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0x02 & LJMP & code16& & & 3 & & & & & 2 \\\hline
+ 0x03 & RR & A & & & 1 & & & & & 1 \\\hline
+ 0x04 & INC & A & & & 1 & & & & P & 1 \\\hline
+ 0x05 & INC & data & & & 2 & & & & & 1 \\\hline
+ 0x06 & INC & @R0 & & & 1 & & & & & 1 \\\hline
+ 0x07 & INC & @R1 & & & 1 & & & & & 1 \\\hline
+ 0x08 & INC & R0 & & & 1 & & & & & 1 \\\hline
+ 0x09 & INC & R1 & & & 1 & & & & & 1 \\\hline
+ 0x0A & INC & R2 & & & 1 & & & & & 1 \\\hline
+ 0x0B & INC & R3 & & & 1 & & & & & 1 \\\hline
+ 0x0C & INC & R4 & & & 1 & & & & & 1 \\\hline
+ 0x0D & INC & R5 & & & 1 & & & & & 1 \\\hline
+ 0x0E & INC & R6 & & & 1 & & & & & 1 \\\hline
+ 0x0F & INC & R7 & & & 1 & & & & & 1 \\\hline
+ 0x10 & JBC & bit & code8 & & 3 & & & & & 2 \\\hline
+ 0x11 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0x12 & LCALL & code16& & & 3 & & & & & 2 \\\hline
+ 0x13 & RRC & A & & & 1 & CY & & & P & 1 \\\hline
+ 0x14 & DEC & A & & & 1 & & & & P & 1 \\\hline
+ 0x15 & DEC & data & & & 2 & & & & & 1 \\\hline
+ 0x16 & DEC & @R0 & & & 1 & & & & & 1 \\\hline
+ 0x17 & DEC & @R1 & & & 1 & & & & & 1 \\\hline
+ 0x18 & DEC & R0 & & & 1 & & & & & 1 \\\hline
+ 0x19 & DEC & R1 & & & 1 & & & & & 1 \\\hline
+ 0x1A & DEC & R2 & & & 1 & & & & & 1 \\\hline
+ 0x1B & DEC & R3 & & & 1 & & & & & 1 \\\hline
+ 0x1C & DEC & R4 & & & 1 & & & & & 1 \\\hline
+ 0x1D & DEC & R5 & & & 1 & & & & & 1 \\\hline
+ 0x1E & DEC & R6 & & & 1 & & & & & 1 \\\hline
+ 0x1F & DEC & R7 & & & 1 & & & & & 1 \\\hline
+ 0x20 & JB & bit & code8 & & 3 & & & & & 2 \\\hline
+ 0x21 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0x22 & RET & & & & 1 & & & & & 2 \\\hline
+ 0x23 & RL & A & & & 1 & & & & & 1 \\\hline
+ 0x24 & ADD & A & \#imm8& & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x25 & ADD & A & data & & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x26 & ADD & A & @R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x27 & ADD & A & @R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x28 & ADD & A & R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x29 & ADD & A & R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2A & ADD & A & R2 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2B & ADD & A & R3 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2C & ADD & A & R4 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2D & ADD & A & R5 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2E & ADD & A & R6 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2F & ADD & A & R7 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x30 & JNB & bit & code8 & & 3 & & & & & 2 \\\hline
+ 0x31 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0x32 & RETI & & & & 1 & & & & & 2 \\\hline
+ 0x33 & RLC & A & & & 1 & CY & & & P & 1 \\\hline
+ 0x34 & ADDC & A & \#imm8& & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x35 & ADDC & A & data & & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x36 & ADDC & A & @R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x37 & ADDC & A & @R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x38 & ADDC & A & R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x39 & ADDC & A & R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3A & ADDC & A & R2 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3B & ADDC & A & R3 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3C & ADDC & A & R4 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3D & ADDC & A & R5 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3E & ADDC & A & R6 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3F & ADDC & A & R7 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x40 & JC & code8 & & & 2 & & & & & 2 \\\hline
+ 0x41 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0x42 & ORL & data & A & & 2 & & & & & 1 \\\hline
+ 0x43 & ORL & data & \#imm8& & 3 & & & & & 2 \\\hline
+ 0x44 & ORL & A & \#imm8& & 2 & & & & P & 1 \\\hline
+ 0x45 & ORL & A & data & & 2 & & & & P & 1 \\\hline
+ 0x46 & ORL & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0x47 & ORL & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0x48 & ORL & A & R0 & & 1 & & & & P & 1 \\\hline
+ 0x49 & ORL & A & R1 & & 1 & & & & P & 1 \\\hline
+ 0x4A & ORL & A & R2 & & 1 & & & & P & 1 \\\hline
+ 0x4B & ORL & A & R3 & & 1 & & & & P & 1 \\\hline
+ 0x4C & ORL & A & R4 & & 1 & & & & P & 1 \\\hline
+ 0x4D & ORL & A & R5 & & 1 & & & & P & 1 \\\hline
+ 0x4E & ORL & A & R6 & & 1 & & & & P & 1 \\\hline
+ 0x4F & ORL & A & R7 & & 1 & & & & P & 1 \\\hline
+ 0x50 & JNC & code8 & & & 2 & & & & & 2 \\\hline
+ 0x51 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0x52 & ANL & data & A & & 2 & & & & & 1 \\\hline
+ 0x53 & ANL & data & \#imm8& & 3 & & & & & 2 \\\hline
+ 0x54 & ANL & A & \#imm8& & 2 & & & & P & 1 \\\hline
+ 0x55 & ANL & A & data & & 2 & & & & P & 1 \\\hline
+ 0x56 & ANL & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0x57 & ANL & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0x58 & ANL & A & R0 & & 1 & & & & P & 1 \\\hline
+ 0x59 & ANL & A & R1 & & 1 & & & & P & 1 \\\hline
+ 0x5A & ANL & A & R2 & & 1 & & & & P & 1 \\\hline
+ 0x5B & ANL & A & R3 & & 1 & & & & P & 1 \\\hline
+ 0x5C & ANL & A & R4 & & 1 & & & & P & 1 \\\hline
+ 0x5D & ANL & A & R5 & & 1 & & & & P & 1 \\\hline
+ 0x5E & ANL & A & R6 & & 1 & & & & P & 1 \\\hline
+ 0x5F & ANL & A & R7 & & 1 & & & & P & 1 \\\hline
+ 0x60 & JZ & code8 & & & 2 & & & & & 2 \\\hline
+ 0x61 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0x62 & XRL & data & A & & 2 & & & & & 1 \\\hline
+ 0x63 & XRL & data & \#imm8& & 3 & & & & & 2 \\\hline
+ 0x64 & XRL & A & \#imm8& & 2 & & & & P & 1 \\\hline
+ 0x65 & XRL & A & data & & 2 & & & & P & 1 \\\hline
+ 0x66 & XRL & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0x67 & XRL & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0x68 & XRL & A & R0 & & 1 & & & & P & 1 \\\hline
+ 0x69 & XRL & A & R1 & & 1 & & & & P & 1 \\\hline
+ 0x6A & XRL & A & R2 & & 1 & & & & P & 1 \\\hline
+ 0x6B & XRL & A & R3 & & 1 & & & & P & 1 \\\hline
+ 0x6C & XRL & A & R4 & & 1 & & & & P & 1 \\\hline
+ 0x6D & XRL & A & R5 & & 1 & & & & P & 1 \\\hline
+ 0x6E & XRL & A & R6 & & 1 & & & & P & 1 \\\hline
+ 0x6F & XRL & A & R7 & & 1 & & & & P & 1 \\\hline
+ 0x70 & JNZ & code8 & & & 2 & & & & & 2 \\\hline
+ 0x71 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0x72 & ORL & C & bit & & 2 & CY & & & & 2 \\\hline
+ 0x73 & JMP &@A+DPTR& & & 1 & & & & & 2 \\\hline
+ 0x74 & MOV & A & \#imm8& & 2 & & & & P & 1 \\\hline
+ 0x75 & MOV & data & \#imm8& & 3 & & & & & 2 \\\hline
+ 0x76 & MOV & @R0 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x77 & MOV & @R1 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x78 & MOV & R0 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x79 & MOV & R1 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7A & MOV & R2 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7B & MOV & R3 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7C & MOV & R4 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7D & MOV & R5 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7E & MOV & R6 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7F & MOV & R7 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x80 & SJMP & code8 & & & 2 & & & & & 2 \\\hline
+ 0x81 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0x82 & ANL & C & bit & & 2 & CY & & & & 2 \\\hline
+ 0x83 & MOVC & A & @A+PC & & 1 & & & & P & 2 \\\hline
+ 0x84 & DIV & AB & & & 1 & CY & & OV & P & 4 \\\hline
+ 0x85 & MOV & data & data & & 3 & & & & & 2 \\\hline
+ 0x86 & MOV & data & @R0 & & 2 & & & & & 2 \\\hline
+ 0x87 & MOV & data & @R1 & & 2 & & & & & 2 \\\hline
+ 0x88 & MOV & data & R0 & & 2 & & & & & 2 \\\hline
+ 0x89 & MOV & data & R1 & & 2 & & & & & 2 \\\hline
+ 0x8A & MOV & data & R2 & & 2 & & & & & 2 \\\hline
+ 0x8B & MOV & data & R3 & & 2 & & & & & 2 \\\hline
+ 0x8C & MOV & data & R4 & & 2 & & & & & 2 \\\hline
+ 0x8D & MOV & data & R5 & & 2 & & & & & 2 \\\hline
+ 0x8E & MOV & data & R6 & & 2 & & & & & 2 \\\hline
+ 0x8F & MOV & data & R7 & & 2 & & & & & 2 \\\hline
+ 0x90 & MOV & DPTR &\#imm16& & 3 & & & & & 2 \\\hline
+ 0x91 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0x92 & MOV & bit & C & & 2 & & & & & 2 \\\hline
+ 0x93 & MOVC & A &@A+DPTR& & 1 & & & & P & 2 \\\hline
+ 0x94 & SUBB & A & \#imm8& & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x95 & SUBB & A & data & & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x96 & SUBB & A & @R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x97 & SUBB & A & @R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x98 & SUBB & A & R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x99 & SUBB & A & R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9A & SUBB & A & R2 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9B & SUBB & A & R3 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9C & SUBB & A & R4 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9D & SUBB & A & R5 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9E & SUBB & A & R6 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9F & SUBB & A & R7 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0xA0 & ORL & C & /bit & & 2 & CY & & & & 2 \\\hline
+ 0xA1 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0xA2 & MOV & C & bit & & 2 & CY & & & & 1 \\\hline
+ 0xA3 & INC & DPTR & & & 1 & & & & & 2 \\\hline
+ 0xA4 & MUL & AB & & & 1 & CY & & OV & P & 4 \\\hline
+ 0xA5 & \multicolumn{10}{l|}{Invalid opcode} \\\hline
+ 0xA6 & MOV & @R0 & data & & 2 & & & & & 2 \\\hline
+ 0xA7 & MOV & @R1 & data & & 2 & & & & & 2 \\\hline
+ 0xA8 & MOV & R0 & data & & 2 & & & & & 2 \\\hline
+ 0xA9 & MOV & R1 & data & & 2 & & & & & 2 \\\hline
+ 0xAA & MOV & R2 & data & & 2 & & & & & 2 \\\hline
+ 0xAB & MOV & R3 & data & & 2 & & & & & 2 \\\hline
+ 0xAC & MOV & R4 & data & & 2 & & & & & 2 \\\hline
+ 0xAD & MOV & R5 & data & & 2 & & & & & 2 \\\hline
+ 0xAE & MOV & R6 & data & & 2 & & & & & 2 \\\hline
+ 0xAF & MOV & R7 & data & & 2 & & & & & 2 \\\hline
+ 0xB0 & ANL & C & /bit & & 2 & CY & & & & 2 \\\hline
+ 0xB1 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0xB2 & CPL & bit & & & 2 & & & & & 1 \\\hline
+ 0xB3 & CPL & C & & & 1 & CY & & & & 1 \\\hline
+ 0xB4 & CJNE & A & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xB5 & CJNE & A & data & code8 & 3 & CY & & & & 2 \\\hline
+ 0xB6 & CJNE & @R0 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xB7 & CJNE & @R1 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xB8 & CJNE & R0 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xB9 & CJNE & R1 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBA & CJNE & R2 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBB & CJNE & R3 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBC & CJNE & R4 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBD & CJNE & R5 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBE & CJNE & R6 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBF & CJNE & R7 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xC0 & PUSH & data & & & 2 & & & & & 2 \\\hline
+ 0xC1 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0xC2 & CLR & bit & & & 2 & & & & & 1 \\\hline
+ 0xC3 & CLR & C & & & 1 & CY & & & & 1 \\\hline
+ 0xC4 & SWAP & A & & & 1 & & & & & 1 \\\hline
+ 0xC5 & XCH & A & data & & 2 & & & & P & 1 \\\hline
+ 0xC6 & XCH & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0xC7 & XCH & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0xC8 & XCH & A & R0 & & 1 & & & & P & 1 \\\hline
+ 0xC9 & XCH & A & R1 & & 1 & & & & P & 1 \\\hline
+ 0xCA & XCH & A & R2 & & 1 & & & & P & 1 \\\hline
+ 0xCB & XCH & A & R3 & & 1 & & & & P & 1 \\\hline
+ 0xCC & XCH & A & R4 & & 1 & & & & P & 1 \\\hline
+ 0xCD & XCH & A & R5 & & 1 & & & & P & 1 \\\hline
+ 0xCE & XCH & A & R6 & & 1 & & & & P & 1 \\\hline
+ 0xCF & XCH & A & R7 & & 1 & & & & P & 1 \\\hline
+ 0xD0 & POP & data & & & 2 & & & & & 2 \\\hline
+ 0xD1 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0xD2 & SETB & bit & & & 2 & & & & & 1 \\\hline
+ 0xD3 & SETB & C & & & 1 & CY & & & & 1 \\\hline
+ 0xD4 & DA & A & & & 1 & CY & & & P & 1 \\\hline
+ 0xD5 & DJNZ & data & code8 & & 3 & & & & & 2 \\\hline
+ 0xD6 & XCHD & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0xD7 & XCHD & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0xD8 & DJNZ & R0 & code8 & & 2 & & & & & 2 \\\hline
+ 0xD9 & DJNZ & R1 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDA & DJNZ & R2 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDB & DJNZ & R3 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDC & DJNZ & R4 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDD & DJNZ & R5 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDE & DJNZ & R6 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDF & DJNZ & R7 & code8 & & 2 & & & & & 2 \\\hline
+ 0xE0 & MOVX & A & @DPTR & & 1 & & & & P & 2 \\\hline
+ 0xE1 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0xE2 & MOVX & A & @R0 & & 1 & & & & P & 2 \\\hline
+ 0xE3 & MOVX & A & @R1 & & 1 & & & & P & 2 \\\hline
+ 0xE4 & CLR & A & & & 1 & & & & P & 1 \\\hline
+ 0xE5 & MOV & A & data & & 2 & & & & P & 1 \\\hline
+ 0xE6 & MOV & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0xE7 & MOV & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0xE8 & MOV & A & R0 & & 1 & & & & P & 1 \\\hline
+ 0xE9 & MOV & A & R1 & & 1 & & & & P & 1 \\\hline
+ 0xEA & MOV & A & R2 & & 1 & & & & P & 1 \\\hline
+ 0xEB & MOV & A & R3 & & 1 & & & & P & 1 \\\hline
+ 0xEC & MOV & A & R4 & & 1 & & & & P & 1 \\\hline
+ 0xED & MOV & A & R5 & & 1 & & & & P & 1 \\\hline
+ 0xEE & MOV & A & R6 & & 1 & & & & P & 1 \\\hline
+ 0xEF & MOV & A & R7 & & 1 & & & & P & 1 \\\hline
+ 0xF0 & MOVX & @DPTR & A & & 1 & & & & & 2 \\\hline
+ 0xF1 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0xF2 & MOVX & @R0 & A & & 1 & & & & & 2 \\\hline
+ 0xF3 & MOVX & @R1 & A & & 1 & & & & & 2 \\\hline
+ 0xF4 & CPL & A & & & 1 & & & & P & 1 \\\hline
+ 0xF5 & MOV & data & A & & 2 & & & & & 1 \\\hline
+ 0xF6 & MOV & @R0 & A & & 1 & & & & & 1 \\\hline
+ 0xF7 & MOV & @R1 & A & & 1 & & & & & 1 \\\hline
+ 0xF8 & MOV & R0 & A & & 1 & & & & & 1 \\\hline
+ 0xF9 & MOV & R1 & A & & 1 & & & & & 1 \\\hline
+ 0xFA & MOV & R2 & A & & 1 & & & & & 1 \\\hline
+ 0xFB & MOV & R3 & A & & 1 & & & & & 1 \\\hline
+ 0xFC & MOV & R4 & A & & 1 & & & & & 1 \\\hline
+ 0xFD & MOV & R5 & A & & 1 & & & & & 1 \\\hline
+ 0xFE & MOV & R6 & A & & 1 & & & & & 1 \\\hline
+ 0xFF & MOV & R7 & A & & 1 & & & & & 1 \\\hline
+
+ % Table caption:
+ \caption{8051 Instructions in numerical Order}
+ \end{longtable}
+ }
+
+\chapter{8051 Instructions in alphabetical order}
+ {
+ \mysmallfont{}
+ \begin{longtable}{|c|l|lll|c|llll|c|}
+ % Table header:
+ \hline
+ \textbf{Opcode} &
+ \textbf{Mnemonic} &
+ \multicolumn{3}{c|}{\textbf{Operands}} &
+ \textbf{Bytes} &
+ \multicolumn{4}{c|}{\textbf{Flags}} &
+ \textbf{Cycles} \\\hline
+ \endhead
+
+ % Table body:
+ 0x11 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0x31 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0x51 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0x71 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0x91 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0xB1 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0xD1 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0xF1 & ACALL & code11& & & 2 & & & & & 2 \\\hline
+ 0x24 & ADD & A & \#imm8& & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x25 & ADD & A & data & & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x26 & ADD & A & @R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x27 & ADD & A & @R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x28 & ADD & A & R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x29 & ADD & A & R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2A & ADD & A & R2 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2B & ADD & A & R3 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2C & ADD & A & R4 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2D & ADD & A & R5 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2E & ADD & A & R6 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x2F & ADD & A & R7 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x34 & ADDC & A & \#imm8& & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x35 & ADDC & A & data & & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x36 & ADDC & A & @R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x37 & ADDC & A & @R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x38 & ADDC & A & R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x39 & ADDC & A & R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3A & ADDC & A & R2 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3B & ADDC & A & R3 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3C & ADDC & A & R4 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3D & ADDC & A & R5 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3E & ADDC & A & R6 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x3F & ADDC & A & R7 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x01 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0x21 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0x41 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0x61 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0x81 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0xA1 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0xC1 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0xE1 & AJMP & code11& & & 2 & & & & & 2 \\\hline
+ 0x52 & ANL & data & A & & 2 & & & & & 1 \\\hline
+ 0x53 & ANL & data & \#imm8& & 3 & & & & & 2 \\\hline
+ 0x54 & ANL & A & \#imm8& & 2 & & & & P & 1 \\\hline
+ 0x55 & ANL & A & data & & 2 & & & & P & 1 \\\hline
+ 0x56 & ANL & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0x57 & ANL & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0x58 & ANL & A & R0 & & 1 & & & & P & 1 \\\hline
+ 0x59 & ANL & A & R1 & & 1 & & & & P & 1 \\\hline
+ 0x5A & ANL & A & R2 & & 1 & & & & P & 1 \\\hline
+ 0x5B & ANL & A & R3 & & 1 & & & & P & 1 \\\hline
+ 0x5C & ANL & A & R4 & & 1 & & & & P & 1 \\\hline
+ 0x5D & ANL & A & R5 & & 1 & & & & P & 1 \\\hline
+ 0x5E & ANL & A & R6 & & 1 & & & & P & 1 \\\hline
+ 0x5F & ANL & A & R7 & & 1 & & & & P & 1 \\\hline
+ 0x82 & ANL & C & bit & & 2 & CY & & & & 2 \\\hline
+ 0xB0 & ANL & C & /bit & & 2 & CY & & & & 2 \\\hline
+ 0xB4 & CJNE & A & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xB5 & CJNE & A & data & code8 & 3 & CY & & & & 2 \\\hline
+ 0xB6 & CJNE & @R0 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xB7 & CJNE & @R1 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xB8 & CJNE & R0 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xB9 & CJNE & R1 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBA & CJNE & R2 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBB & CJNE & R3 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBC & CJNE & R4 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBD & CJNE & R5 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBE & CJNE & R6 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xBF & CJNE & R7 & \#imm8& code8 & 3 & CY & & & & 2 \\\hline
+ 0xC2 & CLR & bit & & & 2 & & & & & 1 \\\hline
+ 0xC3 & CLR & C & & & 1 & CY & & & & 1 \\\hline
+ 0xE4 & CLR & A & & & 1 & & & & P & 1 \\\hline
+ 0xB2 & CPL & bit & & & 2 & & & & & 1 \\\hline
+ 0xB3 & CPL & C & & & 1 & CY & & & & 1 \\\hline
+ 0xF4 & CPL & A & & & 1 & & & & P & 1 \\\hline
+ 0xD4 & DA & A & & & 1 & CY & & & P & 1 \\\hline
+ 0x14 & DEC & A & & & 1 & & & & P & 1 \\\hline
+ 0x15 & DEC & data & & & 2 & & & & & 1 \\\hline
+ 0x16 & DEC & @R0 & & & 1 & & & & & 1 \\\hline
+ 0x17 & DEC & @R1 & & & 1 & & & & & 1 \\\hline
+ 0x18 & DEC & R0 & & & 1 & & & & & 1 \\\hline
+ 0x19 & DEC & R1 & & & 1 & & & & & 1 \\\hline
+ 0x1A & DEC & R2 & & & 1 & & & & & 1 \\\hline
+ 0x1B & DEC & R3 & & & 1 & & & & & 1 \\\hline
+ 0x1C & DEC & R4 & & & 1 & & & & & 1 \\\hline
+ 0x1D & DEC & R5 & & & 1 & & & & & 1 \\\hline
+ 0x1E & DEC & R6 & & & 1 & & & & & 1 \\\hline
+ 0x1F & DEC & R7 & & & 1 & & & & & 1 \\\hline
+ 0x84 & DIV & AB & & & 1 & CY & & OV & P & 4 \\\hline
+ 0xD5 & DJNZ & data & code8 & & 3 & & & & & 2 \\\hline
+ 0xD8 & DJNZ & R0 & code8 & & 2 & & & & & 2 \\\hline
+ 0xD9 & DJNZ & R1 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDA & DJNZ & R2 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDB & DJNZ & R3 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDC & DJNZ & R4 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDD & DJNZ & R5 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDE & DJNZ & R6 & code8 & & 2 & & & & & 2 \\\hline
+ 0xDF & DJNZ & R7 & code8 & & 2 & & & & & 2 \\\hline
+ 0x04 & INC & A & & & 1 & & & & P & 1 \\\hline
+ 0x05 & INC & data & & & 2 & & & & & 1 \\\hline
+ 0x06 & INC & @R0 & & & 1 & & & & & 1 \\\hline
+ 0x07 & INC & @R1 & & & 1 & & & & & 1 \\\hline
+ 0x08 & INC & R0 & & & 1 & & & & & 1 \\\hline
+ 0x09 & INC & R1 & & & 1 & & & & & 1 \\\hline
+ 0x0A & INC & R2 & & & 1 & & & & & 1 \\\hline
+ 0x0B & INC & R3 & & & 1 & & & & & 1 \\\hline
+ 0x0C & INC & R4 & & & 1 & & & & & 1 \\\hline
+ 0x0D & INC & R5 & & & 1 & & & & & 1 \\\hline
+ 0x0E & INC & R6 & & & 1 & & & & & 1 \\\hline
+ 0x0F & INC & R7 & & & 1 & & & & & 1 \\\hline
+ 0xA3 & INC & DPTR & & & 1 & & & & & 2 \\\hline
+ 0x20 & JB & bit & code8 & & 3 & & & & & 2 \\\hline
+ 0x10 & JBC & bit & code8 & & 3 & & & & & 2 \\\hline
+ 0x40 & JC & code8 & & & 2 & & & & & 2 \\\hline
+ 0x73 & JMP &@A+DPTR& & & 1 & & & & & 2 \\\hline
+ 0x30 & JNB & bit & code8 & & 3 & & & & & 2 \\\hline
+ 0x50 & JNC & code8 & & & 2 & & & & & 2 \\\hline
+ 0x70 & JNZ & code8 & & & 2 & & & & & 2 \\\hline
+ 0x60 & JZ & code8 & & & 2 & & & & & 2 \\\hline
+ 0x12 & LCALL & code16& & & 3 & & & & & 2 \\\hline
+ 0x02 & LJMP & code16& & & 3 & & & & & 2 \\\hline
+ 0x74 & MOV & A & \#imm8& & 2 & & & & P & 1 \\\hline
+ 0x75 & MOV & data & \#imm8& & 3 & & & & & 2 \\\hline
+ 0x76 & MOV & @R0 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x77 & MOV & @R1 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x78 & MOV & R0 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x79 & MOV & R1 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7A & MOV & R2 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7B & MOV & R3 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7C & MOV & R4 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7D & MOV & R5 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7E & MOV & R6 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x7F & MOV & R7 & \#imm8& & 2 & & & & & 1 \\\hline
+ 0x85 & MOV & data & data & & 3 & & & & & 2 \\\hline
+ 0x86 & MOV & data & @R0 & & 2 & & & & & 2 \\\hline
+ 0x87 & MOV & data & @R1 & & 2 & & & & & 2 \\\hline
+ 0x88 & MOV & data & R0 & & 2 & & & & & 2 \\\hline
+ 0x89 & MOV & data & R1 & & 2 & & & & & 2 \\\hline
+ 0x8A & MOV & data & R2 & & 2 & & & & & 2 \\\hline
+ 0x8B & MOV & data & R3 & & 2 & & & & & 2 \\\hline
+ 0x8C & MOV & data & R4 & & 2 & & & & & 2 \\\hline
+ 0x8D & MOV & data & R5 & & 2 & & & & & 2 \\\hline
+ 0x8E & MOV & data & R6 & & 2 & & & & & 2 \\\hline
+ 0x8F & MOV & data & R7 & & 2 & & & & & 2 \\\hline
+ 0x90 & MOV & DPTR &\#imm16& & 3 & & & & & 2 \\\hline
+ 0x92 & MOV & bit & C & & 2 & & & & & 2 \\\hline
+ 0xA2 & MOV & C & bit & & 2 & CY & & & & 1 \\\hline
+ 0xA6 & MOV & @R0 & data & & 2 & & & & & 2 \\\hline
+ 0xA7 & MOV & @R1 & data & & 2 & & & & & 2 \\\hline
+ 0xA8 & MOV & R0 & data & & 2 & & & & & 2 \\\hline
+ 0xA9 & MOV & R1 & data & & 2 & & & & & 2 \\\hline
+ 0xAA & MOV & R2 & data & & 2 & & & & & 2 \\\hline
+ 0xAB & MOV & R3 & data & & 2 & & & & & 2 \\\hline
+ 0xAC & MOV & R4 & data & & 2 & & & & & 2 \\\hline
+ 0xAD & MOV & R5 & data & & 2 & & & & & 2 \\\hline
+ 0xAE & MOV & R6 & data & & 2 & & & & & 2 \\\hline
+ 0xAF & MOV & R7 & data & & 2 & & & & & 2 \\\hline
+ 0xE5 & MOV & A & data & & 2 & & & & P & 1 \\\hline
+ 0xE6 & MOV & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0xE7 & MOV & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0xE8 & MOV & A & R0 & & 1 & & & & P & 1 \\\hline
+ 0xE9 & MOV & A & R1 & & 1 & & & & P & 1 \\\hline
+ 0xEA & MOV & A & R2 & & 1 & & & & P & 1 \\\hline
+ 0xEB & MOV & A & R3 & & 1 & & & & P & 1 \\\hline
+ 0xEC & MOV & A & R4 & & 1 & & & & P & 1 \\\hline
+ 0xED & MOV & A & R5 & & 1 & & & & P & 1 \\\hline
+ 0xEE & MOV & A & R6 & & 1 & & & & P & 1 \\\hline
+ 0xEF & MOV & A & R7 & & 1 & & & & P & 1 \\\hline
+ 0xF5 & MOV & data & A & & 2 & & & & & 1 \\\hline
+ 0xF6 & MOV & @R0 & A & & 1 & & & & & 1 \\\hline
+ 0xF7 & MOV & @R1 & A & & 1 & & & & & 1 \\\hline
+ 0xF8 & MOV & R0 & A & & 1 & & & & & 1 \\\hline
+ 0xF9 & MOV & R1 & A & & 1 & & & & & 1 \\\hline
+ 0xFA & MOV & R2 & A & & 1 & & & & & 1 \\\hline
+ 0xFB & MOV & R3 & A & & 1 & & & & & 1 \\\hline
+ 0xFC & MOV & R4 & A & & 1 & & & & & 1 \\\hline
+ 0xFD & MOV & R5 & A & & 1 & & & & & 1 \\\hline
+ 0xFE & MOV & R6 & A & & 1 & & & & & 1 \\\hline
+ 0xFF & MOV & R7 & A & & 1 & & & & & 1 \\\hline
+ 0x83 & MOVC & A & @A+PC & & 1 & & & & P & 2 \\\hline
+ 0x93 & MOVC & A &@A+DPTR& & 1 & & & & P & 2 \\\hline
+ 0xE0 & MOVX & A & @DPTR & & 1 & & & & P & 2 \\\hline
+ 0xE2 & MOVX & A & @R0 & & 1 & & & & P & 2 \\\hline
+ 0xE3 & MOVX & A & @R1 & & 1 & & & & P & 2 \\\hline
+ 0xF0 & MOVX & @DPTR & A & & 1 & & & & & 2 \\\hline
+ 0xF2 & MOVX & @R0 & A & & 1 & & & & & 2 \\\hline
+ 0xF3 & MOVX & @R1 & A & & 1 & & & & & 2 \\\hline
+ 0xA4 & MUL & AB & & & 1 & CY & & OV & P & 4 \\\hline
+ 0x00 & NOP & & & & 1 & & & & & 1 \\\hline
+ 0x42 & ORL & data & A & & 2 & & & & & 1 \\\hline
+ 0x43 & ORL & data & \#imm8& & 3 & & & & & 2 \\\hline
+ 0x44 & ORL & A & \#imm8& & 2 & & & & P & 1 \\\hline
+ 0x45 & ORL & A & data & & 2 & & & & P & 1 \\\hline
+ 0x46 & ORL & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0x47 & ORL & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0x48 & ORL & A & R0 & & 1 & & & & P & 1 \\\hline
+ 0x49 & ORL & A & R1 & & 1 & & & & P & 1 \\\hline
+ 0x4A & ORL & A & R2 & & 1 & & & & P & 1 \\\hline
+ 0x4B & ORL & A & R3 & & 1 & & & & P & 1 \\\hline
+ 0x4C & ORL & A & R4 & & 1 & & & & P & 1 \\\hline
+ 0x4D & ORL & A & R5 & & 1 & & & & P & 1 \\\hline
+ 0x4E & ORL & A & R6 & & 1 & & & & P & 1 \\\hline
+ 0x4F & ORL & A & R7 & & 1 & & & & P & 1 \\\hline
+ 0x72 & ORL & C & bit & & 2 & CY & & & & 2 \\\hline
+ 0xA0 & ORL & C & /bit & & 2 & CY & & & & 2 \\\hline
+ 0xD0 & POP & data & & & 2 & & & & & 2 \\\hline
+ 0xC0 & PUSH & data & & & 2 & & & & & 2 \\\hline
+ 0x22 & RET & & & & 1 & & & & & 2 \\\hline
+ 0x32 & RETI & & & & 1 & & & & & 2 \\\hline
+ 0x23 & RL & A & & & 1 & & & & & 1 \\\hline
+ 0x33 & RLC & A & & & 1 & CY & & & P & 1 \\\hline
+ 0x03 & RR & A & & & 1 & & & & & 1 \\\hline
+ 0x13 & RRC & A & & & 1 & CY & & & P & 1 \\\hline
+ 0xD2 & SETB & bit & & & 2 & & & & & 1 \\\hline
+ 0xD3 & SETB & C & & & 1 & CY & & & & 1 \\\hline
+ 0x80 & SJMP & code8 & & & 2 & & & & & 2 \\\hline
+ 0x94 & SUBB & A & \#imm8& & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x95 & SUBB & A & data & & 2 & CY & AC & OV & P & 1 \\\hline
+ 0x96 & SUBB & A & @R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x97 & SUBB & A & @R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x98 & SUBB & A & R0 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x99 & SUBB & A & R1 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9A & SUBB & A & R2 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9B & SUBB & A & R3 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9C & SUBB & A & R4 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9D & SUBB & A & R5 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9E & SUBB & A & R6 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0x9F & SUBB & A & R7 & & 1 & CY & AC & OV & P & 1 \\\hline
+ 0xC4 & SWAP & A & & & 1 & & & & & 1 \\\hline
+ 0xC5 & XCH & A & data & & 2 & & & & P & 1 \\\hline
+ 0xC6 & XCH & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0xC7 & XCH & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0xC8 & XCH & A & R0 & & 1 & & & & P & 1 \\\hline
+ 0xC9 & XCH & A & R1 & & 1 & & & & P & 1 \\\hline
+ 0xCA & XCH & A & R2 & & 1 & & & & P & 1 \\\hline
+ 0xCB & XCH & A & R3 & & 1 & & & & P & 1 \\\hline
+ 0xCC & XCH & A & R4 & & 1 & & & & P & 1 \\\hline
+ 0xCD & XCH & A & R5 & & 1 & & & & P & 1 \\\hline
+ 0xCE & XCH & A & R6 & & 1 & & & & P & 1 \\\hline
+ 0xCF & XCH & A & R7 & & 1 & & & & P & 1 \\\hline
+ 0xD6 & XCHD & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0xD7 & XCHD & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0x62 & XRL & data & A & & 2 & & & & & 1 \\\hline
+ 0x63 & XRL & data & \#imm8& & 3 & & & & & 2 \\\hline
+ 0x64 & XRL & A & \#imm8& & 2 & & & & P & 1 \\\hline
+ 0x65 & XRL & A & data & & 2 & & & & P & 1 \\\hline
+ 0x66 & XRL & A & @R0 & & 1 & & & & P & 1 \\\hline
+ 0x67 & XRL & A & @R1 & & 1 & & & & P & 1 \\\hline
+ 0x68 & XRL & A & R0 & & 1 & & & & P & 1 \\\hline
+ 0x69 & XRL & A & R1 & & 1 & & & & P & 1 \\\hline
+ 0x6A & XRL & A & R2 & & 1 & & & & P & 1 \\\hline
+ 0x6B & XRL & A & R3 & & 1 & & & & P & 1 \\\hline
+ 0x6C & XRL & A & R4 & & 1 & & & & P & 1 \\\hline
+ 0x6D & XRL & A & R5 & & 1 & & & & P & 1 \\\hline
+ 0x6E & XRL & A & R6 & & 1 & & & & P & 1 \\\hline
+ 0x6F & XRL & A & R7 & & 1 & & & & P & 1 \\\hline
+ 0xA5 & \multicolumn{10}{l|}{Invalid opcode} \\\hline
+
+ % Table caption:
+ \caption{8051 Instructions in lexical Order}
+ \end{longtable}
+ }
+
+\chapter{List of supported micro-controllers}
+ \subsection{Intel\textregistered}
+ {
+ \mysmallfont{}
+ \begin{longtable}{ll}
+ 8051 & \url{http://download.intel.com/design/MCS51/MANUALS/27238302.pdf} \\
+ 80C51 & \url{http://download.intel.com/design/MCS51/MANUALS/27238302.pdf} \\
+ 8052 & \url{http://download.intel.com/design/MCS51/MANUALS/27238302.pdf} \\
+ \end{longtable}
+ }
+ \subsection{Atmel\textregistered}
+ {
+ \mysmallfont{}
+ \begin{longtable}{ll}
+ \multicolumn{2}{l}{\textbf{\small{}Flash (Reprogramable)}} \\
+ AT89C2051 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc0368.pdf} \\
+ AT89C4051 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc1001.pdf} \\
+ AT89C51 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc0265.pdf} \\
+ AT89C51RC & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc1920.pdf} \\
+ AT89C52 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc0313.pdf} \\
+ AT89C55WD & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc1921.pdf} \\
+ AT89LV51 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc0303.pdf} \\
+ AT89LV52 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc0375.pdf} \\
+ AT89LV55 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc0811.pdf} \\\\
+
+ \multicolumn{2}{l}{\textbf{\small{}Flash ISP (Programable via ISP)}} \\
+ AT89S52 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc1919.pdf} \\
+ AT89LS51 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc3053.pdf} \\
+ AT89LS52 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc2601.pdf} \\
+ AT89S8253 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc3286.pdf} \\
+ AT89S2051 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc3390.pdf} \\
+ AT89S4051 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc3390.pdf} \\\\
+
+ \multicolumn{2}{l}{\textbf{\small{}OTP (One-Time Programmable)}} \\
+ T87C5101 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc3c0c80904bc57.pdf} \\
+ T83C5101 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc3c0c80904bc57.pdf} \\
+ AT80C32X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4184.pdf} \\
+ TS87C52X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4184.pdf} \\
+ AT87C52X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4184.pdf} \\
+ AT80C54X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4431.pdf} \\\\
+
+ \multicolumn{2}{l}{\textbf{\small{}ROM}} \\
+ T83C5102 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc3c0c80904bc57.pdf} \\
+ TS80C32X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4184.pdf} \\
+ TS80C52X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4184.pdf} \\
+ AT80C58X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4431.pdf} \\
+ AT87C54X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4431.pdf} \\
+ AT87C58X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4431.pdf} \\
+ TS80C54X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4431.pdf} \\
+ TS80C58X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4431.pdf} \\
+ TS87C54X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4431.pdf} \\
+ AT80C52X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4184.pdf} \\
+ TS87C58X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4431.pdf} \\\\
+
+ \multicolumn{2}{l}{\textbf{\small{}ROMless}} \\
+ TS80C31X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4428.pdf} \\
+ AT80C31X2 & \url{http://www.atmel.com/dyn/resources/prod\_documents/doc4428.pdf} \\
+ \end{longtable}
+ }
+
+\chapter{Change log}
+ {
+ \mysmallfont{}
+ \begin{verbatim}
+ 1.3.11 -> 1.4
+ * Bug fixes
+ * Added new Virtual HW component: LCD display controlled by HD44780
+ * Added new Virtual HW component: simulated DS1620 temperature sensor
+ * Added new Virtual HW component: File interface
+ * Added AT89S51
+ * Improved performance of Virtual HW
+ * Added support for spelling checker (Hunspell)
+ * Added 8051 Instruction table
+ * Improved table of symbols on the right panel
+ * Final draft of the handbook
+
+ 1.3.10 -> 1.3.11
+ * Bug fixes
+ * New interface for hardware control plug-ins
+ * Added new assembler directives: ELSEIF ELSEIFN ELSEIFDEF ELSEIFNDEF
+ * Removed assembler directive: EXITM
+
+ 1.3.9 -> 1.3.10
+ * Bug fixes
+ * Extended help menu
+ * Extended global configuration dialog
+ * Added support for multiple widget styles and GUI background colors
+ * Added draft of handbook
+ * Added basic support for assembler and simulator regression testing
+ * Added regular support for i18n (internationalization)
+ * Modified welcome dialog
+ * Added support for external links in the GUI
+
+ 1.3.8 -> 1.3.9
+ * Bug fixes
+
+ 1.3.7 -> 1.3.8
+ * Bug fixes
+ * Added feature "Global Font Size Factor" (see MCU 8051 IDE configuration dialog)
+ * Added breakpoint validation
+
+ 1.3.6 -> 1.3.7
+ * Bug fixes
+
+ 1.3.5 -> 1.3.6
+ * Bug fixes
+
+ 1.3.4 -> 1.3.5
+ * Bug fixes
+
+ 1.3.3 -> 1.3.4
+ * "Modernized" GUI
+ * Bug fixes
+
+ 1.3.1 -> 1.3.3
+ * Bug fixes
+
+ 1.3.1 -> 1.3.2
+ * Bug fixes
+
+ 1.3 -> 1.3.1
+ * Dependency on TclX is now only optional
+ * Important chage !: Native assembler now expands macro instructions before doing conditional
+ assembly and before defining constants and variables ! Control sequence $NOMACROSFIRST can
+ be used to change this behavior to the state of previous versions.
+ * Added support for AS31 assembler
+ * Added files notepad
+ * Improved instruction help panel
+ * Native assembler was extended to support these directives: "IFN IFDEF IFNDEF BYTE FLAG REPT
+ TIMES" and these constrol sequences: "$NOXR $NOXREF $XR $XREF $NOSB $SB $RESTORE $RS $SA
+ $SAVE $PHILIPS $NOPI $PI $NOTABS $NOMOD51 $NOBUILTIN $NOMO $MO $MOD51 $NOMACRO $NOMR $LI
+ $NOLI $GENONLY $GO $NOGEN $NOGE $GEN $GE $ $EJ $NODB $NODEBUG $DB $DEBUG $CONDONLY $NOCOND
+ $COND $TT $PW $PL $MR $MACRO $INC $WARNING $ERROR $DA $NOMACROSFIRST"
+ * Added stack monitor
+ * Various bug fixes
+
+ 1.2 -> 1.3
+ * New dependency: TclX (tested with v8.4)
+ * Added RS232/UART debugger
+ * A few changes in assembler
+ * Bug fixes (Thanks to Miroslav Hradílek for many useful bug reports)
+
+ 1.1.1 -> 1.2
+ * Bug fixes
+ * Added tab bar
+
+ 1.1 -> 1.1.1
+ * Added "Special calculator"
+ * Added "Base converter"
+ * Many tiny improvements
+
+ 1.0.9 -> 1.1
+ * Added support for new MCUs from Intel®: 8031, 8751, 8032, 8752, 80C31, 87C51, 80C52,
+ 87C52, 80C32, 80C54, 87C54, 80C58, 87C58
+ * Added support for simulating virtual hardware
+ * Improved simulator (Implemented UART (experimental support), improved support for timers, etc.)
+ * Improved register watches
+ * Improved editor (improved autocompletion and many other things)
+ * Improved panel "Instruction details"
+ * Improved 8-segment editor
+ * Bug fixes in assembler, disassembler and simulator engine
+ * Some other bug fixes
+ * Added utility "Scribble notepad"
+ * Improved graph panel
+
+ 1.0.7 -> 1.0.9
+ * Added support for C language
+ * Added map of bit addressable area
+
+ 1.0.6 -> 1.0.7
+ * Added Stopwatch
+ * Improved code editor
+ * Some bug fixes
+
+ 1.0.5 -> 1.0.6
+ * Fixed critical bug in Assembler v1.0.5 (related to peephole code optimization)
+ * Added 8 segment LED display editor
+ * Added ASCII chart
+ * Added Assembly symbol table viewer
+
+ 1.0 -> 1.0.5
+ * Added support for external assemblers ("ASEM-51" and "ASL")
+ * Added support for external editors ("emacs", "gvim", "kwrite" and "gedit")
+ * Added support for embedded editors ("emacs", "vim", "nano", "dav" and "le")
+ * Added embedded terminal emulator (rxvt-unicode)
+ * Added function "File statistics"
+ * Improved assembler
+ * Added syntax highlight for code listing (*.lst)
+ * Added search bars for "Messages" and "Todo"
+ * Removed dependency on "tcl-thread" and "tclxml"
+ * Added dependency on "TkImg" and "tdom"
+ * Improved hex editor
+ * Improved simulator (especially simulation across multiple files)
+ * Added panel "Find in files"
+ * Modified GUI
+ * New error handling dialog
+ * Some bug fixes (especially critical bug in disassembler and a few bugs in assembler)
+ * All images are now in PNG (Portable Network Graphics) (Requires TkImg)
+ * Some more improvements
+
+ 0.9.5 -> 1.0
+ * MANY BUG FIXES ! (including critical)
+ * Added support for some new MCUs (
+ AT89S52, AT89LS51, AT89LS52, AT89S8253, AT89S2051, AT89S4051,
+ T87C5101, T83C5101, T83C5102, TS80C32X2, TS80C52X2, TS87C52X2,
+ AT80C32X2, AT80C52X2, AT87C52X2, AT80C54X2, AT80C58X2, AT87C54X2,
+ AT87C58X2, TS80C54X2, TS80C58X2, TS87C54X2, TS87C58X2, TS80C31X2,
+ AT80C31X2
+ )
+ * Added support for peephole optimization
+ * Faster project opening
+ * Added interrupt monitor
+ * Added subprograms monitor
+ * Added SFR map
+ * Added SFR watches
+ * Extended command line interface
+ * Compiler now checks for valid memory addressing (new CLI options --iram-size, --eram-size,
+ --xram-size, --code-size)
+ * Added program hibernation capability
+ * Added editor commands hibernate, resume, switch-mcu, set-xcode and set-xdata
+ * Added desktop file and application icon
+ * Some more improvements
+
+ 0.9.1 -> 0.9.5
+ * Implemented support for 80C51, 8052, AT89C2051, AT89C4051, AT89C51, AT89C51RC, AT89C52,
+ AT89C55WD, AT89LV51, AT89LV52 and AT89LV55
+ * Simulator can now step back
+ * Added popup-based completion for editor
+ * Added tool tips for bits in simulator control panel
+ * Added simulator configuration dialog
+ * Added auto save function
+ * Manual page
+ * Added support for multi-view (editor can be now splitted vertically or horizontally)
+ * Many bug fixes (in compiler, editor, file selection dialog, syntax highlight, simulator, etc.)
+ * Some minor improvements (graph, disassembler, etc.)
+ * Thread extension is no longer required to run this program (but custom commands will won't
+ work without it)
+
+ 0.9.0 -> 0.9.1
+ * New hexadecimal editor
+ * New file selection dialog
+ * Added file system browser tab on left panel
+ * Added tips on start-up
+ * Added editor command line
+ * Improved editor configuration dialog
+ * A few bug fixes
+ * Removed dependency on IWidgets and Tix
+ * Some minor improvements
+
+ 0.8.7 -> 0.9.0
+ * Implemented graph
+ * Many bug fixes (GUI, compiler, memory leaks)
+ * Editable shortcuts
+ * Bookmarks for opened and project files
+ * Search panels in left and right panel
+ * Modified GUI (checkboxes, radio buttons ...)
+ * Support for various encodings and EOLs
+ * Added "Tools" -> "Change letter case", "Normalize HEX" and "SIM -> BIN"
+ * Added editor functions "Lowercase", "Uppercase" and "Capitalize"
+ * Added help windows for opened and project files and opened projects
+ * Added pop-up menus for entry and text widgets (globally)
+ * Fixed problem with fonts (bad sizes)
+ * Implemented support for line wrapping (experimental)
+ * Added new command line options (see `mcu8051ide --help')
+ * More status tips and tool tips
+ * Added welcome dialog
+ * Added demonstration project
+ * Cleaner, faster and safer compiler
+ * Some more minor improvements
+
+ 0.8.5 -> 0.8.7
+ * Implemented code validation
+ * Added tab "Instruction details" (on the right panel)
+ * Added Clean Up dialog
+ * Added Right Panel configuration dialog
+ * Added Toolbar configuration dialog
+ * Added support for custom commands
+ * Fixed some bugs (in GUI)
+ * Fixed many memory leaks
+ * Cleaner code
+
+ 0.8.4 -> 0.8.5
+ * Fixed many bugs in GUI
+ * Improved editor
+ * Extended calculator
+ * Redesigned editor configuration dialog
+ * Added functions "Tools -> Reformat code" and "Tools -> Sim2Hex"
+ * Extended CLI (--reset-user-settings, --config-file, --compile, --hex2bin ...)
+
+ 0.8.1 -> 0.8.4
+ * Fixed many bugs ... (including critical)
+ * Added compiler configuration dialog
+ * Added calculator timers preset
+ * Added dialog about
+ * Added support for exporting highlighted source code to LaTeX source
+ * Added many ToolTips
+ * Added StatusBar tips
+ * Added splash screen
+ * Added support for command line options
+ * All images are now *.XPM (X PixMap) (require Tix package)
+ * Changed installation procedure
+
+ 0.8.0 -> 0.8.1
+ * Fixed some bugs in compiler (not critical)
+ * Fixed bug in to do list (saving text as SGML)
+ * Fixed bug in project management
+ * Added pop-up menu to to do list
+ \end{verbatim}
+ }
+
+\listoftables
+\listoffigures
+\end{document}
diff --git a/doc/man/mcu8051ide.1.gz b/doc/man/mcu8051ide.1.gz
index 0e507fc..c5c1cef 100644
--- a/doc/man/mcu8051ide.1.gz
+++ b/doc/man/mcu8051ide.1.gz
Binary files differ
diff --git a/hwplugins/README b/hwplugins/README
new file mode 100644
index 0000000..a25f20a
--- /dev/null
+++ b/hwplugins/README
@@ -0,0 +1,3 @@
+This directory contains HW control plug-ins for this IDE. Please refer to the
+official project documentation available in "../doc/handbook/mcu8051ide.en.pdf"
+for details.
diff --git a/hwplugins/plug-in_template.txt b/hwplugins/plug-in_template.txt
new file mode 100644
index 0000000..151c768
--- /dev/null
+++ b/hwplugins/plug-in_template.txt
@@ -0,0 +1,47 @@
+#!/usr/bin/tclsh
+
+############################################################################
+# Copyright (C) <Year> by <Your Name> #
+# <your_email@example.com> #
+############################################################################
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+#
+# --------------------------------------------------------------------------
+
+set AUTHOR "<Your Name>"
+set EMAIL "<your_email@example.com>"
+set P_VERSION "0.1"
+set MIN_IDE_VER "1.3"
+
+## Free resources occupied by this plug-in
+ # @return void
+proc dispose {} {
+}
+
+## Initialize the plug-in
+ # @parm Widget main_frame - Frame for this plugin assigned by MCU 8051 IDE HW plugin manager
+ # @parm Object project_object - Reference to MCU 8051 IDE project object
+ # @parm String current_namespace - Namespace for this plugin assigned by MCU 8051 IDE HW plugin manager
+ # @parm String directory - Directory location of this file (not all plugin files)
+ # @return void
+proc init {main_frame project_object current_namespace directory} {
+}
+
+## Restore previous session
+ # @parm String session_data - Data returned by function save_session
+ # @return void
+proc restore_session {session_data} {
+}
+
+## Save plug-in session
+ # @return String - Session data for function restore_session
+proc save_session {} {
+}
+
+## Is plugin busy ?
+ # @return Bool - 1 == Yes; 0 == No
+proc is_busy {} {
+ return 0
+}
diff --git a/icons/16x16/_1leftarrow.png b/icons/16x16/_1leftarrow.png
new file mode 100644
index 0000000..2ce7d30
--- /dev/null
+++ b/icons/16x16/_1leftarrow.png
Binary files differ
diff --git a/icons/16x16/_1rightarrow.png b/icons/16x16/_1rightarrow.png
new file mode 100644
index 0000000..64f8104
--- /dev/null
+++ b/icons/16x16/_1rightarrow.png
Binary files differ
diff --git a/icons/16x16/__blockdevice.png b/icons/16x16/__blockdevice.png
new file mode 100644
index 0000000..ed70e9e
--- /dev/null
+++ b/icons/16x16/__blockdevice.png
Binary files differ
diff --git a/icons/16x16/_chardevice.png b/icons/16x16/_chardevice.png
new file mode 100644
index 0000000..ba4d7ea
--- /dev/null
+++ b/icons/16x16/_chardevice.png
Binary files differ
diff --git a/icons/16x16/_player_pause.png b/icons/16x16/_player_pause.png
new file mode 100644
index 0000000..b61fb87
--- /dev/null
+++ b/icons/16x16/_player_pause.png
Binary files differ
diff --git a/icons/16x16/asem51.png b/icons/16x16/asem51.png
new file mode 100644
index 0000000..fe660ee
--- /dev/null
+++ b/icons/16x16/asem51.png
Binary files differ
diff --git a/icons/16x16/compfile1.png b/icons/16x16/compfile1.png
new file mode 100644
index 0000000..dfb9a09
--- /dev/null
+++ b/icons/16x16/compfile1.png
Binary files differ
diff --git a/icons/16x16/d52.png b/icons/16x16/d52.png
new file mode 100644
index 0000000..70c02a2
--- /dev/null
+++ b/icons/16x16/d52.png
Binary files differ
diff --git a/icons/16x16/dot_gray.png b/icons/16x16/dot_gray.png
new file mode 100644
index 0000000..ad597bb
--- /dev/null
+++ b/icons/16x16/dot_gray.png
Binary files differ
diff --git a/icons/16x16/ds1620.png b/icons/16x16/ds1620.png
new file mode 100644
index 0000000..7a6a127
--- /dev/null
+++ b/icons/16x16/ds1620.png
Binary files differ
diff --git a/icons/16x16/hd44780.png b/icons/16x16/hd44780.png
new file mode 100644
index 0000000..c824070
--- /dev/null
+++ b/icons/16x16/hd44780.png
Binary files differ
diff --git a/icons/16x16/idea.png b/icons/16x16/idea.png
new file mode 100644
index 0000000..2b206f2
--- /dev/null
+++ b/icons/16x16/idea.png
Binary files differ
diff --git a/icons/16x16/player_play.png b/icons/16x16/player_play.png
new file mode 100644
index 0000000..a3ef5ef
--- /dev/null
+++ b/icons/16x16/player_play.png
Binary files differ
diff --git a/icons/16x16/sdcc.png b/icons/16x16/sdcc.png
new file mode 100644
index 0000000..b872e53
--- /dev/null
+++ b/icons/16x16/sdcc.png
Binary files differ
diff --git a/icons/16x16/set_lcd_size.png b/icons/16x16/set_lcd_size.png
new file mode 100644
index 0000000..be938b7
--- /dev/null
+++ b/icons/16x16/set_lcd_size.png
Binary files differ
diff --git a/icons/16x16/sort_incr.png b/icons/16x16/sort_incr.png
new file mode 100644
index 0000000..1fbf09d
--- /dev/null
+++ b/icons/16x16/sort_incr.png
Binary files differ
diff --git a/icons/16x16/symbol0.png b/icons/16x16/symbol0.png
new file mode 100644
index 0000000..c085511
--- /dev/null
+++ b/icons/16x16/symbol0.png
Binary files differ
diff --git a/icons/16x16/symbol1.png b/icons/16x16/symbol1.png
new file mode 100644
index 0000000..d208023
--- /dev/null
+++ b/icons/16x16/symbol1.png
Binary files differ
diff --git a/icons/16x16/symbol2.png b/icons/16x16/symbol2.png
new file mode 100644
index 0000000..24daa0c
--- /dev/null
+++ b/icons/16x16/symbol2.png
Binary files differ
diff --git a/icons/16x16/symbol3.png b/icons/16x16/symbol3.png
new file mode 100644
index 0000000..7adeb2c
--- /dev/null
+++ b/icons/16x16/symbol3.png
Binary files differ
diff --git a/icons/16x16/symbol4.png b/icons/16x16/symbol4.png
new file mode 100644
index 0000000..e58cf30
--- /dev/null
+++ b/icons/16x16/symbol4.png
Binary files differ
diff --git a/icons/16x16/symbol5.png b/icons/16x16/symbol5.png
new file mode 100644
index 0000000..2454bed
--- /dev/null
+++ b/icons/16x16/symbol5.png
Binary files differ
diff --git a/icons/16x16/text_x_makefile.png b/icons/16x16/text_x_makefile.png
new file mode 100644
index 0000000..5a68f0b
--- /dev/null
+++ b/icons/16x16/text_x_makefile.png
Binary files differ
diff --git a/icons/22x22/__blockdevice.png b/icons/22x22/__blockdevice.png
new file mode 100644
index 0000000..fdc20a2
--- /dev/null
+++ b/icons/22x22/__blockdevice.png
Binary files differ
diff --git a/icons/22x22/_blockdevice.png b/icons/22x22/_blockdevice.png
new file mode 100644
index 0000000..14900f0
--- /dev/null
+++ b/icons/22x22/_blockdevice.png
Binary files differ
diff --git a/icons/22x22/compfile1.png b/icons/22x22/compfile1.png
new file mode 100644
index 0000000..5f007ed
--- /dev/null
+++ b/icons/22x22/compfile1.png
Binary files differ
diff --git a/icons/22x22/d52.png b/icons/22x22/d52.png
new file mode 100644
index 0000000..e274771
--- /dev/null
+++ b/icons/22x22/d52.png
Binary files differ
diff --git a/icons/22x22/ds1620.png b/icons/22x22/ds1620.png
new file mode 100644
index 0000000..4033884
--- /dev/null
+++ b/icons/22x22/ds1620.png
Binary files differ
diff --git a/icons/22x22/hd44780.png b/icons/22x22/hd44780.png
new file mode 100644
index 0000000..756ebd2
--- /dev/null
+++ b/icons/22x22/hd44780.png
Binary files differ
diff --git a/icons/flag/Afghanistan.png b/icons/flag/Afghanistan.png
new file mode 100644
index 0000000..8e6b823
--- /dev/null
+++ b/icons/flag/Afghanistan.png
Binary files differ
diff --git a/icons/flag/Albania.png b/icons/flag/Albania.png
new file mode 100644
index 0000000..39627f9
--- /dev/null
+++ b/icons/flag/Albania.png
Binary files differ
diff --git a/icons/flag/Algeria.png b/icons/flag/Algeria.png
new file mode 100644
index 0000000..4035d8a
--- /dev/null
+++ b/icons/flag/Algeria.png
Binary files differ
diff --git a/icons/flag/American_Samoa.png b/icons/flag/American_Samoa.png
new file mode 100644
index 0000000..611e6ed
--- /dev/null
+++ b/icons/flag/American_Samoa.png
Binary files differ
diff --git a/icons/flag/Andorra.png b/icons/flag/Andorra.png
new file mode 100644
index 0000000..23e38ef
--- /dev/null
+++ b/icons/flag/Andorra.png
Binary files differ
diff --git a/icons/flag/Angola.png b/icons/flag/Angola.png
new file mode 100644
index 0000000..aed9c35
--- /dev/null
+++ b/icons/flag/Angola.png
Binary files differ
diff --git a/icons/flag/Anguilla.png b/icons/flag/Anguilla.png
new file mode 100644
index 0000000..a14cdb4
--- /dev/null
+++ b/icons/flag/Anguilla.png
Binary files differ
diff --git a/icons/flag/Antigua_and_Barbuda.png b/icons/flag/Antigua_and_Barbuda.png
new file mode 100644
index 0000000..67d1692
--- /dev/null
+++ b/icons/flag/Antigua_and_Barbuda.png
Binary files differ
diff --git a/icons/flag/Argentina.png b/icons/flag/Argentina.png
new file mode 100644
index 0000000..9120328
--- /dev/null
+++ b/icons/flag/Argentina.png
Binary files differ
diff --git a/icons/flag/Armenia.png b/icons/flag/Armenia.png
new file mode 100644
index 0000000..f3ac165
--- /dev/null
+++ b/icons/flag/Armenia.png
Binary files differ
diff --git a/icons/flag/Aruba.png b/icons/flag/Aruba.png
new file mode 100644
index 0000000..0a79ec5
--- /dev/null
+++ b/icons/flag/Aruba.png
Binary files differ
diff --git a/icons/flag/Australia.png b/icons/flag/Australia.png
new file mode 100644
index 0000000..0493872
--- /dev/null
+++ b/icons/flag/Australia.png
Binary files differ
diff --git a/icons/flag/Austria.png b/icons/flag/Austria.png
new file mode 100644
index 0000000..3c8523d
--- /dev/null
+++ b/icons/flag/Austria.png
Binary files differ
diff --git a/icons/flag/Azerbaijan.png b/icons/flag/Azerbaijan.png
new file mode 100644
index 0000000..035afbb
--- /dev/null
+++ b/icons/flag/Azerbaijan.png
Binary files differ
diff --git a/icons/flag/Bahamas.png b/icons/flag/Bahamas.png
new file mode 100644
index 0000000..a5400c6
--- /dev/null
+++ b/icons/flag/Bahamas.png
Binary files differ
diff --git a/icons/flag/Bahrain.png b/icons/flag/Bahrain.png
new file mode 100644
index 0000000..f5f4ed4
--- /dev/null
+++ b/icons/flag/Bahrain.png
Binary files differ
diff --git a/icons/flag/Bangladesh.png b/icons/flag/Bangladesh.png
new file mode 100644
index 0000000..438b06b
--- /dev/null
+++ b/icons/flag/Bangladesh.png
Binary files differ
diff --git a/icons/flag/Barbados.png b/icons/flag/Barbados.png
new file mode 100644
index 0000000..d69e71c
--- /dev/null
+++ b/icons/flag/Barbados.png
Binary files differ
diff --git a/icons/flag/Belarus.png b/icons/flag/Belarus.png
new file mode 100644
index 0000000..9d9459e
--- /dev/null
+++ b/icons/flag/Belarus.png
Binary files differ
diff --git a/icons/flag/Belgium.png b/icons/flag/Belgium.png
new file mode 100644
index 0000000..3217710
--- /dev/null
+++ b/icons/flag/Belgium.png
Binary files differ
diff --git a/icons/flag/Belize.png b/icons/flag/Belize.png
new file mode 100644
index 0000000..578aed5
--- /dev/null
+++ b/icons/flag/Belize.png
Binary files differ
diff --git a/icons/flag/Benin.png b/icons/flag/Benin.png
new file mode 100644
index 0000000..ffed824
--- /dev/null
+++ b/icons/flag/Benin.png
Binary files differ
diff --git a/icons/flag/Bermuda.png b/icons/flag/Bermuda.png
new file mode 100644
index 0000000..cfcce20
--- /dev/null
+++ b/icons/flag/Bermuda.png
Binary files differ
diff --git a/icons/flag/Bhutan.png b/icons/flag/Bhutan.png
new file mode 100644
index 0000000..823585c
--- /dev/null
+++ b/icons/flag/Bhutan.png
Binary files differ
diff --git a/icons/flag/Bolivia.png b/icons/flag/Bolivia.png
new file mode 100644
index 0000000..8bc60de
--- /dev/null
+++ b/icons/flag/Bolivia.png
Binary files differ
diff --git a/icons/flag/Bosnia.png b/icons/flag/Bosnia.png
new file mode 100644
index 0000000..17e2f2f
--- /dev/null
+++ b/icons/flag/Bosnia.png
Binary files differ
diff --git a/icons/flag/Botswana.png b/icons/flag/Botswana.png
new file mode 100644
index 0000000..2d08b85
--- /dev/null
+++ b/icons/flag/Botswana.png
Binary files differ
diff --git a/icons/flag/Brazil.png b/icons/flag/Brazil.png
new file mode 100644
index 0000000..0480786
--- /dev/null
+++ b/icons/flag/Brazil.png
Binary files differ
diff --git a/icons/flag/British_Virgin_Islands.png b/icons/flag/British_Virgin_Islands.png
new file mode 100644
index 0000000..ec45885
--- /dev/null
+++ b/icons/flag/British_Virgin_Islands.png
Binary files differ
diff --git a/icons/flag/Brunei.png b/icons/flag/Brunei.png
new file mode 100644
index 0000000..1e9a112
--- /dev/null
+++ b/icons/flag/Brunei.png
Binary files differ
diff --git a/icons/flag/Bulgaria.png b/icons/flag/Bulgaria.png
new file mode 100644
index 0000000..6ea31c5
--- /dev/null
+++ b/icons/flag/Bulgaria.png
Binary files differ
diff --git a/icons/flag/Burkina_Faso.png b/icons/flag/Burkina_Faso.png
new file mode 100644
index 0000000..8de11ca
--- /dev/null
+++ b/icons/flag/Burkina_Faso.png
Binary files differ
diff --git a/icons/flag/Burundi.png b/icons/flag/Burundi.png
new file mode 100644
index 0000000..15c9d89
--- /dev/null
+++ b/icons/flag/Burundi.png
Binary files differ
diff --git a/icons/flag/Cambodia.png b/icons/flag/Cambodia.png
new file mode 100644
index 0000000..ced7d9e
--- /dev/null
+++ b/icons/flag/Cambodia.png
Binary files differ
diff --git a/icons/flag/Cameroon.png b/icons/flag/Cameroon.png
new file mode 100644
index 0000000..dc1878e
--- /dev/null
+++ b/icons/flag/Cameroon.png
Binary files differ
diff --git a/icons/flag/Canada.png b/icons/flag/Canada.png
new file mode 100644
index 0000000..dead2e4
--- /dev/null
+++ b/icons/flag/Canada.png
Binary files differ
diff --git a/icons/flag/Cape_Verde.png b/icons/flag/Cape_Verde.png
new file mode 100644
index 0000000..c7d29af
--- /dev/null
+++ b/icons/flag/Cape_Verde.png
Binary files differ
diff --git a/icons/flag/Cayman_Islands.png b/icons/flag/Cayman_Islands.png
new file mode 100644
index 0000000..cad4e61
--- /dev/null
+++ b/icons/flag/Cayman_Islands.png
Binary files differ
diff --git a/icons/flag/Central_African_Republic.png b/icons/flag/Central_African_Republic.png
new file mode 100644
index 0000000..845df21
--- /dev/null
+++ b/icons/flag/Central_African_Republic.png
Binary files differ
diff --git a/icons/flag/Chad.png b/icons/flag/Chad.png
new file mode 100644
index 0000000..41c7656
--- /dev/null
+++ b/icons/flag/Chad.png
Binary files differ
diff --git a/icons/flag/Chile.png b/icons/flag/Chile.png
new file mode 100644
index 0000000..b847e8c
--- /dev/null
+++ b/icons/flag/Chile.png
Binary files differ
diff --git a/icons/flag/China.png b/icons/flag/China.png
new file mode 100644
index 0000000..b8a8a42
--- /dev/null
+++ b/icons/flag/China.png
Binary files differ
diff --git a/icons/flag/Christmas_Island.png b/icons/flag/Christmas_Island.png
new file mode 100644
index 0000000..446e73d
--- /dev/null
+++ b/icons/flag/Christmas_Island.png
Binary files differ
diff --git a/icons/flag/Colombia.png b/icons/flag/Colombia.png
new file mode 100644
index 0000000..8201338
--- /dev/null
+++ b/icons/flag/Colombia.png
Binary files differ
diff --git a/icons/flag/Comoros.png b/icons/flag/Comoros.png
new file mode 100644
index 0000000..e51fa58
--- /dev/null
+++ b/icons/flag/Comoros.png
Binary files differ
diff --git a/icons/flag/Cook_Islands.png b/icons/flag/Cook_Islands.png
new file mode 100644
index 0000000..bc612ab
--- /dev/null
+++ b/icons/flag/Cook_Islands.png
Binary files differ
diff --git a/icons/flag/Costa_Rica.png b/icons/flag/Costa_Rica.png
new file mode 100644
index 0000000..9f7410e
--- /dev/null
+++ b/icons/flag/Costa_Rica.png
Binary files differ
diff --git a/icons/flag/Cote_dIvoire.png b/icons/flag/Cote_dIvoire.png
new file mode 100644
index 0000000..3e99474
--- /dev/null
+++ b/icons/flag/Cote_dIvoire.png
Binary files differ
diff --git a/icons/flag/Croatia.png b/icons/flag/Croatia.png
new file mode 100644
index 0000000..3e537de
--- /dev/null
+++ b/icons/flag/Croatia.png
Binary files differ
diff --git a/icons/flag/Cuba.png b/icons/flag/Cuba.png
new file mode 100644
index 0000000..d85e97e
--- /dev/null
+++ b/icons/flag/Cuba.png
Binary files differ
diff --git a/icons/flag/Cyprus.png b/icons/flag/Cyprus.png
new file mode 100644
index 0000000..ecae218
--- /dev/null
+++ b/icons/flag/Cyprus.png
Binary files differ
diff --git a/icons/flag/Czech_Republic.png b/icons/flag/Czech_Republic.png
new file mode 100644
index 0000000..27c467c
--- /dev/null
+++ b/icons/flag/Czech_Republic.png
Binary files differ
diff --git a/icons/flag/Democratic_Republic_of_the_Congo.png b/icons/flag/Democratic_Republic_of_the_Congo.png
new file mode 100644
index 0000000..a7ae415
--- /dev/null
+++ b/icons/flag/Democratic_Republic_of_the_Congo.png
Binary files differ
diff --git a/icons/flag/Denmark.png b/icons/flag/Denmark.png
new file mode 100644
index 0000000..55bd9f7
--- /dev/null
+++ b/icons/flag/Denmark.png
Binary files differ
diff --git a/icons/flag/Djibouti.png b/icons/flag/Djibouti.png
new file mode 100644
index 0000000..fedbbbd
--- /dev/null
+++ b/icons/flag/Djibouti.png
Binary files differ
diff --git a/icons/flag/Dominica.png b/icons/flag/Dominica.png
new file mode 100644
index 0000000..ef68f5c
--- /dev/null
+++ b/icons/flag/Dominica.png
Binary files differ
diff --git a/icons/flag/Dominican_Republic.png b/icons/flag/Dominican_Republic.png
new file mode 100644
index 0000000..567d4a1
--- /dev/null
+++ b/icons/flag/Dominican_Republic.png
Binary files differ
diff --git a/icons/flag/Ecuador.png b/icons/flag/Ecuador.png
new file mode 100644
index 0000000..787b485
--- /dev/null
+++ b/icons/flag/Ecuador.png
Binary files differ
diff --git a/icons/flag/Egypt.png b/icons/flag/Egypt.png
new file mode 100644
index 0000000..ef2353b
--- /dev/null
+++ b/icons/flag/Egypt.png
Binary files differ
diff --git a/icons/flag/El_Salvador.png b/icons/flag/El_Salvador.png
new file mode 100644
index 0000000..1edbfd0
--- /dev/null
+++ b/icons/flag/El_Salvador.png
Binary files differ
diff --git a/icons/flag/Equatorial_Guinea.png b/icons/flag/Equatorial_Guinea.png
new file mode 100644
index 0000000..b298d19
--- /dev/null
+++ b/icons/flag/Equatorial_Guinea.png
Binary files differ
diff --git a/icons/flag/Eritrea.png b/icons/flag/Eritrea.png
new file mode 100644
index 0000000..8ac64fe
--- /dev/null
+++ b/icons/flag/Eritrea.png
Binary files differ
diff --git a/icons/flag/Estonia.png b/icons/flag/Estonia.png
new file mode 100644
index 0000000..694de5b
--- /dev/null
+++ b/icons/flag/Estonia.png
Binary files differ
diff --git a/icons/flag/Ethiopia.png b/icons/flag/Ethiopia.png
new file mode 100644
index 0000000..39279b4
--- /dev/null
+++ b/icons/flag/Ethiopia.png
Binary files differ
diff --git a/icons/flag/Falkland_Islands.png b/icons/flag/Falkland_Islands.png
new file mode 100644
index 0000000..6957760
--- /dev/null
+++ b/icons/flag/Falkland_Islands.png
Binary files differ
diff --git a/icons/flag/Faroe_Islands.png b/icons/flag/Faroe_Islands.png
new file mode 100644
index 0000000..d600665
--- /dev/null
+++ b/icons/flag/Faroe_Islands.png
Binary files differ
diff --git a/icons/flag/Fiji.png b/icons/flag/Fiji.png
new file mode 100644
index 0000000..ebdef29
--- /dev/null
+++ b/icons/flag/Fiji.png
Binary files differ
diff --git a/icons/flag/Finland.png b/icons/flag/Finland.png
new file mode 100644
index 0000000..2f7cd56
--- /dev/null
+++ b/icons/flag/Finland.png
Binary files differ
diff --git a/icons/flag/France.png b/icons/flag/France.png
new file mode 100644
index 0000000..6482b70
--- /dev/null
+++ b/icons/flag/France.png
Binary files differ
diff --git a/icons/flag/French_Polynesia.png b/icons/flag/French_Polynesia.png
new file mode 100644
index 0000000..e6b8e3f
--- /dev/null
+++ b/icons/flag/French_Polynesia.png
Binary files differ
diff --git a/icons/flag/Gabon.png b/icons/flag/Gabon.png
new file mode 100644
index 0000000..0539b39
--- /dev/null
+++ b/icons/flag/Gabon.png
Binary files differ
diff --git a/icons/flag/Gambia.png b/icons/flag/Gambia.png
new file mode 100644
index 0000000..d8a448a
--- /dev/null
+++ b/icons/flag/Gambia.png
Binary files differ
diff --git a/icons/flag/Georgia.png b/icons/flag/Georgia.png
new file mode 100644
index 0000000..66050f7
--- /dev/null
+++ b/icons/flag/Georgia.png
Binary files differ
diff --git a/icons/flag/Germany.png b/icons/flag/Germany.png
new file mode 100644
index 0000000..144bfa9
--- /dev/null
+++ b/icons/flag/Germany.png
Binary files differ
diff --git a/icons/flag/Ghana.png b/icons/flag/Ghana.png
new file mode 100644
index 0000000..3cbbebd
--- /dev/null
+++ b/icons/flag/Ghana.png
Binary files differ
diff --git a/icons/flag/Gibraltar.png b/icons/flag/Gibraltar.png
new file mode 100644
index 0000000..35704d0
--- /dev/null
+++ b/icons/flag/Gibraltar.png
Binary files differ
diff --git a/icons/flag/Greece.png b/icons/flag/Greece.png
new file mode 100644
index 0000000..280a089
--- /dev/null
+++ b/icons/flag/Greece.png
Binary files differ
diff --git a/icons/flag/Greenland.png b/icons/flag/Greenland.png
new file mode 100644
index 0000000..6cb6a47
--- /dev/null
+++ b/icons/flag/Greenland.png
Binary files differ
diff --git a/icons/flag/Grenada.png b/icons/flag/Grenada.png
new file mode 100644
index 0000000..c143dd9
--- /dev/null
+++ b/icons/flag/Grenada.png
Binary files differ
diff --git a/icons/flag/Guam.png b/icons/flag/Guam.png
new file mode 100644
index 0000000..d3f318f
--- /dev/null
+++ b/icons/flag/Guam.png
Binary files differ
diff --git a/icons/flag/Guatemala.png b/icons/flag/Guatemala.png
new file mode 100644
index 0000000..3a60d80
--- /dev/null
+++ b/icons/flag/Guatemala.png
Binary files differ
diff --git a/icons/flag/Guinea.png b/icons/flag/Guinea.png
new file mode 100644
index 0000000..894665b
--- /dev/null
+++ b/icons/flag/Guinea.png
Binary files differ
diff --git a/icons/flag/Guinea_Bissau.png b/icons/flag/Guinea_Bissau.png
new file mode 100644
index 0000000..153143d
--- /dev/null
+++ b/icons/flag/Guinea_Bissau.png
Binary files differ
diff --git a/icons/flag/Guyana.png b/icons/flag/Guyana.png
new file mode 100644
index 0000000..2fe4e3d
--- /dev/null
+++ b/icons/flag/Guyana.png
Binary files differ
diff --git a/icons/flag/Haiti.png b/icons/flag/Haiti.png
new file mode 100644
index 0000000..b2f9385
--- /dev/null
+++ b/icons/flag/Haiti.png
Binary files differ
diff --git a/icons/flag/Honduras.png b/icons/flag/Honduras.png
new file mode 100644
index 0000000..bee7857
--- /dev/null
+++ b/icons/flag/Honduras.png
Binary files differ
diff --git a/icons/flag/Hong_Kong.png b/icons/flag/Hong_Kong.png
new file mode 100644
index 0000000..1cff084
--- /dev/null
+++ b/icons/flag/Hong_Kong.png
Binary files differ
diff --git a/icons/flag/Hungary.png b/icons/flag/Hungary.png
new file mode 100644
index 0000000..c5287f7
--- /dev/null
+++ b/icons/flag/Hungary.png
Binary files differ
diff --git a/icons/flag/Iceland.png b/icons/flag/Iceland.png
new file mode 100644
index 0000000..7fc3525
--- /dev/null
+++ b/icons/flag/Iceland.png
Binary files differ
diff --git a/icons/flag/India.png b/icons/flag/India.png
new file mode 100644
index 0000000..4978305
--- /dev/null
+++ b/icons/flag/India.png
Binary files differ
diff --git a/icons/flag/Indonesia.png b/icons/flag/Indonesia.png
new file mode 100644
index 0000000..6a1c010
--- /dev/null
+++ b/icons/flag/Indonesia.png
Binary files differ
diff --git a/icons/flag/Iran.png b/icons/flag/Iran.png
new file mode 100644
index 0000000..cd53a19
--- /dev/null
+++ b/icons/flag/Iran.png
Binary files differ
diff --git a/icons/flag/Iraq.png b/icons/flag/Iraq.png
new file mode 100644
index 0000000..48901da
--- /dev/null
+++ b/icons/flag/Iraq.png
Binary files differ
diff --git a/icons/flag/Ireland.png b/icons/flag/Ireland.png
new file mode 100644
index 0000000..38e1b72
--- /dev/null
+++ b/icons/flag/Ireland.png
Binary files differ
diff --git a/icons/flag/Israel.png b/icons/flag/Israel.png
new file mode 100644
index 0000000..e696643
--- /dev/null
+++ b/icons/flag/Israel.png
Binary files differ
diff --git a/icons/flag/Italy.png b/icons/flag/Italy.png
new file mode 100644
index 0000000..f7f55a3
--- /dev/null
+++ b/icons/flag/Italy.png
Binary files differ
diff --git a/icons/flag/Jamaica.png b/icons/flag/Jamaica.png
new file mode 100644
index 0000000..8b52e65
--- /dev/null
+++ b/icons/flag/Jamaica.png
Binary files differ
diff --git a/icons/flag/Japan.png b/icons/flag/Japan.png
new file mode 100644
index 0000000..5831af5
--- /dev/null
+++ b/icons/flag/Japan.png
Binary files differ
diff --git a/icons/flag/Jordan.png b/icons/flag/Jordan.png
new file mode 100644
index 0000000..817d120
--- /dev/null
+++ b/icons/flag/Jordan.png
Binary files differ
diff --git a/icons/flag/Kazakhstan.png b/icons/flag/Kazakhstan.png
new file mode 100644
index 0000000..cbb7d55
--- /dev/null
+++ b/icons/flag/Kazakhstan.png
Binary files differ
diff --git a/icons/flag/Kenya.png b/icons/flag/Kenya.png
new file mode 100644
index 0000000..787a3b5
--- /dev/null
+++ b/icons/flag/Kenya.png
Binary files differ
diff --git a/icons/flag/Kiribati.png b/icons/flag/Kiribati.png
new file mode 100644
index 0000000..0581975
--- /dev/null
+++ b/icons/flag/Kiribati.png
Binary files differ
diff --git a/icons/flag/Kuwait.png b/icons/flag/Kuwait.png
new file mode 100644
index 0000000..7f85b37
--- /dev/null
+++ b/icons/flag/Kuwait.png
Binary files differ
diff --git a/icons/flag/Kyrgyzstan.png b/icons/flag/Kyrgyzstan.png
new file mode 100644
index 0000000..e3873de
--- /dev/null
+++ b/icons/flag/Kyrgyzstan.png
Binary files differ
diff --git a/icons/flag/Laos.png b/icons/flag/Laos.png
new file mode 100644
index 0000000..b6d4393
--- /dev/null
+++ b/icons/flag/Laos.png
Binary files differ
diff --git a/icons/flag/Latvia.png b/icons/flag/Latvia.png
new file mode 100644
index 0000000..2ca0404
--- /dev/null
+++ b/icons/flag/Latvia.png
Binary files differ
diff --git a/icons/flag/Lebanon.png b/icons/flag/Lebanon.png
new file mode 100644
index 0000000..428283a
--- /dev/null
+++ b/icons/flag/Lebanon.png
Binary files differ
diff --git a/icons/flag/Lesotho.png b/icons/flag/Lesotho.png
new file mode 100644
index 0000000..4d6d49d
--- /dev/null
+++ b/icons/flag/Lesotho.png
Binary files differ
diff --git a/icons/flag/Liberia.png b/icons/flag/Liberia.png
new file mode 100644
index 0000000..1ea830c
--- /dev/null
+++ b/icons/flag/Liberia.png
Binary files differ
diff --git a/icons/flag/Libya.png b/icons/flag/Libya.png
new file mode 100644
index 0000000..c40677e
--- /dev/null
+++ b/icons/flag/Libya.png
Binary files differ
diff --git a/icons/flag/Liechtenstein.png b/icons/flag/Liechtenstein.png
new file mode 100644
index 0000000..0a1845d
--- /dev/null
+++ b/icons/flag/Liechtenstein.png
Binary files differ
diff --git a/icons/flag/Lithuania.png b/icons/flag/Lithuania.png
new file mode 100644
index 0000000..2a2156a
--- /dev/null
+++ b/icons/flag/Lithuania.png
Binary files differ
diff --git a/icons/flag/Luxembourg.png b/icons/flag/Luxembourg.png
new file mode 100644
index 0000000..61e7e68
--- /dev/null
+++ b/icons/flag/Luxembourg.png
Binary files differ
diff --git a/icons/flag/Macao.png b/icons/flag/Macao.png
new file mode 100644
index 0000000..e1de5ea
--- /dev/null
+++ b/icons/flag/Macao.png
Binary files differ
diff --git a/icons/flag/Macedonia.png b/icons/flag/Macedonia.png
new file mode 100644
index 0000000..bed0065
--- /dev/null
+++ b/icons/flag/Macedonia.png
Binary files differ
diff --git a/icons/flag/Madagascar.png b/icons/flag/Madagascar.png
new file mode 100644
index 0000000..fcd034e
--- /dev/null
+++ b/icons/flag/Madagascar.png
Binary files differ
diff --git a/icons/flag/Malawi.png b/icons/flag/Malawi.png
new file mode 100644
index 0000000..57c8a5c
--- /dev/null
+++ b/icons/flag/Malawi.png
Binary files differ
diff --git a/icons/flag/Malaysia.png b/icons/flag/Malaysia.png
new file mode 100644
index 0000000..3121987
--- /dev/null
+++ b/icons/flag/Malaysia.png
Binary files differ
diff --git a/icons/flag/Maldives.png b/icons/flag/Maldives.png
new file mode 100644
index 0000000..edaa531
--- /dev/null
+++ b/icons/flag/Maldives.png
Binary files differ
diff --git a/icons/flag/Mali.png b/icons/flag/Mali.png
new file mode 100644
index 0000000..073e0cf
--- /dev/null
+++ b/icons/flag/Mali.png
Binary files differ
diff --git a/icons/flag/Malta.png b/icons/flag/Malta.png
new file mode 100644
index 0000000..266868a
--- /dev/null
+++ b/icons/flag/Malta.png
Binary files differ
diff --git a/icons/flag/Marshall_Islands.png b/icons/flag/Marshall_Islands.png
new file mode 100644
index 0000000..222011c
--- /dev/null
+++ b/icons/flag/Marshall_Islands.png
Binary files differ
diff --git a/icons/flag/Martinique.png b/icons/flag/Martinique.png
new file mode 100644
index 0000000..6482b70
--- /dev/null
+++ b/icons/flag/Martinique.png
Binary files differ
diff --git a/icons/flag/Mauritania.png b/icons/flag/Mauritania.png
new file mode 100644
index 0000000..53983ae
--- /dev/null
+++ b/icons/flag/Mauritania.png
Binary files differ
diff --git a/icons/flag/Mauritius.png b/icons/flag/Mauritius.png
new file mode 100644
index 0000000..155c59e
--- /dev/null
+++ b/icons/flag/Mauritius.png
Binary files differ
diff --git a/icons/flag/Mexico.png b/icons/flag/Mexico.png
new file mode 100644
index 0000000..010902c
--- /dev/null
+++ b/icons/flag/Mexico.png
Binary files differ
diff --git a/icons/flag/Micronesia.png b/icons/flag/Micronesia.png
new file mode 100644
index 0000000..aecd966
--- /dev/null
+++ b/icons/flag/Micronesia.png
Binary files differ
diff --git a/icons/flag/Moldova.png b/icons/flag/Moldova.png
new file mode 100644
index 0000000..5b095cf
--- /dev/null
+++ b/icons/flag/Moldova.png
Binary files differ
diff --git a/icons/flag/Monaco.png b/icons/flag/Monaco.png
new file mode 100644
index 0000000..d1b36ab
--- /dev/null
+++ b/icons/flag/Monaco.png
Binary files differ
diff --git a/icons/flag/Mongolia.png b/icons/flag/Mongolia.png
new file mode 100644
index 0000000..66fa880
--- /dev/null
+++ b/icons/flag/Mongolia.png
Binary files differ
diff --git a/icons/flag/Montserrat.png b/icons/flag/Montserrat.png
new file mode 100644
index 0000000..1b4d821
--- /dev/null
+++ b/icons/flag/Montserrat.png
Binary files differ
diff --git a/icons/flag/Morocco.png b/icons/flag/Morocco.png
new file mode 100644
index 0000000..d02d22c
--- /dev/null
+++ b/icons/flag/Morocco.png
Binary files differ
diff --git a/icons/flag/Mozambique.png b/icons/flag/Mozambique.png
new file mode 100644
index 0000000..0f1e81c
--- /dev/null
+++ b/icons/flag/Mozambique.png
Binary files differ
diff --git a/icons/flag/Myanmar.png b/icons/flag/Myanmar.png
new file mode 100644
index 0000000..4b0f724
--- /dev/null
+++ b/icons/flag/Myanmar.png
Binary files differ
diff --git a/icons/flag/Namibia.png b/icons/flag/Namibia.png
new file mode 100644
index 0000000..5b7ccc7
--- /dev/null
+++ b/icons/flag/Namibia.png
Binary files differ
diff --git a/icons/flag/Nauru.png b/icons/flag/Nauru.png
new file mode 100644
index 0000000..2fd329e
--- /dev/null
+++ b/icons/flag/Nauru.png
Binary files differ
diff --git a/icons/flag/Nepal.png b/icons/flag/Nepal.png
new file mode 100644
index 0000000..97cc5e5
--- /dev/null
+++ b/icons/flag/Nepal.png
Binary files differ
diff --git a/icons/flag/Netherlands.png b/icons/flag/Netherlands.png
new file mode 100644
index 0000000..3b936a6
--- /dev/null
+++ b/icons/flag/Netherlands.png
Binary files differ
diff --git a/icons/flag/Netherlands_Antilles.png b/icons/flag/Netherlands_Antilles.png
new file mode 100644
index 0000000..c137d97
--- /dev/null
+++ b/icons/flag/Netherlands_Antilles.png
Binary files differ
diff --git a/icons/flag/New_Zealand.png b/icons/flag/New_Zealand.png
new file mode 100644
index 0000000..a755b73
--- /dev/null
+++ b/icons/flag/New_Zealand.png
Binary files differ
diff --git a/icons/flag/Nicaragua.png b/icons/flag/Nicaragua.png
new file mode 100644
index 0000000..d754ae6
--- /dev/null
+++ b/icons/flag/Nicaragua.png
Binary files differ
diff --git a/icons/flag/Niger.png b/icons/flag/Niger.png
new file mode 100644
index 0000000..04a879f
--- /dev/null
+++ b/icons/flag/Niger.png
Binary files differ
diff --git a/icons/flag/Nigeria.png b/icons/flag/Nigeria.png
new file mode 100644
index 0000000..c126b44
--- /dev/null
+++ b/icons/flag/Nigeria.png
Binary files differ
diff --git a/icons/flag/Niue.png b/icons/flag/Niue.png
new file mode 100644
index 0000000..27f5c98
--- /dev/null
+++ b/icons/flag/Niue.png
Binary files differ
diff --git a/icons/flag/Norfolk_Island.png b/icons/flag/Norfolk_Island.png
new file mode 100644
index 0000000..06240d5
--- /dev/null
+++ b/icons/flag/Norfolk_Island.png
Binary files differ
diff --git a/icons/flag/North_Korea.png b/icons/flag/North_Korea.png
new file mode 100644
index 0000000..b22ae48
--- /dev/null
+++ b/icons/flag/North_Korea.png
Binary files differ
diff --git a/icons/flag/Norway.png b/icons/flag/Norway.png
new file mode 100644
index 0000000..f5b27be
--- /dev/null
+++ b/icons/flag/Norway.png
Binary files differ
diff --git a/icons/flag/Oman.png b/icons/flag/Oman.png
new file mode 100644
index 0000000..587d1e6
--- /dev/null
+++ b/icons/flag/Oman.png
Binary files differ
diff --git a/icons/flag/Pakistan.png b/icons/flag/Pakistan.png
new file mode 100644
index 0000000..173e6f0
--- /dev/null
+++ b/icons/flag/Pakistan.png
Binary files differ
diff --git a/icons/flag/Palau.png b/icons/flag/Palau.png
new file mode 100644
index 0000000..ff58ceb
--- /dev/null
+++ b/icons/flag/Palau.png
Binary files differ
diff --git a/icons/flag/Panama.png b/icons/flag/Panama.png
new file mode 100644
index 0000000..d95f737
--- /dev/null
+++ b/icons/flag/Panama.png
Binary files differ
diff --git a/icons/flag/Papua_New_Guinea.png b/icons/flag/Papua_New_Guinea.png
new file mode 100644
index 0000000..c15c83a
--- /dev/null
+++ b/icons/flag/Papua_New_Guinea.png
Binary files differ
diff --git a/icons/flag/Paraguay.png b/icons/flag/Paraguay.png
new file mode 100644
index 0000000..a8b6005
--- /dev/null
+++ b/icons/flag/Paraguay.png
Binary files differ
diff --git a/icons/flag/Peru.png b/icons/flag/Peru.png
new file mode 100644
index 0000000..732053b
--- /dev/null
+++ b/icons/flag/Peru.png
Binary files differ
diff --git a/icons/flag/Philippines.png b/icons/flag/Philippines.png
new file mode 100644
index 0000000..cea2f58
--- /dev/null
+++ b/icons/flag/Philippines.png
Binary files differ
diff --git a/icons/flag/Pitcairn_Islands.png b/icons/flag/Pitcairn_Islands.png
new file mode 100644
index 0000000..281ca1d
--- /dev/null
+++ b/icons/flag/Pitcairn_Islands.png
Binary files differ
diff --git a/icons/flag/Poland.png b/icons/flag/Poland.png
new file mode 100644
index 0000000..2a70df1
--- /dev/null
+++ b/icons/flag/Poland.png
Binary files differ
diff --git a/icons/flag/Portugal.png b/icons/flag/Portugal.png
new file mode 100644
index 0000000..e1988aa
--- /dev/null
+++ b/icons/flag/Portugal.png
Binary files differ
diff --git a/icons/flag/Puerto_Rico.png b/icons/flag/Puerto_Rico.png
new file mode 100644
index 0000000..3efd864
--- /dev/null
+++ b/icons/flag/Puerto_Rico.png
Binary files differ
diff --git a/icons/flag/Qatar.png b/icons/flag/Qatar.png
new file mode 100644
index 0000000..d0c2481
--- /dev/null
+++ b/icons/flag/Qatar.png
Binary files differ
diff --git a/icons/flag/Republic_of_the_Congo.png b/icons/flag/Republic_of_the_Congo.png
new file mode 100644
index 0000000..9f50aa7
--- /dev/null
+++ b/icons/flag/Republic_of_the_Congo.png
Binary files differ
diff --git a/icons/flag/Romania.png b/icons/flag/Romania.png
new file mode 100644
index 0000000..ca51d47
--- /dev/null
+++ b/icons/flag/Romania.png
Binary files differ
diff --git a/icons/flag/Russian_Federation.png b/icons/flag/Russian_Federation.png
new file mode 100644
index 0000000..e3288ff
--- /dev/null
+++ b/icons/flag/Russian_Federation.png
Binary files differ
diff --git a/icons/flag/Rwanda.png b/icons/flag/Rwanda.png
new file mode 100644
index 0000000..3663487
--- /dev/null
+++ b/icons/flag/Rwanda.png
Binary files differ
diff --git a/icons/flag/Saint_Kitts_and_Nevis.png b/icons/flag/Saint_Kitts_and_Nevis.png
new file mode 100644
index 0000000..2104d62
--- /dev/null
+++ b/icons/flag/Saint_Kitts_and_Nevis.png
Binary files differ
diff --git a/icons/flag/Saint_Lucia.png b/icons/flag/Saint_Lucia.png
new file mode 100644
index 0000000..c410b8c
--- /dev/null
+++ b/icons/flag/Saint_Lucia.png
Binary files differ
diff --git a/icons/flag/Saint_Pierre.png b/icons/flag/Saint_Pierre.png
new file mode 100644
index 0000000..8e40e33
--- /dev/null
+++ b/icons/flag/Saint_Pierre.png
Binary files differ
diff --git a/icons/flag/Saint_Vicent_and_the_Grenadines.png b/icons/flag/Saint_Vicent_and_the_Grenadines.png
new file mode 100644
index 0000000..f9235e4
--- /dev/null
+++ b/icons/flag/Saint_Vicent_and_the_Grenadines.png
Binary files differ
diff --git a/icons/flag/Samoa.png b/icons/flag/Samoa.png
new file mode 100644
index 0000000..2df60a7
--- /dev/null
+++ b/icons/flag/Samoa.png
Binary files differ
diff --git a/icons/flag/San_Marino.png b/icons/flag/San_Marino.png
new file mode 100644
index 0000000..abc3a02
--- /dev/null
+++ b/icons/flag/San_Marino.png
Binary files differ
diff --git a/icons/flag/Sao_Tome_and_Principe.png b/icons/flag/Sao_Tome_and_Principe.png
new file mode 100644
index 0000000..666772e
--- /dev/null
+++ b/icons/flag/Sao_Tome_and_Principe.png
Binary files differ
diff --git a/icons/flag/Saudi_Arabia.png b/icons/flag/Saudi_Arabia.png
new file mode 100644
index 0000000..142a2ad
--- /dev/null
+++ b/icons/flag/Saudi_Arabia.png
Binary files differ
diff --git a/icons/flag/Senegal.png b/icons/flag/Senegal.png
new file mode 100644
index 0000000..74dedf5
--- /dev/null
+++ b/icons/flag/Senegal.png
Binary files differ
diff --git a/icons/flag/Seychelles.png b/icons/flag/Seychelles.png
new file mode 100644
index 0000000..27a5652
--- /dev/null
+++ b/icons/flag/Seychelles.png
Binary files differ
diff --git a/icons/flag/Sierra_Leone.png b/icons/flag/Sierra_Leone.png
new file mode 100644
index 0000000..5307f99
--- /dev/null
+++ b/icons/flag/Sierra_Leone.png
Binary files differ
diff --git a/icons/flag/Singapore.png b/icons/flag/Singapore.png
new file mode 100644
index 0000000..b4296f7
--- /dev/null
+++ b/icons/flag/Singapore.png
Binary files differ
diff --git a/icons/flag/Slovakia.png b/icons/flag/Slovakia.png
new file mode 100644
index 0000000..9e37e00
--- /dev/null
+++ b/icons/flag/Slovakia.png
Binary files differ
diff --git a/icons/flag/Slovenia.png b/icons/flag/Slovenia.png
new file mode 100644
index 0000000..cf0ce5b
--- /dev/null
+++ b/icons/flag/Slovenia.png
Binary files differ
diff --git a/icons/flag/Soloman_Islands.png b/icons/flag/Soloman_Islands.png
new file mode 100644
index 0000000..3f1ec91
--- /dev/null
+++ b/icons/flag/Soloman_Islands.png
Binary files differ
diff --git a/icons/flag/Somalia.png b/icons/flag/Somalia.png
new file mode 100644
index 0000000..aa5a7c9
--- /dev/null
+++ b/icons/flag/Somalia.png
Binary files differ
diff --git a/icons/flag/South_Africa.png b/icons/flag/South_Africa.png
new file mode 100644
index 0000000..2b170da
--- /dev/null
+++ b/icons/flag/South_Africa.png
Binary files differ
diff --git a/icons/flag/South_Georgia.png b/icons/flag/South_Georgia.png
new file mode 100644
index 0000000..75a030e
--- /dev/null
+++ b/icons/flag/South_Georgia.png
Binary files differ
diff --git a/icons/flag/South_Korea.png b/icons/flag/South_Korea.png
new file mode 100644
index 0000000..a1b4b37
--- /dev/null
+++ b/icons/flag/South_Korea.png
Binary files differ
diff --git a/icons/flag/Spain.png b/icons/flag/Spain.png
new file mode 100644
index 0000000..a4b3da3
--- /dev/null
+++ b/icons/flag/Spain.png
Binary files differ
diff --git a/icons/flag/Sri_Lanka.png b/icons/flag/Sri_Lanka.png
new file mode 100644
index 0000000..da5474a
--- /dev/null
+++ b/icons/flag/Sri_Lanka.png
Binary files differ
diff --git a/icons/flag/Sudan.png b/icons/flag/Sudan.png
new file mode 100644
index 0000000..39bfbd7
--- /dev/null
+++ b/icons/flag/Sudan.png
Binary files differ
diff --git a/icons/flag/Suriname.png b/icons/flag/Suriname.png
new file mode 100644
index 0000000..4afbd56
--- /dev/null
+++ b/icons/flag/Suriname.png
Binary files differ
diff --git a/icons/flag/Swaziland.png b/icons/flag/Swaziland.png
new file mode 100644
index 0000000..2c036a2
--- /dev/null
+++ b/icons/flag/Swaziland.png
Binary files differ
diff --git a/icons/flag/Sweden.png b/icons/flag/Sweden.png
new file mode 100644
index 0000000..7afb8d2
--- /dev/null
+++ b/icons/flag/Sweden.png
Binary files differ
diff --git a/icons/flag/Switzerland.png b/icons/flag/Switzerland.png
new file mode 100644
index 0000000..4cdda2f
--- /dev/null
+++ b/icons/flag/Switzerland.png
Binary files differ
diff --git a/icons/flag/Syria.png b/icons/flag/Syria.png
new file mode 100644
index 0000000..0330344
--- /dev/null
+++ b/icons/flag/Syria.png
Binary files differ
diff --git a/icons/flag/Taiwan.png b/icons/flag/Taiwan.png
new file mode 100644
index 0000000..8d8afa0
--- /dev/null
+++ b/icons/flag/Taiwan.png
Binary files differ
diff --git a/icons/flag/Tajikistan.png b/icons/flag/Tajikistan.png
new file mode 100644
index 0000000..68a59b5
--- /dev/null
+++ b/icons/flag/Tajikistan.png
Binary files differ
diff --git a/icons/flag/Tanzania.png b/icons/flag/Tanzania.png
new file mode 100644
index 0000000..13a2ed6
--- /dev/null
+++ b/icons/flag/Tanzania.png
Binary files differ
diff --git a/icons/flag/Thailand.png b/icons/flag/Thailand.png
new file mode 100644
index 0000000..8f6ec8a
--- /dev/null
+++ b/icons/flag/Thailand.png
Binary files differ
diff --git a/icons/flag/Timor-Leste.png b/icons/flag/Timor-Leste.png
new file mode 100644
index 0000000..3273dab
--- /dev/null
+++ b/icons/flag/Timor-Leste.png
Binary files differ
diff --git a/icons/flag/Togo.png b/icons/flag/Togo.png
new file mode 100644
index 0000000..ead624f
--- /dev/null
+++ b/icons/flag/Togo.png
Binary files differ
diff --git a/icons/flag/Tonga.png b/icons/flag/Tonga.png
new file mode 100644
index 0000000..7225661
--- /dev/null
+++ b/icons/flag/Tonga.png
Binary files differ
diff --git a/icons/flag/Trinidad_and_Tobago.png b/icons/flag/Trinidad_and_Tobago.png
new file mode 100644
index 0000000..9c951aa
--- /dev/null
+++ b/icons/flag/Trinidad_and_Tobago.png
Binary files differ
diff --git a/icons/flag/Tunisia.png b/icons/flag/Tunisia.png
new file mode 100644
index 0000000..25a81aa
--- /dev/null
+++ b/icons/flag/Tunisia.png
Binary files differ
diff --git a/icons/flag/Turkey.png b/icons/flag/Turkey.png
new file mode 100644
index 0000000..037999b
--- /dev/null
+++ b/icons/flag/Turkey.png
Binary files differ
diff --git a/icons/flag/Turkmenistan.png b/icons/flag/Turkmenistan.png
new file mode 100644
index 0000000..1e52aef
--- /dev/null
+++ b/icons/flag/Turkmenistan.png
Binary files differ
diff --git a/icons/flag/Turks_and_Caicos_Islands.png b/icons/flag/Turks_and_Caicos_Islands.png
new file mode 100644
index 0000000..86a0439
--- /dev/null
+++ b/icons/flag/Turks_and_Caicos_Islands.png
Binary files differ
diff --git a/icons/flag/Tuvalu.png b/icons/flag/Tuvalu.png
new file mode 100644
index 0000000..ad71f3a
--- /dev/null
+++ b/icons/flag/Tuvalu.png
Binary files differ
diff --git a/icons/flag/UAE.png b/icons/flag/UAE.png
new file mode 100644
index 0000000..3713c3a
--- /dev/null
+++ b/icons/flag/UAE.png
Binary files differ
diff --git a/icons/flag/US_Virgin_Islands.png b/icons/flag/US_Virgin_Islands.png
new file mode 100644
index 0000000..4322b34
--- /dev/null
+++ b/icons/flag/US_Virgin_Islands.png
Binary files differ
diff --git a/icons/flag/Uganda.png b/icons/flag/Uganda.png
new file mode 100644
index 0000000..0e847e3
--- /dev/null
+++ b/icons/flag/Uganda.png
Binary files differ
diff --git a/icons/flag/Ukraine.png b/icons/flag/Ukraine.png
new file mode 100644
index 0000000..9c9c2d0
--- /dev/null
+++ b/icons/flag/Ukraine.png
Binary files differ
diff --git a/icons/flag/United_Kingdom.png b/icons/flag/United_Kingdom.png
new file mode 100644
index 0000000..dcdea70
--- /dev/null
+++ b/icons/flag/United_Kingdom.png
Binary files differ
diff --git a/icons/flag/United_States_of_America.png b/icons/flag/United_States_of_America.png
new file mode 100644
index 0000000..9966ad2
--- /dev/null
+++ b/icons/flag/United_States_of_America.png
Binary files differ
diff --git a/icons/flag/Uruguay.png b/icons/flag/Uruguay.png
new file mode 100644
index 0000000..9f8f3dc
--- /dev/null
+++ b/icons/flag/Uruguay.png
Binary files differ
diff --git a/icons/flag/Uzbekistan.png b/icons/flag/Uzbekistan.png
new file mode 100644
index 0000000..b076d93
--- /dev/null
+++ b/icons/flag/Uzbekistan.png
Binary files differ
diff --git a/icons/flag/Vanuatu.png b/icons/flag/Vanuatu.png
new file mode 100644
index 0000000..855ece3
--- /dev/null
+++ b/icons/flag/Vanuatu.png
Binary files differ
diff --git a/icons/flag/Vatican_City.png b/icons/flag/Vatican_City.png
new file mode 100644
index 0000000..619ad37
--- /dev/null
+++ b/icons/flag/Vatican_City.png
Binary files differ
diff --git a/icons/flag/Venezuela.png b/icons/flag/Venezuela.png
new file mode 100644
index 0000000..8a73357
--- /dev/null
+++ b/icons/flag/Venezuela.png
Binary files differ
diff --git a/icons/flag/Vietnam.png b/icons/flag/Vietnam.png
new file mode 100644
index 0000000..4869bb0
--- /dev/null
+++ b/icons/flag/Vietnam.png
Binary files differ
diff --git a/icons/flag/Wallis_and_Futuna.png b/icons/flag/Wallis_and_Futuna.png
new file mode 100644
index 0000000..38536a4
--- /dev/null
+++ b/icons/flag/Wallis_and_Futuna.png
Binary files differ
diff --git a/icons/flag/Yemen.png b/icons/flag/Yemen.png
new file mode 100644
index 0000000..be02e6c
--- /dev/null
+++ b/icons/flag/Yemen.png
Binary files differ
diff --git a/icons/flag/Zambia.png b/icons/flag/Zambia.png
new file mode 100644
index 0000000..9a528ed
--- /dev/null
+++ b/icons/flag/Zambia.png
Binary files differ
diff --git a/icons/flag/Zimbabwe.png b/icons/flag/Zimbabwe.png
new file mode 100644
index 0000000..c361969
--- /dev/null
+++ b/icons/flag/Zimbabwe.png
Binary files differ
diff --git a/icons/flag/empty.png b/icons/flag/empty.png
new file mode 100644
index 0000000..cf655fd
--- /dev/null
+++ b/icons/flag/empty.png
Binary files differ
diff --git a/icons/mcu/AT89S51.png b/icons/mcu/AT89S51.png
new file mode 100644
index 0000000..2da5d4f
--- /dev/null
+++ b/icons/mcu/AT89S51.png
Binary files differ
diff --git a/icons/other/choff.png b/icons/other/choff.png
index ba156e8..68f8e8a 100644
--- a/icons/other/choff.png
+++ b/icons/other/choff.png
Binary files differ
diff --git a/icons/other/chon.png b/icons/other/chon.png
index 98d20a0..6894a7a 100644
--- a/icons/other/chon.png
+++ b/icons/other/chon.png
Binary files differ
diff --git a/icons/other/raoff.png b/icons/other/raoff.png
index cfd2cf0..c59fedf 100644
--- a/icons/other/raoff.png
+++ b/icons/other/raoff.png
Binary files differ
diff --git a/icons/other/raon.png b/icons/other/raon.png
index 5180124..8c2d3ad 100644
--- a/icons/other/raon.png
+++ b/icons/other/raon.png
Binary files differ
diff --git a/icons/other/splash.png b/icons/other/splash.png
index d844f57..9bb8418 100644
--- a/icons/other/splash.png
+++ b/icons/other/splash.png
Binary files differ
diff --git a/install.sh b/install.sh
deleted file mode 100755
index ab4357d..0000000
--- a/install.sh
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/bin/sh
-
-# --------------------------------------------------------
-# Copyright (C) Martin Ošmera <martin.osmera@gmail.com>
-# Licence: GPL
-# Version: 1.3.0
-# Homepage: http://mcu8051ide.sf.net
-# --------------------------------------------------------
-#
-# Installation script for MCU 8051 IDE
-# Usage:
-# ./install [--help | --uninstall]
-# ./install --no-check
-# --------------------------------------------------------
-
-
-echo "+--------------------------------------------------+"
-echo "| IMPORTANT NOTICE: |"
-echo "| |"
-echo "| This installation method is deprecated and will |"
-echo "| be removed in future versions ! |"
-echo "| Use 'cmake . && make && make install' instead. |"
-echo "+--------------------------------------------------+"
-
-if [ $UID -ne 0 ]; then
- echo "You must have root privileges in order to perform installation"
- exit 1
-fi
-
-check_for_library() {
- echo -n "Checking for ${1} ..."
- if ./test-lib.sh ${1} ${2} >> /dev/null; then
- echo "Ok"
- else
- echo "FAILED"
- echo
- echo "Please install the missing library or:"
- echo "\$ ./install.sh --no-check"
- echo "\$ mcu8051ide --check-libraries"
- echo "and see exactly what is missing"
- exit 1
- fi
-}
-
-if [ "${1}" = "--help" ] || [ "${1}" = "-h" ]; then
- echo "Installation script for MCU 8051 IDE"
- echo " Installation:"
- echo " ./install.sh"
- echo " Installation without checking for libraries:"
- echo " ./install.sh --no-check"
- echo " Uninstallation:"
- echo " ./install.sh --uninstall"
- echo ""
- exit
-fi
-
-if [ "${1}" = "--uninstall" ]; then
- echo "Uninstalling MCU 8051 IDE"
- rm -rfv /usr/share/mcu8051ide || exit 1
- rm -fv /usr/bin/mcu8051ide || exit 1
- rm -fv /usr/share/man/man1/mcu8051ide.1.gz
- echo "Uninstallation successful"
- exit
-fi
-
-echo "Installing MCU 8051 IDE"
-echo
-
-if [ "${1}" != "--no-check" ]; then
- check_for_library BWidget 1.8.0
- check_for_library Itcl 3.4
- check_for_library Tcl 8.2
- check_for_library md5 2.0
- check_for_library Tk 8.5
- check_for_library img::png 1.3
- check_for_library tdom 0.8
- check_for_library Tclx 8.4
-fi
-
-echo "Creating launcher"
-./make-launcher --path-to-lib=/usr/share/mcu8051ide/lib || exit 1
-
-echo "Creating destination directory: /usr/share/mcu8051ide"
-mkdir -p /usr/share/mcu8051ide || exit 1
-
-echo "Copying files"
-cp -prv ./{demo,doc,lib,icons,data,translations} /usr/share/mcu8051ide || exit 1
-
-echo "Copying manual page"
-cp -pv ./doc/man/mcu8051ide.1.gz /usr/share/man/man1/mcu8051ide.1.gz
-
-echo "Copying .desktop spec and application icon"
-mkdir -p /usr/share/applications
-mkdir -p /usr/share/pixmaps
-cp -pv ./mcu8051ide.png /usr/share/pixmaps/mcu8051ide.png
-cp -pv ./mcu8051ide.desktop /usr/share/applications/mcu8051ide.desktop
-
-echo "Copying launcher"
-cp -prv mcu8051ide /usr/bin || exit 1
-
-echo
-echo "Installation successful"
diff --git a/lib/X.tcl b/lib/X.tcl
index 0875d3d..26cfb7f 100755..100644
--- a/lib/X.tcl
+++ b/lib/X.tcl
@@ -1,8 +1,8 @@
-#!/usr/bin/tclsh
+#!/usr/bin/wish
# 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,14 +21,19 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _X_TCL ] } {
+set _X_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
-# "Provides various dialogs and various variables for various things"
+# "Provides various dialogues and various variables for various things"
# For instance the "Go to" dialog is placed here
# --------------------------------------------------------------------------
# Dialog for selecting MCU and loading MCU details from definition file
-source "${::LIB_DIRNAME}/dialogs/selectmcu.tcl"
+source "${::LIB_DIRNAME}/dialogues/selectmcu.tcl"
namespace eval X {
@@ -43,7 +48,7 @@ namespace eval X {
variable project_menu_locked 1 ;# Bool: Indicates than there is at least one opened project
if {!$::MICROSOFT_WINDOWS} {
variable defaultDirectory ${::env(HOME)} ;# Default directory
- } {
+ } else {
variable defaultDirectory ${::env(USERPROFILE)} ;# Default directory
}
variable simulator_enabled {} ;# List of booleans: Simulator engaged
@@ -51,13 +56,13 @@ namespace eval X {
variable fsd_result {} ;# Value returnded by file selection dialog (in some cases)
variable projectmenu {.project_menu} ;# ID of Popup menu for project tabs
variable projectmenu_project {} ;# Object: project selected by project popup menu
- variable selectedView ;# Int: Selected editor by editor statusbar popup menu
+ variable selectedView ;# Object: Selected editor by editor statusbar popup menu
variable open_f_external_editor 0 ;# Bool: Use procedure __open to open new file for embedded external editor
variable file_recent_files {} ;# List: recently opened files
variable project_recent_files {} ;# List: recently opened projects
variable vhw_recent_files {} ;# List: recently opened Virtual HW files
# List of supported processors
- variable avaliable_processors [::SelectMCU::get_avaliable_processors]
+ variable available_processors [::SelectMCU::get_available_processors]
variable procedure_exit_in_progress 0 ;# Bool: proc "__exit" in progress
## Doxygen
@@ -69,11 +74,14 @@ namespace eval X {
## ASCII chart
variable ascii_chart_win_object {} ;# Object: ASCII chart window object
- ## 8-segment LED editor
+ ## Interactive 8051 instruction table
+ variable table_of_instructions_object {} ;# Object: Interactive 8051 instruction table
+
+ ## 8-Segment LED editor
variable eightsegment_editors {} ;# List: All 8-segment LED display editors invoked
- ## Base convertor
- variable base_convertors {} ;# List: All base convertor objects
+ ## Base converter
+ variable base_converters {} ;# List: All base converter objects
## Special calculator
variable spec_calc_objects {} ;# List: All special calculator objects
@@ -81,6 +89,14 @@ namespace eval X {
## UART/RS232 debugger
variable rs232debugger_objects {} ;# List: All "RS232 debugger" objects
+ ## LCD display controlled by HD44780
+ variable vhw_HD44780_rect ;# Array: Rectangles in dialog "Set display size"
+ variable vhw_HD44780_canvas ;# Widget: Canvas widget in dialog "Set display size"
+ variable vhw_HD44780_counter 0 ;# Int: Counter of dialog instances
+ variable vhw_HD44780_size_lbl ;# Widget: Label showing the LCD size in dialog "Set display size"
+ variable vhw_HD44780_dialog ;# Widget: Toplevel window of dialog "Set display size"
+ variable vhw_HD44780_size {0 0} ;# List of Int: LCD display size chosen by the user, {HEIGHT WIDTH}
+
## Dialog "Go to"
variable goto ;# Line where to go
@@ -98,7 +114,7 @@ namespace eval X {
variable find_option_sel ;# Bool: Search only in the seleted text
variable find_option_reg ;# Bool: Consider search string to be a regular expression
variable find_allow_selection ;# Bool: There is some selected text in editor
- variable find_retry_search ;# Bool: Search restarted from begining/end
+ variable find_retry_search ;# Bool: Search restarted from beginning/end
variable find_back_dir ;# Bool: Search backwards (real option)
variable find_history {} ;# List of the last 10 search strings
variable find_next_prev_in_P 0 ;# Bool: Procedure 'find_next_prev' in progress
@@ -121,8 +137,8 @@ namespace eval X {
variable select_directory_var {} ;# Selected directory
## Dialog "New project"
- variable project_new_name ;# Name of the new project
- variable project_new_dir ;# Directory of the new project
+ variable project_new_name {} ;# Name of the new project
+ variable project_new_dir {} ;# Directory of the new project
## Variable common for "New project" and "Edit project"
variable project_new_processor ;# Processor type (e.g. "8051")
@@ -142,7 +158,7 @@ namespace eval X {
variable project_edit_version ;# Project version
variable project_edit_date ;# Project date (last update)
variable project_edit_copyright ;# Copyright information
- variable project_edit_licence ;# Licence information
+ variable project_edit_license ;# License information
variable project_edit_authors ;# Project authors
variable project_edit_description ;# Project description
variable project_edit_clock ;# Default clock rate
@@ -172,19 +188,19 @@ namespace eval X {
variable compilation_success_callback {} ;# String: Indented for HW plugins
variable compilation_fail_callback {} ;# String: Indented for HW plugins
variable compilation_mess_project {} ;# Object: Project related to running compilation
- variable compilation_successfull 1 ;# Bool: Compilation successfull
+ variable compilation_successfull 1 ;# Bool: Compilation successful
variable compilation_in_progress 0 ;# Bool: Compiler engaged
variable compilation_progress 0 ;# Variable for compilation progressbar
variable compiler_pid 0 ;# Int: PID of external compiler if used
variable compilation_start_simulator 0 ;# Bool: Start simulator after successful compilation
variable compile_this_file_only 0 ;# Bool: Compile the current file only
- ## Dialog "Select input/uotput file"
+ ## Dialog "Select input/output file"
variable input_file ;# Input file
variable output_file ;# Output file
variable IO ;# Bool: 1 == choose input file; 0 == choose output file
- ### Dialogs "Hex->Bin; Bin->Hex; Sim->Hex; Sim->Bin; Nomalize Hex"
+ ### Dialogues "Hex->Bin; Bin->Hex; Sim->Hex; Sim->Bin; Nomalize Hex"
# Type of conversion
# 0 == Bin -> Hex
# 1 == Hex -> Bin
@@ -193,15 +209,15 @@ namespace eval X {
variable hex__bin
## XDATA/CODE/ERAM/EEPROM/UNI memory hexadecimal editors
- variable opended_code_mem_windows {} ;# List of project object with opened CODE memory hex editor
+ variable opened_code_mem_windows {} ;# List of project object with opened CODE memory hex editor
variable code_mem_window_objects {} ;# List of CODE memory hex editor objects
- variable opended_xdata_mem_windows {} ;# List of project object with opened XDATA memory hex editor
+ variable opened_xdata_mem_windows {} ;# List of project object with opened XDATA memory hex editor
variable xdata_mem_window_objects {} ;# List of XDATA memory hex editor objects
- variable opended_eram_windows {} ;# List of project object with opened ERAM hex editor
+ variable opened_eram_windows {} ;# List of project object with opened ERAM hex editor
variable eram_window_objects {} ;# List of ERAM hex editor objects
- variable opended_eeprom_mem_windows {} ;# List of project object with opened data EEPROM hex editor
+ variable opened_eeprom_mem_windows {} ;# List of project object with opened data EEPROM hex editor
variable eeprom_mem_window_objects {} ;# List of data EEPROM hex editor objects
- variable opended_eeprom_wr_bf_windows {} ;# List of project objects with opened data EEPROM write buffer editor
+ variable opened_eeprom_wr_bf_windows {} ;# List of project objects with opened data EEPROM write buffer editor
variable eeprom_wr_bf_window_objects {} ;# List of data EEPROM write buffer hex editor objects
variable eeprom_wr_buf_counter 0 ;# Counter of EEPROM write buffer hex editor objects
variable saving_progress 0 ;# Variable for progressbars representing saving progress
@@ -226,6 +242,7 @@ namespace eval X {
*.adf *.adb *.rel *.cdb *.mem *.lnk *.sym
*.omf *.rst *.hashes *bak
}
+ variable cleanup_files {} ;# List: Files marked for potential removal
## Dialog "Change letter case"
variable change_letter_case_options ;# Options (which fields should be adjusted)
@@ -247,7 +264,7 @@ namespace eval X {
variable PROJECTDETAILSWIN ;# ID of project details window
variable projectdetails_last_project {} ;# Project object of the last project details window
- ## Cutom commands related variables
+ ## Custom commands related variables
variable custom_cmd_dialog_index 0 ;# Index of results dialog (to keep win IDs unique)
variable custom_command_cmd ;# Array of custom commands (shell scripts)
variable custom_command_options ;# Array of Lists of custom command options
@@ -259,11 +276,23 @@ namespace eval X {
## Initialize custom commands related variables
# Shell scripts
set custom_command_cmd(0) [mc "echo \"This is a custom command\"\necho \"\tYou can configure it in Main menu->Configure->Edit user commands.\"\necho \"\tCustom commands are intended for running external programs from this IDE (e.g. program uploaders)\""]
- append custom_command_cmd(0) "\n\necho \"\nThis is a custom command\"\necho \"\tYou can configure it in Main menu->Configure->Edit user commands.\"\necho \"\tCustom commands are intended for running external programs from this IDE (e.g. program uploaders)\""
+
+ append custom_command_cmd(0) "\n\n"
+ append custom_command_cmd(0) "echo \"\"\n"
+ append custom_command_cmd(0) "echo \"%%URIS == \\\"%URIS\\\"\"\n"
+ append custom_command_cmd(0) "echo \"%%URI == \\\"%URI\\\"\"\n"
+ append custom_command_cmd(0) "echo \"%%directory == \\\"%directory\\\"\"\n"
+ append custom_command_cmd(0) "echo \"%%filename == \\\"%filename\\\"\"\n"
+ append custom_command_cmd(0) "echo \"%%basename == \\\"%basename\\\"\"\n"
+ append custom_command_cmd(0) "echo \"%%mainfile == \\\"%mainfile\\\"\"\n"
+ append custom_command_cmd(0) "echo \"%%line == \\\"%line\\\"\"\n"
+ append custom_command_cmd(0) "echo \"%%column == \\\"%column\\\"\"\n"
+ append custom_command_cmd(0) "echo \"%%selection == \\\"%selection\\\"\"\n"
+
set custom_command_cmd(1) $custom_command_cmd(0)
set custom_command_cmd(2) $custom_command_cmd(0)
# Command options
- set custom_command_options(0) {0 1 0}
+ set custom_command_options(0) {0 1 0 0}
set custom_command_options(1) $custom_command_options(0)
set custom_command_options(2) $custom_command_options(0)
# Command descritpions
@@ -321,7 +350,7 @@ namespace eval X {
"Compile this file"}
}
}
- # Menu bar items which are not avaliable when editor is in read only mode
+ # Menu bar items which are not available when editor is in read only mode
variable mainmenu_editor_readonly {
{ ".mainMenu.edit"
{ "Undo" "Redo" "Cut" "Paste" "Replace"
@@ -330,13 +359,13 @@ namespace eval X {
{ "Auto indent" "Change letter case" "Document current function"}
}
}
- # Menu bar items which are not avaliable only for C language
+ # Menu bar items which are not available only for C language
variable mainmenu_editor_c_only {
{ ".mainMenu.tools"
{ "Document current function"}
}
}
- # Menu bar items which are not avaliable when external embedded editor is used
+ # Menu bar items which are not available when external embedded editor is used
variable mainmenu_editor_external_na {
{.mainMenu.tools {
{Encoding} {End of line}
@@ -365,40 +394,52 @@ namespace eval X {
# Toolbar buttons which require opened project
variable toolbar_project_dependent_buttons {
- new open save save_as save_all close close_all undo redo cut
- copy paste find findnext findprev replace goto reload clear
- proj_save proj_edit proj_close proj_close_imm show_code_mem
- show_ext_mem start_sim reset step stepover animate run
- assemble disasm reformat_code toHTML toLaTeX cleanup custom0
- custom1 custom2 change_case forward back clear_hg intrmon
- hibernate resume stepback find_sim_cur line2addr show_exp_mem
- sfrmap show_eeprom show_eem_wr_b stopwatch bitmap
-
- ledpanel leddisplay ledmatrix mleddisplay simplekeypad
- matrixkeypad vhw_open vhw_load vhw_save vhw_saveas
- vhw_remove_all
-
- stack
+ new open save save_as
+ save_all close close_all undo
+ redo cut copy paste
+ find findnext findprev replace
+ goto reload clear proj_save
+ proj_edit proj_close proj_close_imm show_code_mem
+ show_ext_mem start_sim reset step
+ stepover animate run assemble
+ disasm reformat_code toHTML toLaTeX
+ cleanup custom0 custom1 custom2
+ change_case forward back clear_hg
+ intrmon hibernate resume stepback
+ find_sim_cur line2addr show_exp_mem sfrmap
+ show_eeprom show_eem_wr_b stopwatch bitmap
+ uartmon
+
+ ledpanel leddisplay ledmatrix mleddisplay
+ simplekeypad matrixkeypad vhw_open vhw_load
+ vhw_save vhw_saveas vhw_remove_all hd44780
+ ds1620 vuterm fintr
+
+ stack d52
}
# Toolbar buttons which require ENGAGED simulator
variable toolbar_simulator_engaged {
- reset step stepover animate run clear_hg
- find_sim_cur line2addr stepback hibernate resume
+ reset step stepover animate
+ run clear_hg find_sim_cur line2addr
+ stepback hibernate resume
}
# Toolbar buttons which require DISENGAGED simulator
variable toolbar_simulator_disengaged {
- new open close close_all undo redo cut
- copy paste replace reload assemble start_sim0
- disasm reformat_code change_case assemble0
+ new open close close_all
+ undo redo cut copy
+ paste replace reload assemble
+ start_sim0 disasm reformat_code change_case
+ assemble0 d52
}
- # Toolbar items which are not avaliable when editor is in read only mode
+ # Toolbar items which are not available when editor is in read only mode
variable toolbar_editor_readonly {
- undo redo cut paste replace reformat_code change_case
+ undo redo cut paste
+ replace reformat_code change_case
}
- # Toolbar items which are not avaliable only for C language
+ # Toolbar items which are not available only for C language
variable toolbar_editor_c_only {
}
- # Toolbar items which are not avaliable when external embedded editor is used
+ # Toolbar items which are not available when external embedded editor is used
variable toolbar_editor_external_na {
save save_as undo redo cut
copy paste find findnext findprev
@@ -439,7 +480,7 @@ namespace eval X {
{command "Move to end" "" 9
{__project_move_to_end}
"2rightarrow" "Move this tab to right the end of the tab bar"}
- } $projectmenu 0 "::X::" 0 {}
+ } $projectmenu 0 "::X::" 0 {} [namespace current]
}
## Switch current project
@@ -471,9 +512,10 @@ namespace eval X {
adjust_title
$actualProject adjust_compiler_settings
+ $actualProject switchfile
}
- ## Enable / Disable menu and toolbar item acording to current state of current project
+ ## Enable / Disable menu and toolbar item according to current state of current project
# @return void
proc disaena_menu_toolbar_for_current_project {} {
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
@@ -490,13 +532,16 @@ namespace eval X {
# Enable / Disabled stepback buttons
stepback_button_set_ena [$actualProject simulator_get_SBS_len]
- } {
+ } else {
Lock_simulator_menu
adjust_mainmenu_and_toolbar_to_editor \
${::editor_RO_MODE} \
[expr {1 == [$actualProject editor_procedure {} get_language {}]}]
}
+ # set MCU name in statusbar, kdb
+ .statusbarMCU configure -text [$actualProject cget -P_option_mcu_type]
+
## Disable/Enable menu+toolbar entries related to simulator controls which depends on current MCU
disena_simulator_menu $actualProject
}
@@ -546,8 +591,9 @@ namespace eval X {
if {[lindex $simulator_enabled $actualProjectIdx] == 1} {
if {$message} {
- tk_messageBox \
- -title [mc "Unable to compile"] \
+ tk_messageBox \
+ -parent . \
+ -title [mc "Unable to comply"] \
-icon info \
-type ok \
-message [mc "Simulator is engaged, shutdown the simulator first."]
@@ -586,9 +632,9 @@ namespace eval X {
}
## Open file
- # @parm Bool = 0 - 1 == New file (for embedded external editor); 0 == Open an existing file
+ # @parm Bool p_open_f_external_editor=0 - 1 == New file (for embedded external editor); 0 == Open an existing file
# @return void
- proc __open args {
+ proc __open {{p_open_f_external_editor 0}} {
variable actualProject ;# Object: Current project
variable actualProjectIdx ;# Index of the current project in $openedProjects
variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
@@ -603,13 +649,11 @@ namespace eval X {
set critical_procedure_in_progress 1
# Parse input arguments
- set open_f_external_editor [lindex $args 0]
- if {$open_f_external_editor != 1} {
- set title [mc "Open file - MCU 8051 IDE"]
- set open_f_external_editor 0
- } {
+ set open_f_external_editor $p_open_f_external_editor
+ if {$open_f_external_editor} {
set title [mc "New file - MCU 8051 IDE"]
- set open_f_external_editor 1
+ } else {
+ set title [mc "Open file - MCU 8051 IDE"]
}
# Invoke the file selection dialog
@@ -640,11 +684,11 @@ namespace eval X {
foreach filename [X::fsd get] {
if {!$::MICROSOFT_WINDOWS} { ;# POSIX way
if {![regexp "^(~|/)" $filename]} {
- set filename "[${X::actualProject} cget -ProjectDir]/$filename"
+ set filename "[${::X::actualProject} cget -ProjectDir]/$filename"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $filename]} {
- set filename [file join [${X::actualProject} cget -ProjectDir] $filename]
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $filename]} {
+ set filename [file join [${::X::actualProject} cget -ProjectDir] $filename]
}
}
set filename [file normalize $filename]
@@ -661,32 +705,34 @@ namespace eval X {
# Open the specified file
if {${::X::open_f_external_editor} || [file exists $filename]} {
- if {[${X::actualProject} openfile $filename 1 \
+ if {[${::X::actualProject} openfile $filename 1 \
[X::fsd get_window_name] def def 0 0 {}] != {}
- } {
- ${X::actualProject} switch_to_last
- update idle
- ${X::actualProject} editor_procedure {} parseAll {}
+ } then {
+ ${::X::actualProject} switch_to_last
+ update idletasks
+ ${::X::actualProject} editor_procedure {} parseAll {}
# Make LST read only
if {[file extension $filename] == {.lst}} {
set ::editor_RO_MODE 1
- ${X::actualProject} switch_editor_RO_MODE
+ ${::X::actualProject} switch_editor_RO_MODE
}
::X::recent_files_add 1 $filename
}
- } {
- ${X::actualProject} editor_new
- ${X::actualProject} save_as $filename
+
+ } else {
if {!${::Editor::editor_to_use}} {
tk_messageBox \
-type ok \
-icon warning \
- -parent [::X::fsd get_window_name] \
+ -parent . \
-title [mc "File not found - MCU 8051 IDE"] \
-message [mc "The selected file do not exist:\n%s" $filename]
}
+
+ ${::X::actualProject} editor_new
+ ${::X::actualProject} save_as $filename 1
}
}
}
@@ -726,6 +772,11 @@ namespace eval X {
if {$project_menu_locked} {return}
+ # Won't save read-only file
+ if {[$actualProject editor_procedure {} cget {-ro_mode}]} {
+ return
+ }
+
# This function is critical
if {$critical_procedure_in_progress} {return}
set critical_procedure_in_progress 1
@@ -747,17 +798,17 @@ namespace eval X {
-initialfile [lindex $filename 1] \
-title [mc "Save file - MCU 8051 IDE"] \
-directory $directory \
- -defaultmask $defaultmask -multiple 0 -filetypes {
- {{Assembly language} {*.asm} }
- {{C source} {*.c} }
- {{C header} {*.h} }
- {{All files} {*} }
- }
+ -defaultmask $defaultmask -multiple 0 -filetypes [list \
+ [list [mc "Assembly language"] {*.asm}] \
+ [list [mc "C source"] {*.c}] \
+ [list [mc "C header"] {*.h}] \
+ [list [mc "All files"] {*}] \
+ ]
# Save file after press of OK button
fsd setokcmd {
set filename [X::fsd get]
- ${X::actualProject} save_as $filename
+ ${::X::actualProject} save_as $filename
}
# activate the dialog
@@ -779,7 +830,7 @@ namespace eval X {
if {$critical_procedure_in_progress} {return}
set critical_procedure_in_progress 1
- # Save all opended files
+ # Save all opened files
$actualProject editor_save_all
set critical_procedure_in_progress 0
@@ -805,7 +856,7 @@ namespace eval X {
set critical_procedure_in_progress 0
}
- ## Close all opended files
+ ## Close all opened files
# @return void
proc __close_all {} {
variable actualProject ;# Object: Current project
@@ -934,7 +985,7 @@ namespace eval X {
# @return void
proc __find {} {
variable actualProject ;# Object: Current project
- variable find_String ;# Search string
+ variable find_String {} ;# Search string
variable find_option_CS ;# Bool: Case sensitive
variable find_option_back ;# Bool: Search backwards (checkbox)
variable find_option_cur ;# Book: Search from cursor
@@ -956,7 +1007,7 @@ namespace eval X {
}
# Create a new toplevel window for the dialog
- set win [toplevel .find -class {Find dialog} -bg {#EEEEEE}]
+ set win [toplevel .find -class {Find dialog} -bg ${::COMMON_BG_COLOR}]
# String to search for
label $win.findLabel -compound left -image ::ICONS::16::find -text [mc "Text to find:"]
@@ -982,7 +1033,7 @@ namespace eval X {
# Determinate wheather there is some selected text
if {[$actualProject editor_procedure {} getselection {}] == {}} {
set find_allow_selection 0
- } {
+ } else {
set find_allow_selection 1
}
@@ -992,18 +1043,18 @@ namespace eval X {
foreach opt { CS back cur sel reg } \
txt { "Case sensitive" "Backwards" "From cursor" "Selected text" "Regular expr." } \
helptext {
- {Case sensitive search}
- {Search backwards from the specified location}
- {Start search from cursor instead of begining}
- {Search within selected text only}
- {Use search string as regular expression}
+ "Case sensitive search"
+ "Search backwards from the specified location"
+ "Start search from cursor instead of beginning"
+ "Search within selected text only"
+ "Use search string as regular expression"
} \
{
# Disable/Enable "in selection" checkbox
if {$opt == {sel} && !$find_allow_selection} {
set state disabled
set X::find_option_sel 0
- } {
+ } else {
set state normal
}
@@ -1013,7 +1064,7 @@ namespace eval X {
-variable X::find_option_$opt \
-state $state \
] -column $col -row $row -sticky wns
- DynamicHelp::add $optionsFrame.option_$opt -text $helptext
+ DynamicHelp::add $optionsFrame.option_$opt -text [mc $helptext]
incr col
if {$col == 2} {
@@ -1084,7 +1135,7 @@ namespace eval X {
variable find_option_cur ;# Book: Search from cursor
variable find_option_sel ;# Bool: Search only in the seleted text
variable find_option_reg ;# Bool: Consider search string to be a regular expression
- variable find_retry_search ;# Bool: Search restarted from begining/end
+ variable find_retry_search ;# Bool: Search restarted from beginning/end
variable find_back_dir ;# Bool: Search backwards (real option)
variable find_history ;# List of the last 10 search strings
@@ -1113,7 +1164,7 @@ namespace eval X {
set find_option_notCS [expr {!$find_option_CS}]
if {!$find_allow_selection} {
set option_sel 0
- } {
+ } else {
set option_sel $find_option_sel
}
@@ -1147,10 +1198,10 @@ namespace eval X {
}
## Retry search -- auxiliary procedure for '__find'
- # Useful when search cursor reach begining/end of the document
+ # Useful when search cursor reach beginning/end of the document
# @return Bool result
proc retry_search {} {
- variable find_retry_search ;# Bool: Search restarted from begining/end
+ variable find_retry_search ;# Bool: Search restarted from beginning/end
variable find_String ;# Search string
variable find_option_back ;# Bool: Search backwards (checkbox)
variable find_option_cur ;# Book: Search from cursor
@@ -1178,29 +1229,29 @@ namespace eval X {
# Backward search
if {$find_back_dir} {
if {[tk_messageBox \
- -icon question \
- -type yesno \
- -parent . \
- -title [mc "Find - %s" ${::APPNAME}] \
- -message [mc "Begining of document reached\n\nContinue from end ?"] \
- ]} {
- set find_next_prev_in_P 0
- set find_backward_index end
- set find_forward_index 1.0
- set find_option_cur 0
- # Retry search
- find_next_prev [expr {!$find_option_back}]
+ -icon question \
+ -type yesno \
+ -parent . \
+ -title [mc "Find - %s" ${::APPNAME}] \
+ -message [mc "Beginning of document reached\n\nContinue from end ?"] \
+ ] == {yes}} then {
+ set find_next_prev_in_P 0
+ set find_backward_index end
+ set find_forward_index 1.0
+ set find_option_cur 0
+ # Retry search
+ find_next_prev [expr {!$find_option_back}]
}
# Forward search
- } {
+ } else {
if {[tk_messageBox \
-icon question \
-type yesno \
-parent . \
-title [mc "Find - %s" ${::APPNAME}] \
- -message [mc "End of document reached\n\nContinue from begining ?"] \
- ]} {
+ -message [mc "End of document reached\n\nContinue from beginning ?"] \
+ ] == {yes}} then {
set find_next_prev_in_P 0
set find_backward_index end
set find_forward_index 1.0
@@ -1215,7 +1266,7 @@ namespace eval X {
set find_retry_search 0
}
- ## Find next occurence of the search string
+ ## Find next occurrence of the search string
# @return void
proc __find_next {} {
variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
@@ -1228,7 +1279,7 @@ namespace eval X {
find_next_prev 0
}
- ## Find previous occurence of the search string
+ ## Find previous occurrence of the search string
# @return void
proc __find_prev {} {
variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
@@ -1241,7 +1292,7 @@ namespace eval X {
find_next_prev 1
}
- ## Find next/previous occurence of the search string
+ ## Find next/previous occurrence of the search string
# @parm Bool back_dir - Search backwards
# @return void
proc find_next_prev {back_dir} {
@@ -1254,11 +1305,11 @@ namespace eval X {
variable find_option_cur ;# Book: Search from cursor
variable find_option_sel ;# Bool: Search only in the seleted text
variable find_option_reg ;# Bool: Consider search string to be a regular expression
- variable find_retry_search ;# Bool: Search restarted from begining/end
+ variable find_retry_search ;# Bool: Search restarted from beginning/end
variable find_back_dir ;# Bool: Search backwards (real option)
variable find_next_prev_in_P ;# Bool: Procedure 'find_next_prev' in progress
- # This function is not avaliable for exeternal embedded editors
+ # This function is not available for exeternal embedded editors
if {${::Editor::editor_to_use}} {return}
# This function cannot run multithreaded
@@ -1282,16 +1333,16 @@ namespace eval X {
if {[$editor compare $find_forward_index == insert]} {
$editor mark set insert $find_backward_index
}
- } {
+ } else {
if {[$editor compare $find_backward_index == insert]} {
$editor mark set insert $find_forward_index
}
}
set index insert
- } {
+ } else {
if {$find_back_dir} {
set index $find_backward_index
- } {
+ } else {
set index $find_forward_index
}
}
@@ -1318,8 +1369,8 @@ namespace eval X {
# @return void
proc __replace {} {
variable actualProject ;# Object: Current project
- variable replace_String ;# String to replace
- variable replace_Replacement ;# Replacement for the search string
+ variable replace_String {} ;# String to replace
+ variable replace_Replacement {} ;# Replacement for the search string
variable replace_option_CS ;# Bool: Case sensitive
variable replace_option_back ;# Bool: Search backwards (checkbox)
variable replace_option_cur ;# Book: Search from cursor
@@ -1342,7 +1393,7 @@ namespace eval X {
}
# Create a new toplevel window for the dialog
- set win [toplevel .replace -class {Replace dialog} -bg {#EEEEEE}]
+ set win [toplevel .replace -class {Replace dialog} -bg ${::COMMON_BG_COLOR}]
# Create labelframe "String to find"
label $win.findLabel -compound left -image ::ICONS::16::find -text [mc "Text to find: "]
@@ -1373,7 +1424,7 @@ namespace eval X {
DynamicHelp::add $replaceFrame.entry -text [mc "Replacement for search string"]
# Create and pack options checkboxes labelframe
- label $win.optionsLabel -compound left -image ::ICONS::16::configure -text "Options"
+ label $win.optionsLabel -compound left -image ::ICONS::16::configure -text [mc "Options"]
set optionsFrame [ttk::labelframe $win.optionsFrame \
-labelwidget $win.optionsLabel \
]
@@ -1385,19 +1436,20 @@ namespace eval X {
foreach opt { CS back cur reg prompt} \
txt { "Case sensitive" "Backwards" "From cursor" "Regular expr." "Prompt on replace"} \
helptext {
- {Case sensitive search}
- {Search backwards from the specified location}
- {Start search from cursor instead of begining}
- {Use search string as regular expression}
- {Prompt on replace}
- } {
+ "Case sensitive search"
+ "Search backwards from the specified location"
+ "Start search from cursor instead of beginning"
+ "Use search string as regular expression"
+ "Prompt on replace"
+ } \
+ {
# Create checkbutton
grid [checkbutton $optionsFrame.option_$opt \
-text [mc $txt] \
-variable X::replace_option_$opt \
] -column $col -row $row -sticky wns
- DynamicHelp::add $optionsFrame.option_$opt -text $helptext
+ DynamicHelp::add $optionsFrame.option_$opt -text [mc $helptext]
incr col
if {$col == 2} {
@@ -1413,13 +1465,13 @@ namespace eval X {
-compound left \
-image ::ICONS::16::ok \
-command {X::replace_REPLACE} \
- ] -side left
+ ] -side left -padx 2
pack [ttk::button $buttonFrame.cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
-command {X::replace_CANCEL} \
- ] -side left
+ ] -side left -padx 2
pack $buttonFrame -pady 5
# Events binding (Enter == Replace; Escape == Cancel)
@@ -1492,36 +1544,36 @@ namespace eval X {
$replace_option_reg $replace_option_notCS \
$replace_String $replace_Replacement \
$replace_option_prompt X::replace_prompt]
- ]} {
- if {!$replace_option_cur} {return}
+ ]} then {
+ if {!$replace_option_cur} {return}
- set replace_option_cur_tmp $replace_option_cur
- set replace_option_cur 0
+ set replace_option_cur_tmp $replace_option_cur
+ set replace_option_cur 0
- # Retry search
- if {$replace_option_back} {
- if {[tk_messageBox \
- -icon question \
- -type yesno \
- -parent . \
- -title [mc "Replace - %s" ${::APPNAME}] \
- -message [mc "Begining of document reached\n\nContinue from end ?"] \
- ]} {
- replace_REPLACE
- }
- } {
- if {[tk_messageBox \
- -icon question \
- -type yesno \
- -parent . \
- -title [mc "Replace - %s" ${::APPNAME}] \
- -message [mc "End of document reached\n\nContinue from begining ?"] \
- ]} {
- replace_REPLACE
- }
+ # Retry search
+ if {$replace_option_back} {
+ if {[tk_messageBox \
+ -icon question \
+ -type yesno \
+ -parent . \
+ -title [mc "Replace - %s" ${::APPNAME}] \
+ -message [mc "Beginning of document reached\n\nContinue from end ?"] \
+ ]} then {
+ replace_REPLACE
}
+ } else {
+ if {[tk_messageBox \
+ -icon question \
+ -type yesno \
+ -parent . \
+ -title [mc "Replace - %s" ${::APPNAME}] \
+ -message [mc "End of document reached\n\nContinue from beginning ?"] \
+ ]} then {
+ replace_REPLACE
+ }
+ }
- set replace_option_cur $replace_option_cur_tmp
+ set replace_option_cur $replace_option_cur_tmp
}
}
@@ -1543,11 +1595,11 @@ namespace eval X {
if {$replace_prompt_opened} {
replace_prompt_DESTROY
# Open the dialog
- } {
+ } else {
set replace_prompt_opened 1
# Create dialog window and restore previous geometry
- toplevel .replace_prompt -class {Replace prompt dialog} -bg {#EEEEEE}
+ toplevel .replace_prompt -class {Replace prompt dialog} -bg ${::COMMON_BG_COLOR}
if {[info exists replace_prompt_geometry]} {
wm geometry .replace_prompt $replace_prompt_geometry
}
@@ -1558,7 +1610,7 @@ namespace eval X {
-image ::ICONS::32::help \
] -side left -padx 10
pack [label .replace_prompt.topFrame.label \
- -text [mc "Found an occurence of your search term.\nWhat do you want to do ?"] \
+ -text [mc "Found an occurrence of your search term.\nWhat do you want to do ?"] \
] -fill both -expand 1 -side right
# Create separator
@@ -1685,7 +1737,7 @@ namespace eval X {
# Create dialog window
set goto_opened 1
- set win [toplevel .goto -class {Goto dialog} -bg {#EEEEEE}]
+ set win [toplevel .goto -class {Go to dialog} -bg ${::COMMON_BG_COLOR}]
# Create window label frame
label $win.header -text [mc "Go to line"] -image ::ICONS::16::goto -compound left
@@ -1706,13 +1758,12 @@ namespace eval X {
-text [mc "Graphical representation of line where to go"]
# Create spinbox widget
- pack [spinbox $topFrame.spinbox \
+ pack [ttk::spinbox $topFrame.spinbox \
-from 1 -to $editor_lines \
- -textvariable X::goto \
+ -textvariable ::X::goto \
-validate key \
- -validatecommand {X::goto_validate %P} \
+ -validatecommand {::X::goto_validate %P}\
-width 6 \
- -command "$topFrame.spinbox selection range 0 end" \
] -side left
DynamicHelp::add $topFrame.spinbox -text [mc "Line where to go"]
@@ -1723,14 +1774,14 @@ namespace eval X {
-compound left \
-image ::ICONS::16::ok \
-command {X::goto_OK} \
- ] -side left
+ ] -side left -padx 2
pack [ttk::button $buttonFrame.cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
-command {X::goto_CANCEL} \
- ] -side left
- pack $buttonFrame -pady 5
+ ] -side left -padx 2
+ pack $buttonFrame -pady 5 -padx 5
# Events binding (Enter == Ok, Esc == CANCEL)
bind $win <KeyRelease-Return> {X::goto_OK; break}
@@ -1743,7 +1794,7 @@ namespace eval X {
# Nessesary window manager options -- modal window
wm iconphoto $win ::ICONS::16::goto
- wm title $win [mc "Goto line - MCU 8051 IDE"]
+ wm title $win [mc "Go to line - MCU 8051 IDE"]
wm minsize $win 200 100
wm protocol $win WM_DELETE_WINDOW {
X::goto_CANCEL
@@ -1762,7 +1813,7 @@ namespace eval X {
if {$value > $editor_lines} {
return 0
- } {
+ } else {
return 1
}
}
@@ -1843,7 +1894,7 @@ namespace eval X {
# Determinate initial directory
if {$project_menu_locked} {
set directory {~}
- } {
+ } else {
set directory [$actualProject cget -projectPath]
}
@@ -1867,10 +1918,10 @@ namespace eval X {
## Invoke dialog "New Project"
# @return void
proc __proj_new {} {
- variable avaliable_processors ;# List of supported processors
+ variable available_processors ;# List of supported processors
variable actualProject ;# Object: Current project
- variable project_new_name ;# Name of the new project
- variable project_new_dir ;# Directory of the new project
+ variable project_new_name {} ;# Name of the new project
+ variable project_new_dir {} ;# Directory of the new project
variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
variable project_new_processor {AT89S52};# Processor type (e.g. "AT89C2051")
variable project_new_xdata_ena 0 ;# Bool: XDATA memory connected
@@ -1888,7 +1939,7 @@ namespace eval X {
if {$critical_procedure_in_progress} {return}
# Create dialog window
- set win [toplevel .project_new -class {New project} -bg {#EEEEEE}]
+ set win [toplevel .project_new -class {New project} -bg ${::COMMON_BG_COLOR}]
# Create window header (text and some icon)
set header [frame $win.header]
@@ -1946,14 +1997,14 @@ namespace eval X {
set proc_frame_top [frame $proc_frame.top]
set proc_frame_middle [frame $proc_frame.middle]
set proc_frame_middle_left [ttk::labelframe $proc_frame_middle.middle \
- -padding 5 -text [mc "XDATA"]]
+ -padding 5 -text [mc "External RAM (XDATA)"]]
set proc_frame_middle_right [ttk::labelframe $proc_frame_middle.right \
- -padding 5 -text [mc "XCODE"]]
+ -padding 5 -text [mc "External ROM/FLASH (XCODE)"]]
# Create components of top frame (Type: <ComboBox> <Button>)
pack [label $proc_frame_top.lbl -text [mc "Type:"]] -side left
pack [ttk::combobox $proc_frame_top.combo \
- -values $avaliable_processors \
+ -values $available_processors \
-state readonly \
-textvariable ::X::project_new_processor \
] -side left -fill x -fill x
@@ -1981,7 +2032,7 @@ namespace eval X {
set project_new_xd_scl [ttk::scale $proc_frame_left_btm.scale \
-orient horizontal \
-variable ::X::project_new_xdata \
- -from 0 -to 0xFFFF \
+ -from 0 -to 0x10000 \
-command "
set ::X::project_new_xdata \[expr {int(\${::X::project_new_xdata})}\]
$proc_frame_left_btm.spinbox selection range 0 end
@@ -1990,12 +2041,11 @@ namespace eval X {
DynamicHelp::add $project_new_xd_scl \
-text [mc "Amount of external data memory"]
pack $project_new_xd_scl -fill x -side left -expand 1 -padx 2
- set project_new_xd_spb [spinbox $proc_frame_left_btm.spinbox \
- -textvariable ::X::project_new_xdata \
- -width 5 -from 0 -to 0xFFFF \
- -bg white -validate all \
- -vcmd {::SelectMCU::validate_xdata %P} \
- -command "$proc_frame_left_btm.spinbox selection range 0 end ;#" \
+ set project_new_xd_spb [ttk::spinbox $proc_frame_left_btm.spinbox \
+ -textvariable ::X::project_new_xdata \
+ -width 5 -from 0 -to 0x10000 \
+ -validate all \
+ -validatecommand {::SelectMCU::validate_xdata %P} \
]
DynamicHelp::add $project_new_xd_spb \
-text [mc "Amount of external data memory"]
@@ -2015,7 +2065,7 @@ namespace eval X {
set project_new_xc_scl [ttk::scale $proc_frame_right_btm.scale \
-orient horizontal \
-variable ::X::project_new_xcode \
- -from 0 -to 0xFFFF \
+ -from 0 -to 0x10000 \
-command "
set ::X::project_new_xcode \[expr {int(\${::X::project_new_xcode})}\]
$proc_frame_right_btm.spinbox selection range 0 end
@@ -2024,12 +2074,11 @@ namespace eval X {
DynamicHelp::add $project_new_xc_scl \
-text [mc "Amount of total program memory minus internal program memory"]
pack $project_new_xc_scl -fill x -side left -expand 1 -padx 2
- set project_new_xc_spb [spinbox $proc_frame_right_btm.spinbox \
- -textvariable ::X::project_new_xcode \
- -width 5 -from 0 -to 0xFFFF \
- -bg white -validate all \
- -vcmd {::X::proj_new_validate_xcode %P} \
- -command "$proc_frame_right_btm.spinbox selection range 0 end ;#" \
+ set project_new_xc_spb [ttk::spinbox $proc_frame_right_btm.spinbox \
+ -textvariable ::X::project_new_xcode \
+ -width 5 -from 0 -to 0x10000 \
+ -validate all \
+ -validatecommand {::X::proj_new_validate_xcode %P} \
]
DynamicHelp::add $project_new_xc_spb \
-text [mc "Amount of total program memory minus internal program memory"]
@@ -2049,15 +2098,17 @@ namespace eval X {
-compound left \
-image ::ICONS::16::ok \
-command {X::project_new_OK} \
- ] -side left -padx 5
+ ] -side left -padx 2
pack [ttk::button $buttonFrame.cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
-command {X::project_new_CANCEL} \
- ] -side left -padx 5
+ ] -side left -padx 2
pack $buttonFrame -pady 5
+ focus -force $name.entry
+
# Adjust XDATA & XCODE controls
proj_new_mcu_changed
@@ -2082,7 +2133,7 @@ namespace eval X {
## Binding for processor type combobox -modifycmd
# Usage: ComboBox -modifycmd ::X::proj_new_mcu_changed
# This function gets informations about selected processor
- # and adjusts XCODE & XDATA memory constrols.
+ # and adjusts XCODE & XDATA memory controls.
# @return void
proc proj_new_mcu_changed {} {
variable project_new_processor ;# Processor type (e.g. "8051")
@@ -2097,7 +2148,7 @@ namespace eval X {
# Get processor details
set details [::SelectMCU::get_processor_details $project_new_processor]
if {$details == {}} {
- puts stderr "Unknown error occured in ::X::proj_new_mcu_changed !\nPlease check your installation."
+ puts stderr "Unknown error occurred in ::X::proj_new_mcu_changed !\nPlease check your installation."
return
}
@@ -2105,7 +2156,7 @@ namespace eval X {
if {[lindex $details 0] != {yes}} {
set project_new_xdata_ena 0
$project_new_xd_chb configure -state disabled
- } {
+ } else {
$project_new_xd_chb configure -state normal
}
@@ -2113,12 +2164,12 @@ namespace eval X {
if {[lindex $details 1] != {yes}} {
set project_new_xcode_ena 0
$project_new_xc_chb configure -state disabled
- } {
+ } else {
$project_new_xc_chb configure -state normal
}
# Adjust XCODE memory scale & spinbox maximum value
- set project_new_max_xcode [expr {0xFFFF - ([lindex $details 2] * 1024)}]
+ set project_new_max_xcode [expr {0x10000 - ([lindex $details 2] * 1024)}]
$project_new_xc_scl configure -to $project_new_max_xcode
$project_new_xc_spb configure -to $project_new_max_xcode
@@ -2127,7 +2178,7 @@ namespace eval X {
proj_new_xcode_disena
}
- ## Enable/Disable XDATA scale & spinbox acording to $project_new_xdata_ena
+ ## Enable/Disable XDATA scale & spinbox according to $project_new_xdata_ena
# @return void
proc proj_new_xdata_disena {} {
variable project_new_xd_scl ;# Widget: XDATA scale
@@ -2139,13 +2190,13 @@ namespace eval X {
$project_new_xd_scl state !disabled
$project_new_xd_spb configure -state normal
# Disable
- } {
+ } else {
$project_new_xd_scl state disabled
$project_new_xd_spb configure -state disabled
}
}
- ## Enable/Disable XCODE scale & spinbox acording to $project_new_xcode_ena
+ ## Enable/Disable XCODE scale & spinbox according to $project_new_xcode_ena
# @return void
proc proj_new_xcode_disena {} {
variable project_new_xc_scl ;# Widget: XCODE scale
@@ -2155,12 +2206,10 @@ namespace eval X {
# Enable
if {$project_new_xcode_ena} {
$project_new_xc_scl state !disabled
-# $project_new_xc_scl configure -troughcolor {#FFFFFF}
$project_new_xc_spb configure -state normal
# Disable
- } {
+ } else {
$project_new_xc_scl state disabled
-# $project_new_xc_scl configure -troughcolor {#AAAAAA}
$project_new_xc_spb configure -state disabled
}
}
@@ -2195,13 +2244,13 @@ namespace eval X {
# Determinate initial XDATA memory for the dialog
if {$project_new_xdata_ena} {
set xdata $project_new_xdata
- } {
+ } else {
set xdata 0
}
# Determinate initial XCODE memory for the dialog
if {$project_new_xcode_ena} {
set xcode $project_new_xcode
- } {
+ } else {
set xcode 0
}
@@ -2214,20 +2263,21 @@ namespace eval X {
# Process results
set project_new_processor [lindex $result 0]
set project_new_xdata [lindex $result 1]
- set project_new_xcoda [lindex $result 2]
- proj_new_mcu_changed
+ set project_new_xcode [lindex $result 2]
# Adjust XCODE & XDATA checkbuttons
if {$project_new_xdata} {
set project_new_xdata_ena 1
- } {
+ } else {
set project_new_xdata_ena 0
}
if {$project_new_xcode} {
set project_new_xcode_ena 1
- } {
+ } else {
set project_new_xcode_ena 0
}
+
+ proj_new_mcu_changed
}
## Cancel dialog "Create new project" -- auxiliary procedure for '__proj_new'
@@ -2264,7 +2314,7 @@ namespace eval X {
tk_messageBox \
-icon warning \
-type ok \
- -title [mc "Ivalid request"] \
+ -title [mc "Invalid request"] \
-message [mc "Both entries in section general must be filled."] \
-parent .project_new
set critical_procedure_in_progress 0
@@ -2301,20 +2351,20 @@ namespace eval X {
set critical_procedure_in_progress 0
return 0
}
- } {
+ } else {
# Check if this the project does not already exist
if {[file exists "$project_new_dir/$project_new_name.mcu8051ide"]} {
# Ask for owerwrite
if {
- ![tk_messageBox \
+ [tk_messageBox \
-icon question \
-type yesno \
-default no \
-parent .project_new \
-title [mc "File already exists - MCU 8051 IDE"] \
-message [mc "Some project with the same name already exists in the specified directory. \nDo you want to overwrite it ?"] \
- ]
- } {
+ ] != {yes}
+ } then {
# (No) -> Cancel
set critical_procedure_in_progress 0
return 0
@@ -2341,6 +2391,33 @@ namespace eval X {
}
set project_new_xdata [expr {int($project_new_xdata)}]
set project_new_xcode [expr {int($project_new_xcode)}]
+
+ ## Format of this list is: {
+ #+ {version date creator_ver} # tag: tk_mcuide_project
+ #+ {authors copyright license} # tag: authors copyright license
+ #+ {type clock xdata xcode} # tag: processor
+ #+ {watches_file scheme main_file auto_sw_enabled} # tag: options
+ #+ {grid_mode magnification drawing_on
+ #+ mark_flags_true_state mark_flags_latched
+ #+ mark_flags_output active_page} # tag: graph
+ #+ {description todo} # tag: descriptin todo
+ #+ {radix angle_unit # tag: calculator
+ #+ display0 display1 display2
+ #+ memory0 memory1 memory2
+ #+ frequency time mode}
+ #+ {other_options} # tag: other_options
+ #+ {compiler_options}
+ #+ {files_count {current_file # tag: files
+ #+ current_file2 pwin_sash pwin_orient}
+ #+ { # tag: file actual_line md5_hash path bookmarks breakpoints
+ #+ name active o_bookmark p_bookmark
+ #+ file_index read_only actual_line md5_hash
+ #+ path bookmarks breakpoints eol
+ #+ enc highlight notes
+ #+ }
+ #+ ...
+ #+ }
+ #+ }
set project_data [list \
[list {} [clock format [clock seconds] -format {%D}] {}]\
[list [file tail [file normalize ~]] {} {}] \
@@ -2360,18 +2437,18 @@ namespace eval X {
[list $calc_radix $calc_angle {} {} {} {} {} {}] \
{} {} \
[list 0 [list {} {} 0 {}]] \
- ]
+ ]
# Create a new project file
if {[catch {
- set prj_file [open "$project_new_dir/$project_new_name.mcu8051ide" w 420]
+ set prj_file [open "$project_new_dir/$project_new_name.mcu8051ide" w 0640]
}]} then {
# Failed
tk_messageBox \
-parent . \
-type ok \
-icon error \
- -message [mc "Unable to write to file:\n\"%s\"" $project_new_dir/$project_new_name.mcu8051ide]
+ -message [mc "Unable to write to file:\n\"%s\"" "$project_new_dir/$project_new_name.mcu8051ide"]
set critical_procedure_in_progress 0
return
}
@@ -2385,12 +2462,13 @@ namespace eval X {
set projectDescriptor [regsub -all -- {\s} $project_new_name {-}]
regsub -all {[\\\/\.\,`\!@#\$%\^&:\;\|\*\"\(\)\[\]\{\}]} $projectDescriptor \
{_} projectDescriptor
+ set projectDescriptor "project_${projectDescriptor}"
if {[lsearch -exact -ascii ${X::openedProjects} $projectDescriptor] != -1} {
append project_new_name {(0)}
append projectDescriptor {_0}
- while 1 {
+ while {1} {
if {[lsearch -exact -ascii ${X::openedProjects} $projectDescriptor] == -1} {break}
regexp {\d+$} $projectDescriptor index
@@ -2425,11 +2503,14 @@ namespace eval X {
}
disaena_menu_toolbar_for_current_project
+ # set MCU name in status bar, kdb
+ .statusbarMCU configure -text $project_new_processor
+
set critical_procedure_in_progress 0
}
## Disable menu items and functions functions which are
- # avaliable only if there is at least one opened project
+ # available only if there is at least one opened project
# @return void
proc Lock_project_menu {} {
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
@@ -2446,7 +2527,7 @@ namespace eval X {
adjust_mm_and_tb_ext_editor
}
- ## Enable menu items and functions functions which are avaliable only if there
+ ## Enable menu items and functions functions which are available only if there
# is at least one opened project and create NoteBook for project tabs
# @return void
proc Unlock_project_menu {} {
@@ -2510,10 +2591,10 @@ namespace eval X {
KIFSD::FSD fsd \
-title [mc "Open project - MCU 8051 IDE"] \
-directory $defaultDirectory \
- -defaultmask 0 -multiple 0 -filetypes {
- {{MCU 8051 IDE project} {*.mcu8051ide} }
- {{All files} {*} }
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "MCU 8051 IDE project"] {*.mcu8051ide} ] \
+ [list [mc "All files"] {*} ] \
+ ]
# Open the selected after press of OK button
fsd setokcmd {
@@ -2526,7 +2607,7 @@ namespace eval X {
-parent . \
-title [mc "Error - MCU 8051 IDE"] \
-message [mc "Unable to load file: %s" $filename]
- } {
+ } else {
${::X::actualProject} editor_procedure {} highlight_visible_area {}
::X::recent_files_add 0 $filename
}
@@ -2540,7 +2621,7 @@ namespace eval X {
}
## Retrieve project related data from object of the current project
- # @parm Bool all_info - All data (include todo list and such)
+ # @parm Bool all_info - All data (include to do list and such)
# @return void
proc Project_retrieve_data_from_application {all_info} {
variable actualProject ;# Object: Current project
@@ -2552,7 +2633,7 @@ namespace eval X {
variable project_edit_version ;# Project version
variable project_edit_date ;# Project date (last update)
variable project_edit_copyright ;# Copyright information
- variable project_edit_licence ;# Licence information
+ variable project_edit_license ;# License information
variable project_edit_authors ;# Project authors
variable project_edit_description ;# Project description
variable project_edit_main_file ;# Project main file
@@ -2572,7 +2653,7 @@ namespace eval X {
set project_edit_date [ $actualProject cget -P_information_date ]
set project_edit_authors [ $actualProject cget -G_information_authors ]
set project_edit_copyright [ $actualProject cget -G_information_copyright ]
- set project_edit_licence [ $actualProject cget -G_information_licence ]
+ set project_edit_license [ $actualProject cget -G_information_license ]
set project_edit_clock [ $actualProject cget -P_option_clock ]
set project_edit_description [ $actualProject cget -project_description ]
set project_new_processor [ $actualProject cget -P_option_mcu_type ]
@@ -2621,7 +2702,7 @@ namespace eval X {
variable project_edit_version ;# Project version
variable project_edit_date ;# Project date (last update)
variable project_edit_copyright ;# Copyright information
- variable project_edit_licence ;# Licence information
+ variable project_edit_license ;# License information
variable project_edit_authors ;# Project authors
variable project_edit_description ;# Project description
variable project_edit_clock ;# Default clock rate
@@ -2644,6 +2725,12 @@ namespace eval X {
if {$project_menu_locked} {return}
+ # Do not attempt to save a project with read only flag set
+ if {[$actualProject cget -S_flag_read_only]} {
+ puts "Read-only project, saving aborted."
+ return
+ }
+
# This is critical procedure
if {$critical_procedure_in_progress} {return}
set critical_procedure_in_progress 1
@@ -2668,7 +2755,7 @@ namespace eval X {
[list \
$project_edit_authors \
[Project::escape_curlies $project_edit_copyright] \
- [Project::escape_curlies $project_edit_licence]] \
+ [Project::escape_curlies $project_edit_license]] \
[list \
$project_new_processor \
$project_edit_clock \
@@ -2702,9 +2789,10 @@ namespace eval X {
# Save project definition file
if {[catch {
- set prj_file [open $filename w 420]
+ set prj_file [open $filename w 0640]
}]} then {
tk_messageBox \
+ -parent . \
-type ok \
-icon error \
-title [mc "IO Error"] \
@@ -2721,15 +2809,16 @@ namespace eval X {
}
## Invoke dialog "Edit project"
+ # @parm Bool choose_MCU_now=0 - Invoke MCU selection dialog right away and inore other config options ...
# @return void
- proc __proj_edit {} {
+ proc __proj_edit {{choose_MCU_now 0}} {
variable actualProject ;# Object: Current project
- variable avaliable_processors ;# List of supported processors
+ variable available_processors ;# List of supported processors
variable project_edit_version ;# Project version
variable project_edit_date ;# Project date (last update)
variable project_edit_copyright ;# Copyright information
- variable project_edit_licence ;# Licence information
+ variable project_edit_license ;# License information
variable project_edit_authors ;# Project authors
variable project_edit_description ;# Project description
variable project_edit_clock ;# Default clock rate
@@ -2760,7 +2849,7 @@ namespace eval X {
Project_retrieve_data_from_application 0
# Create dialog window
- set win [toplevel .project_edit -class {Edit project} -bg {#EEEEEE}]
+ set win [toplevel .project_edit -class {Edit project} -bg ${::COMMON_BG_COLOR}]
# Create main frames (top.left; top.right; bottom)
set top_frame [frame $win.top]
@@ -2768,7 +2857,7 @@ namespace eval X {
set top_left_frame [frame $top_frame.left]
set top_right_frame [frame $top_frame.right]
- ## GENERAL INFORMATION (version, date, authors, copyright, licence)
+ ## GENERAL INFORMATION (version, date, authors, copyright, license)
label $win.lb_general_info_label \
-compound left \
-text [mc "General information"] \
@@ -2826,24 +2915,24 @@ namespace eval X {
] -row 3 -column 2 -sticky we -columnspan 2
DynamicHelp::add $bframe.copyright_entry -text [mc "Copyright information"]
- # licence
- grid [Label $bframe.licence_label \
- -text [mc "Licence"] \
- -helptext [mc "Name of the licence"] \
+ # license
+ grid [Label $bframe.license_label \
+ -text [mc "License"] \
+ -helptext [mc "Name of the license"] \
] -row 4 -column 1 -sticky w
- grid [ttk::entry $bframe.licence_entry \
- -textvariable X::project_edit_licence \
+ grid [ttk::entry $bframe.license_entry \
+ -textvariable X::project_edit_license \
-validate key \
-validatecommand {::X::project_edit_validate %P} \
] -row 4 -column 2 -sticky we -columnspan 2
- DynamicHelp::add $bframe.licence_entry -text [mc "Name of the licence"]
+ DynamicHelp::add $bframe.license_entry -text [mc "Name of the license"]
# authors
set tframe [frame .project_edit.top.left.lb_general_info.tframe]
pack $tframe -fill both -expand 1 -padx 5
- pack [Label $tframe.label \
- -text [mc "Authors:"] \
- -helptext {List of project authors (one per line)} \
+ pack [Label $tframe.label \
+ -text [mc "Authors:"] \
+ -helptext [mc "List of project authors (one per line)"] \
] -anchor w
pack [frame $tframe.frame] -fill both -expand 1
@@ -2869,9 +2958,9 @@ namespace eval X {
set proc_frame_top1 [frame $lb_compiler.top1]
set proc_frame_middle [frame $lb_compiler.middle]
set proc_frame_middle_left [ttk::labelframe $proc_frame_middle.middle \
- -padding 5 -text [mc "XDATA"]]
+ -padding 5 -text [mc "External RAM (XDATA)"]]
set proc_frame_middle_right [ttk::labelframe $proc_frame_middle.right \
- -padding 5 -text [mc "XCODE"]]
+ -padding 5 -text [mc "External ROM/FLASH (XCODE)"]]
# MCU clock frequency
grid [Label $proc_frame_top1.clock_label \
@@ -2897,7 +2986,10 @@ namespace eval X {
-style Flat.TButton \
-takefocus 0 \
-image ::ICONS::16::locationbar_erase \
- -command {set ::X::project_edit_main_file {}} \
+ -command {
+ set ::X::project_edit_main_file {}
+ ::X::proj_edit_mf_validator {}
+ } \
-state disabled \
]
DynamicHelp::add $proc_frame_top1.clear_but -text [mc "Clear"]
@@ -2908,6 +3000,7 @@ namespace eval X {
-validatecommand {::X::proj_edit_mf_validator %P} \
-textvariable X::project_edit_main_file \
] -row 1 -column 3 -sticky we
+ proj_edit_mf_validator ${::X::project_edit_main_file}
DynamicHelp::add $proc_frame_top1.file_entry \
-text [mc "Project main file (e.g. main.c)\n(empty string means always compile current file)"]
grid [ttk::button $proc_frame_top1.file_select_but \
@@ -2921,7 +3014,7 @@ namespace eval X {
# Create components of top frame (Type: <ComboBox> <Button>)
pack [label $proc_frame_top0.lbl -text [mc "Type:"] -width 14 -anchor w] -side left
pack [ttk::combobox $proc_frame_top0.combo \
- -values $avaliable_processors \
+ -values $available_processors \
-state readonly \
-textvariable ::X::project_new_processor\
] -side left -fill x
@@ -2949,7 +3042,7 @@ namespace eval X {
set project_new_xd_scl [ttk::scale $proc_frame_left_btm.scale \
-orient horizontal \
-variable ::X::project_new_xdata \
- -from 0 -to 0xFFFF \
+ -from 0 -to 0x10000 \
-command "
set ::X::project_new_xdata \[expr {int(\${::X::project_new_xdata})}\]
$proc_frame_left_btm.spinbox selection range 0 end
@@ -2958,23 +3051,23 @@ namespace eval X {
DynamicHelp::add $project_new_xd_scl \
-text [mc "Size of external data memory"]
pack $project_new_xd_scl -fill x -side left -expand 1 -padx 2
- set project_new_xd_spb [spinbox $proc_frame_left_btm.spinbox \
- -textvariable ::X::project_new_xdata \
- -width 5 -from 0 -to 0xFFFF \
- -bg white -validate all \
- -vcmd {::SelectMCU::validate_xdata %P} \
- -command "$proc_frame_left_btm.spinbox selection range 0 end ;#" \
+ set project_new_xd_spb [ttk::spinbox $proc_frame_left_btm.spinbox \
+ -textvariable ::X::project_new_xdata \
+ -width 5 -from 0 -to 0x10000 \
+ -validate all \
+ -validatecommand {::SelectMCU::validate_xdata %P} \
]
DynamicHelp::add $project_new_xd_spb \
-text [mc "Size of external data memory"]
pack $project_new_xd_spb -side right -after $project_new_xd_scl
pack $proc_frame_left_btm -fill both -expand 1
+ proj_new_xdata_disena
# Create components of XCODE labelframe
set project_new_xc_chb [checkbutton $proc_frame_middle_right.checkbutton \
- -variable ::X::project_new_xcode_ena \
- -text [mc "Enable"] \
- -command ::X::proj_new_xcode_disena \
+ -variable ::X::project_new_xcode_ena \
+ -text [mc "Enable"] \
+ -command ::X::proj_new_xcode_disena \
]
pack $project_new_xc_chb -anchor w
DynamicHelp::add $proc_frame_middle_right.checkbutton \
@@ -2983,7 +3076,7 @@ namespace eval X {
set project_new_xc_scl [ttk::scale $proc_frame_right_btm.scale \
-orient horizontal \
-variable ::X::project_new_xcode \
- -from 0 -to 0xFFFF \
+ -from 0 -to 0x10000 \
-command "
set ::X::project_new_xcode \[expr {int(\${::X::project_new_xcode})}\]
$proc_frame_right_btm.spinbox selection range 0 end
@@ -2992,17 +3085,17 @@ namespace eval X {
DynamicHelp::add $project_new_xc_scl \
-text [mc "Amount of total program memory minus internal program memory"]
pack $project_new_xc_scl -fill x -side left -expand 1 -padx 2
- set project_new_xc_spb [spinbox $proc_frame_right_btm.spinbox \
- -textvariable ::X::project_new_xcode \
- -width 5 -from 0 -to 0xFFFF \
- -bg white -validate all \
- -vcmd {::X::proj_new_validate_xcode %P} \
- -command "$proc_frame_right_btm.spinbox selection range 0 end ;#" \
+ set project_new_xc_spb [ttk::spinbox $proc_frame_right_btm.spinbox \
+ -textvariable ::X::project_new_xcode \
+ -width 5 -from 0 -to 0x10000 \
+ -validate all \
+ -validatecommand {::X::proj_new_validate_xcode %P} \
]
DynamicHelp::add $project_new_xc_spb \
-text [mc "Amount of total program memory minus internal program memory"]
pack $project_new_xc_spb -side right -after $project_new_xc_scl
pack $proc_frame_right_btm -fill both -expand 1
+ proj_new_xcode_disena
pack $proc_frame_top0 -anchor w -pady 5 -padx 10
pack $proc_frame_top1 -anchor w -pady 5 -padx 10
@@ -3011,8 +3104,13 @@ namespace eval X {
pack $proc_frame_middle -fill both -expand 1 -pady 5
pack $lb_compiler -fill both -expand 1
- # Adjust XDATA & XCODE controls
+ # Adjust XDATA & XCODE controls - TODO why is this needed here?
+ # editor window has just been created, user hasn't made any selections yet
+ # meaning that mcu has not changed
proj_new_mcu_changed
+ # Martin: Oh yes, now I remeber :) proj_new_mcu_changed has to be called here in order to ensure that the
+ # scale widgets don't offer values out of range. Try to remove the call and then invoke the project
+ # editing dialog and you will see.
## PROJECT DESCRIPTION
label $win.lb_desc_label \
@@ -3064,6 +3162,15 @@ namespace eval X {
X::project_edit_CANCEL
}
wm transient $win .
+
+ if {$choose_MCU_now} {
+ wm withdraw $win
+ proj_new_select_mcu .
+ project_edit_OK
+ return
+ }
+
+ update
catch {grab $win}
raise $win
tkwait window $win
@@ -3077,7 +3184,7 @@ namespace eval X {
variable project_edit_main_file_clr_but ;# Widget: Project main file clear button
if {[string length $string]} {
$project_edit_main_file_clr_but configure -state normal
- } {
+ } else {
$project_edit_main_file_clr_but configure -state disabled
}
return 1
@@ -3097,7 +3204,7 @@ namespace eval X {
set defaultmask 1
} elseif {$ext == {.h}} {
set defaultmask 2
- } {
+ } else {
set defaultmask 3
}
catch {delete object fsd}
@@ -3117,6 +3224,7 @@ namespace eval X {
set ::X::project_edit_main_file \
[string replace $::X::project_edit_main_file \
0 [string length [$::X::actualProject cget -projectPath]]]
+ ::X::proj_edit_mf_validator ${::X::project_edit_main_file}
}
}
fsd activate
@@ -3129,7 +3237,7 @@ namespace eval X {
proc project_edit_validate {string} {
if {[string length $string] > 40} {
return 0
- } {
+ } else {
return 1
}
}
@@ -3148,19 +3256,19 @@ namespace eval X {
# @parm String number - String to validate
# @return Bool - result
proc project_edit_CLOCK_validate {number} {
- if {![regexp {^\d*$} $number]} {return 0}
+ if {![regexp {^\d+(\.\d*)?$} $number]} {return 0}
if {$number > 99999} {return 0}
return 1
}
- ## Cancel dialog "Edit project" -- axiliary procedure for '__proj_edit'
+ ## Cancel dialog "Edit project" -- auxiliary procedure for '__proj_edit'
# @return void
proc project_edit_CANCEL {} {
grab release .project_edit
destroy .project_edit
}
- ## Save project values -- axiliary procedure for '__proj_edit'
+ ## Save project values -- auxiliary procedure for '__proj_edit'
# @return void
proc project_edit_OK {} {
variable actualProject ;# Object: Current project
@@ -3169,7 +3277,7 @@ namespace eval X {
variable project_edit_version ;# Project version
variable project_edit_date ;# Project date (last update)
variable project_edit_copyright ;# Copyright information
- variable project_edit_licence ;# Licence information
+ variable project_edit_license ;# License information
variable project_edit_clock ;# Default clock rate
variable project_edit_main_file ;# Project main file
variable project_new_processor ;# Processor type (e.g. "AT89C2051")
@@ -3178,6 +3286,7 @@ namespace eval X {
variable project_new_xdata ;# Int: Amount of XDATA memory
variable project_new_xcode ;# Int: Amount of XCODE memory
variable project_new_xc_spb ;# Widget: XCODE spinbox
+ variable project_edit_defaults ;# Some default project values
variable projectdetails_last_project {} ;# Project object of the last project details window
@@ -3189,10 +3298,14 @@ namespace eval X {
set project_new_xcode 0
}
+ # Set MCU name in status bar, kdb
+ .statusbarMCU configure -text $project_new_processor
+
# Adjust values
if {$project_edit_clock == {}} {
set project_edit_clock [lindex $project_edit_defaults {1 1}]
}
+ set project_edit_clock [string trimright $project_edit_clock {.}]
set project_new_xdata [expr {int($project_new_xdata)}]
set project_new_xcode [expr {int($project_new_xcode)}]
@@ -3204,15 +3317,16 @@ namespace eval X {
# Change object variables
foreach parm {
P_option_mcu_xdata P_option_mcu_xcode P_information_version
- P_information_date G_information_licence G_information_copyright
+ P_information_date G_information_license G_information_copyright
P_option_clock P_option_mcu_type P_option_main_file
} \
value {
project_new_xdata project_new_xcode project_edit_version
- project_edit_date project_edit_licence project_edit_copyright
+ project_edit_date project_edit_license project_edit_copyright
project_edit_clock project_new_processor project_edit_main_file
- } {
- $actualProject configure -$parm [subst "\$$value"]
+ } \
+ {
+ $actualProject configure -$parm [subst -nocommands "\$$value"]
}
$actualProject Simulator_set_clock $project_edit_clock
$actualProject configure -project_description \
@@ -3220,7 +3334,7 @@ namespace eval X {
$actualProject configure -G_information_authors \
[.project_edit.top.left.lb_general_info.tframe.frame.text get 1.0 end-1c]
- ## Adjust simulator control panel, register watches and hexeditors
+ ## Adjust simulator control panel, register watches and hex editors
# Hex editors
close_hexedit eram $actualProject
close_hexedit eeprom $actualProject
@@ -3232,7 +3346,7 @@ namespace eval X {
if {$xcode_prev != $project_new_xcode} {
close_hexedit code $actualProject
$actualProject simulator_resize_code_memory \
- [expr {$project_new_xcode + 0xFFFF - [$project_new_xc_spb cget -to]}]
+ [expr {$project_new_xcode + 0x10000 - [$project_new_xc_spb cget -to]}]
}
# Simulator control panel and register watches
if {$proc_prev != $project_new_processor} {
@@ -3273,10 +3387,11 @@ namespace eval X {
$actualProject configure -P_option_mcu_type $new_processor
$actualProject configure -procData \
[SelectMCU::get_processor_details $new_processor]
- $actualProject refresh_project_avaliable_SFR
+ $actualProject refresh_project_available_SFR
$actualProject stack_monitor_monitor_close
$actualProject interrupt_monitor_close
+ $actualProject uart_monitor_close
$actualProject simulator_initialize_mcu
$actualProject SimGUI_clean_up
$actualProject simulator_itialize_simulator_control_panel
@@ -3288,6 +3403,8 @@ namespace eval X {
$actualProject rightPanel_watch_disable
$actualProject sfr_watches_commit_new_sfr_set
$actualProject pale_MCU_changed
+ $actualProject stopwatch_clear_all C
+ $actualProject stopwatch_clear_all O
if {$was_enabled} {
__initiate_sim
@@ -3349,7 +3466,7 @@ namespace eval X {
if {$response == {yes}} {
close_project
return 1
- } {
+ } else {
return 0
}
}
@@ -3366,6 +3483,9 @@ namespace eval X {
variable simulator_enabled ;# List of booleans: Simulator engaged
variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
+ # Make sure that there are no help windows visible
+ remove_all_help_windows
+
# This function is critical
if {$critical_procedure_in_progress} {return}
set critical_procedure_in_progress 1
@@ -3394,22 +3514,30 @@ namespace eval X {
# Raise nex tab or disable project menu and procedures
if {[llength $openedProjects] > 0} {
- set actualProject [lindex $openedProjects 0]
- .mainFrame.mainNB raise [string trimleft $actualProject {:}]
- } {
+ set actualProjectIdx 0
+ set actualProject [lindex $openedProjects $actualProjectIdx]
+ ${::main_nb} raise [string trimleft $actualProject {:}]
+ } else {
set project_menu_locked 1
Lock_project_menu
}
set critical_procedure_in_progress 0
+
+ update
+ foreach project $openedProjects {
+ $project bottomNB_redraw_pane
+ }
}
## Compile current file
- # @parm Bool = 0 - Force compilation -- ignore running critical procedure
- # @parm Bool = 0 - Start simulator after successful compilation
- # @parm Bool = 0 - Compile current file only (not the main file)
+ # @parm Bool force=0 - Force compilation -- ignore running critical procedure
+ # @parm Bool compilation_start_simulator=0 - Start simulator after successful compilation
+ # @parm Bool compile_this_file_only=0 - Compile current file only (not the main file)
# @return Bool - result or {}
- proc __compile args {
+ proc __compile {{force 0} {_compilation_start_simulator 0} {_compile_this_file_only 0}} {
+ variable simulator_enabled ;# List of booleans: Simulator engaged
+ variable actualProjectIdx ;# Index of the current project in $openedProjects
variable compilation_successfull ;# Bool: Compilation successfull
variable actualProject ;# Object: Current project
variable compilation_in_progress ;# Bool: Compiler engaged
@@ -3420,21 +3548,9 @@ namespace eval X {
variable compile_this_file_only ;# Bool: Compile the current file only
variable compilation_mess_project ;# Object: Project related to running compilation
- # Parse input arguments
- if {[lindex $args 0] == 1} {
- set force 1
- } {
- set force 0
- }
- if {[lindex $args 1] == 1} {
- set compilation_start_simulator 1
- } {
- set compilation_start_simulator 0
- }
- if {[lindex $args 2] == 1} {
- set compile_this_file_only 1
- } {
- set compile_this_file_only 0
+ # It is not allowed to compile the source code while simulator is engaged
+ if {[lindex $simulator_enabled $actualProjectIdx]} {
+ return {}
}
if {$project_menu_locked} {return}
@@ -3449,6 +3565,9 @@ namespace eval X {
return 0
}
+ set compile_this_file_only $_compile_this_file_only
+ set compilation_start_simulator $_compilation_start_simulator
+
# Compilation started
set compilation_mess_project $actualProject
set compilation_successfull 1
@@ -3466,7 +3585,7 @@ namespace eval X {
# Determinate name of file to compile
if {$compile_this_file_only} {
set input_file {}
- } {
+ } else {
set input_file [list \
[$actualProject cget -projectPath] \
[$actualProject cget -P_option_main_file] \
@@ -3475,7 +3594,7 @@ namespace eval X {
if {[lindex $input_file 1] == {}} {
set input_file [$actualProject editor_procedure {} getFileName {}]
set language [$actualProject editor_procedure {} get_language {}]
- } {
+ } else {
set ext [string trimleft [file extension [lindex $input_file 1]] {.}]
if {$ext == {c} || $ext == {h} || $ext == {cxx} || $ext == {cpp} || $ext == {cc}} {
set language 1
@@ -3491,7 +3610,7 @@ namespace eval X {
if {[regexp {\.[^\.]*$} $input_file_name input_file_extension]} {
regsub {\.[^\.]*$} $input_file_name {} input_file_name
set input_file_extension [string range $input_file_extension 1 end]
- } {
+ } else {
set input_file_extension {}
}
# Asjust file extension
@@ -3521,16 +3640,16 @@ namespace eval X {
## C language
if {$language == 1} {
- if {!${::PROGRAM_AVALIABLE(sdcc)} && !${::PROGRAM_AVALIABLE(sdcc-sdcc)}} {
+ if {!${::PROGRAM_AVAILABLE(sdcc)} && !${::PROGRAM_AVAILABLE(sdcc-sdcc)}} {
tk_messageBox \
-parent . \
-type ok \
-icon warning \
-title [mc "Compiler not found"] \
-message [mc "Unable to find sdcc, please install sdcc and restart MCU 8051 IDE"]
- } {
+ } else {
# Start compiler
- set compiler_pid [::ExternalCompiler::compile_C \
+ set compiler_pid [::ExternalCompiler::compile_C \
$cur_dir $input_file_name.$input_file_extension \
$iram_size $xram_size $code_size \
]
@@ -3539,26 +3658,26 @@ namespace eval X {
## Assembly language
} else {
- # Check if the choosen assembler is avaliable in the system
- set avaliable 0
+ # Check if the choosen assembler is available in the system
+ set available 0
switch -- $::ExternalCompiler::selected_assembler {
0 { ;# Native assembler
- set avaliable 1
+ set available 1
set assembler_name [mc "MCU 8051 IDE Native assembler"]
- set assembler_cmd {mcu8051ide --compile}
+ set assembler_cmd {mcu8051ide --assemble}
}
1 { ;# ASEM-51
- set avaliable ${::PROGRAM_AVALIABLE(asem)}
+ set available ${::PROGRAM_AVAILABLE(asem)}
set assembler_name "ASEM-51"
set assembler_cmd {asem}
}
2 { ;# ASL
- set avaliable ${::PROGRAM_AVALIABLE(asl)}
+ set available ${::PROGRAM_AVAILABLE(asl)}
set assembler_name "ASL"
set assembler_cmd {asl}
}
3 { ;# AS31
- set avaliable ${::PROGRAM_AVALIABLE(as31)}
+ set available ${::PROGRAM_AVAILABLE(as31)}
set assembler_name "AS31"
set assembler_cmd {as31}
}
@@ -3566,7 +3685,7 @@ namespace eval X {
error "Unknown internal error -- Invalid ID of the selected assembler"
}
}
- if {!$avaliable} {
+ if {!$available} {
tk_messageBox \
-parent . \
-type ok \
@@ -3587,7 +3706,7 @@ namespace eval X {
set ::Compiler::Settings::xram_size $xram_size
set ::Compiler::Settings::code_size $code_size
set ::PreProcessor::check_sfr_usage 1
- set ::PreProcessor::avaliable_SFR [string tolower [$actualProject cget -avaliable_SFR]]
+ set ::PreProcessor::available_SFR [string tolower [$actualProject cget -available_SFR]]
# Perform code compilation
if {[catch {
@@ -3602,7 +3721,7 @@ namespace eval X {
-icon error \
-type ok \
-title [mc "Compiler crash - MCU 8051 IDE"] \
- -message [mc "Compiler crased, we are terribly sorry about that.\n\nPlease report this bug via project web or mail to author and please don't forget to include source code on which this error occured."]
+ -message [mc "Compiler crashed, we are terribly sorry about that.\n\nPlease report this bug via project web or mail to author and please don't forget to include source code on which this error occurred."]
}
::Compiler::free_resources
set Compiler::Settings::ABORT_VARIABLE 0
@@ -3643,11 +3762,16 @@ namespace eval X {
# @parm String fail_callback - Procedure to call upon failed compilation
# @return void
proc compile_if_nessesary_and_callback {success_callback fail_callback} {
+ variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
variable actualProject ;# Object: Current project
variable compilation_in_progress ;# Bool: Compiler engaged
variable compilation_success_callback ;# String: Indented for HW plugins
variable compilation_fail_callback ;# String: Indented for HW plugins
+ if {$project_menu_locked} {
+ return
+ }
+
set compilation_success_callback $success_callback
set compilation_fail_callback $fail_callback
@@ -3660,7 +3784,7 @@ namespace eval X {
set full_file_name [$actualProject editor_procedure {} getFileName {}]
set language [$actualProject editor_procedure {} get_language {}]
set relative_name [lindex $full_file_name 1]
- } {
+ } else {
set ext [string trimleft [file extension $relative_name] {.}]
if {$ext == {c} || $ext == {h} || $ext == {cxx} || $ext == {cpp} || $ext == {cc}} {
set language 1
@@ -3674,7 +3798,7 @@ namespace eval X {
set full_file_name [file rootname $full_file_name]
if {$language != 1} {
append full_file_name {.adf}
- } {
+ } else {
append full_file_name {.hashes}
}
@@ -3706,7 +3830,7 @@ namespace eval X {
}
}]} then {
- if {[verify_md5_hashes 1 $expected_md5s]} {
+ if {[verify_md5_hashes 1 $expected_md5s [file dirname $full_file_name]]} {
__compile
return
}
@@ -3739,7 +3863,7 @@ namespace eval X {
set compilation_fail_callback {}
set compilation_success_callback {}
}
- } {
+ } else {
Sbar [mc "Compilation failed"]
if {$compilation_fail_callback != {}} {
eval "$compilation_fail_callback"
@@ -3767,9 +3891,9 @@ namespace eval X {
"\{"] \
0 0]
- # Backspace charactes
+ # Backspace characters
set idx 0
- while 1 {
+ while {1} {
set idx [string first "\b" $args $idx]
if {$idx == -1} {
break
@@ -3810,6 +3934,7 @@ namespace eval X {
set actualProjectIdx $actualProjectIdx_org
} elseif {$compilation_start_simulator && !$compilation_successfull} {
tk_messageBox \
+ -parent . \
-icon error \
-type ok \
-title [mc "Compilation failed"] \
@@ -3829,18 +3954,25 @@ namespace eval X {
if {!$::MICROSOFT_WINDOWS} { ;# There is no kill command on Microsoft Windows
# Kill doxygen
- if {$doxygen_pid} {
+ if {${doxygen_pid} != {}} {
foreach pid $doxygen_pid {
+ if {$pid == [pid] || $pid == 0} {
+ continue
+ }
catch {
- exec -- kill -9 $pid &
+ exec -- kill -9 $pid
}
}
+ }
- # Kill SDCC
- } elseif {${compiler_pid} != {} && ${compiler_pid} != 0} {
+ # Kill external compiler
+ if {${compiler_pid} != {}} {
foreach pid $compiler_pid {
+ if {$pid == [pid] || $pid == 0} {
+ continue
+ }
catch {
- exec -- kill -9 $pid &
+ exec -- kill -9 $pid
}
}
}
@@ -3907,12 +4039,17 @@ namespace eval X {
## Append text to messages text (bottom panel - tab "Messages")
# @parm String text - Text to append
- # @return Bool - True if error occured
+ # @return Bool - True if error occurred
proc messages_text_append {text} {
variable actualProject ;# Object: Current project
variable compilation_mess_project ;# Object: Project related to running compilation
+ variable compilation_successfull ;# Bool: Compilation successfull
- return [$compilation_mess_project messages_text_append $text]
+ set result [$compilation_mess_project messages_text_append $text]
+ if {$result} {
+ set compilation_successfull 0
+ }
+ return $result
}
## Copy selected text in messages text to clipboard (bottom panel - tab "Messages")
@@ -3982,11 +4119,12 @@ namespace eval X {
[$actualProject editor_procedure {} getLinesCount {}] == 1
&&
[$actualProject editor_procedure {} getLineContent 1] == {}
- } {
+ } then {
tk_messageBox \
+ -parent . \
-type ok \
-icon warning \
- -title [mc "Unable to compile"] \
+ -title [mc "Unable to comply"] \
-message [mc "This editor seems to be empty"]
return
}
@@ -4000,13 +4138,13 @@ namespace eval X {
incr max
# Create diwlog window
- set win [toplevel .exportToX_dialog -class [mc "Export dialog"] -bg {#EEEEEE}]
+ set win [toplevel .exportToX_dialog -class [mc "Export dialog"] -bg ${::COMMON_BG_COLOR}]
wm withdraw $win
# Label and progress bar
set main_frame [frame $win.main_frame]
pack [label $main_frame.header \
- -text [mc "Finishing highlight ..."] \
+ -text [mc "Finishing syntax highlight ..."] \
] -pady 10 -padx 20 -anchor w
pack [ttk::progressbar $main_frame.progress_bar \
-maximum $max \
@@ -4022,20 +4160,20 @@ namespace eval X {
-command "X::exportToX_abort $targetType" \
-image ::ICONS::16::cancel \
-compound left \
- ]
+ ] -pady 5
# Determinate target file name
set file [$actualProject editor_procedure {} getFileName {}]
set filename [lindex $file 1]
if {[lindex $file 0] != {}} {
set dir [lindex $file 0]
- } {
+ } else {
set dir [$actualProject cget -projectPath]
}
regsub {\.[^\.]*$} $filename {} filename
if {$targetType == "-html"} {
set suffix {html}
- } {
+ } else {
set suffix {tex}
}
append filename {.} $suffix
@@ -4043,9 +4181,10 @@ namespace eval X {
KIFSD::FSD fsd \
-initialfile $filename -directory $dir \
-title [mc "Export as %s - MCU 8051 IDE" [lindex $args 1]] \
- -defaultmask 0 -multiple 0 -filetypes [subst "
- {{[mc {[string toupper $suffix] file}]} {*.$suffix}}
- {{[mc {All files}]} {*}}"]
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc [string toupper $suffix] {file}] "*.$suffix"] \
+ [list [mc "All files"] {*}] \
+ ]
fsd setokcmd {
set ::X::fsd_result [X::fsd get]
}
@@ -4065,6 +4204,7 @@ namespace eval X {
if {[file exists $filename] && [file isfile $filename]} {
if {![file writable $filename]} {
tk_messageBox \
+ -parent . \
-type ok \
-icon error \
-title [mc "Permission denied"] \
@@ -4080,7 +4220,8 @@ namespace eval X {
-title [mc "Overwrite file"] \
-message [mc "A file name '%s' already exists. Are you sure you want to overwrite it ?" [file tail $filename]]
] != {yes}
- } {
+ } then {
+ exportToX_abort $targetType
return
}
# Create a backup file
@@ -4091,9 +4232,10 @@ namespace eval X {
# Open target file
if {[catch {
- set file [open $filename w 420]
- }]} {
+ set file [open $filename w 0640]
+ }]} then {
tk_messageBox \
+ -parent . \
-type ok \
-icon error \
-title [mc "Permission denied"] \
@@ -4107,7 +4249,7 @@ namespace eval X {
wm iconphoto $win ::ICONS::16::html
wm deiconify $win
wm title $win [mc "[lindex $args 1] - MCU 8051 IDE"]
- wm minsize $win 450 70
+ wm minsize $win 450 110
wm protocol $win WM_DELETE_WINDOW {
exportToX_abort
}
@@ -4130,9 +4272,9 @@ namespace eval X {
# Export and write data
if {$targetType == "-html"} {
- puts -nonewline $file [$actualProject editor_procedure {} getDataAsXHTML {}]
+ $actualProject editor_procedure {} getDataAsXHTML $file
} elseif {$targetType == "-latex"} {
- puts -nonewline $file [$actualProject editor_procedure {} getDataAsLaTeX {}]
+ $actualProject editor_procedure {} getDataAsLaTeX $file
} else {
error "Unknown argument: $targetType\n\tpossible vaues are: -html -latex"
}
@@ -4140,7 +4282,7 @@ namespace eval X {
exportToX_abort $targetType
# Show result
- Sbar [mc "Expoted data saved to %s" $filename]
+ Sbar [mc "Exported data saved to %s" $filename]
}
## Abort export content of the current editor as XHTML/LaTeX
@@ -4181,15 +4323,16 @@ namespace eval X {
# - Save all projects
# - Save session file
# - Exit
- # @parm Bool = 0 - Print message "Exitong on user request"
+ # @parm Bool do_not_print_exit_message=0 - Print message "Exiting on user request"
+ # @parm Bool force=0 - Do not allow user to cancel the request
# @return void
- proc __exit args {
+ proc __exit {{do_not_print_exit_message 0} {force 0}} {
variable openedProjects ;# List of opened projects (Object references)
variable actualProject ;# Object: Current project
variable compilation_in_progress ;# Bool: Compiler engaged
variable procedure_exit_in_progress ;# Bool: proc "__exit" in progress
variable unsaved_projects ;# List: List of project object marked as "unsaved"
- variable eightsegment_editors ;# List: All 8-segment LED display editors invoked
+ variable eightsegment_editors ;# List: All 8-Segment LED display editors invoked
variable spec_calc_objects ;# List: All special calculator objects
variable rs232debugger_objects ;# List: All "RS232 debugger" objects
@@ -4204,13 +4347,6 @@ namespace eval X {
}
set procedure_exit_in_progress 1
- # Parse arguments
- if {[lindex $args 0] == 1} {
- set do_not_print_exit_message 1
- } {
- set do_not_print_exit_message 0
- }
-
# Ask hardware whether it's ready for exit
foreach project $openedProjects {
if {![$project hw_manager_comfirm_exit]} {
@@ -4234,25 +4370,26 @@ namespace eval X {
set unsaved_projects {}
foreach project $openedProjects {
foreach editor [$project cget -editors] {
- if {[$editor cget -modified]} {
- lappend unsaved_projects "{$project} {$editor}"
+ catch {
+ if {[$editor cget -modified]} {
+ lappend unsaved_projects [list $project $editor]
+ }
}
}
}
# Ask user for saving unsaved files -- use proc 'shutdown_dialog'
if {[llength $unsaved_projects] != 0} {
- switch -- [shutdown_dialog] {
+ switch -- [shutdown_dialog $force] {
0 { ;# SAVESELECTED
set i 0
foreach unsaved $unsaved_projects {
- set bool [subst "\$::unsavedfile$i"]
+ set bool [subst -nocommands "\$::unsavedfile$i"]
if {$bool == 1} {
[lindex [lindex $unsaved_projects $i] 1] save
}
incr i
}
-
}
1 { ;# SAVEALL
set last_project {}
@@ -4272,10 +4409,22 @@ namespace eval X {
}
}
+ # Stop watching for modifications in designaded files
+ FSnotifications::stop
+
if {!$do_not_print_exit_message} {
puts [mc "\nExiting program on user request ..."]
}
+ # Save session
+ if {[catch {
+ save_session
+ } result]} then {
+ puts stderr [mc "An error occurred when saving the last session"]
+ puts stderr $result
+ }
+
+
# Withdraw main window
wm withdraw .
# Withdraw all PALE windows
@@ -4284,23 +4433,20 @@ namespace eval X {
}
update
- # Save session
- if {[catch {
- save_session
- } result]} then {
- puts stderr [mc "An error occured when saving the last session"]
- puts stderr $result
- }
-
# Save all projects
foreach project $openedProjects {
$project kill_childern
set actualProject $project
+ puts [mc "Saving project: %s" $project]
__proj_save
}
- puts [mc "Program terminated"]
+ # Kill the spell checker used by the editor
+ if {!$::MICROSOFT_WINDOWS} {
+ ::Editor::kill_spellchecker_process
+ }
+ puts [mc "Program terminated"]
exit
}
@@ -4327,7 +4473,7 @@ namespace eval X {
variable project_recent_files ;# List: recently opened projects
variable vhw_recent_files ;# List: recently opened Virtual HW files
- variable base_convertors ;# List: All base convertor objects
+ variable base_converters ;# List: All base converter objects
variable change_letter_case_options ;# Options (which fields should be adjusted)
@@ -4338,7 +4484,7 @@ namespace eval X {
-type ok \
-icon error \
-title [mc "Permission denied"] \
- -message [mc "Unable to save running config"]
+ -message [mc "Unable to save running configuration"]
return 0
}
}
@@ -4394,36 +4540,46 @@ namespace eval X {
RS232_DEBUGGER {${::RS232Debugger::config_list}}
STACK_MON_GEOMETRY {${::StackMonitor::geometry}}
STACK_MON_COLLAPSED {${::StackMonitor::collapsed}}
+ SPELL_CHECK_ENABLED {${::Editor::spellchecker_enabled}}
+ SPELL_CHECK_DICTIONARY {${::Editor::spellchecker_dictionary}}
+ UART_MON_GEOMETRY {${::UARTMonitor::geometry}}
+ SHOW_PALE_WARN {${::Graph::show_sim_per_warn}}
}]
set ::CONFIG(LETTER_CASE) {}
for {set i 0} {$i < 21} {incr i} {
lappend ::CONFIG(LETTER_CASE) $change_letter_case_options($i)
}
- set ::CONFIG(BASE_CONVERTORS) {}
- foreach obj $base_convertors {
- lappend ::CONFIG(BASE_CONVERTORS) [$obj get_config]
+ set ::CONFIG(BASE_CONVERTERS) {}
+ foreach obj $base_converters {
+ lappend ::CONFIG(BASE_CONVERTERS) [$obj get_config]
}
# Open session file
if {[catch {
- set file [open $session_file w 420]
+ set file [open $session_file w 0640]
}]} then {
- tk_messageBox -parent . -type ok -icon error \
- -title [mc "Access denied"] \
+ tk_messageBox \
+ -parent . \
+ -type ok \
+ -icon error \
+ -title [mc "Access denied"] \
-message [mc "Unable to write to file: \"%s\"" $session_file]
return
}
# Write session file
- puts $file "# ${::APPNAME} [clock format [clock seconds] -format {%T %D}]"
- puts $file "# Please do not modify this file manualy.\n"
+ puts $file "# ${::APPNAME}"
+ puts $file "# Please do not modify this file manually.\n"
puts $file "# booleans"
if {$::MICROSOFT_WINDOWS} {
- # There is no such thing on Windows OS
- puts $file "WINDOW_ZOOMED = \"0\""
- } {
- puts $file "WINDOW_ZOOMED = \"[wm attributes . -zoomed]\""
+ if {[wm state .] == {zoomed}} {
+ puts $file "WINDOW_ZOOMED = 1"
+ } else {
+ puts $file "WINDOW_ZOOMED = 0"
+ }
+ } else {
+ puts $file "WINDOW_ZOOMED = [wm attributes . -zoomed]"
}
puts $file "LINE_NUMBERS = $::CONFIG(LINE_NUMBERS)"
puts $file "ICON_BORDER = $::CONFIG(ICON_BORDER)"
@@ -4436,6 +4592,8 @@ namespace eval X {
puts $file "ASK_ON_FILE_OPEN = $::CONFIG(ASK_ON_FILE_OPEN)"
puts $file "SHOW_EDITOR_TAB_BAR = $::CONFIG(SHOW_EDITOR_TAB_BAR)"
puts $file "STACK_MON_COLLAPSED = $::CONFIG(STACK_MON_COLLAPSED)"
+ puts $file "SPELL_CHECK_ENABLED = $::CONFIG(SPELL_CHECK_ENABLED)"
+ puts $file "SHOW_PALE_WARN = $::CONFIG(SHOW_PALE_WARN)"
puts $file "\n# integers"
puts $file "LEFT_PANEL_SIZE = $::CONFIG(LEFT_PANEL_SIZE)"
puts $file "RIGHT_PANEL_SIZE = $::CONFIG(RIGHT_PANEL_SIZE)"
@@ -4450,6 +4608,7 @@ namespace eval X {
puts $file "FILE_RECENT_FILES = \"$::CONFIG(FILE_RECENT_FILES)\""
puts $file "PROJECT_RECENT_FILES = \"$::CONFIG(PROJECT_RECENT_FILES)\""
puts $file "VHW_RECENT_FILES = \"$::CONFIG(VHW_RECENT_FILES)\""
+ puts $file "SPELL_CHECK_DICTIONARY = \"$::CONFIG(SPELL_CHECK_DICTIONARY)\""
puts $file "\n# lists"
puts $file "CLEANUP_OPTIONS = \"[regsub -all {\s+} $::CONFIG(CLEANUP_OPTIONS) { }]\""
puts $file "FIND_OPTIONS = \"$::CONFIG(FIND_OPTIONS)\""
@@ -4467,7 +4626,7 @@ namespace eval X {
puts $file "REGWATCHES_CONFIG = \"$::CONFIG(REGWATCHES_CONFIG)\""
puts $file "FILE_NOTES = \"$::CONFIG(FILE_NOTES)\""
puts $file "EIGHT_SEG_EDITOR = \"$::CONFIG(EIGHT_SEG_EDITOR)\""
- puts $file "BASE_CONVERTORS = \"$::CONFIG(BASE_CONVERTORS)\""
+ puts $file "BASE_CONVERTERS = \"$::CONFIG(BASE_CONVERTERS)\""
puts $file "SPEC_CALC = \"$::CONFIG(SPEC_CALC)\""
puts $file "RS232_DEBUGGER = \"$::CONFIG(RS232_DEBUGGER)\""
puts $file "\n# other"
@@ -4475,12 +4634,11 @@ namespace eval X {
puts $file "ACTIVE_PROJECT = $actualProjectIdx"
puts $file "INTR_MON_GEOMETRY = \"$::CONFIG(INTR_MON_GEOMETRY)\""
puts $file "STACK_MON_GEOMETRY = \"$::CONFIG(STACK_MON_GEOMETRY)\""
+ puts $file "UART_MON_GEOMETRY = \"$::CONFIG(UART_MON_GEOMETRY)\""
- set projects {}
- if {[winfo exists .mainFrame.mainNB]} {
- set projects_len [llength [.mainFrame.mainNB pages]]
- for {set i 0} {$i < $projects_len} {incr i} {
- set prj [.mainFrame.mainNB pages $i]
+ set projects [list]
+ foreach prj $openedProjects {
+ if {![$prj cget -S_flag_read_only]} { ;# Do not reopen read-only projects
lappend projects [file join \
[$prj cget -projectPath]\
[$prj cget -projectFile]\
@@ -4548,7 +4706,9 @@ namespace eval X {
LETTER_CASE {- - - - - - - - - - - - - - - - - - - - -}
KIFSD_CONFIG {}
HEXEDIT_CONFIG {+0+0 hex 0 left}
- INTR_MON_GEOMETRY {780x250}
+ INTR_MON_GEOMETRY {850x270}
+ UART_MON_GEOMETRY {850x270}
+ SHOW_PALE_WARN 1
SUBP_MON_CONFIG {1 1}
OPEN_WITH_DLG {}
FS_BROWSER_MASK {*.asm}
@@ -4562,20 +4722,32 @@ namespace eval X {
FILE_RECENT_FILES {}
PROJECT_RECENT_FILES {}
VHW_RECENT_FILES {}
- REGWATCHES_CONFIG {1 1}
+ REGWATCHES_CONFIG {1 1 0}
FILE_NOTES {1 200}
EIGHT_SEG_EDITOR {
{0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7}
{0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0}
}
- BASE_CONVERTORS {}
+ BASE_CONVERTERS {}
SPEC_CALC {}
ASK_ON_FILE_OPEN 1
SHOW_EDITOR_TAB_BAR 1
RS232_DEBUGGER {9600 n 8 1 1 0 {} {} 0 0}
STACK_MON_GEOMETRY {}
STACK_MON_COLLAPSED 1
+ SPELL_CHECK_ENABLED 1
+ SPELL_CHECK_DICTIONARY {}
}
+
+ # Set default dictionary for the spell checking
+ set ::CONFIG(SPELL_CHECK_DICTIONARY) [join \
+ [list \
+ [string tolower [lindex [split [::msgcat::mclocale] {_}] 0]] \
+ [string toupper [lindex [split [::msgcat::mclocale] {_}] 1]] \
+ ] \
+ {_} \
+ ]
+
if {$::MICROSOFT_WINDOWS} {
lset ::CONFIG(FIND_IN_FILES_CONFIG) 3 ${::env(USERPROFILE)}
}
@@ -4607,9 +4779,11 @@ namespace eval X {
STOPWATCH_CONFIG C_VARS_VIEW_CONF BITMAP_CONFIG
HW_MANAGER_CONFIG FILE_RECENT_FILES PROJECT_RECENT_FILES
REGWATCHES_CONFIG EIGHT_SEG_EDITOR VHW_RECENT_FILES
- BASE_CONVERTORS WINDOW_ZOOMED SPEC_CALC
+ BASE_CONVERTERS WINDOW_ZOOMED SPEC_CALC
ASK_ON_FILE_OPEN SHOW_EDITOR_TAB_BAR RS232_DEBUGGER
FILE_NOTES STACK_MON_GEOMETRY STACK_MON_COLLAPSED
+ SPELL_CHECK_ENABLED SPELL_CHECK_DICTIONARY UART_MON_GEOMETRY
+ SHOW_PALE_WARN
}
# List of datatypes for these keys
set datatypes {
@@ -4629,11 +4803,13 @@ namespace eval X {
S B S
B B S
S S B
+ B S G
+ B
}
# Open session file
set file [open $session_file r]
- while 1 {
+ while {1} {
# Break on EOF
if {[eof $file]} {
close $file
@@ -4706,9 +4882,9 @@ namespace eval X {
puts stderr "Invalid record REPLACE_OPTIONS -- setting to default value"
set ::CONFIG(REPLACE_OPTIONS) $default_REPLACE_OPTIONS
}
- if {![regexp {^\s*[01]\s+[01]\s*$} $::CONFIG(REGWATCHES_CONFIG)]} {
+ if {![regexp {^\s*[01]\s+[01]\s+[01]\s*$} $::CONFIG(REGWATCHES_CONFIG)]} {
puts stderr "Invalid record REGWATCHES_CONFIG -- setting to default value"
- set ::CONFIG(REGWATCHES_CONFIG) {1 1}
+ set ::CONFIG(REGWATCHES_CONFIG) {1 1 0}
}
# Adjust some configuration values
@@ -4751,18 +4927,19 @@ namespace eval X {
}
## Invoke dialog "Exit program"
+ # @parm Bool force=0 - Do not allow user to cancel the request
# @return Int - result
# '0' == Save selected
# '1' == Save all
# '2' == Discard
# '3' == Cancel
- proc shutdown_dialog {} {
+ proc shutdown_dialog {{force 0}} {
variable unsaved_projects ;# List: List of project object marked as "unsaved"
catch {unset ::exit_dialog_result}
# Create dialog window
- set dialog [toplevel .save_multiple_projects -class {Save multimple} -bg {#EEEEEE}]
+ set dialog [toplevel .save_multiple_projects -class {Save multimple} -bg ${::COMMON_BG_COLOR}]
# Create the top part of dialog (Header and some icon)
pack [frame $dialog.topframe] -fill x -expand 1
@@ -4774,7 +4951,7 @@ namespace eval X {
] -side right -fill x -expand 1
# Create the middle part of the dialog (list of unsaved files)
- pack [ttk::labelframe $dialog.lf -text [mc "Unsaved files"] -labelanchor nw -padding 5] -fill both -expand 1 -pady 10 -padx 10
+ ttk::labelframe $dialog.lf -text [mc "Unsaved files"] -labelanchor nw -padding 5
set last_project {}
set i 0
foreach unsaved $unsaved_projects {
@@ -4797,8 +4974,8 @@ namespace eval X {
}
# Create the bottom part of the dialog (buttons)
- pack [ttk::separator $dialog.separator -orient horizontal] -fill x -expand 1 -padx 10
- pack [frame $dialog.f] -pady 5 -padx 5
+ ttk::separator $dialog.separator -orient horizontal
+ frame $dialog.f
# button SAVESELECTED
pack [ttk::button $dialog.f.b_save_selected \
-text [mc "Save selected"] \
@@ -4830,15 +5007,22 @@ namespace eval X {
bind $dialog.f.b_discard <Return> {set ::exit_dialog_result 2}
bind $dialog.f.b_discard <KP_Enter> {set ::exit_dialog_result 2}
# button CANCEL
- pack [ttk::button $dialog.f.b_cancel \
- -text [mc "Cancel"] \
- -underline 0 \
- -compound left \
- -image ::ICONS::16::button_cancel \
- -command {set ::exit_dialog_result 3} \
- ] -side left -padx 5
- bind $dialog.f.b_cancel <Return> {set ::exit_dialog_result 3}
- bind $dialog.f.b_cancel <KP_Enter> {set ::exit_dialog_result 3}
+ if {!$force} {
+ pack [ttk::button $dialog.f.b_cancel \
+ -text [mc "Cancel"] \
+ -underline 0 \
+ -compound left \
+ -image ::ICONS::16::button_cancel \
+ -command {set ::exit_dialog_result 3} \
+ ] -side left -padx 5
+ bind $dialog.f.b_cancel <Return> {set ::exit_dialog_result 3}
+ bind $dialog.f.b_cancel <KP_Enter> {set ::exit_dialog_result 3}
+ }
+
+ # Pack GUI parts
+ pack $dialog.lf -fill both -expand 1 -pady 10 -padx 10
+ pack $dialog.separator -fill x -expand 1 -padx 10
+ pack $dialog.f -pady 5 -padx 5
# Set key-events bindings
bind $dialog <Alt-Key-s> {set ::exit_dialog_result 0}
@@ -4854,11 +5038,23 @@ namespace eval X {
grab $dialog
focus -force $dialog.f.b_save_all
wm transient $dialog .
- wm protocol $dialog WM_DELETE_WINDOW "
- grab release $dialog
- destroy $dialog
- set ::exit_dialog_result 3
- "
+ if {!$force} {
+ wm protocol $dialog WM_DELETE_WINDOW "
+ grab release $dialog
+ destroy $dialog
+ set ::exit_dialog_result 3
+ "
+ } else {
+ wm protocol $dialog WM_DELETE_WINDOW "
+ tk_messageBox \
+ -parent $dialog \
+ -type ok \
+ -icon warning \
+ -title {[mc {Attention}]} \
+ -message {[mc {You have to chose one action}]}
+ "
+
+ }
vwait ::exit_dialog_result
grab release $dialog
destroy $dialog
@@ -4899,7 +5095,7 @@ namespace eval X {
set lineNum [$actualProject simulator_getCurrentLine]
if {$lineNum != {}} {
$actualProject move_simulator_line $lineNum
- } {
+ } else {
$actualProject editor_procedure {} unset_simulator_line {}
}
$actualProject Simulator_sync_PC_etc
@@ -4941,7 +5137,7 @@ namespace eval X {
set lineNum [$actualProject step]
if {$lineNum != {}} {
$actualProject move_simulator_line $lineNum
- } {
+ } else {
$actualProject editor_procedure {} unset_simulator_line {}
}
stepback_button_set_ena [$actualProject simulator_get_SBS_len]
@@ -4988,7 +5184,7 @@ namespace eval X {
set lineNum [$actualProject sim_stepover]
if {$lineNum != {}} {
$actualProject move_simulator_line $lineNum
- } {
+ } else {
$actualProject editor_procedure {} unset_simulator_line {}
}
@@ -5070,7 +5266,7 @@ namespace eval X {
set line_num [$actualProject sim_run]
if {$line_num != {}} {
$actualProject move_simulator_line $line_num
- } {
+ } else {
$actualProject editor_procedure {} unset_simulator_line {}
}
# Adjust simulator control panel
@@ -5098,6 +5294,8 @@ namespace eval X {
variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
variable actualProjectIdx ;# Index of the current project in $openedProjects
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
+ variable opened_code_mem_windows ;# List of project object with opened CODE memory hex editor
+ variable code_mem_window_objects ;# List of CODE memory hex editor objects
if {$project_menu_locked} {return}
@@ -5116,7 +5314,7 @@ namespace eval X {
# Perform reset
$actualProject Simulator_reset $arg
$actualProject simulator_setWatchDogTimer 0
- # Move simulator cursor in editor to the begining of the program
+ # Move simulator cursor in editor to the beginning of the program
foreach editor [$actualProject cget -editors] {
$editor unset_simulator_line
}
@@ -5130,20 +5328,23 @@ namespace eval X {
$actualProject rightPanel_watch_sync_all
}
+ # Inform code memory hexadecimal editor about the reset
+ program_counter_changed $actualProject 0
+
# Finalize
set critical_procedure_in_progress 0
}
## Start/Shutdown simulator
- # @parm Bool = 0 - Load debug file for the current file only (not the main file)
+ # @parm Bool current_file_only=0 - Load debug file for the current file only (not the main file)
# @return void
- proc __initiate_sim args {
+ proc __initiate_sim {{current_file_only 0}} {
variable actualProject ;# Object: Current project
variable simulator_enabled ;# List of booleans: Simulator engaged
variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
variable actualProjectIdx ;# Index of the current project in $openedProjects
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
- variable opended_code_mem_windows ;# List of project object with opened CODE memory hex editor
+ variable opened_code_mem_windows ;# List of project object with opened CODE memory hex editor
variable code_mem_window_objects ;# List of CODE memory hex editor objects
if {$project_menu_locked} {return}
@@ -5152,12 +5353,6 @@ namespace eval X {
if {$critical_procedure_in_progress} {return}
set critical_procedure_in_progress 1
- if {[lindex $args 0] == 1} {
- set current_file_only 1
- } {
- set current_file_only 0
- }
-
# Clear program timer
$actualProject simulator_clear_overall_time
@@ -5185,7 +5380,7 @@ namespace eval X {
}
# Inform code memory hexadecimal editor about that
- set idx [lsearch -exact -ascii $opended_code_mem_windows [string trimleft $actualProject {:}]]
+ set idx [lsearch -exact -ascii $opened_code_mem_windows [string trimleft $actualProject {:}]]
if {$idx != -1} {
[lindex $code_mem_window_objects $idx] simulator_stared_stopped 0
}
@@ -5205,7 +5400,7 @@ namespace eval X {
set full_file_name [$actualProject editor_procedure {} getFileName {}]
set language [$actualProject editor_procedure {} get_language {}]
set relative_name [lindex $full_file_name 1]
- } {
+ } else {
set ext [string trimleft [file extension $relative_name] {.}]
if {$ext == {c} || $ext == {h} || $ext == {cxx} || $ext == {cpp} || $ext == {cc}} {
set language 1
@@ -5219,7 +5414,7 @@ namespace eval X {
set full_file_name [file rootname $full_file_name]
if {$language == 1} {
append full_file_name {.cdb}
- } {
+ } else {
append full_file_name {.adf}
}
@@ -5252,10 +5447,11 @@ namespace eval X {
}]} then {
# MD5 hash verification failed -> ask for recompilation
- if {($language == 0 || $language == 1) && [verify_md5_hashes 1 $expected_md5s]} {
+ if {($language == 0 || $language == 1) && [verify_md5_hashes 1 $expected_md5s [file dirname $full_file_name]]} {
# Ask for recompilation
set response [
tk_messageBox \
+ -parent . \
-icon question \
-type yesno \
-default {yes} \
@@ -5272,6 +5468,7 @@ namespace eval X {
# (0) Compilation failed
if {!$compilation_result} {
tk_messageBox \
+ -parent . \
-icon error \
-type ok \
-title [mc "Compilation failed"] \
@@ -5288,12 +5485,13 @@ namespace eval X {
# Ask for recompilation
set response [
tk_messageBox \
+ -parent . \
-icon question \
-type yesno \
-title [mc "File not found"] \
-message [mc "Simulator data file not found.\nDo you want create it ?"]
]
- if {$response == {no}} {
+ if {$response != {yes}} {
set critical_procedure_in_progress 0
return
}
@@ -5303,6 +5501,7 @@ namespace eval X {
# (0) Compilation failed
if {!$compilation_result} {
tk_messageBox \
+ -parent . \
-icon error \
-type ok \
-title [mc "Compilation failed"] \
@@ -5331,6 +5530,7 @@ namespace eval X {
set simulator_file [open $full_file_name r]
}]} then {
tk_messageBox \
+ -parent . \
-icon warning \
-type ok \
-title [mc "Unable to start simulator"] \
@@ -5361,7 +5561,7 @@ namespace eval X {
# Raise tab "Simulator" on the bottom panel
if {[lsearch {Graph Simulator CVarsView} $bottom_page_ID] == -1} {
$actualProject bottomNB_show_up {Simulator}
- } {
+ } else {
$actualProject bottomNB_show_up $bottom_page_ID
}
@@ -5382,7 +5582,7 @@ namespace eval X {
$actualProject cvarsview_load_cdb $simulator_file
}
close $hex_file
- } {
+ } else {
$actualProject load_program_from_adf $simulator_file
}
@@ -5421,11 +5621,14 @@ namespace eval X {
if {$found} {
$actualProject Simulator_import_breakpoints \
$filename [$editor getBreakpoints]
- } {
+ } else {
$actualProject Simulator_import_breakpoints $filename {}
}
}
+ # Detect and report invalid breakpoints
+ $actualProject report_invalid_breakpoints
+
$actualProject now_frozen
# Set simulator cursor in editor to the first OP code
@@ -5436,7 +5639,7 @@ namespace eval X {
stepback_button_set_ena 0 ;# Disable StepBack controls
# Inform code memory hexadecimal editor about that
- set idx [lsearch -exact -ascii $opended_code_mem_windows [string trimleft $actualProject {:}]]
+ set idx [lsearch -exact -ascii $opened_code_mem_windows [string trimleft $actualProject {:}]]
if {$idx != -1} {
[lindex $code_mem_window_objects $idx] simulator_stared_stopped 1
}
@@ -5449,11 +5652,12 @@ namespace eval X {
## Verify MD5 hashes for the given files (only for current project)
# @parm Bool save_files - Save modified files mentioned in the given list
# @parm List hashes - {hash filename hash filename ...}
+ # @parm String dir - Directory where the function will search for the files mentioned in "$hashes"
# @return Int - Final result
# 0 == All correct
# 1 == Verification failed
# 2 == File access error
- proc verify_md5_hashes {save_files hashes} {
+ proc verify_md5_hashes {save_files hashes dir} {
variable actualProject ;# Object: Current project
# Local variables
@@ -5461,8 +5665,6 @@ namespace eval X {
set filenames {} ;# List of filenames only
set md5_hashes {} ;# List of md5 hashes only
- set dir [$actualProject cget -projectPath]
-
# Separate filenames and hashes
for {set i 0; set j 1} {$i < $len} {incr i 2; incr j 2} {
lappend filenames [file join $dir [lindex $hashes $j]]
@@ -5503,9 +5705,10 @@ namespace eval X {
set recorded_md5 [lindex $md5_hashes $i]
if {[catch {
set computed_md5 [::md5::md5 -hex -file [lindex $filenames $i]]
- }]} {
+ }]} then {
return 2
}
+
if {$recorded_md5 != $computed_md5} {
return 1
}
@@ -5529,16 +5732,16 @@ namespace eval X {
# File name is not valid -> invoke error message
if {
- $input_file == {} ||
- ![file exists $input_file] ||
- ![file isfile $input_file] ||
- (!$::MICROSOFT_WINDOWS && ![file writable $input_file]) ||
- (!$::MICROSOFT_WINDOWS && ![file readable $input_file])
- } {
- tk_messageBox \
- -parent . -icon warning \
- -title [mc "Error - MCU 8051 IDE"] \
- -message [mc "Unable to gain unlimited access to the given file"]
+ $input_file == {} ||
+ ![file exists $input_file] ||
+ ![file isfile $input_file] ||
+ (!$::MICROSOFT_WINDOWS && ![file writable $input_file]) ||
+ (!$::MICROSOFT_WINDOWS && ![file readable $input_file])
+ } then {
+ tk_messageBox \
+ -parent . -icon warning \
+ -title [mc "Error - MCU 8051 IDE"] \
+ -message [mc "Unable to gain unlimited access to the given file"]
# File name is valid -> normalize its content
} else {
# Progress dialog
@@ -5570,11 +5773,11 @@ namespace eval X {
# Destroy progress dialog
catch {destroy .prgDl}
- # No errors occured -> rewrite file
+ # No errors occurred -> rewrite file
if {!${::IHexTools::error_count}} {
if {[catch {
- set file [open $input_file w 420]
- }]} {
+ set file [open $input_file w 0640]
+ }]} then {
tk_messageBox \
-type ok \
-icon error \
@@ -5586,10 +5789,10 @@ namespace eval X {
puts -nonewline $file $data
close $file
}
- # Errors occured -> Invoke error message dialog
+ # Errors occurred -> Invoke error message dialog
} else {
# Create dialog window
- set dialog [toplevel .error_message_dialog -class {Error dialog} -bg {#EEEEEE}]
+ set dialog [toplevel .error_message_dialog -class {Error dialog} -bg ${::COMMON_BG_COLOR}]
# Create main frame (text widget and scrolbar)
set main_frame [frame $dialog.main_frame]
@@ -5619,7 +5822,7 @@ namespace eval X {
# Set window attributes
wm iconphoto $dialog ::ICONS::16::status_unknown
- wm title $dialog [mc "Error(s) occured while parsing IHEX file - %s" ${::APPNAME}]
+ wm title $dialog [mc "Error(s) occurred while parsing IHEX file - %s" ${::APPNAME}]
wm minsize $dialog 500 250
wm protocol $dialog WM_DELETE_WINDOW [mc "grab release %s; destroy %s" $dialog $dialog]
wm transient $dialog .
@@ -5633,7 +5836,7 @@ namespace eval X {
}
}
- ## Invkoke dialog for converting Binary files to Intel® HEX 8 files
+ ## Invoke dialog for converting Binary files to Intel® HEX 8 files
# @return void
proc __bin2hex {} {
variable hex__bin ;# Type of conversion
@@ -5642,7 +5845,7 @@ namespace eval X {
hex2bin2hex
}
- ## Invkoke dialog for converting Intel® HEX 8 files to Binary files
+ ## Invoke dialog for converting Intel® HEX 8 files to Binary files
# @return void
proc __hex2bin {} {
variable hex__bin ;# Type of conversion
@@ -5650,7 +5853,7 @@ namespace eval X {
hex2bin2hex
}
- ## Invkoke dialog for converting Simulator data files to Intel® HEX 8 files
+ ## Invoke dialog for converting Simulator data files to Intel® HEX 8 files
# @return void
proc __sim2hex {} {
variable hex__bin ;# Type of conversion
@@ -5658,7 +5861,7 @@ namespace eval X {
hex2bin2hex
}
- ## Invkoke dialog for converting Simulator data files to Binary files
+ ## Invoke dialog for converting Simulator data files to Binary files
# @return void
proc __sim2bin {} {
variable hex__bin ;# Type of conversion
@@ -5675,13 +5878,13 @@ namespace eval X {
if {$critical_procedure_in_progress} {return}
# Create dialog window
- set win [toplevel .hex2bin2hex_dialog -class {Conversion} -bg {#EEEEEE}]
+ set win [toplevel .hex2bin2hex_dialog -class {Conversion} -bg ${::COMMON_BG_COLOR}]
set mainframe [frame $win.frame]
# Label, Entry and Button "Input file"
- grid [Label $mainframe.lbl_input \
- -text [mc "Input file"] \
- -helptext {File to convert} \
+ grid [Label $mainframe.lbl_input \
+ -text [mc "Input file"] \
+ -helptext [mc "File to convert"] \
] -column 1 -row 1 -sticky w
grid [ttk::entry $mainframe.entry_input \
-textvariable X::input_file \
@@ -5827,11 +6030,11 @@ namespace eval X {
# Normalize name of input file
if {!$::MICROSOFT_WINDOWS} { ;# POSIX way
if {![regexp "^(~|/)" $input_file]} {
- set filename "[${X::actualProject} cget -ProjectDir]/$input_file"
+ set filename "[${::X::actualProject} cget -ProjectDir]/$input_file"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $input_file]} {
- set filename [file join [${X::actualProject} cget -ProjectDir] $input_file]
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $input_file]} {
+ set filename [file join [${::X::actualProject} cget -ProjectDir] $input_file]
}
}
set input_file [file normalize $input_file]
@@ -5839,17 +6042,21 @@ namespace eval X {
# Normalize name of output file
if {!$::MICROSOFT_WINDOWS} { ;# POSIX way
if {![regexp "^(~|/)" $output_file]} {
- set filename "[${X::actualProject} cget -ProjectDir]/$output_file"
+ set filename "[${::X::actualProject} cget -ProjectDir]/$output_file"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $output_file]} {
- set filename [file join [${X::actualProject} cget -ProjectDir] $output_file]
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $output_file]} {
+ set filename [file join [${::X::actualProject} cget -ProjectDir] $output_file]
}
}
set output_file [file normalize $output_file]
set win .hex2bin2hex_dialog
+ bind $win <KeyRelease-Return> {}
+ bind $win <KeyRelease-KP_Enter> {}
+ bind $win <KeyRelease-Escape> {}
+
# Diable entry widgets in file selection dialog
foreach wdg [subst {
$win.frame.entry_input
@@ -5888,7 +6095,9 @@ namespace eval X {
if {[file exists $output_file] && [file isfile $output_file]} {
if {![file writable $output_file]} {
tk_messageBox \
- -type ok -icon error -parent $win \
+ -type ok \
+ -icon error \
+ -parent $win \
-title [mc "Permission denied"] \
-message [mc "Unable to access file: %s" $output_file]
hex2bin2hex_CANCEL
@@ -5902,7 +6111,7 @@ namespace eval X {
-title [mc "Overwrite file"] \
-message [mc "A file name '%s' already exists. Are you sure you want to overwrite it ?" [file tail $output_file]]
] != {yes}
- } {
+ } then {
hex2bin2hex_CANCEL
return
}
@@ -5922,6 +6131,7 @@ namespace eval X {
tk_messageBox \
-type ok \
-icon warning \
+ -parent $win \
-title [mc "File not found - MCU 8051 IDE"] \
-message [mc "Unable to open file '%s'" $input_file]
@@ -5934,6 +6144,7 @@ namespace eval X {
0 { ;# Bin -> Hex
$status_label configure -text [mc "Loading file ..."]
::IHexTools::load_bin_data $data
+ set data {}
if {!${::IHexTools::abort} && !${::IHexTools::error_count}} {
$status_label configure -text [mc "Saving file ..."]
$progressbar configure -maximum 16
@@ -5944,6 +6155,7 @@ namespace eval X {
$status_label configure -text [mc "Loading file ..."]
$progressbar configure -maximum [::IHexTools::get_number_of_iterations $data]
::IHexTools::load_hex_data $data
+ set data {}
if {!${::IHexTools::abort} && !${::IHexTools::error_count}} {
$status_label configure -text [mc "Saving file ..."]
$progressbar configure -maximum 16
@@ -5954,6 +6166,7 @@ namespace eval X {
$status_label configure -text [mc "Loading file ..."]
$progressbar configure -maximum [::IHexTools::get_number_of_iterations $data]
::IHexTools::load_sim_data $data
+ set data {}
if {!${::IHexTools::abort} && !${::IHexTools::error_count}} {
$status_label configure -text [mc "Saving file ..."]
$progressbar configure -maximum 16
@@ -5964,19 +6177,23 @@ namespace eval X {
$status_label configure -text [mc "Loading file ..."]
$progressbar configure -maximum [::IHexTools::get_number_of_iterations $data]
::IHexTools::load_sim_data $data
+ set data {}
if {!${::IHexTools::abort} && !${::IHexTools::error_count}} {
$status_label configure -text [mc "Saving file ..."]
$progressbar configure -maximum 16
set data [::IHexTools::get_bin_data]
}
}
+ default {
+ set data {}
+ }
}
# Write output file
- if {$data != {}} {
+ if {[string length $data]} {
if {[catch {
- set file [open $output_file w 420]
- }]} {
+ set file [open $output_file w 0640]
+ }]} then {
tk_messageBox \
-type ok \
-icon error \
@@ -5993,13 +6210,10 @@ namespace eval X {
}
}
- # If errors occured -> Invoke error message dialog
+ # If errors occurred -> Invoke error message dialog
if {${::IHexTools::error_count}} {
- # Destroy previous dialog
- hex2bin2hex_CANCEL
-
# Create dialog window
- set dialog [toplevel .error_message_dialog -class {Error dialog} -bg {#EEEEEE}]
+ set dialog [toplevel .error_message_dialog -class {Error dialog} -bg ${::COMMON_BG_COLOR}]
# Create main frame (text and scrollbar)
set main_frame [frame $dialog.main_frame]
@@ -6015,9 +6229,9 @@ namespace eval X {
pack $main_frame -fill both -expand 1
# Create button "Close"
- pack [ttk::button $dialog.ok_button \
- -text [mc "Close"] \
- -command "grab release $dialog; destroy $dialog" \
+ pack [ttk::button $dialog.ok_button \
+ -text [mc "Close"] \
+ -command "grab release $dialog; destroy $dialog"\
]
$text insert end ${::IHexTools::error_string}
@@ -6028,7 +6242,7 @@ namespace eval X {
wm title $dialog [mc "Corrupted file - MCU 8051 IDE"]
wm minsize $dialog 520 250
wm protocol $dialog WM_DELETE_WINDOW "grab release $dialog; destroy $dialog"
- wm transient $dialog .
+ wm transient $dialog .hex2bin2hex_dialog
grab $dialog
raise $dialog
tkwait window $dialog
@@ -6061,13 +6275,21 @@ namespace eval X {
proc select_input_output {io mask master} {
variable IO ;# Bool: 1 == choose input file; 0 == choose output file
variable actualProject ;# Object: Current project
+ variable openedProjects ;# List of opened projects (Object references)
+
set IO $io
+ if {[llength $openedProjects]} {
+ set project_dir [${::X::actualProject} cget -ProjectDir]
+ } else {
+ set project_dir ${::env(HOME)}
+ }
+
# Invoke the dialog
catch {delete object fsd}
KIFSD::FSD fsd \
-title [mc "Open file - MCU 8051 IDE"] \
- -directory [$actualProject cget -projectPath] \
+ -directory $project_dir \
-defaultmask 0 -multiple 0 -filetypes [list \
[list [mc "Input file"] "*.$mask"] \
[list [mc "All files"] {*}] \
@@ -6078,17 +6300,17 @@ namespace eval X {
set filename [X::fsd get]
if {!$::MICROSOFT_WINDOWS} { ;# POSIX way
if {![regexp "^(~|/)" $filename]} {
- set filename "[${X::actualProject} cget -ProjectDir]/$filename"
+ set filename "$project_dir/$filename"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $filename]} {
- set filename [file join [${X::actualProject} cget -ProjectDir] $filename]
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $filename]} {
+ set filename [file join $project_dir $filename]
}
}
set filename [file normalize $filename]
if {${X::IO}} {
set X::input_file $filename
- } {
+ } else {
set X::output_file $filename
}
}
@@ -6128,37 +6350,41 @@ namespace eval X {
set filename [X::fsd get]
if {!$::MICROSOFT_WINDOWS} { ;# POSIX way
if {![regexp "^(~|/)" $filename]} {
- set filename "[${X::actualProject} cget -ProjectDir]/$filename"
+ set filename "[${::X::actualProject} cget -ProjectDir]/$filename"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $filename]} {
- set filename [file join [${X::actualProject} cget -ProjectDir] $filename]
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $filename]} {
+ set filename [file join [${::X::actualProject} cget -ProjectDir] $filename]
}
}
set filename [file normalize $filename]
if {
- ![file exists $filename] ||
- ![file isfile $filename] ||
- (!$::MICROSOFT_WINDOWS && ![file readable $filename])
- } {
- tk_messageBox -type ok -icon warning \
- -parent [X::fsd get_window_name] \
- -title [mc "File not found - MCU 8051 IDE"] \
- -message [mc "The selected file %s does not exist." $filename]
+ ![file exists $filename] ||
+ ![file isfile $filename] ||
+ (!$::MICROSOFT_WINDOWS && ![file readable $filename])
+ } then {
+ tk_messageBox \
+ -type ok \
+ -icon warning \
+ -parent . \
+ -title [mc "File not found - MCU 8051 IDE"] \
+ -message [mc "The selected file %s does not exist." $filename]
} else {
set data [X::decompile $filename]
if {$data != {}} {
- ${X::actualProject} background_open $data
+ ${::X::actualProject} background_open $data
if {[lindex ${X::simulator_enabled} ${X::actualProjectIdx}] == 0} {
- ${X::actualProject} switch_to_last
+ ${::X::actualProject} switch_to_last
}
- } {
+ } else {
tk_messageBox \
- -type ok -icon warning \
- -title [mc "Decompilation failed"] \
- -message [mc "Decompilation failed -- see messages for details"]
+ -type ok \
+ -parent . \
+ -icon warning \
+ -title [mc "Disassembly failed"] \
+ -message [mc "Disassembly failed -- see messages for details"]
}
}
}
@@ -6184,8 +6410,10 @@ namespace eval X {
if {[catch {
set file [open $filename r]
}]} then {
- tk_messageBox -parent . \
- -icon warning -type ok \
+ tk_messageBox \
+ -parent . \
+ -icon warning \
+ -type ok \
-title [mc "Unable to open file"] \
-message [mc "Unable to read file '%s'" $filename]
return {}
@@ -6201,7 +6429,7 @@ namespace eval X {
set Compiler::Settings::TEXT_OUPUT_COMMAND X::messages_text_append
set Compiler::Settings::UPDATE_COMMAND {update}
- # Perform decompilation
+ # Perform disassembly
set data {}
set ::IHexTools::update 1
::IHexTools::load_hex_data [read $file]
@@ -6223,7 +6451,7 @@ namespace eval X {
messages_text_append [mc "FAILED"]
}
- # Free resources reserved during decompilation
+ # Free resources reserved during disassembly
::IHexTools::free_resources
return $data
@@ -6267,7 +6495,7 @@ namespace eval X {
if {$last_WIN_GEOMETRY == [wm geometry .]} {
return
# Refresh last window geometry variable
- } {
+ } else {
set last_WIN_GEOMETRY [wm geometry .]
}
@@ -6279,10 +6507,9 @@ namespace eval X {
set ::last_WIN_GEOMETRY_width ${::WIN_GEOMETRY_width}
foreach project $openedProjects {
catch {
- $project bottomNB_redraw_pane
- }
- catch {
$project leftpanel_redraw_pane
+ $project right_panel_redraw_pane
+ $project todo_panel_redraw_pane
}
}
}
@@ -6291,8 +6518,7 @@ namespace eval X {
set ::last_WIN_GEOMETRY_height ${::WIN_GEOMETRY_height}
foreach project $openedProjects {
catch {
- $project right_panel_redraw_pane
- $project todo_panel_redraw_pane
+ $project bottomNB_redraw_pane
}
}
}
@@ -6302,7 +6528,7 @@ namespace eval X {
# @return void
proc __about {} {
# Create dialog window
- set win [toplevel .about -class [mc "About dialog"] -bg {#EEEEEE}]
+ set win [toplevel .about -class [mc "About dialog"] -bg ${::COMMON_BG_COLOR}]
# Create dialog header
pack [label $win.header \
@@ -6314,18 +6540,29 @@ namespace eval X {
-family {helvetica}]
] -side top -pady 5
+ # Display short information about current translation
+ set translation_info "Translated into _Language_ by _Name_ (_country_) <_email_>"
+ if {[mc $translation_info] != $translation_info} {
+ pack [label $win.trans_info \
+ -text [mc $translation_info] \
+ -font [font create \
+ -size -12 \
+ -family {helvetica}]
+ ] -side top -pady 2
+ }
+
+
# Create notebook
- set nb [ttk::notebook $win.nb]
+ set nb [ModernNoteBook $win.nb]
# Create tab "About"
- set about_tab [frame $nb.about_tab]
- $nb add $about_tab -text [mc "About"]
- pack [text $about_tab.text \
- -width 0 -height 0 -cursor left_ptr \
- -yscrollcommand "$about_tab.scrollbar set" \
- -font [font create \
- -size -12 \
- -family {helvetica}] \
+ set about_tab [$nb insert end {About} -text [mc "About"]]
+ pack [text $about_tab.text \
+ -width 0 -height 0 -cursor left_ptr \
+ -yscrollcommand "$about_tab.scrollbar set" \
+ -font [font create \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -family {helvetica}] \
] -fill both -expand 1 -side left
pack [ttk::scrollbar $about_tab.scrollbar \
-orient vertical \
@@ -6333,24 +6570,21 @@ namespace eval X {
] -fill y -side right
# fill in the about tab
$about_tab.text insert end "${::APPNAME}\n"
- $about_tab.text insert end [mc "\tComplete IDE for MCS-51 based microconrollers.\n"]
- $about_tab.text insert end [mc "\tThis program is witten for POSIX Systems\n"]
+ $about_tab.text insert end [mc "An open source IDE for MCS-51 based microconrollers for POSIX Systems, this software is licenced under the GNU GPL v2 licence. You can find more at the project web page http://mcu8051ide.sourceforge.net\n"]
+ $about_tab.text insert end "\n(c) 2007, 2008, 2009, 2010, 2011, 2012 Martin Ošmera <mailto:martin.osmera@gmail.com>\n"
if {$::MICROSOFT_WINDOWS} {
- $about_tab.text insert end [mc "\tYOU ARE CURRENTLY USING VERSION FOR Microsoft® Windows®\n"]
+ $about_tab.text insert end "\n"
+ $about_tab.text insert end [mc "You are currently using version for Microsoft® Windows®.\n"]
+ $about_tab.text insert end "(This version was made using the FreeWrap tool, by Dennis R. LaBelle <freewrapmgr@users.sourceforge.net>.)\n"
}
- $about_tab.text insert end "\n(c) Martin Ošmera <martin.osmera@gmail.com>\n"
- $about_tab.text insert end [mc "Web: http://mcu8051ide.sourceforge.net\n"]
- $about_tab.text insert end [mc "Please post suggestions and comments at http://mcu8051ide.sf.net\n"]
- $about_tab.text insert end [mc "\n\nThanks to Kostya V. Ivanov for bug fixes.\n"]
- $about_tab.text insert end [mc "Thanks to SDCC development team for their great work !\n"]
- $about_tab.text insert end [mc "Thanks to %s for their help during development\n" "Fabricio Alcalde, Shakthi Kannan, Miroslav Hradílek, Kostya V. Ivanov"]
+ create_link_tag_in_text_widget $about_tab.text
+ convert_all_https_to_links $about_tab.text
# Finalize text widget creation
$about_tab.text configure -state disabled
# Create tab "Thanks to"
- set thanks_tab [frame $nb.thanks_tab]
- $nb add $thanks_tab -text [mc "Thanks to"]
+ set thanks_tab [$nb insert end {Thanks} -text [mc "Thanks to"]]
pack [text $thanks_tab.text \
-width 0 -height 0 -cursor left_ptr \
-yscrollcommand "$thanks_tab.scrollbar set" \
@@ -6360,73 +6594,44 @@ namespace eval X {
-command "$thanks_tab.text yview" \
] -fill y -side right
-
- $thanks_tab.text insert end [mc "Thanks to Fabricio Alcalde for bug reports and suggestions\n"]
- $thanks_tab.text insert end [mc "Thanks to Miroslav Hradílek for bug reports\n"]
+ $thanks_tab.text insert end [mc "Special thanks to Kara Blackowiak (USA) for submitting various help file fixes.\n\n"]
+ $thanks_tab.text insert end [mc "Thanks to Yuanhui Zhang for bug reports and help with debugging.\n"]
+ $thanks_tab.text insert end [mc "Thanks to Fabricio Alcalde for bug reports and suggestions.\n"]
+ $thanks_tab.text insert end [mc "Thanks to Marek Nožka for help with debugging.\n"]
+ $thanks_tab.text insert end [mc "Thanks to Miroslav Hradílek for bug reports.\n"]
+ $thanks_tab.text insert end [mc "Thanks to Trevor Spiteri for help with debugging (patches) the HD44780 simulator.\n"]
$thanks_tab.text insert end [mc "Thanks to Kostya V. Ivanov for significant bug fixes.\n"]
- $thanks_tab.text insert end [mc "Thanks to Shakthi Kannan for including this IDE in FEL\n\n"]
- $thanks_tab.text insert end [mc "SDCC developers:\n"]
- $thanks_tab.text insert end "\tBela Torok\n"
- $thanks_tab.text insert end "\tBernhard Held\n"
- $thanks_tab.text insert end "\tBorut Ražem\n"
- $thanks_tab.text insert end "\tDave Helton\n"
- $thanks_tab.text insert end "\tDaniel Drotos\n"
- $thanks_tab.text insert end "\tErik Petrich\n"
- $thanks_tab.text insert end "\tFrieder Ferlemann\n"
- $thanks_tab.text insert end "\tHans Dorn\n"
- $thanks_tab.text insert end "\tJerome Bessiere\n"
- $thanks_tab.text insert end "\tJesus Calvino-Fraga\n"
- $thanks_tab.text insert end "\tJohan Knol\n"
- $thanks_tab.text insert end "\tAlex Karahalios\n"
- $thanks_tab.text insert end "\tKarl Bongers\n"
- $thanks_tab.text insert end "\tKlaus Flittner\n"
- $thanks_tab.text insert end "\tKlaus Martin Hennemann\n"
- $thanks_tab.text insert end "\tKevin Vigor\n"
- $thanks_tab.text insert end "\tMaarten Brock\n"
- $thanks_tab.text insert end "\tMartin Dubuc\n"
- $thanks_tab.text insert end "\tMartin Helmling\n"
- $thanks_tab.text insert end "\tMichael Hope\n"
- $thanks_tab.text insert end "\tMichael Schmitt\n"
- $thanks_tab.text insert end "\tPaul Stoffregen\n"
- $thanks_tab.text insert end "\tSandeep Dutta\n"
- $thanks_tab.text insert end "\tScott Dattalo\n"
- $thanks_tab.text insert end "\tErik Petrich\n"
- $thanks_tab.text insert end "\tStephen M. Kenton\n"
- $thanks_tab.text insert end "\tSlade Rich\n"
- $thanks_tab.text insert end "\tShawn Masters\n"
- $thanks_tab.text insert end "\tPhilipp Krause\n"
- $thanks_tab.text insert end "\tStephen Williams\n"
- $thanks_tab.text insert end "\tRaphael Neider\n"
- $thanks_tab.text insert end "\tAnton Voloshin\n"
- $thanks_tab.text insert end "\tVangelis Rokas\n"
- $thanks_tab.text insert end "\tWim Lewis\n"
- $thanks_tab.text insert end [mc "\n(Please post suggestions to %s)\n" "martin.osmera@gmail.com"]
+ $thanks_tab.text insert end [mc "Thanks to Shakthi Kannan for including this IDE in FEL.\n\n"]
+ $thanks_tab.text insert end [mc "Thanks to all the SDCC developers.\n"]
$thanks_tab.text configure -state disabled
- # Create tab "Licence"
- set licence_tab [frame $nb.licence_tab]
- $nb add $licence_tab -text [mc "Licence"]
- pack [text $licence_tab.text \
- -width 0 -height 0 \
- -yscrollcommand "$licence_tab.scrollbar set" \
+ # Create tab "License"
+ set license_tab [$nb insert end {License} -text [mc "License"]]
+ pack [text $license_tab.text \
+ -width 0 -height 0 \
+ -yscrollcommand "$license_tab.scrollbar set" \
+ -font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size -12 \
+ ] \
] -fill both -expand 1 -side left
- pack [ttk::scrollbar $licence_tab.scrollbar \
+ pack [ttk::scrollbar $license_tab.scrollbar \
-orient vertical \
- -command "$licence_tab.text yview" \
+ -command "$license_tab.text yview" \
] -fill y -side right
- # Fill in the licence tab
- if {[file exists "${::LIB_DIRNAME}/../data/licence.txt"]} {
- $licence_tab.text insert end [read [open "${::LIB_DIRNAME}/../data/licence.txt" {r}]]
- } {
- $licence_tab.text insert end [mc "FILE \"licence.txt\" WAS NOT FOUND\n\n"]
- $licence_tab.text insert end [mc "Text of the licence agreement is not availble,\n"]
- $licence_tab.text insert end [mc "please check your instalation."]
+ # Fill in the license tab
+ if {[file exists "${::ROOT_DIRNAME}/data/license.txt"]} {
+ $license_tab.text insert end [read [open "${::ROOT_DIRNAME}/data/license.txt" {r}]]
+ } else {
+ $license_tab.text insert end [mc "FILE \"license.txt\" WAS NOT FOUND\n\n"]
+ $license_tab.text insert end [mc "Text of the license agreement is not available,\n"]
+ $license_tab.text insert end [mc "please check your installation."]
}
- $licence_tab.text configure -state disabled
+ $license_tab.text configure -state disabled
# Pack NoteBook
- pack $nb -fill both -expand 1 -side top -padx 10
- $nb select $about_tab
+ pack [$nb get_nb] -fill both -expand 1 -side top -padx 10
+ $nb raise {About}
# Create button "Close"
pack [ttk::button $win.close \
-text [mc "Close"] \
@@ -6487,19 +6692,19 @@ namespace eval X {
-parent . \
-icon warning \
-type ok \
- -title [mc "Sorry, unable to compile"] \
+ -title [mc "Sorry, unable to comply"] \
-message [mc "Unable to indent C source without program indent, MCU 8051 IDE is unable to localize this program on Microsoft Windows operating system. So this feature is not available in version for MS Windows. Correction of this limitation is planed but right now it's not available."]
set critical_procedure_in_progress 0
return
}
# Check for program "indent"
- if {!${::PROGRAM_AVALIABLE(indent)}} {
+ if {!${::PROGRAM_AVAILABLE(indent)}} {
tk_messageBox \
-parent . \
-icon warning \
-type ok \
- -title [mc "Unable to compile"] \
+ -title [mc "Unable to comply"] \
-message [mc "Unable to indent C source without program indent, please install indent and restart MCU 8051 IDE."]
set critical_procedure_in_progress 0
return
@@ -6520,14 +6725,14 @@ namespace eval X {
-parent . \
-icon warning \
-type ok \
- -title [mc "Unable to compile"] \
+ -title [mc "Unable to comply"] \
-message [mc "Unable to indent C source code.\n\n%s" $result]
- } {
+ } else {
$actualProject filelist_reload_file
}
# Assembly language
- } {
+ } else {
# Prepare
set reformat_code_abort 0 ;# Reset auto indention abort flag
set editor_lines [$actualProject editor_linescount] ;# Number of lines in the editor
@@ -6545,10 +6750,10 @@ namespace eval X {
create_progress_bar .prgDl \
. \
{} \
- "Reformating code" \
+ [::mc "Reformatting code"] \
::X::compilation_progress \
$max \
- [mc "Reformating code"] \
+ [mc "Reformatting code"] \
::ICONS::16::filter \
[mc "Abort"] \
{::X::reformat_code_stop}
@@ -6568,7 +6773,9 @@ namespace eval X {
$editor configure -autoseparators 1
# Finalize
- catch {destroy .prgDl ;# Destroy progress dialog}
+ catch {
+ destroy .prgDl ;# Destroy progress dialog
+ }
}
set critical_procedure_in_progress 0
}
@@ -6591,7 +6798,8 @@ namespace eval X {
set new_content {} ;# Resulting string
# Parse input data (line by line)
- foreach line [split $data "\n"] {
+ set data [split $data "\n"]
+ foreach line $data {
if {$reformat_code_abort} {break} ;# Conditional abort
incr idx ;# Increment line number
@@ -6612,7 +6820,7 @@ namespace eval X {
# Determinate line with replaced strings and chars with underscores
set line_tmp $line
- while 1 {
+ while {1} {
if {![regexp {'[^']+'} $line_tmp str]} {break}
set len [string length $str]
regsub {'[^']+'} $line_tmp [string repeat {_} $len] line_tmp
@@ -6626,7 +6834,7 @@ namespace eval X {
set line [string range $line 0 [expr {$commentBegin - 1}]]
}
- # Determinate fields 0..2
+ # Determinate fields 0 and 1
set pos 0
for {set j 0} {$j < 2} {incr j} {
if {![regexp {^\s*[^\s]+} $line_tmp str]} {break}
@@ -6642,32 +6850,46 @@ namespace eval X {
# Remove leading white space from Field 2
set field_2 [regsub {^\s+} $line {}]
+ # Handle situation when there is no space between label and the 1st field
+ if {[regexp {[^\s:]+:[^\s:]+} $field_0]} {
+ set j [string first {:} $field_0]
+ append field_1 $field_2
+ set field_2 $field_1
+ set field_1 [string range $field_0 [expr {$j + 1}] end]
+ set field_0 [string range $field_0 0 $j]
+ }
+
# Field 1 >> Field 2; Field 0 -> Field 1; "" -> Field 0;
+ if {[string index $field_1 0] == {.}} {
+ set field_1_without_leading_dot [string range $field_1 1 end]
+ } else {
+ set field_1_without_leading_dot $field_1
+ }
if {
- [regexp {^\w+$} $field_0] &&
- ![regexp {^\d} $field_0] &&
- [lsearch -exact -ascii ${::ASMsyntaxHighlight::directive_type2} \
- [string toupper $field_1]] == -1
- } {
- append field_1 $field_2
- set field_2 $field_1
- set field_1 {}
- if {[string toupper $field_0] != {ENDM}} {
- set field_1 $field_0
- set field_0 {}
- }
+ [regexp {^\.?\w+$} $field_0] &&
+ ![regexp {^\d} $field_0] &&
+ [lsearch -exact -ascii ${::ASMsyntaxHighlight::directive_type2} \
+ [string toupper $field_1_without_leading_dot]] == -1
+ } then {
+ append field_1 $field_2
+ set field_2 $field_1
+ set field_1 {}
+ if {[string toupper $field_0] != {ENDM} && [string toupper $field_0] != {.ENDM}} {
+ set field_1 $field_0
+ set field_0 {}
+ }
}
# If line contains only comment then Field 3 -> Field 1
if {
- $field_3 != {} &&
- $field_0 == {} &&
- $field_1 == {} &&
- $field_2 == {} &&
- $commentBegin != 0
- } {
- set field_1 $field_3
- set field_3 {}
+ $field_3 != {} &&
+ $field_0 == {} &&
+ $field_1 == {} &&
+ $field_2 == {} &&
+ $commentBegin != 0
+ } then {
+ set field_1 $field_3
+ set field_3 {}
}
# Adjust space between operans/arguments
@@ -6675,13 +6897,13 @@ namespace eval X {
if {$field_2 != {}} {
# Strings/Chars to underscores
set field_2_tmp $field_2
- while 1 {
+ while {1} {
if {![regexp {'[^']+'} $field_2_tmp str]} {break}
set len [string length $str]
regsub {'[^']+'} $field_2_tmp [string repeat {_} $len] field_2_tmp
}
# Recomposite Field 2
- while 1 {
+ while {1} {
set i [string first {,} $field_2_tmp]
if {$i == -1} {
append field_2_new {, }
@@ -6714,7 +6936,7 @@ namespace eval X {
set correction 0
set falseLength [string length $line]
- while 1 {
+ while {1} {
set i [string first "\t" $line [expr {$i + 1}]]
if {$i == -1} {break}
@@ -6756,18 +6978,18 @@ namespace eval X {
if {$critical_procedure_in_progress} {return}
# Create dialog window
- set win [toplevel .cleanup -class [mc "Options dialog"] -bg {#EEEEEE}]
+ set win [toplevel .cleanup -class [mc "Options dialog"] -bg ${::COMMON_BG_COLOR}]
set bottom_frame [frame $win.buttonFrame]
set status_bar_lbl [label $bottom_frame.status_bar \
-justify left -anchor w \
]
# Create label frames
- set backup_labelframe [ttk::labelframe $win.backup_labelframe\
- -text [mc "Backup files"] \
+ set backup_labelframe [ttk::labelframe $win.backup_labelframe \
+ -text [mc "Backup files"] \
]
set other_labelframe [ttk::labelframe $win.other_labelframe \
- -text [mc "Other files"] \
+ -text [mc "Other files"] \
]
set i 0 ;# Checkbutton index
@@ -6794,7 +7016,7 @@ namespace eval X {
{HTML files}
{TeX sources}
{Register watches definition files}
- {MCU 8051 IDE Project}
+ {MCU 8051 IDE project}
{Hibernated programs}
{SDCC debug files}
{SDCC IHEX8 object files}
@@ -6804,7 +7026,7 @@ namespace eval X {
{C sources}
{C headers}
{Virtual Hardware Component}
- {Virtual HardWare}
+ {Virtual Hardware}
{Text files}
{All backup files}
} \
@@ -6816,7 +7038,11 @@ namespace eval X {
-variable __cleanup_$ID \
]
grid $button -row $row -column $col -sticky w -padx 5
- if {[lindex $::CONFIG(CLEANUP_OPTIONS) $i] != {0}} {$button select} {$button deselect}
+ if {[lindex $::CONFIG(CLEANUP_OPTIONS) $i] != {0}} {
+ $button select
+ } else {
+ $button deselect
+ }
bind $button <Enter> "$status_bar_lbl configure -text {$helptext}"
bind $button <Leave> "$status_bar_lbl configure -text {}"
@@ -6850,7 +7076,7 @@ namespace eval X {
{TeX sources}
{Hibernated programs}
{ASL: NoICE-compatible command file}
- {ASL: Atmel debub file used by the AVR tools}
+ {ASL: Atmel debug file used by the AVR tools}
{SDCC: The memory map for the load module}
{ASL object files}
{Macro definition file}
@@ -6862,7 +7088,7 @@ namespace eval X {
{SDCC debug files}
{SDCC: A file with a summary of the memory usage}
{SDCC: Linker script}
- {SDCC: Symbol listing for the sourcefile}
+ {SDCC: Symbol listing for the source file}
{OMF-51 object files}
{SDCC: Listing file updated with linkedit information}
{MD5 hashes for C source files}
@@ -6876,7 +7102,11 @@ namespace eval X {
-variable __cleanup__$ID \
]
grid $button -row $row -column $col -sticky w -padx 5
- if {[lindex $::CONFIG(CLEANUP_OPTIONS) $i] != {0}} {$button select} {$button deselect}
+ if {[lindex $::CONFIG(CLEANUP_OPTIONS) $i] != {0}} {
+ $button select
+ } else {
+ $button deselect
+ }
bind $button <Enter> "$status_bar_lbl configure -text {$helptext}"
bind $button <Leave> "$status_bar_lbl configure -text {}"
@@ -6909,13 +7139,13 @@ namespace eval X {
-compound left \
-image ::ICONS::16::ok \
-command {X::cleanup_OK} \
- ] -side left
+ ] -side left -padx 2
pack [ttk::button $win.buttonFrame.cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
-command {X::cleanup_CANCEL} \
- ] -side left
+ ] -side left -padx 2
pack $bottom_frame -pady 5 -fill x -padx 5
# Events binding (Enter == Ok; Esc == Cancel)
@@ -6949,74 +7179,95 @@ namespace eval X {
# @return void
proc cleanup_OK {} {
variable cleanup_masks ;# GLOB patterns
+ variable cleanup_files ;# List: Files marked for potential removal
variable actualProject ;# Object: Current project
- # Invoke confirmation dialog
- if {
- ![tk_messageBox \
- -parent . \
- -icon question \
- -type yesno \
- -title [mc "Cleanup project folder"] \
- -message [mc "Are you sure ?"]
- ]
- } {
- return
- }
-
# Determinate list of GLOB expressions of selected for removal
set dir [$actualProject cget -projectPath]
- set files [list]
+ set cleanup_files [list]
foreach mask $cleanup_masks bool $::CONFIG(CLEANUP_OPTIONS) {
if {$bool} {
- lappend files $mask
+ lappend cleanup_files $mask
}
}
# Determinate list of files selected for removal
set files_n [list]
catch { ;# For Microsoft Windows it has to be enclosed by catch
- foreach f $files {
+ foreach f $cleanup_files {
append files_n { } [glob -directory $dir -nocomplain -type f $f]
}
}
- set files $files_n
+ set cleanup_files [lsort -unique $files_n]
+
+ # Finalize
+ cleanup_ask
+ }
+
+ ## Proceed with the project folder clean up
+ # @return void
+ proc cleanup_PROCEED {} {
+ variable cleanup_files ;# List: Files marked for potential removal
+
+ # Invoke confirmation dialog
+ if {
+ [tk_messageBox \
+ -parent .cleanup_ask \
+ -icon question \
+ -type yesno \
+ -title [mc "Cleanup project folder"] \
+ -message [mc "Are you sure ?"] \
+ ] != {yes}
+ } then {
+ return
+ }
# Remove the specified files
- set result {}
- foreach file $files {
- if {![catch {
+ set count 0
+ foreach file $cleanup_files {
+ if {[catch {
file delete -force -- $file
- }]} {
- lappend result $file
+ }]} then {
+ puts stderr "Unable to delete file: $file"
+ } else {
+ incr count
}
}
- # Finalize
+ tk_messageBox \
+ -parent .cleanup_ask \
+ -icon info \
+ -type ok \
+ -title [mc "Cleanup project folder"] \
+ -message [mc "%d file(s) removed." $count]
+
cleanup_CANCEL ;# Close dialog window
- cleanup_finish $result ;# Invoke results dialog
}
## Close dialog "Clean up project folder" -- auxiliary procedure for 'cleanup_OK'
# @return void
proc cleanup_CANCEL {} {
+ variable cleanup_files ;# List: Files marked for potential removal
+ set cleanup_files [list]
+
destroy .cleanup
}
## Show results of files removal -- auxiliary procedure for 'cleanup_OK'
- # @parm List files - list of removed files
# @return void
- proc cleanup_finish {files} {
+ proc cleanup_ask {} {
+ variable cleanup_files ;# List: Files marked for potential removal
+
# Create dialog window
- set win [toplevel .cleanup_finish -class {Results} -bg {#EEEEEE}]
+ set win [toplevel .cleanup_ask -class {Confirmation dialog} -bg ${::COMMON_BG_COLOR}]
# Create window header
- pack [label $win.header_label \
- -text [mc "These files were removed"] \
- -font [font create \
- -size -20 \
+ pack [label $win.header_label \
+ -text [mc "These files will be removed"] \
+ -font [font create \
+ -size [expr {int(-20 * $::font_size_factor)}] \
-family {helvetica}]
- ] -anchor center
+ ] -anchor center -side top -fill x
# Create top frame (text widget and scrollbar)
set frame [frame $win.top_frame]
@@ -7033,7 +7284,12 @@ namespace eval X {
]
# Fill in the text widget
- foreach txt $files {
+ foreach txt $cleanup_files {
+ # On MS Windows change '/' to '\' in file path
+ if {$::MICROSOFT_WINDOWS} {
+ regsub -all {/} $txt "\\" txt
+ }
+
$text insert end $txt
$text insert end "\n"
}
@@ -7042,20 +7298,27 @@ namespace eval X {
# Pack scrollbar and the text widget
pack $scrollbar -side right -fill y
pack $text -side left -fill both -expand 1
+ pack $frame -side top -fill both -expand 1 -pady 5 -padx 5
# Pack the top frame and create button "Ok"
- pack $frame -fill both -expand 1
- pack [ttk::button $win.ok_button \
- -text [mc "Ok"] \
+ set but_frame [frame $win.but_frame]
+ pack [ttk::button $but_frame.ok_button \
+ -text [mc "Proceed"] \
-compound left \
-image ::ICONS::16::ok \
- -command "destroy $win" \
- ] -anchor center -side bottom
-
- # Events binding (Enter/Escape == Ok)
- bind $win <KeyRelease-Return> "destroy $win; break"
- bind $win <KeyRelease-KP_Enter> "destroy $win; break"
- bind $win <KeyRelease-Escape> "destroy $win; break"
+ -command "
+ ::X::cleanup_PROCEED
+ destroy $win
+ " \
+ ] -side left -padx 5
+ pack [ttk::button $but_frame.cancel_button \
+ -text [mc "Cancel"] \
+ -compound left \
+ -image ::ICONS::16::button_cancel \
+ -command [list destroy $win] \
+ ] -side left -padx 5
+ focus -force $but_frame.ok_button
+ pack $but_frame -side bottom -anchor e -pady 5 -pady 5
# Set window attributes -- modal window
wm iconphoto $win ::ICONS::16::emptytrash
@@ -7094,12 +7357,17 @@ namespace eval X {
-icon warning \
-type yesno \
-title [mc "Confirm termination - MCU 8051 IDE"] \
- -message [mc "This process is alredy in progress. Do you want to terminate it ?"]
+ -message [mc "This process is already in progress. Do you want to terminate it ?"]
] == {yes}} {
if {!$::MICROSOFT_WINDOWS} { ;# There is no kill command on Microsoft Windows
if {$custom_command_PID($cmd_num) != {}} {
- catch {
- exec -- kill -9 $custom_command_PID($cmd_num) &
+ foreach pid $custom_command_PID($cmd_num) {
+ if {$pid == [pid] || $pid == 0} {
+ continue
+ }
+ catch {
+ exec -- /bin/sh -c "kill -s 9 \$(ps -o pid --no-headers --ppid $pid)"
+ }
}
}
}
@@ -7112,13 +7380,14 @@ namespace eval X {
# Invoke confiramation dialog (if requested)
if {[lindex $custom_command_options($cmd_num) 0]} {
if {
- ![tk_messageBox \
- -parent . \
- -icon question \
- -type yesno \
+ [tk_messageBox \
+ -parent . \
+ -icon question \
+ -type yesno \
-title [mc "Confirmation required"] \
- -message [mc "Do you really want to execute\ncustom command %s ?" $cmd_num]]
- } {
+ -message [mc "Do you really want to execute\ncustom command %s ?" $cmd_num] \
+ ] != {yes}
+ } then {
set critical_procedure_in_progress 0
return
}
@@ -7137,20 +7406,22 @@ namespace eval X {
# Determinate editor object reference
set editor [$actualProject get_current_editor_object]
- if {[regexp {%URLS} $cmd]} {
- set URLS {}
+ regsub -all {%URL} $cmd {%URI} cmd
+
+ if {[regexp {%URIS} $cmd]} {
+ set URIS {}
foreach e [$actualProject cget -editors] {
set url [$e cget -fullFileName]
if {[regexp {\s} $url]} {
- append URLS "\"" $url "\"" { }
- } {
- append URLS $url { }
+ append URIS "\"" $url "\"" { }
+ } else {
+ append URIS $url { }
}
}
- regsub -all {%URLS} $cmd [string replace $URLS end end] cmd
+ regsub -all {%URIS} $cmd [string replace $URIS end end] cmd
}
- if {[regexp {%URL} $cmd]} {
- regsub -all {%URL} $cmd [$editor cget -fullFileName] cmd
+ if {[regexp {%URI} $cmd]} {
+ regsub -all {%URI} $cmd [$editor cget -fullFileName] cmd
}
if {[regexp {%directory} $cmd]} {
regsub -all {%directory} $cmd [$actualProject cget -projectPath] cmd
@@ -7178,7 +7449,7 @@ namespace eval X {
if {[regexp {%text} $cmd]} {
regsub -all {%text} $cmd [$editor getdata] cmd
}
- } {
+ } else {
if {[regsub -all {%(line|column|selection|text)} $cmd {} cmd]} {
tk_messageBox \
-parent . \
@@ -7191,12 +7462,19 @@ namespace eval X {
}
regsub -all "\a" $cmd {%} cmd
- # Execute specified command in a separate thread
+ ## Execute the specified command
set custom_command_NUM($cmd_num) $custom_command_counter
- set custom_command_PID($cmd_num) [exec -- tclsh \
- ${::LIB_DIRNAME}/custom_command.tcl [tk appname] \
- $custom_command_NUM($cmd_num) << $cmd & \
- ]
+ # Run in terminal
+ if {[lindex $custom_command_options($cmd_num) 3] && $::PROGRAM_AVAILABLE(urxvt)} {
+ exec_custom_cmd_in_terminal $cmd_num $cmd
+ custom_cmd_icon_reset $custom_command_NUM($cmd_num)
+ # Run normally
+ } else {
+ set custom_command_PID($cmd_num) [exec -- tclsh \
+ ${::LIB_DIRNAME}/custom_command.tcl [tk appname] \
+ $custom_command_NUM($cmd_num) << $cmd & \
+ ]
+ }
incr custom_command_counter
# Finalize
@@ -7215,7 +7493,7 @@ namespace eval X {
set i [custom_cmd_icon_reset $num]
if {$i == {}} {return}
- # Check if result dialogs are allowed
+ # Check if result dialogues are allowed
if {![lindex $custom_command_options($i) 1]} {return}
# Invoke results dialog
invoke_custom_cmd_dialog $i {#00DD00} [mc "Custom command finished"] $result
@@ -7233,12 +7511,107 @@ namespace eval X {
set i [custom_cmd_icon_reset $num]
if {$i == {}} {return}
- # Check if error dialogs are allowed
+ # Check if error dialogues are allowed
if {[lindex $custom_command_options($i) 2]} {return}
# Invoke error dialog
invoke_custom_cmd_dialog $i {#DD0000} [mc "Custom command failed"] $result
}
+ ## Execute custom command in terminal emulator
+ # @parm Int cmd_num - Number of the custom command to execute
+ # @parm String cmd - Command string to execute
+ # @return void
+ proc exec_custom_cmd_in_terminal {cmd_num cmd} {
+ variable custom_cmd_dialog_index ;# Index of results dialog (to keep win IDs unique)
+
+ incr custom_cmd_dialog_index
+
+ # Create dialog window
+ set win [toplevel .custom_cmd_dialog${custom_cmd_dialog_index} -class {Custom command running} -bg ${::COMMON_BG_COLOR}]
+
+ # Create dialog header
+ pack [label $win.header_label \
+ -compound left \
+ -text [mc "Custom command %s - MCU 8051 IDE" $cmd_num] \
+ -image ::ICONS::22::gear${cmd_num}_play \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-20 * $::font_size_factor)}] \
+ -weight bold \
+ ] \
+ ] -pady 5
+
+ # Create main frame (text widget and scrollbar)
+ set main_frame [frame $win.main_frame -container 1]
+ bind $main_frame <Destroy> [list destroy $win]
+ pack $main_frame -fill both -expand 1 -padx 5 -pady 5
+
+ # Set window attributes
+ wm iconphoto $win ::ICONS::16::gear
+ wm title $win [mc "Custom command %s - MCU 8051 IDE" $cmd_num]
+ wm minsize $win 550 300
+ wm protocol $win WM_DELETE_WINDOW {}
+ update
+
+ # Run terminal emulator
+ if {[catch {
+ set terminal_pid [exec -- urxvt \
+ -embed [expr [winfo id $main_frame]] \
+ -hold -sr -b 0 -w 0 -bg ${::Terminal::configuration(bg)}\
+ -fg ${::Terminal::configuration(fg)} \
+ -fn "xft:${::Terminal::configuration(font_family)}:pixelsize=${::Terminal::configuration(font_size)}" \
+ -e bash -i -c $cmd \
+ & \
+ ]
+ } result]} then {
+ destroy $win
+ tk_messageBox \
+ -parent . \
+ -icon warning \
+ -type ok \
+ -title [mc "Unknow error"] \
+ -message [mc "Unable to execute your script in the urxvt terminal emulator."]
+ puts stderr $result
+ } else {
+ wm protocol $win WM_DELETE_WINDOW [list ::X::close_custom_cmd_term $terminal_pid $win]
+ }
+ }
+
+ ## Close terminal emulator with a custom command
+ # @parm Int pid - Terminal PID
+ # @parm Widget dialog - Dialog window in which the terminal is mapped
+ # @return void
+ proc close_custom_cmd_term {pid dialog} {
+ # Get list of child processes of the terminal
+ set children [list]
+ catch {
+ set children [exec -- /bin/sh -c "ps -o pid --no-headers --ppid $pid"]
+ }
+
+ # Ask user, if he/she wishes to kill the children, if there are any
+ if {
+ [llength $children]
+ &&
+ [tk_messageBox \
+ -parent $dialog \
+ -icon question \
+ -type yesno \
+ -title [mc "Kill the script?"] \
+ -message [mc "Closing this window terminates all child processes of the terminal.\n\nDo you want to proceed?"] \
+ ] != {yes}
+ } then {
+ return
+ }
+
+ # Kill the terminal
+ if {[catch {
+ exec -- kill $pid &
+ }]} then {
+ puts stderr "Something went wrong here..."
+ puts stderr $::errorInfo
+ }
+ }
+
## Invoke dialog window showing results of some custom command
# -- auxiliary procedure for 'custom_cmd_error' and 'custom_cmd_finish'
# @parm Int i - Index of the custom command (0..2)
@@ -7252,18 +7625,18 @@ namespace eval X {
incr custom_cmd_dialog_index
# Create dialog window
- set win [toplevel .custom_cmd_dialog${custom_cmd_dialog_index} -class {Custom command finished} -bg {#EEEEEE}]
+ set win [toplevel .custom_cmd_dialog${custom_cmd_dialog_index} -class {Custom command finished} -bg ${::COMMON_BG_COLOR}]
# Create dialog header
- pack [label $win.header_label \
- -compound left \
- -fg $color \
- -text $label \
- -image ::ICONS::22::gear$i \
- -font [font create \
- -family {helvetica} \
- -size -20 \
- -weight bold \
+ pack [label $win.header_label \
+ -compound left \
+ -fg $color \
+ -text $label \
+ -image ::ICONS::22::gear$i \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-20 * $::font_size_factor)}] \
+ -weight bold \
] \
] -pady 5
@@ -7305,16 +7678,16 @@ namespace eval X {
wm transient $win .
}
- ## Set toolbar button icon to default and determinate index of cutom command
+ ## Set toolbar button icon to default and determinate index of custom command
# -- auxiliary procedure for 'custom_cmd_error' and 'custom_cmd_finish'
# @parm Int num - Command number
- # @return Int - index of the specified cutom command (by TID) or {} (means 'not found')
+ # @return Int - index of the specified custom command (by TID) or {} (means 'not found')
proc custom_cmd_icon_reset {num} {
variable custom_command_NUM ;# Array of custom command numbers
variable custom_command_PID ;# Array of custom command TIDs (Thread IDentifiers)
# Search for command index
- set found 0 ;# Bool: Coresponding index found
+ set found 0 ;# Bool: Corresponding index found
for {set i 0} {$i < 3} {incr i} {
if {[string equal $custom_command_NUM($i) $num]} {
set found 1
@@ -7344,46 +7717,71 @@ namespace eval X {
}
# Create dialog window
- set win [toplevel .welcome -class [mc "Welcome dialog"] -bg {#EEEEEE}]
+ set win [toplevel .welcome -class {Welcome dialog} -bg ${::COMMON_BG_COLOR}]
# Create header label
- pack [label $win.header_label \
- -compound left -fg {#0000DD} \
- -text [mc "Welcome to MCU 8051 IDE !"] \
- -font [font create \
- -family {helvetica} \
- -size -20 \
- -weight {bold} \
- -slant {italic} \
- ] \
+ pack [label $win.header_label \
+ -compound left -fg {#0000DD} \
+ -text [mc "Welcome to MCU 8051 IDE !"] \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-20 * $::font_size_factor)}] \
+ -weight {bold} \
+ -slant {italic} \
+ ] \
] -pady 10
+ # Create frame for the text widget and its scrollbar
+ set text_frame [frame $win.text_frame]
+
# Create text widget showing the dialog message
- set text [text $win.text \
- -bg {#EEEEEE} -takefocus 0 \
- -width 0 -heigh 0 -bd 0 \
- -cursor left_ptr \
- -wrap word \
- -font [font create \
- -family {helvetica} \
- -size -12 \
- ] \
+ set text [text $text_frame.text \
+ -bg ${::COMMON_BG_COLOR} -takefocus 0 \
+ -width 0 -heigh 0 -bd 0 \
+ -cursor left_ptr \
+ -wrap word \
+ -yscrollcommand [list $text_frame.scrollbar set] \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ ] \
+ ]
+
+ # Create scrollbar for the text widget
+ set scrollbar [ttk::scrollbar $text_frame.scrollbar \
+ -command [list $text yview] \
+ -orient vertical \
]
- pack $text -fill both -expand 1 -padx 15
+
+ # Pack scrollbar and the text widget
+ pack $text -side left -fill both -expand 1
+ pack $scrollbar -side right -fill y
+ pack $text_frame -fill both -expand 1 -padx 15
# Create button "Ok"
pack [ttk::button $win.ok_button \
-text [mc "Ok"] \
+ -compound left \
+ -image ::ICONS::16::ok \
-command "grab release $win; destroy $win" \
] -pady 5
# Create label for opening demostration project
set open_demo_label [label $text.open_demo_label \
-text [mc "Click here to open demonstration project."] \
- -justify left -fg {#00DD00} -cursor hand1 \
+ -justify left \
+ -fg {#0055FF} \
+ -cursor hand2 \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ ] \
+ -image ::ICONS::16::2_rightarrow \
+ -compound left \
+ -padx 5 \
]
- bind $open_demo_label <Enter> {%W configure -fg {#0000DD}}
- bind $open_demo_label <Leave> {%W configure -fg {#00DD00}}
+ bind $open_demo_label <Enter> {%W configure -fg {#00DD00}}
+ bind $open_demo_label <Leave> {%W configure -fg {#0055FF}}
bind $open_demo_label <Button-1> "
grab release $win
destroy $win
@@ -7392,59 +7790,76 @@ namespace eval X {
"
# Load images
- set image_new [image create photo -format png \
- -file "${::LIB_DIRNAME}/../icons/16x16/filenew.png"]
- set image_start [image create photo -format png \
- -file "${::LIB_DIRNAME}/../icons/16x16/launch.png"]
- set image_step [image create photo -format png \
- -file "${::LIB_DIRNAME}/../icons/16x16/goto.png"]
+ set image_new ::ICONS::16::filenew
+ set image_start ::ICONS::16::launch
+ set image_step ::ICONS::16::goto
+ set image_list0 ::ICONS::16::dot_r
+ set image_list1 ::ICONS::16::dot_g
+ set image_list2 ::ICONS::16::dot
# Create text tags
- $text tag configure bold -font [font create \
- -family {times} \
- -size -12 \
- -weight bold \
+ $text tag configure bold -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
]
- $text tag configure header -font [font create \
- -family {times} \
- -size -12 \
- -weight bold \
- -underline 1 \
- ] -foreground {#0000FF}
+ $text tag configure header -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
+ -underline 1 \
+ ] -foreground {#0000DD}
# Fill in the text widget
- $text insert end [mc "MCU 8051 IDE is fully featured Integrated Development Enviroment"]
- $text insert end [mc " for MCS-51 based microcontollers. It's written for POSIX Operating Systems (GNU/Linux, etc.) "]
+ $text insert end [mc "MCU 8051 IDE is a fully featured Integrated Development Environment"]
+ $text insert end [mc " for MCS-51 based microcontrollers. It's written for POSIX Operating Systems (GNU/Linux, etc.) "]
if {$::MICROSOFT_WINDOWS} {
$text insert end [mc "and since version 1.3.5 it is also available for Microsoft® Windows® operating system."]
}
$text insert end "\n\n"
$text insert end [mc "Main features:"]
$text tag add header {insert linestart} insert
- $text insert end [mc "\n\t- Editor with syntax highlight, validation and popup-based completion"]
- $text insert end [mc "\n\t- MCS-51 Assembler and Disassembler"]
- $text insert end [mc "\n\t- MCS-51 Simulator (not all MCUs are fully supported !)"]
- $text insert end [mc "\n\t- Support for C language (using C compiler SDCC)"]
- $text insert end [mc "\n\t- Partial support for some HW tools"]
- $text insert end [mc "\n\t- Project management"]
- $text insert end [mc "\n\t- Custom editable commands (using shell scripts)"]
- $text insert end [mc "\n\t- Dynamic help for instruction at the current line"]
- $text insert end [mc "\n\t- Hexadecimal editor for eXternal RAM, Expanded RAM, Code memory, etc."]
- $text insert end [mc "\n\t- Scientific calculator"]
- $text insert end [mc "\n\t- Simple hardware simulation (LED's, etc.)"]
- $text insert end [mc "\n\t- Graph showing voltage levels on ports\n\n"]
+ $text insert end "\n\t"
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Editor with syntax highlight, validation and popup-based completion\n\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "MCS-51 Assembler and Disassembler\n\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "MCS-51 Simulator (not all MCUs are fully supported!)\n\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Support for C language (using C compiler SDCC)\n\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Partial support for some HW tools\n\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Project management\n\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Custom editable commands (using shell scripts)\n\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Dynamic help for instruction at the current line\n\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Hexadecimal editor for eXternal RAM, Expanded RAM, Code memory, etc.\n\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Scientific calculator\n\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Simple hardware simulation (LED's, etc.)\n\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Graph showing voltage levels on ports\n\n"]
$text insert end [mc "Where to start:"]
$text tag add header {insert linestart} insert
$text insert end [mc "\n\t1. Create a new project"]
$text image create end -image $image_new -padx 5
- $text insert end [mc "\n\t\t- Enter project name\n"]
- $text insert end [mc "\t\t- Choose project directory\n"]
- $text insert end [mc "\t\t- Choose microcontroller (e.g. AT89S52)\n"]
+ $text insert end "\n\t\t"
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Enter project name\n\t\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Choose project directory\n\t\t"]
+ $text image create end -image $image_list1 -padx 5
+ $text insert end [mc "Choose microcontroller (e.g. AT89S52)\n"]
$text insert end [mc "\t2. Write your code in the opened editor and click on "]
$text image create end -image $image_start -padx 5
- $text insert end [mc " to start simulator\n"]
- $text insert end [mc "\t3. Step your program by clicking on "]
+ $text insert end [mc " to start the simulator\n"]
+ $text insert end [mc "\t3. Step through your program by clicking on "]
$text image create end -image $image_step -padx 5
$text insert end "\n\t----\n\t"
$text window create end -window $open_demo_label
@@ -7454,19 +7869,21 @@ namespace eval X {
$text insert end [mc "Web site:"]
$text tag add bold {insert linestart} insert
$text insert end "\thttp://mcu8051ide.sourceforge.net\n"
- $text insert end [mc "Author:"]
+ $text insert end [mc "Authors:"]
$text tag add bold {insert linestart} insert
- $text insert end "\tMartin Ošmera <martin.osmera@gmail.com>\n\n"
+ $text insert end "\tMartin Ošmera <martin.osmera@gmail.com>\n"
$text insert end [mc "Thank you for using/trying MCU 8051 IDE."]
$text tag add bold {insert linestart} insert
+ create_link_tag_in_text_widget $text
+ convert_all_https_to_links $text
$text configure -state disabled
# Set window attributes
wm iconphoto $win ::ICONS::16::info
wm title $win [mc "Welcome to MCU 8051 IDE"]
- wm minsize $win 580 600
+ wm minsize $win 580 400
wm protocol $win WM_DELETE_WINDOW "grab release $win; destroy $win"
wm transient $win .
catch {grab $win}
@@ -7476,7 +7893,12 @@ namespace eval X {
## Open demostration project -- auxiliary procedure for '__welcome_dialog'
# @return void
proc open_demo_project {} {
- Project::open_project_file "${::LIB_DIRNAME}/../demo/Demo project.mcu8051ide"
+ variable openedProjects ;# List of opened projects (Object references)
+
+ if {[Project::open_project_file "${::INSTALLATION_DIR}/demo/Demo project.mcu8051ide"]} {
+ # The demostration project is for reading only, it cannot be saved
+ [lindex $openedProjects end] set_read_only
+ }
}
## Invoke dialog "Change letter case"
@@ -7492,15 +7914,15 @@ namespace eval X {
if {$critical_procedure_in_progress} {return}
# Create dialog window
- set win [toplevel .change_letter_case -class [mc "Options dialog"] -bg {#EEEEEE}]
+ set win [toplevel .change_letter_case -class [mc "Options dialog"] -bg ${::COMMON_BG_COLOR}]
# Create dialog header
- pack [label $win.header \
- -compound left \
- -image ::ICONS::22::change_case \
- -text [mc "Change letter case"] \
- -font [font create \
- -size -20 \
+ pack [label $win.header \
+ -compound left \
+ -image ::ICONS::22::change_case \
+ -text [mc "Change letter case"] \
+ -font [font create \
+ -size [expr {int(-20 * $::font_size_factor)}] \
-family {times}]
] -side top -pady 5
@@ -7529,15 +7951,16 @@ namespace eval X {
{Hexadecimal number} {Octal number}
{Decimal number} {Binary number}
{Constant} {Generic number}
- {Comment} {Control sequentce}
+ {Comment} {Control sequence}
{Symbol} {Directive}
{Label} {Instruction}
- {SFR register} {Indirect adress}
+ {SFR register} {Indirect address}
{Immediate hex} {Immediate oct}
{Immediate dec} {Immediate bin}
{Immediate const} {Immediate generic}
{Macro instruction}
- } {
+ } \
+ {
# Create label
grid [label $main_frame.label$i \
-text [mc $text] -justify left \
@@ -7547,17 +7970,17 @@ namespace eval X {
# Radiobutton "Uppercase"
grid [radiobutton $main_frame.upper$i \
- -value [mc "U"] -highlightthickness 0 -pady 0 \
+ -value {U} -highlightthickness 0 -pady 0 \
-variable ::X::change_letter_case_options($i) \
] -row $row -column [expr {$col * 4 + 1}] -sticky w
# Radiobutton "Lowercase"
grid [radiobutton $main_frame.lower$i \
- -value [mc "L"] -highlightthickness 0 -pady 0 \
+ -value {L} -highlightthickness 0 -pady 0 \
-variable ::X::change_letter_case_options($i) \
] -row $row -column [expr {$col * 4 + 2}] -sticky w
# Radiobutton "Keep"
grid [radiobutton $main_frame.keep$i \
- -value [mc "-"] -highlightthickness 0 -pady 0 \
+ -value {-} -highlightthickness 0 -pady 0 \
-variable ::X::change_letter_case_options($i) \
] -row $row -column [expr {$col * 4 + 3}] -sticky w
@@ -7585,7 +8008,7 @@ namespace eval X {
-text [mc "All "] \
-image ::ICONS::16::$image \
-command "::X::change_letter_case_all_to $state" \
- ] -side left
+ ] -side left -padx 2
}
# Create and pack buttons "OK" and "CANCEL"
pack [ttk::button $button_frame.ok_button \
@@ -7593,13 +8016,13 @@ namespace eval X {
-compound left \
-image ::ICONS::16::ok \
-command {X::change_letter_case_OK} \
- ] -side right
+ ] -side right -padx 2
pack [ttk::button $button_frame.cancel_button \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
-command {X::change_letter_case_CANCEL} \
- ] -side right
+ ] -side right -padx 2
# Events binding (Enter == Ok; Escape == Cancel)
bind $win <KeyRelease-Return> {::X::change_letter_case_OK; break}
@@ -7608,7 +8031,7 @@ namespace eval X {
# Pack frames
pack $main_frame -fill both -expand 1 -padx 10 -pady 10
- pack $button_frame -side bottom -fill x
+ pack $button_frame -side bottom -fill x -padx 5 -pady 5
# Set window attributes
wm iconphoto $win ::ICONS::16::change_case
@@ -7665,11 +8088,12 @@ namespace eval X {
[$actualProject editor_procedure {} getLinesCount {}] == 1
&&
[$actualProject editor_procedure {} getLineContent 1] == {}
- } {
+ } then {
tk_messageBox \
+ -parent . \
-type ok \
-icon error \
- -title [mc "Unable to compile"] \
+ -title [mc "Unable to comply"] \
-message [mc "This editor seems to be empty"]
return
}
@@ -7681,7 +8105,7 @@ namespace eval X {
incr max
# Create progress dialog window
- set win [toplevel .change_letter_case_dialog -class {Progress dialog} -bg {#EEEEEE}]
+ set win [toplevel .change_letter_case_dialog -class {Progress dialog} -bg ${::COMMON_BG_COLOR}]
# Create label and progress bar
set main_frame [frame $win.main_frame]
@@ -7722,11 +8146,11 @@ namespace eval X {
$actualProject editor_procedure {} highlight_all {}
if {![winfo exists $win]} {return}
- # Determinate maximum value for the 2nd progress bar ("Formating")
+ # Determinate maximum value for the 2nd progress bar ("Formatting")
set max [$actualProject editor_procedure {} change_letter_case_get_count_of_iterations "{$options}"]
incr max
# Change progress bar header label
- $main_frame.header configure -text [mc "Formating ..."]
+ $main_frame.header configure -text [mc "Formatting ..."]
$main_frame.progress_bar configure -maximum $max
set compilation_progress 1 ;# Reset compilation progress variable
@@ -7833,7 +8257,10 @@ namespace eval X {
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
if {$project_menu_locked} {return}
- $actualProject switch_editor_RO_MODE
+ if {![$actualProject switch_editor_RO_MODE]} {
+ # Switch the flag back if the operation was unsuccessful
+ set ::editor_RO_MODE [expr {!$::editor_RO_MODE}]
+ }
}
## Prepare window "Project details"
@@ -7852,7 +8279,7 @@ namespace eval X {
if {$projectdetails_last_project == $project} {
project_details_move
return
- } {
+ } else {
set projectdetails_last_project $project
}
@@ -7869,7 +8296,6 @@ namespace eval X {
# Create window
set PROJECTDETAILSWIN [frame .project_details_win -bg {#BBBBFF}]
set project_details_win [frame $PROJECTDETAILSWIN.frm -bg {#FFFFFF}]
- bind $PROJECTDETAILSWIN <Button-1> "catch {destroy $PROJECTDETAILSWIN}"
# Create header
pack [label $project_details_win.header \
@@ -7893,13 +8319,17 @@ namespace eval X {
-anchor w -pady 0 -bg {#FFFFFF} \
] -row 0 -column 1 -sticky w -pady 0
# Path
- grid [label $main_frame.path_label \
- -text [mc "Path:"] -fg {#880033} \
- -anchor w -pady 0 -bg {#FFFFFF} \
+ grid [label $main_frame.path_label \
+ -text [mc "Path:"] -fg {#880033}\
+ -anchor w -pady 0 -bg {#FFFFFF} \
] -row 1 -column 0 -sticky w -pady 0
- grid [label $main_frame.path_value \
- -text [$project cget -projectPath] \
- -anchor w -pady 0 -bg {#FFFFFF} \
+ set path [$project cget -projectPath]
+ if {$::MICROSOFT_WINDOWS} {
+ regsub -all {/} $path "\\" path
+ }
+ grid [label $main_frame.path_value \
+ -text $path \
+ -anchor w -pady 0 -bg {#FFFFFF} \
] -row 1 -column 1 -sticky w -pady 0
# Separator
@@ -7943,10 +8373,10 @@ namespace eval X {
-anchor w -pady 0 -bg {#FFFFFF} \
] -row 6 -column 1 -sticky w -pady 0
- set more_details_avaliable 0
+ set more_details_available 0
# Version
if {[string length [$project cget -P_information_version]]} {
- set more_details_avaliable 1
+ set more_details_available 1
grid [label $main_frame.ver_label \
-text [mc "Version:"] -fg {#0000AA} \
-anchor w -pady 0 -bg {#FFFFFF} \
@@ -7958,7 +8388,7 @@ namespace eval X {
}
# Date
if {[string length [$project cget -P_information_date]]} {
- set more_details_avaliable 1
+ set more_details_available 1
grid [label $main_frame.date_label \
-text [mc "Date:"] -fg {#0000AA} \
-anchor w -pady 0 -bg {#FFFFFF} \
@@ -7968,22 +8398,22 @@ namespace eval X {
-text [$project cget -P_information_date] \
] -row 9 -column 1 -sticky w -pady 0
}
- # Licence
- if {[string length [$project cget -G_information_licence]]} {
- set more_details_avaliable 1
- grid [label $main_frame.licence_label \
- -text [mc "Licence:"] \
+ # License
+ if {[string length [$project cget -G_information_license]]} {
+ set more_details_available 1
+ grid [label $main_frame.license_label \
+ -text [mc "License:"] \
-fg {#0000AA} \
-anchor w -pady 0 -bg {#FFFFFF} \
] -row 10 -column 0 -sticky w -pady 0
- grid [label $main_frame.licence_value \
- -text [$project cget -G_information_licence] \
+ grid [label $main_frame.license_value \
+ -text [$project cget -G_information_license] \
-anchor w -pady 0 -bg {#FFFFFF} \
] -row 10 -column 1 -sticky w -pady 0
}
# Copyright
if {[string length [$project cget -G_information_copyright]]} {
- set more_details_avaliable 1
+ set more_details_available 1
grid [label $main_frame.copyright_label \
-text [mc "Copyright:"] \
-fg {#0000AA} -bg {#FFFFFF} \
@@ -7996,7 +8426,7 @@ namespace eval X {
}
# Authors
if {[string length $authors]} {
- set more_details_avaliable 1
+ set more_details_available 1
grid [label $main_frame.authors_label \
-text [mc "Authors:"] \
-fg {#0000AA} \
@@ -8008,7 +8438,7 @@ namespace eval X {
] -row 12 -column 1 -sticky w -pady 0
}
# Separator
- if {$more_details_avaliable} {
+ if {$more_details_available} {
grid [ttk::separator $main_frame.sep1 -orient horizontal \
] -row 7 -column 0 -columnspan 2 -sticky we -pady 5
}
@@ -8018,6 +8448,11 @@ namespace eval X {
pack $main_frame -fill both -expand 1 -padx 8 -pady 3
pack $project_details_win -fill both -expand 1 -padx 2 -pady 2
+ # Configure the window in a way that it will close when the user clicks on it
+ foreach w [concat $project_details_win [pack slaves $project_details_win] [grid slaves $main_frame]] {
+ bind $w <Button-1> {::X::close_project_details}
+ }
+
# Show window "Project details"
project_details_move
}
@@ -8041,7 +8476,6 @@ namespace eval X {
# @return void
proc close_project_details args {
variable PROJECTDETAILSWIN ;# ID of project details window
- variable projectdetails_last_project ;# Project object of the last project details window
# Hide the window
catch {place forget $PROJECTDETAILSWIN}
@@ -8063,18 +8497,18 @@ namespace eval X {
}
# Enable/Disable menu entries
- set tabindex [.mainFrame.mainNB index $project]
+ set tabindex [${::main_nb} index $project]
if {!$tabindex} {
$projectmenu entryconfigure [::mc "Move to beginning"] -state disabled
$projectmenu entryconfigure [::mc "Move left"] -state disabled
- } {
+ } else {
$projectmenu entryconfigure [::mc "Move to beginning"] -state normal
$projectmenu entryconfigure [::mc "Move left"] -state normal
}
- if {$tabindex == ([llength [.mainFrame.mainNB pages]] - 1)} {
+ if {$tabindex == ([llength [${::main_nb} pages]] - 1)} {
$projectmenu entryconfigure [::mc "Move right"] -state disabled
$projectmenu entryconfigure [::mc "Move to end"] -state disabled
- } {
+ } else {
$projectmenu entryconfigure [::mc "Move right"] -state normal
$projectmenu entryconfigure [::mc "Move to end"] -state normal
}
@@ -8140,7 +8574,7 @@ namespace eval X {
set actualProjectIdx [lsearch -exact -ascii $openedProjects $actualProject]
if {$actualProjectIdx == $tmp_idx} {
set this_closed 1
- } {
+ } else {
set this_closed 0
}
@@ -8164,7 +8598,7 @@ namespace eval X {
set actualProjectIdx [lsearch -exact -ascii $openedProjects $actualProject]
if {$actualProjectIdx == $tmp_idx} {
set this_closed 1
- } {
+ } else {
set this_closed 0
}
@@ -8184,13 +8618,13 @@ namespace eval X {
proc __project_move_to_left {} {
variable projectmenu_project ;# Object: project selected by project popup menu
- set index [.mainFrame.mainNB index $projectmenu_project]
+ set index [${::main_nb} index $projectmenu_project]
if {!$index} {
return
}
incr index -1
- .mainFrame.mainNB move $projectmenu_project $index
+ ${::main_nb} move $projectmenu_project $index
}
## Function for project popup menu
@@ -8199,13 +8633,13 @@ namespace eval X {
proc __project_move_to_right {} {
variable projectmenu_project ;# Object: project selected by project popup menu
- set index [.mainFrame.mainNB index $projectmenu_project]
- if {$index == ([llength [.mainFrame.mainNB index pages]] - 1)} {
+ set index [${::main_nb} index $projectmenu_project]
+ if {$index == ([llength [${::main_nb} index pages]] - 1)} {
return
}
incr index
- .mainFrame.mainNB move $projectmenu_project $index
+ ${::main_nb} move $projectmenu_project $index
}
## Function for project popup menu
@@ -8214,10 +8648,10 @@ namespace eval X {
proc __project_move_to_beginning {} {
variable projectmenu_project ;# Object: project selected by project popup menu
- if {![.mainFrame.mainNB index $projectmenu_project]} {
+ if {![${::main_nb} index $projectmenu_project]} {
return
}
- .mainFrame.mainNB move $projectmenu_project 0
+ ${::main_nb} move $projectmenu_project 0
}
## Function for project popup menu
@@ -8226,12 +8660,12 @@ namespace eval X {
proc __project_move_to_end {} {
variable projectmenu_project ;# Object: project selected by project popup menu
- set end [expr {[llength [.mainFrame.mainNB pages]] - 1}]
- if {[.mainFrame.mainNB index $projectmenu_project] == $end} {
+ set end [expr {[llength [${::main_nb} pages]] - 1}]
+ if {[${::main_nb} index $projectmenu_project] == $end} {
return
}
- .mainFrame.mainNB move $projectmenu_project $end
+ ${::main_nb} move $projectmenu_project $end
}
## Invert flag "allow breakpoints"
@@ -8240,7 +8674,7 @@ namespace eval X {
set ::CONFIG(BREAKPOINTS_ALLOWED) [expr {!$::CONFIG(BREAKPOINTS_ALLOWED)}]
}
- ## Refresh bookmarks in filesystem browser in all projects
+ ## Refresh bookmarks in file system browser in all projects
# @return void
proc refresh_bookmarks_in_fs_browsers {} {
variable openedProjects ;# List of opened projects (Object references)
@@ -8261,16 +8695,16 @@ namespace eval X {
# @parm Int new_PC - New value of PC (-1 after reset)
# @return void
proc program_counter_changed {project new_PC} {
- variable opended_code_mem_windows ;# List of project object with opened CODE memory hex editor
+ variable opened_code_mem_windows ;# List of project object with opened CODE memory hex editor
variable code_mem_window_objects ;# List of CODE memory hex editor objects
- set idx [lsearch -exact -ascii $opended_code_mem_windows [string trimleft $project {:}]]
+ set idx [lsearch -exact -ascii $opened_code_mem_windows [string trimleft $project {:}]]
if {$idx != -1} {
set opcode [$project getCode $new_PC]
- if {[lsearch ${CompilerConsts::defined_OPCODE} $opcode] == -1} {
+ if {[lsearch ${::CompilerConsts::defined_OPCODE} $opcode] == -1} {
set ins_length 1
- } {
- set ins_length [lindex $CompilerConsts::Opcode($opcode) 2]
+ } else {
+ set ins_length [lindex $::CompilerConsts::Opcode($opcode) 2]
}
[lindex $code_mem_window_objects $idx] move_program_pointer $new_PC $ins_length
}
@@ -8281,19 +8715,19 @@ namespace eval X {
# @parm Int new_PC - New value of PC (-1 after reset)
# @return void
proc code_hex_editor_directly_move_program_pointer {project new_PC} {
- variable opended_code_mem_windows ;# List of project object with opened CODE memory hex editor
+ variable opened_code_mem_windows ;# List of project object with opened CODE memory hex editor
variable code_mem_window_objects ;# List of CODE memory hex editor objects
- set idx [lsearch -exact -ascii $opended_code_mem_windows [string trimleft $project {:}]]
+ set idx [lsearch -exact -ascii $opened_code_mem_windows [string trimleft $project {:}]]
if {$idx != -1} {
if {$new_PC != -1} {
set opcode [$project getCode $new_PC]
- if {[lsearch ${CompilerConsts::defined_OPCODE} $opcode] == -1} {
+ if {[lsearch ${::CompilerConsts::defined_OPCODE} $opcode] == -1} {
set ins_length 1
- } {
- set ins_length [lindex $CompilerConsts::Opcode($opcode) 2]
+ } else {
+ set ins_length [lindex $::CompilerConsts::Opcode($opcode) 2]
}
- } {
+ } else {
set ins_length 0
}
[lindex $code_mem_window_objects $idx] move_program_pointer_directly $new_PC $ins_length
@@ -8304,10 +8738,10 @@ namespace eval X {
# @parm Object project - Project object
# @return void
proc refresh_code_mem_window {project} {
- variable opended_code_mem_windows ;# List of project object with opened CODE memory hex editor
+ variable opened_code_mem_windows ;# List of project object with opened CODE memory hex editor
variable code_mem_window_objects ;# List of CODE memory hex editor objects
- set idx [lsearch -exact -ascii $opended_code_mem_windows [string trimleft $project {:}]]
+ set idx [lsearch -exact -ascii $opened_code_mem_windows [string trimleft $project {:}]]
if {$idx != -1} {
[lindex $code_mem_window_objects $idx] refresh
}
@@ -8317,10 +8751,10 @@ namespace eval X {
# @parm Object project - Project object
# @return void
proc refresh_xram_mem_window {project} {
- variable opended_xdata_mem_windows ;# List of project object with opened XDATA memory hex editor
+ variable opened_xdata_mem_windows ;# List of project object with opened XDATA memory hex editor
variable xdata_mem_window_objects ;# List of XDATA memory hex editor objects
- set idx [lsearch -exact -ascii $opended_xdata_mem_windows [string trimleft $project {:}]]
+ set idx [lsearch -exact -ascii $opened_xdata_mem_windows [string trimleft $project {:}]]
if {$idx != -1} {
[lindex $xdata_mem_window_objects $idx] refresh
}
@@ -8330,10 +8764,10 @@ namespace eval X {
# @parm Object project - Project object
# @return void
proc refresh_eram_mem_window {project} {
- variable opended_eram_windows ;# List of project object with opened ERAM hex editor
+ variable opened_eram_windows ;# List of project object with opened ERAM hex editor
variable eram_window_objects ;# List of ERAM hex editor objects
- set idx [lsearch -exact -ascii $opended_eram_windows [string trimleft $project {:}]]
+ set idx [lsearch -exact -ascii $opened_eram_windows [string trimleft $project {:}]]
if {$idx != -1} {
[lindex $eram_window_objects $idx] refresh
}
@@ -8343,24 +8777,24 @@ namespace eval X {
# @parm Object project - Project object
# @return void
proc refresh_eeprom_mem_window {project} {
- variable opended_eeprom_mem_windows ;# List of project object with opened ERAM hex editor
+ variable opened_eeprom_mem_windows ;# List of project object with opened ERAM hex editor
variable eeprom_mem_window_objects ;# List of ERAM hex editor objects
- set idx [lsearch -exact -ascii $opended_eeprom_mem_windows [string trimleft $project {:}]]
+ set idx [lsearch -exact -ascii $opened_eeprom_mem_windows [string trimleft $project {:}]]
if {$idx != -1} {
[lindex $eeprom_mem_window_objects $idx] refresh
}
}
- ## Clear background highlight for certain cell in hexeditor of data EEPROM
+ ## Clear background highlight for certain cell in hex editor of data EEPROM
# @parm Int addr - Register address (absolute)
# @parm Object project - Project object
# @return void
proc sync_eeprom_clear_bg_hg {addr project} {
- variable opended_eeprom_mem_windows ;# List of project object with opened data EEPROM hex editor
+ variable opened_eeprom_mem_windows ;# List of project object with opened data EEPROM hex editor
variable eeprom_mem_window_objects ;# List of data EEPROM hex editor objects
- set idx [lsearch -exact -ascii $opended_eeprom_mem_windows [string trimleft $project {:}]]
+ set idx [lsearch -exact -ascii $opened_eeprom_mem_windows [string trimleft $project {:}]]
if {$idx != -1} {
[lindex $eeprom_mem_window_objects $idx] set_bg_hg_clr $addr 0
}
@@ -8374,10 +8808,10 @@ namespace eval X {
# @parm Object project - Project object
# @return void
proc sync_eeprom_mem_window {addr hg project} {
- variable opended_eeprom_mem_windows ;# List of project object with opened data EEPROM hex editor
+ variable opened_eeprom_mem_windows ;# List of project object with opened data EEPROM hex editor
variable eeprom_mem_window_objects ;# List of data EEPROM hex editor objects
- set idx [lsearch -exact -ascii $opended_eeprom_mem_windows [string trimleft $project {:}]]
+ set idx [lsearch -exact -ascii $opened_eeprom_mem_windows [string trimleft $project {:}]]
if {$idx != -1} {
set obj [lindex $eeprom_mem_window_objects $idx]
$obj reg_sync $addr
@@ -8392,20 +8826,20 @@ namespace eval X {
# @parm Object project - Project object
# @return void
proc sync_xram_mem_window {addr project} {
- variable opended_xdata_mem_windows ;# List of project object with opened XDATA memory hex editor
+ variable opened_xdata_mem_windows ;# List of project object with opened XDATA memory hex editor
variable xdata_mem_window_objects ;# List of XDATA memory hex editor objects
- variable opended_eram_windows ;# List of project object with opened ERAM hex editor
+ variable opened_eram_windows ;# List of project object with opened ERAM hex editor
variable eram_window_objects ;# List of ERAM hex editor objects
set project [string trimleft $project {:}]
# Syncronize XDATA
- set idx [lsearch -exact -ascii $opended_xdata_mem_windows $project]
+ set idx [lsearch -exact -ascii $opened_xdata_mem_windows $project]
if {$idx != -1} {
[lindex $xdata_mem_window_objects $idx] reg_sync $addr
}
# Syncronize ERAM
- set idx [lsearch -exact -ascii $opended_eram_windows $project]
+ set idx [lsearch -exact -ascii $opened_eram_windows $project]
if {$idx != -1} {
[lindex $eram_window_objects $idx] reg_sync $addr
}
@@ -8435,7 +8869,7 @@ namespace eval X {
show_X_memory eeprom
}
- ## Invoke hexeditor dialog
+ ## Invoke hex editor dialog
# @see __show_exp_mem, __show_ext_mem, __show_code_mem, __show_eeprom
# @parm String type - memory type (one of {eeprom xdata code eram})
# @return void
@@ -8446,13 +8880,13 @@ namespace eval X {
variable actualProjectIdx ;# Index of the current project in $openedProjects
variable simulator_enabled ;# List of booleans: Simulator engaged
- variable opended_xdata_mem_windows ;# List of project object with opened XDATA memory hex editor
+ variable opened_xdata_mem_windows ;# List of project object with opened XDATA memory hex editor
variable xdata_mem_window_objects ;# List of XDATA memory hex editor objects
- variable opended_code_mem_windows ;# List of project object with opened CODE memory hex editor
+ variable opened_code_mem_windows ;# List of project object with opened CODE memory hex editor
variable code_mem_window_objects ;# List of CODE memory hex editor objects
- variable opended_eram_windows ;# List of project object with opened ERAM hex editor
+ variable opened_eram_windows ;# List of project object with opened ERAM hex editor
variable eram_window_objects ;# List of ERAM hex editor objects
- variable opended_eeprom_mem_windows ;# List of project object with opened data EEPROM hex editor
+ variable opened_eeprom_mem_windows ;# List of project object with opened data EEPROM hex editor
variable eeprom_mem_window_objects ;# List of data EEPROM hex editor objects
if {$project_menu_locked} {return}
@@ -8463,29 +8897,29 @@ namespace eval X {
if {![$actualProject cget -P_option_mcu_xdata]} {
return
}
- set idx [lsearch -exact -ascii $opended_xdata_mem_windows $actualProject]
- set list_of_opened {opended_xdata_mem_windows}
+ set idx [lsearch -exact -ascii $opened_xdata_mem_windows $actualProject]
+ set list_of_opened {opened_xdata_mem_windows}
set window_objects {xdata_mem_window_objects}
}
{eram} {
if {![lindex [$actualProject cget -procData] 8]} {
return
}
- set idx [lsearch -exact -ascii $opended_eram_windows $actualProject]
- set list_of_opened {opended_eram_windows}
+ set idx [lsearch -exact -ascii $opened_eram_windows $actualProject]
+ set list_of_opened {opened_eram_windows}
set window_objects {eram_window_objects}
}
{code} {
- set idx [lsearch -exact -ascii $opended_code_mem_windows $actualProject]
- set list_of_opened {opended_code_mem_windows}
+ set idx [lsearch -exact -ascii $opened_code_mem_windows $actualProject]
+ set list_of_opened {opened_code_mem_windows}
set window_objects {code_mem_window_objects}
}
{eeprom} {
if {![lindex [$actualProject cget -procData] 32]} {
return
}
- set idx [lsearch -exact -ascii $opended_eeprom_mem_windows $actualProject]
- set list_of_opened {opended_eeprom_mem_windows}
+ set idx [lsearch -exact -ascii $opened_eeprom_mem_windows $actualProject]
+ set list_of_opened {opened_eeprom_mem_windows}
set window_objects {eeprom_mem_window_objects}
}
}
@@ -8500,7 +8934,7 @@ namespace eval X {
set critical_procedure_in_progress 0
return
# Show
- } {
+ } else {
set object "hexedit_${type}_${actualProject}"
HexEditDlg ::$object $actualProject $type
lappend $list_of_opened $actualProject
@@ -8522,7 +8956,7 @@ namespace eval X {
set filename [file rootname $filename]
if {$ext == {.c} || $ext == {.h} || $ext == {.cxx} || $ext == {.cpp} || $ext == {.cc}} {
append filename {.ihx}
- } {
+ } else {
append filename {.hex}
}
@@ -8549,11 +8983,11 @@ namespace eval X {
proc sync_eeprom_write_buffer {addr project} {
variable actualProject ;# Object: Current project
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
- variable opended_eeprom_wr_bf_windows ;# List of project objects with opened data EEPROM write buffer editor
+ variable opened_eeprom_wr_bf_windows ;# List of project objects with opened data EEPROM write buffer editor
variable eeprom_wr_bf_window_objects ;# List of data EEPROM write buffer hex editor objects
if {$project_menu_locked} {return}
- set idx [lsearch -exact -ascii $opended_eeprom_wr_bf_windows [string trimleft $project {:}]]
+ set idx [lsearch -exact -ascii $opened_eeprom_wr_bf_windows [string trimleft $project {:}]]
if {$idx == -1} {return}
[string replace [lindex $eeprom_wr_bf_window_objects $idx] 0 0] \
setValue $addr [$project getEepromWrBufDEC $addr]
@@ -8565,11 +8999,11 @@ namespace eval X {
proc clear_eeprom_write_buffer {project} {
variable actualProject ;# Object: Current project
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
- variable opended_eeprom_wr_bf_windows ;# List of project objects with opened data EEPROM write buffer editor
+ variable opened_eeprom_wr_bf_windows ;# List of project objects with opened data EEPROM write buffer editor
variable eeprom_wr_bf_window_objects ;# List of data EEPROM write buffer hex editor objects
if {$project_menu_locked} {return}
- set idx [lsearch -exact -ascii $opended_eeprom_wr_bf_windows [string trimleft $project {:}]]
+ set idx [lsearch -exact -ascii $opened_eeprom_wr_bf_windows [string trimleft $project {:}]]
if {$idx == -1} {return}
set hexeditor [string replace [lindex $eeprom_wr_bf_window_objects $idx] 0 0]
for {set addr 0} {$addr < 32} {incr addr} {
@@ -8584,11 +9018,11 @@ namespace eval X {
proc eeprom_write_buffer_set_offset {offset project} {
variable actualProject ;# Object: Current project
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
- variable opended_eeprom_wr_bf_windows ;# List of project objects with opened data EEPROM write buffer editor
+ variable opened_eeprom_wr_bf_windows ;# List of project objects with opened data EEPROM write buffer editor
variable eeprom_wr_bf_window_objects ;# List of data EEPROM write buffer hex editor objects
if {$project_menu_locked} {return}
- set idx [lsearch -exact -ascii $opended_eeprom_wr_bf_windows [string trimleft $project {:}]]
+ set idx [lsearch -exact -ascii $opened_eeprom_wr_bf_windows [string trimleft $project {:}]]
if {$idx == -1} {return}
if {$offset == {}} {
set offset [mc "< Undefined >"]
@@ -8596,7 +9030,7 @@ namespace eval X {
[lindex $eeprom_wr_bf_window_objects $idx].offset_frame.val configure -text $offset
}
- ## Binding for pseudo-events <cell_enter> and <cell_leave> in data EEPROM write buffer hexeditor
+ ## Binding for pseudo-events <cell_enter> and <cell_leave> in data EEPROM write buffer hex editor
# Set value of curosor label at the bottom of the window
# This function takes list of attributes with any length gerater
#+ than one but only first two are significant
@@ -8622,7 +9056,7 @@ namespace eval X {
# Modify content of cursor label
if {$addr == {}} {
$win.bottom_frame.cur_val configure -text { }
- } {
+ } else {
set addr [format %X $addr]
set len [string length $addr]
if {$len < 4} {
@@ -8634,13 +9068,13 @@ namespace eval X {
set foo_procedure_in_progress 0
}
- ## Invoke hexeditor with data EEPROM write buffer
+ ## Invoke hex editor with data EEPROM write buffer
# @return void
proc __show_eeprom_write_buffer {} {
variable actualProject ;# Object: Current project
variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
- variable opended_eeprom_wr_bf_windows ;# List of project objects with opened data EEPROM write buffer editor
+ variable opened_eeprom_wr_bf_windows ;# List of project objects with opened data EEPROM write buffer editor
variable eeprom_wr_bf_window_objects ;# List of data EEPROM write buffer hex editor objects
variable eeprom_wr_buf_counter ;# Counter of EEPROM write buffer hex editor objects
@@ -8655,7 +9089,7 @@ namespace eval X {
set critical_procedure_in_progress 1
# Check if the dialog is not already opened
- if {[lsearch -exact -ascii $opended_eeprom_wr_bf_windows $actualProject] != -1} {
+ if {[lsearch -exact -ascii $opened_eeprom_wr_bf_windows $actualProject] != -1} {
close_hexedit eeprom_wr_bf $actualProject
set critical_procedure_in_progress 0
return
@@ -8663,11 +9097,11 @@ namespace eval X {
# Create dialog window
incr eeprom_wr_buf_counter
- set win [toplevel .eeprom_write_buffer_${eeprom_wr_buf_counter} -class {EEPROM} -bg {#EEEEEE}]
+ set win [toplevel .eeprom_write_buffer_${eeprom_wr_buf_counter} -class {EEPROM} -bg ${::COMMON_BG_COLOR}]
# Adjust NS variables
lappend eeprom_wr_bf_window_objects $win
- lappend opended_eeprom_wr_bf_windows $actualProject
+ lappend opened_eeprom_wr_bf_windows $actualProject
# Create window header
pack [label $win.header \
@@ -8676,17 +9110,19 @@ namespace eval X {
# Create offset label
set offset_frame [frame $win.offset_frame]
- pack [label $offset_frame.lbl \
- -text [mc "OFFSET = "] \
- -font [font create \
- -size -17 -weight bold \
- -family {helvetica}] \
+ pack [label $offset_frame.lbl \
+ -text [mc "OFFSET = "] \
+ -font [font create \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
+ -family {helvetica}] \
] -side left
- pack [label $offset_frame.val \
- -fg {#0000FF} \
- -font [font create \
- -size -17 -weight bold \
- -family {helvetica}] \
+ pack [label $offset_frame.val \
+ -fg {#0000FF} \
+ -font [font create \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
+ -family {helvetica}] \
] -side left
pack $offset_frame -anchor w
@@ -8712,13 +9148,13 @@ namespace eval X {
-compound left \
-image ::ICONS::16::button_cancel \
-command "X::close_hexedit eeprom_wr_bf $actualProject" \
- ] -side left -anchor w
- pack [label $bottom_frame.cur_val \
- -text { } -fg {#0000FF} \
- -font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight bold \
+ ] -side left -anchor w -padx 2 -pady 2
+ pack [label $bottom_frame.cur_val \
+ -text { } -fg {#0000FF} \
+ -font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
] \
] -side right -anchor e -padx 5
pack [label $bottom_frame.cur_lbl \
@@ -8728,7 +9164,7 @@ namespace eval X {
# Configure dialog window
wm iconphoto $win ::ICONS::16::kcmmemory
- wm title $win [mc "EEPROM write buffer - %s - MCU 8051 IDE" $actualProject]
+ wm title $win [mc "EEPROM write buffer - %s - MCU 8051 IDE" [$actualProject cget -projectName]]
wm resizable $win 0 0
wm protocol $win WM_DELETE_WINDOW \
"X::close_hexedit eeprom_wr_bf $actualProject"
@@ -8744,51 +9180,51 @@ namespace eval X {
# @parm Object project - Project object descriptor
# @return void
proc close_hexedit {type project} {
- variable opended_code_mem_windows ;# List of project object with opened CODE memory hex editor
+ variable opened_code_mem_windows ;# List of project object with opened CODE memory hex editor
variable code_mem_window_objects ;# List of CODE memory hex editor objects
- variable opended_xdata_mem_windows ;# List of project object with opened XDATA memory hex editor
+ variable opened_xdata_mem_windows ;# List of project object with opened XDATA memory hex editor
variable xdata_mem_window_objects ;# List of XDATA memory hex editor objects
- variable opended_eram_windows ;# List of project object with opened ERAM hex editor
+ variable opened_eram_windows ;# List of project object with opened ERAM hex editor
variable eram_window_objects ;# List of ERAM hex editor objects
- variable opended_eeprom_mem_windows ;# List of project object with opened data EEPROM hex editor
+ variable opened_eeprom_mem_windows ;# List of project object with opened data EEPROM hex editor
variable eeprom_mem_window_objects ;# List of data EEPROM hex editor objects
- variable opended_eeprom_wr_bf_windows ;# List of project objects with opened data EEPROM write buffer editor
+ variable opened_eeprom_wr_bf_windows ;# List of project objects with opened data EEPROM write buffer editor
variable eeprom_wr_bf_window_objects ;# List of data EEPROM write buffer hex editor objects
variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
# Close CODE memory editor
if {$type == {code}} {
- set opended_windows_var {opended_code_mem_windows}
+ set opened_windows_var {opened_code_mem_windows}
set window_objects_var {code_mem_window_objects}
- set opended_windows $opended_code_mem_windows
+ set opened_windows $opened_code_mem_windows
set window_objects $code_mem_window_objects
# Close ERAM editor
} elseif {$type == {eram}} {
- set opended_windows_var {opended_eram_windows}
+ set opened_windows_var {opened_eram_windows}
set window_objects_var {eram_window_objects}
- set opended_windows $opended_eram_windows
+ set opened_windows $opened_eram_windows
set window_objects $eram_window_objects
# Close XDATA memory editor
} elseif {$type == {xdata}} {
- set opended_windows_var {opended_xdata_mem_windows}
+ set opened_windows_var {opened_xdata_mem_windows}
set window_objects_var {xdata_mem_window_objects}
- set opended_windows $opended_xdata_mem_windows
+ set opened_windows $opened_xdata_mem_windows
set window_objects $xdata_mem_window_objects
# Close data EEPROM editor
} elseif {$type == {eeprom}} {
- set opended_windows_var {opended_eeprom_mem_windows}
+ set opened_windows_var {opened_eeprom_mem_windows}
set window_objects_var {eeprom_mem_window_objects}
- set opended_windows $opended_eeprom_mem_windows
+ set opened_windows $opened_eeprom_mem_windows
set window_objects $eeprom_mem_window_objects
# Close EEPROM write buffer
} elseif {$type == {eeprom_wr_bf}} {
- set opended_windows_var {opended_eeprom_wr_bf_windows}
+ set opened_windows_var {opened_eeprom_wr_bf_windows}
set window_objects_var {eeprom_wr_bf_window_objects}
- set opended_windows $opended_eeprom_wr_bf_windows
+ set opened_windows $opened_eeprom_wr_bf_windows
set window_objects $eeprom_wr_bf_window_objects
# Close project independent hexadecimal editor
@@ -8802,16 +9238,16 @@ namespace eval X {
# Determinate editor index
- set idx [lsearch -exact -ascii $opended_windows $project]
+ set idx [lsearch -exact -ascii $opened_windows $project]
if {$idx == -1} {return}
# Destroy editor object
if {$type == {eeprom_wr_bf}} {
destroy [lindex $window_objects $idx]
- } {
+ } else {
delete object [lindex $window_objects $idx]
}
# Delete references
- set $opended_windows_var [lreplace $opended_windows $idx $idx]
+ set $opened_windows_var [lreplace $opened_windows $idx $idx]
set $window_objects_var [lreplace $window_objects $idx $idx]
}
@@ -8828,19 +9264,19 @@ namespace eval X {
if {[$actualProject editor_procedure {} cget -modified]} {
append title {[modified] }
}
- append title $actualProject
+ append title [$actualProject cget -projectName]
append title { : }
append title [$actualProject editor_procedure {} cget -filename]
append title { - MCU 8051 IDE}
wm title . $title
# Error -- default title
- }]} {
+ }]} then {
wm title . ${::APPNAME}
}
# No project opened -- default title
- } {
+ } else {
wm title . ${::APPNAME}
}
}
@@ -8850,11 +9286,11 @@ namespace eval X {
proc __sim_clear_highlight {} {
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
variable actualProject ;# Object: Current project
- variable opended_xdata_mem_windows ;# List of project object with opened XDATA memory hex editor
+ variable opened_xdata_mem_windows ;# List of project object with opened XDATA memory hex editor
variable xdata_mem_window_objects ;# List of XDATA memory hex editor objects
- variable opended_eram_windows ;# List of project object with opened ERAM hex editor
+ variable opened_eram_windows ;# List of project object with opened ERAM hex editor
variable eram_window_objects ;# List of ERAM hex editor objects
- variable opended_eeprom_mem_windows ;# List of project object with opened data EEPROM hex editor
+ variable opened_eeprom_mem_windows ;# List of project object with opened data EEPROM hex editor
variable eeprom_mem_window_objects ;# List of data EEPROM hex editor objects
if {$project_menu_locked} {return}
@@ -8863,15 +9299,15 @@ namespace eval X {
$actualProject bitmap_clear_hg
$actualProject sfrmap_clear_hg
- set idx [lsearch -exact -ascii $opended_xdata_mem_windows $actualProject]
+ set idx [lsearch -exact -ascii $opened_xdata_mem_windows $actualProject]
if {$idx != -1} {
[lindex $xdata_mem_window_objects $idx] clear_highlight
}
- set idx [lsearch -exact -ascii $opended_eram_windows $actualProject]
+ set idx [lsearch -exact -ascii $opened_eram_windows $actualProject]
if {$idx != -1} {
[lindex $eram_window_objects $idx] clear_highlight
}
- set idx [lsearch -exact -ascii $opended_eeprom_mem_windows $actualProject]
+ set idx [lsearch -exact -ascii $opened_eeprom_mem_windows $actualProject]
if {$idx != -1} {
[lindex $eeprom_mem_window_objects $idx] clear_highlight
}
@@ -8920,7 +9356,7 @@ namespace eval X {
-parent . \
-type ok \
-icon warning \
- -title [mc "Unable to compile"] \
+ -title [mc "Unable to comply"] \
-message [mc "This operation cannot be performed on an untitled file"]
return
}
@@ -8930,7 +9366,7 @@ namespace eval X {
-parent . \
-type ok \
-icon warning \
- -title [mc "Unable to compile"] \
+ -title [mc "Unable to comply"] \
-message [mc "This file does not contain any part of the running program"]
return
}
@@ -8942,7 +9378,7 @@ namespace eval X {
set line2pc $line2pc_org_line
# Create dialog window
- set win [toplevel .goto_line2pc -class [mc "Goto dialog"] -bg {#EEEEEE}]
+ set win [toplevel .goto_line2pc -class [mc "Goto dialog"] -bg ${::COMMON_BG_COLOR}]
# Create window label frame
label $win.header \
@@ -8952,16 +9388,18 @@ namespace eval X {
# Create middle frame
set middle_frame [frame $win.middle_frame]
- pack [label $middle_frame.left_lbl \
- -text [mc "PC = "] \
- -font [font create \
- -size -16 -weight bold \
- -family {helvetica}] \
+ pack [label $middle_frame.left_lbl \
+ -text [mc "PC = "] \
+ -font [font create \
+ -size [expr {int(-16 * $::font_size_factor)}] \
+ -weight bold \
+ -family {helvetica}] \
] -side left
- set line2pc_value_lbl [label $middle_frame.right_lbl \
- -font [font create \
- -size -16 -weight bold \
- -family {helvetica}] \
+ set line2pc_value_lbl [label $middle_frame.right_lbl \
+ -font [font create \
+ -size [expr {int(-16 * $::font_size_factor)}] \
+ -weight bold \
+ -family {helvetica}] \
]
pack $line2pc_value_lbl -side left
set middle_right_frame [frame $middle_frame.right_frame]
@@ -8984,14 +9422,14 @@ namespace eval X {
-image ::ICONS::16::ok \
-command {X::line2pc_OK} \
]
- pack $line2pc_ok_button -side left
+ pack $line2pc_ok_button -side left -padx 2
pack [ttk::button $buttonFrame.cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
-command {X::line2pc_CANCEL} \
] -side left
- pack $buttonFrame -after $middle_frame -pady 5
+ pack $buttonFrame -after $middle_frame -pady 5 -padx 2
## Create top frame
set topFrame [ttk::labelframe $win.topFrame -labelwidget $win.header -relief flat]
@@ -9004,19 +9442,20 @@ namespace eval X {
-variable ::X::line2pc \
-command "
set ::X::line2pc \[expr {int(\${::X::line2pc})}\]
+ ::X::line2pc_validate \$::X::line2pc $topFrame.spinbox
$topFrame.spinbox selection range 0 end
#" \
] -side left -expand 1 -fill x -padx 2
DynamicHelp::add $topFrame.scale \
-text [mc "Graphical representation of the line where to go"]
# Create spinbox widget
- pack [spinbox $topFrame.spinbox \
- -from 1 -to $line2pc_line_max \
- -textvariable X::line2pc \
- -validate all \
- -vcmd {X::line2pc_validate [expr {int(%P)}] %W} \
- -width 4 \
- -command "$topFrame.spinbox selection range 0 end ;#" \
+ pack [ttk::spinbox $topFrame.spinbox \
+ -from 1 -to $line2pc_line_max \
+ -textvariable ::X::line2pc \
+ -validate all \
+ -validatecommand {::X::line2pc_validate %P %W} \
+ -command "::X::line2pc_validate \$::X::line2pc $topFrame.spinbox" \
+ -width 4 \
] -side left
DynamicHelp::add $topFrame.spinbox -text [mc "Line where to go"]
@@ -9032,7 +9471,7 @@ namespace eval X {
# Nessesary window manager options -- modal window
wm iconphoto $win ::ICONS::16::exec
wm title $win [mc "Line to address"]
- wm minsize $win 350 100
+ wm minsize $win 380 140
wm protocol $win WM_DELETE_WINDOW {
X::line2pc_CANCEL
}
@@ -9055,9 +9494,16 @@ namespace eval X {
variable line2pc_ok_button ;# Widget: Button "OK"
variable line2pc_file_number ;# Int: File number
+ if {$content == {}} {
+ return 1
+ }
+
# Validate the given string
- if {![string is digit $content] || $content > $line2pc_line_max || $content < 0} {
- $line2pc_spinbox configure -bg {#FFFFFF}
+ set content [regsub {\..*$} $content {}]
+ if {![string is digit $content] || ($content > $line2pc_line_max) || ($content < 0)} {
+ catch {
+ $line2pc_spinbox configure -style TSpinbox
+ }
return 0
}
@@ -9073,12 +9519,14 @@ namespace eval X {
-text [mc "Unable to resolve"]
code_hex_editor_directly_move_program_pointer $actualProject -1
- $actualProject editor_procedure {} unset_simulator_line {} ;# Adjust editor
- $line2pc_ok_button configure -state disabled ;# Adjust Ok button
- $line2pc_spinbox configure -bg {#FFCCCC} ;# Adjust SpinBox
+ $actualProject editor_procedure {} unset_simulator_line {} ;# Adjust editor
+ $line2pc_ok_button configure -state disabled ;# Adjust Ok button
+ catch {
+ $line2pc_spinbox configure -style RedBg.TSpinbox ;# Adjust SpinBox
+ }
# Success
- } {
+ } else {
# Translate address to hexadecimal system
set addr_in_hex [format %X $line2pc_new_value]
set len [string length $addr_in_hex]
@@ -9092,8 +9540,10 @@ namespace eval X {
# Adjust editor
code_hex_editor_directly_move_program_pointer $actualProject $line2pc_new_value
$actualProject move_simulator_line [list $content $line2pc_file_number]
- $line2pc_ok_button configure -state normal ;# Adjust Ok button
- $line2pc_spinbox configure -bg {#CCFFCC} ;# Adjust SpinBox
+ $line2pc_ok_button configure -state normal ;# Adjust Ok button
+ catch {
+ $line2pc_spinbox configure -style GreenBg.TSpinbox ;# Adjust SpinBox
+ }
}
return 1
}
@@ -9115,7 +9565,7 @@ namespace eval X {
if {$line2pc_org_line == {}} {
$actualProject editor_procedure {} unset_simulator_line {}
- } {
+ } else {
$actualProject move_simulator_line $line2pc_org_line
}
code_hex_editor_directly_move_program_pointer $actualProject -1
@@ -9140,7 +9590,7 @@ namespace eval X {
$actualProject move_simulator_line $line2pc
if {$line2pc_jump} {
$actualProject setPC $line2pc_new_value
- } {
+ } else {
$actualProject simulator_subprog_call $line2pc_new_value
}
code_hex_editor_directly_move_program_pointer $actualProject -1
@@ -9154,7 +9604,7 @@ namespace eval X {
# @return void
proc __prev_editor_from_pmenu {} {
variable actualProject ;# Object: Current project
- variable selectedView ;# Int: Selected editor view
+ variable selectedView ;# Object: Selected editor view
variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
@@ -9176,7 +9626,7 @@ namespace eval X {
# @return void
proc __next_editor_from_pmenu {} {
variable actualProject ;# Object: Current project
- variable selectedView ;# Int: Selected editor view
+ variable selectedView ;# Object: Selected editor view
variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
@@ -9227,7 +9677,7 @@ namespace eval X {
## Close current view (editor) from editor statusbar popup menu
# @return void
proc __close_current_view_from_pmenu {} {
- variable selectedView ;# Int: Selected editor view
+ variable selectedView ;# Object: Selected editor view
variable actualProject ;# Object: Current project
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
@@ -9305,7 +9755,7 @@ namespace eval X {
if {$hib_res} {
set title [mc "Hibernate running program - MCU 8051 IDE"]
set cmd {__hibernate_to}
- } {
+ } else {
set title [mc "Resume hibernated program - MCU 8051 IDE"]
set cmd {__resume_from}
}
@@ -9315,10 +9765,10 @@ namespace eval X {
KIFSD::FSD fsd \
-title $title -initialfile $initialfile \
-directory [$actualProject cget -projectPath] \
- -defaultmask 0 -multiple 0 -filetypes {
- {{MCU 8051 IDE Hibernated program} {*.m5ihib} }
- {{All files} {*} }
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "MCU 8051 IDE hibernated program"] {*.m5ihib} ] \
+ [list [mc "All files"] {*} ] \
+ ]
# Open file after press of OK button
fsd setokcmd "
@@ -9352,11 +9802,11 @@ namespace eval X {
# Adjust the given name of the target file
if {!$::MICROSOFT_WINDOWS} { ;# POSIX way
if {![regexp "^(~|/)" $filename]} {
- set filename "[${X::actualProject} cget -ProjectDir]/$filename"
+ set filename "[${::X::actualProject} cget -ProjectDir]/$filename"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $filename]} {
- set filename [file join [${X::actualProject} cget -ProjectDir] $filename]
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $filename]} {
+ set filename [file join [${::X::actualProject} cget -ProjectDir] $filename]
}
}
if {[file extension $filename] == {}} {
@@ -9374,7 +9824,7 @@ namespace eval X {
-title [mc "Overwrite file"] \
-message [mc "A file name '%s' already exists. Are you sure you want to overwrite it ?" [file tail $filename]]
] != {yes}
- } {
+ } then {
return
}
# Create a backup file
@@ -9390,7 +9840,7 @@ namespace eval X {
}
if {![$actualProject hibernate_hibernate \
$filename [file tail $sourcefile] $sourcefile_md5 0 \
- ]} {
+ ]} then {
tk_messageBox \
-parent . \
-type ok \
@@ -9419,11 +9869,11 @@ namespace eval X {
# Adjust the given name of the target file
if {!$::MICROSOFT_WINDOWS} { ;# POSIX way
if {![regexp "^(~|/)" $filename]} {
- set filename "[${X::actualProject} cget -ProjectDir]/$filename"
+ set filename "[${::X::actualProject} cget -ProjectDir]/$filename"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $filename]} {
- set filename [file join [${X::actualProject} cget -ProjectDir] $filename]
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $filename]} {
+ set filename [file join [${::X::actualProject} cget -ProjectDir] $filename]
}
}
set filename [file normalize $filename]
@@ -9452,7 +9902,7 @@ namespace eval X {
}
## Invoke interrupt monitor window
- # @parm Object project_object = actualProject - Project
+ # @parm Object project_object=actualProject - Project
# @return void
proc __interrupt_monitor args {
variable actualProject ;# Object: Current project
@@ -9461,13 +9911,24 @@ namespace eval X {
if {$project_menu_locked} {return}
if {[string length $args]} {
$args interrupt_monitor_invoke_dialog
- } {
+ } else {
$actualProject interrupt_monitor_invoke_dialog
}
}
+ ## Invoke UART monitor window
+ # @return void
+ proc __uart_monitor args {
+ variable actualProject ;# Object: Current project
+ variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
+
+ if {$project_menu_locked} {return}
+
+ $actualProject uart_monitor_invoke_dialog
+ }
+
## Invoke stack monitor window
- # @parm Object project_object = actualProject - Project
+ # @parm Object project_object=actualProject - Project
# @return void
proc __stack_monitor args {
variable actualProject ;# Object: Current project
@@ -9476,7 +9937,7 @@ namespace eval X {
if {$project_menu_locked} {return}
if {[string length $args]} {
$args stack_monitor_invoke_dialog
- } {
+ } else {
$actualProject stack_monitor_invoke_dialog
}
}
@@ -9525,7 +9986,7 @@ namespace eval X {
}
## Invoke independent hexadecimal editor
- # @return Object - Hexeditor object reference
+ # @return Object - Hex editor object reference
proc __hexeditor {} {
variable independent_hexeditor_count ;# Counter of intances of independent hexadecimal editor
incr independent_hexeditor_count
@@ -9543,7 +10004,7 @@ namespace eval X {
$actualProject editor_procedure {} document_current_func {}
}
- ## Create doxygen configguration file if it does not already exist
+ ## Create doxygen configuration file if it does not already exist
# @return void
proc create_doxyfile {} {
variable doxygen_pid ;# Int: Doxygen PID
@@ -9555,7 +10016,7 @@ namespace eval X {
-parent . \
-type ok \
-icon warning \
- -title [mc "Unable to compile"] \
+ -title [mc "Unable to comply"] \
-message [mc "Something is already running in background."]
return
}
@@ -9564,30 +10025,60 @@ namespace eval X {
make_progressBar_on_Sbar
if {[catch {
+ set path [$actualProject cget -projectPath]
+ if {$::MICROSOFT_WINDOWS} {
+ regsub -all {/} $path "\\" path
+ }
+ $actualProject messages_text_append "\ncd $path\n"
cd [$actualProject cget -projectPath]
- }]} {
+ }]} then {
tk_messageBox \
-parent . \
-type ok \
-icon warning \
-title [mc "Permission denied"] \
- -message [mc "Unable to change diectory to '%s'." [$actualProject cget -projectPath]]
+ -message [mc "Unable to change directory to '%s'." [$actualProject cget -projectPath]]
return
}
- if {![file exists Doxyfile]} {
- $actualProject messages_text_append "\ndoxygen -g Doxyfile\n"
- set doxygen_pid [exec -- \
- doxygen -g Doxyfile && doxygen -u Doxyfile |& \
- tclsh ${::LIB_DIRNAME}/external_command.tcl [tk appname] \
- ::X::doxygen_finish ::X::doxygen_message & \
- ]
- } {
- $actualProject messages_text_append "\ndoxygen -u Doxyfile\n"
- set doxygen_pid [exec -- \
- doxygen -u Doxyfile |& tclsh \
- ${::LIB_DIRNAME}/external_command.tcl [tk appname] \
- ::X::doxygen_finish ::X::doxygen_message & \
- ]
+ if {!$::MICROSOFT_WINDOWS} {
+ if {![file exists Doxyfile]} {
+ $actualProject messages_text_append "doxygen -g Doxyfile\n"
+ set doxygen_pid [exec -- \
+ doxygen -g Doxyfile && doxygen -u Doxyfile |& \
+ tclsh ${::LIB_DIRNAME}/external_command.tcl [tk appname] \
+ ::X::doxygen_finish ::X::doxygen_message & \
+ ]
+ } else {
+ $actualProject messages_text_append "doxygen -u Doxyfile\n"
+ set doxygen_pid [exec -- \
+ doxygen -u Doxyfile |& tclsh \
+ ${::LIB_DIRNAME}/external_command.tcl [tk appname] \
+ ::X::doxygen_finish ::X::doxygen_message & \
+ ]
+ }
+ } else {
+ if {![file exists Doxyfile]} {
+ $actualProject messages_text_append "doxygen -g Doxyfile\n"
+ set doxygen_pid [exec -- \
+ doxygen -g Doxyfile && doxygen -u Doxyfile \
+ |& \
+ "${::INSTALLATION_DIR}/external_command.bat" \
+ "${::INSTALLATION_DIR}/external_command.exe" \
+ "[tk appname]" \
+ ::X::doxygen_finish ::X::doxygen_message & \
+ ]
+ } else {
+ $actualProject messages_text_append "doxygen -u Doxyfile\n"
+ set doxygen_pid [exec -- \
+ doxygen -u Doxyfile \
+ |& \
+ "${::INSTALLATION_DIR}/external_command.bat" \
+ "${::INSTALLATION_DIR}/external_command.exe" \
+ "[tk appname]" \
+ ::X::doxygen_finish ::X::doxygen_message & \
+ ]
+ }
+
}
}
@@ -9606,8 +10097,8 @@ namespace eval X {
set doxygen_build_api_doc 0
if {[catch {
cd [$actualProject cget -projectPath]
- }]} {
- $actualProject messages_text_append [mc "\nUnable to change diectory to '%s'\n" [$actualProject cget -projectPath]]
+ }]} then {
+ $actualProject messages_text_append [mc "\nUnable to change directory to '%s'\n" [$actualProject cget -projectPath]]
destroy_progressBar_on_Sbar
set compilation_in_progress 0
set doxygen_pid 0
@@ -9652,13 +10143,13 @@ namespace eval X {
-parent . \
-type ok \
-icon warning \
- -title [mc "Unable to compile"] \
+ -title [mc "Unable to comply"] \
-message [mc "Something is already running in background."]
return
}
set doxygen_mess_project $actualProject
set doxygen_build_api_doc 1
- if {!$::PROGRAM_AVALIABLE(doxygen)} {
+ if {!$::PROGRAM_AVAILABLE(doxygen)} {
tk_messageBox \
-parent . \
-type ok \
@@ -9671,7 +10162,7 @@ namespace eval X {
create_doxyfile
}
- ## Run doxygen graphical frontend
+ ## Run doxygen graphical front-end
# @return void
proc __run_doxywizard {} {
variable doxygen_mess_project ;# Object: Project related to running doxygen compilation
@@ -9680,7 +10171,7 @@ namespace eval X {
variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
if {$project_menu_locked} {return}
- if {!$::PROGRAM_AVALIABLE(doxywizard)} {
+ if {!$::PROGRAM_AVAILABLE(doxywizard)} {
tk_messageBox \
-parent . \
-type ok \
@@ -9706,8 +10197,8 @@ namespace eval X {
set doxygen_mess_project $actualProject
if {[catch {
cd [$actualProject cget -projectPath]
- }]} {
- $actualProject messages_text_append [mc "\nError: Unable to change diectory to '%s'\n" [$actualProject cget -projectPath]]
+ }]} then {
+ $actualProject messages_text_append [mc "\nError: Unable to change directory to '%s'\n" [$actualProject cget -projectPath]]
return
}
@@ -9734,19 +10225,19 @@ namespace eval X {
-parent . \
-icon warning \
-type ok \
- -title [mc "Unable to compile"] \
+ -title [mc "Unable to comply"] \
-message [mc "Unable to gain file statistics while external editor is used"]
return
}
# Create dialog window (not modal)
incr statistics_counter
- set win [toplevel .statistics$statistics_counter -class {File statistics} -bg {#EEEEEE}]
+ set win [toplevel .statistics$statistics_counter -class {File statistics} -bg ${::COMMON_BG_COLOR}]
# Local variables
- set bold_font [font create -family {helvetica} -size -12 -weight bold]
- set normal_font [font create -family {helvetica} -size -12 -weight normal]
- set header_font [font create -family {helvetica} -size -20 -weight normal]
+ set bold_font [font create -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight bold]
+ set normal_font [font create -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight normal]
+ set header_font [font create -family {helvetica} -size [expr {int(-20 * $::font_size_factor)}] -weight normal]
set statistics [$actualProject editor_procedure {} getFileStatistics {}]
# Create window header
@@ -9784,7 +10275,7 @@ namespace eval X {
grid [Label $main_frame.c_other_name_lbl \
-text [mc "Other characters:"] \
-font $normal_font -pady 0 \
- -helptext [mc "All other charactes without EOLs (e.g. spaces and brackets)"] \
+ -helptext [mc "All other characters without EOLs (e.g. spaces and brackets)"] \
] -row 3 -column 1 -sticky w
grid [label $main_frame.c_other_value_lbl \
-text [lindex $statistics 2] \
@@ -9798,7 +10289,7 @@ namespace eval X {
grid [Label $main_frame.c_total_name_lbl \
-text [mc "Total characters:"] \
-font $normal_font -pady 0 \
- -helptext [mc "All charactes in the text without EOLs"] \
+ -helptext [mc "All characters in the text without EOLs"] \
] -row 5 -column 1 -sticky w
grid [label $main_frame.c_total_value_lbl \
-text [lindex $statistics 3] \
@@ -9861,7 +10352,7 @@ namespace eval X {
grid [Label $main_frame.l_empty_name_lbl \
-text [mc "Empty lines:"] \
-font $normal_font -pady 0 \
- -helptext [mc "Totaly empty lines (without even spaces)"] \
+ -helptext [mc "Totally empty lines (without even spaces)"] \
] -row 15 -column 1 -sticky w
grid [label $main_frame.l_empty_value_lbl \
-text [lindex $statistics 8] \
@@ -9915,18 +10406,18 @@ namespace eval X {
-compound left \
-image ::ICONS::16::ok \
-command "X::statistics_close $statistics_counter" \
- ] -side right
+ ] -side right -padx 2
pack [ttk::button $button_frame.copy \
-text [mc "Copy"] \
-compound left \
-image ::ICONS::16::editcopy \
-command "X::statistics_copy $statistics_counter" \
- ] -side left
+ ] -side left -padx 2
# Pack dialog frames
pack $dialog_header -side top -fill x -pady 5
pack $main_frame -side top -anchor nw -fill x -pady 15 -padx 10
- pack $button_frame -side bottom -anchor se
+ pack $button_frame -side bottom -anchor se -pady 5 -padx 5
# Set window manager options
wm iconphoto $win ::ICONS::16::graph
@@ -9980,15 +10471,15 @@ namespace eval X {
clipboard append [mc " Total lines:\t\t\t%s\n" [$main_frame.l_total_value_lbl cget -text]]
}
- ## Modify main menu and main toolbar acording to configuration of the current editor
+ ## Modify main menu and main toolbar according to configuration of the current editor
# @parm Bool read_only - 1 == Read only; 0 == Normal mode; {} == Do not change
# @parm Bool c_language - 1 == Uses C language; 0 == Uses Assembler; {} == Do not change
# @return void
proc adjust_mainmenu_and_toolbar_to_editor {read_only c_language} {
- variable mainmenu_editor_readonly ;# Menu bar items which are not avaliable when editor is in read only mode
- variable toolbar_editor_readonly ;# Tool bar items which are not avaliable when editor is in read only mode
- variable mainmenu_editor_c_only ;# Menu bar items which are not avaliable only for C language
- variable toolbar_editor_c_only ;# Toolbar items which are not avaliable only for C language
+ variable mainmenu_editor_readonly ;# Menu bar items which are not available when editor is in read only mode
+ variable toolbar_editor_readonly ;# Tool bar items which are not available when editor is in read only mode
+ variable mainmenu_editor_c_only ;# Menu bar items which are not available only for C language
+ variable toolbar_editor_c_only ;# Toolbar items which are not available only for C language
# Read only flag
if {$read_only != {}} {
@@ -10005,11 +10496,11 @@ namespace eval X {
}
## Conditionaly disable menu and toolbar items which
- #+ are not avaliable when external editor used
+ #+ are not available when external editor used
# @return void
proc adjust_mm_and_tb_ext_editor {} {
- variable mainmenu_editor_external_na ;# Menu bar items which are not avaliable when external embedded editor is used
- variable toolbar_editor_external_na ;# Toolbar items which are not avaliable when external embedded editor is used
+ variable mainmenu_editor_external_na ;# Menu bar items which are not available when external embedded editor is used
+ variable toolbar_editor_external_na ;# Toolbar items which are not available when external embedded editor is used
if {!${::Editor::editor_to_use}} {
return
@@ -10041,10 +10532,10 @@ namespace eval X {
}
}
- ## Invoke 8-segment LED display editor
+ ## Invoke 8-Segment LED display editor
# @return void
proc __eightsegment {} {
- variable eightsegment_editors ;# List: All 8-segment LED display editors invoked
+ variable eightsegment_editors ;# List: All 8-Segment LED display editors invoked
lappend eightsegment_editors [EightSegment #auto]
}
@@ -10056,11 +10547,11 @@ namespace eval X {
if {$ascii_chart_win_object != {}} {
if {[$ascii_chart_win_object is_visible]} {
$ascii_chart_win_object raise_window
- } {
+ } else {
$ascii_chart_win_object restore_window
}
- } {
- set ascii_chart_win_object [AsciiChart #this]
+ } else {
+ set ascii_chart_win_object [AsciiChart #auto]
}
}
@@ -10174,6 +10665,7 @@ namespace eval X {
if {$what == 2} {
if {[$actualProject pale_open_scenario $filename]} {
tk_messageBox \
+ -parent . \
-type ok \
-icon error \
-title [mc "IO Error"] \
@@ -10184,6 +10676,7 @@ namespace eval X {
} elseif {$what == -2} {
if {[$actualProject pale_load_scenarion $filename]} {
tk_messageBox \
+ -parent . \
-type ok \
-icon error \
-title [mc "IO Error"] \
@@ -10221,7 +10714,7 @@ namespace eval X {
-parent . \
-title [mc "Error - MCU 8051 IDE"] \
-message [mc "Unable to load file: %s" $filename]
- } {
+ } else {
$actualProject editor_procedure {} highlight_visible_area {}
}
@@ -10311,25 +10804,25 @@ namespace eval X {
Notes #auto {} {}
}
- ## Invoke "Base convertor"
+ ## Invoke "Base converter"
# @return void
- proc __base_convertor {} {
- variable base_convertors ;# List: All base convertor objects
+ proc __base_converter {} {
+ variable base_converters ;# List: All base converter objects
- set obj [BaseConvertor #auto]
- lappend base_convertors ::X::$obj
+ set obj [BaseConverter #auto]
+ lappend base_converters ::X::$obj
return $obj
}
- ## Close "Base convertor"
+ ## Close "Base converter"
# @return void
- proc __base_convertor_close {obj} {
- variable base_convertors ;# List: All base convertor objects
+ proc __base_converter_close {obj} {
+ variable base_converters ;# List: All base converter objects
- set idx [lsearch -ascii -exact $base_convertors $obj]
+ set idx [lsearch -ascii -exact $base_converters $obj]
if {$idx != -1} {
- set base_convertors [lreplace $base_convertors $idx $idx]
+ set base_converters [lreplace $base_converters $idx $idx]
}
}
@@ -10366,6 +10859,191 @@ namespace eval X {
return [LedMatrix #auto $actualProject]
}
+ ## Invoke "Virtual UART Terminal" (section Virtual Hardware)
+ # @return void
+ proc __vhw_UART_terminal {} {
+ variable actualProject ;# Object: Current project
+ variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
+
+ if {$project_menu_locked} {return}
+
+ return [VirtualUARTTerminal #auto $actualProject]
+ }
+
+ ## Invoke "File Interface" (section Virtual Hardware)
+ # @return void
+ proc __vhw_file_interface {} {
+ variable actualProject ;# Object: Current project
+ variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
+
+ if {$project_menu_locked} {return}
+
+ return [PaleFileInterface #auto $actualProject]
+ }
+
+ ## Invoke "LCD display controlled by HD44780" (section Virtual Hardware)
+ # @parm List $display_size={} - Size of the LCD display to create, format: {rows columns}, empty list means invoke size selection dialog
+ # @return void
+ #
+ # Note: If the first argument is omitted then this function will create a "Size selection dialog"
+ proc __vhw_HD44780 {{display_size {}}} {
+ variable actualProject ;# Object: Current project
+ variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
+ variable vhw_HD44780_rect ;# Array: Rectangles in dialog "Set display size"
+ variable vhw_HD44780_canvas ;# Widget: Canvas widget in dialog "Set display size"
+ variable vhw_HD44780_counter ;# Int: Counter of dialog instances
+ variable vhw_HD44780_size_lbl ;# Widget: Label showing the LCD size in dialog "Set display size"
+ variable vhw_HD44780_dialog ;# Widget: Toplevel window of dialog "Set display size"
+ variable vhw_HD44780_size ;# List of Int: LCD display size chosen by the user, {HEIGHT WIDTH}
+
+ # This function requires at least one project opened
+ if {$project_menu_locked} {return}
+
+ # LCD display size specified -- create the display and return
+ if {[llength $display_size]} {
+ set object [LcdHD44780 #auto $actualProject]
+ $object set_config [list [lindex $display_size 0] [lindex $display_size 1]]
+ return $object
+ }
+
+
+ # --------------------------------------------------------------
+ # Create the size selection dialog
+ # --------------------------------------------------------------
+
+ # Create the dialog window
+ set dialog [toplevel .set_lcd_size$vhw_HD44780_counter -class {Set display size} -bg ${::COMMON_BG_COLOR}]
+
+ # Set some namespace variables
+ incr vhw_HD44780_counter ;# Int: Counter of dialog instances
+ set vhw_HD44780_dialog $dialog ;# Widget: Toplevel window of dialog "Set display size"
+ set vhw_HD44780_size {0 0} ;# List of Int: LCD display size chosen by the user, {HEIGHT WIDTH}
+
+ # Create top frame (text: "Set display size" and actual display size)
+ set top_frame [frame $dialog.top_frame]
+ pack [label $top_frame.header_lbl \
+ -text [mc "Set display size"] \
+ -font [font create \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -family {helvetica}] \
+ ] -side left -padx 10
+ set vhw_HD44780_size_lbl [label $top_frame.size_lbl \
+ -text {0 × 0} \
+ -text [mc "Set display size"] \
+ -font [font create \
+ -size [expr {int(-16 * $::font_size_factor)}] \
+ -family {helvetica} -weight {bold}] \
+ ]
+ pack $vhw_HD44780_size_lbl -side right -padx 10
+ pack $top_frame -fill x
+
+ ## Create the matrix of rectangles for display size selection
+ set w 12
+ set h 17
+ set x0 3
+ set x $x0
+ set y 3
+ set canvas [canvas $dialog.canvas \
+ -bg {#FFFFFF} \
+ -height [expr {2 * ($h + 3) + 6}] \
+ -width [expr {40 * ($w + 3) + 6}] \
+ -bd 0 \
+ -highlightthickness 0 \
+ ]
+ set vhw_HD44780_canvas $canvas
+ for {set row 1} {$row <= 2} {incr row} {
+ for {set col 1} {$col <= 40} {incr col} {
+ set r [$canvas create rectangle \
+ $x \
+ $y \
+ [expr {$x + $w}] \
+ [expr {$y + $h}] \
+ -outline {#0000FF} \
+ ]
+
+ incr x $w
+ incr x 3
+
+ set vhw_HD44780_rect($row,$col) $r
+
+ $canvas bind $r <Enter> [list ::X::vhw_HD44780_ENTER $row $col]
+ $canvas bind $r <Leave> [list ::X::vhw_HD44780_ENTER 0 0]
+ $canvas bind $r <Button-1> [list ::X::vhw_HD44780_GO $row $col]
+ }
+ set x $x0
+ incr y $h
+ incr y 3
+ }
+ pack $canvas
+
+ # Set window parameters
+ wm iconphoto $dialog ::ICONS::16::set_lcd_size
+ wm title $dialog [mc "Set display size"]
+ wm resizable $dialog 0 0
+ wm protocol $dialog WM_DELETE_WINDOW {
+ X::vhw_HD44780_CANCEL
+ }
+ wm transient $dialog .
+ update
+ raise $dialog
+ catch {grab $dialog}
+
+ # Wait the dialog window is destroyed
+ tkwait window $dialog
+
+ # If the size was set then create the display
+ if {[lindex $vhw_HD44780_size 0] && [lindex $vhw_HD44780_size 1]} {
+ set object [LcdHD44780 #auto $actualProject]
+ $object set_config [list [lindex $vhw_HD44780_size 0] [lindex $vhw_HD44780_size 1]]
+ return $object
+ }
+ }
+
+ ## Handle pointer enter event in the canvas widget of the LCD display size selection dialog
+ # @parm Int target_row - Designated row
+ # @parm Int target_col - Designated column
+ # @return void
+ proc vhw_HD44780_ENTER {target_row target_col} {
+ variable vhw_HD44780_rect ;# Array: Rectangles in dialog "Set display size"
+ variable vhw_HD44780_canvas ;# Widget: Canvas widget in dialog "Set display size"
+ variable vhw_HD44780_size_lbl ;# Widget: Label showing the LCD size in dialog "Set display size"
+
+ # Adjust appearance of the matrix of rectangles
+ for {set row 1} {$row <= 2} {incr row} {
+ for {set col 1} {$col <= 40} {incr col} {
+ if {$row <= $target_row && $col <= $target_col} {
+ set fill {#AAFFDD}
+ } else {
+ set fill {#FFFFFF}
+ }
+ $vhw_HD44780_canvas itemconfigure $vhw_HD44780_rect($row,$col) -fill $fill
+ }
+ }
+
+ # Adjust contents of the label displaying the designated size
+ $vhw_HD44780_size_lbl configure -text [format {%d × %d} $target_row $target_col]
+ }
+
+ ## Set display size and close the LCD display size selection dialog
+ # @parm Int rows - Number of rows
+ # @parm Int cols - Number of columns
+ # @return void
+ proc vhw_HD44780_GO {rows cols} {
+ variable vhw_HD44780_size ;# List of Int: LCD display size chosen by the user, {HEIGHT WIDTH}
+ set vhw_HD44780_size [list $rows $cols]
+ vhw_HD44780_CANCEL
+ }
+
+ ## Close the LCD display size selection dialog
+ # @return void
+ proc vhw_HD44780_CANCEL {} {
+ variable vhw_HD44780_dialog ;# Widget: Toplevel window of dialog "Set display size"
+
+ if {[winfo exists $vhw_HD44780_dialog]} {
+ destroy $vhw_HD44780_dialog
+ }
+ }
+
## Invoke "Multiplexed LED display" (section Virtual Hardware)
# @return void
proc __vhw_M_LED_display {} {
@@ -10388,6 +11066,17 @@ namespace eval X {
return [SimpleKeyPad #auto $actualProject]
}
+ ## Invoke "DS1620 temperature sensor" (section Virtual Hardware)
+ # @return void
+ proc __vhw_ds1620 {} {
+ variable actualProject ;# Object: Current project
+ variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
+
+ if {$project_menu_locked} {return}
+
+ return [Ds1620 #auto $actualProject]
+ }
+
## Invoke "Matrix keypad" (section Virtual Hardware)
# @return void
proc __vhw_matrix_keypad {} {
@@ -10410,13 +11099,15 @@ namespace eval X {
# Ask user for save modified VHW scenario
if {[${::X::actualProject} pale_modified]} {
if {[tk_messageBox \
- -type yesno \
- -icon question \
+ -parent . \
+ -type yesno \
+ -icon question \
-title [mc "File modified"] \
-message [mc "The current VHW connections have been modified,\ndo you want to save them before closing ?"]
] == {yes}} then {
if {![$actualProject pale_save]} {
tk_messageBox \
+ -parent . \
-type ok \
-icon error \
-title [mc "IO Error"] \
@@ -10431,6 +11122,7 @@ namespace eval X {
-title [mc "Open file - Virtual HW - MCU 8051 IDE"] \
-directory [$actualProject cget -projectPath] \
-defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "All relevant"] {*.{vhw,vhc}}] \
[list [mc "Virtual HW"] {*.vhw}] \
[list [mc "VH component"] {*.vhc}] \
[list [mc "All files"] {*}] \
@@ -10441,11 +11133,12 @@ namespace eval X {
set filename [::fsd get]
if {[${::X::actualProject} pale_open_scenario $filename]} {
tk_messageBox \
+ -parent . \
-type ok \
-icon error \
-title [mc "IO Error"] \
-message [mc "Unable to read file:\n\"%s\"" $filename]
- } {
+ } else {
::X::recent_files_add 2 $filename
}
}
@@ -10468,6 +11161,7 @@ namespace eval X {
-title [mc "Load file - Virtual HW - MCU 8051 IDE"] \
-directory [$actualProject cget -projectPath] \
-defaultmask 0 -multiple 1 -filetypes [list \
+ [list [mc "All relevant"] {*.{vhw,vhc}}] \
[list [mc "Virtual HW"] {*.vhw}] \
[list [mc "VH component"] {*.vhc}] \
[list [mc "All files"] {*}] \
@@ -10478,11 +11172,12 @@ namespace eval X {
foreach filename [::fsd get] {
if {[${::X::actualProject} pale_load_scenarion $filename]} {
tk_messageBox \
+ -parent . \
-type ok \
-icon error \
-title [mc "IO Error"] \
-message [mc "Unable to read file:\n\"%s\"" $filename]
- } {
+ } else {
::X::recent_files_add 2 $filename
}
}
@@ -10538,7 +11233,7 @@ namespace eval X {
-title [mc "Overwrite file"] \
-message [mc "A file name '%s' already exists. Do you want to overwrite it ?" [file tail $filename]]
] != {yes}
- } {
+ } then {
set abort 1
}
}
@@ -10546,11 +11241,12 @@ namespace eval X {
if {!$abort} {
if {![${::X::actualProject} pale_save_as $filename]} {
tk_messageBox \
+ -parent . \
-type ok \
-icon error \
-title [mc "IO Error"] \
-message [mc "Unable to save file:\n\"%s\"" $filename]
- } {
+ } else {
::X::recent_files_add 2 $filename
}
}
@@ -10576,14 +11272,14 @@ namespace eval X {
-title [mc "Are you sure ?"] \
-message [mc "Do you really want to remove all virtual hardware from the current simulation scenario ?"]
] != {yes}
- } {
+ } then {
return
}
$actualProject pale_forget_all
}
- ## Toggle fullscreen mode
+ ## Toggle full screen mode
# @return void
proc __toggle_fullscreen {} {
# Normal window
@@ -10592,14 +11288,21 @@ namespace eval X {
.mainIconBar.fullscreen configure -image ::ICONS::22::window_fullscreen
}
wm attributes . -fullscreen 0
- # Fullscreen window
- } {
+ # Full screen window
+ } else {
if {[winfo exists .mainIconBar.fullscreen]} {
.mainIconBar.fullscreen configure -image ::ICONS::22::window_nofullscreen
}
wm attributes . -fullscreen 1
}
+ # Without this help windows won't work properly on MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ after idle {
+ wm geometry . [wm geometry .]
+ }
+ }
+
# Restore position of bottom pane
after 300 {
foreach project ${::X::openedProjects} {
@@ -10630,19 +11333,189 @@ namespace eval X {
proc __functional_diagram {type} {
}
- ## Invoke a virtual terminal of the given type
- # @parm Int type -
+ ## Open arbitrary URI in user preffered application
+ # @parm String uri -- URI to open
# @return void
- proc __virtual_terminal {type} {
- variable actualProject ;# Object: Current project
- variable project_menu_locked ;# Bool: Indicates than there is at least one opened project
+ proc open_uri {uri} {
+ # On Linux and similars systems we use "xdg-open"
+ if {!$::MICROSOFT_WINDOWS} {
+ catch {
+ exec -- xdg-open $uri &
+ }
- if {$project_menu_locked} {return}
+ # On MS Windows we use its buildin command "start"
+ } else {
+ catch {
+ exec -- "cmd" "/c" "start [regsub -all {[^/\\]+\s[^/\\]*} $uri {"&"}]" &
+ }
+ }
+ }
- switch -- $type {
- {u} {
- $actualProject virtual_uart_termial_invoke_dialog
+ ## Open project web page in user preferred browser
+ # @return void
+ proc __web_page {} {
+ open_uri {http://mcu8051ide.sourceforge.net}
+ }
+
+ ## Open web page for reporting bugs in user preferred browser
+ # @return void
+ proc __bug_report {} {
+ open_uri {http://sourceforge.net/tracker/?group_id=185864&atid=914981}
+ }
+
+ ## Open handbook in user preferred PDF reader
+ # @return void
+ proc __handbook {} {
+ if {[file exists "${::INSTALLATION_DIR}/doc/handbook/mcu8051ide.${::GLOBAL_CONFIG(language)}.pdf"]} {
+ open_uri "${::INSTALLATION_DIR}/doc/handbook/mcu8051ide.${::GLOBAL_CONFIG(language)}.pdf"
+ } else {
+ open_uri "${::INSTALLATION_DIR}/doc/handbook/mcu8051ide.en.pdf"
+ }
+ }
+
+ ## Open web page with SDCC manual in user preferred browser
+ # @return void
+ proc __sdcc_manual {} {
+ open_uri {http://sdcc.sourceforge.net/doc/sdccman.html}
+ }
+
+ ## Open web page with ASEM-51 manual in user preferred browser
+ # @return void
+ proc __asem51_manual {} {
+ open_uri {http://plit.de/asem-51/docs.htm}
+ }
+
+ ## Open interactive 8051 instruction table
+ # @return void
+ proc __table_of_instructions {} {
+ variable table_of_instructions_object ;# Object: Interactive 8051 instruction table
+ if {$table_of_instructions_object != {}} {
+ if {[$table_of_instructions_object is_visible]} {
+ $table_of_instructions_object raise_window
+ } else {
+ $table_of_instructions_object restore_window
}
+ } else {
+ set table_of_instructions_object [TableOfInstructions #auto]
+ }
+ }
+
+ ## Make sure that there are no help windows visible
+ # @return void
+ proc remove_all_help_windows {} {
+ variable openedProjects ;# List of opened projects (Object references)
+
+ foreach project $openedProjects {
+ $project file_details_win_hide
}
+ ::Editor::close_completion_popup_window_NOW
+ close_project_details
+ help_window_hide
}
+
+ ## Perform secure send command
+ # Secure means that it will not crash or something like that in case of any errors.
+ # But instead it will popup an error message to the user (Tk dialog).
+ # @parm List args - Arguments for the send command
+ # @return void
+ proc secure_send args {
+ if {[catch {
+ eval "send $args"
+ } result]} then {
+ puts stderr "Unknown IO Error :: $result"
+ return 1
+
+ } else {
+ return 1
+ }
+ }
+
+ proc __d52 {} {
+ variable critical_procedure_in_progress ;# Bool: Disables procedures which takes a long time
+
+ if {$critical_procedure_in_progress} {return}
+
+ # Create dialog window
+ set win [toplevel .d52_open_dialog -class {Disassemble with D52} -bg ${::COMMON_BG_COLOR}]
+ set mainframe [frame $win.frame]
+
+ # Label, Entry and Button "Input file"
+ grid [Label $mainframe.lbl_input \
+ -text [mc "Input file"] \
+ -helptext [mc "File to disassemble"] \
+ ] -column 1 -row 1 -sticky w
+ grid [ttk::entry $mainframe.entry_input \
+ -textvariable X::input_file \
+ -width 50 \
+ ] -column 2 -row 1 -sticky we
+ DynamicHelp::add $mainframe.entry_input -text [mc "File to disassemble"]
+ grid [ttk::button $mainframe.button_select_input_file \
+ -image ::ICONS::16::fileopen \
+ -takefocus 0 \
+ -style Flat.TButton \
+ -command {
+ # Invoke file selection dialog
+ X::select_input_output 1 {{hex,ihx}} .d52_open_dialog
+ } \
+ ] -column 3 -row 1 -sticky e
+ DynamicHelp::add $mainframe.button_select_input_file \
+ -text [mc "Invoke dialog to select input file"]
+
+ # Create separator
+ grid [ttk::separator $mainframe.separator \
+ -orient horizontal \
+ ] -column 1 -columnspan 3 -row 2 -sticky we -pady 10
+
+ # Create buttons "Ok" and "Cancel"
+ set button_frame [frame $mainframe.button_frame]
+ pack [ttk::button $button_frame.button_ok \
+ -text [mc "Ok"] \
+ -command {X::d52_OK} \
+ -compound left \
+ -image ::ICONS::16::ok \
+ ] -side left -padx 5
+ pack [ttk::button $button_frame.button_cancel \
+ -text [mc "Cancel"] \
+ -command {X::d52_CANCEL} \
+ -compound left \
+ -image ::ICONS::16::button_cancel \
+ ] -side left -padx 5
+ grid $button_frame -column 1 -columnspan 3 -row 3
+
+ pack $mainframe -fill both -expand 1 -padx 5 -pady 5
+
+ # Event bindings (Enter == Ok; Escape == Cancel)
+ bind $win <KeyRelease-Return> {X::d52_OK; break}
+ bind $win <KeyRelease-KP_Enter> {X::d52_OK; break}
+ bind $win <KeyRelease-Escape> {X::d52_CANCEL; break}
+
+ # Set window attributes -- modal window
+ wm iconphoto $win ::ICONS::16::d52
+ wm title $win [mc "Disassemble with D52 - MCU 8051 IDE"]
+ wm minsize $win 450 70
+ wm resizable $win 0 0
+ wm protocol $win WM_DELETE_WINDOW {
+ X::d52_CANCEL
+ }
+ wm transient $win .
+ catch {grab $win}
+ raise $win
+ tkwait window $win
+ }
+
+ proc d52_CANCEL {} {
+ catch {
+ destroy .d52_open_dialog
+ }
+ }
+
+ proc d52_OK {} {
+ variable input_file ;# Input file
+
+ d52_CANCEL
+ }
+}
+
+# >>> File inclusion guard
}
+# <<< File inclusion guard
diff --git a/lib/bottompanel/bottomnotebook.tcl b/lib/bottompanel/bottomnotebook.tcl
index 463f93d..d4d1293 100755..100644
--- a/lib/bottompanel/bottomnotebook.tcl
+++ b/lib/bottompanel/bottomnotebook.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 _BOTTOMNOTEBOOK_TCL ] } {
+set _BOTTOMNOTEBOOK_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements bottom panel of the project tab
@@ -45,14 +50,13 @@ class BottomNoteBook {
public variable cvarsview_frame ;# Identifier of tab of NoteBook widget for c variables
public variable graph_frame ;# Identifier of tab of NoteBook widget for graph
public variable messages_frame ;# Identifier of tab of NoteBook widget for messages box
- public variable todo_frame ;# Identifier of tab of NoteBook widget for todo box
+ public variable todo_frame ;# Identifier of tab of NoteBook widget for to do box
public variable calculator_frame ;# Identifier of tab of NoteBook widget for calculator
public variable terminal_frame ;# Identifier of tab of NoteBook widget for terminal
public variable findinfiles_frame ;# Identifier of tab of NoteBook widget for terminal
## Private
private variable pri_notebook ;# Identifier of NoteBook widget when panel is visible
- private variable sec_notebook ;# Identifier of NoteBook widget when panel is hidden
private variable main_frame ;# Identifier of frame containing both NoteBooks
private variable panel_hidding_ena 1 ;# Is panel hidding enabled
@@ -69,10 +73,10 @@ class BottomNoteBook {
if {$active_page == {Terminal}} {
set active_page {Simulator}
} elseif {
- [lsearch {Simulator CVarsView Graph Messages Todo Calculator FindInFiles} $active_page] == -1
- } {
- puts stderr "Invalid value of active page '$active_page', setting to {Simulator}"
- set active_page {Simulator}
+ [lsearch {Simulator CVarsView Graph Messages Todo Calculator FindInFiles} $active_page] == -1
+ } then {
+ puts stderr "Invalid value of active page '$active_page', setting to {Simulator}"
+ set active_page {Simulator}
}
}
@@ -86,11 +90,11 @@ class BottomNoteBook {
## Create Bottom NoteBook (This function must be called after contructor)
# @parm widget mainframe - Frame for bottom notebook
# @parm widget PaneWindow - parent pane window contaier
- # @parm String todoText - content of todo text
+ # @parm String todoText - content of to do text
# @parm List calculatorList - List of values for calculator (display content, radix, etc.)
# @parm List graph_config - Graph configuration list
# @return Widget - ID of frame containg both notebooks
- public method initiate_BottomNoteBook {mainframe PaneWindow todoText calculatorList graph_config} {
+ public method initalize_BottomNoteBook {mainframe PaneWindow todoText calculatorList graph_config} {
# set parent pane window
set parentPane $PaneWindow
@@ -99,18 +103,7 @@ class BottomNoteBook {
# Frame for primary and secondary notebook
set main_frame $mainframe
# Primary notebook
- set pri_notebook [NoteBook $main_frame.ntb_bottomNB_pri \
- -side top -bd 1 \
- -arcradius 4 -bg {#EEEEEE} \
- -font [font create -family {helvetica} -size -12 -weight bold] \
- ]
- # Secondary notebook
- set sec_notebook [NoteBook $main_frame.ntb_bottomNB_sec \
- -side top \
- -arcradius 4 \
- -borderwidth 1 -bg {#EEEEEE} \
- -font [font create -family {helvetica} -size -12 -weight bold] \
- ]
+ set pri_notebook [ModernNoteBook $main_frame.ntb_bottomNB_pri]
# Register notebook status bar tips
notebook_Sbar_set {bottomnb} [list \
@@ -127,150 +120,92 @@ class BottomNoteBook {
]
$pri_notebook bindtabs <Enter> "notebook_Sbar bottomnb"
$pri_notebook bindtabs <Leave> "Sbar {} ;#"
- $sec_notebook bindtabs <Enter> "notebook_Sbar bottomnb"
- $sec_notebook bindtabs <Leave> "Sbar {} ;#"
## create Primary NoteBook tabs
# Tab "Simulator"
- set simulator_frame [$pri_notebook insert end {Simulator} \
- -text [mc "Simulator"] \
- -image ::ICONS::16::kcmmemory \
- -raisecmd "$this bottomNB_set_active_page {Simulator}" \
- -helptext [mc "Simulator panel %s" "(Ctrl+1)"] \
- -createcmd [list $this CreateSimulatorGUI] \
+ set simulator_frame [$pri_notebook insert end {Simulator} \
+ -text [mc "Simulator"] \
+ -image ::ICONS::16::kcmmemory \
+ -raisecmd [list $this bottomNB_set_active_page {Simulator}] \
+ -helptext [mc "Simulator panel %s" "(Ctrl+1)"] \
+ -createcmd [list $this CreateSimulatorGUI] \
]
# Tab "C variables"
- set cvarsview_frame [$pri_notebook insert end {CVarsView} \
- -text [mc "C variables"] \
- -image ::ICONS::16::player_playlist \
- -raisecmd "$this bottomNB_set_active_page {CVarsView}" \
- -helptext [mc "Variables from C source code %s" ""] \
- -createcmd [list $this CreateCVarsViewGUI] \
+ set cvarsview_frame [$pri_notebook insert end {CVarsView} \
+ -text [mc "C variables"] \
+ -image ::ICONS::16::player_playlist \
+ -raisecmd [list $this bottomNB_set_active_page {CVarsView}] \
+ -helptext [mc "Variables from C source code %s" ""] \
+ -createcmd [list $this CreateCVarsViewGUI] \
]
# Tab "Graph"
set graph_frame [$pri_notebook insert end {Graph} \
-text [mc "IO Ports"] \
-image ::ICONS::16::graph \
- -raisecmd "$this bottomNB_set_active_page {Graph}" \
+ -raisecmd [list $this bottomNB_set_active_page {Graph}] \
-helptext [mc "Graph showing state of MCU ports %s" "(Ctrl+2)"] \
-createcmd [list $this CreateGraphGUI] \
]
# Tab "Messages"
- set messages_frame [$pri_notebook insert end {Messages} \
- -text [mc "Messages"] \
- -image ::ICONS::16::kcmsystem \
- -raisecmd "$this bottomNB_set_active_page {Messages}" \
- -helptext [mc "Compiler messages %s" "(Ctrl+3)"] \
- -createcmd [list $this CreateMessagesGUI] \
+ set messages_frame [$pri_notebook insert end {Messages} \
+ -text [mc "Messages"] \
+ -image ::ICONS::16::kcmsystem \
+ -raisecmd [list $this bottomNB_set_active_page {Messages}] \
+ -helptext [mc "Compiler messages %s" "(Ctrl+3)"] \
+ -createcmd [list $this CreateMessagesGUI] \
+ -leavecmd "
+ $pri_notebook itemconfigure {Messages} -image ::ICONS::16::kcmsystem
+ " \
]
# Tab "Notes"
set todo_frame [$pri_notebook insert end {Todo} \
-text [mc "Notes"] \
-image ::ICONS::16::camera_test \
- -raisecmd "$this bottomNB_set_active_page {Todo}" \
- -helptext [mc "Personal todo list & notepad %s" "(Ctrl+4)"]\
+ -raisecmd [list $this bottomNB_set_active_page {Todo}] \
+ -helptext [mc "Personal to do list & notepad %s" "(Ctrl+4)"]\
-createcmd [list $this CreateTodoGUI] \
]
# Tab "Calculator"
- set calculator_frame [$pri_notebook insert end {Calculator} \
- -text [mc "Calculator"] \
- -image ::ICONS::16::xcalc \
- -raisecmd "$this bottomNB_set_active_page {Calculator}" \
- -helptext [mc "Scientific calculator %s" "(Ctrl+5)"] \
- -createcmd [list $this CreateCalculatorGUI] \
+ set calculator_frame [$pri_notebook insert end {Calculator} \
+ -text [mc "Calculator"] \
+ -image ::ICONS::16::xcalc \
+ -raisecmd [list $this bottomNB_set_active_page {Calculator}] \
+ -helptext [mc "Scientific calculator %s" "(Ctrl+5)"] \
+ -createcmd [list $this CreateCalculatorGUI] \
]
if {!$::MICROSOFT_WINDOWS} { ;# Microsoft Windows has no terminal emulator
# Tab "Terminal"
- set terminal_frame [$pri_notebook insert end {Terminal} \
- -text [mc "Terminal"] \
- -image ::ICONS::16::terminal \
- -raisecmd "$this bottomNB_set_active_page {Terminal}" \
- -helptext [mc "Terminal emulator %s" ""] \
- -createcmd [list $this CreateTerminalEmulGUI] \
- -state [expr {${::PROGRAM_AVALIABLE(urxvt)} ? "normal" : "disabled"}] \
+ set terminal_frame [$pri_notebook insert end {Terminal} \
+ -text [mc "Terminal"] \
+ -image ::ICONS::16::terminal \
+ -raisecmd [list $this bottomNB_set_active_page {Terminal}] \
+ -helptext [mc "Terminal emulator %s" ""] \
+ -createcmd [list $this CreateTerminalEmulGUI] \
+ -state [expr {${::PROGRAM_AVAILABLE(urxvt)} ? "normal" : "disabled"}] \
]
}
# Tab "Find in files"
- set findinfiles_frame [$pri_notebook insert end {FindInFiles} \
- -text [mc "Find in files"] \
- -image ::ICONS::16::filefind \
- -raisecmd "$this bottomNB_set_active_page {FindInFiles}"\
- -helptext [mc "Find in files %s" ""] \
- -createcmd [list $this CreateFindInFilesGUI] \
+ set findinfiles_frame [$pri_notebook insert end {FindInFiles} \
+ -text [mc "Find in files"] \
+ -image ::ICONS::16::filefind \
+ -raisecmd [list $this bottomNB_set_active_page {FindInFiles}] \
+ -helptext [mc "Find in files %s" ""] \
+ -createcmd [list $this CreateFindInFilesGUI] \
]
# Tab "Hide"
- $pri_notebook insert end {Hide} \
- -text [mc "Hide"] \
- -image ::ICONS::16::2downarrow \
- -raisecmd "$this bottomNB_show_hide" \
- -helptext [mc "Hide this panel"] \
-
- ## Create Secondary NoteBook tabs
- # tab "Simulator"
- $sec_notebook insert end {Simulator} \
- -text [mc "Simulator"] \
- -image ::ICONS::16::kcmmemory \
- -raisecmd "$this bottomNB_show_hide Simulator" \
- -helptext [mc "Simulator panel %s" "(Ctrl+1)"]
- # tab "C variables"
- $sec_notebook insert end {CVarsView} \
- -text [mc "C variables"] \
- -image ::ICONS::16::player_playlist \
- -raisecmd "$this bottomNB_show_hide CVarsView" \
- -helptext [mc "Variables from C source code %s" ""]
- # tab "Graph"
- $sec_notebook insert end {Graph} \
- -text [mc "IO Ports"] \
- -image ::ICONS::16::graph \
- -raisecmd "$this bottomNB_show_hide Graph" \
- -helptext [mc "Graph showing state of MCU ports %s" "(Ctrl+2)"]
- # tab "Messages"
- $sec_notebook insert end {Messages} \
- -text [mc "Messages"] \
- -image ::ICONS::16::kcmsystem \
- -raisecmd "$this bottomNB_show_hide Messages" \
- -helptext [mc "Compiler messages %s" "(Ctrl+3)"]
- # tab "Notes"
- $sec_notebook insert end {Todo} \
- -text [mc "Notes"] \
- -image ::ICONS::16::camera_test \
- -raisecmd "$this bottomNB_show_hide Todo" \
- -helptext [mc "Personal todo list & notepad %s" "(Ctrl+4)"]
- # tab "Calculator"
- $sec_notebook insert end {Calculator} \
- -text [mc "Calculator"] \
- -image ::ICONS::16::xcalc \
- -raisecmd "$this bottomNB_show_hide Calculator" \
- -helptext [mc "Scientific calculator %s" "(Ctrl+5)"]
- if {!$::MICROSOFT_WINDOWS} { ;# Microsoft Windows has no terminal emulator
- # tab "Terminal"
- $sec_notebook insert end {Terminal} \
- -text [mc "Terminal"] \
- -image ::ICONS::16::terminal \
- -raisecmd "$this bottomNB_show_hide Terminal" \
- -helptext [mc "Terminal emulator %s" ""] \
- -state [expr {${::PROGRAM_AVALIABLE(urxvt)} ? "normal" : "disabled"}]
- }
- # tab "Find in files"
- $sec_notebook insert end {FindInFiles} \
- -text [mc "Find in files"] \
- -image ::ICONS::16::filefind \
- -raisecmd "$this bottomNB_show_hide FindInFiles" \
- -helptext [mc "Find in files %s" ""] \
- -createcmd [list $this CreateFindInFilesGUI]
- # tab "Show"
- $sec_notebook insert end {Show} \
- -text [mc "Show"] \
- -image ::ICONS::16::2uparrow \
- -raisecmd "$this bottomNB_show_hide" \
- -helptext [mc "Show this panel"]
+ $pri_notebook insert end {Hide} \
+ -text [mc "Hide"] \
+ -image ::ICONS::16::2downarrow \
+ -raisecmd [list $this bottomNB_show_hide] \
+ -helptext [mc "Hide this panel"] \
# Prepare panel componenets but do not create GUI elements
PrepareCalculator $calculator_frame $calculatorList
PrepareGraph $graph_frame $graph_config
PrepareMessages $messages_frame
PrepareTodo $todo_frame $todoText
+
PrepareSimulator $simulator_frame
PrepareCVarsView $cvarsview_frame
if {!$::MICROSOFT_WINDOWS} { ;# Microsoft Windows has no terminal emulator
@@ -278,25 +213,30 @@ class BottomNoteBook {
}
PrepareFindInFiles $findinfiles_frame
-
# take case of proper pane resizing
bind $parentPane <ButtonRelease-1> "$this bottomNB_panel_set_size"
# Show primary notebook if panel is visible or secondary notebook ohterwise
+ pack [$pri_notebook get_nb] -expand 1 -fill both -padx 5 -pady 5
if {$PanelVisible != 0} {
- pack $pri_notebook -expand 1 -fill both
- $parentPane paneconfigure $main_frame -minsize 190
- $parentPane configure -sashwidth 2
+ $parentPane paneconfigure $main_frame -minsize 215
+ $parentPane configure -sashwidth 4
# Raise tab
catch {$pri_notebook raise $active_page}
- } {
- pack $sec_notebook -anchor nw -fill x -expand 1
+ } else {
+ $pri_notebook hide_pages_area
+ $pri_notebook deselect_tab_button
+ $pri_notebook itemconfigure {Hide} \
+ -text [mc "Show"] \
+ -image ::ICONS::16::2uparrow \
+ -helptext [mc "Show this panel"]
+
$parentPane paneconfigure $main_frame -minsize 0
$parentPane configure -sashwidth 0
bind $parentPane <Button> {break}
set last_PanelSize $PanelSize
- set PanelSize 24
+ set PanelSize 34
}
}
@@ -309,7 +249,7 @@ class BottomNoteBook {
public method getBottomPanelSize {} {
if {$PanelVisible} {
return $PanelSize
- } {
+ } else {
return $last_PanelSize
}
}
@@ -332,13 +272,18 @@ class BottomNoteBook {
Calculator {$this CalculatorTabRaised}
FindInFiles {$this FindInFilesTabRaised}
}
- set active_page $pageName
+ if {$pageName != {Hide}} {
+ set active_page $pageName
+ }
+ if {!$PanelVisible} {
+ bottomNB_show_hide
+ }
}
## Show or hide the panel
- # @parm String args = NULL - name of active page (show panel)
+ # @parm String a_page={} - name of active page (show panel)
# @return void
- public method bottomNB_show_hide args {
+ public method bottomNB_show_hide {{a_page {}}} {
# If panel hidding is disabled -- abort
if {!$panel_hidding_ena} {return}
@@ -347,17 +292,17 @@ class BottomNoteBook {
if {$PanelVisible} {
$parentPane paneconfigure $main_frame -minsize 0
- # Ged rid of primary notebook
- pack forget $pri_notebook ;# Hide primary notebook
+ $pri_notebook hide_pages_area
+ $pri_notebook deselect_tab_button
+ $pri_notebook itemconfigure {Hide} \
+ -text [mc "Show"] \
+ -image ::ICONS::16::2uparrow \
+ -helptext [mc "Show this panel"]
set last_PanelSize $PanelSize ;# Save current panel size
- set PanelSize 24 ;# Set New panel size
+ set PanelSize 34 ;# Set New panel size
bottomNB_redraw_pane ;# Perform hidding
- # Create and show secondary notebook
- pack $sec_notebook -anchor nw -fill x -expand 1
- $sec_notebook compute_size
set panel_hidding_ena 0
- $sec_notebook raise $active_page
set panel_hidding_ena 1
$parentPane configure -sashwidth 0
bind $parentPane <Button> {break}
@@ -366,32 +311,34 @@ class BottomNoteBook {
set PanelVisible 0
# Show the panel
- } {
- $parentPane paneconfigure $main_frame -minsize 190
+ } else {
+ $parentPane paneconfigure $main_frame -minsize 215
- # Hide secondary notebook
- pack forget $sec_notebook
+ $pri_notebook show_pages_area
+ $pri_notebook itemconfigure {Hide} \
+ -text [mc "Hide"] \
+ -image ::ICONS::16::2downarrow \
+ -helptext [mc "Hide this panel"]
# Create and show primary notebook
set PanelSize $last_PanelSize ;# Restore panel size
bottomNB_redraw_pane ;# Perform showing
+
# Raise active page
- if {$args == {}} {
+ if {$a_page == {}} {
$pri_notebook raise $active_page
- } {
- $pri_notebook raise $args
+ } else {
+ $pri_notebook raise $a_page
}
- # Pack primary notebook
- pack $pri_notebook -expand 1 -fill both
# Restore sash width
- $parentPane configure -sashwidth 2
+ $parentPane configure -sashwidth 4
bind $parentPane <Button> {}
# Panel is now shown
set PanelVisible 1
}
- update idle
+ update idletasks
$this editor_procedure {} Configure {}
}
@@ -401,7 +348,7 @@ class BottomNoteBook {
set PanelSize [lindex [$parentPane sash coord 0] 1]
set PanelSize [expr {[winfo height $parentPane] - $PanelSize}]
- update idle
+ update idletasks
$this editor_procedure {} Configure {}
$this editor_procedure {} goto \
[$this editor_procedure {} get_current_line_number {}]
@@ -411,15 +358,17 @@ class BottomNoteBook {
# @parm Int by - pixels
# @return void
public method bottomNB_move_pane_up {by} {
- update idle
+ update idletasks
$parentPane sash place 0 0 [expr {[winfo height $parentPane] - $PanelSize - $by}]
}
## Redraw panel pane
# @return void
public method bottomNB_redraw_pane {} {
- update idle
- $parentPane sash place 0 0 [expr {[winfo height $parentPane] - $PanelSize}]
+ update idletasks
+ catch {
+ $parentPane sash place 0 0 [expr {[winfo height $parentPane] - $PanelSize}]
+ }
}
## Redraw panel pane on expose event
@@ -431,9 +380,9 @@ class BottomNoteBook {
}
set redraw_pane_in_progress 1
- update idle
+ update idletasks
$parentPane sash place 0 0 [expr {[winfo height $parentPane] - $PanelSize}]
- update idle
+ update idletasks
set redraw_pane_in_progress 0
}
@@ -445,7 +394,7 @@ class BottomNoteBook {
public method bottomNB_show_up {page} {
if {$PanelVisible} {
$pri_notebook raise $page
- } {
+ } else {
bottomNB_show_hide $page
}
}
@@ -466,4 +415,16 @@ class BottomNoteBook {
public method graph_itialize_simulator_graph_panel {graph_config} {
$this graph_change_mcu
}
-} \ No newline at end of file
+
+ ## Configure particular page on bottom notebook widget
+ # @parm String page - Page ID
+ # @parm List options - Any options acceptable by the notebook widget
+ # @return void
+ public method bottomnotebook_pageconfigure {page options} {
+ eval "$pri_notebook itemconfigure {$page} $options"
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/bottompanel/calculator.tcl b/lib/bottompanel/calculator.tcl
index 5196b40..b7ab722 100755..100644
--- a/lib/bottompanel/calculator.tcl
+++ b/lib/bottompanel/calculator.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 _CALCULATOR_TCL ] } {
+set _CALCULATOR_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
#
@@ -28,12 +33,12 @@
class Calculator {
- common count 0 ;# counter of instances
+ common calc_count 0 ;# counter of instances
# Font for numerical keypad
- common large_font [font create \
- -family {helveticat} \
- -size -12 \
- -weight {bold} \
+ common large_font [font create \
+ -family {helveticat} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight {bold} \
]
common oper_fg_color {#0000FF} ;# Foreground color for operator display
@@ -44,7 +49,7 @@ class Calculator {
# Variables related to object initialization
private variable parent ;# Teportary variable -- GUI parent
private variable calculatorList ;# Teportary variable -- COnfiguration list
- private variable gui_initialized 0 ;# Bool: GUI created
+ private variable calc_gui_initialized 0 ;# Bool: GUI created
# GUI variables
private variable calc_num_keypad ;# Container of left side of calc. (keypad)
@@ -138,11 +143,11 @@ class Calculator {
{{ASin} {AS} {calc_opr ASin 1} {} {}
{Arc sine}
{5} {} {} {Calculator_RED} {#FFDDDD} 0
- {Arc sine. Argument should be in the range \[-1,1\].}}
+ {Arc sine. Argument should be in the range [-1,1].}}
{{ACos} {AC} {calc_opr ACos 1} {} {}
{Arc cosine}
{5} {} {} {Calculator_RED} {#FFDDDD} 0
- {Arc cosine. Argument should be in the range \[-1,1\].}}
+ {Arc cosine. Argument should be in the range [-1,1].}}
{{ATan} {AT} {calc_opr ATan 1} {} {}
{Arc tangent}
{5} {} {} {Calculator_RED} {#FFDDDD} 0
@@ -226,8 +231,8 @@ class Calculator {
## object constructor
constructor {} {
# Initialize some variables
- incr count ;# Instance counter
- set calc_idx $count ;# Index of this object
+ incr calc_count ;# Instance counter
+ set calc_idx $calc_count;# Index of this object
set base Dec ;# Default numeric base
set angle rad ;# Default angle unit
set last_base $base ;# Last numeric base
@@ -263,7 +268,7 @@ class Calculator {
ttk::style configure Calculator_GRAY.TButton -padding 2
ttk::style map Calculator_GRAY.TButton \
- -background [list active {#DDDDDD} {!active !disabled} {#F8F8F8} disabled {#EEEEEE}]
+ -background [list active {#DDDDDD} {!active !disabled} {#F8F8F8} disabled ${::COMMON_BG_COLOR}]
ttk::style configure Calculator_PURPLE.TButton -padding 2 -font $large_font
ttk::style map Calculator_PURPLE.TButton \
@@ -460,9 +465,9 @@ class Calculator {
set calc_mem [string range $calc_mem 0 {end-2}]
}
set ::Calculator::calc_mem${cell}_$calc_idx $calc_mem
- } {
+ } else {
# Load memory content into main display
- set calc_display [subst "\$::Calculator::calc_mem${cell}_$calc_idx"]
+ set calc_display [subst -nocommands "\$::Calculator::calc_mem${cell}_$calc_idx"]
rewrite_display
}
}
@@ -490,7 +495,7 @@ class Calculator {
$calc_oper == {pow} || $calc_oper == {mod} ||
$calc_oper == {and} || $calc_oper == {or} ||
$calc_oper == {xor} || $calc_oper == {nand}
- } {
+ } then {
# Check display value length
if {$display == {}} {
Sbar [mc "Calculator: Unable to evaluate, missing argument"]
@@ -603,8 +608,8 @@ class Calculator {
set calc_display [expr {tan($calc_buffer)}]
}
}
- }]} {
- # If error occured -> show error message
+ }]} then {
+ # If error occurred -> show error message
Sbar [mc "Calculator: ERROR (result value is out of allowed range)"]
return
}
@@ -727,25 +732,25 @@ class Calculator {
# Determinate what memory cells aren't empty
for {set i 0} {$i < 3} {incr i} {
- set mem [[subst "\$mem_entry_$i"] get]
+ set mem [[subst -nocommands "\$mem_entry_$i"] get]
if {[string index $mem end] == {.}} {
append mem 0
}
set memory$i $mem
if {$mem == {} || $mem == 0} {
set mem$i 0
- } {
+ } else {
set mem$i 1
}
}
# Convert all non empty displays
- foreach cnd "$dis $buf $mem0 $mem1 $mem2" \
+ foreach cnd [list $dis $buf $mem0 $mem1 $mem2] \
var {calc_display calc_buffer memory0 memory1 memory2} {
if {$cnd} {
if {[catch {
- set $var [$command [subst "\$$var"]]
- }]} {
+ set $var [$command [subst -nocommands "\$$var"]]
+ }]} then {
Sbar [mc "Calculator: Value is too high to convert, value deleted !"]
set $var 0
}
@@ -754,8 +759,8 @@ class Calculator {
# Display new content of memory cells
for {set i 0} {$i < 3} {incr i} {
- [subst "\$mem_entry_$i"] delete 0 end
- [subst "\$mem_entry_$i"] insert end [subst "\$memory$i"]
+ [subst -nocommands "\$mem_entry_$i"] delete 0 end
+ [subst -nocommands "\$mem_entry_$i"] insert end [subst -nocommands "\$memory$i"]
}
}
@@ -764,7 +769,7 @@ class Calculator {
public method cal_switchBase {} {
# Get chosen value
- set base [subst "\$::Calculator::calc_base$calc_idx"]
+ set base [subst -nocommands "\$::Calculator::calc_base$calc_idx"]
# Convert display content to setected numeric system
if {$base == $last_base} {
@@ -852,32 +857,70 @@ class Calculator {
public method cal_switchAngle {} {
# Get chosen unit
- set angle [subst "\$::Calculator::calc_angle$calc_idx"]
+ set angle [subst -nocommands "\$::Calculator::calc_angle$calc_idx"]
# Convert all displays
- if {$angle != $last_angle} {
- # Convert display if is not empty
- if {[read_display_inDec] != {}} {
- write_display_inXbase [Angle::${last_angle}2${angle} $calc_display]
+ if {$angle == $last_angle} {
+ set last_angle $angle
+ return
+ }
+
+ # Convert display if is not empty
+ if {[read_display_inDec] != {}} {
+ write_display_inXbase [Angle::${last_angle}2${angle} $calc_display]
+ }
+
+ # Convert buffer if is not empty
+ if {[read_buffer_inDec] != {}} {
+ write_buffer_inXbase [Angle::${last_angle}2${angle} $calc_buffer]
+ }
+
+ # Conver memory cells
+ for {set i 0} {$i <3} {incr i} {
+ # Get memory cell value
+ set mem [[subst -nocommands "\$mem_entry_$i"] get]
+
+ # Convert to decimal value
+ if {$base != {Dec}} {
+ switch -- $base {
+ {Hex} { ;# from Hexadecimal
+ set mem [NumSystem::hex2dec $mem]
+ }
+ {Oct} { ;# from Octal
+ set mem [NumSystem::oct2dec $mem]
+ }
+ {Bin} { ;# from Binary
+ set mem [NumSystem::bin2dec $mem]
+ }
+ }
}
- # Convert buffer if is not empty
- if {[read_buffer_inDec] != {}} {
- write_buffer_inXbase [Angle::${last_angle}2${angle} $calc_buffer]
+
+ # Adjust that value
+ if {[string index $mem end] == {.}} {
+ append mem 0
}
- # Conver memory cells
- for {set i 0} {$i <3} {incr i} {
- # Get memory cell value
- set mem [[subst "\$mem_entry_$i"] get]
- # Adjust that value
- if {[string index $mem end] == {.}} {
- append mem 0
- }
- # Display new value
- if {$mem != {}} {
- set mem [Angle::${last_angle}2${angle} $mem]
- [subst "\$mem_entry_$i"] delete 0 end
- [subst "\$mem_entry_$i"] insert end $mem
+
+ # Display new value
+ if {$mem != {}} {
+ set mem [Angle::${last_angle}2${angle} $mem]
+
+ # Convert to back from decimal value
+ if {$base != {Dec}} {
+ switch -- $base {
+ {Hex} { ;# to Hexadecimal
+ set mem [NumSystem::dec2hex $mem]
+ }
+ {Oct} { ;# to Octal
+ set mem [NumSystem::dec2oct $mem]
+ }
+ {Bin} { ;# to Binary
+ set mem [NumSystem::dec2bin $mem]
+ }
+ }
}
+
+ [subst -nocommands "\$mem_entry_$i"] delete 0 end
+ [subst -nocommands "\$mem_entry_$i"] insert end $mem
}
}
@@ -920,7 +963,7 @@ class Calculator {
{Hex} { ;# to Hexadecimal
if {[catch {
set calc_display [NumSystem::dec2hex $dec_content]
- }]} {
+ }]} then {
Sbar [mc "Calculator: ERROR, result is too high (cannot be displayed)"]
set calc_display 0
}
@@ -928,7 +971,7 @@ class Calculator {
{Oct} { ;# to Octal
if {[catch {
set calc_display [NumSystem::dec2oct $dec_content]
- }]} {
+ }]} then {
Sbar [mc "Calculator: ERROR, result is too high (cannot be displayed)"]
set calc_display 0
}
@@ -936,14 +979,14 @@ class Calculator {
{Bin} { ;# to Binary
if {[catch {
set calc_display [NumSystem::dec2bin $dec_content]
- }]} {
+ }]} then {
Sbar [mc "Calculator: ERROR, result is too high (cannot be displayed)"]
set calc_display 0
}
}
}
# If selected numeric base is Dec -> do nothing
- } {
+ } else {
set calc_display $dec_content
}
@@ -986,7 +1029,7 @@ class Calculator {
{Hex} { ;# to Hexadecimal
if {[catch {
set calc_buffer [NumSystem::dec2hex $dec_content]
- }]} {
+ }]} then {
Sbar [mc "Calculator: ERROR, value is too high"]
set calc_buffer 0
}
@@ -994,7 +1037,7 @@ class Calculator {
{Oct} { ;# to Octal
if {[catch {
set calc_buffer [NumSystem::dec2oct $dec_content]
- }]} {
+ }]} then {
Sbar [mc "Calculator: ERROR, value is too high"]
set calc_buffer 0
}
@@ -1002,14 +1045,14 @@ class Calculator {
{Bin} { ;# to Binary
if {[catch {
set calc_buffer [NumSystem::dec2bin $dec_content]
- }]} {
+ }]} then {
Sbar [mc "Calculator: ERROR, value is too high"]
set calc_buffer 0
}
}
}
# If selected numeric base is Dec -> do nothing
- } {
+ } else {
set calc_buffer $dec_content
}
@@ -1040,16 +1083,16 @@ class Calculator {
}
## Read true content of main display widget converted
- # @parm args = False - adjust to float
+ # @parm args atf=0 - do not adjust to float
# @return Float - content of the main display
- private method reread_display args {
+ private method reread_display {{atf 0}} {
# Get content of the widget
set calc_display [$calc_display_widget get]
regsub {\,} $calc_display {.} calc_display
- # Adhust to float (if requested)
- if {$args != 1} {
+ # Adjust to float (if requested)
+ if {!$atf} {
if {[regexp {^\.} $calc_display]} {
set calc_display "0$calc_display"
} elseif {[regexp {\.$} $calc_display]} {
@@ -1106,7 +1149,7 @@ class Calculator {
if {$angle == {grad}} {
set dec_angle [Angle::grad2rad $dec_angle]
# From degrees
- } {
+ } else {
set dec_angle [Angle::deg2rad $dec_angle]
}
}
@@ -1124,7 +1167,7 @@ class Calculator {
if {$angle == {grad}} {
set dec_angle [Angle::rad2grad $dec_angle]
# To degrees
- } {
+ } else {
set dec_angle [Angle::rad2deg $dec_angle]
}
}
@@ -1183,7 +1226,7 @@ class Calculator {
$widget configure -style Calculator_Error.TEntry
}
return 1
- } {
+ } else {
Sbar [mc "Calculator: Trying to insert invalid value"]
return 0
}
@@ -1243,10 +1286,10 @@ class Calculator {
return
# Negate value
- } {
+ } else {
if {[regexp {^\-} $calc_display]} {
set calc_display [string range $calc_display 1 end]
- } {
+ } else {
set calc_display "-$calc_display"
}
}
@@ -1262,7 +1305,7 @@ class Calculator {
public method PrepareCalculator {_parent _calculatorList} {
set parent $_parent
set calculatorList $_calculatorList
- set gui_initialized 0
+ set calc_gui_initialized 0
}
## Inform this tab than it has became active
@@ -1271,13 +1314,20 @@ class Calculator {
$calc_display_widget selection range 0 end
$calc_display_widget icursor end
focus $calc_display_widget
+
+ update idletasks
+ $scrollable_frame yview scroll 0 units
}
## Initialize calculator GUI
# @return void
public method CreateCalculatorGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$calc_gui_initialized} {return}
+ set calc_gui_initialized 1
+
+ if {${::DEBUG}} {
+ puts "CreateCalculatorGUI \[ENTER\]"
+ }
# Create scrollable area
set scrollable_frame [ScrollableFrame $parent.scrollable_frame \
@@ -1307,7 +1357,7 @@ class Calculator {
set calc_buffer_widget [ttk::entry $frame0.calc_buffer \
-textvariable ::Calculator::calc_buffer$calc_idx \
-validate key \
- -validatecommand "$this calc_validate %W %P" \
+ -validatecommand [list $this calc_validate %W %P] \
-width 13 \
-style Calculator_Buffer.TEntry \
]
@@ -1319,7 +1369,7 @@ class Calculator {
-textvariable ::Calculator::calc_oper$calc_idx \
-validate all \
-width 3 \
- -validatecommand "$this calc_oper_validate %P" \
+ -validatecommand [list $this calc_oper_validate %P] \
-style Calculator_Oper.TEntry \
]
DynamicHelp::add $frame0.calc_oper -text [mc "Selected operation"]
@@ -1329,7 +1379,7 @@ class Calculator {
set calc_display_widget [ttk::entry $frame0.calc_displ \
-textvariable ::Calculator::calc_displ$calc_idx \
-validate key \
- -validatecommand "$this calc_validate %W %P" \
+ -validatecommand [list $this calc_validate %W %P] \
-width 13 \
-style Calculator_Display.TEntry \
]
@@ -1341,12 +1391,12 @@ class Calculator {
pack $calc_oper_widget -side left
pack $calc_display_widget -side left
# Create binding for displays
- bind $calc_buffer_widget <KP_Enter> "$this calc_Evaluate"
- bind $calc_oper_widget <KP_Enter> "$this calc_Evaluate"
- bind $calc_display_widget <KP_Enter> "$this calc_Evaluate"
- bind $calc_buffer_widget <Return> "$this calc_Evaluate"
- bind $calc_oper_widget <Return> "$this calc_Evaluate"
- bind $calc_display_widget <Return> "$this calc_Evaluate"
+ bind $calc_buffer_widget <KP_Enter> [list $this calc_Evaluate]
+ bind $calc_oper_widget <KP_Enter> [list $this calc_Evaluate]
+ bind $calc_display_widget <KP_Enter> [list $this calc_Evaluate]
+ bind $calc_buffer_widget <Return> [list $this calc_Evaluate]
+ bind $calc_oper_widget <Return> [list $this calc_Evaluate]
+ bind $calc_display_widget <Return> [list $this calc_Evaluate]
## Create: numeric base and angle unit switch + CA + C
@@ -1357,7 +1407,7 @@ class Calculator {
-values {Hex Dec Oct Bin} \
-textvariable ::Calculator::calc_base$calc_idx \
-width 4 \
- ] -side left
+ ] -side left -padx 2
bind $frame1.lf.calc_base_CB <<ComboboxSelected>> "$this cal_switchBase"
DynamicHelp::add $frame1.lf.calc_base_CB -text [mc "Numeric base"]
setStatusTip -widget $frame1.lf.calc_base_CB \
@@ -1368,7 +1418,7 @@ class Calculator {
-values {rad deg grad} \
-textvariable ::Calculator::calc_angle$calc_idx \
-width 4 \
- ] -side left
+ ] -side left -padx 2
bind $frame1.lf.calc_angle_CB <<ComboboxSelected>> "$this cal_switchAngle"
DynamicHelp::add $frame1.lf.calc_angle_CB -text [mc "Angle unit"]
setStatusTip -widget $frame1.lf.calc_angle_CB \
@@ -1379,9 +1429,9 @@ class Calculator {
# Button "Clear"
pack [ttk::button $frame1.rf.calc_Clear \
-text {C} \
- -command "$this calc_Clear" \
+ -command [list $this calc_Clear] \
-width 3 \
- ] -side left
+ ] -side left -padx 2
DynamicHelp::add $frame1.rf.calc_Clear \
-text [mc "Clear both displays"]
setStatusTip -widget $frame1.rf.calc_Clear \
@@ -1389,9 +1439,9 @@ class Calculator {
# Button "Clear actual"
pack [ttk::button $frame1.rf.calc_Clear_act \
-text {CA} \
- -command "$this calc_ClearActual" \
+ -command [list $this calc_ClearActual] \
-width 3 \
- ] -side left
+ ] -side left -padx 2
DynamicHelp::add $frame1.rf.calc_Clear_act \
-text [mc "Clear main display"]
setStatusTip -widget $frame1.rf.calc_Clear_act \
@@ -1399,9 +1449,9 @@ class Calculator {
# Button "Negate"
pack [ttk::button $frame1.rf.calc_Negate_dis \
-text {+/-} \
- -command "$this calc_NegateDis" \
+ -command [list $this calc_NegateDis] \
-width 3 \
- ] -side left
+ ] -side left -padx 2
DynamicHelp::add $frame1.rf.calc_Negate_dis \
-text [mc "Negate value in main display"]
setStatusTip -widget $frame1.rf.calc_Negate_dis \
@@ -1422,7 +1472,7 @@ class Calculator {
set entry [ttk::entry $frame_id.calc_mem_entry_${i} \
-textvariable ::Calculator::calc_mem${i}_${calc_idx} \
-validate all \
- -validatecommand "$this calc_validate %W %P" \
+ -validatecommand [list $this calc_validate %W %P] \
]
DynamicHelp::add $frame_id.calc_mem_entry_${i} -text [mc "Memory bank %s" $i]
pack $entry -side left
@@ -1433,7 +1483,7 @@ class Calculator {
-text [mc "Save"] \
-command "$this mem Save $i" \
-width 5 \
- ] -side left
+ ] -side left -padx 2 -pady 2
DynamicHelp::add $frame_id.calc_mem_save_button_${i} \
-text [mc "Save content of main display to this memory bank %s" $i]
setStatusTip -widget $frame_id.calc_mem_save_button_${i} \
@@ -1443,7 +1493,7 @@ class Calculator {
-text [mc "Load"] \
-command "$this mem Load $i" \
-width 5 \
- ] -side left
+ ] -side left -padx 2 -pady 2
DynamicHelp::add $frame_id.calc_mem_load_button_${i} \
-text [mc "Load content of this bank into main display"]
setStatusTip -widget $frame_id.calc_mem_load_button_${i} \
@@ -1475,7 +1525,7 @@ class Calculator {
for {set i 0} {$i < 5} {incr i} {
if {$i == 1} {
pack $calc_num_display.calc_num_display${i} -pady 10
- } {
+ } else {
pack $calc_num_display.calc_num_display${i}
}
}
@@ -1491,7 +1541,7 @@ class Calculator {
if {
$base != {Hex} && $base != {Dec} &&
$base != {Oct} && $base != {Bin}
- } {
+ } then {
set base [lindex ${X::project_edit_defaults} {3 1}]
puts stderr [mc "Invalid numerical base: '%s'" $base]
}
@@ -1553,14 +1603,14 @@ class Calculator {
## Get calculator list for later initialization
# @return List - resulting list of values
public method get_calculator_list {} {
- if {!$gui_initialized} {CreateCalculatorGUI}
+ if {!$calc_gui_initialized} {CreateCalculatorGUI}
return [list $base $angle \
[$calc_display_widget get] \
$calc_oper \
[$calc_buffer_widget get] \
- [subst "\$::Calculator::calc_mem0_$calc_idx"] \
- [subst "\$::Calculator::calc_mem1_$calc_idx"] \
- [subst "\$::Calculator::calc_mem2_$calc_idx"] \
+ [subst -nocommands "\$::Calculator::calc_mem0_$calc_idx"] \
+ [subst -nocommands "\$::Calculator::calc_mem1_$calc_idx"] \
+ [subst -nocommands "\$::Calculator::calc_mem2_$calc_idx"] \
[$timerscalc_freq_entry get] \
[$timerscalc_time_entry get] \
[$timerscalc_mode_spinbox get]]
@@ -1574,8 +1624,14 @@ class Calculator {
if {$timerscalc_validation_dis} {
return 1
}
+
+ # Ignore empty value
+ if {$content == {}} {
+ return 1
+ }
+
# If content is decimal number (max 5. digits) -> evaluate and return True
- if {[regexp {^\d*$} $content] && ([string length $content] < 6)} {
+ if {[regexp {^\d+(\.\d*)?$} $content] && ([string length $content] < 9)} {
calc_timerscalc_evaluate \
$content \
[$timerscalc_time_entry get] \
@@ -1601,7 +1657,7 @@ class Calculator {
if {$content > 2} {
return 0
}
- calc_timerscalc_evaluate \
+ calc_timerscalc_evaluate \
[$timerscalc_freq_entry get] \
[$timerscalc_time_entry get] \
$content
@@ -1659,7 +1715,7 @@ class Calculator {
foreach widget $widgets {
$widget configure -state normal
}
- } {
+ } else {
foreach widget $widgets {
$widget configure -state disabled
}
@@ -1679,12 +1735,15 @@ class Calculator {
set repeat 0
set correction 0
+ # Remove leading dot from the frequency value
+ set freq [string trimright $freq {.}]
+
# Check for validity of given values
if {$freq == {} || $freq == 0 || $time == {} || $mode == {} } {
set mode {invalid}
- } {
+ } else {
# Compute time in machine cycles
- set time [expr {int($time * (12000.0 / $freq))}]
+ set time [expr {int($time * ($freq / 12000.0))}]
}
# Perform computation for the given mode
@@ -1696,7 +1755,7 @@ class Calculator {
if {[expr {!($time & 0x1FFF)}]} {
incr repeat -1
set stepsPerIter 0x1FFF
- } {
+ } else {
set stepsPerIter [expr {$time / $repeat}]
set tmp [expr {0x2000 - $stepsPerIter}]
set TLx [expr {$tmp & 0x1F}]
@@ -1711,7 +1770,7 @@ class Calculator {
if {[expr {!($time & 0xFFFF)}]} {
incr repeat -1
set stepsPerIter 0xFFFF
- } {
+ } else {
set stepsPerIter [expr {$time / $repeat}]
set tmp [expr {0x10000 - $stepsPerIter}]
set TLx [expr {$tmp & 0xFF}]
@@ -1726,7 +1785,7 @@ class Calculator {
if {[expr {!($time & 0xFF)}]} {
incr repeat -1
set stepsPerIter 0xFF
- } {
+ } else {
set stepsPerIter [expr {$time / $repeat}]
set TLx [expr {0x100 - $stepsPerIter}]
set THx $TLx
@@ -1756,16 +1815,16 @@ class Calculator {
# Check for allowed length of results (string representation)
if {
- [string length [format "%o" $repeat]] > 6
- ||
- [string length [format "%o" $correction]] > 6
- } {
- set TLx 0
- set THx 0
- set repeat 0
- set correction 0
- calc_timerscalc_highlight 0
- Sbar [mc "Calculator: Unable to evaluate, result value is too high"]
+ [string length [format "%o" $repeat]] > 6
+ ||
+ [string length [format "%o" $correction]] > 6
+ } then {
+ set TLx 0
+ set THx 0
+ set repeat 0
+ set correction 0
+ calc_timerscalc_highlight 0
+ Sbar [mc "Calculator: Unable to evaluate, result value is too high"]
}
## Write results
@@ -1810,11 +1869,11 @@ class Calculator {
grid [label $top_frame.calc_timerscalc_mode_label \
-text [mc "Mode"] \
] -row 0 -column 2 -sticky w
- set timerscalc_mode_spinbox [spinbox \
+ set timerscalc_mode_spinbox [ttk::spinbox \
$top_frame.calc_timerscalc_mode_spinbox \
- -bg {#FFFFFF} -highlightthickness 0 \
-from 0 -to 2 -width 1 -validate key \
- -vcmd "$this calc_timerscalc_mode_validate %P" \
+ -validatecommand "$this calc_timerscalc_mode_validate %P" \
+ -command "$this calc_timerscalc_mode_validate \[$top_frame.calc_timerscalc_mode_spinbox get\]"
]
grid $timerscalc_mode_spinbox -row 0 -column 3 -sticky we
# time
@@ -2060,7 +2119,7 @@ class Calculator {
update
}
# Show scrollbar
- } {
+ } else {
if {![winfo ismapped $horizontal_scrollbar]} {
pack $horizontal_scrollbar -fill x -side top -before $scrollable_frame
}
@@ -2069,3 +2128,7 @@ class Calculator {
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/bottompanel/cvarsview.tcl b/lib/bottompanel/cvarsview.tcl
index fbc5dd2..ebebce3 100755..100644
--- a/lib/bottompanel/cvarsview.tcl
+++ b/lib/bottompanel/cvarsview.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 _CVARSVIEW_TCL ] } {
+set _CVARSVIEW_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Provides GUI interface designed for the bottom panel to show and
@@ -30,25 +35,25 @@
class CVarsView {
## COMMON
# Normal font fot the text widget
- common text_wdg_font_n [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight normal \
- -slant roman \
+ common text_wdg_font_n [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight normal \
+ -slant roman \
]
# Bold font for the text widget
- common text_wdg_font_b [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight bold \
- -slant roman \
+ common text_wdg_font_b [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
+ -slant roman \
]
# Italic font for the text widget
- common text_wdg_font_i [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight normal \
- -slant italic \
+ common text_wdg_font_i [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight normal \
+ -slant italic \
]
# Background color for selected lines
common color_selected_line {#CCCCFF}
@@ -57,7 +62,7 @@ class CVarsView {
# Variables related to object initialization
private variable parent ;# Widget: parent widget
- private variable gui_initialized 0 ;# Bool: GUI initialized
+ private variable cvv_gui_initialized 0 ;# Bool: GUI initialized
private variable panedwindow ;# Widget: Paned window for local and global variables
# Int: Last paned window sash position
@@ -103,7 +108,7 @@ class CVarsView {
# @return void
public method PrepareCVarsView {_parent} {
set parent $_parent
- set gui_initialized 0
+ set cvv_gui_initialized 0
}
## Inform this tab than it has became active
@@ -114,8 +119,12 @@ class CVarsView {
## Create GUI of this tab
# @return void
public method CreateCVarsViewGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$cvv_gui_initialized} {return}
+ set cvv_gui_initialized 1
+
+ if {${::DEBUG}} {
+ puts "CreateCVarsViewGUI \[ENTER\]"
+ }
## Create GUI of main frame
set main_frame [frame $parent.main_frame]
@@ -146,14 +155,14 @@ class CVarsView {
set filename [$this simulator_get_cdb_filename]
if {[catch {
set file [open $filename r]
- }]} {
+ }]} then {
tk_messageBox \
-parent . \
-icon warning \
-type ok \
-title [mc "Permission denied"] \
-message [mc "Unable to read file\n'%s'"] $filename
- } {
+ } else {
cvarsview_load_cdb $file
close $file
}
@@ -163,15 +172,15 @@ class CVarsView {
## Restore paned window sash position
# @return void
public method cvarsview_redraw_pane {} {
- if {!$gui_initialized} {return}
-# update idle
+ if {!$cvv_gui_initialized} {return}
+# update idletasks
# $panedwindow sash place 0 $panel_sash_position 0
}
## Get panel configuration list
# @return List - Panel config
public method cvarsview_get_config {} {
- if {$gui_initialized} {
+ if {$cvv_gui_initialized} {
# set panel_sash_position [lindex [$panedwindow sash coord 0] 0]
}
return [list $panel_sash_position]
@@ -188,12 +197,12 @@ class CVarsView {
# Empty string given
if {![string length $string]} {
- [subst "\$search_entry_$type"] configure -style TEntry
- [subst "\$search_clear_$type"] configure -state disabled
+ [subst -nocommands "\$search_entry_$type"] configure -style TEntry
+ [subst -nocommands "\$search_clear_$type"] configure -state disabled
set search_val_in_progress 0
return 1
}
- [subst "\$search_clear_$type"] configure -state normal
+ [subst -nocommands "\$search_clear_$type"] configure -state normal
## Perform search
set idx 0
@@ -208,17 +217,17 @@ class CVarsView {
incr idx
}
# Local variable
- } {
+ } else {
}
# Variable found
if {$found} {
cvarsview_select_line $type [expr {[lsearch $global_displayed $idx] + 1}] 1
- [subst "\$search_entry_$type"] configure -style StringFound.TEntry
+ [subst -nocommands "\$search_entry_$type"] configure -style StringFound.TEntry
# Variable not found
- } {
- [subst "\$search_entry_$type"] configure -style StringNotFound.TEntry
+ } else {
+ [subst -nocommands "\$search_entry_$type"] configure -style StringNotFound.TEntry
}
@@ -255,7 +264,7 @@ class CVarsView {
}
# Line with a local variable
- } {
+ } else {
}
}
@@ -273,7 +282,7 @@ class CVarsView {
$text_widget_global tag remove tag_current_line 0.0 end
set selected_line_global 0
# View with a local variable
- } {
+ } else {
}
}
@@ -384,7 +393,7 @@ class CVarsView {
# Create the top frame
set top_frame [frame $local_frame.top_frame]
pack [label $top_frame.header \
- -text "$type static scalar variables" \
+ -text [mc "$type static scalar variables"] \
-anchor w -justify left \
] -side left
@@ -415,7 +424,7 @@ class CVarsView {
set text_frame_main [frame $text_frame.main_frame -bd 1 -relief sunken]
if {$type == {Local}} {
set text [mc "Value Level Data type Variable name"]
- } {
+ } else {
set text [mc "Value Data type Variable name"]
}
pack [label $text_frame_main.header \
@@ -449,7 +458,7 @@ class CVarsView {
if {$type == {Local}} {
set text_widget_local $text_widget
- } {
+ } else {
set text_widget_global $text_widget
}
@@ -465,7 +474,7 @@ class CVarsView {
# @parm File cdb_file - Opened CDB file
# @return Bool - True in success
public method cvarsview_load_cdb {cdb_file} {
- if {!$gui_initialized} {CreateCVarsViewGUI}
+ if {!$cvv_gui_initialized} {CreateCVarsViewGUI}
set result 1
set local_variables_nlist {}
@@ -638,7 +647,7 @@ class CVarsView {
$registers 0 \
0 \
]
- } {
+ } else {
lappend local_variables_nlist $name
lappend local_variables_list [list $level $block]
lappend local_variables [list \
@@ -694,7 +703,7 @@ class CVarsView {
if {$subtype == {G}} {
set addresses_lst {global_addresses}
set addresses_list_lst {global_addresses_list}
- } {
+ } else {
set addresses_lst {local_addresses}
set addresses_list_lst {local_addresses_list}
}
@@ -708,13 +717,13 @@ class CVarsView {
# @parm String type - "Local" or "Global"
# @return void
public method cvarsview_clear_view {type} {
- if {!$gui_initialized} {CreateCVarsViewGUI}
+ if {!$cvv_gui_initialized} {CreateCVarsViewGUI}
if {$type == {local}} {
set text_widget $text_widget_local
set current_level {}
set current_block {}
- } {
+ } else {
set text_widget $text_widget_global
}
$text_widget configure -state normal
@@ -740,10 +749,15 @@ class CVarsView {
set pointer { }
if {$isglobal} {
set text_widget $text_widget_global
- } {
+ } else {
set text_widget $text_widget_local
}
+ if {$start_address == {}} {
+ puts "Error: start_address is empty: create_variable_record [list is=$id name=$name level=$level isglobal=$isglobal isvector=$isvector start_address=$start_address end_address=$end_address memory_type=$memory_type signed=$signed datatype=$datatype]"
+ return
+ }
+
foreach dt $datatype {
switch -glob -- $dt {
{DA*} { ;# Array of <n> elements
@@ -785,28 +799,28 @@ class CVarsView {
{SL} { ;# Long integer
if {$signed == {U}} {
set data_type {ulong}
- } {
+ } else {
set data_type {long}
}
}
{SI} { ;# Integer
if {$signed == {U}} {
set data_type {uint}
- } {
+ } else {
set data_type {int}
}
}
{SC} { ;# Char
if {$signed == {U}} {
set data_type {uchar}
- } {
+ } else {
set data_type {char}
}
}
{SS} { ;# Short integer
if {$signed == {U}} {
set data_type {ushort}
- } {
+ } else {
set data_type {short}
}
}
@@ -868,12 +882,12 @@ class CVarsView {
-bd 0 -justify right \
-disabledbackground {#FFFFFF} \
-fg ${::Simulator::normal_color} \
- -validatecommand "$this cvarsview_validate $id $isglobal $start_address %P" \
+ -validatecommand [list $this cvarsview_validate $id $isglobal $start_address %P] \
]
$entry insert insert 0
if {$isglobal} {
set type {Global}
- } {
+ } else {
set type {Local}
}
@@ -962,7 +976,7 @@ class CVarsView {
if {$isglobal} {
set definition [lindex $global_variables $id]
- } {
+ } else {
set validation_ena 1
return 0 ;# <-- DEBUG
}
@@ -976,7 +990,7 @@ class CVarsView {
set signed [lindex $definition 3]
if {$signed == {S}} {
set signed 1
- } {
+ } else {
set signed 0
}
@@ -999,12 +1013,12 @@ class CVarsView {
# Determinate valid value range
if {$mem_type == {J} || $mem_type == {H}} {
set max_value 1
- } {
+ } else {
set max_value [expr {int(pow(2, $len*8))}]
if {$signed} {
set min_value [expr {$max_value / 2}]
set max_value [expr {$max_value / 2 - 1}]
- } {
+ } else {
incr max_value -1
}
}
@@ -1015,7 +1029,7 @@ class CVarsView {
set validation_ena 1
return 0
}
- } {
+ } else {
if {$value > $max_value} {
set validation_ena 1
return 0
@@ -1027,7 +1041,7 @@ class CVarsView {
if {$mem_type == {J} || $mem_type == {H}} {
set value_list $value
# Other values
- } {
+ } else {
set value_list [list]
set value [format %X $string]
set value [string range $value end-[expr {$len * 2}] end]
@@ -1038,7 +1052,7 @@ class CVarsView {
if {$val == {}} {
lappend value_list 0
- } {
+ } else {
lappend value_list [expr "0x$val"]
}
}
@@ -1083,12 +1097,12 @@ class CVarsView {
return 1
}
{I} { ;# SFR space
- set mem_type_for_SE D
+ set mem_type_for_SE S
set command {setSfr_directly}
set synccmd {Simulator_sync_sfr}
}
{J} { ;# SBIT space
- set mem_type_for_SE B
+ set mem_type_for_SE J
if {[$this simulator_address_range $mem_type_for_SE $address]} {
$this setBit $address $value
$this Simulator_sync_sfr [$this getRegOfBit $address]
@@ -1126,11 +1140,11 @@ class CVarsView {
# @parm Bool enabled - 1 == Enable; 0 == Disable
# @return void
public method cvarsview_setEnabled {enabled} {
- if {!$gui_initialized} {return}
+ if {!$cvv_gui_initialized} {return}
if {$enabled} {
set state normal
- } {
+ } else {
set state disabled
}
@@ -1147,7 +1161,7 @@ class CVarsView {
# @parm Int address - Address of changed register
# @return void
public method cvarsview_sync {memtype address} {
- if {!$gui_initialized} {return}
+ if {!$cvv_gui_initialized} {return}
if {!$validation_ena} {return}
if {$memtype == {I} && !($address % 8)} {
set bitaddr $address
@@ -1277,7 +1291,7 @@ class CVarsView {
} elseif {$signed == {S}} {
set max_positive_value [expr {pow(2,($length * 8 - 1)) - 1}]
if {$value > $max_positive_value} {
- set value [expr {pow(2,($length * 8)) - $value}]
+ set value [expr {$value - pow(2,($length * 8))}]
}
set value [expr {int($value)}]
@@ -1301,3 +1315,7 @@ class CVarsView {
set validation_ena 1
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/bottompanel/find_in_files.tcl b/lib/bottompanel/find_in_files.tcl
index d085110..dccc823 100755..100644
--- a/lib/bottompanel/find_in_files.tcl
+++ b/lib/bottompanel/find_in_files.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 _FIND_IN_FILES_TCL ] } {
+set _FIND_IN_FILES_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements panel "Find in files", GUI and function
@@ -28,12 +33,11 @@
# --------------------------------------------------------------------------
class FindInFiles {
-
- common count 0 ;# Counter of class instances
+ common find_inf_count 0 ;# Counter of class instances
# Variables related to object initialization
private variable parent ;# Widget: parent widget
- private variable gui_initialized 0 ;# Bool: GUI initialized
+ private variable find_inf_gui_initialized 0 ;# Bool: GUI initialized
private variable obj_idx ;# Int: Object index
private variable abort_variable 0 ;# Bool: Abort search
@@ -53,8 +57,8 @@ class FindInFiles {
constructor {} {
# Increment object counter
- incr count
- set obj_idx $count
+ incr find_inf_count
+ set obj_idx $find_inf_count
# Load configuration
set ::FindInFiles::recursive_$obj_idx [lindex $::CONFIG(FIND_IN_FILES_CONFIG) 0]
@@ -65,13 +69,13 @@ class FindInFiles {
set ::FindInFiles::pattern_$obj_idx [lindex $::CONFIG(FIND_IN_FILES_CONFIG) 5]
# Validate loaded configuration
- if {![string is boolean -strict [subst "\$::FindInFiles::recursive_$obj_idx"]]} {
+ if {![string is boolean -strict [subst -nocommands "\$::FindInFiles::recursive_$obj_idx"]]} {
set ::FindInFiles::recursive_$obj_idx 1
}
- if {![string is boolean -strict [subst "\$::FindInFiles::regular_expr_$obj_idx"]]} {
+ if {![string is boolean -strict [subst -nocommands "\$::FindInFiles::regular_expr_$obj_idx"]]} {
set ::FindInFiles::regular_expr_$obj_idx 0
}
- if {![string is boolean -strict [subst "\$::FindInFiles::case_sensitive_$obj_idx"]]} {
+ if {![string is boolean -strict [subst -nocommands "\$::FindInFiles::case_sensitive_$obj_idx"]]} {
set ::FindInFiles::case_sensitive_$obj_idx 1
}
}
@@ -88,7 +92,7 @@ class FindInFiles {
# @return void
public method PrepareFindInFiles {_parent} {
set parent $_parent
- set gui_initialized 0
+ set find_inf_gui_initialized 0
}
## Inform this tab than it has became active
@@ -102,8 +106,12 @@ class FindInFiles {
## Create GUI of messages tab
# @return void
public method CreateFindInFilesGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$find_inf_gui_initialized} {return}
+ set find_inf_gui_initialized 1
+
+ if {${::DEBUG}} {
+ puts "CreateFindInFilesGUI \[ENTER\]"
+ }
create_findinfilesgui
create_tags_and_bindings
@@ -150,7 +158,7 @@ class FindInFiles {
set ::FindInFiles::folder_$obj_idx [$this cget -projectPath]
bind $folder_entry <Return> "$this findinfiles_search"
bind $folder_entry <KP_Enter> "$this findinfiles_search"
- pack $folder_entry -side left -fill x -expand 1
+ pack $folder_entry -side left -fill x -expand 1 -pady 2
# Button "Select directory"
pack [ttk::button $folder_entry_frm.select_dir_but \
-image ::ICONS::16::fileopen \
@@ -186,8 +194,8 @@ class FindInFiles {
-width 7 \
]
setStatusTip -widget $clear_button -text [mc "Clear results"]
- pack $find_stop_button -side left
- pack $clear_button -side left
+ pack $find_stop_button -side left -padx 2
+ pack $clear_button -side left -padx 2
# Separator
pack [ttk::separator $top_bottom_frame.sep \
-orient vertical \
@@ -243,13 +251,22 @@ class FindInFiles {
## Bottom frame (text widget and its scrollbar)
set bottom_frame [frame $main_frame.bottom_frame]
- set text_widget [text $bottom_frame.text \
- -bg white -state disabled -bd 1 -wrap none \
- -highlightthickness 0 -exportselection 0 \
- -cursor left_ptr -width 0 -height 0 \
- -yscrollcommand "$bottom_frame.scrollbar set" \
- -font [font create -family helvetica -size -12] \
- -fg {#555555} \
+ set text_widget [text $bottom_frame.text \
+ -bg white \
+ -state disabled \
+ -bd 1 \
+ -wrap none \
+ -highlightthickness 0 \
+ -exportselection 0 \
+ -cursor left_ptr \
+ -width 0 \
+ -height 0 \
+ -yscrollcommand "$bottom_frame.scrollbar set" \
+ -font [font create \
+ -family helvetica \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ ] \
+ -fg {#555555} \
]
pack $text_widget -side left -fill both -expand 1
pack [ttk::scrollbar $bottom_frame.scrollbar \
@@ -269,7 +286,7 @@ class FindInFiles {
# @return void
private method create_tags_and_bindings {} {
# Create tags
- set bold_font [font create -family helvetica -size -12 -weight bold]
+ set bold_font [font create -family helvetica -size [expr {int(-12 * $::font_size_factor)}] -weight bold]
$text_widget tag configure tag_highlight -foreground {#000000} -font $bold_font
$text_widget tag configure tag_filename -foreground {#0000DD}
$text_widget tag configure tag_linenumber -foreground {#00DD00}
@@ -292,7 +309,7 @@ class FindInFiles {
{goto} "Go to this line"}
{command "Clear" {} 0 "findinfiles_clear"
{editdelete} "Clear this panel"}
- } $menu 0 "$this " 0 {}
+ } $menu 0 "$this " 0 {} [namespace current]
$menu entryconfigure [::mc "Clear"] -state disabled
}
@@ -302,7 +319,7 @@ class FindInFiles {
KIFSD::FSD ::fsd \
-title [mc "Choose directory - MCU 8051 IDE"] \
-fileson 0 -master . \
- -directory [subst "\$::FindInFiles::folder_$obj_idx"]
+ -directory [subst -nocommands "\$::FindInFiles::folder_$obj_idx"]
fsd setokcmd "set ::FindInFiles::folder_$obj_idx \[::fsd get\]"
fsd activate
}
@@ -311,11 +328,11 @@ class FindInFiles {
# @return void
public method findinfiles_search {} {
# Gain search options
- set folder [file normalize [subst "\$::FindInFiles::folder_$obj_idx"]]
- set mask [subst "\$::FindInFiles::mask_$obj_idx"]
- set pattern [subst "\$::FindInFiles::pattern_$obj_idx"]
- set reg_expr [subst "\$::FindInFiles::regular_expr_$obj_idx"]
- set case_sen [subst "\$::FindInFiles::case_sensitive_$obj_idx"]
+ set folder [file normalize [subst -nocommands "\$::FindInFiles::folder_$obj_idx"]]
+ set mask [subst -nocommands "\$::FindInFiles::mask_$obj_idx"]
+ set pattern [subst -nocommands "\$::FindInFiles::pattern_$obj_idx"]
+ set reg_expr [subst -nocommands "\$::FindInFiles::regular_expr_$obj_idx"]
+ set case_sen [subst -nocommands "\$::FindInFiles::case_sensitive_$obj_idx"]
# Validate search options
if {![string length $folder] || ![string length $mask] || ![string length $pattern]} {
@@ -369,7 +386,7 @@ class FindInFiles {
eval "append files { } \[glob -directory {$folder} -nocomplain -types {f l} -- $m\]"
}
}
- if {[subst "\$::FindInFiles::recursive_$obj_idx"]} {
+ if {[subst -nocommands "\$::FindInFiles::recursive_$obj_idx"]} {
append files { } [regsub -all {[\{\}]} [recursive_search $folder $mask] {\\&}]
}
@@ -396,7 +413,7 @@ class FindInFiles {
# Enable / Disable clear button and clear entry in the popup menu
if {[$text_widget index {1.0 lineend}] == {1.0}} {
set state disabled
- } {
+ } else {
set state normal
}
$menu entryconfigure [::mc "Clear"] -state $state
@@ -430,7 +447,7 @@ class FindInFiles {
# Open file
if {[catch {
set file [open $filename r]
- }]} {
+ }]} then {
return 0
}
@@ -474,7 +491,7 @@ class FindInFiles {
set found 0
if {$case_sen} {
set found [regexp -start $idx -- $pattern $line matched_str]
- } {
+ } else {
set found [regexp -nocase -start $idx -- $pattern $line matched_str]
}
@@ -489,7 +506,7 @@ class FindInFiles {
set last_idx $idx
}
# Pure string pattern
- } {
+ } else {
while {$idx != -1} {
set idx [string first $pattern $line $idx]
if {$last_idx >= $idx} {
@@ -571,7 +588,7 @@ class FindInFiles {
set index [$text_widget index [list @$x,$y linestart]]
if {[$text_widget compare $index == [list $index lineend]]} {
set state disabled
- } {
+ } else {
set state normal
}
$menu entryconfigure [::mc "Go to"] -state $state
@@ -619,9 +636,9 @@ class FindInFiles {
set filename [file join $folder $filename]
if {[$this openfile $filename 1 . def def 0 0 {}] != {}} {
$this switch_to_last
- update idle
+ update idletasks
$this editor_procedure {} parseAll {}
- } {
+ } else {
return
}
}
@@ -651,8 +668,8 @@ class FindInFiles {
{
if {$for_what == $number} {
set string $content
- } {
- set string [subst "\$::FindInFiles::$var"]
+ } else {
+ set string [subst -nocommands "\$::FindInFiles::$var"]
}
if {![string length $string]} {
set state disabled
@@ -676,7 +693,7 @@ class FindInFiles {
set y [winfo pointery .]
# Create legend window
- set win [toplevel .findinfiles_help_win -class {Help} -bg {#EEEEEE}]
+ set win [toplevel .findinfiles_help_win -class {Help} -bg ${::COMMON_BG_COLOR}]
set frame [frame $win.f -bg {#555555} -bd 0 -padx 1 -pady 1]
wm overrideredirect $win 1
@@ -703,14 +720,14 @@ class FindInFiles {
pack $frame -fill both -expand 1
# Fill the text widget
- $text insert end "Comma separated list of file masks (e.g \"*.c,*.h,*.asm\")\n"
- $text insert end "The mask may contain any of the following special characters:\n"
- $text insert end " ? Matches any single character.\n"
- $text insert end " * Matches any sequence of zero or more characters.\n"
- $text insert end " \[chars\] Matches any single character in chars.\n"
- $text insert end " If chars contains a sequence of the form a-b then any\n"
- $text insert end " character between a and b (inclusive) will match.\n"
- $text insert end " \x Matches the character x."
+ $text insert end [mc "Comma separated list of file masks (e.g \"*.c,*.h,*.asm\")\n"]
+ $text insert end [mc "The mask may contain any of the following special characters:\n"]
+ $text insert end [mc " ? Matches any single character.\n"]
+ $text insert end [mc " * Matches any sequence of zero or more characters.\n"]
+ $text insert end [mc " \[chars\] Matches any single character in chars.\n"]
+ $text insert end [mc " If chars contains a sequence of the form a-b then any\n"]
+ $text insert end [mc " character between a and b (inclusive) will match.\n"]
+ $text insert end [mc " \\x Matches the character x."]
# Show the text
$text configure -state disabled
@@ -738,13 +755,17 @@ class FindInFiles {
# - Intented for session management
# @return void
public method findinfiles_get_config {} {
- return [list \
- [subst "\$::FindInFiles::recursive_$obj_idx"] \
- [subst "\$::FindInFiles::regular_expr_$obj_idx"] \
- [subst "\$::FindInFiles::case_sensitive_$obj_idx"] \
- [subst "\$::FindInFiles::folder_$obj_idx"] \
- [subst "\$::FindInFiles::mask_$obj_idx"] \
- [subst "\$::FindInFiles::pattern_$obj_idx"] \
+ return [list \
+ [subst -nocommands "\$::FindInFiles::recursive_$obj_idx"] \
+ [subst -nocommands "\$::FindInFiles::regular_expr_$obj_idx"] \
+ [subst -nocommands "\$::FindInFiles::case_sensitive_$obj_idx"] \
+ [subst -nocommands "\$::FindInFiles::folder_$obj_idx"] \
+ [subst -nocommands "\$::FindInFiles::mask_$obj_idx"] \
+ [subst -nocommands "\$::FindInFiles::pattern_$obj_idx"] \
]
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/bottompanel/graph.tcl b/lib/bottompanel/graph.tcl
index e9def9b..3f21052 100755..100644
--- a/lib/bottompanel/graph.tcl
+++ b/lib/bottompanel/graph.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 _GRAPH_TCL ] } {
+set _GRAPH_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Graph panel in the bottom panel - shows states of ports
@@ -30,10 +35,14 @@ source "${::LIB_DIRNAME}/bottompanel/graph_wdg.tcl" ;# Graph widget
class Graph {
## COMMON
+ # Bool: The message: "Performance warning" was already displayed to the user
+ common performance_warning_already_shown 0
+ # Bool: show performance warning when enabling external HW simulation
+ common show_sim_per_warn ${::CONFIG(SHOW_PALE_WARN)}
# Variables related to object initialization
private variable data_list ;# Teportary variable -- Configuration list
- private variable gui_initialized 0 ;# Bool: GUI created
+ private variable graph_gui_initialized 0 ;# Bool: GUI created
private variable parent ;# Parent widget
private variable grid_mode {b} ;# Current grid mode (one of {b n x y})
@@ -66,7 +75,7 @@ class Graph {
## Object constructor
- constructor {} {
+ constructor {} {
# Configure localy used ttk styles
ttk::style configure Graph_ActiveTab.TButton \
-background {#AAAAFF} \
@@ -88,7 +97,10 @@ class Graph {
public method PrepareGraph {Parent _data_list} {
set parent $Parent
set data_list $_data_list
- set gui_initialized 0
+ set graph_gui_initialized 0
+
+ # Enable or disable PALE
+ $this pale_on_off [lindex $data_list 2]
}
## Inform this tab than it has became active
@@ -99,8 +111,12 @@ class Graph {
## Initialize graph
# @return void
public method CreateGraphGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$graph_gui_initialized} {return}
+ set graph_gui_initialized 1
+
+ if {${::DEBUG}} {
+ puts "CreateGraphGUI \[ENTER\]"
+ }
# Create panel frames
set top_bar [frame $parent.top_bar -bg {#CCCCCC}] ;# Buttons for switching pages
@@ -127,7 +143,7 @@ class Graph {
-command "$this graph_switch_grid_mode 1" \
]
DynamicHelp::add $grid_button -text [mc "Change grid"]
- setStatusTip -widget $grid_button -text [mc "Change grid morfology"]
+ setStatusTip -widget $grid_button -text [mc "Change grid morphology"]
pack $grid_button -anchor n
bind $grid_button <Button-1> "$this graph_switch_grid_mode 1; break"
bind $grid_button <Button-3> "$this graph_switch_grid_mode -1; break"
@@ -164,7 +180,7 @@ class Graph {
pack $clear_marks_button
# Create graphs
- set pages_manager [PagesManager $bottom_frame.pages_manager -background {#eeeeee}]
+ set pages_manager [PagesManager $bottom_frame.pages_manager -background ${::COMMON_BG_COLOR}]
set nb_state_frame [$pages_manager add {state}]
set nb_latches_frame [$pages_manager add {latches}]
set nb_output_frame [$pages_manager add {output}]
@@ -226,22 +242,41 @@ class Graph {
# Validate the loaded confiuration
foreach mark_flags {mark_flags_s mark_flags_l mark_flags_o} {
- set mark_flags_data [subst "\$$mark_flags"]
- if {
- ![regexp {^[01]+$} $mark_flags_data]
- ||
- [string bytelength $mark_flags_data] != 170
- } then {
- puts stderr "Invalid graph mark flags -- discarded"
- set $mark_flags [string repeat {0 } 170]
+ set mark_flags_data [subst -nocommands "\$$mark_flags"]
+ if {[string index $mark_flags_data 0] == {X}} {
+ set mark_flags_data [string range $mark_flags_data 1 end]
+ if {
+ [string length $mark_flags_data] != 43
+ ||
+ ![string is xdigit $mark_flags_data]
+ } then {
+ puts stderr "Invalid graph mark flags -- discarded"
+ set $mark_flags [string repeat {0 } 170]
+ } else {
+ set bin [::NumSystem::hex2bin $mark_flags_data]
+ set len [string length $bin]
+ if {$len < 170} {
+ set bin "[string repeat {0} [expr {170 - $len}]]$bin"
+ }
+ set $mark_flags [split $bin {}]
+ }
} else {
- set $mark_flags [split $mark_flags_data {}]
+ if {
+ ![regexp {^[01]+$} $mark_flags_data]
+ ||
+ [string bytelength $mark_flags_data] != 170
+ } then {
+ puts stderr "Invalid graph mark flags -- discarded"
+ set $mark_flags [string repeat {0 } 170]
+ } else {
+ set $mark_flags [split $mark_flags_data {}]
+ }
}
}
if {
$magnification != {0} && $magnification != {1} &&
$magnification != {2} && $magnification != {3}
- } {
+ } then {
puts stderr "Invalid graph magnification level -- setting to default"
set magnification 0
}
@@ -252,7 +287,7 @@ class Graph {
if {
$grid_mode != {b} && $grid_mode != {n} &&
$grid_mode != {y} && $grid_mode != {x}
- } {
+ } then {
puts stderr "Invalid graph grid mode -- setting to 'y'"
set grid_mode {y}
}
@@ -295,7 +330,7 @@ class Graph {
set win_y [winfo pointery .]
# Create legend window
- set win [toplevel .graph_help_win -class {Help} -bg {#EEEEEE}]
+ set win [toplevel .graph_help_win -class {Help} -bg ${::COMMON_BG_COLOR}]
set frame [frame $win.f -bg {#555555} -bd 0 -padx 1 -pady 1]
wm overrideredirect $win 1
@@ -349,7 +384,7 @@ class Graph {
$canvas create line $x 15 [expr {$x + 20}] 15 -fill {#000000} -width 2
# {X} Access to external memory
- } {
+ } else {
$canvas create rectangle $x 20 \
[expr {$x + 20}] 15 \
-fill {#00FF00} -width 0 -outline {#00FF00}
@@ -358,7 +393,7 @@ class Graph {
-fill {#FF0000} -width 0 -outline {#FF0000}
}
incr x 20
- # {-} Undeterminable state
+ # {-} Indeterminable state
$canvas create line $x 15 \
[expr {$x + 5}] 11 \
[expr {$x + 10}] 15 \
@@ -386,18 +421,18 @@ class Graph {
if {$nc_instead_of_X} {
set tmp_txt [mc "Not connected"]
# {X} Access to external memory
- } {
+ } else {
set tmp_txt [mc "Access to external memory"]
}
$canvas create line 40 23 40 86 50 86 \
-fill {#000000} -arrow first -arrowshape {6 6 2}
$canvas create text 50 86 -fill {#000000} -anchor w \
-text $tmp_txt -font $::smallfont
- # {-} Undeterminable state
+ # {-} Indeterminable state
$canvas create line 60 23 60 72 70 72 \
-fill {#000000} -arrow first -arrowshape {6 6 2}
$canvas create text 70 72 -fill {#000000} -anchor w \
- -text [mc "Undeterminable state"] -font $::smallfont
+ -text [mc "Indeterminable state"] -font $::smallfont
# {?} No voltage
$canvas create line 80 23 80 58 90 58 \
-fill {#000000} -arrow first -arrowshape {6 6 2}
@@ -467,15 +502,15 @@ class Graph {
}
## Draw interrupt line
- # @parm String = {} - If "nohistory" the history of interrupt lines will not be modified
+ # @parm String nh={} - If "nohistory" the history of interrupt lines will not be modified
# @return void
- public method graph_draw_interrupt_line args {
- if {!$gui_initialized} {CreateGraphGUI}
+ public method graph_draw_interrupt_line {{nh {}}} {
+ if {!$graph_gui_initialized} {CreateGraphGUI}
create_all_graph_widgets
- $graph_state graph_draw_interrupt_line $args
- $graph_latches graph_draw_interrupt_line $args
- $graph_output graph_draw_interrupt_line $args
+ $graph_state graph_draw_interrupt_line $nh
+ $graph_latches graph_draw_interrupt_line $nh
+ $graph_output graph_draw_interrupt_line $nh
}
## Draw new port states in the graph
@@ -483,7 +518,7 @@ class Graph {
# @parm List values - Values to display ...
# @return void
public method graph_new_output_state {target values} {
- if {!$gui_initialized} {CreateGraphGUI}
+ if {!$graph_gui_initialized} {CreateGraphGUI}
create_all_graph_widgets
switch -- $target {
@@ -522,6 +557,52 @@ class Graph {
public method graph_change_status_on {} {
set drawing_on [expr {!$drawing_on}]
graph_commit_state_on_off
+
+ # Show performance warning
+ if {$show_sim_per_warn && !$performance_warning_already_shown && $drawing_on} {
+ set performance_warning_already_shown 1
+ if {[winfo exists .performance_warning_dialog]} {
+ destroy .performance_warning_dialog
+ }
+ set dialog [toplevel .performance_warning_dialog]
+ set top_frame [frame $dialog.top]
+ pack [label $top_frame.img -image ::ICONS::32::messagebox_info] -side left -padx 5
+ pack [label $top_frame.txt -text [mc "You have just enabled simulation of external devices. Having this feature enabled causes serious reduction of simulator performance, the number of instructions executed per second in real time usually decreases by a factor of hundreds, maybe even thousands."] -wraplength 300 -justify left] -side left -fill both -padx 5
+
+ set bottom_frame [frame $dialog.bottom]
+ pack [checkbutton $bottom_frame.chb \
+ -text [mc "Do not display again"] \
+ -onvalue 0 \
+ -offvalue 1 \
+ -variable ::Graph::show_sim_per_warn \
+ ] -anchor e -pady 5
+ pack [ttk::button $bottom_frame.button_ok \
+ -text [mc "Ok"] -compound left \
+ -image ::ICONS::16::ok \
+ -command "grab release $dialog; destroy $dialog"\
+ ] -pady 10
+ bind $bottom_frame.button_ok <Return> "grab release $dialog; destroy $dialog"
+ bind $bottom_frame.button_ok <KP_Enter> "grab release $dialog; destroy $dialog"
+
+ # Pack window frames
+ pack $top_frame -expand 1 -padx 5 -pady 5
+ pack $bottom_frame -padx 5 -fill x
+
+ # Window manager options -- modal window
+ wm iconphoto $dialog ::ICONS::16::info
+ wm title $dialog [mc "Performance warning"]
+ wm resizable $dialog 0 0
+ wm transient $dialog .
+ catch {grab $dialog}
+ wm protocol $dialog WM_DELETE_WINDOW "
+ grab release $dialog
+ destroy $dialog
+ "
+ raise $dialog
+ update
+ focus -force $bottom_frame.button_ok
+ tkwait window $dialog
+ }
}
## Commit new ON/OFF state
@@ -544,13 +625,13 @@ class Graph {
# ON
if {$drawing_on} {
- $start_stop_button configure -style GreenBg.TButton -text "ON"
+ $start_stop_button configure -style GreenBg.TButton -text [mc "ON"]
$grid_button configure -state normal
$clear_marks_button configure -state normal
# OFF
} else {
- $start_stop_button configure -style RedBg.TButton -text "OFF"
+ $start_stop_button configure -style RedBg.TButton -text [mc "OFF"]
$zoom_in_button configure -state disabled
$zoom_out_button configure -state disabled
@@ -656,23 +737,17 @@ class Graph {
## Create GUI of all graphs
# @return void
private method create_all_graph_widgets {} {
- if {!$gui_initialized} {CreateGraphGUI}
+ if {!$graph_gui_initialized} {CreateGraphGUI}
- if {!$graph_state_created} {
- $graph_state CreateGraphGUI
- }
- if {!$graph_latches_created} {
- $graph_latches CreateGraphGUI
- }
- if {!$graph_output_created} {
- $graph_output CreateGraphGUI
- }
+ Graph_create_tab state
+ Graph_create_tab latches
+ Graph_create_tab output
}
## Get graph configuration values -- for project save
# @return List - Configuration list
public method graph_get_config {} {
- if {!$gui_initialized} {CreateGraphGUI}
+ if {!$graph_gui_initialized} {CreateGraphGUI}
create_all_graph_widgets
@@ -688,7 +763,7 @@ class Graph {
# @parm Int bits - Number of steps to take back
# @return void
public method graph_stepback {bits} {
- if {!$gui_initialized} {CreateGraphGUI}
+ if {!$graph_gui_initialized} {CreateGraphGUI}
if {!$drawing_on} {return}
create_all_graph_widgets
@@ -712,3 +787,7 @@ class Graph {
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/bottompanel/graph_wdg.tcl b/lib/bottompanel/graph_wdg.tcl
index bcb2d62..a528bc5 100755..100644
--- a/lib/bottompanel/graph_wdg.tcl
+++ b/lib/bottompanel/graph_wdg.tcl
@@ -2,7 +2,7 @@
# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
############################################################################
-# Copyright (C) 2007-2008 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 _GRAPH_WDG_TCL ] } {
+set _GRAPH_WDG_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Graph widget for showing port states
@@ -35,17 +40,20 @@ class GraphWidget {
# Big font (vertical header)
common big_font [font create \
-family $::DEFAULT_FIXED_FONT \
- -size -14 -weight bold \
+ -size -14 \
+ -weight bold \
]
# Small font (horizontal header)
common small_font [font create \
-family $::DEFAULT_FIXED_FONT \
- -size -14 -weight bold \
+ -size -14 \
+ -weight bold \
]
# Font for booleans values for each port
common bool_font [font create \
-family $::DEFAULT_FIXED_FONT \
- -size -12 -weight bold \
+ -size -12 \
+ -weight bold \
]
# Definition of graph popup menu
common GRAPHMENU {
@@ -53,7 +61,7 @@ class GraphWidget {
{} "Enable/Disable graph"}
{separator}
{command {Change grid} {} 1 "graph_switch_grid_mode 1"
- {} "Change grid morfology"}
+ {} "Change grid morphology"}
{separator}
{command {Zoom in} {} 1 "graph_zoom_in"
{viewmag_in} "Change bit length on X axis to a lower value"}
@@ -65,13 +73,13 @@ class GraphWidget {
}
# Variables related to object initialization
- private variable gui_initialized 0 ;# Bool: GUI created
+ private variable graph_w_gui_initialized 0 ;# Bool: GUI created
private variable _parent ;# Parent widget
private variable parent ;# Innert parent widget
private variable canvasWidget ;# ID of the canvas widget
private variable grid_mode {b} ;# Current grid mode (one of {b n x y})
- private variable drawing_on 1 ;# Bool: Graph enabled
+ private variable drawing_on 0 ;# Bool: Graph enabled
private variable magnification 0 ;# Magnification level (0..3)
private variable graph_elements ;# Array: IDs of graph elements (green and red lines)
private variable intr_lines {} ;# List of IDs of interrupt lines
@@ -100,12 +108,12 @@ class GraphWidget {
constructor {Parent super} {
set _parent $Parent
set Super $super
- set gui_initialized 0
+ set graph_w_gui_initialized 0
}
## Object destructor
destructor {
- if {$gui_initialized} {
+ if {$graph_w_gui_initialized} {
menu_Sbar_remove $menu
}
}
@@ -113,20 +121,20 @@ class GraphWidget {
## React to MCU change
# @return void
public method change_mcu {} {
- if {!$gui_initialized} {return}
+ if {!$graph_w_gui_initialized} {return}
foreach wdg [winfo children $_parent] {
destroy $wdg
}
- set gui_initialized 0
+ set graph_w_gui_initialized 0
CreateGraphGUI
}
## Initialize graph
# @return void
public method CreateGraphGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$graph_w_gui_initialized} {return}
+ set graph_w_gui_initialized 1
# Determinate number of ports and port indexes
set number_of_ports [$Super get_ports_info]
@@ -181,7 +189,7 @@ class GraphWidget {
# Create canvas popup menu
set menu $canvasWidget.menu
- menuFactory $GRAPHMENU $menu 0 "$Super " 0 {}
+ menuFactory $GRAPHMENU $menu 0 "$Super " 0 {} [namespace current]
# Set event bindings for the canvas widget
@@ -205,19 +213,19 @@ class GraphWidget {
}
## Draw interrupt line
- # @parm String = {} - If "nohistory" the history of interrupt lines will not be modified
+ # @parm String nh={} - If "nohistory" the history of interrupt lines will not be modified
# @return void
- public method graph_draw_interrupt_line args {
- if {!$gui_initialized} {CreateGraphGUI}
+ public method graph_draw_interrupt_line {{nh {}}} {
+ if {!$graph_w_gui_initialized} {CreateGraphGUI}
# Check if graph is enabled
if {!$drawing_on} {return}
# Adjust history
- if {$args != {nohistory}} {
+ if {$nh != {nohistory}} {
if {[llength $intr_history]} {
lset intr_history end 1
- } {
+ } else {
lappend intr_history 1
}
}
@@ -231,10 +239,10 @@ class GraphWidget {
}
# Adjust list of canvas elements related to this line
- if {$args != {nohistory}} {
+ if {$nh != {nohistory}} {
if {[llength $intr_lines]} {
lset intr_lines end $lines
- } {
+ } else {
lappend intr_lines $lines
}
}
@@ -251,7 +259,7 @@ class GraphWidget {
# @parm List - {# {P0_hex P1_hex P2_hex P3_hex P4_hex}}
# @return void
public method graph_new_output_state args {
- if {!$gui_initialized} {CreateGraphGUI}
+ if {!$graph_w_gui_initialized} {CreateGraphGUI}
# Check if graph is enabled
if {!$drawing_on} {return}
@@ -290,7 +298,7 @@ class GraphWidget {
if {[lindex $args 0] != {#}} {
lappend state_history [list {#} $args]
lappend intr_history 0
- } {
+ } else {
set args [lindex $args 1]
}
lappend intr_lines {}
@@ -359,6 +367,10 @@ class GraphWidget {
set txt {L}
set clr {#FF00AA}
}
+ default {
+ set txt {?}
+ set clr {#888888}
+ }
}
$canvasWidget create text $x $y \
@@ -385,7 +397,7 @@ class GraphWidget {
($idx / 8) * $port_length_in_px + ($pos * $step_x) + 20
}]
- # Determinate length of line elements acording to the current magnification level
+ # Determinate length of line elements according to the current magnification level
switch -- $magnification {
{0} {
set line_len 3
@@ -417,7 +429,7 @@ class GraphWidget {
if {$bool == {=}} {
set bool 0
set zero_color {#FF00AA}
- } {
+ } else {
set zero_color {#FF0000}
}
@@ -445,7 +457,7 @@ class GraphWidget {
$offset_x [expr {$offset_y + 0}] \
-fill $zero_color -tags graph]
}
- {-} { ;# From undeterminable state
+ {-} { ;# From indeterminable state
lappend lines [$canvasWidget create line \
$offset_x [expr {$offset_y + $half_edge}] \
$offset_x [expr {$offset_y + 0}] \
@@ -588,7 +600,7 @@ class GraphWidget {
[expr {$offset_x + 2*$line_len + $enge_inc0 + $enge_inc1}] $offset_y \
-fill {#FF8800} -tags graph]
- # "Undeterminable state" -> "Zero"
+ # "Indeterminable state" -> "Zero"
} elseif {$prev == {-} && $bool == 0} {
lappend lines [$canvasWidget create line \
$offset_x [expr {$offset_y + $half_edge}] \
@@ -596,7 +608,7 @@ class GraphWidget {
[expr {$offset_x + $step_x}] [expr {$offset_y + $full_edge}] \
-fill {#00FF00} -tags graph]
- # "Undeterminable state" -> "One"
+ # "Indeterminable state" -> "One"
} elseif {$prev == {-} && $bool == 1} {
lappend lines [$canvasWidget create line \
$offset_x [expr {$offset_y + $half_edge}] \
@@ -735,7 +747,7 @@ class GraphWidget {
set previous_state($idx) $bool
}
- ## Iterate over avaliable grid modes
+ ## Iterate over available grid modes
# @parm Int by - Iterate by
# @return void
public method graph_switch_grid_mode {_grid_mode} {
@@ -753,7 +765,7 @@ class GraphWidget {
adjust_grid
}
- ## Adjust grid morfology to the current grid mode
+ ## Adjust grid morphology to the current grid mode
# @return void
private method adjust_grid {} {
# Remove the current grid
@@ -796,7 +808,7 @@ class GraphWidget {
}
## Set graph configuration variables
- # @parm Char _grid_mode - Grid morfology (one of {'n' 'x' 'y' 'b'})
+ # @parm Char _grid_mode - Grid morphology (one of {'n' 'x' 'y' 'b'})
# @parm Int _magnification - Magnification mode (one of {0 1 2 3})
# @parm Bool _drawing_on - Widget enabled
# @parm List _mark_flags - List of mark flags (e.g {0 0 0 1 1 0})
@@ -811,10 +823,17 @@ class GraphWidget {
## Get mark flags
# @return String - String of boolean flags
public method graph_get_marks {} {
- return [join $mark_flags {}]
+ set result [::NumSystem::bin2hex [join $mark_flags {}]]
+ set len [string length $result]
+ if {$len < 43} {
+ set result "[string repeat {0} [expr {43 - $len}]]$result"
+ }
+
+ return "X$result"
}
## Adjust graph to the current magnification level
+ # @parm Int _magnification - Maginification level (0..3)
# @return void
public method commit_magnification {_magnification} {
set magnification $_magnification
@@ -864,7 +883,7 @@ class GraphWidget {
# @parm String - If "keephistory" then do not clear history
# @return void
public method clear_graph args {
- if {!$gui_initialized} {CreateGraphGUI}
+ if {!$graph_w_gui_initialized} {CreateGraphGUI}
catch {
$canvasWidget delete graph
@@ -898,7 +917,7 @@ class GraphWidget {
## Adjust object to the current value of flag 'drawing_on'
# @return void
public method commit_state_on_off {_drawing_on} {
- if {!$gui_initialized} {CreateGraphGUI}
+ if {!$graph_w_gui_initialized} {CreateGraphGUI}
set drawing_on $_drawing_on
# Enable widgets
@@ -1018,7 +1037,7 @@ class GraphWidget {
lset mark_flags $idx 1
# Remove mark
- } {
+ } else {
catch {
foreach elm [lindex $marks $idx] {
$canvasWidget delete $elm
@@ -1051,7 +1070,7 @@ class GraphWidget {
update
}
# Show scrollbar
- } {
+ } else {
if {![winfo ismapped $horizontal_scrollbar]} {
pack $horizontal_scrollbar -fill x -side top -before $scrollable_frame
}
@@ -1064,7 +1083,7 @@ class GraphWidget {
# @parm Int bits - Number of steps to take back
# @return void
public method graph_stepback {bits} {
- if {!$gui_initialized} {CreateGraphGUI}
+ if {!$graph_w_gui_initialized} {CreateGraphGUI}
if {!$drawing_on} {return}
# Remove elemets
@@ -1113,3 +1132,7 @@ class GraphWidget {
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/bottompanel/messages.tcl b/lib/bottompanel/messages.tcl
index 51c96ce..e70c0a2 100755..100644
--- a/lib/bottompanel/messages.tcl
+++ b/lib/bottompanel/messages.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 _MESSAGES_TCL ] } {
+set _MESSAGES_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements messages text for the bottom panel of the project tab
@@ -32,14 +37,16 @@ class Messages {
common set_shortcuts {} ;# Currently set shortcut bindigs for messages text
common shortcuts_cat {messages} ;# Key shortcut categories related to messages text
# Normal font for messages text
- common messages_normal_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12]
+ common messages_normal_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ ]
# Bold font for messages text
- common messages_bold_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight bold]
+ common messages_bold_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
+ ]
# Definition of popup menu for messages text
common MESSAGESMENU {
{command {Select all} {Ctrl+A} 0 "select_all_messages_text"
@@ -64,13 +71,13 @@ class Messages {
# Variables related to object initialization
private variable parent ;# Widget: parent widget
- private variable gui_initialized 0 ;# Bool: GUI initialized
+ private variable msg_gui_initialized 0 ;# Bool: GUI initialized
# Variables related to search bar
private variable search_frame ;# Widget: Search bar frame
- private variable last_find_index {} ;# String: Index of last found occurence of the search string
- private variable search_string ;# String: Search string
- private variable search_string_length ;# Int: Length of the search string
+ private variable last_find_index {} ;# String: Index of last found occurrence of the search string
+ private variable search_string {} ;# String: Search string
+ private variable search_string_length 0 ;# Int: Length of the search string
private variable search_entry ;# Widget: Search bar entry box
private variable search_find_next ;# Widget: Button "Next"
private variable search_find_prev ;# Widget: Button "Prev"
@@ -90,20 +97,25 @@ class Messages {
# @return void
public method PrepareMessages {_parent} {
set parent $_parent
- set gui_initialized 0
+ set msg_gui_initialized 0
}
## Inform this tab than it has became active
# @return void
public method MessagesTabRaised {} {
+ $this bottomnotebook_pageconfigure {Messages} "-image ::ICONS::16::kcmsystem"
focus $messages_text
}
## Create GUI of messages tab
# @return void
public method CreateMessagesGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$msg_gui_initialized} {return}
+ set msg_gui_initialized 1
+
+ if {${::DEBUG}} {
+ puts "CreateMessagesGUI \[ENTER\]"
+ }
## Create GUI of main frame
set main_frame [frame $parent.main_frame]
@@ -180,7 +192,7 @@ class Messages {
-state disabled \
]
DynamicHelp::add $search_frame.find_next_but \
- -text [mc "Find next occurence of search string"]
+ -text [mc "Find next occurrence of search string"]
# Button: "Prev"
set search_find_prev [ttk::button $search_frame.find_prev_but \
-image ::ICONS::16::up0 \
@@ -189,7 +201,7 @@ class Messages {
-state disabled \
]
DynamicHelp::add $search_frame.find_prev_but \
- -text [mc "Find previous occurence of search string"]
+ -text [mc "Find previous occurrence of search string"]
# Button: "Close"
pack [ttk::button $search_frame.close_but \
-image ::ICONS::16::button_cancel \
@@ -216,7 +228,8 @@ class Messages {
-variable ::Todo::match_case \
-command "$this messages_text_perform_search 1 1.0" \
] -side left -padx 5
-
+ # Show the search bar frame
+ messages_text_find_dialog 0
messages_text_shortcuts_reevaluate
unset parent
@@ -225,18 +238,18 @@ class Messages {
## Select all text in messages text
# @return void
public method select_all_messages_text {} {
- if {!$gui_initialized} {CreateMessagesGUI}
+ if {!$msg_gui_initialized} {CreateMessagesGUI}
$messages_text tag add sel 1.0 end
}
## Copy selected text in messages text into clipboard
# @return void
public method copy_messages_text {} {
- if {!$gui_initialized} {CreateMessagesGUI}
+ if {!$msg_gui_initialized} {CreateMessagesGUI}
clipboard clear
if {[llength [$messages_text tag nextrange sel 1.0]]} {
clipboard append [$messages_text get sel.first sel.last]
- } {
+ } else {
clipboard append [$messages_text get 1.0 end]
}
}
@@ -244,7 +257,7 @@ class Messages {
## Create bindings for defined key shortcuts for messages text
# @return void
public method messages_text_shortcuts_reevaluate {} {
- if {!$gui_initialized} {CreateMessagesGUI}
+ if {!$msg_gui_initialized} {CreateMessagesGUI}
# Unset previous configuration
foreach key $set_shortcuts {
@@ -286,11 +299,11 @@ class Messages {
## Define popup menu for messages text
# @return void
public method messages_text_makePopupMenu {} {
- if {!$gui_initialized} {return}
+ if {!$msg_gui_initialized} {return}
if {[winfo exists $menu]} {
destroy $menu
}
- menuFactory $MESSAGESMENU $menu 0 "$this " 0 {}
+ menuFactory $MESSAGESMENU $menu 0 "$this " 0 {} [namespace current]
$menu entryconfigure [::mc "Find next"] -state disabled
$menu entryconfigure [::mc "Find previous"] -state disabled
}
@@ -308,14 +321,14 @@ class Messages {
## Clear all content of messages text
# @return void
public method clear_messages_text {} {
- if {!$gui_initialized} {CreateMessagesGUI}
+ if {!$msg_gui_initialized} {CreateMessagesGUI}
$messages_text configure -state normal
$messages_text delete 0.0 end
$messages_text configure -state disabled
}
- ## Goto line (in editor) which is somehow related to some tag in messages text
+ ## Go to line (in editor) which is somehow related to some tag in messages text
# @parm int x - relative x coordinate in messages text widget
# @parm int y - relative y coordinate in messages text widget
# @return void
@@ -323,7 +336,7 @@ class Messages {
# Determinate line number for editor
set idx [$messages_text index @$x,$y]
set line [$messages_text get "$idx linestart" "$idx lineend"]
- # Focus on editor and goto that line
+ # Focus on editor and go to that line
# Message from As31 assembler
if {[regexp {^(Error)|(Warning)\, line \d+} $line line]} {
@@ -331,16 +344,15 @@ class Messages {
set lineNum 0
}
- if {$lineNum} {
- $this editor_procedure {} focus_in {}
- $this editor_procedure {} goto $lineNum
+ if {!$lineNum} {
+ return
}
# Message from ASEM-51 assembler
} elseif {[regexp {^([^\(\)]+\(\d+(\,\d+)?\)\: \w+)} $line line]} {
if {![regexp {\(\d+(\,\d+)?\):} $line lineNum]} {
set lineNum 0
- } {
+ } else {
set lineNum [string range $lineNum 1 end-2]
set lineNum [lindex [split $lineNum {,}] 0]
}
@@ -353,9 +365,8 @@ class Messages {
}
}
}
- if {$lineNum} {
- $this editor_procedure {} focus_in {}
- $this editor_procedure {} goto "$lineNum"
+ if {!$lineNum} {
+ return
}
# GNU error message (from SDCC or ASL)
@@ -369,10 +380,7 @@ class Messages {
}
}
}
-
- set linenum [string trim $linenum {:}]
- $this editor_procedure {} focus_in {}
- $this editor_procedure {} goto $linenum
+ set lineNum [string trim $linenum {:}]
# Message from MCU8051IDE assembler
} elseif {[regexp {at \d+ in [^\:]+\:} $line line]} {
@@ -385,18 +393,23 @@ class Messages {
}
}
}
-
regexp {\d+} $line lineNum
- $this editor_procedure {} focus_in {}
- $this editor_procedure {} goto $lineNum
+
+ } else {
+ return
}
+
+ $this editor_procedure {} goto $lineNum
+ after idle "
+ $this editor_procedure {} focus_in {}
+ "
}
## Append text at the end of messages text
# @parm String txt - Text to append
- # @return Bool - True if error occured
+ # @return Bool - True if error occurred
public method messages_text_append {txt} {
- if {!$gui_initialized} {CreateMessagesGUI}
+ if {!$msg_gui_initialized} {CreateMessagesGUI}
# Enable the messages text widget
$messages_text configure -state normal
@@ -414,6 +427,8 @@ class Messages {
set warn 0
set suc 0
+ set spec 0
+
# Determinate number of the last line in the widget
set row [expr {int([$messages_text index end]) - 1}]
@@ -425,10 +440,29 @@ class Messages {
set err 1
# check for an error
- } elseif {[regexp {^(\|EN\|.*)|^(File access error:)|^(FAILED)|^(Compilation FAILED)|^(Pre-processing FAILED !)|^(Error:)|(^@@@@@ .+ @@@@@$)|(^.*returned errorcode.*)|^(Cannot open input file)|^(Cannot open file)|^(Errors in pass1, assembly aborted)|^(Errors in pass2, assembly aborted)} $text error]} {
+ } elseif {[regexp {^(\|EN\|.*)|^(File access error:)|^(FAILED)|^(Compilation FAILED)|^(Pre-processing FAILED !)|^(Error:)|(^@@@@@ .+ @@@@@$)|(^.*returned errorcode.*)|^(Cannot open input file)|^(Cannot open file)|^(Errors in pass1, assembly aborted)|^(Errors in pass2, assembly aborted)|(: command not found)|(cannot generate code for target 'mcs51')} $text error]} {
set len [string length $error]
set ern 1
+ if {[regexp {: command not found} $text error]} {
+ set spec 2
+ set len [string length $text]
+ } elseif {[regexp {cannot generate code for target 'mcs51'} $text error]} {
+ set spec 3
+ set len [string length $text]
+ }
+
+ # a special case of error; unable to find C debug file -- relevant only if user wants to start
+ #+ simulation right after compilation
+ } elseif {[regexp {^Unable to find \".*\"$} $text error]} {
+ set spec 1
+ set len [string length $error]
+ if {$::X::compilation_start_simulator} {
+ set ern 1
+ } else {
+ set warn 1
+ }
+
# check for warning which points to specific line in source code
} elseif {[regexp {^(\|WL\|.*)|^(Notice at \d+ in [^\:]+\:)|^(Warning at \d+ in [^\:]+\:)|^(.+:\d+: warning.*)|^(Warning\, line \d+)} $text warning]} {
set len [string length $warning]
@@ -453,9 +487,25 @@ class Messages {
regsub {^(\|[EWS][LN]\|)} $text {} text
# Insert specified text
- $messages_text insert end $text
+ $messages_text insert end [regsub -all "\a" [regsub -all {\\} [regsub -all {\\\\} $text "\a"] {}] {\\}]
$messages_text insert end "\n"
+ switch -- $spec {
+ 0 {}
+ 1 { ;# Unable to find "<some file>.cdb"
+ $messages_text insert end [mc " |\n"]
+ $messages_text insert end [mc " +-- Most probably that indicates that you have disabled debugging switch, if it is not that what you want then go to\n"]
+ $messages_text insert end [mc " \[Main Menu\] --> \[Configure\] --> \[Compiler configuration\] --> \[C language\] --> \[General\] and enable \"--debug\" compiler switch.\n"]
+ }
+ 2 { ;# /bin/sh: sdcc: command not found
+ $messages_text insert end [mc " |\n"]
+ $messages_text insert end [mc " +-- Most probably that indicates that you have not installed SDCC compiler\n"]
+ }
+ 3 { ;# cannot generate code for target 'mcs51'
+ $messages_text insert end [mc " |\n"]
+ $messages_text insert end [mc " +-- That means that your SDCC compiler does not support MCS-51 architecture, please install SDCC with support for 8051\n"]
+ }
+ }
# Insert appropriate text tags
if {$err || $ern || $war || $warn || $suc} {
@@ -482,6 +532,11 @@ class Messages {
$messages_text see end
$messages_text configure -state disabled
+ # Change tab icon if some warning or error was displayed there
+ if {$err || $ern || $warn || $war} {
+ $this bottomnotebook_pageconfigure {Messages} "-image ::ICONS::16::status_unknown"
+ }
+
return [expr {$err || $ern}]
}
@@ -494,14 +549,19 @@ class Messages {
}
## Show search bar
+ # @parm Bool do_focus_entrybox - Automatically focus the search EntryBox
# @return void
- public method messages_text_find_dialog {} {
+ public method messages_text_find_dialog {{do_focus 1}} {
if {![winfo ismapped $search_frame]} {
pack $search_frame -before $main_frame -side top -anchor w
$search_entry delete 0 end
- focus -force $search_entry
- } {
- focus -force $search_entry
+ if {$do_focus} {
+ focus -force $search_entry
+ }
+ } else {
+ if {$do_focus} {
+ focus -force $search_entry
+ }
}
}
@@ -532,12 +592,12 @@ class Messages {
if {$forw__back} {
set direction {-forwards}
- } {
+ } else {
set direction {-backwards}
}
if {${::Todo::match_case}} {
set last_find_index [$messages_text search $direction -- $search_string $from]
- } {
+ } else {
set last_find_index [$messages_text search $direction -nocase -- $search_string $from]
}
if {$last_find_index == {}} {
@@ -546,7 +606,7 @@ class Messages {
$search_find_prev configure -state disabled
$menu entryconfigure [::mc "Find next"] -state disabled
$menu entryconfigure [::mc "Find previous"] -state disabled
- } {
+ } else {
$search_entry configure -style StringFound.TEntry
$search_find_next configure -state normal
$search_find_prev configure -state normal
@@ -562,7 +622,7 @@ class Messages {
}
}
- ## Find next occurence of the search string
+ ## Find next occurrence of the search string
# @return void
public method messages_text_find_next {} {
if {![winfo ismapped $search_frame]} {
@@ -574,7 +634,7 @@ class Messages {
messages_text_perform_search 1 $last_find_index+${search_string_length}c
}
- ## Find previous occurence of the search string
+ ## Find previous occurrence of the search string
# @return void
public method messages_text_find_prev {} {
if {![winfo ismapped $search_frame]} {
@@ -630,3 +690,7 @@ class Messages {
$messages_text tag add hyper_link_over [lindex $range 0] [lindex $range 1]
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/bottompanel/terminal.tcl b/lib/bottompanel/terminal.tcl
index 6c373f8..894fd3b 100755..100644
--- a/lib/bottompanel/terminal.tcl
+++ b/lib/bottompanel/terminal.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 _TERMINAL_TCL ] } {
+set _TERMINAL_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Provides terminal emulator for bottom notebook
@@ -40,7 +45,7 @@ class Terminal {
private variable terminal_frame ;# Widget: ID of terminal container frame
private variable wrapper_frame ;# Widget: Wrapper frame for $terminal_frame
private variable parent ;# Widget: Parent frame
- private variable gui_initialized 0 ;# Bool: GUI initialized
+ private variable term_gui_initialized 0 ;# Bool: GUI initialized
private variable terminal_pid {} ;# Int: PID of terminal emulator
destructor {
@@ -52,7 +57,7 @@ class Terminal {
# @return void
public method PrepareTerminal {_parent} {
set parent $_parent
- set gui_initialized 0
+ set term_gui_initialized 0
}
## Inform this tab than it has became active
@@ -64,8 +69,8 @@ class Terminal {
## Create GUI
# @return void
public method CreateTerminalEmulGUI {} {
- if {$gui_initialized || !${::PROGRAM_AVALIABLE(urxvt)}} {return}
- set gui_initialized 1
+ if {$term_gui_initialized || !${::PROGRAM_AVAILABLE(urxvt)}} {return}
+ set term_gui_initialized 1
set wrapper_frame [frame $parent.wrapper_frame -relief sunken -bd 2]
pack $wrapper_frame -fill both -expand 1
@@ -83,7 +88,7 @@ class Terminal {
set pwd [pwd]
if {[catch {
cd [$this cget -projectPath]
- }]} {
+ }]} then {
cd ~
}
if {[catch {
@@ -93,13 +98,13 @@ class Terminal {
-fg ${configuration(fg)} \
-fn "xft:$configuration(font_family):pixelsize=$configuration(font_size)" & \
]
- } result]} {
+ } result]} then {
tk_messageBox \
-parent . \
-icon warning \
-type ok \
-title [mc "Unable to find urxvt"] \
- -message [mc "Unable to execute program \"urxvt\", terminal emulator is eiter not avaliable or badly configured."]
+ -message [mc "Unable to execute program \"urxvt\", terminal emulator is eiter not available or badly configured."]
puts stderr $result
}
cd $pwd
@@ -110,22 +115,32 @@ class Terminal {
## Restart terminal emulator
# @return void
public method terminal_restart {} {
- if {!$gui_initialized} {return}
- if {!${::PROGRAM_AVALIABLE(urxvt)}} {return}
- catch {
- exec kill $terminal_pid
+ if {!$term_gui_initialized} {return}
+ if {!${::PROGRAM_AVAILABLE(urxvt)}} {return}
+ foreach pid $terminal_pid {
+ if {$pid == [pid] || $pid == 0} {
+ continue
+ }
+ catch {
+ exec -- kill $pid
+ }
}
}
## Kill terminal emulator
# @return void
public method terminal_kill_childern {} {
- if {$gui_initialized} {
+ if {$term_gui_initialized} {
if {[info exists terminal_frame] && [winfo exists $terminal_frame]} {
bind $terminal_frame <Destroy> {}
}
- catch {
- exec kill $terminal_pid
+ foreach pid $terminal_pid {
+ if {$pid == [pid] || $pid == 0} {
+ continue
+ }
+ catch {
+ exec -- kill $pid
+ }
}
}
}
@@ -133,3 +148,7 @@ class Terminal {
# Initialize NS variables
array set ::Terminal::configuration ${::Terminal::configuration_def}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/bottompanel/todo.tcl b/lib/bottompanel/todo.tcl
index 6a7d8ff..21f79a5 100755..100644
--- a/lib/bottompanel/todo.tcl
+++ b/lib/bottompanel/todo.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 _TODO_TCL ] } {
+set _TODO_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Provides autonome GUI component intented for writing ToDo list
@@ -35,13 +40,15 @@ class Todo {
-family ${Editor::fontFamily} \
-size -${Editor::fontSize} \
]
- common normal_font [font create \
- -family {helvetica} \
- -size -12 -weight {normal} \
+ common normal_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight {normal} \
]
- common bold_font [font create \
- -family {helvetica} \
- -size -12 -weight {bold} \
+ common bold_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight {bold} \
]
# List of used text tags
common textTags {
@@ -64,7 +71,7 @@ class Todo {
# Definition of the popup menu
common TODOMENU {
{command {Undo} {Ctrl+Z} 0 "undo" {undo}
- "Undo last operaton"}
+ "Undo last operation"}
{command {Redo} {Ctrl+Shift+Z} 2 "redo" {redo}
"Take back last undo operation"}
{separator}
@@ -83,8 +90,8 @@ class Todo {
"Use bold font"}
{command {Italic text} {$todo:italic} 0 "italic" {text_italic}
"Use italic font"}
- {command {Striketrought text} {$todo:strike} 0 "strike" {text_strike}
- "Use striketrought font"}
+ {command {Strikethrough text} {$todo:strike} 0 "strike" {text_strike}
+ "Use strikethrough font"}
{command {Underline text} {$todo:under} 1 "under" {text_under}
"Use underline font"}
{separator}
@@ -96,7 +103,7 @@ class Todo {
# Variables related to object initialization
private variable input_text ;# String: initial content of the text widget
- private variable gui_initialized 0 ;# Bool: GUI created
+ private variable todo_gui_initialized 0 ;# Bool: GUI created
# Other variables
private variable main_frame ;# ID of main frame (text_widget; scrollbar; button_frame)
@@ -106,7 +113,7 @@ class Todo {
private variable parent_container ;# ID of parent contaner (some frame)
private variable button_bold ;# ID of button "Bold"
private variable button_italic ;# ID of button "Italic"
- private variable button_strike ;# ID of button "Striketrought"
+ private variable button_strike ;# ID of button "Strikethrough"
private variable button_under ;# ID of button "Underline"
private variable active_tags {} ;# Currently active tags
private variable menu {} ;# ID of popup menu
@@ -135,9 +142,9 @@ class Todo {
# Variables related to search bar
private variable search_frame ;# Widget: Search bar frame
- private variable last_find_index ;# String: Index of last found occurence of the search string
- private variable search_string ;# String: Search string
- private variable search_string_length ;# Int: Length of the search string
+ private variable last_find_index {} ;# String: Index of last found occurrence of the search string
+ private variable search_string {} ;# String: Search string
+ private variable search_string_length 0 ;# Int: Length of the search string
private variable search_entry ;# Widget: Search bar entry box
private variable search_find_next ;# Widget: Button "Next"
private variable search_find_prev ;# Widget: Button "Prev"
@@ -151,7 +158,7 @@ class Todo {
-relief flat
ttk::style map Todo_Active.TButton \
-relief [list active raised] \
- -background [list disabled {#EEEEEE} active $buttonActiveBg]
+ -background [list disabled ${::COMMON_BG_COLOR} active $buttonActiveBg]
ttk::style configure Todo_SemiAct.TButton \
-background $buttonSemiActBg \
@@ -159,7 +166,7 @@ class Todo {
-relief flat
ttk::style map Todo_SemiAct.TButton \
-relief [list active raised] \
- -background [list disabled {#EEEEEE} active $buttonSemiActBg]
+ -background [list disabled ${::COMMON_BG_COLOR} active $buttonSemiActBg]
}
## Object destructor
@@ -175,25 +182,25 @@ class Todo {
public method get_file_notes_config {} {
if {$panel_size < $panel_size_last} {
set panel_size_max $panel_size_last
- } {
+ } else {
set panel_size_max $panel_size
}
return [list $notes_visible $panel_size_max]
}
## Get contents of file specific notepad
- # @parm Int = <current> - Index in $LIST_file_notes
+ # @parm Int idx=<current> - Index in $LIST_file_notes
# @return void
- public method get_file_notes_data args {
+ public method get_file_notes_data {{idx {}}} {
CreateTodoGUI
- if {$args == {}} {
+ if {$idx == {}} {
return [$file_notes get 1.0 {end-1l lineend}]
- } {
- set w [lindex $LIST_file_notes $args]
+ } else {
+ set w [lindex $LIST_file_notes $idx]
if {$w == {}} {
return {}
- } {
+ } else {
return [$w get 1.0 {end-1l lineend}]
}
}
@@ -216,7 +223,7 @@ class Todo {
public method PrepareTodo {parentContainer _input_text} {
set parent_container $parentContainer
set input_text $_input_text
- set gui_initialized 0
+ set todo_gui_initialized 0
}
## Inform this tab than it has became active
@@ -279,7 +286,7 @@ class Todo {
## Redraw panel (move pane sash) acorning to current value of $PanelSize
# @return void
public method todo_panel_redraw_pane {} {
- if {!$gui_initialized} {return}
+ if {!$todo_gui_initialized} {return}
if {$redraw_pane_in_progress} {
after 50 "$this todo_panel_redraw_pane"
@@ -294,7 +301,7 @@ class Todo {
set redraw_pane_in_progress 0
}
- ## Set panel width acording to current sash position
+ ## Set panel width according to current sash position
# @return void
public method todo_panel_set_size {} {
set panel_size [lindex [$paned_win sash coord 0] 0]
@@ -316,7 +323,7 @@ class Todo {
set panel_size $panel_size_last
# Hide
- } {
+ } else {
pack forget $file_notes_pagesManager
pack $notes_invisible_frm -fill y -anchor nw
$paned_win paneconfigure $right_pane -minsize 20
@@ -382,11 +389,15 @@ class Todo {
return [$file_notes get 0.0 end]
}
- ## Initialize todo text
+ ## Initialize to do text
# @return void
public method CreateTodoGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$todo_gui_initialized} {return}
+ set todo_gui_initialized 1
+
+ if {${::DEBUG}} {
+ puts "CreateTodoGUI \[ENTER\]"
+ }
set paned_win [panedwindow $parent_container.paned_win \
-sashwidth 4 -showhandle 0 -opaqueresize 1 -orient horizontal \
@@ -407,7 +418,7 @@ class Todo {
# RIGHT PART
#
- set file_notes_pagesManager [PagesManager $right_pane.pmgr -background {#eeeeee}]
+ set file_notes_pagesManager [PagesManager $right_pane.pmgr -background ${::COMMON_BG_COLOR}]
$file_notes_pagesManager compute_size
set notes_invisible_frm [frame $right_pane.notes_invisible_frm]
@@ -460,7 +471,7 @@ class Todo {
-style Flat.TButton \
]
DynamicHelp::add $search_frame.find_next_but \
- -text [mc "Find next occurence of search string"]
+ -text [mc "Find next occurrence of search string"]
# Button: "Prev"
set search_find_prev [ttk::button $search_frame.find_prev_but \
-image ::ICONS::16::up0 \
@@ -469,7 +480,7 @@ class Todo {
-style Flat.TButton \
]
DynamicHelp::add $search_frame.find_prev_but \
- -text [mc "Find previous occurence of search string"]
+ -text [mc "Find previous occurrence of search string"]
# Button: "Close"
pack [ttk::button $search_frame.close_but \
-image ::ICONS::16::button_cancel \
@@ -500,6 +511,9 @@ class Todo {
# Pack main frame
pack $main_frame -fill both -expand 1
+ # Show the search bar frame
+ TodoProc_find_dialog 0
+
# Adjust text widget parameters
TodoProc_write_text_from_sgml $input_text
unset input_text
@@ -517,11 +531,12 @@ class Todo {
<Key-Down> <Key-Up>
<Key-Right> <Key-Left>
<Key-Next> <Key-Prior>
- } {
- bind $text_widget $key "
- [bind Text $key]
- $this recalc_left_panel insert
- break"
+ } \
+ {
+ bind $text_widget $key "
+ [bind Text $key]
+ $this recalc_left_panel insert
+ break"
}
bind $text_widget <KeyRelease> "break"
bind $text_widget <KeyPress> "$this TodoProc_Key %A; break"
@@ -540,7 +555,7 @@ class Todo {
]
DynamicHelp::add $button_bold -text [mc "Bold font"]
setStatusTip -widget $button_bold \
- -text {Use bold font}
+ -text [mc "Use bold font"]
# Button "Italic"
set button_italic [ttk::button $button_frame.todo_text_bI \
-image ::ICONS::16::text_italic \
@@ -550,16 +565,16 @@ class Todo {
DynamicHelp::add $button_italic \
-text [mc "Italic text"]
setStatusTip -widget $button_italic \
- -text {Use italic font}
- # Button "Striketrought"
+ -text [mc "Use italic font"]
+ # Button "Strikethrough"
set button_strike [ttk::button $button_frame.todo_text_bS \
-image ::ICONS::16::text_strike \
-command "$this TodoProc_strike" \
-style Flat.TButton \
]
DynamicHelp::add $button_strike \
- -text [mc "Striketrought font"]
- setStatusTip -widget $button_strike -text {Use striketrought font}
+ -text [mc "Strikethrough font"]
+ setStatusTip -widget $button_strike -text [mc "Use strikethrough font"]
# Button "Underline"
set button_under [ttk::button $button_frame.todo_text_bU \
-image ::ICONS::16::text_under \
@@ -569,11 +584,11 @@ class Todo {
DynamicHelp::add $button_under \
-text [mc "Underline font"]
setStatusTip -widget $button_under \
- -text {Use underline font}
+ -text [mc "Use underline font"]
# pack these buttons
foreach wdg $tagButtons {
- pack [subst "\$$wdg"]
+ pack [subst -nocommands "\$$wdg"]
}
# Button "Eraser"
pack [ttk::button $button_frame.todo_text_bE \
@@ -584,7 +599,7 @@ class Todo {
DynamicHelp::add $button_frame.todo_text_bE \
-text [mc "Erase text tags"]
setStatusTip -widget $button_frame.todo_text_bE \
- -text {Remove formating tags within selected area}
+ -text [mc "Remove formatting tags within selected area"]
# Button "Bookmark"
pack [ttk::button $button_frame.todo_text_bBm \
-image ::ICONS::16::$bookmarkImage \
@@ -609,7 +624,7 @@ class Todo {
## Recreate all text tags and font font for the text widget
# @return void
public method todo_refresh_font_settings {} {
- if {!$gui_initialized} {CreateTodoGUI}
+ if {!$todo_gui_initialized} {CreateTodoGUI}
$text_widget configure -font [font create \
-family ${Editor::fontFamily} \
-size -${Editor::fontSize} \
@@ -620,7 +635,7 @@ class Todo {
## Create bindings for defined key shortcuts
# @return void
public method TodoProc_shortcuts_reevaluate {} {
- if {!$gui_initialized} {CreateTodoGUI}
+ if {!$todo_gui_initialized} {CreateTodoGUI}
# Unset previous configuration
foreach key $set_shortcuts {
@@ -662,16 +677,16 @@ class Todo {
## Create popup menu
# @return void
public method TodoProc_makePopupMenu {} {
- if {!$gui_initialized} {return}
+ if {!$todo_gui_initialized} {return}
if {[winfo exists $menu]} {
destroy $menu
}
- menuFactory $TODOMENU $menu 0 "$this TodoProc_" 0 {}
+ menuFactory $TODOMENU $menu 0 "$this TodoProc_" 0 {} [namespace current]
$menu entryconfigure [::mc "Find next"] -state disabled
$menu entryconfigure [::mc "Find previous"] -state disabled
}
- ## Create text tags in todo text widget
+ ## Create text tags in to do text widget
# @return void
private method todo_create_tags {} {
# Tag "Bold"
@@ -713,7 +728,7 @@ class Todo {
[expr {[winfo rooty $text_widget] + [lindex $bbox 1] + 10}]
}
- ## Enable/Disable popup menu items acording to state of the text widget
+ ## Enable/Disable popup menu items according to state of the text widget
# Auxiliary procedure for 'TodoProc_popupMenu' and 'TodoProc_Key_Menu'
# @return void
private method popup_menu_disena {} {
@@ -723,7 +738,7 @@ class Todo {
$menu entryconfigure [::mc "Cut"] -state normal
}
$menu entryconfigure [::mc "Copy"] -state normal
- } {
+ } else {
$menu entryconfigure [::mc "Cut"] -state disabled
$menu entryconfigure [::mc "Copy"] -state disabled
}
@@ -732,11 +747,11 @@ class Todo {
}
}
- ## Write text to the text widget from SGML formated data
+ ## Write text to the text widget from SGML formatted data
# @parm String inputData - SGML data
# @return void
public method TodoProc_write_text_from_sgml {inputData} {
- if {!$gui_initialized} {CreateTodoGUI}
+ if {!$todo_gui_initialized} {CreateTodoGUI}
# Replace all \r\n shit with LF
regsub -all {(\r)|(\r\n)} $inputData "\n" inputData
@@ -752,8 +767,6 @@ class Todo {
regsub -all {&gt;} $inputData { } inputData
## Parse pair tags
- set lastStartIdx 0
- set lastEndIdx 0
foreach xmltag $xmlTags texttag $textTags {
# modify input data for later processing
@@ -768,7 +781,7 @@ class Todo {
# Translate XML tags to Tk's native text tags
set StartRow 1
set EndCol 0
- while 1 {
+ while {1} {
set SRow 0
set ERow 0
set tagLength [string length "<$xmltag>"]
@@ -778,7 +791,7 @@ class Todo {
set LFidx 0
set LastLFidx $LFidx
- while 1 {
+ while {1} {
set LFidx [string first "\n" $data $LFidx]
if {($LFidx >= $startIdx) || ($LFidx == -1)} {
set correction 0
@@ -789,7 +802,7 @@ class Todo {
set StartCol [expr {$startIdx - $LastLFidx - 1 + $correction}]
set StartRow [expr {$StartRow + $SRow}]
break
- } {
+ } else {
set LastLFidx $LFidx
incr SRow
incr LFidx
@@ -803,7 +816,7 @@ class Todo {
set LFidx 0
set LastLFidx $LFidx
- while 1 {
+ while {1} {
set LFidx [string first "\n" $data $LFidx]
if {($LFidx >= $endIdx) || ($LFidx == -1)} {
set correction 0
@@ -811,7 +824,7 @@ class Todo {
set EndCol [expr {$endIdx - $LastLFidx - $ERow + $correction}]
set EndRow [expr {$EndRow + $ERow}]
break
- } {
+ } else {
set LastLFidx $LFidx
incr ERow
incr LFidx
@@ -835,7 +848,7 @@ class Todo {
foreach tag $selfCtags {
set Row 1
set Col 0
- while 1 {
+ while {1} {
set tagIdx [string first "<$tag" $data]
set tagEndIdx [string first "/>" $data]
if {($tagEndIdx < $tagIdx) || ($tagIdx == -1)} {break}
@@ -845,7 +858,7 @@ class Todo {
set LFidx 0
set LastLFidx $LFidx
- while 1 {
+ while {1} {
set LFidx [string first "\n" $data $LFidx]
if {$LFidx >= $tagIdx} {
@@ -854,7 +867,7 @@ class Todo {
set Col [expr {$tagIdx - $LastLFidx - 1 + $correction}]
set Row [expr {$Row + $rowTmp}]
break
- } {
+ } else {
set LastLFidx $LFidx
incr rowTmp
incr LFidx
@@ -873,10 +886,10 @@ class Todo {
}
}
- ## Return content of text widget formated as SGML
+ ## Return content of text widget formatted as SGML
# @return String - SGML code
public method TodoProc_read_text_as_sgml {} {
- if {!$gui_initialized} {return $input_text}
+ if {!$todo_gui_initialized} {return $input_text}
# Determinate end index
set textEnd [$text_widget index end]
@@ -899,12 +912,12 @@ class Todo {
set i 0
set index {}
- while 1 {
+ while {1} {
set index [lindex $ranges $i]
if {$index == {}} {break}
- lappend tagList "$index $xmltag"
+ lappend tagList [list $index $xmltag]
incr i
- lappend tagList "[lindex $ranges $i] /$xmltag"
+ lappend tagList [list [lindex $ranges $i] "/$xmltag"]
incr i
}
}
@@ -936,12 +949,12 @@ class Todo {
incr col $colCorrection
set imageIdx "$row.$col"
- } {
+ } else {
set lastRow $row
set colCorrection 0
}
- lappend tagList "$imageIdx bookmark/"
+ lappend tagList [list $imageIdx {bookmark/}]
}
# Special reverse sorting of tag list
@@ -963,7 +976,7 @@ class Todo {
incr index
set char [string index $data $index]
set data [string replace $data $index $index "<$tag>$char"]
- } {
+ } else {
set char [string index $data $index]
set data [string replace $data $index $index "$char<$tag>"]
}
@@ -991,7 +1004,7 @@ class Todo {
if {$reverse} {
set A -1
set B 1
- } {
+ } else {
set A 1
set B -1
}
@@ -1010,7 +1023,7 @@ class Todo {
return $A
} elseif {$FC == $EC} {
return 0
- } {
+ } else {
return $B
}
} else {
@@ -1021,7 +1034,7 @@ class Todo {
## Get content of text widget as plain text
# @return String - result
public method read_plain_text {} {
- if {!$gui_initialized} {CreateTodoGUI}
+ if {!$todo_gui_initialized} {CreateTodoGUI}
return [$text_widget get 1.0]
}
@@ -1029,48 +1042,49 @@ class Todo {
# @return void
public method TodoProc_bold {} {
addRemoveTag tag_bold $button_bold
+ after idle [list focus $text_widget]
}
## Switch to italic font
# @return void
public method TodoProc_italic {} {
addRemoveTag tag_italic $button_italic
+ after idle [list focus $text_widget]
}
- ## Switch to striketrought font
+ ## Switch to strikethrough font
# @return void
public method TodoProc_strike {} {
addRemoveTag tag_overstrike $button_strike
+ after idle [list focus $text_widget]
}
## Switch to underline font
# @return void
public method TodoProc_under {} {
addRemoveTag tag_underline $button_under
+ after idle [list focus $text_widget]
}
## Erase tags
- # @parm List idxs = {} - Indexes of selected area
- # @parm Bool reset = 1 - Reset font settings on left panel
+ # @parm List idxs={} - Indexes of selected area
+ # @parm Bool reset=1 - Reset font settings on left panel
# @return Bool - result
- public method TodoProc_eraser args {
- if {$args == {}} {
+ public method TodoProc_eraser {{idxs {}} {reset 1}} {
+ if {$idxs == {}} {
set idxs [getSelectionIdx]
- set reset 1
- set active_tags {}
- } {
- set idxs [lindex $args 0]
- set reset [lindex $args 1]
}
if {$idxs == {}} {
- set active_tags {}
reset_left_panel
return 0
}
foreach tag $textTags {
$text_widget tag remove $tag [lindex $idxs 0] [lindex $idxs 1]
}
- if {$reset} {reset_left_panel}
+ if {$reset} {
+ reset_left_panel
+ set active_tags [list]
+ }
return 1
}
@@ -1125,7 +1139,7 @@ class Todo {
public method TodoProc_paste {} {
if {[catch {
set data [clipboard get]
- }]} {
+ }]} then {
return
}
catch {$text_widget delete sel.first sel.last}
@@ -1135,7 +1149,7 @@ class Todo {
## Clear all text
# @return void
public method TodoProc_clear {} {
- if {!$gui_initialized} {CreateTodoGUI}
+ if {!$todo_gui_initialized} {CreateTodoGUI}
catch {$text_widget delete 1.0 end}
}
@@ -1247,7 +1261,7 @@ class Todo {
return 1
}
- ## Set background color for button related to given text tag acording to given state
+ ## Set background color for button related to given text tag according to given state
# @parm String tag - name of text tag
# @parm Int state - state number (0 == passive; 1 == active; 2 == semi-active)
# @return void
@@ -1305,12 +1319,12 @@ class Todo {
foreach button $tagButtons {
# Determinate ID of button widget
- set buttonWdg [subst "\$$button"]
+ set buttonWdg [subst -nocommands "\$$button"]
# Determinate state number and set Bg
if {[lsearch $affected $button] != -1} {
setButtonBg $buttonWdg 1
- } {
+ } else {
setButtonBg $buttonWdg 0
}
}
@@ -1320,11 +1334,11 @@ class Todo {
# @return void
private method reset_left_panel {} {
foreach button $tagButtons {
- setButtonBg [subst "\$$button"] 0
+ setButtonBg [subst -nocommands "\$$button"] 0
}
}
- ## Set background color for given button acording to given state
+ ## Set background color for given button according to given state
# @parm Widget button - ID of button to modify
# @parm Int state - state number (0 == passive; 1 == active; 2 == semi-active)
# @return void
@@ -1352,13 +1366,20 @@ class Todo {
lappend active_tags $tagName
# Tag is active -> remove the tag
- } {
+ } else {
setButtonBg $buttonName 0
set active_tags [lreplace $active_tags $tagIdx $tagIdx]
}
- # Modify selected area
+ ## Modify the selected area
set idxs [getSelectionIdx]
+ # There is no selected area
+ if {$idxs == {}} {
+ set char_before_cursor [$text_widget get insert-1c insert]
+ if {$char_before_cursor == { } || $char_before_cursor == "\t" || $char_before_cursor == "\xC2"} {
+ set idxs [list [$text_widget index insert-1c] [$text_widget index insert]]
+ }
+ }
if {$idxs != {}} {
TodoProc_eraser $idxs 0
foreach tag $active_tags {
@@ -1369,7 +1390,7 @@ class Todo {
## Set given text tag for area determinated by given indexes
# @parm String tagName - name of text tag to set
- # @parm List idxs = {} - target area {first_idx last_idx}
+ # @parm List idxs - target area {first_idx last_idx}
# @return Bool - result
private method setTagAtSel {tagName idxs} {
if {$idxs == {}} {return 0}
@@ -1381,14 +1402,16 @@ class Todo {
# @return List - text indexes '{first last}' or '{}'
private method getSelectionIdx {} {
# Try to determinate indexes
+ set start {}
+ set end {}
catch {
- set start [$text_widget index sel.first]
- set end [$text_widget index sel.last]
+ set start [$text_widget index sel.first]
+ set end [$text_widget index sel.last]
}
# Return result
- if {[info exists start]} {
- return "$start $end"
- } {
+ if {$start != {} && $end != {}} {
+ return [list $start $end]
+ } else {
return {}
}
}
@@ -1402,14 +1425,19 @@ class Todo {
}
## Show search bar
+ # @parm Bool do_focus_entrybox - Automatically focus the search EntryBox
# @return void
- public method TodoProc_find_dialog {} {
+ public method TodoProc_find_dialog {{do_focus 1}} {
if {![winfo ismapped $search_frame]} {
pack $search_frame -before $main_frame -side top -anchor w
$search_entry delete 0 end
- focus -force $search_entry
- } {
- focus -force $search_entry
+ if {$do_focus} {
+ focus -force $search_entry
+ }
+ } else {
+ if {$do_focus} {
+ focus -force $search_entry
+ }
}
}
@@ -1440,12 +1468,12 @@ class Todo {
if {$forw__back} {
set direction {-forwards}
- } {
+ } else {
set direction {-backwards}
}
if {${::Todo::match_case}} {
set last_find_index [$text_widget search $direction -- $search_string $from]
- } {
+ } else {
set last_find_index [$text_widget search $direction -nocase -- $search_string $from]
}
if {$last_find_index == {}} {
@@ -1454,7 +1482,7 @@ class Todo {
$search_find_prev configure -state disabled
$menu entryconfigure [::mc "Find next"] -state disabled
$menu entryconfigure [::mc "Find previous"] -state disabled
- } {
+ } else {
$search_entry configure -style StringFound.TEntry
$search_find_next configure -state normal
$search_find_prev configure -state normal
@@ -1470,7 +1498,7 @@ class Todo {
}
}
- ## Find next occurence of the search string
+ ## Find next occurrence of the search string
# @return void
public method TodoProc_find_next {} {
if {![winfo ismapped $search_frame]} {
@@ -1482,7 +1510,7 @@ class Todo {
TodoProc_perform_search 1 $last_find_index+${search_string_length}c
}
- ## Find previous occurence of the search string
+ ## Find previous occurrence of the search string
# @return void
public method TodoProc_find_prev {} {
if {![winfo ismapped $search_frame]} {
@@ -1494,3 +1522,7 @@ class Todo {
TodoProc_perform_search 0 $last_find_index
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/cli.tcl b/lib/cli.tcl
index d423339..63b28e0 100755..100644
--- a/lib/cli.tcl
+++ b/lib/cli.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 _CLI_TCL ] } {
+set _CLI_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Handle options given by command line interface
@@ -30,17 +35,17 @@
# SET COMMMAND LINE OPTIONS TO DEFAULTS
# --------------------------------------
set CLI_OPTION(notranslation) 0 ;# Disable i18n
-set CLI_OPTION(quiet) 0 ;# Don't display status of initialization progress on startup
+set CLI_OPTION(quiet) 0 ;# Don't display status of initialization progress on start-up
set CLI_OPTION(nosplash) 0 ;# Don't show splash screen
set CLI_OPTION(nocolor) 0 ;# Disable color output
set CLI_OPTION(defaults) 0 ;# Start with default settings
set CLI_OPTION(minimalized) 0 ;# Start with minimalized window
set CLI_OPTION(ignore_last) 0 ;# Start with an empty session
-set CLI_OPTION(check_libraries) 0 ;# Check if all nessery Tcl libraries are avaible
+set CLI_OPTION(check_libraries) 0 ;# Check if all necessary Tcl libraries are available
set CLI_OPTION(reset_settings) 0 ;# Reset all user settings to defaults
set CLI_OPTION(help) 0 ;# Show help message and exit
set CLI_OPTION(convert) 0 ;# Convert one file to another format
-set CLI_OPTION(no_opt) 0 ;# Disable optimalizations
+set CLI_OPTION(no_opt) 0 ;# Disable optimization
set CLI_OPTION(comp_quiet) 0 ;# Suppress compiler console output
set CLI_OPTION(no_sim) 0 ;# Do not generate SIM file
set CLI_OPTION(no_bin) 0 ;# Do not generate binary object code
@@ -50,13 +55,14 @@ set CLI_OPTION(warning_level) 0 ;# Compiler warning level
set CLI_OPTION(input_output) {} ;# List of file to convert: [0] == input file; [1] == output file
set CLI_OPTION(compile) {} ;# Compile this asm file and exit
set CLI_OPTION(open_project) {} ;# Open only project specified by this var if any
-set CLI_OPTION(config_file) {} ;# Specify path to file containg user settings
+set CLI_OPTION(config_file) {} ;# Specify path to file containing user settings
set CLI_OPTION(autoindent) {} ;# Specify path to file to indent
set CLI_OPTION(iram-size) {} ;# Size of internal data memory
set CLI_OPTION(xram-size) {} ;# Size of external data memory
set CLI_OPTION(code-size) {} ;# Size of program memory
set CLI_OPTION(disassemble) {} ;# IHEX8 file to disassemble
-set CLI_OPTION(no-plugins) 0 ;# Disable plugins
+set CLI_OPTION(no-plugins) 0 ;# Disable plug-ins
+set CLI_OPTION(simulator) 0 ;# Start simulator only
# ------------------------------------------------------------------------------
@@ -65,6 +71,8 @@ set CLI_OPTION(no-plugins) 0 ;# Disable plugins
if {$::MICROSOFT_WINDOWS} {
# Windows has no terminal control codes (at least I am not aware of them)
set CLI_OPTION(nocolor) 1
+ # It's usually only annoying to have verbose output on Windows
+ set CLI_OPTION(quiet) 1
}
# ------------------------------------------------------------------------------
@@ -102,7 +110,7 @@ proc CLI_set_memory_limit {option value maximum_in_hex memtype} {
if {[string index $arg end] == {k}} {
set arg [string replace $arg end end]
set kilo 1
- } {
+ } else {
set kilo 0
}
if {![string is digit -strict $arg]} {
@@ -113,7 +121,7 @@ proc CLI_set_memory_limit {option value maximum_in_hex memtype} {
set arg [expr {$arg * 1024}]
}
if {$arg > $maximum_in_hex} {
- puts stderr "Maximum acceptable size of $memtype memory is $maximum_in_hex ([expr $maximum_in_hex])"
+ puts stderr "Maximum acceptable size of $memtype memory is $maximum_in_hex ([expr {$maximum_in_hex}])"
exit 1
}
set CLI_OPTION($option) $arg
@@ -158,12 +166,12 @@ proc CLI_convert {i type} {
set file [lindex $argv [expr {$i + 2}]]
if {[file exists $file]} {
if {
- [file isdirectory $file] ||
- ![file writable $file]
- } {
- puts "${::APPNAME}"
- puts stderr "\tERROR: Unable to write to file '$file'"
- exit 1
+ [file isdirectory $file] ||
+ ![file writable $file]
+ } then {
+ puts "${::APPNAME}"
+ puts stderr "\tERROR: Unable to write to file '$file'"
+ exit 1
}
}
}
@@ -190,26 +198,35 @@ proc CLI_next_arg {i option key} {
# Check if the specified file does exist
if {
- [file isdirectory $::CLI_OPTION($key)] ||
- ![file exists $::CLI_OPTION($key)] ||
- (!$::MICROSOFT_WINDOWS && ![file readable $::CLI_OPTION($key)])]
- } {
- puts "${::APPNAME}"
- puts stderr "\tERROR: Unable to read file '$::CLI_OPTION($key)'"
- exit 1
+ [file isdirectory $::CLI_OPTION($key)] ||
+ ![file exists $::CLI_OPTION($key)] ||
+ (!$::MICROSOFT_WINDOWS && ![file readable $::CLI_OPTION($key)])
+ } then {
+ puts "${::APPNAME}"
+ puts stderr "\tERROR: Unable to read file '$::CLI_OPTION($key)'"
+ exit 1
}
}
-# PARSE COMMAND LINE OPTIONS
-# --------------------------
+## Parse command line options
+ # @return void
+proc parse_cli_options {} {
+ global argc ;# Int: Arguments count
+ global argv ;# List: Arguments list
+ global CLI_OPTION ;# Array: Commmand line options
+
+ # Open project file, if it's the only argument given to the program
+ if {$argc == 1 && [regexp {^.+\.mcu8051ide$} [lindex $argv 0]]} {
+ set CLI_OPTION(open_project) [file normalize [lindex $argv 0]]
+ return
+ }
-if {$argc} {
# iterate over all given arguments
for {set i 0} {$i < $argc} {incr i} {
set arg [lindex $argv $i]
# decide what to do with each of them
- switch -- $arg {
+ switch -exact -- $arg {
{--help} { ;# Display help message only
set CLI_OPTION(help) 1
@@ -217,7 +234,7 @@ if {$argc} {
{-h} { ;# Display help message only
set CLI_OPTION(help) 1
}
- {--quiet} { ;# Don't display initialization progress on startup
+ {--quiet} { ;# Don't display initialization progress on start-up
set CLI_OPTION(quiet) 1
}
{--no-translation} { ;# Disable i18n
@@ -226,7 +243,7 @@ if {$argc} {
{--no-i18n} { ;# Disable i18n
set CLI_OPTION(notranslation) 1
}
- {-q} { ;# Don't display initialization progress on startup
+ {-q} { ;# Don't display initialization progress on start-up
set CLI_OPTION(quiet) 1
}
{--nosplash} { ;# Don't show splash screen
@@ -264,6 +281,7 @@ if {$argc} {
CLI_next_arg $i {--config-file} {config_file}
incr i
}
+ {--assemble} -
{--compile} { ;# Compile asm file and exit
CLI_next_arg $i {--compile} {compile}
incr i
@@ -307,7 +325,7 @@ if {$argc} {
incr i
CLI_set_memory_limit {code-size} [lindex $argv $i] 0x10000 {code}
}
- {--no-opt} { ;# Disable optimalizations
+ {--no-opt} { ;# Disable optimization
set CLI_OPTION(no_opt) 1
}
{--comp-quiet} { ;# Suppress compiler console output
@@ -341,12 +359,26 @@ if {$argc} {
{--no-plugins} { ;# Disable plugins
set CLI_OPTION(no-plugins) 1
}
+ {--simulator} { ;# Start simulator only
+ set CLI_OPTION(simulator) 1
+ }
default { ;# Unknown option -- terminate program
puts stderr "Unknown command line option: '$arg'"
exit 1
}
}
}
+
+ # discard CLI arguments
+ set argc 0
+ set argv [list]
+}
+
+# PARSE COMMAND LINE OPTIONS
+# --------------------------
+
+if {$argc} {
+ parse_cli_options
}
# HANDLE CLI OPTIONS WHICH REQUIRE INSTANT RESPONSE
@@ -361,15 +393,15 @@ if {$CLI_OPTION(help)} {
set clr_end {}
set clr_opt {}
set clr_arg {}
- } {
+ } else {
puts "\033\[1mOptions:\033\[m"
set clr_end "\033\[m"
set clr_opt "\033\[32m"
set clr_arg "\033\[33;1m"
}
- puts "\t${clr_opt}--no-translation${clr_end},\tDisplay program language translation\n\t${clr_opt}--no-i18n${clr_end}"
+ puts "\t${clr_opt}--no-translation${clr_end},\tDisable program language translation\n\t${clr_opt}--no-i18n${clr_end}"
puts "\t${clr_opt}--help${clr_end}, ${clr_opt}-h${clr_end}\t\tDisplay this message"
- puts "\t${clr_opt}--quiet${clr_end}, ${clr_opt}-q${clr_end}\t\tDon't display status of initialization progress on startup"
+ puts "\t${clr_opt}--quiet${clr_end}, ${clr_opt}-q${clr_end}\t\tDon't display status of initialization progress on start-up"
puts "\t${clr_opt}--no-plugins${clr_end}\t\tDisable plugins"
puts "\t${clr_opt}--nosplash${clr_end}\t\tDon't show splash screen"
puts "\t${clr_opt}--nocolor${clr_end}, ${clr_opt}-n${clr_end}\t\tDisable color output"
@@ -378,7 +410,7 @@ if {$CLI_OPTION(help)} {
puts "\t${clr_opt}--minimalized${clr_end}\t\tStart with minimalized window"
puts "\t${clr_opt}--config-file ${clr_arg}filename${clr_end}\tSpecify path to file containg user settings"
puts "\t${clr_opt}--check-libraries${clr_end}\tCheck if all nessesary Tcl libraries are avaible"
- puts "\t${clr_opt}--ignore-last-session${clr_end}\tStart with an empty session (no project will be opened at startup)"
+ puts "\t${clr_opt}--ignore-last-session${clr_end}\tStart with an empty session (no project will be opened at start-up)"
puts "\t${clr_opt}--open-project ${clr_arg}project${clr_end}\tOpen only this project"
puts "\t${clr_opt}--reset-user-settings${clr_end}\tReset all user settings to defaults"
puts ""
@@ -390,13 +422,14 @@ if {$CLI_OPTION(help)} {
puts "\t${clr_opt}--normalize-hex ${clr_arg}input${clr_end}\tNormalize IHEX8 file"
puts ""
puts "\t${clr_opt}--disassemble ${clr_arg}hex_file${clr_end}\tDisaseble IHEX8 code to ${clr_arg}hex_file.asm${clr_end}"
- puts "\t${clr_opt}--compile ${clr_arg}asm_file${clr_end}\tCompile asm file and exit"
+ puts "\t${clr_opt}--assemble ${clr_arg}asm_file${clr_end}\tCompile asm file and exit"
+ puts "\t${clr_opt}--compile ${clr_arg}asm_file${clr_end}\tThe same as ``--assemble''"
puts "\t${clr_opt}--iram-size ${clr_arg}size${clr_end}\tSet size of internal data memory\t(eg. 1K or 1024) (default: 0x100)"
puts "\t${clr_opt}--code-size ${clr_arg}size${clr_end}\tSet size of program memory\t\t(eg. 1K or 1024) (default: 0x10000)"
puts "\t${clr_opt}--xram-size ${clr_arg}size${clr_end}\tSet size of external data memory\t(eg. 1K or 1024) (default: 0x10000)"
- puts "\t${clr_opt}--no-opt${clr_end}\t\tDisable optimalizations"
+ puts "\t${clr_opt}--no-opt${clr_end}\t\tDisable optimization"
puts "\t${clr_opt}--comp-quiet${clr_end}\t\tSuppress compiler console output"
- puts "\t${clr_opt}--no-sim${clr_end}\t\tDo not generate SIM file (for MCU 8051 IDE simulator)"
+ puts "\t${clr_opt}--no-sim${clr_end}\t\tDo not generate ADF file (Asm. Debug File for MCU 8051 IDE simulator)"
puts "\t${clr_opt}--no-bin${clr_end}\t\tDo not generate binary object code"
puts "\t${clr_opt}--no-lst${clr_end}\t\tDo not generate code listing"
puts "\t${clr_opt}--no-hex${clr_end}\t\tDo not generate IHEX8 object code"
@@ -406,6 +439,7 @@ if {$CLI_OPTION(help)} {
puts "\t\t${clr_arg}1${clr_end} - Errors + Warnings"
puts "\t\t${clr_arg}0${clr_end} - All (Default)"
puts ""
+ puts "\t${clr_opt}--simulator${clr_end}\t\tStart simulator only, see manual for more details"
exit
}
@@ -431,7 +465,7 @@ if {$CLI_OPTION(convert)} {
# Open input and output file
set input [open $input {r}]
- set output [open $output {w} 420]
+ set output [open $output {w} 0640]
fconfigure $input -translation binary
fconfigure $output -translation binary
@@ -476,7 +510,7 @@ if {$CLI_OPTION(convert)} {
if {${::IHexTools::error_count}} {
puts "FAILED !"
puts ${::IHexTools::error_string}
- } {
+ } else {
puts "Successful"
}
@@ -502,7 +536,7 @@ if {$CLI_OPTION(autoindent) != {}} {
exit 1
}
}
- puts "Formating ..."
+ puts "Formatting ..."
# Load and reformat file content
set ::X::reformat_code_abort 0
@@ -512,7 +546,7 @@ if {$CLI_OPTION(autoindent) != {}} {
close $file
# Save file
- set file [open $CLI_OPTION(autoindent) w 420]
+ set file [open $CLI_OPTION(autoindent) w 0640]
puts -nonewline $file $data
close $file
@@ -534,8 +568,8 @@ if {$CLI_OPTION(disassemble) != {}} {
# Open source and destination files
if {[catch {
set src_file [open $CLI_OPTION(disassemble) {r}]
- set trg_file [open [file rootname $CLI_OPTION(disassemble)].asm w 420]
- }]} {
+ set trg_file [open [file rootname $CLI_OPTION(disassemble)].asm w 0640]
+ }]} then {
puts stderr "Unable to open either \"$CLI_OPTION(disassemble)\" or \"[file rootname $CLI_OPTION(disassemble)].asm\""
exit 1
}
@@ -551,15 +585,15 @@ if {$CLI_OPTION(disassemble) != {}} {
if {${::IHexTools::error_count}} {
puts ${::IHexTools::error_string}
if {$CLI_OPTION(nocolor)} {
- puts "Decompilation FAILED"
- } {
- puts "\033\[31;1mDecompilation FAILED\033\[m"
+ puts "Disassembly FAILED"
+ } else {
+ puts "\033\[31;1mDisassembly FAILED\033\[m"
}
}
if {$CLI_OPTION(nocolor)} {
puts "Result stored in \"[file rootname $CLI_OPTION(disassemble)].asm\"\n"
- } {
+ } else {
puts "Result stored in \"\033\[34;1m[file rootname $CLI_OPTION(disassemble)].asm\033\[m\"\n"
}
@@ -574,7 +608,7 @@ if {$CLI_OPTION(disassemble) != {}} {
if {$CLI_OPTION(compile) != {}} {
# Import required sources
package require md5 2.0.1
- source "${::LIB_DIRNAME}/lib/Math.tcl" ;# Special mathematical operations
+ source "${::LIB_DIRNAME}/lib/Math.tcl" ;# Special mathematical operations
source "${::LIB_DIRNAME}/compiler/compiler.tcl" ;# 8051 Assemly language compiler
source "${::LIB_DIRNAME}/lib/ihextools.tcl" ;# Tools for manipulating with IHEX8
@@ -594,7 +628,7 @@ if {$CLI_OPTION(compile) != {}} {
set Compiler::Settings::xram_size $CLI_OPTION(xram-size)
}
- # Enable / Disable optimalizations
+ # Enable / Disable optimization
if {$CLI_OPTION(no_opt)} {
set Compiler::Settings::optim_ena 0
}
@@ -620,7 +654,7 @@ if {$CLI_OPTION(compile) != {}} {
# Initialize compiler
set result [Compiler::compile $directory $directory $filename $extension]
- # Exit acording to compilation result
+ # Exit according to compilation result
exit [expr {!$result}]
}
@@ -628,24 +662,24 @@ if {$CLI_OPTION(compile) != {}} {
if {$CLI_OPTION(check_libraries)} {
# Local varibale
- set librariesToCheck [llength $LIBRARIES_TO_LOAD] ;# Number of libs to check
+ set librariesToCheck [llength $::LIBRARIES_TO_LOAD] ;# Number of libs to check
set failsVer 0 ;# Number of libraries which didn't pass version check
set failsLib 0 ;# Number of libraries which could not be found
set failsTotal 0 ;# Number of fails tottaly
- puts "$APPNAME\n"
+ puts "$::APPNAME\n"
puts "\tChecking libraries..."
# Iterate over list of needed libraries
for {set i 0} {$i < $librariesToCheck} {incr i} {
# Local variables
- set library [lindex $LIBRARIES_TO_LOAD "$i 0"] ;# Library name
- set version [lindex $LIBRARIES_TO_LOAD "$i 1"] ;# Library version
+ set library [lindex $::LIBRARIES_TO_LOAD [list $i 0]] ;# Library name
+ set version [lindex $::LIBRARIES_TO_LOAD [list $i 1]] ;# Library version
# Print what library is currently being checked
if {$CLI_OPTION(nocolor)} {
puts "\t\t[expr {$i + 1}]/$librariesToCheck Checking for library $library"
- } {
+ } else {
puts "\t\t\033\[33m[expr {$i + 1}]/$librariesToCheck\033\[m \033\[37mChecking for library\033\[m \033\[32m$library\033\[m"
}
@@ -655,14 +689,14 @@ if {$CLI_OPTION(check_libraries)} {
if {[catch {package require $library}]} {
if {$CLI_OPTION(nocolor)} {
puts "NO !"
- } {
+ } else {
puts "\033\[31;01mNO !\033\[m"
}
incr failsLib
- } {
+ } else {
if {$CLI_OPTION(nocolor)} {
puts "YES"
- } {
+ } else {
puts "\033\[32;01mYES\033\[m"
}
}
@@ -670,21 +704,21 @@ if {$CLI_OPTION(check_libraries)} {
# Perform version check and diplay result
if {$CLI_OPTION(nocolor)} {
puts -nonewline "\t\t\tVersion $version\t... "
- } {
+ } else {
puts -nonewline "\t\t\tVersion \033\[36m$version\033\[m\t... "
}
flush stdout
if {[catch {package require $library $version}]} {
if {$CLI_OPTION(nocolor)} {
puts "NO !"
- } {
+ } else {
puts "\033\[31;01mNO !\033\[m"
}
incr failsVer
- } {
+ } else {
if {$CLI_OPTION(nocolor)} {
puts "YES"
- } {
+ } else {
puts "\033\[32;01mYES\033\[m"
}
}
@@ -693,7 +727,7 @@ if {$CLI_OPTION(check_libraries)} {
# Determinate number of total fails
if {$failsVer > $failsLib} {
set failsTotal $failsVer
- } {
+ } else {
set failsTotal $failsLib
}
@@ -704,16 +738,16 @@ if {$CLI_OPTION(check_libraries)} {
if {$CLI_OPTION(nocolor)} {
puts "\t\tNumber of fails: $failsTotal"
puts "\t\tPROGRAM WILL NOT RUN, please install the missing libraries"
- } {
+ } else {
puts "\t\tNumber of fails: \033\[31m$failsTotal\033\[m"
puts "\t\t\033\[31;01mPROGRAM WILL NOT RUN\033\[m, please install the missing libraries"
}
- } {
+ } else {
# SUCCESSFUL
if {$CLI_OPTION(nocolor)} {
puts "\t\tNumber of fails: $failsTotal"
puts "\t\tEverything seems ok"
- } {
+ } else {
puts "\t\tNumber of fails: \033\[32;01m$failsTotal\033\[m"
puts "\t\t\033\[32mEverything seems ok\033\[m"
}
@@ -723,3 +757,44 @@ if {$CLI_OPTION(check_libraries)} {
# done ...
exit
}
+
+# Start simulator only
+if {$CLI_OPTION(simulator)} {
+ puts [list $::SHORTNAME {SIM-ENGINE} $::VERSION]
+
+ # Import required libraries
+ package require Itcl 3.4
+ package require tdom 0.8
+
+ # Configure environment
+ set ::GUI_AVAILABLE 0
+ namespace import -force ::itcl::*
+
+ # Tools for manipulating with IHEX8
+ source "${::LIB_DIRNAME}/lib/ihextools.tcl"
+ # Simulator engine
+ source "${::LIB_DIRNAME}/simulator/engine/engine_core.tcl"
+ # PALE
+ source "${::LIB_DIRNAME}/pale/pale.tcl"
+ # Simulator enginine CLI
+ source "${::LIB_DIRNAME}/simulator/engine/engine_text_based_interface.tcl"
+ # Database of supported MCUs
+ source "${::LIB_DIRNAME}/dialogues/selectmcu.tcl"
+ #
+ source "${::LIB_DIRNAME}/lib/Math.tcl"
+ #
+ source "${::LIB_DIRNAME}/compiler/assembler.tcl"
+ #
+ source "${::LIB_DIRNAME}/compiler/compilerconsts.tcl"
+
+
+ # Enter main loop of the sim. engine CLI
+ SimulatorEngineCLI::enter_main_loop
+
+ # done ...
+ exit
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/compiler/assembler.tcl b/lib/compiler/assembler.tcl
index 5c41a28..17e5244 100755..100644
--- a/lib/compiler/assembler.tcl
+++ b/lib/compiler/assembler.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 _ASSEMBLER_TCL ] } {
+set _ASSEMBLER_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Coverts precompiled source code to IHEX 8 format.
@@ -43,7 +48,7 @@
# ...
# hash - Hexadecimal MD5 hash of source code
# file - Filename of source code
-# filenum - File number (begining from 0)
+# filenum - File number (beginning from 0)
# line - Number of line in source code
# address - Code address
# code - Processor code
@@ -78,7 +83,7 @@ namespace eval assembler {
variable offset ;# Current address
variable data_len ;# Data length (for creating IHEX records)
variable data_field ;# Data field (for creating IHEX records)
- variable address ;# Address of begining of IHEX data field
+ variable address ;# Address of beginning of IHEX data field
variable operands ;# List of operand codes
variable opcode ;# OP code of the current instruction
variable bin_len ;# Lenght of binary data
@@ -106,7 +111,7 @@ namespace eval assembler {
variable lineNumber 0 ;# Number of line currently beeing parsed
variable opcode ;# OP code of the current instruction
variable operands ;# List of operand codes
- variable address ;# Address of begining of IHEX data field
+ variable address ;# Address of beginning of IHEX data field
variable opr_types ;# List of operand types
variable offset 0 ;# Current address
variable data_len 0 ;# Data length (for creating IHEX records)
@@ -137,7 +142,7 @@ namespace eval assembler {
foreach filename $included_files {
if {[catch {
append adf [::md5::md5 -hex -file $filename]
- } result]} {
+ } result]} then {
append adf 0
CompilationError [mc "File access error:\n%s" $result]
}
@@ -152,7 +157,9 @@ namespace eval assembler {
foreach line $code {
# Update GUI after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Aborted"]
free_resources
@@ -179,6 +186,7 @@ namespace eval assembler {
if {$opcode == { }} {
set opcode 32
}
+
set opcode [format %X $opcode]
set digits [string length $opcode]
if {$digits < 2} {
@@ -189,7 +197,7 @@ namespace eval assembler {
}
set nolist 1
- } {
+ } else {
# Check for instruction existence
if {[notAnInstruction $instruction]} {continue}
@@ -206,7 +214,7 @@ namespace eval assembler {
set offset $address
}
- # If data length overlaps 255 or adress is too high -> flush data buffer
+ # If data length overlaps 255 or address is too high -> flush data buffer
if {($pointer < $address) || (($data_len + $len) > ${::Compiler::Settings::max_ihex_rec_length})} {
write_bin
write_hex
@@ -214,7 +222,7 @@ namespace eval assembler {
set offset $address
set pointer $address
- # Unexpected adress
+ # Unexpected address
} elseif {$pointer > $address} {
CompilationError [mc "Invalid address at %s" 0x[format %X $address]]
set pointer $address
@@ -231,7 +239,7 @@ namespace eval assembler {
# Translate operands to 16|12|8-bit hex
set operands [oprs2hex]
- # Adjust inctruction OP code acording to the OP code mask and operands
+ # Adjust instruction OP code according to the OP code mask and operands
if {$mask != 0} {
# Determinate length of the first operand
set mask_bin [hex2binlist $mask]
@@ -259,12 +267,12 @@ namespace eval assembler {
set operand0 [string range $operand0 $opr_len end]
# Adjust OP code
- set idx 0
+ set op_idx 0
foreach mask_bit $mask_bin {
if {$mask_bit} {
- set opcode [lreplace $opcode $idx $idx [lindex $opcode_opr $idx]]
+ set opcode [lreplace $opcode $op_idx $op_idx [lindex $opcode_opr $op_idx]]
}
- incr idx
+ incr op_idx
}
# Finalize
@@ -290,7 +298,7 @@ namespace eval assembler {
append opcode [lindex $operands 1]
append opcode [lindex $operands 0]
# Other instructions
- } {
+ } else {
foreach opr $operands {
append opcode $opr
}
@@ -308,12 +316,13 @@ namespace eval assembler {
write_hex
if {${::Compiler::Settings::OBJECT}} {
append hex {:00000001FF}
+ append hex "\n"
}
# Return result
if {$error_count} {
return 0
- } {
+ } else {
return 1
}
}
@@ -327,7 +336,8 @@ namespace eval assembler {
data_field address operands
opcode bin_len error_count
fileNumber
- } {
+ } \
+ {
set ::assembler::$var {}
}
}
@@ -355,7 +365,7 @@ namespace eval assembler {
variable adf ;# Output simulator data
variable fileNumber ;# File number
variable lineNumber ;# Number of line currently beeing parsed
- variable address ;# Address of begining of IHEX data field
+ variable address ;# Address of beginning of IHEX data field
variable opcode ;# OP code of the current instruction
variable operands ;# List of operand codes
@@ -370,12 +380,12 @@ namespace eval assembler {
lappend new_code [expr "0x[lindex $operands 1]"]
lappend new_code [expr "0x[lindex $operands 0]"]
# Other instructions
- } {
+ } else {
foreach hex $operands {
if {[string length $hex] == 4} {
lappend new_code [expr "0x[string range $hex 0 1]"]
lappend new_code [expr "0x[string range $hex 2 3]"]
- } {
+ } else {
lappend new_code [expr "0x$hex"]
}
}
@@ -409,7 +419,7 @@ namespace eval assembler {
# Write binary data
for {set i 0; set j 1} {$i < $data_len} {incr i 2; incr j 2} {
set hex [string range $data_field $i $j]
- append bin [subst "\\x$hex"]
+ append bin [subst -nocommands "\\x$hex"]
incr bin_len
}
}
@@ -480,13 +490,18 @@ namespace eval assembler {
# Check for validity of the given operand
set opr [string trimleft $opr {#@/}]
- if {![regexp {^\d+$} $opr]} {
+ if {![string is digit -strict $opr]} {
CompilationError [mc "Invalid operand: '%s'" $opr]
break
}
# Convert to hexadecimal string
- set opr [format %X $opr]
+ set opr [string trimleft $opr 0]
+ if {$opr == {}} {
+ set opr 0
+ } else {
+ set opr [format %X $opr]
+ }
# Adjust length
set opr_len [string length $opr]
@@ -525,7 +540,7 @@ namespace eval assembler {
variable opr_types ;# List of operand types
# Iterate over operands definitions
- foreach definition [lindex $CompilerConsts::InstructionDefinition($instruction) 1] {
+ foreach definition [lindex $::CompilerConsts::InstructionDefinition($instruction) 1] {
# Determinate operand types
set opr_list [lindex $definition 0]
@@ -585,11 +600,15 @@ namespace eval assembler {
if {${::Compiler::Settings::WARNING_LEVEL} < 3} {
if {${::Compiler::Settings::NOCOLOR}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
- [::Compiler::msgc {EL}][mc "Compilation error at line %s: %s" "${lineNumber}${filename}" $errorInfo]
- } {
+ [::Compiler::msgc {EL}][mc "Compilation error at %s: %s" "${lineNumber}${filename}" $errorInfo]
+ } else {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
- [mc "\033\[31;1mCompilation error at line \033\[31;1;4m%s\033\[m%s: %s" $lineNumber $filename $errorInfo]
+ [mc "\033\[31;1mCompilation error at \033\[31;1;4m%s\033\[m%s: %s" $lineNumber $filename $errorInfo]
}
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/compiler/codelisting.tcl b/lib/compiler/codelisting.tcl
index 1940dc3..a760d4c 100755..100644
--- a/lib/compiler/codelisting.tcl
+++ b/lib/compiler/codelisting.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 _CODELISTING_TCL ] } {
+set _CODELISTING_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Hepler namespace to generate code listing.
@@ -68,42 +73,42 @@ namespace eval CodeListing {
set pageLines 0
# Validate compiler settings
- if {${Compiler::Settings::PAGELENGTH} < 5} {
+ if {${::Compiler::Settings::PAGELENGTH} < 5} {
set Compiler::Settings::PAGELENGTH 5
- } elseif {${Compiler::Settings::PAGELENGTH} == 0} {
+ } elseif {${::Compiler::Settings::PAGELENGTH} == 0} {
set Compiler::Settings::PAGING 0
}
- if {${Compiler::Settings::PAGEWIDTH} < 68} {
+ if {${::Compiler::Settings::PAGEWIDTH} < 68} {
set Compiler::Settings::PAGEWIDTH 68
- } elseif {${Compiler::Settings::PAGEWIDTH} == 0} {
+ } elseif {${::Compiler::Settings::PAGEWIDTH} == 0} {
set Compiler::Settings::PAGEWIDTH 116
}
# Create page header
- set header ${Compiler::Settings::INPUT_FILE_NAME}
- set len [string length ${Compiler::Settings::INPUT_FILE_NAME}]
+ set header ${::Compiler::Settings::INPUT_FILE_NAME}
+ set len [string length ${::Compiler::Settings::INPUT_FILE_NAME}]
if {$len < 15} {
append header [string repeat { } [expr {15 - $len}]]
}
- append header { } ${Compiler::Settings::TITLE}
+ append header { } ${::Compiler::Settings::TITLE}
set len [string length $header]
incr len 23
# Adjust page header width
- if {$len > ${Compiler::Settings::PAGEWIDTH}} {
- set header [string range $header 0 [expr {${Compiler::Settings::PAGEWIDTH} - 24}]]
+ if {$len > ${::Compiler::Settings::PAGEWIDTH}} {
+ set header [string range $header 0 [expr {${::Compiler::Settings::PAGEWIDTH} - 24}]]
append header {... }
- } elseif {$len < ${Compiler::Settings::PAGEWIDTH}} {
- set len [expr {${Compiler::Settings::PAGEWIDTH} - $len}]
+ } elseif {$len < ${::Compiler::Settings::PAGEWIDTH}} {
+ set len [expr {${::Compiler::Settings::PAGEWIDTH} - $len}]
append header [string repeat { } $len]
}
# Create date
- set len [string length ${Compiler::Settings::DATE}]
+ set len [string length ${::Compiler::Settings::DATE}]
if {$len > 10} {
- set Compiler::Settings::DATE [string range 0 7 ${Compiler::Settings::DATE}]
+ set Compiler::Settings::DATE [string range 0 7 ${::Compiler::Settings::DATE}]
append Compiler::Settings::DATE {...}
} elseif {$len < 10} {
@@ -111,11 +116,11 @@ namespace eval CodeListing {
append Compiler::Settings::DATE [string repeat { } $len]
}
- append header ${Compiler::Settings::DATE} { PAGE}
+ append header ${::Compiler::Settings::DATE} { PAGE}
# Create error summary and symbol table
create_error_summary
- if {${Compiler::Settings::SYMBOLS}} {
+ if {${::Compiler::Settings::SYMBOLS}} {
create_symbol_table
}
@@ -129,7 +134,7 @@ namespace eval CodeListing {
append lst ", 1 ERROR FOUND"
} elseif {$errors_count > 1} {
append lst ", $errors_count ERRORS FOUND"
- } {
+ } else {
append lst ", NO ERRORS FOUND"
}
@@ -137,7 +142,7 @@ namespace eval CodeListing {
append lst ", 1 WARNING"
} elseif {$warnings_count > 1} {
append lst ", $warnings_count WARNINGS"
- } {
+ } else {
append lst ", NO WARNINGS"
}
@@ -151,7 +156,7 @@ namespace eval CodeListing {
}
# Symbol table
- if {${Compiler::Settings::SYMBOLS}} {
+ if {${::Compiler::Settings::SYMBOLS}} {
append lst "\n\n"
append lst $symbol_table
}
@@ -168,14 +173,14 @@ namespace eval CodeListing {
## Directive LIST
# @access public
- # @parm Int idx - index where the directive occured
+ # @parm Int idx - index where the directive occurred
# @return void
proc directive_list {idx} {
variable lst ;# Resulting LST code
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
- if {${Compiler::Settings::_list} != 0} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
+ if {${::Compiler::Settings::_list} != 0} {return}
# Adjust code listing
set idx [getIdx $idx]
@@ -185,14 +190,14 @@ namespace eval CodeListing {
## Directive NOLIST
# @access public
- # @parm Int idx - index where the directive occured
+ # @parm Int idx - index where the directive occurred
# @return void
proc directive_nolist {idx} {
variable lst ;# Resulting LST code
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
- if {${Compiler::Settings::_list} != 0} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
+ if {${::Compiler::Settings::_list} != 0} {return}
# Adjust code listing
set idx [getIdx $idx]
@@ -224,7 +229,7 @@ namespace eval CodeListing {
# @return void
proc create_listing {data} {
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
variable lst ;# Resulting LST code
variable sync_map ;# Map of lines in code listing
@@ -255,8 +260,8 @@ namespace eval CodeListing {
variable symbol_table ;# Table of symbolic names
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
- if {!${Compiler::Settings::SYMBOLS}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::SYMBOLS}} {return}
# Iterate over definition ists and write them to the table
foreach def_list {
@@ -271,14 +276,14 @@ namespace eval CodeListing {
} char {
B C D I
X C N S
- } {
-
+ } \
+ {
# Get list of defined names
- set def_list [subst "\$PreProcessor::$def_list"]
+ set def_list [subst -nocommands "\$PreProcessor::$def_list"]
# Write defined names to the table
foreach var $def_list {
- set value [subst "\$PreProcessor::${val_array}($var)"]
+ set value [subst -nocommands "\$PreProcessor::${val_array}($var)"]
# Handle special constants
if {$char == {S}} {
@@ -290,7 +295,7 @@ namespace eval CodeListing {
1 0]
# Other constants ...
- } {
+ } else {
lappend symbol_table [list \
[string toupper $var] \
$char \
@@ -302,14 +307,14 @@ namespace eval CodeListing {
}
# Write defined variables (directive "SET")
- foreach var ${PreProcessor::defined_SET} {
- set value [lindex $PreProcessor::const_SET($var) {end 1}]
+ foreach var ${::PreProcessor::defined_SET} {
+ set value [lindex $::PreProcessor::const_SET($var) {end 1}]
lappend symbol_table [list [string toupper $var] { } NUMB [get_4hex $value] 1 1]
}
# Write defined special variables (directive "SET")
- foreach var ${PreProcessor::defined_SET_SPEC} {
- set value [lindex $PreProcessor::const_SET_SPEC($var) {end 1}]
+ foreach var ${::PreProcessor::defined_SET_SPEC} {
+ set value [lindex $::PreProcessor::const_SET_SPEC($var) {end 1}]
lappend symbol_table [list [string toupper $var] {S} SPEC [string toupper $value] 1 1]
}
@@ -317,7 +322,7 @@ namespace eval CodeListing {
set symbol_table [lsort -index 0 $symbol_table]
}
- ## Set flag used to 1 for symbol writen in table of symbols
+ ## Set flag used to 1 for symbol written in table of symbols
# @access public
# @parm String symbolic_name - Symbol name
# @parm String type - Symbol type
@@ -326,8 +331,8 @@ namespace eval CodeListing {
variable symbol_table ;# Table of symbolic names
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
- if {!${Compiler::Settings::SYMBOLS}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::SYMBOLS}} {return}
# Find the specified symbol in the table
set symbolic_name [string toupper $symbolic_name]
@@ -348,19 +353,19 @@ namespace eval CodeListing {
## Write error message to the code listing
# @access public
- # @parm Int idx - Index where the error occured
+ # @parm Int idx - Index where the error occurred
# @parm String info - Error message
# @return void
proc Error {idx info} {
variable lst ;# Resulting LST code
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Adjust index
set idx [getIdx $idx]
if {$idx == {}} {
- puts stderr "Compiler internal failure 0 -- code listing will not be complete"
+ puts stderr "Assembler internal failure 0 -- code listing will not be complete"
return
}
incr idx
@@ -372,19 +377,19 @@ namespace eval CodeListing {
## Write warning message to the code listing
# @access public
- # @parm Int idx - Index where the warning occured
+ # @parm Int idx - Index where the warning occurred
# @parm String info - Warning message
# @return void
proc Warning {idx info} {
variable lst ;# Resulting LST code
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Adjust index
set idx [getIdx $idx]
if {$idx == {}} {
- puts stderr "Compiler internal failure 4 -- code listing will not be complete"
+ puts stderr "Assembler internal failure 4 -- code listing will not be complete"
return
}
incr idx
@@ -402,12 +407,12 @@ namespace eval CodeListing {
variable lst ;# Resulting LST code
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Adjust index
set idx [getIdx $idx]
if {$idx == {}} {
- puts stderr "Compiler internal failure 5 -- code listing will not be complete"
+ puts stderr "Assembler internal failure 5 -- code listing will not be complete"
return
}
incr idx 2
@@ -426,13 +431,14 @@ namespace eval CodeListing {
variable lst ;# Resulting LST code
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Determinate original values
set sub_idx [getIdx $idx]
+
if {$sub_idx != {}} {
set new_values [lindex $lst [list $sub_idx 1]]
- } {
+ } else {
set new_values {}
}
@@ -468,7 +474,7 @@ namespace eval CodeListing {
variable lst ;# Resulting LST code
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Create empty space in code listing
insert_lines $idx [llength $macro_code]
@@ -479,10 +485,10 @@ namespace eval CodeListing {
set tmp_lst {}
# Adjust Macro expansion level and Inclusion level
- set IncLevel [lindex $lst "$idx 3"]
- set MacLevel [lindex $lst "$idx 4"]
+ set IncLevel [lindex $lst [list $idx 3]]
+ set MacLevel [lindex $lst [list $idx 4]]
if {![regexp {^\d+$} $MacLevel]} {
- puts stderr "Compiler internal failure 1 -- code listing will not be complete"
+ puts stderr "Assembler internal failure 1 -- code listing will not be complete"
return
}
incr MacLevel
@@ -493,7 +499,7 @@ namespace eval CodeListing {
}
# Set macro expansion level
- lset lst "$idx 4" $MacLevel
+ lset lst [list $idx 4] $MacLevel
# Insert code of macro to the current code listing
incr idx
@@ -515,7 +521,7 @@ namespace eval CodeListing {
variable new_sync_map ;# Tempotary Map of lines in code listing
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Reformat synchronization map
set new_sync_map {}
@@ -545,7 +551,7 @@ namespace eval CodeListing {
variable lst ;# Resulting LST code
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Adjust code listing
set idx [getIdx $idx]
@@ -554,7 +560,7 @@ namespace eval CodeListing {
if {[catch {
lset lst [list $idx 1] $opcode
}]} then {
- puts stderr "Compiler internal failure 2 -- code listing will not be complete"
+ puts stderr "Assembler internal failure 2 -- code listing will not be complete"
return
}
}
@@ -569,15 +575,15 @@ namespace eval CodeListing {
variable sync_map ;# Map of lines in code listing
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Adjust code listing
set idx [getIdx $idx]
if {$idx == {}} {return}
if {[catch {
- lset lst "$idx 0" [get_4hex $addr]
+ lset lst [list $idx 0] [get_4hex $addr]
}]} then {
- puts stderr "Compiler internal failure 3 -- code listing will not be complete"
+ puts stderr "Assembler internal failure 3 -- code listing will not be complete"
return
}
}
@@ -585,13 +591,14 @@ namespace eval CodeListing {
## Directive "END"
# @access public
# @parm Int idx - Source index
+ # @parm Bool preserve_current_line=false - Do not remove the `$idx' line from the sync. map
# @return void
- proc end_directive {idx} {
+ proc end_directive {idx {preserve_current_line 0}} {
variable sync_map ;# Map of lines in code listing
variable lst ;# Resulting LST code
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Determinate target index
set lst_idx [getIdx $idx]
@@ -601,7 +608,12 @@ namespace eval CodeListing {
# Adjust code listing and synchronization map
set lst [lreplace $lst $lst_idx end]
- set sync_map [lreplace $sync_map $idx end]
+ if {$preserve_current_line} {
+ incr idx
+ }
+ if {$idx < [llength $sync_map]} {
+ set sync_map [lreplace $sync_map $idx end]
+ }
}
## Set value for symbol definition
@@ -613,14 +625,14 @@ namespace eval CodeListing {
variable lst ;# Resulting LST code
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Determinate target index
set idx [getIdx $idx]
if {$idx == {}} {return}
# Adjust code listing
- lset lst "$idx 2" [get_4hex $value]
+ lset lst [list $idx 2] [get_4hex $value]
}
## Set value for special symbol definition
@@ -642,7 +654,7 @@ namespace eval CodeListing {
variable lst ;# Resulting LST code
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Insert empty lines for the included code
insert_lines $idx [expr {[llength $data] - 1}]
@@ -651,8 +663,8 @@ namespace eval CodeListing {
set idx [getIdx $idx]
# Adjust macro expansion level and inclusion level
- set IncLevel [lindex $lst "$idx 3"]
- set MacLevel [lindex $lst "$idx 4"]
+ set IncLevel [lindex $lst [list $idx 3]]
+ set MacLevel [lindex $lst [list $idx 4]]
incr IncLevel
# Adjust the given source code
@@ -673,6 +685,12 @@ namespace eval CodeListing {
}
+ ## Get last index in the synchronization map
+ # @return Int - The index
+ proc get_last_index_in_sync_map {} {
+ return [expr {[llength ${::CodeListing::sync_map}] - 1}]
+ }
+
## Line removed -- adjust synchronization map
# @access public
# @parm Int idx - source index
@@ -681,24 +699,20 @@ namespace eval CodeListing {
variable sync_map ;# Map of lines in code listing
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
# Adjust synchronization map
- if {[catch {
- set sync_map [lreplace $sync_map $idx $idx]
- }]} {
- puts stderr "Still unresolved compiler bug. I am sorry for that, code listing will not be complete. (As far as I know there is only one bug of that kind)"
- }
+ set sync_map [lreplace $sync_map $idx $idx]
}
- ## Adjust synchronization map to create spece which cannot contain anything
+ ## Adjust synchronization map to create a space which cannot contain anything
# @access public
# @parm Int dest_idx - Target index
# @parm Int len - Number of lines
# @return void
proc insert_empty_lines {dest_idx len} {
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
variable sync_map ;# Map of lines in code listing
variable new_sync_map ;# Tempotary Map of lines in code listing
@@ -775,9 +789,9 @@ namespace eval CodeListing {
}
# Create new page if paging is enabled
- if {${Compiler::Settings::PAGING}} {
+ if {${::Compiler::Settings::PAGING}} {
incr pageLines
- if {$pageLines > ${Compiler::Settings::PAGELENGTH}} {
+ if {$pageLines > ${::Compiler::Settings::PAGELENGTH}} {
incr pageNum
set pageLines 1
append result "\n\f" $header { } $pageNum "\n\n"
@@ -798,7 +812,7 @@ namespace eval CodeListing {
incr lineNum -1
# Normal line
- } {
+ } else {
# Local variables
set addr [lindex $line 0] ;# Address field
set opcode [lindex $line 1] ;# Instruction OP code
@@ -810,7 +824,7 @@ namespace eval CodeListing {
# Adjust inclusion level
if {$IncLevel == 0} {
set IncLevel { }
- } {
+ } else {
set IncLevel "=$IncLevel"
if {[string length $IncLevel] == 2} {
append IncLevel { }
@@ -820,7 +834,7 @@ namespace eval CodeListing {
# Adjust macro expansion level
if {$MacLevel == 0} {
set MacLevel { }
- } {
+ } else {
set MacLevel "+$MacLevel"
if {[string length $MacLevel] == 2} {
append MacLevel { }
@@ -862,7 +876,7 @@ namespace eval CodeListing {
set line {}
append line $field0 { } $IncLevel { } $line_number
append line { } $MacLevel { } [tabs2spaces $code]
- append result [string range $line 0 [expr ${Compiler::Settings::PAGEWIDTH} - 1]] "\n"
+ append result [string range $line 0 [expr ${::Compiler::Settings::PAGEWIDTH} - 1]] "\n"
# Continue in unfinished opcode
if {$opcode_len > 10} {
@@ -887,7 +901,7 @@ namespace eval CodeListing {
# @return String - output data
proc tabs2spaces {data} {
set tmp {} ;# Auxiliary variable
- while 1 {
+ while {1} {
# Search for 1st tabulator
set idx [string first "\t" $data]
@@ -939,7 +953,7 @@ namespace eval CodeListing {
set error_summary {}
# Create new page
- if {${Compiler::Settings::PAGING}} {
+ if {${::Compiler::Settings::PAGING}} {
incr pageNum
set pageLines 0
append error_summary "\n\f" $header { } $pageNum "\n\n"
@@ -953,10 +967,10 @@ namespace eval CodeListing {
incr lineNum
# Create new page if nessesary
- if {${Compiler::Settings::PAGING}} {
+ if {${::Compiler::Settings::PAGING}} {
incr pageLines
- if {$pageLines > ${Compiler::Settings::PAGEWIDTH}} {
+ if {$pageLines > ${::Compiler::Settings::PAGEWIDTH}} {
incr pageNum
set pageLines 1
append error_summary "\n\f" $header { } $pageNum "\n\n"
@@ -968,7 +982,7 @@ namespace eval CodeListing {
if {[lindex $line {1 0}] == {ERROR:}} {
incr errors_count
- } {
+ } else {
incr warnings_count
}
@@ -992,7 +1006,7 @@ namespace eval CodeListing {
set result {}
# Create new page
- if {${Compiler::Settings::PAGING}} {
+ if {${::Compiler::Settings::PAGING}} {
incr pageNum
set pageLines 0
append result "\n\f" $header { } $pageNum "\n\n"
@@ -1006,10 +1020,10 @@ namespace eval CodeListing {
foreach var $symbol_table {
# Create new page if nessesary
- if {${Compiler::Settings::PAGING}} {
+ if {${::Compiler::Settings::PAGING}} {
incr pageLines
- if {$pageLines > ${Compiler::Settings::PAGEWIDTH}} {
+ if {$pageLines > ${::Compiler::Settings::PAGEWIDTH}} {
incr pageNum
set pageLines 1
append result "\n\f" $header { } $pageNum "\n\n"
@@ -1037,14 +1051,14 @@ namespace eval CodeListing {
# Adjust rd
if {$rd == 1} {
set rd {REDEFINABLE}
- } {
+ } else {
set rd {}
}
# Adjust nu
if {$nu == 1} {
set nu {NOT USED}
- } {
+ } else {
set nu { }
}
@@ -1056,7 +1070,7 @@ namespace eval CodeListing {
# Composite final line
if {$char != {S}} {
set h {H}
- } {
+ } else {
set nu { }
set h [string repeat { } [expr {5 - [string length $val]}]]
}
@@ -1105,7 +1119,7 @@ namespace eval CodeListing {
return $number
}
- ## Translate source index to target index acording to synchronization map
+ ## Translate source index to target index according to synchronization map
# @access private
# @parm Int idx - Source index
# @return Int - target index
@@ -1126,7 +1140,7 @@ namespace eval CodeListing {
# @return void
proc insert_lines {dest_idx len} {
# Check if code listing is enabled
- if {!${Compiler::Settings::PRINT}} {return}
+ if {!${::Compiler::Settings::PRINT}} {return}
if {$len == 0} {return}
variable sync_map ;# Map of lines in code listing
@@ -1167,3 +1181,7 @@ namespace eval CodeListing {
set sync_map $new_sync_map
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/compiler/compiler.tcl b/lib/compiler/compiler.tcl
index 35dea32..932e67a 100755..100644
--- a/lib/compiler/compiler.tcl
+++ b/lib/compiler/compiler.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,20 +21,25 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _COMPILER_TCL ] } {
+set _COMPILER_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# 8051 COMPILER - BASE NAMESPACE
# --------------------------------------------------------------------------
# Include other parts
source "${::LIB_DIRNAME}/compiler/codelisting.tcl" ;# Code listing creator
-source "${::LIB_DIRNAME}/compiler/assembler.tcl" ;# Assemler
+source "${::LIB_DIRNAME}/compiler/assembler.tcl" ;# Assembler
source "${::LIB_DIRNAME}/compiler/disassembler.tcl" ;# Disassembler
source "${::LIB_DIRNAME}/compiler/preprocessor.tcl" ;# Preprocessor
source "${::LIB_DIRNAME}/compiler/compilerconsts.tcl" ;# Compiler constant definitons
source "${::LIB_DIRNAME}/compiler/external_compiler.tcl";# External compiler interface
namespace eval Compiler {
- variable error_count ;# Number of errors occured during compilation
+ variable error_count ;# Number of errors occurred during compilation
variable warning_count ;# Number of warning reported during compilation
variable in_IDE 0 ;# Bool: Running in IDE (I mean GUI)
@@ -46,10 +51,10 @@ namespace eval Compiler {
# @parm String project_dir - Project directory
# @parm String current_dir - Current working directory
# @parm String input_file_name - Name of input source code
- # @parm String input_file_extension = {} - Extension of input file
+ # @parm String input_file_extension={} - Extension of input file
# @return Bool - result
- proc compile {project_dir current_dir input_file_name input_file_extension} {
- variable error_count ;# Number of errors occured during compilation
+ proc compile {project_dir current_dir input_file_name {input_file_extension {}}} {
+ variable error_count ;# Number of errors occurred during compilation
variable warning_count ;# Number of warning reported during compilation
# Compiler settings to defaults
@@ -58,12 +63,12 @@ namespace eval Compiler {
# Adjust compiler settings
if {${::Compiler::Settings::_print} == 2} {
set ::Compiler::Settings::PRINT 0
- } {
+ } else {
set ::Compiler::Settings::PRINT 1
}
if {${::Compiler::Settings::_object} == 2} {
set ::Compiler::Settings::OBJECT 0
- } {
+ } else {
set ::Compiler::Settings::OBJECT 1
}
@@ -88,13 +93,13 @@ namespace eval Compiler {
set asm [open $file r]
set asm_data [read $asm]
close $asm
- }]} {
+ }]} then {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Unable to open the specified file. (%s)" $file]
- ${Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Compilation FAILED !"]
- } {
- ${Settings::TEXT_OUPUT_COMMAND} [mc "Unable to open the specified file. (\033\[34;1m%s\033\[m)" $file]
- ${Settings::TEXT_OUPUT_COMMAND} [mc "\033\[31;1mCompilation FAILED !\033\[m"]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Unable to open the specified file. (%s)" $file]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Compilation FAILED !"]
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Unable to open the specified file. (\033\[34;1m%s\033\[m)" $file]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\033\[31;1mCompilation FAILED !\033\[m"]
}
return 0
}
@@ -102,34 +107,34 @@ namespace eval Compiler {
# Initialize preprocessor
if {!${::Compiler::Settings::QUIET}} {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
"\n\n[::Compiler::msgc {SN}][mc {Compiling file: %s} $input_file_name$input_file_extension]"
- } {
- ${Settings::TEXT_OUPUT_COMMAND} \
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\n\nCompiling file: \033\[34;1m%s\033\[m" $input_file_name$input_file_extension]
}
- ${Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "Initializing pre-processor ..."]
}
set precompiledCode [PreProcessor::compile $current_dir $file $asm_data]
set asm_data {}
- incr error_count ${PreProcessor::error_count}
- incr warning_count ${PreProcessor::warning_count}
- if {${PreProcessor::error_count} > 0} {
+ incr error_count ${::PreProcessor::error_count}
+ incr warning_count ${::PreProcessor::warning_count}
+ if {${::PreProcessor::error_count} > 0} {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Pre-processing FAILED !"]
- } {
- ${Settings::TEXT_OUPUT_COMMAND} [mc "\033\[31;1mPre-processing FAILED !\033\[m"]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Pre-processing FAILED !"]
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\033\[31;1mPre-processing FAILED !\033\[m"]
}
report_status $current_dir $input_file_name
return 0
}
- if {${Settings::ABORT_VARIABLE}} {return 0}
+ if {${::Compiler::Settings::ABORT_VARIABLE}} {return 0}
# Initialize Assembler
if {!${::Compiler::Settings::QUIET}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Compiling ..."]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Compiling ..."]
}
assembler::compile \
[md5::md5 -hex -file $file] \
@@ -139,152 +144,152 @@ namespace eval Compiler {
${::PreProcessor::included_files} \
$precompiledCode
set ::PreProcessor::included_files {}
- incr error_count ${assembler::error_count}
- if {${assembler::error_count} > 0} {
+ incr error_count ${::assembler::error_count}
+ if {${::assembler::error_count} > 0} {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Compilation FAILED !"]
- } {
- ${Settings::TEXT_OUPUT_COMMAND} [mc "\033\[31;1mCompilation FAILED !\033\[m"]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Compilation FAILED !"]
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\033\[31;1mCompilation FAILED !\033\[m"]
}
report_status $current_dir $input_file_name
return 0
}
- if {${Settings::ABORT_VARIABLE}} {return 0}
+ if {${::Compiler::Settings::ABORT_VARIABLE}} {return 0}
# Write resulting object code
- if {${Settings::OBJECT}} {
- if {${Settings::OBJECT_FILE} != {}} {
- set object_file ${Settings::OBJECT_FILE}
- } {
+ if {${::Compiler::Settings::OBJECT}} {
+ if {${::Compiler::Settings::OBJECT_FILE} != {}} {
+ set object_file ${::Compiler::Settings::OBJECT_FILE}
+ } else {
set object_file $input_file_name
append object_file {.hex}
}
if {${::Compiler::Settings::NOCOLOR}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "Creating IHEX8 ...\t\t\t-> \"%s\"" $object_file]
- } {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "Creating IHEX8 ...\t\t\t-> \"\033\[34;1m%s\033\[m\"" $object_file]
}
makeBackupFile $current_dir $object_file
if {[catch {
- set hex [open [file join $current_dir $object_file] w 420]
- }]} {
+ set hex [open [file join $current_dir $object_file] w 0640]
+ }]} then {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {EN}][mc "Error: Unable to open file \"%s\" for writing" [file join $current_dir $object_file]]
- ${Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {EN}][mc "Compilation FAILED !"]
- } {
- ${Settings::TEXT_OUPUT_COMMAND} \
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\033\[31;1mError\033\[m: Unable to open file \"\033\[34;1m%s\033\[m\" for writing" [file join $current_dir $object_file]]
- ${Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\033\[31;1mCompilation FAILED !\033\[m"]
}
report_status $current_dir $input_file_name
return 0
} else {
- puts -nonewline $hex ${assembler::hex}
+ puts -nonewline $hex ${::assembler::hex}
close $hex
}
}
- if {${Settings::ABORT_VARIABLE}} {return 0}
+ if {${::Compiler::Settings::ABORT_VARIABLE}} {return 0}
# Write resulting binary object code
- if {${Settings::CREATE_BIN_FILE}} {
+ if {${::Compiler::Settings::CREATE_BIN_FILE}} {
if {!${::Compiler::Settings::QUIET}} {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "Creating object file ...\t\t-> \"%s\"" "${input_file_name}.bin"]
- } {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "Creating object file ...\t\t-> \"\033\[34;1m%s\033\[m\"" "${input_file_name}.bin"]
}
}
makeBackupFile $current_dir "${input_file_name}.bin"
if {[catch {
- set bin [open [file join $current_dir $input_file_name.bin] w 420]
- }]} {
+ set bin [open [file join $current_dir $input_file_name.bin] w 0640]
+ }]} then {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {EN}][mc "Error: Unable to open file \"%s\" for writing" [file join $current_dir $input_file_name.bin]]
- ${Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {EN}][mc "Compilation FAILED !"]
- } {
- ${Settings::TEXT_OUPUT_COMMAND} \
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "Error: Unable to open file \"\033\[34;1m%s\033\[m\" for writing" [file join $current_dir "${input_file_name}.bin"]]
- ${Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\033\[31;1mCompilation FAILED !\033\[m"]
}
report_status $current_dir $input_file_name
return 0
} else {
fconfigure $bin -translation binary
- puts -nonewline $bin ${assembler::bin}
+ puts -nonewline $bin ${::assembler::bin}
close $bin
}
set bin_data {}
}
set hex_data {}
- if {${Settings::ABORT_VARIABLE}} {return 0}
+ if {${::Compiler::Settings::ABORT_VARIABLE}} {return 0}
# Write simulator data file
- if {${Settings::CREATE_SIM_FILE}} {
+ if {${::Compiler::Settings::CREATE_SIM_FILE}} {
if {!${::Compiler::Settings::QUIET}} {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "Creating assembler debug file ...\t-> \"%s\"" "${input_file_name}.adf"]
- } {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "Creating simulator data file ...\t-> \"\033\[34;1m%s\033\[m\"" "${input_file_name}.adf"]
}
}
makeBackupFile $current_dir "${input_file_name}.adf"
if {[catch {
- set sim [open [file join $current_dir $input_file_name.adf] w 420]
- }]} {
+ set sim [open [file join $current_dir $input_file_name.adf] w 0640]
+ }]} then {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Settings::TEXT_OUPUT_COMMAND} \
- [::Compiler::msgc {EN}][mc "Error: Unable to open file \"%s]\" for writing" [file join $current_dir $input_file_name.adf]
- ${Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ [::Compiler::msgc {EN}][mc "Error: Unable to open file \"%s]\" for writing" [file join $current_dir $input_file_name.adf]]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {EN}][mc "Compilation FAILED !"]
- } {
- ${Settings::TEXT_OUPUT_COMMAND} \
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\033\[31;1mError\033\[m: Unable to open file \"\033\[34;1m%s\033\[m\" for writing" [file join $current_dir $input_file_name.adf]]
- ${Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\033\[31;1mCompilation FAILED !\033\[m"]
}
report_status $current_dir $input_file_name
return 0
- } {
- puts -nonewline $sim ${assembler::adf}
+ } else {
+ puts -nonewline $sim ${::assembler::adf}
close $sim
}
}
- if {${Settings::ABORT_VARIABLE}} {return 0}
+ if {${::Compiler::Settings::ABORT_VARIABLE}} {return 0}
# Report final status
report_status $current_dir $input_file_name
if {!${::Compiler::Settings::QUIET}} {
if {${::Compiler::Settings::optim_ena}} {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
- [mc "Number of optimalizations performed: %s" ${::PreProcessor::optims}]
- } {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
- [mc "Number of optimalizations performed: \033\[1m%s\033\[m" ${::PreProcessor::optims}]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ [mc "Number of optimization performed: %s" ${::PreProcessor::optims}]
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ [mc "Number of optimization performed: \033\[1m%s\033\[m" ${::PreProcessor::optims}]
}
}
if {${::Compiler::Settings::NOCOLOR}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {SN}][mc "Compilation successful. (time: %s sec.)" [expr {[clock seconds] - $sec}]]
- } {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\033\[32;1mCompilation successful.\033\[m (time: %s sec.)" [expr {[clock seconds] - $sec}]]
}
}
@@ -307,25 +312,25 @@ namespace eval Compiler {
# @parm String input_file_name - Name of input file
# @return void
proc report_status {current_dir input_file_name} {
- variable error_count ;# Number of errors occured during compilation
+ variable error_count ;# Number of errors occurred during compilation
variable warning_count ;# Number of warning reported during compilation
# Determinate name of code listing file
- if {${Settings::PRINT_FILE} != {}} {
- set print_file ${Settings::PRINT_FILE}
- } {
+ if {${::Compiler::Settings::PRINT_FILE} != {}} {
+ set print_file ${::Compiler::Settings::PRINT_FILE}
+ } else {
set print_file $input_file_name
append print_file {.lst}
}
- # Message "Creting code listing file"
- if {!${::Compiler::Settings::QUIET}} {
+ # Message "Creating code listing file"
+ if {!${::Compiler::Settings::QUIET} && ${::Compiler::Settings::PRINT}} {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
- [mc "Creting code listing file ...\t\t-> \"%s\"" $print_file]
- } {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
- [mc "Creting code listing file ...\t\t-> \"\033\[34;1m%s\033\[m\"" $print_file]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ [mc "Creating code listing file ...\t\t-> \"%s\"" $print_file]
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ [mc "Creating code listing file ...\t\t-> \"\033\[34;1m%s\033\[m\"" $print_file]
}
}
@@ -333,7 +338,7 @@ namespace eval Compiler {
if {!${::Compiler::Settings::QUIET}} {
if {$::TRANSLATION_LOADED} {
set text [mc "%s errors, %s warnings" $error_count $warning_count]
- } {
+ } else {
set text "$error_count error"
if {$error_count != 1} {
append text "s"
@@ -344,30 +349,32 @@ namespace eval Compiler {
}
}
if {${::Compiler::Settings::NOCOLOR}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} $text
- } {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} "\033\[1m$text\033\[m"
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} $text
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} "\033\[1m$text\033\[m"
}
}
# Write code listing file
- makeBackupFile $current_dir $print_file
- if {[catch {
- set lst [open [file join $current_dir $print_file] w 420]
- }]} {
- if {${::Compiler::Settings::NOCOLOR}} {
- ${Settings::TEXT_OUPUT_COMMAND} \
- [::Compiler::msgc {EN}][mc "Error: Unable to open file \"%s\" for writing" [file join $current_dir $print_file]]
- ${Settings::TEXT_OUPUT_COMMAND} [mc "Compilation FAILED !"]
- } {
- ${Settings::TEXT_OUPUT_COMMAND} \
- [::Compiler::msgc {EN}][mc "Error: Unable to open file \"\033\[34;1m%s\033\[m\" for writing" [file join $current_dir $print_file]]
- ${Settings::TEXT_OUPUT_COMMAND} [mc "\033\[31;1mCompilation FAILED !\033\[m"]
+ if {${::Compiler::Settings::PRINT}} {
+ makeBackupFile $current_dir $print_file
+ if {[catch {
+ set lst [open [file join $current_dir $print_file] w 0640]
+ }]} then {
+ if {${::Compiler::Settings::NOCOLOR}} {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ [::Compiler::msgc {EN}][mc "Error: Unable to open file \"%s\" for writing" [file join $current_dir $print_file]]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Compilation FAILED !"]
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ [::Compiler::msgc {EN}][mc "Error: Unable to open file \"\033\[34;1m%s\033\[m\" for writing" [file join $current_dir $print_file]]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\033\[31;1mCompilation FAILED !\033\[m"]
+ }
+ return 0
+ } else {
+ puts -nonewline $lst [CodeListing::getListing]
+ close $lst
}
- return 0
- } else {
- puts -nonewline $lst [CodeListing::getListing]
- close $lst
}
}
@@ -388,7 +395,7 @@ namespace eval Compiler {
## Namespace containing compiler settings
namespace eval Settings {
- ## Peerhole optimalization enable flag
+ ## Peephole optimization enable flag
variable optim_ena 0 ;# Bool: 0 == disabled; 1 == enabled
## Memory limits
@@ -500,8 +507,9 @@ namespace eval Compiler {
} default {
_nomod_value _paging_value _pagelength_value _pagewidth_value
_title_value _date_value _object_file _print_file
- } {
- set $var [subst "\$$default"]
+ } \
+ {
+ set $var [subst -nocommands "\$$default"]
}
# Finalize
@@ -555,3 +563,7 @@ namespace eval Compiler {
# Compiler settings to defaults
Compiler::Settings::restoreDefaults
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/compiler/compilerconsts.tcl b/lib/compiler/compilerconsts.tcl
index 175ceb9..e8a71f4 100755..100644
--- a/lib/compiler/compilerconsts.tcl
+++ b/lib/compiler/compilerconsts.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 _COMPILERCONSTS_TCL ] } {
+set _COMPILERCONSTS_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Defines compiler constatnts. This code is part of Compiler
@@ -67,11 +72,18 @@ namespace eval CompilerConsts {
}
# All compiler directives
variable AllDirectives {
- bit set equ code data
- xdata idata bseg dseg iseg
- xseg ds dbit cseg db
- dw include list nolist
+ endif endm end else exitm
+ list nolist dseg iseg bseg
+ xseg cseg skip name equ
+ bit set code data idata
+ xdata macro flag ds dw
+ db dbit include org if
+ using byte name rept times
+ elseif ifn elseifn ifdef elseifdef
+ ifndef elseifndef ifb elseifb
+ ifnb elseifnb local
}
+
# Addresses of SFR registers
variable MapOfSFRArea {
{P0 80} {SP 81} {DPL 82} {DPH 83}
@@ -146,7 +158,7 @@ namespace eval CompilerConsts {
# Format:
# {
# {Instruction} {Operands_count
- # {{Operand_type_0 Operand_type_1 ...} Code_length Opcode Opcode_mask Instr_cycles_per_iteration}
+ # {{Operand_type_0 Operand_type_1 ...} Code_length Opcode Opcode_mask Machine_cycles_per_iteration}
# ...
# }
# ...
@@ -705,9 +717,10 @@ namespace eval CompilerConsts {
MapOfSFRArea
MapOfSFRBitArea
progVectors
- } {
+ } \
+ {
variable $var
- set val [subst "\$$var"]
+ set val [subst -nocommands "\$$var"]
regsub -all {\s+} $val { } $var
}
@@ -743,6 +756,7 @@ namespace eval CompilerConsts {
incr def_idx
# Local variables
+ set time [lindex $code_def 4] ;# Time
set mask [lindex $code_def 3] ;# OP code mask
set opcode [lindex $code_def 2] ;# OP code
set len [lindex $code_def 1] ;# Code length
@@ -777,10 +791,10 @@ namespace eval CompilerConsts {
continue
}
lappend defined_OPCODE $opcode
- set Opcode($opcode) "$instruction {$operands} $len {}"
+ set Opcode($opcode) [list $instruction $operands $len {} $time]
}
# Non-zero OP code mask
- } {
+ } else {
# Translate OP code and its mask to list of booleans
set opcode [assembler::hex2binlist $opcode]
set mask [assembler::hex2binlist $mask]
@@ -808,7 +822,7 @@ namespace eval CompilerConsts {
}
# Determinate list of possible high-order values
- # of opreands acording to the mask
+ # of opreands according to the mask
set values {}
set tmp 0
set tmp_len 0
@@ -832,7 +846,7 @@ namespace eval CompilerConsts {
if {$mask_bit} {
append tmp [string index $val $idx]
incr idx
- } {
+ } else {
append tmp $opcode_bit
}
}
@@ -860,7 +874,7 @@ namespace eval CompilerConsts {
continue
}
lappend defined_OPCODE $opcode
- set Opcode($opcode) [list $instruction $operands $len $masked_opr]
+ set Opcode($opcode) [list $instruction $operands $len $masked_opr $time]
}
}
@@ -871,3 +885,7 @@ namespace eval CompilerConsts {
# Initialize NS variables
CompilerConsts::initialize
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/compiler/disassembler.tcl b/lib/compiler/disassembler.tcl
index b74fedf..6319c1e 100755..100644
--- a/lib/compiler/disassembler.tcl
+++ b/lib/compiler/disassembler.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 _DISASSEMBLER_TCL ] } {
+set _DISASSEMBLER_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# Disassembler 8051
#
@@ -46,8 +51,8 @@ namespace eval disassembler {
variable hex_data {} ;# Raw input data
variable hex {} ;# Adjusted input data, list: {addr hex0 hex1 hex2 ...}
variable lineNum {} ;# Number of line currently beeing parsed
- variable error_count {} ;# Number of errors raised during decompilation
- variable warning_count {} ;# Number of warnings occured
+ variable error_count {} ;# Number of errors raised during disassembly
+ variable warning_count {} ;# Number of warnings occurred
variable label_idx {} ;# Label index
variable final_lbls 0 ;# Number of final labels
variable label ;# Array of tempotary labels, label(int) -> addr
@@ -58,7 +63,7 @@ namespace eval disassembler {
# GENERAL PURPOSE PROCEDURES
# ----------------------------------------------------------------
- ## Initiate decompilation
+ ## Initiate disassembly
# @parm string data - Input IHEX8 code
# @return string - output asm code or {}
proc compile {data} {
@@ -66,8 +71,8 @@ namespace eval disassembler {
variable hex_data ;# Raw input
variable hex ;# Adjusted input data, list: {addr hex0 hex1 hex2 ...}
variable lineNum ;# Number of line currently beeing parsed
- variable error_count ;# Number of errors raised during decompilation
- variable warning_count ;# Number of warnings occured
+ variable error_count ;# Number of errors raised during disassembly
+ variable warning_count ;# Number of warnings occurred
variable asm ;# Resulting source code
set error_count 0 ;# reset errors count
@@ -79,7 +84,7 @@ namespace eval disassembler {
regexp -all {\r\n?} hex_data "\n" hex_data
set hex_data [split $hex_data "\n"]
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {SN}][mc "Initializing disassembler ..."]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {SN}][mc "Initializing disassembler ..."]
# Verify input code validity and set variable 'hex'
adjust_code
@@ -87,17 +92,17 @@ namespace eval disassembler {
# Exit if the code does not seem to be valid
if {$error_count != 0} {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {EN}][mc "Disassembly FAILED ..."]
- } {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {EN}][mc "\033\[31;1mDisassembly FAILED\033\[m ..."]
}
return {}
}
- if {${Compiler::Settings::ABORT_VARIABLE}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Aborted"]
+ if {${::Compiler::Settings::ABORT_VARIABLE}} {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Aborted"]
free_resources
return {}
}
@@ -105,8 +110,8 @@ namespace eval disassembler {
# Convert processor code into asm code
decompile_code
- if {${Compiler::Settings::ABORT_VARIABLE}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}[mc "Aborted"]
+ if {${::Compiler::Settings::ABORT_VARIABLE}} {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Aborted"]
free_resources
return {}
}
@@ -114,8 +119,8 @@ namespace eval disassembler {
# Create labels in resulting code
parse_labels
- if {${Compiler::Settings::ABORT_VARIABLE}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Aborted"]
+ if {${::Compiler::Settings::ABORT_VARIABLE}} {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Aborted"]
free_resources
return {}
}
@@ -123,26 +128,26 @@ namespace eval disassembler {
# Final stage
final_stage
- if {${Compiler::Settings::ABORT_VARIABLE}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Aborted"]
+ if {${::Compiler::Settings::ABORT_VARIABLE}} {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Aborted"]
free_resources
return {}
}
- # Free memory used during decompilation
+ # Free memory used during disassembly
free_resources
- if {${Compiler::Settings::ABORT_VARIABLE}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Aborted"]
+ if {${::Compiler::Settings::ABORT_VARIABLE}} {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EN}][mc "Aborted"]
free_resources
return {}
}
if {${::Compiler::Settings::NOCOLOR}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {SN}][mc "Disassembly complete"]
- } {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} \
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\033\[32;1mDisassembly complete\033\[m"]
}
@@ -167,7 +172,9 @@ namespace eval disassembler {
foreach line $hex_data {
- if {[expr {$lineNum % 10}] == 0} ${Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$lineNum % 10}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
incr lineNum ;# line number
@@ -209,7 +216,7 @@ namespace eval disassembler {
set len [expr "0x$len"]
set data [string range $line 8 {end-2}]
if {$len != ([string length $data] / 2)} {
- Error $lineNum [mc "Length field do not corespond true data length"]
+ Error $lineNum [mc "Length field do not correspond true data length"]
continue
}
@@ -217,11 +224,11 @@ namespace eval disassembler {
set addr_hex [string range $line 2 5]
set addr [expr "0x$addr_hex"]
if {$addr <= $pointer} {
- Error $lineNum [mc "Unexpected address -- code is not well formated"]
+ Error $lineNum [mc "Unexpected address -- code is not well formatted"]
continue
} elseif {$addr > ($pointer + 1)} {
set pointer $addr
- } {
+ } else {
incr pointer $len
}
@@ -262,7 +269,9 @@ namespace eval disassembler {
foreach line $hex {
- if {[expr {$idx % 10}] == 0} ${Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 10}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
incr idx
@@ -276,7 +285,7 @@ namespace eval disassembler {
if {$trailing_data_length} {
# Write trailing data
foreach opcode $trailing_data {
- append asm "_$pointer {DB 0${opcode}h {}} "
+ lappend asm _$pointer [list {DB} "0${opcode}h" {}]
incr pointer
}
# Reset trailing data
@@ -286,7 +295,7 @@ namespace eval disassembler {
# Adjust pointer
set pointer $addr_dec
- append asm "{} {} {} {ORG [HEX $addr]h {}} "
+ lappend asm {} {} {} [list {ORG} "[HEX $addr]h" {}]
}
# Number of data fields
@@ -295,7 +304,7 @@ namespace eval disassembler {
# Append trailing data from last parsing to the current line
if {$trailing_data_length} {
# append
- incr len $trailing_data_length
+ incr len $trailing_data_length
set line [concat $trailing_data $line]
# reset
set trailing_data_length 0
@@ -310,13 +319,13 @@ namespace eval disassembler {
set opcode [lindex $line $idx] ;# current opcode
# Search for he given opcode
- if {[lsearch ${CompilerConsts::defined_OPCODE} $opcode] == -1} {
+ if {[lsearch ${::CompilerConsts::defined_OPCODE} $opcode] == -1} {
# opcode not found -> write opcode directly to source code
- append asm "_$pointer {DB 0${opcode}h {}} "
+ lappend asm "_$pointer" [list {DB} "0${opcode}h" {}]
set length 1
} else {
# opcode found -> resolve it's definition
- set def $CompilerConsts::Opcode($opcode)
+ set def $::CompilerConsts::Opcode($opcode)
set instruction [lindex $def 0] ;# Instruction name
set opr_types [lindex $def 1] ;# Oprand types
@@ -338,15 +347,15 @@ namespace eval disassembler {
set opr {}
foreach type $opr_types {
- if {[lsearch ${CompilerConsts::FixedOperands} [string tolower $type]] != -1} {
+ if {[lsearch ${::CompilerConsts::FixedOperands} [string tolower $type]] != -1} {
# Fixed operand -> only copy
set opr $type
- } {
+ } else {
# Get operand value
incr idx
if {$idx > $len} {
- append asm "_$pointer {DB 0${opcode}h {}} "
+ lappend asm "_$pointer" [{DB} "0${opcode}h" {}]
set instruction_skipped 1
set length 1
incr idx -1
@@ -361,7 +370,7 @@ namespace eval disassembler {
incr idx
if {$idx > $len} {
- append asm "_$pointer {DB 0${opcode}h {}} "
+ lappend asm "_$pointer" [list {DB} "0${opcode}h" {}]
set instruction_skipped 1
set length 1
incr idx -2
@@ -373,7 +382,7 @@ namespace eval disassembler {
set opr "[HEX [lindex $line $idx]]h"
set tmp_opr [string range $opr 0 {end-1}]
set tmp_opr [expr "0x$tmp_opr"]
- foreach item ${CompilerConsts::MapOfSFRBitArea} {
+ foreach item ${::CompilerConsts::MapOfSFRBitArea} {
if {[expr "0x[lindex $item 1]"] == $tmp_opr} {
set opr [lindex $item 0]
break
@@ -384,7 +393,7 @@ namespace eval disassembler {
set opr "/[HEX [lindex $line $idx]]h"
set tmp_opr [string range $opr 1 {end-1}]
set tmp_opr [expr "0x$tmp_opr"]
- foreach item ${CompilerConsts::MapOfSFRBitArea} {
+ foreach item ${::CompilerConsts::MapOfSFRBitArea} {
if {[expr "0x[lindex $item 1]"] == $tmp_opr} {
set opr [lindex $item 0]
break
@@ -395,7 +404,7 @@ namespace eval disassembler {
set opr "[HEX [lindex $line $idx]]h"
set tmp_opr [string range $opr 0 {end-1}]
set tmp_opr [expr "0x$tmp_opr"]
- foreach item ${CompilerConsts::MapOfSFRArea} {
+ foreach item ${::CompilerConsts::MapOfSFRArea} {
if {[expr "0x[lindex $item 1]"] == $tmp_opr} {
set opr [lindex $item 0]
break
@@ -417,7 +426,7 @@ namespace eval disassembler {
if {$label($label_idx) > 0x0FFFF || $label($label_idx) < 0} {
set label($label_idx) [expr {$label($label_idx) & 0x0FFFF}]
- Warning "Code address overflow, instruction: $instruction"
+ Warning [mc "Code address overflow, instruction: %s" $instruction]
} elseif {$label($label_idx) == $pointer} {
unset label($label_idx)
incr label_idx -1
@@ -429,6 +438,7 @@ namespace eval disassembler {
set opr "lbl${label_idx}-"
set label($label_idx) "$mask_opr[lindex $line $idx]"
set label($label_idx) [expr "0x$label($label_idx)"]
+ set label($label_idx) [expr {($label($label_idx) & 0x007ff) | ($pointer & 0x0f800)}]
if {$label($label_idx) == $pointer} {
unset label($label_idx)
@@ -443,7 +453,7 @@ namespace eval disassembler {
incr idx
if {$idx > $len} {
- append asm "_$pointer {DB 0${opcode}h {}} "
+ lappend asm "_$pointer" [list {DB} "0${opcode}h" {}]
set length 1
incr idx -2
set instruction_skipped 1
@@ -471,8 +481,17 @@ namespace eval disassembler {
continue
}
+ # Swap operands in case if of instruction "MOV data, data"
+ if {
+ $instruction == {mov} &&
+ [lindex $opr_types 0] == {data} &&
+ [lindex $opr_types 1] == {data}
+ } then {
+ set operands [list [lindex $operands 1] [lindex $operands 0]]
+ }
+
# Append line to source code list
- append asm "_$pointer {$instruction {$operands} {}} "
+ lappend asm "_$pointer" [list $instruction $operands {}]
}
# Increment program address pointer
incr pointer $length
@@ -501,7 +520,7 @@ namespace eval disassembler {
if {$idx != -1} {
# Reuse an existing label
regsub -all "lbl${i}-" $asm "label$idx" asm
- } {
+ } else {
# Realy a new label
lappend addrs $label($i)
incr lbl_idx
@@ -517,7 +536,7 @@ namespace eval disassembler {
if {$idx == -1} {
# Not found
append equ_block "{} {CODE [HEX [format %X $addr]]h label$i} "
- } {
+ } else {
# Found
incr idx
lset asm [list $idx 2] "label$i"
@@ -544,7 +563,9 @@ namespace eval disassembler {
# Rewrite the source code
for {set i 1} {$i <= $len} {incr i 2} {
- if {[expr {$len % 5}] == 0} ${Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$len % 5}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
set line [lindex $asm $i] ;# Get line
@@ -554,7 +575,7 @@ namespace eval disassembler {
continue
# Not an empty line
- } {
+ } else {
set label [lindex $line 2] ;# label
set instr [lindex $line 0] ;# instruction
set oprs [lindex $line 1] ;# oprands
@@ -589,7 +610,7 @@ namespace eval disassembler {
variable hex_data ;# Raw input data
variable hex ;# Adjusted input data, list: {addr hex0 hex1 hex2 ...}
variable lineNum ;# Number of line currently beeing parsed
- variable error_count ;# Number of errors raised during decompilation
+ variable error_count ;# Number of errors raised during disassembly
variable label_idx ;# Label index
variable label ;# Array of tempotary labels, label(int) -> addr
variable asm ;# Resulting source code
@@ -620,12 +641,12 @@ namespace eval disassembler {
}
## Report warning message
- # @parm Int LineNumber - Number of line where it occured
+ # @parm Int LineNumber - Number of line where it occurred
# @parm String ErrorInfo - Text of the warning
# @return void
proc Warning {ErrorInfo} {
variable idx ;# Current position in asm list
- variable warning_count ;# Number of warnings occured
+ variable warning_count ;# Number of warnings occurred
# Increment warning counter
incr warning_count
@@ -633,32 +654,36 @@ namespace eval disassembler {
# Report the warning
if {${::Compiler::Settings::WARNING_LEVEL} < 2} {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {WN}][mc "Warning: %s" $ErrorInfo]
- } {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\033\[33mWarning\033\[m: %s" $ErrorInfo]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {WN}][mc "Warning: %s" $ErrorInfo]
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\033\[33mWarning\033\[m: %s" $ErrorInfo]
}
}
}
## Error
- # @parm Int lineNumber - number of line, where the error occured
+ # @parm Int lineNumber - number of line, where the error occurred
# @parm String info - error string
proc Error {lineNumber info} {
variable error_count
incr error_count
if {$lineNumber != {}} {
if {${::Compiler::Settings::NOCOLOR}} {
- set lineNumber [mc " at line %s" $lineNumber]
- } {
- set lineNumber [mc " at line \033\[31;1;4m%s\033\[m" $lineNumber]
+ set lineNumber [mc " at %s" $lineNumber]
+ } else {
+ set lineNumber [mc " at \033\[31;1;4m%s\033\[m" $lineNumber]
}
}
if {${::Compiler::Settings::WARNING_LEVEL} < 3} {
if {${::Compiler::Settings::NOCOLOR}} {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EL}][mc "Error%s: %s" $lineNumber $info]
- } {
- ${Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\033\[31;1mError%s\033\[m: %s" $lineNumber $info]
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [::Compiler::msgc {EL}][mc "Error%s: %s" $lineNumber $info]
+ } else {
+ ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\033\[31;1mError%s\033\[m: %s" $lineNumber $info]
}
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/compiler/external_compiler.tcl b/lib/compiler/external_compiler.tcl
index 3cf581b..5d8c6b2 100755..100644
--- a/lib/compiler/external_compiler.tcl
+++ b/lib/compiler/external_compiler.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 _EXTERNAL_COMPILER_TCL ] } {
+set _EXTERNAL_COMPILER_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements interface to external compilers
@@ -163,7 +168,7 @@ namespace eval ExternalCompiler {
variable sdcc_string_options_def {
model --model-small
standard --std-sdcc89
- stack --pack-iram
+ stack {}
custom {}
}
# Current SDCC string options
@@ -192,6 +197,16 @@ namespace eval ExternalCompiler {
# Current semicolon separated optional string options
variable sdcc_scs_string_options
+ ## Make utility
+ # General options, this is an array!
+ variable makeutil_config
+ # Default values for the eneral options
+ variable makeutil_config_def {
+ c_ena 0
+ c_file {}
+ co_file {}
+ ct_file {}
+ }
## Make backup copies for files with the given extensions and remove original files
# (input_filename.extension -> input_filename.extension~)*
@@ -217,50 +232,76 @@ namespace eval ExternalCompiler {
proc compile_C {work_dir input_file iram xram code} {
variable input_filename ;# String: Name of file to compile (without extension)
variable compiler_used ;# Int: Compiler ID (1 == ASEM-51; 2 == ASL; 3 == AS31, other values have no meaning)
+ variable makeutil_config;# Make utility - general options
set compiler_used 0
set input_filename [file rootname $input_file]
backup_and_remove {asm cdb ihx}
set sdcc_opts [determinate_sdcc_options]
- if {${::PROGRAM_AVALIABLE(sdcc-sdcc)}} {
+ if {${::PROGRAM_AVAILABLE(sdcc-sdcc)}} {
set sdcc_cmd {sdcc-sdcc}
- } {
+ } else {
set sdcc_cmd {sdcc}
}
- ::X::messages_text_append [::Compiler::msgc {S}][mc "\n\nStarting compiler ..."]
+
+ # Normal way (POSIX)
if {!$::MICROSOFT_WINDOWS} {
- ::X::messages_text_append "\ncd \"$work_dir\"\n$sdcc_cmd -mmcs51 --iram-size $iram --xram-size $xram --code-size $code $sdcc_opts \"$input_file\""
- } {
- ::X::messages_text_append "\ncd \"$work_dir\"\n$sdcc_cmd -mmcs51 --iram-size $iram --xram-size $xram --code-size $code --nooverlay --noinduction --verbose --debug -V --std-sdcc89 --model-small --pack-iram \"$input_file\""
+ # Start GNU make
+ if {$makeutil_config(c_ena) && ${::PROGRAM_AVAILABLE(make)}} {
+ ::X::messages_text_append [::Compiler::msgc {S}][mc "\n\nStarting make ..."]
+ ::X::messages_text_append "\ncd \"${work_dir}\"\nmake -f \"${makeutil_config(c_file)}\" ${makeutil_config(co_file)} ${makeutil_config(ct_file)}"
+
+ # Start SDCC
+ } else {
+ ::X::messages_text_append [::Compiler::msgc {S}][mc "\n\nStarting compiler ..."]
+ ::X::messages_text_append "\ncd \"${work_dir}\"\n${sdcc_cmd} -mmcs51 --iram-size ${iram} --xram-size ${xram} --code-size ${code} ${sdcc_opts} \"${input_file}\""
+ }
+ # Microsoft Windows way
+ } else {
+ regsub -all {/} $work_dir "\\\\\\\\" work_dir
+ regsub -all {/} $input_file "\\\\\\\\" input_file
+
+ ::X::messages_text_append [::Compiler::msgc {S}][mc "\n\nStarting compiler ..."]
+ ::X::messages_text_append "\ncd \"${work_dir}\"\n${sdcc_cmd} -mmcs51 --iram-size ${iram} --xram-size ${xram} --code-size ${code} ${sdcc_opts} \"${input_file}\""
}
if {[catch {
cd $work_dir
- }]} {
+ }]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "\nError: Unable to change working directory to '%s'" $work_dir]
}
if {!$::MICROSOFT_WINDOWS} { ;# Normal way (POSIX)
- return [exec -- /bin/sh -c "$sdcc_cmd -mmcs51 \
- --iram-size $iram \
- --xram-size $xram \
- --code-size $code \
- $sdcc_opts \"$input_file\"" |& \
- tclsh "${::LIB_DIRNAME}/external_command.tcl" \
- [tk appname] \
- {::ExternalCompiler::ext_compilation_complete 1}\
- ::X::compilation_message & \
- ]
- } { ;# Microsoft Windows way
+ # Start GNU make
+ if {$makeutil_config(c_ena) && ${::PROGRAM_AVAILABLE(make)}} {
+ return [exec -- /bin/sh -c "make -f \"${makeutil_config(c_file)}\" ${makeutil_config(co_file)} ${makeutil_config(ct_file)}" |& \
+ tclsh "${::LIB_DIRNAME}/external_command.tcl" \
+ [tk appname] \
+ {::ExternalCompiler::ext_compilation_complete 1} \
+ ::X::compilation_message & \
+ ]
+
+ # Start SDCC
+ } else {
+ return [exec -- /bin/sh -c "$sdcc_cmd -mmcs51 \
+ --iram-size $iram \
+ --xram-size $xram \
+ --code-size $code \
+ $sdcc_opts \"$input_file\"" |& \
+ tclsh "${::LIB_DIRNAME}/external_command.tcl" \
+ [tk appname] \
+ {::ExternalCompiler::ext_compilation_complete 1}\
+ ::X::compilation_message & \
+ ]
+ }
+ } else { ;# Microsoft Windows way
eval [subst -nocommands {
- return [exec -- "${::LIB_DIRNAME}/sdcc.bat" \
- "${::LIB_DIRNAME}" \
- $iram \
- $xram \
- $code \
- "$input_file" \
+ return [exec -- "${::INSTALLATION_DIR}/startsdcc.bat" \
+ "${work_dir}" \
+ $sdcc_opts \
+ "${input_file}" \
|& \
- "${::LIB_DIRNAME}/external_command.bat" \
- "${::LIB_DIRNAME}/external_command.tcl" \
- [tk appname] \
+ "${::INSTALLATION_DIR}/external_command.bat" \
+ "${::INSTALLATION_DIR}/external_command.exe" \
+ "[tk appname]" \
{::ExternalCompiler::ext_compilation_complete 1} \
::X::compilation_message & \
]
@@ -292,7 +333,7 @@ namespace eval ExternalCompiler {
::X::messages_text_append "\ncd \"$work_dir\"\nas31 $as31_options \"$input_file\""
if {[catch {
cd $work_dir
- }]} {
+ }]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "\nError: Unable to change working directory to '%s'" $work_dir]
}
backup_and_remove {adf hex lst}
@@ -322,20 +363,47 @@ namespace eval ExternalCompiler {
set input_filename [file rootname $input_file_base]
set working_dir $work_dir
- set asem51_options [determinate_asem51_options]
::X::messages_text_append [::Compiler::msgc {S}][mc "\n\nStarting compiler ..."]
- ::X::messages_text_append "\ncd \"$work_dir\"\nasem $asem51_options \"$input_file\""
+
+ set asem51_options [determinate_asem51_options]
+ if {$::MICROSOFT_WINDOWS} {
+ regsub -all -- {--verbose} $asem51_options {} asem51_options
+ regsub -all -- {--} $asem51_options {/} asem51_options
+ regsub -all -- {=} $asem51_options {:} asem51_options
+ regsub -all -- {;} $asem51_options { /includes:} asem51_options
+ regsub -all {/} $work_dir "\\\\\\\\" work_dir
+ regsub -all {/} $input_file "\\\\\\\\" input_file
+ ::X::messages_text_append "\ncd \"$work_dir\"\nasem \"$input_file\" $asem51_options"
+ } else {
+ ::X::messages_text_append "\ncd \"$work_dir\"\nasem $asem51_options \"$input_file\""
+ }
if {[catch {
cd $work_dir
- }]} {
+ }]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "\nError: Unable to change working directory to '%s'" $work_dir]
}
backup_and_remove {adf hex lst omf}
- return [exec -- /bin/sh -c "asem $asem51_options \"$input_file\"" |& \
- tclsh "${::LIB_DIRNAME}/external_command.tcl" "[tk appname]" \
- ::ExternalCompiler::ext_compilation_complete ::X::compilation_message & \
- ]
+ if {!$::MICROSOFT_WINDOWS} { ;# Normal way (POSIX)
+ return [exec -- /bin/sh -c "asem $asem51_options \"$input_file\"" |& \
+ tclsh "${::LIB_DIRNAME}/external_command.tcl" "[tk appname]" \
+ ::ExternalCompiler::ext_compilation_complete ::X::compilation_message & \
+ ]
+ } else { ;# Microsoft Windows way
+ eval [subst -nocommands {
+ return [exec -- "${::INSTALLATION_DIR}/startasem.bat" \
+ "${work_dir}" \
+ "${input_file}" \
+ $asem51_options \
+ |& \
+ "${::INSTALLATION_DIR}/external_command.bat" \
+ "${::INSTALLATION_DIR}/external_command.exe" \
+ "[tk appname]" \
+ {::ExternalCompiler::ext_compilation_complete 1} \
+ ::X::compilation_message & \
+ ]
+ }]
+ }
}
## Start ASL (Assembler)
@@ -364,7 +432,7 @@ namespace eval ExternalCompiler {
::X::messages_text_append "\ncd \"$work_dir\"\nasl $asl_opts \"$input_file\""
if {[catch {
cd $work_dir
- }]} {
+ }]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "\nError: Unable to change working directory to '%s'" $work_dir]
}
return [exec -- /bin/sh -c "asl $asl_opts \"$input_file\" $additional_commands" |& \
@@ -383,18 +451,20 @@ namespace eval ExternalCompiler {
# List of files included files in the main file
set included_files [list]
+ set cbd_file {} ;# We will set this variable later ...
+
# Open C DeBug file generated by SDCC compiler
if {[catch {
set cdb_file [open $input_filename.cdb r]
- }]} {
+ }]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "\nUnable to find \"%s\"" [file rootname $input_filename].cdb]
return
}
# Open the hashes file for writing (possibly create the file)
if {[catch {
- set hs_file [open $input_filename.hashes w 420]
- }]} {
+ set hs_file [open $input_filename.hashes w 0640]
+ }]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "\nUnable to create \"%s\"" [file rootname $input_filename].hashes]
catch {close $cbd_file}
return
@@ -429,11 +499,11 @@ namespace eval ExternalCompiler {
}
## This function must be called after exteral compiler finished its work
- # @parm Int action = 0 - Action to perform after successfull compilation
+ # @parm Int action=0 - Action to perform after successfull compilation
# 0 - No action
# 1 - Copy <file>.ihx to <file>.hex
# @return void
- proc ext_compilation_complete args {
+ proc ext_compilation_complete {{action 0}} {
variable input_filename ;# String: Name of file to compile (without extension)
variable compiler_used ;# Int: Compiler ID (1 == ASEM-51; 2 == ASL; 3 == AS31, other values have no meaning)
variable assembler_ASEM51_addcfg;# Current ASEM-51 assembler configuration
@@ -464,10 +534,13 @@ namespace eval ExternalCompiler {
create_hashes_file
}
}
- ::X::messages_text_append [::Compiler::msgc {S}][mc "\nCompilation successful"]
+
+ if {$::X::compilation_successfull} {
+ ::X::messages_text_append [::Compiler::msgc {S}][mc "\nCompilation successful"]
+ }
# Perform specified after successfull compilation
- switch -- [lindex $args 0] {
+ switch -- $action {
0 { ;# No action
}
1 { ;# Copy <file>.ihx to <file>.hex
@@ -479,9 +552,10 @@ namespace eval ExternalCompiler {
}
}
}
+ }
# Compilation failed
- } {
+ if {!$::X::compilation_successfull} {
::X::messages_text_append [::Compiler::msgc {E}][mc "\nCompilation FAILED"]
}
::X::ext_compilation_complete
@@ -505,8 +579,8 @@ namespace eval ExternalCompiler {
# Try to open code listing file and some tempotary debug file
if {[catch {
set lst_file [open $input_filename.lst r]
- set adf_file [open $input_filename.adf w 420]
- } result]} {
+ set adf_file [open $input_filename.adf w 0640]
+ } result]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "File access error:\n%s" $result]
return 0
}
@@ -514,7 +588,6 @@ namespace eval ExternalCompiler {
# Write file header
puts $adf_file "# Assembler Debug File created by ${::APPNAME}"
puts $adf_file "# Used assembler: AS31"
- puts $adf_file "# Date: [clock format [clock seconds] -format {%D}]"
# Write MD5 of the source file
puts -nonewline $adf_file [::md5::md5 -hex -file $input_file_base]
@@ -550,8 +623,8 @@ namespace eval ExternalCompiler {
scan $h %x h
lappend adf_code $h
}
- }]} {
- ::X::messages_text_append [::Compiler::msgc {E}][mc "Unable to understand formulation at line %s in file %s" $line_number $input_filename.lst]
+ }]} then {
+ ::X::messages_text_append [::Compiler::msgc {E}][mc "Unable to understand formulation at %s in file %s" $line_number $input_filename.lst]
close $lst_file
close $adf_file
return 0
@@ -561,11 +634,11 @@ namespace eval ExternalCompiler {
if {$address == {}} {
puts -nonewline $adf_file { }
puts -nonewline $adf_file $adf_code
- } {
+ } else {
if {[catch {
scan $address %x address
- }]} {
- ::X::messages_text_append [::Compiler::msgc {E}][mc "Unable to understand formulation at line %s in file %s" $line_number $input_filename.lst]
+ }]} then {
+ ::X::messages_text_append [::Compiler::msgc {E}][mc "Unable to understand formulation at %s in file %s" $line_number $input_filename.lst]
close $lst_file
close $adf_file
return 0
@@ -603,8 +676,8 @@ namespace eval ExternalCompiler {
# Try to open code listing file and some tempotary debug file
if {[catch {
set lst_file [open $input_filename.lst r]
- set adf_file [open $input_filename._adf w 420]
- } result]} {
+ set adf_file [open $input_filename._adf w 0640]
+ } result]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "File access error:\n%s" $result]
return 0
}
@@ -619,7 +692,7 @@ namespace eval ExternalCompiler {
# Read 1 line
set line [gets $lst_file]
- # Normal line coresponding to certain line in source code
+ # Normal line corresponding to certain line in source code
if {[regexp {^ *\d+:(..)?} $line inclusion_level]} {
# Extract numbers after "line_num: inc_lvl "
set line [string range $line [string length $inclusion_level] end]
@@ -701,22 +774,21 @@ namespace eval ExternalCompiler {
# Open final debug file
if {[catch {
- set adf_file [open $input_filename.adf w 420]
- } result]} {
+ set adf_file [open $input_filename.adf w 0640]
+ } result]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "File access error:\n%s" $result]
return 0
}
# Write file header
puts $adf_file "# Assembler Debug File created by ${::APPNAME}"
puts $adf_file "# Used assembler: ASEM-51"
- puts $adf_file "# Date: [clock format [clock seconds] -format {%D}]"
# Create list of included files with MD5 hashes
set hashes_and_files {}
set project_dir_len [string length $project_dir]
foreach filename $included_files {
if {[catch {
lappend hashes_and_files [::md5::md5 -hex -file $filename]
- } result]} {
+ } result]} then {
lappend hashes_and_files 0
::X::messages_text_append [::Compiler::msgc {E}][mc "File access error:\n%s" $result]
}
@@ -730,7 +802,7 @@ namespace eval ExternalCompiler {
# Copy content of tempotary debug file to final debug file
if {[catch {
set adf__file [open $input_filename._adf r]
- } result]} {
+ } result]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "File access error:\n%s" $result]
return 0
}
@@ -756,8 +828,8 @@ namespace eval ExternalCompiler {
if {[catch {
set map_file [open $input_filename.map r] ;# ASL debug file
set hex_file [open $input_filename.hex r] ;# Machine code
- set adf_file [open $input_filename.adf w 420] ;# MCU 8051 IDE debug file
- } result]} {
+ set adf_file [open $input_filename.adf w 0640] ;# MCU 8051 IDE debug file
+ } result]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "File access error:\n%s" $result]
return 0
}
@@ -812,7 +884,7 @@ namespace eval ExternalCompiler {
set filename [file join $project_dir [file normalize $filename]]
if {[catch {
lappend hashes_and_files [::md5::md5 -hex -file $filename]
- } result]} {
+ } result]} then {
::X::messages_text_append [::Compiler::msgc {E}][mc "\nFile access error:\n%s" $result]
lappend hashes_and_files {0}
}
@@ -829,7 +901,6 @@ namespace eval ExternalCompiler {
seek $map_file 0
puts $adf_file "# Assembler Debug File created by ${::APPNAME}"
puts $adf_file "# Used assembler: ASL"
- puts $adf_file "# Date: [clock format [clock seconds] -format {%D}]"
puts $adf_file $hashes_and_files
unset hashes_and_files
@@ -914,7 +985,7 @@ namespace eval ExternalCompiler {
set val [::IHexTools::get_value $i]
if {$val > -1} {
lappend code [expr "0x$val"]
- } {
+ } else {
lappend code 0
}
}
@@ -956,7 +1027,7 @@ namespace eval ExternalCompiler {
if {$value != {}} {
if {[regexp {\s} $value]} {
append result { } $key { } "\"" $value "\""
- } {
+ } else {
append result { } $key { } $value
}
}
@@ -969,7 +1040,7 @@ namespace eval ExternalCompiler {
if {$value != {}} {
if {[regexp {\s} $value]} {
append result { } $key { } "\"" $value "\""
- } {
+ } else {
append result { } $key { } $value
}
}
@@ -986,7 +1057,7 @@ namespace eval ExternalCompiler {
set result $assembler_ASEM51_config(custom)
if {$assembler_ASEM51_config(-i) != {}} {
- append result { -i } {"} $assembler_ASEM51_config(i) {"}
+ append result " --includes=$assembler_ASEM51_config(-i)"
}
foreach opt {--omf-51 --columns --verbose} {
if {$assembler_ASEM51_config($opt)} {
@@ -1069,8 +1140,17 @@ namespace eval ExternalCompiler {
$::ExternalCompiler::sdcc_optional_string_options_def
array set ::ExternalCompiler::sdcc_scs_string_options \
$::ExternalCompiler::sdcc_scs_string_options_def
+
+ # Make utility
+ foreach {key value} ${::ExternalCompiler::makeutil_config_def} {
+ set ::ExternalCompiler::makeutil_config($key) $value
+ }
}
}
# Initialize NS variables
ExternalCompiler::initialize
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/compiler/preprocessor.tcl b/lib/compiler/preprocessor.tcl
index 4fca542..d4429ea 100755..100644
--- a/lib/compiler/preprocessor.tcl
+++ b/lib/compiler/preprocessor.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 _PREPROCESSOR_TCL ] } {
+set _PREPROCESSOR_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# 8051 Assembly language compiler preprocessor. This code is part of Compiler
@@ -34,11 +39,11 @@
#
# Basic principle of operation:
# 1) Remove comments and include files
-# 2) Process controll sequences ($SOMETHING)
+# 2) Process control sequences ($SOMETHING)
# 3) Define as much constants/variables as possible (with cross references)
# 4) Conditional compilation and directive USING
# 5) Define macro instructions
-# 6) Recomposite code acording to ORG directives
+# 6) Recomposite code according to ORG directives
# 7) Expand macro instructions (recursive with cross references)
# 8) Final stage
#
@@ -52,29 +57,30 @@
namespace eval PreProcessor {
## General
- variable asm {} ;# Resulting precompiled code
- variable tmp_asm {} ;# Tempotary auxiliary precompiled code
+ variable asm {} ;# Resulting pre-compiled code
+ variable tmp_asm {} ;# Temporary auxiliary pre-compiled code
variable lineNum 0 ;# Number of the current line
variable fileNum 0 ;# Number of the current file
variable program_memory ;# String of booleans: Map of program memory usage
variable idx 0 ;# Current position in asm list
- variable optims 0 ;# Number of performed optimalizations
+ variable optims 0 ;# Number of performed optimizations
variable macros_first 1 ;# Bool: Define and expand macro instruction before conditional
;#+ assembly and constants expansions
## Errors and warnings
- variable ErrorAtLine 0 ;# Bool: Error occured on the current line
- variable Error 0 ;# Bool: An error occured during precompilation
- variable error_count 0 ;# Number of errors occured
- variable warning_count 0 ;# Number of warnings occured
+ variable ErrorAtLine 0 ;# Bool: Error occurred on the current line
+ variable Error 0 ;# Bool: An error occurred during precompilation
+ variable error_count 0 ;# Number of errors occurred
+ variable warning_count 0 ;# Number of warnings occurred
## Conditional compilation
variable Enable 1 ;# Bool: Compilation enabled (conditional compilation)
variable IfElse_map ;# Array: Conditional compilation map ($IfElse_map($level) == $bool)
+ variable IfElse_pcam ;# Array: Conditional compilation -- Positive condition already met ($IfElse_pcam($level) == $bool)
variable IfElse_level 0 ;# Current level of conditional compilation evaluation
## Memory reservation
- variable selected_segment cseg ;# Current memory segment (one of {cseg bseg dseg iseg xseg})
+ variable selected_segment ;# Current memory segment (one of {cseg bseg dseg iseg xseg})
variable memory_reservation_map ;# Array: memory reservation map (see code)
variable segment_pointer ;# Current memory segment pointer
@@ -112,12 +118,13 @@ namespace eval PreProcessor {
## Macro expansion
variable macro ;# Array: Code of defined macro instructions
variable defined_MACRO {} ;# List of defined macro instructions
+ variable local_M_labels ;# Array of lists: Local labels in macros $local_M_labels($macro_name) == {integer label0 ... labelN}
variable macro_name_to_append ;# Name of currently defined macro instruction
## Special variables
variable original_expression ;# Auxiliary variable (see proc. 'ComputeExpr')
variable tmp ;# General purpose tempotary variable
- variable DB_asm {} ;# Tempotary asm code for creating code memory tables
+ variable DB_asm {} ;# Temporary asm code for creating code memory tables
variable included_files {} ;# List: Unique unsorted list of included files
variable working_dir {} ;# String: Current working directory
variable origin_d_addr {} ;# List: Addresses of static program blocks
@@ -126,7 +133,7 @@ namespace eval PreProcessor {
variable max_include_level 8 ;# Maximum inclusion level
variable max_macro_level 8 ;# Maximum macro expansion level
variable check_sfr_usage 0 ;# Bool: Check for legal usage of SFR and SFB
- variable avaliable_SFR {} ;# List: Avaliable SFR and SFB on the target MCU
+ variable available_SFR {} ;# List: Available SFR and SFB on the target MCU
# ----------------------------------------------------------------
@@ -143,13 +150,13 @@ namespace eval PreProcessor {
;#+ assembly and constants expansions
variable memory_reservation_map ;# Array: memory reservation map (see code)
variable working_dir ;# String: Current working directory
- variable asm ;# Resulting precompiled code
+ variable asm ;# Resulting pre-compiled code
variable segment_pointer ;# Current memory segment pointer
- variable error_count ;# Number of errors occured
- variable warning_count ;# Number of warnings occured
+ variable error_count ;# Number of errors occurred
+ variable warning_count ;# Number of warnings occurred
variable max_include_level ;# Maximum inclusion level
variable max_macro_level ;# Maximum macro expansion level
- variable optims ;# Number of performed optimalizations
+ variable optims ;# Number of performed optimizations
variable included_files ;# List: Unique unsorted list of included files
variable selected_segment ;# Current memory segment (one of {cseg bseg dseg iseg xseg})
variable const_EQU ;# Array: Constants defined by directive 'EQU'
@@ -169,11 +176,11 @@ namespace eval PreProcessor {
set memory_reservation_map(xseg) [ string repeat 0 65536]
# Set constants "??MCU_8051_IDE" and "??VERSION"
- lappend defined_EQU {??MCU_8051_IDE} {??VERSION}
- set const_EQU(??MCU_8051_IDE) 32849
+ lappend defined_EQU {??mcu_8051_ide} {??version}
+ set const_EQU(??mcu_8051_ide) 32849 ;# 8051h
scan $::VERSION "%d.%d.%d" i j k
set i [expr {($i << 8) + ($j << 4) + $k}]
- set const_EQU(??VERSION) $i
+ set const_EQU(??version) $i
# Reset counters of errors and warnings
set error_count 0
@@ -183,11 +190,7 @@ namespace eval PreProcessor {
set working_dir $current_dir
set included_files [list [file normalize [file join $current_dir $filename]]]
- # Message "formating code ..."
set asm $data
- if {!${::Compiler::Settings::QUIET}} {
- ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\tPreformating code ..."]
- }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -201,10 +204,6 @@ namespace eval PreProcessor {
# }
line_numbers
- # Message "include ..."
- if {!${::Compiler::Settings::QUIET}} {
- ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\tPutting program pieces together ..."]
- }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -213,7 +212,7 @@ namespace eval PreProcessor {
# Import code pieces (INCLUDE file.asm // $INCLUDE('file.inc'))
set counter 0
- while 1 {
+ while {1} {
if {![include_directive $current_dir]} {break}
incr counter
if {$counter > $max_include_level} {
@@ -225,10 +224,6 @@ namespace eval PreProcessor {
# Remove code after END directive
end_of_code
- # Message "encapsulating code ..."
- if {!${::Compiler::Settings::QUIET}} {
- ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\tEncapsulating code ..."]
- }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -261,11 +256,6 @@ namespace eval PreProcessor {
define_basic_symbolic_names
}
- # Message "Parsing constants, macros etc."
- if {!${::Compiler::Settings::QUIET}} {
- ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\tParsing constants, macros, etc. ..."]
- }
-
if {$macros_first} {
# Define macro instructions
define_macro_instructions
@@ -277,7 +267,7 @@ namespace eval PreProcessor {
# Expand macro instructions
set counter 0
- while 1 {
+ while {1} {
if {![expand_macro_instructions]} {break}
incr counter
if {$counter > $max_macro_level} {
@@ -299,21 +289,20 @@ namespace eval PreProcessor {
# - Data memory segment selection (BSEG, DSEG, ISEG, XSEG) (group 3)
# - Constant definitions (SET, EQU, BIT, DATA, IDATA, XDATA) (group 4)
# - Date memory reservation (DS, DBIT) (group 5)
- while 1 {
+ while {1} {
if {![parse_Consts_and_ConditionalCompilation {0 0 1 1 1 1} 1]} {
break
}
}
- parse_Consts_and_ConditionalCompilation {1 1 1 1 1 1} 1
- set selected_segment cseg
+ parse_Consts_and_ConditionalCompilation {1 1 1 1 1 1} 1
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
return
}
- # Parse code memory segmentation (CSEG DB DW)
+ # Process code memory related directives (CSEG DB DW)
code_segment 1
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
@@ -331,7 +320,7 @@ namespace eval PreProcessor {
}
}
- # Reassemble code acording to ORG directives
+ # Reassemble code according to ORG directives
origin_directive
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
@@ -339,15 +328,10 @@ namespace eval PreProcessor {
return
}
- # Message "Expanding macros"
- if {!${::Compiler::Settings::QUIET}} {
- ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\tExpanding macros ..."]
- }
-
if {!$macros_first} {
# Expand macro instructions
set counter 0
- while 1 {
+ while {1} {
if {![expand_macro_instructions]} {break}
incr counter
if {$counter > $max_macro_level} {
@@ -362,11 +346,6 @@ namespace eval PreProcessor {
}
}
- # Message "Final stage"
- if {!${::Compiler::Settings::QUIET}} {
- ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\tFinal stage ..."]
- }
-
## Do three things:
# * Convert code to this format:
# {
@@ -379,18 +358,14 @@ namespace eval PreProcessor {
# * Create map of program memory usage (bitmap)
parse_instructions
- # Perform code optimalizations
+ # Perform code optimizations
set optims 0
if {${::Compiler::Settings::optim_ena}} {
- # Message "Optimalizations"
- if {!${::Compiler::Settings::QUIET}} {
- ${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "\tOptimalizations ..."]
- }
- optimalization
+ optimization
}
# Final constants expansion
- while 1 {
+ while {1} {
if {![parse_Consts_and_ConditionalCompilation {0 0 1 1 1 1} 0]} {
break
}
@@ -434,6 +409,7 @@ namespace eval PreProcessor {
variable const_SET ;# Array: Constants defined by directive 'CODE'
variable const_EQU ;# Array: Constants defined by directive 'EQU'
variable macro ;# Array: Code of defined macro instructions
+ variable local_M_labels ;# Array of lists: Local labels in macros $local_M_labels($macro_name) == {integer label0 ... labelN}
variable program_memory ;# String of booleans: Map of program memory usage
variable labels ;# Array: Values of defined labels ($labels($label) == $address)
variable defined_BIT {} ;# List of defined bits (directove 'BIT')
@@ -449,6 +425,7 @@ namespace eval PreProcessor {
variable defined_MACRO {} ;# List of defined macro instructions
catch {unset macro}
+ catch {unset local_M_labels}
catch {unset memory_reservation_map}
catch {unset segment_pointer}
catch {unset const_BIT}
@@ -469,7 +446,7 @@ namespace eval PreProcessor {
# INTERNAL AUXILIARY PROCEDURES
# ----------------------------------------------------------------
- ## Define basic symbolic names acording to MapOfSFRArea, MapOfSFRBitArea and progVectors
+ ## Define basic symbolic names according to MapOfSFRArea, MapOfSFRBitArea and progVectors
# @return void
proc define_basic_symbolic_names {} {
variable const_BIT ;# Array: Bit values -- ($const_BIT($bit_name) == $value)
@@ -480,7 +457,7 @@ namespace eval PreProcessor {
variable defined_CODE ;# List of constants defined by 'CODE'
# Define bits
- foreach def ${CompilerConsts::MapOfSFRBitArea} {
+ foreach def ${::CompilerConsts::MapOfSFRBitArea} {
set var [lindex $def 0] ;# Name
set val [lindex $def 1] ;# Address
# Adjust name
@@ -491,7 +468,7 @@ namespace eval PreProcessor {
}
# Define registers
- foreach def ${CompilerConsts::MapOfSFRArea} {
+ foreach def ${::CompilerConsts::MapOfSFRArea} {
set var [lindex $def 0] ;# Name
set val [lindex $def 1] ;# Address
# Adjust name
@@ -502,7 +479,7 @@ namespace eval PreProcessor {
}
# Define Program vectors
- foreach def ${CompilerConsts::progVectors} {
+ foreach def ${::CompilerConsts::progVectors} {
set var [lindex $def 0] ;# Name
set val [lindex $def 1] ;# Address
# Adjust name
@@ -528,7 +505,7 @@ namespace eval PreProcessor {
if {[regexp {^\w+} $data control]} {
regsub {^\w+} $data {} data
set control [string tolower $control]
- } {
+ } else {
set control {}
}
@@ -548,12 +525,12 @@ namespace eval PreProcessor {
if {[string index $argument 0] == {'}} {
if {[string index $argument end] != {'}} {
SyntaxError $lineNum $fileNum [mc "Invalid argument: %s" $argument]
- } {
+ } else {
set argument [string trimleft $argument {'}]
set argument [string trimright $argument {'}]
}
}
- } {
+ } else {
set argument {}
}
@@ -572,20 +549,20 @@ namespace eval PreProcessor {
# @parm String setting - Target configuration variable
# @parm String value - New configuration value
# @return Bool - One if setting was accepted, zero if setting was dismissed
- proc AssemlerContol {condition setting value} {
+ proc AssemblerContol {condition setting value} {
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
# Determinate condition value
- set condition [subst "\${::Compiler::Settings::$condition}"]
+ set condition [subst -nocommands "\${::Compiler::Settings::$condition}"]
# Accept
if {$condition == 0} {
set Compiler::Settings::$setting $value
return 1
# Dismiss
- } {
- Notice $lineNum $fileNum [mc "Control %s has been overrriden (by compiler settings)" $setting]
+ } else {
+ Notice $lineNum $fileNum [mc "Control %s has been overridden (by compiler settings)" $setting]
return 0
}
}
@@ -594,7 +571,7 @@ namespace eval PreProcessor {
# @parm String control - Control sequence (name only)
# @parm String argument - Argument (without parantesis and quotes)
# @return Bool - result (1 == success; 0 == error message)
- proc AssemlerContol_expect_one_argument {control argument} {
+ proc AssemblerContol_expect_one_argument {control argument} {
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
@@ -610,7 +587,7 @@ namespace eval PreProcessor {
# @parm String control - Control sequence (name only)
# @parm String argument - Argument (without parantesis and quotes)
# @return Bool - result (1 == success; 0 == error message)
- proc AssemlerContol_expect_no_argument {control argument} {
+ proc AssemblerContol_expect_no_argument {control argument} {
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
@@ -624,8 +601,8 @@ namespace eval PreProcessor {
## Evaluate and remove control sequences
# @return void
proc parse_controls {} {
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable idx ;# Current position in asm list
@@ -642,7 +619,9 @@ namespace eval PreProcessor {
incr idx
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -669,178 +648,178 @@ namespace eval PreProcessor {
set control [lindex $ctrl 0] ;# Name
set argument [lindex $ctrl 1] ;# Argument
- # Adjust compiler settings acording to the control sequence
+ # Adjust compiler settings according to the control sequence
switch -- $control {
{nomacrosfirst} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
set macros_first 0
}
}
{eject} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
CodeListing::directive_eject $idx
}
}
{ej} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
CodeListing::directive_eject $idx
}
}
{nolist} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
CodeListing::directive_nolist $idx
}
}
{noli} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
CodeListing::directive_nolist $idx
}
}
{list} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
CodeListing::directive_list $idx
}
}
{li} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
CodeListing::directive_list $idx
}
}
{nomod} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _nomod NOMOD 1
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _nomod NOMOD 1
}
}
{nomod51} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _nomod NOMOD 1
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _nomod NOMOD 1
}
}
{nomo} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _nomod NOMOD 1
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _nomod NOMOD 1
}
}
{paging} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _paging PAGING 1
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _paging PAGING 1
}
}
{pi} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _paging PAGING 1
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _paging PAGING 1
}
}
{nopaging} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _paging PAGING 0
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _paging PAGING 0
}
}
{nopi} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _paging PAGING 0
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _paging PAGING 0
}
}
{pagewidth} {
- if {[AssemlerContol_expect_one_argument $control $argument]} {
+ if {[AssemblerContol_expect_one_argument $control $argument]} {
if {[regexp {^\d+$} $argument]} {
- AssemlerContol _pagewidth PAGEWIDTH $argument
- } {
+ AssemblerContol _pagewidth PAGEWIDTH $argument
+ } else {
SyntaxError $lineNum $fileNum \
[mc "Invalid argument (must be integer): %s" $argument]
}
}
}
{pw} {
- if {[AssemlerContol_expect_one_argument $control $argument]} {
+ if {[AssemblerContol_expect_one_argument $control $argument]} {
if {[regexp {^\d+$} $argument]} {
- AssemlerContol _pagewidth PAGEWIDTH $argument
- } {
+ AssemblerContol _pagewidth PAGEWIDTH $argument
+ } else {
SyntaxError $lineNum $fileNum \
[mc "Invalid argument (must be integer): %s" $argument]
}
}
}
{pagelength} {
- if {[AssemlerContol_expect_one_argument $control $argument]} {
+ if {[AssemblerContol_expect_one_argument $control $argument]} {
if {[regexp {^\d+$} $argument]} {
- AssemlerContol _pagelength PAGELENGTH $argument
- } {
+ AssemblerContol _pagelength PAGELENGTH $argument
+ } else {
SyntaxError $lineNum $fileNum \
[mc "Invalid argument (must be integer): %s" $argument]
}
}
}
{pl} {
- if {[AssemlerContol_expect_one_argument $control $argument]} {
+ if {[AssemblerContol_expect_one_argument $control $argument]} {
if {[regexp {^\d+$} $argument]} {
- AssemlerContol _pagelength PAGELENGTH $argument
- } {
+ AssemblerContol _pagelength PAGELENGTH $argument
+ } else {
SyntaxError $lineNum $fileNum \
[mc "Invalid argument (must be integer): %s" $argument]
}
}
}
{title} {
- if {[AssemlerContol_expect_one_argument $control $argument]} {
- AssemlerContol _title TITLE $argument
+ if {[AssemblerContol_expect_one_argument $control $argument]} {
+ AssemblerContol _title TITLE $argument
}
}
{tt} {
- if {[AssemlerContol_expect_one_argument $control $argument]} {
- AssemlerContol _title TITLE $argument
+ if {[AssemblerContol_expect_one_argument $control $argument]} {
+ AssemblerContol _title TITLE $argument
}
}
{date} {
- if {[AssemlerContol_expect_one_argument $control $argument]} {
- AssemlerContol _date DATE $argument
+ if {[AssemblerContol_expect_one_argument $control $argument]} {
+ AssemblerContol _date DATE $argument
}
}
{da} {
- if {[AssemlerContol_expect_one_argument $control $argument]} {
- AssemlerContol _date DATE $argument
+ if {[AssemblerContol_expect_one_argument $control $argument]} {
+ AssemblerContol _date DATE $argument
}
}
{object} {
- if {[AssemlerContol_expect_one_argument $control $argument]} {
- AssemlerContol _object OBJECT_FILE $argument
- AssemlerContol _object OBJECT 1
+ if {[AssemblerContol_expect_one_argument $control $argument]} {
+ AssemblerContol _object OBJECT_FILE $argument
+ AssemblerContol _object OBJECT 1
}
}
{noobject} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _object OBJECT 0
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _object OBJECT 0
}
}
{nosb} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _symbols SYMBOLS 0
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _symbols SYMBOLS 0
}
}
{nosymbols} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _symbols SYMBOLS 0
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _symbols SYMBOLS 0
}
}
{noprint} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _print PRINT 0
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _print PRINT 0
}
}
{symbols} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _symbols SYMBOLS 1
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _symbols SYMBOLS 1
}
}
{sb} {
- if {[AssemlerContol_expect_no_argument $control $argument]} {
- AssemlerContol _symbols SYMBOLS 1
+ if {[AssemblerContol_expect_no_argument $control $argument]} {
+ AssemblerContol _symbols SYMBOLS 1
}
}
{print} {
- if {[AssemlerContol_expect_one_argument $control $argument]} {
- AssemlerContol _print PRINT_FILE $argument
- AssemlerContol _print PRINT 1
+ if {[AssemblerContol_expect_one_argument $control $argument]} {
+ AssemblerContol _print PRINT_FILE $argument
+ AssemblerContol _print PRINT 1
}
}
default {
@@ -858,20 +837,19 @@ namespace eval PreProcessor {
# @parm Bool ignore_undefined - Ignore undefined symbolic names
# @return void
proc code_segment {ignore_undefined} {
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable selected_segment ;# Current memory segment (one of {cseg bseg dseg iseg xseg})
variable segment_pointer ;# Current memory segment pointer
- variable DB_asm ;# Tempotary asm code for creating code memory tables
variable idx ;# Current position in asm list
# Reset NS variables
- set DB_asm {}
- set value {}
set tmp_asm {}
set segment_pointer(cseg) {}
+
+ set value {}
set idx -1
# Iterate over the code
@@ -879,7 +857,9 @@ namespace eval PreProcessor {
incr idx
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -909,32 +889,41 @@ namespace eval PreProcessor {
# Directive 'CSEG' - code segment selection
} elseif {$directive == {cseg}} {
+ set discontinue 0
- # Check if there is no label
+ # Check if there is a label
if {[lindex $cmd 0] != {}} {
SyntaxError $lineNum $fileNum [mc "CSEG cannot take any label: %s" [lindex $cmd 0]]
- continue
+ set discontinue 1
}
- # Select code segment
- set selected_segment {cseg}
+ if {!$discontinue} {
+ # Set the code segment
+ set selected_segment {cseg}
- # Remove this line from the code listing
- CodeListing::delete_line $idx
+ # Check for presence of an address expression
+ set expr [lindex $cmd 2]
+ if {$expr == {}} {
+ set segment_pointer(cseg) {}
+ set discontinue 1
+ }
- # Check for presence of address expression
- set expr [lindex $cmd 2]
- if {$expr == {}} {
- set segment_pointer(cseg) {}
- continue
+ if {!$discontinue} {
+ # Check for presence of 'AT' operator (CSEG AT addr)
+ if {[string tolower [lindex $expr 0]] != {at}} {
+ SyntaxError $lineNum $fileNum [mc "Missing `AT' operator"]
+ set discontinue 1
+ }
+ set expr [lreplace $expr 0 0]
+ }
}
- # Check for presence of 'AT' operator (CSEG AT addr)
- if {[string tolower [lindex $expr 0]] != {at}} {
- SyntaxError $lineNum $fileNum [mc "Missing `AT' operator"]
+ # Remove this line from the code listing
+ if {$discontinue} {
+ CodeListing::delete_line $idx
+ incr idx -1
continue
}
- set expr [lreplace $expr 0 0]
# Determinate, set and validate segment pointer
set value [ComputeExpr $expr]
@@ -947,9 +936,11 @@ namespace eval PreProcessor {
# Set pointer
set segment_pointer(cseg) $value
# Adjust code
- lappend DB_asm [list $lineNum [list {ORG} $value]]
- } {
+ lappend tmp_asm [list $lineNum $fileNum [list {ORG} $value]]
+ } else {
SyntaxError $lineNum $fileNum [mc "Invalid expression `%s'" $expr]
+ CodeListing::delete_line $idx
+ incr idx -1
}
# Line does not contain any of {CSEG DB DW}
@@ -960,13 +951,12 @@ namespace eval PreProcessor {
# Finalize code adjustment
append tmp_asm { }
- append tmp_asm $DB_asm
set asm $tmp_asm
}
## Reserve code memory (byte or word) -- directives 'DB' 'DW'
# -- auxiliary procedure for proc. 'code_segment'
- # This procedure writes result to NS variable 'DB_asm' or 'tmp_asm'
+ # This procedure writes result to NS variable 'tmp_asm'
# @parm String cmd - Line of source code adjusted by proc. 'split_line'
# @parm String directive - Directive name (one of {DB DW})
# @parm String idx - Source index (precompiled code list)
@@ -977,8 +967,7 @@ namespace eval PreProcessor {
variable fileNum ;# Number of the current file
variable selected_segment ;# Current memory segment (one of {cseg bseg dseg iseg xseg})
variable segment_pointer ;# Current memory segment pointer
- variable DB_asm ;# Tempotary asm code for creating code memory tables
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
# Determinate maximum value
if {$directive == {db}} {
@@ -987,7 +976,7 @@ namespace eval PreProcessor {
} elseif {$directive == {dw}} {
set directive_db 0
set max 65535
- } {
+ } else {
CompilationError $lineNum $fileNum "Unknown error 7"
return
}
@@ -1023,9 +1012,11 @@ namespace eval PreProcessor {
# Iterate over directive operands
set first_time 1
set undefined 0
+ set total_len 0
foreach opr $operands {
set undefined 0
set len -1
+
# Operand is a string
if {![isExpression $opr] && ([string index $opr 0] == {'}) && ([string index $opr end] == {'})} {
# Adjust operand
@@ -1052,33 +1043,27 @@ namespace eval PreProcessor {
continue
# Valid value
- } {
+ } else {
if {$first_time} {
set line [list [list $lineNum $fileNum "${label}DB $value"]]
- } {
+ } else {
set line [list [list $lineNum $fileNum [list DB $value]]]
}
set first_time 0
lappend values $value
}
- # Adjust precompiled code
- if {$segment_pointer(cseg) != {}} {
- append DB_asm { }
- append DB_asm $line
- } {
- append tmp_asm { }
- append tmp_asm $line
- }
incr len
+
+ # Adjust precompiled code
+ append tmp_asm { }
+ append tmp_asm $line
}
# Adjust code listing
CodeListing::db $idx $values
CodeListing::insert_empty_lines $idx $len
- incr idx $len
-
# Operand is a direct numerical value, expression, constant, label or variable
} else {
@@ -1093,7 +1078,7 @@ namespace eval PreProcessor {
set value $opr
# Invalid value
- } {
+ } else {
CompilationError $lineNum $fileNum [mc "Invalid expression `%s'" $opr]
continue
}
@@ -1116,20 +1101,23 @@ namespace eval PreProcessor {
if {$directive_db} {
if {$first_time} {
set line [list [list $lineNum $fileNum "${label}DB $value"]]
- } {
+ } else {
set line [list [list $lineNum $fileNum [list DB $value]]]
}
- CodeListing::db $idx $value
+
incr len
set first_time 0
+ # Adjust code listing
+ CodeListing::db $idx $value
+
# Two bytes (directive DW)
- } {
+ } else {
# Spilt value into high- and low-order bytes
if {$undefined} {
set H_value "(($value) / 256)"
set L_value "(($value) % 256)"
- } {
+ } else {
set H_value [expr {$value / 256}]
set L_value [expr {$value % 256}]
}
@@ -1138,35 +1126,34 @@ namespace eval PreProcessor {
[list $lineNum $fileNum "${label}DB {$H_value}"]\
[list $lineNum $fileNum [list {DB} $L_value]] \
]
- } {
+ } else {
set line [list \
[list $lineNum $fileNum [list {DB} $H_value]] \
[list $lineNum $fileNum [list {DB} $L_value]] \
]
}
+
+ incr len 2
set first_time 0
# Adjust code listing
CodeListing::db $idx [list $H_value $L_value]
CodeListing::insert_empty_lines $idx 1
-
- incr len 2
- incr idx $len
}
# Adjust precompiled code
- if {$segment_pointer(cseg) != {}} {
- append DB_asm { }
- append DB_asm $line
- } {
- append tmp_asm { }
- append tmp_asm $line
- }
+ append tmp_asm { }
+ append tmp_asm $line
}
+
+ incr len
+ incr total_len $len
}
CodeListing::insert_empty_lines $idx [expr {[llength $operands] - 1}]
- return $len
+
+ incr total_len -1
+ return $total_len
}
## Split the given line of code into label, command and argumet(s)
@@ -1176,7 +1163,7 @@ namespace eval PreProcessor {
# Determinate label
if {[regexp {^\w+:} $line label]} {
regsub {^\w+:\s*} $line {} line
- } {
+ } else {
set label {}
}
# If line contains only label -> return only label
@@ -1187,7 +1174,7 @@ namespace eval PreProcessor {
# Determinate command and argumet(s)
if {![regexp {^\s*\.?\w+} $line command]} {
set command {}
- } {
+ } else {
set command [string tolower [string trim $command]]
}
set argument [regsub {^[^\s]+\s*} $line {}]
@@ -1212,7 +1199,7 @@ namespace eval PreProcessor {
if {$instruction == {db}} {
set new_operands $operands
set operands {}
- } {
+ } else {
set new_operands {}
}
@@ -1221,6 +1208,7 @@ namespace eval PreProcessor {
# Fixed value (eg. 'A')
if {[isFixed $opr]} {
+ set char {}
set opr_val $opr
# Regular value
@@ -1229,14 +1217,14 @@ namespace eval PreProcessor {
set char [string index $opr 0]
if {$char == {#} || $char == {@} || $char == {/}} {
set opr [string replace $opr 0 0]
- } {
+ } else {
set char {}
}
- set opr_val $char
+ set opr_val {}
# Value is an expression
if {[isExpression $opr]} {
- append opr_val [ComputeExpr $opr {} $address]
+ append opr_val [ComputeExpr $opr $ignore_undefined $address]
# Value is bit addres represented by dot notation
} elseif {[regexp {^\w+\.\w+$} $opr]} {
@@ -1245,7 +1233,7 @@ namespace eval PreProcessor {
if {!$ignore_undefined} {
SyntaxError $lineNum $fileNum [mc "Expected bit address: %s" $opr]
}
- } {
+ } else {
set bitAddr [getBitAddr $opr $ignore_undefined]
if {$bitAddr == {}} {set bitAddr 0}
append opr_val $bitAddr
@@ -1282,33 +1270,44 @@ namespace eval PreProcessor {
}
# Adjust relative offset
- if {[string is digit -strict $opr_val] && $type == {code8}} {
- incr opr_val -$address
- incr opr_val -$instr_lenght
- if {($opr_val > 127) || ($opr_val < -128)} {
- incr opr_val -0x10000
+ if {[string is digit -strict $opr_val]} {
+ if {$type == {code8}} {
+ incr opr_val -$address
+ incr opr_val -$instr_lenght
if {($opr_val > 127) || ($opr_val < -128)} {
+ incr opr_val -0x10000
+ if {($opr_val > 127) || ($opr_val < -128)} {
+ if {!$ignore_undefined} {
+ SyntaxError $lineNum $fileNum \
+ [mc "Label is too far for 8-bit relative addressing.\nTry to disable peephole optimizations if they are on."]
+ }
+ set opr_val 0
+ }
+ }
+ if {$opr_val < 0} {
+ incr opr_val 0x100
+ }
+ } elseif {$type == {code11}} {
+ if {($opr_val & 0x0f800) != (($address + $instr_lenght) & 0x0f800)} {
if {!$ignore_undefined} {
- SyntaxError $lineNum $fileNum \
- [mc "Label is too far for 8-bit relative addressing.\nTry to disable peephole optimalizations if they are on."]
+ SyntaxError $lineNum $fileNum [mc "Operand value out of range: `%s' (`%s')" $opr $opr_val]
}
set opr_val 0
+ } else {
+ set opr_val [expr {$opr_val & 0x007ff}]
}
}
- if {$opr_val < 0} {
- incr opr_val 0x100
- }
}
}
# Adjust list of operands
- lappend new_operands $opr_val
+ lappend new_operands "${char}${opr_val}"
# Check for valid value range
if {$opr_val != {} && ![checkRange $opr_val $type]} {
if {!$ignore_undefined && [string is digit -strict $opr_val]} {
SyntaxError $lineNum $fileNum [mc "Operand value out of range: `%s' (`%s')" $opr $opr_val]
- } {
+ } else {
return {}
}
}
@@ -1321,8 +1320,8 @@ namespace eval PreProcessor {
## Finaly precompiled encapsulate code to the resulting form
# @return void
proc final_stage {} {
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable idx ;# Current position in asm list
@@ -1337,7 +1336,9 @@ namespace eval PreProcessor {
incr idx
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -1367,11 +1368,11 @@ namespace eval PreProcessor {
}
# Check for instruction validity
- } elseif {[lsearch -exact -ascii ${CompilerConsts::AllInstructions} $instruction] == -1} {
+ } elseif {[lsearch -exact -ascii ${::CompilerConsts::AllInstructions} $instruction] == -1} {
if {[string index $address end] == {:}} {
- SyntaxError $lineNum $fileNum [mc "Invalid label declaration: `%s'\n\tLabels can contain alfanumeric characters only and must not begin with a digit" $address]
- } {
- SyntaxError $lineNum $fileNum [mc "Unknown keyword: `%s'\n\t`%s' is neighter macro nor instruction nor directive" [lindex $address 0] [lindex $address 0]]
+ SyntaxError $lineNum $fileNum [mc "Invalid label declaration: `%s'\n\tLabels can contain alphanumeric characters only and must not begin with a digit" $address]
+ } else {
+ SyntaxError $lineNum $fileNum [mc "Unknown keyword: `%s'\n\t`%s' is neither macro nor instruction nor directive" [lindex $address 0] [lindex $address 0]]
}
continue
}
@@ -1416,7 +1417,7 @@ namespace eval PreProcessor {
$ignore_undefined \
]
# Register is regular number
- } {
+ } else {
set regAddr [COprToDec $opr0]
}
@@ -1427,7 +1428,7 @@ namespace eval PreProcessor {
$ignore_undefined \
]
# Bit is regular number
- } {
+ } else {
set bitNum [COprToDec $opr1]
}
@@ -1439,7 +1440,7 @@ namespace eval PreProcessor {
# Register is in high bit addressable area
if {$regAddr > 31 && $regAddr < 48} {
- return [expr {$regAddr - 32 + $bitNum}]
+ return [expr {($regAddr - 32) * 8 + $bitNum}]
# Register bit addressable SFR
} elseif {[lsearch -exact -ascii {128 136 144 152 160 168 176 184 208 224 240} $regAddr] != -1} {
return [expr {$regAddr + $bitNum}]
@@ -1458,7 +1459,7 @@ namespace eval PreProcessor {
variable fileNum ;# Number of the current file
# If the given operand is fixed string -> return it unchanged
- if {[lsearch -exact -ascii ${CompilerConsts::FixedOperands} [string tolower $operand]] != -1} {
+ if {[lsearch -exact -ascii ${::CompilerConsts::FixedOperands} [string tolower $operand]] != -1} {
return $operand
}
@@ -1466,10 +1467,23 @@ namespace eval PreProcessor {
set char [string index $operand 0]
if {$char == {#} || $char == {@} || $char == {/}} {
set operand [string replace $operand 0 0]
- } {
+ } else {
set char {}
}
+ # Handle prefix notation for hexadecimal numbers, like 0xfa
+ if {
+ [string index $operand 0] == {0}
+ &&
+ ([string index $operand 1] == {x} || [string index $operand 1] == {X})
+ } then {
+ set operand [string replace $operand 0 1]
+ if {![string is digit [string index $operand 0]]} {
+ set operand "0${operand}"
+ }
+ append operand {h}
+ }
+
# Determinate numeric base and adjust operand string
set base [string index $operand end]
set operand [string range $operand 0 {end-1}]
@@ -1481,17 +1495,17 @@ namespace eval PreProcessor {
# Convert and return
if {[NumSystem::isdec $operand]} {
return "$char$operand"
- } {
+ } else {
SyntaxError $lineNum $fileNum [mc "Invalid value: `%s'" "${char}${operand}"]
}
- # Value is charater
+ # Value is a charater
} elseif {$base == {'}} {
# Remove leading quote
if {[string index $operand 0] != {'}} {
SyntaxError $lineNum $fileNum [mc "Invalid value: `%s'" "${char}${operand}"]
return {}
- } {
+ } else {
set operand [string range $operand 1 end]
}
}
@@ -1503,7 +1517,7 @@ namespace eval PreProcessor {
if {[NumSystem::ishex $operand]} {
set operand [expr "0x$operand"]
return "$char$operand"
- } {
+ } else {
SyntaxError $lineNum $fileNum [mc "Invalid value: `%s'" "${operand}${base}"]
return {}
}
@@ -1512,7 +1526,7 @@ namespace eval PreProcessor {
if {[NumSystem::isbin $operand]} {
set operand [NumSystem::bin2dec $operand]
return "$char$operand"
- } {
+ } else {
SyntaxError $lineNum $fileNum [mc "Invalid value: `%s'" "${operand}${base}"]
return {}
}
@@ -1521,7 +1535,7 @@ namespace eval PreProcessor {
if {[NumSystem::isoct $operand]} {
set operand [NumSystem::oct2dec $operand]
return "$char$operand"
- } {
+ } else {
SyntaxError $lineNum $fileNum [mc "Invalid value: `%s'" "${operand}${base}"]
return {}
}
@@ -1530,7 +1544,7 @@ namespace eval PreProcessor {
if {[NumSystem::isoct $operand]} {
set operand [NumSystem::oct2dec $operand]
return "$char$operand"
- } {
+ } else {
SyntaxError $lineNum $fileNum [mc "Invalid value: `%s'" "${operand}${base}"]
return {}
}
@@ -1538,7 +1552,7 @@ namespace eval PreProcessor {
{'} { ;# From character
if {[string length $operand] != 0} {
set operand $char[character2number [subst -nocommands -novariables $operand]]
- } {
+ } else {
SyntaxError $lineNum $fileNum [mc "Invalid value: `%s'" $operand]
return {}
}
@@ -1546,7 +1560,7 @@ namespace eval PreProcessor {
{d} { ;# From decimal (no conversion)
if {[NumSystem::isdec $operand]} {
return "$char$operand"
- } {
+ } else {
SyntaxError $lineNum $fileNum [mc "Invalid value: `%s'" "${operand}${base}"]
return {}
}
@@ -1571,10 +1585,10 @@ namespace eval PreProcessor {
set operand [string tolower $operand]
# Fixed operand
- if {[lsearch -exact -ascii ${CompilerConsts::FixedOperands} $operand] != -1} {
+ if {[lsearch -exact -ascii ${::CompilerConsts::FixedOperands} $operand] != -1} {
if {$operand == $type} {
return 1
- } {
+ } else {
return 0
}
}
@@ -1583,7 +1597,7 @@ namespace eval PreProcessor {
set char [string index $operand 0]
if {$char == {#} || $char == {@} || $char == {/}} {
set operand [string trimleft $operand {#@/}]
- } {
+ } else {
set char {}
}
@@ -1607,7 +1621,11 @@ namespace eval PreProcessor {
}
# Check for allowed range
- if {$operand > $max || $operand < 0} {return 0} {return 1}
+ if {$operand > $max || $operand < 0} {
+ return 0
+ } else {
+ return 1
+ }
}
## Determinate whether the given string is an expression
@@ -1621,9 +1639,9 @@ namespace eval PreProcessor {
set expression [string trimleft $expression "\t "]
set expression [string trimright $expression "\t "]
- if {[regexp {[ \+\-\=<>\(\)\*/%]} $expression]} {
+ if {[regexp {[ \?\+\-\=<>\(\)\*/%]} $expression]} {
return 1
- } {
+ } else {
return 0
}
}
@@ -1633,9 +1651,9 @@ namespace eval PreProcessor {
# @return Bool - result (1 == is fixed; 0 == is not fixed)
proc isFixed {operand} {
set operand [string tolower $operand]
- if {[lsearch -exact -ascii ${CompilerConsts::FixedOperands} $operand] != -1} {
+ if {[lsearch -exact -ascii ${::CompilerConsts::FixedOperands} $operand] != -1} {
return 1
- } {
+ } else {
return 0
}
}
@@ -1653,7 +1671,7 @@ namespace eval PreProcessor {
# Check if the string starts with a digit or quote
if {[regexp {^(\d|')} $symbolic_name]} {
return 0
- } {
+ } else {
return 1
}
}
@@ -1668,7 +1686,7 @@ namespace eval PreProcessor {
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable check_sfr_usage;# Bool: Check for legal usage of SFR and SFB
- variable avaliable_SFR ;# List: Avaliable SFR and SFB on the target MCU
+ variable available_SFR ;# List: Available SFR and SFB on the target MCU
variable const_BIT ;# Array: Bit values -- ($const_BIT($bit_name) == $value)
variable const_CODE ;# Array: Constants defined by directive 'CODE'
@@ -1699,13 +1717,13 @@ namespace eval PreProcessor {
if {
([lsearch -exact -ascii $defined_LABEL $symbolic_name] == -1) &&
($symbolic_name != "\$")
- } {
+ } then {
continue
}
if {$symbolic_name == "\$"} {
set value $address
- } {
+ } else {
set value $labels($symbolic_name)
}
CodeListing::symbol_used $symbolic_name {label}
@@ -1737,9 +1755,9 @@ namespace eval PreProcessor {
if {
[lsearch -ascii -exact $::CompilerConsts::defined_SFR $symbolic_name] != -1
&&
- [lsearch -ascii -exact $avaliable_SFR $symbolic_name] == -1
- } {
- Warning $lineNum $fileNum [mc "Special function register \"%s\" is not avaliable on the target MCU" [string toupper $symbolic_name]]
+ [lsearch -ascii -exact $available_SFR $symbolic_name] == -1
+ } then {
+ Warning $lineNum $fileNum [mc "Special function register \"%s\" is not available on the target MCU" [string toupper $symbolic_name]]
}
}
@@ -1754,9 +1772,9 @@ namespace eval PreProcessor {
if {
[lsearch -ascii -exact $::CompilerConsts::defined_SFRBitArea $symbolic_name] != -1
&&
- [lsearch -ascii -exact $avaliable_SFR $symbolic_name] == -1
- } {
- Warning $lineNum $fileNum [mc "Special function bit \"%s\" is not avaliable on the target MCU" [string toupper $symbolic_name]]
+ [lsearch -ascii -exact $available_SFR $symbolic_name] == -1
+ } then {
+ Warning $lineNum $fileNum [mc "Special function bit \"%s\" is not available on the target MCU" [string toupper $symbolic_name]]
}
}
@@ -1771,7 +1789,7 @@ namespace eval PreProcessor {
set val [const_value $symbolic_name $lineNum]
if {$val == {}} {
break
- } {
+ } else {
CodeListing::symbol_used $symbolic_name {equset}
return $val
}
@@ -1789,19 +1807,19 @@ namespace eval PreProcessor {
return {}
}
- ## Perform peerhole optimalization
+ ## Perform peerhole optimization
# This function must be called between "parse_instructions" and "final_stage"
# @return void
- proc optimalization {} {
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ proc optimization {} {
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable idx ;# Current position in asm list
variable labels ;# Array: Values of defined labels ($labels($label) == $address)
variable defined_LABEL ;# List of defined labels
variable program_memory ;# String of booleans: Map of program memory usage
- variable optims ;# Number of performed optimalizations
+ variable optims ;# Number of performed optimizations
variable origin_d_addr ;# List: Addresses of static program blocks
# Iterate over the code
@@ -1810,7 +1828,9 @@ namespace eval PreProcessor {
for {set idx 0} {$idx < $asm_len} {incr idx} {
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -1876,7 +1896,7 @@ namespace eval PreProcessor {
} elseif {
[lindex $operand_types 0] != {code8} &&
[lindex $operand_types 0] != {code11} &&
- [lindex $operands_abs 0] < 2048
+ ($address & 0x0f800) == ([lindex $operands_abs 0] & 0x0f800)
} then {
set instruction {ajmp}
set operand_types {code11}
@@ -1888,7 +1908,7 @@ namespace eval PreProcessor {
## A)
if {[string is digit -strict [lindex $operands_abs 0]]} {
set diff [expr {$address - [lindex $operands_abs 0]}]
- } {
+ } else {
set diff 200 ;# Some value out of range [-126; 129]
}
if {$diff >= -126 && $diff <= 129} {
@@ -1906,7 +1926,7 @@ namespace eval PreProcessor {
{ajmp} { ;# AJMP code8 --> SJMP code8
if {[string is digit -strict [lindex $operands_abs 0]]} {
set diff [expr {$address - [lindex $operands_abs 0]}]
- } {
+ } else {
set diff 200 ;# Some value out of range [-126; 129]
}
if {$diff >= -126 && $diff <= 129} {
@@ -1915,7 +1935,11 @@ namespace eval PreProcessor {
}
}
{call} { ;# CALL code11 --> ACALL code11
- if {[lindex $operand_types 0] != {code11} && [lindex $operands_abs 0] < 2048} {
+ if {
+ [lindex $operand_types 0] != {code11}
+ &&
+ ($address & 0x0f800) == ([lindex $operands_abs 0] & 0x0f800)
+ } then {
set instruction {acall}
set operand_types {code11}
set bytes_saved 1
@@ -1935,7 +1959,7 @@ namespace eval PreProcessor {
[lindex $operands_abs 0] == 224
&&
[lindex $operand_types 0] == {data}
- } {
+ } then {
if {[lindex $operands_abs 1] != {A}} {
lset operands 0 A
lset operand_types 0 a
@@ -1946,7 +1970,7 @@ namespace eval PreProcessor {
[lindex $operands_abs 1] == 224
&&
[lindex $operand_types 1] == {data}
- } {
+ } then {
lset operands 1 A
lset operand_types 1 a
set bytes_saved 1
@@ -1955,7 +1979,7 @@ namespace eval PreProcessor {
}
if {$bytes_saved} {
- # Increment number of performed optimalizations
+ # Increment number of performed optimizations
incr optims
# Shift code
@@ -1995,8 +2019,8 @@ namespace eval PreProcessor {
## Evaluate and remove instructions
# @return void
proc parse_instructions {} {
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable idx ;# Current position in asm list
@@ -2027,7 +2051,9 @@ namespace eval PreProcessor {
incr idx
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -2042,7 +2068,7 @@ namespace eval PreProcessor {
## Conditionaly change program pointer
if {![regexp {^\s*\w+} $line first_field]} {
set first_field {}
- } {
+ } else {
set first_field [string trim $first_field]
}
if {$first_field == {ORG}} {
@@ -2055,15 +2081,27 @@ namespace eval PreProcessor {
## Determinate label
if {[regexp {^\w+:} $line label]} {
# Check for label validity
+ set lbl [string trimright $label {:}]
if {[regexp {^\w*:$} $label] && ![regexp {^\d} $label]} {
-
- set label [string trimright $label {:}]
- if {[isReservedKeyword $label]} {
- Warning $lineNum $fileNum [mc "Reserved keyword used as label"]
+ if {
+ [lsearch -exact -ascii ${::CompilerConsts::defined_SFR} $lbl] != -1
+ ||
+ [lsearch -exact -ascii ${::CompilerConsts::defined_progVectors} $lbl] != -1
+ ||
+ [lsearch -exact -ascii ${::CompilerConsts::defined_SFRBitArea} $lbl] != -1
+ ||
+ [lsearch -exact -ascii ${::CompilerConsts::FixedOperands} $lbl] != -1
+ } then {
+ SyntaxError $lineNum $fileNum [mc "Unable redefine constant: %s" $lbl]
+ } else {
+ set label $lbl
+ if {[isReservedKeyword $label]} {
+ Warning $lineNum $fileNum [mc "Reserved keyword used as label"]
+ }
+ lappend local_labels $label
}
- lappend local_labels $label
- } {
- SyntaxError $lineNum $fileNum [mc "Invalid label: `%s' \n\t(labels can contain only alfanumeric characters and must not begin with a digit)" $label]
+ } else {
+ SyntaxError $lineNum $fileNum [mc "Invalid label: `%s' \n\t(labels can contain only alphanumeric characters and must not begin with a digit)" $label]
}
# Remove label from the line
@@ -2080,7 +2118,7 @@ namespace eval PreProcessor {
## Determinate instruction
if {![regexp {^\s*\.?\w+} $line instruction]} {
set instruction {}
- } {
+ } else {
set instruction [string tolower [string trim $instruction]]
}
@@ -2090,7 +2128,7 @@ namespace eval PreProcessor {
if {$skip == {}} {
set instruction_len 0
SyntaxError $lineNum $fileNum [mc "Invalid expression `%s'" [regsub {^\s*\.?\w+\s*} $line {}]]
- } {
+ } else {
set instruction_len $skip
}
@@ -2105,7 +2143,7 @@ namespace eval PreProcessor {
# Regular instruction
} else {
# Check for instruction validity
- if {[lsearch -exact -ascii ${CompilerConsts::AllInstructions} $instruction] == -1} {
+ if {[lsearch -exact -ascii ${::CompilerConsts::AllInstructions} $instruction] == -1} {
lappend tmp_asm [list $lineNum $fileNum {C} $line]
continue
}
@@ -2181,19 +2219,31 @@ namespace eval PreProcessor {
}
## Determinate whether the given string is reserved keyword
- # @parm String string - string to evaluate
+ # @parm String string - String to evaluate
+ # @parm Bool symbols_too - Consider also special register names
# @return Bool - result (1 == is reserved; 0 == is not reserved)
- proc isReservedKeyword {string} {
+ proc isReservedKeyword {string {symbols_too 0}} {
set string [string tolower $string]
if {
- [lsearch -exact -ascii ${CompilerConsts::AllInstructions} $string] != -1
+ [lsearch -exact -ascii ${::CompilerConsts::AllInstructions} $string] != -1
||
- [lsearch -exact -ascii ${CompilerConsts::AllDirectives} $string] != -1
- } {
+ [lsearch -exact -ascii ${::CompilerConsts::AllDirectives} $string] != -1
+ ||
+ [lsearch -exact -ascii ${::CompilerConsts::FixedOperands} $string] != -1
+ } then {
return 1
- } {
+ } elseif {$symbols_too && (
+ [lsearch -exact -ascii ${::CompilerConsts::defined_SFR} $string] != -1
+ ||
+ [lsearch -exact -ascii ${::CompilerConsts::defined_progVectors} $string] != -1
+ ||
+ [lsearch -exact -ascii ${::CompilerConsts::defined_SFRBitArea} $string] != -1
+ )
+ } then {
+ return 1
+ } else {
return 0
}
}
@@ -2215,8 +2265,8 @@ namespace eval PreProcessor {
set list_of_labels [string tolower $list_of_labels]
foreach label $list_of_labels {
if {[lsearch -exact -ascii $defined_LABEL $label] != -1} {
- SyntaxError $lineNum $fileNum [mc "Label is already defined: `%s'" $label]
- } {
+ SyntaxError $lineNum $fileNum [mc "Label was already defined: `%s'" $label]
+ } else {
lappend defined_LABEL $label
set labels($label) $address
}
@@ -2241,7 +2291,7 @@ namespace eval PreProcessor {
set l [llength $operands]
for {set i 0} {$i < $l} {incr i} {
set o [lindex $operands $i]
- if {[lsearch -exact -ascii ${CompilerConsts::FixedOperands} [string tolower $o]] != -1} {
+ if {[lsearch -exact -ascii ${::CompilerConsts::FixedOperands} [string tolower $o]] != -1} {
set operands [lreplace $operands $i $i [string toupper $o]]
}
}
@@ -2262,7 +2312,7 @@ namespace eval PreProcessor {
set n [const_value $o $lineNum 1]
set operands [lreplace $operands $i $i $n]
- Notice $lineNum $fileNum [mc "Overwriting `%s' with `%s' (acording to your previous definition!)" [string toupper $o] [string toupper $n]]
+ Notice $lineNum $fileNum [mc "Overwriting `%s' with `%s' (according to your previous definition!)" [string toupper $o] [string toupper $n]]
}
}
@@ -2273,19 +2323,19 @@ namespace eval PreProcessor {
}
# Find instruction set for given instruction
- if {[lsearch -exact -ascii ${CompilerConsts::AllInstructions} $instruction] == -1} {
+ if {[lsearch -exact -ascii ${::CompilerConsts::AllInstructions} $instruction] == -1} {
CompilationError $lineNum $fileNum "Unknown error 3"
return {}
}
- set ins_def $CompilerConsts::InstructionDefinition($instruction)
+ set ins_def $::CompilerConsts::InstructionDefinition($instruction)
# Check for valid operands count
set max_oprs [lindex $ins_def 0]
if {[llength $operands] > $max_oprs} {
- SyntaxError $lineNum $fileNum [mc "Too many operands, %s can take only %s operand[expr {$max_oprs ? {} : {s}}]" $instruction $max_oprs]
+ SyntaxError $lineNum $fileNum [mc "Too many operands, %s can take only %s operand[expr {$max_oprs == 1 ? {} : {s}}]" $instruction $max_oprs]
return {}
} elseif {[llength $operands] < $max_oprs} {
- SyntaxError $lineNum $fileNum [mc "Too few operands, %s must take exactly %s operand[expr {$max_oprs ? {} : {s}}]" $instruction $max_oprs]
+ SyntaxError $lineNum $fileNum [mc "Too few operands, %s must take exactly %s operand[expr {$max_oprs == 1 ? {} : {s}}]" $instruction $max_oprs]
return {}
}
@@ -2330,7 +2380,7 @@ namespace eval PreProcessor {
$operands_i != {C}
&&
$operands_i != {/C}
- } {
+ } then {
incr i
continue
}
@@ -2361,7 +2411,7 @@ namespace eval PreProcessor {
# No matching operand set found -> error
if {!$match} {
- SyntaxError $lineNum $fileNum [mc "Invalid operand set: %s %s" $instruction [join $operands {,}]]
+ SyntaxError $lineNum $fileNum [mc "Invalid set of operands: %s %s" $instruction [join $operands {,}]]
return {}
}
@@ -2391,7 +2441,7 @@ namespace eval PreProcessor {
set operand [string tolower $operand]
# Fixed value
- if {[lsearch -exact -ascii ${CompilerConsts::FixedOperands} $operand] != -1} {
+ if {[lsearch -exact -ascii ${::CompilerConsts::FixedOperands} $operand] != -1} {
return [string toupper $operand]
}
@@ -2401,6 +2451,13 @@ namespace eval PreProcessor {
{^#.*$} { return {imm8 imm16} }
}
+ # determinate whether the instruction can changed content of PC
+ if {[lsearch {} $instruction] == -1} {
+ set no_branch 1
+ } else {
+ set no_branch 0
+ }
+
# Variable length operand (pseudo-instructions: "CALL <code>" and "JMP <code>")
if {$instruction == {jmp} || $instruction == {call}} {
# Value is an expression
@@ -2425,7 +2482,7 @@ namespace eval PreProcessor {
return {code16}
} elseif {(abs($address - $operand) > 126) || $instruction == {call}} {
return {code11}
- } {
+ } else {
return {code8}
}
@@ -2437,7 +2494,7 @@ namespace eval PreProcessor {
} elseif {[lsearch ${::CompilerConsts::defined_SFRBitArea} $operand] != -1} {
return {bit /bit}
- # Interrupt vector
+ # Address in program memory
} elseif {[lsearch ${::CompilerConsts::defined_progVectors} $operand] != -1} {
return {code16 code11 code8}
@@ -2450,11 +2507,12 @@ namespace eval PreProcessor {
## Expand macro instructions
# @return Bool - macro expanded
proc expand_macro_instructions {} {
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable macro ;# Array: Code of defined macro instructions
+ variable local_M_labels ;# Array of lists: Local labels in macros $local_M_labels($macro_name) == {integer label0 ... labelN}
variable defined_MACRO ;# List of defined macro instructions
variable idx ;# Current position in asm list
@@ -2478,7 +2536,9 @@ namespace eval PreProcessor {
incr idx
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -2499,7 +2559,7 @@ namespace eval PreProcessor {
}
if {![regexp {^\s*\.?\w+} $line instruction]} {
set instruction {}
- } {
+ } else {
set instruction [string tolower [string trim $instruction]]
}
regsub {^\.?\w+\s*} $line {} operands
@@ -2513,14 +2573,14 @@ namespace eval PreProcessor {
set repeat 1
# Get code of the macro
- set macro_code [getMacro $instruction [getOperands $operands 0]]
+ set macro_code [getMacro $instruction [getOperands $operands 1]]
if {$macro_code == {}} {continue}
# Adjust the precompiled code and code listing
if {$label != {}} {
lappend tmp_asm [list $lineNum $fileNum $label]
set del_line 0
- } {
+ } else {
set del_line 1
}
@@ -2541,11 +2601,11 @@ namespace eval PreProcessor {
return $repeat
}
- ## Debuging procedure
+ ## Debugging procedure
# Write current content of the precompiled code to stdout
# @return void
proc write_asm {} {
- variable asm ;# Resulting precompiled code
+ variable asm ;# Resulting pre-compiled code
puts ""
set idx -1
foreach line $asm {
@@ -2554,11 +2614,11 @@ namespace eval PreProcessor {
}
}
- ## Debuging procedure
+ ## Debugging procedure
# Write current content of the tempotary precompiled code to stdout
# @return void
proc write_tmp_asm {} {
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
puts ""
set idx -1
foreach line $tmp_asm {
@@ -2573,11 +2633,12 @@ namespace eval PreProcessor {
# @return List - code of the macro
proc getMacro {macro_name args} {
variable macro ;# Array: Code of defined macro instructions
+ variable local_M_labels ;# Array of lists: Local labels in macros $local_M_labels($macro_name) == {integer label0 ... labelN}
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
- # Adjust list of armuments
- set args [join $args]
+ # Adjust list of arguments
+ set args [lindex $args 0]
# Local variables
set new_operands {} ;# Instruction operands
@@ -2585,34 +2646,57 @@ namespace eval PreProcessor {
# Determinate code of the macro and its operands
set macro_code $macro($macro_name)
- set m_args [lindex $macro_code 0]
+ set m_pars [lindex $macro_code 0]
set macro_code [lindex $macro_code 1]
# Check for valid number of arguments
- set arg_len_diff [expr {[llength $args] - [llength $m_args]}]
+ set arg_len_diff [expr {[llength $args] - [llength $m_pars]}]
if {$arg_len_diff < 0} {
set arg_len_diff [expr {$arg_len_diff * -1}]
- SyntaxError $lineNum $fileNum [mc "Too few arguments, %s argument(s) missing: %s ..." $arg_len_diff $macro_name]
+ SyntaxError $lineNum $fileNum [mc "Too few arguments, %d argument(s) missing for %s ..." $arg_len_diff $macro_name]
return {}
} elseif {$arg_len_diff > 0} {
- SyntaxError $lineNum $fileNum [mc "Too many arguments, $s extra argument(s)" $arg_len_diff]
+ SyntaxError $lineNum $fileNum [mc "Too many arguments, %d extra argument(s)" $arg_len_diff]
return {}
}
- # Substitute macro arguments
+ # Increment counter of expansions of this macro
+ lset local_M_labels($macro_name) 0 [expr {1 + [lindex $local_M_labels($macro_name) 0]}]
+
+ # Substitute macro parametrs
foreach line $macro_code {
set new_operands {}
+ # Determinate label
+ if {![regexp {^(\?\?)?[A-Za-z_][^\s:]*:\s*} $line label]} {
+ set label {}
+ } else {
+ regsub {^(\?\?)?[A-Za-z_][^\s:]:*\s*} $line {} line
+ regsub -all {\s+} $label {} label
+ set label [string trimright $label {:}]
+ if {[lsearch -ascii -exact $local_M_labels($macro_name) $label] != -1} {
+ set label "${macro_name}_[lindex $local_M_labels($macro_name) 0]__${label}"
+ }
+ }
+
# Determinate instruction and operands
if {![regexp {^\.?\w+\s*} $line instruction]} {
set instruction {}
+ } else {
+ regsub -all {\s+} $instruction {} instruction
}
regsub {^\.?\w+\s*} $line {} operands
if {$operands == {}} {
lappend result $instruction
continue
}
- set operands [getOperands $operands 0]
+
+ if {[lsearch -ascii -exact {if ifn ifdef ifndef elseif elseifn elseifdef elseifndef} [string tolower $instruction]] == -1} {
+ set operands [getOperands $operands 0]
+ set if_statement 0
+ } else {
+ set if_statement 1
+ }
# Perform substitution
foreach opr $operands {
@@ -2623,25 +2707,43 @@ namespace eval PreProcessor {
($char == {/}) ||
($char == {#}) ||
($char == {@})
- } {
+ } then {
set opr [string range $opr 1 end]
- } {
+ } else {
set char {}
}
- # Find operand in macro armunets
- set idx [lsearch -exact -ascii $m_args $opr]
- if {$idx != -1} {
- set opr [lindex $args $idx]
+ # Find operand in macro parameters
+ set new_opr [list]
+ regsub -all {[\(\)]} $opr { & } opr
+ foreach o $opr {
+ set idx [lsearch -exact -ascii $m_pars $o]
+ if {$idx != -1} {
+ set o [lindex $args $idx]
+
+ if {[isReservedKeyword [lindex $m_pars $idx] 1]} {
+ Warning $lineNum $fileNum [mc "Reserved keyword substituted with macro argument: %s --> %s" [lindex $m_pars $idx] [lindex $args $idx]]
+ }
+ }
+
+ append new_opr $o { }
}
- lappend new_operands "$char$opr"
+ lappend new_operands "$char$new_opr"
}
# Recomposite line of macro instruction code
- set operands [join $new_operands {, }]
+ if {$if_statement} {
+ set operands [join $new_operands { }]
+ } else {
+ set operands [join $new_operands {, }]
+ }
append instruction "\t"
append instruction $operands
+
+ if {$label != {}} {
+ set instruction "${label}:\t${instruction}"
+ }
lappend result $instruction
}
@@ -2660,16 +2762,16 @@ namespace eval PreProcessor {
set simple_operands $operands ;# Original string without strings and chars
set result {} ;# Resulting list
- # Convert strings and quoted charaters to underscores
- while 1 {
+ # Convert strings and quoted characters to underscores
+ while {1} {
if {![regexp {'[^']*'} $simple_operands str]} {break}
set padding [string repeat {_} [string length $str]]
regsub {'[^']*'} $simple_operands $padding simple_operands
}
- # Determinate oprands
- while 1 {
+ # Determinate operands
+ while {1} {
set idx [string first {,} $simple_operands]
if {$idx == -1} {break}
@@ -2688,7 +2790,7 @@ namespace eval PreProcessor {
lappend result $operands
if {$keep_case} {
return $result
- } {
+ } else {
return [string tolower $result]
}
}
@@ -2696,11 +2798,12 @@ namespace eval PreProcessor {
## Parse and remove definitions of macro instructions
# @return void
proc define_macro_instructions {} {
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable macro ;# Array: Code of defined macro instructions
+ variable local_M_labels ;# Array of lists: Local labels in macros $local_M_labels($macro_name) == {integer label0 ... labelN}
variable defined_MACRO ;# List of defined macro instructions
variable idx ;# Current position in asm list
variable macro_name_to_append ;# Name of currently defined macro instruction
@@ -2710,20 +2813,21 @@ namespace eval PreProcessor {
set idx -1
# Local variables
- set Macro 0 ;# Bool: definition opened
- set Exitm 0 ;# Bool: Definition terminated by directive 'EXITM'
- set NoMacro 0 ;# Definition failed
- set del_line 1 ;# Bool: remove this line
- set macro_name {} ;# Name of the macro
- set macro_args {} ;# List of arguments for the macro
- set rept_macro 0 ;# Bool: repeat macro starts
+ set Macro 0 ;# Bool: definition opened
+ set NoMacro 0 ;# Definition failed
+ set del_line 1 ;# Bool: remove this line
+ set macro_name {} ;# Name of the macro
+ set macro_params {} ;# List of the macro parameters
+ set rept_macro 0 ;# Bool: repeat macro starts
# Iterate over the code
foreach line $asm {
incr idx
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -2740,12 +2844,12 @@ namespace eval PreProcessor {
# Spilt line into first 2 separate fields
if {![regexp {^\s*\.?\w+} $line field0]} {
set field0 {}
- } {
+ } else {
set field0 [string trim $field0]
}
if {![regexp {^\s*\.?\w+:?\s+\.?\w+} $line field1]} {
set field1 {}
- } {
+ } else {
regexp {\.?\w+$} $field1 field1
}
set field0_l [regsub {^\.} [string tolower $field0] {}]
@@ -2755,17 +2859,17 @@ namespace eval PreProcessor {
if {$field0_l == {rept} || $field0_l == {times}} {
if {$Macro} {
SyntaxError $lineNum $fileNum \
- [mc "Cannot define macro inside anoner one -- macro processing failed"]
- } {
- regsub {^\s*\.?\w+\s*} $line {} macro_args
- set macro_args [ComputeExpr $macro_args]
- if {$macro_args == {}} {
- SyntaxError $lineNum $fileNum [mc "Missign number of repeats"]
+ [mc "Cannot define macro inside another one -- macro processing failed"]
+ } else {
+ regsub {^\s*\.?\w+\s*} $line {} macro_params
+ set macro_params [ComputeExpr $macro_params]
+ if {$macro_params == {}} {
+ SyntaxError $lineNum $fileNum [mc "Missing number of repeats"]
set NoMacro 1
- } elseif {$macro_args < 0} {
+ } elseif {$macro_params < 0} {
Warning $lineNum $fileNum [mc "Number of repeats is lower than zero"]
set NoMacro 1
- } elseif {$macro_args == 0} {
+ } elseif {$macro_params == 0} {
Notice $lineNum $fileNum [mc "Zero number of repeats"]
set NoMacro 1
}
@@ -2781,69 +2885,66 @@ namespace eval PreProcessor {
} elseif {$field1_l == {macro}} {
if {$Macro} {
SyntaxError $lineNum $fileNum \
- [mc "Cannot define macro inside anoner one -- macro processing failed"]
- } {
- # Determinate name and arguments
- regsub {^\w+\s+\.?\w+\s*} $line {} macro_args
- set macro_args [getOperands $macro_args 0]
+ [mc "Cannot define macro inside another one -- macro processing failed"]
+ } else {
+ # Determinate name and parameters
+ regsub {^\w+\s+\.?\w+\s*} $line {} macro_params
+ set macro_params [getOperands $macro_params 0]
set macro_name $field0_l
+ foreach parm $macro_params {
+ if {[isReservedKeyword $parm 1]} {
+ Warning $lineNum $fileNum [mc "Reserved keyword used as macro parameter: %s in macro %s" $parm $macro_name]
+ }
+ }
+
# Check for validity of the name
- if {
- ([lsearch -exact -ascii ${CompilerConsts::AllInstructions} $macro_name] != -1)
- ||
- ([lsearch -exact -ascii ${CompilerConsts::AllDirectives} $macro_name] != -1)
- } {
+ if {[isReservedKeyword $macro_name]} {
# Invalid name
SyntaxError $lineNum $fileNum [mc "Macro name is reserved keyword: %s" $macro_name]
set NoMacro 1
- } {
+ } else {
+ # Check for validity of the name (again, but invoke only warning this time)
+ if {[isReservedKeyword $macro_name 1]} {
+ # Invalid name
+ Warning $lineNum $fileNum [mc "Macro name is reserved keyword: %s" $macro_name]
+ set NoMacro 1
+ }
# Valid name
if {[lsearch -exact -ascii $defined_MACRO $macro_name] != -1} {
SyntaxError $lineNum $fileNum [mc "Macro `%s' is already defined" $macro_name]
set NoMacro 1
- } {
+ } else {
set macro_name_to_append $macro_name
- set macro($macro_name) {}
+ set macro($macro_name) [list]
+ set local_M_labels($macro_name) [list 0]
}
set Macro 1
}
}
- # Exit macro definition
- } elseif {$field0_l == {exitm}} {
- if {!$Macro} {
- Warning $lineNum $fileNum [mc "Unable to exit macro, no macro is opened"]
- }
- set Exitm 1
- set rept_macro 0
-
- # Directive takes no arguments
- if {[string length $field1_l]} {
- Warning $lineNum $fileNum [mc "Directive %s takes no arguments" [string toupper $field0_l]]
- }
-
# Close macro definition
} elseif {$field0_l == {endm}} {
# No macro was opened
if {!$Macro} {
SyntaxError $lineNum $fileNum [mc "Unable to close macro, no macro is opened"]
# Close macro
- } {
+ } else {
if {$rept_macro} {
set line $macro($macro_name)
set macro($macro_name) [list]
- for {set i 0} {$i < $macro_args} {incr i} {
+ set local_M_labels($macro_name) [list 0]
+ for {set i 0} {$i < $macro_params} {incr i} {
set macro($macro_name) [concat $macro($macro_name) $line]
}
- set macro_args {}
+ set macro_params {}
set del_line 0
lappend tmp_asm [list $lineNum $fileNum $macro_name]
}
- if {!($Exitm || $NoMacro)} {
- set macro($macro_name) [list $macro_args $macro($macro_name)]
+ if {!$NoMacro} {
+ set macro($macro_name) [list $macro_params $macro($macro_name)]
regsub -all {\s+} $macro($macro_name) { } macro($macro_name)
regsub -all "\\\{ " $macro($macro_name) "\{" macro($macro_name)
@@ -2853,7 +2954,6 @@ namespace eval PreProcessor {
# Reset some local variables
set Macro 0
- set Exitm 0
set NoMacro 0
set rept_macro 0
@@ -2866,20 +2966,26 @@ namespace eval PreProcessor {
} else {
# Part of macro definition
if {$Macro} {
- if {[regexp {^\w+:} $line]} {
- Warning $lineNum $fileNum [mc "Bad layout: Macros cannot contain labels -- label deleted"]
- regsub {^\w+:\s*} $line {} line
- }
- if {!($Exitm || $NoMacro)} {
- lappend macro($macro_name) $line
+ # Register local label in the macro
+ if {$field0_l == {local}} {
+ if {[regexp {^\w+$} $field1_l]} {
+ lappend local_M_labels($macro_name) $field1_l
+ } else {
+ SyntaxError $lineNum $fileNum [mc "Invalid label specification: ``%s''" $field0_l]
+ }
+ # Append the line to the currenly opened macro
+ } else {
+ if {!$NoMacro} {
+ lappend macro($macro_name) $line
+ }
}
# Common line
- } {
+ } else {
if {$field0_l == {macro}} {
SyntaxError $lineNum $fileNum [mc "Missing name of macro"]
- } elseif {[regexp {^\s*\w+:} $line] && ($field1_l == {endm} || $field1_l == {exitm})} {
- SyntaxError $lineNum $fileNum [mc "Labels are not allowed before directives ENDM and EXITM"]
- } {
+ } elseif {[regexp {^\s*\w+:} $line] && ($field1_l == {endm})} {
+ SyntaxError $lineNum $fileNum [mc "Labels are not allowed before directives ENDM"]
+ } else {
lappend tmp_asm [list $lineNum $fileNum $line]
}
set del_line 0
@@ -2902,8 +3008,8 @@ namespace eval PreProcessor {
# @return Bool - code included
proc include_directive {dir} {
variable included_files ;# List: Unique unsorted list of included files
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable idx ;# Current position in asm list
@@ -2921,7 +3027,9 @@ namespace eval PreProcessor {
set line_org $line
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -2941,14 +3049,14 @@ namespace eval PreProcessor {
regsub {^\s*\w+:\s*} $line {} line
set label [string trimleft $label " \t"]
set label [string trimright $label " \t"]
- } {
+ } else {
set label {}
}
# Determinate directive
if {![regexp {^\s*\.?\w+} $line directive]} {
set directive {}
- } {
+ } else {
set directive [string trim $directive]
}
set directive_l [string tolower $directive]
@@ -2958,7 +3066,7 @@ namespace eval PreProcessor {
regsub {^\s*\.?\w+} $line {} file_name
regsub {^\s+} $file_name {} file_name
if {![string length $file_name]} {
- SyntaxError $lineNum $fileNum [mc "Missing filename"]
+ SyntaxError $lineNum $fileNum [mc "Missing file name"]
}
set asm [lreplace $asm $idx $idx [list $lineNum $fileNum $label]]
@@ -2967,7 +3075,7 @@ namespace eval PreProcessor {
set file_name [regsub -nocase -- {^[\s ]*\$include[\s ]*} $file_name {}]
set file_name [string range $file_name 1 end-1]
if {![string length $file_name]} {
- SyntaxError $lineNum $fileNum [mc "Missing filename"]
+ SyntaxError $lineNum $fileNum [mc "Missing file name"]
}
set asm [lreplace $asm $idx $idx [list $lineNum $fileNum $label]]
@@ -2984,7 +3092,7 @@ namespace eval PreProcessor {
([string index $file_name 0] == "\"" && [string index $file_name end] == "\"")
||
([string index $file_name 0] == {'} && [string index $file_name end] == {'})
- } {
+ } then {
set file_name [string range $file_name 1 end-1]
}
set file_name [string trim $file_name]
@@ -3036,7 +3144,7 @@ namespace eval PreProcessor {
proc getFile {dir file file_number} {
variable fileNum ;# Number of the current file
variable lineNum ;# Number of the current line
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
set tmp_asm {}
@@ -3044,13 +3152,13 @@ namespace eval PreProcessor {
if {[string index $file 0] == {'}} {
if {[string index $file end] != {'}} {
SyntaxError $lineNum $fileNum [mc "Invalid expression: `%s'" $file]
- } {
+ } else {
set file [string range $file 1 {end-1}]
}
} elseif {[string index $file 0] == "\""} {
if {[string index $file end] != "\""} {
SyntaxError $lineNum $fileNum [mc "Invalid expression: `%s'" $file]
- } {
+ } else {
set file [string range $file 1 {end-1}]
}
}
@@ -3061,10 +3169,10 @@ namespace eval PreProcessor {
set file [open $file r]
set data [read $file]
close $file
- }]} {
+ }]} then {
CompilationError $lineNum $fileNum [mc "Unable to open file: %s" $file]
return {}
- } {
+ } else {
# Any EOL to LF
regsub -all {\r\n?} $data "\n" data
@@ -3078,7 +3186,7 @@ namespace eval PreProcessor {
return $tmp_asm
}
# File does not exist
- } {
+ } else {
CompilationError $lineNum $fileNum [mc "File not found: %s" $file]
return {}
}
@@ -3087,7 +3195,7 @@ namespace eval PreProcessor {
## Parse and remove directive(s) 'END'
# @return void
proc end_of_code {} {
- variable asm ;# Resulting precompiled code
+ variable asm ;# Resulting pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable idx ;# Current position in asm list
@@ -3104,7 +3212,9 @@ namespace eval PreProcessor {
incr idx
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -3117,20 +3227,23 @@ namespace eval PreProcessor {
set line [lindex $line 2]
# Skip lines without word 'END'
- if {![regexp -nocase {\.?end} $line]} {
+ if {![regexp -nocase {end} $line]} {
continue
}
+ regsub {\s*;.*$} $line {} line
+ regsub -all {:} $line {: } line
+
# Determinate 1st and 2nd field of the line
- if {![regexp {^\s*\.?\w+} $line field0]} {
+ if {![regexp {^\s*[^\s]+} $line field0]} {
set field0 {}
- } {
+ } else {
set field0 [string trim $field0]
}
- if {![regexp {^\s*\.?\w+\s+\.?\w+} $line field1]} {
+ if {![regexp {^\s*[^\s]+\s+[^\s]+} $line field1]} {
set field1 {}
- } {
- regexp {\.?\w+$} $field1 field1
+ } else {
+ regexp {[^\s]+$} $field1 field1
}
set field0 [string tolower [regsub {^\.} $field0 {}]]
set field1 [string tolower [regsub {^\.} $field1 {}]]
@@ -3145,14 +3258,14 @@ namespace eval PreProcessor {
[regexp {^\w+:$} $field0]
&&
($field1 == {end})
- } {
+ } then {
# Determinate content of the last line of the code (that label)
if {![regexp {^\w+:$} $field0 last_line]} {
set last_line {}
}
# Check if the line does not contain anything except the label and 'END'
- regsub {^\w+:\s*} $line {} line
+ regsub {^\s*\w+:\s*} $line {} line
set line [string tolower $line]
if {$line != {end}} {
SyntaxError $lineNum $fileNum [mc "Extra symbols after `END' directive"]
@@ -3166,13 +3279,15 @@ namespace eval PreProcessor {
# Directive 'end' detected -> adjust the code
if {$end} {
set asm [lreplace $asm $idx end]
+ set preserve_current_line 0
if {$last_line != {}} {
lappend asm [list $lineNum $fileNum $last_line]
+ set preserve_current_line 1
}
- CodeListing::end_directive $idx
- incr idx
+ CodeListing::end_directive $idx $preserve_current_line
+
# Directive 'end' not found -> invoke warning
- } {
+ } else {
Warning 0 0 [mc "Missing `END' directive"]
}
}
@@ -3180,14 +3295,14 @@ namespace eval PreProcessor {
## Parse and remove directive(s) 'ORG' and reorganize the current code
# @return void
proc origin_directive {} {
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable idx ;# Current position in asm list
variable defined_LABEL ;# List of defined labels
variable labels ;# Array: Values of defined labels ($labels($label) == $address)
- variable ErrorAtLine ;# Bool: Error occured on the current line
+ variable ErrorAtLine ;# Bool: Error occurred on the current line
variable origin_d_addr ;# List: Addresses of static program blocks
# Reset NS variables
@@ -3209,7 +3324,9 @@ namespace eval PreProcessor {
set ErrorAtLine 0
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -3239,7 +3356,7 @@ namespace eval PreProcessor {
# Directive ORG detected
if {![regexp {^\s*\.?\w+} $line field0]} {
set field0 {}
- } {
+ } else {
set field0 [string trim $field0]
}
if {[regsub {^\.} $field0 {}] == {org}} {
@@ -3250,7 +3367,7 @@ namespace eval PreProcessor {
if {$line == {}} {
SyntaxError $lineNum $fileNum [mc "Missing address"]
set error 1
- } {
+ } else {
set value [ComputeExpr $line]
}
@@ -3262,7 +3379,7 @@ namespace eval PreProcessor {
SyntaxError $lineNum $fileNum [mc "Label already defined: `%s'" $label]
set error 1
}
- } {
+ } else {
SyntaxError $lineNum $fileNum [mc "Invalid label: `%s'" $label]
set error 1
}
@@ -3292,7 +3409,7 @@ namespace eval PreProcessor {
set last_value $value
# Directive ORG wasn't detected
- } {
+ } else {
lappend tmp_asm [list $lineNum $fileNum $line]
}
}
@@ -3313,6 +3430,7 @@ namespace eval PreProcessor {
set organization [lsort -index 0 -integer $organization]
set last_line {} ;# Last line number
+ set last_file {} ;# Last file number
set last_addr {} ;# Last address or origin
set new_organization {} ;# New organization map
@@ -3368,7 +3486,7 @@ namespace eval PreProcessor {
# @parm Bool first - match the first
# @return Int - list index
proc lineNum2idx {line_number file_number first} {
- variable asm ;# Resulting precompiled code
+ variable asm ;# Resulting pre-compiled code
set idx -1
set ln 0
@@ -3387,7 +3505,7 @@ namespace eval PreProcessor {
}
if {$idx < 0} {
return 0
- } {
+ } else {
return $idx
}
}
@@ -3400,8 +3518,8 @@ namespace eval PreProcessor {
## Convert the current code into numbered list (see proc. 'compile')
# @return void
proc line_numbers {} {
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
@@ -3422,7 +3540,9 @@ namespace eval PreProcessor {
incr idx
incr lineNum
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -3440,7 +3560,7 @@ namespace eval PreProcessor {
}
## Evaluate and remove directives related to:
- # - Donditional compilation (IF, ELSE, ENDIF) (group 0)
+ # - Conditional compilation (IF, ELSE, ENDIF) (group 0)
# - Code listing enable/disable (LIST, NOLIST) (group 1)
# - Active bank selection (USING) (group 2)
# - Data memory segment selection (BSEG, DSEG, ISEG, XSEG) (group 3)
@@ -3450,9 +3570,9 @@ namespace eval PreProcessor {
# @parm Bool ignore_undefined - Ignore undefined symbolic names
# @return Bool - Anything expanded
proc parse_Consts_and_ConditionalCompilation {groups ignore_undefined} {
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
- variable ErrorAtLine ;# Bool: Error occured on the current line
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
+ variable ErrorAtLine ;# Bool: Error occurred on the current line
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable idx ;# Current position in asm list
@@ -3460,6 +3580,8 @@ namespace eval PreProcessor {
variable memory_reservation_map ;# Array: memory reservation map (see code)
variable defined_SET ;# List of variables defined by 'SET'
variable const_SET ;# Array: Constants defined by directive 'CODE'
+ variable selected_segment ;# Current memory segment (one of {cseg bseg dseg iseg xseg})
+ variable segment_pointer ;# Current memory segment pointer
# Reset NS variables
set idx -1
@@ -3482,7 +3604,9 @@ namespace eval PreProcessor {
}
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -3497,7 +3621,7 @@ namespace eval PreProcessor {
set line [lindex $line 2]
regsub -nocase -- {if\(} $line {if (} line ;# Make construction "IF(something)" valid
# Final level pass
- } {
+ } else {
set line [lindex $line 3]
}
@@ -3507,7 +3631,7 @@ namespace eval PreProcessor {
# Determinate 1st field of the line
if {![regexp {^\s*\.?\w+:?} $line line_first_field]} {
set line_first_field {}
- } {
+ } else {
set line_first_field [string trim $line_first_field]
}
set directive0 [string tolower $line_first_field]
@@ -3516,7 +3640,7 @@ namespace eval PreProcessor {
# Determinate 2nd field of the line
if {![regexp {^\s*\.?\w+:?\s*\.?\w+} $line directive1]} {
set directive1 {}
- } {
+ } else {
regsub {^\s*\.?\w+:?\s*} $directive1 {} directive1
set directive1 [string trim $directive1]
}
@@ -3527,67 +3651,67 @@ namespace eval PreProcessor {
# Constant definition (SET EQU BIT ...) without constant to define (syntax error)
if {
- [lindex $groups 4] && $Enable &&
- ([lsearch -exact -ascii ${CompilerConsts::ConstDefinitionDirectives} $directive0] != -1)
- } {
- if {[regexp {^\s*\.?\w+\s+\w+\s*\,\s*.+$} $line]} {
- Warning $lineNum $fileNum [mc "This formulation is deprecated, consider usage of \"<Const> <Directive> <Value>\" instead"]
-
- set line_expr {}
- regsub {^\s*\.?\w+\s+\w+\s*\,\s*} $line {} line_expr
- set line_aux $directive1
- append line_aux { } $directive0 { } $line_expr
-
- set loc_result [define_const $directive0 $line_aux $idx $ignore_undefined]
- if {$loc_result == 2} {
- lappend tmp_asm [list $lineNum $fileNum $line]
- set deleteLine 0
- } elseif {$loc_result == 0} {
- set fin_result 1
- }
- } {
- SyntaxError $lineNum $fileNum [mc "Missing name of constant to define"]
- }
+ [lindex $groups 4] && $Enable &&
+ ([lsearch -exact -ascii ${::CompilerConsts::ConstDefinitionDirectives} $directive0] != -1)
+ } then {
+ if {[regexp {^\s*\.?\w+\s+\w+\s*\,\s*.+$} $line]} {
+ Warning $lineNum $fileNum [mc "This formulation is deprecated, consider usage of \"<Const> <Directive> <Value>\" instead"]
- # Constant definition (SET EQU BIT ...)
- } elseif {
- [lindex $groups 4] && $Enable &&
- ([lsearch -exact -ascii ${CompilerConsts::ConstDefinitionDirectives} $directive1] != -1)
- } {
- set loc_result [define_const $directive1 $line $idx $ignore_undefined]
+ set line_expr {}
+ regsub {^\s*\.?\w+\s+\w+\s*\,\s*} $line {} line_expr
+ set line_aux $directive1
+ append line_aux { } $directive0 { } $line_expr
+
+ set loc_result [define_const $directive0 $line_aux $idx $ignore_undefined]
if {$loc_result == 2} {
lappend tmp_asm [list $lineNum $fileNum $line]
set deleteLine 0
} elseif {$loc_result == 0} {
set fin_result 1
}
+ } else {
+ SyntaxError $lineNum $fileNum [mc "Missing name of constant to define"]
+ }
+
+ # Constant definition (SET EQU BIT ...)
+ } elseif {
+ [lindex $groups 4] && $Enable &&
+ ([lsearch -exact -ascii ${::CompilerConsts::ConstDefinitionDirectives} $directive1] != -1)
+ } then {
+ set loc_result [define_const $directive1 $line $idx $ignore_undefined]
+ if {$loc_result == 2} {
+ lappend tmp_asm [list $lineNum $fileNum $line]
+ set deleteLine 0
+ } elseif {$loc_result == 0} {
+ set fin_result 1
+ }
# Listing control (LIST, NOLIST)
} elseif {
- [lindex $groups 1] && (
- ($directive0 == {list}) ||
- ($directive0 == {nolist}) ||
- ($directive1 == {list} && [regexp {^\w+:$} $directive0 label]) ||
- ($directive1 == {nolist} && [regexp {^\w+:$} $directive0 label])
- )
- } {
- # Warning messages
- if {($directive0 == {list} || $directive0 == {nolist}) && [string length $directive1]} {
- Warning $lineNum $fileNum [mc "Directive %s takes no arguments" [string toupper $directive0]]
- } elseif {($directive1 == {list} || $directive1 == {nolist}) && [string length [regsub {^\s*\.?\w+:?\s+\.?\w+} $line {}]]} {
- Warning $lineNum $fileNum [mc "Directive %s takes no arguments" [string toupper $directive1]]
- }
+ [lindex $groups 1] && (
+ ($directive0 == {list}) ||
+ ($directive0 == {nolist}) ||
+ ($directive1 == {list} && [regexp {^\w+:$} $directive0 label]) ||
+ ($directive1 == {nolist} && [regexp {^\w+:$} $directive0 label])
+ )
+ } then {
+ # Warning messages
+ if {($directive0 == {list} || $directive0 == {nolist}) && [string length $directive1]} {
+ Warning $lineNum $fileNum [mc "Directive %s takes no arguments" [string toupper $directive0]]
+ } elseif {($directive1 == {list} || $directive1 == {nolist}) && [string length [regsub {^\s*\.?\w+:?\s+\.?\w+} $line {}]]} {
+ Warning $lineNum $fileNum [mc "Directive %s takes no arguments" [string toupper $directive1]]
+ }
- if {($directive0 == {nolist}) || ($directive1 == {nolist})} {
- CodeListing::directive_nolist $idx
- } {
- CodeListing::directive_list $idx
- }
+ if {($directive0 == {nolist}) || ($directive1 == {nolist})} {
+ CodeListing::directive_nolist $idx
+ } else {
+ CodeListing::directive_list $idx
+ }
- if {($label != {}) && $Enable} {
- lappend tmp_asm [list $lineNum $fileNum $label]
- set deleteLine 0
- }
+ if {($label != {}) && $Enable} {
+ lappend tmp_asm [list $lineNum $fileNum $label]
+ set deleteLine 0
+ }
# Active bank selection directive -- in 1st field (USING)
} elseif {[lindex $groups 2] && $Enable && ($directive0 == {using})} {
@@ -3603,28 +3727,28 @@ namespace eval PreProcessor {
# Active bank selection directive -- in 2nd field (USING)
} elseif {
- [lindex $groups 2] && ($directive1 == {using}) && $Enable
- &&
- ([regexp {^\w+:$} $directive0 label])
- } {
- set loc_result [define_active_bank \
- [regsub {^\w+:\s*\.?\w+\s*} $line {}] $ignore_undefined \
- ]
- set deleteLine 0
- if {$loc_result == 2} {
- lappend tmp_asm [list $lineNum $fileNum $line]
- } elseif {$loc_result == 0} {
- lappend tmp_asm [list $lineNum $fileNum $label]
- set fin_result 1
- } else {
- lappend tmp_asm [list $lineNum $fileNum $label]
- }
+ [lindex $groups 2] && ($directive1 == {using}) && $Enable
+ &&
+ ([regexp {^\w+:$} $directive0 label])
+ } then {
+ set loc_result [define_active_bank \
+ [regsub {^\w+:\s*\.?\w+\s*} $line {}] $ignore_undefined \
+ ]
+ set deleteLine 0
+ if {$loc_result == 2} {
+ lappend tmp_asm [list $lineNum $fileNum $line]
+ } elseif {$loc_result == 0} {
+ lappend tmp_asm [list $lineNum $fileNum $label]
+ set fin_result 1
+ } else {
+ lappend tmp_asm [list $lineNum $fileNum $label]
+ }
# Data segment selection (XSEG DSEG ...)
} elseif {
[lindex $groups 3] && $Enable &&
- ([lsearch -exact -ascii ${CompilerConsts::ConstDataSegmentSelectionDirectives} $directive0] != -1)
- } {
+ ([lsearch -exact -ascii ${::CompilerConsts::ConstDataSegmentSelectionDirectives} $directive0] != -1)
+ } then {
set loc_result [data_segment_selection \
$directive0 $directive1 $line $idx $ignore_undefined \
]
@@ -3635,11 +3759,32 @@ namespace eval PreProcessor {
set fin_result 1
}
+ # ORG in other than CODE segment
+ } elseif {
+ $directive0 == {org} || $directive1 == {org}
+ } then {
+ if {$selected_segment != {cseg}} {
+ regsub {org} $line "$selected_segment at" line
+
+ set address {}
+ if {$directive0 == {org}} {
+ set address [ComputeExpr $directive1]
+ } elseif {$directive1 == {org}} {
+ set address [ComputeExpr [regsub {^\w+:\s*\.?\w+\s*} $line {}]]
+ }
+ if {$address != {}} {
+ set segment_pointer($selected_segment) $address
+ }
+ }
+
+ lappend tmp_asm [list $lineNum $fileNum $line]
+ set deleteLine 0
+
# Data memory reservation -- without label (DBIT 125)
} elseif {
[lindex $groups 5] && $Enable &&
- ([lsearch -exact -ascii ${CompilerConsts::ConstDataMemoryReservationDirectives} $directive0] != -1)
- } {
+ ([lsearch -exact -ascii ${::CompilerConsts::ConstDataMemoryReservationDirectives} $directive0] != -1)
+ } then {
regsub {^\.?\w+\s*} $line {} value
set loc_result [data_memory_reservation {} $directive0 $value $idx $ignore_undefined]
if {$loc_result == 2} {
@@ -3653,8 +3798,8 @@ namespace eval PreProcessor {
} elseif {
[lindex $groups 5] && [regexp {^\w+:$} $line_first_field] && $Enable
&&
- ([lsearch -exact -ascii ${CompilerConsts::ConstDataMemoryReservationDirectives} $directive1] != -1)
- } {
+ ([lsearch -exact -ascii ${::CompilerConsts::ConstDataMemoryReservationDirectives} $directive1] != -1)
+ } then {
regsub {^\s*\w+:\s*\.?\w+\s*} $line {} value
set loc_result [data_memory_reservation \
$line_first_field $directive1 $value $idx $ignore_undefined \
@@ -3666,14 +3811,14 @@ namespace eval PreProcessor {
set fin_result 1
}
- # Conditional compilation statement -- in 2nd field (IF ELSE ENDIF IFNDEF IFDEF IFN)
+ # Conditional compilation statement -- in 2nd field (IF ELSE ENDIF IFNDEF IFDEF IFN ELSEIF ELSEIFN ELSEIFDEF ELSEIFNDEF)
} elseif {
[lindex $groups 0] && (
- [lsearch -ascii -exact {if else endif ifndef ifdef ifn} $directive1] != -1
+ [lsearch -ascii -exact {if else endif ifndef ifdef ifn elseif elseifn elseifdef elseifndef} $directive1] != -1
) && (
[regexp {^\w+:$} $line_first_field label]
)
- } {
+ } then {
# Is compilation enabled ?
if {$Enable} {
lappend tmp_asm [list $lineNum $fileNum $label]
@@ -3689,12 +3834,12 @@ namespace eval PreProcessor {
}
} else {
- # Conditional compilation statement -- in 1st field (IF ELSE ENDIF IFNDEF IFDEF IFN)
+ # Conditional compilation statement -- in 1st field (IF ELSE ENDIF IFNDEF IFDEF IFN ELSEIFN ELSEIFDEF ELSEIFNDEF)
if {
[lindex $groups 0] && (
- [lsearch -ascii -exact {if else endif ifndef ifdef ifn} $directive0] != -1
+ [lsearch -ascii -exact {if else endif ifndef ifdef ifn elseif elseifn elseifdef elseifndef} $directive0] != -1
)
- } {
+ } then {
regsub {^\.?\w+\s*} $line {} value
@@ -3704,11 +3849,15 @@ namespace eval PreProcessor {
}
If_Else_Endif $directive0 $value
- } {
+ } else {
# Is compilation enabled ?
if {$Enable} {
lappend tmp_asm [list $lineNum $fileNum $line]
set deleteLine 0
+
+ if {$directive0 == {cseg} || $directive1 == {cseg}} {
+ set selected_segment {cseg}
+ }
}
}
}
@@ -3787,7 +3936,7 @@ namespace eval PreProcessor {
if {![string length $expr]} {
SyntaxError $lineNum $fileNum [mc "Missing size"]
set value 1
- } {
+ } else {
set value [ComputeExpr $expr $ignore_undefined]
}
@@ -3823,10 +3972,10 @@ namespace eval PreProcessor {
($selected_segment != {dseg}) &&
($selected_segment != {iseg}) &&
($selected_segment != {xseg})
- } {
+ } then {
Warning $lineNum $fileNum [mc "Using `%s' directive, but currently active segment is `%s'" [string toupper $directive] [string toupper $selected_segment]]
set seg {dseg}
- } {
+ } else {
set seg $selected_segment
}
@@ -3834,7 +3983,7 @@ namespace eval PreProcessor {
return [reserve_memory $label $seg $value $idx]
# Unknown request -> compilation error
- } {
+ } else {
CompilationError $lineNum $fileNum "Unknown error 4"
return 1
}
@@ -3907,7 +4056,7 @@ namespace eval PreProcessor {
}
}
- # Check if there is enought free space in the segment
+ # Check if there is enough free space in the segment
set end [expr {$segment_pointer($segment) + $value}]
if {$end > $max} {
Warning $lineNum $fileNum [mc "Exceeding %s segment boundary by %s $unit." $segment_name [expr {$max - $end}]]
@@ -3957,10 +4106,10 @@ namespace eval PreProcessor {
set const [string trimright $label {:}]
# Assing block pointer to symbolic name specified by label
- if {[lsearch -exact -ascii [subst "\$defined_$const_type"] $const] != -1} {
+ if {[lsearch -exact -ascii [subst -nocommands "\$defined_$const_type"] $const] != -1} {
SyntaxError $lineNum $fileNum [mc "Unable redefine constant: %s" $const]
return 1
- } {
+ } else {
# Check if this symbol is not already defined
if {[isConstAlreadyDefined $const]} {
Warning $lineNum $fileNum [mc "Ambiguous symbol definition: %s" $const]
@@ -3997,11 +4146,17 @@ namespace eval PreProcessor {
set const_name [string tolower $const_name]
# Search all lists of symbolic names
- if {[lsearch -exact -ascii [concat \
- $defined_BIT $defined_CODE $defined_DATA \
- $defined_IDATA $defined_XDATA $defined_SET \
- $defined_EQU $defined_MACRO $defined_SET_SPEC \
- $defined_EQU_SPEC] $const_name] != -1} {
+ if {
+ [lsearch -exact -ascii [concat \
+ $defined_BIT $defined_CODE $defined_DATA \
+ $defined_IDATA $defined_XDATA $defined_SET \
+ $defined_EQU $defined_MACRO $defined_SET_SPEC \
+ $defined_EQU_SPEC \
+ ${::CompilerConsts::defined_progVectors} \
+ ${::CompilerConsts::defined_SFRBitArea} \
+ ${::CompilerConsts::defined_SFR} \
+ ] $const_name] != -1
+ } then {
return 1
}
return 0
@@ -4021,7 +4176,7 @@ namespace eval PreProcessor {
variable selected_segment ;# Current memory segment (one of {cseg bseg dseg iseg xseg})
variable segment_pointer ;# Current memory segment pointer
- # Change memory segment
+ # Change memory segment
set selected_segment $directive
if {[regsub {^\.} [string tolower $line] {}] == $directive} {
return 0
@@ -4064,12 +4219,17 @@ namespace eval PreProcessor {
} else {
set segment_pointer($selected_segment) $value
CodeListing::set_addr $idx $value
- return 0
+
+ if {$ignore_undefined} {
+ return 2
+ } else {
+ return 0
+ }
}
return 1
}
- ## Take care of conditional compilation control directives (IF, ELSE, ENDIF)
+ ## Take care of conditional compilation control directives (IF, ELSE, ENDIF, IFN, IFDEF, IFNDEF, ELSEIF ELSEIFN ELSEIFDEF ELSEIFNDEF)
# --auxiliary procedure for 'parse_Consts_and_ConditionalCompilation'
# @parm String directive - Directive
# @parm String cond - Expression of the condition
@@ -4078,9 +4238,11 @@ namespace eval PreProcessor {
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable IfElse_map ;# Array: Conditional compilation map ($IfElse_map($level) == $bool)
+ variable IfElse_pcam ;# Array: Conditional compilation -- Positive condition already met ($IfElse_pcam($level) == $bool)
variable IfElse_level ;# Current level of conditional compilation evaluation
variable Enable ;# Bool: Compilation enabled (conditional compilation)
+ set cond_orig $cond
switch -- $directive {
{if} {
# Missing condition expression
@@ -4090,10 +4252,14 @@ namespace eval PreProcessor {
}
# Evaluate the condition expression
- set cond [ComputeExpr $cond]
- if {$cond == {}} {
- SyntaxError $lineNum $fileNum [mc "Invalid expression `%s'" $cond]
- set cond 1
+ if {$Enable} {
+ set cond [ComputeExpr $cond]
+ if {$cond == {}} {
+ SyntaxError $lineNum $fileNum [mc "Invalid expression `%s'" $cond_orig]
+ set cond 1
+ }
+ } else {
+ set cond 0
}
# Increment counter of nested block level
@@ -4101,6 +4267,7 @@ namespace eval PreProcessor {
# Adjust map of conditional compilation map and flag "Enable"
set IfElse_map($IfElse_level) $cond
+ set IfElse_pcam($IfElse_level) $cond
if {!$Enable || !$cond} {
set Enable 0
}
@@ -4113,9 +4280,13 @@ namespace eval PreProcessor {
}
# Evaluate the condition expression
- set cond [ComputeExpr $cond]
- if {$cond == {}} {
- SyntaxError $lineNum $fileNum [mc "Invalid expression `%s'" $cond]
+ if {$Enable} {
+ set cond [ComputeExpr $cond]
+ if {$cond == {}} {
+ SyntaxError $lineNum $fileNum [mc "Invalid expression `%s'" $cond_orig]
+ set cond 1
+ }
+ } else {
set cond 1
}
@@ -4127,6 +4298,7 @@ namespace eval PreProcessor {
# Adjust map of conditional compilation map and flag "Enable"
set IfElse_map($IfElse_level) $cond
+ set IfElse_pcam($IfElse_level) $cond
if {!$Enable || !$cond} {
set Enable 0
}
@@ -4142,13 +4314,14 @@ namespace eval PreProcessor {
}
# Evaluate the condition expression
- set cond [isConstAlreadyDefined $cond]
+ set cond [expr {$Enable && [isConstAlreadyDefined $cond]}]
# Increment counter of nested block level
incr IfElse_level
# Adjust map of conditional compilation map and flag "Enable"
set IfElse_map($IfElse_level) $cond
+ set IfElse_pcam($IfElse_level) $cond
if {!$Enable || !$cond} {
set Enable 0
}
@@ -4164,13 +4337,14 @@ namespace eval PreProcessor {
}
# Evaluate the condition expression
- set cond [expr {![isConstAlreadyDefined $cond]}]
+ set cond [expr {$Enable && ![isConstAlreadyDefined $cond]}]
# Increment counter of nested block level
incr IfElse_level
# Adjust map of conditional compilation map and flag "Enable"
set IfElse_map($IfElse_level) $cond
+ set IfElse_pcam($IfElse_level) $cond
if {!$Enable || !$cond} {
set Enable 0
}
@@ -4178,8 +4352,62 @@ namespace eval PreProcessor {
{else} {
if {[llength [array names IfElse_map $IfElse_level]] == 0} {
SyntaxError $lineNum $fileNum [mc "Unexpected `ELSE'"]
- } {
- set IfElse_map($IfElse_level) [expr {!$IfElse_map($IfElse_level)}]
+ } else {
+ set IfElse_map($IfElse_level) [expr {!$IfElse_pcam($IfElse_level)}]
+ set Enable 1
+ for {set i 1} {$i <= $IfElse_level} {incr i} {
+ set Enable [expr {$IfElse_map($i) && $Enable}]
+ }
+ }
+ }
+ {elseifn} -
+ {elseifdef} -
+ {elseifndef} -
+ {elseif} {
+ if {[llength [array names IfElse_map $IfElse_level]] == 0} {
+ SyntaxError $lineNum $fileNum [mc "Unexpected `ELSEIF'"]
+ } else {
+ # Missing condition expression
+ if {![string length $cond]} {
+ SyntaxError $lineNum $fileNum [mc "Missing condition"]
+ set cond 1
+ }
+
+ # Evaluate the condition expression
+ if {
+ !$IfElse_pcam($IfElse_level)
+ &&
+ ($IfElse_level == 1 || $IfElse_map([expr {$IfElse_level - 1}]))
+ } then {
+ switch -- $directive {
+ {elseif} {
+ set cond [ComputeExpr $cond]
+ }
+ {elseifn} {
+ set cond [ComputeExpr $cond]
+ if {$cond != {}} {
+ set cond [expr {!$cond}]
+ }
+ }
+ {elseifdef} {
+ set cond [isConstAlreadyDefined $cond]
+ }
+ {elseifndef} {
+ set cond [expr {![isConstAlreadyDefined $cond]}]
+ }
+ }
+ if {$cond == {}} {
+ SyntaxError $lineNum $fileNum [mc "Invalid expression `%s'" $cond_orig]
+ set cond 1
+ }
+ } else {
+ set cond 0
+ }
+
+ if {$cond} {
+ set IfElse_pcam($IfElse_level) 1
+ }
+ set IfElse_map($IfElse_level) $cond
set Enable 1
for {set i 1} {$i <= $IfElse_level} {incr i} {
set Enable [expr {$IfElse_map($i) && $Enable}]
@@ -4197,13 +4425,13 @@ namespace eval PreProcessor {
}
# Invalid directive usage
- } {
+ } else {
incr IfElse_level
SyntaxError $lineNum $fileNum [mc "Unexpected `ENDIF'"]
}
}
default {
- CompilationError $lineNum $fileNum "`$directive' is not a if/else/endif directive (procedure: If_Else_Endif)"
+ CompilationError $lineNum $fileNum "`$directive' is not a if/else/endif/ifn/ifdef/ifndef/elseif directive (procedure: If_Else_Endif)"
}
}
}
@@ -4239,7 +4467,7 @@ namespace eval PreProcessor {
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
- variable ErrorAtLine ;# Bool: Error occured on the current line
+ variable ErrorAtLine ;# Bool: Error occurred on the current line
# Handle directive "FLAG", which has the same meaning as "BIT"
if {$directive == {flag}} {
@@ -4249,7 +4477,7 @@ namespace eval PreProcessor {
# Detrminate 1st field and the last (3rd) field
if {![regexp {^\s*\w+} $line const]} {
set const {} ;# symbolic name
- } {
+ } else {
set const [string tolower [string trim $const]] ;# symbolic name
}
if {![regsub {^\w+\s+\.?\w+\s+} $line {} value]} {
@@ -4266,14 +4494,14 @@ namespace eval PreProcessor {
# Does value field contain comma ?
if {[string first {,} $value] != -1} {
# Is const field an instruction ?
- if {[lsearch -exact -ascii ${CompilerConsts::AllInstructions} $const] != -1} {
+ if {[lsearch -exact -ascii ${::CompilerConsts::AllInstructions} $const] != -1} {
# yes -> skip this line
if {$ignore_undefined} {
return 2
- } {
+ } else {
return 1
}
- } {
+ } else {
# no -> remove line & report syntax error
SyntaxError $lineNum $fileNum [mc "Invalid expression: `%s'" $value]
return 1
@@ -4306,6 +4534,7 @@ namespace eval PreProcessor {
Notice $lineNum $fileNum [mc "Special value (with no numerical representation) assigned to constant: %s <- %s" [string toupper $const] [string toupper $value]]
set special_value 1
} else {
+ set value_orig $value
set value [ComputeExpr $value $ignore_undefined]
}
@@ -4314,14 +4543,14 @@ namespace eval PreProcessor {
if {$ignore_undefined} {
return 2
}
- SyntaxError $lineNum $fileNum [mc "Invalid expression `%s'" $value]
+ SyntaxError $lineNum $fileNum [mc "Invalid expression `%s'" $value_orig]
return 1
}
# Adjust code listing
if {$special_value} {
CodeListing::set_spec_value $idx $value
- } {
+ } else {
CodeListing::set_value $idx $value
}
# Define symbolic name
@@ -4360,12 +4589,12 @@ namespace eval PreProcessor {
}
{data} {
if {
- ([lsearch -exact -ascii $defined_IDATA $const] != -1)
- ||
- ([lsearch -exact -ascii $defined_DATA $const] != -1)
- } {
- SyntaxError $lineNum $fileNum [mc "Trying to overwrite constant: %s" $const]
- return 1
+ ([lsearch -exact -ascii $defined_IDATA $const] != -1)
+ ||
+ ([lsearch -exact -ascii $defined_DATA $const] != -1)
+ } then {
+ SyntaxError $lineNum $fileNum [mc "Trying to overwrite constant: %s" $const]
+ return 1
}
if {$value > 0xFF} {
SyntaxError $lineNum $fileNum [mc "Expression out of range"]
@@ -4381,12 +4610,12 @@ namespace eval PreProcessor {
}
{idata} {
if {
- ([lsearch -exact -ascii $defined_IDATA $const] != -1)
- ||
- ([lsearch -exact -ascii $defined_DATA $const] != -1)
- } {
- SyntaxError $lineNum $fileNum [mc "Trying to overwrite constant: %s" $const]
- return 1
+ ([lsearch -exact -ascii $defined_IDATA $const] != -1)
+ ||
+ ([lsearch -exact -ascii $defined_DATA $const] != -1)
+ } then {
+ SyntaxError $lineNum $fileNum [mc "Trying to overwrite constant: %s" $const]
+ return 1
}
if {$value > 0xFF} {
SyntaxError $lineNum $fileNum [mc "Expression out of range"]
@@ -4426,7 +4655,7 @@ namespace eval PreProcessor {
set idx [lsearch -exact -ascii $defined_SET $const]
if {$idx != -1} {
set defined_SET [lreplace $defined_SET $idx $idx]
- } {
+ } else {
set idx [lsearch -exact -ascii $defined_SET_SPEC $const]
if {$idx != -1} {
set defined_SET_SPEC [lreplace $defined_SET_SPEC $idx $idx]
@@ -4440,7 +4669,7 @@ namespace eval PreProcessor {
if {$special_value} {
set const_EQU_SPEC($const) [string tolower $value]
lappend defined_EQU_SPEC $const
- } {
+ } else {
set const_EQU($const) $value
lappend defined_EQU $const
}
@@ -4483,19 +4712,19 @@ namespace eval PreProcessor {
# Set (new) variable value
if {[lsearch -exact -ascii $defined_SET $const] != -1} {
Notice $lineNum $fileNum [mc "Setting new variable value: %s <- %s" $const $value]
- } {
+ } else {
if {[isConstAlreadyDefined $const]} {
Warning $lineNum $fileNum [mc "Ambiguous symbol definition: %s" $const]
}
if {$special_value} {
lappend defined_SET_SPEC $const
- } {
+ } else {
lappend defined_SET $const
}
}
if {$special_value} {
lappend const_SET_SPEC($const) [list $lineNum $value]
- } {
+ } else {
lappend const_SET($const) [list $lineNum $value]
}
return 0
@@ -4511,18 +4740,19 @@ namespace eval PreProcessor {
if {
([lsearch -exact -ascii $defined_SET $const] != -1) ||
([lsearch -exact -ascii $defined_EQU $const] != -1)
- } {
+ } then {
return 1
- } {
+ } else {
return 0
}
}
## Get constant/variable value
- # @parm list args - {const_name [lineNumber]}
- # @parm Bool special_value = 0 - Allow special values like (A, AB, R0, etc.)
+ # @parm String const - const_name
+ # @parm Int line={} -lineNumber
+ # @parm Bool special_value=0 - Allow special values like (A, AB, R0, etc.)
# @return mixed - value or emty string if nothing found
- proc const_value args {
+ proc const_value {const {line {}} {special_value 0}} {
variable defined_SET ;# List of variables defined by 'SET'
variable defined_EQU ;# List of constants defined by 'EQU'
variable const_SET ;# Array: Constants defined by directive 'CODE'
@@ -4533,16 +4763,6 @@ namespace eval PreProcessor {
variable defined_SET_SPEC ;# List of special variables defined by 'SET'
variable defined_EQU_SPEC ;# List of special constants defined by 'EQU'
-
- # Determinate name of the constant and line number
- set const [lindex $args 0]
- set line [lindex $args 1]
-
- set special_value [lindex $args 2]
- if {$special_value != 1} {
- set special_value 0
- }
-
# Constants defined by directive 'EQU'
if {[lsearch -exact -ascii $defined_EQU $const] != -1} {
return $const_EQU($const)
@@ -4585,18 +4805,18 @@ namespace eval PreProcessor {
}
## Compute value of the given expression
- # @parm String - Expression to evaluate
- # @parm Bool = 0 - Ignore undefined symbolic names
- # @parm Int = {} - Current instruction address (for `$' expansion)
+ # @parm String expression - Expression to evaluate
+ # @parm Bool ignore_undefined=0 - Ignore undefined symbolic names
+ # @parm Int address={} - Current instruction address (for `$' expansion)
# @return Int - result or {}
- proc ComputeExpr args {
+ proc ComputeExpr {expression {ignore_undefined 0} {address {}}} {
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable original_expression ;# Auxiliary variable (see proc. 'ComputeExpr')
variable tmp ;# General purpose tempotary variable
- variable ErrorAtLine ;# Bool: Error occured on the current line
+ variable ErrorAtLine ;# Bool: Error occurred on the current line
variable check_sfr_usage ;# Bool: Check for legal usage of SFR and SFB
- variable avaliable_SFR ;# List: Avaliable SFR and SFB on the target MCU
+ variable available_SFR ;# List: available SFR and SFB on the target MCU
variable const_BIT ;# Array: Bit values -- ($const_BIT($bit_name) == $value)
variable const_CODE ;# Array: Constants defined by directive 'CODE'
@@ -4617,15 +4837,11 @@ namespace eval PreProcessor {
variable labels ;# Array: Values of defined labels ($labels($label) == $address)
variable defined_LABEL ;# List of defined labels
+ variable selected_segment ;# Current memory segment (one of {cseg bseg dseg iseg xseg})
+ variable segment_pointer ;# Current memory segment pointer
+
set ErrorAtLine 0
- # Parse arguments
- set expression [lindex $args 0]
- set ignore_undefined [lindex $args 1]
- set address [lindex $args 2]
- if {$ignore_undefined == {}} {
- set ignore_undefined 0
- }
# Make backup copy of the original expression
set original_expression $expression
@@ -4639,7 +4855,7 @@ namespace eval PreProcessor {
if {[regexp {[\(\)]} $expression]} {
set left_p 0
set idx 0
- while 1 {
+ while {1} {
set idx [string first {(} $expression $idx]
if {$idx == -1} {break}
incr idx
@@ -4647,7 +4863,7 @@ namespace eval PreProcessor {
}
set right_p 0
set idx 0
- while 1 {
+ while {1} {
set idx [string first {)} $expression $idx]
if {$idx == -1} {break}
incr idx
@@ -4655,7 +4871,7 @@ namespace eval PreProcessor {
}
if {$right_p != $left_p} {
- SyntaxError $lineNum $fileNum [mc "Invalid expression - paranthesis are not balanced: `%s'" $original_expression]
+ SyntaxError $lineNum $fileNum [mc "Invalid expression - parentheses are not balanced: `%s'" $original_expression]
}
}
@@ -4678,12 +4894,12 @@ namespace eval PreProcessor {
([string first {low} [string tolower $expression]] != -1)
||
([string first {high} [string tolower $expression]] != -1)
- } {
- foreach operator {low high} \
- before {0xFF&int( int(} \
+ } then {
+ foreach operator {low high} \
+ before {0xFF&int( int(} \
after {) )/0x100} \
{
- while 1 {
+ while {1} {
if {![regexp -nocase -- "\\s$operator\\s+((\\w+)|(\\(\[^\\(\\)\]+\\)))" $expression str]} {
break
}
@@ -4709,6 +4925,21 @@ namespace eval PreProcessor {
foreach word [replace_in_strings $expression { } "\a"] {
if {$word == {}} {continue}
+ # Handle prefix notation for hexadecimal numbers, like 0xfa
+ if {
+ [string index $word 0] == {0}
+ &&
+ ([string index $word 1] == {x} || [string index $word 1] == {X})
+ &&
+ [string is xdigit [string index $word 2]]
+ } then {
+ set word [string replace $word 0 1]
+ if {![string is digit [string index $word 0]]} {
+ set word "0${word}"
+ }
+ append word {h}
+ }
+
if {[regexp {^\d\w+$} $word] && ![regexp {^\d+$} $word]} {
set base [string index $word end]
set word [string range $word 0 {end-1}]
@@ -4722,37 +4953,37 @@ namespace eval PreProcessor {
{h} {
if {![NumSystem::ishex $word]} {
SyntaxError $lineNum $fileNum [mc "Invalid numeric value: %s (should be hexadecimal number)" "${word}h"]
- } {
+ } else {
set word [expr "0x$word"]
}
}
{b} {
if {![NumSystem::isbin $word]} {
SyntaxError $lineNum $fileNum [mc "Invalid numeric value: %s (should be binary number)" "${word}b"]
- } {
+ } else {
set word [NumSystem::bin2dec $word]
}
}
{o} {
if {![NumSystem::isoct $word]} {
SyntaxError $lineNum $fileNum [mc "Invalid numeric value: %s (should be octal number)" "${word}o"]
- } {
+ } else {
set word [NumSystem::oct2dec $word]
}
}
{q} {
if {![NumSystem::isoct $word]} {
SyntaxError $lineNum $fileNum [mc "Invalid numeric value: %s (should be octal number)" "${word}q"]
- } {
+ } else {
set word [NumSystem::oct2dec $word]
}
}
}
- } {
+ } else {
if {[string index $word end] == {'}} {
if {[string index $word 0] != {'}} {
SyntaxError $lineNum $fileNum [mc "Invalid value: `%s' (should be char)" $word]
- } {
+ } else {
set word [string range $word 1 end-1]
regsub -all "\a" $word { } word
set word [character2number [subst -nocommands -novariables $word]]
@@ -4767,15 +4998,29 @@ namespace eval PreProcessor {
# Expand possible constants and variables
foreach word $expression {
if {$word == {}} {continue}
- # Current instruction address `$'
- if {$address != {} && $word == {$}} {
- set word $address
+ # Dollar sign (`$')
+ if {$word == {$}} {
+ # Current instruction address
+ if {$address != {}} {
+ set word $address
+ # Address pointer in the selected memory segment
+ } elseif {$selected_segment != {cseg}} {
+ set word $segment_pointer($selected_segment)
+ } elseif {!$ignore_undefined} {
+ SyntaxError $lineNum $fileNum [mc "Value of `\$' is unknown at this point" $word]
+ set ErrorAtLine 1
+ }
+
lappend tmp $word
continue
}
# Normal symbolic name
- if {![regexp {^[A-Za-z_].*$} $word]} {
+ if {![regexp {^(\?\?)?[A-Za-z_].*$} $word]} {
+ set word [string trimleft $word 0]
+ if {$word == {}} {
+ set word 0
+ }
lappend tmp $word
continue
}
@@ -4792,9 +5037,9 @@ namespace eval PreProcessor {
if {
[lsearch -ascii -exact $::CompilerConsts::defined_SFR $word] != -1
&&
- [lsearch -ascii -exact $avaliable_SFR $word] == -1
- } {
- Warning $lineNum $fileNum [mc "Special function register \"%s\" is not avaliable on the target MCU" [string toupper $word]]
+ [lsearch -ascii -exact $available_SFR $word] == -1
+ } then {
+ Warning $lineNum $fileNum [mc "Special function register \"%s\" is not available on the target MCU" [string toupper $word]]
}
}
set word $const_DATA($word)
@@ -4820,9 +5065,9 @@ namespace eval PreProcessor {
if {
[lsearch -ascii -exact $::CompilerConsts::defined_SFRBitArea $word] != -1
&&
- [lsearch -ascii -exact $avaliable_SFR $word] == -1
- } {
- Warning $lineNum $fileNum [mc "Special function bit \"%s\" is not avaliable on the target MCU" [string toupper $word]]
+ [lsearch -ascii -exact $available_SFR $word] == -1
+ } then {
+ Warning $lineNum $fileNum [mc "Special function bit \"%s\" is not available on the target MCU" [string toupper $word]]
}
}
CodeListing::symbol_used $word {bit}
@@ -4839,6 +5084,7 @@ namespace eval PreProcessor {
return {}
}
SyntaxError $lineNum $fileNum [mc "Undefined symbol name: %s" $word]
+ set ErrorAtLine 1
set word 1
}
@@ -4853,11 +5099,15 @@ namespace eval PreProcessor {
# Compute expression and return possible result
if {[catch {
set expression [expr "$expression"]
- }]} {
+ }]} then {
return {}
}
- set tmp [expr {int($expression)}]
+ if {[catch {
+ set tmp [expr {int($expression)}]
+ }]} then {
+ return {}
+ }
if {($tmp - $expression) != 0} {
Notice $lineNum $fileNum [mc "Floating point value converted to integer value `%s' -> `%s'" $expression $tmp]
}
@@ -4880,8 +5130,8 @@ namespace eval PreProcessor {
## Remove comments and redutant white space
# @return void
proc trim_code {} {
- variable asm ;# Resulting precompiled code
- variable tmp_asm ;# Tempotary auxiliary precompiled code
+ variable asm ;# Resulting pre-compiled code
+ variable tmp_asm ;# Temporary auxiliary pre-compiled code
variable lineNum ;# Number of the current line
variable fileNum ;# Number of the current file
variable idx ;# Current position in asm list
@@ -4896,7 +5146,9 @@ namespace eval PreProcessor {
incr idx
# Update after each 25 iterations
- if {[expr {$idx % 25}] == 0} ${::Compiler::Settings::UPDATE_COMMAND}
+ if {[expr {$idx % 25}] == 0} {
+ ${::Compiler::Settings::UPDATE_COMMAND}
+ }
if {${::Compiler::Settings::ABORT_VARIABLE}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} [mc "Aborted"]
free_resources
@@ -4917,10 +5169,10 @@ namespace eval PreProcessor {
# Remove comment
set tmp_line $line
- while 1 {
+ while {1} {
if {[regexp {'[^']*'} $tmp_line str]} {
regsub {'[^']*'} $tmp_line [string repeat {_} [string length $str]] tmp_line
- } {
+ } else {
break
}
}
@@ -4954,7 +5206,7 @@ namespace eval PreProcessor {
# @return String - result
proc replace_in_strings {string search replacement} {
set idx 0
- while 1 {
+ while {1} {
if {![regexp -start $idx -- {'[^']*'} $string str]} {
break
}
@@ -4980,7 +5232,7 @@ namespace eval PreProcessor {
if {[string length $value] == 1} {
binary scan $value c value
return $value
- } {
+ } else {
if {[string index $value 0] == "\\"} {
set value [string range $value 1 end]
switch -- $value {
@@ -5016,7 +5268,7 @@ namespace eval PreProcessor {
return {}
}
}
- } {
+ } else {
SyntaxError $lineNum $fileNum [mc "Cannot to use string `%s' as value" $value]
return {}
}
@@ -5024,15 +5276,15 @@ namespace eval PreProcessor {
}
## Report error message -- compilation error (bug in compiler ?)
- # @parm Int LineNumber - Number of line where the error occured
- # @parm Int FileNumber - Number of file where the error occured, {} == unknown
+ # @parm Int LineNumber - Number of line where the error occurred
+ # @parm Int FileNumber - Number of file where the error occurred, {} == unknown
# @parm String ErrorInfo - Error string
# @return void
proc CompilationError {LineNumber FileNumber ErrorInfo} {
variable included_files ;# List: Unique unsorted list of included files
variable working_dir ;# String: Current working directory
variable idx ;# Current position in asm list
- variable error_count ;# Number of errors occured
+ variable error_count ;# Number of errors occurred
# Increment error counter
incr error_count
@@ -5050,14 +5302,14 @@ namespace eval PreProcessor {
set filename "\"$filename\""
}
set filename [mc " in %s" $filename]
- } {
+ } else {
set filename {}
}
if {${::Compiler::Settings::WARNING_LEVEL} < 3} {
if {${::Compiler::Settings::NOCOLOR}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {EL}][mc "Compilation error at %s: %s" "$LineNumber$filename" $ErrorInfo]
- } {
+ } else {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\033\[31;1mCompilation error\033\[m at \033\[31;1;4m%s\033\[m%s: %s" $LineNumber $filename $ErrorInfo]
}
@@ -5065,8 +5317,8 @@ namespace eval PreProcessor {
}
## Report notice
- # @parm Int LineNumber - Number of line where it occured
- # @parm Int FileNumber - Number of file where the error occured, {} == unknown
+ # @parm Int LineNumber - Number of line where it occurred
+ # @parm Int FileNumber - Number of file where the error occurred, {} == unknown
# @parm String ErrorInfo - Text of the notice
# @return void
proc Notice {LineNumber FileNumber ErrorInfo} {
@@ -5082,14 +5334,14 @@ namespace eval PreProcessor {
set filename "\"$filename\""
}
set filename [mc " in %s" $filename]
- } {
+ } else {
set filename {}
}
if {${::Compiler::Settings::WARNING_LEVEL} < 1} {
if {${::Compiler::Settings::NOCOLOR}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {WL}][mc "Notice at %s: %s" "$LineNumber$filename" $ErrorInfo]
- } {
+ } else {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\033\[33;1mNotice\033\[m at \033\[33;1;4m%s\033\[m%s: %s" $LineNumber $filename $ErrorInfo]
}
@@ -5097,15 +5349,15 @@ namespace eval PreProcessor {
}
## Report warning message
- # @parm Int LineNumber - Number of line where it occured
- # @parm Int FileNumber - Number of file where the error occured, {} == unknown
+ # @parm Int LineNumber - Number of line where it occurred
+ # @parm Int FileNumber - Number of file where the error occurred, {} == unknown
# @parm String ErrorInfo - Text of the warning
# @return void
proc Warning {LineNumber FileNumber ErrorInfo} {
variable working_dir ;# String: Current working directory
variable included_files ;# List: Unique unsorted list of included files
variable idx ;# Current position in asm list
- variable warning_count ;# Number of warnings occured
+ variable warning_count ;# Number of warnings occurred
# Increment warning counter
incr warning_count
@@ -5123,32 +5375,32 @@ namespace eval PreProcessor {
set filename "\"$filename\""
}
set filename [mc " in %s" $filename]
- } {
+ } else {
set filename {}
}
if {${::Compiler::Settings::WARNING_LEVEL} < 2} {
if {${::Compiler::Settings::NOCOLOR}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {WL}][mc "Warning at %s: %s" "$LineNumber$filename" $ErrorInfo]
- } {
+ } else {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\033\[33mWarning\033\[m at \033\[33;4m%s\033\[m%s: %s" $LineNumber $filename $ErrorInfo]
}
}
}
- ## Report error message -- syntax error (badly formated input code)
- # @parm Int LineNumber - Number of line where the error occured
- # @parm Int FileNumber - Number of file where the error occured, {} == unknown
+ ## Report error message -- syntax error (badly formatted input code)
+ # @parm Int LineNumber - Number of line where the error occurred
+ # @parm Int FileNumber - Number of file where the error occurred, {} == unknown
# @parm String ErrorInfo - Error string
# @return void
proc SyntaxError {LineNumber FileNumber ErrorInfo} {
variable working_dir ;# String: Current working directory
variable included_files ;# List: Unique unsorted list of included files
variable idx ;# Current position in asm list
- variable error_count ;# Number of errors occured
- variable ErrorAtLine ;# Bool: Error occured on the current line
- variable Error ;# Bool: An error occured during precompilation
+ variable error_count ;# Number of errors occurred
+ variable ErrorAtLine ;# Bool: Error occurred on the current line
+ variable Error ;# Bool: An error occurred during precompilation
# Adjust NS variable
incr error_count
@@ -5168,17 +5420,21 @@ namespace eval PreProcessor {
set filename "\"$filename\""
}
set filename [mc " in %s" $filename]
- } {
+ } else {
set filename {}
}
if {${::Compiler::Settings::WARNING_LEVEL} < 3} {
if {${::Compiler::Settings::NOCOLOR}} {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[::Compiler::msgc {EL}][mc "Syntax error at %s: %s" "$LineNumber$filename" $ErrorInfo]
- } {
+ } else {
${::Compiler::Settings::TEXT_OUPUT_COMMAND} \
[mc "\033\[31;1mSyntax error\033\[m at \033\[31;1;4m%s\033\[m%s: %s" $LineNumber $filename $ErrorInfo]
}
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/configdialogs/global_config.tcl b/lib/configdialogs/global_config.tcl
deleted file mode 100755
index a5a422b..0000000
--- a/lib/configdialogs/global_config.tcl
+++ /dev/null
@@ -1,318 +0,0 @@
-#!/usr/bin/tclsh
-# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
-
-############################################################################
-# Copyright (C) 2007-2009 by Martin Ošmera #
-# martin.osmera@gmail.com #
-# #
-# This program is free software; you can redistribute it and#or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation; either version 2 of the License, or #
-# (at your option) any later version. #
-# #
-# This program is distributed in the hope that it will be useful, #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
-# GNU General Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with this program; if not, write to the #
-# Free Software Foundation, Inc., #
-# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
-############################################################################
-
-# --------------------------------------------------------------------------
-# DESCRIPTION
-# Implements global configuration dialog
-# --------------------------------------------------------------------------
-
-
-## Global configuration dialog
- # see Array OPTION in root NS
-namespace eval global {
-
- variable dialog_opened 0 ;# Bool: True if this dialog is already opened
- variable win ;# ID of dialog toplevel window
-
- variable avaliable_languages ;# List of avaliable languages
-
- ## Configuration variables
- variable show_splash ;# Bool: Show splash creen on startup
- variable show_tips ;# Bool: Show tips on startup
- variable language ;# String: Language
-
- ## Create the dialog
- # @return void
- proc mkDialog {} {
- variable win ;# ID of toplevel dialog window
- variable dialog_opened ;# Bool: True if this dialog is already opened
- variable avaliable_languages ;# List of avaliable languages
-
- # Destroy the dialog if it's alredy opened
- if {$dialog_opened} {
- destroy .global_config_dialog
- }
- set dialog_opened 1
-
- # Get settings from main NS
- getSettings
-
- # Determinate avaliable languages
- get_languages
-
- # Create toplevel window
- set win [toplevel .global_config_dialog -class {Configuration dialog} -bg {#EEEEEE}]
-
- # Create window header
- label $win.header_label \
- -compound left \
- -image ::ICONS::32::kcmmemory \
- -text [mc "MCU 8051 IDE configuration"] \
- -font [font create -size -20]
-
- # Create horizontal separator
- Separator $win.sep -orient horizontal
-
- ## Create middle frame
- set middle_frame [frame $win.middle_frame]
- # Checkbutton "Display splash screen"
- grid [Label $middle_frame.lbl_splash \
- -text [mc "Display splash screen"] \
- -helptext [mc "Show splash screen on startup"] \
- ] -row 0 -column 0 -sticky w
- grid [checkbutton $middle_frame.chb_splash \
- -variable ::configDialogs::global::show_splash \
- ] -row 0 -column 1 -sticky w
- DynamicHelp::add $middle_frame.chb_splash \
- -text [mc "Show splash screen on startup"]
- # Checkbutton "Show tips on startup"
- grid [Label $middle_frame.lbl_tips \
- -text [mc "Show tips on startup"] \
- -helptext [mc "Invoke dialog with tip of the day on startup"] \
- ] -row 1 -column 0 -sticky w
- grid [checkbutton $middle_frame.chb_tips \
- -variable ::configDialogs::global::show_tips \
- ] -row 1 -column 1 -sticky w
- DynamicHelp::add $middle_frame.chb_tips \
- -text [mc "Invoke dialog with tip of the day on startup"]
- # Combo "Language"
- grid [Label $middle_frame.lbl_lang \
- -text [mc "Language"] \
- -helptext [mc "Your preferred language"] \
- ] -row 2 -column 0 -sticky w
- grid [ttk::combobox $middle_frame.cb_lang \
- -values $avaliable_languages \
- -state readonly \
- -textvariable ::configDialogs::global::language \
- ] -row 2 -column 1 -sticky w
- bind $middle_frame.cb_lang <<ComboboxSelected>> \
- {::configDialogs::global::language_changed}
- DynamicHelp::add $middle_frame.cb_lang \
- -text [mc "Your preferred language"]
- # Separator
- grid [ttk::separator $middle_frame.sep -orient horizontal] -columnspan 2 -sticky we -row 3 -column 0 -pady 5
- # Checkbutton "Do not ask whether ..."
- grid [text $middle_frame.lbl_ask \
- -wrap word -height 4 -width 0 -bg {#EEEEEE} -bd 0 \
- ] -row 4 -column 0 -sticky we
- $middle_frame.lbl_ask insert end [mc "Do not always ask whether to add file to the project after the file is opened"]
- $middle_frame.lbl_ask configure -state disabled
- grid [checkbutton $middle_frame.cb_ask \
- -onvalue 0 -offvalue 1 \
- -variable ::FileList::ask__append_file_to_project \
- ] -row 4 -column 1 -sticky w
-
- # Finalize
- grid columnconfigure $middle_frame 0 -minsize 200
-
- ## Button frame at the bottom
- set but_frame [frame $win.button_frame]
- # Button "Reset"
- pack [ttk::button $but_frame.but_default \
- -text [mc "Reset to defaults"] \
- -command {::configDialogs::global::DEFAULTS} \
- ] -side left
- DynamicHelp::add $but_frame.but_default \
- -text [mc "Reset all settings to defaults"]
- # Button "Ok"
- pack [ttk::button $but_frame.but_ok \
- -text [mc "Ok"] \
- -compound left \
- -image ::ICONS::16::ok \
- -command {::configDialogs::global::OK} \
- ] -side right
- DynamicHelp::add $but_frame.but_ok \
- -text [mc "Commit new settings"]
- # Button "Cancel"
- pack [ttk::button $but_frame.but_cancel \
- -text [mc "Cancel"] \
- -compound left \
- -image ::ICONS::16::button_cancel \
- -command {::configDialogs::global::CANCEL} \
- ] -side right
- DynamicHelp::add $but_frame.but_cancel \
- -text [mc "Take changes back and close dialog"]
-
- # Pack frames and notebook
- pack $win.header_label -side top -pady 6
- pack $win.sep -side top -fill x -after $win.header_label
- pack $middle_frame -side top -padx 10 -anchor nw -pady 10
- pack $but_frame -side bottom -fill x -expand 1 -anchor s -padx 10 -pady 5
-
- # Set window attributes
- wm iconphoto $win ::ICONS::16::configure
- wm transient $win .
- wm title $win [mc "Configure MCU 8051 IDE"]
- wm minsize $win 380 250
- raise $win
- catch {grab $win}
- wm protocol $win WM_DELETE_WINDOW {
- ::configDialogs::global::CANCEL
- }
- tkwait window $win
- }
-
- ## Application language changed
- # Takes any set of arguments and discards them
- # @parm List - meaningless
- # @return void
- proc language_changed args {
- tk_messageBox \
- -parent .global_config_dialog \
- -type ok -icon info \
- -title [mc "Application language changed"] \
- -message [mc "Language for this application has been changed. The change will take effect upon next start of application"]
- }
-
- ## Retrieve list of avaliable translations
- # @return void
- proc get_languages {} {
- variable avaliable_languages ;# List of avaliable languages
-
- set avaliable_languages {en}
- set tmp [list]
- catch { ;# For Microsoft Windows it has to be enclosed by catch
- set tmp [glob -nocomplain -types f -tails \
- -directory "${::LIB_DIRNAME}/../translations" *.msg \
- ]
- }
-
- foreach translation $tmp {
- lappend avaliable_languages [file rootname $translation]
- }
- }
-
- ## Set configuration variable
- # @parm String variable - variable to set
- # @parm Mixed value - new value
- proc set_variable {variable value} {
- variable show_splash ;# Bool: Show splash creen on startup
- variable show_tips ;# Bool: Show tips on startup
- variable language ;# String: Language
-
- getSettings
-
- switch -- $variable {
- {splash} {
- set show_splash $value
- }
- {tips} {
- set show_tips $value
- }
- {language} {
- set language $value
- }
- }
-
- use_settings
- save_config
- }
-
- ## Retrieve settings from main NS
- # @return void
- proc getSettings {} {
- variable show_splash ;# Bool: Show splash creen on startup
- variable show_tips ;# Bool: Show tips on startup
- variable language ;# String: Language
-
- set show_splash ${::GLOBAL_CONFIG(splash)}
- set show_tips ${::GLOBAL_CONFIG(tips)}
- set language ${::GLOBAL_CONFIG(language)}
- }
-
- ## Set application acording to local settings
- # @return void
- proc use_settings {} {
- variable show_splash ;# Bool: Show splash creen on startup
- variable show_tips ;# Bool: Show tips on startup
- variable language ;# String: Language
-
- if {${::GLOBAL_CONFIG(language)} != $language} {
- set lang_changed 1
- } {
- set lang_changed 0
- }
-
- set ::GLOBAL_CONFIG(splash) $show_splash
- set ::GLOBAL_CONFIG(tips) $show_tips
- set ::GLOBAL_CONFIG(language) $language
-
- if {$lang_changed} {
- ::X::switch_language
- }
- }
-
- ## Save settings to the config file
- # @return void
- proc save_config {} {
- variable show_splash ;# Bool: Show splash creen on startup
- variable show_tips ;# Bool: Show tips on startup
- variable language ;# String: Language
-
- if {[catch {
- set conf_file [open "${::CONFIG_DIR}/base.conf" w]
- puts -nonewline $conf_file \
- [list $show_splash $show_tips $language]
- close $conf_file
- }]} {
- puts stderr [mc "Unable to write to base configuration file"]
- }
- }
-
- ## Destroy the dialog
- # @return void
- proc CANCEL {} {
- variable win ;# ID of toplevel dialog window
- variable dialog_opened ;# Bool: True if this dialog is already opened
-
- # Destroy dialog window
- set dialog_opened 0
- grab release $win
- destroy $win
- }
-
- ## Use settings and destroy the dialog
- # @return void
- proc OK {} {
- variable win ;# ID of toplevel dialog window
-
- # Use and save settings
- use_settings
- save_config
-
- # Destroy dialog window
- CANCEL
- }
-
- ## Restrore defaults
- # @return void
- proc DEFAULTS {} {
- variable show_splash ;# Bool: Show splash creen on startup
- variable show_tips ;# Bool: Show tips on startup
- variable language ;# String: Language
-
- set show_splash 1
- set show_tips 1
- set language {en}
- }
-}
diff --git a/lib/configdialogs/compiler_config.tcl b/lib/configdialogues/compiler_config.tcl
index 87df5e7..2f261ea 100755..100644
--- a/lib/configdialogs/compiler_config.tcl
+++ b/lib/configdialogues/compiler_config.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 _COMPILER_CONFIG_TCL ] } {
+set _COMPILER_CONFIG_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements compilers configuration dialog
@@ -67,7 +72,7 @@ namespace eval compiler {
variable option_CREATE_BIN_FILE ;# Generate binary object code
variable option_QUIET ;# Verbose
variable opt_WARNING_LEVEL ;# Warning level
- variable option_optim_ena ;# Enable optimalizations
+ variable option_optim_ena ;# Enable optimization
variable max_ihex_rec_length ;# Int: Maximum length of IHEX-8 record
variable primary_tab_asm ;# Widget: Tab "Assembly language"
@@ -88,7 +93,7 @@ namespace eval compiler {
variable as31_custom_opts_text ;# Widget: Text widget "Custom options for AS31"
# External assembler configuration
- variable selected_assembler ;# Int: Preffered assembler (0==MCU8051IDE;1==ASEM-51;2==ASL;3==AS31)
+ variable selected_assembler ;# Int: Preferred assembler (0==MCU8051IDE;1==ASEM-51;2==ASL;3==AS31)
variable assembler_ASEM51_config;# Array: ASEM-51 configuration
variable assembler_ASEM51_addcfg;# Array: ASEM-51 additional configuration
variable assembler_ASL_config ;# Array: ASL configuration
@@ -102,6 +107,8 @@ namespace eval compiler {
variable sdcc_opt_str_opt ;# Array: SDCC configuration
variable sdcc_scs_str_opt ;# Array: SDCC configuration
+ # GNU Make utility configuration
+ variable makeutil_config ;# Array: Make utility configuration
## Create the dialog
# @return void
@@ -112,6 +119,7 @@ namespace eval compiler {
variable primary_tab_asm ;# Widget: Tab "MAIN/Assembly language"
variable primary_tab_c ;# Widget: Tab "MAIN/C language"
+ variable primary_tab_make ;# Widget: Tab "MAIN/GNU make"
variable assembler_tab_compiler ;# Widget: Tab "Assembly language/Compiler"
variable assembler_tab_M8I ;# Widget: Tab "MCU8051IDE"
variable assembler_tab_ASEM51 ;# Widget: Tab "ASEM-51"
@@ -129,7 +137,7 @@ namespace eval compiler {
set as31_custom_opts_text {}
- # Destroy the dialog if it's alredy opened
+ # Destroy the dialog if it's already opened
if {$dialog_opened} {
destroy .compiler_config_dialog
}
@@ -149,101 +157,66 @@ namespace eval compiler {
getSettings
# Create toplevel window
- set win [toplevel .compiler_config_dialog -class {Configuration dialog} -bg {#EEEEEE}]
+ set win [toplevel .compiler_config_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
# Create window header
label $win.header_label \
-compound left \
-image ::ICONS::32::exec \
-text [mc "Compiler configuration"] \
- -font [font create \
- -size -20]
+ -font [font create \
+ -size [expr {int(-20 * $::font_size_factor)}] \
+ ]
# Create primary notebook and its tabs
- set primaryNB [ttk::notebook $win.nb]
- set ::configDialogs::compiler::create_C_tab__already_done 0
- bind $primaryNB <<NotebookTabChanged>> {after idle {
- set tab_index [%W index [%W select]]
-
- if {!$::MICROSOFT_WINDOWS} {
- if {!${::configDialogs::compiler::create_C_tab__already_done}} {
- set ::configDialogs::compiler::create_C_tab__already_done 1
- ::configDialogs::compiler::create_C_tab
- }
- }
- }}
+ set primaryNB [ModernNoteBook $win.nb_p]
- set primary_tab_asm [frame $primaryNB.primary_tab_asm]
- $primaryNB add $primary_tab_asm \
- -text [mc "Assembly language"] \
- -image ::ICONS::16::asm \
- -compound left
+ # Tab: Assembly language
+ set primary_tab_asm [$primaryNB insert end primary_tab_asm \
+ -text [mc "Assembly language"] \
+ -image ::ICONS::16::asm \
+ ]
+
+ # Tab: C language -- SDCC
+ set primary_tab_c [$primaryNB insert end primary_tab_c \
+ -text [mc "C language -- SDCC"] \
+ -image ::ICONS::16::source_c \
+ -createcmd {::configDialogues::compiler::create_C_tab} \
+ ]
if {!$::MICROSOFT_WINDOWS} {
- set primary_tab_c [frame $primaryNB.primary_tab_c]
- $primaryNB add $primary_tab_c \
- -text [mc "C language -- SDCC"] \
- -image ::ICONS::16::source_c \
- -compound left
+ # Tab: GNU make utility
+ set primary_tab_make [$primaryNB insert end primary_tab_make \
+ -text [mc "GNU make utility"] \
+ -image ::ICONS::16::text_x_makefile \
+ -createcmd {::configDialogues::compiler::create_make_tab} \
+ ]
}
# Create notebook "Assembly language" and its pages
- set secondaryNB [ttk::notebook $primary_tab_asm.secondaryNB]
- set ::configDialogs::compiler::secondaryNB__tabs_created [list]
- if {!$::MICROSOFT_WINDOWS} { ;# There is no support for external assembler on Microsoft Windows
- bind $secondaryNB <<NotebookTabChanged>> {after idle {
- set tab_index [%W index [%W select]]
- if {[lsearch ${::configDialogs::compiler::secondaryNB__tabs_created} $tab_index] == -1} {
- lappend ::configDialogs::compiler::secondaryNB__tabs_created $tab_index
- switch -- $tab_index {
- 0 {::configDialogs::compiler::create_compiler_tab}
- 1 {::configDialogs::compiler::create_asm_tab}
- 2 {::configDialogs::compiler::create_ASEM51_tab}
- 3 {::configDialogs::compiler::create_ASL_tab}
- 4 {::configDialogs::compiler::create_AS31_tab}
- }
- }
- }}
- }
-
- if {!$::MICROSOFT_WINDOWS} { ;# There is no support for external assembler on Microsoft Windows
- set assembler_tab_compiler [frame $secondaryNB.assembler_tab_compiler]
- $secondaryNB add $assembler_tab_compiler\
- -text [mc "Compiler"]
+ set secondaryNB [ModernNoteBook $primary_tab_asm.secondaryNB]
+
+ set assembler_tab_compiler [$secondaryNB insert end assembler_tab_compiler -text [mc "Assembler"] -createcmd {::configDialogues::compiler::create_compiler_tab}]
+ set assembler_tab_M8I [$secondaryNB insert end assembler_tab_M8I -text "MCU8051IDE" -createcmd {::configDialogues::compiler::create_asm_tab}]
+ set assembler_tab_ASEM51 [$secondaryNB insert end assembler_tab_ASEM51 -text "ASEM-51" -createcmd {::configDialogues::compiler::create_ASEM51_tab}]
+ if {!$::MICROSOFT_WINDOWS} { ;# There is no support for these external assemblers on Microsoft Windows
+ set assembler_tab_ASL [$secondaryNB insert end assembler_tab_ASL -text "ASL" -createcmd {::configDialogues::compiler::create_ASL_tab}]
+ set assembler_tab_AS31 [$secondaryNB insert end assembler_tab_AS31 -text "AS31" -createcmd {::configDialogues::compiler::create_AS31_tab}]
}
- set assembler_tab_M8I [frame $secondaryNB.assembler_tab_M8I]
- $secondaryNB add $assembler_tab_M8I \
- -text "MCU8051IDE"
- if {!$::MICROSOFT_WINDOWS} { ;# There is no support for external assembler on Microsoft Windows
- set assembler_tab_ASEM51 [frame $secondaryNB.assembler_tab_ASEM51]
- $secondaryNB add $assembler_tab_ASEM51 \
- -text "ASEM-51"
- set assembler_tab_ASL [frame $secondaryNB.assembler_tab_ASL]
- $secondaryNB add $assembler_tab_ASL \
- -text "ASL"
- set assembler_tab_AS31 [frame $secondaryNB.assembler_tab_AS31]
- $secondaryNB add $assembler_tab_AS31 \
- -text "AS31"
- }
- pack $secondaryNB -fill both -expand 1
+ pack [$secondaryNB get_nb] -fill both -expand 1
# Raise pages in notebooks
- $primaryNB select $primary_tab_asm
- if {!$::MICROSOFT_WINDOWS} { ;# There is no support for external assembler on Microsoft Windows
- $secondaryNB select $assembler_tab_compiler
- } {
- ::configDialogs::compiler::create_asm_tab
- $secondaryNB select $assembler_tab_M8I
- }
+ $primaryNB raise primary_tab_asm
+ $secondaryNB raise assembler_tab_compiler
## Button frame at the bottom
set but_frame [frame $win.button_frame]
# Button "Reset"
pack [ttk::button $but_frame.but_default \
-text [mc "Reset to defaults"] \
- -command {::configDialogs::compiler::DEFAULTS} \
-
+ -command {::configDialogues::compiler::DEFAULTS}\
+
] -side left
DynamicHelp::add $but_frame.but_default \
-text [mc "Reset all settings to defaults"]
@@ -252,8 +225,8 @@ namespace eval compiler {
-text [mc "Ok"] \
-compound left \
-image ::ICONS::16::ok \
- -command {::configDialogs::compiler::OK} \
- ] -side right
+ -command {::configDialogues::compiler::OK} \
+ ] -side right -padx 2
DynamicHelp::add $but_frame.but_ok \
-text [mc "Commit new settings"]
# Button "Cancel"
@@ -261,30 +234,210 @@ namespace eval compiler {
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
- -command {::configDialogs::compiler::CANCEL} \
- ] -side right
+ -command {::configDialogues::compiler::CANCEL} \
+ ] -side right -padx 2
DynamicHelp::add $but_frame.but_cancel \
-text [mc "Take changes back and close dialog"]
# Pack frames and notebook
pack $but_frame -side bottom -fill x -anchor s -padx 5 -pady 5
pack $win.header_label -side top -pady 6
- pack $primaryNB -side top -fill both -padx 5
+ pack [$primaryNB get_nb] -side top -fill both -padx 5 -expand 1
# Set window attributes
wm iconphoto $win ::ICONS::16::configure
wm transient $win .
wm title $win [mc "Configure compiler - %s" ${::APPNAME}]
- wm geometry $win 450x460
+ wm geometry $win 470x510
wm resizable $win 0 0
raise $win
catch {grab $win}
wm protocol $win WM_DELETE_WINDOW {
- ::configDialogs::compiler::CANCEL
+ ::configDialogues::compiler::CANCEL
}
tkwait window $win
}
+ ## Create tab "GNU make utility"
+ # @return void
+ proc create_make_tab {} {
+ variable primary_tab_make ;# Widget: Tab "MAIN/GNU make"
+
+ if {!${::PROGRAM_AVAILABLE(make)}} {
+ pack [label $primary_tab_make.warning_lbl \
+ -fg {#DD0000} \
+ -text [mc "Make utility is not available, please install GNU make and restart the IDE."] \
+ ] -pady 10
+ return
+ }
+
+ set primary_tab_make [frame $primary_tab_make.f]
+ pack $primary_tab_make -side top -anchor w -padx 5 -pady 10 -fill both -expand 1
+
+ #
+ ## C compiler
+ #
+ grid [checkbutton $primary_tab_make.chb_c_ena \
+ -text [mc "Use this Makefile instead of calling C compiler directly:"] \
+ -onvalue 1 -offvalue 0 \
+ -variable ::configDialogues::compiler::makeutil_config(c_ena) \
+ -command [list ::configDialogues::compiler::make_tab__chb_ena c] \
+ ] -column 0 -row 0 -sticky w -padx 5 -columnspan 4
+
+ grid [ttk::label $primary_tab_make.clng_make_label \
+ -text [mc "Makefile:"]
+ ] -column 0 -row 1 -padx 5 -pady 5 -sticky w
+ grid [ttk::button \
+ $primary_tab_make.clng_clear_but \
+ -style Flat.TButton \
+ -takefocus 0 \
+ -image ::ICONS::16::locationbar_erase \
+ -command [list ::configDialogues::compiler::make_tab__clr_but c]\
+ -state disabled \
+ ] -column 1 -row 1
+ DynamicHelp::add $primary_tab_make.clng_clear_but -text [mc "Clear the entrybox"]
+ grid [ttk::entry $primary_tab_make.clng_make_entry \
+ -width 0 -validate all \
+ -textvariable ::configDialogues::compiler::makeutil_config(c_file) \
+ -validatecommand [list ::configDialogues::compiler::make_tab__entry_validator c %P] \
+ ] -column 2 -row 1 -sticky we
+ grid [ttk::button $primary_tab_make.clng_flsel_but \
+ -style Flat.TButton \
+ -takefocus 0 \
+ -image ::ICONS::16::fileopen \
+ -command [list ::configDialogues::compiler::make_tab__flsel_but c] \
+ ] -row 1 -column 3 -sticky e
+ DynamicHelp::add $primary_tab_make.clng_flsel_but -text [mc "Select Makefile"]
+
+ grid [ttk::label $primary_tab_make.copt_make_label \
+ -text [mc "Options:"]
+ ] -column 0 -row 2 -padx 5 -pady 5 -sticky w
+ grid [ttk::button \
+ $primary_tab_make.colng_clear_but \
+ -style Flat.TButton \
+ -takefocus 0 \
+ -image ::ICONS::16::locationbar_erase \
+ -command [list ::configDialogues::compiler::make_tab__clr_but co]\
+ -state disabled \
+ ] -column 1 -row 2
+ DynamicHelp::add $primary_tab_make.colng_clear_but -text [mc "Clear the entrybox"]
+ grid [ttk::entry $primary_tab_make.copt_make_entry \
+ -width 0 -validate all \
+ -textvariable ::configDialogues::compiler::makeutil_config(co_file) \
+ -validatecommand [list ::configDialogues::compiler::make_tab__entry_validator co %P] \
+ ] -column 2 -row 2 -sticky we
+
+ grid [ttk::label $primary_tab_make.ctrg_make_label \
+ -text [mc "Targets:"]
+ ] -column 0 -row 3 -padx 5 -pady 5 -sticky w
+ grid [ttk::button \
+ $primary_tab_make.ctlng_clear_but \
+ -style Flat.TButton \
+ -takefocus 0 \
+ -image ::ICONS::16::locationbar_erase \
+ -command [list ::configDialogues::compiler::make_tab__clr_but ct]\
+ -state disabled \
+ ] -column 1 -row 3
+ DynamicHelp::add $primary_tab_make.ctlng_clear_but -text [mc "Clear the entrybox"]
+ grid [ttk::entry $primary_tab_make.ctrg_make_entry \
+ -width 0 -validate all \
+ -textvariable ::configDialogues::compiler::makeutil_config(ct_file) \
+ -validatecommand [list ::configDialogues::compiler::make_tab__entry_validator ct %P] \
+ ] -column 2 -row 3 -sticky we
+
+ grid columnconfigure $primary_tab_make 2 -weight 1
+
+ # Adjust GUI to the current config
+ make_tab__adjust_gui
+
+ update idletasks
+ focus $primary_tab_make.clng_make_entry
+ }
+
+ ## Enable or disable widgets related to Makefile usage configuration
+ # according to content of certain configuration variables.
+ # @return void
+ proc make_tab__adjust_gui {} {
+ # Enable of disable (other) widgets for configuration related to makefiles
+ make_tab__chb_ena c
+ }
+
+ ## Enable or disable widgets for further configuration
+ #
+ # Enable them only if usage of Makefile instead of direct call of a
+ # compiler/assembler was enabled.
+ # @parm Char lang -'c' == C language
+ # @return void
+ proc make_tab__chb_ena {lang} {
+ variable primary_tab_make ;# Widget: Tab "MAIN/GNU make"
+
+ if {$::configDialogues::compiler::makeutil_config(${lang}_ena) && ${::PROGRAM_AVAILABLE(make)}} {
+ make_tab__entry_validator $lang $::configDialogues::compiler::makeutil_config(${lang}_file)
+ make_tab__entry_validator ${lang}o $::configDialogues::compiler::makeutil_config(${lang}o_file)
+ make_tab__entry_validator ${lang}t $::configDialogues::compiler::makeutil_config(${lang}t_file)
+ set state {normal}
+ } else {
+ set state {disabled}
+ }
+
+ if {[winfo exists $primary_tab_make.f]} {
+ $primary_tab_make.${lang}lng_make_entry configure -state $state
+ $primary_tab_make.${lang}lng_flsel_but configure -state $state
+ $primary_tab_make.${lang}opt_make_entry configure -state $state
+ $primary_tab_make.${lang}trg_make_entry configure -state $state
+ }
+ }
+
+ ## Invoke file selection dialog for the Makefile entrybox
+ # @parm Char lang -'c' == C language
+ # @return void
+ proc make_tab__flsel_but {lang} {
+ variable primary_tab_make ;# Widget: Tab "MAIN/GNU make"
+
+ catch {delete object ::fsd}
+ KIFSD::FSD ::fsd \
+ -initialfile $::configDialogues::compiler::makeutil_config(${lang}_file) \
+ -directory [file dirname $::configDialogues::compiler::makeutil_config(${lang}_file)] \
+ -title [mc "Select Makefile - %s - MCU 8051 IDE" $::X::actualProject] \
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "All files"] {*} ] \
+ ]
+ ::fsd setokcmd [subst {
+ set uri \[::fsd get\]
+ set ::configDialogues::compiler::makeutil_config(${lang}_file) \$uri
+ ::configDialogues::compiler::make_tab__entry_validator $lang \$uri
+ }]
+ fsd activate
+ }
+
+ ## Clear the Makefile entrybox (action for the Clear button)
+ # @parm Char lang -'c' == C language
+ # @return void
+ proc make_tab__clr_but {lang} {
+ variable primary_tab_make ;# Widget: Tab "MAIN/GNU make"
+
+ set ::configDialogues::compiler::makeutil_config(${lang}_file) {}
+ make_tab__entry_validator $lang {}
+ }
+
+ ## Disable the clear button if the entrybox is empty, enable it otherwise
+ # @parm Char lang -'c' == C language
+ # @parm String content - Content of the entrybox
+ # @return void
+ proc make_tab__entry_validator {lang content} {
+ variable primary_tab_make ;# Widget: Tab "MAIN/GNU make"
+
+ if {$content == {}} {
+ set state disabled
+ } else {
+ set state normal
+ }
+
+ $primary_tab_make.${lang}lng_clear_but configure -state $state
+
+ return 1
+ }
+
## Create tab "C language"
# @return void
proc create_C_tab {} {
@@ -296,18 +449,7 @@ namespace eval compiler {
variable tertialy_tab_Custom ;# Widget: Tab "MAIN/C language/Custom"
# Create notebook
- set tertialyNB [ttk::notebook $primary_tab_c.nb]
- set ::configDialogs::compiler::tertialyNB__tabs_created [list]
- bind $tertialyNB <<NotebookTabChanged>> {after idle {
- set tab_index [%W index [%W select]]
-
- if {[lsearch ${::configDialogs::compiler::tertialyNB__tabs_created} $tab_index] == -1} {
- lappend ::configDialogs::compiler::tertialyNB__tabs_created $tab_index
-
- configDialogs::compiler::create_T_tab \
- [lindex [list {General} {Code} {Optimization} {Linker} {Custom}] $tab_index]
- }
- }}
+ set tertialyNB [ModernNoteBook $primary_tab_c.nb_t]
# Create notebook tabs
foreach tab {
@@ -324,14 +466,16 @@ namespace eval compiler {
Custom
} \
{
- set frame [frame $tertialyNB.frame_${tab}]
+ set frame [$tertialyNB insert end $tab \
+ -createcmd [list ::configDialogues::compiler::create_T_tab $tab] \
+ -text [mc $text] \
+ ]
set tertialy_tab_$var $frame
- $tertialyNB add $frame -text [mc $text]
}
# Finalize
- $tertialyNB select $tertialyNB.frame_General
- pack $tertialyNB -fill both -expand 1
+ $tertialyNB raise {General}
+ pack [$tertialyNB get_nb] -fill both -expand 1
}
## Create certain tab in notebook "C language"
@@ -401,8 +545,8 @@ namespace eval compiler {
{
grid [radiobutton $local_frame.chb_${local_row}_$col \
-value $name -text $name \
- -variable ::configDialogs::compiler::sdcc_str_opt(standard) \
- ] -column $col -row $local_row -sticky w
+ -variable ::configDialogues::compiler::sdcc_str_opt(standard) \
+ ] -column $col -row $local_row -sticky w -padx 5
DynamicHelp::add $local_frame.chb_${local_row}_$col -text [mc $helptext]
incr col
@@ -419,25 +563,25 @@ namespace eval compiler {
pack $local_frame -side top -fill x
grid [Label $local_frame.lbl_$local_row -anchor w \
- -text {Include path} \
+ -text [mc "Include path"] \
-helptext [mc "Add to the include path, as in -Ipath\nPaths are separated by semicolons (`;')"] \
- ] -column 0 -row $local_row -sticky w
+ ] -column 0 -row $local_row -sticky w -padx 5
grid [ttk::entry $local_frame.chb_$local_row \
-width 0 \
- -textvariable ::configDialogs::compiler::sdcc_scs_str_opt(-I) \
- ] -column 1 -row $local_row -sticky we
+ -textvariable ::configDialogues::compiler::sdcc_scs_str_opt(-I) \
+ ] -column 1 -row $local_row -sticky we -padx 5
DynamicHelp::add $local_frame.chb_$local_row \
- -text [mc "Add to the include (*.h) path, as in -Ipath\nPaths are separated by semicolons (`;')"]
+ -text [mc "Add to the include path, as in -Ipath\nPaths are separated by semicolons (`;')"]
incr local_row
grid [Label $local_frame.lbl_$local_row -anchor w \
- -text {Disable warning} \
+ -text [mc "Disable warning"] \
-helptext [mc "Disable specific warning (--disable-warning)\nNumbers are separated by semicolons (`;')"] \
- ] -column 0 -row $local_row -sticky w
+ ] -column 0 -row $local_row -sticky w -padx 5
grid [ttk::entry $local_frame.chb_$local_row \
-width 0 \
- -textvariable ::configDialogs::compiler::sdcc_scs_str_opt(--disable-warning) \
- ] -column 1 -row $local_row -sticky we
+ -textvariable ::configDialogues::compiler::sdcc_scs_str_opt(--disable-warning) \
+ ] -column 1 -row $local_row -sticky we -padx 5
DynamicHelp::add $local_frame.chb_$local_row -text [mc "Disable specific warning (--disable-warning)\nNumbers are separated by semicolons (`;')"] \
incr local_row
@@ -481,7 +625,7 @@ namespace eval compiler {
grid columnconfigure $local_frame 0 -minsize 25
grid columnconfigure $local_frame 3 -minsize 20
grid [label $local_frame.c_standard -text [mc "Model:"]] \
- -columnspan 6 -column 0 -row 0 -sticky w
+ -columnspan 6 -column 0 -row 0 -sticky w -padx 5
set local_row 1
set col 1
@@ -497,9 +641,9 @@ namespace eval compiler {
{
grid [radiobutton $local_frame.chb_${local_row}_$col \
-value $name -text $name \
- -variable ::configDialogs::compiler::sdcc_str_opt(model) \
- ] -column $col -row $local_row -sticky w
- DynamicHelp::add $local_frame.chb_${local_row}_$col -text $helptext
+ -variable ::configDialogues::compiler::sdcc_str_opt(model) \
+ ] -column $col -row $local_row -sticky w -padx 5
+ DynamicHelp::add $local_frame.chb_${local_row}_$col -text [mc $helptext]
incr col
if {$col >= 3} {
@@ -508,7 +652,7 @@ namespace eval compiler {
}
}
- pack [ttk::separator $frame.sep_0 -orient horizontal] -fill x -pady 5
+ pack [ttk::separator $frame.sep_0 -orient horizontal] -fill x -pady 5 -padx 5
set local_row 0
set local_frame [frame $frame.local_frame_1]
@@ -517,11 +661,11 @@ namespace eval compiler {
grid [Label $local_frame.lbl_$local_row -anchor w \
-text {--codeseg} \
-helptext [mc "Use this name for the code segment"] \
- ] -column 0 -row $local_row -sticky w
+ ] -column 0 -row $local_row -sticky w -padx 5
grid [ttk::entry $local_frame.chb_$local_row \
-width 0 \
- -textvariable ::configDialogs::compiler::sdcc_opt_str_opt(--codeseg) \
- ] -column 1 -row $local_row -sticky we
+ -textvariable ::configDialogues::compiler::sdcc_opt_str_opt(--codeseg) \
+ ] -column 1 -row $local_row -sticky we -padx 5
DynamicHelp::add $local_frame.chb_$local_row \
-text [mc "Use this name for the code segment"]
incr local_row
@@ -529,16 +673,16 @@ namespace eval compiler {
grid [Label $local_frame.lbl_$local_row -anchor w \
-text {--constseg} \
-helptext [mc "Use this name for the const segment"] \
- ] -column 0 -row $local_row -sticky w
+ ] -column 0 -row $local_row -sticky w -padx 5
grid [ttk::entry $local_frame.chb_$local_row \
-width 0 \
- -textvariable ::configDialogs::compiler::sdcc_opt_str_opt(--constseg) \
- ] -column 1 -row $local_row -sticky we
+ -textvariable ::configDialogues::compiler::sdcc_opt_str_opt(--constseg) \
+ ] -column 1 -row $local_row -sticky we -padx 5
DynamicHelp::add $local_frame.chb_$local_row -text [mc "Use this name for the const segment"] \
incr local_row
grid columnconfigure $local_frame 1 -weight 1
- pack [ttk::separator $frame.sep_1 -orient horizontal] -fill x -pady 5
+ pack [ttk::separator $frame.sep_1 -orient horizontal] -fill x -pady 5 -padx 5
}
{Optimization} {
set conf_affected(SDCC_Optimization) 1
@@ -589,14 +733,14 @@ namespace eval compiler {
} \
{
grid [Label $local_frame.lbl_$local_row -anchor w \
- -text $name -helptext [subst $helptext] \
- ] -column 0 -row $local_row -sticky w
+ -text $name -helptext [mc [subst $helptext]] \
+ ] -column 0 -row $local_row -sticky w -padx 5
grid [ttk::entry $local_frame.chb_$local_row \
-width 0 \
- -textvariable ::configDialogs::compiler::sdcc_scs_str_opt($name) \
- ] -column 1 -row $local_row -sticky we
+ -textvariable ::configDialogues::compiler::sdcc_scs_str_opt($name) \
+ ] -column 1 -row $local_row -sticky we -padx 5
DynamicHelp::add $local_frame.chb_$local_row \
- -text [subst $helptext]
+ -text [mc [subst $helptext]]
incr local_row
}
foreach name {
@@ -615,40 +759,23 @@ namespace eval compiler {
} \
{
grid [Label $local_frame.lbl_$local_row -anchor w \
- -text $name -helptext $helptext \
- ] -column 0 -row $local_row -sticky w
+ -text $name -helptext [mc $helptext] \
+ ] -column 0 -row $local_row -sticky w -padx 5
grid [ttk::entry $local_frame.chb_$local_row \
-width 0 \
- -textvariable ::configDialogs::compiler::sdcc_opt_str_opt($name) \
- ] -column 1 -row $local_row -sticky we
- DynamicHelp::add $local_frame.chb_$local_row -text $helptext
+ -textvariable ::configDialogues::compiler::sdcc_opt_str_opt($name) \
+ ] -column 1 -row $local_row -sticky we -padx 5
+ DynamicHelp::add $local_frame.chb_$local_row -text [mc $helptext]
incr local_row
}
- pack [ttk::separator $frame.sep_0 -orient horizontal] -fill x -pady 5
+ pack [ttk::separator $frame.sep_0 -orient horizontal] -fill x -pady 5 -padx 5
set local_frame [frame $frame.local_frame_0]
pack $local_frame -side top -anchor w
grid columnconfigure $local_frame 0 -minsize 25
- pack [ttk::separator $frame.sep_1 -orient horizontal] -fill x -pady 5
+ pack [ttk::separator $frame.sep_1 -orient horizontal] -fill x -pady 5 -padx 5
grid [label $local_frame.c_standard -text [mc "Stack:"]] \
-columnspan 3 -column 0 -row 0 -sticky w
-
- set local_row 1
- foreach name {
- --pack-iram --no-pack-iram
- } helptext {
- {Tells the linker to pack variables in internal ram}
- {Tells the linker not to pack variables in internal ram}
- } \
- {
- grid [radiobutton $local_frame.chb_${local_row} \
- -value $name -text $name \
- -variable ::configDialogs::compiler::sdcc_str_opt(stack) \
- ] -column 1 -row $local_row -sticky w
- DynamicHelp::add $local_frame.chb_${local_row} -text $helptext
-
- incr local_row
- }
}
{Custom} {
set conf_affected(SDCC_Custom) 1
@@ -670,13 +797,13 @@ namespace eval compiler {
$sdcc_custom_opts_text insert end $sdcc_str_opt(custom)
pack $main_frame -side top -fill both -expand 1
- } {
+ } else {
set col 0
foreach name $names helptext $helptexts {
grid [checkbutton $main_frame.chb_${row}_$col \
-text $name -onvalue 1 -offvalue 0 \
- -variable ::configDialogs::compiler::sdcc_bool_opt($name) \
- ] -column $col -row $row -sticky w
+ -variable ::configDialogues::compiler::sdcc_bool_opt($name) \
+ ] -column $col -row $row -sticky w -padx 5
DynamicHelp::add $main_frame.chb_${row}_$col -text [mc $helptext]
incr col
@@ -700,8 +827,8 @@ namespace eval compiler {
set main_frame [frame $assembler_tab_compiler.frame]
# Preferred editor
grid [label $main_frame.editor_lbl \
- -text [mc "Preferred assemler:"] -anchor w \
- ] -row 0 -column 0 -sticky w
+ -text [mc "Preferred assembler:"] -anchor w \
+ ] -row 0 -column 0 -sticky w -padx 10 -pady 10
set row 1
set i 0
foreach text {
@@ -711,12 +838,12 @@ namespace eval compiler {
{AS31}
} helptext {
{MCU 8051 IDE native assembler - Sophisticated but slow}
- {Sophisticated and very fast assembler writen by W.W. Heinz}
+ {Sophisticated and very fast assembler written by W.W. Heinz}
{Multiplatform assembler written by Alfred Arnold}
{Simple 8051 assembler}
} {
grid [radiobutton $main_frame.rabut_$i \
- -variable ::configDialogs::compiler::selected_assembler \
+ -variable ::configDialogues::compiler::selected_assembler \
-value $i -text $text -state disabled \
] -column 0 -padx 25 -row $row -sticky w
DynamicHelp::add $main_frame.rabut_$i -text [mc $helptext]
@@ -724,13 +851,13 @@ namespace eval compiler {
incr row
}
$main_frame.rabut_0 configure -state normal
- if {${::PROGRAM_AVALIABLE(asem)}} {
+ if {${::PROGRAM_AVAILABLE(asem)}} {
$main_frame.rabut_1 configure -state normal
}
- if {${::PROGRAM_AVALIABLE(asl)}} {
+ if {${::PROGRAM_AVAILABLE(asl)}} {
$main_frame.rabut_2 configure -state normal
}
- if {${::PROGRAM_AVALIABLE(as31)}} {
+ if {${::PROGRAM_AVAILABLE(as31)}} {
$main_frame.rabut_3 configure -state normal
}
@@ -739,8 +866,11 @@ namespace eval compiler {
incr row
grid [text $main_frame.notes \
- -bg {#EEEEEE} -bd 0 -highlightthickness 0 -wrap word \
- -font [font create -family {helvetiva} -size -12] \
+ -bg ${::COMMON_BG_COLOR} -bd 0 -highlightthickness 0 -wrap word \
+ -font [font create \
+ -family {helvetiva} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ ] \
] -row $row -column 0 -sticky we -columnspan 2 -padx 10
$main_frame.notes insert end [mc "Notes to assemblers:\n"]
@@ -748,7 +878,9 @@ namespace eval compiler {
$main_frame.notes insert end [mc " b) ASEM-51 is a great assembler written by W.W. Heinz.\n"]
$main_frame.notes insert end [mc " You can find it at http://plit.de/asem-51/home.htm\n"]
$main_frame.notes insert end [mc " c) ASL: http://linux.maruhn.com/sec/asl.html\n"]
- $main_frame.notes insert end [mc " d) AS31: http://www.pjrc.com/tech/8051/\n"]
+ $main_frame.notes insert end [mc " d) AS31: http://www.pjrc.com/tech/8051\n"]
+ create_link_tag_in_text_widget $main_frame.notes
+ convert_all_https_to_links $main_frame.notes
$main_frame.notes configure -state disabled
@@ -783,13 +915,13 @@ namespace eval compiler {
} \
{
pack [checkbutton $main_frame.checkbutton_$i \
- -text $name -onvalue 1 -offvalue 0 \
- -variable ::configDialogs::compiler::assembler_ASEM51_config($name) \
- ] -anchor nw
- DynamicHelp::add $main_frame.checkbutton_$i -text $helptext
+ -text [mc $name] -onvalue 1 -offvalue 0 \
+ -variable ::configDialogues::compiler::assembler_ASEM51_config($name) \
+ ] -anchor nw -padx 5
+ DynamicHelp::add $main_frame.checkbutton_$i -text [mc $helptext]
incr i
}
- pack $main_frame -fill x
+ pack $main_frame -fill x -padx 5
# Additional options
set main_frame [frame $assembler_tab_ASEM51.frame_a]
@@ -802,15 +934,15 @@ namespace eval compiler {
{Generate <file>.adb (MCU 8051 IDE Assembler Debug File) from <file>.lst}
} \
{
- set helptext [subst $helptext]
+ set helptext [mc [subst $helptext]]
pack [checkbutton $main_frame.chb_$i \
- -text $text -onvalue 1 -offvalue 0 \
- -variable ::configDialogs::compiler::assembler_ASEM51_addcfg($var) \
- ] -anchor w
+ -text [mc $text] -onvalue 1 -offvalue 0 \
+ -variable ::configDialogues::compiler::assembler_ASEM51_addcfg($var) \
+ ] -anchor w -padx 5
DynamicHelp::add $main_frame.chb_$i -text $helptext
incr i
}
- pack $main_frame -fill x
+ pack $main_frame -fill x -padx 5
pack [ttk::separator $assembler_tab_ASEM51.sep_1 -orient horizontal] -fill x -pady 5
# Create second frame (Include path and custom flags)
@@ -819,20 +951,20 @@ namespace eval compiler {
grid [Label $main_frame.lbl_0 -anchor w \
-text [mc "Include paths:"] \
-helptext [mc "Option -i\nSeparate directories by colons (`:')"] \
- ] -column 0 -row 0 -sticky w
+ ] -column 0 -row 0 -sticky w -padx 5
grid [ttk::entry $main_frame.entry \
- -textvariable ::configDialogs::compiler::assembler_ASEM51_config(-i) \
- ] -column 1 -row 0 -sticky we
+ -textvariable ::configDialogues::compiler::assembler_ASEM51_config(-i) \
+ ] -column 1 -row 0 -sticky we -padx 5
DynamicHelp::add $main_frame.entry \
-text [mc "Option -i\nSeparate directories by colons (`:')"]
grid [Label $main_frame.lbl_1 \
-anchor w \
-text [mc "Custom options:"] \
- ] -column 0 -row 1 -sticky w
+ ] -column 0 -row 1 -sticky w -padx 5
# Configure grid and pack main frame 1
grid columnconfigure $main_frame 1 -weight 1
- pack $main_frame -fill x
+ pack $main_frame -fill x -padx 5
# Text widget "Custom options"
set main_frame [frame $assembler_tab_ASEM51.frame2]
@@ -846,8 +978,8 @@ namespace eval compiler {
-command "$asm51_custom_opts_text yview" \
] -side right -fill y
$asm51_custom_opts_text insert end \
- $::configDialogs::compiler::assembler_ASEM51_config(custom)
- pack $main_frame -fill both -expand 1
+ $::configDialogues::compiler::assembler_ASEM51_config(custom)
+ pack $main_frame -fill both -expand 1 -pady 5
}
## Create tab "AS31"
@@ -870,15 +1002,15 @@ namespace eval compiler {
} text {
{Generate a listing file, option `-l'}
} helptext {
- {This option tells the assembler to generate a listing file.\n\nTHIS OPTION IS REQUIRED BY THIS IDE TO GENERATE BEBUG FILE !}
+ {This option tells the assembler to generate a listing file.\n\nTHIS OPTION IS REQUIRED BY THIS IDE TO GENERATE DEBUG FILE !}
} \
{
- set helptext [subst $helptext]
+ set helptext [mc [subst $helptext]]
grid [checkbutton $main_frame.checkbutton_$i \
-text [mc $text] -onvalue 1 -offvalue 0 \
- -variable ::configDialogs::compiler::assembler_AS31_config($name) \
- ] -sticky w -row $row -column $col
- DynamicHelp::add $main_frame.checkbutton_$i -text [mc $helptext]
+ -variable ::configDialogues::compiler::assembler_AS31_config($name) \
+ ] -sticky w -row $row -column $col -padx 5
+ DynamicHelp::add $main_frame.checkbutton_$i -text $helptext
incr i
incr col
@@ -890,7 +1022,7 @@ namespace eval compiler {
for {set i 0} {$i < 4} {incr i} {
grid columnconfigure $main_frame $i -weight 1
}
- pack $main_frame -fill x
+ pack $main_frame -fill x -padx 5
# Additional options
set main_frame [frame $assembler_tab_AS31.frame_a]
@@ -903,15 +1035,15 @@ namespace eval compiler {
{Generate <file>.adb (MCU 8051 IDE Assembler Debug File)\nfrom <file>.lst}
} \
{
- set helptext [subst $helptext]
+ set helptext [mc [subst $helptext]]
pack [checkbutton $main_frame.chb_$i \
-text [mc $text] -onvalue 1 -offvalue 0 \
- -variable ::configDialogs::compiler::assembler_AS31_addcfg($var) \
- ] -anchor w
- DynamicHelp::add $main_frame.chb_$i -text [mc $helptext]
+ -variable ::configDialogues::compiler::assembler_AS31_addcfg($var) \
+ ] -anchor w -padx 5
+ DynamicHelp::add $main_frame.chb_$i -text $helptext
incr i
}
- pack $main_frame -fill x
+ pack $main_frame -fill x -padx 5
pack [ttk::separator $assembler_tab_AS31.sep_1 -orient horizontal] -fill x
# Create second frame (EntryBoxes and ComboBoxes)
@@ -920,21 +1052,21 @@ namespace eval compiler {
foreach name {
-F
} helptext {
- {This options specifies the output format that is to be used.\n\nSee AS31 manual page for more datails ...}
+ {This options specifies the output format that is to be used.\n\nSee AS31 manual page for more details ...}
} values {
{hex tdr byte od srec2 srec3 srec4}
} \
{
- set helptext [subst $helptext]
+ set helptext [mc [subst $helptext]]
grid [Label $main_frame.lbl_$row -anchor w \
-text $name -helptext [mc $helptext] \
- ] -column 0 -row $row -sticky w
+ ] -column 0 -row $row -sticky w -padx 5
grid [ttk::combobox $main_frame.entry_$row \
-state readonly \
-values $values \
- -textvariable ::configDialogs::compiler::assembler_AS31_config($name) \
- ] -column 1 -row $row -sticky we
- DynamicHelp::add $main_frame.entry_$row -text [mc $helptext]
+ -textvariable ::configDialogues::compiler::assembler_AS31_config($name) \
+ ] -column 1 -row $row -sticky we -padx 5
+ DynamicHelp::add $main_frame.entry_$row -text $helptext
incr row
}
foreach name {
@@ -943,26 +1075,26 @@ namespace eval compiler {
{This option specifies a format specific string which is\npassed to the format generator. Both format "tdr" and the\nsrecord formats use this option.}
} \
{
- set helptext [subst $helptext]
+ set helptext [mc [subst $helptext]]
grid [Label $main_frame.lbl_$row -anchor w \
- -text $name -helptext [mc $helptext] \
- ] -column 0 -row $row -sticky w
+ -text $name -helptext $helptext \
+ ] -column 0 -row $row -sticky w -padx 5
grid [ttk::entry $main_frame.entry_$row \
- -textvariable ::configDialogs::compiler::assembler_AS31_config($name) \
- ] -column 1 -row $row -sticky we
+ -textvariable ::configDialogues::compiler::assembler_AS31_config($name) \
+ ] -column 1 -row $row -sticky we -padx 5
DynamicHelp::add $main_frame.entry_$row \
- -text [mc $helptext]
+ -text $helptext
incr row
}
# Custom flags
grid [Label $main_frame.lbl_$row -anchor w \
-text [mc "Custom options:"] \
- ] -column 0 -row $row -sticky w
+ ] -column 0 -row $row -sticky w -padx 5
# Configure grid and pack main frame 1
grid columnconfigure $main_frame 1 -weight 1
- pack $main_frame -fill x
+ pack $main_frame -fill x -padx 5
# Text widget "Custom options"
set main_frame [frame $assembler_tab_AS31.frame2]
@@ -976,7 +1108,7 @@ namespace eval compiler {
-command "$as31_custom_opts_text yview" \
] -side right -fill y
$as31_custom_opts_text insert end \
- $::configDialogs::compiler::assembler_AS31_config(custom)
+ $::configDialogues::compiler::assembler_AS31_config(custom)
pack $main_frame -fill both -expand 1
}
@@ -1016,12 +1148,12 @@ namespace eval compiler {
{Turn on extended error reporting. With extended error\nreporting, several error and warning messages will also\nprint the item that created the message, e.g. the name of\nan unknown instruction. When this option is given twice,\nthe erroneous source line is additinally printed.}
} \
{
- set helptext [subst $helptext]
+ set helptext [mc [subst $helptext]]
grid [checkbutton $main_frame.checkbutton_$i \
-text $name -onvalue 1 -offvalue 0 \
- -variable ::configDialogs::compiler::assembler_ASL_config($name) \
- ] -sticky w -row $row -column $col
- DynamicHelp::add $main_frame.checkbutton_$i -text [mc $helptext]
+ -variable ::configDialogues::compiler::assembler_ASL_config($name) \
+ ] -sticky w -row $row -column $col -padx 5
+ DynamicHelp::add $main_frame.checkbutton_$i -text $helptext
incr i
incr col
@@ -1033,7 +1165,7 @@ namespace eval compiler {
for {set i 0} {$i < 4} {incr i} {
grid columnconfigure $main_frame $i -weight 1
}
- pack $main_frame -fill x
+ pack $main_frame -fill x -padx 5
pack [ttk::separator $assembler_tab_ASL.sep_0 -orient horizontal] -fill x
# Additional options
@@ -1049,15 +1181,15 @@ namespace eval compiler {
{Generate <file>.adb (MCU 8051 IDE Assembler Debug File)\nfrom <file>.hex and <file>.map}
} \
{
- set helptext [subst $helptext]
+ set helptext [mc [subst $helptext]]
pack [checkbutton $main_frame.chb_$i \
-text [mc $text] -onvalue 1 -offvalue 0 \
- -variable ::configDialogs::compiler::assembler_ASL_addcfg($var) \
+ -variable ::configDialogues::compiler::assembler_ASL_addcfg($var) \
] -anchor w
- DynamicHelp::add $main_frame.chb_$i -text [mc $helptext]
+ DynamicHelp::add $main_frame.chb_$i -text $helptext
incr i
}
- pack $main_frame -fill x
+ pack $main_frame -fill x -padx 5
pack [ttk::separator $assembler_tab_ASL.sep_1 -orient horizontal] -fill x
# Create second frame (EntryBoxes and ComboBoxes)
@@ -1078,16 +1210,16 @@ namespace eval compiler {
}
} \
{
- set helptext [subst $helptext]
+ set helptext [mc [subst $helptext]]
grid [Label $main_frame.lbl_$row -anchor w \
-text $name -helptext [mc $helptext] \
- ] -column 0 -row $row -sticky w
+ ] -column 0 -row $row -sticky w -padx 5
grid [ttk::combobox $main_frame.entry_$row \
-state readonly \
-values $values \
- -textvariable ::configDialogs::compiler::assembler_ASL_config($name) \
- ] -column 1 -row $row -sticky we
- DynamicHelp::add $main_frame.entry_$row -text [mc $helptext]
+ -textvariable ::configDialogues::compiler::assembler_ASL_config($name) \
+ ] -column 1 -row $row -sticky we -padx 5
+ DynamicHelp::add $main_frame.entry_$row -text $helptext
incr row
}
foreach name {
@@ -1097,25 +1229,25 @@ namespace eval compiler {
{-i <path\[:path...\]>\tAdd new entries to the list of paths that are\n\tsearched for include files. New entries are\n\tprepended to the current include path list,\n\tso if multiple paths are given with one\n\tcommand-line parameter, they will be entered\n\tinto the path list in reverse order.}
} \
{
- set helptext [subst $helptext]
+ set helptext [mc [subst $helptext]]
grid [Label $main_frame.lbl_$row -anchor w \
-text $name -helptext [mc $helptext] \
- ] -column 0 -row $row -sticky w
+ ] -column 0 -row $row -sticky w -padx 5
grid [ttk::entry $main_frame.entry_$row \
- -textvariable ::configDialogs::compiler::assembler_ASL_config($name) \
- ] -column 1 -row $row -sticky we
- DynamicHelp::add $main_frame.entry_$row -text [mc $helptext]
+ -textvariable ::configDialogues::compiler::assembler_ASL_config($name) \
+ ] -column 1 -row $row -sticky we -padx 5
+ DynamicHelp::add $main_frame.entry_$row -text $helptext
incr row
}
# Custom flags
grid [Label $main_frame.lbl_$row -anchor w \
-text [mc "Custom options:"] \
- ] -column 0 -row $row -sticky w
+ ] -column 0 -row $row -sticky w -padx 5
# Configure grid and pack main frame 1
grid columnconfigure $main_frame 1 -weight 1
- pack $main_frame -fill x
+ pack $main_frame -fill x -padx 5
# Text widget "Custom options"
set main_frame [frame $assembler_tab_ASL.frame2]
@@ -1129,7 +1261,7 @@ namespace eval compiler {
-command "$asl_custom_opts_text yview" \
] -side right -fill y
$asl_custom_opts_text insert end \
- $::configDialogs::compiler::assembler_ASL_config(custom)
+ $::configDialogues::compiler::assembler_ASL_config(custom)
pack $main_frame -fill both -expand 1
}
@@ -1143,14 +1275,12 @@ namespace eval compiler {
set conf_affected(MCU8051IDE) 1
## Create notebook
- set nb0 [ttk::notebook $assembler_tab_M8I.nb]
-
+ set nb0 [ModernNoteBook $assembler_tab_M8I.nb_m]
+
# Tab "Output"
- set ouput_tab [frame $nb0.ouput_tab]
- $nb0 add $ouput_tab -text [mc "Output"]
+ set ouput_tab [$nb0 insert end ouput_tab -text [mc "Output"]]
# Tab "Directives"
- set directives_tab [frame $nb0.directives_tab]
- $nb0 add $directives_tab -text [mc "Directives"]
+ set directives_tab [$nb0 insert end directives_tab -text [mc "Directives"]]
#
## Tab "Output"
@@ -1160,155 +1290,160 @@ namespace eval compiler {
grid [Label $ouput_tab.source_label \
-text [mc "Source"] -anchor c \
-helptext [mc "Use value defined in source code"] \
- ] -column 2 -row 0 -sticky we
+ ] -column 2 -row 0 -sticky we -padx 5
grid [Label $ouput_tab.always_label \
-text [mc "Always"] -anchor c \
-helptext [mc "Generate always"] \
- ] -column 3 -row 0 -sticky we
+ ] -column 3 -row 0 -sticky we -padx 5
grid [Label $ouput_tab.never_label \
-text [mc "Never"] -anchor c \
-helptext [mc "Never generate"] \
- ] -column 4 -row 0 -sticky we
+ ] -column 4 -row 0 -sticky we -padx 5
# Code listing
grid [Label $ouput_tab.lst_label -anchor w \
-text [mc "Generate code listing"] \
-helptext [mc "Should compiler generate *.lst files"] \
- ] -column 1 -row 1 -sticky we
+ ] -column 1 -row 1 -sticky we -padx 5
grid [radiobutton $ouput_tab.lst_radio0 -value 0 \
- -variable ::configDialogs::compiler::option__print \
- ] -column 2 -row 1
+ -variable ::configDialogues::compiler::option__print \
+ ] -column 2 -row 1 -padx 5
grid [radiobutton $ouput_tab.lst_radio1 -value 1 \
- -variable ::configDialogs::compiler::option__print \
- ] -column 3 -row 1
+ -variable ::configDialogues::compiler::option__print \
+ ] -column 3 -row 1 -padx 5
grid [radiobutton $ouput_tab.lst_radio2 -value 2 \
- -variable ::configDialogs::compiler::option__print \
- ] -column 4 -row 1
+ -variable ::configDialogues::compiler::option__print \
+ ] -column 4 -row 1 -padx 5
# Table of symbols
grid [Label $ouput_tab.sym_label -anchor w \
-text [mc "Table of symbols (in *.lst)"] \
-helptext [mc "Include table of used symbolic names to code listing"] \
- ] -column 1 -row 2 -sticky we
+ ] -column 1 -row 2 -sticky we -padx 5
grid [radiobutton $ouput_tab.sym_radio0 -value 0 \
- -variable ::configDialogs::compiler::option__symbols \
- ] -column 2 -row 2
+ -variable ::configDialogues::compiler::option__symbols \
+ ] -column 2 -row 2 -padx 5
grid [radiobutton $ouput_tab.sym_radio1 -value 1 \
- -variable ::configDialogs::compiler::option__symbols \
- ] -column 3 -row 2
+ -variable ::configDialogues::compiler::option__symbols \
+ ] -column 3 -row 2 -padx 5
grid [radiobutton $ouput_tab.sym_radio2 -value 2 \
- -variable ::configDialogs::compiler::option__symbols \
- ] -column 4 -row 2
+ -variable ::configDialogues::compiler::option__symbols \
+ ] -column 4 -row 2 -padx 5
# Hex object code
grid [Label $ouput_tab.hex_label -anchor w \
-text [mc "Generate object code (ihex8)"] \
-helptext [mc "Generate object code in format Intel Hex 8 (*.hex)"] \
- ] -column 1 -row 3 -sticky we
+ ] -column 1 -row 3 -sticky we -padx 5
grid [radiobutton $ouput_tab.hex_radio0 -value 0 \
- -variable ::configDialogs::compiler::option__object \
- ] -column 2 -row 3
+ -variable ::configDialogues::compiler::option__object \
+ ] -column 2 -row 3 -padx 5
grid [radiobutton $ouput_tab.hex_radio1 -value 1 \
- -variable ::configDialogs::compiler::option__object \
- ] -column 3 -row 3
+ -variable ::configDialogues::compiler::option__object \
+ ] -column 3 -row 3 -padx 5
grid [radiobutton $ouput_tab.hex_radio2 -value 2 \
- -variable ::configDialogs::compiler::option__object \
- ] -column 4 -row 3
+ -variable ::configDialogues::compiler::option__object \
+ ] -column 4 -row 3 -padx 5
grid [ttk::separator $ouput_tab.sep0 \
-orient horizontal \
- ] -column 0 -row 4 -columnspan 5 -sticky we -pady 5
+ ] -column 0 -row 4 -columnspan 5 -sticky we -pady 5 -padx 5
# Sim object code
grid [Label $ouput_tab.sim_label -anchor w \
-text [mc "Generate code for simulator"] \
-helptext [mc "Generate *.sim file for simulator"] \
- ] -column 1 -row 5 -sticky we
- grid [checkbutton $ouput_tab.sim_check \
- -variable ::configDialogs::compiler::option_CREATE_SIM_FILE \
- ] -column 2 -row 5 -sticky w -columnspan 3
+ ] -column 1 -row 5 -sticky we -padx 5
+ grid [checkbutton $ouput_tab.sim_check \
+ -variable ::configDialogues::compiler::option_CREATE_SIM_FILE \
+ ] -column 2 -row 5 -sticky w -columnspan 3 -padx 5
# Bin object code
grid [Label $ouput_tab.bin_label -anchor w \
-text [mc "Generate binary object code"] \
-helptext [mc "Generate binary object code (*.bin)"] \
- ] -column 1 -row 6 -sticky we
+ ] -column 1 -row 6 -sticky we -padx 5
grid [checkbutton $ouput_tab.bin_check \
- -variable ::configDialogs::compiler::option_CREATE_BIN_FILE \
- ] -column 2 -row 6 -sticky w -columnspan 3
+ -variable ::configDialogues::compiler::option_CREATE_BIN_FILE \
+ ] -column 2 -row 6 -sticky w -columnspan 3 -padx 5
grid [ttk::separator $ouput_tab.sep1 \
-orient horizontal \
- ] -column 0 -row 7 -columnspan 5 -sticky we -pady 5
+ ] -column 0 -row 7 -columnspan 5 -sticky we -pady 5 -padx 5
# Compier warning level
grid [Label $ouput_tab.warning_label -anchor w \
-text [mc "Warning level"] \
-helptext [mc "What kind of messages should be included in compiler log output"] \
- ] -column 1 -row 8 -sticky we
+ ] -column 1 -row 8 -sticky we -padx 5
grid [ttk::combobox $ouput_tab.warning_combo \
- -textvariable ::configDialogs::compiler::opt_WARNING_LEVEL \
- -values {
- {All}
- {Errors + Warnings}
- {Errros only}
- {Nothing}
- } \
+ -textvariable ::configDialogues::compiler::opt_WARNING_LEVEL \
+ -values [list \
+ [mc "All"] \
+ [mc "Errors + Warnings"] \
+ [mc "Errros only"] \
+ [mc "Nothing"] \
+ ] \
-state readonly -width 17 \
- ] -column 2 -row 8 -sticky w -columnspan 3
+ ] -column 2 -row 8 -sticky w -columnspan 3 -padx 5
DynamicHelp::add $ouput_tab.warning_combo \
-text [mc "What kind of messages should be included in compiler log output"]
# Verbose
grid [Label $ouput_tab.verbose_label -anchor w \
-text [mc "Verbose"] \
- -helptext [mc "Should compiler inoform user about what it is doing"] \
- ] -column 1 -row 9 -sticky we
+ -helptext [mc "Should compiler inform user about what it is doing"] \
+ ] -column 1 -row 9 -sticky we -padx 5
grid [checkbutton $ouput_tab.verbose_check \
-onvalue 0 -offvalue 1 \
- -variable ::configDialogs::compiler::option_QUIET \
- ] -column 2 -row 9 -sticky w -columnspan 3
+ -variable ::configDialogues::compiler::option_QUIET \
+ ] -column 2 -row 9 -sticky w -columnspan 3 -padx 5
grid [ttk::separator $ouput_tab.sep2 \
-orient horizontal \
- ] -column 0 -row 10 -columnspan 5 -sticky we -pady 5
+ ] -column 0 -row 10 -columnspan 5 -sticky we -pady 5 -padx 5
- # Enable optimalizations
+ # Enable optimization
grid [Label $ouput_tab.optim_label -anchor w \
- -text [mc "Enable optimalizations"] \
- -helptext [mc "Enable peephole optimalizations"]\
- ] -column 1 -row 11 -sticky we
+ -text [mc "Enable optimization"] \
+ -helptext [mc "Enable peephole optimization"]\
+ ] -column 1 -row 11 -sticky we -padx 5
grid [checkbutton $ouput_tab.optim_check \
-onvalue 1 -offvalue 0 \
- -variable ::configDialogs::compiler::option_optim_ena \
- ] -column 2 -row 11 -sticky w -columnspan 3
+ -variable ::configDialogues::compiler::option_optim_ena \
+ ] -column 2 -row 11 -sticky w -columnspan 3 -padx 5
# Maximum length of IHEX-8 record
grid [Label $ouput_tab.ih8_max_len_lbl -anchor w \
-text [mc "Maximum HEX record data length"] \
- -helptext [mc "Maximum length of Intel HEX 8 record data field.\n\nGeneraly it doesn't matter what is set here. But some (badly written)\nprogrammes may refuse to load files containing records which exceeds\ncertain length.\n\nHigher value also results in smaller .hex files\n\nValue equal to 0 will be treated as 1"] \
- ] -column 1 -row 12 -sticky we
- grid [spinbox $ouput_tab.ih8_max_len_spbox \
- -from 0 -to 255 -bg white -validate all -width 4 \
- -textvariable ::configDialogs::compiler::max_ihex_rec_length \
- -vcmd "::configDialogs::compiler::ih8_max_len_spbox_val %P"
- ] -column 2 -row 12 -sticky w -columnspan 3
+ -helptext [mc "Maximum length of Intel HEX 8 record data field.\n\nGenerally it doesn't matter what is set here. But some (badly written)\nprogrammers may refuse to load files containing records which exceeds\ncertain length.\n\nHigher value also results in smaller .hex files\n\nValue equal to 0 will be treated as 1"] \
+ ] -column 1 -row 12 -sticky we -padx 5
+ grid [ttk::spinbox $ouput_tab.ih8_max_len_spbox \
+ -from 0 -to 255 -validate all -width 4 \
+ -textvariable ::configDialogues::compiler::max_ihex_rec_length \
+ -validatecommand "::configDialogues::compiler::ih8_max_len_spbox_val %P" \
+ ] -column 2 -row 12 -sticky w -columnspan 3 -padx 5
+
#
## Tab "Directives"
#
# Header
- grid [label $directives_tab.header \
- -anchor w -text [mc "Ignore directives"] \
- -font [font create -family {helvetica} -size -17 -weight bold] \
+ grid [label $directives_tab.header \
+ -anchor w -text [mc "Ignore directives"] \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
+ ] \
] -column 0 -row 0 -columnspan 3 -sticky we -pady 10 -padx 10
grid [label $directives_tab.accept_label \
-text [mc "Accept"] -anchor w \
- ] -column 1 -row 1
+ ] -column 1 -row 1 -padx 5
grid [label $directives_tab.ignore_label \
-text [mc "Ignore"] -anchor w \
- ] -column 2 -row 1
+ ] -column 2 -row 1 -padx 5
# Create matrix of radio buttons
set row 2
@@ -1328,26 +1463,27 @@ namespace eval compiler {
{}
{}
{}
- } {
-
+ } \
+ {
# Label
grid [Label $directives_tab.${var}_label \
-text $txt -anchor w -highlightthickness 0 -bd 0 \
-helptext $helptext \
- ] -column 0 -row $row -sticky we
+ ] -column 0 -row $row -sticky we -padx 5
# Accept
grid [radiobutton $directives_tab.${var}_radio0 -value 0 \
- -variable ::configDialogs::compiler::option__${var} \
- ] -column 1 -row $row
+ -variable ::configDialogues::compiler::option__${var} \
+ ] -column 1 -row $row -padx 5
# Ignore
grid [radiobutton $directives_tab.${var}_radio1 -value 1 \
- -variable ::configDialogs::compiler::option__${var} \
- ] -column 2 -row $row
+ -variable ::configDialogues::compiler::option__${var} \
+ ] -column 2 -row $row -padx 5
incr row
}
- pack $nb0 -side top -fill both -expand 1
+ $nb0 raise ouput_tab
+ pack [$nb0 get_nb] -side top -fill both -expand 1
}
## Validate content of spinbox "Max length of IHEX-8 record"
@@ -1373,7 +1509,7 @@ namespace eval compiler {
variable opt_WARNING_LEVEL ;# Warning level
variable max_ihex_rec_length ;# Int: Maximum length of IHEX-8 record
- variable selected_assembler ;# Int: Preffered assembler (0==MCU8051IDE;1==ASEM-51;2==ASL)
+ variable selected_assembler ;# Int: Preferred assembler (0==MCU8051IDE;1==ASEM-51;2==ASL)
variable assembler_ASEM51_config;# Array: ASEM-51 configuration
variable assembler_ASEM51_addcfg;# Array: ASEM-51 additional configuration
variable assembler_ASL_config ;# Array: ASL configuration
@@ -1386,22 +1522,24 @@ namespace eval compiler {
variable sdcc_opt_str_opt ;# Array: SDCC configuration
variable sdcc_scs_str_opt ;# Array: SDCC configuration
+ variable makeutil_config ;# Array: Make utility configuration
+
## Assembler: MCU8051IDE
# Set local option variables
foreach var $defaults {
set var [lindex $var 0]
- set ::configDialogs::compiler::option_${var} [subst "\$::Compiler::Settings::$var"]
+ set ::configDialogues::compiler::option_${var} [subst -nocommands "\$::Compiler::Settings::$var"]
}
- set max_ihex_rec_length ${Compiler::Settings::max_ihex_rec_length}
+ set max_ihex_rec_length ${::Compiler::Settings::max_ihex_rec_length}
- # Set warning level
- set tmp {All}
+ # Set warning level
+ set tmp [mc "All"]
switch -- ${::Compiler::Settings::WARNING_LEVEL} {
- 0 {set tmp {All}}
- 1 {set tmp {Errors + Warnings}}
- 2 {set tmp {Errros only}}
- 3 {set tmp {Nothing}}
+ 0 {set tmp [mc "All"]}
+ 1 {set tmp [mc "Errors + Warnings"]}
+ 2 {set tmp [mc "Errros only"]}
+ 3 {set tmp [mc "Nothing"]}
default {puts stderr "Invalid WARNING_LEVEL value"}
}
set opt_WARNING_LEVEL $tmp
@@ -1427,9 +1565,15 @@ namespace eval compiler {
array set sdcc_opt_str_opt [array get ::ExternalCompiler::sdcc_optional_string_options]
# Copy semicolon separated optional string options
array set sdcc_scs_str_opt [array get ::ExternalCompiler::sdcc_scs_string_options]
+
+ ## GNU Make utility configuration
+ # General options
+ foreach key [array names ::ExternalCompiler::makeutil_config] {
+ set makeutil_config($key) $::ExternalCompiler::makeutil_config($key)
+ }
}
- ## Set compiler acording to local settings
+ ## Set compiler according to local settings
# @return void
proc use_settings {} {
variable defaults ;# List of default settings
@@ -1437,7 +1581,7 @@ namespace eval compiler {
variable conf_affected ;# Array of Bool: Affected parts of configuration
variable max_ihex_rec_length ;# Int: Maximum length of IHEX-8 record
- variable selected_assembler ;# Int: Preffered assembler (0==MCU8051IDE;1==ASEM-51;2==ASL)
+ variable selected_assembler ;# Int: Preferred assembler (0==MCU8051IDE;1==ASEM-51;2==ASL)
variable assembler_ASEM51_config;# Array: ASEM-51 configuration
variable assembler_ASEM51_addcfg;# Array: ASEM-51 additional configuration
variable assembler_ASL_config ;# Array: ASL configuration
@@ -1455,12 +1599,14 @@ namespace eval compiler {
variable sdcc_opt_str_opt ;# Array: SDCC configuration
variable sdcc_scs_str_opt ;# Array: SDCC configuration
+ variable makeutil_config ;# Array: Make utility configuration
+
## Assembler: MCU8051IDE
if {$conf_affected(MCU8051IDE)} {
# Set option variables
foreach var $defaults {
set var [lindex $var 0]
- set ::Compiler::Settings::$var [subst "\$::configDialogs::compiler::option_${var}"]
+ set ::Compiler::Settings::$var [subst -nocommands "\$::configDialogues::compiler::option_${var}"]
}
if {![string length $max_ihex_rec_length]} {
set max_ihex_rec_length 0
@@ -1469,23 +1615,23 @@ namespace eval compiler {
# Set warning level
set tmp ${::Compiler::Settings::WARNING_LEVEL}
- switch -- $opt_WARNING_LEVEL {
- {All} {
+ switch -- $opt_WARNING_LEVEL [subst {
+ {[mc "All"]} {
set tmp 0
}
- {Errors + Warnings} {
+ [mc "Errors + Warnings"] {
set tmp 1
}
- {Errros only} {
+ {[mc "Errros only"]} {
set tmp 2
}
- {Nothing} {
+ {[mc "Nothing"]} {
set tmp 3
}
default {
puts stderr "Invalid WARNING_LEVEL value"
}
- }
+ }]
set ::Compiler::Settings::WARNING_LEVEL $tmp
}
@@ -1534,7 +1680,7 @@ namespace eval compiler {
if {
$conf_affected(SDCC_Linker) || $conf_affected(SDCC_Optimization) ||
$conf_affected(SDCC_Code) || $conf_affected(SDCC_General)
- } {
+ } then {
# Copy boolean options
array set ::ExternalCompiler::sdcc_bool_options [array get sdcc_bool_opt]
# Copy string options
@@ -1545,6 +1691,12 @@ namespace eval compiler {
array set ::ExternalCompiler::sdcc_scs_string_options [array get sdcc_scs_str_opt]
}
+ ## GNU Make utility configuration
+ # General options
+ foreach key [array names ::ExternalCompiler::makeutil_config] {
+ set ::ExternalCompiler::makeutil_config($key) $makeutil_config($key)
+ }
+
${::X::actualProject} retrieve_compiler_settings
}
@@ -1555,16 +1707,16 @@ namespace eval compiler {
variable defaults ;# List of default settings
## Assembler: MCU8051IDE
- # Save option variables
+ # Save option variables
foreach var $defaults {
set var [lindex $var 0]
::settings setValue \
"Compiler/$var" \
- [subst "\$::Compiler::Settings::${var}"]
+ [subst -nocommands "\$::Compiler::Settings::${var}"]
}
::settings setValue "Compiler/max_ihex_rec_length" \
${::Compiler::Settings::max_ihex_rec_length}
- # Save warning level
+ # Save warning level
::settings setValue "Compiler/WARNING_LEVEL" \
${::Compiler::Settings::WARNING_LEVEL}
@@ -1599,6 +1751,13 @@ namespace eval compiler {
[array get ::ExternalCompiler::$array]
}
+ ## GNU Make utility configuration
+ # General options
+ foreach key [array names ::ExternalCompiler::makeutil_config] {
+ ::settings setValue "Compiler/make_${key}" \
+ $::ExternalCompiler::makeutil_config($key)
+ }
+
# Synchronize
::settings saveConfig
}
@@ -1610,7 +1769,7 @@ namespace eval compiler {
variable max_ihex_rec_length ;# Int: Maximum length of IHEX-8 record
## Assembler: MCU8051IDE
- # Load normal options
+ # Load normal options
foreach item $defaults {
set var [lindex $item 0]
set val [lindex $item 1]
@@ -1626,10 +1785,10 @@ namespace eval compiler {
![string is digit -strict ${::Compiler::Settings::max_ihex_rec_length}] ||
${::Compiler::Settings::max_ihex_rec_length} < 0 ||
${::Compiler::Settings::max_ihex_rec_length} > 255
- } {
+ } then {
set ::Compiler::Settings::max_ihex_rec_length 255
}
- # Load warning level
+ # Load warning level
set ::Compiler::Settings::WARNING_LEVEL \
[ ::settings getValue \
"Compiler/WARNING_LEVEL" \
@@ -1643,7 +1802,7 @@ namespace eval compiler {
]
## Assembler: ASEM51
- # Base config
+ # Base config
set conf [::settings getValue "Compiler/assembler_ASEM51_config" \
$::ExternalCompiler::assembler_ASEM51_config_def \
]
@@ -1657,7 +1816,7 @@ namespace eval compiler {
set ::ExternalCompiler::assembler_ASEM51_config($key) $val
}
}
- # Additional config
+ # Additional config
set conf [::settings getValue "Compiler/assembler_ASEM51_addcfg" \
$::ExternalCompiler::assembler_ASEM51_addcfg_def \
]
@@ -1687,7 +1846,7 @@ namespace eval compiler {
set ::ExternalCompiler::assembler_ASL_config($key) $val
}
}
- # Additional config
+ # Additional config
set conf [::settings getValue "Compiler/ASL" \
$::ExternalCompiler::assembler_ASL_addcfg_def \
]
@@ -1717,7 +1876,7 @@ namespace eval compiler {
set ::ExternalCompiler::assembler_AS31_config($key) $val
}
}
- # Additional config
+ # Additional config
set conf [::settings getValue "Compiler/AS31" \
$::ExternalCompiler::assembler_AS31_addcfg_def \
]
@@ -1738,7 +1897,7 @@ namespace eval compiler {
sdcc_optional_string_options sdcc_scs_string_options
} {
set conf [::settings getValue \
- "Compiler/$array" [subst "\$::ExternalCompiler::${array}_def"] \
+ "Compiler/$array" [subst -nocommands "\$::ExternalCompiler::${array}_def"] \
]
set len [llength $conf]
for {set i 0} {$i < $len} {incr i} {
@@ -1751,6 +1910,15 @@ namespace eval compiler {
}
}
}
+
+ ## GNU Make utility configuration
+ # General options
+ foreach {key def_value} ${::ExternalCompiler::makeutil_config_def} {
+ set conf [::settings getValue \
+ "Compiler/make_${key}" $def_value \
+ ]
+ set ::ExternalCompiler::makeutil_config($key) $conf
+ }
}
## Destroy the dialog
@@ -1793,7 +1961,7 @@ namespace eval compiler {
variable as31_custom_opts_text ;# Widget: Text widget "Custom options for AS31"
# External assembler configuration
- variable selected_assembler ;# Int: Preffered assembler (0==MCU8051IDE;1==ASEM-51;2==ASL)
+ variable selected_assembler ;# Int: Preferred assembler (0==MCU8051IDE;1==ASEM-51;2==ASL)
variable assembler_ASEM51_config;# Array: ASEM-51 configuration
variable assembler_ASEM51_addcfg;# Array: ASEM-51 additional configuration
variable assembler_ASL_config ;# Array: ASL configuration
@@ -1807,6 +1975,9 @@ namespace eval compiler {
variable sdcc_opt_str_opt ;# Array: SDCC configuration
variable sdcc_scs_str_opt ;# Array: SDCC configuration
+ # GNU Make utility configuration
+ variable makeutil_config ;# Array: Make utility configuration
+
# Confirmation dialog
if {
[tk_messageBox \
@@ -1816,26 +1987,26 @@ namespace eval compiler {
-title [mc "Restore defaults"] \
-message [mc "Are you sure that you want restore default settings ?"] \
] != {yes}
- } {
+ } then {
return
}
## Preferred assembler
set selected_assembler $::ExternalCompiler::selected_assembler_def
## Assembler MCU8051IDE
- # Restore normal options
+ # Restore normal options
foreach item $defaults {
set var [lindex $item 0]
set val [lindex $item 1]
- set ::configDialogs::compiler::option_${var} $val
+ set ::configDialogues::compiler::option_${var} $val
}
set max_ihex_rec_length 16
- # Warning level
- set opt_WARNING_LEVEL {All}
+ # Warning level
+ set opt_WARNING_LEVEL [mc "All"]
## ASEM-51
array set assembler_ASEM51_addcfg $::ExternalCompiler::assembler_ASEM51_addcfg_def
array set assembler_ASEM51_config $::ExternalCompiler::assembler_ASEM51_config_def
- # Custom options
+ # Custom options
if {[winfo exists $asm51_custom_opts_text]} {
$asm51_custom_opts_text delete 1.0 end
$asm51_custom_opts_text insert end $assembler_ASEM51_config(custom)
@@ -1843,7 +2014,7 @@ namespace eval compiler {
## ASL
array set assembler_ASL_addcfg $::ExternalCompiler::assembler_ASL_addcfg_def
array set assembler_ASL_config $::ExternalCompiler::assembler_ASL_config_def
- # Custom options
+ # Custom options
if {[winfo exists $asl_custom_opts_text]} {
$asl_custom_opts_text delete 1.0 end
$asl_custom_opts_text insert end $assembler_ASL_config(custom)
@@ -1851,25 +2022,37 @@ namespace eval compiler {
## AS31
array set assembler_AS31_addcfg $::ExternalCompiler::assembler_AS31_addcfg_def
array set assembler_AS31_config $::ExternalCompiler::assembler_AS31_config_def
- # Custom options
+ # Custom options
if {[winfo exists $as31_custom_opts_text]} {
$as31_custom_opts_text delete 1.0 end
$as31_custom_opts_text insert end $assembler_AS31_config(custom)
}
## SDCC
- # Copy boolean options
+ # Copy boolean options
array set sdcc_bool_opt ${::ExternalCompiler::sdcc_bool_options_def}
- # Copy string options
+ # Copy string options
array set sdcc_str_opt ${::ExternalCompiler::sdcc_string_options_def}
- # Copy optional strings
+ # Copy optional strings
array set sdcc_opt_str_opt ${::ExternalCompiler::sdcc_optional_string_options_def}
- # Copy semicolon separated optional string options
+ # Copy semicolon separated optional string options
array set sdcc_scs_str_opt ${::ExternalCompiler::sdcc_scs_string_options_def}
- # Custom options
+ # Custom options
if {[winfo exists $sdcc_custom_opts_text]} {
$sdcc_custom_opts_text delete 1.0 end
$sdcc_custom_opts_text insert end $sdcc_str_opt(custom)
}
+
+ ## GNU Make utility configuration
+ # General options
+ foreach {key value} ${::ExternalCompiler::makeutil_config_def} {
+ set makeutil_config($key) $value
+ }
+ # Adjust GUI to the current config
+ make_tab__adjust_gui
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/configdialogs/configdialogs.tcl b/lib/configdialogues/configdialogues.tcl
index cbffd16..7dba24e 100755..100644
--- a/lib/configdialogs/configdialogs.tcl
+++ b/lib/configdialogues/configdialogues.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,9 +21,14 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _CONFIGDIALOGUES_TCL ] } {
+set _CONFIGDIALOGUES_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
-# Implements various configuration dialogs
+# Implements various configuration dialogues
#
# Currently implemented:
# - Editor configuration
@@ -37,15 +42,19 @@
# - Terminal configuration
# --------------------------------------------------------------------------
-namespace eval configDialogs {
- # Load all available configuration dialogs into one common namespace
- source "${::LIB_DIRNAME}/configdialogs/editor_config.tcl" ;# Editor configuration dialog
- source "${::LIB_DIRNAME}/configdialogs/compiler_config.tcl" ;# Compiler configuration dialog
- source "${::LIB_DIRNAME}/configdialogs/rightpanel_config.tcl" ;# Right panel configuration dialog
- source "${::LIB_DIRNAME}/configdialogs/toolbar_config.tcl" ;# Main toolbar configuration dialog
- source "${::LIB_DIRNAME}/configdialogs/custom_commands_config.tcl" ;# Custom commands configuration dialog
- source "${::LIB_DIRNAME}/configdialogs/shortcuts_config.tcl" ;# Shortcuts configuration dialog
- source "${::LIB_DIRNAME}/configdialogs/global_config.tcl" ;# Global configuration dialog
- source "${::LIB_DIRNAME}/configdialogs/simulator_config.tcl" ;# Simulator configuration dialog
- source "${::LIB_DIRNAME}/configdialogs/terminal_config.tcl" ;# Terminal configuration dialog
+namespace eval configDialogues {
+ # Load all available configuration dialogues into one common namespace
+ source "${::LIB_DIRNAME}/configdialogues/editor_config.tcl" ;# Editor configuration dialog
+ source "${::LIB_DIRNAME}/configdialogues/compiler_config.tcl" ;# Compiler configuration dialog
+ source "${::LIB_DIRNAME}/configdialogues/rightpanel_config.tcl" ;# Right panel configuration dialog
+ source "${::LIB_DIRNAME}/configdialogues/toolbar_config.tcl" ;# Main toolbar configuration dialog
+ source "${::LIB_DIRNAME}/configdialogues/custom_commands_config.tcl" ;# Custom commands configuration dialog
+ source "${::LIB_DIRNAME}/configdialogues/shortcuts_config.tcl" ;# Shortcuts configuration dialog
+ source "${::LIB_DIRNAME}/configdialogues/global_config.tcl" ;# Global configuration dialog
+ source "${::LIB_DIRNAME}/configdialogues/simulator_config.tcl" ;# Simulator configuration dialog
+ source "${::LIB_DIRNAME}/configdialogues/terminal_config.tcl" ;# Terminal configuration dialog
+}
+
+# >>> File inclusion guard
}
+# <<< File inclusion guard
diff --git a/lib/configdialogs/custom_commands_config.tcl b/lib/configdialogues/custom_commands_config.tcl
index e04ae1d..0919d21 100755..100644
--- a/lib/configdialogs/custom_commands_config.tcl
+++ b/lib/configdialogues/custom_commands_config.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 _CUSTOM_COMMANDS_CONFIG_TCL ] } {
+set _CUSTOM_COMMANDS_CONFIG_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements custom commands configuration dialog
@@ -31,10 +36,10 @@ namespace eval custom_commands {
variable dialog_opened 0 ;# Bool: True if this dialog is already opened
# Font for text widgets
- variable cmd_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight bold \
+ variable cmd_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
]
variable text_0 ;# ID of text widget for command 0
@@ -45,11 +50,12 @@ namespace eval custom_commands {
variable cmfr_dialog ;# Array of Bool: Variable for checkbutton "Confirmation dialog"
variable results_dialog ;# Array of Bool: Variable for checkbutton "Show results"
variable ignore_errors ;# Array of Bool: Variable for checkbutton "Ignore errors"
+ variable run_in_term ;# Array of Bool: Variable for checkbutton "Ignore errors"
## Create the dialog
- # @parm Int = 0 - number of tab to raise
+ # @parm Int tab_number=0 - number of tab to raise
# @return void
- proc mkDialog args {
+ proc mkDialog {{tab_number 0}} {
variable win ;# ID of toplevel dialog window
variable dialog_opened ;# Bool: True if this dialog is already opened
variable cmd_font ;# Font for text widgets
@@ -62,78 +68,88 @@ namespace eval custom_commands {
variable cmfr_dialog ;# Array of Bool: Variable for checkbutton "Confirmation dialog"
variable results_dialog ;# Array of Bool: Variable for checkbutton "Show results"
variable ignore_errors ;# Array of Bool: Variable for checkbutton "Ignore errors"
+ variable run_in_term ;# Array of Bool: Variable for checkbutton "Ignore errors"
- # Destroy the dialog if it's alredy opened
+ # Destroy the dialog if it's already opened
if {$dialog_opened} {
destroy .custom_commands_config_dialog
}
set dialog_opened 1
# Create toplevel window
- set win [toplevel .custom_commands_config_dialog -class {Configuration dialog} -bg {#EEEEEE}]
+ set win [toplevel .custom_commands_config_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
# Create window header
label $win.header_label \
-compound left \
-image ::ICONS::22::gear \
-text [mc "Edit custom commands"] \
- -font [font create -size -20]
+ -font [font create -size [expr {int(-20 * $::font_size_factor)}]]
# Create notebook
- set nb [ttk::notebook $win.nb]
+ set nb [ModernNoteBook $win.nb]
# Create notebook tabs
for {set idx 0} {$idx < 3} {incr idx} {
# Create tab
- set tab [frame $nb.frame_${idx}]
- $nb add $tab -image ::ICONS::22::gear$idx
+ set tab [$nb insert end tab_$idx -image ::ICONS::22::gear$idx]
# Create "Short description" (entry and label)
pack [Label $tab.desc_label \
-text [mc "Short description"] \
- -helptext [mc "This string will be used as status bar tip (max. 50 chars)"]
- ] -anchor w
+ -helptext [mc "This string will be used as status bar tip (max. 100 chars)"]
+ ] -anchor w -padx 5 -pady 5
pack [ttk::entry $tab.desc_entry \
-validate key \
- -textvariable ::configDialogs::custom_commands::description($idx) \
- -validatecommand {::configDialogs::custom_commands::desc_validate %P} \
- ] -fill x
+ -textvariable ::configDialogues::custom_commands::description($idx) \
+ -validatecommand {::configDialogues::custom_commands::desc_validate %P} \
+ ] -fill x -padx 5
## Create options labelframe
label $tab.labelframe_label -compound left -image ::ICONS::16::configure -text [mc "Options"]
set frame [ttk::labelframe $tab.labelframe -labelwidget $tab.labelframe_label]
- # Create checkbutton "Confirmation dialog"
+ # Create checkbutton "Confirmation dialog"
set button [checkbutton $frame.cmfr_cbutton -anchor w \
-text [mc "Confirmation dialog"] \
- -variable ::configDialogs::custom_commands::cmfr_dialog($idx) \
+ -variable ::configDialogues::custom_commands::cmfr_dialog($idx) \
]
- pack $button -anchor w
- DynamicHelp::add $button -text [mc "Invkoke dialog to confirm command execution"]
- # Create checkbutton "Show results"
+ grid $button -sticky w -row 1 -column 1 -padx 5 -pady 2
+ DynamicHelp::add $button -text [mc "Invoke dialog to confirm command execution."]
+ # Create checkbutton "Show results"
set button [checkbutton $frame.results_cbutton \
-text [mc "Show results"] -anchor w \
- -variable ::configDialogs::custom_commands::results_dialog($idx) \
+ -variable ::configDialogues::custom_commands::results_dialog($idx) \
]
- pack $button -anchor w
- DynamicHelp::add $button -text [mc "After finish show dialog with results"]
- # Create checkbutton "Ignore errors"
+ grid $button -sticky w -row 2 -column 1 -padx 5 -pady 2
+ DynamicHelp::add $button -text [mc "After finish show dialog with results."]
+ # Create checkbutton "Ignore errors"
set button [checkbutton $frame.ignore_cbutton \
-text [mc "Ignore errors"] -anchor w \
- -variable ::configDialogs::custom_commands::ignore_errors($idx) \
+ -variable ::configDialogues::custom_commands::ignore_errors($idx) \
+ ]
+ grid $button -sticky w -row 1 -column 2 -padx 5 -pady 2
+ DynamicHelp::add $button -text [mc "Do not invoke error dialog if the process fails."]
+ # Create checkbutton "Run in terminal"
+ set button [checkbutton $frame.run_in_term_button \
+ -text [mc "Run in terminal"] -anchor w \
+ -variable ::configDialogues::custom_commands::run_in_term($idx) \
]
- pack $button -anchor w
- DynamicHelp::add $button -text [mc "Do not invoke error dialog if the process fail"]
+ grid $button -sticky w -row 2 -column 2 -padx 5 -pady 2
+ DynamicHelp::add $button -text [mc "Run interactively in terminal emulator."]
+ if {!$::PROGRAM_AVAILABLE(urxvt)} {
+ $button configure -state disabled
+ }
pack $frame -fill x -pady 10 -padx 5
# Create label "Commands to execute" and help button
set frame [frame $tab.cmd_label_frame]
pack [label $frame.label \
- -text [mc "Shell script to execute"] \
- ] -side left
+ -text [mc "Bash script to execute."] \
+ ] -side left -padx 5
pack [ttk::button $frame.button \
-image ::ICONS::16::help \
-style Flat.TButton \
- -command {::configDialogs::custom_commands::show_help} \
+ -command {::configDialogues::custom_commands::show_help} \
] -side right
DynamicHelp::add $frame.button \
-text [mc "Show help"]
@@ -152,16 +168,17 @@ namespace eval custom_commands {
-orient vertical \
-command "$text yview" \
] -side right -fill y
- pack $frame -fill both -expand 1
+ pack $frame -fill both -expand 1 -padx 5
# Set NS variable -- text widget reference
set text_$idx $text
# Get settins from the program
- if {[regexp {\s*[01]\s+[01]\s+[01]\s*} $::X::custom_command_options($idx)]} {
+ if {[regexp {\s*[01]\s+[01]\s+[01]\s+[01]\s*} $::X::custom_command_options($idx)]} {
set cmfr_dialog($idx) [lindex $::X::custom_command_options($idx) 0]
set results_dialog($idx) [lindex $::X::custom_command_options($idx) 1]
set ignore_errors($idx) [lindex $::X::custom_command_options($idx) 2]
+ set run_in_term($idx) [lindex $::X::custom_command_options($idx) 3]
}
set description($idx) $::X::custom_command_desc($idx)
@@ -169,32 +186,29 @@ namespace eval custom_commands {
}
# Raise tab
- if {$args == {}} {
- set args 0
- }
- $nb select [lindex [$nb tabs] $args]
+ $nb raise [lindex [$nb pages] $tab_number]
# Create button frame at the bottom
set but_frame [frame $win.button_frame]
# Button "Ok"
- pack [ttk::button $but_frame.but_ok \
+ pack [ttk::button $but_frame.but_ok \
-text [mc "Ok"] \
-compound left \
-image ::ICONS::16::ok \
- -command {::configDialogs::custom_commands::OK} \
- ] -side right
+ -command {::configDialogues::custom_commands::OK} \
+ ] -side right -padx 2 -pady 2
# Button "Cancel"
- pack [ttk::button $but_frame.but_cancel \
- -text [mc "Cancel"] \
- -compound left \
- -image ::ICONS::16::button_cancel \
- -command {::configDialogs::custom_commands::CANCEL} \
- ] -side right
+ pack [ttk::button $but_frame.but_cancel \
+ -text [mc "Cancel"] \
+ -compound left \
+ -image ::ICONS::16::button_cancel \
+ -command {::configDialogues::custom_commands::CANCEL} \
+ ] -side right -padx 2 -pady 2
# Pack frames and notebook
pack $but_frame -side bottom -fill x -expand 0 -anchor s -padx 10 -pady 5
pack $win.header_label -side top -pady 6
- pack $nb -side top -fill both -expand 1 -padx 10
+ pack [$nb get_nb] -side top -fill both -expand 1 -padx 10
# Finalize dialog creation
wm iconphoto $win ::ICONS::16::configure
@@ -204,7 +218,7 @@ namespace eval custom_commands {
raise $win
catch {grab $win}
wm protocol $win WM_DELETE_WINDOW {
- ::configDialogs::custom_commands::CANCEL
+ ::configDialogues::custom_commands::CANCEL
}
tkwait window $win
}
@@ -212,7 +226,7 @@ namespace eval custom_commands {
## Show help window
# @return void
proc show_help {} {
- # Destroy prevoius help window
+ # Destroy previous help window
if {[winfo exists .custom_commands_help]} {
destroy .custom_commands_help
return
@@ -221,7 +235,7 @@ namespace eval custom_commands {
set y [winfo pointery .]
# Create new help window
- set win [toplevel .custom_commands_help -class {Help} -bg {#EEEEEE}]
+ set win [toplevel .custom_commands_help -class {Help} -bg ${::COMMON_BG_COLOR}]
set frame [frame $win.f -bg {#555555} -bd 0 -padx 1 -pady 1]
wm overrideredirect $win 1
@@ -247,27 +261,35 @@ namespace eval custom_commands {
pack $frame -fill both -expand 1
# Create text tags
- $text tag configure tag_bold_small \
- -font [font create -weight bold -size -12 -family $::DEFAULT_FIXED_FONT]
- $text tag configure tag_bold_big \
- -foreground {#0000DD} -underline 1 \
- -font [font create -weight bold -size -14 -family $::DEFAULT_FIXED_FONT]
+ $text tag configure tag_bold_small \
+ -font [font create \
+ -weight bold \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -family $::DEFAULT_FIXED_FONT \
+ ]
+ $text tag configure tag_bold_big \
+ -foreground {#0000DD} -underline 1 \
+ -font [font create \
+ -weight bold \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -family $::DEFAULT_FIXED_FONT \
+ ]
# Fill in the text widget
$text insert end [mc "VARIABLES:"]
$text tag add tag_bold_big {insert linestart} {insert lineend}
- $text insert end "\n %URL"
+ $text insert end "\n %URI"
$text tag add tag_bold_small {insert linestart} {insert lineend}
- $text insert end [mc "\t\tThe full URL of the current file\n"]
- $text insert end " %URLS"
+ $text insert end [mc "\t\tThe full URI of the current file\n"]
+ $text insert end " %URIS"
$text tag add tag_bold_small {insert linestart} {insert lineend}
- $text insert end [mc "\t\tList of the URLs of all open documents\n"]
+ $text insert end [mc "\t\tList of the URIs of all open documents\n"]
$text insert end " %directory"
$text tag add tag_bold_small {insert linestart} {insert lineend}
$text insert end [mc "\t\tProject directory\n"]
$text insert end " %filename"
$text tag add tag_bold_small {insert linestart} {insert lineend}
- $text insert end [mc "\t\tThe filename of the current document\n"]
+ $text insert end [mc "\t\tThe file name of the current document\n"]
$text insert end " %basename"
$text tag add tag_bold_small {insert linestart} {insert lineend}
$text insert end [mc "\t\tSame as %filename, but without extension\n"]
@@ -295,14 +317,14 @@ namespace eval custom_commands {
[list insert linestart+${start}c] \
[list insert linestart+${end}c]
}
- $text insert end [mc "\nare not avaliable if external editor is used"]
+ $text insert end [mc "\nare not available if external editor is used"]
# Show the text widget
$text configure -state disabled
pack $text -side bottom -fill both -expand 1
# Set window attributes
- wm geometry $win "=400x270+$x+$y"
+ wm geometry $win "=420x330+$x+$y"
wm protocol $win WM_DELETE_WINDOW "
grab release $win
destroy $win
@@ -320,9 +342,9 @@ namespace eval custom_commands {
# @parm String content - String to validate
# @return Bool - result
proc desc_validate {content} {
- if {[string length $content] > 50} {
+ if {[string length $content] > 100} {
return 0
- } {
+ } else {
return 1
}
}
@@ -334,6 +356,7 @@ namespace eval custom_commands {
variable cmfr_dialog ;# Array of Bool: Variable for checkbutton "Confirmation dialog"
variable results_dialog ;# Array of Bool: Variable for checkbutton "Show results"
variable ignore_errors ;# Array of Bool: Variable for checkbutton "Ignore errors"
+ variable run_in_term ;# Array of Bool: Variable for checkbutton "Ignore errors"
variable text_0 ;# ID of text widget for command 0
variable text_1 ;# ID of text widget for command 1
@@ -342,15 +365,16 @@ namespace eval custom_commands {
for {set i 0} {$i < 3} {incr i} {
# Change content of configuration variables
set ::X::custom_command_options($i) \
- "$cmfr_dialog($i) $results_dialog($i) $ignore_errors($i)"
+ "$cmfr_dialog($i) $results_dialog($i) $ignore_errors($i) $run_in_term($i)"
set ::X::custom_command_desc($i) $description($i)
- set ::X::custom_command_cmd($i) [regsub {\n$} [[subst "\$text_${i}"] get 1.0 end] {}]
+ set ::X::custom_command_cmd($i) [regsub {\n$} [[subst -nocommands "\$text_${i}"] get 1.0 end] {}]
# Change status tips
if {[winfo exists .mainIconBar.custom$i]} {
setStatusTip \
-widget .mainIconBar.custom$i \
-text [mc "Custom command %s: %s" $i $description($i)]
+ ::DynamicHelp::add .mainIconBar.custom$i -text [mc "Custom command %s: %s" $i $description($i)]
}
}
}
@@ -377,9 +401,17 @@ namespace eval custom_commands {
proc load_config {} {
for {set i 0} {$i < 3} {incr i} {
# Options
+ set def_options $::X::custom_command_options($i)
set ::X::custom_command_options($i) [::settings \
getValue "Custom command $i/options" \
$::X::custom_command_options($i)]
+ if {![regexp {\s*[01]\s+[01]\s+[01]\s+[01]\s*} $::X::custom_command_options($i)]} {
+ puts stderr "Invalid custom command options, setting to defaults."
+ set ::X::custom_command_options($i) $def_options
+ }
+ if {!$::PROGRAM_AVAILABLE(urxvt)} {
+ set ::X::custom_command_options($i) [lreplace $::X::custom_command_options($i) 3 3 0]
+ }
# Description
set ::X::custom_command_desc($i) [::settings \
getValue "Custom command $i/description" \
@@ -416,3 +448,7 @@ namespace eval custom_commands {
CANCEL
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/configdialogs/editor_config.tcl b/lib/configdialogues/editor_config.tcl
index bd51a55..7936eda 100755..100644
--- a/lib/configdialogs/editor_config.tcl
+++ b/lib/configdialogues/editor_config.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 _EDITOR_CONFIG_TCL ] } {
+set _EDITOR_CONFIG_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements editor configuration dialog
@@ -33,7 +38,7 @@ namespace eval editor {
variable win ;# ID of dialog toplevel window
variable button_index 0 ;# Button index (for creating many buttons)
- variable anything_modified ;# Bool: Settings changed (stay set to 1 even after APPLY)
+ variable anything_modified ;# Bool: Settings changed (stay set to 1 even after APPLY)
variable changed ;# Bool: Settings changed
variable apply_button ;# ID of button "Apply"
@@ -51,7 +56,7 @@ namespace eval editor {
variable highlight_tab_lst ;# Widget: Tab "Syntax highlight"/"Code listing"
## Tab "Editor"
- ## Int: Editor to use
+ ## Int: Editor to use
# 0 - Native editor
# 1 - Vim
# 2 - Emacs
@@ -66,12 +71,13 @@ namespace eval editor {
variable intentation_mode ;# Editor indentation mode
variable spaces_no_tabs ;# Bool: Use spaces instead of tabs
variable number_of_spaces ;# Int: Number of spaces to use instead of tab
+ variable tab_width ;# Int: Tab width
variable autosave ;# Int: Autosave interval in minutes (0 == disabled)
variable auto_brackets ;# Automaticaly insert oposite brackets, quotes, etc.
variable hg_trailing_sp ;# Bool: Highlight trailing space
variable auto_completion ;# Bool: Enable popup-based completion
variable cline_completion ;# Bool: Enable popup-based completion for command line
- variable avaliable_encodings {
+ variable available_encodings {
utf-8 iso8859-1 iso8859-2
iso8859-3 iso8859-4 iso8859-5
iso8859-6 iso8859-7 iso8859-8
@@ -88,6 +94,7 @@ namespace eval editor {
variable color_current_line ;# RGB: Backgound color for current line
variable color_bookmark ;# RGB: Backgound color for bookmarks
variable color_breakpoint ;# RGB: Backgound color for breakpoints
+ variable color_breakpoint_I ;# RGB: Backgound color for invalid breakpoints
variable color_simulator_line ;# RGB: Backgound color for simulator line
variable color_error_line ;# RGB: Backgound color for line containing an error
variable color_trailing_space ;# RGB: Backgound color for trailing space
@@ -101,7 +108,7 @@ namespace eval editor {
variable sample_text_family ;# Font family
## Tab "Assembler syntax highlight"
- variable hightlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
+ variable highlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
variable list_of_tags_asm ;# List: Highlighting tags
variable highlight_tab_scr_text_asm ;# ID of text widget for configuring syntax
variable highlight_tab_scr_sample_text_asm ;# ID of text widget for sample text
@@ -109,26 +116,26 @@ namespace eval editor {
variable highlight_tab_checkbuttons_asm
## Tab "C" syntax highlight"
- variable hightlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
+ variable highlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
variable list_of_tags_C ;# List: Highlighting tags
variable highlight_tab_scr_text_C ;# ID of text widget for configuring syntax
variable highlight_tab_scr_sample_text_C ;# ID of text widget for sample text
- # List of checkbuttons affected by changing cursor position in sample text
+ # List of checkbuttons affected by changing cursor position in sample text
variable highlight_tab_checkbuttons_C
## Tab "LST" syntax highlight"
- variable hightlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
+ variable highlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
variable list_of_tags_lst ;# List: Highlighting tags
variable highlight_tab_scr_text_lst ;# ID of text widget for configuring syntax
variable highlight_tab_scr_sample_text_lst ;# ID of text widget for sample text
- # List of checkbuttons affected by changing cursor position in sample text
+ # List of checkbuttons affected by changing cursor position in sample text
variable highlight_tab_checkbuttons_lst
## Create the dialog
- # @parm String = {} - Tab to raise on start up
+ # @parm String tab_to_raise={} - Tab to raise on start up
# @return void
- proc mkDialog args {
+ proc mkDialog {{tab_to_raise {}}} {
variable nb ;# Widget: Notebook itself
variable editor_tab ;# Widget: Tab "Editor"
variable general_tab ;# Widget: Tab "General"
@@ -150,9 +157,9 @@ namespace eval editor {
variable win ;# ID of dialog toplevel window
variable dialog_opened ;# Bool: True if this dialog is already opened
variable button_index ;# Button index (for creating many buttons)
- variable hightlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
- variable hightlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
- variable hightlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
+ variable highlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
+ variable highlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
+ variable highlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
set button_index 0
@@ -167,125 +174,113 @@ namespace eval editor {
# Get settings from the program
getSettings
# Create toplevel window
- set win [toplevel .editor_config_dialog -class {Configuration dialog} -bg {#EEEEEE}]
+ set win [toplevel .editor_config_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
# Create window header
label $win.header_label \
-compound left \
-image ::ICONS::32::configure \
-text [mc "Editor configuration"] \
- -font [font create -size -20]
+ -font [font create -size [expr {int(-20 * $::font_size_factor)}]]
+
+ # Create button "Apply" in advance
+ set but_frame [frame $win.button_frame]
+ set apply_button [ttk::button $but_frame.but_apply \
+ -text [mc "Apply"] \
+ -state disabled \
+ -compound left \
+ -image ::ICONS::16::ok \
+ -command {::configDialogues::editor::APPLY} \
+ ]
# Create notebook
- set nb [ttk::notebook $win.nb]
- bind $nb <<NotebookTabChanged>> {after idle {
- set tab_index [%W index [%W select]]
-
- if {[lsearch ${::configDialogs::editor::tab_created_so_far} $tab_index] == -1} {
- lappend ::configDialogs::editor::tab_created_so_far $tab_index
-
- if {!$::MICROSOFT_WINDOWS} {
- ::configDialogs::editor::create_tab \
- [lindex \
- [list editor general colors fonts highlight] \
- $tab_index \
- ]
- } else { ;# External editors are not available on Microsoft Windows
- ::configDialogs::editor::create_tab \
- [lindex \
- [list general colors fonts highlight] \
- $tab_index \
- ]
- }
- }
- }}
- set ::configDialogs::editor::tab_created_so_far [list]
+ set nb [ModernNoteBook $win.nb]
+ set ::configDialogues::editor::tab_created_so_far [list]
# Create Tab "Editor"
if {!$::MICROSOFT_WINDOWS} { ;# External editors are not available on Microsoft Windows
- set editor_tab [frame $nb.editor_tab]
- $nb add $editor_tab -text [mc "Editor"]
+ set editor_tab [$nb insert end editor_tab -text [mc "Editor"] -createcmd {::configDialogues::editor::create_tab editor}]
}
# Create Tab "General"
- set general_tab [frame $nb.general_tab]
- $nb add $general_tab -text [mc "General"]
+ set general_tab [$nb insert end general_tab \
+ -text [mc "General"] \
+ -createcmd {::configDialogues::editor::create_tab general} \
+ ]
# Create Tab "Colors"
- set colors_tab [frame $nb.colors_tab]
- $nb add $colors_tab -text [mc "Colors"]
+ set colors_tab [$nb insert end colors_tab \
+ -text [mc "Colors"] \
+ -createcmd {::configDialogues::editor::create_tab colors} \
+ ]
# Create Tab "Fonts"
- set fonts_tab [frame $nb.fonts_tab]
- $nb add $fonts_tab -text [mc "Fonts"]
+ set fonts_tab [$nb insert end fonts_tab \
+ -text [mc "Fonts"] \
+ -createcmd {::configDialogues::editor::create_tab fonts} \
+ ]
# Create Tab "Highlight"
- set highlight_tab [frame $nb.highlight_tab]
- $nb add $highlight_tab -text [mc "Syntax highlight"]
+ set highlight_tab [$nb insert end highlight_tab \
+ -text [mc "Syntax highlight"] \
+ -createcmd {::configDialogues::editor::create_tab highlight} \
+ ]
#
## Finalize
#
- if {[string length $args]} {
+ if {[string length $tab_to_raise]} {
if {!$::MICROSOFT_WINDOWS} { ;# External editors are not available on Microsoft Windows
- $nb select [lindex [$nb tabs] \
- [lsearch [list {Editor} {General} {Colors} {Fonts} {Highlight}] $args]]
- } {
- $nb select [lindex [$nb tabs] \
- [lsearch [list {General} {Colors} {Fonts} {Highlight}] $args]]
+ $nb raise [lindex [$nb pages] \
+ [lsearch [list {Editor} {General} {Colors} {Fonts} {Highlight}] $tab_to_raise]]
+ } else {
+ $nb raise [lindex [$nb pages] \
+ [lsearch [list {General} {Colors} {Fonts} {Highlight}] $tab_to_raise]]
}
- } {
+ } else {
if {!$::MICROSOFT_WINDOWS} { ;# External editors are not available on Microsoft Windows
if {$editor_to_use} {
- foreach tab [list $highlight_tab $general_tab] {
- $nb tab $tab -state disabled
+ foreach tab [list highlight_tab general_tab] {
+ $nb itemconfigure $tab -state disabled
}
- $nb select $editor_tab
- } {
- $nb select $general_tab
+ $nb raise editor_tab
+ } else {
+ $nb raise general_tab
}
- } {
- $nb select $general_tab
+ } else {
+ $nb raise general_tab
}
}
# Create button frame at the bottom
- set but_frame [frame $win.button_frame]
- # Button "Apply"
- set apply_button [ttk::button $but_frame.but_apply \
- -text [mc "Apply"] \
- -state disabled \
- -compound left \
- -image ::ICONS::16::ok \
- -command {::configDialogs::editor::APPLY} \
- ]
pack $apply_button -side left
- # Button "Ok"
- pack [ttk::button $but_frame.but_ok \
+ # Button "Ok"
+ pack [ttk::button $but_frame.but_ok \
-text [mc "Ok"] \
-compound left \
-image ::ICONS::16::ok \
- -command {::configDialogs::editor::OK} \
- ] -side right
- # Button "Cancel"
+ -command {::configDialogues::editor::OK} \
+ ] -side right -padx 2
+ # Button "Cancel"
pack [ttk::button $but_frame.but_cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
- -command {::configDialogs::editor::CANCEL} \
- ] -side right
+ -command {::configDialogues::editor::CANCEL} \
+ ] -side right -padx 2
# Pack frames and notebook
pack $but_frame -side bottom -fill x -expand 0 -anchor s -padx 10 -pady 5
pack $win.header_label -side top -pady 6
- pack $nb -side top -fill both -expand 1 -padx 10
+ pack [$nb get_nb] -side top -fill both -expand 1 -padx 10
# Finalize creation of the dialog
wm transient $win .
wm iconphoto $win ::ICONS::16::configure
wm title $win [mc "Editor configuration - %s" ${::APPNAME}]
- wm geometry $win =380x440
- wm resizable $win 0 0
+ wm geometry $win =350x500
+ wm resizable $win 0 1
+ wm minsize $win 350 470
raise $win
catch {grab $win}
wm protocol $win WM_DELETE_WINDOW {
- ::configDialogs::editor::CANCEL
+ ::configDialogues::editor::CANCEL
}
tkwait window $win
}
@@ -299,7 +294,7 @@ namespace eval editor {
variable general_tab ;# Widget: Tab "General"
variable colors_tab ;# Widget: Tab "Colors"
variable fonts_tab ;# Widget: Tab "Fonts"
- variable avaliable_encodings ;# Avaliable encodings
+ variable available_encodings ;# available encodings
variable highlight_tab ;# Widget: Tab "Syntax highlight"
variable highlight_tab_asm ;# Widget: Tab "Syntax highlight"/"Assembler"
variable highlight_tab_C ;# Widget: Tab "Syntax highlight"/"C language"
@@ -320,42 +315,48 @@ namespace eval editor {
# Preferred editor
grid [label $editor_top_frame.editor_lbl \
-text [mc "Preferred editor:"] -anchor w \
- ] -row 0 -column 0 -sticky w
+ ] -row 0 -column 0 -sticky w -pady 10 -padx 10
set row 1
set i 0
- foreach text {
- {Native editor} Vim Emacs Nano dav le
- } {
+ foreach text [list \
+ [mc "Native editor"] \
+ {Vim} \
+ {Emacs} \
+ {Nano} \
+ {dav} \
+ {le} \
+ ] {
grid [radiobutton $editor_top_frame.rabut_$i \
- -variable ::configDialogs::editor::editor_to_use \
+ -variable ::configDialogues::editor::editor_to_use \
-value $i -text $text -state disabled \
- -command ::configDialogs::editor::editor_to_use_changed \
+ -command ::configDialogues::editor::editor_to_use_changed \
] -column 0 -padx 25 -row $row -sticky w
incr i
incr row
}
$editor_top_frame.rabut_0 configure -state normal
- if {${::PROGRAM_AVALIABLE(urxvt)}} {
- if {${::PROGRAM_AVALIABLE(vim)}} {
+ if {${::PROGRAM_AVAILABLE(urxvt)}} {
+ if {${::PROGRAM_AVAILABLE(vim)}} {
$editor_top_frame.rabut_1 configure -state normal
}
- if {${::PROGRAM_AVALIABLE(emacs)}} {
+ if {${::PROGRAM_AVAILABLE(emacs)}} {
$editor_top_frame.rabut_2 configure -state normal
}
- if {${::PROGRAM_AVALIABLE(nano)}} {
+ if {${::PROGRAM_AVAILABLE(nano)}} {
$editor_top_frame.rabut_3 configure -state normal
}
- if {${::PROGRAM_AVALIABLE(dav)}} {
+ if {${::PROGRAM_AVAILABLE(dav)}} {
$editor_top_frame.rabut_4 configure -state normal
}
- if {${::PROGRAM_AVALIABLE(le)}} {
+ if {${::PROGRAM_AVAILABLE(le)}} {
$editor_top_frame.rabut_5 configure -state normal
}
}
- grid [label $editor_top_frame.editor_note \
- -fg {#555555} -font [font create \
- -family {helvetica} \
- -size -14 -slant italic \
+ grid [label $editor_top_frame.editor_note \
+ -fg {#555555} -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -slant italic \
] \
-text [mc "(This change will take effect upon next start.)"] \
] -row 20 -column 0 -columnspan 2 -sticky w
@@ -381,72 +382,85 @@ namespace eval editor {
# Item: "Auto brackets"
grid [Label $editing_labelframe.autob_lbl \
-text [mc "Auto brackets"] \
- -helptext [mc "If you type a left bracket, editor\nwill automaticaly insert right bracket"] \
+ -helptext [mc "If you type a left bracket, editor\nwill automatically insert right bracket"] \
] -row 1 -column 0 -sticky w -padx 5
- grid [checkbutton $editing_labelframe.autob_chbutton \
- -variable ::configDialogs::editor::auto_brackets \
- -command ::configDialogs::editor::settings_changed \
+ grid [checkbutton $editing_labelframe.autob_chbutton \
+ -variable ::configDialogues::editor::auto_brackets \
+ -command ::configDialogues::editor::settings_changed \
] -row 1 -column 1 -sticky w -padx 5
DynamicHelp::add $editing_labelframe.autob_chbutton \
- -text [mc "When you type a left bracket editor\nwill automaticaly insert right bracket"]
+ -text [mc "When you type a left bracket editor\nwill automatically insert right bracket"]
# Item: "Indentation mode"
grid [Label $editing_labelframe.imode_lbl \
-text [mc "Indentation mode"] \
- -helptext [mc "What to do when you press enter\n\tnone\t- start on the begining of the next line\n\tnormal\t- keep indention of the previous line"] \
+ -helptext [mc "What to do when you press enter\n\tnone\t- start on the beginning of the next line\n\tnormal\t- keep indention of the previous line"] \
] -row 2 -column 0 -sticky w -padx 5
- grid [ttk::combobox $editing_labelframe.imode_cb \
- -values [list [mc "none"] [mc "normal"]] \
- -state readonly \
- -width 0 \
- -textvariable ::configDialogs::editor::intentation_mode \
+ grid [ttk::combobox $editing_labelframe.imode_cb \
+ -values [list [mc "none"] [mc "normal"]] \
+ -state readonly \
+ -width 0 \
+ -textvariable ::configDialogues::editor::intentation_mode \
] -row 2 -column 1 -sticky we -padx 5
bind $editing_labelframe.imode_cb <<ComboboxSelected>> \
- {::configDialogs::editor::settings_changed}
+ {::configDialogues::editor::settings_changed}
DynamicHelp::add $editing_labelframe.imode_cb \
- -text [mc "What to do when you press enter\n\tnone\t- start on the begining of the next line\n\tnormal\t- keep indention of the previous line"]
- # Item: "Insert ' ' instead of '\t'"
+ -text [mc "What to do when you press enter\n\tnone\t- start on the beginning of the next line\n\tnormal\t- keep indention of the previous line"]
+ # Item: "Tab width"
+ grid [Label $editing_labelframe.tabw_lbl\
+ -text [mc "Tab width"] \
+ -helptext [mc "Maximum width of the tab character, measured in number of spaces"] \
+ ] -row 3 -column 0 -sticky w -padx 5
+ grid [ttk::spinbox $editing_labelframe.tabw_spinbox \
+ -from 1 -to 40 -validate all \
+ -validatecommand "::configDialogues::editor::tabw_spinbox_val %P" \
+ -textvariable ::configDialogues::editor::tab_width \
+ -command ::configDialogues::editor::settings_changed \
+ ] -row 3 -column 1 -sticky we -padx 5
+ DynamicHelp::add $editing_labelframe.tabw_spinbox \
+ -text [mc "Maximum width of the tab character, measured in number of spaces"]
+ # Item: "Insert spaces instead of tabs"
grid [Label $editing_labelframe.tabis_lbl \
- -text [mc "Insert ' ' instead of '\\t'"] \
+ -text [mc "Insert spaces instead of tabs"] \
-helptext [mc "Use spaces instead of tabs"] \
- ] -row 3 -column 0 -sticky w -padx 5
+ ] -row 4 -column 0 -sticky w -padx 5
grid [checkbutton $editing_labelframe.tabis_chbutton \
- -variable ::configDialogs::editor::spaces_no_tabs \
- -command ::configDialogs::editor::settings_changed \
- ] -row 3 -column 1 -sticky w -padx 5
+ -variable ::configDialogues::editor::spaces_no_tabs \
+ -command ::configDialogues::editor::settings_changed \
+ ] -row 4 -column 1 -sticky w -padx 5
DynamicHelp::add $editing_labelframe.tabis_chbutton \
-text [mc "Use spaces instead of tabs"]
# Item: "Number of spaces"
grid [Label $editing_labelframe.nofs_lbl \
-text [mc "Number of spaces"] \
-helptext [mc "Number of spaces to use instead of tabs"] \
- ] -row 4 -column 0 -sticky w -padx 5
- grid [spinbox $editing_labelframe.nofs_spinbox \
- -from 1 -to 16 -bg white -validate all \
- -vcmd "::configDialogs::editor::nofs_spinbox_val %P" \
- -textvariable ::configDialogs::editor::number_of_spaces \
- -command ::configDialogs::editor::settings_changed \
- ] -row 4 -column 1 -sticky we -padx 5
+ ] -row 5 -column 0 -sticky w -padx 5
+ grid [ttk::spinbox $editing_labelframe.nofs_spinbox \
+ -from 1 -to 16 -validate all \
+ -validatecommand "::configDialogues::editor::nofs_spinbox_val %P" \
+ -textvariable ::configDialogues::editor::number_of_spaces \
+ -command ::configDialogues::editor::settings_changed \
+ ] -row 5 -column 1 -sticky we -padx 5
DynamicHelp::add $editing_labelframe.nofs_spinbox \
-text [mc "Number of spaces to use instead of tabs"]
# Item: "Enable autocompletion"
grid [Label $editing_labelframe.completion_lbl \
-text [mc "Enable autocompletion"] \
-helptext [mc "Enable popup-based autocompletion"] \
- ] -row 5 -column 0 -sticky w -padx 5
+ ] -row 6 -column 0 -sticky w -padx 5
grid [checkbutton $editing_labelframe.completion_chbutton \
- -variable ::configDialogs::editor::auto_completion \
- -command ::configDialogs::editor::settings_changed \
- ] -row 5 -column 1 -sticky w -padx 5
+ -variable ::configDialogues::editor::auto_completion \
+ -command ::configDialogues::editor::settings_changed \
+ ] -row 6 -column 1 -sticky w -padx 5
DynamicHelp::add $editing_labelframe.completion_chbutton \
-text [mc "Enable popup-based autocompletion"]
# Item: "Highlight trailing space"
grid [Label $editing_labelframe.trail_sp_lbl \
-text [mc "Highlight trailing space"] \
- ] -row 6 -column 0 -sticky w -padx 5
+ ] -row 7 -column 0 -sticky w -padx 5
grid [checkbutton $editing_labelframe.trail_sp_chbutton \
- -variable ::configDialogs::editor::hg_trailing_sp \
- -command ::configDialogs::editor::settings_changed \
- ] -row 6 -column 1 -sticky w -padx 5
+ -variable ::configDialogues::editor::hg_trailing_sp \
+ -command ::configDialogues::editor::settings_changed \
+ ] -row 7 -column 1 -sticky w -padx 5
# Finalize
grid columnconfigure $editing_labelframe 0 -minsize 200
grid columnconfigure $editing_labelframe 1 -weight 1
@@ -459,7 +473,7 @@ namespace eval editor {
grid [checkbutton $open_labelframe.show_editor_tab_bar_chb \
-onvalue 1 -offvalue 0 \
-variable ::CONFIG(SHOW_EDITOR_TAB_BAR) \
- -command ::configDialogs::editor::settings_changed \
+ -command ::configDialogues::editor::settings_changed \
] -row 0 -column 1 -sticky w -padx 5
# Item: "Default charset"
@@ -470,11 +484,11 @@ namespace eval editor {
grid [ttk::combobox $open_labelframe.charset_cb \
-width 0 \
-state readonly \
- -values $avaliable_encodings \
- -textvariable ::configDialogs::editor::default_encoding \
+ -values $available_encodings \
+ -textvariable ::configDialogues::editor::default_encoding \
] -row 1 -column 1 -sticky we -padx 5
bind $open_labelframe.charset_cb <<ComboboxSelected>> \
- {::configDialogs::editor::settings_changed}
+ {::configDialogues::editor::settings_changed}
DynamicHelp::add $open_labelframe.charset_cb \
-text [mc "When you open file with unknown encoding\nthis encoding will be used"]
# Item: "Default EOL"
@@ -483,28 +497,28 @@ namespace eval editor {
-helptext [mc "When you open file with unknown\nEOL (End Of Line) this EOL will be used"] \
] -row 2 -column 0 -sticky w -padx 5
grid [ttk::combobox $open_labelframe.eol_cb \
- -textvariable ::configDialogs::editor::default_eol \
+ -textvariable ::configDialogues::editor::default_eol \
-width 0 \
-state readonly \
-values {{lf} {cr} {crlf}} \
] -row 2 -column 1 -sticky we -padx 5
bind $open_labelframe.eol_cb <<ComboboxSelected>> \
- {::configDialogs::editor::settings_changed}
+ {::configDialogues::editor::settings_changed}
DynamicHelp::add $open_labelframe.eol_cb \
-text [mc "When you open file with unknown\nEOL (End Of Line) this EOL will be used"]
# Item: "Autosave"
grid [Label $open_labelframe.autosave_lbl \
- -text [mc "Autosave interval"] \
+ -text [mc "Autosave interval \[minutes\]"] \
-helptext [mc "Autosave interval in minutes (0 means disabled)"] \
] -row 3 -column 0 -sticky w -padx 5
grid [ttk::combobox $open_labelframe.autosave_cb \
-width 0 \
-state readonly \
-values {0 1 2 5 10 15 20 30 45 60} \
- -textvariable ::configDialogs::editor::autosave \
+ -textvariable ::configDialogues::editor::autosave \
] -row 3 -column 1 -sticky we -padx 5
bind $open_labelframe.autosave_cb <<ComboboxSelected>> \
- {::configDialogs::editor::settings_changed}
+ {::configDialogues::editor::settings_changed}
DynamicHelp::add $open_labelframe.autosave_cb \
-text [mc "Autosave interval in minutes (0 means disabled)"]
# Finalize
@@ -518,19 +532,19 @@ namespace eval editor {
-helptext [mc "Enable popup-based autocompletion"] \
] -row 0 -column 0 -sticky w -padx 5
grid [checkbutton $cmd_labelframe.completion_chbutton \
- -variable ::configDialogs::editor::cline_completion \
- -command ::configDialogs::editor::settings_changed \
+ -variable ::configDialogues::editor::cline_completion \
+ -command ::configDialogues::editor::settings_changed \
] -row 0 -column 1 -sticky w -padx 5
# Finalize
grid columnconfigure $cmd_labelframe 0 -minsize 200
grid columnconfigure $cmd_labelframe 1 -weight 1
# Pack label frames of tab "General"
- pack $editing_labelframe -fill both -expand 1 -padx 5
- pack $open_labelframe -fill both -expand 1 -padx 5 -pady 10
- pack $cmd_labelframe -fill both -expand 1 -padx 5
+ pack $editing_labelframe -fill both -expand 1 -padx 5 -pady 5
+ pack $open_labelframe -fill both -expand 1 -padx 5 -pady 5
+ pack $cmd_labelframe -fill both -expand 1 -padx 5 -pady 5
}
- {colors} {;# Tab "Colors"
+ {colors} { ;# Tab "Colors"
# Create label frames
set frm_textAreaBackfround [ttk::labelframe \
$colors_tab.textAreaBackfround \
@@ -546,19 +560,21 @@ namespace eval editor {
# Create buttons in label frame "Text area background"
set row 0
foreach name {
- normal_text selected_text current_line
- bookmark simulator_line breakpoint
- error_line trailing_space
- } text {
- {Normal text} {Selected text} {Current line}
- {Bookmark} {Simulator line} {Breakpoint}
- {Line with an error} {Trailing space}
- } {
-
- mk_button_select_menu \
- $frm_textAreaBackfround \
- "::configDialogs::editor::color_$name" \
- $name \
+ normal_text selected_text current_line
+ bookmark simulator_line breakpoint
+ breakpoint_I error_line trailing_space
+ } text [list \
+ [mc "Normal text"] [mc "Selected text"] \
+ [mc "Current line"] [mc "Bookmark"] \
+ [mc "Simulator line"] [mc "Breakpoint"] \
+ [mc "Invalid breakpoint"] [mc "Line with an error"] \
+ [mc "Trailing space"] \
+ ] {
+
+ mk_button_select_menu \
+ $frm_textAreaBackfround \
+ "::configDialogues::editor::color_$name" \
+ $name \
$text
}
@@ -569,14 +585,15 @@ namespace eval editor {
foreach name {
iconBorder_bg lineNumbers_bg
lineNumbers_fg
- } text {
- {Icon border background} {Line numbers background}
- {Line numbers foreground}
- } {
+ } text [list \
+ [mc "Icon border background"] \
+ [mc "Line numbers background"] \
+ [mc "Line numbers foreground"] \
+ ] {
mk_button_select_menu \
$frm_additionalElements \
- "::configDialogs::editor::color_$name" \
+ "::configDialogues::editor::color_$name" \
$name \
$text
@@ -584,8 +601,8 @@ namespace eval editor {
}
# Pack label frames
- pack $frm_textAreaBackfround -fill both -expand 1 -pady 5
- pack $frm_additionalElements -fill both -expand 1 -pady 5
+ pack $frm_textAreaBackfround -fill both -expand 1 -pady 5 -padx 5
+ pack $frm_additionalElements -fill both -expand 1 -pady 5 -padx 5
}
{fonts} { ;# Tab "Fonts"
# Create frames
@@ -607,17 +624,21 @@ namespace eval editor {
-highlightthickness 0 \
-height 15 \
-width 25 \
+ -font [font create \
+ -size -13 \
+ -family {helvetica} \
+ ] \
]
pack $scrollbar -side right -fill y
pack $listBox -side left -fill both -expand 1
- $listBox bindText <1> {::configDialogs::editor::select_font_family %W}
+ $listBox bindText <1> {::configDialogues::editor::select_font_family %W}
if {[winfo exists $listBox.c]} {
bind $listBox.c <Button-5> {%W yview scroll +5 units; break}
bind $listBox.c <Button-4> {%W yview scroll -5 units; break}
}
# Create size listbox
- set scrollbar [ttk::scrollbar $top_right_frame.scrollbar \
+ set scrollbar [ttk::scrollbar $top_right_frame.scrollbar\
-orient vertical \
-command "$top_right_frame.list_box yview" \
]
@@ -629,10 +650,14 @@ namespace eval editor {
-width 7 \
-height 15 \
-highlightthickness 0 \
+ -font [font create \
+ -size -13 \
+ -family {helvetica} \
+ ] \
]
pack $scrollbar -side right -fill y
pack $listBox -side left -fill y
- $listBox bindText <1> {::configDialogs::editor::select_font_size %W}
+ $listBox bindText <1> {::configDialogues::editor::select_font_size %W}
if {[winfo exists $listBox.c]} {
bind $listBox.c <Button-5> {%W yview scroll +5 units; break}
bind $listBox.c <Button-4> {%W yview scroll -5 units; break}
@@ -640,7 +665,7 @@ namespace eval editor {
# Create sample text entry
set sample_text [entry $bottom_frame.entry \
- -bg #EEEEEE \
+ -bg ${::COMMON_BG_COLOR} \
-bd 0 \
-width 30 \
-font [font create \
@@ -659,7 +684,7 @@ namespace eval editor {
# Fill up sizes listbox
for {set i 4} {$i < 22} {incr i} {
- $top_right_frame.list_box insert end $i -text $i
+ $listBox insert end $i -text "$i"
if {$i == $sample_text_size} {
$top_right_frame.list_box selection set $i
}
@@ -671,46 +696,44 @@ namespace eval editor {
# Fill up fonts listbox
after idle [subst {
- set i 0
- foreach font \[font families\] {
- set font_ref \[font create -family \$font\]
- if {!\[font metrics \$font_ref -fixed\]} {
+ if {[winfo exists $top_left_frame.list_box]} {
+ set i 0
+ foreach font \[font families\] {
+ set font_ref \[font create -family \$font\]
+ if {!\[font metrics \$font_ref -fixed\]} {
+ font delete \$font_ref
+ continue
+ }
font delete \$font_ref
- continue
- }
- font delete \$font_ref
- $top_left_frame.list_box insert end \$i -text \$font
- if {\$font == {$sample_text_family}} {
- $top_left_frame.list_box selection set \$i
+ $top_left_frame.list_box insert end \$i -text \$font
+ if {\$font == {$sample_text_family}} {
+ $top_left_frame.list_box selection set \$i
+ }
+ incr i
+ update
}
- incr i
- update
+ destroy $bottom_frame.progress
}
- destroy $bottom_frame.progress
}]
}
- {highlight} { ;# Tab "Syntax highlight"
- set highlight_notebook [ttk::notebook $highlight_tab.nb]
- bind $highlight_notebook <<NotebookTabChanged>> {after idle {
- set tab_index [%W index [%W select]]
-
- if {[lsearch ${::configDialogs::editor::hn_tab_created_so_far} $tab_index] == -1} {
- lappend ::configDialogs::editor::hn_tab_created_so_far $tab_index
- ::configDialogs::editor::create_highlight_tab $tab_index
- }
- }}
- set ::configDialogs::editor::hn_tab_created_so_far [list]
-
- set highlight_tab_asm [frame $highlight_notebook.highlight_tab_asm]
- $highlight_notebook add $highlight_tab_asm -text [mc "Assembler"]
- set highlight_tab_C [frame $highlight_notebook.highlight_tab_C]
- $highlight_notebook add $highlight_tab_C -text [mc "C language"]
- set highlight_tab_lst [frame $highlight_notebook.highlight_tab_lst]
- $highlight_notebook add $highlight_tab_lst -text [mc "Code listing"]
-
- $highlight_notebook select $highlight_tab_asm
- pack $highlight_notebook -fill both -expand 1
+ {highlight} { ;# Tab "Syntax highlight"
+ set highlight_notebook [ModernNoteBook $highlight_tab.nb]
+ set highlight_tab_asm [$highlight_notebook insert end highlight_tab_asm \
+ -createcmd {::configDialogues::editor::create_highlight_tab 0} \
+ -text [mc "Assembler"] \
+ ]
+ set highlight_tab_C [$highlight_notebook insert end highlight_tab_C \
+ -createcmd {::configDialogues::editor::create_highlight_tab 1} \
+ -text [mc "C language"] \
+ ]
+ set highlight_tab_lst [$highlight_notebook insert end highlight_tab_lst \
+ -createcmd {::configDialogues::editor::create_highlight_tab 2} \
+ -text [mc "Code listing"] \
+ ]
+
+ $highlight_notebook raise highlight_tab_asm
+ pack [$highlight_notebook get_nb] -fill both -expand 1
}
}
}
@@ -723,9 +746,9 @@ namespace eval editor {
# @retuer void
proc create_highlight_tab {language} {
## General
- variable hightlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
- variable hightlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
- variable hightlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
+ variable highlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
+ variable highlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
+ variable highlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
variable highlight_tab_asm ;# Widget: Tab "Syntax highlight"/"Assembler"
variable highlight_tab_C ;# Widget: Tab "Syntax highlight"/"C language"
variable highlight_tab_lst ;# Widget: Tab "Syntax highlight"/"Code listing"
@@ -752,15 +775,15 @@ namespace eval editor {
switch -- $language {
0 {
set tab_frame $highlight_tab_asm
- set hightlight_tags $hightlight_tags_asm
+ set highlight_tags $highlight_tags_asm
}
1 {
set tab_frame $highlight_tab_C
- set hightlight_tags $hightlight_tags_C
+ set highlight_tags $highlight_tags_C
}
2 {
set tab_frame $highlight_tab_lst
- set hightlight_tags $hightlight_tags_lst
+ set highlight_tags $highlight_tags_lst
}
}
@@ -777,20 +800,44 @@ namespace eval editor {
]
# SRC header (in SCR frame)
set highlight_tab_scr_header [text $highlight_tab_scr_frm.scr_text_h \
- -bd 0 -height 2 -bg {#DFDFDF} -height 1 -width 0 \
- -cursor left_ptr -font [font create -family any -size -16] \
+ -bd 0 \
+ -height 2 \
+ -bg {#DFDFDF} \
+ -height 1 \
+ -width 0 \
+ -cursor left_ptr \
+ -font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size -16 \
+ ] \
]
bind $highlight_tab_scr_header <<Selection>> {false_selection %W}
bind $highlight_tab_scr_header <ButtonRelease-3> {break}
bind $highlight_tab_scr_header <Key-Menu> {break}
- # list of tags (in SCR frame)
+ # Padding above the list of tags (see below)
+ set padding_widget [text $highlight_tab_scr_frm.padding \
+ -bd 0 \
+ -bg {#FFFFFF} \
+ -cursor left_ptr \
+ -font [font create \
+ -size -15 \
+ -family $::DEFAULT_FIXED_FONT \
+ ] \
+ -height 1 \
+ -width 1 \
+ ]
+ # List of tags (in SCR frame)
set highlight_tab_scr_text [text $highlight_tab_scr_frm.scr_text_c \
-bd 0 \
-bg {#FFFFFF} \
-cursor left_ptr \
- -font ${::Editor::defaultFont_bold} \
+ -font [font create \
+ -size -12 \
+ -family $::DEFAULT_FIXED_FONT \
+ ] \
-yscrollcommand "$highlight_tab_scrollbar set" \
-width 1 \
+ -tabstyle wordprocessor \
]
$highlight_tab_scr_text tag configure sel_user \
-borderwidth 1 -background {#CCCCFF} -relief raised
@@ -799,7 +846,7 @@ namespace eval editor {
1 {set sh_ns CsyntaxHighlight}
2 {set sh_ns LSTsyntaxHighlight}
}
- ${sh_ns}::create_tags $highlight_tab_scr_text ${::Editor::fontSize} ${::Editor::fontFamily} $hightlight_tags
+ ${sh_ns}::create_tags $highlight_tab_scr_text 12 $::DEFAULT_FIXED_FONT $highlight_tags 1
bind $highlight_tab_scr_text <<Selection>> {false_selection %W}
bind $highlight_tab_scr_text <ButtonRelease-3> {break}
bind $highlight_tab_scr_text <Key-Menu> {break}
@@ -807,13 +854,21 @@ namespace eval editor {
bind $highlight_tab_scr_text <Button-5> "$highlight_tab_scr_text yview scroll +1 units"
# Sample text
set highlight_tab_scr_sample_text [text $tab_frame.scr_text_sample \
- -bd 1 -bg {#FFFFFF} -width 0 -height 3 -maxundo 0 \
- -wrap none -selectborderwidth 1 -highlightcolor gray \
+ -bd 1 \
+ -bg {#FFFFFF} \
+ -width 0 \
+ -height 3 \
+ -maxundo 0 \
+ -wrap none \
+ -selectborderwidth 1 \
+ -highlightcolor gray \
+ -tabstyle wordprocessor \
+ -font [font create -weight bold -size -12 -family $::DEFAULT_FIXED_FONT] \
]
- ${sh_ns}::create_tags $highlight_tab_scr_sample_text 12 $::DEFAULT_FIXED_FONT $hightlight_tags
- bind $highlight_tab_scr_sample_text <KeyRelease> "::configDialogs::editor::parse %K $language"
+ ${sh_ns}::create_tags $highlight_tab_scr_sample_text 12 $::DEFAULT_FIXED_FONT $highlight_tags
+ bind $highlight_tab_scr_sample_text <KeyRelease> "::configDialogues::editor::parse %K $language"
bind $highlight_tab_scr_sample_text <ButtonPress-1> \
- "::configDialogs::editor::syntax_sample_text_click %x %y $language"
+ "::configDialogues::editor::syntax_sample_text_click %x %y $language"
switch -- $language {
0 {
$highlight_tab_scr_sample_text insert end [join [list \
@@ -835,15 +890,16 @@ namespace eval editor {
}
2 {
$highlight_tab_scr_sample_text insert end [join {
- { 0055 18 X data 55h} \
- { =1 32 sub_0:} \
- {0014 1122 =1 33 +1 inc A} \
+ { 0055 18 X data 55h} \
+ { =1 32 sub_0:} \
+ {0014 1122 =1 33 +1 inc A} \
} "\n"]
}
}
# Pack widgets
pack $highlight_tab_scr_header -in $highlight_tab_scr_frm -fill x -expand 1 -anchor n
+ pack $padding_widget -in $highlight_tab_scr_frm -fill x
pack $highlight_tab_scr_text -in $highlight_tab_scr_frm -fill both -expand 1
pack $highlight_tab_scrollbar -side right -fill y
pack $highlight_tab_scr_frm -side left -expand 1 -fill both
@@ -867,7 +923,7 @@ namespace eval editor {
set row 0 ;# Number of current row
set list_of_tags {} ;# List of highlighting tags
set highlight_tab_checkbuttons {} ;# List of check buttons
- foreach key $hightlight_tags {
+ foreach key $highlight_tags {
incr row
# Local variables
@@ -886,21 +942,21 @@ namespace eval editor {
# Determinate font weight
if {$bold} {
set weight bold
- } {
+ } else {
set weight normal
}
# Determinate font slant
if {$italic} {
set slant italic
- } {
+ } else {
set slant roman
}
# Initialize some NS variables
- set ::configDialogs::editor::__${language}_${row}_italic $italic
- set ::configDialogs::editor::__${language}_${row}_overstrike $overstrike
- set ::configDialogs::editor::__${language}_${row}_bold $bold
+ set ::configDialogues::editor::__${language}_${row}_italic $italic
+ set ::configDialogues::editor::__${language}_${row}_overstrike $overstrike
+ set ::configDialogues::editor::__${language}_${row}_bold $bold
# Insert tag name and some '\t'
$highlight_tab_scr_text insert end $content
@@ -911,33 +967,45 @@ namespace eval editor {
$highlight_tab_scr_text insert end [string repeat { } [expr {24 - $len}]]
# Insert checkbutton "Italic"
- set button [checkbutton $highlight_tab_scr_frm.italic_${row} \
- -command "::configDialogs::editor::change_style italic $row $language" \
- -variable ::configDialogs::editor::__${language}_${row}_italic \
- -relief flat -pady 0 -highlightthickness 0 -bg {#FFFFFF} \
- -activebackground {#FFFFFF} \
+ set button [checkbutton $highlight_tab_scr_frm.italic_${row} \
+ -command "::configDialogues::editor::change_style italic $row $language"\
+ -variable ::configDialogues::editor::__${language}_${row}_italic \
+ -relief flat \
+ -pady 0 \
+ -highlightthickness 0 \
+ -bg {#FFFFFF} \
+ -activebackground {#FFFFFF} \
+ -selectcolor {#FFFFFF} \
]
lappend localButtons $button
$highlight_tab_scr_text window create end -window $button
$highlight_tab_scr_text insert end " "
# Insert checkbutton "Overstike"
- set button [checkbutton $highlight_tab_scr_frm.overstrike_${row} \
- -command "::configDialogs::editor::change_style overstrike $row $language" \
- -variable ::configDialogs::editor::__${language}_${row}_overstrike \
- -relief flat -pady 0 -highlightthickness 0 -bg {#FFFFFF} \
- -activebackground {#FFFFFF} \
+ set button [checkbutton $highlight_tab_scr_frm.overstrike_${row} \
+ -command "::configDialogues::editor::change_style overstrike $row $language" \
+ -variable ::configDialogues::editor::__${language}_${row}_overstrike \
+ -relief flat \
+ -pady 0 \
+ -highlightthickness 0 \
+ -bg {#FFFFFF} \
+ -activebackground {#FFFFFF} \
+ -selectcolor {#FFFFFF} \
]
lappend localButtons $button
$highlight_tab_scr_text window create end -window $button
$highlight_tab_scr_text insert end " "
# Insert checkbutton "Bold"
- set button [checkbutton $highlight_tab_scr_frm.bold_${row} \
- -command "::configDialogs::editor::change_style bold $row $language" \
- -variable ::configDialogs::editor::__${language}_${row}_bold \
- -relief flat -pady 0 -highlightthickness 0 -bg {#FFFFFF} \
- -activebackground {#FFFFFF} \
+ set button [checkbutton $highlight_tab_scr_frm.bold_${row} \
+ -command "::configDialogues::editor::change_style bold $row $language" \
+ -variable ::configDialogues::editor::__${language}_${row}_bold \
+ -relief flat \
+ -pady 0 \
+ -highlightthickness 0 \
+ -bg {#FFFFFF} \
+ -activebackground {#FFFFFF} \
+ -selectcolor {#FFFFFF} \
]
lappend localButtons $button
$highlight_tab_scr_text window create end -window $button
@@ -947,7 +1015,7 @@ namespace eval editor {
set button [button $highlight_tab_scr_frm.color_${row} \
-bd 1 -relief raised -pady 0 -highlightthickness 0 \
-bg $color -activebackground $color -width 3 \
- -command "::configDialogs::editor::select_bg_color $highlight_tab_scr_frm.color_${row} $row $language" \
+ -command "::configDialogues::editor::select_bg_color $highlight_tab_scr_frm.color_${row} $row $language" \
]
$highlight_tab_scr_text window create end -window $button
@@ -992,7 +1060,7 @@ namespace eval editor {
${sh_ns}::highlight $highlight_tab_scr_sample_text $i
}
- } {
+ } else {
parse {} 1
}
}
@@ -1001,7 +1069,7 @@ namespace eval editor {
# @return void
proc editor_to_use_changed {} {
variable nb ;# Widget: Notebook itself
- variable editor_to_use ;# Int: Prefred editor
+ variable editor_to_use ;# Int: Preferred editor
variable general_tab ;# Widget: Tab "General"
variable highlight_tab ;# Widget: Tab "Syntax highlight"
@@ -1009,42 +1077,42 @@ namespace eval editor {
if {$editor_to_use} {
set state disabled
- } {
+ } else {
set state normal
}
- foreach tab [list $general_tab $highlight_tab] {
- $nb tab $tab -state $state
+ foreach tab [list general_tab highlight_tab] {
+ $nb itemconfigure tab -state $state
}
}
## Create some text tag in the given text widget
# @parm Widget text_widget - target text widget
- # @parm Int item - index of the tag (in variable hightlight_tags)
+ # @parm Int item - index of the tag (in variable highlight_tags)
# @parm Int language - Highlighting pattern
# 0 - Assembler
# 1 - C language
# 2 - Code listing
# @return void
proc create_tags {text_widget item language} {
- variable hightlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
- variable hightlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
- variable hightlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
+ variable highlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
+ variable highlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
+ variable highlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
# Determinate set of highlighting tags
switch -- $language {
0 {
- set hightlight_tags $hightlight_tags_asm
+ set highlight_tags $highlight_tags_asm
}
1 {
- set hightlight_tags $hightlight_tags_C
+ set highlight_tags $highlight_tags_C
}
2 {
- set hightlight_tags $hightlight_tags_lst
+ set highlight_tags $highlight_tags_lst
}
}
# Gain tag definition
- set item [lindex $hightlight_tags $item]
+ set item [lindex $highlight_tags $item]
# Create array of tag attributes
for {set i 0} {$i < 5} {incr i} {
set tag($i) [lindex $item $i]
@@ -1054,37 +1122,43 @@ namespace eval editor {
if {$tag(1) == {}} {
set tag(1) black
}
- # Font weight
+ # Font slant
if {$tag(3) == 1} {
set tag(3) italic
- } {
+ } else {
set tag(3) roman
}
- # Font slant
- if {$tag(4) == 1} {
- set tag(4) bold
- } {
+
+ # Font weight
+ if {!$::MICROSOFT_WINDOWS} {
+ if {$tag(4) == 1} {
+ set tag(4) bold
+ } else {
+ set tag(4) normal
+ }
+ } else {
set tag(4) normal
}
# Create the tag
- $text_widget tag configure $tag(0) \
- -foreground $tag(1) \
- -font [ font create \
- -overstrike $tag(2) \
- -slant $tag(3) \
- -weight $tag(4) \
- -size -12 \
- -family $::DEFAULT_FIXED_FONT]
+ $text_widget tag configure $tag(0) \
+ -foreground $tag(1) \
+ -font [ font create \
+ -overstrike $tag(2) \
+ -slant $tag(3) \
+ -weight $tag(4) \
+ -size -12 \
+ -family $::DEFAULT_FIXED_FONT \
+ ]
}
## Call procedure syntax_find
# @parm Int x - relative X coordinate
# @parm Int y - relative Y coordinate
# @parm Int language - Highlighting pattern
- # 0 - Assembler
- # 1 - C language
- # 2 - Code listing
+ # 0 - Assembler
+ # 1 - C language
+ # 2 - Code listing
# @return void
proc syntax_sample_text_click {x y language} {
variable highlight_tab_scr_sample_text_asm ;# ID of text widget for sample text
@@ -1158,7 +1232,10 @@ namespace eval editor {
set index [$highlight_tab_scr_text index sel_user.first]
set buttons [lindex $highlight_tab_checkbuttons [expr {int($index) - 1}]]
foreach button $buttons {
- $button configure -bg {#FFFFFF} -activebackground {#FFFFFF}
+ $button configure \
+ -bg {#FFFFFF} \
+ -selectcolor {#FFFFFF} \
+ -activebackground {#FFFFFF}
}
$highlight_tab_scr_text tag remove sel_user 1.0 end
}
@@ -1167,6 +1244,19 @@ namespace eval editor {
set index [$highlight_tab_scr_sample_text index $text_index]
set index [$highlight_tab_scr_sample_text tag names $index]
+ # Remove tags subdued to other tags which are also contained in the tag list
+ if {[llength $index] > 1} {
+ set idx [lsearch -ascii -exact $index tag_c_dox_comment]
+ if {$idx != -1} {
+ set index [lreplace $index $idx $idx]
+ }
+
+ set idx [lsearch -ascii -exact $index tag_normal]
+ if {$idx != -1} {
+ set index [lreplace $index $idx $idx]
+ }
+ }
+
# If the tag could not be determinated -> abort
set index [lindex $index 0]
if {$index == {}} {return}
@@ -1178,7 +1268,10 @@ namespace eval editor {
# Change background color for checkbuttons related to the tag
set buttons [lindex $highlight_tab_checkbuttons $index]
foreach button $buttons {
- $button configure -bg {#CCCCFF} -activebackground {#CCCCFF}
+ $button configure \
+ -bg {#CCCCFF} \
+ -selectcolor {#CCCCFF} \
+ -activebackground {#CCCCFF}
}
# Select row related to the tag
@@ -1211,6 +1304,8 @@ namespace eval editor {
}
}
+ set lineNumber [expr {int([$widget index insert])}]
+
# Keep indentication level after line break
if {$key == "KP_Enter" || $key == "Return"} {
# Get content of previous line
@@ -1230,33 +1325,33 @@ namespace eval editor {
}
# Syntax highlight for assembler or code listing
- if {$language == 0 && $language == 2} {
+ if {$language == 0 || $language == 2} {
# Highlight current line
if {[lsearch {
Left Right Down Up Insert Home Prior
End Next Shift_R Control_R Alt_L Alt_R
Control_L Shift_L Escape
- } $key] == -1} {
+ } $key] == -1} then {
if {$language == 0} {
- ASMsyntaxHighlight::highlight $widget $lineNumber
- } {
- LSTsyntaxHighlight::highlight $widget $lineNumber
+ ::ASMsyntaxHighlight::highlight $widget $lineNumber
+ } else {
+ ::LSTsyntaxHighlight::highlight $widget $lineNumber
}
}
# Syntax highlight for C language
- } {
+ } else {
# Highlight all lines
if {[lsearch {
Left Right Down Up Insert Home Prior
End Next Shift_R Control_R Alt_L Alt_R
Control_L Shift_L Escape
- } $key] == -1} {
+ } $key] == -1} then {
set status 1
set end_line [expr {int([$widget index end])}]
for {set line 0} {$line < $end_line} {incr line} {
- set status [CsyntaxHighlight::highlight \
- $widget $line $status \
+ set status [::CsyntaxHighlight::highlight \
+ $widget $line $status \
]
}
}
@@ -1320,9 +1415,9 @@ namespace eval editor {
# 2 - Code listing
# @return void
proc change_style {what row language} {
- variable hightlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
- variable hightlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
- variable hightlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
+ variable highlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
+ variable highlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
+ variable highlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
variable highlight_tab_scr_text_C ;# ID of text widget for configuring syntax
variable highlight_tab_scr_sample_text_C ;# ID of text widget for sample text
@@ -1339,33 +1434,33 @@ namespace eval editor {
0 {
set highlight_tab_scr_sample_text $highlight_tab_scr_sample_text_asm
set highlight_tab_scr_text $highlight_tab_scr_text_asm
- set hightlight_tags hightlight_tags_asm
+ set highlight_tags highlight_tags_asm
}
1 {
set highlight_tab_scr_sample_text $highlight_tab_scr_sample_text_C
set highlight_tab_scr_text $highlight_tab_scr_text_C
- set hightlight_tags hightlight_tags_C
+ set highlight_tags highlight_tags_C
}
2 {
set highlight_tab_scr_sample_text $highlight_tab_scr_sample_text_lst
set highlight_tab_scr_text $highlight_tab_scr_text_lst
- set hightlight_tags hightlight_tags_lst
+ set highlight_tags highlight_tags_lst
}
}
# Decide what to change
switch -- $what {
overstrike {
- lset $hightlight_tags "$row 2" \
- [subst "\${::configDialogs::editor::__${language}_[expr {$row + 1}]_overstrike}"]
+ lset $highlight_tags [list $row 2] \
+ [subst -nocommands "\${::configDialogues::editor::__${language}_[expr {$row + 1}]_overstrike}"]
}
italic {
- lset $hightlight_tags "$row 3" \
- [subst "\${::configDialogs::editor::__${language}_[expr {$row + 1}]_italic}"]
+ lset $highlight_tags [list $row 3] \
+ [subst -nocommands "\${::configDialogues::editor::__${language}_[expr {$row + 1}]_italic}"]
}
bold {
- lset $hightlight_tags "$row 4" \
- [subst "\${::configDialogs::editor::__${language}_[expr {$row + 1}]_bold}"]
+ lset $highlight_tags [list $row 4] \
+ [subst -nocommands "\${::configDialogues::editor::__${language}_[expr {$row + 1}]_bold}"]
}
default {return}
}
@@ -1382,12 +1477,33 @@ namespace eval editor {
# @parm String content - content to validate
# @return Bool - success
proc nofs_spinbox_val {content} {
+ if {![string length $content]} {
+ return 1
+ }
if {![string is digit $content]} {
return 0
}
if {$content > 16 || $content < 1} {
return 0
}
+ ::configDialogues::editor::settings_changed
+ return 1
+ }
+
+ ## Validate content of tabw_spinbox
+ # @parm String content - content to validate
+ # @return Bool - success
+ proc tabw_spinbox_val {content} {
+ if {![string length $content]} {
+ return 1
+ }
+ if {![string is digit $content]} {
+ return 0
+ }
+ if {$content > 40 || $content < 1} {
+ return 0
+ }
+ ::configDialogues::editor::settings_changed
return 1
}
@@ -1401,9 +1517,9 @@ namespace eval editor {
# @return void
proc select_bg_color {button row language} {
variable win ;# ID of dialog toplevel window
- variable hightlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
- variable hightlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
- variable hightlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
+ variable highlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
+ variable highlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
+ variable highlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
variable highlight_tab_scr_text_asm ;# ID of text widget for configuring syntax
variable highlight_tab_scr_sample_text_asm ;# ID of text widget for sample text
@@ -1417,20 +1533,20 @@ namespace eval editor {
0 {
set highlight_tab_scr_sample_text $highlight_tab_scr_sample_text_asm
set highlight_tab_scr_text $highlight_tab_scr_text_asm
- set hightlight_tags_var hightlight_tags_asm
- set hightlight_tags $hightlight_tags_asm
+ set highlight_tags_var highlight_tags_asm
+ set highlight_tags $highlight_tags_asm
}
1 {
set highlight_tab_scr_sample_text $highlight_tab_scr_sample_text_C
set highlight_tab_scr_text $highlight_tab_scr_text_C
- set hightlight_tags_var hightlight_tags_C
- set hightlight_tags $hightlight_tags_C
+ set highlight_tags_var highlight_tags_C
+ set highlight_tags $highlight_tags_C
}
2 {
set highlight_tab_scr_sample_text $highlight_tab_scr_sample_text_lst
set highlight_tab_scr_text $highlight_tab_scr_text_lst
- set hightlight_tags_var hightlight_tags_lst
- set hightlight_tags $hightlight_tags_lst
+ set highlight_tags_var highlight_tags_lst
+ set highlight_tags $highlight_tags_lst
}
}
@@ -1442,7 +1558,7 @@ namespace eval editor {
}
# Invoke new color selection dialog
- set color [lindex $hightlight_tags "$row 1"]
+ set color [lindex $highlight_tags [list $row 1]]
set color [SelectColor .select_color \
-parent $win \
-color $color \
@@ -1451,7 +1567,7 @@ namespace eval editor {
# Change button background color
if {$color != {}} {
- lset $hightlight_tags_var "$row 1" $color
+ lset $highlight_tags_var [list $row 1] $color
$button configure -bg $color -activebackground $color
}
@@ -1484,7 +1600,7 @@ namespace eval editor {
tag_label {return {Label}}
tag_instruction {return {Instruction}}
tag_sfr {return {SFR register}}
- tag_indirect {return {Indirect adress}}
+ tag_indirect {return {Indirect address}}
tag_imm_char {return {Immediate char}}
tag_imm_hex {return {Immediate hex}}
tag_imm_oct {return {Immediate oct}}
@@ -1498,6 +1614,7 @@ namespace eval editor {
tag_c_data_type {return {Data type}}
tag_c_dec {return {Decimal}}
tag_c_hex {return {Hexadecimal}}
+ tag_c_bin {return {Binary number}}
tag_c_oct {return {Octal}}
tag_c_char {return {Char}}
tag_c_float {return {Float}}
@@ -1542,7 +1659,7 @@ namespace eval editor {
variable button_index ;# Button index (for creating many buttons)
# Get color from the given variable
- set color [subst "\${$variable}"]
+ set color [subst -nocommands "\${$variable}"]
# Create button label
grid [label $parent.${name}${button_index} \
@@ -1554,7 +1671,7 @@ namespace eval editor {
set button [button $parent.but_normal_text$button_index \
-bd 1 -relief raised -pady 0 -highlightthickness 0 \
-bg $color -width 10 -activebackground $color \
- -command "::configDialogs::editor::select_color $variable $parent.but_normal_text$button_index"
+ -command "::configDialogues::editor::select_color $variable $parent.but_normal_text$button_index"
]
# Show button
@@ -1578,10 +1695,10 @@ namespace eval editor {
}
# Invoke new color selection dialog
- set color [subst "\$$variable"]
- set color [SelectColor .select_color \
- -parent $win \
- -color $color \
+ set color [subst -nocommands "\$$variable"]
+ set color [SelectColor .select_color \
+ -parent $win \
+ -color $color \
-title [mc "Select color - %s" ${::APPNAME}] \
]
@@ -1604,6 +1721,7 @@ namespace eval editor {
variable intentation_mode ;# Editor indentation mode
variable spaces_no_tabs ;# Bool: Use spaces instead of tabs
variable number_of_spaces ;# Number of spaces to use instead of tab
+ variable tab_width ;# Int: Tab width
variable autosave ;# Int: Autosave interval in minutes (0 == disabled)
variable auto_completion ;# Bool: Enable popup-base completion
variable cline_completion ;# Bool: Enable popup-based completion for command line
@@ -1615,6 +1733,7 @@ namespace eval editor {
variable color_current_line ;# RGB: Backgound color for current line
variable color_bookmark ;# RGB: Backgound color for bookmarks
variable color_breakpoint ;# RGB: Backgound color for breakpoints
+ variable color_breakpoint_I ;# RGB: Backgound color for invalid breakpoints
variable color_simulator_line ;# RGB: Backgound color for simulator line
variable color_error_line ;# RGB: Backgound color for line containing an error
variable color_trailing_space ;# RGB: Backgound color for trailing space
@@ -1625,38 +1744,40 @@ namespace eval editor {
variable sample_text_size ;# Font size
variable sample_text_family ;# Font family
- variable hightlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
- variable hightlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
- variable hightlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
+ variable highlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
+ variable highlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
+ variable highlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
# Get highlighting tags
- set hightlight_tags_asm ${::ASMsyntaxHighlight::hightlight_tags}
- set hightlight_tags_C ${::CsyntaxHighlight::hightlight_tags}
- set hightlight_tags_lst ${::LSTsyntaxHighlight::hightlight_tags}
+ set highlight_tags_asm ${::ASMsyntaxHighlight::highlight_tags}
+ set highlight_tags_C ${::CsyntaxHighlight::highlight_tags}
+ set highlight_tags_lst ${::LSTsyntaxHighlight::highlight_tags}
# Get data from editor NS
- set intentation_mode [mc ${Editor::intentation_mode}]
- set spaces_no_tabs ${Editor::spaces_no_tabs}
- set number_of_spaces ${Editor::number_of_spaces}
- set auto_completion ${Editor::auto_completion}
- set cline_completion ${Editor::cline_completion}
- set autosave ${Editor::autosave}
- set auto_brackets ${Editor::auto_brackets}
- set hg_trailing_sp ${Editor::hg_trailing_sp}
- set sample_text_size ${Editor::fontSize}
- set sample_text_family ${Editor::fontFamily}
- set color_normal_text ${Editor::normal_text_bg}
- set color_iconBorder_bg ${Editor::iconBorder_bg}
- set color_lineNumbers_bg ${Editor::lineNumbers_bg}
- set color_lineNumbers_fg ${Editor::lineNumbers_fg}
- set editor_to_use [::settings getValue \
- "Editor config/editor_to_use" ${Editor::editor_to_use} \
+ set intentation_mode [mc ${::Editor::intentation_mode}]
+ set spaces_no_tabs ${::Editor::spaces_no_tabs}
+ set number_of_spaces ${::Editor::number_of_spaces}
+ set tab_width ${::Editor::tab_width}
+ set auto_completion ${::Editor::auto_completion}
+ set cline_completion ${::Editor::cline_completion}
+ set autosave ${::Editor::autosave}
+ set auto_brackets ${::Editor::auto_brackets}
+ set hg_trailing_sp ${::Editor::hg_trailing_sp}
+ set sample_text_size ${::Editor::fontSize}
+ set sample_text_family ${::Editor::fontFamily}
+ set color_normal_text ${::Editor::normal_text_bg}
+ set color_iconBorder_bg ${::Editor::iconBorder_bg}
+ set color_lineNumbers_bg ${::Editor::lineNumbers_bg}
+ set color_lineNumbers_fg ${::Editor::lineNumbers_fg}
+ set editor_to_use [::settings getValue \
+ "Editor config/editor_to_use" \
+ ${::Editor::editor_to_use} \
]
# Get data from filelist NS
- set default_encoding ${FileList::default_encoding}
- set default_eol ${FileList::default_eol}
+ set default_encoding ${::FileList::default_encoding}
+ set default_eol ${::FileList::default_eol}
foreach record ${::Editor::line_markers} {
set key [lindex $record 0]
@@ -1675,6 +1796,9 @@ namespace eval editor {
{tag_breakpoint} {
set color_breakpoint $val
}
+ {tag_breakpoint_INVALID} {
+ set color_breakpoint_I $val
+ }
{tag_simulator_curr} {
set color_simulator_line $val
}
@@ -1684,6 +1808,9 @@ namespace eval editor {
{tag_trailing_space} {
set color_trailing_space $val
}
+ default {
+ error "Error: Inconsistency in configuration managment, ::Editor::line_markers"
+ }
}
}
}
@@ -1698,6 +1825,7 @@ namespace eval editor {
variable intentation_mode ;# Editor indentation mode
variable spaces_no_tabs ;# Bool: Use spaces instead of tabs
variable number_of_spaces ;# Number of spaces to use instead of tab
+ variable tab_width ;# Int: Tab width
variable autosave ;# Int: Autosave interval in minutes (0 == disabled)
variable auto_completion ;# Bool: Enable popup-base completion
variable cline_completion ;# Bool: Enable popup-based completion for command line
@@ -1710,6 +1838,7 @@ namespace eval editor {
variable color_current_line ;# RGB: Backgound color for current line
variable color_bookmark ;# RGB: Backgound color for bookmarks
variable color_breakpoint ;# RGB: Backgound color for breakpoints
+ variable color_breakpoint_I ;# RGB: Backgound color for invalid breakpoints
variable color_simulator_line ;# RGB: Backgound color for simulator line
variable color_error_line ;# RGB: Backgound color for line containing an error
variable color_trailing_space ;# RGB: Backgound color for trailing space
@@ -1720,13 +1849,13 @@ namespace eval editor {
variable sample_text_size ;# Font size
variable sample_text_family ;# Font family
- variable hightlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
- variable hightlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
- variable hightlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
+ variable highlight_tags_asm ;# List: Definition of colors and styles for assembler syntax highlighting
+ variable highlight_tags_C ;# List: Definition of colors and styles for C syntax highlighting
+ variable highlight_tags_lst ;# List: Definition of colors and styles for LST syntax highlighting
- if {!$Editor::auto_completion && $auto_completion} {
+ if {!${::Editor::auto_completion} && $auto_completion} {
set autocompletion_turned_on 1
- } {
+ } else {
set autocompletion_turned_on 0
}
@@ -1751,18 +1880,25 @@ namespace eval editor {
if {$number_of_spaces != {}} {
set Editor::number_of_spaces $number_of_spaces
- } {
+ } else {
set Editor::number_of_spaces 8
}
-
- set Editor::line_markers [list \
- "sel $color_selected_text" \
- "tag_current_line $color_current_line" \
- "tag_bookmark $color_bookmark" \
- "tag_breakpoint $color_breakpoint" \
- "tag_simulator_curr $color_simulator_line" \
- "tag_error_line $color_error_line" \
- "tag_trailing_space $color_trailing_space"]
+ if {$tab_width != {}} {
+ set Editor::tab_width $tab_width
+ } else {
+ set Editor::tab_width 8
+ }
+
+ set Editor::line_markers [list \
+ [list sel $color_selected_text ] \
+ [list tag_current_line $color_current_line ] \
+ [list tag_bookmark $color_bookmark ] \
+ [list tag_breakpoint $color_breakpoint ] \
+ [list tag_simulator_curr $color_simulator_line ] \
+ [list tag_error_line $color_error_line ] \
+ [list tag_trailing_space $color_trailing_space ] \
+ [list tag_breakpoint_INVALID $color_breakpoint_I ] \
+ ]
set Editor::defaultFont [font create \
-size -$sample_text_size \
@@ -1775,9 +1911,9 @@ namespace eval editor {
]
## Syntax highlight
- set ::ASMsyntaxHighlight::hightlight_tags $hightlight_tags_asm
- set ::CsyntaxHighlight::hightlight_tags $hightlight_tags_C
- set ::LSTsyntaxHighlight::hightlight_tags $hightlight_tags_lst
+ set ::ASMsyntaxHighlight::highlight_tags $highlight_tags_asm
+ set ::CsyntaxHighlight::highlight_tags $highlight_tags_C
+ set ::LSTsyntaxHighlight::highlight_tags $highlight_tags_lst
}
## Adjust all editors to fit new settings
@@ -1786,7 +1922,7 @@ namespace eval editor {
variable autocompletion_turned_on
# Check if there is at least 1 opened editor
- if {[llength ${X::openedProjects}] == 0} {
+ if {[llength ${::X::openedProjects}] == 0} {
return 0
}
@@ -1795,6 +1931,7 @@ namespace eval editor {
# Refresh font settings in right panel
$project rightPanel_refresh_font_settings 1
+ $project rightPanel_clear_symbol_list
# Adjust tab bar
$project show_hide_tab_bar
@@ -1809,13 +1946,19 @@ namespace eval editor {
}
ASMsyntaxHighlight::create_tags \
[$editor cget -editor] \
- ${Editor::fontSize} \
- ${Editor::fontFamily}
+ ${::Editor::fontSize} \
+ ${::Editor::fontFamily}
CsyntaxHighlight::create_tags \
[$editor cget -editor] \
- ${Editor::fontSize} \
- ${Editor::fontFamily}
+ ${::Editor::fontSize} \
+ ${::Editor::fontFamily}
+ LSTsyntaxHighlight::create_tags \
+ [$editor cget -editor] \
+ ${::Editor::fontSize} \
+ ${::Editor::fontFamily}
}
+
+ $project rightPanel_refresh_symbols
}
# done ...
@@ -1825,14 +1968,15 @@ namespace eval editor {
## Set status changed to True
# @return true
proc settings_changed {} {
+ variable apply_button ;# ID of button "Apply"
variable changed ;# Bool: Settings changed
variable anything_modified ;# Bool: Settings changed (stay set to 1 even after APPLY)
- variable apply_button ;# ID of button "Apply"
if {$changed} {return}
set changed 1
set anything_modified 1
+
$apply_button configure -state normal
}
@@ -1883,7 +2027,7 @@ namespace eval editor {
variable changed ;# Bool: Settings changed
# Check if there is at least 1 opened editor
- if {[llength ${X::openedProjects}] == 0} {
+ if {[llength ${::X::openedProjects}] == 0} {
return 0
}
@@ -1891,37 +2035,40 @@ namespace eval editor {
set changed 0
$apply_button configure -state disabled
+ ${::X::actualProject} rightPanel_clear_symbol_list
+
# Adjust NS variables
use_settings
## Apply settings in current editor
- set actualEditor [${X::actualProject} cget -actualEditor]
- set actualEditor2 [${X::actualProject} cget -actualEditor2]
- ${X::actualProject} show_hide_tab_bar
- ${X::actualProject} rightPanel_refresh_font_settings 0
- ${X::actualProject} editor_procedure $actualEditor change_colors {}
- ${X::actualProject} editor_procedure $actualEditor refresh_font_settings {}
- ${X::actualProject} editor_procedure $actualEditor define_line_markers {}
+ set actualEditor [${::X::actualProject} cget -actualEditor]
+ set actualEditor2 [${::X::actualProject} cget -actualEditor2]
+ ${::X::actualProject} show_hide_tab_bar
+ ${::X::actualProject} rightPanel_refresh_font_settings 0
+ ${::X::actualProject} editor_procedure $actualEditor change_colors {}
+ ${::X::actualProject} editor_procedure $actualEditor refresh_font_settings {}
+ ${::X::actualProject} editor_procedure $actualEditor define_line_markers {}
if {$actualEditor2 >= 0} {
- ${X::actualProject} editor_procedure $actualEditor2 change_colors {}
- ${X::actualProject} editor_procedure $actualEditor2 refresh_font_settings {}
- ${X::actualProject} editor_procedure $actualEditor2 define_line_markers {}
+ ${::X::actualProject} editor_procedure $actualEditor2 change_colors {}
+ ${::X::actualProject} editor_procedure $actualEditor2 refresh_font_settings {}
+ ${::X::actualProject} editor_procedure $actualEditor2 define_line_markers {}
}
- set editors [${X::actualProject} cget -editors]
+ set editors [${::X::actualProject} cget -editors]
ASMsyntaxHighlight::create_tags [[lindex $editors $actualEditor] cget -editor] \
- ${Editor::fontSize} ${Editor::fontFamily}
+ ${::Editor::fontSize} ${::Editor::fontFamily}
CsyntaxHighlight::create_tags [[lindex $editors $actualEditor] cget -editor] \
- ${Editor::fontSize} ${Editor::fontFamily}
+ ${::Editor::fontSize} ${::Editor::fontFamily}
LSTsyntaxHighlight::create_tags [[lindex $editors $actualEditor] cget -editor] \
- ${Editor::fontSize} ${Editor::fontFamily}
+ ${::Editor::fontSize} ${::Editor::fontFamily}
if {$actualEditor2 >= 0} {
ASMsyntaxHighlight::create_tags [[lindex $editors $actualEditor2] cget -editor] \
- ${Editor::fontSize} ${Editor::fontFamily}
+ ${::Editor::fontSize} ${::Editor::fontFamily}
CsyntaxHighlight::create_tags [[lindex $editors $actualEditor2] cget -editor] \
- ${Editor::fontSize} ${Editor::fontFamily}
+ ${::Editor::fontSize} ${::Editor::fontFamily}
LSTsyntaxHighlight::create_tags [[lindex $editors $actualEditor2] cget -editor] \
- ${Editor::fontSize} ${Editor::fontFamily}
+ ${::Editor::fontSize} ${::Editor::fontFamily}
}
+ ${::X::actualProject} rightPanel_refresh_symbols
# done ...
return 1
@@ -1933,10 +2080,10 @@ namespace eval editor {
variable editor_to_use ;# Int: Prefred editor
# Section "Syntax highlight"
- foreach item [concat \
- ${::ASMsyntaxHighlight::hightlight_tags} \
- ${::CsyntaxHighlight::hightlight_tags} \
- ${::LSTsyntaxHighlight::hightlight_tags} \
+ foreach item [concat \
+ ${::ASMsyntaxHighlight::highlight_tags} \
+ ${::CsyntaxHighlight::highlight_tags} \
+ ${::LSTsyntaxHighlight::highlight_tags} \
] {
set key [lindex $item 0]
set value [lrange $item 1 end]
@@ -1948,7 +2095,7 @@ namespace eval editor {
normal_text_bg iconBorder_bg lineNumbers_bg lineNumbers_fg
fontSize fontFamily line_markers
} {
- ::settings setValue "Editor colors/$key" [subst "\$::Editor::$key"]
+ ::settings setValue "Editor colors/$key" [subst -nocommands "\$::Editor::$key"]
}
# Section "Editor config"
@@ -1957,8 +2104,9 @@ namespace eval editor {
number_of_spaces auto_brackets
auto_completion autosave
cline_completion hg_trailing_sp
+ tab_width
} {
- ::settings setValue "Editor config/$key" [subst "\$::Editor::$key"]
+ ::settings setValue "Editor config/$key" [subst -nocommands "\$::Editor::$key"]
}
::settings setValue "Editor config/default_encoding" ${::FileList::default_encoding}
::settings setValue "Editor config/default_eol" ${::FileList::default_eol}
@@ -1971,38 +2119,38 @@ namespace eval editor {
## Load configuration from config file
# @return void
proc load_config {} {
- variable avaliable_encodings ;# Encodings supported by editor
+ variable available_encodings ;# Encodings supported by editor
## Section "Syntax highlight"
- # Assembler
- set hightlight_tags {}
- foreach item ${::ASMsyntaxHighlight::hightlight_tags} {
+ # Assembler
+ set highlight_tags {}
+ foreach item ${::ASMsyntaxHighlight::highlight_tags} {
set key [lindex $item 0]
set value [lrange $item 1 end]
set value [::settings getValue "Syntax highlight/$key" $value]
- lappend hightlight_tags "$key $value"
+ lappend highlight_tags [concat $key $value]
}
- set ::ASMsyntaxHighlight::hightlight_tags $hightlight_tags
- # C language
- set hightlight_tags {}
- foreach item ${::CsyntaxHighlight::hightlight_tags} {
+ set ::ASMsyntaxHighlight::highlight_tags $highlight_tags
+ # C language
+ set highlight_tags {}
+ foreach item ${::CsyntaxHighlight::highlight_tags} {
set key [lindex $item 0]
set value [lrange $item 1 end]
set value [::settings getValue "Syntax highlight/$key" $value]
- lappend hightlight_tags "$key $value"
+ lappend highlight_tags [concat $key $value]
}
- set ::CsyntaxHighlight::hightlight_tags $hightlight_tags
- unset hightlight_tags
- # Code listing
- set hightlight_tags {}
- foreach item ${::LSTsyntaxHighlight::hightlight_tags} {
+ set ::CsyntaxHighlight::highlight_tags $highlight_tags
+ unset highlight_tags
+ # Code listing
+ set highlight_tags {}
+ foreach item ${::LSTsyntaxHighlight::highlight_tags} {
set key [lindex $item 0]
set value [lrange $item 1 end]
set value [::settings getValue "Syntax highlight/$key" $value]
- lappend hightlight_tags "$key $value"
+ lappend highlight_tags [concat $key $value]
}
- set ::LSTsyntaxHighlight::hightlight_tags $hightlight_tags
- unset hightlight_tags
+ set ::LSTsyntaxHighlight::highlight_tags $highlight_tags
+ unset highlight_tags
# Section "Editor config"
foreach key {
@@ -2010,9 +2158,9 @@ namespace eval editor {
number_of_spaces auto_brackets
auto_completion autosave
cline_completion editor_to_use
- hg_trailing_sp
+ hg_trailing_sp tab_width
} {
- set value [subst "\$::Editor::$key"]
+ set value [subst -nocommands "\$::Editor::$key"]
set value [::settings getValue "Editor config/$key" $value]
set ::Editor::$key $value
}
@@ -2022,14 +2170,14 @@ namespace eval editor {
${::Editor::editor_to_use} < 0
||
${::Editor::editor_to_use} > 5
- } {
+ } then {
set ::Editor::editor_to_use 0
puts stderr [mc "Invalid key: '%s'" {editor_to_use}]
} elseif {${::Editor::editor_to_use}} {
- if {!${::PROGRAM_AVALIABLE(urxvt)}} {
- puts stderr [mc "Unable to use external embedded editor because rxvt-unicode is not avaliable"]
+ if {!${::PROGRAM_AVAILABLE(urxvt)}} {
+ puts stderr [mc "Unable to use external embedded editor because rxvt-unicode is not available"]
set ::Editor::editor_to_use 0
- } {
+ } else {
switch -- ${::Editor::editor_to_use} {
1 {set program {vim} }
2 {set program {emacs} }
@@ -2037,8 +2185,8 @@ namespace eval editor {
4 {set program {dav} }
5 {set program {le} }
}
- if {!$::PROGRAM_AVALIABLE($program)} {
- puts stderr [mc "Program %s is not avaliable. Using native editor." $program]
+ if {!$::PROGRAM_AVAILABLE($program)} {
+ puts stderr [mc "Program %s is not available. Using native editor." $program]
set ::Editor::editor_to_use 0
}
}
@@ -2058,16 +2206,25 @@ namespace eval editor {
if {![string is digit -strict ${::Editor::autosave}]} {
set Editor::autosave 0
puts stderr [mc "Invalid key: '%s'" {autosave}]
- } {
+ } else {
if {${::Editor::autosave} > 60 || ${::Editor::autosave} < 0} {
- set Editor::number_of_spaces 0
+ set Editor::autosave 0
puts stderr [mc "Invalid key: '%s'" {autosave}]
}
}
+ if {![string is digit -strict ${::Editor::tab_width}]} {
+ set Editor::tab_width 8
+ puts stderr [mc "Invalid key: '%s'" {tab_width}]
+ } else {
+ if {${::Editor::tab_width} > 40 || ${::Editor::tab_width} < 1} {
+ set Editor::tab_width 8
+ puts stderr [mc "Invalid key: '%s'" {tab_width}]
+ }
+ }
if {![string is digit -strict ${::Editor::number_of_spaces}]} {
set FileList::number_of_spaces 8
puts stderr [mc "Invalid key: '%s'" {number_of_spaces}]
- } {
+ } else {
if {${::Editor::number_of_spaces} > 16 || ${::Editor::number_of_spaces} < 1} {
set FileList::number_of_spaces 8
puts stderr [mc "Invalid key: '%s'" {number_of_spaces}]
@@ -2085,25 +2242,24 @@ namespace eval editor {
${::Editor::intentation_mode} != {none}
&&
${::Editor::intentation_mode} != {normal}
- } {
+ } then {
set FileList::intentation_mode {normal}
puts stderr [mc "Invalid key: '%s'" {intentation_mode}]
}
set FileList::default_encoding [::settings getValue \
"Editor config/default_encoding" {utf-8}]
- if {[lsearch $avaliable_encodings ${FileList::default_encoding}] == -1} {
+ if {[lsearch $available_encodings ${FileList::default_encoding}] == -1} {
set FileList::default_encoding {utf-8}
puts stderr [mc "Invalid key: '%s'" {default_encoding}]
}
- set FileList::default_eol [::settings getValue \
- "Editor config/default_eol" {lf}]
+ set FileList::default_eol [::settings getValue "Editor config/default_eol" {lf}]
if {
${FileList::default_eol} != {lf} &&
${FileList::default_eol} != {cr} &&
${FileList::default_eol} != {crlf}
- } {
+ } then {
set FileList::default_eol {lf}
puts stderr [mc "Invalid key: '%s'" {default_eol}]
}
@@ -2113,7 +2269,7 @@ namespace eval editor {
normal_text_bg iconBorder_bg lineNumbers_bg lineNumbers_fg
fontSize fontFamily line_markers
} {
- set value [subst "\$::Editor::$key"]
+ set value [subst -nocommands "\$::Editor::$key"]
set value [::settings getValue "Editor colors/$key" $value]
set valid 1
@@ -2122,7 +2278,7 @@ namespace eval editor {
if {$key == {line_markers}} {
foreach def ${::Editor::line_markers} new $value {
if {![string equal [lindex $def 0] [lindex $new 0]]} {
- puts stderr [mc "Invalid key: '%s'" [lindex $new 0]]
+ puts stderr [mc "-- Invalid key: '%s'" [lindex $new 0]]
set valid 0
break
}
@@ -2146,3 +2302,7 @@ namespace eval editor {
]
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/configdialogues/global_config.tcl b/lib/configdialogues/global_config.tcl
new file mode 100644
index 0000000..66ca346
--- /dev/null
+++ b/lib/configdialogues/global_config.tcl
@@ -0,0 +1,535 @@
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# 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 #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _GLOBAL_CONFIG_TCL ] } {
+set _GLOBAL_CONFIG_TCL _
+# <<< File inclusion guard
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+# Implements global configuration dialog
+# --------------------------------------------------------------------------
+
+
+## Global configuration dialog
+ # see Array OPTION in root NS
+namespace eval global {
+
+ variable dialog_opened 0 ;# Bool: True if this dialog is already opened
+ variable win ;# ID of dialog toplevel window
+
+ variable available_languages ;# List: Available languages (their codes)
+ variable language_names ;# List: Available languages (their names)
+
+ ## Configuration variables
+ variable show_splash ;# Bool: Show splash creen on start-up
+ variable show_tips ;# Bool: Show tips on start-up
+ variable language ;# String: Language code
+ variable language_name ;# String: Language name
+ variable font_size ;# Float: Global font size factor
+ variable font_size_desc ;# String: Global font size factor in its "string" form (I mean description)
+ variable background ;# String: Human readable description of the common background color
+ variable wstyle ;# String: Preffered widget style
+
+ ## Create the dialog
+ # @return void
+ proc mkDialog {} {
+ variable win ;# ID of toplevel dialog window
+ variable dialog_opened ;# Bool: True if this dialog is already opened
+ variable available_languages ;# List: Available languages (their codes)
+ variable language_names ;# List: Available languages (their names)
+
+ # Destroy the dialog if it's already opened
+ if {$dialog_opened} {
+ destroy .global_config_dialog
+ }
+ set dialog_opened 1
+
+ # Determinate available languages
+ get_languages
+
+ # Get settings from main NS
+ getSettings
+
+ # Create toplevel window
+ set win [toplevel .global_config_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
+
+ # Create window header
+ label $win.header_label \
+ -compound left \
+ -image ::ICONS::32::kcmmemory \
+ -text [mc "MCU 8051 IDE configuration"] \
+ -font [font create -size [expr {int(-20 * $::font_size_factor)}]]
+
+ # Create horizontal separator
+ Separator $win.sep -orient horizontal
+
+ ## Create middle frame
+ set middle_frame [frame $win.middle_frame]
+ # Checkbutton "Display splash screen"
+ grid [Label $middle_frame.lbl_splash \
+ -text [mc "Display splash screen"] \
+ -helptext [mc "Show splash screen on start-up"] \
+ ] -row 0 -column 0 -sticky w
+ grid [checkbutton $middle_frame.chb_splash \
+ -variable ::configDialogues::global::show_splash \
+ ] -row 0 -column 1 -sticky w
+ DynamicHelp::add $middle_frame.chb_splash \
+ -text [mc "Show splash screen on start-up"]
+ # Checkbutton "Show tips on start-up"
+ grid [Label $middle_frame.lbl_tips \
+ -text [mc "Show tips on start-up"] \
+ -helptext [mc "Invoke dialog with tip of the day on start-up"] \
+ ] -row 1 -column 0 -sticky w
+ grid [checkbutton $middle_frame.chb_tips \
+ -variable ::configDialogues::global::show_tips \
+ ] -row 1 -column 1 -sticky w
+ DynamicHelp::add $middle_frame.chb_tips \
+ -text [mc "Invoke dialog with tip of the day on start-up"]
+ # Combo "Language"
+ grid [Label $middle_frame.lbl_lang \
+ -text [mc "Language"] \
+ -helptext [mc "Your preferred language"] \
+ ] -row 2 -column 0 -sticky w
+ grid [ttk::combobox $middle_frame.cb_lang \
+ -values $language_names \
+ -state readonly \
+ -textvariable ::configDialogues::global::language_name \
+ ] -row 2 -column 1 -sticky w
+ bind $middle_frame.cb_lang <<ComboboxSelected>> {
+ bind %W <<ComboboxSelected>> {
+ set ::configDialogues::global::language \
+ [lindex ${::configDialogues::global::available_languages} [%W current]]
+ }
+ set ::configDialogues::global::language \
+ [lindex ${::configDialogues::global::available_languages} [%W current]]
+ ::configDialogues::global::language_changed
+ }
+ DynamicHelp::add $middle_frame.cb_lang \
+ -text [mc "Your preferred language"]
+ # SpinBox "Font Size Factor"
+ grid [Label $middle_frame.lbl_fontsize \
+ -text [mc "Global font size factor"] \
+ -helptext [mc "Allows you to adjust size of (almost) all fonts used in this IDE"] \
+ ] -row 3 -column 0 -sticky w
+ grid [ttk::combobox $middle_frame.cb_fontsize \
+ -values [list \
+ [mc "Normal"] [mc "A little larger"] \
+ [mc "Notably larger"] [mc "Much larger"] \
+ [mc "Huge"] [mc "Too BIG"] \
+ ] \
+ -state readonly \
+ -textvariable ::configDialogues::global::font_size_desc \
+ ] -row 3 -column 1 -sticky w
+ bind $middle_frame.cb_fontsize <<ComboboxSelected>> "
+ bind $middle_frame.cb_fontsize <<ComboboxSelected>> {}
+ ::configDialogues::global::fontsize_changed
+ "
+ DynamicHelp::add $middle_frame.cb_fontsize \
+ -text [mc "Allows you to adjust size of (almost) all fonts used in this IDE"]
+
+ # Combo "Widget style"
+ grid [Label $middle_frame.lbl_style \
+ -text [mc "Widget style"] \
+ -helptext [mc "Your preferred widget style"] \
+ ] -row 4 -column 0 -sticky w
+ grid [ttk::combobox $middle_frame.cb_style \
+ -values [ttk::style theme names] \
+ -state readonly \
+ -textvariable ::configDialogues::global::wstyle \
+ ] -row 4 -column 1 -sticky w
+ bind $middle_frame.cb_style <<ComboboxSelected>> "
+ bind $middle_frame.cb_style <<ComboboxSelected>> {}
+ ::configDialogues::global::restart_required
+ "
+ DynamicHelp::add $middle_frame.cb_style \
+ -text [mc "Your preferred widget style"]
+
+ # Combo "Background color"
+ if {!$::MICROSOFT_WINDOWS} {
+ grid [Label $middle_frame.lbl_background \
+ -text [mc "Background color"] \
+ -helptext [mc "Common background color for almost everything in the GUI"] \
+ ] -row 5 -column 0 -sticky w
+ grid [ttk::combobox $middle_frame.cb_background \
+ -values [list \
+ {Default} {Windows} \
+ {Tk} {Light} \
+ {Dark} \
+ ] \
+ -state readonly \
+ -textvariable ::configDialogues::global::background \
+ ] -row 5 -column 1 -sticky w
+ bind $middle_frame.cb_background <<ComboboxSelected>> "
+ bind $middle_frame.cb_background <<ComboboxSelected>> {}
+ ::configDialogues::global::restart_required
+ "
+ DynamicHelp::add $middle_frame.cb_background \
+ -text [mc "Common background color for almost everything in the GUI"]
+ }
+
+ # Separator
+ grid [ttk::separator $middle_frame.sep -orient horizontal] \
+ -columnspan 2 -sticky we -row 10 -column 0 -pady 5
+ # Checkbutton "Do not ask whether ..."
+ grid [text $middle_frame.lbl_ask \
+ -wrap word \
+ -height 4 \
+ -width 0 \
+ -bg ${::COMMON_BG_COLOR} \
+ -bd 0 \
+ ] -row 11 -column 0 -sticky we
+ $middle_frame.lbl_ask insert end [mc "Do not always ask whether to add file to the project after the file is opened"]
+ $middle_frame.lbl_ask configure -state disabled
+ grid [checkbutton $middle_frame.cb_ask \
+ -onvalue 0 -offvalue 1 \
+ -variable ::FileList::ask__append_file_to_project \
+ ] -row 11 -column 1 -sticky w
+ # Checkbutton "Do not show performnace warning ..."
+ grid [text $middle_frame.lbl_dont_per_warn \
+ -wrap word \
+ -height 4 \
+ -width 0 \
+ -bg ${::COMMON_BG_COLOR} \
+ -bd 0 \
+ ] -row 12 -column 0 -sticky we
+ $middle_frame.lbl_dont_per_warn insert end [mc "Do not show performance warning when enabling external HW simulation."]
+ $middle_frame.lbl_dont_per_warn configure -state disabled
+ grid [checkbutton $middle_frame.cb_dont_per_warn\
+ -onvalue 0 -offvalue 1 \
+ -variable ::Graph::show_sim_per_warn \
+ ] -row 12 -column 1 -sticky w
+
+ # Finalize
+ grid columnconfigure $middle_frame 0 -minsize 200
+
+ ## Button frame at the bottom
+ set but_frame [frame $win.button_frame]
+ # Button "Reset"
+ pack [ttk::button $but_frame.but_default \
+ -text [mc "Reset to defaults"] \
+ -command {::configDialogues::global::DEFAULTS} \
+ ] -side left
+ DynamicHelp::add $but_frame.but_default \
+ -text [mc "Reset all settings to defaults"]
+ # Button "Ok"
+ pack [ttk::button $but_frame.but_ok \
+ -text [mc "Ok"] \
+ -compound left \
+ -image ::ICONS::16::ok \
+ -command {::configDialogues::global::OK} \
+ ] -side right -padx 2
+ DynamicHelp::add $but_frame.but_ok \
+ -text [mc "Commit new settings"]
+ # Button "Cancel"
+ pack [ttk::button $but_frame.but_cancel \
+ -text [mc "Cancel"] \
+ -compound left \
+ -image ::ICONS::16::button_cancel \
+ -command {::configDialogues::global::CANCEL} \
+ ] -side right -padx 2
+ DynamicHelp::add $but_frame.but_cancel \
+ -text [mc "Take changes back and close dialog"]
+
+ # Pack frames and notebook
+ pack $win.header_label -side top -pady 6
+ pack $win.sep -side top -fill x -after $win.header_label
+ pack $middle_frame -side top -padx 10 -anchor nw -pady 10
+ pack $but_frame -side bottom -fill x -expand 1 -anchor s -padx 5 -pady 5
+
+ # Set window attributes
+ wm iconphoto $win ::ICONS::16::configure
+ wm transient $win .
+ wm title $win [mc "Configure MCU 8051 IDE"]
+ wm minsize $win 380 380
+ raise $win
+ catch {grab $win}
+ wm protocol $win WM_DELETE_WINDOW {
+ ::configDialogues::global::CANCEL
+ }
+ tkwait window $win
+ }
+
+ ## Application language changed
+ # Takes any set of arguments and discards them
+ # @parm List - meaningless
+ # @return void
+ proc language_changed args {
+ tk_messageBox \
+ -parent .global_config_dialog \
+ -type ok -icon info \
+ -title [mc "Application language changed"] \
+ -message [mc "Language for this application has been changed. The change will take effect upon next start of application"]
+ }
+
+ ## Display message "The change will take effect upon next start of application"
+ # Takes any set of arguments and discards them
+ # @parm List - meaningless
+ # @return void
+ proc restart_required args {
+ tk_messageBox \
+ -parent .global_config_dialog \
+ -type ok -icon info \
+ -title [mc "Restart required"] \
+ -message [mc "The change will take effect upon next start of application"]
+ }
+
+
+ ## Global font size factor changed
+ # Takes any set of arguments and discards them
+ # @parm List - meaningless
+ # @return void
+ proc fontsize_changed args {
+ tk_messageBox \
+ -parent .global_config_dialog \
+ -type ok -icon info \
+ -title [mc "Global font size factor changed"] \
+ -message [mc "The change will take effect upon next start of application"]
+ }
+
+ ## Retrieve list of available translations
+ # @return void
+ proc get_languages {} {
+ variable available_languages ;# List: Available languages (their codes)
+ variable language_names ;# List: Available languages (their names)
+
+ set available_languages {en}
+ set tmp [list]
+ catch { ;# For Microsoft Windows it has to be enclosed in catch block
+ set tmp [glob -nocomplain -types f -tails \
+ -directory "${::INSTALLATION_DIR}/translations" *.msg \
+ ]
+ }
+
+ foreach translation $tmp {
+ lappend available_languages [file rootname $translation]
+ }
+
+ set language_names [list]
+ foreach lang $available_languages {
+ set idx [lsearch -ascii -exact ${::LANGUAGE_CODES} $lang]
+ if {$idx == -1} {
+ lappend language_names $lang
+ } else {
+ incr idx
+ lappend language_names [lindex ${::LANGUAGE_CODES} $idx]
+ }
+ }
+ }
+
+ ## Set configuration variable
+ # @parm String variable - variable to set
+ # @parm Mixed value - new value
+ proc set_variable {variable value} {
+ variable show_splash ;# Bool: Show splash creen on start-up
+ variable show_tips ;# Bool: Show tips on start-up
+ variable language ;# String: Language
+ variable font_size ;# Float: Global font size factor
+ variable background ;# String: Human readable description of the common background color
+ variable wstyle ;# String: Preffered widget style
+
+ getSettings
+
+ switch -- $variable {
+ {splash} {
+ set show_splash $value
+ }
+ {tips} {
+ set show_tips $value
+ }
+ {language} {
+ set language $value
+ }
+ {fontsize} {
+ set font_size $value
+ }
+ {background} {
+ set background $value
+ }
+ {wstyle} {
+ set wstyle $value
+ }
+ default {
+ puts stderr "::configDialogues::global::set_variable(): `$variable' was not recognized"
+ }
+ }
+
+ use_settings
+ save_config
+ }
+
+ ## Retrieve settings from main NS
+ # @return void
+ proc getSettings {} {
+ variable show_splash ;# Bool: Show splash creen on start-up
+ variable show_tips ;# Bool: Show tips on start-up
+ variable language ;# String: Language code
+ variable language_name ;# String: Language name
+ variable available_languages ;# List: Available languages (their codes)
+ variable language_names ;# List: Available languages (their names)
+ variable font_size ;# Float: Global font size factor
+ variable font_size_desc ;# String: Global font size factor in its "string" form (I mean description)
+ variable background ;# String: Human readable description of the common background color
+ variable wstyle ;# String: Preffered widget style
+
+ set show_splash ${::GLOBAL_CONFIG(splash)}
+ set show_tips ${::GLOBAL_CONFIG(tips)}
+ set language ${::GLOBAL_CONFIG(language)}
+ set font_size $::font_size_factor
+ set background ${::GLOBAL_CONFIG(background)}
+ set wstyle ${::GLOBAL_CONFIG(wstyle)}
+
+ switch -- $font_size {
+ 1.0 {set font_size_desc [mc "Normal"] }
+ 1.1 {set font_size_desc [mc "A little larger"] }
+ 1.2 {set font_size_desc [mc "Notably larger"] }
+ 1.3 {set font_size_desc [mc "Much larger"] }
+ 1.4 {set font_size_desc [mc "Huge"] }
+ 1.5 {set font_size_desc [mc "Too BIG"] }
+ default {set font_size_desc [mc "Normal"] }
+ }
+
+ if {[catch {
+ set language_name [lindex $language_names [lsearch -ascii -exact $available_languages $language]]
+ }]} then {
+ set language_name {<unknown>}
+ }
+ }
+
+ ## Set application according to local settings
+ # @return void
+ proc use_settings {} {
+ variable show_splash ;# Bool: Show splash creen on start-up
+ variable show_tips ;# Bool: Show tips on start-up
+ variable language ;# String: Language code
+ variable font_size ;# Float: Global font size factor
+ variable font_size_desc ;# String: Global font size factor in its "string" form (I mean description)
+ variable background ;# String: Human readable description of the common background color
+ variable wstyle ;# String: Preffered widget style
+
+ switch -- $font_size_desc [subst {
+ {[mc "Normal"]} {set font_size 1.0}
+ {[mc "A little larger"]} {set font_size 1.1}
+ {[mc "Notably larger"]} {set font_size 1.2}
+ {[mc "Much larger"]} {set font_size 1.3}
+ {[mc "Huge"]} {set font_size 1.4}
+ {[mc "Too BIG"]} {set font_size 1.5}
+ default {set font_size 1.0}
+
+ }]
+
+ if {${::GLOBAL_CONFIG(language)} != $language} {
+ set lang_changed 1
+ } else {
+ set lang_changed 0
+ }
+
+ set ::GLOBAL_CONFIG(splash) $show_splash
+ set ::GLOBAL_CONFIG(tips) $show_tips
+ set ::GLOBAL_CONFIG(language) $language
+ set ::font_size_factor $font_size
+ set ::GLOBAL_CONFIG(background) $background
+ set ::GLOBAL_CONFIG(wstyle) $wstyle
+
+ if {$lang_changed} {
+ ::X::switch_language
+ }
+ }
+
+ ## Save settings to the config file
+ # @return void
+ proc save_config {} {
+ variable show_splash ;# Bool: Show splash creen on start-up
+ variable show_tips ;# Bool: Show tips on start-up
+ variable language ;# String: Language code
+ variable font_size ;# Float: Global font size factor
+ variable background ;# String: Human readable description of the common background color
+ variable wstyle ;# String: Preffered widget style
+
+ if {[catch {
+ set conf_file [open "${::CONFIG_DIR}/base.conf" w]
+ puts -nonewline $conf_file \
+ [list $show_splash $show_tips $language $font_size $background $wstyle]
+ close $conf_file
+ }]} then {
+ puts stderr [mc "Unable to write to base configuration file"]
+ }
+ }
+
+ ## Destroy the dialog
+ # @return void
+ proc CANCEL {} {
+ variable win ;# ID of toplevel dialog window
+ variable dialog_opened ;# Bool: True if this dialog is already opened
+
+ # Destroy dialog window
+ set dialog_opened 0
+ grab release $win
+ destroy $win
+ }
+
+ ## Use settings and destroy the dialog
+ # @return void
+ proc OK {} {
+ variable win ;# ID of toplevel dialog window
+
+ # Use and save settings
+ use_settings
+ save_config
+
+ # Destroy dialog window
+ CANCEL
+ }
+
+ ## Restrore defaults
+ # @return void
+ proc DEFAULTS {} {
+ variable show_splash ;# Bool: Show splash creen on start-up
+ variable show_tips ;# Bool: Show tips on start-up
+ variable language ;# String: Language code
+ variable language_name ;# String: Language name
+ variable available_languages ;# List: Available languages (their codes)
+ variable language_names ;# List: Available languages (their names)
+ variable font_size_desc ;# String: Global font size factor in its "string" form (I mean description)
+ variable background ;# String: Human readable description of the common background color
+ variable wstyle ;# String: Preffered widget style
+
+ set show_splash 1
+ set show_tips 1
+ set language {en}
+ set font_size_desc {Normal}
+ set background {Default}
+ set wstyle {clam}
+
+ if {[catch {
+ set language_name [lindex $language_names [lsearch -ascii -exact $available_languages $language]]
+ }]} then {
+ set language_name {<unknown>}
+ }
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/configdialogs/rightpanel_config.tcl b/lib/configdialogues/rightpanel_config.tcl
index 4161b4f..0cace4e 100755..100644
--- a/lib/configdialogs/rightpanel_config.tcl
+++ b/lib/configdialogues/rightpanel_config.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 _RIGHTPANEL_CONFIG_TCL ] } {
+set _RIGHTPANEL_CONFIG_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements right panel configuration dialog
@@ -39,9 +44,9 @@ namespace eval rightPanel {
variable watch_text_tags ;# Highlighting tags for register watches
## Create the dialog
- # @parm Int = 0 - number of tab to raise
+ # @parm Int tab_number=0 - number of tab to raise
# @return void
- proc mkDialog args {
+ proc mkDialog {{tab_number 0}} {
variable win ;# ID of toplevel dialog window
variable dialog_opened ;# Bool: True if this dialog is already opened
@@ -51,7 +56,7 @@ namespace eval rightPanel {
variable instruction_tags ;# Highlighting tags for instruction details
variable watch_text_tags ;# Highlighting tags for register watches
- # Destroy the dialog if it's alredy opened
+ # Destroy the dialog if it's already opened
if {$dialog_opened} {
destroy .rightPanel_config_dialog
}
@@ -63,22 +68,20 @@ namespace eval rightPanel {
getSettings
# Create toplevel window
- set win [toplevel .rightPanel_config_dialog -class {Configuration dialog} -bg {#EEEEEE}]
+ set win [toplevel .rightPanel_config_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
# Create window header
label $win.header_label \
-compound left \
-text [mc "Right panel configuration"] \
- -font [font create -size -20]
+ -font [font create -size [expr {int(-20 * $::font_size_factor)}]]
## Create notebook
- set nb [ttk::notebook $win.nb]
+ set nb [ModernNoteBook $win.nb]
# Tab "Register watches"
- set watches_tab [frame $nb.watches_tab]
- $nb add $watches_tab -text [mc "Register watches"]
+ set watches_tab [$nb insert end watches_tab -text [mc "Register watches"]]
# Tab "Instruction details"
- set instruction_tab [frame $nb.instruction_tab]
- $nb add $instruction_tab -text [mc "Instruction details"]
+ set instruction_tab [$nb insert end instruction_tab -text [mc "Instruction details"]]
#
## Tab "Register watches"
@@ -109,7 +112,7 @@ namespace eval rightPanel {
# Checkbutton "Bold"
set checkbutton [checkbutton $watches_tab.chbut_${tag_name} \
-pady 0 -highlightthickness 0 \
- -command "::configDialogs::rightPanel::change_style $idx 1" \
+ -command "::configDialogues::rightPanel::change_style $idx 1" \
]
if {$boldItalic == {1}} {
$checkbutton select
@@ -120,7 +123,7 @@ namespace eval rightPanel {
grid [button $watches_tab.but_${tag_name} \
-bd 1 -relief raised -pady 0 -highlightthickness 0 \
-bg $color -width 10 -activebackground $color \
- -command "::configDialogs::rightPanel::select_color $idx $watches_tab.but_${tag_name} 1"
+ -command "::configDialogues::rightPanel::select_color $idx $watches_tab.but_${tag_name} 1"
] -column 2 -row $row -sticky ns -padx 10
incr row ;# Row in the grid
@@ -128,7 +131,7 @@ namespace eval rightPanel {
}
# Adjust the grid
- grid columnconfigure $watches_tab 0 -minsize 200
+ grid columnconfigure $watches_tab 0 -minsize 150
#
@@ -165,7 +168,7 @@ namespace eval rightPanel {
# Checkbutton "Bold"
set checkbutton [checkbutton $instruction_tab.chbut_${tag_name} \
-pady 0 -highlightthickness 0 \
- -command "::configDialogs::rightPanel::change_style $idx 0" \
+ -command "::configDialogues::rightPanel::change_style $idx 0" \
]
if {$boldItalic} {
$checkbutton select
@@ -176,7 +179,7 @@ namespace eval rightPanel {
grid [button $instruction_tab.but_${tag_name} \
-bd 1 -relief raised -pady 0 -highlightthickness 0 \
-bg $color -width 10 -activebackground $color \
- -command "::configDialogs::rightPanel::select_color $idx $instruction_tab.but_${tag_name} 0"
+ -command "::configDialogues::rightPanel::select_color $idx $instruction_tab.but_${tag_name} 0"
] -column 3 -row $row -sticky ns -padx 10
@@ -185,13 +188,13 @@ namespace eval rightPanel {
}
# Adjust the grid
- grid columnconfigure $instruction_tab 1 -minsize 200
+ grid columnconfigure $instruction_tab 1 -minsize 150
# Raise appropriate tab
- if {$args == {}} {
- $nb select $watches_tab
- } {
- $nb select [lindex [$nb tabs] $args]
+ if {$tab_number == {}} {
+ $nb raise watches_tab
+ } else {
+ $nb raise [lindex [$nb pages] $tab_number]
}
# Create button frame at the bottom
@@ -202,7 +205,7 @@ namespace eval rightPanel {
-text [mc "Apply"] \
-compound left \
-image ::ICONS::16::ok \
- -command {::configDialogs::rightPanel::APPLY} \
+ -command {::configDialogues::rightPanel::APPLY} \
]
pack $apply_button -side left
# Button "Ok"
@@ -210,31 +213,31 @@ namespace eval rightPanel {
-text [mc "Ok"] \
-compound left \
-image ::ICONS::16::ok \
- -command {::configDialogs::rightPanel::OK} \
- ] -side right
+ -command {::configDialogues::rightPanel::OK} \
+ ] -side right -padx 2
# Button "Cancel"
pack [ttk::button $but_frame.but_cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
- -command {::configDialogs::rightPanel::CANCEL} \
- ] -side right
+ -command {::configDialogues::rightPanel::CANCEL} \
+ ] -side right -padx 2
# Pack frames and notebook
pack $but_frame -side bottom -fill x -expand 0 -anchor s -padx 10 -pady 5
pack $win.header_label -side top -pady 6
- pack $nb -side top -fill both -expand 1 -padx 10
+ pack [$nb get_nb] -side top -fill both -expand 1 -padx 10
# Finalize creation of the dialog
wm iconphoto $win ::ICONS::16::configure
wm transient $win .
wm title $win [mc "Configure right panel - %s" ${::APPNAME}]
- wm geometry $win =390x380
+ wm geometry $win =340x380
wm resizable $win 0 0
raise $win
catch {grab $win}
wm protocol $win WM_DELETE_WINDOW {
- ::configDialogs::rightPanel::CANCEL
+ ::configDialogues::rightPanel::CANCEL
}
tkwait window $win
}
@@ -254,12 +257,12 @@ namespace eval rightPanel {
{tag_A} {return "A"}
{tag_AB} {return "AB"}
{tag_SFR} {return "C, R0..R7"}
- {tag_indr} {return "@R0, @R0 etc."}
- {tag_Baddr} {return "Bit"}
+ {tag_indr} {return "@R0, @R0[mc { etc.}]"}
+ {tag_Baddr} {return [mc "Bit"]}
{tag_Xaddr} {return "XDATA"}
{tag_Eaddr} {return "EDATA"}
{tag_addr} {return "IDATA"}
- {tag_name} {return "Name"}
+ {tag_name} {return [mc "Name"]}
default {return {}}
}
}
@@ -273,13 +276,13 @@ namespace eval rightPanel {
variable watch_text_tags ;# Highlighting tags for register watches
if {$for} {
- if {[lindex $watch_text_tags "$row 2"] != 1} {
- lset watch_text_tags "$row 2" 1
- } {
- lset watch_text_tags "$row 2" {}
+ if {[lindex $watch_text_tags [list $row 2]] != 1} {
+ lset watch_text_tags [list $row 2] 1
+ } else {
+ lset watch_text_tags [list $row 2] {}
}
- } {
- lset instruction_tags "$row 2" [expr {!([lindex $instruction_tags "$row 2"])}]
+ } else {
+ lset instruction_tags [list $row 2] [expr {!([lindex $instruction_tags [list $row 2]])}]
}
# Adjust status changed
@@ -303,9 +306,9 @@ namespace eval rightPanel {
# Invoke new color selection dialog
if {$for} {
- set color [lindex $watch_text_tags "$row 1"]
- } {
- set color [lindex $instruction_tags "$row 1"]
+ set color [lindex $watch_text_tags [list $row 1]]
+ } else {
+ set color [lindex $instruction_tags [list $row 1]]
}
set color [SelectColor .select_color \
-parent $win \
@@ -316,9 +319,9 @@ namespace eval rightPanel {
# Change button background color
if {$color != {}} {
if {$for} {
- lset watch_text_tags "$row 1" $color
- } {
- lset instruction_tags "$row 1" $color
+ lset watch_text_tags [list $row 1] $color
+ } else {
+ lset instruction_tags [list $row 1] $color
}
$button configure -bg $color -activebackground $color
@@ -402,14 +405,14 @@ namespace eval rightPanel {
set key [lindex $item 0]
set value [lrange $item 1 end]
set value [::settings getValue "Instruction details/$key" $value]
- lappend instruction_tags "$key $value"
+ lappend instruction_tags [concat $key $value]
}
foreach item ${::RegWatches::watch_text_tags} {
# Load config
set key [lindex $item 0]
set value [lrange $item 1 end]
set value [::settings getValue "Register watches/$key" $value]
- lappend watch_text_tags "$key $value"
+ lappend watch_text_tags [concat $key $value]
}
set ::InstructionDetails::instruction_tags $instruction_tags
set ::RegWatches::watch_text_tags $watch_text_tags
@@ -478,7 +481,7 @@ namespace eval rightPanel {
variable changed ;# Bool: Settings changed
# Check if there is at least 1 opened editor
- if {[llength ${X::openedProjects}] == 0} {
+ if {[llength ${::X::openedProjects}] == 0} {
return 0
}
@@ -489,10 +492,14 @@ namespace eval rightPanel {
# Adjust NS variables
use_settings
# Adjust GUI in current project
- ${X::actualProject} rightPanel_refresh_instruction_highlighting
- ${X::actualProject} rightPanel_refresh_regwatches_highlighting
+ ${::X::actualProject} rightPanel_refresh_instruction_highlighting
+ ${::X::actualProject} rightPanel_refresh_regwatches_highlighting
# done ...
return 1
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/configdialogs/shortcuts_config.tcl b/lib/configdialogues/shortcuts_config.tcl
index e0be8fe..612dc6a 100755..100644
--- a/lib/configdialogs/shortcuts_config.tcl
+++ b/lib/configdialogues/shortcuts_config.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 _SHORTCUTS_CONFIG_TCL ] } {
+set _SHORTCUTS_CONFIG_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements shortcuts configuration dialog
@@ -39,22 +44,22 @@ namespace eval shortcuts {
# Empty image
variable empty_image [image create bitmap]
# Font for entry "Current shortcut"
- variable current_entry_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -weight bold \
- -size -12 \
+ variable current_entry_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -weight [expr {$::MICROSOFT_WINDOWS ? "normal" : "bold"}] \
+ -size [expr {int(-12 * $::font_size_factor)}] \
]
# Normal font for tree widget nodes
- variable node_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -weight normal \
- -size -12 \
+ variable node_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -weight normal \
+ -size [expr {int(-12 * $::font_size_factor)}] \
]
# Bold font for tree widget nodes
- variable node_font_b [font create \
- -family {helvetica} \
- -weight bold \
- -size -14 \
+ variable node_font_b [font create \
+ -family {helvetica} \
+ -weight bold \
+ -size [expr {int(-14 * $::font_size_factor)}] \
]
variable status_label ;# ID of status label
@@ -112,25 +117,25 @@ namespace eval shortcuts {
# Get settings from the program
getSettings
- # Create list of hardcoded shortcuts related to main window
+ # Create list of hard-coded shortcuts related to main window
set root_hard_cd {}
foreach key ${::HARDCODED_SHORTCUTS} {
lappend root_hard_cd [simplify_key_seq $key]
}
# Create toplevel window
- set win [toplevel .shortcuts_config_dialog -class {Configuration dialog} -bg {#EEEEEE}]
+ set win [toplevel .shortcuts_config_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
# Create window header
label $win.header_label \
-compound left \
-image ::ICONS::32::configure \
-text [mc "Configure key shortcuts"] \
- -font [font create -size -20]
+ -font [font create -size [expr {int(-20 * $::font_size_factor)}]]
# Create header labels for label frames
set top_lf_label [label $win.top_lf_label \
- -text [mc "Avaliable items"] \
+ -text [mc "available items"] \
-image ::ICONS::16::view_choose \
-compound left \
]
@@ -156,7 +161,7 @@ namespace eval shortcuts {
] -side left
set search_entry [ttk::entry $search_frame.entry \
-validate all \
- -validatecommand {::configDialogs::shortcuts::search %P} \
+ -validatecommand {::configDialogues::shortcuts::search %P} \
]
DynamicHelp::add $search_frame.entry \
-text [mc "Enter your search string here"]
@@ -176,7 +181,7 @@ namespace eval shortcuts {
set tree_frame [frame $top_labelframe.tree_frame]
pack $tree_frame -fill both -expand 1
- # Create tree widget showing avaliable items
+ # Create tree widget showing available items
set treeWidget [Tree $tree_frame.tree \
-selectfill 1 \
-showlines 1 \
@@ -191,7 +196,7 @@ namespace eval shortcuts {
-yscrollcommand "$tree_frame.scrollbar set" \
-crossopenimage ::ICONS::16::1downarrow \
-crosscloseimage ::ICONS::16::1rightarrow \
- -selectcommand {::configDialogs::shortcuts::item_selected} \
+ -selectcommand {::configDialogues::shortcuts::item_selected} \
]
pack $treeWidget -fill both -expand 1 -side left
bind $treeWidget <Button-5> {%W yview scroll +5 units; break}
@@ -246,7 +251,7 @@ namespace eval shortcuts {
# Determinate image ID
if {$image != {}} {
set image "::ICONS::16::$image"
- } {
+ } else {
set image $empty_image
}
@@ -273,22 +278,22 @@ namespace eval shortcuts {
-text [mc "Current shortcut:"] \
] -row 0 -column 0 -sticky w
set current_entry [ttk::entry $bottom_labelframe.current_entry \
- -validatecommand {::configDialogs::shortcuts::cur_entry_val %P} \
+ -validatecommand {::configDialogues::shortcuts::cur_entry_val %P} \
]
grid $current_entry -row 0 -column 1
bind $current_entry <KeyPress> \
- {::configDialogs::shortcuts::current_entry_key %K; break}
+ {::configDialogues::shortcuts::current_entry_key %K; break}
bind $current_entry <Control-KeyPress> \
- {::configDialogs::shortcuts::current_entry_key Ctrl+%K; break}
+ {::configDialogues::shortcuts::current_entry_key Ctrl+%K; break}
bind $current_entry <Alt-KeyPress> \
- {::configDialogs::shortcuts::current_entry_key Alt+%K; break}
+ {::configDialogues::shortcuts::current_entry_key Alt+%K; break}
bind $current_entry <Control-Alt-KeyPress> \
- {::configDialogs::shortcuts::current_entry_key Ctrl+Alt+%K; break}
+ {::configDialogues::shortcuts::current_entry_key Ctrl+Alt+%K; break}
set clear_button [ttk::button $bottom_labelframe.clear_button \
-image ::ICONS::16::clear_left \
-state disabled \
-style Flat.TButton \
- -command {::configDialogs::shortcuts::clear_current} \
+ -command {::configDialogues::shortcuts::clear_current} \
]
DynamicHelp::add $bottom_labelframe.clear_button -text [mc "Clear"]
grid $clear_button -row 0 -column 2 -sticky w
@@ -304,7 +309,7 @@ namespace eval shortcuts {
set default_button [ttk::button $bottom_labelframe.default_button \
-image ::ICONS::16::up0 \
-state disabled \
- -command {::configDialogs::shortcuts::to_default} \
+ -command {::configDialogues::shortcuts::to_default} \
-style Flat.TButton \
]
DynamicHelp::add $bottom_labelframe.default_button -text [mc "Restore default"]
@@ -312,7 +317,7 @@ namespace eval shortcuts {
# Button "Accept"
set accept_button [ttk::button $bottom_labelframe.accept_button \
- -command {::configDialogs::shortcuts::accept_current} \
+ -command {::configDialogues::shortcuts::accept_current} \
-text [mc "Accept"] \
-compound left \
-image ::ICONS::16::ok \
@@ -322,7 +327,7 @@ namespace eval shortcuts {
grid $accept_button -row 0 -column 4 -rowspan 2
# Button "Original"
set discard_button [ttk::button $bottom_labelframe.discard_button \
- -command {::configDialogs::shortcuts::discard_current} \
+ -command {::configDialogues::shortcuts::discard_current} \
-text [mc "Original"] \
-compound left \
-image ::ICONS::16::button_cancel \
@@ -346,7 +351,7 @@ namespace eval shortcuts {
# Button "Reset"
pack [ttk::button $but_frame.but_default \
-text [mc "Defaults"] \
- -command {::configDialogs::shortcuts::DEFAULTS} \
+ -command {::configDialogues::shortcuts::DEFAULTS} \
] -side left
DynamicHelp::add $but_frame.but_default -text [mc "Reset all settings to defaults"]
# Button "Ok"
@@ -354,16 +359,16 @@ namespace eval shortcuts {
-text [mc "Ok"] \
-compound left \
-image ::ICONS::16::ok \
- -command {::configDialogs::shortcuts::OK} \
- ] -side right
+ -command {::configDialogues::shortcuts::OK} \
+ ] -side right -padx 2
DynamicHelp::add $but_frame.but_ok -text [mc "Commit new settings"]
# Button "Cancel"
pack [ttk::button $but_frame.but_cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
- -command {::configDialogs::shortcuts::CANCEL} \
- ] -side right
+ -command {::configDialogues::shortcuts::CANCEL} \
+ ] -side right -padx 2
DynamicHelp::add $but_frame.but_cancel -text [mc "Take changes back and close dialog"]
# Pack frames
@@ -380,7 +385,7 @@ namespace eval shortcuts {
raise $win
catch {grab $win}
wm protocol $win WM_DELETE_WINDOW {
- ::configDialogs::shortcuts::CANCEL
+ ::configDialogues::shortcuts::CANCEL
}
tkwait window $win
}
@@ -415,6 +420,7 @@ namespace eval shortcuts {
# Clear and disable componets of the bottom frame
$current_entry delete 0 end
+ cur_entry_val {}
$default_entry configure -text {}
$status_label configure -text {}
$current_entry configure -state disabled
@@ -466,6 +472,7 @@ namespace eval shortcuts {
$current_entry configure -state normal
$current_entry delete 0 end
$current_entry insert end [simplify_key_seq [lindex $data 2]]
+ cur_entry_val [simplify_key_seq [lindex $data 2]]
$default_entry configure -text [simplify_key_seq [lindex $data 1]]
$default_button configure -state normal
ena_dis__accept_discard 0
@@ -488,6 +495,7 @@ namespace eval shortcuts {
# Clear entry "Custom shortcut"
$current_entry delete 0 end
+ cur_entry_val {}
# Adjust key combination
set lastchar [string index $key_seq end]
@@ -495,7 +503,7 @@ namespace eval shortcuts {
if {[string is lower -strict $lastchar]} {
set key_seq [string replace $key_seq \
end end [string toupper $lastchar]]
- } {
+ } else {
set key_seq [string replace $key_seq end end \
"Shift+[string toupper $lastchar]"]
}
@@ -507,35 +515,39 @@ namespace eval shortcuts {
$status_label configure -text [mc "Modifier required (Control or Alt)"]
} elseif {[lsearch $root_hard_cd $key_seq] != -1} {
$status_label configure -text \
- [mc "This combination is hardcoded in the main window, so it cannot be used"]
+ [mc "This combination is hard-coded in the main window, so it cannot be used"]
} elseif {[lsearch [$treeWidget itemcget [$treeWidget parent $currentNode] -data] $key_seq] != -1} {
$status_label configure -text \
- [mc "This combination is hardcoded, so it cannot be used"]
+ [mc "This combination is hard-coded, so it cannot be used"]
} else {
set changed 1
}
if {!$changed} {
$current_entry insert end $key_seq
+ cur_entry_val $key_seq
ena_dis__accept_discard 0
return
}
# Change content of entry "Custom shortcut"
$current_entry insert end $key_seq
+ cur_entry_val $key_seq
# Check if the given combination is not already assigned to something
set name [lindex [key_seq_to_name \
[extend_key_seq $key_seq] \
[$treeWidget parent $currentNode]] 1]
- if {$name != {}} {
+ if {$name != {} && $name != [string trim [lindex [$treeWidget itemcget $currentNode -data] 0]]} {
$status_label configure -text \
[mc "The '%s' key combination has already been assigned to \"%s\"." $key_seq $name]
- } {
+ } else {
$status_label configure -text {}
}
- # Enable buttons "Accept" and "Original"
- ena_dis__accept_discard 1
+ # Enable buttons "Accept" and "Original" (but only if user is not trying to redefine a shortcut with the same key combination)
+ if {$name != [string trim [lindex [$treeWidget itemcget $currentNode -data] 0]]} {
+ ena_dis__accept_discard 1
+ }
}
## Clear entry "Custom shortcut"
@@ -552,6 +564,7 @@ namespace eval shortcuts {
}
# Clear the entry widget and status label
$current_entry delete 0 end
+ cur_entry_val {}
$status_label configure -text {}
# Enable buttons "Accept" and "Original"
ena_dis__accept_discard 1
@@ -568,7 +581,7 @@ namespace eval shortcuts {
# Enable/Disable button "Clear"
if {$content == {}} {
$clear_button configure -state disabled
- } {
+ } else {
$clear_button configure -state normal
}
@@ -595,6 +608,7 @@ namespace eval shortcuts {
set key [$default_entry cget -text]
$current_entry delete 0 end
$current_entry insert 0 $key
+ cur_entry_val $key
# Check if the new setting is unique
set name [lindex [key_seq_to_name \
@@ -648,7 +662,7 @@ namespace eval shortcuts {
-text $txt \
-data [list $txt $dt {}]
# Keep
- } {
+ } else {
$status_label configure -text {}
}
@@ -674,10 +688,11 @@ namespace eval shortcuts {
variable currentNode ;# ID of the currently selected tree node
variable anything_modified ;# Bool: Settings changed (stay set to 1 even after APPLY)
- # Restore prevoius content of entry "Current shortcut"
+ # Restore previous content of entry "Current shortcut"
$current_entry delete 0 end
$current_entry insert end [simplify_key_seq \
[lindex [$treeWidget itemcget $currentNode -data] 2]]
+ cur_entry_val [$current_entry get]
# Clear status label
$status_label configure -text {}
@@ -695,13 +710,14 @@ namespace eval shortcuts {
variable win ;# ID of toplevel dialog window
set changed 0
- if {![tk_messageBox \
+ if {[tk_messageBox \
-type yesno \
-parent $win \
-icon question \
-title [mc "Item changed"] \
- -message [mc "The prevoius item was modified. Do you want to save it ?"] \
- ]} {
+ -message [mc "The previous item was modified. Do you want to save it ?"] \
+ ] != {yes}
+ } then {
return
}
@@ -765,7 +781,7 @@ namespace eval shortcuts {
if {$ena_dis} {
$discard_button configure -state normal
$accept_button configure -state normal
- } {
+ } else {
$discard_button configure -state disabled
$accept_button configure -state disabled
}
@@ -858,7 +874,7 @@ namespace eval shortcuts {
# Adjust right panel
$project rightPanel_makePopupMenu
$project rightPanel_watch_shortcuts_reevaluate
- # Adjust todo list
+ # Adjust to do list
$project TodoProc_makePopupMenu
$project TodoProc_shortcuts_reevaluate
# Adjust messages text
@@ -957,14 +973,14 @@ namespace eval shortcuts {
variable anything_modified ;# Bool: Settings changed (stay set to 1 even after APPLY)
# Ask user
- if {![tk_messageBox \
+ if {[tk_messageBox \
-parent $win \
-type yesno \
-title [mc "Confirmation required"] \
-icon question \
-message [mc "This will discard all shortcut settings and replace them with defaults. Are you sure by that ?"]\
- ]
- } {
+ ] != {yes}
+ } then {
return
}
@@ -1013,3 +1029,7 @@ namespace eval shortcuts {
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/configdialogs/simulator_config.tcl b/lib/configdialogues/simulator_config.tcl
index 38e9e49..bbfd2b0 100755..100644
--- a/lib/configdialogs/simulator_config.tcl
+++ b/lib/configdialogues/simulator_config.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 _SIMULATOR_CONFIG_TCL ] } {
+set _SIMULATOR_CONFIG_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements simulator configuration dialog
@@ -30,6 +35,8 @@ namespace eval simulator {
variable win ;# ID of toplevel dialog window
variable dialog_opened 0 ;# Bool: True if this dialog is already opened
+ variable on_color_button ;# Widget: Button "ON color" in section "Colors"
+ variable off_color_button ;# Widget: Button "OFF color" in section "Colors"
# List of default settings
variable defaults {
@@ -50,6 +57,9 @@ namespace eval simulator {
{ignore_invalid_UMC 0}
{ignore_invalid_TMC 0}
{undefined_value 2}
+ {ignore_invalid_brkpoints 0}
+ {on_color #00CC00}
+ {off_color #DD0000}
}
# Option variables
@@ -70,15 +80,19 @@ namespace eval simulator {
variable ignore_invalid_UMC ;# Bool: Ignore invalid UART mode change
variable ignore_invalid_TMC ;# Bool: Ignore invalid Timer/Counter mode change
variable undefined_value ;# Int: How to handle undefined values (0 == 0; 1 == 255; 2 == random)
-
+ variable ignore_invalid_brkpoints ;# Bool: Do not warn user about invalid (unreachable) breakpoints
+ variable on_color ;# RGB: Color to display a bit name for a bit set to log. 1
+ variable off_color ;# RGB: Color to display a bit name for a bit set to log. 0
## Create the dialog
# @return void
proc mkDialog {} {
- variable win ;# ID of toplevel dialog window
- variable dialog_opened ;# Bool: True if this dialog is already opened
+ variable win ;# ID of toplevel dialog window
+ variable dialog_opened ;# Bool: True if this dialog is already opened
+ variable on_color_button ;# Widget: Button "ON color" in section "Colors"
+ variable off_color_button ;# Widget: Button "OFF color" in section "Colors"
- # Destroy the dialog if it's alredy opened
+ # Destroy the dialog if it's already opened
if {$dialog_opened} {
destroy .simulator_config_dialog
}
@@ -88,7 +102,7 @@ namespace eval simulator {
getSettings
# Create toplevel window
- set win [toplevel .simulator_config_dialog -class {Configuration dialog} -bg {#EEEEEE}]
+ set win [toplevel .simulator_config_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
# Create window header
label $win.header_label \
@@ -99,16 +113,15 @@ namespace eval simulator {
-size -20]
## Create notebook
- set nb [ttk::notebook $win.nb]
- # Tab "Warning dialogs"
- set warnings_tab [frame $nb.warnings_tab]
- $nb add $warnings_tab -text [mc "Warning dialogs"]
+ set nb [ModernNoteBook $win.nb]
+ # Tab "Warning dialogues"
+ set warnings_tab [$nb insert end warnings_tab -text [mc "Warning dialogues"]]
+
# Tab "Other"
- set other_tab [frame $nb.other_tab]
- $nb add $other_tab -text [mc "Other"]
+ set other_tab [$nb insert end other_tab -text [mc "Other"]]
#
- ## Tab "Warning dialogs"
+ ## Tab "Warning dialogues"
#
set row 0
foreach text {
@@ -132,13 +145,15 @@ namespace eval simulator {
{Ignore UART frame discard}
{Ignore illegal UART mode change}
{Ignore illegal Timer/Counter mode change}
+ {-}
+ {Do not complain about invalid breakpoints}
} helptext {
{Check this to disable warning on stack overflow}
{Check this to disable warning on stack underflow}
{-}
{Check this to disable warning on\ninvalid instruction}
- {Do not stop simulation on device reset\ninvoked by watchog timer overflow}
- {Do not show warning dialog when program tring to return from interrupt which has not been invoked}
+ {Do not stop simulation on device reset\ninvoked by watchdog timer overflow}
+ {Do not show warning dialog when program trying to return from interrupt which has not been invoked}
{Do not display warning dialog when\nreading from write-only register}
{-}
{Do not display dialog "Undefined result" when simulated program\naccessing unimplemented Internal Data Memory (IDATA) or SFR area}
@@ -153,6 +168,8 @@ namespace eval simulator {
{Check this to disable warning on UART frame discard}
{Check this to disable warning on illegal UART mode change}
{Check this to disable warning on illegal Timer/Counter mode change}
+ {-}
+ {Disable warning: "warning: Invalid breakpoint"}
} variable {
ignore_stack_overflow ignore_stack_underflow
-
@@ -167,6 +184,8 @@ namespace eval simulator {
-
ignore_invalid_USB ignore_invalid_UMC
ignore_invalid_TMC
+ -
+ ignore_invalid_brkpoints
} {
incr row
@@ -180,10 +199,11 @@ namespace eval simulator {
# Create
grid [Label $warnings_tab.label__$row \
- -text $text -helptext [subst $helptext] \
+ -text [mc $text] \
+ -helptext [subst [mc $helptext]] \
] -row $row -column 0 -sticky w -padx 5
grid [checkbutton $warnings_tab.chbutton_$row \
- -variable ::configDialogs::simulator::$variable \
+ -variable ::configDialogues::simulator::$variable \
] -row $row -column 1 -sticky e -padx 5
DynamicHelp::add $warnings_tab.chbutton_$row \
-text [subst $helptext]
@@ -201,17 +221,17 @@ namespace eval simulator {
]
pack [radiobutton $undefined_labelframe.random \
-value 2 -text [mc "Return random value"] \
- -variable ::configDialogs::simulator::undefined_value \
+ -variable ::configDialogues::simulator::undefined_value \
] -anchor w
pack [radiobutton $undefined_labelframe.zero \
-value 0 -text [mc "Return zero value"] \
- -variable ::configDialogs::simulator::undefined_value \
+ -variable ::configDialogues::simulator::undefined_value \
] -anchor w
pack [radiobutton $undefined_labelframe.one \
-value 1 -text [mc "Return highest possible value"] \
- -variable ::configDialogs::simulator::undefined_value \
+ -variable ::configDialogues::simulator::undefined_value \
] -anchor w
- pack $undefined_labelframe -fill x -padx 5 -pady 10
+ pack $undefined_labelframe -fill x -padx 5 -pady 5
# LabelFrame: "Reverse run"
set reverse_run_labelframe [ttk::labelframe $other_tab.reverse_run_labelframe \
@@ -221,61 +241,135 @@ namespace eval simulator {
-text [mc "Stack capacity"] \
-helptext [mc "Number of steps which can be taken back"] \
] -row 4 -column 0 -sticky w -padx 5
- grid [spinbox $reverse_run_labelframe.rrun_spinbox \
- -from 0 -to 1000 -bg white -validate all -width 4 \
- -vcmd "::configDialogs::simulator::rrun_spinbox_val %P" \
- -textvariable ::configDialogs::simulator::reverse_run_steps \
+ grid [ttk::spinbox $reverse_run_labelframe.rrun_spinbox \
+ -from 0 -to 1000 -validate all -width 4 \
+ -validatecommand "::configDialogues::simulator::rrun_spinbox_val %P" \
+ -textvariable ::configDialogues::simulator::reverse_run_steps \
] -row 4 -column 1 -sticky we -padx 5
DynamicHelp::add $reverse_run_labelframe.rrun_spinbox \
-text [mc "Number of steps which can be taken back"]
grid columnconfigure $reverse_run_labelframe 0 -minsize 250
grid columnconfigure $reverse_run_labelframe 1 -weight 1
- pack $reverse_run_labelframe -fill x -padx 5 -pady 10
+ pack $reverse_run_labelframe -fill x -padx 5 -pady 5
+
+ # LabelFrame: "Colors"
+ set colors_labelframe [ttk::labelframe $other_tab.colors_labelframe \
+ -text [mc "Colors"] -padding 7 \
+ ]
+ set row -1
+ foreach text {
+ {ON color}
+ {OFF color}
+ } helptext {
+ {Color to display a bit name for a bit set to log. 1}
+ {Color to display a bit name for a bit set to log. 0}
+ } variable {
+ on_color
+ off_color
+ } buttonvar {
+ on_color_button
+ off_color_button
+ } {
+ incr row
+
+ set text [mc $text]
+ set helptext [mc $helptext]
+ set variable "::configDialogues::simulator::$variable"
+
+ # Get color from the given variable
+ set color [subst -nocommands "\${$variable}"]
+
+ # Create label
+ grid [Label $colors_labelframe.lbl$row \
+ -text $text \
+ -helptext $helptext \
+ ] -row $row -column 0 -sticky w -padx 5
+
+ # Create button
+ set button [button $colors_labelframe.button$row \
+ -bd 1 -relief raised -pady 0 -highlightthickness 0 \
+ -bg $color -width 10 -activebackground $color \
+ -command "::configDialogues::simulator::select_color $variable $colors_labelframe.button$row"
+ ]
+ grid $button -row $row -column 1 -sticky we -padx 5
+ set $buttonvar $button
+ DynamicHelp::add $colors_labelframe.button$row -text $helptext
+ }
+ grid columnconfigure $colors_labelframe 0 -minsize 250
+ grid columnconfigure $colors_labelframe 1 -weight 1
+ pack $colors_labelframe -fill x -padx 5 -pady 5
# Raise tab "Output"
- $nb select $warnings_tab
+ $nb raise warnings_tab
# Create button frame at the bottom
set but_frame [frame $win.button_frame]
- # Button "Defaults"
+ # Button "Defaults"
pack [ttk::button $but_frame.but_default \
-text [mc "Defaults"] \
- -command {::configDialogs::simulator::DEFAULTS} \
+ -command {::configDialogues::simulator::DEFAULTS} \
] -side left
DynamicHelp::add $but_frame.but_default -text [mc "Reset settings to defaults"]
- # Button "Ok"
- pack [ttk::button $but_frame.but_ok \
+ # Button "Ok"
+ pack [ttk::button $but_frame.but_ok \
-text [mc "Ok"] \
-compound left \
-image ::ICONS::16::ok \
- -command {::configDialogs::simulator::OK} \
- ] -side right
- # Button "Cancel"
+ -command {::configDialogues::simulator::OK} \
+ ] -side right -padx 2
+ # Button "Cancel"
pack [ttk::button $but_frame.but_cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
- -command {::configDialogs::simulator::CANCEL} \
- ] -side right
+ -command {::configDialogues::simulator::CANCEL} \
+ ] -side right -padx 2
# Pack frames and notebook
pack $win.header_label -side top -pady 6
- pack $nb -side top -fill both -expand 1 -padx 10
- pack $but_frame -side top -fill x -expand 1 -anchor s -padx 10 -pady 5
+ pack [$nb get_nb] -side top -fill both -expand 1 -padx 10
+ pack $but_frame -side top -fill x -anchor s -padx 10 -pady 5
# Set window attributes
wm iconphoto $win ::ICONS::16::configure
wm transient $win .
wm title $win [mc "Simulator configuration - %s" ${::APPNAME}]
- wm minsize $win 380 480
+ wm minsize $win 380 520
raise $win
catch {grab $win}
wm protocol $win WM_DELETE_WINDOW {
- ::configDialogs::simulator::CANCEL
+ ::configDialogues::simulator::CANCEL
}
tkwait window $win
}
+ ## Select some color (command for buttons in labelbox "Colors")
+ # @parm Variable variable - variable containing current color (format RGB)
+ # @parm Widget button - ID of button which invoked this procedure
+ # @return void
+ proc select_color {variable button} {
+ variable win ;# ID of dialog toplevel window
+
+ # Destroy previously opened color selection dialog
+ if {[winfo exists .select_color]} {
+ destroy .select_color
+ }
+
+ # Invoke new color selection dialog
+ set color [subst -nocommands "\$$variable"]
+ set color [SelectColor .select_color \
+ -parent $win \
+ -color $color \
+ -title [mc "Select color - %s" ${::APPNAME}] \
+ ]
+
+ # Set new content of the given variable and button background color
+ if {$color != {}} {
+ set $variable $color
+ $button configure -bg $color -activebackground $color
+ }
+ }
+
## Validate contents of spinbox in section "Reverse Run"
# @parm String content - String to validate
# @return Bool - validation result (0 == failed; 1 == successfull)
@@ -309,6 +403,7 @@ namespace eval simulator {
variable ignore_EEPROM_WR_fail ;# Bool: Ignore EEPROM write failure
variable ignore_EEPROM_WR_abort ;# Bool: Ignore EEPROM write abort
variable undefined_value ;# Int: How to handle undefined values (0 == 0; 1 == 255; 2 == random)
+ variable ignore_invalid_brkpoints ;# Bool: Do not warn user about invalid (unreachable) breakpoints
getSettings
set $variable $value
@@ -324,11 +419,15 @@ namespace eval simulator {
# Set local option variables
foreach var $defaults {
set var [lindex $var 0]
- set ::configDialogs::simulator::${var} [subst "\$::Simulator::$var"]
+ if {$var == {on_color} || $var == {off_color}} {
+ set ::configDialogues::simulator::${var} [subst -nocommands "\$::Simulator_GUI::${var}"]
+ } else {
+ set ::configDialogues::simulator::${var} [subst -nocommands "\$::Simulator::${var}"]
+ }
}
}
- ## Set simulator acording to local settings
+ ## Set simulator according to local settings
# @return void
proc use_settings {} {
variable reverse_run_steps ;# Int: Number of steps which can be taken back
@@ -342,7 +441,11 @@ namespace eval simulator {
# Set option variables
foreach var $defaults {
set var [lindex $var 0]
- set ::Simulator::$var [subst "\$::configDialogs::simulator::${var}"]
+ if {$var == {on_color} || $var == {off_color}} {
+ set ::Simulator_GUI::$var [subst -nocommands "\$::configDialogues::simulator::${var}"]
+ } else {
+ set ::Simulator::$var [subst -nocommands "\$::configDialogues::simulator::${var}"]
+ }
}
}
@@ -354,7 +457,11 @@ namespace eval simulator {
# Save option variables
foreach var $defaults {
set var [lindex $var 0]
- ::settings setValue "Simulator/$var" [subst "\$::Simulator::${var}"]
+ if {$var == {on_color} || $var == {off_color}} {
+ ::settings setValue "Simulator/$var" [subst -nocommands "\$::Simulator_GUI::${var}"]
+ } else {
+ ::settings setValue "Simulator/$var" [subst -nocommands "\$::Simulator::${var}"]
+ }
}
# Synchronize
@@ -370,7 +477,11 @@ namespace eval simulator {
foreach item $defaults {
set var [lindex $item 0]
set val [lindex $item 1]
- set ::Simulator::${var} [::settings getValue "Simulator/$var" $val]
+ if {$var == {on_color} || $var == {off_color}} {
+ set ::Simulator_GUI::${var} [::settings getValue "Simulator/$var" $val]
+ } else {
+ set ::Simulator::${var} [::settings getValue "Simulator/$var" $val]
+ }
}
}
@@ -400,15 +511,17 @@ namespace eval simulator {
## Restrore defaults
# @return void
proc DEFAULTS {} {
- variable win ;# ID of toplevel dialog window
- variable defaults ;# List of default settings
+ variable win ;# ID of toplevel dialog window
+ variable defaults ;# List of default settings
+ variable on_color_button ;# Widget: Button "ON color" in section "Colors"
+ variable off_color_button ;# Widget: Button "OFF color" in section "Colors"
if {[tk_messageBox \
-parent $win \
-type yesno \
-icon question \
-title [mc "Are you sure ?"] \
- -message [mc "Are you sure you want to resore default settings"] \
+ -message [mc "Are you sure you want to restore default settings"] \
] != {yes}} {
return
}
@@ -417,7 +530,18 @@ namespace eval simulator {
foreach item $defaults {
set var [lindex $item 0]
set val [lindex $item 1]
- set ::configDialogs::simulator::${var} $val
+ set ::configDialogues::simulator::${var} $val
+
+ # Update colors of color buttons
+ if {$var == {on_color}} {
+ $on_color_button configure -bg $val -activebackground $val
+ } elseif {$var == {off_color}} {
+ $off_color_button configure -bg $val -activebackground $val
+ }
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/configdialogs/terminal_config.tcl b/lib/configdialogues/terminal_config.tcl
index 831540f..732b5cb 100755..100644
--- a/lib/configdialogs/terminal_config.tcl
+++ b/lib/configdialogues/terminal_config.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 _TERMINAL_CONFIG_TCL ] } {
+set _TERMINAL_CONFIG_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements terminal configuration dialog
@@ -50,7 +55,7 @@ namespace eval terminal {
variable fg_clr_but ;# Widget: Button for selecting foreground color
variable bg_clr_but ;# Widget: Button for selecting background color
- # Destroy the dialog if it's alredy opened
+ # Destroy the dialog if it's already opened
if {$dialog_opened} {
destroy .terminal_config_dialog
}
@@ -62,12 +67,12 @@ namespace eval terminal {
getSettings
# Create toplevel window
- set win [toplevel .terminal_config_dialog -class {Configuration dialog} -bg {#EEEEEE}]
+ set win [toplevel .terminal_config_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
# Create window header
label $win.header_label \
-text [mc "Terminal configuration"] \
- -font [font create -size -20]
+ -font [font create -size [expr {int(-20 * $::font_size_factor)}]]
# Create horizontal separator
Separator $win.sep -orient horizontal
@@ -83,7 +88,7 @@ namespace eval terminal {
-bd 1 -relief raised -pady 0 -width 10 \
-bg $configuration(fg) \
-activebackground $configuration(fg) \
- -command "::configDialogs::terminal::select_color {foreground} fg $main_frame.fg_but" \
+ -command "::configDialogues::terminal::select_color {foreground} fg $main_frame.fg_but" \
]
grid $fg_clr_but -column 1 -row $row -sticky wens
incr row
@@ -95,7 +100,7 @@ namespace eval terminal {
-bd 1 -relief raised -pady 0 -width 10 \
-bg $configuration(bg) \
-activebackground $configuration(bg) \
- -command "::configDialogs::terminal::select_color {background} bg $main_frame.bg_but" \
+ -command "::configDialogues::terminal::select_color {background} bg $main_frame.bg_but" \
]
grid $bg_clr_but -column 1 -row $row -sticky wens
incr row
@@ -103,11 +108,11 @@ namespace eval terminal {
grid [label $main_frame.font_size_lbl \
-text [mc "Font size"] \
] -row $row -column 0 -sticky w
- grid [spinbox $main_frame.font_size_spb \
- -from 4 -to 22 -validate all -width 0 \
- -vcmd {::configDialogs::terminal::font_size_valiade %P} \
- -textvariable ::configDialogs::terminal::configuration(font_size) \
- -command ::configDialogs::terminal::font_changed \
+ grid [ttk::spinbox $main_frame.font_size_spb \
+ -from 4 -to 22 -validate all -width 0 \
+ -validatecommand {::configDialogues::terminal::font_size_valiade %P} \
+ -textvariable ::configDialogues::terminal::configuration(font_size) \
+ -command ::configDialogues::terminal::font_changed \
] -row $row -column 1 -sticky we
incr row
# Font family
@@ -118,10 +123,10 @@ namespace eval terminal {
-state readonly \
-values [lsort [font families]] \
-width 20 \
- -textvariable ::configDialogs::terminal::configuration(font_family) \
+ -textvariable ::configDialogues::terminal::configuration(font_family) \
] -row $row -column 1 -sticky we
bind $main_frame.font_family_cbx <<ComboboxSelected>> \
- {::configDialogs::terminal::font_changed}
+ {::configDialogues::terminal::font_changed}
incr row
# Example text
set selected_font [font create \
@@ -141,7 +146,7 @@ namespace eval terminal {
-text [mc "Use settings and restart terminal emulator"] \
-compound left \
-image ::ICONS::16::reload \
- -command {::configDialogs::terminal::RESTART} \
+ -command {::configDialogues::terminal::RESTART} \
]
## Button frame at the bottom
@@ -149,7 +154,7 @@ namespace eval terminal {
# Button "Reset"
pack [ttk::button $but_frame.but_default \
-text [mc "Reset to defaults"] \
- -command {::configDialogs::terminal::DEFAULTS} \
+ -command {::configDialogues::terminal::DEFAULTS} \
] -side left
DynamicHelp::add $but_frame.but_default \
-text [mc "Reset all settings to defaults"]
@@ -158,8 +163,8 @@ namespace eval terminal {
-text [mc "Ok"] \
-compound left \
-image ::ICONS::16::ok \
- -command {::configDialogs::terminal::OK} \
- ] -side right
+ -command {::configDialogues::terminal::OK} \
+ ] -side right -padx 2
DynamicHelp::add $but_frame.but_ok \
-text [mc "Commit new settings"]
# Button "Cancel"
@@ -167,8 +172,8 @@ namespace eval terminal {
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
- -command {::configDialogs::terminal::CANCEL} \
- ] -side right
+ -command {::configDialogues::terminal::CANCEL} \
+ ] -side right -padx 2
DynamicHelp::add $but_frame.but_cancel \
-text [mc "Take changes back and close dialog"]
@@ -183,11 +188,11 @@ namespace eval terminal {
wm iconphoto $win ::ICONS::16::configure
wm transient $win .
wm title $win [mc "Configure terminal emulator"]
- wm minsize $win 380 250
+ wm minsize $win 380 280
raise $win
catch {grab $win}
wm protocol $win WM_DELETE_WINDOW {
- ::configDialogs::terminal::CANCEL
+ ::configDialogues::terminal::CANCEL
}
tkwait window $win
}
@@ -196,12 +201,18 @@ namespace eval terminal {
# @pamr String content - String to valiadte
# @return void
proc font_size_valiade {content} {
+ if {$content == {}} {
+ return 1
+ }
if {![string is digit $content]} {
return 0
}
- if {$content < 4 || $content > 22} {
+ if {$content > 22} {
return 0
}
+ after idle {
+ ::configDialogues::terminal::font_changed
+ }
return 1
}
@@ -213,6 +224,10 @@ namespace eval terminal {
variable selected_font ;# Font: Current font
variable changed ;# Bool: Settings changed
+ if {$configuration(font_size) == {} || $configuration(font_size) < 4} {
+ return
+ }
+
font delete $selected_font
set selected_font [font create \
-family $configuration(font_family) \
@@ -264,10 +279,13 @@ namespace eval terminal {
array set configuration [array get ::Terminal::configuration]
}
- ## Set application acording to local settings
+ ## Set application according to local settings
# @return void
proc use_settings {} {
variable configuration ;# Array: Configuration array
+ if {$configuration(font_size) == {} || $configuration(font_size) < 4} {
+ set configuration(font_size) 13
+ }
array set ::Terminal::configuration [array get configuration]
}
@@ -295,11 +313,11 @@ namespace eval terminal {
}
# Validate configuration
- if {![regexp {^#[0-9a-fA-F]{6}$} ${::Terminal::configuration(bg)}]} {
+ if {![regexp {^#[0-9a-fA-F]{6,12}$} ${::Terminal::configuration(bg)}]} {
puts stderr [mc "Invalid value of key: '%s'" {bg}]
set ::Terminal::configuration(bg) {#FFFFFF}
}
- if {![regexp {^#[0-9a-fA-F]{6}$} ${::Terminal::configuration(fg)}]} {
+ if {![regexp {^#[0-9a-fA-F]{6,12}$} ${::Terminal::configuration(fg)}]} {
puts stderr [mc "Invalid value of key: '%s'" {fg}]
set ::Terminal::configuration(fg) {#000000}
}
@@ -309,7 +327,7 @@ namespace eval terminal {
${::Terminal::configuration(font_size)} < 4
||
${::Terminal::configuration(font_size)} > 22
- } {
+ } then {
puts stderr [mc "Invalid value of key: '%s'" {font_size}]
set ::Terminal::configuration(font_size) 13
}
@@ -372,3 +390,7 @@ namespace eval terminal {
-activebackground $configuration(bg)
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/configdialogs/toolbar_config.tcl b/lib/configdialogues/toolbar_config.tcl
index 1ae5b5c..abddd01 100755..100644
--- a/lib/configdialogs/toolbar_config.tcl
+++ b/lib/configdialogues/toolbar_config.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,11 +21,17 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _TOOLBAR_CONFIG_TCL ] } {
+set _TOOLBAR_CONFIG_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements main toolbar configuration dialog
# --------------------------------------------------------------------------
+
namespace eval toolbar {
variable win ;# ID of toplevel dialog window
variable dialog_opened 0 ;# Bool: True if this dialog is already opened
@@ -35,7 +41,7 @@ namespace eval toolbar {
variable apply_button ;# ID of button "Apply"
variable current_ListBox ;# ID of ListBox containing current toolbar setup
- variable options_ListBox ;# ID of ListBox containing avaliable icons
+ variable options_ListBox ;# ID of ListBox containing available icons
variable current_search_entry ;# ID of search EntryBox for $current_ListBox
variable options_search_entry ;# ID of search EntryBox for $options_ListBox
variable current_search_clear ;# ID of search EntryBox clear button for $current_ListBox
@@ -56,7 +62,7 @@ namespace eval toolbar {
variable apply_button ;# ID of button "Apply"
variable current_ListBox ;# ID of ListBox containing current toolbar setup
- variable options_ListBox ;# ID of ListBox containing avaliable icons
+ variable options_ListBox ;# ID of ListBox containing available icons
variable current_search_entry ;# ID of search EntryBox for $current_ListBox
variable options_search_entry ;# ID of search EntryBox for $options_ListBox
variable current_search_clear ;# ID of search EntryBox clear button for $current_ListBox
@@ -66,7 +72,7 @@ namespace eval toolbar {
variable right_button ;# ID of button "Right"
variable down_button ;# ID of button "Down"
- # Destroy the dialog if it's alredy opened
+ # Destroy the dialog if it's already opened
if {$dialog_opened} {
destroy .toolbar_config_dialog
}
@@ -75,14 +81,14 @@ namespace eval toolbar {
set changed 0
# Create toplevel window
- set win [toplevel .toolbar_config_dialog -class {Configuration dialog} -bg {#EEEEEE}]
+ set win [toplevel .toolbar_config_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
# Create window header
label $win.header_label \
-compound left \
-image ::ICONS::32::configure \
-text [mc "Toolbar configuration"] \
- -font [font create -size -20]
+ -font [font create -size [expr {int(-20 * $::font_size_factor)}]]
# Create main frame (ListBoxes and Arrows)
set main_frame [frame $win.main_frame]
@@ -94,28 +100,28 @@ namespace eval toolbar {
-image ::ICONS::16::up \
-state disabled \
-style Flat.TButton \
- -command {::configDialogs::toolbar::up} \
+ -command {::configDialogues::toolbar::up} \
]
# Arrow "Left"
set left_button [ttk::button $arrows.left \
-image ::ICONS::16::left \
-state disabled \
-style Flat.TButton \
- -command {::configDialogs::toolbar::left} \
+ -command {::configDialogues::toolbar::left} \
]
# Arrow "Right"
set right_button [ttk::button $arrows.right \
-image ::ICONS::16::right \
-state disabled \
-style Flat.TButton \
- -command {::configDialogs::toolbar::right} \
+ -command {::configDialogues::toolbar::right} \
]
# Arrow "Down"
set down_button [ttk::button $arrows.down \
-image ::ICONS::16::down \
-state disabled \
-style Flat.TButton \
- -command {::configDialogs::toolbar::down} \
+ -command {::configDialogues::toolbar::down} \
]
# Place arrows to the grid
@@ -124,7 +130,7 @@ namespace eval toolbar {
grid $right_button -column 2 -row 1
grid $down_button -column 1 -row 2
- # Create ListBox of avaliable items and its scrollbar
+ # Create ListBox of available items and its scrollbar
set options_frame [frame $main_frame.options_frame]
set listbox_frame [frame $options_frame.listbox_frame]
set options_ListBox [ListBox $listbox_frame.options_ListBox \
@@ -145,11 +151,11 @@ namespace eval toolbar {
-command "$options_ListBox yview" \
] -side right -after $options_ListBox -fill y
- # Create search bar for ListBox of avaliable items
+ # Create search bar for ListBox of available items
set search_frame [frame $options_frame.search_frame]
set options_search_entry [ttk::entry $search_frame.entry \
-validate all \
- -validatecommand {::configDialogs::toolbar::search O %P} \
+ -validatecommand {::configDialogues::toolbar::search O %P} \
]
DynamicHelp::add $search_frame.entry -text [mc "Search for a string in ListBox"]
pack $options_search_entry -side left -fill x -expand 1
@@ -163,9 +169,9 @@ namespace eval toolbar {
-text [mc "Clear"]
pack $options_search_clear -side right -after $options_search_entry
- # Pack frames of the left part (avaliable items)
+ # Pack frames of the left part (available items)
pack $search_frame -fill x
- pack [label $options_frame.label -text [mc "Avaliable items"]] -pady 5
+ pack [label $options_frame.label -text [mc "available items"]] -pady 5
pack $listbox_frame -fill both -expand 1
@@ -194,7 +200,7 @@ namespace eval toolbar {
set search_frame [frame $current_frame.search_frame]
set current_search_entry [ttk::entry $search_frame.entry \
-validate all \
- -validatecommand {::configDialogs::toolbar::search C %P} \
+ -validatecommand {::configDialogues::toolbar::search C %P} \
]
DynamicHelp::add $search_frame.entry -text [mc "Search for a string in ListBox"]
pack $current_search_entry -side left -fill x -expand 1
@@ -216,9 +222,9 @@ namespace eval toolbar {
# Set event bindings for ListBoxes
bind $options_ListBox <<ListboxSelect>> \
- "::configDialogs::toolbar::reevaluateArrows"
+ "::configDialogues::toolbar::reevaluateArrows"
bind $current_ListBox <<ListboxSelect>> \
- "::configDialogs::toolbar::reevaluateArrows"
+ "::configDialogues::toolbar::reevaluateArrows"
# Pack left ListBox, arrows frame, right ListBox
@@ -234,7 +240,7 @@ namespace eval toolbar {
# Button "Defaults"
pack [ttk::button $but_frame.but_default \
-text [mc "Defaults"] \
- -command {::configDialogs::toolbar::DEFAULTS} \
+ -command {::configDialogues::toolbar::DEFAULTS} \
] -side left
DynamicHelp::add $but_frame.but_default \
-text [mc "Reset settings to defaults"]
@@ -243,24 +249,24 @@ namespace eval toolbar {
-text [mc "Ok"] \
-compound left \
-image ::ICONS::16::ok \
- -command {::configDialogs::toolbar::OK} \
- ] -side right
+ -command {::configDialogues::toolbar::OK} \
+ ] -side right -padx 2
# Button "Apply"
- set apply_button [ttk::button $but_frame.but_apply \
+ set apply_button [ttk::button $but_frame.but_apply \
-state disabled \
-text [mc "Apply"] \
-compound left \
-image ::ICONS::16::ok \
- -command {::configDialogs::toolbar::APPLY} \
+ -command {::configDialogues::toolbar::APPLY} \
]
- pack $apply_button -side right
+ pack $apply_button -side right -padx 2
# Button "Cancel"
pack [ttk::button $but_frame.but_cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
- -command {::configDialogs::toolbar::CANCEL} \
- ] -side right
+ -command {::configDialogues::toolbar::CANCEL} \
+ ] -side right -padx 2
# Pack frames and notebook
pack $but_frame -side bottom -fill x -expand 0 -anchor s -padx 10 -pady 5
@@ -275,22 +281,37 @@ namespace eval toolbar {
raise $win
catch {grab $win}
wm protocol $win WM_DELETE_WINDOW {
- ::configDialogs::toolbar::CANCEL
+ if {${::configDialogues::toolbar::anything_modified}} {
+ set result [tk_messageBox \
+ -parent .toolbar_config_dialog \
+ -title [mc "Save changes?"] \
+ -icon question \
+ -type yesno \
+ -message [mc "The settings have been changed. Do you want to save the changes?"] \
+ ]
+ if {$result == {yes}} {
+ ::configDialogues::toolbar::OK
+ } else {
+ ::configDialogues::toolbar::CANCEL
+ }
+ } else {
+ ::configDialogues::toolbar::CANCEL
+ }
}
tkwait window $win
}
## Validator procedure for search EntryBoxes
# Search for the given string in the given ListBox and
- #+ adjust EntryBox background color acording to search result
+ #+ adjust EntryBox background color according to search result
# @parm Char where -
- # "O" (O as Omega not 0 as zero) == Options ListBox (avaliable items)
+ # "O" (O as Omega not 0 as zero) == Options ListBox (available items)
# "C" == ListBox containing current onfiguration
# @parm String what - String to search for
# @return Bool - Always true
proc search {where what} {
variable current_ListBox ;# ID of ListBox containing current toolbar setup
- variable options_ListBox ;# ID of ListBox containing avaliable icons
+ variable options_ListBox ;# ID of ListBox containing available icons
variable current_search_entry ;# ID of search EntryBox for $current_ListBox
variable options_search_entry ;# ID of search EntryBox for $options_ListBox
variable current_search_clear ;# ID of search EntryBox clear button for $current_ListBox
@@ -300,7 +321,7 @@ namespace eval toolbar {
set listbox $current_ListBox
set entry $current_search_entry
set clearbut $current_search_clear
- } {
+ } else {
set listbox $options_ListBox
set entry $options_search_entry
set clearbut $options_search_clear
@@ -311,7 +332,7 @@ namespace eval toolbar {
$entry configure -style TEntry
$clearbut configure -state disabled
return 1
- } {
+ } else {
$clearbut configure -state normal
}
@@ -324,7 +345,7 @@ namespace eval toolbar {
[$listbox itemcget $item -text] \
] \
] != -1
- } {
+ } then {
$listbox selection clear
$listbox selection set $item
$listbox see $item
@@ -344,7 +365,7 @@ namespace eval toolbar {
# @return void
proc fillListBox {definition} {
variable current_ListBox ;# ID of ListBox containing current toolbar setup
- variable options_ListBox ;# ID of ListBox containing avaliable icons
+ variable options_ListBox ;# ID of ListBox containing available icons
# Fill in left ListBox
$options_ListBox insert end sep -text [mc " -- SEPARATOR --"]
@@ -355,9 +376,9 @@ namespace eval toolbar {
# Skip invalid items
if {[lsearch $definition $item] != -1} {continue}
# Insert item
- $options_ListBox insert end $item \
- -text [lindex ${::ICONBAR_ICONS} "$i 0"] \
- -image ::ICONS::16::[lindex ${::ICONBAR_ICONS} "$i 2"]
+ $options_ListBox insert end $item \
+ -text [mc [lindex ${::ICONBAR_ICONS} [list $i 0]]] \
+ -image ::ICONS::16::[lindex ${::ICONBAR_ICONS} [list $i 2]]
}
# Fill in right ListBox
@@ -371,31 +392,31 @@ namespace eval toolbar {
if {$i == -1} {continue}
incr i
# Insert regular item
- $current_ListBox insert end $key \
- -text [lindex ${::ICONBAR_ICONS} "$i 0"] \
- -image ::ICONS::16::[lindex ${::ICONBAR_ICONS} "$i 2"]
+ $current_ListBox insert end $key \
+ -text [mc [lindex ${::ICONBAR_ICONS} [list $i 0]]] \
+ -image ::ICONS::16::[lindex ${::ICONBAR_ICONS} [list $i 2]]
}
}
- ## Enable/Disable arrow buttons acording to selection in ListBoxes
+ ## Enable/Disable arrow buttons according to selection in ListBoxes
# @return void
proc reevaluateArrows {} {
variable current_ListBox ;# ID of ListBox containing current toolbar setup
- variable options_ListBox ;# ID of ListBox containing avaliable icons
+ variable options_ListBox ;# ID of ListBox containing available icons
variable left_button ;# ID of button "Left"
variable right_button ;# ID of button "Right"
# Button "Left"
if {[$current_ListBox selection get] == {}} {
$left_button configure -state disabled
- } {
+ } else {
$left_button configure -state normal
}
# Button "Right"
if {[$options_ListBox selection get] == {}} {
$right_button configure -state disabled
- } {
+ } else {
$right_button configure -state normal
}
@@ -404,7 +425,7 @@ namespace eval toolbar {
}
- ## Enable/Disable Up/Down arrow acording to selection in the right ListBox
+ ## Enable/Disable Up/Down arrow according to selection in the right ListBox
# @return void
proc reevaluateUpDown {} {
variable current_ListBox ;# ID of ListBox containing current toolbar setup
@@ -420,7 +441,7 @@ namespace eval toolbar {
set curIndex [$current_ListBox index $sel]
if {$curIndex == 0} {
$up_button configure -state disabled
- } {
+ } else {
$up_button configure -state normal
}
@@ -428,11 +449,11 @@ namespace eval toolbar {
set numberOfItems [llength [$current_ListBox items]]
if {$curIndex == ($numberOfItems - 1)} {
$down_button configure -state disabled
- } {
+ } else {
$down_button configure -state normal
}
# Empty selection
- } {
+ } else {
$up_button configure -state disabled
$down_button configure -state disabled
}
@@ -485,7 +506,7 @@ namespace eval toolbar {
# @return void
proc left {} {
variable current_ListBox ;# ID of ListBox containing current toolbar setup
- variable options_ListBox ;# ID of ListBox containing avaliable icons
+ variable options_ListBox ;# ID of ListBox containing available icons
# Local variables
set sel [$current_ListBox selection get] ;# ID of the selected item
@@ -496,15 +517,15 @@ namespace eval toolbar {
# Regular item (no separator)
if {![regexp {^\d+$} $sel]} {
- # Find index of the item (in avaliable icons)
+ # Find index of the item (in available icons)
set i [lsearch ${::ICONBAR_ICONS} $sel]
if {$i == -1} {return}
incr i
# Insert removed item into left ListBox
$options_ListBox insert 1 $sel \
- -text [lindex ${::ICONBAR_ICONS} "$i 0"] \
- -image ::ICONS::16::[lindex ${::ICONBAR_ICONS} "$i 2"]
+ -text [lindex ${::ICONBAR_ICONS} [list $i 0]] \
+ -image ::ICONS::16::[lindex ${::ICONBAR_ICONS} [list $i 2]]
}
# Restore selection
@@ -529,13 +550,13 @@ namespace eval toolbar {
# @return void
proc right {} {
variable current_ListBox ;# ID of ListBox containing current toolbar setup
- variable options_ListBox ;# ID of ListBox containing avaliable icons
+ variable options_ListBox ;# ID of ListBox containing available icons
# Determinate target index
set sel [$current_ListBox selection get]
if {$sel == {}} {
set trgIdx {end}
- } {
+ } else {
set trgIdx [$current_ListBox index $sel]
}
# Determinate source index and source item ID
@@ -546,13 +567,13 @@ namespace eval toolbar {
if {$sel == {sep}} {
$current_ListBox insert $trgIdx #auto -text [mc " -- SEPARATOR --"]
# Regular item
- } {
+ } else {
set i [lsearch ${::ICONBAR_ICONS} $sel]
if {$i == -1} {return}
incr i
$current_ListBox insert $trgIdx $sel \
- -text [lindex ${::ICONBAR_ICONS} "$i 0"] \
- -image ::ICONS::16::[lindex ${::ICONBAR_ICONS} "$i 2"]
+ -text [lindex ${::ICONBAR_ICONS} [list $i 0]] \
+ -image ::ICONS::16::[lindex ${::ICONBAR_ICONS} [list $i 2]]
$options_ListBox delete $sel
}
@@ -629,6 +650,7 @@ namespace eval toolbar {
iconbar_redraw
set anything_modified 0
::X::disaena_menu_toolbar_for_current_project
+ set anything_modified 0
}
# Get rid of dialog window
@@ -643,14 +665,16 @@ namespace eval toolbar {
variable win ;# ID of dialog toplevel window
variable changed ;# Bool: Settings changed
variable dialog_opened ;# Bool: True if this dialog is already opened
+ variable anything_modified ;# Bool: Settings changed (stay set to 1 even after APPLY)
# Apply new settings
- if {$changed} {
+ if {$anything_modified} {
use_settings ;# Adjust NS variables
iconbar_redraw ;# Adjust GUI
save_config ;# Save new config
# Restore previous state of menu items (enabled / disabled)
::X::disaena_menu_toolbar_for_current_project
+ set anything_modified 0
}
# Get rid of dialog window
@@ -683,7 +707,7 @@ namespace eval toolbar {
# @return void
proc DEFAULTS {} {
variable current_ListBox ;# ID of ListBox containing current toolbar setup
- variable options_ListBox ;# ID of ListBox containing avaliable icons
+ variable options_ListBox ;# ID of ListBox containing available icons
variable win ;# ID of dialog toplevel window
# Ask user
@@ -704,3 +728,7 @@ namespace eval toolbar {
settings_changed
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/custom_command.tcl b/lib/custom_command.tcl
index 63a42c5..6a5393f 100755..100644
--- a/lib/custom_command.tcl
+++ b/lib/custom_command.tcl
@@ -1,8 +1,11 @@
-#!/usr/bin/tclsh
+#!/bin/sh
+# the next line restarts using wish \
+exec tclsh "$0" "$@"
+
# 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 #
@@ -29,6 +32,7 @@
# --------------------------------------------------------------------------
# Initialize
+encoding system {utf-8}
package require Tk
wm withdraw .
wm command . "$argv0 $argv"
@@ -42,41 +46,9 @@ wm client . [info hostname]
proc secure_send args {
if {[catch {
eval "send $args"
- } result]} {
- puts "Unknown IO Error :: $result"
- tk_messageBox \
- -title "Unknown IO Error" \
- -icon error \
- -type ok \
- -message "$result"
-
- if {[ \
- tk_messageBox \
- -title "X server security workaround" \
- -icon warning \
- -type yesno \
- -message "If the error was related to X server security, it is possible to temporarily workaround it by running this command: \"/bin/sh << 'for i in `xhost`; do xhost -\$i; done'\"\n\nDo you want to do it ?"
- ] == {yes}} then {
- catch {
- exec -- /bin/sh << {xhost -; for i in `xhost`; do xhost -$i; done}
- }
- } else {
- exit 1
- }
-
- if {[catch {
- eval "send $args"
- }]} {
- tk_messageBox \
- -title "Workaround failed" \
- -icon error \
- -type ok \
- -message "Sorry this doesn't work ...\nIt's a strange bug somewhere in your operating system"
- exit 1
- }
-
+ } result]} then {
+ puts stderr "Unknown IO Error :: $result"
return 1
-
} else {
return 1
}
@@ -89,8 +61,8 @@ while {![eof stdin]} {
}
# Execute loaded command
-if {[catch {exec /bin/sh << $cmd} result]} {
- secure_send [lindex $argv 0] ::X::custom_cmd_error [lindex $argv 1] "{" [regsub -all {[\{\}]} $result {\\&}] "}"
+if {[catch {exec bash << $cmd} result] && ![string equal $::errorCode NONE]} {
+ secure_send [lindex $argv 0] ::X::custom_cmd_error [lindex $argv 1] "{" [regsub -all {[\{\}]} $result {\\&}] "}"
} else {
secure_send [lindex $argv 0] ::X::custom_cmd_finish [lindex $argv 1] "{" [regsub -all {[\{\}]} $result {\\&}] "}"
}
diff --git a/lib/dialogs/errorhandler.tcl b/lib/dialogues/errorhandler.tcl
index ac1b553..93e1cf4 100755..100644
--- a/lib/dialogs/errorhandler.tcl
+++ b/lib/dialogues/errorhandler.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,13 +21,18 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _ERRORHANDLER_TCL ] } {
+set _ERRORHANDLER_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Background error handler
# --------------------------------------------------------------------------
namespace eval ErrorHandler {
- variable num_of_opended 0 ;# Int: Number of currently opened dialogs
+ variable num_of_opened 0 ;# Int: Number of currently opened dialogues
variable count 0 ;# Int: Counter of ivokations
variable enabled 1 ;# Bool: Dialog window enabled
@@ -37,13 +42,13 @@ namespace eval ErrorHandler {
proc open_dialog {message} {
variable count ;# Int: Counter of ivokations
variable enabled ;# Bool: Dialog window enabled
- variable num_of_opended ;# Int: Number of currently opened dialogs
+ variable num_of_opened ;# Int: Number of currently opened dialogues
- if {$num_of_opended > 2} {
- puts stderr "ERROR MESSAGE SUPPRESED (too many error dialogs opened at the time)"
+ if {$num_of_opened > 2} {
+ puts stderr "ERROR MESSAGE SUPPRESED (too many error dialogues opened at the time)"
return
}
- incr num_of_opended
+ incr num_of_opened
# Send error message to standard error output
puts stderr [string repeat # 64]
@@ -66,7 +71,7 @@ namespace eval ErrorHandler {
# Create dialog window
if {!$enabled} {return}
incr count
- set win [toplevel .error_dialog$count -bg {#EE0000} -class {Error message} -bg {#EEEEEE}]
+ set win [toplevel .error_dialog$count -bg {#EE0000} -class {Error message} -bg ${::COMMON_BG_COLOR}]
# Create window frames
set main_frame [frame $win.main_frame]
@@ -75,13 +80,13 @@ namespace eval ErrorHandler {
set bottom_frame [frame $main_frame.bottom_frame]
# Create window header
- pack [label $top_frame.header_lbl \
- -text [mc "PROGRAM ERROR "] \
- -bg {#EE0000} -fg {#FFFFFF} \
- -font [font create \
- -family helvetica \
- -size -24 \
- -weight bold \
+ pack [label $top_frame.header_lbl \
+ -text [mc "PROGRAM ERROR "] \
+ -bg {#EE0000} -fg {#FFFFFF} \
+ -font [font create \
+ -family helvetica \
+ -size [expr {int(-24 * $::font_size_factor)}] \
+ -weight bold \
] \
] -side left -fill x -expand 1
@@ -98,26 +103,34 @@ namespace eval ErrorHandler {
] -fill y -side right
# Create text tags
- $middle_frame.text tag configure tag_bold \
- -font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -weight bold \
- -size -14 \
+ $middle_frame.text tag configure tag_bold \
+ -font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -weight bold \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ ]
+ $middle_frame.text tag configure tag_tt \
+ -font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
]
- $middle_frame.text tag configure tag_big_bold \
- -font [font create \
- -family {helvetica} \
- -weight bold \
- -size -17 \
+ $middle_frame.text tag configure tag_big_bold \
+ -font [font create \
+ -family {helvetica} \
+ -weight bold \
+ -size [expr {int(-17 * $::font_size_factor)}] \
]
# Write error message
- $middle_frame.text insert end [mc "Error log saved in: %s\n" "${::X::defaultDirectory}/mcu8051ide_errors.log"]
- $middle_frame.text insert end [mc "Please send this file to %s or report this bug at http://mcu8051ide.sf.net/forum\n\n\n" <martin.osmera@gmail.com>]
- $middle_frame.text tag add tag_big_bold 1.0 3.0
+ $middle_frame.text insert end [mc "Error log saved in: %s\n" "${::X::defaultDirectory}[file separator]mcu8051ide_errors.log"]
+ $middle_frame.text insert end [mc "Please send this file to %s\nor report this bug at: http://sourceforge.net/tracker/?group_id=185864&atid=914981\n\n\n" {<martin.osmera@gmail.com>}]
+ create_link_tag_in_text_widget $middle_frame.text
+ convert_all_https_to_links $middle_frame.text
+ $middle_frame.text tag add tag_big_bold 1.0 4.0
$middle_frame.text insert end [mc "ERROR DETAILS:\n--------------\n"]
- $middle_frame.text tag add tag_bold 5.0 7.0
+ $middle_frame.text tag add tag_bold 6.0 8.0
$middle_frame.text insert end $::errorInfo
+ $middle_frame.text tag add tag_tt 8.0 end
$middle_frame.text configure -state disabled
# Create button frame
@@ -159,9 +172,9 @@ namespace eval ErrorHandler {
# @parm Int number - Dialog unique number
# @return void
proc close_dialog {number} {
- variable num_of_opended ;# Int: Number of currently opened dialogs
+ variable num_of_opened ;# Int: Number of currently opened dialogues
- incr num_of_opended -1
+ incr num_of_opened -1
destroy .error_dialog$number
}
}
@@ -170,3 +183,7 @@ namespace eval ErrorHandler {
proc bgerror {message} {
::ErrorHandler::open_dialog $message
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/dialogs/fsd.tcl b/lib/dialogues/fsd.tcl
index 959eae4..fce7e24 100755..100644
--- a/lib/dialogs/fsd.tcl
+++ b/lib/dialogues/fsd.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 _FSD_TCL ] } {
+set _FSD_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# This class provides file selection dialog
@@ -34,7 +39,7 @@
# -initialfile String = {} ;# Initial file
# -directory String = {~} ;# Initiali directory
# -multiple Bool = 0 ;# Allow selection of multiple files (get will return list instead of string)
-# -filetypes List = {{All} {*}} ;# { {{Some string} {GLOB} ... }
+# -filetypes List = {{All} {*}} ;# { {{Some string} {GLOB}} ... }
# -defaultmask Int = 0 ;# Number of detault mask (see -filetypes) (1st is zero)
# -modal Bool = 1 ;# Create as modal window
# -doubleclick Bool = 0 ;# Use double click to open folder instead of single click
@@ -55,28 +60,28 @@ itcl::class KIFSD::FSD {
common bookmark_change_command {} ;# Command to invoke on bokmark change
# Font for quick navigation panel
- common quick_nav_panel_font [font create \
- -family {helvetica} \
- -size -12 \
- -weight bold \
+ common quick_nav_panel_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
]
# Font for files listbox in mode (Short view)
- common listbox_font_short [font create \
- -family {helvetica} \
- -size -14 \
- -weight normal \
+ common listbox_font_short [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight normal \
]
# Font for files listbox in mode (Detailed view) and directories listbox
- common listbox_font_detailed [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight normal \
+ common listbox_font_detailed [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight normal \
]
# Font for listbox header
- common listbox_header_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight bold \
+ common listbox_header_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
]
## Values given by constructor arguments
@@ -84,7 +89,7 @@ itcl::class KIFSD::FSD {
private variable option_filetypes {{All} {*}} ;# File types
if {!$::MICROSOFT_WINDOWS} {
variable option_directory ${::env(HOME)} ;# Initial directory
- } {
+ } else {
variable option_directory ${::env(USERPROFILE)} ;# Initial directory
}
private variable option_master {.} ;# Window master
@@ -118,8 +123,8 @@ itcl::class KIFSD::FSD {
private variable dir_combobox ;# Widget: Directory ComboBox
private variable toolbar ;# Widget: Frame containing toolbar
private variable quick_access_bar ;# Widget: Quick access bar ListBox
- private variable dir_listbox_scrollbar ;# Widget: Directory ListBox scrollbar
- private variable dir_listbox ;# Widget: Directory ListBox
+ private variable dir_listbox_scrollbar {} ;# Widget: Directory ListBox scrollbar
+ private variable dir_listbox {} ;# Widget: Directory ListBox
private variable main_paned_window ;# Widget: Paned window for quick access bar and other LBs
private variable leftframe ;# Widget: Frame contaning quick access bar and its scrollbar
private variable rightframe ;# Widget: Frame containing directory & file ListBoxes
@@ -130,10 +135,13 @@ itcl::class KIFSD::FSD {
private variable file_listbox ;# Widget: Files ListBox
private variable file_listbox_header ;# Widget: Header for files ListBox
private variable file_listbox_frame ;# Widget: Frame for $file_listbox_header and $file_listbox
- private variable file_listbox_vscrollbar ;# Widget: Vertical scollbar for files ListBox
- private variable file_listbox_hscrollbar ;# Widget: Hotizontal scollbar for files ListBox
+ private variable file_listbox_vscrollbar {} ;# Widget: Vertical scollbar for files ListBox
+ private variable file_listbox_hscrollbar {} ;# Widget: Hotizontal scollbar for files ListBox
private variable right_top_right_top_frame ;# Widget: Frame for $file_listbox_frame and scrollbars
+ proc static_reload {object args} {
+ catch [list $object reload]
+ }
## Dialog constructor
# For complite list of possible arguments see desctiption above
@@ -141,6 +149,7 @@ itcl::class KIFSD::FSD {
# Configure local ttk styles
ttk::style configure FSD_RedBg.TCombobox -fieldbackground {#FFDDDD}
+ ttk::style configure FSD_RedBg.TEntry -fieldbackground {#FFDDDD}
## Parse given arguments and set appropriate object variables
set arglen [llength $args]
@@ -152,21 +161,21 @@ itcl::class KIFSD::FSD {
incr i
set option_modal [lindex $args $i]
if {![string is boolean -strict $option_modal]} {
- error "-fileson must have value eighter 0 or 1"
+ error "-modal must have value either 0 or 1"
}
}
-doubleclick {
incr i
set option_doubleclick [lindex $args $i]
if {![string is boolean -strict $option_doubleclick]} {
- error "-doubleclick must have value eighter 0 or 1"
+ error "-doubleclick must have value either 0 or 1"
}
}
-autoclose {
incr i
set option_autoclose [lindex $args $i]
if {![string is boolean -strict $option_autoclose]} {
- error "-autoclose must have value eighter 0 or 1"
+ error "-autoclose must have value either 0 or 1"
}
}
-initialfile {
@@ -177,7 +186,7 @@ itcl::class KIFSD::FSD {
incr i
set option_multiple [lindex $args $i]
if {![string is boolean -strict $option_multiple]} {
- error "-multiple must have value eighter 0 or 1"
+ error "-multiple must have value either 0 or 1"
}
}
-defaultmask {
@@ -207,7 +216,7 @@ itcl::class KIFSD::FSD {
incr i
set option_fileson [lindex $args $i]
if {![string is boolean -strict $option_modal]} {
- error "-fileson must have value eighter 0 or 1"
+ error "-fileson must have value either 0 or 1"
}
}
default {
@@ -254,7 +263,11 @@ itcl::class KIFSD::FSD {
# @return void
private method create_dialog {} {
# Determinate window name (path)
- set win_base .[string tolower [regsub -all {:} $this {}]]
+ set win_base {}
+ if {$option_master != {.}} {
+ set win_base $option_master
+ }
+ append win_base .[string tolower [regsub -all {:} $this {}]]
set win $win_base
set i 0
while [winfo exists $win] {
@@ -264,11 +277,11 @@ itcl::class KIFSD::FSD {
}
# Create and configure dialog window
- toplevel $win -bg {#EEEEEE}
+ toplevel $win -bg ${::COMMON_BG_COLOR}
wm iconphoto $win ::ICONS::16::fileopen
wm withdraw $win
wm title $win $option_title
- wm minsize $win 540 260
+ wm minsize $win 540 290
wm protocol $win WM_DELETE_WINDOW "catch {itcl::delete object $this}"
wm transient $win $option_master
wm geometry $win ${::KIFSD::FSD::config(win_geometry)}
@@ -344,7 +357,7 @@ itcl::class KIFSD::FSD {
set dir_listbox [ListBox $right_top_left_frame.dir_listbox \
-bd 1 -padx 19 -selectfill 1 -width 1 -highlightcolor {#BBBBFF} \
-selectmode single -highlightthickness 0 -bg white -deltay 18 \
- -yscrollcommand "catch {$this dir_listbox_scroll}" \
+ -yscrollcommand "$this dir_listbox_scroll" \
]
set dir_listbox_scrollbar [ttk::scrollbar \
$right_top_left_frame.scrollbar \
@@ -366,7 +379,7 @@ itcl::class KIFSD::FSD {
# Create files ListBox
if {$option_multiple} {
set selmode {multiple}
- } {
+ } else {
set selmode {single}
}
set right_top_right_top_frame [frame $right_top_right_frame.right_top_right_top_frame]
@@ -379,25 +392,34 @@ itcl::class KIFSD::FSD {
$file_listbox_header delete 1.0 end
if {!$::MICROSOFT_WINDOWS} {
$file_listbox_header insert end \
- [mc " Name\t\t\t\t Size Rights Date "]
+ [mc " Name Size Rights Date "]
} else {
$file_listbox_header insert end \
- [mc " Name\t\t\t\t Size Date "]
+ [mc " Name Size Date "]
}
bindtags $file_listbox_header $file_listbox_header
$file_listbox_header configure -state disabled
- set file_listbox [ListBox $file_listbox_frame.file_listbox -height 1 \
- -selectfill 1 -selectbackground {#88AAFF} -bd 1 -padx 17 -width 1 \
- -selectmode $selmode -highlightthickness 0 -bg white -deltay 18 \
- -yscrollcommand "catch {$this file_listbox_vscroll}" -highlightcolor {#BBBBFF} \
- -xscrollcommand "catch {$this file_listbox_hscroll}" \
+ set file_listbox [ListBox $file_listbox_frame.file_listbox \
+ -bd 1 \
+ -padx 17 \
+ -width 1 \
+ -height 1 \
+ -bg white \
+ -deltay 18 \
+ -selectfill 1 \
+ -selectmode $selmode \
+ -highlightthickness 0 \
+ -selectbackground {#88AAFF} \
+ -highlightcolor {#BBBBFF} \
+ -yscrollcommand "$this file_listbox_vscroll" \
+ -xscrollcommand "$this file_listbox_hscroll" \
]
pack $file_listbox -fill both -expand 1
if {${::KIFSD::FSD::config(detailed_view)}} {
$file_listbox configure -multicolumn 0
set listbox_font $listbox_font_detailed
pack $file_listbox_header -before $file_listbox -fill x -expand 0
- } {
+ } else {
$file_listbox configure -multicolumn 1
set listbox_font $listbox_font_short
}
@@ -433,8 +455,8 @@ itcl::class KIFSD::FSD {
] -sticky w -column 0 -row 1
set location_cb [ttk::combobox $right_bottom_frame.location_cb \
- -values {} \
- -exportselection 0 \
+ -values {} \
+ -exportselection 0 \
]
bind $location_cb <<ComboboxSelected>> "$file_listbox selection clear"
DynamicHelp::add $location_cb -text [mc "Selected file(s)"]
@@ -444,7 +466,18 @@ itcl::class KIFSD::FSD {
set tmp_option_filetypes {}
foreach type $option_filetypes {
- lappend tmp_option_filetypes "[lindex $type 0] ([lindex $type 1])"
+ set glob_masks [lindex $type 1]
+ if {[regexp {^\*\.\{\w+(,\w+)*\}$} $glob_masks]} {
+ set glob_masks [split $glob_masks {{,}}]
+ set glob_masks [lreplace $glob_masks 0 0]
+ set glob_masks [lreplace $glob_masks end end]
+ set glob_masks_new [list]
+ foreach ext $glob_masks {
+ lappend glob_masks_new [format "*.%s" $ext]
+ }
+ set glob_masks [join $glob_masks_new {, }]
+ }
+ lappend tmp_option_filetypes "[lindex $type 0] ($glob_masks)"
}
set filter_cb [ttk::combobox $right_bottom_frame.filter_cb \
-state readonly \
@@ -475,14 +508,14 @@ itcl::class KIFSD::FSD {
-image ::ICONS::16::ok \
-command [list $this ok] \
]
- grid $ok_button -sticky w -column 2 -row 0 -padx 7
+ grid $ok_button -sticky w -column 2 -row 0 -padx 7 -pady 2
grid [ttk::button $right_bottom_frame.cancel_button \
-text [mc "Cancel"] \
-compound left \
-width 8 \
-image ::ICONS::16::button_cancel \
-command "itcl::delete object $this" \
- ] -sticky w -column 2 -row 1 -padx 7
+ ] -sticky w -column 2 -row 1 -padx 7 -pady 2
grid columnconfigure $right_bottom_frame 1 -weight 1
@@ -529,7 +562,8 @@ itcl::class KIFSD::FSD {
{bookmark_menu}}
{configure "Configure" {configure}
{config_menu}}
- } {
+ } \
+ {
# Create separator
if {$item == {separator}} {
pack [ttk::separator $toolbar.sep$si \
@@ -616,7 +650,7 @@ itcl::class KIFSD::FSD {
## Create entries for configuraion menu (accessable from toolbar)
# Entry: "Sorting"
- $win.config_menu add cascade -label [mc "Sorting"] -underline 1 -menu $sorting_menu
+ $win.config_menu add cascade -label [mc "Sorting"] -underline 1 -menu $sorting_menu -image ::ICONS::16::sort_incr -compound left
$win.config_menu add separator
# Entry: "Short view"
$win.config_menu add command -label [mc "Short view"] -compound left \
@@ -787,7 +821,7 @@ itcl::class KIFSD::FSD {
append dir {/}
}
}
-
+
# Check if the specified directory is valid
if {![file exists $dir] || ![file isdirectory $dir]} {
tk_messageBox \
@@ -811,6 +845,8 @@ itcl::class KIFSD::FSD {
}
# Option separate_folders ON
+ FSnotifications::forget $current_directory
+ FSnotifications::watch $dir [list KIFSD::FSD::static_reload $this]
set current_directory $dir
if {${::KIFSD::FSD::config(separate_folders)} && $option_fileson} {
# Fill up directory ListBox with directories
@@ -818,7 +854,7 @@ itcl::class KIFSD::FSD {
foreach folder [dir_cmd $dir 1] {
if {$folder == {..}} {
set image {up}
- } {
+ } else {
set image {fileopen}
}
$dir_listbox insert end #auto \
@@ -833,7 +869,7 @@ itcl::class KIFSD::FSD {
if {${::KIFSD::FSD::config(detailed_view)}} {
set filename [lindex $file 1]
set file [lindex $file 0]
- } {
+ } else {
set filename $file
}
$file_listbox insert end #auto \
@@ -925,18 +961,18 @@ itcl::class KIFSD::FSD {
}
}
- # Fill up location ComboBox with avaliable files or directories
+ # Fill up location ComboBox with available files or directories
if {$option_fileson} {
$location_cb configure -values [file_cmd $dir $current_mask 1]
- } {
+ } else {
$location_cb configure -values [dir_cmd $dir 1]
}
- $location_cb configure -text {}
+ $location_cb set {}
# Fill up directory ComboBox
set values {}
set folder $dir
- while 1 {
+ while {1} {
lappend values $folder
if {$folder == [file separator]} {break}
if {$::MICROSOFT_WINDOWS} {
@@ -961,10 +997,10 @@ itcl::class KIFSD::FSD {
$dir_combobox icursor end
# Enable / Disable button "Up (Parent folder)"
- if {$dir == [file separator]} {
+ if {$dir == {/} || $dir == "\\"} {
$toolbar.up configure -state disabled
$win.listbox_menu entryconfigure [mc "Up"] -state disabled
- } {
+ } else {
$toolbar.up configure -state normal
$win.listbox_menu entryconfigure [mc "Up"] -state normal
}
@@ -977,7 +1013,7 @@ itcl::class KIFSD::FSD {
reload
}
- ## Show / Hide quick access bar acording to configuration variable quick_access_panel
+ ## Show / Hide quick access bar according to configuration variable quick_access_panel
# @return void
public method quick_access_panel_onoff {} {
# Show the panel
@@ -991,7 +1027,7 @@ itcl::class KIFSD::FSD {
$main_paned_window sash place 0 ${::KIFSD::FSD::config(main_PW_size)} 0
if {$dialog_loaded} {update}
# Hide the panel
- } {
+ } else {
if {[winfo ismapped $main_paned_window]} {
set ::KIFSD::FSD::config(main_PW_size) \
[lindex [$main_paned_window sash coord 0] {0 0}]
@@ -1003,7 +1039,7 @@ itcl::class KIFSD::FSD {
}
}
- ## Show / Hide folders ListBox acording to configuration variable separate_folders
+ ## Show / Hide folders ListBox according to configuration variable separate_folders
# This function will show folders ListBox only if option_fileson == 1
# @return void
public method separate_folders_onoff {} {
@@ -1019,7 +1055,7 @@ itcl::class KIFSD::FSD {
if {$dialog_loaded} {update}
# Hide folders ListBox
- } {
+ } else {
if {[winfo ismapped $right_paned_window]} {
set ::KIFSD::FSD::config(right_PW_size) \
[lindex [$right_paned_window sash coord 0] {0 0}]
@@ -1063,7 +1099,7 @@ itcl::class KIFSD::FSD {
pack forget $dir_listbox_scrollbar
}
# Show scrollbar
- } {
+ } else {
if {![winfo ismapped $dir_listbox_scrollbar]} {
pack $dir_listbox_scrollbar -fill y -expand 1 -after $dir_listbox
}
@@ -1108,7 +1144,7 @@ itcl::class KIFSD::FSD {
# @return void
public method edit_bookmarks {} {
# Create dialog window
- set dialog [toplevel ${win}_edit_bookmarks -class {Edit bookmarks} -bg {#EEEEEE}]
+ set dialog [toplevel $win.edit_bookmarks -class {Edit bookmarks} -bg ${::COMMON_BG_COLOR}]
# Create top frame (ListBox containing bookmarks and its scrollbar)
set top_frame [frame $dialog.top_frame]
@@ -1133,39 +1169,40 @@ itcl::class KIFSD::FSD {
set bottom_frame [frame $dialog.bottom_frame]
# Button: "Remove"
pack [ttk::button $bottom_frame.remove \
- -text "Remove" \
+ -text [::mc "Remove"] \
-compound left \
-image ::ICONS::16::editdelete \
-command "$this edit_bookmarks_remove" \
-width 8 \
- ] -side left
+ ] -side left -padx 2
# Button: "Edit"
pack [ttk::button $bottom_frame.edit \
- -text "Edit" \
+ -text [::mc "Edit"] \
-compound left \
-image ::ICONS::16::edit \
-command "$this edit_bookmarks_edit" \
-width 8 \
- ] -side left
+ ] -side left -padx 2
# Button: "Up"
pack [ttk::button $bottom_frame.up \
- -text "Up" \
+ -text [::mc "Up"] \
-compound left \
-image ::ICONS::16::up \
-command "$this edit_bookmarks_up" \
-width 8 \
- ] -side left
+ ] -side left -padx 2
# Button: "Down"
pack [ttk::button $bottom_frame.down \
- -text "Down" \
+ -text [::mc "Down"] \
-compound left \
-image ::ICONS::16::down \
-command "$this edit_bookmarks_down" \
-width 8 \
- ] -side left
+ ] -side left -padx 2
# Button: "Ok"
pack [ttk::button $bottom_frame.ok \
- -text "Ok" -compound left \
+ -text [::mc "Ok"] \
+ -compound left \
-image ::ICONS::16::ok \
-width 8 \
-command "
@@ -1173,10 +1210,10 @@ itcl::class KIFSD::FSD {
grab release $dialog
destroy $dialog
" \
- ] -side right
+ ] -side right -padx 2
# Button: "Cancel"
pack [ttk::button $bottom_frame.cancel \
- -text "Cancel" \
+ -text [::mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
-width 8 \
@@ -1184,11 +1221,11 @@ itcl::class KIFSD::FSD {
grab release $dialog
destroy $dialog
" \
- ] -side right
+ ] -side right -padx 2
# Pack dialog frames (top and bottom)
- pack $top_frame -side top -fill both -expand 1
- pack $bottom_frame -side top -after $top_frame -fill x -expand 0 -pady 5
+ pack $top_frame -side top -fill both -expand 1 -pady 5 -padx 5
+ pack $bottom_frame -side top -after $top_frame -fill x -expand 0 -pady 5 -padx 5
# Configure dialog window
wm iconphoto $dialog ::ICONS::16::bookmark
@@ -1201,7 +1238,7 @@ itcl::class KIFSD::FSD {
"
if {[winfo ismapped $win]} {
wm transient $dialog $win
- } {
+ } else {
wm transient $dialog .
}
grab $dialog
@@ -1240,7 +1277,7 @@ itcl::class KIFSD::FSD {
![$bookmark_edit_listbox index $item]
||
([llength [$bookmark_edit_listbox items]] < 2)
- } {
+ } then {
return
}
$bookmark_edit_listbox move $item [expr {[$bookmark_edit_listbox index $item] - 1}]
@@ -1256,7 +1293,7 @@ itcl::class KIFSD::FSD {
[$bookmark_edit_listbox index $item]
>=
([llength [$quick_access_bar items]] - 1)
- } {
+ } then {
return
}
$bookmark_edit_listbox move $item [expr {[$bookmark_edit_listbox index $item] + 1}]
@@ -1308,7 +1345,7 @@ itcl::class KIFSD::FSD {
public method activate {} {
wm resizable $win 1 1
wm deiconify $win
- update idle
+ update idletasks
if {[winfo ismapped $right_paned_window]} {
$right_paned_window sash place 0 ${::KIFSD::FSD::config(right_PW_size)} 0
}
@@ -1333,7 +1370,7 @@ itcl::class KIFSD::FSD {
}
return $result
# Return String
- } {
+ } else {
return [file join $current_directory [$location_cb get]]
}
}
@@ -1341,7 +1378,9 @@ itcl::class KIFSD::FSD {
## Destroy dialog object
# @return void
public method close_dialog {} {
- itcl::delete object $this
+ catch {
+ itcl::delete object $this
+ }
}
## Set command to invoke from root namespace on action "Ok"
@@ -1354,17 +1393,23 @@ itcl::class KIFSD::FSD {
## Ok action - command for button "Ok"
# @return void
public method ok {} {
- if {$option_autoclose} {wm withdraw $win}
- uplevel #0 $ok_command
- if {$option_autoclose} {close_dialog}
+ if {$option_autoclose} {
+ wm withdraw $win
+ set ok_command_tmp $ok_command
+ set ok_command {}
+ uplevel #0 $ok_command_tmp
+ close_dialog
+ } else {
+ uplevel #0 $ok_command
+ }
}
## Command for files ListBox horizontal scrollbar
# Takes any list of arguments (see code)
# @return void
public method file_listbox_hscrollbar_cmd args {
- eval "$file_listbox_header xview $args"
eval "$file_listbox xview $args"
+ eval "$file_listbox_header xview $args"
}
## Scroll files ListBox vertically
@@ -1381,7 +1426,7 @@ itcl::class KIFSD::FSD {
}
# Show scrollbar
- } {
+ } else {
if {![winfo ismapped $file_listbox_vscrollbar]} {
pack $file_listbox_vscrollbar \
-after $file_listbox_frame \
@@ -1398,6 +1443,7 @@ itcl::class KIFSD::FSD {
# @parm Float frac1 - 2nd fraction (see Tk manual)
# @return void
public method file_listbox_hscroll {frac0 frac1} {
+
# Hide scrollbar
if {$frac0 == 0 && $frac1 == 1} {
if {[winfo ismapped $file_listbox_hscrollbar]} {
@@ -1406,7 +1452,7 @@ itcl::class KIFSD::FSD {
}
# Show scrollbar
- } {
+ } else {
if {![winfo ismapped $file_listbox_hscrollbar]} {
pack $file_listbox_hscrollbar \
-after $right_top_right_top_frame \
@@ -1423,7 +1469,11 @@ itcl::class KIFSD::FSD {
# @return void
public method quick_access_bar_select {} {
if {$option_doubleclick} {return}
- change_directory [$quick_access_bar itemcget [$quick_access_bar selection get] -data]
+ catch {
+ change_directory \
+ [$quick_access_bar itemcget \
+ [$quick_access_bar selection get] -data]
+ }
}
## Event handler for quick access bar ListBox, item event <Double-1>
@@ -1431,32 +1481,57 @@ itcl::class KIFSD::FSD {
# @return void
public method quick_access_bar_doubleclick {item} {
if {!$option_doubleclick} {return}
- change_directory [$quick_access_bar itemcget [$quick_access_bar selection get] -data]
+ catch {
+ change_directory \
+ [$quick_access_bar itemcget \
+ [$quick_access_bar selection get] -data]
+ }
}
## Event handler for directories ListBox, item event <Double-1>
# @parm String item - Item identifier
# @return void
public method dir_listbox_doubleclick {item} {
+ # Abort if dirs ListBox widget is no longer available
+ if {![winfo exists $dir_listbox]} {
+ return
+ }
if {!$option_doubleclick} {return}
- change_directory [file join $current_directory \
- [$dir_listbox itemcget $item -text]]
+ catch {
+ change_directory [file join $current_directory \
+ [$dir_listbox itemcget $item -text]]
+ }
}
## Event handler for directories ListBox, event <<ListboxSelect>>
# @return void
public method dir_listbox_select {} {
+ # Abort if dirs ListBox widget is no longer available
+ if {![winfo exists $dir_listbox]} {
+ return
+ }
if {$option_doubleclick} {return}
- change_directory [file join $current_directory \
- [$dir_listbox itemcget [$dir_listbox selection get] -text]]
+ catch {
+ change_directory [file normalize [file join $current_directory \
+ [$dir_listbox itemcget [$dir_listbox selection get] -text]]]
+ }
}
## Event handler for files ListBox, item event <Double-1>
# @parm String item - Item identifier
# @return void
public method file_listbox_doubleclick {item} {
- # Item directory or {} if it is file
- set folder [lindex [$file_listbox itemcget $item -data] 1]
+ # Abort if files ListBox widget is no longer available
+ if {![winfo exists $file_listbox]} {
+ return
+ }
+
+ # Item directory or {} if it's a file
+ if {[catch {
+ set folder [lindex [$file_listbox itemcget $item -data] 1]
+ }]} then {
+ return
+ }
if {!$option_fileson} {
if {$folder != {}} {
@@ -1482,7 +1557,7 @@ itcl::class KIFSD::FSD {
public method file_listbox_scroll args {
if {${::KIFSD::FSD::config(detailed_view)}} {
set cmd {yview}
- } {
+ } else {
set cmd {xview}
}
eval "$file_listbox.c $cmd scroll $args"
@@ -1493,7 +1568,7 @@ itcl::class KIFSD::FSD {
public method file_listbox_select {} {
set selection [$file_listbox selection get]
- # Change directory if item was folder
+ # Change directory if the item represents a directory
if {$option_fileson && !${::KIFSD::FSD::config(separate_folders)}} {
set folder [$file_listbox itemcget [lindex $selection end] -data]
set folder [lindex $folder 1]
@@ -1505,7 +1580,7 @@ itcl::class KIFSD::FSD {
}
}
- # Change content of location ComboBox if item was file
+ # Change content of location ComboBox if item is a file
if {[llength $selection] == 1} {
set index [lindex [$file_listbox itemcget $selection -data] [expr {$option_fileson ? 0 : 1}]]
if {$index != {..}} {
@@ -1521,7 +1596,7 @@ itcl::class KIFSD::FSD {
append text [lindex [$file_listbox itemcget $item -data] [expr {$option_fileson ? 0 : 1}]]
append text "\" "
}
- $location_cb configure -text $text
+ $location_cb set $text
}
}
@@ -1558,7 +1633,9 @@ itcl::class KIFSD::FSD {
set item_menu_request 0
return
}
- tk_popup $win.quick_access_panel_menu $x $y
+ catch {
+ tk_popup $win.quick_access_panel_menu $x $y
+ }
}
## Invoke popup menu for particular item in ListBox of Quick access bar
@@ -1575,14 +1652,14 @@ itcl::class KIFSD::FSD {
# Enable / Disabled entry "Move down"
if {$current_item_index >= ($len - 1)} {
$win.quick_access_panel_item_menu entryconfigure [mc "Move down"] -state disabled
- } {
+ } else {
$win.quick_access_panel_item_menu entryconfigure [mc "Move down"] -state normal
}
# Enable / Disabled entry "Move up"
if {!$current_item_index || ($len < 2)} {
$win.quick_access_panel_item_menu entryconfigure [mc "Move up"] -state disabled
- } {
+ } else {
$win.quick_access_panel_item_menu entryconfigure [mc "Move up"] -state normal
}
@@ -1631,7 +1708,7 @@ itcl::class KIFSD::FSD {
## Invoke dialog to add entry to quick access bar
# @return void
public method quick_access_panel_add_entry {} {
- set data [qa_panel_dialog "Add entry" {3} {New entry} {~}]
+ set data [qa_panel_dialog "Add entry" {3} [::mc "New entry"] {~}]
if {![string length [lindex $data 1]]} {return}
if {![string length [lindex $data 2]]} {return}
lappend ::KIFSD::FSD::config(quick_access_bar_data) $data
@@ -1657,9 +1734,9 @@ itcl::class KIFSD::FSD {
# @return void
public method qa_panel_dialog_icon {index} {
for {set i 0} {$i < 4} {incr i} {
- ${win}_qa_panel_dialog.labelframe.button_$i configure -style Flat.TButton
+ ${win}.qa_panel_dialog.labelframe.button_$i configure -style Flat.TButton
}
- ${win}_qa_panel_dialog.labelframe.button_$index configure -style TButton
+ ${win}.qa_panel_dialog.labelframe.button_$index configure -style TButton
set ::KIFSD::FSD::qa_panel_dialog_icon $index
}
@@ -1671,7 +1748,7 @@ itcl::class KIFSD::FSD {
proc not_empty_entry_validator {widget content} {
if {![string length $content]} {
$widget configure -style StringNotFound.TEntry
- } {
+ } else {
$widget configure -style TEntry
}
return 1
@@ -1688,7 +1765,7 @@ itcl::class KIFSD::FSD {
# @return List - {new_icon_number new_name new_url}
private method qa_panel_dialog {title icon name url} {
# Create dialog window
- set dialog [toplevel "${win}_qa_panel_dialog" -class {Configuration dialog} -bg {#EEEEEE}]
+ set dialog [toplevel ${win}.qa_panel_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
# Set dialog variables
set ::KIFSD::FSD::qa_panel_dialog_icon $icon
@@ -1699,11 +1776,11 @@ itcl::class KIFSD::FSD {
set mid_frame [frame $dialog.middle]
# Label: "Name"
grid [label $mid_frame.name_lbl \
- -text "Name" \
+ -text [::mc "Name"] \
] -row 0 -column 0 -sticky w
# Label: "URL"
grid [label $mid_frame.url_lbl \
- -text "URL" \
+ -text [::mc "URL"] \
] -row 1 -column 0 -sticky w
# EntryBox: "Name"
grid [ttk::entry $mid_frame.name_entry \
@@ -1724,7 +1801,7 @@ itcl::class KIFSD::FSD {
# Create frame for selecting icon
pack [ttk::labelframe $dialog.labelframe \
- -text "Icon" \
+ -text [::mc "Icon"] \
] -fill none -expand 1 -anchor w -padx 10
foreach icon {hdd_unmount folder_home desktop bookmark_folder} index {0 1 2 3} {
pack [ttk::button $dialog.labelframe.button_$index \
@@ -1741,7 +1818,7 @@ itcl::class KIFSD::FSD {
set bot_frame [frame $dialog.bot]
# Button: "Ok"
pack [ttk::button $bot_frame.ok \
- -text "Ok" \
+ -text [::mc "Ok"] \
-compound left \
-image ::ICONS::16::ok \
-command "
@@ -1751,11 +1828,11 @@ itcl::class KIFSD::FSD {
destroy $dialog
}
}" \
- ] -side left -fill none -expand 0
+ ] -side left -fill none -expand 0 -padx 2
# Button: "Cancel"
- pack [ttk::button $bot_frame.cancel \
- -text "Cancel" \
- -compound left \
+ pack [ttk::button $bot_frame.cancel \
+ -text [::mc "Cancel"] \
+ -compound left \
-image ::ICONS::16::button_cancel \
-command "
set ::KIFSD::FSD::qa_panel_dialog_url_entry {}
@@ -1763,7 +1840,7 @@ itcl::class KIFSD::FSD {
set ::KIFSD::FSD::qa_panel_dialog_icon {}
grab release $dialog
destroy $dialog" \
- ] -side left -fill none -expand 0
+ ] -side left -fill none -expand 0 -padx 2
pack $bot_frame -anchor e -padx 10 -pady 5
# Configure dialog window
@@ -1871,34 +1948,34 @@ itcl::class KIFSD::FSD {
# Determinate URL to delete
if {$cur_listbox == {dir}} {
set filename [$dir_listbox itemcget $current_item -text]
- } {
+ } else {
set data [$file_listbox itemcget $current_item -data]
if {[lindex $data 0] == {}} {
set filename [lindex $data 1]
- } {
+ } else {
set filename [lindex $data 0]
}
}
if {$filename == {}} {return}
# Invoke confirmation dialog
- if {[tk_messageBox \
- -parent $win \
- -type yesno \
- -icon question \
- -title "Delete file" \
- -message "Do you really want to delete file:\n$filename"]
+ if {[tk_messageBox \
+ -parent $win \
+ -type yesno \
+ -icon question \
+ -title [::mc "Delete file"] \
+ -message [::mc "Do you really want to delete file:\n%s" $filename]]
==
{yes}
- } {
+ } then {
# Delete file/directory (+ invoke error dialog)
if {[catch {file delete -force -- [file join $current_directory $filename]}]} {
tk_messageBox \
-parent $win \
-type ok \
-icon warning \
- -title "Permission denied" \
- -message "Unable to remove file:\n$filename"
+ -title [::mc "Permission denied"] \
+ -message [::mc "Unable to remove file:\n%s" $filename]
}
}
reload
@@ -1921,7 +1998,7 @@ itcl::class KIFSD::FSD {
public method rename_item_command {} {
if {$cur_listbox == {dir}} {
set listbox $dir_listbox
- } {
+ } else {
set listbox $file_listbox
}
@@ -1943,8 +2020,8 @@ itcl::class KIFSD::FSD {
-parent $win \
-type ok \
-icon warning \
- -title "Permission denied" \
- -message "Unable to rename file:\n$original"
+ -title [::mc "Permission denied"] \
+ -message [::mc "Unable to rename file:\n%s" $original]
}
reload
}
@@ -1956,12 +2033,12 @@ itcl::class KIFSD::FSD {
if {$cur_listbox == {dir}} {
set name [$dir_listbox itemcget $current_item -text]
set type "Directory"
- } {
+ } else {
set name [$file_listbox itemcget $current_item -data]
if {[lindex $name 0] == {}} {
set name [lindex $name 1]
set type "Directory"
- } {
+ } else {
set name [lindex $name 0]
set type "File"
}
@@ -1974,8 +2051,8 @@ itcl::class KIFSD::FSD {
-parent $win \
-type ok \
-icon warning \
- -title "Unknown Error" \
- -message "This file apparently does not exist"
+ -title [::mc "Unknown Error"] \
+ -message [::mc "This file apparently does not exist"]
return
}
# Determinate size
@@ -2000,8 +2077,8 @@ itcl::class KIFSD::FSD {
}
# Create dialog window and Notebook
- set dialog [toplevel ${win}_properties_dialog -class {Configuration dialog} -bg {#EEEEEE}]
- set nb [NoteBook $dialog.nb -bg {#EEEEEE}]
+ set dialog [toplevel $win.properties_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
+ set nb [NoteBook $dialog.nb -bg ${::COMMON_BG_COLOR}]
$nb insert end general -text "General"
if {!$::MICROSOFT_WINDOWS} { ;# Microsoft Windows has no file rights (compatible with posix rights)
$nb insert end permission -text "Permissions"
@@ -2014,7 +2091,7 @@ itcl::class KIFSD::FSD {
# Name:
set row 0
grid [label $frame.lbl_$row \
- -text "Name:" -anchor w \
+ -text [::mc "Name:"] -anchor w \
-font $listbox_font_short \
] -column 0 -row $row -sticky w -pady 3
set ::KIFSD::FSD::item_properties(name) $name
@@ -2025,11 +2102,11 @@ itcl::class KIFSD::FSD {
] -column 1 -row $row -sticky w -pady 3
# Type, Location, Size, Modified, Accessed
incr row
- foreach lbl {Type Location Size Modified Accessed} \
+ foreach lbl [list "Type" "Location" "Size" "Modified" "Accessed"] \
value [list $type $current_directory $size $modified $accessed] \
{
grid [label $frame.lbl_$row \
- -text "$lbl:" -anchor w \
+ -text "[::mc $lbl]:" -anchor w \
-font $listbox_font_short \
] -column 0 -row $row -sticky w -pady 3
grid [label $frame.val_lbl_$row \
@@ -2043,15 +2120,16 @@ itcl::class KIFSD::FSD {
if {!$::MICROSOFT_WINDOWS} { ;# Microsoft Windows has no file rights (compatible with posix rights)
set frame [$nb getframe permission]
set ap_frame [ttk::labelframe $frame.ap_frame \
- -text "Access permissions" \
+ -text [::mc "Access permissions"] \
]
set i 0
- foreach text {Class Read Write Exec Owner Group Others} \
+ foreach text [list "Class" "Read" "Write" "Exec" "Owner" "Group" "Others"] \
row {0 0 0 0 1 2 3} \
col {0 1 2 3 0 0 0} \
{
grid [label $ap_frame.lbl_$i \
- -text $text -justify center \
+ -text [::mc $text] \
+ -justify center \
] -row $row -column $col -sticky w -padx 4 -pady 4
incr i
}
@@ -2070,16 +2148,16 @@ itcl::class KIFSD::FSD {
pack $ap_frame -side top -fill x -expand 1 -padx 5 -pady 5 -anchor nw
set own_frame [ttk::labelframe $frame.own_frame \
- -text "Ownership" \
+ -text [::mc "Ownership"] \
]
- grid [label $own_frame.owner_lbl \
- -text "Owner" -font $listbox_font_short \
+ grid [label $own_frame.owner_lbl \
+ -text [::mc "Owner"] -font $listbox_font_short \
] -row 0 -column 0 -padx 10 -pady 3 -sticky w
grid [label $own_frame.owner_val_lbl \
-text $owner -anchor w \
] -row 0 -column 1 -padx 10 -pady 3 -sticky we
- grid [label $own_frame.group_lbl \
- -text "Group" -font $listbox_font_short \
+ grid [label $own_frame.group_lbl \
+ -text [::mc "Group"] -font $listbox_font_short \
] -row 1 -column 0 -padx 10 -pady 3 -sticky w
grid [label $own_frame.group_val_lbl \
-text $group -anchor w \
@@ -2092,27 +2170,27 @@ itcl::class KIFSD::FSD {
# Create bottom frame (buttons: "Ok" and "Cancel")
set bottom_frame [frame $dialog.bottom_frame]
pack [ttk::button $bottom_frame.ok \
- -text "Ok" \
+ -text [::mc "Ok"] \
-compound left \
-image ::ICONS::16::ok \
-command "$this properties_ok $dialog $fullname" \
- ] -side left
+ ] -side left -padx 2
pack [ttk::button $bottom_frame.cancel \
- -text "Cancel" \
+ -text [::mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
-command "
grab release $dialog
destroy $dialog
" \
- ]
+ ] -side left -padx 2
# Pack notebook and bottom frame
pack $nb -fill both -expand 1 -padx 10 -pady 5
pack $bottom_frame -anchor e -after $nb -padx 10 -pady 5
# Configure dialog window
- wm title $dialog "Item properties"
+ wm title $dialog [::mc "Item properties"]
wm minsize $dialog 280 320
wm protocol $dialog WM_DELETE_WINDOW "
grab release $dialog
@@ -2140,9 +2218,12 @@ itcl::class KIFSD::FSD {
}
if {[catch {file attributes $file -permissions "0[format {%o} $perm]"}]} {
set error 1
- tk_messageBox -type ok -icon warning -parent $dialog \
- -title "Permission denied" \
- -message "Unable to change permission for file:\n[file tail $file]"
+ tk_messageBox \
+ -type ok \
+ -icon warning \
+ -parent $dialog \
+ -title [::mc "Permission denied"] \
+ -message [::mc "Unable to change permissions for file:\n%s" [file tail $file]]
}
}
set dir [file dirname $file]
@@ -2152,11 +2233,14 @@ itcl::class KIFSD::FSD {
file rename -force -- \
$file [file join $dir \
${::KIFSD::FSD::item_properties(name)}]}]
- } {
+ } then {
set error 1
- tk_messageBox -type ok -icon warning -parent $dialog \
- -title "Permission denied" \
- -message "Unable to rename file:\n[file tail $file]\n\t=>\n${::KIFSD::FSD::item_properties(name)}"
+ tk_messageBox \
+ -type ok \
+ -icon warning \
+ -parent $dialog \
+ -title [::mc "Permission denied"] \
+ -message [::mc "Unable to rename file:%s" "\n[file tail $file]\n\t=>\n${::KIFSD::FSD::item_properties(name)}"]
}
reload
}
@@ -2176,21 +2260,21 @@ itcl::class KIFSD::FSD {
if {![file exists $content] || ![file isdirectory $content]} {
if {$combobox != {}} {
$combobox configure -style FSD_RedBg.TCombobox
- } {
- $widget configure -bg {#FFDDDD}
+ } else {
+ $widget configure -style FSD_RedBg.TEntry
}
- } {
+ } else {
if {$combobox != {}} {
$combobox configure -style TCombobox
- } {
- $widget configure -bg {#DDFFDD}
+ } else {
+ $widget configure -style TEntry
}
# Fill directory location combobox
if {$combobox != {}} {
set folder $content
set values {}
- while 1 {
+ while {1} {
lappend values $folder
if {$folder == [file separator]} {break}
if {$::MICROSOFT_WINDOWS} {
@@ -2216,9 +2300,10 @@ itcl::class KIFSD::FSD {
}
## Reload content of directories ListBox and files ListBox
+ # @param List args - all arguments are ignored
# @return void
- public method reload {} {
- update idle
+ public method reload {args} {
+ update idletasks
change_directory $current_directory
}
@@ -2231,7 +2316,7 @@ itcl::class KIFSD::FSD {
## Go to parrent folder
# @return void
public method up {} {
- change_directory [file join $current_directory {..}]
+ change_directory [file normalize [file join $current_directory {..}]]
}
## Go back in history
@@ -2260,7 +2345,7 @@ itcl::class KIFSD::FSD {
if {![llength $back_history]} {
$toolbar.back configure -state disabled
$win.listbox_menu entryconfigure [mc "Back"] -state disabled
- } {
+ } else {
$toolbar.back configure -state normal
$win.listbox_menu entryconfigure [mc "Back"] -state normal
}
@@ -2294,7 +2379,7 @@ itcl::class KIFSD::FSD {
if {![llength $forward_history]} {
$toolbar.forward configure -state disabled
$win.listbox_menu entryconfigure [mc "Forward"] -state disabled
- } {
+ } else {
$toolbar.forward configure -state normal
$win.listbox_menu entryconfigure [mc "Forward"] -state normal
}
@@ -2306,7 +2391,7 @@ itcl::class KIFSD::FSD {
# @return void
public method newdir {} {
# Create dialog window
- set dialog [toplevel ${win}_new_dir -class {New directory} -bg {#EEEEEE}]
+ set dialog [toplevel $win.new_dir -class {New directory} -bg ${::COMMON_BG_COLOR}]
# Create dialog header and EntryBox
pack [label $dialog.header -justify left -text [mc "Create new folder in:\n%s" $current_directory]] \
@@ -2325,13 +2410,13 @@ itcl::class KIFSD::FSD {
-compound left \
-image ::ICONS::16::clear_left \
-command "$dialog.entry delete 0 end" \
- ] -side left -expand 0
+ ] -side left -expand 0 -padx 2
pack [ttk::button $button_frame.ok \
-text [mc "Ok"] \
-compound left \
-image ::ICONS::16::ok \
-command [list $this create_new_folder] \
- ] -side left -expand 0
+ ] -side left -expand 0 -padx 2
pack [ttk::button $button_frame.cancel \
-text [mc "Cancel"] \
-compound left \
@@ -2340,7 +2425,7 @@ itcl::class KIFSD::FSD {
grab release $dialog
destroy $dialog
" \
- ] -side left -expand 0
+ ] -side left -expand 0 -padx 2
pack $button_frame -side bottom -anchor e -expand 0 -padx 5 -pady 5
# Configure dialog window
@@ -2363,7 +2448,7 @@ itcl::class KIFSD::FSD {
## Confirm dialog "Create new folder"
# @return void
public method create_new_folder {} {
- set dialog "${win}_new_dir"
+ set dialog ${win}.new_dir
set folder [$dialog.entry get]
set error 0
@@ -2377,7 +2462,7 @@ itcl::class KIFSD::FSD {
-type ok \
-title [mc "Unable to create folder"] \
-message [mc "Unable to create the specified folder"]
- } {
+ } else {
grab release $dialog
destroy $dialog
reload
@@ -2393,22 +2478,22 @@ itcl::class KIFSD::FSD {
# Determinate sorting order
if {${::KIFSD::FSD::config(reverse_sorting)}} {
set order "-decreasing"
- } {
+ } else {
set order "-increasing"
}
if {${::KIFSD::FSD::config(sorting)} == {name}} {
if {${::KIFSD::FSD::config(case_insensitive)}} {
set method "-dictionary"
- } {
+ } else {
set method "-ascii"
}
return [lsort $method $order $items]
- } {
+ } else {
if {${::KIFSD::FSD::config(sorting)} == {size}} {
# Sort by size
set index 2
- } {
+ } else {
# Sort by date
set index 1
}
@@ -2516,7 +2601,7 @@ itcl::class KIFSD::FSD {
[file mtime [file join $dir $file]] \
[file size [file join $dir $file]] \
]
- }]} {
+ }]} then {
lappend result [list $file 0 0]
}
}
@@ -2532,7 +2617,7 @@ itcl::class KIFSD::FSD {
[file mtime [file join $dir $file]] \
[file size [file join $dir $file]] \
]
- }]} {
+ }]} then {
lappend result [list $file 0 0]
}
}
@@ -2542,62 +2627,46 @@ itcl::class KIFSD::FSD {
}
## Get list of items to load to directories ListBox
- # @parm String - Source directory
- # @parm Bool = 0 - No details
+ # @parm String dir - Source directory
+ # @parm Bool no_detail=0 - No details
# @return List - {text text ...}
- proc dir_cmd args {
- # Parse input arguments
- set dir [lindex $args 0]
- set no_detail [lindex $args 1]
- if {$no_detail == {}} {
- set no_detail 0
- }
-
+ proc dir_cmd {dir {no_detail 0}} {
# Normalize directory and determinate its parent
set dir [file normalize $dir]
if {$dir != {/}} {
set parent {..}
- } {
+ } else {
set parent {}
}
if {${::KIFSD::FSD::config(sorting)} == {name}} {
set result [sort_items [get_dirs_simple $dir]]
- } {
+ } else {
set result [sort_items [get_dirs_extended $dir]]
}
if {!$no_detail && ${::KIFSD::FSD::config(detailed_view)}} {
return [concat $parent [add_details $result $dir]]
- } {
+ } else {
return [concat $parent $result]
}
}
## Get list of items to load to files ListBox
- # @parm String - Source directory
- # @parm GLOB - GLOB expression which must match each returned file
- # @parm Bool = 0 - Detailed view
+ # @parm String dir - Source directory
+ # @parm GLOB mask - GLOB expression which must match each returned file
+ # @parm Bool no_detail=0 - Detailed view
# @return List - {text text ...}
- proc file_cmd args {
- # Parse input arguments
- set dir [lindex $args 0]
- set mask [lindex $args 1]
- set no_detail [lindex $args 2]
- if {$no_detail == {}} {
- set no_detail 0
- }
-
-
+ proc file_cmd {dir mask {no_detail 0}} {
if {${::KIFSD::FSD::config(sorting)} == {name}} {
set result [sort_items [get_files_simple $dir $mask]]
- } {
+ } else {
set result [sort_items [get_files_extended $dir $mask]]
}
if {!$no_detail && ${::KIFSD::FSD::config(detailed_view)}} {
return [add_details $result $dir]
- } {
+ } else {
return $result
}
}
@@ -2617,7 +2686,7 @@ itcl::class KIFSD::FSD {
append line {...}
}
if {[catch {
- append line [string repeat "\t" [expr {4 - ([string length $line] / 8)}]]
+ append line [string repeat { } [expr {35 - [string length $line]}]]
set size [file size $fullfilename]
if {$size < 1024} {
append size { B}
@@ -2625,7 +2694,7 @@ itcl::class KIFSD::FSD {
set size [expr {($size * 10) / 1024}]
if {$size > 1023} {
set size [expr {$size / 10}]
- } {
+ } else {
set size [string range $size 0 {end-1}].[string range $size end end]
}
append size { kB}
@@ -2633,7 +2702,7 @@ itcl::class KIFSD::FSD {
set size [expr {($size * 10) / 1048576}]
if {$size > 1023} {
set size [expr {$size / 10}]
- } {
+ } else {
set size [string range $size 0 {end-1}].[string range $size end end]
}
append size { MB}
@@ -2641,21 +2710,21 @@ itcl::class KIFSD::FSD {
set size [expr {($size * 10) / 1073741824}]
if {$size > 1023} {
set size [expr {$size / 10}]
- } {
+ } else {
set size [string range $size 0 {end-1}].[string range $size end end]
}
append size { GB}
} else {
set size {>1TB}
}
- }]} {
+ }]} then {
append line { - ---- -------- -----}
} else {
if {!$::MICROSOFT_WINDOWS} {
append line [string repeat { } [expr {8 - [string length $size]}]] $size " " \
[string range [lindex [file attributes $fullfilename] 5] {end-3} end] " " \
[clock format [file mtime $fullfilename] -format {%D %R}]
- } {
+ } else {
append line [string repeat { } [expr {8 - [string length $size]}]] $size " " \
[clock format [file mtime $fullfilename] -format {%D %R}]
}
@@ -2676,12 +2745,12 @@ itcl::class KIFSD::FSD {
# Determinate list of directories
if {${::KIFSD::FSD::config(sorting)} == {name}} {
set result [concat [get_dirs_simple $dir] [get_files_simple $dir $mask]]
- } {
+ } else {
set result [concat [get_dirs_extended $dir] [get_files_extended $dir $mask]]
}
if {$dir != {/}} {
set parent [list [list {..} {u}]]
- } {
+ } else {
set parent {}
}
set tmp_result {}
@@ -2692,16 +2761,16 @@ itcl::class KIFSD::FSD {
if {![file exists [file join $dir $item]]} {continue}
if {[file isdirectory [file join $dir $item]]} {
lappend tmp_result [concat [add_details [list $item] $dir] d]
- } {
+ } else {
lappend tmp_result [concat [add_details [list $item] $dir] f]
}
}
- } {
+ } else {
foreach item [sort_items $result] {
if {![file exists [file join $dir $item]]} {continue}
if {[file isdirectory [file join $dir $item]]} {
lappend tmp_result [list $item d]
- } {
+ } else {
lappend tmp_result [list $item f]
}
}
@@ -2722,12 +2791,13 @@ itcl::class KIFSD::FSD {
if {$config == {}} {
return
}
+
if {[catch {
array set ::KIFSD::FSD::config $config
- }]} {
+ }]} then {
puts stderr "KI File Selection Dialog: Unable to load the given configuration string -- using default"
return 0
- } {
+ } else {
return 1
}
}
@@ -2737,6 +2807,27 @@ itcl::class KIFSD::FSD {
public method get_window_name {} {
return $win
}
+
+ ## Determinate path to the "Desktop" folder.
+ # @return String - The path, e.g. "~/Arbeitsfläche" in case of German Ubuntu.
+ proc get_desktop_dir {} {
+ if {![catch {
+ set f [open "~/.config/user-dirs.dirs" "r"]
+ }]} then {
+ while {![eof $f]} {
+ set l [gets $f]
+ if {[string first "XDG_DESKTOP_DIR=" $l] != -1} {
+ if {[regexp {"[^\"]+"} $l d]} {
+ set d [string range $d 1 end-1]
+ regsub {\$HOME} $d {~} d
+ return $d
+ }
+ }
+ }
+ close $f
+ }
+ return "~/Desktop"
+ }
}
## Text variables for dialog "Edit entry in Quick access bar"
@@ -2746,7 +2837,6 @@ set KIFSD::FSD::qa_panel_dialog_icon {} ;# Icon number [0;3]
## Dialog configuration array (these values are daults)
# Invalid configuration list may cause program error !
-
array set KIFSD::FSD::config {
win_geometry {720x380}
detailed_view 0
@@ -2760,11 +2850,6 @@ array set KIFSD::FSD::config {
right_PW_size 200
main_PW_size 180
bookmarks {}
- quick_access_bar_data {
- {0 {/} {/}}
- {1 {Home} {~}}
- {2 {Desktop} {~/Desktop}}
- }
}
if {$::MICROSOFT_WINDOWS} {
@@ -2772,4 +2857,15 @@ if {$::MICROSOFT_WINDOWS} {
{0 {System Drive ${::env(SystemDrive)}} {${::env(SystemDrive)}}}
{1 {Documents and Settings} {${::env(USERPROFILE)}}}
}]
+} else {
+ set KIFSD::FSD::config(quick_access_bar_data) [subst {
+ {0 {/} {/}}
+ {0 {Removable media} {/media}}
+ {1 {Home} {~}}
+ {2 {Desktop} {[KIFSD::FSD::get_desktop_dir]}}
+ }]
+}
+
+# >>> File inclusion guard
}
+# <<< File inclusion guard
diff --git a/lib/dialogs/my_tk_messageBox.tcl b/lib/dialogues/my_tk_messageBox.tcl
index 1a559fe..0698e9e 100755..100644
--- a/lib/dialogs/my_tk_messageBox.tcl
+++ b/lib/dialogues/my_tk_messageBox.tcl
@@ -2,7 +2,7 @@
# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
############################################################################
-# Copyright (C) 2009 by Martin Ošmera #
+# Copyright (C) 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 _MY_TK_MESSAGEBOX_TCL ] } {
+set _MY_TK_MESSAGEBOX_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Replacement for Tk's tk_messageBox. Usage is the same as tk_messageBox,
@@ -34,6 +39,7 @@ namespace eval my_tk_messageBox {
## Namespace variables
variable return_value {} ;# String: Dialog return value (e.g. "abort")
variable dialog ;# Widget: Dialog toplevel window
+ variable count 0 ;# Int: Counter of object instances
# Buttons available in the dialog
variable available_buttons {
abort retry ignore
@@ -60,9 +66,11 @@ namespace eval my_tk_messageBox {
variable button_icons ;# Icons for available buttons
variable available_buttons ;# Buttons available in the dialog
variable dialog ;# Widget: Dialog toplevel window
+ variable count ;# Int: Counter of object instances
- set dialog [toplevel .my_tk_messageBox]
+ set dialog [toplevel .my_tk_messageBox_${count}]
set buttons [list]
+ incr count
# Translate icon name
switch -- $arg_icon {
@@ -119,8 +127,8 @@ namespace eval my_tk_messageBox {
# Create top frame (dialog icon and text of the message)
set top_frame [frame $dialog.top]
- pack [label $top_frame.img -image ::ICONS::32::$arg_icon] -side left
- pack [label $top_frame.txt -text $arg_message -wraplength 300] -side left -fill both
+ pack [label $top_frame.img -image ::ICONS::32::$arg_icon] -side left -padx 5
+ pack [label $top_frame.txt -text $arg_message -wraplength 300 -justify left] -side left -fill both -padx 5
# Create bottom bar with dialog buttons
set bottom_frame [frame $dialog.bottom]
@@ -139,10 +147,15 @@ namespace eval my_tk_messageBox {
] -side left -padx 2
bind $bottom_frame.button_${button} <Return> "::my_tk_messageBox::button_press $button"
bind $bottom_frame.button_${button} <KP_Enter> "::my_tk_messageBox::button_press $button"
+ bind $bottom_frame.button_${button} <Escape> "
+ grab release $dialog
+ destroy $dialog
+ set ::my_tk_messageBox::return_value {}
+ "
}
# Pack window frames
- pack $top_frame -expand 1 -padx 10 -pady 10
+ pack $top_frame -expand 1 -pady 10 -padx 5
pack $bottom_frame -padx 5 -pady 10
# Window manager options -- modal window
@@ -159,7 +172,9 @@ namespace eval my_tk_messageBox {
set ::my_tk_messageBox::return_value {}
"
update
- grab $dialog
+ catch {
+ grab $dialog
+ }
# Wait for user response
tkwait window $dialog
@@ -191,7 +206,8 @@ namespace eval my_tk_messageBox {
foreach subdir {16x16 32x32} ns {16 32} icons {
{cancel info help status_unknown ok button_cancel reload forward no}
{messagebox_critical messagebox_info help messagebox_warning button_ok}
- } {
+ } \
+ {
foreach icon $icons {
set filename [file join $directory {../icons} $subdir "${icon}.png"]
@@ -266,7 +282,7 @@ proc my_tk_messageBox args {
if {![string length $arg_title]} {
if {![string length $arg_icon]} {
set arg_title {Message}
- } {
+ } else {
set arg_title [string toupper [string index $arg_icon 0]]
append arg_title [string range $arg_icon 1 end]
}
@@ -281,3 +297,7 @@ proc my_tk_messageBox args {
# Replace Tk's command "tk_messageBox"
rename tk_messageBox old_tk_messageBox
rename my_tk_messageBox tk_messageBox
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/dialogs/selectmcu.tcl b/lib/dialogues/selectmcu.tcl
index 86d2fae..584a59f 100755..100644
--- a/lib/dialogs/selectmcu.tcl
+++ b/lib/dialogues/selectmcu.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 _SELECTMCU_TCL ] } {
+set _SELECTMCU_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# This namespace implements "MCU selection" dialog.
@@ -36,8 +41,8 @@
# Other functions
# ==================================
#
-# SelectMCU::get_avaliable_processors
-# -> List of avaliable processors (e.g. {80C51 AT89C52 AT89C4051})
+# SelectMCU::get_available_processors
+# -> List of available processors (e.g. {80C51 AT89C52 AT89C4051})
#
# SelectMCU::get_processor_details processor_type
# -> List of MCU definition (see proc. xml_data_parser1)
@@ -45,21 +50,22 @@
namespace eval SelectMCU {
# String: Path to MCUs definition file
- variable definition_file "${::LIB_DIRNAME}/../data/mcus.xml"
- # List: Avaliable MCU vendors
- variable vendors {all Atmel Intel}
+ variable definition_file "${::ROOT_DIRNAME}/data/mcus.xml"
+ # List: available MCU vendors
+ variable vendors [list [mc "all"] "Atmel" "Intel"]
variable selected_mcu {} ;# List: Dialog return value {mcu_type xdata xcode}
variable definition_data {} ;# List: Values gained from $definition_file
- variable mcu_names {} ;# List: Avaliable processors
- variable maximum_xcode 0xFFFF ;# Int: Maximum external program memory (0xFFFF - internal)
- variable vendor {all} ;# String: Selected vendor
+ variable local_definition_data {} ;# List: Basically the same as $definition_data but containing only the shown items
+ variable mcu_names {} ;# List: Available processors (and show in the list)
+ variable maximum_xcode 0x10000 ;# Int: Maximum external program memory (0x10000 - internal)
+ variable vendor [mc "all"] ;# String: Selected vendor
## Variables related to GUI
variable parent ;# Widget: Dialog parent (another window)
variable win ;# Widget: Dialog window
variable search_bar ;# Widget: Search bar entry box
variable search_bar_clear ;# Widget: Search bar clear button
- variable listbox_widget ;# Widget: List box containing avaliable MCUs
+ variable listbox_widget ;# Widget: List box containing available MCUs
variable value_lbl_uart ;# Widget: Label "UART:" - value
variable value_lbl_voltage ;# Widget: Label "Operating voltage:" - value
variable value_lbl_interrupts ;# Widget: Label "Interrupts:" - value
@@ -68,9 +74,9 @@ namespace eval SelectMCU {
variable more_details_text ;# Widget: TextWidget "More details:"
variable more_details_scrollbar ;# Widget: Scrollbar for $more_details_text
variable details_xdata_aval ;# Widget: Frame containing scale and spinbox for XDATA memory
- variable details_xdata_note ;# Widget: Frame containing label "NOT AVALIABLE" for XDATA memory
+ variable details_xdata_note ;# Widget: Frame containing label "NOT available" for XDATA memory
variable details_xcode_aval ;# Widget: Frame containing scale and spinbox for XCODE memory
- variable details_xcode_nota ;# Widget: Frame containing label "NOT AVALIABLE" for XCODE memory
+ variable details_xcode_nota ;# Widget: Frame containing label "NOT available" for XCODE memory
variable name_label ;# Widget: Label containing name of selected MCU
variable image_label ;# Widget: Label with image for selected MCU
variable xdata_scale ;# Widget: Scale for XDATA memory
@@ -86,31 +92,36 @@ namespace eval SelectMCU {
variable current_mcu ;# String: Name of MCU currently being parsed
## Fonts used in the selection dialog
- # ListBox containing avaliable fonts
- variable listbox_widget_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -14 \
- -weight bold \
- ]
- # ListBox header -- label widget above the ListBox
- variable listbox_header_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -14 \
- ]
- # Label with the MCU name
- variable name_font [font create \
- -family {helvetica} -size -20 \
- -weight bold \
- ]
- # Labels like "Vendor:", "UART:", "Timers:", etc.
- variable normal_font [font create \
- -family {helvetica} -size -12 \
- ]
- # Labels with values like for "Vendor:", "Timers:", etc.
- variable bold_font [font create \
- -family {helvetica} -size -12 \
- -weight bold \
- ]
+ if {$::GUI_AVAILABLE} {
+ # ListBox containing available fonts
+ variable listbox_widget_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight bold \
+ ]
+ # ListBox header -- label widget above the ListBox
+ variable listbox_header_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ ]
+ # Label with the MCU name
+ variable name_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-20 * $::font_size_factor)}] \
+ -weight bold \
+ ]
+ # Labels like "Vendor:", "UART:", "Timers:", etc.
+ variable normal_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ ]
+ # Labels with values like for "Vendor:", "Timers:", etc.
+ variable bold_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
+ ]
+ }
## Invoke MCU selection dialog
# @parm Widget Parent - Dialog parent (some window)
@@ -138,7 +149,11 @@ namespace eval SelectMCU {
# Finalize window creation
wm iconphoto $win ::ICONS::16::kcmmemory
wm title $win [mc "Choose MCU - MCU 8051 IDE"]
- wm minsize $win 720 500
+ if {$::font_size_factor > 1.0} {
+ wm minsize $win 870 500
+ } else {
+ wm minsize $win 720 500
+ }
wm protocol $win WM_DELETE_WINDOW {
::SelectMCU::cancel
}
@@ -148,14 +163,18 @@ namespace eval SelectMCU {
grab $win
}
- # Initialize XDATA & XCODE scales
+ # Initialize search bar
$search_bar insert end [lindex $initial 0]
focus -force $search_bar
$search_bar selection range 0 end
+
+ set selected_mcu [lindex $initial 0]
+
+ # Initialize XDATA & XCODE scales
if {[lindex $initial 1]} {
set ::SelectMCU::xdata_ena 1
set ::SelectMCU::xdata_value [lindex $initial 1]
- } {
+ } else {
set ::SelectMCU::xdata_ena 0
set ::SelectMCU::xdata_value 0
xdata_disena
@@ -163,27 +182,27 @@ namespace eval SelectMCU {
if {[lindex $initial 2]} {
set ::SelectMCU::xcode_ena 1
set ::SelectMCU::xcode_value [lindex $initial 2]
- } {
+ } else {
set ::SelectMCU::xcode_ena 0
set ::SelectMCU::xcode_value 0
xcode_disena
}
- # Diplay window
+ # Wait until the window is destroyed
tkwait window $win
# Create resulting string
if {$selected_mcu == {}} {
set result {}
- } {
+ } else {
if {${::SelectMCU::xdata_ena}} {
set xdata ${::SelectMCU::xdata_value}
- } {
+ } else {
set xdata 0
}
- if {${::SelectMCU::xcode_value}} {
+ if {${::SelectMCU::xcode_ena}} {
set xcode ${::SelectMCU::xcode_value}
- } {
+ } else {
set xcode 0
}
@@ -203,18 +222,24 @@ namespace eval SelectMCU {
# @return void
proc fill_gui {} {
variable definition_data ;# List: Values gained from $definition_file
- variable listbox_widget ;# Widget: List box containing avaliable MCUs
- variable listbox_widget_font ;# ListBox containing avaliable fonts
- variable mcu_names ;# List: Avaliable processors
+ variable local_definition_data ;# List: Basically the same as $definition_data but containing only the shown items
+ variable listbox_widget ;# Widget: List box containing available MCUs
+ variable listbox_widget_font ;# ListBox containing available fonts
+ variable mcu_names ;# List: available processors
variable vendor ;# String: Selected vendor
+ set mcu_names {}
+ set local_definition_data {}
+
# Iterate over defined MCUs
foreach mcu $definition_data {
# Filter specific vendors
- if {$vendor != {all} && [lindex $mcu 11] != $vendor} {
+ if {$vendor != [mc "all"] && [lindex $mcu 11] != $vendor} {
continue
}
+ lappend local_definition_data $mcu
+
# MCU type
set mcu_type [lindex $mcu 0]
lappend mcu_names $mcu_type
@@ -253,7 +278,7 @@ namespace eval SelectMCU {
variable win ;# Widget: Dialog window
variable search_bar ;# Widget: Search bar entry box
variable search_bar_clear ;# Widget: Search bar clear button
- variable listbox_widget ;# Widget: List box containing avaliable MCUs
+ variable listbox_widget ;# Widget: List box containing available MCUs
variable value_lbl_uart ;# Widget: Label "UART:" - value
variable value_lbl_voltage ;# Widget: Label "Operating voltage:" - value
variable value_lbl_interrupts ;# Widget: Label "Interrupts:" - value
@@ -262,10 +287,10 @@ namespace eval SelectMCU {
variable more_details_text ;# Widget: TextWidget "More details:"
variable more_details_scrollbar ;# Widget: Scrollbar for $more_details_text
variable details_xdata_aval ;# Widget: Frame containing scale and spinbox for XDATA memory
- variable details_xdata_note ;# Widget: Frame containing label "NOT AVALIABLE" for XDATA memory
+ variable details_xdata_note ;# Widget: Frame containing label "NOT available" for XDATA memory
variable details_xcode_aval ;# Widget: Frame containing scale and spinbox for XCODE memory
- variable details_xcode_nota ;# Widget: Frame containing label "NOT AVALIABLE" for XCODE memory
- variable listbox_widget_font ;# ListBox containing avaliable fonts
+ variable details_xcode_nota ;# Widget: Frame containing label "NOT available" for XCODE memory
+ variable listbox_widget_font ;# ListBox containing available fonts
variable listbox_header_font ;# ListBox header -- label widget above the ListBox
variable bold_font ;# Labels with values like for "Vendor:", "Timers:", etc.
variable normal_font ;# Labels like "Vendor:", "UART:", "Timers:", etc.
@@ -276,10 +301,10 @@ namespace eval SelectMCU {
variable xdata_spinbox ;# Widget: Scale for XDATA memory
variable xcode_spinbox ;# Widget: SpinBox for XCODE memory
variable xcode_scale ;# Widget: Scale for XCODE memory
- variable vendors ;# List: Avaliable MCU vendors
+ variable vendors ;# List: available MCU vendors
# Create toplevel window
- set win [toplevel .selectmcu_dialog -class {Select MCU} -bg {#EEEEEE}]
+ set win [toplevel .selectmcu_dialog -class {Select MCU} -bg ${::COMMON_BG_COLOR}]
# Create search bar widgets (but don't pack them)
set search_bar_frame [frame $win.search_bar_frame]
@@ -326,7 +351,7 @@ namespace eval SelectMCU {
-font $listbox_header_font \
-bg {#DDDDDD} -bd 0 -padx 25 \
-justify left -anchor w \
- -text [mc "Processor type\t\tCODE mem. IDATA mem. IO lines Frequency"] \
+ -text [mc "Processor Type\t\tCODE/PMEM IDATA/IRAM GPIO Frequency"] \
] -fill x
# Create remaining parts of top frame and pack them
@@ -369,7 +394,7 @@ namespace eval SelectMCU {
-image [image create photo] -text { } \
-width 200 -height 200 -compound left \
]
- DynamicHelp::add $image_label -text [mc "One of avaliable packages for selected microcontroller"]
+ DynamicHelp::add $image_label -text [mc "One of available packages for selected microcontroller"]
pack $name_label -fill x
pack $image_label -padx 5
@@ -410,7 +435,7 @@ namespace eval SelectMCU {
set more_details_text [text $details_middle_bottom.text \
-yscrollcommand ::SelectMCU::details_scrollbar_set \
-width 0 -heigh 0 -bd 0 -relief flat -font $bold_font \
- -highlightthickness 0 -state disabled -bg {#EEEEEE} \
+ -highlightthickness 0 -state disabled -bg ${::COMMON_BG_COLOR} \
-cursor left_ptr -fg {#555555} -wrap word \
]
set more_details_scrollbar [ttk::scrollbar \
@@ -426,16 +451,16 @@ namespace eval SelectMCU {
# Cretate XDATA and XCODE scales and such
set details_right_top [ttk::labelframe $details_right.top \
- -text [mc "External RAM"] \
+ -text [mc "External RAM (XDATA)"] \
]
set details_right_bottom [ttk::labelframe $details_right.bottom \
- -text [mc "External Program Memory"] \
+ -text [mc "External ROM/FLASH (XCODE)"] \
]
- set details_xdata_note [label $details_right_top.not_avaliable \
- -text [mc "NOT AVALIABLE"] -fg {#FF8888} \
+ set details_xdata_note [label $details_right_top.not_available \
+ -text [mc "NOT available"] -fg {#FF8888} \
]
- set details_xdata_aval [frame $details_right_top.avaliable]
+ set details_xdata_aval [frame $details_right_top.available]
pack [checkbutton $details_xdata_aval.checkbutton \
-variable ::SelectMCU::xdata_ena \
-text [mc "Enable"] \
@@ -447,7 +472,7 @@ namespace eval SelectMCU {
set xdata_scale [ttk::scale $details_right_top_btm.scale \
-orient horizontal \
-variable ::SelectMCU::xdata_value \
- -from 0 -to 0xFFFF \
+ -from 0 -to 0x10000 \
-command "
set ::SelectMCU::xdata_value \[expr {int(\${::SelectMCU::xdata_value})}\]
$details_right_top_btm.spinbox selection range 0 end
@@ -456,22 +481,21 @@ namespace eval SelectMCU {
DynamicHelp::add $details_right_top_btm.scale \
-text [mc "Amount of external data memory"]
pack $xdata_scale -fill x -side left -expand 1 -padx 2
- set xdata_spinbox [spinbox $details_right_top_btm.spinbox \
- -textvariable ::SelectMCU::xdata_value \
- -width 5 -from 0 -to 0xFFFF \
- -bg white -validate all \
- -vcmd {::SelectMCU::validate_xdata %P} \
- -command "$details_right_top_btm.spinbox selection range 0 end ;#" \
+ set xdata_spinbox [ttk::spinbox $details_right_top_btm.spinbox \
+ -textvariable ::SelectMCU::xdata_value \
+ -width 5 -from 0 -to 0x10000 \
+ -validate all \
+ -validatecommand {::SelectMCU::validate_xdata %P} \
]
DynamicHelp::add $details_right_top_btm.spinbox \
-text [mc "Amount of external data memory"]
pack $xdata_spinbox -side right -after $details_right_top_btm.scale
pack $details_right_top_btm -fill both -expand 1
- set details_xcode_nota [label $details_right_bottom.not_avaliable \
- -text [mc "NOT AVALIABLE"] -fg {#FF8888} \
+ set details_xcode_nota [label $details_right_bottom.not_available \
+ -text [mc "NOT available"] -fg {#FF8888} \
]
- set details_xcode_aval [frame $details_right_bottom.avaliable]
+ set details_xcode_aval [frame $details_right_bottom.available]
pack [checkbutton $details_xcode_aval.checkbutton \
-variable ::SelectMCU::xcode_ena \
-text [mc "Enable"] \
@@ -483,7 +507,7 @@ namespace eval SelectMCU {
set xcode_scale [ttk::scale $details_right_bottom_btm.scale \
-orient horizontal \
-variable ::SelectMCU::xcode_value \
- -from 0 -to 0xFFFF \
+ -from 0 -to 0x10000 \
-command "
set ::SelectMCU::xcode_value \[expr {int(\${::SelectMCU::xcode_value})}\]
#" \
@@ -491,11 +515,11 @@ namespace eval SelectMCU {
DynamicHelp::add $details_right_bottom_btm.scale \
-text [mc "Amount of total program memory minus internal program memory"]
pack $xcode_scale -fill x -side left -expand 1 -padx 2
- set xcode_spinbox [spinbox $details_right_bottom_btm.spinbox \
- -textvariable ::SelectMCU::xcode_value \
- -width 5 -from 0 -to 0xFFFF \
- -bg white -validate all \
- -vcmd {::SelectMCU::validate_xcode %P} \
+ set xcode_spinbox [ttk::spinbox $details_right_bottom_btm.spinbox \
+ -textvariable ::SelectMCU::xcode_value \
+ -width 5 -from 0 -to 0x10000 \
+ -validate all \
+ -validatecommand {::SelectMCU::validate_xcode %P} \
]
DynamicHelp::add $details_right_bottom_btm.spinbox \
-text [mc "Amount of total program memory minus internal program memory"]
@@ -521,22 +545,22 @@ namespace eval SelectMCU {
-compound left \
-image ::ICONS::16::ok \
-command {::SelectMCU::close_window} \
- ] -side left
+ ] -side left -padx 2
pack [ttk::button $buttonFrame.cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
-command {::SelectMCU::cancel} \
- ] -side left
+ ] -side left -padx 2
pack [ttk::separator $win.sep -orient horizontal] -fill x
- pack $buttonFrame -side bottom -after $details_frame -anchor e -padx 10 -pady 5
+ pack $buttonFrame -side bottom -after $details_frame -anchor e -padx 5 -pady 5
}
## Close MCU selection dialog and force its return value to an empty string
# @return void
proc close_window {} {
variable definition_data ;# List: Values gained from $definition_file
- variable mcu_names ;# List: Avaliable processors
+ variable mcu_names ;# List: available processors
variable win ;# Widget: Dialog window
set definition_data {}
@@ -565,7 +589,7 @@ namespace eval SelectMCU {
# Open definition file
if {[catch {
set file [open $definition_file {r}]
- }]} {
+ }]} then {
tk_messageBox \
-parent $parent \
-type ok \
@@ -587,19 +611,19 @@ namespace eval SelectMCU {
if {$mcu_definition != {}} {
foreach val $mcu_definition {
if {$val == {}} {
- error "Incomplite definition for [lindex $mcu_definition 0]"
+ error "Incomplete definition for [lindex $mcu_definition 0]"
}
}
lappend definition_data $mcu_definition
}
- } result]} {
+ } result]} then {
set definition_data {}
tk_messageBox \
-parent $parent \
-icon warning \
-type ok \
-title [mc "Error"] \
- -message [mc "MCUs database file is currupted,\nplease check your installation"]
+ -message [mc "MCUs database file is corrupted (code:600),\nplease check your installation"]
puts stderr $result
close $file
return 0
@@ -613,7 +637,7 @@ namespace eval SelectMCU {
## Get list of MCUs defined in the database
# @return List - Defined processors (e.g. {8051 AT89C2051 ...})
- proc get_avaliable_processors {} {
+ proc get_available_processors {} {
variable definition_data ;# List: Values gained from $definition_file
variable definition_file ;# String: Path to MCUs definition file
variable expected ;# String: Expected next XML element
@@ -625,7 +649,7 @@ namespace eval SelectMCU {
# Open database file
if {[catch {
set file [open $definition_file {r}]
- }]} {
+ }]} then {
puts stderr "Unable to open file containing supported MCUs, please check your installation"
return {}
}
@@ -638,9 +662,9 @@ namespace eval SelectMCU {
# Start XML parser
if {[catch {
$parser parse [read $file]
- } result]} {
+ } result]} then {
set definition_data {}
- puts stderr "MCUs database file is currupted,\nplease check your installation"
+ puts stderr "MCUs database file is corrupted (code:641),\nplease check your installation"
puts stderr $result
}
@@ -671,7 +695,7 @@ namespace eval SelectMCU {
# Open database file
if {[catch {
set file [open $definition_file {r}]
- }]} {
+ }]} then {
puts stderr "Unable to open file containing supported MCUs, please check your installation"
return {}
}
@@ -685,9 +709,9 @@ namespace eval SelectMCU {
# Start XML parser
if {[catch {
$parser parse [read $file]
- } result]} {
+ } result]} then {
set definition_data {}
- puts stderr "MCUs database file is currupted,\nplease check your installation"
+ puts stderr "MCUs database file is corrupted (code:688),\nplease check your installation"
puts stderr $result
}
@@ -697,7 +721,7 @@ namespace eval SelectMCU {
return $definition_data
}
- ## XML parser handler for procedure get_avaliable_processors -- Takes XML tags
+ ## XML parser handler for procedure get_available_processors -- Takes XML tags
# @parm String arg1 - name of the element
# @parm List attrs - list of attributes '{attr0 val0 attr1 val1 ...}'
# @return void
@@ -705,7 +729,7 @@ namespace eval SelectMCU {
variable definition_data ;# List: Values gained from $definition_file
variable expected ;# String: Expected next XML element
- # Check for consistent formating
+ # Check for consistent formatting
if {$arg1 != $expected} {
error "Bad element `$arg1'"
}
@@ -763,19 +787,19 @@ namespace eval SelectMCU {
# Validate and store data
switch -- $current_element {
- {bits} { ;# Incomplite registers
+ {bits} { ;# Incomplete registers
if {![regexp {([0-9A-Fa-f]{4})?(\s+[0-9A-Fa-f]{4})*} $arg1]} {
- error "MCUs database file currupted"
+ error "MCUs database file corrupted"
}
lset definition_data 18 $arg1
}
{writeonly} { ;# Write only registers
if {![regexp {([0-9A-Fa-f]{2})?(\s+[0-9A-Fa-f]{2})*} $arg1]} {
- error "MCUs database file currupted"
+ error "MCUs database file corrupted"
}
lset definition_data 19 $arg1
}
- {sfr} { ;# Avaliable special function registers and bit addressable bits in SFR
+ {sfr} { ;# available special function registers and bit addressable bits in SFR
lset definition_data 43 $arg1
set mcu_definition {} ;# This is the last tag
@@ -843,8 +867,8 @@ namespace eval SelectMCU {
{code} {
incr i
set val [lindex $attrs $i]
- if {![string is digit -strict $val] || $val < 0 || $val > 0xFFFF} {
- error "MCUs database file currupted"
+ if {![string is digit -strict $val] || $val < 0 || $val > 0x10000} {
+ error "MCUs database file corrupted"
}
lset definition_data 2 $val
}
@@ -852,7 +876,7 @@ namespace eval SelectMCU {
incr i
set val [lindex $attrs $i]
if {![string is digit -strict $val] || $val < 0 || $val > 256} {
- error "MCUs database file currupted"
+ error "MCUs database file corrupted"
}
lset definition_data 3 $val
}
@@ -860,7 +884,7 @@ namespace eval SelectMCU {
incr i
set val [lindex $attrs $i]
if {![string is digit -strict $val] || $val < 0 || $val > 256} {
- error "MCUs database file currupted"
+ error "MCUs database file corrupted"
}
lset definition_data 4 $val
}
@@ -879,8 +903,8 @@ namespace eval SelectMCU {
{eram} {
incr i
set val [lindex $attrs $i]
- if {![string is digit -strict $val] || $val < 0 || $val > 0xFFFF} {
- error "MCUs database file currupted"
+ if {![string is digit -strict $val] || $val < 0 || $val > 0x10000} {
+ error "MCUs database file corrupted"
}
lset definition_data 8 $val
}
@@ -900,7 +924,7 @@ namespace eval SelectMCU {
incr i
set val [lindex $attrs $i]
if {$val != {} && ![regexp {^[01]{8}$} $val]} {
- error "MCUs database file currupted"
+ error "MCUs database file corrupted"
}
lset definition_data 12 $val
}
@@ -908,7 +932,7 @@ namespace eval SelectMCU {
incr i
set val [lindex $attrs $i]
if {$val != {} && ![regexp {^[01]{8}$} $val]} {
- error "MCUs database file currupted"
+ error "MCUs database file corrupted"
}
lset definition_data 13 $val
}
@@ -916,7 +940,7 @@ namespace eval SelectMCU {
incr i
set val [lindex $attrs $i]
if {$val != {} && ![regexp {^[01]{8}$} $val]} {
- error "MCUs database file currupted"
+ error "MCUs database file corrupted"
}
lset definition_data 14 $val
}
@@ -924,7 +948,7 @@ namespace eval SelectMCU {
incr i
set val [lindex $attrs $i]
if {$val != {} && ![regexp {^[01]{8}$} $val]} {
- error "MCUs database file currupted"
+ error "MCUs database file corrupted"
}
lset definition_data 15 $val
}
@@ -932,7 +956,7 @@ namespace eval SelectMCU {
incr i
set val [lindex $attrs $i]
if {$val != {} && ![regexp {^[01]{8}$} $val]} {
- error "MCUs database file currupted"
+ error "MCUs database file corrupted"
}
lset definition_data 16 $val
}
@@ -992,7 +1016,7 @@ namespace eval SelectMCU {
incr i
set val [lindex $attrs $i]
if {![string is digit -strict $val]} {
- error "MCUs database file currupted"
+ error "MCUs database file corrupted"
}
lset definition_data 32 $val
}
@@ -1078,7 +1102,7 @@ namespace eval SelectMCU {
variable definition_data ;# List: Values gained from $definition_file
if {$value != {yes} && $value != {no}} {
- error "MCUs database file currupted"
+ error "MCUs database file corrupted"
}
lset definition_data $index $value
}
@@ -1093,7 +1117,7 @@ namespace eval SelectMCU {
variable current_element ;# String: Current XML element
variable take_data ;# Bool: Take element data on next parsing cycle
variable mcu_definition ;# List: Definition of MCU currently being parsed
- variable vendors ;# List: Avaliable MCU vendors
+ variable vendors ;# List: available MCU vendors
if {$arg1 != $expected} {
error "Bad element `$arg1'"
@@ -1107,7 +1131,7 @@ namespace eval SelectMCU {
if {$mcu_definition != {}} {
foreach val $mcu_definition {
if {$val == {}} {
- error "Incomplite definition for [lindex $mcu_definition 0]"
+ error "Incomplete definition for [lindex $mcu_definition 0]"
}
}
lappend definition_data $mcu_definition
@@ -1120,7 +1144,7 @@ namespace eval SelectMCU {
incr i
set val [lindex $attrs $i]
if {![string is alnum -strict $val]} {
- error "MCU name must match ^[\w\d]+$"
+ error "MCU name must match ^\[\w\d\]+$"
}
lset mcu_definition 0 $val
}
@@ -1176,7 +1200,7 @@ namespace eval SelectMCU {
incr i
set val [lindex $attrs $i]
if {$val != {yes} && $val != {no}} {
- error "Attribute UART must be eighter \"yes\" or \"no\""
+ error "Attribute UART must be either \"yes\" or \"no\""
}
lset mcu_definition 7 $val
}
@@ -1250,7 +1274,7 @@ namespace eval SelectMCU {
variable current_element ;# String: Current XML element
variable take_data ;# Bool: Take element data on next parsing cycle
variable mcu_definition ;# List: Definition of MCU currently being parsed
- variable vendors ;# List: Avaliable MCU vendors
+ variable vendors ;# List: available MCU vendors
if {!$take_data} {
return
@@ -1278,8 +1302,9 @@ namespace eval SelectMCU {
# @return void
proc select_item args {
variable definition_data ;# List: Values gained from $definition_file
+ variable local_definition_data ;# List: Basically the same as $definition_data but containing only the shown items
variable selected_mcu ;# List: Dialog return value {mcu_type xdata xcode}
- variable listbox_widget ;# Widget: List box containing avaliable MCUs
+ variable listbox_widget ;# Widget: List box containing available MCUs
variable value_lbl_uart ;# Widget: Label "UART:" - value
variable value_lbl_voltage ;# Widget: Label "Operating voltage:" - value
variable value_lbl_interrupts ;# Widget: Label "Interrupts:" - value
@@ -1287,17 +1312,17 @@ namespace eval SelectMCU {
variable value_lbl_vendor ;# Widget: Label "Vendor" - value
variable more_details_text ;# Widget: TextWidget "More details:"
variable details_xdata_aval ;# Widget: Frame containing scale and spinbox for XDATA memory
- variable details_xdata_note ;# Widget: Frame containing label "NOT AVALIABLE" for XDATA memory
+ variable details_xdata_note ;# Widget: Frame containing label "NOT available" for XDATA memory
variable details_xcode_aval ;# Widget: Frame containing scale and spinbox for XCODE memory
- variable details_xcode_nota ;# Widget: Frame containing label "NOT AVALIABLE" for XCODE memory
+ variable details_xcode_nota ;# Widget: Frame containing label "NOT available" for XCODE memory
variable name_label ;# Widget: Label containing name of selected MCU
variable image_label ;# Widget: Label with image for selected MCU
variable xcode_spinbox ;# Widget: SpinBox for XCODE memory
variable xcode_scale ;# Widget: Scale for XCODE memory
- variable maximum_xcode ;# Int: Maximum external program memory (0xFFFF - internal)
+ variable maximum_xcode ;# Int: Maximum external program memory (0x10000 - internal)
# Get MCU definition for the selected processor
- set mcu [lindex $definition_data \
+ set mcu [lindex $local_definition_data \
[$listbox_widget index [$listbox_widget selection get]] \
]
set mcu_name [lindex $mcu 0]
@@ -1305,7 +1330,7 @@ namespace eval SelectMCU {
return
}
set selected_mcu $mcu_name
- set maximum_xcode [expr {0xFFFF - ([lindex $mcu 3] * 1024)}]
+ set maximum_xcode [expr {0x10000 - ([lindex $mcu 3] * 1024)}]
# Configure detail labels
$name_label configure -text $mcu_name
@@ -1331,7 +1356,7 @@ namespace eval SelectMCU {
pack forget $details_xdata_aval
}
pack $details_xdata_note -fill both -expand 1
- } {
+ } else {
if {[winfo ismapped $details_xdata_note]} {
pack forget $details_xdata_note
}
@@ -1343,7 +1368,7 @@ namespace eval SelectMCU {
pack forget $details_xcode_aval
}
pack $details_xcode_nota -fill both -expand 1
- } {
+ } else {
$xcode_spinbox configure -to $maximum_xcode
$xcode_scale configure -to $maximum_xcode
if {[winfo ismapped $details_xcode_nota]} {
@@ -1369,9 +1394,9 @@ namespace eval SelectMCU {
update
if {[catch {
$image_label configure -text { } -image [image create photo \
- -format png -file "${::LIB_DIRNAME}/../icons/mcu/$mcu_name.png"
+ -format png -file "${::ROOT_DIRNAME}/icons/mcu/$mcu_name.png"
]
- }]} {
+ }]} then {
$image_label configure \
-fg {#DD0000} \
-text [mc " Image not found"] \
@@ -1394,7 +1419,7 @@ namespace eval SelectMCU {
pack forget $more_details_scrollbar
}
# Show scrollbar
- } {
+ } else {
if {![winfo ismapped $more_details_scrollbar]} {
pack $more_details_scrollbar \
-side right -fill y \
@@ -1411,7 +1436,7 @@ namespace eval SelectMCU {
$search_bar delete 0 end
}
- ## Search for the give string in the listbox of avaliable processors
+ ## Search for the give string in the listbox of available processors
# Primary purpose is validator for search entry box, it also
#+ ajusts search entry box background color
# @parm String string - Part of MCU name
@@ -1419,8 +1444,8 @@ namespace eval SelectMCU {
proc search {string} {
variable search_bar ;# Widget: Search bar entry box
variable search_bar_clear ;# Widget: Search bar clear button
- variable listbox_widget ;# Widget: List box containing avaliable MCUs
- variable mcu_names ;# List: Avaliable processors
+ variable listbox_widget ;# Widget: List box containing available MCUs
+ variable mcu_names ;# List: Available processors (and show in the list)
# Search for empty string -> abort
if {![string length $string]} {
@@ -1468,7 +1493,7 @@ namespace eval SelectMCU {
if {${::SelectMCU::xdata_ena}} {
$xdata_scale state !disabled
$xdata_spinbox configure -state normal
- } {
+ } else {
$xdata_scale state disabled
$xdata_spinbox configure -state disabled
}
@@ -1483,7 +1508,7 @@ namespace eval SelectMCU {
if {${::SelectMCU::xcode_ena}} {
$xcode_scale state !disabled
$xcode_spinbox configure -state normal
- } {
+ } else {
$xcode_scale state disabled
$xcode_spinbox configure -state disabled
}
@@ -1499,7 +1524,7 @@ namespace eval SelectMCU {
if {$string == {}} {
return 1
}
- if {$string < 0 || $string > 0xFFFF} {
+ if {$string < 0 || $string > 0x10000} {
return 0
}
@@ -1510,7 +1535,7 @@ namespace eval SelectMCU {
# @parm String string - String to validate
# @return Bool - Validation result
proc validate_xcode {string} {
- variable maximum_xcode ;# Int: Maximum external program memory (0xFFFF - internal)
+ variable maximum_xcode ;# Int: Maximum external program memory (0x10000 - internal)
if {![string is digit $string]} {
return 0
@@ -1528,10 +1553,14 @@ namespace eval SelectMCU {
## This functionshould be changecmd for vendor comboBox
# @return void
proc change_vendor {} {
- variable listbox_widget ;# Widget: List box containing avaliable MCUs
+ variable listbox_widget ;# Widget: List box containing available MCUs
clear_search_bar
$listbox_widget delete [$listbox_widget items]
fill_gui
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/dialogs/tips.tcl b/lib/dialogues/tips.tcl
index 1c8b988..d2df211 100755..100644
--- a/lib/dialogs/tips.tcl
+++ b/lib/dialogues/tips.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,13 +21,18 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _TIPS_TCL ] } {
+set _TIPS_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
-# Provides facility to show tips on startup
+# Provides facility to show tips on start-up
# * Tips are readed from file deindef in NS variable "tips_file"
# * Format of definition file is XML and it supports mutiple languages
# * Usage is simple: execute procedure "::Tips::show_tip_of_the_day_win"
-# * It requires NS ConfigDialogs (see ${::GLOBAL_CONFIG(tips)})
+# * It requires NS ConfigDialogues (see ${::GLOBAL_CONFIG(tips)})
# --------------------------------------------------------------------------
namespace eval Tips {
@@ -36,20 +41,20 @@ namespace eval Tips {
variable tip_of_the_day_show_again ;# Bool: Show "Tip of the day"
variable tips_data ;# List containing tips data
- variable number_of_tips ;# Number of tips avaliable
+ variable number_of_tips ;# Number of tips available
variable current_tip ;# Number of the currently displayed tip
variable expected ;# Expeceted element
variable take_data ;# Bool: Append data section to $tips_data
# File containing tips data
- variable tips_file "${::LIB_DIRNAME}/../data/tips.xml"
+ variable tips_file "${::INSTALLATION_DIR}/data/tips.xml"
- ## Invoke dialog "Tip on startup"
+ ## Invoke dialog "Tip on start-up"
# @return void
proc show_tip_of_the_day_win {} {
variable tip_of_the_day_win ;# ID of window "Tip of the day"
variable tip_of_the_day_text ;# ID of text widget in "Tip of the day"
variable tip_of_the_day_show_again ;# Bool: Show "Tip of the day"
- variable number_of_tips ;# Number of tips avaliable
+ variable number_of_tips ;# Number of tips available
variable tip_of_the_day_show_again ;# Bool: Show "Tip of the day"
# Set value of checkbox "Show again"
@@ -58,16 +63,16 @@ namespace eval Tips {
load_tips_file
# Create toplevel window
- set win [toplevel .tip_of_the_day -class {Tip of the day} -bg {#EEEEEE}]
+ set win [toplevel .tip_of_the_day -class {Tip of the day} -bg ${::COMMON_BG_COLOR}]
set tip_of_the_day_win $win
# Create window header
pack [label $win.header \
-text [mc "Did you know ... "] \
- -font [font create \
- -family {times} \
- -size -25 \
- -weight bold \
+ -font [font create \
+ -family {times} \
+ -size [expr {int(-25 * $::font_size_factor)}] \
+ -weight bold \
] \
-compound right \
-image ::ICONS::32::help \
@@ -75,14 +80,14 @@ namespace eval Tips {
# Create middle frame (text windget and scrollbar)
set middle_frame [frame $win.middle_frame]
- set text [text $middle_frame.text \
- -width 0 -height 0 -bg white \
- -wrap word \
- -yscrollcommand "$middle_frame.scrollbar set" \
- -font [font create \
- -family {helvetica} \
- -size -17 \
- -weight normal \
+ set text [text $middle_frame.text \
+ -width 0 -height 0 -bg white \
+ -wrap word \
+ -yscrollcommand "$middle_frame.scrollbar set" \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight normal \
] \
]
pack $text -side left -fill both -expand 1
@@ -94,11 +99,11 @@ namespace eval Tips {
## Create bottom frame
set bottom_frame [frame $win.bottom_frame]
- # - CheckButton "Show tips on startup"
+ # - CheckButton "Show tips on start-up"
pack [checkbutton $bottom_frame.chbutton \
-variable ::Tips::tip_of_the_day_show_again \
-command {::Tips::tip_otd_show_again} \
- -text [mc "Show tips on startup"] \
+ -text [mc "Show tips on start-up"] \
] -side left -anchor e
# - Button "Close"
pack [ttk::button $bottom_frame.close_but \
@@ -107,7 +112,7 @@ namespace eval Tips {
-image ::ICONS::16::button_cancel \
-command {::Tips::tip_otd_CLOSE} \
-width 8 \
- ] -side right -anchor w
+ ] -side right -anchor w -padx 2
# - Button "Next"
pack [ttk::button $bottom_frame.next_but \
-compound left \
@@ -115,7 +120,7 @@ namespace eval Tips {
-image ::ICONS::16::right \
-command {::Tips::tip_otd_NEXT} \
-width 8 \
- ] -side right -anchor w
+ ] -side right -anchor w -padx 2
# - Button "Previous"
pack [ttk::button $bottom_frame.prev_but \
-compound left \
@@ -123,18 +128,27 @@ namespace eval Tips {
-image ::ICONS::16::left \
-command {::Tips::tip_otd_PREV} \
-width 8 \
- ] -side right -anchor w
+ ] -side right -anchor w -padx 2
# Pack window frames
pack $middle_frame -side top -fill both -expand 1 -padx 10 -pady 5
pack $bottom_frame -side bottom -fill x -after $middle_frame -padx 10 -pady 5
# Configure text tags
- $text tag configure tag_bold -font [font create \
- -family {helvetica} \
- -size -17 \
- -weight bold \
+ $text tag configure tag_bold -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight bold \
]
+ # Configure text tags
+ $text tag configure tag_code -font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight normal \
+ ] -foreground {#DD8800}
+
+ # Create tag for external hyperlinks
+ create_link_tag_in_text_widget $text
# Determinate random number of tip to show
expr {srand([clock seconds])}
@@ -158,7 +172,7 @@ namespace eval Tips {
# @return void
proc load_tips_file {} {
variable tips_data ;# List containing tips data
- variable number_of_tips ;# Number of tips avaliable
+ variable number_of_tips ;# Number of tips available
variable tips_file ;# File containing tips data
variable expected ;# Expeceted element
variable take_data ;# Bool: Append data section to $tips_data
@@ -172,7 +186,7 @@ namespace eval Tips {
# Open file
if {[catch {
set file [open $tips_file {r}]
- }]} {
+ }]} then {
tk_messageBox \
-parent . \
-type ok \
@@ -191,7 +205,7 @@ namespace eval Tips {
# Start XML parser
if {[catch {
$parser parse [read $file]
- } result]} {
+ } result]} then {
set number_of_tips 0
set tips_data {}
tk_messageBox \
@@ -214,7 +228,7 @@ namespace eval Tips {
# @return void
proc xml_data_parser_data {arg1} {
variable tips_data ;# List containing tips data
- variable number_of_tips ;# Number of tips avaliable
+ variable number_of_tips ;# Number of tips available
variable current_tip ;# Number of the currently displayed tip
variable expected ;# Expeceted element
variable take_data ;# Bool: Append data section to $tips_data
@@ -237,7 +251,7 @@ namespace eval Tips {
# @return void
proc xml_data_parser_element {arg1 attrs} {
variable tips_data ;# List containing tips data
- variable number_of_tips ;# Number of tips avaliable
+ variable number_of_tips ;# Number of tips available
variable current_tip ;# Number of the currently displayed tip
variable expected ;# Expeceted element
variable take_data ;# Bool: Append data section to $tips_data
@@ -257,13 +271,11 @@ namespace eval Tips {
}
incr i
- ## Take data if ...
- # No translation has been loaded and current text is in English
- if {!${::TRANSLATION_LOADED} || [lindex $attrs $i] == {en}} {
- set take_data 1
- # Or if some translation has been loaded and it conforms with the text
- } elseif {[lindex $attrs $i] == ${::GLOBAL_CONFIG(language)}} {
+ # Take data only if some translation has been loaded and it conforms with the text
+ if {[string tolower [lindex $attrs $i]] == [string tolower ${::GLOBAL_CONFIG(language)}]} {
set take_data 1
+ } else {
+ set take_data 0
}
}
}
@@ -272,7 +284,7 @@ namespace eval Tips {
# @return void
proc tip_otd_CLOSE {} {
variable tips_data ;# List containing tips data
- variable number_of_tips ;# Number of tips avaliable
+ variable number_of_tips ;# Number of tips available
variable current_tip ;# Number of the currently displayed tip
variable tip_of_the_day_win ;# ID of window "Tip of the day"
@@ -291,7 +303,7 @@ namespace eval Tips {
# @return void
proc display_tip {tip_number} {
variable tips_data ;# List containing tips data
- variable number_of_tips ;# Number of tips avaliable
+ variable number_of_tips ;# Number of tips available
variable current_tip ;# Number of the currently displayed tip
variable tip_of_the_day_text ;# ID of text widget in "Tip of the day"
@@ -311,23 +323,28 @@ namespace eval Tips {
incr current_tip -1
}
- # Create map of bold font tags
- set bold_tag_map {}
+ # Create map of bold and code font tags
+ set bold_tag_map [list]
+ set code_tag_map [list]
set content [lindex $tips_data $current_tip]
- while 1 {
- set tag_pair {}
-
- set idx [string first {<b>} $content]
- if {$idx == -1} {break}
- regsub {<b>} $content {} content
- lappend tag_pair $idx
-
- set idx [string first {</b>} $content]
- if {$idx == -1} {break}
- regsub {</b>} $content {} content
- lappend tag_pair $idx
-
- lappend bold_tag_map $tag_pair
+ foreach map {bold_tag_map code_tag_map} \
+ tag {b c} \
+ {
+ while {1} {
+ set tag_pair {}
+
+ set idx [string first "<$tag>" $content]
+ if {$idx == -1} {break}
+ regsub "<$tag>" $content {} content
+ lappend tag_pair $idx
+
+ set idx [string first "</$tag>" $content]
+ if {$idx == -1} {break}
+ regsub "</$tag>" $content {} content
+ lappend tag_pair $idx
+
+ lappend $map $tag_pair
+ }
}
# Fill text widget
@@ -336,13 +353,19 @@ namespace eval Tips {
foreach pair $bold_tag_map {
$tip_of_the_day_text tag add tag_bold $start+[lindex $pair 0]c $start+[lindex $pair 1]c
}
+ foreach pair $code_tag_map {
+ $tip_of_the_day_text tag add tag_code $start+[lindex $pair 0]c $start+[lindex $pair 1]c
+ }
$tip_of_the_day_text configure -state disabled
+
+ # Detect external hyperlinks and make the functional
+ convert_all_https_to_links $tip_of_the_day_text
}
## Show next tip
# @return void
proc tip_otd_NEXT {} {
- variable number_of_tips ;# Number of tips avaliable
+ variable number_of_tips ;# Number of tips available
variable current_tip ;# Number of the currently displayed tip
incr current_tip
@@ -355,7 +378,7 @@ namespace eval Tips {
## Show previous tip
# @return void
proc tip_otd_PREV {} {
- variable number_of_tips ;# Number of tips avaliable
+ variable number_of_tips ;# Number of tips available
variable current_tip ;# Number of the currently displayed tip
incr current_tip -1
@@ -370,6 +393,10 @@ namespace eval Tips {
proc tip_otd_show_again {} {
variable tip_of_the_day_show_again ;# Bool: Show "Tip of the day"
- ::configDialogs::global::set_variable tips $tip_of_the_day_show_again
+ ::configDialogues::global::set_variable tips $tip_of_the_day_show_again
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/editor/ASMsyntaxhighlight.tcl b/lib/editor/ASMsyntaxhighlight.tcl
index fe364d5..1486201 100755..100644
--- a/lib/editor/ASMsyntaxhighlight.tcl
+++ b/lib/editor/ASMsyntaxhighlight.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 _ASMSYNTAXHIGHLIGHT_TCL ] } {
+set _ASMSYNTAXHIGHLIGHT_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements syntax highlighting interface for assembly language
@@ -31,7 +36,7 @@ namespace eval ASMsyntaxHighlight {
# {
# {tag_name ?foreground? ?overstrike? ?italic? ?bold?}
# }
- variable hightlight_tags {
+ variable highlight_tags {
{tag_char #880066 0 0 0}
{tag_hex #8800BB 0 0 0}
{tag_oct #880000 0 0 0}
@@ -94,9 +99,9 @@ namespace eval ASMsyntaxHighlight {
# directives with argument(s) but without any label
variable directive_type1 {
- DSEG ISEG BSEG XSEG CSEG SKIP NAME
+ DSEG ISEG BSEG XSEG CSEG SKIP NAME LOCAL
}
- # directives for constants definitions
+ # directives for symbol definitions
variable directive_type2 {
EQU BIT SET CODE DATA IDATA XDATA MACRO FLAG
}
@@ -115,7 +120,7 @@ namespace eval ASMsyntaxHighlight {
variable expr_symbols {
= + - * / > < %
}
-
+
# control sequencies without any argument
variable controls_type0 {
NOLIST NOMOD NOOBJECT NOPAGING NOPRINT
@@ -185,26 +190,22 @@ namespace eval ASMsyntaxHighlight {
variable validation_L1 1 ;# Bool: Advancet validation enabled
## Define highlighting text tags in the given text widget
- # @parm Widget - ID of the target text widget
- # @parm Int - font size
- # @parm String - font family
- # @parm List = default - Highlighting tags definition
+ # @parm Widget text_widget - ID of the target text widget
+ # @parm Int fontSize - font size
+ # @parm String fontFamily - font family
+ # @parm List highlight=default - Highlighting tags definition
+ # @parm Bool nobold=0 - Ignore bold flag
# @return void
- proc create_tags args {
- variable hightlight_tags ;# Highlight tags definition
+ proc create_tags {text_widget fontSize fontFamily {highlight {}} {nobold 0}} {
+ variable highlight_tags ;# Highlight tags definition
# Handle arguments
- set text_widget [lindex $args 0] ;# text widget
- set fontSize [lindex $args 1] ;# font size
- set fontFamily [lindex $args 2] ;# font family
- if {[llength $args] > 3} { ;# highlighting definition
- set hightlight [lindex $args 3]
- } {
- set hightlight $hightlight_tags
+ if {$highlight == {}} { ;# highlighting definition
+ set highlight $highlight_tags
}
# Iterate over highlighting tags definition
- foreach item $hightlight {
+ foreach item $highlight {
# Create array of tag attributes
for {set i 0} {$i < 5} {incr i} {
set tag($i) [lindex $item $i]
@@ -217,13 +218,13 @@ namespace eval ASMsyntaxHighlight {
# Fonr slant
if {$tag(3) == 1} {
set tag(3) italic
- } {
+ } else {
set tag(3) roman
}
# Font weight
- if {$tag(4) == 1} {
+ if {$tag(4) == 1 && !$nobold} {
set tag(4) bold
- } {
+ } else {
set tag(4) normal
}
@@ -253,13 +254,13 @@ namespace eval ASMsyntaxHighlight {
}
## Perform syntax highlight on the given line in the given widget
- # @parm Widget Editor - Text widget
- # @parm Int LineNumber - Number of line to highlight
- # @parm Bool inline_asm - Inline assembler
- # @parm Int boundary_0 = 0 - Start index
- # @parm Int boundary_1 = end - End index
+ # @parm Widget p_editor - Text widget
+ # @parm Int linenumber - Number of line to highlight
+ # @parm Bool inlineasm - Inline assembler
+ # @parm Int linestart=0 - Start index
+ # @parm Int lineend=end - End index
# @return Bool - result
- proc highlight args {
+ proc highlight {p_editor linenumber {inlineasm 0} {linestart {}} {lineend {}}} {
variable editor ;# ID of the text widget
variable lineNumber ;# Number of current line
variable lineStart ;# Index of line start
@@ -282,27 +283,22 @@ namespace eval ASMsyntaxHighlight {
variable validation_L0 ;# Bool: Basic validation enabled
# Parse input arguments
- set editor [lindex $args 0]
- set lineNumber [lindex $args 1]
- set inline_asm [lindex $args 2]
- set lineStart [lindex $args 3]
- set lineEnd [lindex $args 4]
- if {$inline_asm == {}} {
- set inline_asm 0
- }
- if {$lineStart == {}} {
+ set editor $p_editor
+ set lineNumber $linenumber
+ set inline_asm $inlineasm
+ if {$linestart == {}} {
set lineStart $lineNumber.0
- } {
- set lineStart $lineNumber.$lineStart
+ } else {
+ set lineStart $lineNumber.$linestart
}
- if {$lineEnd == {}} {
- set lineEnd [$editor index "$lineStart lineend"]
- } {
+ if {$lineend == {}} {
+ set lineEnd [$editor index [list $lineStart lineend]]
+ } else {
set lineEnd $lineNumber.$lineEnd
}
- if {[lindex $args 3] != {}} {
- set start_offset [lindex $args 3]
- } {
+ if {$linestart != {}} {
+ set start_offset $linestart
+ } else {
set start_offset 0
}
@@ -339,7 +335,7 @@ namespace eval ASMsyntaxHighlight {
if {$comment_start == 0} {
set data {}
delete_tags
- } {
+ } else {
set data [string range $data 0 [expr {$comment_start - 1}]]
regsub {\s+$} $data {} data
}
@@ -358,7 +354,13 @@ namespace eval ASMsyntaxHighlight {
}
# Determinate 1st segment of the line
- regexp {^\s*[^\s:\(]+:?} $data seg_0
+ regexp {^\s*[^\s]+:?} $data seg_0
+ if {[regexp {\w\(} $seg_0]} {
+ regsub {\(.*$} $seg_0 {} seg_0
+ }
+ if {[string last {:} $seg_0] != -1} {
+ set seg_0 [string range $seg_0 0 [string last {:} $seg_0]]
+ }
set seg_0_end [string length $seg_0]
regsub {^\s+} $seg_0 {} seg_0
@@ -415,7 +417,7 @@ namespace eval ASMsyntaxHighlight {
if {![string length $seg_2]} {
put_error_on_segment 1
}
-
+
set seg_1 [string tolower $seg_1]
if {$seg_1 == {db} || $seg_1 == {.db} || $seg_1 == {byte} || $seg_1 == {.byte}} {
parse_operands
@@ -423,7 +425,7 @@ namespace eval ASMsyntaxHighlight {
$editor tag add tag_string \
$lineNumber.$seg_2_start \
[list $lineNumber.0 lineend]
- } {
+ } else {
parse_expressions
}
}
@@ -444,7 +446,7 @@ namespace eval ASMsyntaxHighlight {
if {
$validation_L0 &&
([regexp {^\d} $seg_1] || ![regexp {^\w+$} $seg_1])
- } {
+ } then {
put_error_on_segment 1
}
determinate_segment_2
@@ -464,7 +466,7 @@ namespace eval ASMsyntaxHighlight {
if {![string length $seg_2]} {
put_error_on_segment 0
}
-
+
set seg_0 [string tolower $seg_0]
if {$seg_0 == {db} || $seg_0 == {.db} || $seg_0 == {byte} || $seg_0 == {.byte}} {
parse_operands
@@ -472,7 +474,7 @@ namespace eval ASMsyntaxHighlight {
$editor tag add tag_string \
$lineNumber.$seg_2_start \
[list $lineNumber.0 lineend]
- } {
+ } else {
parse_expressions
}
}
@@ -494,6 +496,7 @@ namespace eval ASMsyntaxHighlight {
{unknown} {
determinate_segment_1
set seg_1_info [parse_segment $seg_1_start $seg_1_end $seg_1]
+
switch -- [lindex $seg_1_info 0] {
{control_0} {
determinate_segment_2
@@ -521,7 +524,7 @@ namespace eval ASMsyntaxHighlight {
$editor tag add tag_string \
$lineNumber.$seg_2_start \
[list $lineNumber.0 lineend]
- } {
+ } else {
parse_expressions
}
}
@@ -529,7 +532,7 @@ namespace eval ASMsyntaxHighlight {
if {
$validation_L0 &&
([regexp {^\d} $seg_0] || ![regexp {^\w+$} $seg_0])
- } {
+ } then {
put_error_on_segment 0
}
@@ -540,7 +543,7 @@ namespace eval ASMsyntaxHighlight {
$lineNumber.$seg_0_end
determinate_segment_2
parse_arguments
- } {
+ } else {
$editor tag add tag_constant_def \
$lineNumber.$seg_0_start \
$lineNumber.$seg_0_end
@@ -561,11 +564,12 @@ namespace eval ASMsyntaxHighlight {
}
{unknown} {
$editor tag add tag_macro $lineNumber.$seg_0_start $lineNumber.$seg_0_end
+
if {
$validation_L0 &&
([regexp {^\d} $seg_0] || ![regexp {^\w+$} $seg_0])
- } {
- put_error_on_segment 0
+ } then {
+ put_error_on_segment 0
}
determinate_segment_1_take_back
determinate_segment_2
@@ -576,7 +580,7 @@ namespace eval ASMsyntaxHighlight {
if {
$validation_L0 &&
([regexp {^\d} $seg_0] || ![regexp {^\w+$} $seg_0])
- } {
+ } then {
put_error_on_segment 0
}
}
@@ -592,7 +596,7 @@ namespace eval ASMsyntaxHighlight {
# @return void
proc delete_tags {} {
variable editor ;# ID of the text widget
- variable hightlight_tags ;# Highlight tags definition
+ variable highlight_tags ;# Highlight tags definition
variable lineStart ;# Index of line start
variable lineEnd ;# Index of line end
@@ -603,8 +607,8 @@ namespace eval ASMsyntaxHighlight {
$editor tag remove $tag $lineStart_truestart $lineStart_truestart+1l
}
- # Remove tags acording to pattern
- foreach tag $hightlight_tags {
+ # Remove tags according to pattern
+ foreach tag $highlight_tags {
$editor tag remove [lindex $tag 0] $lineStart_truestart $lineEnd
}
}
@@ -633,13 +637,14 @@ namespace eval ASMsyntaxHighlight {
variable last_index_backup ;# Auxiliary variable (some index)
# Line is empty
- if {![regexp {^\s*[^\s\(]+} $data seg_1]} {
+ # if {![regexp {^\s*[^\s\(]+} $data seg_1]}
+ if {![regexp {^\s*[^\s]+} $data seg_1]} {
set seg_1 {}
set seg_1_end $last_index
set seg_1_start $last_index
# Line is not empty
- } {
+ } else {
set data_backup $data
set last_index_backup $last_index
@@ -692,16 +697,17 @@ namespace eval ASMsyntaxHighlight {
# @parm String segment_data - content of segment to parse
# @return List - {segment_type expression_length} or {segment_type {}} or {{} {}}
proc parse_segment {start end segment_data} {
- variable controls_type0 ;# control sequencies without any argument
- variable controls_type1 ;# control sequencies with exactly 1 argument
+ variable controls_type0 ;# control sequencies without any argument
+ variable controls_type1 ;# control sequencies with exactly 1 argument
- variable keyword_lists ;# list of all reserved keywords
- variable editor ;# ID of the text widget
- variable lineNumber ;# Number of current line
- variable lineStart ;# Index of line start
- variable lineEnd ;# Index of line end
- variable data ;# Content of the line
- variable validation_L0 ;# Bool: Basic validation enabled
+ variable keyword_lists ;# list of all reserved keywords
+ variable editor ;# ID of the text widget
+ variable lineNumber ;# Number of current line
+ variable lineStart ;# Index of line start
+ variable lineEnd ;# Index of line end
+ variable data ;# Content of the line
+ variable validation_L0 ;# Bool: Basic validation enabled
+ variable inline_asm ;# Bool: Is inline assembler
# Local variables
set seg_type {} ;# segment type
@@ -729,7 +735,7 @@ namespace eval ASMsyntaxHighlight {
set seg_type $type
break
}
- } {
+ } else {
if {[lsearch -ascii -exact $keyword_list $segment_data] != -1} {
$editor tag add $tag $lineNumber.$start $lineNumber.$end
set seg_type $type
@@ -740,7 +746,6 @@ namespace eval ASMsyntaxHighlight {
# If segment type could not be recognized -> check for labels, macro's and controls
if {$seg_type == {}} {
-
# Handle compiler control sequences
if {[string index $segment_data 0] == {$}} {
set segment_data [string range $segment_data 1 end]
@@ -789,12 +794,22 @@ namespace eval ASMsyntaxHighlight {
}
# Labels
- } elseif {[regexp -nocase {^\w+:$} $segment_data]} {
+ } elseif {[regexp -nocase {^[^\s]*:$} $segment_data]} {
$editor tag add tag_label $lineNumber.$start $lineNumber.$end
set seg_type label
+ if {$inline_asm} {
+ if {![regexp -nocase {^\w+\$:$} $segment_data]} {
+ $editor tag add tag_error $lineNumber.$start $lineNumber.$end
+ }
+ } else {
+ if {![regexp -nocase {^[a-zA-Z]\w*:$} $segment_data]} {
+ $editor tag add tag_error $lineNumber.$start $lineNumber.$end
+ }
+ }
+
# Unknown type - possibly macro instruction
- } {
+ } else {
set seg_type unknown
}
}
@@ -817,9 +832,9 @@ namespace eval ASMsyntaxHighlight {
$editor tag add tag_symbol $lineNumber.$start_index $lineNumber.[expr {$start_index + 1}]
set end [expr {$end_index - 1}]
$editor tag add tag_symbol $lineNumber.$end $lineNumber.$end_index
-
+
$editor tag add tag_string $lineNumber.[expr {$start_index + 1}] $lineNumber.$end
- } {
+ } else {
if {$validation_L0} {
$editor tag add tag_error \
$lineNumber.$control_start $lineNumber.$control_end
@@ -840,7 +855,7 @@ namespace eval ASMsyntaxHighlight {
variable seg_0_end ;# End index of seg_0
variable seg_1_end ;# End index of seg_1
variable seg_2_end ;# End index of seg_2
-
+
if {!$validation_L0} {
return
}
@@ -876,9 +891,9 @@ namespace eval ASMsyntaxHighlight {
if {[regexp {^\s*$} $seg_2]} {return 0}
- while 1 {
+ while {1} {
# Handle redutant commas
- while 1 {
+ while {1} {
if {![regexp {^\s*\,} $seg_2]} {break}
set space_len 0
@@ -964,9 +979,9 @@ namespace eval ASMsyntaxHighlight {
set original_data $seg_2
set data [hide_strings $seg_2]
- while 1 {
+ while {1} {
# Handle redutant commas
- while 1 {
+ while {1} {
if {![regexp {^\s*\,} $data]} {break}
set space_len 0
@@ -1003,7 +1018,7 @@ namespace eval ASMsyntaxHighlight {
set space_len [string length $space]
set opr_start [expr {$last_index + $space_len}]
set operand [string range $operand $space_len end]
- } {
+ } else {
set opr_start $last_index
}
@@ -1012,7 +1027,7 @@ namespace eval ASMsyntaxHighlight {
set space_len [string length $space]
set opr_end [expr {$operand_len - $space_len}]
set operand [string range $operand 0 $opr_end]
- } {
+ } else {
set opr_end $operand_len
}
incr opr_end $last_index
@@ -1058,7 +1073,7 @@ namespace eval ASMsyntaxHighlight {
default {
if {[lsearch -ascii -exact {R0 R1 R2 R3 R4 R5 R6 R7 DPTR A AB C} $opr] != -1} {
lappend opr_types $opr
- } {
+ } else {
lappend opr_types {D}
}
}
@@ -1091,14 +1106,14 @@ namespace eval ASMsyntaxHighlight {
if {$validation_L0 && $len < 3} {
put_tag_on_operand tag_error
}
- if {$len > 3} {
+ if {$len > 3 && [string index $operand 1] != "\\"} {
put_tag_on_operand tag_string
- } {
+ } else {
put_tag_on_operand tag_imm_char
}
# Label in inline assembler
- } elseif {[regexp {^\d+\$$} $operand]} {
+ } elseif {[regexp {^\w+\$$} $operand]} {
put_tag_on_operand tag_imm_constant
# Operand has no value => incorrect operand
@@ -1108,10 +1123,10 @@ namespace eval ASMsyntaxHighlight {
$lineNumber.$opr_start $lineNumber.$opr_start+1c
} elseif {
- $validation_L0 &&
- ([string length $operand] == 0 || ![regexp {^[\w\$\.\\]+$} $operand])
- } {
- put_tag_on_operand tag_error
+ $validation_L0 &&
+ ([string length $operand] == 0 || ![regexp {^(\?\?)?[\w\$\.\\]+$} $operand])
+ } then {
+ put_tag_on_operand tag_error
# Operand value determinated successfully
} else {
@@ -1136,7 +1151,7 @@ namespace eval ASMsyntaxHighlight {
$operand != {DPTR} &&
$operand != {A+PC} &&
$operand != {A+DPTR}
- } {
+ } then {
put_tag_on_operand tag_error
}
@@ -1150,12 +1165,11 @@ namespace eval ASMsyntaxHighlight {
$lineNumber.$opr_start $lineNumber.$opr_start+1c
} elseif {
- $validation_L0 &&
- ([string length $operand] == 0 || ![regexp {^'?[\w\.]+'?$} $operand])
- } {
-
- # Operand has no value => incorrect operand
- put_tag_on_operand tag_error
+ $validation_L0 &&
+ ([string length $operand] == 0 || ![regexp {^'?[\w\.]+'?$} $operand])
+ } then {
+ # Operand has no value => incorrect operand
+ put_tag_on_operand tag_error
} else {
parse_operand_auxiliary $spec_bits {
@@ -1187,7 +1201,7 @@ namespace eval ASMsyntaxHighlight {
put_tag_on_operand tag_sfr
# Something else than SFR
- } {
+ } else {
parse_operand_auxiliary2 $tag_list
}
}
@@ -1206,9 +1220,9 @@ namespace eval ASMsyntaxHighlight {
variable inline_asm ;# Is inline assembler
# Label in inline assembler
- if {$inline_asm && [regexp {^\d+\$$} $operand]} {
+ if {$inline_asm && [regexp {^\w+\$$} $operand]} {
put_tag_on_operand [lindex $tag_list 6]
-
+
# Expression
} elseif {[regexp {\(|\)|\+|\-|\%|\=|\>|\<|\*|\/} $operand]} {
parse_expression $operand $opr_start $opr_end
@@ -1248,14 +1262,14 @@ namespace eval ASMsyntaxHighlight {
}
# Radix determinated correctly - continue normaly
- } {
+ } else {
# check for allowed operand value range
if {$validation_L0 && $opr_in_dec == {error}} {
## Operand value is invalid => incorrect operand
put_tag_on_operand tag_error
- } {
+ } else {
if {$validation_L0 && ($opr_in_dec > 65535 || $opr_in_dec < 0)} {
## Operand value is out of range => incorrect operand
@@ -1263,7 +1277,7 @@ namespace eval ASMsyntaxHighlight {
}
}
- # highlight acording to numeric base
+ # highlight according to numeric base
switch -- $opr_base {
{hex} {put_tag_on_operand [lindex $tag_list 1]}
{dec} {put_tag_on_operand [lindex $tag_list 2]}
@@ -1274,13 +1288,13 @@ namespace eval ASMsyntaxHighlight {
}
}
- # defined by a symbolic name
- } {
+ # Defined as a symbolic name
+ } else {
put_tag_on_operand [lindex $tag_list 6]
if {
- $validation_L0 && ($operand != {$}) && ![regexp {^\w+$} $operand]
- } {
- put_tag_on_operand tag_error
+ $validation_L0 && ($operand != {$}) && ![regexp {^(\?\?)?\w+$} $operand]
+ } then {
+ put_tag_on_operand tag_error
}
}
}
@@ -1302,6 +1316,18 @@ namespace eval ASMsyntaxHighlight {
# @parm String number - number to analyze
# @return List - {base decimal_value} or {base "error"}
proc which_radix {norange number} {
+ # Handle prefix notation for hexadecimal numbers, like 0xfa
+ if {
+ [string index $number 0] == {0}
+ &&
+ ([string index $number 1] == {x} || [string index $number 1] == {X})
+ &&
+ [string is xdigit [string index $number 2]]
+ } then {
+ set number [string replace $number 0 1]
+ append number {h}
+ }
+
set original_len [string length $number]
set len [string length [string trimleft $number {0}]]
if {$original_len > 1 && $len == 1} {
@@ -1318,12 +1344,12 @@ namespace eval ASMsyntaxHighlight {
if {[string index $number 0] == {'}} {
set number [string range $number 1 end]
- set base ascii
- if {[string length $number] == 1} {
+ set base {ascii}
+ if {[string length $number] == 1 || [string index $number 0] == "\\"} {
set dec_val 0
} elseif {[string length $number] > 1} {
- set base string
+ set base {string}
set dec_val 0
}
}
@@ -1358,7 +1384,7 @@ namespace eval ASMsyntaxHighlight {
if {[regexp {^[0-7]*$} $number]} {
if {$len != 3} {
set dec_val 0
- } {
+ } else {
if {[string index $number 0] <= 3} {
set dec_val 0
}
@@ -1376,7 +1402,7 @@ namespace eval ASMsyntaxHighlight {
if {[regexp {^[0-7]*$} $number]} {
if {$len != 3} {
set dec_val 0
- } {
+ } else {
if {[string index $number 0] <= 3} {
set dec_val 0
}
@@ -1399,7 +1425,7 @@ namespace eval ASMsyntaxHighlight {
}
# done ...
- return "$base $dec_val"
+ return [list $base $dec_val]
}
## Highlight expressions (eg. '( 10d - X MOD 55h)')
@@ -1426,7 +1452,7 @@ namespace eval ASMsyntaxHighlight {
# Remove strings
set e_idx 0
- while 1 {
+ while {1} {
if {![regexp -start $e_idx -- {'[^']*'} $data string_data]} {
break
}
@@ -1443,28 +1469,28 @@ namespace eval ASMsyntaxHighlight {
}
# remove and highlight '('
- set opended_par 0
- while 1 {
+ set opened_par 0
+ while {1} {
set symbol_idx [string first {(} $data]
if {$symbol_idx == -1} {break}
- incr opended_par
+ incr opened_par
set data [string replace $data $symbol_idx $symbol_idx { }]
incr symbol_idx $start_index
$editor tag add tag_symbol $lineNumber.$symbol_idx $lineNumber.[expr {$symbol_idx + 1}]
}
# remove and highlight ')'
- while 1 {
+ while {1} {
set symbol_idx [string first {)} $data]
if {$symbol_idx == -1} {break}
- incr opended_par -1
+ incr opened_par -1
set data [string replace $data $symbol_idx $symbol_idx { }]
incr symbol_idx $start_index
$editor tag add tag_symbol $lineNumber.$symbol_idx $lineNumber.[expr {$symbol_idx + 1}]
}
# chcek if parenthesies are balanced
- if {$validation_L0 && $opended_par != 0} {
+ if {$validation_L0 && $opened_par != 0} {
$editor tag add tag_error $lineNumber.$start_index $lineNumber.$end_index
}
@@ -1473,7 +1499,7 @@ namespace eval ASMsyntaxHighlight {
regsub -all {\t} $adjusted_data { } adjusted_data
append adjusted_data { }
foreach symbol $expr_instructions {
- while 1 {
+ while {1} {
set symbol_idx [string first " $symbol " $adjusted_data]
if {$symbol_idx == -1} {break}
set original_symbol_idx $symbol_idx
@@ -1500,7 +1526,7 @@ namespace eval ASMsyntaxHighlight {
$editor tag add tag_error \
$lineNumber.[expr {$symbol_idx + 1}] \
$lineNumber.$symbol_end_index
- } {
+ } else {
foreach smb $expr_instructions {
if {![string first $smb $tmp]} {
$editor tag add tag_error \
@@ -1515,7 +1541,7 @@ namespace eval ASMsyntaxHighlight {
}
# Highlight expression symbols (1 char) and remove them from the string
foreach symbol $expr_symbols {
- while 1 {
+ while {1} {
set symbol_idx [string first $symbol $data]
if {$symbol_idx == -1} {break}
set original_symbol_idx $symbol_idx
@@ -1530,9 +1556,9 @@ namespace eval ASMsyntaxHighlight {
$validation_L0 && (
!$original_symbol_idx
||
- ![regexp {^\s*((\'\\?[^']\')|\w|\$)} [string range $data $symbol_idx_org_1 end]]
+ ![regexp {^\s*((\'\\?[^']+\')|\w|\$)} [string range $data $symbol_idx_org_1 end]]
)
- } {
+ } then {
$editor tag add tag_error \
$lineNumber.$symbol_idx \
$lineNumber.$symbol_idx_1
@@ -1544,7 +1570,7 @@ namespace eval ASMsyntaxHighlight {
set last_index $start_index
set original_data $data
set data [hide_strings $data]
- while 1 {
+ while {1} {
if {![regexp {[^\s]+} $data value]} {break}
@@ -1595,11 +1621,11 @@ namespace eval ASMsyntaxHighlight {
} elseif {[regexp {^(\d|')} $data]} {
# Gain information about the value
- set opr_info [which_radix 1 $data]
+ set opr_info [which_radix 1 [$editor get $lineNumber.$start_index $lineNumber.$end_index]]
set opr_base [lindex $opr_info 0]
set opr_in_dec [lindex $opr_info 1]
- # Highlight value acording to info
+ # Highlight value according to info
if {$opr_base == {}} {
$editor tag add tag_unknown_base $lineNumber.$start_index $lineNumber.$end_index
if {$validation_L0 && ![regexp {^[0-9A-Fa-f]+$} $data]} {
@@ -1611,7 +1637,7 @@ namespace eval ASMsyntaxHighlight {
$editor tag add tag_error $lineNumber.$start_index $lineNumber.$end_index
}
- # Highlight acording to numeric base
+ # Highlight according to numeric base
switch -- $opr_base {
{hex} { ;# Hexadecimal
$editor tag add tag_hex $lineNumber.$start_index $lineNumber.$end_index
@@ -1638,11 +1664,11 @@ namespace eval ASMsyntaxHighlight {
# Constant
if {[lsearch -ascii -exact $spec_registers [string toupper $data]] != -1} {
set tag tag_sfr
- } {
+ } else {
set tag tag_constant
}
$editor tag add $tag $lineNumber.$start_index $lineNumber.$end_index
- if {$validation_L0 && ![regexp {^((\w+)|\$)$} $data]} {
+ if {$validation_L0 && ![regexp {^(((\?\?)?\w+)|\$)$} $data]} {
$editor tag add tag_error $lineNumber.$start_index $lineNumber.$end_index
}
}
@@ -1655,7 +1681,7 @@ namespace eval ASMsyntaxHighlight {
if {[string first {'} $data] == -1} {return $data}
# Perform replacement
- while 1 {
+ while {1} {
if {![regexp {'[^']*'} $data string]} {
break
}
@@ -1673,3 +1699,7 @@ namespace eval ASMsyntaxHighlight {
foreach item ${::ASMsyntaxHighlight::all_controls} {
lappend ::ASMsyntaxHighlight::all_controls__with_dolar "\$$item"
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/editor/Csyntaxhighlight.tcl b/lib/editor/Csyntaxhighlight.tcl
index 8bdc913..c4ecd2a 100755..100644
--- a/lib/editor/Csyntaxhighlight.tcl
+++ b/lib/editor/Csyntaxhighlight.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 _CSYNTAXHIGHLIGHT_TCL ] } {
+set _CSYNTAXHIGHLIGHT_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements syntax highlighting interface for ISO C language
@@ -40,18 +45,23 @@ namespace eval CsyntaxHighlight {
#if #ifdef #ifndef
#else #elif #endif
#line #pragma #undef
+ #warning
}
# List of data type specifiers
variable data_types {
void int float double char signed unsigned
long short uchar ushort uint ulong const
export extern static mutable volatile
+
+ __data __near __xdata __far __idata __pdata __code
+ __bit __sfr __sfr16 __sfr32 __sbit __at
}
# List of C keywords
variable keywords {
auto break case _endasm while union continue
default do else enum sizeof for namespace
if goto return struct switch typedef using
+ _asm __asm __endasm
}
# List of doxygen tags -- No argument
variable doxy_tags_type0 {
@@ -69,7 +79,8 @@ namespace eval CsyntaxHighlight {
# List of doxygen tags -- Name after tag
variable doxy_tags_type2 {
@brief @ingroup @name @mainpage
- @fn @var @typedef
+ @fn @var @typedef @author
+ @authors
}
# List of HTML tags (HTML 4.0 Strict)
variable html_tags {
@@ -99,11 +110,12 @@ namespace eval CsyntaxHighlight {
# {
# {tag_name ?foreground? ?overstrike? ?italic? ?bold?}
# }
- variable hightlight_tags {
+ variable highlight_tags {
{tag_c_keyword #0000DD 0 0 1}
{tag_c_data_type #00CC00 0 0 1}
{tag_c_dec #0000FF 0 0 0}
{tag_c_hex #8800FF 0 0 0}
+ {tag_c_bin #5555AA 0 0 0}
{tag_c_oct #883300 0 0 0}
{tag_c_char #DD00DD 0 0 0}
{tag_c_float #AA00AA 0 0 0}
@@ -127,26 +139,22 @@ namespace eval CsyntaxHighlight {
}
## Define highlighting text tags in the given text widget
- # @parm Widget - ID of the target text widget
- # @parm Int - font size
- # @parm String - font family
- # @parm List = default - Highlighting tags definition
+ # @parm Widget text_widget - ID of the target text widget
+ # @parm Int fontSize - font size
+ # @parm String fontFamily - font family
+ # @parm List highlight=default - Highlighting tags definition
+ # @parm Bool nobold=0 - Ignore bold flag
# @return void
- proc create_tags args {
- variable hightlight_tags ;# Highlight tags definition
+ proc create_tags {text_widget fontSize fontFamily {highlight {}} {nobold 0}} {
+ variable highlight_tags ;# Highlight tags definition
# Handle arguments
- set text_widget [lindex $args 0] ;# text widget
- set fontSize [lindex $args 1] ;# font size
- set fontFamily [lindex $args 2] ;# font family
- if {[llength $args] > 3} { ;# highlighting definition
- set hightlight [lindex $args 3]
- } {
- set hightlight $hightlight_tags
+ if {$highlight == {}} { ;# highlighting definition
+ set highlight $highlight_tags
}
# Iterate over highlighting tags definition
- foreach item $hightlight {
+ foreach item $highlight {
# Create array of tag attributes
for {set i 0} {$i < 5} {incr i} {
set tag($i) [lindex $item $i]
@@ -159,13 +167,13 @@ namespace eval CsyntaxHighlight {
# Fonr slant
if {$tag(3) == 1} {
set tag(3) italic
- } {
+ } else {
set tag(3) roman
}
# Font weight
- if {$tag(4) == 1} {
+ if {$tag(4) == 1 && !$nobold} {
set tag(4) bold
- } {
+ } else {
set tag(4) normal
}
@@ -190,6 +198,7 @@ namespace eval CsyntaxHighlight {
tag_c_bracket tag_c_symbol tag_c_keyword
tag_c_data_type tag_c_char tag_c_dec
tag_c_oct tag_c_hex tag_c_float
+ tag_c_bin
} {
$text_widget tag raise $t tag_normal
}
@@ -245,7 +254,7 @@ namespace eval CsyntaxHighlight {
$editor tag add tag_c_preprocessor $line_start $line_end-1c
$editor tag add tag_c_symbol $line_end-1c $line_end
return 7
- } {
+ } else {
$editor tag add tag_c_preprocessor $line_start $line_end
return 1
}
@@ -274,7 +283,7 @@ namespace eval CsyntaxHighlight {
# Highlight directive argument
if {$directive == {#include}} {
set prep_tag {tag_c_prep_lib}
- } {
+ } else {
set prep_tag {tag_c_preprocessor}
}
@@ -284,7 +293,7 @@ namespace eval CsyntaxHighlight {
set cur_line_end $com_start
incr cur_line_end -1
set cur_line_end $line_number.$cur_line_end
- } {
+ } else {
set cur_line_end $line_end
}
@@ -308,14 +317,14 @@ namespace eval CsyntaxHighlight {
return $cur_status
# Inline assembler
- } elseif {[regexp {^\s*_asm\s*$} $line_content]} {
+ } elseif {[regexp {^\s*_?_asm\s*$} $line_content]} {
$editor tag add tag_c_keyword $line_start $line_end
return 5
}
}
# Split line into fields with different highlight status
- while 1 {
+ while {1} {
set incr_last_i 0
switch -- $status {
1 { ;# Normal
@@ -384,12 +393,12 @@ namespace eval CsyntaxHighlight {
}
4 { ;# String
set l_idx $last_idx_s
- while 1 {
+ while {1} {
set idx [string first "\"" $line_content $l_idx]
if {$idx < 1} {break}
if {[string index $line_content [expr {$idx - 1}]] == "\\"} {
incr l_idx
- } {
+ } else {
break
}
}
@@ -399,7 +408,7 @@ namespace eval CsyntaxHighlight {
set status 1
}
5 { ;# Inline assembler
- if {[regexp {^\s*_endasm[^\w]*} $line_content]} {
+ if {[regexp {^\s*_?_endasm[^\w]*} $line_content]} {
mode_normal 0 [string length $line_content]
return 1
}
@@ -409,10 +418,10 @@ namespace eval CsyntaxHighlight {
break
}
6 { ;# Inline assembler -- within asm block
- if {[regexp {^\s*_endasm[^\w]*} $line_content]} {
+ if {[regexp {^\s*_?_endasm[^\w]*} $line_content]} {
mode_normal 0 [string length $line_content]
return 1
- } {
+ } else {
break
}
}
@@ -437,14 +446,14 @@ namespace eval CsyntaxHighlight {
# Return final status
if {$this_line_only} {
return 1
- } {
+ } else {
return $status
}
}
## Auxiliary procedure for procedure highlight
# This procedure calls other procedures to perform syntax
- #+ highlight acording to the given highlight status
+ #+ highlight according to the given highlight status
# @parm Int status - Highlight status
# @parm Int idx0 - Start index
# @parm Int idx1 - End index
@@ -501,7 +510,7 @@ namespace eval CsyntaxHighlight {
set string [string range $line_content $idx0 [expr {$idx1 - 1}]]
# Highlight escaped characters and character between them
- while 1 {
+ while {1} {
# Search for backslash
set idx [string first "\\" $string $idx]
if {$idx == -1} {break}
@@ -545,18 +554,18 @@ namespace eval CsyntaxHighlight {
set words [split [regsub -all {>} [regsub -all {<} $string { &}] {& }]]
# Adjust HTML tags with argument(s) (they must be represented as a single word)
- set tag_opended 0
+ set tag_opened 0
set result_words {}
foreach word $words {
- if {!$tag_opended} {
+ if {!$tag_opened} {
append result_words { } ;# Insert a common space
- } {
+ } else {
append result_words "\xA0" ;# Insert NBSP
}
- if {!$tag_opended && [regexp {^<\w+$} $word]} {
- set tag_opended 1
- } elseif {$tag_opended && [string index $word end] == {>}} {
- set tag_opended 0
+ if {!$tag_opened && [regexp {^<\w+$} $word]} {
+ set tag_opened 1
+ } elseif {$tag_opened && [string index $word end] == {>}} {
+ set tag_opened 0
}
append result_words [regsub -all {[\{\}]} $word {\\&}]
}
@@ -670,7 +679,7 @@ namespace eval CsyntaxHighlight {
$editor tag add tag_c_dox_hargval \
$line_number.[expr {$idx0 + $idx + $sub_idx + $first_equ_mark}] \
$line_number.[expr {$idx0 + $idx + $sub_idx + $sub_len}]
- } {
+ } else {
set first_equ_mark $sub_len
}
@@ -727,7 +736,7 @@ namespace eval CsyntaxHighlight {
if {
$char == {(} || $char == {)} || $char == "\{" ||
$char == "\}" || $char == {[} || $char == {]}
- } {
+ } then {
$editor tag add tag_c_bracket $line_number.$j $line_number.$j+1c
# Other symbols
@@ -743,7 +752,7 @@ namespace eval CsyntaxHighlight {
{
set idx -1
foreach word $words {
- while 1 {
+ while {1} {
incr idx
set idx [string first $word $string $idx]
if {$idx == -1} {break}
@@ -765,7 +774,7 @@ namespace eval CsyntaxHighlight {
set idx -1
set len 0
set tags {}
- foreach word [split $string {   ;=,+-<>!|&*/?:%^\{\}[]()}] {
+ foreach word [split $string {   ;=,+-<>!|&*/?:%^{}[]()}] {
if {$word == {}} {continue}
incr idx
@@ -774,9 +783,11 @@ namespace eval CsyntaxHighlight {
# Char
if {![string is digit -strict [string index $word 0]]} {
- if {[regexp {^'[^']*'$} $word]} {
+ if {$word == {''}} {
+ set tags {tag_error}
+ } elseif {[regexp {^'[^']+'$} $word]} {
set tags {tag_c_char}
- } {
+ } else {
continue
}
@@ -787,10 +798,10 @@ namespace eval CsyntaxHighlight {
set tags {tag_c_dec}
} elseif {!$validation_L0 || [regexp {^0[0-7]+$} $word]} {
set tags {tag_c_oct}
- } {
+ } else {
set tags {tag_c_oct tag_error}
}
- } {
+ } else {
set tags {tag_c_dec}
}
@@ -801,12 +812,26 @@ namespace eval CsyntaxHighlight {
||
[string index $word 1] == {X}
)
- } {
- if {!$validation_L0 || [string is xdigit -strict [string range $word 2 end]]} {
- set tags {tag_c_hex}
- } {
- set tags {tag_c_hex tag_error}
- }
+ } then {
+ if {!$validation_L0 || [string is xdigit -strict [string range $word 2 end]]} {
+ set tags {tag_c_hex}
+ } else {
+ set tags {tag_c_hex tag_error}
+ }
+
+ # Bin
+ } elseif {
+ [string index $word 0] == {0} && (
+ [string index $word 1] == {b}
+ ||
+ [string index $word 1] == {B}
+ )
+ } then {
+ if {!$validation_L0 || [regexp {^[01]+$} [string range $word 2 end]]} {
+ set tags {tag_c_bin}
+ } else {
+ set tags {tag_c_bin tag_error}
+ }
# Float
} elseif {[regexp {^\d+\.\d+$} $word]} {
@@ -832,7 +857,7 @@ namespace eval CsyntaxHighlight {
# @return void
proc delete_tags {} {
variable editor ;# Widget: Editor text widget
- variable hightlight_tags ;# Highlight tags definition
+ variable highlight_tags ;# Highlight tags definition
variable line_start ;# Index of line start
variable line_end ;# Index of line end
@@ -842,12 +867,16 @@ namespace eval CsyntaxHighlight {
$editor tag remove c_lang_func $line_start $line_start+1l
$editor tag remove c_lang_var $line_start $line_start+1l
- # Remove tags acording to pattern
- foreach tag $hightlight_tags {
+ # Remove tags according to pattern
+ foreach tag $highlight_tags {
$editor tag remove [lindex $tag 0] $line_start $line_end
}
- foreach tag $::ASMsyntaxHighlight::hightlight_tags {
+ foreach tag $::ASMsyntaxHighlight::highlight_tags {
$editor tag remove [lindex $tag 0] $line_start $line_end
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/editor/LSTsyntaxhighlight.tcl b/lib/editor/LSTsyntaxhighlight.tcl
index c108de9..62f622f 100755..100644
--- a/lib/editor/LSTsyntaxhighlight.tcl
+++ b/lib/editor/LSTsyntaxhighlight.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 _LSTSYNTAXHIGHLIGHT_TCL ] } {
+set _LSTSYNTAXHIGHLIGHT_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements syntax highlighting interface for code listing
@@ -33,7 +38,7 @@ namespace eval LSTsyntaxHighlight {
# {
# {tag_name ?foreground? ?overstrike? ?italic? ?bold?}
# }
- variable hightlight_tags {
+ variable highlight_tags {
{tag_lst_number #000000 0 0 1}
{tag_lst_code #000000 0 0 1}
{tag_lst_address #000000 0 0 1}
@@ -74,26 +79,22 @@ namespace eval LSTsyntaxHighlight {
## Define highlighting text tags in the given text widget
- # @parm Widget - ID of the target text widget
- # @parm Int - font size
- # @parm String - font family
- # @parm List = default - Highlighting tags definition
+ # @parm Widget text_widget - ID of the target text widget
+ # @parm Int fontSize - font size
+ # @parm String fontFamily - font family
+ # @parm List highlight=default - Highlighting tags definition
+ # @parm Bool nobold=0 - Ignore bold flag
# @return void
- proc create_tags args {
- variable hightlight_tags ;# Highlight tags definition
+ proc create_tags {text_widget fontSize fontFamily {highlight {}} {nobold 0}} {
+ variable highlight_tags ;# Highlight tags definition
# Handle arguments
- set text_widget [lindex $args 0] ;# text widget
- set fontSize [lindex $args 1] ;# font size
- set fontFamily [lindex $args 2] ;# font family
- if {[llength $args] > 3} { ;# highlighting definition
- set hightlight [lindex $args 3]
- } {
- set hightlight $hightlight_tags
+ if {$highlight == {}} { ;# highlighting definition
+ set highlight $highlight_tags
}
# Iterate over highlighting tags definition
- foreach item $hightlight {
+ foreach item $highlight {
# Create array of tag attributes
for {set i 0} {$i < 5} {incr i} {
set tag($i) [lindex $item $i]
@@ -106,13 +107,13 @@ namespace eval LSTsyntaxHighlight {
# Fonr slant
if {$tag(3) == 1} {
set tag(3) italic
- } {
+ } else {
set tag(3) roman
}
# Font weight
- if {$tag(4) == 1} {
+ if {$tag(4) == 1 && !$nobold} {
set tag(4) bold
- } {
+ } else {
set tag(4) normal
}
@@ -152,7 +153,7 @@ namespace eval LSTsyntaxHighlight {
# Remove current highlighting tags
if {[string length [string trim $line_content]]} {
delete_tags
- } {
+ } else {
return 0
}
@@ -169,7 +170,7 @@ namespace eval LSTsyntaxHighlight {
return 1
}
}
-
+
# Search for error/warning messages
if {[regexp {^(\s+@@@@@)|^(\*\*\*\*)|^(\s+\^)} $line_content]} {
$editor tag add tag_lst_error $line_start $line_end
@@ -194,7 +195,7 @@ namespace eval LSTsyntaxHighlight {
if {${::ExternalCompiler::selected_assembler} == 3} {
set asm_start_index 19
as31_highlight 19
-|
+
# ASEM-51
} elseif {
[regexp {^\s*\d+(\:|\+)} $line_content] ||
@@ -205,7 +206,7 @@ namespace eval LSTsyntaxHighlight {
set asm_start_index 33
set idx -1
set cor 0
- while 1 {
+ while {1} {
set idx [string first "\t" $lineText [expr {$idx + 1}]]
if {$idx == -1} {break}
@@ -224,28 +225,32 @@ namespace eval LSTsyntaxHighlight {
sdcc_highlight 32
::R_ASMsyntaxHighlight::highlight $editor $line_number 1 32
return 1
-
+
# MCU 8051 IDE Assembler
} else {
set asm_start_index 31
mcu8051ide_highlight $asm_start_index
}
- # Highlight assembly code
+ # Highlight remaining assembly code
::ASMsyntaxHighlight::highlight $editor $line_number 1 $asm_start_index
+
+ # Make sure there are no ASM error tags, they don't make sense here
+ $editor tag remove tag_error $line_number.$asm_start_index $line_end
+
return 1
}
- ## Remove previously defined syntax highlighting tags
+ ## Remove previously put syntax highlighting tags
# @return void
proc delete_tags {} {
- variable hightlight_tags ;# Highlight tags definition
+ variable highlight_tags ;# Highlight tags definition
variable editor ;# Widget: Editor text widget
variable line_start ;# Index of line start
variable line_end ;# Index of line end
- # Remove tags acording to pattern
- foreach tag $hightlight_tags {
+ # Remove tags according to pattern
+ foreach tag $highlight_tags {
$editor tag remove [lindex $tag 0] $line_start $line_end
}
}
@@ -292,7 +297,7 @@ namespace eval LSTsyntaxHighlight {
variable line_content ;# String: Line content
variable line_start ;# Index of line start
variable line_end ;# Index of line end
-
+
set idx 0 ;# Regular expression match start index
set foo 0 ;# Foo :)
@@ -305,11 +310,11 @@ namespace eval LSTsyntaxHighlight {
set idx [string first $substring $line_content $idx]
$editor tag add tag_lst_line $line_number.$idx $line_number.[expr {$idx + $substr_len}]
incr idx $substr_len
- } {
+ } else {
set idx 6
set foo 1
}
-
+
# Highlight for inclusion level
if {[regexp -start $idx -- {\A[ \d]\d} $line_content substring]} {
set substr_len [string length $substring]
@@ -345,7 +350,7 @@ namespace eval LSTsyntaxHighlight {
$editor tag add tag_lst_number $line_number.$idx $line_number.[expr {$idx + $substr_len}]
incr idx $substr_len
}
-
+
# Highlight processor code
} elseif {[regexp -start $idx -- {\A\s+([[:xdigit:]]{2} )*[[:xdigit:]]{2}} $line_content substring]} {
set substr_len [string length $substring]
@@ -377,13 +382,13 @@ namespace eval LSTsyntaxHighlight {
variable line_content ;# String: Line content
variable line_start ;# Index of line start
variable line_end ;# Index of line end
-
+
set idx 0 ;# Regular expression match start index
-
+
# Alter line
set line_content [string range $line_content 0 [expr {$asm_start_index - 1}]]
-
- # Highlight processor code
+
+ # Highlight processor code
if {[regexp -start $idx -- {\A [[:xdigit:]]{2,}} $line_content substring]} {
set substr_len [string length $substring]
set idx [string first $substring $line_content $idx]
@@ -400,7 +405,7 @@ namespace eval LSTsyntaxHighlight {
set idx [string first $substring $line_content $idx]
$editor tag add tag_lst_address $line_number.$idx $line_number.[expr {$idx + $substr_len}]
incr idx $substr_len
-
+
# Highlight processor code
if {[regexp -start $idx -- {\A\s+[[:xdigit:]]{2,}} $line_content substring]} {
set substr_len [string length $substring]
@@ -417,7 +422,7 @@ namespace eval LSTsyntaxHighlight {
$editor tag add tag_lst_number $line_number.$idx $line_number.[expr {$idx + $substr_len}]
incr idx $substr_len
}
-
+
# Highlight inclusion level
if {[regexp -start $idx -- {\A\s+\=\d+} $line_content substring]} {
set substr_len [string length $substring]
@@ -441,3 +446,7 @@ namespace eval LSTsyntaxHighlight {
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/editor/R_ASMsyntaxhighlight.tcl b/lib/editor/R_ASMsyntaxhighlight.tcl
index 2408bff..250da57 100755..100644
--- a/lib/editor/R_ASMsyntaxhighlight.tcl
+++ b/lib/editor/R_ASMsyntaxhighlight.tcl
@@ -2,7 +2,7 @@
# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
############################################################################
-# Copyright (C) 2007-2008 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 _R_ASMSYNTAXHIGHLIGHT_TCL ] } {
+set _R_ASMSYNTAXHIGHLIGHT_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements syntax highlighting interface for reallocable assembly
@@ -86,24 +91,20 @@ namespace eval R_ASMsyntaxHighlight {
variable validation_L1 1 ;# Bool: Advancet validation enabled
## Define highlighting text tags in the given text widget
- # @parm Widget - ID of the target text widget
- # @parm Int - font size
- # @parm String - font family
- # @parm List = default - Highlighting tags definition
+ # @parm Widget text_widget - ID of the target text widget
+ # @parm Int fontSize - font size
+ # @parm String fontFamily - font family
+ # @parm List highlight=default - Highlighting tags definition
+ # @parm Bool nobold=0 - Ignore bold flag
# @return void
- proc create_tags args {
+ proc create_tags {text_widget fontSize fontFamily {highlight {}} {nobold 0}} {
# Handle arguments
- set text_widget [lindex $args 0] ;# text widget
- set fontSize [lindex $args 1] ;# font size
- set fontFamily [lindex $args 2] ;# font family
- if {[llength $args] > 3} { ;# highlighting definition
- set hightlight [lindex $args 3]
- } {
- set hightlight $::ASMsyntaxHighlight::hightlight_tags
+ if {$highlight == {}} { ;# highlighting definition
+ set highlight $::ASMsyntaxHighlight::highlight_tags
}
# Iterate over highlighting tags definition
- foreach item $hightlight {
+ foreach item $highlight {
# Create array of tag attributes
for {set i 0} {$i < 5} {incr i} {
set tag($i) [lindex $item $i]
@@ -116,13 +117,13 @@ namespace eval R_ASMsyntaxHighlight {
# Fonr slant
if {$tag(3) == 1} {
set tag(3) italic
- } {
+ } else {
set tag(3) roman
}
# Font weight
- if {$tag(4) == 1} {
+ if {$tag(4) == 1 && !$nobold} {
set tag(4) bold
- } {
+ } else {
set tag(4) normal
}
@@ -142,13 +143,13 @@ namespace eval R_ASMsyntaxHighlight {
}
## Perform syntax highlight on the given line in the given widget
- # @parm Widget Editor - Text widget
- # @parm Int LineNumber - Number of line to highlight
- # @parm Bool inline_asm - Inline assembler
- # @parm Int boundary_0 = 0 - Start index
- # @parm Int boundary_1 = end - End index
+ # @parm Widget p_editor - Text widget
+ # @parm Int linenumber - Number of line to highlight
+ # @parm Bool inlineasm=0 - Inline assembler
+ # @parm Int linestart=0 - Start index
+ # @parm Int lineend=end - End index
# @return Bool - result
- proc highlight args {
+ proc highlight {p_editor linenumber {inlineasm 0} {linestart {}} {lineend {}}} {
variable editor ;# ID of the text widget
variable lineNumber ;# Number of current line
variable lineStart ;# Index of line start
@@ -170,27 +171,22 @@ namespace eval R_ASMsyntaxHighlight {
variable validation_L0 ;# Bool: Basic validation enabled
# Parse input arguments
- set editor [lindex $args 0]
- set lineNumber [lindex $args 1]
- set inline_asm [lindex $args 2]
- set lineStart [lindex $args 3]
- set lineEnd [lindex $args 4]
- if {$inline_asm == {}} {
- set inline_asm 0
- }
- if {$lineStart == {}} {
+ set editor $p_editor
+ set lineNumber $linenumber
+ set inline_asm $inlineasm
+ if {$linestart == {}} {
set lineStart $lineNumber.0
- } {
- set lineStart $lineNumber.$lineStart
+ } else {
+ set lineStart $lineNumber.$linestart
}
- if {$lineEnd == {}} {
+ if {$lineend == {}} {
set lineEnd [$editor index "$lineStart lineend"]
- } {
+ } else {
set lineEnd $lineNumber.$lineEnd
}
- if {[lindex $args 3] != {}} {
- set start_offset [lindex $args 3]
- } {
+ if {$linestart != {}} {
+ set start_offset $linestart
+ } else {
set start_offset 0
}
@@ -227,7 +223,7 @@ namespace eval R_ASMsyntaxHighlight {
if {$comment_start == 0} {
set data {}
delete_tags
- } {
+ } else {
set data [string range $data 0 [expr {$comment_start - 1}]]
regsub {\s+$} $data {} data
}
@@ -295,7 +291,7 @@ namespace eval R_ASMsyntaxHighlight {
if {
$validation_L0 &&
([regexp {^\d} $seg_1] || ![regexp {^\w+$} $seg_1])
- } {
+ } then {
put_error_on_segment 1
}
determinate_segment_2
@@ -314,7 +310,7 @@ namespace eval R_ASMsyntaxHighlight {
determinate_segment_2
if {[string tolower $seg_0] == {.optsdcc}} {
$editor tag add tag_string $lineNumber.$seg_0_end $lineEnd
- } {
+ } else {
parse_expressions
}
}
@@ -376,8 +372,8 @@ namespace eval R_ASMsyntaxHighlight {
# Remove tag error
$editor tag remove tag_error $lineStart_truestart $lineEnd
- # Remove tags acording to pattern
- foreach tag $::ASMsyntaxHighlight::hightlight_tags {
+ # Remove tags according to pattern
+ foreach tag $::ASMsyntaxHighlight::highlight_tags {
$editor tag remove [lindex $tag 0] $lineStart_truestart $lineEnd
}
}
@@ -412,7 +408,7 @@ namespace eval R_ASMsyntaxHighlight {
set seg_1_start $last_index
# Line is not empty
- } {
+ } else {
set data_backup $data
set last_index_backup $last_index
@@ -508,7 +504,7 @@ namespace eval R_ASMsyntaxHighlight {
} elseif {$segment_data == {=} || $segment_data == {==}} {
$editor tag add tag_symbol $lineNumber.$start $lineNumber.$end
set seg_type {assignment}
- } {
+ } else {
set seg_type {unknown}
}
}
@@ -565,9 +561,9 @@ namespace eval R_ASMsyntaxHighlight {
if {[regexp {^\s*$} $seg_2]} {return 0}
- while 1 {
+ while {1} {
# Handle redutant commas
- while 1 {
+ while {1} {
if {![regexp {^\s*\,} $seg_2]} {break}
set space_len 0
@@ -639,9 +635,9 @@ namespace eval R_ASMsyntaxHighlight {
set original_data $seg_2
set data [hide_strings $seg_2]
- while 1 {
+ while {1} {
# Handle redutant commas
- while 1 {
+ while {1} {
if {![regexp {^\s*\,} $data]} {break}
set space_len 0
@@ -672,7 +668,7 @@ namespace eval R_ASMsyntaxHighlight {
set space_len [string length $space]
set opr_start [expr {$last_index + $space_len}]
set operand [string range $operand $space_len end]
- } {
+ } else {
set opr_start $last_index
}
@@ -681,7 +677,7 @@ namespace eval R_ASMsyntaxHighlight {
set space_len [string length $space]
set opr_end [expr {$operand_len - $space_len}]
set operand [string range $operand 0 $opr_end]
- } {
+ } else {
set opr_end $operand_len
}
incr opr_end $last_index
@@ -725,7 +721,7 @@ namespace eval R_ASMsyntaxHighlight {
default {
if {[lsearch -ascii -exact {R0 R1 R2 R3 R4 R5 R6 R7 DPTR A AB C} $opr] != -1} {
lappend ::ASMsyntaxHighlight::opr_types $opr
- } {
+ } else {
lappend ::ASMsyntaxHighlight::opr_types {D}
}
}
@@ -756,7 +752,7 @@ namespace eval R_ASMsyntaxHighlight {
if {$len > 3} {
put_tag_on_operand tag_string
- } {
+ } else {
put_tag_on_operand tag_imm_char
}
@@ -773,7 +769,7 @@ namespace eval R_ASMsyntaxHighlight {
} elseif {
$validation_L0 &&
([string length $operand] == 0 || ![regexp {^[\w\.\\]+$} $operand])
- } {
+ } then {
# put_tag_on_operand tag_error
# Operand value determinated successfully
@@ -804,12 +800,11 @@ namespace eval R_ASMsyntaxHighlight {
$lineNumber.$opr_start $lineNumber.$opr_start+1c
} elseif {
- $validation_L0 &&
- ([string length $operand] == 0 || ![regexp {^'?[\w\.]+'?$} $operand])
- } {
-
- # Operand has no value => incorrect operand
-# put_tag_on_operand tag_error
+ $validation_L0 &&
+ ([string length $operand] == 0 || ![regexp {^'?[\w\.]+'?$} $operand])
+ } then {
+ # Operand has no value => incorrect operand
+# put_tag_on_operand tag_error
} else {
parse_operand_auxiliary $::ASMsyntaxHighlight::spec_bits {
@@ -841,7 +836,7 @@ namespace eval R_ASMsyntaxHighlight {
put_tag_on_operand tag_sfr
# Something else than SFR
- } {
+ } else {
parse_operand_auxiliary2 $tag_list
}
}
@@ -897,8 +892,8 @@ namespace eval R_ASMsyntaxHighlight {
put_tag_on_operand [lindex $tag_list 0]
# Radix determinated correctly - continue normaly
- } {
- # highlight acording to numeric base
+ } else {
+ # highlight according to numeric base
switch -- $opr_base {
{hex} {put_tag_on_operand [lindex $tag_list 1]}
{dec} {put_tag_on_operand [lindex $tag_list 2]}
@@ -910,7 +905,7 @@ namespace eval R_ASMsyntaxHighlight {
}
# defined by a symbolic name
- } {
+ } else {
put_tag_on_operand [lindex $tag_list 6]
}
}
@@ -996,7 +991,7 @@ namespace eval R_ASMsyntaxHighlight {
if {[regexp {^[0-7]*$} $number]} {
if {$len != 3} {
set dec_val 0
- } {
+ } else {
if {[string index $number 0] <= 3} {
set dec_val 0
}
@@ -1014,7 +1009,7 @@ namespace eval R_ASMsyntaxHighlight {
if {[regexp {^[0-7]*$} $number]} {
if {$len != 3} {
set dec_val 0
- } {
+ } else {
if {[string index $number 0] <= 3} {
set dec_val 0
}
@@ -1037,7 +1032,7 @@ namespace eval R_ASMsyntaxHighlight {
}
# done ...
- return "$base $dec_val"
+ return [list $base $dec_val]
}
## Highlight expressions (eg. '( 10d - X MOD 55h)')
@@ -1062,7 +1057,7 @@ namespace eval R_ASMsyntaxHighlight {
# Remove strings
set e_idx 0
- while 1 {
+ while {1} {
if {![regexp -start $e_idx -- {'[^']*'} $data string_data]} {
break
}
@@ -1079,22 +1074,22 @@ namespace eval R_ASMsyntaxHighlight {
}
# remove and highlight '('
- set opended_par 0
- while 1 {
+ set opened_par 0
+ while {1} {
set symbol_idx [string first {(} $data]
if {$symbol_idx == -1} {break}
- incr opended_par
+ incr opened_par
set data [string replace $data $symbol_idx $symbol_idx { }]
incr symbol_idx $start_index
$editor tag add tag_symbol $lineNumber.$symbol_idx $lineNumber.[expr {$symbol_idx + 1}]
}
# remove and highlight ')'
- while 1 {
+ while {1} {
set symbol_idx [string first {)} $data]
if {$symbol_idx == -1} {break}
- incr opended_par -1
+ incr opened_par -1
set data [string replace $data $symbol_idx $symbol_idx { }]
incr symbol_idx $start_index
$editor tag add tag_symbol $lineNumber.$symbol_idx $lineNumber.[expr {$symbol_idx + 1}]
@@ -1105,7 +1100,7 @@ namespace eval R_ASMsyntaxHighlight {
regsub {\t} $adjusted_data { } adjusted_data
# highlight expr. symbols (1 char) and remove them from the string
foreach symbol $expr_symbols {
- while 1 {
+ while {1} {
set symbol_idx [string first $symbol $data]
if {$symbol_idx == -1} {break}
set original_symbol_idx $symbol_idx
@@ -1122,7 +1117,7 @@ namespace eval R_ASMsyntaxHighlight {
set last_index $start_index
set original_data $data
set data [hide_strings $data]
- while 1 {
+ while {1} {
if {![regexp {[^\s]+} $data value]} {break}
set value_S_idx [string first $value $data]
@@ -1175,13 +1170,13 @@ namespace eval R_ASMsyntaxHighlight {
set opr_base [lindex $opr_info 0]
set opr_in_dec [lindex $opr_info 1]
- # Highlight value acording to info
+ # Highlight value according to info
if {$opr_base == {}} {
$editor tag add tag_unknown_base $lineNumber.$start_index $lineNumber.$end_index
return
}
- # Highlight acording to numeric base
+ # Highlight according to numeric base
switch -- $opr_base {
{hex} { ;# Hexadecimal
$editor tag add tag_hex $lineNumber.$start_index $lineNumber.$end_index
@@ -1217,7 +1212,7 @@ namespace eval R_ASMsyntaxHighlight {
if {[string first {'} $data] == -1} {return $data}
# Perform replacement
- while 1 {
+ while {1} {
if {![regexp {'[^']*'} $data string]} {
break
}
@@ -1230,3 +1225,7 @@ namespace eval R_ASMsyntaxHighlight {
return $data
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/editor/autocompletion.tcl b/lib/editor/autocompletion.tcl
index a5c9234..04dca79 100755..100644
--- a/lib/editor/autocompletion.tcl
+++ b/lib/editor/autocompletion.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,20 +21,64 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _AUTOCOMPLETION_TCL ] } {
+set _AUTOCOMPLETION_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements autocompletion related procedures
# This file should be loaded into class Editor in file "editor.tcl"
# --------------------------------------------------------------------------
-
-## Refresh list of avaliable SFR's and SFB's on the target uC
+common invoke_com_win_in_p 0 ;# Bool: invoke_completion_popup_window in progress
+common completion_win_opened 0 ;# Bool: Editor popup-based completion window opended
+
+## Array: Strings available for autocompletion
+ # Index 0 - Labels in assembly
+ # Index 1 - Constants/variables
+ # Index 2 - C variables
+ # Index 3 - Macros
+ # Index 4 - SFR's
+ # Index 5 - Expression symbols
+ # Index 6 - Doxygen tags
+ # Index 7 - C Functions
+private variable autocompletion_list
+private variable completion_win_str_i 1.0 ;# TextIndex: String to complete - start index
+private variable completion_win_end_i 1.0 ;# TextIndex: String to complete - end index
+private variable completion_win_mode 0 ;# Int: Completion window mode
+private variable comp_win_loading_in_p 0 ;# Bool: Completion window list loading is in progress
+private variable comp_win_loading_max 1 ;# Int: Maximum for progressbar in the completion window
+private variable macl_invocations 0 ;# Int: Number of invocations of "manage_autocompletion_list"
+private variable doxytag_fg {#000000} ;# Color: Highlight color for doxygen tag
+private variable indirect_fg {#000000} ;# Color: Highlight color for indirect address
+private variable symbol_fg {#000000} ;# Color: Highlight color for asm. symbol
+private variable sfr_fg {#000000} ;# Color: Highlight color for SFR
+private variable label_fg {#000000} ;# Color: Highlight color for asm. label
+private variable macro_fg {#000000} ;# Color: Highlight color for asm. macro
+private variable const_fg {#000000} ;# Color: Highlight color for asm. const
+private variable dir_fg {#000000} ;# Color: Highlight color for asm. directive
+private variable cs_fg {#000000} ;# Color: Highlight color for constrol sequence
+private variable ins_fg {#000000} ;# Color: Highlight color for instruction
+private variable doxytag_font ${::Editor::defaultFont} ;# Font: Font for doxygen tag
+private variable indirect_font ${::Editor::defaultFont} ;# Font: Font for indirect address
+private variable symbol_font ${::Editor::defaultFont} ;# Font: Font for asm. symbol
+private variable sfr_font ${::Editor::defaultFont} ;# Font: Font for SFR
+private variable label_font ${::Editor::defaultFont} ;# Font: Font for asm. label
+private variable macro_font ${::Editor::defaultFont} ;# Font: Font for asm. macro
+private variable const_font ${::Editor::defaultFont} ;# Font: Font for asm. const
+private variable dir_font ${::Editor::defaultFont} ;# Font: Font for asm. directive
+private variable cs_font ${::Editor::defaultFont} ;# Font: Font for constrol sequence
+private variable ins_font ${::Editor::defaultFont} ;# Font: Font for instruction
+
+
+## Refresh list of available SFR's and SFB's on the target uC
# @return void
-public method refresh_avaliable_SFR {} {
- set autocompletion_list(4) [lsort -ascii [$parentObject cget -avaliable_SFR]]
+public method refresh_available_SFR {} {
+ set autocompletion_list(4) [lsort -ascii [$parentObject cget -available_SFR]]
}
-
## Clear list of words for autocompletion window
# @return void
public method clear_autocompletion_list {} {
@@ -49,14 +93,21 @@ public method clear_autocompletion_list {} {
#+ autocompletion list up to date
# @parm TextIndex start_index - Start
# @parm TextIndex end_index - End
+ # @parm Bool do_spellcheck - Perform spell check
# @return void
-public method detete_text_in_editor {start_index end_index} {
+public method detete_text_in_editor {start_index end_index {do_spellcheck 1}} {
autocompletion_maybe_important_change $start_index $end_index
+ if {$do_spellcheck} {
+ spellcheck_change_detected_pre
+ }
$editor delete $start_index $end_index
+ if {$do_spellcheck} {
+ spellcheck_change_detected_post
+ }
}
## Inform autocompletion mechanism about possibly deleted symbol
- # @parm TextIndex start_index - Begining on area to to analyze
+ # @parm TextIndex start_index - Beginning on area to to analyze
# @parm TextIndex end_index - End on area to to analyze
# @return void
public method autocompletion_maybe_important_change {start_index end_index} {
@@ -97,7 +148,7 @@ public method autocompletion_maybe_important_change {start_index end_index} {
set idx [lsearch -ascii -exact $autocompletion_list($index) $string]
if {$idx != -1} {
$parentObject rightPanel_adjust_symbol_list \
- all $string $index 0
+ all $string $index 0 $this
set autocompletion_list($index) \
[lreplace $autocompletion_list($index) $idx $idx]
@@ -135,24 +186,33 @@ private method autocompletion_c_syntax_analyze {line_number} {
set end 0
set string {}
- # Find part which consist of alfanumeric characters
- if {![regexp -start $start -- {\w+} $line string]} {
- return
+ # Find part which consist of alphanumeric characters
+ while {1} {
+ if {![regexp -start $start -- {\w+} $line string]} {
+ return
+ }
+
+ incr start
+ set end [expr {$start + [string length $string]}]
+
+ if {[string is digit [string index $string 0]]} {
+ incr start [string length $string]
+ } else {
+ break
+ }
}
- set start [string first $string $line $start]
- set end [expr {$start + [string length $string]}]
# Mark the word
if {[regexp -start $end -- {\s*\(} $line]} {
$editor tag add c_lang_func $line_number.$start $line_number.$end
- } {
+ } else {
$editor tag add c_lang_var $line_number.$start $line_number.$end
}
}
}
## Inform autocompletion mechanism about possibly newly defined symbol
- # @parm Int line_number - Line number
+ # @parm Int line_number - Line number
# @return void
public method manage_autocompletion_list {line_number} {
# Detect new symbol
@@ -184,7 +244,7 @@ public method manage_autocompletion_list {line_number} {
||
[lsearch -ascii -exact ${::CsyntaxHighlight::keywords} $string] != -1
} then {
- return
+ continue
}
}
@@ -196,9 +256,9 @@ public method manage_autocompletion_list {line_number} {
# Append to the autocompletion list
if {[lsearch -ascii -exact $autocompletion_list($index) $string] == -1} {
lappend autocompletion_list($index) $string
-
$parentObject rightPanel_adjust_symbol_list \
- $line_number $string $index 1
+ $line_number $string $index 1 $this
+ $parentObject rightPanel_sm_select $line_number
}
}
}
@@ -220,7 +280,7 @@ public method manage_autocompletion_list {line_number} {
# 2 - C functions
# 3 - Indirect values
# 4 - Doxygen tags
- # @parm String str - Incomplite instruction or directive
+ # @parm String str - Incomplete instruction or directive
# @parm Int x - Relative X position of the popup window (relative to editor)
# @parm Int y - Relative Y position of the popup window (relative to editor)
# @return void
@@ -281,13 +341,14 @@ private method invoke_completion_popup_window {mode start_idx end_idx} {
# Create lisbox and scrollbar
set frame [frame $win.frame]
- set listbox [ListBox $frame.listbox \
- -relief flat -bd 0 -selectfill 1 \
- -selectbackground {#AAAAFF} \
- -bg white -cursor left_ptr \
+ set listbox [ListBox $frame.listbox \
+ -relief flat -bd 0 -selectfill 0 \
+ -selectbackground {#AAAAFF} \
+ -bg white -cursor left_ptr \
-yscrollcommand "$frame.scrollbar set" \
- -selectmode single -width 0 -height 0 \
- -highlightthickness 0 -padx 2 \
+ -selectmode single -width 0 -height 0 \
+ -highlightthickness 0 -padx 2 \
+ -font $defaultFont_bold \
]
set completion_listbox $listbox
pack $listbox -side left -fill both -expand 1
@@ -316,7 +377,7 @@ private method invoke_completion_popup_window {mode start_idx end_idx} {
set listbox ".completion_win.frame.listbox"
$listbox selection clear
$listbox delete [$listbox items]
- update idle
+ update idletasks
if {$loading || $comp_win_loading_in_p} {
if {!($comp_win_loading_max > 1)} {
@@ -456,7 +517,7 @@ private method invoke_completion_popup_window {mode start_idx end_idx} {
}
# Control sequences
- } {
+ } else {
foreach command ${::ASMsyntaxHighlight::all_controls__with_dolar} {
set shortcmd [string range $command 0 $end]
if {$shortcmd == $str} {
@@ -615,10 +676,10 @@ public method close_completion_popup_window {} {
#+ state of this object
# @return void
proc close_completion_popup_window_NOW {} {
- if {$invoke_com_win_in_p} {return}
- set invoke_com_win_in_p 1
+ if {${::Editor::invoke_com_win_in_p}} {return}
+ set ::Editor::invoke_com_win_in_p 1
- if {$completion_win_opened} {
+ if {${::Editor::completion_win_opened}} {
catch {
grab release .completion_win
}
@@ -627,8 +688,8 @@ proc close_completion_popup_window_NOW {} {
}
}
- set completion_win_opened 0
- set invoke_com_win_in_p 0
+ set ::Editor::completion_win_opened 0
+ set ::Editor::invoke_com_win_in_p 0
}
## Auxiliary method for method "Key"
@@ -788,7 +849,7 @@ private method aux_Key_autocompletion_5 {wordstart wordend} {
## Determinate color for instructions, directives, etc.
# @return void
private method refresh_highlighting_for_autocompletion {} {
- foreach key ${::ASMsyntaxHighlight::hightlight_tags} {
+ foreach key ${::ASMsyntaxHighlight::highlight_tags} {
if {[lindex $key 0] == {tag_instruction}} {
set ins_fg [lindex $key 1]
set ins_font [$editor tag cget tag_instruction -font]
@@ -828,7 +889,7 @@ private method refresh_highlighting_for_autocompletion {} {
}
if {$prog_language == 1} {
- foreach key ${::CsyntaxHighlight::hightlight_tags} {
+ foreach key ${::CsyntaxHighlight::highlight_tags} {
if {[lindex $key 0] == {tag_c_dox_tag}} {
set doxytag_fg [lindex $key 1]
set doxytag_font [$editor tag cget tag_c_dox_tag -font]
@@ -836,3 +897,7 @@ private method refresh_highlighting_for_autocompletion {} {
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/editor/commandline.tcl b/lib/editor/commandline.tcl
index 4fe39c3..4e15e0a 100755..100644
--- a/lib/editor/commandline.tcl
+++ b/lib/editor/commandline.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 _COMMANDLINE_TCL ] } {
+set _COMMANDLINE_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements procedures related to editor command line
@@ -50,7 +55,7 @@ public method cmd_line_key {key} {
{Delete} {
if {[llength [$cmd_line tag nextrange sel 1.0]]} {
$cmd_line delete sel.first sel.last
- } {
+ } else {
if {[$cmd_line index insert] != [$cmd_line index {insert lineend}]} {
$cmd_line delete insert {insert+1c}
}
@@ -59,7 +64,7 @@ public method cmd_line_key {key} {
{BackSpace} {
if {[llength [$cmd_line tag nextrange sel 1.0]]} {
$cmd_line delete sel.first sel.last
- } {
+ } else {
if {[$cmd_line index insert] != [$cmd_line index {insert linestart}]} {
$cmd_line delete {insert-1c} insert
}
@@ -149,7 +154,7 @@ public method cmd_line_enter {} {
}
set command [cmd_line_get_possible_cmds $command]
if {$command == {}} {
- Sbar [mc "EDITOR COMMAND LINE: invalid command, type `help list' to get list of avaliable commands"]
+ Sbar [mc "EDITOR COMMAND LINE: invalid command, type `help list' to get list of available commands"]
return
} elseif {[llength $command] > 1} {
Sbar [mc "Ambiguous command"]
@@ -164,8 +169,8 @@ public method cmd_line_enter {} {
Sbar [mc "EDITOR COMMAND LINE: wrong # args (command: %s)" "char"]
}
if {![llength $args]} {
- cmd_line_help_window {Help} [mc \
- "This is MCU 8051 IDE command line\n\nusage: <b>command \[argumets\]</b>\n\nEnter <b>help list</b> for list of avaliable commands or\n<b>help <STRING command></b> for help for individual command"]
+ cmd_line_help_window [mc "Help"] [mc \
+ "This is MCU 8051 IDE command line\n\nusage: <b>command \[arguments\]</b>\n\nEnter <b>help list</b> for list of available commands or\n<b>help <STRING command></b> for help for individual command"]
return
}
set command [lindex $args 0]
@@ -179,7 +184,7 @@ public method cmd_line_enter {} {
switch -- $command {
{list} {
- cmd_line_help_window [mc "Avaliable commands"] \
+ cmd_line_help_window [mc "Available commands"] \
"<b>d2h</b> [mc {DEC -> HEX}]
<b>d2o</b> [mc {DEC -> OCT}]
<b>d2b</b> [mc {DEC -> BIN}]
@@ -199,7 +204,7 @@ public method cmd_line_enter {} {
<b>breakpoint</b> [mc {Add/Remove breakpoint}]
<b>capitalize</b> [mc {Capitalize selection}]
<b>clear</b> [mc {Clear history}]
- <b>comment</b> [mc {Comment slected text}]
+ <b>comment</b> [mc {Comment selected text}]
<b>copy</b> [mc {Copy selection}]
<b>custom</b> [mc {Custom command}]
<b>cut</b> [mc {Cut selection}]
@@ -236,11 +241,11 @@ public method cmd_line_enter {} {
}
{hibernate} {
cmd_line_help_window [mc "Command hibernate"] [mc \
- "<b>hibernate</b> \[<STRING target-file>\]\nHibernate running program (avaliliable only when simulator is stated).\n\nThis function saves current state of the simulator engine for future resumption. If no target is not specified it will invoke file selection dialog"]
+ "<b>hibernate</b> \[<STRING target-file>\]\nHibernate running program (available only when simulator is stated).\n\nThis function saves current state of the simulator engine for future resumption. If no target is not specified it will invoke file selection dialog"]
}
{resume} {
cmd_line_help_window [mc "Command resume"] [mc \
- "<b>resume</b> \[<STRING source-file>\]\nResume hibernated program (avaliliable only when simulator is stated).\n\nThis function restores previous state of the simulator engine stored in the given file. If no source is not specified it will invoke file selection dialog"]
+ "<b>resume</b> \[<STRING source-file>\]\nResume hibernated program (available only when simulator is stated).\n\nThis function restores previous state of the simulator engine stored in the given file. If no source is not specified it will invoke file selection dialog"]
}
{switch-mcu} {
cmd_line_help_window [mc "Command switch-mcu"] [mc \
@@ -248,15 +253,15 @@ public method cmd_line_enter {} {
}
{set-xcode} {
cmd_line_help_window [mc "Command set-xcode"] [mc \
- "<b>set-xcode</b> <INT size>\nChange capacity of external program memory.\nNote: this command also close CODE memory hexeditor"]
+ "<b>set-xcode</b> <INT size>\nChange capacity of external program memory.\nNote: this command also close CODE memory hex editor"]
}
{set-xdata} {
cmd_line_help_window [mc "Command set-xdata"] [mc \
- "<b>set-xdata</b> <INT size>\nChange capacity of external data memory.\nNote: this command also close XDATA memory hexeditor"]
+ "<b>set-xdata</b> <INT size>\nChange capacity of external data memory.\nNote: this command also close XDATA memory hex editor"]
}
{run} {
cmd_line_help_window [mc "Command run"] [mc \
- "Run simulation (avaliliable only when simulator is stated)"]
+ "Run simulation (available only when simulator is stated)"]
}
{exit} {
cmd_line_help_window [mc "Command exit"] [mc \
@@ -276,7 +281,7 @@ public method cmd_line_enter {} {
}
{help} {
cmd_line_help_window [mc "Command help"] [mc \
- "<b>help</b> <STRING command>\nShows help for the given command\n\n<b>help list</b>\nShows list of avaliable command"]
+ "<b>help</b> <STRING command>\nShows help for the given command\n\n<b>help list</b>\nShows list of available command"]
}
{open} {
cmd_line_help_window [mc "Command open"] [mc \
@@ -304,7 +309,7 @@ public method cmd_line_enter {} {
}
{date} {
cmd_line_help_window [mc "Command date"] [mc \
- "<b>date</b> <STRING format>\nInserts formated date at the current position in text\n\n<b>Format string:</b>\n%% => %\n%a => Weekday name (Mon, Tue, etc.)\n%A => Weekday name (Monday, Tuesday, etc.)\n%b => Month name (Jan, Feb, etc.)\n%B => Full month name\n%C => Year (19 or 20)\n%d => Day of month (01 - 31)\n%D => %m/%d/%y\n%h => Abbreviated month name.\n%H => Hour (00 - 23)\n%I => Hour (01 - 12)\n%j => Day of year (001 - 366)\n%k => Hour (0 - 23)\n%l => Hour (1 - 12).\n%m => Month (01 - 12)\n%M => Minute (00 - 59)\n%n => Newline\n%p => AM/PM\n%R => %H:%M.\n%s => Unix timestamp\n%S => Seconds (00 - 59)\n%t => Tab\n%T => %H:%M:%S.\n%u => Weekday number (Monday = 1, Sunday = 7)\n%w => Weekday number (Sunday = 0, Saturday = 6)\n%y => Year without century (00 - 99)\n%Y => Year with century (e.g. 1459)"]
+ "<b>date</b> <STRING format>\nInserts formatted date at the current position in text\n\n<b>Format string:</b>\n%% => %\n%a => Weekday name (Mon, Tue, etc.)\n%A => Weekday name (Monday, Tuesday, etc.)\n%b => Month name (Jan, Feb, etc.)\n%B => Full month name\n%C => Year (19 or 20)\n%d => Day of month (01 - 31)\n%D => %m/%d/%y\n%h => Abbreviated month name.\n%H => Hour (00 - 23)\n%I => Hour (01 - 12)\n%j => Day of year (001 - 366)\n%k => Hour (0 - 23)\n%l => Hour (1 - 12).\n%m => Month (01 - 12)\n%M => Minute (00 - 59)\n%n => Newline\n%p => AM/PM\n%R => %H:%M.\n%s => Unix timestamp\n%S => Seconds (00 - 59)\n%t => Tab\n%T => %H:%M:%S.\n%u => Weekday number (Monday = 1, Sunday = 7)\n%w => Weekday number (Sunday = 0, Saturday = 6)\n%y => Year without century (00 - 99)\n%Y => Year with century (e.g. 1459)"]
}
{clear} {
cmd_line_help_window [mc "Command clear"] [mc \
@@ -344,7 +349,7 @@ public method cmd_line_enter {} {
}
{toupper} {
cmd_line_help_window [mc "Command toupper"] [mc \
- "Convert selected text to upppercase"]
+ "Convert selected text to uppercase"]
}
{capitalize} {
cmd_line_help_window [mc "Command capitalize"] [mc \
@@ -392,11 +397,11 @@ public method cmd_line_enter {} {
}
{step} {
cmd_line_help_window [mc "Command step"] [mc \
- "Step program (avaliliable only when simulator is stated)"]
+ "Step program (available only when simulator is stated)"]
}
{animate} {
cmd_line_help_window [mc "Command animate"] [mc \
- "Animate program (avaliliable only when simulator is stated)"]
+ "Animate program (available only when simulator is stated)"]
}
{d2h} {
cmd_line_help_window [mc "Command d2h"] [mc \
@@ -459,7 +464,7 @@ public method cmd_line_enter {} {
if {![llength $args]} {
::X::__hibernate
- } {
+ } else {
::X::__hibernate_to [lindex $args 0] $filename
}
Sbar [mc "Success"]
@@ -472,7 +477,7 @@ public method cmd_line_enter {} {
if {![llength $args]} {
::X::__resume
- } {
+ } else {
::X::__resume_from [lindex $args 0] $filename
}
Sbar [mc "Success"]
@@ -486,15 +491,15 @@ public method cmd_line_enter {} {
set arg [string toupper [lindex $args 0]]
if {$arg == {list}} {
set arg {}
- foreach mcu ${::X::avaliable_processors} {
+ foreach mcu ${::X::available_processors} {
append arg $mcu
append arg "\n"
}
cmd_line_help_window {Supported microcontrollers} $arg
- } {
- if {[lsearch ${::X::avaliable_processors} $arg] == -1} {
+ } else {
+ if {[lsearch ${::X::available_processors} $arg] == -1} {
Sbar [mc "EDITOR COMMAND LINE: Unsupported processor `%s'" "$arg"]
- } {
+ } else {
::X::change_processor $arg
}
}
@@ -525,13 +530,13 @@ public method cmd_line_enter {} {
set icode [expr {[lindex [${::X::actualProject} cget -procData] 2] * 1024}]
if {$arg > (0xFFFF - $icode)} {
- Sbar [mc "EDITOR COMMAND LINE: This MCU has CODE memory limit 0x10000 B (65536) (command: %s)"] "set-xdata"
+ Sbar [mc "EDITOR COMMAND LINE: This MCU has CODE memory limit 0x10000 B (65536) (command: %s)"] "set-xcode"
return
}
if {[lindex [${::X::actualProject} cget -procData] 1] != {yes}} {
Sbar [mc "This MCU cannot have connected external program memory"]
- } {
+ } else {
${::X::actualProject} configure -P_option_mcu_xcode $arg
::X::close_hexedit code ${::X::actualProject}
${::X::actualProject} simulator_resize_code_memory $arg
@@ -568,7 +573,7 @@ public method cmd_line_enter {} {
if {[lindex [${::X::actualProject} cget -procData] 0] != {yes}} {
Sbar [mc "This MCU cannot have connected external data memory"]
- } {
+ } else {
${::X::actualProject} configure -P_option_mcu_xdata $arg
::X::close_hexedit xdata ${::X::actualProject}
${::X::actualProject} simulator_resize_xdata_memory $arg
@@ -601,17 +606,17 @@ public method cmd_line_enter {} {
}
if {$fullFileName != {}} {
set dir [file dirname $fullFileName]
- } {
+ } else {
set dir $projectPath
}
set filename [file join $dir [lindex $args 0]]
if {![file exists $filename] || ![file isfile $filename]} {
Sbar [mc "EDITOR COMMAND LINE: wrong # args (command: %s)" "unindent"]
}
- if {[${X::actualProject} openfile $filename 1 . def def 0 0 {}] != {}} {
- ${X::actualProject} switch_to_last
- update idle
- ${X::actualProject} editor_procedure {} parseAll {}
+ if {[${::X::actualProject} openfile $filename 1 . def def 0 0 {}] != {}} {
+ ${::X::actualProject} switch_to_last
+ update idletasks
+ ${::X::actualProject} editor_procedure {} parseAll {}
Sbar [mc "Success"]
}
}
@@ -639,7 +644,7 @@ public method cmd_line_enter {} {
{date} {
if {[catch {$editor insert insert [clock format [clock seconds] -format $args]}]} {
Sbar [mc "EDITOR COMMAND LINE: Invalid format string"]
- } {
+ } else {
parse [expr {int([$editor index insert])}]
Sbar [mc "Success"]
}
@@ -647,7 +652,7 @@ public method cmd_line_enter {} {
{char} {
if {[llength $args] > 1} {
Sbar [mc "EDITOR COMMAND LINE: wrong # args (command: %s)" "char"]
- } {
+ } else {
Sbar [mc "Success"]
}
set char [lindex $args 0]
@@ -661,7 +666,7 @@ public method cmd_line_enter {} {
{goto} {
if {[llength $args] > 1} {
Sbar [mc "EDITOR COMMAND LINE: wrong # args (command: %s)" "goto"]
- } {
+ } else {
Sbar [mc "Success"]
}
set target_line [lindex $args 0]
@@ -672,7 +677,7 @@ public method cmd_line_enter {} {
}
if {$target_line > [editor_linescount]} {
Sbar [mc "Target line out of range"]
- } {
+ } else {
goto $target_line
Sbar [mc "Success"]
}
@@ -680,7 +685,7 @@ public method cmd_line_enter {} {
{replace} {
if {[llength $args] > 2} {
Sbar [mc "EDITOR COMMAND LINE: wrong # args (command: %s)" "replace"]
- } {
+ } else {
Sbar [mc "Success"]
}
set pattern [lindex $args 0]
@@ -754,8 +759,8 @@ public method cmd_line_enter {} {
set result [find $fromCursor $Backwards $regExp $noCase $inSelection 1.0 $pattern]
if {[lindex $result 0] == -1} {
Sbar [mc "String not found: %s" [lindex $result 1]]
- } {
- Sbar [mc "Found %s occurences" [lindex $result 2]]
+ } else {
+ Sbar [mc "Found %s occurrence" [lindex $result 2]]
}
}
{cut} {
@@ -850,14 +855,14 @@ public method cmd_line_enter {} {
command_without_args $args
}
default {
- Sbar [mc "EDITOR COMMAND LINE: invalid command, type `help list' to get list of avaliable commands"]
+ Sbar [mc "EDITOR COMMAND LINE: invalid command, type `help list' to get list of available commands"]
}
}
# Manage command line history
if {int([$cmd_line index end-1l]) == int([$cmd_line index insert])} {
$cmd_line insert {insert lineend} "\n"
- } {
+ } else {
set txt [$cmd_line get {insert linestart} {insert lineend}]
$cmd_line mark set insert end
$cmd_line insert insert $txt
@@ -959,9 +964,9 @@ private method command_without_args {args} {
}
## Highlight current contents of editor command line
- # @parm Bool = 0 - Disable popup-based completion
+ # @parm Bool no_completion=0 - Disable popup-based completion
# @return void
-private method cmd_line_highlight args {
+private method cmd_line_highlight {{no_completion 0}} {
# Remove all tags from command line
foreach tag {tag_cmd tag_argument tag_option tag_error} {
$cmd_line tag remove $tag {insert linestart} {insert lineend}
@@ -988,7 +993,7 @@ private method cmd_line_highlight args {
if {[llength $command] == 1} {
$cmd_line tag add tag_cmd $startIdx $lineNumber.$endIdx
} elseif {$endIdx && [llength $command] > 1 && [$cmd_line compare $lineNumber.$endIdx == insert]} {
- if {$cline_completion && $args != 1} {
+ if {$cline_completion && !$no_completion} {
# Automaticaly complete command
set possible_cmd [lindex $command 0]
set insert [$cmd_line index insert]
@@ -1012,7 +1017,7 @@ private method cmd_line_highlight args {
incr endIdx [string length $opt]
if {[lsearch $commands_with_option $command] != -1} {
$cmd_line tag add tag_option $lineNumber.$startIdx $lineNumber.$endIdx
- } {
+ } else {
$cmd_line tag add tag_error $lineNumber.$startIdx $lineNumber.$endIdx
}
}
@@ -1078,7 +1083,7 @@ private method cmd_line_menu_postdown {commands} {
%W selection set"
# Finalize window initialization (global grab)
- update idle
+ update idletasks
catch {
grab -global $win
raise $win
@@ -1100,7 +1105,7 @@ private method cmd_line_menu_postdown {commands} {
public method cmd_line_down {} {
if {![winfo exists $cmd_line_listbox]} {
return 0
- } {
+ } else {
$cmd_line_listbox selection set [$cmd_line_listbox item 0]
focus -force $cmd_line_listbox
return 1
@@ -1167,14 +1172,14 @@ private method cmd_line_help_window {header content} {
}
# Create window
- set win [toplevel .editor_cmd_help_widow -bg {#EEEEEE}]
+ set win [toplevel .editor_cmd_help_widow -bg ${::COMMON_BG_COLOR}]
wm overrideredirect $win 1
bind $win <ButtonPress-1> "$this cmd_line_win_B1 %X %Y"
bind $win <FocusOut> "$this cmd_line_menu_close_now"
# Create header
- set header_frame [frame $win.header]
+ set header_frame [frame $win.header -bg {#AAAAFF}]
pack [label $header_frame.lbl_heder \
-text $header -fg {#FF0000} \
-bg {#AAAAFF} -bd 0 -anchor w \
@@ -1207,7 +1212,7 @@ private method cmd_line_help_window {header content} {
# Create map of bold font tags
regsub -all -line {^\t+} $content {} content
set bold_tag_map {}
- while 1 {
+ while {1} {
set tag_pair {}
set idx [string first {<b>} $content]
@@ -1241,7 +1246,7 @@ private method cmd_line_help_window {header content} {
# Show the window
set x [winfo rootx $cmd_line]
set y [expr {[winfo rooty $cmd_line] + [winfo height $cmd_line]}]
- update idle
+ update idletasks
if {150 > ([winfo height .] - $y)} {
incr y -150
incr y -[winfo height $cmd_line]
@@ -1255,21 +1260,25 @@ private method cmd_line_help_window {header content} {
}
## Focus on editor / editor command line
- # @parm Bool = 0 - Do not call proc. "cmd_line_on"
+ # @parm Bool no_cmd_line_on=0 - Do not call proc. "cmd_line_on"
# @return void
-public method cmd_line_focus args {
+public method cmd_line_focus {{no_cmd_line_on 0}} {
# Show command line
if {![winfo viewable $cmd_line]} {
pack $cmd_line -side top -fill x
- if {$args != 1} {
+ if {!$no_cmd_line_on} {
${::X::actualProject} cmd_line_on
}
}
if {[focus] == $cmd_line} {
focus $editor
- } {
+ } else {
focus $cmd_line
}
update
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/editor/editor.tcl b/lib/editor/editor.tcl
index d4d9bec..e375386 100755..100644
--- a/lib/editor/editor.tcl
+++ b/lib/editor/editor.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 _EDITOR_TCL ] } {
+set _EDITOR_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements source code editor with syntax highligh and
@@ -46,23 +51,6 @@ source "${::LIB_DIRNAME}/editor/LSTsyntaxhighlight.tcl"
set ::editor_search_count 0
class Editor {
-
- # Load procedures related to editor command line
- source "${::LIB_DIRNAME}/editor/commandline.tcl"
-
- # Load procedures related to exports to other data formats
- source "${::LIB_DIRNAME}/editor/exports.tcl"
-
- # Load autocompletion related procedures
- source "${::LIB_DIRNAME}/editor/autocompletion.tcl"
-
- # Load general purpose procedures
- source "${::LIB_DIRNAME}/editor/generalproc.tcl"
-
- # Load event handlers
- source "${::LIB_DIRNAME}/editor/eventhandlers.tcl"
-
-
## COMMON
## Editor to use
# 0 - Native editor
@@ -118,32 +106,36 @@ class Editor {
{tag_simulator_curr #AAFFAA}
{tag_error_line #FFDDDD}
{tag_trailing_space #E8FFF0}
+ {tag_breakpoint_INVALID #888888}
}
# Font for command line: Normal help window text
- common cl_hw_nrml_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -14 \
+ common cl_hw_nrml_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
]
# Font for command line: Bold help window text
- common cl_hw_bold_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -14 \
- -weight bold \
+ common cl_hw_bold_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight bold \
]
# Font for command line: Subheader in help window text
- common cl_hw_hdr_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -14 \
- -weight bold \
+ common cl_hw_hdr_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight bold \
]
# Font for command line: Main header in help window text
- common cmd_line_win_font [font create \
- -size -17 -weight bold \
- -family {helvetica} \
+ common cmd_line_win_font [font create \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
+ -family {helvetica} \
]
- common cmd_line_fontSize 14 ;# Font size for command line
- common cmd_line_fontFamily $::DEFAULT_FIXED_FONT ;# Font family for command line
+ # Font size for command line
+ common cmd_line_fontSize [expr {int(14 * $::font_size_factor)}]
+ # Font family for command line
+ common cmd_line_fontFamily $::DEFAULT_FIXED_FONT
# Font for editor command line
common cmd_line_font [font create \
-family $cmd_line_fontFamily \
@@ -174,8 +166,13 @@ class Editor {
Unindent Uppercase Lowercase Capitalize
}
- common fontSize 13 ;# Default font size
- common fontFamily $::DEFAULT_FIXED_FONT ;# Default font family
+ # Maximum width of the tab character, measured in number of spaces
+ common tab_width 8
+
+ # Default font size
+ common fontSize [expr {int(13 * $::font_size_factor)}]
+ # Default font family
+ common fontFamily $::DEFAULT_FIXED_FONT
# Default font for editor
common defaultFont \
@@ -193,17 +190,17 @@ class Editor {
common defaultCharWidth 0 ;# Width of one character of the default font
common defaultCharHeight 0 ;# Height of one character of the default font
# Font for status bar (Normal)
- common statusBarFont \
- [font create \
- -size -12 \
- -family $::DEFAULT_FIXED_FONT \
+ common statusBarFont \
+ [font create \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -family $::DEFAULT_FIXED_FONT \
]
# Font for status bar (Bold)
- common statusBarBoldFont \
- [font create \
- -size -12 \
- -weight bold \
- -family $::DEFAULT_FIXED_FONT \
+ common statusBarBoldFont \
+ [font create \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
+ -family $::DEFAULT_FIXED_FONT \
]
# Definition of editor popup menu
common EDITORMENU {
@@ -257,17 +254,17 @@ class Editor {
{checkbutton "Bookmark" {$edit:bookmark} {::Editor::bookmark} 1 0 0
{Bookmark ${::Editor::pmenu_cline}}}
{separator}
- {command "Configure panel" "" 0 {configDialogs_mkDialog Colors}
+ {command "Configure panel" "" 0 {configDialogues_mkDialog Colors}
{configure} "Invoke editor configuration dialog"}
{command "Hide" "" 0 {show_hine_IconB}
{2leftarrow} "Hide this panel"}
}
# Definition of popup menu for line numbers
common LNMENU {
- {checkbutton "Breakpont" {$edit:breakpoint} {::Editor::breakpoint} 1 0 0
+ {checkbutton "Breakpoint" {$edit:breakpoint} {::Editor::breakpoint} 1 0 0
{Breakpoint ${::Editor::pmenu_cline}}}
{separator}
- {command "Configure panel" "" 0 {configDialogs_mkDialog Colors}
+ {command "Configure panel" "" 0 {configDialogues_mkDialog Colors}
{configure} "Invoke editor configuration dialog"}
{command "Hide panel" "" 0 {show_hine_LineN}
{2leftarrow} "Hide this panel"}
@@ -283,7 +280,7 @@ class Editor {
{view_remove} ""}
{separator}
{command "Back" {$edit:prev} 0 {__prev_editor_from_pmenu}
- {left} "Go to prevoius file in the file list"}
+ {left} "Go to previous file in the file list"}
{command "Forward" {$edit:next} 0 {__next_editor_from_pmenu}
{right} "Go to next file in the file list"}
}
@@ -292,11 +289,11 @@ class Editor {
public variable editor ;# text widget identifier
public variable ed_sc_frame ;# frame identifier (need packing)
public variable show_iconBorder 1 ;# on/off indicator for Icon Border (bool)
- public variable show_lineNum 1 ;# on/off indicator for Line NUmbers (bool)
+ public variable show_lineNum 1 ;# on/off indicator for Line Numbers (bool)
public variable iconBorder ;# Identifier of Icon Border text widget
public variable lineNumbers ;# Identifier of Line Numbers text widget
public variable scrollbar ;# Identifier of scrollbar widget
- public variable lastEnd 1 ;# Last end index of Edior text widget (for speed optimalization)
+ public variable lastEnd 2 ;# Last end index of Editor text widget (for speed optimization)
public variable Sbar_lock_file ;# Identifier of image label widget at the left site of status bar
public variable Sbar_sim_mode ;# Identifier of label widget at the left site of status bar
public variable Sbar_ssim_mode
@@ -307,7 +304,7 @@ class Editor {
public variable Sbar_total ;# ID of label showing total number of lines
public variable Sbar_image ;# Identifier of floppy disk icon at the middle site of status bar
public variable Sbar_fileName ;# Identifier of the text of filename at the right site of status bar
- public variable Sbar_prog_lang ;# ID of text specifing file type at the right site of status bar
+ public variable Sbar_prog_lang ;# ID of text specifying file type at the right site of status bar
public variable fullFileName ;# Full file name of the current file ("" == untitled)
public variable filename ;# Name of currently opened file or 'untitled'
public variable modified 0 ;# Boolean value indicating than the text has been modified since last save
@@ -316,6 +313,7 @@ class Editor {
public variable ro_mode 0 ;# Bool: Read only mode
## PRIVATE
+ private variable file_change_notif_flg 0 ;# Bool: The opened file was modified on disk by another program
private variable finishigh_hg_dlg_wdg {} ;# Widget: Finishing highlight dialog
private variable finishigh_hg_dlg_tmr {} ;# Timer: Finishing highlight dialog
private variable object_initialized 0 ;# Bool: Flag "Object initialized"
@@ -335,7 +333,7 @@ class Editor {
private variable left_frame_L ;# ID of frame containing Line Numbers
private variable left_frame_R ;# ID of frame containing Icon Border
private variable LN_menu ;# Identifier of popup menu for line numbers
- private variable frozen 0 ;# True if editor is in simulator mode
+ private variable frozen 0 ;# Bool: True if the editor is in simulator mode
private variable getDataAsXHTML_abort 0 ;# Set this variable to 1 to immediate stop export to XHTML
private variable getDataAsLaTeX_abort 0 ;# Set this variable to 1 to immediate stop export to LaTeX
private variable changeLCase_abort 0 ;# Set this variable to 1 to immediate stop changing letter case
@@ -356,7 +354,7 @@ class Editor {
private variable autosave_timer {} ;# ID of autosave timer (command "after")
private variable key_handler_buffer {} ;# List: Buffer for <Key> event handler
private variable key_handler_in_progress 0 ;# Bool: <Key> event handler in progress
- private variable statusbar_menu_config {} ;# List: Statusbra menu configuration list
+ private variable statusbar_menu_config {} ;# List: Status bar menu configuration list
private variable auto_switching_lock 0 ;# Bool: Automatic file switching enabled
private variable selection_in_progress 0 ;# Bool: Procedure "editor_selection" in progress
private variable selection_mode 0 ;# Bool: Block selection mode flag
@@ -373,49 +371,32 @@ class Editor {
private variable top_frame_idx 0 ;# Int: Unique number of container frame for embedded editor
private variable pid {} ;# Int: Process indentifier of embedded external editor (e.g. Vim)
- ## Array: Strings avaliable for autocompletion
- # Index 0 - Labels in assembly
- # Index 1 - Constants/variables
- # Index 2 - C variables
- # Index 3 - Macros
- # Index 4 - SFR's
- # Index 5 - Expression symbols
- # Index 6 - Doxygen tags
- # Index 7 - C Functions
- common invoke_com_win_in_p 0 ;# Bool: invoke_completion_popup_window in progress
- common completion_win_opened 0 ;# Bool: Editor popup-based completion window opended
- private variable autocompletion_list
- private variable completion_win_str_i 1.0 ;# TextIndex: String to complete - start index
- private variable completion_win_end_i 1.0 ;# TextIndex: String to complete - end index
- private variable completion_win_mode 0 ;# Int: Completion window mode
- private variable comp_win_loading_in_p 0 ;# Bool: Completion window list loading is in progress
- private variable comp_win_loading_max 1 ;# Int: Maximum for progressbar in the completion window
- private variable macl_invocations 0 ;# Int: Number of invocations of "manage_autocompletion_list"
- private variable doxytag_fg {#000000} ;# Color: Highlight color for doxygen tag
- private variable indirect_fg {#000000} ;# Color: Highlight color for indirect address
- private variable symbol_fg {#000000} ;# Color: Highlight color for asm. symbol
- private variable sfr_fg {#000000} ;# Color: Highlight color for SFR
- private variable label_fg {#000000} ;# Color: Highlight color for asm. label
- private variable macro_fg {#000000} ;# Color: Highlight color for asm. macro
- private variable const_fg {#000000} ;# Color: Highlight color for asm. const
- private variable dir_fg {#000000} ;# Color: Highlight color for asm. directive
- private variable cs_fg {#000000} ;# Color: Highlight color for constrol sequence
- private variable ins_fg {#000000} ;# Color: Highlight color for instruction
- private variable doxytag_font $defaultFont ;# Font: Font for doxygen tag
- private variable indirect_font $defaultFont ;# Font: Font for indirect address
- private variable symbol_font $defaultFont ;# Font: Font for asm. symbol
- private variable sfr_font $defaultFont ;# Font: Font for SFR
- private variable label_font $defaultFont ;# Font: Font for asm. label
- private variable macro_font $defaultFont ;# Font: Font for asm. macro
- private variable const_font $defaultFont ;# Font: Font for asm. const
- private variable dir_font $defaultFont ;# Font: Font for asm. directive
- private variable cs_font $defaultFont ;# Font: Font for constrol sequence
- private variable ins_font $defaultFont ;# Font: Font for instruction
+
+
+ # Load procedures related to editor command line
+ source "${::LIB_DIRNAME}/editor/commandline.tcl"
+
+ # Load procedures related to exports to other data formats
+ source "${::LIB_DIRNAME}/editor/exports.tcl"
+
+ # Load autocompletion related procedures
+ source "${::LIB_DIRNAME}/editor/autocompletion.tcl"
+
+ # Load general purpose procedures
+ source "${::LIB_DIRNAME}/editor/generalproc.tcl"
+
+ # Load event handlers
+ source "${::LIB_DIRNAME}/editor/eventhandlers.tcl"
+
+ # Spell checker interface
+ source "${::LIB_DIRNAME}/editor/spell_check.tcl"
+
+
## Object constructor
# @parm Bool create_tags - Create highlighting tags
- # @parm String eol_char - EOL (one of {lf cr crlf})
- # @parm String enc - Character encoding (some iso-8859-x or utf-8)
+ # @parm String eol_char - EOL (one of {lf cr crlf})
+ # @parm String enc - Character encoding (some iso-8859-x or utf-8)
# @parm Bool read_only - Read only flag
# @parm Bool switch_lock - Automatic file switching enabled
# @parm widget parentobject - Reference to parent object
@@ -427,6 +408,14 @@ class Editor {
constructor {create_tags eol_char enc read_only switch_lock parentobject fileName filepath Cmd_prefix data sh} {
close_completion_popup_window_NOW
+ set bold_font [font create -size -$fontSize -family $fontFamily -weight {bold}]
+ set italic_font [font create -size -$fontSize -family $fontFamily -slant {italic}]
+ if {[font metrics $bold_font -displayof . -linespace] < [font metrics $italic_font -displayof . -linespace]} {
+ set defaultFont_bold $italic_font
+ } else {
+ set defaultFont_bold $bold_font
+ }
+
# Configure specific ttk styles
ttk::style configure Editor_DarkBg.TButton \
-background {#DDDDDD} \
@@ -435,7 +424,7 @@ class Editor {
-relief flat
ttk::style map Editor_DarkBg.TButton \
-relief [list active raised !active flat]
-
+
# increment instance counter
incr count
@@ -455,11 +444,11 @@ class Editor {
set parentObject $parentobject ;# Identifier parent GUI component (some frame widget)
set fullFileName $filepath ;# Full file name (including path) of current file
set filename $fileName ;# Name of currently opened file or 'untitled'
- refresh_avaliable_SFR
+ refresh_available_SFR
if {$sh == {}} {
determinate_prog_lang 0
- } {
+ } else {
set prog_language_old $prog_language
set prog_language $sh
}
@@ -472,19 +461,22 @@ class Editor {
}
# Create frames
- set ed_sc_frame [frame .editor_frame$count]
- set top_frame [frame $ed_sc_frame.editor_top_frame -relief sunken -bd 1]
- set left_frame [frame $top_frame.editor_left_frame]
- set left_frame_L [frame $left_frame.left -bg $iconBorder_bg]
- set left_frame_R [frame $left_frame.right -bg $lineNumbers_bg]
- set bottom_frame [frame $ed_sc_frame.bottom_frame]
- set statusbar [frame $bottom_frame.editor_status -bg #DDDDDD]
+ set ed_sc_frame [frame .editor_frame$count]
+ set top_frame [frame $ed_sc_frame.editor_top_frame -relief sunken -bd 1]
+ set left_frame [frame $top_frame.editor_left_frame]
+ set left_frame_L [frame $left_frame.left -bg $iconBorder_bg]
+ set left_frame_R [frame $left_frame.right -bg $lineNumbers_bg]
+ set bottom_frame [frame $ed_sc_frame.bottom_frame]
+ set statusbar [frame $bottom_frame.editor_status -bg #DDDDDD]
# Create command line
- set cmd_line [text $bottom_frame.cmd_line \
- -bd 1 -bg #FFFFFF -highlightcolor #8888FF \
- -highlightthickness 1 -height 1 \
- -font $cmd_line_font \
+ set cmd_line [text $bottom_frame.cmd_line \
+ -bd 1 \
+ -bg {#FFFFFF} \
+ -highlightcolor {#8888FF} \
+ -highlightthickness 1 \
+ -height 1 \
+ -font $cmd_line_font \
]
setStatusTip -widget $cmd_line \
-text [mc "Editor command line, type `help' for more"]
@@ -537,8 +529,9 @@ class Editor {
# Create "Editor"
frame $top_frame.f -bd 0 -bg $normal_text_bg -cursor xterm
+
+ set tab_width_un [expr {$tab_width * [font measure $defaultFont_bold 0]}]
set editor [text $top_frame.f.editor \
- -yscrollcommand "$this scrollSet" \
-bg $normal_text_bg \
-font $defaultFont_bold \
-undo 1 -exportselection 1 \
@@ -547,6 +540,7 @@ class Editor {
-selectborderwidth 1 \
-bd 0 -relief flat \
-tabstyle wordprocessor \
+ -tabs [list $tab_width_un left] \
]
bind $top_frame.f <Button-1> "$this click_under_editor %x %y; break"
bind $top_frame.f <Button-4> "$this scroll scroll -3 units; break"
@@ -581,21 +575,21 @@ class Editor {
pack $top_frame -side top -fill both -expand 1
## Create statusbar
- set stat_menu $statusbar.popup_menu
+ set stat_menu $statusbar.popup_menu
set status_left [frame $statusbar.editor_status_left -bg #DDDDDD]
- set status_middle [frame $statusbar.editor_status_middle -width 16 -bg #DDDDDD -width 20]
+ set status_middle [frame $statusbar.editor_status_middle -width 16 -bg #DDDDDD]
set status_right [frame $statusbar.editor_status_right -bg #DDDDDD]
set ins_mode_lbl [Label $statusbar.ins_mode_lbl \
- -text [mc "INS"] -fg #000000 -pady 0 \
- -bg #DDDDDD -cursor hand2 \
- -helptext [mc "Insertion mode"] \
- -font $statusBarBoldFont \
+ -text [mc "INS"] -fg #000000 -pady 0 \
+ -bg #DDDDDD -cursor hand2 \
+ -helptext [mc "Insertion mode"] \
+ -font $statusBarBoldFont \
]
set sel_mode_lbl [Label $statusbar.sel_mode_lbl \
- -text [mc "NORM"] -fg #000000 -pady 0 \
- -bg #DDDDDD -cursor hand2 \
- -helptext [mc "Selection mode"] \
- -font $statusBarBoldFont -width 7 \
+ -text [mc "NORM"] -fg #000000 -pady 0 \
+ -bg #DDDDDD -cursor hand2 \
+ -helptext [mc "Selection mode"] \
+ -font $statusBarBoldFont -width 7 \
]
setStatusTip -widget $sel_mode_lbl -text [mc "Selection mode -- BLK == block; NORM == normal"]
bind $sel_mode_lbl <Button-1> "$this switch_sel_mode"
@@ -603,7 +597,7 @@ class Editor {
pack $status_left -side left -padx 10
pack $status_middle -side left
pack $ins_mode_lbl -side left -padx 5
- pack $sel_mode_lbl -side left -padx 5
+ pack $sel_mode_lbl -side left -padx 5 -pady 3
pack $status_right -side right -fill x -padx 10
# Frame for "Line: x Col: x Total: x"
@@ -715,6 +709,7 @@ class Editor {
}
# Create text tags
+ $editor tag configure tag_wrong_spelling -underline 1
if {$create_tags} {
create_highlighting_tags
}
@@ -766,6 +761,10 @@ class Editor {
bind $editor <Button-4> "$this scroll scroll -3 units; break"
bind $editor <Button-5> "$this scroll scroll +3 units; break"
+ bind $editor <XF86Back> {::X::__prev_editor}
+ bind $editor <XF86Forward> {::X::__next_editor}
+ bind $editor <XF86Reload> {::X::__reload}
+
# Other
foreach key {
<Double-Shift-Button-1> <Shift-Button-1>
@@ -815,6 +814,8 @@ class Editor {
$this recalc_status_counter {}
}
break"
+ bind $editor <Control-Shift-Up> "$this control_shift_updown 1; break"
+ bind $editor <Control-Shift-Down> "$this control_shift_updown 0; break"
bind $editor <Control-Insert> "$this copy; break"
bind $editor <Shift-Insert> "$this paste; break"
bind $editor <Shift-Delete> "$this cut; break"
@@ -822,6 +823,8 @@ class Editor {
bind $editor <Control-Key-Up> "$this control_up; break"
bind $editor <Key-Down> "$this down; break"
bind $editor <Key-Up> "$this up; break"
+ bind $editor <Control-Key-Home> "$this control_home; break"
+ bind $editor <Control-Key-End> "$this control_end; break"
bind $editor <Key-Home> "$this home_press; break"
bind $editor <Shift-Key-Home> "$this shift_home; break"
bind $editor <Key-Insert> "$this switch_ins_ovr; break"
@@ -842,7 +845,7 @@ class Editor {
bind $editor <Shift-KP_Enter> "$this shift_enter; break"
bind $editor <Return> "$this enter; break"
bind $editor <KP_Enter> "$this enter; break"
- bind $editor <Key> "$this Key %A; break"
+ bind $editor <Key> "$this Key %A %K; break"
bind $editor <KeyRelease> "$this KeyRelease %K; break"
bind $editor <ButtonRelease-3> "$this popupMenu %X %Y %x %y; break"
bind $editor <Key-Menu> "$this Key_Menu; break"
@@ -897,17 +900,20 @@ class Editor {
update
break"
bind $editor <Button-1> "
+ # Check spelling on the line which we are now leaving
+ $this spellcheck_check_all \[expr {int(\[%W index insert\])}\]
+
[bind Text <Button-1>]
$this rightPanel_adjust \[expr {int(\[%W index insert\])}\]
$this resetUpDownIndex
- $this recalc_status_counter {%x %y}
+ $this recalc_status_counter
focus -force $editor
break"
bind $editor <B1-Motion> "
[bind Text <B1-Motion>]
$this rightPanel_adjust \[expr {int(\[%W index @%x,%y\])}\]
$this resetUpDownIndex
- $this recalc_status_counter {%x %y}
+ $this recalc_status_counter
break"
bind $editor <<Selection>> "$this editor_selection; break"
@@ -957,7 +963,6 @@ class Editor {
bind $editor <FocusIn> "$parentObject filelist_editor_selected $this"
bind $cmd_line <FocusIn> "$parentObject filelist_editor_selected $this"
-
# Set event bindings for "Line numbers"
bind $lineNumbers <Button-1> "
$parentObject filelist_editor_selected $this
@@ -989,15 +994,19 @@ class Editor {
bindtags $iconBorder [list $iconBorder . all]
# Finalize initialization
+ $editor configure -yscrollcommand "$this scrollSet"
set object_initialized 1
change_RO_MODE $ro_mode
+
+ # Start watching for changes in the file
+ FSnotifications::watch $fullFileName [list ::Editor::file_change_notif $this]
}
## Object destructor
destructor {
if {$editor_to_use} {
kill_childern
- } {
+ } else {
# Stop autosave timer
catch {
after cancel $autosave_timer
@@ -1051,21 +1060,36 @@ class Editor {
public method refresh_font_settings {} {
if {$editor_to_use} {return}
+ # Set new font specification variables
+ set defaultCharHeight_org $defaultCharHeight
+ set defaultFont [font create -size -$fontSize -family $fontFamily]
+ set bold_font [font create -size -$fontSize -family $fontFamily -weight {bold}]
+ set italic_font [font create -size -$fontSize -family $fontFamily -slant {italic}]
+ if {[font metrics $bold_font -displayof $editor -linespace] < [font metrics $italic_font -displayof $editor -linespace]} {
+ set defaultFont_bold $italic_font
+ } else {
+ set defaultFont_bold $bold_font
+ }
+ set defaultCharWidth [font measure $defaultFont_bold -displayof $editor { }]
+ set defaultCharHeight [font metrics $defaultFont_bold -displayof $editor -linespace]
+
# Remove all text tags
foreach tag [$editor tag names] {
if {[lsearch {
sel tag_current_line tag_bookmark
- tag_breakpoint tag_simulator_curr tag_error_line
+ tag_breakpoint tag_breakpoint_INVALID tag_simulator_curr
+ tag_error_line
} $tag] != -1
} then {
break
}
$editor tag remove $tag 1.0 end
}
- # Change fonts
+ # Change fonts and tab width
+ set tab_width_un [expr {$tab_width * [font measure $defaultFont_bold 0]}]
$iconBorder configure -font $defaultFont_bold
$lineNumbers configure -font $defaultFont_bold
- $editor configure -font $defaultFont_bold
+ $editor configure -font $defaultFont_bold -tabs [list $tab_width_un left]
$lineNumbers tag configure right -justify right
$lineNumbers tag configure center -justify center
@@ -1074,19 +1098,13 @@ class Editor {
# Enable writing to the left border
$iconBorder configure -state normal
- # Set new font
- set defaultCharHeight_org $defaultCharHeight
- set defaultFont [font create -size -$fontSize -family $fontFamily]
- set defaultFont_bold [font create -size -$fontSize -family $fontFamily -weight {bold}]
- set defaultCharWidth [font measure $defaultFont_bold -displayof $editor { }]
- set defaultCharHeight [font metrics $defaultFont_bold -displayof $editor -linespace]
# Adjust bookmark images
if {$defaultCharHeight_org != $defaultCharHeight} {
set indexes {}
if {$defaultCharHeight_org < 9} {
set idx 1.0
set idx_prev $idx
- while 1 {
+ while {1} {
set idx [$iconBorder search -exact -- {*} $idx]
if {$idx == {}} {break}
if {[$iconBorder compare $idx_prev >= $idx]} {break}
@@ -1094,7 +1112,7 @@ class Editor {
set idx_prev $idx
set idx [$iconBorder index "$idx+1c"]
}
- } {
+ } else {
foreach img [$iconBorder image names] {
lappend indexes [$iconBorder index $img]
}
@@ -1104,10 +1122,10 @@ class Editor {
$iconBorder delete $idx "$idx+1c"
$iconBorder insert $idx {*}
}
- } {
+ } else {
if {$defaultCharHeight < 15} {
set image {dot}
- } {
+ } else {
set image {bookmark}
}
foreach idx $indexes {
@@ -1122,7 +1140,7 @@ class Editor {
$iconBorder configure -state disabled
# Reset line wrap settings
set highlighted_lines [string repeat 0 [string bytelength $highlighted_lines]]
- update idle
+ update idletasks
highlight_visible_area
# Adjust editor height
@@ -1135,7 +1153,7 @@ class Editor {
if {$ins_ovr_mode} {
$ins_mode_lbl configure -text [mc "INS"] -fg #000000
$editor configure -blockcursor 0
- } {
+ } else {
$ins_mode_lbl configure -text [mc "OVR"] -fg #FF0000
$editor configure -blockcursor 1
}
@@ -1168,7 +1186,7 @@ class Editor {
## Determinate whether editor text has been modified
# and adjust internal variables
# @parm bool force - 1: "I'm sure it has been modified !"
- # 0: "discover it automaticaly"
+ # 0: "discover it automatically"
# @return bool - a new modified flag or {}
public method recalc_status_modified {force} {
@@ -1189,11 +1207,11 @@ class Editor {
catch {
after cancel $autosave_timer
}
- set autosave_timer [after [expr {$autosave * 60000}] [list $this save]]
+ set autosave_timer [after [expr {$autosave * 60000}] "catch {$this save}"]
}
# Not modifed
- } {
+ } else {
# Adjust editor status bar
pack forget $Sbar_image
@@ -1212,24 +1230,18 @@ class Editor {
return $modified
}
- ## Call ::configDialogs::mkDialog $args
+ ## Call ::configDialogues::mkDialog $args
# @return void
- public method configDialogs_mkDialog args {
- ::configDialogs::editor::mkDialog $args
+ public method configDialogues_mkDialog args {
+ ::configDialogues::editor::mkDialog $args
}
## Recalculate variables related to bookmarks, line numbers and list of highlighted lines
- # @parm Bool force = 1 - perform recalcutaion even if length of text wasn't changed
+ # @parm Bool force=1 - perform recalcutaion even if length of text wasn't changed
# @return bool - 0: failed; 1: successful
- public method recalc_left_frame args {
+ public method recalc_left_frame {{force 0}} {
if {$editor_to_use} {return}
- # Parse arguments
- set force [lindex $args 0]
- if {$force == {}} {
- set force 0
- }
-
# Determinate editor lines count and End index
set End [$editor index end]
set Tlines [expr {int($End)}]
@@ -1245,8 +1257,7 @@ class Editor {
incr Tlines -1
# Determinate iconBorder lines count - 1
- set Ilines [expr {int([$iconBorder index end]) - $number_of_wraps}]
- incr Ilines -1
+ set Ilines [expr {int([$iconBorder index end]) - $number_of_wraps - 1}]
# Remove wrap markers from line numbers
if {$number_of_wraps && ($Ilines != $Tlines)} {
@@ -1315,13 +1326,13 @@ class Editor {
$parentObject rightPanel_shift_symbols $Actline [expr {$Actline - $diff - 1}]
# rewrite breakpoints
- rewrite_breakpoint_tags
+ rewrite_breakpoint_tags 1
## Some lines have been added
} elseif {$Ilines < $Tlines} {
# Determinate how many lines should be added
- set diff $Tlines
- incr diff -$Ilines
+ set diff [expr {$Tlines - $Ilines}]
+
set ins [string repeat "\n" $diff]
set BMStr [string range [string repeat {0 } $diff] 0 end-1]
set insIndex $Actline
@@ -1379,8 +1390,8 @@ class Editor {
$editor tag add tag_bookmark [expr {$insIndex - 1}].0 $insIndex.0
}
- } {
- # Adjust list of highlighted lines
+ } else {
+ # Adjust list of lighted lines
set highlighted_lines [string replace \
$highlighted_lines $insIndex $insIndex \
[string repeat 0 [expr {$diff + 1}]]]
@@ -1409,7 +1420,7 @@ class Editor {
$iconBorder configure -state disabled
# rewrite breakpoints
- rewrite_breakpoint_tags
+ rewrite_breakpoint_tags 1
}
## Recalculate Line Numbers
@@ -1426,7 +1437,7 @@ class Editor {
if {$Llines > $Tlines} { ;# too many lines -> remove some ones
$lineNumbers delete $End end
- } elseif {$Llines < $Tlines} { ;# not enought lines -> add some ones
+ } elseif {$Llines < $Tlines} { ;# not enough lines -> add some ones
# Create string to insert to Line Numbers
set ins {}
for {set i [expr {$Llines + 1}]} {$i <= $Tlines} {incr i} {
@@ -1444,16 +1455,15 @@ class Editor {
# Restore wrap markers
if {$number_of_wraps} {
set remaining $number_of_wraps
- set i 1
- foreach wrap $map_of_wraped_lines {
+ for {set i [expr {[llength $map_of_wraped_lines] - 1}]} {$i > 0} {incr i -1} {
+ set wrap [lindex $map_of_wraped_lines $i]
if {$wrap > 0} {
- $lineNumbers insert $i.0 [string repeat "$wrap_char\n" $wrap]
- $lineNumbers tag add center $i.0 [expr {$i + $wrap}].0
- incr i $wrap
+ set ln [expr {$i + 1}]
+ $lineNumbers insert $ln.0 [string repeat "$wrap_char\n" $wrap]
+ $lineNumbers tag add center $ln.0 [expr {$ln + $wrap}].0
incr remaining -$wrap
}
if {!$remaining} {break}
- incr i
}
}
# Disable Line Numbers
@@ -1481,16 +1491,19 @@ class Editor {
# Adjust list of bookmarks
if {[lindex $bookmarks $lineNumber] == 1} {
$parentObject rightPanel_bm_select $lineNumber
- } {
+ } else {
$parentObject rightPanel_bm_unselect
}
# Adjust list of breakpoints
if {[lindex $breakpoints $lineNumber] == 1} {
$parentObject rightPanel_bp_select $lineNumber
- } {
+ } else {
$parentObject rightPanel_bp_unselect
}
+
+ # Adjust list of symbols
+ $parentObject rightPanel_sm_select $lineNumber
}
## Line wrapping manager - variant 2
@@ -1507,7 +1520,7 @@ class Editor {
set new_wrap [get_count_of_lines $line_number.0 "$line_number.0 lineend"]
incr new_wrap -1
# Empty line
- } {
+ } else {
set new_wrap 0
}
@@ -1519,7 +1532,7 @@ class Editor {
if {$line_number >= [llength $map_of_wraped_lines]} {
Configure
return
- } {
+ } else {
lset map_of_wraped_lines $line_number $new_wrap
}
@@ -1536,10 +1549,9 @@ class Editor {
$iconBorder configure -state normal
if {$new_wrap > $wrap} {
set diff [expr {$new_wrap - $wrap}]
- set ins [string repeat "$wrap_char\n" $diff]
incr number_of_wraps $diff
- $lineNumbers insert $line_number.0 $ins
- $iconBorder insert $line_number.0 $ins
+ $lineNumbers insert $line_number.0 [string repeat "$wrap_char\n" $diff]
+ $iconBorder insert $line_number.0 [string repeat "\n" $diff]
$lineNumbers tag add center $line_number.0 [expr {$line_number + $diff}].0
} elseif {$new_wrap < $wrap} {
set diff [expr {$wrap - $new_wrap}]
@@ -1578,7 +1590,7 @@ class Editor {
if {$line_number >= [llength $map_of_wraped_lines]} {
Configure
return
- } {
+ } else {
lset map_of_wraped_lines $line_number $new_wrap
}
@@ -1595,14 +1607,13 @@ class Editor {
$iconBorder configure -state normal
if {$new_wrap > $wrap} {
set diff [expr {$new_wrap - $wrap}]
- set ins [string repeat "$wrap_char\n" $diff]
incr number_of_wraps $diff
- $lineNumbers insert $line_number.0 $ins
- $iconBorder insert $line_number.0 $ins
+ $lineNumbers insert $line_number.0 [string repeat "$wrap_char\n" $diff]
+ $iconBorder insert $line_number.0 [string repeat "\n" $diff]
$lineNumbers tag add center $line_number.0 [expr {$line_number + $diff}].0
} elseif {$new_wrap < $wrap} {
set diff [expr {$wrap - $new_wrap}]
- incr number_of_wraps $diff
+ set number_of_wraps [expr {$number_of_wraps - $diff}]
$lineNumbers delete $line_number.0 $line_number.0+${diff}l
$iconBorder delete $line_number.0 $line_number.0+${diff}l
}
@@ -1673,7 +1684,7 @@ class Editor {
if {$highlight_status == {}} {
set highlight_status 0
}
- } {
+ } else {
set highlight_status 1
}
@@ -1717,12 +1728,15 @@ class Editor {
set i $lineNumber
set last_visible_line [expr {int([lindex [$editor yview] 1] * int([$editor index end])) + 1}]
- # Highlight all line after the current one until it is nessesary
- while 1 {
+ # Highlight all line after the current one until it is not nessesary
+ while {1} {
autocompletion_maybe_important_change $i.0 $i.0
set highlight_status_org [string index $highlighted_lines $i]
set highlight_status [CsyntaxHighlight::highlight $editor $i $highlight_status]
autocompletion_c_syntax_analyze $i
+ if {$i == $lineNumber} {
+ manage_autocompletion_list $i
+ }
set highlighted_lines \
[string replace $highlighted_lines $i $i $highlight_status]
if {
@@ -1761,9 +1775,10 @@ class Editor {
## Parse given line
# Restore highlight, recalculate counters on status bar, adjust right panel
- # @parm Int lineNumber - number of the target line
+ # @parm Int lineNumber - Number of the target line
+ # @parm Bool force_spell_check - Force spelling check
# @return Bool - result from wrap manager
- public method parse {lineNumber} {
+ public method parse {lineNumber {force_spell_check 0}} {
# Check if the given line number is valid
if {$lineNumber >= int([$editor index end])} {
set lineNumber [expr {int([$editor index end]) - 1}]
@@ -1772,7 +1787,7 @@ class Editor {
# Is the given line number is the current line ?
if {int([$editor index insert]) == $lineNumber} {
set curLine 1
- } {
+ } else {
set curLine 0
}
@@ -1827,6 +1842,11 @@ class Editor {
validate_line $lineNumber 0
}
+ # Check spelling if not current line and if enabled
+ if {!$curLine || $force_spell_check} {
+ spellcheck_check_all $lineNumber 1
+ }
+
# Recalculate counters on status bar
if {$curLine} {
recalc_status_counter {}
@@ -1840,7 +1860,7 @@ class Editor {
if {${::ASMsyntaxHighlight::validation_L0}} {
if {[llength [$editor tag nextrange tag_error $lineNumber.0 [list $lineNumber.0 lineend]]]} {
set add 1
- } {
+ } else {
set remove 1
}
# Remove tag "tag_error_line"
@@ -1859,7 +1879,7 @@ class Editor {
if {[lindex $bookmarks $lineNumber] == 1} {
set image {bm_ex}
- } {
+ } else {
set image {exclamation}
}
@@ -1902,19 +1922,21 @@ class Editor {
}
## Finalize syntax validation on the given line (validates operands only)
- # @parm Int - Number of line in source code
- # @parm Bool = 1 - Affect panel "Instruction details"
+ # @parm Int line - Number of line in source code
+ # @parm Bool ins_det=1 - Affect panel "Instruction details"
# @return void
- private method validate_line args {
- # Parse input arguments
- set line [lindex $args 0]
- set ins_det [lindex $args 1]
- if {$ins_det == {}} {
- set ins_det 1
+ private method validate_line {line {ins_det 1}} {
+ # Check if basic validation is enabled
+ if {!${::ASMsyntaxHighlight::validation_L0}} {
+ return
}
- # Check if basic validation is enabled
- if {!${::ASMsyntaxHighlight::validation_L0}} {return}
+ # Validate breakpoint first
+ if {[is_breakpoint_valid $line]} {
+ mark_breakpoint_as_valid $line
+ } else {
+ mark_breakpoint_as_invalid $line
+ }
# Detereminate range of instruction tag
set ins_range [$editor tag nextrange tag_instruction $line.0 "$line.0 lineend"]
@@ -1927,11 +1949,12 @@ class Editor {
if {[lsearch -ascii -exact ${CompilerConsts::AllInstructions} $instruction] == -1} {
return
}
- } {
+
+ } else {
return
}
- # Inset selection in "Instruction details" tab on the Right Panel
+ # Unset selection in "Instruction details" tab on the Right Panel
if {$ins_det} {
$parentObject rightPanel_ins_unselect
}
@@ -1970,7 +1993,7 @@ class Editor {
if {$opr_set == $operands} {
if {$i} {
lappend matches0 $idx
- } {
+ } else {
lappend matches $idx
}
}
@@ -1998,7 +2021,7 @@ class Editor {
}
}
- # Highlight coresponding operand sets in "Instruction details"
+ # Highlight corresponding operand sets in "Instruction details"
if {[llength $matches] || [llength $matches0]} {
if {$ins_det} {
if {[llength $matches]} {
@@ -2008,7 +2031,7 @@ class Editor {
$parentObject rightPanel_ins_select 0 $matches0
}
}
- } {
+ } else {
$editor tag add tag_error [lindex $ins_range 0] [lindex $ins_range 1]
}
@@ -2016,7 +2039,7 @@ class Editor {
set sfr_range_start $line.0
set sfr_range {}
set sfr_name {}
- while 1 {
+ while {1} {
# Try to find SFR
set sfr_range [$editor tag nextrange tag_sfr $sfr_range_start [list $line.0 lineend]]
if {![llength $sfr_range]} {
@@ -2030,10 +2053,10 @@ class Editor {
if {[string index $sfr_name 0] == {/}} {
set sfr_name [string range $sfr_name 1 end]
}
-
+
if {
[lsearch -ascii -exact \
- [$parentObject cget -avaliable_SFR] \
+ [$parentObject cget -available_SFR] \
[string toupper $sfr_name] \
] == -1
} then {
@@ -2043,8 +2066,8 @@ class Editor {
}
}
- ## Adjust content of the given line in list of bookmakrs and list of breakpoint (in right panel)
- # This function should be called after change content of any line
+ ## Adjust content of the given line in list of bookmarks and list of breakpoint (in right panel)
+ # This function should be called after change in content of a line
# @parm Int lineNumber - line number
# @return void
private method rightPanel_changeLineContent {lineNumber} {
@@ -2054,6 +2077,7 @@ class Editor {
$parentObject rightPanel_add_bookmark $lineNumber
$parentObject rightPanel_bm_select $lineNumber
}
+
# Adjust list of breakpoints
if {[lindex $breakpoints $lineNumber] == 1} {
$parentObject rightPanel_remove_breakpoint $lineNumber
@@ -2090,7 +2114,7 @@ class Editor {
private method wrap_aux_line2idx {line} {
if {$number_of_wraps} {
set i 1
- while 1 {
+ while {1} {
incr line [expr { -1 - [lindex $map_of_wraped_lines $i]}]
if {$line < 1 || $line == {}} {break}
incr i
@@ -2104,7 +2128,7 @@ class Editor {
## Focus on the editor widget
# @return void
public method focus_in {} {
- focus $editor
+ focus -force $editor
}
## Get ranges for all highlighting tags on the given line
@@ -2119,9 +2143,9 @@ class Editor {
# Iterate over defined highlighting tags
foreach tag [concat \
- ${ASMsyntaxHighlight::hightlight_tags} \
- ${CsyntaxHighlight::hightlight_tags} \
- ${LSTsyntaxHighlight::hightlight_tags} \
+ ${ASMsyntaxHighlight::highlight_tags} \
+ ${CsyntaxHighlight::highlight_tags} \
+ ${LSTsyntaxHighlight::highlight_tags} \
{tag_macro_def tag_constant_def} \
] {
@@ -2130,7 +2154,7 @@ class Editor {
# Determinate range of the tag
set range {}
- while 1 {
+ while {1} {
# Determinate start index
set startIdx [lindex $range [expr {[llength $range] - 1}]]
if {$startIdx == {}} {
@@ -2157,9 +2181,63 @@ class Editor {
return $ranges
}
+ ## Make breakpoint on the specified line as VALID (reachable)
+ # @param Int line_number - line number
+ # @return void
+ private method mark_breakpoint_as_valid {line_number} {
+ if {[lindex $breakpoints $line_number] != 1} {
+ return
+ }
+
+ set line_number [wrap_aux_idx2line $line_number]
+
+ $lineNumbers tag remove tag_breakpoint_INVALID $line_number.0 [list $line_number.0+1l]
+ $lineNumbers tag add tag_breakpoint $line_number.0 [list $line_number.0+1l]
+ }
+
+ ## Make breakpoint on the specified line as INVALID (unreachable)
+ # @param Int line_number - line number
+ # @return void
+ private method mark_breakpoint_as_invalid {line_number} {
+ if {[lindex $breakpoints $line_number] != 1} {
+ return
+ }
+
+ set line_number [wrap_aux_idx2line $line_number]
+
+ $lineNumbers tag remove tag_breakpoint $line_number.0 [list $line_number.0+1l]
+ $lineNumbers tag add tag_breakpoint_INVALID $line_number.0 [list $line_number.0+1l]
+ }
+
+ ## Determinate whether breakpoint on the specified line is valid or could be
+ #+ valid in case there is no breakpoint yet
+ # @param Int line_number - line number
+ # @return Bool - 1 == is valid; 0 == is NOT valid
+ private method is_breakpoint_valid {line_number} {
+
+ if {$prog_language == 2 || $prog_language == 3} {
+ return 0
+ }
+
+ if {
+ !$prog_language
+ &&
+ ${::ASMsyntaxHighlight::validation_L0}
+ &&
+ ![llength [$editor tag nextrange tag_instruction $line_number.0 [list $line_number.0 lineend]]]
+ &&
+ ![llength [$editor tag nextrange tag_macro $line_number.0 [list $line_number.0 lineend]]]
+ } then {
+ return 0
+ }
+
+ return 1
+ }
+
## Restore breakpoint tags in "Line numbers"
+ # @parm Bool ignore_wrap=0 - Ignore line wrapping (see recalc_left_frame)
# @return void
- private method rewrite_breakpoint_tags {} {
+ private method rewrite_breakpoint_tags {{ignore_wrap 0}} {
if {$editor_to_use} {return}
# Enable line numbers
@@ -2167,10 +2245,33 @@ class Editor {
# Remove current tags
$lineNumbers tag remove tag_breakpoint 1.0 end
+ $lineNumbers tag remove tag_breakpoint_INVALID 1.0 end
+
# Restore tags
- foreach line [lsearch -ascii -exact -all $breakpoints 1] {
- append line {.0}
- $lineNumbers tag add tag_breakpoint $line "$line+1l"
+ if {!$ignore_wrap && $number_of_wraps} {
+ set i 0
+ set line 0
+ foreach wrap $map_of_wraped_lines {
+ if {[lindex $breakpoints $line] == 1} {
+ if {[is_breakpoint_valid $line]} {
+ $lineNumbers tag add tag_breakpoint $i.0 "$i.0+1l"
+ } else {
+ $lineNumbers tag add tag_breakpoint_INVALID $i.0 "$i.0+1l"
+ }
+ }
+
+ incr wrap
+ incr i $wrap
+ incr line
+ }
+ } else {
+ foreach line [lsearch -ascii -exact -all $breakpoints 1] {
+ if {[is_breakpoint_valid $line]} {
+ $lineNumbers tag add tag_breakpoint $line.0 "$line.0+1l"
+ } else {
+ $lineNumbers tag add tag_breakpoint_INVALID $line.0 "$line.0+1l"
+ }
+ }
}
# Disable line numbers
@@ -2187,7 +2288,7 @@ class Editor {
# Create tag in editor
$editor tag configure [lindex $tag_definition 0] -background [lindex $tag_definition 1]
# Create tag in line numbers
- if {[lindex $tag_definition 0] == {tag_breakpoint}} {
+ if {[lsearch {tag_breakpoint_INVALID tag_breakpoint} [lindex $tag_definition 0]] != -1} {
$lineNumbers tag configure [lindex $tag_definition 0] \
-background [lindex $tag_definition 1] -relief raised -borderwidth 1
}
@@ -2248,16 +2349,16 @@ class Editor {
# @return void
public method makePopupMenu {} {
if {[winfo exists $menu]} {destroy $menu}
- menuFactory $EDITORMENU $menu 0 $cmd_prefix 0 {}
+ menuFactory $EDITORMENU $menu 0 $cmd_prefix 0 {} [namespace current]
if {[winfo exists $stat_menu]} {destroy $stat_menu}
- menuFactory $STATMENU $stat_menu 0 {::X::} 0 {}
+ menuFactory $STATMENU $stat_menu 0 {::X::} 0 {} [namespace current]
if {[winfo exists $IB_menu]} {destroy $IB_menu}
- menuFactory $IBMENU $IB_menu 0 "$this " 0 {}
+ menuFactory $IBMENU $IB_menu 0 "$this " 0 {} [namespace current]
if {[winfo exists $LN_menu]} {destroy $LN_menu}
- menuFactory $LNMENU $LN_menu 0 "$this " 0 {}
+ menuFactory $LNMENU $LN_menu 0 "$this " 0 {} [namespace current]
}
## Configure state of statusbar popup menu entries
@@ -2271,40 +2372,35 @@ class Editor {
set statusbar_menu_config [list 1 1 1 1]
}
if {$split != {}} {
- lset statusbar_menu_config 0 $split
+ lset statusbar_menu_config 0 [expr "$split"]
}
if {$close != {}} {
- lset statusbar_menu_config 1 $close
+ lset statusbar_menu_config 1 [expr "$close"]
}
if {$prev != {}} {
- lset statusbar_menu_config 2 $prev
+ lset statusbar_menu_config 2 [expr "$prev"]
}
if {$next != {}} {
- lset statusbar_menu_config 3 $next
+ lset statusbar_menu_config 3 [expr "$next"]
}
}
## Rewrite left site of editor status bar
- # @parm List - Relative mouse cursor coordinates ({%x,%y})
- # {} == keyboard input (eg. leftArrow pressed)
- # @parm Bool = 1 - Highlight current line and such things
+ # @parm List coord={} - Relative mouse cursor coordinates ({%x,%y})
+ # {} == keyboard input (eg. leftArrow pressed)
+ # @parm Bool perform_highlight=1 - Highlight current line and such things
# @return void
- public method recalc_status_counter args {
+ public method recalc_status_counter {{coord {}} {perform_highlight 1}} {
if {$editor_to_use} {return}
- # Procedure can executed only in editor mode
- if {$frozen} {return}
+# # Procedure can executed only in normal editor mode
+# if {$frozen} {return}
# Parse arguments
- if {[lindex $args 0] == {}} {
+ if {$coord == {}} {
set coord insert
- } {
- set coord "@[lindex $args {0 0}],[lindex $args {0 1}]"
- }
- if {[lindex $args 1] == {}} {
- set perform_highlight 1
- } {
- set perform_highlight [lindex $args 1]
+ } else {
+ set coord "@[lindex $coord 0],[lindex $coord 1]"
}
# Translate text index into number
@@ -2319,7 +2415,7 @@ class Editor {
if {[regexp {\t} $lineText]} {
set idx -1
set cor 0
- while 1 {
+ while {1} {
set idx [string first "\t" $lineText [expr {$idx + 1}]]
if {$idx == -1 || $idx > $Index} {break}
@@ -2337,7 +2433,7 @@ class Editor {
incr tmp
$editor tag add tag_current_line $line.0 $tmp.0
set last_cur_line $line
- } {
+ } else {
$editor tag add tag_current_line $line.0 $tmp.0
}
@@ -2399,15 +2495,15 @@ class Editor {
if {[llength $ins_range]} {
$parentObject rightPanel_ins_change [$editor get [lindex $ins_range 0] [lindex $ins_range 1]]
- } {
+ } else {
set ins_range [$editor tag nextrange tag_directive {insert linestart} {insert lineend}]
if {[llength $ins_range]} {
$parentObject rightPanel_dir_change D [$editor get [lindex $ins_range 0] [lindex $ins_range 1]]
- } {
+ } else {
set ins_range [$editor tag nextrange tag_control {insert linestart} {insert lineend}]
if {[llength $ins_range]} {
$parentObject rightPanel_dir_change C [$editor get [lindex $ins_range 0] [lindex $ins_range 1]]
- } {
+ } else {
$parentObject rightPanel_ins_clear
}
}
@@ -2427,7 +2523,7 @@ class Editor {
} then {
if {$up__down} {
return [$editor index {insert-1l linestart}]
- } {
+ } else {
return [$editor index {insert+1l linestart}]
}
@@ -2439,14 +2535,14 @@ class Editor {
# Determinate target column number
if {!$lastUpDownIndex} {
set lastUpDownIndex $col
- } {
+ } else {
set col $lastUpDownIndex
}
# Traslate column number to text index
if {$up__down} {
incr lineNum -1
- } {
+ } else {
incr lineNum
}
@@ -2464,7 +2560,7 @@ class Editor {
if {[string first "\t" $lineText] != -1} {
set idx -1
set cor 0
- while 1 {
+ while {1} {
set idx [string first "\t" $lineText [expr {$idx + 1}]]
if {$idx == -1} {break}
@@ -2480,6 +2576,9 @@ class Editor {
# @parm Int col - Column number
# @return TextIndex - Resulting insertIndex
private method column_to_text_index {lineNum col} {
+ if {!$col} {
+ return 0
+ }
set lineText [$editor get $lineNum.0 [list $lineNum.0 lineend]]
if {[string first "\t" $lineText] != -1} {
@@ -2564,7 +2663,7 @@ class Editor {
# Determinate width of the selected block
if {abs($col_s1 - $col_s0) < abs($col_e1 - $col_e0)} {
set width [expr {abs($col_s1 - $col_s0)}]
- } {
+ } else {
set width [expr {abs($col_e1 - $col_e0)}]
}
@@ -2572,14 +2671,15 @@ class Editor {
$editor tag remove sel 0.0 end
set col 0
for {set row $row_s0} {$row <= $row_e1} {incr row} {
- set col [column_to_text_index $row $col_s0]
- if {[$editor compare $row.$col >= [list $row.0 lineend]]} {
+ set col0 [column_to_text_index $row $col_s0]
+ set col1 [column_to_text_index $row [expr {$col_s0 + $width}]]
+ if {[$editor compare $row.$col0 >= [list $row.0 lineend]]} {
continue
}
- if {[$editor compare $row.$col+${width}c > [list $row.0 lineend]]} {
- $editor tag add sel $row.$col [list $row.0 lineend]
- } {
- $editor tag add sel $row.$col $row.$col+${width}c
+ if {[$editor compare $row.$col1 > [list $row.0 lineend]]} {
+ $editor tag add sel $row.$col0 [list $row.0 lineend]
+ } else {
+ $editor tag add sel $row.$col0 $row.$col1
}
}
}
@@ -2635,7 +2735,7 @@ class Editor {
if {[catch {
if {$filename == {}} {
cd [$parentObject cget -projectPath]
- } {
+ } else {
cd [file dirname $filename]
}
}]} then {
@@ -2650,7 +2750,7 @@ class Editor {
+sb -bg "$normal_text_bg" -b 0 -w 0 -sl 0 \
-fn "xft:$fontFamily:pixelsize=$fontSize" \
-e $cmd &]
- } {
+ } else {
set pid [exec -- urxvt -embed [expr [winfo id $top_frame]] \
+sb -bg "$normal_text_bg" -b 0 -w 0 -sl 0 \
-fn "xft:$fontFamily:pixelsize=$fontSize" \
@@ -2662,7 +2762,7 @@ class Editor {
+sb -bg "$normal_text_bg" -b 0 -w 0 -sl 0 \
-fn "xft:$fontFamily:pixelsize=$fontSize" \
-e $cmd $opt &]
- } {
+ } else {
set pid [exec -- urxvt -embed [expr [winfo id $top_frame]] \
+sb -bg "$normal_text_bg" -b 0 -w 0 -sl 0 \
-fn "xft:$fontFamily:pixelsize=$fontSize" \
@@ -2676,7 +2776,7 @@ class Editor {
-icon error \
-type ok \
-title [mc "FATAL ERROR"] \
- -message [mc "Unable to start embedded editor due to an unknow error. This error did not occured in MCU 8051 IDE code but somewhere else. Please try to restart MCU 8051 IDE with --reset-user-settings"]
+ -message [mc "Unable to start embedded editor due to an unknown error. This error did not occurred in MCU 8051 IDE code but somewhere else. Please try to restart MCU 8051 IDE with --reset-user-settings"]
}
# Return to previous directory
@@ -2687,7 +2787,7 @@ class Editor {
# @parm String filename - Name of file to open with the external editor
# @return void
public method recreate_terminal {filename} {
- update idle
+ update idletasks
if {![winfo exists $ed_sc_frame]} {return}
set top_frame [frame $ed_sc_frame.top_frame_$top_frame_idx -container 1]
pack $top_frame -expand 1 -fill both
@@ -2697,7 +2797,7 @@ class Editor {
incr top_frame_idx
}
- ## Determinate file type acording to its name externsion
+ ## Determinate file type according to its name extension
# @parm Bool reset - Reset syntax highlight
# @return void
private method determinate_prog_lang {reset} {
@@ -2727,12 +2827,16 @@ class Editor {
private method prog_lang_changed {} {
if {$editor_to_use} {return}
# Clear current highlighting tags
- $editor tag remove tag_error 0.0 end
- $editor tag remove tag_error_line 0.0 end
- foreach tag [concat \
- ${::CsyntaxHighlight::hightlight_tags} \
- ${::ASMsyntaxHighlight::hightlight_tags} \
- ${LSTsyntaxHighlight::hightlight_tags} \
+ $editor tag remove tag_error 0.0 end
+ $editor tag remove tag_error_line 0.0 end
+ $editor tag remove tag_constant_def 0.0 end
+ $editor tag remove tag_macro_def 0.0 end
+ $editor tag remove c_lang_func 0.0 end
+ $editor tag remove c_lang_var 0.0 end
+ foreach tag [concat \
+ ${::CsyntaxHighlight::highlight_tags} \
+ ${::ASMsyntaxHighlight::highlight_tags} \
+ ${::LSTsyntaxHighlight::highlight_tags} \
] {
$editor tag remove [lindex $tag 0] 0.0 end
}
@@ -2760,7 +2864,7 @@ class Editor {
# Adjust main menu and main toolbar
if {$prog_language == 1} {
set uses_c 1
- } {
+ } else {
set uses_c 0
}
::X::adjust_mainmenu_and_toolbar_to_editor {} $uses_c
@@ -2779,8 +2883,12 @@ class Editor {
$Sbar_prog_lang configure -fg {#00DDEE} -text "LST"
} elseif {$prog_language == 3} {
$Sbar_prog_lang configure -fg {#0000DD} -text "ASX"
- } {
+ } else {
$Sbar_prog_lang configure -fg {#00CC00} -text "ASM"
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/editor/eventhandlers.tcl b/lib/editor/eventhandlers.tcl
index c6d1083..279b2e2 100755..100644
--- a/lib/editor/eventhandlers.tcl
+++ b/lib/editor/eventhandlers.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 _EVENTHANDLERS_TCL ] } {
+set _EVENTHANDLERS_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements event handlers
@@ -138,7 +143,7 @@ public method scroll args {
if {$unit != {p}} {
incr line [lindex $args 1]
- } {
+ } else {
incr line [expr {30 * [lindex $args 1]}]
}
incr line -1
@@ -157,7 +162,7 @@ public method scroll args {
}
highlight_visible_area ;# Highlight lines which hasn't been highlighted yet
- update idle
+ update idletasks
set tmp_row $row
if {$number_of_wraps} {
@@ -187,7 +192,7 @@ public method scroll args {
}
# Done ...
- update idle
+ update idletasks
set scroll_in_progress 0
}
@@ -207,12 +212,12 @@ public method popupMenu {X Y x y} {
]
if {$address == {}} {
set state {disabled}
- } {
+ } else {
set state {normal}
}
$menu entryconfigure [::mc "LJMP this line"] -state $state
$menu entryconfigure [::mc "LCALL this line"] -state $state
- } {
+ } else {
$menu entryconfigure [::mc "LJMP this line"] -state disabled
$menu entryconfigure [::mc "LCALL this line"] -state disabled
}
@@ -262,7 +267,7 @@ public method statusbar_popup_menu {editor X Y} {
if {[lindex $statusbar_menu_config 0] != 0} {
set state normal
- } {
+ } else {
set state disabled
}
$stat_menu entryconfigure [::mc "Split vertical"] -state $state
@@ -270,21 +275,21 @@ public method statusbar_popup_menu {editor X Y} {
if {[lindex $statusbar_menu_config 1] != 0} {
set state normal
- } {
+ } else {
set state disabled
}
$stat_menu entryconfigure [::mc "Close current view"] -state $state
if {[lindex $statusbar_menu_config 2] != 0} {
set state normal
- } {
+ } else {
set state disabled
}
$stat_menu entryconfigure [::mc "Back"] -state $state
if {[lindex $statusbar_menu_config 3] != 0} {
set state normal
- } {
+ } else {
set state disabled
}
$stat_menu entryconfigure [::mc "Forward"] -state $state
@@ -322,9 +327,83 @@ public method control_up {} {
$editor yview scroll -1 units
}
+## Handles event: "Control-Shift-Key-Up" and "Control-Shift-Key-Down"
+ # @parm Bool up__down - 1 == Control-Shift-Key-Up; 0 == Control-Shift-Key-Down
+ # @return void
+public method control_shift_updown {up__down} {
+ if {$up__down} {
+ if {int([$editor index insert]) == 1} {
+ return
+ }
+ } else {
+ if {(int([$editor index insert]) + 1) == int([$editor index end])} {
+ return
+ }
+ }
+
+ $editor configure -autoseparators 0
+ if {$up__down} {
+ set target_idx [$editor index {insert-1l}]
+ autocompletion_maybe_important_change [$editor index {insert-1l linestart}] [$editor index {insert lineend}]
+ } else {
+ set target_idx [$editor index {insert+1l}]
+ autocompletion_maybe_important_change [$editor index {insert linestart}] [$editor index {insert+1l lineend}]
+ }
+
+ catch {
+ $editor tag remove sel 1.0 end
+ }
+
+ set line0 [$editor get {insert linestart} {insert lineend}]
+ if {$up__down} {
+ set line1 [$editor get {insert-1l linestart} {insert-1l lineend}]
+ } else {
+ set line1 [$editor get {insert+1l linestart} {insert+1l lineend}]
+ }
+
+ $editor delete {insert linestart} {insert lineend}
+ if {$up__down} {
+ $editor delete {insert-1l linestart} {insert-1l lineend}
+ } else {
+ $editor delete {insert+1l linestart} {insert+1l lineend}
+ }
+
+ $editor insert insert $line1
+ if {$up__down} {
+ $editor insert {insert-1l} $line0
+ } else {
+ $editor insert {insert+1l} $line0
+ }
+
+ set idx [expr {int([$editor index insert])}]
+ parse $idx
+ manage_autocompletion_list $idx
+ if {$up__down} {
+ set idx [expr {int([$editor index insert-1l])}]
+ } else {
+ set idx [expr {int([$editor index insert+1l])}]
+ }
+ parse $idx
+ manage_autocompletion_list $idx
+
+ # Check spelling on the other line
+ update
+ spellcheck_check_all [expr {int([$editor index insert])}] 1
+
+ # Move insertion cursor
+ $editor mark set insert $target_idx
+ $editor see insert
+
+ $editor edit separator
+ $editor configure -autoseparators 1
+}
+
## Handles event: "Shift-Key-Down"
# @return void
public method shift_down {} {
+ # Check spelling on the line which we are noe leaving
+ spellcheck_check_all [expr {int([$editor index insert])}]
+
tk::TextKeySelect $editor [get_up_down_idx 0]
# Adjust selection in list of bookmarks and list of breakpoints
@@ -338,6 +417,9 @@ public method shift_down {} {
## Handles event: "Shift-Key-Up"
# @return void
public method shift_up {} {
+ # Check spelling on the line which we are noe leaving
+ spellcheck_check_all [expr {int([$editor index insert])}]
+
tk::TextKeySelect $editor [get_up_down_idx 1]
# Adjust selection in list of bookmarks and list of breakpoints
@@ -351,6 +433,9 @@ public method shift_up {} {
## Handles event: "Key-Up"
# @return void
public method up {} {
+ # Check spelling on the line which we are now leaving
+ spellcheck_check_all [expr {int([$editor index insert])}]
+
# Move insertion cursor
$editor mark set insert [get_up_down_idx 1]
@@ -370,6 +455,9 @@ public method up {} {
## Handles event: "Key-Down"
# @return void
public method down {} {
+ # Check spelling on the line which we are now leaving
+ spellcheck_check_all [expr {int([$editor index insert])}]
+
# Focus completion popup window
if {$completion_win_opened} {
catch {
@@ -427,7 +515,7 @@ public method shift_home {} {
}
# Nothing selected
- } {
+ } else {
set idx [$editor index insert]
home_press
catch {
@@ -436,12 +524,32 @@ public method shift_home {} {
if {[$editor compare $idx < insert]} {
$editor tag add sel $idx insert
- } {
+ } else {
$editor tag add sel insert $idx
}
}
}
+## Handles event: "Control-Key-Home"
+ # @return void
+public method control_home {} {
+ $editor mark set insert 1.0
+ rightPanel_adjust [expr {int([$editor index insert])}]
+ resetUpDownIndex
+ recalc_status_counter {} 0
+ $editor see insert
+}
+
+## Handles event: "Control-Key-End"
+ # @return void
+public method control_end {} {
+ $editor mark set insert end
+ rightPanel_adjust [expr {int([$editor index insert])}]
+ resetUpDownIndex
+ recalc_status_counter {} 0
+ $editor see insert
+}
+
## Handles event: "Key-Home"
# @return void
public method home_press {} {
@@ -455,10 +563,10 @@ public method home_press {} {
set col [string length $space]
if {$col_original == $col} {
$editor mark set insert $row.0
- } {
+ } else {
$editor mark set insert $row.$col
}
- } {
+ } else {
$editor mark set insert $row.0
}
@@ -468,6 +576,7 @@ public method home_press {} {
}
# Adjust status bar counters
+ resetUpDownIndex
recalc_status_counter {} 0
$editor see insert
}
@@ -477,7 +586,7 @@ public method home_press {} {
public method tab_press {} {
if {$spaces_no_tabs} {
set indent_char [string repeat { } $number_of_spaces]
- } {
+ } else {
set indent_char "\t"
}
@@ -486,7 +595,7 @@ public method tab_press {} {
Key $indent_char
# Something selected -> indent
- } {
+ } else {
# convert selection indexes to line numbers
set start [expr {int([$editor index sel.first])}]
set end_o [$editor index sel.last]
@@ -514,6 +623,9 @@ public method shift_enter {} {
if {$critical_edit_proc} {return}
set critical_edit_proc 1
+ # Check spelling on the line which we are noe leaving
+ spellcheck_check_all [expr {int([$editor index insert])}]
+
deleteselection
$editor insert insert "\n"
@@ -553,10 +665,13 @@ public method enter {} {
set idx [expr {int($idx)}]
incr idx
+ # Check spelling on the line which we are noe leaving
+ spellcheck_check_all $idx
+
# Keep indention of the previous line
if {$intentation_mode == {normal}} {
- # Determinate indetication charactes
+ # Determinate indetication characters
set prev_line [$editor get \
[$editor index {insert-1l linestart}] \
[$editor index {insert-1l lineend}] \
@@ -620,7 +735,7 @@ public method KeyRelease {key} {
if {[lsearch {ISO_Next_Group ISO_Prev_Group Alt_R Alt_L Control Meta Shift_L Shift_R} $key] == -1} {
if {$do_not_hide_comp_win} {
set do_not_hide_comp_win 0
- } {
+ } else {
close_completion_popup_window
}
}
@@ -628,8 +743,8 @@ public method KeyRelease {key} {
## Handles event: 'Key'
# @return void
-public method Key {key} {
- # Skip values with no meaning
+public method Key {key {key_k {}}} {
+ # Skip values with no meaning for us herw
if {![string is print -strict $key] && $key != "\t"} {
return
}
@@ -643,6 +758,7 @@ public method Key {key} {
set key_handler_in_progress 1
set scroll_in_progress 1 ;# Block scrolling
+ spellcheck_change_detected_pre
autocompletion_maybe_important_change insert insert
$editor configure -autoseparators 0
@@ -665,7 +781,7 @@ public method Key {key} {
$editor tag remove sel 1.0 end
# Insert the selected character twice
- } {
+ } else {
set next_char [$editor get insert insert+1c]
$editor insert insert $key
switch -- $key {
@@ -730,6 +846,7 @@ public method Key {key} {
set key_handler_in_progress 0
update
set scroll_in_progress 0 ;# Unblock scrolling
+ spellcheck_change_detected_post
}
## Handles event: 'Key-Delete'
@@ -738,7 +855,7 @@ public method key_delete {} {
if {![$this deleteselection 1]} {
if {[$editor compare {insert linestart} != {insert+1c linestart}]} {
set remove_trailing_space 1
- } {
+ } else {
set remove_trailing_space 0
}
@@ -752,6 +869,7 @@ public method key_delete {} {
$this resetUpDownIndex
$this recalc_left_frame
+ $this parse [expr {int([$editor index insert])}]
update
}
@@ -779,3 +897,7 @@ public method key_backspace {} {
$this parse [expr {int([$editor index insert])}]
update
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/editor/exports.tcl b/lib/editor/exports.tcl
index 2ce2ed4..26441c7 100755..100644
--- a/lib/editor/exports.tcl
+++ b/lib/editor/exports.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 _EXPORTS_TCL ] } {
+set _EXPORTS_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements exports to other data formats (XHTML && LaTeX)
@@ -73,9 +78,9 @@ public method highlight_all {} {
public method getDataAsXHTML_count_of_iterations {} {
set result 0
foreach tag_def [concat \
- ${ASMsyntaxHighlight::hightlight_tags} \
- ${CsyntaxHighlight::hightlight_tags} \
- ${LSTsyntaxHighlight::hightlight_tags} \
+ ${ASMsyntaxHighlight::highlight_tags} \
+ ${CsyntaxHighlight::highlight_tags} \
+ ${LSTsyntaxHighlight::highlight_tags} \
] {
set range [$editor tag ranges [lindex $tag_def 0]]
incr result [llength $range]
@@ -91,8 +96,8 @@ public method getDataAsLaTeX_abort_now {} {
}
## Export editor content as LaTeX source (include colors)
- # @return String - LaTeX source code
-public method getDataAsLaTeX {} {
+ # @parm File file - Target data channel
+public method getDataAsLaTeX {file} {
# Reset abort variables
set getDataAsLaTeX_abort 0
@@ -122,22 +127,22 @@ public method getDataAsLaTeX {} {
}
# Create LaTeX preamble
- set latex "\\documentclass\[a4paper,12pt\]{article}"
- append latex "\n\n% Creator: ${::APPNAME}\n\n"
- append latex "\\usepackage\[utf-8\]{inputenc}\n"
- append latex "\\usepackage\[T1\]{fontenc}\n"
- append latex "\\usepackage{color}\n"
- append latex "\\title{$filename}\n"
- append latex "\\date{[clock format [clock seconds] -format {%D}]}\n"
- append latex "\n% define highlighting\n"
+ puts -nonewline $file "\\documentclass\[a4paper,12pt\]{article}"
+ puts -nonewline $file "\n\n% Creator: ${::APPNAME}\n\n"
+ puts -nonewline $file "\\usepackage\[utf8\]{inputenc}\n"
+ puts -nonewline $file "\\usepackage\[T1\]{fontenc}\n"
+ puts -nonewline $file "\\usepackage{color}\n"
+ puts -nonewline $file "\\title{$filename}\n"
+ puts -nonewline $file "\\date{[clock format [clock seconds] -format {%D}]}\n"
+ puts -nonewline $file "\n% define highlighting\n"
## Determinate highlighting tag ranges and define colors for 'color' package
set ranges {}
# Iterate over predefined highlighting tags
foreach tag_def [concat \
- ${ASMsyntaxHighlight::hightlight_tags} \
- ${CsyntaxHighlight::hightlight_tags} \
- ${LSTsyntaxHighlight::hightlight_tags} \
+ ${ASMsyntaxHighlight::highlight_tags} \
+ ${CsyntaxHighlight::highlight_tags} \
+ ${LSTsyntaxHighlight::highlight_tags} \
] {
# Conditional abort
@@ -148,13 +153,24 @@ public method getDataAsLaTeX {} {
# Local variables
set color [lindex $tag_def 1] ;# RGB color
- set red [string range $color 1 2] ;# Color - RED
- set green [string range $color 3 4] ;# Color - GREEN
- set blue [string range $color 5 6] ;# Color - BLUE
set tag [lindex $tag_def 0] ;# Tag name
set range [$editor tag ranges $tag] ;# List of tag ranges
set len [llength $range] ;# Number of ranges
- set mirror_tag {} ;# Tag with exatly the same highlight
+ set mirror_tag {} ;# Tag with exatly the same highlight
+
+ # Convert 48b color format to 24b format
+ if {[string length $color] == 13} {
+ set new_color {#}
+ for {set i 1} {$i < [string length $color]} {incr i 4} {
+ append new_color [string range $color $i [expr {$i + 1}]]
+ }
+ set color $new_color
+ }
+
+ # Decompose the color code
+ set red [string range $color 1 2] ;# Color - RED
+ set green [string range $color 3 4] ;# Color - GREEN
+ set blue [string range $color 5 6] ;# Color - BLUE
# Determinate mirror tag
switch -- $tag {
@@ -163,7 +179,7 @@ public method getDataAsLaTeX {} {
}
if {$mirror_tag != {}} {
set mirror_range [$editor tag ranges $mirror_tag]
- } {
+ } else {
set mirror_range {}
}
@@ -179,7 +195,7 @@ public method getDataAsLaTeX {} {
set green [string range [expr "0x$green / 255.0"] 0 4]
set blue [string range [expr "0x$blue / 255.0"] 0 4]
# Define color (for package color)
- append latex "\\definecolor{highlight_$tag}{rgb}{$red, $green, $blue}\n"
+ puts -nonewline $file "\\definecolor{highlight_$tag}{rgb}{$red, $green, $blue}\n"
# Adjust map of text tags
set mirror_tag {}
@@ -220,7 +236,7 @@ public method getDataAsLaTeX {} {
set spaces 0
set correction 0
- while 1 {
+ while {1} {
set idx [string first "\t" $textLine [expr {$idx + 1}]]
if {$idx == -1} {break}
@@ -258,7 +274,7 @@ public method getDataAsLaTeX {} {
# Determinate string to insert
if {[lindex $range 2]} {
set tag "'\{\\color{highlight_[lindex $range 1]}\\verb'"
- } {
+ } else {
set tag "'\}\\verb'"
}
@@ -289,13 +305,10 @@ public method getDataAsLaTeX {} {
regsub -all "\a" $text {'\\verb"'"\\verb'} text
# Create final LaTeX document
- append latex "\n\n\\begin{document}\n"
- append latex "\\ \\\\\n"
- append latex $text
- append latex "\n\\end{document}"
-
- # Return result
- return $latex
+ puts -nonewline $file "\n\n\\begin{document}\n"
+ puts -nonewline $file "\\ \\\\\n"
+ puts -nonewline $file $text
+ puts -nonewline $file "\n\\end{document}"
}
## Abort export to XHTML
@@ -305,8 +318,8 @@ public method getDataAsXHTML_abort_now {} {
}
## Export editor content as XHTML source (include colors)
- # @return String - XHTML source code
-public method getDataAsXHTML {} {
+ # @parm File file - Target data channel
+public method getDataAsXHTML {file} {
# Reset abort variables
set getDataAsXHTML_abort 0
@@ -336,26 +349,26 @@ public method getDataAsXHTML {} {
}
# Create XHTML header
- set html "<?xml version='1.0' encoding='utf-8' standalone='no'?>\n"
- append html "<!DOCTYPE html PUBLIC\n"
- append html "\t'-//W3C//DTD XHTML 1.1//EN'\n"
- append html "\t'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>\n"
- append html "<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>\n"
- append html "<!--\n\tCreator: ${::APPNAME}\n\tDate: [clock format [clock seconds] -format {%D}]\n-->\n"
- append html "\t<head>\n"
- append html "\t\t<title>$filename</title>\n"
- append html "\t\t<meta http-equiv=\"Content-Type\" content=\"application/xhtml+xml; charset=UTF-8\" />\n"
- append html "\t\t<meta name=\"Generator\" content=\"${::APPNAME}\" />\n"
- append html "\t\t<style type=\"text/css\">\n"
- append html "\t\t\tbody {\n\t\t\t\tfont-family: $fontFamily;\n\t\t\t\tfont-size: ${fontSize}px;\n\t\t\t}\n"
+ puts -nonewline $file "<?xml version='1.0' encoding='utf-8' standalone='no'?>\n"
+ puts -nonewline $file "<!DOCTYPE html PUBLIC\n"
+ puts -nonewline $file "\t'-//W3C//DTD XHTML 1.1//EN'\n"
+ puts -nonewline $file "\t'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>\n"
+ puts -nonewline $file "<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>\n"
+ puts -nonewline $file "<!-- Creator: ${::APPNAME} -->\n"
+ puts -nonewline $file "\t<head>\n"
+ puts -nonewline $file "\t\t<title>$filename</title>\n"
+ puts -nonewline $file "\t\t<meta http-equiv=\"Content-Type\" content=\"application/xhtml+xml; charset=UTF-8\" />\n"
+ puts -nonewline $file "\t\t<meta name=\"Generator\" content=\"${::APPNAME}\" />\n"
+ puts -nonewline $file "\t\t<style type=\"text/css\">\n"
+ puts -nonewline $file "\t\t\tbody {\n\t\t\t\tfont-family: $fontFamily;\n\t\t\t\tfont-size: ${fontSize}px;\n\t\t\t}\n"
## Determinate highlighting tag ranges and define inline CSS
set ranges {}
# Iterate over predefined highlighting tags
foreach tag_def [concat \
- ${ASMsyntaxHighlight::hightlight_tags} \
- ${CsyntaxHighlight::hightlight_tags} \
- ${LSTsyntaxHighlight::hightlight_tags} \
+ ${ASMsyntaxHighlight::highlight_tags} \
+ ${CsyntaxHighlight::highlight_tags} \
+ ${LSTsyntaxHighlight::highlight_tags} \
] {
# Conditional abort
@@ -377,7 +390,7 @@ public method getDataAsXHTML {} {
}
if {$mirror_tag != {}} {
set mirror_range [$editor tag ranges $mirror_tag]
- } {
+ } else {
set mirror_range {}
}
@@ -388,19 +401,30 @@ public method getDataAsXHTML {} {
# Adjust tag name
set tag [string replace $tag 0 3]
+ set color [lindex $tag_def 1]
+
+ # Convert 48b color format to 24b format
+ if {[string length $color] == 13} {
+ set new_color {#}
+ for {set i 1} {$i < [string length $color]} {incr i 4} {
+ append new_color [string range $color $i [expr {$i + 1}]]
+ }
+ set color $new_color
+ }
+
# create CSS
- append html "\t\t\t.$tag {\n"
- append html "\t\t\t\tcolor: [lindex $tag_def 1];\n"
+ puts -nonewline $file "\t\t\t.$tag {\n"
+ puts -nonewline $file "\t\t\t\tcolor: $color;\n"
if {[lindex $tag_def 2]} {
- append html "\t\t\t\ttext-decoration: line-through;\n"
+ puts -nonewline $file "\t\t\t\ttext-decoration: line-through;\n"
}
if {[lindex $tag_def 3]} {
- append html "\t\t\t\tfont-style: italic;\n"
+ puts -nonewline $file "\t\t\t\tfont-style: italic;\n"
}
if {[lindex $tag_def 4]} {
- append html "\t\t\t\tfont-weight: bold;\n"
+ puts -nonewline $file "\t\t\t\tfont-weight: bold;\n"
}
- append html "\t\t\t}\n"
+ puts -nonewline $file "\t\t\t}\n"
for {set i 0} {$i < $len} {incr i} {
lappend ranges [list [lindex $range $i] $tag 1]
@@ -416,8 +440,8 @@ public method getDataAsXHTML {} {
}
}
}
- append html "\t\t</style>\n"
- append html "\t</head>\n"
+ puts -nonewline $file "\t\t</style>\n"
+ puts -nonewline $file "\t</head>\n"
# Sort tag ranges (recursive)
set ranges [lsort -command "::FileList::editor__sort_tag_ranges" $ranges]
@@ -457,7 +481,7 @@ public method getDataAsXHTML {} {
# Deterinate string to insert
if {[lindex $range 2]} {
set tag "span class='[lindex $range 1]'"
- } {
+ } else {
set tag {/span}
}
@@ -475,12 +499,13 @@ public method getDataAsXHTML {} {
regsub -all "\b" $text {\&gt;} text
# Create final XHTML document
- append html "\t<body>\n\t\t<pre>\n"
- append html "\t\t<!-- CODE BLOCK - begin -->\n"
- append html $text
- append html "\t\t<!-- CODE BLOCK - end -->\n"
- append html "\t\t</pre>\n\t</body>\n</html>"
-
- # Return result
- return $html
+ puts -nonewline $file "\t<body>\n\t\t<pre>\n"
+ puts -nonewline $file "\t\t<!-- CODE BLOCK - begin -->\n"
+ puts -nonewline $file $text
+ puts -nonewline $file "\t\t<!-- CODE BLOCK - end -->\n"
+ puts -nonewline $file "\t\t</pre>\n\t</body>\n</html>"
+}
+
+# >>> File inclusion guard
}
+# <<< File inclusion guard
diff --git a/lib/editor/generalproc.tcl b/lib/editor/generalproc.tcl
index f73be85..3bf8767 100755..100644
--- a/lib/editor/generalproc.tcl
+++ b/lib/editor/generalproc.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 _GENERALPROC_TCL ] } {
+set _GENERALPROC_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements general purpose procedures
@@ -43,7 +48,7 @@ public method switch_sel_mode {} {
if {$selection_mode} {
adjust_selection_to_block
$sel_mode_lbl configure -text [mc "BLK"] -fg #0088CC
- } {
+ } else {
if {[llength [$editor tag nextrange sel 1.0]]} {
$editor tag add sel sel.first sel.last
}
@@ -73,7 +78,7 @@ public method getBreakpoints {} {
# @parm Bool inSelection - Search in the selected block / search globaly
# @parm String Sindex - index in the text where the search should start
# @parm String String - String to search
- # @return List - {indexMatchBegining indexMatchEnd matchesCount}
+ # @return List - {indexMatchBeginning indexMatchEnd matchesCount}
public method find {fromCursor Backwards regExp noCase inSelection Sindex String} {
## adjust search options
@@ -85,10 +90,10 @@ public method find {fromCursor Backwards regExp noCase inSelection Sindex String
if {$inSelection} {
set Sindex sel.first
set Eindex sel.last
- } {
+ } else {
if {$Backwards} {
set Eindex 1.0
- } {
+ } else {
set Eindex {end}
}
}
@@ -97,12 +102,12 @@ public method find {fromCursor Backwards regExp noCase inSelection Sindex String
if {$fromCursor} {
# Sindex
set Sindex {insert}
- } {
+ } else {
# Sindex
if {$Sindex == {}} {
if {$Backwards} {
set Sindex end
- } {
+ } else {
set Sindex 1.0
}
}
@@ -112,7 +117,7 @@ public method find {fromCursor Backwards regExp noCase inSelection Sindex String
if {$Backwards} {
append Sindex -[expr {[string length $String] - 1}]c
set direction {-backwards}
- } {
+ } else {
set direction {-forwards}
}
@@ -125,7 +130,7 @@ public method find {fromCursor Backwards regExp noCase inSelection Sindex String
set index [$editor search $direction $regexp -nocase \
-count {::editor_search_count} -- \
$String $Sindex $Eindex]
- } {
+ } else {
set index [$editor search $direction $regexp \
-count {::editor_search_count} -- \
$String $Sindex $Eindex]
@@ -149,14 +154,14 @@ public method find {fromCursor Backwards regExp noCase inSelection Sindex String
# Goto line with the found match and select that matched string
if {$Backwards} {
goto $lineNumber.$colNumber
- } {
+ } else {
goto $lineNumber.$end_col
}
$editor tag remove sel 1.0 end
$editor tag add sel $index $lineNumber.$end_col
- # set result acording to values determinated above
+ # set result according to values determinated above
set matches "$index $lineNumber.$end_col ${::editor_search_count}"
- } {
+ } else {
# set result to something like 'nothing found'
set matches "$Sindex $Sindex 0"
}
@@ -196,33 +201,58 @@ public method replace {fromCursor Backwards regExp noCase SearchString Replaceme
if {$critical_edit_proc} {return 0}
set critical_edit_proc 1
- ## Derminate indexes of area to be affected
+ ## Derminate indexes of the area to be affected
if {$fromCursor} {
# from actual cursor position
set index {insert}
- } {
+ } else {
if {$Backwards} {
set index {end}
- } {
+ } else {
set index 1.0
}
}
## Perform replacement for each match
- while $remaining {
+ set index_org {}
+ set index_new {}
+ while {1} {
# Initiate search and determinate count of remaining matches
- set result [find $fromCursor $Backwards $regExp $noCase 0 $index $SearchString]
-
- set remaining [lindex $result 2]
- if {$remaining == 0} {break}
-
- # Determinate index where to reinitiate search
- set index [lindex $result [expr {!$Backwards}]]
+ set last_chance 0
+ while {1} {
+ set result [find $fromCursor $Backwards $regExp $noCase 0 $index $SearchString]
+
+ set remaining [lindex $result 2]
+ if {$remaining == 0} {break}
+
+ # Determinate index where to reinitiate search
+ set index_org $index_new
+ set index [lindex $result [expr {!$Backwards}]]
+ set index_new $index
+ if {$index_org == $index} {
+ if {$last_chance} {
+ break
+ } else {
+ if {!$Backwards} {
+ set index [$editor index [list $index {+1c}]]
+ } else {
+ set index [$editor index [list $index {-1c}]]
+ }
+ set last_chance 1
+ }
+ } else {
+ set last_chance 0
+ break
+ }
+ }
+ if {$last_chance || $remaining == 0 || $remaining == {}} {
+ break
+ }
- # "Annoy user" if there is requested confirmation before each replace
+ # Ask user if there is requested confirmation before each replace
if {$confirm} {
# invoke confirmation command and setup new parameters
- switch [$confirmCMD] {
+ switch -- [$confirmCMD] {
0 { ;# Replace
set cnd 1
}
@@ -246,8 +276,8 @@ public method replace {fromCursor Backwards regExp noCase SearchString Replaceme
break
}
}
- } {
- # automaticaly replace all without any prompt
+ } else {
+ # automatically replace all without any prompt
set cnd 1
}
@@ -272,7 +302,7 @@ public method replace {fromCursor Backwards regExp noCase SearchString Replaceme
for {set line $start} {$line <= $end} {incr line} {
parse $line
}
- } {
+ } else {
for {set line $start} {$line <= $end} {incr line} {
restore_line_markers $line
}
@@ -303,9 +333,9 @@ public method replace {fromCursor Backwards regExp noCase SearchString Replaceme
# @return void
public method select_all {} {
catch {
- $editor tag remove sel 1.0 end
+ $editor tag remove sel 1.0 end
}
- $editor tag add sel 1.0 end
+ $editor tag add sel 1.0 end
}
## Comment the selected area or current line
@@ -323,7 +353,7 @@ public method comment {} {
if {[getselection] == {}} {
set restore_sel 0
set end $start
- } {
+ } else {
set restore_sel 1
set start [expr {int([$editor index sel.first])}]
set end_o [$editor index sel.last]
@@ -345,7 +375,7 @@ public method comment {} {
set by_lines 1
set restore_sel 0
set end $start
- } {
+ } else {
set start_o [$editor index sel.first]
set start [expr {int($start_o)}]
set end_o [$editor index sel.last]
@@ -353,7 +383,7 @@ public method comment {} {
if {$end == $end_o && $start == $start_o} {
set restore_sel 1
set by_lines 1
- } {
+ } else {
set restore_sel 0
set by_lines 0
}
@@ -370,7 +400,7 @@ public method comment {} {
restore_line_markers $line
}
# Comment only selected characters
- } {
+ } else {
$editor insert $end_o { */}
$editor insert $start_o {/* }
$editor tag add sel sel.first-3c sel.last+3c
@@ -388,7 +418,7 @@ public method comment {} {
# Restore highlight
if {$prog_language == 1 && ![string index $highlighted_lines $start] == 6} {
parse $start
- } {
+ } else {
for {set i $start} {$i <= $end} {incr i} {
parse $i
}
@@ -417,7 +447,7 @@ public method uncomment {} {
if {[getselection] == {}} {
set restore_sel 0
set end $start
- } {
+ } else {
set restore_sel 1
set start [expr {int([$editor index sel.first])}]
set end_o [$editor index sel.last]
@@ -431,7 +461,7 @@ public method uncomment {} {
set line_data [$editor get $line.0 "$line.0 lineend"]
if {[regexp {^\s*;\s*} $line_data comment]} {
- detete_text_in_editor $line.0 $line.[string length $comment]
+ detete_text_in_editor $line.0 $line.[string length $comment] 0
regsub {;} $comment {} comment
$editor insert $line.0 $comment
restore_line_markers $line
@@ -447,7 +477,7 @@ public method uncomment {} {
set by_lines 1
set restore_sel 0
set end $start
- } {
+ } else {
set start_o [$editor index sel.first]
set start [expr {int($start_o)}]
set end_o [$editor index sel.last]
@@ -455,7 +485,7 @@ public method uncomment {} {
if {$end == $end_o && $start == $start_o} {
set restore_sel 1
set by_lines 1
- } {
+ } else {
set restore_sel 0
set by_lines 0
}
@@ -476,8 +506,8 @@ public method uncomment {} {
set succesful 1
set start_data [string length $start_data]
set end_data [string length $end_data]
- detete_text_in_editor $end_o-${end_data}c $end_o
- detete_text_in_editor $start_o $start_o+${start_data}c
+ detete_text_in_editor $end_o-${end_data}c $end_o 0
+ detete_text_in_editor $start_o $start_o+${start_data}c 0
}
}
@@ -486,13 +516,13 @@ public method uncomment {} {
set line_data [$editor get $line.0 [list $line.0 lineend]]
if {[regexp {^\s*// ?} $line_data line_data]} {
set line_data [string length $line_data]
- detete_text_in_editor $line.0 $line.$line_data
+ detete_text_in_editor $line.0 $line.$line_data 0
manage_autocompletion_list $line
set succesful 1
}
restore_line_markers $line
}
- } {
+ } else {
$editor edit separator
$editor configure -autoseparators 1
return $succesful
@@ -504,7 +534,7 @@ public method uncomment {} {
# Restore highlight
if {$prog_language == 1 && ![string index $highlighted_lines $start] == 6} {
parse $start
- } {
+ } else {
for {set i $start} {$i <= $end} {incr i} {
parse $i
}
@@ -517,6 +547,13 @@ public method uncomment {} {
}
+ # Perform spell checking for all the affected lines
+ if {$spellchecker_enabled} {
+ for {set i $start} {$i <= $end} {incr i} {
+ spellcheck_check_all $i
+ }
+ }
+
# Return result
return $succesful
}
@@ -545,7 +582,7 @@ public method goto {textIndex} {
[$editor index "$textIndex +1 line linestart"]
}
recalc_status_counter {} 0
- update idle
+ update idletasks
$editor see insert
}
@@ -599,7 +636,7 @@ public method indent {} {
set restore_sel 0
set start [expr {int([$editor index insert])}]
set end $start
- } {
+ } else {
set restore_sel 1
set start [expr {int([$editor index sel.first])}]
set end_o [$editor index sel.last]
@@ -610,7 +647,7 @@ public method indent {} {
# indent each line in the block
if {$spaces_no_tabs} {
set indent_char [string repeat { } $number_of_spaces]
- } {
+ } else {
set indent_char "\t"
}
for {set line $start} {$line <= $end} {incr line} {
@@ -635,7 +672,7 @@ public method unindent {} {
set restore_sel 0
set start [expr {int([$editor index insert])}]
set end [expr {int([$editor index insert])}]
- } {
+ } else {
set restore_sel 1
set start [expr {int([$editor index sel.first])}]
set end_o [$editor index sel.last]
@@ -655,7 +692,7 @@ public method unindent {} {
} elseif {[regexp {^\t} $line_data]} {
detete_text_in_editor $line.0 $line.1
}
- } {
+ } else {
if {[regexp {^[\t( )]} $line_data]} {
detete_text_in_editor $line.0 $line.1
}
@@ -717,15 +754,15 @@ public method get_md5 {} {
## Add/Remove bookmark to/from current line
# Directly depends on variable "bookmarks" (managed by proc. recalc_left_frame)
- # @parm Int = NULL - target text index
+ # @parm Int idx=NULL - target text index
# @return bool - 0: bookmark removed; 1: bookmark created
-public method Bookmark args {
+public method Bookmark {{idx {}}} {
if {$editor_to_use} {return}
# Determinate line number
- if {$args != {}} {
- set lineNumber [expr {int($args)}]
- } {
+ if {$idx != {}} {
+ set lineNumber [expr {int($idx)}]
+ } else {
set lineNumber [expr {int([$editor index insert])}]
}
@@ -758,10 +795,10 @@ public method Bookmark args {
$iconBorder image create $lineNumber_i.0 \
-image ::ICONS::16::dot \
-align center
- } {
+ } else {
if {[llength [$editor tag nextrange tag_error $lineNumber.0 [list $lineNumber.0 lineend]]]} {
set image {bm_ex}
- } {
+ } else {
set image {bookmark}
}
$iconBorder image create $lineNumber_i.0 \
@@ -769,7 +806,7 @@ public method Bookmark args {
-align center
}
# Remove icon
- } {
+ } else {
$iconBorder delete $lineNumber_i.0 $lineNumber_i.2
if {
[llength [$editor tag nextrange tag_error $lineNumber.0 [list $lineNumber.0 lineend]]]
@@ -794,14 +831,14 @@ public method Bookmark args {
$parentObject rightPanel_add_bookmark $lineNumber
$parentObject rightPanel_bm_select $lineNumber
# Remove the tag
- } {
+ } else {
$editor tag remove tag_bookmark $lineNumber.0 $tmp.0
$parentObject rightPanel_remove_bookmark $lineNumber
$parentObject rightPanel_bm_unselect
}
# Enable scrolling
- update idle
+ update idletasks
set scroll_in_progress 0
# Done ...
@@ -810,14 +847,14 @@ public method Bookmark args {
## Add/Remove breapoint to/from current line
# Directly depends on variable "breakpoints" (managed by proc. recalc_left_frame)
- # @parm Int = NULL - target text index
+ # @parm Int idx=NULL - target text index
# @return bool - 0: breakpoint removed; 1: breakpoint created; or {}
-public method Breakpoint args {
+public method Breakpoint {{idx {}}} {
# Determinate line number
- if {$args != {}} {
- set lineNumber [expr {int($args)}]
- } {
+ if {$idx != {}} {
+ set lineNumber [expr {int($idx)}]
+ } else {
set lineNumber [expr {int([$editor index insert])}]
}
@@ -844,12 +881,21 @@ public method Breakpoint args {
# Add the tag
if {$make} {
- $lineNumbers tag add tag_breakpoint $lineNumber_i.0 $tmp.0
+ # Detereminate whether the breakpoint will be valid or not
+ if {[is_breakpoint_valid $lineNumber]} {
+ set tag {tag_breakpoint}
+ } else {
+ set tag {tag_breakpoint_INVALID}
+ }
+
+ $lineNumbers tag add $tag $lineNumber_i.0 $tmp.0
$parentObject rightPanel_add_breakpoint $lineNumber
$parentObject rightPanel_bp_select $lineNumber
+
# Remove the tag
- } {
+ } else {
$lineNumbers tag remove tag_breakpoint $lineNumber_i.0 $tmp.0
+ $lineNumbers tag remove tag_breakpoint_INVALID $lineNumber_i.0 $tmp.0
$parentObject rightPanel_remove_breakpoint $lineNumber
$parentObject rightPanel_bp_unselect
}
@@ -863,7 +909,7 @@ public method Breakpoint args {
}
# Enable scrolling
- update idle
+ update idletasks
set scroll_in_progress 0
# done ...
@@ -910,6 +956,7 @@ public method clear_all_breakpoints {} {
# Clear breakpoint tags from line numbers
$lineNumbers tag remove tag_breakpoint 1.0 end
+ $lineNumbers tag remove tag_breakpoint_INVALID 1.0 end
# Clear right panel
$parentObject rightPanel_clear_all_breakpoints
@@ -991,7 +1038,7 @@ public method insertData {data position} {
# Insert data
$editor insert $position [regsub -all {[\u0000-\u0008\u000B-\u000C\u000E-\u001F\u007F-\u009F]} $data {}]
# Highlight
- update idle
+ update idletasks
parseAll
}
@@ -1065,7 +1112,7 @@ private method get_count_of_lines {index0 index1} {
# Translate tabulators to spaces
set idx -1
set cor 0
- while 1 {
+ while {1} {
set idx [string first "\t" $lineText [expr {$idx + 1}]]
if {$idx == -1} {break}
@@ -1076,7 +1123,7 @@ private method get_count_of_lines {index0 index1} {
set line_width [font measure $defaultFont_bold -displayof $editor $lineText]
incr line_width [expr {$cor * $defaultCharWidth}]
# Line doesn't contain tabulators
- } {
+ } else {
set line_width [font measure $defaultFont_bold -displayof $editor $lineText]
}
@@ -1090,14 +1137,6 @@ private method get_count_of_lines {index0 index1} {
return $new_wrap
}
-## Get data of bookmarks and breapoints
- # @return List - {bookmarks breakpoints} (eg. {00011 10100})
-public method export_line_markers_data {} {
- set result [join $bookmarks {}]
- lappend result [join $breakpoints {}]
- return $result
-}
-
## Get total number of lines in editor
# @return Int - result
public method getLinesCount {} {
@@ -1107,28 +1146,66 @@ public method getLinesCount {} {
return [expr {int($result) - 1}]
}
+## Get data of bookmarks and breapoints
+ # @return List - {bookmarks breakpoints} (eg. {{1 15 96} {2 45}})
+public method export_line_markers_data {} {
+ set foo [lsearch -ascii -exact -all $bookmarks 1]
+ if {![llength $foo]} {
+ set foo 0
+ }
+ set bar [lsearch -ascii -exact -all $breakpoints 1]
+ if {![llength $bar]} {
+ set bar 0
+ }
+ return [list $foo $bar]
+}
+
## Import list of bookmarks and breapoints
# This function also validates given input data
# This function does not do anything with the right panel
- # @parm String Bookmarks - bookmakrs (eg. 00011010)
- # @parm String Breakpoints - breakpoints (eg. 011010000000)
+ # @parm String Bookmarks - bookmakrs (eg. {1 15 96})
+ # @parm String Breakpoints - breakpoints (eg. {2 45})
# @return void
public method import_line_markers_data {Bookmarks Breakpoints} {
if {$editor_to_use} {return}
+ # Determinate number of the last line in the editor
+ set lastEnd [expr {int([$editor index end])}]
+
# Check validity of the given data
- if {![regexp {^[01]*$} $Bookmarks]} {
- puts stderr [mc "Invalid list of bookmarks -- bookmarks discarded"]
+ if {[string index $Bookmarks 0] == {0}} {
+ if {![regexp {^[01]*$} $Bookmarks]} {
+ puts stderr [mc "Invalid list of bookmarks -- bookmarks discarded"]
+ set Bookmarks {}
+ }
+ } else {
+ set foo $Bookmarks
set Bookmarks {}
+ for {set i 0} {$i <= $lastEnd} {incr i} {
+ if {[lsearch -ascii -exact $foo $i] != -1} {
+ append Bookmarks 1
+ } else {
+ append Bookmarks 0
+ }
+ }
}
- if {![regexp {^[01]*$} $Breakpoints]} {
- puts stderr [mc "Invalid list of breakpoints -- bookmarks discarded"]
+ if {[string index $Breakpoints 0] == {0}} {
+ if {![regexp {^[01]*$} $Breakpoints]} {
+ puts stderr [mc "Invalid list of breakpoints -- bookmarks discarded"]
+ set Breakpoints {}
+ }
+ } else {
+ set foo $Breakpoints
set Breakpoints {}
+ for {set i 0} {$i <= $lastEnd} {incr i} {
+ if {[lsearch -ascii -exact $foo $i] != -1} {
+ append Breakpoints 1
+ } else {
+ append Breakpoints 0
+ }
+ }
}
- # Determinate number of the last line in the editor
- set lastEnd [expr {int([$editor index end])}]
-
# Initialize list of highlighted lines
set highlighted_lines [string repeat 0 $lastEnd]
@@ -1164,7 +1241,7 @@ public method import_line_markers_data {Bookmarks Breakpoints} {
$iconBorder image create $line.0 \
-image ::ICONS::16::dot \
-align center
- } {
+ } else {
$iconBorder image create $line.0 \
-image ::ICONS::16::bookmark \
-align center
@@ -1269,7 +1346,7 @@ public method set_lock {bool} {
DynamicHelp::add $Sbar_lock_file -text [mc "Unlock file switching"]
$Sbar_lock_file configure \
-image ::ICONS::16::lock
- } {
+ } else {
setStatusTip -widget $Sbar_lock_file -text [mc "File switching unlocked"]
Sbar -freeze [mc "File switching unlocked"]
DynamicHelp::add $Sbar_lock_file -text [mc "Lock file switching"]
@@ -1280,12 +1357,18 @@ public method set_lock {bool} {
}
## Invert simulator lock
- # @retunr void
+ # @return void
public method invert_lock {} {
set_lock [expr {!$auto_switching_lock}]
$parentObject set_editor_lock $this $auto_switching_lock
}
+## Get value of internal flag "frozen"
+ # @return Bool - True if the editor is in simulator mode, or disabled mode
+public method get_flag_frozen {} {
+ return $frozen
+}
+
## Switch from editor mode to simulator mode
# This operation will cause error if editor is in mode disabled
# @return void
@@ -1309,7 +1392,7 @@ public method freeze {} {
if {!$frozen} {
pack $Sbar_ssim_mode -side right
pack $Sbar_lock_file -side left
- } {
+ } else {
pack $Sbar_sim_mode -side right
}
# Disable some popup menu items
@@ -1357,7 +1440,6 @@ public method thaw {} {
if {!$ro_mode} {
$editor configure -state normal
}
- focus -force $editor
set idx [$editor index "insert linestart"]
$editor tag add tag_current_line $idx "$idx + 1 line"
pack $Sbar_CRT_frame
@@ -1379,6 +1461,11 @@ public method thaw {} {
}
# Recalculate counters
recalc_status_counter {} 0
+
+ # Check the flag "file_change_notif_flg" and if set, inform the user
+ #+ about modification to the currently opened file done by another
+ #+ program.
+ check_file_change_notif
}
## Move simulator line (line representing current position in simulator engine)
@@ -1442,12 +1529,15 @@ public method highlight_visible_area {} {
# Highlight the current view
for {set line $start} {$line <= $end} {incr line} {
if {[string index $highlighted_lines $line] == 0} {
- if {![parse $line]} {
+ if {![parse $line 1]} {
if {$line != $start} {break}
}
}
}
+ # Ensure that the current line is also checked for correct spelling
+ spellcheck_check_all [expr {int([$editor index insert])}] 1
+
# Restore previous editor state
if {$frozen} {$editor configure -state disabled}
}
@@ -1458,6 +1548,7 @@ public method highlight_visible_area {} {
# if it is not then invoke procedure 'X::__save_as'
# @return Bool - result
public method save {} {
+ if {$ro_mode} {return 1}
if {$editor_to_use} {return 1}
if {$save_in_progress} {return 1}
set save_in_progress 1
@@ -1474,9 +1565,13 @@ public method save {} {
catch {
file rename -force $fullFileName "$fullFileName~"
}
+
+ # Stop watching for modification of this file on disk (we will reenable it later)
+ FSnotifications::forget $fullFileName
}
+
if {[catch {
- set chanel [open $fullFileName w 420]
+ set chanel [open $fullFileName w 0640]
}]} then {
tk_messageBox \
-parent . \
@@ -1485,6 +1580,10 @@ public method save {} {
-title [mc "Permission denied"] \
-message [mc "Unable to open file:\n\"%s\"\nfor writing" $fullFileName]
set save_in_progress 0
+
+ # Again start watching for modification of this file on disk
+ FSnotifications::watch $fullFileName [list ::Editor::file_change_notif $this]
+
return 0
}
fconfigure $chanel -translation $eol -encoding $encoding
@@ -1494,6 +1593,9 @@ public method save {} {
$editor edit modified 0
set modified 0
+ # Again start watching for modification of this file on disk
+ FSnotifications::watch $fullFileName [list ::Editor::file_change_notif $this]
+
# Stop autosave timer
catch {
after cancel $autosave_timer
@@ -1501,17 +1603,174 @@ public method save {} {
}
# Change application status
- Sbar [mc "File %s saved" $fullFileName]
::X::adjust_title
set save_in_progress 0
if {$fullFileName == {}} {
return 0
- } {
+ } else {
+ if {$::MICROSOFT_WINDOWS} { ;# "/" --> "\"
+ regsub -all {/} $fullFileName "\\" fullFileName_win
+ } else {
+ set fullFileName_win $fullFileName
+ }
+ Sbar [mc "File %s saved" $fullFileName_win]
return 1
}
}
+## Set internal flag "file_change_notif_flg" to true
+ #
+ # The flag indicates that the file opened in this editor was modified on disk
+ # by another program. The flag is automatically cleared when the user is
+ # informed about the modification to the file.
+ #
+ # @return void
+public method set_file_change_notif_flg {} {
+ set file_change_notif_flg 1
+}
+
+## Check flag "file_change_notif_flg" and if set, inform the user about this.
+ #
+ # The flag file_change_notif_flg indicates that the file opened in this editor
+ # was modified on disk by another program. The flag is automatically cleared by
+ # this method. The user is informed via a dialog window giving him three
+ # options, reload the file, overwrite it on disk, and ignore it.
+ #
+ # @return void
+public method check_file_change_notif {} {
+ # Check the flag, and clear it if it was set
+ if {!$file_change_notif_flg} {
+ return
+ }
+ set file_change_notif_flg 0
+
+ # Create the dialog window
+ set dialog [toplevel .file_change_notif_dlg]
+
+ # Create top frame (dialog icon and text of the message)
+ set dlg_top_frame [frame $dialog.top_frame]
+ pack [label $dlg_top_frame.image -image ::ICONS::32::messagebox_warning] -side left -padx 5
+ pack [label $dlg_top_frame.label \
+ -justify left \
+ -text [mc "The file '%s' was modified from outside of this program.\n\nWhat do you want to do with the modified file?" [file tail $fullFileName]] \
+ ] -side left -fill x -expand 1 -padx 5
+
+ # Create bottom bar with dialog buttons
+ set button_frame [frame $dialog.button_frame]
+ pack [ttk::button $button_frame.button_reload \
+ -text [mc "Reload in editor"] \
+ -compound left \
+ -image ::ICONS::16::reload \
+ -command "
+ $parentObject filelist_reload_file $this 1
+ grab release $dialog
+ destroy $dialog
+ " \
+ ] -side left -padx 2
+ pack [ttk::button $button_frame.button_overwrt \
+ -text [mc "Overwrite on disk"] \
+ -compound left \
+ -image ::ICONS::16::filesave \
+ -command "
+ $this save
+ grab release $dialog
+ destroy $dialog
+ " \
+ ] -side left -padx 2
+ pack [ttk::button $button_frame.button_cancel \
+ -text [mc "Do nothing"] \
+ -compound left \
+ -image ::ICONS::16::cancel \
+ -command "
+ grab release $dialog
+ destroy $dialog
+ " \
+ ] -side left -padx 2
+
+ # Pack window frames
+ pack $dlg_top_frame -side top -fill x -expand 1 -padx 5 -pady 10
+ pack $button_frame -side bottom -side right -padx 5 -pady 5
+
+ bind $dialog <Escape> "
+ grab release $dialog
+ destroy $dialog
+ "
+
+ # Set dialog attributes (modal window)
+ wm iconphoto $dialog ::ICONS::16::status_unknown
+ wm title $dialog [mc "File changed on disk"]
+ wm state $dialog normal
+ wm minsize $dialog 400 110
+ wm transient $dialog .
+ wm protocol $dialog WM_DELETE_WINDOW "
+ grab release $dialog
+ destroy $dialog
+ "
+ update
+ catch {
+ grab $dialog
+ }
+ raise $dialog
+ focus -force $button_frame.button_cancel
+ tkwait window $dialog
+}
+
+## File change notification callback
+ #
+ # This function is supposed to be called by the FSnotifications component when
+ # a modification to the currently opened file was made by another program.
+ #
+ # @return void
+proc file_change_notif {editor_ref filename} {
+ # This call is invalid if there are no projects opened
+ if {![llength ${::X::openedProjects}]} {
+ return
+ }
+
+ # Attempt to find the corresponding project and editor index number
+ foreach project ${::X::openedProjects} {
+ set list_of_editors [$project cget -editors]
+ set actual_editor [$project cget -actualEditor]
+ set actual_editor2 [$project cget -actualEditor2]
+ set editor_idx [lsearch -ascii -exact $list_of_editors $editor_ref]
+
+ if {$editor_idx == -1} {
+ # Editor editor index number not found, move on to another project
+ continue
+ }
+
+ # Try to get the "frozen" flag from the editor
+ if {[catch {
+ set editor_frozen [$editor_ref get_flag_frozen]
+ }]} then {
+ # Unable to comply, that probably means that the editor
+ # does not exist any more
+ return
+ }
+
+ # Set the "file_change_notif_flg" flag
+ $project editor_procedure $editor_idx set_file_change_notif_flg {}
+
+ # Check the "file_change_notif_flg" flag right away, if the
+ #+ editor is currently visible to the user
+ if {
+ ($project == ${::X::actualProject})
+ &&
+ ($editor_idx == $actual_editor || $editor_idx == $actual_editor2)
+ } then {
+ # If the editor is in frozen state, i.e. the MCU
+ # simulator is engaged, then don't annoy with nonsense
+ # messages, and instead inform the user later.
+ if {!$editor_frozen} {
+ $project editor_procedure $editor_idx check_file_change_notif {}
+ }
+ }
+
+ break
+ }
+}
+
## Set variable 'fullFileName' for later file save (method 'save')
# note: also change editors status bar
# @parm String full_filename - the full filename (including path)
@@ -1520,6 +1779,16 @@ public method save {} {
public method set_FileName {full_filename rootName} {
if {$editor_to_use} {return}
+ # Start watching for changes in the file (on disk)
+ if {$fullFileName != {}} {
+ # Stop watching the old file
+ FSnotifications::watch forget $fullFileName
+ }
+ if {$full_filename != {}} {
+ # Start watching the new file
+ FSnotifications::watch $full_filename [list ::Editor::file_change_notif $this]
+ }
+
# set variables
set fullFileName $full_filename
set filename $rootName
@@ -1535,7 +1804,7 @@ public method getFileName {} {
return [list [file dirname $fullFileName] $filename]
}
-## Change letter case acording to the given options
+## Change letter case according to the given options
# @parm List options - list of 21 values, each must be one of {- L -U}
# '-' - keep case
# 'U' - Uppercase
@@ -1563,13 +1832,13 @@ public method change_letter_case {options} {
tag_imm_dec tag_imm_bin
tag_imm_constant tag_imm_unknown
tag_macro
- } \
+ } \
{
# Evaluate option
if {$option == {-}} {continue}
if {$option == {U}} {
set option {toupper}
- } {
+ } else {
set option {tolower}
}
@@ -1744,7 +2013,7 @@ public method copy {} {
Sbar [mc "Unable to execute: nothing selected"]
return 0
# Adjust clipboard content
- } {
+ } else {
clipboard clear
clipboard append $data
return 1
@@ -1752,11 +2021,11 @@ public method copy {} {
}
## Paste clipboard content to the text at the cursor position
- # @parm Bool = 0 - Use X selection instead of the clipboard
- # @
- # @
+ # @parm Bool use_X_sel=0 - Use X selection instead of the clipboard
+ # @parm Int x - X coordinate
+ # @parm Int y - Y coordinate
# @return bool - 1: successful; 0: failed
-public method paste args {
+public method paste {{use_X_sel 0} {x {}} {y {}}} {
if {$critical_edit_proc} {return}
set critical_edit_proc 1
@@ -1765,9 +2034,9 @@ public method paste args {
set original_cur_pos [$editor index insert]
}
- if {[lindex $args 0] == {1}} {
+ if {$use_X_sel} {
set cmd {selection}
- } {
+ } else {
set cmd {clipboard}
}
@@ -1780,9 +2049,7 @@ public method paste args {
return 0
}
- if {[lindex $args 0] == {1}} {
- set x [lindex $args 1]
- set y [lindex $args 2]
+ if {$use_X_sel} {
$editor mark set insert @$x,$y
catch {
$editor tag remove sel 0.0 end
@@ -1793,15 +2060,16 @@ public method paste args {
$editor configure -autoseparators 0
deleteselection
recalc_left_frame
- # insert data to the text, restore syntax hightlight and return 1
+ # insert data to the text, restore syntax highlight
$editor insert [$editor index insert] $data
recalc_left_frame
recalc_status_counter {}
$editor see [$editor index insert]
- update idle
+ update idletasks
set line [expr {int([$editor index insert])}]
rightPanel_adjust $line
parse $line
+ spellcheck_check_all $line 2 ;# Perform spell check for the current line
highlight_visible_area
$editor edit separator
$editor configure -autoseparators 1
@@ -1895,7 +2163,7 @@ public method cut {} {
set critical_edit_proc 0
return 0
# Cut
- } {
+ } else {
# Adjust clipboard content
deleteselection
clipboard clear
@@ -1957,8 +2225,10 @@ public method kill_childern {} {
if {$editor_to_use} {
bind $top_frame <Destroy> {}
if {!$::MICROSOFT_WINDOWS} { ;# There is no kill command on Microsoft Windows
- catch {
- exec -- kill $pid
+ if {$pid != [pid] && $pid != 0} {
+ catch {
+ exec -- kill $pid
+ }
}
}
catch {
@@ -1967,7 +2237,7 @@ public method kill_childern {} {
}
}
-## Get ID of file type (programing language used)
+## Get ID of file type (programming language used)
# @return Int - 0 == Assembly language; 1 == C language
public method get_language {} {
if {$prog_language == -1} {
@@ -1979,12 +2249,12 @@ public method get_language {} {
} else {
return 0
}
- } {
+ } else {
return $prog_language
}
}
-## Set file type (programing language used)
+## Set file type (programming language used)
# @parm Int lang - -1 == unknown; 0 == Assembly language; 1 == C language
# @return void
public method force_language {lang} {
@@ -2173,7 +2443,7 @@ public method getFileStatistics {} {
if {$found} {continue}
if {[string is wordchar -strict $char]} {
incr words_and_numbers
- } {
+ } else {
incr others
}
}
@@ -2181,7 +2451,7 @@ public method getFileStatistics {} {
# Determinate line type excluding empty lines
if {$last_words == $words && $last_keywords == $keywords && $last_comments < $comments} {
incr commented_lines
- } {
+ } else {
incr normal_lines
}
}
@@ -2200,12 +2470,22 @@ public method getFileStatistics {} {
}
## Set read only mode
- # @parm Bool mode_frag - 1 == Read only; 0 = Read and write
- # @return void
+ # @parm Bool mode_frag - 1 == Read only; 0 == Read and write
+ # @return Bool - true == ok; false == cannot comply!
public method change_RO_MODE {mode_frag} {
if {$editor_to_use} {return}
set ro_mode $mode_frag
+ if {!$ro_mode && [$parentObject cget -S_flag_read_only]} {
+ tk_messageBox \
+ -parent . \
+ -type ok \
+ -icon warning \
+ -title [mc "Read-only project"] \
+ -message [mc "This project has a special purpose, modifications to this project are not allowed."]
+ return 0
+ }
+
# Set to read only
if {$ro_mode} {
$editor configure -state disabled
@@ -2220,7 +2500,7 @@ public method change_RO_MODE {mode_frag} {
set state {disabled}
# Set to normal mode
- } {
+ } else {
$editor configure -state normal
$ins_mode_lbl configure \
-bg {#DDDDDD} \
@@ -2237,6 +2517,7 @@ public method change_RO_MODE {mode_frag} {
$menu entryconfigure [::mc $entry] -state $state
}
::X::adjust_mainmenu_and_toolbar_to_editor $ro_mode {}
+ return 1
}
## Perform program jump
@@ -2257,7 +2538,7 @@ public method ljmp_this_line {} {
set lineNum [$parentObject simulator_getCurrentLine]
if {$lineNum != {}} {
$parentObject move_simulator_line $lineNum
- } {
+ } else {
$parentObject editor_procedure {} unset_simulator_line {}
}
$parentObject Simulator_sync_PC_etc
@@ -2268,8 +2549,8 @@ public method ljmp_this_line {} {
public method lcall_this_line {} {
if {$editor_to_use} {return}
# Determinate target address
- set address [$parentObject simulator_line2address \
- [expr {int([$editor index insert])}] \
+ set address [$parentObject simulator_line2address \
+ [expr {int([$editor index insert])}] \
[$parentObject simulator_get_filenumber $fullFileName] \
]
if {$address == {}} {
@@ -2281,8 +2562,12 @@ public method lcall_this_line {} {
set lineNum [$parentObject simulator_getCurrentLine]
if {$lineNum != {}} {
$parentObject move_simulator_line $lineNum
- } {
+ } else {
$parentObject editor_procedure {} unset_simulator_line {}
}
$parentObject Simulator_sync_PC_etc
-} \ No newline at end of file
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/editor/spell_check.tcl b/lib/editor/spell_check.tcl
new file mode 100644
index 0000000..7759607
--- /dev/null
+++ b/lib/editor/spell_check.tcl
@@ -0,0 +1,1325 @@
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# 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 #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _SPELL_CHECK_TCL ] } {
+set _SPELL_CHECK_TCL _
+# <<< File inclusion guard
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+# Spell checker interface used by the source code editor.
+#
+# Used spell checker is Hunspell.
+#
+#
+# COMMUNICATION CONNECTIONS WITH HUNSPELL:
+# -----------------------------------------
+#
+# +-------------------+ (4) +----------+ (5) +------------------+
+# | receive_and_print | | | Hunspell | | | external_command |
+# | (RAP) | ---> | | ---> | |
+# +-------------------+ +----------+ +------------------+
+# ^ |--(2) |--3
+# (1)--| v v
+# +--------------------------------------------------------+
+# | spell_check |
+# +--------------------------------------------------------+
+#
+# 1: Send a word to check along with commands to execute in case of correct and wrong spelling
+# 2: Receive the identifier for IPC with the RAP (variable spellchecker_RAP_ID)
+# 3: Receive response from the Hunspell via IPC
+# 4: Send a word to check to the Hunspell via a pipe
+# 5: Receive response from the Hunspell via a pipe
+#
+# --------------------------------------------------------------------------
+
+## COMMON
+common spellchecker_enabled 0 ;# Bool: Flag spell checking enabled
+common spellchecker_dictionary {} ;# String: Dictionary to use (e.g. en_US or cs_CZ)
+common spellchecker_process_pid [list] ;# List of Ints: Process identifiers of the spell checker and support processes
+common spellchecker_command_LIFO [list] ;# List: LIFO for commands invoked by spell checker {correct_spelling_cmd wrong_spelling_cmd}
+common spellchecker_RAP_ID {} ;# String: Application name of ``receive_and_print'' for IPC
+common spellchecker_attempts_to_restart 0 ;# Int: Number of failed attempts to restart the spell checker process
+common spellchecker_started_flag ;# None: When this variable is set that means that the spell checker process has been started
+common spellchecker_start_failed 0 ;# Bool: Flag spellchecker_started_flag was set but the spell checker process was not actually started
+common spellchecker_start_timer {} ;# AfterTimer: Watch dog timer for start of of the spell checker process
+common available_dictionaries [list] ;# List of Strings: Dictionaries available to the Hunspell
+common hunspell_process {} ;# Channel: Hunspell process invoked by command open in order to gain list of dictionaries
+
+## PRIVATE
+private variable spellcheck_line_pre {} ;# String: Content of the line where change_detected_pre was performed
+private variable spellcheck_line_number {} ;# Int: Number of the last line where change_detected_pre was performed, see spellcheck_check_all
+private variable spellcheck_lock 0 ;# Bool: Inhibit method ``spellcheck_check_all''
+
+## COMMON
+
+## List: Language codes and language names according to: ISO-639-1
+ # Format:
+ # {
+ # { Language_Name Language_Code }
+ # ...
+ # }
+common LANGUAGE_CODES_AND_NAMES {
+ {{Abkhazian} {ab}} {{Afar} {aa}}
+ {{Afrikaans} {af}} {{Akan} {ak}}
+ {{Albanian} {sq}} {{Amharic} {am}}
+ {{Arabic} {ar}} {{Aragonese} {an}}
+ {{Armenian} {hy}} {{Assamese} {as}}
+ {{Avaric} {av}} {{Avestan} {ae}}
+ {{Aymara} {ay}} {{Azerbaijani} {az}}
+ {{Bambara} {bm}} {{Bashkir} {ba}}
+ {{Basque} {eu}} {{Belarusian} {be}}
+ {{Bengali} {bn}} {{Bihari languages} {bh}}
+ {{Bislama} {bi}} {{Bokmål, Norwegian} {nb}}
+ {{Bosnian} {bs}} {{Breton} {br}}
+ {{Bulgarian} {bg}} {{Burmese} {my}}
+ {{Castilian} {es}} {{Catalan} {ca}}
+ {{Central Khmer} {km}} {{Chamorro} {ch}}
+ {{Chechen} {ce}} {{Chewa} {ny}}
+ {{Chichewa} {ny}} {{Chinese} {zh}}
+ {{Chuang} {za}} {{Church Slavic} {cu}}
+ {{Church Slavonic} {cu}} {{Chuvash} {cv}}
+ {{Cornish} {kw}} {{Corsican} {co}}
+ {{Cree} {cr}} {{Croatian} {hr}}
+ {{Czech} {cs}} {{Danish} {da}}
+ {{Dhivehi} {dv}} {{Divehi} {dv}}
+ {{Dutch} {nl}} {{Dzongkha} {dz}}
+ {{English} {en}} {{Esperanto} {eo}}
+ {{Estonian} {et}} {{Ewe} {ee}}
+ {{Faroese} {fo}} {{Fijian} {fj}}
+ {{Finnish} {fi}} {{Flemish} {nl}}
+ {{French} {fr}} {{Fulah} {ff}}
+ {{Gaelic} {gd}} {{Galician} {gl}}
+ {{Ganda} {lg}} {{Georgian} {ka}}
+ {{German} {de}} {{Gikuyu} {ki}}
+ {{Greek, Modern} {el}} {{Greenlandic} {kl}}
+ {{Guarani} {gn}} {{Gujarati} {gu}}
+ {{Haitian} {ht}} {{Haitian Creole} {ht}}
+ {{Hausa} {ha}} {{Hebrew} {he}}
+ {{Herero} {hz}} {{Hindi} {hi}}
+ {{Hiri Motu} {ho}} {{Hungarian} {hu}}
+ {{Icelandic} {is}} {{Ido} {io}}
+ {{Igbo} {ig}} {{Indonesian} {id}}
+ {{Interlingue} {ie}} {{Inuktitut} {iu}}
+ {{Inupiaq} {ik}} {{Irish} {ga}}
+ {{Italian} {it}} {{Japanese} {ja}}
+ {{Javanese} {jv}} {{Kalaallisut} {kl}}
+ {{Kannada} {kn}} {{Kanuri} {kr}}
+ {{Kashmiri} {ks}} {{Kazakh} {kk}}
+ {{Kikuyu} {ki}} {{Kinyarwanda} {rw}}
+ {{Kirghiz} {ky}} {{Komi} {kv}}
+ {{Kongo} {kg}} {{Korean} {ko}}
+ {{Kuanyama} {kj}} {{Kurdish} {ku}}
+ {{Kwanyama} {kj}} {{Kyrgyz} {ky}}
+ {{Lao} {lo}} {{Latin} {la}}
+ {{Latvian} {lv}} {{Letzeburgesch} {lb}}
+ {{Limburgan} {li}} {{Limburger} {li}}
+ {{Limburgish} {li}} {{Lingala} {ln}}
+ {{Lithuanian} {lt}} {{Luba-Katanga} {lu}}
+ {{Luxembourgish} {lb}} {{Macedonian} {mk}}
+ {{Malagasy} {mg}} {{Malay} {ms}}
+ {{Malayalam} {ml}} {{Maldivian} {dv}}
+ {{Maltese} {mt}} {{Manx} {gv}}
+ {{Maori} {mi}} {{Marathi} {mr}}
+ {{Marshallese} {mh}} {{Moldavian} {ro}}
+ {{Moldovan} {ro}} {{Mongolian} {mn}}
+ {{Nauru} {na}} {{Navaho} {nv}}
+ {{Navajo} {nv}} {{Ndebele, North} {nd}}
+ {{Ndebele, South} {nr}} {{Ndonga} {ng}}
+ {{Nepali} {ne}} {{North Ndebele} {nd}}
+ {{Northern Sami} {se}} {{Norwegian} {no}}
+ {{Norwegian Bokmål} {nb}} {{Norwegian Nynorsk} {nn}}
+ {{Nuosu} {ii}} {{Nyanja} {ny}}
+ {{Nynorsk, Norwegian} {nn}} {{Occidental} {ie}}
+ {{Occitan} {oc}} {{Ojibwa} {oj}}
+ {{Old Bulgarian} {cu}} {{Old Church Slavonic} {cu}}
+ {{Old Slavonic} {cu}} {{Oriya} {or}}
+ {{Oromo} {om}} {{Ossetian} {os}}
+ {{Ossetic} {os}} {{Pali} {pi}}
+ {{Panjabi} {pa}} {{Pashto} {ps}}
+ {{Persian} {fa}} {{Polish} {pl}}
+ {{Portuguese} {pt}} {{Punjabi} {pa}}
+ {{Pushto} {ps}} {{Quechua} {qu}}
+ {{Romanian} {ro}} {{Romansh} {rm}}
+ {{Rundi} {rn}} {{Russian} {ru}}
+ {{Samoan} {sm}} {{Sango} {sg}}
+ {{Sanskrit} {sa}} {{Sardinian} {sc}}
+ {{Scottish Gaelic} {gd}} {{Serbian} {sr}}
+ {{Shona} {sn}} {{Sichuan Yi} {ii}}
+ {{Sindhi} {sd}} {{Sinhala} {si}}
+ {{Sinhalese} {si}} {{Slovak} {sk}}
+ {{Slovenian} {sl}} {{Somali} {so}}
+ {{Sotho, Southern} {st}} {{South Ndebele} {nr}}
+ {{Spanish} {es}} {{Sundanese} {su}}
+ {{Swahili} {sw}} {{Swati} {ss}}
+ {{Swedish} {sv}} {{Tagalog} {tl}}
+ {{Tahitian} {ty}} {{Tajik} {tg}}
+ {{Tamil} {ta}} {{Tatar} {tt}}
+ {{Telugu} {te}} {{Thai} {th}}
+ {{Tibetan} {bo}} {{Tigrinya} {ti}}
+ {{Tonga} {to}} {{Tsonga} {ts}}
+ {{Tswana} {tn}} {{Turkish} {tr}}
+ {{Turkmen} {tk}} {{Twi} {tw}}
+ {{Uighur} {ug}} {{Ukrainian} {uk}}
+ {{Urdu} {ur}} {{Uyghur} {ug}}
+ {{Uzbek} {uz}} {{Valencian} {ca}}
+ {{Venda} {ve}} {{Vietnamese} {vi}}
+ {{Volapük} {vo}} {{Walloon} {wa}}
+ {{Welsh} {cy}} {{Western Frisian} {fy}}
+ {{Wolof} {wo}} {{Xhosa} {xh}}
+ {{Yiddish} {yi}} {{Yoruba} {yo}}
+ {{Zhuang} {za}} {{Zulu} {zu}}
+}
+
+## List: Country codes with names of their flags file in directory ``${::ROOT_DIRNAME}/icons/flag/''
+ # Format:
+ # {
+ # { Country_Name Country_Code Flag_File_Name_Without_Extension }
+ # ...
+ # }
+common COUNTRY_CODES_AND_FLAGS {
+ {{Afghanistan} AF Afghanistan}
+ {{Åland Islands} AX {}}
+ {{Albania} AL Albania}
+ {{Algeria} DZ Algeria}
+ {{American Samoa} AS American_Samoa}
+ {{Andorra} AD Andorra}
+ {{Angola} AO Angola}
+ {{Anguilla} AI Anguilla}
+ {{Antarctica} AQ {}}
+ {{Antigua And Barbuda} AG Antigua_and_Barbuda}
+ {{Argentina} AR Argentina}
+ {{Armenia} AM Armenia}
+ {{Aruba} AW Aruba}
+ {{Australia} AU Australia}
+ {{Austria} AT Austria}
+ {{Azerbaijan} AZ Azerbaijan}
+
+ {{Bahamas} BS Bahamas}
+ {{Bahrain} BH Bahrain}
+ {{Bangladesh} BD Bangladesh}
+ {{Barbados} BB Barbados}
+ {{Belarus} BY Belarus}
+ {{Belgium} BE Belgium}
+ {{Belize} BZ Belize}
+ {{Benin} BJ Benin}
+ {{Bermuda} BM Bermuda}
+ {{Bhutan} BT Bhutan}
+ {{Bolivia, Plurinational State Of} BO Bolivia}
+ {{Bosnia And Herzegovina} BA Bosnia}
+ {{Botswana} BW Botswana}
+ {{Bouvet Island} BV {}}
+ {{Brazil} BR Brazil}
+ {{British Indian Ocean Territory} IO {}}
+ {{Brunei Darussalam} BN Brunei}
+ {{Bulgaria} BG Bulgaria}
+ {{Burkina Faso} BF Burkina_Faso}
+ {{Burundi} BI Burundi}
+
+ {{Cambodia} KH Cambodia}
+ {{Cameroon} CM Cameroon}
+ {{Canada} CA Canada}
+ {{Cape Verde} CV Cape_Verde}
+ {{Cayman Islands} KY Cayman_Islands}
+ {{Central African Republic} CF Central_African_Republic}
+ {{Chad} TD Chad}
+ {{Chile} CL Chile}
+ {{China} CN China}
+ {{Christmas Island} CX Christmas_Island}
+ {{Cocos (Keeling) Islands} CC {}}
+ {{Colombia} CO Colombia}
+ {{Comoros} KM Comoros}
+ {{Congo} CG Republic_of_the_Congo}
+ {{Congo, The Democratic Republic Of The} CD Democratic_Republic_of_the_Congo}
+ {{Cook Islands} CK Cook_Islands}
+ {{Costa Rica} CR Costa_Rica}
+ {{Côte D'Ivoire} CI Cote_dIvoire}
+ {{Croatia} HR Croatia}
+ {{Cuba} CU Cuba}
+ {{Cyprus} CY Cyprus}
+ {{Czech Republic} CZ Czech_Republic}
+
+ {{Denmark} DK Denmark}
+ {{Djibouti} DJ Djibouti}
+ {{Dominica} DM Dominica}
+ {{Dominican Republic} DO Dominican_Republic}
+
+ {{Ecuador} EC Ecuador}
+ {{Egypt} EG Egypt}
+ {{El Salvador} SV El_Salvador}
+ {{Equatorial Guinea} GQ Equatorial_Guinea}
+ {{Eritrea} ER Eritrea}
+ {{Estonia} EE Estonia}
+ {{Ethiopia} ET Ethiopia}
+
+ {{Falkland Islands (Malvinas)} FK Falkland_Islands}
+ {{Faroe Islands} FO Faroe_Islands}
+ {{Fiji} FJ Fiji}
+ {{Finland} FI Finland}
+ {{France} FR France}
+ {{French Guiana} GF {}}
+ {{French Polynesia} PF French_Polynesia}
+ {{French Southern Territories} TF {}}
+
+ {{Gabon} GA Gabon}
+ {{Gambia} GM Gambia}
+ {{Georgia} GE Georgia}
+ {{Germany} DE Germany}
+ {{Ghana} GH Ghana}
+ {{Gibraltar} GI Gibraltar}
+ {{Greece} GR Greece}
+ {{Greenland} GL Greenland}
+ {{Grenada} GD Grenada}
+ {{Guadeloupe} GP {}}
+ {{Guam} GU Guam}
+ {{Guatemala} GT Guatemala}
+ {{Guernsey} GG {}}
+ {{Guinea} GN Guinea}
+ {{Guinea-Bissau} GW Guinea_Bissau}
+ {{Guyana} GY Guyana}
+
+ {{Haiti} HT Haiti}
+ {{Heard Island And Mcdonald Islands} HM {}}
+ {{Holy See (Vatican City State)} VA {}}
+ {{Honduras} HN Honduras}
+ {{Hong Kong} HK Hong_Kong}
+ {{Hungary} HU Hungary}
+
+ {{Iceland} IS Iceland}
+ {{India} IN India}
+ {{Indonesia} ID Indonesia}
+ {{Iran, Islamic Republic Of} IR Iran}
+ {{Iraq} IQ Iraq}
+ {{Ireland} IE Ireland}
+ {{Isle Of Man} IM {}}
+ {{Israel} IL Israel}
+ {{Italy} IT Italy}
+
+ {{Jamaica} JM Jamaica}
+ {{Japan} JP Japan}
+ {{Jersey} JE {}}
+ {{Jordan} JO Jordan}
+
+ {{Kazakhstan} KZ Kazakhstan}
+ {{Kenya} KE Kenya}
+ {{Kiribati} KI Kiribati}
+ {{Korea, Democratic People'S Republic Of} KP North_Korea}
+ {{Korea, Republic Of} KR South_Korea}
+ {{Kuwait} KW Kuwait}
+ {{Kyrgyzstan} KG Kyrgyzstan}
+
+ {{Lao People'S Democratic Republic} LA Laos}
+ {{Latvia} LV Latvia}
+ {{Lebanon} LB Lebanon}
+ {{Lesotho} LS Lesotho}
+ {{Liberia} LR Liberia}
+ {{Libyan Arab Jamahiriya} LY Libya}
+ {{Liechtenstein} LI Liechtenstein}
+ {{Lithuania} LT Lithuania}
+ {{Luxembourg} LU Luxembourg}
+
+ {{Macao} MO Macao}
+ {{Macedonia, The Former Yugoslav Republic Of} MK Macedonia}
+ {{Madagascar} MG Madagascar}
+ {{Malawi} MW Malawi}
+ {{Malaysia} MY Malaysia}
+ {{Maldives} MV Maldives}
+ {{Mali} ML Mali}
+ {{Malta} MT Malta}
+ {{Marshall Islands} MH Marshall_Islands}
+ {{Martinique} MQ Martinique}
+ {{Mauritania} MR Mauritania}
+ {{Mauritius} MU Mauritius}
+ {{Mayotte} YT {}}
+ {{Mexico} MX Mexico}
+ {{Micronesia, Federated States Of} FM Micronesia}
+ {{Moldova, Republic Of} MD Moldova}
+ {{Monaco} MC Monaco}
+ {{Mongolia} MN Mongolia}
+ {{Montenegro} ME {}}
+ {{Montserrat} MS Montserrat}
+ {{Morocco} MA Morocco}
+ {{Mozambique} MZ Mozambique}
+ {{Myanmar} MM Myanmar}
+
+ {{Namibia} NA Namibia}
+ {{Nauru} NR Nauru}
+ {{Nepal} NP Nepal}
+ {{Netherlands} NL Netherlands}
+ {{Netherlands Antilles} AN Netherlands_Antilles}
+ {{New Caledonia} NC {}}
+ {{New Zealand} NZ New_Zealand}
+ {{Nicaragua} NI Nicaragua}
+ {{Niger} NE Niger}
+ {{Nigeria} NG Nigeria}
+ {{Niue} NU Niue}
+ {{Norfolk Island} NF Norfolk_Island}
+ {{Northern Mariana Islands} MP {}}
+ {{Norway} NO Norway}
+
+ {{Oman} OM Oman}
+
+ {{Pakistan} PK Pakistan}
+ {{Palau} PW Palau}
+ {{Palestinian Territory, Occupied} PS {}}
+ {{Panama} PA Panama}
+ {{Papua New Guinea} PG Papua_New_Guinea}
+ {{Paraguay} PY Paraguay}
+ {{Peru} PE Peru}
+ {{Philippines} PH Philippines}
+ {{Pitcairn} PN Pitcairn_Islands}
+ {{Poland} PL Poland}
+ {{Portugal} PT Portugal}
+ {{Puerto Rico} PR Puerto_Rico}
+
+ {{Qatar} QA Qatar}
+
+ {{Réunion} RE {}}
+ {{Romania} RO Romania}
+ {{Russian Federation} RU Russian_Federation}
+ {{Rwanda} RW Rwanda}
+
+ {{Saint Barthélemy} BL {}}
+ {{Saint Helena, Ascension And Tristan Da Cunha} SH {}}
+ {{Saint Kitts And Nevis} KN Saint_Kitts_and_Nevis}
+ {{Saint Lucia} LC Saint_Lucia}
+ {{Saint Martin} MF {}}
+ {{Saint Pierre And Miquelon} PM Saint_Pierre}
+ {{Saint Vincent And The Grenadines} VC Saint_Vicent_and_the_Grenadines}
+ {{Samoa} WS Samoa}
+ {{San Marino} SM San_Marino}
+ {{Sao Tome And Principe} ST Sao_Tome_and_Principe}
+ {{Saudi Arabia} SA Saudi_Arabia}
+ {{Senegal} SN Senegal}
+ {{Serbia} RS {}}
+ {{Seychelles} SC Seychelles}
+ {{Sierra Leone} SL Sierra_Leone}
+ {{Singapore} SG Singapore}
+ {{Slovakia} SK Slovakia}
+ {{Slovenia} SI Slovenia}
+ {{Solomon Islands} SB Soloman_Islands}
+ {{Somalia} SO Somalia}
+ {{South Africa} ZA South_Africa}
+ {{South Georgia And The South Sandwich Islands} GS South_Georgia}
+ {{Spain} ES Spain}
+ {{Sri Lanka} LK Sri_Lanka}
+ {{Sudan} SD Sudan}
+ {{Suriname} SR Suriname}
+ {{Svalbard And Jan Mayen} SJ {}}
+ {{Swaziland} SZ Swaziland}
+ {{Sweden} SE Sweden}
+ {{Switzerland} CH Switzerland}
+ {{Syrian Arab Republic} SY Syria}
+
+ {{Taiwan, Province Of China} TW Taiwan}
+ {{Tajikistan} TJ Tajikistan}
+ {{Tanzania, United Republic Of} TZ Tanzania}
+ {{Thailand} TH Thailand}
+ {{Timor-Leste} TL Timor-Leste}
+ {{Togo} TG Togo}
+ {{Tokelau} TK {}}
+ {{Tonga} TO Tonga}
+ {{Trinidad And Tobago} TT Trinidad_and_Tobago}
+ {{Tunisia} TN Tunisia}
+ {{Turkey} TR Turkey}
+ {{Turkmenistan} TM Turkmenistan}
+ {{Turks And Caicos Islands} TC Turks_and_Caicos_Islands}
+ {{Tuvalu} TV Tuvalu}
+
+ {{Uganda} UG Uganda}
+ {{Ukraine} UA Ukraine}
+ {{United Arab Emirates} AE UAE}
+ {{United Kingdom} GB United_Kingdom}
+ {{United States} US United_States_of_America}
+ {{United States Minor Outlying Islands} UM {}}
+ {{Uruguay} UY Uruguay}
+ {{Uzbekistan} UZ Uzbekistan}
+
+ {{Vanuatu} VU Vanuatu}
+ {{Vatican City State} VA Vatican_City}
+ {{Venezuela, Bolivarian Republic Of} VE Venezuela}
+ {{Viet Nam} VN Vietnam}
+ {{Virgin Islands, British} VG British_Virgin_Islands}
+ {{Virgin Islands, U.S.} VI US_Virgin_Islands}
+
+ {{Wallis And Futuna} WF Wallis_and_Futuna}
+ {{Western Sahara} EH {}}
+
+ {{Yemen} YE Yemen}
+ {{Zambia} ZM Zambia}
+ {{Zimbabwe} ZW Zimbabwe}
+}
+
+## Kill spell checker and its support processes
+ # @return void
+proc kill_spellchecker_process {} {
+ # Reset some class variables
+ set ::Editor::spellchecker_RAP_ID {}
+ set ::Editor::spellchecker_command_LIFO [list]
+
+ # Abort if the spell checker process is not running
+ if {${::Editor::spellchecker_process_pid} == {}} {
+ return
+ }
+
+ # Kill the spell checker and its support processes
+ foreach pid ${::Editor::spellchecker_process_pid} {
+ if {$pid == [pid] || $pid == 0} {
+ continue
+ }
+ catch {
+ exec -- kill $pid 2>/dev/null
+ }
+ }
+ set ::Editor::spellchecker_process_pid {}
+}
+
+## Restart the spell checker process with new new configuration
+ # @return void
+proc restart_spellchecker_process {} {
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ kill_spellchecker_process
+
+ if {[lsearch -ascii -exact ${::Editor::available_dictionaries} ${::Editor::spellchecker_dictionary}] == -1} {
+ set ::Editor::spellchecker_enabled 0
+ set ::Editor::spellchecker_dictionary {}
+ } else {
+ start_spellchecker_process
+ wait_for_spellchecker_process
+ }
+}
+
+## Start the spell checker (Hunspell) and its support processes
+ # @return void
+proc start_spellchecker_process {} {
+ # Abort if either the feature is disabled or the Hunspell is not available
+ if {!${::Editor::spellchecker_enabled} || !${::PROGRAM_AVAILABLE(hunspell)}} {
+ return
+ }
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ # Start watch dog timer
+ set ::Editor::spellchecker_start_timer [after 10000 {
+ set ::Editor::spellchecker_start_failed 1
+ set ::Editor::spellchecker_started_flag 1
+ }]
+
+ # Attempt to start the processes
+ if {[catch {
+ set ::Editor::spellchecker_process_pid [exec -- \
+ tclsh ${::LIB_DIRNAME}/receive_and_print.tcl \
+ [tk appname] \
+ ::Editor::set_spellchecker_RAP_ID \
+ | hunspell \
+ -a \
+ -i utf8 \
+ -d ${::Editor::spellchecker_dictionary} \
+ | tclsh ${::LIB_DIRNAME}/external_command.tcl \
+ [tk appname] \
+ ::Editor::spellchecker_exit_callback \
+ ::Editor::spellchecker_receive_response \
+ & \
+ ]
+ }]} then {
+ # FAILURE
+ set ::Editor::spellchecker_start_failed 1
+ set ::Editor::spellchecker_started_flag 1
+ }
+}
+
+## Wait until the spell checker (Hunspell) and its support processes are started
+ # @return void
+proc wait_for_spellchecker_process {} {
+ # Abort if either the feature is disabled or the Hunspell is not available
+ if {!${::Editor::spellchecker_enabled} || !${::PROGRAM_AVAILABLE(hunspell)}} {
+ return
+ }
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ # Wait until the spell checker (Hunspell) and its support processes are started
+ vwait ::Editor::spellchecker_started_flag
+ unset ::Editor::spellchecker_started_flag
+
+ # Stop the watch dog timer
+ catch {
+ after cancel ${::Editor::spellchecker_start_timer}
+ }
+
+ # Handle spellchecker start-up failure
+ if {${::Editor::spellchecker_start_failed}} {
+ # Set some class variables
+ set ::Editor::spellchecker_RAP_ID {}
+ set ::Editor::spellchecker_enabled 0
+ set ::Editor::spellchecker_start_failed 0
+
+ # Destroy the splash screen if displayed
+ if {[winfo exists .splash]} {
+ destroy .splash
+ }
+
+ # Display graphical error message
+ tk_messageBox \
+ -parent . \
+ -type ok \
+ -icon error \
+ -title [mc "Hunspell error"] \
+ -message [mc "Unable to start the spell checker. Please try to re-install the hunspell. Spell checking function will not be available"]
+ }
+}
+
+## Receive the identifier for IPC with the RAP
+ # @parm String id - Appname of the receive_and_print process
+ # @return void
+proc set_spellchecker_RAP_ID {id} {
+ set ::Editor::spellchecker_RAP_ID $id
+}
+
+## Handle Hunspell process termination
+ #
+ # It is assumed that the process terminates only on some error condition or
+ # on an explicit request for termination. Aim of this method is attempt to
+ # restart the Hunspell process and its support processes if it crashed for any
+ # reason.
+ #
+ # @parm List args - Anything, it doesn't matter
+ # @return void
+proc spellchecker_exit_callback {args} {
+ # Abort if the termination was intentional
+ if {${::Editor::spellchecker_RAP_ID} == {}} {
+ return
+ }
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ set ::Editor::spellchecker_RAP_ID {}
+ puts stderr "Spell checker process exited -- attempting to restart"
+
+ # Attempt to restart
+ incr ::Editor::spellchecker_attempts_to_restart
+ if {${::Editor::spellchecker_attempts_to_restart} < 10} {
+ start_spellchecker_process
+ } else {
+ puts stderr "Attempt to restart failed, to many attempts -- aborting"
+ set spellchecker_attempts_to_restart 0
+ }
+}
+
+## Receive response from the Hunspell
+ # @parm List args - One line of the response
+ # @return void
+proc spellchecker_receive_response {args} {
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ # We are interested only in the first field of the response
+ set response [string trim [lindex $args 0]]
+
+ # Handle the initial response (sent once the Hunspell is started)
+ if {[lindex $response 0] == {@(#)}} {
+ set spellchecker_command_LIFO [list]
+ set ::Editor::spellchecker_started_flag 1
+ return
+ }
+
+ # Decide what to do with the response
+ switch -- $response {
+ {} { ;# Empty response -- means nothing
+ }
+ {*} { ;# Word is correct
+ catch {
+ eval [lindex $spellchecker_command_LIFO {0 0}]
+ }
+ set spellchecker_command_LIFO [lreplace $spellchecker_command_LIFO 0 0]
+ }
+ default { ;# Everything else
+ catch {
+ eval [lindex $spellchecker_command_LIFO {0 1}]
+ }
+ set spellchecker_command_LIFO [lreplace $spellchecker_command_LIFO 0 0]
+ }
+ }
+}
+
+## Send a word to the Hunspell process for evaluation
+ # @parm String word - Work to check for correct spelling
+ # @parm String wrong_command = {} - Command to execute here if the word is badly spelled
+ # @parm String correct_command = {} - Command to execute here if the word is correctly spelled
+ # @return void
+proc spellchecker_check_word {word {wrong_command {}} {correct_command {}}} {
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ # Abort if receive and print process has not been initialized
+ if {${::Editor::spellchecker_RAP_ID} == {}} {
+ return
+ }
+
+ # Append command to their queue
+ lappend spellchecker_command_LIFO [list $correct_command $wrong_command]
+
+ # Send the word to the Hunspell process
+ if {!${::MICROSOFT_WINDOWS}} {
+ ::X::secure_send ${::Editor::spellchecker_RAP_ID} print_line "{$word}"
+ } else {
+ dde eval ${::Editor::spellchecker_RAP_ID} print_line "{$word}"
+ }
+}
+
+## Refresh list of available spell checker dictionaries (refresh in GUI)
+ # @return void
+proc refresh_available_dictionaries {} {
+ # Abort if the Hunspell program is not available
+ if {!${::PROGRAM_AVAILABLE(hunspell)}} {
+ return
+ }
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ # Set widget descriptor for the dictionary selection menu
+ set m {.spell_checker_conf_menu}
+
+ # Destroy the dictionary selection menu if it exists
+ if {[winfo exists $m]} {
+ destroy $m
+ }
+
+ # Create new dictionary selection menu
+ menu $m ;# Main part
+ menu $m.by_country ;# Cascade "Set dictionary by country"
+ menu $m.by_language ;# Cascade "Set dictionary by language"
+
+ # Define contents of the newly created menu
+ $m add command \
+ -label [mc "Refresh list of dictionaries"] \
+ -image ::ICONS::16::reload \
+ -compound left \
+ -command {
+ ::Editor::refresh_available_dictionaries
+ ::Editor::adjust_spell_checker_config_button
+ }
+ $m add command \
+ -label [mc "Turn off spell checking"] \
+ -image ::ICONS::16::exit \
+ -compound left \
+ -command {::Editor::switch_SC_dictionary {}}
+ $m add separator
+ $m add cascade \
+ -label [mc "Set dictionary by language"] \
+ -menu $m.by_language
+ $m add cascade \
+ -label [mc "Set dictionary by country"] \
+ -menu $m.by_country
+
+ ## Get list of available Hunspell dictionaries
+ set ::Editor::available_dictionaries [list]
+ # Start watchdog timer for the Hunspell process
+ set spellchecker_start_timer [after 10000 {
+ catch {
+ close ${::Editor::hunspell_process}
+ }
+ }]
+ if {[catch {
+ # Run Hunspell in a mode in which it prints available dictionaries
+ if {!${::MICROSOFT_WINDOWS}} {
+ set hunspell_process [open {| /bin/sh -c "hunspell -D 2>&1 | awk '{print(\$0)} /^LOADED DICTIONARY/ {exit 0}' || exit 1"} "r"]
+ } else {
+ puts stderr "Sorry, this feature is not implemented on MS Windows yet."
+ error "Not available on Windows."
+ }
+
+ }]} then {
+ # Error condition
+ puts stderr "Unable to start the Hunspell process"
+
+ } else {
+ # Bool: Accept this line of output from the process
+ set accept_flag 0
+
+ # Read list of dictionaries (file names along with pats)
+ while {![eof $hunspell_process]} {
+ # Read line from the process
+ set line [gets $hunspell_process]
+
+ # Ignore everything besides section ``AVAILABLE DICTIONARIES''
+ if {![string first {AVAILABLE DICTIONARIES} $line]} {
+ set accept_flag 1
+ continue
+ } elseif {![string first {LOADED DICTIONARY:} $line]} {
+ break
+ } elseif {!$accept_flag} {
+ continue
+ }
+
+ # Determinate language code and country code and append it to the
+ #+ list of available dictionaries
+ set line [lindex [split $line [file separator]] end]
+ set line [split $line {_}]
+ if {[lindex $line 0] == {hyph}} {
+ continue
+# set line [lreplace $line 0 0]
+ }
+ if {![string length [lindex $line 0]] || ![string length [lindex $line 1]]} {
+ continue
+ }
+ if {![string is alpha [lindex $line 0]] || ![string is alpha [lindex $line 1]]} {
+ continue
+ }
+ set dictionary [string tolower [lindex $line 0]]_[string toupper [lindex $line 1]]
+ if {[lsearch -ascii -exact ${::Editor::available_dictionaries} $dictionary] == -1} {
+ lappend ::Editor::available_dictionaries $dictionary
+ }
+ }
+ }
+
+ # Cancel the watchdog timer
+ catch {
+ after cancel $spellchecker_start_timer
+ }
+
+ # If there are no dictionaries available to use then abort right away
+ if {![llength ${::Editor::available_dictionaries}]} {
+ return
+ }
+
+
+ ## Enrich the gained list with some additional information
+ #
+ # Format of the resulting list:
+ # {
+ # {Language_code Country_code Country_name Language_name Flag_icon}
+ # ...
+ # }
+ set available_dictionaries_complex [list]
+ foreach dictionary ${::Editor::available_dictionaries} {
+ # Determinate language code and country code
+ set dictionary [split $dictionary {_}] ;# List: Language and country codes, e.g. {en GB}
+ set language_code [lindex $dictionary 0] ;# String: Language code, e.g. "en"
+ set country_code [lindex $dictionary 1] ;# String: County code, e.g. "GB"
+ set country_and_flag {} ;# List: Country name and flag icon name, e.g. {"United Kingdom" United_Kingdom}
+ set country_name {} ;# String: Country name, e.g. "United Kingdom"
+ set flag_icon {} ;# String: Flag icon name, e.g. "United_Kingdom"
+ set language_name {} ;# String: Language name, e.g. "English"
+
+ # Determinate country name and flag file name
+ set idx [lsearch -ascii -exact -index 1 ${::Editor::COUNTRY_CODES_AND_FLAGS} $country_code]
+ if {$idx != -1} {
+ set country_and_flag [lindex ${::Editor::COUNTRY_CODES_AND_FLAGS} $idx]
+ set country_name [lindex $country_and_flag 0]
+ set flag_icon [lindex $country_and_flag 2]
+ } else {
+ set country_name $country_code
+ }
+ if {$flag_icon == {}} {
+ set flag_icon {empty}
+ }
+
+ # Determinate language name
+ set idx [lsearch -ascii -exact -index 1 ${::Editor::LANGUAGE_CODES_AND_NAMES} $language_code]
+ if {$idx != -1} {
+ set language_name [lindex ${::Editor::LANGUAGE_CODES_AND_NAMES} [list $idx 0]]
+ } else {
+ set language_name $language_code
+ }
+
+ if {$country_name == {}} {
+ set country_name {???}
+ }
+ if {$language_name == {}} {
+ set language_name {???}
+ }
+
+ # Append item to the resulting list
+ lappend available_dictionaries_complex [list $language_code $country_code [mc $country_name] [mc $language_name] $flag_icon]
+ }
+
+ # Generate content of the "Set by country" menu
+ set local_menu {}
+ set capital_leter {}
+ set last_capital_leter {}
+ foreach dictionary [lsort -dictionary -index 2 [lsort -dictionary -index 3 $available_dictionaries_complex]] {
+ # Gain some facts about the dictionary file
+ set language_code [lindex $dictionary 0]
+ set country_code [lindex $dictionary 1]
+ set country_name [lindex $dictionary 2]
+ set language_name [lindex $dictionary 3]
+ set flag_icon [lindex $dictionary 4]
+
+ # Create sub-menu if necessary
+ set capital_leter [string toupper [string index $country_name 0]]
+
+ if {$capital_leter != $last_capital_leter} {
+ set last_capital_leter $capital_leter
+ set local_menu [menu $m.by_country.m_[string tolower $capital_leter]]
+ $m.by_country add cascade -label "$capital_leter ..." -menu $local_menu
+ }
+
+ # Create the menu item
+ $local_menu add command \
+ -command "::Editor::switch_SC_dictionary {${language_code}_${country_code}}" \
+ -label "$country_name ($language_name)" \
+ -image ::ICONS::flag::$flag_icon \
+ -compound left
+ }
+
+ # Generate content of the "Set by language" menu
+ set local_menu {}
+ set capital_leter {}
+ set last_capital_leter {}
+ foreach dictionary [lsort -dictionary -index 3 [lsort -dictionary -index 2 $available_dictionaries_complex]] {
+ # Gain some facts about the dictionary file
+ set language_code [lindex $dictionary 0]
+ set country_code [lindex $dictionary 1]
+ set country_name [lindex $dictionary 2]
+ set language_name [lindex $dictionary 3]
+ set flag_icon [lindex $dictionary 4]
+
+ # Create sub-menu if necessary
+ set capital_leter [string toupper [string index $language_name 0]]
+ if {$capital_leter != $last_capital_leter} {
+ set last_capital_leter $capital_leter
+ set local_menu [menu $m.by_language.m_[string tolower $capital_leter]]
+ $m.by_language add cascade -label "$capital_leter ..." -menu $local_menu
+ }
+
+ # Create the menu item
+ $local_menu add command \
+ -command "::Editor::switch_SC_dictionary {${language_code}_${country_code}}" \
+ -label "$language_name ($country_name)" \
+ -image ::ICONS::flag::$flag_icon \
+ -compound left
+ }
+}
+
+## Switch current dictionary
+ # @parm String dictionary - Dictionary name like: ``en_GB'' or ``en_AU''
+ # @return void
+proc switch_SC_dictionary {dictionary} {
+ # Abort if the Hunspell program is not available
+ if {!${::PROGRAM_AVAILABLE(hunspell)}} {
+ return
+ }
+
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ # Chech whether the requested dictionary is available
+ if {[lsearch -ascii -exact ${::Editor::available_dictionaries} $dictionary] == -1} {
+ set dictionary {}
+ }
+
+ # Empty dictionary name means disable the feature
+ if {[string length $dictionary]} {
+ set ::Editor::spellchecker_enabled 1
+ } else {
+ set ::Editor::spellchecker_enabled 0
+ }
+
+ # Adjust configuration button
+ .statusbarSB configure \
+ -image ::ICONS::16::player_time \
+ -text "<>"
+
+ # Clear spell checker's tags in all text editors
+ foreach project ${::X::openedProjects} {
+ foreach editor [$project cget -editors] {
+ $editor spellchecker_clear_tags
+ }
+ }
+
+ # Switch the dictionary
+ set ::Editor::spellchecker_dictionary $dictionary
+ restart_spellchecker_process
+ adjust_spell_checker_config_button
+
+ # Refresh all editors
+ foreach project ${::X::openedProjects} {
+ foreach editor [$project cget -editors] {
+ $editor parseAll
+ }
+ }
+}
+
+## Adjust spell checker configuration button to current spell checker configuration
+ # @return void
+proc adjust_spell_checker_config_button {} {
+ # Abort if the Hunspell program is not available
+ if {!${::PROGRAM_AVAILABLE(hunspell)}} {
+ return
+ }
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ # Spell checker configuration menu
+ set m {.spell_checker_conf_menu}
+
+ ## Spell checker is DISABLED
+ if {!$::Editor::spellchecker_enabled} {
+ $m entryconfigure [mc "Turn off spell checking"] -state disabled
+ .statusbarSB configure \
+ -image ::ICONS::flag::empty \
+ -text "none"
+
+ ## Spell checker is ENABLED
+ } else {
+ $m entryconfigure [mc "Turn off spell checking"] -state normal
+
+ set c_l [split ${::Editor::spellchecker_dictionary} {_}]
+ set idx [lsearch -ascii -exact -index 1 ${::Editor::COUNTRY_CODES_AND_FLAGS} [lindex $c_l 1]]
+ if {$idx != -1} {
+ set flag_icon [lindex ${::Editor::COUNTRY_CODES_AND_FLAGS} [list $idx 2]]
+ } else {
+ set flag_icon {empty}
+ }
+
+ .statusbarSB configure \
+ -image ::ICONS::flag::$flag_icon \
+ -text [lindex $c_l 0]
+ }
+}
+
+## By calling this method we mark the target line as something which is a subject for a change
+ # Purpose is to handle insertions of single characters and deletions of single characters
+ # @note This method inhibits method spellcheck_check_all until spellcheck_change_detected_post is called
+ # @see spellcheck_change_detected_post
+ # @parm Int line_number = {} - Number of the target line, {} means the current line
+ # @return void
+private method spellcheck_change_detected_pre {{line_number {}}} {
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ # Abort conditions
+ if {!$spellchecker_enabled || !${::PROGRAM_AVAILABLE(hunspell)}} {
+ return
+ }
+
+ # Inhibit method spellcheck_check_all until spellcheck_change_detected_post is called
+ set spellcheck_lock 1
+
+ # Adjust parameters
+ if {$line_number == {}} {
+ set line_number [expr {int([$editor index insert])}]
+ }
+
+ # Store the target line
+ set spellcheck_line_number $line_number
+ set spellcheck_line_pre [$editor get [list $line_number.0 linestart] [list $line_number.0 lineend]]
+}
+
+## By calling this method we finalize the process started by calling to method spellcheck_change_detected_pre
+ # Purpose is to handle insertions of single characters and deletions of single characters
+ # @see spellcheck_change_detected_pre
+ # @parm Int line_number = {} - Number of the target line, {} means the current line
+ # @return void
+private method spellcheck_change_detected_post {{line_number {}}} {
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ # Abort conditions
+ if {!$spellchecker_enabled || !${::PROGRAM_AVAILABLE(hunspell)}} {
+ return
+ }
+
+ # cancel the inhibition of method spellcheck_check_all
+ set spellcheck_lock 0
+
+ # Adjust parameters
+ if {$line_number == {}} {
+ set line_number [expr {int([$editor index insert])}]
+ }
+
+ # Determinate ranges of text indexes delimiting strings to check for spelling
+ if {$prog_language == -1} {
+ set target_ranges [list [list $line_number.0 [$editor index [list $line_number.0 lineend]]]]
+ } else {
+ set target_ranges [list]
+ set range [list $line_number.0 $line_number.0]
+ while {1} {
+ set range [concat \
+ [$editor tag nextrange tag_comment [lindex $range 1] [list $line_number.0 lineend]] \
+ [$editor tag nextrange tag_c_comment [lindex $range 1] [list $line_number.0 lineend]] \
+ [$editor tag nextrange tag_c_dox_comment [lindex $range 1] [list $line_number.0 lineend]] \
+ ]
+
+ if {![llength $range]} {
+ break
+ }
+
+ lappend target_ranges $range
+ }
+ }
+
+ # Gain entire line from the editor
+ set line [$editor get [list $line_number.0 linestart] [list $line_number.0 lineend]]
+
+ if {[string length $line] > [string length $spellcheck_line_pre]} {
+ set new_longer_that_org 1
+ } else {
+ set new_longer_that_org 0
+ }
+
+ # Compare the line to its previous content and check changed word(s)
+ set fixed_shift 0 ;# Total pre string shift from all cycles
+ set force_check 0 ;# Enforce spell check of the next word regardless the comparison
+ foreach range $target_ranges {
+ # Determinate start and end column
+ scan [lindex $range 0] {%d.%d} _ start
+ scan [lindex $range 1] {%d.%d} _ end
+
+ set word {} ;# String: Word to check
+ set char {} ;# Char: Character gained from the source line
+ set idx_pre $start ;# Int: Index in $spellcheck_line_pre
+ set word_len 0 ;# Int: Length of the word
+ set skip_word 0 ;# Bool: Flag skip this one word
+ set change_detected 0 ;# Bool: Flag the word was changed
+ set char_next [string index $line $start] ;# Char: Same as char but maybe a little ahead
+
+ # Take into accound shift from previous cycles
+ incr idx_pre $fixed_shift
+
+ for {set idx $start} {$idx < $end} {incr idx; incr idx_pre} {
+ set char $char_next
+ set char_next [string index $line [expr {$idx + 1}]]
+ set char_pre_next [string index $spellcheck_line_pre [expr {$idx_pre + 1}]]
+ set char_pre [string index $spellcheck_line_pre $idx_pre]
+
+ if {[string is alnum $char]} {
+ # If the word contains one or more digits, skip it, digits in a word
+ #+ would cause Hunspell to behave in a way that we don't want here
+ if {[string is digit $char]} {
+ set skip_word 1
+ }
+
+ # Lines are different
+ if {$char_pre != $char} {
+ set change_detected 1
+
+ # Character deleted -- shift the pre string >> 1
+ if {$char_pre_next == $char && !$new_longer_that_org} {
+ incr idx_pre
+ incr fixed_shift
+ # Character inserted -- shift the pre string << 1
+ } elseif {$char_pre == $char_next && $new_longer_that_org} {
+ incr idx_pre -1
+ incr fixed_shift -1
+ }
+
+ # Character appended at the end of the word -- shift the pre string << 1,
+ #+ and check for the next word unconditionally
+ } elseif {
+ [string is alnum $char_pre_next]
+ &&
+ ![string is alnum $char_next]
+ &&
+ $char_pre_next != $char_next
+ } then {
+ incr idx_pre -1
+ incr fixed_shift -1
+ set change_detected 1
+ set force_check 1
+ }
+
+ # Append the character to the word
+ append word $char
+ incr word_len
+
+ # This is not the last character in the line
+ if {$idx < ($end - 1)} {
+ continue
+ # This IS the last character in the line
+ } else {
+ incr idx
+ }
+ }
+
+ # Skip empty words
+ if {!$word_len} {
+ continue
+ }
+
+ # Send the word to the spell checker
+ if {$change_detected && !$skip_word} {
+ set change_detected 0
+ $editor tag remove tag_wrong_spelling $line_number.$idx-${word_len}c-1c $line_number.$idx
+
+ spellchecker_check_word $word \
+ [list $editor tag add tag_wrong_spelling $line_number.$idx-${word_len}c $line_number.$idx] \
+ [list $editor tag remove tag_wrong_spelling $line_number.$idx-${word_len}c $line_number.$idx]
+ }
+
+ # Enforce spell check of the next word regardless the comparison
+ if {$force_check} {
+ set force_check 0
+ set change_detected 1
+ }
+
+ # Reset
+ set word {}
+ set word_len 0
+ set skip_word 0
+ }
+ }
+}
+
+## Check spelling on the specified line
+ #
+ # This method will not perform the task if $spellcheck_line_number is equal to
+ # the given source line, unless the force parameter is set to true.
+ # @note
+ # Spell checking is performed only for comments unless the programming language
+ # is not specified
+ # @parm Int line_number - Number of line to check
+ # @parm Int force = 0 - 1: Force the method to perform the spell check; 2: Force even over $spellcheck_lock
+ # @return void
+public method spellcheck_check_all {line_number {force 0}} {
+ # This function was not yet ported to MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ return
+ }
+
+ # Abort conditions
+ if {($force != 2 && $spellcheck_lock) || !$spellchecker_enabled || !${::PROGRAM_AVAILABLE(hunspell)}} {
+ return
+ }
+ if {!$force && ($spellcheck_line_number != $line_number)} {
+ return
+ }
+ set spellcheck_line_number {}
+
+ # Remove bad spelling tags
+ $editor tag remove tag_wrong_spelling $line_number.0 [list $line_number.0 lineend]
+
+ # Determinate ranges of text indexes delimiting strings to check for spelling
+ if {$prog_language == -1} {
+ set target_ranges [list [list $line_number.0 [$editor index [list $line_number.0 lineend]]]]
+ } else {
+ set target_ranges [list]
+ set range [list $line_number.0 $line_number.0]
+ while {1} {
+ set range [concat \
+ [$editor tag nextrange tag_comment [lindex $range 1] [list $line_number.0 lineend]] \
+ [$editor tag nextrange tag_c_comment [lindex $range 1] [list $line_number.0 lineend]] \
+ [$editor tag nextrange tag_c_dox_comment [lindex $range 1] [list $line_number.0 lineend]] \
+ ]
+
+ if {![llength $range]} {
+ break
+ }
+
+ lappend target_ranges $range
+ }
+ }
+
+ # Gain entire line from the editor
+ set line [$editor get $line_number.0 [list $line_number.0 lineend]]
+
+ # Check spelling for the given ranges
+ foreach range $target_ranges {
+ # Determinate start and end column
+ scan [lindex $range 0] {%d.%d} _ start
+ scan [lindex $range 1] {%d.%d} _ end
+
+ set word {} ;# String: Word to check
+ set char {} ;# Char: Character gained from the source line
+ set word_len 0 ;# Int: Length of the word
+ set skip_word 0 ;# Bool: Flag skip this one word
+
+ # Iterate over characters in the source line
+ for {set idx $start} {$idx < $end} {incr idx} {
+ set char [string index $line $idx]
+
+ if {[string is alnum $char]} {
+ # If the word contains one or more digits, skip it digits in a word
+ #+ would cause Hunspell to behave in a way that we don't want here
+ if {[string is digit $char]} {
+ set skip_word 1
+ }
+
+ # Append the character to the word
+ append word $char
+ incr word_len
+
+ # This is not the last character in the line
+ if {$idx < ($end - 1)} {
+ continue
+ # This IS the last character in the line
+ } else {
+ incr idx
+ }
+ }
+
+ # Skip empty words
+ if {!$word_len} {
+ continue
+ }
+
+ # Send the word to the spell checker
+ if {!$skip_word} {
+ spellchecker_check_word \
+ $word \
+ [list $editor tag add tag_wrong_spelling $line_number.$idx-${word_len}c $line_number.$idx]
+ }
+
+ # Reset
+ set word {}
+ set word_len 0
+ set skip_word 0
+ }
+ }
+}
+
+## Clear all tags marking the misspelled words
+ # @return void
+public method spellchecker_clear_tags {} {
+ $editor tag remove tag_wrong_spelling 0.0 end
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/environment.tcl b/lib/environment.tcl
index 33af4a3..c64f41b 100755..100644
--- a/lib/environment.tcl
+++ b/lib/environment.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 _ENVIRONMENT_TCL ] } {
+set _ENVIRONMENT_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# * Defines some settings and procedures
@@ -40,6 +45,15 @@ if {![X::restore_session]} {
set show_welcome_dialog 1
}
+# Restore spell checker configuration from the last session
+if {${::PROGRAM_AVAILABLE(hunspell)}} {
+ set ::Editor::spellchecker_enabled ${::CONFIG(SPELL_CHECK_ENABLED)}
+ set ::Editor::spellchecker_dictionary ${::CONFIG(SPELL_CHECK_DICTIONARY)}
+} else {
+ set ::Editor::spellchecker_enabled 0
+ set ::Editor::spellchecker_dictionary {}
+}
+
# Some key shortcuts for main window
bind . <Control-Key-1> {manipulate_panel {sim} ; break}
bind . <Control-Key-2> {manipulate_panel {graph} ; break}
@@ -62,6 +76,7 @@ bind . <Control-Key-0> {manipulate_panel {sub} ; break}
# General widget bindings
bind Menu <Button> {+catch {%W configure -cursor left_ptr}}
+bind Text <ButtonPress-1> {+focus %W}
bind Text <Control-d> {}
bind Text <Control-b> {}
bind Text <Control-a> {}
@@ -74,6 +89,7 @@ bind Text <KP_Enter> "[bind Text <Return>]; break"
bind Text <Control-Key-z> {catch {%W edit undo}; break}
bind Text <Control-Key-Z> {catch {%W edit redo}; break}
bind Text <Control-Key-c> {tk_textCopy %W; break}
+bind Text <Control-Key-C> {tk_textCopy %W; break}
bind Text <Control-Key-x> {tk_textCut %W; break}
bind Text <Control-Key-v> {
catch {
@@ -104,19 +120,25 @@ bind Entry <Control-Key-a> {%W selection range 0 end; break}
bind TEntry <Control-Key-a> {%W selection range 0 end; break}
# Dynamic help (Bwidget)
-DynamicHelp::configure -font [font create -size -14 -family {helvetica}] -delay 500 -background {#FFFFDD}
+DynamicHelp::configure -font [font create -size [expr {int(-14 * $::font_size_factor)}] -family {helvetica}] -delay 500 -background {#FFFFDD}
# General purpose fonts
set smallfont_color {#5599DD}
-set smallfont [font create -size -10 -family {helvetica} -weight normal]
-set smallfont_bold [font create -size -10 -family {helvetica} -weight bold]
+set smallfont [font create -size [expr {int(-10 * $::font_size_factor)}] -family {helvetica} -weight normal]
+set smallfont_bold [font create -size [expr {int(-10 * $::font_size_factor)}] -family {helvetica} -weight bold]
# LOAD PROGRAM ICONS
# -----------------------------
-foreach directory {16x16 22x22 32x32} ns {16 22 32} {
+foreach directory {16x16 22x22 32x32 flag} ns {16 22 32 flag} {
namespace eval ::ICONS::${ns} {}
- foreach filename [glob "${::LIB_DIRNAME}/../icons/${directory}/*.png"] {
- set filename [file normalize $filename]
+ if {!$::MICROSOFT_WINDOWS} {
+ # Use glob
+ set list_of_icons [glob "${::ROOT_DIRNAME}/icons/${directory}/*.png"]
+ } else {
+ # Use ZIP Virtual File System (freeWrap)
+ set list_of_icons [zvfs::list "${::ROOT_DIRNAME}/icons/${directory}/*.png"]
+ }
+ foreach filename $list_of_icons {
set iconname [file tail $filename]
regexp {^\w+} $iconname iconname
if {[catch {
@@ -134,45 +156,55 @@ tk appname "mcu8051ide"
wm command . "mcu8051ide $argv"
wm client . [info hostname]
tk scaling 1.0
-tk_setPalette \
- activeBackground {#EEEEEE} \
- foreground {#000000} \
- selectColor {#FFFFFF} \
- activeForeground {#0000DD} \
- highlightBackground {#EEEEEE} \
- selectBackground {#9999BB} \
- background {#EEEEEE} \
- highlightColor {#000000} \
- selectForeground {#FFFFFF} \
- disabledForeground {#888888} \
- insertBackground {#000000} \
- troughColor {#EEEEEE}
+tk_setPalette \
+ activeBackground ${::COMMON_BG_COLOR} \
+ foreground {#000000} \
+ selectColor {#FFFFFF} \
+ activeForeground {#0000DD} \
+ highlightBackground ${::COMMON_BG_COLOR} \
+ selectBackground {#9999BB} \
+ background ${::COMMON_BG_COLOR} \
+ highlightColor {#000000} \
+ selectForeground {#FFFFFF} \
+ disabledForeground {#888888} \
+ insertBackground {#000000} \
+ troughColor ${::COMMON_BG_COLOR}
wm title . "MCU 8051 IDE"
wm state . normal
+wm minsize . 640 480
wm geometry . $::CONFIG(WINDOW_GEOMETRY)
-if {!$::MICROSOFT_WINDOWS} {
- # There is no such thing on Windows OS
- wm attributes . -zoomed $::CONFIG(WINDOW_ZOOMED)
+if {$::CONFIG(WINDOW_ZOOMED)} {
+ if {!$::MICROSOFT_WINDOWS} {
+ wm attributes . -zoomed $::CONFIG(WINDOW_ZOOMED)
+ } else {
+ wm state . zoomed
+
+ # Without this help windows won't work properly on MS Windows
+ after idle {
+ update
+ wm geometry . [wm geometry .]
+ }
+ }
}
wm protocol . WM_DELETE_WINDOW {::X::__exit}
wm iconphoto . ::ICONS::16::mcu8051ide
-. configure -bg {#EEEEEE}
+. configure -bg ${::COMMON_BG_COLOR}
# Dynamic Data Exchange on Microsoft Windows
if {$::MICROSOFT_WINDOWS} {
dde servername -force -- [tk appname]
}
-ttk::style theme use clam
+ttk::style theme use ${::GLOBAL_CONFIG(wstyle)}
# - ttk
set TTK_COMMON_BG {#E0E0E0}
ttk::style configure TFrame \
- -background {#EEEEEE}
+ -background ${::COMMON_BG_COLOR}
ttk::style configure TNotebook \
- -background {#EEEEEE} \
+ -background ${::COMMON_BG_COLOR} \
-fieldbackground {red}
ttk::style map TNotebook \
-background [list \
@@ -181,8 +213,8 @@ ttk::style map TNotebook \
pressed green \
]
-font configure TkTextFont -family {helvetica} -size -12 -weight {normal}
-font configure TkDefaultFont -family {helvetica} -size -12 -weight {normal}
+font configure TkTextFont -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight {normal}
+font configure TkDefaultFont -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight {normal}
ttk::style configure StringNotFound.TEntry \
-fieldbackground {#FFDDDD}
@@ -229,15 +261,16 @@ ttk::style map Simulator_watchdogEntry_2.TEntry \
-foreground [list readonly {#888888}]
ttk::style configure TLabelframe \
- -background {#EEEEEE}
+ -background ${::COMMON_BG_COLOR}
ttk::style configure TLabel \
- -background {#EEEEEE}
+ -background ${::COMMON_BG_COLOR}
ttk::style configure TButton \
-background $TTK_COMMON_BG \
-padding 0
ttk::style configure RedBg.TButton \
- -padding 0
+ -padding 0 \
+ -font [font create -family $::DEFAULT_FIXED_FONT -size -12 -weight {normal}]
ttk::style map RedBg.TButton \
-background [list \
active {#FFBBBB} \
@@ -248,7 +281,8 @@ ttk::style map RedBg.TButton \
!active {#000000} \
]
ttk::style configure GreenBg.TButton \
- -padding 0
+ -padding 0 \
+ -font [font create -family $::DEFAULT_FIXED_FONT -size -12 -weight {normal}]
ttk::style map GreenBg.TButton \
-background [list \
active {#BBFFBB} \
@@ -259,26 +293,26 @@ ttk::style map GreenBg.TButton \
!active {#000000} \
]
-ttk::style configure Flat.TButton \
- -background {#EEEEEE} \
- -padding 0 \
- -borderwidth 1 \
+ttk::style configure Flat.TButton \
+ -background ${::COMMON_BG_COLOR} \
+ -padding 0 \
+ -borderwidth 1 \
-relief flat
ttk::style map Flat.TButton \
-relief [list active raised] \
- -background [list disabled {#EEEEEE}]
+ -background [list disabled ${::COMMON_BG_COLOR}]
ttk::style configure TMenubutton \
-padding 0 \
-background $TTK_COMMON_BG
ttk::style configure Flat.TMenubutton \
-padding 0 \
- -background {#EEEEEE} \
+ -background ${::COMMON_BG_COLOR}\
-borderwidth 1 \
-relief flat
ttk::style map Flat.TMenubutton \
-relief [list active raised] \
- -background [list disabled {#EEEEEE}]
+ -background [list disabled ${::COMMON_BG_COLOR}]
ttk::style configure FlatWhite.TButton \
-padding 0 \
@@ -290,23 +324,23 @@ ttk::style map FlatWhite.TButton \
-background [list disabled {#FFFFFF}]
ttk::style configure ToolButton.TButton \
- -background {#EEEEEE} \
+ -background ${::COMMON_BG_COLOR}\
-padding 1 \
-borderwidth 1 \
-relief flat
ttk::style map ToolButton.TButton \
-relief [list active raised] \
- -background [list disabled {#EEEEEE}]
+ -background [list disabled ${::COMMON_BG_COLOR}]
ttk::style configure TCombobox \
-background $TTK_COMMON_BG \
- -fieldfont [font create -family {helvetica} -size -12 -weight {normal}]
-ttk::style map TCombobox \
- -foreground [list disabled {#888888}] \
- -fieldbackground [list \
- readonly $TTK_COMMON_BG \
- disabled {#EEEEEE} \
- {!readonly !disabled} {#FFFFFF} \
+ -fieldfont [font create -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight {normal}]
+ttk::style map TCombobox \
+ -foreground [list disabled {#888888}] \
+ -fieldbackground [list \
+ readonly $TTK_COMMON_BG \
+ disabled ${::COMMON_BG_COLOR} \
+ {!readonly !disabled} {#FFFFFF} \
]
ttk::style configure TScrollbar \
@@ -322,16 +356,19 @@ ttk::style map TScale \
]
ttk::style configure TProgressbar \
- -background $TTK_COMMON_BG \
- -troughcolor {#F8F8F8}
+ -background {#CCCCFF} \
+ -troughcolor $TTK_COMMON_BG
+
+ttk::style configure GreenBg.TSpinbox -fieldbackground {#CCFFCC}
+ttk::style configure RedBg.TSpinbox -fieldbackground {#FFCCCC}
-update idle
+update idletasks
## Widget styles
# Load images for checkbuttons and radiobuttons
foreach i {raoff raon choff chon} {
if {[catch {
- image create photo ::ICONS::$i -file "${::LIB_DIRNAME}/../icons/other/$i.png" -format png
+ image create photo ::ICONS::$i -file "${::ROOT_DIRNAME}/icons/other/$i.png" -format png
} result]} then {
puts stderr {}
puts -nonewline stderr $result
@@ -339,73 +376,81 @@ foreach i {raoff raon choff chon} {
}
}
# - Menu
-option add *Menu.activeForeground {#FFFFFF} userDefault
+if {!${::MICROSOFT_WINDOWS}} {
+ option add *Menu.background {#F8F8F8} userDefault
+ option add *Menu.relief raised userDefault
+ option add *Menu.borderWidth 1 userDefault
+} else {
+ option add *Menu.background {#FFFFFF} userDefault
+ option add *Menu.relief flat userDefault
+ option add *Menu.borderWidth 0 userDefault
+}
option add *Menu.activeBackground {#8888DD} userDefault
+option add *Menu.activeForeground {#FFFFFF} userDefault
+option add *Menu.font [font create -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight {normal}] userDefault
option add *Menu.activeBorderWidth 1 userDefault
option add *Menu.cursor left_ptr userDefault
option add *Menu.tearOff 0 userDefault
-option add *Menu.borderWidth 1 userDefault
-option add *Menu.relief raised userDefault
-option add *Menu.background {#F8F8F8} userDefault
-option add *Menu.font [font create -family {helvetica} -size -12 -weight {normal}] userDefault
# - Label
option add *Label.highlightThickness 0 userDefault
# - Entry
option add *Entry.highlightThickness 0 userDefault
option add *Entry.BorderWidth 1 userDefault
-option add *Entry.font [font create -family {helvetica} -size -12 -weight {normal}] userDefault
+option add *Entry.font [font create -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight {normal}] userDefault
# - Text
option add *Text.Background {#FFFFFF} userDefault
option add *Text.highlightThickness 0 userDefault
option add *Text.BorderWidth 1 userDefault
option add *Text.Relief sunken userDefault
-option add *Text.font [font create -family {helvetica} -size -12 -weight {normal}] userDefault
+option add *Text.font [font create -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight {normal}] userDefault
# - Spinbox
option add *Spinbox.Background {#FFFFFF} userDefault
option add *Spinbox.highlightThickness 0 userDefault
+option add *Spinbox.ExportSelection 0 userDefault
# - Scrollbar
option add *Scrollbar.activeBackground {#8888FF} userDefault
option add *Scrollbar.BorderWidth 1 userDefault
-option add *Scrollbar.Background {#EEEEEE} userDefault
-option add *Scrollbar.troughColor {#EEEEEE} userDefault
+option add *Scrollbar.Background ${::COMMON_BG_COLOR} userDefault
+option add *Scrollbar.troughColor ${::COMMON_BG_COLOR} userDefault
option add *Scrollbar.Relief sunken userDefault
option add *Scrollbar.activeRelief raised userDefault
option add *Scrollbar.elementBorderWidth 1 userDefault
# - Button
option add *Button.activeForeground {#0000DD} interactive
-option add *Button.font [font create -family {helvetica} -size -12 -weight {normal}] userDefault
+option add *Button.font [font create -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight {normal}] userDefault
# - Radiobutton
option add *Radiobutton.BorderWidth 0 userDefault
option add *Radiobutton.Image ::ICONS::raoff userDefault
option add *Radiobutton.SelectImage ::ICONS::raon userDefault
-option add *Radiobutton.selectColor {#EEEEEE} userDefault
+option add *Radiobutton.selectColor ${::COMMON_BG_COLOR} userDefault
option add *Radiobutton.Compound left userDefault
option add *Radiobutton.IndicatorOn 0 userDefault
-option add *Radiobutton.font [font create -family {helvetica} -size -12 -weight {normal}] userDefault
+option add *Radiobutton.font [font create -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight {normal}] userDefault
# - Checkbutton
option add *Checkbutton.BorderWidth 0 userDefault
option add *Checkbutton.Image ::ICONS::choff userDefault
option add *Checkbutton.SelectImage ::ICONS::chon userDefault
-option add *Checkbutton.selectColor {#EEEEEE} userDefault
+option add *Checkbutton.selectColor ${::COMMON_BG_COLOR} userDefault
option add *Checkbutton.Compound left userDefault
option add *Checkbutton.IndicatorOn 0 userDefault
-option add *Radiobutton.font [font create -family {helvetica} -size -12 -weight {normal}] userDefault
+option add *Radiobutton.font [font create -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight {normal}] userDefault
# - Scale
option add *Scale.activeBackground {#8888FF} userDefault
# - NoteBook
-option add *NoteBook.font [font create -family {helvetica} -size -12 -weight {normal}] userDefault
-option add *NoteBook.Background {#EEEEEE} userDefault
-option add *NoteBook.ActiveBackground {#EEEEEE} userDefault
+option add *NoteBook.font [font create -family {helvetica} -size [expr {int(-12 * $::font_size_factor)}] -weight {normal}] userDefault
+option add *NoteBook.Background ${::COMMON_BG_COLOR} userDefault
+option add *NoteBook.ActiveBackground {#AAAADD} userDefault
# - TopLevel and Frame
-option add *Toplevel.Background {#EEEEEE} userDefault
-option add *Frame.Background {#EEEEEE} userDefault
-option add *PagesManager.Background {#EEEEEE} userDefault
+option add *Toplevel.Background ${::COMMON_BG_COLOR} userDefault
+option add *Frame.Background ${::COMMON_BG_COLOR} userDefault
+option add *PagesManager.Background ${::COMMON_BG_COLOR} userDefault
# - Others ...
-option add *Panedwindow.Background {#EEEEEE} userDefault
-option add *Listbox.Background {#EEEEEE} userDefault
-option add *Button.Background {#EEEEEE} userDefault
-option add *Label.Background {#EEEEEE} userDefault
-option add *Canvas.Background {#EEEEEE} userDefault
+option add *Panedwindow.Background ${::COMMON_BG_COLOR} userDefault
+option add *Listbox.Background ${::COMMON_BG_COLOR} userDefault
+option add *Button.Background ${::COMMON_BG_COLOR} userDefault
+option add *Label.Background ${::COMMON_BG_COLOR} userDefault
+option add *Canvas.Background ${::COMMON_BG_COLOR} userDefault
+option add *ComboBox.ExportSelection 0 userDefault
# MEMORY CELL HELP WINDOW
@@ -441,7 +486,7 @@ proc create_help_window {root val addr} {
# Create logical frame structure
set ::HELPWINDOW [frame ${root}help_window -bd 0 -bg {#BBBBFF} -padx 2 -pady 2]
- pack [frame ${::HELPWINDOW}.top] -fill x -expand 1
+ pack [frame ${::HELPWINDOW}.top -bg {#BBBBFF}] -fill x -expand 1
pack [label ${::HELPWINDOW}.top.img -bg {#BBBBFF}] -side left
pack [label ${::HELPWINDOW}.top.tit -bg {#BBBBFF}] -side left -fill x -expand 1
pack [frame ${::HELPWINDOW}.msg -bg {#FFFFFF}] -fill both -expand 1
@@ -457,7 +502,7 @@ proc create_help_window {root val addr} {
if {[lindex $addr 1] == {BIT}} {
set help_window_for_bit 1
create_help_window_bit [lindex $addr 0]
- } {
+ } else {
set help_window_for_bit 0
create_help_window_byte $val
}
@@ -487,7 +532,7 @@ proc create_help_window_bit {addr} {
set x0 40
set y0 0
- set y1 11
+ set y1 16
# Create 8 bit rectangles in the canvas
for {set i 7} {$i >= 0} {incr i -1} {
@@ -497,17 +542,18 @@ proc create_help_window_bit {addr} {
if {[${::X::actualProject} getBit $bit_addr]} {
set fill $::BitMap::one_fill
set outline $::BitMap::one_outline
- } {
+ } else {
set fill $::BitMap::zero_fill
set outline $::BitMap::zero_outline
}
# Create label for the bit
- $canvas create text [expr {$x0 + 6}] $y0 \
- -text $i -anchor n -font $::Simulator_GUI::smallfont \
+ $canvas create text [expr {$x0 + 6}] $y0 \
+ -text $i \
+ -anchor n \
+ -font $::Simulator_GUI::smallfont \
-fill $::Simulator_GUI::small_color
-
# Create bit rectagle
set help_window_bit($i) [$canvas create \
rectangle $x0 $y1 \
@@ -536,7 +582,7 @@ proc create_help_window_bit {addr} {
# Create arrow pointing to the bit
set arr_pos [expr {47 + ((7 - $bit_number) * 14)}]
set help_window_bit(A) [$canvas create line \
- 40 45 $arr_pos 45 $arr_pos 24 \
+ 40 45 $arr_pos 45 $arr_pos 29 \
-arrow last -fill black \
]
}
@@ -561,8 +607,8 @@ proc create_help_window_byte {val} {
set dec [NumSystem::hex2dec $val]
# Character
if {$dec > 31 && $dec < 127} {
- set char [subst "\\u00$val"]
- } {
+ set char [subst -nocommands "\\u00$val"]
+ } else {
set char {}
}
# Binary
@@ -703,7 +749,7 @@ proc help_window_update {addr new_value} {
if {$help_window_for_bit} {
help_window_update_bit [lindex $addr 0] $new_value
- } {
+ } else {
help_window_update_byte $addr $new_value
}
}
@@ -725,7 +771,7 @@ proc help_window_update_bit {addr new_value} {
if {[${::X::actualProject} getBit $bit_addr]} {
set fill $::BitMap::one_fill
set outline $::BitMap::one_outline
- } {
+ } else {
set fill $::BitMap::zero_fill
set outline $::BitMap::zero_outline
}
@@ -751,8 +797,8 @@ proc help_window_update_byte {addr new_value} {
set dec [NumSystem::hex2dec $new_value]
# Character
if {$dec > 31 && $dec < 127} {
- set char [subst "\\u00$new_value"]
- } {
+ set char [subst -nocommands "\\u00$new_value"]
+ } else {
set char {}
}
# Binary
@@ -807,7 +853,7 @@ proc help_window_show {X Y} {
# Ensure than help window wont exceed boundaries of the main window
if {$help_window_for_bit} {
if {$x_coord > ($x_lim - 160)} {incr x_coord -170}
- } {
+ } else {
if {$x_coord > ($x_lim - 100)} {incr x_coord -110}
}
if {$y_coord > ($y_lim - 100)} {incr y_coord -110}
@@ -823,31 +869,56 @@ proc help_window_show {X Y} {
# GENERAL PURPOSE PROCEDURES
# -----------------------------
-##
- #
+## Create a new toplevel window with a progress bar within
+ # @parm Widget window_path - Chosen path for the new window
+ # @parm Widget transient - Parent of the window
+ # @parm String textvariable - Variable contaning the message
+ # @parm String text - A string to display as the message in the window
+ # (meaningful only when no textvariable was specified)
+ # @parm Int maximum - Maximum value for the progress bar
+ # @parm String title - Title on the window
+ # @parm Image iconphoto - Image to display in the window
+ # (previously created with "image create" command)
+ # @parm String abort_text - Text to display in the abort button (default: "Abort")
+ # @parm String abort_command - Command to invoke when abort button is pressed
+ # (empty string means do not display abort the button)
# @return void
-proc create_progress_bar {window_path transient textvariable text variable maximum title iconphoto abort_text abort_command} {
+proc create_progress_bar {window_path transient textvariable text variable maximum title iconphoto {abort_text {}} {abort_command {}}} {
+ # Create a new top level windows
toplevel $window_path
+
+ # Display the image
pack [label $window_path.image \
-image ::ICONS::32::user_away \
] -side left -anchor n -padx 10 -pady 15
+
+ # Create and show a frame where other widgets will be shown in
pack [frame $window_path.f] -side right -fill both
+
+ # Create widget containing the message
if {$textvariable != {}} {
pack [label $window_path.f.label \
-textvariable $textvariable \
] -anchor w -padx 5 -pady 5
- } {
+ } else {
pack [label $window_path.f.label \
-text $text \
] -anchor w -padx 5 -pady 5
}
+
+ # Create the progress bar widget
pack [ttk::progressbar $window_path.f.progressbar \
-mode determinate \
-length 330 \
-maximum $maximum \
-variable $variable \
] -fill x -padx 5 -pady 5
+
+ # Create the abort button
if {$abort_command != {}} {
+ if {$abort_text == {}} {
+ set abort_text [mc "Abort"]
+ }
pack [ttk::button $window_path.f.button \
-compound left \
-image ::ICONS::16::cancel \
@@ -856,9 +927,11 @@ proc create_progress_bar {window_path transient textvariable text variable maxim
] -padx 5 -pady 5 -anchor e
}
+ # Set window parameters
wm title $window_path $title
wm transient $window_path $transient
wm iconphoto $window_path $iconphoto
+ wm resizable $window_path 0 0
update
catch {
raise $window_path
@@ -896,25 +969,92 @@ proc enc2name {enc} {
}
}
+## Create hyperlink tag in the specifid text widget
+ # @parm Widget widget - Target
+ # @return void
+set hyperlink_cur_orig {}
+proc create_link_tag_in_text_widget {widget} {
+ $widget tag configure hyperlink_normal -foreground #0055FF -underline 1
+ $widget tag configure hyperlink_over -foreground #0055FF -underline 0
+
+ $widget tag bind hyperlink_normal <Enter> {
+ set range [%W tag nextrange hyperlink_normal {@%x,%y linestart}]
+ if {$range != {}} {
+ set ::hyperlink_cur_orig [%W cget -cursor]
+ %W tag remove hyperlink_normal [lindex $range 0] [lindex $range 1]
+ %W tag add hyperlink_over [lindex $range 0] [lindex $range 1]
+ %W configure -cursor hand2
+ }
+ }
+ $widget tag bind hyperlink_over <Leave> {
+ set range [%W tag nextrange hyperlink_over {0.0}]
+ if {$range != {}} {
+ %W tag remove hyperlink_over [lindex $range 0] [lindex $range 1]
+ %W tag add hyperlink_normal [lindex $range 0] [lindex $range 1]
+ %W configure -cursor $::hyperlink_cur_orig
+ }
+ }
+ $widget tag bind hyperlink_over <Button-1> {
+ set range [%W tag nextrange hyperlink_over {0.0}]
+ if {$range != {}} {
+ set url [%W get [lindex $range 0] [lindex $range 1]]
+ if {[regexp {[\w\.]+@[\w\.]+} $url]} {
+ set url "mailto:$url"
+ }
+ ::X::open_uri $url
+ }
+ }
+}
+
+## Automatically convert all strings beginning with "http://" to hypertext tags
+ # @parm Widget widget - Target text widget
+ # @return void
+proc convert_all_https_to_links {widget} {
+ foreach re [list {http://[^\s]+} {[\w\.]+@[\w\.]+}] {
+ set idx {1.0}
+ set end {1.0}
+ set org {1.0}
+ set s {}
+
+ while {1} {
+ set org $idx
+ set idx [$widget search -forwards -regexp -nocase $re $end]
+
+ if {$idx == {} || [$widget compare $org >= $idx]} {
+ break
+ }
+
+ if {![regexp $re [$widget get $idx [list $idx lineend]] s]} {
+ break
+ }
+
+ set s [string length $s]
+ set end [$widget index [list $idx + $s c]]
+
+ $widget tag add hyperlink_normal $idx $end
+ }
+ }
+}
+
## Load global configuration
# @return void
proc loadApplicationConfiguration {} {
# Load configuration file
if {$::CLI_OPTION(config_file) == {}} {
Settings settings ${::CONFIG_DIR} "config.conf"
- } {
+ } else {
Settings settings \
[file dirname $::CLI_OPTION(config_file)] \
[file tail $::CLI_OPTION(config_file)]
}
- # If configuration file is unavaliable -> invoke error message
+ # If configuration file is unavailable -> invoke error message
if {![settings isReady]} {
tk_messageBox \
-type ok \
-icon error \
-title [mc "Permission denied"] \
- -message [mc "Unable to save config file"]
+ -message [mc "Unable to save configuration file"]
}
# Reset settings to defaults
@@ -924,43 +1064,43 @@ proc loadApplicationConfiguration {} {
settings clear
# Editor configuration
- configDialogs::editor::getSettings
- configDialogs::editor::save_config
+ configDialogues::editor::getSettings
+ configDialogues::editor::save_config
# Right panel settings
- configDialogs::rightPanel::getSettings
- configDialogs::rightPanel::save_config
+ configDialogues::rightPanel::getSettings
+ configDialogues::rightPanel::save_config
# Compiler configuration
- configDialogs::compiler::getSettings
- configDialogs::compiler::save_config
+ configDialogues::compiler::getSettings
+ configDialogues::compiler::save_config
# Main tool bar
set ::ICONBAR_CURRENT ${::ICONBAR_DEFAULT}
- configDialogs::toolbar::save_config
+ configDialogues::toolbar::save_config
# Custom commands
- configDialogs::custom_commands::save_config
+ configDialogues::custom_commands::save_config
# Shortcuts
- configDialogs::shortcuts::load_config
- configDialogs::shortcuts::getSettings
- configDialogs::shortcuts::save_config
+ configDialogues::shortcuts::load_config
+ configDialogues::shortcuts::getSettings
+ configDialogues::shortcuts::save_config
# Simulator configuration
- configDialogs::simulator::getSettings
- configDialogs::simulator::save_config
+ configDialogues::simulator::getSettings
+ configDialogues::simulator::save_config
# Terminal emulator
if {!$::MICROSOFT_WINDOWS} { ;# There is no terminal emulator on Windows
- configDialogs::terminal::getSettings
- configDialogs::terminal::save_config
+ configDialogues::terminal::getSettings
+ configDialogues::terminal::save_config
}
# Load settings
- } {
- configDialogs::editor::load_config ;# Editor configuration
- configDialogs::rightPanel::load_config ;# Right panel settings
- configDialogs::compiler::load_config ;# Compiler configuration
- configDialogs::toolbar::load_config ;# Main tool bar
- configDialogs::custom_commands::load_config ;# Custom commands
- configDialogs::shortcuts::load_config ;# Shortcuts
- configDialogs::simulator::load_config ;# Simulator
+ } else {
+ configDialogues::editor::load_config ;# Editor configuration
+ configDialogues::rightPanel::load_config ;# Right panel settings
+ configDialogues::compiler::load_config ;# Compiler configuration
+ configDialogues::toolbar::load_config ;# Main tool bar
+ configDialogues::custom_commands::load_config ;# Custom commands
+ configDialogues::shortcuts::load_config ;# Shortcuts
+ configDialogues::simulator::load_config ;# Simulator
if {!$::MICROSOFT_WINDOWS} { ;# There is no terminal emulator on Windows
- configDialogs::terminal::load_config ;# Terminal emulator
+ configDialogues::terminal::load_config ;# Terminal emulator
}
}
}
@@ -980,62 +1120,62 @@ set false_selection_dis 0
# @parm String what_to_do - ID of tab to activate
# @return void
proc manipulate_panel {what_to_do} {
- if {![llength ${X::openedProjects}] || ${X::actualProject} == {}} {
+ if {![llength ${::X::openedProjects}] || ${::X::actualProject} == {}} {
return
}
switch -- $what_to_do {
{sim} { ;# "Bottom / Simulator"
- ${X::actualProject} bottomNB_show_up Simulator
+ ${::X::actualProject} bottomNB_show_up Simulator
}
{graph} { ;# "Bottom" / "Graph"
- ${X::actualProject} bottomNB_show_up Graph
+ ${::X::actualProject} bottomNB_show_up Graph
}
{mess} { ;# "Bottom / Messages"
- ${X::actualProject} bottomNB_show_up Messages
+ ${::X::actualProject} bottomNB_show_up Messages
}
{todo} { ;# "Bottom / Todo"
- ${X::actualProject} bottomNB_show_up Todo
+ ${::X::actualProject} bottomNB_show_up Todo
}
{calc} { ;# "Bottom / Calculator"
- ${X::actualProject} bottomNB_show_up Calculator
+ ${::X::actualProject} bottomNB_show_up Calculator
}
{bsh} { ;# "Bottom / Show_Hide"
- ${X::actualProject} bottomNB_show_hide
+ ${::X::actualProject} bottomNB_show_hide
}
{book} { ;# "Right / Bookmarks"
- ${X::actualProject} rightPanel_show_up Bookmarks
+ ${::X::actualProject} rightPanel_show_up Bookmarks
}
{brk} { ;# "Right / Breakpoints"
- ${X::actualProject} rightPanel_show_up Breakpoints
+ ${::X::actualProject} rightPanel_show_up Breakpoints
}
{wtch} { ;# "Right / Watches"
- ${X::actualProject} rightPanel_show_up Watches
+ ${::X::actualProject} rightPanel_show_up Watches
}
{ins} { ;# "Right / Instruction details"
- ${X::actualProject} rightPanel_show_up Instruction
+ ${::X::actualProject} rightPanel_show_up Instruction
}
{sub} { ;# "Right / Subprograms"
- ${X::actualProject} rightPanel_show_up Subprograms
+ ${::X::actualProject} rightPanel_show_up Subprograms
}
{rsh} { ;# "Right / Show_Hide"
- ${X::actualProject} right_panel_show_hide
+ ${::X::actualProject} right_panel_show_hide
}
{lsh} { ;# "Left / Show_Hide"
- ${X::actualProject} filelist_show_hide
+ ${::X::actualProject} filelist_show_hide
}
{open} { ;# "Left / Opened files"
- ${X::actualProject} filelist_show_up opened_files
+ ${::X::actualProject} filelist_show_up opened_files
}
{proj} { ;# "Left / Project files"
- ${X::actualProject} filelist_show_up project_files
+ ${::X::actualProject} filelist_show_up project_files
}
- {fsb} { ;# "Left / Filesystem browser"
- ${X::actualProject} filelist_show_up fs_browser
+ {fsb} { ;# "Left / File system browser"
+ ${::X::actualProject} filelist_show_up fs_browser
}
- {sfr} { ;# "Left / Filesystem browser"
- ${X::actualProject} filelist_show_up sfr_watches
+ {sfr} { ;# "Left / File system browser"
+ ${::X::actualProject} filelist_show_up sfr_watches
}
}
}
@@ -1050,8 +1190,9 @@ proc manipulate_panel {what_to_do} {
# }
# @parm String path - menu root
# @parm Bool tearoff - tearoff menu on/off (default: false)
+ # @parm String trg_ns = "::" - Target namespace (for i18n)
# @return Bool - return code
-proc menuFactory {pattern path tearoff cmdPrefix shortcuts options} {
+proc menuFactory {pattern path tearoff cmdPrefix shortcuts options {trg_ns {::}}} {
# Create menu widget
eval "menu $path -tearoff $tearoff $options"
@@ -1070,12 +1211,16 @@ proc menuFactory {pattern path tearoff cmdPrefix shortcuts options} {
set menu(5) "::ICONS::16::$menu(5)"
}
+ # Do i18n
+ set menu(1) [namespace eval $trg_ns "mc {$menu(1)}"]
+ set menu(6) [namespace eval $trg_ns "mc {$menu(6)}"]
+
# Adjust accelerator value
set menu(2) [adjust_menu_accelerator $menu(2)]
# Create menu command
$path add command \
- -label [mc $menu(1)] \
+ -label $menu(1) \
-accelerator $menu(2) \
-underline $menu(3) \
-command "$cmdPrefix$menu(4)" \
@@ -1084,7 +1229,7 @@ proc menuFactory {pattern path tearoff cmdPrefix shortcuts options} {
# Status bar tip
if {$menu(6) != {}} {
set itemIndex [$path index end]
- menu_Sbar_add $path $itemIndex [mc $menu(6)]
+ menu_Sbar_add $path $itemIndex $menu(6)
bind $path <<MenuSelect>> "menu_Sbar $path \[%W index active\]"
bind $path <Leave> {Sbar {}}
}
@@ -1096,12 +1241,16 @@ proc menuFactory {pattern path tearoff cmdPrefix shortcuts options} {
set menu(5) "${cmdPrefix}$menu(5)"
}
+ # Do i18n
+ set menu(1) [namespace eval $trg_ns "mc {$menu(1)}"]
+ set menu(7) [namespace eval $trg_ns "mc {$menu(7)}"]
+
# Adjust accelerator value
set menu(2) [adjust_menu_accelerator $menu(2)]
# Create radio button item
$path add radiobutton \
- -label [mc $menu(1)] \
+ -label $menu(1) \
-accelerator $menu(2) \
-variable $menu(3) \
-value $menu(4) \
@@ -1111,12 +1260,12 @@ proc menuFactory {pattern path tearoff cmdPrefix shortcuts options} {
-indicatoron 0 \
-image ::ICONS::raoff \
-selectimage ::ICONS::raon \
- -selectcolor {#EEEEEE}
+ -selectcolor ${::COMMON_BG_COLOR}
# Status bar tip
if {$menu(7) != {}} {
set itemIndex [$path index end]
- menu_Sbar_add $path $itemIndex [mc $menu(7)]
+ menu_Sbar_add $path $itemIndex $menu(7)
bind $path <<MenuSelect>> "menu_Sbar $path \[%W index active\]"
bind $path <Leave> {Sbar {}}
}
@@ -1126,12 +1275,17 @@ proc menuFactory {pattern path tearoff cmdPrefix shortcuts options} {
if {$menu(7) != {}} {
set menu(7) "${cmdPrefix}$menu(7)"
}
+
+ # Do i18n
+ set menu(1) [namespace eval $trg_ns "mc {$menu(1)}"]
+ set menu(8) [namespace eval $trg_ns "mc {$menu(8)}"]
+
# Adjust accelerator value
set menu(2) [adjust_menu_accelerator $menu(2)]
# Create checkbutton item
$path add checkbutton \
- -label [mc $menu(1)] \
+ -label $menu(1) \
-accelerator $menu(2) \
-variable $menu(3) \
-onvalue $menu(4) \
@@ -1142,11 +1296,11 @@ proc menuFactory {pattern path tearoff cmdPrefix shortcuts options} {
-image ::ICONS::choff \
-indicatoron 0 \
-selectimage ::ICONS::chon \
- -selectcolor {#EEEEEE}
+ -selectcolor ${::COMMON_BG_COLOR}
# Status bar tip
if {$menu(8) != {}} {
set itemIndex [$path index end]
- menu_Sbar_add $path $itemIndex [mc $menu(8)]
+ menu_Sbar_add $path $itemIndex $menu(8)
bind $path <<MenuSelect>> "menu_Sbar $path \[%W index active\]"
bind $path <Leave> {Sbar {}}
}
@@ -1156,14 +1310,16 @@ proc menuFactory {pattern path tearoff cmdPrefix shortcuts options} {
set menu(4) "$path$menu(4)"
# Create new menu for cascade
if {$menu(7) != {}} {
- menuFactory $menu(7) $menu(4) $menu(5) $cmdPrefix $menu(6) $options
+ menuFactory $menu(7) $menu(4) $menu(5) $cmdPrefix $menu(6) $options $trg_ns
}
+ # Do i18n
+ set menu(1) [namespace eval $trg_ns "mc {$menu(1)}"]
# Item icon
if {$menu(3) != {}} {
set menu(3) "::ICONS::16::$menu(3)"
}
# Add cascade to this menu
- $path add cascade -label [mc $menu(1)] -underline $menu(2) \
+ $path add cascade -label $menu(1) -underline $menu(2) \
-image $menu(3) -menu $menu(4) -compound left
}
{} {return}
@@ -1188,7 +1344,7 @@ proc ena_dis_menu_buttons {EnaDis pattern} {
# Determinate state
if {$EnaDis} {
set state normal
- } {
+ } else {
set state disabled
}
# Set state
@@ -1209,7 +1365,7 @@ proc ena_dis_iconBar_buttons {EnaDis pathPrefix buttonList} {
# Determinate state
if {$EnaDis} {
set state normal
- } {
+ } else {
set state disabled
}
# Set state
@@ -1228,9 +1384,10 @@ proc ena_dis_iconBar_buttons {EnaDis pathPrefix buttonList} {
# {?name? ?helptext? ?imageName? ?command? [?statusTip?]}
# {separator}
# }
+ # @parm String trg_ns = "::" - Target namespace (for i18n)
# @return void
set iconBarFactory_sep_index 0 ;# Separator index
-proc iconBarFactory {container cmdPrefix pathPrefix imageNS pattern} {
+proc iconBarFactory {container cmdPrefix pathPrefix imageNS pattern {trg_ns {::}}} {
global iconBarFactory_sep_index ;# Separator index
# Parse pattern
@@ -1256,12 +1413,12 @@ proc iconBarFactory {container cmdPrefix pathPrefix imageNS pattern} {
-image "$imageNS$parm(2)" \
-style ToolButton.TButton \
]
- DynamicHelp::add $buttonWidget -text $parm(1)
+ ::DynamicHelp::add $buttonWidget -text [namespace eval $trg_ns "mc {[lindex $button 1]}"]
# Pack it
pack $buttonWidget -in $container -side left -padx 2
# Set status bar tip
if {[llength $button] == 5} {
- setStatusTip -widget $buttonWidget -text [lindex $button 4]
+ setStatusTip -widget $buttonWidget -text [namespace eval $trg_ns "mc {[lindex $button 4]}"]
}
}
}
@@ -1317,6 +1474,7 @@ proc show_statusbar_history {} {
# @parm String txt - initial text
# @return void
proc makeStatusbar {txt} {
+ # Button "Set syntax validation level"
pack [frame .statusbarF -height 30p] -fill x -expand 0 -side bottom
pack [ttk::button .statusbarVB \
-style TButton \
@@ -1324,19 +1482,49 @@ proc makeStatusbar {txt} {
-compound left \
-width 6 \
] -in .statusbarF -side left
- DynamicHelp::add .statusbarVB -text [mc "Change validation level"]
+ DynamicHelp::add .statusbarVB -text [mc "Change level of syntax validation."]
bind .statusbarVB <Button-3> {change_validation_level {down}; break}
bind .statusbarVB <Button-1> {change_validation_level {up}; break}
- pack [ArrowButton .statusbarF.arr_but \
- -dir top -clean 2 -bd 0 \
- -helptext [mc "Show statusbar history"] \
- -command {show_statusbar_history} \
- -height 14 -width 14 -bg {#eeeeee} \
+ # This function was not yet ported to MS Windows
+ if {!$::MICROSOFT_WINDOWS} {
+ # Button "Configure spell checking"
+ pack [ttk::menubutton .statusbarSB \
+ -style TButton \
+ -compound left \
+ -width 6 \
+ -direction above \
+ -menu .spell_checker_conf_menu \
+ -image ::ICONS::flag::empty \
+ -text "none" \
+ ] -in .statusbarF -side left
+ if {${::PROGRAM_AVAILABLE(hunspell)}} {
+ DynamicHelp::add .statusbarSB -text [mc "Configure spell checker"]
+ } else {
+ DynamicHelp::add .statusbarSB -text [mc "Spell checker (hunspell) is not available."]
+ .statusbarSB configure -state disabled
+ }
+ }
+
+ # Button "Show status bar history"
+ pack [ArrowButton .statusbarF.arr_but \
+ -dir top -clean 2 -bd 0 \
+ -helptext [mc "Show status bar history"] \
+ -command {show_statusbar_history} \
+ -height 14 -width 14 -bg ${::COMMON_BG_COLOR} \
] -side left -padx 7
- setStatusTip -widget .statusbarF.arr_but -text [mc "Show statusbar history"]
- pack [label .statusbarL -text $txt -anchor w -justify left] \
+ setStatusTip -widget .statusbarF.arr_but -text [mc "Show status bar history"]
+
+ # Status bar
+ pack [label .statusbarL -text $txt -anchor w -justify left] \
-in .statusbarF -side left -fill x -expand 1
+ # MCU currently in use
+ pack [label .statusbarMCU -text "" -cursor hand2 -anchor e -justify right -fg {#000000}] \
+ -in .statusbarF -side right -padx 5
+ DynamicHelp::add .statusbarMCU -text [mc "MCU chosen for simulation"]
+ bind .statusbarMCU <Enter> {%W configure -fg {#0000DD}}
+ bind .statusbarMCU <Leave> {%W configure -fg {#000000}}
+ bind .statusbarMCU <Button-1> {::X::__proj_edit 1}
}
set sbarAfterId {} ;# Sbar timer ID
set status_bar_history {} ;# Sbar history
@@ -1381,7 +1569,7 @@ proc change_validation_level {arg} {
set ::CsyntaxHighlight::validation_L1 0 ;# Bool: Basic validation enabled
set ::ASMsyntaxHighlight::validation_L0 0 ;# Bool: Basic validation enabled
set ::ASMsyntaxHighlight::validation_L1 0 ;# Bool: Advancet validation enabled
- } {
+ } else {
.statusbarVB configure -text " $::CONFIG(VALIDATION_LEVEL)"
.statusbarVB configure -style TButton
setStatusTip -widget .statusbarVB -text [mc "Current validation level: %s" $::CONFIG(VALIDATION_LEVEL)]
@@ -1394,7 +1582,7 @@ proc change_validation_level {arg} {
if {$::CONFIG(VALIDATION_LEVEL) == 2} {
set ::ASMsyntaxHighlight::validation_L1 1 ;# Bool: Advancet validation enabled
set ::CsyntaxHighlight::validation_L1 1 ;# Bool: Basic validation enabled
- } {
+ } else {
set ::ASMsyntaxHighlight::validation_L1 0 ;# Bool: Advancet validation enabled
set ::CsyntaxHighlight::validation_L1 0 ;# Bool: Basic validation enabled
}
@@ -1466,7 +1654,7 @@ proc simulator_Sbar {txt mode object} {
if {![string length $txt]} {
return
}
- pack [label .simulator_Sbar -text $txt -fg {#DD8800} -cursor hand1] -in .statusbarF -side right
+ pack [label .simulator_Sbar -text $txt -fg {#DD8800} -cursor hand2] -in .statusbarF -side right
if {$mode} {
bind .simulator_Sbar <Enter> {%W configure -fg {#0000DD}}
bind .simulator_Sbar <Leave> {%W configure -fg {#DD8800}}
@@ -1557,6 +1745,9 @@ proc menu_Sbar_add {menu item text} {
# @parm Widget menu - ID of the menu
# @return void
proc menu_Sbar_remove {menu} {
+ if {$menu == {}} {
+ return
+ }
# Determinate menu index
set idx [lsearch ${::menuSbar_menus} $menu]
if {$idx == -1} {
@@ -1584,7 +1775,7 @@ proc menu_Sbar {menu item} {
}
if {[lsearch $::menuSbar_items($menu) $item] != -1} {
Sbar -freeze $::menuSbar_texts(${menu},${item})
- } {
+ } else {
Sbar {}
}
}
@@ -1626,7 +1817,7 @@ set SHORTCUTS_LIST {
{statistics} {{} ::X::__statistics {}
{File statistics}}
{fullscreen} {{Control-Key-XF86_Switch_VT_11} ::X::__toggle_fullscreen window_fullscreen
- {Toggle fullscreen mode}}
+ {Toggle full screen mode}}
} {project {Project management} {}
{proj_new} {{} ::X::__proj_new filenew
{New project}}
@@ -1692,22 +1883,30 @@ set SHORTCUTS_LIST {
{resume} {{} ::X::__resume resume
{Simulator: Resume}}
{intrmon} {{} ::X::__interrupt_monitor kcmdf
- {Interrupt monitor}}
+ {Interrupt Monitor}}
+ {uartmon} {{} ::X::__uart_monitor __blockdevice
+ {UART Monitor}}
{stopwatch} {{} ::X::__stopwatch_timer player_time
{Stopwatch}}
} {virtual_hw {Virtual HW} {}
{ledpanel} {{} {::X::__vhw_LED_panel} ledpanel
- {LED panel}}
+ {LED Panel}}
{leddisplay} {{} {::X::__vhw_LED_display} leddisplay
- {LED display}}
+ {LED Display}}
{ledmatrix} {{} {::X::__vhw_LED_matrix} ledmatrix
- {LED matrix}}
+ {LED Matrix}}
+ {hd44780} {{} {::X::__vhw_HD44780} hd44780
+ {LCD display controlled by HD44780}}
{mleddisplay} {{} {::X::__vhw_M_LED_display} mleddisplay
{Multiplexed LED display}}
{simplekeypad} {{} {::X::__vhw_keys} simplekeypad
- {Simple keypad}}
+ {Simple Keypad}}
{matrixkeypad} {{} {::X::__vhw_matrix_keypad} matrixkeypad
- {Matrix keypad}}
+ {Matrix Keypad}}
+ {ds1620} {{} {::X::__ds1620} ds1620
+ {DS1620 thermometer}}
+ {fintr} {{} {::X::__vhw_file_interface} compfile1
+ {File Interface}}
{vhw_open} {{} {::X::__open_VHW} fileopen
{Open}}
{vhw_load} {{} {::X::__load_VHW} fileimport
@@ -1725,6 +1924,8 @@ set SHORTCUTS_LIST {
{Compile this file only}}
{disasm} {{} ::X::__disasm disasm
{Disassemble}}
+ {d52} {{} ::X::__d52 d52
+ {Disassemble with D52}}
{auto_indent} {{} ::X::__reformat_code filter
{Auto indent}}
{change_case} {{} ::X::__change_letter_case change_case
@@ -1763,24 +1964,28 @@ set SHORTCUTS_LIST {
{hexeditor} {{} ::X::__hexeditor ascii
{Hex Editor}}
{symb_view} {{} ::X::__symb_view symbol
- {Symbol table}}
+ {Symbol Table}}
{8seg} {{} ::X::__eightsegment 8seg
- {8-segment editor}}
+ {8-Segment Editor}}
{ascii_c} {{} ::X::__ascii_chart math_matrix
- {ASCII chart}}
+ {ASCII Chart}}
+ {toi} {{} ::X::__table_of_instructions fsview
+ {8051 Instruction Table}}
{notes} {{} ::X::__notes pencil
- {Scribble notepad}}
- {bc} {{} ::X::__base_convertor kaboodleloop
- {Base Convertor}}
+ {Scribble Notepad}}
+ {bc} {{} ::X::__base_converter kaboodleloop
+ {Base Converter}}
{rs232} {{} ::X::__rs232debugger chardevice
{UART/RS232 Debugger}}
} {help {Help} {}
{about} {{} ::X::__about mcu8051ide
{About dialog}}
- {welcome} {{} ::X::__welcome_dialog {}
- {Welcome dialog}}
- {tips} {{} ::X::__tip_of_the_day help
- {Tip of the day}}
+ {welcome} {{} ::X::__welcome_dialog info
+ {Welcome Dialog}}
+ {tips} {{} ::X::__tip_of_the_day help
+ {Tip of the Day}}
+ {hbook} {{Key-F1} ::X::__handbook contents
+ {Handbook}}
} {messages {Messages text} {Control-Key-c Control-Key-a}
{clear_mess} {{} {$this clear_messages_text} editdelete
{Clear messages}}
@@ -1799,7 +2004,7 @@ set SHORTCUTS_LIST {
{italic} {Control-Key-i {$this TodoProc_italic} text_italic
{Italic text}}
{strike} {Control-Key-q {$this TodoProc_strike} text_strike
- {Striketrought text}}
+ {Strikethrough text}}
{under} {Control-Key-u {$this TodoProc_under} text_under
{Underline text}}
{edrase} {Control-Key-e {$this TodoProc_eraser} eraser
@@ -1823,7 +2028,7 @@ set SHORTCUTS_LIST {
{Move down}}
{bottom} {{} {$this rightPanel_watch_move_bottom} bottom
{Move to bottom}}
- {remove} {{Control-Delete} {$this rightPanel_watch_remove} button_cancel
+ {remove} {{Control-Delete} {$this rightPanel_watch_remove} button_cancel
{Remove}}
{remove_all} {{} {$this rightPanel_watch_clear} editdelete
{Remove all}}
@@ -1917,6 +2122,9 @@ set SHORTCUTS_LIST {
{Block selection mode}}
}
}
+# Intentionally hidden functions, these haven't been fully implemented yet
+# virtual_hw: {vuterm} {{} {::X::__vhw_UART_terminal} _chardevice
+# {Virtual UART termnal}}
## Traslate menu accelerator string to human readable key sequence
# @parm String value - string to translate (for instance: $main:quit)
@@ -2079,9 +2287,9 @@ set MAINMENU {
{command "Find" "$edit:find" 0 {X::__find} "find"
"Find a string in the text"}
{command "Find next" "$edit:find_next" 5 {X::__find_next} "1downarrow"
- "Find next occurence of search string"}
+ "Find next occurrence of search string"}
{command "Find previous" "$edit:find_prev" 10 {X::__find_prev} "1uparrow"
- "Find previous occurence of search string"}
+ "Find previous occurrence of search string"}
{separator}
{command "Replace" "$edit:replace" 0 {X::__replace} ""
"Replace some string with another"}
@@ -2102,7 +2310,7 @@ set MAINMENU {
{cascade "View" 0 "" .display false 1 {
{checkbutton "Read only mode" "$sim:readonly" {::editor_RO_MODE} 1 0 5
{::X::switch_editor_RO_MODE}
- "Set current editor to readonly/normal mode"}
+ "Set current editor to read only/normal mode"}
{command "Switch to command line" "$edit:cmd_line" 7 {X::__switch_to_cmd_line}
"" "Switch to editor command line"}
{separator}
@@ -2130,8 +2338,8 @@ set MAINMENU {
""}
}}
{separator}
- {command "Fullscreen mode" "$main:fullscreen" 0 {X::__toggle_fullscreen}
- "window_fullscreen" "Toggle fullscreen mode"}
+ {command "Full screen mode" "$main:fullscreen" 0 {X::__toggle_fullscreen}
+ "window_fullscreen" "Toggle full screen mode"}
{separator}
{command "Clear messages panel" "$messages:clear_mess" 0 {X::__clear_messages_text}
"editdelete" "Clear messages panel"}
@@ -2163,23 +2371,21 @@ set MAINMENU {
"launch_this" "Start simulator engine and load current file only"}
{separator}
{command "Step back" "$sim:stepback" 5 {X::__stepback}
- "undo" "Step program back by 1 inctruction"}
+ "undo" "Step program back by 1 instruction"}
{command "Step" "$sim:step" 3 {X::__step}
- "goto" "Step program by 1 inctruction"}
+ "goto" "Step program by 1 instruction"}
{command "Step over" "$sim:stepover" 5 {X::__stepover}
"goto2" "Step program by 1 line of code"}
{command "Animate" "$sim:animate" 0 {X::__animate}
"1rightarrow" "Run program and show results after each change"}
{command "Run" "$sim:run" 2 {X::__run}
- "2rightarrow" "Run program and show results periodicaly in some interval"}
+ "2rightarrow" "Run program and show results periodically in some interval"}
{separator}
{command "Hiberante program" "$sim:hiberante" 0 {X::__hibernate}
"bar5" "Save current state of simulator engine to a file for future resumption"}
{command "Resume hibernated program" "$sim:resume" 4 {X::__resume}
"resume" "Resume hibernated program"}
{separator}
- {command "Interrupt monitor" "$sim:intrmon" 6 {X::__interrupt_monitor}
- "kcmdf" "Dialog in which you can controll MCU interrupts"}
{command "Stopwatch" "$sim:stopwatch" 4 {X::__stopwatch_timer}
"player_time" "Configurable stopwatch timer which can stop simulation on various conditions"}
{separator}
@@ -2208,7 +2414,7 @@ set MAINMENU {
{command "Show Data EEPROM" "$sim:show_eeprom" 5 {X::__show_eeprom}
"kcmmemory_P" "Invoke hex editor with data EEPROM"}
{command "Show EEPROM write buffer" "$sim:show_eem_wb" 14 {X::__show_eeprom_write_buffer}
- "kcmmemory_B" "Invoke hexeditor editor with data EEPROM write buffer"}
+ "kcmmemory_B" "Invoke hex editor editor with data EEPROM write buffer"}
{separator}
{cascade "Reset" 0 "rebuild" .virtual_mcu_reset false 1 {
{command "Only SFR" "$sim:reset-" 0 {X::__reset -}
@@ -2220,20 +2426,41 @@ set MAINMENU {
{command "Random values" "$sim:resete" 0 {X::__reset r}
"rebuild" "Reset all internal registers to random values"}
}}
+ {separator}
+ {command "Interrupt monitor" "$sim:intrmon" 6 {X::__interrupt_monitor}
+ "kcmdf" "Dialog in which you can control MCU interrupts"}
}}
{cascade "Virtual HW" 8 "" .virtual_hw false 1 {
- {command "LED panel" "$virtual_hw:ledpanel" 2 {X::__vhw_LED_panel}
+ {command "LED Panel" "$virtual_hw:ledpanel" 2 {X::__vhw_LED_panel}
"ledpanel" ""}
- {command "LED display" "$virtual_hw:leddisplay" 10 {X::__vhw_LED_display}
+ {command "LED Display" "$virtual_hw:leddisplay" 10 {X::__vhw_LED_display}
"leddisplay" ""}
- {command "LED matrix" "$virtual_hw:ledmatrix" 4 {X::__vhw_LED_matrix}
+ {command "LED Matrix" "$virtual_hw:ledmatrix" 4 {X::__vhw_LED_matrix}
"ledmatrix" ""}
- {command "Multiplexed LED display" "$virtual_hw:mleddisplay" 1 {X::__vhw_M_LED_display}
+ {command "Multiplexed LED Display" "$virtual_hw:mleddisplay" 1 {X::__vhw_M_LED_display}
"mleddisplay" ""}
- {command "Simple keypad" "$virtual_hw:simplekeypad" 1 {X::__vhw_keys}
+ {command "Simple Keypad" "$virtual_hw:simplekeypad" 1 {X::__vhw_keys}
"simplekeypad" ""}
- {command "Matrix keypad" "$virtual_hw:matrixkeypad" 7 {X::__vhw_matrix_keypad}
+ {command "Matrix Keypad" "$virtual_hw:matrixkeypad" 7 {X::__vhw_matrix_keypad}
"matrixkeypad" ""}
+ {cascade "LCD display (HD44780)" 13 "hd44780" .hd44780 false 1 {
+ {command "1 × 8" "" 0 {X::__vhw_HD44780 {1 8}}
+ "hd44780" "LCD display controlled by HD44780"}
+ {command "2 × 8" "" 0 {X::__vhw_HD44780 {2 8}}
+ "hd44780" "LCD display controlled by HD44780"}
+ {command "2 × 16" "" 0 {X::__vhw_HD44780 {2 16}}
+ "hd44780" "LCD display controlled by HD44780"}
+ {command "2 × 20" "" 0 {X::__vhw_HD44780 {2 20}}
+ "hd44780" "LCD display controlled by HD44780"}
+ {command "2 × 40" "" 0 {X::__vhw_HD44780 {2 40}}
+ "hd44780" "LCD display controlled by HD44780"}
+ {command "Any" "" 0 {X::__vhw_HD44780}
+ "hd44780" "LCD display controlled by HD44780"}
+ }}
+ {command "DS1620 temperature sensor" "$virtual_hw:ds1620" 8 {X::__vhw_ds1620}
+ "ds1620" "Simulated DS1620 thermometer"}
+ {command "File Interface" "$virtual_hw:fintr" 1 {X::__vhw_file_interface}
+ "compfile1" "Read & Write GPIO states from/to a file"}
{separator}
{command "Open" "$virtual_hw:vhw_open" 0 {X::__open_VHW}
"fileopen" "Load VHW connections from a file"}
@@ -2249,7 +2476,6 @@ set MAINMENU {
"filesave" "Save current VHW connections to a file"}
{command "Save as" "$virtual_hw:vhw_saveas" 1 {X::__save_as_VHW}
"filesaveas" "Save current VHW connections under a different name"}
-
{separator}
{command "Remove all" "$virtual_hw:vhw_remove_all" 0 {X::__remove_all_VHW}
"editdelete" "Remove all VHW"}
@@ -2283,7 +2509,7 @@ set MAINMENU {
{command "Document current function" "$tools:doc_cur_f" 4 {X::__document_current_func}
"" "Create doxygen documentation for function on current line"}
{command "Run doxywizard" "$tools:doxywizard" 7 {X::__run_doxywizard}
- "" "Run doxygen frondend"}
+ "" "Run doxygen front-end"}
{command "Clear C API documentation" "$tools:clr_doc" 8 {X::__clear_documentation}
"" "Remove C API documentation created by doxygen"}
{command "Build C API documentation" "$tools:doxygen" 9 {X::__generate_documentation}
@@ -2311,64 +2537,80 @@ set MAINMENU {
{command "Normalize Intel 8 hex file" "$utilities:normalize_hex" 0 {X::__normalize_hex}
"hh" "Reformat the given IHEX8"}
{separator}
- {command "Hex editor" "$utilities:hexeditor" 1 {X::__hexeditor}
+ {command "Hex Editor" "$utilities:hexeditor" 1 {X::__hexeditor}
"ascii" "Invoke project independent hexadecimal editor with capacity of 64KB"}
- {command "Symbol table" "$utilities:symb_view" 7 {X::__symb_view}
+ {command "Symbol Table" "$utilities:symb_view" 7 {X::__symb_view}
"symbol" "Assembly language symbol table viewer"}
- {command "8-segment editor" "$utilities:8seg" 4 {X::__eightsegment}
- "8seg" "8-segment LED display editor"}
- {command "ASCII chart" "$utilities:ascii_c" 0 {X::__ascii_chart}
- "math_matrix" "ASCII chart"}
+ {command "8-Segment Editor" "$utilities:8seg" 4 {X::__eightsegment}
+ "8seg" "8-Segment LED Display Editor"}
+ {command "ASCII Chart" "$utilities:ascii_c" 0 {X::__ascii_chart}
+ "math_matrix" "ASCII Chart"}
+ {command "8051 Instruction Table" "$utilities:toi" 0 {X::__table_of_instructions}
+ "fsview" "Interactive table of 8051 instructions"}
{separator}
- {command "Scribble notepad" "$utilities:notes" 10 {X::__notes}
+ {command "Scribble Notepad" "$utilities:notes" 10 {X::__notes}
"pencil" ""}
- {command "Base convertor" "$utilities:bc" 5 {X::__base_convertor}
+ {command "Base Converter" "$utilities:bc" 5 {X::__base_converter}
"kaboodleloop" ""}
- {command "Special calculator" "" 1 {X::__spec_calc}
+ {command "Special Calculator" "" 1 {X::__spec_calc}
"xcalc" ""}
{separator}
{command "UART/RS232 Debugger" "$utilities:rs232" 2 {X::__rs232debugger}
"chardevice" ""}
}}
{cascade "Configure" 0 "" .configure false 0 {
- {command "Configure Editor" "" 0 {::configDialogs::editor::mkDialog}
+ {command "Configure Editor" "" 0 {::configDialogues::editor::mkDialog}
"configure"
"Editor configuration (colors, fonts, highlighting, etc.)"}
- {command "Configure Compiler" "" 1 {::configDialogs::compiler::mkDialog}
+ {command "Configure Compiler" "" 1 {::configDialogues::compiler::mkDialog}
"configure"
"Various compilation options"}
- {command "Configure Simulator" "" 12 {::configDialogs::simulator::mkDialog}
+ {command "Configure Simulator" "" 12 {::configDialogues::simulator::mkDialog}
"configure"
"Opens simulator configuration dialog"}
- {command "Configure Right Panel" "" 2 {::configDialogs::rightPanel::mkDialog}
+ {command "Configure Right Panel" "" 2 {::configDialogues::rightPanel::mkDialog}
"configure"
- "Right panel configration (instruction details colors)"}
- {command "Configure Main Toolbar" "" 3 {::configDialogs::toolbar::mkDialog}
+ "Right panel configuration (instruction details colors)"}
+ {command "Configure Main Toolbar" "" 3 {::configDialogues::toolbar::mkDialog}
"configure_toolbars"
"Adjust content of the main toolbar (under main menu)"}
- {command "Edit custom commands" "" 3 {::configDialogs::custom_commands::mkDialog}
+ {command "Edit custom commands" "" 3 {::configDialogues::custom_commands::mkDialog}
"configure"
- "Set or modify user defined commads"}
- {command "Configure shortcuts" "" 10 {::configDialogs::shortcuts::mkDialog}
+ "Set or modify user defined commands"}
+ {command "Configure shortcuts" "" 10 {::configDialogues::shortcuts::mkDialog}
"configure_shortcuts"
"Set or modify key shortcuts"}
- {command "Configure terminal emulator" "" 12 {::configDialogs::terminal::mkDialog}
+ {command "Configure terminal emulator" "" 12 {::configDialogues::terminal::mkDialog}
"terminal"
"Configure embedded terminal emulator -- RXVT-UNICODE"}
- {command "Configure MCU 8051 IDE" "" 4 {::configDialogs::global::mkDialog}
+ {command "Configure MCU 8051 IDE" "" 4 {::configDialogues::global::mkDialog}
"mcu8051ide"
"Invoke global configuration dialog"}
}}
{cascade "Help" 0 "" .help false 1 {
{command "About" "$help:about" 0 {X::__about}
- "kcmmemory" "About MCU 8051 IDE"}
- {command "Welcome dialog" "$help:welcome" 0 {X::__welcome_dialog}
- "" "Invoke dialog which you have seen on the first start"}
- {command "Tip of the day" "$help:tips" 0 {X::__tip_of_the_day}
- "" "Some tips about how to use this program more efficiently"}
+ "mcu8051ide" "About MCU 8051 IDE"}
+ {command "Welcome Dialog" "$help:welcome" 0 {X::__welcome_dialog}
+ "info" "Invoke dialog which you have seen on the first start"}
+ {command "Tip of the Day" "$help:tips" 0 {X::__tip_of_the_day}
+ "idea" "Some tips about how to use this program more efficiently"}
+ {separator}
+ {command "Project web page" "" 8 {::X::__web_page}
+ "html" ""}
+ {command "Report a bug" "" 9 {::X::__bug_report}
+ "bug" ""}
+ {separator}
+ {command "ASEM-51 manual" "" 0 {::X::__asem51_manual}
+ "asem51" ""}
+ {command "SDCC manual" "" 0 {::X::__sdcc_manual}
+ "sdcc" ""}
+ {separator}
+ {command "Handbook" "" 0 {::X::__handbook}
+ "contents" ""}
}}
}
-# This belongs to the "Virtual MCU"
+# Intentionally hidden functions, these haven't been fully implemented yet
+# This belongs to the "Virtual MCU":
# {separator}
# {cascade "Functional diagrams" 0 "blockdevice" .virtual_mcu_fd false 1 {
# {command "Timer/Counter 0" "" 14 {X::__functional_diagram 0}
@@ -2389,13 +2631,19 @@ set MAINMENU {
# "flag" ""}
# }}
# {separator}
-# {command "Virtual UART termnal" "" 8 {X::__virtual_terminal u}
-# "chardevice" ""}
# {command "Virtual SPI termnal" "" 9 {X::__virtual_terminal s}
# "chardevice" ""}
#
+# Virtual MCU: {command "UART Monitor" "$sim:uartmon" 1 {X::__uart_monitor}
+# "__blockdevice" "Dialog in which you can control UART operations"}
+#
+# Virtual HW: {command "Virtual UART terminal" "$virtual_hw:vuterm" 8 {X::__vhw_UART_terminal}
+# "_chardevice" "Simulated UART terminal connected to the MCU simulator"}
+#
+# Tools: {command "Disassemble with D52" "$tools:d52" 15 {X::__d52}
+# "d52" ""}
+# {separator}
#
-
## (Re)Draw main menu
# @return void
@@ -2410,8 +2658,15 @@ proc mainmenu_redraw {} {
}
# Create main menu
. configure -menu .mainMenu
- menuFactory $MAINMENU .mainMenu 0 {} 0 {}
- .mainMenu configure -bd 0 -bg {#EEEEEE} -activeforeground {#6666FF} -activebackground {#EEEEEE} -activeborderwidth 1
+ menuFactory $MAINMENU .mainMenu 0 {} 0 {} [namespace current]
+ if {!${::MICROSOFT_WINDOWS}} {
+ .mainMenu configure \
+ -activeborderwidth 1 \
+ -bg ${::COMMON_BG_COLOR} \
+ -activeforeground {#6666FF} \
+ -activebackground ${::COMMON_BG_COLOR} \
+ -bd 0
+ }
# Restore lists of recent files
for {set i 0} {$i < 3} {incr i} {
@@ -2429,18 +2684,19 @@ proc mainmenu_redraw {} {
iso8859-6 iso8859-7 iso8859-8
iso8859-9 iso8859-10 iso8859-13
iso8859-14 iso8859-15 iso8859-16
- } {
- .mainMenu.tools.encoding add radiobutton \
- -label [enc2name $enc] \
- -value $enc \
- -accelerator [string toupper $enc] \
- -variable ::editor_encoding \
- -command {::X::change_encoding} \
- -indicatoron 0 \
- -compound left \
- -image ::ICONS::raoff \
- -selectimage ::ICONS::raon \
- -selectcolor {#EEEEEE}
+ } \
+ {
+ .mainMenu.tools.encoding add radiobutton \
+ -label [mc [enc2name $enc]] \
+ -value $enc \
+ -accelerator [string toupper $enc] \
+ -variable ::editor_encoding \
+ -command {::X::change_encoding} \
+ -indicatoron 0 \
+ -compound left \
+ -image ::ICONS::raoff \
+ -selectimage ::ICONS::raon \
+ -selectcolor ${::COMMON_BG_COLOR}
}
.mainMenu.tools.encoding entryconfigure 0 -foreground {#0000FF} -underline 0
@@ -2457,17 +2713,20 @@ proc mainmenu_redraw {} {
-compound left \
-image ::ICONS::raoff \
-selectimage ::ICONS::raon \
- -selectcolor {#EEEEEE}
+ -selectcolor ${::COMMON_BG_COLOR}
}
# Window geometry correction
wm geometry . $::CONFIG(WINDOW_GEOMETRY)
- update idle
+ update idletasks
+ if {!$::MICROSOFT_WINDOWS && $::CONFIG(WINDOW_ZOOMED)} {
+ wm attributes . -zoomed $::CONFIG(WINDOW_ZOOMED)
+ }
# Enable / Disable menu items
if {${::X::project_menu_locked}} {
::X::Lock_project_menu
- } {
+ } else {
::X::disena_simulator_menu ${::X::actualProject}
if {![lindex ${::X::simulator_enabled} ${::X::actualProjectIdx}]} {
::X::Lock_simulator_menu
@@ -2483,10 +2742,9 @@ proc mainmenu_redraw {} {
.mainMenu.tools delete [::mc "Custom command 2"]
.mainMenu.tools delete [::mc "Run doxywizard"]
.mainMenu.tools delete [::mc "Clear C API documentation"]
- .mainMenu.tools delete [::mc "Build C API documentation"]
}
- # Disable menu items which are not avaliable when external editor used
+ # Disable menu items which are not available when external editor used
::X::adjust_mm_and_tb_ext_editor
}
@@ -2505,9 +2763,9 @@ menuFactory {
show_hide_main_toolbar
} "2uparrow" "Hide main toolbar"}
{command "Configure Toolbar" "" 0
- {::configDialogs::toolbar::mkDialog}
+ {::configDialogues::toolbar::mkDialog}
"configure_toolbars" "Configure main toolbar"}
-} $TOOLBAR_FRAME.menu 0 {} 0 {}
+} $TOOLBAR_FRAME.menu 0 {} 0 {} [namespace current]
bind .mainIconBar <ButtonRelease-3> "tk_popup $TOOLBAR_FRAME.menu %X %Y"
# Create popup menu for custom commands
@@ -2516,13 +2774,13 @@ menuFactory {
{set ::CONFIG(TOOLBAR_VISIBLE) 0; show_hide_main_toolbar}
"2uparrow" "Hide main toolbar"}
{command "Configure Toolbar" "" 0
- {::configDialogs::toolbar::mkDialog}
+ {::configDialogues::toolbar::mkDialog}
"configure_toolbars" "Configure main toolbar"}
{separator}
- {command "Configure cutom commands" "" 1
- {::configDialogs::custom_commands::mkDialog ${::CUTOM_CMD_MENU_CMD_INDEX}}
- "configure" "Invoke cutom commands configuration dialog"}
-} $TOOLBAR_FRAME.cutom_cmd_menu 0 {} 0 {}
+ {command "Configure custom commands" "" 1
+ {::configDialogues::custom_commands::mkDialog ${::CUSTOM_CMD_MENU_CMD_INDEX}}
+ "configure" "Invoke custom commands configuration dialog"}
+} $TOOLBAR_FRAME.custom_cmd_menu 0 {} 0 {} [namespace current]
# Create show button
Label $TOOLBAR_FRAME.show_label \
@@ -2534,8 +2792,8 @@ bind $TOOLBAR_FRAME.show_label <Button-1> {
show_hide_main_toolbar
}
-# Help variable for 'cutom_cmd_menu' -- index of selected command
-set CUTOM_CMD_MENU_CMD_INDEX 0
+# Help variable for 'custom_cmd_menu' -- index of selected command
+set CUSTOM_CMD_MENU_CMD_INDEX 0
## Definition of all possoble items for main icon bar
# format: {
@@ -2573,9 +2831,9 @@ set ICONBAR_ICONS {
{find} { "Find a string in the text" {find} {find}
{find} {Find a string in the text}}
{findnext} { "Find next" {1downarrow} {1downarrow}
- {find_next} {Find next occurence of search string}}
+ {find_next} {Find next occurrence of search string}}
{findprev} { "Find previous" {1uparrow} {1uparrow}
- {find_prev} {Find previous occurence of search string}}
+ {find_prev} {Find previous occurrence of search string}}
{replace} { "Replace" {find} {find}
{replace} "Replace some string with another"}
{goto} { "Jump to line" {goto} {goto}
@@ -2609,7 +2867,9 @@ set ICONBAR_ICONS {
{show_eeprom} { "Show data EEPROM" {memory_P} {kcmmemory_P}
{show_eeprom} "Invoke hex editor with data EEPROM"}
{show_eem_wr_b} { "Show EEPROM write buffer" {memory_B} {kcmmemory_B}
- {show_eeprom_write_buffer} "Invoke hexeditor editor with data EEPROM write buffer"}
+ {show_eeprom_write_buffer} "Invoke hex editor editor with data EEPROM write buffer"}
+ {stack} { "Show stack" {memory_ST} {kcmmemory_ST}
+ {stack_monitor} "Invoke MCU stack monitor"}
{start_sim} { "Start / Shutdown simulator" {fork} {launch}
{initiate_sim} {Load debug file into simulator engine}}
{start_sim0} { "Debug this file only" {fork_this} {launch_this}
@@ -2629,7 +2889,7 @@ set ICONBAR_ICONS {
{resume} { "Resume program" {resume} {resume}
{resume} "Resume hibernated program"}
{intrmon} { "Interrupt monitor" {kcmdf} {kcmdf}
- {interrupt_monitor} "Dialog in which you can controll MCU interrupts"}
+ {interrupt_monitor} "Dialog in which you can control MCU interrupts"}
{stopwatch} { "Stopwatch" {history} {player_time}
{stopwatch_timer} "Configurable stopwatch timer which stop simulation on various conditions"}
{clear_hg} { "Clear highlight" {editclear} {editclear}
@@ -2642,12 +2902,14 @@ set ICONBAR_ICONS {
{disasm} "Disassemble object code and open new editor with the result"}
{hexeditor} { "Hex Editor" {binary} {ascii}
{hexeditor} "Invoke project independent hexadecimal editor with capacity of 64KB"}
- {symbol_tbl} { "Symbol table" {symbol} {symbol}
+ {symbol_tbl} { "Symbol Table" {symbol} {symbol}
{symb_view} "Assembly language symbol table viewer"}
- {8seg} { "8-segment editor" {8seg} {8seg}
- {eightsegment} "8-segment LED display editor"}
- {ascii_c} { "ASCII chart" {math_matrix} {math_matrix}
- {ascii_chart} "ASCII chart"}
+ {8seg} { "8-Segment Editor" {8seg} {8seg}
+ {eightsegment} "8-Segment LED display editor"}
+ {ascii_c} { "ASCII Chart" {math_matrix} {math_matrix}
+ {ascii_chart} "ASCII Chart"}
+ {toi} { "8051 Instruction Table" {fsview} {fsview}
+ {table_of_instructions} "Interactive table of 8051 instructions"}
{reformat_code} { "Auto indent" {filter} {filter}
{reformat_code} "Reformat source code (Indention level ...)"}
{change_case} { "Change letter case" {change_case} {change_case}
@@ -2666,6 +2928,8 @@ set ICONBAR_ICONS {
{exec_custom_cmd 2} {}}
{about} { "About" {mcu8051ide} {mcu8051ide}
{about} "About MCU 8051 IDE"}
+ {hbook} { "Handbook" contents contents
+ {handbook} "Display the documentation for MCU 8051 IDE"}
{forward} { "Forward" {forward} {1rightarrow}
{next_editor} "Switch to the next editor"}
{back} { "Back" {back} {1leftarrow}
@@ -2677,52 +2941,64 @@ set ICONBAR_ICONS {
{line2addr} { "Jump to line" {goto} {goto}
{simulator_set_PC_by_line} "Translate line number to address in program memory and set PC to that address"}
{stepback} { "Step back" {undo} {undo}
- {stepback} "Step program back by 1 inctruction"}
- {notes} { "Scribble notepad" {pencil} {pencil}
- {notes} "Scribble notepad"}
- {ledpanel} { "LED panel" {ledpanel} {ledpanel}
- {vhw_LED_panel} "LED panel"}
- {leddisplay} { "LED display" {leddisplay} {leddisplay}
- {vhw_LED_display} "LED display"}
- {ledmatrix} { "LED matrix" {ledmatrix} {ledmatrix}
- {vhw_LED_matrix} "LED matrix"}
- {mleddisplay} { "Multiplexed LED display" {mleddisplay} {mleddisplay}
- {vhw_M_LED_display} "Multiplexed LED display"}
- {simplekeypad} { "Simple keypad" {simplekeypad} {simplekeypad}
- {vhw_keys} "Simple keypad"}
- {matrixkeypad} { "Matrix keypad" {matrixkeypad} {matrixkeypad}
- {vhw_matrix_keypad} "Matrix keypad"}
- {vhw_open} { "VHW Open" {fileopen} {fileopen}
+ {stepback} "Step program back by 1 instruction"}
+ {notes} { "Scribble Notepad" {pencil} {pencil}
+ {notes} "Scribble Notepad"}
+ {ledpanel} { "LED Panel" {ledpanel} {ledpanel}
+ {vhw_LED_panel} "LED Panel"}
+ {leddisplay} { "LED Display" {leddisplay} {leddisplay}
+ {vhw_LED_display} "LED Display"}
+ {ledmatrix} { "LED Matrix" {ledmatrix} {ledmatrix}
+ {vhw_LED_matrix} "LED Matrix"}
+ {mleddisplay} { "Multiplexed LED Display" {mleddisplay} {mleddisplay}
+ {vhw_M_LED_display} "Multiplexed LED Display"}
+ {simplekeypad} { "Simple Keypad" {simplekeypad} {simplekeypad}
+ {vhw_keys} "Simple Keypad"}
+ {matrixkeypad} { "Matrix Keypad" {matrixkeypad} {matrixkeypad}
+ {vhw_matrix_keypad} "Matrix Keypad"}
+ {hd44780} { "LCD display (HD44780)" {hd44780} {hd44780}
+ {vhw_HD44780} "LCD display controlled by HD44780"}
+ {ds1620} { "DS1620 thermometer" {ds1620} {ds1620}
+ {vhw_ds1620} "Simulated DS1620 temperature sensor"}
+ {fintr} { "File Interface" {compfile1} {compfile1}
+ {vhw_file_interface} "Read & Write GPIO states from/to a file"}
+ {vhw_open} { "VHW Open" {fileopen} {fileopen}
{open_VHW} "Load VHW connections from a file"}
- {vhw_load} { "VHW Load" {fileimport} {fileimport}
+ {vhw_load} { "VHW Load" {fileimport} {fileimport}
{load_VHW} "Import VHW connections from a file"}
- {vhw_save} { "VHW Save" {filesave} {filesave}
+ {vhw_save} { "VHW Save" {filesave} {filesave}
{save_VHW} "Save current VHW connections to a file"}
- {vhw_saveas} { "VHW Save as" {filesaveas} {filesaveas}
+ {vhw_saveas} { "VHW Save as" {filesaveas} {filesaveas}
{save_as_VHW} "Save current VHW connections under a different name"}
- {vhw_remove_all} { "VHW Remove all" {editdelete} {editdelete}
+ {vhw_remove_all} { "VHW Remove all" {editdelete} {editdelete}
{remove_all_VHW} "Remove all VHW"}
- {bc} { "Base Convertor" {kaboodleloop} {kaboodleloop}
- {base_convertor} "Base Convertor"}
- {fullscreen} { "Toggle fullscreen mode" {window_fullscreen} {window_fullscreen}
- {toggle_fullscreen} "Fullscreen mode"}
- {spec_calc} { "Special calculator" {xcalc} {xcalc}
- {spec_calc} "Special calculator"}
- {stack} { "Show stack" {memory_ST} {kcmmemory_ST}
- {stack_monitor} "Invoke MCU stack monitor"}
- {rs232} { "UART/RS232 Debugger" {_chardevice} {chardevice}
+ {bc} { "Base Converter" {kaboodleloop} {kaboodleloop}
+ {base_converter} "Base Converter"}
+ {fullscreen} { "Toggle full screen mode" {window_fullscreen} {window_fullscreen}
+ {toggle_fullscreen} "Full screen mode"}
+ {spec_calc} { "Special Calculator" {xcalc} {xcalc}
+ {spec_calc} "Special Calculator"}
+ {rs232} { "UART/RS232 Debugger" {_chardevice} {chardevice}
{rs232debugger} "UART/RS232 Debugger"}
}
+# Intentionally hidden functions, these haven't been fully implemented yet
+# {uartmon} { "UART monitor" {__blockdevice} {__blockdevice}
+# {uart_monitor} "Dialog in which you can control UART operations"}
+# {d52} { "Disassemble with D52" {d52} {d52}
+# {d52} "Disassemble object code using D52 disassembler"}
+# {vuterm} { "Virtual UART terminal" {chardevice} {_chardevice}
+# {vhw_UART_terminal} "Simulated UART terminal connected to the MCU simulator"}
## Definition of default main icon bar
# format: {
# item_ID item_ID ...
# }
set ICONBAR_DEFAULT {
- new open | save save_as save_all | close exit | fullscreen |
- project_new project_open | find goto | hibernate resume |
- custom0 custom1 | leddisplay matrixkeypad | notes | assemble |
- start_sim step stepback
+ new open | save save_as save_all
+ | close exit | fullscreen | project_new project_open
+ | find goto | hibernate resume | custom0
+ custom1 | leddisplay matrixkeypad | notes | assemble
+ | start_sim step stepback
}
## Definition of icons current main icon bar
@@ -2731,7 +3007,7 @@ set ICONBAR_DEFAULT {
# }
set ICONBAR_CURRENT {}
-## (Re)draw icon bar acording to $ICONBAR_CURRENT
+## (Re)draw icon bar according to $ICONBAR_CURRENT
# @return void
proc iconbar_redraw {} {
::toolbar::iconbar_redraw
@@ -2793,12 +3069,13 @@ namespace eval toolbar {
if {[regexp {^custom\d+$} $key]} {
regexp {\d+} $key num
setStatusTip -widget $button -text [mc "Custom command %s: %s" $num $::X::custom_command_desc($num)]
+ ::DynamicHelp::add $button -text [mc "Custom command %s: %s" $num $::X::custom_command_desc($num)]
bind $button <ButtonRelease-3> [subst {
- set CUTOM_CMD_MENU_CMD_INDEX $num
- tk_popup $::TOOLBAR_FRAME.cutom_cmd_menu %X %Y
+ set CUSTOM_CMD_MENU_CMD_INDEX $num
+ tk_popup $::TOOLBAR_FRAME.custom_cmd_menu %X %Y
}]
# For normal commands
- } {
+ } else {
setStatusTip -widget $button -text [mc [lindex $def 4]]
bind $button <ButtonRelease-3> {tk_popup $::TOOLBAR_FRAME.menu %X %Y}
}
@@ -2820,7 +3097,7 @@ namespace eval toolbar {
}
}
-## Show/Hide main toolbar acording to value of config variable TOOLBAR_VISIBLE
+## Show/Hide main toolbar according to value of config variable TOOLBAR_VISIBLE
# @return void
proc show_hide_main_toolbar {} {
# Show the toolbar
@@ -2833,7 +3110,7 @@ proc show_hide_main_toolbar {} {
pack forget $::TOOLBAR_FRAME.show_label
}
# Hide the toolbar
- } {
+ } else {
catch {
${::X::actualProject} bottomNB_move_pane_up -11
}
@@ -2874,7 +3151,7 @@ menuFactory {
{command {Clear} {} 1 "GPM_entry_clear" {editdelete} {}}
{separator}
{command {Select all} {Ctrl+A} 0 "GPM_entry_selall" {} {}}
-} .gpm_entry_menu 0 {} 0 {}
+} .gpm_entry_menu 0 {} 0 {} [namespace current]
# Menu for text widgets
menuFactory {
{command {Undo} {Ctrl+Z} 0 "GPM_text_undo" {undo} {}}
@@ -2886,7 +3163,7 @@ menuFactory {
{command {Clear} {} 1 "GPM_text_clear" {editdelete} {}}
{separator}
{command {Select all} {Ctrl+A} 0 "GPM_text_selall" {} {}}
-} .gpm_text_menu 0 {} 0 {}
+} .gpm_text_menu 0 {} 0 {} [namespace current]
# Widget identifiers
set GPM_entry_widget {} ;# Entry widget
@@ -2921,7 +3198,7 @@ proc GPM_entry_key_menu {Widget} {
[expr {[winfo rooty $Widget] + [lindex $bbox 1] + 10}]
}
-## Enable/Disable popup menu items acording to state of the widget
+## Enable/Disable popup menu items according to state of the widget
# For entry widgets. Auxiliary procedure for 'GPM_entry_popup' and 'GPM_entry_key_menu'
# @return void
proc GPM_entry_menu_disena {} {
@@ -2936,7 +3213,7 @@ proc GPM_entry_menu_disena {} {
.gpm_entry_menu entryconfigure [::mc "Cut"] -state normal
}
.gpm_entry_menu entryconfigure [::mc "Copy"] -state normal
- } {
+ } else {
.gpm_entry_menu entryconfigure [::mc "Cut"] -state disabled
.gpm_entry_menu entryconfigure [::mc "Copy"] -state disabled
}
@@ -2974,7 +3251,7 @@ proc GPM_text_key_menu {Widget} {
[expr {[winfo rooty $Widget] + [lindex $bbox 1] + 10}]
}
-## Enable/Disable popup menu items acording to state of the widget
+## Enable/Disable popup menu items according to state of the widget
# For text widgets. Auxiliary procedure for 'GPM_text_popup' and 'GPM_text_key_menu'
# @return void
proc GPM_text_menu_disena {} {
@@ -3152,13 +3429,15 @@ proc GPM_text_selall {} {
}
}
-# FINALIZE BASIC ENVIROMENT INITIALIZATION
+# FINALIZE BASIC ENVIRONMENT INITIALIZATION
# -----------------------------------------
show_hide_main_toolbar ;# Show/Hide Main toolbar
pack [frame .mainFrame] -fill both -expand 1 ;# Frame for central widget
+::Editor::refresh_available_dictionaries ;# Refresh list of available spell checker dictionaries
makeStatusbar {} ;# Create status bar
+::Editor::adjust_spell_checker_config_button ;# Adjust spell checker configuration button to current spell checker configuration
change_validation_level $::CONFIG(VALIDATION_LEVEL) ;# Restore previous validation level
-::X::initialize ;# Intialize X NS
+::X::initialize ;# Initialize X NS
::KIFSD::FSD::load_config_array $::CONFIG(KIFSD_CONFIG) ;# Restore configuration of file selection dialog
::HexEditDlg::loadConfig $::CONFIG(HEXEDIT_CONFIG) ;# Restore hexaeditor configuration
::KIFSD::FSD::set_bookmark_change_command {::X::refresh_bookmarks_in_fs_browsers}
@@ -3169,16 +3448,22 @@ if {$show_welcome_dialog} {
set X::critical_procedure_in_progress 0
X::__welcome_dialog
set X::critical_procedure_in_progress 1
-} elseif {${GLOBAL_CONFIG(tips)}} {
+} elseif {${::GLOBAL_CONFIG(tips)}} {
X::__tip_of_the_day
}
# Create project notebook
# -----------------------------------------
-NoteBook .mainFrame.mainNB -side top -arcradius 4 -bd 1 -bg {#EEEEEE}
+set ::main_nb [ModernNoteBook .mainFrame.mainNB -autohide 1]
# Project details window
-.mainFrame.mainNB bindtabs <Enter> {::X::create_project_details}
-.mainFrame.mainNB bindtabs <Motion> {::X::project_details_move}
-.mainFrame.mainNB bindtabs <Leave> {::X::close_project_details}
-.mainFrame.mainNB bindtabs <ButtonRelease-3> {::X::invoke_project_menu %X %Y}
+${::main_nb} bindtabs <Enter> {::X::create_project_details}
+${::main_nb} bindtabs <Motion> {::X::project_details_move}
+${::main_nb} bindtabs <Leave> {::X::close_project_details}
+${::main_nb} bindtabs <ButtonRelease-3> {::X::invoke_project_menu %X %Y}
+
+bind Menu <Map> ::X::remove_all_help_windows
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/external_command.tcl b/lib/external_command.tcl
index 959cd29..552a73a 100755..100644
--- a/lib/external_command.tcl
+++ b/lib/external_command.tcl
@@ -1,8 +1,11 @@
-#!/usr/bin/tclsh
+#!/bin/sh
+# the next line restarts using wish \
+exec tclsh "$0" "$@"
+
# 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 +24,11 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _EXTERNAL_COMMAND_TCL ] } {
+set _EXTERNAL_COMMAND_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Send input read from strandard input to certain Tk application via
@@ -36,12 +44,13 @@
# --------------------------------------------------------------------------
# Initialize
+encoding system {utf-8}
package require Tk
wm withdraw .
wm command . "$argv0 $argv"
wm client . [info hostname]
-# Partse agruments
+# Parse agruments
set target_app [lindex $argv 0]
set final_cmd [lindex $argv 1]
set line_cmd [lindex $argv 2]
@@ -69,39 +78,8 @@ if {$::MICROSOFT_WINDOWS} {
proc secure_send args {
if {[catch {
eval "send $args"
- } result]} {
- puts "Unknown IO Error :: $result"
- tk_messageBox \
- -title "Unknown IO Error" \
- -icon error \
- -type ok \
- -message "$result"
-
- if {[ \
- tk_messageBox \
- -title "X server security workaround" \
- -icon warning \
- -type yesno \
- -message "If the error was related to X server security, it is possible to temporarily workaround it by running this command: \"/bin/sh << 'for i in `xhost`; do xhost -\$i; done'\"\n\nDo you want to do it ?"
- ] == {yes}} then {
- catch {
- exec -- /bin/sh << {xhost -; for i in `xhost`; do xhost -$i; done}
- }
- } else {
- exit 1
- }
-
- if {[catch {
- eval "send $args"
- }]} {
- tk_messageBox \
- -title "Workaround failed" \
- -icon error \
- -type ok \
- -message "Sorry this doesn't work ...\nIt's a strange bug somewhere in your operating system"
- exit 1
- }
-
+ } result]} then {
+ puts stderr "Unknown IO Error :: $result"
return 1
} else {
@@ -119,7 +97,7 @@ if {$line_cmd == {}} {
if {!${::MICROSOFT_WINDOWS}} {
secure_send $target_app $final_cmd "{" [regsub -all {[\{\}]} $result {\\&}] "}"
- } {
+ } else {
dde eval $target_app $final_cmd "{ [regsub -all {[\{\}]} $result {\\&}] }"
}
@@ -128,16 +106,20 @@ if {$line_cmd == {}} {
while {![eof stdin]} {
if {!${::MICROSOFT_WINDOWS}} {
secure_send $target_app $line_cmd "{" [regsub -all {[\{\}]} [gets stdin] {\\&}] "}"
- } {
+ } else {
dde eval $target_app $line_cmd "{ [regsub -all {[\{\}]} [gets stdin] {\\&}] }"
}
}
if {!${::MICROSOFT_WINDOWS}} {
secure_send $target_app $final_cmd
- } {
+ } else {
dde eval $target_app $final_cmd
}
}
exit 0
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/leftpanel/filelist.tcl b/lib/leftpanel/filelist.tcl
index c5f5c14..4c65e36 100755..100644
--- a/lib/leftpanel/filelist.tcl
+++ b/lib/leftpanel/filelist.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,12 +21,17 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _FILELIST_TCL ] } {
+set _FILELIST_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Provides:
# - List of opened files
# - List of project files
-# - Filesystem browser
+# - File system browser
# - Management of opened files, project files and code editors
# --------------------------------------------------------------------------
@@ -42,7 +47,7 @@ class FileList {
# String: Textvariable for dialog "Open with ..."
common open_with ${::CONFIG(OPEN_WITH_DLG)}
common open_with_cnfr 0 ;# Bool: Confirm dialog "Open with ..."
- common count 0 ;# Instances counter
+ common fl_lst_count 0 ;# Instances counter
common file_indexes {} ;# List of line indexes (auxiliary variable for opening multiple files)
common ac_index_in_fl ;# Index of actual editor filelist
common default_encoding {utf-8} ;# Default encoding
@@ -55,7 +60,7 @@ class FileList {
}
# Font for opened file in project files list
common opened_file_font [font create \
- -weight bold \
+ -weight normal \
-slant roman \
-size -12 \
-family $::DEFAULT_FIXED_FONT \
@@ -69,6 +74,8 @@ class FileList {
]
# Font for icon borders
common icon_border_font [font create \
+ -weight normal \
+ -slant roman \
-size -12 \
-family $::DEFAULT_FIXED_FONT \
]
@@ -115,12 +122,12 @@ class FileList {
{command {Move to bottom} {} 12 "filelist_move_bottom" {bottom}
"Move this file to the bottom of the list"}
{separator}
- {cascade "Sort items by" 11 "" .sort_by false 1 {
+ {cascade "Sort items by" 11 "sort_incr" .sort_by false 1 {
{command {Document Name} {} 9 "sort_file_list N 1" {} {}}
{command {File URL} {} 5 "sort_file_list U 1" {} {}}
{command {File Size in B} {} 5 "sort_file_list S 1" {} {}}
}}
- {cascade "Open with" 6 "" .open_with false 1 {
+ {cascade "Open with" 6 "fileopen" .open_with false 1 {
{command {gvim} {} 1 "filelist_open_with 1 gvim" {gvim} {}}
{command {emacs} {} 1 "filelist_open_with 1 emacs" {emacs} {}}
{command {kwrite} {} 0 "filelist_open_with 1 kwrite" {kwrite} {}}
@@ -211,7 +218,7 @@ class FileList {
}
## PUBLIC
- public variable actualEditor ;# Object number of currently selected editor
+ public variable actualEditor 0 ;# Object number of currently selected editor
public variable actualEditor2 -2 ;# Object number of currently selected editor in the second view
public variable ProjectDir ;# Reference to directory of actual project
public variable editors {} ;# list of editor objects
@@ -284,9 +291,11 @@ class FileList {
private variable PanelVisible $::CONFIG(LEFT_PANEL) ;# Bool: panel visible
private variable PanelSize $::CONFIG(LEFT_PANEL_SIZE) ;# Panel width (in pixels)
- private variable editor_to_freeze_obj ;# Object: Editor to freeze after simulator startup
+ private variable editor_to_freeze_obj ;# Object: Editor to freeze after simulator start-up
private variable filetabs_frm ;# Widget: Frame contaning the tab bar
private variable filetabs_nb ;# Widget: Tab bar's notebook widget
+ private variable switchfile_in_progress 0 ;# Bool: Method switchfile is in progress
+ private variable last_selected_item {} ;# String: ID of the last selected opened file
## PROTECTED
protected variable file_count 0 ;# counter of opened files
@@ -300,8 +309,8 @@ class FileList {
## object constructor
constructor {} {
# increment instance counter
- incr count
- set obj_idx $count
+ incr fl_lst_count
+ set obj_idx $fl_lst_count
}
## Object destructor
@@ -322,7 +331,7 @@ class FileList {
# @parm List filelist - List of files to open (full filenames including path)
# @parm Bool editor_sw_lock - Enable aoutomatic file switching during simulation
# @return void
- public method initiate_FileList {parentPane projectDir FileList editor_sw_lock} {
+ public method initalize_FileList {parentPane projectDir FileList editor_sw_lock} {
# Object variables
set parent $parentPane ;# ID of parent container widget
@@ -335,36 +344,34 @@ class FileList {
# Create notebook frame
set leftPanel [frame $parentPane.frm_FileList_leftPanel]
# Create notebook
- set notebook [NoteBook $leftPanel.nb_FileList \
- -side top -arcradius 4 -bg {#EEEEEE} \
- ]
+ set notebook [ModernNoteBook $leftPanel.nb_FileList]
# Create tab "Hide"
$notebook insert end "button_SH" -image ::ICONS::16::2leftarrow \
- -raisecmd "$this filelist_show_hide" \
+ -raisecmd [list $this filelist_show_hide] \
-helptext [mc "Hide this panel"]
# Create tab for list of opened files
set listbox_opened_files_frame [$notebook insert end "opened_files" \
-image ::ICONS::16::fileopen \
- -raisecmd "$this Left_panel_set_active_page opened_files" \
+ -raisecmd [list $this Left_panel_set_active_page opened_files] \
-helptext [mc "Opened files"] \
]
# Create tab for list of project files
set listbox_project_files_frame [$notebook insert end "project_files" \
-image ::ICONS::16::project_open \
- -raisecmd "$this Left_panel_set_active_page project_files" \
+ -raisecmd [list $this Left_panel_set_active_page project_files] \
-helptext [mc "Files in the project"] \
]
# Create tab for file system browser
set fs_browser_frame [$notebook insert end "fs_browser" \
-image ::ICONS::16::exec \
- -raisecmd "$this Left_panel_set_active_page fs_browser" \
- -helptext [mc "Filesystem browser"] \
+ -raisecmd [list $this Left_panel_set_active_page fs_browser] \
+ -helptext [mc "File system browser"] \
-createcmd [list $this CreateFSBrowserGUI] \
]
# Create tab for SFR watches
set sfr_watches_frame [$notebook insert end "sfr_watches" \
-image ::ICONS::16::kcmmemory \
- -raisecmd "$this Left_panel_set_active_page sfr_watches" \
+ -raisecmd [list $this Left_panel_set_active_page sfr_watches] \
-helptext [mc "List of SFR's"] \
-createcmd [list $this CreateSFRWatchesGUI] \
]
@@ -377,9 +384,9 @@ class FileList {
# Register notebook status bar tips
notebook_Sbar_set {filelist} [list \
button_SH [mc "Hide the panel"] \
- opened_files [mc "Opended files"] \
+ opened_files [mc "Opened files"] \
project_files [mc "Files of the current project"] \
- fs_browser [mc "Filesystem browser"] \
+ fs_browser [mc "File system browser"] \
sfr_watches [mc "Special Function Registers"] \
]
$notebook bindtabs <Enter> "notebook_Sbar filelist"
@@ -389,7 +396,6 @@ class FileList {
set lsbox_frame [frame $listbox_opened_files_frame.lsbox_frame]
set listbox_opened_files_bm [text $lsbox_frame.icon_border \
-font $icon_border_font \
- -cursor left_ptr \
-width 2 \
-bd 0 \
-pady 1 \
@@ -397,17 +403,23 @@ class FileList {
-bg {#DDDDDD} \
-exportselection 0 \
-takefocus 0 \
- -cursor hand1 \
+ -cursor hand2 \
]
$listbox_opened_files_bm tag configure center -justify center
$listbox_opened_files_bm delete 1.0 end
setStatusTip -widget $listbox_opened_files_bm \
-text [mc "Bookmarks for opened files"]
set listbox_opened_files [ListBox $lsbox_frame.listbox_opened_files \
- -selectmode single -selectfill 0 -bg white \
- -selectbackground white -highlightcolor {#BBBBFF} \
- -selectforeground {#0000FF} -bd 1 \
- -highlightthickness 0 -deltay 15 -padx 14 \
+ -selectmode single \
+ -selectfill 0 \
+ -bg {#FFFFFF} \
+ -selectbackground {#FFFFFF} \
+ -highlightcolor {#BBBBFF} \
+ -selectforeground {#0000FF} \
+ -bd 1 \
+ -highlightthickness 0 \
+ -deltay 15 \
+ -padx 14 \
-yscrollcommand "$this filelist_o_scrollbar_set" \
]
setStatusTip -widget $listbox_opened_files \
@@ -420,7 +432,7 @@ class FileList {
# Create popup menu for icon border
set IB_o_menu $listbox_opened_files_bm.ib_o_menu
- menuFactory $OPENEDFILESIBMENU $IB_o_menu 0 "$this " 0 {}
+ menuFactory $OPENEDFILESIBMENU $IB_o_menu 0 "$this " 0 {} [namespace current]
# Create bottom frame
set listbox_opened_files_bottom_frame [frame $listbox_opened_files_frame.bottom_frame]
@@ -474,6 +486,9 @@ class FileList {
# Frame for opened files
set listbox_opened_files_top_frame [frame \
$listbox_opened_files_frame.listbox_opened_files_top_frame]
+ pack [label $listbox_opened_files_top_frame.listbox_opened_files_label \
+ -text [mc "Opened Files:"] -anchor w \
+ ] -fill x -side top -anchor w -pady 5
# Button box for "Opened files"
set opened_files_buttonBox [frame \
$listbox_opened_files_top_frame.opened_files_buttonBox]
@@ -481,22 +496,18 @@ class FileList {
set main_frame [frame $parentPane.main_frame]
# Create filetabs notebook
- set filetabs_frm [frame $main_frame.filetabs_frm -height 16]
+ set filetabs_frm [frame $main_frame.filetabs_frm]
pack [ttk::button $filetabs_frm.add_button \
-image ::ICONS::16::filenew \
-command {::X::__new} \
-style Flat.TButton \
- ] -side left
- set filetabs_nb [NoteBook $filetabs_frm.filetabs_nb \
- -side top -arcradius 4 -bg {#EEEEEE} \
- -font [font create -family {Helvetica} -size -12] \
- ]
- pack configure $filetabs_nb.c -fill x -expand 0
- pack $filetabs_nb -fill x -anchor sw -side left -expand 1
- $filetabs_nb bindtabs <Enter> "$this file_details_win_create_from_ftnb"
- $filetabs_nb bindtabs <Leave> "$this file_details_win_hide"
- $filetabs_nb bindtabs <Motion> "$this file_details_win_move"
- $filetabs_nb bindtabs <ButtonRelease-3> "$this filetabs_nb_popup_menu %X %Y"
+ ] -side left
+ set filetabs_nb [ModernNoteBook $filetabs_frm.filetabs_nb -nomanager 1]
+ pack [$filetabs_nb get_nb] -fill x -anchor sw -side left -expand 1
+ $filetabs_nb bindtabs <Enter> [list $this file_details_win_create_from_ftnb]
+ $filetabs_nb bindtabs <Leave> [list $this file_details_win_hide]
+ $filetabs_nb bindtabs <Motion> [list $this file_details_win_move]
+ $filetabs_nb bindtabs <ButtonRelease-3> [list $this filetabs_nb_popup_menu %X %Y]
pack [ttk::button $filetabs_frm.close_button \
-image ::ICONS::16::fileclose \
-command {::X::__close} \
@@ -527,7 +538,7 @@ class FileList {
"Move selected file to the top of the list"}
{bottom "Move item to bottom" {bottom} {filelist_move_bottom}
"Move selected file to the bottom of the list"}
- }
+ } [namespace current]
# Pack GUI components of tab "Opened files"
pack $opened_files_buttonBox -side left
@@ -543,7 +554,6 @@ class FileList {
set ls_frame [frame $listbox_project_files_frame.ls_frame]
set listbox_project_files_bm [text $ls_frame.icon_border \
-font $icon_border_font \
- -cursor left_ptr \
-width 2 \
-bd 0 \
-pady 1 \
@@ -551,16 +561,22 @@ class FileList {
-bg {#DDDDDD} \
-exportselection 0 \
-takefocus 0 \
- -cursor hand1 \
+ -cursor hand2 \
]
$listbox_project_files_bm delete 1.0 end
$listbox_project_files_bm tag configure center -justify center
setStatusTip -widget $listbox_project_files_bm \
-text [mc "Bookmarks for project files"]
set listbox_project_files [ListBox $ls_frame.listbox_project_files \
- -selectmode single -highlightthickness 0 -bd 1 -padx 0 \
- -selectbackground white -bg white -deltay 15 \
- -selectforeground {#0000FF} -highlightcolor {#BBBBFF} \
+ -selectmode single \
+ -highlightthickness 0 \
+ -bd 1 \
+ -padx 0 \
+ -selectbackground {#FFFFFF} \
+ -bg {#FFFFFF} \
+ -deltay 15 \
+ -selectforeground {#0000FF} \
+ -highlightcolor {#BBBBFF} \
-yscrollcommand "$this filelist_p_scrollbar_set" \
]
setStatusTip -widget $listbox_project_files \
@@ -573,7 +589,7 @@ class FileList {
# Create popup menu for icon border
set IB_p_menu $listbox_project_files.ib_o_menu
- menuFactory $PROJECTFILESIBMENU $IB_p_menu 0 "$this " 0 {}
+ menuFactory $PROJECTFILESIBMENU $IB_p_menu 0 "$this " 0 {} [namespace current]
# Create search panel
set search_panel [frame $listbox_project_files_frame.search_panel]
@@ -584,7 +600,7 @@ class FileList {
]
DynamicHelp::add $project_search_entry -text [mc "Search for file"]
setStatusTip -widget $project_search_entry \
- -text [mc "Search for certain file name in list of project files"]
+ -text [mc "Search for certain file name in list of project files"]
pack $project_search_entry -side left -fill x -expand 1
set project_search_clear_button [ttk::button \
$search_panel.clear_button \
@@ -602,7 +618,7 @@ class FileList {
# Create header (label and icon bar) for tab "Project files"
set topFrame [frame $listbox_project_files_frame.listbox_project_files_top_frame]
pack [label $topFrame.listbox_project_files_label \
- -text [mc "Project files:"] -anchor w \
+ -text [mc "Project Files:"] -anchor w \
] -fill x -side top -anchor w -pady 5
set project_files_buttonBox [frame $topFrame.listbox_project_files_buttonBox]
pack $project_files_buttonBox -side bottom -anchor w -expand 0
@@ -624,7 +640,7 @@ class FileList {
{remove "Remove this file from the project" {editdelete}
{filelist_remove_file_from_project}
"Exclude this file from list of files of this project"}
- }
+ } [namespace current]
# Evaluate icon bars button states (tab "Project files")
FileList_project_disEna_buttons
@@ -668,15 +684,15 @@ class FileList {
DynamicHelp::add $button_bar.but_proj_open -text [mc "Files in the current project"]
setStatusTip -widget $button_bar.but_proj_open \
-text [mc "Files of the current project"]
- # Button "Filesystem browser"
+ # Button "File system browser"
pack [ttk::button $button_bar.but_fs_browser \
-image ::ICONS::16::exec \
-style ToolButton.TButton \
-command "$this filelist_show_up fs_browser" \
]
- DynamicHelp::add $button_bar.but_fs_browser -text [mc "Filesystem browser"]
+ DynamicHelp::add $button_bar.but_fs_browser -text [mc "File system browser"]
setStatusTip -widget $button_bar.but_fs_browser \
- -text [mc "Filesystem browser"]
+ -text [mc "File system browser"]
# Button "SFR watches"
pack [ttk::button $button_bar.but_sfr_watches \
-image ::ICONS::16::kcmmemory \
@@ -689,13 +705,13 @@ class FileList {
# Show the left panel
if {$PanelVisible != 0} {
- pack $notebook -expand 1 -fill both
+ pack [$notebook get_nb] -expand 1 -fill both -padx 5 -pady 5
# Raise active page in the panel notebook
catch {
$notebook raise $active_page
}
- } {
+ } else {
set last_sash $PanelSize
pack $button_bar -side top -anchor nw
}
@@ -741,7 +757,7 @@ class FileList {
# Create popup menus
set opened_files_menu $listbox_opened_files.opened_files_menu
set project_files_menu $listbox_project_files.project_files_menu
- set filetabs_pu_menu $filetabs_nb.filetabs_pu_menu
+ set filetabs_pu_menu [$filetabs_nb get_nb].filetabs_pu_menu
filelist_makePopupMenu
# Create Editor object for each file in $filelist and insert it into ListBox of opened files
@@ -786,7 +802,7 @@ class FileList {
$actualEditor < [llength $editors]
&&
$actualEditor >= 0
- } { ;# Valid value
+ } then { ;# Valid value
$listbox_opened_files selection set [lindex [$listbox_opened_files items] $actualEditor]
set actualEditor -1
switchfile
@@ -795,7 +811,7 @@ class FileList {
set actualEditor -1
if {![llength $editors]} {
editor_new
- } {
+ } else {
$listbox_opened_files selection set [lindex [$listbox_opened_files items] 0]
switchfile
}
@@ -822,20 +838,20 @@ class FileList {
if {$pwin_orient == {vertical}} {
if {!$multiview_sash_pos} {
- set multiview_sash_pos [expr {[winfo width $pagesManager] / 2}]
- }
- set minsize 300
- } {
- if {!$multiview_sash_pos} {
set multiview_sash_pos [expr {[winfo height $pagesManager] / 2}]
}
set minsize 80
+ } else {
+ if {!$multiview_sash_pos} {
+ set multiview_sash_pos [expr {[winfo width $pagesManager] / 2}]
+ }
+ set minsize 300
}
$multiview_paned_win paneconfigure $pagesManager -minsize $minsize
$multiview_paned_win paneconfigure $pagesManager2 -minsize $minsize
pack [[lindex $editors $actualEditor2] cget -ed_sc_frame] \
-in $pagesManager2 -fill both -expand 1
- } {
+ } else {
pack $pagesManager -fill both -expand 1
}
foreach editor $editors {
@@ -843,12 +859,12 @@ class FileList {
}
# Set panel width
- update idle
+ update idletasks
if {$PanelVisible != 0} {
$parent paneconfigure $leftPanel -minsize 155
$parent configure -sashwidth 2
$parent sash place 0 $PanelSize 0
- } {
+ } else {
$parent paneconfigure $leftPanel -minsize 0
$parent configure -sashwidth 0
$parent sash place 0 25 2
@@ -858,10 +874,10 @@ class FileList {
# Update multiview sash position
if {$splitted} {
- update idle
+ update idletasks
if {$pwin_orient == {vertical}} {
$multiview_paned_win sash place 0 0 $multiview_sash_pos
- } {
+ } else {
$multiview_paned_win sash place 0 $multiview_sash_pos 0
}
}
@@ -890,7 +906,7 @@ class FileList {
set eol [lindex $file_eol $index]
set read_only [lindex $file_ro_mode $index]
regexp -line -- {^.*$} [$this get_file_notes_data $index] note
- } {
+ } else {
if {![$listbox_project_files exists $item]} {
return
}
@@ -901,7 +917,7 @@ class FileList {
set eol [lindex $data 1]
set encoding [lindex $data 2]
set read_only [lindex $data 3]
- } {
+ } else {
set filename "[lindex $data 5][lindex $data 0]"
set eol [lindex $data 8]
set encoding [lindex $data 9]
@@ -919,7 +935,6 @@ class FileList {
# Create window
set ::FILEDETAILSWIN [frame .file_details_win -bg {#AADDFF}]
set file_details_win [frame ${::FILEDETAILSWIN}.frm -bg {#FFFFFF}]
- bind ${::FILEDETAILSWIN} <Button-1> "catch {destroy ${::FILEDETAILSWIN}}"
# Determinate file type and set appropriate icon
set ext [string trimleft [file extension $filename] {.}]
@@ -987,7 +1002,7 @@ class FileList {
}
if {$size < 1024} {
append size { B}
- } {
+ } else {
set kB [expr {$size / 1024}]
set B [expr {$size % 1024}]
set MB [expr {$kB / 1024}]
@@ -1021,8 +1036,12 @@ class FileList {
-fg {#0000AA} \
-anchor w -bg {#FFFFFF} \
] -row 0 -column 0 -sticky w -pady 0
+ set path [file dirname $filename]
+ if {$::MICROSOFT_WINDOWS} {
+ regsub -all {/} $path "\\" path
+ }
grid [label $main_frame.path_value \
- -text [file dirname $filename] \
+ -text $path \
-anchor w -bg {#FFFFFF} \
] -row 0 -column 1 -sticky w -pady 0
@@ -1116,6 +1135,17 @@ class FileList {
] -row 9 -column 0 -sticky w -pady 0 -columnspan 2
}
+ # Configure the window in a way that it will close when the user clicks on it
+ foreach w [concat $file_details_win \
+ $main_frame \
+ [pack slaves $file_details_win] \
+ [pack slaves $header] \
+ [grid slaves $main_frame] \
+ ] \
+ {
+ bind $w <Button-1> [list $this file_details_win_hide]
+ }
+
# Pack main frame
grid columnconfigure $main_frame 0 -minsize 90
pack $main_frame -fill both -expand 1 -padx 8 -pady 3
@@ -1167,14 +1197,14 @@ class FileList {
destroy $filetabs_pu_menu
}
- menuFactory $PROJECTFILESMENU $project_files_menu 0 "$this " 0 {}
- menuFactory $OPENEDFILESMENU $opened_files_menu 0 "$this " 0 {}
- menuFactory $FILETABSPUMENU $filetabs_pu_menu 0 "$this " 0 {}
+ menuFactory $PROJECTFILESMENU $project_files_menu 0 "$this " 0 {} [namespace current]
+ menuFactory $OPENEDFILESMENU $opened_files_menu 0 "$this " 0 {} [namespace current]
+ menuFactory $FILETABSPUMENU $filetabs_pu_menu 0 "$this " 0 {} [namespace current]
foreach program {gvim emacs kwrite gedit} \
program_name {gvim emacs kwrite gedit} \
{
- if {!$::PROGRAM_AVALIABLE($program)} {
+ if {!$::PROGRAM_AVAILABLE($program)} {
foreach menu [list $project_files_menu $opened_files_menu $filetabs_pu_menu] {
${menu}.open_with entryconfigure [::mc $program_name] -state disabled
}
@@ -1192,14 +1222,21 @@ class FileList {
}
## Reload the current file
+ # @parm Object target_editor - Editor object where the reload is supposed to take place
+ # @parm Bool force - Don't ask whether the file should be saved first, in case it was modified
# @return Bool - result
- public method filelist_reload_file {} {
- if {$splitted && $selectedView} {
- set editor_idx $actualEditor2
- } {
- set editor_idx $actualEditor
+ public method filelist_reload_file {{target_editor {}} {force 0}} {
+ if {$target_editor == {}} {
+ if {$splitted && $selectedView} {
+ set editor_idx $actualEditor2
+ } else {
+ set editor_idx $actualEditor
+ }
+ set editor [lindex $editors $editor_idx]
+ } else {
+ set editor_idx [lsearch -ascii -exact $editors $target_editor]
+ set editor $target_editor
}
- set editor [lindex $editors $editor_idx]
# Local variables
set fullFileName [$editor cget -fullFileName] ;# Full filename
@@ -1209,7 +1246,7 @@ class FileList {
![file exists $fullFileName] ||
[file isdirectory $fullFileName] ||
(!$::MICROSOFT_WINDOWS && ![file readable $fullFileName])
- } {
+ } then {
tk_messageBox \
-title [mc "File not found"] \
-icon error \
@@ -1221,7 +1258,7 @@ class FileList {
if {$fullFileName != {}} {
# Prompt user is the file was modified
- if {[$editor cget -modified] != 0} {
+ if {!$force && ([$editor cget -modified] != 0)} {
set response [tk_messageBox \
-title [mc "Are you sure ?"] \
-icon question \
@@ -1254,9 +1291,11 @@ class FileList {
fconfigure $file -encoding $enc
set data {}
if {[regsub -all {[\u0000-\u0008\u000B-\u000C\u000E-\u001F\u007F-\u009F]} [read $file] {} data]} {
- tk_messageBox -parent . \
- -type ok -icon warning \
- -title [mc "Binary File Opened - MCU 8015 IDE"] \
+ tk_messageBox \
+ -parent . \
+ -type ok \
+ -icon warning \
+ -title [mc "Binary File Opened - MCU 8015 IDE"] \
-message [mc "The file %s is binary, saving it will result corrupted file." $fullFileName]
}
[$editor cget -editor] insert end [regsub -all {\r\n?} $data "\n"]
@@ -1376,13 +1415,17 @@ class FileList {
$this todo_switch_editor $ac
if {${::ASMsyntaxHighlight::validation_L1}} {
[lindex $editors $actualEditor] parse_current_line
- } {
+ } else {
[lindex $editors $actualEditor] adjust_instruction_details
}
set file_indexes {}
}
+ public method is_splitted {} {
+ return $splitted
+ }
+
## Switch from Normal mode to Simulator mode
# @return void
public method freeze {} {
@@ -1393,7 +1436,7 @@ class FileList {
# Freeze editor
if {$splitted && $selectedView} {
set editor_to_freeze $actualEditor2
- } {
+ } else {
set editor_to_freeze $actualEditor
}
set idx 0
@@ -1401,7 +1444,7 @@ class FileList {
if {$idx == $editor_to_freeze} {
$editor freeze
set editor_to_freeze_obj $editor
- } {
+ } else {
$editor disable
}
incr idx
@@ -1414,7 +1457,7 @@ class FileList {
$project_files_menu entryconfigure [::mc "Close file"] -state disabled
}
- ## This method should be called immediately after simulator startup
+ ## This method should be called immediately after simulator start-up
#+ in order to inform editors about the change
# @return void
public method now_frozen {} {
@@ -1446,13 +1489,21 @@ class FileList {
$project_files_menu entryconfigure [::mc "Close file"] -state normal
if {$simulator_editor_obj != {}} {
- $listbox_opened_files itemconfigure [lindex \
- $file_descriptors [lsearch -ascii -exact \
- $editors $simulator_editor_obj \
- ] \
- ] -fg {#000000}
+ set idx [lsearch -ascii -exact $editors $simulator_editor_obj]
+ if {$idx != -1} {
+ $listbox_opened_files itemconfigure [lindex $file_descriptors $idx] -fg {#000000}
+ } else {
+ set simulator_editor_obj {}
+ }
}
set simulator_editor_obj {}
+
+ if {$splitted && $selectedView} {
+ set editor_idx $actualEditor2
+ } else {
+ set editor_idx $actualEditor
+ }
+ focus -force [[lindex $editors $editor_idx] cget -editor]
}
## Set variable containing ID of active page
@@ -1471,12 +1522,12 @@ class FileList {
public method getLeftPanelSize {} {
if {$PanelVisible} {
return $PanelSize
- } {
+ } else {
return $last_sash
}
}
- ## Set panel width acording to current sash position
+ ## Set panel width according to current sash position
# @return void
public method left_panel_set_size {} {
set PanelSize [lindex [$parent sash coord 0] 0]
@@ -1497,12 +1548,12 @@ class FileList {
if {$PanelVisible} {
$parent paneconfigure $leftPanel -minsize 0
- pack forget $notebook
+ pack forget [$notebook get_nb]
# Show button bar
pack $button_bar -side top -anchor nw
# Move the paned window sash and remember current position
set last_sash [lindex [$parent sash coord 0] 0]
- update idle
+ update idletasks
$parent sash place 0 25 2
# Hide the sash
bind $parent <Button> {break}
@@ -1512,16 +1563,16 @@ class FileList {
return 0
# Show the panel
- } {
+ } else {
$parent paneconfigure $leftPanel -minsize 155
$notebook raise $active_page
# Hide button bar
pack forget $button_bar
# Show the panel
- pack $notebook -expand 1 -fill both
+ pack [$notebook get_nb] -expand 1 -fill both -padx 5 -pady 5
# Restore the paned window sash position to the previous state
- update idle
+ update idletasks
$parent sash place 0 $last_sash 0
# Show the sash
bind $parent <Button> {}
@@ -1548,11 +1599,17 @@ class FileList {
set index [$listbox_opened_files index $item] ;# Item index
set target [expr {$index - 1}] ;# Target index
+ if {$last_selected_item == $item} {
+ return
+ }
+ set last_selected_item $item
+
# 1st item cannot be moved up
if {$index == 0} {return}
- # Move item in listbox
+ # Move item in listbox and the notebook
$listbox_opened_files move $item $target
+ $filetabs_nb move $item $target
# Move item in list of bookmarks and icon border
if {[lindex $opened_files_bookmarks $index] != [lindex $opened_files_bookmarks $target]} {
# Determinate bookmark flag for source and target index
@@ -1568,12 +1625,12 @@ class FileList {
$listbox_opened_files_bm delete $target.0 [list $target.0 lineend]
if {$trg_bm} {
$listbox_opened_files_bm image create $index.0 \
- -image ::ICONS::16::bookmark \
+ -image ::ICONS::16::bookmark \
-align center
}
if {$idx_bm} {
$listbox_opened_files_bm image create $target.0 \
- -image ::ICONS::16::bookmark \
+ -image ::ICONS::16::bookmark \
-align center
}
}
@@ -1595,6 +1652,7 @@ class FileList {
# Move item in listbox
$listbox_opened_files move $item $target
+ $filetabs_nb move $item $target
# Move item in list of bookmarks and icon border
if {[lindex $opened_files_bookmarks $index] != [lindex $opened_files_bookmarks $target]} {
# Determinate bookmark flag for source and target index
@@ -1633,6 +1691,7 @@ class FileList {
# Move item
$listbox_opened_files move $item 0
+ $filetabs_nb move $item 0
# Move item in list of bookmarks
set bm [lindex $opened_files_bookmarks $index]
set opened_files_bookmarks [lreplace $opened_files_bookmarks $index $index]
@@ -1660,6 +1719,7 @@ class FileList {
# Move item in listbox
$listbox_opened_files move $item end
+ $filetabs_nb move $item end
# Move item in list of bookmarks
set bm [lindex $opened_files_bookmarks $index]
set opened_files_bookmarks [lreplace $opened_files_bookmarks $index $index]
@@ -1682,6 +1742,11 @@ class FileList {
## Show up editor asociated with the currently selected item in the file list (opened files)
# @return void
public method switchfile {} {
+ if {$switchfile_in_progress} {
+ return
+ }
+ set switchfile_in_progress 1
+
# Ensure that autocompletion window is closed
::Editor::close_completion_popup_window_NOW
@@ -1691,6 +1756,10 @@ class FileList {
# Adjust filetabs notebook
set page [lindex [$filetabs_nb pages] $editor_idx]
+ if {$page == {}} {
+ set switchfile_in_progress 0
+ return
+ }
$filetabs_nb raise $page
$filetabs_nb see $page
@@ -1699,13 +1768,13 @@ class FileList {
if {$editor_idx == $actualEditor} {
set selectedView 0
}
- } {
+ } else {
if {$editor_idx == $actualEditor2} {
set selectedView 1
}
}
- # Show up the coresponding editor
+ # Show up the corresponding editor
rightPanel_switch_editor_vars $editor_idx
$this todo_switch_editor_vars $editor_idx
# Right/Bottom view selected
@@ -1724,7 +1793,7 @@ class FileList {
set editor [lindex $editors $actualEditor2]
# Left/Top view selected
- } {
+ } else {
if {$editor_idx != $actualEditor} {
if {!$do_not_forget_editor && $actualEditor >= 0} {
set editor [lindex $editors $actualEditor]
@@ -1741,10 +1810,11 @@ class FileList {
set do_not_forget_editor 0
$opened_search_entry delete 0 end
- update idle
+ update idletasks
editor_procedure {} Configure {}
editor_procedure {} scroll {scroll +0 lines}
editor_procedure {} highlight_visible_area {}
+ editor_procedure {} check_file_change_notif {}
update
rightPanel_switch_page $editor_idx
$this todo_switch_editor $editor_idx
@@ -1756,13 +1826,13 @@ class FileList {
# Adjust command line status
if {$editor_command_line_on} {
$editor cmd_line_force_on
- } {
+ } else {
$editor cmd_line_force_off
}
# Adjust tab "Instruction details" on the right panel
if {${::ASMsyntaxHighlight::validation_L1}} {
$editor parse_current_line
- } {
+ } else {
$editor adjust_instruction_details
}
# move arrow image
@@ -1776,6 +1846,8 @@ class FileList {
${::editor_RO_MODE} [expr {[$editor get_language] == 1}]
# Focus on the editor
focus -force [$editor cget -editor]
+ update
+ set switchfile_in_progress 0
}
## Switch to the next editor
@@ -1809,7 +1881,7 @@ class FileList {
if {$item == $actualEditor || $item == $actualEditor2} {
set item {end-1}
}
- } {
+ } else {
set item {end}
}
$listbox_opened_files selection set [lindex $file_descriptors $item]
@@ -1825,7 +1897,7 @@ class FileList {
# Is the file part of the project ?
if {[getItemNameFromProjectList [$editor cget -fullFileName]] != {}} {
set state disabled
- } {
+ } else {
set state normal
}
$opened_files_menu entryconfigure [::mc "Append to project"] -state $state
@@ -1835,7 +1907,7 @@ class FileList {
set item_idx [$listbox_opened_files index $item]
if {$item_idx == 0} {
set state disabled
- } {
+ } else {
set state normal
}
$opened_files_menu entryconfigure [::mc "Move up"] -state $state
@@ -1847,7 +1919,7 @@ class FileList {
# Items: "Move down" and "Move to bottom"
if {($item_idx + 1) >= [llength [$listbox_opened_files items]]} {
set state disabled
- } {
+ } else {
set state normal
}
$opened_files_menu entryconfigure [::mc "Move down"] -state $state
@@ -1908,7 +1980,7 @@ class FileList {
} {
$opened_files_menu entryconfigure [::mc $entry] -state normal
}
- # It is not so easy to open the file with an external editor on Microsoft Windows as
+ # It is not so easy to open the file with an external editor on Microsoft Windows as
# it is on a POSIX system, that's why this feature is disabled here
if {$::MICROSOFT_WINDOWS} {
$opened_files_menu entryconfigure [::mc {Open with}] -state disabled
@@ -1922,7 +1994,7 @@ class FileList {
set fullFileName [[lindex $editors [lsearch $file_descriptors $item]] cget -fullFileName]
if {$fullFileName == {} || [getItemNameFromProjectList $fullFileName] != {}} {
set state disabled
- } {
+ } else {
set state normal
}
$opened_files_menu entryconfigure [::mc "Append to project"] -state $state
@@ -1987,26 +2059,34 @@ class FileList {
# Parse record
set rfi 0
foreach var {
- file_name active o_bookmark p_bookmark
- file_index read_only file_line file_md5
- file_path file_BMs file_BPs eol
- enc sh notes
- } {
- set $var [lindex $record $rfi]
- incr rfi
+ file_name active o_bookmark p_bookmark
+ file_index read_only file_line file_md5
+ file_path file_BMs file_BPs eol
+ enc sh notes
+ } {
+ set $var [lindex $record $rfi]
+ incr rfi
}
# Adjust file path
- if {[string index $file_path 0] != {/}} {
- set file_path "$project_path/$file_path"
+ if {!$::MICROSOFT_WINDOWS} { ;# POSIX way
+ if {[string index $file_path 0] != {/}} {
+ set file_path "$project_path/$file_path"
+ }
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $file_path]} {
+ set file_path "$project_path/$file_path"
+ }
}
# Determinate full file name
set full_file_name "$file_path$file_name"
# Check for file usebility
if {
- ![file exists $full_file_name] ||
- [file isdirectory $full_file_name] ||
+ ![file exists $full_file_name]
+ ||
+ [file isdirectory $full_file_name]
+ ||
(!$::MICROSOFT_WINDOWS && ![file readable $full_file_name])
} then {
lappend file_indexes_fb {}
@@ -2014,19 +2094,6 @@ class FileList {
continue
}
- # Compare file MD5
- if {[catch {
- if {[md5::md5 -hex -file $file_path$file_name] != $file_md5} {
- lappend changed_files $file_path$file_name
- }
- }]} then {
- tk_messageBox \
- -icon warning \
- -type ok \
- -title [mc "Unknown error"] \
- -message [mc "Raised error during md5 checking file %s. Maybe md5 extension is not correctly loaded." $file_name]
- }
-
# Chech for valid EOL and Encoding
if {$eol != {lf} && $eol != {cr} && $eol != {crlf}} {
set eol $default_eol
@@ -2041,6 +2108,20 @@ class FileList {
puts stderr "Read only flag -- using default (0)"
}
+ # Compare file MD5
+ if {[catch {
+ if {!$read_only && [md5::md5 -hex -file $file_path$file_name] != $file_md5} {
+ lappend changed_files $file_path$file_name
+ }
+ }]} then {
+ tk_messageBox \
+ -parent . \
+ -icon warning \
+ -type ok \
+ -title [mc "Unknown error"] \
+ -message [mc "Error raised during md5 checking file %s. Maybe md5 extension is not correctly loaded." $file_name]
+ }
+
# Insert bookmark to icon border for project files
if {[llength $project_files_bookmarks]} {
$listbox_project_files_bm insert end "\n"
@@ -2049,7 +2130,7 @@ class FileList {
lappend project_files_bookmarks 1
$listbox_project_files_bm image create [list {end-1l} linestart] \
-image ::ICONS::16::bookmark -align center
- } {
+ } else {
lappend project_files_bookmarks 0
}
$listbox_project_files_bm tag add center 0.0 end
@@ -2068,7 +2149,7 @@ class FileList {
$sh $notes \
]
continue
- } {
+ } else {
$listbox_project_files insert end #auto \
-font $opened_file_font -fill {#000000} \
-text $file_name -data [list $file_path$file_name $eol $enc $read_only]
@@ -2110,16 +2191,7 @@ class FileList {
# Invoke progress dialog
set max [llength $file_indexes_fb]
if {!$max} {set max 1}
- create_progress_bar .prgDl \
- . \
- ::FileList::open_files_cur_file \
- {} \
- ::FileList::open_files_progress \
- $max \
- [mc "Opening project files"] \
- ::ICONS::16::fileopen \
- [mc "Abort"] \
- {set ::FileList::open_files_abort 1}
+ .prgDl.f.progressbar configure -maximum $max
# Adjust lists of files to open
if {!$keep_order} {
@@ -2136,7 +2208,7 @@ class FileList {
# Check for validity of list of file indexes
if {$unopened_files != {}} {
set file_indexes $file_indexes_fb
- } {
+ } else {
for {set i 0} {$i < $num_of_opened_files} {incr i} {
if {[lsearch -ascii -exact $file_indexes $i] == -1} {
set file_indexes $file_indexes_fb
@@ -2168,7 +2240,7 @@ class FileList {
incr i -1
set file_indexes [lrange $file_indexes 0 $i]
set file_indexes_fb [lrange $file_indexes_fb 0 $i]
- } {
+ } else {
set file_indexes {}
set file_indexes_fb {}
}
@@ -2195,7 +2267,7 @@ class FileList {
# Invoke dialog "File(s) not found"
if {$unopened_files != {}} {
# Create toplevel window
- set win [toplevel .file_not_found$obj_idx -class {Error dialog} -bg {#EEEEEE}]
+ set win [toplevel .file_not_found$obj_idx -class {Error dialog} -bg ${::COMMON_BG_COLOR}]
# Create window header
pack [frame $win.frame1] -side top -fill x -anchor nw
@@ -2248,21 +2320,18 @@ class FileList {
# Set window attributes
wm iconphoto $win ::ICONS::16::status_unknown
+ wm transient $win .
wm title $win [mc "File(s) not found"]
wm geometry $win 500x200
- wm protocol $win WM_DELETE_WINDOW "
- grab release $win
- destroy $win
- "
+ wm protocol $win WM_DELETE_WINDOW [list destroy $win]
update
- catch {grab $win}
raise $win
}
# Invoke dialog "File(s) changed"
if {$changed_files != {}} {
# Create dialog toplevel window
- set win [toplevel .changed_files$obj_idx -class {File changed} -bg {#EEEEEE}]
+ set win [toplevel .changed_files$obj_idx -class {File changed} -bg ${::COMMON_BG_COLOR}]
# Create dialog header
pack [frame $win.frame1] -side top -fill x -anchor nw
@@ -2273,8 +2342,8 @@ class FileList {
] -side left -fill x
# Create text widget and scrollbar
- pack [frame $win.frame2] -side top -expand 1 -fill both -pady 10 -padx 5
- pack [text $win.frame2.text -height 5 -width 50 \
+ pack [frame $win.frame2] -side top -expand 1 -fill both -pady 3 -padx 5
+ pack [text $win.frame2.text -height 0 -width 0 \
-yscrollcommand "$win.frame2.scrollbar set"] -side left -fill both -expand 1
pack [ttk::scrollbar $win.frame2.scrollbar \
-orient vertical \
@@ -2285,7 +2354,7 @@ class FileList {
foreach file $changed_files {
if {[file exists $file_path$file_name]} {
set time [clock format [file mtime $file_path$file_name] -format {%T %D}]
- } {
+ } else {
set time " -----\t"
}
$win.frame2.text insert end "$time\t$file\n"
@@ -2320,15 +2389,13 @@ class FileList {
"
# Set window attributes
+ wm minsize $win 200 100
+ wm transient $win .
wm iconphoto $win ::ICONS::16::info
wm title $win [mc "File(s) changed"]
wm geometry $win 500x200
- wm protocol $win WM_DELETE_WINDOW "
- grab release $win
- destroy $win
- "
+ wm protocol $win WM_DELETE_WINDOW [list destroy $win]
update
- catch {grab $win}
raise $win
}
}
@@ -2359,17 +2426,18 @@ class FileList {
if {$file_path != {}} {
# Report error if the file does not exist
if {
- !${::Editor::editor_to_use} && (
- ![file exists $file_path] ||
- ![file isfile $file_path] ||
- (!$::MICROSOFT_WINDOWS && ![file readable $file_path])
- )
- } {
- tk_messageBox \
- -type ok \
- -title [mc "File not found - MCU 8051 IDE"] \
- -message [mc "File %s not found !" $file_path] \
- -icon error
+ !${::Editor::editor_to_use} && (
+ ![file exists $file_path] ||
+ ![file isfile $file_path] ||
+ (!$::MICROSOFT_WINDOWS && ![file readable $file_path])
+ )
+ } then {
+ tk_messageBox \
+ -parent . \
+ -type ok \
+ -title [mc "File not found - MCU 8051 IDE"] \
+ -message [mc "File %s not found !" $file_path] \
+ -icon error
set newfile 1
}
@@ -2383,7 +2451,7 @@ class FileList {
}
if {$untitled_num == -1} {
set file_name "untitled"
- } {
+ } else {
set file_name "untitled$untitled_num"
}
incr untitled_num
@@ -2395,15 +2463,31 @@ class FileList {
}
if {$untitled_num == -1} {
set file_name "untitled"
- } {
+ } else {
set file_name "untitled$untitled_num"
}
incr untitled_num
set newfile 1
}
- # Check if the file isn't already opened
+
if {!$newfile} {
+ # Check if the file isn't dangerously large
+ set file_size [file size $file_path]
+ if {$file_size > 10485760} {
+ if {[tk_messageBox \
+ -parent . \
+ -type yesno \
+ -default no \
+ -icon warning \
+ -title [mc "Dangerously large file!"] \
+ -message [mc "WARNING: The file you are about to open is larger than 10MB!\n\nOpening extremely big source code files might lead your system to run out of operating memory, then the MCU 8051 IDE might got killed by the operating system!\n\nARE YOU SURE you want to proceed?"] \
+ ] != {yes}} then {
+ return {}
+ }
+ }
+
+ # Check if the file isn't already opened
set idx 0
foreach editor $editors {
if {[$editor cget -fullFileName] == $file_path} {
@@ -2411,7 +2495,7 @@ class FileList {
$listbox_opened_files selection set $item
switchfile
set lastItem $item
- Sbar [mc "File: %s is alredy opened." $file_path]
+ Sbar [mc "File: %s is already opened." $file_path]
return {}
}
incr idx
@@ -2432,10 +2516,10 @@ class FileList {
set file_descriptor [regsub -all -- {-} $file_descriptor {--}]
set file_descriptor [regsub -all -- {\s} $file_descriptor {-}]
# Handle similar file descriptors of different files
- while 1 {
+ while {1} {
if {[lsearch $file_descriptors $file_descriptor] != -1} {
append file_descriptor {_}
- } {
+ } else {
break
}
}
@@ -2470,38 +2554,47 @@ class FileList {
set ::FileList::dialog_response 0
set win [toplevel .append_to_the_project_dialog]
- pack [label $win.label -text [mc "Do you want to append this file to the project ?\n%s" $file_name]] -fill x -pady 5 -padx 5
-
- pack [frame $win.frm] -pady 5
- pack [ttk::button $win.frm.yes_button -text [mc "Yes"] -command "
- set ::FileList::dialog_response 1
- grab release $win
- destroy $win" \
- ] -side left
- bind $win.frm.yes_button <Return> "
+ set top_frame [frame $win.top]
+ pack [label $top_frame.img -image ::ICONS::32::help] -side left -padx 5
+ pack [label $top_frame.txt \
+ -justify left \
+ -text [mc "Do you want to add this file to the project ?\n%s" $file_name] \
+ ] -side left -padx 5
+ set chb [checkbutton $win.chb \
+ -text [mc "Do not ask again"] \
+ -onvalue 0 \
+ -offvalue 1 \
+ -variable ::FileList::ask__append_file_to_project \
+ ]
+ set bottom_frame [frame $win.bottom]
+ pack [ttk::button $bottom_frame.button_yes \
+ -text [mc "Yes"] -compound left \
+ -image ::ICONS::16::ok \
+ -command "
+ set ::FileList::dialog_response 1
+ grab release $win
+ destroy $win" \
+ ] -side left -padx 2 -pady 5
+ bind $bottom_frame.button_yes <Return> "
set ::FileList::dialog_response 1
grab release $win
destroy $win"
- bind $win.frm.yes_button <KP_Enter> "
+ bind $bottom_frame.button_yes <KP_Enter> "
set ::FileList::dialog_response 1
grab release $win
destroy $win"
- pack [ttk::button $win.frm.no_button -text [mc "No"] -command "
- grab release $win
- destroy $win" \
- ] -side left
- bind $win.frm.no_button <Return> "
- grab release $win
- destroy $win"
- bind $win.frm.no_button <KP_Enter> "
- grab release $win
- destroy $win"
-
- pack [ttk::separator $win.sep -orient horizontal] -fill x -pady 10
- pack [checkbutton $win.chb -text [mc "Do not ask again"] -onvalue 0 -offvalue 1 -variable ::FileList::ask__append_file_to_project] -anchor w
- pack [text $win.tip -fg {#888888} -bg {#EEEEEE} -height 2 -width 0 -bd 0] -fill x
- $win.tip insert end [mc "Tip: You can enable/disable this dialog in MCU 8051 IDE configuration dialog."]
- $win.tip configure -state disabled
+ pack [ttk::button $bottom_frame.button_no \
+ -text [mc "No"] -compound left \
+ -image ::ICONS::16::button_cancel \
+ -command "grab release $win; destroy $win" \
+ ] -side left -padx 2 -pady 5
+ bind $bottom_frame.button_no <KP_Enter> "grab release $win; destroy $win"
+ bind $bottom_frame.button_no <KP_Enter> "grab release $win; destroy $win"
+
+ # Pack window frames
+ pack $top_frame -fill x -padx 5 -pady 10
+ pack $chb -anchor e -padx 5
+ pack $bottom_frame -pady 10
# Set window attributes
wm iconphoto $win ::ICONS::16::help
@@ -2509,13 +2602,13 @@ class FileList {
wm resizable $win 0 0
wm transient $win .
catch {grab $win}
- focus -force $win.frm.yes_button
wm protocol $win WM_DELETE_WINDOW "
grab release $win
destroy $win
"
raise $win
update
+ focus -force $bottom_frame.button_yes
tkwait window $win
if {$::FileList::dialog_response } {
@@ -2536,8 +2629,10 @@ class FileList {
set file [open $file_path]
fconfigure $file -encoding $enc
if {[regsub -all {[\u0000-\u0008\u000B-\u000C\u000E-\u001F\u007F-\u009F]} [read $file] {} data]} {
- tk_messageBox -parent . \
- -type ok -icon warning \
+ tk_messageBox \
+ -parent . \
+ -type ok \
+ -icon warning \
-title [mc "Binary File Opened - MCU 8015 IDE"] \
-message [mc "The file %s is binary, saving it will result corrupted file." $file_path]
}
@@ -2549,7 +2644,7 @@ class FileList {
$file_name $file_path "$this editor_procedure {} " \
[regsub -all {\r\n?} $data "\n"] $sh \
]
- } {
+ } else {
set editor [Editor "::editor${file_count}_$obj_idx" \
[expr {!$fast}] $eol $enc $read_only $file_switching_enabled $this \
$file_name $file_path "$this editor_procedure {} " {} $sh \
@@ -2571,7 +2666,7 @@ class FileList {
}
$filetabs_nb insert end $file_descriptor \
-text $file_name -image ::ICONS::16::$icon \
- -raisecmd "$this switch_file_from_filetabs $file_descriptor"
+ -raisecmd [list $this switch_file_from_filetabs $file_descriptor]
$filetabs_nb see $file_descriptor
# Conditionaly show Line Numbers and Icon Border
@@ -2615,7 +2710,7 @@ class FileList {
switchfile
}
- ## Show file details windows from files tab (or something ...)
+ ## Show file details window from files tab (or something ...)
# $filetabs_nb bindtabs <Enter> "$this file_details_win_create_from_ftnb"
# @parm String page - Page ID
# @return void
@@ -2638,8 +2733,9 @@ class FileList {
## Save currently opened file under a given filename
# note: should be used only for saving untitled files !
# @parm String filename - Full file name including path
- # @return bool - 1: (maybe) successful; 0: argument is empty
- public method save_as {filename} {
+ # @parm Bool keep_extension - Do not alter file extension by assuming that file with no extension should end with ".asm"
+ # @return Bool - 1: (maybe) successful; 0: argument is empty
+ public method save_as {filename {keep_extension 0}} {
# Handle empty argument
if {$filename == {}} {return 0}
@@ -2647,16 +2743,18 @@ class FileList {
# Adjust filename
if {!$::MICROSOFT_WINDOWS} { ;# POSIX way
if {![regexp "^(~|/)" $filename]} {
- set filename "[$this cget -ProjectDir]/$filename"
+ set filename "[$this cget -ProjectDir]/$filename"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $filename]} {
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $filename]} {
set filename [file join [$this cget -ProjectDir] $filename]
}
}
set filename [file normalize $filename]
- if {[file extension $filename] == {}} {
- append filename {.asm}
+ if {!$keep_extension} {
+ if {[file extension $filename] == {}} {
+ append filename {.asm}
+ }
}
# Determinate file rootname
set rootname [file tail $filename]
@@ -2670,7 +2768,7 @@ class FileList {
-title [mc "Overwrite file"] \
-message [mc "A file name '%s' already exists. Are you sure you want to overwrite it ?" $rootname]
] != {yes}
- } {
+ } then {
return 1
}
}
@@ -2683,7 +2781,7 @@ class FileList {
# Determinate some additional informations
if {$splitted && $selectedView} {
set idx $actualEditor2
- } {
+ } else {
set idx $actualEditor
}
set editor [lindex $editors $idx]
@@ -2691,6 +2789,7 @@ class FileList {
set original_rootname [$editor cget -filename] ;# Original file rootname
# Mark the file as opened (in listbox of project files)
+ set already_in_project 0
foreach item [$listbox_project_files items] {
if {[$listbox_project_files itemcget $item -text] != $original_rootname} {
continue
@@ -2700,6 +2799,7 @@ class FileList {
if {[lindex $data 0] != $fullFileName} {continue}
lset data 0 $filename
$listbox_project_files itemconfigure $item -data $data -text $rootname
+ set already_in_project 1
}
# Set new file name
@@ -2708,14 +2808,17 @@ class FileList {
$this todo_change_filename $idx $rootname
# Ask for appending the file to the project
- set response [tk_messageBox \
- -title [mc "Add file ?"] \
- -icon question -type yesno \
- -parent $parent \
- -message [mc "Do you want to append this file to the project ?\n%s" $rootname]
- ]
- if {$response == {yes}} {
- filelist_append_to_prj
+ if {!$already_in_project} {
+ set response [tk_messageBox \
+ -title [mc "Add file ?"] \
+ -icon question \
+ -type yesno \
+ -parent $parent \
+ -message [mc "Do you want to add this file to the project ?\n%s" $rootname]
+ ]
+ if {$response == {yes}} {
+ filelist_append_to_prj
+ }
}
::X::recent_files_add 1 $filename
@@ -2726,7 +2829,7 @@ class FileList {
# ---------------------------------------------------------------------
- # EDITOR PROCEDURES
+ # EDITOR FUNCTIONS
# ---------------------------------------------------------------------
## Show/Hide line numbers
@@ -2735,7 +2838,7 @@ class FileList {
if {$lineNumbers} {
set lineNumbers 0
foreach editor $editors {$editor hideLineNumbers}
- } {
+ } else {
set lineNumbers 1
foreach editor $editors {$editor showLineNumbers}
}
@@ -2747,7 +2850,7 @@ class FileList {
if {$iconBorder} {
set iconBorder 0
foreach editor $editors {$editor hideIconBorder}
- } {
+ } else {
set iconBorder 1
foreach editor $editors {$editor showIconBorder}
}
@@ -2758,10 +2861,10 @@ class FileList {
public method editor_linescount {} {
if {$splitted && $selectedView} {
set tmp $actualEditor2
- } {
+ } else {
set tmp $actualEditor
}
- set tmp [[lindex $editors $tmp] cget -lastEnd]
+ set tmp [expr {int([[[lindex $editors $tmp] cget -editor] index end])}]
return [expr {$tmp-1}]
}
@@ -2770,7 +2873,7 @@ class FileList {
public method editor_actLineNumber {} {
if {$splitted && $selectedView} {
set idx $actualEditor2
- } {
+ } else {
set idx $actualEditor
}
return [expr {int([[lindex $editor_wdgs $idx] index insert])}]
@@ -2786,7 +2889,7 @@ class FileList {
if {$objectNumber == {}} {
if {$splitted && $selectedView} {
set objectNumber $actualEditor2
- } {
+ } else {
set objectNumber $actualEditor
}
}
@@ -2846,13 +2949,13 @@ class FileList {
# List header
if {$splitted} {
set _actualEditor2 $actualEditor2
- } {
+ } else {
set _actualEditor2 -1
}
if {$splitted} {
if {$pwin_orient == {vertical}} {
set idx 1
- } {
+ } else {
set idx 0
}
set multiview_sash_pos [lindex [$multiview_paned_win sash coord 0] $idx]
@@ -2897,6 +3000,9 @@ class FileList {
lset data 1 {no}
# Set file path
set path [lindex $data 5]
+ if {$::MICROSOFT_WINDOWS} { ;# "\" --> "/"
+ regsub -all "\\\\" $path {/} path
+ }
if {[string first $project_path $path] == 0} {
lset data 5 [string range $path $project_path_length end]
}
@@ -2908,7 +3014,7 @@ class FileList {
lappend file_list $data
# Opened file
- } {
+ } else {
# Find the file in list of opened files
foreach editor $editors {
# Local variables
@@ -2921,6 +3027,9 @@ class FileList {
# Set file path
set path [lindex $data 5]
+ if {$::MICROSOFT_WINDOWS} { ;# "\" --> "/"
+ regsub -all "\\\\" $path {/} path
+ }
if {[string first $project_path $path] == 0} {
lset data 5 [string range $path $project_path_length end]
}
@@ -2969,7 +3078,7 @@ class FileList {
regexp {^.*[\\\/]} $file_name path
if {[catch {
set md5_hash [md5::md5 -hex -hex -file $file_name]
- }]} {
+ }]} then {
set md5_hash {}
}
@@ -2997,7 +3106,7 @@ class FileList {
public method editor_save {} {
if {$splitted && $selectedView} {
[lindex $editors $actualEditor2] save
- } {
+ } else {
[lindex $editors $actualEditor] save
}
}
@@ -3041,13 +3150,13 @@ class FileList {
$editor insertData $data {}
[$editor cget -editor] edit modified 0
[$editor cget -editor] edit reset
- } {
+ } else {
set dir [${::X::actualProject} cget -ProjectDir]
catch {
file delete -force -- [file join $dir .#special:tmp]
}
- set file [open [file join $dir .#special:tmp] w 420]
+ set file [open [file join $dir .#special:tmp] w 0640]
puts -nonewline $file $data
close $file
@@ -3069,10 +3178,10 @@ class FileList {
if {$editorIdx == {}} {
if {$splitted && $selectedView} {
set editorIdx $actualEditor2
- } {
+ } else {
set editorIdx $actualEditor
}
- } {
+ } else {
if {$editorIdx == $actualEditor} {
set selectedView 0
} elseif {$editorIdx == $actualEditor2} {
@@ -3083,12 +3192,13 @@ class FileList {
# Ask user for saving the file (if was modified)
if {$ask && [$editor cget -modified]} {
- set response [tk_messageBox \
- -type yesnocancel \
+ set response [tk_messageBox \
+ -parent . \
+ -type yesnocancel \
-title [mc "Close document - MCU 8051 IDE"] \
- -icon question \
- -default yes \
- -message [mc "The document %s have been modified.\nDo you want to save it ?" [[lindex $editors $editorIdx] cget -fullFileName]]]
+ -icon question \
+ -default yes \
+ -message [mc "The document %s has been modified.\nDo you want to save it ?" [file tail [[lindex $editors $editorIdx] cget -fullFileName]]]]
if {$response == {yes}} {
$editor save
@@ -3137,27 +3247,31 @@ class FileList {
# Adjust object variables
foreach var {editors file_descriptors editor_wdgs file_eol file_encoding file_ro_mode file_sh} {
- set $var [lreplace [subst "\$$var"] $editorIdx $editorIdx]
+ set $var [lreplace [subst -nocommands "\$$var"] $editorIdx $editorIdx]
}
- if {$actualEditor > $editorIdx} {
+ if {$actualEditor == $editorIdx} {
+ set actualEditor {x}
+ } elseif {$actualEditor > $editorIdx} {
incr actualEditor -1
}
- if {$actualEditor2 > $editorIdx} {
+ if {$actualEditor2 == $editorIdx} {
+ set actualEditor2 {x}
+ } elseif {$actualEditor2 > $editorIdx} {
incr actualEditor2 -1
}
- if {$actualEditor == $editorIdx || $actualEditor2 == $editorIdx} {
+ if {$actualEditor == {x} || $actualEditor2 == {x}} {
set do_not_forget_editor 1
- if {$actualEditor == $editorIdx} {
+ if {$actualEditor == {x}} {
set actualEditor -1
}
- if {$actualEditor2 == $editorIdx} {
+ if {$actualEditor2 == {x}} {
set actualEditor2 -1
}
# Conditionaly open a new editor
if {$splitted} {
set min 2
- } {
+ } else {
set min 1
}
if {[llength $file_descriptors] < $min} {
@@ -3197,7 +3311,7 @@ class FileList {
if {$unsaved != {}} {
save_multiple_files $allowCancelButton
return 0
- } {
+ } else {
if {!$projectClose} {
editor_force_close_all
}
@@ -3239,7 +3353,7 @@ class FileList {
] -side right -fill x -expand 1
# Create the middle part of the dialog (list of unsaved files)
- pack [tkk::labelframe $dialog.lf \
+ pack [ttk::labelframe $dialog.lf \
-text [mc "Unsaved files"] \
] -fill both -expand 1 -pady 10 -padx 10
set i 0
@@ -3257,25 +3371,25 @@ class FileList {
pack [ttk::separator $dialog.separator -orient horizontal] -fill x -expand 1
pack [frame $dialog.f]
# SAVESELECTED
- pack [ttk::button $dialog.f.b_save_selected \
- -text [mc "Save selected"] \
- -compound left \
- -image ::ICONS::16::filesave \
- -command {${X::actualProject} save_multiple_files_SAVESELECTED} \
+ pack [ttk::button $dialog.f.b_save_selected \
+ -text [mc "Save selected"] \
+ -compound left \
+ -image ::ICONS::16::filesave \
+ -command {${::X::actualProject} save_multiple_files_SAVESELECTED} \
] -side left
# SAVEALL
pack [ttk::button $dialog.f.b_save_all \
-text [mc "Save all"] \
-compound left \
-image ::ICONS::16::save_all \
- -command {${X::actualProject} save_multiple_files_SAVEALL} \
+ -command {${::X::actualProject} save_multiple_files_SAVEALL} \
] -side left
# DESTROY
pack [ttk::button $dialog.f.b_discard \
-text [mc "Discard"] \
-compound left \
-image ::ICONS::16::editdelete \
- -command {${X::actualProject} save_multiple_files_DESTROY} \
+ -command {${::X::actualProject} save_multiple_files_DESTROY} \
] -side left
# CANCEL
if {$allowCancelButton} {
@@ -3283,7 +3397,7 @@ class FileList {
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
- -command {${X::actualProject} save_multiple_files_CANCEL} \
+ -command {${::X::actualProject} save_multiple_files_CANCEL} \
] -side left
}
@@ -3313,7 +3427,7 @@ class FileList {
public method save_multiple_files_SAVESELECTED {} {
set i 0
foreach editor $unsaved {
- set cnd [subst "\${::unsavedfile$i}"]
+ set cnd [subst -nocommands "\${::unsavedfile$i}"]
if {$cnd} {$editor save}
incr i
}
@@ -3365,21 +3479,21 @@ class FileList {
${project_files_buttonBox}open configure -state disabled
# Simulator disengaged
- } {
+ } else {
# Opened file
if {[llength [$listbox_project_files itemcget $item -data]] < 5} {
${project_files_buttonBox}close configure -state normal
${project_files_buttonBox}open configure -state disabled
# Unopened file
- } {
+ } else {
${project_files_buttonBox}close configure -state disabled
${project_files_buttonBox}open configure -state normal
}
}
# Nothing selected
- } {
+ } else {
${project_files_buttonBox}remove configure -state disabled
${project_files_buttonBox}open configure -state disabled
${project_files_buttonBox}close configure -state disabled
@@ -3438,7 +3552,7 @@ class FileList {
}
$project_files_menu entryconfigure [::mc "Open file"] -state disabled
# Unopened file
- } {
+ } else {
if {!$frozen} {
$project_files_menu entryconfigure [::mc "Close file"] -state disabled
}
@@ -3448,7 +3562,7 @@ class FileList {
# Movement commands
if {[$listbox_project_files index $item] == 0} {
set state disabled
- } {
+ } else {
set state normal
}
$project_files_menu entryconfigure [::mc "Move up"] -state $state
@@ -3456,7 +3570,7 @@ class FileList {
if {[$listbox_project_files index $item] == ([llength [$listbox_project_files items]] - 1)} {
set state disabled
- } {
+ } else {
set state normal
}
$project_files_menu entryconfigure [::mc "Move down"] -state $state
@@ -3611,7 +3725,7 @@ class FileList {
set item [$listbox_project_files selection get] ;# Item ID
set record [$listbox_project_files itemcget $item -data] ;# Item data
- # If the file is already opended -- abort
+ # If the file is already opened -- abort
if {[llength $record] == 4} {return}
# Parse item data
@@ -3623,10 +3737,11 @@ class FileList {
# Check for file existence
if {![file exists $file_path$file_name]} {
- tk_messageBox \
+ tk_messageBox \
-title [mc "File not found"] \
- -icon error \
- -type ok \
+ -parent . \
+ -icon error \
+ -type ok \
-message [mc "File %s could not be located at the specified location." $file_name]
return
}
@@ -3634,15 +3749,17 @@ class FileList {
# Verify file MD5 hash
if {[catch {
if {[md5::md5 -hex -file $file_path$file_name] != $file_md5} {
- tk_messageBox \
- -icon warning \
- -type ok \
+ tk_messageBox \
+ -icon warning \
+ -parent . \
+ -type ok \
-title [mc "File changed"] \
-message [mc "File \"%s\" was modified since last project save\nTime: %s" $file_name [clock format [file mtime $file_path$file_name] -format {%T %D}]]
}
}]} then {
tk_messageBox \
-icon warning \
+ -parent . \
-type ok \
-title [mc "Unknown error"] \
-message [mc "Raised error during md5 checking file %s. Maybe md5 extension is not correctly loaded." $file_name]
@@ -3769,7 +3886,7 @@ class FileList {
}
# Unopened file
- } {
+ } else {
if { "[lindex $data 5][lindex $data 0]" == $fullFileName} {
return $item
}
@@ -3785,7 +3902,7 @@ class FileList {
public method change_encoding {} {
if {$splitted && $selectedView} {
set idx $actualEditor2
- } {
+ } else {
set idx $actualEditor
}
if {[lindex $file_encoding $idx] == ${::editor_encoding}} {
@@ -3800,7 +3917,7 @@ class FileList {
set ::editor_encoding $original_encoding
lset file_encoding $idx $original_encoding
[lindex $editors $idx] configure -encoding $original_encoding
- } {
+ } else {
# Configure list of project files
set filename [[lindex $editors $idx] cget -fullFileName]
foreach item [$listbox_project_files items] {
@@ -3819,7 +3936,7 @@ class FileList {
public method change_EOL {} {
if {$splitted && $selectedView} {
set idx $actualEditor2
- } {
+ } else {
set idx $actualEditor
}
if {[lindex $file_eol $idx] == ${::editor_EOL}} {
@@ -3843,11 +3960,11 @@ class FileList {
}
## Change RO mode in the current editor
- # @return void
+ # @return Bool - true == ok; false == cannot comply!
public method switch_editor_RO_MODE {} {
if {$splitted && $selectedView} {
set idx $actualEditor2
- } {
+ } else {
set idx $actualEditor
}
if {[lindex $file_ro_mode $idx] == ${::editor_RO_MODE}} {
@@ -3855,26 +3972,23 @@ class FileList {
}
# Configure editor
+ if {![[lindex $editors $idx] change_RO_MODE ${::editor_RO_MODE}]} {
+ return 0
+ }
lset file_ro_mode $idx ${::editor_RO_MODE}
- [lindex $editors $idx] change_RO_MODE ${::editor_RO_MODE}
# Configure list of project files
set filename [[lindex $editors $idx] cget -fullFileName]
foreach item [$listbox_project_files items] {
set data [$listbox_project_files itemcget $item -data]
- # Unknown bug workaround :-(
- if {[llength $data] < 4} {
- puts "data == {$data}" ;# Dump
- lappend data {}
- }
-
if {[lindex $data 0] == $filename} {
lset data 3 ${::editor_RO_MODE}
$listbox_project_files itemconfigure $item -data $data
break
}
}
+ return 1
}
## Adjust scrollbar for listbox of opened files
@@ -3889,7 +4003,7 @@ class FileList {
set o_scrollbar_visible 0
}
# Show scrollbar
- } {
+ } else {
if {!$o_scrollbar_visible} {
pack $opened_files_scrollbar \
-side left \
@@ -3924,7 +4038,7 @@ class FileList {
set p_scrollbar_visible 0
}
# Show scrollbar
- } {
+ } else {
if {!$p_scrollbar_visible} {
pack $project_files_scrollbar \
-side left \
@@ -4116,7 +4230,7 @@ class FileList {
$filetabs_nb itemconfigure $page -image ::ICONS::16::$icon
# Add bookmark
- } {
+ } else {
lset opened_files_bookmarks $line 1
incr line
$listbox_opened_files_bm image create $line.0 \
@@ -4172,7 +4286,7 @@ class FileList {
incr line
$listbox_project_files_bm delete $line.0 [list $line.0 lineend]
# Add bookmark
- } {
+ } else {
lset project_files_bookmarks $line 1
incr line
$listbox_project_files_bm image create $line.0 \
@@ -4217,7 +4331,7 @@ class FileList {
if {$splitted && $selectedView} {
[lindex $editors $actualEditor2] cmd_line_focus 1
- } {
+ } else {
[lindex $editors $actualEditor] cmd_line_focus 1
}
}
@@ -4243,7 +4357,7 @@ class FileList {
# Save current sash position
if {$pwin_orient == {vertical}} {
set idx 1
- } {
+ } else {
set idx 0
}
set multiview_sash_pos [lindex [$multiview_paned_win sash coord 0] $idx]
@@ -4261,18 +4375,14 @@ class FileList {
# Determinate which editor will be visible now
if {$editor_object != {}} {
- set editor_object [lsearch $editors $editor_object]
- if {$editor_object == $actualEditor2} {
- set selectedView 1
- } {
- set selectedView 0
+ set editor_object [lsearch -ascii -exact $editors $editor_object]
+ if {$editor_object == $actualEditor} {
+ $listbox_opened_files selection set [lindex $file_descriptors $actualEditor2]
+ } elseif {$editor_object == $actualEditor2} {
+ $listbox_opened_files selection set [lindex $file_descriptors $actualEditor]
}
}
- # Insure than the choosen editor (see above) is (in)visible
- if {!$selectedView} {
- $listbox_opened_files selection set [lindex $file_descriptors $actualEditor2]
- }
set selectedView 0
set splitted 0
set actualEditor2 -1
@@ -4329,17 +4439,31 @@ class FileList {
private method split_editor {vert_or_horz} {
if {$splitted} {return}
+ set pwin_orient_orig $pwin_orient
+
# Determinate orientation
if {$vert_or_horz} {
set pwin_orient {horizontal}
- } {
+ } else {
set pwin_orient {vertical}
}
$multiview_paned_win configure -orient $pwin_orient
+ if {$pwin_orient_orig != $pwin_orient} {
+ set multiview_sash_pos 0
+ }
+
# Validate sash position
- if {!$multiview_sash_pos} {
- set multiview_sash_pos [expr {[winfo width $pagesManager] / 2}]
+ if {$pwin_orient == {vertical}} {
+ if {!$multiview_sash_pos} {
+ set multiview_sash_pos [expr {[winfo height $pagesManager] / 2}]
+ }
+ set minsize 80
+ } else {
+ if {!$multiview_sash_pos} {
+ set multiview_sash_pos [expr {[winfo width $pagesManager] / 2}]
+ }
+ set minsize 300
}
# Unmap current pages manager and remap it with the second one into paned window
@@ -4349,19 +4473,14 @@ class FileList {
$multiview_paned_win add $pagesManager2 -after $pagesManager
# Configure minimum size for panes
- if {$vert_or_horz} {
- set minsize 300
- } {
- set minsize 80
- }
$multiview_paned_win paneconfigure $pagesManager -minsize $minsize
$multiview_paned_win paneconfigure $pagesManager2 -minsize $minsize
# Move paned window sash
- update idle
+ update idletasks
if {$pwin_orient == {vertical}} {
$multiview_paned_win sash place 0 0 $multiview_sash_pos
- } {
+ } else {
$multiview_paned_win sash place 0 $multiview_sash_pos 0
}
@@ -4377,10 +4496,10 @@ class FileList {
if {$len > 1} {
if {$actualEditor < ($len - 1)} {
set actualEditor2 [expr {$actualEditor + 1}]
- } {
+ } else {
set actualEditor2 0
}
- } {
+ } else {
set selectedView 1
editor_new
set selectedView 0
@@ -4398,7 +4517,7 @@ class FileList {
set listbox $listbox_opened_files
set bookmarks_text $listbox_opened_files_bm
set bookmarks_var {opened_files_bookmarks}
- } {
+ } else {
set listbox $listbox_project_files
set bookmarks_text $listbox_project_files_bm
set bookmarks_var {project_files_bookmarks}
@@ -4420,7 +4539,7 @@ class FileList {
set data [lindex $data 5]
# Opened file
- } {
+ } else {
set data [lindex $data 0]
}
}
@@ -4434,7 +4553,7 @@ class FileList {
set path [lindex $path 5]
# Opened file
- } {
+ } else {
set path [lindex $path 0]
}
}
@@ -4471,7 +4590,7 @@ class FileList {
}
}
# By size (integer comparison)
- } {
+ } else {
for {set i 1} {$i < $num_of_items} {incr i} {
for {set j 1; set k 0} {$j < $num_of_items} {incr j; incr k} {
if {[lindex $items $k] > [lindex $items $j]} {
@@ -4492,7 +4611,7 @@ class FileList {
#+ No GUI will be affected
set new_items_order {}
set bookmarks_new {}
- set bookmarks_org [subst "\$$bookmarks_var"]
+ set bookmarks_org [subst -nocommands "\$$bookmarks_var"]
for {set i 0} {$i < $num_of_items} {incr i} {
set idx [lindex $new_order $i]
lappend new_items_order [$listbox items $idx]
@@ -4525,7 +4644,7 @@ class FileList {
return
}
set filename [$listbox_opened_files itemcget $item -data]
- } {
+ } else {
set item [$listbox_project_files selection get]
if {![$listbox_project_files exists $item]} {
return
@@ -4533,7 +4652,7 @@ class FileList {
set data [$listbox_project_files itemcget $item -data]
if {[llength $data] < 5} {
set filename [lindex $data 0]
- } {
+ } else {
set filename "[lindex $data 5][lindex $data 0]"
}
}
@@ -4549,7 +4668,7 @@ class FileList {
# Start external editor
if {[catch {
exec $command "$filename" &
- }]} {
+ }]} then {
tk_messageBox \
-parent . \
-icon error \
@@ -4565,7 +4684,7 @@ class FileList {
set ::FileList::open_with_cnfr 0
# Create toplevel window
- set win [toplevel .open_with_other_dlg -class {Open with ...} -bg {#EEEEEE}]
+ set win [toplevel .open_with_other_dlg -class {Open with ...} -bg ${::COMMON_BG_COLOR}]
# Create label, entryBox and horizontal separator
pack [label $win.lbl -text [mc "Enter command to execute:"]] -fill x -anchor w -padx 5
@@ -4573,7 +4692,6 @@ class FileList {
-textvariable ::FileList::open_with \
-width 0 \
] -fill x -padx 10 -anchor w
-# pack [ttk::separator $win.sep -orient horizontal] -fill x -padx 5 -pady 10
bind $win.ent <Return> "grab release $win; destroy $win"
bind $win.ent <KP_Enter> "grab release $win; destroy $win"
@@ -4589,7 +4707,7 @@ class FileList {
grab release $win
destroy $win
" \
- ] -side left
+ ] -side left -padx 2
pack [ttk::button $buttonFrame.cancel \
-text [mc "Cancel"] \
-compound left \
@@ -4598,7 +4716,7 @@ class FileList {
grab release $win
destroy $win
" \
- ] -side left
+ ] -side left -padx 2
pack $buttonFrame -side bottom -padx 5 -pady 5 -anchor e
# Set window attributes
@@ -4620,7 +4738,7 @@ class FileList {
# Return result
if {${::FileList::open_with_cnfr}} {
return ${::FileList::open_with}
- } {
+ } else {
return {}
}
}
@@ -4688,21 +4806,30 @@ class FileList {
if {$file_number != {} && $simulator_editor != $file_number} {
# Gain target file name
set file_name [$this simulator_get_filename $file_number]
+ if {$::MICROSOFT_WINDOWS} { ;# "/" --> "\"
+ regsub -all {/} $file_name "\\" file_name
+ }
# Search for the given file and try to switch to it
if {$file_switching_enabled || $simulator_editor == -1} {
foreach item [$listbox_opened_files items] {
- if {$file_name != [$listbox_opened_files itemcget $item -data]} {
+ set item_data [$listbox_opened_files itemcget $item -data]
+ if {$::MICROSOFT_WINDOWS} { ;# "/" --> "\"
+ regsub -all {/} $item_data "\\" item_data
+ }
+
+ if {$file_name != $item_data} {
continue
}
$listbox_opened_files selection set $item
+
if {$simulator_editor_obj != {}} {
$simulator_editor_obj disable
- $listbox_opened_files itemconfigure [lindex \
- $file_descriptors [lsearch -ascii -exact \
- $editors $simulator_editor_obj \
- ] \
+ $listbox_opened_files itemconfigure [lindex \
+ $file_descriptors [lsearch -ascii -exact\
+ $editors $simulator_editor_obj \
+ ] \
] -fg {#000000}
}
$listbox_opened_files itemconfigure $item -fg {#FF0000}
@@ -4711,11 +4838,14 @@ class FileList {
]
$simulator_editor_obj freeze
$simulator_editor_obj move_simulator_line $line_number
+
switchfile
set simulator_editor $file_number
+
return
}
}
+
Sbar [mc "Simulator: unable to switch to file: '%s'" $file_name]
# Move simulator pointer directly
@@ -4754,7 +4884,7 @@ class FileList {
## Redraw panel pane
# @return void
public method leftpanel_redraw_pane {} {
- update idle
+ update idletasks
if {$PanelVisible != 0} {
$parent sash place 0 $PanelSize 0
}
@@ -4765,7 +4895,7 @@ class FileList {
public method get_current_editor_object {} {
if {$splitted && $selectedView} {
set editor_num $actualEditor2
- } {
+ } else {
set editor_num $actualEditor
}
return [lindex $editors $editor_num]
@@ -4779,7 +4909,7 @@ class FileList {
if {![winfo ismapped $filetabs_frm]} {
if {$splitted} {
set before $multiview_paned_win
- } {
+ } else {
set before $pagesManager
}
pack $filetabs_frm -fill x -before $before
@@ -4787,7 +4917,7 @@ class FileList {
filelist_adjust_size_of_tabbar
}
# Hide
- } {
+ } else {
if {[winfo ismapped $filetabs_frm]} {
pack forget $filetabs_frm
}
@@ -4801,7 +4931,7 @@ class FileList {
$filetabs_nb see [lindex [$filetabs_nb pages] 0]
update
catch {
- $filetabs_nb.c configure -height 20
+ $filetabs_nb.c configure -height [expr {int(20 * $::font_size_factor)}]
}
$filetabs_nb see [$filetabs_nb raise]
@@ -4822,3 +4952,7 @@ class FileList {
}
}
set ::FileList::ask__append_file_to_project ${::CONFIG(ASK_ON_FILE_OPEN)}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/leftpanel/fsbrowser.tcl b/lib/leftpanel/fsbrowser.tcl
index 0a28d82..631eb3e 100755..100644
--- a/lib/leftpanel/fsbrowser.tcl
+++ b/lib/leftpanel/fsbrowser.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 _FSBROWSER_TCL ] } {
+set _FSBROWSER_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements file system browser for the left panel
@@ -28,7 +33,7 @@
class FSBrowser {
- # Definition of popup menu for filesystem browser, part: configure
+ # Definition of popup menu for file system browser, part: configure
common FSMENU_CONFIGURE {
{cascade "Sorting" 0 "" .sorting false 1 {
{radiobutton "By Name" "" {::KIFSD::FSD::config(sorting)}
@@ -53,7 +58,7 @@ class FSBrowser {
{filelist_fsb_reload} "Show / Ignore files starting with dot"}
}
- # Definition of popup menu for filesystem browser, part: listbox
+ # Definition of popup menu for file system browser, part: listbox
common FSMENU_LISTBOX {
{command {Up} {} 0 "filelist_fsb_up" {up}
"Go to parent folder"}
@@ -65,7 +70,7 @@ class FSBrowser {
{command {Home} {} 0 "filelist_fsb_gohome" {gohome}
"Go to your home folder"}
{command {Reload} {} 1 "filelist_fsb_reload" {reload}
- "Reload filelist"}
+ "Reload file list"}
{separator}
{command {Rename} {} 0 "filelist_fsb_rename" {edit}
"Rename file"}
@@ -80,7 +85,7 @@ class FSBrowser {
"Show file properties"}
}
- # Definition of popup menu for filesystem browser, part: bookmarks
+ # Definition of popup menu for file system browser, part: bookmarks
common FSMENU_BOOKMARKS {
{command {Add bookmark} {} 0 "filelist_fsb_add_bookmark"
{bookmark_add} "Bookmark the current folder"}
@@ -90,29 +95,29 @@ class FSBrowser {
}
## PRIVATE
- private variable fs_browser_selected_item {} ;# Item selected by popup menu for filesystem browser
+ private variable fs_browser_selected_item {} ;# Item selected by popup menu for file system browser
private variable fs_browser_selection_in_P 0 ;# Procedure "filelist_fsb_select" in progress
- private variable fs_browser_listbox_top_frame ;# Top frame of filesystem browser
- private variable forward_history {} ;# List of forward history (filesystem browser)
- private variable back_history {} ;# List of backward history (filesystem browser)
- private variable fs_browser_current_dir ;# Current directory (filesystem browser)
- private variable fs_browser_conf_menu ;# ID of filesystem browser configuration menu
+ private variable fs_browser_listbox_top_frame ;# Top frame of file system browser
+ private variable forward_history {} ;# List of forward history (file system browser)
+ private variable back_history {} ;# List of backward history (file system browser)
+ private variable fs_browser_current_dir ;# Current directory (file system browser)
+ private variable fs_browser_conf_menu ;# ID of files ystem browser configuration menu
private variable fs_browser_dir_ok ;# Button: Confirm location
- private variable fs_browser_listbox_menu ;# ID of popup menu for filesystem browser
- private variable fs_browser_bm_menu ;# ID of bookmarks popup menu (filesystem browser)
- private variable fs_browser_toolbar ;# ID of filesystem browser toolbar
+ private variable fs_browser_listbox_menu ;# ID of popup menu for file system browser
+ private variable fs_browser_bm_menu ;# ID of bookmarks popup menu (file system browser)
+ private variable fs_browser_toolbar ;# ID of file system browser toolbar
private variable fs_browser_dir ;# ComboBox: Current directory
private variable fs_browser_listbox ;# ListBox: Files & Directories
- private variable fs_browser_listbox_v_scrollbar ;# Vertical scrollbar for filesystem browser
- private variable fs_browser_listbox_h_scrollbar ;# Horizontal scrollbar for filesystem browser
+ private variable fs_browser_listbox_v_scrollbar ;# Vertical scrollbar for file system browser
+ private variable fs_browser_listbox_h_scrollbar ;# Horizontal scrollbar for file system browser
private variable fs_browser_filter ;# ComboBox: Filter
private variable item_menu_invoked 0 ;# Bool: Item menu request
- # Current GLOB filter for filesystem browser
+ # Current GLOB filter for file system browser
private variable fs_browser_current_mask ${::CONFIG(FS_BROWSER_MASK)}
# Variables related to object initialization
private variable parent
- private variable gui_initialized 0
+ private variable fsb_gui_initialized 0
constructor {} {
# Configure local ttk styles
@@ -130,14 +135,14 @@ class FSBrowser {
# @return void
public method PrepareFSBrowser {_parent} {
set parent $_parent
- set gui_initialized 0
+ set fsb_gui_initialized 0
}
## Create GUI of tab "File system browser"
# @return void
public method CreateFSBrowserGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$fsb_gui_initialized} {return}
+ set fsb_gui_initialized 1
set fs_browser_current_dir [$this cget -projectPath]
@@ -157,8 +162,8 @@ class FSBrowser {
{current "Current document folder" {next} {filelist_fsb_current_doc_folder}
"Go to directory containing the current document"}
{configure "Configure" {configure} {filelist_fsb_popup_config_menu}
- "Filesystem browser configuration menu"}
- }
+ "File system browser configuration menu"}
+ } [namespace current]
${fs_browser_toolbar}forward configure -state disabled
${fs_browser_toolbar}back configure -state disabled
@@ -240,7 +245,7 @@ class FSBrowser {
bind $fs_browser_filter <Return> [list $this filelist_fsb_filter_ok]
bind $fs_browser_filter <KP_Enter> [list $this filelist_fsb_filter_ok]
bind $fs_browser_filter <<ComboboxSelected>> [list $this filelist_fsb_filter_ok]
- DynamicHelp::add $fs_browser_filter -text [mc "Filter"]
+ DynamicHelp::add $fs_browser_filter -text [mc "Filter"]
setStatusTip -widget $fs_browser_filter \
-text [mc "File filter"]
set val [lsearch -exact -ascii {{*.asm} {*.inc} {*.c} {*.h} {*}} $fs_browser_current_mask]
@@ -250,7 +255,7 @@ class FSBrowser {
$fs_browser_filter current $val
pack $fs_browser_filter -fill x -expand 1 -side left
- # Pack componets of filesystem browser
+ # Pack componets of file system browser
pack $fs_browser_toolbar -anchor w
pack $fs_browser_dir_frame -fill x -pady 3
pack $fs_browser_listbox_frame -fill both -expand 1
@@ -262,12 +267,12 @@ class FSBrowser {
set fs_browser_bm_menu $parent.bm_menu
filelist_fsb_makePopupMenu
- # Initialize filesystem browser
+ # Initialize file system browser
filelist_fsb_change_dir $fs_browser_current_dir
filelist_fsb_refresh_bookmarks
}
- ## Popup bookmarks menu for filesystem browser
+ ## Popup bookmarks menu for file system browser
# @return void
public method filelist_fsb_popup_bm_menu {} {
set x [winfo rootx ${fs_browser_toolbar}bookmark]
@@ -277,7 +282,7 @@ class FSBrowser {
tk_popup $fs_browser_bm_menu $x $y
}
- ## Popup configuration menu for filesystem browser
+ ## Popup configuration menu for file system browser
# @return void
public method filelist_fsb_popup_config_menu {} {
set x [winfo rootx ${fs_browser_toolbar}configure]
@@ -287,7 +292,7 @@ class FSBrowser {
tk_popup $fs_browser_conf_menu $x $y
}
- ## Popup filesystem browser listbox menu
+ ## Popup file system browser listbox menu
# @parm Int x - Relative horizontal position of mouse pointer
# @parm Int y - Relative vertical position of mouse pointer
# @return void
@@ -306,7 +311,7 @@ class FSBrowser {
tk_popup $fs_browser_listbox_menu $x $y
}
- ## Popup filesystem browser listbox menu
+ ## Popup file system browser listbox menu
# @parm Int x - Relative horizontal position of mouse pointer
# @parm Int y - Relative vertical position of mouse pointer
# @parm String item - Selected item (file of directory)
@@ -325,11 +330,11 @@ class FSBrowser {
tk_popup $fs_browser_listbox_menu $x $y
}
- ## Change current directory in filesystem browser
+ ## Change current directory in file system browser
# @parm String dir - New directory location
# @return void
public method filelist_fsb_change_dir {dir} {
- if {!$gui_initialized} {CreateFSBrowserGUI}
+ if {!$fsb_gui_initialized} {CreateFSBrowserGUI}
if {$::MICROSOFT_WINDOWS} {
# Transform for instance "C:" to "C:/"
@@ -340,14 +345,16 @@ class FSBrowser {
# Check if the given directory is valid
if {![file exists $dir] || ![file isdirectory $dir]} {
- tk_messageBox -parent . \
+ tk_messageBox
+ -parent . \
-title [mc "Invalid directory"] \
- -type ok -icon warning \
+ -type ok \
+ -icon warning \
-message [mc "The specified directory does not exist:\n%s" $dir]
return
}
- # Normalize path and configure toolbar (history control)
+ # Normalize path and configure toolbar (history controll)
set dir [file normalize $dir]
if {$dir != $fs_browser_current_dir} {
lappend back_history $fs_browser_current_dir
@@ -399,7 +406,7 @@ class FSBrowser {
if {$dir == [file separator]} {
$fs_browser_listbox_menu entryconfigure [::mc "Up"] -state disabled
${fs_browser_toolbar}up configure -state disabled
- } {
+ } else {
$fs_browser_listbox_menu entryconfigure [::mc "Up"] -state normal
${fs_browser_toolbar}up configure -state normal
}
@@ -407,7 +414,7 @@ class FSBrowser {
# Fill directory location combobox
set values {}
set folder $dir
- while 1 {
+ while {1} {
lappend values $folder
if {$folder == [file separator]} {break}
if {$::MICROSOFT_WINDOWS} {
@@ -444,7 +451,7 @@ class FSBrowser {
-parent . \
-icon info \
-type ok \
- -title [mc "Unable to compile"] \
+ -title [mc "Unable to comply"] \
-message [mc "Unable to open source file while simulator is engaged."]
return
}
@@ -491,7 +498,7 @@ class FSBrowser {
}
# Open directory
- } {
+ } else {
filelist_fsb_change_dir \
[file join $fs_browser_current_dir [lindex $file 1]]
}
@@ -512,7 +519,7 @@ class FSBrowser {
# This method shoul be called after FSD close
# @return void
public method filelist_fsb_refresh_bookmarks {} {
- if {!$gui_initialized} {CreateFSBrowserGUI}
+ if {!$fsb_gui_initialized} {CreateFSBrowserGUI}
# Clear current bookmarks entries
if {[$fs_browser_bm_menu index end] > 2} {
@@ -555,15 +562,15 @@ class FSBrowser {
set fs_browser_current_dir $tmp
# File selected -> bookmark current directory
- } {
+ } else {
filelist_fsb_add_bookmark
}
}
- ## Reload filesystem browser contents
+ ## Reload file system browser contents
# @return void
public method filelist_fsb_reload {} {
- if {!$gui_initialized} {CreateFSBrowserGUI}
+ if {!$fsb_gui_initialized} {CreateFSBrowserGUI}
filelist_fsb_change_dir $fs_browser_current_dir
}
@@ -599,7 +606,7 @@ class FSBrowser {
if {![llength $back_history]} {
${fs_browser_toolbar}back configure -state disabled
$fs_browser_listbox_menu entryconfigure [::mc "Back"] -state disabled
- } {
+ } else {
${fs_browser_toolbar}back configure -state normal
$fs_browser_listbox_menu entryconfigure [::mc "Back"] -state normal
}
@@ -633,7 +640,7 @@ class FSBrowser {
if {![llength $forward_history]} {
${fs_browser_toolbar}forward configure -state disabled
$fs_browser_listbox_menu entryconfigure [::mc "Forward"] -state disabled
- } {
+ } else {
${fs_browser_toolbar}forward configure -state normal
$fs_browser_listbox_menu entryconfigure [::mc "Forward"] -state normal
}
@@ -648,7 +655,7 @@ class FSBrowser {
set file [$this editor_procedure {} getFileName {}]
if {[lindex $file 0] != {}} {
set dir [lindex $file 0]
- } {
+ } else {
set dir $projectPath
}
# Change current directory
@@ -697,7 +704,7 @@ class FSBrowser {
-message [mc "Do you really want to delete file:\n%s" $filename]]
==
{yes}
- } {
+ } then {
if {[catch {file delete -force -- [file join $fs_browser_current_dir $filename]}]} {
tk_messageBox \
-parent . \
@@ -714,7 +721,7 @@ class FSBrowser {
# @return void
public method filelist_fsb_new_folder {} {
# Create dialog window
- set dialog [toplevel .new_dir_dialog -class {New folder} -bg {#EEEEEE}]
+ set dialog [toplevel .new_dir_dialog -class {New folder} -bg ${::COMMON_BG_COLOR}]
# Create header
pack [label $dialog.header \
@@ -774,7 +781,7 @@ class FSBrowser {
# Local variables
set dialog .new_dir_dialog ;# ID of dialog window
set folder [$dialog.entry get] ;# Name of folder to create
- set error 0 ;# Bool: error occured
+ set error 0 ;# Bool: error occurred
# Check for folder name validity
if {$folder == {}} {
@@ -783,10 +790,13 @@ class FSBrowser {
# Create new folder
if {$error || [catch {file mkdir [file join $fs_browser_current_dir $folder]}]} {
- tk_messageBox -parent $dialog -icon warning -type ok \
+ tk_messageBox \
+ -parent $dialog \
+ -icon warning \
+ -type ok \
-title [mc "Unable to create folder"] \
-message [mc "Unable to create the specified folder"]
- } {
+ } else {
# Remove dialog and reload browser
grab release $dialog
destroy $dialog
@@ -809,7 +819,7 @@ class FSBrowser {
if {[lindex $name 0] == {}} {
set name [lindex $name 1]
set type [mc "Directory"]
- } {
+ } else {
set name [lindex $name 0]
set type [mc "File"]
}
@@ -842,8 +852,8 @@ class FSBrowser {
# Create dialog window componets
- set dialog [toplevel .properties_dialog -class {File properties} -bg {#EEEEEE}] ;# Toplevel window itself
- set nb [NoteBook $dialog.nb -bg {#EEEEEE}] ;# NoteBook
+ set dialog [toplevel .properties_dialog -class {File properties} -bg ${::COMMON_BG_COLOR}] ;# Toplevel window itself
+ set nb [ModernNoteBook $dialog.nb] ;# NoteBook
set bottom_frame [frame $dialog.bottom_frame] ;# Button frame
# Create tabs in NoteBook
@@ -953,7 +963,7 @@ class FSBrowser {
]
# Pack NoteBook and bottom frame
- pack $nb -fill both -expand 1 -padx 10 -pady 5
+ pack [$nb get_nb] -fill both -expand 1 -padx 10 -pady 5
pack $bottom_frame -anchor e -after $nb -padx 10 -pady 5
# Configure dialog window
@@ -987,7 +997,10 @@ class FSBrowser {
# Change permissions
if {[catch {file attributes $file -permissions "0[format {%o} $perm]"}]} {
set error 1
- tk_messageBox -type ok -icon warning -parent $dialog \
+ tk_messageBox \
+ -type ok \
+ -icon warning \
+ -parent $dialog \
-title [mc "Permission denied"] \
-message [mc "Unable to change permissions for file:\n%s" [file tail $file]]
}
@@ -1000,16 +1013,19 @@ class FSBrowser {
file rename -force -- \
$file [file join $dir \
${::KIFSD::FSD::item_properties(name)}]}]
- } {
+ } then {
set error 1
- tk_messageBox -type ok -icon warning -parent $dialog \
+ tk_messageBox \
+ -type ok \
+ -icon warning \
+ -parent $dialog \
-title [mc "Permission denied"] \
-message [mc "Unable to rename file:\n%s\n\t=>\n%s" [file tail $file] ${::KIFSD::FSD::item_properties(name)}]
}
filelist_fsb_reload
}
- # If no error occured, close dialog
+ # If no error occurred, close dialog
if {!$error} {
grab release $dialog
destroy $dialog
@@ -1048,7 +1064,7 @@ class FSBrowser {
# Fill directory location combobox
set folder $content
set values {}
- while 1 {
+ while {1} {
lappend values $folder
if {$folder == [file separator]} {break}
if {$::MICROSOFT_WINDOWS} {
@@ -1068,7 +1084,7 @@ class FSBrowser {
}
}
$fs_browser_dir configure -values $values
- } {
+ } else {
$fs_browser_dir_ok configure -state disabled
$fs_browser_dir configure -style FSBrowser_RedBg.TCombobox
}
@@ -1082,7 +1098,7 @@ class FSBrowser {
filelist_fsb_change_dir [$fs_browser_dir get]
}
- ## Verticaly scroll FileSystem browser ListBox
+ ## Verticaly scroll File System browser ListBox
# @parm Float frac0 - Fraction of top visible area
# @parm Float frac1 - Fraction of bottom visible area
# @return void
@@ -1095,7 +1111,7 @@ class FSBrowser {
}
# Otherwise -> create scrollbar
- } {
+ } else {
if {![winfo ismapped $fs_browser_listbox_v_scrollbar]} {
pack $fs_browser_listbox_v_scrollbar \
-after $fs_browser_listbox \
@@ -1106,7 +1122,7 @@ class FSBrowser {
}
}
- ## Horizontaly scroll FileSystem browser ListBox
+ ## Horizontaly scroll File System browser ListBox
# @parm Float frac0 - Fraction of top visible area
# @parm Float frac1 - Fraction of bottom visible area
# @return void
@@ -1119,7 +1135,7 @@ class FSBrowser {
}
# Otherwise -> create scrollbar
- } {
+ } else {
if {![winfo ismapped $fs_browser_listbox_h_scrollbar]} {
pack $fs_browser_listbox_h_scrollbar \
-after $fs_browser_listbox_top_frame \
@@ -1133,7 +1149,7 @@ class FSBrowser {
## Recreate popup menus
# @return void
public method filelist_fsb_makePopupMenu {} {
- if {!$gui_initialized} {return}
+ if {!$fsb_gui_initialized} {return}
if {[winfo exists $fs_browser_conf_menu]} {
destroy $fs_browser_conf_menu
}
@@ -1144,9 +1160,9 @@ class FSBrowser {
destroy $fs_browser_bm_menu
}
- menuFactory $FSMENU_CONFIGURE $fs_browser_conf_menu 0 "$this " 0 {}
- menuFactory $FSMENU_LISTBOX $fs_browser_listbox_menu 0 "$this " 0 {}
- menuFactory $FSMENU_BOOKMARKS $fs_browser_bm_menu 0 "$this " 0 {}
+ menuFactory $FSMENU_CONFIGURE $fs_browser_conf_menu 0 "$this " 0 {} [namespace current]
+ menuFactory $FSMENU_LISTBOX $fs_browser_listbox_menu 0 "$this " 0 {} [namespace current]
+ menuFactory $FSMENU_BOOKMARKS $fs_browser_bm_menu 0 "$this " 0 {} [namespace current]
if {![llength $back_history]} {
$fs_browser_listbox_menu entryconfigure [::mc "Back"] -state disabled
@@ -1162,3 +1178,7 @@ class FSBrowser {
return $fs_browser_current_mask
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/leftpanel/sfrwatches.tcl b/lib/leftpanel/sfrwatches.tcl
index ba47dc5..8c1a8e4 100755..100644
--- a/lib/leftpanel/sfrwatches.tcl
+++ b/lib/leftpanel/sfrwatches.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 _SFRWATCHES_TCL ] } {
+set _SFRWATCHES_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Provides SFR watches for left panel
@@ -30,26 +35,26 @@ class SFRWatches {
## COMMON
# Font for addresses and register names
- common main_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -14 \
- -weight bold \
+ common main_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight bold \
]
# Just another font but not bold
- common roman_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -14 \
+ common roman_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
]
# Fonr for register entry boxes
- common entry_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight bold \
+ common entry_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
]
## PRIVATE
private variable text_widget ;# Widget: Text widget containing SFR watches
- private variable scrollbar ;# Widget: Scrollbar for $text_widget
+ private variable scrollbar {} ;# Widget: Scrollbar for $text_widget
private variable search_entry ;# Widget: Search entry box at the bottom of the panel
private variable search_clear_but ;# Widget: Button "Clear" at the bottom of the panel
private variable main_left_frame ;# Widget: Frame containing $text_widget and its header label
@@ -57,20 +62,20 @@ class SFRWatches {
private variable validation_ena 1 ;# Bool: SFR entry box validation enabled
private variable haddr2idx ;# Array: $haddr2idx($hex_addr) --> row_in_text_widget - 1
private variable addr2idx ;# Array: $addr2idx($dec_addr) --> row_in_text_widget - 1
- private variable reg2idx ;# Array: $addr2idx($register_name_upppercase) --> row_in_text_widget - 1
+ private variable reg2idx ;# Array: $addr2idx($register_name_uppercase) --> row_in_text_widget - 1
private variable last_selected_line 0 ;# Int: Selected row in the text widget
private variable search_ena 1 ;# Bool: Search enabled
private variable menu ;# Widget: Popup menu for the text widget
# Variables related to object initialization
private variable parent ;# Parent GUI object (tempotary variable)
- private variable gui_initialized 0 ;# GUI ready
+ private variable sfrw_gui_initialized 0 ;# GUI ready
constructor {} {
}
destructor {
- if {$gui_initialized} {
+ if {$sfrw_gui_initialized} {
menu_Sbar_remove $menu
}
}
@@ -80,14 +85,14 @@ class SFRWatches {
# @return void
public method PrepareSFRWatches {_parent} {
set parent $_parent
- set gui_initialized 0
+ set sfrw_gui_initialized 0
}
## Initialize SFR watches GUI
# @return void
public method CreateSFRWatchesGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$sfrw_gui_initialized} {return}
+ set sfrw_gui_initialized 1
set validation_ena 0
create_GUI
@@ -106,10 +111,10 @@ class SFRWatches {
# @parm String reg - SFR name (e.g. PSW)
# @return Widget - Created entry box
private method create_entry {i type addr reg} {
- # Determinate entry box width
+ # Determine entry box width
if {$type == {hex}} {
set width 2
- } {
+ } else {
set width 3
}
@@ -146,7 +151,7 @@ class SFRWatches {
$text_widget.dec_entry_${i} selection clear
update
$text_widget.dec_entry_${i} icursor 0"
- } {
+ } else {
bind $entry <Key-Left> "
focus $text_widget.hex_entry_${i}
$text_widget.hex_entry_${i} selection clear
@@ -165,7 +170,7 @@ class SFRWatches {
# Iterate over defined SFRs ({{addr name} ... })
foreach reg [$this simulator_get_sfrs] {
- # Determinate hexadecimal address
+ # Determine hexadecimal address
set addr [lindex $reg 0]
set hex_addr [format %X $addr]
if {[string length $hex_addr] == 1} {
@@ -173,7 +178,7 @@ class SFRWatches {
} elseif {[string length $hex_addr] == 3} {
set hex_addr [string replace $hex_addr 0 0]
}
- # Determinate register name and make it 8 characters long
+ # Determine register name and make it 8 characters long
set reg [lindex $reg 1]
set reg_org $reg
switch -- $reg {
@@ -264,7 +269,7 @@ class SFRWatches {
{} "Set this register to 0"}
{command {Set to 0xFF} {} 9 "sfr_watches_set_current_to FF"
{} "Set this register to 255"}
- } $menu 0 "$this " 0 {}
+ } $menu 0 "$this " 0 {} [namespace current]
# Set event bindings for the text widget
bindtags $text_widget $text_widget
@@ -321,13 +326,17 @@ class SFRWatches {
# @parm Float frac1 - 2nd fraction
# @return void
public method sfr_watches_scroll_set {frac0 frac1} {
+ if {$scrollbar == {}} {
+ return
+ }
+
# Hide scrollbar
if {$frac0 == 0 && $frac1 == 1} {
if {[winfo ismapped $scrollbar]} {
pack forget $scrollbar
}
# Show scrollbar
- } {
+ } else {
if {![winfo ismapped $scrollbar]} {
pack $scrollbar \
-side left \
@@ -351,7 +360,7 @@ class SFRWatches {
$search_entry configure -style TEntry
sfr_watches_select_line 1 0 hex
return 1
- } {
+ } else {
$search_clear_but configure -state normal
}
@@ -363,7 +372,7 @@ class SFRWatches {
# Search successful
if {![string first $string $str]} {
$search_entry configure -style StringFound.TEntry
- sfr_watches_select_line 1 [expr {[subst "\${${arr}(${str})}"] + 1}] hex
+ sfr_watches_select_line 1 [expr {[subst -nocommands "\${${arr}(${str})}"] + 1}] hex
return 1
}
}
@@ -392,7 +401,7 @@ class SFRWatches {
-bg {#FFFFFF} -disabledbackground {#FFFFFF}
}
set cursor [$text_widget.${type}_entry_$last_selected_line index insert]
- } {
+ } else {
set cursor 0
}
@@ -454,7 +463,7 @@ class SFRWatches {
return 0
}
set value [expr "0x$value"]
- } {
+ } else {
if {![string is digit $value]} {
set validation_ena 1
return 0
@@ -475,7 +484,7 @@ class SFRWatches {
if {$type == {hex}} {
$text_widget.dec_entry_$addr2idx($addr) delete 0 end
$text_widget.dec_entry_$addr2idx($addr) insert 0 $value
- } {
+ } else {
set value [format %X $value]
if {[string length $value] == 1} {
set value "0$value"
@@ -492,7 +501,7 @@ class SFRWatches {
## Remove all SFRs for the text widget and unregister them
# @return void
private method clear_gui {} {
- if {!$gui_initialized} {return}
+ if {!$sfrw_gui_initialized} {return}
# Clear SFR name label highlight in simultor contol panel
if {$last_selected_line} {
@@ -518,13 +527,13 @@ class SFRWatches {
# @parm Int new_val - New SFR value
# @return void
public method sfr_watches_sync {addr new_val} {
- if {!$gui_initialized} {return}
+ if {!$sfrw_gui_initialized} {return}
# Prevent recursion
if {!$validation_ena} {return}
set validation_ena 0
- # Check if this SFR is avaliable here
+ # Check if this SFR is available here
if {[lsearch [array names addr2idx] $addr] == -1} {
set validation_ena 1
return
@@ -560,7 +569,7 @@ class SFRWatches {
## Enable this panel
# @return vois
public method sfr_watches_enable {} {
- if {!$gui_initialized} {return}
+ if {!$sfrw_gui_initialized} {return}
$menu entryconfigure [::mc "Set to 0x00"] -state normal
$menu entryconfigure [::mc "Set to 0xFF"] -state normal
for {set i 0} {$i < $entry_count} {incr i} {
@@ -572,7 +581,7 @@ class SFRWatches {
## Disable this panel
# @return vois
public method sfr_watches_disable {} {
- if {!$gui_initialized} {return}
+ if {!$sfrw_gui_initialized} {return}
$menu entryconfigure [::mc "Set to 0x00"] -state disabled
$menu entryconfigure [::mc "Set to 0xFF"] -state disabled
for {set i 0} {$i < $entry_count} {incr i} {
@@ -582,10 +591,10 @@ class SFRWatches {
}
## This function shuld be call after processor was changed
- # Reload avaliable SFRs
+ # Reload available SFRs
# @return void
public method sfr_watches_commit_new_sfr_set {} {
- if {!$gui_initialized} {return}
+ if {!$sfrw_gui_initialized} {return}
clear_gui
fill_gui
}
@@ -618,3 +627,7 @@ class SFRWatches {
sfr_watches_select_line 0 $line $type
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/lib/FSnotifications.tcl b/lib/lib/FSnotifications.tcl
new file mode 100644
index 0000000..be1d477
--- /dev/null
+++ b/lib/lib/FSnotifications.tcl
@@ -0,0 +1,340 @@
+#!/usr/bin/tclsh
+
+############################################################################
+# Copyright (C) 2011 by Martin Ošmera #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+
+# >>> File inclusion guard
+if { ! [ info exists _FSNOTIFICATIONS_TCL ] } {
+set _FSNOTIFICATIONS_TCL _
+# <<< File inclusion guard
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+# Mechanism for watching over a set of files for modifications made to them
+# on the storage device where there are stored on. It periodically checks
+# modification times of the specified files and generate notifications when
+# some of these times changes.
+# --------------------------------------------------------------------------
+
+namespace eval FSnotifications {
+ variable watch_interval -1 ;# Int: Interval for periodical mtime checks, in ms
+ variable watch_timer {} ;# Object: The watch timer
+
+ # List: Watched files, format:
+ # {
+ # { # <-- Group of files
+ # {directory mtime callback} # <-- Directory specification
+ # { # <-- List of files
+ # {file mtime callback} # <-- File specification
+ # ...
+ # }
+ # } ...
+ # }
+ variable watched_files {}
+
+
+ # ----------------------------------------------------------------------
+ # "PUBLIC" FUNCTIONS
+ # ----------------------------------------------------------------------
+
+ ## Start watching
+ # @parm Int: interval=1500 - Interval for periodical mtime checks, in ms
+ # @return void
+ proc init {{interval 1500}} {
+ variable watch_timer ;# Int: Interval for periodical mtime checks, in ms
+ variable watch_interval ;# Object: The watch timer
+
+ set watch_interval $interval
+
+ # Start the watch timer
+ if {$watch_timer == {}} {
+ set watch_timer [after $watch_interval [list FSnotifications::timeout]]
+ }
+ }
+
+ ## Stop watching
+ # @return void
+ proc stop {} {
+ variable watch_timer ;# Object: The watch timer
+
+ if {$watch_timer != {}} {
+ catch {
+ after cancel $watch_timer
+ }
+ }
+ }
+
+ ## Watch over the specified file
+ # @parm String: filename - Name of the file, or directory, to watch including path
+ # @parm String: callback - Change notification (some command string)
+ # @return Bool - true == File actually added; false == something went wrong
+ proc watch {filename callback} {
+ variable watched_files ;# List: Watched files
+
+ # Check for existence of the specified file
+ if {$filename == {} || ![file exists $filename]} {
+ return 0
+ }
+
+ # Watch directory
+ if {[file isdirectory $filename]} {
+ # Attempt to find already existing group of files
+ set group_index -1
+ foreach group $watched_files {
+ incr group_index
+
+ # Local variables
+ set directory [lindex $group 0] ;# List: Directory specification
+ set files [lindex $group 1] ;# List: List of files
+
+ # Group found
+ if {[lindex $directory 0] == $filename} {
+ # No callback specified -> do nothing
+ if {$callback == {}} {
+ return 0
+ # Set new callback
+ } else {
+ lset watched_files [list $group_index 0 2] $callback
+ return 1
+ }
+ }
+ }
+
+ # Group not found, create a new one
+ lappend watched_files [list [list $filename [file mtime $filename] $callback] [list]]
+
+ # Watch regular file
+ } else {
+ # Local variables
+ set dirname [file dirname $filename] ;# Directory name
+ set tailname [file tail $filename] ;# File name
+
+ # Attempt to find already existing group of files
+ set group_index -1
+ foreach group $watched_files {
+ incr group_index
+
+ # Local variables
+ set directory [lindex $group 0] ;# List: Directory specification
+ set files [lindex $group 1] ;# List: List of files
+
+ # Group found
+ if {[lindex $directory 0] == $dirname} {
+ set file_index -1
+ foreach file_spec $files {
+ incr file_index
+
+ # Local variables
+ set file_name [lindex $file_spec 0] ;# Name of file
+ set file_mtime_rec [lindex $file_spec 1];# Time of the last modification
+ set file_callback [lindex $file_spec 2] ;# Notification callback
+
+ # Set new callback for the specified file
+ if {$file_name == $tailname} {
+ lset watched_files [list $group_index 1 $file_index 2] $callback
+ return 1
+ }
+ }
+
+ # File specification not found, create a new one
+ lappend files [list $tailname [file mtime $filename] $callback]
+
+ # Alter the corresponding group
+ lset watched_files [list $group_index 1] $files
+ return 1
+ }
+ }
+
+ # Group not found, create a new one and create the file specification right away
+ set dir_spec [list $dirname [file mtime $dirname] {}]
+ set file_list [list [list $tailname [file mtime $filename] $callback]]
+ lappend watched_files [list $dir_spec $file_list]
+ return 1
+ }
+ }
+
+ ## Discontinue watching over the specified file
+ # @parm String: filename - Name of the file, or directory, including path
+ # @parm Bool: entire_dir=0 -
+ # If case the filename is directory, stop watching for the entire
+ # directory including all files in it
+ # @return Bool - true == File actually added; false == something went wrong
+ proc forget {filename {entire_dir 0}} {
+ variable watched_files ;# List: Watched files
+
+ # File or directory name has not to be empty
+ if {$filename == {}} {
+ return 0
+ }
+
+ set result 0
+ set dirname [file dirname $filename]
+ set tailname [file tail $filename]
+
+ # Attempt to find the corresponding group of files
+ set o_size [llength $watched_files]
+ for {set group_index 0} {$group_index < $o_size} {incr group_index} {
+
+ # Group directory name matches the filename parameter,
+ #+ so we are about to forget about a directory
+ if {[lindex $watched_files [list $group_index 0 0]] == $filename} {
+
+ # Remove the entire group if the list of files is empty, that means
+ #+ that we were watching only the directory itself, not any particular
+ #+ files in it. Or in case that the removal of the entire directory
+ #+ has been enforced by entire_dir parameter.
+ if {![llength [lindex $watched_files [list $group_index 1]]] || $entire_dir} {
+ set watched_files [lreplace $watched_files $group_index $group_index]
+ set result 1
+
+ # If the group is not empty, then remove just the notification
+ #+ callback for the directory itself.
+ } else {
+ lset watched_files [list $group_index 0 2] {}
+ }
+ }
+
+ # Group directory name matches the directory of the filename
+ #+ parameter, so we about to forget about only a file from
+ #+ that group
+ if {[lindex $watched_files [list $group_index 0 0]] == $dirname} {
+ # Attempt to find the file specification in the group's list of files
+ set fl_size [llength [lindex $watched_files [list $group_index 1]]]
+ for {set file_index 0} {$file_index < $fl_size} {incr file_index} {
+ # File specification found
+ if {[lindex $watched_files [list $group_index 1 $file_index 0]] == $tailname} {
+ # Remove the designated file specification from the group
+ set dir_spec [lindex $watched_files [list $group_index 0]]
+ set file_list [lindex $watched_files [list $group_index 1]]
+ set file_list [lreplace $file_list $file_index $file_index]
+ set watched_files [lreplace $watched_files $group_index $group_index [list $dir_spec $file_list]]
+ set result 1
+ }
+ }
+ }
+ }
+
+ return $result
+ }
+
+
+ # ----------------------------------------------------------------------
+ # INTERNAL FUNCTIONS
+ # ----------------------------------------------------------------------
+
+ ## This function performs the watching itself, it supposed to be called
+ # by the watch timer.
+ # @return void
+ proc timeout {} {
+ variable watch_timer ;# Object: The watch timer
+ variable watched_files ;# List: Watched files
+ variable watch_interval ;# Int: Interval for periodical mtime checks, in ms
+
+ set auto_remove [list]
+
+ # Iterate over the groups
+ set o_size [llength $watched_files]
+ for {set group_index 0} {$group_index < $o_size} {incr group_index} {
+ # Bool: the group is no longer valid, it's directory has
+ #+ been removed from the file system
+ set dir_removed_from_FS 0
+ # String: Directory of the group
+ set dir_name [lindex $watched_files [list $group_index 0 0]]
+
+ # The group directory must exists and must be a directory, otherwise, remove the group
+ if {![file exists $dir_name] || ![file isdirectory $dir_name]} {
+ set dir_removed_from_FS 1
+ lappend auto_remove $dir_name
+ }
+
+ # If the group is no longer valid, we still have to send
+ #+ notifications for all the files in it
+ if {$dir_removed_from_FS} {
+ set dir_mtime_rec -1
+ set dir_mtime_cur -2
+ # Get the last known directory modification time and the current one
+ } else {
+ set dir_mtime_rec [lindex $watched_files [list $group_index 0 1]]
+ set dir_mtime_cur [file mtime $dir_name]
+ }
+
+ # Compare the modification times (detect change in the directory itself)
+ if {$dir_mtime_rec != $dir_mtime_cur} {
+ # Update the recorded directory modification time
+ lset watched_files [list $group_index 0 1] $dir_mtime_cur
+ # Invoke notification callback
+ set dir_callback [lindex $watched_files [list $group_index 0 2]]
+ if {$dir_callback != {}} {
+ uplevel #0 "$dir_callback {$dir_name}"
+ }
+ }
+
+ # Iterate over files in the group
+ set fl_size [llength [lindex $watched_files [list $group_index 1]]]
+ for {set file_index 0} {$file_index < $fl_size} {incr file_index} {
+ set file_removed_from_FS 0
+ set file_name [lindex $watched_files [list $group_index 1 $file_index 0]]
+ set file_name [file join $dir_name $file_name]
+
+ # Check if the file spec. is still valid
+ if {
+ !$dir_removed_from_FS
+ &&
+ ( ![file exists $file_name] || [file isdirectory $file_name] )
+ } then {
+ set file_removed_from_FS 1
+ lappend auto_remove $file_name
+ }
+
+ # If the group is no longer valid, or the file has been removed from the
+ #+ file system, we still have to send notifications for all the files in it
+ if {$dir_removed_from_FS || $file_removed_from_FS} {
+ set file_mtime_rec -1
+ set file_mtime_cur -2
+ } else {
+ set file_mtime_rec [lindex $watched_files [list $group_index 1 $file_index 1]]
+ set file_mtime_cur [file mtime $file_name]
+ }
+
+ # Compare the modification times (detect change in the file)
+ if {$file_mtime_rec != $file_mtime_cur} {
+ # Update the recorded file modification time
+ lset watched_files [list $group_index 1 $file_index 1] $file_mtime_cur
+ # Invoke notification callback
+ set file_callback [lindex $watched_files [list $group_index 1 $file_index 2]]
+ uplevel #0 "$file_callback {$file_name}"
+ }
+ }
+ }
+
+ # Forget files and directories removed from the file system
+ foreach file_to_remove $auto_remove {
+ forget $file_to_remove 1
+ }
+
+ # Again start the watch timer
+ set watch_timer [after $watch_interval [list FSnotifications::timeout]]
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/lib/Math.tcl b/lib/lib/Math.tcl
index bf2be0d..af5e0ae 100755..100644
--- a/lib/lib/Math.tcl
+++ b/lib/lib/Math.tcl
@@ -1,7 +1,7 @@
#!/usr/bin/tclsh
############################################################################
-# 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 #
@@ -20,6 +20,11 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _MATH_TCL ] } {
+set _MATH_TCL _
+# <<< File inclusion guard
# --------------------------------------------------------------------------
# DESCRIPTION
# Primarily implements convertions between numeric systems and angle units.
@@ -51,7 +56,7 @@
# puts [ NumSystem::bin2hex 1111.01 ] ;# --> F.4
# puts [ NumSystem::bin2dec 1111.01 ] ;# --> 15.25
# puts [ NumSystem::bin2oct 1111.01 ] ;# --> 17.2
- #
+ #
# puts [ NumSystem::ascii2dec @ ] ;# --> 64
# puts [ NumSystem::ascii2bin @ ] ;# --> 01000000
#
@@ -273,7 +278,7 @@ namespace eval NumSystem {
if {[regexp {\.\d+$} $number frac]} {
set frac [string range $frac 1 end]
set nofrac 0
- } {
+ } else {
set frac {}
set nofrac 1
}
@@ -334,7 +339,7 @@ namespace eval NumSystem {
if {$result != {}} {
return [dec2bin $result]
}
-
+
return $result
}
@@ -348,7 +353,7 @@ namespace eval NumSystem {
}
set result {}
scan $number {%c} result
-
+
return $result
}
@@ -363,7 +368,7 @@ namespace eval NumSystem {
proc asserthex {number} {
if {![ishex $number]} {
error "asserthex: Excepted hexadecimal value but got \"$number\""
- } {
+ } else {
return 1
}
}
@@ -375,7 +380,7 @@ namespace eval NumSystem {
proc assertdec {number} {
if {![isdec $number]} {
error "assertdec: Excepted decimal value but got \"$number\""
- } {
+ } else {
return 1
}
}
@@ -387,7 +392,7 @@ namespace eval NumSystem {
proc assertoct {number} {
if {![isoct $number]} {
error "assertoct: Excepted octal value but got \"$number\""
- } {
+ } else {
return 1
}
}
@@ -399,7 +404,7 @@ namespace eval NumSystem {
proc assertbin {number} {
if {![isbin $number]} {
error "assertbin: Excepted binary value but got \"$number\""
- } {
+ } else {
return 1
}
}
@@ -466,7 +471,7 @@ namespace eval NumSystem {
if {$base == 8} {
assertoct $number
set char_len 3
- } {
+ } else {
asserthex $number
set char_len 4
}
@@ -478,7 +483,7 @@ namespace eval NumSystem {
if {[regexp {\.[^\.]+$} $number frac]} {
set frac [string range $frac 1 end]
set nofrac 0
- } {
+ } else {
set frac {}
set nofrac 1
}
@@ -486,7 +491,7 @@ namespace eval NumSystem {
# compute int. part
if {$base == 8} {
set int [expr "0$int"]
- } {
+ } else {
set int [expr "0x$int"]
}
@@ -513,7 +518,7 @@ namespace eval NumSystem {
if {$base == 8} {
set v3 $v0
- } {
+ } else {
set v3 [expr {$v0 / 2}]
}
set v2 [expr {$v3 / 2}]
@@ -569,7 +574,7 @@ namespace eval NumSystem {
set mod_1 2
set padding {}
set convCmd {oct_to_bin}
- } {
+ } else {
set modulo 4
set mod_1 3
set padding {0}
@@ -581,7 +586,7 @@ namespace eval NumSystem {
if {[regexp {\.\d+$} $number frac]} {
set frac [string range $frac 1 end]
set nofrac 0
- } {
+ } else {
set frac {}
set nofrac 1
}
@@ -670,7 +675,7 @@ namespace eval NumSystem {
if {[regexp {\.\d+$} $number frac]} {
set frac [string range $frac 1 end]
set nofrac 0
- } {
+ } else {
set frac {}
set nofrac 1
}
@@ -817,7 +822,7 @@ namespace eval NumSystem {
return 0
}
- # 3rd condition (dot must not be at the begining or end)
+ # 3rd condition (dot must not be at the beginning or end)
if {[regexp {^\.} $number]} {return 0}
if {[regexp {\.$} $number]} {return 0}
@@ -940,7 +945,11 @@ namespace eval Angle {
}
# is negative or something else ?
- if {$angle < 0} {set minus 1} {set minus 0}
+ if {$angle < 0} {
+ set minus 1
+ } else {
+ set minus 0
+ }
# adjust angle value
set angle [expr {$angle / $base}]
@@ -952,3 +961,7 @@ namespace eval Angle {
return $angle
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/lib/hexeditor.tcl b/lib/lib/hexeditor.tcl
index ceb9192..fc3c5e6 100755..100644
--- a/lib/lib/hexeditor.tcl
+++ b/lib/lib/hexeditor.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,31 +21,43 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _HEXEDITOR_TCL ] } {
+set _HEXEDITOR_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
-# This class provides simple hexeditor with selectable view mode
+# This class provides simple hex editor with selectable view mode
# and optional ascii view. See constructor and section
# "GENERAL PUBLIC INTERFACE" for more details.
# --------------------------------------------------------------------------
class HexEditor {
- common DEBUG 0 ;# Bool: More secure input data checking
# Font for editor text widget(s) - normal size
- common view_font_n [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -15 \
- ]
+ if {!$::MICROSOFT_WINDOWS} {
+ common view_font_n [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-15 * $::font_size_factor)}] \
+ ]
+ } else {
+ common view_font_n [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-15 * $::font_size_factor)}] \
+ -weight bold \
+ ]
+ }
# Font for editor headers - normal size
- common header_font_n [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -15 \
- -weight bold \
+ common header_font_n [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-15 * $::font_size_factor)}] \
+ -weight bold \
]
# Font for editor headers - small size
- common header_font_s [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight bold \
+ common header_font_s [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
]
common view_font_s $header_font_s ;# Font for editor text widget(s) - small size
common header_bg {#9999FF} ;# Background color for headers
@@ -103,7 +115,7 @@ class HexEditor {
private variable in_cell 0 ;# Bool: mouse pointer in cell (see code below)
private variable motion_binding 0 ;# Bool: Bindings for special mouse events set
private variable view_mode ;# Current view mode (one of {dec hec oct bin})
- private variable ascii_view ;# Bool: Ascii view avaliable
+ private variable ascii_view ;# Bool: Ascii view available
private variable address_length ;# Int: Length of addresses on left address bar
private variable physical_height ;# Int: Height of view in rows
private variable width ;# Int: Number of cells in left view in one row
@@ -162,7 +174,7 @@ class HexEditor {
if {$small} {
set view_font $view_font_s
set header_font $header_font_s
- } {
+ } else {
set view_font $view_font_n
set header_font $header_font_n
}
@@ -189,6 +201,11 @@ class HexEditor {
catch {
destroy $main_frame
}
+
+ # Remove find dialog window if exists
+ if {[winfo exists $find_dialog_win]} {
+ destroy $find_dialog_win
+ }
}
## Create popup menu (for left & right view)
@@ -210,14 +227,17 @@ class HexEditor {
"find_next" {1downarrow} {}}
{command {Find previous} {Shift+F3} 8
"find_prev" {1uparrow} {}}
- } $popup_menu 0 "$this " 0 {}
+ {separator}
+ {command {Fill with pseudo-random values} {} 0
+ "text_random" {} {}}
+ } $popup_menu 0 "$this " 0 {} [namespace current]
# Configure menu entries
$popup_menu entryconfigure [::mc "Find next"] -state disabled
$popup_menu entryconfigure [::mc "Find previous"] -state disabled
}
- ## Create all hexeditor widgets expect popup menu
+ ## Create all hex editor widgets expect popup menu
# @return void
private method create_gui {} {
# Determinate width of left view text widget and cell width
@@ -240,13 +260,16 @@ class HexEditor {
}
# Create button "Select All" in left top corner
- set left_top_button [button $main_frame.left_top_button \
- -bg $header_bg -bd 0 -padx 0 -pady 0 \
- -activebackground white -relief flat \
- -highlightthickness 0 \
- -command "$main_frame.left_view tag add sel 1.0 end" \
- ]
- DynamicHelp::add $main_frame.left_top_button -text [mc "Select all"]
+ if {!$::MICROSOFT_WINDOWS} {
+ set left_top_button [button $main_frame.left_top_button \
+ -bg $header_bg -bd 0 -padx 0 -pady 0 \
+ -activebackground white -relief flat \
+ -highlightthickness 0 \
+ -command "$main_frame.left_view tag add sel 1.0 end" \
+ ]
+ DynamicHelp::add $main_frame.left_top_button -text [mc "Select all"]
+ grid $left_top_button -row 0 -column 0 -sticky nsew
+ }
# Create left address bar
set left_address_bar [text $main_frame.left_address_bar \
-height $physical_height -width $address_length \
@@ -256,7 +279,6 @@ class HexEditor {
-yscrollcommand "$this scrollSet" \
-cursor left_ptr \
]
- grid $left_top_button -row 0 -column 0 -sticky nsew
grid $left_address_bar -row 1 -column 0 -sticky ns
# Create horizontal header for left view
@@ -315,7 +337,7 @@ class HexEditor {
grid rowconfigure $main_frame 1 -weight 1
}
- ## Create event bindings for all hexeditor widgets (except popup menu)
+ ## Create event bindings for all hex editor widgets (except popup menu)
# @return void
private method create_bindings {} {
## LEFT PART
@@ -363,6 +385,8 @@ class HexEditor {
} {
bind $left_view $key "[bind Text $key]; break"
}
+ bind $left_view <Double-Button-1> {break}
+ bind $left_view <Triple-Button-1> {break}
bind $left_view <Button-4> "$this scroll scroll -3 units"
bind $left_view <Button-5> "$this scroll scroll +3 units"
@@ -430,6 +454,8 @@ class HexEditor {
} {
bind $right_view $key "[bind Text $key]; break"
}
+ bind $right_view <Double-Button-1> {break}
+ bind $right_view <Triple-Button-1> {break}
bind $right_view <Button-4> "$this scroll scroll -3 units"
bind $right_view <Button-5> "$this scroll scroll +3 units"
@@ -449,31 +475,35 @@ class HexEditor {
-background $current_full_bg \
-foreground {#000000}
# Cursor position for active view and inactive view
- foreach widget [list $left_header $left_view] {
+ foreach widget [list $left_header $left_view] \
+ font [list $header_font $view_font] \
+ {
$widget tag configure tag_current_full \
- -font $header_font \
+ -font $font \
-background $current_full_bg \
-foreground {#000000}
$widget tag configure tag_current_half \
- -font $header_font \
+ -font $font \
-background $current_half_bg \
-foreground {#000000}
}
# Nth row backrgound
- $left_view tag configure tag_n_row -background $n_row_bg
+ $left_view tag configure tag_n_row \
+ -background $n_row_bg \
+ -font $view_font
# Cell highlight
$left_view tag configure tag_hg \
-foreground $highlight_fg \
- -font $header_font
+ -font $view_font
$left_view tag configure tag_bg_hg \
-background $highlight_bg \
- -font $header_font
+ -font $view_font
$left_view tag configure tag_bg_hg1 \
-background $highlight_bg1 \
- -font $header_font
+ -font $view_font
$left_view tag configure tag_bg_hg2 \
-background $highlight_bg2 \
- -font $header_font
+ -font $view_font
# Other tags
$left_view tag configure normal_font \
-font $view_font
@@ -525,28 +555,30 @@ class HexEditor {
# Cursor position for active view
$right_view tag configure tag_current_full \
- -font $header_font \
+ -font $view_font \
-background $current_full_bg
# Cursor position for inactive view
$right_view tag configure tag_current_half \
- -font $header_font \
+ -font $view_font \
-background $current_half_bg
# Nth row backrgound
- $right_view tag configure tag_n_row -background $n_row_bg
+ $right_view tag configure tag_n_row \
+ -background $n_row_bg \
+ -font $view_font
# Cell highlight
$right_view tag configure tag_hg \
-foreground $highlight_fg \
- -font $header_font
+ -font $view_font
$right_view tag configure tag_bg_hg \
-background $highlight_bg \
- -font $header_font
+ -font $view_font
$right_view tag configure tag_bg_hg1 \
-background $highlight_bg1 \
- -font $header_font
+ -font $view_font
$right_view tag configure tag_bg_hg2 \
-background $highlight_bg2 \
- -font $header_font
+ -font $view_font
# Other tags
$right_view tag configure normal_font \
@@ -638,7 +670,7 @@ class HexEditor {
$left_header delete 1.0 end
if {$view_mode == {hex}} {
set space { }
- } {
+ } else {
$left_header insert end { }
set space { }
}
@@ -704,7 +736,7 @@ class HexEditor {
if {$cell} {
if {$view_mode != {hex}} {
set start_col [expr {$cell * 4}]
- } {
+ } else {
set start_col [expr {$cell * 3}]
}
}
@@ -713,7 +745,7 @@ class HexEditor {
set end_col $start_col
if {$view_mode != {hex}} {
incr end_col 3
- } {
+ } else {
incr end_col 2
}
@@ -730,13 +762,13 @@ class HexEditor {
if {$view == {left}} {
if {$view_mode != {hex}} {
set step 4
- } {
+ } else {
set step 3
}
scan [$left_view index $index] {%d.%d} row col
set cell [expr {($col / $step)}]
# Right view
- } {
+ } else {
scan [$right_view index $index] {%d.%d} row cell
}
@@ -751,7 +783,7 @@ class HexEditor {
private method col_to_start_end {col} {
if {$view_mode != {hex}} {
set step 4
- } {
+ } else {
set step 3
}
@@ -835,7 +867,7 @@ class HexEditor {
if {($col % 4) == 3} {
set index [$left_view index "$index+1c"]
}
- } {
+ } else {
if {($col % 3) == 2} {
set index [$left_view index "$index+1c"]
}
@@ -854,7 +886,7 @@ class HexEditor {
scan [$right_view index insert] {%d.%d} row cell
if {$view_mode != {hex}} {
set step 4
- } {
+ } else {
set step 3
}
set cursor_address_original $cursor_address
@@ -933,6 +965,43 @@ class HexEditor {
}
}
+ ## Fill the selected are with random values
+ # @return void
+ public method text_random {} {
+ #
+ if {$selected_view == {left}} {
+ set view_widget $left_view
+
+ } elseif {$ascii_view && $selected_view == {right}} {
+ set view_widget $right_view
+
+ } else {
+ return
+ }
+
+ #
+ if {![llength [$view_widget tag nextrange sel 0.0]]} {
+ return
+ }
+
+ #
+ set start_address [index_to_address $selected_view [$view_widget index sel.first]]
+ set end_address [index_to_address $selected_view [$view_widget index sel.last]]
+
+ #
+ for {set i $start_address} {$i <= $end_address} {incr i} {
+ if {$i >= $total_capacity} {
+ break
+ }
+
+ set value [expr {int(256 * rand()) & 0x0ff}]
+ setValue $i $value
+ if {$cell_value_changed_cmd_set} {
+ eval "$cell_value_changed_cmd $i $value"
+ }
+ }
+ }
+
## Synchronize selection in right view with left view
# Binding for event <<Selection>>
# @return void
@@ -944,7 +1013,7 @@ class HexEditor {
if {![llength [$right_view tag nextrange sel 0.0]]} {
set selection_sync_in_P 0
set anything_selected 0
- } {
+ } else {
set anything_selected 1
}
@@ -968,7 +1037,7 @@ class HexEditor {
if {$view_mode != {hex}} {
set step 4
- } {
+ } else {
set step 3
}
@@ -1033,7 +1102,7 @@ class HexEditor {
eval $scroll_action_cmd
}
- update idle
+ update idletasks
set scroll_in_progress 0
}
@@ -1050,7 +1119,7 @@ class HexEditor {
if {![llength [$left_view tag nextrange sel 0.0]]} {
set selection_sync_in_P 0
set anything_selected 0
- } {
+ } else {
set anything_selected 1
}
@@ -1106,7 +1175,7 @@ class HexEditor {
# Get clipboard contents
if {[catch {
set text [clipboard get]
- }]} {
+ }]} then {
set text {}
}
# If clipboard empty then return
@@ -1316,7 +1385,7 @@ class HexEditor {
}
}
- ## Invoke hexeditor popup menu
+ ## Invoke hex editor popup menu
# @parm String side - "left" or "right"
# @parm Int x - Relative mouse pointer position
# @parm Int y - Relative mouse pointer position
@@ -1328,7 +1397,7 @@ class HexEditor {
if {$selected_view == {left}} {
set widget $left_view
left_view_move_insert $x $y
- } {
+ } else {
set widget $right_view
}
@@ -1343,16 +1412,16 @@ class HexEditor {
# Configure popup menu
if {[llength [$widget tag nextrange sel 0.0]]} {
$popup_menu entryconfigure [::mc "Copy"] -state normal
- } {
+ } else {
$popup_menu entryconfigure [::mc "Copy"] -state disabled
}
if {[catch {
if {[string length [clipboard get]]} {
$popup_menu entryconfigure [::mc "Paste"] -state normal
- } {
+ } else {
$popup_menu entryconfigure [::mc "Paste"] -state disabled
}
- }]} {
+ }]} then {
$popup_menu entryconfigure [::mc "Paste"] -state disabled
}
@@ -1449,7 +1518,7 @@ class HexEditor {
if {($val < 127) && [string is print -strict $char]} {
$right_view insert $cell $char
$right_view tag remove tag_np $cell "$cell+1c"
- } {
+ } else {
$right_view insert $cell {.}
$right_view tag add tag_np $cell "$cell+1c"
}
@@ -1459,7 +1528,7 @@ class HexEditor {
# Adjust insertion cursor
if {($row == $height) && ($col >= ($left_view_width - 1))} {
left_view_adjust_cursor
- } {
+ } else {
left_view_movement 0 Right
}
}
@@ -1541,7 +1610,7 @@ class HexEditor {
}
if {$col == $col_s} {
set correction {-2c}
- } {
+ } else {
set correction {-1c}
}
}
@@ -1552,7 +1621,7 @@ class HexEditor {
}
if {$col == $col_e} {
set correction {+2c}
- } {
+ } else {
set correction {+1c}
}
}
@@ -1599,10 +1668,10 @@ class HexEditor {
# Adjust selection
if {!$select} {
set cur_idx [$left_view index insert]
- } {
+ } else {
if {[$left_view compare $cur_idx <= insert]} {
$left_view tag add sel $cur_idx insert
- } {
+ } else {
$left_view tag add sel insert $cur_idx
}
}
@@ -1687,7 +1756,7 @@ class HexEditor {
scan $index {%d.%d} row col
if {$view_mode != {hex}} {
set step 4
- } {
+ } else {
set step 3
}
@@ -1730,13 +1799,13 @@ class HexEditor {
return $popup_menu
}
- ## Get list of values from hexeditor
+ ## Get list of values from hex editor
# @parm Int start - Start address
# @parm Int end - End address
# @return List - List of decimal values (e.g. {0 226 {} {} 126 {} 6 8})
public method get_values {start end} {
# Check for allowed address range
- if {$DEBUG} {
+ if {${::DEBUG}} {
if {$end >= $total_capacity} {
error "Address out of range"
}
@@ -1764,7 +1833,7 @@ class HexEditor {
if {$view_mode != {hex}} {
set step 4
set len 3
- } {
+ } else {
set step 3
set len 2
}
@@ -1813,7 +1882,7 @@ class HexEditor {
if {$start == $end} {
return [lindex $result 0]
- } {
+ } else {
return $result
}
}
@@ -1837,7 +1906,7 @@ class HexEditor {
$left_view delete $row.$start_col $row.$end_col
if {$view_mode != {hex}} {
$left_view insert $row.$start_col { }
- } {
+ } else {
$left_view insert $row.$start_col { }
}
$left_view mark set insert $index
@@ -1854,7 +1923,7 @@ class HexEditor {
if {$cursor_address == $address} {
if {$selected_view == {left}} {
left_view_adjust_cursor
- } {
+ } else {
right_view_adjust_cursor
}
}
@@ -1867,7 +1936,7 @@ class HexEditor {
}
# Validate input address and value
- if {$DEBUG} {
+ if {${::DEBUG}} {
if {$address >= $total_capacity} {
error "Address out of range"
}
@@ -1926,7 +1995,7 @@ class HexEditor {
if {($original_value < 127) && [string is print -strict $value]} {
$right_view insert $row.$cell $value
$right_view tag remove tag_np $row.$cell "$row.$cell+1c"
- } {
+ } else {
$right_view insert $row.$cell {.}
$right_view tag add tag_np $row.$cell $row.$end_col
}
@@ -1945,7 +2014,7 @@ class HexEditor {
if {$cursor_address == $address} {
if {$selected_view == {left}} {
left_view_adjust_cursor
- } {
+ } else {
right_view_adjust_cursor
}
}
@@ -1962,7 +2031,7 @@ class HexEditor {
}
if {$selected_view == {left}} {
focus $right_view
- } {
+ } else {
focus $left_view
}
}
@@ -1994,7 +2063,7 @@ class HexEditor {
# @return void
public method set_bg_hg {address bool type} {
# Validate input address
- if {$DEBUG} {
+ if {${::DEBUG}} {
if {$address >= $total_capacity} {
error "Address out of range"
}
@@ -2020,7 +2089,7 @@ class HexEditor {
set tag {tag_bg_hg2}
}
}
- if {[subst "\$${arr}($address)"] == $bool} {
+ if {[subst -nocommands "\$${arr}($address)"] == $bool} {
return
}
set ${arr}($address) $bool
@@ -2035,7 +2104,7 @@ class HexEditor {
# Create highlight
if {$bool} {
set bool {add}
- } {
+ } else {
set bool {remove}
}
$left_view tag $bool $tag $row.$start_col $row.$end_col
@@ -2050,7 +2119,7 @@ class HexEditor {
# @return void
public method setHighlighted {address bool} {
# Validate input address
- if {$DEBUG} {
+ if {${::DEBUG}} {
if {$address >= $total_capacity} {
error "Address out of range"
}
@@ -2077,7 +2146,7 @@ class HexEditor {
# Create highlight
if {$bool} {
set bool {add}
- } {
+ } else {
set bool {remove}
}
$left_view tag $bool tag_hg $row.$start_col $row.$end_col
@@ -2152,7 +2221,7 @@ class HexEditor {
$left_view mark set insert $row.$start_col
$left_view see insert
left_view_adjust_cursor
- } {
+ } else {
$right_view mark set insert $row.$cell
$right_view see insert
right_view_adjust_cursor
@@ -2177,7 +2246,7 @@ class HexEditor {
# Adjust cursor
if {$selected_view == {left}} {
$left_view see $row.$start_col
- } {
+ } else {
$right_view see $row.$cell
}
}
@@ -2256,7 +2325,7 @@ class HexEditor {
[index_to_address {left} [$left_view index sel.first+1c]] \
[index_to_address {left} [$left_view index sel.last-1c]] \
]
- } {
+ } else {
return {}
}
}
@@ -2340,13 +2409,13 @@ class HexEditor {
foreach val $values {
if {!$first} {
$left_view insert $lineend { }
- } {
+ } else {
set first 0
}
if {$val == {}} {
$left_view insert $lineend $space
continue
- } {
+ } else {
set val [string trimleft $val 0]
if {$val == {}} {
set val 0
@@ -2358,7 +2427,7 @@ class HexEditor {
set val [expr "0x$val"]
# HEX -> OCT
- } {
+ } else {
set val [expr "0x$val"]
set val [format {%o} $val]
}
@@ -2369,7 +2438,7 @@ class HexEditor {
set val [format %X $val]
# DEC -> OCT
- } {
+ } else {
set val [format %o $val]
}
}
@@ -2380,7 +2449,7 @@ class HexEditor {
set val [format %X $val]
# OCT -> DEC
- } {
+ } else {
set val [expr "0$val"]
}
}
@@ -2418,31 +2487,39 @@ class HexEditor {
}
}
- ## Set hexeditor enabled/disabled state
+ ## Set hex editor enabled/disabled state
# @parm Bool bool - 1 == enabled; 0 == disabled
# @return void
public method setDisabled {bool} {
set disabled $bool
- # Set state for left view
if {$bool} {
- $left_view configure -state disabled
+ set state {disabled}
+ } else {
+ set state {normal}
+ }
+
+ # Set state for the left view
+ $left_view configure -state $state
+ if {$bool} {
$left_view configure -bg {#F8F8F8} -fg {#999999} ;#DDDDDD
- } {
- $left_view configure -state normal
+ } else {
$left_view configure -bg {#FFFFFF} -fg {#000000}
}
- # Set state for right view
+ # Set state for the right view
if {$ascii_view} {
+ $right_view configure -state $state
if {$bool} {
- $right_view configure -state disabled
$right_view configure -bg {#F8F8F8} -fg {#999999} ;#DDDDDD
- } {
- $right_view configure -state normal
+ } else {
$right_view configure -bg {#FFFFFF} -fg {#000000}
}
}
+
+ # Set state for certain menu entries
+ $popup_menu entryconfigure [::mc "Paste"] -state $state
+ $popup_menu entryconfigure [::mc "Fill with pseudo-random values"] -state $state
}
## Get reference of left view text widget
@@ -2481,7 +2558,7 @@ class HexEditor {
}
}
- ## Find next occurence of search string
+ ## Find next occurrence of search string
# @return Bool - 0 == Invalid call; 1 == Valid call
public method find_next {} {
if {$last_find_index == {}} {
@@ -2489,13 +2566,13 @@ class HexEditor {
}
if {$find_opt(bw)} {
set result [find_FIND $last_find_index-[string length $text_to_find]c]
- } {
+ } else {
set result [find_FIND $last_find_index]
}
return $result
}
- ## Find previous occurence of search string
+ ## Find previous occurrence of search string
# @return Bool - 0 == Invalid call; 1 == Valid call
public method find_prev {} {
if {$last_find_index == {}} {
@@ -2507,7 +2584,7 @@ class HexEditor {
if {$find_opt(bw)} {
set result [find_FIND $last_find_index-[string length $text_to_find]c]
- } {
+ } else {
set result [find_FIND $last_find_index]
}
@@ -2518,10 +2595,12 @@ class HexEditor {
## Invoke dialog: Find string
# @return Bool - 1 == string found; 0 == string not found
public method find_dialog {} {
- # Create toplevel find_dialog_window
+ # Remove previous find dialog windows
if {[winfo exists $find_dialog_win]} {
destroy $find_dialog_win
}
+
+ # Create toplevel find_dialog_window
incr find_dialog_count
set find_dialog_win [toplevel .hex_editor_find_dialog_$find_dialog_count]
@@ -2579,13 +2658,13 @@ class HexEditor {
-compound left \
-image ::ICONS::16::ok \
-command "$this find_FIND" \
- ] -side left
+ ] -side left -padx 2
pack [ttk::button $buttonFrame.cancel \
-text [mc "Cancel"] \
-compound left \
-image ::ICONS::16::button_cancel \
-command "$this find_CANCEL" \
- ] -side left
+ ] -side left -padx 2
# Events binding (Enter == Find; Escape == Cancel)
bind $find_dialog_win <KeyRelease-Return> "$this find_FIND; break"
@@ -2594,7 +2673,7 @@ class HexEditor {
# Pack dialog frames
pack $top_frame -fill both -anchor nw -padx 5 -pady 5
- pack $buttonFrame -side bottom -anchor e -padx 5
+ pack $buttonFrame -side bottom -anchor e -padx 5 -pady 5
# Window manager options -- modal find_dialog_window
wm iconphoto $find_dialog_win ::ICONS::16::find
@@ -2613,7 +2692,7 @@ class HexEditor {
tkwait window $find_dialog_win
if {$last_find_index == {}} {
return 0
- } {
+ } else {
return 1
}
}
@@ -2629,18 +2708,18 @@ class HexEditor {
set start_index [lindex $args 0]
if {$where_to_search == {left}} {
set widget $left_view
- } {
+ } else {
set widget $right_view
}
if {$find_opt(bw)} {
set direction {-backwards}
- } {
+ } else {
set direction {-forwards}
}
if {$start_index == {}} {
if {$find_opt(fc)} {
set start_index [$widget index insert]
- } {
+ } else {
set start_index 1.0
}
}
@@ -2663,13 +2742,13 @@ class HexEditor {
set result 1
# String not found
- } {
+ } else {
$popup_menu entryconfigure [::mc "Find next"] -state disabled
$popup_menu entryconfigure [::mc "Find previous"] -state disabled
if {[winfo exists $find_dialog_win]} {
set parent $find_dialog_win
- } {
+ } else {
set $main_frame
}
tk_messageBox \
@@ -2703,3 +2782,7 @@ array set ::HexEditor::find_opt {
fc 1
bw 0
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/lib/ihextools.tcl b/lib/lib/ihextools.tcl
index 071b178..458f799 100755..100644
--- a/lib/lib/ihextools.tcl
+++ b/lib/lib/ihextools.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 _IHEXTOOLS_TCL ] } {
+set _IHEXTOOLS_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Provides some tools for manipulating IHEX8, binary and sim files.
@@ -100,7 +105,7 @@ namespace eval IHexTools {
set index 0 ;# Last search result
# Get number of LF chracters
- while 1 {
+ while {1} {
set index [string first "\n" $data $index]
if {$index == -1} {break}
incr index
@@ -217,7 +222,7 @@ namespace eval IHexTools {
# Return result
if {$error_count} {
return 0
- } {
+ } else {
return 1
}
}
@@ -276,15 +281,19 @@ namespace eval IHexTools {
# Adjust input data
regsub -all {\r\n?} $data "\n" data ;# Any EOL to LF
- regsub -all -line {\s*#.*$} $data {} data ;# Remove comments
- regsub {^[^\n]+\n} $data {} data ;# Discard the first line
+ regsub -all {\s*#[^\n]*\n} $data {} data ;# Remove comments
- set lineNum 0 ;# Line number
+ set lineNum -1 ;# Line number
# Iterate over lines in the given data
foreach line [split $data "\n"] {
incr lineNum ;# Increment line number
+ # Discard the first line
+ if {!$lineNum} {
+ continue
+ }
+
# Skip empty lines
if {$line == {}} {continue}
@@ -330,7 +339,7 @@ namespace eval IHexTools {
# Return result
if {$error_count} {
return 0
- } {
+ } else {
return 1
}
}
@@ -356,12 +365,12 @@ namespace eval IHexTools {
# Convert it to binary value
if {$hex == {}} {
append pad "\0"
- } {
+ } else {
if {$pad != {}} {
append result $pad
set pad {}
}
- append result [subst "\\x$hex"]
+ append result [subst -nocommands "\\x$hex"]
}
# Increment address
incr addr
@@ -446,6 +455,7 @@ namespace eval IHexTools {
# Append EOF and return result
append result {:00000001FF}
+ append result "\n"
return $result
}
@@ -474,7 +484,7 @@ namespace eval IHexTools {
set result $content($addr)
if {$result == {}} {
return -1
- } {
+ } else {
return $result
}
}
@@ -510,7 +520,7 @@ namespace eval IHexTools {
}
## Append error message to error_string
- # @parm Int line - Number of line where the error occured
+ # @parm Int line - Number of line where the error occurred
# @parm String - Error message
# @return void
proc Error {line string} {
@@ -518,6 +528,10 @@ namespace eval IHexTools {
variable error_string ;# Error messages
incr error_count
- append error_string [mc "Error at line %s:\t" $line] $string "\n"
+ append error_string [mc "Error at %s:\t" $line] $string "\n"
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/lib/innerwindow.tcl b/lib/lib/innerwindow.tcl
index f1d2505..4195e2d 100755..100644
--- a/lib/lib/innerwindow.tcl
+++ b/lib/lib/innerwindow.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 _INNERWINDOW_TCL ] } {
+set _INNERWINDOW_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
@@ -87,7 +92,7 @@ class InnerWindow {
ttk::style map InnerWindow_Active.TButton \
-background [list active $active_titclr] \
-relief [list active raised]
-
+
ttk::style configure InnerWindow_Inactive.TButton \
-background $inactive_titclr \
-padding 0 \
@@ -96,7 +101,7 @@ class InnerWindow {
ttk::style map InnerWindow_Inactive.TButton \
-background [list active $inactive_titclr] \
-relief [list active raised]
-
+
# Set object variables
set max_X 1000
set max_Y 1000
@@ -201,27 +206,27 @@ class InnerWindow {
}
## Get and/or set window geometry including frame and title bar
- # @parm Int = {} - Width
- # @parm Int = {} - Height
- # @parm Int = {} - Relative position -- X
- # @parm Int = {} - Relative position -- Y
+ # @parm Int w={} - Width
+ # @parm Int h={} - Height
+ # @parm Int x={} - Relative position -- X
+ # @parm Int y={} - Relative position -- Y
# Note: If you want to set only certain attributes then set others as {}
# @return Current window geometry {W H X Y}
- public method geometry args {
+ public method geometry {{w {}} {h {}} {x {}} {y {}}} {
# Set geometry
- if {[llength $args]} {
- if {[string length [lindex $args 0]]} {
- place $win -width [lindex $args 0]
+ if {$w != {} || $h != {} || $x != {} || $y != {}} {
+ if {[string length $w]} {
+ place $win -width $w
}
- if {[string length [lindex $args 1]]} {
- place $win -height [lindex $args 1]
- set win_height [lindex $args 1]
+ if {[string length $h]} {
+ place $win -height $h
+ set win_height $h
}
- if {[string length [lindex $args 2]]} {
- place $win -x [lindex $args 2]
+ if {[string length $x]} {
+ place $win -x $x
}
- if {[string length [lindex $args 3]]} {
- place $win -y [lindex $args 3]
+ if {[string length $y]} {
+ place $win -y $y
}
update
}
@@ -252,6 +257,10 @@ class InnerWindow {
## Event handler: window frame <FocusOut>
# @return void
public method focusout {} {
+ if {![winfo exists $win]} {
+ return
+ }
+
update
foreach widget [list $title_bar $title_label $win] {
$widget configure -bg $inactive_titclr
@@ -259,7 +268,6 @@ class InnerWindow {
foreach widget [list $close_button $coll_exp_but] {
$widget configure -style InnerWindow_Inactive.TButton
}
-
update
}
@@ -275,7 +283,7 @@ class InnerWindow {
pack forget $main_frame
place $win -height [expr {[winfo height $win.title_bar] + 4}]
# Unshade
- } {
+ } else {
set image _1uparrow
pack $main_frame -fill both -expand 1
place $win -height $win_height
@@ -335,7 +343,7 @@ class InnerWindow {
focus $win
if {!$menu_created} {
- menuFactory $MENU $menu 0 "$this " 0 {}
+ menuFactory $MENU $menu 0 "$this " 0 {} [namespace current]
set menu_created 1
}
@@ -358,3 +366,7 @@ class InnerWindow {
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/lib/modern_notebook.tcl b/lib/lib/modern_notebook.tcl
new file mode 100644
index 0000000..a9760ed
--- /dev/null
+++ b/lib/lib/modern_notebook.tcl
@@ -0,0 +1,691 @@
+#! /usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# Copyright (C) 2012 by Martin Ošmera #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+proc ModernNoteBook {pathname args} {
+ if {[llength $args]} {
+ return [ModernNoteBookClass #auto $pathname $args]
+ } else {
+ return [ModernNoteBookClass #auto $pathname]
+ }
+}
+class ModernNoteBookClass {
+ common font_size 12
+ common button_font [font create -family {helvetica} -size [expr {int(-$font_size * $::font_size_factor)}] -weight {normal}]
+
+ private variable button_counter 0
+ private variable tab_but_enter_cmd {}
+ private variable tab_but_leave_cmd {}
+ private variable event_bindings [list]
+ private variable common_tab_but_width 0
+ private variable common_tab_but_height 0
+ private variable scroll_buttons_visible 0
+ private variable total_tabbar_width 0
+ private variable last_width -1
+
+ private variable pages [list]
+ private variable options
+
+ private variable current_page -1
+ private variable tabbar_hidden 0
+
+ private variable main_frame
+ private variable tab_bar_frame
+ private variable pages_area_frame
+ private variable pages_area_frame_f
+ private variable tab_bar_frame_left
+ private variable tab_bar_frame_middle
+ private variable tab_bar_frame_middle_sc
+ private variable tab_bar_frame_right
+ private variable tab_bar_frame_left_b
+ private variable tab_bar_frame_right_b
+
+ constructor {pathname args} {
+ set options(pathname) $pathname
+ set options(homogeneous) 0
+ set options(autohide) 0
+ set options(tabpady) 0
+ set options(nomanager) 0
+
+ set args [lindex $args 0]
+ set length [llength $args]
+ for {set i 0; set j 1} {$i < $length} {incr i 2; incr j 2} {
+ set attr [lindex $args $i]
+ set val [lindex $args $j]
+
+ switch -- $attr {
+ {-homogeneous} {
+ if {![string is boolean $val]} {
+ error "Argument to option $attr must be a boolean."
+ }
+ set options(homogeneous) $val
+ }
+ {-autohide} {
+ if {![string is boolean $val]} {
+ error "Argument to option $attr must be a boolean."
+ }
+ set options(autohide) $val
+ }
+ {-tabpady} {
+ if {![string is digit $val]} {
+ error "Argument to option $attr must be an integer."
+ }
+ set options(tabpady) $val
+ }
+ {-nomanager} {
+ if {![string is boolean $val]} {
+ error "Argument to option $attr must be a boolean."
+ }
+ set options(nomanager) $val
+ }
+ {-font} {
+ set button_font $val
+ set font_size [expr {abs([font configure $val -size])}]
+ }
+ default {
+ error "Unknown argument: $attr"
+ }
+ }
+ }
+
+ set main_frame [frame $pathname]
+ set tab_bar_frame [frame $main_frame.tab_bar_frame]
+ set pages_area_frame_f [frame $main_frame.pages_area_frame -bd 1 -relief raised]
+ pack $pages_area_frame_f -side bottom -fill both -expand 1
+ set pages_area_frame [PagesManager $pages_area_frame_f.pages_manager]
+
+ set tab_bar_frame_right [frame $tab_bar_frame.right_frame]
+ set tab_bar_frame_middle [frame $tab_bar_frame.middle_frame]
+
+ if {!$options(autohide)} {
+ pack $tab_bar_frame -side top -fill both -before $pages_area_frame_f
+ } else {
+ set tabbar_hidden 1
+ $pages_area_frame_f configure -bd 0
+ }
+ if {!$options(nomanager)} {
+ pack $pages_area_frame -side bottom -fill both -expand 1
+ } else {
+ pack forget $pages_area_frame_f
+ }
+
+ pack $tab_bar_frame_right -side right -fill y
+ pack $tab_bar_frame_middle -fill x -expand 1 -side left -after $tab_bar_frame_right
+
+ set tab_bar_frame_middle [ScrollableFrame $tab_bar_frame_middle.inner_frame -height $common_tab_but_height]
+ set tab_bar_frame_middle_sc [$tab_bar_frame_middle getframe]
+ pack $tab_bar_frame_middle -fill x
+
+ set tab_bar_frame_left [ttk::button \
+ $tab_bar_frame_right.button_l \
+ -style Flat.TButton \
+ -image ::ICONS::16::1leftarrow \
+ -command [list $tab_bar_frame_middle xview scroll -10 units] \
+ ]
+ set tab_bar_frame_right [ttk::button \
+ $tab_bar_frame_right.button_r \
+ -style Flat.TButton \
+ -image ::ICONS::16::1rightarrow \
+ -command [list $tab_bar_frame_middle xview scroll 10 units] \
+ ]
+ }
+
+
+ public method show_pages_area {} {
+ if {$options(nomanager)} {
+ pack $pages_area_frame -side bottom -fill both -expand 1
+ set options(nomanager) 0
+ }
+ }
+ public method hide_pages_area {} {
+ if {!$options(nomanager)} {
+ pack forget $pages_area_frame
+ set options(nomanager) 1
+ }
+ }
+ public method deselect_tab_button {} {
+ set current_page -1
+ redraw_tab_bar
+ }
+
+ public method get_nb {} {
+ return $options(pathname)
+ }
+
+ public method itemconfigure {page args} {
+ set idx [lsearch -index 0 -ascii -exact $pages $page]
+ if {$idx == -1} {
+ error "No such page: $page"
+ return
+ }
+ set page_spec [lindex $pages $idx]
+
+ set arg_createcmd [lindex $page_spec 1]
+ set arg_image [lindex $page_spec 2]
+ set arg_leavecmd [lindex $page_spec 3]
+ set arg_raisecmd [lindex $page_spec 4]
+ set arg_state [lindex $page_spec 5]
+ set arg_text [lindex $page_spec 6]
+ set arg_helptext [lindex $page_spec 7]
+ set length [llength $args]
+ for {set i 0; set j 1} {$i < $length} {incr i 2; incr j 2} {
+ set attr [lindex $args $i]
+ set val [lindex $args $j]
+
+ switch -- $attr {
+ {-createcmd} {
+ set arg_createcmd $val
+ }
+ {-image} {
+ set arg_image $val
+ }
+ {-leavecmd} {
+ set arg_leavecmd $val
+ }
+ {-raisecmd} {
+ set arg_raisecmd $val
+ }
+ {-state} {
+ if {$val == {normal}} {
+ set val 0
+ } elseif {$val == {disabled}} {
+ set val 1
+ } else {
+ error "Possible values of $attr are: \"normal\" and \"disabled\"."
+ }
+ set arg_state $val
+ }
+ {-text} {
+ set arg_text $val
+ }
+ {-helptext} {
+ set arg_helptext $val
+ }
+ default {
+ error "Unknown argument: $attr"
+ }
+ }
+ }
+
+ set pages [lreplace $pages $idx $idx [list $page $arg_createcmd $arg_image $arg_leavecmd $arg_raisecmd $arg_state $arg_text $arg_helptext {} 0]]
+ redraw_tab_bar_completely
+ }
+
+ private method redraw_tab_bar_completely {} {
+ set common_tab_but_width 0
+ set common_tab_but_height 0
+ redraw_tab_bar 1
+ redraw_tab_bar
+ handle_resize
+ }
+
+ public method insert {index page args} {
+ set arg_createcmd {}
+ set arg_image {}
+ set arg_leavecmd {}
+ set arg_raisecmd {}
+ set arg_state 0
+ set arg_text {}
+ set arg_helptext {}
+ set length [llength $args]
+ for {set i 0; set j 1} {$i < $length} {incr i 2; incr j 2} {
+ set attr [lindex $args $i]
+ set val [lindex $args $j]
+
+ switch -- $attr {
+ {-createcmd} {
+ set arg_createcmd $val
+ }
+ {-image} {
+ set arg_image $val
+ }
+ {-leavecmd} {
+ set arg_leavecmd $val
+ }
+ {-raisecmd} {
+ set arg_raisecmd $val
+ }
+ {-state} {
+ if {$val == {normal}} {
+ set val 0
+ } elseif {$val == {disabled}} {
+ set val 1
+ } else {
+ error "Possible values of $attr are: \"normal\" and \"disabled\"."
+ }
+ set arg_state $val
+ }
+ {-text} {
+ set arg_text $val
+ }
+ {-helptext} {
+ set arg_helptext $val
+ }
+ default {
+ error "Unknown argument: $attr"
+ }
+ }
+ }
+
+ if {[lsearch -ascii -exact -index 0 $pages $page] != -1} {
+ error "Page already exists: $page"
+ }
+
+ if {$current_page != -1} {
+ set current_page_id [lindex $pages [list $current_page 0]]
+ }
+ set pages [linsert $pages $index [list $page $arg_createcmd $arg_image $arg_leavecmd $arg_raisecmd $arg_state $arg_text $arg_helptext 0 {} 0]]
+ $pages_area_frame add $page
+ [$pages_area_frame getframe $page] configure -bg ${::COMMON_BG_COLOR} -padx 5 -pady 5
+ if {$current_page != -1} {
+ set current_page [lsearch -index 0 -ascii -exact $pages $current_page_id]
+ if {$current_page != -1} {
+ $this see $current_page_id
+ }
+ }
+
+ redraw_tab_bar_completely
+
+ if {$options(autohide) && ([llength $pages] > 1)} {
+ show_hide_tabbar 1
+ }
+
+ return [$pages_area_frame getframe $page]
+ }
+ public method bindtabs {event command} {
+ if {$event == {<Enter>}} {
+ set tab_but_enter_cmd $command
+ } elseif {$event == {<Leave>}} {
+ set tab_but_leave_cmd $command
+ } else {
+ set idx [lsearch -ascii -exact -index 0 $event_bindings $event]
+ if {$idx == -1} {
+ lappend event_bindings [list $event $command]
+ } else {
+ set event_bindings [lreplace $event_bindings $idx $idx [list $event $command]]
+ }
+ reset_event_bindings
+ }
+ }
+
+ public method see {page} {
+ set idx [lsearch -index 0 -ascii -exact $pages $page]
+ if {$idx == -1} {
+ error "No such page: $page"
+ return
+ }
+
+ $tab_bar_frame_middle see [lindex $pages [list $idx end-1]]
+ }
+ public method getframe {page} {
+ return [$pages_area_frame getframe $page]
+ }
+
+ public method move {page index} {
+ set idx [lsearch -index 0 -ascii -exact $pages $page]
+ if {$idx == -1} {
+ error "No such page: $page"
+ return
+ }
+ if {$index != {end} && $index >= [llength $pages]} {
+ error "Index out of range: $index"
+ return
+ }
+
+ if {$current_page != -1} {
+ set current_page_id [lindex $pages [list $current_page 0]]
+ }
+ set page_spec [lindex $pages $idx]
+ set pages [lreplace $pages $idx $idx]
+ set pages [linsert $pages $index $page_spec]
+ if {$current_page != -1} {
+ set current_page [lsearch -index 0 -ascii -exact $pages $current_page_id]
+ if {$current_page != -1} {
+ $this see $current_page_id
+ }
+ }
+ redraw_tab_bar
+ }
+ public method pages {} {
+ set result [list]
+ foreach page_spec $pages {
+ lappend result [lindex $page_spec 0]
+ }
+ return $result
+ }
+ public method index {page} {
+ return [lsearch -index 0 -ascii -exact $pages $page]
+ }
+ public method delete {page} {
+ set idx [lsearch -index 0 -ascii -exact $pages $page]
+ if {$idx == -1} {
+ error "No such page: $page"
+ return
+ }
+ $pages_area_frame delete $page
+ if {($current_page != -1) && ($current_page != $idx)} {
+ set current_page_id [lindex $pages [list $current_page 0]]
+ }
+ set pages [lreplace $pages $idx $idx]
+ if {![llength $pages]} {
+ set current_page -1
+ } elseif {$current_page == $idx} {
+ set current_page -1
+ } elseif {$current_page != -1} {
+ set current_page [lsearch -index 0 -ascii -exact $pages $current_page_id]
+ if {$current_page != -1} {
+ $this see $current_page_id
+ }
+ }
+ if {$options(autohide) && ([llength $pages] < 2)} {
+ show_hide_tabbar 0
+ } else {
+ redraw_tab_bar_completely
+ }
+ }
+ public method show_hide_tabbar {{show {}}} {
+ if {$show == {}} {
+ return $tabbar_hidden
+ }
+
+ if {![string is boolean $show]} {
+ error "show must be a boolean ({$show} given)"
+ }
+
+ if {$show && $tabbar_hidden} {
+ # Show it
+ if {$options(nomanager)} {
+ pack $tab_bar_frame -side top -fill both
+ } else {
+ pack $tab_bar_frame -side top -fill both -before $pages_area_frame_f
+ }
+ set tabbar_hidden 0
+ $pages_area_frame_f configure -bd 1
+ } elseif {!$show && !$tabbar_hidden} {
+ # Hide it
+ pack forget $tab_bar_frame
+ set tabbar_hidden 1
+ $pages_area_frame_f configure -bd 0
+ }
+ }
+
+ public method raise {{page {}} {by_click 0}} {
+ if {$page == {}} {
+ if {$current_page == -1} {
+ return {}
+ }
+ return [lindex $pages [list $current_page 0]]
+ }
+
+ set idx [lsearch -index 0 -ascii -exact $pages $page]
+ if {$idx == -1} {
+ error "No such page: $page"
+ return
+ }
+ if {$current_page == $idx || [lindex $pages [list $idx 5]]} {
+ return
+ }
+
+ if {$current_page != -1 && $current_page < [llength $pages]} {
+ uplevel #0 [lindex $pages [list $current_page 3]]
+ set_tab_but_bg_color n [lindex $pages [list $current_page end-1]]
+ }
+
+ $pages_area_frame raise $page
+ $this see $page
+
+ set current_page $idx
+ if {$by_click} {
+ set_tab_but_bg_color ae [lindex $pages [list $current_page end-1]]
+ } else {
+ set_tab_but_bg_color a [lindex $pages [list $current_page end-1]]
+ }
+ if {![lindex $pages [list $current_page end]]} {
+ lset pages [list $current_page end] 1
+ set createcmd [lindex $pages [list $current_page 1]]
+ if {$createcmd != {}} {
+ uplevel #0 $createcmd
+ }
+ }
+ set raisecmd [lindex $pages [list $current_page 4]]
+ if {$raisecmd != {}} {
+ uplevel #0 $raisecmd
+ }
+ }
+
+ private method redraw_tab_bar {{only_compute 0}} {
+ if {!$only_compute} {
+ destroy $tab_bar_frame_middle
+ ScrollableFrame $tab_bar_frame_middle -height $common_tab_but_height
+ set tab_bar_frame_middle_sc [$tab_bar_frame_middle getframe]
+ pack $tab_bar_frame_middle -fill x -expand 1
+
+ bind $tab_bar_frame_middle <Configure> [list $this handle_resize]
+ }
+
+ set total_tabbar_width 0
+ set i -1
+ foreach page_spec $pages {
+ incr i
+ set tab_but [draw_button $tab_bar_frame_middle_sc $i [lindex $page_spec 6] [lindex $page_spec 2] [lindex $page_spec 7] $only_compute]
+ lset pages [list $i end-1] $tab_but
+
+ if {$only_compute} {
+ continue
+ }
+
+ pack $tab_but -side left
+ if {![lindex $page_spec 5]} {
+ bind $tab_but <Button-1> [format "%s\n%s" update [list $this raise [lindex $page_spec 0] 1]]
+ }
+ }
+ }
+
+ private method draw_button {target page_idx {text {}} {image {}} {helptext {}} {only_compute 0}} {
+ set label_width [font measure $button_font $text]
+ set image_width 0
+ set image_height 0
+ if {$image != {}} {
+ set image_width [image width $image]
+ set image_height [image height $image]
+ } else {
+ set image_height 16
+ }
+ set canvas_width [expr {$label_width + $image_width + 15}]
+ set canvas_height [expr {(($font_size > $image_height) ? $font_size : $image_height) + 6 + $options(tabpady)}]
+ if {$image_width} {
+ incr canvas_width 5
+ }
+
+ if {$options(homogeneous)} {
+ if {$canvas_width > $common_tab_but_width} {
+ set common_tab_but_width $canvas_width
+ } else {
+ set canvas_width $common_tab_but_width
+ }
+ }
+ if {$canvas_height > $common_tab_but_height} {
+ set common_tab_but_height $canvas_height
+ } else {
+ set canvas_height $common_tab_but_height
+ }
+
+ if {$only_compute} {
+ return {}
+ }
+
+ set cnv [canvas $target.b_$button_counter -bg {#E0E0E0} -width $canvas_width -height $canvas_height \
+ -bd 0 \
+ -highlightthickness 0 \
+ ]
+
+ set x 7
+ set y [expr {1 + int($canvas_height / 2)}]
+ if {$image != {}} {
+ $cnv create image $x $y -image $image -anchor w
+ incr x $image_width
+ incr x 5
+ if {$image_height > $canvas_height} {
+ incr y [expr {int(ceil(($image_height - $canvas_height) / 2))}]
+ }
+ }
+ $cnv create text $x $y -font $button_font -anchor w -justify left -text $text -tags txt
+
+ $cnv create line 1 0 [expr {$canvas_width - 1}] 0 -tags bg1
+ $cnv create line 1 1 [expr {$canvas_width - 1}] 1 -tags bg2
+ $cnv create line 0 1 0 $canvas_height -tags bg1
+ $cnv create line 1 1 1 $canvas_height -tags bg2
+ $cnv create line [expr {$canvas_width - 1}] 1 [expr {$canvas_width - 1}] $canvas_height -tags bg1
+ $cnv create line [expr {$canvas_width - 2}] 1 [expr {$canvas_width - 2}] $canvas_height -tags bg3
+ if {[lindex $pages [list $page_idx 5]]} {
+ set_tab_but_bg_color d $cnv
+ } elseif {$page_idx == $current_page} {
+ set_tab_but_bg_color a $cnv
+ } else {
+ set_tab_but_bg_color n $cnv
+ }
+
+ if {$helptext != {}} {
+ DynamicHelp::add $cnv -text $helptext
+ }
+
+ bind $cnv <Enter> +[list $this tab_but_enter $page_idx]
+ bind $cnv <Leave> +[list $this tab_but_leave $page_idx]
+ set_event_bindings $cnv $page_idx
+
+ incr button_counter
+ incr total_tabbar_width $canvas_width
+ return $cnv
+ }
+
+ private method set_event_bindings {but page_idx} {
+ foreach env_cmd $event_bindings {
+ bind $but [lindex $env_cmd 0] [format "%s %s" [lindex $env_cmd 1] [lindex $pages $page_idx 0]]
+ }
+ }
+
+ private method reset_event_bindings {} {
+ set i -1
+ foreach page_spec $pages {
+ incr i
+ set_event_bindings [lindex $page_spec end-1] $i
+ }
+ }
+
+ public method handle_resize {} {
+ if {$tabbar_hidden || ![winfo exists $tab_bar_frame_middle] || ![winfo viewable $tab_bar_frame_middle]} {
+ return
+ }
+ set current_width [winfo width $tab_bar_frame_middle]
+ if {$current_width == $last_width} {
+ return
+ }
+ set last_width $current_width
+
+ if {($current_width < $total_tabbar_width) && !$scroll_buttons_visible} {
+ set scroll_buttons_visible 1
+ pack $tab_bar_frame_left -side left
+ pack $tab_bar_frame_right -side left
+ } elseif {($current_width >= $total_tabbar_width) && $scroll_buttons_visible} {
+ set scroll_buttons_visible 0
+ pack forget $tab_bar_frame_left
+ pack forget $tab_bar_frame_right
+ }
+ }
+
+ private method set_tab_but_bg_color {code but} {
+ switch -- $code {
+ {a} {
+ set bg0 {#E0E0FF}
+ set bg1 {#9999FF}
+ set bg2 {#AAAAFF}
+ set bg3 {#CFCDFF}
+ set txt_fg {#000000}
+ }
+ {ae} {
+ set bg0 {#CCCCFF}
+ set bg1 {#9999FF}
+ set bg2 {#AAAAFF}
+ set bg3 {#CFCDFF}
+ set txt_fg {#000000}
+ }
+ {n} {
+ set bg0 ${::COMMON_BG_COLOR}
+ set bg1 {#BBBBBB}
+ set bg2 {#EEEBE7}
+ set bg3 {#CFCDC8}
+ set txt_fg {#000000}
+ }
+ {ne} {
+ set bg0 {#CCCCFF}
+ set bg1 {#9999CC}
+ set bg2 {#AAAADD}
+ set bg3 {#CFCDC8}
+ set txt_fg {#000000}
+ }
+ {d} {
+ set bg0 ${::COMMON_BG_COLOR}
+ set bg1 {#BBBBBB}
+ set bg2 {#EEEBE7}
+ set bg3 {#CFCDC8}
+ set txt_fg {#888888}
+ }
+ default {
+ error "ModernNoteBookClass::set_tab_but_bg_color: Invalid argument: code={$code}"
+ }
+ }
+
+ $but configure -bg $bg0
+ $but itemconfigure bg1 -fill $bg1
+ $but itemconfigure bg2 -fill $bg2
+ $but itemconfigure bg3 -fill $bg3
+ $but itemconfigure txt -fill $txt_fg
+ }
+
+ public method tab_but_enter {page_idx} {
+ set but [lindex $pages [list $page_idx end-1]]
+ if {[lindex $pages [list $page_idx 5]]} {
+ return
+ } elseif {$current_page == $page_idx} {
+ set_tab_but_bg_color ae $but
+ } else {
+ set_tab_but_bg_color ne $but
+ }
+ if {$tab_but_enter_cmd != {}} {
+ uplevel #0 [format "%s %s" $tab_but_enter_cmd [lindex $pages $page_idx 0]]
+ }
+ }
+
+ public method tab_but_leave {page_idx} {
+ set but [lindex $pages [list $page_idx end-1]]
+ if {[lindex $pages [list $page_idx 5]]} {
+ return
+ } elseif {$current_page == $page_idx} {
+ set_tab_but_bg_color a $but
+ } else {
+ set_tab_but_bg_color n $but
+ }
+ if {$tab_but_leave_cmd != {}} {
+ uplevel #0 [format "%s %s" $tab_but_leave_cmd [lindex $pages $page_idx 0]]
+ }
+ }
+}
diff --git a/lib/lib/settings.tcl b/lib/lib/settings.tcl
index 3c50466..8dd1c53 100755..100644
--- a/lib/lib/settings.tcl
+++ b/lib/lib/settings.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 _SETTINGS_TCL ] } {
+set _SETTINGS_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements interface to program settings (which are stored in a file)
@@ -28,7 +33,7 @@
class Settings {
common dir_sep [file separator] ;# Directory separator (eg. '/')
- common count 0 ;# Counter of instances
+ common settings_count 0 ;# Counter of instances
private variable isEmpty 1 ;# Is settings array empty
private variable isReady 0 ;# Is interface ready
@@ -42,10 +47,10 @@ class Settings {
# @parm String configDir - Path to directory with settings file
# @parm String configFileName - Name of file with settings
constructor {configDir configFileName} {
- incr count ;# increment instance conter
+ incr settings_count ;# increment instance conter
# Incalize object variables
- set configArray "::Settings::S$count" ;# Array of settings
+ set configArray "::Settings::S${settings_count}" ;# Array of settings
set directory [string trimright $configDir "/\/"] ;# Path to directory with settings file
set filename [string trimleft $configFileName "/\/"] ;# Name of file with settings
set fileFullPath "${directory}${dir_sep}${filename}" ;# Full name of settings file
@@ -54,7 +59,7 @@ class Settings {
if {![file exists $fileFullPath]} {
if {[catch {
file mkdir $directory
- close [open $fileFullPath w 420]
+ close [open $fileFullPath w 0640]
}]} then {
return
} else {
@@ -65,7 +70,7 @@ class Settings {
} else {
if {$::MICROSOFT_WINDOWS || ([file readable $fileFullPath] && [file writable $fileFullPath])} {
set isReady 1
- } {
+ } else {
return
}
}
@@ -129,7 +134,7 @@ class Settings {
# Set variable isEmpty
if {[array size $configArray] != 0} {
set isEmpty 0
- } {
+ } else {
set isEmpty 1
}
@@ -147,7 +152,7 @@ class Settings {
}
# Local variables
- set configFile [open $fileFullPath w 420] ;# ID of config file chanel
+ set configFile [open $fileFullPath w 0640] ;# ID of config file chanel
set categories {general} ;# Name of current category
# Determinate list of categories
@@ -172,7 +177,7 @@ class Settings {
# Determinate key
regsub {^[^/]*/} $fullKey {} key
# Determinate value
- set value [subst "\$$configArray\(\$fullKey\)"]
+ set value [subst -nocommands "\$$configArray\(\$fullKey\)"]
regsub -all "\n" $value "\a" value
# Save key and value
puts $configFile "$key=\"$value\""
@@ -212,7 +217,7 @@ class Settings {
if {[i_contains $key]} {
unset "$configArray\($key\)"
return 1
- } {
+ } else {
return 0
}
}
@@ -233,7 +238,7 @@ class Settings {
private method i_contains {key} {
if {[array names $configArray -exact $key] == {}} {
return 0
- } {
+ } else {
return 1
}
}
@@ -258,8 +263,8 @@ class Settings {
# Check if the given key is defined
if {[i_contains $key]} {
- return [subst "\$$configArray\(\$key\)"]
- } {
+ return [subst -nocommands "\$$configArray\(\$key\)"]
+ } else {
return $default
}
}
@@ -291,3 +296,7 @@ class Settings {
return 1
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/list_of_files.txt b/lib/list_of_files.txt
new file mode 100644
index 0000000..112e79f
--- /dev/null
+++ b/lib/list_of_files.txt
@@ -0,0 +1,136 @@
+This file contains descriptions for files in this directory and its
+subdirectories. The aim is to make navigation through the code easier. Lines in
+this file might be very long.
+
+Last update: December 8, 2011
+Notes:
+ * List of files was generated by "tree" command
+ * This file might be incomplete
+ * Some file from 1.4.x version are not mentined here
+
+lib | Source files of the IDE
+├── bottompanel | Bottom panel in the main window
+│   ├── bottomnotebook.tcl | "Root component" of the bottom panel
+│   ├── calculator.tcl | Tab: Calculator
+│   ├── cvarsview.tcl | Tab: C variables
+│   ├── find_in_files.tcl | Tab: Find in files
+│   ├── graph.tcl | Tab: IO ports
+│   ├── graph_wdg.tcl | Graph widget used in the tab "IO ports"
+│   ├── messages.tcl | Tab: Messages
+│   ├── terminal.tcl | Tab: Terminal emulator
+│   └── todo.tcl | Tab: Notes
+├── cli.tcl | Implementation of the command line interface (CLI)
+├── compiler | Built-in assembler and interfaces for cooperation with external assemblers and SDCC compiler
+│   ├── assembler.tcl | Built-in assembler: Processes preprocessed code to generate object file and to instruct code listing generator
+│   ├── codelisting.tcl | Built-in assembler: Code listing generator
+│   ├── compilerconsts.tcl | Built-in assembler: Instruction set definition, etc. used by the assembler and other components of the IDE
+│   ├── compiler.tcl | Built-in assembler: Manages assembler settings, serves as entry point to assembler and prints some messages
+│   ├── disassembler.tcl | 8051 disassembler
+│   ├── external_compiler.tcl | Interface for cooperation with external assemblers and SDCC compiler
+│   └── preprocessor.tcl | Built-in assembler: Assembler pre-processor
+├── configdialogues | Graphical configuration dialogues
+│   ├── configdialogues.tcl | Root part of the configuration dialogues
+│   ├── compiler_config.tcl | Assembler and compiler configuration dialog
+│   ├── custom_commands_config.tcl | Configuration of user defined commands
+│   ├── editor_config.tcl | Source code editor configuration
+│   ├── global_config.tcl | "MCU 8051 IDE configuration dialog"
+│   ├── rightpanel_config.tcl | Settings for the right panel
+│   ├── shortcuts_config.tcl | Configuration dialog for key shortcuts
+│   ├── simulator_config.tcl | MCU simulator configuration dialog
+│   ├── terminal_config.tcl | Configuration of embedded terminal emulator (urxvt)
+│   └── toolbar_config.tcl | Configuration of the main toolbar
+├── custom_command.tcl | Implementation of user defined commands
+├── dialogues | Various GUI dialogues commonly used in the IDE
+│   ├── errorhandler.tcl | Reports internal program errors, bugs in the IDE
+│   ├── fsd.tcl | File selection dialog
+│   ├── my_tk_messageBox.tcl | Replacement for tk_messageBox
+│   ├── selectmcu.tcl | Dialog for MCU selection and tools for reading "database" of supported MCUs
+│   └── tips.tcl | Dialog "Tip of the Day" along with every functionality whit the dialog needs, see also file data/tips.xml
+├── editor | Built-in source code editor with all its components including support for external embedded editors like vim, etc.
+│   ├── editor.tcl | Root component of the editor
+│   ├── autocompletion.tcl | Auto-completion and dynamic generation of table of symbols used in the code
+│   ├── commandline.tcl | Editor command line
+│   ├── eventhandlers.tcl | Handlers for GUI events in the editor
+│   ├── exports.tcl | Export to XHTML and LaTeX
+│   ├── generalproc.tcl | General functions used by or provided by the editor
+│   ├── spell_check.tcl | Interface to the spell checker used by the IDE, Hunspell
+│   ├── ASMsyntaxhighlight.tcl | Syntax highlight for assembly language
+│   ├── Csyntaxhighlight.tcl | Syntax highlight for C language
+│   ├── LSTsyntaxhighlight.tcl | Syntax highlight for code listing
+│   └── R_ASMsyntaxhighlight.tcl | Syntax highlight for SDCC generated code for relocatable assembler
+├── environment.tcl | Root component of the entire GUI
+├── external_command.tcl | Interface for communication with an external program, like compiler or bash
+├── leftpanel | Left panel in the main window
+│   ├── filelist.tcl | Root component and tab "List of opened files" and tab "List of project files"
+│   ├── fsbrowser.tcl | Tab: File system browser
+│   └── sfrwatches.tcl | Tab: SFR watches
+├── lib | Things useful for this IDE and written for this IDE
+│   ├── hexeditor.tcl | Hexadecimal editor
+│   ├── ihextools.tcl | Tools for manipulating with Intel 8 Hex files
+│   ├── innerwindow.tcl | Implementation of MDI (Multiple document interface) in the IDE, for instance "Base Converter" tool use it
+│   ├── Math.tcl | Conversions between numeral systems and angle units in floating point arithmetic
+│   └── settings.tcl | Manipulation with IDE configuration file
+├── list_of_files.txt | This file
+├── maintab.tcl | Root component the GUI representing one opened project ...
+├── main.tcl | Main file of the entire IDE
+├── pale | "PALE" stands for Peripheral Abstraction Layer Engine, which essentially means nothing, but it implements the "Virtual HW"
+│   ├── pale.tcl | The PALE. This simulator component implements MCU simulation from point of view of electrical device
+│   ├── virtual_hw_component.tcl | Base class for all "Virtual HW" instances
+│   ├── leddisplay.tcl | Single LED display
+│   ├── multiplexedleddisplay.tcl | Multiplexed LED display
+│   ├── ledmatrix.tcl | LED matrix
+│   ├── ledpanel.tcl | LED panel
+│   ├── simplekeypad.tcl | Array of buttons
+│   ├── matrixkeypad.tcl | Matrix keypad
+│   ├── lcd_hd44780.tcl | Simulator of LCD character display controlled by HD44780.
+│   ├── hd44780_cgrom.tcl | Font definitions for HD44780 display driver simulator
+│   ├── ds1620.tcl | Simulator of DS1620 digital thermometer
+│   ├── virtual_uart_term.tcl | Simulated UART interface
+│   └── file_interface.tcl | File R/W interface to PALE
+├── project.tcl | Manages project files (extension .mcu8051ide), writing to them and reading from them
+├── rightpanel | Right panel in the main window
+│   ├── rightpanel.tcl | Root component of the panel
+│   ├── hwmanager.tcl | Tab: "Hardware plug-ins manager"
+│   ├── instructiondetails.tcl | Tab: "Instruction details"
+│   ├── regwatches.tcl | Tab: "register watches"
+│   └── subprograms.tcl | Tab: "Subprograms monitor"
+├── simulator | MCU Simulator
+│   ├── engine | Simulator engine
+│   │   ├── engine_auxiliary_alo_functions.tcl | Auxiliary ALO functions
+│   │   ├── engine_backward_stepping.tcl | Backward stepping related procedures
+│   │   ├── engine_control.tcl | Control procedures
+│   │   ├── engine_core.tcl | Simulator engine core
+│   │   ├── engine_external_interface_management.tcl | External interface management procedures
+│   │   ├── engine_hibernation.tcl | Hibernation related procedures
+│   │   ├── engine_initialization_cleanup.tcl | Initialization & cleanup related procedures
+│   │   ├── engine_instructions.tcl | Instruction procedures
+│   │   ├── engine_mcu_configuration.tcl | MCU configuration related procedures
+│   │   ├── engine_memory_management.tcl | Memory management related procedures
+│   │   ├── engine_opcodes.tcl | Opcode procedures
+│   │   ├── engine_text_based_interface.tcl | Command line interface for the simulator engine
+│   │   └── engine_virtual_hw_controller.tcl | Virtual hw controller procedures
+│   ├── simulator.tcl | Main part of the simulator
+│   ├── hibernate.tcl | Program hibernation functionality
+│   ├── bitmap.tcl | GUI tool: Bit addressable area viewer
+│   ├── interruptmonitor.tcl | GUI tool: Interrupt monitor
+│   ├── sfrmap.tcl | GUI tool: Map of SFR area
+│   ├── simulator_gui.tcl | GUI tool: Main simulator panel (displayed on the bottom panel)
+│   ├── stackmonitor.tcl | GUI tool: MCU stack monitor
+│   ├── stopwatch.tcl | GUI tool: Stopwatch timer
+│   └── uart_monitor.tcl | GUI tool: Monitor of simulated UART operations
+├── utilities | Other GUI tools which might be useful during the development for 8051
+│   ├── asciichart.tcl | ASCII chart viewer
+│   ├── table_of_instructions.tcl | Interactive table of 8051 instructions
+│   ├── baseconverter.tcl | Base converter
+│   ├── eightsegment.tcl | 8-segment editor
+│   ├── hexeditdlg.tcl | Project independent hexadecimal editor
+│   ├── notes.tcl | Scribble notepad
+│   ├── rs232debugger.tcl | RS-232/UART debugger
+│   ├── speccalc.tcl | Special calculator
+│   └── symbol_viewer.tcl | Assembly language symbol table viewer
+└── X.tcl | Well ... a little of everything, callback functions for the main menu, etc. dialogues like "Find", "Go to" and "Replace" and so on ...
+
+--------------------------------------------------------------------------------
+
+12 directories, 133 files
+135k lines of code, 4.1M of source code
diff --git a/lib/main.tcl b/lib/main.tcl
index 6a0f033..115d9a8 100755
--- a/lib/main.tcl
+++ b/lib/main.tcl
@@ -1,8 +1,11 @@
-#!/usr/bin/tclsh
+#!/bin/sh
+# the next line restarts using wish \
+exec tclsh "$0" "$@"
+
# 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 +24,11 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _MAIN_TCL ] } {
+set _MAIN_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
@@ -29,15 +37,18 @@
# GENERAL CONSTANTS
# -----------------------------
+set DEBUG 0 ;# Turn on debugging
encoding system {utf-8} ;# System encoding
set LIB_DIRNAME [file normalize [file dirname $argv0]] ;# Path to directory where the *.tcl file are located
-set VERSION "1.3.7" ;# Program version
-set SHORTNAME "MCU8051IDE" ;# Program short name (without white space)
-set APPNAME "MCU 8051 IDE v$VERSION" ;# Full program name
-set MIN_TCL_VER "8.5" ;# Minimum required Tcl version
+set INSTALLATION_DIR [file normalize "$LIB_DIRNAME/.."] ;# Path to the main executable (this file)
+set ROOT_DIRNAME [file normalize "$LIB_DIRNAME/.."] ;# On Linux it's the same as INSTALLATION_DIR, but it's different on MS Windows
+set VERSION "1.4.7" ;# Version of this IDE
+set SHORTNAME "MCU8051IDE" ;# Program short name (without white space)
+set APPNAME "MCU 8051 IDE v$VERSION" ;# Full program name
+set MIN_TCL_VER "8.5" ;# Minimum required Tcl version
set APPLICATION_LOADED 0 ;# True if program is loaded
set TRANSLATION_LOADED 0 ;# Bool: Translation loaded
-set MICROSOFT_WINDOWS {} ;# Bool: Windows OS running on the host computer
+set MICROSOFT_WINDOWS 0 ;# Bool: Windows OS running on the host computer
set CONFIG_DIR {} ;# Directory containing configuration files
# Check for correct Tcl version
@@ -48,25 +59,38 @@ if {[package vcompare $::tcl_version $::MIN_TCL_VER] < 0} {
exit 1
}
-## Tcl packages used by this prgram
+# Make sure that there is "ttk::spinbox" even when Tk version is lower than 8.5.9
+namespace eval ttk {
+ proc spinbox {args} {
+ eval "set result \[::spinbox $args\]"
+ return $result
+ }
+}
+
+## Tcl packages used by this software
# Format: {
# {pkg_name pkg_verison}
# ...
# }
set LIBRARIES_TO_LOAD {
- {BWidget 1.7}
+ {BWidget 1.8}
{Itcl 3.4}
- {Tcl 8.2}
{md5 2.0}
{Tk 8.5}
{img::png 1.3}
{tdom 0.8}
{Tclx 8.0}
+ {Tcl 8.2}
}
## Bool:
- # 1 == library TclX is avaliable
- # 0 == library TclX is NOT avaliable
+ # 1 == Normal GUI operation
+ # 0 == Program GUI suppressed
+set ::GUI_AVAILABLE 1
+
+## Bool:
+ # 1 == library TclX is available
+ # 0 == library TclX is NOT available
#
# TclX is used here only to handle signals (e.g. SIGINT), so the IDE can run
# without it, that's the reason for this variable. If TCLX_AVAILABLE is 0 then
@@ -77,15 +101,26 @@ set ::TCLX_AVAILABLE 1
set ::MICROSOFT_WINDOWS 0
if {[string first {Windows} ${tcl_platform(os)}] != -1} {
# Note:
- # Microsoft Windows is NOT a POSIX system and because of that we need
- # to do some workarounds here in order to make the IDE functional there.
+ # Microsoft Windows is NOT a POSIX system, and because of that, we need
+ # to do some workarounds here in order to make the IDE functional.
set ::MICROSOFT_WINDOWS 1
+
+ set LIB_DIRNAME_SPECIFIC_FOR_MS_WINDOWS "<AIPCS:LIB_DIRNAME_SPECIFIC_FOR_MS_WINDOWS>" ;# <-- The auto. inst. pkg. creation script will fill this in
+ set AUTO_PATH_FOR_MS_WINDOWS "<AIPCS:AUTO_PATH_FOR_MS_WINDOWS>" ;# <-- The auto. inst. pkg. creation script will fill this in
+ set INSTALLATION_DIR $LIB_DIRNAME
+ set LIB_DIRNAME $LIB_DIRNAME_SPECIFIC_FOR_MS_WINDOWS
+ set ROOT_DIRNAME [regsub {\/\w+\/?$} $LIB_DIRNAME {}]
+
+ foreach dir $AUTO_PATH_FOR_MS_WINDOWS {
+ lappend ::auto_path "${::ROOT_DIRNAME}/${dir}"
+ }
+ set env(ITCL_LIBRARY) "${::ROOT_DIRNAME}/libraries/itcl"
}
# Set directory containing configuration files according to the host OS
if {!$::MICROSOFT_WINDOWS} {
- set CONFIG_DIR [file join $::env(HOME) .[string tolower ${::SHORTNAME}]]
-} {
+ set CONFIG_DIR [file join ${::env(HOME)} .[string tolower ${::SHORTNAME}]]
+} else {
set CONFIG_DIR [file join ${::env(USERPROFILE)} ".[string tolower ${::SHORTNAME}]"]
}
@@ -99,15 +134,21 @@ source "${::LIB_DIRNAME}/cli.tcl"
if {!$::CLI_OPTION(quiet)} {
if {$::CLI_OPTION(nocolor)} {
- puts "WARNING:"
- puts "\tThis program is distributed with ABSOLUTELY NO WARRANTY !"
+ puts "IMPORTANT INFORMATION:"
+ puts "\tThis program is distributed in the hope that it will be useful, but with ABSOLUTELY NO WARRANTY !"
+ puts "\tThis is free software, so you are free to change and redistribute it."
+ puts "\tLicense: GNU General Public License version 2 or later"
puts "\tPlease report bugs at http://mcu8051ide.sf.net"
- puts "\tAuthor: Martin Osmera <martin.osmera@gmail.com>"
- } {
- puts "WARNING:"
- puts "\tThis program is distributed with ABSOLUTELY NO WARRANTY !"
+ puts "Authors:"
+ puts "\tMartin Osmera <martin.osmera@gmail.com>"
+ } else {
+ puts "IMPORTANT INFORMATION :"
+ puts "\tThis program is distributed in the hope that it will be useful, but with \033\[31;1mABSOLUTELY NO WARRANTY !\033\[m"
+ puts "\tThis is free software, so you are free to change and redistribute it."
+ puts "\tLicense: GNU General Public License version 2 or later"
puts "\tPlease report bugs at \033\[34;1mhttp://mcu8051ide.sf.net\033\[m"
- puts "\tAuthor: Martin Osmera \033\[33;1m<martin.osmera@gmail.com>\033\[m"
+ puts "Authors:"
+ puts "\tMartin Osmera \033\[33;1m<martin.osmera@gmail.com>\033\[m"
}
}
@@ -128,13 +169,13 @@ proc libraryLoadFailed {library} {
if {[lsearch {Linux} ${::tcl_platform(os)}] == -1} {
puts stderr "FATAL ERROR: Unsupported operating system. ${::tcl_platform(os)}"
- puts stderr "You can contact author of the project at <martin.osmera@gmail.com> if you want to get you OS supported."
+ puts stderr "You can contact authors of the project at <martin.osmera@gmail.com> if you want to get you OS supported."
exit 1
}
if {[lsearch {x86_64 i386 i486 i586 i686 x86} ${::tcl_platform(machine)}] == -1} {
puts stderr "FATAL ERROR: Unsupported system architecture. ${::tcl_platform(machine)}"
- puts stderr "You can contact author of the project at <martin.osmera@gmail.com> if you want to get you OS supported."
+ puts stderr "You can contact authors of the project at <martin.osmera@gmail.com> if you want to get you OS supported."
exit 1
}
@@ -145,8 +186,8 @@ proc libraryLoadFailed {library} {
puts "\nPlease try to run mcu8051ide with --check-libraries to see what's wrong."
exit 1
- } {
- puts stderr "WORKAROUND SUCCESSFULL ... \n(But don't be much happy about this, it is still serious failure. And please don't forget to comply to developers of your Linux distribution. Missing library is: ${library} version ${library_version})"
+ } else {
+ puts stderr "WORKAROUND SUCCESSFUL ... \n(But don't be much happy about this, it is still serious failure. And please don't forget to comply to developers of your Linux distribution. Missing library is: ${library} version ${library_version})"
return
}
@@ -160,7 +201,7 @@ proc libraryLoadFailed {library} {
# Print error message
if {$::CLI_OPTION(nocolor)} {
puts stderr "\n\nERROR: Unable to load library $library"
- } {
+ } else {
puts stderr "\n\n\033\[31mERROR:\033\[m Unable to load library \033\[32m$library\033\[m"
}
@@ -175,7 +216,7 @@ proc libraryLoadFailed {library} {
# -----------------------------
# Load Tk ToolKit
set T [lindex [time {
- if {[catch {package require img::png 1.3}]} {
+ if {[catch {package require img::png 1.3} e]} {
libraryLoadFailed "img::png"
}
if {[catch {package require Tk $::MIN_TCL_VER} errinfo]} {
@@ -187,50 +228,92 @@ wm withdraw .
update
# Determinate default Fixed font
-set ::DEFAULT_FIXED_FONT {DejaVu Sans Mono}
-if {[lsearch -ascii -exact [font families] {DejaVu Sans Mono}] == -1} {
- set ::DEFAULT_FIXED_FONT {Courier}
+set ::DEFAULT_FIXED_FONT {Courier}
+if {!$::MICROSOFT_WINDOWS} {
+ if {[lsearch -ascii -exact [font families] {DejaVu Sans Mono}] != -1} {
+ set ::DEFAULT_FIXED_FONT {DejaVu Sans Mono}
+ }
}
+# Set default background color
+set ::COMMON_BG_COLOR [. cget -bg]
+
# ------------------------------------------------------------------------------
# Microsoft Windows OS specific code
# ------------------------------------------------------------------------------
if {$::MICROSOFT_WINDOWS} {
# Print windows related warning
puts ""
- puts " THE IDE WAS ORIGINALY DESIGNED FOR POSIX, SO IT IS POSSIBLE THAT SOME"
- puts " FUNCTIONALITY WILL BE LIMITED ON YOUR OS DUE TO ABSENCE OF CERTAIN"
- puts " POSIX FUNCTIONALITY !"
+ puts " THE IDE WAS ORIGINALY WRITTEN FOR POSIX, SO IT IS POSSIBLE THAT SOME"
+ puts " FUNCTIONALITY WILL BE LIMITED ON MS WINDOWS DUE TO ABSENCE OF CERTAIN"
+ puts " POSIX FUNCTIONALITY!"
puts ""
+}
+# ------------------------------------------------------------------------------
- # Redefine the "bind" command, because on Windows binding a callback to
- # event, which does not exist on Windows would cause program crash
- rename bind original_command_bind
- proc microsoft_windows_specific_bind args {
+
+# ------------------------------------------------------------------------------
+# Make key shortcuts independent on Caps Lock.
+# ------------------------------------------------------------------------------
+rename bind original_command_bind
+proc mcu8051ide_bind args {
+ set widget [lindex $args 0]
+ set event_str [lindex $args 1]
+ set command [lindex $args 2]
+
+ if {[llength $args] > 3} {
+ error "Too many arguments to bind command."
+ } elseif {[llength $args] == 2} {
+ return [original_command_bind $widget $event_str]
+ }
+
+ # MS Windows doesn't recognize ISO and XFree86 codes
+ if {$::MICROSOFT_WINDOWS} {
if {
- [string first {ISO_} [lindex $args 1]] != -1 ||
- [string first {XF86_} [lindex $args 1]] != -1
- } {
+ [string first {ISO} $event_str] != -1 ||
+ [string first {XF86} $event_str] != -1
+ } then {
return
}
+ }
+
+ if {
+ [string index $event_str end-2] == {-}
+ &&
+ [string is alpha [string index $event_str end-1]]
+ &&
+ [string index $event_str end] == {>}
+ } then {
+ set letter [string index $event_str end-1]
+ set event_str [string range $event_str 1 end-2]
+ if {[string is upper $letter]} {
+ set event_str "Shift-${event_str}"
+ }
- eval "original_command_bind $args"
+ original_command_bind $widget "<${event_str}[string toupper $letter]>" $command
+ original_command_bind $widget "<${event_str}[string tolower $letter]>" $command
+ } else {
+ original_command_bind $widget $event_str $command
}
- rename microsoft_windows_specific_bind bind
}
+rename mcu8051ide_bind bind
# ------------------------------------------------------------------------------
-
# Load base config file
# -----------------------------
+# Initialize variable containing the font size factor
+set font_size_factor 1.0
+
# Load i18n library
# (It must be loaded here because ::msgcat::mclocale must be available when
# base config file is being loaded)
incr T [lindex [time {
if {[catch {package require msgcat 1.3.4}]} {
libraryLoadFailed "msgcat"
- } {
+ } else {
+ namespace import -force ::msgcat::mc
+ namespace import -force ::msgcat::mcset
namespace import -force ::msgcat::*
}
}] 0]
@@ -240,7 +323,7 @@ if {![file exists ${::CONFIG_DIR}]} {
puts "\nCreating program configuration files in directory: \"[file normalize ${::CONFIG_DIR}]\""
if {!$::MICROSOFT_WINDOWS} {
puts "Welcome in this IDE, [file tail [file normalize ~]] !"
- } {
+ } else {
catch { ;# Make the configuration directory in Microsoft Windows hidden
file attributes $::CONFIG_DIR -hidden 1
}
@@ -253,10 +336,16 @@ if {[catch {
# File doesn't exits -> create it with default configuration
}]} then {
# Default settings
+ set detected_lang [string tolower [lindex [split [::msgcat::mclocale] {_}] 0]]
+ if {{} != [lindex [split [::msgcat::mclocale] {_}] 1]} {
+ append detected_lang {_} [string toupper [lindex [split [::msgcat::mclocale] {_}] 1]]
+ }
array set GLOBAL_CONFIG [list \
splash 1 \
tips 1 \
- language [::msgcat::mclocale] \
+ language $detected_lang \
+ background {Default} \
+ wstyle {clam} \
]
# Create the file
@@ -264,11 +353,14 @@ if {[catch {
set conf_file [open "${::CONFIG_DIR}/base.conf" w]
puts -nonewline $conf_file [list \
$GLOBAL_CONFIG(splash) \
- $GLOBAL_CONFIG(splash) \
+ $GLOBAL_CONFIG(tips) \
$GLOBAL_CONFIG(language) \
+ ${::font_size_factor} \
+ $GLOBAL_CONFIG(background) \
+ $GLOBAL_CONFIG(wstyle) \
]
close $conf_file
- }]} {
+ }]} then {
puts stderr "Unable to create base configuration file"
}
# File exits -> read configuration from it
@@ -277,48 +369,89 @@ if {[catch {
set data [read $conf_file]
close $conf_file
- # Set configuration acording to the file contents
+ # Set configuration according to the file contents
set GLOBAL_CONFIG(splash) [lindex $data 0]
set GLOBAL_CONFIG(tips) [lindex $data 1]
set GLOBAL_CONFIG(language) [lindex $data 2]
+ set ::font_size_factor [lindex $data 3]
+ set GLOBAL_CONFIG(background) [lindex $data 4]
+ set GLOBAL_CONFIG(wstyle) [lindex $data 5]
## Validate read values
- if {![string is boolean -strict ${GLOBAL_CONFIG(splash)}]} {
+ if {![regexp {^1\.\d+$} $::font_size_factor] || $::font_size_factor < 1.0 || $::font_size_factor >= 2.0} {
+ set ::font_size_factor 1.0
+ }
+ if {![string is boolean -strict ${::GLOBAL_CONFIG(splash)}]} {
set GLOBAL_CONFIG(splash) 1
}
- if {![string is boolean -strict ${GLOBAL_CONFIG(tips)}]} {
+ if {![string is boolean -strict ${::GLOBAL_CONFIG(tips)}]} {
set GLOBAL_CONFIG(tips) 1
}
+ # This feature is not supported on MS Windows due to BWidget
+ if {!$::MICROSOFT_WINDOWS} {
+ switch -- ${::GLOBAL_CONFIG(background)} {
+ {Default} {set ::COMMON_BG_COLOR {#eeeeee}}
+ {Windows} {set ::COMMON_BG_COLOR {#ece9d9}}
+ {Tk} {}
+ {Light} {set ::COMMON_BG_COLOR {#f8f8f8}}
+ {Dark} {set ::COMMON_BG_COLOR {#cccccc}}
+ default {
+ set ::GLOBAL_CONFIG(background) {Default}
+ set ::COMMON_BG_COLOR {#eeeeee}
+ }
+ }
+ }
+ if {[lsearch -ascii -exact [ttk::style theme names] ${::GLOBAL_CONFIG(wstyle)}] == -1} {
+ set ::GLOBAL_CONFIG(wstyle) {clam}
+ }
# Check if the cpecified translation is valid
set tmp [list]
catch { ;# For Microsoft Windows it has to be enclosed by catch
set tmp [glob -nocomplain -types f -tails \
- -directory "${LIB_DIRNAME}/../translations" *.msg \
+ -directory "${::INSTALLATION_DIR}/translations" *.msg \
]
}
set translations {en}
foreach translation $tmp {
lappend translations [file rootname $translation]
}
+
if {[lsearch $translations ${GLOBAL_CONFIG(language)}] == -1} {
set GLOBAL_CONFIG(language) {en}
}
}
+
# Load translation
# -----------------------------
+# Load list of language names
+set ::LANGUAGE_CODES [list]
+namespace eval ::configDialogues::global {
+ if {[catch {
+ set file [open "${::INSTALLATION_DIR}/translations/languages.txt" r]
+ set languages [read $file]
+ close $file
+
+ regsub -all -line {\s*#.*$} $languages {} languages
+ set ::LANGUAGE_CODES $languages
+ lindex $languages 0
+ } e]} {
+ puts stderr "Error while loading list of laguages: $e"
+ }
+}
+
# Load language specific translation file
if {!${::CLI_OPTION(notranslation)} && ${GLOBAL_CONFIG(language)} != {en}} {
if {[catch {
- mclocale ${GLOBAL_CONFIG(language)}
- mcload "${LIB_DIRNAME}/../translations/"
+ ::msgcat::mclocale ${GLOBAL_CONFIG(language)}
+ incr T [lindex [time {
+ source "${::INSTALLATION_DIR}/translations/${GLOBAL_CONFIG(language)}.msg"
+ }] 0]
} result]} then {
puts stderr "Unable to load translation"
- puts stderr "\tFile: '${LIB_DIRNAME}/../translations/${GLOBAL_CONFIG(language)}.msg'"
- puts "\n"
- puts $result
+ puts stderr "\tFile: '${::INSTALLATION_DIR}/translations/${GLOBAL_CONFIG(language)}.msg'"
} else {
set ::TRANSLATION_LOADED 1
@@ -329,14 +462,24 @@ if {!${::CLI_OPTION(notranslation)} && ${GLOBAL_CONFIG(language)} != {en}} {
# -----------------------------
if {!$::CLI_OPTION(nosplash) && ${::GLOBAL_CONFIG(splash)}} {
+ # Workaround for multiple monitors
+ toplevel .splash_aux
+ wm attributes .splash_aux -fullscreen 1
+ update
+ set sw [winfo width .splash_aux]
+ set sh [winfo height .splash_aux]
+ destroy .splash_aux
+ update
+
# Crete toplevel window
- toplevel .splash -class {Splash creen} -bg {#EEEEEE}
+ toplevel .splash -class {Splash creen} -bg ${::COMMON_BG_COLOR}
# Show image of splash creen
place [label .splash.bg \
+ -bg {#FFFFFF} \
-image [ \
image create photo -format png \
- -file "${::LIB_DIRNAME}/../icons/other/splash.png" \
+ -file "${::ROOT_DIRNAME}/icons/other/splash.png" \
] \
] -x 0 -y 0 -width 400 -height 199
@@ -347,8 +490,9 @@ if {!$::CLI_OPTION(nosplash) && ${::GLOBAL_CONFIG(splash)}} {
] -x 200 -y 180 -anchor center
# Set window parameters
- wm geometry .splash "=400x199+[expr {[winfo screenwidth .] / 2 - 200}]+[expr {[winfo screenheight .] / 2 - 100}]"
+ wm geometry .splash "=400x199+[expr {$sw / 2 - 200}]+[expr {$sh / 2 - 100}]"
wm overrideredirect .splash 1
+ wm attributes .splash -alpha 0.8
# Click on splash creen destroys it
bind .splash <1> {wm withdraw .splash}
@@ -374,7 +518,7 @@ proc time_in_msec {} {
if {!$::CLI_OPTION(quiet)} {
if {$::CLI_OPTION(nocolor)} {
puts "... $msec ms"
- } {
+ } else {
puts "... \033\[33m$msec ms\033\[m"
}
}
@@ -397,7 +541,7 @@ proc showInitMessage {message} {
if {!${::CLI_OPTION(quiet)}} {
if {${::CLI_OPTION(nocolor)}} {
puts -nonewline $message
- } {
+ } else {
puts -nonewline "\033\[37m$message\033\[m"
}
@@ -489,7 +633,7 @@ proc setStatusTip args {
if {!$CLI_OPTION(quiet)} {
if {$CLI_OPTION(nocolor)} {
puts [mc "\nInitializing MCU 8051 IDE %s" $VERSION]
- } {
+ } else {
puts [mc "\nInitializing \033\[1mMCU 8051 IDE \033\[32m%s\033\[m" $VERSION]
}
}
@@ -503,7 +647,7 @@ incr T [lindex [time {
if {[catch {package require [lindex $library 0] [lindex $library 1]}]} {
libraryLoadFailed [lindex $library 0]
# Loading failed
- } {
+ } else {
if {!$::CLI_OPTION(nosplash)} update
}
}
@@ -520,12 +664,14 @@ incr T [lindex [time {
foreach program {
urxvt vim emacs kwrite gedit nano dav
le sdcc indent doxygen asl asem doxywizard
- as31 sdcc-sdcc gvim
- } {
+ as31 sdcc-sdcc gvim hunspell d52
+ make
+ } \
+{
if {[auto_execok $program] == {}} {
- set ::PROGRAM_AVALIABLE($program) 0
- } {
- set ::PROGRAM_AVALIABLE($program) 1
+ set ::PROGRAM_AVAILABLE($program) 0
+ } else {
+ set ::PROGRAM_AVAILABLE($program) 1
}
}
time_in_msec ;# Print time info
@@ -533,18 +679,20 @@ time_in_msec ;# Print time info
## Load program sources
showInitMessage [mc "\tLoading program sources"]
set T [time {
+ source "${::LIB_DIRNAME}/lib/modern_notebook.tcl" ;# NoteBook widget with a modern look (modern in 2011)
+ source "${::LIB_DIRNAME}/lib/FSnotifications.tcl" ;# Filesystem watcher
source "${::LIB_DIRNAME}/lib/innerwindow.tcl" ;# Tool for creating inner windows
- source "${::LIB_DIRNAME}/dialogs/errorhandler.tcl" ;# Background error handler
- source "${::LIB_DIRNAME}/dialogs/my_tk_messageBox.tcl" ;# A replacement for tk_messageBox
+ source "${::LIB_DIRNAME}/dialogues/errorhandler.tcl" ;# Background error handler
+ source "${::LIB_DIRNAME}/dialogues/my_tk_messageBox.tcl";# A replacement for tk_messageBox
source "${::LIB_DIRNAME}/lib/settings.tcl" ;# Settings management
source "${::LIB_DIRNAME}/project.tcl" ;# Project management
- source "${::LIB_DIRNAME}/dialogs/fsd.tcl" ;# File selection dialog
+ source "${::LIB_DIRNAME}/dialogues/fsd.tcl" ;# File selection dialog
source "${::LIB_DIRNAME}/X.tcl" ;# GUI <==> Implementation Interface
- source "${::LIB_DIRNAME}/configdialogs/configdialogs.tcl";# Configuration dialogs
+ source "${::LIB_DIRNAME}/configdialogues/configdialogues.tcl";# Configuration dialogues
source "${::LIB_DIRNAME}/editor/editor.tcl" ;# Source code editor
source "${::LIB_DIRNAME}/lib/Math.tcl" ;# Special mathematical operations
source "${::LIB_DIRNAME}/compiler/compiler.tcl" ;# 8051 Assemly language compiler
- source "${::LIB_DIRNAME}/dialogs/tips.tcl" ;# Tips on startup
+ source "${::LIB_DIRNAME}/dialogues/tips.tcl" ;# Tips on start-up
source "${::LIB_DIRNAME}/lib/hexeditor.tcl" ;# Hexadecimal editor
source "${::LIB_DIRNAME}/utilities/hexeditdlg.tcl" ;# Hexadecimal editor dialog
source "${::LIB_DIRNAME}/environment.tcl" ;# Main window "trappings" (menu and such)
@@ -555,40 +703,47 @@ set T [time {
source "${::LIB_DIRNAME}/maintab.tcl" ;# Central widget
source "${::LIB_DIRNAME}/lib/ihextools.tcl" ;# Tools for manipulating Intel 8 HEX
source "${::LIB_DIRNAME}/utilities/symbol_viewer.tcl" ;# Assembly symbols viewer
- source "${::LIB_DIRNAME}/utilities/eightsegment.tcl" ;# 8-segment LED display editor
+ source "${::LIB_DIRNAME}/utilities/eightsegment.tcl" ;# 8-Segment LED display editor
source "${::LIB_DIRNAME}/utilities/asciichart.tcl" ;# ASCII chart
+ source "${::LIB_DIRNAME}/utilities/table_of_instructions.tcl";# 8051 Instruction Table
source "${::LIB_DIRNAME}/utilities/notes.tcl" ;# Scribble notepad
- source "${::LIB_DIRNAME}/utilities/baseconvertor.tcl" ;# Base convertor
+ source "${::LIB_DIRNAME}/utilities/baseconverter.tcl" ;# Base converter
source "${::LIB_DIRNAME}/utilities/speccalc.tcl" ;# Special calculator for x51 MCU's
source "${::LIB_DIRNAME}/utilities/rs232debugger.tcl" ;# UART/RS232 applications debugger
}]
time_in_msec ;# Print time info
# CHECK FOR VALIDITY OF THE MCU DATABASE
-if {${::X::avaliable_processors} == {}} {
+if {${::X::available_processors} == {}} {
destroy .splash
bell
tk_messageBox \
-icon error \
-type ok \
-title [mc "FATAL ERROR"] \
- -message [mc "MCUs database file is currupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE."]
+ -message [mc "MCUs database file is corrupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE."]
exit 1
}
# Load global configuration
loadApplicationConfiguration
+# Start spell checker process and wait until it is started
+::Editor::restart_spellchecker_process
+::Editor::adjust_spell_checker_config_button
+
# Initialize GUI environment
-iconbar_redraw ;# Main toolbar
mainmenu_redraw ;# Main menu
+iconbar_redraw ;# Main toolbar
shortcuts_reevaluate ;# Key shortcuts
## Remove splash screen
-destroy .splash
+if {[winfo exists .splash]} {
+ destroy .splash
+}
if {$CLI_OPTION(minimalized)} {
wm state . iconic
-} {
+} else {
wm deiconify .
}
@@ -596,10 +751,12 @@ if {$CLI_OPTION(minimalized)} {
if {$::TCLX_AVAILABLE} {
proc signal_handler {signal_name} {
global cntrlc_flag
- puts stdout [mc "\nExiting on signal %s" $signal_name]
- if {[catch {::X::__exit 1}]} {
- exit 1
+ puts stderr [mc "\nExiting on signal %s" $signal_name]
+ catch {
+ ::X::__exit 1 1
}
+ puts stderr [mc "\nERROR: Unable to exit the program correctly -- TERMINATING NOW!" $signal_name]
+ exit 1
}
signal trap SIGINT {signal_handler SIGINT}
@@ -608,14 +765,14 @@ if {$::TCLX_AVAILABLE} {
# ---------------------------------------------------------
-# Ugly job ... dirty workarounds and such a shit ... :(
+# Ugly job ... dirty workarounds and such things ... :(
# ---------------------------------------------------------
catch {
NoteBook .foo
proc NoteBook::_getoption {path page option} {
if {$option == {-background}} {
- return {#eeeeee}
+ return ${::COMMON_BG_COLOR}
}
set value [Widget::cget $path.f$page $option]
@@ -630,7 +787,6 @@ catch {
# ---------------------------------------------------------
-
## Open the last session
# Print message
showInitMessage [mc "\tOpening last session"]
@@ -638,6 +794,10 @@ flush stdout
# Evaluate new geometry of the main window
update
evaluate_new_window_geometry
+if {![winfo viewable .mainMenu]} {
+ wm geometry . $::CONFIG(WINDOW_GEOMETRY)
+ update
+}
# Open projects of last session
set T [time {
foreach project_file $::CONFIG(OPENED_PROJECTS) {
@@ -651,12 +811,12 @@ set T [time {
}
}]
-# Reopen base convertors
-foreach cfg $::CONFIG(BASE_CONVERTORS) {
+# Reopen base converters
+foreach cfg $::CONFIG(BASE_CONVERTERS) {
if {[catch {
- set obj [::X::__base_convertor]
+ set obj [::X::__base_converter]
::X::$obj set_config $cfg
- }]} {
+ }]} then {
puts stderr {}
puts stderr $::errorInfo
}
@@ -664,8 +824,36 @@ foreach cfg $::CONFIG(BASE_CONVERTORS) {
time_in_msec ;# Print time info
+# Without this "help windows" won't work properly on MS Windows
+if {$::MICROSOFT_WINDOWS} {
+ if {[wm state .] == {zoomed}} {
+ set ::LATS_KNOWN_WM_STATE_IS_ZOOMED 1
+ } else {
+ set ::LATS_KNOWN_WM_STATE_IS_ZOOMED 0
+ }
+}
# Create binding for panes management
-bind . <Configure> {X::redraw_panes}
+bind . <Configure> {
+ X::redraw_panes
+
+ # Without this "help windows" won't work properly on MS Windows
+ if {$::MICROSOFT_WINDOWS} {
+ if {[wm state .] == {zoomed}} {
+ set now_zoomed 1
+ } else {
+ set now_zoomed 0
+ }
+
+ if {!${::LATS_KNOWN_WM_STATE_IS_ZOOMED} && $now_zoomed} {
+ after idle {
+ update
+ regsub {[\+\-].*$} [wm geometry .] {+0+0} geometry
+ wm geometry . $geometry
+ }
+ }
+ set ::LATS_KNOWN_WM_STATE_IS_ZOOMED $now_zoomed
+ }
+}
# Print final message
if {!$CLI_OPTION(quiet)} {
puts [mc "%s is now operational\n" $APPNAME]
@@ -675,9 +863,11 @@ if {!$CLI_OPTION(quiet)} {
set ::Compiler::in_IDE 1
set APPLICATION_LOADED 1
set X::critical_procedure_in_progress 0
-update idle
+update
X::redraw_panes
+update
foreach project ${::X::openedProjects} {
+ $project bottomNB_redraw_pane
$project filelist_adjust_size_of_tabbar
$project ensure_that_both_editors_are_properly_initialized
}
@@ -689,11 +879,15 @@ if {${::X::actualProject} != {}} {
focus [${::X::actualProject} editor_procedure {} highlight_visible_area {}]
}
-# Just workaround for disapearing main menu
-raise .
-
# Correct strange behavior concerning restoration of the last window size and position
if {$::MICROSOFT_WINDOWS} {
update
wm geometry . $::CONFIG(WINDOW_GEOMETRY)
}
+
+# Initialize file change notifications mechanism
+FSnotifications::init
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/maintab.tcl b/lib/maintab.tcl
index 57f0351..b0159ab 100755..100644
--- a/lib/maintab.tcl
+++ b/lib/maintab.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 _MAINTAB_TCL ] } {
+set _MAINTAB_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Manages central widget of this program, each instance of this class
@@ -41,7 +46,7 @@ class MainTab {
public variable projectPath ;# Path to directory where the project file is located
public variable projectFile ;# Name of the project file
public variable procData ;# Processor definition list
- public variable avaliable_SFR ;# List of SFR and SFB which are avaliable on the choosen MCU
+ public variable available_SFR ;# List of SFR and SFB which are available on the choosen MCU
# Compiler configuration related variables
private variable PCC_native_assembler ;# --> ::Compiler::Settings::*
@@ -58,19 +63,20 @@ class MainTab {
private variable PCC_sdcc_scs_str_opt ;# --> ::ExternalCompiler::sdcc_scs_string_options
## Project information variables
- # (P - project; G - general)
+ # (P - project; G - general; S - Special)
public variable P_information_version ;# Project version
public variable P_information_date ;# Date of last project update
public variable G_information_authors ;# List of project authors
public variable G_information_copyright ;# Project copyright information
- public variable G_information_licence ;# Project licence information
+ public variable G_information_license ;# Project license information
+ public variable S_flag_read_only ;# Project is for reading only (e.g. "Demo project")
public variable P_option_mcu_type ;# Processor type (e.g. AT89C51RC)
public variable P_option_clock ;# Project default simulator clock rate
public variable P_option_mcu_xdata ;# Size of external data memory
public variable P_option_mcu_xcode ;# Size of external program memory
public variable P_option_main_file ;# Project main source file
- public variable project_description ;# Project decription text
+ public variable project_description ;# Project description text
public variable todoText ;# Content of TODO list
public variable calculatorList ;# List of values for calculator (see class Calculator)
public variable other_options ;# Other options
@@ -84,9 +90,10 @@ class MainTab {
# @parm List dataList - Data extracted from project file (see NS Project)
constructor {ProjectName projectpath projectfile dataList} {
set projectName $ProjectName
+ set S_flag_read_only 0
#
- ## PARSE PROJECT DATA
+ ## PROCESS PROJECT SPECIFICATION DATA
#
set i 0
@@ -96,7 +103,7 @@ class MainTab {
}
set i 0
- foreach info {authors copyright licence} {
+ foreach info {authors copyright license} {
regsub -all {\\\}} [regsub -all {\\\{} [lindex $dataList "1 $i"] "{"] "}" G_information_$info
incr i
}
@@ -138,37 +145,41 @@ class MainTab {
array set PCC_AS31_config [lindex $dataList {8 10}]
array set PCC_AS31_addcfg [lindex $dataList {8 11}]
}
- } {
+ } else {
retrieve_compiler_settings
}
set projectFiles [lindex $dataList 9]
# Load default values if the given values is not valid
- if {[lsearch ${::X::avaliable_processors} $P_option_mcu_type] == -1} {
+ if {[lsearch ${::X::available_processors} $P_option_mcu_type] == -1} {
set P_option_mcu_type [lindex ${X::project_edit_defaults} {0 1}]
puts stderr "Unsupported processor type -- setting to [lindex ${X::project_edit_defaults} {0 1}]"
}
set procData [SelectMCU::get_processor_details $P_option_mcu_type]
+
+ # set MCU type in status bar, kdb -- Are you sure Kara that this line does anathing??
+ .statusbarMCU configure -text $P_option_mcu_type
+
if {$procData == {}} {
wm withdraw .
tk_messageBox \
-icon error \
-type ok \
-title [mc "FATAL ERROR"] \
- -message [mc "MCUs database file is currupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE."]
+ -message [mc "MCUs database file is corrupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE."]
exit 1
}
- refresh_project_avaliable_SFR
- if {![string is digit -strict $P_option_mcu_xdata] || $P_option_mcu_xdata > 0xFFFF} {
+ refresh_project_available_SFR
+ if {![string is digit -strict $P_option_mcu_xdata] || $P_option_mcu_xdata > 0x10000} {
set P_option_mcu_xdata 0
puts "Invalid XDATA capacity -- setting to 0"
}
if {
![string is digit -strict $P_option_mcu_xcode]
||
- $P_option_mcu_xcode > [expr {0xFFFF - ([lindex $procData 2] * 1024)}]
- } {
+ $P_option_mcu_xcode > [expr {0x10000 - ([lindex $procData 2] * 1024)}]
+ } then {
set P_option_mcu_xcode 0
puts "Invalid XCODE capacity -- setting to 0"
}
@@ -178,12 +189,12 @@ class MainTab {
if {[lindex $procData 1] != {yes}} {
set P_option_mcu_xcode 0
}
- if {[regexp {^\d+$} $P_option_clock]} {
+ if {[regexp {^\d+(\.\d+)?$} $P_option_clock]} {
if {$P_option_clock > 99999} {
set P_option_clock [lindex ${X::project_edit_defaults} {1 1}]
puts stderr "Clock value must be below 99999 -- setting to [lindex ${X::project_edit_defaults} {1 1}]"
}
- } {
+ } else {
set P_option_clock [lindex ${X::project_edit_defaults} {1 1}]
puts stderr "Invalid clock value -- setting to [lindex ${X::project_edit_defaults} {1 1}]"
}
@@ -197,32 +208,46 @@ class MainTab {
set projectFile $projectfile
# create higher-level container
- set mainTab [.mainFrame.mainNB insert end \
- [string trimleft $this {:}] \
- -text $projectName \
- -image ::ICONS::16::kcmdevices \
- -raisecmd "X::switch_project $this" \
+ set mainTab [${::main_nb} insert end \
+ [string trimleft $this {:}] \
+ -text $projectName \
+ -image ::ICONS::16::kcmdevices \
+ -raisecmd [list X::switch_project $this] \
]
-
- # Some workaround -- only a "cosmetic" matter
- catch {
- .mainFrame.mainNB.c bind p:[string trimleft $this {:}] <Enter> {}
+ after idle {
+ update
+ foreach project ${::X::openedProjects} {
+ $project bottomNB_redraw_pane
+ }
}
+ # Invoke progress dialog
+ set ::FileList::open_files_cur_file [mc "Initializing ..."]
+ create_progress_bar .prgDl \
+ . \
+ ::FileList::open_files_cur_file \
+ {} \
+ ::FileList::open_files_progress \
+ 0 \
+ [mc "Opening project files"] \
+ ::ICONS::16::fileopen \
+ [mc "Abort"] \
+ {set ::FileList::open_files_abort 1}
+
# create paned windows
set main_Pane [panedwindow $mainTab.main_Pane \
-orient vertical \
- -sashwidth 2 \
+ -sashwidth 4 \
-showhandle 0 \
-opaqueresize 1 \
- -sashrelief flat \
+ -sashrelief raised \
]
set top_Pane [panedwindow $main_Pane.top_Pane \
-orient horizontal \
-sashwidth 2 \
-showhandle 0 \
-opaqueresize 1 \
- -sashrelief flat \
+ -sashrelief raised \
]
set fileList_Pane [panedwindow $top_Pane.fileList_Pane \
-orient horizontal \
@@ -244,19 +269,19 @@ class MainTab {
# Intialize all panels
simulator_initialize_mcu
- Initialize_rightPanel $rightPanel $top_Pane $watches_file
- initiate_BottomNoteBook $bottom_pane $main_Pane $todoText $calculatorList $graphList
- initiate_FileList $fileList_Pane $projectPath $projectFiles $editor_sw_lock
+ initialize_rightPanel $rightPanel $top_Pane $watches_file
+ initalize_BottomNoteBook $bottom_pane $main_Pane $todoText $calculatorList $graphList
+ initalize_FileList $fileList_Pane $projectPath $projectFiles $editor_sw_lock
- # Adjust progress dialog invoked from procedure initiate_FileList
+ # Adjust progress dialog
catch {.prgDl configure -command {puts stderr "Unable to abort at this stage !"}}
- set ::FileList::open_files_cur_file {Finishing ...}
+ set ::FileList::open_files_cur_file [mc "Finishing ..."]
# Pack main pane
pack $main_Pane -expand 1 -fill both
# Raise last tab in mainNB
- .mainFrame.mainNB raise [string trimleft $this {:}]
+ ${::main_nb} raise [string trimleft $this {:}]
# Take care of proper geometry management
bottomNB_redraw_pane
@@ -272,6 +297,7 @@ class MainTab {
# Load scenario file
if {[pale_open_scenario $scenario_file] == 1} {
tk_messageBox \
+ -parent . \
-type ok \
-icon error \
-title [mc "IO Error"] \
@@ -287,7 +313,7 @@ class MainTab {
## Object destructor
destructor {
- .mainFrame.mainNB delete [string trimleft $this {:}]
+ ${::main_nb} delete [string trimleft $this {:}]
}
## Kill all child processes
@@ -298,10 +324,10 @@ class MainTab {
$this hw_man_kill_childern
}
- ## Refresh list of avaliable SFR and SFB
+ ## Refresh list of available SFR and SFB
# @return void
- public method refresh_project_avaliable_SFR {} {
- set avaliable_SFR [concat [lindex $procData 43] {
+ public method refresh_project_available_SFR {} {
+ set available_SFR [concat [lindex $procData 43] {
R0 R1 R2 R3 R4 R5 R6 R7
B ACC A TMOD TH0 TH1 SP DPL DPH PCON
TL0 TL1 AB DPTR
@@ -314,7 +340,7 @@ class MainTab {
}] ;# REGISTER BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
foreach editor [$this cget -editors] {
- $editor refresh_avaliable_SFR
+ $editor refresh_available_SFR
}
}
@@ -362,9 +388,9 @@ class MainTab {
# @return void
public method retrieve_compiler_settings {} {
# Native assembler
- foreach key ${::configDialogs::compiler::defaults} {
+ foreach key ${::configDialogues::compiler::defaults} {
set key [lindex $key 0]
- set PCC_native_assembler($key) [subst "\$::Compiler::Settings::$key"]
+ set PCC_native_assembler($key) [subst -nocommands "\$::Compiler::Settings::$key"]
}
set PCC_native_assembler(WARNING_LEVEL) \
${::Compiler::Settings::WARNING_LEVEL}
@@ -422,4 +448,16 @@ class MainTab {
[array get PCC_AS31_addcfg] \
]
}
+
+ ## Set project read only flag
+ #
+ # The flag inhibits proc ::X::__proj_save.
+ # @return void
+ public method set_read_only {} {
+ set S_flag_read_only 1
+ }
+}
+
+# >>> File inclusion guard
}
+# <<< File inclusion guard
diff --git a/lib/pale/ds1620.tcl b/lib/pale/ds1620.tcl
new file mode 100644
index 0000000..7c1df63
--- /dev/null
+++ b/lib/pale/ds1620.tcl
@@ -0,0 +1,1730 @@
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# 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 #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _DS1620_TCL ] } {
+set _DS1620_TCL _
+# <<< File inclusion guard
+
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+#
+# Consists of:
+# INTERNAL APPLICATION LOGIC
+# VIRTUAL HW COMMON INTERFACE -- CALLED FROM PALE ENGINE
+# VIRTUAL HW COMMON INTERFACE -- CALLED FROM THE BASE CLASS
+# --------------------------------------------------------------------------
+
+class Ds1620 {
+ inherit VirtualHWComponent
+
+ # Font: Font to be used in the panel -- bold
+ common cb_font [font create \
+ -weight bold \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -family {helvetica} \
+ ]
+ # Font: Font to be used in the panel -- bold
+ common small_font [font create \
+ -size [expr {int(-9 * $::font_size_factor)}] \
+ -family {helvetica} \
+ ]
+
+ common COMPONENT_NAME "DS1620 temperature sensor" ;# Name of this component
+ common CLASS_NAME "Ds1620" ;# Name of this class
+ common COMPONENT_ICON {ds1620} ;# Icon for this panel (16x16)
+
+ # Configuration menu
+ common CONFMENU {
+ {checkbutton "Disable delays" {} {::Ds1620::_no_delays}
+ 1 0 0 {no_delays_changed}
+ ""}
+ {command {Show DS1620 log} {} 5 "show_log" {bar5}
+ "Display the log of events which are currently happening in the simulated DS1620 chip"}
+ {separator}
+ {command {Show help} {} 5 "show_help" {help}
+ "Show brief help"}
+ {separator}
+ {command {Save configuration} {} 0 "save_as" {filesave}
+ "Save configuration into a file"}
+ {command {Load configuration} {} 0 "load_from" {fileopen}
+ "Load configuration from a file"}
+ {separator}
+ {checkbutton "Window always on top" {} {::Ds1620::menu_keep_win_on_top}
+ 1 0 0 {keep_win_on_top_changed}
+ ""}
+ }
+
+ #
+ common STATUS_BITS {DONE THF TLF NVB 1 0 CPU 1SHOT}
+ common MAX_LOG_LENGTH 100 ;# Int: Maximum number of row in the log window
+ common SIGNAL_NAMES {DQ CLK RST TH TL TCOM}
+ common EEPROM_WRITE_CYCLE_TIME 10000
+ common T_CONVERSION_TIME_MS 750
+ common _no_delays 0
+
+ private variable input_error
+ private variable input_error_desc
+
+ private variable connection_port ;# Array of Int: Index is key number, value is port number or {-}
+ private variable connection_pin ;# Array of Int: Index is key number, value is bit number or {-}
+
+ private variable wires ;# Array of CanvasObject (line): Wire connection between the IC and the MCU
+ private variable temp_ind_y_offset
+ private variable temp_ind_x_offset
+ private variable temperature 22
+ private variable temp_point_y 0
+ private variable enaged ;# Array of Bool: enaged(port_num,bit_num) --> Is connected to this device ?
+ private variable ds1620_reg ;# Array of
+ private variable entrybox ;# Array of
+ private variable reg_bit ;# Array of
+ private variable status ;# Array of
+ private variable no_delays 0
+ private variable log_win_text {}
+ private variable warning_indicator {}
+ private variable time_mark 0 ;# Int: Time mark pointing to this point of time according to the MCU simulator engine
+ private variable keep_win_on_top 0 ;# Bool: Toplevel window
+ private variable log_time_mark 0
+ private variable log_window_geometry {}
+ private variable signal
+ private variable log_enabled 1 ;# Bool: Logging of events enabled (slower simulation)
+ private variable log_on_off_chbut ;# Widget: Checkbox for enabling and disabling the logging of events
+
+ private variable bit_number 0
+ private variable byte_received
+ private variable command_received 0
+ private variable reception_or_transmission 1
+ private variable receive_command_or_data 1
+ private variable number_of_bits
+ private variable data_to_send 0
+ private variable conversion_running 0
+ private variable delay_transmission 1
+ private variable communication_disabled 0
+ private variable write_to_NVM 0
+ private variable t_conversion_time_mark 0
+ private variable time_of
+ private variable pending_communication 0
+
+
+ # ------------------------------------------------------------------
+ # INTERNAL APPLICATION LOGIC
+ # ------------------------------------------------------------------
+
+ ## Object constructor
+ # @parm Object _project - Project object
+ constructor {_project} {
+ # Set object variables identifing this component (see the base class)
+ set component_name $COMPONENT_NAME
+ set class_name $CLASS_NAME
+ set component_icon $COMPONENT_ICON
+
+ # Set other object variables
+ set project $_project
+ array set connection_port {0 - 1 - 2 - 3 - 4 - 5 -}
+ array set connection_pin {0 - 1 - 2 - 3 - 4 - 5 -}
+ array set ds1620_reg {
+ TH 30 TL 20
+ TEMP 392 PER_C 100
+ REMAIN 0 STATUS 136
+ }
+ array set signal {
+ CLK 0 CLK_prev 0
+ RST 0 RST_prev 0
+ DQ 0 DQ_prev 0
+ TH 0 TL 0
+ TCOM 0
+ }
+ array set time_of {
+ CLK_up 0 CLK_down 0
+ RST_up 0 RST_down 0
+ DQ_up 0 DQ_down 0
+ }
+ for {set port 0} {$port < 5} {incr port} {
+ for {set bit 0} {$bit < 8} {incr bit} {
+ set enaged($port,$bit) 0
+ }
+ }
+
+ # Inform PALE
+ $project pale_register_input_device $this
+ $project pale_set_modified
+
+ # Create panel GUI
+ create_gui
+ mcu_changed
+ on_off [$project pale_is_enabled]
+ reset_ds1620
+ create_log
+
+ # ComboBoxes to default state
+ for {set i 0} {$i < 6} {incr i} {
+ $canvas_widget.cb_b$i current 0
+ $canvas_widget.cb_p$i current 0
+ }
+ }
+
+ ## Object destructor
+ destructor {
+ # Inform PALE
+ $project pale_unregister_input_device $this
+
+ # Destroy GUI
+ destroy $win
+ }
+
+ ## Value of configuration menu variable "keep_win_on_top" has been changed
+ # @return void
+ public method keep_win_on_top_changed {} {
+ set keep_win_on_top $Ds1620::menu_keep_win_on_top
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ } else {
+ wm attributes $win -topmost 0 -alpha 1.0
+ }
+ }
+
+ ## Reconnect the specified line to another port pin
+ # @parm Int i - line number (0..5)
+ # @return void
+ public method reconnect {i} {
+ # Adjust connections
+ set connection_port($i) [$canvas_widget.cb_p$i get]
+ set connection_pin($i) [$canvas_widget.cb_b$i get]
+ if {$connection_pin($i) != {-}} {
+ set connection_pin($i) [expr {7 - $connection_pin($i)}]
+ }
+
+ # Reevaluate array of MCU port pins engaged by this device
+ evaluete_enaged_pins
+
+ # Change state of the device
+ if {$drawing_on} {
+ $project pale_reevaluate_IO
+ }
+
+ # Set flag modified
+ set_modified
+ }
+
+ ## Reevaluate array of MCU port pins engaged by this device
+ # @return void
+ private method evaluete_enaged_pins {} {
+ # Mark all as disengaged and infrom PALE
+ for {set port 0} {$port < 5} {incr port} {
+ for {set bit 0} {$bit < 8} {incr bit} {
+ if {$enaged($port,$bit)} {
+ $project pale_disengage_pin_by_input_device $port $bit $this
+ set enaged($port,$bit) 0
+ }
+ }
+ }
+
+ # Find the engaged ones and infrom PALE
+ for {set i 0} {$i < 6} {incr i} {
+ if {$i == 1 || $i == 2} {
+ continue
+ }
+
+ set port $connection_port($i)
+ set bit $connection_pin($i)
+
+ if {$port == {-} || $bit == {-}} {
+ continue
+ }
+
+ set enaged($port,$bit) 1
+ $project pale_engage_pin_by_input_device $port $bit $this
+ }
+ }
+
+ ## Create GUI of this panel
+ # @return void
+ private method create_gui {} {
+ # Create panel window and canvas widget
+ set win [toplevel .ledpanel$count -class $component_name -bg ${::COMMON_BG_COLOR}]
+ set canvas_widget [canvas $win.canvas \
+ -bg white -width 0 -height 0 \
+ -highlightthickness 0 \
+ ]
+
+ $canvas_widget create text 85 145 \
+ -text [mc "Note"] \
+ -font $cb_font \
+ -anchor e
+ $canvas_widget create window 90 145 \
+ -window [ttk::entry $canvas_widget.usr_note \
+ -validate key \
+ -validatecommand "$this set_modified" \
+ ] \
+ -width 405 -anchor w
+ bindtags $canvas_widget.usr_note \
+ [list $canvas_widget.usr_note TEntry $win all .]
+
+
+ draw_ic_package 73 10
+ draw_combo_boxes 35 10
+ draw_temperature_indicator 245 20
+ draw_registers 280 30
+
+ adjust_temp_ind
+
+ # Create "ON/OFF" button
+ set start_stop_button [ttk::button $canvas_widget.start_stop_button \
+ -command "$this on_off_button_press" \
+ -style Flat.TButton \
+ -width 3 \
+ ]
+ DynamicHelp::add $canvas_widget.start_stop_button \
+ -text [mc "Turn HW simulation on/off"]
+ setStatusTip -widget $start_stop_button -text [mc "Turn HW simulation on/off"]
+ bind $start_stop_button <Button-3> "$this on_off_button_press; break"
+ $canvas_widget create window 30 135 -window $start_stop_button -anchor nw
+ bindtags $start_stop_button [list $start_stop_button TButton all .]
+
+ # Create configuration menu button
+ set conf_button [ttk::button $canvas_widget.conf_but \
+ -image ::ICONS::16::configure \
+ -style FlatWhite.TButton \
+ -command "$this config_menu" \
+ ]
+ setStatusTip -widget $conf_button -text [mc "Configure"]
+ $canvas_widget create window 28 135 -window $conf_button -anchor ne
+ bindtags $conf_button [list $conf_button TButton all .]
+
+ # Pack canvas
+ pack $canvas_widget -fill both -expand 1
+
+ # Set window parameters
+ wm minsize $win 500 160
+ wm iconphoto $win ::ICONS::16::$component_icon
+ wm title $win "[mc $component_name] - [$project cget -projectName] - MCU 8051 IDE"
+ wm resizable $win 0 0
+ wm protocol $win WM_DELETE_WINDOW "$this close_window"
+ bindtags $win [list $win Toplevel all .]
+ }
+
+ public method reg_bit_event {type reg bit_no} {
+ switch -- $type {
+ 1 {
+ set ds1620_reg($reg) [expr {$ds1620_reg($reg) ^ (1 << $bit_no)}]
+ update_reg $reg
+ }
+ {E} { ;# Enter
+ set bit [expr {$ds1620_reg($reg) & (1 << $bit_no)}]
+ if {$bit} {
+ set fill ${::BitMap::one_a_fill}
+ set outline ${::BitMap::one_a_outline}
+ } else {
+ set fill ${::BitMap::zero_a_fill}
+ set outline ${::BitMap::zero_a_outline}
+ }
+ $canvas_widget itemconfigure $reg_bit($reg,$bit_no) -outline $outline -fill $fill
+ $canvas_widget configure -cursor hand2
+ }
+ {L} { ;# Leave
+ set bit [expr {$ds1620_reg($reg) & (1 << $bit_no)}]
+ if {$bit} {
+ set fill ${::BitMap::one_fill}
+ set outline ${::BitMap::one_outline}
+ } else {
+ set fill ${::BitMap::zero_fill}
+ set outline ${::BitMap::zero_outline}
+ }
+ $canvas_widget itemconfigure $reg_bit($reg,$bit_no) -outline $outline -fill $fill
+ $canvas_widget configure -cursor left_ptr
+ }
+ }
+ }
+
+ private method draw_registers {x_offset y_offset} {
+ set labels [list {TH} {TL} {TEMP}]
+ for {set i 0} {$i < 3} {incr i} {
+ set reg_name [lindex $labels $i]
+
+ $canvas_widget create text \
+ [expr {$x_offset + 0}] [expr {$y_offset + ($i * 20)}] \
+ -text $reg_name \
+ -font $cb_font \
+ -anchor w
+
+ set sep 0
+ for {set j 0} {$j < 9} {incr j} {
+ set k [expr {8 - $j}]
+ set reg_bit($reg_name,$k) [$canvas_widget create rectangle \
+ [expr {$x_offset + 38 + ($j * 13) + $sep}] [expr {$y_offset + ($i * 20) - 7}] \
+ [expr {$x_offset + 38 + ($j * 13) + 10 + $sep}] [expr {$y_offset + ($i * 20) - 7 + 10}] \
+ -width 1 \
+ ]
+ switch -- $j {
+ 0 -
+ 4 {
+ incr sep 3
+ }
+ }
+
+ $canvas_widget bind $reg_bit($reg_name,$k) <Button-1> [list $this reg_bit_event 1 $reg_name $k]
+ $canvas_widget bind $reg_bit($reg_name,$k) <Enter> [list $this reg_bit_event E $reg_name $k]
+ $canvas_widget bind $reg_bit($reg_name,$k) <Leave> [list $this reg_bit_event L $reg_name $k]
+ }
+ set entrybox($reg_name) [ttk::entry $canvas_widget.reg_$reg_name \
+ -validate key \
+ -validatecommand [list $this validate_reg_entry $reg_name %P] \
+ -width 5 \
+ -font $cb_font \
+ ]
+ $canvas_widget create window \
+ [expr {$x_offset + 163}] [expr {$y_offset + ($i * 20) - 10}] \
+ -window $entrybox($reg_name) \
+ -anchor nw
+
+ $canvas_widget create text \
+ [expr {$x_offset + 202}] [expr {$y_offset + ($i * 20)}] \
+ -text {°C} \
+ -font $cb_font \
+ -anchor w
+ }
+
+ set i 7
+ set sep 0
+ foreach bit_name $STATUS_BITS {
+ set status($bit_name) [$canvas_widget create text \
+ [expr {$x_offset - 0 + $sep}] [expr {$y_offset + 70}] \
+ -text $bit_name \
+ -font $::Simulator_GUI::bitfont \
+ -anchor w
+ ]
+
+ if {$i != 3 && $i != 2} {
+ $canvas_widget bind $status($bit_name) <Enter> [list $this status_bit_event E $bit_name $i]
+ $canvas_widget bind $status($bit_name) <Leave> [list $this status_bit_event L $bit_name $i]
+ $canvas_widget bind $status($bit_name) <Button-1> [list $this status_bit_event 1 $bit_name $i]
+ } elseif {$i == 2} {
+ $canvas_widget itemconfigure $status($bit_name) -fill ${::Simulator_GUI::off_color}
+ } elseif {$i == 3} {
+ $canvas_widget itemconfigure $status($bit_name) -fill ${::Simulator_GUI::on_color}
+ }
+
+ incr i -1
+ incr sep 2
+ incr sep [expr {9 * [string length $bit_name]}]
+ }
+ }
+
+ public method validate_reg_entry {reg_name content} {
+ if {![string length $content]} {
+ return 1
+ }
+ if {[string index $content 0] == {-} && [string length $content] == 1} {
+ return 1
+ }
+ if {[regexp {^\-?\d+\.$} $content]} {
+ return 1
+ }
+
+ if {![regexp {^\-?(\d+(\.\d)?)?$} $content]} {
+ return 0
+ }
+
+ if {$content > 127.5 || $content < -128.0} {
+ return 0
+ }
+
+ if {$reg_name == {STATUS}} {
+ set ds1620_reg($reg_name) $content
+ } else {
+ set content [expr {int($content * 2)}]
+ if {$content < 0} {
+ set content [expr {$content & 0x1ff}]
+ }
+ set ds1620_reg($reg_name) $content
+ }
+ update_reg $reg_name 1
+
+ return 1
+ }
+
+ private method update_reg {reg_name {do_not_affect_entrybox 0}} {
+ if {$reg_name == {STATUS}} {
+ set i 7
+ foreach bit_name $STATUS_BITS {
+ if {$ds1620_reg(STATUS) & (1 << $i)} {
+ set color ${::Simulator_GUI::on_color}
+ } else {
+ set color ${::Simulator_GUI::off_color}
+ }
+ $canvas_widget itemconfigure $status($bit_name) -fill $color
+
+ incr i -1
+ }
+ } else {
+ for {set bit_no 0} {$bit_no < 9} {incr bit_no} {
+ set bit [expr {$ds1620_reg($reg_name) & (1 << $bit_no)}]
+ if {$bit} {
+ set outline ${::BitMap::one_outline}
+ set fill ${::BitMap::one_fill}
+ } else {
+ set outline ${::BitMap::zero_outline}
+ set fill ${::BitMap::zero_fill}
+ }
+ $canvas_widget itemconfigure $reg_bit($reg_name,$bit_no) -outline $outline -fill $fill
+ }
+
+ if {!$do_not_affect_entrybox} {
+ set dec_val [expr {$ds1620_reg($reg_name) & 0xff}]
+ if {$ds1620_reg($reg_name) & 0x100} {
+ set dec_val [expr {$dec_val - 256}]
+ }
+ set dec_val [expr {$dec_val / 2.0}]
+ $entrybox($reg_name) delete 0 end
+ $entrybox($reg_name) insert 0 $dec_val
+ }
+ }
+
+ if {$reg_name == {TEMP}} {
+ update_outputs_Th_Tl_Tcom
+ }
+ }
+
+ public method status_bit_event {type bit_name bit_no} {
+ switch -- $type {
+ {1} {
+ set ds1620_reg(STATUS) [expr {$ds1620_reg(STATUS) ^ (1 << $bit_no)}]
+ update_reg STATUS
+ }
+ {E} {
+ $canvas_widget configure -cursor hand2
+ $canvas_widget itemconfigure $status($bit_name) -font $::Simulator_GUI::bitfont_under
+ }
+ {L} {
+ $canvas_widget configure -cursor left_ptr
+ $canvas_widget itemconfigure $status($bit_name) -font $::Simulator_GUI::bitfont
+ }
+ }
+ }
+
+ private method draw_temperature_indicator {x_offset y_offset} {
+ set x $x_offset
+ set y $y_offset
+
+ set temp_ind_x_offset $x_offset
+ set temp_ind_y_offset $y_offset
+
+ for {set i 0} {$i <= 100} {incr i} {
+ $canvas_widget create line \
+ [expr {$x + 0}] [expr {$y + $i}] \
+ [expr {$x + 10}] [expr {$y + $i}] \
+ -fill [format {#%02x33%02x} [expr {255 - int($i * 2.55)}] [expr {int($i * 2.55)}]] \
+ -tags temperature_indicator
+ }
+
+ $canvas_widget create line \
+ [expr {$x - 0}] [expr {$y + 0}] \
+ [expr {$x - 15}] [expr {$y + 0}] \
+ [expr {$x + 25}] [expr {$y + 0}] \
+ [expr {$x + 10}] [expr {$y + 0}] \
+ -fill {#000000} -arrow both \
+ -tags {temperature_pointer temperature_indicator}
+
+ $canvas_widget create text [expr {$x - 40}] [expr {$y - 8}] \
+ -text {°C} \
+ -font $cb_font \
+ -anchor w \
+ -tags temperature_C
+ $canvas_widget create text [expr {$x + 50}] [expr {$y - 8}] \
+ -text {°F} \
+ -font $cb_font \
+ -anchor e \
+ -tags temperature_F
+
+
+ $canvas_widget bind temperature_indicator <Button-1> [list $this temp_ind_event 1 %y]
+ $canvas_widget bind temperature_indicator <Button-5> [list $this temp_ind_event 5]
+ $canvas_widget bind temperature_indicator <Button-4> [list $this temp_ind_event 4]
+ $canvas_widget bind temperature_indicator <B1-Motion> [list $this temp_ind_event 1 %y]
+ }
+
+ private method adjust_temp_ind {} {
+ set y [expr {100 - int(($temperature + 55) / 1.8)}]
+
+ $canvas_widget move temperature_pointer 0 [expr {$y - $temp_point_y}]
+ set temp_point_y $y
+
+ $canvas_widget itemconfigure temperature_C -text [format {%s%3.1f°C} [expr {$temperature > 0 ? "" : "-"}] $temperature]
+ $canvas_widget itemconfigure temperature_F -text [format {%s%3.1f°F} [expr {($temperature * (9.0/5) + 32) > 0 ? "" : "-"}] [expr {($temperature * (9.0/5) + 32)}]]
+ }
+
+ public method temp_ind_event {type {y 0}} {
+ switch -- $type {
+ 1 {
+ incr y -$temp_ind_y_offset
+ set temperature [expr {180 - int($y * 1.8) - 55}]
+ }
+ 4 { ;# Wheel up
+ set temperature [expr {$temperature + 0.5}]
+ }
+ 5 { ;# Wheel down
+ set temperature [expr {$temperature - 0.5}]
+ }
+ }
+
+ if {$temperature < -55} {
+ set temperature -55
+ } elseif {$temperature > 125} {
+ set temperature 125
+ }
+
+ adjust_temp_ind
+ }
+
+ private method draw_combo_boxes {x_offset y_offset} {
+ set x $x_offset
+ set y $y_offset
+
+ incr y 12
+
+ for {set i 0} {$i < 6} {incr i} {
+ $canvas_widget create window $x $y -anchor e \
+ -window [ttk::combobox $canvas_widget.cb_p$i \
+ -width 1 \
+ -font $cb_font \
+ -state readonly \
+ ]
+ bind $canvas_widget.cb_p$i <<ComboboxSelected>> "$this reconnect $i"
+
+ $canvas_widget create window $x $y -anchor w \
+ -window [ttk::combobox $canvas_widget.cb_b$i \
+ -width 1 \
+ -font $cb_font \
+ -values {- 0 1 2 3 4 5 6 7} \
+ -state readonly \
+ ]
+ bind $canvas_widget.cb_b$i <<ComboboxSelected>> "$this reconnect $i"
+
+ bindtags $canvas_widget.cb_p$i \
+ [list $canvas_widget.cb_p$i TCombobox all .]
+ bindtags $canvas_widget.cb_b$i \
+ [list $canvas_widget.cb_b$i TCombobox all .]
+
+ if {$i == 2} {
+ incr x 160
+ incr y -25
+ } else {
+ incr y 25
+ }
+ }
+
+ $canvas_widget create text \
+ [expr {$x_offset + 0}] \
+ [expr {$y_offset + 5 + 3*25}] \
+ -text [mc "PORT"] \
+ -font $cb_font \
+ -anchor e
+ $canvas_widget create text \
+ [expr {$x_offset + 5}] \
+ [expr {$y_offset + 5 + 3*25}] \
+ -text [mc "BIT"] \
+ -font $cb_font \
+ -anchor w
+
+ $canvas_widget create text \
+ [expr {$x_offset + 160}] \
+ [expr {$y_offset + 21}] \
+ -text [mc "PORT"] \
+ -font $cb_font \
+ -anchor e
+ $canvas_widget create text \
+ [expr {$x_offset + 165}] \
+ [expr {$y_offset + 21}] \
+ -text [mc "BIT"] \
+ -font $cb_font \
+ -anchor w
+ }
+
+ private method draw_ic_package {x_offset y_offset} {
+ $canvas_widget create line \
+ [expr {$x_offset + 15}] [expr {$y_offset + 0}] \
+ [expr {$x_offset + 70}] [expr {$y_offset + 0}] \
+ [expr {$x_offset + 70}] [expr {$y_offset + 100}] \
+ [expr {$x_offset + 15}] [expr {$y_offset + 100}] \
+ [expr {$x_offset + 15}] [expr {$y_offset + 0}] \
+ -fill {#000000}
+
+ $canvas_widget create text \
+ [expr {$x_offset + 42}] [expr {$y_offset + 102}] \
+ -text {DS1620} \
+ -anchor n \
+ -font [font create -family $::DEFAULT_FIXED_FONT -size -13]
+
+ set i 0
+ for {set x 0} {$x < 2} {incr x} {
+ for {set y 0} {$y < 4} {incr y} {
+ $canvas_widget create rectangle \
+ [expr {$x_offset + ($x * 70) + 0}] [expr {$y_offset + ($y * 25) + 5}] \
+ [expr {$x_offset + ($x * 70) + 15}] [expr {$y_offset + ($y * 25) + 20}] \
+ -fill {#ffffff}
+ $canvas_widget create text \
+ [expr {$x_offset + ($x * 70) + 7}] [expr {$y_offset + ($y * 25) + 13}] \
+ -text [lindex {1 2 3 4 8 7 6 5} $i] \
+ -font $cb_font
+ $canvas_widget create text \
+ [expr {$x_offset + ($x ? 39 : 10) + 7}] [expr {$y_offset + ($y * 25) + 13}] \
+ -text [lindex {DQ CLK RST GND V T T T} $i] \
+ -font $small_font \
+ -anchor w
+ if {$i > 3} {
+ $canvas_widget create text \
+ [expr {$x_offset + 45 + 7}] [expr {$y_offset + ($y * 25) + 18}] \
+ -text [lindex {{} {} {} {} dd high low com} $i] \
+ -font $small_font \
+ -anchor w
+ }
+
+ set line [$canvas_widget create line \
+ [expr {$x_offset + ($x ? 85 : -15)}] [expr {$y_offset + ($y * 25) + 12}] \
+ [expr {$x_offset + ($x ? 100 : 0)}] [expr {$y_offset + ($y * 25) + 12}] \
+ ]
+ if {$i < 3 || $i > 4} {
+ if {$i < 3} {
+ set j $i
+ } else {
+ set j [expr {$i - 2}]
+ }
+ set wires($j) $line
+
+ # GND
+ } elseif {$i == 3} {
+ $canvas_widget itemconfigure $line -fill {#00ff00}
+ $canvas_widget create line \
+ [expr {$x_offset - 15}] [expr {$y_offset + ($y * 25) + 12}] \
+ [expr {$x_offset - 15}] [expr {$y_offset + ($y * 25) + 27}] \
+ [expr {$x_offset - 7}] [expr {$y_offset + ($y * 25) + 27}] \
+ [expr {$x_offset - 23}] [expr {$y_offset + ($y * 25) + 27}] \
+ -fill {#00ff00}
+
+ # Vdd
+ } elseif {$i == 4} {
+ $canvas_widget itemconfigure $line -fill {#ff0000}
+ $canvas_widget create line \
+ [expr {$x_offset + 100}] [expr {$y_offset + ($y * 25) + 12}] \
+ [expr {$x_offset + 100}] [expr {$y_offset + ($y * 25) - 3}] \
+ -fill {#ff0000} -arrow last
+ }
+
+ incr i
+ }
+ }
+
+ $canvas_widget create arc \
+ [expr {$x_offset + 37}] [expr {$y_offset - 5}] \
+ [expr {$x_offset + 47}] [expr {$y_offset + 5}] \
+ -start 0 \
+ -extent -180
+ }
+
+ ## Determinate which port pin is connected to the specified LED
+ # @parm Int i - LED number
+ # @return List - {port_number bit_number}
+ private method which_port_pin {i} {
+ return [list $connection_port($i) $connection_pin($i)]
+ }
+
+ ## Handle "ON/OFF" button press
+ # Turn whole PALE system on or off
+ # @return void
+ public method on_off_button_press {} {
+ $project pale_all_on_off
+ }
+
+ ## Show the log window
+ # The log window must have been once created by method create_log prior to
+ #+ the call to this method
+ # @return void
+ public method show_log {} {
+ if {$warning_indicator != {}} {
+ $canvas_widget delete $warning_indicator
+ set warning_indicator {}
+ }
+
+ set dialog $win.log_window
+ if {[wm state $dialog] == {normal}} {
+ raise $dialog
+ return
+ }
+ if {![winfo exists $dialog]} {
+ return
+ }
+ wm deiconify $dialog
+ if {$log_window_geometry != {}} {
+ wm geometry $dialog $log_window_geometry
+ }
+ }
+
+ ## Create the log dialog window, but do not show it until method show_log is called
+ # @return void
+ public method create_log {} {
+ # Create the dialog window (hidden for now)
+ set dialog $win.log_window
+ toplevel $dialog
+ wm withdraw $dialog
+
+ ## Create main frame (text and scrollbar)
+ set main_frame [frame $dialog.main_frame]
+ # Text widget
+ set text_widget [text $main_frame.text \
+ -width 0 -height 0 -font $hlp_normal_font \
+ -yscrollcommand [list $main_frame.scrollbar set] \
+ -wrap word -padx 5 -pady 5 -state disabled \
+ ]
+ set log_win_text $text_widget
+ bindtags $text_widget [list $text_widget Text $win all .]
+ pack $text_widget -side left -fill both -expand 1
+ # Create text tag in the text widget
+ $text_widget tag configure tag_info -foreground {#FFFFFF} -background {#0000EE}
+ $text_widget tag configure tag_warning -foreground {#FFFFFF} -background {#EE8800}
+ $text_widget tag configure tag_error -foreground {#FFFFFF} -background {#DD0000}
+ $text_widget tag configure tag_line \
+ -background {#DDDDDD} \
+ -font [font create \
+ -family ${::DEFAULT_FIXED_FONT} \
+ -size -1 \
+ ]
+
+ # Scrollbar
+ pack [ttk::scrollbar $main_frame.scrollbar \
+ -orient vertical \
+ -command [list $text_widget yview] \
+ ] -side right -fill y
+ # Finalize ...
+ pack $main_frame -fill both -expand 1 -padx 2
+
+ # Create bottom frame
+ set bottom_frame [frame $dialog.bottom_frame]
+ # Button "Close"
+ pack [ttk::button $bottom_frame.close_button \
+ -text [mc "Close"] \
+ -compound left \
+ -image ::ICONS::16::button_cancel \
+ -command [list $this close_log_win] \
+ ] -side right
+ pack [ttk::button $bottom_frame.clear_button \
+ -text [mc "Clear log"] \
+ -compound left \
+ -image ::ICONS::16::editdelete \
+ -command "
+ $text_widget configure -state normal
+ $text_widget delete 0.0 end
+ $text_widget configure -state disabled
+ " \
+ ] -side left
+ # CheckBox: "Enable log"
+ set log_on_off_chbut [checkbutton $bottom_frame.on_off_chbut \
+ -command [list $this log_on_off] \
+ -text [mc "Enable log"] \
+ ]
+ if {$log_enabled} {
+ $log_on_off_chbut select
+ } else {
+ $log_on_off_chbut deselect
+ }
+ setStatusTip -widget $log_on_off_chbut -text [mc "Disabled logging may notably improve simulation speed"]
+ DynamicHelp::add $log_on_off_chbut -text [mc "Disabled logging may notably improve simulation speed"]
+ pack $log_on_off_chbut -side left -padx 5
+ pack $bottom_frame -pady 2 -padx 5 -fill x
+
+ # Set window parameters
+ wm minsize $dialog [expr {int(300 * $::font_size_factor)}] [expr {int(150 * $::font_size_factor)}]
+ wm iconphoto $dialog ::ICONS::16::bar5
+ wm title $dialog [mc "DS1620 log - MCU 8051 IDE"]
+ wm protocol $dialog WM_DELETE_WINDOW [list $this close_log_win]
+ bindtags $dialog [list $dialog Toplevel $win all .]
+ }
+
+ ## Enable or disable logging of events
+ # @return void
+ public method log_on_off {} {
+ set log_enabled [expr {!$log_enabled}]
+
+ # Set flag modified
+ set_modified
+ }
+
+ ## Close the DS1620 log window
+ # @return void
+ public method close_log_win {} {
+ set dialog $win.log_window
+ if {![winfo exists $dialog]} {
+ return
+ }
+
+ set log_window_geometry [wm geometry $dialog]
+ wm withdraw $dialog
+ }
+
+ ## Informs the DS1620 simulator about change of _no_delays flag (used by configuration menu)
+ # @return void
+ public method no_delays_changed {} {
+ set no_delays ${::Ds1620::_no_delays}
+ }
+
+ ## Write a message to the log
+ # @parm Char type - Message type "I" == Information; "W" == Warning; "E" == Error
+ # @parm String string - Text of the message
+ # @return void
+ private method write_to_log {type string} {
+ # Do not do anything if the log is not available at all
+ if {!$log_enabled || $log_win_text == {}} {
+ return
+ }
+
+ # Enable the text widget
+ $log_win_text configure -state normal
+
+ # Manage the log length, the number of row in the log must not exceed the specified maximum
+ if {int([$log_win_text index end]) > ($MAX_LOG_LENGTH + 1)} {
+ set diff [expr {int([$log_win_text index end]) - $MAX_LOG_LENGTH}]
+ $log_win_text delete 1.0 $diff.0
+ }
+ $log_win_text mark set insert {end -1l lineend}
+
+ # Insert separators (horizontal lines) between events with the same time mark
+ if {$time_mark && $log_time_mark != $time_mark} {
+ set log_time_mark $time_mark
+ $log_win_text insert insert "\n"
+ $log_win_text tag add tag_line insert-1l insert
+ }
+
+ # Insert the information about the message type
+ switch -- $type {
+ {I} { ;# Information
+ $log_win_text insert insert [mc "\[INFO\] "]
+ $log_win_text tag add tag_info {insert linestart} insert-1c
+ }
+ {W} { ;# Warning
+ $log_win_text insert insert [mc "\[WARNING\] "]
+ $log_win_text tag add tag_warning {insert linestart} insert-1c
+ }
+ {E} { ;# Error
+ $log_win_text insert insert [mc "\[ERROR\] "]
+ $log_win_text tag add tag_error {insert linestart} insert-1c
+ }
+ }
+
+ # Insert the message itself
+ $log_win_text insert insert $string
+ $log_win_text insert insert "\n"
+ $log_win_text see insert
+
+ # Disable the text widget
+ $log_win_text configure -state disabled
+
+ #
+ if {$type == {E} && $warning_indicator == {}} {
+ set warning_indicator [$canvas_widget create image 35 105 -anchor ne -image ::ICONS::16::status_unknown]
+ $canvas_widget bind $warning_indicator <Button-1> [list $this show_log]
+ $canvas_widget bind $warning_indicator <Enter> {%W configure -cursor hand2}
+ $canvas_widget bind $warning_indicator <Leave> {%W configure -cursor left_ptr}
+ }
+ }
+
+
+ # ------------------------------------------------------------------
+ # DS1620 INTERNAL FUNCTIONS
+ # ------------------------------------------------------------------
+
+ private method update_outputs_Th_Tl_Tcom {} {
+ set temp_dec $ds1620_reg(TEMP)
+ set th_dec $ds1620_reg(TH)
+ set tl_dec $ds1620_reg(TL)
+
+ if {$temp_dec & 0x100} {
+ incr temp_dec -512
+ }
+ if {$th_dec & 0x100} {
+ incr th_dec -512
+ }
+ if {$tl_dec & 0x100} {
+ incr tl_dec -512
+ }
+
+ if {$temp_dec > $th_dec} {
+ if {!$signal(TH)} {
+ write_to_log I [mc "Current temperature exceeds TH temperature"]
+ }
+
+ set signal(TH) 1
+ set signal(TCOM) 1
+
+ set ds1620_reg(STATUS) [expr {$ds1620_reg(STATUS) | 0x40}]
+ update_reg STATUS
+ } else {
+ set signal(TH) 0
+ }
+ if {$temp_dec < $tl_dec} {
+ if {!$signal(TL)} {
+ write_to_log I [mc "Current temperature is below TL temperature"]
+ }
+
+ set signal(TL) 1
+ set signal(TCOM) 0
+
+ set ds1620_reg(STATUS) [expr {$ds1620_reg(STATUS) | 0x20}]
+ update_reg STATUS
+ } else {
+ set signal(TL) 0
+ }
+ }
+
+ private method finalize_conversion {} {
+ # One-shot conversion mode
+ if {$ds1620_reg(STATUS) & 0x01} {
+ set conversion_running 0
+ }
+
+ if {$temperature < 0} {
+ set ds1620_reg(TEMP) [expr {512 - int($temperature * -2)}]
+ } else {
+ set ds1620_reg(TEMP) [expr {int($temperature * 2)}]
+ }
+ set ds1620_reg(STATUS) [expr {$ds1620_reg(STATUS) | 0x80}]
+ set ds1620_reg(REMAIN) [expr {int(rand() * 0x1ff)}]
+ update_reg TEMP
+ update_reg STATUS
+
+ if {!$no_delays} {
+ write_to_log I [mc "Temperature conversion finished"]
+ }
+ }
+
+ private method proceed_with_t_conversion {} {
+ if {!$t_conversion_time_mark} {
+ restart_t_conversion
+ }
+ if {$no_delays || $t_conversion_time_mark <= $time_mark} {
+ if {!$no_delays} {
+ restart_t_conversion
+ }
+ finalize_conversion
+ }
+ }
+
+ private method restart_t_conversion {} {
+ write_to_log I [mc "Temperature conversion will be completed when MCU time reach %dns" [expr {$time_mark + $T_CONVERSION_TIME_MS * 1000000}]]
+ set t_conversion_time_mark [expr {$time_mark + $T_CONVERSION_TIME_MS * 1000000}]
+ }
+
+ private method transmit_data {} {
+ if {0 && $delay_transmission} {
+ set delay_transmission 0
+ return 0
+ } else {
+ set signal(DQ) [expr {($data_to_send & (1 << $bit_number)) ? 1 : 0}]
+ incr bit_number
+
+ if {$bit_number == $number_of_bits} {
+ set communication_disabled 1
+ set pending_communication 0
+ }
+ return 1
+ }
+ }
+
+ private method receive_data {} {
+ if {!$bit_number} {
+ set byte_received 0
+ }
+ set byte_received [expr {$byte_received | ($signal(DQ) << $bit_number)}]
+ incr bit_number
+
+ if {$receive_command_or_data && $bit_number == 8} {
+ set bit_number 0
+ set command_received $byte_received
+
+ switch -- $command_received {
+ {170} { ;# Read Temperature [AAh]
+ write_to_log I [mc "Received command: Read Temperature \[AAh\] -- sending 9 data bits"]
+ set delay_transmission 1
+ set reception_or_transmission 0
+ set number_of_bits 9
+ set data_to_send $ds1620_reg(TEMP)
+ }
+ {1} { ;# Write TH [01h]
+ write_to_log I [mc "Received command: Write TH \[01h\] -- expecting 9 data bits"]
+ set receive_command_or_data 0
+ set number_of_bits 9
+ }
+ {2} { ;# Write TL [02h]
+ write_to_log I [mc "Received command: Write TL \[02h\] -- expecting 9 data bits"]
+ set receive_command_or_data 0
+ set number_of_bits 9
+ }
+ {161} { ;# Read TH [A1h]
+ write_to_log I [mc "Received command: Read TH \[A1h\] -- sending 9 data bits"]
+ set delay_transmission 1
+ set reception_or_transmission 0
+ set number_of_bits 9
+ set data_to_send $ds1620_reg(TH)
+ }
+ {162} { ;# Read TL [A2h]
+ write_to_log I [mc "Received command: Read TL \[A2h\] -- sending 9 data bits"]
+ set delay_transmission 1
+ set reception_or_transmission 0
+ set number_of_bits 9
+ set data_to_send $ds1620_reg(TL)
+ }
+ {160} { ;# Read Counter [A0h]
+ write_to_log I [mc "Received command: Read Counter \[A0h\] -- sending 9 data bits"]
+ set delay_transmission 1
+ set reception_or_transmission 0
+ set number_of_bits 9
+ set data_to_send $ds1620_reg(REMAIN)
+ }
+ {169} { ;# Read Slope [A9h]
+ write_to_log I [mc "Received command: Read Slope \[A9h\] -- sending 9 data bits"]
+ set delay_transmission 1
+ set reception_or_transmission 0
+ set number_of_bits 9
+ set data_to_send $ds1620_reg(PER_C)
+ }
+ {238} { ;# Start Convert T [EEh]
+ if {$ds1620_reg(STATUS) & 0x01} {
+ if {$conversion_running} {
+ write_to_log I [mc "Received command: Start Convert T \[EEh\] -- Starting T conversion on demand"]
+ } else {
+ write_to_log I [mc "Received command: Start Convert T \[EEh\] -- Restarting T conversion on demand"]
+ }
+ } else {
+ if {$conversion_running} {
+ write_to_log I [mc "Received command: Start Convert T \[EEh\] -- Starting continuous T conversion"]
+ } else {
+ write_to_log I [mc "Received command: Start Convert T \[EEh\] -- Restarting continuous T conversion"]
+ }
+ }
+
+ restart_t_conversion
+
+ set conversion_running 1
+ set communication_disabled 1
+ set pending_communication 0
+ }
+ {34} { ;# Stop Convert T [22h]
+ if {$conversion_running} {
+ if {$ds1620_reg(STATUS) & 0x01} {
+ write_to_log I [mc "Received command: Stop Convert T \[22h\] -- Stopping T conversion which is currently in progress"]
+ } else {
+ write_to_log I [mc "Received command: Stop Convert T \[22h\] -- Stopping continuous T conversion"]
+ }
+ restart_t_conversion
+ } else {
+ write_to_log W [mc "Received command: Stop Convert T \[22h\] -- No T conversion in progress -- command has no effect"]
+ }
+ set conversion_running 0
+ set communication_disabled 1
+ set pending_communication 0
+ }
+ {12} { ;# Write Config [0Ch]
+ write_to_log I [mc "Received command: Write Config \[0Ch\] -- expecting 8 data bits"]
+ set receive_command_or_data 0
+ set number_of_bits 8
+ }
+ {172} { ;# Read Config [ACh]
+ write_to_log I [mc "Received command: Read Config \[ACh\] -- sending 8 data bits"]
+ set delay_transmission 1
+ set reception_or_transmission 0
+ set number_of_bits 8
+ set data_to_send $ds1620_reg(STATUS)
+
+ }
+ default {
+ write_to_log E [mc "Received unknown command: %02Xh" $command_received]
+ }
+ }
+
+ } elseif {!$receive_command_or_data && $bit_number == $number_of_bits} {
+ set communication_disabled 1
+ set pending_communication 0
+
+ write_to_log I [mc "Received data: %03Xh -- finishing command" $byte_received]
+
+ switch -- $command_received {
+ {1} { ;# Write TH [01h]
+ if {$ds1620_reg(STATUS) & 0x10} {
+ write_to_log E [mc "Nonvolatile memory is still busy -- command ignored"]
+ } else {
+ set write_to_NVM [expr {[$project get_run_statistics 0] + $EEPROM_WRITE_CYCLE_TIME * 1000}]
+ set ds1620_reg(TH) $byte_received
+ update_reg TH
+
+ write_to_log I [mc "Commencing write to nonvolatile memory: TH := %02Xh" $byte_received]
+ }
+ }
+ {2} { ;# Write TL [02h]
+ if {$ds1620_reg(STATUS) & 0x10} {
+ write_to_log E [mc "Nonvolatile memory is still busy -- command ignored"]
+ } else {
+ set write_to_NVM [expr {[$project get_run_statistics 0] + $EEPROM_WRITE_CYCLE_TIME * 1000}]
+ set ds1620_reg(TL) $byte_received
+ update_reg TL
+
+ write_to_log I [mc "Commencing write to nonvolatile memory: TL := %02Xh" $byte_received]
+ }
+ }
+ {12} { ;# Write Config [0Ch]
+ if {$ds1620_reg(STATUS) & 0x10} {
+ write_to_log E [mc "Nonvolatile memory is still busy -- command ignored"]
+ } else {
+ set write_to_NVM [expr {[$project get_run_statistics 0] + $EEPROM_WRITE_CYCLE_TIME * 1000}]
+ set ds1620_reg(STATUS) [expr {($ds1620_reg(STATUS) & 0x9C) | ($byte_received & 0x63) | 0x10}]
+ update_reg STATUS
+
+ write_to_log I [mc "Commencing write to nonvolatile memory: STATUS/CONFIG := %02Xh" $byte_received]
+ }
+ }
+ }
+ }
+ }
+
+ private method check_proper_timing {event} {
+ set time_of($event) $time_mark
+ if {$no_delays} {
+ return
+ }
+
+ switch -- $event {
+ {DQ_up} {
+ # Check for valid t_CDH (CLK to Data Hold) >= 40
+ if {($time_mark < ($time_of(CLK_up) + 40)) || ($time_mark < ($time_of(CLK_down) + 40))} {
+ write_to_log E [mc "Bad timing: t_CDH (CLK to Data Hold) too low, must be at least 40ns"]
+ }
+ }
+ {DQ_down} {
+ # Check for valid t_CDH (CLK to Data Hold) >= 40
+ if {($time_mark < ($time_of(CLK_up) + 40)) || ($time_mark < ($time_of(CLK_down) + 40))} {
+ write_to_log E [mc "Bad timing: t_CDH (CLK to Data Hold) too low, must be at least 40ns"]
+ }
+ }
+ {RST_up} {
+ # Check for valid t_CWH (RST Inactive Time) >= 125
+ if {$command_received == 0x01 || $command_received == 0x02 || $command_received == 0x0C} {
+ set min_time [expr {$EEPROM_WRITE_CYCLE_TIME * 1000}]
+ } else {
+ set min_time 125
+ }
+ if {$time_mark < ($time_of(RST_down) + $min_time)} {
+ write_to_log E [mc "Bad timing: t_CWH (RST Inactive Time) too low, must be at least %dns" ${min_time}]
+ }
+ }
+ {RST_down} {
+ if {$signal(RST)} {
+ # Check for valid t_CCH (CLK to RST Hold) >= 40
+ if {$time_mark < ($time_of(CLK_up) + 40)} {
+ write_to_log E [mc "Bad timing: t_CCH (CLK to RST Hold too low, must be at least 40ns"]
+ }
+ }
+ }
+ {CLK_up} {
+ if {$signal(RST)} {
+ # Check for valid t_DC (Data to CLK Setup) >= 35
+ if {($time_mark < ($time_of(DQ_up) + 35)) || $time_mark < ($time_of(DQ_down) + 35)} {
+ write_to_log E [mc "Bad timing: t_DC (Data to CLK Setup) too low, must be at least 35ns"]
+ }
+ # Check for valid t_CL (CLK Low Time) >= 285ns
+ if {$time_mark < ($time_of(CLK_down) + 285)} {
+ write_to_log E [mc "Bad timing: t_CL (CLK Low Time) too low, must be at least 285ns"]
+ }
+ } else {
+ # Check for valid t_CNV (Convert Pulse Width) >= 250ns & <= 500ms
+ if {($time_mark < ($time_of(CLK_down) + 250)) || ($time_mark > ($time_of(CLK_down) + 500000000))} {
+ write_to_log E [mc "Bad timing: t_CNV (Convert Pulse Width) too low or too high, must be at least 250ns and at most 500ms"]
+ }
+
+ }
+ }
+ {CLK_down} {
+ # Check for valid t_CC (RST To CLK Setup) >= 100ns
+ if {$time_mark < ($time_of(RST_up) + 100)} {
+ write_to_log E [mc "Bad timing: t_CC (RST To CLK Setup) too low, must be at least 100ns"]
+ }
+ # Check for valid t_CH (CLK High Time) >= 285ns
+ if {$time_mark < ($time_of(CLK_up) + 285)} {
+ write_to_log E [mc "Bad timing: t_CH (CLK High Time) too low, must be at least 285ns"]
+ }
+ }
+ }
+ }
+
+ private method ds1620_core__evaluate {} {
+ # Continuous conversion mode or One-shot conversion mode
+ if {$conversion_running} {
+ proceed_with_t_conversion
+ # Stand-alone mode
+ } elseif {!($ds1620_reg(STATUS) & 0x02) && !$signal(RST) && !$signal(CLK)} {
+ proceed_with_t_conversion
+ }
+
+ if {$ds1620_reg(STATUS) & 0x10} {
+ if {$no_delays || $write_to_NVM <= $time_mark} {
+ write_to_log I [mc "Write to nonvolatile memory is complete"]
+ set ds1620_reg(STATUS) [expr {$ds1620_reg(STATUS) ^ 0x10}]
+ }
+ }
+
+ # RESET signal is high -- Communicate with MCU
+ if {$signal(RST)} {
+ # Detect raising edge on the DQ signal
+ # ____
+ # /
+ # ____/
+ if {!$signal(DQ_prev) && $signal(DQ)} {
+ check_proper_timing DQ_up
+ # Detect falling edge on the DQ signal
+ # ____
+ # \
+ # \____
+ } elseif {$signal(DQ_prev) && !$signal(DQ)} {
+ check_proper_timing DQ_down
+ }
+
+ # Detect raising edge on the RST signal
+ # ____
+ # /
+ # ____/
+ if {!$signal(RST_prev)} {
+ check_proper_timing RST_up
+ set pending_communication 1
+ write_to_log I [mc "RESET signal was driven high -- commencing communication over 3-wire protocol"]
+ }
+
+ # Detect falling edge on the CLOCK signal - output bit to DQ
+ # ____
+ # \
+ # \____
+ if {$signal(CLK_prev) && !$signal(CLK) && !$reception_or_transmission} {
+ check_proper_timing CLK_down
+ if {$communication_disabled} {
+ write_to_log W [mc "Transmission is no longer relevant"]
+ } else {
+ if {[transmit_data]} {
+ write_to_log I [mc "Transmitting bit #%d = %d" [expr {$bit_number - 1}] $signal(DQ)]
+ }
+ }
+
+ # Detect raising edge on the CLOCK signal - read bit from DQ
+ # ____
+ # /
+ # ____/
+ } elseif {!$signal(CLK_prev) && $signal(CLK) && $reception_or_transmission} {
+ check_proper_timing CLK_up
+ if {$communication_disabled} {
+ write_to_log W [mc "Reception is no longer relevant"]
+ } else {
+ write_to_log I [mc "Receiving bit #%d = %d" $bit_number $signal(DQ)]
+ receive_data
+ }
+ }
+
+ # RESET signal is low -- Terminate all communications and commence stand-alone operation
+ } else {
+ # Detect falling edge on the RST signal
+ # ____
+ # \
+ # \____
+ if {$signal(RST_prev)} {
+ check_proper_timing RST_down
+ write_to_log I [mc "Received RESET signal -- commencing stand-alone operation"]
+ }
+
+ # Detect raising edge on the CLOCK signal
+ # ____
+ # /
+ # ____/
+ if {!$signal(CLK_prev) && $signal(CLK)} {
+ check_proper_timing CLK_up
+ # Detect falling edge on the CLOCK signal - output bit to DQ
+ # ____
+ # \
+ # \____
+ } elseif {$signal(CLK_prev) && !$signal(CLK)} {
+ check_proper_timing CLK_down
+ }
+
+ if {$pending_communication} {
+ set pending_communication 0
+ write_to_log W [mc "Data communication over 3-wire protocol was terminated by RESET signal!"]
+ }
+
+ set bit_number 0
+ set reception_or_transmission 1
+ set receive_command_or_data 1
+ set communication_disabled 0
+ }
+ }
+
+ public method reset_ds1620 {} {
+ set ds1620_reg(TEMP) 392
+ set ds1620_reg(REMAIN) 0
+ set ds1620_reg(STATUS) [expr {($ds1620_reg(STATUS) & 0x03) | 0x88}]
+
+ foreach reg {TH TL TEMP STATUS} {
+ update_reg $reg
+ }
+ }
+
+ # ------------------------------------------------------------------
+ # VIRTUAL HW COMMON INTERFACE
+ # ------------------------------------------------------------------
+
+ ## Simulated MCU has been changed
+ # @return void
+ public method mcu_changed {} {
+ # Refresh lists of possible values in port selection ComboBoxes
+ set available_ports [concat - [$project pale_get_available_ports]]
+
+ for {set i 0} {$i < 6} {incr i} {
+ $canvas_widget.cb_p$i configure -values $available_ports
+
+ if {[lsearch -ascii -exact $available_ports $connection_port($i)] == -1} {
+ $canvas_widget.cb_p$i current 0
+ set connection_port($i) {-}
+ }
+ }
+ }
+
+ ## Accept new state of ports
+ # @parm List state - Port states ( 5 x {8 x bit} -- {bit0 bit1 bit2 ... bit7} )
+ # @return void
+ #
+ # Possible bit values:
+ # '|' - High frequency
+ # 'X' - Access to external memory
+ # '?' - No volatge
+ # '-' - Indeterminable value (some noise)
+ # '=' - High forced to low
+ # '0' - Logical 0
+ # '1' - Logical 1
+ public method new_state {_state} {
+ upvar $_state state
+
+ read_inputs state
+
+ if {!$time_mark} {
+ set signal(CLK_prev) $signal(CLK)
+ set signal(RST_prev) $signal(RST)
+ if {$signal(DQ) != {}} {
+ set signal(DQ_prev) $signal(DQ)
+ }
+ }
+
+ if {$time_mark != [$project get_run_statistics 0]} {
+ set time_mark [$project get_run_statistics 0]
+ if {$input_error} {
+ write_to_log E $input_error_desc
+
+ set input_error 0
+ set input_error_desc {}
+ }
+
+ ds1620_core__evaluate
+ process_outputs state
+
+ set signal(CLK_prev) $signal(CLK)
+ set signal(RST_prev) $signal(RST)
+ if {$signal(DQ) != {}} {
+ set signal(DQ_prev) $signal(DQ)
+ }
+ }
+
+ # Reset last I/O error
+ set input_error 0
+ set input_error_desc {}
+
+ adjust_wire_colors state
+ }
+
+ private method process_outputs {_state} {
+ upvar $_state state
+
+ set lines_to_update [list 3 4 5]
+ if {!$signal(CLK) && $signal(RST)} {
+ lappend lines_to_update 0
+ }
+ foreach i $lines_to_update {
+ # Determinate index in the list of port states
+ set pp [which_port_pin $i]
+
+ # Not connected
+ if {[lindex $pp 0] == {-} || [lindex $pp 1] == {-}} {
+ continue
+ }
+
+ lset state $pp $signal([lindex $SIGNAL_NAMES $i])
+ }
+ }
+
+ private method read_inputs {_state} {
+ upvar $_state state
+
+ foreach i {2 1 0} {
+ # Determinate index in the list of port states
+ set pp [which_port_pin $i]
+
+ # Not connected
+ if {[lindex $pp 0] == {-} || [lindex $pp 1] == {-}} {
+ set signal_value {}
+ } else {
+ set signal_value [lindex $state $pp]
+ }
+
+ # Convert any possible I/O signal value to Boolean value
+ switch -- $signal_value {
+ {0} -
+ {1} {}
+ {=} {
+ set signal_value 0
+ }
+ default {
+ if {($i == 2) || ($i == 1) || ($i == 0 && $signal(RST))} {
+ set input_error 1
+ set input_error_desc [mc \
+ "Received an invalid input on signal %s" \
+ [lindex $SIGNAL_NAMES $i]
+ ]
+ set signal_value [expr {rand() > 0.5 ? 1 : 0}]
+ }
+ }
+ }
+ set signal([lindex $SIGNAL_NAMES $i]) $signal_value
+ }
+ }
+
+ private method adjust_wire_colors {_state} {
+ upvar $_state state
+
+ for {set i 0} {$i < 6} {incr i} {
+ # Determinate index in the list of port states
+ set pp [which_port_pin $i]
+
+ # Not connected
+ if {[lindex $pp 0] == {-} || [lindex $pp 1] == {-}} {
+ $canvas_widget itemconfigure $wires($i) -fill {#000000}
+ continue
+ }
+
+ # Determinate wire and LED color
+ switch -- [lindex $state $pp] {
+ {0} { ;# Logical 0
+ set wire_color {#00FF00}
+ }
+ {1} { ;# Logical 1
+ set wire_color {#FF0000}
+ }
+ {=} { ;# High forced to low
+ set wire_color {#FF00AA}
+ }
+ {} { ;# Not connected
+ set wire_color {#000000}
+ }
+ {?} { ;# No volatge
+ set wire_color {#888888}
+ }
+ default {
+ set wire_color {#FF8800}
+ }
+ }
+
+ $canvas_widget itemconfigure $wires($i) -fill $wire_color
+ }
+ }
+
+ ## Withdraw panel window from the screen
+ # @return void
+ public method withdraw_window {} {
+ wm withdraw $win
+ }
+
+ ## Get panel configuration list (usable with method "set_config")
+ # @return List - configuration list
+ public method get_config {} {
+ return [list \
+ $class_name \
+ [list \
+ [array get connection_port] \
+ [array get connection_pin] \
+ [wm geometry $win] \
+ [$canvas_widget.usr_note get] \
+ $ds1620_reg(TH) \
+ $ds1620_reg(TL) \
+ $no_delays \
+ [wm geometry $win.log_window] \
+ [wm state $win.log_window] \
+ $temperature \
+ [expr {$ds1620_reg(STATUS) & 0x03}] \
+ $log_enabled \
+ $keep_win_on_top \
+ ] \
+ ]
+ }
+
+ ## Set panel configuration from list gained from method "get_config"
+ # @parm List state - Configuration list
+ # @return void
+ public method set_config {state} {
+ if {[catch {
+ # Load connections to the MCU
+ array set connection_port [lindex $state 0]
+ array set connection_pin [lindex $state 1]
+
+ # Restore window geometry
+ if {[string length [lindex $state 2]]} {
+ wm geometry $win [regsub {^\=?\d+x\d+} [lindex $state 2] [join [wm minsize $win] {x}]]
+ }
+
+ # Load user note
+ $canvas_widget.usr_note delete 0
+ $canvas_widget.usr_note insert 0 [lindex $state 3]
+
+ set ds1620_reg(TH) [lindex $state 4]
+ set ds1620_reg(TL) [lindex $state 5]
+
+ set no_delays [lindex $state 6]
+
+ # Display the log window
+ set log_window_geometry [lindex $state 7]
+ if {[lindex $state 8] == {normal}} {
+ show_log
+ }
+
+ set temperature [lindex $state 9]
+ set ds1620_reg(STATUS) [expr {($ds1620_reg(STATUS) & 0xFC) | ([lindex $state 10] & 0x03)}]
+
+ set log_enabled [lindex $state 11]
+ if {$log_enabled} {
+ $log_on_off_chbut select
+ } else {
+ $log_on_off_chbut deselect
+ }
+
+ if {[lindex $state 12] != {}} {
+ set keep_win_on_top [lindex $state 12]
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ }
+ }
+
+ # Restore state of ComboBoxes
+ for {set i 0} {$i < 6} {incr i} {
+ ## PIN
+ set pin $connection_pin($i)
+ if {$pin != {-}} {
+ set pin [expr {7 - $pin}]
+ }
+ set idx [lsearch -ascii -exact \
+ [$canvas_widget.cb_b$i cget -values] \
+ $pin \
+ ]
+ if {$idx == -1} {
+ set idx 0
+ }
+ $canvas_widget.cb_b$i current $idx
+
+ ## PORT
+ set idx [lsearch -ascii -exact \
+ [$canvas_widget.cb_p$i cget -values] \
+ $connection_port($i) \
+ ]
+ if {$idx == -1} {
+ set idx 0
+ }
+ $canvas_widget.cb_p$i current $idx
+ }
+
+ # Adjust internal logic and the rest of PALE
+ foreach reg {TH TL TEMP STATUS} {
+ update_reg $reg
+ }
+ adjust_temp_ind
+ evaluete_enaged_pins
+ $project pale_reevaluate_IO
+ update
+
+ # Fail
+ }]} then {
+ puts "Unable to load configuration for $class_name"
+ return 0
+
+ # Success
+ } else {
+ clear_modified
+ return 1
+ }
+ }
+
+ ## Simulated MCU has been reseted
+ # @return void
+ public method reset {} {
+ set state [$project pale_get_true_state]
+ new_state state
+ }
+
+
+ # ------------------------------------------------------------------
+ # VIRTUAL HW COMMON INTERFACE -- CALLED FROM THE BASE CLASS
+ # ------------------------------------------------------------------
+
+ ## This method is called before configuration menu invocation
+ # @return void
+ public method config_menu_special {} {
+ set ::${class_name}::_no_delays $no_delays
+ set ::${class_name}::menu_keep_win_on_top $keep_win_on_top
+ }
+
+ ## This method is called after configuration menu has beed created
+ # @return void
+ public method create_config_menu_special {} {
+ }
+
+ ## This method is called to fill in the help dialog
+ # @parm Widget text_widget - Target text widget
+ # @return void
+ #
+ # Note: There is defined text tag "tag_bold" in the text widget
+ public method show_help_special {text_widget} {
+ }
+
+ ## This method is called before panel window closure
+ # @return void
+ public method close_window_special {} {
+ }
+
+ ## Commit new on/off state
+ # @return void
+ public method on_off_special {} {
+ if {[$project pale_is_enabled]} {
+ reset_ds1620
+ }
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/pale/file_interface.tcl b/lib/pale/file_interface.tcl
new file mode 100644
index 0000000..58f7293
--- /dev/null
+++ b/lib/pale/file_interface.tcl
@@ -0,0 +1,983 @@
+
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# Copyright (C) 2011 by Martin Ošmera #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _FILE_INTERFACE_TCL ] } {
+set _FILE_INTERFACE_TCL _
+# <<< File inclusion guard
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+# File interface for the PALE subsystem, allow to read files as input for
+# GPIO for simulated MCU and record changes in GPIO to a file
+# -------------------------------------------------------------------------
+
+class PaleFileInterface {
+ inherit VirtualHWComponent
+
+ # Font: Font to be used in the panel -- bold
+ common cb_font [font create \
+ -weight bold \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -family {helvetica} \
+ ]
+ common text_font [font create \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -family ${::DEFAULT_FIXED_FONT} \
+ ]
+ common text_font_bold [font create \
+ -weight bold \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -family ${::DEFAULT_FIXED_FONT} \
+ ]
+
+ common COMPONENT_NAME "VHW File Interface" ;# Name of this component
+ common CLASS_NAME "PaleFileInterface" ;# Name of this class
+ common COMPONENT_ICON {compfile1} ;# Icon for this panel (16x16)
+
+ # Configuration menu
+ common CONFMENU {
+ {command {Sync. files now} {} 1 "sync" {filesave}
+ "Flush output file buffer"}
+ {checkbutton "Keep files synchronized" {} {::PaleFileInterface::_keep_sync}
+ 1 0 0 {keep_sync_changed}
+ ""}
+ {separator}
+ {command {Show help} {} 5 "show_help" {help}
+ "Show brief help"}
+ {separator}
+ {command {Save configuration} {} 0 "save_as" {filesave}
+ "Save configuration into a file"}
+ {command {Load configuration} {} 0 "load_from" {fileopen}
+ "Load configuration from a file"}
+ {separator}
+ {checkbutton "Window always on top" {} {::PaleFileInterface::menu_keep_win_on_top}
+ 1 0 0 {keep_win_on_top_changed}
+ ""}
+ }
+
+ common _keep_sync 0
+
+ private variable connection_port ;# Array of Int: Index is key number, value is port number or {-}
+ private variable connection_pin ;# Array of Int: Index is key number, value is bit number or {-}
+ private variable enaged ;# Array of Bool: enaged(port_num,bit_num) --> Is connected to this device ?
+ private variable keep_win_on_top 0 ;# Bool: Toplevel window
+ private variable cb
+ private variable usr_note
+
+ private variable read_text_widget
+ private variable read_file_entry
+ private variable read_select_file_but
+ private variable read_start_stop_but
+
+ private variable write_file_entry
+ private variable write_select_file_but
+ private variable write_start_stop_but
+ private variable write_trunc_but
+ private variable write_status_lbl
+
+ private variable file_to_read_is_opened 0
+ private variable file_to_write_to_is_opened 0
+
+ private variable file_to_read_channel {}
+ private variable file_to_write_to_channel {}
+
+ private variable current_input {}
+ private variable last_read_line {}
+ private variable last_written_line {}
+
+ private variable keep_sync 0
+ private variable write_counter
+
+
+ # ------------------------------------------------------------------
+ # INTERNAL APPLICATION LOGIC
+ # ------------------------------------------------------------------
+
+ ## Object constructor
+ # @parm Object _project - Project object
+ constructor {_project} {
+ # Configure local ttk styles
+ ttk::style configure PaleFileInterface_FileInUse.TEntry \
+ -fieldbackground {#DDFFDD}
+ ttk::style map PaleFileInterface_FileInUse.TEntry \
+ -fieldbackground [list {readonly !readonly} {#DDFFDD}]
+
+ ttk::style configure PaleFileInterface_FileFound.TEntry \
+ -fieldbackground {#FFFFAA}
+ ttk::style map PaleFileInterface_FileFound.TEntry \
+ -fieldbackground [list {readonly !readonly} {#FFFFAA}]
+
+ ttk::style configure PaleFileInterface_FileNotFound.TEntry \
+ -fieldbackground {#FFDDDD}
+ ttk::style map PaleFileInterface_FileNotFound.TEntry \
+ -fieldbackground [list {readonly !readonly} {#FFDDDD}]
+
+ # Set object variables identifing this component (see the base class)
+ set component_name $COMPONENT_NAME
+ set class_name $CLASS_NAME
+ set component_icon $COMPONENT_ICON
+
+ # Set other object variables
+ set project $_project
+ set radio_buttons 1
+ array set connection_port {0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 -}
+ array set connection_pin {0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 -}
+ for {set port 0} {$port < 5} {incr port} {
+ for {set bit 0} {$bit < 8} {incr bit} {
+ set enaged($port,$bit) 0
+ }
+ }
+
+ # Inform PALE
+ $project pale_register_input_device $this
+ $project pale_set_modified
+
+ # Create panel GUI
+ create_gui
+ mcu_changed
+ on_off [$project pale_is_enabled]
+
+ # ComboBoxes to default state
+ for {set i 0} {$i < 16} {incr i} {
+ $cb(b$i) current 0
+ $cb(p$i) current 0
+ }
+ }
+
+ ## Object destructor
+ destructor {
+ # Inform PALE
+ $project pale_unregister_input_device $this
+
+ # Destroy GUI
+ destroy $win
+ }
+
+ ## Value of configuration menu variable "keep_win_on_top" has been changed
+ # @return void
+ public method keep_win_on_top_changed {} {
+ set keep_win_on_top $PaleFileInterface::menu_keep_win_on_top
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ } else {
+ wm attributes $win -topmost 0 -alpha 1.0
+ }
+ }
+
+ ## Reevaluate array of MCU port pins engaged by this device
+ # @return void
+ private method evaluete_enaged_pins {} {
+ # Mark all as disengaged and infrom PALE
+ for {set port 0} {$port < 5} {incr port} {
+ for {set bit 0} {$bit < 8} {incr bit} {
+ if {$enaged($port,$bit)} {
+ $project pale_disengage_pin_by_input_device $port $bit $this
+ set enaged($port,$bit) 0
+ }
+ }
+ }
+
+ # Find the engaged ones and infrom PALE
+ for {set i 8} {$i < 16} {incr i} {
+ set port $connection_port($i)
+ set bit $connection_pin($i)
+
+ if {$port == {-} || $bit == {-}} {
+ continue
+ }
+
+ set enaged($port,$bit) 1
+ $project pale_engage_pin_by_input_device $port $bit $this
+ }
+ }
+
+ ## Reconnect the specified key to another port pin
+ # @parm Int i - Key number (0..7)
+ # @return void
+ public method reconnect {i} {
+ # Adjust connections
+ set connection_port($i) [$cb(p$i) get]
+ set connection_pin($i) [$cb(b$i) get]
+ if {$connection_pin($i) != {-}} {
+ set connection_pin($i) [expr {7 - $connection_pin($i)}]
+ }
+
+ # Reevaluate array of MCU port pins engaged by this device
+ evaluete_enaged_pins
+
+ # Inform PALE system about the change in order
+ #+ to make immediate change in device states
+ if {$drawing_on} {
+ $project pale_reevaluate_IO
+ }
+
+ # Set flag modified
+ set_modified
+ }
+
+ public method keep_sync_changed {} {
+ set keep_sync ${::PaleFileInterface::_keep_sync}
+ }
+
+ public method sync {} {
+ if {$file_to_write_to_is_opened} {
+ flush $file_to_write_to_channel
+ }
+ }
+
+ ## Create GUI of this panel
+ # @return void
+ private method create_gui {} {
+ #
+ set win [toplevel .pale_file_interface$count -class $component_name -bg ${::COMMON_BG_COLOR}]
+
+
+ set top_frame [frame $win.top_frame]
+ # Create "ON/OFF" button
+ set start_stop_button [ttk::button $top_frame.start_stop_button \
+ -command "$this on_off_button_press" \
+ -style Flat.TButton \
+ -width 3 \
+ ]
+ DynamicHelp::add $start_stop_button -text [mc "Turn HW simulation on/off"]
+ setStatusTip -widget $start_stop_button -text [mc "Turn HW simulation on/off"]
+ bind $start_stop_button <Button-3> "$this on_off_button_press; break"
+ pack $start_stop_button -side left
+ bindtags $start_stop_button [list $start_stop_button TButton all .]
+ # Create configuration menu button
+ set conf_button [ttk::button $top_frame.conf_but \
+ -image ::ICONS::16::configure \
+ -style Flat.TButton \
+ -command "$this config_menu" \
+ ]
+ setStatusTip -widget $conf_button -text [mc "Configure"]
+ pack $conf_button -side left
+ bindtags $conf_button [list $conf_button TButton all .]
+ #
+ pack [label $top_frame.note_lbl -text [mc "Note: "]] -side left
+ set usr_note [ttk::entry $top_frame.usr_note \
+ -validate key \
+ -validatecommand [list $this set_modified] \
+ -width 0 \
+ ]
+ pack $usr_note -side left -fill x -expand 1
+ bindtags $top_frame.usr_note [list $top_frame.usr_note TEntry $win all .]
+
+ set write_labelframe [ttk::labelframe $win.write_labelframe -text [mc "Write"] -padding 5]
+ for {set i 0} {$i < 8} {incr i} {
+ set j $i
+
+ set cb(p$j) [ttk::combobox $write_labelframe.cb_p$i \
+ -width 1 \
+ -font $cb_font \
+ -state readonly \
+ ]
+
+ set cb(b$j) [ttk::combobox $write_labelframe.cb_b$i \
+ -width 1 \
+ -font $cb_font \
+ -values {- 0 1 2 3 4 5 6 7} \
+ -state readonly \
+ ]
+
+ grid $cb(p$j) -row 2 -column [expr {$i + 1}]
+ grid $cb(b$j) -row 3 -column [expr {$i + 1}]
+
+ bind $cb(p$j) <<ComboboxSelected>> [list $this reconnect $i]
+ bind $cb(b$j) <<ComboboxSelected>> [list $this reconnect $i]
+
+ bindtags $cb(p$j) [list $cb(p$j) TCombobox all .]
+ bindtags $cb(b$j) [list $cb(b$j) TCombobox all .]
+ }
+ grid [label $write_labelframe.port_lbl \
+ -text [mc "PORT"] \
+ ] -row 2 -column 0 -sticky w
+ grid [label $write_labelframe.pin_lbl \
+ -text [mc "PIN"] \
+ ] -row 3 -column 0 -sticky w
+ grid [label $write_labelframe.file_lbl \
+ -text [mc "File: "] \
+ ] -row 0 -column 0 -sticky w
+ set write_file_entry [ttk::entry $write_labelframe.entry \
+ -width 0 \
+ -validate key \
+ -validatecommand [list $this vcmd_write_file_entry %P] \
+ ]
+ DynamicHelp::add $write_file_entry -text [mc "Name of output file"]
+ setStatusTip -widget $write_file_entry -text [mc "Name of output file"]
+ bindtags $write_file_entry [list $write_file_entry TEntry $win all .]
+ grid $write_file_entry -row 0 -column 1 -columnspan 5 -sticky we
+ set write_select_file_but [ttk::button $write_labelframe.write_select_file_but \
+ -image ::ICONS::16::fileopen \
+ -style Flat.TButton \
+ -command [list $this write_select_file] \
+ ]
+ DynamicHelp::add $write_select_file_but -text [mc "Select file"]
+ setStatusTip -widget $write_select_file_but -text [mc "Select file"]
+ bindtags $write_select_file_but [list $write_select_file_but TButton all .]
+ grid $write_select_file_but -row 0 -column 6 -sticky we
+ set write_start_stop_but [ttk::button $write_labelframe.start_stop_but \
+ -image ::ICONS::16::player_play \
+ -style Flat.TButton \
+ -command [list $this write_start_stop] \
+ -state disabled \
+ ]
+ DynamicHelp::add $write_start_stop_but -text [mc "Open or close the file"]
+ setStatusTip -widget $write_start_stop_but -text [mc "Open or close the file"]
+ bindtags $write_start_stop_but [list $write_start_stop_but TButton all .]
+ grid $write_start_stop_but -row 0 -column 7 -sticky we
+ set write_trunc_but [ttk::button $write_labelframe.trunc_but \
+ -image ::ICONS::16::editdelete \
+ -style Flat.TButton \
+ -command [list $this write_trunc] \
+ -state disabled \
+ ]
+ DynamicHelp::add $write_trunc_but -text [mc "Truncate the file"]
+ setStatusTip -widget $write_trunc_but -text [mc "Truncate the file"]
+ bindtags $write_trunc_but [list $write_trunc_but TButton all .]
+ grid $write_trunc_but -row 0 -column 8 -sticky we
+ set write_status_lbl [label $write_labelframe.write_status_lbl \
+ -justify right -anchor e \
+ ]
+ grid $write_status_lbl -row 4 -column 0 -columnspan 9 -sticky e
+ grid rowconfigure $write_labelframe 1 -minsize 5
+
+ set read_labelframe [ttk::labelframe $win.read_labelframe -text [mc "Read"] -padding 5]
+ for {set i 0} {$i < 8} {incr i} {
+ set j [expr {$i + 8}]
+
+ set cb(p$j) [ttk::combobox $read_labelframe.cb_p$i \
+ -width 1 \
+ -font $cb_font \
+ -state readonly \
+ ]
+
+ set cb(b$j) [ttk::combobox $read_labelframe.cb_b$i \
+ -width 1 \
+ -font $cb_font \
+ -values {- 0 1 2 3 4 5 6 7} \
+ -state readonly \
+ ]
+
+ grid $cb(p$j) -row 2 -column [expr {$i + 1}]
+ grid $cb(b$j) -row 3 -column [expr {$i + 1}]
+
+ bind $cb(p$j) <<ComboboxSelected>> [list $this reconnect $j]
+ bind $cb(b$j) <<ComboboxSelected>> [list $this reconnect $j]
+
+ bindtags $cb(p$j) [list $cb(p$j) TCombobox all .]
+ bindtags $cb(b$j) [list $cb(b$j) TCombobox all .]
+ }
+ grid [label $read_labelframe.port_lbl \
+ -text [mc "PORT"] \
+ ] -row 2 -column 0 -sticky w
+ grid [label $read_labelframe.pin_lbl \
+ -text [mc "PIN"] \
+ ] -row 3 -column 0 -sticky w
+ set read_text_widget [text $read_labelframe.text \
+ -height 3 \
+ -width 0 \
+ -state disabled \
+ -font $text_font \
+ -tabstyle wordprocessor \
+ -undo 0 \
+ -exportselection 1 \
+ -wrap word \
+ ]
+ $read_text_widget tag configure tag_current_line -font $text_font_bold
+ $read_text_widget tag configure tag_log_0 -foreground {#00FF00}
+ $read_text_widget tag configure tag_log_1 -foreground {#FF0000}
+ $read_text_widget tag configure tag_hfl -foreground {#FF00AA}
+ $read_text_widget tag configure tag_nv -foreground {#888888}
+ $read_text_widget tag configure tag_noice -foreground {#FF8800}
+ DynamicHelp::add $read_text_widget -text [mc "View on the file"]
+ setStatusTip -widget $read_text_widget -text [mc "View on the file"]
+ bindtags $read_text_widget [list $read_text_widget Ttext $win all .]
+ grid $read_text_widget -row 4 -column 0 -columnspan 9 -sticky we
+ grid [label $read_labelframe.file_lbl \
+ -text [mc "File: "] \
+ ] -row 0 -column 0 -sticky w
+ set read_file_entry [ttk::entry $read_labelframe.entry \
+ -width 0 \
+ -validate key \
+ -validatecommand [list $this vcmd_read_file_entry %P] \
+ ]
+ DynamicHelp::add $read_file_entry -text [mc "Name of input file"]
+ setStatusTip -widget $read_file_entry -text [mc "Name of input file"]
+ bindtags $read_file_entry [list $read_file_entry TEntry $win all .]
+ grid $read_file_entry -row 0 -column 1 -columnspan 5 -sticky we
+ set read_select_file_but [ttk::button $read_labelframe.read_select_file_but \
+ -image ::ICONS::16::fileopen \
+ -style Flat.TButton \
+ -command [list $this read_select_file] \
+ ]
+ DynamicHelp::add $read_select_file_but -text [mc "Select file"]
+ setStatusTip -widget $read_select_file_but -text [mc "Select file"]
+ bindtags $read_select_file_but [list $read_select_file_but TButton all .]
+ grid $read_select_file_but -row 0 -column 6 -sticky we
+ set read_start_stop_but [ttk::button $read_labelframe.start_stop_but \
+ -image ::ICONS::16::player_play \
+ -style Flat.TButton \
+ -command [list $this read_start_stop] \
+ -state disabled \
+ ]
+ DynamicHelp::add $read_start_stop_but -text [mc "Open or close the file"]
+ setStatusTip -widget $read_start_stop_but -text [mc "Open or close the file"]
+ bindtags $read_start_stop_but [list $read_start_stop_but TButton all .]
+ grid $read_start_stop_but -row 0 -column 7 -sticky we
+ grid rowconfigure $read_labelframe 1 -minsize 5
+
+
+ pack $read_labelframe -fill x -pady 3 -padx 5 -side right
+ pack $top_frame -fill x -padx 5 -pady 2 -side bottom
+ pack $write_labelframe -fill x -pady 3 -padx 5
+
+ # Set window parameters
+ wm iconphoto $win ::ICONS::16::$component_icon
+ wm title $win "[mc $component_name] - [$project cget -projectName] - MCU 8051 IDE"
+ wm resizable $win 0 0
+ wm protocol $win WM_DELETE_WINDOW "$this close_window"
+ bindtags $win [list $win Toplevel all .]
+ }
+
+ ## Determinate which port pin is connected to the specified key
+ # @parm Int i - Key number
+ # @return List - {port_number bit_number}
+ private method which_port_pin {i} {
+ return [list $connection_port($i) $connection_pin($i)]
+ }
+
+ ## Handle "ON/OFF" button press
+ # Turn whole PALE system on or off
+ # @return void
+ public method on_off_button_press {} {
+ $project pale_all_on_off
+ }
+
+ # ------------------------------------------------------------------
+ # VIRTUAL HW COMMON INTERFACE -- CALLED FROM PALE ENGINE
+ # ------------------------------------------------------------------
+
+ ## Simulated MCU has been changed
+ # @return void
+ public method mcu_changed {} {
+ # Refresh lists of possible values in port selection ComboBoxes
+ set available_ports [concat - [$project pale_get_available_ports]]
+
+ for {set i 0} {$i < 16} {incr i} {
+ $cb(p$i) configure -values $available_ports
+
+ if {[lsearch -ascii -exact $available_ports $connection_port($i)] == -1} {
+ $cb(p$i) current 0
+ set connection_port($i) {-}
+ }
+ }
+ }
+
+ ## Evaluate new state of ports
+ # @parm List state - Port states ( 5 x {8 x bit} -- {bit0 bit1 bit2 ... bit7} )
+ # @return state - New port states modified by this device
+ # format is the same as parameter $state
+ #
+ # Possible bit values:
+ # '|' - High frequency
+ # 'X' - Access to external memory
+ # '?' - No volatge
+ # '-' - Indeterminable value (some noise)
+ # '=' - High forced to low
+ # '0' - Logical 0
+ # '1' - Logical 1
+ public method new_state {_state} {
+ upvar $_state state
+
+ if {$file_to_write_to_is_opened} {
+ set line [list]
+ for {set i 0} {$i < 8} {incr i} {
+ set pp [which_port_pin $i]
+
+ if {[lindex $pp 0] == {-} || [lindex $pp 1] == {-}} {
+ lappend line {-}
+ } else {
+ lappend line [lindex $state $pp]
+ }
+ }
+ if {$last_written_line != $line} {
+ set last_written_line $line
+
+ puts -nonewline $file_to_write_to_channel [$project get_run_statistics 0]
+ puts -nonewline $file_to_write_to_channel "\t"
+ puts $file_to_write_to_channel $line
+ if {$keep_sync} {
+ flush $file_to_write_to_channel
+ }
+ incr write_counter
+ $write_status_lbl configure -text [mc "%d changes recorded" $write_counter]
+ }
+ }
+
+ if {[catch {
+ if {$file_to_read_is_opened} {
+ if {$last_read_line == {}} {
+ set last_read_line [gets $file_to_read_channel]
+ }
+
+ while {![eof $file_to_read_channel]} {
+ if {
+ ($current_input == {})
+ ||
+ ([lindex $last_read_line 0] <= [$project get_run_statistics 0])
+ } then {
+ $read_text_widget configure -state normal
+ $read_text_widget delete 0.0 end
+ $read_text_widget insert 1.0 "\n\n"
+
+ $read_text_widget insert 1.0 $current_input
+ insert_last_read_line
+
+ set current_input $last_read_line
+ set flag 0
+ while {![eof $file_to_read_channel]} {
+ set last_read_line [gets $file_to_read_channel]
+ regsub -all {\s*#.*$} $last_read_line {} last_read_line
+ if {[string length $last_read_line]} {
+ set flag 1
+ break
+ }
+ }
+
+ if {$flag} {
+ $read_text_widget insert 3.0 $last_read_line
+ }
+ $read_text_widget configure -state disabled
+ } else {
+ break
+ }
+ }
+
+ if {[llength $current_input] != 9} {
+ error
+ }
+ for {set i 0} {$i < 0} {incr i} {
+ if {[lsearch -ascii -exact {| X ? - = 0 1} [lindex $current_input $i]] == -1} {
+ error
+ }
+ }
+
+ for {set i 8; set j 1} {$i < 16} {incr i; incr j} {
+ set pp [which_port_pin $i]
+
+ if {[lindex $pp 0] == {-} || [lindex $pp 1] == {-}} {
+ # nothing
+ } else {
+ lset state $pp [lindex $current_input $j]
+ }
+ }
+ }
+ }]} then {
+ tk_messageBox \
+ -parent $win \
+ -icon warning \
+ -title [mc "I/O Error"] \
+ -message [mc "File corrupted:\n\"%s\"." [$read_file_entry get]] \
+ -type ok
+ read_start_stop
+ }
+ }
+
+ private method insert_last_read_line {} {
+ $read_text_widget insert 2.0 $last_read_line
+ $read_text_widget tag add tag_current_line 2.0 3.0
+
+ set j 1
+ set k 0
+ for {set i 8} {$i > 0} {incr i -1} {
+ switch -- [lindex $last_read_line $i] {
+ {0} { ;# Logical 0
+ set tag {tag_log_0}
+ }
+ {1} { ;# Logical 1
+ set tag {tag_log_1}
+ }
+ {=} { ;# High forced to low
+ set tag {tag_hfl}
+ }
+ {?} { ;# No volatge
+ set tag {tag_nv}
+ }
+ default {
+ set tag {tag_noice}
+ }
+ }
+ $read_text_widget tag add $tag [list 2.0 lineend - ${j}c] [list 2.0 lineend - ${k}c]
+
+ incr j 2
+ incr k 2
+ }
+ }
+
+ ## Withdraw panel window from the screen
+ # @return void
+ public method withdraw_window {} {
+ wm withdraw $win
+ }
+
+ ## Get panel configuration list (usable with method "set_config")
+ # @return List - configuration list
+ public method get_config {} {
+ return [list \
+ $class_name \
+ [list \
+ [array get connection_port] \
+ [array get connection_pin] \
+ [wm geometry $win] \
+ [$usr_note get] \
+ [$read_file_entry get] \
+ [$write_file_entry get] \
+ $keep_sync \
+ $keep_win_on_top \
+ ] \
+ ]
+ }
+
+ ## Set panel configuration from list gained from method "get_config"
+ # @parm List state - Configuration list
+ # @return void
+ public method set_config {state} {
+ if {[catch {
+ # Load connections to the MCU
+ array set connection_port [lindex $state 0]
+ array set connection_pin [lindex $state 1]
+
+ # Restore window geometry
+ if {[string length [lindex $state 2]]} {
+ wm geometry $win [regsub {^\=?\d+x\d+} [lindex $state 2] [join [wm size $win] {x}]]
+ }
+
+ # Load user note
+ $usr_note delete 0
+ $usr_note insert 0 [lindex $state 3]
+
+ $read_file_entry delete 0
+ $read_file_entry insert 0 [lindex $state 4]
+
+ $write_file_entry delete 0
+ $write_file_entry insert 0 [lindex $state 5]
+
+ set keep_sync [lindex $state 6]
+
+ if {[lindex $state 7] != {}} {
+ set keep_win_on_top [lindex $state 7]
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ }
+ }
+
+ after 0 [subst {
+ update
+ $read_file_entry xview [$read_file_entry index end]
+ $write_file_entry xview [$write_file_entry index end]
+ }]
+
+ # Restore state of ComboBoxes
+ for {set i 0} {$i < 16} {incr i} {
+ ## PIN
+ set pin $connection_pin($i)
+ if {$pin != {-}} {
+ set pin [expr {7 - $pin}]
+ }
+ set idx [lsearch -ascii -exact \
+ [$cb(b$i) cget -values] \
+ $pin \
+ ]
+ if {$idx == -1} {
+ set idx 0
+ }
+ $cb(b$i) current $idx
+
+ ## PORT
+ set idx [lsearch -ascii -exact \
+ [$cb(p$i) cget -values] \
+ $connection_port($i) \
+ ]
+ if {$idx == -1} {
+ set idx 0
+ }
+ $cb(p$i) current $idx
+ }
+
+ # Adjust internal logic and the rest of PALE
+ evaluete_enaged_pins
+ $project pale_reevaluate_IO
+ update
+
+ # Fail
+ }]} then {
+ puts "Unable to load configuration for $class_name"
+ return 0
+
+ # Success
+ } else {
+ clear_modified
+ return 1
+ }
+ }
+
+ ## Simulated MCU has been reseted
+ # @return void
+ public method reset {} {
+ set state [$project pale_get_true_state]
+ new_state state
+ }
+
+ public method read_select_file {{filename {}}} {
+ if {$filename != {}} {
+ $read_file_entry delete 0 end
+ $read_file_entry insert 0 [lindex $filename 1]
+
+ after 0 [subst {
+ update
+ $read_file_entry xview [$read_file_entry index end]
+ }]
+ } else {
+ select_file [mc "Select file for reading"] [$read_file_entry get] read_select_file
+ }
+ }
+
+ public method write_select_file {{filename {}}} {
+ if {$filename != {}} {
+ set filename [lindex $filename 1]
+ if {[file extension $filename] == {}} {
+ append filename {.gpio}
+ }
+ $write_file_entry delete 0 end
+ $write_file_entry insert 0 $filename
+ after 0 [subst {
+ update
+ $write_file_entry xview [$write_file_entry index end]
+ }]
+ } else {
+ select_file [mc "Select file for writing"] [$write_file_entry get] write_select_file
+ }
+ }
+
+ private method select_file {title initialfile cmd} {
+ if {$initialfile == {}} {
+ set directory [$project cget -projectPath]
+ } else {
+ set directory [file dirname $initialfile]
+ }
+
+ catch {delete object ::fsd}
+ KIFSD::FSD ::fsd \
+ -title $title \
+ -directory $directory \
+ -defaultmask 0 \
+ -multiple 0 \
+ -initialfile $initialfile \
+ -master $win \
+ -filetypes [list \
+ [list [mc "General Purpose Input Output"] {*.gpio}] \
+ [list [mc "All files"] {*}] \
+ ]
+
+ ::fsd setokcmd "$this $cmd \[list 1 \[::fsd get\]\]"
+ ::fsd activate
+ }
+
+ public method write_start_stop {{truncate 0}} {
+ # Stop
+ if {$file_to_write_to_is_opened} {
+ if {[catch {
+ close $file_to_write_to_channel
+ }]} then {
+ tk_messageBox \
+ -parent $win \
+ -icon warning \
+ -title [mc "I/O Error"] \
+ -message [mc "Unknown error occurred while closing file:\n\"%s\"." [$write_file_entry get]] \
+ -type ok
+ }
+ set last_written_line {}
+ set file_to_write_to_is_opened 0
+ $write_start_stop_but configure -image ::ICONS::16::player_play
+ $write_trunc_but configure -state disabled
+ $write_select_file_but configure -state normal
+ $write_file_entry configure -state normal
+ $write_file_entry configure -style PaleFileInterface_FileFound.TEntry
+ $write_status_lbl configure -text {}
+ set write_counter 0
+ # Start
+ } else {
+ if {[catch {
+ if {$truncate} {
+ set mode {w}
+ } else {
+ set mode {a}
+ }
+ set file_to_write_to_channel [open [$write_file_entry get] $mode]
+ }]} then {
+ tk_messageBox \
+ -parent $win \
+ -icon warning \
+ -title [mc "Unable to open file"] \
+ -message [mc "Unable to open file:\n\"%s\" for writing, please check your permissions." [$write_file_entry get]] \
+ -type ok
+ } else {
+ set file_to_write_to_is_opened 1
+ $write_start_stop_but configure -image ::ICONS::16::_player_pause
+ $write_trunc_but configure -state normal
+ $write_select_file_but configure -state disabled
+ $write_file_entry configure -state readonly
+ $write_file_entry configure -style PaleFileInterface_FileInUse.TEntry
+ }
+ }
+ }
+ public method write_trunc {} {
+ if {!$file_to_write_to_is_opened} {
+ return
+ }
+
+ write_start_stop
+ write_start_stop 1
+ }
+ public method read_start_stop {} {
+ # Stop
+ if {$file_to_read_is_opened} {
+ if {[catch {
+ close $file_to_read_channel
+ }]} then {
+ tk_messageBox \
+ -parent $win \
+ -icon warning \
+ -title [mc "I/O Error"] \
+ -message [mc "Unknown error occurred while closing file:\n\"%s\"." [$read_file_entry get]] \
+ -type ok
+ }
+ set file_to_read_is_opened 0
+ $read_start_stop_but configure -image ::ICONS::16::player_play
+ $read_select_file_but configure -state normal
+ $read_file_entry configure -state normal
+ $read_file_entry configure -style PaleFileInterface_FileFound.TEntry
+
+ $read_text_widget configure -state normal
+ $read_text_widget delete 0.0 end
+ $read_text_widget configure -state disabled
+ # Start
+ } else {
+ if {[catch {
+ set file_to_read_channel [open [$read_file_entry get] {r}]
+ }]} then {
+ tk_messageBox \
+ -parent $win \
+ -icon warning \
+ -title [mc "Unable to open file"] \
+ -message [mc "Unable to open file:\n\"%s\" for reading, please check your permissions." [$read_file_entry get]] \
+ -type ok
+ } else {
+ set file_to_read_is_opened 1
+ $read_start_stop_but configure -image ::ICONS::16::_player_pause
+ $read_select_file_but configure -state disabled
+ $read_file_entry configure -state readonly
+ $read_file_entry configure -style PaleFileInterface_FileInUse.TEntry
+ }
+ }
+ }
+ public method vcmd_read_file_entry {filename} {
+ if {![string length $filename]} {
+ $read_file_entry configure -style TEntry
+ $read_start_stop_but configure -state disabled
+ } elseif {[file exists $filename] && [file isfile $filename] && [file readable $filename]} {
+ if {!$file_to_read_is_opened} {
+ $read_file_entry configure -style PaleFileInterface_FileFound.TEntry
+ } else {
+ $read_file_entry configure -style PaleFileInterface_FileInUse.TEntry
+ }
+ $read_start_stop_but configure -state normal
+ } else {
+ $read_file_entry configure -style PaleFileInterface_FileNotFound.TEntry
+ $read_start_stop_but configure -state disabled
+ }
+
+ return 1
+ }
+ public method vcmd_write_file_entry {filename} {
+ if {![string length $filename]} {
+ $write_file_entry configure -style TEntry
+ $write_start_stop_but configure -state disabled
+ } elseif {[file exists $filename] && [file isfile $filename] && [file readable $filename]} {
+ if {!$file_to_write_to_is_opened} {
+ $write_file_entry configure -style PaleFileInterface_FileFound.TEntry
+ } else {
+ $write_file_entry configure -style PaleFileInterface_FileInUse.TEntry
+ }
+ $write_start_stop_but configure -state normal
+ } else {
+ $write_file_entry configure -style PaleFileInterface_FileNotFound.TEntry
+ $write_start_stop_but configure -state normal
+ }
+
+ return 1
+ }
+
+ # ------------------------------------------------------------------
+ # VIRTUAL HW COMMON INTERFACE -- CALLED FROM THE BASE CLASS
+ # ------------------------------------------------------------------
+
+ ## This method is called before configuration menu invocation
+ # @return void
+ public method config_menu_special {} {
+ set ::${class_name}::_keep_sync $keep_sync
+ set ::${class_name}::menu_keep_win_on_top $keep_win_on_top
+ }
+
+ ## This method is called after configuration menu has beed created
+ # @return void
+ public method create_config_menu_special {} {
+ }
+
+ ## This method is called to fill in the help dialog
+ # @parm Widget text_widget - Target text widget
+ # @return void
+ #
+ # Note: There is defined text tag "tag_bold" in the text widget
+ public method show_help_special {text_widget} {
+ }
+
+ ## This method is called before panel window closure
+ # @return void
+ public method close_window_special {} {
+ }
+
+ ## Commit new on/off state
+ # @return void
+ public method on_off_special {} {
+ set state [$project pale_get_true_state]
+ new_state state
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/pale/hd44780_cgrom.tcl b/lib/pale/hd44780_cgrom.tcl
new file mode 100644
index 0000000..0ce00c7
--- /dev/null
+++ b/lib/pale/hd44780_cgrom.tcl
@@ -0,0 +1,1624 @@
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+
+############################################################################
+# Copyright (C) 2011 by Martin Ošmera and Monika Říhová (so far) #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# ------------------------------------------------------------------------------
+#
+# This file contains font definitions for HD44780 display driver simulator,
+# which is a part of MCU 8051 IDE project.
+#
+# ------------------------------------------------------------------------------
+#
+# Format:
+# { <-- Start all font definitions
+# n × { <-- Start one font definitions
+# 240 × { <-- Start of one character definition (addr: [0x10,0xff])
+# 10 × { <-- Start of one row on the character patter (starting from the top)
+# 5 × {0|1} <-- Dots in the patter (0 == blank; 1 == filled)
+# } <-- End of one row on the character patter
+# } <-- End of one character definition
+# } <-- End one font definitions
+# } <-- End all font definitions
+#
+# ------------------------------------------------------------------------------
+#
+# An example of a character definition:
+#
+# { PATTERN: CHARACTER:
+# {1 1 1 1 0} | # # # #
+# {1 0 0 0 1} | # #
+# {1 0 0 0 1} | # #
+# {1 1 1 1 0} | # # # #
+# {1 0 0 0 1} | # #
+# {1 0 0 0 1} | # #
+# {1 1 1 1 0} | # # # #
+# {0 0 0 0 0} |
+# {0 0 0 0 0} |
+# {0 0 0 0 0} |
+# }
+#
+# ------------------------------------------------------------------------------
+
+common CGROM {
+{
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 1 0} {0 1 0 1 0} {0 1 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 1 0} {0 1 0 1 0} {1 1 1 1 1} {0 1 0 1 0} {1 1 1 1 1}
+ {0 1 0 1 0} {0 1 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 1 1 1} {1 0 1 0 0} {0 1 1 1 0} {0 0 1 0 1}
+ {1 1 1 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 0 0 0} {1 1 0 0 1} {0 0 0 1 0} {0 0 1 0 0} {0 1 0 0 0}
+ {1 0 0 1 1} {0 0 0 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 0 0} {1 0 0 1 0} {1 0 1 0 0} {0 1 0 0 0} {1 0 1 0 1}
+ {1 0 0 1 0} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 0 0} {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 1 0} {0 0 1 0 0} {0 1 0 0 0} {0 1 0 0 0} {0 1 0 0 0}
+ {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 1 0} {0 0 0 1 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {1 0 1 0 1} {0 1 1 1 0} {1 0 1 0 1}
+ {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 1 0 0} {1 1 1 1 1} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 0 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 1 1 0 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 1} {0 0 0 1 0} {0 0 1 0 0} {0 1 0 0 0}
+ {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 1 1 1 0} {1 0 0 0 1} {1 0 0 1 1} {1 0 1 0 1} {1 1 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {1 0 0 0 1} {0 0 0 0 1} {0 0 0 1 0} {0 0 1 0 0}
+ {0 1 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 1} {0 0 0 1 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 1 0} {0 1 0 1 0} {1 0 0 1 0} {1 1 1 1 1}
+ {0 0 0 1 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 1} {1 0 0 0 0} {1 1 1 1 0} {0 0 0 0 1} {0 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 1 0} {0 1 0 0 0} {1 0 0 0 0} {1 1 1 1 0} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 1} {1 0 0 0 1} {0 0 0 0 1} {0 0 0 1 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 1}
+ {0 0 0 1 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 0 0} {0 1 1 0 0} {0 0 0 0 0} {0 1 1 0 0}
+ {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 0 0} {0 1 1 0 0} {0 0 0 0 0} {0 1 1 0 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {0 1 0 0 0} {1 0 0 0 0} {0 1 0 0 0}
+ {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {1 1 1 1 1}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 1} {0 0 0 1 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {1 0 0 0 1} {0 0 0 0 1} {0 0 0 1 0} {0 0 1 0 0}
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 1 1 1 0} {1 0 0 0 1} {0 0 0 0 1} {0 1 1 0 1} {1 0 1 0 1}
+ {1 0 1 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 0} {1 0 0 0 1}
+ {1 0 0 0 1} {1 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 0 0} {1 0 0 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 1 0} {1 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 1} {1 0 0 0 0} {1 0 0 0 0} {1 1 1 1 0} {1 0 0 0 0}
+ {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 1} {1 0 0 0 0} {1 0 0 0 0} {1 1 1 1 0} {1 0 0 0 0}
+ {1 0 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 0} {1 0 1 1 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 1 1} {0 0 0 1 0} {0 0 0 1 0} {0 0 0 1 0} {0 0 0 1 0}
+ {1 0 0 1 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 1} {1 0 0 1 0} {1 0 1 0 0} {1 1 0 0 0} {1 0 1 0 0}
+ {1 0 0 1 0} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0}
+ {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 1} {1 1 0 1 1} {1 0 1 0 1} {1 0 1 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 1} {1 0 0 0 1} {1 1 0 0 1} {1 0 1 0 1} {1 0 0 1 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {1 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 0} {1 0 0 0 0}
+ {1 0 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 1 0 1}
+ {1 0 0 1 0} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 0} {1 0 1 0 0}
+ {1 0 0 1 0} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 1} {1 0 0 0 0} {1 0 0 0 0} {0 1 1 1 0} {0 0 0 0 1}
+ {0 0 0 0 1} {1 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 1} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {0 1 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 1 0 1} {1 0 1 0 1}
+ {1 0 1 0 1} {0 1 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 0 1 0} {0 0 1 0 0} {0 1 0 1 0}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 1 0 1 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 1} {0 0 0 0 1} {0 0 0 1 0} {0 0 1 0 0} {0 1 0 0 0}
+ {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 0 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0}
+ {1 0 0 0 0} {1 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 1} {0 1 0 1 0} {1 1 1 1 1} {0 0 1 0 0} {1 1 1 1 1}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 1 1} {0 0 0 0 1} {0 0 0 0 1} {0 0 0 0 1} {0 0 0 0 1}
+ {0 0 0 0 1} {0 0 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 1} {0 1 1 1 1}
+ {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 0} {1 0 0 0 0} {1 0 1 1 0} {1 1 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 0} {1 0 0 0 0}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 1} {0 0 0 0 1} {0 1 1 0 1} {1 0 0 1 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 1 1 1 1}
+ {1 0 0 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 1 0} {0 1 0 0 1} {0 1 0 0 0} {1 1 1 0 0} {0 1 0 0 0}
+ {0 1 0 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 1}
+ {0 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {1 0 0 0 0} {1 0 0 0 0} {1 0 1 1 0} {1 1 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 0 0 0 0} {0 1 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 0 0 0} {0 0 1 1 0} {0 0 0 1 0} {0 0 0 1 0}
+ {1 0 0 1 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 0} {1 0 0 0 0} {1 0 0 1 0} {1 0 1 0 0} {1 1 0 0 0}
+ {1 0 1 0 0} {1 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 0 1 0} {1 0 1 0 1} {1 0 1 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 1 1 0} {1 1 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 0} {1 0 0 0 1} {1 1 1 1 0}
+ {1 0 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 0 1} {1 0 0 1 1} {0 1 1 1 1}
+ {0 0 0 0 1} {0 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 1 1 0} {1 1 0 0 1} {1 0 0 0 0}
+ {1 0 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 0} {0 1 1 1 0}
+ {0 0 0 0 1} {1 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 1 0 0 0} {1 1 1 0 0} {0 1 0 0 0} {0 1 0 0 0}
+ {0 1 0 0 1} {0 0 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 1 1} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {0 1 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 1 0 1} {1 0 1 0 1}
+ {1 0 1 0 1} {0 1 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {0 1 0 1 0} {0 0 1 0 0}
+ {0 1 0 1 0} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 1}
+ {0 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 1 0} {0 0 1 0 0}
+ {0 1 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 1 0 0} {0 1 0 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {1 1 1 1 1} {0 0 0 1 0}
+ {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 0 0 0} {1 1 1 1 1} {0 1 0 0 0}
+ {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0}
+ {0 1 0 1 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 1 1} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {1 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 0}
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 0 0} {0 1 1 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 1} {1 1 1 1 1} {0 0 0 0 1}
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 1 0} {0 0 1 0 0} {0 1 1 0 0}
+ {1 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 1} {0 0 1 1 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 1 0 0} {1 1 1 1 1} {1 0 0 0 1}
+ {0 0 0 0 1} {0 0 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 1 0} {1 1 1 1 1} {0 0 1 1 0}
+ {0 1 0 1 0} {1 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 0 0 0} {1 1 1 1 1} {0 1 0 0 1}
+ {0 1 0 1 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 0 1 0}
+ {0 0 0 1 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 0} {0 0 0 1 0} {1 1 1 1 0}
+ {0 0 0 1 0} {1 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 0 1 0 1} {1 0 1 0 1}
+ {0 0 0 0 1} {0 0 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 1} {0 0 0 0 1} {0 0 1 0 1} {0 0 1 1 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 1} {0 0 0 1 0} {0 0 1 0 0} {0 1 1 0 0} {1 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 1}
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {1 1 1 1 1} {0 0 0 1 0} {0 0 1 1 0} {0 1 0 1 0}
+ {1 0 0 1 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {1 1 1 1 1} {0 1 0 0 1} {0 1 0 0 1} {0 1 0 0 1}
+ {0 1 0 0 1} {1 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {1 1 1 1 1} {0 0 1 0 0} {1 1 1 1 1} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 1 1 1 1} {0 1 0 0 1} {1 0 0 0 1} {0 0 0 0 1}
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 1 1 1 1} {1 0 0 1 0} {0 0 0 1 0} {0 0 0 1 0}
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 1} {0 0 0 0 1} {0 0 0 0 1} {0 0 0 0 1} {0 0 0 0 1}
+ {0 0 0 0 1} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 1 0} {1 1 1 1 1} {0 1 0 1 0} {0 1 0 1 0} {0 0 0 1 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 0 0 0} {0 0 0 0 1} {1 1 0 0 1} {0 0 0 0 1}
+ {0 0 0 1 0} {1 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 1} {0 0 0 1 0} {0 0 1 0 0}
+ {0 1 0 1 0} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {1 1 1 1 1} {0 1 0 0 1} {0 1 0 1 0} {0 1 0 0 0}
+ {0 1 0 0 0} {0 0 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {0 1 0 0 1} {0 0 0 0 1}
+ {0 0 0 1 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 1 1 1 1} {0 1 0 0 1} {1 0 1 0 1} {0 0 0 1 1}
+ {0 0 0 1 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {1 1 1 0 0} {0 0 1 0 0} {1 1 1 1 1} {0 0 1 0 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 1 0 1} {1 0 1 0 1} {1 0 1 0 1} {0 0 0 0 1}
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 1 0 0 0} {0 1 0 0 0} {0 1 1 0 0} {0 1 0 1 0}
+ {0 1 0 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 0 1 0 0} {1 1 1 1 1} {0 0 1 0 0} {0 0 1 0 0}
+ {0 1 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 1} {0 1 0 1 0} {0 0 1 0 0}
+ {0 1 0 1 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 1 0 0} {1 1 1 1 1} {0 0 0 1 0} {0 0 1 0 0} {0 1 1 1 0}
+ {1 0 1 0 1} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 0 1 0} {0 0 0 1 0} {0 0 0 1 0} {0 0 0 1 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 1 0 0 0} {1 1 1 1 1} {0 1 0 0 0} {0 1 0 0 0}
+ {0 1 0 0 0} {0 0 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 1} {0 0 0 0 1} {0 0 0 0 1}
+ {0 0 0 1 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 0 0} {1 0 1 0 0} {0 0 0 1 0} {0 0 0 1 0}
+ {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {1 1 1 1 1} {0 0 1 0 0} {0 0 1 0 0} {1 0 1 0 1}
+ {1 0 1 0 1} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 1} {0 0 0 0 1} {0 1 0 1 0}
+ {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 0}
+ {0 1 1 1 0} {0 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 0 0 0} {1 0 0 0 0} {1 0 0 0 1}
+ {1 1 1 1 1} {0 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 1} {0 0 0 0 1} {0 1 0 1 0} {0 0 1 0 0}
+ {0 1 0 1 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 1 0 0 0} {1 1 1 1 1} {0 1 0 0 0}
+ {0 1 0 0 0} {0 0 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 1 0 0 0} {1 1 1 1 1} {0 1 0 0 1} {0 1 0 1 0}
+ {0 1 0 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {0 0 0 1 0} {0 0 0 1 0} {0 0 0 1 0}
+ {0 0 0 1 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 1} {1 1 1 1 1} {0 0 0 0 1}
+ {0 0 0 0 1} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 1} {0 0 0 0 1}
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {1 0 0 1 0} {1 0 0 1 0} {1 0 0 1 0} {1 0 0 1 0} {0 0 0 1 0}
+ {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {1 0 1 0 0} {1 0 1 0 0} {1 0 1 0 1}
+ {1 0 1 0 1} {1 0 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 1} {1 0 0 1 0}
+ {1 0 1 0 0} {1 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 1}
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 1} {0 0 0 0 1}
+ {0 0 0 1 0} {1 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {1 0 0 1 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 0 0} {1 0 1 0 0} {1 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 0 0 1} {1 0 1 0 1} {1 0 0 1 0}
+ {1 0 0 1 0} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 1} {0 1 1 1 1}
+ {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 1 1 1 0}
+ {1 0 0 0 1} {1 1 1 1 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 0} {0 1 1 0 0}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 1 1} {1 1 1 0 1} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 1} {1 0 1 0 0} {1 0 0 1 0}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 1 1 0} {0 1 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 1 1 1 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 1} {0 0 0 0 1} {0 1 1 1 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 1 1 1} {0 0 1 0 0} {0 0 1 0 0}
+ {1 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 1 0} {1 1 0 1 0} {0 0 0 1 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 0 0 0} {0 0 1 1 0} {0 0 0 1 0} {0 0 0 1 0}
+ {0 0 0 1 0} {0 0 0 1 0} {0 0 0 1 0} {1 0 0 1 0} {0 1 1 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 1 0} {0 0 1 0 0} {0 1 0 1 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 1 1 0} {1 0 1 0 0} {1 0 1 0 1}
+ {0 1 1 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 1 0 0 0} {1 1 1 0 0} {0 1 0 0 0} {1 1 1 0 0}
+ {0 1 0 0 0} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {0 0 0 0 0} {1 0 1 1 0} {1 1 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 1 1 0} {1 1 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 1 1 1 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 0 1} {1 0 0 1 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 1} {0 0 0 0 1} {0 0 0 0 1}
+ } {
+ {0 1 1 1 0} {1 0 0 0 1} {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1}
+ {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 0 1 1} {1 0 1 0 1}
+ {1 1 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1}
+ {0 1 0 1 0} {1 1 0 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 1 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 1 1} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 1} {1 0 0 0 0} {0 1 0 0 0} {0 0 1 0 0} {0 1 0 0 0}
+ {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 1 0 1 0} {0 1 0 1 0}
+ {0 1 0 1 0} {1 0 0 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {1 1 1 1 1} {0 0 0 0 0} {1 0 0 0 1} {0 1 0 1 0} {0 0 1 0 0}
+ {0 1 0 1 0} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 1} {0 0 0 0 1} {0 1 1 1 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 1} {1 1 1 1 0} {0 0 1 0 0} {1 1 1 1 1}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 1 0 0 0} {0 1 1 1 1}
+ {0 1 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {1 0 1 0 1} {1 1 1 1 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0}
+ {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 1 1} {1 1 1 1 1} {1 1 1 1 1} {1 1 1 1 1} {1 1 1 1 1}
+ {1 1 1 1 1} {1 1 1 1 1} {1 1 1 1 1} {1 1 1 1 1} {1 1 1 1 1}
+ }
+} {
+} {
+ {
+ {0 0 0 0 0} {0 1 0 0 0} {0 1 1 0 0} {0 1 1 1 0} {0 1 1 1 1}
+ {0 1 1 1 0} {0 1 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 1 0} {0 0 1 1 0} {0 1 1 1 0} {1 1 1 1 0}
+ {0 1 1 1 0} {0 0 1 1 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 0 1} {1 0 0 1 0} {1 1 0 1 1} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 0 1 1} {0 1 0 0 1} {1 0 0 1 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 1 1 0} {1 1 1 1 1} {0 0 0 0 0}
+ {0 0 1 0 0} {0 1 1 1 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 1 1 1 0} {0 0 1 0 0} {0 0 0 0 0}
+ {1 1 1 1 1} {0 1 1 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 1 1 1 1} {1 1 1 1 1}
+ {1 1 1 1 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 1} {0 0 0 0 1} {0 0 1 0 1} {0 1 0 0 1}
+ {1 1 1 1 1} {0 1 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 1 1 0} {1 0 1 0 1} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {1 0 1 0 1} {0 1 1 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {1 1 1 1 1}
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 1 0 0} {0 1 0 0 0} {1 1 1 1 1}
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 1 0} {0 0 1 0 0} {0 1 0 0 0} {0 0 1 0 0}
+ {0 0 0 1 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 1 0 0}
+ {0 1 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0}
+ {0 1 1 1 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 1 1 1 0} {0 1 1 1 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 1 0} {0 1 0 1 0} {0 1 0 1 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 1 0} {0 1 0 1 0} {1 1 1 1 1} {0 1 0 1 0}
+ {1 1 1 1 1} {0 1 0 1 0} {0 1 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 1 1 1} {1 0 1 0 0} {0 1 1 1 0}
+ {0 0 1 0 1} {1 1 1 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 0 0 0} {1 1 0 0 1} {0 0 0 1 0} {0 0 1 0 0}
+ {0 1 0 0 0} {1 0 0 1 1} {0 0 0 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 0 0} {1 0 0 1 0} {1 0 1 0 0} {0 1 0 0 0}
+ {1 0 1 0 1} {1 0 0 1 0} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 0 0} {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 0 1 0} {0 0 1 0 0} {0 1 0 0 0} {0 1 0 0 0}
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 1 0}
+ {0 0 0 1 0} {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 1 0 0} {1 0 1 0 1} {0 1 1 1 0}
+ {1 0 1 0 1} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 1 0 0} {0 0 1 0 0} {1 1 1 1 1}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 1 1 0 0} {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 1 1 0 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 1} {0 0 0 1 0} {0 0 1 0 0}
+ {0 1 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 1 1} {1 0 1 0 1}
+ {1 1 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {0 0 0 0 1} {0 0 0 1 0}
+ {0 0 1 0 0} {0 1 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 0 1 0} {0 0 1 0 0} {0 0 0 1 0}
+ {0 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 1 0} {0 0 1 1 0} {0 1 0 1 0} {1 0 0 1 0}
+ {1 1 1 1 1} {0 0 0 1 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 0} {1 1 1 1 0} {0 0 0 0 1}
+ {0 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 1 0} {0 1 0 0 0} {1 0 0 0 0} {1 1 1 1 0}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 1} {0 0 0 0 1} {0 0 0 1 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 1}
+ {0 0 0 0 1} {0 0 0 1 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 0 0} {0 1 1 0 0} {0 0 0 0 0}
+ {0 1 1 0 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 0 0} {0 1 1 0 0} {0 0 0 0 0}
+ {0 1 1 0 0} {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 1 0} {0 0 1 0 0} {0 1 0 0 0} {1 0 0 0 0}
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0}
+ {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 1}
+ {0 0 0 1 0} {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {0 0 0 0 1} {0 0 0 1 0}
+ {0 0 1 0 0} {0 0 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {0 0 0 0 1} {0 1 1 0 1}
+ {1 0 1 0 1} {1 0 1 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 0}
+ {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 0} {1 0 0 0 0}
+ {1 0 0 0 0} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 0 0} {1 0 0 1 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 1 0} {1 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 0} {1 0 0 0 0} {1 1 1 1 0}
+ {1 0 0 0 0} {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 0} {1 0 0 0 0} {1 1 1 1 0}
+ {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 0} {1 0 1 1 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 1}
+ {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 1 1} {0 0 0 1 0} {0 0 0 1 0} {0 0 0 1 0}
+ {0 0 0 1 0} {1 0 0 1 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 1 0} {1 0 1 0 0} {1 1 0 0 0}
+ {1 0 1 0 0} {1 0 0 1 0} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0}
+ {1 0 0 0 0} {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 1 0 1 1} {1 0 1 0 1} {1 0 1 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 1 0 0 1} {1 0 1 0 1}
+ {1 0 0 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {1 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 0}
+ {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 1 0 1} {1 0 0 1 0} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 0}
+ {1 0 1 0 0} {1 0 0 1 0} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 1} {1 0 0 0 0} {1 0 0 0 0} {0 1 1 1 0}
+ {0 0 0 0 1} {0 0 0 0 1} {1 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 1 0 1}
+ {1 0 1 0 1} {1 0 1 0 1} {0 1 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {0 1 0 1 0} {0 0 1 0 0}
+ {0 1 0 1 0} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 1 0 1 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 1} {0 0 0 1 0} {0 0 1 0 0}
+ {0 1 0 0 0} {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 0 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0}
+ {1 0 0 0 0} {1 0 0 0 0} {1 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {0 1 0 1 0} {1 1 1 1 1} {0 0 1 0 0}
+ {1 1 1 1 1} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 1 1} {0 0 0 0 1} {0 0 0 0 1} {0 0 0 0 1}
+ {0 0 0 0 1} {0 0 0 0 1} {0 0 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 0 1 0} {1 0 0 0 1} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 1 0 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 1}
+ {0 1 1 1 1} {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 1 1 0} {1 1 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 0}
+ {1 0 0 0 0} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 1} {0 0 0 0 1} {0 1 1 0 1} {1 0 0 1 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 1 0} {0 1 0 0 1} {0 1 0 0 0} {1 1 1 0 0}
+ {0 1 0 0 0} {0 1 0 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1}
+ {0 1 1 1 1} {0 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 1 1 0} {1 1 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 1 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 1 1 0} {0 0 0 1 0}
+ {0 0 0 1 0} {1 0 0 1 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 1 0} {1 0 1 0 0}
+ {1 1 0 0 0} {1 0 1 0 0} {1 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 1 0 1 0} {1 0 1 0 1}
+ {1 0 1 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 0 1 1 0} {1 1 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 0} {1 0 0 0 1}
+ {1 1 1 1 0} {1 0 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 0 1} {1 0 0 1 1}
+ {0 1 1 1 1} {0 0 0 0 1} {0 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 0 1 1 0} {1 1 0 0 1}
+ {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 0}
+ {0 1 1 1 0} {0 0 0 0 1} {1 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 0 0} {0 1 0 0 0} {1 1 1 0 0} {0 1 0 0 0}
+ {0 1 0 0 0} {0 1 0 0 1} {0 0 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 1 1} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 1 0 1}
+ {1 0 1 0 1} {1 0 1 0 1} {0 1 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {0 1 0 1 0}
+ {0 0 1 0 0} {0 1 0 1 0} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1}
+ {0 1 1 1 1} {0 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 1 0}
+ {0 0 1 0 0} {0 1 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 1 0} {0 0 1 0 0} {0 0 1 0 0} {0 1 0 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 1 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ {0 1 1 0 1} {1 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 0 1 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 0} {1 1 1 1 0}
+ {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 1} {0 0 1 0 1} {0 0 1 0 1} {0 1 0 0 1} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 1 0 1} {1 0 1 0 1} {1 0 1 0 1} {0 1 1 1 0}
+ {1 0 1 0 1} {1 0 1 0 1} {1 0 1 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 0} {0 0 0 0 1} {0 0 0 0 1} {0 0 1 1 0}
+ {0 0 0 0 1} {0 0 0 0 1} {1 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 1 1} {1 0 1 0 1}
+ {1 1 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 1 0} {0 0 1 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 1 1}
+ {1 0 1 0 1} {1 1 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 1} {0 0 1 0 1} {0 0 1 0 1} {0 0 1 0 1}
+ {0 0 1 0 1} {1 0 1 0 1} {0 1 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 1 0 1 0}
+ {0 0 1 0 0} {0 1 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 1 1 1 1} {0 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 1}
+ {0 0 0 0 1} {0 0 0 0 1} {0 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 1 0 1} {1 0 1 0 1} {1 0 1 0 1}
+ {1 0 1 0 1} {1 0 1 0 1} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 1 0 1} {1 0 1 0 1} {1 0 1 0 1} {1 0 1 0 1}
+ {1 0 1 0 1} {1 1 1 1 1} {0 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 0 0 0} {0 1 0 0 0} {0 1 0 0 0} {0 1 1 1 0}
+ {0 1 0 0 1} {0 1 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 1 0 0 1}
+ {1 0 1 0 1} {1 0 1 0 1} {1 1 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {0 0 1 0 1} {0 1 0 1 1}
+ {0 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 0 0 1} {1 0 1 0 1}
+ {1 0 0 1 0} {1 0 0 1 0} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 1 1 0} {0 0 1 0 1} {0 0 1 0 1}
+ {0 0 1 0 0} {1 1 1 0 0} {1 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 0} {1 0 0 0 0}
+ {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 1 0 1 0}
+ {0 1 0 1 0} {0 1 0 1 0} {1 0 0 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 0} {0 1 0 0 0} {0 0 1 0 0}
+ {0 1 0 0 0} {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 1} {1 0 0 1 0}
+ {1 0 0 1 0} {1 0 0 1 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 1 0} {0 0 1 0 1} {0 0 1 1 1} {0 0 1 0 1} {0 0 1 0 1}
+ {1 1 1 0 1} {1 1 0 1 1} {0 0 0 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 1} {0 1 1 1 0} {1 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 1 1 1 0} {0 1 1 1 0}
+ {1 1 1 1 1} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 1 1 1 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {0 1 0 1 0} {1 1 0 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 1 0} {0 1 0 0 1} {0 0 1 0 0} {0 1 0 1 0}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 0 1 1} {1 0 1 0 1}
+ {1 1 0 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 0 1 0} {1 1 1 1 1} {1 1 1 1 1}
+ {1 1 1 1 1} {0 1 1 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 0}
+ {0 1 1 0 0} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {1 1 0 1 1} {1 1 0 1 1} {1 1 0 1 1} {1 1 0 1 1}
+ {1 1 0 1 1} {1 1 0 1 1} {1 1 0 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 1 1 0} {1 0 1 0 0} {1 0 1 0 0}
+ {1 0 1 0 1} {0 1 1 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 1 0} {0 1 0 0 0} {0 1 0 0 0} {1 1 1 0 0}
+ {0 1 0 0 0} {0 1 0 0 1} {1 0 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {0 1 1 1 0} {0 1 0 1 0}
+ {0 1 1 1 0} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {0 1 0 1 0} {1 1 1 1 1} {0 0 1 0 0}
+ {1 1 1 1 1} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 1 0} {0 1 0 0 1} {0 0 1 0 0} {0 1 0 1 0}
+ {0 0 1 0 0} {1 0 0 1 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 0 1 0} {0 0 1 0 1} {0 0 1 0 0} {1 1 1 1 1}
+ {0 0 1 0 0} {1 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 1} {1 0 1 0 1} {1 0 1 1 1}
+ {1 0 1 0 1} {1 0 0 0 1} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 1} {0 1 1 1 1} {1 0 0 0 1}
+ {0 1 1 1 1} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 1} {0 1 0 1 0} {1 0 1 0 0} {0 1 0 1 0}
+ {0 0 1 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 1 0} {1 0 1 0 1} {1 0 1 0 1} {1 1 1 0 1}
+ {1 0 1 0 1} {1 0 1 0 1} {1 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 1}
+ {0 0 1 0 1} {0 1 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 1} {1 0 1 0 1} {1 0 0 0 1}
+ {1 0 0 1 1} {1 0 1 0 1} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 0 0 0} {0 1 1 0 0} {0 0 0 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 1 1 0 0} {1 0 0 1 0} {1 0 0 1 0} {1 0 0 1 0} {0 1 1 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 1 0 0} {1 1 1 1 1} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 0 0} {1 0 0 1 0} {0 0 1 0 0} {0 1 0 0 0} {1 1 1 1 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 0 0} {0 0 0 1 0} {0 1 1 0 0} {0 0 0 1 0} {1 1 1 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 1 0 0} {1 0 0 1 0} {1 1 1 0 0} {1 0 0 0 0} {1 0 0 1 0}
+ {1 0 1 1 1} {1 0 0 1 0} {0 0 0 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 1 1}
+ {1 1 1 0 1} {1 0 0 0 0} {1 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 1} {1 0 0 1 1} {1 0 0 1 1} {0 1 1 1 1}
+ {0 0 0 1 1} {0 0 0 1 1} {0 0 0 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 1 0 0}
+ {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 1 0 1 0} {1 0 0 0 1}
+ {1 0 1 0 1} {1 0 1 0 1} {0 1 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {1 1 0 0 0} {0 1 0 0 0} {0 1 0 0 0} {1 1 1 0 0}
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {0 1 1 1 0} {0 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 1 0 0} {0 1 0 1 0} {0 0 1 0 1}
+ {0 1 0 1 0} {1 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 1} {1 0 0 1 0} {1 0 1 0 0} {0 1 0 1 0} {1 0 1 1 0}
+ {0 1 0 1 0} {0 1 1 1 1} {0 0 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 0 0 0 1} {1 0 0 1 0} {1 0 1 0 0} {0 1 0 1 0} {1 0 1 0 1}
+ {0 0 0 0 1} {0 0 0 1 0} {0 0 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 0 0 0} {0 1 0 0 0} {1 1 0 0 0} {0 1 0 0 1} {1 1 0 1 1}
+ {0 0 1 0 1} {0 0 1 1 1} {0 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 1 0 0} {0 1 0 0 0}
+ {1 0 0 0 0} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 1 0 1 0} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 1 0 0} {0 1 0 1 0} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 0 1} {1 0 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 1 0} {0 0 0 0 0} {0 0 1 0 0} {0 1 0 1 0} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {0 0 1 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 1 1} {0 1 1 0 0} {1 0 1 0 0} {1 0 1 1 1}
+ {1 1 1 0 0} {1 0 1 0 0} {1 0 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 0} {1 0 0 0 0} {1 0 0 0 1}
+ {0 1 1 1 0} {0 0 0 1 0} {0 0 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 0}
+ {1 1 1 1 0} {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 0}
+ {1 1 1 1 0} {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 0}
+ {1 1 1 1 0} {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 1 0} {0 0 0 0 0} {1 1 1 1 1} {1 0 0 0 0}
+ {1 1 1 1 0} {1 0 0 0 0} {1 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {0 1 1 1 0} {0 1 0 0 1} {0 1 0 0 1} {1 1 1 0 1}
+ {0 1 0 0 1} {0 1 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 0 1} {1 0 0 1 0} {0 0 0 0 0} {1 0 0 0 1} {1 1 0 0 1}
+ {1 0 1 0 1} {1 0 0 1 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 0 1 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 0 1} {1 0 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 0 0 0 1} {0 1 0 1 0} {0 0 1 0 0}
+ {0 1 0 1 0} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 1 1 1 0} {0 0 1 0 0} {0 1 1 1 0} {1 0 1 0 1} {0 1 1 1 0}
+ {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 0 1 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 1 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {1 0 0 0 1} {0 1 0 1 0} {0 0 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {1 1 0 0 0} {0 1 0 0 0} {0 1 1 1 0} {0 1 0 0 1} {0 1 0 0 1}
+ {0 1 1 1 0} {0 1 0 0 0} {1 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 1 0} {0 1 0 0 1} {0 1 0 0 1} {0 1 1 1 0}
+ {0 1 0 0 1} {0 1 0 0 1} {1 0 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 1}
+ {0 1 1 1 1} {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 1}
+ {0 1 1 1 1} {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 0 1} {1 0 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 1}
+ {0 1 1 1 1} {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 1}
+ {0 1 1 1 1} {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {0 0 0 0 1}
+ {0 1 1 1 1} {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 1}
+ {0 1 1 1 1} {1 0 0 0 1} {0 1 1 1 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {1 1 0 1 0} {0 0 1 0 1} {0 1 1 1 1}
+ {1 0 1 0 0} {1 0 1 0 1} {0 1 0 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 0} {1 0 0 0 1}
+ {0 1 1 1 0} {0 0 1 0 0} {0 1 1 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 1 1 1 1} {1 0 0 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 1 0 0} {0 1 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 1 0 0} {0 1 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 0 1 0 0} {0 1 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 0 1 0 0} {0 1 1 0 0}
+ {0 0 1 0 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+
+
+ {
+ {0 0 0 0 0} {1 0 1 0 0} {0 1 0 0 0} {1 0 1 0 0} {0 0 0 1 0}
+ {0 1 1 1 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 1 0 1} {1 0 0 1 0} {0 0 0 0 0} {1 0 1 1 0} {1 1 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {1 0 0 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 1 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 0 1} {1 0 0 1 0} {0 0 0 0 0} {0 1 1 1 0}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 1 0} {0 0 0 0 0} {0 1 1 1 0} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {1 1 1 1 1}
+ {0 0 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+ {
+ {0 0 0 0 0} {0 0 0 1 0} {0 0 1 0 0} {0 1 1 1 0} {1 0 1 0 1}
+ {0 1 1 1 0} {0 0 1 0 0} {0 1 0 0 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 1 0 0 0} {0 0 1 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 1 1} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 1 0} {0 0 1 0 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 1 1} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 1 0 0} {0 1 0 1 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 1 1} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 1 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1}
+ {1 0 0 0 1} {1 0 0 1 1} {0 1 1 0 1} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 0 0 1 0} {0 0 1 0 0} {1 0 0 0 1} {1 0 0 0 1}
+ {0 1 1 1 1} {0 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 1 0 0} {0 0 1 0 0} {0 0 1 1 0} {0 0 1 0 1}
+ {0 0 1 1 0} {0 0 1 0 0} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ } {
+ {0 0 0 0 0} {0 1 0 1 0} {0 0 0 0 0} {1 0 0 0 1} {1 0 0 0 1}
+ {0 1 1 1 1} {0 0 0 0 1} {0 1 1 1 0} {0 0 0 0 0} {0 0 0 0 0}
+ }
+}
+
+}
diff --git a/lib/pale/lcd_hd44780.tcl b/lib/pale/lcd_hd44780.tcl
new file mode 100644
index 0000000..58484b5
--- /dev/null
+++ b/lib/pale/lcd_hd44780.tcl
@@ -0,0 +1,2954 @@
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# 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 #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# --------------------------------------------------------------------------
+# Thanks to Trevor Spiteri <trevor.spiteri@um.edu.mt> there are 2 bugs less:
+#
+# - [PATCH 1/2] Fix 4-bit instructions for HD44780
+# - [PATCH 2/2] Start 2nd row at 0x40 not at 40 for HD44780
+# --------------------------------------------------------------------------
+
+# >>> File inclusion guard
+if { ! [ info exists _LCD_HD44780_TCL ] } {
+set _LCD_HD44780_TCL _
+# <<< File inclusion guard
+
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+#
+# Simulator of LCD character display controlled by HD44780.
+# --------------------------------------------------------------------------
+
+class LcdHD44780 {
+ inherit VirtualHWComponent
+
+ common COMPONENT_NAME "LCD display" ;# Name of this component
+ common CLASS_NAME "LcdHD44780" ;# Name of this class
+ common COMPONENT_ICON {hd44780} ;# Icon for this panel (16x16)
+
+ # Configuration menu
+ common CONFMENU {
+ {cascade "Set font" 0 "hd44780" .set_rom_code false 1 {
+ {radiobutton "ROM code A00" {}
+ ::LcdHD44780::font_id {0}
+ "font_changed" 3 ""}
+ {radiobutton "ROM code A02" {}
+ ::LcdHD44780::font_id {2}
+ "font_changed" 3 ""}
+ }}
+ {cascade "Set character size" 0 "hd44780" .set_char_size false 1 {
+ {radiobutton "5 × 8" {}
+ ::LcdHD44780::char_size {0}
+ "char_size_changed" 5 ""}
+ {radiobutton "5 × 10" {}
+ ::LcdHD44780::char_size {1}
+ "char_size_changed" 5 ""}
+ }}
+ {separator}
+ {checkbutton "Disable delays" {} {::LcdHD44780::_no_delays}
+ 1 0 0 {no_delays_changed}
+ ""}
+ {checkbutton "Ignore errors" {} {::LcdHD44780::_ignore_errors}
+ 1 0 0 {ignore_errors_changed}
+ ""}
+ {separator}
+ {command {Show HD44780 log} {} 5 "show_log" {bar5}
+ "Display the log of events which are currently happening in the simulated HD44780 chip"}
+ {command {Show CGROM} {} 5 "show_cgrom" {kcmmemory}
+ "Display content of HD44780 Character Generator ROM"}
+ {command {Show CGRAM} {} 5 "show_cgram" {kcmmemory}
+ "Display content of HD44780 Character Generator RAM"}
+ {command {Show DDRAM} {} 5 "show_ddram" {kcmmemory}
+ "Display content of HD44780 Display data RAM"}
+ {separator}
+ {command {Reset HD44780} {} 6 "reset_hd44780" {rebuild}
+ "Reinitialize the simulated HD44780, but do not affect DDRAM and CGRAM"}
+ {command {Clear DDRAM & CGRAM} {} 6 "clear_xxRAM" {editdelete}
+ "Clear the entire Display Data RAM and Character Generator RAM"}
+ {separator}
+ {command {Show help} {} 5 "show_help 1" {help}
+ "Show brief help"}
+ {separator}
+ {command {Save configuration} {} 0 "save_as" {filesave}
+ "Save configuration into a file"}
+ {command {Load configuration} {} 0 "load_from" {fileopen}
+ "Load configuration from a file"}
+ {separator}
+ {checkbutton "Window always on top" {} {::LcdHD44780::menu_keep_win_on_top}
+ 1 0 0 {keep_win_on_top_changed}
+ ""}
+ }
+
+ # Font: Font to be used in the panel -- bold
+ common common_font [font create \
+ -weight bold \
+ -size [expr {int(-10 * ($::font_size_factor > 1.2 ? 1.2 : $font_size_factor))}] \
+ -family {helvetica} \
+ ]
+ # Font: Font to be used in the panel -- bold, underline
+ common common_font_u [font create \
+ -weight bold \
+ -size [expr {int(-10 * ($::font_size_factor > 1.2 ? 1.2 : $font_size_factor))}] \
+ -family {helvetica} \
+ -underline 1 \
+ ]
+
+ common ON_COLOR {#000000} ;# RGB: Color for darken pixels
+ common OFF_COLOR {#DDDDDD} ;# RGB: Color for blank pixels
+ common USER_DEF_COLOR {#AAAAFF} ;# RGB: Color used in CGROM table for user defined characters
+
+ # List: Names of IO signals of the simulated LCD display controller
+ common SIGNAL_NAMES [list {RS} {R/W} {E} {D7} {D6} {D5} {D4} {D3} {D2} {D1} {D0}]
+
+ # List: Keys for the array (status_led) of status LEDs
+ common STATUS_LEDS_NAMES [list {B} {S} {D} {C} {N} {F} {ID} {DL} {OMN} {BF}]
+
+ # List: Labels displayed beside of the status LEDs
+ common STATUS_LEDS_TEXTS [list {B} {S} {D} {C} {N} {F} {I/D} {DL} {OMN} {BF}]
+
+ # List: Help texts for the labels of the status LEDs
+ common STATUS_LEDS_HELPTEXTS [list \
+ [mc "Cursor blinking"] \
+ [mc "Accompanies display shift"] \
+ [mc "Display ON/OFF"] \
+ [mc "Cursor ON/OFF"] \
+ [mc "2 lines display / 1 line display"] \
+ [mc "5 × 10 dots / 5 × 8 dots"] \
+ [mc "Increment AC / Decrement AC"] \
+ [mc "8-bit data transfer / 4-bit data transfer"] \
+ [mc "One More Nibble to transfer / data transfer complete"] \
+ [mc "Internally operating / Instructions acceptable"] \
+ ]
+ common MAX_LOG_LENGTH 100 ;# Int: Maximum number of row in the log window
+ common CURSOR_BLINK_FREQUENCY 3 ;# Int: Frequency (in Hz) of cursor blinking
+
+ # Values used by the configuration menu
+ common _no_delays 0 ;# Bool: Disable delays (simulated execution times)
+ common _ignore_errors 0 ;# Bool: Do not display special error message dialog in cases when an error occurs
+ common font_id 0 ;# Int: Font ID to be used for addressing the CGROM
+ common char_size 0 ;# Bool: Character height from the HW point of view, 0 == 5x8; 1==5x10
+
+ # Load CGROM
+ source "${::LIB_DIRNAME}/pale/hd44780_cgrom.tcl"
+
+ private variable conf_color {red} ;# Color: Selected color for LED's
+ private variable keep_win_on_top 0 ;# Bool: Toplevel window
+ private variable connection_port ;# Array of Int: Index is key number, value is port number or {-}
+ private variable connection_pin ;# Array of Int: Index is key number, value is bit number or {-}
+ private variable enaged ;# Array of Bool: enaged(port_num,bit_num) --> Is connected to this device ?
+
+ private variable ddram_hexeditor {} ;# Object: Hexadecimal editor for editing content of DDRAM
+ private variable cgram_hexeditor {} ;# Object: Hexadecimal editor for editing content of CGRAM
+
+ private variable ddram_window_params {0 {}} ;# List: Parameters of DDRAM hex. editor window, format: {IS_VISIBLE GEOMETRY}
+ private variable cgram_window_params {0 {}} ;# List: Parameters of CGRAM hex. editor window, format: {IS_VISIBLE GEOMETRY}
+
+ private variable display_width ;# Int: LCD dot matrix width in number of characters which it is able to display on one line
+ private variable display_height ;# Int: LCD dot matrix height in number of text rows, it can be 1 one 2
+ private variable win_minwidth ;# Int: Minimum allowed width of the main window of this LCD display simulator in number of pixels
+
+ private variable input_error 0 ;# Bool: I/O error has occurred
+ private variable input_error_desc {} ;# String: Description of the last I/O error
+
+ private variable es_but_left_right ;# Widget: Button "Show/Hide right part of the window"
+ private variable es_but_up_down ;# Widget: Button "Show/Hide bottom part of the window"
+ private variable visible_lr 1 ;# Bool: Is the right part of the window currently visible
+ private variable visible_ud 1 ;# Bool: Is the bottom part of the window currently visible
+
+ private variable log_win_text {} ;# Widget: Text widget fro the log of events
+ private variable ignore_errors 0 ;# Bool: Do not display special error message dialog in cases when an error occurs
+ private variable time_mark 0 ;# Int: Time mark pointing to this point of time according to the MCU simulator engine
+ private variable log_time_mark 0 ;# Int: Time mark used to separate events in the log which happened during the same evaluation iteration
+ private variable no_delays 0 ;# Bool: Disable delays (simulated execution times)
+ private variable log_enabled 1 ;# Bool: Logging of events enabled (slower simulation)
+ private variable log_on_off_chbut ;# Widget: Checkbox for enabling and disabling the logging of events
+
+ private variable disp_frame ;# Widget: The black frame around the LCD dot matrix
+ private variable signal_label ;# Array of canvas objects: Labels above ComboBoxes for GPIO signal selection
+ private variable lcd_pixel ;# Array of canvas objects: Segments of LCD dot matrix
+ private variable cgram_pixel ;# Array of canvas objects: Same as lcd_pixel but for CGRAM
+ private variable entrybox ;# Array of Widgets: Entryboxes showing HD44780 registers, key is name of the register diaplyed the CGRAM viewer
+ private variable status_led ;# Array of Widgets: LEDs showing status of HD44780 flags like: S, F, D, B, etc.
+ private variable inhibit_vcmd 1 ;# Bool: Disable validation function for entryboxes like "IR:" or "AC:"
+
+ private variable ddram ;# Array: Display Data RAM
+ private variable cgram ;# List: Character Generator RAM, format: { 8× (char) { 8× (row) { 5× (column) {0|1} } } }
+ private variable inst_reg ;# Int: Instruction register (IR) as specified in the HD44780 manual
+ private variable data_reg ;# Int: Data register (DR) as specified in the HD44780 manual
+ private variable time_of_completion 0 ;# Int: Time (according to the MCU simulator engine) when the current operation will be finished
+ private variable address_counter 0 ;# Int: Address Counter (AC) as specified in the HD44780 manual, interval [0;0x7F]
+ private variable address_counter_old 0 ;# Int: The same as AC, but this one might contain an outdated information (incr./decr. delay)
+ private variable cursor_address 0 ;# Int: Current address (not position) of the cursor, interval [0;0x7F]
+ private variable cursor_timer {} ;# Timer: Timer for LCD cursor blinking
+ private variable return_value -1 ;# Int: Result of an READ operation, this value is supposed to be send to the data bus
+ private variable display_shift 0 ;# Int: Current display shift, this value suppose to be added to the AC, interval [0;0x7F]
+ private variable signal_E_prev 0 ;# Bool: Signal Enable, value from the last VHW evaluation iteration before this one
+ private variable signal_E 0 ;# Bool: Signal Enable
+ private variable signal_RS 0 ;# Bool: Signal Register Select
+ private variable signal_RW 0 ;# Bool: Signal Read/Write
+ private variable signal_D 0 ;# int: Value taken from the data bus
+
+ ## Array of HD44780 configuration flags
+ # KEY MEANING WHEN 0 MEANING WHEN 1
+ # --- ------------ ------------
+ # ID 0 == Decrement 1 == Increment
+ # S 0 == (Normal) 1 == Accompanies display shift
+ # D 0 == Display OFF 1 == Display ON
+ # C 0 == Cursor OFF 1 == Cursor ON
+ # B 0 == Cursor blinking OFF 1 == Cursor blinking ON
+ # DL 0 == 4-bit data transfer 1 == 8-bit data transfer
+ # N 0 == 1 line display 1 == 2 lines display
+ # F 0 == 5 × 8 dots 1 == 5 × 10 dots
+ # BF 0 == Instructions acceptable 1 == Internally operating
+ # OMN 0 == Transfer completed 1 == One More Nibble to transfer
+ # B_pre backup for ``B'' used by method clear_cursor in order to ensure correct erase of the cursor
+ # F_pre backup for ``F'' used by method clear_cursor in order to ensure correct erase of the cursor
+ private variable diver_cfg
+
+ private variable rom_code 0 ;# Int: Font ID, this is used for addressing the CGROM
+ private variable lcd_char_size 0 ;# Bool: Character height from the HW point of view, 0 == 5x8; 1==5x10
+
+ # ------------------------------------------------------------------
+ # GUI RELATED FUNCTIONS AND SO ON
+ # ------------------------------------------------------------------
+
+ ## Object constructor
+ # @parm Object _project - Project object
+ constructor {_project} {
+ # Set object variables identifing this component (see the base class)
+ set component_name $COMPONENT_NAME
+ set class_name $CLASS_NAME
+ set component_icon $COMPONENT_ICON
+
+ # Reset the array of MCU GPIO lines engaged by this device, for internal purposes only
+ for {set port 0} {$port < 5} {incr port} {
+ for {set bit 0} {$bit < 8} {incr bit} {
+ set enaged($port,$bit) 0
+ }
+ }
+
+ # Initialize array of HD44780 configuration flags
+ array set diver_cfg {
+ ID 1 S 0 D 0
+ C 0 B 0 DL 1
+ N 0 F 0 BF 0
+ OMN 0 B_pre 0 F_pre 0
+ }
+
+ # Set other object variables
+ set project $_project
+
+ # Inform PALE
+ $project pale_register_input_device $this
+ $project pale_set_modified
+ }
+
+ ## Object destructor
+ destructor {
+ # Inform PALE
+ $project pale_unregister_input_device $this
+
+ # Dispose the timer for cursor blinking
+ catch {
+ after cancel $cursor_timer
+ }
+
+ # Destroy GUI
+ if {[winfo exists $win]} {
+ destroy $win
+ }
+ }
+
+ ## Value of configuration menu variable "keep_win_on_top" has been changed
+ # @return void
+ public method keep_win_on_top_changed {} {
+ set keep_win_on_top $LcdHD44780::menu_keep_win_on_top
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ } else {
+ wm attributes $win -topmost 0 -alpha 1.0
+ }
+ }
+
+ ## Reevaluate array of MCU port pins engaged by this device
+ # @return void
+ private method evaluete_enaged_pins {} {
+ # Mark all as disengaged and infrom PALE
+ for {set port 0} {$port < 5} {incr port} {
+ for {set bit 0} {$bit < 8} {incr bit} {
+ if {$enaged($port,$bit)} {
+ $project pale_disengage_pin_by_input_device $port $bit $this
+ set enaged($port,$bit) 0
+ }
+ }
+ }
+
+ # Find the engaged ones and infrom PALE
+ for {set i 3} {$i < 11} {incr i} {
+ set port $connection_port($i)
+ set bit $connection_pin($i)
+
+ if {$port == {-} || $bit == {-}} {
+ continue
+ }
+
+ set enaged($port,$bit) 1
+ $project pale_engage_pin_by_input_device $port $bit $this
+ }
+ }
+
+ ## Reconnect the specified key to another port pin
+ # @parm Int i - Connection wire number ({0..3} => Row; {4..7} => Column)
+ # @return void
+ public method reconnect {i} {
+ # Adjust connections
+ set connection_port($i) [$canvas_widget.cb_p$i get]
+ set connection_pin($i) [$canvas_widget.cb_b$i get]
+ if {$connection_pin($i) != {-}} {
+ set connection_pin($i) [expr {7 - $connection_pin($i)}]
+ }
+
+ # Reevaluate array of MCU port pins engaged by this device
+ evaluete_enaged_pins
+
+ # Inform PALE system about the change in order
+ #+ to make immediate change in device states
+ if {$drawing_on} {
+ $project pale_reevaluate_IO
+ }
+
+ # Set flag modified
+ set_modified
+ }
+
+ ## Create GUI of this panel
+ # @return void
+ private method create_gui {} {
+ # Create panel window and canvas widget
+ set win [toplevel .lcd_display$count -class $component_name -bg ${::COMMON_BG_COLOR}]
+
+ # Create the canvas widget which contains everything else visible in the window
+ set canvas_widget [canvas $win.canvas \
+ -bg {#FFFFFF} \
+ -width 0 \
+ -height 0 \
+ -highlightthickness 0 \
+ ]
+
+ # Draw LEDs showing status of HD44780 flags like: S, F, D, B, etc.
+ draw_status_leds
+
+ # Draw the LCD dot matrix
+ draw_display
+
+ # Create ComboBoxes for specifying the connections between this device and the MCU simulator
+ draw_comboboxes 3 [expr {$display_height * 35 + 10}]
+
+ # Draw CGRAM viewer/editor
+ draw_cgram 400 [expr {$display_height * 35 + 38}]
+
+ # Create the entryboxes showing the most important HD44780 registers in the panel above the CGRAM viewer
+ draw_entyboxes 400 [expr {$display_height * 35 + 20}]
+
+ # Create "ON/OFF" button
+ create_on_off_button 5 [expr {$display_height * 35 + ($display_height == 1 ? 15 : 12)}]
+
+ # Create configuration menu button
+ create_configuration_menu_button 370 [expr {$display_height * 35 + 63}] ;#[expr {$display_height * 35 + 40}]
+
+ # Create "Show/Hide" buttons
+ create_enlarge_shirnk_buttons 370 [expr {$display_height * 35 + 13}]
+
+ # Pack canvas
+ pack $canvas_widget -fill both -expand 1
+
+ # Set window parameters
+ configure_win
+
+ # Disable or enable the "Show/Hide" buttons according to configuration of the window
+ disena_es_buttons
+ }
+
+ ## Show or Hide the bottom part of the window
+ # @return void
+ public method show_hide0 {} {
+ # Hide
+ if {$visible_ud} {
+ set new_height [expr {$display_height * 35 + 38}]
+ set image {_1downarrow}
+
+ $canvas_widget move connections_configuration 0 100
+ $canvas_widget move config_menu_button -330 -50
+ $canvas_widget move show_hide_but -300 0
+ $canvas_widget move right_bottom_panel 0 100
+
+ if {$visible_lr} {
+ show_hide1 1
+ set visible_lr 1
+ }
+
+ # Show
+ } else {
+ set new_height [expr {$display_height * 35 + 102}]
+ set image {_1uparrow}
+
+ $canvas_widget move connections_configuration 0 -100
+ $canvas_widget move config_menu_button 330 50
+ $canvas_widget move show_hide_but 300 0
+ $canvas_widget move right_bottom_panel 0 -100
+
+ if {$visible_lr} {
+ set visible_lr 0
+ show_hide1
+ }
+ }
+
+ # Set new window geometry
+ set geometry [split [wm geometry $win] {=x+}]
+ lset geometry 1 $new_height
+ wm minsize $win 0 0
+ wm geometry $win "=[lindex $geometry 0]x[lindex $geometry 1]+[lindex $geometry 2]+[lindex $geometry 3]"
+
+ # Set other values
+ set visible_ud [expr {!$visible_ud}]
+ $es_but_up_down configure -image ::ICONS::16::$image
+ update idletasks
+ }
+
+ ## Show or Hide the right part of the window
+ # @parm Bool allow_even_smaller=0 - Allow the window to be even smaller than $win_minwidth, see the code for details
+ # @return void
+ public method show_hide1 {{allow_even_smaller 0}} {
+ # Hide
+ if {$visible_lr} {
+ if {$allow_even_smaller} {
+ # Set window width just to contain the LCD dot matrix, CGRAM and so on can be omitted here
+ set new_width [expr {8 + 23 * $display_width}]
+ if {$display_height == 1} {
+ incr new_width 123
+ } else {
+ incr new_width 73
+ }
+ } else {
+ set new_width [expr {$win_minwidth - 226}]
+ }
+ set image {_1rightarrow}
+
+ # Show
+ } else {
+ set new_width $win_minwidth
+ set image {_1leftarrow}
+ }
+
+ # Set new window geometry
+ set geometry [split [wm geometry $win] {=x+}]
+ lset geometry 0 $new_width
+ wm minsize $win 0 0
+ wm geometry $win "=[lindex $geometry 0]x[lindex $geometry 1]+[lindex $geometry 2]+[lindex $geometry 3]"
+
+ # Set other values
+ set visible_lr [expr {!$visible_lr}]
+ $es_but_left_right configure -image ::ICONS::16::$image
+
+ update idletasks
+ }
+
+ ## Disable or enable the "Show/Hide" buttons according to configuration of the window
+ # @return void
+ private method disena_es_buttons {} {
+ if {$display_width > 18} {
+ $es_but_left_right configure -state disabled
+ }
+ }
+
+ ## Create "Show/Hide" buttons at the specified coordinates
+ # @parm Int x - X coordinate
+ # @parm Int y - Y coordinate
+ # @return void
+ private method create_enlarge_shirnk_buttons {x y} {
+ # Button "Show/Hide the bottom part"
+ set but [ttk::button $canvas_widget.show_hide0 \
+ -style FlatWhite.TButton \
+ -command [list $this show_hide0] \
+ -image ::ICONS::16::_1uparrow \
+ ]
+ setStatusTip -widget $but -text [mc "Show or hide the bottom part"]
+ DynamicHelp::add $but -text [mc "Show or hide the bottom part"]
+ $canvas_widget create window $x $y -window $but -anchor nw -tags show_hide_but
+ bindtags $but [list $but TButton all .]
+ set es_but_up_down $but
+
+ # Button "Show/Hide the right part"
+ set but [ttk::button $canvas_widget.show_hide1 \
+ -style FlatWhite.TButton \
+ -command [list $this show_hide1] \
+ -image ::ICONS::16::_1leftarrow \
+ ]
+ setStatusTip -widget $but -text [mc "Show or hide the right part"]
+ DynamicHelp::add $but -text [mc "Show or hide the right part"]
+ $canvas_widget create window $x [expr {$y + 25}] -window $but -anchor nw
+ bindtags $but [list $but TButton all .]
+ set es_but_left_right $but
+ }
+
+ ## Create "ON/OFF" button at the specified coordinates
+ # @parm Int x - X coordinate
+ # @parm Int y - Y coordinate
+ # @return void
+ private method create_on_off_button {x y} {
+ # Create "ON/OFF" button
+ set start_stop_button [ttk::button $canvas_widget.start_stop_button \
+ -command [list $this on_off_button_press] \
+ -style Flat.TButton \
+ -width 3 \
+ ]
+ DynamicHelp::add $start_stop_button \
+ -text [mc "Turn HW simulation on/off"]
+ setStatusTip -widget $start_stop_button -text [mc "Turn HW simulation on/off"]
+ bind $start_stop_button <Button-3> "$this on_off_button_press; break"
+ $canvas_widget create window $x $y -window $start_stop_button -anchor nw
+ bindtags $start_stop_button [list $start_stop_button TButton all .]
+ }
+
+ ## Create menu button for the configuration menu at the specified coordinates
+ # @parm Int x - X coordinate
+ # @parm Int y - Y coordinate
+ # @return void
+ private method create_configuration_menu_button {x y} {
+ # Create configuration menu button
+ set conf_button [ttk::button $canvas_widget.conf_but \
+ -image ::ICONS::16::configure \
+ -style FlatWhite.TButton \
+ -command [list $this config_menu] \
+ ]
+ setStatusTip -widget $conf_button -text [mc "Configure"]
+ $canvas_widget create window $x $y -window $conf_button -anchor nw -tags config_menu_button
+ bindtags $conf_button [list $conf_button TButton all .]
+ }
+
+ ## Set main window parameters
+ # @return void
+ private method configure_win {} {
+ # Decide minum allowable window width
+ set win_minwidth [expr {8 + 23 * $display_width}]
+ if {$display_height == 1} {
+ incr win_minwidth 123
+ } {
+ incr win_minwidth 73
+ }
+ if {$win_minwidth < 625} {
+ set win_minwidth 625
+ }
+
+ # Set window parameters
+ wm minsize $win $win_minwidth [expr {$display_height * 35 + 102}]
+ wm iconphoto $win ::ICONS::16::$component_icon
+ wm title $win "$display_height × $display_width [mc $component_name] - [$project cget -projectName] - MCU 8051 IDE"
+ wm resizable $win 0 0
+ wm protocol $win WM_DELETE_WINDOW [list $this close_window]
+ bindtags $win [list $win Toplevel all .]
+ }
+
+ ## Determinate which port pin is connected to the specified HD44780 wire
+ # @parm Int i - HD44780 signal, see SIGNAL_NAMES for the numbers of the signals
+ # @return List - {port_number bit_number}
+ private method which_port_pin {i} {
+ return [list $connection_port($i) $connection_pin($i)]
+ }
+
+ ## Handle "ON/OFF" button press
+ # Turn whole PALE system on or off
+ # @return void
+ public method on_off_button_press {} {
+ $project pale_all_on_off
+ }
+
+ ## Create ComboBoxes for specifying the connections between this device and the MCU simulator
+ # @parm Int x_offset - X coordinate where this suppose to be drawn
+ # @parm Int y_offset - Y coordinate where this suppose to be drawn
+ # @return void
+ private method draw_comboboxes {x_offset y_offset} {
+ set cb_l_y [expr {$y_offset + 13}]
+ set cb_p_y [expr {$y_offset + 33}]
+ set cb_b_y [expr {$y_offset + 53}]
+ set note_y [expr {$y_offset + 75}]
+
+ # Print labels and the user note entrybox
+ set x [expr {$x_offset + 30}]
+ $canvas_widget create text $x $cb_p_y \
+ -tags connections_configuration \
+ -text [mc "PORT"] \
+ -font $common_font \
+ -anchor e
+ $canvas_widget create text $x $cb_b_y \
+ -tags connections_configuration \
+ -text [mc "BIT"] \
+ -font $common_font \
+ -anchor e
+ $canvas_widget create text $x $note_y \
+ -tags connections_configuration \
+ -text [mc "NOTE"] \
+ -font $common_font \
+ -anchor e
+ incr x 5
+ $canvas_widget create window $x $note_y \
+ -tags connections_configuration \
+ -window [ttk::entry $canvas_widget.usr_note \
+ -validate key \
+ -validatecommand "$this set_modified" \
+ ] \
+ -width 325 -anchor w
+ bindtags $canvas_widget.usr_note \
+ [list $canvas_widget.usr_note TEntry $win all .]
+
+ # Create LES's and ComboBoxes
+ for {set i 0} {$i < 11} {incr i} {
+ # Label with name of the HD44780 pin
+ set signal_label($i) [$canvas_widget create text \
+ [expr {$x + 12}] $cb_l_y \
+ -tags connections_configuration \
+ -text [lindex $SIGNAL_NAMES $i] \
+ -font $common_font \
+ -anchor center \
+ -fill {#000000} \
+ ]
+
+ # MCU port selection ComboBoxe
+ $canvas_widget create window $x $cb_p_y \
+ -anchor w \
+ -tags connections_configuration \
+ -window [ttk::combobox $canvas_widget.cb_p$i \
+ -width 1 \
+ -font $common_font \
+ -state readonly \
+ ]
+ bind $canvas_widget.cb_p$i <<ComboboxSelected>> "$this reconnect $i"
+
+ # MCU port bit selection ComboBoxe
+ $canvas_widget create window $x $cb_b_y \
+ -anchor w \
+ -tags connections_configuration \
+ -window [ttk::combobox $canvas_widget.cb_b$i \
+ -width 1 \
+ -font $common_font \
+ -values {- 0 1 2 3 4 5 6 7} \
+ -state readonly \
+ ]
+ bind $canvas_widget.cb_b$i <<ComboboxSelected>> "$this reconnect $i"
+
+ # Finalize ...
+ bindtags $canvas_widget.cb_p$i \
+ [list $canvas_widget.cb_p$i TCombobox all .]
+ bindtags $canvas_widget.cb_b$i \
+ [list $canvas_widget.cb_b$i TCombobox all .]
+
+ incr x 30
+ }
+ }
+
+ ## Validator function for entryboxes with the most important HD44780 registers in the panel above the CGRAM viewer
+ # @parm String type - Entryboxes purpose; watched HD44780 register
+ # @parm String content - String to validate
+ # @return Bool - 1 == Passed; 0 == Incorrect input
+ public method vcmd {type content} {
+ if {$inhibit_vcmd} {
+ set inhibit_vcmd 1
+ return 1
+ }
+
+ # Allow empty strings
+ if {![string length $content]} {
+ set inhibit_vcmd 0
+ return 1
+ }
+
+ # Allow only hexadecimal digits up to length of two
+ if {![string is xdigit -strict $content] || [string length $content] > 2} {
+ set inhibit_vcmd 0
+ return 0
+ }
+
+ # Update the actual HD44780 register
+ set dec_value [expr "0x$content"]
+ switch -- $type {
+ {IR} { ;# Instruction Register
+ set inst_reg $dec_value
+ }
+ {DR} { ;# Data register
+ set data_reg $dec_value
+ }
+ {AC} { ;# Address counter
+ if {$dec_value > 0x7f} {
+ return 0
+ }
+ set address_counter $dec_value
+ set address_counter_old $dec_value
+ refresh_display
+ }
+ {SHIFT} { ;# Display Shift
+ if {$dec_value > 0x7f} {
+ return 0
+ }
+ set display_shift $dec_value
+ refresh_display
+ }
+ }
+
+ # Successfully done
+ set inhibit_vcmd 0
+ return 1
+ }
+
+ ## Update content of all entryboxes with the most important HD44780 registers in the panel above the CGRAM viewer
+ # @return void
+ private method update_entry_boxes {} {
+ set inhibit_vcmd 1
+
+ # Instruction Register
+ $entrybox(IR) delete 0 end
+ $entrybox(IR) insert 0 [format {%02X} $inst_reg]
+
+ # Data register
+ $entrybox(DR) delete 0 end
+ $entrybox(DR) insert 0 [format {%02X} $data_reg]
+
+ # Address counter
+ $entrybox(AC) delete 0 end
+ $entrybox(AC) insert 0 [format {%02X} $address_counter]
+
+ # Display Shift
+ $entrybox(SHIFT) delete 0 end
+ $entrybox(SHIFT) insert 0 [format {%02X} $display_shift]
+
+ set inhibit_vcmd 0
+ }
+
+ ## Create the entryboxes showing the most important HD44780 registers in the panel above the CGRAM viewer
+ # @parm Int x_offset - X coordinate where this suppose to be drawn
+ # @parm Int y_offset - Y coordinate where this suppose to be drawn
+ # @return void
+ private method draw_entyboxes {x_offset y_offset} {
+ set x $x_offset
+ set y $y_offset
+
+ incr x 15
+
+ # Instruction Register
+ $canvas_widget create text \
+ $x $y \
+ -text {IR:} \
+ -font $common_font \
+ -anchor e \
+ -tags right_bottom_panel
+ incr x 5
+ set entrybox(IR) [ttk::entry $canvas_widget.ir_ent \
+ -width 2 \
+ -font $common_font \
+ -validate key \
+ -validatecommand [list $this vcmd {IR} {%P}] \
+ ]
+ $canvas_widget create window $x $y \
+ -window $entrybox(IR) \
+ -anchor w \
+ -tags right_bottom_panel
+ incr x 50
+
+ # Data register
+ $canvas_widget create text \
+ $x $y \
+ -text {DR:} \
+ -font $common_font \
+ -anchor e \
+ -tags right_bottom_panel
+ incr x 5
+
+ set entrybox(DR) [ttk::entry $canvas_widget.dr_ent \
+ -width 2 \
+ -font $common_font \
+ -validate key \
+ -validatecommand [list $this vcmd {DR} {%P}] \
+ ]
+ $canvas_widget create window $x $y \
+ -window $entrybox(DR) \
+ -anchor w \
+ -tags right_bottom_panel
+ incr x 50
+
+ # Address counter
+ $canvas_widget create text \
+ $x $y \
+ -text {AC:} \
+ -font $common_font \
+ -anchor e \
+ -tags right_bottom_panel
+ incr x 5
+ set entrybox(AC) [ttk::entry $canvas_widget.ac_ent \
+ -width 2 \
+ -font $common_font \
+ -validate key \
+ -validatecommand [list $this vcmd {AC} {%P}] \
+ ]
+ $canvas_widget create window $x $y \
+ -window $entrybox(AC) \
+ -anchor w \
+ -tags right_bottom_panel
+ incr x 55
+
+ # Display Shift
+ $canvas_widget create text \
+ $x $y \
+ -text [mc "Shift:"] \
+ -font $common_font \
+ -anchor e \
+ -tags right_bottom_panel
+ incr x 5
+ set entrybox(SHIFT) [ttk::entry $canvas_widget.sh_ent \
+ -width 2 \
+ -font $common_font \
+ -validate key \
+ -validatecommand [list $this vcmd {SHIFT} {%P}] \
+ ]
+ $canvas_widget create window $x $y \
+ -window $entrybox(SHIFT) \
+ -anchor w \
+ -tags right_bottom_panel
+
+ # Configure binding tags
+ foreach key [array names entrybox] {
+ bindtags $entrybox($key) [list $entrybox($key) TEntry $win all .]
+ }
+ }
+
+ ## Draw CGRAM viewer/editor
+ # @parm Int x_offset - X coordinate where this suppose to be drawn
+ # @parm Int y_offset - Y coordinate where this suppose to be drawn
+ # @return void
+ private method draw_cgram {x_offset y_offset} {
+ $canvas_widget create text \
+ $x_offset [expr {$y_offset + 3}] \
+ -text {CGRAM:} \
+ -font $common_font \
+ -anchor w \
+ -tags right_bottom_panel
+ incr y_offset 10
+
+ set square_size 4
+ set sep 1
+ set sep2 3
+
+ set x $x_offset
+ set y [expr {$y_offset + 0}]
+ for {set k 0} {$k < 8} {incr k} {
+
+ for {set i 0} {$i < 8} {incr i} {
+ for {set j 0} {$j < 5} {incr j} {
+ set cgram_pixel($k,$j,$i) [$canvas_widget \
+ create rectangle $x $y \
+ [expr {$x + $square_size}] \
+ [expr {$y + $square_size}] \
+ -fill $OFF_COLOR \
+ -outline {#000000} \
+ -width 0
+ ]
+
+ foreach event {Enter Leave Button-1} {
+ $canvas_widget bind $cgram_pixel($k,$j,$i) <$event> \
+ [list $this cgram_pixel_event $event $k $j $i]
+ }
+
+ incr x $square_size
+ incr x $sep
+ }
+ incr x [expr {-5 * ($square_size + $sep)}]
+ incr y [expr {$square_size + $sep}]
+ }
+ $canvas_widget create text [expr {$x + (5 * $square_size) / 2}] [expr {$y + 8}] -text $k -font $common_font
+
+ incr x [expr {$sep2 + 5 * ($square_size + $sep)}]
+ incr y [expr {-8 * ($square_size + $sep)}]
+ }
+ }
+
+ ## Handle events on CGRAM viewer character points
+ # @parm String event - Event type (e.g. "Leave")
+ # @parm Int char - Number of character where it occurred
+ # @parm Int col - Column in the character
+ # @parm Int row - Row in the character
+ # @return void
+ public method cgram_pixel_event {event char col row} {
+ switch -- $event {
+ {Enter} { ;# Highlight the cell
+ $canvas_widget itemconfigure $cgram_pixel($char,$col,$row) -width 1
+ }
+ {Leave} { ;# "Unhighlight" cell
+ $canvas_widget itemconfigure $cgram_pixel($char,$col,$row) -width 0
+ }
+ {Button-1} { ;# Invert the cell and also adjust the CGRAM accordingly
+ set value [lindex $cgram [list $char $row $col]]
+ set value [expr {!$value}]
+
+ lset cgram [list $char $row $col] $value
+
+ if {$value} {
+ $canvas_widget itemconfigure $cgram_pixel($char,$col,$row) -fill $ON_COLOR
+ } else {
+ $canvas_widget itemconfigure $cgram_pixel($char,$col,$row) -fill $OFF_COLOR
+ }
+
+ if {$cgram_hexeditor != {}} {
+ set val 0
+ for {set j 0} {$j < 5} {incr j} {
+ set val [expr {$val | (([lindex $cgram [list $char $row $j]] ? 1 : 0) << $j)}]
+ }
+
+ set addr [expr {($char << 3) | $row}]
+ $cgram_hexeditor setValue $addr $val
+ $cgram_hexeditor setHighlighted $addr 1
+ }
+ }
+ }
+ }
+
+ ## Synchronize all of the status LEDs with current state of the HD44780 core
+ # @return void
+ private method adjust_status_leds {} {
+ foreach key $STATUS_LEDS_NAMES {
+ if {$diver_cfg($key)} {
+ set image {dot}
+ } else {
+ set image {dot_gray}
+ }
+ $canvas_widget itemconfigure $status_led($key) -image ::ICONS::16::$image
+ }
+ }
+
+ ## Invert the specified HD44780 configuration flag (e.g. F, S, D, B)
+ # This method suppose to be called from the status LEDs panel
+ # @parm String config_param_name - HD44780 flag, like B (Blink) or C (Cursor)
+ # @return void
+ public method change_config {config_param_name} {
+ set diver_cfg($config_param_name) [expr {$diver_cfg($config_param_name) ? 0 : 1}]
+ refresh_display
+ adjust_status_leds
+ }
+
+ ## Draw LEDs showing status of HD44780 flags like: S, F, D, B, etc.
+ # @parm Int x_offset - X coordinate where this suppose to be drawn
+ # @parm Int y_offset - Y coordinate where this suppose to be drawn
+ # @return void
+ private method draw_status_leds {{x_offset 6} {y_offset 5}} {
+ # Determinate dimensions of matrix of status LEDs
+ if {$display_height == 1} {
+ set rows 3
+ set cols 4
+ } {
+ set rows 5
+ set cols 2
+ }
+ set items_total 10
+
+ set k 0
+ for {set i 0} {$i < $cols} {incr i} {
+ for {set j 0} {$j < $rows} {incr j} {
+ # Create the LED
+ set status_led([lindex $STATUS_LEDS_NAMES $k]) \
+ [$canvas_widget create image $x_offset $y_offset -anchor nw -image ::ICONS::16::dot_gray]
+
+ # Create label for the LED
+ set label [label $canvas_widget.status_lbl_${k} \
+ -text [lindex $STATUS_LEDS_TEXTS $k] \
+ -fg {#000000} \
+ -bg {#FFFFFF} \
+ -font $common_font \
+ ]
+
+ # Set event some handlers for the label widget in order to make it work
+ #+ also as a button which changes value of the watched flag
+ bind $label <Enter> {+
+ %W configure \
+ -fg {#0000FF} \
+ -cursor hand2 \
+ -font ${::LcdHD44780::common_font_u}
+ }
+ bind $label <Leave> {+
+ %W configure \
+ -fg {#000000} \
+ -cursor left_ptr \
+ -font ${::LcdHD44780::common_font}
+ }
+ bind $label <Button-1> [list $this change_config [lindex $STATUS_LEDS_NAMES $k]]
+ ::DynamicHelp::add $label -text [lindex $STATUS_LEDS_HELPTEXTS $k]
+
+ # Show the label widget
+ $canvas_widget create window [expr {$x_offset + 10}] [expr {$y_offset - 3}] \
+ -anchor nw \
+ -window $label
+
+ incr y_offset 14
+ incr k
+
+ if {$k >= $items_total} {
+ break
+ }
+ }
+
+ incr y_offset [expr {$rows * -14}]
+ incr x_offset 25
+ }
+ }
+
+ ## Draw the LCD dot matrix
+ # @parm Int x_offset - X coordinate where this suppose to be drawn
+ # @parm Int y_offset - Y coordinate where this suppose to be drawn
+ # @return void
+ private method draw_display {{x_offset 73} {y_offset 3}} {
+ set square_size 3
+ set sep 1
+ set sep2 3
+
+ if {$display_height == 1} {
+ incr x_offset 50
+ }
+
+ set disp_frame [$canvas_widget create rectangle $x_offset $y_offset \
+ [expr {$x_offset + $sep2 - $sep + $display_width * ($sep2 + 5 * ($square_size + $sep))}] \
+ [expr {$y_offset + $sep2 - $sep + $display_height * ($sep2 + 8 * ($square_size + $sep)) + 2 * $lcd_char_size * ($square_size + $sep)}] \
+ -outline {#000000} -width 1 \
+ ]
+
+ incr x_offset $sep2
+ incr y_offset $sep2
+
+ set x $x_offset
+ set y $y_offset
+ for {set row 0} {$row < $display_height} {incr row} {
+ for {set col 0} {$col < $display_width} {incr col} {
+ for {set i 0} {$i < (8 + 2 * $lcd_char_size)} {incr i} {
+ for {set j 0} {$j < 5} {incr j} {
+ set lcd_pixel($col,$row,$j,$i) [$canvas_widget \
+ create rectangle $x $y \
+ [expr {$x + $square_size}] \
+ [expr {$y + $square_size}] \
+ -fill $OFF_COLOR \
+ -width 0
+ ]
+ incr x $square_size
+ incr x $sep
+ }
+ incr x [expr {-5 * ($square_size + $sep)}]
+ incr y [expr {$square_size + $sep}]
+ }
+ incr x [expr {$sep2 + 5 * ($square_size + $sep)}]
+ incr y [expr {(-8 - 2 * $lcd_char_size) * ($square_size + $sep)}]
+ }
+ set x $x_offset
+ incr y [expr {$sep2 + (8 + 2 * $lcd_char_size) * ($square_size + $sep)}]
+ }
+ }
+
+ ## Create and show CGRAM hex. editor window
+ # @return void
+ public method show_cgram {} {
+ if {[winfo exists $win.cgram_window]} {
+ raise $win.cgram_window
+ return
+ }
+
+ # Create dialog window
+ set dialog [toplevel $win.cgram_window -class {CGRAM (HD44780)} -bg ${::COMMON_BG_COLOR}]
+
+ # Create bottom frame
+ set bottom_frame [frame $dialog.bottom_frame]
+ pack [ttk::button $bottom_frame.close_but \
+ -text [mc "Close"] \
+ -compound left \
+ -image ::ICONS::16::button_cancel \
+ -command [list $this close_cgram_window] \
+ ] -side left -anchor w -padx 2 -pady 2
+ set cursor_lbl [label $bottom_frame.cur_val \
+ -text { } -fg {#0000FF} \
+ -font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
+ ] \
+ ]
+ pack $cursor_lbl -side right -anchor e -padx 5
+ pack [label $bottom_frame.cur_lbl \
+ -text [mc "Cursor: "] \
+ ] -side right -anchor e
+
+ # Create middle frame (hexeditor)
+ set hexeditor_frame $dialog.hexeditor_frame
+ set hexeditor [HexEditor #auto \
+ $hexeditor_frame 8 8 2 hex 1 0 3 64 \
+ ]
+ set cgram_hexeditor $hexeditor
+ $hexeditor showHideScrollbar 1
+ $hexeditor bindCellValueChanged [list $this write_to_cgram_from_hex_editor]
+ $hexeditor bindCellEnter [list $this show_address_in_hex_label $cursor_lbl]
+ $hexeditor bindCellLeave [list $cursor_lbl configure -text { }]
+ for {set i 0} {$i < 64} {incr i} {
+ set val 0
+ set pattern [lindex $cgram [expr {$i / 8}] [expr {$i % 8}]]
+ for {set j 0} {$j < 5} {incr j} {
+ set val [expr {$val | (([lindex $pattern $j] ? 1 : 0) << $j)}]
+ }
+ $hexeditor setValue $i $val
+ }
+ $hexeditor focus_left_view
+
+ pack $hexeditor_frame -fill both -expand 1
+ pack $bottom_frame -side bottom -fill x
+
+ # Configure dialog window
+ wm iconphoto $dialog ::ICONS::16::kcmmemory
+ wm title $dialog "CGRAM (HD44780) - [$::X::actualProject cget -projectName] - MCU 8051 IDE"
+ wm resizable $dialog 0 1
+ wm minsize $dialog 0 120
+ wm protocol $dialog WM_DELETE_WINDOW [list $this close_cgram_window]
+ if {[lindex $cgram_window_params 1] != {}} {
+ wm geometry $dialog [lindex $cgram_window_params 1]
+ }
+ }
+
+ ## Write a value to CGRAM (suppose to be used as a callback for CGRAM hex. editor window)
+ # @parm Int address - Address to CGRAM
+ # @parm Int data - New value to store in CGRAM (character pattern fragment -- one row)
+ public method write_to_cgram_from_hex_editor {address pattern} {
+ set char [expr {($address & 0x38) >> 3}]
+ set row [expr {$address & 0x07}]
+ set pattern [expr {$pattern & 0x1F}]
+
+ write_to_cgram $char $row $pattern 1
+ }
+
+ ## Close CGRAM hex. editor window if it is opened
+ # @return void
+ public method close_cgram_window {} {
+ if {$cgram_hexeditor == {}} {
+ return
+ }
+ set cgram_window_params [list 0 [wm geometry $win.cgram_window]]
+ destroy $win.cgram_window
+ set cgram_hexeditor {}
+ }
+
+ ## Create and show DDRAM hex. editor window
+ # @return void
+ public method show_ddram {} {
+ if {[winfo exists $win.ddram_window]} {
+ raise $win.ddram_window
+ return
+ }
+
+ # Create dialog window
+ set dialog [toplevel $win.ddram_window -class {DDRAM (HD44780)} -bg ${::COMMON_BG_COLOR}]
+
+ # Create bottom frame
+ set bottom_frame [frame $dialog.bottom_frame]
+ pack [ttk::button $bottom_frame.close_but \
+ -text [mc "Close"] \
+ -compound left \
+ -image ::ICONS::16::button_cancel \
+ -command [list $this close_ddram_window] \
+ ] -side left -anchor w -padx 2 -pady 2
+ set cursor_lbl [label $bottom_frame.cur_val \
+ -text { } -fg {#0000FF} \
+ -font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
+ ] \
+ ]
+ pack $cursor_lbl -side right -anchor e -padx 5
+ pack [label $bottom_frame.cur_lbl \
+ -text [mc "Cursor: "] \
+ ] -side right -anchor e
+
+ # Create middle frame (hexeditor)
+ set hexeditor_frame $dialog.hexeditor_frame
+ set hexeditor [HexEditor #auto \
+ $hexeditor_frame 8 10 2 hex 1 0 3 0x80 \
+ ]
+ set ddram_hexeditor $hexeditor
+ $hexeditor showHideScrollbar 1
+ $hexeditor bindCellValueChanged [list $this write_to_ddram_from_hex_editor]
+ $hexeditor bindCellEnter [list $this show_address_in_hex_label $cursor_lbl]
+ $hexeditor bindCellLeave [list $cursor_lbl configure -text { }]
+ for {set i 0} {$i < 0x80} {incr i} {
+ $hexeditor setValue $i $ddram($i)
+ }
+ $hexeditor focus_left_view
+
+ pack $hexeditor_frame -fill both -expand 1
+ pack $bottom_frame -side bottom -fill x
+
+ # Configure dialog window
+ wm iconphoto $dialog ::ICONS::16::kcmmemory
+ wm title $dialog "DDRAM (HD44780) - [$::X::actualProject cget -projectName] - MCU 8051 IDE"
+ wm resizable $dialog 0 1
+ wm minsize $dialog 0 120
+ wm protocol $dialog WM_DELETE_WINDOW [list $this close_ddram_window]
+ if {[lindex $ddram_window_params 1] != {}} {
+ wm geometry $dialog [lindex $ddram_window_params 1]
+ }
+ }
+
+ ## Write a value to DDRAM (suppose to be used as a callback for DDRAM hex. editor window)
+ # @parm Int address - Address to DDRAM
+ # @parm Int data - New value to store in DDRAM
+ # @return void
+ public method write_to_ddram_from_hex_editor {address data} {
+ write_to_ddram $address $data 1
+ }
+
+ ## Update cursor address label in xxRAM hex. editor window
+ # @parm Widget cursor_lbl - Cursor address label to update
+ # @parm Int dec_address - Decimal address to be shown in hexadecimal format
+ # @parm ... - Any other arguments are discarded
+ # @return void
+ public method show_address_in_hex_label {cursor_lbl dec_address args} {
+ $cursor_lbl configure -text "0x[format {%02X} $dec_address]"
+ }
+
+ ## Close DDRAM hex. editor window if it is opened
+ # @return void
+ public method close_ddram_window {} {
+ if {$ddram_hexeditor == {}} {
+ return
+ }
+ set ddram_window_params [list 0 [wm geometry $win.ddram_window]]
+ destroy $win.ddram_window
+ set ddram_hexeditor {}
+ }
+
+ ## Show Character Generator ROM, concrete table depends on variable $rom_code
+ # @return void
+ public method show_cgrom {} {
+ # Create the dialog window
+ set dialog "${win}_cgrom_${rom_code}"
+ if {[winfo exists $dialog]} {
+ raise $dialog
+ return
+ }
+ toplevel $dialog -class {HD44780 CGROM}
+ set cgrom_canvas [canvas $dialog.canvas \
+ -bg {#FFFFFF} \
+ ]
+
+ # Some parameters of the matrix where characters will be displayed
+ set sep 1 ;# LCD segment separator
+ set sep2 1 ;# Character column separator
+ set sep3 13 ;# Character row separator
+ set square_size 3 ;# LCD segment square size
+
+ set header_x_offset 15 ;# Position of the header
+ set header_y_offset 15 ;# Position of the header
+ set matrix_x_offset 30 ;# Position of the matrix
+ set matrix_y_offset 30 ;# Position of the matrix
+
+ # Create horizontal header
+ set x [expr {$matrix_x_offset + int(2.5 * ($square_size + $sep))}]
+ set y $header_y_offset
+ for {set i 0} {$i < 16} {incr i} {
+ $cgrom_canvas create text $x $y -text "[format {%X} $i]_" -font $common_font -fill {#FF0000}
+ incr x [expr {$sep3 + 5 * ($square_size + $sep)}]
+ }
+
+ # Create vertical header
+ set x $header_x_offset
+ set y [expr {$matrix_y_offset + 4 * ($square_size + $sep)}]
+ for {set i 0} {$i < 16} {incr i} {
+ $cgrom_canvas create text $x $y -text "_[format {%X} $i]" -font $common_font -fill {#FF0000}
+ incr y [expr {$sep2 + 10 * ($square_size + $sep)}]
+ }
+
+ # Create the matrix of characters
+ set x $matrix_x_offset
+ set y $matrix_y_offset
+ set char_code 0
+ for {set row 0} {$row < 16} {incr row} {
+ for {set col 0} {$col < 16} {incr col} {
+
+ # Draw character
+ set char_code [expr {16 * $col + $row}]
+ for {set i 0} {$i < 10} {incr i} {
+ for {set j 0} {$j < 5} {incr j} {
+ if {$col < 14 && $i > 7} {
+ set color {#FFFFFF}
+ } elseif {$char_code < 16} {
+ set color $USER_DEF_COLOR
+ } elseif {[lindex $CGROM [list $rom_code [expr {$char_code - 16}] $i $j]]} {
+ set color $ON_COLOR
+ } else {
+ set color $OFF_COLOR
+ }
+
+ $cgrom_canvas create rectangle $x $y \
+ [expr {$x + $square_size}] \
+ [expr {$y + $square_size}] \
+ -fill $color \
+ -width 0
+
+ incr x $square_size
+ incr x $sep
+ }
+ incr x [expr {-5 * ($square_size + $sep)}]
+ incr y [expr {$square_size + $sep}]
+ }
+ incr x [expr {$sep3 + 5 * ($square_size + $sep)}]
+ incr y [expr {-10 * ($square_size + $sep)}]
+
+ }
+ set x $matrix_x_offset
+ incr y [expr {$sep2 + 10 * ($square_size + $sep)}]
+ }
+
+ pack $cgrom_canvas -fill both -expand 1
+
+ # Set window parameters
+ wm minsize $dialog 555 690
+ wm iconphoto $dialog ::ICONS::16::kcmmemory
+ wm title $dialog [mc "HD44780 Character Generator ROM (ROM Code: A0%d) - MCU 8051 IDE" ${rom_code}]
+ wm resizable $dialog 0 0
+ bindtags $dialog [list $dialog Toplevel $win all .]
+ }
+
+ ## Show the log window
+ # The log window must have been once created by method create_log prior to
+ #+ the call to this method
+ # @return void
+ public method show_log {} {
+ set dialog $win.log_window
+ if {[wm state $dialog] == {normal}} {
+ raise $dialog
+ return
+ }
+ if {![winfo exists $dialog]} {
+ return
+ }
+ wm deiconify $dialog
+ raise $dialog
+ }
+
+ ## Create the log dialog window, but do not show it until method show_log is called
+ # @parm String geometry={} - Desired geometry of the window, {} means default geometry
+ # @return void
+ public method create_log {{geometry {}}} {
+ # Create the dialog window (hidden for now)
+ set dialog $win.log_window
+ toplevel $dialog
+ wm withdraw $dialog
+
+ ## Create main frame (text and scrollbar)
+ set main_frame [frame $dialog.main_frame]
+ # Text widget
+ set text_widget [text $main_frame.text \
+ -width 0 -height 0 -font $hlp_normal_font \
+ -yscrollcommand [list $main_frame.scrollbar set] \
+ -wrap word -padx 5 -pady 5 -state disabled \
+ ]
+ set log_win_text $text_widget
+ bindtags $text_widget [list $text_widget Text $win all .]
+ pack $text_widget -side left -fill both -expand 1
+ # Create text tag in the text widget
+ $text_widget tag configure tag_info -foreground {#FFFFFF} -background {#0000EE}
+ $text_widget tag configure tag_warning -foreground {#FFFFFF} -background {#EE8800}
+ $text_widget tag configure tag_error -foreground {#FFFFFF} -background {#DD0000}
+ $text_widget tag configure tag_line \
+ -background {#DDDDDD} \
+ -font [font create \
+ -family ${::DEFAULT_FIXED_FONT} \
+ -size -1 \
+ ]
+
+ # Scrollbar
+ pack [ttk::scrollbar $main_frame.scrollbar \
+ -orient vertical \
+ -command [list $text_widget yview] \
+ ] -side right -fill y
+ # Finalize ...
+ pack $main_frame -fill both -expand 1 -padx 2
+
+ # Create bottom frame
+ set bottom_frame [frame $dialog.bottom_frame]
+ # Button "Close"
+ pack [ttk::button $bottom_frame.close_button \
+ -text [mc "Close"] \
+ -compound left \
+ -image ::ICONS::16::button_cancel \
+ -command [list $this close_log_win] \
+ ] -side right
+ # Button "Clear log"
+ pack [ttk::button $bottom_frame.clear_button \
+ -text [mc "Clear log"] \
+ -compound left \
+ -image ::ICONS::16::editdelete \
+ -command "
+ $text_widget configure -state normal
+ $text_widget delete 0.0 end
+ $text_widget configure -state disabled
+ " \
+ ] -side left
+ # CheckBox: "Enable log"
+ set log_on_off_chbut [checkbutton $bottom_frame.on_off_chbut \
+ -command [list $this log_on_off] \
+ -text [mc "Enable log"] \
+ ]
+ if {$log_enabled} {
+ $log_on_off_chbut select
+ } {
+ $log_on_off_chbut deselect
+ }
+ setStatusTip -widget $log_on_off_chbut -text [mc "Disabled logging may notably improve simulation speed"]
+ DynamicHelp::add $log_on_off_chbut -text [mc "Disabled logging may notably improve simulation speed"]
+ pack $log_on_off_chbut -side left -padx 5
+ pack $bottom_frame -pady 2 -padx 5 -fill x
+
+ # Set window parameters
+ wm minsize $dialog [expr {int(300 * $::font_size_factor)}] [expr {int(150 * $::font_size_factor)}]
+ wm iconphoto $dialog ::ICONS::16::bar5
+ wm title $dialog [mc "HD44780 log - MCU 8051 IDE"]
+ wm protocol $dialog WM_DELETE_WINDOW [list $this close_log_win]
+ bindtags $dialog [list $dialog Toplevel $win all .]
+
+ if {$geometry != {}} {
+ wm geometry $dialog $geometry
+ }
+ }
+
+ ## Enable or disable logging of events
+ # @return void
+ public method log_on_off {} {
+ set log_enabled [expr {!$log_enabled}]
+
+ # Set flag modified
+ set_modified
+ }
+
+ ## Close the HD44780 log window
+ # @return void
+ public method close_log_win {} {
+ set dialog $win.log_window
+ if {![winfo exists $dialog]} {
+ return
+ }
+
+ wm withdraw $dialog
+ }
+
+ ## Informs the HD44780 simulator about change of _no_delays flag (used by configuration menu)
+ # @return void
+ public method no_delays_changed {} {
+ set no_delays ${::LcdHD44780::_no_delays}
+ }
+
+ ## Informs the HD44780 simulator about change of _ignore_errors flag (used by configuration menu)
+ # @return void
+ public method ignore_errors_changed {} {
+ set ignore_errors ${::LcdHD44780::_ignore_errors}
+ }
+
+ ## Informs the HD44780 simulator about change of character size (used by configuration menu)
+ # @return void
+ public method char_size_changed {} {
+ set lcd_char_size ${::LcdHD44780::char_size}
+ if {$display_height == 2 && $lcd_char_size == 1} {
+ set lcd_char_size 0
+ return
+ }
+ accept_new_character_size
+ }
+
+ ## Informs the HD44780 simulator about change of font (used by configuration menu)
+ # @return void
+ public method font_changed {} {
+ set rom_code ${::LcdHD44780::font_id}
+ refresh_display
+ }
+
+ ## Adapt the LCD dot matrix to a new character size value, that means create additional
+ #+ dots and get rid of some of the dots currently displayed
+ # @return void
+ private method accept_new_character_size {} {
+ if {$display_height == 2} {
+ return
+ }
+
+ $canvas_widget delete $disp_frame
+ foreach key [array names lcd_pixel] {
+ $canvas_widget delete $lcd_pixel($key)
+ }
+ draw_display
+ refresh_display
+ }
+
+ ## Write a message to the log
+ # @parm Char type - Message type "I" == Information; "W" == Warning; "E" == Error
+ # @parm String string - Text of the message
+ # @return void
+ private method write_to_log {type string} {
+ # Do not do anything if the log is not available at all
+ if {!$log_enabled || $log_win_text == {}} {
+ return
+ }
+
+ # Enable the text widget
+ $log_win_text configure -state normal
+
+ # Manage the log length, the number of row in the log must not exceed the specified maximum
+ if {int([$log_win_text index end]) > ($MAX_LOG_LENGTH + 1)} {
+ set diff [expr {int([$log_win_text index end]) - $MAX_LOG_LENGTH}]
+ $log_win_text delete 1.0 $diff.0
+ }
+ $log_win_text mark set insert {end -1l lineend}
+
+ # Insert separators (horizontal lines) between events with the same time mark
+ if {$time_mark && $log_time_mark != $time_mark} {
+ set log_time_mark $time_mark
+ $log_win_text insert insert "\n"
+ $log_win_text tag add tag_line insert-1l insert
+ }
+
+ # Insert the information about the message type
+ switch -- $type {
+ {I} { ;# Information
+ $log_win_text insert insert [mc "\[INFO\] "]
+ $log_win_text tag add tag_info {insert linestart} insert-1c
+ }
+ {W} { ;# Warning
+ $log_win_text insert insert [mc "\[WARNING\] "]
+ $log_win_text tag add tag_warning {insert linestart} insert-1c
+ }
+ {E} { ;# Error
+ $log_win_text insert insert [mc "\[ERROR\] "]
+ $log_win_text tag add tag_error {insert linestart} insert-1c
+ }
+ }
+
+ # Insert the message itself
+ $log_win_text insert insert $string
+ $log_win_text insert insert "\n"
+ $log_win_text see insert
+
+ # Disable the text widget
+ $log_win_text configure -state disabled
+
+ # Show also a special erro message dialog if this is a case of an error and if it is allowed
+ if {$type == {E} && !$ignore_errors} {
+ if {[$project sim_run_in_progress]} {
+ $project sim_run
+ } elseif {[$project sim_anim_in_progress]} {
+ $project sim_animate
+ }
+ tk_messageBox \
+ -parent $win \
+ -title [mc "HD44780 ERROR"] \
+ -icon error \
+ -type ok \
+ -message $string
+ }
+ }
+
+ # ------------------------------------------------------------------
+ # HD44780 CORE FUNCTIONS
+ # ------------------------------------------------------------------
+
+ ## HD44780 instruction: Clear Display
+ # Clears entire display and sets DDRAM address 0 in address counter.
+ # @return void
+ private method inst_ClearDisplay {} {
+ write_to_log I [mc "Received instruction: %s" "Clear Display"]
+ if {[must_not_be_enaged]} {return}
+ engage_core 1700
+
+ set address_counter 0
+ for {set i 0} {$i < 0x80} {incr i} {
+ write_to_ddram $i 20
+ }
+
+ update_entry_boxes
+ }
+
+ ## HD44780 instruction: Return Home
+ # Sets DDRAM address 0 in address counter. Also returns display from
+ #+ being shifted to original position. DDRAM contents remain unchanged.
+ # @return void
+ private method inst_ReturnHome {} {
+ write_to_log I [mc "Received instruction: %s" "Return Home"]
+ if {[must_not_be_enaged]} {return}
+ engage_core 1700
+
+ set address_counter 0
+ set display_shift 0
+
+ update_entry_boxes
+ refresh_display
+ }
+
+ ## HD44780 instruction: Entry Mode Set
+ # Sets cursor move direction and specifies display shift. These
+ #+ operations are performed during data write and read.
+ # @return void
+ private method inst_EntryModeSet {} {
+ write_to_log I [mc "Received instruction: %s" "Entry Mode Set"]
+ if {[must_not_be_enaged]} {return}
+ engage_core 40
+
+ set diver_cfg(ID) [expr {($inst_reg & 0x02) ? 1 : 0}]
+ set diver_cfg(S) [expr {($inst_reg & 0x01) ? 1 : 0}]
+
+ write_to_log I "I/D = $diver_cfg(ID), S = $diver_cfg(S)"
+
+ update_entry_boxes
+ adjust_status_leds
+ refresh_display
+ }
+
+ ## HD44780 instruction: Display On Off Control
+ # Sets entire display (D) on/off, cursor on/off (C), and blinking of
+ #+ cursor position character (B).
+ # @return void
+ private method inst_DisplayOnOffControl {} {
+ write_to_log I [mc "Received instruction: %s" "Display On Off Control"]
+ if {[must_not_be_enaged]} {return}
+ engage_core 40
+
+ set diver_cfg(D) [expr {($inst_reg & 0x04) ? 1 : 0}]
+ set diver_cfg(C) [expr {($inst_reg & 0x02) ? 1 : 0}]
+ set diver_cfg(B) [expr {($inst_reg & 0x01) ? 1 : 0}]
+
+ write_to_log I "D = $diver_cfg(D), C = $diver_cfg(C), B = $diver_cfg(B)"
+
+ update_entry_boxes
+ adjust_status_leds
+ refresh_display
+ }
+
+ ## HD44780 instruction: Cursor Or Display Shift
+ # Sets entire display (D) on/off, cursor on/off (C), and blinking of
+ #+ cursor position character (B).
+ # @return void
+ private method inst_CursorOrDisplayShift {} {
+
+ write_to_log I [mc "Received instruction: %s" "Cursor Or Display Shift"]
+ if {[must_not_be_enaged]} {return}
+ engage_core 40
+
+ set sc [expr {($inst_reg & 0x08) ? 1 : 0}]
+ set rl [expr {($inst_reg & 0x04) ? 1 : 0}]
+
+ write_to_log I "S/C = $sc, R/L = $rl"
+
+ # Shift display
+ if {$sc} {
+ # Right
+ if {$rl} {
+ incr display_shift -1
+ # Left
+ } else {
+ incr display_shift
+ }
+ # Move cursor
+ } else {
+ set address_counter_old $address_counter
+ # Right
+ if {$rl} {
+ incr address_counter
+ # Left
+ } else {
+ incr address_counter -1
+ }
+ move_cursor $address_counter
+ }
+
+ update_entry_boxes
+ refresh_display
+ }
+
+ ## HD44780 instruction: Function Set
+ # Sets interface data length (DL), number of display lines (N), and
+ #+ character font (F).
+ # @return void
+ private method inst_FunctionSet {} {
+ write_to_log I [mc "Received instruction: %s" "Function Set"]
+ if {[must_not_be_enaged]} {return}
+ engage_core 40
+
+ set diver_cfg(DL) [expr {($inst_reg & 0x10) ? 1 : 0}]
+ set diver_cfg(N) [expr {($inst_reg & 0x08) ? 1 : 0}]
+ set diver_cfg(F) [expr {($inst_reg & 0x04) ? 1 : 0}]
+
+ write_to_log I "DL = $diver_cfg(DL), N = $diver_cfg(N), F =$diver_cfg(F)"
+
+ update_entry_boxes
+ adjust_status_leds
+ refresh_display
+ }
+
+ ## HD44780 instruction: Set CGRAM Address
+ # Sets CGRAM address. CGRAM data is sent and received after this setting.
+ # @return void
+ private method inst_SetCGRAMAddress {} {
+ write_to_log I [mc "Received instruction: %s" "Set CGRAM Address"]
+ if {[must_not_be_enaged]} {return}
+ engage_core 40
+
+ set address_counter [expr {0x3F & $inst_reg}]
+
+ write_to_log I "ACG = $address_counter"
+
+ update_entry_boxes
+ }
+
+ ## HD44780 instruction: Set DDRAM Address
+ # Sets DDRAM address. DDRAM data is sent and received after this setting.
+ # @return void
+ private method inst_SetDDRAMAddress {} {
+ write_to_log I [mc "Received instruction: %s" "Set DDRAM Address"]
+ if {[must_not_be_enaged]} {return}
+ engage_core 40
+
+ set address_counter [expr {0x7F & $inst_reg}]
+ move_cursor $address_counter
+
+ write_to_log I "ADD = $address_counter"
+
+ update_entry_boxes
+ }
+
+ ## HD44780 instruction: Read Busy Flag & Address
+ # Reads busy flag (BF) indicating internal operation is being performed
+ #+ and reads address counter contents.
+ # @return void
+ private method inst_ReadBusyFlagAndAddress {} {
+ write_to_log I [mc "Received instruction: %s" "Read Busy Flag & Address"]
+
+ ## Simulate address counter update delay (approx. 6 us)
+ if {$diver_cfg(BF)} {
+ set return_value [expr {(($diver_cfg(BF) ? 1 : 0) << 7) + ($address_counter_old & 0x7f)}]
+ return
+ } elseif {($time_of_completion + 6) > [lindex [$project get_run_statistics] 0]} {
+ set return_value [expr {(($diver_cfg(BF) ? 1 : 0) << 7) + ($address_counter_old & 0x7f)}]
+ return
+ }
+
+ set return_value [expr {(($diver_cfg(BF) ? 1 : 0) << 7) + ($address_counter & 0x7f)}]
+ }
+
+ ## HD44780 instruction: Write Data To CG Or DDRAM
+ # Writes data into DDRAM or CGRAM.
+ # @return void
+ private method inst_WriteDataToCGOrDDRAM {} {
+ write_to_log I [mc "Received instruction: %s" "Write Data To CG Or DDRAM"]
+ if {[must_not_be_enaged]} {return}
+ engage_core 40
+
+ # Write to the Display Data RAM (DDRAM)
+ if {0x80 & $inst_reg} {
+ write_to_ddram $address_counter $data_reg
+ # Write to the Character Generator RAM (CGRAM)
+ } elseif {0x40 & $inst_reg} {
+ write_to_cgram [expr {($address_counter & 0xf8) >> 3}] [expr {$address_counter & 0x07}] $data_reg
+ # Write to nowhere -- Error condition, abort
+ } else {
+ write_to_log E [mc "Neither \"Set DDRAM Address\" nor \"Set CGRAM Address\" instruction was issued prior to the write instruction"]
+ return
+ }
+
+ # Perform automatic Address Counter (AC) update and display shift as described in the HD44780 manual
+ set address_counter_old $address_counter
+ if {$diver_cfg(ID)} {
+ incr address_counter
+ if {$diver_cfg(S)} {
+ incr display_shift -1
+ }
+ } else {
+ incr address_counter -1
+ if {$diver_cfg(S)} {
+ incr display_shift
+ }
+ }
+ set address_counter [expr {$address_counter % 0x80}]
+ set display_shift [expr {$display_shift % 0x80}]
+
+ # Synchronize with the LCD cursor
+ if {0x80 & $inst_reg} {
+ move_cursor $address_counter
+ }
+
+ # Update entry boxes showing content of some HD44780 registers
+ update_entry_boxes
+ }
+
+ ## HD44780 instruction: Read Data From CG Or DDRAM
+ # Reads data from DDRAM or CGRAM.
+ # @return void
+ private method inst_ReadDataFromCGOrDDRAM {} {
+ write_to_log I [mc "Received instruction: %s" "Read Data From CG Or DDRAM"]
+ if {[must_not_be_enaged]} {return}
+ engage_core 40
+
+ # Read from the Display Data RAM (DDRAM)
+ if {0x80 & $inst_reg} {
+ set return_value $ddram($address_counter)
+
+ # Read from the Character Generator RAM (CGRAM)
+ } elseif {0x40 & $inst_reg} {
+ set return_value 0
+ for {set i 4} {$i >= 0} {incr i -1} {
+ set return_value [expr {$return_value | ([lindex $cgram \
+ [expr {($address_counter & 0x38) >> 3}] \
+ [expr {$address_counter & 0x07}] \
+ [expr {4 - $i}]] << $i
+ )}]
+ }
+
+ # Read from nowhere -- Error condition, abort
+ } else {
+ write_to_log E [mc "Neither \"Set DDRAM Address\" nor \"Set CGRAM Address\" instruction was issued prior to the read instruction"]
+ return
+ }
+
+ # Perform automatic Address Counter (AC) update and display shift as described in the HD44780 manual
+ set address_counter_old $address_counter
+ if {$diver_cfg(ID)} {
+ incr address_counter
+ if {$diver_cfg(S)} {
+ incr display_shift -1
+ }
+ } else {
+ incr address_counter -1
+ if {$diver_cfg(S)} {
+ incr display_shift
+ }
+ }
+ set address_counter [expr {$address_counter % 0x80}]
+ set display_shift [expr {$display_shift % 0x80}]
+
+ # Synchronize with the LCD cursor
+ if {0x80 & $inst_reg} {
+ move_cursor $address_counter
+ }
+
+ # Update entry boxes showing content of some HD44780 registers
+ update_entry_boxes
+ }
+
+ ## Raise an error message if the core is engaged by some operation
+ # @return Bool - 0 == Not egaged; 1 == Is engaged
+ private method must_not_be_enaged {} {
+ if {$diver_cfg(BF)} {
+ if {$no_delays} {
+ set diver_cfg(BF) 0
+ } else {
+ write_to_log W [mc "Controller is busy, unable to execute requested instruction."]
+ return 1
+ }
+ } else {
+ return 0
+ }
+ }
+
+ ## Simulate the execution time of an operation
+ # @parm int time_us - Time for how long the HD44780 will be engaged by the operation in micro-seconds
+ # @return void
+ private method engage_core {time_us} {
+ # Mention it in the log
+ write_to_log I [mc "Commencing execution, this action will take %d micro-seonds to comply." $time_us]
+
+ # Skip delay if the simulator has been configure this way
+ if {$no_delays} {
+ set time_us 0
+ write_to_log I [mc "Skipping delay"]
+ }
+
+ # Set time when the execution will be completed (time is taken from the MCU simulator engine)
+ set time_of_completion [lindex [$project get_run_statistics] 0]
+ incr time_of_completion [expr {$time_us * 1000}]
+
+ # Set the Busy Flag
+ if {$no_delays} {
+ set diver_cfg(BF) 0
+ } else {
+ set diver_cfg(BF) 1
+ }
+
+ # Synchronize with the status LEDs
+ adjust_status_leds
+ }
+
+ ## Reset the simulated HD44780 controller
+ # @return void
+ public method reset_hd44780 {} {
+ set inhibit_vcmd 1 ;# Disable validation function for entryboxes like "IR:" or "AC:"
+
+ # Fill the DDRAM with 0x20 (SPACE) characters
+ clear_ddram
+
+ # Reset some object variables containing LCD display configuration
+ set display_shift 0 ;# Current display shift, this value suppose to be added to the AC
+ set address_counter 0 ;# Address Counter (AC) as specified in the HD44780 manual
+ set inst_reg 0 ;# Instruction register (IR) as specified in the HD44780 manual
+ set data_reg 0 ;# Data register (DR) as specified in the HD44780 manual
+
+ # Array of HD44780 configuration flags
+ set diver_cfg(ID) 1 ;# 0 == Decrement ; 1 == Increment
+ set diver_cfg(S) 0 ;# 0 == (Normal) ; 1 == Accompanies display shift
+ set diver_cfg(D) 0 ;# 0 == Display OFF ; 1 == Display ON
+ set diver_cfg(C) 0 ;# 0 == Cursor OFF ; 1 == Cursor ON
+ set diver_cfg(B) 0 ;# 0 == Cursor blinking OFF ; 1 == Cursor blinking ON
+ set diver_cfg(DL) 1 ;# 0 == 4-bit data transfer ; 1 == 8-bit data transfer
+ set diver_cfg(N) 0 ;# 0 == 1 line display ; 1 == 2 lines display
+ set diver_cfg(F) 0 ;# 0 == 5 × 8 dots ; 1 == 5 × 10 dots
+ set diver_cfg(BF) 0 ;# 0 == Instructions acceptable ; 1 == Internally operating
+ set diver_cfg(OMN) 0 ;# 0 == Transfer completed ; 1 == One More Nibble to transfer
+
+ clear_display ;# Ensure that that the LCD dot matrix is clear
+ clear_cursor ;# Make the LCD cursor disappear
+ adjust_status_leds ;# Synchronize with the status LEDs (right from the LCD dot matrix)
+ update_entry_boxes ;# Update entryboxes like "IR:" or "AC:"
+
+ # Mention this in the log
+ write_to_log I [mc "Device reset"]
+
+ set inhibit_vcmd 0 ;# Enable validation function for entryboxes like "IR:" or "AC:"
+ }
+
+ ## Write octet into Display Data RAM (DDRAM)
+ # @parm Int address - Address in DDRAM [0;7f]
+ # @parm Int char_code - Octet to write
+ # @parm Bool do_not_affect_hexeditor=0 - Do not synchronize wit the DDRAM hex editor window
+ # @return void
+ public method write_to_ddram {address char_code {do_not_affect_hexeditor 0}} {
+ # Validate the given address
+ if {$address > 0x7f} {
+ write_to_log W [mc "DDRAM address is too high: %d" $address]
+ }
+
+ # Write to the actual DDRAM
+ set ddram($address) $char_code
+
+ # Synchronize the DDRAM hex editor window if it is allowed and possible
+ if {$ddram_hexeditor != {} && !$do_not_affect_hexeditor} {
+ $ddram_hexeditor setValue $address $char_code
+ $ddram_hexeditor setHighlighted $address 1
+ }
+
+ # Determinate target position
+ set position [address_to_position $address]
+
+ # ABORT! if the target position is out of visible range
+ if {![is_position_visible $position]} {
+
+ return
+ }
+
+ ## Convert position into row and column
+ # Two lines display
+ if {$diver_cfg(N) && $display_height == 2 && $position >= 0x40} {
+ set col [expr {$position - 0x40}]
+ set row 1
+ # One line display
+ } else {
+ set col $position
+ set row 0
+ }
+
+ ## Get character bitmap image
+ # Access to CGRAM (Character Generator RAM)
+ if {$char_code < 16} {
+ set char_pattern [lindex $cgram $char_code]
+ # Access to CGROM (Character Generator ROM)
+ } else {
+ incr char_code -16
+ set char_pattern [lindex $CGROM [list $rom_code $char_code]]
+ }
+
+ # Determinate actual character height
+ if {$display_height == 1 && $diver_cfg(F)} {
+ set max_char_row [expr {8 + 2 * $lcd_char_size}]
+ } else {
+ set max_char_row 8
+ }
+
+ ## Adjust the LCD dot matrix
+ # Iterate over rows
+ for {set y 0} {$y < $max_char_row} {incr y} {
+ # Iterate over columns
+ for {set x 0} {$x < 5} {incr x} {
+ if {$diver_cfg(D) && [lindex $char_pattern [list $y $x]]} {
+ set color $ON_COLOR
+ } else {
+ set color $OFF_COLOR
+ }
+ $canvas_widget itemconfigure $lcd_pixel($col,$row,$x,$y) -fill $color
+ }
+ }
+ }
+
+ ## Write one row of character patter into the Character Generator RAM (CGRAM)
+ # @parm Int char_code - Number of the user defined character [0;7]
+ # @parm Int row - Row in the patter [0;7] (0 - top; 7 - bottom)
+ # @parm List data - Pattern fragment in decimal representation (e.g. 0x15 means {1 0 1 0 1} or 0x03 means {0 0 1 1 1})
+ # @parm Bool do_not_affect_hexeditor=0 - Do not synchronize wit the CGRAM hex editor window
+ # @return void
+ private method write_to_cgram {char_code row data {do_not_affect_hexeditor 0}} {
+
+ # Validate input data
+ if {$char_code > 7} {
+ write_to_log W [mc "CGRAM address is too high: %d" $char_code]
+ }
+ if {$data > 31} {
+ write_to_log W [mc "Value is too high: 0x%X" $data]
+ set data [expr {$data & 0x1f}]
+ }
+ set char_code [expr {$char_code % 8}]
+
+ # Convert the given pattern fragment to this format:
+ #+ {B B B B B}, where B is 0 or 1, 0 == blank dot, 1 == black dot
+ set char_pattern [list]
+ for {set i 4} {$i >= 0} {incr i -1} {
+ lappend char_pattern [expr {($data & (1 << $i)) ? 1 : 0}]
+ }
+
+ # Write to the CGRAM
+ lset cgram [list $char_code $row] $char_pattern
+
+ # Synchronize the CGRAM viewer
+ for {set col 0} {$col < 5} {incr col} {
+ if {[lindex $char_pattern $col]} {
+ set color $ON_COLOR
+ } else {
+ set color $OFF_COLOR
+ }
+ $canvas_widget itemconfigure $cgram_pixel($char_code,$col,$row) -fill $color
+ }
+
+ # Synchronize the CGRAM hex editor window if it is allowed and possible
+ if {$cgram_hexeditor != {} && !$do_not_affect_hexeditor} {
+ set addr [expr {($char_code << 3) | $row}]
+ $cgram_hexeditor setValue $addr $data
+ $cgram_hexeditor setHighlighted $addr 1
+ }
+ }
+
+ ## Fill the entire Character Generator RAM (CGRAM) with zeros
+ # @return void
+ private method clear_cgram {} {
+ # Dispose the CGRAM memory
+ set cgram [list]
+
+ # Generate an empty character pattern
+ set char [list]
+ for {set i 0} {$i < 8} {incr i} {
+ lappend char [list 0 0 0 0 0]
+ }
+
+ # Refill the CGRAM memory
+ for {set i 0} {$i < 16} {incr i} {
+ lappend cgram $char
+ }
+
+ # Synchronize the CGRAM viewer
+ if {$canvas_widget != {}} {
+ for {set i 0} {$i < 8} {incr i} {
+ for {set y 0} {$y < 8} {incr y} {
+ for {set x 0} {$x < 5} {incr x} {
+ $canvas_widget itemconfigure $cgram_pixel($i,$x,$y) -fill $OFF_COLOR
+ }
+ }
+ }
+ }
+
+ # Synchronize the CGRAM hex editor window if possible
+ if {$cgram_hexeditor != {}} {
+ for {set i 0} {$i < 64} {incr i} {
+ $cgram_hexeditor setValue $i 0
+ }
+ }
+ }
+
+ ## Fill the entire Display Data RAM (DDRAM) with 0x20 characters (SPACE), but do not refresh the display
+ # @return void
+ private method clear_ddram {} {
+ # Fill the DDRAM
+ for {set i 0} {$i < 0x80} {incr i} {
+ set ddram($i) 32 ;# 0x20 (SPACE) character
+ }
+
+ # Synchronize the DDRAM hex editor window is possible
+ if {$ddram_hexeditor != {}} {
+ for {set i 0} {$i < 0x80} {incr i} {
+ $ddram_hexeditor setValue $i $ddram($i)
+ }
+ }
+ }
+
+ ## Clear the entire Display Data RAM and Character Generator RAM
+ # @return void
+ public method clear_xxRAM {} {
+ clear_ddram
+ clear_cgram
+ refresh_display
+ }
+
+ ## Determinate whether the specified position is visible or not
+ # @parm Int position - Position address [0,7f]
+ # @return Bool - 1 == Visible; 0 == Not visible
+ private method is_position_visible {position} {
+ if {$position < 0} {
+ return 0
+ }
+
+ if {$position >= 0x80} {
+ return 0
+ }
+
+ if {$position >= $display_width} {
+ if {$display_height == 1} {
+ return 0
+ } else {
+ if {!$diver_cfg(N)} {
+ return 0
+ } elseif {$position < 0x40 || $position >= ($display_width + 0x40)} {
+ return 0
+ }
+ }
+ }
+
+ return 1
+ }
+
+ ## Refresh display according to the DDRAM content and (new) HD44780 configuration
+ # @return void
+ private method refresh_display {} {
+ for {set i 0} {$i < 0x80} {incr i} {
+ write_to_ddram $i $ddram($i) 1
+ }
+ move_cursor $address_counter
+ }
+
+ ## Ensure that that the LCD dot matrix is clear
+ # @return void
+ private method clear_display {} {
+ for {set row 0} {$row < $display_height} {incr row} {
+ for {set col 0} {$col < $display_width} {incr col} {
+ for {set i 0} {$i < (8 + 2 * $lcd_char_size)} {incr i} {
+ for {set j 0} {$j < 5} {incr j} {
+ $canvas_widget itemconfigure $lcd_pixel($col,$row,$j,$i) -fill $OFF_COLOR
+ }
+ }
+ }
+ }
+ }
+
+
+ ## Make the LCD cursor disappear
+ # @return void
+ private method clear_cursor {} {
+ # Determinate target position
+ set position [address_to_position $cursor_address]
+
+ # ABORT! if the target position is out of visible range
+ if {![is_position_visible $position]} {
+ return
+ }
+
+ ## Convert position into row and column
+ # Two lines display
+ if {$diver_cfg(N) && $display_height == 2 && $position >= 0x40} {
+ set col [expr {$position - 0x40}]
+ set row 1
+ # One line display
+ } else {
+ set col $position
+ set row 0
+ }
+
+ # Blinking cursor
+ if {$diver_cfg(B_pre)} {
+ if {$cursor_timer != {}} {
+ after cancel $cursor_timer
+ set cursor_timer {}
+ }
+
+ # Overwrite the cursor with actual character at its position
+ write_to_ddram $cursor_address $ddram($cursor_address) 1
+
+ # Normal cursor
+ } else {
+ if {$diver_cfg(F_pre)} {
+ if {$lcd_char_size} {
+ set max_char_row 9
+ } {
+ set max_char_row -1
+ }
+ } else {
+ set max_char_row 7
+ }
+ if {$max_char_row != -1} {
+ for {set x 0} {$x < 5} {incr x} {
+ $canvas_widget itemconfigure $lcd_pixel($col,$row,$x,$max_char_row) -fill $OFF_COLOR
+ }
+ }
+ }
+ }
+
+ ## Draw LCD cursor according to current HD44780 settings and at position given by variable $cursor_address
+ # @return void
+ private method draw_cursor {} {
+ # Cursor is disabled -- abort
+ if {!$diver_cfg(C)} {
+ return
+ }
+
+ # Determinate target position
+ set position [address_to_position $cursor_address]
+
+ # Abort if the target position is out of visible range
+ if {![is_position_visible $position]} {
+ return
+ }
+
+ ## Convert position into row and column
+ # Two lines display
+ if {$diver_cfg(N) && $display_height == 2 && $position >= 0x40} {
+ set col [expr {$position - 0x40}]
+ set row 1
+ # One line display
+ } else {
+ set col $position
+ set row 0
+ }
+
+ # Cursor appearance is affected also by the font size
+ if {$diver_cfg(F)} {
+ if {$lcd_char_size} {
+ set max_char_row 10
+ } else {
+ set max_char_row -1
+ }
+ } {
+ set max_char_row 8
+ }
+
+ set diver_cfg(B_pre) $diver_cfg(B)
+ set diver_cfg(F_pre) $diver_cfg(F)
+
+ # Draw blinking cursor
+ if {$diver_cfg(B)} {
+ # Stop the LCD cursor blinking timer
+ if {$cursor_timer != {}} {
+ after cancel $cursor_timer
+ }
+ # Normalize number of rows of the cursor rectangle
+ if {$max_char_row == -1} {
+ set max_char_row 8
+ }
+ # Draw the black cursor rectangle
+ for {set y 0} {$y < $max_char_row} {incr y} {
+ for {set x 0} {$x < 5} {incr x} {
+ $canvas_widget itemconfigure $lcd_pixel($col,$row,$x,$y) -fill $ON_COLOR
+ }
+ }
+ # Start the LCD cursor blinking timer
+ set cursor_timer [after [expr {int(1000 / $CURSOR_BLINK_FREQUENCY)}] [list $this cursor_timer_callback 1]]
+
+ # Draw normal cursor (a sort of underscore)
+ } else {
+ if {$max_char_row != -1} {
+ incr max_char_row -1
+ for {set x 0} {$x < 5} {incr x} {
+ $canvas_widget itemconfigure $lcd_pixel($col,$row,$x,$max_char_row) -fill $ON_COLOR
+ }
+ }
+ }
+ }
+
+ ## Move the LCD cursor to a new location
+ # @parm Int new_address - Address in DDRAM
+ # @return void
+ #
+ # Note: This function could be also used to refresh the cursor
+ private method move_cursor {new_address} {
+ clear_cursor
+ set cursor_address $new_address
+ draw_cursor
+ }
+
+ ## Callback function fo the LCD cursor blinking timer
+ # @parm Bool clear - 1 == Clear the cursor rectangle; 0 == Draw the cursor rectangle
+ # @return void
+ public method cursor_timer_callback {clear} {
+ if {$clear} {
+ clear_cursor
+
+ # Reset the LCD cursor blinking timer
+ if {$diver_cfg(B) && $diver_cfg(C)} {
+ set cursor_timer [after [expr {int(1000 / $CURSOR_BLINK_FREQUENCY)}] [list $this cursor_timer_callback 0]]
+ }
+
+ } elseif {$diver_cfg(B) && $diver_cfg(C)} {
+ draw_cursor
+ }
+ }
+
+ ## Convert the specified DDRAM address into position in the LCD dot matrix
+ # @parm int ddram_address - Address to convert, must be be in interval [0;7f]!
+ # @return Int - The position [0;7f]
+ private method address_to_position {ddram_address} {
+ # Two lines display
+ if {$diver_cfg(N)} {
+ set position [expr {($ddram_address + $display_shift) % 0x40}]
+ if {$ddram_address >= 0x40} {
+ incr position 0x40
+ }
+
+ # One line display
+ } else {
+ set position [expr {($ddram_address + $display_shift) % 0x80}]
+ }
+
+ return $position
+ }
+
+ ## Start execution of the requested instruction
+ # @see new_state
+ # @parm List state - Port states ( 5 x {8 x bit} -- {bit0 bit1 bit2 ... bit7} )
+ # @return state - New port states modified by this device
+ # format is the same as parameter $state
+ private method commence_operations {_state} {
+ upvar $_state state
+
+ # Detect falling edge on signal E (Enable) & Completed data transfer (in case of 4-bit mode)
+ #+ --> Input instruction or data
+ if {$signal_E_prev && !$signal_E && !$diver_cfg(OMN)} {
+ # Manage Busy Flag
+ if {$diver_cfg(BF)} {
+ # Simulated execution times are disabled
+ if {$no_delays} {
+ # Clear the Busy Flag unconditionally
+ set diver_cfg(BF) 0
+ adjust_status_leds
+ write_to_log I [mc "Operation finished"]
+
+ # Simulated execution times are enabled
+ } else {
+ # Clear the Busy Flag if the execution time already passed
+ set current_time [$project get_run_statistics 0]
+ if {$current_time >= $time_of_completion} {
+ set diver_cfg(BF) 0
+ adjust_status_leds
+ write_to_log I [mc "Operation finished"]
+ }
+ }
+ }
+
+ # Write to log the last I/O error if there is one
+ if {$input_error} {
+ write_to_log E [mc "Input is corrupted: %s" $input_error_desc]
+ }
+
+ # Input an "regular" instruction (write to the IR)
+ if {!$signal_RS && !$signal_RW} {
+ set return_value -1
+
+ # Update the IR (Instruction Register)
+ set inst_reg $signal_D
+ update_entry_boxes
+
+ # Instruction: Set DDRAM Address (1 ADD ADD ADD | ADD ADD ADD ADD)
+ if {0x80 & $signal_D} {
+ inst_SetDDRAMAddress
+
+ # Instruction: Set CGRAM Address (0 1 ACG ACG | ACG ACG ACG ACG)
+ } elseif {0x40 & $signal_D} {
+ inst_SetCGRAMAddress
+
+ # Instruction: Function Set (0 0 1 DL | N F - -)
+ } elseif {0x20 & $signal_D} {
+ inst_FunctionSet
+
+ # Instruction: Cursor Or Display Shift (0 0 0 1 | S/C R/L - -)
+ } elseif {0x10 & $signal_D} {
+ inst_CursorOrDisplayShift
+
+ # Instruction: Display On Off Control (0 0 0 0 | 1 D C B)
+ } elseif {0x08 & $signal_D} {
+ inst_DisplayOnOffControl
+
+ # Instruction: Entry Mode Set (0 0 0 0 | 0 1 I/D S)
+ } elseif {0x04 & $signal_D} {
+ inst_EntryModeSet
+
+ # Instruction: Return Home (0 0 0 0 | 0 0 1 -)
+ } elseif {0x02 & $signal_D} {
+ inst_ReturnHome
+
+ # Instruction: Clear Display (0 0 0 0 | 0 0 0 1)
+ } elseif {0x01 & $signal_D} {
+ inst_ClearDisplay
+
+ # Code 0 -- Invalid instruction
+ } else {
+ write_to_log W [mc "Invalid instruction: %2Xh" $signal_D]
+ }
+
+ # Read Busy Flag And Address
+ } elseif {!$signal_RS && $signal_RW} {
+ set data_reg $signal_D
+ update_entry_boxes
+ inst_ReadBusyFlagAndAddress
+
+ # Write Data To CG Or DDRAM
+ } elseif {$signal_RS && !$signal_RW} {
+ set return_value -1
+
+ set data_reg $signal_D
+ update_entry_boxes
+ inst_WriteDataToCGOrDDRAM
+
+ # Read Data From CG Or DDRAM
+ } elseif {$signal_RS && $signal_RW} {
+ set data_reg $signal_D
+ update_entry_boxes
+ inst_ReadDataFromCGOrDDRAM
+ }
+ }
+
+ # Detect signal Enable & Read request & Ready state (not busy) & Data waiting to be send ($return_value)
+ #+ --> Output data
+ if {$signal_E && $signal_RW && !$diver_cfg(BF) && $return_value != -1} {
+
+ # 8-bit transfer mode
+ if {$diver_cfg(DL)} {
+ for {set i 3} {$i < 11} {incr i} {
+ set pp [which_port_pin $i]
+ if {[lindex $pp 0] != {-} && [lindex $pp 1] != {-}} {
+ lset state $pp [expr {($return_value & (1 << (10 - $i))) ? 1 : 0}]
+ }
+ }
+
+ # 4-bit transfer mode
+ } else {
+ if {$diver_cfg(OMN)} {
+ set bus_offset 10
+ } else {
+ set bus_offset 14
+ }
+ for {set i 7} {$i < 11} {incr i} {
+ set pp [which_port_pin $i]
+ if {[lindex $pp 0] != {-} && [lindex $pp 1] != {-}} {
+ lset state $pp [expr {($return_value & (1 << ($bus_offset - $i))) ? 1 : 0}]
+ }
+ }
+
+ # Invert flag "One More Nibble"
+ set diver_cfg(OMN) [expr {$diver_cfg(OMN) ? 0 : 1}]
+ adjust_status_leds
+ }
+ }
+ }
+
+
+ # ------------------------------------------------------------------
+ # VIRTUAL HW COMMON INTERFACE
+ # ------------------------------------------------------------------
+
+ ## Simulated MCU has been changed
+ # @return void
+ public method mcu_changed {} {
+ # Refresh lists of possible values in port selection ComboBoxes
+ set available_ports [concat - [$project pale_get_available_ports]]
+
+ # Configure the ComboBoxes
+ for {set i 0} {$i < 11} {incr i} {
+ $canvas_widget.cb_p$i configure -values $available_ports
+
+ if {[lsearch -ascii -exact $available_ports $connection_port($i)] == -1} {
+ $canvas_widget.cb_p$i current 0
+ set connection_port($i) {-}
+ }
+ }
+ }
+
+ ## Accept new state of ports
+ # @parm List state - Port states ( 5 x {8 x bit} -- {bit0 bit1 bit2 ... bit7} )
+ # @return state - New port states modified by this device
+ # format is the same as parameter $state
+ #
+ # Possible bit values:
+ # '|' - High frequency
+ # 'X' - Access to external memory
+ # '?' - No volatge
+ # '-' - Indeterminable value (some noise)
+ # '=' - High forced to low
+ # '0' - Logical 0
+ # '1' - Logical 1
+ public method new_state {_state} {
+ upvar $_state state
+
+ # Start execution of the last requested instruction. It's done this way in order to cope with
+ #+ multiple new_state invocations during the Virtual HW evaluation loop
+ if {$time_mark != [$project get_run_statistics 2]} {
+ commence_operations state
+ set time_mark [$project get_run_statistics 2]
+ set signal_E_prev $signal_E
+ }
+
+ # Reset last I/O error
+ set input_error 0
+ set input_error_desc {}
+
+ # Iterate over all I/O lines
+ for {set i 0} {$i < 11} {incr i} {
+ # Determinate index in the list of port states
+ set pp [which_port_pin $i]
+
+ # Not connected
+ if {[lindex $pp 0] == {-} || [lindex $pp 1] == {-}} {
+ $canvas_widget itemconfigure $signal_label($i) -fill {#000000}
+ set signal_value {}
+ } else {
+ set signal_value [lindex $state $pp]
+ }
+
+ # Determinate the color for the PIN label
+ switch -- $signal_value {
+ {0} { ;# Logical 0
+ set label_color {#00FF00}
+ }
+ {1} { ;# Logical 1
+ set label_color {#FF0000}
+ }
+ {=} { ;# High forced to low
+ set label_color {#00FF00}
+ }
+ {?} { ;# No volatge
+ set label_color {#888888}
+ }
+ {} { ;# Not connected
+ set label_color {#000000}
+ }
+ default {
+ set label_color {#FF8800}
+ }
+ }
+
+ # Change color of the PIN label
+ $canvas_widget itemconfigure $signal_label($i) -fill $label_color
+
+ # Convert any possible I/O signal value to Boolean value
+ switch -- $signal_value {
+ {0} -
+ {1} {}
+ {=} {
+ set signal_value 0
+ }
+ default {
+ if {$diver_cfg(DL) || $i >= 7} {
+ set input_error 1
+ set input_error_desc [mc \
+ "Received an invalid input on signal %s" \
+ [lindex $SIGNAL_NAMES $i]
+ ]
+ set signal_value [expr {rand() > 0.5 ? 1 : 0}]
+ }
+ }
+ }
+
+ # Process the input
+ switch -- $i {
+ {0} {
+ # Signal Register Select
+ set signal_RS $signal_value
+ }
+ {1} {
+ # Signal Read/Write
+ set signal_RW $signal_value
+ }
+ {2} {
+ # Signal Enable
+ set signal_E $signal_value
+ }
+ {3} -
+ {4} -
+ {5} -
+ {6} -
+ {7} -
+ {8} -
+ {9} -
+ {10} { ;# 8-bit data bus
+
+ # Set received data to zero when the first bit is received
+ if {$i == 3 && !$diver_cfg(OMN)} {
+ set signal_D 0
+ }
+
+ # 8-bit transfer mode
+ if {$diver_cfg(DL) && !$signal_RW} {
+ set signal_D [expr {$signal_D | ($signal_value << (10 - $i))}]
+
+ # 4-bit transfer mode -- accept data on rising edge of signal E (Enable) from DB4..DB7
+ } elseif {!$signal_RW && $signal_E_prev && !$signal_E && $i < 7} {
+ if {$diver_cfg(OMN)} {
+ set signal_D [expr {$signal_D | ($signal_value << (6 - $i))}]
+ } else {
+ set signal_D [expr {$signal_D | ($signal_value << (10 - $i))}]
+ }
+
+ if {$i == 6} {
+ if {$diver_cfg(OMN)} {
+ set diver_cfg(OMN) 0
+ write_to_log I [mc "Receiving the Less Significant Nibble (%02Xh)" [expr {$signal_D & 0x0F}]]
+ } else {
+ set diver_cfg(OMN) 1
+ write_to_log I [mc "Receiving the More Significant Nibble (%02Xh)" [expr {$signal_D & 0xF0}]]
+ }
+ adjust_status_leds
+ }
+ }
+ }
+ }
+ }
+ }
+
+ ## Withdraw panel window from the screen
+ # @return void
+ public method withdraw_window {} {
+ wm withdraw $win
+ }
+
+ ## Get panel configuration list (usable with method "set_config")
+ # @return List - configuration list
+ public method get_config {} {
+ # Get DDRAM hex editor windows parameters is it's visible
+ if {$ddram_hexeditor != {}} {
+ set ddram_window_params [list 1 [wm geometry $win.ddram_window]]
+ }
+ # Get CGRAM hex editor windows parameters is it's visible
+ if {$cgram_hexeditor != {}} {
+ set cgram_window_params [list 1 [wm geometry $win.cgram_window]]
+ }
+
+ # Formulate the result
+ return [list \
+ $class_name \
+ [list \
+ $display_height \
+ $display_width \
+ [wm geometry $win] \
+ [array get connection_port] \
+ [array get connection_pin] \
+ [$canvas_widget.usr_note get] \
+ $visible_lr \
+ $visible_ud \
+ $rom_code \
+ $lcd_char_size \
+ $ignore_errors \
+ $no_delays \
+ [wm geometry $win.log_window] \
+ [wm state $win.log_window] \
+ $ddram_window_params \
+ $cgram_window_params \
+ $log_enabled \
+ $keep_win_on_top \
+ ] \
+ ]
+ }
+
+ ## Set panel configuration from list gained from method "get_config"
+ # @parm List state - Configuration list
+ # @return void
+ public method set_config {state} {
+ if {[catch {
+ # Determinate whether we are re-configuring already operating
+ #+ HD44780 simulator or creating a new one from scratch
+ set new_instance [expr {![winfo exists $win]}]
+
+ # Set display width (number of columns) and height (number of rows)
+ if {$new_instance} {
+ set display_height [lindex $state 0]
+ set display_width [lindex $state 1]
+ }
+
+ # Load connections to the MCU (port numbers)
+ if {[llength [lindex $state 3]]} {
+ array set connection_port [lindex $state 3]
+ } else {
+ array set connection_port {0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 -}
+ }
+
+ # Load connections to the MCU (port pin numbers)
+ if {[llength [lindex $state 4]]} {
+ array set connection_pin [lindex $state 4]
+ } else {
+ array set connection_pin {0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 -}
+ }
+
+ # Set flags: "Right part visible" and "Bottom part visible"
+ if {[string length [lindex $state 6]]} {
+ set visible_lr [lindex $state 6]
+ }
+ if {[string length [lindex $state 7]]} {
+ set visible_ud [lindex $state 7]
+ }
+
+ # Set font to use (specification of character patterns not their size)
+ if {[string length [lindex $state 8]]} {
+ set rom_code [lindex $state 8]
+ }
+
+ # Set font size to use (could be 5×8 or 5×10)
+ if {[string length [lindex $state 9]]} {
+ set lcd_char_size [lindex $state 9]
+
+ # Validate value of character size parameter
+ if {$display_height == 2 && $lcd_char_size == 1} {
+ set lcd_char_size 0
+ }
+ }
+
+ # Flags: "Ignore errors" and "Disable delays"
+ if {[string length [lindex $state 10]]} {
+ set ignore_errors [lindex $state 10]
+ }
+ if {[string length [lindex $state 11]]} {
+ set no_delays [lindex $state 11]
+ }
+
+ # Log window parameters
+ set log_window_geometry [lindex $state 12]
+ set log_window_state [lindex $state 13]
+
+ # DDRAM and CGRAM hex editor windows parameters
+ if {[string length [lindex $state 14]]} {
+ set ddram_window_params [lindex $state 14]
+ }
+ if {[string length [lindex $state 15]]} {
+ set cgram_window_params [lindex $state 15]
+ }
+
+ # Enable or disable logging of events
+ if {[string length [lindex $state 16]]} {
+ set log_enabled [lindex $state 16]
+ }
+
+ if {[lindex $state 17] != {}} {
+ set keep_win_on_top [lindex $state 17]
+ }
+
+ # Fail
+ }]} then {
+ puts stderr "Unable to load configuration for $class_name"
+ return 0
+
+ # Success
+ } else {
+ if {$new_instance} {
+ # Create panel GUI
+ create_gui
+ create_log $log_window_geometry
+ reset_hd44780
+ mcu_changed
+
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1
+ }
+
+ # Display the log window
+ if {$log_window_state == {normal}} {
+ show_log
+ }
+
+ # Initialize HD44780 simulator
+ clear_cgram
+ on_off [$project pale_is_enabled]
+ }
+
+ # Restore window geometry
+ if {[string length [lindex $state 2]]} {
+ wm geometry $win [regsub {^\=?\d+x\d+} [lindex $state 2] [regsub {\+\d+\+\d+} [wm geometry $win] {}]]
+ }
+
+ # Load user note
+ if {[string length [lindex $state 5]]} {
+ $canvas_widget.usr_note delete 0
+ $canvas_widget.usr_note insert 0 [lindex $state 5]
+ }
+
+ # Hide some parts of the window accordingly to the settings
+ if {!$visible_lr} {
+ set visible_lr 1
+ show_hide1
+ }
+ if {!$visible_ud} {
+ set visible_ud 1
+ show_hide0
+ }
+
+ # Adjust log enable/disable checkbox
+ if {$log_enabled} {
+ $log_on_off_chbut select
+ } else {
+ $log_on_off_chbut deselect
+ }
+
+ # Restore/Set state of ComboBoxes
+ for {set i 0} {$i < 11} {incr i} {
+ ## PIN
+ set pin $connection_pin($i)
+ if {$pin != {-}} {
+ set pin [expr {7 - $pin}]
+ }
+ set idx [lsearch -ascii -exact \
+ [$canvas_widget.cb_b$i cget -values] \
+ $pin \
+ ]
+ if {$idx == -1} {
+ set idx 0
+ }
+ $canvas_widget.cb_b$i current $idx
+
+ ## PORT
+ set idx [lsearch -ascii -exact \
+ [$canvas_widget.cb_p$i cget -values] \
+ $connection_port($i) \
+ ]
+ if {$idx == -1} {
+ set idx 0
+ }
+ if {[llength [$canvas_widget.cb_p$i cget -values]]} {
+ $canvas_widget.cb_p$i current $idx
+ }
+ }
+
+ # Adjust display appearance to fit the current character size
+ accept_new_character_size
+
+ # Adjust internal logic and the rest of PALE
+ evaluete_enaged_pins
+ $project pale_reevaluate_IO
+
+ # Display the DDRAM and CGRAM hex editor windows
+ if {$new_instance} {
+ if {[lindex $ddram_window_params 0]} {
+ show_ddram
+ }
+ if {[lindex $cgram_window_params 0]} {
+ show_cgram
+ }
+ }
+
+ # Accept new state of ports
+ if {$new_instance} {
+ set state [$project pale_get_true_state]
+ new_state state
+ }
+
+ # Finalize ...
+ clear_modified
+ update
+
+ return 1
+ }
+ }
+
+ ## Simulated MCU has been reset
+ # @return void
+ public method reset {} {
+ # There is nothing special what has to be done here, the
+ #+ controller, HD44780, has its own reset mechanism independent
+ #+ on the simulated MCU
+ }
+
+
+ # ------------------------------------------------------------------
+ # VIRTUAL HW COMMON INTERFACE -- CALLED FROM THE BASE CLASS
+ # ------------------------------------------------------------------
+
+ ## This method is called before configuration menu invocation
+ # @return void
+ public method config_menu_special {} {
+ set ::${class_name}::font_id $rom_code
+ set ::${class_name}::char_size $lcd_char_size
+ set ::${class_name}::_ignore_errors $ignore_errors
+ set ::${class_name}::_no_delays $no_delays
+ set ::${class_name}::menu_keep_win_on_top $keep_win_on_top
+ }
+
+ ## This method is called after configuration menu is created
+ # @return void
+ public method create_config_menu_special {} {
+ # Changing character size is allowed only for 1 line displays
+ if {$display_height == 2} {
+ set state {disabled}
+ } else {
+ set state {normal}
+ }
+ $conf_menu entryconfigure [mc "Set character size"] -state $state
+ }
+
+ ## This method is called to fill in the help dialog
+ # @parm Widget text_widget - Target text widget
+ # @return void
+ #
+ # Note: There is defined text tag "tag_bold" in the text widget
+ public method show_help_special {text_widget} {
+ $text_widget insert insert [mc "LCD display controled by HD44780 driver\n\n"]
+
+ $text_widget insert insert [mc "This tool simulates a HD44780 character LCD of any size up to 2 rows and 64 columns. There are 11 lines serving as interface for the MCU, ``E'', ``RS'', ``R/W'' and ``D0''..``D7''. User can view end modify content of display data RAM (DDRAM), character generator RAM (CGRAM) and certain HD44780 registers: instruction register (IR), data register (DR), address counter (AC) and display shift, these registers are shown hexadecimal. User can also view content of character generator ROM (CGROM) and set font to use. All of the driver command are fully supported, all important events occurring in the simulated driver (HD44780) are recorded in the log. User can also see and modify certain HD44780 configuration flags like ``B'', ``S'', ``D'' and so on."]
+ }
+
+ ## This method is called before panel window closure
+ # @return void
+ public method close_window_special {} {
+ }
+
+ ## Commit new on/off state
+ # @return void
+ public method on_off_special {} {
+ # Boot-up the controller, it takes 10ms according to manual
+ if {[$project pale_is_enabled]} {
+ # Clear CGRAM and reset the code
+ clear_cgram
+ reset_hd44780
+
+ # Update log
+ write_to_log I [mc "Starting the HD44780 boot-up sequence."]
+
+ # Ensure that that the LCD dot matrix is clear
+ clear_display
+
+ # On a real HW would take about 10 ms
+ engage_core 10000
+ }
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/pale/leddisplay.tcl b/lib/pale/leddisplay.tcl
index 55b13a5..44cc7ad 100755..100644
--- a/lib/pale/leddisplay.tcl
+++ b/lib/pale/leddisplay.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 _LEDDISPLAY_TCL ] } {
+set _LEDDISPLAY_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
@@ -36,7 +41,11 @@ class LedDisplay {
inherit VirtualHWComponent
# Font: Font to be used in the panel -- bold
- common cb_font [font create -weight bold -size -10 -family {helvetica}]
+ common cb_font [font create \
+ -weight bold \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -family {helvetica} \
+ ]
common COMPONENT_NAME "LED Display" ;# Name of this component
common CLASS_NAME "LedDisplay" ;# Name of this class
common COMPONENT_ICON {leddisplay} ;# Icon for this panel (16x16)
@@ -53,16 +62,17 @@ class LedDisplay {
{#5555AA #0000FF}
{#AA55AA #8800FF}
}
+ common DIMMED_COLOR {#BBBBBB}
# Configuration menu
common CONFMENU {
{cascade {Common electrode} 7 "diode" .ca false 1 {
{radiobutton "Common anode" {}
::LedDisplay::cfg_common_anode 1
- "common_electrode_chanded" 7 ""}
- {radiobutton "Common catode" {}
+ "common_electrode_changed" 7 ""}
+ {radiobutton "Common cathode" {}
::LedDisplay::cfg_common_anode 0
- "common_electrode_chanded" 7 ""}
+ "common_electrode_changed" 7 ""}
}}
{cascade {Color} 0 "colorize" .color false 1 {
{radiobutton "Red" {}
@@ -92,15 +102,20 @@ class LedDisplay {
"Save configuration into a file"}
{command {Load configuration} {} 0 "load_from" {fileopen}
"Load configuration from a file"}
+ {separator}
+ {checkbutton "Window always on top" {} {::LedDisplay::menu_keep_win_on_top}
+ 1 0 0 {keep_win_on_top_changed}
+ ""}
}
private variable conf_led_color {red} ;# Color: Selected color for LED's
+ private variable keep_win_on_top 0 ;# Bool: Toplevel window
private variable leds ;# Array of CanvasObject (polygon): leds(segment_num) --> LED polygon
private variable wires ;# Array of CanvasObject (line): Wire connection LED with uC
private variable connection_port ;# Array of Int: Index is key number, value is port number or {-}
private variable connection_pin ;# Array of Int: Index is key number, value is bit number or {-}
- private variable common_anode 1 ;# Bool: 1 == common anode; 0 == common catode
+ private variable common_anode 1 ;# Bool: 1 == common anode; 0 == common cathode
# ------------------------------------------------------------------
# INTERNAL APPLICATION LOGIC
@@ -148,7 +163,7 @@ class LedDisplay {
# @return void
private method create_gui {} {
# Create panel window and canvas widget
- set win [toplevel .leddisplay$count -class $component_name -bg {#EEEEEE}]
+ set win [toplevel .leddisplay$count -class $component_name -bg ${::COMMON_BG_COLOR}]
set canvas_widget [canvas $win.canvas \
-bg white -width 0 -height 0 \
-highlightthickness 0 \
@@ -231,7 +246,7 @@ class LedDisplay {
-text [mc "PORT"] \
-font $cb_font \
-anchor ne
- $canvas_widget create text 50 5 \
+ $canvas_widget create text 42 5 \
-text [mc "BIT"] \
-font $cb_font \
-anchor nw
@@ -239,18 +254,18 @@ class LedDisplay {
-text [mc "PORT"] \
-font $cb_font \
-anchor ne
- $canvas_widget create text 210 5\
+ $canvas_widget create text 202 5\
-text [mc "BIT"] \
-font $cb_font \
-anchor nw
- $canvas_widget create text 5 155\
- -text [mc "Note"] \
- -font $cb_font \
- -anchor w
- $canvas_widget create window 40 155 \
+ $canvas_widget create text 35 160 \
+ -text [mc "Note"] \
+ -font $cb_font \
+ -anchor e
+ $canvas_widget create window 40 160 \
-window [ttk::entry $canvas_widget.usr_note \
- -validate all \
+ -validate key \
-validatecommand "$this set_modified" \
] \
-width 180 -anchor w
@@ -261,14 +276,25 @@ class LedDisplay {
pack $canvas_widget -fill both -expand 1
# Set window parameters
- wm geometry $win =230x170
+ wm minsize $win 230 175
wm iconphoto $win ::ICONS::16::$component_icon
- wm title $win "[mc $component_name] - [string trim $project {:}] - MCU 8051 IDE"
+ wm title $win "[mc $component_name] - [$project cget -projectName] - MCU 8051 IDE"
wm resizable $win 0 0
wm protocol $win WM_DELETE_WINDOW "$this close_window"
bindtags $win [list $win Toplevel all .]
}
+ ## Value of configuration menu variable "keep_win_on_top" has been changed
+ # @return void
+ public method keep_win_on_top_changed {} {
+ set keep_win_on_top $LedDisplay::menu_keep_win_on_top
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ } else {
+ wm attributes $win -topmost 0 -alpha 1.0
+ }
+ }
+
## Reconnect the specified LED to another port pin
# @parm Int i - LED number (0..7)
# @return void
@@ -282,20 +308,22 @@ class LedDisplay {
# Change state of the device
if {$drawing_on} {
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
# Set flag modified
set_modified
}
- ## LED's common electrode chanded
+ ## LED's common electrode changed
# @return void
- public method common_electrode_chanded {} {
+ public method common_electrode_changed {} {
set common_anode ${::LedDisplay::cfg_common_anode}
if {$drawing_on} {
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
set_modified
}
@@ -306,7 +334,8 @@ class LedDisplay {
set conf_led_color ${::LedDisplay::color}
if {$drawing_on} {
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
set_modified
}
@@ -404,8 +433,8 @@ class LedDisplay {
}
# Draw
- set leds($i) [$canvas_widget create polygon \
- $coordinates -width 0 -fill #888888 \
+ set leds($i) [$canvas_widget create polygon \
+ $coordinates -width 0 -fill $DIMMED_COLOR \
]
}
@@ -414,7 +443,7 @@ class LedDisplay {
set leds(7) [$canvas_widget create oval \
[expr {49 + $x}] [expr {77 + $y}] \
[expr {58 + $x}] [expr {86 + $y}] \
- -width 0 -fill #888888 \
+ -width 0 -fill $DIMMED_COLOR \
]
# Print segment labels
@@ -452,12 +481,12 @@ class LedDisplay {
# @return void
public method mcu_changed {} {
# Refresh lists of possible values in port selection ComboBoxes
- set avaliable_ports [concat - [$project pale_get_avaliable_ports]]
+ set available_ports [concat - [$project pale_get_available_ports]]
for {set i 0} {$i < 8} {incr i} {
- $canvas_widget.cb_p$i configure -values $avaliable_ports
+ $canvas_widget.cb_p$i configure -values $available_ports
- if {[lsearch -ascii -exact $avaliable_ports $connection_port($i)] == -1} {
+ if {[lsearch -ascii -exact $available_ports $connection_port($i)] == -1} {
$canvas_widget.cb_p$i current 0
set connection_port($i) {-}
}
@@ -472,11 +501,13 @@ class LedDisplay {
# '|' - High frequency
# 'X' - Access to external memory
# '?' - No volatge
- # '-' - Undeterminable value (some noise)
+ # '-' - Indeterminable value (some noise)
# '=' - High forced to low
# '0' - Logical 0
# '1' - Logical 1
- public method new_state {state} {
+ public method new_state {_state} {
+ upvar $_state state
+
# Determinate index of LED color in list COLORS
set color_idx [lsearch -ascii -exact \
{red orange yellow green blue purple} \
@@ -490,7 +521,7 @@ class LedDisplay {
# Not connected
if {[lindex $pp 0] == {-} || [lindex $pp 1] == {-}} {
- $canvas_widget itemconfigure $leds($i) -fill {#888888}
+ $canvas_widget itemconfigure $leds($i) -fill $DIMMED_COLOR
$canvas_widget itemconfigure $wires($i) -fill {#000000}
continue
}
@@ -500,7 +531,7 @@ class LedDisplay {
{0} { ;# Logical 0
if {$common_anode} {
set segment_color {2}
- } {
+ } else {
set segment_color {0}
}
set wire_color {#00FF00}
@@ -508,7 +539,7 @@ class LedDisplay {
{1} { ;# Logical 1
if {$common_anode} {
set segment_color {0}
- } {
+ } else {
set segment_color {2}
}
set wire_color {#FF0000}
@@ -533,8 +564,8 @@ class LedDisplay {
# Determinate segment color (true color, not just number)
if {!$segment_color} {
- set segment_color {#888888}
- } {
+ set segment_color $DIMMED_COLOR
+ } else {
incr segment_color -1
set segment_color [lindex $COLORS [list $color_idx $segment_color]]
}
@@ -563,6 +594,7 @@ class LedDisplay {
[$canvas_widget.usr_note get] \
$conf_led_color \
$common_anode \
+ $keep_win_on_top \
] \
]
}
@@ -578,7 +610,7 @@ class LedDisplay {
# Restore window geometry
if {[string length [lindex $state 2]]} {
- wm geometry $win [lindex $state 2]
+ wm geometry $win [regsub {^\=?\d+x\d+} [lindex $state 2] [join [wm minsize $win] {x}]]
}
# Load user note
@@ -592,6 +624,13 @@ class LedDisplay {
set common_anode 1
}
+ if {[lindex $state 6] != {}} {
+ set keep_win_on_top [lindex $state 6]
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ }
+ }
+
# Restore state of ComboBoxes
for {set i 0} {$i < 8} {incr i} {
## PIN
@@ -620,12 +659,13 @@ class LedDisplay {
}
# Accept new state of ports
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
update
# Fail
}]} then {
- puts "Unable to load config for $class_name"
+ puts "Unable to load configuration for $class_name"
return 0
# Success
@@ -638,7 +678,8 @@ class LedDisplay {
## Simulated MCU has been reseted
# @return void
public method reset {} {
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
@@ -651,6 +692,7 @@ class LedDisplay {
public method config_menu_special {} {
set ::${class_name}::color $conf_led_color
set ::${class_name}::cfg_common_anode $common_anode
+ set ::${class_name}::menu_keep_win_on_top $keep_win_on_top
}
## This method is called after configuration menu has beed created
@@ -669,7 +711,7 @@ class LedDisplay {
#
# Note: There is defined text tag "tag_bold" in the text widget
public method show_help_special {text_widget} {
- $text_widget insert insert [mc "Virtual LED display with common anode (default) or catode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file (with extension vhc). And can be loaded from that file later.\n\n"]
+ $text_widget insert insert [mc "Virtual LED display with common anode (default) or cathode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later.\n\n"]
set color_idx [lsearch -ascii -exact \
{red orange yellow green blue purple} \
@@ -679,7 +721,7 @@ class LedDisplay {
$text_widget insert insert [mc "LED states:"]
$text_widget tag add tag_bold {insert linestart} {insert lineend}
$text_widget insert insert [mc "\n "]
- $text_widget window create insert -pady 1 -create "frame $text_widget.f0 -bd 1 -width 14 -height 16 -bg #888888"
+ $text_widget window create insert -pady 1 -create "frame $text_widget.f0 -bd 1 -width 14 -height 16 -bg $DIMMED_COLOR"
$text_widget insert insert [mc " Off\n "]
$text_widget window create insert -pady 1 -create "frame $text_widget.f1 -bd 1 -width 14 -height 16 -bg [lindex $COLORS [list $color_idx 0]]"
$text_widget insert insert [mc " Fast blinking\n "]
@@ -700,8 +742,13 @@ class LedDisplay {
$canvas_widget itemconfigure $leds($i) -fill {#888888}
$canvas_widget itemconfigure $wires($i) -fill {#000000}
}
- } {
- new_state [$project pale_get_true_state]
+ } else {
+ set state [$project pale_get_true_state]
+ new_state state
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/pale/ledmatrix.tcl b/lib/pale/ledmatrix.tcl
index b739f53..1be1718 100755..100644
--- a/lib/pale/ledmatrix.tcl
+++ b/lib/pale/ledmatrix.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 _LEDMATRIX_TCL ] } {
+set _LEDMATRIX_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
@@ -36,8 +41,12 @@ class LedMatrix {
inherit VirtualHWComponent
# Font: Font to be used in the panel -- bold
- common cb_font [font create -weight bold -size -10 -family {helvetica}]
- common COMPONENT_NAME "LED matrix" ;# Name of this component
+ common cb_font [font create \
+ -weight bold \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -family {helvetica} \
+ ]
+ common COMPONENT_NAME "LED Matrix" ;# Name of this component
common CLASS_NAME "LedMatrix" ;# Name of this class
common COMPONENT_ICON {ledmatrix} ;# Icon for this panel (16x16)
@@ -135,7 +144,7 @@ class LedMatrix {
}}
{separator}
{command {All fade out} {} 0 "dim_all" {ledgray}
- "Dim all leds"}
+ "Dim all LEDs"}
{command {Show help} {} 5 "show_help" {help}
"Show brief help"}
{separator}
@@ -143,14 +152,19 @@ class LedMatrix {
"Save configuration into a file"}
{command {Load configuration} {} 0 "load_from" {fileopen}
"Load configuration from a file"}
+ {separator}
+ {checkbutton "Window always on top" {} {::LedMatrix::menu_keep_win_on_top}
+ 1 0 0 {keep_win_on_top_changed}
+ ""}
}
private variable conf_dim_interval 50 ;# Int: Interval to dim LED's in instruction cycles
private variable conf_matrix_mapping 0 ;# Int: Type of matrix mapping: 0 == Random; 1 == Row; 2 == Column
private variable conf_led_color {red} ;# Color: Selected color for LED's
+ private variable keep_win_on_top 0 ;# Bool: Toplevel window
## List of Bool: LED light up condition
- # Index 0 - Row must be in: 1 == log. 1; 0 = log. 0
- # Index 1 - Column must be in: 1 == log. 1; 0 = log. 0
+ # Index 0 - Row must be in: 1 == log. 1; 0 == log. 0
+ # Index 1 - Column must be in: 1 == log. 1; 0 == log. 0
private variable conf_led_cond {0 0}
private variable leds ;# Array of CanvasObject (image): LED's, leds(row,column)
private variable col ;# Array of CanvasObject (line): Column wires
@@ -216,6 +230,17 @@ class LedMatrix {
destroy $win
}
+ ## Value of configuration menu variable "keep_win_on_top" has been changed
+ # @return void
+ public method keep_win_on_top_changed {} {
+ set keep_win_on_top $LedMatrix::menu_keep_win_on_top
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ } else {
+ wm attributes $win -topmost 0 -alpha 1.0
+ }
+ }
+
## Reconnect the specified wire to another port pin
# @parm Char col_or_row - 'C' => Column; 'R' => Row
# @parm Int i - Wire number (0..7)
@@ -229,7 +254,7 @@ class LedMatrix {
set connection_pin(R$i) [expr {7 - $connection_pin(R$i)}]
}
# Column
- } {
+ } else {
set connection_port(C$i) [$canvas_widget.cb_c_p$i get]
set connection_pin(C$i) [$canvas_widget.cb_c_b$i get]
if {$connection_pin(C$i) != {-}} {
@@ -239,7 +264,8 @@ class LedMatrix {
# Change state of the device
if {$drawing_on} {
- new_state [$project pale_get_true_state] 1
+ set state [$project pale_get_true_state]
+ new_state state 1
}
# Set flag modified
@@ -272,7 +298,8 @@ class LedMatrix {
# Change state of the device
if {$drawing_on} {
- new_state [$project pale_get_true_state] 1
+ set state [$project pale_get_true_state]
+ new_state state 1
}
# Set flag modified
@@ -285,12 +312,13 @@ class LedMatrix {
set conf_led_cond ${::LedMatrix::cond}
if {$drawing_on} {
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
set_modified
}
- ## Dim all LED's and reset their prevoius states
+ ## Dim all LED's and reset their previous states
# @return void
public method dim_all {} {
for {set i 0} {$i < 8} {incr i} {
@@ -308,7 +336,7 @@ class LedMatrix {
# @return void
private method create_gui {} {
# Create panel window and canvas widget
- set win [toplevel .ledmatrix$count -class $component_name -bg {#EEEEEE}]
+ set win [toplevel .ledmatrix$count -class $component_name -bg ${::COMMON_BG_COLOR}]
set canvas_widget [canvas $win.canvas \
-bg white -width 0 -height 0 \
-highlightthickness 0 \
@@ -318,7 +346,7 @@ class LedMatrix {
set led_sep 15
set sep 25
set y_0 100
- set x_0 85
+ set x_0 90
set y_1 [expr {$y_0 + 10}]
set x_1 [expr {$x_0 + 35}]
@@ -466,13 +494,13 @@ class LedMatrix {
-font $cb_font \
-anchor nw
- $canvas_widget create text 5 273 \
+ $canvas_widget create text 35 278 \
-text [mc "Note"] \
-font $cb_font \
- -anchor w
- $canvas_widget create window 40 273 \
+ -anchor e
+ $canvas_widget create window 40 278 \
-window [ttk::entry $canvas_widget.usr_note \
- -validate all \
+ -validate key \
-validatecommand "$this set_modified" \
] \
-width 230 -anchor w
@@ -490,7 +518,7 @@ class LedMatrix {
-text [mc "Turn HW simulation on/off"]
setStatusTip -widget $start_stop_button -text [mc "Turn HW simulation on/off"]
bind $start_stop_button <Button-3> "$this on_off_button_press; break"
- $canvas_widget create window 2 20 -window $start_stop_button -anchor sw
+ $canvas_widget create window 2 22 -window $start_stop_button -anchor sw
bindtags $start_stop_button [list $start_stop_button TButton all .]
# Create configuration menu button
@@ -500,16 +528,16 @@ class LedMatrix {
-command "$this config_menu" \
]
setStatusTip -widget $conf_button -text [mc "Configure"]
- $canvas_widget create window 2 20 -window $conf_button -anchor nw
+ $canvas_widget create window 2 22 -window $conf_button -anchor nw
bindtags $conf_button [list $conf_button TButton all .]
# Pack canvas
pack $canvas_widget -fill both -expand 1
# Set window parameters
- wm geometry $win =275x285
+ wm minsize $win 280 295
wm iconphoto $win ::ICONS::16::$component_icon
- wm title $win "[mc $component_name] - [string trim $project {:}] - MCU 8051 IDE"
+ wm title $win "[mc $component_name] - [$project cget -projectName] - MCU 8051 IDE"
wm resizable $win 0 0
wm protocol $win WM_DELETE_WINDOW "$this close_window"
bindtags $win [list $win Toplevel all .]
@@ -538,17 +566,17 @@ class LedMatrix {
# @return void
public method mcu_changed {} {
# Refresh lists of possible values in port selection ComboBoxes
- set avaliable_ports [concat - [$project pale_get_avaliable_ports]]
+ set available_ports [concat - [$project pale_get_available_ports]]
for {set i 0} {$i < 8} {incr i} {
- $canvas_widget.cb_r_p$i configure -values $avaliable_ports
- $canvas_widget.cb_c_p$i configure -values $avaliable_ports
+ $canvas_widget.cb_r_p$i configure -values $available_ports
+ $canvas_widget.cb_c_p$i configure -values $available_ports
- if {[lsearch -ascii -exact $avaliable_ports $connection_port(R$i)] == -1} {
+ if {[lsearch -ascii -exact $available_ports $connection_port(R$i)] == -1} {
$canvas_widget.cb_r_p$i current 0
set connection_port(R$i) {-}
}
- if {[lsearch -ascii -exact $avaliable_ports $connection_port(C$i)] == -1} {
+ if {[lsearch -ascii -exact $available_ports $connection_port(C$i)] == -1} {
$canvas_widget.cb_c_p$i current 0
set connection_port(C$i) {-}
}
@@ -557,18 +585,20 @@ class LedMatrix {
## Accept new state of ports
# @parm List state - Port states ( 5 x {8 x bit} -- {bit0 bit1 bit2 ... bit7} )
- # @parm Bool preserve_prvious_state = 0 - Preserve previous state of component
+ # @parm Bool preserve_prvious_state=0 - Preserve previous state of component
# @return void
#
# Possible bit values:
# '|' - High frequency
# 'X' - Access to external memory
# '?' - No volatge
- # '-' - Undeterminable value (some noise)
+ # '-' - Indeterminable value (some noise)
# '=' - High forced to low
# '0' - Logical 0
# '1' - Logical 1
- public method new_state {state {preserve_prvious_state 0}} {
+ public method new_state {_state {preserve_prvious_state 0}} {
+ upvar $_state state
+
# Change column wire colors
for {set i 0} {$i < 8} {incr i} {
# Determinate index in the list of port states
@@ -668,22 +698,22 @@ class LedMatrix {
}
# Determinate row state in this way:
- #+ row_state = 0 => Dim
- #+ row_state = 1 => Half dim
- #+ row_state = 2 => Brighten
+ #+ row_state == 0 => Dim
+ #+ row_state == 1 => Half dim
+ #+ row_state == 2 => Brighten
set row_state [lindex $state $pp]
switch -- $row_state {
{0} { ;# Logical 0
if {[lindex $conf_led_cond 0]} {
set row_state 0
- } {
+ } else {
set row_state 2
}
}
{1} { ;# Logical 1
if {[lindex $conf_led_cond 0]} {
set row_state 2
- } {
+ } else {
set row_state 0
}
}
@@ -717,14 +747,14 @@ class LedMatrix {
{0} { ;# Logical 0
if {[lindex $conf_led_cond 1]} {
set image 0 ;# ledgray
- } {
+ } else {
set image 1 ;# shining LED
}
}
{1} { ;# Logical 1
if {[lindex $conf_led_cond 1]} {
set image 1 ;# shining LED
- } {
+ } else {
set image 0 ;# ledgray
}
}
@@ -831,6 +861,7 @@ class LedMatrix {
$conf_dim_interval \
$conf_led_cond \
$conf_matrix_mapping \
+ $keep_win_on_top \
] \
]
}
@@ -846,7 +877,7 @@ class LedMatrix {
# Restore window geometry
if {[string length [lindex $state 2]]} {
- wm geometry $win [lindex $state 2]
+ wm geometry $win [regsub {^\=?\d+x\d+} [lindex $state 2] [join [wm minsize $win] {x}]]
}
# Load user note
@@ -863,6 +894,13 @@ class LedMatrix {
set conf_matrix_mapping 0
}
+ if {[lindex $state 8] != {}} {
+ set keep_win_on_top [lindex $state 8]
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ }
+ }
+
# Restore state of ComboBoxes
foreach foo {R C} bar {r c} {
for {set i 0} {$i < 8} {incr i} {
@@ -893,12 +931,13 @@ class LedMatrix {
}
# Accept new state of ports
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
update
# Fail
}]} then {
- puts "Unable to load config for $class_name"
+ puts "Unable to load configuration for $class_name"
return 0
# Success
@@ -912,7 +951,8 @@ class LedMatrix {
# @return void
public method reset {} {
dim_all
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
@@ -927,6 +967,7 @@ class LedMatrix {
set ::${class_name}::matrix_mapping $conf_matrix_mapping
set ::${class_name}::color $conf_led_color
set ::${class_name}::cond $conf_led_cond
+ set ::${class_name}::menu_keep_win_on_top $keep_win_on_top
}
## This method is called after configuration menu has beed created
@@ -945,7 +986,7 @@ class LedMatrix {
#
# Note: There is defined text tag "tag_bold" in the text widget
public method show_help_special {text_widget} {
- $text_widget insert insert [mc "This tool consists of 64 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file (with extension vhc). And can be loaded from that file later. Condition on which a LED lights up and LED colors are configurable. Also fade out interval is configurable.\n\n"]
+ $text_widget insert insert [mc "This tool consists of 64 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Condition on which a LED lights up and LED colors are configurable. Also fade out interval is configurable.\n\n"]
$text_widget insert insert [mc "LED states:"]
$text_widget tag add tag_bold {insert linestart} {insert lineend}
@@ -975,8 +1016,13 @@ class LedMatrix {
-image ::ICONS::16::ledgray
}
}
- } {
- new_state [$project pale_get_true_state] 1
+ } else {
+ set state [$project pale_get_true_state]
+ new_state state 1
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/pale/ledpanel.tcl b/lib/pale/ledpanel.tcl
index a05bb79..a39799f 100755..100644
--- a/lib/pale/ledpanel.tcl
+++ b/lib/pale/ledpanel.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 _LEDPANEL_TCL ] } {
+set _LEDPANEL_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
@@ -36,8 +41,12 @@ class LedPanel {
inherit VirtualHWComponent
# Font: Font to be used in the panel -- bold
- common cb_font [font create -weight bold -size -10 -family {helvetica}]
- common COMPONENT_NAME "LED panel" ;# Name of this component
+ common cb_font [font create \
+ -weight bold \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -family {helvetica} \
+ ]
+ common COMPONENT_NAME "LED Panel" ;# Name of this component
common CLASS_NAME "LedPanel" ;# Name of this class
common COMPONENT_ICON {ledpanel} ;# Icon for this panel (16x16)
@@ -71,9 +80,14 @@ class LedPanel {
"Save configuration into a file"}
{command {Load configuration} {} 0 "load_from" {fileopen}
"Load configuration from a file"}
+ {separator}
+ {checkbutton "Window always on top" {} {::LedPanel::menu_keep_win_on_top}
+ 1 0 0 {keep_win_on_top_changed}
+ ""}
}
+ private variable keep_win_on_top 0 ;# Bool: Toplevel window
private variable conf_led_color {red} ;# Color: Selected color for LED's
private variable leds ;# Array of CanvasObject (image): LED's
private variable connection_port ;# Array of Int: Index is key number, value is port number or {-}
@@ -122,6 +136,17 @@ class LedPanel {
destroy $win
}
+ ## Value of configuration menu variable "keep_win_on_top" has been changed
+ # @return void
+ public method keep_win_on_top_changed {} {
+ set keep_win_on_top $LedPanel::menu_keep_win_on_top
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ } else {
+ wm attributes $win -topmost 0 -alpha 1.0
+ }
+ }
+
## Reconnect the specified LED to another port pin
# @parm Int i - LED number (0..7)
# @return void
@@ -135,7 +160,8 @@ class LedPanel {
# Change state of the device
if {$drawing_on} {
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
# Set flag modified
@@ -148,7 +174,8 @@ class LedPanel {
set conf_led_color ${::LedPanel::color}
if {$drawing_on} {
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
set_modified
}
@@ -157,7 +184,7 @@ class LedPanel {
# @return void
private method create_gui {} {
# Create panel window and canvas widget
- set win [toplevel .ledpanel$count -class $component_name -bg {#EEEEEE}]
+ set win [toplevel .ledpanel$count -class $component_name -bg ${::COMMON_BG_COLOR}]
set canvas_widget [canvas $win.canvas \
-bg white -width 0 -height 0 \
-highlightthickness 0 \
@@ -167,7 +194,7 @@ class LedPanel {
set led_y 35
set cb_p_y 65
set cb_b_y 85
- set usr_n_y 105
+ set usr_n_y 110
set x 50
$canvas_widget create text 5 $cb_p_y \
-text [mc "PORT"] \
@@ -177,16 +204,16 @@ class LedPanel {
-text [mc "BIT"] \
-font $cb_font \
-anchor w
- $canvas_widget create text 5 $usr_n_y \
+ $canvas_widget create text 30 $usr_n_y \
-text [mc "Note"] \
-font $cb_font \
- -anchor w
- $canvas_widget create window 208 $usr_n_y \
+ -anchor e
+ $canvas_widget create window 35 $usr_n_y \
-window [ttk::entry $canvas_widget.usr_note \
- -validate all \
+ -validate key \
-validatecommand "$this set_modified" \
] \
- -width 330
+ -width 330 -anchor w
bindtags $canvas_widget.usr_note \
[list $canvas_widget.usr_note TEntry $win all .]
@@ -253,9 +280,9 @@ class LedPanel {
pack $canvas_widget -fill both -expand 1
# Set window parameters
- wm geometry $win =380x120
+ wm minsize $win 380 130
wm iconphoto $win ::ICONS::16::$component_icon
- wm title $win "[mc $component_name] - [string trim $project {:}] - MCU 8051 IDE"
+ wm title $win "[mc $component_name] - [$project cget -projectName] - MCU 8051 IDE"
wm resizable $win 0 0
wm protocol $win WM_DELETE_WINDOW "$this close_window"
bindtags $win [list $win Toplevel all .]
@@ -332,12 +359,12 @@ class LedPanel {
# @return void
public method mcu_changed {} {
# Refresh lists of possible values in port selection ComboBoxes
- set avaliable_ports [concat - [$project pale_get_avaliable_ports]]
+ set available_ports [concat - [$project pale_get_available_ports]]
for {set i 0} {$i < 8} {incr i} {
- $canvas_widget.cb_p$i configure -values $avaliable_ports
+ $canvas_widget.cb_p$i configure -values $available_ports
- if {[lsearch -ascii -exact $avaliable_ports $connection_port($i)] == -1} {
+ if {[lsearch -ascii -exact $available_ports $connection_port($i)] == -1} {
$canvas_widget.cb_p$i current 0
set connection_port($i) {-}
}
@@ -352,11 +379,13 @@ class LedPanel {
# '|' - High frequency
# 'X' - Access to external memory
# '?' - No volatge
- # '-' - Undeterminable value (some noise)
+ # '-' - Indeterminable value (some noise)
# '=' - High forced to low
# '0' - Logical 0
# '1' - Logical 1
- public method new_state {state} {
+ public method new_state {_state} {
+ upvar $_state state
+
for {set i 0} {$i < 8} {incr i} {
# Determinate index in the list of port states
set pp [which_port_pin $i]
@@ -409,6 +438,7 @@ class LedPanel {
[wm geometry $win] \
[$canvas_widget.usr_note get] \
$conf_led_color \
+ $keep_win_on_top \
] \
]
}
@@ -424,7 +454,7 @@ class LedPanel {
# Restore window geometry
if {[string length [lindex $state 2]]} {
- wm geometry $win [lindex $state 2]
+ wm geometry $win [regsub {^\=?\d+x\d+} [lindex $state 2] [join [wm minsize $win] {x}]]
}
# Load user note
@@ -434,6 +464,13 @@ class LedPanel {
# Restore LED's configuration
set conf_led_color [lindex $state 4]
+ if {[lindex $state 5] != {}} {
+ set keep_win_on_top [lindex $state 5]
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ }
+ }
+
# Restore state of ComboBoxes
for {set i 0} {$i < 8} {incr i} {
## PIN
@@ -462,12 +499,13 @@ class LedPanel {
}
# Accept new state of ports
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
update
# Fail
}]} then {
- puts "Unable to load config for $class_name"
+ puts "Unable to load configuration for $class_name"
return 0
# Success
@@ -480,7 +518,8 @@ class LedPanel {
## Simulated MCU has been reseted
# @return void
public method reset {} {
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
@@ -492,6 +531,7 @@ class LedPanel {
# @return void
public method config_menu_special {} {
set ::${class_name}::color $conf_led_color
+ set ::${class_name}::menu_keep_win_on_top $keep_win_on_top
}
## This method is called after configuration menu has beed created
@@ -510,7 +550,7 @@ class LedPanel {
#
# Note: There is defined text tag "tag_bold" in the text widget
public method show_help_special {text_widget} {
- $text_widget insert insert [mc "This tool consists of 8 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file (with extension vhc). And can be loaded from that file later. LED colors are configurable.\n\n"]
+ $text_widget insert insert [mc "This tool consists of 8 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. LED colors are configurable.\n\n"]
$text_widget insert insert [mc "LED states:"]
$text_widget tag add tag_bold {insert linestart} {insert lineend}
@@ -536,8 +576,13 @@ class LedPanel {
$canvas_widget itemconfigure $leds($i) \
-image ::ICONS::16::ledgray
}
- } {
- new_state [$project pale_get_true_state]
+ } else {
+ set state [$project pale_get_true_state]
+ new_state state
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/pale/matrixkeypad.tcl b/lib/pale/matrixkeypad.tcl
index 186ead0..9400741 100755..100644
--- a/lib/pale/matrixkeypad.tcl
+++ b/lib/pale/matrixkeypad.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 _MATRIXKEYPAD_TCL ] } {
+set _MATRIXKEYPAD_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
@@ -36,15 +41,15 @@ class MatrixKeyPad {
inherit VirtualHWComponent
# Font: Font to be used in the panel -- bold
- common cb_font [font create \
- -weight bold \
- -size -10 \
- -family {helvetica} \
+ common cb_font [font create \
+ -weight bold \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -family {helvetica} \
]
# Font: Font to be used in the panel -- normal weight
- common cb_font_n [font create \
- -size -10 \
- -family {helvetica} \
+ common cb_font_n [font create \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -family {helvetica} \
]
common COMPONENT_NAME "Matrix Keypad" ;# Name of this component
@@ -64,9 +69,14 @@ class MatrixKeyPad {
"Save configuration into a file"}
{command {Load configuration} {} 0 "load_from" {fileopen}
"Load configuration from a file"}
+ {separator}
+ {checkbutton "Window always on top" {} {::MatrixKeyPad::menu_keep_win_on_top}
+ 1 0 0 {keep_win_on_top_changed}
+ ""}
}
- private variable radio_buttons ;# Bool: Disallow key combinations
+ private variable radio_buttons 0 ;# Bool: Disallow key combinations
+ private variable keep_win_on_top 0 ;# Bool: Toplevel window
private variable keys ;# Array of Bool: Indicates key press
private variable wire
private variable wire_o
@@ -138,6 +148,17 @@ class MatrixKeyPad {
destroy $win
}
+ ## Value of configuration menu variable "keep_win_on_top" has been changed
+ # @return void
+ public method keep_win_on_top_changed {} {
+ set keep_win_on_top $MatrixKeyPad::menu_keep_win_on_top
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ } else {
+ wm attributes $win -topmost 0 -alpha 1.0
+ }
+ }
+
## Reevaluate array of MCU port pins engaged by this device
# @return void
private method evaluete_enaged_pins {} {
@@ -193,18 +214,18 @@ class MatrixKeyPad {
# @return void
private method create_gui {} {
# Create panel window and canvas widget
- set win [toplevel .matrixkeypad$count -class $component_name -bg {#EEEEEE}]
+ set win [toplevel .matrixkeypad$count -class $component_name -bg ${::COMMON_BG_COLOR}]
set canvas_widget [canvas $win.canvas \
-bg white -width 0 -height 0 \
-highlightthickness 0 \
]
# Create labels
- $canvas_widget create text 33 20 \
+ $canvas_widget create text 36 20 \
-text [mc "PORT"] \
-font $cb_font \
-anchor e
- $canvas_widget create text 35 20 \
+ $canvas_widget create text 38 20 \
-text [mc "BIT"] \
-font $cb_font \
-anchor w
@@ -218,13 +239,13 @@ class MatrixKeyPad {
-font $cb_font \
-anchor e
- $canvas_widget create text 5 220 \
+ $canvas_widget create text 35 220 \
-text [mc "Note"] \
-font $cb_font \
- -anchor w
- $canvas_widget create window 35 220 \
+ -anchor e
+ $canvas_widget create window 40 220 \
-window [ttk::entry $canvas_widget.usr_note \
- -validate all \
+ -validate key \
-validatecommand "$this set_modified" \
] \
-width 180 -anchor w
@@ -259,7 +280,7 @@ class MatrixKeyPad {
-state readonly \
]
bind $canvas_widget.cb_p$i <<ComboboxSelected>> "$this reconnect $i"
-
+
$canvas_widget create window $x $y -anchor w \
-window [ttk::combobox $canvas_widget.cb_b$i \
-width 1 \
@@ -289,7 +310,7 @@ class MatrixKeyPad {
-state readonly \
]
bind $canvas_widget.cb_p$i <<ComboboxSelected>> "$this reconnect $i"
-
+
$canvas_widget create window $x $cb_b_y -anchor center \
-window [ttk::combobox $canvas_widget.cb_b$i \
-width 1 \
@@ -334,9 +355,9 @@ class MatrixKeyPad {
pack $canvas_widget -fill both -expand 1
# Set window parameters
- wm geometry $win =225x235
+ wm minsize $win 225 240
wm iconphoto $win ::ICONS::16::$component_icon
- wm title $win "[mc $component_name] - [string trim $project {:}] - MCU 8051 IDE"
+ wm title $win "[mc $component_name] - [$project cget -projectName] - MCU 8051 IDE"
wm resizable $win 0 0
wm protocol $win WM_DELETE_WINDOW "$this close_window"
bindtags $win [list $win Toplevel all .]
@@ -455,7 +476,7 @@ class MatrixKeyPad {
$canvas_widget itemconfigure $rect($i) -outline #333333 -width 2
# Key released
- } {
+ } else {
$canvas_widget itemconfigure $lever(0$i) -fill #000000
$canvas_widget itemconfigure $lever(1$i) -fill #FFFFFF
$canvas_widget itemconfigure $text($i) -font $cb_font_n
@@ -469,7 +490,7 @@ class MatrixKeyPad {
public method key_leave {i} {
if {$keys($i)} {
set color {#333333}
- } {
+ } else {
set color {#CCCCCC}
}
$canvas_widget itemconfigure $rect($i) -outline $color
@@ -606,12 +627,12 @@ class MatrixKeyPad {
# @return void
public method mcu_changed {} {
# Refresh lists of possible values in port selection ComboBoxes
- set avaliable_ports [concat - [$project pale_get_avaliable_ports]]
+ set available_ports [concat - [$project pale_get_available_ports]]
for {set i 0} {$i < 8} {incr i} {
- $canvas_widget.cb_p$i configure -values $avaliable_ports
+ $canvas_widget.cb_p$i configure -values $available_ports
- if {[lsearch -ascii -exact $avaliable_ports $connection_port($i)] == -1} {
+ if {[lsearch -ascii -exact $available_ports $connection_port($i)] == -1} {
$canvas_widget.cb_p$i current 0
set connection_port($i) {-}
}
@@ -627,11 +648,13 @@ class MatrixKeyPad {
# '|' - High frequency
# 'X' - Access to external memory
# '?' - No volatge
- # '-' - Undeterminable value (some noise)
+ # '-' - Indeterminable value (some noise)
# '=' - High forced to low
# '0' - Logical 0
# '1' - Logical 1
- public method new_state {state} {
+ public method new_state {_state} {
+ upvar $_state state
+
# Local variables
set row_state [list {} {} {} {}] ;# State of rows
set col_state [list {} {} {} {}] ;# State of columns
@@ -650,7 +673,7 @@ class MatrixKeyPad {
if {$i < 4} {
lset row_state $i [lindex $state $pp]
# Columns
- } {
+ } else {
lset col_state [expr {$i - 4}] [lindex $state $pp]
}
}
@@ -718,7 +741,7 @@ class MatrixKeyPad {
if {$i < 4} {
lset state $pp [lindex $row_state $i]
# Columns
- } {
+ } else {
lset state $pp [lindex $col_state [expr {$i - 4}]]
}
}
@@ -738,9 +761,6 @@ class MatrixKeyPad {
$canvas_widget itemconfigure $item -fill $color
}
}
-
- # Return new port states
- return $state
}
## Withdraw panel window from the screen
@@ -761,6 +781,7 @@ class MatrixKeyPad {
[$canvas_widget.usr_note get] \
[array get keys] \
$radio_buttons \
+ $keep_win_on_top \
] \
]
}
@@ -776,7 +797,7 @@ class MatrixKeyPad {
# Restore window geometry
if {[string length [lindex $state 2]]} {
- wm geometry $win [lindex $state 2]
+ wm geometry $win [regsub {^\=?\d+x\d+} [lindex $state 2] [join [wm minsize $win] {x}]]
}
# Load user note
@@ -787,6 +808,13 @@ class MatrixKeyPad {
array set keys [lindex $state 4]
set radio_buttons [lindex $state 5]
+ if {[lindex $state 6] != {}} {
+ set keep_win_on_top [lindex $state 6]
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ }
+ }
+
# Restore state of ComboBoxes
for {set i 0} {$i < 8} {incr i} {
## PIN
@@ -826,7 +854,7 @@ class MatrixKeyPad {
# Fail
}]} then {
- puts "Unable to load config for $class_name"
+ puts "Unable to load configuration for $class_name"
return 0
# Success
@@ -850,7 +878,8 @@ class MatrixKeyPad {
## This method is called before configuration menu invocation
# @return void
public method config_menu_special {} {
- set ::MatrixKeyPad::menu_radio_buttons $radio_buttons
+ set ::${class_name}::menu_radio_buttons $radio_buttons
+ set ::${class_name}::menu_keep_win_on_top $keep_win_on_top
}
## This method is called after configuration menu has beed created
@@ -864,7 +893,7 @@ class MatrixKeyPad {
#
# Note: There is defined text tag "tag_bold" in the text widget
public method show_help_special {text_widget} {
- $text_widget insert insert [mc "This tool consists of 16 switches connected in matrix. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file (with extension vhc). And can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n"]
+ $text_widget insert insert [mc "This tool consists of 16 switches connected in matrix. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n"]
$text_widget insert insert [mc "Keypad can be configured in two ways:"]
$text_widget tag add tag_bold {insert linestart} {insert lineend}
$text_widget insert insert [mc "\n "]
@@ -873,7 +902,7 @@ class MatrixKeyPad {
$text_widget insert insert [mc " To allow key combinations\n Menu -> Check \"Radio buttons\"\n "]
$text_widget insert insert [mc "2)"]
$text_widget tag add tag_bold {insert linestart} {insert lineend}
- $text_widget insert insert [mc " To do not allow key combinations\n Menu -> Uncheck \"Radio buttons\""]
+ $text_widget insert insert [mc " To not allow key combinations\n Menu -> Uncheck \"Radio buttons\""]
}
## This method is called before panel window closure
@@ -884,6 +913,11 @@ class MatrixKeyPad {
## Commit new on/off state
# @return void
public method on_off_special {} {
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/pale/multiplexedleddisplay.tcl b/lib/pale/multiplexedleddisplay.tcl
index 78976ad..8fcf042 100755..100644
--- a/lib/pale/multiplexedleddisplay.tcl
+++ b/lib/pale/multiplexedleddisplay.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 _MULTIPLEXEDLEDDISPLAY_TCL ] } {
+set _MULTIPLEXEDLEDDISPLAY_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements PALE VHW component "Multiplexed LED display"
@@ -35,11 +40,12 @@ class MultiplexedLedDisplay {
inherit VirtualHWComponent
# Font: Font to be used in the panel -- bold
- common cb_font [font create \
- -weight bold -size -10 \
- -family {helvetica} \
+ common cb_font [font create \
+ -weight bold \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -family {helvetica} \
]
- common COMPONENT_NAME "Multiplexed LED display" ;# Name of this component
+ common COMPONENT_NAME "Multiplexed LED Display" ;# Name of this component
common CLASS_NAME "MultiplexedLedDisplay" ;# Name of this class
common COMPONENT_ICON {mleddisplay} ;# Icon for this panel (16x16)
@@ -55,16 +61,17 @@ class MultiplexedLedDisplay {
{#5555AA #0000FF #5555FF}
{#AA55AA #8800FF #CC55FF}
}
+ common DIMMED_COLOR {#BBBBBB}
# Configuration menu
common CONFMENU {
{cascade {Common electrode} 7 "diode" .ca false 1 {
{radiobutton "Common anode" {}
::MultiplexedLedDisplay::cfg_common_anode 1
- "common_electrode_chanded" 7 ""}
- {radiobutton "Common catode" {}
+ "common_electrode_changed" 7 ""}
+ {radiobutton "Common cathode" {}
::MultiplexedLedDisplay::cfg_common_anode 0
- "common_electrode_chanded" 7 ""}
+ "common_electrode_changed" 7 ""}
}}
{cascade {Fade out interval} 5 "player_time" .dim false 1 {
{radiobutton "0" {}
@@ -126,7 +133,7 @@ class MultiplexedLedDisplay {
}}
{separator}
{command {All fade out} {} 0 "dim_all" {ledgray}
- "Dim all leds"}
+ "Dim all LEDs"}
{command {Show help} {} 5 "show_help" {help}
"Show brief help"}
{separator}
@@ -134,10 +141,15 @@ class MultiplexedLedDisplay {
"Save configuration into a file"}
{command {Load configuration} {} 0 "load_from" {fileopen}
"Load configuration from a file"}
+ {separator}
+ {checkbutton "Window always on top" {} {::MultiplexedLedDisplay::menu_keep_win_on_top}
+ 1 0 0 {keep_win_on_top_changed}
+ ""}
}
private variable conf_dim_interval 50 ;# Int: Interval to dim LED's in instruction cycles
private variable conf_led_color {red} ;# Color: Selected color for display segments
+ private variable keep_win_on_top 0 ;# Bool: Toplevel window
private variable leds ;# Array of CanvasObject (polygon): leds(display_num,segment_num) --> LED polygon
## Array of CanvasObject (line):
@@ -147,7 +159,7 @@ class MultiplexedLedDisplay {
private variable connection_port ;# Array of Int: Index is key number, value is port number or {-}
private variable connection_pin ;# Array of Int: Index is key number, value is bit number or {-}
private variable prev_state ;# List: Previous port states
- private variable common_anode 1 ;# Bool: 1 == common anode; 0 == common catode
+ private variable common_anode 1 ;# Bool: 1 == common anode; 0 == common cathode
private variable t_state ;# List: Transistor states
@@ -213,7 +225,7 @@ class MultiplexedLedDisplay {
# @return void
private method create_gui {} {
# Create panel window and canvas widget
- set win [toplevel .multiplexedleddisplay$count -class {Mult. LED Display} -bg {#EEEEEE}]
+ set win [toplevel .multiplexedleddisplay$count -class {Mult. LED Display} -bg ${::COMMON_BG_COLOR}]
set canvas_widget [canvas $win.canvas \
-bg white -width 0 -height 0 \
-highlightthickness 0 \
@@ -396,12 +408,12 @@ class MultiplexedLedDisplay {
# Create EntryBox for user note
$canvas_widget create text 40 210 \
- -text {Note} \
+ -text [mc "Note"] \
-font $cb_font \
-anchor e
- $canvas_widget create window 40 210 \
+ $canvas_widget create window 45 210 \
-window [ttk::entry $canvas_widget.usr_note \
- -validate all \
+ -validate key \
-validatecommand "$this set_modified" \
] \
-width 380 -anchor w
@@ -412,14 +424,25 @@ class MultiplexedLedDisplay {
pack $canvas_widget -fill both -expand 1
# Set window parameters
- wm geometry $win =425x225
+ wm minsize $win 430 225
wm iconphoto $win ::ICONS::16::$component_icon
- wm title $win "[mc $component_name] - [string trim $project {:}] - MCU 8051 IDE"
+ wm title $win "[mc $component_name] - [$project cget -projectName] - MCU 8051 IDE"
wm resizable $win 0 0
wm protocol $win WM_DELETE_WINDOW "$this close_window"
bindtags $win [list $win Toplevel all .]
}
+ ## Value of configuration menu variable "keep_win_on_top" has been changed
+ # @return void
+ public method keep_win_on_top_changed {} {
+ set keep_win_on_top $MultiplexedLedDisplay::menu_keep_win_on_top
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ } else {
+ wm attributes $win -topmost 0 -alpha 1.0
+ }
+ }
+
## LED dim interval changed (meaningfull for multiplexed mode)
# @return void
public method dim_interval_changed {} {
@@ -427,14 +450,15 @@ class MultiplexedLedDisplay {
set_modified
}
- ## LED's common electrode chanded
+ ## LED's common electrode changed
# @return void
- public method common_electrode_chanded {} {
+ public method common_electrode_changed {} {
set common_anode ${::MultiplexedLedDisplay::cfg_common_anode}
if {$drawing_on} {
dim_all
- new_state [$project pale_get_true_state] 1
+ set state [$project pale_get_true_state]
+ new_state state 1
}
set_modified
}
@@ -445,12 +469,13 @@ class MultiplexedLedDisplay {
set conf_led_color ${::MultiplexedLedDisplay::color}
if {$drawing_on} {
- new_state [$project pale_get_true_state] 1
+ set state [$project pale_get_true_state]
+ new_state state 1
}
set_modified
}
- ## Dim all LED's and reset their prevoius states
+ ## Dim all LED's and reset their previous states
# @return void
public method dim_all {} {
for {set i 0} {$i < 8} {incr i} {
@@ -476,7 +501,7 @@ class MultiplexedLedDisplay {
if {$connection_pin($i) != {-}} {
set connection_pin($i) [expr {7 - $connection_pin($i)}]
}
- } {
+ } else {
set connection_port(T$i) [$canvas_widget.cb_t_p$i get]
set connection_pin(T$i) [$canvas_widget.cb_t_b$i get]
if {$connection_pin(T$i) != {-}} {
@@ -486,7 +511,8 @@ class MultiplexedLedDisplay {
# Change state of the device
if {$drawing_on} {
- new_state [$project pale_get_true_state] 1
+ set state [$project pale_get_true_state]
+ new_state state 1
}
# Set flag modified
@@ -711,7 +737,7 @@ class MultiplexedLedDisplay {
private method which_port_pin {type i} {
if {$type == {S}} {
return [list $connection_port($i) $connection_pin($i)]
- } {
+ } else {
return [list $connection_port(T$i) $connection_pin(T$i)]
}
}
@@ -732,13 +758,13 @@ class MultiplexedLedDisplay {
# @return void
public method mcu_changed {} {
# Refresh lists of possible values in port selection ComboBoxes
- set avaliable_ports [concat - [$project pale_get_avaliable_ports]]
+ set available_ports [concat - [$project pale_get_available_ports]]
# For segments ...
for {set i 0} {$i < 8} {incr i} {
- $canvas_widget.cb_p$i configure -values $avaliable_ports
+ $canvas_widget.cb_p$i configure -values $available_ports
- if {[lsearch -ascii -exact $avaliable_ports $connection_port($i)] == -1} {
+ if {[lsearch -ascii -exact $available_ports $connection_port($i)] == -1} {
$canvas_widget.cb_p$i current 0
set connection_port($i) {-}
}
@@ -746,9 +772,9 @@ class MultiplexedLedDisplay {
# For transistors ...
for {set i 0} {$i < 4} {incr i} {
- $canvas_widget.cb_t_p$i configure -values $avaliable_ports
+ $canvas_widget.cb_t_p$i configure -values $available_ports
- if {[lsearch -ascii -exact $avaliable_ports $connection_port(T$i)] == -1} {
+ if {[lsearch -ascii -exact $available_ports $connection_port(T$i)] == -1} {
$canvas_widget.cb_t_p$i current 0
set connection_port(T$i) {-}
}
@@ -757,18 +783,20 @@ class MultiplexedLedDisplay {
## Accept new state of ports
# @parm List state - Port states ( 5 x {8 x bit} -- {bit0 bit1 bit2 ... bit7} )
- # @parm Bool preserve_prvious_state = 0 - Preserve previous state of component
+ # @parm Bool preserve_prvious_state=0 - Preserve previous state of component
# @return void
#
# Possible bit values:
# '|' - High frequency
# 'X' - Access to external memory
# '?' - No volatge
- # '-' - Undeterminable value (some noise)
+ # '-' - Indeterminable value (some noise)
# '=' - High forced to low
# '0' - Logical 0
# '1' - Logical 1
- public method new_state {state {preserve_prvious_state 0}} {
+ public method new_state {_state {preserve_prvious_state 0}} {
+ upvar $_state state
+
# Determinate index of LED color in list COLORS
set color_idx [lsearch -ascii -exact \
{red orange yellow green blue purple} \
@@ -784,7 +812,7 @@ class MultiplexedLedDisplay {
if {[lindex $pp 0] == {-} || [lindex $pp 1] == {-}} {
set t_state($i) {}
# Connected
- } {
+ } else {
set t_state($i) [lindex $state $pp]
}
@@ -793,7 +821,7 @@ class MultiplexedLedDisplay {
{0} { ;# Logical 0
if {$common_anode} {
set t_state($i) 2
- } {
+ } else {
set t_state($i) 0
}
set wire_color {#FF0000}
@@ -801,7 +829,7 @@ class MultiplexedLedDisplay {
{1} { ;# Logical 1
if {$common_anode} {
set t_state($i) 0
- } {
+ } else {
set t_state($i) 2
}
set wire_color {#00FF00}
@@ -809,7 +837,7 @@ class MultiplexedLedDisplay {
{=} { ;# High forced to low
if {$common_anode} {
set t_state($i) 2
- } {
+ } else {
set t_state($i) 0
}
set wire_color {#00FF00}
@@ -842,7 +870,7 @@ class MultiplexedLedDisplay {
# Not connected
if {[lindex $pp 0] == {-} || [lindex $pp 1] == {-}} {
for {set j 0} {$j < 4} {incr j} {
- $canvas_widget itemconfigure $leds($j,$i) -fill {#555555}
+ $canvas_widget itemconfigure $leds($j,$i) -fill $DIMMED_COLOR -outline {#FFFFFF}
}
foreach item $wires($i) {
$canvas_widget itemconfigure $item -fill {#000000}
@@ -896,14 +924,14 @@ class MultiplexedLedDisplay {
set segment_color {0}
}
}
- } {
+ } else {
set segment_color {0}
}
}
{1} { ;# Logical 1
if {$common_anode} {
set segment_color {0}
- } {
+ } else {
switch -- $t_state($j) {
{2} {
set segment_color {2}
@@ -966,8 +994,8 @@ class MultiplexedLedDisplay {
# Determinate segment color (true color, not just number)
if {!$segment_color} {
- set segment_color {#555555}
- } {
+ set segment_color $DIMMED_COLOR
+ } else {
incr segment_color -1
set segment_color [lindex $COLORS [list $color_idx $segment_color]]
}
@@ -998,6 +1026,7 @@ class MultiplexedLedDisplay {
$conf_led_color \
$conf_dim_interval \
$common_anode \
+ $keep_win_on_top \
] \
]
}
@@ -1013,7 +1042,7 @@ class MultiplexedLedDisplay {
# Restore window geometry
if {[string length [lindex $state 2]]} {
- wm geometry $win [lindex $state 2]
+ wm geometry $win [regsub {^\=?\d+x\d+} [lindex $state 2] [join [wm minsize $win] {x}]]
}
# Load user note
@@ -1028,6 +1057,13 @@ class MultiplexedLedDisplay {
set common_anode 1
}
+ if {[lindex $state 7] != {}} {
+ set keep_win_on_top [lindex $state 7]
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ }
+ }
+
## Restore state of ComboBoxes
# For segments ...
for {set i 0} {$i < 8} {incr i} {
@@ -1083,12 +1119,13 @@ class MultiplexedLedDisplay {
}
# Accept new state of ports
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
update
# Fail
}]} then {
- puts stderr "Unable to load config for $class_name"
+ puts stderr "Unable to load configuration for $class_name"
puts stderr $::errorInfo
return 0
@@ -1103,7 +1140,8 @@ class MultiplexedLedDisplay {
# @return void
public method reset {} {
dim_all
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
@@ -1117,6 +1155,7 @@ class MultiplexedLedDisplay {
set ::${class_name}::dim_interval $conf_dim_interval
set ::${class_name}::color $conf_led_color
set ::${class_name}::cfg_common_anode $common_anode
+ set ::${class_name}::menu_keep_win_on_top $keep_win_on_top
}
## This method is called after configuration menu has beed created
@@ -1135,7 +1174,7 @@ class MultiplexedLedDisplay {
#
# Note: There is defined text tag "tag_bold" in the text widget
public method show_help_special {text_widget} {
- $text_widget insert insert [mc "Virtual multiplexed LED display with common anode (default) or catode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file (with extension vhc). And can be loaded from that file later. LED fade out interval and LED colors are configurable\n\n"]
+ $text_widget insert insert [mc "Virtual Multiplexed LED Display with common anode (default) or cathode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. LED fade out interval and LED colors are configurable.\n\n"]
set color_idx [lsearch -ascii -exact \
{red orange yellow green blue purple} \
@@ -1145,7 +1184,7 @@ class MultiplexedLedDisplay {
$text_widget insert insert [mc "LED states:"]
$text_widget tag add tag_bold {insert linestart} {insert lineend}
$text_widget insert insert [mc "\n "]
- $text_widget window create insert -pady 1 -create "frame $text_widget.f0 -bd 1 -width 14 -height 16 -bg #888888"
+ $text_widget window create insert -pady 1 -create "frame $text_widget.f0 -bd 1 -width 14 -height 16 -bg $DIMMED_COLOR"
$text_widget insert insert [mc " Off\n "]
$text_widget window create insert -pady 1 -create "frame $text_widget.f1 -bd 1 -width 14 -height 16 -bg [lindex $COLORS [list $color_idx 0]]"
$text_widget insert insert [mc " Fast blinking\n "]
@@ -1172,8 +1211,13 @@ class MultiplexedLedDisplay {
}
}
}
- } {
- new_state [$project pale_get_true_state] 1
+ } else {
+ set state [$project pale_get_true_state]
+ new_state state 1
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/pale/pale.tcl b/lib/pale/pale.tcl
index 3b4b61c..37a3fe1 100755..100644
--- a/lib/pale/pale.tcl
+++ b/lib/pale/pale.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,22 +21,33 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _PALE_TCL ] } {
+set _PALE_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# PALE (Peripheral Abstraction Layer Engine) - simulates virtual hardware
# --------------------------------------------------------------------------
-# Load base class for Virtual HW components
-source "${::LIB_DIRNAME}/pale/virtual_hw_component.tcl"
-
-# Load Virtual HW components
-source "${::LIB_DIRNAME}/pale/ledpanel.tcl"
-source "${::LIB_DIRNAME}/pale/leddisplay.tcl"
-source "${::LIB_DIRNAME}/pale/ledmatrix.tcl"
-source "${::LIB_DIRNAME}/pale/multiplexedleddisplay.tcl"
-source "${::LIB_DIRNAME}/pale/simplekeypad.tcl"
-source "${::LIB_DIRNAME}/pale/matrixkeypad.tcl"
+if {$::GUI_AVAILABLE} {
+ # Load base class for Virtual HW components
+ source "${::LIB_DIRNAME}/pale/virtual_hw_component.tcl"
+
+ # Load Virtual HW components
+ source "${::LIB_DIRNAME}/pale/ledpanel.tcl"
+ source "${::LIB_DIRNAME}/pale/leddisplay.tcl"
+ source "${::LIB_DIRNAME}/pale/ledmatrix.tcl"
+ source "${::LIB_DIRNAME}/pale/multiplexedleddisplay.tcl"
+ source "${::LIB_DIRNAME}/pale/simplekeypad.tcl"
+ source "${::LIB_DIRNAME}/pale/matrixkeypad.tcl"
+ source "${::LIB_DIRNAME}/pale/lcd_hd44780.tcl"
+ source "${::LIB_DIRNAME}/pale/ds1620.tcl"
+ source "${::LIB_DIRNAME}/pale/virtual_uart_term.tcl"
+ source "${::LIB_DIRNAME}/pale/file_interface.tcl"
+}
class Pale {
private variable scenario_file {} ;# String: Name of PALE scenario file
@@ -49,7 +60,7 @@ class Pale {
private variable portConfig ;# Array of Int: Index 0..4, defines port pin functions
private variable portConfig_mod 0 ;# Bool: $portConfig contain special configuration
- private variable instruction_cycles 0 ;# Int: Nummber of instruction cycles performed during this simulation cycle
+ private variable instruction_cycles 0 ;# Int: Number of instruction cycles performed during this simulation cycle
private variable last_output {} ;# List: 5x{8x{...}} Last port outputs
private variable last_input {} ;# List: 5x{8x{...}} Last port inputs
@@ -130,7 +141,7 @@ class Pale {
# Try to open the file
if {[catch {
- set file [open $scenario_file "w" 420]
+ set file [open $scenario_file "w" 0640]
}]} then {
puts stderr "Unable to save to file: \"$scenario_file\""
return 0
@@ -138,8 +149,7 @@ class Pale {
# Save data to the file
puts $file "# MCU 8051 IDE: Virtual HW configuration file"
- puts $file "# Date: [clock format [clock seconds] -format {%D}]"
- puts $file "# Project: [string trim $this {:}]\n"
+ puts $file "# Project: [$this cget -projectName]\n"
foreach dev [concat $output_devices $input_devices] {
puts $file [$dev get_config]
}
@@ -177,7 +187,7 @@ class Pale {
if {![string first $prj_path $scenario_file]} {
return [string range $scenario_file [string length $prj_path] end]
# Return absolute directory location
- } {
+ } else {
return $scenario_file
}
}
@@ -210,7 +220,7 @@ class Pale {
![file exists $filename] ||
![file isfile $filename] ||
(!$::MICROSOFT_WINDOWS && ![file readable $filename])
- } {
+ } then {
return 0
}
@@ -259,7 +269,7 @@ class Pale {
$obj set_config $conf
# Error detected
}]} then {
- puts stderr "Unable to create PALE object: \"$obj\", maybe you are using old version of MCU 8051 IDE\n"
+ puts stderr "Unable to create PALE object: \"$obj\", maybe you are using an old version of MCU 8051 IDE.\n"
puts stderr $::errorInfo
catch {
@@ -387,7 +397,7 @@ class Pale {
{X} { ;# Access to external memory
append result [expr {rand() < 0.5}]
}
- {-} { ;# Undeterminable value (some noise)
+ {-} { ;# Indeterminable value (some noise)
append result [expr {rand() < 0.5}]
}
{|} { ;# High frequency
@@ -406,21 +416,18 @@ class Pale {
}
## Read Real Port Pin Voltage - 1 bit value (0 or 1)
- # @parm List - {port_number bit_number}
- # @parm Int = 0 - Position in history (positive number)
+ # @parm List pn_bn - {port_number bit_number}
+ # @parm Int position=0 - Position in history (positive number)
# @return Bool - Boolean value
- public method pale_RRPPV args {
+ public method pale_RRPPV {pn_bn {position 0}} {
if {!$is_enabled} {return 1}
# Parse input arguments
- set port [lindex $args {0 0}]
- set bit [lindex $args {0 1}]
- set position [lindex $args 1]
+ set port [lindex $pn_bn 0]
+ set bit [lindex $pn_bn 1]
# Adjust arguments
- if {![string length $position]} {
- set position 0
- } elseif {$position < 0} {
+ if {$position < 0} {
set position [expr {[llength $portState] + $position}]
}
set bit [expr {7 - $bit}]
@@ -453,30 +460,20 @@ class Pale {
}
## Write to port with bypassed latch (takes effect on next simulation cycle)
- # @parm Int - Port number
- # @parm List - New value -- list of 8 values {bit0 bit1 bit2 ... bit7}
+ # @parm Int port - Port number
+ # @parm List value - New value -- list of 8 values {bit0 bit1 bit2 ... bit7}
# '0' - Logical 0
# '1' - Logical 1
# '|' - High frequency pulse
# 'X' - Access to external memory
# '?' - No volatge
- # '-' - Undeterminable value (some noise)
+ # '-' - Indeterminable value (some noise)
# '=' - High forced to low
- # @parm Int = 0 - Position in history (zero or negative number)
+ # @parm Int position=0 - Position in history (zero or negative number)
# @return void
- public method pale_WPBL args {
+ public method pale_WPBL {port value {position 0}} {
if {!$is_enabled} {return}
- # Parse input arguments
- set port [lindex $args 0]
- set value [lindex $args 1]
- set position [lindex $args 2]
-
- # Adjust arguments
- if {![string length $position]} {
- set position 0
- }
-
# Set value
for {set bit 0} {$bit < 8} {incr bit} {
lappend special_func [list $port $bit $value $position]
@@ -484,30 +481,24 @@ class Pale {
}
## Write to port bit with bypassed latch
- # @parm List - {port_number bit_number}
- # @parm Char - New value
+ # @parm List pn_bn - {port_number bit_number}
+ # @parm Char value - New value
# '0' - Logical 0
# '1' - Logical 1
# '|' - High frequency pulse
# 'X' - Access to external memory
# '?' - No volatge
- # '-' - Undeterminable value (some noise)
+ # '-' - Indeterminable value (some noise)
# '=' - High forced to low
- # @parm Int = 0 - Position in history (zero or negative number)
+ # @parm Int position=0 - Position in history (zero or negative number)
# @return void
- public method pale_WPBBL args {
+ public method pale_WPBBL {pn_bn value {position 0}} {
if {!$is_enabled} {return}
# Parse input arguments
- set port [lindex $args {0 0}]
- set bit [lindex $args {0 1}]
- set value [lindex $args 1]
- set position [lindex $args 2]
+ set port [lindex $pn_bn 0]
+ set bit [lindex $pn_bn 1]
- # Adjust arguments
- if {![string length $position]} {
- set position 0
- }
set bit [expr {7 - $bit}]
# Set value
@@ -583,7 +574,7 @@ class Pale {
for {set i -1; set j 0} {$j < $instruction_cycles} {incr i; incr j} {
if {$i < 0} {
set previous_output_state $last_output
- } {
+ } else {
set previous_output_state [lindex $portOutput $i]
}
foreach prev $previous_output_state new [lindex $portOutput $j] port {0 1 2 3 4} {
@@ -638,16 +629,16 @@ class Pale {
set last_output [lindex $portOutput end]
set last_input [lindex $portInput end]
set last_state [lindex $portState end]
- set portLatch [list]
- set portOutput [list]
- set portInput [list]
+ set portLatch [list]
+ set portOutput [list]
+ set portInput [list]
set special_func [list]
# Inform output devices about the new port outputs
foreach dev $output_devices {
- $dev new_state $last_state
- update
+ $dev new_state last_state
}
+ update
}
## Determinate resulting value when two values clash on one wire
@@ -678,7 +669,7 @@ class Pale {
{?} { ;# No volatge
return $in1
}
- {-} { ;# Undeterminable value (some noise)
+ {-} { ;# Indeterminable value (some noise)
return {-}
}
{=} { ;# High forced to low
@@ -690,7 +681,7 @@ class Pale {
{1} { ;# Logical 1
if {$in1 == {?}} {
return 1
- } {
+ } else {
return $in1
}
}
@@ -712,8 +703,10 @@ class Pale {
# Call all input devices
foreach dev $input_devices {
# Call device to change the current state
- set input [$dev new_state $input]
- update
+ $dev new_state input
+
+ # Clear list of devices already confronted with the new state
+ set already_evaluated [list]
# Inform all other devices interconnected with this one
for {set p 0} {$p < 5} {incr p} {
@@ -729,17 +722,22 @@ class Pale {
# Call all affected devices
foreach affected_dev $engaged_pins($p,$b) {
+ # Do not confront the device with itself
if {$affected_dev == $dev} {
continue
}
- set input [$affected_dev new_state $input]
- update
+ # Do not confront the device with another device more than once per ``foreach dev ...'' iteration
+ if {[lsearch -ascii -exact $already_evaluated $affected_dev] != -1} {
+ continue
+ }
+
+ lappend already_evaluated $affected_dev
+ $affected_dev new_state input
}
# Again call the current device
- set input [$dev new_state $input]
- update
+ $dev new_state input
}
}
}
@@ -762,9 +760,9 @@ class Pale {
# Inform output devices about the new port outputs
foreach dev $output_devices {
- $dev new_state $last_state
- update
+ $dev new_state last_state
}
+ update
}
## Call input devices to evaluate input values
@@ -776,8 +774,10 @@ class Pale {
# Call all input devices
foreach dev $input_devices {
# Call device to change the current state
- set input [$dev new_state $input]
- update
+ $dev new_state input
+
+ # Clear list of devices already confronted with the new state
+ set already_evaluated [list]
# Inform all other devices interconnected with this one
for {set p 0} {$p < 5} {incr p} {
@@ -793,17 +793,21 @@ class Pale {
# Call all affected devices
foreach affected_dev $engaged_pins($p,$b) {
+ # Do not confront the device with itself
if {$affected_dev == $dev} {
continue
}
- set input [$affected_dev new_state $input]
- update
+ # Do not confront the device with another device more than once per ``foreach dev ...'' iteration
+ if {[lsearch -ascii -exact $already_evaluated $affected_dev] != -1} {
+ continue
+ }
+
+ $affected_dev new_state input
}
# Again call the current device
- set input [$dev new_state $input]
- update
+ $dev new_state input
}
}
}
@@ -890,6 +894,9 @@ class Pale {
pale_disengage_pin_by_input_device $p $b $object
}
}
+
+ # Make this change in the environment visible right away
+ pale_reevaluate_IO
}
## Inform PALE system about that than some input device is
@@ -907,6 +914,9 @@ class Pale {
# * PALE VHW component must extend class "VirtualHWComponent"
# * Input devices CAN affect port inputs, output cannot
public method pale_engage_pin_by_input_device {port pin dev} {
+ if {[lsearch -ascii -exact $engaged_pins($port,$pin) $dev] != -1} {
+ return
+ }
lappend engaged_pins($port,$pin) $dev
}
@@ -928,6 +938,7 @@ class Pale {
# * Input devices CAN affect port inputs, output cannot
public method pale_disengage_pin_by_input_device {port pin dev} {
set idx [lsearch -ascii -exact $engaged_pins($port,$pin) $dev]
+
if {$idx == -1} {
return
}
@@ -955,7 +966,7 @@ class Pale {
# '|' - High frequency pulse
# 'X' - Access to external memory
# '?' - No volatge
- # '-' - Undeterminable value (some noise)
+ # '-' - Indeterminable value (some noise)
# '=' - High forced to low
public method pale_get_output_state {} {
return $last_output
@@ -969,15 +980,15 @@ class Pale {
# '|' - High frequency pulse
# 'X' - Access to external memory
# '?' - No volatge
- # '-' - Undeterminable value (some noise)
+ # '-' - Indeterminable value (some noise)
# '=' - High forced to low
public method pale_get_true_state {} {
return $last_state
}
- ## Get list of avaliable port number on the current MCU
+ ## Get list of available port number on the current MCU
# @return List of Int - e.g. {1 3}
- public method pale_get_avaliable_ports {} {
+ public method pale_get_available_ports {} {
return [lindex [$this get_ports_info] 1]
}
@@ -988,4 +999,14 @@ class Pale {
$dev mcu_changed
}
}
+
+ ## Get number of instruction cycles performed during this simulation cycle
+ # @return Int - Number of instruction cycles
+ public method pale_get_number_of_instruction_cycles {} {
+ return $instruction_cycles
+ }
+}
+
+# >>> File inclusion guard
}
+# <<< File inclusion guard
diff --git a/lib/pale/simplekeypad.tcl b/lib/pale/simplekeypad.tcl
index d7baa83..0889106 100755..100644
--- a/lib/pale/simplekeypad.tcl
+++ b/lib/pale/simplekeypad.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 _SIMPLEKEYPAD_TCL ] } {
+set _SIMPLEKEYPAD_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
@@ -36,15 +41,15 @@ class SimpleKeyPad {
inherit VirtualHWComponent
# Font: Font to be used in the panel -- bold
- common cb_font [font create \
- -weight bold \
- -size -10 \
- -family {helvetica} \
+ common cb_font [font create \
+ -weight bold \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -family {helvetica} \
]
# Font: Font to be used in the panel -- normal weight
- common cb_font_n [font create \
- -size -10 \
- -family {helvetica} \
+ common cb_font_n [font create \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -family {helvetica} \
]
common COMPONENT_NAME "Simple Keypad" ;# Name of this component
@@ -63,9 +68,14 @@ class SimpleKeyPad {
"Save configuration into a file"}
{command {Load configuration} {} 0 "load_from" {fileopen}
"Load configuration from a file"}
+ {separator}
+ {checkbutton "Window always on top" {} {::SimpleKeyPad::menu_keep_win_on_top}
+ 1 0 0 {keep_win_on_top_changed}
+ ""}
}
- private variable radio_buttons ;# Bool: Disallow key combinations
+ private variable radio_buttons 0 ;# Bool: Disallow key combinations
+ private variable keep_win_on_top 0 ;# Bool: Toplevel window
private variable keys ;# Array of Bool: Indicates key press
private variable wire ;# Array of CanvasObject (line): Wires connected to MCU pins
private variable wire_o ;# Array of CanvasObject (oval): Wires connected to MCU pins
@@ -74,7 +84,7 @@ class SimpleKeyPad {
private variable text ;# Array of CanvasObject (text): Key descriptions
private variable connection_port ;# Array of Int: Index is key number, value is port number or {-}
private variable connection_pin ;# Array of Int: Index is key number, value is bit number or {-}
- private variable enaged ;# Array of Bool: enaged(port_num,bit_num) --> Is connected to this device ?
+ private variable enaged ;# Array of Bool: enaged(port_num,bit_num) --> Is connected to this device?
# ------------------------------------------------------------------
@@ -181,12 +191,12 @@ class SimpleKeyPad {
# @return void
private method create_gui {} {
# Create panel window and canvas widget
- set win [toplevel .simplekeypad$count -class $component_name -bg {#EEEEEE}]
+ set win [toplevel .simplekeypad$count -class $component_name -bg ${::COMMON_BG_COLOR}]
set canvas_widget [canvas $win.canvas -bg white -width 0 -height 0]
set cb_p_y 65
set cb_b_y 85
- set usr_n_y 105
+ set usr_n_y 110
set x 50
# Create labels
@@ -198,13 +208,13 @@ class SimpleKeyPad {
-text [mc "BIT"] \
-font $cb_font \
-anchor w
- $canvas_widget create text 5 $usr_n_y \
+ $canvas_widget create text 32 $usr_n_y \
-text [mc "Note"] \
-font $cb_font \
- -anchor w
+ -anchor e
$canvas_widget create window 37 $usr_n_y \
-window [ttk::entry $canvas_widget.usr_note \
- -validate all \
+ -validate key \
-validatecommand "$this set_modified" \
] \
-width 220 -anchor w
@@ -251,7 +261,7 @@ class SimpleKeyPad {
-text [mc "Turn HW simulation on/off"]
setStatusTip -widget $start_stop_button -text [mc "Turn HW simulation on/off"]
bind $start_stop_button <Button-3> "$this on_off_button_press; break"
- $canvas_widget create window 2 20 -window $start_stop_button -anchor sw
+ $canvas_widget create window 2 22 -window $start_stop_button -anchor sw
bindtags $start_stop_button [list $start_stop_button TButton all .]
# Create configuration menu button
@@ -261,16 +271,16 @@ class SimpleKeyPad {
-command "$this config_menu" \
]
setStatusTip -widget $conf_button -text [mc "Configure"]
- $canvas_widget create window 2 20 -window $conf_button -anchor nw
+ $canvas_widget create window 2 22 -window $conf_button -anchor nw
bindtags $conf_button [list $conf_button TButton all .]
# Pack canvas
pack $canvas_widget -fill both -expand 1
# Set window parameters
- wm geometry $win =260x120
+ wm minsize $win 265 125
wm iconphoto $win ::ICONS::16::$component_icon
- wm title $win "[mc $component_name] - [string trim $project {:}] - MCU 8051 IDE"
+ wm title $win "[mc $component_name] - [$project cget -projectName] - MCU 8051 IDE"
wm resizable $win 0 0
wm protocol $win WM_DELETE_WINDOW "$this close_window"
bindtags $win [list $win Toplevel all .]
@@ -319,7 +329,7 @@ class SimpleKeyPad {
$canvas_widget itemconfigure $rect($i) -outline #333333 -width 2
# Key released
- } {
+ } else {
$canvas_widget itemconfigure $lever(0$i) -fill #000000
$canvas_widget itemconfigure $lever(1$i) -fill #FFFFFF
$canvas_widget itemconfigure $text($i) -font $cb_font_n
@@ -333,7 +343,7 @@ class SimpleKeyPad {
public method key_leave {i} {
if {$keys($i)} {
set color {#333333}
- } {
+ } else {
set color {#CCCCCC}
}
$canvas_widget itemconfigure $rect($i) -outline $color
@@ -436,6 +446,17 @@ class SimpleKeyPad {
set radio_buttons $::SimpleKeyPad::menu_radio_buttons
}
+ ## Value of configuration menu variable "keep_win_on_top" has been changed
+ # @return void
+ public method keep_win_on_top_changed {} {
+ set keep_win_on_top $SimpleKeyPad::menu_keep_win_on_top
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ } else {
+ wm attributes $win -topmost 0 -alpha 1.0
+ }
+ }
+
# ------------------------------------------------------------------
# VIRTUAL HW COMMON INTERFACE -- CALLED FROM PALE ENGINE
# ------------------------------------------------------------------
@@ -444,12 +465,12 @@ class SimpleKeyPad {
# @return void
public method mcu_changed {} {
# Refresh lists of possible values in port selection ComboBoxes
- set avaliable_ports [concat - [$project pale_get_avaliable_ports]]
+ set available_ports [concat - [$project pale_get_available_ports]]
for {set i 0} {$i < 8} {incr i} {
- $canvas_widget.cb_p$i configure -values $avaliable_ports
+ $canvas_widget.cb_p$i configure -values $available_ports
- if {[lsearch -ascii -exact $avaliable_ports $connection_port($i)] == -1} {
+ if {[lsearch -ascii -exact $available_ports $connection_port($i)] == -1} {
$canvas_widget.cb_p$i current 0
set connection_port($i) {-}
}
@@ -465,11 +486,13 @@ class SimpleKeyPad {
# '|' - High frequency
# 'X' - Access to external memory
# '?' - No volatge
- # '-' - Undeterminable value (some noise)
+ # '-' - Indeterminable value (some noise)
# '=' - High forced to low
# '0' - Logical 0
# '1' - Logical 1
- public method new_state {state} {
+ public method new_state {_state} {
+ upvar $_state state
+
# Iterate over keys
for {set i 0} {$i < 8} {incr i} {
# Determinate index in the list of port states
@@ -479,7 +502,7 @@ class SimpleKeyPad {
if {[lindex $pp 0] == {-} || [lindex $pp 1] == {-} || !$drawing_on} {
if {$keys($i)} {
set wire_color {#00DD00}
- } {
+ } else {
set wire_color {#000000}
}
@@ -522,9 +545,6 @@ class SimpleKeyPad {
$canvas_widget itemconfigure $lever($keys(${i})${i}) -fill $wire_color
$canvas_widget itemconfigure $wire_o($i) -outline $wire_color
}
-
- # Return new port states
- return $state
}
## Withdraw panel window from the screen
@@ -545,6 +565,7 @@ class SimpleKeyPad {
[$canvas_widget.usr_note get] \
[array get keys] \
$radio_buttons \
+ $keep_win_on_top \
] \
]
}
@@ -560,7 +581,7 @@ class SimpleKeyPad {
# Restore window geometry
if {[string length [lindex $state 2]]} {
- wm geometry $win [lindex $state 2]
+ wm geometry $win [regsub {^\=?\d+x\d+} [lindex $state 2] [join [wm minsize $win] {x}]]
}
# Load user note
@@ -570,6 +591,12 @@ class SimpleKeyPad {
# Restore keys configuration and states
array set keys [lindex $state 4]
set radio_buttons [lindex $state 5]
+ if {[lindex $state 6] != {}} {
+ set keep_win_on_top [lindex $state 6]
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1
+ }
+ }
# Restore state of ComboBoxes
for {set i 0} {$i < 8} {incr i} {
@@ -608,7 +635,7 @@ class SimpleKeyPad {
# Fail
}]} then {
- puts "Unable to load config for $class_name"
+ puts "Unable to load configuration for $class_name"
return 0
# Success
@@ -621,7 +648,8 @@ class SimpleKeyPad {
## Simulated MCU has been reseted
# @return void
public method reset {} {
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
# ------------------------------------------------------------------
@@ -631,7 +659,8 @@ class SimpleKeyPad {
## This method is called before configuration menu invocation
# @return void
public method config_menu_special {} {
- set ::SimpleKeyPad::menu_radio_buttons $radio_buttons
+ set ::${class_name}::menu_radio_buttons $radio_buttons
+ set ::${class_name}::menu_keep_win_on_top $keep_win_on_top
}
## This method is called after configuration menu has beed created
@@ -645,7 +674,7 @@ class SimpleKeyPad {
#
# Note: There is defined text tag "tag_bold" in the text widget
public method show_help_special {text_widget} {
- $text_widget insert insert [mc "This tool consists of 8 switches. Each of them can connect any port pin of the simulated uC to the ground. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file (with extension vhc). And can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n"]
+ $text_widget insert insert [mc "This tool consists of 8 switches. Each of them can connect any port pin of the simulated uC to ground. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n"]
$text_widget insert insert [mc "Keypad can be configured in two ways:"]
$text_widget tag add tag_bold {insert linestart} {insert lineend}
$text_widget insert insert [mc "\n "]
@@ -654,7 +683,7 @@ class SimpleKeyPad {
$text_widget insert insert [mc " To allow key combinations\n Menu -> Check \"Radio buttons\"\n "]
$text_widget insert insert [mc "2)"]
$text_widget tag add tag_bold {insert linestart} {insert lineend}
- $text_widget insert insert [mc " To do not allow key combinations\n Menu -> Uncheck \"Radio buttons\""]
+ $text_widget insert insert [mc " To not allow key combinations\n Menu -> Uncheck \"Radio buttons\""]
}
## This method is called before panel window closure
@@ -665,6 +694,11 @@ class SimpleKeyPad {
## Commit new on/off state
# @return void
public method on_off_special {} {
- new_state [$project pale_get_true_state]
+ set state [$project pale_get_true_state]
+ new_state state
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/pale/virtual_hw_component.tcl b/lib/pale/virtual_hw_component.tcl
index e0fb00b..c7a637d 100755..100644
--- a/lib/pale/virtual_hw_component.tcl
+++ b/lib/pale/virtual_hw_component.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 _VIRTUAL_HW_COMPONENT_TCL ] } {
+set _VIRTUAL_HW_COMPONENT_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
@@ -32,13 +37,15 @@ class VirtualHWComponent {
common hlp_dlg_count 0 ;# Int: Counter of help dialog instances
# Create fonts used in the text
- common hlp_normal_font [font create \
- -family {helvetica} \
- -size -14 -weight {normal} \
+ common hlp_normal_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight {normal} \
]
- common hlp_bold_font [font create \
- -family {helvetica} \
- -size -14 -weight {bold} \
+ common hlp_bold_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight {bold} \
]
protected variable config_menu_created 0 ;# Bool: COnfiguration menu created
@@ -47,9 +54,9 @@ class VirtualHWComponent {
protected variable modified 0 ;# Bool: Flag modified
protected variable project ;# Object: Project object
- protected variable win ;# Widget: Dialog window
+ protected variable win {} ;# Widget: Dialog window
protected variable drawing_on 1 ;# Bool: Flag panel enabled
- protected variable canvas_widget ;# Widget: Canvas widget - crucial part of the window
+ protected variable canvas_widget {} ;# Widget: Canvas widget - crucial part of the window
protected variable start_stop_button ;# Widget: Button "ON/OFF"
protected variable conf_button ;# Widget: Button to invoke configuration menu
@@ -78,7 +85,7 @@ class VirtualHWComponent {
-icon question \
-parent $win \
-title [mc "Component modified"] \
- -message [mc "Do you want to save configuration of this panel before closing ?"] \
+ -message [mc "Do you want to save the configuration of this panel before closing?"] \
] {
{yes} {
save_as
@@ -105,6 +112,10 @@ class VirtualHWComponent {
set modified 1
$project pale_set_modified
+ if {[winfo exists $win]} {
+ wm title $win "\[modified\] [regsub {^\[modified\] } [wm title $win] {}]"
+ }
+
return 1
}
@@ -112,6 +123,10 @@ class VirtualHWComponent {
# @return void
public method clear_modified {} {
set modified 0
+
+ if {[winfo exists $win]} {
+ wm title $win [regsub {^\[modified\] } [wm title $win] {}]
+ }
}
## Invoke configuration menu
@@ -136,9 +151,9 @@ class VirtualHWComponent {
# @return void
protected method create_config_menu {} {
set config_menu_created 1
- set conf_menu $canvas_widget.conf_menu
- menuFactory [subst "\${${class_name}::CONFMENU}"] \
- $conf_menu 0 "$this " 0 {}
+ set conf_menu $win.conf_menu
+ menuFactory [subst -nocommands "\${${class_name}::CONFMENU}"] \
+ $conf_menu 0 "$this " 0 {} [$this info class]
$this create_config_menu_special
}
@@ -149,14 +164,14 @@ class VirtualHWComponent {
# Create file selection dialog
catch {delete object ::fsd}
KIFSD::FSD ::fsd \
- -title "[mc {Save configuration}] - [mc $component_name] - [string trim $project {:}] - MCU 8051 IDE" \
+ -title "[mc {Save configuration}] - [mc $component_name] - [$project cget -projectName] - MCU 8051 IDE" \
-master $win \
-directory [$project cget -projectPath] \
-initialfile [file tail $current_filename] \
- -defaultmask 0 -multiple 0 -filetypes {
- {{VH component} {*.vhc} }
- {{All files} {*} }
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "VH component"] {*.vhc} ] \
+ [list [mc "All files"] {*} ] \
+ ]
# Open file after press of OK button
::fsd setokcmd "$this save_config_to_file \[::fsd get\]"
@@ -171,14 +186,14 @@ class VirtualHWComponent {
# Create file selection dialog
catch {delete object ::fsd}
KIFSD::FSD ::fsd \
- -title "[mc {Load configuration}] - [mc $component_name] - [string trim $project {:}] - MCU 8051 IDE" \
+ -title "[mc {Load configuration}] - [mc $component_name] - [$project cget -projectName] - MCU 8051 IDE" \
-master $win \
-directory [$project cget -projectPath] \
-initialfile [file tail $current_filename] \
- -defaultmask 0 -multiple 0 -filetypes {
- {{VH component} {*.vhc} }
- {{All files} {*} }
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "VH component"] {*.vhc} ] \
+ [list [mc "All files"] {*} ] \
+ ]
# Open file after press of OK button
::fsd setokcmd "$this load_config_from_file \[::fsd get\]"
@@ -208,9 +223,9 @@ class VirtualHWComponent {
-icon question \
-parent $win \
-title [mc "Overwrite file"] \
- -message [mc "A file with name '%s' already exists. Do you want to overwrite it ?" [file tail $filename]]
+ -message [mc "A file with name '%s' already exists. Do you want to overwrite it?" [file tail $filename]]
] != {yes}
- } {
+ } then {
return 0
}
}
@@ -224,7 +239,7 @@ class VirtualHWComponent {
# Try to open the file
if {[catch {
- set file [open $filename {w} 420]
+ set file [open $filename {w} 0640]
}]} then {
tk_messageBox \
-type ok \
@@ -241,15 +256,14 @@ class VirtualHWComponent {
# Save configuration to the file
puts $file "# MCU 8051 IDE: Virtual HW component configuration file"
- puts $file "# Date: [clock format [clock seconds] -format {%D}]"
- puts $file "# Project: [string trim $project {:}]"
+ puts $file "# Project: [$project cget -projectName]"
puts $file "# Component: $component_name\n"
puts $file $config
# Finalize
set current_filename $filename
close $file
- set modified 0
+ clear_modified
return 1
}
@@ -310,18 +324,19 @@ class VirtualHWComponent {
# Finalize ...
set current_filename $filename
close $file
- set modified 0
+ clear_modified
return 1
}
## Show help dialog
+ # @parm Bool leave_empty=0 - Do not write implicitly anything into the help window
# @return void
- public method show_help {} {
+ public method show_help {{leave_empty 0}} {
# Increment counter of help dialog instances
incr hlp_dlg_count
# Create toplevel window
- set dialog [toplevel .help_dialog_${class_name}_${hlp_dlg_count} -class {Help} -bg {#EEEEEE}]
+ set dialog [toplevel .help_dialog_${class_name}_${hlp_dlg_count} -class {Help} -bg ${::COMMON_BG_COLOR}]
## Create top frame (header and icon)
set top_frame [frame $dialog.top_frame]
@@ -332,7 +347,7 @@ class VirtualHWComponent {
# Header text
pack [label $top_frame.header_label \
-anchor w -justify left \
- -text $component_name \
+ -text [namespace eval ::$class_name "mc {$component_name}"] \
] -side left
pack $top_frame -anchor n -pady 2
@@ -351,20 +366,15 @@ class VirtualHWComponent {
-command "$text_widget yview" \
] -side right -fill y
# Finalize ...
- pack $main_frame -fill both -expand 1
+ pack $main_frame -fill both -expand 1 -padx 2
- ## Create bottom frame (button close)
- # Separator
- pack [ttk::separator $dialog.sep \
- -orient horizontal \
- ] -fill x
# Button "Close"
pack [ttk::button $dialog.close_button \
-text [mc "Close"] \
-compound left \
-image ::ICONS::16::button_cancel \
-command "destroy $dialog" \
- ] -ipady 0
+ ] -ipady 0 -pady 2
# Create text tags in the text widget
@@ -373,30 +383,32 @@ class VirtualHWComponent {
# Fill in the text widget with the help message
$this show_help_special $text_widget
- ## Display section "Wire colors"
- $text_widget insert insert "\n\n"
- $text_widget insert insert [mc "Wire colors:"]
- $text_widget tag add tag_bold {insert linestart} {insert lineend}
- $text_widget insert insert "\n"
- # Create canvas widget
- set cw [canvas $text_widget.canvas\
- -bg {#FFFFFF} \
- -takefocus 0 \
- -cursor left_ptr \
- -bd 0 -relief flat \
- -width 170 -height 110 \
- ]
- bind $cw <Button-5> "$text_widget yview scroll +5 units; break"
- bind $cw <Button-4> "$text_widget yview scroll -5 units; break"
- # Fill in the canvas widget
- $project Graph_create_legend $cw 1
- # Show the canvas widget
- $text_widget window create insert -window $cw
+ if {!$leave_empty} {
+ ## Display section "Wire colors"
+ $text_widget insert insert "\n\n"
+ $text_widget insert insert [mc "Wire colors:"]
+ $text_widget tag add tag_bold {insert linestart} {insert lineend}
+ $text_widget insert insert "\n"
+ # Create canvas widget
+ set cw [canvas $text_widget.canvas\
+ -bg {#FFFFFF} \
+ -takefocus 0 \
+ -cursor left_ptr \
+ -bd 0 -relief flat \
+ -width 170 -height 110 \
+ ]
+ bind $cw <Button-5> "$text_widget yview scroll +5 units; break"
+ bind $cw <Button-4> "$text_widget yview scroll -5 units; break"
+ # Fill in the canvas widget
+ $project Graph_create_legend $cw 1
+ # Show the canvas widget
+ $text_widget window create insert -window $cw
+ }
# Finalize ...
$text_widget configure -state disabled
- wm minsize $dialog 300 300
- wm title $dialog $component_name
+ wm minsize $dialog [expr {int(300 * $::font_size_factor)}] [expr {int(300 * $::font_size_factor)}]
+ wm title $dialog [namespace eval ::$class_name "mc {$component_name}"]
wm iconphoto $dialog ::ICONS::16::help
focus -force $dialog.close_button
}
@@ -411,13 +423,17 @@ class VirtualHWComponent {
## Adjust apparence of "ON/OFF" button
# Turn ON
if {$state} {
- $start_stop_button configure -style GreenBg.TButton -text "ON"
+ $start_stop_button configure -style GreenBg.TButton -text [mc "ON"]
# Turn OFF
} else {
- $start_stop_button configure -style RedBg.TButton -text "OFF"
+ $start_stop_button configure -style RedBg.TButton -text [mc "OFF"]
}
# Call component specific procedure
$this on_off_special
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/pale/virtual_uart_term.tcl b/lib/pale/virtual_uart_term.tcl
new file mode 100644
index 0000000..f78b803
--- /dev/null
+++ b/lib/pale/virtual_uart_term.tcl
@@ -0,0 +1,1682 @@
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# Copyright (C) 2011 by Martin Ošmera #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _VIRTUAL_UART_TERM_TCL ] } {
+set _VIRTUAL_UART_TERM_TCL _
+# <<< File inclusion guard
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+#
+# -------------------------------------------------------------------------
+
+class VirtualUARTTerminal {
+ inherit VirtualHWComponent
+
+ # Font: Big bold font
+ common bold_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] -weight {bold} \
+ ]
+ # Font: Tiny normal font
+ common tiny_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-9 * $::font_size_factor)}] -weight {normal} \
+ ]
+ # Font: Tiny bold font
+ common tiny_font_bold [font create \
+ -family {helvetica} \
+ -size [expr {int(-9 * $::font_size_factor)}] -weight {bold} \
+ ]
+ # Font: Normal font
+ common normal_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-11 * $::font_size_factor)}] -weight {normal} \
+ ]
+ # Font: Also normal font, but a bit larger
+ common big_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] -weight {normal} \
+ ]
+ # Font: Font to be used in the panel -- bold
+ common cb_font [font create \
+ -weight bold \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -family {helvetica} \
+ ]
+
+ # List of Int: Available baud rates for RS232
+ common available_baud_rates {
+ 50 75 110 134 150 200
+ 300 600 1200 1800 2400 4800
+ 9600 19200 38400 57600 115200 230400
+ 460800
+ }
+
+ common COMPONENT_NAME "Virtual UART Terminal" ;# Name of this component
+ common CLASS_NAME "VirtualUARTTerminal" ;# Name of this class
+ common COMPONENT_ICON {chardevice} ;# Icon for this panel (16x16)
+
+ # Configuration menu
+ common CONFMENU {
+ {command {Show log window} {} 5 "show_log" {bar5}
+ "Display the log of events which are currently happening in the simulated UART driver"}
+ {separator}
+ {command {Show help} {} 5 "show_help 1" {help}
+ "Show brief help"}
+ {separator}
+ {command {Save configuration} {} 0 "save_as" {filesave}
+ "Save configuration into a file"}
+ {command {Load configuration} {} 0 "load_from" {fileopen}
+ "Load configuration from a file"}
+ {separator}
+ {checkbutton "Window always on top" {} {::VirtualUARTTerminal::menu_keep_win_on_top}
+ 1 0 0 {keep_win_on_top_changed}
+ ""}
+ }
+
+ common rect_size 12
+ common empty_fill {#888888}
+ common empty_outline {#AAAAAA}
+
+ common MAX_LOG_LENGTH 100 ;# Int: Maximum number of row in the log window
+
+ ## PRIVATE
+ private variable status_bar_label ;# Widget: Status bar
+
+ private variable connection_port ;# Array of Int: Index is key number, value is port number or {-}
+ private variable connection_pin ;# Array of Int: Index is key number, value is bit number or {-}
+
+ private variable baud_conf {9600} ;# Int: Selected baud rate for communication
+ private variable parity_conf {n} ;# Char: Selected type of parity
+ private variable data_conf {8} ;# Int: Number of data bits
+ private variable stop_conf {1} ;# Int: Number of stop bits
+
+ private variable baud_cb ;#
+ private variable parity_cb ;#
+ private variable data_cb ;#
+ private variable stop_cb ;#
+
+ private variable send_selected_button
+ private variable clear_selected_snd_button
+ private variable clear_selected_rec_button
+
+ private variable enaged ;# Array of Bool: enaged(port_num,bit_num) --> Is connected to this device ?
+ private variable usr_note
+ private variable cb
+ private variable sbuf_r_canvas
+ private variable sbuf_t_canvas
+ private variable keep_win_on_top 0 ;# Bool: Toplevel window
+
+ private variable controls_frame
+
+ private variable log_win_text {}
+ private variable warning_indicator {}
+ private variable log_time_mark 0
+ private variable log_window_geometry {}
+ private variable log_enabled 1 ;# Bool: Logging of events enabled (slower simulation)
+ private variable log_on_off_chbut ;# Widget: Checkbox for enabling and disabling the logging of events
+
+ private variable time_mark 0 ;# Int: Time mark pointing to this point of time according to the MCU simulator engine
+ private variable bit_time 104166.666
+ private variable bit_rect
+ private variable arrow
+ private variable reg_val
+
+ private variable graph_position
+ private variable graph_prev_state
+ private variable graph_elements
+
+ private variable send_hexeditor
+ private variable receive_hexeditor
+ private variable reception_address 0
+
+ private variable rxd_signal 1 ;# Bool:
+ private variable rxd_signal_prev 1
+ private variable reception_in_progress 0
+ private variable reception_bit_no
+ private variable reception_sample_time
+ private variable reception_data 0
+
+ private variable output_buffer {}
+ private variable transmission_in_prog 0
+ private variable byte_to_send -1
+ private variable transmission_bit_no -1
+ private variable transmission_sample_time
+ private variable last_txd 1
+
+
+ ## Object constructor
+ # @parm Object _project - Project object
+ constructor {_project} {
+ # Set object variables identifing this component (see the base class)
+ set component_name $COMPONENT_NAME
+ set class_name $CLASS_NAME
+ set component_icon $COMPONENT_ICON
+
+ # Set other object variables
+ set project $_project
+ array set connection_port {0 - 1 - 2 - 3 - 4 - 5 -}
+ array set connection_pin {0 - 1 - 2 - 3 - 4 - 5 -}
+ array set arrow {
+ r {}
+ r8 {}
+ t {}
+ t8 {}
+ }
+ array set reg_val {
+ rxd {}
+ txd {}
+ }
+ array set graph_position {
+ t 0 r 0
+ }
+ array set graph_prev_state {
+ t 1 r 1
+ }
+ array set graph_elements {
+ t {} r {}
+ }
+
+ for {set port 0} {$port < 5} {incr port} {
+ for {set bit 0} {$bit < 8} {incr bit} {
+ set enaged($port,$bit) 0
+ }
+ }
+
+ # Inform PALE
+ $project pale_register_input_device $this
+ $project pale_set_modified
+
+ # Create panel GUI
+ create_gui
+ mcu_changed
+ on_off [$project pale_is_enabled]
+ create_log
+
+ # ComboBoxes to default state
+ for {set i 0} {$i < 2} {incr i} {
+ $cb(b$i) current 0
+ $cb(p$i) current 0
+ }
+ }
+
+ ## Object destructor
+ destructor {
+ # Inform PALE
+ $project pale_unregister_input_device $this
+
+ # Destroy GUI
+ destroy $win
+ }
+
+ ## Value of configuration menu variable "keep_win_on_top" has been changed
+ # @return void
+ public method keep_win_on_top_changed {} {
+ set keep_win_on_top $VirtualUARTTerminal::menu_keep_win_on_top
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ } else {
+ wm attributes $win -topmost 0 -alpha 1.0
+ }
+ }
+
+ ## Reconnect the specified line to another port pin
+ # @parm Int i - line number (0..1)
+ # @return void
+ public method reconnect {i} {
+ # Adjust connections
+ set connection_port($i) [$cb(p$i) get]
+ set connection_pin($i) [$cb(b$i) get]
+ if {$connection_pin($i) != {-}} {
+ set connection_pin($i) [expr {7 - $connection_pin($i)}]
+ }
+
+ # Reevaluate array of MCU port pins engaged by this device
+ evaluete_enaged_pins
+
+ # Change state of the device
+ if {$drawing_on} {
+ $project pale_reevaluate_IO
+ }
+
+ # Set flag modified
+ set_modified
+ }
+
+ ## Reevaluate array of MCU port pins engaged by this device
+ # @return void
+ private method evaluete_enaged_pins {} {
+ # Mark all as disengaged and infrom PALE
+ for {set port 0} {$port < 5} {incr port} {
+ for {set bit 0} {$bit < 8} {incr bit} {
+ if {$enaged($port,$bit)} {
+ $project pale_disengage_pin_by_input_device $port $bit $this
+ set enaged($port,$bit) 0
+ }
+ }
+ }
+
+ # Find the engaged ones and infrom PALE
+ for {set i 0} {$i < 1} {incr i} {
+ set port $connection_port($i)
+ set bit $connection_pin($i)
+
+ if {$port == {-} || $bit == {-}} {
+ continue
+ }
+
+ set enaged($port,$bit) 1
+ $project pale_engage_pin_by_input_device $port $bit $this
+ }
+ }
+
+ ## Invoke interrupt monitor window
+ # @return void
+ private method create_gui {} {
+ set dialog_opened 1
+
+ # Create window
+ set win [toplevel .virtual_uart_term$count -class [mc "UART Monitor"] -bg ${::COMMON_BG_COLOR}]
+ incr count
+
+ # Create status bar
+ set status_bar_label [label $win.status_bar_label -justify left -pady 0 -anchor w]
+ pack $status_bar_label -side bottom -fill x
+
+ set main_frame [frame $win.main_frame]
+ create_top_frame $main_frame ;# Create top frame
+ create_bottom_frame $main_frame ;# Create bottom frame
+ pack $main_frame -fill both -expand 1
+
+ # Configure window
+ wm title $win "[mc $component_name] - [$project cget -projectName] - MCU 8051 IDE"
+ wm iconphoto $win ::ICONS::16::_chardevice
+ wm resizable $win 0 0
+ wm protocol $win WM_DELETE_WINDOW [list $this close_window]
+ bindtags $win [list $win Toplevel all .]
+ }
+
+ ## Create the log dialog window, but do not show it until method show_log is called
+ # @return void
+ public method create_log {} {
+ # Create the dialog window (hidden for now)
+ set dialog $win.log_window
+ toplevel $dialog
+ wm withdraw $dialog
+
+ ## Create main frame (text and scrollbar)
+ set main_frame [frame $dialog.main_frame]
+ # Text widget
+ set text_widget [text $main_frame.text \
+ -width 0 -height 0 -font $hlp_normal_font \
+ -yscrollcommand [list $main_frame.scrollbar set] \
+ -wrap word -padx 5 -pady 5 -state disabled \
+ ]
+ set log_win_text $text_widget
+ bindtags $text_widget [list $text_widget Text $win all .]
+ pack $text_widget -side left -fill both -expand 1
+ # Create text tag in the text widget
+ $text_widget tag configure tag_info -foreground {#FFFFFF} -background {#0000EE}
+ $text_widget tag configure tag_warning -foreground {#FFFFFF} -background {#EE8800}
+ $text_widget tag configure tag_error -foreground {#FFFFFF} -background {#DD0000}
+ $text_widget tag configure tag_line \
+ -background {#DDDDDD} \
+ -font [font create \
+ -family ${::DEFAULT_FIXED_FONT} \
+ -size -1 \
+ ]
+
+ # Scrollbar
+ pack [ttk::scrollbar $main_frame.scrollbar \
+ -orient vertical \
+ -command [list $text_widget yview] \
+ ] -side right -fill y
+ # Finalize ...
+ pack $main_frame -fill both -expand 1 -padx 2
+
+ # Create bottom frame
+ set bottom_frame [frame $dialog.bottom_frame]
+ # Button "Close"
+ pack [ttk::button $bottom_frame.close_button \
+ -text [mc "Close"] \
+ -compound left \
+ -image ::ICONS::16::button_cancel \
+ -command [list $this close_log_win] \
+ ] -side right
+ pack [ttk::button $bottom_frame.clear_button \
+ -text [mc "Clear log"] \
+ -compound left \
+ -image ::ICONS::16::editdelete \
+ -command "
+ $text_widget configure -state normal
+ $text_widget delete 0.0 end
+ $text_widget configure -state disabled
+ " \
+ ] -side left
+ # CheckBox: "Enable log"
+ set log_on_off_chbut [checkbutton $bottom_frame.on_off_chbut \
+ -command [list $this log_on_off] \
+ -text [mc "Enable log"] \
+ ]
+ if {$log_enabled} {
+ $log_on_off_chbut select
+ } else {
+ $log_on_off_chbut deselect
+ }
+ setStatusTip -widget $log_on_off_chbut -text [mc "Disabled logging may notably improve simulation speed"]
+ DynamicHelp::add $log_on_off_chbut -text [mc "Disabled logging may notably improve simulation speed"]
+ pack $log_on_off_chbut -side left -padx 5
+ pack $bottom_frame -pady 2 -padx 5 -fill x
+
+ # Set window parameters
+ wm minsize $dialog [expr {int(300 * $::font_size_factor)}] [expr {int(150 * $::font_size_factor)}]
+ wm iconphoto $dialog ::ICONS::16::bar5
+ wm title $dialog [mc "UART simulator log - MCU 8051 IDE"]
+ wm protocol $dialog WM_DELETE_WINDOW [list $this close_log_win]
+ bindtags $dialog [list $dialog Toplevel $win all .]
+ }
+
+ ## Show the log window
+ # The log window must have been once created by method create_log prior to
+ #+ the call to this method
+ # @return void
+ public method show_log {} {
+ if {$warning_indicator != {}} {
+ destroy $warning_indicator
+ set warning_indicator {}
+ }
+
+ set dialog $win.log_window
+ if {[wm state $dialog] == {normal}} {
+ raise $dialog
+ return
+ }
+ if {![winfo exists $dialog]} {
+ return
+ }
+ wm deiconify $dialog
+ if {$log_window_geometry != {}} {
+ wm geometry $dialog $log_window_geometry
+ }
+ }
+
+ ## Enable or disable logging of events
+ # @return void
+ public method log_on_off {} {
+ set log_enabled [expr {!$log_enabled}]
+
+ # Set flag modified
+ set_modified
+ }
+
+ ## Close the DS1620 log window
+ # @return void
+ public method close_log_win {} {
+ set dialog $win.log_window
+ if {![winfo exists $dialog]} {
+ return
+ }
+
+ set log_window_geometry [wm geometry $dialog]
+ wm withdraw $dialog
+ }
+
+ ## Set status bar tip for specified widget
+ # @parm Widget widget - Target widget
+ # @parm String text - Text of the stutus tip
+ # @return void
+ private method termial_set_status_tip {widget text} {
+ bind $widget <Enter> "$status_bar_label configure -text {$text}"
+ bind $widget <Leave> "$status_bar_label configure -text {}"
+ }
+
+ private method create_top_top_frame {target_frame} {
+ set target_frame [frame $target_frame.target_frame -pady 5 -padx 5]
+ set controls_frame $target_frame
+
+ # - Baud rate
+ grid [label $target_frame.baud_lbl \
+ -text [mc "Baud rate"] \
+ ] -row 1 -column 5 -sticky w
+ set baud_cb [ttk::combobox $target_frame.baud_cb \
+ -state readonly \
+ -width 6 \
+ -exportselection 0 \
+ -values $available_baud_rates \
+ ]
+ bind $baud_cb <<ComboboxSelected>> \
+ "$this change_port_config b \[$target_frame.baud_cb get\]"
+ termial_set_status_tip $baud_cb [mc "Connection speed in bps"]
+ grid $baud_cb -row 1 -column 6 -sticky w
+ $target_frame.baud_cb current [lsearch [$target_frame.baud_cb cget -values] $baud_conf]
+ # - Parity
+ grid [label $target_frame.parity_lbl \
+ -text [mc "Parity"] \
+ ] -row 2 -column 5 -sticky w
+ set parity_cb [ttk::combobox $target_frame.parity_cb \
+ -values {none odd even} \
+ -state readonly \
+ -width 6 \
+ -exportselection 0 \
+ ]
+ bind $parity_cb <<ComboboxSelected>> \
+ "$this change_port_config p \[$target_frame.parity_cb get\]"
+ termial_set_status_tip $parity_cb [mc "Parity"]
+ grid $parity_cb -row 2 -column 6 -sticky w
+ $target_frame.parity_cb current [lsearch {n o e m s} $parity_conf]
+ # - Data bits
+ grid [label $target_frame.data_lbl \
+ -text [mc "Data bits"] \
+ ] -row 1 -column 8 -sticky w
+ set data_cb [ttk::combobox $target_frame.data_cb \
+ -state readonly \
+ -width 1 \
+ -values {5 6 7 8} \
+ -exportselection 0 \
+ ]
+ bind $data_cb <<ComboboxSelected>> \
+ "$this change_port_config d \[$target_frame.data_cb get\]"
+ termial_set_status_tip $data_cb [mc "Number of data bits"]
+ grid $data_cb -row 1 -column 9 -sticky w
+ $target_frame.data_cb current [lsearch [$target_frame.data_cb cget -values] $data_conf]
+ # - Stop bits
+ grid [label $target_frame.stop_lbl \
+ -text [mc "Stop bits"] \
+ ] -row 2 -column 8 -sticky w
+ set stop_cb [ttk::combobox $target_frame.stop_cb \
+ -state readonly \
+ -width 1 \
+ -values {1 2} \
+ -exportselection 0 \
+ ]
+ bind $stop_cb <<ComboboxSelected>> \
+ "$this change_port_config s \[$target_frame.stop_cb get\]"
+ termial_set_status_tip $stop_cb [mc "Number of stop bits"]
+ grid $stop_cb -row 2 -column 9 -sticky w
+ $target_frame.stop_cb current [lsearch [$target_frame.stop_cb cget -values] $stop_conf]
+
+ # Create "ON/OFF" button
+ set start_stop_button [ttk::button $target_frame.start_stop_button \
+ -command [list $this on_off_button_press] \
+ -style Flat.TButton \
+ -width 3 \
+ ]
+ DynamicHelp::add $target_frame.start_stop_button \
+ -text [mc "Turn HW simulation on/off"]
+ setStatusTip -widget $start_stop_button -text [mc "Turn HW simulation on/off"]
+ bind $start_stop_button <Button-3> "$this on_off_button_press; break"
+ bindtags $start_stop_button [list $start_stop_button TButton all .]
+ grid $start_stop_button -row 1 -column 1 -sticky w
+
+ # Create configuration menu button
+ set conf_button [ttk::button $target_frame.conf_but \
+ -image ::ICONS::16::configure \
+ -style Flat.TButton \
+ -command [list $this config_menu] \
+ ]
+ setStatusTip -widget $conf_button -text [mc "Configure"]
+ bindtags $conf_button [list $conf_button TButton all .]
+ grid $conf_button -row 1 -column 2 -sticky w
+
+ grid [label $target_frame.note_lbl \
+ -text [mc "Note:"] \
+ ] -row 2 -column 1 -sticky w
+ set usr_note [ttk::entry $target_frame.usr_note \
+ -validate key \
+ -validatecommand [list $this set_modified] \
+ -width 30 \
+ ]
+ bindtags $usr_note [list $usr_note TEntry all .]
+ grid $usr_note -row 2 -column 2 -sticky w
+
+ grid columnconfigure $target_frame 4 -weight 1
+ grid columnconfigure $target_frame 7 -minsize 10
+
+ return $target_frame
+ }
+
+ ##
+ # @parm Widget target_frame - Parent frame
+ # @return Widget - Created frame
+ private method create_sbuf_t_frame {target_frame} {
+ set sbuf_t_frame [frame $target_frame.sbuf_t_frame]
+ set sbuf_t_canvas [canvas $sbuf_t_frame.sbuf_t_canvas \
+ -bg $::COMMON_BG_COLOR \
+ -width 250 \
+ -height 60 \
+ -highlightthickness 0 \
+ ]
+ set canvas $sbuf_t_canvas
+
+ set cb(p0) [ttk::combobox $canvas.cb_p0 \
+ -width 1 \
+ -font $cb_font \
+ -state readonly \
+ ]
+ bind $cb(p0) <<ComboboxSelected>> [list $this reconnect 0]
+ bindtags $cb(p0) [list $cb(p0) TCombobox all .]
+
+ set cb(b0) [ttk::combobox $canvas.cb_b0 \
+ -width 1 \
+ -font $cb_font \
+ -values {- 0 1 2 3 4 5 6 7} \
+ -state readonly \
+ ]
+ bind $cb(b0) <<ComboboxSelected>> [list $this reconnect 0]
+ bindtags $cb(b0) [list $cb(b0) TCombobox all .]
+
+ $canvas create text 45 0 \
+ -text {TxD} \
+ -font ${::Simulator_GUI::bitfont} \
+ -anchor ne
+ $canvas create window 30 40 \
+ -window $cb(p0) \
+ -anchor ne
+ $canvas create window 30 40 \
+ -window $cb(b0) \
+ -anchor nw
+ $canvas create text 45 20 \
+ -text {SBUF-T} \
+ -font ${::Simulator_GUI::bitfont} \
+ -anchor ne
+ $canvas create text 210 0 \
+ -text {Parity} \
+ -font ${::Simulator_GUI::bitfont} \
+ -anchor nw
+ set reg_val(txd) [$canvas create text 210 20 \
+ -text { -- } \
+ -font ${::Simulator_GUI::bitfont} \
+ -anchor nw \
+ ]
+
+ set labels [list S 0 1 2 3 4 5 6 7 P S]
+
+ set x 50
+ set y 20
+ for {set i 0} {$i < 11} {incr i} {
+ if {$i == 1 || $i == 9 || $i == 10} {
+ incr x 3
+ } else {
+ incr x 1
+ }
+
+ set bit_rect(t,$i) [$canvas create rectangle $x $y \
+ [expr {$x + $rect_size}] [expr {$y + $rect_size}] \
+ -fill $empty_fill -outline $empty_outline \
+ ]
+ $canvas create text \
+ [expr {$x + ($rect_size / 2)}] \
+ [expr {$y + ($rect_size / 2)}] \
+ -text [lindex $labels $i] \
+ -font $tiny_font
+
+ incr x $rect_size
+ }
+
+ # Create dash line pointing to parity bit
+ set pos [expr {55 + $rect_size + 9 * ($rect_size + 1) - ($rect_size + 1) / 2}]
+ $canvas create line 210 6 $pos 6 $pos 20 -arrow none -dash {,}
+
+ # Draw graph grid
+ for {set x 65} {$x < 250} {incr x 5} {
+ $canvas create line $x 43 $x 58 -fill {#AAAAAA} -tags grid -dash .
+ }
+
+ pack $sbuf_t_canvas -padx 5 -pady 5 -fill x
+ return $sbuf_t_frame
+ }
+
+ ##
+ # @parm Widget target_frame - Parent frame
+ # @return Widget - Created frame
+ private method create_sbuf_r_frame {target_frame} {
+ set sbuf_r_frame [frame $target_frame.sbuf_r_frame]
+ set sbuf_r_canvas [canvas $sbuf_r_frame.sbuf_r_canvas \
+ -bg $::COMMON_BG_COLOR \
+ -width 250 \
+ -height 60 \
+ -highlightthickness 0 \
+ ]
+ set canvas $sbuf_r_canvas
+
+ set cb(p1) [ttk::combobox $canvas.cb_p1 \
+ -width 1 \
+ -font $cb_font \
+ -state readonly \
+ ]
+ bind $cb(p1) <<ComboboxSelected>> [list $this reconnect 1]
+ bindtags $cb(p1) [list $cb(p1) TCombobox all .]
+
+ set cb(b1) [ttk::combobox $canvas.cb_b1 \
+ -width 1 \
+ -font $cb_font \
+ -values {- 0 1 2 3 4 5 6 7} \
+ -state readonly \
+ ]
+ bind $cb(b1) <<ComboboxSelected>> [list $this reconnect 1]
+ bindtags $cb(b1) [list $cb(b1) TCombobox all .]
+
+ $canvas create text 45 0 \
+ -text {RxD} \
+ -font ${::Simulator_GUI::bitfont} \
+ -anchor ne
+ $canvas create window 30 40 \
+ -window $cb(p1) \
+ -anchor ne
+ $canvas create window 30 40 \
+ -window $cb(b1) \
+ -anchor nw
+ $canvas create text 45 20 \
+ -text {SBUF-R} \
+ -font ${::Simulator_GUI::bitfont} \
+ -anchor ne
+ $canvas create text 210 0 \
+ -text {Parity} \
+ -font ${::Simulator_GUI::bitfont} \
+ -anchor nw
+ set reg_val(rxd) [$canvas create text 210 20 \
+ -text { -- } \
+ -font ${::Simulator_GUI::bitfont} \
+ -anchor nw \
+ ]
+
+ set labels [list S 0 1 2 3 4 5 6 7 P S]
+
+ set x 50
+ set y 20
+ for {set i 0} {$i < 11} {incr i} {
+ if {$i == 1 || $i == 9 || $i == 10} {
+ incr x 3
+ } else {
+ incr x 1
+ }
+
+ set bit_rect(r,$i) [$canvas create rectangle $x $y \
+ [expr {$x + $rect_size}] [expr {$y + $rect_size}] \
+ -fill $empty_fill -outline $empty_outline \
+ ]
+ $canvas create text \
+ [expr {$x + ($rect_size / 2)}] \
+ [expr {$y + ($rect_size / 2)}] \
+ -font $tiny_font \
+ -text [lindex $labels $i]
+
+ incr x $rect_size
+ }
+
+ set_bit_arrow r 0
+
+ set pos [expr {55 + $rect_size + 9 * ($rect_size + 1) - ($rect_size + 1) / 2}]
+ $canvas create line 210 6 $pos 6 $pos 20 -arrow none -dash {,}
+
+ # Draw graph grid
+ for {set x 65} {$x < 250} {incr x 5} {
+ $canvas create line $x 43 $x 58 -fill {#AAAAAA} -tags grid -dash .
+ }
+
+ pack $sbuf_r_canvas -padx 5 -pady 5 -fill x
+ return $sbuf_r_frame
+ }
+
+ ## Create top frame in the dialog window (connector_canvas (left) and configuration (right))
+ # @parm Widget target_frame - Parent frame
+ # @return void
+ private method create_top_frame {target_frame} {
+ grid [create_top_top_frame $target_frame] -row 1 -column 1 -sticky nwes -columnspan 4 -padx 1
+ grid [create_sbuf_t_frame $target_frame] -row 2 -column 1 -sticky nwes -columnspan 2 -padx 1
+ grid [create_sbuf_r_frame $target_frame] -row 2 -column 3 -sticky nwes -columnspan 2 -padx 1
+ }
+
+ ## Create bottom frame (hexadecimal editors)
+ # @parm Widget target_frame - Parent frame
+ # @return void
+ private method create_bottom_frame {target_frame} {
+ # Create headers ("Data to send", "Received data")
+ grid [label $target_frame.lbl_a \
+ -text [mc "Data to send"] \
+ -compound right \
+ -image ::ICONS::16::forward \
+ -padx 15 -font $bold_font \
+ ] -row 4 -column 1 -columnspan 2
+ grid [label $target_frame.lbl_b \
+ -text [mc "Received data"] \
+ -compound left \
+ -image ::ICONS::16::forward \
+ -padx 15 -font $bold_font \
+ ] -row 4 -column 3 -columnspan 2
+
+ # Create hexadecimal editors
+ set send_hexeditor [HexEditor #auto \
+ $target_frame.send_hexeditor 8 32 2 \
+ hex 1 1 5 256 \
+ ]
+ [$send_hexeditor getLeftView] configure -exportselection 0
+ $send_hexeditor bindSelectionAction [list $this hexeditor_selection s]
+ grid $target_frame.send_hexeditor -row 5 -column 1 -columnspan 2
+
+ set receive_hexeditor [HexEditor #auto \
+ $target_frame.receive_hexeditor 8 32 2 \
+ hex 1 1 5 256 \
+ ]
+ [$send_hexeditor getLeftView] configure -exportselection 0
+ $receive_hexeditor bindSelectionAction [list $this hexeditor_selection r]
+ $receive_hexeditor set_bg_hg $reception_address 1 0
+ grid $target_frame.receive_hexeditor -row 5 -column 3 -columnspan 2
+
+ # Create buttons "Send selected" and "Clear selected" in send part
+ set send_selected_button [ttk::button \
+ $target_frame.send_selected_button \
+ -text [mc "Send selected"] \
+ -image ::ICONS::16::forward \
+ -command [list $this send_selected] \
+ -compound left \
+ -state disabled \
+ ]
+ set clear_selected_snd_button [ttk::button \
+ $target_frame.clear_selected_snd_button \
+ -text [mc "Clear selected"] \
+ -image ::ICONS::16::eraser \
+ -command [list $this clear_selected_snd]\
+ -compound left \
+ -state disabled \
+ ]
+ termial_set_status_tip $send_selected_button [mc "Send selected data"]
+ termial_set_status_tip $clear_selected_snd_button [mc "Remove selected data"]
+ grid $send_selected_button -row 6 -column 1 -sticky we
+ grid $clear_selected_snd_button -row 6 -column 2 -sticky we
+
+ # Create buttons "Receive here" and "Clear selected" in reception part
+ set receive_here_button [ttk::button \
+ $target_frame.receive_here_button \
+ -text [mc "Receive here"] \
+ -image ::ICONS::16::down0 \
+ -command [list $this receive_here] \
+ -compound left \
+ ]
+ set clear_selected_rec_button [ttk::button \
+ $target_frame.clear_selected_rec_button \
+ -text [mc "Clear selected"] \
+ -image ::ICONS::16::eraser \
+ -command [list $this clear_selected_rec]\
+ -compound left \
+ -state disabled \
+ ]
+ termial_set_status_tip $receive_here_button [mc "Receive data on current cursor position"]
+ termial_set_status_tip $clear_selected_rec_button [mc "Remove selected data"]
+ grid $receive_here_button -row 6 -column 3 -sticky we
+ grid $clear_selected_rec_button -row 6 -column 4 -sticky we
+ }
+
+ ## Determinate which port pin is connected to the specified LED
+ # @parm Int i - LED number
+ # @return List - {port_number bit_number}
+ private method which_port_pin {i} {
+ return [list $connection_port($i) $connection_pin($i)]
+ }
+
+ ## Handle "ON/OFF" button press
+ # Turn whole PALE system on or off
+ # @return void
+ public method on_off_button_press {} {
+ $project pale_all_on_off
+ }
+
+ public method clear_selected_rec {} {
+ set rangeofselection [$receive_hexeditor getRangeOfSelection]
+ if {$rangeofselection == {}} {
+ return
+ }
+
+ set start_cell [lindex $rangeofselection 0]
+ set end_cell [lindex $rangeofselection 1]
+
+ for {set i $start_cell} {$i <= $end_cell} {incr i} {
+ $receive_hexeditor setValue $i {}
+ }
+ }
+
+ public method clear_selected_snd {} {
+ # Get range of text indexes determinating the selection
+ set rangeofselection [$send_hexeditor getRangeOfSelection]
+ if {$rangeofselection == {}} {
+ return
+ }
+
+ # Determinate index of the start and end cell
+ set start_cell [lindex $rangeofselection 0]
+ set end_cell [lindex $rangeofselection 1]
+
+ # Clear all selected cell one by one
+ for {set i $start_cell} {$i <= $end_cell} {incr i} {
+ $send_hexeditor setValue $i {}
+ }
+ }
+
+ public method send_selected {} {
+ # Get range of text indexes determinating the selection
+ set rangeofselection [$send_hexeditor getRangeOfSelection]
+ if {$rangeofselection == {}} {
+ return
+ }
+
+ if {$transmission_in_prog} {
+ return
+ }
+
+ set transmission_in_prog 1
+ set byte_to_send -1
+ set output_buffer [list]
+ set start_cell [lindex $rangeofselection 0]
+ set end_cell [lindex $rangeofselection 1]
+ foreach value [$send_hexeditor get_values $start_cell $end_cell] {
+ if {$value == {}} {
+ continue
+ }
+ lappend output_buffer [expr "0x$value"]
+ }
+
+ write_to_log I [mc "TxD: Starting transmission of block"]
+
+ $send_selected_button configure \
+ -text [mc "Stop transmission"] \
+ -image ::ICONS::16::fileclose \
+ -command [$this stop_transmission]
+ }
+
+ public method hexeditor_selection {source anything_selected} {
+ if {$anything_selected} {
+ set state {normal}
+ } else {
+ set state {disabled}
+ }
+
+ if {$source == {s}} {
+ if {!$transmission_in_prog} {
+ $send_selected_button configure -state $state
+ }
+ $clear_selected_snd_button configure -state $state
+ } else {
+ $clear_selected_rec_button configure -state $state
+ }
+ }
+
+ public method change_port_config {what new_value} {
+ switch -- $what {
+ b {
+ set baud_conf $new_value
+ set bit_time [expr {1000000000.0 / $baud_conf}]
+ }
+ p {
+ switch -- $new_value {
+ {none} {
+ set new_value {n}
+ }
+ {odd} {
+ set new_value {o}
+ }
+ {even} {
+ set new_value {e}
+ }
+ }
+
+ set parity_conf $new_value
+ }
+ d {
+ set data_conf $new_value
+ }
+ s {
+ set stop_conf $new_value
+ }
+ }
+ }
+
+ ## Change reception adddress to address of the current cell
+ # @return void
+ public method receive_here {} {
+ set cell [$receive_hexeditor getCurrentCell]
+ set reception_address $cell
+
+ $receive_hexeditor clearBgHighlighting 0
+ $receive_hexeditor set_bg_hg $cell 1 0
+ }
+
+ private method set_bit_color {interface bit state} {
+ if {$interface == {r}} {
+ set canvas $sbuf_r_canvas
+ } else {
+ set canvas $sbuf_t_canvas
+ }
+
+ if {$state == 1} {
+ set fill ${::BitMap::one_fill}
+ set outline ${::BitMap::one_outline}
+ } elseif {$state == 0} {
+ set fill ${::BitMap::zero_fill}
+ set outline ${::BitMap::zero_outline}
+ } elseif {$state == -1} {
+ set fill {#888888}
+ set outline {#AAAAAA}
+ }
+
+ $canvas itemconfigure $bit_rect($interface,$bit) \
+ -fill $fill \
+ -outline $outline
+ }
+
+ private method set_bit_arrow {interface position} {
+ if {$interface == {r}} {
+ set canvas $sbuf_r_canvas
+ } else {
+ set canvas $sbuf_t_canvas
+ }
+
+ if {$arrow($interface) != {}} {
+ $canvas delete $arrow($interface)
+ }
+ if {$position != -1} {
+ if {!$position} {
+ set corr 0
+ } elseif {$position >= 1 && $position <= 8} {
+ set corr 2
+ } elseif {$position == 9} {
+ set corr 4
+ } else {
+ set corr 6
+ }
+
+ set pos [expr {51 + $rect_size + $position * ($rect_size + 1) - ($rect_size + 1) / 2 + $corr}]
+ set arrow($interface) [$canvas create line 50 6 $pos 6 $pos 20 -arrow last]
+ }
+ }
+
+ private method highlight_arrow {interface highlight} {
+ if {$interface == {r}} {
+ set canvas $sbuf_r_canvas
+ } else {
+ set canvas $sbuf_t_canvas
+ }
+
+ $canvas itemconfigure $arrow($interface) -width [expr {($highlight ? 1 : 0) + 1}]
+ }
+
+ private method graph_clear {interface} {
+ if {$interface == {r}} {
+ set canvas $sbuf_r_canvas
+ } else {
+ set canvas $sbuf_t_canvas
+ }
+
+ $canvas delete graph
+
+ set graph_position($interface) 0
+ set graph_prev_state($interface) 1
+ set graph_elements($interface) [list]
+ }
+
+ private method graph_draw {interface state} {
+ if {$interface == {r}} {
+ set canvas $sbuf_r_canvas
+ } else {
+ set canvas $sbuf_t_canvas
+ }
+
+ if {$graph_position($interface) == 185} {
+ $canvas move graph -1 0
+ foreach item [lindex $graph_elements($interface) 0] {
+ $canvas delete $item
+ }
+ set graph_elements($interface) [lreplace $graph_elements($interface) 0 0]
+ incr graph_position($interface) -1
+ }
+
+ set x_0 [expr {65 + $graph_position($interface)}]
+ set x_1 [expr {$x_0 + 1}]
+
+ switch -- $graph_prev_state($interface) {
+ 0 {
+ switch -- $state {
+ 0 { ;# 0 --> 0
+ lappend graph_elements($interface) [list \
+ [$canvas create line $x_0 58 $x_1 58 -tags graph -fill {#00FF00}] \
+ ]
+ }
+ 1 { ;# 0 --> 1
+ lappend graph_elements($interface) [list \
+ [$canvas create line $x_0 43 $x_0 50 -tags graph -fill {#FF0000}] \
+ [$canvas create line $x_0 50 $x_0 58 -tags graph -fill {#00FF00}] \
+ ]
+ }
+ default {
+ lappend graph_elements($interface) [list \
+ [$canvas create line $x_0 43 $x_0 58 -tags graph -fill {#0000FF}] \
+ ]
+ }
+ }
+ }
+ 1 {
+ switch -- $state {
+ 0 { ;# 1 --> 0
+ lappend graph_elements($interface) [list \
+ [$canvas create line $x_0 43 $x_0 50 -tags graph -fill {#FF0000}] \
+ [$canvas create line $x_0 50 $x_0 58 -tags graph -fill {#00FF00}] \
+ ]
+ }
+ 1 { ;# 1 --> 1
+ lappend graph_elements($interface) [list \
+ [$canvas create line $x_0 43 $x_1 43 -tags graph -fill {#FF0000}] \
+ ]
+ }
+ default {
+ lappend graph_elements($interface) [list \
+ [$canvas create line $x_0 43 $x_0 58 -tags graph -fill {#0000FF}] \
+ ]
+ }
+ }
+ }
+ default {
+ lappend graph_elements($interface) [list \
+ [$canvas create line $x_0 43 $x_0 58 -tags graph -fill {#0055FF}] \
+ ]
+ }
+ }
+
+ incr graph_position($interface)
+ set graph_prev_state($interface) $state
+ }
+
+ ## Write a message to the log
+ # @parm Char type - Message type "I" == Information; "W" == Warning; "E" == Error
+ # @parm String string - Text of the message
+ # @return void
+ private method write_to_log {type string} {
+ # Do not do anything if the log is not available at all
+ if {!$log_enabled || $log_win_text == {}} {
+ return
+ }
+
+ # Enable the text widget
+ $log_win_text configure -state normal
+
+ # Manage the log length, the number of row in the log must not exceed the specified maximum
+ if {int([$log_win_text index end]) > ($MAX_LOG_LENGTH + 1)} {
+ set diff [expr {int([$log_win_text index end]) - $MAX_LOG_LENGTH}]
+ $log_win_text delete 1.0 $diff.0
+ }
+ $log_win_text mark set insert {end -1l lineend}
+
+ # Insert separators (horizontal lines) between events with the same time mark
+ if {$time_mark && $log_time_mark != $time_mark} {
+ set log_time_mark $time_mark
+ $log_win_text insert insert "\n"
+ $log_win_text tag add tag_line insert-1l insert
+ }
+
+ # Insert the information about the message type
+ switch -- $type {
+ {I} { ;# Information
+ $log_win_text insert insert [mc "\[INFO\] "]
+ $log_win_text tag add tag_info {insert linestart} insert-1c
+ }
+ {W} { ;# Warning
+ $log_win_text insert insert [mc "\[WARNING\] "]
+ $log_win_text tag add tag_warning {insert linestart} insert-1c
+ }
+ {E} { ;# Error
+ $log_win_text insert insert [mc "\[ERROR\] "]
+ $log_win_text tag add tag_error {insert linestart} insert-1c
+ }
+ }
+
+ # Insert the message itself
+ $log_win_text insert insert $string
+ $log_win_text insert insert "\n"
+ $log_win_text see insert
+
+ # Disable the text widget
+ $log_win_text configure -state disabled
+
+ #
+ if {$type == {E} && $warning_indicator == {}} {
+ set warning_indicator [label $controls_frame.w_lbl \
+ -image ::ICONS::16::status_unknown \
+ -cursor hand2 \
+ ]
+ grid $warning_indicator -row 2 -column 4
+ bind $warning_indicator <Button-1> [list $this show_log]
+ }
+ }
+
+ # ------------------------------------------------------------------
+ # UART SIMULATOR CORE
+ # ------------------------------------------------------------------
+
+ private method transmission_control {{txd {}}} {
+ if {!$transmission_in_prog} {
+ return $txd
+ }
+
+ if {$byte_to_send == -1} {
+ if {[manage_output_buffer $txd]} {
+ return $txd
+ }
+ }
+
+ if {$time_mark >= $transmission_sample_time} {
+ if {$time_mark >= ($transmission_sample_time + $bit_time)} {
+ write_to_log E [mc "Simulated MCU has clock frequency set too low to even receive the transmitted data!"]
+ } else {
+ stop_transmission 1
+ update_last_txd $txd
+ }
+ }
+
+ return $last_txd
+ }
+
+ private method manage_output_buffer {txd} {
+ if {![llength $output_buffer]} {
+ set transmission_in_prog 0
+
+ $sbuf_t_canvas itemconfigure $reg_val(txd) -text { -- }
+ for {set i 0} {$i < 11} {incr i} {
+ set_bit_color t $i -1
+ }
+
+ highlight_arrow t 0
+ set_bit_arrow t -1
+
+ write_to_log I [mc "TxD: Transmission of block finished"]
+
+ return 1
+ }
+
+ set byte_to_send [lindex $output_buffer 0]
+ set output_buffer [lreplace $output_buffer 0 0]
+ set transmission_bit_no -1
+ set transmission_sample_time 0
+
+ $sbuf_t_canvas itemconfigure $reg_val(txd) -text [format {0x%02X} $byte_to_send]
+
+ set_bit_color t 0 0
+ for {set i 1} {$i <= $data_conf} {incr i} {
+ set_bit_color t $i [expr {$byte_to_send & (1 << ($i - 1))}]
+ }
+ for {set i $data_conf} {$i < 8} {incr i} {
+ set_bit_color t $i -1
+ }
+ if {$parity_conf != {n}} {
+ set_bit_color t 9 [compute_parity $byte_to_send]
+ } else {
+ set_bit_color t 9 -1
+ }
+ set_bit_color t 10 1
+ set_bit_arrow t 0
+ highlight_arrow t 1
+
+ write_to_log I [mc "TxD: Starting transmission of byte: 0x%02X" $byte_to_send]
+
+ return 0
+ }
+
+ private method update_last_txd {txd} {
+ if {$transmission_bit_no == -1} {
+ set transmission_sample_time [expr {$time_mark + $bit_time}]
+ } else {
+ set transmission_sample_time [expr {$transmission_sample_time + $bit_time}]
+ }
+
+ # Send START bit
+ if {$transmission_bit_no == -1} {
+ set txd 0
+ set transmission_bit_no 0
+
+ # Send DATA bit
+ } elseif {$transmission_bit_no < $data_conf} {
+ set txd [expr {($byte_to_send & (1 << $transmission_bit_no)) ? 1 : 0}]
+ incr transmission_bit_no
+
+ # Send PARITY or STOP bit
+ } elseif {$transmission_bit_no == $data_conf} {
+ if {$parity_conf != {n}} {
+ set txd [compute_parity $byte_to_send]
+ set transmission_bit_no 9
+ } else {
+ set txd 1
+ set transmission_bit_no 10
+ }
+
+ # Send STOP bit
+ } elseif {$transmission_bit_no == 9} {
+ set txd 1
+ set transmission_bit_no 10
+
+ # Send STOP bit / End of transmission
+ } elseif {$transmission_bit_no == 10} {
+ set txd 1
+ if {$stop_conf == 1} {
+ write_to_log I [mc "TxD: Transmission of byte: 0x%02X complete" $byte_to_send]
+ set byte_to_send -1
+ } else {
+ set transmission_bit_no 11
+ }
+
+ # End of transmission
+ } elseif {$transmission_bit_no == 11} {
+ write_to_log I [mc "TxD: Transmission of byte: 0x%02X complete" $byte_to_send]
+ set byte_to_send -1
+ }
+
+ if {$transmission_bit_no < 11} {
+ set_bit_arrow t $transmission_bit_no
+ }
+
+ set last_txd $txd
+ }
+
+ public method stop_transmission {{internal_error 0}} {
+ set output_buffer {}
+ set byte_to_send -1
+
+ $sbuf_t_canvas itemconfigure $reg_val(txd) -text { -- }
+ $send_selected_button configure \
+ -text [mc "Send selected"] \
+ -image ::ICONS::16::forward \
+ -command [list $this send_selected]
+
+ if {$internal_error} {
+ write_to_log I [mc "TxD: Transmission TERMINATED on user request"]
+ } else {
+ write_to_log W [mc "TxD: Transmission TERMINATED due to an error"]
+ }
+ }
+
+ private method reception_control {} {
+ if {$reception_in_progress} {
+ if {$time_mark >= $reception_sample_time} {
+ set reception_data [expr {$reception_data | (($rxd_signal ? 1 : 0) << $reception_bit_no)}]
+ set reception_sample_time [expr {$reception_sample_time + $bit_time}]
+ $sbuf_r_canvas itemconfigure $reg_val(rxd) -text [format {0x%02X} [expr {($reception_data & 0x1fe) >> 1}]]
+
+ if {$reception_bit_no < 11} {
+ set_bit_color r $reception_bit_no $rxd_signal
+ }
+
+ incr reception_bit_no
+
+ if {$reception_bit_no == ($data_conf + 1)} {
+ set reception_bit_no 9
+
+ if {$parity_conf == {n}} {
+ incr reception_bit_no
+
+ }
+ } elseif {$reception_bit_no == 10 && $stop_conf == 1} {
+ incr reception_bit_no
+ }
+
+ if {$reception_bit_no < 11} {
+ set_bit_arrow r $reception_bit_no
+ }
+ highlight_arrow r 1
+
+ if {$reception_bit_no == 12} {
+ set_bit_arrow r 0
+ highlight_arrow r 0
+ $sbuf_r_canvas itemconfigure $reg_val(rxd) -text { -- }
+ for {set i 0} {$i < 11} {incr i} {
+ set_bit_color r $i -1
+ }
+ reception_complete
+ }
+ } else {
+ highlight_arrow r 0
+ }
+ } else {
+ if {$rxd_signal_prev && !$rxd_signal} {
+ set reception_in_progress 1
+ set reception_bit_no 1
+ set reception_data 0
+ set reception_sample_time [expr {$time_mark + $bit_time * 1.5}]
+
+ set_bit_color r 0 0
+ set_bit_arrow r 1
+
+ write_to_log I [mc "RxD: Receiving byte, address = 0x%02X" $reception_address]
+ }
+ }
+ }
+
+ private method reception_complete {} {
+ set reception_in_progress 0
+
+ if {$reception_address >= 255} {
+ set reception_address 0
+ write_to_log W [mc "RxD: Reception buffer overflow"]
+ }
+
+ set data [expr {($reception_data & 0x1fe) >> 1}]
+ $receive_hexeditor setValue $reception_address $data
+ $receive_hexeditor set_bg_hg $reception_address 1 1
+
+ # Verify rceived byte
+ if {$parity_conf != {n}} {
+ if {[compute_parity $data] != (($data & 0x20) ? 1 : 0)} {
+ write_to_log E [mc "RxD: Parity flag doesn't match"]
+ }
+ }
+ if {!(($data & 0x80) ? 1 : 0) || (($stop_conf > 1) && !(($data & 0x40) ? 1 : 0))} {
+ write_to_log E [mc "RxD: Invalid STOP bit(s)"]
+ }
+
+ write_to_log I [mc "RxD: Byte received, address = 0x%02X, data = 0x%02X" $reception_address $data]
+
+ incr reception_address
+ $receive_hexeditor seeCell $reception_address
+ }
+
+ private method compute_parity {data} {
+ set count 0
+ set mask 1
+ for {set i 0} {$i < 8} {incr i} {
+ if {$data & $mask} {
+ incr count
+ }
+ set mask [expr {$mask << 1}]
+ }
+
+ set data [expr {($count % 2) ? 1 : 0}]
+ if {$parity_conf == {o}} {
+ set data [expr {!$data}]
+ }
+
+ return $data
+ }
+
+ # ------------------------------------------------------------------
+ # VIRTUAL HW COMMON INTERFACE
+ # ------------------------------------------------------------------
+
+ ## Simulated MCU has been changed
+ # @return void
+ public method mcu_changed {} {
+ # Refresh lists of possible values in port selection ComboBoxes
+ set available_ports [concat - [$project pale_get_available_ports]]
+
+ for {set i 0} {$i < 2} {incr i} {
+ $cb(p$i) configure -values $available_ports
+
+ if {[lsearch -ascii -exact $available_ports $connection_port($i)] == -1} {
+ $cb(p$i) current 0
+ set connection_port($i) {-}
+ }
+ }
+ }
+
+ ## Accept new state of ports
+ # @parm List state - Port states ( 5 x {8 x bit} -- {bit0 bit1 bit2 ... bit7} )
+ # @return void
+ #
+ # Possible bit values:
+ # '|' - High frequency
+ # 'X' - Access to external memory
+ # '?' - No volatge
+ # '-' - Indeterminable value (some noise)
+ # '=' - High forced to low
+ # '0' - Logical 0
+ # '1' - Logical 1
+ public method new_state {_state} {
+ upvar $_state state
+
+ if {$time_mark == [$project get_run_statistics 0]} {
+ return
+ }
+ set time_mark [$project get_run_statistics 0]
+ set cycles [$project pale_get_number_of_instruction_cycles]
+
+ # --------------------------------------------------------------
+ # TxD part
+ # --------------------------------------------------------------
+ set pp [which_port_pin 0]
+
+ if {[lindex $pp 0] != {-} && [lindex $pp 1] != {-}} {
+ lset state $pp [transmission_control [lindex $state $pp]]
+ } else {
+ transmission_control
+ }
+ for {set i 0} {$i < $cycles} {incr i} {
+ graph_draw t $last_txd
+ }
+
+ # --------------------------------------------------------------
+ # RxD part
+ # --------------------------------------------------------------
+ set pp [which_port_pin 1]
+
+ if {[lindex $pp 0] != {-} && [lindex $pp 1] != {-}} {
+ reception_control
+
+ set rxd_signal_prev $rxd_signal
+ set rxd_signal [lindex $state $pp]
+
+ # Convert any possible I/O signal value to Boolean value
+ switch -- $rxd_signal {
+ {0} -
+ {1} {}
+ {=} {
+ set rxd_signal 0
+ }
+ default {
+ write_to_log E [mc "RxD: Input corrupted!"]
+ }
+ }
+
+ for {set i 0} {$i < $cycles} {incr i} {
+ graph_draw r [$project pale_RRPPV $pp $i]
+ }
+ }
+ }
+
+ ## Withdraw panel window from the screen
+ # @return void
+ public method withdraw_window {} {
+ wm withdraw $win
+ }
+
+ ## Get panel configuration list (usable with method "set_config")
+ # @return List - configuration list
+ public method get_config {} {
+ return [list \
+ $class_name \
+ [list \
+ [array get connection_port] \
+ [array get connection_pin] \
+ [wm geometry $win] \
+ [$usr_note get] \
+ $baud_conf \
+ $parity_conf \
+ $data_conf \
+ $stop_conf \
+ [$send_hexeditor get_values 0 255] \
+ [$send_hexeditor getCurrentCell] \
+ [$receive_hexeditor get_values 0 255] \
+ [$receive_hexeditor getCurrentCell] \
+ $reception_address \
+ [wm geometry $win.log_window] \
+ [wm state $win.log_window] \
+ $keep_win_on_top \
+ ] \
+ ]
+ }
+
+ ## Set panel configuration from list gained from method "get_config"
+ # @parm List state - Configuration list
+ # @return void
+ public method set_config {state} {
+ # Load connections to the MCU
+ array set connection_port [lindex $state 0]
+ array set connection_pin [lindex $state 1]
+
+ # Restore window geometry
+ if {[string length [lindex $state 2]]} {
+ wm geometry $win [regsub {^\=?\d+x\d+} [lindex $state 2] [join [wm size $win] {x}]]
+ }
+
+ # Load user note
+ $usr_note delete 0
+ $usr_note insert 0 [lindex $state 3]
+
+ set baud_conf [lindex $state 4]
+ set bit_time [expr {1000000000.0 / $baud_conf}]
+ set parity_conf [lindex $state 5]
+ set data_conf [lindex $state 6]
+ set stop_conf [lindex $state 7]
+
+ $baud_cb current [lsearch [$baud_cb cget -values] $baud_conf]
+ $parity_cb current [lsearch {n o e} $parity_conf]
+ $data_cb current [lsearch [$data_cb cget -values] $data_conf]
+ $stop_cb current [lsearch [$stop_cb cget -values] $stop_conf]
+
+ for {set i 0} {$i < 0x100} {incr i} {
+ $send_hexeditor setValue $i [lindex $state [list 8 $i]]
+ }
+ $send_hexeditor setCurrentCell [lindex $state 9]
+ for {set i 0} {$i < 0x100} {incr i} {
+ $receive_hexeditor setValue $i [lindex $state [list 10 $i]]
+ }
+ $receive_hexeditor setCurrentCell [lindex $state 11]
+ set reception_address [lindex $state 12]
+ $receive_hexeditor clearBgHighlighting 0
+ $receive_hexeditor set_bg_hg $reception_address 1 0
+
+ # Display the log window
+ set log_window_geometry [lindex $state 13]
+ if {[lindex $state 14] == {normal}} {
+ show_log
+ }
+
+ if {[lindex $state 15] != {}} {
+ set keep_win_on_top [lindex $state 15]
+ if {$keep_win_on_top} {
+ wm attributes $win -topmost 1 -alpha 0.8
+ }
+ }
+
+ # Restore state of ComboBoxes
+ for {set i 0} {$i < 2} {incr i} {
+ ## PIN
+ set pin $connection_pin($i)
+ if {$pin != {-}} {
+ set pin [expr {7 - $pin}]
+ }
+ set idx [lsearch -ascii -exact \
+ [$cb(b$i) cget -values] \
+ $pin \
+ ]
+ if {$idx == -1} {
+ set idx 0
+ }
+ $cb(b$i) current $idx
+
+ ## PORT
+ set idx [lsearch -ascii -exact \
+ [$cb(p$i) cget -values] \
+ $connection_port($i) \
+ ]
+ if {$idx == -1} {
+ set idx 0
+ }
+ $cb(p$i) current $idx
+ }
+
+ # Adjust internal logic and the rest of PALE
+ evaluete_enaged_pins
+ $project pale_reevaluate_IO
+ update
+
+ if {[catch {
+ # Fail
+ }]} then {
+ puts "Unable to load configuration for $class_name"
+ return 0
+
+ # Success
+ } else {
+ clear_modified
+ return 1
+ }
+ }
+
+ ## Simulated MCU has been reseted
+ # @return void
+ public method reset {} {
+ set state [$project pale_get_true_state]
+ new_state state
+
+ graph_clear t
+ graph_clear r
+ }
+
+
+ # ------------------------------------------------------------------
+ # VIRTUAL HW COMMON INTERFACE -- CALLED FROM THE BASE CLASS
+ # ------------------------------------------------------------------
+
+ ## This method is called before configuration menu invocation
+ # @return void
+ public method config_menu_special {} {
+ set ::${class_name}::menu_keep_win_on_top $keep_win_on_top
+ }
+
+ ## This method is called after configuration menu has beed created
+ # @return void
+ public method create_config_menu_special {} {
+ }
+
+ ## This method is called to fill in the help dialog
+ # @parm Widget text_widget - Target text widget
+ # @return void
+ #
+ # Note: There is defined text tag "tag_bold" in the text widget
+ public method show_help_special {text_widget} {
+ }
+
+ ## This method is called before panel window closure
+ # @return void
+ public method close_window_special {} {
+ }
+
+ ## Commit new on/off state
+ # @return void
+ public method on_off_special {} {
+ if {[$project pale_is_enabled]} {
+ graph_clear t
+ graph_clear r
+ }
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/project.tcl b/lib/project.tcl
index 3c4571b..bdab27a 100755..100644
--- a/lib/project.tcl
+++ b/lib/project.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 _PROJECT_TCL ] } {
+set _PROJECT_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements project files management
@@ -31,7 +36,7 @@ namespace eval Project {
variable xml_data_tk_mcuide_project {} ;# Attributes of <tk_mcuide_project>
variable xml_data_authors {} ;# Content of <authors>
variable xml_data_copyright {} ;# Content of <copyright>
- variable xml_data_licence {} ;# Content of <licence>
+ variable xml_data_license {} ;# Content of <license>
variable xml_data_processor {} ;# Attributes of <processor>
variable xml_data_options {} ;# Attributes of <options>
variable xml_data_graph {} ;# Attributes of <graph>
@@ -50,16 +55,17 @@ namespace eval Project {
variable xml_curTag {} ;# Currenly parsed XML tag
variable xml_start {} ;# Bool: True at start of parsing
variable expect_data_part 1 ;# Bool: True if on the next comes data
- variable xml_warning 0 ;# Bool: True if an error occured during parsing process
-
+ variable xml_warning 0 ;# Bool: True if an error occurred during parsing process
## Create string which can be saved as a project definition file (format: XML)
# @parm List inputData - requested format: {
# {version date creator_ver} # tag: tk_mcuide_project
- # {authors copyright licence} # tag: authors copyright licence
+ # {authors copyright license} # tag: authors copyright license
# {type clock xdata xcode} # tag: processor
# {watches_file scheme main_file auto_sw_enabled} # tag: options
- # {grid_mode magnification drawing_on mark_flags} # tag: graph
+ # {grid_mode magnification drawing_on
+ # mark_flags_true_state mark_flags_latched
+ # mark_flags_output active_page} # tag: graph
# {description todo} # tag: descriptin todo
# {radix angle_unit # tag: calculator
# display0 display1 display2
@@ -78,7 +84,7 @@ namespace eval Project {
# ...
# }
# }
- # @return String - outpud data (formated as XML)
+ # @return String - outpud data (formatted as XML)
proc create_project_file_as_string {inputData} {
# Initialize variables related to content of the file
@@ -87,7 +93,7 @@ namespace eval Project {
# Definition of file structure (except of <files>)
set dataPartStructure {
{version date creator_ver}
- {authors copyright licence}
+ {authors copyright license}
{mcu_type clock xdata xcode}
{watches_file scheme main_file auto_sw_enabled}
{graph_grid_mode graph_magnification graph_drawing_on graph_mark_flags_s graph_mark_flags_l graph_mark_flags_o active_page}
@@ -121,15 +127,16 @@ namespace eval Project {
} else {
foreach var {
version date creator_ver authors copyright
- licence other_options files_count mcu_type xdata
+ license other_options files_count mcu_type xdata
watches_file files description todo calc_radix
angle_unit display0 display1 display2 memory0
memory1 memory2 clock freq time
mode graph_grid_mode graph_magnification graph_drawing_on
- graph_mark_flags_s graph_mark_flags_l graph_mark_flags_o active_page
- xcode scheme graph_mark_flags current_file2
- pwin_sash main_file compiler_options
- } {
+ auto_sw_enabled current_file2 graph_mark_flags_o active_page
+ xcode scheme graph_mark_flags graph_mark_flags_l
+ pwin_sash main_file compiler_options graph_mark_flags_s
+ } \
+ {
set $var {}
}
}
@@ -142,14 +149,14 @@ namespace eval Project {
## Create XML string
append result "<?xml version='1.0' encoding='utf-8'?>\n"
- if {[file exists "${::LIB_DIRNAME}/../data/project.dtd"]} {
+ if {[file exists "${::ROOT_DIRNAME}/data/project.dtd"]} {
if {[catch {
- set dtd [open "${::LIB_DIRNAME}/../data/project.dtd" r]
+ set dtd [open "${::ROOT_DIRNAME}/data/project.dtd" r]
}]} then {
puts stderr "Unable to open project DTD, please check your installation."
} else {
append result "<!DOCTYPE tk_mcuide_project \[\n\n"
- while 1 {
+ while {1} {
if {[eof $dtd]} {
close $dtd
break
@@ -169,7 +176,7 @@ namespace eval Project {
append result "\t\t<authors><!\[CDATA\[[adjust_to_xml $authors]\]\]></authors>\n"
append result "\t\t<copyright><!\[CDATA\["
append result "[adjust_to_xml $copyright]\]\]></copyright>\n"
- append result "\t\t<licence><!\[CDATA\[[adjust_to_xml $licence]\]\]></licence>\n"
+ append result "\t\t<license><!\[CDATA\[[adjust_to_xml $license]\]\]></license>\n"
append result "\t\t<processor type=\"[adjust_to_xml $mcu_type]\" clock=\"[adjust_to_xml $clock]\""
append result " xdata=\"[adjust_to_xml $xdata]\" xcode=\"[adjust_to_xml $xcode]\"/>\n"
append result "\t\t<options\n"
@@ -219,8 +226,9 @@ namespace eval Project {
file_index read_only actual_line md5_hash
path bookmarks breakpoints eol
enc highlight notes
- } {
- set $var $value
+ } \
+ {
+ set $var $value
}
append result "\t\t<file name=\"[adjust_to_xml $name]\" active=\"[adjust_to_xml $active]\" "
append result "o_bookmark=\"$o_bookmark\" p_bookmark=\"$p_bookmark\" "
@@ -238,7 +246,7 @@ namespace eval Project {
append result "\t\t</file>\n\n"
}
append result "\t</files>\n"
- append result "</tk_mcuide_project>"
+ append result "</tk_mcuide_project>\n"
# Return resulting XML String
return $result
@@ -258,7 +266,7 @@ namespace eval Project {
set projectFile [open $filename r]
set dataList [create_list_from_project_string [read $projectFile]]
close $projectFile
- }]} {
+ }]} then {
return 0
}
@@ -276,12 +284,12 @@ namespace eval Project {
$projectDescriptor {_} projectDescriptor
# Take care of opening multiple instances of the same project
- if {[lsearch ${X::openedProjects} $projectDescriptor] != -1} {
+ if {[lsearch ${::X::openedProjects} $projectDescriptor] != -1} {
append project_new_name "(0)"
append projectDescriptor "_0"
- while 1 {
- if {[lsearch ${X::openedProjects} $projectDescriptor] == -1} {break}
+ while {1} {
+ if {[lsearch ${::X::openedProjects} $projectDescriptor] == -1} {break}
regexp {\d+$} $projectDescriptor index
regsub {_\d+$} $projectDescriptor {} projectDescriptor
@@ -297,7 +305,7 @@ namespace eval Project {
}
# Show project notebook
- if {${X::project_menu_locked}} {
+ if {${::X::project_menu_locked}} {
pack .mainFrame.mainNB -expand 1 -fill both
}
@@ -308,7 +316,7 @@ namespace eval Project {
MainTab ::$projectDescriptor $project_new_name $projectPath $projectFileName $dataList
# Unlock all menu items
- if {${X::project_menu_locked}} {
+ if {${::X::project_menu_locked}} {
::X::Unlock_project_menu
}
::X::disaena_menu_toolbar_for_current_project
@@ -324,7 +332,7 @@ namespace eval Project {
variable xml_data_tk_mcuide_project ;# Attributes of <tk_mcuide_project>
variable xml_data_authors ;# Content of <authors>
variable xml_data_copyright ;# Content of <copyright>
- variable xml_data_licence ;# Content of <licence>
+ variable xml_data_license ;# Content of <license>
variable xml_data_processor ;# Attributes of <processor>
variable xml_data_options ;# Attributes of <options>
variable xml_data_graph ;# Attributes of <graph>
@@ -339,7 +347,7 @@ namespace eval Project {
variable xml_expect ;# XML tag expected to be the next
variable xml_curTag ;# Currenly parsed XML tag
variable xml_data_file ;# Auxiliary variable for xml_data_files
- variable xml_warning ;# Bool: True if an error occured during parsing process
+ variable xml_warning ;# Bool: True if an error occurred during parsing process
variable xml_start ;# Bool: True at start of parsing
# Setup XML parser
@@ -356,7 +364,7 @@ namespace eval Project {
# Start XML parser
if {[catch {
$parser parse $inputData
- } result]} {
+ } result]} then {
puts stderr "XML parse error: $result"
report_project_loading_error
return {}
@@ -375,7 +383,7 @@ namespace eval Project {
lappend result [list \
[unescape_tags $xml_data_authors ] \
[unescape_tags $xml_data_copyright ] \
- [unescape_tags $xml_data_licence ] \
+ [unescape_tags $xml_data_license ] \
]
lappend result $xml_data_processor
lappend result [unescape_tags $xml_data_options]
@@ -388,7 +396,7 @@ namespace eval Project {
lappend result [unescape_tags $xml_data_other_options ]
lappend result [unescape_curlies [unescape_tags $xml_data_compiler_options]]
- lappend__xml_data_files__xml_data_file ;# Note that this is important function
+ lappend__xml_data_files__xml_data_file ;# Note that this is an important function
lappend result [concat \
$xml_data_files_count \
[unescape_tags $xml_data_files] \
@@ -408,7 +416,7 @@ namespace eval Project {
variable xml_data_tk_mcuide_project ;# Attributes of <tk_mcuide_project>
variable xml_data_authors ;# Content of <authors>
variable xml_data_copyright ;# Content of <copyright>
- variable xml_data_licence ;# Content of <licence>
+ variable xml_data_license ;# Content of <license>
variable xml_data_processor ;# Attributes of <processor>
variable xml_data_options ;# Attributes of <options>
variable xml_data_graph ;# Attributes of <graph>
@@ -428,14 +436,15 @@ namespace eval Project {
# Set all listed variables to empty string
foreach var {
- xml_data_tk_mcuide_project xml_data_authors xml_data_copyright
- xml_data_licence xml_curTag xml_data_processor
- xml_data_options xml_data_description xml_data_todo
- xml_data_files xml_data_calculator xml_data_other_options
- xml_data_files_count xml_data_current_file xml_data_file
- xml_expect xml_data_graph xml_data_compiler_options
- xml_data_file_notes
- } {
+ xml_data_tk_mcuide_project xml_data_authors xml_data_copyright
+ xml_data_license xml_curTag xml_data_processor
+ xml_data_options xml_data_description xml_data_todo
+ xml_data_files xml_data_calculator xml_data_other_options
+ xml_data_files_count xml_data_current_file xml_data_file
+ xml_expect xml_data_graph xml_data_compiler_options
+ xml_data_file_notes
+ } \
+ {
set $var {}
}
}
@@ -443,14 +452,18 @@ namespace eval Project {
## Invoke dialog to report error occcured while parsing data
# @return void
proc report_project_loading_error {} {
- variable xml_warning ;# Bool: True if an error occured during parsing process
+ variable xml_warning ;# Bool: True if an error occurred during parsing process
# Ensure than there is only one error message dialog
if {$xml_warning} {return}
# Invoke dialog
- tk_messageBox -icon error -type ok -title [mc "Project loading error"] \
- -message [mc "ERROR:\nThe project file cannot be loaded correctly due to a xml parsing error. The file is eighter corrupted or it is not a project file acceptable by this environment."]
+ tk_messageBox \
+ -icon error \
+ -type ok \
+ -parent . \
+ -title [mc "Project loading error"] \
+ -message [mc "ERROR:\nThe project file cannot be loaded correctly due to a xml parsing error. The file is either corrupted or it is not a project file acceptable by this environment."]
set xml_warning 1
}
@@ -572,12 +585,12 @@ namespace eval Project {
variable xml_curTag ;# Currenly parsed XML tag
variable xml_start ;# Bool: True at start of parsing
variable xml_attlist ;# Auxiliary variable - List of current tag attributes
- variable xml_warning ;# Bool: True if an error occured during parsing process
+ variable xml_warning ;# Bool: True if an error occurred during parsing process
variable xml_data_tk_mcuide_project ;# Attributes of <tk_mcuide_project>
variable xml_data_authors ;# Content of <authors>
variable xml_data_copyright ;# Content of <copyright>
- variable xml_data_licence ;# Content of <licence>
+ variable xml_data_license ;# Content of <license>
variable xml_data_processor ;# Attributes of <processor>
variable xml_data_options ;# Attributes of <options>
variable xml_data_graph ;# Attributes of <graph>
@@ -619,8 +632,8 @@ namespace eval Project {
{copyright} {
set xml_data_copyright $data
}
- {licence} {
- set xml_data_licence $data
+ {license} {
+ set xml_data_license $data
}
{description} {
append xml_data_description $data "\n"
@@ -639,11 +652,15 @@ namespace eval Project {
if {[llength $xml_data_file] == 9} {
lappend xml_data_file {}
}
- regsub -all {[ \t\n\r]+} $data {} data
+ regsub -all {[ \t\n\r]+} $data { } data
+ regsub {^ } $data { } data
+ regsub { $} $data { } data
lappend xml_data_file $data
}
{breakpoints} {
- regsub -all {[ \t\n\r]+} $data {} data
+ regsub -all {[ \t\n\r]+} $data { } data
+ regsub {^ } $data { } data
+ regsub { $} $data { } data
lappend xml_data_file $data
}
{path} {
@@ -665,12 +682,12 @@ namespace eval Project {
variable xml_curTag ;# Currenly parsed XML tag
variable xml_start ;# Bool: True at start of parsing
variable xml_attlist ;# Auxiliary variable - List of current tag attributes
- variable xml_warning ;# Bool: True if an error occured during parsing process
+ variable xml_warning ;# Bool: True if an error occurred during parsing process
variable xml_data_tk_mcuide_project ;# Attributes of <tk_mcuide_project>
variable xml_data_authors ;# Content of <authors>
variable xml_data_copyright ;# Content of <copyright>
- variable xml_data_licence ;# Content of <licence>
+ variable xml_data_license ;# Content of <license>
variable xml_data_processor ;# Attributes of <processor>
variable xml_data_options ;# Attributes of <options>
variable xml_data_graph ;# Attributes of <graph>
@@ -718,10 +735,14 @@ namespace eval Project {
}
{copyright} {
set xml_curTag "copyright"
- project_xml_expect "licence"
+ project_xml_expect "licence license"
+ }
+ {license} {
+ set xml_curTag "license"
+ project_xml_expect "processor"
}
{licence} {
- set xml_curTag "licence"
+ set xml_curTag "license"
project_xml_expect "processor"
}
{processor} {
@@ -848,10 +869,10 @@ namespace eval Project {
}
if {[llength $xml_data_file] == 12} {
- puts stderr [mc "Conveting old project file to new version"]
+ puts stderr [mc "Converting old project file to new version"]
- # eol enc
- lappend xml_data_file {} {}
+ # eol enc
+ lappend xml_data_file {} {}
}
# Move attribute "highlight" from index 6 to 13
@@ -866,3 +887,7 @@ namespace eval Project {
lappend xml_data_files $xml_data_file
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/receive_and_print.tcl b/lib/receive_and_print.tcl
new file mode 100644
index 0000000..1d082f3
--- /dev/null
+++ b/lib/receive_and_print.tcl
@@ -0,0 +1,102 @@
+#!/bin/sh
+# the next line restarts using wish \
+exec tclsh "$0" "$@"
+
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# Copyright (C) 2011 by Martin Ošmera #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _RECEIVE_AND_PRINT_TCL ] } {
+set _RECEIVE_AND_PRINT_TCL _
+# <<< File inclusion guard
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+# Send input read the send command to stdout
+#
+# USAGE:
+# set pid [exec -- tclsh receive_and_print.tcl [tk appname] final_cmd | some_command ?args? &]
+# * pid - Process identifier of $some_command
+# * args - Arguments for $some_command
+# * final_cmd - Command in local Tcl program to execute once when the script exits
+#
+# Once the receive_and_print (RAP) is started you can invoke ``print_line'' command available in it
+# to print any string to stdout. The command takes any number of arguments and prints them all into
+# the standard output.
+# --------------------------------------------------------------------------
+
+# Initialize
+encoding system {utf-8}
+package require Tk
+wm withdraw .
+wm command . "$argv0 $argv"
+wm client . [info hostname]
+
+# Parse agruments
+set source_app [lindex $argv 0]
+set final_cmd [lindex $argv 1]
+unset argv
+
+## Determinate the host OS
+set ::MICROSOFT_WINDOWS 0
+if {[string first {Windows} ${tcl_platform(os)}] != -1} {
+ # Note:
+ # Microsoft Windows is NOT a POSIX system and because of that we need
+ # to do some workarounds here in order to make the IDE functional there.
+ set ::MICROSOFT_WINDOWS 1
+}
+
+# Load dde - Dynamic Data Exchange on Microsoft Windows
+if {$::MICROSOFT_WINDOWS} {
+ package require dde
+}
+
+## Perform secure send command
+ # Secure means that it will not crash or something like that in case of any errors.
+ # But instead it will pop-up an error message to the user (Tk dialog).
+ # @parm List args - Arguments for the send command
+ # @return void
+proc secure_send args {
+ if {[catch {
+ eval "send $args"
+ } result]} then {
+ puts stderr "Unknown IO Error :: $result"
+ return 1
+
+ } else {
+ return 1
+ }
+}
+
+proc print_line {args} {
+ puts $args
+}
+
+if {!${::MICROSOFT_WINDOWS}} {
+ secure_send $source_app $final_cmd "{[tk appname]}"
+} else {
+ dde eval $source_app $final_cmd "{[tk appname]}"
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/rightpanel/hwmanager.tcl b/lib/rightpanel/hwmanager.tcl
index 0e27941..133d821 100755..100644
--- a/lib/rightpanel/hwmanager.tcl
+++ b/lib/rightpanel/hwmanager.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 _HWMANAGER_TCL ] } {
+set _HWMANAGER_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Provides panel for managing hardware plugins (e.g. Programmer, ICD, etc.)
@@ -29,24 +34,26 @@
class HwManager {
## COMMON
common PLUGIN_SEARCH_PATHS {
- ../hwplugins
/usr/share/mcu8051ide/hwplugins
/usr/local/share/mcu8051ide/hwplugins
}
+ if {$::MICROSOFT_WINDOWS} {
+ set PLUGIN_SEARCH_PATHS ${::INSTALLATION_DIR}/hwplugins
+ }
common inst_plg_count 0 ;# Int: Number of installed plugins
## PRIVATE
private variable parent ;# Widget: parent widget
- private variable gui_initialized 0 ;# Bool: GUI initialized
+ private variable hwman_gui_initialized 0 ;# Bool: GUI initialized
private variable main_frame ;# Widget: Main frame
private variable pagesmanager ;# Widget: Pages manager for plugins GUI
private variable plg_combobox ;# Widget: Plugin selection combobox
- private variable plg_refresh_but ;# Widget: Button "Refresh avaliable plugins"
+ private variable plg_refresh_but ;# Widget: Button "Refresh available plugins"
private variable ins_plugin_namespaces {} ;# List of Strings: Namespaces of installed (initialized) plugins
private variable ins_plugin_names {} ;# List of Strings: Names of installed (initialized) plugins
- private variable avl_plugin_files {} ;# List of Strings: Full filenames of avaliable plugins
- private variable avl_plugin_names {} ;# List of Strings: Names of avaliable plugins
+ private variable avl_plugin_files {} ;# List of Strings: Full filenames of available plugins
+ private variable avl_plugin_names {} ;# List of Strings: Names of available plugins
# List: Configuraion list of this panel (for session management)
private variable local_config [lindex $::CONFIG(HW_MANAGER_CONFIG) 0]
@@ -71,7 +78,7 @@ class HwManager {
if {[catch {
${ns}::dispose
- }]} {
+ }]} then {
plugin_error $name $ns
}
}
@@ -83,35 +90,35 @@ class HwManager {
# @return void
public method PrepareHwManager {_parent} {
set parent $_parent
- set gui_initialized 0
+ set hwman_gui_initialized 0
}
## Finalize initialization of this panel
# @return void
public method CreateHwManagerGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$hwman_gui_initialized} {return}
+ set hwman_gui_initialized 1
# Create main GUI parts
set main_frame [frame $parent.main_frame]
set top_frame [frame $main_frame.top]
- set pagesmanager [PagesManager $main_frame.pagesmanager -background {#eeeeee}]
+ set pagesmanager [PagesManager $main_frame.pagesmanager -background ${::COMMON_BG_COLOR}]
## Create parts of top panel
# Label "HW"
pack [label $top_frame.plg_label \
-text [mc "HW:"] \
] -side left
- # Combobox of avaliable/installed plugins
+ # Combobox of available/installed plugins
set plg_combobox [ttk::combobox $top_frame.plg_cbbox \
-exportselection 1 \
-width 0 \
-state readonly \
]
- DynamicHelp::add $plg_combobox -text [mc "List avaliable or installed HW plugins"]
+ DynamicHelp::add $plg_combobox -text [mc "List available or installed HW plugins"]
bind $plg_combobox <<ComboboxSelected>> "$this hw_manager_plg_cbs"
pack $plg_combobox -fill x -expand 1 -side left
- setStatusTip -widget $plg_combobox -text [mc "Avaliable/installed plugins"]
+ setStatusTip -widget $plg_combobox -text [mc "available/installed plugins"]
# Button "Refresh"
set plg_refresh_but [ttk::button $top_frame.plg_refresh_but \
-image ::ICONS::16::reload \
@@ -119,7 +126,7 @@ class HwManager {
-style Flat.TButton \
]
DynamicHelp::add $top_frame.plg_refresh_but \
- -text [mc "Refresh list avaliable or installed HW plugins"]
+ -text [mc "Refresh list available or installed HW plugins"]
pack $plg_refresh_but -side left
setStatusTip -widget $plg_refresh_but -text [mc "Refresh"]
# Fill in the combobox
@@ -141,16 +148,16 @@ class HwManager {
pack $main_frame -fill both -expand 1
}
- ## Refresh list avaliable or installed HW plugins
+ ## Refresh list available or installed HW plugins
# @return void
public method hw_manager_refresh_plugins {} {
- if {!$gui_initialized} {CreateHwManagerGUI}
+ if {!$hwman_gui_initialized} {CreateHwManagerGUI}
if {${::CLI_OPTION(no-plugins)}} {return}
set avl_plugin_files [list]
set avl_plugin_names [list]
- # Search for avaliable plugins
+ # Search for available plugins
foreach dir $PLUGIN_SEARCH_PATHS {
set dir [file join ${::LIB_DIRNAME} $dir]
catch { ;# For Microsoft Windows it has to be enclosed by catch
@@ -158,6 +165,7 @@ class HwManager {
if {[lsearch -ascii -exact $avl_plugin_names [file tail [file rootname $file]]] != -1} {
continue
}
+
lappend avl_plugin_files $file
lappend avl_plugin_names [regsub -all {_} [file tail [file rootname $file]] { }]
}
@@ -172,12 +180,12 @@ class HwManager {
# @parm String plugin_name - Plugin to switch to
# @return void
public method hw_manager_switch_plugin {plugin_name} {
- if {!$gui_initialized} {CreateHwManagerGUI}
+ if {!$hwman_gui_initialized} {CreateHwManagerGUI}
if {${::CLI_OPTION(no-plugins)}} {return}
# Install the plugin if it wasn't installed yet
if {[lsearch -ascii -exact $ins_plugin_names $plugin_name] == -1} {
- # Check if the selected plugin is really avaliable
+ # Check if the selected plugin is really available
if {[lsearch -ascii -exact $avl_plugin_names $plugin_name] == -1} {
return
}
@@ -192,15 +200,15 @@ class HwManager {
]
}
- # Adjust the combobox of avaliable/installed plugins
- $pagesmanager raise [regsub -all {\s} $plugin_name {_}]
+ # Adjust the combobox of available/installed plugins
+ $pagesmanager raise [regsub -all {[\s\.]} $plugin_name {_}]
}
- ## "Change command" for the combobox of avaliable/installed plugins
+ ## "Change command" for the combobox of available/installed plugins
# Switches the selected plugin
# @return void
public method hw_manager_plg_cbs {} {
- if {!$gui_initialized} {CreateHwManagerGUI}
+ if {!$hwman_gui_initialized} {CreateHwManagerGUI}
hw_manager_switch_plugin [$plg_combobox get]
}
@@ -209,22 +217,24 @@ class HwManager {
# @parm String file_path - Full path to the plugin main file
# @return String - Plugin namespace
public method hw_manager_install_plugin {plugin_name file_path} {
- if {!$gui_initialized} {CreateHwManagerGUI}
+ if {!$hwman_gui_initialized} {CreateHwManagerGUI}
if {${::CLI_OPTION(no-plugins)}} {return}
set plg_ns {}
if {[catch {
- set frame [$pagesmanager add [regsub -all {\s} $plugin_name {_}]]
+ set frame [$pagesmanager add [regsub -all {[\s\.]} $plugin_name {_}]]
set plg_ns "::HwManager::plugin_ns::$inst_plg_count"
incr inst_plg_count
namespace eval $plg_ns "source {$file_path}"
- set min_ide_ver [subst "\$${plg_ns}::MIN_IDE_VER"]
+ set min_ide_ver [subst -nocommands "\$${plg_ns}::MIN_IDE_VER"]
if {[package vcompare $min_ide_ver $::VERSION] == 1} {
tk_messageBox \
+ -parent . \
-title [mc "Too old version"] \
- -type ok -icon warning \
+ -type ok \
+ -icon warning \
-message [mc "Plugin %s requires MCU 8051 IDE version %s and above, please upgrade your MCU 8051 IDE" $plugin_name $min_ide_ver]
}
@@ -234,7 +244,7 @@ class HwManager {
if {$idx != -1} {
${plg_ns}::restore_session [lindex $plugin_config_1 $idx]
}
- }]} {
+ }]} then {
plugin_error $plugin_name $plg_ns
}
@@ -252,9 +262,9 @@ class HwManager {
set plugin_author {not defined}
set authors_email {not defined}
set err_info $::errorInfo
- catch {set plugin_ver [subst "\$${plugin_ns}::P_VERSION"]}
- catch {set plugin_author [subst "\$${plugin_ns}::AUTHOR"]}
- catch {set authors_email [subst "\$${plugin_ns}::EMAIL"]}
+ catch {set plugin_ver [subst -nocommands "\$${plugin_ns}::P_VERSION"]}
+ catch {set plugin_author [subst -nocommands "\$${plugin_ns}::AUTHOR"]}
+ catch {set authors_email [subst -nocommands "\$${plugin_ns}::EMAIL"]}
# Print error message to stadrad error output
puts stderr "\n\n"
@@ -285,85 +295,87 @@ class HwManager {
close $log_file
}
- # Display GUI error message
- set dialog [toplevel .plugin_error -bg {#EEEEEE}]
-
- # Create window frames
- set main_dlg_frame [frame $dialog.main_frame]
- set top_frame [frame $main_dlg_frame.top_frame -bg {#EE0000}]
- set middle_frame [frame $main_dlg_frame.middle_frame]
- set bottom_frame [frame $main_dlg_frame.bottom_frame]
-
- # Create window header
- pack [label $top_frame.header_lbl \
- -text [mc "PLUGIN ERROR"] \
- -bg {#EE0000} -fg {#FFFFFF} \
- -font [font create \
- -family helvetica \
- -size -24 \
- -weight bold \
- ] \
- ] -side left -fill x -expand 1
-
- # Create error message text and scrollbar
- pack [text $middle_frame.text \
- -bg {white} -bd 0 \
- -yscrollcommand "$middle_frame.scrollbar set" \
- -width 0 -height 0 -relief flat -wrap word \
- ] -side left -fill both -expand 1 -padx 5 -pady 5
- bind $middle_frame.text <Button-1> {focus %W}
- pack [ttk::scrollbar $middle_frame.scrollbar \
- -orient vertical \
- -command "$middle_frame.text yview" \
- ] -fill y -side right
-
- # Create button "Close"
- pack [ttk::button $bottom_frame.ok \
- -text [mc "Close"] \
- -style GreenBg.TButton \
- -command "
+ # Display GUI error message (only if the main window is still visible)
+ if {[wm state .] != {withdrawn}} {
+ set dialog [toplevel .plugin_error -bg ${::COMMON_BG_COLOR}]
+
+ # Create window frames
+ set main_dlg_frame [frame $dialog.main_frame]
+ set top_frame [frame $main_dlg_frame.top_frame -bg {#EE0000}]
+ set middle_frame [frame $main_dlg_frame.middle_frame]
+ set bottom_frame [frame $main_dlg_frame.bottom_frame]
+
+ # Create window header
+ pack [label $top_frame.header_lbl \
+ -text [mc "PLUGIN ERROR"] \
+ -bg {#EE0000} -fg {#FFFFFF} \
+ -font [font create \
+ -family helvetica \
+ -size [expr {int(-24 * $::font_size_factor)}] \
+ -weight bold \
+ ] \
+ ] -side left -fill x -expand 1
+
+ # Create error message text and scrollbar
+ pack [text $middle_frame.text \
+ -bg {white} -bd 0 \
+ -yscrollcommand "$middle_frame.scrollbar set" \
+ -width 0 -height 0 -relief flat -wrap word \
+ ] -side left -fill both -expand 1 -padx 5 -pady 5
+ bind $middle_frame.text <Button-1> {focus %W}
+ pack [ttk::scrollbar $middle_frame.scrollbar \
+ -orient vertical \
+ -command "$middle_frame.text yview" \
+ ] -fill y -side right
+
+ # Create button "Close"
+ pack [ttk::button $bottom_frame.ok \
+ -text [mc "Close"] \
+ -style GreenBg.TButton \
+ -command "
+ grab release $dialog
+ destroy $dialog
+ " \
+ ] -side right
+ focus -force $bottom_frame.ok
+
+ # Display error message
+ $middle_frame.text insert insert [mc "Plugin name:\t%s\n" $plugin_name]
+ $middle_frame.text insert insert [mc "Plugin version:\t%s\n" $plugin_ver]
+ $middle_frame.text insert insert [mc "Author:\t\t%s <%s>\n" $plugin_author $authors_email]
+ $middle_frame.text insert insert "\n"
+ $middle_frame.text insert insert $err_info
+ $middle_frame.text insert insert "\n"
+ $middle_frame.text configure -state disabled
+
+ # Pack window frames
+ pack $top_frame -fill x -anchor n
+ pack $middle_frame -fill both -expand 1
+ pack $bottom_frame -fill x
+ pack $main_dlg_frame -fill both -expand 1 -padx 5 -pady 5
+
+ # Configure dialog window
+ set x [expr {[winfo screenwidth $dialog] / 2 - 225}]
+ set y [expr {[winfo screenheight $dialog] / 2 - 125}]
+ wm iconphoto $dialog ::ICONS::16::bug
+ wm title $dialog [mc "PLUGIN ERROR - MCU 8051 IDE"]
+ wm minsize $dialog 450 250
+ wm geometry $dialog =550x250+$x+$y
+ wm protocol $dialog WM_DELETE_WINDOW "
grab release $dialog
- destroy $dialog
- " \
- ] -side right
- focus -force $bottom_frame.ok
-
- # Display error message
- $middle_frame.text insert insert [mc "Plugin name:\t%s\n" $plugin_name]
- $middle_frame.text insert insert [mc "Plugin version:\t%s\n" $plugin_ver]
- $middle_frame.text insert insert [mc "Author:\t\t%s <%s>\n" $plugin_author $authors_email]
- $middle_frame.text insert insert "\n"
- $middle_frame.text insert insert $err_info
- $middle_frame.text insert insert "\n"
- $middle_frame.text configure -state disabled
-
- # Pack window frames
- pack $top_frame -fill x -anchor n
- pack $middle_frame -fill both -expand 1
- pack $bottom_frame -fill x
- pack $main_dlg_frame -fill both -expand 1 -padx 5 -pady 5
-
- # Configure dialog window
- set x [expr {[winfo screenwidth $dialog] / 2 - 225}]
- set y [expr {[winfo screenheight $dialog] / 2 - 125}]
- wm iconphoto $dialog ::ICONS::16::bug
- wm title $dialog [mc "PLUGIN ERROR - MCU 8051 IDE"]
- wm minsize $dialog 450 250
- wm geometry $dialog =550x250+$x+$y
- wm protocol $dialog WM_DELETE_WINDOW "
- grab release $dialog
- destroy $dialog"
- update
- raise $dialog
- grab $dialog
- wm transient $dialog .
- tkwait window $dialog
+ destroy $dialog"
+ update
+ raise $dialog
+ grab $dialog
+ wm transient $dialog .
+ tkwait window $dialog
+ }
}
## Ask all plugins wheather they are ready for exit
# @return Bool - 1 == Exit allowed; 0 == Exit DENIED
public method hw_manager_comfirm_exit {} {
- if {!$gui_initialized} {return 1}
+ if {!$hwman_gui_initialized} {return 1}
foreach plg_name $ins_plugin_names plg_ns $ins_plugin_namespaces {
set busy_flag 0
@@ -389,7 +401,7 @@ class HwManager {
## Get configuration list for this panel (intented for sessions management)
# @return void
public method hw_manager_get_cfg {} {
- if {!$gui_initialized} {
+ if {!$hwman_gui_initialized} {
return [list $local_config $plugin_config_0 $plugin_config_1]
}
@@ -409,11 +421,125 @@ class HwManager {
if {$idx == -1} {
lappend plugin_config_0 $plg_name
lappend plugin_config_1 $config
- } {
+ } else {
lset plugin_config_1 $idx $config
}
}
return [list $local_config $plugin_config_0 $plugin_config_1]
}
+
+ # ---------------------------------------------------------------------
+ # Functions mend to be accessed from HW control plug-ins
+ # ---------------------------------------------------------------------
+
+ ## Check whether there is some project opened in the IDE
+ # @return Bool - 1 == Yes, there is; 0 == No there is not
+ proc is_project_opened {} {
+ return [expr {!${::X::project_menu_locked}}]
+ }
+
+ ## Check whether MCU simulator is engaged
+ # @return Bool - 0 == 1 == Yes, it is; No it is not (or no project is opened)
+ proc is_simulator_engaged {} {
+ if {[lindex ${::X::simulator_enabled} ${::X::actualProjectIdx}] == 1} {
+ return 1
+ } else {
+ return 0
+ }
+ }
+
+ ## Get full name of file which is currently displayed in the source code editor
+ # @return String - Full file name including path or empty string in case there is no project opened
+ proc get_current_file {} {
+ if {![is_project_opened]} {
+ return {}
+ } else {
+ return [${::X::actualProject} editor_procedure {} getFileName {}]
+ }
+ }
+
+ ## Get full name of file which has been chosen as the project main file
+ # @return String - Full file name or empty string
+ proc get_project_main_file {} {
+ if {![is_project_opened]} {
+ return {}
+ } else {
+ return [${::X::actualProject} cget -P_option_main_file]
+ }
+ }
+
+ ## Get path the directory of currently active project
+ # @return String - Directory path or empty string in case there is no project opened
+ proc get_project_dir {} {
+ if {![is_project_opened]} {
+ return {}
+ } else {
+ return [${::X::actualProject} cget -projectPath]
+ }
+ }
+
+ ## Get name of the current project
+ # @return String - Name of the current project or empty string in case there is no project opened
+ proc get_project_name {} {
+ if {![is_project_opened]} {
+ return {}
+ } else {
+ return [${::X::actualProject} cget -projectName]
+ }
+ }
+
+ ## Initiate compilation if at least one of the source files was modified
+ # @parm String success_callback - Any command to execute after successful compilation
+ # @parm String failure_callback - Any command to execute after unsuccessful compilation
+ # @return Bool - 1 == Process successfully started; 0 == Unable to comply (no project is opened)
+ proc compile_if_nessesary_and_callback {success_callback failure_callback} {
+ if {![is_project_opened]} {
+ return 0
+ }
+
+ ::X::compile_if_nessesary_and_callback $success_callback $failure_callback
+ return 1
+ }
+
+ ## Open the specified Intel® 8 hex file in hexadecimal editor
+ # @parm String filename - Name of file to open (including path)
+ # @return Bool - 1 == Success; 0 == Failure
+ proc open_in_hexeditor {filename} {
+ return [[::X::__hexeditor] open_file $filename hex]
+ }
+
+ ## Start MCU simulator if possible
+ # @return Bool - 1 == Success; 0 == Unable to comply
+ proc start_simulator {} {
+ if {![is_project_opened]} {
+ return 0
+ }
+
+ if {[is_simulator_engaged]} {
+ return 0
+ }
+
+ ::X::__initiate_sim
+ return 1
+ }
+
+ ## Shutdown MCU simulator if possible
+ # @return Bool - 1 == Success; 0 == Unable to comply
+ proc shutdown_simulator {} {
+ if {![is_project_opened]} {
+ return 0
+ }
+
+ if {![is_simulator_engaged]} {
+ return 0
+ }
+
+ ::X::__initiate_sim
+ return 1
+ }
+}
+
+# >>> File inclusion guard
}
+# <<< File inclusion guard
diff --git a/lib/rightpanel/instructiondetails.tcl b/lib/rightpanel/instructiondetails.tcl
index 0c7efaf..88f0206 100755..100644
--- a/lib/rightpanel/instructiondetails.tcl
+++ b/lib/rightpanel/instructiondetails.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 _INSTRUCTIONDETAILS_TCL ] } {
+set _INSTRUCTIONDETAILS_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements tab "Instruction details" on the Right Panel
@@ -30,9 +35,12 @@ class InstructionDetails {
## COMMON
# Conter of instances
- common count 0
+ common instd_count 0
# Font for instruction details
- common instruction_font [font create -size -12 -family $::DEFAULT_FIXED_FONT]
+ common instruction_font [font create \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -family $::DEFAULT_FIXED_FONT \
+ ]
## Highlighting tags for instruction details
# {
# {tag_name foreground_color ?bold_or_italic?}
@@ -69,13 +77,13 @@ class InstructionDetails {
# }
common HELP_FOR_DIRECTIVES {}
common HELP_FOR_DIRECTIVES_RAW {
- elseif {Conditional assembly\n\nSyntax:\n ELSEIF <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only}
+ elseif {Conditional assembly\n\nSyntax:\n ELSEIF <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n}
ifn {IF Not, conditional assembly\n\nSyntax:\n IFN <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n}
- elseifn {ELSE IF Not\n\nSyntax:\n ELSEIFN <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFN SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only}
+ elseifn {ELSE IF Not\n\nSyntax:\n ELSEIFN <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFN SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n}
ifdef {IF DEFined\n\nSyntax:\n IFDEF <symbol>\n\nExample:\n IFDEF CND\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n}
- elseifdef {ELSE IF DEFined\n\nSyntax:\n ELSEIFDEF <symbol>\n\nExample:\n IFDEF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only}
+ elseifdef {ELSE IF DEFined\n\nSyntax:\n ELSEIFDEF <symbol>\n\nExample:\n IFDEF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n}
ifndef {IF Not DEFined\n\nSyntax:\n IFNDEF <symbol>\n\nExample:\n IFNDEF CND\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n}
- elseifndef {ELSE IF Not DEFined\n\nSyntax:\n ELSEIFNDEF <symbol>\n\nExample:\n IFDEF CND\n MOV A, #20h\n ELSEIFNDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only}
+ elseifndef {ELSE IF Not DEFined\n\nSyntax:\n ELSEIFNDEF <symbol>\n\nExample:\n IFDEF CND\n MOV A, #20h\n ELSEIFNDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n}
ifb {IF Black\n\nSyntax:\n IFB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only}
elseifb {ELSE IF Black\n\nSyntax:\n ELSEIFB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSEIFB <SOMETHING_ELSE>\n MOV A, #40h\n ENDIF\n\literal:\n Supported by ASEM-51 only}
ifnb {IF Not Black\n\nSyntax:\n IFNB <literal>\n\nExample:\n IFNB <CND>\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only}
@@ -96,11 +104,12 @@ class InstructionDetails {
bseg {switch to BIT segment \[at address\]\n\nSyntax:\n BSEG \[AT <expr>\]\n\nExample:\n BSEG at 5d\n\n}
xseg {switch to XDATA segment \[at address\]\n\nSyntax:\n XSEG \[AT <expr>\]\n\nExample:\n XSEG at 30d\n\n}
cseg {switch to CODE segment \[at address\]\n\nSyntax:\n CSEG \[AT <expr>\]\n\nExample:\n CSEG at 40d\n\n}
+ local {define a local label inside a macro\n\nSyntax:\n LOCAL <symbol>\n\nExample:\n ABC MACRO\n LOCAL xyz\n xyz: MOV B, #12d\n EXITM\n NOP\n ENDM\n\n}
flag {define a FLAG bit\n\nSyntax:\n <symbol> FLAG <expr>\n\nExample:\n F4 FLAG 16h\n\nNote:\n Deprecated directive. Consider directive BIT instead.}
skip {SKIP bytes in the code memory\n\nSyntax:\n SKIP <expr>\n\nExample:\n SKIP 5\n\n}
equ {EQUivalent\n\nSyntax:\n <symbol> EQU <expr>\n\nExample:\n ABC EQU R0\n XYZ EQU 4Eh+12\n\n}
bit {define BIT address\n\nSyntax:\n <symbol> BIT <expr>\n\nExample:\n ABC BIT P4.5\n\n}
- set {SET numeric variable or variable register\n\nSyntax:\n <symbol> SET <expr>\n <symbol> SET <register>\n\nExample:\n ALPHA SET R0\N ALPHA SET 42*BETA\n\n}
+ set {SET numeric variable or variable register\n\nSyntax:\n <symbol> SET <expr>\n <symbol> SET <register>\n\nExample:\n ALPHA SET R0\n ALPHA SET 42*BETA\n\n}
code {define address in the CODE memory\n\nSyntax:\n <symbol> CODE <expr>\n\nExample:\n TBL CODE 600h\n\n}
data {define address in the DATA memory\n\nSyntax:\n <symbol> DATA <expr>\n\nExample:\n UIV DATA 20h\n\n}
idata {define address in the Internal DATA memory\n\nSyntax:\n <symbol> IDATA <expr>\n\nExample:\n UIV IDATA 20h\n\n}
@@ -111,7 +120,7 @@ class InstructionDetails {
db {Define Bytes\n\nSyntax:\n DB <expr1> \[,<expr2> ... \]\n\nExample:\n DB 24,'August',09,(2*8+24)/8\n\n}
dbit {Define BITs\n\nSyntax:\n DBIT <expr>\n\nExample:\n DBIT 4+2\n\n}
include {INCLUDE an external source code\n\nSyntax:\n INCLUDE <filename>\n\nExample:\n INCLUDE 'my file.asm'\n\n}
- org {ORiGin of segment location\n\nSyntax:\n ORG <expr>\n\nExample:\n ORG 0Bh\n\n}
+ org {ORiGin of code segment location\n\nSyntax:\n ORG <expr>\n\nExample:\n ORG 0Bh\n\n}
using {USING register banks\n\nSyntax:\n USING <expr>\n\nExample:\n USING 2\n\n}
byte {define BYTE address in the data memory\n\nSyntax:\n <symbol> BYTE <expr>\n\nExample:\n UIV BYTE 20h\n\nNote:\n Deprecated directive. Consider directive DATA instead.}
@@ -875,7 +884,7 @@ class InstructionDetails {
private variable header_text ;# Widget: Text header
private variable instruction_last {} ;# String: Last instruction shown in details window
private variable parent {} ;# Widget: GUI parent
- private variable gui_initialized 0 ;# Bool: GUI initialized
+ private variable instd_gui_initialized 0 ;# Bool: GUI initialized
private variable gui_preparing 0 ;# Bool: Prearing panel GUI
private variable enabled 0 ;# Bool: enable procedures which are needless while loading project
@@ -886,11 +895,11 @@ class InstructionDetails {
private variable ins_help_window {} ;# Widget: Help window itself
private variable help_win_title ;# Widget: Title label (should contain instruction name and operands)
## Array of Widgets: Labels containing certain information
- # Avaliable keys are: description, length, execution_time, opcode, note and class
+ # available keys are: description, length, execution_time, opcode, note and class
private variable help_win_labels
constructor {} {
- incr count
+ incr instd_count
}
destructor {
@@ -901,13 +910,13 @@ class InstructionDetails {
# @return void
public method PrepareInstructionDetails {_parent} {
set parent $_parent
- set gui_initialized 0
+ set instd_gui_initialized 0
}
## Create GUI of tab "Instruction details"
# @return void
public method CreateInstructionDetailsGUI {} {
- if {$gui_initialized || $gui_preparing || ${::Editor::editor_to_use}} {return}
+ if {$instd_gui_initialized || $gui_preparing || ${::Editor::editor_to_use}} {return}
set gui_preparing 1
# Create frames
@@ -929,10 +938,14 @@ class InstructionDetails {
# Tab header (instruction name)
set instruction_label [label $header_frame.lbl_rightPanel_instruction_header \
- -fg {#0000FF} \
- -anchor w \
- -padx {20px} \
- -font [font create -weight {bold} -size -17 -family $::DEFAULT_FIXED_FONT] \
+ -fg {#0000FF} \
+ -anchor w \
+ -padx {20px} \
+ -font [font create \
+ -weight {bold} \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -family $::DEFAULT_FIXED_FONT \
+ ] \
]
pack $instruction_label -side left -fill x -expand 1
setStatusTip -widget $instruction_label -text [mc "Instruction name"]
@@ -940,7 +953,7 @@ class InstructionDetails {
# Create popup menu for instruction text and its header
set instruction_menu [menu $text_frame.popup_menu -tearoff 0]
$instruction_menu add command -label "Configure" -compound left \
- -command {::configDialogs::rightPanel::mkDialog 1} \
+ -command {::configDialogues::rightPanel::mkDialog 1} \
-underline 0 -image ::ICONS::16::configure
# Text header
@@ -951,6 +964,7 @@ class InstructionDetails {
-height 1 \
-bd 0 \
-exportselection 0 \
+ -wrap none \
]
bind $header_text <ButtonRelease-3> "tk_popup $instruction_menu %X %Y; break"
bind $header_text <Key-Menu> "tk_popup $instruction_menu %X %Y; break"
@@ -959,7 +973,7 @@ class InstructionDetails {
# Instruction details text
set instruction_text [text $text_frame.txt_rightPanel_instruction \
-yscrollcommand "$body_frame.src_rightPanel_instruction set" \
- -cursor left_ptr -state disabled -wrap word \
+ -cursor left_ptr -state disabled -wrap none \
-font $instruction_font -bd 0 -exportselection 0 \
]
# Create scrollbar
@@ -979,7 +993,10 @@ class InstructionDetails {
$instruction_text tag configure tag_sel0 -background #E0FFE0
rightPanel_refresh_instruction_highlighting
$instruction_text tag configure tag_bold -font [font create \
- -size -12 -family $::DEFAULT_FIXED_FONT -weight {bold}]
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -family $::DEFAULT_FIXED_FONT \
+ -weight {bold} \
+ ]
# Pack parts of text frame (Instruction details text, Text header)
pack $header_text -side top -fill x
@@ -990,7 +1007,7 @@ class InstructionDetails {
pack $header_frame -side top -fill x
pack $body_frame -side bottom -fill both -expand 1
- set gui_initialized 1
+ set instd_gui_initialized 1
}
## Invoke legend window for "Instruction details"
@@ -1006,7 +1023,7 @@ class InstructionDetails {
set y [winfo pointery .]
# Create legend window
- set win [toplevel .rightPanel_legend -class {Help} -bg {#EEEEEE}]
+ set win [toplevel .rightPanel_legend -class {Help} -bg ${::COMMON_BG_COLOR}]
set frame [frame $win.f -bg {#555555} -bd 0 -padx 1 -pady 1]
wm overrideredirect $win 1
@@ -1152,7 +1169,8 @@ class InstructionDetails {
# @return void
public method rightPanel_ins_clear {} {
if {!$enabled || ${::Editor::editor_to_use}} {return}
- if {!$gui_initialized} {CreateInstructionDetailsGUI}
+ if {!$instd_gui_initialized} {CreateInstructionDetailsGUI}
+
$instruction_text configure -state normal
$instruction_text delete 1.0 end
$instruction_text configure -state disabled
@@ -1167,7 +1185,7 @@ class InstructionDetails {
# @return void
public method rightPanel_refresh_instruction_highlighting {} {
if {${::Editor::editor_to_use}} {return}
- if {!$gui_initialized && !$gui_preparing} {return}
+ if {!$instd_gui_initialized && !$gui_preparing} {return}
$this right_panel_create_highlighting_tags \
$instruction_text $instruction_tags 0
}
@@ -1176,12 +1194,12 @@ class InstructionDetails {
# @return void
public method rightPanel_ins_unselect {} {
if {!$enabled || ${::Editor::editor_to_use}} {return}
- if {!$gui_initialized} {return}
+ if {!$instd_gui_initialized} {return}
$instruction_text tag remove tag_sel 1.0 end
if {$::CONFIG(VALIDATION_LEVEL) == 2} {
$instruction_label configure -fg {#FF0000}
- } {
+ } else {
$instruction_label configure -fg {#0000FF}
}
}
@@ -1192,12 +1210,12 @@ class InstructionDetails {
# @return void
public method rightPanel_ins_select {perfect_match list_of_indexes} {
if {!$enabled || ${::Editor::editor_to_use}} {return}
- if {!$gui_initialized} {return}
+ if {!$instd_gui_initialized} {return}
if {[$instruction_label cget -text] == {}} {return}
$instruction_label configure -fg {#0000FF}
if {$perfect_match} {
set tag tag_sel
- } {
+ } else {
set tag tag_sel0
}
foreach line $list_of_indexes {
@@ -1213,7 +1231,7 @@ class InstructionDetails {
# @return void
public method rightPanel_dir_change {type directive} {
if {!$enabled || ${::Editor::editor_to_use}} {return}
- if {!$gui_initialized} {return}
+ if {!$instd_gui_initialized} {return}
regsub {^\.} $directive {} directive
set directive [string tolower $directive]
@@ -1225,7 +1243,7 @@ class InstructionDetails {
# Change content of tab header
if {$type == {D}} {
set clr {#00AADD}
- } {
+ } else {
set clr {#00AADD}
}
set dir_up [string toupper $directive]
@@ -1239,7 +1257,7 @@ class InstructionDetails {
set idx [lsearch -ascii -exact $HELP_FOR_DIRECTIVES $directive]
if {$idx == -1} {
$instruction_text insert end [mc "no help available for this directive"]
- } {
+ } else {
incr idx
$instruction_text insert end [lindex $HELP_FOR_DIRECTIVES $idx]
}
@@ -1259,7 +1277,7 @@ class InstructionDetails {
# @return void
public method rightPanel_ins_change {instruction} {
if {!$enabled || ${::Editor::editor_to_use}} {return}
- if {!$gui_initialized} {return}
+ if {!$instd_gui_initialized} {return}
set instruction [string tolower $instruction]
if {$instruction_last == $instruction} {return}
@@ -1333,7 +1351,7 @@ class InstructionDetails {
if {[string index $opr 0] == {@}} {
$instruction_text tag add tag_indr $startIndex insert-1c
# SFR
- } {
+ } else {
$instruction_text tag add tag_SFR $startIndex insert-1c
}
}
@@ -1580,15 +1598,19 @@ class InstructionDetails {
## Create instruciton help window
# @return void
private method create_ins_help_window {} {
+ if {$ins_help_win_created} {
+ return
+ }
set ins_help_win_created 1
# Create main parts of the window
- set ins_help_window [frame .ins_help_window${count} -bd 0 -bg {#BBBBFF} -padx 2 -pady 2]
+ incr instd_count
+ set ins_help_window [frame .ins_help_window${instd_count} -bd 0 -bg {#BBBBFF} -padx 2 -pady 2]
pack [frame $ins_help_window.top -bg {#BBBBFF}] -fill x -expand 1
pack [label $ins_help_window.top.img -bg {#BBBBFF} -image ::ICONS::16::info] -side left
pack [label $ins_help_window.top.tit -bg {#BBBBFF} -justify left -anchor w] -side left -fill x -expand 1
pack [frame $ins_help_window.msg -bg {#FFFFFF} -padx 10 -pady 5] -fill both -expand 1
- set help_win_title "$ins_help_window.top.tit"
+ set help_win_title "${ins_help_window}.top.tit"
## Create other parts of the window
# Descripton
@@ -1753,3 +1775,7 @@ class InstructionDetails {
# Initialize
::InstructionDetails::initialize
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/rightpanel/regwatches.tcl b/lib/rightpanel/regwatches.tcl
index ad5e433..6760cab 100755..100644
--- a/lib/rightpanel/regwatches.tcl
+++ b/lib/rightpanel/regwatches.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 _REGWATCHES_TCL ] } {
+set _REGWATCHES_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements register watches (part of Right Panel)
@@ -34,7 +39,7 @@ class RegWatches {
# Counter of embedded entry widgets in register watches
common watch_entry_count 0
# Conter of instances
- common count 0
+ common regw_count 0
## Highlighting tags for register watches
# {
# {tag_name foreground_color ?bold_or_italic?}
@@ -47,7 +52,7 @@ class RegWatches {
{tag_addr #0000DD 1}
{tag_name #8888DD {}}
}
- common regfont [font create -family $::DEFAULT_FIXED_FONT -size -14]
+ common regfont [font create -family $::DEFAULT_FIXED_FONT -size [expr {int(-14 * $::font_size_factor)}]]
# Popup menu for register watches
common WATCHMENU {
{command {Move top} {$watches:top} 0 "rightPanel_watch_move_top"
@@ -72,12 +77,12 @@ class RegWatches {
}
# Configuration menu
common CONFMENU {
- {cascade {Sort by} 0 "" .sort false 1 {
- {command {Name} {} 0 "rightPanel_watch_sort_by N" {}
+ {cascade "Sort by" 0 "" .sort false 1 {
+ {command "Name" {} 0 "rightPanel_watch_sort_by N" {}
""}
- {command {Address} {} 0 "rightPanel_watch_sort_by A" {}
+ {command "Address" {} 0 "rightPanel_watch_sort_by A" {}
""}
- {command {Type} {} 0 "rightPanel_watch_sort_by T" {}
+ {command "Type" {} 0 "rightPanel_watch_sort_by T" {}
""}
{separator}
{radiobutton "Incremental" {} ::RegWatches::sorting_order 1
@@ -85,18 +90,20 @@ class RegWatches {
{radiobutton "Decremental" {} ::RegWatches::sorting_order 0
{} 0 ""}
}}
- {command {Remove all} {} 0 "rightPanel_watch_clear" {editdelete}
+ {command "Remove all" {} 0 "rightPanel_watch_clear" {editdelete}
""}
{separator}
- {checkbutton {Autoload from code listing} {} {::RegWatches::menu_autoload} 1 0 0
+ {checkbutton "Autoload from code listing" {} {::RegWatches::menu_autoload} 1 0 0
{rightPanel_watch_toggle_autoload_flag}}
+ {checkbutton "Clear on auto-load" {} {::RegWatches::menu_autoclear} 1 0 0
+ {rightPanel_watch_toggle_autoclear_flag}}
}
## PRIVATE
private variable enabled 0 ;# Bool: enable procedures which are needless while loading project
private variable obj_idx ;# Number of this object
private variable parent ;# Widget: parent widget
- private variable gui_initialized 0 ;# Bool: GUI initialized
+ private variable regw_gui_initialized 0 ;# Bool: GUI initialized
private variable conf_button ;# Widget: Configuration button
private variable conf_menu {} ;# Configuration menu
@@ -111,6 +118,7 @@ class RegWatches {
# Bool: Autoload from LST file
private variable autoload_flag [lindex $::CONFIG(REGWATCHES_CONFIG) 0]
+ private variable autoclear_flag [lindex $::CONFIG(REGWATCHES_CONFIG) 2]
private variable watches_modified 0 ;# Bool: Register watches definition modified
private variable search_val_in_progress 0 ;# Bool: Search entry validation in porgress
private variable watch_file_name {} ;# Name of file currently loaded in register watches
@@ -128,13 +136,13 @@ class RegWatches {
## Object constructor
constructor {} {
- incr count
- set obj_idx $count
+ incr regw_count
+ set obj_idx $regw_count
}
## Object destructor
destructor {
- if {$gui_initialized} {
+ if {$regw_gui_initialized} {
# Remove status bar tips for popup menus
menu_Sbar_remove $watch_menu
@@ -151,14 +159,14 @@ class RegWatches {
public method PrepareRegWatches {_parent filename} {
set parent $_parent
set watch_file_name $filename
- set gui_initialized 0
+ set regw_gui_initialized 0
}
## Create GUI of register watches
# @return void
public method CreateRegWatchesGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$regw_gui_initialized} {return}
+ set regw_gui_initialized 1
# Top frame
set icon_bar [frame $parent.frm_rightPanel_watch_iconBar]
@@ -196,9 +204,9 @@ class RegWatches {
-style Flat.TButton \
]
pack $button -side left -padx 3
- DynamicHelp::add $button -text [mc "Save under a different filename"]
+ DynamicHelp::add $button -text [mc "Save under a different file name"]
setStatusTip -widget $button \
- -text [mc "Save under a different filename"]
+ -text [mc "Save under a different file name"]
# Separator
pack [ttk::separator $icon_bar.sep_rightPanel_watch_ib_sep0 \
-orient vertical \
@@ -248,10 +256,10 @@ class RegWatches {
# Entry "Address"
set entry [ttk::entry $tool_bar.ent_rightPanel_watch_addr \
- -textvariable RightPanel::watch_addr$count \
+ -textvariable RightPanel::watch_addr${regw_count} \
-validatecommand "$this rightPanel_watch_addr_validate %P" \
-validate key \
- -width 4 \
+ -width 5 \
]
DynamicHelp::add $entry \
-text [mc "Register address:\n 1 or 2 digits\tinternal RAM (not SFR)\n 3 digits\t\texpanded RAM\n 4 digits\t\texternal RAM\n dot and 2 digits\tBit"]
@@ -263,7 +271,7 @@ class RegWatches {
# Entry "Name"
set entry [ttk::entry $tool_bar.ent_rightPanel_watch_name \
- -textvariable RightPanel::watch_name$count \
+ -textvariable RightPanel::watch_name${regw_count} \
-validatecommand "$this rightPanel_watch_name_validate %P" \
-validate key \
-width 20 \
@@ -378,7 +386,7 @@ class RegWatches {
3 {
if {[string index $addr 0] == {.}} {
set type {B}
- } {
+ } else {
set type {E}
}
}
@@ -394,7 +402,7 @@ class RegWatches {
if {$::RegWatches::sorting_order} {
set order {-increasing}
# Decremental sorting order
- } {
+ } else {
set order {-decreasing}
}
@@ -430,6 +438,9 @@ class RegWatches {
if {!$autoload_flag} {return}
if {![file exists $filename]} {return}
+ if {$autoclear_flag} {
+ rightPanel_watch_clear 1
+ }
rightPanel_watch_import_file $filename .
}
@@ -439,10 +450,20 @@ class RegWatches {
set autoload_flag $::RegWatches::menu_autoload
}
+ ## Autoclear flag toggled (this function should be invoked from configuration menu)
+ # @return void
+ public method rightPanel_watch_toggle_autoclear_flag {} {
+ set autoclear_flag $::RegWatches::menu_autoclear
+ }
+
## Get configuration list
# @return void
public method rightPanel_watch_get_config {} {
- return [list $::RegWatches::menu_autoload $::RegWatches::sorting_order]
+ return [list \
+ $autoload_flag \
+ $::RegWatches::sorting_order \
+ $autoclear_flag \
+ ]
}
## Create configuration menu
@@ -452,7 +473,7 @@ class RegWatches {
return
}
set conf_menu $parent.conf_menu
- menuFactory $CONFMENU $conf_menu 0 "$this " 0 {}
+ menuFactory $CONFMENU $conf_menu 0 "$this " 0 {} [namespace current]
watch_disEna_buttons
}
@@ -467,22 +488,23 @@ class RegWatches {
incr y [winfo height $conf_button]
set ::RegWatches::menu_autoload $autoload_flag
+ set ::RegWatches::menu_autoclear $autoclear_flag
tk_popup $conf_menu $x $y
}
## Refresh highlighting tags
# @return void
public method rightPanel_refresh_regwatches_highlighting {} {
- if {!$gui_initialized} {return}
+ if {!$regw_gui_initialized} {return}
$this right_panel_create_highlighting_tags $watch_text $watch_text_tags -1
}
## Recreate popup menu
# @return void
public method regwatches_makePopupMenu {} {
- if {!$gui_initialized} {return}
+ if {!$regw_gui_initialized} {return}
if {[winfo exists $watch_menu]} {destroy $watch_menu}
- menuFactory $WATCHMENU $watch_menu 0 "$this " 0 {}
+ menuFactory $WATCHMENU $watch_menu 0 "$this " 0 {} [namespace current]
}
@@ -497,7 +519,7 @@ class RegWatches {
if {![string first $prj_path $watch_file_name]} {
return [string range $watch_file_name [string length $prj_path] end]
# Return absolute directory location
- } {
+ } else {
return $watch_file_name
}
}
@@ -506,7 +528,7 @@ class RegWatches {
# @parm Widget entry - Target entry widget
# @return void
private method watch_entry_shortcuts_reset {entry} {
- if {!$gui_initialized} {return}
+ if {!$regw_gui_initialized} {return}
# Unset previous configuration
foreach key $watches_set_shortcuts {
@@ -554,13 +576,13 @@ class RegWatches {
return { .00}
}
if {$string == "\n"} {
- set string [subst "\$::RightPanel::watch_addr${obj_idx}"]
+ set string [subst -nocommands "\$::RightPanel::watch_addr${obj_idx}"]
regsub {^\s+} $string {} string
}
if {[string index $string 0] == {.}} {
set string [string replace $string 0 0]
set bit_addr 1
- } {
+ } else {
set bit_addr 0
}
@@ -570,7 +592,7 @@ class RegWatches {
if {$len != 4} {
set string " $string"
}
- } {
+ } else {
if {$len == 1} {
set string "0$string"
}
@@ -580,7 +602,7 @@ class RegWatches {
# Resturn result
if {$bit_addr} {
return [string replace $string 1 1 {.}]
- } {
+ } else {
return [string toupper $string]
}
}
@@ -591,7 +613,7 @@ class RegWatches {
private method get_watchName {string} {
# Conditionaly get value from entry widget
if {$string == "\n"} {
- set string [subst "\$::RightPanel::watch_name${obj_idx}"]
+ set string [subst -nocommands "\$::RightPanel::watch_name${obj_idx}"]
regsub {\t+$} $string {} string
}
@@ -770,7 +792,7 @@ class RegWatches {
if {[string index $addr 0] == {.}} {
set addr [string replace $addr 0 0]
set bit_addr 1
- } {
+ } else {
set bit_addr 0
}
set dec_addr [expr "0x$addr"]
@@ -820,7 +842,7 @@ class RegWatches {
# AFFECT ALL ENTRIES (not only valid ones) !!!
# @return void
public method rightPanel_watch_force_enable {} {
- if {!$gui_initialized} {CreateRegWatchesGUI}
+ if {!$regw_gui_initialized} {CreateRegWatchesGUI}
set watches_enabled 1
foreach addr $watch_addrs {
@@ -832,14 +854,14 @@ class RegWatches {
# Affect only entries with valid address (implemented on current MCU)
# @return void
public method rightPanel_watch_enable {} {
- if {!$gui_initialized} {CreateRegWatchesGUI}
+ if {!$regw_gui_initialized} {CreateRegWatchesGUI}
set watches_enabled 1
foreach addr $watch_addrs {
if {[string index $addr 0] == {.}} {
set addr [string replace $addr 0 0]
set bit_addr 1
- } {
+ } else {
set bit_addr 0
}
set dec_addr [expr "0x$addr"]
@@ -848,7 +870,7 @@ class RegWatches {
# Bit
if {$bit_addr} {
if {$dec_addr > 0x7F} {
- if {![$this simulator_is_sfr_avaliable [$this getRegOfBit $dec_addr]]} {
+ if {![$this simulator_is_sfr_available [$this getRegOfBit $dec_addr]]} {
continue
}
}
@@ -880,7 +902,7 @@ class RegWatches {
## Disable all entry widgets in register watches
# @return void
public method rightPanel_watch_disable {} {
- if {!$gui_initialized} {return}
+ if {!$regw_gui_initialized} {return}
set watches_enabled 0
foreach addr $watch_addrs {
@@ -900,7 +922,7 @@ class RegWatches {
# @parm Int row - target line
# @return void
public method rightPanel_watch_switch_line {row} {
- if {!$gui_initialized} {return}
+ if {!$regw_gui_initialized} {return}
set watch_AN_valid_ena 0
# Determinate number of the last row
@@ -928,7 +950,7 @@ class RegWatches {
set ::RightPanel::watch_addr${obj_idx} {}
set watch_AN_valid_ena 1
return 0
- } {
+ } else {
set watch_curLine $row
$watch_remove_button configure -state normal
$watch_new_button configure -state normal
@@ -982,7 +1004,7 @@ class RegWatches {
set addr [get_watchAddr "\n"]
set name [get_watchName "\n"]
set no_sbar 0
- } {
+ } else {
set addr [get_watchAddr $addr]
set name [get_watchName $name]
set no_sbar 1
@@ -1061,7 +1083,7 @@ class RegWatches {
private method watch_create_entry {addr row var} {
if {[string index $addr 0] == {.}} {
set width 1
- } {
+ } else {
set width 2
}
@@ -1096,7 +1118,7 @@ class RegWatches {
## Clear highlight for all registers
# @return void
public method rightPanel_watch_clear_highlight {} {
- if {!$gui_initialized} {return}
+ if {!$regw_gui_initialized} {return}
foreach addr $watch_addrs {
$watch_text.[lindex $watch_data($addr) 1] configure -fg ${Simulator::normal_color}
@@ -1106,7 +1128,7 @@ class RegWatches {
## Clear highlight for the given register
# @return void
public method rightPanel_watch_unhighlight {addr} {
- if {!$gui_initialized} {return}
+ if {!$regw_gui_initialized} {return}
if {[lsearch $watch_addrs $addr] == -1} {
return
@@ -1187,7 +1209,7 @@ class RegWatches {
set addr_tag {tag_Baddr}
} elseif {$len == 3} {
set addr_tag {tag_Eaddr}
- } {
+ } else {
set addr_tag {tag_addr}
}
# Restore text tags
@@ -1277,18 +1299,20 @@ class RegWatches {
public method rightPanel_watch_remove {} {
# Determinate register address
set addr [lindex $watch_addrs [expr {$watch_curLine - 1}]]
- # Destroy value entry
- set var [lindex $watch_data($addr) 1]
- destroy $watch_text.$var
- # Unregister watch
- unset watch_data($addr)
- set idx [lsearch $watch_addrs $addr]
- set watch_addrs [lreplace $watch_addrs $idx $idx]
+ if {$addr != {}} {
+ # Destroy value entry
+ set var [lindex $watch_data($addr) 1]
+ destroy $watch_text.$var
+ # Unregister watch
+ unset watch_data($addr)
+ set idx [lsearch $watch_addrs $addr]
+ set watch_addrs [lreplace $watch_addrs $idx $idx]
- # Remove watch from the text widget
- $watch_text configure -state normal
- $watch_text delete $watch_curLine.0 "$watch_curLine.0 + 1 line"
- $watch_text configure -state disabled
+ # Remove watch from the text widget
+ $watch_text configure -state normal
+ $watch_text delete $watch_curLine.0 "$watch_curLine.0 + 1 line"
+ $watch_text configure -state disabled
+ }
# Change current line
if {$watch_curLine > [llength $watch_addrs]} {
@@ -1296,6 +1320,8 @@ class RegWatches {
}
if {$watch_curLine} {
rightPanel_watch_switch_line $watch_curLine
+ } else {
+ rightPanel_watch_switch_line 1
}
# Reevaluate button states
@@ -1308,33 +1334,28 @@ class RegWatches {
## Save watches definition to a file
# @parm String filename - Target filename or an empty string
- # @parm Bool force = 0 - Do not ask for overwrite
+ # @parm Bool force=0 - Do not ask for overwrite
# @return void
- public method rightPanel_watch_save args {
- if {!$gui_initialized} {CreateRegWatchesGUI}
+ public method rightPanel_watch_save {filename {force 0}} {
+ if {!$regw_gui_initialized} {CreateRegWatchesGUI}
- set filename [lindex $args 0]
- set force [lindex $args 1]
if {$filename != {}} {
set watch_file_name $filename
}
- if {$force != {1}} {
- set force 0
- }
# If no filename specified -> invoke dislog "Save as"
if {$watch_file_name == {}} {
rightPanel_watch_saveas
# Save file
- } {
+ } else {
# Set new filename
if {!$::MICROSOFT_WINDOWS} { ;# POSIX way
if {![regexp "^(~|/)" $watch_file_name]} {
set filename "[$this cget -ProjectDir]/$watch_file_name"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $watch_file_name]} {
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $watch_file_name]} {
set filename [file join [$this cget -ProjectDir] $watch_file_name]
}
}
@@ -1354,7 +1375,7 @@ class RegWatches {
-title [mc "Overwrite file"] \
-message [mc "A file name '%s' already exists. Are you sure you want to overwrite it ?" [file tail $watch_file_name]]
] != {yes}
- } {
+ } then {
return
}
# Create a backup file
@@ -1363,11 +1384,11 @@ class RegWatches {
}
}
if {[catch {
- set file [open $watch_file_name w 420]
- }]} {
+ set file [open $watch_file_name w 0640]
+ }]} then {
if {[winfo exists .fsd]} {
set parent .fsd
- } {
+ } else {
set parent .
}
tk_messageBox -type ok \
@@ -1379,7 +1400,6 @@ class RegWatches {
# Write file header
puts $file "# Watches definition file -- ${::APPNAME}"
- puts $file "# Date: [clock format [clock seconds] -format {%D}]"
# Write watches definition
puts -nonewline $file [regsub -all -line {\s+$} [$watch_text get 1.0 end] {}]
@@ -1404,10 +1424,10 @@ class RegWatches {
KIFSD::FSD ::fsd \
-title [mc "Save watches - MCU 8051 IDE"] \
-directory [$this cget -ProjectDir] \
- -defaultmask 0 -multiple 0 -filetypes {
- {{MCU 8051 IDE watch definition} {*.wtc} }
- {{All files} {*} }
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "MCU 8051 IDE watches definition"] {*.wtc}] \
+ [list [mc "All files"] {*}] \
+ ]
# Save file after press of OK button
::fsd setokcmd {
set ::filename [::fsd get]
@@ -1421,19 +1441,19 @@ class RegWatches {
## Open and process watches definition file
# @parm String filename - name of source file
- # @parm Widget parent - GUI parent (for error dialogs)
+ # @parm Widget parent - GUI parent (for error dialogues)
# @parm Bool clear - Clear watches before loading
# @return Bool - result
public method rightPanel_watch_openfile {filename parent clear} {
- if {!$gui_initialized} {CreateRegWatchesGUI}
+ if {!$regw_gui_initialized} {CreateRegWatchesGUI}
# Normalize filename
if {!$::MICROSOFT_WINDOWS} { ;# POSIX way
if {![regexp "^(~|/)" $filename]} {
set filename "[$this cget -projectPath]/$filename"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $filename]} {
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $filename]} {
set filename [file join [$this cget -projectPath] $filename]
}
}
@@ -1446,7 +1466,10 @@ class RegWatches {
if {[catch {
set file [open $filename r]
}]} then {
- tk_messageBox -parent $parent -icon warning -type ok \
+ tk_messageBox \
+ -parent $parent \
+ -icon warning \
+ -type ok \
-title [mc "File access error"] \
-message [mc "Unable to read file '%s'" $filename]
set watch_file_name {}
@@ -1471,11 +1494,11 @@ class RegWatches {
![regexp {^\s*\.?[A-Fa-f0-9]+$} $addr] ||
[string length $addr] > 4 ||
[string length $name] > 23
- } {
+ } then {
tk_messageBox \
-title [mc "Corrupted file"] \
-icon error -type ok -parent $parent \
- -message [mc "file: %s is eighter corrupted or it is not a file in expected format." $filename]
+ -message [mc "file: %s is either corrupted or it is not a file in expected format." $filename]
return 0
}
}
@@ -1524,16 +1547,16 @@ class RegWatches {
KIFSD::FSD ::fsd \
-title [mc "Load watches from file - MCU 8051 IDE"] \
-directory [$this cget -ProjectDir] -autoclose 0 \
- -defaultmask 0 -multiple 0 -filetypes {
- {{MCU 8051 IDE watches definition} {*.wtc} }
- {{All files} {*} }
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "MCU 8051 IDE watches definition"] {*.wtc}] \
+ [list [mc "All files"] {*}] \
+ ]
# Open file after press of OK button
fsd setokcmd {
# Get chosen file name
set filename [::fsd get]
- if {[${X::actualProject} rightPanel_watch_openfile $filename [::fsd get_window_name] 1]} {
+ if {[${::X::actualProject} rightPanel_watch_openfile $filename [::fsd get_window_name] 1]} {
::fsd deactivate
delete object fsd
}
@@ -1550,17 +1573,17 @@ class RegWatches {
KIFSD::FSD ::fsd \
-title [mc "Import file - MCU 8051 IDE"] \
-directory [$this cget -ProjectDir] -autoclose 0 \
- -defaultmask 0 -multiple 0 -filetypes {
- {{Code listing} {*.lst} }
- {{MCU 8051 IDE watches definition} {*.wtc} }
- {{All files} {*} }
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "Code listing"] {*.lst}] \
+ [list [mc "MCU 8051 IDE watches definition"] {*.wtc}] \
+ [list [mc "All files"] {*}] \
+ ]
# Open file after press of OK button
fsd setokcmd {
# Get chosen file name
set filename [::fsd get]
- if {[${X::actualProject} rightPanel_watch_import_file $filename [::fsd get_window_name]]} {
+ if {[${::X::actualProject} rightPanel_watch_import_file $filename [::fsd get_window_name]]} {
::fsd deactivate
delete object fsd
}
@@ -1572,15 +1595,15 @@ class RegWatches {
## Import file
# @parm String filename - Name of source file (*.lst or *.wtc)
- # @parm Widget parent - GUI parent (for error dialogs)
+ # @parm Widget parent - GUI parent (for error dialogues)
# @return Bool - result
public method rightPanel_watch_import_file {filename parent} {
- if {!$gui_initialized} {CreateRegWatchesGUI}
+ if {!$regw_gui_initialized} {CreateRegWatchesGUI}
# Determinate file type
set filename [file normalize [file join [$this cget -ProjectDir] $filename]]
set file_type 0
- switch -- [file extension $filename] {
+ switch -nocase -- [file extension $filename] {
{.wtc} { ;# Watches definition file
set file_type 1
}
@@ -1624,7 +1647,7 @@ class RegWatches {
# Try to open file
if {[catch {
set file [open $filename r]
- }]} {
+ }]} then {
tk_messageBox \
-parent . \
-type ok \
@@ -1757,16 +1780,10 @@ class RegWatches {
}
## Remove all register watches
- # Bool force = 0 - Don't ask user for comfirmation
+ # Bool force=0 - Don't ask for user comfirmation
# @return void
- public method rightPanel_watch_clear args {
- if {!$gui_initialized} {CreateRegWatchesGUI}
-
- # Parse arguments
- set force [lindex $args 0]
- if {$force == {}} {
- set force 0
- }
+ public method rightPanel_watch_clear {{force 0}} {
+ if {!$regw_gui_initialized} {CreateRegWatchesGUI}
# Ask user for comfirmation
if {!$force} {
@@ -1819,7 +1836,7 @@ class RegWatches {
# Enable/Disable button "Clear search entry"
if {$content == {}} {
$watch_search_clear configure -state disabled
- } {
+ } else {
$watch_search_clear configure -state normal
}
@@ -1858,7 +1875,7 @@ class RegWatches {
## Syncronize all register watches
# @return void
public method rightPanel_watch_sync_all {} {
- if {!$gui_initialized} {CreateRegWatchesGUI}
+ if {!$regw_gui_initialized} {CreateRegWatchesGUI}
# Iterate over addresses
foreach addr $watch_addrs {
@@ -1881,7 +1898,7 @@ class RegWatches {
return {--}
}
set bit_addr 1
- } {
+ } else {
set bit_addr 0
}
set len [string length $addr]
@@ -1891,10 +1908,10 @@ class RegWatches {
# Bit
if {$bit_addr} {
if {$addr_dec > 0x7F} {
- if {[$this simulator_is_sfr_avaliable [$this getRegOfBit $addr_dec]]} {
+ if {[$this simulator_is_sfr_available [$this getRegOfBit $addr_dec]]} {
set val [$this getBit $addr_dec]
}
- } {
+ } else {
set val [$this getBit $addr_dec]
}
@@ -1929,6 +1946,7 @@ class RegWatches {
# @parm Int dec_addr - SFR register address
# @return void
public method rightPanel_watch_sync_sfr {dec_addr} {
+
if {$validator_engaged} {
return
}
@@ -1947,12 +1965,12 @@ class RegWatches {
# @return Bool - result
public method rightPanel_watch_sync {addr} {
if {$validator_engaged} {return 1}
- if {!$gui_initialized} {CreateRegWatchesGUI}
+ if {!$regw_gui_initialized} {CreateRegWatchesGUI}
# Detect bit address
if {[string index $addr 0] == {.}} {
set bit_addr 1
- } {
+ } else {
set bit_addr 0
}
@@ -1961,6 +1979,7 @@ class RegWatches {
# Synchronize bits in the given register
if {!$validator_engaged && [string length $addr] == 2} {
+
set dec_addr [expr "0x$addr"]
if {$dec_addr >= 0x20 && $dec_addr <= 0x2F} {
@@ -1971,6 +1990,7 @@ class RegWatches {
if {[string length $hex_addr] == 1} {
set hex_addr "0$hex_addr"
}
+
rightPanel_watch_sync .$hex_addr
incr dec_addr
}
@@ -2014,11 +2034,11 @@ class RegWatches {
## Enable/Disable buttons on watches icon bar
# @return void
private method watch_disEna_buttons {} {
- if {!$gui_initialized} {return}
+ if {!$regw_gui_initialized} {return}
if {[$watch_text index end] == {2.0}} {
set state {disabled}
- } {
+ } else {
set state {normal}
}
@@ -2047,10 +2067,10 @@ class RegWatches {
## Enable/Disable menu items
# If address entry is not empty -> disable all
- set addr [subst "\$::RightPanel::watch_addr${obj_idx}"]
+ set addr [subst -nocommands "\$::RightPanel::watch_addr${obj_idx}"]
if {$addr != {}} {
set end [$watch_text index end]
- } {
+ } else {
set end {2.0}
}
# Empty list
@@ -2102,7 +2122,7 @@ class RegWatches {
## Create bindings for defined key shortcuts -- register watches
# @return void
public method rightPanel_watch_shortcuts_reevaluate {} {
- if {!$gui_initialized} {return}
+ if {!$regw_gui_initialized} {return}
foreach addr $watch_addrs {
watch_entry_shortcuts_reset watch_text.[lindex $watch_data($addr) 1]
}
@@ -2116,5 +2136,10 @@ class RegWatches {
}
}
-set ::RegWatches::menu_autoload [lindex $::CONFIG(REGWATCHES_CONFIG) 0]
-set ::RegWatches::sorting_order [lindex $::CONFIG(REGWATCHES_CONFIG) 1]
+set ::RegWatches::menu_autoload [lindex $::CONFIG(REGWATCHES_CONFIG) 0]
+set ::RegWatches::sorting_order [lindex $::CONFIG(REGWATCHES_CONFIG) 1]
+set ::RegWatches::menu_autoclear [lindex $::CONFIG(REGWATCHES_CONFIG) 2]
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/rightpanel/rightpanel.tcl b/lib/rightpanel/rightpanel.tcl
index 061f1f5..81bbb37 100755..100644
--- a/lib/rightpanel/rightpanel.tcl
+++ b/lib/rightpanel/rightpanel.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 _RIGHTPANEL_TCL ] } {
+set _RIGHTPANEL_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements Right Panel
@@ -42,8 +47,6 @@ class RightPanel {
inherit RegWatches InstructionDetails SubPrograms HwManager
## COMMON
- # Conter of instances
- common count 0
# Background color for selected rows -- light
common selection_color {#EEFFDD}
# Background color for selected rows -- dark
@@ -60,9 +63,9 @@ class RightPanel {
{button_cancel} "Add/Remove editor bookmark to/from current line"}
{separator}
{command {Previous} {} 0 "rightPanel_bm_up" {1uparrow}
- "Goto previous bookmark"}
+ "Go to previous bookmark"}
{command {Next} {} 0 "rightPanel_bm_up" {1downarrow}
- "Goto next bookmark"}
+ "Go to next bookmark"}
{separator}
{command {Remove all} {} 0 "editor_procedure {} clear_all_bookmarks {}"
{editdelete} "Remove all bookmarks from the editor"}
@@ -73,9 +76,9 @@ class RightPanel {
{button_cancel} "Add/Remove editor breakpoint to/from current line"}
{separator}
{command {Previous} {} 0 "rightPanel_bp_up" {1uparrow}
- "Goto previous breakpoint"}
+ "Go to previous breakpoint"}
{command {Next} {} 0 "rightPanel_bp_up" {1downarrow}
- "Goto next breakpoint"}
+ "Go to next breakpoint"}
{separator}
{command {Remove all} {} 0 "editor_procedure {} clear_all_breakpoints {}"
{editdelete} "Remove all breakpoints from the editor"}
@@ -95,8 +98,8 @@ class RightPanel {
private variable table_of_symbols ;# ID of tab "Table of symbols"
private variable obj_idx ;# Number of this object
- private variable bookmarks_menu ;# ID of popup menu for "Bookmarks"
- private variable breakpoints_menu ;# ID of popup menu for "Breakpoints"
+ private variable bookmarks_menu {} ;# ID of popup menu for "Bookmarks"
+ private variable breakpoints_menu {} ;# ID of popup menu for "Breakpoints"
private variable symbols_menu ;# ID of popup menu for "Symbol list"
private variable bm_pagesManager ;# ID of pages manager for tab "Bookmarks"
@@ -148,8 +151,6 @@ class RightPanel {
## Object constructor
constructor {} {
- incr count
- set obj_idx $count
}
## Object destructor
@@ -167,7 +168,7 @@ class RightPanel {
# @parm Widget ParentPane - parent paned window
# @parm String watches_file - definition file for register watches
# @return void
- public method Initialize_rightPanel {notebookframe ParentPane watches_file} {
+ public method initialize_rightPanel {notebookframe ParentPane watches_file} {
# Object variables
set parentPane $ParentPane ;# Parent container (some frame)
@@ -175,10 +176,7 @@ class RightPanel {
set notebook_frame $notebookframe
## Create NoteBook
- set notebook [NoteBook $notebook_frame.ntb_rightPanel \
- -side top -bg {#EEEEEE} \
- -arcradius 4 \
- ]
+ set notebook [ModernNoteBook $notebook_frame.ntb_rightPanel]
# Register notebook status bar tips
notebook_Sbar_set {rightpanel} [list \
@@ -200,57 +198,57 @@ class RightPanel {
if {!${::Editor::editor_to_use}} {
# Tab "Bookmarks"
- set bookmarks [$notebook insert end [mc "Bookmarks"] \
- -image ::ICONS::16::bookmark_toolbar \
- -raisecmd "$this rightPanel_set_active_page Bookmarks" \
- -helptext [mc "List of bookmarks in editor (Ctrl+6)"] \
+ set bookmarks [$notebook insert end {Bookmarks} \
+ -image ::ICONS::16::bookmark_toolbar \
+ -raisecmd [list $this rightPanel_set_active_page Bookmarks] \
+ -helptext [mc "List of bookmarks in editor (Ctrl+6)"] \
]
# Tab "Breakpoints"
- set breakpoints [$notebook insert end [mc "Breakpoints"] \
+ set breakpoints [$notebook insert end {Breakpoints} \
-image ::ICONS::16::flag \
- -raisecmd "$this rightPanel_set_active_page Breakpoints" \
+ -raisecmd [list $this rightPanel_set_active_page Breakpoints] \
-helptext [mc "List of breakpoints in editor (Ctrl+7)"] \
]
# Tab "Symbols"
- set table_of_symbols [$notebook insert end [mc "Symbols"] \
- -image ::ICONS::16::_blockdevice \
- -raisecmd "$this rightPanel_set_active_page Symbols" \
- -helptext [mc "Symbol List"] \
+ set table_of_symbols [$notebook insert end {Symbols} \
+ -image ::ICONS::16::_blockdevice \
+ -raisecmd [list $this rightPanel_set_active_page Symbols] \
+ -helptext [mc "Symbol List"] \
]
# Tab "Instruction"
- set instruction [$notebook insert end [mc "Instruction"] \
- -image ::ICONS::16::info \
- -raisecmd "$this rightPanel_set_active_page Instruction" \
- -helptext [mc "Instruction details (Ctrl+8)"] \
- -createcmd [list $this CreateInstructionDetailsGUI] \
+ set instruction [$notebook insert end {Instruction} \
+ -image ::ICONS::16::info \
+ -raisecmd [list $this rightPanel_set_active_page Instruction] \
+ -helptext [mc "Instruction details (Ctrl+8)"] \
+ -createcmd [list $this CreateInstructionDetailsGUI] \
]
}
# Tab "Watches"
- set watches [$notebook insert end [mc "Watches"] \
- -image ::ICONS::16::player_playlist \
- -raisecmd "$this rightPanel_set_active_page Watches" \
- -helptext [mc "Register watches (Ctrl+9)"] \
- -createcmd [list $this CreateRegWatchesGUI] \
+ set watches [$notebook insert end {Watches} \
+ -image ::ICONS::16::player_playlist \
+ -raisecmd [list $this rightPanel_set_active_page Watches] \
+ -helptext [mc "Register watches (Ctrl+9)"] \
+ -createcmd [list $this CreateRegWatchesGUI] \
]
# Tab "Subprograms"
- set subprograms [$notebook insert end [mc "Subprograms"] \
- -image ::ICONS::16::queue \
- -raisecmd "$this rightPanel_set_active_page Subprograms"\
- -helptext [mc "Active subprograms (Ctrl+0)"] \
- -createcmd [list $this CreateSubProgramsGUI] \
+ set subprograms [$notebook insert end {Subprograms} \
+ -image ::ICONS::16::queue \
+ -raisecmd [list $this rightPanel_set_active_page Subprograms] \
+ -helptext [mc "Active subprograms (Ctrl+0)"] \
+ -createcmd [list $this CreateSubProgramsGUI] \
]
# Tab "Hardware manager"
- set hwmanager [$notebook insert end [mc "Hardware"] \
- -image ::ICONS::16::kcmpci \
- -raisecmd "$this rightPanel_set_active_page Hardware" \
- -helptext [mc "Hardware manager"] \
- -createcmd [list $this CreateHwManagerGUI] \
+ set hwmanager [$notebook insert end {Hardware} \
+ -image ::ICONS::16::kcmpci \
+ -raisecmd [list $this rightPanel_set_active_page Hardware] \
+ -helptext [mc "Hardware manager"] \
+ -createcmd [list $this CreateHwManagerGUI] \
]
# Tab "Hide"
- $notebook insert end [mc "Hide"] \
- -image ::ICONS::16::2rightarrow \
- -raisecmd "$this right_panel_show_hide" \
+ $notebook insert end {Hide} \
+ -image ::ICONS::16::2rightarrow \
+ -raisecmd [list $this right_panel_show_hide] \
-helptext [mc "Hide the panel"]
# Prepare panel componenets but do not create GUI elements
@@ -262,7 +260,6 @@ class RightPanel {
PrepareInstructionDetails $instruction
}
-
## Create Button bar
# Button "Show"
set button_bar [frame $notebook_frame.button_bar]
@@ -347,15 +344,15 @@ class RightPanel {
if {!${::Editor::editor_to_use}} {
# Pack pages managers
- set bm_pagesManager [PagesManager $bookmarks.pgm_rightPanel_bm -background {#eeeeee}]
+ set bm_pagesManager [PagesManager $bookmarks.pgm_rightPanel_bm -background ${::COMMON_BG_COLOR}]
pack $bm_pagesManager -expand 1 -fill both
$bm_pagesManager compute_size
- set bp_pagesManager [PagesManager $breakpoints.pgm_rightPanel_pm -background {#eeeeee}]
+ set bp_pagesManager [PagesManager $breakpoints.pgm_rightPanel_pm -background ${::COMMON_BG_COLOR}]
pack $bp_pagesManager -expand 1 -fill both
$bp_pagesManager compute_size
- set sm_pagesManager [PagesManager $table_of_symbols.sm_pagesManager -background {#eeeeee}]
+ set sm_pagesManager [PagesManager $table_of_symbols.sm_pagesManager -background ${::COMMON_BG_COLOR}]
pack $sm_pagesManager -expand 1 -fill both
$sm_pagesManager compute_size
@@ -363,9 +360,9 @@ class RightPanel {
set bookmarks_menu $notebook_frame.menu_rightPanel_bookmarks
set breakpoints_menu $notebook_frame.menu_rightPanel_breakpoints
set symbols_menu $notebook_frame.menu_rightPanel_symbols
- menuFactory $BREAKPOINTMENU $breakpoints_menu 0 "$this " 0 {}
- menuFactory $BOOKMARKMENU $bookmarks_menu 0 "$this " 0 {}
- menuFactory $SYMBOLSKMENU $symbols_menu 0 "$this " 0 {}
+ menuFactory $BREAKPOINTMENU $breakpoints_menu 0 "$this " 0 {} [namespace current]
+ menuFactory $BOOKMARKMENU $bookmarks_menu 0 "$this " 0 {} [namespace current]
+ menuFactory $SYMBOLSKMENU $symbols_menu 0 "$this " 0 {} [namespace current]
}
@@ -379,7 +376,7 @@ class RightPanel {
if {$PanelVisible} {
# Show NoteBook
$parentPane paneconfigure $notebook_frame -minsize 295
- pack $notebook -expand 1 -fill both
+ pack [$notebook get_nb] -expand 1 -fill both -padx 5 -pady 5
$parentPane configure -sashwidth 2
if {[catch {
@@ -387,15 +384,15 @@ class RightPanel {
if {
${::Editor::editor_to_use} &&
([lsearch {Bookmarks Breakpoints Instruction Symbols} $active_page] != -1)
- } {
+ } then {
set active_page {Watches}
$notebook raise {Watches}
}
- }]} {
+ }]} then {
set active_page {Watches}
$notebook raise {Watches}
}
- } {
+ } else {
# Show button bar
$parentPane paneconfigure $notebook_frame -minsize 0
pack $button_bar -anchor nw
@@ -413,7 +410,7 @@ class RightPanel {
# @return void
public method rightPanel_scroll args {
# Local variables
- set what [lindex $args 0]
+ set what [lindex $args 0] ;# m == Bookmarks; p == Breakpoints; s == Symbols
set cmd [lindex $args 1] ;# Scroll command (moveto, scroll and such)
set frac [lindex $args 2] ;# Fraction where to move
set units [lindex $args 3] ;# Units (optonal)
@@ -436,7 +433,7 @@ class RightPanel {
if {$units == {}} {
$lnb yview $cmd $frac
$txt yview $cmd $frac
- } {
+ } else {
$lnb yview $cmd $frac $units
$txt yview $cmd $frac $units
}
@@ -470,7 +467,7 @@ class RightPanel {
if {[winfo ismapped $scrollbar]} {
pack forget $scrollbar
}
- } {
+ } else {
if {![winfo ismapped $scrollbar]} {
pack $scrollbar -side right -fill y -after $txt
}
@@ -490,11 +487,11 @@ class RightPanel {
public method rightPanel_refresh_font_settings {for_all} {
if {${::Editor::editor_to_use}} {return}
if {$for_all} {
- foreach widget $LIST_bookmarks_lineNumbers {
+ foreach widget $LIST_bookmarks_lineNumbers {
$widget configure -font ${Editor::defaultFont_bold}
}
- foreach widget $LIST_breakpoints_lineNumbers {
+ foreach widget $LIST_breakpoints_lineNumbers {
$widget configure -font ${Editor::defaultFont_bold}
}
@@ -527,7 +524,7 @@ class RightPanel {
}
incr i
}
- } {
+ } else {
$bookmarks_lineNumbers configure -font ${Editor::defaultFont_bold}
$bookmarks_text configure -font ${Editor::defaultFont_bold}
$breakpoints_lineNumbers configure -font ${Editor::defaultFont_bold}
@@ -574,7 +571,7 @@ class RightPanel {
# @return void
private method create_tags_in_symbol_list {} {
set tags_to_define [list tag_label tag_constant tag_normal tag_macro]
- foreach tag_def [concat ${::ASMsyntaxHighlight::hightlight_tags} ${::CsyntaxHighlight::hightlight_tags}] {
+ foreach tag_def [concat ${::ASMsyntaxHighlight::highlight_tags} ${::CsyntaxHighlight::highlight_tags}] {
if {[lsearch -ascii -exact $tags_to_define [lindex $tag_def 0]] == -1} {
continue
}
@@ -591,13 +588,13 @@ class RightPanel {
# Fonr slant
if {$tag_def_item(3) == 1} {
set tag_def_item(3) italic
- } {
+ } else {
set tag_def_item(3) roman
}
# Font weight
if {$tag_def_item(4) == 1} {
set tag_def_item(4) bold
- } {
+ } else {
set tag_def_item(4) normal
}
@@ -667,7 +664,7 @@ class RightPanel {
pack $bm_up_button -side left
DynamicHelp::add $bm_up_button -text [mc "Move to previous bookmark"]
setStatusTip -widget $bm_up_button \
- -text [mc "Goto to line of previous bookmark"]
+ -text [mc "Go to to line of previous bookmark"]
# Button "Down"
set bm_down_button [ttk::button $button_frame.but_rightPanel_bm_down \
-image ::ICONS::16::1downarrow \
@@ -678,7 +675,7 @@ class RightPanel {
pack $bm_down_button -side left
DynamicHelp::add $bm_down_button -text [mc "Move to the next bookmark"]
setStatusTip -widget $bm_down_button \
- -text [mc "Goto to line of next bookmark"]
+ -text [mc "Go to to line of next bookmark"]
# Separator
pack [ttk::separator $button_frame.but_rightPanel_bm_sep \
-orient vertical \
@@ -773,7 +770,7 @@ class RightPanel {
pack $bp_up_button -side left
DynamicHelp::add $bp_up_button -text [mc "Move to previous breakpoint"]
setStatusTip -widget $bp_up_button \
- -text [mc "Goto to line of previous breakpoint"]
+ -text [mc "Go to to line of previous breakpoint"]
# Button "Down"
set bp_down_button [ttk::button $button_frame.but_rightPanel_bp_down \
-image ::ICONS::16::1downarrow \
@@ -784,7 +781,7 @@ class RightPanel {
pack $bp_down_button -side left
DynamicHelp::add $bp_down_button -text [mc "Move to next breakpoint"]
setStatusTip -widget $bp_down_button \
- -text [mc "Goto to line of next breakpoint"]
+ -text [mc "Go to to line of next breakpoint"]
# Separator
pack [ttk::separator $button_frame.but_rightPanel_bp_sep \
-orient vertical \
@@ -1021,8 +1018,8 @@ class RightPanel {
if {[winfo exists $breakpoints_menu]} {destroy $breakpoints_menu}
if {[winfo exists $bookmarks_menu]} {destroy $bookmarks_menu}
- menuFactory $BREAKPOINTMENU $breakpoints_menu 0 "$this " 0 {}
- menuFactory $BOOKMARKMENU $bookmarks_menu 0 "$this " 0 {}
+ menuFactory $BREAKPOINTMENU $breakpoints_menu 0 "$this " 0 {} [namespace current]
+ menuFactory $BOOKMARKMENU $bookmarks_menu 0 "$this " 0 {} [namespace current]
}
## Invoke bookmarks popup menu
@@ -1208,7 +1205,7 @@ class RightPanel {
# Change current line in the editor
set block_select 1
$this editor_procedure {} goto $lineNum
- update idle
+ update idletasks
set block_select 0
return 1
@@ -1236,8 +1233,32 @@ class RightPanel {
return $lineNum
}
+ ## If the given line contain symbol declaration then select it in the list
+ # This function should be called after change on the line in the editor
+ # @parm Int lineNum - line number
+ # @return Bool - result
+ public method rightPanel_sm_select {lineNum} {
+ if {!$enabled || $block_select} {return}
+ if {![info exists sm_text]} {return}
+
+ # Unset selection in the list
+ $sm_text tag remove curLine 1.0 end
+
+ # Check for bookmark presence
+ set idx0 [lsearch -ascii -exact [$sm_lineNumbers get 1.0 end] $lineNum]
+ if {$idx0 == -1} {return 0}
+
+ # Select the line
+ incr idx0
+ set idx1 $idx0
+ incr idx1
+ $sm_text tag add curLine $idx0.0 $idx1.0
+ $sm_text see $idx0.0
+ return 1
+ }
+
## If the given line contain bookmark then select it in the list
- # This function should be called after change line in the editor
+ # This function should be called after change on the line in the editor
# @parm Int lineNum - line number
# @return Bool - result
public method rightPanel_bm_select {lineNum} {
@@ -1259,7 +1280,7 @@ class RightPanel {
}
## If the given line contain bookmark then select it in the list
- # This function should be called after change line in the editor
+ # This function should be called after change on the line in the editor
# @parm Int lineNum - line number
# @return Bool - result
public method rightPanel_bp_select {lineNum} {
@@ -1267,7 +1288,7 @@ class RightPanel {
if {![info exists breakpoints_text]} {return}
# Check for bookmark presence
- set idx0 [lsearch [$breakpoints_lineNumbers get 1.0 end] $lineNum]
+ set idx0 [lsearch -ascii -exact [$breakpoints_lineNumbers get 1.0 end] $lineNum]
if {$idx0 == -1} {return 0}
# Select the line
@@ -1316,7 +1337,7 @@ class RightPanel {
if {$idx == {end}} {
set row [$target_widget index end]
set row [expr {int($row) - 2}]
- } {
+ } else {
set row [expr {int($idx)}]
}
# Iterate over source text tags and add them to target widget
@@ -1363,7 +1384,7 @@ class RightPanel {
if {$idx == -1} {
set idx {end}
- } {
+ } else {
append idx {.0}
}
@@ -1439,7 +1460,7 @@ class RightPanel {
if {$idx == -1} {
set idx {end}
- } {
+ } else {
append idx {.0}
}
@@ -1690,7 +1711,7 @@ class RightPanel {
if {$start_idx == {}} {
if {[lindex $lineNumbers end] != $end_line} {
return
- } {
+ } else {
set start_idx 1.0
}
}
@@ -1764,7 +1785,7 @@ class RightPanel {
if {$start_idx == {}} {
if {[lindex $lineNumbers end] != $end_line} {
return
- } {
+ } else {
set start_idx 1.0
}
}
@@ -1842,7 +1863,7 @@ class RightPanel {
return 1
# Not empty string
- } {
+ } else {
$clr_b configure -state normal
}
@@ -1850,15 +1871,16 @@ class RightPanel {
set content [string toupper $content]
set e [expr {int([$sm_text index insert])}]
for {set i 1} {$i < $e} {incr i} {
- if {![string first $content [string toupper [$sm_text get $i.0 [list $i.0 lineend]]]]} {
+ if {![string first $content [string toupper [$sm_text get $i.2 [list $i.0 lineend]]]]} {
$widget configure -style StringFound.TEntry
$sm_text tag remove curLine 1.0 end
- $sm_text tag add curLine [list $i.0 linestart] [list $i.0+1l linestart]
+ $sm_text tag add curLine $i.0 [list $i.0+1l linestart]
+ $sm_text see $i.0
set block_select 1
- $this editor_procedure {} goto $i
- update idle
+ $this editor_procedure {} goto [$sm_lineNumbers get $i.0 [list $i.0 lineend]]
+ update idletasks
set block_select 0
set search_val_in_progress 0
return 1
@@ -1880,7 +1902,15 @@ class RightPanel {
# 3 - Macro
# @parm Bool add__remove - 1 == Add; 0 == Remove
# @return void
- public method rightPanel_adjust_symbol_list {lineNum symbol_name symbol_type add__remove} {
+ public method rightPanel_adjust_symbol_list {lineNum symbol_name symbol_type add__remove {editor_object {}}} {
+ if {[$this is_splitted] && $editor_object != {}} {
+ set idx [lsearch -ascii -exact [$this cget -editors] $editor_object]
+
+ if {$idx != $current_editor_idx} {
+ rightPanel_switch_editor_vars $idx
+ }
+ }
+
$sm_lineNumbers configure -state normal
$sm_text configure -state normal
@@ -1900,47 +1930,59 @@ class RightPanel {
if {$idx == -1} {
set idx [$sm_text index {end-1l}]
- } {
+ } else {
append idx {.0}
}
- $sm_lineNumbers insert $idx "$lineNum\n"
- $sm_text insert $idx "$symbol_name\n"
-
switch -- $symbol_type {
0 { ;# Label
set tag {tag_label}
+ set icon {symbol1}
}
1 { ;# Constant
set tag {tag_constant}
+ set icon {symbol3}
}
2 { ;# C variable
set tag {tag_normal}
+ set icon {symbol4}
}
3 { ;# Macro
set tag {tag_macro}
+ set icon {symbol2}
}
7 { ;# C function
set tag {tag_c_func}
+ set icon {symbol0}
}
default {
set tag {}
+ set icon {symbol5}
}
}
+ $sm_lineNumbers insert $idx "$lineNum\n"
+
+ if {${::Editor::defaultCharHeight} < 16} {
+ $sm_text insert ${idx} { }
+ } else {
+ $sm_text image create $idx -image ::ICONS::16::$icon
+ }
+ $sm_text insert ${idx}+1c " $symbol_name\n"
+
if {$tag != {}} {
$sm_text tag add $tag $idx [list $idx lineend]
}
# Remove symbol
- } {
+ } else {
if {$lineNum == {all}} {
set idx [list]
set e [expr {int([$sm_lineNumbers index end]) - 1}]
for {set i 0} {$i < $e} {incr i} {
lappend idx $i
}
- } {
+ } else {
set idx [lsearch -all [$sm_lineNumbers get 1.0 end] $lineNum]
}
@@ -1949,7 +1991,7 @@ class RightPanel {
}
foreach i $idx {
incr i
- if {[string equal [$sm_text get $i.0 [list $i.0 lineend]] $symbol_name]} {
+ if {[string equal [$sm_text get $i.2 [list $i.0 lineend]] $symbol_name]} {
$sm_text delete $i.0 $i.0+1l
$sm_lineNumbers delete $i.0 $i.0+1l
break
@@ -2080,7 +2122,7 @@ class RightPanel {
# This function takes any list of arguments
# @return void
public method rightPanel_configure args {
- ::configDialogs::rightPanel::mkDialog $args
+ ::configDialogues::rightPanel::mkDialog $args
}
## Return true if this panel is in visible state
@@ -2092,7 +2134,7 @@ class RightPanel {
public method getRightPanelSize {} {
if {$PanelVisible} {
return $PanelSize
- } {
+ } else {
return $last_PanelSize
}
}
@@ -2108,7 +2150,7 @@ class RightPanel {
if {$PanelVisible} {
$parentPane paneconfigure $notebook_frame -minsize 0
- pack forget $notebook ;# Hide notebook
+ pack forget [$notebook get_nb] ;# Hide notebook
set last_PanelSize $PanelSize ;# Save current panel width
set PanelSize 60 ;# Change panel width
right_panel_redraw_pane ;# Redraw panel
@@ -2122,7 +2164,7 @@ class RightPanel {
set PanelVisible 0
# Show the panel
- } {
+ } else {
$parentPane paneconfigure $notebook_frame -minsize 295
# Hide button bar
@@ -2131,7 +2173,7 @@ class RightPanel {
set PanelSize $last_PanelSize
right_panel_redraw_pane
$notebook raise $active_page
- pack $notebook -expand 1 -fill both
+ pack [$notebook get_nb] -expand 1 -fill both
# Show pane sash
$parentPane configure -sashwidth 2
bind $parentPane <Button> {}
@@ -2180,7 +2222,7 @@ class RightPanel {
}
}
- ## Set panel width acording to current sash position
+ ## Set panel width according to current sash position
# @return void
public method right_panel_set_size {} {
set PanelSize [lindex [$parentPane sash coord 0] 0]
@@ -2214,10 +2256,10 @@ class RightPanel {
set size $fontSize
} elseif {$use_editor_font == -1} {
set font $::DEFAULT_FIXED_FONT
- set size -14
- } {
+ set size [expr {int(-14 * $::font_size_factor)}]
+ } else {
set font $::DEFAULT_FIXED_FONT
- set size -12
+ set size [expr {int(-12 * $::font_size_factor)}]
}
# Iterate over tags definition
@@ -2234,7 +2276,7 @@ class RightPanel {
-weight {bold} \
-slant {roman}]
# Italic font
- } {
+ } else {
$widget tag configure [lindex $tag 0] \
-foreground [lindex $tag 1] \
-font [font create -size $size \
@@ -2244,7 +2286,7 @@ class RightPanel {
}
# No bold, no italic
- } {
+ } else {
$widget tag configure [lindex $tag 0] \
-foreground [lindex $tag 1] \
-font [font create -size $size \
@@ -2271,3 +2313,7 @@ class RightPanel {
$this right_panel_instruction_details_set_enabled $enabled
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/rightpanel/subprograms.tcl b/lib/rightpanel/subprograms.tcl
index 6385266..c8380cb 100755..100644
--- a/lib/rightpanel/subprograms.tcl
+++ b/lib/rightpanel/subprograms.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 _SUBPROGRAMS_TCL ] } {
+set _SUBPROGRAMS_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Provides panel for watching subprogram calls
@@ -30,29 +35,31 @@ class SubPrograms {
## COMMON
common fsd_filename {} ;# Filename choosen by FSD
# Main font for the text widget
- common main_font [font create \
- -family {helvetica} \
- -size -14 \
+ common main_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
]
# Bold font for the text widget
- common bold_font [font create \
- -family {helvetica} \
- -size -14 -weight {bold} \
+ common bold_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight {bold} \
]
# Font for status bar below the text box
- common large_font [font create \
- -family {helvetica} \
- -size -14 \
+ common large_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
]
# Bold font for status bar below the text box
- common large_bold_font [font create \
- -family {helvetica} \
- -size -14 -weight {bold} \
+ common large_bold_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight {bold} \
]
## PRIVATE
private variable parent ;# Widget: parent widget
- private variable gui_initialized 0 ;# Bool: GUI initialized
+ private variable subp_gui_initialized 0 ;# Bool: GUI initialized
private variable text_widget ;# Widget: Text widget containg almost all the information
private variable scrollbar ;# Widget: Scrollbar for the text widget
@@ -73,7 +80,7 @@ class SubPrograms {
}
destructor {
- if {$gui_initialized} {
+ if {$subp_gui_initialized} {
menu_Sbar_remove $menu
}
}
@@ -84,7 +91,7 @@ class SubPrograms {
# @return void
public method PrepareSubPrograms {_parent} {
set parent $_parent
- set gui_initialized 0
+ set subp_gui_initialized 0
load_config $::CONFIG(SUBP_MON_CONFIG)
}
@@ -117,8 +124,8 @@ class SubPrograms {
## Create all widgets which this panel consist of
# @return void
private method create_gui {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$subp_gui_initialized} {return}
+ set subp_gui_initialized 1
# Create top frame (checkbuttons)
set top_frame [frame $parent.top]
@@ -136,12 +143,12 @@ class SubPrograms {
# Adjust check buttons
if {$enabled} {
$enable_chbut select
- } {
+ } else {
$enable_chbut deselect
}
if {$ena_intr} {
$intr_chbut select
- } {
+ } else {
$intr_chbut deselect
}
@@ -153,7 +160,7 @@ class SubPrograms {
-image ::ICONS::16::button_cancel \
-command "$this subprograms_force_return" \
-state disabled \
- -width 6 \
+ -width 7 \
]
set clear_but [ttk::button $button_frame.clear_but \
-text [mc "Clear"] \
@@ -244,7 +251,7 @@ class SubPrograms {
{separator}
{command {Remove this} {} 0 "subprograms_menu_action 4"
{editdelete} "Remove this entry"}
- } $menu 0 "$this " 0 {}
+ } $menu 0 "$this " 0 {} [namespace current]
}
## Create highlighting tags for the text widget
@@ -365,7 +372,7 @@ class SubPrograms {
$this Simulator_sync_PC_etc
$this move_simulator_line $line
# Simulator is not running
- } {
+ } else {
set filename [$this simulator_get_filename [lindex $line 1]]
set filename [file tail $filename]
if {[$this fucus_specific_editor $filename 0]} {
@@ -373,7 +380,7 @@ class SubPrograms {
}
}
# Line unresolved
- } {
+ } else {
tk_messageBox \
-parent . \
-title [mc "Line not found"] \
@@ -397,10 +404,10 @@ class SubPrograms {
set line [expr {$line / 3}]
if {$line >= $count} {
set state {disabled}
- } {
+ } else {
set state {normal}
}
- } {
+ } else {
set state {disabled}
}
@@ -426,7 +433,7 @@ class SubPrograms {
# @return void
public method subprograms_call {type from to} {
if {!$enabled} {return}
- if {!$gui_initialized} CreateSubProgramsGUI
+ if {!$subp_gui_initialized} CreateSubProgramsGUI
# Determinate string to print as an instruction
switch -- $type {
@@ -444,7 +451,7 @@ class SubPrograms {
# Convert value of source address to hexadecimal representation
if {$from < 0} {
set from {-----}
- } {
+ } else {
set from [format %X $from]
set len [string length $from]
if {$len < 4} {
@@ -456,7 +463,7 @@ class SubPrograms {
# Convert value of target address to hexadecimal representation
if {$to < 0} {
set to {-----}
- } {
+ } else {
set to [format %X $to]
set len [string length $to]
if {$len < 4} {
@@ -504,7 +511,7 @@ class SubPrograms {
private method disena_buttonbar {bool} {
if {$bool} {
set state {normal}
- } {
+ } else {
set state {disabled}
}
$return_but configure -state $state
@@ -519,7 +526,7 @@ class SubPrograms {
if {!$enabled} {return}
if {!$count} {return}
if {$intr__sub && !$ena_intr} {return}
- if {!$gui_initialized} CreateSubProgramsGUI
+ if {!$subp_gui_initialized} CreateSubProgramsGUI
$text_widget configure -state normal
$text_widget delete 1.0 4.0
@@ -536,7 +543,7 @@ class SubPrograms {
## Clear the text widget
# @return void
public method subprograms_clear {} {
- if {!$gui_initialized} {return}
+ if {!$subp_gui_initialized} {return}
set count 0
$total_val_lbl configure -text 0
$text_widget configure -state normal
@@ -549,7 +556,7 @@ class SubPrograms {
# @parm Bool bool - 1 == Enable; 0 == Disbale
# @return void
public method subprograms_setEnabled {bool} {
- if {!$gui_initialized} {return}
+ if {!$subp_gui_initialized} {return}
if {!$bool} {
$return_but configure -state disabled
}
@@ -565,7 +572,7 @@ class SubPrograms {
set word [string trim $word]
if {$word == {Interrupt}} {
set word 1
- } {
+ } else {
set word 0
}
$this simulator_return_from_SP $word
@@ -581,10 +588,10 @@ class SubPrograms {
KIFSD::FSD fsd \
-title [mc "Save file - MCU 8051 IDE"] \
-directory [$this cget -projectPath] \
- -defaultmask 0 -multiple 0 -filetypes {
- {{Plain text} {*.txt} }
- {{All files} {*} }
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "Plain text"] {*.txt} ] \
+ [list [mc "All files"] {*} ] \
+ ]
# Ok button
fsd setokcmd {
@@ -593,12 +600,12 @@ class SubPrograms {
if {![regexp "^(~|/)" $fsd_filename]} {
set filename "[${::X::actualProject} cget -ProjectDir]/$fsd_filename"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $fsd_filename]} {
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $fsd_filename]} {
set filename [file join [${::X::actualProject} cget -ProjectDir] $fsd_filename]
}
}
-
+
set ::SubPrograms::fsd_filename [file normalize $fsd_filename]
}
@@ -627,7 +634,7 @@ class SubPrograms {
-title [mc "Overwrite file"] \
-message [mc "A file name '%s' already exists. Are you sure you want to overwrite it ?" [file tail $filename]]
] != {yes}
- } {
+ } then {
return
}
# Create a backup file
@@ -637,8 +644,8 @@ class SubPrograms {
}
# Try to open the file
if {[catch {
- set file [open $filename w 420]
- }]} {
+ set file [open $filename w 0640]
+ }]} then {
tk_messageBox \
-parent . \
-icon warning \
@@ -655,14 +662,14 @@ class SubPrograms {
## Get number of recorder active subprograms
# @return Int - Count
public method subprograms_get_count {} {
- if {!$gui_initialized} {return 0}
+ if {!$subp_gui_initialized} {return 0}
return $count
}
## Get content for purpose of program hibernation
# @return String - Text
- public method subprograms_get_formated_content {} {
- if {!$gui_initialized} {return {}}
+ public method subprograms_get_formatted_content {} {
+ if {!$subp_gui_initialized} {return {}}
set result {}
set source {}
set target {}
@@ -684,7 +691,7 @@ class SubPrograms {
regexp {\w+\s*$} $line source
set source [string range $source 0 3]
set source [expr "0x$source"]
- } {
+ } else {
regexp {\w+\s*$} $line target
set target [string range $target 0 3]
set target [expr "0x$target"]
@@ -702,3 +709,7 @@ class SubPrograms {
return $result
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/bitmap.tcl b/lib/simulator/bitmap.tcl
index 6ed43e0..c2b4623 100755..100644
--- a/lib/simulator/bitmap.tcl
+++ b/lib/simulator/bitmap.tcl
@@ -2,7 +2,7 @@
# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
############################################################################
-# Copyright (C) 2007-2008 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,14 +21,19 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _BITMAP_TCL ] } {
+set _BITMAP_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
-# Provides graphical view on bit addressable area in simulated MCU
+# Provides graphical view on bit addressable area in simulated MCU.
# --------------------------------------------------------------------------
class BitMap {
## COMMON
- common count 0 ;# Int: Counter of object instances
+ common btmap_count 0 ;# Int: Counter of object instances
# Last window geometry
common win_geometry [lindex $::CONFIG(BITMAP_CONFIG) 0]
@@ -52,15 +57,15 @@ class BitMap {
common one_a_outline #DDFFDD ;# Color: Bit outline color for log. 1 (Selected bit)
# Font: Normal font for canvas widget
- common bitmap_n_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
+ common bitmap_n_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
]
# Font: Bold font for canvas widget
- common bitmap_b_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight bold \
+ common bitmap_b_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
]
@@ -117,8 +122,8 @@ class BitMap {
}
# Create dialog window
- set win [toplevel .bitmap_$count -class {Bitmap} -bg {#EEEEEE}]
- incr count
+ set win [toplevel .bitmap_${btmap_count} -class {Bitmap} -bg ${::COMMON_BG_COLOR}]
+ incr btmap_count
# ----------------------------------------------------------------
# Create main frame and canvas widget
@@ -340,7 +345,7 @@ class BitMap {
# Set window parameters
wm protocol $win WM_DELETE_WINDOW "$this bitmap_close_dialog"
wm resizable $win 0 0
- wm title $win [mc "Bit addressable area - %s - %s" [string trim $this {:}] "MCU 8051 IDE"]
+ wm title $win [mc "Bit addressable area - %s - %s - %s" [$this cget -P_option_mcu_type] [$this cget -projectName] "MCU 8051 IDE"]
wm iconphoto $win ::ICONS::16::kcmmemory_BA
catch {
wm geometry $win $win_geometry
@@ -365,14 +370,14 @@ class BitMap {
if {$bits_states($addr)} {
set outline $one_a_outline
set fill $one_a_fill
- } {
+ } else {
set outline $zero_a_outline
set fill $zero_a_fill
}
# Set new rectangle colors and changle cursor
if {$enabled} {
$bitmap_canvas itemconfigure $bits($addr) -outline $outline -fill $fill
- $bitmap_canvas configure -cursor hand1
+ $bitmap_canvas configure -cursor hand2
}
## Adjust address meters
@@ -400,7 +405,7 @@ class BitMap {
if {$bits_states($addr)} {
set outline $one_outline
set fill $one_fill
- } {
+ } else {
set outline $zero_outline
set fill $zero_fill
}
@@ -479,7 +484,7 @@ class BitMap {
if {$original_val != $bits_states($bit_addr)} {
if {$bits_states($bit_addr)} {
set fill $one_fill
- } {
+ } else {
set fill $zero_fill
}
@@ -500,7 +505,7 @@ class BitMap {
for {set i 0} {$i < 128} {incr i} {
if {$bits_states($i)} {
set outline $one_outline
- } {
+ } else {
set outline $zero_outline
}
$bitmap_canvas itemconfigure $bits($i) -outline $outline
@@ -508,3 +513,7 @@ class BitMap {
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/engine/engine_auxiliary_alo_functions.tcl b/lib/simulator/engine/engine_auxiliary_alo_functions.tcl
index d73b57e..8929268 100755..100644
--- a/lib/simulator/engine/engine_auxiliary_alo_functions.tcl
+++ b/lib/simulator/engine/engine_auxiliary_alo_functions.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_AUXILIARY_ALO_FUNCTIONS_TCL ] } {
+set _ENGINE_AUXILIARY_ALO_FUNCTIONS_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Part of simulator engine functionality.
@@ -71,7 +76,7 @@ private method alo_add {val} {
incr val_h
incr result -16
setBit $symbol(AC) 1
- } {
+ } else {
setBit $symbol(AC) 0
}
@@ -82,7 +87,7 @@ private method alo_add {val} {
if {$result > 255} {
incr result -256
setBit $symbol(C) 1
- } {
+ } else {
setBit $symbol(C) 0
}
@@ -91,7 +96,7 @@ private method alo_add {val} {
setBit $symbol(OV) 1
} elseif {($val > 127) && ($sfr(224) > 127) && ($result < 128)} {
setBit $symbol(OV) 1
- } {
+ } else {
setBit $symbol(OV) 0
}
@@ -139,7 +144,7 @@ private method alo_subb {val} {
incr result_l 16
incr val_h
setBit $symbol(AC) 1
- } {
+ } else {
setBit $symbol(AC) 0
}
@@ -150,7 +155,7 @@ private method alo_subb {val} {
if {$result_h < 0} {
incr result_h 16
setBit $symbol(C) 1
- } {
+ } else {
setBit $symbol(C) 0
}
@@ -162,10 +167,14 @@ private method alo_subb {val} {
setBit $symbol(OV) 1
} elseif {($val < 128) && ($sfr(224) > 127) && ($result < 128)} {
setBit $symbol(OV) 1
- } {
+ } else {
setBit $symbol(OV) 0
}
# Set Acc
set sfr(224) $result
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/engine/engine_backward_stepping.tcl b/lib/simulator/engine/engine_backward_stepping.tcl
index f7e1b66..7914c9b 100755..100644
--- a/lib/simulator/engine/engine_backward_stepping.tcl
+++ b/lib/simulator/engine/engine_backward_stepping.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_BACKWARD_STEPPING_TCL ] } {
+set _ENGINE_BACKWARD_STEPPING_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Part of simulator engine functionality.
@@ -113,7 +118,7 @@ public method stepback_discard_stack {} {
public method simulator_get_SBS_len {} {
if {${::Simulator::reverse_run_steps}} {
return $stepback_length
- } {
+ } else {
return 0
}
}
@@ -124,3 +129,7 @@ public method simulator_get_SBS_len {} {
public method simulator_set_SBS_len {value} {
set stepback_length $value
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/engine/engine_control.tcl b/lib/simulator/engine/engine_control.tcl
index efa00c9..6b76b5a 100755..100644
--- a/lib/simulator/engine/engine_control.tcl
+++ b/lib/simulator/engine/engine_control.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_CONTROL_TCL ] } {
+set _ENGINE_CONTROL_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Part of simulator engine functionality.
@@ -36,7 +41,7 @@
public method simulator_return_from_SP {intr__sub} {
if {$intr__sub} {
simulator_cancel_interrupt [lindex $inter_in_p_flags end]
- } {
+ } else {
ins_ret
$this move_simulator_line $Line($pc)
}
@@ -88,17 +93,17 @@ public method simulator_resize_code_memory {new_size} {
## Get list of decimal address of implemented SFR
# @return List - Implemented special function registers
-public method simulator_get_avaliable_sfr {} {
- return $avaliable_sfr
+public method simulator_get_available_sfr {} {
+ return $available_sfr
}
-## Determinate whether the specified SFR is avaliable on the target MCU or not
+## Determinate whether the specified SFR is available on the target MCU or not
# @parm Int sfr_addr - Address of SFR register
- # @return Bool - 1 == Avaliable; 0 == Not avaliable
-public method simulator_is_sfr_avaliable {sfr_addr} {
- if {[lsearch -ascii -exact $avaliable_sfr $sfr_addr] == -1} {
+ # @return Bool - 1 == available; 0 == Not available
+public method simulator_is_sfr_available {sfr_addr} {
+ if {[lsearch -ascii -exact $available_sfr $sfr_addr] == -1} {
return 0
- } {
+ } else {
return 1
}
}
@@ -146,8 +151,9 @@ public method master_reset {mode} {
set wdt_prescaler_val 0 ;# Int: Value of Watchdog prescaler
set watchdog_value 0 ;# Int: Value of watchdog timer
set eeprom_WR 0 ;# Bool: Data EEPROM write cycle in progress
-
- simulator_Sbar {} 0 $this ;# Clear simulator status bar
+ if {$::GUI_AVAILABLE} {
+ simulator_Sbar {} 0 $this ;# Clear simulator status bar
+ }
set interrupt_on_next 0 ;# Bool: Engage interrupt routine on the next instruction cycle
set interrupts_in_progress {} ;# Priority flags of interrupts which are in progress
set inter_in_p_flags {} ;# Interrupt flags of interrupts which are in progress
@@ -208,44 +214,44 @@ public method master_reset {mode} {
foreach item $reset_reg_values_1 {
set reg [lindex $item 0]
switch -- $reg {
- {T2CON} {if {!$feature_avaliable(t2)} {continue}}
- {RCAP2L} {if {!$feature_avaliable(t2)} {continue}}
- {RCAP2H} {if {!$feature_avaliable(t2)} {continue}}
- {TL2} {if {!$feature_avaliable(t2)} {continue}}
- {TH2} {if {!$feature_avaliable(t2)} {continue}}
- {T2MOD} {if {!$feature_avaliable(t2mod)} {continue}}
- {AUXR} {if {!$feature_avaliable(auxr)} {continue}}
- {SCON} {if {!$feature_avaliable(uart)} {continue}}
- {P0} {if {!$feature_avaliable(p0)} {continue}}
- {P1} {if {!$feature_avaliable(p1)} {continue}}
- {P2} {if {!$feature_avaliable(p2)} {continue}}
- {P3} {if {!$feature_avaliable(p3)} {continue}}
- {P4} {if {!$feature_avaliable(p4)} {continue}}
- {ACSR} {if {!$feature_avaliable(acomparator)} {continue}}
- {SADEN} {if {!$feature_avaliable(euart)} {continue}}
- {SADDR} {if {!$feature_avaliable(euart)} {continue}}
- {IPH} {if {!$feature_avaliable(iph)} {continue}}
- {WDTCON} {if {!$feature_avaliable(wdtcon)} {continue}}
+ {T2CON} {if {!$feature_available(t2)} {continue}}
+ {RCAP2L} {if {!$feature_available(t2)} {continue}}
+ {RCAP2H} {if {!$feature_available(t2)} {continue}}
+ {TL2} {if {!$feature_available(t2)} {continue}}
+ {TH2} {if {!$feature_available(t2)} {continue}}
+ {T2MOD} {if {!$feature_available(t2mod)} {continue}}
+ {AUXR} {if {!$feature_available(auxr)} {continue}}
+ {SCON} {if {!$feature_available(uart)} {continue}}
+ {P0} {if {!$feature_available(p0)} {continue}}
+ {P1} {if {!$feature_available(p1)} {continue}}
+ {P2} {if {!$feature_available(p2)} {continue}}
+ {P3} {if {!$feature_available(p3)} {continue}}
+ {P4} {if {!$feature_available(p4)} {continue}}
+ {ACSR} {if {!$feature_available(acomparator)} {continue}}
+ {SADEN} {if {!$feature_available(euart)} {continue}}
+ {SADDR} {if {!$feature_available(euart)} {continue}}
+ {IPH} {if {!$feature_available(iph)} {continue}}
+ {WDTCON} {if {!$feature_available(wdtcon)} {continue}}
{EECON} {if {!$eeprom_size} {continue}}
- {SPCR} {if {!$feature_avaliable(spi)} {continue}}
- {SPSR} {if {!$feature_avaliable(spi)} {continue}}
+ {SPCR} {if {!$feature_available(spi)} {continue}}
+ {SPSR} {if {!$feature_available(spi)} {continue}}
{DP1H} {
- if {!$feature_avaliable(ddp) || $feature_avaliable(hddptr)} {
+ if {!$feature_available(ddp) || $feature_available(hddptr)} {
continue
}
}
{DP1L} {
- if {!$feature_avaliable(ddp) || $feature_avaliable(hddptr)} {
+ if {!$feature_available(ddp) || $feature_available(hddptr)} {
continue
}
}
{CLKREG} {
- if {!$feature_avaliable(clkreg) && !$feature_avaliable(ckcon)} {
+ if {!$feature_available(clkreg) && !$feature_available(ckcon)} {
continue
}
}
{AUXR1} {
- if {!$feature_avaliable(ddp) || $feature_avaliable(wdtcon)} {
+ if {!$feature_available(ddp) || $feature_available(wdtcon)} {
continue
}
}
@@ -256,10 +262,10 @@ public method master_reset {mode} {
}
# Restore bits which are not affected by reset
- if {$feature_avaliable(pof) && $controllers_conf(POF)} {
+ if {$feature_available(pof) && $controllers_conf(POF)} {
set sfr($symbol(PCON)) [expr {$sfr($symbol(PCON)) | 16}]
}
- if {$feature_avaliable(x2reset) && $controllers_conf(X2)} {
+ if {$feature_available(x2reset) && $controllers_conf(X2)} {
set sfr($symbol(CLKREG)) [expr {$sfr($symbol(CLKREG)) | 1}]
}
@@ -275,17 +281,19 @@ public method master_reset {mode} {
}
# Synchronize with special GUI controls
- $this simulator_GUI_cancel_write_to_eeprom ;# Abort data EEPROM write cycle
- $this interrupt_monitor_reset ;# Reset interrupt monitor
- $this subprograms_clear ;# Clear list subprograms
- $this stopwatch_refresh ;# Stopwatch
- $this stack_monitor_reset ;# clear stack monitor
+ if {$::GUI_AVAILABLE} {
+ $this simulator_GUI_cancel_write_to_eeprom ;# Abort data EEPROM write cycle
+ $this interrupt_monitor_reset ;# Reset interrupt monitor
+ $this subprograms_clear ;# Clear list subprograms
+ $this stopwatch_refresh ;# Stopwatch
+ $this stack_monitor_reset ;# clear stack monitor
+ }
# Reset PALE (Peripheral Astraction Layer Engine)
$this pale_reset
for {set i 0} {$i < 5} {incr i} {
set j 0
- foreach bit [split $feature_avaliable(port$i) {}] {
+ foreach bit [split $feature_available(port$i) {}] {
if {$bit == 0} {
$this pale_SLSF [list $i $j] 6
}
@@ -344,10 +352,10 @@ public method stepback {} {
simulator_set_special [lindex $stepback_spec $stepback_length]
set opcode [getCode $pc]
- if {[lsearch ${CompilerConsts::defined_OPCODE} $opcode] == -1} {
+ if {[lsearch ${::CompilerConsts::defined_OPCODE} $opcode] == -1} {
incr run_statistics(4) -1
- } {
- incr run_statistics(4) -[lindex $CompilerConsts::Opcode($opcode) 2]
+ } else {
+ incr run_statistics(4) -[lindex $::CompilerConsts::Opcode($opcode) 2]
}
incr run_statistics(0) [expr {int(($overall_time - $overall_time_org) * (12000000.0 / $clock_kHz))}]
@@ -394,14 +402,17 @@ public method stepback {} {
$this stack_monitor_pop
}
}
- if {[llength $interrupts_in_progress]} {
- simulator_Sbar [mc "Interrupt at vector 0x%s " [format %X [intr2vector [lindex $interrupts_in_progress end]]]] 1 $this
- } {
- simulator_Sbar {} 0 $this
+ if {$::GUI_AVAILABLE} {
+ if {[llength $interrupts_in_progress]} {
+ simulator_Sbar [mc "Interrupt at vector 0x%s " [format %X [intr2vector [lindex $interrupts_in_progress end]]]] 1 $this
+ } else {
+ simulator_Sbar {} 0 $this
+ }
+
+ $this graph_stepback [expr {int(($overall_time_org - $overall_time) * 2)}]
+ $this interrupt_monitor_reevaluate
+ $this stopwatch_refresh
}
- $this graph_stepback [expr {int(($overall_time_org - $overall_time) * 2)}]
- $this interrupt_monitor_reevaluate
- $this stopwatch_refresh
if {$eeprom_size} {
for {set i 0} {$i < 32} {incr i} {
::X::sync_eeprom_write_buffer $i $this
@@ -411,11 +422,13 @@ public method stepback {} {
if {$eeprom_WR} {
eeprom_controller [expr {int(($overall_time_org - $overall_time) * (-2))}]
- } {
- foreach reg $eeprom_prev {
- ::X::sync_eeprom_clear_bg_hg [lindex $reg 0] $this
+ } else {
+ if {$::GUI_AVAILABLE} {
+ foreach reg $eeprom_prev {
+ ::X::sync_eeprom_clear_bg_hg [lindex $reg 0] $this
+ }
+ $this simulator_GUI_cancel_write_to_eeprom
}
- $this simulator_GUI_cancel_write_to_eeprom
}
$this Simulator_sync_PC_etc
@@ -426,7 +439,7 @@ public method stepback {} {
$this Simulator_GUI_sync S 224
if {!$stepback_length} {
return 0
- } {
+ } else {
return 1
}
}
@@ -449,7 +462,7 @@ public method step {} {
return $Line($pc)
# Invalid OP code
- } {
+ } else {
bell
$this sim_txt_output [mc "No instruction found at 0x%s" [NumSystem::dec2hex $pc]]
incr_pc 1
@@ -469,7 +482,7 @@ public method sim_stepover {} {
set stepover_in_progress 0
# Engage
- } {
+ } else {
# Local variables
set current_line 0 ;# Current line in source code
set stepover_in_progress 1 ;# Bool: "Step over" mode flag
@@ -486,7 +499,7 @@ public method sim_stepover {} {
if {$code($pc) != {}} {
set sync_ena 1 ;# Enable synchronization
- while 1 {
+ while {1} {
# Conditionaly abort simulation
if {$break} {
set break 0
@@ -536,7 +549,7 @@ public method sim_stepover {} {
return $Line($pc)
# No OP code
- } {
+ } else {
incr_pc 1
bell
$this sim_txt_output [mc "No instruction found at 0x%s" [NumSystem::dec2hex $pc]]
@@ -562,7 +575,7 @@ public method sim_run {} {
set run_in_progress 0 ;# Bool: "Run" mode flag
# Engage
- } {
+ } else {
set sync_ena 0 ;# Disabled synchronizations
# Local variables
@@ -570,9 +583,10 @@ public method sim_run {} {
set simulation_in_progress 1 ;# Bool: Simulator engaged
set idx 0 ;# Instruction index (GUI is updated after each 1000)
set ::X::critical_procedure_in_progress 0
+ set time_ms [clock milliseconds] ;# Int: High res. system timer, used here for regular GUI updates
# Infinitely execute program instructions until break
- while 1 {
+ while {1} {
incr idx
# Conditionaly abort simulation
if {$break} {
@@ -600,15 +614,19 @@ public method sim_run {} {
# Execute instruction
instruction_cycle
- # Run update command after each 25 instructions
- if {!($idx % 25)} {
- update
- }
- # Update GUI after each 100 instructions
- if {$idx >= 100} {
- set idx 0
- $this Simulator_sync_PC_etc
- update
+ if {$::GUI_AVAILABLE} {
+ if {([clock milliseconds] - $time_ms) > $GUI_UPDATE_INT} {
+ set idx 0
+ $this Simulator_sync_PC_etc
+ update
+ set time_ms [clock milliseconds]
+ }
+ } else {
+ # Stop after 1000 instructions
+ if {$idx >= 1000} {
+ set idx 0
+ set break 1
+ }
}
# Handle breakpoints
@@ -648,13 +666,13 @@ public method sim_animate {} {
set animation_in_progress 0 ;# Bool: "Animation" mode flag
# Engage
- } {
+ } else {
set animation_in_progress 1 ;# Bool: "Animation" mode flag
set simulation_in_progress 1 ;# Bool: Simulator engaged
set ::X::critical_procedure_in_progress 0
# Infinitely execute program instructions until break
- while 1 {
+ while {1} {
# Conditionaly abort simulation
if {$break} {
set simulation_in_progress 0
@@ -748,8 +766,8 @@ public method Simulator_shutdown {} {
# @return void
public method Simulator_initiate {} {
set sync_ena 1
- simulator_system_power_on
master_reset -
+ simulator_system_power_on
# Reset watchdog
set watchdog_value 0
@@ -757,3 +775,7 @@ public method Simulator_initiate {} {
set break 0
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/engine/engine_core.tcl b/lib/simulator/engine/engine_core.tcl
index e974656..0c78129 100755..100644
--- a/lib/simulator/engine/engine_core.tcl
+++ b/lib/simulator/engine/engine_core.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_CORE_TCL ] } {
+set _ENGINE_CORE_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements virtual 8051 processor. This class is a part 8051 simulator.
@@ -54,9 +59,9 @@ class Simulator_ENGINE {
## COMMON
common symbol ;# Array of SFR symbolic names (eg. $symbol(P0) == "80")
- common DEBUG 1 ;# Turn on debugging
common PIN ;# Array describing pins with some special function
common PORT_LATCHES ;# List: Port latch registers
+ common GUI_UPDATE_INT 66;# Int: Time interval [ms] in which the GUI is regulary updated in the run mode
# Default values for SFR (values to set after reset)
common reset_reg_values {
@@ -77,10 +82,10 @@ class Simulator_ENGINE {
}
## PUBLIC
- public variable programming_language 0 ;# Int: ID of used programing language (0 == Assembler; 1 == C language)
+ public variable programming_language 0 ;# Int: ID of used programming language (0 == Assembler; 1 == C language)
## PRIVATE
- private variable breakpoints ;# Array of Lists of breakpoints (by line numbers) -- (eg '{1 45 399}')
+ private variable breakpoints ;# Array of Lists of breakpoints -- (eg '$breakpoints($file_number) == {1 45 399}')
private variable ram ;# Array of internal RAM; addr: 0..255; val: 0..255
private variable eram ;# Array of expanded RAM; addr: 0..4096; val: 0..255
@@ -102,13 +107,13 @@ class Simulator_ENGINE {
private variable Line ;# $Line($PC) == {line in source code} {filenumber} {level} {block}
private variable list_of_filenames ;# List of filenames for [lindex $Line($pc) 1]
- private variable line2PC ;# $line2PC($line) == PC
+ private variable line2PC ;# $line2PC($line_number,$file_number) == PC
private variable bank 0 ;# Current register bank (0..3)
private variable pc 0 ;# Program counter
private variable clock_kHz 0 ;# MCU clock in kHz
private variable time 0 ;# Number of instruction cycles consumed by current instruction
private variable sync_ena 0 ;# Bool: Enabled synchronization with an external interface
- private variable address_error 0 ;# Bool: Addressing error occured
+ private variable address_error 0 ;# Bool: Addressing error occurred
private variable break 0 ;# Bool: Immediately terminate the loaded program
private variable simulation_in_progress 0 ;# Bool: Engine is running
@@ -118,19 +123,19 @@ class Simulator_ENGINE {
private variable ports_previous_state {} ;# List: {P0_hex P1_hex P2_hex P3_hex P4_hex}
private variable rmw_instruction 0 ;# Bool: This instruction is one of READ-MODIFY-WRITE ones
- private variable avaliable_sfr {} ;# List: Addresses of implemented SFR
- private variable feature_avaliable ;# Array: Avaliable features
+ private variable available_sfr {} ;# List: Addresses of implemented SFR
+ private variable feature_available ;# Array: available features
private variable restricted_bits {} ;# List: Decimal addresses of unimplemented bits
private variable write_only_regs {} ;# List: Decimal addresses of write only registers
- private variable incomplite_regs {} ;# List: Decimal addresses of not fully implemented registers
- private variable incomplite_regs_mask ;# Array: key == dec. addr.; val == mask of implemented bits
+ private variable incomplete_regs {} ;# List: Decimal addresses of not fully implemented registers
+ private variable incomplete_regs_mask ;# Array: key == dec. addr.; val == mask of implemented bits
private variable DPL {DP0L} ;# Address of current DPL register (DTPR)
private variable DPH {DP0H} ;# Address of current DPH register (DTPR)
private variable hidden_DPTR0 {0 0} ;# Value of DPTR0 (if dual DPTR is hidden)
private variable hidden_DPTR1 {0 0} ;# Value of DPTR1 (if dual DPTR is hidden)
- private variable watchdog_value 0 ;# Int: Current value of watchdog timer (if avaliable)
+ private variable watchdog_value 0 ;# Int: Current value of watchdog timer (if available)
private variable wdtrst_prev_val 0 ;# Int: Previous value of register WDTRST
private variable wdt_prescaler_val 0 ;# Int: Watchdog prescaler value (content)
@@ -272,3 +277,7 @@ class Simulator_ENGINE {
# Initialize NS variables
Simulator_ENGINE::InitializeNS
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/engine/engine_external_interface_management.tcl b/lib/simulator/engine/engine_external_interface_management.tcl
index 30a5aed..5a1f220 100755..100644
--- a/lib/simulator/engine/engine_external_interface_management.tcl
+++ b/lib/simulator/engine/engine_external_interface_management.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_EXTERNAL_INTERFACE_MANAGEMENT_TCL ] } {
+set _ENGINE_EXTERNAL_INTERFACE_MANAGEMENT_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Part of simulator engine functionality.
@@ -29,20 +34,25 @@
# EXTERNAL INTERFACE MANAGEMENT PROCEDURES
# --------------------------------------------------------------------------
+## Get value of bit X2 in CLKREG/CKCON if available
+ # @return Bool - X2 value (if unavailable then 0)
+public method get_X2 {} {
+ return $controllers_conf(X2)
+}
-## Get value of bit SMOD0 in PCON if avaliable
- # @return Bool - SMOD0 value (if unavaliable then 0)
+## Get value of bit SMOD0 in PCON if available
+ # @return Bool - SMOD0 value (if unavailable then 0)
public method get_SMOD0 {} {
return $controllers_conf(SMOD0)
}
-## Set value of bit FE in SCON if avaliable
- # @param Bool value - New value for SCON.FE (or SCON.SM0 if FE is not avaliable)
+## Set value of bit FE in SCON if available
+ # @param Bool value - New value for SCON.FE (or SCON.SM0 if FE is not available)
# @return void
public method sim_engine_set_FE {value} {
- if {$feature_avaliable(smod0)} {
+ if {$feature_available(smod0)} {
set controllers_conf(FE) $value
- } {
+ } else {
sim_engine_set_SM0 $value
}
}
@@ -54,12 +64,12 @@ public method sim_engine_set_SM0 {value} {
set controllers_conf(SM0) $value
}
-## Get value of bit FE in SCON if avaliable
- # @return Bool - FE value (if unavaliable then {})
+## Get value of bit FE in SCON if available
+ # @return Bool - FE value (if unavailable then {})
public method sim_engine_get_FE {} {
- if {!$feature_avaliable(smod0)} {
+ if {!$feature_available(smod0)} {
return {}
- } {
+ } else {
return $controllers_conf(FE)
}
}
@@ -71,9 +81,14 @@ public method sim_engine_get_SM0 {} {
}
## Get program run statistics
- # @return List - Array run_statistics converted to list
-public method get_run_statistics {} {
- return [array get run_statistics]
+ # @parm Int idx = {} - Index to the array ``run_statistics'', empty string means entire array
+ # @return List/Int - Array run_statistics converted to list or Int
+public method get_run_statistics {{idx {}}} {
+ if {$idx == {}} {
+ return [array get run_statistics]
+ } else {
+ return $run_statistics($idx)
+ }
}
## Retrieve filename from list of files from which this program has been compiled
@@ -97,9 +112,9 @@ public method simulator_get_filenumber {filename} {
## Get maximum valid interrupt priority level
# @return Int - 0..3
public method simulator_get_max_intr_priority {} {
- if {$feature_avaliable(iph)} {
+ if {$feature_available(iph)} {
return 3
- } {
+ } else {
return 1
}
}
@@ -185,7 +200,7 @@ private method set_interrupt_priority_flag {flag level} {
}
# Adjust register IPH
- if {$feature_avaliable(iph)} {
+ if {$feature_available(iph)} {
if {${::Simulator::reverse_run_steps}} {
stepback_reg_change S $symbol(IPH)
}
@@ -194,7 +209,7 @@ private method set_interrupt_priority_flag {flag level} {
if {$level / 2} {
set sfr($symbol(IPH)) [expr $sfr($symbol(IPH)) | $bit_mask]
# Clear priority bit
- } {
+ } else {
set sfr($symbol(IPH)) [expr $sfr($symbol(IPH)) & ($bit_mask ^ 255)]
}
@@ -210,7 +225,7 @@ private method set_interrupt_priority_flag {flag level} {
if {$level % 2} {
set sfr($symbol(IP)) [expr $sfr($symbol(IP)) | $bit_mask]
# Clear priority bit
- } {
+ } else {
set sfr($symbol(IP)) [expr $sfr($symbol(IP)) & ($bit_mask ^ 255)]
}
# Adjust internal engine configuration
@@ -277,7 +292,10 @@ public method simulator_clear_intr_flag {flag} {
# Adjust internal engine configuration
evaluate_sfr $addr
- $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+
+ if {$::GUI_AVAILABLE} {
+ $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ }
}
## Force return from certain interrupt
@@ -299,11 +317,13 @@ public method simulator_cancel_interrupt {flag} {
incr run_statistics(8)
$this subprograms_return 1
- 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
+ }
}
set pch [stack_pop]
@@ -348,10 +368,10 @@ public method simulator_get_interrupts_in_progress_pb {} {
# @return List - Something like {IE0 TF0 IE1 TF1 RI TI CF}
public method simulator_get_intr_flags {} {
set result {IE0 TF0 IE1 TF1}
- if {$feature_avaliable(uart)} {lappend result RI TI}
- if {$feature_avaliable(spi)} {lappend result SPIF}
- if {$feature_avaliable(t2)} {lappend result TF2 EXF2}
- if {$feature_avaliable(acomparator)} {lappend result CF}
+ if {$feature_available(uart)} {lappend result RI TI}
+ if {$feature_available(spi)} {lappend result SPIF}
+ if {$feature_available(t2)} {lappend result TF2 EXF2}
+ if {$feature_available(acomparator)} {lappend result CF}
return $result
}
@@ -384,13 +404,15 @@ public method simulator_cancel_write_to_eeprom {} {
public method simulator_finalize_write_to_eeprom {} {
if {!$eeprom_size || !$eeprom_WR} {return}
- # Clear background highlight in EEPROM hexeditor
+ # Clear background highlight in EEPROM hex editor
foreach reg $eeprom_prev {
::X::sync_eeprom_clear_bg_hg [lindex $reg 0] $this
}
# Adjust engine configuration
- $this simulator_GUI_cancel_write_to_eeprom
+ if {$::GUI_AVAILABLE} {
+ $this simulator_GUI_cancel_write_to_eeprom
+ }
set eeprom_WR 0
set eeprom_WR_time 0
set eeprom_WR_ofs {}
@@ -419,17 +441,47 @@ public method simulator_line2address {line file} {
set line [expr $line]
if {[llength [array names line2PC -exact "$line,$file"]]} {
return $line2PC($line,$file)
- } {
+ } else {
return {}
}
}
+## Determinate list of all unreachable breakpoints in the code
+ # @return List - { { file_number line_number } ... }
+public method simulator_getInvalidBreakpoints {} {
+ # Local variables
+ set ln 0 ;# Int: Line number
+ set fn 0 ;# Int: File number
+ set idx 0 ;# Index in list of breakpoints
+
+ set list_of_breakpoints [list]
+ foreach {f b} [array get breakpoints] {
+ foreach l $b {
+ lappend list_of_breakpoints [list $f $l]
+ }
+ }
+
+ foreach ln_fn [array names line2PC] {
+ scan $ln_fn {%d,%d} ln fn
+
+ set idx [lsearch -ascii -exact $list_of_breakpoints [list $fn $ln]]
+
+ if {$idx != -1} {
+ set list_of_breakpoints [lreplace $list_of_breakpoints $idx $idx]
+ }
+ }
+
+ set list_of_breakpoints [lsort -integer -index 0 $list_of_breakpoints]
+ set list_of_breakpoints [lsort -integer -index 1 $list_of_breakpoints]
+ return $list_of_breakpoints
+}
+
## Set watchdog timer value
# This procedure does nothing on MCUs without watchdog timer
# @parm Int value - new value (0..8192)
# @return void
public method simulator_setWatchDogTimer {value} {
- if {!$feature_avaliable(wtd)} {return}
+ if {!$feature_available(wtd)} {return}
set watchdog_value $value
}
@@ -463,7 +515,7 @@ public method simulator_setWatchDogPrescalerValue {value} {
# @parm Bool bool - 0 == STOP; 1 == START
# @return void
public method simulator_startStopWatchDogTimer {bool} {
- if {!$feature_avaliable(wtd)} {return}
+ if {!$feature_available(wtd)} {return}
set controllers_conf(WatchDogTimer) $bool
}
@@ -481,8 +533,10 @@ public method simulator_subprog_call {value} {
stack_push [expr {($value & 0xFF00) >> 8}]
incr run_statistics(6)
$this subprograms_call 3 $pc $value
- $this stack_monitor_set_last_values_as 1 2
- $this stopwatch_refresh
+ if {$::GUI_AVAILABLE} {
+ $this stack_monitor_set_last_values_as 1 2
+ $this stopwatch_refresh
+ }
set pc $value
}
@@ -511,7 +565,7 @@ public method simulator_get_line_number {} {
return [lindex $Line($pc) 0]
}
-## Translate adress in program memory to line info
+## Translate address in program memory to line info
# @parm Int addr - Address to translate
# @return List - Line information list
public method simulator_address2line {addr} {
@@ -567,7 +621,7 @@ public method setSfr {addr val} {
{150} { ;# EECON
if {$sfr(150) & 1} {
set controllers_conf(WRTINH) 1
- } {
+ } else {
set controllers_conf(WRTINH) 0
}
}
@@ -577,7 +631,7 @@ public method setSfr {addr val} {
evaluate_sfr $addr 0
set stepback_ena $foo
- # If adress points to Primary Accumulator (Acc) -> reevaluate PSW
+ # If address points to Primary Accumulator (Acc) -> reevaluate PSW
if {$addr == 224} {
$this Simulator_GUI_sync S 208
}
@@ -690,8 +744,10 @@ public method getData {addr} {
# @parm Int addr - register address
# @return String - register value (2 hexadecimal digits)
public method getSfr {addr} {
+
# Get hexadecimal value
set result [format "%X" $sfr($addr)]
+
# Adjust the value
if {[string length $result] == 1} {
set result "0$result"
@@ -861,7 +917,7 @@ public method load_program_from_adf {adf_file} {
-icon warning \
-type ok \
-title [mc "Out of memory"] \
- -message [mc "%s has not enought program memory to load this program. Simulator will work but the loaded code is incomplite" [$this cget -P_option_mcu_type]]
+ -message [mc "%s has not enough program memory to load this program. Simulator will work but the loaded code is incomplete" [$this cget -P_option_mcu_type]]
return 0
}
set Line($addr) [list $lineNum $fileNum 0 0] ;# Set line number
@@ -875,7 +931,7 @@ public method load_program_from_adf {adf_file} {
# @parm File filename - Full name of source file from which SIM file was generaded
# @parm File cdb_file - CDB file ID (content of *.cdb file)
# @parm File ihx_file - HEX file ID (content of *.ihx or *.hex file)
- # @return void
+ # @return Bool - 1 == Success; 0 == Failure
public method load_program_from_cdb {filename cdb_file ihx_file} {
unload_program ;# Clear current content of the program memory
@@ -1023,6 +1079,12 @@ public method setEngineClock {clockkHz} {
set clock_kHz $clockkHz
}
+## Get MCU clock frequency
+ # @return - clock frequency in kHz
+public method getEngineClock {} {
+ return $clock_kHz
+}
+
## Get program uptime as human readable string
# @return String - the time (eg. '2 s 42 ms 987 us')
public method getTime {} {
@@ -1031,7 +1093,7 @@ public method getTime {} {
set s 0
set ms 0
set ns 0
- } {
+ } else {
set s [expr {int($overall_time * (0.012 / $clock_kHz))}]
set ms [expr {int($overall_time * (12000.0 / $clock_kHz)) % 1000000}]
set ns [expr {int($overall_time * (12000000.0 / $clock_kHz)) % 1000}]
@@ -1050,7 +1112,7 @@ public method getTime {} {
set len [string length $ns]
if {$len < 3} {
set ns_s "[string repeat { } [expr {3 - $len}]]$ns"
- } {
+ } else {
set ns_s $ns
}
@@ -1058,7 +1120,7 @@ public method getTime {} {
set len [string length $us]
if {$len < 3} {
set us_s "[string repeat { } [expr {3 - $len}]]$us"
- } {
+ } else {
set us_s $us
}
@@ -1066,19 +1128,19 @@ public method getTime {} {
set len [string length $ms]
if {$len < 3} {
set ms_s "[string repeat { } [expr {3 - $len}]]$ms"
- } {
+ } else {
set ms_s $ms
}
# Adjust seconds and minutes strings
if {[string length $s] == 1} {
set s_s " $s"
- } {
+ } else {
set s_s $s
}
if {[string length $m] == 1} {
set m_s " $m"
- } {
+ } else {
set m_s $m
}
@@ -1103,7 +1165,7 @@ public method getTime {} {
}
# Append micro-seconds
if {$us > 0 || $result != {}} {
- append result " ${us_s}us"
+ append result " ${us_s}µs"
}
# Append nano-seconds
if {$ns > 0 || $result != {}} {
@@ -1113,3 +1175,7 @@ public method getTime {} {
# Done ...
return [string trim $result]
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/engine/engine_hibernation.tcl b/lib/simulator/engine/engine_hibernation.tcl
index 24d3adf..d5a5faa 100755..100644
--- a/lib/simulator/engine/engine_hibernation.tcl
+++ b/lib/simulator/engine/engine_hibernation.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_HIBERNATION_TCL ] } {
+set _ENGINE_HIBERNATION_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Part of simulator engine functionality.
@@ -39,16 +44,16 @@ public method simulator_get_special {} {
$timer_0_running $timer_1_running $overall_time \
$overall_instructions $inter_in_p_flags $timer1_overflow
- if {$feature_avaliable(t2)} {
+ if {$feature_available(t2)} {
lappend result $timer_2_running $timer2_overflow
}
- if {$feature_avaliable(wtd)} {
+ if {$feature_available(wtd)} {
lappend result $watchdog_value $wdtrst_prev_val
}
- if {$feature_avaliable(wdtcon)} {
+ if {$feature_available(wdtcon)} {
lappend result $wdt_prescaler_val $controllers_conf(WatchDogPrescaler)
}
- if {$feature_avaliable(pwm)} {
+ if {$feature_available(pwm)} {
lappend result $pwm_running $pwm_OCR
}
if {$eeprom_size} {
@@ -64,13 +69,13 @@ public method simulator_get_special {} {
lappend result $eeprom_WR_buff($i)
}
}
- if {$feature_avaliable(hddptr)} {
+ if {$feature_available(hddptr)} {
lappend result $hidden_DPTR0 $hidden_DPTR1
}
- if {$feature_avaliable(acomparator)} {
+ if {$feature_available(acomparator)} {
lappend result $anlcmp_running $anlcmp_output $anlcpm_db_timer
}
- if {$feature_avaliable(uart)} {
+ if {$feature_available(uart)} {
lappend result \
$uart_clock_prescaler \
$uart_RX_clock \
@@ -100,25 +105,25 @@ public method simulator_set_special {list} {
incr i
}
- if {$feature_avaliable(t2)} {
+ if {$feature_available(t2)} {
set timer_2_running [lindex $list $i]
incr i
set timer2_overflow [lindex $list $i]
incr i
}
- if {$feature_avaliable(wtd)} {
+ if {$feature_available(wtd)} {
set watchdog_value [lindex $list $i]
incr i
set wdtrst_prev_val [lindex $list $i]
incr i
}
- if {$feature_avaliable(wdtcon)} {
+ if {$feature_available(wdtcon)} {
set wdt_prescaler_val [lindex $list $i]
incr i
set controllers_conf(WatchDogPrescaler) [lindex $list $i]
incr i
}
- if {$feature_avaliable(pwm)} {
+ if {$feature_available(pwm)} {
set pwm_running [lindex $list $i]
incr i
set pwm_OCR [lindex $list $i]
@@ -142,13 +147,13 @@ public method simulator_set_special {list} {
set eeprom_WR_buff($j) [lindex $list $i]
}
}
- if {$feature_avaliable(hddptr)} {
+ if {$feature_available(hddptr)} {
set hidden_DPTR0 [lindex $list $i]
incr i
set hidden_DPTR1 [lindex $list $i]
incr i
}
- if {$feature_avaliable(acomparator)} {
+ if {$feature_available(acomparator)} {
set anlcmp_running [lindex $list $i]
incr i
set anlcmp_output [lindex $list $i]
@@ -156,7 +161,7 @@ public method simulator_set_special {list} {
set anlcpm_db_timer [lindex $list $i]
incr i
}
- if {$feature_avaliable(uart)} {
+ if {$feature_available(uart)} {
set uart_clock_prescaler [lindex $list $i]
incr i
set uart_RX_clock [lindex $list $i]
@@ -203,3 +208,7 @@ public method simulator_hib_append_SB_spec {list} {
public method simulator_hib_append_SB_norm {list} {
lappend stepback_normal $list
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/engine/engine_initialization_cleanup.tcl b/lib/simulator/engine/engine_initialization_cleanup.tcl
index e8a1ffa..8865dd2 100755..100644
--- a/lib/simulator/engine/engine_initialization_cleanup.tcl
+++ b/lib/simulator/engine/engine_initialization_cleanup.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_INITIALIZATION_CLEANUP_TCL ] } {
+set _ENGINE_INITIALIZATION_CLEANUP_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Part of simulator engine functionality.
@@ -52,7 +57,7 @@ destructor {
# This function is called after each simulator start
# @return void
private method simulator_system_power_on {} {
- if {$feature_avaliable(wtd)} {
+ if {$feature_available(wtd)} {
set sfr($symbol(WDTRST)) [undefined_octet]
set wdtrst_prev_val $sfr($symbol(WDTRST))
if {$sync_ena} {
@@ -60,7 +65,7 @@ private method simulator_system_power_on {} {
}
}
- if {$feature_avaliable(uart)} {
+ if {$feature_available(uart)} {
set sfr($symbol(SBUFR)) [undefined_octet]
set sfr($symbol(SBUFT)) [undefined_octet]
set controllers_conf(UART_M) 0
@@ -70,7 +75,7 @@ private method simulator_system_power_on {} {
}
}
- if {$feature_avaliable(pof)} {
+ if {$feature_available(pof)} {
set controllers_conf(POF) 1
set sfr($symbol(PCON)) 16
if {$sync_ena} {
@@ -78,7 +83,7 @@ private method simulator_system_power_on {} {
}
}
- if {$feature_avaliable(spi)} {
+ if {$feature_available(spi)} {
set sfr($symbol(SPDR)) 0
if {$sync_ena} {
catch {$this Simulator_GUI_sync S $symbol(SPDR)}
@@ -103,7 +108,7 @@ public method simulator_initialize_mcu {} {
+
[$this cget -P_option_mcu_xcode])}]
- # Parse processor definition and set array feature_avaliable
+ # Parse processor definition and set array feature_available
foreach index {
5 6 7 9 10 11 17
20 21 22 23 24 25 26
@@ -118,24 +123,24 @@ public method simulator_initialize_mcu {} {
auxrwdidle auxrdisrto xram xcode
} {
if {[lindex $proc_data $index] == {yes}} {
- set feature_avaliable($name) 1
- } {
- set feature_avaliable($name) 0
+ set feature_available($name) 1
+ } else {
+ set feature_available($name) 0
}
}
for {set i 12; set j 0} {$i < 17} {incr i; incr j} {
set port_mask [lindex $proc_data $i]
if {$port_mask != {} && $port_mask != {00000000}} {
- set feature_avaliable(p$j) 1
- set feature_avaliable(port$j) $port_mask
- } {
- set feature_avaliable(p$j) 0
- set feature_avaliable(port$j) {00000000}
+ set feature_available(p$j) 1
+ set feature_available(port$j) $port_mask
+ } else {
+ set feature_available(p$j) 0
+ set feature_available(port$j) {00000000}
}
}
- # Set incomplite_regs_mask, restricted_bits and incomplite_regs
- array unset incomplite_regs_mask
+ # Set incomplete_regs_mask, restricted_bits and incomplete_regs
+ array unset incomplete_regs_mask
set restricted_bits {}
foreach reg_mask [lindex $proc_data 18] {
set addr [string range $reg_mask 0 1]
@@ -143,7 +148,7 @@ public method simulator_initialize_mcu {} {
set addr [expr "0x$addr"]
set mask [expr "0x$mask"]
- set incomplite_regs_mask($addr) $mask
+ set incomplete_regs_mask($addr) $mask
if {$addr > 127 && !($addr % 8)} {
for {set i 1} {$i <= 128} {set i [expr {$i * 2}]; incr addr} {
@@ -153,7 +158,7 @@ public method simulator_initialize_mcu {} {
}
}
}
- set incomplite_regs [array names incomplite_regs_mask]
+ set incomplete_regs [array names incomplete_regs_mask]
# Determiate list of write-only registers
set write_only_regs {}
@@ -186,7 +191,7 @@ public method simulator_initialize_mcu {} {
# Power on virtual uC and derminate list of implemented SFR
simulator_system_power_on
master_reset 0
- set avaliable_sfr [array names sfr]
+ set available_sfr [array names sfr]
# Initialize/Clear code memory and data EEPROM
simulator_clear_memory code
@@ -312,18 +317,18 @@ proc InitializeNS {} {
set PORT_LATCHES [list $symbol(P0) $symbol(P1) $symbol(P2) $symbol(P3) $symbol(P4)]
}
-## Shutdown simulator engine
+## Stop simulator engine
# @return void
private method internal_shutdown {} {
set break 1
$this Simulator_sync_clock
}
-## Determinate if the specified feature is avaliable on this MCU
+## Determinate if the specified feature is available on this MCU
# @parm String key - feature name (e.g. 'p0')
# @return Bool - result (1 == yes; 0 == no)
-public method get_feature_avaliable {key} {
- return $feature_avaliable($key)
+public method get_feature_available {key} {
+ return $feature_available($key)
}
## Get number of implemented ports and list of port indexes
@@ -331,10 +336,14 @@ public method get_feature_avaliable {key} {
public method get_ports_info {} {
set sum 0
for {set i 0} {$i < 5} {incr i} {
- if {$feature_avaliable(p$i)} {
+ if {$feature_available(p$i)} {
incr sum
lappend lst $i
}
}
return [list $sum $lst]
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
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
diff --git a/lib/simulator/engine/engine_mcu_configuration.tcl b/lib/simulator/engine/engine_mcu_configuration.tcl
index 7701583..2226a7d 100755..100644
--- a/lib/simulator/engine/engine_mcu_configuration.tcl
+++ b/lib/simulator/engine/engine_mcu_configuration.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_MCU_CONFIGURATION_TCL ] } {
+set _ENGINE_MCU_CONFIGURATION_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Part of simulator engine functionality.
@@ -53,7 +58,7 @@ private method increment_program_time {num} {
return [watchdog_controller]
}
-## Adjust configuration acording to new value of the given bit
+## Adjust configuration according to new value of the given bit
# @parm Int addr - Bit address
# @return void
private method evaluate_bit {addr} {
@@ -61,18 +66,18 @@ private method evaluate_bit {addr} {
if {$sync_ena} {
$this Simulator_sync_reg [getRegOfBit $addr]
}
- } {
+ } else {
evaluate_sfr [getRegOfBit $addr]
}
}
-## Evaluate list of interrupt priorities acording to values of IP and IPH
+## Evaluate list of interrupt priorities according to values of IP and IPH
# @return void
private method evaluate_interrupt_priorities {} {
# Determinate value of Interrupt Priority High register
- if {$feature_avaliable(iph)} {
+ if {$feature_available(iph)} {
set iph $sfr(183)
- } {
+ } else {
set iph 0
}
@@ -115,17 +120,17 @@ private method evaluate_interrupt_priorities {} {
foreach flag $controllers_conf(IP) ip $controllers_conf(IP_level) {
switch -- $flag {
PS {
- if {$feature_avaliable(uart)} {
+ if {$feature_available(uart)} {
lappend interrupt_pri_flg RI TI
lappend interrupt_pri_num $ip $ip
}
- if {$feature_avaliable(spi)} {
+ if {$feature_available(spi)} {
lappend interrupt_pri_flg SPIF
lappend interrupt_pri_num $ip
}
}
PT2 {
- if {!$feature_avaliable(t2)} {continue}
+ if {!$feature_available(t2)} {continue}
lappend interrupt_pri_flg EXF2 TF2
lappend interrupt_pri_num $ip $ip
}
@@ -146,7 +151,7 @@ private method evaluate_interrupt_priorities {} {
lappend interrupt_pri_num $ip
}
PC {
- if {!$feature_avaliable(acomparator)} {continue}
+ if {!$feature_available(acomparator)} {continue}
lappend interrupt_pri_flg CF
lappend interrupt_pri_num $ip
}
@@ -154,17 +159,16 @@ private method evaluate_interrupt_priorities {} {
}
# Adjust interrup monitor
- $this interrupt_monitor_intr_prior $interrupt_pri_flg
+ if {$::GUI_AVAILABLE} {
+ $this interrupt_monitor_intr_prior $interrupt_pri_flg
+ }
}
-## Adjust configuration acording to new value of the given SFR
- # @parm Int - Register address
- # @parm Bool = 1 - Synchronize this SFR with external interface
+## Adjust configuration according to new value of the given SFR
+ # @parm Int addr - Register address
+ # @parm Bool sync=1 - Synchronize this SFR with external interface
# @return void
-private method evaluate_sfr args {
- set addr [lindex $args 0]
- set sync [lindex $args 1]
-
+private method evaluate_sfr {addr {sync 1}} {
switch -- $addr {
135 { ;# PCON 0x87
set SMOD0_prev $controllers_conf(SMOD0)
@@ -179,7 +183,9 @@ private method evaluate_sfr args {
write_conf 168 {EA EC ET2 ES ET1 EX1 ET0 EX0}
# Inform interrupt monitor
- $this interrupt_monitor_intr_ena_dis
+ if {$::GUI_AVAILABLE} {
+ $this interrupt_monitor_intr_ena_dis
+ }
}
184 { ;# IP 0xB8
evaluate_interrupt_priorities
@@ -190,7 +196,7 @@ private method evaluate_sfr args {
# Determinate SM0 and FE
if {$controllers_conf(SMOD0)} {
set controllers_conf(FE) [expr {($sfr(152) & 0x80) ? 1 : 0}]
- } {
+ } else {
set controllers_conf(SM0) [expr {($sfr(152) & 0x80) ? 1 : 0}]
}
@@ -203,13 +209,17 @@ private method evaluate_sfr args {
}
# Inform interrupt monitor
- $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ if {$::GUI_AVAILABLE} {
+ $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ }
}
136 { ;# TCON 0x88
write_conf 136 {TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0}
# Inform interrupt monitor
- $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ if {$::GUI_AVAILABLE} {
+ $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ }
}
137 { ;# TMOD 0x89
write_conf 137 {GATE1 CT1 M11 M01 GATE0 CT0 M10 M00}
@@ -234,19 +244,18 @@ private method evaluate_sfr args {
set bank [expr {($sfr(208) & 24) >> 3}]
}
224 { ;# A 0xE0
- set A 0
set count 0
set mask 1
for {set i 0} {$i < 8} {incr i} {
- if {[expr {$sfr(224) & $mask}] > 0} {
+ if {$sfr(224) & $mask} {
incr count
}
set mask [expr {$mask << 1}]
}
- if {[expr {$count % 2}] == 1} {
+ if {$count % 2} {
setBit $symbol(P) 1
- } {
+ } else {
setBit $symbol(P) 0
}
}
@@ -256,11 +265,11 @@ private method evaluate_sfr args {
write_conf 162 {- - - - - - - DPS}
# Switch visible dual DPTR
- if {!$feature_avaliable(hddptr)} {
+ if {!$feature_available(hddptr)} {
if {$controllers_conf(DPS)} {
set DPL {DP1L}
set DPH {DP1H}
- } {
+ } else {
set DPL {DP0L}
set DPH {DP0H}
}
@@ -269,13 +278,13 @@ private method evaluate_sfr args {
} elseif {$DPS_org != $controllers_conf(DPS)} {
if {$DPS_org} {
set hidden_DPTR1 [list $sfr($symbol(DP0L)) $sfr($symbol(DP0H))]
- } {
+ } else {
set hidden_DPTR0 [list $sfr($symbol(DP0L)) $sfr($symbol(DP0H))]
}
if {$controllers_conf(DPS)} {
set sfr($symbol(DP0L)) [lindex $hidden_DPTR1 0]
set sfr($symbol(DP0H)) [lindex $hidden_DPTR1 1]
- } {
+ } else {
set sfr($symbol(DP0L)) [lindex $hidden_DPTR0 0]
set sfr($symbol(DP0H)) [lindex $hidden_DPTR0 1]
}
@@ -290,13 +299,13 @@ private method evaluate_sfr args {
}
}
142 { ;# AUXR 0x8E
- if {$feature_avaliable(wdtcon)} {
- if {$feature_avaliable(intelpe)} {
+ if {$feature_available(wdtcon)} {
+ if {$feature_available(intelpe)} {
write_conf 142 {- - - - - - IPE DISALE}
- } {
+ } else {
write_conf 142 {- - - - - - EXTRAM DISALE}
}
- } {
+ } else {
write_conf 142 {- - - WDIDLE DISRTO - EXTRAM DISALE}
}
}
@@ -306,7 +315,7 @@ private method evaluate_sfr args {
set controllers_conf(WatchDogTimer) 1
set watchdog_value -$time
- if {$feature_avaliable(wdtcon)} {
+ if {$feature_available(wdtcon)} {
set controllers_conf(WDTEN) 1
set sfr(167) [expr {$sfr(167) | 1}]
if {${::Simulator::reverse_run_steps}} {
@@ -324,7 +333,9 @@ private method evaluate_sfr args {
write_conf 200 {TF2 EXF2 RCLK TCLK EXEN2 TR2 CT2 CPRL2}
# Inform interrupt monitor
- $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ if {$::GUI_AVAILABLE} {
+ $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ }
}
201 { ;# T2MOD 0xC9
write_conf 201 {- - - - - - T2OE DCEN}
@@ -342,7 +353,9 @@ private method evaluate_sfr args {
}]
# Inform interrupt monitor
- $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ if {$::GUI_AVAILABLE} {
+ $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ }
}
183 { ;# IPH 0xB7
evaluate_interrupt_priorities
@@ -354,12 +367,14 @@ private method evaluate_sfr args {
write_conf 170 {SPIF WCOL LDEN - - - DISSO ENH}
# Inform interrupt monitor
- $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ if {$::GUI_AVAILABLE} {
+ $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ }
}
167 { ;# WDTCON/WDTPRG 0xA7
- if {$feature_avaliable(wdtprg)} {
+ if {$feature_available(wdtprg)} {
write_conf 167 {- - - - - PS2 PS1 PS0}
- } {
+ } else {
write_conf 167 {PS2 PS1 PS0 WDIDLE DISRTO HWDT WSWRST WDTEN}
}
set controllers_conf(WatchDogPrescaler) 0
@@ -395,7 +410,7 @@ private method evaluate_sfr args {
if {$controllers_conf(DPS)} {
set DPL {DP1L}
set DPH {DP1H}
- } {
+ } else {
set DPL {DP0L}
set DPH {DP0H}
}
@@ -423,7 +438,7 @@ private method write_conf {addr key_list} {
if {[expr {$sfr($addr) & $mask}] == 0} {
set controllers_conf($key) 0
- } {
+ } else {
set controllers_conf($key) 1
}
}
@@ -499,7 +514,7 @@ private method incr_8b {type addr val} {
private method stack_pop {} {
if {[check_address_validity I $sfr(129)]} {
set result [undefined_octet]
- } {
+ } else {
if {${::Simulator::reverse_run_steps}} {
stepback_reg_change I $sfr(129)
}
@@ -540,7 +555,7 @@ public method stack_push {val} {
}
if {[check_address_validity I $sfr(129)]} {
return
- } {
+ } else {
if {${::Simulator::reverse_run_steps}} {
stepback_reg_change I $sfr(129)
}
@@ -553,3 +568,7 @@ public method stack_push {val} {
evaluate_sfr 129
$this stack_monitor_push $sfr(129) $val
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/engine/engine_memory_management.tcl b/lib/simulator/engine/engine_memory_management.tcl
index acf2978..e3a5828 100755..100644
--- a/lib/simulator/engine/engine_memory_management.tcl
+++ b/lib/simulator/engine/engine_memory_management.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_MEMORY_MANAGEMENT_TCL ] } {
+set _ENGINE_MEMORY_MANAGEMENT_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Part of simulator engine functionality.
@@ -40,11 +45,11 @@ private method getNextOperand {} {
bell
$this sim_txt_output [mc "Incomplete instruction (undefined operand/value missing in memory) at 0x%s" [NumSystem::dec2hex $pc]]
return [undefined_octet]
- } {
+ } else {
if {$code($pc) == {}} {
$this sim_txt_output [mc "Incomplete instruction (undefined operand/value missing in memory) at 0x%s. Using 0FFh as operand !" [NumSystem::dec2hex $pc]]
return 255
- } {
+ } else {
return $code($pc)
}
}
@@ -59,11 +64,11 @@ private method getLastOperand {} {
bell
$this sim_txt_output [mc "Incomplete instruction (undefined operand/value missing in memory) at 0x%s" [NumSystem::dec2hex $pc]]
set result [undefined_octet]
- } {
+ } else {
if {$code($pc) == {}} {
$this sim_txt_output [mc "Incomplete instruction (undefined operand/value missing in memory) at 0x%s. Using 0FFh as operand !" [NumSystem::dec2hex $pc]]
set result 255
- } {
+ } else {
set result $code($pc)
}
}
@@ -92,7 +97,7 @@ public method setBit {addr value} {
if {${::Simulator::reverse_run_steps}} {
if {$regAddr < 128} {
stepback_reg_change I $regAddr
- } {
+ } else {
stepback_reg_change S $regAddr
}
}
@@ -114,7 +119,7 @@ public method setBit {addr value} {
} elseif {([expr {$ram($regAddr) & $mask}] == 0) && $value} {
set ram($regAddr) [expr {$ram($regAddr) ^ $mask}]
}
- } {
+ } else {
set sfr_val [read_sfr $regAddr]
if {([expr {$sfr_val & $mask}] > 0) && !$value} {
write_sfr $regAddr [expr {$sfr_val ^ $mask}]
@@ -125,7 +130,7 @@ public method setBit {addr value} {
if {$regAddr > 127} {
evaluate_sfr $regAddr
- } {
+ } else {
if {$sync_ena} {
$this Simulator_sync_reg $regAddr
}
@@ -161,19 +166,19 @@ public method getBitByReg {regAddr bitNumber} {
if {$regAddr < 0x80} {
if {[expr {$ram($regAddr) & $mask}] == 0} {
return 0
- } {
+ } else {
return 1
}
- } {
- if {[lsearch -ascii -exact $PORT_LATCHES $regAddr] != -1} {
+ } else {
+ if {[lsearch -ascii -exact $PORT_LATCHES $regAddr] != -1} {
set byte [read_sfr $regAddr]
- } {
- set byte $sfr($regAddr)
- }
+ } else {
+ set byte $sfr($regAddr)
+ }
if {[expr {$byte & $mask}] == 0} {
return 0
- } {
+ } else {
return 1
}
}
@@ -187,7 +192,7 @@ public method getRegOfBit {addr} {
if {$addr > 127} {
set reg [expr {$reg * 8}]
- } {
+ } else {
incr reg 32
}
@@ -247,7 +252,9 @@ private method check_address_validity {location address} {
}
internal_shutdown
- $this invalid_addressing_dialog $location $address
+ if {$::GUI_AVAILABLE} {
+ $this invalid_addressing_dialog $location $address
+ }
set address_error 1
return 1
}
@@ -255,8 +262,10 @@ private method check_address_validity {location address} {
## Check if the specified address at the given location is implemented in this MCU
# @parm Char location - Memory type
# D == IDATA direct addressing or SFR
+ # S == SFR only
# I == IDATA indirect addressing (or operations on stack)
# B == Bit area
+ # J == Special Function Bits only
# X == XDATA
# C == CODE
# E == ERAM
@@ -269,7 +278,12 @@ public method simulator_address_range {location address} {
if {$address < 128 && $address < $iram_size} {
return 1
}
- if {[lsearch $avaliable_sfr $address] != -1} {
+ if {[lsearch $available_sfr $address] != -1} {
+ return 1
+ }
+ }
+ {S} { ;# SFR only
+ if {[lsearch $available_sfr $address] != -1} {
return 1
}
}
@@ -286,7 +300,15 @@ public method simulator_address_range {location address} {
if {$reg_addr < 128 && $reg_addr < $iram_size} {
return 1
}
- if {[lsearch $avaliable_sfr $reg_addr] != -1} {
+ if {[lsearch $available_sfr $reg_addr] != -1} {
+ return 1
+ }
+ }
+ {J} { ;# Special Function Bits only
+ if {[lsearch $restricted_bits $address] != -1} {
+ return 0
+ }
+ if {[lsearch $available_sfr [getRegOfBit $address]] != -1} {
return 1
}
}
@@ -316,7 +338,8 @@ public method simulator_address_range {location address} {
## Write value to SFR
# - It does not check address validity !
- # - Purpose is to write zero to unimplemented bits
+ # - Purpose is to write zero to unimplemented bits and handle special funtions
+ # triggered by write to specific SFR
# @parm Int addr - Target address (128..255)
# @parm Int value - New value (0.255)
# @return void
@@ -341,15 +364,15 @@ private method write_sfr {addr value} {
# Interrupts configuration related SFR -- skip next interrupt
if {$addr == $symbol(IP) || $addr == $symbol(IE) || $addr == $symbol(IPH)} {
set skip_interrupt 1
- } {
+ } else {
set skip_interrupt 0
}
# Write specified value into the SFR
- if {[lsearch $incomplite_regs $addr] == -1} {
+ if {[lsearch $incomplete_regs $addr] == -1} {
set sfr($addr) $value
- } {
- set sfr($addr) [expr {$value & $incomplite_regs_mask($addr)}]
+ } else {
+ set sfr($addr) [expr {$value & $incomplete_regs_mask($addr)}]
}
}
@@ -361,7 +384,7 @@ private method write_sfr {addr value} {
private method read_sfr {addr} {
# Port latch
set port_number [lsearch -ascii -exact $PORT_LATCHES $addr]
- if {!$rmw_instruction && $port_number != -1} {
+ if {!$rmw_instruction && $port_number != -1 && [$this pale_is_enabled]} {
set result [$this pale_RRPV $port_number]
# Write only register
@@ -373,15 +396,19 @@ private method read_sfr {addr} {
return [undefined_octet]
# Fully implemeneted register
- } elseif {[lsearch $incomplite_regs $addr] == -1} {
+ } elseif {[lsearch $incomplete_regs $addr] == -1} {
return $sfr($addr)
# Partialy implemented register
- } {
+ } else {
return [expr {
- ($incomplite_regs_mask($addr) & $sfr($addr))
+ ($incomplete_regs_mask($addr) & $sfr($addr))
+
- (($incomplite_regs_mask($addr) ^ 0x0FF) & [undefined_octet])
+ (($incomplete_regs_mask($addr) ^ 0x0FF) & [undefined_octet])
}]
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/engine/engine_opcodes.tcl b/lib/simulator/engine/engine_opcodes.tcl
index 6d43158..e06dc12 100755..100644
--- a/lib/simulator/engine/engine_opcodes.tcl
+++ b/lib/simulator/engine/engine_opcodes.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_OPCODES_TCL ] } {
+set _ENGINE_OPCODES_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Part of simulator engine functionality.
@@ -433,3 +438,7 @@ private method 108 {} {ins_xrl 224 $ram([R 4])} ;# 0x6C :: xrl A, R4
private method 109 {} {ins_xrl 224 $ram([R 5])} ;# 0x6D :: xrl A, R5
private method 110 {} {ins_xrl 224 $ram([R 6])} ;# 0x6E :: xrl A, R6
private method 111 {} {ins_xrl 224 $ram([R 7])} ;# 0x6F :: xrl A, R7
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/engine/engine_text_based_interface.tcl b/lib/simulator/engine/engine_text_based_interface.tcl
new file mode 100644
index 0000000..0b6448c
--- /dev/null
+++ b/lib/simulator/engine/engine_text_based_interface.tcl
@@ -0,0 +1,1087 @@
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# Copyright (C) 2011-2011 by Martin Ošmera #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _ENGINE_TEXT_BASED_INTERFACE_TCL ] } {
+set _ENGINE_TEXT_BASED_INTERFACE_TCL _
+# <<< File inclusion guard
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+#
+# Command line interface for the simulator engine. Listens to simple commands,
+# like `read-sfr-by-name PCON'. Each command must be on separate line, empty
+# lines and everything after `#' characater are ignored. Response to every
+# command is either `DONE' or
+# `ERROR (line: <line_number>; command: <command>): <error_info>'. Some commands
+# returns some values, in that case these values are printed before the `DONE'
+# string. Commands are case insensitive, but the same may not apply for their
+# arguments.
+#
+# Note: This interface is supposed to be available via main.tcl invoked with
+# --simulator option. That means that to access this inteface it should be
+# sufficient to run `mcu8051ide --simulator' command.
+#
+# List of commands:
+# ================
+#
+# COMMAND DESCRIPTION
+# ------- -----------
+# echo-on
+# echo-off
+# set-mcu
+# set-clock
+# set-xcode
+# set-xdata
+# load-code
+# load-code-adf
+# load-code-cdb
+# load-idata
+# load-xdata
+# load-eeprom
+# load-eram
+# dump-code
+# dump-idata
+# dump-xdata
+# dump-eeprom
+# dump-eram
+# write-code
+# write-idata
+# write-xdata
+# write-eeprom
+# write-eram
+# write-sfr
+# write-sfr
+# write-bit
+# read-code
+# read-idata
+# read-xdata
+# read-eeprom
+# read-eram
+# read-sfr
+# read-sfr-by-name
+# read-bit
+# step
+# step-back
+# list-changes
+# read-pc
+# write-pc
+# read-position
+# reset
+# run
+# input
+# output
+# hibernate
+# resume
+# core-dump
+# core-alter
+# exit
+# --------------------------------------------------------------------------
+
+namespace eval SimulatorEngineCLI {
+ variable command_line
+ variable cmd_line_idx
+ variable simulator
+ variable line_counter
+ variable echo
+ variable error_reported
+
+ class SimEngineWrapper {
+ inherit Simulator_ENGINE Pale
+
+ common changed_registers [list]
+
+ # TODO: get rid of these variables:
+ public variable procData {}
+ public variable P_option_mcu_type {}
+ public variable P_option_mcu_xdata 0
+ public variable P_option_mcu_xcode 0
+ public variable projectPath {.}
+
+ public method is_ready {} {
+ if {[llength $procData]} {
+ return 1
+ } else {
+ return 0
+ }
+ }
+
+ public method Simulator_GUI_sync args {
+ lappend changed_registers $args
+ }
+
+ public method Simulator_sync_PC_etc {} {
+ }
+
+ public method get_changed_registers {} {
+ return $changed_registers
+ }
+
+ public method clear_changed_registers {} {
+ set changed_registers [list]
+ }
+ }
+
+ proc enter_main_loop {} {
+ variable command_line
+ variable cmd_line_idx
+ variable simulator
+ variable line_counter 0
+ variable echo 0
+ variable error_reported
+
+ set simulator [SimEngineWrapper #auto]
+
+ namespace eval ::Simulator {
+ variable undefined_value 2
+ variable reverse_run_steps 100
+ }
+
+ namespace eval ::X {
+ variable critical_procedure_in_progress 0
+ }
+
+ puts "READY"
+
+ while {![eof stdin]} {
+ incr line_counter
+ set command_line [gets stdin]
+ set command_line [regsub {#.*$} $command_line {}]
+ set command_line [string trim $command_line]
+ set cmd_line_idx 1
+ set error_reported 0
+
+ if {[catch {
+ set command [string tolower [lindex $command_line 0]]
+ }]} then {
+ set tmp $command_line
+ set command_line {<unknown>}
+ abort_now "Unable to understand line: \"$tmp\""
+ }
+
+ # Do nothing with an empty line
+ if {![string length $command_line]} {
+ continue
+ }
+
+ if {$echo} {
+ puts "> $command_line"
+ }
+ if {[lsearch -ascii -exact {set-mcu echo-on echo-off} $command] == -1 && ![$simulator is_ready]} {
+ report_error "Processor type has to be specified first"
+ continue
+ }
+ if {[command_switch $command]} {
+ break
+ }
+
+ if {!$error_reported} {
+ puts "OK"
+ }
+ }
+ puts "EXITING"
+ }
+
+ proc command_switch {command} {
+ variable echo
+ switch -- $command {
+ {echo-on} {
+ expect_no_more_arguments
+ command__echo_on
+ }
+ {echo-off} {
+ expect_no_more_arguments
+ command__echo_off
+ }
+ {set-mcu} {
+ expect_string
+ expect_no_more_arguments
+
+ command__set_mcu
+ }
+ {set-clock} {
+ expect_integer 1 99999
+ expect_no_more_arguments
+
+ command__set_clock
+ }
+ {set-xcode} {
+ expect_integer 0 65536
+ expect_no_more_arguments
+
+ command__set_xcode
+ }
+ {set-xdata} {
+ expect_integer 0 65536
+ expect_no_more_arguments
+
+ command__set_xdata
+ }
+
+ {load-code} {
+ expect_no_more_arguments
+ command__load_code
+ }
+ {load-code-adf} {
+ expect_string
+ expect_no_more_arguments
+
+ command__load_code_adf
+ }
+ {load-code-cdb} {
+ expect_string
+ expect_string
+ expect_string
+ expect_no_more_arguments
+ command__load_code_cdb
+ }
+ {load-idata} {
+ expect_no_more_arguments
+ command__load_idata
+ }
+ {load-xdata} {
+ expect_no_more_arguments
+ command__load_xdata
+ }
+ {load-eeprom} {
+ expect_no_more_arguments
+ command__load_eeprom
+ }
+ {load-eram} {
+ expect_no_more_arguments
+ command__load_eram
+ }
+
+ {dump-code} {
+ expect_no_more_arguments
+ command__dump_code
+ }
+ {dump-idata} {
+ expect_no_more_arguments
+ command__dump_idata
+ }
+ {dump-xdata} {
+ expect_no_more_arguments
+ command__dump_xdata
+ }
+ {dump-eeprom} {
+ expect_no_more_arguments
+ command__dump_eeprom
+ }
+ {dump-eram} {
+ expect_no_more_arguments
+ command__dump_eram
+ }
+
+ {write-code} {
+ expect_integer 0 65536
+ expect_integer 0 256
+ expect_no_more_arguments
+
+ command__write_code
+ }
+ {write-idata} {
+ expect_integer 0 256
+ expect_integer 0 256
+ expect_no_more_arguments
+
+ command__write_idata
+ }
+ {write-xdata} {
+ expect_integer 0 65536
+ expect_integer 0 256
+ expect_no_more_arguments
+
+ command__write_xdata
+ }
+ {write-eeprom} {
+ expect_integer 0 65536
+ expect_integer 0 256
+ expect_no_more_arguments
+
+ command__write_eeprom
+ }
+ {write-eram} {
+ expect_integer 0 65536
+ expect_integer 0 256
+ expect_no_more_arguments
+
+ command__write_eram
+ }
+ {write-sfr} {
+ expect_integer 128 256
+ expect_integer 0 256
+ expect_no_more_arguments
+
+ command__write_sfr
+ }
+ {write-sfr} {
+ expect_string
+ expect_integer 0 256
+ expect_no_more_arguments
+
+ command__write_sfr_by_name
+ }
+ {write-bit} {
+ expect_integer 0 256
+ expect_integer 0 256
+ expect_no_more_arguments
+
+ command__write_bit
+ }
+
+ {read-code} {
+ expect_integer 0 65536
+ expect_no_more_arguments
+
+ command__read_code
+ }
+ {read-idata} {
+ expect_integer 0 256
+ expect_no_more_arguments
+
+ command__read_idata
+ }
+ {read-xdata} {
+ expect_integer 0 65536
+ expect_no_more_arguments
+
+ command__read_xdata
+ }
+ {read-eeprom} {
+ expect_integer 0 65536
+ expect_no_more_arguments
+
+ command__read_eeprom
+ }
+ {read-eram} {
+ expect_integer 0 65536
+ expect_no_more_arguments
+
+ command__read_eram
+ }
+ {read-sfr} {
+ expect_integer 128 256
+ expect_no_more_arguments
+
+ command__read_sfr
+ }
+ {read-sfr-by-name} {
+ expect_string
+ expect_no_more_arguments
+
+ command__read_sfr_by_name
+ }
+ {read-bit} {
+ expect_integer 0 256
+ expect_no_more_arguments
+
+ command__read_bit
+ }
+
+ {step} {
+ expect_no_more_arguments
+ command__step
+ }
+ {step-back} {
+ expect_no_more_arguments
+ command__step_back
+ }
+
+ {list-changes} {
+ expect_no_more_arguments
+ command__list_changes
+ }
+ {read-pc} {
+ expect_no_more_arguments
+ command__read_pc
+ }
+ {write-pc} {
+ expect_integer 0 65536
+ expect_no_more_arguments
+
+ command__write_pc
+ }
+ {read-position} {
+ expect_no_more_arguments
+ command__read_position
+ }
+ {reset} {
+ expect_no_more_arguments
+ command__reset
+ }
+ {run} {
+ expect_no_more_arguments
+ command__run
+ }
+
+ {input} {
+ expect_integer 0 4
+ expect_no_more_arguments
+
+ command__input
+ }
+ {output} {
+ expect_integer 0 4
+ expect_no_more_arguments
+
+ command__output
+ }
+
+ {hibernate} {
+ expect_string
+ expect_no_more_arguments
+
+ command__hibernate
+ }
+ {resume} {
+ expect_string
+ expect_no_more_arguments
+
+ command__resume
+ }
+
+ {core-dump} {
+ expect_no_more_arguments
+ command__core_dump
+ }
+ {core-alter} {
+ expect_string
+ expect_no_more_arguments
+
+ command__core_alter
+ }
+
+ {exit} {
+ expect_no_more_arguments
+ return 1
+ }
+ default {
+ report_error "Unrecognised command: \"$command\""
+ }
+ }
+ return 0
+ }
+
+ proc abort_now {info} {
+ report_error $info
+ puts "ABORTING"
+ exit 1
+ }
+
+ proc report_error {info} {
+ variable error_reported
+ variable line_counter
+ variable command_line
+
+ set error_reported 1
+ puts stderr "ERROR (line: $line_counter; command: [lindex $command_line 0]): $info"
+ }
+
+ proc expect_no_more_arguments {} {
+ variable command_line
+ variable cmd_line_idx
+
+ if {[llength $command_line] > $cmd_line_idx} {
+ abort_now "Too many aguments given to to command [lindex $command_line 0]"
+ }
+ }
+
+ proc expect_string {{max_length {}}} {
+ variable command_line
+ variable cmd_line_idx
+
+ set arg [lindex $command_line $cmd_line_idx]
+ if {![string length $arg]} {
+ abort_now "Argument missing for command [lindex $command_line 0] at index $cmd_line_idx"
+ } elseif {$max_length != {} && [string length $arg] > $max_length} {
+ abort_now "Agrument given to command [lindex $command_line 0] at index $cmd_line_idx is too long, mimum allowed length is $max_length"
+ }
+ incr cmd_line_idx
+ }
+
+ proc expect_integer {{min {}} {max {}}} {
+ variable command_line
+ variable cmd_line_idx
+
+ set arg [lindex $command_line $cmd_line_idx]
+ if {![string is digit -strict $arg]} {
+ abort_now "Non integer agrument given to command [lindex $command_line 0] at index $cmd_line_idx"
+ } elseif {($min != {} && $arg < $min) || ($max != {} && $arg > $max)} {
+ abort_now "Integer agrument given to command [lindex $command_line 0] at index $cmd_line_idx is out of its allowed range \[$min;$max\]"
+ }
+ incr cmd_line_idx
+ }
+
+ proc load_hex {set_command memory_size} {
+ variable simulator
+
+ set hex_data {}
+
+ while {![eof stdin]} {
+ set line [gets stdin]
+ append hex_data $line "\n"
+
+ # Stop when EOF sequnce is found
+ if {[string range $line 7 8] == {01}} {
+ break
+ }
+ }
+
+ ::IHexTools::free_resources
+ ::IHexTools::load_hex_data $hex_data
+ if {${::IHexTools::error_count}} {
+ report_error ${::IHexTools::error_string}
+ return
+ }
+
+ if {${::IHexTools::highest_addr} >= $memory_size} {
+ report_error "You are attempting to load more data than the memory capacity allows. Capacity: $memory_size; Required: [expr {${::IHexTools::highest_addr} + 1}]"
+ }
+
+ set val {}
+ for {set i 0} {$i < ${::IHexTools::highest_addr}} {incr i} {
+ set val [::IHexTools::get_value $i]
+ if {$val == -1} {
+ set val {}
+ }
+ $simulator $set_command $i $val
+ }
+ for {} {$i < $memory_size} {incr i} {
+ $simulator $set_command $i {}
+ }
+ }
+
+ # ----------------------------------------------------------------------
+ # COMMANDS
+ # ----------------------------------------------------------------------
+
+ proc command__echo_on {} {
+ variable echo 1
+ }
+ proc command__echo_off {} {
+ variable echo 0
+ }
+ proc command__set_mcu {} {
+ variable simulator
+ variable command_line
+
+ set new_processor [string toupper [lindex $command_line 1]]
+
+ if {[lsearch -ascii -exact [SelectMCU::get_available_processors] $new_processor] == -1} {
+ abort_now "Unsupported processor: [lindex $command_line 1]"
+ }
+
+ $simulator configure -P_option_mcu_type $new_processor
+ set proc_data [SelectMCU::get_processor_details $new_processor]
+ if {$proc_data == {}} {
+ abort_now "Internal error"
+ }
+ $simulator configure -procData $proc_data
+
+ $simulator simulator_initialize_mcu
+ }
+ proc command__set_clock {} {
+ variable simulator
+ variable command_line
+
+ $simulator setEngineClock [lindex $command_line 1]
+ }
+ proc command__set_xcode {} {
+ variable simulator
+ variable command_line
+
+ set arg [lindex $command_line 1]
+
+ set icode [expr {[lindex [$simulator cget -procData] 2] * 1024}]
+ if {$arg > (0xFFFF - $icode)} {
+ abort_now "This MCU has CODE memory limit 0x10000 B (65536)"
+ }
+
+ if {[lindex [$simulator cget -procData] 1] != {yes}} {
+ abort_now "This MCU cannot have connected external program memory"
+ } else {
+ $simulator configure -P_option_mcu_xcode $arg
+ $simulator simulator_resize_code_memory $arg
+ }
+ }
+ proc command__set_xdata {} {
+ variable simulator
+ variable command_line
+
+ set arg [lindex $command_line 1]
+ if {[lindex [$simulator cget -procData] 0] != {yes}} {
+ abort_now "This MCU cannot have connected external data memory"
+ } else {
+ $simulator configure -P_option_mcu_xdata $arg
+ $simulator simulator_resize_xdata_memory $arg
+ }
+ }
+ proc command__reset {} {
+ variable simulator
+ $simulator master_reset -
+ }
+
+ proc command__load_code {} {
+ variable simulator
+ variable command_line
+
+ load_hex setCodeDEC [expr {[$simulator cget -P_option_mcu_xcode] + ([lindex [$simulator cget -procData] 2] * 1024)}]
+ }
+
+ proc command__load_code_adf {} {
+ variable simulator
+ variable command_line
+
+ if {[catch {
+ set file [open [lindex $command_line 1] {r}]
+ }]} then {
+ abort_now "Unable to open file: [lindex $command_line 1]"
+ }
+
+ $simulator load_program_from_adf $file
+ foreach filename [$simulator simulator_get_list_of_filenames] {
+ $simulator Simulator_import_breakpoints $filename [list]
+ }
+
+ catch {
+ close $file
+ }
+ }
+ proc command__load_code_cdb {} {
+ variable simulator
+ variable command_line
+
+ set filename [lindex $command_line 1]
+ set cdb_flnm [lindex $command_line 2]
+ set ihx_flnm [lindex $command_line 3]
+
+ set cdb_file {}
+ set ihx_file {}
+
+ if {![file exists $filename]} {
+ report_error "File does not exist: \"$filename\""
+ return
+ }
+
+ if {[catch {
+ set cdb_file [open $cdb_flnm {r}]
+ }]} then {
+ report_error "Cannot open file: \"$cdb_flnm\""
+ return
+ }
+ if {[catch {
+ set ihx_file [open $ihx_flnm {r}]
+ }]} then {
+ catch {close $cdb_file}
+ report_error "Cannot open file: \"$ihx_flnm\""
+ return
+ }
+
+ if {![$simulator load_program_from_cdb $filename $cdb_file $ihx_file]} {
+ report_error ${::IHexTools::error_string}
+ } else {
+ foreach filename [$simulator simulator_get_list_of_filenames] {
+ $simulator Simulator_import_breakpoints $filename [list]
+ }
+ }
+
+ catch {close $cdb_file}
+ catch {close $ihx_file}
+ }
+ proc command__load_idata {} {
+ variable simulator
+ variable command_line
+
+ load_hex setDataDEC [lindex [$simulator cget -procData] 3]
+ }
+ proc command__load_xdata {} {
+ variable simulator
+ variable command_line
+
+ load_hex setXdataDEC [$simulator cget -P_option_mcu_xdata]
+ }
+ proc command__load_eeprom {} {
+ variable simulator
+ variable command_line
+
+ load_hex setEepromDEC [lindex [$simulator cget -procData] 32]
+ }
+ proc command__load_eram {} {
+ variable simulator
+ variable command_line
+
+ load_hex setEramDEC [lindex [$simulator cget -procData] 8]
+ }
+ proc command__dump_code {} {
+ variable simulator
+ variable command_line
+
+ set capacity [expr {[$simulator cget -P_option_mcu_xcode] + ([lindex [$simulator cget -procData] 2] * 1024)}]
+ ::IHexTools::free_resources
+ for {set addr 0} {$addr < $capacity} {incr addr} {
+ ::IHexTools::content [$simulator getCode $addr]
+ }
+ puts -nonewline [::IHexTools::get_hex_data]
+ }
+ proc command__dump_idata {} {
+ variable simulator
+ variable command_line
+
+ set capacity [lindex [$simulator cget -procData] 3]
+ ::IHexTools::free_resources
+ for {set addr 0} {$addr < $capacity} {incr addr} {
+ ::IHexTools::content [$simulator getData $addr]
+ }
+ puts -nonewline [::IHexTools::get_hex_data]
+ }
+ proc command__dump_xdata {} {
+ variable simulator
+ variable command_line
+
+ set capacity [$simulator cget -P_option_mcu_xdata]
+ ::IHexTools::free_resources
+ for {set addr 0} {$addr < $capacity} {incr addr} {
+ ::IHexTools::content [$simulator getXdata $addr]
+ }
+ puts -nonewline [::IHexTools::get_hex_data]
+ }
+ proc command__dump_eeprom {} {
+ variable simulator
+ variable command_line
+
+ set capacity [lindex [$simulator cget -procData] 32]
+ ::IHexTools::free_resources
+ for {set addr 0} {$addr < $capacity} {incr addr} {
+ ::IHexTools::content [$simulator getEeprom $addr]
+ }
+ puts -nonewline [::IHexTools::get_hex_data]
+ }
+ proc command__dump_eram {} {
+ variable simulator
+ variable command_line
+
+ set capacity [lindex [$simulator cget -procData] 8]
+ ::IHexTools::free_resources
+ for {set addr 0} {$addr < $capacity} {incr addr} {
+ ::IHexTools::content [$simulator getEram $addr]
+ }
+ puts -nonewline [::IHexTools::get_hex_data]
+ }
+ proc command__write_code {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+ set val [lindex $command_line 2]
+
+ if {![$simulator simulator_address_range C $addr]} {
+ report_error "Invalid address: $addr"
+ } else {
+ $simulator setCodeDEC $addr $val
+ }
+ }
+ proc command__write_idata {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+ set val [lindex $command_line 2]
+
+ if {![$simulator simulator_address_range I $addr]} {
+ report_error "Invalid I-DATA address: $addr"
+ } else {
+ $simulator setDataDEC $addr $val
+ }
+ }
+ proc command__write_xdata {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+ set val [lindex $command_line 2]
+
+ if {![$simulator simulator_address_range X $addr]} {
+ report_error "Invalid X-DATA address: $addr"
+ } else {
+ $simulator setXdataDEC $addr $val
+ }
+ }
+ proc command__write_eeprom {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+ set val [lindex $command_line 2]
+
+ if {![$simulator simulator_address_range P $addr]} {
+ report_error "Invalid EEPROM address: $addr"
+ } else {
+ $simulator setEepromDEC $addr $val
+ }
+ }
+ proc command__write_eram {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+ set val [lindex $command_line 2]
+
+ if {![$simulator simulator_address_range E $addr]} {
+ report_error "Invalid ERAM address: $addr"
+ } else {
+ $simulator setEramDEC $addr $val
+ }
+ }
+ proc command__write_sfr {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+ set val [lindex $command_line 2]
+
+ if {![$simulator simulator_address_range S $addr]} {
+ report_error "Invalid SFR address: $addr"
+ } else {
+ if {$addr == $::Simulator_ENGINE::symbol(SBUFR)} {
+ set addr $::Simulator_ENGINE::symbol(SBUFT)
+ }
+ $simulator setSfrDEC $addr $val
+ }
+ }
+ proc command__write_sfr_by_name {} {
+ variable simulator
+ variable command_line
+
+ set name [lindex $command_line 1]
+ set val [lindex $command_line 2]
+
+ if {[lsearch -ascii -exact [array names ::Simulator_ENGINE::symbol] [string toupper $name]] == -1} {
+ report_error "Invalid SFR name: $name"
+ } else {
+ set addr $::Simulator_ENGINE::symbol([string toupper $name])
+
+ if {![$simulator simulator_address_range S $addr]} {
+ report_error "Invalid SFR address: $addr"
+ } else {
+ if {$addr == $::Simulator_ENGINE::symbol(SBUFR)} {
+ set addr $::Simulator_ENGINE::symbol(SBUFT)
+ }
+ $simulator setSfrDEC $addr $val
+ }
+ }
+ }
+ proc command__write_bit {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+ set val [lindex $command_line 2]
+
+ if {![$simulator simulator_address_range B $addr]} {
+ report_error "Invalid BIT address: $addr"
+ } else {
+ $simulator setBit $addr
+ }
+ }
+ proc command__read_code {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+
+ if {![$simulator simulator_address_range C $addr]} {
+ report_error "Invalid address: $addr"
+ } else {
+ puts [$simulator getCodeDEC $addr]
+ }
+ }
+ proc command__read_idata {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+
+ if {![$simulator simulator_address_range I $addr]} {
+ report_error "Invalid I-DATA address: $addr"
+ } else {
+ puts [$simulator getDataDEC $addr]
+ }
+ }
+ proc command__read_xdata {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+
+ if {![$simulator simulator_address_range X $addr]} {
+ report_error "Invalid X-DATA address: $addr"
+ } else {
+ puts [$simulator getXdataDEC $addr]
+ }
+ }
+ proc command__read_eeprom {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+
+ if {![$simulator simulator_address_range P $addr]} {
+ report_error "Invalid EEPROM address: $addr"
+ } else {
+ puts [$simulator getEepromDEC $addr]
+ }
+ }
+ proc command__read_eram {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+
+ if {![$simulator simulator_address_range E $addr]} {
+ report_error "Invalid ERAM address: $addr"
+ } else {
+ puts [$simulator getEramDEC $addr]
+ }
+ }
+ proc command__read_sfr {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+
+ if {![$simulator simulator_address_range S $addr]} {
+ report_error "Invalid SFR address: $addr"
+ } else {
+ puts [$simulator getSfrDEC $addr]
+ }
+ }
+ proc command__read_sfr_by_name {} {
+ variable simulator
+ variable command_line
+
+ set name [lindex $command_line 1]
+ set val [lindex $command_line 2]
+
+ if {[lsearch -ascii -exact [array names ::Simulator_ENGINE::symbol] [string toupper $name]] == -1} {
+ report_error "Invalid SFR name: $name"
+ } else {
+ set addr $::Simulator_ENGINE::symbol([string toupper $name])
+
+ if {![$simulator simulator_address_range S $addr]} {
+ report_error "Invalid SFR address: $addr"
+ } else {
+ puts [$simulator getSfrDEC $addr]
+ }
+ }
+ }
+ proc command__read_bit {} {
+ variable simulator
+ variable command_line
+
+ set addr [lindex $command_line 1]
+
+ if {![$simulator simulator_address_range B $addr]} {
+ report_error "Invalid BIT address: $addr"
+ } else {
+ puts [$simulator getBit $addr]
+ }
+ }
+ proc command__step {} {
+ variable simulator
+
+ $simulator clear_changed_registers
+ $simulator step
+ }
+ proc command__step_back {} {
+ variable simulator
+
+ $simulator clear_changed_registers
+ puts [$simulator stepback]
+ }
+ proc command__list_changes {} {
+ variable simulator
+ variable command_line
+
+ puts [$simulator get_changed_registers]
+ }
+ proc command__read_pc {} {
+ variable simulator
+
+ puts [$simulator getPC]
+ }
+ proc command__write_pc {} {
+ variable simulator
+ variable command_line
+
+ $simulator setPC [lindex $command_line 1]
+ }
+ proc command__read_position {} {
+ variable simulator
+ variable command_line
+
+ set pos [$simulator simulator_getCurrentLine]
+ puts "F: \"[$simulator simulator_get_filename [lindex $pos 1]]\""
+ puts "L: [lindex $pos 0]"
+ puts "V: [lindex $pos 2]"
+ puts "B: [lindex $pos 3]"
+ }
+ proc command__run {} {
+ variable simulator
+ $simulator sim_run
+ }
+ proc command__input {} {
+ variable simulator
+ variable command_line
+ # TODO: Complete it
+ }
+ proc command__output {} {
+ variable simulator
+ variable command_line
+ # TODO: Complete it
+ }
+ proc command__hibernate {} {
+ variable simulator
+ variable command_line
+ # TODO: Complete it
+ }
+ proc command__resume {} {
+ variable simulator
+ variable command_line
+ # TODO: Complete it
+ }
+ proc command__core_dump {} {
+ variable simulator
+ variable command_line
+ # TODO: Complete it
+ }
+ proc command__core_alter {} {
+ variable simulator
+ variable command_line
+ # TODO: Complete it
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/engine/engine_virtual_hw_controller.tcl b/lib/simulator/engine/engine_virtual_hw_controller.tcl
index a597e27..a13c9b9 100755..100644
--- a/lib/simulator/engine/engine_virtual_hw_controller.tcl
+++ b/lib/simulator/engine/engine_virtual_hw_controller.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_VIRTUAL_HW_CONTROLLER_TCL ] } {
+set _ENGINE_VIRTUAL_HW_CONTROLLER_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Part of simulator engine functionality.
@@ -39,9 +44,9 @@ private method instruction_cycle {} {
stepback_save_spec
# Execute instruction
- if {$DEBUG} {
+ if {${::DEBUG}} {
$code($pc)
- } {
+ } else {
if {[catch {
$code($pc)
} result]} then {
@@ -50,7 +55,10 @@ private method instruction_cycle {} {
internal_shutdown
incr_pc 1
}
- puts stderr $result
+ # OP code 165d is invalid on 8051
+ if {$code($pc) != 165} {
+ puts stderr ${::errorInfo}
+ }
}
}
@@ -100,9 +108,9 @@ private method instruction_cycle {} {
set rmw_instruction 1
set ports_previous_state [list]
for {set i 0; set addr 128} {$i < 5} {incr i; incr addr 16} {
- if {$feature_avaliable(p$i)} {
+ if {$feature_available(p$i)} {
lappend ports_previous_state $sfr($addr)
- } {
+ } else {
lappend ports_previous_state 0
}
}
@@ -112,7 +120,7 @@ private method instruction_cycle {} {
if {[$this pale_is_enabled]} {
if {$controllers_conf(CEN)} {
anlcmp_controller
- } {
+ } else {
set anlcmp_running 0
$this pale_SLSF $PIN(ANL0) 0
$this pale_SLSF $PIN(ANL1) 0
@@ -120,7 +128,7 @@ private method instruction_cycle {} {
}
# UART controller
- if {$feature_avaliable(uart)} {
+ if {$feature_available(uart)} {
if {($uart_RX_in_progress || $uart_TX_in_progress) && ${::Simulator::reverse_run_steps}} {
stepback_reg_change S $symbol(SBUFR)
stepback_reg_change S $symbol(SBUFT)
@@ -134,9 +142,9 @@ private method instruction_cycle {} {
set intx 1 ;# State of pin INTx
set ext_int 0 ;# Local external interrupt flag
- # Analyze port state
+ # Anylize port state
for {set i -$time} {$i < 0} {incr i} {
- # Determinate value of input pin INTx
+ # Determinate value of input pin INTX
set intx [$this pale_RRPPV $PIN(INT${int_src}) $i]
# Detect falling edge on INTx
@@ -149,7 +157,7 @@ private method instruction_cycle {} {
}
# Just copy inverted value from INTx to IEx
- } {
+ } else {
set ext_int [expr {!$intx}]
}
}
@@ -170,7 +178,7 @@ private method instruction_cycle {} {
if {!$pwm_running} {
set pwm_running 1
$this pale_SLSF $PIN(T1) 3
- } {
+ } else {
# Make backup for affected SFR
if {${::Simulator::reverse_run_steps}} {
stepback_reg_change S $symbol(TL0)
@@ -181,7 +189,7 @@ private method instruction_cycle {} {
# Timer 0 is forced into mode 2 (8-bit autoreload)
# TL1 is incremented after each T0 overflow
incr sfr($symbol(TL0)) $time
- while 1 {
+ while {1} {
if {$sfr($symbol(TL0)) > 255} {
set sfr($symbol(TL0)) [expr {$sfr($symbol(TL0)) - 256 + $sfr($symbol(TH0))}]
# Increment TL1
@@ -199,11 +207,11 @@ private method instruction_cycle {} {
set time_back [expr {256 - $sfr($symbol(TL0))}]
if {$time_back >= 0} {
$this pale_WPBBL $PIN(T1) 0
- } {
+ } else {
$this pale_WPBBL $PIN(T1) $time_back
}
}
- } {
+ } else {
break
}
}
@@ -241,7 +249,7 @@ private method instruction_cycle {} {
$this Simulator_GUI_sync S $symbol(TH0)
}
# Shutdown timer 0
- } {
+ } else {
set timer_0_running 0
}
@@ -263,7 +271,7 @@ private method instruction_cycle {} {
}
}
# Shutdown timer 1
- } {
+ } else {
set timer_1_running 0
}
@@ -282,7 +290,7 @@ private method instruction_cycle {} {
}
# Increment timer 2
- if {$feature_avaliable(t2)} {
+ if {$feature_available(t2)} {
if {$controllers_conf(TR2)} {
if {${::Simulator::reverse_run_steps}} {
stepback_reg_change S $symbol(TL2)
@@ -299,17 +307,21 @@ private method instruction_cycle {} {
$this Simulator_GUI_sync S $symbol(RCAP2H)
}
# Shutdown timer 2
- } {
+ } else {
set timer_2_running 0
}
}
# Manage interrupt monitor
- $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ if {$::GUI_AVAILABLE} {
+ $this interrupt_monitor_intr_flags [simulator_get_active_intr_flags]
+ }
# Adjust stopwatch timer
incr run_statistics(3)
- $this stopwatch_refresh
+ if {$::GUI_AVAILABLE} {
+ $this stopwatch_refresh
+ }
# Manage stack for stepback stack
stepback_save_norm
@@ -343,7 +355,7 @@ private method anlcmp_controller {} {
set sample 1
}
# Normal mode (sample every S4)
- } {
+ } else {
set sample 1
}
# Sample port pins ANL0 and ANL1
@@ -418,7 +430,7 @@ private method timer_controller_2 {} {
}
# Timer 16-bit
- } {
+ } else {
set increment $time
}
@@ -431,11 +443,11 @@ private method timer_controller_2 {} {
# 16-bit timer
if {$timer_2_running && !$controllers_conf(CT2)} {
set increment [expr {$time * 6}]
- } {
+ } else {
set increment 0
}
if {[increment_timer2 $increment 1]} {
- while 1 {
+ while {1} {
set sfr($symbol(TH2)) $sfr($symbol(RCAP2H))
if {![increment_timer2 $sfr($symbol(RCAP2L)) 1]} {
break
@@ -444,7 +456,6 @@ private method timer_controller_2 {} {
}
# Detect transition on external input
- puts "set controllers_conf(T2) [expr {!$controllers_conf(T2)}]"
set controllers_conf(T2) [expr {!$controllers_conf(T2)}]
}
@@ -466,7 +477,7 @@ private method timer_controller_2 {} {
set increment [expr {$increment * 6}]
}
if {[increment_timer2 $increment 1]} {
- while 1 {
+ while {1} {
set sfr($symbol(TH2)) $sfr($symbol(RCAP2H))
if {![increment_timer2 $sfr($symbol(RCAP2L)) 1]} {
break
@@ -518,7 +529,7 @@ private method timer_controller_2 {} {
# Overflow
if {$result == 1} {
- while 1 {
+ while {1} {
set sfr($symbol(TH2)) $sfr($symbol(RCAP2H))
if {![increment_timer2 $sfr($symbol(RCAP2L)) $updown]} {
break
@@ -531,7 +542,7 @@ private method timer_controller_2 {} {
# Underflow
if {!$updown || $result == -1} {
- while 1 {
+ while {1} {
set cur_val [expr {$sfr($symbol(TL2)) + ($sfr($symbol(TH2)) << 8)}]
set min_val [expr {$sfr($symbol(RCAP2L)) + ($sfr($symbol(RCAP2H)) << 8)}]
@@ -559,7 +570,7 @@ private method timer_controller_2 {} {
# 16-bit Auto-reload (DCEN == 0)
} elseif {$timer_2_running} {
if {[increment_timer2 $increment 1]} {
- while 1 {
+ while {1} {
set sfr($symbol(TH2)) $sfr($symbol(RCAP2H))
if {![increment_timer2 $sfr($symbol(RCAP2L)) 1]} {
break
@@ -584,7 +595,7 @@ private method timer_controller_2 {} {
private method increment_timer2 {increment_by updown} {
if {$updown} {
incr sfr($symbol(TL2)) $increment_by
- } {
+ } else {
incr sfr($symbol(TL2)) -$increment_by
}
@@ -637,7 +648,7 @@ private method uart_start_transmission {} {
if {$controllers_conf(UART_M) == 0} {
$this pale_SLSF $PIN(TXD) 2
$this pale_SLSF $PIN(RXD) 1
- } {
+ } else {
$this pale_SLSF $PIN(TXD) 1
}
}
@@ -694,18 +705,18 @@ private method uart_controller {num} {
if {$controllers_conf(UART_M) == 2} {
if {$controllers_conf(SMOD)} {
incr uart_RX_clock [expr {$uart_clock_prescaler / 2}]
- } {
+ } else {
incr uart_RX_clock [expr {$uart_clock_prescaler / 4}]
}
- } {
+ } else {
# Timer 2 overflow
if {$controllers_conf(RCLK)} {
incr uart_RX_clock $timer2_overflow
# Timer 1 overflow
- } {
+ } else {
if {$controllers_conf(SMOD)} {
incr uart_RX_clock $timer1_overflow
- } {
+ } else {
incr uart_RX_clock [expr {$uart_clock_prescaler / 2}]
}
}
@@ -741,7 +752,7 @@ private method uart_controller {num} {
}
# Frame error detection
- if {$feature_avaliable(smod0) && !($uart_RX_shift_reg & 1)} {
+ if {$feature_available(smod0) && !($uart_RX_shift_reg & 1)} {
set controllers_conf(FE) 1
if {$sync_ena} {
$this Simulator_GUI_sync S $symbol(SCON)
@@ -758,7 +769,7 @@ private method uart_controller {num} {
setBit $symbol(RB8) [expr {$uart_RX_shift_reg & 2}]
set sfr($symbol(SBUFR)) [expr {($uart_RX_shift_reg & 0x3FC) >> 2}]
if {$controllers_conf(SM2)} {
- if {$feature_avaliable(euart)} {
+ if {$feature_available(euart)} {
# Check for broadcast address
if {$sfr($symbol(SBUFR)) == ($sfr($symbol(SADEN)) | $sfr($symbol(SADDR)))} {
setBit $symbol(RI) $controllers_conf(RB8)
@@ -766,15 +777,15 @@ private method uart_controller {num} {
} elseif {($sfr($symbol(SBUFR)) & $sfr($symbol(SADEN))) == ($sfr($symbol(SADDR)) & $sfr($symbol(SADEN)))} {
setBit $symbol(RI) $controllers_conf(RB8)
}
- } {
+ } else {
setBit $symbol(RI) $controllers_conf(RB8)
}
- } {
+ } else {
setBit $symbol(RI) 1
}
# Frame error
- if {$feature_avaliable(smod0) && !($uart_RX_shift_reg & 1)} {
+ if {$feature_available(smod0) && !($uart_RX_shift_reg & 1)} {
set controllers_conf(FE) 1
if {$sync_ena} {
$this Simulator_GUI_sync S $symbol(SCON)
@@ -801,7 +812,7 @@ private method uart_controller {num} {
set uart_RX_shift_reg 0x1FE
}
# Mode 1, 2, 3 - Start bit starts reception
- } {
+ } else {
if {![$this pale_RRPPV $PIN(RXD)]} {
set uart_RX_clock 0
set uart_RX_in_progress 1
@@ -845,7 +856,7 @@ private method uart_controller {num} {
incr i
$this pale_WPBBL $PIN(RXD) $bit_to_send $i
$this pale_WPBBL $PIN(TXD) 1 $i
- } {
+ } else {
incr i
$this pale_WPBBL $PIN(TXD) {|} [expr {int($i / 2)}]
$this pale_WPBBL $PIN(RXD) $bit_to_send [expr {int($i / 2)}]
@@ -874,18 +885,18 @@ private method uart_controller {num} {
if {$controllers_conf(UART_M) == 2} {
if {$controllers_conf(SMOD)} {
incr uart_TX_clock [expr {$uart_clock_prescaler / 2}]
- } {
+ } else {
incr uart_TX_clock [expr {$uart_clock_prescaler / 4}]
}
- } {
+ } else {
# Timer 2 overflow
if {$controllers_conf(TCLK)} {
incr uart_TX_clock $timer2_overflow
# Timer 1 overflow
- } {
+ } else {
if {$controllers_conf(SMOD)} {
incr uart_TX_clock $timer1_overflow
- } {
+ } else {
incr uart_TX_clock [expr {$uart_clock_prescaler / 2}]
}
}
@@ -920,7 +931,7 @@ private method uart_controller {num} {
if {$uart_clock_prescaler && $controllers_conf(UART_M)} {
if {$controllers_conf(SMOD)} {
set uart_clock_prescaler [expr {$uart_clock_prescaler % 2}]
- } {
+ } else {
set uart_clock_prescaler [expr {$uart_clock_prescaler % 4}]
}
}
@@ -960,11 +971,11 @@ private method special_timer1_controller_T0_MOD_3 {} {
}
2 { ;# Mode 2 - 8 bit auto-reload counter
incr sfr($TL1) $time
- while 1 {
+ while {1} {
if {$sfr($TL1) > 255} {
set sfr($TL1) [expr {$sfr($TL1) - 256 + $sfr($TH1)}]
incr timer1_overflow
- } {
+ } else {
break
}
}
@@ -988,7 +999,7 @@ private method timer_controller_01 {timer_num} {
set timer_1_running 1
return
}
- } {
+ } else {
if {!$timer_0_running} {
set timer_0_running 1
return
@@ -1014,7 +1025,7 @@ private method timer_controller_01 {timer_num} {
set increment 0
}
}
- } {
+ } else {
set increment $time
# Trigered timer
@@ -1036,7 +1047,7 @@ private method timer_controller_01 {timer_num} {
setBit $symbol(TF1) 1
}
# Increment TL0
- } {
+ } else {
incr sfr($symbol(TL0)) $increment
if {$sfr($symbol(TL0)) > 255} {
set sfr($symbol(TL0)) [expr {$sfr($symbol(TL0)) - 256}]
@@ -1088,14 +1099,14 @@ private method timer_controller_01 {timer_num} {
}
2 { ;# Mode 2 - 8 bit auto-reload counter
incr sfr($TL_addr) $increment
- while 1 {
+ while {1} {
if {$sfr($TL_addr) > 255} {
set sfr($TL_addr) [expr {$sfr($TL_addr) - 256 + $sfr($TH_addr)}]
setBit $symbol(TF${timer_num}) 1
if {$timer_num} {
incr timer1_overflow
}
- } {
+ } else {
break
}
}
@@ -1118,7 +1129,7 @@ private method eeprom_controller {num} {
internal_shutdown
}
- # Fill incomplite bytes with random values
+ # Fill incomplete bytes with random values
set eeprom_prev_new [list]
foreach reg $eeprom_prev {
lappend eeprom_prev_new [lindex $reg 0] [undefined_octet]
@@ -1177,7 +1188,7 @@ private method watchdog_controller {} {
}
if {$controllers_conf(WDTEN)} {
set sfr(167) [expr {$sfr(167) | 1}]
- } {
+ } else {
set sfr(167) [expr {$sfr(167) - 1}]
}
if {$sync_ena} {
@@ -1194,15 +1205,15 @@ private method watchdog_controller {} {
set increment 0
if {$controllers_conf(WatchDogPrescaler)} {
incr wdt_prescaler_val $time
- while 1 {
+ while {1} {
if {$wdt_prescaler_val >= $controllers_conf(WatchDogPrescaler)} {
incr wdt_prescaler_val -$controllers_conf(WatchDogPrescaler)
incr increment
- } {
+ } else {
break
}
}
- } {
+ } else {
set increment $time
}
@@ -1285,7 +1296,9 @@ private method interrupt_handler {IntName vector flag_bit immediately} {
lappend inter_in_p_flags $flag_bit ;# List: Interrupt flags of interrupts which are in progress
# Adjust status bar
- simulator_Sbar [mc "Interrupt PC: 0x%s; line: %s; vector 0x%s " [format %X $pc] [lindex $Line($pc) 0] [format %X $vector]] 1 $this
+ if {$::GUI_AVAILABLE} {
+ simulator_Sbar [mc "Interrupt PC: 0x%s; line: %s; vector 0x%s " [format %X $pc] [lindex $Line($pc) 0] [format %X $vector]] 1 $this
+ }
$this pale_interrupt $vector
# Invoke LCALL to interrupt vector
@@ -1378,14 +1391,14 @@ private method isInterruptActive {IntName} {
}
{PS} { ;# UART & SPI
if {!$controllers_conf(ES)} {return 0}
- if {$feature_avaliable(uart)} {
+ if {$feature_available(uart)} {
if {$controllers_conf(TI)} {
return {35 TI}
} elseif {$controllers_conf(RI)} {
return {35 RI}
}
}
- if {$feature_avaliable(spi) && $controllers_conf(SPIE) && $controllers_conf(SPIF)} {
+ if {$feature_available(spi) && $controllers_conf(SPIE) && $controllers_conf(SPIF)} {
return {35 SPIE}
}
}
@@ -1411,3 +1424,7 @@ private method isInterruptActive {IntName} {
}
return 0
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/hibernate.tcl b/lib/simulator/hibernate.tcl
index c35f4f8..0cd090e 100755..100644
--- a/lib/simulator/hibernate.tcl
+++ b/lib/simulator/hibernate.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 _HIBERNATE_TCL ] } {
+set _HIBERNATE_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Provides program hibernation capability. It ohter words it can save
@@ -59,16 +64,21 @@ class Hibernate {
common mcu_variable ;# Bool: Checkbox variable for "Different processor"
common xdata_variable ;# Int: RadioButton variable for "Different XDATA size"
common md5_variable ;# Bool: Checkbox variable for "Different MD5 hash"
- # Big font for dialog "Program resumption"
- common big_font [font create \
- -family {helvetica} \
- -weight bold -size -35 \
- ]
- # Normal font for dialog "Program resumption"
- common text_font [font create \
- -family {helvetica} \
- -weight bold -size -14 \
- ]
+
+ if {$::GUI_AVAILABLE} {
+ # Big font for dialog "Program resumption"
+ common big_font [font create \
+ -family {helvetica} \
+ -weight bold \
+ -size [expr {int(-35 * $::font_size_factor)}] \
+ ]
+ # Normal font for dialog "Program resumption"
+ common text_font [font create \
+ -family {helvetica} \
+ -weight bold \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ ]
+ }
## PRIVATE
private variable parser ;# Object: Reference to active XML parser
@@ -102,7 +112,7 @@ class Hibernate {
}
if {$for_what == {data}} {
$mem_prg_bar configure -maximum $value
- } {
+ } else {
$stb_prg_bar configure -maximum $value
}
}
@@ -128,15 +138,16 @@ class Hibernate {
}
# Create dialog window
- set win [toplevel .hibernation_progress_dialog -class {Progress dialog} -bg {#EEEEEE}]
+ set win [toplevel .hibernation_progress_dialog -class {Progress dialog} -bg ${::COMMON_BG_COLOR}]
# Create dialog header
- pack [label $win.header \
- -text $header \
- -font [font create \
- -size -17 -weight {bold} \
- -family {helvetica} \
- ] \
+ pack [label $win.header \
+ -text $header \
+ -font [font create \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight {bold} \
+ -family {helvetica} \
+ ] \
] -fill x
# Create progress bar "Memory"
@@ -167,7 +178,7 @@ class Hibernate {
-compound left \
-image ::ICONS::16::button_cancel \
-command {set ::Hibernate::hib_abort 1} \
- ] -padx 10 -fill x
+ ] -pady 5
# Configure dialog window
wm iconphoto $win ::ICONS::16::bar5
@@ -191,15 +202,15 @@ class Hibernate {
public method hibernate_hibernate {filename sourcefile md5 exclude_stepback} {
# Try to open the destination file
if {[catch {
- set file [open $filename w 420]
- }]} {
+ set file [open $filename w 0640]
+ }]} then {
return 0
}
# Determinate depth of stepback stack and size of XDATA memory
if {$exclude_stepback} {
set stacklength 0
- } {
+ } else {
set stacklength [$this simulator_get_SBS_len]
}
set xdata_size [$this cget -P_option_mcu_xdata]
@@ -217,18 +228,18 @@ class Hibernate {
puts -nonewline $file "\tThis is MCU 8051 IDE hibernation data file.\n"
puts -nonewline $file "\tIt does not contain program code, only data.\n\n"
puts -nonewline $file "\tPLEASE DO NOT EDIT THIS FILE MANUALY, BECAUSE\n"
- puts -nonewline $file "\tBAD FORMATING OF THIS FILE WILL LEAD MCU 8051 IDE TO CRASH !\n"
+ puts -nonewline $file "\tBAD FORMATTING OF THIS FILE WILL LEAD MCU 8051 IDE TO CRASH !\n"
puts -nonewline $file "-->\n"
# Write DTD (Document Type Declaration) to the destination file
- if {[file exists "${::LIB_DIRNAME}/../data/m5ihib.dtd"]} {
+ if {[file exists "${::ROOT_DIRNAME}/data/m5ihib.dtd"]} {
if {[catch {
- set dtd [open "${::LIB_DIRNAME}/../data/m5ihib.dtd" r]
- }]} {
+ set dtd [open "${::ROOT_DIRNAME}/data/m5ihib.dtd" r]
+ }]} then {
puts stderr "Unable to open m5ihib.dtd, please check your installation."
} else {
puts -nonewline $file "<!DOCTYPE m5ihib \[\n\n"
- while 1 {
+ while {1} {
if {[eof $dtd]} {
close $dtd
break
@@ -333,7 +344,7 @@ class Hibernate {
# Special function registers
puts -nonewline $file "\t\t<sfr>\n"
puts -nonewline $file "\t\t\t<addresses>\n\t\t\t\t"
- set sfr [$this simulator_get_avaliable_sfr]
+ set sfr [$this simulator_get_available_sfr]
set j 0
foreach addr $sfr {
if {$j > 6} {
@@ -366,7 +377,7 @@ class Hibernate {
## Write content of list of active interrupts
puts -nonewline $file "\t<subprograms count=\"[$this subprograms_get_count]\">\n"
- foreach sub [$this subprograms_get_formated_content] {
+ foreach sub [$this subprograms_get_formatted_content] {
set source [lindex $sub 0]
set target [lindex $sub 1]
set type [lindex $sub 2]
@@ -414,7 +425,7 @@ class Hibernate {
hibernate_close_progress_dialog
if {[catch {close $file}]} {
return 0
- } {
+ } else {
return 1
}
}
@@ -442,12 +453,12 @@ class Hibernate {
# Open hibernation data file
if {[catch {
set file [open $filename {r}]
- }]} {
+ }]} then {
return 1
}
# Show progress dialog
- show_progress_dialog {Resuming hibernated program} 1 1
+ show_progress_dialog [mc "Resuming hibernated program"] 1 1
# Create XML parser object
if {[catch {
@@ -455,12 +466,12 @@ class Hibernate {
-elementstartcommand [list $this hibernate_xml_parser_element] \
-characterdatacommand [list $this hibernate_xml_parser_data] \
]
- }]} {
+ }]} then {
hibernate_close_progress_dialog
tk_messageBox \
-type ok -icon error -parent . \
-title "::xml::parser error" \
- -message "Unknown error occured in XML parser library,\nplease try to reinstall package \"tdom\"."
+ -message "Unknown error occurred in XML parser library,\nplease try to reinstall package \"tdom\"."
return 2
}
@@ -485,7 +496,7 @@ class Hibernate {
# Close the file and free the parser
if {[catch {
close $file
- }]} {
+ }]} then {
set exit_code 1
}
catch {
@@ -500,13 +511,13 @@ class Hibernate {
set interrupts_in_progress [$this simulator_get_interrupts_in_progress_pb]
if {[llength $interrupts_in_progress]} {
simulator_Sbar [mc "Interrupt at vector 0x%s " [format %X [$this intr2vector [lindex $interrupts_in_progress end]]]] 1 $this
- } {
+ } else {
simulator_Sbar {} 0 $this
}
set lineNum [$this simulator_getCurrentLine]
if {$lineNum != {}} {
$this move_simulator_line $lineNum
- } {
+ } else {
$this editor_procedure {} unset_simulator_line {}
}
::X::stepback_button_set_ena [$this simulator_get_SBS_len]
@@ -663,7 +674,7 @@ class Hibernate {
}
if {$source != {} && $target != {} && $type != {}} {
$this subprograms_call $type $source $target
- } {
+ } else {
error "Invalid argument set in tag <step>"
}
}
@@ -680,7 +691,7 @@ class Hibernate {
$this simulator_set_SBS_len $stacklength
progress_dialog_set_max stepback [expr {$stacklength / 10}]
break
- } {
+ } else {
incr i
}
}
@@ -861,7 +872,7 @@ class Hibernate {
set xdata_variable 1
set md5_variable 1
- set win [toplevel .hibernation_bad_file_dialog -class {Error dialog} -bg {#EEEEEE}]
+ set win [toplevel .hibernation_bad_file_dialog -class {Error dialog} -bg ${::COMMON_BG_COLOR}]
set dlg_result 1
set dlg_bits $differences
@@ -931,13 +942,13 @@ class Hibernate {
-compound left \
-image ::ICONS::16::ok \
]
- pack $dlg_ok_but -side left
+ pack $dlg_ok_but -side left -padx 2
pack [ttk::button $button_frame.button_cancel \
-text [mc "Cancel"] \
-command "$this hibernation_cls_dlg 1" \
-compound left \
-image ::ICONS::16::button_cancel \
- ] -side left
+ ] -side left -padx 2
pack $button_frame -side bottom -anchor e -padx 10 -pady 5
# Configure dialog window
@@ -980,7 +991,7 @@ class Hibernate {
# Create text widget for the given message
set text_wdg [text $right_frame.top_text \
-width 0 -height 3 -wrap word -bd 0 \
- -relief flat -bg {#EEEEEE} \
+ -relief flat -bg ${::COMMON_BG_COLOR} \
-font $text_font -cursor left_ptr \
]
$text_wdg insert end $text
@@ -1004,7 +1015,7 @@ class Hibernate {
public method hibernation_chbut_rabut_command {} {
if {$file_variable && $mcu_variable && $xdata_variable && $md5_variable} {
$dlg_ok_but configure -state normal
- } {
+ } else {
$dlg_ok_but configure -state disabled
}
}
@@ -1027,7 +1038,7 @@ class Hibernate {
$this configure -P_option_mcu_xdata $xdata_size
::X::close_hexedit xdata $this
$this simulator_resize_xdata_memory $xdata_size
- } {
+ } else {
set xdata_size 0
}
@@ -1049,3 +1060,7 @@ class Hibernate {
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/interruptmonitor.tcl b/lib/simulator/interruptmonitor.tcl
index 5156382..510b070 100755..100644
--- a/lib/simulator/interruptmonitor.tcl
+++ b/lib/simulator/interruptmonitor.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 _INTERRUPTMONITOR_TCL ] } {
+set _INTERRUPTMONITOR_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements interrupt monitor
@@ -29,33 +34,37 @@
class InterruptMonitor {
## COMMON
common geometry ${::CONFIG(INTR_MON_GEOMETRY)} ;# Last window geometry
- common count 0 ;# Counter of intances
+ common intr_mon_count 0 ;# Counter of intances
common bg_color {#0088FF} ;# Color for highlighted background
# Small header font
- common header_font [font create \
- -size -17 -weight bold \
- -family {helvetica} \
+ common header_font [font create \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
+ -family {helvetica} \
]
# Big header font
- common header_font_big [font create \
- -size -21 -weight bold \
- -family {helvetica} \
+ common header_font_big [font create \
+ -size [expr {int(-21 * $::font_size_factor)}] \
+ -weight bold \
+ -family {helvetica} \
]
# Common label font
- common lbl_font [font create \
- -size -12 \
- -family {helvetica} \
+ common lbl_font [font create \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -family {helvetica} \
]
# Font for value labels
- common val_font [font create \
- -size -12 -weight bold \
- -family {helvetica} \
+ common val_font [font create \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
+ -family {helvetica} \
]
# Font for value labels - underline
- common val_font_under [font create \
- -size -12 -weight bold \
- -family {helvetica} \
- -underline 1 \
+ common val_font_under [font create \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
+ -family {helvetica} \
+ -underline 1 \
]
@@ -74,7 +83,7 @@ class InterruptMonitor {
private variable in_progress_flg {} ;# List: Flags of interrupts which are in progress
private variable intr_priorities {} ;# List: Interrupt flags in order of their priorities (decremental)
private variable pending_flg {} ;# List: Flags of pending interrupts
- private variable avaliable_interrs {} ;# List: Avaliable interrupt flags
+ private variable available_interrs {} ;# List: available interrupt flags
private variable maximum_priority 0 ;# Int: Maximum valid priority
@@ -106,7 +115,7 @@ class InterruptMonitor {
set in_progress_flg {}
set pending_flg {}
set intr_priorities {}
- set avaliable_interrs {}
+ set available_interrs {}
if {[winfo exists $win]} {
destroy $win
@@ -120,22 +129,22 @@ class InterruptMonitor {
set dialog_opened 1
# Create dialog window, main frame and status bar
- set win [toplevel .interrupt_monitor$count -class {Interrupt monitor} -bg {#EEEEEE}]
- incr count
+ set win [toplevel .interrupt_monitor${intr_mon_count} -class {Interrupt monitor} -bg ${::COMMON_BG_COLOR}]
+ incr intr_mon_count
set main_frame [frame $win.main_frame]
set status_bar [label $win.status_bar]
# Create scrollable frames
set in_progress_frame_f [ScrollableFrame $main_frame.in_p \
- -width 300 -areawidth 300 \
+ -width 280 -areawidth 280 \
-yscrollcommand "$main_frame.in_p_scrl set" \
]
set pending_frame_f [ScrollableFrame $main_frame.pending \
- -width 230 -areawidth 230 \
+ -width 250 -areawidth 250 \
-yscrollcommand "$main_frame.pend_scrl set" \
]
set priorities_frame_f [ScrollableFrame $main_frame.prior \
- -width 230 -areawidth 230 \
+ -width 250 -areawidth 250 \
-yscrollcommand "$main_frame.prior_scrl set" \
]
@@ -144,11 +153,11 @@ class InterruptMonitor {
set top_frame_1 [frame $main_frame.top_frame_1]
set top_frame_2 [frame $main_frame.top_frame_2]
foreach num {0 1 2} text {
- {Interrupts in progress}
- {Pending interrupts}
- {Interrupt priorities}
+ "Interrupts in progress"
+ "Pending interrupts"
+ "Interrupt priorities"
} {
- set frame [subst "\$top_frame_${num}"]
+ set frame [subst -nocommands "\$top_frame_${num}"]
pack [ttk::button $frame.expand \
-image ::ICONS::16::add \
-style Flat.TButton \
@@ -163,7 +172,7 @@ class InterruptMonitor {
set_status_tip $frame.collapse [mc "Collapse all"]
pack [label $frame.in_p_lbl \
-font $header_font \
- -text $text \
+ -text [mc $text] \
] -side left -fill x -expand 1
}
@@ -203,7 +212,7 @@ class InterruptMonitor {
# Fill GUI
set maximum_priority [$this simulator_get_max_intr_priority]
- interrupt_monitor_set_avaliable [$this simulator_get_intr_flags]
+ interrupt_monitor_set_available [$this simulator_get_intr_flags]
interrupt_monitor_reevaluate
# Pack main frame and create bottom frame
@@ -217,17 +226,18 @@ class InterruptMonitor {
-command "$this interrupt_monitor_close" \
-image ::ICONS::16::button_cancel \
] -side right -pady 5 -padx 10
- set_status_tip $win.close_but {Close this dialog window}
+ set_status_tip $win.close_but [mc "Close this dialog window"]
# Set window attributes
wm iconphoto $win ::ICONS::16::kcmdf
- wm title $win "[mc {Interrupt monitor}] - [string trim $this {:}] - MCU 8051 IDE"
- wm minsize $win 840 270
+ wm title $win "[mc {Interrupt monitor}] - [$this cget -projectName] - MCU 8051 IDE"
+ wm minsize $win 850 270
if {$geometry != {}} {
+ regsub {\+\d+\+} $geometry {+850+} geometry
wm geometry $win $geometry
}
wm resizable $win 0 1
- wm protocol $win WM_DELETE_WINDOW "$this interrupt_monitor_close"
+ wm protocol $win WM_DELETE_WINDOW [list $this interrupt_monitor_close]
bindtags $win [list $win Toplevel all .]
}
@@ -256,7 +266,7 @@ class InterruptMonitor {
# Enable/Disabled buttons "Invoke this interrupt"
set state [expr {([$this is_frozen]) ? "normal" : "disabled"}]
- foreach flag $avaliable_interrs {
+ foreach flag $available_interrs {
$priorities_frame.[string tolower $flag].secondary.exec_but configure -state $state
}
@@ -291,8 +301,8 @@ class InterruptMonitor {
set in_progress_wdg {}
set in_progress_flg {}
set pending_flg {}
- set intr_priorities $avaliable_interrs
- foreach flag $avaliable_interrs {
+ set intr_priorities $available_interrs
+ foreach flag $available_interrs {
set flag [string tolower $flag]
$priorities_frame.$flag.secondary.exec_but configure -state normal
}
@@ -342,18 +352,18 @@ class InterruptMonitor {
public method interrupt_monitor_collapse_expand {widget} {
if {[winfo ismapped $widget]} {
pack forget $widget
- } {
+ } else {
pack $widget -fill both -padx 2 -pady 2
}
update
}
- ## Set avaliable interrupt flags
+ ## Set available interrupt flags
# @parm List flags - Interrupt flags (e.g. {TF2 CF RI IE0})
# @return void
- private method interrupt_monitor_set_avaliable {flags} {
- # Set avaliable interrupts
- set avaliable_interrs $flags
+ private method interrupt_monitor_set_available {flags} {
+ # Set available interrupts
+ set available_interrs $flags
# Create sub windows in frame "Priorities"
foreach flag_bit $flags {
@@ -374,7 +384,7 @@ class InterruptMonitor {
pack [label $secondary_frame.name \
-text [lindex $intr 3] -pady 0 \
-bg $bg_color -fg white \
- -cursor hand1 -anchor w \
+ -cursor hand2 -anchor w \
] -side left -anchor w -fill x -expand 1
bind $secondary_frame.name <Button-1> \
"$this interrupt_monitor_collapse_expand $primary_frame.tertiary"
@@ -405,7 +415,7 @@ class InterruptMonitor {
set row 2
set col 0
set pri_bits [lindex $intr 2]
- if {[$this get_feature_avaliable iph]} {
+ if {[$this get_feature_available iph]} {
set pri_bits [linsert $pri_bits 0 "[lindex $intr 2]H"]
}
foreach lbl {
@@ -441,7 +451,7 @@ class InterruptMonitor {
e_bit -
p_bit -
f_bit {
- set cursor {hand1}
+ set cursor {hand2}
set is_bit 1
}
}
@@ -514,11 +524,11 @@ class InterruptMonitor {
}
# Adjust value of priority level in each subwindow
- foreach flag_bit $avaliable_interrs {
+ foreach flag_bit $available_interrs {
set pri__clr [get_priority_and_color $flag_bit]
set pri_bits [lindex [get_interrupt_details $flag_bit] 2]
set flag_bit [string tolower $flag_bit]
- if {[$this get_feature_avaliable iph]} {
+ if {[$this get_feature_available iph]} {
lappend pri_bits "${pri_bits}H"
}
@@ -529,14 +539,14 @@ class InterruptMonitor {
if {[lindex $pri__clr 0] == $maximum_priority} {
$priorities_frame.$flag_bit.secondary.up_but \
configure -state disabled
- } {
+ } else {
$priorities_frame.$flag_bit.secondary.up_but \
configure -state normal
}
if {[lindex $pri__clr 0]} {
$priorities_frame.$flag_bit.secondary.down_but \
configure -state normal
- } {
+ } else {
$priorities_frame.$flag_bit.secondary.down_but \
configure -state disabled
}
@@ -556,7 +566,7 @@ class InterruptMonitor {
# Determinate new color
if {[intr_mon_getBit $pri_bit]} {
set color $::Simulator_GUI::on_color
- } {
+ } else {
set color $::Simulator_GUI::off_color
}
@@ -610,7 +620,7 @@ class InterruptMonitor {
foreach flag $new_flag {
if {[winfo exists $pending_frame.[string tolower $flag]]} {
pack forget $pending_frame.[string tolower $flag]
- } {
+ } else {
create_pending_interrupt $flag
}
}
@@ -626,11 +636,11 @@ class InterruptMonitor {
}
# Adjust colors of flag bits
- foreach flag_bit $avaliable_interrs {
+ foreach flag_bit $available_interrs {
# Determinate new color
if {[intr_mon_getBit $flag_bit]} {
set color $::Simulator_GUI::on_color
- } {
+ } else {
set color $::Simulator_GUI::off_color
}
set flag [string tolower $flag_bit]
@@ -654,13 +664,13 @@ class InterruptMonitor {
if {!$dialog_opened} {return}
# Adjust colors of flag bits
- foreach flag_bit $avaliable_interrs {
+ foreach flag_bit $available_interrs {
set ena_bit [lindex [get_interrupt_details $flag_bit] 1]
# Determinate new color
if {[intr_mon_getBit $ena_bit]} {
set color $::Simulator_GUI::on_color
- } {
+ } else {
set color $::Simulator_GUI::off_color
}
@@ -709,7 +719,7 @@ class InterruptMonitor {
pack [label $secondary_frame.name \
-text [lindex $intr 3] -pady 0 \
-bg $bg_color -fg white \
- -cursor hand1 -anchor w \
+ -cursor hand2 -anchor w \
] -side left -anchor w -fill x -padx 3 -expand 1
bind $secondary_frame.name <Button-1> \
"$this interrupt_monitor_collapse_expand $primary_frame.tertiary"
@@ -725,7 +735,7 @@ class InterruptMonitor {
set tertiary_frame [frame $primary_frame.tertiary -bg {#FFFFFF}]
# Priority:
grid [label $tertiary_frame.priority_lbl \
- -pady 0 -text "Priority:" \
+ -pady 0 -text [mc "Priority:"] \
-bg white -font $lbl_font \
] -sticky w -pady 0 -row 0 -column 0
set pri__clr [get_priority_and_color $flag_bit]
@@ -742,7 +752,7 @@ class InterruptMonitor {
set row 2
set col 0
set pri_bits [lindex $intr 2]
- if {[$this get_feature_avaliable iph]} {
+ if {[$this get_feature_available iph]} {
set pri_bits [linsert $pri_bits 0 "[lindex $intr 2]H"]
}
foreach lbl {
@@ -778,7 +788,7 @@ class InterruptMonitor {
e_bit -
p_bit -
f_bit {
- set cursor {hand1}
+ set cursor {hand2}
set is_bit 1
}
}
@@ -864,7 +874,7 @@ class InterruptMonitor {
pack [label $secondary_frame.name \
-text [lindex $intr 3] -pady 0 \
-bg $bg_color -fg white \
- -cursor hand1 -anchor w \
+ -cursor hand2 -anchor w \
] -side left -anchor w -fill x -padx 3 -expand 1
bind $secondary_frame.name <Button-1> \
"$this interrupt_monitor_collapse_expand $primary_frame.tertiary"
@@ -880,7 +890,7 @@ class InterruptMonitor {
set tertiary_frame [frame $primary_frame.tertiary -bg {#FFFFFF}]
# Priority
grid [label $tertiary_frame.priority_lbl \
- -pady 0 -text "Priority:" \
+ -pady 0 -text [mc "Priority:"] \
-bg white -font $lbl_font \
] -sticky w -pady 0 -row 0 -column 0
set pri__clr [get_priority_and_color $flag_bit]
@@ -897,7 +907,7 @@ class InterruptMonitor {
# Vector, Flag bit, Enable bit, Priority bits
set row 2
set pri_bits [lindex $intr 2]
- if {[$this get_feature_avaliable iph]} {
+ if {[$this get_feature_available iph]} {
set pri_bits [linsert $pri_bits 0 "[lindex $intr 2]H"]
}
foreach lbl {
@@ -932,7 +942,7 @@ class InterruptMonitor {
e_bit -
p_bit -
f_bit {
- set cursor {hand1}
+ set cursor {hand2}
set is_bit 1
}
}
@@ -977,13 +987,13 @@ class InterruptMonitor {
# Invoked from:
set row 2
grid [label $tertiary_frame.lbl__$row \
- -text {Invoked from:} -pady 0 \
+ -text [mc "Invoked from:"] -pady 0 \
-bg white -font $lbl_font \
] -sticky w -row $row -column 3 -pady 0 -columnspan 2
incr row
# PC:
grid [label $tertiary_frame.lbl__$row \
- -pady 0 -text { PC:} \
+ -pady 0 -text [mc " PC:"] \
-bg white -font $lbl_font \
] -sticky w -row $row -column 3 -pady 0
grid [label $tertiary_frame.val__$row \
@@ -993,13 +1003,13 @@ class InterruptMonitor {
incr row
# File:
grid [label $tertiary_frame.lbl__$row \
- -pady 0 -text [mc { File:}] \
+ -pady 0 -text [mc " File:"] \
-bg white -font $lbl_font \
] -sticky w -row $row -column 3 -pady 0
set filename [$this filelist_get_simulator_editor_obj]
if {$filename != {}} {
set filename [$filename cget -fullFileName]
- } {
+ } else {
set filename [lindex [$this simulator_get_list_of_filenames] 0]
}
grid [label $tertiary_frame.val__$row \
@@ -1009,7 +1019,7 @@ class InterruptMonitor {
incr row
# Line:
grid [label $tertiary_frame.lbl__$row \
- -pady 0 -text [mc { Line:}] \
+ -pady 0 -text [mc " Line:"] \
-bg white -font $lbl_font \
] -sticky w -row $row -column 3 -pady 0
grid [label $tertiary_frame.val__$row \
@@ -1024,7 +1034,7 @@ class InterruptMonitor {
set wdg [lindex $in_progress_wdg end]
if {$wdg != {}} {
pack $primary_frame -fill x -before $wdg -pady 2
- } {
+ } else {
pack $primary_frame -fill x -pady 2
}
@@ -1244,3 +1254,7 @@ class InterruptMonitor {
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/sfrmap.tcl b/lib/simulator/sfrmap.tcl
index d6d16d2..65e5806 100755..100644
--- a/lib/simulator/sfrmap.tcl
+++ b/lib/simulator/sfrmap.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,14 +21,19 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _SFRMAP_TCL ] } {
+set _SFRMAP_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
-# Implements window showing the map of avaliable special function register
+# Implements window showing the map of available special function register
# --------------------------------------------------------------------------
class SFRMap {
## COMMON
- common count 0 ;# Int: Counter of object instances
+ common sfrmap_count 0 ;# Int: Counter of object instances
## PRIVATE
private variable dialog_opened 0 ;# Bool: Dialog window opened
@@ -46,7 +51,7 @@ class SFRMap {
private variable selected_entry -1 ;# Int: Address of selected entry box in the map
constructor {} {
- incr count
+ incr sfrmap_count
}
destructor {
@@ -63,14 +68,14 @@ class SFRMap {
# Create dialog window
set enabled [$this is_frozen]
- set win [toplevel .sfr_map$count -bg {#FFFFFF} -class {SFR map} -bg {#EEEEEE}]
+ set win [toplevel .sfr_map${sfrmap_count} -bg {#FFFFFF} -class {SFR map} -bg ${::COMMON_BG_COLOR}]
# Create other widgets
create_win_gui
# Configure the window
wm iconphoto $win ::ICONS::16::kcmmemory_S
- wm title $win "Map of SFR area - [string trim $this {:}] - MCU 8051 IDE"
+ wm title $win "[mc {Map of SFR area}] - [$this cget -P_option_mcu_type] - [$this cget -projectName] - MCU 8051 IDE"
wm resizable $win 0 0
wm protocol $win WM_DELETE_WINDOW "$this sfrmap_close_dialog"
bindtags $win [list $win Toplevel all .]
@@ -146,34 +151,29 @@ class SFRMap {
set name [lindex $reg 1]
set row 0
- lappend defined_sfr $addr
-
- switch -- $name {
- {SBUFR} {
- set name_d {SBUF R}
- }
- {SBUFT} {
- set name_d {SBUF T}
- }
- default {
- set name_d $name
- }
+ if {$addr > 255} {
+ continue
}
-
- set n_addr [expr {$addr & 0x0FF}]
- if {$addr > 0xFF} {
- set row 1
+ if {$name == {SBUFR} || $name == {SBUFT}} {
+ set name {SBUF}
}
if {!($addr % 8)} {
set fg {#00DDDD}
- } {
+ } else {
set fg {#0000DD}
}
- $main_frame.cell_$n_addr configure -bg {#FFFFFF}
- grid [label $main_frame.lbl_${addr} \
- -text $name_d -bg {#FFFFFF} -fg $fg \
- ] -in $main_frame.cell_$n_addr -sticky nsw -row $row -column 0
+ $main_frame.cell_$addr configure -bg {#FFFFFF}
+ pack [label $main_frame.lbl_${addr} \
+ -text $name -bg {#FFFFFF} -fg $fg \
+ ] -in $main_frame.cell_$addr -side left
+
+ grid columnconfigure $main_frame.cell_$addr 0 -weight 1
+ if {$name == {SBUF}} {
+ continue
+ }
+ lappend defined_sfr $addr
+
set entry [ttk::entry $main_frame.ent_${addr} \
-validatecommand "$this sfrmap_validate $addr h %P m" \
-style Simulator_WhiteBg.TEntry \
@@ -182,30 +182,11 @@ class SFRMap {
-width 3 \
-font ${::Simulator_GUI::entry_font} \
]
- grid $entry -in $main_frame.cell_$n_addr -padx 1 -pady 1 -row $row -column 1 -sticky nse
+ pack $entry -in $main_frame.cell_$addr -side right
$entry insert end [$this getSfr $addr]
if {!$enabled} {
$entry configure -state disabled
}
- if {$row} {
- foreach widget [list \
- $main_frame.lbl_${addr} $main_frame.lbl_${n_addr} \
- $main_frame.ent_${addr} $main_frame.ent_${n_addr} \
- ] {
- catch {$widget configure -highlightthickness 0}
- catch {$widget configure -pady 0}
- catch {$widget configure -bd 0}
-
- $widget configure -font [font create -family $::DEFAULT_FIXED_FONT -size -3]
- grid configure $widget -pady 0 -ipady 0
- }
- foreach widget [list $main_frame.lbl_${addr} $main_frame.lbl_${n_addr}] {
- $widget configure -pady 0
- }
- grid rowconfigure $main_frame.cell_$n_addr 0 -pad 0
- grid rowconfigure $main_frame.cell_$n_addr 1 -pad 0
- }
- grid columnconfigure $main_frame.cell_$n_addr 0 -weight 1
bindtags $entry [list $entry TEntry $win all .]
bind $entry <Motion> {help_window_show %X %Y+30}
@@ -500,13 +481,13 @@ class SFRMap {
set enabled $bool
if {$bool} {
set bool {normal}
- } {
+ } else {
set bool {disabled}
}
foreach entry [list $det_hex $det_oct $det_bin $det_dec] {
$entry configure -state $bool
}
- foreach addr [$this simulator_get_avaliable_sfr] {
+ foreach addr $defined_sfr {
$main_frame.ent_${addr} configure -state $bool
}
}
@@ -521,3 +502,7 @@ class SFRMap {
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/simulator.tcl b/lib/simulator/simulator.tcl
index 06ce985..8804022 100755..100644
--- a/lib/simulator/simulator.tcl
+++ b/lib/simulator/simulator.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 _SIMULATOR_TCL ] } {
+set _SIMULATOR_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements 8051 Simulator environment.
@@ -38,14 +43,14 @@
source "${::LIB_DIRNAME}/simulator/engine/engine_core.tcl" ;# Simulator engine
source "${::LIB_DIRNAME}/simulator/simulator_gui.tcl" ;# Simulator panel
source "${::LIB_DIRNAME}/simulator/interruptmonitor.tcl" ;# Interrupt monitor
-source "${::LIB_DIRNAME}/simulator/virtual_uart_term.tcl" ;# Virtual UART Terminal
+source "${::LIB_DIRNAME}/simulator/uart_monitor.tcl" ;# UART monitor
source "${::LIB_DIRNAME}/simulator/sfrmap.tcl" ;# SFR Map monitor
source "${::LIB_DIRNAME}/simulator/stopwatch.tcl" ;# Stopwatch
source "${::LIB_DIRNAME}/simulator/bitmap.tcl" ;# Map of bit addressable area
source "${::LIB_DIRNAME}/simulator/stackmonitor.tcl" ;# Stack monitor
class Simulator {
- inherit Simulator_GUI Simulator_ENGINE InterruptMonitor SFRMap Stopwatch BitMap StackMonitor VirtualUartTerminal
+ inherit Simulator_GUI Simulator_ENGINE InterruptMonitor SFRMap Stopwatch BitMap StackMonitor UARTMonitor
## COMMON
common highlight_color {#DD8800} ;# Foreground color for changed registers
@@ -68,6 +73,7 @@ class Simulator {
common ignore_invalid_USB 0 ;# Bool: Ignore "UART: Frame discarded"
common ignore_invalid_UMC 0 ;# Bool: Ignore "UART mode has been changed while UART was engaged"
common ignore_invalid_TMC 0 ;# Bool: Ignore "Timer mode has been changed while timer was running"
+ common ignore_invalid_brkpoints 0 ;# Bool: Do not warn user about invalid (unreachable) breakpoints
common ignore_EEPROM_WR_fail 0 ;# Bool: Ignore EEPROM write failure (due to EECON.WRTINH, EECON.RDYBSY or EECON.EEMWE)
common ignore_EEPROM_WR_abort 0 ;# Bool: Ignore EEPROM write cycle abort
@@ -75,21 +81,26 @@ class Simulator {
# Normal font for error dialog
common error_normal_font [font create \
- -family {helvetica} -size -14 \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
]
# Bold font for error dialog
common error_bold_font [font create \
-family $::DEFAULT_FIXED_FONT \
- -size -14 \
+ -size [expr {int(-14 * $::font_size_factor)}] \
-weight bold \
]
# Header font for error dialog
common error_header_font [font create \
- -family {helvetica} -size -17 -weight bold \
+ -family {helvetica} \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
]
# Main header font
common error_main_header [font create \
- -family {helvetica} -size -20 -weight bold \
+ -family {helvetica} \
+ -size [expr {int(-20 * $::font_size_factor)}] \
+ -weight bold \
]
## PRIVATE
@@ -98,7 +109,7 @@ class Simulator {
private variable error_dialog_textwdg ;# Widget: Text widget used in error dialog
private variable addr_error_save_type ;# Type of file to save
- # Bool: Related to warnings dialogs
+ # Bool: Related to warnings dialogues
private variable ignore_warnings_related_to_changes_in_SFR 0
## Obejct constructor
@@ -113,20 +124,22 @@ class Simulator {
# Get new and old value of Program Counter
set new_val [getPC]
- set original_val [subst "\$::Simulator_GUI::ENV${obj_idx}_PC_dec"]
+ set original_val [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_PC_dec"]
# Display new value of PC and highlight it if it has changed
set ::Simulator_GUI::ENV${obj_idx}_PC_dec $new_val
- if {$highlight_ena && ($original_val != $new_val)} {
- mark_entry PC
+ if {$original_val != $new_val} {
+ if {$highlight_ena} {
+ mark_entry PC
+ }
$this sim_eval_PC dec $new_val
}
- # Mode program pointer in code mememory hexeditor
+ # Mode program pointer in code mememory hex editor
::X::program_counter_changed $this $new_val
# Synchronize Watchdog
- if {[$this get_feature_avaliable wtd]} {
+ if {[$this get_feature_available wtd]} {
set val [format %X [$this simulator_getWatchDogTimerValue]]
set len [string length $val]
if {$len != 4} {
@@ -136,7 +149,7 @@ class Simulator {
$this simulator_evaluate_wtd_onoff_switch
$this watchdog_validate $val
- if {[$this get_feature_avaliable wdtcon] || [$this get_feature_avaliable wdtprg]} {
+ if {[$this get_feature_available wdtcon] || [$this get_feature_available wdtprg]} {
set val [format %X [$this simulator_getWatchDogPrescalerValue]]
if {[string length $val] == 1} {
set val "0$val"
@@ -206,7 +219,6 @@ class Simulator {
# @parm Int addr - address of register to synchronize
# @return void
public method Simulator_GUI_sync {type addr} {
-
# Internal RAM
if {$type == {I}} {
# Get new and old value
@@ -247,7 +259,7 @@ class Simulator {
# Synchronize with C variables view
if {$addr < 128} {
$this cvarsview_sync E $addr
- } {
+ } else {
$this cvarsview_sync G $addr
}
@@ -279,10 +291,10 @@ class Simulator {
# Determinate boolean value of the bit
if {$psw == 0} {
set bool 0
- } {
+ } else {
if {[expr {$psw & $mask}] > 0} {
set bool 1
- } {
+ } else {
set bool 0
}
}
@@ -293,7 +305,7 @@ class Simulator {
# Take care of bit color
if {$bool} {
$Simulator_panel_parent._PSW_$bit configure -fg $on_color
- } {
+ } else {
$Simulator_panel_parent._PSW_$bit configure -fg $off_color
}
}
@@ -364,16 +376,16 @@ class Simulator {
134 {set regName {SPDR} }
150 {set regName {EECON} }
143 {
- if {[$this get_feature_avaliable ckcon]} {
+ if {[$this get_feature_available ckcon]} {
set regName {CKCON}
- } {
+ } else {
set regName {CLKREG}
}
}
167 {
- if {[$this get_feature_avaliable wdtprg]} {
+ if {[$this get_feature_available wdtprg]} {
set regName {WDTPRG}
- } {
+ } else {
set regName {WDTCON}
}
}
@@ -393,7 +405,7 @@ class Simulator {
# Synchronize with simulator control panel
if {$name_resolved} {
- set original_val [subst "\$::Simulator_GUI::ENV${obj_idx}_${regName}"]
+ set original_val [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_${regName}"]
set ::Simulator_GUI::ENV${obj_idx}_${regName} $new_val
if {$highlight_ena && ($original_val != $new_val)} {
@@ -410,7 +422,7 @@ class Simulator {
set ::Simulator_GUI::ENV${obj_idx}_SFR(FE) $bit_FE
if {$bit_FE} {
$Simulator_panel_parent._SCON_FE configure -fg $::Simulator_GUI::on_color
- } {
+ } else {
$Simulator_panel_parent._SCON_FE configure -fg $::Simulator_GUI::off_color
}
}
@@ -418,7 +430,7 @@ class Simulator {
if {[$this sim_engine_get_SM0]} {
$Simulator_panel_parent._SCON_SM0 configure -fg $::Simulator_GUI::on_color
set ::Simulator_GUI::ENV${obj_idx}_SFR(SM0) 1
- } {
+ } else {
$Simulator_panel_parent._SCON_SM0 configure -fg $::Simulator_GUI::off_color
set ::Simulator_GUI::ENV${obj_idx}_SFR(SM0) 0
}
@@ -477,7 +489,7 @@ class Simulator {
}
# Synchronize SFR
- foreach addr [simulator_get_avaliable_sfr] {
+ foreach addr [simulator_get_available_sfr] {
Simulator_GUI_sync S $addr
}
}
@@ -517,7 +529,7 @@ class Simulator {
# @return void
public method simulator_clear_highlight {} {
simulator_hexeditor clearHighlighting
- foreach addr [simulator_get_avaliable_sfr] {
+ foreach addr [simulator_get_available_sfr] {
unmark_entry $addr
}
foreach addr {R0 R1 R2 R3 R4 R5 R6 R7} {
@@ -551,7 +563,7 @@ class Simulator {
foreach wdg $widgets($addr) {
if {[winfo class $wdg] == {TEntry}} {
$wdg configure -style Simulator_HG.TEntry
- } {
+ } else {
$wdg configure -fg $highlight_color
}
}
@@ -567,7 +579,7 @@ class Simulator {
foreach wdg $widgets($addr) {
if {[winfo class $wdg] == {TEntry}} {
$wdg configure -style Simulator.TEntry
- } {
+ } else {
$wdg configure -fg $normal_color
}
}
@@ -599,7 +611,7 @@ class Simulator {
if {$addr_dec > 127} {
set memory {special function registers area}
set mem {SFR}
- } {
+ } else {
set mem {IDATA}
set memory {internal data memory}
}
@@ -631,7 +643,7 @@ class Simulator {
}
# Create dialog window
- set win [toplevel .undefined_result -class {Error dialog} -bg {#EEEEEE}]
+ set win [toplevel .undefined_result -class {Error dialog} -bg ${::COMMON_BG_COLOR}]
# Create dialog header
set top_frame [frame $win.top_frame]
@@ -648,7 +660,7 @@ class Simulator {
set text_wdg [text $middle_frame.text \
-height 0 -width 0 -font $error_normal_font \
-yscrollcommand "$middle_frame.scrollbar set" \
- -wrap word -relief flat -bg {#EEEEEE} \
+ -wrap word -relief flat -bg ${::COMMON_BG_COLOR} \
-tabstyle wordprocessor \
]
set error_dialog_textwdg $text_wdg
@@ -665,13 +677,13 @@ class Simulator {
-compound left \
-text [mc "Save as plain text"] \
-command "$this simulator_addr_error_save T" \
- ] -side left
+ ] -side left -padx 2
pack [ttk::button $bottom_frame.save_as_xhtml \
-image ::ICONS::16::html \
-compound left \
-text [mc "Save as XHTML"] \
-command "$this simulator_addr_error_save X" \
- ] -side left
+ ] -side left -padx 2
pack [ttk::button $bottom_frame.ok \
-image ::ICONS::16::ok \
-compound left \
@@ -712,7 +724,7 @@ class Simulator {
$text_wdg insert end [$this editor_procedure {} cget -filename]
$text_wdg insert end [mc "\n\tProject:\t\t"]
$text_wdg tag add tag_bold {insert linestart} insert
- $text_wdg insert end [string trim $this {:}]
+ $text_wdg insert end [$this cget -projectName]
# Processor details
$text_wdg insert end [mc "\n\nProcessor details:"]
@@ -742,7 +754,7 @@ class Simulator {
pack [checkbutton $win.not_again_checkbutton \
-text [mc "Do not show this dialog again"] \
-variable ::Simulator::not_again_val \
- -command "::configDialogs::simulator::set_variable $conf_variable \$::Simulator::not_again_val" \
+ -command "::configDialogues::simulator::set_variable $conf_variable \$::Simulator::not_again_val" \
] -anchor w -padx 15 -pady 5
DynamicHelp::add $win.not_again_checkbutton \
-text [mc "See simulator configuration dialog\nMain Menu -> Configure -> Simulator"]
@@ -753,7 +765,7 @@ class Simulator {
focus -force $bottom_frame.ok
wm title $win [mc "Undefined result - MCU 8051 IDE"]
wm iconphoto $win ::ICONS::16::no
- wm minsize $win 450 400
+ wm minsize $win 470 400
wm protocol $win WM_DELETE_WINDOW "
grab release $win
destroy $win
@@ -775,16 +787,16 @@ class Simulator {
set error_dialog_project $this
if {$type == {T}} {
set init {error.log}
- set filetypes {
- {{Log files} {*.log} }
- {{All files} {*} }
- }
- } {
+ set filetypes [list \
+ [list [::mc "Log files"] {*.log}] \
+ [list [::mc "All files"] {*}] \
+ ]
+ } else {
set init {error.html}
- set filetypes {
- {{XHTML files} {*.html}}
- {{All files} {*} }
- }
+ set filetypes [list \
+ [list [::mc "HTML files"] {*.html}] \
+ [list [::mc "All files"] {*}] \
+ ]
}
# Invoke the file selection dialog
@@ -803,8 +815,8 @@ class Simulator {
if {![regexp "^(~|/)" $filename]} {
set filename "[${::Simulator::error_dialog_project} cget -ProjectDir]/$filename"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $filename]} {
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $filename]} {
set filename [file join [${::Simulator::error_dialog_project} cget -ProjectDir] $filename]
}
}
@@ -875,7 +887,7 @@ class Simulator {
puts -nonewline $file [line_wrap 70 [$error_dialog_textwdg get 1.0 end]]
## SAVE AS XHTML
- } {
+ } else {
# Local variables
set end [$error_dialog_textwdg index end] ;# Widget end index
set last_index 0 ;# Current position (by characters)
@@ -949,7 +961,7 @@ class Simulator {
# Deterinate string to insert
if {[lindex $range 2]} {
set tag [lindex $range 1]
- } {
+ } else {
set tag "/[lindex $range 1]"
}
@@ -978,7 +990,7 @@ class Simulator {
## Invoke simulator warning dialog "UART: Frame discarded"
# @parm Int pc - Value of program counter
- # @parm Int line - Line in source code where this error occured
+ # @parm Int line - Line in source code where this error occurred
# @return void
public method simulator_uart_invalid_stop_bit {pc line} {
if {$ignore_warnings_related_to_changes_in_SFR || ![$this sim_is_busy]} {
@@ -990,12 +1002,12 @@ class Simulator {
simulator_warning_dialog \
ignore_invalid_USB \
- [mc "UART: Frame discarded (acording to MCS-51 manual)\n"] $pc $line
+ [mc "UART: Frame discarded (according to MCS-51 manual)\n"] $pc $line
}
## Invoke simulator warning dialog "UART mode has been changed while UART was engaged"
# @parm Int pc - Value of program counter
- # @parm Int line - Line in source code where this error occured
+ # @parm Int line - Line in source code where this error occurred
# @return void
public method simulator_invalid_uart_mode_change {pc line} {
if {$ignore_warnings_related_to_changes_in_SFR || ![$this sim_is_busy]} {
@@ -1012,7 +1024,7 @@ class Simulator {
## Invoke simulator warning dialog "Timer mode has been changed while timer was running"
# @parm Int pc - Value of program counter
- # @parm Int line - Line in source code where this error occured
+ # @parm Int line - Line in source code where this error occurred
# @parm Int timer - Timer number (0/1/2)
# @return void
public method simulator_invalid_timer_mode_change {timer pc line} {
@@ -1030,7 +1042,7 @@ class Simulator {
## Invoke watchdog reset dialog
# @parm Int pc - Value of program counter
- # @parm Int line - Line in source code where this error occured
+ # @parm Int line - Line in source code where this error occurred
# @return void
public method simulator_watchdog_reset {pc line} {
if {$line == {}} {
@@ -1045,7 +1057,7 @@ class Simulator {
## Invokes dialog "Stack Overflow" / "Stack underflow"
# @parm String type - {over} == overflow; {under} == underflow
# @parm Int pc - Value of program counter
- # @parm Int line - Line in source code where this error occured
+ # @parm Int line - Line in source code where this error occurred
# @return void
public method simulator_stack_warning {type pc line} {
if {$line == {}} {
@@ -1054,7 +1066,7 @@ class Simulator {
if {$type == {over}} {
set foo {overflow}
set conf_variable {ignore_stack_overflow}
- } {
+ } else {
set foo {underflow}
set conf_variable {ignore_stack_underflow}
}
@@ -1066,7 +1078,7 @@ class Simulator {
## Invoke dialog "Invalid instruction OP code"
# @parm Int pc - Value of program counter
- # @parm Int line - Line in source code where this error occured
+ # @parm Int line - Line in source code where this error occurred
# @return void
public method simulator_invalid_instruction {pc line} {
$this simulator_warning_dialog \
@@ -1078,7 +1090,7 @@ class Simulator {
## Invoke dialog "Reading from write-only register"
# @parm Int addr - Register address
# @parm Int pc - Value of program counter
- # @parm Int line - Line in source code where this error occured
+ # @parm Int line - Line in source code where this error occurred
# @return void
public method simulator_reading_wr_only {addr pc line} {
if {$line == {}} {
@@ -1090,9 +1102,9 @@ class Simulator {
[mc "Unable to read write-only register.\nRandom value returned.\n\nRegister:\t\t0x%s" [format %X $addr]] $pc $line
}
- ## Invoke dialog "EEPROM programing cycle abort"
+ ## Invoke dialog "EEPROM programming cycle abort"
# @parm Int pc - Value of program counter
- # @parm Int line - Line in source code where this error occured
+ # @parm Int line - Line in source code where this error occurred
# @return void
public method simulator_EEPROM_WR_abort {pc line} {
if {$line == {}} {
@@ -1106,7 +1118,7 @@ class Simulator {
## Invoke dialog "EEPROM write failed"
# @parm Int pc - Value of program counter
- # @parm Int line - Line in source code where this error occured
+ # @parm Int line - Line in source code where this error occurred
# @return void
public method simulator_EEPROM_WR_fail {pc line} {
if {$line == {}} {
@@ -1115,12 +1127,12 @@ class Simulator {
simulator_warning_dialog \
ignore_EEPROM_WR_fail \
- [mc "Unable to initialize EEPROM programing cycle\nbecause EEMWE, RDYBSY and WRTINH must be set\n"] $pc $line
+ [mc "Unable to initialize EEPROM programming cycle\nbecause EEMWE, RDYBSY and WRTINH must be set\n"] $pc $line
}
## Invoke dialog "Invalid return from interrupt"
# @parm Int pc - Value of program counter
- # @parm Int line - Line in source code where this error occured
+ # @parm Int line - Line in source code where this error occurred
# @return void
public method simulator_invalid_reti_dlg {pc line} {
if {$line == {}} {
@@ -1136,7 +1148,7 @@ class Simulator {
# @parm String conf_variable - Configuration variable for disabling this dialog
# @parm String text - Text to show
# @parm Int pc - Value of program counter
- # @parm List line - Line in source code where this error occured
+ # @parm List line - Line in source code where this error occurred
# @return void
public method simulator_warning_dialog {conf_variable text pc line} {
@@ -1145,7 +1157,7 @@ class Simulator {
if {[winfo exists $win]} {
destroy $win
}
- toplevel $win -class {Error dialog} -bg {#EEEEEE}
+ toplevel $win -class {Error dialog} -bg ${::COMMON_BG_COLOR}
## Create dialog icon and text
set top_frame [frame $win.top_frame]
@@ -1166,7 +1178,7 @@ class Simulator {
pack [checkbutton $bottom_frame.not_again_checkbutton \
-text [mc "Do not show this dialog again"] \
-variable ::Simulator::not_again_val \
- -command "::configDialogs::simulator::set_variable $conf_variable \$::Simulator::not_again_val" \
+ -command "::configDialogues::simulator::set_variable $conf_variable \$::Simulator::not_again_val" \
] -anchor w -side left -anchor w
DynamicHelp::add $bottom_frame.not_again_checkbutton \
-text [mc "See simulator configuration dialog\nMain Menu -> Configure -> Simulator"]
@@ -1199,4 +1211,21 @@ class Simulator {
}
tkwait window $win
}
+
+ ## Detect all invalid breakpoints (breakpoints at unreachable locations) and report them via messages panel
+ # @return void
+ public method report_invalid_breakpoints {} {
+ if {$ignore_invalid_brkpoints} {
+ return
+ }
+
+ $this messages_text_append "\n"
+ foreach fn_ln [$this simulator_getInvalidBreakpoints] {
+ $this messages_text_append "[file tail [$this simulator_get_filename [lindex $fn_ln 0]]]:[lindex $fn_ln 1]: warning: Invalid breakpoint"
+ }
+ }
+}
+
+# >>> File inclusion guard
}
+# <<< File inclusion guard
diff --git a/lib/simulator/simulator_gui.tcl b/lib/simulator/simulator_gui.tcl
index ddaba65..9ae70b9 100755..100644
--- a/lib/simulator/simulator_gui.tcl
+++ b/lib/simulator/simulator_gui.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,9 +21,14 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _SIMULATOR_GUI_TCL ] } {
+set _SIMULATOR_GUI_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
-# Provides graphical frontend for simulator engine (intended to be
+# Provides graphical front-end for simulator engine (intended to be
# used at the bottom panel). This class is part of class Simulator.
# --------------------------------------------------------------------------
@@ -35,33 +40,47 @@
class Simulator_GUI {
## COMMON
- common count 0 ;# Counter of instances
+ common sim_gui_count 0 ;# Counter of instances
common name_color {#0000DD} ;# Color for register name labels (eg. 'SP')
common name_nr_color {#8800DD} ;# Color for not-register name labels (eg. 'Clock')
- common on_color {green} ;# Foreground color for bits in state 1 (for bit maps)
- common off_color {red} ;# Foreground color for bits in state 0 (for bit maps)
+ common on_color {#00CC00} ;# Foreground color for bits in state 1 (for bit maps)
+ common off_color {#DD0000} ;# Foreground color for bits in state 0 (for bit maps)
# Font for bit labels (eg. 'EA')
- common bitfont [font create \
- -family {helvetica} \
- -size -11 \
- -weight bold]
+ common bitfont [font create \
+ -family {helvetica} \
+ -size [expr {int(-11 * $::font_size_factor)}] \
+ -weight [expr {$::MICROSOFT_WINDOWS ? "normal" : "bold"}] \
+ ]
# Same as $bitfont but underlined
- common bitfont_under [font create \
- -family {helvetica} \
- -size -11 -underline 1 \
- -weight bold]
+ common bitfont_under [font create \
+ -family {helvetica} \
+ -size [expr {int(-11 * $::font_size_factor)}] \
+ -underline 1 \
+ -weight [expr {$::MICROSOFT_WINDOWS ? "normal" : "bold"}] \
+ ]
# Color for small labels (eg. 'HEX')
common small_color {#5599BB}
# Font for small labels (eg. 'OCT')
- common smallfont $::smallfont
+ common smallfont $::smallfont
+ if {$::MICROSOFT_WINDOWS} { ;# On MS Windows we need some smaller font to fit in
+ set smallfont [font create \
+ -size [expr {int(-9 * $::font_size_factor)}] \
+ -family {helvetica} \
+ -weight normal \
+ ]
+ }
common hcolor {#FFAA00} ;# Highlight foreground color for entry widgets
common hbcolor {#CCCCCC} ;# Highlight background color for entry widgets
# Font for other memory entries (eg. PCON)
- common entry_font [font create -size -12 -family $::DEFAULT_FIXED_FONT -weight bold]
+ common entry_font [font create \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -family $::DEFAULT_FIXED_FONT \
+ -weight [expr {$::MICROSOFT_WINDOWS ? "normal" : "bold"}] \
+ ]
# Postfixes for entry text variables
common entry_variables {
@@ -108,7 +127,7 @@ class Simulator_GUI {
private variable set_pc_by_line_button {} ;# Button: Set PC by line number
# Variables related to object initialization
- private variable gui_initialized 0 ;# Bool: GUI created
+ private variable sim_gui_gui_initialized 0 ;# Bool: GUI created
private variable parent ;# Parent widget
## PUBLIC
@@ -121,14 +140,14 @@ class Simulator_GUI {
## Object constructor
constructor {} {
- incr count ;# Increment instances counter
- set obj_idx $count ;# Set object index
+ incr sim_gui_count ;# Increment instances counter
+ set obj_idx $sim_gui_count ;# Set object index
}
## Object destructor
destructor {
# Unallocate entry text variables
- if {$gui_initialized} {
+ if {$sim_gui_gui_initialized} {
SimGUI_clean_up
}
}
@@ -138,19 +157,21 @@ class Simulator_GUI {
# @return void
public method PrepareSimulator {_parent} {
set parent $_parent
- set gui_initialized 0
+ set sim_gui_gui_initialized 0
}
## Inform simulator panel than it has became active
# @return void
public method SimulatorTabRaised {} {
+ update idletasks
+ $scrollable_frame yview scroll 0 units
}
## Initialize simulator GUI
# @return void
public method CreateSimulatorGUI {} {
- if {$gui_initialized} {return}
- set gui_initialized 1
+ if {$sim_gui_gui_initialized} {return}
+ set sim_gui_gui_initialized 1
# Set object variables
set disable_validation 1
@@ -196,7 +217,7 @@ class Simulator_GUI {
{up0} "Set this bit to 1"}
{command {Set to 0} {} 7 "bit_popup_menu_setto 0"
{button_cancel} "Set this bit to 0"}
- } $bitmenu 0 "$this " 0 {}
+ } $bitmenu 0 "$this " 0 {} [namespace current]
#
# Create left part
@@ -210,7 +231,12 @@ class Simulator_GUI {
if {[expr {$cap % 8}]} {
incr hg
}
- set hexeditor [HexEditor hexeditor${obj_idx} $main_top_frame.left_frame 8 $hg 2 hex 0 1 8 $cap]
+ if {!$::MICROSOFT_WINDOWS} {
+ set height_in_number_of_rows 9
+ } else {
+ set height_in_number_of_rows 11
+ }
+ set hexeditor [HexEditor hexeditor${obj_idx} $main_top_frame.left_frame 8 $hg 2 hex 0 1 $height_in_number_of_rows $cap]
$hexeditor bindCellValueChanged "$this simulator_hexedit_value_changed"
$hexeditor bindCellLeave {help_window_hide}
$hexeditor bindCellEnter "$this create_help_window_ram"
@@ -228,14 +254,14 @@ class Simulator_GUI {
set sim_gregs_f [frame $middle_f.gregs_frame]
# Pack frames of middle part
- pack $ctrl_f -fill x -padx 2
+ pack $ctrl_f -fill x
pack $sim_gregs_f
- pack $middle_f -side left -fill both -anchor w
+ pack $middle_f -side left -fill both -anchor w -padx 5
# Create controls icon bar
iconBarFactory $ctrl_f "X::" [string range $ctrl_f.controls_ 1 end] ::ICONS::16:: {
- {start_stop "Initialize simulator" {launch} {__initiate_sim}
- "Load sim file into simulator engine"}
+ {start_stop "Start/Stop simulator" {launch} {__initiate_sim}
+ "Load program into the simulator engine, or shutdown the MCU simulator."}
{separator}
{reset "Reset" {rebuild} {__reset -}
"Perform HW reset"}
@@ -250,7 +276,7 @@ class Simulator_GUI {
"Run program and show results after each instruction"}
{run "Run program" {2rightarrow} {__run}
"Run program and show results after some time"}
- }
+ } [namespace current]
foreach slave [pack slaves $ctrl_f] {
pack configure $slave -padx 0
}
@@ -258,11 +284,11 @@ class Simulator_GUI {
# Create separator under controls icon bar
pack [ttk::separator $sim_gregs_f.mid_sep \
-orient horizontal \
- ] -fill x -expand 1 -pady 2
+ ] -fill x -expand 1 -pady 2 -padx 5
## Create registers: A B
set sim_gregs_f_AB [frame $sim_gregs_f.gregs_f_AB]
- pack $sim_gregs_f_AB -anchor w
+ pack $sim_gregs_f_AB -pady 5
# Create num. base headers
set col 1
@@ -318,7 +344,7 @@ class Simulator_GUI {
-validate key \
]
- setStatusTip -widget $entry -text $stip
+ setStatusTip -widget $entry -text [mc $stip]
# Register register entry for disabling/enabling
add_entry $entry
# Register register entry for synchronizations
@@ -333,7 +359,7 @@ class Simulator_GUI {
$sim_gregs_f_AB._B_$base icursor \[$entry index insert\]
focus $sim_gregs_f_AB._B_$base
"
- } {
+ } else {
bind $entry <Key-Up> "
$sim_gregs_f_AB._A_$base icursor \[$entry index insert\]
focus $sim_gregs_f_AB._A_$base
@@ -350,7 +376,7 @@ class Simulator_GUI {
## Create register: PSW
set sim_gregs_f_PSW [frame $sim_gregs_f.gregs_f_PSW]
- pack $sim_gregs_f_PSW -anchor w
+ pack $sim_gregs_f_PSW -pady 2
set ::Simulator_GUI::ENV${obj_idx}_PSW 0
create_bitmap_register $sim_gregs_f_PSW 1 PSW {C AC F0 RS1 RS0 OV - P} 0 {
{Bit address: 0xD7 -- Carry Flag}
@@ -387,7 +413,7 @@ class Simulator_GUI {
-text "R$i" -fg $name_color -pady 0 \
-font $bitfont \
] -row 1 -column $col -sticky we
- setStatusTip -widget $sim_gregs_f_Rx._R${i}_l -text $stip
+ setStatusTip -widget $sim_gregs_f_Rx._R${i}_l -text [mc $stip]
# Create register hexadecimal entry
set ::Simulator_GUI::ENV${obj_idx}_R$i {00}
@@ -439,10 +465,10 @@ class Simulator_GUI {
pack $frame0 -side left -anchor nw
# Create timers frame (hexadecimal entries and bitmaps)
- set timers_frame [ttk::labelframe $frame0.timers_f \
- -padding 2 \
- -labelwidget [label $frame0.timers_lbl -text "TIMERS 0 & 1" -font $smallfont -pady 0]]
- pack $timers_frame -anchor nw -fill x
+ set timers_frame [labelframe $frame0.timers_f \
+ -pady 2 -padx 2 \
+ -labelwidget [label $frame0.timers_lbl -text [mc "TIMERS 0 & 1"] -font $smallfont -pady 0]]
+ pack $timers_frame -anchor nw -fill x -padx 5
# Create frame for hexadecimal entries: TH1 TL1 TH0 TL0
set timers_values_f [frame $timers_frame.timers_values_f]
@@ -633,20 +659,20 @@ class Simulator_GUI {
}
# Create frame for interrupt control registers (IE and IP)
- set interrupt_frame [ttk::labelframe $frame0.interrupt_f \
- -padding 2 \
- -labelwidget [label $frame0.int_lbl -text "INTERRUPTS" -font $smallfont -pady 0]]
- pack $interrupt_frame -anchor nw -fill x
+ set interrupt_frame [labelframe $frame0.interrupt_f \
+ -pady 2 -padx 2 \
+ -labelwidget [label $frame0.int_lbl -text [mc "INTERRUPTS"] -font $smallfont -pady 0]]
+ pack $interrupt_frame -anchor nw -fill x -pady 5 -padx 5
# Create IE, IP bitmaps
- if {[$this get_feature_avaliable t2]} {
+ if {[$this get_feature_available t2]} {
set et2 {ET2}
set pt2 {PT2}
set et2_stip {Bit address: 0xAD -- Enable or disable the Timer 2 overflow interrupt}
set pt2_stip {Bit address: 0xBD -- Defines the Timer 2 interrupt priority level}
- set et2_ttip {Timer 2 interrupt enable bit}
+ set et2_ttip {Timer 2 interrupt enable bit.}
set pt2_ttip {Timer 2 interrupt priority bit}
- } {
+ } else {
set et2 {-}
set pt2 {-}
set et2_stip {Bit address: 0xAD -- Not implemented}
@@ -654,14 +680,14 @@ class Simulator_GUI {
set et2_ttip {Not implemented}
set pt2_ttip {Not implemented}
}
- if {[$this get_feature_avaliable uart]} {
+ if {[$this get_feature_available uart]} {
set es {ES}
set ps {PS}
set es_stip {Bit address: 0xAC -- Enable or disable the serial port interrupt}
set ps_stip {Bit address: 0xBC -- Defines the Serial Port interrupt priority level}
set es_ttip {Serial Port interrupt enable bit}
set ps_ttip {Serial Port interrupt priority bit}
- } {
+ } else {
set es {-}
set ps {-}
set es_stip {Bit address: 0xAD -- Not implemented}
@@ -669,14 +695,14 @@ class Simulator_GUI {
set es_ttip {Not implemented}
set ps_ttip {Not implemented}
}
- if {[$this get_feature_avaliable acomparator]} {
+ if {[$this get_feature_available acomparator]} {
set ec {EC}
set pc {PC}
set ec_stip {Bit address: 0xAE -- Enable or disable the comparator interrupt}
set pc_stip {Bit address: 0xBE -- Defines the comparator interrupt priority level}
set ec_ttip {EC Comparator Interrupt Enable bit}
set pc_ttip {Comparator Interrupt Priority bit}
- } {
+ } else {
set ec {-}
set pc {-}
set ec_stip {Bit address: 0xAE -- Not implemented}
@@ -824,7 +850,7 @@ class Simulator_GUI {
set addrs {} ;# Register addresses
set stips {} ;# Status bar tips
foreach reg {P0 P1 P2 P3 P4} addr {128 144 160 176 192} stip {0 1 2 3 4} {
- if {[$this get_feature_avaliable [string tolower $reg]]} {
+ if {[$this get_feature_available [string tolower $reg]]} {
lappend regs $reg
lappend addrs $addr
lappend stips [mc "SFR 0x%s: Latch of port %s" [symb_name_to_hex_addr $reg] $stip]
@@ -842,7 +868,7 @@ class Simulator_GUI {
-text "$reg:" -fg $name_color -pady 0 \
-font $bitfont \
] -row $row -column 1
- setStatusTip -widget $frame1_top_left._${reg}_l -text $stip
+ setStatusTip -widget $frame1_top_left._${reg}_l -text [mc $stip]
# Create binary entry
set ::Simulator_GUI::ENV${obj_idx}_${reg}_bin {11111111}
@@ -862,7 +888,7 @@ class Simulator_GUI {
# Set entry event bindings
bind $entry0 <FocusIn> "$this unmark_entry $addr"
- setStatusTip -widget $entry0 -text $stip
+ setStatusTip -widget $entry0 -text [mc $stip]
if {$row != 1} {
bind $entry0 <Key-Up> "
$frame1_top_left._Pxx[expr {$row-1}]_bin_e icursor \[$entry0 index insert\]
@@ -914,66 +940,66 @@ class Simulator_GUI {
### Create bottom frame widgets (PCON SCON)
## Create register bitmaps
# - PCON
- if {[$this get_feature_avaliable pof]} {
+ if {[$this get_feature_available pof]} {
set POF {POF}
set pof_statusTip {Power Off Flag}
set pof_tooltip {Power-Off Flag\nCleared to recognize next reset type.\nSet by hardware when VCC rises from 0 to its nominal voltage. Can also be set by software.}
- } {
+ } else {
set POF {-}
set pof_statusTip {Not implemented}
set pof_tooltip {Not implemented}
}
- if {[$this get_feature_avaliable gf1]} {
+ if {[$this get_feature_available gf1]} {
set GF1 {GF1}
set gf1_statusTip {General purpose flag bit}
set gf1_tooltip {General purpose Flag\nCleared by user for general purpose usage.\nSet by user for general purpose usage.}
- } {
+ } else {
set GF1 {-}
set gf1_statusTip {Not implemented}
set gf1_tooltip {Not implemented}
}
- if {[$this get_feature_avaliable gf0]} {
+ if {[$this get_feature_available gf0]} {
set GF0 {GF0}
set gf0_statusTip {General purpose flag bit}
set gf0_tooltip {General purpose Flag\nCleared by user for general purpose usage.\nSet by user for general purpose usage.}
- } {
+ } else {
set GF0 {-}
set gf0_statusTip {Not implemented}
set gf0_tooltip {Not implemented}
}
- if {[$this get_feature_avaliable pd]} {
+ if {[$this get_feature_available pd]} {
set PD {PD}
set pd_statusTip {Power down bit}
set pd_tooltip {Power-Down mode bit\nCleared by hardware when reset occurs.\nSet to enter power-down mode.}
- } {
+ } else {
set PD {-}
set pd_statusTip {Not implemented}
set pd_tooltip {Not implemented}
}
- if {[$this get_feature_avaliable idl]} {
+ if {[$this get_feature_available idl]} {
set IDL {IDL}
set idl_statusTip {Idle mode bit}
set idl_tooltip {Idle mode bit\nCleared by hardware when interrupt or reset occurs.\nSet to enter idle mode.}
- } {
+ } else {
set IDL {-}
set idl_statusTip {Not implemented}
set idl_tooltip {Not implemented}
}
- if {[$this get_feature_avaliable uart]} {
+ if {[$this get_feature_available uart]} {
set SMOD1 {SMOD}
set smod1_statusTip {Double baud rate bit}
set smod1_tooltip {Serial port Mode bit 1 for UART\nSet to select double baud rate in mode 1, 2 or 3.}
- if {[$this get_feature_avaliable smod0]} {
+ if {[$this get_feature_available smod0]} {
append SMOD1 {1}
set SMOD0 {SMOD0}
set smod0_statusTip {Frame Error Select}
set smod0_tooltip {Frame Error Select. When SMOD0 = 0, SCON.7 is SM0. When SMOD0 = 1, SCON.7 is FE.\nNote that FE will be set after a frame error\nregardless of the state of SMOD0.}
- } {
+ } else {
set SMOD0 {-}
set smod0_statusTip {Not implemented}
set smod0_tooltip {Not implemented}
}
- } {
+ } else {
set SMOD1 {-}
set smod1_statusTip {Not implemented}
set smod1_tooltip {Not implemented}
@@ -981,11 +1007,11 @@ class Simulator_GUI {
set smod0_statusTip {Not implemented}
set smod0_tooltip {Not implemented}
}
- if {[$this get_feature_avaliable pwm]} {
+ if {[$this get_feature_available pwm]} {
set PWMEN {PWMEN}
set pwmen_stip {Pulse Width Modulation Enable}
set pwmen_ttip {Pulse Width Modulation Enable. When PWMEN = 1, Timer 0 and Timer 1 are\nconfigured as an 8-bit PWM counter with 8-bit auto-reload prescaler.\nThe PWM outputs on T1 (P3.5).}
- } {
+ } else {
set PWMEN {-}
set pwmen_stip {Not implemented}
set pwmen_ttip {Not implemented}
@@ -1010,7 +1036,7 @@ class Simulator_GUI {
$idl_tooltip \
]
# - SCON
- if {[$this get_feature_avaliable uart]} {
+ if {[$this get_feature_available uart]} {
create_bitmap_register $frame1_bottom 2 SCON {SM0 SM1 SM2 REN TB8 RB8 TI RI} 1 {
{Bit address: 0x9F -- Serial Port mode specifier}
{Bit address: 0x9E -- Serial Port mode specifier}
@@ -1032,7 +1058,7 @@ class Simulator_GUI {
}
# Create bit FE (Frame error)
- if {[$this get_feature_avaliable smod0]} {
+ if {[$this get_feature_available smod0]} {
set FE_frm [frame $frame1_bottom._SCON_SM0_FE_frm]
grid forget $Simulator_panel_parent._SCON_SM0
@@ -1043,7 +1069,7 @@ class Simulator_GUI {
bind $Simulator_panel_parent._SCON_SM0 <ButtonRelease-3> "$this bit_popup_menu SM0 0 SCON 1 %X %Y"
set label [label $Simulator_panel_parent._SCON_FE \
- -text {FE} -fg $off_color -cursor hand1 \
+ -text {FE} -fg $off_color -cursor hand2 \
-bd 0 -font $bitfont -pady 0 -padx 0 \
]
pack $label -in $FE_frm -side left
@@ -1053,7 +1079,7 @@ class Simulator_GUI {
pack $Simulator_panel_parent._SCON_SM0 -in $FE_frm -side left
- setStatusTip -widget $label -text {Bit address: 0x9F -- Framing Error bit}
+ setStatusTip -widget $label -text [mc "Bit address: 0x9F -- Framing Error bit"]
bind $label <Enter> {+%W configure -font $::Simulator_GUI::bitfont_under}
bind $label <Leave> {+%W configure -font $::Simulator_GUI::bitfont}
DynamicHelp::add $label -text [subst {Clear to reset the error state, not cleared by a valid stop bit.\nSet by hardware when an invalid stop bit is detected.\nSMOD0 must be set to enable access to the FE bit}]
@@ -1084,7 +1110,7 @@ class Simulator_GUI {
{SFR 0x98: Serial port control register}
} {
incr row ;# Increment grid row
- if {$reg == {SCON} && ![$this get_feature_avaliable uart]} {
+ if {$reg == {SCON} && ![$this get_feature_available uart]} {
continue
}
@@ -1094,7 +1120,7 @@ class Simulator_GUI {
# Create register name labels
grid [label $frame1_bottom._${reg}_hex_l \
- -text {HEX} -fg $small_color -font $smallfont \
+ -text {H:} -fg $small_color -font $smallfont \
] -row $row -column 12
setStatusTip -widget $frame1_bottom._${reg}_hex_l -text [mc $stip]
@@ -1137,9 +1163,9 @@ class Simulator_GUI {
# Create label "DPTR:"
if {
- [$this get_feature_avaliable {ddp}]
+ [$this get_feature_available {ddp}]
&&
- ![$this get_feature_avaliable {hddptr}]
+ ![$this get_feature_available {hddptr}]
} then {
set text {DPTR0:}
} else {
@@ -1204,7 +1230,7 @@ class Simulator_GUI {
"Simulator_GUI::sim_entry_right $frame1_top_right_0._DPH_e $frame1_top_right_0._DPL_e"
bind $frame1_top_right_0._DPL_e <Key-Left> \
"Simulator_GUI::sim_entry_left $frame1_top_right_0._DPL_e $frame1_top_right_0._DPH_e"
- if {[$this get_feature_avaliable {ddp}]} {
+ if {[$this get_feature_available {ddp}]} {
bind $frame1_top_right_0._DPH_e <Key-Down> "
$frame1_top_right_0._DP1H_e icursor \[$frame1_top_right_0._DPH_e index insert\]
focus $frame1_top_right_0._DP1H_e"
@@ -1214,7 +1240,7 @@ class Simulator_GUI {
}
# Create vertical separator (DPTR + Clock)|(SP + SBUF)
- if {[$this get_feature_avaliable {ddp}]} {set row 3} {set row 2}
+ if {[$this get_feature_available {ddp}]} {set row 3} {set row 2}
grid [ttk::separator $frame1_top_right_0._SP_sep \
-orient vertical \
] \
@@ -1229,7 +1255,7 @@ class Simulator_GUI {
-text {SP:} -fg $name_color -pady 0 \
-font $bitfont \
] -row 2 -column 4 -sticky w
- setStatusTip -widget $frame1_top_right_0._SP_l -text {SFR 0x81: Stack pointer}
+ setStatusTip -widget $frame1_top_right_0._SP_l -text [mc "SFR 0x81: Stack pointer"]
# Create hexadecimal entry for register: SP
set ::Simulator_GUI::ENV${obj_idx}_SP {07}
@@ -1243,7 +1269,7 @@ class Simulator_GUI {
]
# Show and register created memory cell (SP)
- grid $entry -row 2 -column 5 -sticky w
+ grid $entry -row 2 -column 5
add_entry $entry
$this add_sfr_entry 129 $entry
@@ -1258,7 +1284,7 @@ class Simulator_GUI {
bind $entry <Enter> "$this create_help_window_ram SP; Sbar -freeze {SFR 0x81: Stack pointer}"
# Create DPTR1
- if {[$this get_feature_avaliable {ddp}] && ![$this get_feature_avaliable {hddptr}]} {
+ if {[$this get_feature_available {ddp}] && ![$this get_feature_available {hddptr}]} {
# Create label "DPTR1:"
grid [label $frame1_top_right_0._DPTR1_l \
@@ -1315,7 +1341,7 @@ class Simulator_GUI {
focus $frame1_top_right_0._DPL_e"
set row 4
- } {
+ } else {
set row 3
}
@@ -1332,7 +1358,7 @@ class Simulator_GUI {
-style Simulator.TEntry \
-textvariable ::Simulator_GUI::ENV${obj_idx}_CLOCK \
-font $entry_font \
- -width 6 \
+ -width 7 \
-validate all \
-validatecommand "$this clock_validate %P" \
]
@@ -1359,13 +1385,13 @@ class Simulator_GUI {
incr row
# Create label "SBUF X:"
- if {[$this get_feature_avaliable uart]} {
+ if {[$this get_feature_available uart]} {
set label [label $frame1_top_right_0._${reg}_l \
-text "${regname}:" -fg $name_color \
-font $bitfont -pady 0 \
]
grid $label -row $row -column 4
- setStatusTip -widget $label -text $stip
+ setStatusTip -widget $label -text [mc $stip]
# Create hexadecimal entry for memory cell: SBUF
@@ -1404,7 +1430,7 @@ class Simulator_GUI {
-text {PC:} -fg $name_nr_color \
-font $bitfont \
] -side left
- setStatusTip -widget $pc_lbl_but_frm._PC_l -text $stip
+ setStatusTip -widget $pc_lbl_but_frm._PC_l -text [mc $stip]
set set_pc_by_line_button [ttk::button $pc_lbl_but_frm._PC_but \
-image ::ICONS::16::2_rightarrow \
-command "::X::__simulator_set_PC_by_line" \
@@ -1412,7 +1438,7 @@ class Simulator_GUI {
]
pack $set_pc_by_line_button -side right -after $pc_lbl_but_frm._PC_l
DynamicHelp::add $set_pc_by_line_button \
- -text [mc "Set PC (Program Counter) acording to\nline number in source code"]
+ -text [mc "Set PC (Program Counter) according to\nline number in source code"]
add_entry $pc_lbl_but_frm._PC_but
setStatusTip -widget $set_pc_by_line_button \
-text [mc "Set PC by line number"]
@@ -1438,7 +1464,7 @@ class Simulator_GUI {
-validatecommand "$this sim_eval_PC hex %P" \
-font $entry_font \
]
- setStatusTip -widget $frame1_top_right_0_0._PC_hex_e -text $stip
+ setStatusTip -widget $frame1_top_right_0_0._PC_hex_e -text [mc $stip]
# Show and register created entry (PC - hex)
grid $entry -row 1 -column 2
@@ -1467,7 +1493,7 @@ class Simulator_GUI {
-validatecommand "$this sim_eval_PC dec %P" \
-font $entry_font \
]
- setStatusTip -widget $frame1_top_right_0_1._PC_dec_e -text $stip
+ setStatusTip -widget $frame1_top_right_0_1._PC_dec_e -text [mc $stip]
# Show and register created entry (PC - dec)
grid $entry -row 1 -column 2
@@ -1495,7 +1521,7 @@ class Simulator_GUI {
-style TEntry \
-textvariable ::Simulator_GUI::ENV${obj_idx}_TIME \
-state readonly \
- -font [font create -size -12 -family $::DEFAULT_FIXED_FONT] \
+ -font [font create -size [expr {int(-12 * $::font_size_factor)}] -family $::DEFAULT_FIXED_FONT] \
]
setStatusTip -widget $frame1_top_right_1._TIME_e -text [mc "Overall time"]
@@ -1513,7 +1539,7 @@ class Simulator_GUI {
set bottom_left_bottom_trow 0 ;# Row in grid
# Create controls related to Timer/Couter 2
- if {[$this get_feature_avaliable t2]} {
+ if {[$this get_feature_available t2]} {
incr bottom_left_bottom_row 4
set t2_frame [frame $bottom_left_frame.timers_f]
pack $t2_frame
@@ -1598,7 +1624,7 @@ class Simulator_GUI {
-validatecommand "$this validate_Txx $reg %P" \
-font $entry_font \
]
- setStatusTip -widget $timers_values_f._Txx${col}_e -text $stip
+ setStatusTip -widget $timers_values_f._Txx${col}_e -text [mc $stip]
# Show and register created memory cell
grid $entry -row 2 -column $col
@@ -1639,7 +1665,7 @@ class Simulator_GUI {
{Timer 2 Capture/Reload bit\nIf RCLK=1 or TCLK=1, CP/RL2# is ignored and timer is forced to auto-reload on timer 2 overflow.\nClear to auto-reload on timer 2 overflows or negative transitions on T2EX pin if EXEN2=1.\nSet to capture on negative transitions on T2EX pin if EXEN2=1.}
}
- if {[$this get_feature_avaliable t2mod]} {
+ if {[$this get_feature_available t2mod]} {
create_bitmap_register $timers_frame_reg 2 T2MOD {- - - - - - T2OE DCEN} 1 {
{Reserved}
{Reserved}
@@ -1671,7 +1697,7 @@ class Simulator_GUI {
} {
incr col ;# Increment grid column
- if {$reg == {T2MOD} && ![$this get_feature_avaliable t2mod]} {
+ if {$reg == {T2MOD} && ![$this get_feature_available t2mod]} {
continue
}
@@ -1723,38 +1749,38 @@ class Simulator_GUI {
set bottom_middle_row 0 ;# Row in grid
# Registers: AUXR, AUXR1, ACSR, EECON, SPCR, SPSR, WDTCON. IPH, SPCR
- if {[$this get_feature_avaliable t2]} {
+ if {[$this get_feature_available t2]} {
set pt2h {PT2H}
set pt2h_stip {Defines the Timer 2 interrupt priority level}
set pt2h_ttip {Timer 2 interrupt priority bit}
- } {
+ } else {
set pt2h {-}
set pt2h_stip {Not implemented}
set pt2h_ttip {Not implemented}
}
- if {[$this get_feature_avaliable uart]} {
+ if {[$this get_feature_available uart]} {
set psh {PSH}
set psh_stip {Defines the Serial Port interrupt priority level}
set psh_ttip {Serial Port interrupt priority bit}
- } {
+ } else {
set psh {-}
set psh_stip {Not implemented}
set psh_ttip {Not implemented}
}
- if {[$this get_feature_avaliable acomparator]} {
+ if {[$this get_feature_available acomparator]} {
set pch {PCH}
set pch_stip {Defines the comparator interrupt priority level}
set pch_ttip {Comparator Interrupt Priority bit}
- } {
+ } else {
set pch {-}
set pch_stip {Not implemented}
set pch_ttip {Not implemented}
}
- if {[$this get_feature_avaliable pwdex]} {
+ if {[$this get_feature_available pwdex]} {
set PWDEX {PWDEX}
set pwdex_stip {Power-down Exit Mode}
set pwdex_ttip {Power-down Exit Mode. When PWDEX = 1, wake up from Power-down is externally controlled.\nWhen PWDEX = 0, wake up from Power-down is internally timed.}
- } {
+ } else {
set PWDEX {-}
set pwdex_stip {Not implemented}
set pwdex_ttip {Not implemented}
@@ -1763,7 +1789,7 @@ class Simulator_GUI {
set EXTRAM {EXTRAM}
set extram_statustip {Internal/External RAM access using MOVX}
set extram_tooltip {Internal/External RAM access using MOVX @ Ri/@DPTR\nEXTRAM\tOperating Mode\n0\tInternal ERAM (00H-FFH) access using MOVX @ Ri/@DPTR\n1\tExternal data memory access}
- } elseif {[$this get_feature_avaliable intelpe]} {
+ } elseif {[$this get_feature_available intelpe]} {
set EXTRAM {IPE}
set extram_statustip {Intel_Pwd_Exit}
set extram_tooltip {When set, this bit configures the interrupt driven exit from power-down\nto resume execution on the rising edge of the interrupt signal. When\nthis bit is cleared, the execution resumes after a self-timed interval\n(nominal 2 ms) referenced from the falling edge of the interrupt signal.}
@@ -1773,9 +1799,9 @@ class Simulator_GUI {
set extram_tooltip {Reserved\nThe value read from this bit is indeterminate. Do not set this bit.}
}
if {
- [$this get_feature_avaliable wdtcon] ||
- ![$this get_feature_avaliable wtd] ||
- ![$this get_feature_avaliable auxrdisrto]
+ [$this get_feature_available wdtcon] ||
+ ![$this get_feature_available wtd] ||
+ ![$this get_feature_available auxrdisrto]
} then {
set DISRTO {-}
set disrto_stip {Reserved for future expansion}
@@ -1786,9 +1812,9 @@ class Simulator_GUI {
set disrto_ttip {Disable/Enable Reset out\nDISRTO\tOperating Mode\n0\tReset pin is driven High after WDT times out\n1\tReset pin is input only}
}
if {
- [$this get_feature_avaliable wdtcon] ||
- ![$this get_feature_avaliable wtd] ||
- ![$this get_feature_avaliable auxrwdidle]
+ [$this get_feature_available wdtcon] ||
+ ![$this get_feature_available wtd] ||
+ ![$this get_feature_available auxrwdidle]
} then {
set WDIDLE {-}
set wdidle_stip {Reserved for future expansion}
@@ -1798,16 +1824,16 @@ class Simulator_GUI {
set wdidle_stip {Disable/Enable WDT in IDLE mode}
set wdidle_ttip {Disable/Enable WDT in IDLE mode\nWDIDLE\tOperating Mode\n0\tWDT continues to count in IDLE mode\n1\tWDT halts counting in IDLE mode}
}
- if {[$this get_feature_avaliable ao]} {
+ if {[$this get_feature_available ao]} {
set DISALE {AO}
- } {
+ } else {
set DISALE {DISALE}
}
- if {[$this get_feature_avaliable auxr1gf3]} {
+ if {[$this get_feature_available auxr1gf3]} {
set GF3 {GF3}
set gf3_ttip {General purpose user flag}
set gf3_stip {General purpose user flag}
- } {
+ } else {
set GF3 {-}
set gf3_ttip {Reserved\nThe value read from this bit is indeterminate. Do not set this bit.}
set gf3_stip {Reserved for future expansion}
@@ -1829,8 +1855,8 @@ class Simulator_GUI {
[list - $pch $pt2h $psh PT1H PX1H PT0H PX0H] \
[list - - - - - - $PWDEX X2] \
] stip {
- {SFR 0x8E: Auxillary Register}
- {SFR 0xA2: Auxillary Register 1}
+ {SFR 0x8E: Auxiliary Register}
+ {SFR 0xA2: Auxiliary Register 1}
{SFR 0x97: Analog Comparator Control and Status Register}
{SFR 0x96: Data EEPROM Control Register}
{SFR 0xD5: SPI Control Register}
@@ -1843,14 +1869,14 @@ class Simulator_GUI {
if {$cg_left && $bottom_middle_row > $bottom_left_bottom_row} {
set left__right 1
set target_frame $bottom_left_bottom_frame
- } {
+ } else {
set left__right 0
set target_frame $bottom_middle_frame
}
switch -- $reg {
{IPH} {
- if {![$this get_feature_avaliable iph]} {
+ if {![$this get_feature_available iph]} {
continue
}
create_bitmap_register $target_frame $row $reg $bits 1 [list \
@@ -1874,9 +1900,9 @@ class Simulator_GUI {
]
}
{CLKREG} {
- if {[$this get_feature_avaliable clkreg]} {
+ if {[$this get_feature_available clkreg]} {
set reg {CLKREG}
- } elseif {[$this get_feature_avaliable ckcon]} {
+ } elseif {[$this get_feature_available ckcon]} {
set reg {CKCON}
} else {
continue
@@ -1932,7 +1958,7 @@ class Simulator_GUI {
bind $Simulator_panel_parent._EECON_RDYBSY <ButtonRelease-3> {break}
}
{WDTCON} {
- if {![$this get_feature_avaliable wdtcon] || [$this get_feature_avaliable wdtprg]} {
+ if {![$this get_feature_available wdtcon] || [$this get_feature_available wdtprg]} {
continue
}
set psx_tooltip {Prescaler bits for the watchdog timer (WDT). When all three bits are cleared\nto 0, the watchdog timer has a nominal period of 16K machine cycles,\n(i.e. 16 ms at a XTAL frequency of 12 MHz in normal mode or 6 MHz in x2 mode).\nWhen all three bits are set to 1, the nominal period is 2048K machine cycles,\n(i.e. 2048 ms at 12 MHz clock frequency in normal mode or 6 MHz in x2 mode).}
@@ -1958,7 +1984,7 @@ class Simulator_GUI {
]
}
{WDTPRG} {
- if {![$this get_feature_avaliable wdtprg] || [$this get_feature_avaliable wdtcon]} {
+ if {![$this get_feature_available wdtprg] || [$this get_feature_available wdtcon]} {
continue
}
set t_stip {Reserved}
@@ -1981,7 +2007,7 @@ class Simulator_GUI {
}
}
{SPSR} {
- if {![$this get_feature_avaliable spi]} {
+ if {![$this get_feature_available spi]} {
continue
}
create_bitmap_register $target_frame $row $reg $bits 1 {
@@ -2005,7 +2031,7 @@ class Simulator_GUI {
}
}
{SPCR} {
- if {![$this get_feature_avaliable spi]} {
+ if {![$this get_feature_available spi]} {
continue
}
create_bitmap_register $target_frame $row $reg $bits 1 [list \
@@ -2029,7 +2055,7 @@ class Simulator_GUI {
]
}
{ACSR} {
- if {![$this get_feature_avaliable acomparator]} {
+ if {![$this get_feature_available acomparator]} {
continue
}
set CMx_tooltip {Comparator Interrupt Mode\n 2 1 0\tInterrupt Mode\n--- --- ---\t---------------------------------------\n 0 0 0\tNegative (Low) level\n 0 0 1\tPositive edge\n 0 1 0\tToggle with debounce\n 0 1 1\tPositive edge with debounce\n 1 0 0\tNegative edge\n 1 0 1\tToggle\n 1 1 0\tNegative edge with debounce\n 1 1 1\tPositive (High) level}
@@ -2053,8 +2079,8 @@ class Simulator_GUI {
}
{AUXR1} {
if {
- (![$this get_feature_avaliable ddp] || [$this get_feature_avaliable wdtcon])
- && ![$this get_feature_avaliable auxr1gf3]
+ (![$this get_feature_available ddp] || [$this get_feature_available wdtcon])
+ && ![$this get_feature_available auxr1gf3]
} then {
continue
}
@@ -2079,7 +2105,7 @@ class Simulator_GUI {
]
}
{AUXR} {
- if {![$this get_feature_avaliable auxr]} {
+ if {![$this get_feature_available auxr]} {
continue
}
create_bitmap_register $target_frame $row $reg $bits 1 [list \
@@ -2129,7 +2155,7 @@ class Simulator_GUI {
if {$reg != {EECON}} {
set ::Simulator_GUI::ENV${obj_idx}_${reg} {00}
- } {
+ } else {
set ::Simulator_GUI::ENV${obj_idx}_${reg} {03}
}
@@ -2149,7 +2175,7 @@ class Simulator_GUI {
if {$left__right} {
incr bottom_left_bottom_row
incr bottom_left_bottom_trow
- } {
+ } else {
incr bottom_middle_row
}
}
@@ -2174,7 +2200,7 @@ class Simulator_GUI {
pack $bottom_right_spec_frame -anchor nw -fill both
## Create watchdog timer controls
- if {[$this get_feature_avaliable wtd]} {
+ if {[$this get_feature_available wtd]} {
set bottom_right_present 1
set watchdog_frame [frame $bottom_right_frame.watchdog_frame]
pack $watchdog_frame -anchor nw -before $bottom_right_reg_frame
@@ -2188,8 +2214,8 @@ class Simulator_GUI {
# Create ON/OFF switch
set watchdog_onoff_switch [label $watchdog_frame.on_off_switch \
-text [mc "OFF"] -fg $off_color -pady 0 \
- -bd 1 -cursor hand1 -font [font create \
- -family $::DEFAULT_FIXED_FONT -size -12 \
+ -bd 1 -cursor hand2 -font [font create \
+ -family $::DEFAULT_FIXED_FONT -size [expr {int(-12 * $::font_size_factor)}] \
-weight bold \
] \
]
@@ -2198,7 +2224,7 @@ class Simulator_GUI {
pack $watchdog_onoff_switch -side left -padx 2
# Create entryBox for watchdog prescaler
- if {[$this get_feature_avaliable wdtcon] || [$this get_feature_avaliable wdtprg]} {
+ if {[$this get_feature_available wdtcon] || [$this get_feature_available wdtprg]} {
# Create hexadecimal entry for created entry: WatchDog
set ::Simulator_GUI::ENV${obj_idx}_WatchDogP {00}
set wdt_prescaler_entry [ttk::entry $watchdog_frame._WatchDogP_e\
@@ -2263,7 +2289,7 @@ class Simulator_GUI {
{SFR 0x86: SPI Data Register}
{SFR 0xA6: Watchdog reset}
} {
- if {![$this get_feature_avaliable $feature]} {
+ if {![$this get_feature_available $feature]} {
continue
}
if {$col >= 4} {
@@ -2357,7 +2383,7 @@ class Simulator_GUI {
## Show EEPROM write progress indicator
# @return void
public method simulator_GUI_invoke_write_to_eeprom {} {
- if {!$gui_initialized} {return}
+ if {!$sim_gui_gui_initialized} {return}
# Create EEPROM indicator frame and horizonatl separator above it
set eeprom_operation_frame [frame $bottom_right_spec_frame.frame]
@@ -2409,7 +2435,7 @@ class Simulator_GUI {
## Hide EEPROM write progress indicator
# @return void
public method simulator_GUI_cancel_write_to_eeprom {} {
- if {!$gui_initialized} {return}
+ if {!$sim_gui_gui_initialized} {return}
set ::Simulator_GUI::ENV${obj_idx}_EEPROM_prg 1
if {[winfo exists $eeprom_operation_frame]} {
@@ -2421,7 +2447,7 @@ class Simulator_GUI {
# @parm Int value - New progress value in percents minus one (1..101)
# @return void
public method simulator_WTE_prg_set {value} {
- if {!$gui_initialized} {return}
+ if {!$sim_gui_gui_initialized} {return}
if {$value < 1} {
set value 1
@@ -2445,14 +2471,14 @@ class Simulator_GUI {
$eeprom_progressbar configure -fg $clr
}
- ## Adjust watchdog on/off switch acording to current state
+ ## Adjust watchdog on/off switch according to current state
# @return void
public method simulator_evaluate_wtd_onoff_switch {} {
- if {!$gui_initialized} {return}
+ if {!$sim_gui_gui_initialized} {return}
if {[$this simulator_isWatchDogTimerRuning]} {
$watchdog_onoff_switch configure -text [mc "ON "] -fg $on_color
- } {
+ } else {
$watchdog_onoff_switch configure -text [mc "OFF"] -fg $off_color
}
}
@@ -2460,12 +2486,12 @@ class Simulator_GUI {
## Invert watchdog on/off flag
# @return void
public method simulator_invert_wtd_onoff_switch {} {
- if {!$gui_initialized} {return}
+ if {!$sim_gui_gui_initialized} {return}
if {!$sim_enabled} {return}
if {[$this simulator_isWatchDogTimerRuning]} {
$this simulator_startStopWatchDogTimer 0
- } {
+ } else {
$this simulator_startStopWatchDogTimer 1
}
simulator_evaluate_wtd_onoff_switch
@@ -2512,7 +2538,7 @@ class Simulator_GUI {
catch {
if {!$dec_value || !$sim_enabled} {
$wtd_clear_button configure -state disabled
- } {
+ } else {
$wtd_clear_button configure -state normal
}
}
@@ -2541,7 +2567,7 @@ class Simulator_GUI {
# This function cannot run multithreaded
if {$sync_Txx_in_progress} {
return 1
- } {
+ } else {
set sync_Txx_in_progress 1
}
@@ -2628,7 +2654,7 @@ class Simulator_GUI {
}
# Validation of THx, TLx or RCAPxL, RCAPxH
- } {
+ } else {
# Check for corrent value
if {![entry_2_hex_validate $content]} {
set sync_Txx_in_progress 0
@@ -2638,23 +2664,23 @@ class Simulator_GUI {
## Determinate vaiable of Tx entry and low-order and high-order bytes of Tx
# TH0 or TL0
if {$registerName == {TH0} || $registerName == {TL0}} {
- set hex_h [subst "\$::Simulator_GUI::ENV${obj_idx}_TH0"]
- set hex_l [subst "\$::Simulator_GUI::ENV${obj_idx}_TL0"]
+ set hex_h [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_TH0"]
+ set hex_l [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_TL0"]
set target_var "::Simulator_GUI::ENV${obj_idx}_T0"
# TH1 or TL1
} elseif {$registerName == {TH1} || $registerName == {TL1}} {
- set hex_h [subst "\$::Simulator_GUI::ENV${obj_idx}_TH1"]
- set hex_l [subst "\$::Simulator_GUI::ENV${obj_idx}_TL1"]
+ set hex_h [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_TH1"]
+ set hex_l [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_TL1"]
set target_var "::Simulator_GUI::ENV${obj_idx}_T1"
# TH2 or TL2
} elseif {$registerName == {TH2} || $registerName == {TL2}} {
- set hex_h [subst "\$::Simulator_GUI::ENV${obj_idx}_TH2"]
- set hex_l [subst "\$::Simulator_GUI::ENV${obj_idx}_TL2"]
+ set hex_h [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_TH2"]
+ set hex_l [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_TL2"]
set target_var "::Simulator_GUI::ENV${obj_idx}_T2"
# RCAP2H or RCAP2L
} elseif {$registerName == {RCAP2H} || $registerName == {RCAP2L}} {
- set hex_h [subst "\$::Simulator_GUI::ENV${obj_idx}_RCAP2H"]
- set hex_l [subst "\$::Simulator_GUI::ENV${obj_idx}_RCAP2L"]
+ set hex_h [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_RCAP2H"]
+ set hex_l [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_RCAP2L"]
set target_var "::Simulator_GUI::ENV${obj_idx}_RCAP2"
}
@@ -2707,17 +2733,17 @@ class Simulator_GUI {
# possibly new value of bit SCON.7 (FE/SM0)
# @return void
public method simulator_gui_SMOD0_changed {} {
- set scon [subst "\$::Simulator_GUI::ENV${obj_idx}_SCON"]
+ set scon [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_SCON"]
if {$scon == {}} {
set scon 0
}
set scon [expr {"0x$scon" & 0x7F}]
if {[$this get_SMOD0]} {
- if {[subst "\$::Simulator_GUI::ENV${obj_idx}_SFR(FE)"]} {
+ if {[subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_SFR(FE)"]} {
set scon [expr {$scon | 0x80}]
}
- } {
- if {[subst "\$::Simulator_GUI::ENV${obj_idx}_SFR(SM0)"]} {
+ } else {
+ if {[subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_SFR(SM0)"]} {
set scon [expr {$scon | 0x80}]
}
}
@@ -2737,7 +2763,7 @@ class Simulator_GUI {
# This function cannot run multithreaded
if {$bitmap_hex_validation_ena} {
set bitmap_hex_validation_ena 0
- } {
+ } else {
return 1
}
@@ -2771,7 +2797,7 @@ class Simulator_GUI {
SCON {
if {[$this get_SMOD0]} {
lset bitList 0 FE
- } {
+ } else {
lset bitList 0 SM0
}
}
@@ -2789,7 +2815,7 @@ class Simulator_GUI {
set bitVal [lindex $bits $i]
if {$bitVal} {
set color $on_color
- } {
+ } else {
set color $off_color
}
@@ -2831,7 +2857,7 @@ class Simulator_GUI {
-text "[mc $name]:" -fg $name_color \
-anchor w -pady 0 -font $bitfont \
] -row $row -column 1 -in $parent -sticky w
- setStatusTip -widget $Simulator_panel_parent._${name}_l -text $stip
+ setStatusTip -widget $Simulator_panel_parent._${name}_l -text [mc $stip]
set col 1 ;# Bit label column (2..9)
set bitNum -1 ;# Bit number (0..7)
@@ -2847,9 +2873,9 @@ class Simulator_GUI {
incr Idx
set idx $Idx
set cursor {left_ptr}
- } {
+ } else {
set color $off_color
- set cursor {hand1}
+ set cursor {hand2}
set idx {}
}
@@ -2863,7 +2889,7 @@ class Simulator_GUI {
bind $label <Enter> {+%W configure -font $::Simulator_GUI::bitfont_under}
bind $label <Leave> {+%W configure -font $::Simulator_GUI::bitfont}
}
- DynamicHelp::add $label -text [subst [mc $tooltip]]
+ DynamicHelp::add $label -text [mc [subst $tooltip]]
grid $label -row $row -column $col -in $parent
# Skip registration of empty bits
@@ -2894,7 +2920,7 @@ class Simulator_GUI {
# @parm void
public method bit_popup_menu_setto {bool} {
if {!$sim_enabled} {return}
- if {$bool != [subst "\$::Simulator_GUI::ENV${obj_idx}_SFR([lindex $bit_popup_menu_args 0])"]} {
+ if {$bool != [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_SFR([lindex $bit_popup_menu_args 0])"]} {
eval "sim_invert $bit_popup_menu_args"
}
}
@@ -2908,7 +2934,7 @@ class Simulator_GUI {
# This function cannot run multithreaded
if {$sync_PC_in_progress} {
return 1
- } {
+ } else {
set sync_PC_in_progress 1
}
@@ -2972,7 +2998,7 @@ class Simulator_GUI {
set lineNum [$this simulator_getCurrentLine]
if {$lineNum != {}} {
$this move_simulator_line $lineNum
- } {
+ } else {
$this editor_procedure {} unset_simulator_line {}
}
}
@@ -2992,7 +3018,7 @@ class Simulator_GUI {
# This function cannot run multithreaded
if {$sync_Px_in_progress} {
return 1
- } {
+ } else {
set sync_Px_in_progress 1
}
@@ -3079,7 +3105,7 @@ class Simulator_GUI {
# This function cannot run multithreaded
if {$sync_AB_in_progress} {
return 1
- } {
+ } else {
set sync_AB_in_progress 1
}
@@ -3089,7 +3115,7 @@ class Simulator_GUI {
return 1
}
- # Determinate maximum length acording to numeric base
+ # Determinate maximum length according to numeric base
switch -- $num_base {
{hex} {set max_len 2}
{dec} {set max_len 3}
@@ -3174,15 +3200,15 @@ class Simulator_GUI {
}
# Determinate character representation
if {$dec > 31 && $dec < 127} {
- set char [subst "\\u00$hex"]
- } {
+ set char [subst -nocommands "\\u00$hex"]
+ } else {
set char {}
}
# Synchronize with other entries
foreach base {hex dec bin oct char} {
if {$base == $num_base} {continue}
- set ::Simulator_GUI::ENV${obj_idx}_${register}_$base [subst "\$$base"]
+ set ::Simulator_GUI::ENV${obj_idx}_${register}_$base [subst -nocommands "\$$base"]
}
# Synchronize with Right panel and Engine
@@ -3194,7 +3220,7 @@ class Simulator_GUI {
$this sfr_watches_sync 224 $dec_val
$this sfrmap_map_sync 224 $dec_val
# Register B
- } {
+ } else {
$this setSfr 240 $hex
set dec_val [expr "0x$hex"]
$this sfr_watches_sync 240 $dec_val
@@ -3212,8 +3238,8 @@ class Simulator_GUI {
# @return void
public method create_help_window_Rx {R_index} {
# Determinate true register address (decimal)
- set RS0 [subst "\$::Simulator_GUI::ENV${obj_idx}_SFR(RS0)"]
- set RS1 [subst "\$::Simulator_GUI::ENV${obj_idx}_SFR(RS1)"]
+ set RS0 [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_SFR(RS0)"]
+ set RS1 [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_SFR(RS1)"]
if {$RS0} {incr R_index 8}
if {$RS1} {incr R_index 16}
@@ -3228,11 +3254,11 @@ class Simulator_GUI {
# @parm String bit - Bit name (not address)
# @return void
public method sim_GUI_bit_set_clear {bool reg bit} {
- if {!$gui_initialized} {return}
+ if {!$sim_gui_gui_initialized} {return}
if {$bool} {
$Simulator_panel_parent._${reg}_${bit} configure -fg $on_color
- } {
+ } else {
$Simulator_panel_parent._${reg}_${bit} configure -fg $off_color
}
}
@@ -3244,14 +3270,14 @@ class Simulator_GUI {
# @parm Bool hex_reg - Bitmap is connected to hexadecimal entry
# @return void
public method sim_invert {bitName bitNumber registerName hex_reg} {
- if {!$gui_initialized} {return}
+ if {!$sim_gui_gui_initialized} {return}
set decVal_increment 0
# Simulator must be engaged
if {!$sim_enabled} {return}
# Determinate bit boolean value
- set bitBoolVal [subst "\$::Simulator_GUI::ENV${obj_idx}_SFR($bitName)"]
+ set bitBoolVal [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_SFR($bitName)"]
# Determinate bit decimal and hexadecimal value
set addr [symb_name_to_hex_addr $registerName]
@@ -3260,8 +3286,8 @@ class Simulator_GUI {
set bitDecVal 0
set bitmap_hex_validation_ena 0
if {$hex_reg} {
- set decVal [expr "0x[subst "\$::Simulator_GUI::ENV${obj_idx}_${registerName}"]"]
- } {
+ set decVal [expr "0x[subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_${registerName}"]"]
+ } else {
set decVal [$this getSfrDEC $addr]
}
switch -- $bitNumber {
@@ -3279,7 +3305,7 @@ class Simulator_GUI {
if {$bitBoolVal} {
$Simulator_panel_parent._${registerName}_$bitName configure -fg $off_color
set decVal_increment -$bitDecVal
- } {
+ } else {
$Simulator_panel_parent._${registerName}_$bitName configure -fg $on_color
set decVal_increment $bitDecVal
}
@@ -3434,16 +3460,16 @@ class Simulator_GUI {
{86} {return SPDR}
{96} {return EECON}
{8F} {
- if {[$this get_feature_avaliable ckcon]} {
+ if {[$this get_feature_available ckcon]} {
return {CKCON}
- } {
+ } else {
return {CLKREG}
}
}
{A7} {
- if {[$this get_feature_avaliable wdtcon]} {
+ if {[$this get_feature_available wdtcon]} {
return {WDTCON}
- } {
+ } else {
return {WDTPRG}
}
}
@@ -3453,7 +3479,7 @@ class Simulator_GUI {
## Switch active register bank (Current bank number is based on bits SFR(RS0) SFR(RS1))
# @return void
public method sim_switch_bank {} {
- if {!$gui_initialized} {return}
+ if {!$sim_gui_gui_initialized} {return}
# Determinate bank offset
set bnk [$this getBank]
@@ -3461,7 +3487,7 @@ class Simulator_GUI {
# Synchronize active bank register entries
for {set i 0} {$i < 8} {incr i} {
- set value [subst "\$::Simulator_GUI::ENV${obj_idx}_DATA([expr {$index + $i}])"]
+ set value [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_DATA([expr {$index + $i}])"]
set ::Simulator_GUI::ENV${obj_idx}_R$i $value
}
}
@@ -3661,7 +3687,7 @@ class Simulator_GUI {
# Register name (SFR only)
} else {
- set val [subst "\$::Simulator_GUI::ENV${obj_idx}_$addr"]
+ set val [subst -nocommands "\$::Simulator_GUI::ENV${obj_idx}_$addr"]
set addr [symb_name_to_hex_addr $addr]
append addr { SFR}
}
@@ -3675,9 +3701,12 @@ class Simulator_GUI {
# @return Bool - result
public method clock_validate {number} {
# Check for allowed characters
- if {![string is digit -strict $number]} {
+ if {$number == {}} {
+ set number 0
+ } elseif {![regexp {^\d+(\.\d*)?$} $number]} {
return 0
}
+ set number [string trimright $number {.}]
# Check for allowed range
if {$number > 99999} {
@@ -3697,11 +3726,11 @@ class Simulator_GUI {
# @parm String args - any arguments
# @return void
public method simulator_hexeditor {args} {
- if {!$gui_initialized} {return}
+ if {!$sim_gui_gui_initialized} {return}
eval "$hexeditor $args"
}
- ## Binding for event CellValueChanged in hexeditor
+ ## Binding for event CellValueChanged in hex editor
# @parm Int address - Address of changed cell
# @parm Int value - New cell value
# @return void
@@ -3716,7 +3745,7 @@ class Simulator_GUI {
if {$address < 32} {
set ::Simulator_GUI::ENV${obj_idx}_DATA($address) $value
entry_bank_reg_sync $address $value
- } {
+ } else {
entry_idata_reg_sync $address $value
}
}
@@ -3729,7 +3758,7 @@ class Simulator_GUI {
public method simulator_gui_scroll_set {orient frac0 frac1} {
if {$orient == {x}} {
set scrollbar $horizontal_scrollbar
- } {
+ } else {
set scrollbar $vertical_scrollbar
}
@@ -3740,11 +3769,11 @@ class Simulator_GUI {
update
}
# Show scrollbar
- } {
+ } else {
if {![winfo ismapped $scrollbar]} {
if {$orient == {x}} {
pack $scrollbar -fill x -side top -before $scrollable_frame
- } {
+ } else {
pack $scrollbar -fill y -side left
}
}
@@ -3761,7 +3790,7 @@ class Simulator_GUI {
unset ::Simulator_GUI::ENV${obj_idx}_${var}
}
}
- if {$gui_initialized} {
+ if {$sim_gui_gui_initialized} {
menu_Sbar_remove $bitmenu
}
}
@@ -3781,14 +3810,14 @@ class Simulator_GUI {
## Change image on button "Step over" (from "Pause" to "Goto" or backwards)
# @return void
public method invert_stepover_button {} {
- if {!$gui_initialized || !$sim_enabled} {return}
+ if {!$sim_gui_gui_initialized || !$sim_enabled} {return}
# Determinate ID of the current image
set image [$ctrl_f.controls_quick_step cget -image]
# Change image
if {$image == {::ICONS::16::goto2}} {
$ctrl_f.controls_quick_step configure -image ::ICONS::16::player_pause
- } {
+ } else {
$ctrl_f.controls_quick_step configure -image ::ICONS::16::goto2
}
}
@@ -3796,14 +3825,14 @@ class Simulator_GUI {
## Change image on button "Animate" (from "Pause" to "Right arrow" or backwards)
# @return void
public method invert_animate_button {} {
- if {!$gui_initialized || !$sim_enabled} {return}
+ if {!$sim_gui_gui_initialized || !$sim_enabled} {return}
# Determinate ID of the current image
set image [$ctrl_f.controls_animate cget -image]
# Change image
if {$image == {::ICONS::16::1rightarrow}} {
$ctrl_f.controls_animate configure -image ::ICONS::16::player_pause
- } {
+ } else {
$ctrl_f.controls_animate configure -image ::ICONS::16::1rightarrow
}
}
@@ -3811,14 +3840,14 @@ class Simulator_GUI {
## Change image on button "Run" (from "Pause" to "Double right arrow" or backwards)
# @return void
public method invert_run_button {} {
- if {!$gui_initialized || !$sim_enabled} {return}
+ if {!$sim_gui_gui_initialized || !$sim_enabled} {return}
# Determinate ID of the current image
set image [$ctrl_f.controls_run cget -image]
# Change image
if {$image == {::ICONS::16::2rightarrow}} {
$ctrl_f.controls_run configure -image ::ICONS::16::player_pause
- } {
+ } else {
$ctrl_f.controls_run configure -image ::ICONS::16::2rightarrow
}
}
@@ -3826,11 +3855,11 @@ class Simulator_GUI {
## Set state of button "StepBack" on simulator control panel
# @return void
public method stepback_button_set_ena {bool} {
- if {!$gui_initialized} {return}
+ if {!$sim_gui_gui_initialized} {return}
if {$bool} {
set state {normal}
- } {
+ } else {
set state {disabled}
}
$ctrl_f.controls_stepback configure -state $state
@@ -3839,7 +3868,7 @@ class Simulator_GUI {
## Disable simulator control panel (shoud be called after simulator engine disengagement)
# @return void
public method sim_disable {} {
- if {!$gui_initialized} {return}
+ if {!$sim_gui_gui_initialized} {return}
set sim_enabled 0 ;# Clear enabled flag
@@ -3877,7 +3906,7 @@ class Simulator_GUI {
## Enable simulator control panel (shoud be called after simulator engine engagement)
# @return void
public method sim_enable {} {
- if {!$gui_initialized} {CreateSimulatorGUI}
+ if {!$sim_gui_gui_initialized} {CreateSimulatorGUI}
set sim_enabled 1 ;# Set enabled flag
@@ -3915,7 +3944,12 @@ class Simulator_GUI {
# @parm String text - text to display
# @return void
public method sim_txt_output {txt} {
- tk_messageBox -title [mc "Simulator"] -type ok -message $txt
+ tk_messageBox \
+ -parent . \
+ -icon info \
+ -type ok \
+ -message $txt \
+ -title [mc "Simulator"]
}
## Focus on the given target entry widget if the current insertion index is equivalent to the end index
@@ -3944,10 +3978,10 @@ class Simulator_GUI {
focus $target_entry
}
- ## Get list of avaliable SFRs
+ ## Get list of available SFRs
# @return List - {{dec_addr reg_name} ...}
public method simulator_get_sfrs {} {
- if {!$gui_initialized} {CreateSimulatorGUI}
+ if {!$sim_gui_gui_initialized} {CreateSimulatorGUI}
return $sf_registers
}
@@ -3967,15 +4001,15 @@ class Simulator_GUI {
if {$bool} {
if {[$widget cget -font] == $smallfont} {
set bg $small_color
- } {
+ } else {
set bg $name_color
}
set fg {#FFFFFF}
- } {
- set bg {#EEEEEE}
+ } else {
+ set bg ${::COMMON_BG_COLOR}
if {[$widget cget -font] == $smallfont} {
set fg $small_color
- } {
+ } else {
set fg $name_color
}
}
@@ -3984,3 +4018,7 @@ class Simulator_GUI {
$widget configure -bg $bg -fg $fg
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/stackmonitor.tcl b/lib/simulator/stackmonitor.tcl
index 8f83ab2..b51fabb 100755..100644
--- a/lib/simulator/stackmonitor.tcl
+++ b/lib/simulator/stackmonitor.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 _STACKMONITOR_TCL ] } {
+set _STACKMONITOR_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
@@ -31,20 +36,20 @@ class StackMonitor {
## COMMON
common push_value {} ;# String: Value to PUSH onto the stack by user
- common count 0 ;# Int: Counter of intances
+ common stack_mon_count 0 ;# Int: Counter of intances
common geometry ${::CONFIG(STACK_MON_GEOMETRY)} ;# Geometry: Last window geometry
common collapsed ${::CONFIG(STACK_MON_COLLAPSED)};# Bool: Bottom bar hidden
# Font for the text widget representing the stack (bold)
- common font0 [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight bold \
+ common font0 [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
]
# Font for the text widget representing the stack (normal)
- common font1 [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight normal \
+ common font1 [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight normal \
]
## PRIVATE
@@ -64,8 +69,8 @@ class StackMonitor {
constructor {} {
# Increment counter of object instances
- incr count
- set obj_idx $count
+ incr stack_mon_count
+ set obj_idx $stack_mon_count
}
destructor {
@@ -84,8 +89,8 @@ class StackMonitor {
set dialog_opened 1
# Create dialog window
- set win [toplevel .stack_monitor$count -class {Interrupt monitor} -bg {#EEEEEE}]
- incr count
+ set win [toplevel .stack_monitor${stack_mon_count} -class {Interrupt monitor} -bg ${::COMMON_BG_COLOR}]
+ incr stack_mon_count
# Create window frames (main frame and status bar, etc.)
set top_frame [frame $win.top_frame]
@@ -106,19 +111,19 @@ class StackMonitor {
-font $font0 -width 27 \
-justify left -anchor w -background {#DDDDDD} \
-bd 0 -text [mc "Addr HH Dec Binary Oct A"] \
- ]
- pack $values_txt -fill y -expand 1
+ ] -anchor w -fill x
+ pack $values_txt -fill both -expand 1
$values_txt tag configure tag_general -background {#CCCCFF}
$values_txt tag configure tag_subprog -background {#CCFFCC}
$values_txt tag configure tag_interrupt -background {#FFCCCC}
bind $values_txt <ButtonRelease-3> {break}
bind $values_txt <<Selection>> "false_selection $values_txt; break"
# Scrollbar
- pack $left_frame -side left -fill y -expand 1
+ pack $left_frame -side left -fill both -expand 1
pack [ttk::scrollbar $top_frame.scrollbar \
-command "$values_txt yview" \
-orient vertical \
- ] -side right -fill y -expand 1
+ ] -side right -fill y
## Stack pointer
@@ -166,7 +171,7 @@ class StackMonitor {
pack $col_exp_button -side right -padx 5
# Pack frames except for the bottom bar (with legend)
- pack $top_frame -fill y -expand 1
+ pack $top_frame -fill both -expand 1
pack $bottom_frame -anchor w -fill x
## Create bottom bar (with legend)
@@ -178,7 +183,7 @@ class StackMonitor {
pack [label $tool_frame.lf.sl1 -text [mc "Subprogram"] -font $font0 -bg {#CCFFCC}] -side left -fill y -padx 3
pack [label $tool_frame.lf.il1 -text [mc "Interrupt"] -font $font0 -bg {#FFCCCC}] -side left -fill y
- # Show or keep the bottom bar hidden acording to previous session
+ # Show or keep the bottom bar hidden according to previous session
if {!$collapsed} {
set collapsed [expr {!$collapsed}]
stack_monitor_col_exp
@@ -187,7 +192,8 @@ class StackMonitor {
# Set window attributes
wm iconphoto $win ::ICONS::16::kcmmemory_ST
- wm title $win [mc "Stack - %s - MCU 8051 IDE" [string trim $this {:}]]
+ wm title $win [mc "Stack - %s - MCU 8051 IDE" [$this cget -projectName]]
+ wm minsize $win 225 90
if {$geometry != {}} {
wm geometry $win $geometry
}
@@ -313,7 +319,7 @@ class StackMonitor {
if {$collapsed} {
set image 2downarrow
pack forget $tool_frame
- } {
+ } else {
set image 2uparrow
pack $tool_frame -fill y -anchor nw
}
@@ -381,7 +387,7 @@ class StackMonitor {
}
# Create toplevel window
- set dlg [toplevel .manual_push${obj_idx} -class {Push value onto stack} -bg {#EEEEEE}]
+ set dlg [toplevel .manual_push${obj_idx} -class {Push value onto stack} -bg ${::COMMON_BG_COLOR}]
# Create label, entryBox and horizontal separator
pack [label $dlg.lbl -text [mc "Push value onto stack (HEX)"]] -fill x -anchor w -padx 5
@@ -411,7 +417,7 @@ class StackMonitor {
-compound left \
-image ::ICONS::16::down0 \
-command "$this stack_monitor_manual_push_val" \
- ] -side left
+ ] -side left -padx 2
pack [ttk::button $buttonFrame.cancel \
-width 5 \
-text [mc "Close"] \
@@ -420,18 +426,19 @@ class StackMonitor {
-command "
grab release $dlg
destroy $dlg" \
- ] -side left
+ ] -side left -padx 2
pack $buttonFrame -side right -padx 5
# Set window attributes
wm iconphoto $dlg ::ICONS::16::kcmmemory_ST
wm title $dlg [mc "Push value onto stack."]
wm minsize $dlg 200 60
+ wm transient $dlg $win
wm protocol $dlg WM_DELETE_WINDOW "
grab release $dlg
destroy $dlg"
- raise $dlg
update
+ raise $dlg
focus $dlg.ent
}
@@ -472,7 +479,7 @@ class StackMonitor {
if {$enabled} {
set state {normal}
- } {
+ } else {
set state {disabled}
}
@@ -517,3 +524,7 @@ class StackMonitor {
$values_txt configure -state disabled
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/stopwatch.tcl b/lib/simulator/stopwatch.tcl
index 407cdd3..353ac41 100755..100644
--- a/lib/simulator/stopwatch.tcl
+++ b/lib/simulator/stopwatch.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 _STOPWATCH_TCL ] } {
+set _STOPWATCH_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Stopwatch timer for MCU simulator
@@ -28,7 +33,7 @@
class Stopwatch {
## Class variables
- common count 0 ;# Int: Counter of class instances
+ common stopw_count 0 ;# Int: Counter of class instances
# List: Short names of stopwatch entries
common stats_keys {
US CC IC
@@ -43,16 +48,6 @@ class Stopwatch {
{Subprogram calls} {RET} {RETI}
{Breakpoints}
}
- # Normal font (for entry boxes)
- common normal_font [font create \
- -family Helvetica \
- -size -12 -weight normal\
- ]
- # Bold font (for entry boxes)
- common bold_font [font create \
- -family Helvetica \
- -size -12 -weight bold \
- ]
## Private varibales
private variable win ;# Widget: Dialog window
@@ -68,15 +63,16 @@ class Stopwatch {
constructor {} {
# Configure ttk styles
- if {!$count} {
+ if {!$stopw_count} {
ttk::style configure Stopwatch.TEntry -fieldreadonlybackground {#F8F8F8}
ttk::style configure Stopwatch_Focused_D.TEntry -fieldbackground {#AAAAFF} -fieldreadonlybackground {#AAAAFF}
+ ttk::style configure Stopwatch_Focused_D_Invalid.TEntry -fieldbackground {#AAAAFF} -foreground {#FF0000}
ttk::style configure Stopwatch_Focused_I.TEntry -fieldbackground {#DDDDFF} -fieldreadonlybackground {#DDDDFF}
}
# Increment counter of object instances
- set obj_idx $count
- incr count
+ set obj_idx $stopw_count
+ incr stopw_count
# Restore configuration from the previous session
set i 0
@@ -116,7 +112,7 @@ class Stopwatch {
# @return void
public method stopwatch_invoke_dialog {} {
if {$dialog_opened} {return}
- set win [toplevel .stopwatch$obj_idx -class {Stopwatch} -bg {#EEEEEE}]
+ set win [toplevel .stopwatch$obj_idx -class {Stopwatch} -bg ${::COMMON_BG_COLOR}]
set dialog_opened 1
set stopwatch_on 1
@@ -126,11 +122,15 @@ class Stopwatch {
bind $win <Control-Key-q> "destroy $win; break"
bindtags $win [list $win Toplevel all .]
- wm title $win "[mc {Stopwatch}] - [string trim $this {:}] - MCU 8051 IDE"
+ wm title $win "[mc {Stopwatch}] - [$this cget -projectName] - MCU 8051 IDE"
wm iconphoto $win ::ICONS::22::history
wm protocol $win WM_DELETE_WINDOW "$this stopwatch_close"
+ wm resizable $win 0 0
+ update
catch {
- wm geometry $win $window_geometry
+ wm geometry $win [regsub {^\=?\d+x\d+} $window_geometry \
+ [regsub {\+\d+\+\d+$} [wm geometry $win] {}] \
+ ]
}
}
@@ -146,18 +146,18 @@ class Stopwatch {
set stop_a 0
foreach key $stats_keys {
# Overall
- set org_O [subst "\$::Stopwatch::text_vars${obj_idx}($key,O)"]
+ set org_O [subst -nocommands "\$::Stopwatch::text_vars${obj_idx}($key,O)"]
set ::Stopwatch::text_vars${obj_idx}($key,O) $run_statistics($i)
# Current
if {$stopwatch_on} {
incr ::Stopwatch::text_vars${obj_idx}($key,C) [expr {$run_statistics($i) - $org_O}]
- set stop_a [subst "\$::Stopwatch::text_vars${obj_idx}($key,S)"]
+ set stop_a [subst -nocommands "\$::Stopwatch::text_vars${obj_idx}($key,S)"]
# Conditional stop
- if {$stop_a && $stop_a <= [subst "\$::Stopwatch::text_vars${obj_idx}($key,C)"]} {
+ if {$stop_a && $stop_a <= [subst -nocommands "\$::Stopwatch::text_vars${obj_idx}($key,C)"]} {
stopwatch_start_stop
- if {[subst "\$::Stopwatch::text_vars${obj_idx}(stop_sim)"]} {
+ if {[subst -nocommands "\$::Stopwatch::text_vars${obj_idx}(stop_sim)"]} {
if {[$this sim_run_in_progress]} {
$this sim_run
} elseif {[$this sim_anim_in_progress]} {
@@ -232,7 +232,9 @@ class Stopwatch {
# - Label "STOPPED"
set label_stopped_lbl [label $top_frame.label_stopped_lbl \
-font [font create \
- -family {Helvetica} -size -21 -weight bold \
+ -family {Helvetica} \
+ -size -21 \
+ -weight bold \
] -text {STOPPED} -fg {#FF0000} -pady 0 \
]
@@ -299,6 +301,8 @@ class Stopwatch {
bind $entrybox <Key-Down> "$this stopwatch_entry_key $key $tp down; break"
bind $entrybox <Key-Left> "$this stopwatch_entry_key $key $tp left; break"
bind $entrybox <Key-Right> "$this stopwatch_entry_key $key $tp right; break"
+ bind $entrybox <Shift-Key-Left> "continue"
+ bind $entrybox <Shift-Key-Right> "continue"
bind $entrybox <Key-Tab> "$this stopwatch_entry_key $key $tp tab; break"
if {!$::MICROSOFT_WINDOWS} {
bind $entrybox <Key-ISO_Left_Tab> "$this stopwatch_entry_key $key $tp stab; break"
@@ -356,7 +360,7 @@ class Stopwatch {
$entryboxes($key,C) configure -style Stopwatch_Focused_I.TEntry
$entryboxes($key,S) configure -style Stopwatch_Focused_I.TEntry
$entryboxes($key,$type) configure -style Stopwatch_Focused_D.TEntry
- } {
+ } else {
$entryboxes($key,$type) selection clear
$entryboxes($key,C) configure -style TEntry
$entryboxes($key,S) configure -style TEntry
@@ -459,11 +463,11 @@ class Stopwatch {
# Adjust foreground color for entrybox in column "Current"
if {$type == {C} && $string != {}} {
- set max [subst "\$::Stopwatch::text_vars${obj_idx}($key,S)"]
- if {$max && $string >= $max} {
- $entryboxes($key,C) configure -fg {#FF0000} -font $bold_font
- } {
- $entryboxes($key,C) configure -fg {#000000} -font $normal_font
+ set max [subst -nocommands "\$::Stopwatch::text_vars${obj_idx}($key,S)"]
+ if {$max != {} && $max != 0 && $string >= $max} {
+ $entryboxes($key,C) configure -style Stopwatch_Focused_D_Invalid.TEntry
+ } else {
+ $entryboxes($key,C) configure -style Stopwatch_Focused_D.TEntry
}
}
@@ -471,7 +475,7 @@ class Stopwatch {
if {$type == {C} || $type == {S}} {
if {$string != {} && $string != 0} {
$clearbuttons($key,$type) configure -state normal
- } {
+ } else {
$clearbuttons($key,$type) configure -state disabled
}
}
@@ -500,13 +504,13 @@ class Stopwatch {
# @parm Bool text__html - File type (1 == Plain text; 0 == XHTML)
# @return void
public method stopwatch_save {text__html} {
- # Determinate list of avaliable file extensions
+ # Determinate list of available file extensions
if {$text__html} {
set filetypes [list \
[list [::mc "Text files"] {*.txt}] \
[list [::mc "All files"] {*}] \
]
- } {
+ } else {
set filetypes [list \
[list [::mc "HTML files"] {*.html}] \
[list [::mc "All files"] {*}] \
@@ -519,7 +523,7 @@ class Stopwatch {
-directory [$this cget -projectPath] \
-master $win -filetypes [mc $filetypes] \
-defaultmask 0 -multiple 0 \
- -initialfile [string trim $this {:}]
+ -initialfile [$this cget -projectName]
# Open file after press of OK button
::fsd setokcmd "
@@ -544,7 +548,7 @@ class Stopwatch {
if {![string length [file extension $filename]]} {
if {$text__html} {
append filename {.txt}
- } {
+ } else {
append filename {.html}
}
}
@@ -559,7 +563,7 @@ class Stopwatch {
-title [mc "Overwrite file"] \
-message [mc "A file name '%s' already exists. Are you sure you want to overwrite it ?" [file tail $filename]]
] != {yes}
- } {
+ } then {
return
}
# Create a backup file
@@ -570,8 +574,8 @@ class Stopwatch {
# Open the specified file
if {[catch {
- set file [open $filename w 420]
- }]} {
+ set file [open $filename w 0640]
+ }]} then {
tk_messageBox \
-parent . \
-type ok \
@@ -584,34 +588,33 @@ class Stopwatch {
# Save as plain text
if {$text__html} {
set text {}
- append text [string repeat { } 33] "Current" \
- [string repeat { } 10] "Stop after" \
- [string repeat { } 13] "Overall"
+ append text [string repeat { } 37] [mc "Current"] \
+ [string repeat { } 10] [mc "Stop after"] \
+ [string repeat { } 13] [mc "Overall"]
puts $file $text
foreach text $stats_names key $stats_keys {
set text [mc $text]
- append text [string repeat { } [expr {20 - [string length $text]}]]
+ append text [string repeat { } [expr {24 - [string length $text]}]]
foreach subkey {C S O} {
- set val [subst "\$::Stopwatch::text_vars${obj_idx}($key,$subkey)"]
+ set val [subst -nocommands "\$::Stopwatch::text_vars${obj_idx}($key,$subkey)"]
append text [string repeat { } [expr {20 - [string length $val]}]] $val
}
puts $file $text
}
- puts $file "\nProject: [string trim $this {:}]"
- puts $file "Date: [clock format [clock seconds] -format {%D}]"
- puts $file "Generated by ${::APPNAME} ( http://mcu8051ide.sf.net )"
+ puts $file "\n[mc {Project:}] [$this cget -projectName]"
+ puts $file [mc "Generated by %s" "${::APPNAME} ( http://mcu8051ide.sf.net )"]
# Save as XHTML
- } {
+ } else {
puts $file "<?xml version='1.0' encoding='utf-8' standalone='no'?>"
puts $file "<!DOCTYPE html PUBLIC"
puts $file "\t'-//W3C//DTD XHTML 1.1//EN'"
puts $file "\t'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>"
puts $file "<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>"
- puts $file "<!--\n\tCreator: ${::APPNAME}\n\tDate: [clock format [clock seconds] -format {%D}]\n-->"
+ puts $file "<!-- Creator: ${::APPNAME} -->"
puts $file "\t<head>"
- puts $file "\t\t<title>[string trim $this {:}] stopwatch state [clock format [clock seconds] -format {%D}]</title>"
+ puts $file "\t\t<title>[$this cget -projectName] stopwatch state [clock format [clock seconds] -format {%D}]</title>"
puts $file "\t\t<meta http-equiv=\"Content-Type\" content=\"application/xhtml+xml; charset=UTF-8\" />"
puts $file "\t\t<meta name=\"Generator\" content=\"${::APPNAME}\" />"
puts $file "\t\t<style type=\"text/css\">"
@@ -639,7 +642,7 @@ class Stopwatch {
puts $file "\t\t<table style=\"border-width: 1px\">"
puts $file "\t\t\t<col /><col /><col /><col />"
puts $file "\t\t\t<thead>"
- puts $file "\t\t\t\t<tr class=\"sw_header\"><th>&nbsp;</th><th>Current</th><th>Stop after</th><th>Overall</th></tr>"
+ puts $file "\t\t\t\t<tr class=\"sw_header\"><th>&nbsp;</th><th>[mc {Current}]</th><th>[mc {Stop after}]</th><th>[mc {Overall}]</th></tr>"
puts $file "\t\t\t</thead>"
puts $file "\t\t\t<tbody>"
foreach text $stats_names key $stats_keys {
@@ -647,7 +650,7 @@ class Stopwatch {
puts $file "\t\t\t\t\t<td class=\"sw_header\">[mc $text]</td>"
foreach subkey {C S O} {
puts -nonewline $file "\t\t\t\t\t<td class=\"sw_$subkey\">"
- puts -nonewline $file [subst "\$::Stopwatch::text_vars${obj_idx}($key,$subkey)"]
+ puts -nonewline $file [subst -nocommands "\$::Stopwatch::text_vars${obj_idx}($key,$subkey)"]
puts $file "</td>"
}
puts $file "\t\t\t\t</tr>"
@@ -656,9 +659,8 @@ class Stopwatch {
puts $file "\t\t</table>"
puts $file "\t\t<p>"
- puts $file "\t\t\tProject: <b>[string trim $this {:}]</b><br />"
- puts $file "\t\t\tDate: <b>[clock format [clock seconds] -format {%D}]</b><br />"
- puts $file "\t\t\tGenerated by ${::APPNAME} ( <a href=\"http://mcu8051ide.sf.net\">http://mcu8051ide.sf.net</a> )"
+ puts $file "\t\t\t[mc {Project:}] <b>[$this cget -projectName]</b><br />"
+ puts $file "\t\t\t[mc {Generated by %s} "${::APPNAME} ( <a href=\"http://mcu8051ide.sf.net\">http://mcu8051ide.sf.net</a> )"]"
puts $file "\t\t</p>"
puts $file "\t</body>"
@@ -680,7 +682,7 @@ class Stopwatch {
local_status_tip $start_stop_button [mc "Stop"]
pack forget $label_stopped_lbl
# Stop
- } {
+ } else {
$start_stop_button configure -image ::ICONS::22::player_play
local_status_tip $start_stop_button [mc "Start"]
pack $label_stopped_lbl -side right -pady 0 -ipady 0
@@ -691,12 +693,16 @@ class Stopwatch {
# @return void
public method stopwatch_get_config {} {
set result $window_geometry
- lappend result [subst "\$::Stopwatch::text_vars${obj_idx}(stop_sim)"]
+ lappend result [subst -nocommands "\$::Stopwatch::text_vars${obj_idx}(stop_sim)"]
foreach key $stats_keys {
- lappend result [subst "\$::Stopwatch::text_vars${obj_idx}($key,S)"]
+ lappend result [subst -nocommands "\$::Stopwatch::text_vars${obj_idx}($key,S)"]
}
return $result
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/uart_monitor.tcl b/lib/simulator/uart_monitor.tcl
new file mode 100644
index 0000000..28d3b48
--- /dev/null
+++ b/lib/simulator/uart_monitor.tcl
@@ -0,0 +1,886 @@
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# Copyright (C) 2011 by Martin Ošmera #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _UART_MONITOR_TCL ] } {
+set _UART_MONITOR_TCL _
+# <<< File inclusion guard
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+# UART monitor
+# -------------------------------------------------------------------------
+
+class UARTMonitor {
+
+ common geometry ${::CONFIG(UART_MON_GEOMETRY)} ;# Last window geometry
+ common uart_mon_count 0 ;# Counter of intances
+
+ # Font: Tiny normal font
+ common tiny_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-9 * $::font_size_factor)}] \
+ -weight {normal} \
+ ]
+ # Font: Big bold font
+ common big_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight {bold} \
+ ]
+ # Font: Normal font
+ common normal_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-11 * $::font_size_factor)}] \
+ -weight {normal} \
+ ]
+ # Font:
+ common normal_fixed_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-11 * $::font_size_factor)}] \
+ -weight {normal} \
+ ]
+ # Font:
+ common bold_fixed_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-11 * $::font_size_factor)}] \
+ -weight {bold} \
+ ]
+
+ common rect_size 12
+ common empty_fill {#888888}
+ common empty_outline {#AAAAAA}
+
+ common MAX_G_LOG_LENGTH 100 ;# Int:
+ common MAX_D_LOG_LENGTH 100 ;# Int:
+
+ private variable dialog_opened 0 ;# Bool: Dialog window opened
+ private variable win ;# Widget: Dialog window
+
+ private variable status_bar 1
+ private variable rxd_frame
+ private variable txd_frame
+
+ private variable general_log
+ private variable general_log_length
+ private variable data_transfer_log
+ private variable data_transfer_log_length
+ private variable canvas
+ private variable bit_rect
+ private variable uart_value_label
+ private variable shift_reg
+ private variable shift_reg_bits_written
+ private variable bit
+
+ private variable graph_position
+ private variable graph_prev_states
+ private variable graph_elements
+
+ constructor {} {
+ array set data_transfer_log_length {
+ r 0 t 0
+ }
+ array set general_log_length {
+ r 0 t 0
+ }
+ array set shift_reg {
+ r 0 t 0
+ }
+ array set shift_reg_bits_written {
+ r 0 t 0
+ }
+ array set graph_position {
+ r 0 t 0
+ }
+ array set graph_prev_states {
+ t 1 r 1
+ }
+ array set graph_elements {
+ t {} r {}
+ }
+ array set bit {
+ fe 0 sm0 0
+ sm1 0 sm2 0
+ ren 0 ti 0
+ ri 0 smod1 0
+ tclk 0 rclk 0
+ }
+ }
+
+ destructor {
+ uart_monitor_close
+ }
+
+ ## Invoke interrupt monitor window
+ # @return void
+ public method uart_monitor_invoke_dialog {} {
+ set win [toplevel .uartmonitor${uart_mon_count}]
+ incr uart_mon_count
+
+ set main_frame [frame $win.main_frame]
+ set status_bar [label $win.status_bar]
+
+ # --------------------------------------------------------------
+ # RECEIVER PART
+ # --------------------------------------------------------------
+ grid [label $main_frame.r_header_lbl \
+ -font $big_font \
+ -text [mc "RxD line"] \
+ ] -row 0 -column 1 -sticky w -padx 0 -columnspan 2 -sticky we
+ # Mode:
+ grid [label $main_frame.r_mode_lbl \
+ -text [mc "Mode:"] \
+ ] -row 1 -column 1 -sticky w -padx 5
+ set uart_value_label(r_mode) [label $main_frame.r_mode_v_lbl]
+ grid $uart_value_label(r_mode) -row 1 -column 2 -sticky w -padx 5
+ # Line function:
+ grid [label $main_frame.r_lf_lbl \
+ -text [mc "Line function:"] \
+ ] -row 2 -column 1 -sticky w -padx 5
+ set uart_value_label(r_lf) [label $main_frame.r_lf_v_lbl]
+ grid $uart_value_label(r_lf) -row 2 -column 2 -sticky w -padx 5
+ # BR Generator:
+ grid [label $main_frame.r_brg_lbl \
+ -text [mc "BR Generator:"] \
+ ] -row 3 -column 1 -sticky w -padx 5
+ set uart_value_label(r_brg) [label $main_frame.r_brg_v_lbl]
+ grid $uart_value_label(r_brg) -row 3 -column 2 -sticky w -padx 5
+ # BRG prescaler:
+ grid [label $main_frame.r_brgp_lbl \
+ -text [mc "BRG prescaler:"] \
+ ] -row 4 -column 1 -sticky w -padx 5
+ set uart_value_label(r_brgp) [label $main_frame.r_brgp_v_lbl]
+ grid $uart_value_label(r_brgp) -row 4 -column 2 -sticky w -padx 5
+ # Resulting bdps:
+ grid [label $main_frame.r_rbdps_lbl \
+ -text [mc "Resulting bdps:"] \
+ ] -row 5 -column 1 -sticky w -padx 5
+ set uart_value_label(r_rbdps) [label $main_frame.r_rbdps_v_lbl]
+ grid $uart_value_label(r_rbdps) -row 5 -column 2 -sticky w -padx 5
+ # State:
+ grid [label $main_frame.r_state_lbl \
+ -text [mc "State:"] \
+ ] -row 6 -column 1 -sticky w -padx 5
+ set uart_value_label(r_state) [label $main_frame.r_state_v_lbl]
+ grid $uart_value_label(r_state) -row 6 -column 2 -sticky w -padx 5
+
+ set canvas(r) [canvas $main_frame.r_canvas \
+ -width 240 \
+ -height 175 \
+ -bg $::COMMON_BG_COLOR \
+ -highlightthickness 0 \
+ ]
+ fill_canvas r
+ grid $canvas(r) -row 8 -column 1 -columnspan 2 -sticky we
+
+ set data_transfer_log(r) [text $main_frame.r_data_transfer_log \
+ -height 4 \
+ -width 0 \
+ -bd 0 \
+ -bg $::COMMON_BG_COLOR \
+ -highlightthickness 0 \
+ -font $normal_fixed_font \
+ -wrap none \
+ -xscrollcommand [list $main_frame.r_stl_scrollbar set] \
+ ]
+ $data_transfer_log(r) tag configure tag_bold -font $bold_fixed_font
+ $data_transfer_log(r) insert end [mc "HEX \nDEC \nOCT \nASCII "]
+ $data_transfer_log(r) configure -state disabled
+ for {set i 1} {$i <= 4} {incr i} {
+ $data_transfer_log(r) tag add tag_bold $i.0 $i.5
+ }
+ grid $data_transfer_log(r) -row 9 -column 1 -columnspan 2 -sticky we
+ grid [ttk::scrollbar $main_frame.r_stl_scrollbar \
+ -orient horizontal \
+ -command [list $data_transfer_log(r) xview] \
+ ] -row 10 -column 1 -columnspan 2 -sticky we
+
+ set general_log_frame [frame $main_frame.r_general_log_frame]
+ set general_log(r) [text $general_log_frame.general_log \
+ -height 4 \
+ -width 0 \
+ -yscrollcommand [list $general_log_frame.scrollbar set] \
+ -state disabled \
+ ]
+ set general_log_sc_bar [ttk::scrollbar $general_log_frame.scrollbar \
+ -orient vertical \
+ -command [list $general_log(r) yview] \
+ ]
+ pack $general_log_sc_bar -side right -fill y
+ pack $general_log(r) -side left -fill both -expand 1
+ grid $general_log_frame -row 11 -column 1 -columnspan 2 -sticky wens -pady 2
+
+ # --------------------------------------------------------------
+ # TRANSMITTER PART
+ # --------------------------------------------------------------
+ grid [label $main_frame.t_header_lbl \
+ -font $big_font \
+ -text [mc "TxD line"] \
+ ] -row 0 -column 4 -sticky w -padx 0 -columnspan 2 -sticky we
+ # Mode:
+ grid [label $main_frame.t_mode_lbl \
+ -text [mc "Mode:"] \
+ ] -row 1 -column 4 -sticky w -padx 5
+ set uart_value_label(t_mode) [label $main_frame.t_mode_v_lbl]
+ grid $uart_value_label(t_mode) -row 1 -column 5 -sticky w -padx 5
+ # Line function:
+ grid [label $main_frame.t_lf_lbl \
+ -text [mc "Line function:"] \
+ ] -row 2 -column 4 -sticky w -padx 5
+ set uart_value_label(t_lf) [label $main_frame.t_lf_v_lbl]
+ grid $uart_value_label(t_lf) -row 2 -column 5 -sticky w -padx 5
+ # BR Generator:
+ grid [label $main_frame.t_brg_lbl \
+ -text [mc "BR Generator:"] \
+ ] -row 3 -column 4 -sticky w -padx 5
+ set uart_value_label(t_brg) [label $main_frame.t_brg_v_lbl]
+ grid $uart_value_label(t_brg) -row 3 -column 5 -sticky w -padx 5
+ # BRG prescaler:
+ grid [label $main_frame.t_brgp_lbl \
+ -text [mc "BRG prescaler:"] \
+ ] -row 4 -column 4 -sticky w -padx 5
+ set uart_value_label(t_brgp) [label $main_frame.t_brgp_v_lbl]
+ grid $uart_value_label(t_brgp) -row 4 -column 5 -sticky w -padx 5
+ # Resulting bdps:
+ grid [label $main_frame.t_rbdps_lbl \
+ -text [mc "Resulting bdps:"] \
+ ] -row 5 -column 4 -sticky w -padx 5
+ set uart_value_label(t_rbdps) [label $main_frame.t_rbdps_v_lbl]
+ grid $uart_value_label(t_rbdps) -row 5 -column 5 -sticky w -padx 5
+ # State:
+ grid [label $main_frame.t_state_lbl \
+ -text [mc "State:"] \
+ ] -row 6 -column 4 -sticky w -padx 5
+ set uart_value_label(t_state) [label $main_frame.t_state_v_lbl]
+ grid $uart_value_label(t_state) -row 6 -column 5 -sticky w -padx 5
+
+ set canvas(t) [canvas $main_frame.t_canvas \
+ -width 240 \
+ -height 175 \
+ -bg $::COMMON_BG_COLOR \
+ -highlightthickness 0 \
+ ]
+ fill_canvas t
+ grid $canvas(t) -row 8 -column 4 -columnspan 2 -sticky nw
+
+ set data_transfer_log(t) [text $main_frame.t_data_transfer_log \
+ -height 4 \
+ -width 0 \
+ -bd 0 \
+ -bg $::COMMON_BG_COLOR \
+ -highlightthickness 0 \
+ -font $normal_fixed_font \
+ -wrap none \
+ -xscrollcommand [list $main_frame.t_stl_scrollbar set] \
+ ]
+ $data_transfer_log(t) tag configure tag_bold -font $bold_fixed_font
+ $data_transfer_log(t) insert end [mc "HEX \nDEC \nOCT \nASCII "]
+ $data_transfer_log(t) configure -state disabled
+ for {set i 1} {$i <= 4} {incr i} {
+ $data_transfer_log(t) tag add tag_bold $i.0 $i.5
+ }
+ grid $data_transfer_log(t) -row 9 -column 4 -columnspan 2 -sticky we
+ grid [ttk::scrollbar $main_frame.t_stl_scrollbar \
+ -orient horizontal \
+ -command [list $data_transfer_log(t) xview] \
+ ] -row 10 -column 4 -columnspan 2 -sticky we
+
+ set general_log_frame [frame $main_frame.t_general_log_frame]
+ set general_log(t) [text $general_log_frame.general_log \
+ -height 4 \
+ -width 0 \
+ -yscrollcommand [list $general_log_frame.scrollbar set] \
+ -state disabled \
+ ]
+ set general_log_sc_bar [ttk::scrollbar $general_log_frame.scrollbar \
+ -orient vertical \
+ -command [list $general_log(t) yview] \
+ ]
+ pack $general_log_sc_bar -side right -fill y
+ pack $general_log(t) -side left -fill both -expand 1
+ grid $general_log_frame -row 11 -column 4 -columnspan 2 -sticky wens -pady 2
+
+ grid [ttk::separator $main_frame.sep -orient vertical] -row 0 -column 3 -rowspan 12 -padx 2 -sticky ns
+ pack $main_frame -fill y -padx 2 -pady 2 -anchor nw -expand 1
+
+ # Pack main frame and create bottom frame
+ pack $main_frame -fill both -expand 1
+ pack [ttk::separator $win.sep -orient horizontal] \
+ -fill x -pady 1
+ pack $status_bar -side left -fill x -padx 5
+ pack [ttk::button $win.close_but \
+ -text [mc "Close"] \
+ -compound left \
+ -command [list $this uart_monitor_close] \
+ -image ::ICONS::16::button_cancel \
+ ] -side right -pady 2 -padx 5
+ uart_monitor_set_status_tip $win.close_but [mc "Close this dialog window"]
+
+ # Set window attributes
+ wm iconphoto $win ::ICONS::16::__blockdevice
+ wm title $win "[mc {UART Monitor}] - [$this cget -projectName] - MCU 8051 IDE"
+ wm minsize $win 500 500
+ wm resizable $win 1 1
+ wm protocol $win WM_DELETE_WINDOW [list $this uart_monitor_close]
+ bindtags $win [list $win Toplevel all .]
+
+ update idletasks
+ if {$geometry != {}} {
+ regsub {\+\d+\+\d+} $geometry [format {+%d+%d} [winfo width $win] [winfo height $win]] geometry
+ wm geometry $win $geometry
+ }
+
+ set dialog_opened 1
+
+# #< DEBUG !!!
+# uart_monitor_byte_received 100 111 132
+# uart_monitor_byte_transmitted 101 112 122
+#
+ uart_monitor_refresh_configuration
+ uart_monitor_write_to_log r "THIS TOOL IS NOT FUNCTIONAL YET!"
+ uart_monitor_write_to_log t "THIS TOOL IS NOT FUNCTIONAL YET!"
+#
+# uart_monitor_shift_reg_input r 1 1
+# uart_monitor_shift_reg_input r 1 0
+# uart_monitor_shift_reg_input r 1 0
+# uart_monitor_shift_reg_input r 1 1
+# uart_monitor_shift_reg_input r 1 1
+#
+# uart_monitor_shift_reg_input t 0 1
+# uart_monitor_shift_reg_input t 0 0
+# uart_monitor_shift_reg_input t 0 0
+# uart_monitor_shift_reg_input t 0 1
+# uart_monitor_shift_reg_input t 0 1
+#
+# uart_monitor_update_sbuf r
+# uart_monitor_update_sbuf t
+#
+# uart_monitor_graph_draw t {1 0 1 0 1}
+# uart_monitor_graph_draw t {1 0 1 1 1}
+# uart_monitor_graph_draw t {0 1 1 1 1}
+# uart_monitor_graph_draw t {1 0 1 1 1}
+# uart_monitor_graph_draw t {1 0 1 1 0}
+# uart_monitor_graph_draw t {1 0 1 0 1}
+# uart_monitor_graph_draw t {1 0 1 1 1}
+# uart_monitor_graph_draw t {0 1 1 1 1}
+# uart_monitor_graph_draw t {1 0 1 1 1}
+# uart_monitor_graph_draw t {1 0 1 1 0}
+# #> DEBUG !!!
+ }
+
+ public method uart_monitor_close {} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ set geometry [wm geometry $win]
+ set dialog_opened 0
+
+ if {[winfo exists $win]} {
+ destroy $win
+ }
+ }
+
+ ## Set status bar tip for certain widget
+ # @parm Widget widget - Some button or label ...
+ # @parm String text - Status tip
+ # @return void
+ private method uart_monitor_set_status_tip {widget text} {
+ bind $widget <Enter> [list $status_bar configure -text $text]
+ bind $widget <Leave> [list $status_bar configure -text {}]
+ }
+
+ private method fill_canvas {side} {
+ set labels [list 8 7 6 5 4 3 2 1 0]
+
+ set x 5
+ set j 0
+ for {set i 0} {$i < 10} {incr i} {
+ set y 20
+ set bit_rect(s,$side,$i) [$canvas($side) create rectangle $x $y \
+ [expr {$x + $rect_size}] [expr {$y + $rect_size}] \
+ -fill $empty_fill -outline $empty_outline \
+ ]
+
+ if {($side == {r} && $i > 0 && $i < 10) || ($side == {t} && $i >= 0 && $i < 9)} {
+ if {$j == 1} {
+ incr x 3
+ }
+ set y 50
+ set bit_rect(b,$side,$j) [$canvas($side) create rectangle $x $y \
+ [expr {$x + $rect_size}] [expr {$y + $rect_size}] \
+ -fill $empty_fill -outline $empty_outline \
+ ]
+ $canvas($side) create text \
+ [expr {$x + ($rect_size / 2)}] \
+ [expr {$y + ($rect_size / 2)}] \
+ -text [lindex $labels $j] \
+ -font $tiny_font
+ if {$j == 1} {
+ incr x -3
+ }
+ incr j
+ }
+
+ incr x $rect_size
+ incr x 2
+ }
+
+ $canvas($side) create text 5 5 -anchor nw -font $normal_font -text [mc "The shift register:"]
+ $canvas($side) create text 5 35 -anchor nw -font $normal_font -text "SBUF [string toupper $side]:"
+
+ # --------------------------------------------------------------
+
+ if {$side == {r}} {
+ set graph_label [list \
+ [mc "RxD"] \
+ [mc "RI"] \
+ [mc "ALE"] \
+ [mc "SHIFT"] \
+ [mc "SBUF"] \
+ ]
+ } else {
+ set graph_label [list \
+ [mc "TxD"] \
+ [mc "TI"] \
+ [mc "ALE"] \
+ [mc "SHIFT"] \
+ [mc "SBUF"] \
+ ]
+ }
+ for {set y 0} {$y < 5} {incr y} {
+ set y_0 [expr {75 + $y * 20}]
+ set y_1 [expr {$y_0 + 15}]
+
+ for {set x 45} {$x <= 235} {incr x 5} {
+ $canvas($side) create line $x $y_0 $x $y_1 -fill {#AAAAAA} -tags grid -dash .
+ }
+
+ $canvas($side) create text 5 $y_0 -anchor nw -font $bold_fixed_font -text [lindex $graph_label $y]
+
+ incr y_0 -3
+ $canvas($side) create line 45 $y_0 235 $y_0 -fill {#AAAAAA} -tags grid
+ }
+ }
+
+ public method uart_monitor_refresh_configuration {} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ set pcon [$this getSfrDEC $::Simulator_ENGINE::symbol(PCON)]
+ set scon [$this getSfrDEC $::Simulator_ENGINE::symbol(SCON)]
+
+ set bit(fe) [$this sim_engine_get_FE]
+ set bit(sm0) [$this sim_engine_get_SM0]
+ set bit(sm1) [expr {$scon & 0x40}]
+ set bit(sm2) [expr {$scon & 0x20}]
+ set bit(ren) [expr {$scon & 0x10}]
+ set bit(ti) [expr {$scon & 0x02}]
+ set bit(ri) [expr {$scon & 0x01}]
+
+ set bit(smod1) [expr {$pcon & 0x80}]
+
+ if {[$this get_feature_available t2]} {
+ set bit(tclk) [$this getBit $::Simulator_ENGINE::symbol(TCLK)]
+ set bit(rclk) [$this getBit $::Simulator_ENGINE::symbol(RCLK)]
+ } else {
+ set bit(tclk) 0
+ set bit(rclk) 0
+ }
+
+ ## Determinate mode of operation
+ # Mode 0
+ if {!$bit(sm0) && !$bit(sm1)} {
+ set mode [mc "0 (8-bit Shift register)"]
+ # Mode 1
+ } elseif {!$bit(sm0) && $bit(sm1)} {
+ set mode [mc "1 (8-bit UART)"]
+ # Mode 2
+ } elseif {$bit(sm0) && !$bit(sm1)} {
+ set mode [mc "2 (9-bit UART)"]
+ # Mode 3
+ } elseif {$bit(sm0) && $bit(sm1)} {
+ set mode [mc "3 (9-bit UART)"]
+ }
+
+ ## Determinate line functions
+ if {!$bit(sm0) && !$bit(sm1)} {
+ set r_lf [mc "Data input/output"]
+ set t_lf [mc "Shift clock output"]
+ } else {
+ set r_lf [mc "Data input"]
+ set t_lf [mc "Data output"]
+ }
+
+ ## Determinate source of baud rate clock
+ if {$bit(sm1)} {
+ if {$bit(rclk)} {
+ set r_brg [mc "Timer 2"]
+ } else {
+ set r_brg [mc "Timer 1"]
+ }
+ if {$bit(tclk)} {
+ set t_brg [mc "Timer 2"]
+ } else {
+ set t_brg [mc "Timer 1"]
+ }
+ } else {
+ set r_brg [mc "Master clock"]
+ set t_brg [mc "Master clock"]
+ }
+
+ ## Determinate resulting baud rate
+ set r_rbdps [determinate_baud_rate t]
+ set t_rbdps [determinate_baud_rate t]
+
+ ## Determinate state of the interface
+ set r_state [mc "WAITING"]
+ set t_state [mc "WAITING"]
+
+ # --------------------------------------------------------------
+ # RECEIVER PART
+ # --------------------------------------------------------------
+ $uart_value_label(r_mode) configure -text $mode
+ $uart_value_label(r_lf) configure -text $r_lf
+ $uart_value_label(r_brg) configure -text $r_brg
+ $uart_value_label(r_rbdps) configure -text $r_rbdps
+ $uart_value_label(r_state) configure -text $r_state
+
+ # --------------------------------------------------------------
+ # TRANSMITTER PART
+ # --------------------------------------------------------------
+ $uart_value_label(t_mode) configure -text $mode
+ $uart_value_label(t_lf) configure -text $t_lf
+ $uart_value_label(t_brg) configure -text $t_brg
+ $uart_value_label(t_rbdps) configure -text $t_rbdps
+ $uart_value_label(t_state) configure -text $t_state
+ }
+
+ private method determinate_baud_rate {side} {
+ # RxD side
+ if {$side == {r}} {
+ # Timer 2
+ if {$bit(rclk)} {
+ return [mc "Determinated by timer 2"]
+
+ # Timer 1
+ } else {
+ set tmod [$this getSfrDEC $::Simulator_ENGINE::symbol(PCON)]
+ if {$tmod & 0x40} {
+ return [mc "Unknown"]
+ }
+ set clock_f [expr {1000 * [$this getEngineClock] * (1 + ([$this get_X2] ? 1 : 0))}]
+ set mode [expr {($tmod & 0x30) >> 4}]
+ switch -- $mode {
+ 0 {
+ return [expr {$clock_f / 8192.0}]
+ }
+ 1 {
+ return [expr {$clock_f / 65536.0}]
+ }
+ 2 {
+ set th1 [$this getSfrDEC $::Simulator_ENGINE::symbol(TH1)]
+ return [expr {$clock_f / (256.0 - $th1)}]
+ }
+ 3 {
+ return 0
+ }
+ }
+ }
+
+ # TxD side
+ } else {
+ # Timer 2
+ if {$bit(tclk)} {
+ return [mc "Determinated by timer 2"]
+
+ # Timer 1
+ } else {
+ set tmod [$this getSfrDEC $::Simulator_ENGINE::symbol(PCON)]
+ if {$tmod & 0x40} {
+ return [mc "Unknown"]
+ }
+ set clock_f [expr {1000 * [$this getEngineClock] * (1 + ([$this get_X2] ? 1 : 0))}]
+ set mode [expr {($tmod & 0x30) >> 4}]
+ switch -- $mode {
+ 0 {
+ return [expr {$clock_f / 8192.0}]
+ }
+ 1 {
+ return [expr {$clock_f / 65536.0}]
+ }
+ 2 {
+ set th1 [$this getSfrDEC $::Simulator_ENGINE::symbol(TH1)]
+ return [expr {$clock_f / (256.0 - $th1)}]
+ }
+ 3 {
+ return 0
+ }
+ }
+ }
+ }
+
+ return [mc "Unknown"]
+ }
+
+ public method uart_monitor_update_prescaler {side value} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ $uart_value_label(${side}_brgp) configure -text $value
+ }
+
+ public method uart_monitor_byte_received {args} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ foreach byte $args {
+ write_to_data_transfer_log r $byte
+ }
+ }
+
+ public method uart_monitor_byte_transmitted {args} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ foreach byte $args {
+ write_to_data_transfer_log t $byte
+ }
+ }
+
+ private method write_to_data_transfer_log {side byte} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ $data_transfer_log($side) configure -state normal
+ if {$data_transfer_log_length($side) == $MAX_D_LOG_LENGTH} {
+ for {set i 1} {$i < 5} {incr i} {
+ $data_transfer_log($side) delete $i.4 $i.6
+ }
+ incr data_transfer_log_length($side) -1
+ }
+
+ set i [expr {6 + $data_transfer_log_length($side) * 4}]
+
+ $data_transfer_log($side) insert 1.$i [format {%3X } $byte]
+ $data_transfer_log($side) insert 2.$i [format {%3d } $byte]
+ $data_transfer_log($side) insert 3.$i [format {%3o } $byte]
+ if {[string is print -strict [format {%c} $byte]]} {
+ $data_transfer_log($side) insert 4.$i [format { %c } $byte]
+ } else {
+ $data_transfer_log($side) insert 4.$i { }
+ }
+ $data_transfer_log($side) configure -state disabled
+
+ incr data_transfer_log_length($side)
+ }
+
+ public method uart_monitor_write_to_log {side text} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ $general_log($side) configure -state normal
+ if {$general_log_length($side) == $MAX_G_LOG_LENGTH} {
+ $general_log($side) delete 1.0 2.0
+ $general_log($side) mark set {end-1l lineend}
+ }
+
+ $general_log($side) insert insert $text
+ $general_log($side) insert insert "\n"
+ $general_log($side) see insert
+ $general_log($side) configure -state disabled
+ }
+
+ public method uart_monitor_shift_reg_input {side right__left bit_val} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ incr shift_reg_bits_written($side)
+ if {$right__left} {
+ set shift_reg($side) [expr {($shift_reg($side) >> 1) | (($bit_val ? 1 : 0) << 9)}]
+ set start 0
+ set end [expr {$shift_reg_bits_written($side) - 1}]
+ } else {
+ set shift_reg($side) [expr {0x3FF & (($shift_reg($side) << 1) | ($bit_val ? 1 : 0))}]
+ set start [expr {9 - $shift_reg_bits_written($side)}]
+ set end 9
+ }
+
+ for {set i $start} {$i <= $end} {incr i} {
+ if {$shift_reg($side) & (1 << (9 - $i))} {
+ set outline ${::BitMap::one_outline}
+ set fill ${::BitMap::one_fill}
+ } else {
+ set outline ${::BitMap::zero_outline}
+ set fill ${::BitMap::zero_fill}
+ }
+
+ $canvas($side) itemconfigure $bit_rect(s,$side,$i) \
+ -outline $outline \
+ -fill $fill
+ }
+ }
+ public method uart_monitor_shift_reg_clear {side} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ for {set i 0} {$i < 9} {incr i} {
+ $canvas($side) itemconfigure $bit_rect(s,$side,$i) \
+ -outline $empty_outline \
+ -fill $empty_fill
+ }
+ set shift_reg($side) 0
+ set shift_reg_bits_written($side) 0
+ }
+ public method uart_monitor_update_sbuf {side} {
+ if {!$dialog_opened} {
+ return
+ }
+
+ if {$side == {r}} {
+ set sbuf [$this getSfrDEC $::Simulator_ENGINE::symbol(SBUFR)]
+ set bit8 [$this getBit $::Simulator_ENGINE::symbol(RB8)]
+ } else {
+ set sbuf [$this getSfrDEC $::Simulator_ENGINE::symbol(SBUFT)]
+ set bit8 [$this getBit $::Simulator_ENGINE::symbol(TB8)]
+ }
+
+ for {set i 0} {$i < 9} {incr i} {
+ if {!$i} {
+ set value $bit8
+ } else {
+ set value [expr {$sbuf & (1 << (8 - $i))}]
+ }
+
+ if {$value} {
+ set outline ${::BitMap::one_outline}
+ set fill ${::BitMap::one_fill}
+ } else {
+ set outline ${::BitMap::zero_outline}
+ set fill ${::BitMap::zero_fill}
+ }
+
+ $canvas($side) itemconfigure $bit_rect(b,$side,$i) \
+ -outline $outline \
+ -fill $fill
+ }
+ }
+ public method uart_monitor_graph_clear {side} {
+ $canvas($side) delete graph
+
+ set graph_position($side) 0
+ set graph_prev_states($side) 1
+ set graph_elements($side) [list]
+ }
+
+ public method uart_monitor_graph_draw {side values} {
+ if {$graph_position($side) == 190} {
+ $canvas($side) move graph -1 0
+ foreach items [lindex $graph_elements($side) 0] {
+ foreach item $items {
+ $canvas($side) delete $item
+ }
+ }
+ set graph_elements($side) [lreplace $graph_elements($side) 0 0]
+ incr graph_position($side) -1
+ }
+
+ set x_0 [expr {45 + $graph_position($side)}]
+ set x_1 [expr {$x_0 + 1}]
+
+ set i 0
+ set prev_state [list]
+ set graph_elems [list]
+ foreach state $values {
+ set top [expr {75 + $i * 20}]
+ set mid [expr {82 + $i * 20}]
+ set bot [expr {90 + $i * 20}]
+ switch -- [lindex $graph_prev_states($side) $i] {
+ 0 {
+ switch -- $state {
+ 0 { ;# 0 --> 0
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $bot $x_1 $bot -tags graph -fill {#00FF00}] \
+ ]
+ }
+ 1 { ;# 0 --> 1
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_0 $mid -tags graph -fill {#FF0000}] \
+ [$canvas($side) create line $x_0 $mid $x_0 $bot -tags graph -fill {#00FF00}] \
+ ]
+ }
+ default {
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_0 $bot -tags graph -fill {#0000FF}] \
+ ]
+ }
+ }
+ }
+ 1 {
+ switch -- $state {
+ 0 { ;# 1 --> 0
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_0 $mid -tags graph -fill {#FF0000}] \
+ [$canvas($side) create line $x_0 $mid $x_0 $bot -tags graph -fill {#00FF00}] \
+ ]
+ }
+ 1 { ;# 1 --> 1
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_1 $top -tags graph -fill {#FF0000}] \
+ ]
+ }
+ default {
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_0 $bot -tags graph -fill {#0000FF}] \
+ ]
+ }
+ }
+ }
+ default {
+ lappend graph_elems [list \
+ [$canvas($side) create line $x_0 $top $x_0 $bot -tags graph -fill {#0055FF}] \
+ ]
+ }
+ }
+
+ incr i
+ lappend prev_state $state
+ }
+
+ incr graph_position($side)
+ set graph_prev_states($side) $prev_state
+ lappend graph_elements($side) $graph_elems
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/simulator/virtual_uart_term.tcl b/lib/simulator/virtual_uart_term.tcl
deleted file mode 100755
index 29f3199..0000000
--- a/lib/simulator/virtual_uart_term.tcl
+++ /dev/null
@@ -1,646 +0,0 @@
-#!/usr/bin/tclsh
-# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
-
-############################################################################
-# Copyright (C) 2010 by Martin Ošmera #
-# martin.osmera@gmail.com #
-# #
-# This program is free software; you can redistribute it and#or modify #
-# it under the terms of the GNU General Public License as published by #
-# the Free Software Foundation; either version 2 of the License, or #
-# (at your option) any later version. #
-# #
-# This program is distributed in the hope that it will be useful, #
-# but WITHOUT ANY WARRANTY; without even the implied warranty of #
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
-# GNU General Public License for more details. #
-# #
-# You should have received a copy of the GNU General Public License #
-# along with this program; if not, write to the #
-# Free Software Foundation, Inc., #
-# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
-############################################################################
-
-# --------------------------------------------------------------------------
-# DESCRIPTION
-# UART monitor
-# -------------------------------------------------------------------------
-
-# LOAD PROGRAM ICONS
-# -----------------------------
-if {$argv0 != {./virtual_uart_term.tcl}} {
- set D 0
-} {
- set D 1
-}
-if {$D} {
- package require Tk
- package require img::png
- package require Itcl
- namespace import -force ::itcl::*
- package require msgcat
- namespace import -force ::msgcat::*
- package require BWidget
- set ::DEFAULT_FIXED_FONT {DejaVu Sans Mono}
- set ::MICROSOFT_WINDOWS 0
-
- set LIB_DIRNAME "/media/disk/mcu8051ide/lib"
- source "$LIB_DIRNAME/lib/hexeditor.tcl"
-
- foreach directory {16x16 22x22 32x32} ns {16 22 32} {
- namespace eval ::ICONS::${ns} {}
- foreach filename [glob "${::LIB_DIRNAME}/../icons/${directory}/*.png"] {
- set filename [file normalize $filename]
- set iconname [file tail $filename]
- regexp {^\w+} $iconname iconname
- if {[catch {
- image create photo ::ICONS::${ns}::${iconname} -format png -file $filename
- } result]} then {
- puts stderr {}
- puts -nonewline stderr $result
- image create photo ::ICONS::${ns}::${iconname}
- }
- }
- }
-
- proc menuFactory {pattern path tearoff cmdPrefix shortcuts options} {
-
- # Create menu widget
- eval "menu $path -tearoff $tearoff $options"
-
- # Iterate over menu definition list
- foreach menuitem $pattern {
- # Create array of options
- for {set i 0} {$i < 9} {incr i} {
- set menu($i) [lindex $menuitem $i]
- }
- # Determinate kind of operation
- switch $menu(0) {
- {command} {
- # Item icon
- if {$menu(5) != {}} {
- set menu(5) "::ICONS::16::$menu(5)"
- }
-
- # Adjust accelerator value
- set menu(2) $menu(2)
-
- # Create menu command
- $path add command \
- -label [mc $menu(1)] \
- -accelerator $menu(2) \
- -underline $menu(3) \
- -command "$cmdPrefix$menu(4)" \
- -image $menu(5) -compound left
-
- # Status bar tip
- if {$menu(6) != {}} {
- set itemIndex [$path index end]
- menu_Sbar_add $path $itemIndex [mc $menu(6)]
- bind $path <<MenuSelect>> "menu_Sbar $path \[%W index active\]"
- bind $path <Leave> {Sbar {}}
- }
- }
- {separator} {$path add separator}
- {radiobutton} {
- # Adjust command
- if {$menu(5) != {}} {
- set menu(5) "${cmdPrefix}$menu(5)"
- }
-
- # Adjust accelerator value
- set menu(2) [adjust_menu_accelerator $menu(2)]
-
- # Create radio button item
- $path add radiobutton \
- -label [mc $menu(1)] \
- -accelerator $menu(2) \
- -variable $menu(3) \
- -value $menu(4) \
- -command $menu(5) \
- -underline $menu(6) \
- -compound left \
- -indicatoron 0 \
- -image ::ICONS::raoff \
- -selectimage ::ICONS::raon \
- -selectcolor {#EEEEEE}
-
- # Status bar tip
- if {$menu(7) != {}} {
- set itemIndex [$path index end]
- menu_Sbar_add $path $itemIndex [mc $menu(7)]
- bind $path <<MenuSelect>> "menu_Sbar $path \[%W index active\]"
- bind $path <Leave> {Sbar {}}
- }
- }
- {checkbutton} {
- # Adjust command
- if {$menu(7) != {}} {
- set menu(7) "${cmdPrefix}$menu(7)"
- }
- # Adjust accelerator value
- set menu(2) [adjust_menu_accelerator $menu(2)]
-
- # Create checkbutton item
- $path add checkbutton \
- -label [mc $menu(1)] \
- -accelerator $menu(2) \
- -variable $menu(3) \
- -onvalue $menu(4) \
- -offvalue $menu(5) \
- -underline $menu(6) \
- -command $menu(7) \
- -compound left \
- -image ::ICONS::choff \
- -indicatoron 0 \
- -selectimage ::ICONS::chon \
- -selectcolor {#EEEEEE}
- # Status bar tip
- if {$menu(8) != {}} {
- set itemIndex [$path index end]
- menu_Sbar_add $path $itemIndex [mc $menu(8)]
- bind $path <<MenuSelect>> "menu_Sbar $path \[%W index active\]"
- bind $path <Leave> {Sbar {}}
- }
- }
- {cascade} {
- # Adjust menu name
- set menu(4) "$path$menu(4)"
- # Create new menu for cascade
- if {$menu(7) != {}} {
- menuFactory $menu(7) $menu(4) $menu(5) $cmdPrefix $menu(6) $options
- }
- # Item icon
- if {$menu(3) != {}} {
- set menu(3) "::ICONS::16::$menu(3)"
- }
- # Add cascade to this menu
- $path add cascade -label [mc $menu(1)] -underline $menu(2) \
- -image $menu(3) -menu $menu(4) -compound left
- }
- {} {return}
- default {
- error "Menu creation failed -- unknown type: $menu(0)"
- return -code 1
- }
- }
- }
- }
-
- ttk::style theme use clam
- # - ttk
- set TTK_COMMON_BG {#E0E0E0}
- ttk::style configure TFrame \
- -background {#EEEEEE}
-
- ttk::style configure TNotebook \
- -background {#EEEEEE} \
- -fieldbackground {red}
- ttk::style map TNotebook \
- -background [list \
- active red \
- pressed blue \
- pressed green \
- ]
-
- font configure TkTextFont -family {helvetica} -size -12 -weight {normal}
- font configure TkDefaultFont -family {helvetica} -size -12 -weight {normal}
-
- ttk::style configure StringNotFound.TEntry \
- -fieldbackground {#FFDDDD}
- ttk::style configure StringFound.TEntry \
- -fieldbackground {#DDFFDD}
-
- ttk::style configure Simulator.TEntry
- ttk::style map Simulator.TEntry \
- -fieldbackground [list readonly {#F8F8F8}] \
- -foreground [list readonly {#888888}]
- ttk::style configure Simulator_HG.TEntry \
- -foreground {#CC8800}
- ttk::style configure Simulator_WhiteBg.TEntry \
- -fieldbackground {#FFFFFF} \
- -fielddisabledbackground {#FFFFFF}
- ttk::style configure Simulator_WhiteBg_HG.TEntry \
- -fieldbackground {#FFFFFF} \
- -fielddisabledbackground {#FFFFFF} \
- -foreground {#CC8800}
- ttk::style configure Simulator_WhiteBg_Sel.TEntry \
- -fieldbackground {#DDDDFF} \
- -fielddisabledbackground {#DDDDFF}
- ttk::style configure Simulator_WhiteBg_HG_Sel.TEntry \
- -foreground {#CC8800} \
- -fieldbackground {#DDDDFF} \
- -fielddisabledbackground {#DDDDFF}
-
- ttk::style configure Simulator_watchdogEntry_0.TEntry \
- -fieldbackground {#88FF88} \
- -fielddisabledbackground {#66DD66}
- ttk::style map Simulator_watchdogEntry_0.TEntry \
- -foreground [list readonly {#888888}]
-
- ttk::style configure Simulator_watchdogEntry_1.TEntry \
- -fieldbackground {#FFFF55} \
- -fielddisabledbackground {#DDDD33}
- ttk::style map Simulator_watchdogEntry_1.TEntry \
- -foreground [list readonly {#888888}]
-
- ttk::style configure Simulator_watchdogEntry_2.TEntry \
- -fieldbackground {#FF5555} \
- -fielddisabledbackground {#DD3333}
- ttk::style map Simulator_watchdogEntry_2.TEntry \
- -foreground [list readonly {#888888}]
-
- ttk::style configure TLabelframe \
- -background {#EEEEEE}
- ttk::style configure TLabel \
- -background {#EEEEEE}
-
- ttk::style configure TButton \
- -background $TTK_COMMON_BG \
- -padding 0
- ttk::style configure RedBg.TButton \
- -padding 0
- ttk::style map RedBg.TButton \
- -background [list \
- active {#FFBBBB} \
- !active {#FF8888} \
- ] \
- -foreground [list \
- active {#FF0000} \
- !active {#000000} \
- ]
- ttk::style configure GreenBg.TButton \
- -padding 0
- ttk::style map GreenBg.TButton \
- -background [list \
- active {#BBFFBB} \
- !active {#88FF88} \
- ] \
- -foreground [list \
- active {#00FF00} \
- !active {#000000} \
- ]
-
- ttk::style configure Flat.TButton \
- -background {#EEEEEE} \
- -padding 0 \
- -borderwidth 1 \
- -relief flat
- ttk::style map Flat.TButton \
- -relief [list active raised] \
- -background [list disabled {#EEEEEE}]
-
- ttk::style configure TMenubutton \
- -padding 0 \
- -background $TTK_COMMON_BG
- ttk::style configure Flat.TMenubutton \
- -padding 0 \
- -background {#EEEEEE} \
- -borderwidth 1 \
- -relief flat
- ttk::style map Flat.TMenubutton \
- -relief [list active raised] \
- -background [list disabled {#EEEEEE}]
-
- ttk::style configure FlatWhite.TButton \
- -padding 0 \
- -background {#FFFFFF} \
- -borderwidth 1 \
- -relief flat
- ttk::style map FlatWhite.TButton \
- -relief [list active raised] \
- -background [list disabled {#FFFFFF}]
-
- ttk::style configure ToolButton.TButton \
- -background {#EEEEEE} \
- -padding 1 \
- -borderwidth 1 \
- -relief flat
- ttk::style map ToolButton.TButton \
- -relief [list active raised] \
- -background [list disabled {#EEEEEE}]
-
- ttk::style configure TCombobox \
- -background $TTK_COMMON_BG \
- -fieldfont [font create -family {helvetica} -size -12 -weight {normal}]
- ttk::style map TCombobox \
- -foreground [list disabled {#888888}] \
- -fieldbackground [list \
- readonly $TTK_COMMON_BG \
- disabled {#EEEEEE} \
- {!readonly !disabled} {#FFFFFF} \
- ]
-
- ttk::style configure TScrollbar \
- -background $TTK_COMMON_BG \
- -troughcolor {#F8F8F8}
-
- ttk::style configure TScale \
- -background $TTK_COMMON_BG
- ttk::style map TScale \
- -troughcolor [list \
- disabled $TTK_COMMON_BG \
- !disabled {#F8F8F8} \
- ]
-
- ttk::style configure TProgressbar \
- -background $TTK_COMMON_BG \
- -troughcolor {#F8F8F8}
- wm withdraw .
-}
-
-class VirtualUartTerminal {
- ## COMMON
- common count 0 ;# Counter of intances
- # Font: Big bold font
- common bold_font [font create \
- -family {helvetica} \
- -size -12 -weight {bold} \
- ]
- # Font: Tiny normal font
- common tiny_font [font create \
- -family {helvetica} \
- -size -9 -weight {normal} \
- ]
- # Font: Tiny bold font
- common tiny_font_bold [font create \
- -family {helvetica} \
- -size -9 -weight {bold} \
- ]
- # Font: Normal font
- common normal_font [font create \
- -family {helvetica} \
- -size -11 -weight {normal} \
- ]
- # Font: Also normal font, but a bit larger
- common big_font [font create \
- -family {helvetica} \
- -size -12 -weight {normal} \
- ]
- # List of Int: Available baud rates for RS232
- common available_baud_rates {
- 50 75 110 134 150 200
- 300 600 1200 1800 2400 4800
- 9600 19200 38400 57600 115200 230400
- 460800
- }
-
- ## PRIVATE
- private variable dialog_opened 0 ;# Bool: Dialog window opened
- private variable win ;# Widget: Dialog window
- private variable status_bar_label ;# Widget: Status bar
-
- private variable too_baud_conf {9600} ;# Int: Selected baud rate for communication
- private variable too_parity_conf {n} ;# Char: Selected type of parity
- private variable too_data_conf {8} ;# Int: Number of data bits
- private variable too_stop_conf {1} ;# Int: Number of stop bits
-
- constructor {} {
- }
-
- destructor {
- }
-
- ## Close interrupt monitor window and free its resources
- # @return void
- public method virtual_uart_termial_close {} {
- if {!$dialog_opened} {
- return
- }
-
- set geometry [wm geometry $win]
- set dialog_opened 0
- set in_progress_wdg {}
- set in_progress_flg {}
- set pending_flg {}
- set intr_priorities {}
- set avaliable_interrs {}
-
- if {[winfo exists $win]} {
- destroy $win
- }
- }
-
- ## Invoke interrupt monitor window
- # @return void
- public method virtual_uart_termial_invoke_dialog {} {
- set dialog_opened 1
-
- # Create window
- set win [toplevel .virtual_uart_term$count -class [mc "UART Monitor"] -bg {#EEEEEE}]
- incr count
-
- # Create status bar
- set status_bar_label [label $win.status_bar_label -justify left -pady 0 -anchor w]
- pack $status_bar_label -side bottom -fill x
-
- # Create top frame
- set top_frame [frame $win.top_frame]
- create_top_frame $top_frame
- pack $top_frame -fill x -anchor nw
-
- # Create bottom frame
- set bottom_frame [frame $win.bottom_frame]
- create_bottom_frame $bottom_frame
- pack $bottom_frame -fill x -anchor nw
-
- # Configure window
- wm title $win [mc "Virtual UART Terminal - MCU 8051 IDE"]
- wm iconphoto $win ::ICONS::16::_blockdevice
- wm resizable $win 0 0
- wm protocol $win WM_DELETE_WINDOW "$this virtual_uart_termial_close"
- }
-
- ## Set status bar tip for specified widget
- # @parm Widget widget - Target widget
- # @parm String text - Text of the stutus tip
- # @return void
- private method virtual_uart_termial_set_status_tip {widget text} {
- bind $widget <Enter> "$status_bar_label configure -text {$text}"
- bind $widget <Leave> "$status_bar_label configure -text {}"
- }
-
- ## Create top frame in the dialog window (connector_canvas (left) and configuration (right))
- # @parm Widget target_frame - Parent frame
- # @return void
- private method create_top_frame {target_frame} {
- #
- ## FRAME: OUR MICROCONTROLLER
- #
-
- # Create labelframe
- set our_mcu_frame [ttk::labelframe $target_frame.our_mcu_frame \
- -padding 5 \
- -labelwidget [label $target_frame.our_mcu_label \
- -font $bold_font \
- -compound left \
- -text [mc "\"Our Microcontroller\""] \
- -image ::ICONS::16::configure \
- ] \
- ]
- pack [label $our_mcu_frame.l -text "AAAA"]
- pack $our_mcu_frame -side left -fill x -expand 1 -padx 5
-
-
- #
- ## FRAME: THE OTHER DEVICE
- #
-
- # Create labelframe
- set the_other_one_frame [ttk::labelframe \
- $target_frame.the_other_one_frame \
- -padding 5 \
- -labelwidget [label $target_frame.too_label \
- -font $bold_font \
- -compound left \
- -text [mc "Terminal configuration"] \
- -image ::ICONS::16::configure \
- ] \
- ]
- # - Baud rate
- grid [label $the_other_one_frame.baud_lbl \
- -text [mc "Baud rate"] \
- ] -row 3 -column 1 -sticky w
- set baud_cb [ttk::combobox $the_other_one_frame.baud_cb \
- -state readonly \
- -width 6 \
- -exportselection 0 \
- -values $available_baud_rates \
- ]
- bind $baud_cb <<ComboboxSelected>> \
- "$this change_port_config b \[$the_other_one_frame.baud_cb get\]"
- virtual_uart_termial_set_status_tip $baud_cb [mc "Connection speed in bps"]
- grid $baud_cb -row 3 -column 2 -sticky w
- $the_other_one_frame.baud_cb current [lsearch [$the_other_one_frame.baud_cb cget -values] $too_baud_conf]
- # - Parity
- grid [label $the_other_one_frame.parity_lbl \
- -text [mc "Parity"] \
- ] -row 4 -column 1 -sticky w
- set parity_cb [ttk::combobox $the_other_one_frame.parity_cb \
- -values {none odd even mark space} \
- -state readonly \
- -width 6 \
- -exportselection 0 \
- ]
- bind $parity_cb <<ComboboxSelected>> \
- "$this change_port_config p \[$the_other_one_frame.parity_cb get\]"
- virtual_uart_termial_set_status_tip $parity_cb [mc "Parity"]
- grid $parity_cb -row 4 -column 2 -sticky w
- $the_other_one_frame.parity_cb current [lsearch {n o e m s} $too_parity_conf]
- # - Data bits
- grid [label $the_other_one_frame.data_lbl \
- -text [mc "Data bits"] \
- ] -row 5 -column 1 -sticky w
- set data_cb [ttk::combobox $the_other_one_frame.data_cb \
- -state readonly \
- -width 1 \
- -values {5 6 7 8} \
- -exportselection 0 \
- ]
- bind $data_cb <<ComboboxSelected>> \
- "$this change_port_config d \[$the_other_one_frame.data_cb get\]"
- virtual_uart_termial_set_status_tip $data_cb [mc "Number of data bits"]
- grid $data_cb -row 5 -column 2 -sticky w
- $the_other_one_frame.data_cb current [lsearch [$the_other_one_frame.data_cb cget -values] $too_data_conf]
- # - Stop bits
- grid [label $the_other_one_frame.stop_lbl \
- -text [mc "Stop bits"] \
- ] -row 6 -column 1 -sticky w
- set stop_cb [ttk::combobox $the_other_one_frame.stop_cb \
- -state readonly \
- -width 1 \
- -values {1 2} \
- -exportselection 0 \
- ]
- bind $stop_cb <<ComboboxSelected>> \
- "$this change_port_config s \[$the_other_one_frame.stop_cb get\]"
- virtual_uart_termial_set_status_tip $stop_cb [mc "Number of stop bits"]
- grid $stop_cb -row 6 -column 2 -sticky w
- $the_other_one_frame.stop_cb current [lsearch [$the_other_one_frame.stop_cb cget -values] $too_stop_conf]
- pack $the_other_one_frame -side left -fill x -expand 1 -padx 5
- }
-
- ## Create bottom frame (hexadecimal editors)
- # @parm Widget target_frame - Parent frame
- # @return void
- private method create_bottom_frame {target_frame} {
- # Create headers ("Data to send", "Received data")
- grid [label $target_frame.lbl_a \
- -text [mc "Data to send"] \
- -compound right \
- -image ::ICONS::16::forward \
- -padx 15 -font $bold_font \
- ] -row 0 -column 1 -columnspan 2
- grid [label $target_frame.lbl_b \
- -text [mc "Received data"] \
- -compound left \
- -image ::ICONS::16::forward \
- -padx 15 -font $bold_font \
- ] -row 0 -column 3 -columnspan 2
-
- # Create hexadecimal editors
- set send_hexeditor [HexEditor #auto \
- $target_frame.send_hexeditor 8 32 2 \
- hex 1 1 5 256 \
- ]
- [$send_hexeditor getLeftView] configure -exportselection 0
- $send_hexeditor bindSelectionAction "$this hexeditor_selection s"
- grid $target_frame.send_hexeditor -row 1 -column 1 -columnspan 2
-
- set receive_hexeditor [HexEditor #auto \
- $target_frame.receive_hexeditor 8 32 2 \
- hex 1 1 5 256 \
- ]
- [$send_hexeditor getLeftView] configure -exportselection 0
- $receive_hexeditor bindSelectionAction "$this hexeditor_selection r"
- grid $target_frame.receive_hexeditor -row 1 -column 3 -columnspan 2
-
- # Create buttons "Send selected" and "Clear selected" in send part
- set send_selected_button [ttk::button \
- $target_frame.send_selected_button \
- -text [mc "Send selected"] \
- -image ::ICONS::16::forward \
- -command "$this send_selected" \
- -compound left \
- -state disabled \
- ]
- set clear_selected_snd_button [ttk::button \
- $target_frame.clear_selected_snd_button \
- -text [mc "Clear selected"] \
- -image ::ICONS::16::eraser \
- -command "$this clear_selected_snd" \
- -compound left \
- -state disabled \
- ]
- virtual_uart_termial_set_status_tip $send_selected_button [mc "Send selected data"]
- virtual_uart_termial_set_status_tip $clear_selected_snd_button [mc "Remove selected data"]
- grid $send_selected_button -row 2 -column 1 -sticky we
- grid $clear_selected_snd_button -row 2 -column 2 -sticky we
-
- # Create buttons "Receive here" and "Clear selected" in reception part
- set receive_here_button [ttk::button \
- $target_frame.receive_here_button \
- -text [mc "Receive here"] \
- -image ::ICONS::16::down0 \
- -command "$this receive_here" \
- -compound left \
- ]
- set clear_selected_rec_button [ttk::button \
- $target_frame.clear_selected_rec_button \
- -text [mc "Clear selected"] \
- -image ::ICONS::16::eraser \
- -command "$this clear_selected_rec" \
- -compound left \
- -state disabled \
- ]
- virtual_uart_termial_set_status_tip $receive_here_button [mc "Receive data on current cursor position"]
- virtual_uart_termial_set_status_tip $clear_selected_rec_button [mc "Remove selected data"]
- grid $receive_here_button -row 2 -column 3 -sticky we
- grid $clear_selected_rec_button -row 2 -column 4 -sticky we
- }
-}
-
-if {$D} {
- VirtualUartTerminal virtual_uart_term
- virtual_uart_term virtual_uart_termial_invoke_dialog
-}
diff --git a/lib/utilities/asciichart.tcl b/lib/utilities/asciichart.tcl
index 01ac86e..bc44f3e 100755..100644
--- a/lib/utilities/asciichart.tcl
+++ b/lib/utilities/asciichart.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,14 +21,19 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _ASCIICHART_TCL ] } {
+set _ASCIICHART_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Interactive ASCII chart
# --------------------------------------------------------------------------
class AsciiChart {
- common count 0 ;# Int: Counter of object instances
- common ASCII_TABLE ;# Array of List: ASCII table
+ common ascii_chr_count 0 ;# Int: Counter of object instances
+ common ASCII_TABLE ;# Array of List: ASCII table
array set ASCII_TABLE {
0 {NUL ^@ \\0 {Null character}}
1 {SOH ^A {} {Start of Header}}
@@ -110,25 +115,27 @@ class AsciiChart {
constructor {} {
# Configure local ttk styles
- ttk::style configure AsciiChart_BlueFg.TEntry -foreground {#0000DD}
- ttk::style configure AsciiChart_RedFg.TEntry -foreground {#DD0000}
+ ttk::style configure AsciiChart_BlueFg.TEntry -foreground {#0000DD}
+ ttk::style configure AsciiChart_RedFg.TEntry -foreground {#DD0000}
+ ttk::style configure AsciiChart_RedBg.TEntry -fieldbackground {#FFDDDD}
+ ttk::style configure AsciiChart_GreenBg.TEntry -fieldbackground {#DDFFDD}
# Create dialog window
set window_visible 1
- set win [toplevel .asciichart$count -class {ASCII chart} -bg {#EEEEEE}]
- set obj_idx $count
- incr count
+ set win [toplevel .asciichart${ascii_chr_count} -class {ASCII chart} -bg ${::COMMON_BG_COLOR}]
+ set obj_idx $ascii_chr_count
+ incr ascii_chr_count
# Create dialog GUI
create_gui
# Set window event bindings
- bind $win <Control-Key-q> "::itcl::delete object $this; break"
+ bind $win <Control-Key-q> "$this close_window; break"
bindtags $win [list $win Toplevel all .]
# Set window parameters
wm iconphoto $win ::ICONS::16::math_matrix
- wm title $win "ASCII chart - MCU 8051 IDE"
+ wm title $win "[mc {ASCII chart}] - MCU 8051 IDE"
wm resizable $win 0 0
wm protocol $win WM_DELETE_WINDOW "$this close_window"
}
@@ -173,7 +180,7 @@ class AsciiChart {
set status_bar_lbl [label $bottom_frame.status_bar_lbl -justify left -anchor w]
pack $status_bar_lbl -side left -fill x -in $bottom_frame
pack [ttk::button $bottom_frame.close_but \
- -text "Exit" \
+ -text [mc "Exit"] \
-command "$this close_window" \
-compound left \
-image ::ICONS::16::exit \
@@ -182,14 +189,14 @@ class AsciiChart {
## Create main frame
set main_frame [frame $win.main_frame -bg {#DDDDDD}]
# Create vertical header
- grid [frame $main_frame.top_right_lbl -bg {#EEEEEE}] -sticky wens -row 0 -column 0
+ grid [frame $main_frame.top_right_lbl -bg ${::COMMON_BG_COLOR}] -sticky wens -row 0 -column 0
set header [list {} \
{0x0_} {0x1_} {0x2_} {0x3_} \
{0x4_} {0x5_} {0x6_} {0x7_} \
]
for {set y 1} {$y < 9} {incr y} {
grid [label $main_frame.vh_lbl$y -text [lindex $header $y] -bg {#FFFFFF}] \
- -row $y -column 0 -pady [expr {$y % 2}] -sticky ns
+ -row $y -column 0 -pady [expr {$y % 2}] -sticky wens
set vh_cells([expr {$y - 1}]) $main_frame.vh_lbl$y
}
# Create horizontal header
@@ -201,7 +208,7 @@ class AsciiChart {
]
for {set x 1} {$x < 17} {incr x} {
grid [label $main_frame.hh_lbl$x -text [lindex $header $x] -bg {#FFFFFF}] \
- -row 0 -column $x -padx [expr {$x % 2}] -sticky we
+ -row 0 -column $x -padx [expr {$x % 2}] -sticky wens
set hh_cells([expr {$x - 1}]) $main_frame.hh_lbl$x
}
# Create ASCII chart matrix
@@ -225,7 +232,7 @@ class AsciiChart {
set val [lindex $ASCII_TABLE($address) 0]
if {[string length $val] > 1} {
set foreground {#DD0000}
- } {
+ } else {
set foreground {#0000DD}
}
@@ -239,23 +246,44 @@ class AsciiChart {
-bg white -pady 0 \
]
- grid $frame -row $y -column $x -padx [expr {$x % 2}] -pady [expr {$y % 2}] -sticky we
+ grid $frame -row $y -column $x -padx [expr {$x % 2}] -pady [expr {$y % 2}] -sticky wens
set cells($address) $frame
foreach wdg [list $frame $frame.val_lbl $frame.char_lbl] {
bind $wdg <Enter> "$this cell_enter $address"
bind $wdg <Leave> "$this cell_leave $address"
bind $wdg <Button-1> "$this cell_click $address"
}
+
+ if {$address < 127} {
+ bind $frame <Key-Right> [list $this cell_click [expr {$address + 1}]]
+ }
+ if {$address > 0} {
+ bind $frame <Key-Left> [list $this cell_click [expr {$address - 1}]]
+ }
+ if {$address > 16} {
+ bind $frame <Key-Up> [list $this cell_click [expr {$address - 16}]]
+ }
+ if {$address < 112} {
+ bind $frame <Key-Down> [list $this cell_click [expr {$address + 16}]]
+ }
+
incr address
}
}
+ # Ensure than all cells have the same width and heigh
+ for {set i 0} {$i < 17} {incr i} {
+ grid columnconfigure $main_frame $i -uniform ascii
+ }
+ for {set i 1} {$i < 9} {incr i} {
+ grid rowconfigure $main_frame $i -uniform ascii
+ }
# Show ASCII chart
pack $main_frame -pady 5 -side top
## Create details frame (character details)
# Create labelframe
set details_frame_header_frm [frame $win.details_frame_header_frm]
- pack [label $details_frame_header_frm.lbl -text "Character: "] -side left
+ pack [label $details_frame_header_frm.lbl -text [mc "Character: "]] -side left
set char_ent [ttk::entry $details_frame_header_frm.ent \
-validatecommand "$this char_ent_validator %P" \
-width 4 \
@@ -407,6 +435,7 @@ class AsciiChart {
set selected_cell -1
return
}
+ focus $cells($address)
select_cell $address
if {$selected_cell != -1} {
fill_entryboxes $address {}
@@ -459,7 +488,7 @@ class AsciiChart {
# Set new background color
if {$keep_current} {
sel_bg_color $selected_cell {#DDFFDD}
- } {
+ } else {
sel_bg_color $selected_cell {#FFFFFF}
}
@@ -526,7 +555,7 @@ class AsciiChart {
$char_ent insert insert $value
if {[string length $value] > 1} {
$char_ent configure -style AsciiChart_RedFg.TEntry
- } {
+ } else {
$char_ent configure -style AsciiChart_BlueFg.TEntry
}
}
@@ -569,7 +598,7 @@ class AsciiChart {
## Validator for entrybox "Character"
# @parm String string - New entrybox contents
- # @return Bool - Allways 1
+ # @return Bool - Always 1
public method char_ent_validator {string} {
if {!$validation_ena} {return 1}
set validation_ena 0
@@ -599,7 +628,7 @@ class AsciiChart {
if {$length > 1} {
$char_ent configure -style AsciiChart_RedFg.TEntry
- } {
+ } else {
$char_ent configure -style AsciiChart_BlueFg.TEntry
}
@@ -638,7 +667,7 @@ class AsciiChart {
# Empty input string
set length [string length $string]
if {!$length} {
- $widget configure -bg {#FFFFFF}
+ $widget configure -style TEntry
clear_entryboxes $type
unselect_current_cell 0 0
set validation_ena 1
@@ -684,7 +713,7 @@ class AsciiChart {
if {$string > 127 || $string < 0} {
clear_entryboxes $type
unselect_current_cell 0 0
- $widget configure -bg {#FFDDDD}
+ $widget configure -style AsciiChart_RedBg.TEntry
set validation_ena 1
return 1
}
@@ -692,7 +721,7 @@ class AsciiChart {
# Adjust GUI (ACII chart and details frame)
select_cell $string
fill_entryboxes $string $type
- $widget configure -bg {#DDFFDD}
+ $widget configure -style AsciiChart_GreenBg.TEntry
return 1
}
@@ -710,14 +739,14 @@ class AsciiChart {
if {$type == {C}} {
set widget $caret_not_ent
set index 1
- } {
+ } else {
set widget $escape_seq_ent
set index 2
}
# Empty input string
if {![string length $string]} {
- $widget configure -bg {#FFFFFF}
+ $widget configure -style TEntry
clear_entryboxes $type
unselect_current_cell 0 0
set validation_ena 1
@@ -736,7 +765,7 @@ class AsciiChart {
select_cell $i
fill_entryboxes $i $type
- $widget configure -bg {#DDFFDD}
+ $widget configure -style AsciiChart_GreenBg.TEntry
set validation_ena 1
return 1
}
@@ -745,8 +774,12 @@ class AsciiChart {
# String not found
clear_entryboxes $type
unselect_current_cell 0 0
- $widget configure -bg {#FFDDDD}
+ $widget configure -style AsciiChart_RedBg.TEntry
set validation_ena 1
return 1
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/utilities/baseconvertor.tcl b/lib/utilities/baseconverter.tcl
index ded53cb..82d656a 100755..100644
--- a/lib/utilities/baseconvertor.tcl
+++ b/lib/utilities/baseconverter.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,15 +21,36 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _BASECONVERTER_TCL ] } {
+set _BASECONVERTER_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
-# Utility "Base Convertor"
+# Utility "Base Converter"
# --------------------------------------------------------------------------
-class BaseConvertor {
+class BaseConverter {
## COMMON
- common count 0 ;# Int: Counter of class instances
+ common base_c_count 0 ;# Int: Counter of class instances
+ common INITIAL_HEIGHT 130 ;# Int: Initial heightof the window in pixels
+ common INITIAL_WIDTH 150 ;# Int: Initial width of the window in pixels
+ common EXTENDED_WIDTH 340 ;# Int: Width of the window when it is in extended mode
+
+ # On MS Windows these values has to be a bit different
+ if {$::MICROSOFT_WINDOWS} {
+ set INITIAL_HEIGHT 125
+ set INITIAL_WIDTH 165
+ set EXTENDED_WIDTH 355
+ }
+ # Font entryboxes
+ common entry_font [font create \
+ -size -12 \
+ -family $::DEFAULT_FIXED_FONT \
+ -weight bold \
+ ]
## PRIVATE
private variable win ;# Widget: Window
@@ -64,12 +85,13 @@ class BaseConvertor {
## Object constructor
constructor {} {
# Configure ttk styles
- if {!$count} {
- ttk::style configure BaseConvertor_Focused_D.TEntry -fieldbackground {#AAAAFF}
- ttk::style configure BaseConvertor_Focused_I.TEntry -fieldbackground {#DDDDFF}
+ if {!$base_c_count} {
+ ttk::style configure BaseConverter_Focused_D.TEntry -fieldbackground {#AAAAFF}
+ ttk::style configure BaseConverter_Focused_I.TEntry -fieldbackground {#DDDDFF}
+ ttk::style configure BaseConverter_NotFocused.TEntry
}
- incr count
+ incr base_c_count
create_window
create_gui
@@ -125,7 +147,7 @@ class BaseConvertor {
[$entry_d(3) get] \
[$entry_d(4) get] \
[$entry_d(5) get]
- } {
+ } else {
lappend values {} {} {}
}
@@ -142,12 +164,12 @@ class BaseConvertor {
## Create window using class "InnerWindow"
# @return void
private method create_window {} {
- set win_obj [InnerWindow #auto \
- .baseconvertor_${count} \
- [list 160 130 100 100] \
- [mc "Convertor"] \
- ::ICONS::16::kaboodleloop \
- "$this close_window" \
+ set win_obj [InnerWindow #auto \
+ .baseconverter_${base_c_count} \
+ [list $INITIAL_WIDTH $INITIAL_HEIGHT 100 100] \
+ [mc "Converter"] \
+ ::ICONS::16::kaboodleloop \
+ "$this close_window" \
]
set win [$win_obj get_frame]
}
@@ -173,8 +195,9 @@ class BaseConvertor {
-image ::ICONS::16::1downarrow \
-command "$this enlarge_shrink" \
-width 7 \
+ -style Flat.TButton \
]
- pack $enlarge_shrink_button -side left
+ pack $enlarge_shrink_button -side left -padx 2 -pady 2
# Button "More"/"Less"
set less_more_button [ttk::button $bottom_frame.less_more_button\
-text [mc "More"] \
@@ -182,8 +205,9 @@ class BaseConvertor {
-image ::ICONS::16::1rightarrow \
-command "$this less_more" \
-width 5 \
+ -style Flat.TButton \
]
- pack $less_more_button -side right
+ pack $less_more_button -side right -padx 2 -pady 2
# Pack frames
pack $left_top_frame -side left -anchor nw
@@ -195,10 +219,10 @@ class BaseConvertor {
}
## Close the window and forget configuration
- # Calls proc. "::X::__base_convertor_close"
+ # Calls proc. "::X::__base_converter_close"
# @return void
public method close_window {} {
- ::X::__base_convertor_close $this
+ ::X::__base_converter_close $this
$win_obj close_window
delete object $this
}
@@ -231,7 +255,7 @@ class BaseConvertor {
# Detect zero length input string
if {[string length $content]} {
set zero_length 0
- } {
+ } else {
set zero_length 1
set content 0
}
@@ -241,7 +265,7 @@ class BaseConvertor {
{h} { ;# Hexadecimal
if {![regexp {^[[:xdigit:]]{0,2}$} $content]} {
set result 0
- } {
+ } else {
scan $content "%x" value
}
}
@@ -250,14 +274,14 @@ class BaseConvertor {
set result 0
} elseif {$content > 255} {
set result 0
- } {
+ } else {
set value $content
}
}
{b} { ;# Binary
if {![regexp {^[01]{0,8}$} $content]} {
set result 0
- } {
+ } else {
set value [NumSystem::bin2dec $content]
}
}
@@ -266,7 +290,7 @@ class BaseConvertor {
set result 0
} elseif {$content > 377} {
set result 0
- } {
+ } else {
scan $content "%o" value
}
}
@@ -275,7 +299,7 @@ class BaseConvertor {
set result 0
} elseif {$content > 15} {
set result 0
- } {
+ } else {
set value [$entry_c1($row) get]
if {![string length $value]} {
set value 0
@@ -289,7 +313,7 @@ class BaseConvertor {
set result 0
} elseif {$content > 15} {
set result 0
- } {
+ } else {
set value [$entry_c0($row) get]
if {![string length $value]} {
set value 0
@@ -306,7 +330,7 @@ class BaseConvertor {
if {[string length $content] > 1} {
set result 0
- } {
+ } else {
set value [NumSystem::ascii2dec $content]
}
@@ -399,7 +423,7 @@ class BaseConvertor {
} elseif {[expr $value & $mask]} {
set fill ${::BitMap::one_fill}
set outline ${::BitMap::one_outline}
- } {
+ } else {
set fill ${::BitMap::zero_fill}
set outline ${::BitMap::zero_outline}
}
@@ -448,7 +472,7 @@ class BaseConvertor {
# Set new rectangle fill and outline and adjust cursor
$entry_t($r) itemconfigure $bit($r,$b) \
-fill $fill -outline $outline
- $entry_t($r) configure -cursor hand1
+ $entry_t($r) configure -cursor hand2
}
## Handles event <leave> on canvas widget with bits,
@@ -564,6 +588,8 @@ class BaseConvertor {
-width $width \
-validate key \
-validatecommand "$this validate $type $row %P" \
+ -style BaseConverter_NotFocused.TEntry \
+ -font $entry_font \
]
set entry_${type}($row) $entry_wgd
grid $entry_wgd -row [expr {$row + 2}] -column $col
@@ -616,6 +642,8 @@ class BaseConvertor {
-width 2 \
-validate all \
-validatecommand "$this validate ${type} $row %P" \
+ -style BaseConverter_NotFocused.TEntry \
+ -font $entry_font \
]
set entry_${type}($row) $entry_wgd
grid $entry_wgd -row [expr {$row + 2}] -column $col
@@ -626,6 +654,8 @@ class BaseConvertor {
-width 2 \
-validate all \
-validatecommand "$this validate ${type}1 $row %P" \
+ -style BaseConverter_NotFocused.TEntry \
+ -font $entry_font \
]
set entry_${type}1($row) $entry_wgd
grid $entry_wgd -row [expr {$row + 2}] -column $col
@@ -637,6 +667,8 @@ class BaseConvertor {
-width 2 \
-validate all \
-validatecommand "$this validate ${type}0 $row %P" \
+ -style BaseConverter_NotFocused.TEntry \
+ -font $entry_font \
]
set entry_${type}0($row) $entry_wgd
grid $entry_wgd -row [expr {$row + 2}] -column $col
@@ -696,15 +728,19 @@ class BaseConvertor {
if {$large} {
create_right_frame
create_left_frame
- $win_obj geometry {} [expr {[winfo height $entry_h(0)] * 3 + 130}] {} {}
+ $win_obj geometry {} [expr {[winfo height $entry_h(0)] * 3 + $INITIAL_HEIGHT}] {} {}
$enlarge_shrink_button configure \
-image ::ICONS::16::1uparrow \
-text [mc "Shrink"]
- } {
- $win_obj geometry {} 130 {} {}
+ } else {
+ $win_obj geometry {} $INITIAL_HEIGHT {} {}
$enlarge_shrink_button configure \
-image ::ICONS::16::1downarrow \
-text [mc "Enlarge"]
+
+ for {set i 0; set j 3} {$i < 3} {incr i; incr j} {
+ lset val_to_set $i [$entry_d($j) get]
+ }
}
# Show or hide appropriate GUI elements
@@ -719,9 +755,9 @@ class BaseConvertor {
} {
for {set i 3; set r 5} {$i < 6} {incr i; incr r} {
if {$large} {
- grid [subst "\$${w}($i)"] -column $c -row $r
- } {
- grid forget [subst "\$${w}($i)"]
+ grid [subst -nocommands "\$${w}($i)"] -column $c -row $r
+ } else {
+ grid forget [subst -nocommands "\$${w}($i)"]
}
}
}
@@ -741,17 +777,17 @@ class BaseConvertor {
$less_more_button configure \
-compound left -text [mc "Less"] \
-image ::ICONS::16::1leftarrow
- $win_obj geometry 350 {} {} {}
+ $win_obj geometry $EXTENDED_WIDTH {} {} {}
for {set i 0} {$i < $right_rows_created} {incr i} {
validate {t} $i [$entry_d($i) get]
}
- } {
+ } else {
pack forget $right_top_frame
$less_more_button configure \
-compound right -text [mc "More"] \
-image ::ICONS::16::1rightarrow
- $win_obj geometry 160 {} {} {}
+ $win_obj geometry $INITIAL_WIDTH {} {} {}
}
}
@@ -770,10 +806,10 @@ class BaseConvertor {
# @return void
public method entry_focus {type row focused} {
if {$focused} {
- set style BaseConvertor_Focused_I.TEntry
+ set style BaseConverter_Focused_I.TEntry
set bg {#DDDDFF}
- } {
- set style TEntry
+ } else {
+ set style BaseConverter_NotFocused.TEntry
set bg {#FFFFFF}
}
@@ -799,9 +835,9 @@ class BaseConvertor {
}
if {$focused} {
- [subst "\$entry_${type}($row)"] configure -style BaseConvertor_Focused_D.TEntry
- } {
- [subst "\$entry_${type}($row)"] selection clear
+ [subst -nocommands "\$entry_${type}($row)"] configure -style BaseConverter_Focused_D.TEntry
+ } else {
+ [subst -nocommands "\$entry_${type}($row)"] selection clear
}
}
@@ -828,7 +864,7 @@ class BaseConvertor {
# e - Enter
# @return void
public method entry_key {type y key} {
- set entrybox [subst "\$entry_${type}($y)"]
+ set entrybox [subst -nocommands "\$entry_${type}($y)"]
set insert [$entrybox index insert]
set max_y $left_rows_created
incr max_y -1
@@ -904,9 +940,13 @@ class BaseConvertor {
{5} {set type c0}
{6} {set type a}
}
- set entrybox [subst "\$entry_${type}($y)"]
+ set entrybox [subst -nocommands "\$entry_${type}($y)"]
$entrybox selection range 0 end
$entrybox icursor [expr {[$entrybox index end] - $insert}]
focus $entrybox
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/utilities/eightsegment.tcl b/lib/utilities/eightsegment.tcl
index de1903b..601d078 100755..100644
--- a/lib/utilities/eightsegment.tcl
+++ b/lib/utilities/eightsegment.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,13 +21,18 @@
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
############################################################################
+# >>> File inclusion guard
+if { ! [ info exists _EIGHTSEGMENT_TCL ] } {
+set _EIGHTSEGMENT_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# 8 segment LED display configurator
# --------------------------------------------------------------------------
class EightSegment {
- common count 0 ;# Int: Counter of object instances
+ common ld_ed_count 0 ;# Int: Counter of object instances
private variable obj_idx ;# Int: Current object ID
private variable win ;# Widget: Dialog window
@@ -37,9 +42,9 @@ class EightSegment {
private variable canvas_objects ;# Array: LED segments in canvas widget
private variable validation_ena 1 ;# Bool: Entryboxs validation enabled
- private variable cc_hex_entry ;# Widget: Entrybox "Common catode - Hex"
- private variable cc_dec_entry ;# Widget: Entrybox "Common catode - Dec"
- private variable cc_bin_entry ;# Widget: Entrybox "Common catode - Bin"
+ private variable cc_hex_entry ;# Widget: Entrybox "Common cathode - Hex"
+ private variable cc_dec_entry ;# Widget: Entrybox "Common cathode - Dec"
+ private variable cc_bin_entry ;# Widget: Entrybox "Common cathode - Bin"
private variable ca_hex_entry ;# Widget: Entrybox "Common anode - Hex"
private variable ca_dec_entry ;# Widget: Entrybox "Common anode - Dec"
private variable ca_bin_entry ;# Widget: Entrybox "Common anode - Bin"
@@ -49,9 +54,9 @@ class EightSegment {
constructor {} {
# Create dialog window
- set win [toplevel .eightsegment$count -class {8 segment editor} -bg {#EEEEEE}]
- set obj_idx $count
- incr count
+ set win [toplevel .eightsegment${ld_ed_count} -class {8 segment editor} -bg ${::COMMON_BG_COLOR}]
+ set obj_idx $ld_ed_count
+ incr ld_ed_count
# Restore last session
for {set i 0} {$i < 8} {incr i} {
@@ -75,7 +80,7 @@ class EightSegment {
# Set window parameters
wm iconphoto $win ::ICONS::16::8seg
- wm title $win "8 segment editor"
+ wm title $win [mc "8 segment editor"]
wm resizable $win 0 0
wm protocol $win WM_DELETE_WINDOW "::itcl::delete object $this"
}
@@ -100,7 +105,7 @@ class EightSegment {
# Highlight ComboBoxes related to pins which are in confict
for {set segment 0} {$segment < 8} {incr segment} {
- set pin [subst "\$::EightSegment::con_${obj_idx}_$segment"]
+ set pin [subst -nocommands "\$::EightSegment::con_${obj_idx}_$segment"]
set seg2pin($segment) $pin
for {set i 0} {$i < 8} {incr i} {
@@ -133,9 +138,9 @@ class EightSegment {
ttk::style configure EightSegment_RedFg.TCombobox -foreground {#FF0000}
## Create entryboxes
- # - Common catode
+ # - Common cathode
set left_frame [frame $main_frame.left_frame]
- grid [label $left_frame.header_CC_lbl -text [mc "Common catode"]] \
+ grid [label $left_frame.header_CC_lbl -text [mc "Common cathode"]] \
-row 0 -column 0 -columnspan 4 -sticky w
grid [label $left_frame.sub_header_CC_hex_lbl -text [mc "Hex:"]] \
-row 1 -column 1 -sticky w
@@ -297,7 +302,7 @@ class EightSegment {
-text [mc "Close"] \
-command "::itcl::delete object $this" \
-image ::ICONS::16::exit \
- ] -side right -pady 5
+ ] -side right -pady 5 -padx 5
pack $status_bar -side left -fill x
# Pack window frames
@@ -315,11 +320,11 @@ class EightSegment {
}
## Copy contents of the specified exntrybox to clipboard
- # @parm Char common_electrode - C == Catode; A == Anode
+ # @parm Char common_electrode - C == Cathode; A == Anode
# @parm Char radix - H == Hexadecimal; D == Decimal; B == Binary
# @return void
public method copy_contents {common_electrode radix} {
- # Common catode
+ # Common cathode
if {$common_electrode == {C}} {
switch -- $radix {
{H} {set widget ${cc_hex_entry}}
@@ -327,7 +332,7 @@ class EightSegment {
{B} {set widget ${cc_bin_entry}}
}
# Common anode
- } {
+ } else {
switch -- $radix {
{H} {set widget ${ca_hex_entry}}
{D} {set widget ${ca_dec_entry}}
@@ -349,7 +354,7 @@ class EightSegment {
}
## Value entrybox validator
- # @parm Char common_electrode - C == Catode; A == Anode
+ # @parm Char common_electrode - C == Cathode; A == Anode
# @parm Char radix - H == Hexadecimal; D == Decimal; B == Binary
# @parm String value - String to validate
# @return Bool - always 1
@@ -387,10 +392,19 @@ class EightSegment {
}
# Convert value to decimal
- if {$radix == {H}} {
- set value [expr "0x$value"]
- } elseif {$radix == {B}} {
- set value [::NumSystem::bin2dec $value]
+ switch -- $radix {
+ {H} {
+ set value [expr "0x$value"]
+ }
+ {B} {
+ set value [::NumSystem::bin2dec $value]
+ }
+ {D} {
+ set value [string trimleft $value 0]
+ if {$value == {}} {
+ set value 0
+ }
+ }
}
# Adjust array $led() (LED states)
@@ -400,7 +414,7 @@ class EightSegment {
set leds($i) [expr {$value & $mask}]
set mask [expr {$mask * 2}]
}
- } {
+ } else {
set mask 1
for {set i 0} {$i < 8} {incr i} {
set leds($i) [expr {!($value & $mask)}]
@@ -422,7 +436,7 @@ class EightSegment {
for {set i 0} {$i < 8} {incr i} {
if {$leds($seg2pin($i))} {
$canvas_widget itemconfigure $canvas_objects($i) -fill #FF0000
- } {
+ } else {
$canvas_widget itemconfigure $canvas_objects($i) -fill #FFFFFF
}
}
@@ -507,3 +521,7 @@ class EightSegment {
}
}
set ::EightSegment::config $::CONFIG(EIGHT_SEG_EDITOR)
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/utilities/hexeditdlg.tcl b/lib/utilities/hexeditdlg.tcl
index 42175f1..c18df59 100755..100644
--- a/lib/utilities/hexeditdlg.tcl
+++ b/lib/utilities/hexeditdlg.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 _HEXEDITDLG_TCL ] } {
+set _HEXEDITDLG_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Prodides hexadecimal editor for external data and program memory.
@@ -34,16 +39,16 @@ class HexEditDlg {
common cell {0} ;# Current cell (0 - 0xFFFF)
common current_view {left} ;# Focused view {left right}
# Font for mode combobox
- common mode_cb_font [font create \
- -family {Helvetica} \
- -size -17 \
- -weight bold \
+ common mode_cb_font [font create \
+ -family {Helvetica} \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
]
# General normal size bold font
- common bold_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -12 \
- -weight bold \
+ common bold_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight bold \
]
# Status bar tips for main menu for XDATA mode
common HELPFILE_XDATA {
@@ -62,8 +67,8 @@ class HexEditDlg {
{}
{}
{Invoke dialog for searching strings in the text}
- {Find next occurence of the search string}
- {Find previous occurence of the search string}
+ {Find next occurrence of the search string}
+ {Find previous occurrence of the search string}
} {
{Switch view mode to hexadecimal}
{Switch view mode to decimal}
@@ -86,8 +91,8 @@ class HexEditDlg {
{}
{}
{Invoke dialog for searching strings in the text}
- {Find next occurence of the search string}
- {Find previous occurence of the search string}
+ {Find next occurrence of the search string}
+ {Find previous occurrence of the search string}
} {
{Switch view mode to hexadecimal}
{Switch view mode to decimal}
@@ -138,7 +143,7 @@ class HexEditDlg {
set project $_project
set type $_type
set obj_idx $count
- set win [toplevel .hexeditdlg${obj_idx} -class {Hex Editor} -bg {#EEEEEE}]
+ set win [toplevel .hexeditdlg${obj_idx} -class {Hex Editor} -bg ${::COMMON_BG_COLOR}]
set loaded_lines [string repeat [string repeat 0 0xFF] 0xFF]
incr count ;# Increment instance counter
@@ -180,7 +185,7 @@ class HexEditDlg {
if {$type == {code}} {
if {[$project is_frozen]} {
set state normal
- } {
+ } else {
set state disabled
}
@@ -199,7 +204,7 @@ class HexEditDlg {
# Fill EntryBoxes
if {$cell >= $capacity} {
set current_cell [expr {$capacity - 1}]
- } {
+ } else {
set current_cell $cell
}
set value [$hexeditor get_values $current_cell $current_cell]
@@ -208,7 +213,7 @@ class HexEditDlg {
set validation_ena 1
# Pack dialog frames
- pack $tool_bar_frame -fill x -anchor w
+ pack $tool_bar_frame -fill x -anchor w -padx 3
pack $middle_frame -anchor nw -after $tool_bar_frame -pady 10
pack $bottom_frame -anchor w -after $middle_frame
pack $statusbar_frame -side bottom -fill x -after $bottom_frame
@@ -235,7 +240,7 @@ class HexEditDlg {
wm resizable $win 0 0
if {$mode == {hex}} {
wm geometry $win ${win_pos}
- } {
+ } else {
wm geometry $win ${win_pos}
}
@@ -243,7 +248,7 @@ class HexEditDlg {
wm iconphoto $win ::ICONS::16::$window_icon
if {$type == {uni}} {
wm protocol $win WM_DELETE_WINDOW "$this quit"
- } {
+ } else {
wm protocol $win WM_DELETE_WINDOW \
[list ::X::close_hexedit $type $project]
}
@@ -289,9 +294,9 @@ class HexEditDlg {
## Create menu widgets
# Main
set mainmenu [menu $win.mainmenu \
- -bd 0 -tearoff 0 -bg {#EEEEEE} \
+ -bd 0 -tearoff 0 -bg ${::COMMON_BG_COLOR} \
-activeforeground {#6666FF} \
- -activebackground {#EEEEEE} \
+ -activebackground ${::COMMON_BG_COLOR} \
]
set file_menu [menu $mainmenu.file_menu -tearoff 0] ;# Main -> File
set edit_menu [menu $mainmenu.edit_menu -tearoff 0] ;# Main -> Edit
@@ -307,71 +312,71 @@ class HexEditDlg {
# Create File menu
if {$type == {code}} {
- $file_menu add command -label "Open ADF" -compound left \
+ $file_menu add command -label [mc "Open ADF"] -compound left \
-command "$this opensim" -underline 0 \
-image ::ICONS::16::fileopen
}
- $file_menu add command -label "Open IHEX8" -compound left \
+ $file_menu add command -label [mc "Open IHEX8"] -compound left \
-accelerator "Ctrl+O" -command "$this openhex" \
-image ::ICONS::16::fileopen -underline 1
$file_menu add separator
- $file_menu add command -label "Save" -compound left \
+ $file_menu add command -label [mc "Save"] -compound left \
-accelerator "Ctrl+S" -command "$this save" \
-image ::ICONS::16::filesave -underline 0
- $file_menu add command -label "Save as" -compound left \
+ $file_menu add command -label [mc "Save as"] -compound left \
-accelerator "Ctrl+Shift+S" -command "$this saveas" \
-image ::ICONS::16::filesaveas -underline 1
$file_menu add separator
if {$type != {code}} {
- $file_menu add command -label "Reload" -compound left \
- -accelerator "F5" -command "$this reload" \
+ $file_menu add command -label [mc "Reload"] -compound left \
+ -accelerator "F5" -command "$this reload" \
-image ::ICONS::16::reload -underline 1
$file_menu add separator
}
- $file_menu add command -label "Exit" -compound left \
- -accelerator "Ctrl+Q" -command "$this quit" \
+ $file_menu add command -label [mc "Exit"] -compound left \
+ -accelerator "Ctrl+Q" -command "$this quit" \
-image ::ICONS::16::exit -underline 1
# Create Edit menu
- $edit_menu add command -label "Copy" -compound left \
+ $edit_menu add command -label [mc "Copy"] -compound left \
-accelerator "Ctrl+C" -command "$this text_copy" \
-image ::ICONS::16::editcopy -underline 0
- $edit_menu add command -label "Paste" -compound left \
+ $edit_menu add command -label [mc "Paste"] -compound left \
-accelerator "Ctrl+V" -command "$this text_paste" \
-image ::ICONS::16::editpaste -underline 0
$edit_menu add separator
- $edit_menu add command -label "Find" -compound left \
- -accelerator "Ctrl+F" -command "$this find_string 0" \
+ $edit_menu add command -label [mc "Find"] -compound left \
+ -accelerator "Ctrl+F" -command "$this find_string 0" \
-image ::ICONS::16::find -underline 0
- $edit_menu add command -label "Find next" -compound left \
- -accelerator "F3" -command "$this find_string 1" \
+ $edit_menu add command -label [mc "Find next"] -compound left \
+ -accelerator "F3" -command "$this find_string 1" \
-image ::ICONS::16::1downarrow -underline 5
- $edit_menu add command -label "Find previous" -compound left \
- -accelerator "Shift+F3" -command "$this find_string 2" \
+ $edit_menu add command -label [mc "Find previous"] -compound left \
+ -accelerator "Shift+F3" -command "$this find_string 2" \
-image ::ICONS::16::1uparrow -underline 8
# Create Mode menu
set ::HexEditDlg::mode_${obj_idx} $mode
- $mode_menu add radiobutton -label "HEX" \
+ $mode_menu add radiobutton -label [mc "HEX"] \
-variable ::HexEditDlg::mode_${obj_idx} \
-indicatoron 0 -compound left -image ::ICONS::raoff \
-selectimage ::ICONS::raon -value {hex} -underline 0 \
-command [list $this adjust_mode]
- $mode_menu add radiobutton -label "DEC" \
+ $mode_menu add radiobutton -label [mc "DEC"] \
-variable ::HexEditDlg::mode_${obj_idx} \
-indicatoron 0 -compound left -image ::ICONS::raoff \
-selectimage ::ICONS::raon -value {dec} -underline 0 \
-command [list $this adjust_mode]
- $mode_menu add radiobutton -label "OCT" \
+ $mode_menu add radiobutton -label [mc "OCT"] \
-variable ::HexEditDlg::mode_${obj_idx} \
-indicatoron 0 -compound left -image ::ICONS::raoff \
-selectimage ::ICONS::raon -value {oct} -underline 0 \
-command [list $this adjust_mode]
# Create Main menu
- $mainmenu add cascade -label "File" -underline 0 -menu $file_menu
- $mainmenu add cascade -label "Edit" -underline 0 -menu $edit_menu
- $mainmenu add cascade -label "Mode" -underline 0 -menu $mode_menu
+ $mainmenu add cascade -label [mc "File"] -underline 0 -menu $file_menu
+ $mainmenu add cascade -label [mc "Edit"] -underline 0 -menu $edit_menu
+ $mainmenu add cascade -label [mc "Mode"] -underline 0 -menu $mode_menu
$win configure -menu $mainmenu
}
@@ -462,8 +467,8 @@ class HexEditDlg {
bind $wdg <Leave> [list $this sbar_show {}]
}
- ## Create hexeditor and entryboxes for address and value
- # @parm Widget middle_frame - Frame for hexeditor
+ ## Create hex editor and entryboxes for address and value
+ # @parm Widget middle_frame - Frame for hex editor
# @parm Widget bottom_frame - Frame for entryboxes
# @return void
private method create_middle_bottom_frame {middle_frame bottom_frame} {
@@ -475,7 +480,7 @@ class HexEditDlg {
set hexeditor [HexEditor editor${obj_idx} $middle_frame 16 $hg 4 $mode 1 0 16 $capacity]
if {$current_view == {left}} {
$hexeditor focus_left_view
- } {
+ } else {
$hexeditor focus_right_view
}
$hexeditor setCurrentCell $cell
@@ -535,7 +540,7 @@ class HexEditDlg {
if {$type == {code}} {
if {[$project is_frozen]} {
set state normal
- } {
+ } else {
set state disabled
}
@@ -624,7 +629,7 @@ class HexEditDlg {
$project rightPanel_watch_sync $hex_addr
# Code memory
- } {
+ } else {
$project setCodeDEC $addr $val
}
}
@@ -639,7 +644,7 @@ class HexEditDlg {
set modified $bool
if {$modified} {
wm title $win "\[modified\] [wm title $win]"
- } {
+ } else {
wm title $win [string range [wm title $win] 11 end]
}
}
@@ -647,7 +652,7 @@ class HexEditDlg {
## Parse given data (IHEX-8 and load it into the editor + sync with external components)
# @parm String hex_data - input data
- # @return void
+ # @return Bool - 1 == success; 0 == failure
private method readHex {hex_data} {
# Any EOL -> LF
regsub -all {\r\n?} $hex_data "\n" hex_data
@@ -657,7 +662,7 @@ class HexEditDlg {
# Local variables
set pointer 0 ;# Current address
set line_number 0 ;# Number of the current line
- set errors_count 0 ;# Number of errors occured while parsing ihex file
+ set errors_count 0 ;# Number of errors occurred while parsing ihex file
set eof 0 ;# Bool: EOF detected
set error_string {} ;# Text of error message
@@ -736,7 +741,7 @@ class HexEditDlg {
set number [string range $data $i $j]
if {$type == {uni}} {
$hexeditor setValue $pointer [expr "0x$number"]
- } {
+ } else {
write_to_simulator $pointer [expr "0x$number"]
}
incr pointer
@@ -752,7 +757,7 @@ class HexEditDlg {
# Invoke error dialog
if {$errors_count} {
# Create dialog window
- set dialog [toplevel .error_message_dialog -bg {#EEEEEE}]
+ set dialog [toplevel $win.error_message_dialog -bg ${::COMMON_BG_COLOR}]
# Create main frame (text widget and scrolbar)
set main_frame [frame $dialog.main_frame]
@@ -785,13 +790,16 @@ class HexEditDlg {
# Set window attributes
wm iconphoto $dialog ::ICONS::16::no
- wm title $dialog [mc "Error(s) occured while parsing IHEX file"]
+ wm title $dialog [mc "Error(s) occurred while parsing IHEX file"]
wm minsize $dialog 500 250
wm protocol $dialog WM_DELETE_WINDOW "grab release $dialog; destroy $dialog"
wm transient $dialog $win
grab $dialog
raise $dialog
tkwait window $dialog
+ return 0
+ } else {
+ return 1
}
}
@@ -806,7 +814,7 @@ class HexEditDlg {
set hexlen 2
set octlen 3
set binlen 8
- } {
+ } else {
set hexlen 4
set octlen 7
set binlen 16
@@ -818,7 +826,7 @@ class HexEditDlg {
set oct {}
set bin {}
# Non empty value -> convert
- } {
+ } else {
# To hexadecimal
set hex [format %X $value]
set len [string length $hex]
@@ -903,7 +911,7 @@ class HexEditDlg {
sbar_show {}
}
- ## This method should be called after value change in hexeditor
+ ## This method should be called after value change in hex editor
# This method writes new value to simulator engine, watchers and EntryBoxes
# @parm Int addr - Address of changed cell
# @parm int val - New value of the entry
@@ -917,7 +925,7 @@ class HexEditDlg {
set validation_ena 1
}
- ## This method should be called after current cell change in hexeditor
+ ## This method should be called after current cell change in hex editor
# Synchronizes EntryBoxes
# @parm Int addr - New cell address
# @return void
@@ -945,7 +953,7 @@ class HexEditDlg {
# Check for valid characters
if {$valtype == {val}} {
set m 1
- } {
+ } else {
set m 2
}
set len [string length $value]
@@ -998,7 +1006,7 @@ class HexEditDlg {
set validation_ena 1
return 0
}
- } {
+ } else {
if {$value >= $capacity} {
set validation_ena 1
return 0
@@ -1010,7 +1018,7 @@ class HexEditDlg {
if {$valtype == {val}} {
$hexeditor setValue $current_cell $value
write_to_simulator $current_cell $value
- } {
+ } else {
set current_cell $value
$hexeditor setCurrentCell $value
}
@@ -1026,11 +1034,11 @@ class HexEditDlg {
# @return void
public method prog_jump {} {
if {$type != {code}} {return}
- $project setPC [subst "\$::HexEditDlg::dec_addr_${obj_idx}"]
+ $project setPC [subst -nocommands "\$::HexEditDlg::dec_addr_${obj_idx}"]
set lineNum [$project simulator_getCurrentLine]
if {$lineNum != {}} {
$project move_simulator_line $lineNum
- } {
+ } else {
$project editor_procedure {} unset_simulator_line {}
}
$project Simulator_sync_PC_etc
@@ -1040,11 +1048,11 @@ class HexEditDlg {
# @return void
public method sub_call {} {
if {$type != {code}} {return}
- $project simulator_subprog_call [subst "\$::HexEditDlg::dec_addr_${obj_idx}"]
+ $project simulator_subprog_call [subst -nocommands "\$::HexEditDlg::dec_addr_${obj_idx}"]
set lineNum [$project simulator_getCurrentLine]
if {$lineNum != {}} {
$project move_simulator_line $lineNum
- } {
+ } else {
$project editor_procedure {} unset_simulator_line {}
}
$project Simulator_sync_PC_etc
@@ -1053,10 +1061,10 @@ class HexEditDlg {
## Adjust view mode to state of mode menu
# @return void
public method adjust_mode {} {
- $mode_combo_box current [lsearch {hex dec oct} [subst "\$::HexEditDlg::mode_${obj_idx}"]]
+ $mode_combo_box current [lsearch {hex dec oct} [subst -nocommands "\$::HexEditDlg::mode_${obj_idx}"]]
sbar_show {Working ...}
update
- $hexeditor switch_mode [subst "\$::HexEditDlg::mode_${obj_idx}"]
+ $hexeditor switch_mode [subst -nocommands "\$::HexEditDlg::mode_${obj_idx}"]
sbar_show {Working}
}
@@ -1078,7 +1086,7 @@ class HexEditDlg {
}
if {$type == {uni}} {
delete object $this
- } {
+ } else {
::X::close_hexedit $type $project
}
}
@@ -1102,7 +1110,7 @@ class HexEditDlg {
if {$type == {code}} {
$left_sbar_label configure -text \
[mc [lindex $HELPFILE_CODE [list $help_file_index $entry_index]]]
- } {
+ } else {
$left_sbar_label configure -text \
[mc [lindex $HELPFILE_XDATA [list $help_file_index $entry_index]]]
}
@@ -1189,6 +1197,19 @@ class HexEditDlg {
# Reload content of HexEditor
# @return void
public method reload {} {
+
+ if {$modified} {
+ set response [tk_messageBox \
+ -parent $win \
+ -type yesno \
+ -icon warning \
+ -title [mc "File modified"] \
+ -message [mc "Content of the hex editor has been changed.\nDo you really want to reload without saving it?"]]
+ if {$response == {no}} {
+ return
+ }
+ }
+
# Store original cursor position
set current_cursor_pos [$hexeditor getCurrentCell]
@@ -1198,7 +1219,7 @@ class HexEditDlg {
if {$ext != {} && $opened_file != {}} {
open_file $opened_file $ext
}
- } {
+ } else {
refresh
}
@@ -1209,21 +1230,21 @@ class HexEditDlg {
}
## Action for Menu/Toolbar - Save as
- # Save current content of hexeditor as IHEX8 file and ask for file name
+ # Save current content of hex editor as IHEX8 file and ask for file name
# @return void
public method saveas {} {
set directory [file dirname $opened_file]
if {$type == {uni}} {
if {${::X::project_menu_locked}} {
set project {}
- } {
+ } else {
set project ${::X::actualProject}
}
}
if {$directory == {.}} {
if {$project == {}} {
set directory ${::X::defaultDirectory}
- } {
+ } else {
set directory [$project cget -projectPath]
}
}
@@ -1232,11 +1253,11 @@ class HexEditDlg {
-title [mc "Save file - MCU 8051 IDE"] \
-master $win \
-directory $directory \
- -initialfile [$middle_sbar_label cget -text] \
- -defaultmask 0 -multiple 0 -filetypes {
- {{IHEX8} {*.{hex,ihx}} }
- {{All files} {*} }
- }
+ -initialfile [$middle_sbar_label cget -text] \
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "Intel 8 HEX"] {*.{hex,ihx}} ] \
+ [list [mc "All files"] {*} ] \
+ ]
fsd setokcmd "$this save_file_proc \[::HexEditDlg::fsd get\]"
fsd activate
}
@@ -1259,14 +1280,14 @@ class HexEditDlg {
if {$type == {uni}} {
if {${::X::project_menu_locked}} {
set project {}
- } {
+ } else {
set project ${::X::actualProject}
}
}
if {$directory == {.}} {
if {$project == {}} {
set directory ${::X::defaultDirectory}
- } {
+ } else {
set directory [$project cget -projectPath]
}
}
@@ -1274,10 +1295,10 @@ class HexEditDlg {
KIFSD::FSD fsd \
-title [mc "Open file - MCU 8051 IDE"] \
-master $win -directory $directory \
- -defaultmask 0 -multiple 0 -filetypes {
- {{IHEX8} {*.{hex,ihx}} }
- {{All files} {*} }
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "Intel 8 HEX"] {*.{hex,ihx}} ] \
+ [list [mc "All files"] {*} ] \
+ ]
fsd setokcmd "$this open_file \[::HexEditDlg::fsd get\] hex"
fsd activate
}
@@ -1294,10 +1315,10 @@ class HexEditDlg {
KIFSD::FSD fsd \
-title [mc "Open file - MCU 8051 IDE"] \
-master $win -directory $directory \
- -defaultmask 0 -multiple 0 -filetypes {
- {{Simulator file} {*.adb} }
- {{All files} {*} }
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "Simulator file"] {*.adb} ] \
+ [list [mc "All files"] {*} ] \
+ ]
fsd setokcmd "$this open_file \[::HexEditDlg::fsd get\] adf"
fsd activate
}
@@ -1305,7 +1326,7 @@ class HexEditDlg {
## Open the give file and load its contents into editor
# @parm String filename - Relative or absolute filename
# @parm String extension - Fily type {adf hex}
- # @return void
+ # @return Bool - 1 == success; 0 == failure
public method open_file {filename extension} {
# Store original cursor position
set current_cursor_pos [$hexeditor getCurrentCell]
@@ -1316,14 +1337,14 @@ class HexEditDlg {
if {$type == {uni}} {
if {${::X::project_menu_locked}} {
set project {}
- } {
+ } else {
set project ${::X::actualProject}
}
}
if {$directory == {.}} {
if {$project == {}} {
set directory ${::X::defaultDirectory}
- } {
+ } else {
set directory [$project cget -projectPath]
}
}
@@ -1331,8 +1352,8 @@ class HexEditDlg {
if {![regexp "^(~|/)" $filename]} {
set filename "$directory/$filename"
}
- } { ;# Microsoft windows way
- if {![regexp "^\w:" $filename]} {
+ } else { ;# Microsoft windows way
+ if {![regexp {^\w:} $filename]} {
set filename [file join $directory $filename]
}
}
@@ -1347,20 +1368,20 @@ class HexEditDlg {
-icon warning \
-title [mc "Permission denied"] \
-message [mc "Unable to open file:\n%s" $filename]
- return
+ return 0
}
# Clear editor
if {$type == {uni}} {
$hexeditor fill_views
- } {
+ } else {
$project simulator_clear_memory $type
}
# Load contents
if {$extension == {adf}} {
$project load_program_from_adf $filename
- } {
+ } else {
readHex [read $file]
}
@@ -1373,6 +1394,8 @@ class HexEditDlg {
update
$hexeditor setCurrentCell $current_cursor_pos
$hexeditor seeCell $current_cursor_pos
+
+ return 1
}
## Save content of the editor into the given file in format IHEX8
@@ -1386,14 +1409,14 @@ class HexEditDlg {
if {$type == {uni}} {
if {${::X::project_menu_locked}} {
set project {}
- } {
+ } else {
set project ${::X::actualProject}
}
}
if {$directory == {.}} {
if {$project == {}} {
set directory ${::X::defaultDirectory}
- } {
+ } else {
set directory [$project cget -projectPath]
}
}
@@ -1402,7 +1425,7 @@ class HexEditDlg {
set filename "$directory/$filename"
}
} { ;# Microsoft windows way
- if {![regexp "^\w:" $filename]} {
+ if {![regexp {^\w:} $filename]} {
set filename [file join $directory $filename]
}
}
@@ -1411,7 +1434,7 @@ class HexEditDlg {
if {![regexp {\.(hex|ihx)$} $filename]} {
if {$type != {code} && $type != {uni} } {
append filename {.xdata.hex}
- } {
+ } else {
append filename {.hex}
}
}
@@ -1431,7 +1454,7 @@ class HexEditDlg {
-title [mc "Overwrite file"] \
-message [mc "A file name '%s' already exists. Are you sure you want to overwrite it ?" [file tail $filename]]
] != {yes}
- } {
+ } then {
return
}
# Create a backup file
@@ -1458,8 +1481,8 @@ class HexEditDlg {
# Open file
if {[catch {
- set file [open $filename w 420]
- }]} {
+ set file [open $filename w 0640]
+ }]} then {
tk_messageBox \
-parent $win \
-type ok \
@@ -1560,11 +1583,14 @@ class HexEditDlg {
}
# Save EOF
- puts -nonewline $file {:00000001FF}
+ puts $file {:00000001FF}
# Done ...
close $file
setModified 0
+ if {$::MICROSOFT_WINDOWS} { ;# "/" --> "\"
+ regsub -all {/} $filename "\\" filename
+ }
sbar_show [mc "File %s saved" $filename]
}
@@ -1595,7 +1621,7 @@ class HexEditDlg {
# GENERAL PUBLIC INTERFACE
# -------------------------------------------------------------------
- ## Inform hexeditor about simulator start or shutdown
+ ## Inform hex editor about simulator start or shutdown
# @parm Bool started - 1 == Simulator started; 0 == Simulator stopped
# @return void
public method simulator_stared_stopped {started} {
@@ -1605,7 +1631,7 @@ class HexEditDlg {
if {$started} {
set state {normal}
- } {
+ } else {
set state {disabled}
}
$sub_call_but configure -state $state
@@ -1614,7 +1640,8 @@ class HexEditDlg {
[$hexeditor get_popup_menu] entryconfigure [::mc "LCALL this_address"] -state $state
}
- ## Move program pointer (highlight cells) -- Avaliable only for code memory hexeditor
+ ## Move program pointer (highlight cells)
+ # -- available only for code memory hex editor
# @parm Int new_PC - New program counter
# @parm Int int_length - Instruction length
# @return void
@@ -1647,12 +1674,14 @@ class HexEditDlg {
for {set i 0} {$i < $int_length} {incr i} {
$hexeditor set_bg_hg $new_PC 1 2
+ $hexeditor set_bg_hg $new_PC 0 1
incr new_PC
}
$hexeditor seeCell $new_PC
}
- ## Directly move program pointer (do not affect previous PC pointer) -- Avaliable only for code memory hexeditor
+ ## Directly move program pointer (do not affect previous PC pointer)
+ # -- available only for code memory hex editor
# @parm Int new_PC - New program counter (-1 == unresolved)
# @parm Int int_length - Instruction length
# @return void
@@ -1697,7 +1726,7 @@ class HexEditDlg {
}
## Write value to the editor
- # - avaliable only in modes: XDATA and ERAM
+ # - available only in modes: XDATA and ERAM
# @parm String address - hexadecimal address
# @return void
public method reg_sync {address} {
@@ -1733,7 +1762,7 @@ class HexEditDlg {
set loaded_lines [string repeat [string repeat 0 0xFF] 0xFF]
load_data_to_current_view
- setModified 1
+ setModified 0
}
## Get configuration list
@@ -1752,7 +1781,7 @@ class HexEditDlg {
set cell [lindex $config 2]
set current_view [lindex $config 3]
- # load configuration for hexeditor widget
+ # load configuration for hex editor widget
::HexEditor::load_config_list [lindex $config 4]
# Validate loaded values
@@ -1785,9 +1814,13 @@ class HexEditDlg {
if {$type == {uni}} {
if {$modified} {
wm title $win "\[modified\] $filename - [mc {Hexadecimal editor}] - MCU 8051 IDE"
- } {
+ } else {
wm title $win "$filename - [mc {Hexadecimal editor}] - MCU 8051 IDE"
}
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/utilities/notes.tcl b/lib/utilities/notes.tcl
index f39312f..d74b652 100755..100644
--- a/lib/utilities/notes.tcl
+++ b/lib/utilities/notes.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 _NOTES_TCL ] } {
+set _NOTES_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION:
# Scribble notes independent on project
@@ -32,10 +37,10 @@ class Notes {
common bgcolor {#EEEE55} ;# Color: Background color for title bar and window border
common bgcolor2 {#FFFF88} ;# Color: Background color for the canvas widget
# Font: For inserted text
- common canvas_text_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -14 \
- -weight bold \
+ common canvas_text_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight bold \
]
# List: Popup menu for the canvas widget
common MENU {
@@ -118,7 +123,7 @@ class Notes {
set filename $_file_name
if {$_geometry == {}} {
set geometry {50 50 300 300}
- } {
+ } else {
set geometry $_geometry
}
@@ -133,7 +138,7 @@ class Notes {
-relief flat
ttk::style map Notes_Flat.TButton \
-relief [list active raised] \
- -background [list disabled {#EEEEEE}]
+ -background [list disabled ${::COMMON_BG_COLOR}]
create_win
}
@@ -270,7 +275,7 @@ class Notes {
if {[prompt_for_text]} {
$canvas_widget configure -cursor cross
set w $mode_text_but
- } {
+ } else {
if {$drawing_mode_org == {T}} {
set drawing_mode_org {M}
}
@@ -321,7 +326,7 @@ class Notes {
pack forget $main_frame
place $win -height [expr {[winfo height $win.title_bar] + 4}]
# Unshade
- } {
+ } else {
set image _1uparrow
pack $main_frame -fill both -expand 1 -padx 2 -pady 2
place $win -height [expr {[lindex $geometry 3] + 2}]
@@ -336,7 +341,7 @@ class Notes {
set popup_menu_created 1
set menu $canvas_widget.menu
- menuFactory $MENU $menu 0 "$this " 0 {}
+ menuFactory $MENU $menu 0 "$this " 0 {} [namespace current]
}
## Popup menu
@@ -484,7 +489,7 @@ class Notes {
-image ::ICONS::16::grid1 \
]
DynamicHelp::add $bottom_frame.mode_rectangle_but -text [mc "Retangle"]
- setStatusTip -widget $mode_rectangle_but -text [mc "Draw retangles"]
+ setStatusTip -widget $mode_rectangle_but -text [mc "Draw rectangles"]
pack $mode_rectangle_but -side left -ipady 0
# - Button "Oval"
set mode_oval_but [ttk::button $bottom_frame.mode_oval_but \
@@ -523,7 +528,7 @@ class Notes {
-command "$this select_color" \
-bd 1 -relief raised -overrelief raised \
-activebackground $selected_color \
- -bg $selected_color -pady 0 \
+ -bg $selected_color -pady 0 -width 2 \
]
DynamicHelp::add $bottom_frame.select_color_but -text [mc "Select color"]
setStatusTip -widget $select_color_but -text [mc "Select color"]
@@ -597,7 +602,7 @@ class Notes {
# @return void
private method prompt_for_text {} {
set ::Notes::text_prompt_text {}
- set dialog [toplevel .notes_pd -bg {#EEEEEE}]
+ set dialog [toplevel .notes_pd -bg ${::COMMON_BG_COLOR}]
## Create top frame
set frame [frame $dialog.frm]
@@ -865,10 +870,10 @@ class Notes {
KIFSD::FSD ::fsd \
-directory $directory \
-title [mc "Insert image from file"] \
- -defaultmask 0 -multiple 0 -filetypes {
- {{PNG files} {*.png}}
- {{All files} {*}}
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "Portable network graphics"] {*.png} ] \
+ [list [mc "All files"] {*} ] \
+ ]
::fsd setokcmd "$this load_image_file \[::fsd get\]"
::fsd activate
@@ -881,10 +886,12 @@ class Notes {
set loaded_image {}
if {[catch {
set loaded_image [image create photo -file $file]
- }]} {
- tk_messageBox \
+ }]} then {
+ tk_messageBox \
+ -parent . \
+ -type ok \
+ -icon warning \
-title [mc "Unable to read file"] \
- -type ok -icon warning \
-message [mc "Unable to read file:\n%s" $file]
return
}
@@ -894,3 +901,7 @@ class Notes {
}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/utilities/rs232debugger.tcl b/lib/utilities/rs232debugger.tcl
index dacb8d5..af2354b 100755..100644
--- a/lib/utilities/rs232debugger.tcl
+++ b/lib/utilities/rs232debugger.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 _RS232DEBUGGER_TCL ] } {
+set _RS232DEBUGGER_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
@@ -31,29 +36,34 @@ class RS232Debugger {
## COMMON
common count 0 ;# Int: Counter of class instances
# Font: Big bold font
- common bold_font [font create \
- -family {helvetica} \
- -size -12 -weight {bold} \
+ common bold_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight {bold} \
]
# Font: Tiny normal font
- common tiny_font [font create \
- -family {helvetica} \
- -size -9 -weight {normal} \
+ common tiny_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-9 * $::font_size_factor)}] \
+ -weight {normal} \
]
# Font: Tiny bold font
- common tiny_font_bold [font create \
- -family {helvetica} \
- -size -9 -weight {bold} \
+ common tiny_font_bold [font create \
+ -family {helvetica} \
+ -size [expr {int(-9 * $::font_size_factor)}] \
+ -weight {bold} \
]
# Font: Normal font
- common normal_font [font create \
- -family {helvetica} \
- -size -11 -weight {normal} \
+ common normal_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-11 * $::font_size_factor)}] \
+ -weight {normal} \
]
# Font: Also normal font, but a bit larger
- common big_font [font create \
- -family {helvetica} \
- -size -12 -weight {normal} \
+ common big_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight {normal} \
]
# Int: Pool interval for selected RS232 interface
common POOL_INTERVAL 50 ;# mili-seconds
@@ -92,13 +102,13 @@ class RS232Debugger {
private variable clear_selected_rec_button ;# Widget: Button "Clear selected" in section "Receive"
private variable receive_here_button ;# Widget: Button "Receive here"
private variable clear_selected_snd_button ;# Widget: Button "Clear selected" in section "Send"
- private variable receive_hexeditor ;# Object: Hexeditor intented for reception
- private variable send_hexeditor ;# Object: Hexeditor intented for sending
+ private variable receive_hexeditor ;# Object: Hex editor intented for reception
+ private variable send_hexeditor ;# Object: Hex editor intented for sending
private variable pool_timer {} ;# Object: Pool timer object
private variable channel {} ;# Channel: Opened device file
private variable port_filename {} ;# String: Device file name
- private variable reception_address 0 ;# Int: Address in reception hexeditor where received data are stored
+ private variable reception_address 0 ;# Int: Address in reception hex editor where received data are stored
private variable reception_enabled 1 ;# Bool: Reception enabled
private variable prev_tty_status ;# List: Previous TTY status (before any action performed by this code)
@@ -130,7 +140,7 @@ class RS232Debugger {
-foreground {#000000} \
-background {#DDDDDD}
ttk::style map RS232Debugger_SignalAllDefault.TButton \
- -background [list active {#EEEEEE}]
+ -background [list active ${::COMMON_BG_COLOR}]
ttk::style configure RS232Debugger_SignalTxDTrue.TButton \
-background {#AAFFAA} \
@@ -150,7 +160,7 @@ class RS232Debugger {
-background {#DDDDDD} \
-foreground {#000000}
ttk::style map RS232Debugger_SignalTxDFalse.TButton \
- -background [list active {#EEEEEE}] \
+ -background [list active ${::COMMON_BG_COLOR}] \
-foreground [list active {#000000}]
ttk::style configure RS232Debugger_SignalNormalFalse.TButton \
@@ -216,7 +226,7 @@ class RS232Debugger {
create_gui
set_tty_controls_state 0
- # Restore data displayed in hexeditors
+ # Restore data displayed in hex editors
foreach idx {5 6} hexedit [list $receive_hexeditor $send_hexeditor] {
set data [lindex $config_list $idx]
if {![llength $data]} {
@@ -228,7 +238,7 @@ class RS232Debugger {
}
}
- # restore addresses of current cells in hexeditors
+ # restore addresses of current cells in hex editors
$receive_hexeditor setCurrentCell [lindex $config_list 7]
$send_hexeditor setCurrentCell [lindex $config_list 8]
}
@@ -249,7 +259,7 @@ class RS232Debugger {
# Cancel pool timer
catch {after cancel $pool_timer}
- # Close opended channel
+ # Close opened channel
if {$channel !={}} {
catch {fileevent $channel readable {}}
catch {close $channel}
@@ -263,7 +273,7 @@ class RS232Debugger {
# @return void
private method create_gui {} {
# Create window
- set win [toplevel .rs232debugger$count -class [mc "RS232 Debugger"] -bg {#EEEEEE}]
+ set win [toplevel .rs232debugger$count -class [mc "RS232 Debugger"] -bg ${::COMMON_BG_COLOR}]
# Create status bar
set status_bar_label [label $win.status_bar_label -justify left -pady 0 -anchor w]
@@ -381,13 +391,13 @@ class RS232Debugger {
$connector_canvas bind gnd_wire <Leave> "$this wire_leave gnd"
## Write texts
- $connector_canvas create text \
- [expr {$x + 10}] [expr {$y - 25}] \
- -anchor n -justify left \
+ $connector_canvas create text \
+ [expr {$x + 10}] [expr {$y - 30}] \
+ -anchor n -justify left \
-font $big_font -text [mc "RS-232\nDTE"]
- $connector_canvas create text \
+ $connector_canvas create text \
[expr {$x + 10}] [expr {$y + 100}] \
- -anchor n -justify left \
+ -anchor n -justify left \
-font $big_font -text [mc "DE-9"]
}
@@ -510,7 +520,7 @@ class RS232Debugger {
bind $dtr_button <Enter> "$this wire_enter dtr"
bind $dtr_button <Leave> "$this wire_leave dtr"
$connector_canvas create window \
- [expr {$x + 100}] [expr {$y + 95}] \
+ [expr {$x + 100}] [expr {$y + 90}] \
-anchor center -window $dtr_button
$connector_canvas create line \
@@ -539,7 +549,7 @@ class RS232Debugger {
bind $rts_button <Enter> "$this wire_enter rts"
bind $rts_button <Leave> "$this wire_leave rts"
$connector_canvas create window \
- [expr {$x + 135}] [expr {$y + 95}] \
+ [expr {$x + 135}] [expr {$y + 90}] \
-anchor center -window $rts_button
$connector_canvas create line \
@@ -568,7 +578,7 @@ class RS232Debugger {
bind $break_button <Enter> "$this wire_enter txd"
bind $break_button <Leave> "$this wire_leave txd"
$connector_canvas create window \
- [expr {$x + 180}] [expr {$y + 95}] \
+ [expr {$x + 180}] [expr {$y + 90}] \
-anchor center -window $break_button
$connector_canvas create line \
@@ -617,10 +627,10 @@ class RS232Debugger {
# Create canvas widget
set connector_canvas [canvas $target_frame.canvas \
- -width 280 -height 150 -bg {#EEEEEE} \
+ -width 280 -height 150 -bg ${::COMMON_BG_COLOR} \
-bd 0 -relief flat -highlightthickness 0 \
]
- pack $connector_canvas -side left -anchor sw
+ pack $connector_canvas -side left -padx 5 ;#-anchor sw
# Fill in the connector canvas
draw_connector 20 30
@@ -642,7 +652,7 @@ class RS232Debugger {
-image ::ICONS::16::configure \
] \
]
- pack $conf_frame -side left -anchor nw
+ pack $conf_frame -side right -anchor nw -padx 5
# - Physical port
grid [label $conf_frame.port_lbl \
-text [mc "Physical port"] \
@@ -687,13 +697,16 @@ class RS232Debugger {
-text [mc "Parity"] \
] -row 4 -column 1 -sticky w
set parity_cb [ttk::combobox $conf_frame.parity_cb \
- -values {none odd even mark space} \
-state readonly \
-width 6 \
-exportselection 0 \
+ -values [list [mc "none"] \
+ [mc "odd"] [mc "even"] \
+ [mc "mark"] [mc "space"] \
+ ]
]
bind $parity_cb <<ComboboxSelected>> \
- "$this change_port_config p \[$conf_frame.parity_cb get\]"
+ "$this change_port_config p \[$conf_frame.parity_cb current\]"
set_status_tip $parity_cb [mc "Parity"]
grid $parity_cb -row 4 -column 2 -sticky w
$conf_frame.parity_cb current [lsearch {n o e m s} $parity_conf]
@@ -852,7 +865,7 @@ class RS232Debugger {
if {[file exists $content]} {
if {$port_filename == $content} {
$port_combobox configure -style RS232Debugger_FileInUse.TCombobox
- } {
+ } else {
$port_combobox configure -style RS232Debugger_FileFound.TCombobox
}
# Not exiting file
@@ -924,7 +937,7 @@ class RS232Debugger {
-message \"[mc {Unable to open the specified file}]\n\n\${reason}\""
# -> Success
} else {
- # Try to configure opened channel acording to specified parameters
+ # Try to configure opened channel according to specified parameters
if {[catch {
fconfigure $channel \
-handshake none \
@@ -964,24 +977,7 @@ class RS232Debugger {
set baud_conf $value
}
{p} { ;# Parity bit
- switch -- $value {
- {none} {
- set value {n}
- }
- {odd} {
- set value {o}
- }
- {even} {
- set value {e}
- }
- {mark} {
- set value {m}
- }
- {space} {
- set value {s}
- }
- }
- set parity_conf $value
+ set parity_conf [lindex {n o e m s} $value]
}
{d} { ;# Data bits
set data_conf $value
@@ -1004,31 +1000,31 @@ class RS232Debugger {
-parent $win \
-type ok \
-icon error \
- -title [mc "Uknown failure"] \
+ -title [mc "Unknown failure"] \
-message [mc "Unable to change port configuration"]
}
}
- ## Handle selection event in hexeditor
+ ## Handle selection event in hex editor
# @parm Char editor - Editor ID
# @parm Bool anything_selected - 1 == anything selected; 0 == Nothing selected
# @return void
public method hexeditor_selection {editor anything_selected} {
if {$anything_selected} {
set state {normal}
- } {
+ } else {
set state {disabled}
}
if {$editor == {s}} {
$send_selected_button configure -state $state
$clear_selected_snd_button configure -state $state
- } {
+ } else {
$clear_selected_rec_button configure -state $state
}
}
- ## Clear selected data in send hexeditor
+ ## Clear selected data in send hex editor
# @return void
public method clear_selected_snd {} {
# Get range of text indexes determinating the selection
@@ -1142,7 +1138,7 @@ class RS232Debugger {
if {[winfo exists .data_lost_dialog]} {
return
}
- set dialog [toplevel .data_lost_dialog -class [mc "Error message"] -bg {#EEEEEE}]
+ set dialog [toplevel .data_lost_dialog -class [mc "Error message"] -bg ${::COMMON_BG_COLOR}]
pack [label $dialog.label \
-font $bold_font -compound left -padx 5 \
@@ -1181,7 +1177,7 @@ class RS232Debugger {
tkwait window $dialog
}
- ## Clear selected data in receive hexeditor
+ ## Clear selected data in receive hex editor
# @return void
public method clear_selected_rec {} {
set rangeofselection [$receive_hexeditor getRangeOfSelection]
@@ -1200,7 +1196,7 @@ class RS232Debugger {
## Enable/Disable reception
# @return void
public method reception_ena_dis {} {
- set reception_enabled [subst "\$::RS232Debugger::enable_reception${obj_idx}"]
+ set reception_enabled [subst -nocommands "\$::RS232Debugger::enable_reception${obj_idx}"]
}
## Read TTY status from the interface and update GUI accordingly
@@ -1212,15 +1208,15 @@ class RS232Debugger {
# Read TTY status
if {[catch {
set ttystatus [fconfigure $channel -ttystatus]
- }]} {
+ }]} then {
unknown_port_io_error
return
}
- # Check whether any change occured
+ # Check whether any change occurred
if {$prev_tty_status(0) == $ttystatus} {
return
- } {
+ } else {
set prev_tty_status(0) $ttystatus
}
@@ -1256,7 +1252,7 @@ class RS232Debugger {
foreach signal {cts dsr ri dcd} value $args {
if {$prev_tty_status($signal) == $value} {
continue
- } {
+ } else {
set prev_tty_status($signal) $value
}
@@ -1280,7 +1276,7 @@ class RS232Debugger {
}
}
- ## Report an unknown IO error occured on the interface
+ ## Report an unknown IO error occurred on the interface
# Plus disable reception and safely terminate connection
# @return void
private method unknown_port_io_error {} {
@@ -1326,7 +1322,7 @@ class RS232Debugger {
set state {normal}
set state2 {readonly}
set_tty_controls_to_defaults
- } {
+ } else {
set state {disabled}
set state2 {disabled}
set_tty_controls_to_unknown_state
@@ -1382,33 +1378,33 @@ class RS232Debugger {
switch -- $value {
0 { ;# Loical 0
if {$wire == {break}} {
- [subst "\${${wire}_button}"] configure -text {Break} \
+ [subst -nocommands "\${${wire}_button}"] configure -text {Break} \
-style RS232Debugger_SignalTxDFalse.TButton
$connector_canvas itemconfigure txd_wire -fill {#0000FF}
- } {
- [subst "\${${wire}_button}"] configure -text {1} \
+ } else {
+ [subst -nocommands "\${${wire}_button}"] configure -text {1} \
-style RS232Debugger_SignalNormalFalse.TButton
$connector_canvas itemconfigure ${wire}_wire -fill {#FF0000}
}
}
1 { ;# Logical 1
if {$wire == {break}} {
- [subst "\${${wire}_button}"] configure -text {BREAK} \
+ [subst -nocommands "\${${wire}_button}"] configure -text {BREAK} \
-style RS232Debugger_SignalTxDTrue.TButton
$connector_canvas itemconfigure txd_wire -fill {#00FF00}
- } {
- [subst "\${${wire}_button}"] configure -text {0} \
+ } else {
+ [subst -nocommands "\${${wire}_button}"] configure -text {0} \
-style RS232Debugger_SignalNormalTrue.TButton
$connector_canvas itemconfigure ${wire}_wire -fill {#00FF00}
}
}
default { ;# Unknown state
if {$wire == {break}} {
- [subst "\${${wire}_button}"] configure -text {Break} \
+ [subst -nocommands "\${${wire}_button}"] configure -text {Break} \
-style RS232Debugger_SignalAllDefault.TButton
$connector_canvas itemconfigure txd_wire -fill {#0000FF}
- } {
- [subst "\${${wire}_button}"] configure -text {-} \
+ } else {
+ [subst -nocommands "\${${wire}_button}"] configure -text {-} \
-style RS232Debugger_SignalAllDefault.TButton
$connector_canvas itemconfigure ${wire}_wire -fill {#888888}
}
@@ -1418,7 +1414,7 @@ class RS232Debugger {
if {[catch {
fconfigure $channel -ttycontrol [list $wire $value]
- }]} {
+ }]} then {
unknown_port_io_error
return
}
@@ -1452,9 +1448,13 @@ class RS232Debugger {
# @return void
public method wire_leave {wire} {
$connector_canvas itemconfigure ${wire}_wire -width 1
- $connector_canvas itemconfigure ${wire}_pin -fill {#EEEEEE}
+ $connector_canvas itemconfigure ${wire}_pin -fill ${::COMMON_BG_COLOR}
$connector_canvas itemconfigure ${wire}_num -font $tiny_font
$status_bar_label configure -text {}
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/utilities/speccalc.tcl b/lib/utilities/speccalc.tcl
index 67a9430..49db83b 100755..100644
--- a/lib/utilities/speccalc.tcl
+++ b/lib/utilities/speccalc.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 _SPECCALC_TCL ] } {
+set _SPECCALC_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
@@ -34,7 +39,7 @@
class SpecCalc {
## COMMON
common count 0 ;# Int: Counter of class instances
- common diagram_counter 0 ;# Int: Counter of diagram dialogs instances
+ common diagram_counter 0 ;# Int: Counter of diagram dialogues instances
# List of pages descriptors for PagesManager
common page_list {
loops timer01 timer2 spi
@@ -67,10 +72,10 @@ class SpecCalc {
ttk::style configure SpecCalc_RedBg.TCombobox -fieldbackground {#FFCCCC}
ttk::style configure SpecCalc_Flat.TButton -background {#FFFFFF} -padding 0 -borderwidth 1 -relief flat
- ttk::style map SpecCalc_Flat.TButton -relief [list active raised] -background [list disabled {#EEEEEE} active {#EEEEFF}]
+ ttk::style map SpecCalc_Flat.TButton -relief [list active raised] -background [list disabled ${::COMMON_BG_COLOR} active {#EEEEFF}]
ttk::style configure SpecCalc_Spec.TButton -background {#CCCCFF} -padding 0
- ttk::style map SpecCalc_Spec.TButton -background [list disabled {#EEEEEE} active {#DDDDFF}]
+ ttk::style map SpecCalc_Spec.TButton -background [list disabled ${::COMMON_BG_COLOR} active {#DDDDFF}]
create_gui
}
@@ -86,7 +91,7 @@ class SpecCalc {
[list [$widgets(loops,time_ent) get] \
[$widgets(loops,time_cb) current] \
[$widgets(loops,clock_cb) get] \
- [$widgets(loops,clock_type_cb) current] \
+ [$widgets(loops,clock_type_cb) current] \
[$widgets(loops,reg_ent0) get] \
[$widgets(loops,reg_ent1) get] \
[$widgets(loops,reg_ent2) get] \
@@ -102,7 +107,7 @@ class SpecCalc {
[$widgets(timer01,clock_type_cb) current] \
[$widgets(timer01,mode_cb) current] \
[$widgets(timer01,psc_cb) current] \
- [subst "\${::SpecCalc::spec_chb_$obj_idx}"] \
+ [subst -nocommands "\${::SpecCalc::spec_chb_$obj_idx}"] \
] [list \
[$widgets(timer2,time_ent) get] \
[$widgets(timer2,time_cb) current] \
@@ -111,14 +116,14 @@ class SpecCalc {
[$widgets(timer2,mode_cb) current] \
] [list \
- [subst "\$::SpecCalc::timer2_clk_fosc_$obj_idx"]\
- [subst "\$::SpecCalc::timer2_clk_freq_$obj_idx"]\
- [subst "\$::SpecCalc::timer2_clk_x2_$obj_idx"] \
+ [subst -nocommands "\$::SpecCalc::timer2_clk_fosc_$obj_idx"] \
+ [subst -nocommands "\$::SpecCalc::timer2_clk_freq_$obj_idx"] \
+ [subst -nocommands "\$::SpecCalc::timer2_clk_x2_$obj_idx"] \
] [list \
[wm geometry $win] \
$active_page \
] [list \
- [subst "\${::SpecCalc::double_chb_$obj_idx}"] \
+ [subst -nocommands "\${::SpecCalc::double_chb_$obj_idx}"] \
[$widgets(spi,sck_ent00) get] \
]
]
@@ -148,7 +153,7 @@ class SpecCalc {
# @return void
private method create_gui {} {
# Create dialog window and the main frame
- set win [toplevel .spec_calc$count -class [mc "Special Calculator - MCU 8051 IDE"] -bg {#EEEEEE}]
+ set win [toplevel .spec_calc$count -class [mc "Special Calculator - MCU 8051 IDE"] -bg ${::COMMON_BG_COLOR}]
set main_frame [frame $win.main_frame]
# Create status bar
@@ -192,7 +197,7 @@ class SpecCalc {
if {[llength $config]} {
wm geometry $win [lindex $config {4 0}]
switch_page [lindex $config {4 1}]
- } {
+ } else {
wm geometry $win 400x350
switch_page loops
}
@@ -222,10 +227,10 @@ class SpecCalc {
} page $page_list \
{
set buttons($page) [ttk::button $target_frame.${page}_button \
- -image ::ICONS::22::$icon \
- -text [mc $name] -compound top \
- -command "$this switch_page $page" \
- -style Flat.TButton \
+ -image ::ICONS::22::$icon \
+ -text [mc $name] -compound top \
+ -command "$this switch_page $page" \
+ -style Flat.TButton \
]
pack $buttons($page) -anchor n
set_status_tip $buttons($page) [mc $stip]
@@ -236,7 +241,7 @@ class SpecCalc {
# @parm Widget target_frame - Frame widget in which the GUI should be created
# @return void
private method create_right_frame {target_frame} {
- set pages_manager [PagesManager $target_frame.pages_manager -background {#eeeeee}]
+ set pages_manager [PagesManager $target_frame.pages_manager -background ${::COMMON_BG_COLOR}]
pack $pages_manager -fill both -expand 1
foreach page $page_list {
@@ -363,13 +368,13 @@ class SpecCalc {
-command "$this calc loops copy_but {}" \
]
pack $widgets(loops,copy_but) -side right
- set widgets(loops,results) [text $bottom_frame_b.text \
- -state disabled -width 0 -height 0 -bg white \
- -yscrollcommand "$bottom_frame_b.scrollbar set" \
- -takefocus 1 -font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -14 \
- ] \
+ set widgets(loops,results) [text $bottom_frame_b.text \
+ -state disabled -width 0 -height 0 -bg white \
+ -yscrollcommand "$bottom_frame_b.scrollbar set" \
+ -takefocus 1 -font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ ] \
]
ASMsyntaxHighlight::create_tags $widgets(loops,results) 14 $::DEFAULT_FIXED_FONT
bind $widgets(loops,results) <Button-1> "focus %W"
@@ -394,13 +399,13 @@ class SpecCalc {
# Create page header
- pack [label $pages($page).header \
- -text [mc "Create a wait loop"] \
- -font [font create \
- -family {helvetica} \
- -size -17 \
- -weight bold \
- ] \
+ pack [label $pages($page).header \
+ -text [mc "Create a wait loop"] \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
+ ] \
] -pady 5
pack $top_frame -anchor nw
pack $regs_frame -anchor nw -fill x
@@ -413,15 +418,15 @@ class SpecCalc {
if {[llength $config]} {
$widgets(loops,time_ent) insert 0 [lindex $config {0 0}]
$widgets(loops,time_cb) current [lindex $config {0 1}]
- $widgets(loops,clock_cb) delete 0 end
- $widgets(loops,clock_cb) insert 0 [lindex $config {0 2}]
+ $widgets(loops,clock_cb) delete 0 end
+ $widgets(loops,clock_cb) insert 0 [lindex $config {0 2}]
$widgets(loops,clock_type_cb) current [lindex $config {0 3}]
for {set i 0; set k 4} {$i < 8} {incr i; incr k} {
$widgets(loops,reg_ent$i) insert 0 [lindex $config [list 0 $k]]
}
- } {
+ } else {
$widgets(loops,time_cb) current 1
$widgets(loops,clock_cb) current 2
$widgets(loops,clock_type_cb) current 0
@@ -569,9 +574,9 @@ class SpecCalc {
# - TH
set widgets(timer01,th) [ \
entry $bottom_frame.th_r_lbl -state readonly \
- -readonlybackground {#EEEEEE} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
- -fg {#888888} -bg {#EEEEEE} \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
-relief flat -highlightthickness 0 -bd 0 \
-textvariable ::SpecCalc::timer01_th_$obj_idx \
]
@@ -580,8 +585,8 @@ class SpecCalc {
# - TL
set widgets(timer01,tl) [ \
entry $bottom_frame.tl_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} \
- -readonlybackground {#EEEEEE} \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
-relief flat -highlightthickness 0 -bd 0 \
-textvariable ::SpecCalc::timer01_tl_$obj_idx \
@@ -591,8 +596,8 @@ class SpecCalc {
# - RH
set widgets(timer01,rh) [ \
entry $bottom_frame.rh_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} \
- -readonlybackground {#EEEEEE} \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
-relief flat -highlightthickness 0 -bd 0 \
-textvariable ::SpecCalc::timer01_rh_$obj_idx \
@@ -601,8 +606,8 @@ class SpecCalc {
# - RL
set widgets(timer01,rl) [ \
entry $bottom_frame.rl_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} \
- -readonlybackground {#EEEEEE} \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
-relief flat -highlightthickness 0 -bd 0 \
-textvariable ::SpecCalc::timer01_rl_$obj_idx \
@@ -611,8 +616,8 @@ class SpecCalc {
# - Repeats
set widgets(timer01,repeats) [ \
entry $bottom_frame.reps_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} \
- -readonlybackground {#EEEEEE} \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
-relief flat -highlightthickness 0 -bd 0 \
-textvariable ::SpecCalc::timer01_repeats_$obj_idx\
@@ -622,8 +627,8 @@ class SpecCalc {
# - Rest
set widgets(timer01,rest) [ \
entry $bottom_frame.rest_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} \
- -readonlybackground {#EEEEEE} \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
-relief flat -highlightthickness 0 -bd 0 \
-textvariable ::SpecCalc::timer01_rest_$obj_idx \
@@ -636,13 +641,13 @@ class SpecCalc {
# Create page header
- pack [label $pages($page).header \
- -text [mc "Calculate timer 0/1 preset"] \
- -font [font create \
- -family {helvetica} \
- -size -17 \
- -weight bold \
- ] \
+ pack [label $pages($page).header \
+ -text [mc "Calculate timer 0/1 preset"] \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
+ ] \
] -pady 5
pack $top_frame -anchor nw
pack [ttk::separator $pages($page).sep \
@@ -682,7 +687,7 @@ class SpecCalc {
private method create_page_timer2 {} {
# Create notebook
set page {timer2}
- set nb [NoteBook $pages($page).nb -side top -arcradius 4 -bg {#EEEEEE}]
+ set nb [ModernNoteBook $pages($page).nb]
# - Page "Preset"
set preset_frame [$nb insert end {Preset} \
-text [mc "Preset"] \
@@ -805,10 +810,10 @@ class SpecCalc {
# - RCAL2H
set widgets(timer2,rcal2h) [
entry $bottom_frame.rcal2h_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
-relief flat -highlightthickness 0 -bd 0 \
-textvariable ::SpecCalc::timer2_rcal2h_$obj_idx \
- -readonlybackground {#EEEEEE} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
]
set ::SpecCalc::timer2_rcal2h_$obj_idx [mc "Do not change"]
@@ -816,10 +821,10 @@ class SpecCalc {
# - RCAL2L
set widgets(timer2,rcal2l) [
entry $bottom_frame.rcal2l_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
-relief flat -highlightthickness 0 -bd 0 \
-textvariable ::SpecCalc::timer2_rcal2l_$obj_idx \
- -readonlybackground {#EEEEEE} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
]
set ::SpecCalc::timer2_rcal2l_$obj_idx [mc "Do not change"]
@@ -827,10 +832,10 @@ class SpecCalc {
# - T2H
set widgets(timer2,t2h) [
entry $bottom_frame.t2h_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
-relief flat -highlightthickness 0 -bd 0 \
-textvariable ::SpecCalc::timer2_t2h_$obj_idx \
- -readonlybackground {#EEEEEE} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
]
set ::SpecCalc::timer2_t2h_$obj_idx [mc "Do not change"]
@@ -838,21 +843,21 @@ class SpecCalc {
# - T2L
set widgets(timer2,t2l) [
entry $bottom_frame.t2l_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
-relief flat -highlightthickness 0 -bd 0 \
-textvariable ::SpecCalc::timer2_t2l_$obj_idx \
- -readonlybackground {#EEEEEE} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
]
set ::SpecCalc::timer2_t2l_$obj_idx [mc "Do not change"]
grid $widgets(timer2,t2l) -row 4 -column 3 -sticky w
# - Repeats
- set widgets(timer2,repeats) [ \
- entry $bottom_frame.repeats_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} \
- -relief flat -highlightthickness 0 -bd 0 \
- -readonlybackground {#EEEEEE} \
- -disabledforeground {#000000} \
+ set widgets(timer2,repeats) [ \
+ entry $bottom_frame.repeats_lbl -state readonly \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
+ -relief flat -highlightthickness 0 -bd 0 \
+ -readonlybackground ${::COMMON_BG_COLOR} \
+ -disabledforeground {#000000} \
-textvariable ::SpecCalc::timer2_repeats_$obj_idx \
]
set ::SpecCalc::timer2_repeats_$obj_idx [mc "none"]
@@ -860,9 +865,9 @@ class SpecCalc {
# - Rest
set widgets(timer2,rest) [ \
entry $bottom_frame.rest_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} \
-relief flat -highlightthickness 0 -bd 0 \
- -readonlybackground {#EEEEEE} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
-textvariable ::SpecCalc::timer2_rest_$obj_idx \
]
@@ -874,13 +879,13 @@ class SpecCalc {
# Create page header
- pack [label $preset_frame.header \
- -text [mc "Calculate timer 2 preset"] \
- -font [font create \
- -family {helvetica} \
- -size -17 \
- -weight bold \
- ] \
+ pack [label $preset_frame.header \
+ -text [mc "Calculate timer 2 preset"] \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
+ ] \
] -pady 5
pack $top_frame -pady 5 -anchor nw
pack [ttk::separator $preset_frame.sep \
@@ -892,11 +897,11 @@ class SpecCalc {
if {[llength $config]} {
$widgets(timer2,time_ent) insert 0 [lindex $config {2 0}]
$widgets(timer2,time_cb) current [lindex $config {2 1}]
- $widgets(timer2,clock_cb) delete 0 end
- $widgets(timer2,clock_cb) insert 0 [lindex $config {1 2}]
+ $widgets(timer2,clock_cb) delete 0 end
+ $widgets(timer2,clock_cb) insert 0 [lindex $config {1 2}]
$widgets(timer2,clock_type_cb) current [lindex $config {2 3}]
$widgets(timer2,mode_cb) current [lindex $config {2 4}]
- } {
+ } else {
$widgets(timer2,time_cb) current 1
$widgets(timer2,clock_cb) current 2
$widgets(timer2,clock_type_cb) current 0
@@ -972,10 +977,10 @@ class SpecCalc {
# - RCAL2H
set widgets(timer2,clk_rcal2h) [
entry $bottom_frame.clk_rcal2h_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} -validate key \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} -validate key \
-relief flat -highlightthickness 0 -bd 0 -width 5 \
-textvariable ::SpecCalc::timer2_clk_rcal2h_$obj_idx \
- -readonlybackground {#EEEEEE} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
]
set ::SpecCalc::timer2_clk_rcal2h_$obj_idx "--"
@@ -983,10 +988,10 @@ class SpecCalc {
# - RCAL2L
set widgets(timer2,clk_rcal2l) [
entry $bottom_frame.clk_rcal2l_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} -validate key \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} -validate key \
-relief flat -highlightthickness 0 -bd 0 -width 5 \
-textvariable ::SpecCalc::timer2_clk_rcal2l_$obj_idx \
- -readonlybackground {#EEEEEE} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
]
set ::SpecCalc::timer2_clk_rcal2l_$obj_idx "--"
@@ -994,10 +999,10 @@ class SpecCalc {
# RCAL2H
set widgets(timer2,clk_rcal2h_d) [
entry $bottom_frame.clk_rcal2h_d_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} -validate key \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} -validate key \
-relief flat -highlightthickness 0 -bd 0 -width 5 \
-textvariable ::SpecCalc::timer2_clk_rcal2h_d_$obj_idx \
- -readonlybackground {#EEEEEE} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
]
set ::SpecCalc::timer2_clk_rcal2h_d_$obj_idx "--"
@@ -1005,10 +1010,10 @@ class SpecCalc {
# - RCAL2L
set widgets(timer2,clk_rcal2l_d) [
entry $bottom_frame.clk_rcal2l_d_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} -validate key \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} -validate key \
-relief flat -highlightthickness 0 -bd 0 -width 5 \
-textvariable ::SpecCalc::timer2_clk_rcal2l_d_$obj_idx \
- -readonlybackground {#EEEEEE} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
]
set ::SpecCalc::timer2_clk_rcal2l_d_$obj_idx "--"
@@ -1016,10 +1021,10 @@ class SpecCalc {
# - Error
set widgets(timer2,clk_error) [
entry $bottom_frame.clk_error_r_lbl -state readonly \
- -fg {#888888} -bg {#EEEEEE} -validate key \
+ -fg {#888888} -bg ${::COMMON_BG_COLOR} -validate key \
-relief flat -highlightthickness 0 -bd 0 -width 12 \
-textvariable ::SpecCalc::timer2_clk_error_$obj_idx \
- -readonlybackground {#EEEEEE} \
+ -readonlybackground ${::COMMON_BG_COLOR} \
-disabledforeground {#000000} \
]
set ::SpecCalc::timer2_clk_error_$obj_idx "--"
@@ -1033,30 +1038,30 @@ class SpecCalc {
set ::SpecCalc::timer2_clk_fosc_$obj_idx [lindex $config {3 0}]
set ::SpecCalc::timer2_clk_freq_$obj_idx [lindex $config {3 1}]
set ::SpecCalc::timer2_clk_x2_$obj_idx [lindex $config {3 2}]
- } {
+ } else {
set ::SpecCalc::timer2_clk_fosc_$obj_idx {}
set ::SpecCalc::timer2_clk_freq_$obj_idx {}
set ::SpecCalc::timer2_clk_x2_$obj_idx {0}
}
# Create page header
- pack [label $clock_out_frame.header \
- -text [mc "Calculate clock output"] \
- -font [font create \
- -family {helvetica} \
- -size -17 \
- -weight bold \
- ] \
+ pack [label $clock_out_frame.header \
+ -text [mc "Calculate clock output"] \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
+ ] \
] -pady 5
- pack [label $clock_out_frame.math \
- -image [image create photo \
- -format png \
- -file "${::LIB_DIRNAME}/../icons/other/math0.png" \
- ] \
+ pack [label $clock_out_frame.math \
+ -image [image create photo \
+ -format png \
+ -file "${::ROOT_DIRNAME}/icons/other/math0.png" \
+ ] \
] -pady 5
pack $bottom_frame -anchor nw
$nb raise {Preset}
- pack $nb -fill both -expand 1
+ pack [$nb get_nb] -fill both -expand 1
}
## Create page for calculating SPI related values
@@ -1102,10 +1107,10 @@ class SpecCalc {
grid $widgets(spi,sck_ent00) -row 2 -column 2
grid [label $top_frame.spr1_1_lbl \
- -text "0" \
+ -text "0" \
] -row 3 -column 0
grid [label $top_frame.spr0_1_lbl \
- -text "1" \
+ -text "1" \
] -row 3 -column 1
set widgets(spi,sck_ent01) [ttk::entry $top_frame.sck_1_ent \
-width 9 \
@@ -1115,10 +1120,10 @@ class SpecCalc {
grid $widgets(spi,sck_ent01) -row 3 -column 2
grid [label $top_frame.spr1_2_lbl \
- -text "1" \
+ -text "1" \
] -row 4 -column 0
grid [label $top_frame.spr0_2_lbl \
- -text "0" \
+ -text "0" \
] -row 4 -column 1
set widgets(spi,sck_ent10) [ttk::entry $top_frame.sck_2_ent \
-width 9 \
@@ -1128,10 +1133,10 @@ class SpecCalc {
grid $widgets(spi,sck_ent10) -row 4 -column 2
grid [label $top_frame.spr1_3_lbl \
- -text "1" \
+ -text "1" \
] -row 5 -column 0
grid [label $top_frame.spr0_3_lbl \
- -text "1" \
+ -text "1" \
] -row 5 -column 1
set widgets(spi,sck_ent11) [ttk::entry $top_frame.sck_3_ent \
-width 9 \
@@ -1144,26 +1149,26 @@ class SpecCalc {
pack [label $bottom_frame.res_lbl0 \
-text [mc "Set MCU oscillator to "] \
] -side left
- set widgets(spi,result) [ \
- entry $bottom_frame.result_ent \
- -readonlybackground {#EEEEEE} \
- -disabledforeground {#000000} \
- -bg {#EEEEEE} -width 0 -bd 1 -state readonly \
- -relief flat -highlightthickness 0 \
- -textvariable ::SpecCalc::spi_result_$obj_idx \
+ set widgets(spi,result) [ \
+ entry $bottom_frame.result_ent \
+ -readonlybackground ${::COMMON_BG_COLOR} \
+ -disabledforeground {#000000} \
+ -bg ${::COMMON_BG_COLOR} -width 0 -bd 1 -state readonly \
+ -relief flat -highlightthickness 0 \
+ -textvariable ::SpecCalc::spi_result_$obj_idx \
]
pack $widgets(spi,result) -side left
pack [label $bottom_frame.res_lbl1 \
- -text [mc " kHz"] \
+ -text [mc " kHz"] \
] -side left
- pack [label $pages($page).header \
- -text [mc "Calculate oscillator frequency"] \
- -font [font create \
- -family {helvetica} \
- -size -17 \
- -weight bold \
- ] \
+ pack [label $pages($page).header \
+ -text [mc "Calculate oscillator frequency"] \
+ -font [font create \
+ -family {helvetica} \
+ -size [expr {int(-17 * $::font_size_factor)}] \
+ -weight bold \
+ ] \
] -pady 5
pack $top_frame -pady 5 -anchor nw
pack [ttk::separator $pages($page).sep \
@@ -1205,7 +1210,7 @@ class SpecCalc {
}
}
- ## Auxiliary procedure for procedure "calculate_loops"
+ ## Auxiliary function for function "calculate_loops"
# @parm float time
# @parm float rest
# @parm Bool is_spec
@@ -1239,7 +1244,7 @@ class SpecCalc {
set time [expr {$time / $div}]
if {$res($len) == 256} {
set res($len) 0
- } {
+ } else {
set res($len) $div
}
@@ -1250,7 +1255,7 @@ class SpecCalc {
incr len
if {$len > 1} {
incr res(0) -2
- } {
+ } else {
incr res(0) -1
}
set correction 0
@@ -1266,13 +1271,13 @@ class SpecCalc {
if {$i == 1} {
if {[lindex $is_spec $i]} {
set correction 1
- } {
+ } else {
set correction 2
}
- } {
+ } else {
if {[lindex $is_spec $i]} {
set correction [expr {($correction * $res($i)) + ($res($i) * 2) + 1}]
- } {
+ } else {
set correction [expr {($correction * $res($i)) + ($res($i) * 3) + 2}]
}
}
@@ -1282,10 +1287,126 @@ class SpecCalc {
return [list $rest $len [array get res]]
}
- ## Report an error occured during evaluation of the wait loop
- # @return void
- private method calculate_loops_evaluation_error {} {
- error "Please report this bug. Method ::SpecCalc::calculate_loops --> Evaluation error. Dump: \n\$widgets(loops,time_ent) == $widgets(loops,time_ent)\n\$widgets(loops,time_cb) == $widgets(loops,time_cb)\n\$widgets(loops,clock_cb) == $widgets(loops,clock_cb)\n\$widgets(loops,clock_type_cb) == $widgets(loops,clock_type_cb)\n\$widgets(loops,reg_ent0) == $widgets(loops,reg_ent0)\n\$widgets(loops,reg_ent1) == $widgets(loops,reg_ent1)\n\$widgets(loops,reg_ent2) == $widgets(loops,reg_ent2)\n\$widgets(loops,reg_ent3) == $widgets(loops,reg_ent3)\n\$widgets(loops,reg_ent4) == $widgets(loops,reg_ent4)\n\$widgets(loops,reg_ent5) == $widgets(loops,reg_ent5)\n\$widgets(loops,reg_ent6) == $widgets(loops,reg_ent6)\n\$widgets(loops,reg_ent7) == $widgets(loops,reg_ent7)"
+ private method calculate_loops_AUX2 {time clock is_spec} {
+ set time_org $time
+ set i 0
+ set result [list]
+ set lowest_rest {}
+ set last_rest {}
+ set result_c {}
+ set result_fin_i 0
+ for {set i 0} {$i < 8} {incr i} {
+ set rest $time_org
+ set time [expr {int($time)}]
+ set rest [expr {$rest - $time}]
+
+ if {!$i && $time_org < 2.0} {
+ lappend result [list [expr {$time_org * 2.0 + 1.0}] 0 [list 0 {} 1 {} 2 {} 3 {} 4 {} 5 {} 6 {} 7 {}]]
+ break
+ }
+
+ set result_c [calculate_loops_AUX $time $rest $is_spec]
+ if {$result_c == {0}} {
+ return {}
+ }
+ lappend result $result_c
+
+ if {$lowest_rest == {}} {
+ set lowest_rest [lindex $result_c 0]
+
+ } elseif {$lowest_rest < 0} {
+ if {
+ ( [lindex $result_c 0] >= 0 )
+ ||
+ ( abs($lowest_rest) > abs([lindex $result_c 0]) )
+ } then {
+ set result_fin_i $i
+ set lowest_rest [lindex $result_c 0]
+ }
+
+ } elseif {
+ ( [lindex $result_c 0] >= 0 )
+ &&
+ ( $lowest_rest > [lindex $result_c 0] )
+ } then {
+ set result_fin_i $i
+ set lowest_rest [lindex $result_c 0]
+ }
+
+ if {$last_rest == [lindex $result_c 0] || ![lindex $result_c 0]} {
+ break
+ }
+ set last_rest [lindex $result_c 0]
+ set time [expr {$time_org + ($last_rest / 2.0)}]
+ }
+
+ return [lindex $result $result_fin_i]
+ }
+
+ private method calculate_loops_AUX3 {len is_spec res_list reg_list} {
+ set e_no_of_spaces ${::Editor::number_of_spaces}
+ if {$e_no_of_spaces == 1} {
+ set e_no_of_spaces 5
+ } elseif {$e_no_of_spaces <= 4} {
+ set e_no_of_spaces 6
+ }
+
+ array set res $res_list
+ array set reg $reg_list
+ set last_branch 0
+ set branch 0
+ for {set i 0} {$i < $len} {incr i} {
+ set branch $last_branch
+ set val $res($i)
+
+ set val [string range [format {%X} $res($i)] end-1 end]
+ set val "[string repeat {0} [expr {3 - [string length $val]}]]$val"
+
+ set cmp {}
+ if {[lindex $is_spec $i]} {
+ if {!$i} {
+ if {${::Editor::spaces_no_tabs}} {
+ set cmp "\n[string repeat { } ${::Editor::number_of_spaces}]NOP"
+ } else {
+ set cmp "\n\tNOP"
+ }
+ incr branch 1
+ }
+ } else {
+ incr branch 2
+ }
+ incr branch 4
+
+ set last_branch $branch
+ if {!$i} {
+ set branch 0
+ incr last_branch -4
+ }
+
+ if {$branch == {0}} {
+ set branch {}
+ } else {
+ set branch "-$branch"
+ }
+
+ if {${::Editor::spaces_no_tabs}} {
+ set res($i) [list \
+ "[string repeat { } ${::Editor::number_of_spaces}]DJNZ[string repeat { } [expr {$e_no_of_spaces - 4}]]$reg($i), \$$branch" \
+ "[string repeat { } ${::Editor::number_of_spaces}]MOV[string repeat { } [expr {$e_no_of_spaces - 3}]]$reg($i), #${val}h$cmp" \
+ ]
+ } else {
+ set res($i) [list \
+ "\tDJNZ\t$reg($i), \$$branch" \
+ "\tMOV\t$reg($i), #${val}h$cmp" \
+ ]
+ }
+ }
+ for {set i [expr {$len - 1}]} {$i >= 0} {incr i -1} {
+ $widgets(loops,results) insert end "[lindex $res($i) 1]\n"
+ }
+ for {set i 0} {$i < $len} {incr i} {
+ $widgets(loops,results) insert end "[lindex $res($i) 0]\n"
+ }
}
## Generate wait loop acoring to specified criteria
@@ -1302,7 +1423,7 @@ class SpecCalc {
if {[lsearch -ascii -exact {R0 R1 R2 R3 R4 R5 R6 R7 A} [string toupper $reg($i)]] != -1} {
lappend is_spec 1
- } {
+ } else {
lappend is_spec 0
}
}
@@ -1329,52 +1450,28 @@ class SpecCalc {
return 0
}
+ set e_no_of_spaces ${::Editor::number_of_spaces}
+ if {$e_no_of_spaces == 1} {
+ set e_no_of_spaces 5
+ } elseif {$e_no_of_spaces <= 4} {
+ set e_no_of_spaces 6
+ }
+
set time [expr {$time * [lindex {1.0 1000.0 1000000.0 1000000000.0} [$widgets(loops,time_cb) current]] / 2.0}]
- set clock [expr {[lindex {12.0 6.0 1.0} [$widgets(loops,clock_type_cb) current]] / $clock}]
+ set clock [expr {$clock / [lindex {12000000.0 6000000.0 1000000.0} [$widgets(loops,clock_type_cb) current]]}]
set time [expr {$time * $clock}]
- set time_org $time
- set i 0
- set result [list]
- set lowes_rest $time
- set last_rest {}
- set result_c {}
- set result_fin_i 0
- for {set i 0} {$i < 8} {incr i} {
-
- set rest $time_org
- set time [expr {int($time)}]
- set rest [expr {$rest - $time}]
-
- set result_c [calculate_loops_AUX $time $rest $is_spec]
- if {$result_c == {0}} {
- return 0
- }
- lappend result $result_c
-
- if {$lowes_rest == {}} {
- set lowes_rest [lindex $result_c 0]
-
- } elseif {($lowes_rest < 0) && ([lindex $result_c 0] >= 0)} {
- set result_fin_i $i
- set lowes_rest [lindex $result_c 0]
-
- } elseif {abs($lowes_rest) > abs([lindex $result_c 0])} {
- set result_fin_i $i
- set lowes_rest [lindex $result_c 0]
- }
-
- if {$last_rest == [lindex $result_c 0] || ![lindex $result_c 0]} {
- break
- }
- set last_rest [lindex $result_c 0]
- set time [expr {$time_org + ($last_rest / 2.0)}]
+ if {$time <= 258.5} {
+ set time [expr {$time - 0.5}]
}
- set time $time_org
- set rest [lindex $result [list $result_fin_i 0]]
- set len [lindex $result [list $result_fin_i 1]]
- array set res [lindex $result [list $result_fin_i 2]]
+ set final_results [calculate_loops_AUX2 $time $clock $is_spec]
+ if {$final_results == {}} {
+ return 0
+ }
+ set rest [lindex $final_results 0]
+ set len [lindex $final_results 1]
+ array set res [lindex $final_results 2]
for {set i 0} {$i < $len} {incr i} {
set error 0
@@ -1402,87 +1499,62 @@ class SpecCalc {
}
$widgets(loops,results) insert end "\n"
- set last_branch 0
- set branch 0
- for {set i 0} {$i < $len} {incr i} {
- set branch $last_branch
- set val $res($i)
-
- set val [string range [format {%X} $res($i)] end-1 end]
- set val "[string repeat {0} [expr {3 - [string length $val]}]]$val"
-
- set cmp {}
- if {[lindex $is_spec $i]} {
- if {!$i} {
- set cmp "\n\tNOP"
- incr branch 1
- }
- } {
- incr branch 2
- }
- incr branch 4
+ calculate_loops_AUX3 $len $is_spec [array get res] [array get reg]
- set last_branch $branch
- if {!$i} {
- set branch 0
- incr last_branch -4
- }
- if {$branch == {0}} {
- set branch {}
- } {
- set branch "-$branch"
+ while {$rest > 514} {
+ set final_results [calculate_loops_AUX2 [expr {$rest / 2.0}] $clock $is_spec]
+ if {$final_results == {}} {
+ return 0
}
-
- set res($i) [list \
- "\tDJNZ\t$reg($i), \$$branch" \
- "\tMOV\t$reg($i), #${val}h$cmp" \
- ]
- }
-
- for {set i [expr {$len - 1}]} {$i >= 0} {incr i -1} {
- $widgets(loops,results) insert end "[lindex $res($i) 1]\n"
- }
-
- for {set i 0} {$i < $len} {incr i} {
- $widgets(loops,results) insert end "[lindex $res($i) 0]\n"
+ set rest [lindex $final_results 0]
+ calculate_loops_AUX3 [lindex $final_results 1] $is_spec [lindex $final_results 2] [array get reg]
}
if {$rest <= 4} {
for {set i 0} {$i < 5} {incr i} {
- if {int(ceil($rest)) > 0.5} {
- $widgets(loops,results) insert end "\tNOP\n"
+ if {int(ceil($rest)) >= 0.5} {
+ if {${::Editor::spaces_no_tabs}} {
+ $widgets(loops,results) insert end "[string repeat { } ${::Editor::number_of_spaces}]NOP\n"
+ } else {
+ $widgets(loops,results) insert end "\tNOP\n"
+ }
set rest [expr {$rest - 1}]
}
}
- } {
+ } else {
if {[lindex $is_spec 0]} {
set rest [expr {$rest - 1}]
- } {
+ } else {
set rest [expr {$rest - 2}]
}
set val [expr {int($rest / 2)}]
set rest [expr {$rest - ($val * 2.0)}]
if {$val == 256} {
set val 0
- } elseif {$val > 256} {
- status_tip [mc "Unable to evaluate"]
- calculate_loops_clear_results
- return 0
}
+
set val [string range [format {%X} $val] end-1 end]
set val "[string repeat {0} [expr {3 - [string length $val]}]]$val"
- $widgets(loops,results) insert end "\tMOV\t$reg(0), #${val}h\n"
- $widgets(loops,results) insert end "\tDJNZ\t$reg(0), \$\n"
- if {int(ceil($rest)) > 0.5} {
- $widgets(loops,results) insert end "\tNOP\n"
- set rest [expr {$rest - 1}]
+ if {${::Editor::spaces_no_tabs}} {
+ $widgets(loops,results) insert end "[string repeat { } ${::Editor::number_of_spaces}]MOV[string repeat { } [expr {$e_no_of_spaces - 3}]]$reg(0), #${val}h\n"
+ $widgets(loops,results) insert end "[string repeat { } ${::Editor::number_of_spaces}]DJNZ[string repeat { } [expr {$e_no_of_spaces - 4}]]$reg(0), \$\n"
+ if {int(ceil($rest)) >= 0.5} {
+ $widgets(loops,results) insert end "[string repeat { } ${::Editor::number_of_spaces}]NOP\n"
+ set rest [expr {$rest - 1}]
+ }
+ } else {
+ $widgets(loops,results) insert end "\tMOV\t$reg(0), #${val}h\n"
+ $widgets(loops,results) insert end "\tDJNZ\t$reg(0), \$\n"
+ if {int(ceil($rest)) >= 0.5} {
+ $widgets(loops,results) insert end "\tNOP\n"
+ set rest [expr {$rest - 1}]
+ }
}
}
set rest [expr {$rest * 1.0 / $clock}]
$widgets(loops,results) insert end [mc "; Rest: %s\n" [adjust_rest $rest]]
-
$widgets(loops,results) insert end [mc "; END: Wait loop"]
set end [expr {int([$widgets(loops,results) index end])}]
@@ -1510,7 +1582,7 @@ class SpecCalc {
private method calculate_loops_enable_copy {enable} {
if {$enable} {
set enable {normal}
- } {
+ } else {
set enable {disabled}
}
$widgets(loops,copy_but) configure -state $enable
@@ -1521,13 +1593,11 @@ class SpecCalc {
public method calculate_timer01 {} {
set time [$widgets(timer01,time_ent) get]
if {$time == {} || $time == 0} {
- status_tip [mc "Invalid time"]
return 0
}
set clock [$widgets(timer01,clock_cb) get]
if {$clock == {} || $clock == 0} {
- status_tip [mc "Invalid clock rate"]
return 0
}
status_tip ""
@@ -1544,11 +1614,11 @@ class SpecCalc {
}
set time [expr {$time * [lindex {1.0 1000.0 1000000.0 1000000000.0} [$widgets(timer01,time_cb) current]]}]
- set clock [expr {[lindex {12.0 6.0 1.0} [$widgets(timer01,clock_type_cb) current]] / $clock}]
+ set clock [expr {$clock / [lindex {12000000.0 6000000.0 1000000.0} [$widgets(timer01,clock_type_cb) current]]}]
set time [expr {$time * $clock}]
set time_int [expr {int($time)}]
- set enhanced [subst "\$::SpecCalc::spec_chb_$obj_idx"]
+ set enhanced [subst -nocommands "\$::SpecCalc::spec_chb_$obj_idx"]
set prescaler [$widgets(timer01,psc_cb) current]
# Set default results
@@ -1561,7 +1631,7 @@ class SpecCalc {
{0} { ;# 9 -> 16 bit counter
if {$enhanced} {
set bits [expr {$prescaler + 9}]
- } {
+ } else {
set bits 13
}
set capacity [expr {1 << $bits}]
@@ -1574,7 +1644,7 @@ class SpecCalc {
if {[expr {!($time_int & $full_mask)}]} {
incr repeats -1
set stepsPerIter $full_mask
- } {
+ } else {
set stepsPerIter [expr {$time_int / $repeats}]
set tmp [expr {$capacity - $stepsPerIter}]
set low [expr {$tmp & $low_mask}]
@@ -1592,7 +1662,6 @@ class SpecCalc {
set rest [adjust_rest $rest]
if {$repeats > 1} {
- status_tip [mc "Value is too high"]
return 0
}
@@ -1619,7 +1688,7 @@ class SpecCalc {
incr repeats -1
set stepsPerIter 0xFFFF
set tmp 0
- } {
+ } else {
set stepsPerIter [expr {$time_int / $repeats}]
set tmp [expr {0x10000 - $stepsPerIter}]
set low [expr {$tmp & 0xFF}]
@@ -1637,7 +1706,7 @@ class SpecCalc {
if {$tmp < 0} {
set rest [expr {abs($tmp)}]
set tmp 0
- } {
+ } else {
set rest 0
}
set tmp [expr {$tmp & 0x0FFFF}]
@@ -1666,7 +1735,7 @@ class SpecCalc {
foreach w {rh rl tl th rest repeats} {
$widgets(timer01,$w) configure -fg {#000000}
}
- } {
+ } else {
if {$repeats > 1} {
status_tip [mc "Value is too high"]
return 0
@@ -1688,7 +1757,7 @@ class SpecCalc {
if {[expr {!($time_int & 0xFF)}]} {
incr repeats -1
set stepsPerIter 0xFF
- } {
+ } else {
set stepsPerIter [expr {$time_int / $repeats}]
set low [expr {0x100 - $stepsPerIter}]
set high $low
@@ -1705,7 +1774,7 @@ class SpecCalc {
if {$low < 0} {
set rest [expr {abs($low)}]
set low 0
- } {
+ } else {
set rest 0
}
@@ -1736,13 +1805,11 @@ class SpecCalc {
public method calculate_timer2 {} {
set time [$widgets(timer2,time_ent) get]
if {$time == {} || $time == 0} {
- status_tip [mc "Invalid time"]
return 0
}
set clock [$widgets(timer2,clock_cb) get]
if {$clock == {} || $clock == 0} {
- status_tip [mc "Invalid clock rate"]
return 0
}
status_tip ""
@@ -1759,7 +1826,7 @@ class SpecCalc {
}
set time [expr {$time * [lindex {1.0 1000.0 1000000.0 1000000000.0} [$widgets(timer2,time_cb) current]]}]
- set clock [expr {[lindex {12.0 6.0 1.0} [$widgets(timer2,clock_type_cb) current]] / $clock}]
+ set clock [expr {$clock / [lindex {12000000.0 6000000.0 1000000.0} [$widgets(timer2,clock_type_cb) current]]}]
set time [expr {$time * $clock}]
set time_int [expr {int($time)}]
set mode [$widgets(timer2,mode_cb) current]
@@ -1781,13 +1848,13 @@ class SpecCalc {
set low_p $low
set high_p $high
- } {
+ } else {
# Calculate tempotary results
if {[expr {!($time_int & 0xFFFF)}]} {
incr repeats -1
set stepsPerIter 0xFFFF
set tmp 0
- } {
+ } else {
set stepsPerIter [expr {$time_int / $repeats}]
set tmp [expr {0x10000 - $stepsPerIter}]
set rest [expr {$time_int - ((0x10000 - $tmp) * $repeats)}]
@@ -1805,7 +1872,7 @@ class SpecCalc {
if {$tmp < 0} {
set rest [expr {abs($tmp)}]
set tmp 0
- } {
+ } else {
set rest 0
}
set tmp [expr {$tmp & 0x0FFFF}]
@@ -1911,9 +1978,9 @@ class SpecCalc {
## Perform calculation intented for page "Timer 2 clock output"
# @return void
public method calculate_timer2_clk {} {
- set o [subst "\$::SpecCalc::timer2_clk_fosc_$obj_idx"]
- set f [subst "\$::SpecCalc::timer2_clk_freq_$obj_idx"]
- set x [subst "\$::SpecCalc::timer2_clk_x2_$obj_idx"]
+ set o [subst -nocommands "\$::SpecCalc::timer2_clk_fosc_$obj_idx"]
+ set f [subst -nocommands "\$::SpecCalc::timer2_clk_freq_$obj_idx"]
+ set x [subst -nocommands "\$::SpecCalc::timer2_clk_x2_$obj_idx"]
if {
![string length $o] || ![string length $f] || ![string length $x] ||
$f == 0 || $o == 0
@@ -1950,7 +2017,7 @@ class SpecCalc {
# @parm
# @return void
private method calculate_spi {type value} {
- set const [subst "\$::SpecCalc::double_chb_$obj_idx"]
+ set const [subst -nocommands "\$::SpecCalc::double_chb_$obj_idx"]
switch -- $type {
{sck_ent00} {
@@ -2085,14 +2152,10 @@ class SpecCalc {
return 1
}
{compute_but} {
- if {[catch {
- if {[calculate_loops]} {
- calculate_loops_enable_copy 1
- } {
- calculate_loops_enable_copy 0
- }
- }]} {
- calculate_loops_evaluation_error
+ if {[calculate_loops]} {
+ calculate_loops_enable_copy 1
+ } else {
+ calculate_loops_enable_copy 0
}
}
{copy_but} {
@@ -2160,7 +2223,7 @@ class SpecCalc {
grid $widgets(timer01,rl) -row 4 -column 3 -sticky w
grid $widgets(timer01,eq3) -row 3 -column 2
grid $widgets(timer01,eq4) -row 4 -column 2
- } {
+ } else {
grid forget $widgets(timer01,psc_lbl)
grid forget $widgets(timer01,psc_cb)
grid forget $widgets(timer01,rh_l)
@@ -2327,25 +2390,25 @@ class SpecCalc {
switch -- [$widgets(timer01,mode_cb) current] {
0 {
set title [mc "Timer 0/1 in mode 0"]
- if {[subst "\${::SpecCalc::spec_chb_$obj_idx}"]} {
+ if {[subst -nocommands "\${::SpecCalc::spec_chb_$obj_idx}"]} {
set image {timer_01_0e}
- } {
+ } else {
set image {timer_01_0}
}
}
1 {
set title [mc "Timer 0/1 in mode 1"]
- if {[subst "\${::SpecCalc::spec_chb_$obj_idx}"]} {
+ if {[subst -nocommands "\${::SpecCalc::spec_chb_$obj_idx}"]} {
set image {timer_01_1e}
- } {
+ } else {
set image {timer_01_1}
}
}
2 {
set title [mc "Timer 0/1 in mode 2"]
- if {[subst "\${::SpecCalc::spec_chb_$obj_idx}"]} {
+ if {[subst -nocommands "\${::SpecCalc::spec_chb_$obj_idx}"]} {
set image {timer_01_2e}
- } {
+ } else {
set image {timer_01_2}
}
}
@@ -2376,9 +2439,9 @@ class SpecCalc {
}
}
- set dlg [toplevel .spec_calc_diagram_$diagram_counter -class [mc "Diagram or formula"] -bg {#EEEEEE}]
+ set dlg [toplevel .spec_calc_diagram_$diagram_counter -class [mc "Diagram or formula"] -bg ${::COMMON_BG_COLOR}]
pack [label $dlg.image \
- -image [image create photo -format png -file "${::LIB_DIRNAME}/../icons/other/$image.png"]
+ -image [image create photo -format png -file "${::ROOT_DIRNAME}/icons/other/$image.png"]
] -fill both
wm title $dlg $title
@@ -2388,3 +2451,7 @@ class SpecCalc {
incr diagram_counter
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/utilities/symbol_viewer.tcl b/lib/utilities/symbol_viewer.tcl
index 3df57b4..c46b8ac 100755..100644
--- a/lib/utilities/symbol_viewer.tcl
+++ b/lib/utilities/symbol_viewer.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 _SYMBOL_VIEWER_TCL ] } {
+set _SYMBOL_VIEWER_TCL _
+# <<< File inclusion guard
+
# --------------------------------------------------------------------------
# DESCRIPTION
# Implements assembly language symbols viewer (from code listing)
@@ -31,17 +36,21 @@ class SymbolViewer {
# Int: Counter of object intances
common count 0
# Font: Just normal font used in the table
- common normal_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -15 \
- -weight normal \
+ common normal_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight normal \
]
# Font: Bold font (the same size as $normal_font)
- common bold_font [font create \
- -family $::DEFAULT_FIXED_FONT \
- -size -15 \
- -weight bold \
+ common bold_font [font create \
+ -family $::DEFAULT_FIXED_FONT \
+ -size [expr {int(-14 * $::font_size_factor)}] \
+ -weight bold \
]
+ if {$::MICROSOFT_WINDOWS} {
+ # it's better to do not use bold font for this purpose on MS Windows®
+ set bold_font $normal_font
+ }
# Dialog configuration
common config_list $::CONFIG(SYMBOL_VIEWER_CONFIG)
@@ -62,7 +71,7 @@ class SymbolViewer {
constructor {} {
# Create dialog window
- set win [toplevel .symbolviewer$count -class {Defined symbols} -bg {#EEEEEE}]
+ set win [toplevel .symbolviewer$count -class {Defined symbols} -bg ${::COMMON_BG_COLOR}]
set obj_idx $count
incr count
@@ -93,16 +102,19 @@ class SymbolViewer {
# Configure dialog window
wm iconphoto $win ::ICONS::16::symbol
wm title $win [mc "Assembly symbol table - MCU 8051 IDE"]
- wm minsize $win 620 350
+ wm minsize $win 520 350
wm protocol $win WM_DELETE_WINDOW "$this close_window"
+ update
catch {
- wm geometry $win [lindex $config_list $i]
+ wm geometry $win [regsub {^\=?\d+x\d+} [lindex $config_list $i] \
+ [regsub {\+\d+\+\d+$} [wm geometry $win] {}] \
+ ]
}
# Set ...
incr i
set ::SymbolViewer::display_${obj_idx}(Special) [lindex $config_list $i]
- if {[subst "\$::SymbolViewer::display_${obj_idx}(Special)"] == {}} {
+ if {[subst -nocommands "\$::SymbolViewer::display_${obj_idx}(Special)"] == {}} {
set ::SymbolViewer::display_${obj_idx}(Special) 1
}
}
@@ -114,16 +126,16 @@ class SymbolViewer {
}
set i 0
foreach name {DATA IDATA XDATA CODE BIT Number used unused} {
- lset config_list $i [subst "\$::SymbolViewer::display_${obj_idx}($name)"]
+ lset config_list $i [subst -nocommands "\$::SymbolViewer::display_${obj_idx}($name)"]
incr i
}
- lset config_list $i [subst "\$::SymbolViewer::sort_by_${obj_idx}"]
+ lset config_list $i [subst -nocommands "\$::SymbolViewer::sort_by_${obj_idx}"]
incr i
- lset config_list $i [subst "\$::SymbolViewer::sort_by_order_${obj_idx}"]
+ lset config_list $i [subst -nocommands "\$::SymbolViewer::sort_by_order_${obj_idx}"]
incr i
lset config_list $i [wm geometry $win]
incr i
- lset config_list $i [subst "\$::SymbolViewer::display_${obj_idx}(Special)"]
+ lset config_list $i [subst -nocommands "\$::SymbolViewer::display_${obj_idx}(Special)"]
# Clean up
unset ::SymbolViewer::sort_by_${obj_idx}
@@ -182,7 +194,7 @@ class SymbolViewer {
$text_widget tag configure used_YES -foreground {#00DD00}
$text_widget tag configure used_NO -foreground {#DD0000}
$text_widget tag configure tag_sel -background {#DDDDDD} -font $bold_font
- $text_widget tag configure nth_row -background {#EEEEEE}
+ $text_widget tag configure nth_row -background ${::COMMON_BG_COLOR}
$text_widget tag raise tag_sel nth_row
}
@@ -383,10 +395,10 @@ class SymbolViewer {
if {$opened_file == {}} {
if {${::X::project_menu_locked}} {
set directory {~}
- } {
+ } else {
set directory [${::X::actualProject} cget -projectPath]
}
- } {
+ } else {
set directory [file dirname $opened_file]
}
@@ -394,10 +406,10 @@ class SymbolViewer {
KIFSD::FSD ::fsd \
-title [mc "Load symbol table - MCU 8051 IDE"] \
-directory $directory -master $win \
- -defaultmask 0 -multiple 0 -filetypes {
- {{Code listing} {*.lst} }
- {{All files} {*} }
- }
+ -defaultmask 0 -multiple 0 -filetypes [list \
+ [list [mc "Code listing"] {*.lst} ] \
+ [list [mc "All files"] {*} ] \
+ ]
# Open the selected after press of OK button
::fsd setokcmd "
@@ -420,7 +432,7 @@ class SymbolViewer {
public method open_file {ignore_errors filename} {
if {[catch {
set file [open $filename r]
- }]} {
+ }]} then {
if {!$ignore_errors} {
tk_messageBox \
-parent $win \
@@ -472,7 +484,7 @@ class SymbolViewer {
set type [lindex $line 0]
if {$type == {S}} {
set addr [lindex $line end]
- } {
+ } else {
set addr [string replace [lindex $line 2] end end]
}
@@ -516,7 +528,7 @@ class SymbolViewer {
if {$type == {S} || $type == {R}} {
lappend symbol_table_data [list $name $type $addr {0} $used]
- } {
+ } else {
lappend symbol_table_data [list $name $type $addr [expr "0x$addr"] $used]
}
}
@@ -528,18 +540,18 @@ class SymbolViewer {
refresh
}
- ## Sort list of loaded symbols acording to user settings
+ ## Sort list of loaded symbols according to user settings
# @return void
private method sort_table {} {
- if {[subst "\$::SymbolViewer::sort_by_order_${obj_idx}"]} {
+ if {[subst -nocommands "\$::SymbolViewer::sort_by_order_${obj_idx}"]} {
set order {-decreasing}
- } {
+ } else {
set order {-increasing}
}
- set index [subst "\$::SymbolViewer::sort_by_${obj_idx}"]
+ set index [subst -nocommands "\$::SymbolViewer::sort_by_${obj_idx}"]
if {$index == 3} {
set type {-integer}
- } {
+ } else {
set type {-dictionary}
}
@@ -562,21 +574,21 @@ class SymbolViewer {
{S} {set type {Special}}
{R} {set type {Special}}
}
- if {![subst "\$::SymbolViewer::display_${obj_idx}($type)"]} {
+ if {![subst -nocommands "\$::SymbolViewer::display_${obj_idx}($type)"]} {
return 0
}
# Adjust flag USED
if {$used} {
- if {![subst "\$::SymbolViewer::display_${obj_idx}(used)"]} {
+ if {![subst -nocommands "\$::SymbolViewer::display_${obj_idx}(used)"]} {
return 0
}
- set used {YES}
- } {
- if {![subst "\$::SymbolViewer::display_${obj_idx}(unused)"]} {
+ set used [mc "YES"]
+ } else {
+ if {![subst -nocommands "\$::SymbolViewer::display_${obj_idx}(unused)"]} {
return 0
}
- set used {NO}
+ set used [mc "NO"]
}
return [list $type $used]
@@ -602,7 +614,7 @@ class SymbolViewer {
lset current_line 1 [string index [lindex $current_line 1] 0]
if {[lindex $current_line 4] == {YES}} {
lset current_line 4 1
- } {
+ } else {
lset current_line 4 0
}
}
@@ -646,7 +658,7 @@ class SymbolViewer {
if {$type == {Special}} {
$text_widget insert insert $hexv
$text_widget insert insert [string repeat { } [expr {16 - [string length $hexv]}]]
- } {
+ } else {
$text_widget insert insert $hexv
$text_widget insert insert { }
$text_widget insert insert $decv
@@ -673,7 +685,7 @@ class SymbolViewer {
if {$cur_found} {
$text_widget tag add tag_sel $current_line.0 $current_line.0+1l
$text_widget see $current_line.0
- } {
+ } else {
set current_line {}
}
@@ -706,7 +718,7 @@ class SymbolViewer {
set string [string tolower [string trimleft $string 0]]
$clear_but configure -state normal
# Empty string -> abort
- } {
+ } else {
$search_entry configure -style TEntry
$clear_but configure -state disabled
return 1
@@ -749,7 +761,7 @@ class SymbolViewer {
if {$found_idx == -1} {
$search_entry configure -style StringNotFound.TEntry
# String found
- } {
+ } else {
set current_line [expr {$found_idx + 1}]
$text_widget tag add tag_sel $current_line.0 $current_line.0+1l
$text_widget see $current_line.0
@@ -795,7 +807,7 @@ class SymbolViewer {
select_line $x $y
if {$current_line == {}} {
set state disabled
- } {
+ } else {
set state normal
}
foreach entry {{Copy symbol name} {Copy hex value} {Copy dec value} {Copy line}} {
@@ -835,3 +847,7 @@ class SymbolViewer {
clipboard append [string trim [$text_widget get $current_line.$s $current_line.$e]]
}
}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/lib/utilities/table_of_instructions.tcl b/lib/utilities/table_of_instructions.tcl
new file mode 100644
index 0000000..b6587b2
--- /dev/null
+++ b/lib/utilities/table_of_instructions.tcl
@@ -0,0 +1,692 @@
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# Copyright (C) 2011 by Martin Ošmera #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _TABLE_OF_INSTRUCTIONS_TCL ] } {
+set _TABLE_OF_INSTRUCTIONS_TCL _
+# <<< File inclusion guard
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+# 8051 Instruction Table
+# --------------------------------------------------------------------------
+
+class TableOfInstructions {
+ common tbl_of_inst_count 0 ;# Int: Counter of object instances
+ common oprs_color {#00DD00} ;# RGB Color: Number of operands
+ common len_color {#00AA55} ;# RGB Color: Instruction length
+ common time_color {#8800DD} ;# RGB Color: Time to execute
+ common ins_color {#0000DD} ;# RGB Color: Instruction mnemonics
+
+ # Font for instruction name
+ common instruction_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ ]
+ # Font for numbers below the instruction name
+ common number_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-10 * $::font_size_factor)}] \
+ -weight {bold} \
+ ]
+ # Font for labels in details frame (normal)
+ common details_n_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ ]
+ # Font for labels in details frame (bold)
+ common details_b_font [font create \
+ -family {helvetica} \
+ -size [expr {int(-12 * $::font_size_factor)}] \
+ -weight {bold} \
+ ]
+
+ private variable win ;# Widget: Dialog window
+ private variable window_visible 0 ;# Bool: Visibility flag
+ private variable cells ;# Array of Widget: Chart cell frames
+ private variable vh_cells ;# Array of Widget: Vertical headers
+ private variable hh_cells ;# Array of Widget: Horizontal headers
+ private variable selected_cell -1 ;# Int: Currently selected cell
+ private variable status_bar_lbl ;# Widget: Status bar
+ private variable validation_ena 1 ;# Bool: EntryBox validation enabled
+ private variable matrix_frame ;# Widget: Frame for the chart
+ private variable vertical_scrollbar ;# Widget: Scrollbar for the scrollable frame
+ private variable scrollable_frame ;# Widget: Scrollable frame containing the chart
+
+ private variable opcode_ent ;# Widget: Entry box with the OP code
+ private variable title_v_lbl ;# Widget: Label containing instruction name along with its operands
+ private variable class_v_lbl ;# Widget: Label containing the class
+ private variable desc_v_lbl ;# Widget: Label containing the description
+ private variable length_v_lbl ;# Widget: Label containing the length
+ private variable time_v_lbl ;# Widget: Label containing the time
+ private variable flags_v_lbl ;# Widget: Label containing the flags
+ private variable note_v_lbl ;# Widget: Label containing the note
+
+ constructor {} {
+ # Configure local ttk styles
+ ttk::style configure TblOfIns_RedBg.TEntry -fieldbackground {#FFDDDD}
+ ttk::style configure TblOfIns_GreenBg.TEntry -fieldbackground {#DDFFDD}
+
+ # Create dialog window
+ set window_visible 1
+ set win [toplevel .tableofinstructions${tbl_of_inst_count} -class {8051 Instruction Table} -bg ${::COMMON_BG_COLOR}]
+ incr tbl_of_inst_count
+
+ # Create dialog GUI
+ create_gui
+
+ # Set window event bindings
+ bind $win <Control-Key-q> "$this close_window; break"
+ bindtags $win [list $win Toplevel all .]
+
+ # Set window parameters
+ wm iconphoto $win ::ICONS::16::fsview
+ wm title $win "[mc {8051 Instruction Table}] - MCU 8051 IDE"
+ wm resizable $win 0 1
+ wm protocol $win WM_DELETE_WINDOW "$this close_window"
+ update
+
+ # Compute required width of the window
+ set w [winfo width $matrix_frame.hh_lbl1]
+ incr w [winfo width $vertical_scrollbar]
+ for {set i 0} {$i < 16} {incr i} {
+ incr w [winfo width $matrix_frame.cell_$i]
+ incr w
+ }
+ wm minsize $win $w 400
+ }
+
+ destructor {
+ destroy $win
+ }
+
+ ## Determinate wheather the window is visble or not
+ # @return Bool - Visibility flag
+ public method is_visible {} {
+ return $window_visible
+ }
+
+ ## Raise dialog window (insure than it is visible)
+ # @return void
+ public method raise_window {} {
+ if {!$window_visible} {return}
+ raise $win .
+ }
+
+ ## Restore dialog window
+ # @return void
+ public method restore_window {} {
+ set window_visible 1
+ wm deiconify $win
+ raise $win .
+ }
+
+ ## Close dialog window, but keep object
+ # @return void
+ public method close_window {} {
+ set window_visible 0
+ wm withdraw $win
+ }
+
+ ## Create window GUI
+ # @return void
+ private method create_gui {} {
+ ## Create bottom frame
+ set bottom_frame [frame $win.bottom_frame]
+ set status_bar_lbl [label $bottom_frame.status_bar_lbl -justify left -anchor w]
+ pack $status_bar_lbl -side left -fill x -in $bottom_frame -padx 5
+ pack [ttk::button $bottom_frame.close_but \
+ -text [mc "Exit"] \
+ -command "$this close_window" \
+ -compound left \
+ -image ::ICONS::16::exit \
+ ] -side right -padx 5 -pady 5
+
+ ## Create main frame
+ set main_frame [frame $win.main_frame -bg ${::COMMON_BG_COLOR}]
+ set scrollable_frame [ScrollableFrame $main_frame.scrollable_frame \
+ -bg ${::COMMON_BG_COLOR} \
+ -yscrollcommand "$main_frame.vertical_scrollbar set" \
+ ]
+ set matrix_frame [$scrollable_frame getframe]
+ bind $matrix_frame <Button-5> "$scrollable_frame yview scroll +1 units; break"
+ bind $matrix_frame <Button-4> "$scrollable_frame yview scroll -1 units; break"
+ set vertical_scrollbar [ttk::scrollbar $main_frame.vertical_scrollbar \
+ -orient vertical -command "$main_frame.scrollable_frame yview" \
+ ]
+ # Create vertical header
+ set header [list {} \
+ {0x0_} {0x1_} {0x2_} {0x3_} \
+ {0x4_} {0x5_} {0x6_} {0x7_} \
+ {0x8_} {0x9_} {0xA_} {0xB_} \
+ {0xC_} {0xD_} {0xE_} {0xF_} \
+ ]
+ grid [frame $matrix_frame.top_right_lbl -bg ${::COMMON_BG_COLOR}] -sticky wens -row 0 -column 0
+ for {set y 1} {$y < 17} {incr y} {
+ grid [label $matrix_frame.vh_lbl$y -text [lindex $header $y] -bg {#FFFFFF}] \
+ -row $y -column 0 -pady [expr {$y % 2}] -sticky wens
+ set vh_cells([expr {$y - 1}]) $matrix_frame.vh_lbl$y
+ }
+ # Create horizontal header
+ set header [list {} \
+ {0x_0} {0x_1} {0x_2} {0x_3} \
+ {0x_4} {0x_5} {0x_6} {0x_7} \
+ {0x_8} {0x_9} {0x_A} {0x_B} \
+ {0x_C} {0x_D} {0x_E} {0x_F} \
+ ]
+ for {set x 1} {$x < 17} {incr x} {
+ grid [label $matrix_frame.hh_lbl$x -text [lindex $header $x] -bg {#FFFFFF}] \
+ -row 0 -column $x -padx [expr {$x % 2}] -sticky wens
+ set hh_cells([expr {$x - 1}]) $matrix_frame.hh_lbl$x
+ }
+ # Create instruction table
+ set address -1
+ for {set y 1} {$y < 17} {incr y} {
+ for {set x 1} {$x < 17} {incr x} {
+ incr address
+
+ # Create cell frame
+ set frame [frame $matrix_frame.cell_$address \
+ -bg white -bd 0 \
+ ]
+
+ # Get instruction OP code in 2-digits uppercase hexadecimal form
+ set opcode [convert_to_opcode $address]
+
+ # Handle undefined OP codes (0xA5)
+ if {[lsearch -ascii -exact ${::CompilerConsts::defined_OPCODE} $opcode] == -1} {
+ destroy $frame
+ continue
+ }
+
+ # Get some information about the instruction
+ set def $::CompilerConsts::Opcode($opcode)
+ set instruction [string toupper [lindex $def 0]]
+ set operands [llength [lindex $def 1]]
+ set length [lindex $def 2]
+ set time [lindex $def 4]
+
+ # Create label containing instruction name
+ pack [label $frame.ins_lbl \
+ -text $instruction \
+ -fg $ins_color \
+ -bg white \
+ -pady 0 \
+ -font $instruction_font \
+ ]
+
+ # Create label widgets for numbers belowe instruction name
+ set f [frame $frame.f]
+ foreach val [list $operands $length $time ] \
+ wdg [list oprs_lbl len_lbl time_lbl ] \
+ fg [list $oprs_color $len_color $time_color ] \
+ {
+ pack [label $frame.$wdg \
+ -text $val \
+ -fg $fg \
+ -bg white \
+ -pady 0 \
+ -font $number_font \
+ ] -side left
+ }
+ pack $f
+
+ grid $frame -row $y -column $x -padx [expr {$x % 2}] -pady [expr {$y % 2}] -sticky wens
+ set cells($address) $frame
+ foreach wdg [list $frame $frame.f $frame.ins_lbl $frame.oprs_lbl $frame.len_lbl $frame.time_lbl] {
+ bind $wdg <Enter> "$this cell_enter $address"
+ bind $wdg <Leave> "$this cell_leave $address"
+ bind $wdg <Button-1> "$this cell_click $address; focus $frame"
+
+ bind $wdg <Button-5> "$scrollable_frame yview scroll +1 units; break"
+ bind $wdg <Button-4> "$scrollable_frame yview scroll -1 units; break"
+ }
+
+ if {$address < 255} {
+ bind $frame <Key-Right> [list $this cell_click [expr {$address + 1}]]
+ }
+ if {$address > 0} {
+ bind $frame <Key-Left> [list $this cell_click [expr {$address - 1}]]
+ }
+ if {$address > 16} {
+ bind $frame <Key-Up> [list $this cell_click [expr {$address - 16}]]
+ }
+ if {$address < 240} {
+ bind $frame <Key-Down> [list $this cell_click [expr {$address + 16}]]
+ }
+ }
+ }
+ # Ensure than all cells have the same width and heigh
+ for {set i 0} {$i < 17} {incr i} {
+ grid columnconfigure $matrix_frame $i -uniform toi
+ }
+ for {set i 1} {$i < 17} {incr i} {
+ grid rowconfigure $matrix_frame $i -uniform toi
+ }
+
+ # Create middle frame (contains details and legend)
+ set middle_frame [frame $win.middle_frame]
+
+ ## Create legend
+ set legend_frame [frame $middle_frame.legend_frame]
+ grid [label $legend_frame.l_h \
+ -font $instruction_font \
+ -text "Legend:" \
+ ] -column 0 -row 0 -columnspan 2 -sticky w
+ # Instruction mnemonics
+ grid [label $legend_frame.l03 \
+ -fg $ins_color \
+ -bg $ins_color \
+ -text {X} \
+ -font $number_font \
+ ] -column 0 -row 1 -sticky w -padx 2
+ grid [label $legend_frame.l13 \
+ -text [mc "Mnemonics"] \
+ -font $number_font \
+ ] -column 1 -row 1 -sticky w
+ # Number of operands
+ grid [label $legend_frame.l00 \
+ -fg $oprs_color \
+ -bg $oprs_color \
+ -text {X} \
+ -font $number_font \
+ ] -column 0 -row 2 -sticky w -padx 2
+ grid [label $legend_frame.l10 \
+ -text [mc "Operands"] \
+ -font $number_font \
+ ] -column 1 -row 2 -sticky w
+ # Length
+ grid [label $legend_frame.l01 \
+ -fg $len_color \
+ -bg $len_color \
+ -text {X} \
+ -font $number_font \
+ ] -column 0 -row 3 -sticky w -padx 2
+ grid [label $legend_frame.l11 \
+ -text [mc "Length"] \
+ -font $number_font \
+ ] -column 1 -row 3 -sticky w
+ # Time
+ grid [label $legend_frame.l02 \
+ -fg $time_color \
+ -bg $time_color \
+ -text {X} \
+ -font $number_font \
+ ] -column 0 -row 4 -sticky w -padx 2
+ grid [label $legend_frame.l12 \
+ -text [mc "Time"] \
+ -font $number_font \
+ ] -column 1 -row 4 -sticky w
+
+ ## Create details frame
+ # Create labelframe
+ set details_frame_header_frm [frame $win.details_frame_header_frm]
+ pack [label $details_frame_header_frm.lbl \
+ -text [mc "OP code (hex): "] \
+ -font $details_n_font \
+ ] -side left
+ set opcode_ent [ttk::entry $details_frame_header_frm.ent \
+ -validatecommand "$this opcode_validator %P" \
+ -width 4 \
+ -validate key \
+ ]
+ pack $opcode_ent -side left
+ set title_v_lbl [label $details_frame_header_frm.title_v_lbl \
+ -fg $ins_color \
+ -font $details_b_font \
+ ]
+ pack $title_v_lbl -side left -padx 15
+ set details_frame [ttk::labelframe $middle_frame.details_frame \
+ -labelwidget $details_frame_header_frm \
+ -padding 5 \
+ ]
+ # Labels: Class & Description
+ grid [label $details_frame.class_l_lbl \
+ -text [mc "Class: "] \
+ -font $details_b_font \
+ ] -row 0 -column 0 -sticky w
+ set class_v_lbl [label $details_frame.class_v_lbl -font $details_n_font]
+ grid $class_v_lbl -row 0 -column 1 -sticky w
+ grid [label $details_frame.desc_l_lbl \
+ -text [mc "Description: "] \
+ -font $details_b_font \
+ ] -row 1 -column 0 -sticky w
+ set desc_v_lbl [label $details_frame.desc_v_lbl -font $details_n_font]
+ grid $desc_v_lbl -row 1 -column 1 -sticky w
+ # Labels: Length & Time
+ grid [label $details_frame.length_l_lbl \
+ -text [mc "Length: "] \
+ -font $details_b_font \
+ ] -row 0 -column 2 -sticky w
+ set length_v_lbl [label $details_frame.length_v_lbl -font $details_n_font]
+ grid $length_v_lbl -row 0 -column 3 -sticky w
+ grid [label $details_frame.time_l_lbl \
+ -text [mc "Time: "] \
+ -font $details_b_font \
+ ] -row 1 -column 2 -sticky w
+ set time_v_lbl [label $details_frame.time_v_lbl -font $details_n_font]
+ grid $time_v_lbl -row 1 -column 3 -sticky w
+ # Label: Note & Flags
+ grid [label $details_frame.note_l_lbl \
+ -text [mc "Note: "] \
+ -font $details_b_font \
+ ] -row 2 -column 0 -sticky w
+ set note_v_lbl [label $details_frame.note_v_lbl -font $details_n_font]
+ grid $note_v_lbl -row 2 -column 1 -sticky w
+ grid [label $details_frame.flags_l_lbl \
+ -text [mc "Flags: "] \
+ -font $details_b_font \
+ ] -row 2 -column 2 -sticky w
+ set flags_v_lbl [label $details_frame.flags_v_lbl -font $number_font -fg {#DD0000}]
+ grid $flags_v_lbl -row 2 -column 3 -sticky w
+ # Configure details frame
+ grid columnconfigure $details_frame 1 -weight 1
+ grid columnconfigure $details_frame 3 -minsize [expr {int(55 * $::font_size_factor)}]
+
+ # Finalize ...
+ pack $scrollable_frame -side left -fill both -expand 1
+ pack $vertical_scrollbar -side right -fill y
+ pack $main_frame -pady 5 -side top -fill both -expand 1
+ pack $details_frame -padx 5 -fill x -side left -expand 1
+ pack $legend_frame -padx 5 -side right -anchor nw
+ pack $middle_frame -fill x
+ pack $bottom_frame -fill x
+ }
+
+ ## Validator for entrybox "OP code"
+ # @parm String string - New entrybox contents
+ # @return Bool - Always 1
+ public method opcode_validator {string} {
+ if {!$validation_ena} {return 1}
+
+ # Handle an empty string
+ if {![string length $string]} {
+ $opcode_ent configure -style TEntry
+ return 1
+ }
+
+ # Check for maximum allowable length
+ if {[string length $string] > 2} {
+ return 0
+ }
+
+ # Normalize the length
+ if {[string length $string] == 1} {
+ set string "0$string"
+ }
+
+ # Check whether the given value is really a hexadecimal number
+ if {![string is xdigit -strict $string]} {
+ $opcode_ent configure -style TblOfIns_RedBg.TEntry
+ return 1
+ }
+
+ # Convert the string to upper case letters and to integer
+ set string [string toupper $string]
+ set address [expr "0x$string"]
+
+ # Check for existence of the given OP code
+ if {[lsearch -ascii -exact ${::CompilerConsts::defined_OPCODE} $string] == -1} {
+ $opcode_ent configure -style TblOfIns_RedBg.TEntry
+ tk_messageBox \
+ -type ok \
+ -icon info \
+ -parent $win \
+ -title [mc "OP code not defined"] \
+ -message [mc "This instruction does not exist on 8051"]
+ return 1
+ }
+
+ # Highlight the cell with the corresponding instruction
+ $opcode_ent configure -style TblOfIns_GreenBg.TEntry
+ select_cell $address
+ if {$selected_cell != -1} {
+ fill_details $address 1
+ }
+ return 1
+ }
+
+ ## Set background color for certain cell in the chart matrix
+ # @parm Int address - Cell address
+ # @parm Color color - New background color
+ # @return void
+ private method sel_bg_color {address color} {
+ set frame $cells($address)
+ foreach wdg [list $frame $frame.f $frame.ins_lbl $frame.oprs_lbl $frame.len_lbl $frame.time_lbl] {
+ $wdg configure -bg $color
+ }
+
+ $hh_cells([expr {$address & 0x0F}]) configure -bg $color
+ $vh_cells([expr {($address & 0xF0) >> 4}]) configure -bg $color
+ }
+
+ ## Handles event when mouse pointer enters certain cell in the chart
+ # @parm Int address - Cell address
+ # @return void
+ public method cell_enter {address} {
+ $status_bar_lbl configure -text {}
+ if {$selected_cell != $address} {
+ sel_bg_color $address {#DDFFDD}
+ }
+
+ set def $::CompilerConsts::Opcode([convert_to_opcode $address])
+ $status_bar_lbl configure -text "[string toupper [lindex $def 0]] [join [lindex $def 1] {, }]"
+ }
+
+ ## Handles event when mouse pointer leaves certain cell in the chart
+ # @parm Int address - Cell address
+ # @return void
+ public method cell_leave {address} {
+ if {$selected_cell == $address} {
+ return
+ }
+ sel_bg_color $address {#FFFFFF}
+ $status_bar_lbl configure -text {}
+
+ if {$selected_cell != -1} {
+ $hh_cells([expr {$selected_cell & 0x0F}]) configure -bg {#BBBBFF}
+ $vh_cells([expr {($selected_cell & 0xF0) >> 4}]) configure -bg {#BBBBFF}
+ }
+ }
+
+ ## Handles event when clicks on certain cell in the chart
+ # @parm Int address - Cell address
+ # @return void
+ public method cell_click {address} {
+ if {$selected_cell == $address} {
+ unselect_current_cell 1 1
+ set selected_cell -1
+ return
+ }
+ if {![winfo exists $matrix_frame.cell_$address]} {
+ return
+ }
+
+ focus $matrix_frame.cell_$address
+ select_cell $address
+ if {$selected_cell != -1} {
+ fill_details $address
+ }
+ }
+
+ ## Select specified cell in the chart (mark as selected and adjust details frame)
+ # @parm Int address - Cell address
+ # @return void
+ private method select_cell {address} {
+ if {$selected_cell != -1} {
+ unselect_current_cell 0 0
+ }
+ set selected_cell $address
+ sel_bg_color $address {#BBBBFF}
+ }
+
+ ## Unselect specified cell in the chart (mark as normal and clear details frame)
+ # @parm Bool keep_current - Mark cell as a cell under mouse pointer (light green bg. color)
+ # @parm Bool affect_entryboxes - Clear entryboxes in details frame
+ # @return void
+ private method unselect_current_cell {keep_current affect_entryboxes} {
+ if {$selected_cell == -1} {
+ return
+ }
+
+ # Set new background color
+ if {$keep_current} {
+ sel_bg_color $selected_cell {#DDFFDD}
+ } else {
+ sel_bg_color $selected_cell {#FFFFFF}
+ }
+
+ # Clear entryboxes in details frame
+ if {$affect_entryboxes} {
+ $title_v_lbl configure -text {}
+ $class_v_lbl configure -text {}
+ $desc_v_lbl configure -text {}
+ $length_v_lbl configure -text {}
+ $time_v_lbl configure -text {}
+ $flags_v_lbl configure -text {}
+ $note_v_lbl configure -text {}
+
+ set validation_ena 0
+ $opcode_ent delete 0 end
+ $opcode_ent configure -style TEntry
+ set validation_ena 1
+ }
+ }
+
+ ## Get instruction OP code in 2-digits uppercase hexadecimal form
+ # @parm Int int_address - OP code in decimal form
+ # @return String - 2-digits uppercase hexadecimal number (e.g. ``B9'')
+ private method convert_to_opcode {int_address} {
+ set opcode [format %X $int_address]
+ if {[string length $opcode] == 1} {
+ set opcode "0$opcode"
+ }
+ return $opcode
+ }
+
+ ## Fill the details about the instruction
+ # @parm Int address - Integer representation of the instruction OP code
+ # @parm Bool exclude_opcode - Do not affect the entry box with OP code
+ # @return void
+ public method fill_details {address {exclude_opcode 0}} {
+ $scrollable_frame see $matrix_frame.cell_$address
+
+ ## Obtain detailed informations about the instruction
+
+ set opcode [convert_to_opcode $address]
+ set def $::CompilerConsts::Opcode($opcode)
+
+ set instruction [lindex $def 0] ;# Instruction name
+ set operands [lindex $def 1] ;# Oprand types
+ set length [lindex $def 2] ;# Instruction length
+ set time [lindex $def 4] ;# Time
+
+ set operands_tmp [list]
+ foreach operand $operands {
+ switch -glob -nocase -- $operand {
+ a -
+ c -
+ ab -
+ @dptr -
+ @a+dptr -
+ @a+pc -
+ dptr {
+ set operand [string toupper $operand]
+ }
+ r? {
+ set operand {Rn}
+ }
+ @r? {
+ set operand {@Ri}
+ }
+ imm8 {
+ set operand {#data}
+ }
+ imm16 {
+ set operand {#data16}
+ }
+ code8 {
+ set operand {rel}
+ }
+ code11 {
+ set operand {addr11}
+ }
+ code16 {
+ set operand {addr16}
+ }
+ bit {
+ set operand {bit}
+ }
+ /bit {
+ set operand {/bit}
+ }
+ data {
+ set operand {direct}
+ }
+ }
+ lappend operands_tmp $operand
+ }
+
+ set operands [join $operands_tmp {, }]
+ set instruction [string toupper $instruction]
+ set title "$instruction\t$operands"
+
+ set idx [lsearch -ascii -exact ${::InstructionDetails::INSTRUCTION_DESCRIPTION} $title]
+ if {$idx == -1} {
+ set ins_class {}
+ set ins_desc {}
+ set ins_note {}
+ set flags {}
+ } else {
+ incr idx
+ set def [lindex ${::InstructionDetails::INSTRUCTION_DESCRIPTION} $idx]
+ set ins_desc [lindex $def 0]
+ set ins_class [lindex $def 1]
+ set ins_note [lindex $def 2]
+ set flags {}
+
+ foreach i {0 1 2} f {C OV AC} {
+ if {[string length [lindex $def [list 3 $i]]]} {
+ lappend flags $f
+ }
+ }
+ }
+
+ if {!$exclude_opcode} {
+ $opcode_ent delete 0 end
+ $opcode_ent insert 0 $opcode
+ }
+
+ $title_v_lbl configure -text $title
+ $class_v_lbl configure -text [namespace eval ::InstructionDetails "mc {$ins_class}"]
+ $desc_v_lbl configure -text [namespace eval ::InstructionDetails "mc {$ins_desc}"]
+ $length_v_lbl configure -text $length
+ $time_v_lbl configure -text $time
+ $flags_v_lbl configure -text [join $flags {, }]
+ $note_v_lbl configure -text [namespace eval ::InstructionDetails "mc {$ins_note}"]
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard
diff --git a/make-launcher b/make-launcher
deleted file mode 100755
index 3eba053..0000000
--- a/make-launcher
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/sh
-# Copyright (C) Martin Ošmera <martin.osmera@gmail.com>
-# Licence: GPL v2
-# Version: 1.1
-# Homepage: http://sourceforge.net/projects/mcu8051ide
-
-# Create launcher for MCU 8051 IDE
-
-# Place the created file into directory /usr/bin and just run mcu8051ide
-# Typical usage:
-# ./make-launcher --path-to-lib=/usr/share/mcu8051ide/lib
-
-
-print_help() {
- echo "Create launcher for MCU 8051 IDE"
- echo "Usage:"
- echo "./make-launcher --path-to-lib=path_to_lib_directory"
- exit
-}
-
-create_launcher() {
-cat > mcu8051ide << EOF
-#!/bin/sh
-cd $value
-exec tclsh8.5 main.tcl "\$@" || echo "Tcl 8.5 is not available on the system. Trying another version ..." && exec tclsh main.tcl || echo "FATAL ERROR: Tcl is not installed on the system! MCU 8051 IDE cannot run without it."
-EOF
-echo "Launcher successfuly created"
-}
-
-
-if [ -z "${1}" ]; then
- print_help
-fi
-
-
-while [ -n "${1}" ]; do
-
- key=`echo ${1} | sed -r -e 's/\=[^\=]+//'`
- value=`echo $(echo ${1} | grep =) | sed -r -e 's/[^\=]+\=//;s/^"//;s/"$//'`
-
- case "$key" in
- --path-to-lib)
- if [ -z $value ]; then
- echo "Warning invalid value: $value"
- echo "Using ~ as value"
- value="~"
- fi
- create_launcher
- chmod 0755 mcu8051ide
- ;;
- -h | --help | --usage)
- print_help
- ;;
- *)
- echo "Unrecognized option: ${1}"
- ;;
- esac
- shift
-done
diff --git a/mcu8051ide.desktop b/mcu8051ide.desktop
index 3b8fa29..8fde2d6 100644
--- a/mcu8051ide.desktop
+++ b/mcu8051ide.desktop
@@ -7,7 +7,7 @@ Exec=mcu8051ide
GenericName=MCU 8051 IDE
GenericName[en_US]=MCU 8051 IDE
Icon=mcu8051ide
-MimeType=
+MimeType=application/x-mcu8051ide-project
Name=MCU 8051 IDE
Name[en_US]=MCU 8051 IDE
StartupNotify=false
diff --git a/pkgs/Debian/control b/pkgs/Debian/control
new file mode 100644
index 0000000..ceef678
--- /dev/null
+++ b/pkgs/Debian/control
@@ -0,0 +1,11 @@
+Package: mcu8051ide
+Version: 0.0.0
+Installed-Size: 0
+Priority: optional
+Architecture: all
+Homepage: http://mcu8051ide.sf.net
+Section: Development
+Depends: bwidget (>= 1.8.0), itcl3, tk8.5, tdom (>= 0.8), tcllib (>= 1.10), tk8.5, tclx8.4, libtk-img, rxvt-unicode, sdcc, doxygen, hunspell, make
+Maintainer: Martin Osmera <martin.osmera@gmail.com>
+Description: Graphical Integrated Development Enviroment for 8051.
+ MCU 8051 IDE is integrated development enviroment for microcontrollers based on 8051. Supported programming languages are C and assembly. It has its own assembler and support for 2 external assemblers. For C language it uses the SDCC compiler.
diff --git a/pkgs/Gentoo/README b/pkgs/Gentoo/README
new file mode 100644
index 0000000..63286ed
--- /dev/null
+++ b/pkgs/Gentoo/README
@@ -0,0 +1,37 @@
+================================================================================
+== MCU 8051 IDE - ebuild for Gentoo Linux ==
+================================================================================
+
+=== Installation steps ===
+ - Get superuser rights.
+ # su
+ - Create directory for local portage overlay, if you haven't it yet.
+ # mkdir /usr/local/portage/
+ - Modify /etc/make.conf to make portage work with your new overlay.
+ ...
+ PORTDIR_OVERLAY="... /usr/local/portage" <-- Don't copy the "..." there.
+ ...
+ - Create category "dev-embedded" in the overlay.
+ # mkdir /usr/local/portage/dev-embedded
+ - Create directory for mcu8051ide ebuilds in your local overlay.
+ # mkdir /usr/local/portage/dev-embedded/mcu8051ide
+ - Copy the ebuild there.
+ # cp mcu8051ide-0.0.0.ebuild /usr/local/portage/dev-embedded/mcu8051ide/
+ - Create ebuild manifest to let the portage know about the new ebuild.
+ # ebuild /usr/local/portage/dev-embedded/mcu8051ide/mcu8051ide-0.0.0.ebuild digest
+ - Install the software.
+ # emerge mcu8051ide
+ - Run it (as normal user).
+ $ mcu8051ide
+
+=== Useful links ===
+ * Writing Ebuilds: http://en.gentoo-wiki.com/wiki/Writing_Ebuilds
+ * MCU 8051 IDE project web page: http://mcu8051ide.sf.net
+
+=== Author(s) of the ebuild ===
+ * Martin Ošmera <mailto:martin.osmera@gmail.com>
+
+=== Notes ===
+ * If you have found bug in the ebuild, or you just want to report any issue,
+ or just write anything to the author, please don't hesitate to contact me
+ at mailto:martin.osmera@gmail.com.
diff --git a/pkgs/Gentoo/mcu8051ide.ebuild b/pkgs/Gentoo/mcu8051ide.ebuild
new file mode 100644
index 0000000..bd9fbdf
--- /dev/null
+++ b/pkgs/Gentoo/mcu8051ide.ebuild
@@ -0,0 +1,45 @@
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+DESCRIPTION="Graphical IDE for microcontrollers based on 8051."
+HOMEPAGE="http://mcu8051ide.sourceforge.net"
+SRC_URI="mirror://sourceforge/${PN}/${PN}/${PV}/${PF}.tar.gz"
+
+LICENSE="GPLv2"
+SLOT="0"
+KEYWORDS="~alpha amd64 ~ia64 ~ppc ~sparc x86"
+
+RDEPEND="
+ >=x11-terms/rxvt-unicode-9.1
+ >=dev-embedded/sdcc-2.5
+ >=app-doc/doxygen-1.7
+ >=dev-util/indent-2.2
+ >=app-text/hunspell-1.3
+ >=dev-tcltk/bwidget-1.8
+ >dev-tcltk/itcl-3.3
+ >=dev-lang/tcl-8.5.9
+ >=dev-tcltk/tdom-0.8
+ >=dev-tcltk/tcllib-1.11
+ >=dev-lang/tk-8.5.9
+ >=dev-tcltk/tkimg-1.4
+ >=dev-tcltk/tclx-8.4
+"
+DEPEND="
+ ${RDEPEND}
+ >=dev-util/cmake-2.8
+"
+
+src_unpack() {
+ unpack ${A}
+}
+
+src_compile() {
+ cd "${PF}"
+ cmake -DCMAKE_INSTALL_PREFIX=/usr . || die "cmake failed"
+ emake || die "emake failed"
+}
+
+src_install() {
+ cd "${PF}"
+ emake DESTDIR="${D}" install || die "Install failed"
+}
diff --git a/pkgs/README b/pkgs/README
new file mode 100644
index 0000000..78ad038
--- /dev/null
+++ b/pkgs/README
@@ -0,0 +1,76 @@
+This directory contains files for building various installation packages, the
+create_installation_packages.sh script can these files to create:
+ - RPM package
+ - Debian package
+ - Windows installer
+ - tarball with the source code
+ - ebuild for Gentoo Linux
+ - PKGBUILD file for Arch Linux
+ - freeBSD port
+
+Microsoft Windows specific requiremens:
+---------------------------------------
+
+1) This part of te directory structure is NOT included in source tarball, nor
+it's in the project's GIT repository, however, it is required in order to build
+package for Windows. If you want to build the installer package for MS Windows,
+you have to obtain these files somewhere, freewrap can be just downloaded from
+the Internet, but the you would probably have to build all those .dll files. All
+version and file names must be met exactly!
+Windows/
+├── freewrap
+│   ├── docs
+│   │   ├── freeWrapDocs.pdf
+│   │   ├── license.winico
+│   │   ├── readme.txt
+│   │   ├── readme.winico
+│   │   └── winico.html
+│   ├── freewrap <-- Linux version of freeWrap
+│   ├── freewrap.exe <-- Windows version freeWrap
+│   └── tclpip85s.dll
+├── lib_pkg_dir <-- Some of the MCU 8051 IDE dependencies
+│   ├── img_png1.4.0.4 <-- tkimg library
+│   │   ├── pngtcl143.dll
+│   │   ├── tkimg1404.dll
+│   │   ├── tkimgpng1404.dll
+│   │   └── zlibtcl12503.dll
+│   ├── Itcl3.4 <-- [Incr Tcl] (itcl) library
+│   │   ├── itcl34.dll
+│   │   ├── itcl.tcl
+│   │   └── pkgIndex.tcl
+│   ├── Tclx8.4 <-- TclX library
+│   │   ├── arrayprocs.tcl
+│   │   ├── autoload.tcl
+│   │   ├── buildhelp.tcl
+│   │   ├── compat.tcl
+│   │   ├── convlib.tcl
+│   │   ├── edprocs.tcl
+│   │   ├── events.tcl
+│   │   ├── fmath.tcl
+│   │   ├── forfile.tcl
+│   │   ├── globrecur.tcl
+│   │   ├── help.tcl
+│   │   ├── pkgIndex.tcl
+│   │   ├── profrep.tcl
+│   │   ├── pushd.tcl
+│   │   ├── setfuncs.tcl
+│   │   ├── showproc.tcl
+│   │   ├── stringfile.tcl
+│   │   ├── tcllib.tcl
+│   │   ├── tclx84.dll
+│   │   └── tclx.tcl
+│   └── tdom0.8.3 <-- tdom library
+│   ├── pkgIndex.tcl
+│   ├── tdom083.dll
+│   └── tdom.tcl
+:
+:
+
+2) Inno Setup and the final Windows package: you can build even the Windows
+installer file (an .exe file) directly from GNU/Linux, the script can so this
+automatically, but you have to install Wine and Inno Setup in Wine (both can be
+easily obtained from the Internet). Run winecfg and set "W:" drive to the
+directory where you have located your local mcu8051ide development directory
+(it might/should be different from the installation directory),
+e.g. "/home/some_user_name/" (in case there is
+"/home/some_user_name/mcu8051ide/pkg/create_installation_packages.sh", ...)
diff --git a/pkgs/RedHat/mcu8051ide.spec b/pkgs/RedHat/mcu8051ide.spec
new file mode 100644
index 0000000..041f22e
--- /dev/null
+++ b/pkgs/RedHat/mcu8051ide.spec
@@ -0,0 +1,53 @@
+Name: mcu8051ide
+Summary: IDE for MSC-51 based MCUs
+Version: 0.0
+Release: 0
+License: GPLv2
+Group: Development/Tools/IDE
+Source: %{name}-%{version}.tar.gz
+Requires: tcl >= 8.5.9, tk >= 8.5.9, bwidget >= 1.8, tclx >= 8.4, itcl >= 3.4, tdom >= 0.8, tcllib >= 1.6, tkimg >= 1.3, rxvt-unicode >= 8.3, sdcc, doxygen, indent, hunspell
+Provides: mcu8051ide
+
+BuildRoot: /var/tmp/%{name}-buildroot
+Packager: Martin Ošmera <martin.osmera@gmail.com>
+Distribution: Fedora
+Url: http://mcu8051ide.sf.net
+
+%description
+MCU 8051 IDE is integrated development enviroment for MCS-51 based microcontrollers. Supported programming languages are C and assembly. It has its own assembler and support for 2 external assemblers. For C language it uses the SDCC compiler.
+
+%prep
+rm -rf $RPM_BUILD_ROOT
+mkdir $RPM_BUILD_ROOT
+
+%setup -q
+
+%build
+CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" \
+cmake -DCMAKE_INSTALL_PREFIX=/usr .
+make -j 2
+
+%install
+make DESTDIR=$RPM_BUILD_ROOT install
+
+cd $RPM_BUILD_ROOT
+
+find . -type d -fprint $RPM_BUILD_DIR/file.list.%{name}.dirs
+find . -type f -fprint $RPM_BUILD_DIR/file.list.%{name}.files.tmp
+find . -type l >> $RPM_BUILD_DIR/file.list.%{name}.files.tmp
+sed 's/^\./\."/g;s/$/"/g' $RPM_BUILD_DIR/file.list.%{name}.files.tmp > $RPM_BUILD_DIR/file.list.%{name}.files
+sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' $RPM_BUILD_DIR/file.list.%{name}.dirs > $RPM_BUILD_DIR/file.list.%{name}
+sed 's,^\.,\%attr(-\,root\,root) ,' $RPM_BUILD_DIR/file.list.%{name}.files >> $RPM_BUILD_DIR/file.list.%{name}
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+rm -rf $RPM_BUILD_DIR/file.list.%{name}
+rm -rf $RPM_BUILD_DIR/file.list.%{name}.files
+rm -rf $RPM_BUILD_DIR/file.list.%{name}.dirs
+
+%files -f ../file.list.%{name}
+
+%defattr(-,root,root,0755)
+
+%verifyscript
+mcu8051ide --check-libraries
diff --git a/pkgs/Windows/exec.ico b/pkgs/Windows/exec.ico
new file mode 100644
index 0000000..0c4af43
--- /dev/null
+++ b/pkgs/Windows/exec.ico
Binary files differ
diff --git a/pkgs/Windows/external_command.bat b/pkgs/Windows/external_command.bat
new file mode 100644
index 0000000..c350e75
--- /dev/null
+++ b/pkgs/Windows/external_command.bat
@@ -0,0 +1 @@
+@%1 %2 %3 %4 %5 %6 %7 %8 %9 \ No newline at end of file
diff --git a/MicrosoftWindows_compatibility/mcu8051ide.ico b/pkgs/Windows/mcu8051ide.ico
index c068526..c068526 100644
--- a/MicrosoftWindows_compatibility/mcu8051ide.ico
+++ b/pkgs/Windows/mcu8051ide.ico
Binary files differ
diff --git a/pkgs/Windows/mcu8051ide_win_setup.iss b/pkgs/Windows/mcu8051ide_win_setup.iss
new file mode 100644
index 0000000..17743d9
--- /dev/null
+++ b/pkgs/Windows/mcu8051ide_win_setup.iss
@@ -0,0 +1,52 @@
+[Setup]
+AppId={{E0D2EFF2-AF92-403C-88F6-6188F369D6BB}
+AppName=MCU 8051 IDE
+AppVerName=MCU 8051 IDE 1.4.7
+AppPublisher=Martin Osmera
+AppPublisherURL=http://mcu8051ide.sf.net/
+AppSupportURL=http://mcu8051ide.sf.net/
+AppUpdatesURL=http://mcu8051ide.sf.net/
+DefaultDirName={pf}\MCU 8051 IDE
+DefaultGroupName=MCU 8051 IDE
+AllowNoIcons=yes
+LicenseFile=W:\mcu8051ide\LICENSE
+OutputDir=W:\mcu8051ide\pkgs
+OutputBaseFilename=mcu8051ide-1.4.7-setup
+Compression=lzma
+SolidCompression=yes
+SetupIconFile="W:\mcu8051ide\pkgs\Windows\mcu8051ide.ico"
+WizardImageFile="W:\mcu8051ide\pkgs\Windows\setup_image.bmp"
+WizardSmallImageFile="W:\mcu8051ide\pkgs\Windows\setup_small_image.bmp"
+
+[Registry]
+Root: HKCR; Subkey: ".mcu8051ide"; ValueType: string; ValueName: ""; ValueData: "MCU8051IDEProject"; Flags: uninsdeletevalue
+Root: HKCR; Subkey: "MCU8051IDEProject"; ValueType: string; ValueName: ""; ValueData: "MCU 8051 IDE project file"; Flags: uninsdeletekey
+Root: HKCR; Subkey: "MCU8051IDEProject\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\mcu8051ide.ico"
+Root: HKCR; Subkey: "MCU8051IDEProject\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\mcu8051ide.exe"" ""%1"""
+
+[Languages]
+Name: "english"; MessagesFile: "compiler:Default.isl"
+
+[Tasks]
+Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
+Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
+
+[Files]
+Source: "W:\mcu8051ide\pkgs\installation_sandbox\win_pkg_files\demo\*"; DestDir: "{app}\demo"; Flags: ignoreversion
+Source: "W:\mcu8051ide\pkgs\installation_sandbox\win_pkg_files\data\tips.xml"; DestDir: "{app}\data"; Flags: ignoreversion
+Source: "W:\mcu8051ide\pkgs\installation_sandbox\win_pkg_files\doc\handbook\*.pdf"; DestDir: "{app}\doc\handbook"; Flags: ignoreversion
+Source: "W:\mcu8051ide\pkgs\installation_sandbox\win_pkg_files\translations\*"; DestDir: "{app}\translations"; Flags: ignoreversion
+Source: "W:\mcu8051ide\pkgs\installation_sandbox\win_pkg_files\hwplugins\*"; DestDir: "{app}\hwplugins"; Flags: ignoreversion
+Source: "W:\mcu8051ide\pkgs\installation_sandbox\win_pkg_files\*.exe"; DestDir: "{app}"; Flags: ignoreversion
+Source: "W:\mcu8051ide\pkgs\Windows\mcu8051ide.ico"; DestDir: "{app}"; Flags: ignoreversion
+Source: "W:\mcu8051ide\pkgs\Windows\*.bat"; DestDir: "{app}"; Flags: ignoreversion
+Source: "W:\mcu8051ide\pkgs\Windows\readme.txt"; DestDir: "{app}"; Flags: ignoreversion
+
+[Icons]
+Name: "{group}\MCU 8051 IDE"; Filename: "{app}\mcu8051ide.exe"; IconFilename: "{app}\mcu8051ide.ico"
+Name: "{commondesktop}\MCU 8051 IDE"; Filename: "{app}\mcu8051ide.exe"; Tasks: desktopicon; IconFilename: "{app}\mcu8051ide.ico"
+Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\MCU 8051 IDE"; Filename: "{app}\mcu8051ide.exe"; Tasks: quicklaunchicon; IconFilename: "{app}\mcu8051ide.ico"
+
+[Run]
+Filename: "{app}\mcu8051ide.exe"; Description: "{cm:LaunchProgram,MCU 8051 IDE}"; Flags: shellexec postinstall skipifsilent
+Filename: "{app}\readme.txt"; Description: "View the README file"; Flags: postinstall shellexec skipifsilent
diff --git a/pkgs/Windows/readme.txt b/pkgs/Windows/readme.txt
new file mode 100644
index 0000000..b6e156f
--- /dev/null
+++ b/pkgs/Windows/readme.txt
@@ -0,0 +1,8 @@
+MCU 8051 IDE is an integrated development enviroment for MCS-51 based
+microcontrollers. Supported programming languages are C and the assembly
+language. For C language the IDE uses the SDCC compiler, you can download SDCC
+from: http://sdcc.sourceforge.net/snap.php#Windows.
+
+This IDE was originally written for GNU/Linux operating systems, this version
+Microsoft Windows operating systems, it has been tested on Microsoft Windows XP
+and Microsoft Windows 7.
diff --git a/pkgs/Windows/setup_image.bmp b/pkgs/Windows/setup_image.bmp
new file mode 100644
index 0000000..5430155
--- /dev/null
+++ b/pkgs/Windows/setup_image.bmp
Binary files differ
diff --git a/pkgs/Windows/setup_small_image.bmp b/pkgs/Windows/setup_small_image.bmp
new file mode 100644
index 0000000..db4a8d6
--- /dev/null
+++ b/pkgs/Windows/setup_small_image.bmp
Binary files differ
diff --git a/pkgs/Windows/startasem.bat b/pkgs/Windows/startasem.bat
new file mode 100644
index 0000000..285044f
--- /dev/null
+++ b/pkgs/Windows/startasem.bat
@@ -0,0 +1,17 @@
+@echo off
+
+rem DESCRIPTION:
+rem Run ASEM-51 assembler from the IDE silently, i.e. without showing any additional windows.
+
+SETLOCAL ENABLEEXTENSIONS
+cd %1
+SHIFT
+
+:Loop
+IF "%1"=="" GOTO Continue
+SET args=%args% %1
+SHIFT
+GOTO Loop
+:Continue
+
+asem %args%
diff --git a/pkgs/Windows/startsdcc.bat b/pkgs/Windows/startsdcc.bat
new file mode 100644
index 0000000..a13a246
--- /dev/null
+++ b/pkgs/Windows/startsdcc.bat
@@ -0,0 +1,17 @@
+@echo off
+
+rem DESCRIPTION:
+rem Run SDCC compiler from the IDE silently, i.e. without showing any additional windows.
+
+SETLOCAL ENABLEEXTENSIONS
+cd %1
+SHIFT
+
+:Loop
+IF "%1"=="" GOTO Continue
+SET args=%args% %1
+SHIFT
+GOTO Loop
+:Continue
+
+sdcc -mmcs51 %args%
diff --git a/pkgs/create_installation_packages.sh b/pkgs/create_installation_packages.sh
new file mode 100755
index 0000000..be64a7a
--- /dev/null
+++ b/pkgs/create_installation_packages.sh
@@ -0,0 +1,1168 @@
+#!/bin/bash
+
+declare -A options=(
+ [help]=0 [nocolor]=0 [tests]=0
+ [version]=0 [pdf]=0 [demo]=0
+ [msg]=0 [tar]=0 [ebuild]=0
+ [rpm]=0 [deb]=0 [windows]=0
+ [clear]=0 [inno]=0 [arch]=0
+ [freeBSD]=0 [readme]=0
+)
+declare -A COLOR=(
+ [none]="" [reg]="" [green]=""
+ [yellow]="" [blue]="" [purple]=""
+ [purple]="" [bold]=""
+)
+declare ide_version="0.0"
+declare -a version
+declare results=
+declare cur_func="main"
+declare nc_opt_long
+declare nc_opt_short
+declare SOURCE_DIR
+declare PKG_DIR
+declare WORK_DIR
+declare SCRIPT_NAME
+
+function basic_tests() {
+ cur_func="basic_tests"
+ local -i failed_flag=0
+ print_info 0 "Running basic tests."
+
+ print_info 1 "Checking for presence of the required programs."
+ for p in tclsh wish bash cmake make pdflatex rpmbuild dpkg gawk m4 tee find locate grep md5sum sha256sum wine wc; do
+ which $p &>/dev/null
+ if [ "$?" == "0" ]; then
+ printf "${COLOR[green]}[OK] ${COLOR[none]} $p\n"
+ else
+ printf "${COLOR[red]}[FAILED]${COLOR[none]} $p\n"
+ failed_flag=1
+ fi
+ done
+ if (( failed_flag )); then
+ die "Some of the required programs are missing, unable to continue!"
+ fi
+
+ print_info 1 "Running MCU 8051 IDE self testing tools."
+ tclsh "${SOURCE_DIR}/lib/main.tcl" ${nc_opt_long} --check-libraries || die
+ bash "${SOURCE_DIR}/regression_tests/assembler/runtest" ${nc_opt_short} || die
+ bash "${SOURCE_DIR}/regression_tests/simulator/runtest" ${nc_opt_short} || die
+
+ print_info 2 "Basic tests complete."
+}
+
+function create_launcher() {
+ printf "#!/bin/sh\n" > "${2}/mcu8051ide" || die
+ printf "exec tclsh8.5 ${1}/main.tcl \"\$@\" || \\\n" >> "${2}/mcu8051ide" || die
+ printf "\tprintf \"Unable to execute, TCL interpreter is not reachable.\n\" > /dev/stderr" >> "${2}/mcu8051ide" || die
+ chmod -v 0755 "${2}/mcu8051ide" || die
+}
+
+function update_msg_files() {
+ cur_func="update_msg_files"
+ print_info 0 "Updating translation files"
+
+ tclsh "${SOURCE_DIR}/translations/tool.tcl" -t "${SOURCE_DIR}/translations/template.txt" || die
+ for f in "${SOURCE_DIR}"/translations/*.msg; do
+ if [ ! -e "$f" ]; then
+ break
+ fi
+ print_info 1 "Updating $(basename "$f")"
+ tclsh "${SOURCE_DIR}/translations/tool.tcl" -m "$f" || die
+ done
+ print_info 2 "Update complete."
+}
+
+function clear_source_dir() {
+ cur_func="clear_source_dir"
+ print_info 0 "Cleaning the source directory."
+ for i in "${SOURCE_DIR}"/*~ "${SOURCE_DIR}"/*/*~ "${SOURCE_DIR}"/*/*/*~ "${SOURCE_DIR}"/*/*/*/*~; do
+ if [ ! -f "$i" ]; then
+ continue
+ fi
+ rm -fv "$i"
+ done
+
+ rm -fv "${SOURCE_DIR}/CMakeCache.txt"
+ rm -fv "${SOURCE_DIR}/cmake_install.cmake"
+ rm -fv "${SOURCE_DIR}/install_manifest.txt"
+ rm -fv "${SOURCE_DIR}/Makefile"
+ rm -rfv "${SOURCE_DIR}/mcu8051ide"
+ rm -rfv "${SOURCE_DIR}/CMakeFiles"
+ find "${SOURCE_DIR}" -name .directory | while read f; do
+ rm -rfv "${f}"
+ done
+ rm -rfv "${SOURCE_DIR}"/doc/handbook/*.{aux,lof,lot,log,out,toc,backup}
+ rm -rfv "${SOURCE_DIR}/regression_tests/"*/results/*
+ rm -rfv "${SOURCE_DIR}/doc/handbook/doc"
+ rm -v "${SOURCE_DIR}"/demo/{lnk,rel,mem,map,bin,sym}
+
+ for f in "${SOURCE_DIR}"/demo/*.c; do
+ if [ -e "${f%%.c}.asm" ]; then
+ rm -v "${f%%.c}.asm"
+ rm -v "${f%%.c}.hex"
+ rm -v "${f%%.c}"
+ fi
+ done
+
+ find "${SOURCE_DIR}" -type d | while read f; do
+ chmod -v 0755 "${f}"
+ done
+ find "${SOURCE_DIR}" -type f | while read f; do
+ chmod -v 0644 "${f}"
+ done
+ for i in lib/main.tcl translations/tool.tcl pkgs/create_installation_packages.sh; do
+ chmod -v 0755 "${SOURCE_DIR}/${i}"
+ done
+ print_info 2 "Cleanup complete."
+}
+
+function create_pdf_doc() {
+ cur_func="create_pdf_doc"
+ print_info 0 "Creating documentation .pdf files using LaTeX."
+ cd "${SOURCE_DIR}/doc/handbook" || die
+ for f in ./mcu8051ide.*.tex; do
+ print_info 1 "Building $(basename "$f")"
+ pdflatex "$f" || die
+ pdflatex "$f" || die
+ done
+ cd "${SOURCE_DIR}" || die
+ print_info 2 "Documentation build complete."
+}
+
+function remove_sandbox() {
+ cur_func="remove_sandbox"
+ print_info 0 "Removing the temporary work directory."
+ rm -rfv "${WORK_DIR}" || die
+ print_info 2 "Removal complete."
+}
+
+function finalize_sandbox() {
+ cur_func="finalize_sandbox"
+ print_info 0 "Finalizing creation of the temporary work directory."
+ print_info 1 "Compressing the manual page."
+ gzip -v "${WORK_DIR}/doc/man/mcu8051ide.1" || die
+
+ print_info 1 "Removing .asm files generated by SDCC (for ASX8051 assembler) from the demo project."
+ for f in "${WORK_DIR}"/demo/*.c; do
+ if [ -e "${f%%.c}.asm" ]; then
+ rm -v "${f%%.c}.asm"
+ rm -v "${f%%.c}.hex"
+ rm -v "${f%%.c}"
+ fi
+ done
+
+ print_info 1 "Normalizing the demo project file."
+ gawk '
+ BEGIN {
+ tag=""
+ }
+ /<graph/ {
+ tag="graph"
+ }
+ /\/>/ {
+ tag=""
+ }
+ /\<actual_line/ {
+ gsub(/value=\"[0-9]*\"/, "value=\"1\"", $0);
+ }
+ /enabled=/ && (tag == "graph") {
+ sub(/enabled=\"1\"/, "enabled=\"0\"", $0);
+ }
+ {
+ gsub(/current_file=\"[0-9]*\"/, "current_file=\"0\"", $0);
+ gsub(/read_only=\"0\"/, "read_only=\"1\"", $0);
+ print($0);
+ }
+ ' "${WORK_DIR}/demo/Demo project.mcu8051ide" > "${WORK_DIR}/demo/Demo project.mcu8051ide.tmp" || die
+ mv -v "${WORK_DIR}/demo/Demo project.mcu8051ide.tmp" "${WORK_DIR}/demo/Demo project.mcu8051ide" || die
+ chmod -v 0644 "${WORK_DIR}/demo/Demo project.mcu8051ide" || die
+
+ print_info 2 "Creation of temporary work directory finalized."
+}
+
+function create_sandbox() {
+ cur_func="create_sandbox"
+ print_info 0 "Creating temporary work directory: ${WORK_DIR}"
+ if [ -e "${WORK_DIR}" ]; then
+ print_info 1 "Work directory already exist, removing it."
+ remove_sandbox
+ fi
+
+ print_info 1 "Coping project files to the work directory."
+ mkdir -v "${WORK_DIR}" || die
+
+ for f in ChangeLog README TODO LICENSE mcu8051ide.desktop application-x-mcu8051ide.xml CMakeLists.txt mcu8051ide.png; do
+ cp -v "${SOURCE_DIR}/${f}" "${WORK_DIR}" || die
+ done
+ chmod -v 0644 "${WORK_DIR}"/* || die
+
+ print_info 1 "Directory: data."
+ mkdir -v "${WORK_DIR}/data" || die
+ chmod -v 0755 "${WORK_DIR}/data" || die
+ cp -v "${SOURCE_DIR}"/data/*.{txt,dtd,xml} "${WORK_DIR}/data" || die
+ chmod -v 0644 "${WORK_DIR}"/data/* || die
+
+ print_info 1 "Directory: demo."
+ mkdir -v "${WORK_DIR}/demo" || die
+ chmod -v 0755 "${WORK_DIR}/demo" || die
+ cp -v "${SOURCE_DIR}"/demo/*.{adf,lst,ihx,mcu8051ide,hashes,hex,vhw,vhc,wtc,asm,c,cdb} "${WORK_DIR}/demo" || die
+ chmod -v 0644 "${WORK_DIR}"/demo/* || die
+
+ print_info 1 "Directory: doc."
+ mkdir -v "${WORK_DIR}/doc" || die
+ mkdir -v "${WORK_DIR}/doc/man" || die
+ mkdir -v "${WORK_DIR}/doc/handbook" || die
+ mkdir -v "${WORK_DIR}/doc/handbook/img" || die
+ chmod -v 0755 "${WORK_DIR}/doc" || die
+ chmod -v 0755 "${WORK_DIR}/doc/man" || die
+ chmod -v 0755 "${WORK_DIR}/doc/handbook" || die
+ chmod -v 0755 "${WORK_DIR}/doc/handbook/img" || die
+ cp -v "${SOURCE_DIR}/doc/man/mcu8051ide.1" "${WORK_DIR}/doc/man" || die
+ cp -v "${SOURCE_DIR}"/doc/handbook/mcu8051ide.*.{tex,pdf} "${WORK_DIR}/doc/handbook" || die
+ cp -v "${SOURCE_DIR}"/doc/handbook/img/*.png "${WORK_DIR}/doc/handbook/img" || die
+ chmod -v 0644 "${WORK_DIR}/doc/man/mcu8051ide.1" || die
+ chmod -v 0644 "${WORK_DIR}"/doc/handbook/*.{tex,pdf} || die
+ chmod -v 0644 "${WORK_DIR}"/doc/handbook/img/*.png || die
+
+ print_info 1 "Directory: hwplugins."
+ mkdir -v "${WORK_DIR}/hwplugins" || die
+ chmod -v 0755 "${WORK_DIR}/hwplugins" || die
+ cp -v "${SOURCE_DIR}"/hwplugins/{plug-in_template.txt,README} "${WORK_DIR}/hwplugins" || die
+ chmod -v 0644 "${WORK_DIR}"/hwplugins/* || die
+
+ print_info 1 "Directory: translations."
+ mkdir -v "${WORK_DIR}/translations" || die
+ chmod -v 0755 "${WORK_DIR}/translations" || die
+ cp -v "${SOURCE_DIR}"/translations/*.{txt,msg,tcl} "${WORK_DIR}/translations" || die
+ cp -v "${SOURCE_DIR}"/translations/README "${WORK_DIR}/translations/" || die
+ chmod -v 0644 "${WORK_DIR}/"translations/* || die
+ chmod -v 0755 "${WORK_DIR}/translations/tool.tcl" || die
+
+ print_info 1 "Directory: icons."
+ mkdir -v "${WORK_DIR}/icons" || die
+ chmod -v 0755 "${WORK_DIR}/icons" || die
+ for d in 16x16 22x22 32x32 flag mcu other; do
+ mkdir -v "${WORK_DIR}/icons/${d}" || die
+ chmod -v 0755 "${WORK_DIR}/icons/${d}" || die
+ cp -v "${SOURCE_DIR}"/icons/${d}/*.png "${WORK_DIR}"/icons/${d} || die
+ chmod -v 0644 "${WORK_DIR}"/icons/${d}/* || die
+ done
+
+ print_info 1 "Directory: lib."
+ mkdir -v "${WORK_DIR}/lib/" || die
+ chmod -v 0755 "${WORK_DIR}/lib" || die
+ cp -v lib/*.tcl "${WORK_DIR}/lib/" || die
+ chmod -v 0644 "${WORK_DIR}"/lib/*.tcl || die
+ chmod -v 0755 "${WORK_DIR}"/lib/main.tcl || die
+ for d in bottompanel compiler editor lib pale simulator simulator/engine configdialogues dialogues leftpanel rightpanel utilities; do
+ mkdir -v "${WORK_DIR}/lib/${d}" || die
+ chmod -v 0755 "${WORK_DIR}/lib/${d}" || die
+ cp -v "${SOURCE_DIR}"/lib/${d}/*.tcl "${WORK_DIR}/lib/${d}" || die
+ chmod -v 0644 "${WORK_DIR}"/lib/${d}/*.tcl || die
+ done
+ cp -v "${SOURCE_DIR}/lib/list_of_files.txt" "${WORK_DIR}/lib/list_of_files.txt" || die
+ chmod 0644 "${WORK_DIR}/lib/list_of_files.txt"
+
+ print_info 1 "Directory: pkgs."
+ mkdir -v "${WORK_DIR}/pkgs" || die
+ chmod 0755 "${WORK_DIR}/pkgs" || die
+ cp -v "${SOURCE_DIR}/pkgs/README" "${WORK_DIR}/pkgs" || die
+ cp -v "${SOURCE_DIR}"/pkgs/*.sh "${WORK_DIR}/pkgs" || die
+ chmod 0644 "${WORK_DIR}/pkgs/README" || die
+ chmod 0755 "${WORK_DIR}"/pkgs/*.sh || die
+ for d in Debian Gentoo RedHat Windows; do
+ mkdir -v "${WORK_DIR}/pkgs/${d}" || die
+ chmod 0755 "${WORK_DIR}/pkgs/${d}" || die
+ done
+ cp -v "${SOURCE_DIR}"/pkgs/Debian/control "${WORK_DIR}/pkgs/Debian/" || die
+ chmod 0644 "${WORK_DIR}"/pkgs/Debian/* || die
+ cp -v "${SOURCE_DIR}/pkgs/Gentoo/README" "${WORK_DIR}/pkgs/Gentoo/" || die
+ cp -v "${SOURCE_DIR}"/pkgs/Gentoo/*.ebuild "${WORK_DIR}/pkgs/Gentoo/" || die
+ chmod 0644 "${WORK_DIR}"/pkgs/Gentoo/* || die
+ cp -v "${SOURCE_DIR}/pkgs/RedHat/mcu8051ide.spec" "${WORK_DIR}/pkgs/RedHat/" || die
+ chmod 0644 "${WORK_DIR}"/pkgs/RedHat/* || die
+ cp -v "${SOURCE_DIR}"/pkgs/Windows/*.{bat,ico,iss,txt,bmp} "${WORK_DIR}/pkgs/Windows" || die
+ chmod 0644 "${WORK_DIR}"/pkgs/Windows/* || die
+
+ print_info 1 "Directory: regression_tests."
+ mkdir -v "${WORK_DIR}/regression_tests/" || die
+ chmod -v 0755 "${WORK_DIR}/regression_tests" || die
+ cp -v "${SOURCE_DIR}"/regression_tests/{README,rte.lib.sh} "${WORK_DIR}/regression_tests/" || die
+ chmod -v 0644 "${WORK_DIR}"/regression_tests/* || die
+ # Assembler
+ mkdir -v "${WORK_DIR}/regression_tests/assembler/" || die
+ chmod -v 0755 "${WORK_DIR}/regression_tests/assembler/" || die
+ cp -v "${SOURCE_DIR}"/regression_tests/assembler/*.awk "${WORK_DIR}/regression_tests/assembler/" || die
+ cp -v "${SOURCE_DIR}"/regression_tests/assembler/{process_in_file,README,runtest} "${WORK_DIR}/regression_tests/assembler/" || die
+ chmod -v 0755 "${WORK_DIR}/regression_tests/assembler/runtest"
+ mkdir -v "${WORK_DIR}/regression_tests/assembler/results" || die
+ chmod -v 0755 "${WORK_DIR}/regression_tests/assembler/results" || die
+ mkdir -v "${WORK_DIR}/regression_tests/assembler/testcases" || die
+ chmod -v 0755 "${WORK_DIR}/regression_tests/assembler/testcases" || die
+ cp -v "${SOURCE_DIR}"/regression_tests/assembler/testcases/*.{in,asm,exp} "${WORK_DIR}/regression_tests/assembler/testcases/" || die
+ # Simulator
+ mkdir -v "${WORK_DIR}/regression_tests/simulator/" || die
+ chmod -v 0755 "${WORK_DIR}/regression_tests/simulator/" || die
+ cp -v "${SOURCE_DIR}"/regression_tests/simulator/*.awk "${WORK_DIR}/regression_tests/simulator/" || die
+ cp -v "${SOURCE_DIR}"/regression_tests/simulator/{README,runtest} "${WORK_DIR}/regression_tests/simulator/" || die
+ chmod -v 0755 "${WORK_DIR}/regression_tests/simulator/runtest"
+ mkdir -v "${WORK_DIR}/regression_tests/simulator/results" || die
+ chmod -v 0755 "${WORK_DIR}/regression_tests/simulator/results" || die
+ mkdir -v "${WORK_DIR}/regression_tests/simulator/testcases" || die
+ chmod -v 0755 "${WORK_DIR}/regression_tests/simulator/testcases" || die
+ cp -v "${SOURCE_DIR}"/regression_tests/simulator/testcases/*.{in,adf,exp} "${WORK_DIR}/regression_tests/simulator/testcases/" || die
+ cp -v "${SOURCE_DIR}"/regression_tests/simulator/testcases/*.asm "${WORK_DIR}/regression_tests/simulator/testcases/" || printf "No .asm files found, but it's ok.\n"
+}
+
+function recheck_RTE() {
+ cur_func="recheck_RTE"
+ print_info 0 "Rerunning the regression tests to ensure that they still work."
+
+ print_info 1 "Preparing directory."
+ cp -Rv "${WORK_DIR}/regression_tests/" "${WORK_DIR}/regression_tests.tmp" || die
+
+ print_info 1 "Testing assembler."
+ bash "${WORK_DIR}/regression_tests.tmp/assembler/runtest" ${nc_opt_short} || die
+
+ print_info 1 "Testing simulator."
+ bash "${WORK_DIR}/regression_tests.tmp/simulator/runtest" ${nc_opt_short} || die
+
+ print_info 1 "Cleaning up."
+ rm -rfv "${WORK_DIR}/regression_tests.tmp"
+
+ print_info 2 "Regression tests complete."
+}
+
+function detect_version() {
+ cur_func="detect_version"
+ ide_version=$(grep "set VERSION" "${SOURCE_DIR}/lib/main.tcl" | gawk '{gsub(/\"/,"",$3);print($3)}')
+ print_info 1 "Detected version of the IDE: ${ide_version}"
+
+ if ! gawk '/^[0-9]\.[0-9](\.[0-9])?$/ {exit 0} {die}' <<< "${ide_version}"; then
+ die "This is not a valid version specification, aborting!"
+ fi
+}
+
+function create_tarball() {
+ cur_func="create_tarball"
+ local -r PKG_NAME="mcu8051ide-${ide_version}.tar.gz"
+ print_info 0 "Creating source code tarball."
+ if [ -e "${PKG_DIR}/${PKG_NAME}" ]; then
+ rm -v "${PKG_DIR}/${PKG_NAME}"
+ fi
+ mv -v "${WORK_DIR}" "${PKG_DIR}/mcu8051ide-${ide_version}" || die
+ cd "${PKG_DIR}" || die
+ tar cvfz "${PKG_NAME}" "mcu8051ide-${ide_version}" || die
+ mv -v "${PKG_DIR}/mcu8051ide-${ide_version}" "${WORK_DIR}" || die
+
+ results+=" ${COLOR[green]}*${COLOR[none]} ${PKG_DIR}/${PKG_NAME}\n"
+ print_info 2 "Tarball successfully created: ${PKG_DIR}/${PKG_NAME}"
+}
+
+function create_pacman_package() {
+ cur_func="create_pacman_package"
+
+ print_info 0 "Creating pacman \"package\"."
+
+ local -r PKG_NAME="Arch-PKGBUILD-mcu8051ide-${ide_version}.tar.gz"
+ local -r TARBALL="${PKG_DIR}/mcu8051ide-${ide_version}.tar.gz"
+ local -r MD5_SUM=$(md5sum -b "${TARBALL}" | gawk ' { print($1); exit(0) } ')
+ local -r DIR="${WORK_DIR}/Arch-PKGBUILD"
+
+ mkdir -v "${DIR}" || die
+ gawk "
+ /<0.0.0>/ {
+ sub(/<0.0.0>/,\"${ide_version}\", \$0)
+ }
+ /<md5_sum>/ {
+ sub(/<md5_sum>/,\"${MD5_SUM}\", \$0)
+ }
+ /<date>/ {
+ sub(/<date>/,\"$(date +%F)\", \$0)
+ }
+ {
+ print(\$0)
+ }
+ " "${SOURCE_DIR}/pkgs/Arch/PKGBUILD" > "${DIR}/PKGBUILD" || die
+ cp -v "${SOURCE_DIR}/pkgs/Arch/README" "${DIR}/" || die
+ chmod -v 0644 "${DIR}"/* || die
+ cd "${DIR}" || die
+ tar cvfz "${PKG_NAME}" PKGBUILD README || die
+ mv -vf "${PKG_NAME}" "${PKG_DIR}/" || die
+ rm -rfv "${DIR}" || die
+
+ results+=" ${COLOR[green]}*${COLOR[none]} ${PKG_DIR}/${PKG_NAME}\n"
+ print_info 2 "pacman \"package\" successfully created: ${PKG_DIR}/${PKG_NAME}"
+}
+
+function rm_sctar_files() {
+ cur_func="rm_sctar_files"
+ print_info 0 "Removing files needed only for the source code tarball."
+
+ rm -v "${WORK_DIR}/lib/list_of_files.txt"
+ rm -rfv "${WORK_DIR}/pkgs"
+
+ print_info 2 "Files needed only for source code tarball removed."
+}
+
+function check_version() {
+ cur_func="check_version"
+ print_info 0 "Checking for correct version number in CMakeLists.txt, README, and mcu8051ide_win_setup.iss"
+
+ # Check CMakeLists.txt
+ if gawk "/^[ \t]*SET[ \t]*\([ \t]*mcu8051ide_version[ \t]+${ide_version}[ \t]*\)[ \t]*$/ {die}" "${SOURCE_DIR}/CMakeLists.txt"; then
+ print_info 1 "Version number in CMakeLists.txt doesn't match the detected version (${ide_version}), correcting."
+
+ gawk "/^[ \t]*SET[ \t]*\([ \t]*mcu8051ide_version[ \t]+[0-9]+\.[0-9]+(\.[0-9]+)?[ \t]*\)[ \t]*$/ {
+ \$0=\"SET(mcu8051ide_version ${ide_version})\"
+ }
+ {
+ print(\$0)
+ }
+ " "${SOURCE_DIR}/CMakeLists.txt" > "/tmp/CMakeLists.txt" || die
+ mv "/tmp/CMakeLists.txt" "${SOURCE_DIR}/CMakeLists.txt" || die
+ else
+ print_info 1 "CMakeLists.txt is OK!"
+ fi
+ # Check README
+ if gawk "/^MCU 8051 IDE v${ide_version}[ \t]*$/ {die}" "${SOURCE_DIR}/README"; then
+ print_info 1 "Version number in README doesn't match the detected version (${ide_version}), correcting."
+
+ gawk "/^MCU 8051 IDE v[0-9]+\.[0-9]+(\.[0-9]+)?[ \t]*$/ {
+ \$0=\"MCU 8051 IDE v${ide_version}\"
+ }
+ {
+ print(\$0)
+ }
+ " "${SOURCE_DIR}/README" > "/tmp/README" || die
+ mv "/tmp/README" "${SOURCE_DIR}/README" || die
+ else
+ print_info 1 "README is OK!"
+ fi
+ # Check mcu8051ide_win_setup.iss
+ if gawk "/^AppVerName=MCU[ \t]+8051[ \t]+IDE[ \t]+${ide_version}[ \t]*/ {die}" "${SOURCE_DIR}/pkgs/Windows/mcu8051ide_win_setup.iss"; then
+ print_info 1 "Version number in ${SOURCE_DIR}/pkgs/Windows/mcu8051ide_win_setup.iss doesn't match the detected version (${ide_version}), correcting."
+
+ gawk "
+ /^AppVerName=MCU[ \t]+8051[ \t]+IDE[ \t]+[0-9]+\.[0-9]+(\.[0-9]+)?[ \t]*/ {
+ \$0=\"AppVerName=MCU 8051 IDE ${ide_version}\r\" # <-- On MS Windows we want '\r' before '\n'
+ }
+ /\OutputBaseFilename=mcu8051ide-[0-9]+\.[0-9]+(\.[0-9]+)?-setup/ {
+ \$0=\"OutputBaseFilename=mcu8051ide-${ide_version}-setup\"
+ }
+ {
+ print(\$0)
+ }
+ " "${SOURCE_DIR}/pkgs/Windows/mcu8051ide_win_setup.iss" > "/tmp/mcu8051ide_win_setup.iss" || die
+ mv "/tmp/mcu8051ide_win_setup.iss" "${SOURCE_DIR}/pkgs/Windows/mcu8051ide_win_setup.iss" || die
+ else
+ print_info 1 "mcu8051ide_win_setup.iss is OK!"
+ fi
+
+ print_info 2 "Version check complete."
+}
+
+function build_rpm_pkg() {
+ cur_func="build_rpm_pkg"
+ print_info 0 "Building RPM package."
+ print_info 1 "Preparing to build RPM package."
+ version=($(sed 's/\./ /g' <<< ${ide_version}))
+ if [ -z "${version[2]}" ]; then
+ version[2]=0
+ fi
+ version[2]=$(( ${version[2]} + 1 ))
+
+ print_info 1 "Creating special tarball for the rpmbuild: mcu8051ide-${version[0]}.${version[1]}.tar.gz"
+ cd "${PKG_DIR}" || die
+ mv -v "${WORK_DIR}" "mcu8051ide-${version[0]}.${version[1]}" || die
+ tar cvfz "mcu8051ide-${version[0]}.${version[1]}.tar.gz" "mcu8051ide-${version[0]}.${version[1]}" || die
+ mv -v "mcu8051ide-${version[0]}.${version[1]}" "${WORK_DIR}" || die
+
+ print_info 1 "Creating directory structure for rpmbuild."
+ mkdir -v "${WORK_DIR}/rpmbuild" || die
+ for d in BUILD BUILDROOT RPMS SOURCES SPECS SRPMS; do
+ mkdir "${WORK_DIR}/rpmbuild/${d}" || die
+ done
+ mv -v "mcu8051ide-${version[0]}.${version[1]}.tar.gz" "${WORK_DIR}/rpmbuild/SOURCES/" || die
+
+ print_info 1 "Preparing the .spec file."
+ gawk "
+ /^Version:/ {
+ \$0=\"Version: ${version[0]}.${version[1]}\"
+ }
+ /^Release:/ {
+ \$0=\"Release: ${version[2]}\"
+ }
+ {
+ print(\$0)
+ }
+ " "${SOURCE_DIR}/pkgs/RedHat/mcu8051ide.spec" > "${WORK_DIR}/rpmbuild/SPECS/mcu8051ide-${ide_version}.spec" || die
+
+ print_info 1 "Running rpmbuild."
+ local -r PKG_NAME="mcu8051ide-${version[0]}.${version[1]}-${version[2]}.noarch.rpm"
+ if [ -e "${PKG_DIR}/${PKG_NAME}" ]; then
+ rm -v "${PKG_DIR}/${PKG_NAME}"
+ fi
+ cd "${WORK_DIR}/rpmbuild" || die
+ rpmbuild --define "_topdir ${WORK_DIR}/rpmbuild" -bb --target noarch "./SPECS/mcu8051ide-${ide_version}.spec" || die
+
+ mv -v "${WORK_DIR}/rpmbuild/RPMS/noarch/${PKG_NAME}" "${PKG_DIR}" || die
+ results+=" ${COLOR[green]}*${COLOR[none]} ${PKG_DIR}/${PKG_NAME}\n"
+
+ print_info 2 "RPM package successfully created: ${PKG_DIR}/${PKG_NAME}"
+}
+
+function build_deb_pkg() {
+ cur_func="build_deb_pkg"
+ print_info 0 "Building Debian package:"
+
+ print_info 1 "Creating basic directory structure."
+ mkdir -v "${WORK_DIR}/mcu8051ide_debian" || die
+ mkdir -v "${WORK_DIR}/mcu8051ide_debian/DEBIAN" || die
+ mkdir -v "${WORK_DIR}/mcu8051ide_debian/usr" || die
+ mkdir -v "${WORK_DIR}/mcu8051ide_debian/usr/bin" || die
+ mkdir -v "${WORK_DIR}/mcu8051ide_debian/usr/share" || die
+ for d in applications man mcu8051ide pixmaps mime/packages; do
+ mkdir -vp "${WORK_DIR}/mcu8051ide_debian/usr/share/${d}" || die
+ done
+
+ mkdir -v "${WORK_DIR}/mcu8051ide_debian/usr/share/man/man1" || die
+ mkdir -vp "${WORK_DIR}/mcu8051ide_debian/usr/share/mcu8051ide/doc/handbook" || die
+ chmod -vR 0755 "${WORK_DIR}/mcu8051ide_debian" || die
+
+ print_info 1 "Creating program launcher."
+ create_launcher "/usr/share/mcu8051ide/lib/" "${WORK_DIR}/mcu8051ide_debian/usr/bin/"
+
+ print_info 1 "Coping program sources."
+ cp -v "${WORK_DIR}/mcu8051ide.desktop" "${WORK_DIR}/mcu8051ide_debian/usr/share/applications/" || die
+ cp -v "${WORK_DIR}/mcu8051ide.png" "${WORK_DIR}/mcu8051ide_debian/usr/share/pixmaps/" || die
+ cp -v "${WORK_DIR}/application-x-mcu8051ide.xml" "${WORK_DIR}/mcu8051ide_debian/usr/share/mime/packages/" || die
+ cp -v "${WORK_DIR}/doc/man/mcu8051ide.1.gz" "${WORK_DIR}/mcu8051ide_debian/usr/share/man/man1/" || die
+
+ for i in data demo hwplugins icons lib translations LICENSE ChangeLog; do
+ cp -vR "${WORK_DIR}/${i}" "${WORK_DIR}/mcu8051ide_debian/usr/share/mcu8051ide/" || die
+ done
+ cp -v "${WORK_DIR}"/doc/handbook/mcu8051ide.*.pdf "${WORK_DIR}/mcu8051ide_debian/usr/share/mcu8051ide/doc/handbook/" || die
+
+ print_info 1 "Preparing the Debian control file and the md5sums file."
+ # Compute MD5 hashes and generate the md5sums file
+ cd "${WORK_DIR}/mcu8051ide_debian/"
+ md5sum $(find . -type f | awk '/.\// {print(substr($0, 3))}') | tee "DEBIAN/md5sums"
+
+ # Compute the installed size
+ local -i total_size=$(ls -lR "${WORK_DIR}/mcu8051ide_debian/usr" | gawk '
+ BEGIN {
+ sum=0
+ }
+ END {
+ print(int(sum/1024)) # <-- In kB
+ }
+ ($5 != "") {
+ sum+=$5
+ }')
+ # Automatically modify the control file
+ gawk "
+ /^Version:/ {
+ \$0=\"Version: ${ide_version}\"
+ }
+ /^Installed-Size:/ {
+ \$0=\"Installed-Size: ${total_size}\"
+ }
+ {
+ print(\$0)
+ }
+ " "${SOURCE_DIR}/pkgs/Debian/control" > "${WORK_DIR}/mcu8051ide_debian/DEBIAN/control" || die
+
+ local -r PKG_NAME="mcu8051ide-${ide_version}_all.deb"
+ print_info 1 "Running dpkg-deb."
+ if [ -e "${PKG_DIR}/${PKG_NAME}" ]; then
+ rm -v "${PKG_DIR}/${PKG_NAME}"
+ fi
+ cd "${WORK_DIR}" || die
+ dpkg-deb -b mcu8051ide_debian "${PKG_NAME}" || die
+ mv -v "${WORK_DIR}/${PKG_NAME}" "${PKG_DIR}" || die
+
+ results+=" ${COLOR[green]}*${COLOR[none]} ${PKG_DIR}/${PKG_NAME}\n"
+
+ print_info 2 "Debian package successfully created: ${PKG_DIR}/${PKG_NAME}"
+}
+
+function build_freeBSD_pkg() {
+ cur_func="build_deb_pkg"
+ print_info 0 "Building freeBSD package:"
+
+ local -r PKG_NAME="freeBSD-port-mcu8051ide-${ide_version}.tar.gz"
+
+ print_info 1 "Creating basic directory structure."
+ mkdir -v "${WORK_DIR}/freeBSD" || die
+ mkdir -v "${WORK_DIR}/freeBSD/mcu8051ide" || die
+ mkdir -v "${WORK_DIR}/freeBSD/share" || die
+ for d in applications man mcu8051ide pixmaps mime/packages; do
+ mkdir -vp "${WORK_DIR}/freeBSD/share/${d}" || die
+ done
+
+ mkdir -v "${WORK_DIR}/freeBSD/share/man/man1" || die
+ mkdir -vp "${WORK_DIR}/freeBSD/share/mcu8051ide/doc/handbook" || die
+ chmod -vR 0755 "${WORK_DIR}/freeBSD" || die
+
+ print_info 1 "Creating program launcher."
+
+ print_info 1 "Coping program sources."
+ cp -v "${WORK_DIR}/mcu8051ide.desktop" "${WORK_DIR}/freeBSD/share/applications/" || die
+ cp -v "${WORK_DIR}/mcu8051ide.png" "${WORK_DIR}/freeBSD/share/pixmaps/" || die
+ cp -v "${WORK_DIR}/application-x-mcu8051ide.xml" "${WORK_DIR}/freeBSD/share/mime/packages/" || die
+ cp -v "${WORK_DIR}/doc/man/mcu8051ide.1.gz" "${WORK_DIR}/freeBSD/share/man/man1/" || die
+
+ for i in data demo hwplugins icons lib translations LICENSE ChangeLog; do
+ cp -vR "${WORK_DIR}/${i}" "${WORK_DIR}/freeBSD/share/mcu8051ide/" || die
+ done
+ cp -v "${WORK_DIR}"/doc/handbook/mcu8051ide.*.pdf "${WORK_DIR}/freeBSD/share/mcu8051ide/doc/handbook/" || die
+
+ cd "${WORK_DIR}/freeBSD" || die
+ find . -type f | sort | gawk '
+ /\/pkg-plist$/ {
+ next
+ }
+ {
+ print(substr($0, 3, (length($0) - 2) ))
+ }
+ ' | tee mcu8051ide/pkg-plist || die
+ find . -type d | sort -r | gawk '
+ /share\/mcu8051ide/ {
+ printf("@dirrm %s\n", substr($0, 3, (length($0) - 2)) )
+ }
+ ' | tee -a mcu8051ide/pkg-plist || die
+
+ local -r tarball="mcu8051ide-${ide_version}.tar.gz"
+ local -r md5_sum=$(md5sum -b "${PKG_DIR}/${tarball}" | gawk ' { print($1); exit(0) } ')
+ local -r sha256_sum=$(sha256sum -b "${PKG_DIR}/${tarball}" | gawk ' { print($1); exit(0) } ')
+ local -r tgz_size=$(wc -c "${PKG_DIR}/${tarball}" | gawk ' { print($1); exit(0) } ')
+
+ printf "MD5 (${tarball}) = ${md5_sum}\n" > "${WORK_DIR}/freeBSD/mcu8051ide/distinfo"
+ printf "SHA256 (${tarball}) = ${sha256_sum}\n" >> "${WORK_DIR}/freeBSD/mcu8051ide/distinfo"
+ printf "SIZE (${tarball}) = ${tgz_size}\n" >> "${WORK_DIR}/freeBSD/mcu8051ide/distinfo"
+
+ gawk "
+ /<0.0.0>/ {
+ sub(/<0.0.0>/,\"${ide_version}\", \$0)
+ }
+ /<date>/ {
+ sub(/<date>/,\"$(date +%F)\", \$0)
+ }
+ {
+ print(\$0)
+ }
+ " "${SOURCE_DIR}/pkgs/freeBSD/Makefile" > "${WORK_DIR}/freeBSD/mcu8051ide/Makefile" || die
+
+ cp -v "${SOURCE_DIR}/pkgs/freeBSD/pkg-descr" "${WORK_DIR}/freeBSD/mcu8051ide/" || die
+ cp -v "${SOURCE_DIR}/pkgs/freeBSD/README" "${WORK_DIR}/freeBSD/" || die
+ local -r PKG_NAME="freeBSD-port-mcu8051ide-${ide_version}.tar.gz"
+ cd "${WORK_DIR}/freeBSD/" || die
+ tar cvfz "${PKG_NAME}" "README" "mcu8051ide" || die
+ mv -fv "${PKG_NAME}" "${PKG_DIR}/" || die
+
+ results+=" ${COLOR[green]}*${COLOR[none]} ${PKG_DIR}/${PKG_NAME}\n"
+ print_info 2 "freeBSD port files successfully created: ${PKG_DIR}/${PKG_NAME}"
+}
+
+function recompile_demo_project() {
+ cur_func="recompile_demo_project"
+ print_info 0 "Recompiling the Demo project."
+
+ for f in "${SOURCE_DIR}"/demo/*.asm; do
+ if [ ! -e "${f%%.asm}.c" ]; then
+ tclsh "${SOURCE_DIR}/lib/main.tcl" ${nc_opt_long} --no-bin --assemble "$f" || die "Cannot assemble file: $f"
+ fi
+ done
+
+ print_info 2 "Demo project recompiled."
+}
+
+function build_freewrapped_package() {
+ cur_func="build_freewrapped_package"
+ print_info 0 "Creating wrapped package for MS Windows."
+
+ local -r lib_pkg_dir="${SOURCE_DIR}/pkgs/Windows/lib_pkg_dir"
+ local -r fwrp_dir="${SOURCE_DIR}/pkgs/Windows/freewrap"
+ local -r fwrp="${fwrp_dir}/freewrap"
+ local -r fwrpw="${fwrp_dir}/freewrap.exe"
+ local autopath="libraries"
+
+ print_info 1 "Preparing libraries to wrap:"
+ mkdir -v "${WORK_DIR}/libraries" || die
+ chmod -v 0755 "${WORK_DIR}/libraries" || die
+ # Bwidget:
+ print_info 3 "Bwidget"
+ bwidget_loaction=$(dirname $(locate pkgIndex.tcl | grep bwidget | grep '/usr'))
+ if [ "${bwidget_loaction}" == "." ]; then
+ die "Unable to find installed BWidget library, aborting!"
+ fi
+ mkdir -v "${WORK_DIR}/libraries/bwidget" || die
+ chmod -v 0755 "${WORK_DIR}/libraries/bwidget" || die
+ cp -vR "${bwidget_loaction}"/* "${WORK_DIR}/libraries/bwidget/" || die
+ for f in "${WORK_DIR}"/libraries/bwidget/lang/*.rc; do
+ printf "\n" >> $f || die
+ done
+ autopath+=" {libraries/bwidget}"
+ # tcllib/md5
+ print_info 3 "tcllib/md5"
+ md5_loaction=$(dirname $(locate pkgIndex.tcl | grep '/md5/' | grep '/usr'))
+ if [ "${md5_loaction}" == "." ]; then
+ die "Unable to find installed tcllib/md5 library, aborting!"
+ fi
+ mkdir -v "${WORK_DIR}/libraries/md5" || die
+ chmod -v 0755 "${WORK_DIR}/libraries/md5" || die
+ cp -vR "${md5_loaction}"/*.tcl "${WORK_DIR}/libraries/md5/" || die
+ chmod -Rv 0644 "${WORK_DIR}"/libraries/md5/*.tcl || die
+ autopath+=" {libraries/md5}"
+ # tdom:
+ ver=0.8.3
+ print_info 3 "tdom"
+ mkdir -v "${WORK_DIR}/libraries/tdom" || die
+ chmod -v 0755 "${WORK_DIR}/libraries/tdom" || die
+ cp -vR "${lib_pkg_dir}"/tdom${ver}/*.{tcl,dll} "${WORK_DIR}/libraries/tdom/" || die
+ chmod -Rv 0644 "${WORK_DIR}"/libraries/tdom/* || die
+ autopath+=" {libraries/tdom}"
+ # Itcl3.4:
+ print_info 3 "Itcl3.4"
+ mkdir -v "${WORK_DIR}/libraries/itcl" || die
+ chmod -v 0755 "${WORK_DIR}/libraries/itcl" || die
+ cp -v "${lib_pkg_dir}"/Itcl3.4/{itcl34.dll,itcl.tcl} "${WORK_DIR}/libraries/itcl/" || die
+ printf "package ifneeded Itcl 3.4 [list load \"${WORK_DIR}/libraries/itcl/itcl34.dll\"]" > "${WORK_DIR}/libraries/itcl/pkgIndex.tcl"
+ chmod -Rv 0644 "${WORK_DIR}"/libraries/itcl/* || die
+ autopath+=" {libraries/itcl}"
+ # TclX8.4:
+ local -r ver="8.4"
+ print_info 3 "TclX${ver}"
+ mkdir -v "${WORK_DIR}/libraries/tclx${ver}" || die
+ chmod -v 0755 "${WORK_DIR}/libraries/tclx${ver}" || die
+ cp -v "${lib_pkg_dir}"/Tclx${ver}/*.{tcl,dll} "${WORK_DIR}/libraries/tclx${ver}/" || die
+ printf "package ifneeded Tclx ${ver} [list load \"${WORK_DIR}/libraries/tclx${ver}/tclx84.dll\"]" > "${WORK_DIR}/libraries/tclx${ver}/pkgIndex.tcl"
+ chmod -Rv 0644 "${WORK_DIR}"/libraries/tclx${ver}/* || die
+ autopath+=" {libraries/tclx${ver}}"
+ # imgpng:
+ print_info 3 "imgpng-1.4.0.4"
+ mkdir -v "${WORK_DIR}/libraries/img_png" || die
+ chmod -v 0755 "${WORK_DIR}/libraries/img_png" || die
+ cp -v "${lib_pkg_dir}"/img_png1.4.0.4/*.dll "${WORK_DIR}/libraries/img_png/" || die
+ printf "package ifneeded img::png 1.4.0.4 {\n\tload \"${WORK_DIR}/libraries/img_png/zlibtcl12503.dll\"\n\tload \"${WORK_DIR}/libraries/img_png/pngtcl143.dll\"\n\tload \"${WORK_DIR}/libraries/img_png/tkimg1404.dll\"\n\tload \"${WORK_DIR}/libraries/img_png/tkimgpng1404.dll\"\n\tpackage provide img::png 1.4.0.4\n}" > "${WORK_DIR}/libraries/img_png/pkgIndex.tcl"
+ chmod -Rv 0644 "${WORK_DIR}"/libraries/img_png/* || die
+ autopath+=" {libraries/img_png}"
+
+ print_info 1 "Preparing MCU 8051 IDE files and libraries to wrap."
+ mv -vf "${WORK_DIR}/data/tips.xml" "${WORK_DIR}/tips.xml" || die # We don't want this file wrapped in the Windows package
+ true > "${WORK_DIR}/list_of_files_to_wrap.txt" || die
+ for d in lib icons data libraries; do
+ find "${WORK_DIR}/${d}" -type f | tee -a "${WORK_DIR}/list_of_files_to_wrap.txt" || die
+ done
+
+ print_info 1 "Modifying main.tcl to contain proper LIB_DIRNAME and AUTO_PATH_FOR_MS_WINDOWS."
+ gawk "
+ /<AIPCS:AUTO_PATH_FOR_MS_WINDOWS>/ {
+ sub(/\"<AIPCS:AUTO_PATH_FOR_MS_WINDOWS>\"/, \"[list ${autopath}]\", \$0)
+ }
+ /<AIPCS:LIB_DIRNAME_SPECIFIC_FOR_MS_WINDOWS>/ {
+ sub(/<AIPCS:LIB_DIRNAME_SPECIFIC_FOR_MS_WINDOWS>/, \"${WORK_DIR}/lib\", \$0)
+ }
+ {
+ print(\$0)
+ }
+ " "${SOURCE_DIR}/lib/main.tcl" > "${WORK_DIR}/lib/main.tcl" || die
+ chmod -v 0755 ${WORK_DIR}/lib/main.tcl || die
+
+ print_info 1 "Running freewrap."
+ cd "${WORK_DIR}" || die
+ chmod -v 0755 "${fwrp}" || die
+ "${fwrp}" lib/main.tcl -f list_of_files_to_wrap.txt -o mcu8051ide.exe -w "${fwrpw}" -i "${SOURCE_DIR}/pkgs/Windows/mcu8051ide.ico" 2>&1
+ "${fwrp}" lib/external_command.tcl -o external_command.exe -w "${fwrpw}" -i "${SOURCE_DIR}/pkgs/Windows/exec.ico" 2>&1
+ print_info 1 "Freewrap finished."
+
+ if [ -e "${WORK_DIR}/win_pkg_files" ]; then
+ printf "${WORK_DIR}/win_pkg_files directory (or file) already exists, removing."
+ rm -rvf "${WORK_DIR}/win_pkg_files" || die
+ fi
+ mkdir -v "${WORK_DIR}/win_pkg_files" || die
+ chmod 0755 "${WORK_DIR}/win_pkg_files" || die
+ mv -vf "${WORK_DIR}/tips.xml" "${WORK_DIR}/data/tips.xml" || die # We didn't want this file wrapped in the Windows package
+ mv -v "${WORK_DIR}"/*.exe "${WORK_DIR}/win_pkg_files/" || die
+ mv -v "${WORK_DIR}/hwplugins" "${WORK_DIR}/win_pkg_files/" || die
+ mv -v "${WORK_DIR}/data" "${WORK_DIR}/win_pkg_files/" || die
+ mv -v "${WORK_DIR}/demo" "${WORK_DIR}/win_pkg_files/" || die
+ mv -v "${WORK_DIR}/translations" "${WORK_DIR}/win_pkg_files/" || die
+ mkdir -vp "${WORK_DIR}/win_pkg_files/doc/handbook" || die
+ mv -v "${WORK_DIR}"/doc/handbook/*.pdf "${WORK_DIR}/win_pkg_files/doc/handbook" || die
+
+ print_info 1 "Attempting to run the Inno Setup in Wine in order to create the Windows installation package."
+ inno_setup_successful=0
+ inno_setup=$(locate Compil32.exe | grep 'Inno Setup')
+ if [ ! -z "$inno_setup" ]; then
+ local response=""
+ if (( ! ${options[inno]} )); then
+ printf "Inno Setup program found, make sure that you have set Widnows drive W: to \"${SOURCE_DIR}\".\nDo you want to proceed? [yes] "
+ read response
+ fi
+ if [[ "$response" == "" || "$response" == "y" || "$response" == "yes" ]]; then
+ rm -v "${PKG_DIR}/mcu8051ide-${ide_version}-setup.exe"
+ printf "Attempting to run the Inno Setup"
+ wine "$inno_setup" /cc "W:\\mcu8051ide\\pkgs\\Windows\\mcu8051ide_win_setup.iss" && inno_setup_successful=1
+ fi
+ else
+ printf "Inno Setup program not found."
+ fi
+
+ if [ -e "${PKG_DIR}/mcu8051ide-${ide_version}-setup.exe" ]; then
+ results+=" ${COLOR[green]}*${COLOR[none]} ${PKG_DIR}/mcu8051ide-${ide_version}-setup.exe\n"
+ print_info 2 "Windows package complete: ${PKG_DIR}/mcu8051ide-${ide_version}-setup.exe"
+ else
+ results+=" ${COLOR[green]}*${COLOR[none]} ${WORK_DIR}/win_pkg_files\n"
+ print_info 2 "Windows package complete: ${WORK_DIR}/win_pkg_files"
+ fi
+}
+
+function create_ebuild() {
+ cur_func="create_ebuild"
+ print_info 0 "Creating ebuild for Gentoo Linux."
+
+ local -r PKG_NAME="Gentoo-ebuild-mcu8051ide-${ide_version}.tar.gz"
+ if [ -e "${PKG_DIR}/${PKG_NAME}" ]; then
+ rm -v "${PKG_DIR}/${PKG_NAME}"
+ fi
+
+ mkdir -v "${WORK_DIR}/gentoo-ebuild" || die
+ gawk "
+ /0\.0\.0/ {
+ gsub(/0\.0\.0/, \"${ide_version}\", \$0)
+ }
+ {
+ print(\$0)
+ }
+ " "${SOURCE_DIR}/pkgs/Gentoo/README" > "${WORK_DIR}/gentoo-ebuild/README" || die
+ cp -v "${SOURCE_DIR}/pkgs/Gentoo/mcu8051ide.ebuild" "${WORK_DIR}/gentoo-ebuild/mcu8051ide-${ide_version}.ebuild" || die
+ chmod -v 0644 "${WORK_DIR}"/gentoo-ebuild/* || die
+ cd "${WORK_DIR}/gentoo-ebuild" || die
+ tar cvfz "${PKG_NAME}" "README" "mcu8051ide-${ide_version}.ebuild" || die
+ mv -v "${PKG_NAME}" "${PKG_DIR}" || die
+ rm -rfv "${WORK_DIR}/gentoo-ebuild" || die
+ results+=" ${COLOR[green]}*${COLOR[none]} ${PKG_DIR}/${PKG_NAME}\n"
+
+ print_info 2 "Gentoo ebuild complete: ${PKG_DIR}/${PKG_NAME}"
+}
+
+function final_report() {
+ cur_func="final_report"
+ printf "\nProcess successfully finished, resulting packages are:\n${results}\n"
+}
+
+function create_final_readme() {
+ local -r README_FILE="${PKG_DIR}/readme.txt"
+
+ local source_pkg=
+ local deb_pkg=
+ local rpm_pkg=
+ local ebuild_pkg=
+ local arch_pkg=
+ local windows_pkg=
+ local bsd_pkg=
+
+ if (( ${options[tar]} || ${options[arch]} )); then
+ source_pkg="mcu8051ide-${ide_version}.tar.gz"
+ fi
+ if (( ${options[arch]} )); then
+ arch_pkg="Arch-PKGBUILD-mcu8051ide-${ide_version}.tar.gz"
+ fi
+ if (( ${options[ebuild]} )); then
+ ebuild_pkg="Gentoo-ebuild-mcu8051ide-${ide_version}.tar.gz"
+ fi
+ if (( ${options[rpm]} )); then
+ rpm_pkg="mcu8051ide-${version[0]}.${version[1]}-${version[2]}.noarch.rpm"
+ fi
+ if (( ${options[deb]} )); then
+ deb_pkg="mcu8051ide-${ide_version}_all.deb"
+ fi
+ if (( ${options[windows]} )); then
+ windows_pkg="mcu8051ide-${ide_version}-setup.exe"
+ fi
+ if (( ${options[freeBSD]} )); then
+ bsd_pkg="freeBSD-port-mcu8051ide-${ide_version}.tar.gz"
+ fi
+
+ if [ ! -z "${source_pkg}" ]; then
+ printf "Source code package: %s\n" "${source_pkg}" > "${README_FILE}" || die
+ fi
+ printf "\n" >> "${README_FILE}" || die
+ printf "Installation files\n" >> "${README_FILE}" || die
+ printf " - Linux systems\n" >> "${README_FILE}" || die
+ if [ ! -z "${deb_pkg}" ]; then
+ printf " - Ubuntu, etc.: %s\n" "${deb_pkg}" >> "${README_FILE}" || die
+ fi
+ if [ ! -z "${rpm_pkg}" ]; then
+ printf " - Fedora, etc.: %s\n" "${rpm_pkg}" >> "${README_FILE}" || die
+ fi
+ if [ ! -z "${ebuild_pkg}" ]; then
+ printf " - Gentoo Linux: %s\n" "${ebuild_pkg}" >> "${README_FILE}" || die
+ fi
+ if [ ! -z "${arch_pkg}" ]; then
+ printf " - Arch Linux: %s\n" "${arch_pkg}" >> "${README_FILE}" || die
+ fi
+ if [ ! -z "${windows_pkg}" ]; then
+ printf " - Windows XP/7: %s\n" "${windows_pkg}" >> "${README_FILE}" || die
+ fi
+ if [ ! -z "${bsd_pkg}" ]; then
+ printf " - freeBSD: %s\n" "${bsd_pkg}" >> "${README_FILE}" || die
+ fi
+ printf "\n" >> "${README_FILE}" || die
+ printf "In case you trouble with any of these files, or you have a suggestion how to\n" >> "${README_FILE}" || die
+ printf "make them better, please write an email to the author of the project:\n" >> "${README_FILE}" || die
+ printf "martin \DOT osmera \AT gmail \DOT com.\n" >> "${README_FILE}" || die
+
+ results+=" ${COLOR[green]}*${COLOR[none]} ${README_FILE}\n"
+}
+
+function die() {
+ printf "\n${COLOR[red]}!!!${COLOR[none]} ${COLOR[bold]}Function %s() failed.${COLOR[none]}\n" "${cur_func}"
+ if [ ! -z "${1}" ]; then
+ printf "${COLOR[red]}!!!${COLOR[none]} ${COLOR[bold]}Message: %s${COLOR[none]}\n" "${1}"
+ fi
+ exit 1
+}
+
+function print_info() {
+ case "${1}" in
+ 0)
+ printf "\n${COLOR[blue]}...${COLOR[none]}\n"
+ printf "${COLOR[blue]}...${COLOR[none]} ${COLOR[bold]}%s${COLOR[none]}\n" "${2}"
+ printf "${COLOR[blue]}...${COLOR[none]}\n\n"
+ ;;
+ 1)
+ printf "\n${COLOR[yellow]}>>>${COLOR[none]} ${COLOR[bold]}%s${COLOR[none]}\n\n" "${2}"
+ ;;
+ 2)
+ printf "\n${COLOR[green]}###${COLOR[none]}\n"
+ printf "${COLOR[green]}###${COLOR[none]} ${COLOR[bold]}%s${COLOR[none]}\n" "${2}"
+ printf "${COLOR[green]}###${COLOR[none]}\n\n"
+ ;;
+ 3)
+ printf "\n${COLOR[cyan]} * ${COLOR[none]} ${COLOR[bold]}%s${COLOR[none]}\n\n" "${2}"
+ ;;
+ ?) die "Invalid level specification: ${1}"
+ ;;
+ esac
+}
+
+function define_colors() {
+ if (( ${options[nocolor]} == 0 )); then
+ COLOR=(
+ [none]="\033[m" [red]="\033[1;31m" [green]="\033[1;32m"
+ [yellow]="\033[1;33m" [blue]="\033[1;34m" [purple]="\033[1;35m"
+ [cyan]="\033[1;36m" [bold]="\033[1m"
+ )
+ fi
+}
+
+function print_help() {
+local -r help_message=$(cat << EOF
+Script for automated creation of various installation packages, written for
+MCU 8051 IDE. This software is distributed under the terms of GNU GPLv2 license.
+
+This script is intended for ${COLOR[bold]}development purposes${COLOR[none]} concerning the MCU 8051 IDE
+project, if have found a bug in this script, please contact its author:
+Martin Ošmera <mailto:martin.osmera@gmail.com>.
+
+${COLOR[bold]}Basic options:${COLOR[none]}
+ ${COLOR[green]}-a${COLOR[none]} Do it all, it's equivalent to "${COLOR[green]}-sfpomterdwic${COLOR[none]}"
+ ${COLOR[green]}-n${COLOR[none]} Disable color output.
+ ${COLOR[green]}-h${COLOR[none]} Print this message.
+
+${COLOR[bold]}Advanced options:${COLOR[none]}
+ ${COLOR[green]}-s${COLOR[none]} Run tests:
+ ${COLOR[blue]}a)${COLOR[none]} check whether all programs required to run this script are available,
+ ${COLOR[blue]}b)${COLOR[none]} check for presence libraries required by MCU 8051 IDE,
+ ${COLOR[blue]}c)${COLOR[none]} run regression test.
+ ${COLOR[green]}-f${COLOR[none]} Check and fix version number in README, etc. files.
+ ${COLOR[green]}-p${COLOR[none]} Rebuild PDF documentation files.
+ ${COLOR[green]}-o${COLOR[none]} Rebuild demonstration project.
+ ${COLOR[green]}-m${COLOR[none]} Update translation files and the translation template.
+ ${COLOR[green]}-t${COLOR[none]} Create source code tarball.
+ ${COLOR[green]}-e${COLOR[none]} Create tarball with Portage ebuild (for Gentoo Linux).
+ ${COLOR[green]}-r${COLOR[none]} Create RPM package.
+ ${COLOR[green]}-d${COLOR[none]} Create Deb package.
+ ${COLOR[green]}-x${COLOR[none]} Create pacman package (for Arch Linux).
+ ${COLOR[green]}-w${COLOR[none]} Create Windows .exe files.
+ ${COLOR[green]}-i${COLOR[none]} Automatically run Inno Setup in Wine in order to build Windows
+ installation package.
+ ${COLOR[green]}-c${COLOR[none]} Clean up the source directory structure, i.e. remove redundant files.
+ ${COLOR[green]}-j${COLOR[none]} Create readme.txt file explaining which package is for what.
+
+${COLOR[bold]}Examples of usage:${COLOR[none]}
+ ${COLOR[blue]}*${COLOR[none]} ${SCRIPT_NAME} ${COLOR[green]}-a${COLOR[none]}
+ -- Simply do everything we can, recommended way of usage.
+
+ ${COLOR[blue]}*${COLOR[none]} ${SCRIPT_NAME} ${COLOR[green]}-c${COLOR[none]}
+ -- Don't build anything, just clean up the source directory.
+
+ ${COLOR[blue]}*${COLOR[none]} ${SCRIPT_NAME} ${COLOR[green]}-mop${COLOR[none]}
+ -- Update translations (${COLOR[green]}-m${COLOR[none]}), rebuild the Demo project (${COLOR[green]}-o${COLOR[none]}), rebuild PDF
+ documentation (${COLOR[green]}-p${COLOR[none]}).
+
+ ${COLOR[blue]}*${COLOR[none]} ${SCRIPT_NAME} ${COLOR[green]}-r${COLOR[none]}
+ -- Skip all tests, rebuilds, etc., and build RPM package right away. This is
+ strongly unrecommended.
+
+${COLOR[bold]}Notes:${COLOR[none]}
+ ${COLOR[blue]}*${COLOR[none]} If you are about to create Windows installer, ${COLOR[bold]}read the README file first!${COLOR[none]}
+ ${COLOR[blue]}*${COLOR[none]} The order of operations is fixed, i.e. it is not affected by the order of
+ provided command line switches.
+ ${COLOR[blue]}*${COLOR[none]} When using the ${COLOR[green]}-w${COLOR[none]} switch, the script becomes interactive, to avoid that
+ either use the switch along with the ${COLOR[green]}-i${COLOR[none]} switch, or don't use it at all.
+ ${COLOR[blue]}*${COLOR[none]} Resulting packages will be created in the same directory as this script is
+ located.
+ ${COLOR[blue]}*${COLOR[none]} Location from which the script is run does not affect operations of the
+ script in any way.
+ ${COLOR[blue]}*${COLOR[none]} In case of an error, some temporary files or directories might remain at the
+ location of this script. To get rid of them, you might use:
+ "${SCRIPT_NAME} ${COLOR[green]}-c${COLOR[none]}".
+ ${COLOR[blue]}*${COLOR[none]} This script counts on that you have already properly installed MCU 8051 IDE.
+EOF
+)
+printf "${help_message}\n\n"
+}
+
+function_touch_all() {
+ find "${SOURCE_DIR}" -type f | while read f; do
+ touch --no-create "$f"
+ done
+}
+
+function main() {
+ cd "$(dirname "${0}")"
+
+ PKG_DIR="$(pwd)"
+ SOURCE_DIR="${PKG_DIR}/.."
+ WORK_DIR="${PKG_DIR}/installation_sandbox"
+ SCRIPT_NAME="$(basename "${0}")"
+
+ local invalid_options=""
+
+ if [ "$#" == "0" ]; then
+ print_help
+ exit 1
+ fi
+
+ while getopts ":acdefhijkmnoprstwx" opt; do
+ case "$opt" in
+ h) options[help]=1;;
+ n) options[nocolor]=1;;
+ s) options[tests]=1;;
+ f) options[version]=1;;
+ p) options[pdf]=1;;
+ o) options[demo]=1;;
+ m) options[msg]=1;;
+ t) options[tar]=1;;
+ e) options[ebuild]=1;;
+ r) options[rpm]=1;;
+ d) options[deb]=1;;
+ x) options[arch]=1;;
+ w) options[windows]=1;;
+ c) options[clear]=1;;
+ i) options[inno]=1;;
+ j) options[readme]=1;;
+ k) options[freeBSD]=1;;
+ a) options[tests]=1
+ options[version]=1
+ options[pdf]=1
+ options[demo]=1
+ options[msg]=1
+ options[tar]=1
+ options[ebuild]=1
+ options[rpm]=1
+ options[deb]=1
+ options[arch]=1
+ options[windows]=1
+ options[inno]=1
+ options[readme]=1
+ options[freeBSD]=1
+ options[clear]=1 ;;
+ ?) invalid_options+=" ${OPTARG}";;
+ esac
+ done
+ define_colors
+
+ if (( ${options[nocolor]} )); then
+ nc_opt_long="--nocolor"
+ nc_opt_short="-n"
+ fi
+
+ if [ ! -z "$invalid_options" ]; then
+ for opt in $invalid_options; do
+ printf "${COLOR[reg]}ERROR:${COLOR[none]} Invalid option: %s\n" "${opt}" > /dev/stderr
+ done
+
+ printf "\n"
+ print_help
+ exit 1
+ fi
+
+ if (( ${options[help]} )); then
+ print_help
+ exit 0
+ fi
+
+ print_info 1 "Changing current directory to: ${SOURCE_DIR}"
+ cd "${SOURCE_DIR}" || die
+
+ function_touch_all
+ detect_version
+ if (( ${options[tests]} )); then
+ basic_tests
+ fi
+ if (( ${options[version]} )); then
+ check_version
+ fi
+ if (( ${options[pdf]} )); then
+ create_pdf_doc
+ fi
+ if (( ${options[demo]} )); then
+ recompile_demo_project
+ fi
+ if (( ${options[msg]} )); then
+ update_msg_files
+ fi
+ create_sandbox
+ if (( ${options[tests]} )); then
+ recheck_RTE
+ fi
+ finalize_sandbox
+ if (( ${options[tar]} || ${options[arch]} || ${options[freeBSD]} )); then
+ create_tarball
+ fi
+ rm_sctar_files
+ if (( ${options[arch]} )); then
+ create_pacman_package
+ fi
+ if (( ${options[ebuild]} )); then
+ create_ebuild
+ fi
+ if (( ${options[rpm]} )); then
+ build_rpm_pkg
+ fi
+ if (( ${options[deb]} )); then
+ build_deb_pkg
+ fi
+ if (( ${options[freeBSD]} )); then
+ build_freeBSD_pkg
+ fi
+ if (( ${options[windows]} )); then
+ build_freewrapped_package
+ fi
+ if (( ${options[clear]} )); then
+ clear_source_dir
+ fi
+ if (( ${options[readme]} )); then
+ create_final_readme
+ fi
+ remove_sandbox
+ final_report
+}
+
+main "$@"
diff --git a/regression_tests/README b/regression_tests/README
new file mode 100644
index 0000000..73ea531
--- /dev/null
+++ b/regression_tests/README
@@ -0,0 +1,129 @@
+Regression testing environment
+==============================
+
+== THIS IS MERELY A PRELIMINARY DOCUMENT DRAFT ==
+
+
+What is regression testing
+---------------------------
+"Regression testing is any type of software testing that seeks to uncover
+software errors by partially retesting a modified program. The intent of
+regression testing is to provide a general assurance that no additional errors
+were introduced in the process of fixing other problems."
+ – Wikipedia, Regression testing –
+
+Implementation of this regression testing environment
+-----------------------------------------------------
+Each test have its own directory, like 'test_of_something' or 'another_test',
+let's call this directory the test directory. Each test consist of a set of test
+cases. Each test case should test one and only one specific function of the
+tested software. Test cases are represented by files with extension '.in'
+located in directory named 'testcases' inside the test directory. Directory
+'results' inside the test directory should be left empty, it is used by the
+testing environment for storing temporary files generated during the test. The
+'testcases' directory should also contain files intended for comparison with
+files generated during the test and stored in the 'results' directory, these
+files must have extension '.<x>.exp'. Where '<x>' must be substituted with
+extension of a file which this file is supposed to be compared to. In another
+words, if I want to check whether for example './results/something.abc' was
+generated as it should be, I have to create file './testcases/something.abc.exp'
+and this file will be automatically compared with './results/something.abc'. And
+that's it! This is simple, isn't it? It's just about comparing files. But are
+the tests run and how the files in the 'results' directory gets generated? For
+that we need some Bash script, which is used to run the test, let's call this
+script the runtest script. The runtest script must be located in the test
+directory and must include the 'rte.lib.sh' file, using the 'source' command
+(or '.' command). this script should have set permissions to be executable and
+this script specifies how exactly should be the test performed and also runs the
+test itself. When the script is about to exit, this condition is trapped and the
+'rte.lib.sh' reacts by starting the test. So there is no need to explicitly run
+the test by invocing some function or something like that. It runs the test
+automatically when there is nothing else to do.
+
+
+How to write the runtest script -- and example of such script
+-------------------------------------------------------------
+ #! /bin/bash
+
+ cd "somewhere"
+
+ # Load regression test environment
+ source "rte.lib.sh"
+ # Set name of the tested subject
+ RTE_TEST_NAME="Some software"
+
+ # Function to performing the test
+ function rte_perform_test() {
+ # This is will be executed in the 'results' directory
+ the_program_which_I_need_to_test --option something || return 1
+ }
+
+
+An example output from the runtest script
+-----------------------------------------
+ ===========================================================
+ Starting Assembler regression testing ... 3 testcases to go
+ ===========================================================
+ Testcase: "001_Trivial_test" [OK]
+ Testcase: "002_Dummy_test" [OK]
+ Testcase: "003 dummy test" [OK]
+ -----------------------------------------------------------
+ Statistic:
+ TOTAL: 3
+ SUCCESSFUL: 3
+ FAILED: 0
+ ===========================================================
+
+
+More about the runtest scripts
+------------------------------
+All client (user accessible) functions and variables are prefixed with either
+'rte_' or 'RTE_' meaning Regression Testing Environment. And there are a few
+other functions like 'rte_perform_test', note that all these functions runs in
+the 'results' directory. Let's take a look at them:
+
+* function 'rte_before_test':
+ Do something which has to be done prior to the test itself
+* function 'rte_perform_test':
+ Perform the test
+* function 'rte_after_test':
+ Do something which has to be done after the test case had been done
+* function 'rte_modify_output_files':
+ Do something which has to be done with the test case output files, for
+ instance remove certain line from certain files
+* function 'rte_check_result':
+ Compare output files with expected results in order to determinate
+ whether it
+
+You can also set these variables:
+RTE_TEST_NAME - String: Name of the tested program or functionality
+RTE_LINE_WIDTH - Integer: Width of the terminal window
+RTE_ALLOW_BINKING_TEXT - Boolean: Display '[IN PROGRESS]' as blinking text
+
+Note that, if you won't set RTE_LINE_WIDTH, the runtest script will use output
+from command 'tput cols' to determinate actual width of the terminal window.
+
+
+Command line options to the runtest script
+------------------------------------------
+Run './runtest -h' for more details ...
+
+ -t testcase Run specific test case
+ -V Print version information
+ -n Disable color output
+ -h Show help message
+
+* When run without any options it will run all found test cases.
+
+
+Software requirements
+---------------------
+ - Bash
+ - gawk
+ - m4
+
+
+Notes
+-----
+
+See the 'rte.lib.sh' file for more details.
diff --git a/regression_tests/assembler/README b/regression_tests/assembler/README
new file mode 100644
index 0000000..b1c14f2
--- /dev/null
+++ b/regression_tests/assembler/README
@@ -0,0 +1,14 @@
+MCU 8051 IDE built-in assembler regression testing
+--------------------------------------------------
+
+Directory testcases contains .in files used by RTE (Regression Testing
+Environment) to formulate command line switches for assembler for each specific
+test case. Each of these files posses one test case along with an .asm file with
+the same base name as the .in file has. This .asm is be compiled by assembler
+during the test and the resulting .hex and .lst files are be then compared to
+their expected content, files .exp.hex and .exp.lst in the testcase directory.
+Each file generated by the assembler is stored in directory named results. Each
+file which is supposed to be compared to its .exp.<something> file is processed
+by an AWK script before the file content comparison takes place. That allows to
+alter the file in a almost any way. Each test case can have its own specific AWK
+script to alter only its results and not others.
diff --git a/regression_tests/assembler/modify_output_file.hex.awk b/regression_tests/assembler/modify_output_file.hex.awk
new file mode 100644
index 0000000..901e365
--- /dev/null
+++ b/regression_tests/assembler/modify_output_file.hex.awk
@@ -0,0 +1,13 @@
+#! /usr/bin/gawk -f
+
+# --------------------------------------------------------------------------
+# Auxiliary script for regression testing environment
+#
+# Modify Intel® 8 HEX files generated by assembler, file extension is `.hex'
+# --------------------------------------------------------------------------
+
+
+# Just copy input to output
+{
+ print($0)
+}
diff --git a/regression_tests/assembler/modify_output_file.lst.awk b/regression_tests/assembler/modify_output_file.lst.awk
new file mode 100644
index 0000000..3cb114e
--- /dev/null
+++ b/regression_tests/assembler/modify_output_file.lst.awk
@@ -0,0 +1,23 @@
+#! /usr/bin/gawk -f
+
+# --------------------------------------------------------------------------
+# Auxiliary script for regression testing environment
+#
+# Modify code listing files generated by assembler, file extension is `.lst'
+# --------------------------------------------------------------------------
+
+
+# Remove the firts line in the code listin
+1 == NR {
+ next
+}
+
+# Remove symbol table
+/ASSEMBLY COMPLETE/ {
+ exit(0)
+}
+
+# Keep everyting else ...
+{
+ print($0)
+}
diff --git a/regression_tests/assembler/process_in_file b/regression_tests/assembler/process_in_file
new file mode 100644
index 0000000..6c2c0b5
--- /dev/null
+++ b/regression_tests/assembler/process_in_file
@@ -0,0 +1,30 @@
+#! /bin/bash
+
+# --------------------------------------------------------------------------
+# Auxiliary script for regression testing environment
+#
+# This script transforms .in files for assembler regression testing into a list
+# of command line switches, which are then passed to the assembler. This
+# process is done in this way, all comments and empty lines are removed and the
+# rest in then concatenated to from a single line. After this all white space
+# is shortened.
+#
+# Software requirements:
+# - gawk
+# --------------------------------------------------------------------------
+
+gawk '
+ BEGIN {
+ ORS=" "
+ }
+
+ {
+ sub(/#.*$/, "", $0)
+ print($0)
+ }
+' "${1}" | gawk '
+ {
+ gsub(/[[:space:]]+/, " ", $0)
+ printf("%s", $0)
+ }
+'
diff --git a/regression_tests/assembler/runtest b/regression_tests/assembler/runtest
new file mode 100755
index 0000000..2644baf
--- /dev/null
+++ b/regression_tests/assembler/runtest
@@ -0,0 +1,32 @@
+#! /bin/bash
+
+# --------------------------------------------------------------------------
+#
+# MCU 8051 IDE assembler regression testing
+#
+# This script defines what and how is suppose to be tested and runs the tests.
+# See README files for more information.
+#
+# --------------------------------------------------------------------------
+
+
+## Prepare regression tests environment
+source "$(dirname $0)/../rte.lib.sh" # Load regression test environment
+RTE_TEST_NAME="Assembler" # Set name of the tested subject
+
+
+readonly ASSEMBLER_COMMAND="tclsh ../../../lib/main.tcl --assemble"
+
+function rte_before_test() {
+ # Create symbolic link to the source code file
+ ln -fs "../testcases/${1}.asm" . || return 1
+}
+
+function rte_perform_test() {
+ $ASSEMBLER_COMMAND "${1}.asm" $(bash ../process_in_file "../testcases/${1}.in") --nocolor || return 1
+}
+
+function rte_after_test() {
+ # Remove symbolic link to the source code file
+ rm -f "${1}.asm" || return 1
+}
diff --git a/regression_tests/assembler/testcases/001_Trivial_test.asm b/regression_tests/assembler/testcases/001_Trivial_test.asm
new file mode 100644
index 0000000..e2020e6
--- /dev/null
+++ b/regression_tests/assembler/testcases/001_Trivial_test.asm
@@ -0,0 +1,7 @@
+ org 0
+
+m: mov A, #55h
+ cpl A
+ sjmp m
+
+ end
diff --git a/regression_tests/assembler/testcases/001_Trivial_test.hex.exp b/regression_tests/assembler/testcases/001_Trivial_test.hex.exp
new file mode 100644
index 0000000..fcf6317
--- /dev/null
+++ b/regression_tests/assembler/testcases/001_Trivial_test.hex.exp
@@ -0,0 +1,2 @@
+:050000007455F480FBC3
+:00000001FF
diff --git a/regression_tests/assembler/testcases/001_Trivial_test.in b/regression_tests/assembler/testcases/001_Trivial_test.in
new file mode 100644
index 0000000..952e27f
--- /dev/null
+++ b/regression_tests/assembler/testcases/001_Trivial_test.in
@@ -0,0 +1,20 @@
+# --compile asm_file Compile asm file and exit
+# --iram-size size Set size of internal data memory (eg. 1K or 1024) (default: 0x100)
+ # --code-size size Set size of program memory (eg. 1K or 1024) (default: 0x10000)
+# --xram-size size Set size of external data memory (eg. 1K or 1024) (default: 0x10000)
+ # --no-opt Disable optimalizations
+ # --comp-quiet Suppress compiler console output
+ # --no-sim Do not generate SIM file (for MCU 8051 IDE simulator)
+ # --no-bin Do not generate binary object code
+ # --no-lst Do not generate code listing
+# --no-hex Do not generate IHEX8 object code
+ # --warning-level N Set compiler warning level
+ # 3 - Nothing
+ # 2 - Errros only
+ # 1 - Errors + Warnings
+ # 0 - All (Default)
+
+
+
+ #--no-sim # sdfsdf
+
diff --git a/regression_tests/assembler/testcases/001_Trivial_test.lst.exp b/regression_tests/assembler/testcases/001_Trivial_test.lst.exp
new file mode 100644
index 0000000..bcd247d
--- /dev/null
+++ b/regression_tests/assembler/testcases/001_Trivial_test.lst.exp
@@ -0,0 +1,7 @@
+ 1 org 0
+ 2
+0000 7455 3 m: mov A, #55h
+0002 F4 4 cpl A
+0003 80FB 5 sjmp m
+ 6
+ 7 end
diff --git a/regression_tests/assembler/testcases/002_Dummy_test.asm b/regression_tests/assembler/testcases/002_Dummy_test.asm
new file mode 100644
index 0000000..e2020e6
--- /dev/null
+++ b/regression_tests/assembler/testcases/002_Dummy_test.asm
@@ -0,0 +1,7 @@
+ org 0
+
+m: mov A, #55h
+ cpl A
+ sjmp m
+
+ end
diff --git a/regression_tests/assembler/testcases/002_Dummy_test.hex.exp b/regression_tests/assembler/testcases/002_Dummy_test.hex.exp
new file mode 100644
index 0000000..fcf6317
--- /dev/null
+++ b/regression_tests/assembler/testcases/002_Dummy_test.hex.exp
@@ -0,0 +1,2 @@
+:050000007455F480FBC3
+:00000001FF
diff --git a/regression_tests/assembler/testcases/002_Dummy_test.in b/regression_tests/assembler/testcases/002_Dummy_test.in
new file mode 100644
index 0000000..1522865
--- /dev/null
+++ b/regression_tests/assembler/testcases/002_Dummy_test.in
@@ -0,0 +1,4 @@
+ # --no-sim # Do not generate SIM file (for MCU 8051 IDE simulator)
+ # --no-bin # Do not generate binary object code
+ # --no-lst # Do not generate code listing
+# --no-hex # Do not generate IHEX8 object code \ No newline at end of file
diff --git a/regression_tests/assembler/testcases/002_Dummy_test.lst.exp b/regression_tests/assembler/testcases/002_Dummy_test.lst.exp
new file mode 100644
index 0000000..bcd247d
--- /dev/null
+++ b/regression_tests/assembler/testcases/002_Dummy_test.lst.exp
@@ -0,0 +1,7 @@
+ 1 org 0
+ 2
+0000 7455 3 m: mov A, #55h
+0002 F4 4 cpl A
+0003 80FB 5 sjmp m
+ 6
+ 7 end
diff --git a/regression_tests/assembler/testcases/003 dummy test.asm b/regression_tests/assembler/testcases/003 dummy test.asm
new file mode 100644
index 0000000..e2020e6
--- /dev/null
+++ b/regression_tests/assembler/testcases/003 dummy test.asm
@@ -0,0 +1,7 @@
+ org 0
+
+m: mov A, #55h
+ cpl A
+ sjmp m
+
+ end
diff --git a/regression_tests/assembler/testcases/003 dummy test.hex.exp b/regression_tests/assembler/testcases/003 dummy test.hex.exp
new file mode 100644
index 0000000..fcf6317
--- /dev/null
+++ b/regression_tests/assembler/testcases/003 dummy test.hex.exp
@@ -0,0 +1,2 @@
+:050000007455F480FBC3
+:00000001FF
diff --git a/regression_tests/assembler/testcases/003 dummy test.in b/regression_tests/assembler/testcases/003 dummy test.in
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/regression_tests/assembler/testcases/003 dummy test.in
diff --git a/regression_tests/assembler/testcases/003 dummy test.lst.exp b/regression_tests/assembler/testcases/003 dummy test.lst.exp
new file mode 100644
index 0000000..bcd247d
--- /dev/null
+++ b/regression_tests/assembler/testcases/003 dummy test.lst.exp
@@ -0,0 +1,7 @@
+ 1 org 0
+ 2
+0000 7455 3 m: mov A, #55h
+0002 F4 4 cpl A
+0003 80FB 5 sjmp m
+ 6
+ 7 end
diff --git a/regression_tests/rte.lib.sh b/regression_tests/rte.lib.sh
new file mode 100644
index 0000000..5cc6348
--- /dev/null
+++ b/regression_tests/rte.lib.sh
@@ -0,0 +1,654 @@
+#! /bin/bash
+
+############################################################################
+# Copyright (C) 2010 by Martin Osmera #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+#
+# This file servers as a small simple library implementing regression testing
+# environment. It should be included in a bash script which runs the test. There
+# are a few Bash function which can be redefined in the client script to alter
+# behavior of the test environment. They are: rte_before_test, rte_after_test,
+# rte_modify_output_files, rte_check_result. Function rte_perform_test must be
+# redefined and this funtion defines how are the tests performed.
+#
+# See the README file provided along with this Bash script for details.
+#
+# Software requirements:
+# - Bash
+# - Gawk (recommended)
+# --------------------------------------------------------------------------
+
+
+# ------------------------------------------------------------------------------
+# SPECIAL VARIABLES, WHICH CAN BE REDEFINED IN CLIENT SCRIPTS
+# ------------------------------------------------------------------------------
+
+# Name of the tested subject
+declare RTE_TEST_NAME=$'\b'
+# With of the terminal window (number of text columns)
+declare RTE_LINE_WIDTH=
+# Allow blinking texts to be printed
+declare -i RTE_ALLOW_BINKING_TEXT=0
+
+# ------------------------------------------------------------------------------
+# TEST FUNCTIONS TO BE USED IN CLIENT SCRIPTS
+# ------------------------------------------------------------------------------
+
+## Do something which has to be done prior to the test itself
+ # @note This function can be redefined in the client code
+ # @parm String - Name of the test case currently being evaluated
+ # @return 0 == Success; 1 == failure
+function rte_before_test() {
+ _implicit_rte_function
+ return 0
+}
+
+## Perform the test
+ # @warning This function MUST BE REDEFINED in the client code
+ # @parm String - Name of the test case currently being evaluated
+ # @return 0 == Success; 1 == failure
+function rte_perform_test() {
+ _implicit_rte_function
+
+ _last_error="ERROR: Function rte_perform_test was not redefined!"
+
+ printf "ERROR: Function rte_perform_test was not redefined!\n"
+ printf " Read the README file for more information.\n"
+
+ return 1
+}
+
+## Do something which has to be done after the test case had been done
+ # @note This function can be redefined in the client code
+ # @parm String - Name of the test case currently being evaluated
+ # @return 0 == Success; 1 == failure
+function rte_after_test() {
+ _implicit_rte_function
+ return 0
+}
+
+## Do something which has to be done with the test case output files, for
+ #+ instance remove certain line from certain files
+ # @note This function can be redefined in the client code
+ # @parm String - Name of the test case currently being evaluated
+ # @return 0 == Success; 1 == failure
+function rte_modify_output_files() {
+ # Local variables
+ local filetype
+
+ # Mention that this is an implicit function in the log
+ _implicit_rte_function
+
+ # Ensure that we are in the directory with the temporary output files
+ cd "${_TEST_DIR}/results"
+
+ # Apply AWK scripts to all of the result files, which has to be compared
+ #+ with .exp files (expected results)
+ for exp_file in "../testcases/${1}."*.exp; do
+ # Abort if there are no .exp files
+ if [ "$exp_file" == "../testcases/${1}.*.exp" ]; then
+ break
+ fi
+
+ # Determinate file extension of the output file to modify
+ filetype="$(basename "$exp_file")"
+ filetype="${filetype%.exp}"
+ filetype="${filetype#*.}"
+
+ # Apply common AWK script
+ if [ -e "../modify_output_file.${filetype}.awk" ]; then
+ # Make backup copy first (add extension `.original')
+ cp -vf "${1}.${filetype}" "${1}.${filetype}.original"
+
+ # Apply the script
+ printf "gawk -f \"../modify_output_file.${filetype}.awk\" \"${1}.${filetype}.original\" > \"${1}.${filetype}\"\n"
+ gawk -f "../modify_output_file.${filetype}.awk" "${1}.${filetype}.original" > "${1}.${filetype}"
+ else
+ printf "WARNING: File not found: modify_output_file.${filetype}.awk\n"
+ fi
+
+ # Apply file type specific AWK script
+ if [ -e "../testcases/${1}.${filetype}.awk" ]; then
+ # Make backup copy first (add extension `.modified')
+ cp -vf "${1}.${filetype}" "${1}.${filetype}.modified"
+
+ # Apply the script
+ printf "gawk -f \"../testcases/${1}.${filetype}.awk\" \"${1}.${filetype}.modified\" > \"${1}.${filetype}\""
+ gawk -f "../testcases/${1}.${filetype}.awk" "${1}.${filetype}.modified" > "${1}.${filetype}"
+ fi
+ done
+}
+
+## Compare output files with expected results in order to determinate whether it
+ #+ was success or failure
+ # @note This function can be redefined in the client code
+ # @parm String - Name of the test case currently being evaluated
+ # @return 0 == Success; 1 == failure
+function rte_check_result() {
+ # Local variables
+ local exit_status=0 # Exit status from the `diff' tool
+
+ # Mention that this is an implicit function in the log
+ _implicit_rte_function
+
+ # Ensure that we are in the directory with the temporary output files
+ cd "${_TEST_DIR}/results"
+
+ # Compare expected results with outputs from the test
+ for exp_file in "../testcases/${1}."*.exp; do
+
+ # Check if there are any .exp files
+ if [ "$exp_file" == "../testcases/${1}.*.exp" ]; then
+ _last_error="No expected outputs (.exp files) to compare"
+ return 1
+ fi
+
+ # Determinate name of the output file
+ out_file="$(basename "$exp_file")"
+ out_file="${out_file%.exp}"
+
+ # Use `diff' to perform the file comparison
+ printf "\ndiff \"${out_file}\" \"../testcases/${out_file}.exp\"\n"
+ diff "${out_file}" "../testcases/${out_file}.exp" || exit_status=$?
+
+ # In case of error, specify the short description of it
+ if (( $exit_status )); then
+ _last_error="\"results/${out_file}\" differs from \"testcases/${out_file}.exp\""
+ fi
+ done
+
+ return $exit_status
+}
+
+
+# ==============================================================================
+# ===== EVERYTHING BEYOND THIS LINE IS INTERNAL IMPLEMENTATION OF THE RTE ======
+# ==============================================================================
+
+
+# ------------------------------------------------------------------------------
+# INTERNAL RTE CONSTANTS
+# ------------------------------------------------------------------------------
+
+# Version of this regression testing environment
+readonly _RTE_VERSION="0.1"
+# Directory with the client script using this code (rte.lib.sh)
+readonly _TEST_DIR="$(cd "$(dirname $0)";pwd)"
+
+## Terminal color codes
+declare _NORMAL_COLOR='\033[m'
+declare _NUMBER_COLOR='\033[1;33m'
+declare _SUCCESS_COLOR='\033[1;32m'
+declare _FAILURE_COLOR='\033[1;31m'
+declare _EMPHASIS_COLOR='\033[1;34m'
+declare _BLINKING_TEXT='\033[5m'
+declare _BOLD_FONT='\033[1m'
+
+# ------------------------------------------------------------------------------
+# INTERNAL RTE VARIABLES
+# ------------------------------------------------------------------------------
+
+# Number testcases to process
+declare -i _NUMBER_OF_TESTCASES=0
+# Name of one speicific testcase to run, empty string means run all the test cases
+declare _run_specific_testcase=""
+# Last called RTE function, this can be useful when tracing the last error
+declare _last_rte_function_called=""
+# Short description of the last known cause of a test case failure
+declare _last_error=""
+# True width of the terminal window
+declare -i _terminal_width=0
+
+# ------------------------------------------------------------------------------
+# INTERNAL RTE FUNTIONS -- These function should not be called outside this file
+# ------------------------------------------------------------------------------
+
+## Determinate current width of the terminal window
+ # @note Updates _terminal_width variable
+ # @return always 0
+function determinate_terminal_width() {
+ _terminal_width=$(( $(tput cols) - 1 )) 2> /dev/null
+ if (( $_terminal_width == -1 )); then
+ _terminal_width=80
+ fi
+}
+
+## Print message to inform used about usage of an implicit RTE function
+ # @return always 0
+function _implicit_rte_function() {
+ printf " Note: this is RTE function was not redefined"
+}
+
+## Wrapper for client test function
+ # Purpose of this wrapper is to easily track what RTE function is being called
+ # @parm String - Name of the test case
+ # @return Exit status
+function _wrapper_rte() {
+ # Local variables
+ local exit_status # Return value of the wrapped function
+
+ # Set some global variables
+ _last_error="" # Short description of last known error
+ _last_rte_function_called="$2" # Name of the wrapped RTE function
+
+ # Print trace
+ printf "\n>>> %s [ENTER]\n" "$_last_rte_function_called"
+ printf " PWD == \"%s\"\n" "$PWD"
+ printf " \$1 == \"%s\"\n" "$1"
+
+ # Call the wrapped function
+ $_last_rte_function_called "$1"
+ exit_status=$?
+
+ # Print final trace and return
+ printf "<<< %s [LEAVE]\n\n" "$_last_rte_function_called"
+ return $exit_status
+}
+
+## Wrapper for function rte_before_test
+ # @parm String - Name of the test case
+ # @return Exit status
+function _wrapper_rte_before_test() {
+ _wrapper_rte "$1" 'rte_before_test'
+ return $?
+}
+
+## Wrapper for function rte_perform_test
+ # @parm String - Name of the test case
+ # @return Exit status
+function _wrapper_rte_perform_test() {
+ _wrapper_rte "$1" 'rte_perform_test'
+ return $?
+}
+
+## Wrapper for function rte_after_test
+ # @parm String - Name of the test case
+ # @return Exit status
+function _wrapper_rte_after_test() {
+ _wrapper_rte "$1" 'rte_after_test'
+ return $?
+}
+
+## Wrapper for function rte_modify_output_files
+ # @parm String - Name of the test case
+ # @return Exit status
+function _wrapper_rte_modify_output_files() {
+ _wrapper_rte "$1" 'rte_modify_output_files'
+ return $?
+}
+
+## Wrapper for function rte_check_result
+ # @parm String - Name of the test case
+ # @return Exit status
+function _wrapper_rte_check_result() {
+ _wrapper_rte "$1" 'rte_check_result'
+ return $?
+}
+
+## Count number of files in test cases directory, which names ends with `.in'
+ # @note
+ # This function will terminate the script with exit status 2 if some of the
+ # input files is found to unreadable.
+ # @return always 0
+function _determinate_no_of_testcases() {
+
+ # If one specific test case was chosen to perform the test on then
+ #+ set number of found test cases to 1 and return
+ if [ ! -z "$_run_specific_testcase" ]; then
+ _NUMBER_OF_TESTCASES=1
+ return
+ fi
+
+ # Go to directory containing input files
+ cd "${_TEST_DIR}/testcases"
+
+ # Determinate total number of all available test cases
+ for i in *.in; do
+ # Check whether the .in file is readable
+ if [ ! -r "$i" ]; then
+ # Check whether the .in file even exists
+ if [ ! -e "$i" ]; then
+ _NUMBER_OF_TESTCASES=0
+ break
+ fi
+
+ # Display error message and exit if some of the .in files is not readble
+ printf "\n${_FAILURE_COLOR}FATAL ERROR:${_NORMAL_COLOR} Unable to read file: %s\n\n" "$i"
+ exit 2
+ fi
+
+ # Increment counter of testcases
+ _NUMBER_OF_TESTCASES+=1
+ done
+}
+
+
+## Write header for test case log file
+ # The header will contain test case name and current date and time
+ # @return always 0
+function _create_log_file() {
+ printf "Starting testcase \"%s\"\n" "${1}"
+ printf "Current date and time: %s\n" "$(date '+%c')"
+}
+
+## Print line of characters
+ # @parm Char - Character, which the line will be made of
+ # @return always 0
+function _print_line() {
+ determinate_terminal_width
+ for((i=0; i<${RTE_LINE_WIDTH:-$_terminal_width}; i++)); do
+ printf "%s" "$1"
+ done
+ printf "\n"
+}
+
+## Make backups for all output files in the results directory
+ # @note Names of backup files ends with `~' (tilda) character
+ # @warning This function changes working directory to the `results' directory
+ # @return always 0
+function _make_backup_files() {
+
+ # Go to directory with output files (these files are only temporary)
+ cd "${_TEST_DIR}/results"
+
+ # Make backup copies
+ for result_file in *[^~]; do
+ if [ ! -e "$result_file" ]; then
+ continue
+ fi
+ cp -f "${result_file}" "${result_file}~" &> /dev/null
+ done
+}
+
+## Run regression test(s)
+ #
+ # @warning
+ # This function must be run as the last thing in the script, because it will end
+ # the script with `exit' command. The exit status depends on actual results of
+ # the test, status 0 means that all test cases passed and 1 means that at least
+ # of them failed.
+ #
+ # @return always 0
+function _runtest() {
+
+ # Print PROLOG (some introductory information)
+ _print_line '='
+ printf "${_BOLD_FONT}Starting %s regression testing ... " "$RTE_TEST_NAME"
+ printf "${_NUMBER_COLOR}%d${_NORMAL_COLOR} testcases to go\n" $_NUMBER_OF_TESTCASES
+ _print_line '='
+
+ # Abort, with exit status 2, if there are no testcases to perform
+ if (( ! $_NUMBER_OF_TESTCASES )); then
+ printf "\n${_FAILURE_COLOR}NO TESTCASES FOUND!${_NORMAL_COLOR}\n\n"
+ exit 2
+ fi
+
+ # Make backups for all output files
+ _make_backup_files
+
+ # Move to the directory with input files
+ cd "${_TEST_DIR}/testcases"
+
+ # Decalare local variables
+ declare -i failed_tescases=0 # Number of failed test cases
+ declare -i successfull_tescases=0 # Number of successful test cases
+ declare -i testcase_number=0 # Number of current test case (starts from 1)
+ declare -i succussfull_so_far=1 # Status of the current test: 0 == Already failed; 1 == Ok so far
+
+ # Iterate over available input files (.in) and run test for each of them,
+ #+ unless there has been specified one particular test case to run
+ for testcase in *.in; do
+ # Set some local variables
+ succussfull_so_far=1 # Status of the current test <-- Ok
+ testcase="${testcase%.in}" # Name of the current test case
+
+ # In case the user want to run any one specific test case, skip
+ #+ all others
+ if [[ ! -z "$_run_specific_testcase" && "${_run_specific_testcase}" != "${testcase}" ]]; then
+ continue
+ fi
+
+ # Increment test case counter
+ testcase_number+=1
+
+ # Print test case name
+ printf "Testcase: \"${_EMPHASIS_COLOR}%s${_NORMAL_COLOR}\"" "$testcase"
+ determinate_terminal_width
+ for((i=11 + ${#testcase} + 16; i<${RTE_LINE_WIDTH:-$_terminal_width}; i++)); do
+ printf " "
+ done
+
+ # Print text [IN PROGRESS] next to the test case name
+ if (( $RTE_ALLOW_BINKING_TEXT )); then
+ printf " ${_BLINKING_TEXT}[IN PROGRESS]${_NORMAL_COLOR}"
+ else
+ printf " ${_NUMBER_COLOR}[IN PROGRESS]${_NORMAL_COLOR}"
+ fi
+
+ # Go to directory with output files (these files are only temporary)
+ cd "${_TEST_DIR}/results"
+
+ # --------------------------------------------------------------
+ # Run the test
+ # --------------------------------------------------------------
+ while true; do
+ # Create header for the log file
+ _create_log_file "$testcase" &> "${testcase}.log" || {
+ succussfull_so_far=0
+ break
+ }
+
+ # Run client testing function -- rte_before_test
+ # Purpose: Do something which has to be done prior to
+ # the test itself.
+ _wrapper_rte_before_test "$testcase" &>> "${testcase}.log" || {
+ succussfull_so_far=0
+ break
+ }
+
+ # Run client testing function -- rte_perform_test
+ # Purpose: Perform the test
+ _wrapper_rte_perform_test "$testcase" &>> "${testcase}.log" || {
+ succussfull_so_far=0
+ break
+ }
+
+ # Run client testing function -- rte_after_test
+ # Purpose: Do something which has to be done after
+ # the testcase had been done
+ _wrapper_rte_after_test "$testcase" &>> "${testcase}.log" || {
+ succussfull_so_far=0
+ break
+ }
+
+ # Run client testing function -- rte_modify_output_files
+ # Purpose: Do something which has to be done with the test case
+ # output files, for instance remove certain line from
+ # certain files
+ _wrapper_rte_modify_output_files "$testcase" &>> "${testcase}.log" || {
+ succussfull_so_far=0
+ break
+ }
+
+ # Run client testing function -- rte_check_result
+ # Purpose: Compare output files with expected results in
+ # order to determinate whether it was success or
+ # failure
+ _wrapper_rte_check_result "$testcase" &>> "${testcase}.log" || {
+ succussfull_so_far=0
+ break
+ }
+
+ # If we reached this line, that means that the test case was successful
+ break
+ done
+
+ # Go back to directory with input files (these files are permanent)
+ cd "${_TEST_DIR}/testcases"
+
+ # Erase 15 characters from right, remove the text "[IN PROGRESS]"
+ for((i=0; i<15; i++)); do
+ printf "\b"
+ done
+
+ # Print test case status, that is "[OK]" or "[FAILED]"
+ #+ and increment counter successful or failed test cases
+ if (( $succussfull_so_far ))
+ then
+ # Testcase was successfull
+ successfull_tescases+=1
+ printf "${_SUCCESS_COLOR} [OK]${_NORMAL_COLOR}\n"
+ else
+ # Testcase was unsuccessfull
+ failed_tescases+=1
+ printf "${_FAILURE_COLOR} [FAILED]${_NORMAL_COLOR}\n"
+
+ # Print some more information about the failure ...
+ if [ ! -z "$_last_error" ]; then
+ printf "\tLast known error: %s\n" "$_last_error"
+ fi
+ printf "\tTestcase failed during execution of: ${_BOLD_FONT}%s${_NORMAL_COLOR}\n" "$_last_rte_function_called"
+ printf "\tLog saved in: ${_TEST_DIR}/results/${testcase}.log\n\n"
+ fi
+ done
+
+ # Print EPILOG (some information at the end)
+ _print_line '-'
+ printf "Statistic:\n"
+ printf "\tTOTAL: ${_NUMBER_COLOR}%3d${_NORMAL_COLOR}\n" $testcase_number
+ printf "\tSUCCESSFUL: ${_SUCCESS_COLOR}%3d${_NORMAL_COLOR}\n" $successfull_tescases
+ printf "\tFAILED: ${_FAILURE_COLOR}%3d${_NORMAL_COLOR}\n" $failed_tescases
+ _print_line '='
+
+ # Exit script accordingly to the results
+ if (( $failed_tescases )); then
+ exit 1
+ else
+ exit 0
+ fi
+}
+
+## Print name of this environment
+ # @return always 0
+function _print_rte_name() {
+ printf "Regression testing environment v%s\n" "$_RTE_VERSION"
+}
+
+## Print help message
+ # @parm Bool - Disable color output
+ # @return always 0
+function _print_help() {
+ if (( ! ${1:-0} )); then
+ local tc_end="\033[m"
+ local tc_bld="\033[1m"
+ local tc_opt="\033[32m"
+ local tc_arg="\033[33;1m"
+ local tc_dot="\033[32;1m"
+ fi
+
+ printf "${tc_bld}"
+ _print_rte_name
+ printf "${tc_end}"
+
+ printf "\n"
+ printf "${tc_bld}Options:${tc_end}\n"
+ printf "\t${tc_opt}-t${tc_end} ${tc_arg}testcase${tc_end}\tRun specific test case\n"
+ printf "\t${tc_opt}-V${tc_end}\t\tPrint version information\n"
+ printf "\t${tc_opt}-n${tc_end}\t\tDisable color output\n"
+ printf "\t${tc_opt}-h${tc_end}\t\tShow this message\n"
+ printf "\n"
+ printf " ${tc_dot}*${tc_end} See README files in directories containing regression tests for more information.\n"
+ printf " ${tc_dot}*${tc_end} When run without any options it will run all found test cases.\n"
+ printf "\n"
+}
+
+## Parse command line options
+ # @parm List - command line arguments ("$@")
+ # @return always 0
+function _parse_cmd_line_opts() {
+ local -i print_help=0
+ local -i no_color=0
+
+ # Parse CLI options using `getopts' utility
+ while getopts ":hVnt:" opt; do
+ case $opt in
+ n) # Disable color output
+ no_color=1
+ unset _NORMAL_COLOR
+ unset _NUMBER_COLOR
+ unset _SUCCESS_COLOR
+ unset _FAILURE_COLOR
+ unset _EMPHASIS_COLOR
+ unset _BLINKING_TEXT
+ unset _BOLD_FONT
+ ;;
+ t) # Specify one test case to run
+ _run_specific_testcase="$(basename "$OPTARG")"
+ ;;
+ h) # Help
+ print_help=1
+ ;;
+
+ V) # Print version information
+ _print_rte_name
+ exit
+ ;;
+ ?) # ERROR
+ _print_rte_name
+ printf "Unknown option. Try -h to get help.\n"
+ exit 1
+ ;;
+ esac
+ done
+
+ if (( print_help )); then
+ _print_help $no_color
+ exit
+ fi
+}
+
+## Main loop
+ # @parm List - command line arguments ("$@")
+ # @return always 0
+function _main() {
+
+ # Display error message and exit of this script was run
+ #+ alone and not included into some another file
+ if [ "$(basename $0)" == "rte.lib.sh" ]; then
+ printf "${_FAILURE_COLOR}ERROR:${_NORMAL_COLOR} This file serves merely as a library for regression testing.\n"
+ printf " It does not make sense to run it alone.\n"
+ exit 2
+ fi
+
+ # Parse command line options
+ _parse_cmd_line_opts "$@"
+
+ # Determinate number of test cases to proceed (count .in files in test cases directory)
+ _determinate_no_of_testcases
+
+ # Run regression test(s)
+ _runtest
+}
+
+## Run tests at the end of script execution
+trap '_main "$@"' 0
+
diff --git a/regression_tests/simulator/README b/regression_tests/simulator/README
new file mode 100644
index 0000000..8119035
--- /dev/null
+++ b/regression_tests/simulator/README
@@ -0,0 +1,12 @@
+MCU 8051 IDE simulator engine regression testing
+------------------------------------------------
+
+Each .in file in the testcases directory is used by RTE (Regression Testing
+Environment) to run specific test on the simulator. The .in file is first
+processed by m4 macro-processor and then passed to the simulator command line
+interface. Commands contained in the .in file are processed by the engine and
+generated output is redirected into a file with the same base name as the .in
+file has, but with extension .out . This .out file is located in directory named
+results for comparison with an .exp file located in the same directory as the
+.in file. See MCU 8051 IDE handbook for information about the simulator command
+line interface and its commands, it is a long list.
diff --git a/regression_tests/simulator/modify_output_file.out.awk b/regression_tests/simulator/modify_output_file.out.awk
new file mode 100644
index 0000000..da2629e
--- /dev/null
+++ b/regression_tests/simulator/modify_output_file.out.awk
@@ -0,0 +1,18 @@
+#! /usr/bin/gawk -f
+
+# --------------------------------------------------------------------------
+# Auxiliary script for regression tests environment
+#
+# Modify ouput files from simulator, file extension is `.out'
+# --------------------------------------------------------------------------
+
+# Ignore sim. engine version
+/^MCU8051IDE SIM-ENGINE/ {
+ $0="MCU8051IDE SIM-ENGINE"
+}
+
+
+# Just copy input to output
+{
+ print($0)
+}
diff --git a/regression_tests/simulator/runtest b/regression_tests/simulator/runtest
new file mode 100755
index 0000000..47d2f0b
--- /dev/null
+++ b/regression_tests/simulator/runtest
@@ -0,0 +1,23 @@
+#! /bin/bash
+
+# --------------------------------------------------------------------------
+#
+# MCU 8051 IDE assembler regression testing
+#
+# This script defines what and how is suppose to be tested and runs the tests.
+# See README files for more information.
+#
+# --------------------------------------------------------------------------
+
+
+## Prepare regression testing environment
+source "$(dirname $0)/../rte.lib.sh" # Load regression test environment
+RTE_TEST_NAME="Simulator engine" # Set name of the tested subject
+
+# Set other things ...
+readonly SIMULATOR_COMMAND="tclsh ../../../lib/main.tcl --simulator"
+set -o pipefail
+
+function rte_perform_test() {
+ m4 -D TESTCASE="${1}" "../testcases/${1}.in" | $SIMULATOR_COMMAND &> "${1}.out" || return 1
+}
diff --git a/regression_tests/simulator/testcases/001_Trivial_test.adf b/regression_tests/simulator/testcases/001_Trivial_test.adf
new file mode 100644
index 0000000..9ce3af5
--- /dev/null
+++ b/regression_tests/simulator/testcases/001_Trivial_test.adf
@@ -0,0 +1,7 @@
+# Assembler debug file for MCU 8051 IDE v1.3.10
+# Used assembler: MCU 8051 IDE
+# Date: 10/10/2010
+16EA4033A0B463FBE37FF1204EA24808 "001_Trivial_test.asm"
+0 3 0 116 85
+0 4 2 244
+0 5 3 128 251 \ No newline at end of file
diff --git a/regression_tests/simulator/testcases/001_Trivial_test.in b/regression_tests/simulator/testcases/001_Trivial_test.in
new file mode 100644
index 0000000..70e69db
--- /dev/null
+++ b/regression_tests/simulator/testcases/001_Trivial_test.in
@@ -0,0 +1,29 @@
+echo-on
+set-mcu at89S52
+set-clock 12000
+
+# Load program code
+load-code-adf `../testcases/'TESTCASE()`.adf'
+
+read-sfr-by-name A
+
+step
+read-pc
+read-sfr-by-name A
+
+step
+read-position
+read-pc
+read-sfr 224
+step
+read-pc
+read-sfr 224
+step
+read-pc
+read-sfr 224
+
+step-back
+read-pc
+step-back
+read-pc
+read-pc
diff --git a/regression_tests/simulator/testcases/001_Trivial_test.out.exp b/regression_tests/simulator/testcases/001_Trivial_test.out.exp
new file mode 100644
index 0000000..b2aa5e7
--- /dev/null
+++ b/regression_tests/simulator/testcases/001_Trivial_test.out.exp
@@ -0,0 +1,66 @@
+MCU8051IDE SIM-ENGINE
+READY
+OK
+> set-mcu at89S52
+OK
+> set-clock 12000
+OK
+> load-code-adf ../testcases/001_Trivial_test.adf
+OK
+> read-sfr-by-name A
+0
+OK
+> step
+OK
+> read-pc
+2
+OK
+> read-sfr-by-name A
+85
+OK
+> step
+OK
+> read-position
+F: "./001_Trivial_test.asm"
+L: 5
+V: 0
+B: 0
+OK
+> read-pc
+3
+OK
+> read-sfr 224
+170
+OK
+> step
+OK
+> read-pc
+0
+OK
+> read-sfr 224
+170
+OK
+> step
+OK
+> read-pc
+2
+OK
+> read-sfr 224
+85
+OK
+> step-back
+1
+OK
+> read-pc
+0
+OK
+> step-back
+1
+OK
+> read-pc
+3
+OK
+> read-pc
+3
+OK
+EXITING
diff --git a/test-lib.sh b/test-lib.sh
deleted file mode 100755
index c3e359a..0000000
--- a/test-lib.sh
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/sh
-# the next line restarts using tclsh \
-exec tclsh "$0" "$@" || echo "0"; exit 1
-
-# --------------------------------------------------------
-# Copyright (C) Martin Ošmera <P16F87504SP@seznam.cz>
-# Licence: GPL
-# Version: 1.0
-# Homepage: http://sourceforge.net/projects/mcu8051ide
-# --------------------------------------------------------
-#
-# Test for presence of a Tcl library
-# Usage:
-# ./test-lib LIBRARY [VERSION]
-#
-# --------------------------------------------------------
-
-if {$argv == {--help}} {
- puts "Test for presence of Tcl library"
- puts "Usage:"
- puts "\t./test-lib LIBRARY [VERSION]"
-}
-
-if {$argc == 2} {
- if [catch {package require [lindex $argv 0] [lindex $argv 1]}] {
- puts {0}
- exit 1
- }
-} elseif {$argc == 1} {
- if [catch {package require [lindex $argv 0]}] {
- puts {0}
- exit 1
- }
-} else {
- puts {0}
- exit 1
-}
-
-puts {1}
-exit 0
-
diff --git a/translations/README b/translations/README
index 614a416..202882c 100644
--- a/translations/README
+++ b/translations/README
@@ -1 +1,42 @@
-This directory contains translation files for the MCU 8051 IDE \ No newline at end of file
+This directory contains translation files for the MCU 8051 IDE.
+
+== What is this directory good for ==
+
+Each file is named after the locale. The locale is specified by a locale string.
+The locale string consists of a language code, an optional country code, and an
+optional system-specific code, each separated by `_'. The country and language
+codes are specified in standards ISO-639 and ISO-3166. For example, the locale
+`en' specifies English and `en_US' specifies U.S. English.
+
+Please see file template.txt for more details. Also note that a complete
+translation comprise also translation of this file: "../data/tips.xml",
+documentation translation is also possible.
+
+
+== Note to the Tip of the day ==
+
+Some people wonder why the Tip of the day stops working when they start using
+their translation, well, the cause of this is that the tips are stored file
+named tips.xml, the file is located in the "data" directory located in that
+directory where you have installed the IDE, on Linux it's usually
+"/usr/share/mcu8051ide/data", on Windows it's usually
+"C:\Program Files\MCU 8051 IDE\data". The problem is that the tips won't work
+until they are all translated, or rewritten, however there is a simple solution,
+just copy all the tips in English and change "<tip lang="en">" to
+"<tip lang="my_language">". This solution apparently doesn't do anything else
+than making the tips in English appear as they have been already translated, so
+you get the Tip of the day working again but with English tips in it.
+
+
+== The translation manipulation tool ==
+
+You should see file named tool.tcl in this directory, it's a tool which might
+help with maintenance of the translation files. Since the template.txt might get
+updated every now and then, we need to keep the translation files updated as
+well, the tool.tcl was written in order to make that a lot easier, here are the
+instructions how to use it:
+ - (This applies to Windows users only.) Make sure you can run Tcl scripts, you
+ might need to install some Tcl distribution, e.g. ActiveTcl.
+ - Go to this directory.
+ - Run "./tool.tcl -m my_translation_file.msg".
+ - Wait a moment, and it's done. :)
diff --git a/translations/languages.txt b/translations/languages.txt
new file mode 100644
index 0000000..22f40ac
--- /dev/null
+++ b/translations/languages.txt
@@ -0,0 +1,11 @@
+#
+# This file contains names of languages corresponding to their codes
+#
+# Encoding: UTF-8
+# End of line character: LF (0x0a) (\n) (^J)
+#
+
+"en" "English language" # English
+"cs" "Český jazyk" # Czech
+"ru" "Pусский язык" # Russian
+"zh_CN" "简体中文" # chinese
diff --git a/translations/template.txt b/translations/template.txt
new file mode 100644
index 0000000..35b5b4b
--- /dev/null
+++ b/translations/template.txt
@@ -0,0 +1,13797 @@
+# This is a template of MCU 8051 IDE translation file
+#
+# This file allows to localize the the user environment of the IDE to almost any
+# language.
+#
+# HOW TO MAKE IT WORK:
+# --------------------
+# 1) Copy this file (template.txt) to <lang_code>.msg in the same directory.
+# Where ``<lang_code>'' is supposed to be replaced with language code of
+# the translation. For example ``ru'' means Russian, or ``es'' means
+# Spanish. The language code must be lowercase.
+# 2) Translate all sentences marked with by ``<-- NOT TRANSLATED YET''.
+# 3) Modify file ``languages.tcl'' and add name of language which you are
+# making the translation for. Name should be specified in that language.
+#
+# IMPORTANT RULES FOR THE TRANSLATION:
+# ------------------------------------
+# 1) Be aware of that this file is very sensitive.
+# 2) Everything besides actual sentences for translation must not be modified
+# in any way! Otherwise the file might cause serious program instability.
+# 3) Escape sequences and all special characters must be preserved.
+# 4) Sentences enclosed with ``"'' (double quote) character, can be translated
+# into sentences with different length. But the same does not apply for
+# sentences enclosed with ``{'' and ``}'' (curly brackets) characters,
+# their lengths must remain preserved.
+# 5) Do not translate ``$'' dollar symbol, it has a special meaning here, not
+# related to currency.
+# 6) Keep UTF-8 encoding and if possible, please keep also Unix line ends.
+# 7) Do not remove ID marks, like ``##ID:12345##'', etc.
+#
+# NOTES:
+# ------
+# 1) `` ;# <-- NOT TRANSLATED YET'' is just a comment and can be removed at
+# any time.
+# 2) Nothing is perfect ... if you have found anything strange or not
+# functional here, please report it as a regular bug.
+# 3) Recommended syntax highlight pattern for this file is "Tcl/Tk".
+# 4) Please don't hesitate to ask any questions.
+#
+# EXAMPLES:
+# --------
+#
+# ##ID:000017##
+# mcset $l "Unable to save configuration file" \
+# "无法保存配置文件"
+# |
+# \__ This is juts a basic example, note that the
+# ``" ;# <-- NOT TRANSLATED YET'' string was removed, but it's not
+# mandatory to remove it. (Translated to Chinese.)
+#
+# ##ID:666000##
+# mcset $l "%s\tBetter to reign in Hell than to serve in Heaven!" \
+# "%s\tLepší vládnou v pekle než sloužit v nebi!"
+# |
+# \__ Note that formatting (%s) and escaped (\t) characters remained
+# here. (Translated to Czech.)
+#
+# ##ID:86900##
+# mcset $l {Just judge of revenge, give the gift of remission before the day of reckoning.} \
+# {Iuste iudex ultionis, donum fac remissionis ante diem rationis. }
+# |
+# \__ Note that length of both strings is the same, it must be that
+# way because the strings are in brackets, not in double quotes.
+# (Translated to Latin.)
+#
+#
+# ------------------------------------------------------------------------------
+# Thank you for your cooperation, which helps to make the software better!
+# ------------------------------------------------------------------------------
+#
+# Translation file from English language to <target language>
+# by <translation author> (<country>) <<email_address>>
+#
+# Created: ...
+# Last update: ...
+# Notes to translation: ...
+#
+set l [file tail [file rootname [info script]]]
+# main.tcl
+# ==============================================================================
+namespace eval :: {
+ ##ID:000001##
+ mcset $l "Translated into _Language_ by _Name_ (_country_) <_email_>" \
+ "Translated into _Language_ by _Name_ (_country_) <_email_>" ;# <-- NOT TRANSLATED YET
+ ##ID:000002##
+ mcset $l "Initializing" \
+ "Initializing" ;# <-- NOT TRANSLATED YET
+ ##ID:000003##
+ mcset $l "\tLoading libraries" \
+ "\tLoading libraries" ;# <-- NOT TRANSLATED YET
+ ##ID:000004##
+ mcset $l "\tLoading program sources" \
+ "\tLoading program sources" ;# <-- NOT TRANSLATED YET
+ ##ID:000005##
+ mcset $l "FATAL ERROR" \
+ "FATAL ERROR" ;# <-- NOT TRANSLATED YET
+ ##ID:000006##
+ mcset $l "MCUs database file is corrupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE." \
+ "MCUs database file is corrupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:000007##
+ mcset $l "\tOpening last session" \
+ "\tOpening last session" ;# <-- NOT TRANSLATED YET
+ ##ID:000008##
+ mcset $l "File not found" \
+ "File not found" ;# <-- NOT TRANSLATED YET
+ ##ID:000009##
+ mcset $l "Unable to open project file:\n\"%s\"" \
+ "Unable to open project file:\n\"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:000010##
+ mcset $l "%s is now operational\n" \
+ "%s is now operational\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000011##
+ mcset $l "Initializing %s" \
+ "Initializing %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000012##
+ mcset $l "\nInitializing MCU 8051 IDE %s" \
+ "\nInitializing MCU 8051 IDE %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000013##
+ mcset $l "\nInitializing \033\[1mMCU 8051 IDE \033\[32m%s\033\[m" \
+ "\nInitializing \033\[1mMCU 8051 IDE \033\[32m%s\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:000014##
+ mcset $l "\nExiting on signal %s" \
+ "\nExiting on signal %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000015##
+ mcset $l "\nERROR: Unable to exit the program correctly -- TERMINATING NOW!" \
+ "\nERROR: Unable to exit the program correctly -- TERMINATING NOW!" ;# <-- NOT TRANSLATED YET
+}
+# environment.tcl
+# ==============================================================================
+namespace eval :: {
+ ##ID:000016##
+ mcset $l "Permission denied" \
+ "Permission denied" ;# <-- NOT TRANSLATED YET
+ ##ID:000017##
+ mcset $l "Unable to save configuration file" \
+ "Unable to save configuration file" ;# <-- NOT TRANSLATED YET
+ ##ID:000018##
+ mcset $l " * Restoring default settings" \
+ " * Restoring default settings" ;# <-- NOT TRANSLATED YET
+ ##ID:000019##
+ mcset $l "Change level of syntax validation" \
+ "Change level of syntax validation" ;# <-- NOT TRANSLATED YET
+ ##ID:000020##
+ mcset $l "Configure spell checker" \
+ "Configure spell checker" ;# <-- NOT TRANSLATED YET
+ ##ID:000021##
+ mcset $l "Spell checker (hunspell) is not available." \
+ "Spell checker (hunspell) is not available." ;# <-- NOT TRANSLATED YET
+ ##ID:000022##
+ mcset $l "Show status bar history" \
+ "Show status bar history" ;# <-- NOT TRANSLATED YET
+ ##ID:000023##
+ mcset $l "MCU chosen for simulation" \
+ "MCU chosen for simulation" ;# <-- NOT TRANSLATED YET
+ ##ID:000024##
+ mcset $l "Syntax validation disabled" \
+ "Syntax validation disabled" ;# <-- NOT TRANSLATED YET
+ ##ID:000025##
+ mcset $l "Current validation level: %s" \
+ "Current validation level: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000026##
+ mcset $l "Custom command %s: %s" \
+ "Custom command %s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000027##
+ mcset $l "Clear" \
+ "Clear" ;# <-- NOT TRANSLATED YET
+ # Main menu / File
+ ##ID:000028##
+ mcset $l "File" \
+ "File" ;# <-- NOT TRANSLATED YET
+ ##ID:000029##
+ mcset $l "New" \
+ "New" ;# <-- NOT TRANSLATED YET
+ ##ID:000030##
+ mcset $l "Create new file" \
+ "Create new file" ;# <-- NOT TRANSLATED YET
+ ##ID:000031##
+ mcset $l "Open" \
+ "Open" ;# <-- NOT TRANSLATED YET
+ ##ID:000032##
+ mcset $l "Open an existing file" \
+ "Open an existing file" ;# <-- NOT TRANSLATED YET
+ ##ID:000033##
+ mcset $l "Open recent" \
+ "Open recent" ;# <-- NOT TRANSLATED YET
+ ##ID:000034##
+ mcset $l "Save" \
+ "Save" ;# <-- NOT TRANSLATED YET
+ ##ID:000035##
+ mcset $l "Save the current file" \
+ "Save the current file" ;# <-- NOT TRANSLATED YET
+ ##ID:000036##
+ mcset $l "Save as" \
+ "Save as" ;# <-- NOT TRANSLATED YET
+ ##ID:000037##
+ mcset $l "Save under a different name" \
+ "Save under a different name" ;# <-- NOT TRANSLATED YET
+ ##ID:000038##
+ mcset $l "Save all" \
+ "Save all" ;# <-- NOT TRANSLATED YET
+ ##ID:000039##
+ mcset $l "Save the current file under a different name" \
+ "Save the current file under a different name" ;# <-- NOT TRANSLATED YET
+ ##ID:000040##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:000041##
+ mcset $l "Close the current file" \
+ "Close the current file" ;# <-- NOT TRANSLATED YET
+ ##ID:000042##
+ mcset $l "Close all" \
+ "Close all" ;# <-- NOT TRANSLATED YET
+ ##ID:000043##
+ mcset $l "Close all opened files" \
+ "Close all opened files" ;# <-- NOT TRANSLATED YET
+ ##ID:000044##
+ mcset $l "File statistics" \
+ "File statistics" ;# <-- NOT TRANSLATED YET
+ ##ID:000045##
+ mcset $l "Display file statistics" \
+ "Display file statistics" ;# <-- NOT TRANSLATED YET
+ ##ID:000046##
+ mcset $l "Save session" \
+ "Save session" ;# <-- NOT TRANSLATED YET
+ ##ID:000047##
+ mcset $l "Save current session. Session file contains list of opened project, sizes of panels, etc." \
+ "Save current session. Session file contains list of opened project, sizes of panels, etc." ;# <-- NOT TRANSLATED YET
+ ##ID:000048##
+ mcset $l "Quit" \
+ "Quit" ;# <-- NOT TRANSLATED YET
+ ##ID:000049##
+ mcset $l "Exit program" \
+ "Exit program" ;# <-- NOT TRANSLATED YET
+ # Main menu / Edit
+ ##ID:000050##
+ mcset $l "Edit" \
+ "Edit" ;# <-- NOT TRANSLATED YET
+ ##ID:000051##
+ mcset $l "Undo" \
+ "Undo" ;# <-- NOT TRANSLATED YET
+ ##ID:000052##
+ mcset $l "Take back last operation" \
+ "Take back last operation" ;# <-- NOT TRANSLATED YET
+ ##ID:000053##
+ mcset $l "Redo" \
+ "Redo" ;# <-- NOT TRANSLATED YET
+ ##ID:000054##
+ mcset $l "Take back last undo" \
+ "Take back last undo" ;# <-- NOT TRANSLATED YET
+ ##ID:000055##
+ mcset $l "Cut" \
+ "Cut" ;# <-- NOT TRANSLATED YET
+ ##ID:000056##
+ mcset $l "Move selected text into the clipboard" \
+ "Move selected text into the clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:000057##
+ mcset $l "Copy" \
+ "Copy" ;# <-- NOT TRANSLATED YET
+ ##ID:000058##
+ mcset $l "Copy selected text into the clipboard" \
+ "Copy selected text into the clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:000059##
+ mcset $l "Paste" \
+ "Paste" ;# <-- NOT TRANSLATED YET
+ ##ID:000060##
+ mcset $l "Paste text from clipboard" \
+ "Paste text from clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:000061##
+ mcset $l "Select all" \
+ "Select all" ;# <-- NOT TRANSLATED YET
+ ##ID:000062##
+ mcset $l "Select all text in the editor" \
+ "Select all text in the editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000063##
+ mcset $l "Find" \
+ "Find" ;# <-- NOT TRANSLATED YET
+ ##ID:000064##
+ mcset $l "Find a string in the text" \
+ "Find a string in the text" ;# <-- NOT TRANSLATED YET
+ ##ID:000065##
+ mcset $l "Find next" \
+ "Find next" ;# <-- NOT TRANSLATED YET
+ ##ID:000066##
+ mcset $l "Find next occurrence of search string" \
+ "Find next occurrence of search string" ;# <-- NOT TRANSLATED YET
+ ##ID:000067##
+ mcset $l "Find previous" \
+ "Find previous" ;# <-- NOT TRANSLATED YET
+ ##ID:004514##
+ mcset $l "Fill with pseudo-random values" \
+ "Fill with pseudo-random values" ;# <-- NOT TRANSLATED YET
+ ##ID:000068##
+ mcset $l "Find previous occurrence of search string" \
+ "Find previous occurrence of search string" ;# <-- NOT TRANSLATED YET
+ ##ID:000069##
+ mcset $l "Replace" \
+ "Replace" ;# <-- NOT TRANSLATED YET
+ ##ID:000070##
+ mcset $l "Replace some string with another" \
+ "Replace some string with another" ;# <-- NOT TRANSLATED YET
+ ##ID:000071##
+ mcset $l "Go to line" \
+ "Go to line" ;# <-- NOT TRANSLATED YET
+ ##ID:000072##
+ mcset $l "Jump to line" \
+ "Jump to line" ;# <-- NOT TRANSLATED YET
+ ##ID:000073##
+ mcset $l "Comment" \
+ "Comment" ;# <-- NOT TRANSLATED YET
+ ##ID:000074##
+ mcset $l "Comment selected text" \
+ "Comment selected text" ;# <-- NOT TRANSLATED YET
+ ##ID:000075##
+ mcset $l "Uncomment" \
+ "Uncomment" ;# <-- NOT TRANSLATED YET
+ ##ID:000076##
+ mcset $l "Uncomment selected text" \
+ "Uncomment selected text" ;# <-- NOT TRANSLATED YET
+ ##ID:000077##
+ mcset $l "Indent" \
+ "Indent" ;# <-- NOT TRANSLATED YET
+ ##ID:000078##
+ mcset $l "Indent selected text" \
+ "Indent selected text" ;# <-- NOT TRANSLATED YET
+ ##ID:000079##
+ mcset $l "Unindent" \
+ "Unindent" ;# <-- NOT TRANSLATED YET
+ ##ID:000080##
+ mcset $l "Unindent selected text" \
+ "Unindent selected text" ;# <-- NOT TRANSLATED YET
+ # Main menu / View
+ ##ID:000081##
+ mcset $l "View" \
+ "View" ;# <-- NOT TRANSLATED YET
+ ##ID:000082##
+ mcset $l "Read only mode" \
+ "Read only mode" ;# <-- NOT TRANSLATED YET
+ ##ID:000083##
+ mcset $l "Set current editor to read only/normal mode" \
+ "Set current editor to read only/normal mode" ;# <-- NOT TRANSLATED YET
+ ##ID:000084##
+ mcset $l "Switch to command line" \
+ "Switch to command line" ;# <-- NOT TRANSLATED YET
+ ##ID:000085##
+ mcset $l "Switch to editor command line" \
+ "Switch to editor command line" ;# <-- NOT TRANSLATED YET
+ ##ID:000086##
+ mcset $l "Show/Hide icon border" \
+ "Show/Hide icon border" ;# <-- NOT TRANSLATED YET
+ ##ID:000087##
+ mcset $l "Show/Hide editor's icon border (bookmark icons)" \
+ "Show/Hide editor's icon border (bookmark icons)" ;# <-- NOT TRANSLATED YET
+ ##ID:000088##
+ mcset $l "Show/Hide line numbers" \
+ "Show/Hide line numbers" ;# <-- NOT TRANSLATED YET
+ ##ID:000089##
+ mcset $l "Show/Hide editor's line numbers" \
+ "Show/Hide editor's line numbers" ;# <-- NOT TRANSLATED YET
+ ##ID:000090##
+ mcset $l "Reload" \
+ "Reload" ;# <-- NOT TRANSLATED YET
+ ##ID:000091##
+ mcset $l "Reload current file" \
+ "Reload current file" ;# <-- NOT TRANSLATED YET
+ ##ID:000092##
+ mcset $l "Highlight" \
+ "Highlight" ;# <-- NOT TRANSLATED YET
+ ##ID:000093##
+ mcset $l "None" \
+ "None" ;# <-- NOT TRANSLATED YET
+ ##ID:000094##
+ mcset $l "Assembly language" \
+ "Assembly language" ;# <-- NOT TRANSLATED YET
+ ##ID:000095##
+ mcset $l "Assembler ASX8051" \
+ "Assembler ASX8051" ;# <-- NOT TRANSLATED YET
+ ##ID:000096##
+ mcset $l "Reallocable assembler from SDCC project" \
+ "Reallocable assembler from SDCC project" ;# <-- NOT TRANSLATED YET
+ ##ID:000097##
+ mcset $l "C language" \
+ "C language" ;# <-- NOT TRANSLATED YET
+ ##ID:000098##
+ mcset $l "Code listing" \
+ "Code listing" ;# <-- NOT TRANSLATED YET
+ ##ID:000099##
+ mcset $l "Full screen mode" \
+ "Full screen mode" ;# <-- NOT TRANSLATED YET
+ ##ID:000100##
+ mcset $l "Toggle full screen mode" \
+ "Toggle full screen mode" ;# <-- NOT TRANSLATED YET
+ ##ID:000101##
+ mcset $l "Clear messages panel" \
+ "Clear messages panel" ;# <-- NOT TRANSLATED YET
+ # Main menu / Project
+ ##ID:000102##
+ mcset $l "Project" \
+ "Project" ;# <-- NOT TRANSLATED YET
+ ##ID:000103##
+ mcset $l "Create new project" \
+ "Create new project" ;# <-- NOT TRANSLATED YET
+ ##ID:000104##
+ mcset $l "Open an existing project" \
+ "Open an existing project" ;# <-- NOT TRANSLATED YET
+ ##ID:000105##
+ mcset $l "Save the current project" \
+ "Save the current project" ;# <-- NOT TRANSLATED YET
+ ##ID:000106##
+ mcset $l "Edit project" \
+ "Edit project" ;# <-- NOT TRANSLATED YET
+ ##ID:000107##
+ mcset $l "Edit project details" \
+ "Edit project details" ;# <-- NOT TRANSLATED YET
+ ##ID:000108##
+ mcset $l "Save and close" \
+ "Save and close" ;# <-- NOT TRANSLATED YET
+ ##ID:000109##
+ mcset $l "Save the current project and close it" \
+ "Save the current project and close it" ;# <-- NOT TRANSLATED YET
+ ##ID:000110##
+ mcset $l "Close without saving" \
+ "Close without saving" ;# <-- NOT TRANSLATED YET
+ ##ID:000111##
+ mcset $l "Close current project" \
+ "Close current project" ;# <-- NOT TRANSLATED YET
+ # Main menu / Simulator
+ ##ID:000112##
+ mcset $l "Simulator" \
+ "Simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000113##
+ mcset $l "Start / Shutdown" \
+ "Start / Shutdown" ;# <-- NOT TRANSLATED YET
+ ##ID:000114##
+ mcset $l "Start simulator engine" \
+ "Start simulator engine" ;# <-- NOT TRANSLATED YET
+ ##ID:000115##
+ mcset $l "Debug this file only" \
+ "Debug this file only" ;# <-- NOT TRANSLATED YET
+ ##ID:000116##
+ mcset $l "Start simulator engine and load current file only" \
+ "Start simulator engine and load current file only" ;# <-- NOT TRANSLATED YET
+ ##ID:000117##
+ mcset $l "Step back" \
+ "Step back" ;# <-- NOT TRANSLATED YET
+ ##ID:000118##
+ mcset $l "Step program back by 1 instruction" \
+ "Step program back by 1 instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:000119##
+ mcset $l "Step" \
+ "Step" ;# <-- NOT TRANSLATED YET
+ ##ID:000120##
+ mcset $l "Step program by 1 instruction" \
+ "Step program by 1 instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:000121##
+ mcset $l "Step over" \
+ "Step over" ;# <-- NOT TRANSLATED YET
+ ##ID:000122##
+ mcset $l "Step program by 1 line of code" \
+ "Step program by 1 line of code" ;# <-- NOT TRANSLATED YET
+ ##ID:000123##
+ mcset $l "Animate" \
+ "Animate" ;# <-- NOT TRANSLATED YET
+ ##ID:000124##
+ mcset $l "Run program and show results after each change" \
+ "Run program and show results after each change" ;# <-- NOT TRANSLATED YET
+ ##ID:000125##
+ mcset $l "Run" \
+ "Run" ;# <-- NOT TRANSLATED YET
+ ##ID:000126##
+ mcset $l "Run program and show results periodically in some interval" \
+ "Run program and show results periodically in some interval" ;# <-- NOT TRANSLATED YET
+ ##ID:000127##
+ mcset $l "Hiberante program" \
+ "Hiberante program" ;# <-- NOT TRANSLATED YET
+ ##ID:000128##
+ mcset $l "Save current state of simulator engine to a file for future resumption" \
+ "Save current state of simulator engine to a file for future resumption" ;# <-- NOT TRANSLATED YET
+ ##ID:000129##
+ mcset $l "Resume hibernated program" \
+ "Resume hibernated program" ;# <-- NOT TRANSLATED YET
+ ##ID:000130##
+ mcset $l "Interrupt monitor" \
+ "Interrupt monitor" ;# <-- NOT TRANSLATED YET
+ ##ID:000131##
+ mcset $l "Dialog in which you can control MCU interrupts" \
+ "Dialog in which you can control MCU interrupts" ;# <-- NOT TRANSLATED YET
+ ##ID:000132##
+ mcset $l "Stopwatch" \
+ "Stopwatch" ;# <-- NOT TRANSLATED YET
+ ##ID:000133##
+ mcset $l "Configurable stopwatch timer which can stop simulation on various conditions" \
+ "Configurable stopwatch timer which can stop simulation on various conditions" ;# <-- NOT TRANSLATED YET
+ ##ID:000134##
+ mcset $l "Find cursor" \
+ "Find cursor" ;# <-- NOT TRANSLATED YET
+ ##ID:000135##
+ mcset $l "Find simulator cursor in the editor" \
+ "Find simulator cursor in the editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000136##
+ mcset $l "Translate line number to address in program memory and set PC to that address" \
+ "Translate line number to address in program memory and set PC to that address" ;# <-- NOT TRANSLATED YET
+ ##ID:000137##
+ mcset $l "Clear highlight" \
+ "Clear highlight" ;# <-- NOT TRANSLATED YET
+ ##ID:000138##
+ mcset $l "Clear highlight for changed values" \
+ "Clear highlight for changed values" ;# <-- NOT TRANSLATED YET
+ ##ID:000139##
+ mcset $l "Allow breakpoints" \
+ "Allow breakpoints" ;# <-- NOT TRANSLATED YET
+ ##ID:000140##
+ mcset $l "Enable simulator breakpoints (marks, where to stop program in animate or run mode)" \
+ "Enable simulator breakpoints (marks, where to stop program in animate or run mode)" ;# <-- NOT TRANSLATED YET
+ # Main menu / Virtual MCU
+ ##ID:000141##
+ mcset $l "Virtual MCU" \
+ "Virtual MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:000142##
+ mcset $l "Show SFR map" \
+ "Show SFR map" ;# <-- NOT TRANSLATED YET
+ ##ID:000143##
+ mcset $l "Show map of special function registers area" \
+ "Show map of special function registers area" ;# <-- NOT TRANSLATED YET
+ ##ID:000144##
+ mcset $l "Show bit area" \
+ "Show bit area" ;# <-- NOT TRANSLATED YET
+ ##ID:000145##
+ mcset $l "Show bit addressable area" \
+ "Show bit addressable area" ;# <-- NOT TRANSLATED YET
+ ##ID:000146##
+ mcset $l "Show stack" \
+ "Show stack" ;# <-- NOT TRANSLATED YET
+ ##ID:000147##
+ mcset $l "Invoke MCU stack monitor" \
+ "Invoke MCU stack monitor" ;# <-- NOT TRANSLATED YET
+ ##ID:000148##
+ mcset $l "Show Code memory" \
+ "Show Code memory" ;# <-- NOT TRANSLATED YET
+ ##ID:000149##
+ mcset $l "Invoke hex editor with program code" \
+ "Invoke hex editor with program code" ;# <-- NOT TRANSLATED YET
+ ##ID:000150##
+ mcset $l "Show XDATA memory" \
+ "Show XDATA memory" ;# <-- NOT TRANSLATED YET
+ ##ID:000151##
+ mcset $l "Invoke hex editor with external data memory" \
+ "Invoke hex editor with external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:000152##
+ mcset $l "Show ERAM" \
+ "Show ERAM" ;# <-- NOT TRANSLATED YET
+ ##ID:000153##
+ mcset $l "Invoke hex editor with expanded RAM" \
+ "Invoke hex editor with expanded RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:000154##
+ mcset $l "Show Data EEPROM" \
+ "Show Data EEPROM" ;# <-- NOT TRANSLATED YET
+ ##ID:000155##
+ mcset $l "Invoke hex editor with data EEPROM" \
+ "Invoke hex editor with data EEPROM" ;# <-- NOT TRANSLATED YET
+ ##ID:000156##
+ mcset $l "Show EEPROM write buffer" \
+ "Show EEPROM write buffer" ;# <-- NOT TRANSLATED YET
+ ##ID:000157##
+ mcset $l "Invoke hex editor editor with data EEPROM write buffer" \
+ "Invoke hex editor editor with data EEPROM write buffer" ;# <-- NOT TRANSLATED YET
+ ##ID:000158##
+ mcset $l "Reset" \
+ "Reset" ;# <-- NOT TRANSLATED YET
+ ##ID:000159##
+ mcset $l "Only SFR" \
+ "Only SFR" ;# <-- NOT TRANSLATED YET
+ ##ID:000160##
+ mcset $l "Reset Special Function Registers only" \
+ "Reset Special Function Registers only" ;# <-- NOT TRANSLATED YET
+ ##ID:000161##
+ mcset $l "All zeros" \
+ "All zeros" ;# <-- NOT TRANSLATED YET
+ ##ID:000162##
+ mcset $l "Reset all internal registers to zeroes" \
+ "Reset all internal registers to zeroes" ;# <-- NOT TRANSLATED YET
+ ##ID:000163##
+ mcset $l "All ones" \
+ "All ones" ;# <-- NOT TRANSLATED YET
+ ##ID:000164##
+ mcset $l "Reset all internal registers to ones (0xFF)" \
+ "Reset all internal registers to ones (0xFF)" ;# <-- NOT TRANSLATED YET
+ ##ID:000165##
+ mcset $l "Random values" \
+ "Random values" ;# <-- NOT TRANSLATED YET
+ ##ID:000166##
+ mcset $l "Reset all internal registers to random values" \
+ "Reset all internal registers to random values" ;# <-- NOT TRANSLATED YET
+ ##ID:000167##
+ mcset $l "Virtual UART terminal" \
+ "Virtual UART terminal" ;# <-- NOT TRANSLATED YET
+ ##ID:000168##
+ mcset $l "Simulated UART terminal connected to the MCU simulator" \
+ "Simulated UART terminal connected to the MCU simulator" ;# <-- NOT TRANSLATED YET
+ # Main menu / Virtual HW
+ ##ID:000169##
+ mcset $l "Virtual HW" \
+ "Virtual HW" ;# <-- NOT TRANSLATED YET
+ ##ID:000170##
+ mcset $l "LED Panel" \
+ "LED Panel" ;# <-- NOT TRANSLATED YET
+ ##ID:000171##
+ mcset $l "LED Display" \
+ "LED Display" ;# <-- NOT TRANSLATED YET
+ ##ID:000172##
+ mcset $l "LED Matrix" \
+ "LED Matrix" ;# <-- NOT TRANSLATED YET
+ ##ID:000173##
+ mcset $l "LCD display (HD44780)" \
+ "LCD display (HD44780)" ;# <-- NOT TRANSLATED YET
+ ##ID:000174##
+ mcset $l "Multiplexed LED Display" \
+ "Multiplexed LED Display" ;# <-- NOT TRANSLATED YET
+ ##ID:000175##
+ mcset $l "LCD display controlled by HD44780" \
+ "LCD display controlled by HD44780" ;# <-- NOT TRANSLATED YET
+ ##ID:000176##
+ mcset $l "DS1620 thermometer" \
+ "DS1620 thermometer" ;# <-- NOT TRANSLATED YET
+ ##ID:000177##
+ mcset $l "DS1620 temperature sensor" \
+ "DS1620 temperature sensor" ;# <-- NOT TRANSLATED YET
+ ##ID:000178##
+ mcset $l "Simple Keypad" \
+ "Simple Keypad" ;# <-- NOT TRANSLATED YET
+ ##ID:000179##
+ mcset $l "Matrix Keypad" \
+ "Matrix Keypad" ;# <-- NOT TRANSLATED YET
+ ##ID:000180##
+ mcset $l "Load VHW connections from a file" \
+ "Load VHW connections from a file" ;# <-- NOT TRANSLATED YET
+ ##ID:000181##
+ mcset $l "Load" \
+ "Load" ;# <-- NOT TRANSLATED YET
+ ##ID:000182##
+ mcset $l "Import VHW connections from a file" \
+ "Import VHW connections from a file" ;# <-- NOT TRANSLATED YET
+ ##ID:000183##
+ mcset $l "Load recent" \
+ "Load recent" ;# <-- NOT TRANSLATED YET
+ ##ID:000184##
+ mcset $l "Save current VHW connections to a file" \
+ "Save current VHW connections to a file" ;# <-- NOT TRANSLATED YET
+ ##ID:000185##
+ mcset $l "Save current VHW connections under a different name" \
+ "Save current VHW connections under a different name" ;# <-- NOT TRANSLATED YET
+ ##ID:000186##
+ mcset $l "Remove all" \
+ "Remove all" ;# <-- NOT TRANSLATED YET
+ ##ID:000187##
+ mcset $l "Remove all VHW" \
+ "Remove all VHW" ;# <-- NOT TRANSLATED YET
+ # Main menu / Tools
+ ##ID:000188##
+ mcset $l "Tools" \
+ "Tools" ;# <-- NOT TRANSLATED YET
+ ##ID:000189##
+ mcset $l "Compile" \
+ "Compile" ;# <-- NOT TRANSLATED YET
+ ##ID:000190##
+ mcset $l "Compile the source code" \
+ "Compile the source code" ;# <-- NOT TRANSLATED YET
+ ##ID:000191##
+ mcset $l "Compile this file" \
+ "Compile this file" ;# <-- NOT TRANSLATED YET
+ ##ID:000192##
+ mcset $l "Compile current file only" \
+ "Compile current file only" ;# <-- NOT TRANSLATED YET
+ ##ID:000193##
+ mcset $l "Disassemble" \
+ "Disassemble" ;# <-- NOT TRANSLATED YET
+ ##ID:000194##
+ mcset $l "Disassemble object code and open new editor with the result" \
+ "Disassemble object code and open new editor with the result" ;# <-- NOT TRANSLATED YET
+ ##ID:000195##
+ mcset $l "Encoding" \
+ "Encoding" ;# <-- NOT TRANSLATED YET
+ ##ID:000196##
+ mcset $l "End of line" \
+ "End of line" ;# <-- NOT TRANSLATED YET
+ ##ID:000197##
+ mcset $l "Auto indent" \
+ "Auto indent" ;# <-- NOT TRANSLATED YET
+ ##ID:000198##
+ mcset $l "Reformat source code (Indention level etc.)" \
+ "Reformat source code (Indention level etc.)" ;# <-- NOT TRANSLATED YET
+ ##ID:000199##
+ mcset $l "Change letter case" \
+ "Change letter case" ;# <-- NOT TRANSLATED YET
+ ##ID:000200##
+ mcset $l "Change letter case in source code (with options)" \
+ "Change letter case in source code (with options)" ;# <-- NOT TRANSLATED YET
+ ##ID:000201##
+ mcset $l "Export as XHTML" \
+ "Export as XHTML" ;# <-- NOT TRANSLATED YET
+ ##ID:000202##
+ mcset $l "Export highlighted code as XHTML file" \
+ "Export highlighted code as XHTML file" ;# <-- NOT TRANSLATED YET
+ ##ID:000203##
+ mcset $l "Export as LaTeX" \
+ "Export as LaTeX" ;# <-- NOT TRANSLATED YET
+ ##ID:000204##
+ mcset $l "Export highlighted code as LaTeX source, using package color" \
+ "Export highlighted code as LaTeX source, using package color" ;# <-- NOT TRANSLATED YET
+ ##ID:000205##
+ mcset $l "Document current function" \
+ "Document current function" ;# <-- NOT TRANSLATED YET
+ ##ID:000206##
+ mcset $l "Create doxygen documentation for function on current line" \
+ "Create doxygen documentation for function on current line" ;# <-- NOT TRANSLATED YET
+ ##ID:000207##
+ mcset $l "Run doxywizard" \
+ "Run doxywizard" ;# <-- NOT TRANSLATED YET
+ ##ID:000208##
+ mcset $l "Run doxygen front-end" \
+ "Run doxygen front-end" ;# <-- NOT TRANSLATED YET
+ ##ID:000209##
+ mcset $l "Clear C API documentation" \
+ "Clear C API documentation" ;# <-- NOT TRANSLATED YET
+ ##ID:000210##
+ mcset $l "Remove C API documentation created by doxygen" \
+ "Remove C API documentation created by doxygen" ;# <-- NOT TRANSLATED YET
+ ##ID:000211##
+ mcset $l "Build C API documentation" \
+ "Build C API documentation" ;# <-- NOT TRANSLATED YET
+ ##ID:000212##
+ mcset $l "Run doxygen to create C API documentation" \
+ "Run doxygen to create C API documentation" ;# <-- NOT TRANSLATED YET
+ ##ID:000213##
+ mcset $l "Clean up project folder" \
+ "Clean up project folder" ;# <-- NOT TRANSLATED YET
+ ##ID:000214##
+ mcset $l "Invoke dialog to remove needless files the project directory" \
+ "Invoke dialog to remove needless files the project directory" ;# <-- NOT TRANSLATED YET
+ ##ID:000215##
+ mcset $l "Custom command 0" \
+ "Custom command 0" ;# <-- NOT TRANSLATED YET
+ ##ID:000216##
+ mcset $l "Custom command 1" \
+ "Custom command 1" ;# <-- NOT TRANSLATED YET
+ ##ID:000217##
+ mcset $l "Custom command 2" \
+ "Custom command 2" ;# <-- NOT TRANSLATED YET
+ # Main menu / Utilities / Encoding
+ ##ID:000218##
+ mcset $l "Unicode" \
+ "Unicode" ;# <-- NOT TRANSLATED YET
+ ##ID:000219##
+ mcset $l "Western European" \
+ "Western European" ;# <-- NOT TRANSLATED YET
+ ##ID:000220##
+ mcset $l "Central European" \
+ "Central European" ;# <-- NOT TRANSLATED YET
+ ##ID:000221##
+ mcset $l "Baltic" \
+ "Baltic" ;# <-- NOT TRANSLATED YET
+ ##ID:000222##
+ mcset $l "Cyrillic" \
+ "Cyrillic" ;# <-- NOT TRANSLATED YET
+ ##ID:000223##
+ mcset $l "Arabic" \
+ "Arabic" ;# <-- NOT TRANSLATED YET
+ ##ID:000224##
+ mcset $l "Greek" \
+ "Greek" ;# <-- NOT TRANSLATED YET
+ ##ID:000225##
+ mcset $l "Hebrew" \
+ "Hebrew" ;# <-- NOT TRANSLATED YET
+ ##ID:000226##
+ mcset $l "Turkish" \
+ "Turkish" ;# <-- NOT TRANSLATED YET
+ ##ID:000227##
+ mcset $l "Northern European" \
+ "Northern European" ;# <-- NOT TRANSLATED YET
+ ##ID:000228##
+ mcset $l "South-Eastern Europe" \
+ "South-Eastern Europe" ;# <-- NOT TRANSLATED YET
+ ##ID:000229##
+ mcset $l "Vietnamese" \
+ "Vietnamese" ;# <-- NOT TRANSLATED YET
+ # Main menu / Utilities
+ ##ID:000230##
+ mcset $l "Utilities" \
+ "Utilities" ;# <-- NOT TRANSLATED YET
+ ##ID:000231##
+ mcset $l "Hex -> Bin" \
+ "Hex -> Bin" ;# <-- NOT TRANSLATED YET
+ ##ID:000232##
+ mcset $l "Bin -> Hex" \
+ "Bin -> Hex" ;# <-- NOT TRANSLATED YET
+ ##ID:000233##
+ mcset $l "Sim -> Hex" \
+ "Sim -> Hex" ;# <-- NOT TRANSLATED YET
+ ##ID:000234##
+ mcset $l "Sim -> Bin" \
+ "Sim -> Bin" ;# <-- NOT TRANSLATED YET
+ ##ID:000235##
+ mcset $l "Convert Intel HEX 8 file to binary file" \
+ "Convert Intel HEX 8 file to binary file" ;# <-- NOT TRANSLATED YET
+ ##ID:000236##
+ mcset $l "Convert binary file to Intel HEX 8 file" \
+ "Convert binary file to Intel HEX 8 file" ;# <-- NOT TRANSLATED YET
+ ##ID:000237##
+ mcset $l "Convert simulator file to Intel HEX 8 file" \
+ "Convert simulator file to Intel HEX 8 file" ;# <-- NOT TRANSLATED YET
+ ##ID:000238##
+ mcset $l "Convert simulator file to binary file" \
+ "Convert simulator file to binary file" ;# <-- NOT TRANSLATED YET
+ ##ID:000239##
+ mcset $l "Normalize Intel 8 hex file" \
+ "Normalize Intel 8 hex file" ;# <-- NOT TRANSLATED YET
+ ##ID:000240##
+ mcset $l "Reformat the given IHEX8" \
+ "Reformat the given IHEX8" ;# <-- NOT TRANSLATED YET
+ ##ID:000241##
+ mcset $l "Hex Editor" \
+ "Hex Editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000242##
+ mcset $l "Invoke project independent hexadecimal editor with capacity of 64KB" \
+ "Invoke project independent hexadecimal editor with capacity of 64KB" ;# <-- NOT TRANSLATED YET
+ ##ID:000243##
+ mcset $l "Symbol Table" \
+ "Symbol Table" ;# <-- NOT TRANSLATED YET
+ ##ID:000244##
+ mcset $l "Assembly language symbol table viewer" \
+ "Assembly language symbol table viewer" ;# <-- NOT TRANSLATED YET
+ ##ID:000245##
+ mcset $l "8-Segment Editor" \
+ "8-Segment Editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000246##
+ mcset $l "8-Segment LED Display Editor" \
+ "8-Segment LED Display Editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000247##
+ mcset $l "ASCII Chart" \
+ "ASCII Chart" ;# <-- NOT TRANSLATED YET
+ ##ID:000248##
+ mcset $l "8051 Instruction Table" \
+ "8051 Instruction Table" ;# <-- NOT TRANSLATED YET
+ ##ID:000249##
+ mcset $l "Interactive table of 8051 instructions" \
+ "Interactive table of 8051 instructions" ;# <-- NOT TRANSLATED YET
+ ##ID:000250##
+ mcset $l "Scribble Notepad" \
+ "Scribble Notepad" ;# <-- NOT TRANSLATED YET
+ ##ID:000251##
+ mcset $l "Base Converter" \
+ "Base Converter" ;# <-- NOT TRANSLATED YET
+ ##ID:000252##
+ mcset $l "Special Calculator" \
+ "Special Calculator" ;# <-- NOT TRANSLATED YET
+ ##ID:000253##
+ mcset $l "UART/RS232 Debugger" \
+ "UART/RS232 Debugger" ;# <-- NOT TRANSLATED YET
+ # Main menu / Configure
+ ##ID:000254##
+ mcset $l "Configure" \
+ "Configure" ;# <-- NOT TRANSLATED YET
+ ##ID:000255##
+ mcset $l "Configure Editor" \
+ "Configure Editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000256##
+ mcset $l "Editor configuration (colors, fonts, highlighting, etc.)" \
+ "Editor configuration (colors, fonts, highlighting, etc.)" ;# <-- NOT TRANSLATED YET
+ ##ID:000257##
+ mcset $l "Configure Compiler" \
+ "Configure Compiler" ;# <-- NOT TRANSLATED YET
+ ##ID:000258##
+ mcset $l "Various compilation options" \
+ "Various compilation options" ;# <-- NOT TRANSLATED YET
+ ##ID:000259##
+ mcset $l "Configure Simulator" \
+ "Configure Simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000260##
+ mcset $l "Opens simulator configuration dialog" \
+ "Opens simulator configuration dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:000261##
+ mcset $l "Configure Right Panel" \
+ "Configure Right Panel" ;# <-- NOT TRANSLATED YET
+ ##ID:000262##
+ mcset $l "Right panel configuration (instruction details colors)" \
+ "Right panel configuration (instruction details colors)" ;# <-- NOT TRANSLATED YET
+ ##ID:000263##
+ mcset $l "Configure Main Toolbar" \
+ "Configure Main Toolbar" ;# <-- NOT TRANSLATED YET
+ ##ID:000264##
+ mcset $l "Adjust content of the main toolbar (under main menu)" \
+ "Adjust content of the main toolbar (under main menu)" ;# <-- NOT TRANSLATED YET
+ ##ID:000265##
+ mcset $l "Edit custom commands" \
+ "Edit custom commands" ;# <-- NOT TRANSLATED YET
+ ##ID:000266##
+ mcset $l "Set or modify user defined commands" \
+ "Set or modify user defined commands" ;# <-- NOT TRANSLATED YET
+ ##ID:000267##
+ mcset $l "Configure shortcuts" \
+ "Configure shortcuts" ;# <-- NOT TRANSLATED YET
+ ##ID:000268##
+ mcset $l "Set or modify key shortcuts" \
+ "Set or modify key shortcuts" ;# <-- NOT TRANSLATED YET
+ ##ID:000269##
+ mcset $l "Configure terminal emulator" \
+ "Configure terminal emulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000270##
+ mcset $l "Configure embedded terminal emulator -- RXVT-UNICODE" \
+ "Configure embedded terminal emulator -- RXVT-UNICODE" ;# <-- NOT TRANSLATED YET
+ ##ID:000271##
+ mcset $l "Configure MCU 8051 IDE" \
+ "Configure MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:000272##
+ mcset $l "Invoke global configuration dialog" \
+ "Invoke global configuration dialog" ;# <-- NOT TRANSLATED YET
+ # Main menu / Help
+ ##ID:000273##
+ mcset $l "Help" \
+ "Help" ;# <-- NOT TRANSLATED YET
+ ##ID:000274##
+ mcset $l "About" \
+ "About" ;# <-- NOT TRANSLATED YET
+ ##ID:000275##
+ mcset $l "About MCU 8051 IDE" \
+ "About MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:000276##
+ mcset $l "Display the documentation for MCU 8051 IDE" \
+ "Display the documentation for MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:000277##
+ mcset $l "Welcome Dialog" \
+ "Welcome Dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:000278##
+ mcset $l "Invoke dialog which you have seen on the first start" \
+ "Invoke dialog which you have seen on the first start" ;# <-- NOT TRANSLATED YET
+ ##ID:000279##
+ mcset $l "Tip of the Day" \
+ "Tip of the Day" ;# <-- NOT TRANSLATED YET
+ ##ID:000280##
+ mcset $l "Some tips about how to use this program more efficiently" \
+ "Some tips about how to use this program more efficiently" ;# <-- NOT TRANSLATED YET
+ ##ID:000281##
+ mcset $l "Project web page" \
+ "Project web page" ;# <-- NOT TRANSLATED YET
+ ##ID:000282##
+ mcset $l "Report a bug" \
+ "Report a bug" ;# <-- NOT TRANSLATED YET
+ ##ID:000283##
+ mcset $l "ASEM-51 manual" \
+ "ASEM-51 manual" ;# <-- NOT TRANSLATED YET
+ ##ID:000284##
+ mcset $l "SDCC manual" \
+ "SDCC manual" ;# <-- NOT TRANSLATED YET
+ ##ID:000285##
+ mcset $l "Handbook" \
+ "Handbook" ;# <-- NOT TRANSLATED YET
+ # Toolbar
+ ##ID:000286##
+ mcset $l "Hide toolbar" \
+ "Hide toolbar" ;# <-- NOT TRANSLATED YET
+ ##ID:000287##
+ mcset $l "Show toolbar" \
+ "Show toolbar" ;# <-- NOT TRANSLATED YET
+ ##ID:000288##
+ mcset $l "Configure Toolbar" \
+ "Configure Toolbar" ;# <-- NOT TRANSLATED YET
+ ##ID:000289##
+ mcset $l "Configure main toolbar" \
+ "Configure main toolbar" ;# <-- NOT TRANSLATED YET
+ ##ID:000290##
+ mcset $l "Hide main toolbar" \
+ "Hide main toolbar" ;# <-- NOT TRANSLATED YET
+ ##ID:000291##
+ mcset $l "Configure custom commands" \
+ "Configure custom commands" ;# <-- NOT TRANSLATED YET
+ ##ID:000292##
+ mcset $l "Invoke custom commands configuration dialog" \
+ "Invoke custom commands configuration dialog" ;# <-- NOT TRANSLATED YET
+ set ::TOOLBAR_TRANSLATIONS {
+ ##ID:000293##
+ mcset $l "Open file" \
+ "Open file" ;# <-- NOT TRANSLATED YET
+ ##ID:000294##
+ mcset $l "Save all opened files (in this project)" \
+ "Save all opened files (in this project)" ;# <-- NOT TRANSLATED YET
+ ##ID:000295##
+ mcset $l "Exit" \
+ "Exit" ;# <-- NOT TRANSLATED YET
+ ##ID:000296##
+ mcset $l "Exit application" \
+ "Exit application" ;# <-- NOT TRANSLATED YET
+ ##ID:000297##
+ mcset $l "Reload the current file" \
+ "Reload the current file" ;# <-- NOT TRANSLATED YET
+ ##ID:000298##
+ mcset $l "Open project" \
+ "Open project" ;# <-- NOT TRANSLATED YET
+ ##ID:000299##
+ mcset $l "Save project" \
+ "Save project" ;# <-- NOT TRANSLATED YET
+ ##ID:000300##
+ mcset $l "Save and close project" \
+ "Save and close project" ;# <-- NOT TRANSLATED YET
+ ##ID:000301##
+ mcset $l "Close project without saving" \
+ "Close project without saving" ;# <-- NOT TRANSLATED YET
+ ##ID:000302##
+ mcset $l "Show CODE memory" \
+ "Show CODE memory" ;# <-- NOT TRANSLATED YET
+ ##ID:000303##
+ mcset $l "Show data EEPROM" \
+ "Show data EEPROM" ;# <-- NOT TRANSLATED YET
+ ##ID:000304##
+ mcset $l "Start / Shutdown simulator" \
+ "Start / Shutdown simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000305##
+ mcset $l "Load debug file into simulator engine" \
+ "Load debug file into simulator engine" ;# <-- NOT TRANSLATED YET
+ ##ID:000306##
+ mcset $l "Perform HW reset" \
+ "Perform HW reset" ;# <-- NOT TRANSLATED YET
+ ##ID:000307##
+ mcset $l "Step program" \
+ "Step program" ;# <-- NOT TRANSLATED YET
+ ##ID:000308##
+ mcset $l "Step by 1 instruction" \
+ "Step by 1 instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:000309##
+ mcset $l "Step by 1 line of code" \
+ "Step by 1 line of code" ;# <-- NOT TRANSLATED YET
+ ##ID:000310##
+ mcset $l "Animate program" \
+ "Animate program" ;# <-- NOT TRANSLATED YET
+ ##ID:000311##
+ mcset $l "Run program and show results after each instruction" \
+ "Run program and show results after each instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:000312##
+ mcset $l "Run program" \
+ "Run program" ;# <-- NOT TRANSLATED YET
+ ##ID:000313##
+ mcset $l "Run program in simulator" \
+ "Run program in simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000314##
+ mcset $l "Hibernate program" \
+ "Hibernate program" ;# <-- NOT TRANSLATED YET
+ ##ID:000315##
+ mcset $l "Hibernate running program to a file" \
+ "Hibernate running program to a file" ;# <-- NOT TRANSLATED YET
+ ##ID:000316##
+ mcset $l "Resume program" \
+ "Resume program" ;# <-- NOT TRANSLATED YET
+ ##ID:000317##
+ mcset $l "Configurable stopwatch timer which stop simulation on various conditions" \
+ "Configurable stopwatch timer which stop simulation on various conditions" ;# <-- NOT TRANSLATED YET
+ ##ID:000318##
+ mcset $l "Compile source code" \
+ "Compile source code" ;# <-- NOT TRANSLATED YET
+ ##ID:000319##
+ mcset $l "Symbol table" \
+ "Symbol table" ;# <-- NOT TRANSLATED YET
+ ##ID:000320##
+ mcset $l "8-segment editor" \
+ "8-segment editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000321##
+ mcset $l "8-segment LED display editor" \
+ "8-segment LED display editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000322##
+ mcset $l "ASCII chart" \
+ "ASCII chart" ;# <-- NOT TRANSLATED YET
+ ##ID:000323##
+ mcset $l "Reformat source code (Indention level ...)" \
+ "Reformat source code (Indention level ...)" ;# <-- NOT TRANSLATED YET
+ ##ID:000324##
+ mcset $l "Switch to the next editor" \
+ "Switch to the next editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000325##
+ mcset $l "Switch to the previous editor" \
+ "Switch to the previous editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000326##
+ mcset $l "Tip of the day" \
+ "Tip of the day" ;# <-- NOT TRANSLATED YET
+ ##ID:000327##
+ mcset $l "Scribble notepad" \
+ "Scribble notepad" ;# <-- NOT TRANSLATED YET
+ ##ID:000328##
+ mcset $l "LED panel" \
+ "LED panel" ;# <-- NOT TRANSLATED YET
+ ##ID:000329##
+ mcset $l "LED display" \
+ "LED display" ;# <-- NOT TRANSLATED YET
+ ##ID:000330##
+ mcset $l "LED matrix" \
+ "LED matrix" ;# <-- NOT TRANSLATED YET
+ ##ID:000331##
+ mcset $l "Multiplexed LED display" \
+ "Multiplexed LED display" ;# <-- NOT TRANSLATED YET
+ ##ID:000332##
+ mcset $l "Simple keypad" \
+ "Simple keypad" ;# <-- NOT TRANSLATED YET
+ ##ID:000333##
+ mcset $l "Matrix keypad" \
+ "Matrix keypad" ;# <-- NOT TRANSLATED YET
+ ##ID:000334##
+ mcset $l "VHW Open" \
+ "VHW Open" ;# <-- NOT TRANSLATED YET
+ ##ID:000335##
+ mcset $l "VHW Load" \
+ "VHW Load" ;# <-- NOT TRANSLATED YET
+ ##ID:000336##
+ mcset $l "VHW Save" \
+ "VHW Save" ;# <-- NOT TRANSLATED YET
+ ##ID:000337##
+ mcset $l "VHW Save as" \
+ "VHW Save as" ;# <-- NOT TRANSLATED YET
+ ##ID:000338##
+ mcset $l "VHW Remove all" \
+ "VHW Remove all" ;# <-- NOT TRANSLATED YET
+ ##ID:000339##
+ mcset $l "Special calculator" \
+ "Special calculator" ;# <-- NOT TRANSLATED YET
+ }
+ namespace eval toolbar {
+ eval ${::TOOLBAR_TRANSLATIONS}
+ }
+}
+# asciichart.tcl
+# ==============================================================================
+namespace eval AsciiChart {
+ ##ID:000340##
+ mcset $l "ASCII chart" \
+ "ASCII chart" ;# <-- NOT TRANSLATED YET
+ ##ID:000341##
+ mcset $l "Exit" \
+ "Exit" ;# <-- NOT TRANSLATED YET
+ ##ID:000342##
+ mcset $l "Character: " \
+ "Character: " ;# <-- NOT TRANSLATED YET
+ ##ID:000343##
+ mcset $l "Hex address" \
+ "Hex address" ;# <-- NOT TRANSLATED YET
+ ##ID:000344##
+ mcset $l "Dec address" \
+ "Dec address" ;# <-- NOT TRANSLATED YET
+ ##ID:000345##
+ mcset $l "Oct address" \
+ "Oct address" ;# <-- NOT TRANSLATED YET
+ ##ID:000346##
+ mcset $l "Bin address" \
+ "Bin address" ;# <-- NOT TRANSLATED YET
+ ##ID:000347##
+ mcset $l "Caret notation" \
+ "Caret notation" ;# <-- NOT TRANSLATED YET
+ ##ID:000348##
+ mcset $l "C Escape Code" \
+ "C Escape Code" ;# <-- NOT TRANSLATED YET
+ ##ID:000349##
+ mcset $l "%s - Copy contents of entrybox to clipboard" \
+ "%s - Copy contents of entrybox to clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:000350##
+ mcset $l "Copy to clipboard" \
+ "Copy to clipboard" ;# <-- NOT TRANSLATED YET
+}
+# baseconverter.tcl
+# ==============================================================================
+namespace eval BaseConverter {
+ ##ID:000351##
+ mcset $l "Converter" \
+ "Converter" ;# <-- NOT TRANSLATED YET
+ ##ID:000352##
+ mcset $l "Enlarge" \
+ "Enlarge" ;# <-- NOT TRANSLATED YET
+ ##ID:000353##
+ mcset $l "More" \
+ "More" ;# <-- NOT TRANSLATED YET
+ ##ID:000354##
+ mcset $l "Shrink" \
+ "Shrink" ;# <-- NOT TRANSLATED YET
+ ##ID:000355##
+ mcset $l "Less" \
+ "Less" ;# <-- NOT TRANSLATED YET
+ ##ID:000356##
+ mcset $l "Bits" \
+ "Bits" ;# <-- NOT TRANSLATED YET
+ ##ID:000357##
+ mcset $l "BCD" \
+ "BCD" ;# <-- NOT TRANSLATED YET
+ ##ID:000358##
+ mcset $l "ASCII" \
+ "ASCII" ;# <-- NOT TRANSLATED YET
+ ##ID:000359##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:000360##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:000361##
+ mcset $l "BIN" \
+ "BIN" ;# <-- NOT TRANSLATED YET
+ ##ID:000362##
+ mcset $l "OCT" \
+ "OCT" ;# <-- NOT TRANSLATED YET
+}
+# bitmap.tcl
+# ==============================================================================
+namespace eval BitMap {
+ ##ID:000363##
+ mcset $l "Log. 0" \
+ "Log. 0" ;# <-- NOT TRANSLATED YET
+ ##ID:000364##
+ mcset $l "Log. 1" \
+ "Log. 1" ;# <-- NOT TRANSLATED YET
+ ##ID:000365##
+ mcset $l "Bit addr." \
+ "Bit addr." ;# <-- NOT TRANSLATED YET
+ ##ID:000366##
+ mcset $l "Reg. addr." \
+ "Reg. addr." ;# <-- NOT TRANSLATED YET
+ ##ID:000367##
+ mcset $l "Register: " \
+ "Register: " ;# <-- NOT TRANSLATED YET
+ ##ID:000368##
+ mcset $l " Bit address: " \
+ " Bit address: " ;# <-- NOT TRANSLATED YET
+ ##ID:000369##
+ mcset $l "Bit addressable area - %s - %s - %s" \
+ "Bit addressable area - %s - %s - %s" ;# <-- NOT TRANSLATED YET
+}
+# bottomnotebook.tcl
+# ==============================================================================
+namespace eval BottomNoteBook {
+ ##ID:000370##
+ mcset $l "Simulator" \
+ "Simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000371##
+ mcset $l "C variables" \
+ "C variables" ;# <-- NOT TRANSLATED YET
+ ##ID:000372##
+ mcset $l "IO Ports" \
+ "IO Ports" ;# <-- NOT TRANSLATED YET
+ ##ID:000373##
+ mcset $l "Messages" \
+ "Messages" ;# <-- NOT TRANSLATED YET
+ ##ID:000374##
+ mcset $l "Calculator" \
+ "Calculator" ;# <-- NOT TRANSLATED YET
+ ##ID:000375##
+ mcset $l "Notes" \
+ "Notes" ;# <-- NOT TRANSLATED YET
+ ##ID:000376##
+ mcset $l "Terminal" \
+ "Terminal" ;# <-- NOT TRANSLATED YET
+ ##ID:000377##
+ mcset $l "Find in files" \
+ "Find in files" ;# <-- NOT TRANSLATED YET
+ ##ID:000378##
+ mcset $l "Show" \
+ "Show" ;# <-- NOT TRANSLATED YET
+ ##ID:000379##
+ mcset $l "Hide" \
+ "Hide" ;# <-- NOT TRANSLATED YET
+ ##ID:000380##
+ mcset $l "Simulator panel %s" \
+ "Simulator panel %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000381##
+ mcset $l "Variables from C source code %s" \
+ "Variables from C source code %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000382##
+ mcset $l "Graph showing state of MCU ports %s" \
+ "Graph showing state of MCU ports %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000383##
+ mcset $l "Compiler messages %s" \
+ "Compiler messages %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000384##
+ mcset $l "Personal to do list & notepad %s" \
+ "Personal to do list & notepad %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000385##
+ mcset $l "Scientific calculator %s" \
+ "Scientific calculator %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000386##
+ mcset $l "Terminal emulator %s" \
+ "Terminal emulator %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000387##
+ mcset $l "Find in files %s" \
+ "Find in files %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000388##
+ mcset $l "Hide this panel" \
+ "Hide this panel" ;# <-- NOT TRANSLATED YET
+ ##ID:000389##
+ mcset $l "Show this panel" \
+ "Show this panel" ;# <-- NOT TRANSLATED YET
+ ##ID:000390##
+ mcset $l "Simulator panel" \
+ "Simulator panel" ;# <-- NOT TRANSLATED YET
+ ##ID:000391##
+ mcset $l "List of variables defined in C program" \
+ "List of variables defined in C program" ;# <-- NOT TRANSLATED YET
+ ##ID:000392##
+ mcset $l "Graph showing voltage levels" \
+ "Graph showing voltage levels" ;# <-- NOT TRANSLATED YET
+ ##ID:000393##
+ mcset $l "Compiler messages" \
+ "Compiler messages" ;# <-- NOT TRANSLATED YET
+ ##ID:000394##
+ mcset $l "Editable notepad" \
+ "Editable notepad" ;# <-- NOT TRANSLATED YET
+ ##ID:000395##
+ mcset $l "Scientific calculator" \
+ "Scientific calculator" ;# <-- NOT TRANSLATED YET
+ ##ID:000396##
+ mcset $l "Linux terminal emulator" \
+ "Linux terminal emulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000397##
+ mcset $l "Search string in files" \
+ "Search string in files" ;# <-- NOT TRANSLATED YET
+ ##ID:000398##
+ mcset $l "Hide the panel" \
+ "Hide the panel" ;# <-- NOT TRANSLATED YET
+ ##ID:000399##
+ mcset $l "Show the panel" \
+ "Show the panel" ;# <-- NOT TRANSLATED YET
+}
+# calculator.tcl
+# ==============================================================================
+namespace eval Calculator {
+ ##ID:000400##
+ mcset $l "Save" \
+ "Save" ;# <-- NOT TRANSLATED YET
+ ##ID:000401##
+ mcset $l "Load" \
+ "Load" ;# <-- NOT TRANSLATED YET
+ ##ID:000402##
+ mcset $l "Calculator: M%s saved" \
+ "Calculator: M%s saved" ;# <-- NOT TRANSLATED YET
+ ##ID:000403##
+ mcset $l "Calculator: Unable to evaluate, missing argument" \
+ "Calculator: Unable to evaluate, missing argument" ;# <-- NOT TRANSLATED YET
+ ##ID:000404##
+ mcset $l "Calculator: Unable to evaluate, missing operator" \
+ "Calculator: Unable to evaluate, missing operator" ;# <-- NOT TRANSLATED YET
+ ##ID:000405##
+ mcset $l "Calculator: WARNING result is +/- infinity => operation terminated !" \
+ "Calculator: WARNING result is +/- infinity => operation terminated !" ;# <-- NOT TRANSLATED YET
+ ##ID:000406##
+ mcset $l "Calculator: This value is too high to invert (max. 0xFFFFFFFF)" \
+ "Calculator: This value is too high to invert (max. 0xFFFFFFFF)" ;# <-- NOT TRANSLATED YET
+ ##ID:000407##
+ mcset $l "Calculator: ERROR (result value is out of allowed range)" \
+ "Calculator: ERROR (result value is out of allowed range)" ;# <-- NOT TRANSLATED YET
+ ##ID:000408##
+ mcset $l "Calculator: Unable to evaluate, result value is too high" \
+ "Calculator: Unable to evaluate, result value is too high" ;# <-- NOT TRANSLATED YET
+ ##ID:000409##
+ mcset $l "Calculator: UNDO: previous state was: %s %s %s" \
+ "Calculator: UNDO: previous state was: %s %s %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000410##
+ mcset $l "Calculator: REDO: previous state was: %s %s %s" \
+ "Calculator: REDO: previous state was: %s %s %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000411##
+ mcset $l "Calculator: Value is too high to convert, value deleted !" \
+ "Calculator: Value is too high to convert, value deleted !" ;# <-- NOT TRANSLATED YET
+ ##ID:000412##
+ mcset $l "Calculator: ERROR, result is too high (cannot be displayed)" \
+ "Calculator: ERROR, result is too high (cannot be displayed)" ;# <-- NOT TRANSLATED YET
+ ##ID:000413##
+ mcset $l "Calculator: ERROR, value is too high" \
+ "Calculator: ERROR, value is too high" ;# <-- NOT TRANSLATED YET
+ ##ID:000414##
+ mcset $l "Buffer display" \
+ "Buffer display" ;# <-- NOT TRANSLATED YET
+ ##ID:000415##
+ mcset $l "Calculator buffer" \
+ "Calculator buffer" ;# <-- NOT TRANSLATED YET
+ ##ID:000416##
+ mcset $l "Selected operation" \
+ "Selected operation" ;# <-- NOT TRANSLATED YET
+ ##ID:000417##
+ mcset $l "Main display" \
+ "Main display" ;# <-- NOT TRANSLATED YET
+ ##ID:000418##
+ mcset $l "Numeric base" \
+ "Numeric base" ;# <-- NOT TRANSLATED YET
+ ##ID:000419##
+ mcset $l "Angle unit" \
+ "Angle unit" ;# <-- NOT TRANSLATED YET
+ ##ID:000420##
+ mcset $l "Clear both displays" \
+ "Clear both displays" ;# <-- NOT TRANSLATED YET
+ ##ID:000421##
+ mcset $l "Clear main display" \
+ "Clear main display" ;# <-- NOT TRANSLATED YET
+ ##ID:000422##
+ mcset $l "Negate value in main display" \
+ "Negate value in main display" ;# <-- NOT TRANSLATED YET
+ ##ID:000423##
+ mcset $l "Memory bank %s" \
+ "Memory bank %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000424##
+ mcset $l "Save content of main display to this memory bank %s" \
+ "Save content of main display to this memory bank %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000425##
+ mcset $l "Load content of this bank into main display" \
+ "Load content of this bank into main display" ;# <-- NOT TRANSLATED YET
+ ##ID:000426##
+ mcset $l "Load content of memory bank %s into calculator main display" \
+ "Load content of memory bank %s into calculator main display" ;# <-- NOT TRANSLATED YET
+ ##ID:000427##
+ mcset $l "Timers preset" \
+ "Timers preset" ;# <-- NOT TRANSLATED YET
+ ##ID:000428##
+ mcset $l "Invalid numerical base: '%s'" \
+ "Invalid numerical base: '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:000429##
+ mcset $l "Invalid angle unit: '%s'" \
+ "Invalid angle unit: '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:000430##
+ mcset $l "Calculator - timers preset: you are trying to insert an invalid value" \
+ "Calculator - timers preset: you are trying to insert an invalid value" ;# <-- NOT TRANSLATED YET
+ ##ID:000431##
+ mcset $l "Frequency \[kHz\]" \
+ "Frequency \[kHz\]" ;# <-- NOT TRANSLATED YET
+ ##ID:000432##
+ mcset $l "Mode" \
+ "Mode" ;# <-- NOT TRANSLATED YET
+ ##ID:000433##
+ mcset $l "Time \[us\]" \
+ "Time \[us\]" ;# <-- NOT TRANSLATED YET
+ ##ID:000434##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:000435##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:000436##
+ mcset $l "OCT" \
+ "OCT" ;# <-- NOT TRANSLATED YET
+ ##ID:000437##
+ mcset $l "Repeats" \
+ "Repeats" ;# <-- NOT TRANSLATED YET
+ ##ID:000438##
+ mcset $l "Correction" \
+ "Correction" ;# <-- NOT TRANSLATED YET
+ ##ID:000439##
+ mcset $l "Bit-wise AND" \
+ "Bit-wise AND" ;# <-- NOT TRANSLATED YET
+ ##ID:000440##
+ mcset $l "Bit-wise AND. Valid for integer operands only." \
+ "Bit-wise AND. Valid for integer operands only." ;# <-- NOT TRANSLATED YET
+ ##ID:000441##
+ mcset $l "Sine" \
+ "Sine" ;# <-- NOT TRANSLATED YET
+ ##ID:000442##
+ mcset $l "Cosine" \
+ "Cosine" ;# <-- NOT TRANSLATED YET
+ ##ID:000443##
+ mcset $l "Tangent" \
+ "Tangent" ;# <-- NOT TRANSLATED YET
+ ##ID:000444##
+ mcset $l "Bit-wise OR" \
+ "Bit-wise OR" ;# <-- NOT TRANSLATED YET
+ ##ID:000445##
+ mcset $l "Bit-wise OR. Valid for integer operands only." \
+ "Bit-wise OR. Valid for integer operands only." ;# <-- NOT TRANSLATED YET
+ ##ID:000446##
+ mcset $l "Arc sine" \
+ "Arc sine" ;# <-- NOT TRANSLATED YET
+ ##ID:000447##
+ mcset $l "Arc sine. Argument should be in the range \[-1,1\]." \
+ "Arc sine. Argument should be in the range \[-1,1\]." ;# <-- NOT TRANSLATED YET
+ ##ID:000448##
+ mcset $l "Arc cosine" \
+ "Arc cosine" ;# <-- NOT TRANSLATED YET
+ ##ID:000449##
+ mcset $l "Arc cosine. Argument should be in the range \[-1,1\]." \
+ "Arc cosine. Argument should be in the range \[-1,1\]." ;# <-- NOT TRANSLATED YET
+ ##ID:000450##
+ mcset $l "Arc tangent" \
+ "Arc tangent" ;# <-- NOT TRANSLATED YET
+ ##ID:000451##
+ mcset $l "Bit-wise NOT" \
+ "Bit-wise NOT" ;# <-- NOT TRANSLATED YET
+ ##ID:000452##
+ mcset $l "Bit-wise NOT. Valid for integer operands only." \
+ "Bit-wise NOT. Valid for integer operands only." ;# <-- NOT TRANSLATED YET
+ ##ID:000453##
+ mcset $l "Exponential of argument (e**arg)" \
+ "Exponential of argument (e**arg)" ;# <-- NOT TRANSLATED YET
+ ##ID:000454##
+ mcset $l "Square root" \
+ "Square root" ;# <-- NOT TRANSLATED YET
+ ##ID:000455##
+ mcset $l "Square root. Argument must be non-negative." \
+ "Square root. Argument must be non-negative." ;# <-- NOT TRANSLATED YET
+ ##ID:000456##
+ mcset $l "Power" \
+ "Power" ;# <-- NOT TRANSLATED YET
+ ##ID:000457##
+ mcset $l "Computes the value of x raised to the power y. If x is negative, y must be an integer value." \
+ "Computes the value of x raised to the power y. If x is negative, y must be an integer value." ;# <-- NOT TRANSLATED YET
+ ##ID:000458##
+ mcset $l "Bit-wise exclusive OR" \
+ "Bit-wise exclusive OR" ;# <-- NOT TRANSLATED YET
+ ##ID:000459##
+ mcset $l "Bit-wise exclusive OR. Valid for integer operands only." \
+ "Bit-wise exclusive OR. Valid for integer operands only." ;# <-- NOT TRANSLATED YET
+ ##ID:000460##
+ mcset $l "Base 10 logarithm" \
+ "Base 10 logarithm" ;# <-- NOT TRANSLATED YET
+ ##ID:000461##
+ mcset $l "Returns the base 10 logarithm of argument. Argument must be a positive value." \
+ "Returns the base 10 logarithm of argument. Argument must be a positive value." ;# <-- NOT TRANSLATED YET
+ ##ID:000462##
+ mcset $l "Natural logarithm" \
+ "Natural logarithm" ;# <-- NOT TRANSLATED YET
+ ##ID:000463##
+ mcset $l "Returns the natural logarithm of argument. Argument must be a positive value." \
+ "Returns the natural logarithm of argument. Argument must be a positive value." ;# <-- NOT TRANSLATED YET
+ ##ID:000464##
+ mcset $l "Constant Pi" \
+ "Constant Pi" ;# <-- NOT TRANSLATED YET
+ ##ID:000465##
+ mcset $l "Right shift" \
+ "Right shift" ;# <-- NOT TRANSLATED YET
+ ##ID:000466##
+ mcset $l "Right shift. Valid for integer operands only. A right shift always propagates the sign bit." \
+ "Right shift. Valid for integer operands only. A right shift always propagates the sign bit." ;# <-- NOT TRANSLATED YET
+ ##ID:000467##
+ mcset $l "Modulo" \
+ "Modulo" ;# <-- NOT TRANSLATED YET
+ ##ID:000468##
+ mcset $l "Computes remainder of integer division" \
+ "Computes remainder of integer division" ;# <-- NOT TRANSLATED YET
+ ##ID:000469##
+ mcset $l "Undo last operation" \
+ "Undo last operation" ;# <-- NOT TRANSLATED YET
+ ##ID:000470##
+ mcset $l "Undo last operation. Not all operations are supported." \
+ "Undo last operation. Not all operations are supported." ;# <-- NOT TRANSLATED YET
+ ##ID:000471##
+ mcset $l "Take back last undo operation" \
+ "Take back last undo operation" ;# <-- NOT TRANSLATED YET
+ ##ID:000472##
+ mcset $l "Take back last undo operation. Not all operations are supported." \
+ "Take back last undo operation. Not all operations are supported." ;# <-- NOT TRANSLATED YET
+}
+# innerwindow.tcl
+# ==============================================================================
+namespace eval InnerWindow {
+ ##ID:000473##
+ mcset $l "Shade/Unshade" \
+ "Shade/Unshade" ;# <-- NOT TRANSLATED YET
+ ##ID:000474##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:000475##
+ mcset $l "Shade" \
+ "Shade" ;# <-- NOT TRANSLATED YET
+}
+# configdialogues.tcl
+# ==============================================================================
+namespace eval ::configDialogues::editor {
+ ##ID:000476##
+ mcset $l "Editor configuration - %s" \
+ "Editor configuration - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000477##
+ mcset $l "Editor configuration" \
+ "Editor configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:000478##
+ mcset $l "Editor" \
+ "Editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000479##
+ mcset $l "Editor selection" \
+ "Editor selection" ;# <-- NOT TRANSLATED YET
+ ##ID:000480##
+ mcset $l "General" \
+ "General" ;# <-- NOT TRANSLATED YET
+ ##ID:000481##
+ mcset $l "General configuration" \
+ "General configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:000482##
+ mcset $l "Colors" \
+ "Colors" ;# <-- NOT TRANSLATED YET
+ ##ID:000483##
+ mcset $l "Various colors in editor" \
+ "Various colors in editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000484##
+ mcset $l "Fonts" \
+ "Fonts" ;# <-- NOT TRANSLATED YET
+ ##ID:000485##
+ mcset $l "Fonts used by editor" \
+ "Fonts used by editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000486##
+ mcset $l "Syntax highlight" \
+ "Syntax highlight" ;# <-- NOT TRANSLATED YET
+ ##ID:000487##
+ mcset $l "Source code highlighting" \
+ "Source code highlighting" ;# <-- NOT TRANSLATED YET
+ ##ID:000488##
+ mcset $l "Apply" \
+ "Apply" ;# <-- NOT TRANSLATED YET
+ ##ID:000489##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000490##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:000491##
+ mcset $l "Preferred editor:" \
+ "Preferred editor:" ;# <-- NOT TRANSLATED YET
+ ##ID:000492##
+ mcset $l "Native editor" \
+ "Native editor" ;# <-- NOT TRANSLATED YET
+ ##ID:000493##
+ mcset $l "(This change will take effect upon next start.)" \
+ "(This change will take effect upon next start.)" ;# <-- NOT TRANSLATED YET
+ ##ID:000494##
+ mcset $l "Editing" \
+ "Editing" ;# <-- NOT TRANSLATED YET
+ ##ID:000495##
+ mcset $l "File opening, saving, etc." \
+ "File opening, saving, etc." ;# <-- NOT TRANSLATED YET
+ ##ID:000496##
+ mcset $l "Command line" \
+ "Command line" ;# <-- NOT TRANSLATED YET
+ ##ID:000497##
+ mcset $l "Auto brackets" \
+ "Auto brackets" ;# <-- NOT TRANSLATED YET
+ ##ID:000498##
+ mcset $l "When you type a left bracket, editor\nwill automatically insert right bracket" \
+ "When you type a left bracket, editor\nwill automatically insert right bracket" ;# <-- NOT TRANSLATED YET
+ ##ID:000499##
+ mcset $l "Indentation mode" \
+ "Indentation mode" ;# <-- NOT TRANSLATED YET
+ ##ID:000500##
+ mcset $l "none" \
+ "none" ;# <-- NOT TRANSLATED YET
+ ##ID:000501##
+ mcset $l "normal" \
+ "normal" ;# <-- NOT TRANSLATED YET
+ ##ID:000502##
+ mcset $l "What to do when you press enter\n\tnone\t- start on the beginning of the next line\n\tnormal\t- keep indention of the previous line" \
+ "What to do when you press enter\n\tnone\t- start on the beginning of the next line\n\tnormal\t- keep indention of the previous line" ;# <-- NOT TRANSLATED YET
+ ##ID:004467##
+ mcset $l "Tab width" \
+ "Tab width" ;# <-- NOT TRANSLATED YET
+ ##ID:004468##
+ mcset $l "Maximum width of the tab character, measured in number of spaces" \
+ "Maximum width of the tab character, measured in number of spaces" ;# <-- NOT TRANSLATED YET
+ ##ID:000503##
+ mcset $l "Insert spaces instead of tabs" \
+ "Insert spaces instead of tabs" ;# <-- NOT TRANSLATED YET
+ ##ID:000504##
+ mcset $l "Use spaces instead of tabs" \
+ "Use spaces instead of tabs" ;# <-- NOT TRANSLATED YET
+ ##ID:000505##
+ mcset $l "Number of spaces" \
+ "Number of spaces" ;# <-- NOT TRANSLATED YET
+ ##ID:000506##
+ mcset $l "Number of spaces to use instead of tabs" \
+ "Number of spaces to use instead of tabs" ;# <-- NOT TRANSLATED YET
+ ##ID:000507##
+ mcset $l "Enable autocompletion" \
+ "Enable autocompletion" ;# <-- NOT TRANSLATED YET
+ ##ID:000508##
+ mcset $l "Enable popup-based autocompletion" \
+ "Enable popup-based autocompletion" ;# <-- NOT TRANSLATED YET
+ ##ID:000509##
+ mcset $l "Highlight trailing space" \
+ "Highlight trailing space" ;# <-- NOT TRANSLATED YET
+ ##ID:000510##
+ mcset $l "Show tab bar" \
+ "Show tab bar" ;# <-- NOT TRANSLATED YET
+ ##ID:000511##
+ mcset $l "Default encoding" \
+ "Default encoding" ;# <-- NOT TRANSLATED YET
+ ##ID:000512##
+ mcset $l "When you open file with unknown encoding\nthis encoding will be used" \
+ "When you open file with unknown encoding\nthis encoding will be used" ;# <-- NOT TRANSLATED YET
+ ##ID:000513##
+ mcset $l "Default EOL" \
+ "Default EOL" ;# <-- NOT TRANSLATED YET
+ ##ID:000514##
+ mcset $l "When you open file with unknown\nEOL (End Of Line) this EOL will be used" \
+ "When you open file with unknown\nEOL (End Of Line) this EOL will be used" ;# <-- NOT TRANSLATED YET
+ ##ID:000515##
+ mcset $l "Autosave interval \[minutes\]" \
+ "Autosave interval \[minutes\]" ;# <-- NOT TRANSLATED YET
+ ##ID:000516##
+ mcset $l "Autosave interval in minutes (0 means disabled)" \
+ "Autosave interval in minutes (0 means disabled)" ;# <-- NOT TRANSLATED YET
+ ##ID:000517##
+ mcset $l "Text area background" \
+ "Text area background" ;# <-- NOT TRANSLATED YET
+ ##ID:000518##
+ mcset $l "Normal text" \
+ "Normal text" ;# <-- NOT TRANSLATED YET
+ ##ID:000519##
+ mcset $l "Selected text" \
+ "Selected text" ;# <-- NOT TRANSLATED YET
+ ##ID:000520##
+ mcset $l "Current line" \
+ "Current line" ;# <-- NOT TRANSLATED YET
+ ##ID:000521##
+ mcset $l "Bookmark" \
+ "Bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:000522##
+ mcset $l "Simulator line" \
+ "Simulator line" ;# <-- NOT TRANSLATED YET
+ ##ID:000523##
+ mcset $l "Breakpoint" \
+ "Breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:000524##
+ mcset $l "Invalid breakpoint" \
+ "Invalid breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:000525##
+ mcset $l "Line with an error" \
+ "Line with an error" ;# <-- NOT TRANSLATED YET
+ ##ID:000526##
+ mcset $l "Trailing space" \
+ "Trailing space" ;# <-- NOT TRANSLATED YET
+ ##ID:000527##
+ mcset $l "Additional elements" \
+ "Additional elements" ;# <-- NOT TRANSLATED YET
+ ##ID:000528##
+ mcset $l "Icon border background" \
+ "Icon border background" ;# <-- NOT TRANSLATED YET
+ ##ID:000529##
+ mcset $l "Line numbers background" \
+ "Line numbers background" ;# <-- NOT TRANSLATED YET
+ ##ID:000530##
+ mcset $l "Line numbers foreground" \
+ "Line numbers foreground" ;# <-- NOT TRANSLATED YET
+ ##ID:000531##
+ mcset $l "The Quick Brown Fox Jumps Over The Lazy Dog" \
+ "The Quick Brown Fox Jumps Over The Lazy Dog" ;# <-- NOT TRANSLATED YET
+ ##ID:000532##
+ mcset $l "Searching for available fonts ..." \
+ "Searching for available fonts ..." ;# <-- NOT TRANSLATED YET
+ ##ID:000533##
+ mcset $l "Assembler" \
+ "Assembler" ;# <-- NOT TRANSLATED YET
+ ##ID:000534##
+ mcset $l "C language" \
+ "C language" ;# <-- NOT TRANSLATED YET
+ ##ID:000535##
+ mcset $l "Code listing" \
+ "Code listing" ;# <-- NOT TRANSLATED YET
+ # Keep string length here!
+ ##ID:000536##
+ mcset $l {Color} \
+ {Color} ;# <-- NOT TRANSLATED YET
+ # Keep string length here!
+ ##ID:000537##
+ mcset $l {Content} \
+ {Content} ;# <-- NOT TRANSLATED YET
+ ##ID:000538##
+ mcset $l "increment some register" \
+ "increment some register" ;# <-- NOT TRANSLATED YET
+ ##ID:000539##
+ mcset $l "close main loop" \
+ "close main loop" ;# <-- NOT TRANSLATED YET
+ ##ID:000540##
+ mcset $l "Comment" \
+ "Comment" ;# <-- NOT TRANSLATED YET
+ ##ID:000541##
+ mcset $l "String" \
+ "String" ;# <-- NOT TRANSLATED YET
+ ##ID:000542##
+ mcset $l "macro Some value" \
+ "macro Some value" ;# <-- NOT TRANSLATED YET
+ ##ID:000543##
+ mcset $l "Select color - %s" \
+ "Select color - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000544##
+ mcset $l "Invalid key: '%s'" \
+ "Invalid key: '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:000545##
+ mcset $l "Unable to use external embedded editor because rxvt-unicode is not available" \
+ "Unable to use external embedded editor because rxvt-unicode is not available" ;# <-- NOT TRANSLATED YET
+ ##ID:000546##
+ mcset $l "Program %s is not available. Using native editor." \
+ "Program %s is not available. Using native editor." ;# <-- NOT TRANSLATED YET
+ ##ID:000547##
+ mcset $l "Char" \
+ "Char" ;# <-- NOT TRANSLATED YET
+ ##ID:000548##
+ mcset $l "Hexadecimal number" \
+ "Hexadecimal number" ;# <-- NOT TRANSLATED YET
+ ##ID:000549##
+ mcset $l "Octal number" \
+ "Octal number" ;# <-- NOT TRANSLATED YET
+ ##ID:000550##
+ mcset $l "Decimal number" \
+ "Decimal number" ;# <-- NOT TRANSLATED YET
+ ##ID:000551##
+ mcset $l "Binary number" \
+ "Binary number" ;# <-- NOT TRANSLATED YET
+ ##ID:000552##
+ mcset $l "Constant" \
+ "Constant" ;# <-- NOT TRANSLATED YET
+ ##ID:000553##
+ mcset $l "Generic number" \
+ "Generic number" ;# <-- NOT TRANSLATED YET
+ ##ID:000554##
+ mcset $l "Control sequence" \
+ "Control sequence" ;# <-- NOT TRANSLATED YET
+ ##ID:000555##
+ mcset $l "Symbol" \
+ "Symbol" ;# <-- NOT TRANSLATED YET
+ ##ID:000556##
+ mcset $l "Operand separator" \
+ "Operand separator" ;# <-- NOT TRANSLATED YET
+ ##ID:000557##
+ mcset $l "Directive" \
+ "Directive" ;# <-- NOT TRANSLATED YET
+ ##ID:000558##
+ mcset $l "Label" \
+ "Label" ;# <-- NOT TRANSLATED YET
+ ##ID:000559##
+ mcset $l "Instruction" \
+ "Instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:000560##
+ mcset $l "SFR register" \
+ "SFR register" ;# <-- NOT TRANSLATED YET
+ ##ID:000561##
+ mcset $l "Indirect address" \
+ "Indirect address" ;# <-- NOT TRANSLATED YET
+ ##ID:000562##
+ mcset $l "Immediate char" \
+ "Immediate char" ;# <-- NOT TRANSLATED YET
+ ##ID:000563##
+ mcset $l "Immediate hex" \
+ "Immediate hex" ;# <-- NOT TRANSLATED YET
+ ##ID:000564##
+ mcset $l "Immediate oct" \
+ "Immediate oct" ;# <-- NOT TRANSLATED YET
+ ##ID:000565##
+ mcset $l "Immediate dec" \
+ "Immediate dec" ;# <-- NOT TRANSLATED YET
+ ##ID:000566##
+ mcset $l "Immediate bin" \
+ "Immediate bin" ;# <-- NOT TRANSLATED YET
+ ##ID:000567##
+ mcset $l "Immediate const" \
+ "Immediate const" ;# <-- NOT TRANSLATED YET
+ ##ID:000568##
+ mcset $l "Immediate generic" \
+ "Immediate generic" ;# <-- NOT TRANSLATED YET
+ ##ID:000569##
+ mcset $l "Macro instruction" \
+ "Macro instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:000570##
+ mcset $l "Keyword" \
+ "Keyword" ;# <-- NOT TRANSLATED YET
+ ##ID:000571##
+ mcset $l "Data type" \
+ "Data type" ;# <-- NOT TRANSLATED YET
+ ##ID:000572##
+ mcset $l "Decimal" \
+ "Decimal" ;# <-- NOT TRANSLATED YET
+ ##ID:000573##
+ mcset $l "Hexadecimal" \
+ "Hexadecimal" ;# <-- NOT TRANSLATED YET
+ ##ID:000574##
+ mcset $l "Octal" \
+ "Octal" ;# <-- NOT TRANSLATED YET
+ ##ID:000575##
+ mcset $l "Float" \
+ "Float" ;# <-- NOT TRANSLATED YET
+ ##ID:000576##
+ mcset $l "String char" \
+ "String char" ;# <-- NOT TRANSLATED YET
+ ##ID:000577##
+ mcset $l "Bracket" \
+ "Bracket" ;# <-- NOT TRANSLATED YET
+ ##ID:000578##
+ mcset $l "Preprocessor" \
+ "Preprocessor" ;# <-- NOT TRANSLATED YET
+ ##ID:000579##
+ mcset $l "Preprocessor lib." \
+ "Preprocessor lib." ;# <-- NOT TRANSLATED YET
+ ##ID:000580##
+ mcset $l "Doxygen: Comment" \
+ "Doxygen: Comment" ;# <-- NOT TRANSLATED YET
+ ##ID:000581##
+ mcset $l "Doxygen: Tag" \
+ "Doxygen: Tag" ;# <-- NOT TRANSLATED YET
+ ##ID:000582##
+ mcset $l "Doxygen: Word" \
+ "Doxygen: Word" ;# <-- NOT TRANSLATED YET
+ ##ID:000583##
+ mcset $l "Doxygen: Name" \
+ "Doxygen: Name" ;# <-- NOT TRANSLATED YET
+ ##ID:000584##
+ mcset $l "Doxygen: HTML" \
+ "Doxygen: HTML" ;# <-- NOT TRANSLATED YET
+ ##ID:000585##
+ mcset $l "Doxygen: HTML arg." \
+ "Doxygen: HTML arg." ;# <-- NOT TRANSLATED YET
+ ##ID:000586##
+ mcset $l "Doxygen: HTML val." \
+ "Doxygen: HTML val." ;# <-- NOT TRANSLATED YET
+ ##ID:000587##
+ mcset $l "Value" \
+ "Value" ;# <-- NOT TRANSLATED YET
+ ##ID:000588##
+ mcset $l "Processor code" \
+ "Processor code" ;# <-- NOT TRANSLATED YET
+ ##ID:000589##
+ mcset $l "Address" \
+ "Address" ;# <-- NOT TRANSLATED YET
+ ##ID:000590##
+ mcset $l "Line number" \
+ "Line number" ;# <-- NOT TRANSLATED YET
+ ##ID:000591##
+ mcset $l "Macro level" \
+ "Macro level" ;# <-- NOT TRANSLATED YET
+ ##ID:000592##
+ mcset $l "Inclusion level" \
+ "Inclusion level" ;# <-- NOT TRANSLATED YET
+ ##ID:000593##
+ mcset $l "Error / Warning" \
+ "Error / Warning" ;# <-- NOT TRANSLATED YET
+ ##ID:000594##
+ mcset $l "Message" \
+ "Message" ;# <-- NOT TRANSLATED YET
+}
+namespace eval ::configDialogues::compiler {
+ ##ID:000595##
+ mcset $l "Compiler configuration" \
+ "Compiler configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:000596##
+ mcset $l "Assembly language" \
+ "Assembly language" ;# <-- NOT TRANSLATED YET
+ ##ID:000597##
+ mcset $l "Configure compiler for assembly language" \
+ "Configure compiler for assembly language" ;# <-- NOT TRANSLATED YET
+ ##ID:000598##
+ mcset $l "C language -- SDCC" \
+ "C language -- SDCC" ;# <-- NOT TRANSLATED YET
+ ##ID:000599##
+ mcset $l "GNU make utility" \
+ "GNU make utility" ;# <-- NOT TRANSLATED YET
+ ##ID:000600##
+ mcset $l "Make utility is not available, please install GNU make and restart the IDE." \
+ "Make utility is not available, please install GNU make and restart the IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:000601##
+ mcset $l "Use this Makefile instead of calling C compiler directly:" \
+ "Use this Makefile instead of calling C compiler directly:" ;# <-- NOT TRANSLATED YET
+ ##ID:000602##
+ mcset $l "Makefile:" \
+ "Makefile:" ;# <-- NOT TRANSLATED YET
+ ##ID:004491##
+ mcset $l "Targets:" \
+ "Targets:" ;# <-- NOT TRANSLATED YET
+ ##ID:004492##
+ mcset $l "Options:" \
+ "Options:" ;# <-- NOT TRANSLATED YET
+ ##ID:000603##
+ mcset $l "Clear the entrybox" \
+ "Clear the entrybox" ;# <-- NOT TRANSLATED YET
+ ##ID:000604##
+ mcset $l "Select Makefile" \
+ "Select Makefile" ;# <-- NOT TRANSLATED YET
+ ##ID:000605##
+ mcset $l "Compiler" \
+ "Compiler" ;# <-- NOT TRANSLATED YET
+ ##ID:000606##
+ mcset $l "Reset to defaults" \
+ "Reset to defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000607##
+ mcset $l "Reset all settings to defaults" \
+ "Reset all settings to defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000608##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000609##
+ mcset $l "Commit new settings" \
+ "Commit new settings" ;# <-- NOT TRANSLATED YET
+ ##ID:000610##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:000611##
+ mcset $l "Take changes back and close dialog" \
+ "Take changes back and close dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:000612##
+ mcset $l "Configure compiler - %s" \
+ "Configure compiler - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000613##
+ mcset $l "General" \
+ "General" ;# <-- NOT TRANSLATED YET
+ ##ID:000614##
+ mcset $l "Code generation" \
+ "Code generation" ;# <-- NOT TRANSLATED YET
+ ##ID:000615##
+ mcset $l "Optimization" \
+ "Optimization" ;# <-- NOT TRANSLATED YET
+ ##ID:000616##
+ mcset $l "Linker" \
+ "Linker" ;# <-- NOT TRANSLATED YET
+ ##ID:000617##
+ mcset $l "Custom" \
+ "Custom" ;# <-- NOT TRANSLATED YET
+ ##ID:000618##
+ mcset $l "Standard:" \
+ "Standard:" ;# <-- NOT TRANSLATED YET
+ ##ID:000619##
+ mcset $l "Include path" \
+ "Include path" ;# <-- NOT TRANSLATED YET
+ ##ID:000620##
+ mcset $l "Add to the include path, as in -Ipath\nPaths are separated by semicolons (`;')" \
+ "Add to the include path, as in -Ipath\nPaths are separated by semicolons (`;')" ;# <-- NOT TRANSLATED YET
+ ##ID:000621##
+ mcset $l "Disable warning" \
+ "Disable warning" ;# <-- NOT TRANSLATED YET
+ ##ID:000622##
+ mcset $l "Disable specific warning (--disable-warning)\nNumbers are separated by semicolons (`;')" \
+ "Disable specific warning (--disable-warning)\nNumbers are separated by semicolons (`;')" ;# <-- NOT TRANSLATED YET
+ ##ID:000623##
+ mcset $l "Model:" \
+ "Model:" ;# <-- NOT TRANSLATED YET
+ ##ID:000624##
+ mcset $l "External data space is used" \
+ "External data space is used" ;# <-- NOT TRANSLATED YET
+ ##ID:000625##
+ mcset $l "External paged data space is used" \
+ "External paged data space is used" ;# <-- NOT TRANSLATED YET
+ ##ID:000626##
+ mcset $l "Internal data space is used" \
+ "Internal data space is used" ;# <-- NOT TRANSLATED YET
+ ##ID:000627##
+ mcset $l "Use this name for the code segment" \
+ "Use this name for the code segment" ;# <-- NOT TRANSLATED YET
+ ##ID:000628##
+ mcset $l "Use this name for the const segment" \
+ "Use this name for the const segment" ;# <-- NOT TRANSLATED YET
+ ##ID:000629##
+ mcset $l "Stack:" \
+ "Stack:" ;# <-- NOT TRANSLATED YET
+ ##ID:000630##
+ mcset $l "Include the given library in the link\nPaths are separated by semicolons (`;')" \
+ "Include the given library in the link\nPaths are separated by semicolons (`;')" ;# <-- NOT TRANSLATED YET
+ ##ID:000631##
+ mcset $l "Add the next field to the library search path\nPaths are separated by semicolons (`;')" \
+ "Add the next field to the library search path\nPaths are separated by semicolons (`;')" ;# <-- NOT TRANSLATED YET
+ ##ID:000632##
+ mcset $l "Use this path to search for libraries" \
+ "Use this path to search for libraries" ;# <-- NOT TRANSLATED YET
+ ##ID:000633##
+ mcset $l "External Ram start location" \
+ "External Ram start location" ;# <-- NOT TRANSLATED YET
+ ##ID:000634##
+ mcset $l "External Stack start location" \
+ "External Stack start location" ;# <-- NOT TRANSLATED YET
+ ##ID:000635##
+ mcset $l "Code Segment Location" \
+ "Code Segment Location" ;# <-- NOT TRANSLATED YET
+ ##ID:000636##
+ mcset $l "Stack pointer initial value" \
+ "Stack pointer initial value" ;# <-- NOT TRANSLATED YET
+ ##ID:000637##
+ mcset $l "Direct data start location" \
+ "Direct data start location" ;# <-- NOT TRANSLATED YET
+ ##ID:000638##
+ mcset $l "Tells the linker to allocate this space for stack" \
+ "Tells the linker to allocate this space for stack" ;# <-- NOT TRANSLATED YET
+ ##ID:000641##
+ mcset $l "Preferred assembler:" \
+ "Preferred assembler:" ;# <-- NOT TRANSLATED YET
+ ##ID:000642##
+ mcset $l "Notes to assemblers:\n" \
+ "Notes to assemblers:\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000643##
+ mcset $l " a) MCU 8051 IDE has its own native assembler\n" \
+ " a) MCU 8051 IDE has its own native assembler\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000644##
+ mcset $l " b) ASEM-51 is a great assembler written by W.W. Heinz.\n" \
+ " b) ASEM-51 is a great assembler written by W.W. Heinz.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000645##
+ mcset $l " You can find it at http://plit.de/asem-51/home.htm\n" \
+ " You can find it at http://plit.de/asem-51/home.htm\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000646##
+ mcset $l " c) ASL: http://linux.maruhn.com/sec/asl.html\n" \
+ " c) ASL: http://linux.maruhn.com/sec/asl.html\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000647##
+ mcset $l " d) AS31: http://www.pjrc.com/tech/8051/\n" \
+ " d) AS31: http://www.pjrc.com/tech/8051/\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000648##
+ mcset $l "MCU 8051 IDE native assembler - Sophisticated but slow" \
+ "MCU 8051 IDE native assembler - Sophisticated but slow" ;# <-- NOT TRANSLATED YET
+ ##ID:000649##
+ mcset $l "Sophisticated and very fast assembler written by W.W. Heinz" \
+ "Sophisticated and very fast assembler written by W.W. Heinz" ;# <-- NOT TRANSLATED YET
+ ##ID:000650##
+ mcset $l "Multiplatform assembler written by Alfred Arnold" \
+ "Multiplatform assembler written by Alfred Arnold" ;# <-- NOT TRANSLATED YET
+ ##ID:000651##
+ mcset $l "Simple 8051 assembler" \
+ "Simple 8051 assembler" ;# <-- NOT TRANSLATED YET
+ ##ID:000652##
+ mcset $l "Generate an object file in absolute OMF-51 format" \
+ "Generate an object file in absolute OMF-51 format" ;# <-- NOT TRANSLATED YET
+ ##ID:000653##
+ mcset $l "Output additional column numbers after the line numbers of program error messages" \
+ "Output additional column numbers after the line numbers of program error messages" ;# <-- NOT TRANSLATED YET
+ ##ID:000654##
+ mcset $l "Output additional product, version, and error summary information" \
+ "Output additional product, version, and error summary information" ;# <-- NOT TRANSLATED YET
+ ##ID:000655##
+ mcset $l "Generate MCU 8051 IDE debug file" \
+ "Generate MCU 8051 IDE debug file" ;# <-- NOT TRANSLATED YET
+ ##ID:000656##
+ mcset $l "Generate <file>.adb (MCU 8051 IDE Assembler Debug File) from <file>.lst" \
+ "Generate <file>.adb (MCU 8051 IDE Assembler Debug File) from <file>.lst" ;# <-- NOT TRANSLATED YET
+ ##ID:000657##
+ mcset $l "Include paths:" \
+ "Include paths:" ;# <-- NOT TRANSLATED YET
+ ##ID:000658##
+ mcset $l "Option -i\nSeparate directories by colons (`:')" \
+ "Option -i\nSeparate directories by colons (`:')" ;# <-- NOT TRANSLATED YET
+ ##ID:000659##
+ mcset $l "Custom options:" \
+ "Custom options:" ;# <-- NOT TRANSLATED YET
+ ##ID:000660##
+ mcset $l "Generate a listing file, option `-l'" \
+ "Generate a listing file, option `-l'" ;# <-- NOT TRANSLATED YET
+ ##ID:000661##
+ mcset $l "This option tells the assembler to generate a listing file.\n\nTHIS OPTION IS REQUIRED BY THIS IDE TO GENERATE DEBUG FILE !" \
+ "This option tells the assembler to generate a listing file.\n\nTHIS OPTION IS REQUIRED BY THIS IDE TO GENERATE DEBUG FILE !" ;# <-- NOT TRANSLATED YET
+ ##ID:000662##
+ mcset $l "Generate <file>.adb (MCU 8051 IDE Assembler Debug File)\nfrom <file>.lst" \
+ "Generate <file>.adb (MCU 8051 IDE Assembler Debug File)\nfrom <file>.lst" ;# <-- NOT TRANSLATED YET
+ ##ID:000663##
+ mcset $l "This options specifies the output format that is to be used.\n\nSee AS31 manual page for more details ..." \
+ "This options specifies the output format that is to be used.\n\nSee AS31 manual page for more details ..." ;# <-- NOT TRANSLATED YET
+ ##ID:000664##
+ mcset $l "This option specifies a format specific string which is\npassed to the format generator. Both format \"tdr\" and the\nsrecord formats use this option." \
+ "This option specifies a format specific string which is\npassed to the format generator. Both format \"tdr\" and the\nsrecord formats use this option." ;# <-- NOT TRANSLATED YET
+ ##ID:000665##
+ mcset $l "Change the data structure that is internally used to store\nthe symbol table. By default, AS uses binary trees to store\nmacro and symbol definitions. Turning this option on will\nchange this to AVL-balanced trees. Depending on the ratio\nof symbol entries and lookups, this might speed up assembly.\nUsing AVL-balanced trees helps also reducing the stack usage,\nwhich is however irrelevant for the C version of AS." \
+ "Change the data structure that is internally used to store\nthe symbol table. By default, AS uses binary trees to store\nmacro and symbol definitions. Turning this option on will\nchange this to AVL-balanced trees. Depending on the ratio\nof symbol entries and lookups, this might speed up assembly.\nUsing AVL-balanced trees helps also reducing the stack usage,\nwhich is however irrelevant for the C version of AS." ;# <-- NOT TRANSLATED YET
+ ##ID:000666##
+ mcset $l "Instruct AS to write out the shared symbol definitions in\na format suitable for including into an AS assembler program.\nThe file's name is constructed by replacing the source file's\nextension with '.inc'. See the user manual for more\ninformation about symbol sharing." \
+ "Instruct AS to write out the shared symbol definitions in\na format suitable for including into an AS assembler program.\nThe file's name is constructed by replacing the source file's\nextension with '.inc'. See the user manual for more\ninformation about symbol sharing." ;# <-- NOT TRANSLATED YET
+ ##ID:000667##
+ mcset $l "Add a cross reference table to the assembler listing. A cross\nreference table lists all symbols that have been referenced\nat least once during assembly, including the source line\nnumber(s) and count of every reference. This option only makes\nsense when the generation of an assembly listing has been\nturned on via the -L or -l parameters. " \
+ "Add a cross reference table to the assembler listing. A cross\nreference table lists all symbols that have been referenced\nat least once during assembly, including the source line\nnumber(s) and count of every reference. This option only makes\nsense when the generation of an assembly listing has been\nturned on via the -L or -l parameters. " ;# <-- NOT TRANSLATED YET
+ ##ID:000668##
+ mcset $l "Instruct AS to write out the shared symbol definitions in a\nformat suitable for including into a C program. The file's\nname is constructed by replacing the source file's extension\nwith '.h'. See the user manual for more information about\nsymbol sharing." \
+ "Instruct AS to write out the shared symbol definitions in a\nformat suitable for including into a C program. The file's\nname is constructed by replacing the source file's extension\nwith '.h'. See the user manual for more information about\nsymbol sharing." ;# <-- NOT TRANSLATED YET
+ ##ID:000669##
+ mcset $l "Force AS to print all hexadecimal constants with lowercase\nletters, rather than with uppercase letters A..F which is\nthe default." \
+ "Force AS to print all hexadecimal constants with lowercase\nletters, rather than with uppercase letters A..F which is\nthe default." ;# <-- NOT TRANSLATED YET
+ ##ID:000670##
+ mcset $l "Add an include file list to the assembly listing. An include\nfile list contains all files that have been included while\nassembling the source files, including multiple and nested\ninclusion. Nesting of inclusion is identified by different\nindention. This option only makes sense when the generation of\nan assembly listing has been turned on via the -L or -l parameters." \
+ "Add an include file list to the assembly listing. An include\nfile list contains all files that have been included while\nassembling the source files, including multiple and nested\ninclusion. Nesting of inclusion is identified by different\nindention. This option only makes sense when the generation of\nan assembly listing has been turned on via the -L or -l parameters." ;# <-- NOT TRANSLATED YET
+ ##ID:000671##
+ mcset $l "Turn on generation of an assembly listing and send it to a\nfile whose name is constructed by replacing the source\nfile's extension with '.lst'." \
+ "Turn on generation of an assembly listing and send it to a\nfile whose name is constructed by replacing the source\nfile's extension with '.lst'." ;# <-- NOT TRANSLATED YET
+ ##ID:000672##
+ mcset $l "Turn on generation of a macro definition file. A macro\ndefinition file is a file that contains all macro definitions\nthat have been detected during assembly, in a format suitable\nfor an inclusion into another file. The macro definition file's\nname is constructed by replacing the source file's extension\nwith '.mac'." \
+ "Turn on generation of a macro definition file. A macro\ndefinition file is a file that contains all macro definitions\nthat have been detected during assembly, in a format suitable\nfor an inclusion into another file. The macro definition file's\nname is constructed by replacing the source file's extension\nwith '.mac'." ;# <-- NOT TRANSLATED YET
+ ##ID:000673##
+ mcset $l "Turn on generation of a macro output file. A macro output\nfile contains the intermediate source code that remains after\nmacro expansion and conditional assembly. The macro output\nfile's name is constructed by replacing the source file's\nextension with '.i'." \
+ "Turn on generation of a macro output file. A macro output\nfile contains the intermediate source code that remains after\nmacro expansion and conditional assembly. The macro output\nfile's name is constructed by replacing the source file's\nextension with '.i'." ;# <-- NOT TRANSLATED YET
+ ##ID:000674##
+ mcset $l "Force AS to extend all error and warning messages with their\ninternal error resp. warning number." \
+ "Force AS to extend all error and warning messages with their\ninternal error resp. warning number." ;# <-- NOT TRANSLATED YET
+ ##ID:000675##
+ mcset $l "Turn on silent assembly mode. In silent compilation mode, AS\nwill not do any console output except for warning and\nerror messages." \
+ "Turn on silent assembly mode. In silent compilation mode, AS\nwill not do any console output except for warning and\nerror messages." ;# <-- NOT TRANSLATED YET
+ ##ID:000676##
+ mcset $l "Add a section list to the assembly listing. A section list\ncontains all sections that have been defined in the source\nfiles, marking their nesting level by different levels of\nindentation. This option only makes sense when the generation\nof an assembly listing has been turned on via the\n-L or -l parameters." \
+ "Add a section list to the assembly listing. A section list\ncontains all sections that have been defined in the source\nfiles, marking their nesting level by different levels of\nindentation. This option only makes sense when the generation\nof an assembly listing has been turned on via the\n-L or -l parameters." ;# <-- NOT TRANSLATED YET
+ ##ID:000677##
+ mcset $l "Tell AS to do additional bookkeeping about which address\nranges have been used by the assembled program. This option\nenables the detection of overlapping memory usage. If an\nassembly listing has been turned on via the -L or -l parameters,\nit will also contain a list of all used memory areas." \
+ "Tell AS to do additional bookkeeping about which address\nranges have been used by the assembled program. This option\nenables the detection of overlapping memory usage. If an\nassembly listing has been turned on via the -L or -l parameters,\nit will also contain a list of all used memory areas." ;# <-- NOT TRANSLATED YET
+ ##ID:000678##
+ mcset $l "Force AS to operate in case-sensitive mode. By default,\nnames of symbols, macros, user-defined functions and sections\nare treated in a case-insensitive manner." \
+ "Force AS to operate in case-sensitive mode. By default,\nnames of symbols, macros, user-defined functions and sections\nare treated in a case-insensitive manner." ;# <-- NOT TRANSLATED YET
+ ##ID:000679##
+ mcset $l "Suppress output of warnings." \
+ "Suppress output of warnings." ;# <-- NOT TRANSLATED YET
+ ##ID:000680##
+ mcset $l "Turn on extended error reporting. With extended error\nreporting, several error and warning messages will also\nprint the item that created the message, e.g. the name of\nan unknown instruction. When this option is given twice,\nthe erroneous source line is additinally printed." \
+ "Turn on extended error reporting. With extended error\nreporting, several error and warning messages will also\nprint the item that created the message, e.g. the name of\nan unknown instruction. When this option is given twice,\nthe erroneous source line is additinally printed." ;# <-- NOT TRANSLATED YET
+ ##ID:000681##
+ mcset $l "Generate IHEX file" \
+ "Generate IHEX file" ;# <-- NOT TRANSLATED YET
+ ##ID:000682##
+ mcset $l "Use program p2hex to convert <file>.p to <file>.hex" \
+ "Use program p2hex to convert <file>.p to <file>.hex" ;# <-- NOT TRANSLATED YET
+ ##ID:000683##
+ mcset $l "Generate <file>.adb (MCU 8051 IDE Assembler Debug File)\nfrom <file>.hex and <file>.map" \
+ "Generate <file>.adb (MCU 8051 IDE Assembler Debug File)\nfrom <file>.hex and <file>.map" ;# <-- NOT TRANSLATED YET
+ ##ID:000684##
+ mcset $l "Set the target processor to <name>.\nUse this option if the source file does\nnot contain a CPU statement." \
+ "Set the target processor to <name>.\nUse this option if the source file does\nnot contain a CPU statement." ;# <-- NOT TRANSLATED YET
+ ##ID:000685##
+ mcset $l "-g \[MAP|Atmel|NoICE\]\n\tInstruct AS to write an additional file containing\n\tdebug information. This information covers the symbol\n\ttable and the relation between source line numbers\n\tand machine addresses. The argument specifies whether\n\tdebug info shall be written in AS's own MAP format,\n\tthe object format for Atmel's AVR tools, or a command\n\tfile suitable for John Hartman's NoICE. If no argument\n\tis given, MAP will be chosen. The file's name is\n\tconstructed by replacing the source file's extension\n\twith '.map', '.obj', or '.noi' respectively.\n\nMCU 8051 IDE requires MAP to be selected\nhere to generate debug file" \
+ "-g \[MAP|Atmel|NoICE\]\n\tInstruct AS to write an additional file containing\n\tdebug information. This information covers the symbol\n\ttable and the relation between source line numbers\n\tand machine addresses. The argument specifies whether\n\tdebug info shall be written in AS's own MAP format,\n\tthe object format for Atmel's AVR tools, or a command\n\tfile suitable for John Hartman's NoICE. If no argument\n\tis given, MAP will be chosen. The file's name is\n\tconstructed by replacing the source file's extension\n\twith '.map', '.obj', or '.noi' respectively.\n\nMCU 8051 IDE requires MAP to be selected\nhere to generate debug file" ;# <-- NOT TRANSLATED YET
+ ##ID:000686##
+ mcset $l "-r \[pass number\]\n\tTell AS to output warnings when a situation appears\n\tin a source file that forces another pass of assembly.\n\tSuch situations either take place when a symbol is\n\tundefined in the first pass or a symbol's value has\n\tchanged compared to the previous pass. This option\n\tis useful to track down sources of excessive\n\tmulti-passing, but be aware that it might yield a\n\tfairly large number of warnings, especially in the\n\tfirst pass. Optionally, a pass number may be added\n\tto this option to inhibit output until a certain\n\tpass is reached." \
+ "-r \[pass number\]\n\tTell AS to output warnings when a situation appears\n\tin a source file that forces another pass of assembly.\n\tSuch situations either take place when a symbol is\n\tundefined in the first pass or a symbol's value has\n\tchanged compared to the previous pass. This option\n\tis useful to track down sources of excessive\n\tmulti-passing, but be aware that it might yield a\n\tfairly large number of warnings, especially in the\n\tfirst pass. Optionally, a pass number may be added\n\tto this option to inhibit output until a certain\n\tpass is reached." ;# <-- NOT TRANSLATED YET
+ ##ID:000687##
+ mcset $l "-i <path\[:path...\]>\tAdd new entries to the list of paths that are\n\tsearched for include files. New entries are\n\tprepended to the current include path list,\n\tso if multiple paths are given with one\n\tcommand-line parameter, they will be entered\n\tinto the path list in reverse order." \
+ "-i <path\[:path...\]>\tAdd new entries to the list of paths that are\n\tsearched for include files. New entries are\n\tprepended to the current include path list,\n\tso if multiple paths are given with one\n\tcommand-line parameter, they will be entered\n\tinto the path list in reverse order." ;# <-- NOT TRANSLATED YET
+ ##ID:000688##
+ mcset $l "Trace calls to the preprocessor, assembler and linker" \
+ "Trace calls to the preprocessor, assembler and linker" ;# <-- NOT TRANSLATED YET
+ ##ID:000689##
+ mcset $l "Execute verbosely. Show sub commands as they are run" \
+ "Execute verbosely. Show sub commands as they are run" ;# <-- NOT TRANSLATED YET
+ ##ID:000690##
+ mcset $l "Compile only; do not assemble or link" \
+ "Compile only; do not assemble or link" ;# <-- NOT TRANSLATED YET
+ ##ID:000691##
+ mcset $l "Compile and assemble, but do not link" \
+ "Compile and assemble, but do not link" ;# <-- NOT TRANSLATED YET
+ ##ID:000692##
+ mcset $l "Preprocess only, do not compile" \
+ "Preprocess only, do not compile" ;# <-- NOT TRANSLATED YET
+ ##ID:000693##
+ mcset $l "Act in c1 mode. The standard input is preprocessed code, the output is assembly code." \
+ "Act in c1 mode. The standard input is preprocessed code, the output is assembly code." ;# <-- NOT TRANSLATED YET
+ ##ID:000694##
+ mcset $l "Display the directories in the compiler's search path" \
+ "Display the directories in the compiler's search path" ;# <-- NOT TRANSLATED YET
+ ##ID:000695##
+ mcset $l "Send errors to stdout instead of stderr" \
+ "Send errors to stdout instead of stderr" ;# <-- NOT TRANSLATED YET
+ ##ID:000696##
+ mcset $l "Do not include the standard library directory in the search path" \
+ "Do not include the standard library directory in the search path" ;# <-- NOT TRANSLATED YET
+ ##ID:000697##
+ mcset $l "Disable some of the more pedantic warnings" \
+ "Disable some of the more pedantic warnings" ;# <-- NOT TRANSLATED YET
+ ##ID:000698##
+ mcset $l "Enable debugging symbol output" \
+ "Enable debugging symbol output" ;# <-- NOT TRANSLATED YET
+ ##ID:000699##
+ mcset $l "Display complexity of compiled functions" \
+ "Display complexity of compiled functions" ;# <-- NOT TRANSLATED YET
+ ##ID:000700##
+ mcset $l "Permit '\$' as an identifier character" \
+ "Permit '\$' as an identifier character" ;# <-- NOT TRANSLATED YET
+ ##ID:000701##
+ mcset $l "Make \"char\" unsigned by default" \
+ "Make \"char\" unsigned by default" ;# <-- NOT TRANSLATED YET
+ ##ID:000702##
+ mcset $l "Use C89 standard only" \
+ "Use C89 standard only" ;# <-- NOT TRANSLATED YET
+ ##ID:000703##
+ mcset $l "Use C89 standard with SDCC extensions" \
+ "Use C89 standard with SDCC extensions" ;# <-- NOT TRANSLATED YET
+ ##ID:000704##
+ mcset $l "Use C99 standard only (incomplete)" \
+ "Use C99 standard only (incomplete)" ;# <-- NOT TRANSLATED YET
+ ##ID:000705##
+ mcset $l "Use C99 standard with SDCC extensions (incomplete)" \
+ "Use C99 standard with SDCC extensions (incomplete)" ;# <-- NOT TRANSLATED YET
+ ##ID:000706##
+ mcset $l "Use external stack" \
+ "Use external stack" ;# <-- NOT TRANSLATED YET
+ ##ID:000707##
+ mcset $l "Use reenterant calls on the int and long support functions" \
+ "Use reenterant calls on the int and long support functions" ;# <-- NOT TRANSLATED YET
+ ##ID:000708##
+ mcset $l "Use reenterant calls on the float support functions" \
+ "Use reenterant calls on the float support functions" ;# <-- NOT TRANSLATED YET
+ ##ID:000709##
+ mcset $l "Issue a return after main()" \
+ "Issue a return after main()" ;# <-- NOT TRANSLATED YET
+ ##ID:000710##
+ mcset $l "Use movc instead of movx to read xram (xdata)" \
+ "Use movc instead of movx to read xram (xdata)" ;# <-- NOT TRANSLATED YET
+ ##ID:000711##
+ mcset $l "On supported ports, generate extra profiling information" \
+ "On supported ports, generate extra profiling information" ;# <-- NOT TRANSLATED YET
+ ##ID:000712##
+ mcset $l "Leave out the frame pointer." \
+ "Leave out the frame pointer." ;# <-- NOT TRANSLATED YET
+ ##ID:000713##
+ mcset $l "Callee will always save registers used" \
+ "Callee will always save registers used" ;# <-- NOT TRANSLATED YET
+ ##ID:000714##
+ mcset $l "Insert call to function __stack_probe at each function prologue" \
+ "Insert call to function __stack_probe at each function prologue" ;# <-- NOT TRANSLATED YET
+ ##ID:000715##
+ mcset $l "Use Bank1 for parameter passing" \
+ "Use Bank1 for parameter passing" ;# <-- NOT TRANSLATED YET
+ ##ID:000716##
+ mcset $l "Don't memcpy initialized xram from code" \
+ "Don't memcpy initialized xram from code" ;# <-- NOT TRANSLATED YET
+ ##ID:000717##
+ mcset $l "Don't include c-code as comments in the asm file" \
+ "Don't include c-code as comments in the asm file" ;# <-- NOT TRANSLATED YET
+ ##ID:000718##
+ mcset $l "Don't include peephole optimizer comments" \
+ "Don't include peephole optimizer comments" ;# <-- NOT TRANSLATED YET
+ ##ID:000719##
+ mcset $l "Include code generator comments" \
+ "Include code generator comments" ;# <-- NOT TRANSLATED YET
+ ##ID:000720##
+ mcset $l "Make short 8 bits (for old times sake)" \
+ "Make short 8 bits (for old times sake)" ;# <-- NOT TRANSLATED YET
+ ##ID:000721##
+ mcset $l "Stack automatic variables" \
+ "Stack automatic variables" ;# <-- NOT TRANSLATED YET
+ ##ID:000722##
+ mcset $l "Disable overlaying leaf function auto variables" \
+ "Disable overlaying leaf function auto variables" ;# <-- NOT TRANSLATED YET
+ ##ID:000723##
+ mcset $l "Disable the GCSE optimisation" \
+ "Disable the GCSE optimisation" ;# <-- NOT TRANSLATED YET
+ ##ID:000724##
+ mcset $l "Disable label optimisation" \
+ "Disable label optimisation" ;# <-- NOT TRANSLATED YET
+ ##ID:000725##
+ mcset $l "Disable optimisation of invariants" \
+ "Disable optimisation of invariants" ;# <-- NOT TRANSLATED YET
+ ##ID:000726##
+ mcset $l "Disable loop variable induction" \
+ "Disable loop variable induction" ;# <-- NOT TRANSLATED YET
+ ##ID:000727##
+ mcset $l "Don't generate boundary check for jump tables" \
+ "Don't generate boundary check for jump tables" ;# <-- NOT TRANSLATED YET
+ ##ID:000728##
+ mcset $l "Disable the loop reverse optimisation" \
+ "Disable the loop reverse optimisation" ;# <-- NOT TRANSLATED YET
+ ##ID:000729##
+ mcset $l "Disable the peephole assembly file optimisation" \
+ "Disable the peephole assembly file optimisation" ;# <-- NOT TRANSLATED YET
+ ##ID:000730##
+ mcset $l "On some ports, disable passing some parameters in registers" \
+ "On some ports, disable passing some parameters in registers" ;# <-- NOT TRANSLATED YET
+ ##ID:000731##
+ mcset $l "Enable peephole optimization on inline assembly" \
+ "Enable peephole optimization on inline assembly" ;# <-- NOT TRANSLATED YET
+ ##ID:000732##
+ mcset $l "Optimize for code speed rather than size" \
+ "Optimize for code speed rather than size" ;# <-- NOT TRANSLATED YET
+ ##ID:000733##
+ mcset $l "Optimize for code size rather than speed" \
+ "Optimize for code size rather than speed" ;# <-- NOT TRANSLATED YET
+ ##ID:000734##
+ mcset $l "Output in Intel hex format" \
+ "Output in Intel hex format" ;# <-- NOT TRANSLATED YET
+ ##ID:000735##
+ mcset $l "Output in S19 hex format" \
+ "Output in S19 hex format" ;# <-- NOT TRANSLATED YET
+ ##ID:000736##
+ mcset $l "Output" \
+ "Output" ;# <-- NOT TRANSLATED YET
+ ##ID:000737##
+ mcset $l "Messages and output code" \
+ "Messages and output code" ;# <-- NOT TRANSLATED YET
+ ##ID:000738##
+ mcset $l "Directives" \
+ "Directives" ;# <-- NOT TRANSLATED YET
+ ##ID:000739##
+ mcset $l "Which directives accept and which do not" \
+ "Which directives accept and which do not" ;# <-- NOT TRANSLATED YET
+ ##ID:000740##
+ mcset $l "Source" \
+ "Source" ;# <-- NOT TRANSLATED YET
+ ##ID:000741##
+ mcset $l "Use value defined in source code" \
+ "Use value defined in source code" ;# <-- NOT TRANSLATED YET
+ ##ID:000742##
+ mcset $l "Always" \
+ "Always" ;# <-- NOT TRANSLATED YET
+ ##ID:000743##
+ mcset $l "Generate always" \
+ "Generate always" ;# <-- NOT TRANSLATED YET
+ ##ID:000744##
+ mcset $l "Never" \
+ "Never" ;# <-- NOT TRANSLATED YET
+ ##ID:000745##
+ mcset $l "Never generate" \
+ "Never generate" ;# <-- NOT TRANSLATED YET
+ ##ID:000746##
+ mcset $l "Generate code listing" \
+ "Generate code listing" ;# <-- NOT TRANSLATED YET
+ ##ID:000747##
+ mcset $l "Should compiler generate *.lst files" \
+ "Should compiler generate *.lst files" ;# <-- NOT TRANSLATED YET
+ ##ID:000748##
+ mcset $l "Table of symbols (in *.lst)" \
+ "Table of symbols (in *.lst)" ;# <-- NOT TRANSLATED YET
+ ##ID:000749##
+ mcset $l "Include table of used symbolic names to code listing" \
+ "Include table of used symbolic names to code listing" ;# <-- NOT TRANSLATED YET
+ ##ID:000750##
+ mcset $l "Generate object code (ihex8)" \
+ "Generate object code (ihex8)" ;# <-- NOT TRANSLATED YET
+ ##ID:000751##
+ mcset $l "Generate object code in format Intel Hex 8 (*.hex)" \
+ "Generate object code in format Intel Hex 8 (*.hex)" ;# <-- NOT TRANSLATED YET
+ ##ID:000752##
+ mcset $l "Generate code for simulator" \
+ "Generate code for simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000753##
+ mcset $l "Generate *.sim file for simulator" \
+ "Generate *.sim file for simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000754##
+ mcset $l "Generate binary object code" \
+ "Generate binary object code" ;# <-- NOT TRANSLATED YET
+ ##ID:000755##
+ mcset $l "Generate binary object code (*.bin)" \
+ "Generate binary object code (*.bin)" ;# <-- NOT TRANSLATED YET
+ ##ID:000756##
+ mcset $l "Warning level" \
+ "Warning level" ;# <-- NOT TRANSLATED YET
+ ##ID:000757##
+ mcset $l "All" \
+ "All" ;# <-- NOT TRANSLATED YET
+ ##ID:000758##
+ mcset $l "Errors + Warnings" \
+ "Errors + Warnings" ;# <-- NOT TRANSLATED YET
+ ##ID:000759##
+ mcset $l "Errros only" \
+ "Errros only" ;# <-- NOT TRANSLATED YET
+ ##ID:000760##
+ mcset $l "Nothing" \
+ "Nothing" ;# <-- NOT TRANSLATED YET
+ ##ID:000761##
+ mcset $l "What kind of messages should be included in compiler log output" \
+ "What kind of messages should be included in compiler log output" ;# <-- NOT TRANSLATED YET
+ ##ID:000762##
+ mcset $l "Verbose" \
+ "Verbose" ;# <-- NOT TRANSLATED YET
+ ##ID:000763##
+ mcset $l "Should compiler inform user about what it is doing" \
+ "Should compiler inform user about what it is doing" ;# <-- NOT TRANSLATED YET
+ ##ID:000764##
+ mcset $l "Enable optimization" \
+ "Enable optimization" ;# <-- NOT TRANSLATED YET
+ ##ID:000765##
+ mcset $l "Enable peephole optimization" \
+ "Enable peephole optimization" ;# <-- NOT TRANSLATED YET
+ ##ID:000766##
+ mcset $l "Maximum HEX record data length" \
+ "Maximum HEX record data length" ;# <-- NOT TRANSLATED YET
+ ##ID:000767##
+ mcset $l "Maximum length of Intel HEX 8 record data field.\n\nGenerally it doesn't matter what is set here. But some (badly written)\nprogrammers may refuse to load files containing records which exceeds\ncertain length.\n\nHigher value also results in smaller .hex files\n\nValue equal to 0 will be treated as 1" \
+ "Maximum length of Intel HEX 8 record data field.\n\nGenerally it doesn't matter what is set here. But some (badly written)\nprogrammers may refuse to load files containing records which exceeds\ncertain length.\n\nHigher value also results in smaller .hex files\n\nValue equal to 0 will be treated as 1" ;# <-- NOT TRANSLATED YET
+ ##ID:000768##
+ mcset $l "Ignore directives" \
+ "Ignore directives" ;# <-- NOT TRANSLATED YET
+ ##ID:000769##
+ mcset $l "Accept" \
+ "Accept" ;# <-- NOT TRANSLATED YET
+ ##ID:000770##
+ mcset $l "Ignore" \
+ "Ignore" ;# <-- NOT TRANSLATED YET
+ ##ID:000771##
+ mcset $l "Restore defaults" \
+ "Restore defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000772##
+ mcset $l "Are you sure that you want restore default settings ?" \
+ "Are you sure that you want restore default settings ?" ;# <-- NOT TRANSLATED YET
+}
+namespace eval ::configDialogues::rightPanel {
+ ##ID:000773##
+ mcset $l "Right panel configuration" \
+ "Right panel configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:000774##
+ mcset $l "Register watches" \
+ "Register watches" ;# <-- NOT TRANSLATED YET
+ ##ID:000775##
+ mcset $l "Configure highlighting colors for register watches" \
+ "Configure highlighting colors for register watches" ;# <-- NOT TRANSLATED YET
+ ##ID:000776##
+ mcset $l "Instruction details" \
+ "Instruction details" ;# <-- NOT TRANSLATED YET
+ ##ID:000777##
+ mcset $l "Configure highlighting colors for instruction details" \
+ "Configure highlighting colors for instruction details" ;# <-- NOT TRANSLATED YET
+ ##ID:000778##
+ mcset $l "Bold" \
+ "Bold" ;# <-- NOT TRANSLATED YET
+ ##ID:000779##
+ mcset $l "Apply" \
+ "Apply" ;# <-- NOT TRANSLATED YET
+ ##ID:000780##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000781##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:000782##
+ mcset $l "Configure right panel - %s" \
+ "Configure right panel - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000783##
+ mcset $l "Select color - %s" \
+ "Select color - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000784##
+ mcset $l "Bit" \
+ "Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:000785##
+ mcset $l "Name" \
+ "Name" ;# <-- NOT TRANSLATED YET
+ ##ID:000786##
+ mcset $l " etc." \
+ " etc." ;# <-- NOT TRANSLATED YET
+}
+namespace eval ::configDialogues::toolbar {
+ eval ${::TOOLBAR_TRANSLATIONS}
+ ##ID:000787##
+ mcset $l "Toolbar configuration" \
+ "Toolbar configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:000788##
+ mcset $l "Search for a string in ListBox" \
+ "Search for a string in ListBox" ;# <-- NOT TRANSLATED YET
+ ##ID:000789##
+ mcset $l "Clear" \
+ "Clear" ;# <-- NOT TRANSLATED YET
+ ##ID:000790##
+ mcset $l "available items" \
+ "available items" ;# <-- NOT TRANSLATED YET
+ ##ID:000791##
+ mcset $l "Current toolbar items" \
+ "Current toolbar items" ;# <-- NOT TRANSLATED YET
+ ##ID:000792##
+ mcset $l "Defaults" \
+ "Defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000793##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000794##
+ mcset $l "Apply" \
+ "Apply" ;# <-- NOT TRANSLATED YET
+ ##ID:000795##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:000796##
+ mcset $l "Configure Main Toolbar - %s" \
+ "Configure Main Toolbar - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000797##
+ mcset $l " -- SEPARATOR --" \
+ " -- SEPARATOR --" ;# <-- NOT TRANSLATED YET
+ ##ID:000798##
+ mcset $l "Restore defaults" \
+ "Restore defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000799##
+ mcset $l "Are you sure that you want restore default settings ?" \
+ "Are you sure that you want restore default settings ?" ;# <-- NOT TRANSLATED YET
+ ##ID:000800##
+ mcset $l "Save changes?" \
+ "Save changes?" ;# <-- NOT TRANSLATED YET
+ ##ID:000801##
+ mcset $l "The settings have been changed. Do you want to save the changes?" \
+ "The settings have been changed. Do you want to save the changes?" ;# <-- NOT TRANSLATED YET
+}
+namespace eval ::configDialogues::custom_commands {
+ ##ID:000802##
+ mcset $l "Edit custom commands" \
+ "Edit custom commands" ;# <-- NOT TRANSLATED YET
+ ##ID:000803##
+ mcset $l "Command %s" \
+ "Command %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000804##
+ mcset $l "Short description" \
+ "Short description" ;# <-- NOT TRANSLATED YET
+ ##ID:000805##
+ mcset $l "This string will be used as status bar tip (max. 50 chars)" \
+ "This string will be used as status bar tip (max. 50 chars)" ;# <-- NOT TRANSLATED YET
+ ##ID:000806##
+ mcset $l "Options" \
+ "Options" ;# <-- NOT TRANSLATED YET
+ ##ID:000807##
+ mcset $l "Confirmation dialog" \
+ "Confirmation dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:000808##
+ mcset $l "Invoke dialog to confirm command execution." \
+ "Invoke dialog to confirm command execution." ;# <-- NOT TRANSLATED YET
+ ##ID:000809##
+ mcset $l "Show results" \
+ "Show results" ;# <-- NOT TRANSLATED YET
+ ##ID:000810##
+ mcset $l "After finish show dialog with results." \
+ "After finish show dialog with results." ;# <-- NOT TRANSLATED YET
+ ##ID:000811##
+ mcset $l "Ignore errors" \
+ "Ignore errors" ;# <-- NOT TRANSLATED YET
+ ##ID:000812##
+ mcset $l "Do not invoke error dialog if the process fails." \
+ "Do not invoke error dialog if the process fails." ;# <-- NOT TRANSLATED YET
+ ##ID:004493##
+ mcset $l "Run in terminal" \
+ "Run in terminal" ;# <-- NOT TRANSLATED YET
+ ##ID:004494##
+ mcset $l "Run interactively in terminal emulator." \
+ "Run interactively in terminal emulator." ;# <-- NOT TRANSLATED YET
+ ##ID:000813##
+ mcset $l "Bash script to execute" \
+ "Bash script to execute" ;# <-- NOT TRANSLATED YET
+ ##ID:000814##
+ mcset $l "Show help" \
+ "Show help" ;# <-- NOT TRANSLATED YET
+ ##ID:000815##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000816##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:000817##
+ mcset $l "Edit custom commands - %s" \
+ "Edit custom commands - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000818##
+ mcset $l "-- click to close --" \
+ "-- click to close --" ;# <-- NOT TRANSLATED YET
+ ##ID:000819##
+ mcset $l "Custom command %s: %s" \
+ "Custom command %s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000820##
+ mcset $l "VARIABLES:" \
+ "VARIABLES:" ;# <-- NOT TRANSLATED YET
+ ##ID:000821##
+ mcset $l "\t\tThe full URL of the current file\n" \
+ "\t\tThe full URL of the current file\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000822##
+ mcset $l "\t\tList of the URLs of all open documents\n" \
+ "\t\tList of the URLs of all open documents\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000823##
+ mcset $l "\t\tProject directory\n" \
+ "\t\tProject directory\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000824##
+ mcset $l "\t\tThe file name of the current document\n" \
+ "\t\tThe file name of the current document\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000825##
+ mcset $l "\t\tSame as %filename, but without extension\n" \
+ "\t\tSame as %filename, but without extension\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000826##
+ mcset $l "\t\tName of project main file\n" \
+ "\t\tName of project main file\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000827##
+ mcset $l "\t\tNumber of the current line\n" \
+ "\t\tNumber of the current line\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000828##
+ mcset $l "\t\tNumber of the current column\n" \
+ "\t\tNumber of the current column\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000829##
+ mcset $l "\t\tThe selected text in the current file\n" \
+ "\t\tThe selected text in the current file\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000830##
+ mcset $l "\t\tThe full text of the current file\n" \
+ "\t\tThe full text of the current file\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000831##
+ mcset $l "\t\tPercent sign\n\n" \
+ "\t\tPercent sign\n\n" ;# <-- NOT TRANSLATED YET
+ # Keep string length here! Also percent signs should remain at the same positions.
+ ##ID:000832##
+ mcset $l {Variables %line, %column, %selection and %text} \
+ {Variables %line, %column, %selection and %text} ;# <-- NOT TRANSLATED YET
+ ##ID:000833##
+ mcset $l "\nare not available if external editor is used" \
+ "\nare not available if external editor is used" ;# <-- NOT TRANSLATED YET
+}
+namespace eval ::configDialogues::global {
+ ##ID:000834##
+ mcset $l "MCU 8051 IDE configuration" \
+ "MCU 8051 IDE configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:000835##
+ mcset $l "Display splash screen" \
+ "Display splash screen" ;# <-- NOT TRANSLATED YET
+ ##ID:000836##
+ mcset $l "Show splash screen on start-up" \
+ "Show splash screen on start-up" ;# <-- NOT TRANSLATED YET
+ ##ID:000837##
+ mcset $l "Show tips on start-up" \
+ "Show tips on start-up" ;# <-- NOT TRANSLATED YET
+ ##ID:000838##
+ mcset $l "Invoke dialog with tip of the day on start-up" \
+ "Invoke dialog with tip of the day on start-up" ;# <-- NOT TRANSLATED YET
+ ##ID:000839##
+ mcset $l "Language" \
+ "Language" ;# <-- NOT TRANSLATED YET
+ ##ID:000840##
+ mcset $l "Your preferred language" \
+ "Your preferred language" ;# <-- NOT TRANSLATED YET
+ ##ID:000841##
+ mcset $l "Do not always ask whether to add file to the project after the file is opened" \
+ "Do not always ask whether to add file to the project after the file is opened" ;# <-- NOT TRANSLATED YET
+ ##ID:004479##
+ mcset $l "Do not show performance warning when enabling external HW simulation." \
+ "Do not show performance warning when enabling external HW simulation." ;# <-- NOT TRANSLATED YET
+ ##ID:000842##
+ mcset $l "Reset to defaults" \
+ "Reset to defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000843##
+ mcset $l "Reset all settings to defaults" \
+ "Reset all settings to defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000844##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000845##
+ mcset $l "Commit new settings" \
+ "Commit new settings" ;# <-- NOT TRANSLATED YET
+ ##ID:000846##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:000847##
+ mcset $l "Take changes back and close dialog" \
+ "Take changes back and close dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:000848##
+ mcset $l "Configure MCU 8051 IDE" \
+ "Configure MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:000849##
+ mcset $l "Unable to write to base configuration file" \
+ "Unable to write to base configuration file" ;# <-- NOT TRANSLATED YET
+ ##ID:000850##
+ mcset $l "Application language changed" \
+ "Application language changed" ;# <-- NOT TRANSLATED YET
+ ##ID:000851##
+ mcset $l "Language for this application has been changed. The change will take effect upon next start of application" \
+ "Language for this application has been changed. The change will take effect upon next start of application" ;# <-- NOT TRANSLATED YET
+ ##ID:000852##
+ mcset $l "Widget style" \
+ "Widget style" ;# <-- NOT TRANSLATED YET
+ ##ID:000853##
+ mcset $l "Your preferred widget style" \
+ "Your preferred widget style" ;# <-- NOT TRANSLATED YET
+ ##ID:000854##
+ mcset $l "Background color" \
+ "Background color" ;# <-- NOT TRANSLATED YET
+ ##ID:000855##
+ mcset $l "Common background color for almost everything in the GUI" \
+ "Common background color for almost everything in the GUI" ;# <-- NOT TRANSLATED YET
+ ##ID:000856##
+ mcset $l "Global font size factor" \
+ "Global font size factor" ;# <-- NOT TRANSLATED YET
+ ##ID:000857##
+ mcset $l "Allows you to adjust size of (almost) all fonts used in this IDE" \
+ "Allows you to adjust size of (almost) all fonts used in this IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:000858##
+ mcset $l "Normal" \
+ "Normal" ;# <-- NOT TRANSLATED YET
+ ##ID:000859##
+ mcset $l "A little larger" \
+ "A little larger" ;# <-- NOT TRANSLATED YET
+ ##ID:000860##
+ mcset $l "Notably larger" \
+ "Notably larger" ;# <-- NOT TRANSLATED YET
+ ##ID:000861##
+ mcset $l "Much larger" \
+ "Much larger" ;# <-- NOT TRANSLATED YET
+ ##ID:000862##
+ mcset $l "Huge" \
+ "Huge" ;# <-- NOT TRANSLATED YET
+ ##ID:000863##
+ mcset $l "Too BIG" \
+ "Too BIG" ;# <-- NOT TRANSLATED YET
+}
+namespace eval ::configDialogues::terminal {
+ ##ID:000864##
+ mcset $l "Terminal configuration" \
+ "Terminal configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:000865##
+ mcset $l "Foreground color" \
+ "Foreground color" ;# <-- NOT TRANSLATED YET
+ ##ID:000866##
+ mcset $l "Background color" \
+ "Background color" ;# <-- NOT TRANSLATED YET
+ ##ID:000867##
+ mcset $l "Font size" \
+ "Font size" ;# <-- NOT TRANSLATED YET
+ ##ID:000868##
+ mcset $l "Font family" \
+ "Font family" ;# <-- NOT TRANSLATED YET
+ ##ID:000869##
+ mcset $l "Use settings and restart terminal emulator" \
+ "Use settings and restart terminal emulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000870##
+ mcset $l "Reset to defaults" \
+ "Reset to defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000871##
+ mcset $l "Reset all settings to defaults" \
+ "Reset all settings to defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000872##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000873##
+ mcset $l "Commit new settings" \
+ "Commit new settings" ;# <-- NOT TRANSLATED YET
+ ##ID:000874##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:000875##
+ mcset $l "Take changes back and close dialog" \
+ "Take changes back and close dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:000876##
+ mcset $l "Configure terminal emulator" \
+ "Configure terminal emulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000877##
+ mcset $l "Select foreground color" \
+ "Select foreground color" ;# <-- NOT TRANSLATED YET
+ ##ID:000878##
+ mcset $l "Select background color" \
+ "Select background color" ;# <-- NOT TRANSLATED YET
+ ##ID:000879##
+ mcset $l "Invalid value of key: '%s'" \
+ "Invalid value of key: '%s'" ;# <-- NOT TRANSLATED YET
+}
+namespace eval ::configDialogues::simulator {
+ ##ID:000880##
+ mcset $l "Simulator configuration" \
+ "Simulator configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:000881##
+ mcset $l "Warning dialogues" \
+ "Warning dialogues" ;# <-- NOT TRANSLATED YET
+ ##ID:000882##
+ mcset $l "Other" \
+ "Other" ;# <-- NOT TRANSLATED YET
+ ##ID:000883##
+ mcset $l "Undefined values" \
+ "Undefined values" ;# <-- NOT TRANSLATED YET
+ ##ID:000884##
+ mcset $l "Return random value" \
+ "Return random value" ;# <-- NOT TRANSLATED YET
+ ##ID:000885##
+ mcset $l "Return zero value" \
+ "Return zero value" ;# <-- NOT TRANSLATED YET
+ ##ID:000886##
+ mcset $l "Return highest possible value" \
+ "Return highest possible value" ;# <-- NOT TRANSLATED YET
+ ##ID:000887##
+ mcset $l "Reverse run" \
+ "Reverse run" ;# <-- NOT TRANSLATED YET
+ ##ID:000888##
+ mcset $l "Stack capacity" \
+ "Stack capacity" ;# <-- NOT TRANSLATED YET
+ ##ID:000889##
+ mcset $l "Number of steps which can be taken back" \
+ "Number of steps which can be taken back" ;# <-- NOT TRANSLATED YET
+ ##ID:004547##
+ mcset $l "Colors" \
+ "Colors" ;# <-- NOT TRANSLATED YET
+ ##ID:004548##
+ mcset $l "ON color" \
+ "ON color" ;# <-- NOT TRANSLATED YET
+ ##ID:004549##
+ mcset $l "OFF color" \
+ "OFF color" ;# <-- NOT TRANSLATED YET
+ ##ID:004550##
+ mcset $l "Color to display a bit name for a bit set to log. 1" \
+ "Color to display a bit name for a bit set to log. 1" ;# <-- NOT TRANSLATED YET
+ ##ID:004551##
+ mcset $l "Color to display a bit name for a bit set to log. 0" \
+ "Color to display a bit name for a bit set to log. 0" ;# <-- NOT TRANSLATED YET
+ ##ID:000890##
+ mcset $l "Defaults" \
+ "Defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000891##
+ mcset $l "Reset settings to defaults" \
+ "Reset settings to defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000892##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000893##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:000894##
+ mcset $l "Simulator configuration - %s" \
+ "Simulator configuration - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000895##
+ mcset $l "Are you sure ?" \
+ "Are you sure ?" ;# <-- NOT TRANSLATED YET
+ ##ID:000896##
+ mcset $l "Are you sure you want to restore default settings" \
+ "Are you sure you want to restore default settings" ;# <-- NOT TRANSLATED YET
+ ##ID:000897##
+ mcset $l "Ignore stack overflow" \
+ "Ignore stack overflow" ;# <-- NOT TRANSLATED YET
+ ##ID:000898##
+ mcset $l "Ignore stack underflow" \
+ "Ignore stack underflow" ;# <-- NOT TRANSLATED YET
+ ##ID:000899##
+ mcset $l "Ignore invalid instructions" \
+ "Ignore invalid instructions" ;# <-- NOT TRANSLATED YET
+ ##ID:000900##
+ mcset $l "Ignore watchdog overflow" \
+ "Ignore watchdog overflow" ;# <-- NOT TRANSLATED YET
+ ##ID:000901##
+ mcset $l "Ignore invalid return from interrupt" \
+ "Ignore invalid return from interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:000902##
+ mcset $l "Ignore reading from write only register" \
+ "Ignore reading from write only register" ;# <-- NOT TRANSLATED YET
+ ##ID:000903##
+ mcset $l "Ignore invalid access to IDATA/SFR" \
+ "Ignore invalid access to IDATA/SFR" ;# <-- NOT TRANSLATED YET
+ ##ID:000904##
+ mcset $l "Ignore invalid access to EDATA" \
+ "Ignore invalid access to EDATA" ;# <-- NOT TRANSLATED YET
+ ##ID:000905##
+ mcset $l "Ignore invalid access to XDATA" \
+ "Ignore invalid access to XDATA" ;# <-- NOT TRANSLATED YET
+ ##ID:000906##
+ mcset $l "Ignore invalid access to bit" \
+ "Ignore invalid access to bit" ;# <-- NOT TRANSLATED YET
+ ##ID:000907##
+ mcset $l "Ignore invalid access to CODE" \
+ "Ignore invalid access to CODE" ;# <-- NOT TRANSLATED YET
+ ##ID:000908##
+ mcset $l "Ignore EEPROM write failure" \
+ "Ignore EEPROM write failure" ;# <-- NOT TRANSLATED YET
+ ##ID:000909##
+ mcset $l "Ignore EEPROM write abort" \
+ "Ignore EEPROM write abort" ;# <-- NOT TRANSLATED YET
+ ##ID:000910##
+ mcset $l "Ignore UART frame discard" \
+ "Ignore UART frame discard" ;# <-- NOT TRANSLATED YET
+ ##ID:000911##
+ mcset $l "Ignore illegal UART mode change" \
+ "Ignore illegal UART mode change" ;# <-- NOT TRANSLATED YET
+ ##ID:000912##
+ mcset $l "Ignore illegal Timer/Counter mode change" \
+ "Ignore illegal Timer/Counter mode change" ;# <-- NOT TRANSLATED YET
+ ##ID:000913##
+ mcset $l "Do not complain about invalid breakpoints" \
+ "Do not complain about invalid breakpoints" ;# <-- NOT TRANSLATED YET
+ ##ID:000914##
+ mcset $l "Check this to disable warning on stack overflow" \
+ "Check this to disable warning on stack overflow" ;# <-- NOT TRANSLATED YET
+ ##ID:000915##
+ mcset $l "Check this to disable warning on stack underflow" \
+ "Check this to disable warning on stack underflow" ;# <-- NOT TRANSLATED YET
+ ##ID:000916##
+ mcset $l "Check this to disable warning on\ninvalid instruction" \
+ "Check this to disable warning on\ninvalid instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:000917##
+ mcset $l "Do not stop simulation on device reset\ninvoked by watchdog timer overflow" \
+ "Do not stop simulation on device reset\ninvoked by watchdog timer overflow" ;# <-- NOT TRANSLATED YET
+ ##ID:000918##
+ mcset $l "Do not show warning dialog when program trying to return from interrupt which has not been invoked" \
+ "Do not show warning dialog when program trying to return from interrupt which has not been invoked" ;# <-- NOT TRANSLATED YET
+ ##ID:000919##
+ mcset $l "Do not display warning dialog when\nreading from write-only register" \
+ "Do not display warning dialog when\nreading from write-only register" ;# <-- NOT TRANSLATED YET
+ ##ID:000920##
+ mcset $l "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Internal Data Memory (IDATA) or SFR area" \
+ "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Internal Data Memory (IDATA) or SFR area" ;# <-- NOT TRANSLATED YET
+ ##ID:000921##
+ mcset $l "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Expanded Data Memory (EDATA)" \
+ "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Expanded Data Memory (EDATA)" ;# <-- NOT TRANSLATED YET
+ ##ID:000922##
+ mcset $l "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented External Data Memory (XDATA)" \
+ "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented External Data Memory (XDATA)" ;# <-- NOT TRANSLATED YET
+ ##ID:000923##
+ mcset $l "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented bit in IDATA or SFR area" \
+ "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented bit in IDATA or SFR area" ;# <-- NOT TRANSLATED YET
+ ##ID:000924##
+ mcset $l "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Program Memory (CODE)" \
+ "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Program Memory (CODE)" ;# <-- NOT TRANSLATED YET
+ ##ID:000925##
+ mcset $l "Check this to disable warning on\ndata eeprom write failure" \
+ "Check this to disable warning on\ndata eeprom write failure" ;# <-- NOT TRANSLATED YET
+ ##ID:000926##
+ mcset $l "Check this to disable warning on\ndata eeprom write abort" \
+ "Check this to disable warning on\ndata eeprom write abort" ;# <-- NOT TRANSLATED YET
+ ##ID:000927##
+ mcset $l "Check this to disable warning on UART frame discard" \
+ "Check this to disable warning on UART frame discard" ;# <-- NOT TRANSLATED YET
+ ##ID:000928##
+ mcset $l "Check this to disable warning on illegal UART mode change" \
+ "Check this to disable warning on illegal UART mode change" ;# <-- NOT TRANSLATED YET
+ ##ID:000929##
+ mcset $l "Check this to disable warning on illegal Timer/Counter mode change" \
+ "Check this to disable warning on illegal Timer/Counter mode change" ;# <-- NOT TRANSLATED YET
+ ##ID:000930##
+ mcset $l "Disable warning: \"warning: Invalid breakpoint\"" \
+ "Disable warning: \"warning: Invalid breakpoint\"" ;# <-- NOT TRANSLATED YET
+}
+namespace eval ::configDialogues::shortcuts {
+ # Strings in shortcuts configuration dialog
+ ##ID:000931##
+ mcset $l "Configure key shortcuts" \
+ "Configure key shortcuts" ;# <-- NOT TRANSLATED YET
+ ##ID:000932##
+ mcset $l "available items" \
+ "available items" ;# <-- NOT TRANSLATED YET
+ ##ID:000933##
+ mcset $l "<Nothing selected>" \
+ "<Nothing selected>" ;# <-- NOT TRANSLATED YET
+ ##ID:000934##
+ mcset $l "Search:" \
+ "Search:" ;# <-- NOT TRANSLATED YET
+ ##ID:000935##
+ mcset $l "Enter your search string here" \
+ "Enter your search string here" ;# <-- NOT TRANSLATED YET
+ ##ID:000936##
+ mcset $l "Clear" \
+ "Clear" ;# <-- NOT TRANSLATED YET
+ ##ID:000937##
+ mcset $l "Current shortcut:" \
+ "Current shortcut:" ;# <-- NOT TRANSLATED YET
+ ##ID:000938##
+ mcset $l "Default:" \
+ "Default:" ;# <-- NOT TRANSLATED YET
+ ##ID:000939##
+ mcset $l "Restore default" \
+ "Restore default" ;# <-- NOT TRANSLATED YET
+ ##ID:000940##
+ mcset $l "Accept" \
+ "Accept" ;# <-- NOT TRANSLATED YET
+ ##ID:000941##
+ mcset $l "Accept new shortcut" \
+ "Accept new shortcut" ;# <-- NOT TRANSLATED YET
+ ##ID:000942##
+ mcset $l "Original" \
+ "Original" ;# <-- NOT TRANSLATED YET
+ ##ID:000943##
+ mcset $l "Discard new shortcut" \
+ "Discard new shortcut" ;# <-- NOT TRANSLATED YET
+ ##ID:000944##
+ mcset $l "Defaults" \
+ "Defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000945##
+ mcset $l "Reset all settings to defaults" \
+ "Reset all settings to defaults" ;# <-- NOT TRANSLATED YET
+ ##ID:000946##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000947##
+ mcset $l "Commit new settings" \
+ "Commit new settings" ;# <-- NOT TRANSLATED YET
+ ##ID:000948##
+ mcset $l "Take changes back and close dialog" \
+ "Take changes back and close dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:000949##
+ mcset $l "Configure shortcuts - %s" \
+ "Configure shortcuts - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:000950##
+ mcset $l "Modifier required (Control or Alt)" \
+ "Modifier required (Control or Alt)" ;# <-- NOT TRANSLATED YET
+ ##ID:000951##
+ mcset $l "This combination is hard-coded in the main window, so it cannot be used" \
+ "This combination is hard-coded in the main window, so it cannot be used" ;# <-- NOT TRANSLATED YET
+ ##ID:000952##
+ mcset $l "This combination is hard-coded, so it cannot be used" \
+ "This combination is hard-coded, so it cannot be used" ;# <-- NOT TRANSLATED YET
+ ##ID:000953##
+ mcset $l "The '%s' key combination has already been assigned to \"%s\"." \
+ "The '%s' key combination has already been assigned to \"%s\"." ;# <-- NOT TRANSLATED YET
+ ##ID:000954##
+ mcset $l "Removing key combination for action \"%s\"" \
+ "Removing key combination for action \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:000955##
+ mcset $l "Item changed" \
+ "Item changed" ;# <-- NOT TRANSLATED YET
+ ##ID:000956##
+ mcset $l "The previous item was modified. Do you want to save it ?" \
+ "The previous item was modified. Do you want to save it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:000957##
+ mcset $l "Confirmation required" \
+ "Confirmation required" ;# <-- NOT TRANSLATED YET
+ ##ID:000958##
+ mcset $l "This will discard all shortcut settings and replace them with defaults. Are you sure by that ?" \
+ "This will discard all shortcut settings and replace them with defaults. Are you sure by that ?" ;# <-- NOT TRANSLATED YET
+ ## Shortcut names
+ # Main
+ ##ID:000959##
+ mcset $l "Main" \
+ "Main" ;# <-- NOT TRANSLATED YET
+ ##ID:000960##
+ mcset $l "Exit program" \
+ "Exit program" ;# <-- NOT TRANSLATED YET
+ ##ID:000961##
+ mcset $l "Save session" \
+ "Save session" ;# <-- NOT TRANSLATED YET
+ ##ID:000962##
+ mcset $l "File statistics" \
+ "File statistics" ;# <-- NOT TRANSLATED YET
+ ##ID:000963##
+ mcset $l "Toggle full screen mode" \
+ "Toggle full screen mode" ;# <-- NOT TRANSLATED YET
+ # Project management
+ ##ID:000964##
+ mcset $l "Project management" \
+ "Project management" ;# <-- NOT TRANSLATED YET
+ ##ID:000965##
+ mcset $l "New project" \
+ "New project" ;# <-- NOT TRANSLATED YET
+ ##ID:000966##
+ mcset $l "Open project" \
+ "Open project" ;# <-- NOT TRANSLATED YET
+ ##ID:000967##
+ mcset $l "Save project" \
+ "Save project" ;# <-- NOT TRANSLATED YET
+ ##ID:000968##
+ mcset $l "Edit project" \
+ "Edit project" ;# <-- NOT TRANSLATED YET
+ ##ID:000969##
+ mcset $l "Save and close project" \
+ "Save and close project" ;# <-- NOT TRANSLATED YET
+ ##ID:000970##
+ mcset $l "Close project" \
+ "Close project" ;# <-- NOT TRANSLATED YET
+ # Simulator
+ ##ID:000971##
+ mcset $l "Simulator" \
+ "Simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000972##
+ mcset $l "Start simulator" \
+ "Start simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000973##
+ mcset $l "Debug this file only" \
+ "Debug this file only" ;# <-- NOT TRANSLATED YET
+ ##ID:000974##
+ mcset $l "Show SFR map" \
+ "Show SFR map" ;# <-- NOT TRANSLATED YET
+ ##ID:000975##
+ mcset $l "Bit addressable array" \
+ "Bit addressable array" ;# <-- NOT TRANSLATED YET
+ ##ID:000976##
+ mcset $l "Show Code memory" \
+ "Show Code memory" ;# <-- NOT TRANSLATED YET
+ ##ID:000977##
+ mcset $l "Show XDATA memory" \
+ "Show XDATA memory" ;# <-- NOT TRANSLATED YET
+ ##ID:000978##
+ mcset $l "Show ERAM" \
+ "Show ERAM" ;# <-- NOT TRANSLATED YET
+ ##ID:000979##
+ mcset $l "Show Data EEPROM" \
+ "Show Data EEPROM" ;# <-- NOT TRANSLATED YET
+ ##ID:000980##
+ mcset $l "Show EEPROM write buffer" \
+ "Show EEPROM write buffer" ;# <-- NOT TRANSLATED YET
+ ##ID:000981##
+ mcset $l "Invoke MCU stack monitor" \
+ "Invoke MCU stack monitor" ;# <-- NOT TRANSLATED YET
+ ##ID:000982##
+ mcset $l "Reset - Only SFR" \
+ "Reset - Only SFR" ;# <-- NOT TRANSLATED YET
+ ##ID:000983##
+ mcset $l "Reset - All zeros" \
+ "Reset - All zeros" ;# <-- NOT TRANSLATED YET
+ ##ID:000984##
+ mcset $l "Reset - All ones" \
+ "Reset - All ones" ;# <-- NOT TRANSLATED YET
+ ##ID:000985##
+ mcset $l "Reset - Random" \
+ "Reset - Random" ;# <-- NOT TRANSLATED YET
+ ##ID:000986##
+ mcset $l "Simulator: Step" \
+ "Simulator: Step" ;# <-- NOT TRANSLATED YET
+ ##ID:000987##
+ mcset $l "Simulator: Step Back" \
+ "Simulator: Step Back" ;# <-- NOT TRANSLATED YET
+ ##ID:000988##
+ mcset $l "Simulator: Step over" \
+ "Simulator: Step over" ;# <-- NOT TRANSLATED YET
+ ##ID:000989##
+ mcset $l "Simulator: Animate" \
+ "Simulator: Animate" ;# <-- NOT TRANSLATED YET
+ ##ID:000990##
+ mcset $l "Simulator: Run" \
+ "Simulator: Run" ;# <-- NOT TRANSLATED YET
+ ##ID:000991##
+ mcset $l "Allow/Deny breakpoints" \
+ "Allow/Deny breakpoints" ;# <-- NOT TRANSLATED YET
+ ##ID:000992##
+ mcset $l "Clear highlight" \
+ "Clear highlight" ;# <-- NOT TRANSLATED YET
+ ##ID:000993##
+ mcset $l "Find cursor" \
+ "Find cursor" ;# <-- NOT TRANSLATED YET
+ ##ID:000994##
+ mcset $l "Jump to line" \
+ "Jump to line" ;# <-- NOT TRANSLATED YET
+ ##ID:000995##
+ mcset $l "Simulator: Hibernate" \
+ "Simulator: Hibernate" ;# <-- NOT TRANSLATED YET
+ ##ID:000996##
+ mcset $l "Simulator: Resume" \
+ "Simulator: Resume" ;# <-- NOT TRANSLATED YET
+ ##ID:000997##
+ mcset $l "Interrupt monitor" \
+ "Interrupt monitor" ;# <-- NOT TRANSLATED YET
+ ##ID:000998##
+ mcset $l "Stopwatch" \
+ "Stopwatch" ;# <-- NOT TRANSLATED YET
+ # Virtual HW
+ ##ID:000999##
+ mcset $l "Virtual HW" \
+ "Virtual HW" ;# <-- NOT TRANSLATED YET
+ ##ID:001000##
+ mcset $l "LED panel" \
+ "LED panel" ;# <-- NOT TRANSLATED YET
+ ##ID:001001##
+ mcset $l "LED display" \
+ "LED display" ;# <-- NOT TRANSLATED YET
+ ##ID:001002##
+ mcset $l "LED matrix" \
+ "LED matrix" ;# <-- NOT TRANSLATED YET
+ ##ID:001003##
+ mcset $l "Multiplexed LED display" \
+ "Multiplexed LED display" ;# <-- NOT TRANSLATED YET
+ ##ID:001004##
+ mcset $l "Simple keypad" \
+ "Simple keypad" ;# <-- NOT TRANSLATED YET
+ ##ID:001005##
+ mcset $l "Matrix keypad" \
+ "Matrix keypad" ;# <-- NOT TRANSLATED YET
+ ##ID:001006##
+ mcset $l "Open" \
+ "Open" ;# <-- NOT TRANSLATED YET
+ ##ID:001007##
+ mcset $l "Load" \
+ "Load" ;# <-- NOT TRANSLATED YET
+ ##ID:001008##
+ mcset $l "Save" \
+ "Save" ;# <-- NOT TRANSLATED YET
+ ##ID:001009##
+ mcset $l "Save as" \
+ "Save as" ;# <-- NOT TRANSLATED YET
+ ##ID:001010##
+ mcset $l "Remove all" \
+ "Remove all" ;# <-- NOT TRANSLATED YET
+ # Tools
+ ##ID:001011##
+ mcset $l "Tools" \
+ "Tools" ;# <-- NOT TRANSLATED YET
+ ##ID:001012##
+ mcset $l "Compile" \
+ "Compile" ;# <-- NOT TRANSLATED YET
+ ##ID:001013##
+ mcset $l "Compile this file only" \
+ "Compile this file only" ;# <-- NOT TRANSLATED YET
+ ##ID:001014##
+ mcset $l "Disassemble" \
+ "Disassemble" ;# <-- NOT TRANSLATED YET
+ ##ID:001015##
+ mcset $l "Auto indent" \
+ "Auto indent" ;# <-- NOT TRANSLATED YET
+ ##ID:001016##
+ mcset $l "Change letter case" \
+ "Change letter case" ;# <-- NOT TRANSLATED YET
+ ##ID:001017##
+ mcset $l "Cleanup dialog" \
+ "Cleanup dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:001018##
+ mcset $l "Export as XHTML" \
+ "Export as XHTML" ;# <-- NOT TRANSLATED YET
+ ##ID:001019##
+ mcset $l "Export as LaTeX" \
+ "Export as LaTeX" ;# <-- NOT TRANSLATED YET
+ ##ID:001020##
+ mcset $l "Document current function" \
+ "Document current function" ;# <-- NOT TRANSLATED YET
+ ##ID:001021##
+ mcset $l "Run doxywizard" \
+ "Run doxywizard" ;# <-- NOT TRANSLATED YET
+ ##ID:001022##
+ mcset $l "Build C API documentation" \
+ "Build C API documentation" ;# <-- NOT TRANSLATED YET
+ ##ID:001023##
+ mcset $l "Clear C API documentation" \
+ "Clear C API documentation" ;# <-- NOT TRANSLATED YET
+ ##ID:001024##
+ mcset $l "Custom command 0" \
+ "Custom command 0" ;# <-- NOT TRANSLATED YET
+ ##ID:001025##
+ mcset $l "Custom command 1" \
+ "Custom command 1" ;# <-- NOT TRANSLATED YET
+ ##ID:001026##
+ mcset $l "Custom command 2" \
+ "Custom command 2" ;# <-- NOT TRANSLATED YET
+ # Utilities
+ ##ID:001027##
+ mcset $l "Utilities" \
+ "Utilities" ;# <-- NOT TRANSLATED YET
+ ##ID:001028##
+ mcset $l "Hex -> Bin" \
+ "Hex -> Bin" ;# <-- NOT TRANSLATED YET
+ ##ID:001029##
+ mcset $l "Bin -> Hex" \
+ "Bin -> Hex" ;# <-- NOT TRANSLATED YET
+ ##ID:001030##
+ mcset $l "Sim -> Hex" \
+ "Sim -> Hex" ;# <-- NOT TRANSLATED YET
+ ##ID:001031##
+ mcset $l "Sim -> Bin" \
+ "Sim -> Bin" ;# <-- NOT TRANSLATED YET
+ ##ID:001032##
+ mcset $l "Normalize IHEX8" \
+ "Normalize IHEX8" ;# <-- NOT TRANSLATED YET
+ ##ID:001033##
+ mcset $l "Hex Editor" \
+ "Hex Editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001034##
+ mcset $l "Symbol table" \
+ "Symbol table" ;# <-- NOT TRANSLATED YET
+ ##ID:001035##
+ mcset $l "8-segment editor" \
+ "8-segment editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001036##
+ mcset $l "ASCII chart" \
+ "ASCII chart" ;# <-- NOT TRANSLATED YET
+ ##ID:001037##
+ mcset $l "Scribble notepad" \
+ "Scribble notepad" ;# <-- NOT TRANSLATED YET
+ ##ID:001038##
+ mcset $l "Base Converter" \
+ "Base Converter" ;# <-- NOT TRANSLATED YET
+ ##ID:001039##
+ mcset $l "UART/RS232 Debugger" \
+ "UART/RS232 Debugger" ;# <-- NOT TRANSLATED YET
+ ##ID:001040##
+ mcset $l "Help" \
+ "Help" ;# <-- NOT TRANSLATED YET
+ ##ID:001041##
+ mcset $l "About dialog" \
+ "About dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:001042##
+ mcset $l "Welcome dialog" \
+ "Welcome dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:001043##
+ mcset $l "Tip of the day" \
+ "Tip of the day" ;# <-- NOT TRANSLATED YET
+ # Messages text
+ ##ID:001044##
+ mcset $l "Messages text" \
+ "Messages text" ;# <-- NOT TRANSLATED YET
+ ##ID:001045##
+ mcset $l "Clear messages" \
+ "Clear messages" ;# <-- NOT TRANSLATED YET
+ ##ID:001046##
+ mcset $l "Find" \
+ "Find" ;# <-- NOT TRANSLATED YET
+ ##ID:001047##
+ mcset $l "Find next" \
+ "Find next" ;# <-- NOT TRANSLATED YET
+ ##ID:001048##
+ mcset $l "Find previous" \
+ "Find previous" ;# <-- NOT TRANSLATED YET
+ # Notes
+ ##ID:001049##
+ mcset $l "Notes" \
+ "Notes" ;# <-- NOT TRANSLATED YET
+ ##ID:001050##
+ mcset $l "Bold text" \
+ "Bold text" ;# <-- NOT TRANSLATED YET
+ ##ID:001051##
+ mcset $l "Italic text" \
+ "Italic text" ;# <-- NOT TRANSLATED YET
+ ##ID:001052##
+ mcset $l "Strikethrough text" \
+ "Striketrought text" ;# <-- NOT TRANSLATED YET
+ ##ID:001053##
+ mcset $l "Underline text" \
+ "Underline text" ;# <-- NOT TRANSLATED YET
+ ##ID:001054##
+ mcset $l "Erase tags" \
+ "Erase tags" ;# <-- NOT TRANSLATED YET
+ ##ID:001055##
+ mcset $l "Insert OK image" \
+ "Insert OK image" ;# <-- NOT TRANSLATED YET
+ ##ID:001056##
+ mcset $l "Register watches" \
+ "Register watches" ;# <-- NOT TRANSLATED YET
+ ##ID:001057##
+ mcset $l "Move to top" \
+ "Move to top" ;# <-- NOT TRANSLATED YET
+ ##ID:001058##
+ mcset $l "Move up" \
+ "Move up" ;# <-- NOT TRANSLATED YET
+ ##ID:001059##
+ mcset $l "Move down" \
+ "Move down" ;# <-- NOT TRANSLATED YET
+ ##ID:001060##
+ mcset $l "Move to bottom" \
+ "Move to bottom" ;# <-- NOT TRANSLATED YET
+ ##ID:001061##
+ mcset $l "Remove" \
+ "Remove" ;# <-- NOT TRANSLATED YET
+ # Editor
+ ##ID:001062##
+ mcset $l "Editor" \
+ "Editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001063##
+ mcset $l "Read only mode" \
+ "Read only mode" ;# <-- NOT TRANSLATED YET
+ ##ID:001064##
+ mcset $l "New" \
+ "New" ;# <-- NOT TRANSLATED YET
+ ##ID:001065##
+ mcset $l "Save all" \
+ "Save all" ;# <-- NOT TRANSLATED YET
+ ##ID:001066##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:001067##
+ mcset $l "Close all" \
+ "Close all" ;# <-- NOT TRANSLATED YET
+ ##ID:001068##
+ mcset $l "Show/Hide icon border" \
+ "Show/Hide icon border" ;# <-- NOT TRANSLATED YET
+ ##ID:001069##
+ mcset $l "Show/Hide line numbers" \
+ "Show/Hide line numbers" ;# <-- NOT TRANSLATED YET
+ ##ID:001070##
+ mcset $l "Reload" \
+ "Reload" ;# <-- NOT TRANSLATED YET
+ ##ID:001071##
+ mcset $l "Next editor" \
+ "Next editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001072##
+ mcset $l "Previous editor" \
+ "Previous editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001073##
+ mcset $l "Breakpoint" \
+ "Breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:001074##
+ mcset $l "Bookmark" \
+ "Bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:001075##
+ mcset $l "Undo" \
+ "Undo" ;# <-- NOT TRANSLATED YET
+ ##ID:001076##
+ mcset $l "Redo" \
+ "Redo" ;# <-- NOT TRANSLATED YET
+ ##ID:001077##
+ mcset $l "Copy" \
+ "Copy" ;# <-- NOT TRANSLATED YET
+ ##ID:001078##
+ mcset $l "Cut" \
+ "Cut" ;# <-- NOT TRANSLATED YET
+ ##ID:001079##
+ mcset $l "Paste" \
+ "Paste" ;# <-- NOT TRANSLATED YET
+ ##ID:001080##
+ mcset $l "Select all" \
+ "Select all" ;# <-- NOT TRANSLATED YET
+ ##ID:001081##
+ mcset $l "Replace" \
+ "Replace" ;# <-- NOT TRANSLATED YET
+ ##ID:001082##
+ mcset $l "Go to line" \
+ "Go to line" ;# <-- NOT TRANSLATED YET
+ ##ID:001083##
+ mcset $l "Comment" \
+ "Comment" ;# <-- NOT TRANSLATED YET
+ ##ID:001084##
+ mcset $l "Uncomment" \
+ "Uncomment" ;# <-- NOT TRANSLATED YET
+ ##ID:001085##
+ mcset $l "Indent" \
+ "Indent" ;# <-- NOT TRANSLATED YET
+ ##ID:001086##
+ mcset $l "Unindent" \
+ "Unindent" ;# <-- NOT TRANSLATED YET
+ ##ID:001087##
+ mcset $l "Uppercase" \
+ "Uppercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001088##
+ mcset $l "Lowercase" \
+ "Lowercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001089##
+ mcset $l "Capitalize" \
+ "Capitalize" ;# <-- NOT TRANSLATED YET
+ ##ID:001090##
+ mcset $l "Go to next bookmark" \
+ "Go to next bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:001091##
+ mcset $l "Go to previous bookmark" \
+ "Go to previous bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:001092##
+ mcset $l "Program jump" \
+ "Program jump" ;# <-- NOT TRANSLATED YET
+ ##ID:001093##
+ mcset $l "Call subprogram" \
+ "Call subprogram" ;# <-- NOT TRANSLATED YET
+ ##ID:001094##
+ mcset $l "Editor command line" \
+ "Editor command line" ;# <-- NOT TRANSLATED YET
+ ##ID:001095##
+ mcset $l "Split vertical" \
+ "Split vertical" ;# <-- NOT TRANSLATED YET
+ ##ID:001096##
+ mcset $l "Split horizontal" \
+ "Split horizontal" ;# <-- NOT TRANSLATED YET
+ ##ID:001097##
+ mcset $l "Close current view" \
+ "Close current view" ;# <-- NOT TRANSLATED YET
+ ##ID:001098##
+ mcset $l "Block selection mode" \
+ "Block selection mode" ;# <-- NOT TRANSLATED YET
+}
+# instructiondetails.tcl
+# ==============================================================================
+namespace eval InstructionDetails {
+ ##ID:001099##
+ mcset $l "Note:" \
+ "Note:" ;# <-- NOT TRANSLATED YET
+ ##ID:001100##
+ mcset $l "OPCODE:" \
+ "OPCODE:" ;# <-- NOT TRANSLATED YET
+ ##ID:001101##
+ mcset $l "Time:" \
+ "Time:" ;# <-- NOT TRANSLATED YET
+ ##ID:001102##
+ mcset $l "Length:" \
+ "Length:" ;# <-- NOT TRANSLATED YET
+ ##ID:001103##
+ mcset $l "Flags:" \
+ "Flags:" ;# <-- NOT TRANSLATED YET
+ ##ID:001104##
+ mcset $l "Class:" \
+ "Class:" ;# <-- NOT TRANSLATED YET
+ ##ID:001105##
+ mcset $l "no help available for this directive" \
+ "no help available for this directive" ;# <-- NOT TRANSLATED YET
+ ##ID:001106##
+ mcset $l "\tCarry flag\n" \
+ "\tCarry flag\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001107##
+ mcset $l "\tIndirect address" \
+ "\tIndirect address" ;# <-- NOT TRANSLATED YET
+ ##ID:001108##
+ mcset $l "\tRegisters of active bank\n" \
+ "\tRegisters of active bank\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001109##
+ mcset $l "\tAccumulator\n" \
+ "\tAccumulator\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001110##
+ mcset $l "\tPrimary work register\n" \
+ "\tPrimary work register\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001111##
+ mcset $l "\tData PoinTeR register (16 bit)\n" \
+ "\tData PoinTeR register (16 bit)\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001112##
+ mcset $l "\tbit memory direct address\n" \
+ "\tbit memory direct address\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001113##
+ mcset $l "\tinternal data memory or SFR direct address\n" \
+ "\tinternal data memory or SFR direct address\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001114##
+ mcset $l "\t16 bit constant data\n" \
+ "\t16 bit constant data\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001115##
+ mcset $l "\t8 bit constant data\n" \
+ "\t8 bit constant data\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001116##
+ mcset $l "\t16 bit program memory address\n" \
+ "\t16 bit program memory address\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001117##
+ mcset $l "\t11 bit program memory address\n" \
+ "\t11 bit program memory address\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001118##
+ mcset $l "\t8 bit offset for relative jump\n" \
+ "\t8 bit offset for relative jump\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001119##
+ mcset $l "bit" \
+ "bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001120##
+ mcset $l "data" \
+ "data" ;# <-- NOT TRANSLATED YET
+ ##ID:001121##
+ mcset $l "imm16" \
+ "imm16" ;# <-- NOT TRANSLATED YET
+ ##ID:001122##
+ mcset $l "imm8" \
+ "imm8" ;# <-- NOT TRANSLATED YET
+ ##ID:001123##
+ mcset $l "code16" \
+ "code16" ;# <-- NOT TRANSLATED YET
+ ##ID:001124##
+ mcset $l "code11" \
+ "code11" ;# <-- NOT TRANSLATED YET
+ ##ID:001125##
+ mcset $l "code8" \
+ "code8" ;# <-- NOT TRANSLATED YET
+ ##ID:001126##
+ mcset $l "-- click to close --" \
+ "-- click to close --" ;# <-- NOT TRANSLATED YET
+ ##ID:001127##
+ mcset $l "Instruction operands" \
+ "Instruction operands" ;# <-- NOT TRANSLATED YET
+ ##ID:001128##
+ mcset $l "Instruction name" \
+ "Instruction name" ;# <-- NOT TRANSLATED YET
+ ##ID:001129##
+ mcset $l "Show legend" \
+ "Show legend" ;# <-- NOT TRANSLATED YET
+ ##ID:001130##
+ mcset $l "Conditional assembly\n\nSyntax:\n ELSEIF <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "Conditional assembly\n\nSyntax:\n ELSEIF <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001131##
+ mcset $l "IF Not, conditional assembly\n\nSyntax:\n IFN <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "IF Not, conditional assembly\n\nSyntax:\n IFN <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001132##
+ mcset $l "ELSE IF Not\n\nSyntax:\n ELSEIFN <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFN SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "ELSE IF Not\n\nSyntax:\n ELSEIFN <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFN SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001133##
+ mcset $l "IF DEFined\n\nSyntax:\n IFDEF <symbol>\n\nExample:\n IFDEF CND\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "IF DEFined\n\nSyntax:\n IFDEF <symbol>\n\nExample:\n IFDEF CND\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001134##
+ mcset $l "ELSE IF DEFined\n\nSyntax:\n ELSEIFDEF <symbol>\n\nExample:\n IFDEF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "ELSE IF DEFined\n\nSyntax:\n ELSEIFDEF <symbol>\n\nExample:\n IFDEF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001135##
+ mcset $l "IF Not DEFined\n\nSyntax:\n IFNDEF <symbol>\n\nExample:\n IFNDEF CND\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "IF Not DEFined\n\nSyntax:\n IFNDEF <symbol>\n\nExample:\n IFNDEF CND\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001136##
+ mcset $l "ELSE IF Not DEFined\n\nSyntax:\n ELSEIFNDEF <symbol>\n\nExample:\n IFDEF CND\n MOV A, #20h\n ELSEIFNDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "ELSE IF Not DEFined\n\nSyntax:\n ELSEIFNDEF <symbol>\n\nExample:\n IFDEF CND\n MOV A, #20h\n ELSEIFNDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001137##
+ mcset $l "IF Black\n\nSyntax:\n IFB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" \
+ "IF Black\n\nSyntax:\n IFB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001138##
+ mcset $l "ELSE IF Black\n\nSyntax:\n ELSEIFB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSEIFB <SOMETHING_ELSE>\n MOV A, #40h\n ENDIF\n\literal:\n Supported by ASEM-51 only" \
+ "ELSE IF Black\n\nSyntax:\n ELSEIFB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSEIFB <SOMETHING_ELSE>\n MOV A, #40h\n ENDIF\n\literal:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001139##
+ mcset $l "IF Not Black\n\nSyntax:\n IFNB <literal>\n\nExample:\n IFNB <CND>\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" \
+ "IF Not Black\n\nSyntax:\n IFNB <literal>\n\nExample:\n IFNB <CND>\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001140##
+ mcset $l "ELSE IF Not Black\n\nSyntax:\n ELSEIFNB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSEIFNB <SOMETHING_ELSE>\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" \
+ "ELSE IF Not Black\n\nSyntax:\n ELSEIFNB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSEIFNB <SOMETHING_ELSE>\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001141##
+ mcset $l "REPeaT Macro\n\nSyntax:\n REPT <expr>\n\nExample:\n REPT 5\n NOP\n ENDM\n\n" \
+ "REPeaT Macro\n\nSyntax:\n REPT <expr>\n\nExample:\n REPT 5\n NOP\n ENDM\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001142##
+ mcset $l "REPeaT Macro\n\nSyntax:\n TIMES <expr>\n\nExample:\n TIMES 5\n NOP\n ENDM\n\nNote:\n Supported by native assembler only" \
+ "REPeaT Macro\n\nSyntax:\n TIMES <expr>\n\nExample:\n TIMES 5\n NOP\n ENDM\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001143##
+ mcset $l "define module NAME\n\nSyntax:\n NAME <name>\n\nExample:\n NAME my_2nd_program\n\nNote:\n Supported by ASEM-51 only" \
+ "define module NAME\n\nSyntax:\n NAME <name>\n\nExample:\n NAME my_2nd_program\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001144##
+ mcset $l "Conditional assembly\n\nSyntax:\n IF <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "Conditional assembly\n\nSyntax:\n IF <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001145##
+ mcset $l "Conditional assembly\n\nSyntax:\n ELSE\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "Conditional assembly\n\nSyntax:\n ELSE\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001146##
+ mcset $l "Conditional assembly\n\nSyntax:\n ENDIF\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "Conditional assembly\n\nSyntax:\n ENDIF\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001147##
+ mcset $l "END of Macro definition\n\nSyntax:\n ENDM\n\nExample:\n ABC MACRO\n MOV B, #12d\n ENDM\n\n" \
+ "END of Macro definition\n\nSyntax:\n ENDM\n\nExample:\n ABC MACRO\n MOV B, #12d\n ENDM\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001148##
+ mcset $l "END of the program\n\nSyntax:\n END\n\nExample:\n END\n\n" \
+ "END of the program\n\nSyntax:\n END\n\nExample:\n END\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001149##
+ mcset $l "premature end of macro expansion\n\nSyntax:\n EXITM\n\nExample:\n ABC MACRO\n MOV B, #12d\n EXITM\n NOP\n ENDM\n\n" \
+ "premature end of macro expansion\n\nSyntax:\n EXITM\n\nExample:\n ABC MACRO\n MOV B, #12d\n EXITM\n NOP\n ENDM\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001150##
+ mcset $l "enable code LISTing\n\nSyntax:\n LIST\n\nExample:\n NOP\n NOLIST\n NOP\n NOP\n LIST\n NOP\n\n" \
+ "enable code LISTing\n\nSyntax:\n LIST\n\nExample:\n NOP\n NOLIST\n NOP\n NOP\n LIST\n NOP\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001151##
+ mcset $l "disabled code listing\n\nSyntax:\n NOLIST\n\nExample:\n NOP\n NOLIST\n NOP\n NOP\n LIST\n NOP\n\n" \
+ "disabled code listing\n\nSyntax:\n NOLIST\n\nExample:\n NOP\n NOLIST\n NOP\n NOP\n LIST\n NOP\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001152##
+ mcset $l "switch to DATA segment \[at address\]\n\nSyntax:\n DSEG \[AT <expr>\]\n\nExample:\n DSEG at 20d\n\n" \
+ "switch to DATA segment \[at address\]\n\nSyntax:\n DSEG \[AT <expr>\]\n\nExample:\n DSEG at 20d\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001153##
+ mcset $l "switch to IDATA segment \[at address\]\n\nSyntax:\n ISEG \[AT <expr>\]\n\nExample:\n ISEG at 10d\n\n" \
+ "switch to IDATA segment \[at address\]\n\nSyntax:\n ISEG \[AT <expr>\]\n\nExample:\n ISEG at 10d\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001154##
+ mcset $l "switch to BIT segment \[at address\]\n\nSyntax:\n BSEG \[AT <expr>\]\n\nExample:\n BSEG at 5d\n\n" \
+ "switch to BIT segment \[at address\]\n\nSyntax:\n BSEG \[AT <expr>\]\n\nExample:\n BSEG at 5d\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001155##
+ mcset $l "switch to XDATA segment \[at address\]\n\nSyntax:\n XSEG \[AT <expr>\]\n\nExample:\n XSEG at 30d\n\n" \
+ "switch to XDATA segment \[at address\]\n\nSyntax:\n XSEG \[AT <expr>\]\n\nExample:\n XSEG at 30d\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001156##
+ mcset $l "switch to CODE segment \[at address\]\n\nSyntax:\n CSEG \[AT <expr>\]\n\nExample:\n CSEG at 40d\n\n" \
+ "switch to CODE segment \[at address\]\n\nSyntax:\n CSEG \[AT <expr>\]\n\nExample:\n CSEG at 40d\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001157##
+ mcset $l "define a FLAG bit\n\nSyntax:\n <symbol> FLAG <expr>\n\nExample:\n F4 FLAG 16h\n\nNote:\n Deprecated directive. Consider directive BIT instead." \
+ "define a FLAG bit\n\nSyntax:\n <symbol> FLAG <expr>\n\nExample:\n F4 FLAG 16h\n\nNote:\n Deprecated directive. Consider directive BIT instead." ;# <-- NOT TRANSLATED YET
+ ##ID:001158##
+ mcset $l "SKIP bytes in the code memory\n\nSyntax:\n SKIP <expr>\n\nExample:\n SKIP 5\n\n" \
+ "SKIP bytes in the code memory\n\nSyntax:\n SKIP <expr>\n\nExample:\n SKIP 5\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001159##
+ mcset $l "EQUivalent\n\nSyntax:\n <symbol> EQU <expr>\n\nExample:\n ABC EQU R0\n XYZ EQU 4Eh+12\n\n" \
+ "EQUivalent\n\nSyntax:\n <symbol> EQU <expr>\n\nExample:\n ABC EQU R0\n XYZ EQU 4Eh+12\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001160##
+ mcset $l "define BIT address\n\nSyntax:\n <symbol> BIT <expr>\n\nExample:\n ABC BIT P4.5\n\n" \
+ "define BIT address\n\nSyntax:\n <symbol> BIT <expr>\n\nExample:\n ABC BIT P4.5\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001161##
+ mcset $l "SET numeric variable or variable register\n\nSyntax:\n <symbol> SET <expr>\n <symbol> SET <register>\n\nExample:\n ALPHA SET R0\n ALPHA SET 42*BETA\n\n" \
+ "SET numeric variable or variable register\n\nSyntax:\n <symbol> SET <expr>\n <symbol> SET <register>\n\nExample:\n ALPHA SET R0\n ALPHA SET 42*BETA\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001162##
+ mcset $l "define address in the CODE memory\n\nSyntax:\n <symbol> CODE <expr>\n\nExample:\n TBL CODE 600h\n\n" \
+ "define address in the CODE memory\n\nSyntax:\n <symbol> CODE <expr>\n\nExample:\n TBL CODE 600h\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001163##
+ mcset $l "define address in the DATA memory\n\nSyntax:\n <symbol> DATA <expr>\n\nExample:\n UIV DATA 20h\n\n" \
+ "define address in the DATA memory\n\nSyntax:\n <symbol> DATA <expr>\n\nExample:\n UIV DATA 20h\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001164##
+ mcset $l "define address in the Internal DATA memory\n\nSyntax:\n <symbol> IDATA <expr>\n\nExample:\n UIV IDATA 20h\n\n" \
+ "define address in the Internal DATA memory\n\nSyntax:\n <symbol> IDATA <expr>\n\nExample:\n UIV IDATA 20h\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001165##
+ mcset $l "define address in the External DATA memory\n\nSyntax:\n <symbol> XDATA <expr>\n\nExample:\n UIV XDATA 400h\n\n" \
+ "define address in the External DATA memory\n\nSyntax:\n <symbol> XDATA <expr>\n\nExample:\n UIV XDATA 400h\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001166##
+ mcset $l "MACRO definition\n\nSyntax:\n <macro> MACRO \[<arg0> \[,<arg1> ... \]\n\n\nExample:\n ABC MACRO X\n MOV X, #12d\n ENDM\n\n" \
+ "MACRO definition\n\nSyntax:\n <macro> MACRO \[<arg0> \[,<arg1> ... \]\n\n\nExample:\n ABC MACRO X\n MOV X, #12d\n ENDM\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001167##
+ mcset $l "Define Space\n\nSyntax:\n DS <expr>\n\nExample:\n DS 2+4\n\n" \
+ "Define Space\n\nSyntax:\n DS <expr>\n\nExample:\n DS 2+4\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001168##
+ mcset $l "Define Words\n\nSyntax:\n DW <expr1> \[,<expr2> ... \]\n\nExample:\n DW 0,02009H,2009,4171\n\n" \
+ "Define Words\n\nSyntax:\n DW <expr1> \[,<expr2> ... \]\n\nExample:\n DW 0,02009H,2009,4171\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001169##
+ mcset $l "Define Bytes\n\nSyntax:\n DB <expr1> \[,<expr2> ... \]\n\nExample:\n DB 24,'August',09,(2*8+24)/8\n\n" \
+ "Define Bytes\n\nSyntax:\n DB <expr1> \[,<expr2> ... \]\n\nExample:\n DB 24,'August',09,(2*8+24)/8\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001170##
+ mcset $l "Define BITs\n\nSyntax:\n DBIT <expr>\n\nExample:\n DBIT 4+2\n\n" \
+ "Define BITs\n\nSyntax:\n DBIT <expr>\n\nExample:\n DBIT 4+2\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001171##
+ mcset $l "INCLUDE an external source code\n\nSyntax:\n INCLUDE <filename>\n\nExample:\n INCLUDE 'my file.asm'\n\n" \
+ "INCLUDE an external source code\n\nSyntax:\n INCLUDE <filename>\n\nExample:\n INCLUDE 'my file.asm'\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001172##
+ mcset $l "ORiGin of code segment location\n\nSyntax:\n ORG <expr>\n\nExample:\n ORG 0Bh\n\n" \
+ "ORiGin of code segment location\n\nSyntax:\n ORG <expr>\n\nExample:\n ORG 0Bh\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001173##
+ mcset $l "USING register banks\n\nSyntax:\n USING <expr>\n\nExample:\n USING 2\n\n" \
+ "USING register banks\n\nSyntax:\n USING <expr>\n\nExample:\n USING 2\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001174##
+ mcset $l "define BYTE address in the data memory\n\nSyntax:\n <symbol> BYTE <expr>\n\nExample:\n UIV BYTE 20h\n\nNote:\n Deprecated directive. Consider directive DATA instead." \
+ "define BYTE address in the data memory\n\nSyntax:\n <symbol> BYTE <expr>\n\nExample:\n UIV BYTE 20h\n\nNote:\n Deprecated directive. Consider directive DATA instead." ;# <-- NOT TRANSLATED YET
+ ##ID:001175##
+ mcset $l "List full IFxx .. ENDIF\n\nSyntax:\n \$COND\n\nExample:\n \$COND\n\nNote:\n Supported by ASEM-51 only" \
+ "List full IFxx .. ENDIF\n\nSyntax:\n \$COND\n\nExample:\n \$COND\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001176##
+ mcset $l "Don't list lines in false branches\n\nSyntax:\n \$NOCOND\n\nExample:\n \$NOCOND\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't list lines in false branches\n\nSyntax:\n \$NOCOND\n\nExample:\n \$NOCOND\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001177##
+ mcset $l "List assembled lines only\n\nSyntax:\n \$CONDONLY\n\nExample:\n \$CONDONLY\n\nNote:\n Supported by ASEM-51 only" \
+ "List assembled lines only\n\nSyntax:\n \$CONDONLY\n\nExample:\n \$CONDONLY\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001178##
+ mcset $l "Inserts date string into page header\n\nSyntax:\n \$DATE(string)\n\nExample:\n \$DATE(1965-12-31)\n\n" \
+ "Inserts date string into page header\n\nSyntax:\n \$DATE(string)\n\nExample:\n \$DATE(1965-12-31)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001179##
+ mcset $l "Include debug information\n\nSyntax:\n \$DEBUG\n\nExample:\n \$DEBUG\n\nNote:\n Supported by ASEM-51 only" \
+ "Include debug information\n\nSyntax:\n \$DEBUG\n\nExample:\n \$DEBUG\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001180##
+ mcset $l "Include debug information\n\nSyntax:\n \$DB\n\nExample:\n \$DB\n\nNote:\n Supported by ASEM-51 only" \
+ "Include debug information\n\nSyntax:\n \$DB\n\nExample:\n \$DB\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001181##
+ mcset $l "Don't include debug information\n\nSyntax:\n \$NODEBUG\n\nExample:\n \$NODEBUG\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't include debug information\n\nSyntax:\n \$NODEBUG\n\nExample:\n \$NODEBUG\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001182##
+ mcset $l "Don't include debug information\n\nSyntax:\n \$NODB\n\nExample:\n \$NODB\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't include debug information\n\nSyntax:\n \$NODB\n\nExample:\n \$NODB\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001183##
+ mcset $l "Start a new page in list file\n\nSyntax:\n \$EJECT\n\nExample:\n \$EJECT\n\n" \
+ "Start a new page in list file\n\nSyntax:\n \$EJECT\n\nExample:\n \$EJECT\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001184##
+ mcset $l "Start a new page in list file\n\nSyntax:\n \$EJ\n\nExample:\n \$EJ\n\n" \
+ "Start a new page in list file\n\nSyntax:\n \$EJ\n\nExample:\n \$EJ\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001185##
+ mcset $l "Force a user-defined error\n\nSyntax:\n \$ERROR(string)\n\nExample:\n \$ERROR(Impossible combination ...)\n\nNote:\n Supported by ASEM-51 only" \
+ "Force a user-defined error\n\nSyntax:\n \$ERROR(string)\n\nExample:\n \$ERROR(Impossible combination ...)\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001186##
+ mcset $l "Force a user-defined warning\n\nSyntax:\n \$WARNING(string)\n\nExample:\n \$WARNING(Testing only !)\n\nNote:\n Supported by ASEM-51 only" \
+ "Force a user-defined warning\n\nSyntax:\n \$WARNING(string)\n\nExample:\n \$WARNING(Testing only !)\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001187##
+ mcset $l "List macro calls and expansion lines\n\nSyntax:\n \$GE\n\nExample:\n \$GE\n\nNote:\n Supported by ASEM-51 only" \
+ "List macro calls and expansion lines\n\nSyntax:\n \$GE\n\nExample:\n \$GE\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001188##
+ mcset $l "List macro calls and expansion lines\n\nSyntax:\n \$GEN\n\nExample:\n \$GEN\n\nNote:\n Supported by ASEM-51 only" \
+ "List macro calls and expansion lines\n\nSyntax:\n \$GEN\n\nExample:\n \$GEN\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001189##
+ mcset $l "List macro calls only\n\nSyntax:\n \$NOGE\n\nExample:\n \$NOGE\n\nNote:\n Supported by ASEM-51 only" \
+ "List macro calls only\n\nSyntax:\n \$NOGE\n\nExample:\n \$NOGE\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001190##
+ mcset $l "List macro calls only\n\nSyntax:\n \$NOGEN\n\nExample:\n \$NOGEN\n\nNote:\n Supported by ASEM-51 only" \
+ "List macro calls only\n\nSyntax:\n \$NOGEN\n\nExample:\n \$NOGEN\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001191##
+ mcset $l "List expansion lines only\n\nSyntax:\n \$GO\n\nExample:\n \$GO\n\nNote:\n Supported by ASEM-51 only" \
+ "List expansion lines only\n\nSyntax:\n \$GO\n\nExample:\n \$GO\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001192##
+ mcset $l "List expansion lines only\n\nSyntax:\n \$GENONLY\n\nExample:\n \$GENONLY\n\nNote:\n Supported by ASEM-51 only" \
+ "List expansion lines only\n\nSyntax:\n \$GENONLY\n\nExample:\n \$GENONLY\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001193##
+ mcset $l "Include a source file\n\nSyntax:\n \$INCLUDE(string)\n\nExample:\n \$INCLUDE(somefile.asm)\n\n" \
+ "Include a source file\n\nSyntax:\n \$INCLUDE(string)\n\nExample:\n \$INCLUDE(somefile.asm)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001194##
+ mcset $l "Include a source file\n\nSyntax:\n \$INC(string)\n\nExample:\n \$INC(somefile.asm)\n\n" \
+ "Include a source file\n\nSyntax:\n \$INC(string)\n\nExample:\n \$INC(somefile.asm)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001195##
+ mcset $l "List subsequent source lines\n\nSyntax:\n \$LIST\n\nExample:\n \$LIST\n\n" \
+ "List subsequent source lines\n\nSyntax:\n \$LIST\n\nExample:\n \$LIST\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001196##
+ mcset $l "List subsequent source lines\n\nSyntax:\n \$LI\n\nExample:\n \$LI\n\n" \
+ "List subsequent source lines\n\nSyntax:\n \$LI\n\nExample:\n \$LI\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001197##
+ mcset $l "Don't list subsequent source lines\n\nSyntax:\n \$NOLI\n\nExample:\n \$NOLI\n\n" \
+ "Don't list subsequent source lines\n\nSyntax:\n \$NOLI\n\nExample:\n \$NOLI\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001198##
+ mcset $l "Don't list subsequent source lines\n\nSyntax:\n \$NOLIST\n\nExample:\n \$NOLIST\n\n" \
+ "Don't list subsequent source lines\n\nSyntax:\n \$NOLIST\n\nExample:\n \$NOLIST\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001199##
+ mcset $l "Reserve n % of free memory for macros\n\nSyntax:\n \$MACRO(int)\n\nExample:\n \$MACRO(50)\n\nNote:\n Supported by ASEM-51 only" \
+ "Reserve n % of free memory for macros\n\nSyntax:\n \$MACRO(int)\n\nExample:\n \$MACRO(50)\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001200##
+ mcset $l "Reserve n % of free memory for macros\n\nSyntax:\n \$MR(int)\n\nExample:\n \$MR(50)\n\nNote:\n Supported by ASEM-51 only" \
+ "Reserve n % of free memory for macros\n\nSyntax:\n \$MR(int)\n\nExample:\n \$MR(50)\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001201##
+ mcset $l "Reserve all for the symbol table\n\nSyntax:\n \$NOMR\n\nExample:\n \$NOMR\n\nNote:\n Supported by ASEM-51 only" \
+ "Reserve all for the symbol table\n\nSyntax:\n \$NOMR\n\nExample:\n \$NOMR\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001202##
+ mcset $l "Reserve all for the symbol table\n\nSyntax:\n \$NOMACRO\n\nExample:\n \$NOMACRO\n\nNote:\n Supported by ASEM-51 only" \
+ "Reserve all for the symbol table\n\nSyntax:\n \$NOMACRO\n\nExample:\n \$NOMACRO\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001203##
+ mcset $l "Enable predefined SFR symbols\n\nSyntax:\n \$MOD51\n\nExample:\n \$MOD51\n\nNote:\n Supported by ASEM-51 only" \
+ "Enable predefined SFR symbols\n\nSyntax:\n \$MOD51\n\nExample:\n \$MOD51\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001204##
+ mcset $l "Enable predefined SFR symbols\n\nSyntax:\n \$MO\n\nExample:\n \$MO\n\nNote:\n Supported by ASEM-51 only" \
+ "Enable predefined SFR symbols\n\nSyntax:\n \$MO\n\nExample:\n \$MO\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001205##
+ mcset $l "Disable predefined SFR symbols\n\nSyntax:\n \$NOMOD\n\nExample:\n \$NOMOD\n\n" \
+ "Disable predefined SFR symbols\n\nSyntax:\n \$NOMOD\n\nExample:\n \$NOMOD\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001206##
+ mcset $l "Disable predefined SFR symbols\n\nSyntax:\n \$NOMO\n\nExample:\n \$NOMO\n\n" \
+ "Disable predefined SFR symbols\n\nSyntax:\n \$NOMO\n\nExample:\n \$NOMO\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001207##
+ mcset $l "Disable predefined SFR symbols\n\nSyntax:\n \$NOMOD51\n\nExample:\n \$NOMOD51\n\n" \
+ "Disable predefined SFR symbols\n\nSyntax:\n \$NOMOD51\n\nExample:\n \$NOMOD51\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001208##
+ mcset $l "Don't list predefined symbols\n\nSyntax:\n \$NOBUILTIN\n\nExample:\n \$NOBUILTIN\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't list predefined symbols\n\nSyntax:\n \$NOBUILTIN\n\nExample:\n \$NOBUILTIN\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001209##
+ mcset $l "Don't use tabs in list file\n\nSyntax:\n \$NOTABS\n\nExample:\n \$NOTABS\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't use tabs in list file\n\nSyntax:\n \$NOTABS\n\nExample:\n \$NOTABS\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001210##
+ mcset $l "Enable listing page formatting\n\nSyntax:\n \$LIST\n\nExample:\n \$PAGING\n\n" \
+ "Enable listing page formatting\n\nSyntax:\n \$LIST\n\nExample:\n \$PAGING\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001211##
+ mcset $l "Enable listing page formatting\n\nSyntax:\n \$PI\n\nExample:\n \$PI\n\n" \
+ "Enable listing page formatting\n\nSyntax:\n \$PI\n\nExample:\n \$PI\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001212##
+ mcset $l "Disable listing page formatting\n\nSyntax:\n \$NOPI\n\nExample:\n \$NOPI\n\n" \
+ "Disable listing page formatting\n\nSyntax:\n \$NOPI\n\nExample:\n \$NOPI\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001213##
+ mcset $l "Disable listing page formatting\n\nSyntax:\n \$NOPAGING\n\nExample:\n \$NOPAGING\n\n" \
+ "Disable listing page formatting\n\nSyntax:\n \$NOPAGING\n\nExample:\n \$NOPAGING\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001214##
+ mcset $l "Set lines per page for listing\n\nSyntax:\n \$PAGELENGTH(int)\n\nExample:\n \$PAGELENGTH(64)\n\n" \
+ "Set lines per page for listing\n\nSyntax:\n \$PAGELENGTH(int)\n\nExample:\n \$PAGELENGTH(64)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001215##
+ mcset $l "Set lines per page for listing\n\nSyntax:\n \$PL(int)\n\nExample:\n \$PL(64)\n\n" \
+ "Set lines per page for listing\n\nSyntax:\n \$PL(int)\n\nExample:\n \$PL(64)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001216##
+ mcset $l "Set columns per line for listing\n\nSyntax:\n \$PAGEWIDTH(int)\n\nExample:\n \$PAGEWIDTH(132)\n\n" \
+ "Set columns per line for listing\n\nSyntax:\n \$PAGEWIDTH(int)\n\nExample:\n \$PAGEWIDTH(132)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001217##
+ mcset $l "Set columns per line for listing\n\nSyntax:\n \$PW(int)\n\nExample:\n \$PW(132)\n\n" \
+ "Set columns per line for listing\n\nSyntax:\n \$PW(int)\n\nExample:\n \$PW(132)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001218##
+ mcset $l "Switch on 83C75x family support\n\nSyntax:\n \$PHILIPS\n\nExample:\n \$PHILIPS\n\nNote:\n Supported by ASEM-51 only" \
+ "Switch on 83C75x family support\n\nSyntax:\n \$PHILIPS\n\nExample:\n \$PHILIPS\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001219##
+ mcset $l "Save current \$LIST/\$GEN/\$COND\n\nSyntax:\n \$SAVE\n\nExample:\n \$SAVE\n\nNote:\n Supported by ASEM-51 only" \
+ "Save current \$LIST/\$GEN/\$COND\n\nSyntax:\n \$SAVE\n\nExample:\n \$SAVE\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001220##
+ mcset $l "Save current \$LIST/\$GEN/\$COND\n\nSyntax:\n \$SA\n\nExample:\n \$SA\n\nNote:\n Supported by ASEM-51 only" \
+ "Save current \$LIST/\$GEN/\$COND\n\nSyntax:\n \$SA\n\nExample:\n \$SA\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001221##
+ mcset $l "Restore old \$LIST/\$GEN/\$COND\n\nSyntax:\n \$RESTORE\n\nExample:\n \$RESTORE\n\nNote:\n Supported by ASEM-51 only" \
+ "Restore old \$LIST/\$GEN/\$COND\n\nSyntax:\n \$RESTORE\n\nExample:\n \$RESTORE\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001222##
+ mcset $l "Restore old \$LIST/\$GEN/\$COND\n\nSyntax:\n \$RS\n\nExample:\n \$RS\n\nNote:\n Supported by ASEM-51 only" \
+ "Restore old \$LIST/\$GEN/\$COND\n\nSyntax:\n \$RS\n\nExample:\n \$RS\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001223##
+ mcset $l "Create symbol table\n\nSyntax:\n \$SYMBOLS\n\nExample:\n \$SYMBOLS\n\n" \
+ "Create symbol table\n\nSyntax:\n \$SYMBOLS\n\nExample:\n \$SYMBOLS\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001224##
+ mcset $l "Create symbol table\n\nSyntax:\n \$SB\n\nExample:\n \$SB\n\n" \
+ "Create symbol table\n\nSyntax:\n \$SB\n\nExample:\n \$SB\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001225##
+ mcset $l "Don't create symbol table\n\nSyntax:\n \$NOSYMBOLS\n\nExample:\n \$NOSYMBOLS\n\n" \
+ "Don't create symbol table\n\nSyntax:\n \$NOSYMBOLS\n\nExample:\n \$NOSYMBOLS\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001226##
+ mcset $l "Don't create symbol table\n\nSyntax:\n \$NOSB\n\nExample:\n \$NOSB\n\n" \
+ "Don't create symbol table\n\nSyntax:\n \$NOSB\n\nExample:\n \$NOSB\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001227##
+ mcset $l "Inserts title string into page header\n\nSyntax:\n \$TITLE(string)\n\nExample:\n \$TITLE(My firts code)\n\n" \
+ "Inserts title string into page header\n\nSyntax:\n \$TITLE(string)\n\nExample:\n \$TITLE(My firts code)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001228##
+ mcset $l "Inserts title string into page header\n\nSyntax:\n \$TT(string)\n\nExample:\n \$TT(My firts code)\n\n" \
+ "Inserts title string into page header\n\nSyntax:\n \$TT(string)\n\nExample:\n \$TT(My firts code)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001229##
+ mcset $l "Create cross reference\n\nSyntax:\n \$XREF\n\nExample:\n \$XREF\n\nNote:\n Supported by ASEM-51 only" \
+ "Create cross reference\n\nSyntax:\n \$XREF\n\nExample:\n \$XREF\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001230##
+ mcset $l "Create cross reference\n\nSyntax:\n \$XR\n\nExample:\n \$XR\n\nNote:\n Supported by ASEM-51 only" \
+ "Create cross reference\n\nSyntax:\n \$XR\n\nExample:\n \$XR\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001231##
+ mcset $l "Don't create cross reference\n\nSyntax:\n \$NOXREF\n\nExample:\n \$NOXREF\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't create cross reference\n\nSyntax:\n \$NOXREF\n\nExample:\n \$NOXREF\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001232##
+ mcset $l "Don't create cross reference\n\nSyntax:\n \$NOXR\n\nExample:\n \$NOXR\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't create cross reference\n\nSyntax:\n \$NOXR\n\nExample:\n \$NOXR\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001233##
+ mcset $l "Do not create Intel HEX file\n\nSyntax:\n \$NOOBJECT\n\nExample:\n \$NOOBJECT\n\nNote:\n Supported by native assembler only" \
+ "Do not create Intel HEX file\n\nSyntax:\n \$NOOBJECT\n\nExample:\n \$NOOBJECT\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001234##
+ mcset $l "Specify file name for Intel HEX\n\nSyntax:\n \$OBJECT(string)\n\nExample:\n \$OBJECT(my_hex.hex)\n\nNote:\n Supported by native assembler only" \
+ "Specify file name for Intel HEX\n\nSyntax:\n \$OBJECT(string)\n\nExample:\n \$OBJECT(my_hex.hex)\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001235##
+ mcset $l "Specify file name for list file\n\nSyntax:\n \$PRINT(string)\n\nExample:\n \$PRINT(my_list.lst)\n\nNote:\n Supported by native assembler only" \
+ "Specify file name for list file\n\nSyntax:\n \$PRINT(string)\n\nExample:\n \$PRINT(my_list.lst)\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001236##
+ mcset $l "Do not create list file at all\n\nSyntax:\n \$NOPRINT\n\nExample:\n \$NOPRINT\n\nNote:\n Supported by native assembler only" \
+ "Do not create list file at all\n\nSyntax:\n \$NOPRINT\n\nExample:\n \$NOPRINT\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001237##
+ mcset $l "Define and expand macro instruction after! conditional assembly and definitions of constants\n\nSyntax:\n \$NOMACROSFIRTS\n\nExample:\n \$NOMACROSFIRTS\n\nNote:\n Supported by native assembler only" \
+ "Define and expand macro instruction after! conditional assembly and definitions of constants\n\nSyntax:\n \$NOMACROSFIRTS\n\nExample:\n \$NOMACROSFIRTS\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001238##
+ mcset $l "Add register to Accumulator" \
+ "Add register to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001239##
+ mcset $l "Add direct byte to Accumulator" \
+ "Add direct byte to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001240##
+ mcset $l "Add indirect RAM to Accumulator" \
+ "Add indirect RAM to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001241##
+ mcset $l "Add immediate data to Accumulator" \
+ "Add immediate data to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001242##
+ mcset $l "Add register to Accumulator with Carry" \
+ "Add register to Accumulator with Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001243##
+ mcset $l "Add direct byte to Accumulator with Carry" \
+ "Add direct byte to Accumulator with Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001244##
+ mcset $l "Add indirect RAM to Accumulator with Carry" \
+ "Add indirect RAM to Accumulator with Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001245##
+ mcset $l "Add immediate data to Acc with Carry" \
+ "Add immediate data to Acc with Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001246##
+ mcset $l "Subtract Register from Acc with borrow" \
+ "Subtract Register from Acc with borrow" ;# <-- NOT TRANSLATED YET
+ ##ID:001247##
+ mcset $l "Subtract direct byte from Acc with borrow" \
+ "Subtract direct byte from Acc with borrow" ;# <-- NOT TRANSLATED YET
+ ##ID:001248##
+ mcset $l "Subtract indirect RAM from ACC with borrow" \
+ "Subtract indirect RAM from ACC with borrow" ;# <-- NOT TRANSLATED YET
+ ##ID:001249##
+ mcset $l "Subtract immediate data from Acc with borrow" \
+ "Subtract immediate data from Acc with borrow" ;# <-- NOT TRANSLATED YET
+ ##ID:001250##
+ mcset $l "Increment Accumulator" \
+ "Increment Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001251##
+ mcset $l "Increment register" \
+ "Increment register" ;# <-- NOT TRANSLATED YET
+ ##ID:001252##
+ mcset $l "Increment direct byte" \
+ "Increment direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001253##
+ mcset $l "Increment direct RAM" \
+ "Increment direct RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:001254##
+ mcset $l "Decrement Accumulator" \
+ "Decrement Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001255##
+ mcset $l "Decrement Register" \
+ "Decrement Register" ;# <-- NOT TRANSLATED YET
+ ##ID:001256##
+ mcset $l "Decrement direct byte" \
+ "Decrement direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001257##
+ mcset $l "Decrement indirect RAM" \
+ "Decrement indirect RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:001258##
+ mcset $l "Increment Data Pointer" \
+ "Increment Data Pointer" ;# <-- NOT TRANSLATED YET
+ ##ID:001259##
+ mcset $l "Multiply A & B" \
+ "Multiply A & B" ;# <-- NOT TRANSLATED YET
+ ##ID:001260##
+ mcset $l "Divide A by B" \
+ "Divide A by B" ;# <-- NOT TRANSLATED YET
+ ##ID:001261##
+ mcset $l "Decimal Adjust Accumulator" \
+ "Decimal Adjust Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001262##
+ mcset $l "AND Register to Accumulator" \
+ "AND Register to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001263##
+ mcset $l "AND direct byte to Accumulator" \
+ "AND direct byte to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001264##
+ mcset $l "AND indirect RAM to Accumulator" \
+ "AND indirect RAM to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001265##
+ mcset $l "AND immediate data to Accumulator" \
+ "AND immediate data to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001266##
+ mcset $l "AND Accumulator to direct byte" \
+ "AND Accumulator to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001267##
+ mcset $l "AND immediate data to direct byte" \
+ "AND immediate data to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001268##
+ mcset $l "OR register to Accumulator" \
+ "OR register to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001269##
+ mcset $l "OR direct byte to Accumulator" \
+ "OR direct byte to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001270##
+ mcset $l "OR indirect RAM to Accumulator" \
+ "OR indirect RAM to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001271##
+ mcset $l "OR immediate data to Accumulator" \
+ "OR immediate data to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001272##
+ mcset $l "OR Accumulator to direct byte" \
+ "OR Accumulator to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001273##
+ mcset $l "OR immediate data to direct byte" \
+ "OR immediate data to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001274##
+ mcset $l "Exclusive-OR register to Accumulator" \
+ "Exclusive-OR register to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001275##
+ mcset $l "Exclusive-OR direct byte to Accumulator" \
+ "Exclusive-OR direct byte to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001276##
+ mcset $l "Exclusive-OR indirect RAM to Accumulator" \
+ "Exclusive-OR indirect RAM to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001277##
+ mcset $l "Exclusive-OR immediate data to Accumulator" \
+ "Exclusive-OR immediate data to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001278##
+ mcset $l "Exclusive-OR Accumulator to direct byte" \
+ "Exclusive-OR Accumulator to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001279##
+ mcset $l "Exclusive-OR immediate data to direct byte" \
+ "Exclusive-OR immediate data to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001280##
+ mcset $l "Clear Accumulator" \
+ "Clear Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001281##
+ mcset $l "Complement Accumulator" \
+ "Complement Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001282##
+ mcset $l "Rotate Accumulator Left" \
+ "Rotate Accumulator Left" ;# <-- NOT TRANSLATED YET
+ ##ID:001283##
+ mcset $l "Rotate Accumulator Left through the Carry" \
+ "Rotate Accumulator Left through the Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001284##
+ mcset $l "Rotate Accumulator Right" \
+ "Rotate Accumulator Right" ;# <-- NOT TRANSLATED YET
+ ##ID:001285##
+ mcset $l "Rotate Accumulator Right through the Carry" \
+ "Rotate Accumulator Right through the Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001286##
+ mcset $l "Swap nibbles within the Accumulator" \
+ "Swap nibbles within the Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001287##
+ mcset $l "Move register to Accumulator" \
+ "Move register to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001288##
+ mcset $l "Move direct byte to Accumulator" \
+ "Move direct byte to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001289##
+ mcset $l "Move indirect RAM to Accumulator" \
+ "Move indirect RAM to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001290##
+ mcset $l "Move immediate data to Accumulator" \
+ "Move immediate data to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001291##
+ mcset $l "Move Accumulator to register" \
+ "Move Accumulator to register" ;# <-- NOT TRANSLATED YET
+ ##ID:001292##
+ mcset $l "Move direct byte to register" \
+ "Move direct byte to register" ;# <-- NOT TRANSLATED YET
+ ##ID:001293##
+ mcset $l "Move immediate data to register" \
+ "Move immediate data to register" ;# <-- NOT TRANSLATED YET
+ ##ID:001294##
+ mcset $l "Move Accumulator to direct byte" \
+ "Move Accumulator to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001295##
+ mcset $l "Move register to direct byte" \
+ "Move register to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001296##
+ mcset $l "Move direct byte to direct" \
+ "Move direct byte to direct" ;# <-- NOT TRANSLATED YET
+ ##ID:001297##
+ mcset $l "Move indirect RAM to direct byte" \
+ "Move indirect RAM to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001298##
+ mcset $l "Move immediate data to direct byte" \
+ "Move immediate data to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001299##
+ mcset $l "Move Accumulator to indirect RAM" \
+ "Move Accumulator to indirect RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:001300##
+ mcset $l "Move direct byte to indirect RAM" \
+ "Move direct byte to indirect RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:001301##
+ mcset $l "Move immediate data to indirect RAM" \
+ "Move immediate data to indirect RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:001302##
+ mcset $l "Load Data Pointer with a 16-bit constant" \
+ "Load Data Pointer with a 16-bit constant" ;# <-- NOT TRANSLATED YET
+ ##ID:001303##
+ mcset $l "Move Code byte relative to DPTR to Acc" \
+ "Move Code byte relative to DPTR to Acc" ;# <-- NOT TRANSLATED YET
+ ##ID:001304##
+ mcset $l "Move Code byte relative to PC to Acc" \
+ "Move Code byte relative to PC to Acc" ;# <-- NOT TRANSLATED YET
+ ##ID:001305##
+ mcset $l "Move External RAM (8-bit addr) to Acc" \
+ "Move External RAM (8-bit addr) to Acc" ;# <-- NOT TRANSLATED YET
+ ##ID:001306##
+ mcset $l "Move Exernal RAM (16-bit addr) to Acc" \
+ "Move Exernal RAM (16-bit addr) to Acc" ;# <-- NOT TRANSLATED YET
+ ##ID:001307##
+ mcset $l "Move Acc to External RAM (8-bit addr)" \
+ "Move Acc to External RAM (8-bit addr)" ;# <-- NOT TRANSLATED YET
+ ##ID:001308##
+ mcset $l "Move Acc to External RAM (16-bit addr)" \
+ "Move Acc to External RAM (16-bit addr)" ;# <-- NOT TRANSLATED YET
+ ##ID:001309##
+ mcset $l "Push direct byte onto stack" \
+ "Push direct byte onto stack" ;# <-- NOT TRANSLATED YET
+ ##ID:001310##
+ mcset $l "Pop direct byte from stack" \
+ "Pop direct byte from stack" ;# <-- NOT TRANSLATED YET
+ ##ID:001311##
+ mcset $l "Exchange register with Accumulator" \
+ "Exchange register with Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001312##
+ mcset $l "Exchange direct byte with Accumulator" \
+ "Exchange direct byte with Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001313##
+ mcset $l "Exchange indirect RAM with Accumulator" \
+ "Exchange indirect RAM with Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001314##
+ mcset $l "Exchange low-order Digit indirect RAM with Acc" \
+ "Exchange low-order Digit indirect RAM with Acc" ;# <-- NOT TRANSLATED YET
+ ##ID:001315##
+ mcset $l "Clear Carry" \
+ "Clear Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001316##
+ mcset $l "Clear direct bit" \
+ "Clear direct bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001317##
+ mcset $l "Set Carry" \
+ "Set Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001318##
+ mcset $l "Set direct bit" \
+ "Set direct bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001319##
+ mcset $l "Complement Carry" \
+ "Complement Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001320##
+ mcset $l "Complement direct bit" \
+ "Complement direct bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001321##
+ mcset $l "AND direct bit to CARRY" \
+ "AND direct bit to CARRY" ;# <-- NOT TRANSLATED YET
+ ##ID:001322##
+ mcset $l "AND complement of direct bit to Carry" \
+ "AND complement of direct bit to Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001323##
+ mcset $l "OR direct bit to Carry" \
+ "OR direct bit to Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001324##
+ mcset $l "OR complement of direct bit to Carry" \
+ "OR complement of direct bit to Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001325##
+ mcset $l "Move direct bit to Carry" \
+ "Move direct bit to Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001326##
+ mcset $l "Move Carry to direct bit" \
+ "Move Carry to direct bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001327##
+ mcset $l "Jump if Carry is set" \
+ "Jump if Carry is set" ;# <-- NOT TRANSLATED YET
+ ##ID:001328##
+ mcset $l "Jump if Carry not set" \
+ "Jump if Carry not set" ;# <-- NOT TRANSLATED YET
+ ##ID:001329##
+ mcset $l "Jump if direct Bit is set" \
+ "Jump if direct Bit is set" ;# <-- NOT TRANSLATED YET
+ ##ID:001330##
+ mcset $l "Jump if direct Bit is Not set" \
+ "Jump if direct Bit is Not set" ;# <-- NOT TRANSLATED YET
+ ##ID:001331##
+ mcset $l "Jump if direct Bit is set & clear bit" \
+ "Jump if direct Bit is set & clear bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001332##
+ mcset $l "Absolute Subroutine Call" \
+ "Absolute Subroutine Call" ;# <-- NOT TRANSLATED YET
+ ##ID:001333##
+ mcset $l "Long Subroutine Call" \
+ "Long Subroutine Call" ;# <-- NOT TRANSLATED YET
+ ##ID:001334##
+ mcset $l "Return from Subroutine" \
+ "Return from Subroutine" ;# <-- NOT TRANSLATED YET
+ ##ID:001335##
+ mcset $l "Return from interrupt" \
+ "Return from interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:001336##
+ mcset $l "Absolute Jump" \
+ "Absolute Jump" ;# <-- NOT TRANSLATED YET
+ ##ID:001337##
+ mcset $l "Long Jump" \
+ "Long Jump" ;# <-- NOT TRANSLATED YET
+ ##ID:001338##
+ mcset $l "Short Jump (relative addr)" \
+ "Short Jump (relative addr)" ;# <-- NOT TRANSLATED YET
+ ##ID:001339##
+ mcset $l "Jump indirect relative to the DPTR" \
+ "Jump indirect relative to the DPTR" ;# <-- NOT TRANSLATED YET
+ ##ID:001340##
+ mcset $l "Jump if Accumulator is Zero" \
+ "Jump if Accumulator is Zero" ;# <-- NOT TRANSLATED YET
+ ##ID:001341##
+ mcset $l "Jump if Accumulator is Not Zero" \
+ "Jump if Accumulator is Not Zero" ;# <-- NOT TRANSLATED YET
+ ##ID:001342##
+ mcset $l "Compare direct byte to Acc and Jump if Not Equal" \
+ "Compare direct byte to Acc and Jump if Not Equal" ;# <-- NOT TRANSLATED YET
+ ##ID:001343##
+ mcset $l "Compare immediate to Acc and Jump if Not Equal" \
+ "Compare immediate to Acc and Jump if Not Equal" ;# <-- NOT TRANSLATED YET
+ ##ID:001344##
+ mcset $l "Compare immediate to register and Jump if Not Equal" \
+ "Compare immediate to register and Jump if Not Equal" ;# <-- NOT TRANSLATED YET
+ ##ID:001345##
+ mcset $l "Compare immediate to indirect and Jump if Not Equal" \
+ "Compare immediate to indirect and Jump if Not Equal" ;# <-- NOT TRANSLATED YET
+ ##ID:001346##
+ mcset $l "Decrement register and Jump if Not Zero" \
+ "Decrement register and Jump if Not Zero" ;# <-- NOT TRANSLATED YET
+ ##ID:001347##
+ mcset $l "Decrement direct byte and Jump if Not Zero" \
+ "Decrement direct byte and Jump if Not Zero" ;# <-- NOT TRANSLATED YET
+ ##ID:001348##
+ mcset $l "Program Branching" \
+ "Program Branching" ;# <-- NOT TRANSLATED YET
+ ##ID:001349##
+ mcset $l "No Operation" \
+ "No Operation" ;# <-- NOT TRANSLATED YET
+ ##ID:001350##
+ mcset $l "Data Transfer" \
+ "Data Transfer" ;# <-- NOT TRANSLATED YET
+ ##ID:001351##
+ mcset $l "Boolean Variable Manipulation" \
+ "Boolean Variable Manipulation" ;# <-- NOT TRANSLATED YET
+ ##ID:001352##
+ mcset $l "Read-Modify-Write" \
+ "Read-Modify-Write" ;# <-- NOT TRANSLATED YET
+ ##ID:001353##
+ mcset $l "Logical Operations" \
+ "Logical Operations" ;# <-- NOT TRANSLATED YET
+ ##ID:001354##
+ mcset $l "Arithmetic Operations" \
+ "Arithmetic Operations" ;# <-- NOT TRANSLATED YET
+}
+# messages.tcl
+# ==============================================================================
+namespace eval Messages {
+ ##ID:001355##
+ mcset $l "Copy selected text into clipboard" \
+ "Copy selected text into clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:001356##
+ mcset $l "Clear all messages" \
+ "Clear all messages" ;# <-- NOT TRANSLATED YET
+ ##ID:001357##
+ mcset $l "Select all text in this TextBox" \
+ "Select all text in this TextBox" ;# <-- NOT TRANSLATED YET
+ ##ID:001358##
+ mcset $l "Find next" \
+ "Find next" ;# <-- NOT TRANSLATED YET
+ ##ID:001359##
+ mcset $l "Find previous" \
+ "Find previous" ;# <-- NOT TRANSLATED YET
+ ##ID:001360##
+ mcset $l "Match case" \
+ "Match case" ;# <-- NOT TRANSLATED YET
+ ##ID:001361##
+ mcset $l "Find:" \
+ "Find:" ;# <-- NOT TRANSLATED YET
+ ##ID:001362##
+ mcset $l "Hide search bar" \
+ "Hide search bar" ;# <-- NOT TRANSLATED YET
+ ##ID:001363##
+ mcset $l "Find previous occurrence of search string" \
+ "Find previous occurrence of search string" ;# <-- NOT TRANSLATED YET
+ ##ID:001364##
+ mcset $l "Find next occurrence of search string" \
+ "Find next occurrence of search string" ;# <-- NOT TRANSLATED YET
+}
+# hexeditor.tcl
+# ==============================================================================
+namespace eval HexEditor {
+ ##ID:001365##
+ mcset $l "Select all" \
+ "Select all" ;# <-- NOT TRANSLATED YET
+ ##ID:001366##
+ mcset $l "Text to find" \
+ "Text to find" ;# <-- NOT TRANSLATED YET
+ ##ID:001367##
+ mcset $l "Where" \
+ "Where" ;# <-- NOT TRANSLATED YET
+ ##ID:001368##
+ mcset $l "Left view" \
+ "Left view" ;# <-- NOT TRANSLATED YET
+ ##ID:001369##
+ mcset $l "Right view" \
+ "Right view" ;# <-- NOT TRANSLATED YET
+ ##ID:001370##
+ mcset $l "Options" \
+ "Options" ;# <-- NOT TRANSLATED YET
+ ##ID:001371##
+ mcset $l "From cursor" \
+ "From cursor" ;# <-- NOT TRANSLATED YET
+ ##ID:001372##
+ mcset $l "Backwards" \
+ "Backwards" ;# <-- NOT TRANSLATED YET
+ ##ID:001373##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:001374##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:001375##
+ mcset $l "Find" \
+ "Find" ;# <-- NOT TRANSLATED YET
+ ##ID:001376##
+ mcset $l "String not found" \
+ "String not found" ;# <-- NOT TRANSLATED YET
+ ##ID:001377##
+ mcset $l "Search string '%s' not found !" \
+ "Search string '%s' not found !" ;# <-- NOT TRANSLATED YET
+}
+# cvarsview.tcl
+# ==============================================================================
+namespace eval CVarsView {
+ ##ID:001378##
+ mcset $l "Unable to read file\n'%s'" \
+ "Unable to read file\n'%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001379##
+ mcset $l "Permission denied" \
+ "Permission denied" ;# <-- NOT TRANSLATED YET
+ ##ID:001380##
+ mcset $l "Search:" \
+ "Search:" ;# <-- NOT TRANSLATED YET
+ ##ID:001381##
+ mcset $l {Value Level Data type Variable name} \
+ {Value Level Data type Variable name} ;# <-- NOT TRANSLATED YET
+ ##ID:001382##
+ mcset $l {Value Data type Variable name} \
+ {Value Data type Variable name} ;# <-- NOT TRANSLATED YET
+ ##ID:001383##
+ mcset $l "Global static scalar variables" \
+ "Global static scalar variables" ;# <-- NOT TRANSLATED YET
+ ##ID:001384##
+ mcset $l "Local static scalar variables" \
+ "Local static scalar variables" ;# <-- NOT TRANSLATED YET
+}
+# my_tk_messageBox.tcl
+# ==============================================================================
+namespace eval my_tk_messageBox {
+ ##ID:001385##
+ mcset $l "Abort" \
+ "Abort" ;# <-- NOT TRANSLATED YET
+ ##ID:001386##
+ mcset $l "Retry" \
+ "Retry" ;# <-- NOT TRANSLATED YET
+ ##ID:001387##
+ mcset $l "Ignore" \
+ "Ignore" ;# <-- NOT TRANSLATED YET
+ ##ID:001388##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:001389##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:001390##
+ mcset $l "Yes" \
+ "Yes" ;# <-- NOT TRANSLATED YET
+ ##ID:001391##
+ mcset $l "No" \
+ "No" ;# <-- NOT TRANSLATED YET
+}
+# tips.tcl
+# ==============================================================================
+namespace eval Tips {
+ ##ID:001392##
+ mcset $l "Did you know ... " \
+ "Did you know ... " ;# <-- NOT TRANSLATED YET
+ ##ID:001393##
+ mcset $l "Show tips on start-up" \
+ "Show tips on start-up" ;# <-- NOT TRANSLATED YET
+ ##ID:001394##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:001395##
+ mcset $l "Next" \
+ "Next" ;# <-- NOT TRANSLATED YET
+ ##ID:001396##
+ mcset $l "Previous" \
+ "Previous" ;# <-- NOT TRANSLATED YET
+ ##ID:001397##
+ mcset $l "Tip of the day - MCU 8051 IDE" \
+ "Tip of the day - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:001398##
+ mcset $l "Unable to open file containing tips,\nplease check your installation" \
+ "Unable to open file containing tips,\nplease check your installation" ;# <-- NOT TRANSLATED YET
+ ##ID:001399##
+ mcset $l "Unable to parse tips.xml" \
+ "Unable to parse tips.xml" ;# <-- NOT TRANSLATED YET
+ ##ID:001400##
+ mcset $l "File tips.xml is corrupted,\nplease check your installation" \
+ "File tips.xml is corrupted,\nplease check your installation" ;# <-- NOT TRANSLATED YET
+}
+# editor.tcl
+# ==============================================================================
+namespace eval Editor {
+ ##ID:001401##
+ mcset $l "LJMP this line" \
+ "LJMP this line" ;# <-- NOT TRANSLATED YET
+ ##ID:001402##
+ mcset $l "LCALL this line" \
+ "LCALL this line" ;# <-- NOT TRANSLATED YET
+ ##ID:001403##
+ mcset $l "Program jump" \
+ "Program jump" ;# <-- NOT TRANSLATED YET
+ ##ID:001404##
+ mcset $l "Call subprogram" \
+ "Call subprogram" ;# <-- NOT TRANSLATED YET
+ ##ID:001405##
+ mcset $l "Breakpoint" \
+ "Breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:001406##
+ mcset $l "Bookmark" \
+ "Bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:001407##
+ mcset $l "Add/Remove breakpoint to/from current line" \
+ "Add/Remove breakpoint to/from current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001408##
+ mcset $l "Add/Remove bookmark to/from current line" \
+ "Add/Remove bookmark to/from current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001409##
+ mcset $l "Uppercase" \
+ "Uppercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001410##
+ mcset $l "Lowercase" \
+ "Lowercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001411##
+ mcset $l "Capitalize" \
+ "Capitalize" ;# <-- NOT TRANSLATED YET
+ ##ID:001412##
+ mcset $l "Save file" \
+ "Save file" ;# <-- NOT TRANSLATED YET
+ ##ID:001413##
+ mcset $l "Save this file" \
+ "Save this file" ;# <-- NOT TRANSLATED YET
+ ##ID:001414##
+ mcset $l "Configure panel" \
+ "Configure panel" ;# <-- NOT TRANSLATED YET
+ ##ID:001415##
+ mcset $l "Invoke editor configuration dialog" \
+ "Invoke editor configuration dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:001416##
+ mcset $l "Hide this panel" \
+ "Hide this panel" ;# <-- NOT TRANSLATED YET
+ ##ID:001417##
+ mcset $l "Hide panel" \
+ "Hide panel" ;# <-- NOT TRANSLATED YET
+ ##ID:001418##
+ mcset $l "Split vertical" \
+ "Split vertical" ;# <-- NOT TRANSLATED YET
+ ##ID:001419##
+ mcset $l "Split the editor vertically" \
+ "Split the editor vertically" ;# <-- NOT TRANSLATED YET
+ ##ID:001420##
+ mcset $l "Split horizontal" \
+ "Split horizontal" ;# <-- NOT TRANSLATED YET
+ ##ID:001421##
+ mcset $l "Split the editor horizontally" \
+ "Split the editor horizontally" ;# <-- NOT TRANSLATED YET
+ ##ID:001422##
+ mcset $l "Close current view" \
+ "Close current view" ;# <-- NOT TRANSLATED YET
+ ##ID:001423##
+ mcset $l "Back" \
+ "Back" ;# <-- NOT TRANSLATED YET
+ ##ID:001424##
+ mcset $l "Go to previous file in the file list" \
+ "Go to previous file in the file list" ;# <-- NOT TRANSLATED YET
+ ##ID:001425##
+ mcset $l "Go to next file in the file list" \
+ "Go to next file in the file list" ;# <-- NOT TRANSLATED YET
+ ##ID:001426##
+ mcset $l "Forward" \
+ "Forward" ;# <-- NOT TRANSLATED YET
+ ##ID:001427##
+ mcset $l "Editor command line, type `help' for more" \
+ "Editor command line, type `help' for more" ;# <-- NOT TRANSLATED YET
+ ##ID:001428##
+ mcset $l "Icon border - click to add/remove bookmark" \
+ "Icon border - click to add/remove bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:001429##
+ mcset $l "Line numbers - click to add/remove breakpoint" \
+ "Line numbers - click to add/remove breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:001430##
+ mcset $l "Insertion mode" \
+ "Insertion mode" ;# <-- NOT TRANSLATED YET
+ ##ID:001431##
+ mcset $l "Insertion mode -- OVR == overwrite; INS == insert" \
+ "Insertion mode -- OVR == overwrite; INS == insert" ;# <-- NOT TRANSLATED YET
+ ##ID:001432##
+ mcset $l "INS" \
+ "INS" ;# <-- NOT TRANSLATED YET
+ ##ID:001433##
+ mcset $l "OVR" \
+ "OVR" ;# <-- NOT TRANSLATED YET
+ ##ID:001434##
+ mcset $l "Selection mode" \
+ "Selection mode" ;# <-- NOT TRANSLATED YET
+ ##ID:001435##
+ mcset $l "Selection mode -- BLK == block; NORM == normal" \
+ "Selection mode -- BLK == block; NORM == normal" ;# <-- NOT TRANSLATED YET
+ ##ID:001436##
+ mcset $l "NORM" \
+ "NORM" ;# <-- NOT TRANSLATED YET
+ ##ID:001437##
+ mcset $l "BLK" \
+ "BLK" ;# <-- NOT TRANSLATED YET
+ ##ID:001438##
+ mcset $l "Line:" \
+ "Line:" ;# <-- NOT TRANSLATED YET
+ ##ID:001439##
+ mcset $l " Column:" \
+ " Column:" ;# <-- NOT TRANSLATED YET
+ ##ID:001440##
+ mcset $l " Total:" \
+ " Total:" ;# <-- NOT TRANSLATED YET
+ ##ID:001441##
+ mcset $l "Editor status bar" \
+ "Editor status bar" ;# <-- NOT TRANSLATED YET
+ ##ID:001442##
+ mcset $l "Starting simulator" \
+ "Starting simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001443##
+ mcset $l "Simulator mode " \
+ "Simulator mode " ;# <-- NOT TRANSLATED YET
+ ##ID:001444##
+ mcset $l "Editor disabled" \
+ "Editor disabled" ;# <-- NOT TRANSLATED YET
+ ##ID:001445##
+ mcset $l "File has been modified, click to save" \
+ "File has been modified, click to save" ;# <-- NOT TRANSLATED YET
+ ##ID:001446##
+ mcset $l "Name of the current file or \"untitled\" if the file has not yet been saved under any name" \
+ "Name of the current file or \"untitled\" if the file has not yet been saved under any name" ;# <-- NOT TRANSLATED YET
+ ##ID:001447##
+ mcset $l "File type\n C/H\tC source / header\n ASM\tAssembly language\n LST\tCode listing\n ASX\tASX8051 assembler" \
+ "File type\n C/H\tC source / header\n ASM\tAssembly language\n LST\tCode listing\n ASX\tASX8051 assembler" ;# <-- NOT TRANSLATED YET
+ ##ID:001448##
+ mcset $l "File type" \
+ "File type" ;# <-- NOT TRANSLATED YET
+ ##ID:001449##
+ mcset $l "Invalid command" \
+ "Invalid command" ;# <-- NOT TRANSLATED YET
+ ##ID:001450##
+ mcset $l "Ambiguous command" \
+ "Ambiguous command" ;# <-- NOT TRANSLATED YET
+ ##ID:001451##
+ mcset $l "This MCU cannot have connected external data memory" \
+ "This MCU cannot have connected external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:001452##
+ mcset $l "This MCU cannot have connected external program memory" \
+ "This MCU cannot have connected external program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:001453##
+ mcset $l "EDITOR COMMAND LINE: invalid command, type `help list' to get list of available commands" \
+ "EDITOR COMMAND LINE: invalid command, type `help list' to get list of available commands" ;# <-- NOT TRANSLATED YET
+ ##ID:001454##
+ mcset $l "EDITOR COMMAND LINE: wrong # args (command: %s)" \
+ "EDITOR COMMAND LINE: wrong # args (command: %s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001455##
+ mcset $l "EDITOR COMMAND LINE: This command takes no arguments" \
+ "EDITOR COMMAND LINE: This command takes no arguments" ;# <-- NOT TRANSLATED YET
+ ##ID:001456##
+ mcset $l "EDITOR COMMAND LINE: Invalid number format" \
+ "EDITOR COMMAND LINE: Invalid number format" ;# <-- NOT TRANSLATED YET
+ ##ID:001457##
+ mcset $l "EDITOR COMMAND LINE: This command requires exactly one argument" \
+ "EDITOR COMMAND LINE: This command requires exactly one argument" ;# <-- NOT TRANSLATED YET
+ ##ID:001458##
+ mcset $l "EDITOR COMMAND LINE: Unknown command: `%s'" \
+ "EDITOR COMMAND LINE: Unknown command: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001459##
+ mcset $l "EDITOR COMMAND LINE: Unsupported processor `%s'" \
+ "EDITOR COMMAND LINE: Unsupported processor `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001460##
+ mcset $l "EDITOR COMMAND LINE: Expected integer but got `%s' (command: %s)" \
+ "EDITOR COMMAND LINE: Expected integer but got `%s' (command: %s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001461##
+ mcset $l "EDITOR COMMAND LINE: This MCU has XDATA memory limit 0x10000 B (65536) (command: %s)" \
+ "EDITOR COMMAND LINE: This MCU has XDATA memory limit 0x10000 B (65536) (command: %s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001462##
+ mcset $l "EDITOR COMMAND LINE: This MCU has CODE memory limit 0x10000 B (65536) (command: %s)" \
+ "EDITOR COMMAND LINE: This MCU has CODE memory limit 0x10000 B (65536) (command: %s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001463##
+ mcset $l "EDITOR COMMAND LINE: Invalid format string" \
+ "EDITOR COMMAND LINE: Invalid format string" ;# <-- NOT TRANSLATED YET
+ ##ID:001464##
+ mcset $l "EDITOR COMMAND LINE: syntax error: expected integer (command: %s)" \
+ "EDITOR COMMAND LINE: syntax error: expected integer (command: %s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001465##
+ mcset $l "Target line out of range" \
+ "Target line out of range" ;# <-- NOT TRANSLATED YET
+ ##ID:001466##
+ mcset $l "Invalid option: %s" \
+ "Invalid option: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001467##
+ mcset $l "String not found: %s" \
+ "String not found: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001468##
+ mcset $l "Found %s occurrences" \
+ "Found %s occurrences" ;# <-- NOT TRANSLATED YET
+ ##ID:001469##
+ mcset $l "Success" \
+ "Success" ;# <-- NOT TRANSLATED YET
+ ##ID:001470##
+ mcset $l "Help" \
+ "Help" ;# <-- NOT TRANSLATED YET
+ ##ID:001471##
+ mcset $l "This is MCU 8051 IDE command line\n\nusage: <b>command \[arguments\]</b>\n\nEnter <b>help list</b> for list of available commands or\n<b>help <STRING command></b> for help for individual command" \
+ "This is MCU 8051 IDE command line\n\nusage: <b>command \[arguments\]</b>\n\nEnter <b>help list</b> for list of available commands or\n<b>help <STRING command></b> for help for individual command" ;# <-- NOT TRANSLATED YET
+ ##ID:001472##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:001473##
+ mcset $l "Close this window" \
+ "Close this window" ;# <-- NOT TRANSLATED YET
+ ##ID:001474##
+ mcset $l "Replace: %s replacements made" \
+ "Replace: %s replacements made" ;# <-- NOT TRANSLATED YET
+ ##ID:001475##
+ mcset $l "Finishing highlight" \
+ "Finishing highlight" ;# <-- NOT TRANSLATED YET
+ ##ID:001476##
+ mcset $l "Invalid list of bookmarks -- bookmarks discarded" \
+ "Invalid list of bookmarks -- bookmarks discarded" ;# <-- NOT TRANSLATED YET
+ ##ID:001477##
+ mcset $l "Invalid list of breakpoints -- bookmarks discarded" \
+ "Invalid list of breakpoints -- bookmarks discarded" ;# <-- NOT TRANSLATED YET
+ ##ID:001478##
+ mcset $l "File switching locked" \
+ "File switching locked" ;# <-- NOT TRANSLATED YET
+ ##ID:001479##
+ mcset $l "File switching unlocked" \
+ "File switching unlocked" ;# <-- NOT TRANSLATED YET
+ ##ID:001480##
+ mcset $l "Lock file switching" \
+ "Lock file switching" ;# <-- NOT TRANSLATED YET
+ ##ID:001481##
+ mcset $l "Unlock file switching" \
+ "Unlock file switching" ;# <-- NOT TRANSLATED YET
+ ##ID:001482##
+ mcset $l "Unable to open file:\n\"%s\"\nfor writing" \
+ "Unable to open file:\n\"%s\"\nfor writing" ;# <-- NOT TRANSLATED YET
+ ##ID:001483##
+ mcset $l "File %s saved" \
+ "File %s saved" ;# <-- NOT TRANSLATED YET
+ ##ID:001484##
+ mcset $l "Unable to execute: nothing selected" \
+ "Unable to execute: nothing selected" ;# <-- NOT TRANSLATED YET
+ ##ID:001485##
+ mcset $l "FATAL ERROR" \
+ "FATAL ERROR" ;# <-- NOT TRANSLATED YET
+ ##ID:001486##
+ mcset $l "Unable to start embedded editor due to an unknown error. This error did not occurred in MCU 8051 IDE code but somewhere else. Please try to restart MCU 8051 IDE with --reset-user-settings" \
+ "Unable to start embedded editor due to an unknown error. This error did not occurred in MCU 8051 IDE code but somewhere else. Please try to restart MCU 8051 IDE with --reset-user-settings" ;# <-- NOT TRANSLATED YET
+ ##ID:001487##
+ mcset $l "No function to document" \
+ "No function to document" ;# <-- NOT TRANSLATED YET
+ ##ID:001488##
+ mcset $l "Read-only project" \
+ "Read-only project" ;# <-- NOT TRANSLATED YET
+ ##ID:001489##
+ mcset $l "This project has a special purpose, modifications to this project are not allowed." \
+ "This project has a special purpose, modifications to this project are not allowed." ;# <-- NOT TRANSLATED YET
+ ##ID:001490##
+ mcset $l "This editor is only for reading, to change that press alt+v and o" \
+ "This editor is only for reading, to change that press alt+v and o" ;# <-- NOT TRANSLATED YET
+ ##ID:001491##
+ mcset $l " READ ONLY " \
+ " READ ONLY " ;# <-- NOT TRANSLATED YET
+ ##ID:001492##
+ mcset $l "available commands" \
+ "available commands" ;# <-- NOT TRANSLATED YET
+ ##ID:001493##
+ mcset $l "DEC -> HEX" \
+ "DEC -> HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:001494##
+ mcset $l "DEC -> OCT" \
+ "DEC -> OCT" ;# <-- NOT TRANSLATED YET
+ ##ID:001495##
+ mcset $l "DEC -> BIN" \
+ "DEC -> BIN" ;# <-- NOT TRANSLATED YET
+ ##ID:001496##
+ mcset $l "HEX -> DEC" \
+ "HEX -> DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:001497##
+ mcset $l "HEX -> OCT" \
+ "HEX -> OCT" ;# <-- NOT TRANSLATED YET
+ ##ID:001498##
+ mcset $l "HEX -> BIN" \
+ "HEX -> BIN" ;# <-- NOT TRANSLATED YET
+ ##ID:001499##
+ mcset $l "OCT -> HEX" \
+ "OCT -> HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:001500##
+ mcset $l "OCT -> DEC" \
+ "OCT -> DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:001501##
+ mcset $l "OCT -> BIN" \
+ "OCT -> BIN" ;# <-- NOT TRANSLATED YET
+ ##ID:001502##
+ mcset $l "BIN -> HEX" \
+ "BIN -> HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:001503##
+ mcset $l "BIN -> DEC" \
+ "BIN -> DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:001504##
+ mcset $l "BIN -> OCT" \
+ "BIN -> OCT" ;# <-- NOT TRANSLATED YET
+ ##ID:001505##
+ mcset $l "Animate program" \
+ "Animate program" ;# <-- NOT TRANSLATED YET
+ ##ID:001506##
+ mcset $l "Compile current file" \
+ "Compile current file" ;# <-- NOT TRANSLATED YET
+ ##ID:001507##
+ mcset $l "Reformat code" \
+ "Reformat code" ;# <-- NOT TRANSLATED YET
+ ##ID:001508##
+ mcset $l "Bookmark current line" \
+ "Bookmark current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001509##
+ mcset $l "Add/Remove breakpoint" \
+ "Add/Remove breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:001510##
+ mcset $l "Capitalize selection" \
+ "Capitalize selection" ;# <-- NOT TRANSLATED YET
+ ##ID:001511##
+ mcset $l "Clear history" \
+ "Clear history" ;# <-- NOT TRANSLATED YET
+ ##ID:001512##
+ mcset $l "Comment selected text" \
+ "Comment selected text" ;# <-- NOT TRANSLATED YET
+ ##ID:001513##
+ mcset $l "Copy selection" \
+ "Copy selection" ;# <-- NOT TRANSLATED YET
+ ##ID:001514##
+ mcset $l "Custom command" \
+ "Custom command" ;# <-- NOT TRANSLATED YET
+ ##ID:001515##
+ mcset $l "Cut selection" \
+ "Cut selection" ;# <-- NOT TRANSLATED YET
+ ##ID:001516##
+ mcset $l "Insert date" \
+ "Insert date" ;# <-- NOT TRANSLATED YET
+ ##ID:001517##
+ mcset $l "Exit command line" \
+ "Exit command line" ;# <-- NOT TRANSLATED YET
+ ##ID:001518##
+ mcset $l "Exit program" \
+ "Exit program" ;# <-- NOT TRANSLATED YET
+ ##ID:001519##
+ mcset $l "Find string" \
+ "Find string" ;# <-- NOT TRANSLATED YET
+ ##ID:001520##
+ mcset $l "Go to line" \
+ "Go to line" ;# <-- NOT TRANSLATED YET
+ ##ID:001521##
+ mcset $l "Insert literal character" \
+ "Insert literal character" ;# <-- NOT TRANSLATED YET
+ ##ID:001522##
+ mcset $l "Indent selection" \
+ "Indent selection" ;# <-- NOT TRANSLATED YET
+ ##ID:001523##
+ mcset $l "Remove current line" \
+ "Remove current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001524##
+ mcset $l "Open file" \
+ "Open file" ;# <-- NOT TRANSLATED YET
+ ##ID:001525##
+ mcset $l "Paste clipboard" \
+ "Paste clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:001526##
+ mcset $l "Take back last undo" \
+ "Take back last undo" ;# <-- NOT TRANSLATED YET
+ ##ID:001527##
+ mcset $l "Reload current document" \
+ "Reload current document" ;# <-- NOT TRANSLATED YET
+ ##ID:001528##
+ mcset $l "Replace strings" \
+ "Replace strings" ;# <-- NOT TRANSLATED YET
+ ##ID:001529##
+ mcset $l "Run simulation" \
+ "Run simulation" ;# <-- NOT TRANSLATED YET
+ ##ID:001530##
+ mcset $l "Save current line" \
+ "Save current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001531##
+ mcset $l "Show/Hide icon border" \
+ "Show/Hide icon border" ;# <-- NOT TRANSLATED YET
+ ##ID:001532##
+ mcset $l "Show/Hide line n. bar" \
+ "Show/Hide line n. bar" ;# <-- NOT TRANSLATED YET
+ ##ID:001533##
+ mcset $l "Start/Stop simulator" \
+ "Start/Stop simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001534##
+ mcset $l "Step program" \
+ "Step program" ;# <-- NOT TRANSLATED YET
+ ##ID:001535##
+ mcset $l "To lowercase" \
+ "To lowercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001536##
+ mcset $l "To uppercase" \
+ "To uppercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001537##
+ mcset $l "Uncomment selection" \
+ "Uncomment selection" ;# <-- NOT TRANSLATED YET
+ ##ID:001538##
+ mcset $l "Take back last operation" \
+ "Take back last operation" ;# <-- NOT TRANSLATED YET
+ ##ID:001539##
+ mcset $l "Unindent selection" \
+ "Unindent selection" ;# <-- NOT TRANSLATED YET
+ ##ID:001540##
+ mcset $l "Hibernate running program" \
+ "Hibernate running program" ;# <-- NOT TRANSLATED YET
+ ##ID:001541##
+ mcset $l "Resume hibernated program" \
+ "Resume hibernated program" ;# <-- NOT TRANSLATED YET
+ ##ID:001542##
+ mcset $l "Change current MCU" \
+ "Change current MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:001543##
+ mcset $l "Set XCODE memory size for current MCU" \
+ "Set XCODE memory size for current MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:001544##
+ mcset $l "SET XDATA memory size for current MCU" \
+ "SET XDATA memory size for current MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:001545##
+ mcset $l "Available commands" \
+ "Available commands" ;# <-- NOT TRANSLATED YET
+ ##ID:001546##
+ mcset $l "Command hibernate" \
+ "Command hibernate" ;# <-- NOT TRANSLATED YET
+ ##ID:001547##
+ mcset $l "<b>hibernate</b> \[<STRING target-file>\]\nHibernate running program (available only when simulator is stated).\n\nThis function saves current state of the simulator engine for future resumption. If no target is not specified it will invoke file selection dialog" \
+ "<b>hibernate</b> \[<STRING target-file>\]\nHibernate running program (available only when simulator is stated).\n\nThis function saves current state of the simulator engine for future resumption. If no target is not specified it will invoke file selection dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:001548##
+ mcset $l "Command resume" \
+ "Command resume" ;# <-- NOT TRANSLATED YET
+ ##ID:001549##
+ mcset $l "<b>resume</b> \[<STRING source-file>\]\nResume hibernated program (available only when simulator is stated).\n\nThis function restores previous state of the simulator engine stored in the given file. If no source is not specified it will invoke file selection dialog" \
+ "<b>resume</b> \[<STRING source-file>\]\nResume hibernated program (available only when simulator is stated).\n\nThis function restores previous state of the simulator engine stored in the given file. If no source is not specified it will invoke file selection dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:001550##
+ mcset $l "Command switch-mcu" \
+ "Command switch-mcu" ;# <-- NOT TRANSLATED YET
+ ##ID:001551##
+ mcset $l "<b>switch-mcu</b> <STRING processor-type>\nChange current MCU. Type `switch-mcu list' for list of supported microcontrollers" \
+ "<b>switch-mcu</b> <STRING processor-type>\nChange current MCU. Type `switch-mcu list' for list of supported microcontrollers" ;# <-- NOT TRANSLATED YET
+ ##ID:001552##
+ mcset $l "Command set-xcode" \
+ "Command set-xcode" ;# <-- NOT TRANSLATED YET
+ ##ID:001553##
+ mcset $l "<b>set-xcode</b> <INT size>\nChange capacity of external program memory.\nNote: this command also close CODE memory hex editor" \
+ "<b>set-xcode</b> <INT size>\nChange capacity of external program memory.\nNote: this command also close CODE memory hex editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001554##
+ mcset $l "Command set-xdata" \
+ "Command set-xdata" ;# <-- NOT TRANSLATED YET
+ ##ID:001555##
+ mcset $l "<b>set-xdata</b> <INT size>\nChange capacity of external data memory.\nNote: this command also close XDATA memory hex editor" \
+ "<b>set-xdata</b> <INT size>\nChange capacity of external data memory.\nNote: this command also close XDATA memory hex editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001556##
+ mcset $l "Command run" \
+ "Command run" ;# <-- NOT TRANSLATED YET
+ ##ID:001557##
+ mcset $l "Run simulation (available only when simulator is stated)" \
+ "Run simulation (available only when simulator is stated)" ;# <-- NOT TRANSLATED YET
+ ##ID:001558##
+ mcset $l "Command exit" \
+ "Command exit" ;# <-- NOT TRANSLATED YET
+ ##ID:001559##
+ mcset $l "Exits this command line" \
+ "Exits this command line" ;# <-- NOT TRANSLATED YET
+ ##ID:001560##
+ mcset $l "Command exit-program" \
+ "Command exit-program" ;# <-- NOT TRANSLATED YET
+ ##ID:001561##
+ mcset $l "Quit MCU 8051 IDE" \
+ "Quit MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:001562##
+ mcset $l "Command set-icon-border" \
+ "Command set-icon-border" ;# <-- NOT TRANSLATED YET
+ ##ID:001563##
+ mcset $l "Sets the visibility of the icon border" \
+ "Sets the visibility of the icon border" ;# <-- NOT TRANSLATED YET
+ ##ID:001564##
+ mcset $l "Command set-line-numbers" \
+ "Command set-line-numbers" ;# <-- NOT TRANSLATED YET
+ ##ID:001565##
+ mcset $l "Sets the visibility of the line numbers." \
+ "Sets the visibility of the line numbers." ;# <-- NOT TRANSLATED YET
+ ##ID:001566##
+ mcset $l "Command help" \
+ "Command help" ;# <-- NOT TRANSLATED YET
+ ##ID:001567##
+ mcset $l "<b>help</b> <STRING command>\nShows help for the given command\n\n<b>help list</b>\nShows list of available command" \
+ "<b>help</b> <STRING command>\nShows help for the given command\n\n<b>help list</b>\nShows list of available command" ;# <-- NOT TRANSLATED YET
+ ##ID:001568##
+ mcset $l "Command open" \
+ "Command open" ;# <-- NOT TRANSLATED YET
+ ##ID:001569##
+ mcset $l "<b>open</b> <STRING full_filename>\nOpens the given file in new editor" \
+ "<b>open</b> <STRING full_filename>\nOpens the given file in new editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001570##
+ mcset $l "Command indent" \
+ "Command indent" ;# <-- NOT TRANSLATED YET
+ ##ID:001571##
+ mcset $l "Indents current line or selected area" \
+ "Indents current line or selected area" ;# <-- NOT TRANSLATED YET
+ ##ID:001572##
+ mcset $l "Command unindent" \
+ "Command unindent" ;# <-- NOT TRANSLATED YET
+ ##ID:001573##
+ mcset $l "Unindents current line or selected area" \
+ "Unindents current line or selected area" ;# <-- NOT TRANSLATED YET
+ ##ID:001574##
+ mcset $l "Command comment" \
+ "Command comment" ;# <-- NOT TRANSLATED YET
+ ##ID:001575##
+ mcset $l "Comments current line or selected area" \
+ "Comments current line or selected area" ;# <-- NOT TRANSLATED YET
+ ##ID:001576##
+ mcset $l "Command uncomment" \
+ "Command uncomment" ;# <-- NOT TRANSLATED YET
+ ##ID:001577##
+ mcset $l "Uncomments current line or selected area" \
+ "Uncomments current line or selected area" ;# <-- NOT TRANSLATED YET
+ ##ID:001578##
+ mcset $l "Command kill-line" \
+ "Command kill-line" ;# <-- NOT TRANSLATED YET
+ ##ID:001579##
+ mcset $l "Removes the current line" \
+ "Removes the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001580##
+ mcset $l "Command date" \
+ "Command date" ;# <-- NOT TRANSLATED YET
+ ##ID:001581##
+ mcset $l "<b>date</b> <STRING format>\nInserts formatted date at the current position in text\n\n<b>Format string:</b>\n%% => %\n%a => Weekday name (Mon, Tue, etc.)\n%A => Weekday name (Monday, Tuesday, etc.)\n%b => Month name (Jan, Feb, etc.)\n%B => Full month name\n%C => Year (19 or 20)\n%d => Day of month (01 - 31)\n%D => %m/%d/%y\n%h => Abbreviated month name.\n%H => Hour (00 - 23)\n%I => Hour (01 - 12)\n%j => Day of year (001 - 366)\n%k => Hour (0 - 23)\n%l => Hour (1 - 12).\n%m => Month (01 - 12)\n%M => Minute (00 - 59)\n%n => Newline\n%p => AM/PM\n%R => %H:%M.\n%s => Unix timestamp\n%S => Seconds (00 - 59)\n%t => Tab\n%T => %H:%M:%S.\n%u => Weekday number (Monday = 1, Sunday = 7)\n%w => Weekday number (Sunday = 0, Saturday = 6)\n%y => Year without century (00 - 99)\n%Y => Year with century (e.g. 1459)" \
+ "<b>date</b> <STRING format>\nInserts formatted date at the current position in text\n\n<b>Format string:</b>\n%% => %\n%a => Weekday name (Mon, Tue, etc.)\n%A => Weekday name (Monday, Tuesday, etc.)\n%b => Month name (Jan, Feb, etc.)\n%B => Full month name\n%C => Year (19 or 20)\n%d => Day of month (01 - 31)\n%D => %m/%d/%y\n%h => Abbreviated month name.\n%H => Hour (00 - 23)\n%I => Hour (01 - 12)\n%j => Day of year (001 - 366)\n%k => Hour (0 - 23)\n%l => Hour (1 - 12).\n%m => Month (01 - 12)\n%M => Minute (00 - 59)\n%n => Newline\n%p => AM/PM\n%R => %H:%M.\n%s => Unix timestamp\n%S => Seconds (00 - 59)\n%t => Tab\n%T => %H:%M:%S.\n%u => Weekday number (Monday = 1, Sunday = 7)\n%w => Weekday number (Sunday = 0, Saturday = 6)\n%y => Year without century (00 - 99)\n%Y => Year with century (e.g. 1459)" ;# <-- NOT TRANSLATED YET
+ ##ID:001582##
+ mcset $l "Command clear" \
+ "Command clear" ;# <-- NOT TRANSLATED YET
+ ##ID:001583##
+ mcset $l "Clears command line history" \
+ "Clears command line history" ;# <-- NOT TRANSLATED YET
+ ##ID:001584##
+ mcset $l "Command char" \
+ "Command char" ;# <-- NOT TRANSLATED YET
+ ##ID:001585##
+ mcset $l "<b>char</b> <NUMBER identifier>\nInserts literal characters by their numerical identifier.\nIdentifier can be in decimal hexadecimal or octal form." \
+ "<b>char</b> <NUMBER identifier>\nInserts literal characters by their numerical identifier.\nIdentifier can be in decimal hexadecimal or octal form." ;# <-- NOT TRANSLATED YET
+ ##ID:001586##
+ mcset $l "Command goto" \
+ "Command goto" ;# <-- NOT TRANSLATED YET
+ ##ID:001587##
+ mcset $l "<b>goto</b> <INT line>\nGo to the given line" \
+ "<b>goto</b> <INT line>\nGo to the given line" ;# <-- NOT TRANSLATED YET
+ ##ID:001588##
+ mcset $l "Command replace" \
+ "Command replace" ;# <-- NOT TRANSLATED YET
+ ##ID:001589##
+ mcset $l "<b>replace\[:options\]</b> <STRING pattern> <STRING replacement>\n\n<b>options:</b>\nb Search backwards\nc Search from cursor position\nr Regular expression search\ns Case sensitive search\np Ask before replacement" \
+ "<b>replace\[:options\]</b> <STRING pattern> <STRING replacement>\n\n<b>options:</b>\nb Search backwards\nc Search from cursor position\nr Regular expression search\ns Case sensitive search\np Ask before replacement" ;# <-- NOT TRANSLATED YET
+ ##ID:001590##
+ mcset $l "Command find" \
+ "Command find" ;# <-- NOT TRANSLATED YET
+ ##ID:001591##
+ mcset $l "<b>find\[:options\]</b> <STRING pattern>\n\n<b>options:</b>\nb Search backwards\nc Search from cursor position\ne Search in the selection only\nr Regular expression search\ns Case sensitive search" \
+ "<b>find\[:options\]</b> <STRING pattern>\n\n<b>options:</b>\nb Search backwards\nc Search from cursor position\ne Search in the selection only\nr Regular expression search\ns Case sensitive search" ;# <-- NOT TRANSLATED YET
+ ##ID:001592##
+ mcset $l "Command cut" \
+ "Command cut" ;# <-- NOT TRANSLATED YET
+ ##ID:001593##
+ mcset $l "Cut selected text" \
+ "Cut selected text" ;# <-- NOT TRANSLATED YET
+ ##ID:001594##
+ mcset $l "Command copy" \
+ "Command copy" ;# <-- NOT TRANSLATED YET
+ ##ID:001595##
+ mcset $l "Copy selected text to clipboard" \
+ "Copy selected text to clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:001596##
+ mcset $l "Command paste" \
+ "Command paste" ;# <-- NOT TRANSLATED YET
+ ##ID:001597##
+ mcset $l "Paste clipboard content" \
+ "Paste clipboard content" ;# <-- NOT TRANSLATED YET
+ ##ID:001598##
+ mcset $l "Command tolower" \
+ "Command tolower" ;# <-- NOT TRANSLATED YET
+ ##ID:001599##
+ mcset $l "Convert selected text to lowercase" \
+ "Convert selected text to lowercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001600##
+ mcset $l "Command toupper" \
+ "Command toupper" ;# <-- NOT TRANSLATED YET
+ ##ID:001601##
+ mcset $l "Convert selected text to uppercase" \
+ "Convert selected text to uppercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001602##
+ mcset $l "Command capitalize" \
+ "Command capitalize" ;# <-- NOT TRANSLATED YET
+ ##ID:001603##
+ mcset $l "Capitalize the selected text (convert 1st character to uppercase)" \
+ "Capitalize the selected text (convert 1st character to uppercase)" ;# <-- NOT TRANSLATED YET
+ ##ID:001604##
+ mcset $l "Command save" \
+ "Command save" ;# <-- NOT TRANSLATED YET
+ ##ID:001605##
+ mcset $l "Save the current document" \
+ "Save the current document" ;# <-- NOT TRANSLATED YET
+ ##ID:001606##
+ mcset $l "Command bookmark" \
+ "Command bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:001607##
+ mcset $l "Bookmark the current line" \
+ "Bookmark the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001608##
+ mcset $l "Command custom" \
+ "Command custom" ;# <-- NOT TRANSLATED YET
+ ##ID:001609##
+ mcset $l "<b>custom</b> <INT command_number>\nExecute custom command (see menu Configuration -> Custom commands)" \
+ "<b>custom</b> <INT command_number>\nExecute custom command (see menu Configuration -> Custom commands)" ;# <-- NOT TRANSLATED YET
+ ##ID:001610##
+ mcset $l "Command breakpoint" \
+ "Command breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:001611##
+ mcset $l "Add / Remove breakpoint to the current line" \
+ "Add / Remove breakpoint to the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001612##
+ mcset $l "Command undo" \
+ "Command undo" ;# <-- NOT TRANSLATED YET
+ ##ID:001613##
+ mcset $l "Command redo" \
+ "Command redo" ;# <-- NOT TRANSLATED YET
+ ##ID:001614##
+ mcset $l "Command auto-indent" \
+ "Command auto-indent" ;# <-- NOT TRANSLATED YET
+ ##ID:001615##
+ mcset $l "Command reload" \
+ "Command reload" ;# <-- NOT TRANSLATED YET
+ ##ID:001616##
+ mcset $l "Reload the current document" \
+ "Reload the current document" ;# <-- NOT TRANSLATED YET
+ ##ID:001617##
+ mcset $l "Command assemble" \
+ "Command assemble" ;# <-- NOT TRANSLATED YET
+ ##ID:001618##
+ mcset $l "Compile the current document" \
+ "Compile the current document" ;# <-- NOT TRANSLATED YET
+ ##ID:001619##
+ mcset $l "Command sim" \
+ "Command sim" ;# <-- NOT TRANSLATED YET
+ ##ID:001620##
+ mcset $l "Start / Stop simulator" \
+ "Start / Stop simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001621##
+ mcset $l "Command step" \
+ "Command step" ;# <-- NOT TRANSLATED YET
+ ##ID:001622##
+ mcset $l "Step program (available only when simulator is stated)" \
+ "Step program (available only when simulator is stated)" ;# <-- NOT TRANSLATED YET
+ ##ID:001623##
+ mcset $l "Command animate" \
+ "Command animate" ;# <-- NOT TRANSLATED YET
+ ##ID:001624##
+ mcset $l "Animate program (available only when simulator is stated)" \
+ "Animate program (available only when simulator is stated)" ;# <-- NOT TRANSLATED YET
+ ##ID:001625##
+ mcset $l "Command d2h" \
+ "Command d2h" ;# <-- NOT TRANSLATED YET
+ ##ID:001626##
+ mcset $l "Convert decimal number to hexadecimal and write result to editor" \
+ "Convert decimal number to hexadecimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001627##
+ mcset $l "Command d2o" \
+ "Command d2o" ;# <-- NOT TRANSLATED YET
+ ##ID:001628##
+ mcset $l "Convert decimal number to octal and write result to editor" \
+ "Convert decimal number to octal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001629##
+ mcset $l "Command d2b" \
+ "Command d2b" ;# <-- NOT TRANSLATED YET
+ ##ID:001630##
+ mcset $l "Convert decimal number to binary and write result to editor" \
+ "Convert decimal number to binary and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001631##
+ mcset $l "Command h2d" \
+ "Command h2d" ;# <-- NOT TRANSLATED YET
+ ##ID:001632##
+ mcset $l "Convert hexadecimal number to decimal and write result to editor" \
+ "Convert hexadecimal number to decimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001633##
+ mcset $l "Command h2o" \
+ "Command h2o" ;# <-- NOT TRANSLATED YET
+ ##ID:001634##
+ mcset $l "Convert hexadecimal number to octal and write result to editor" \
+ "Convert hexadecimal number to octal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001635##
+ mcset $l "Command h2b" \
+ "Command h2b" ;# <-- NOT TRANSLATED YET
+ ##ID:001636##
+ mcset $l "Convert hexadecimal number to binary and write result to editor" \
+ "Convert hexadecimal number to binary and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001637##
+ mcset $l "Command o2h" \
+ "Command o2h" ;# <-- NOT TRANSLATED YET
+ ##ID:001638##
+ mcset $l "Convert octal number to hexadecimal and write result to editor" \
+ "Convert octal number to hexadecimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001639##
+ mcset $l "Command o2d" \
+ "Command o2d" ;# <-- NOT TRANSLATED YET
+ ##ID:001640##
+ mcset $l "Convert octal number to decimal and write result to editor" \
+ "Convert octal number to decimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001641##
+ mcset $l "Command o2b" \
+ "Command o2b" ;# <-- NOT TRANSLATED YET
+ ##ID:001642##
+ mcset $l "Convert octal number to binary and write result to editor" \
+ "Convert octal number to binary and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001643##
+ mcset $l "Command b2h" \
+ "Command b2h" ;# <-- NOT TRANSLATED YET
+ ##ID:001644##
+ mcset $l "Convert binary number to hexadecimal and write result to editor" \
+ "Convert binary number to hexadecimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001645##
+ mcset $l "Command b2d" \
+ "Command b2d" ;# <-- NOT TRANSLATED YET
+ ##ID:001646##
+ mcset $l "Convert binary number to decimal and write result to editor" \
+ "Convert binary number to decimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001647##
+ mcset $l "Command b2o" \
+ "Command b2o" ;# <-- NOT TRANSLATED YET
+ ##ID:001648##
+ mcset $l "Convert binary number to octal and write result to editor" \
+ "Convert binary number to octal and write result to editor" ;# <-- NOT TRANSLATED YET
+}
+# compiler.tcl
+# ==============================================================================
+namespace eval Compiler {
+ ##ID:001649##
+ mcset $l "%s errors, %s warnings" \
+ "%s errors, %s warnings" ;# <-- NOT TRANSLATED YET
+ ##ID:001650##
+ mcset $l "Unable to open the specified file. (%s)" \
+ "Unable to open the specified file. (%s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001651##
+ mcset $l "Unable to open the specified file. (\033\[34;1m%s\033\[m)" \
+ "Unable to open the specified file. (\033\[34;1m%s\033\[m)" ;# <-- NOT TRANSLATED YET
+ ##ID:001652##
+ mcset $l "Compilation FAILED !" \
+ "Compilation FAILED !" ;# <-- NOT TRANSLATED YET
+ ##ID:001653##
+ mcset $l "\033\[31;1mCompilation FAILED !\033\[m" \
+ "\033\[31;1mCompilation FAILED !\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001654##
+ mcset $l "Compiling file: %s" \
+ "Compiling file: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001655##
+ mcset $l "Compiling file: \033\[34;1m%s\033\[m" \
+ "Compiling file: \033\[34;1m%s\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001656##
+ mcset $l "Initializing pre-processor ..." \
+ "Initializing pre-processor ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001657##
+ mcset $l "Pre-processing FAILED !" \
+ "Pre-processing FAILED !" ;# <-- NOT TRANSLATED YET
+ ##ID:001658##
+ mcset $l "\033\[31;1mPre-processing FAILED !\033\[m" \
+ "\033\[31;1mPre-processing FAILED !\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001659##
+ mcset $l "Compiling ..." \
+ "Compiling ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001660##
+ mcset $l "Creating IHEX8 ...\t\t\t-> \"%s\"" \
+ "Creating IHEX8 ...\t\t\t-> \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001661##
+ mcset $l "Creating IHEX8 ...\t\t\t-> \"\033\[34;1m%s\033\[m\"" \
+ "Creating IHEX8 ...\t\t\t-> \"\033\[34;1m%s\033\[m\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001662##
+ mcset $l "Error: Unable to open file \"%s\" for writing" \
+ "Error: Unable to open file \"%s\" for writing" ;# <-- NOT TRANSLATED YET
+ ##ID:001663##
+ mcset $l "\033\[31;1mError\033\[m: Unable to open file \"\033\[34;1m%s\033\[m\" for writing" \
+ "\033\[31;1mError\033\[m: Unable to open file \"\033\[34;1m%s\033\[m\" for writing" ;# <-- NOT TRANSLATED YET
+ ##ID:001664##
+ mcset $l "Creating object file ...\t\t-> \"%s\"" \
+ "Creating object file ...\t\t-> \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001665##
+ mcset $l "Creating object file ...\t\t-> \"\033\[34;1m%s\033\[m\"" \
+ "Creating object file ...\t\t-> \"\033\[34;1m%s\033\[m\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001666##
+ mcset $l "Creating assembler debug file ...\t-> \"%s\"" \
+ "Creating assembler debug file ...\t-> \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001667##
+ mcset $l "Creating simulator data file ...\t-> \"\033\[34;1m%s\033\[m\"" \
+ "Creating simulator data file ...\t-> \"\033\[34;1m%s\033\[m\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001668##
+ mcset $l "Number of optimization performed: %s" \
+ "Number of optimization performed: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001669##
+ mcset $l "Number of optimization performed: \033\[1m%s\033\[m" \
+ "Number of optimization performed: \033\[1m%s\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001670##
+ mcset $l "Compilation successful. (time: %s sec.)" \
+ "Compilation successful. (time: %s sec.)" ;# <-- NOT TRANSLATED YET
+ ##ID:001671##
+ mcset $l "\033\[32;1mCompilation successful.\033\[m (time: %s sec.)" \
+ "\033\[32;1mCompilation successful.\033\[m (time: %s sec.)" ;# <-- NOT TRANSLATED YET
+ ##ID:001672##
+ mcset $l "Creating code listing file ...\t\t-> \"%s\"" \
+ "Creating code listing file ...\t\t-> \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001673##
+ mcset $l "Creating code listing file ...\t\t-> \"\033\[34;1m%s\033\[m\"" \
+ "Creating code listing file ...\t\t-> \"\033\[34;1m%s\033\[m\"" ;# <-- NOT TRANSLATED YET
+}
+# assembler.tcl
+# ==============================================================================
+namespace eval assembler {
+ ##ID:001674##
+ mcset $l "File access error:\n%s" \
+ "File access error:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:001675##
+ mcset $l "Aborted" \
+ "Aborted" ;# <-- NOT TRANSLATED YET
+ ##ID:001676##
+ mcset $l "Unknown error %s" \
+ "Unknown error %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001677##
+ mcset $l "Invalid address at %s" \
+ "Invalid address at %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001678##
+ mcset $l "Invalid operand: '%s'" \
+ "Invalid operand: '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001679##
+ mcset $l "Invalid value" \
+ "Invalid value" ;# <-- NOT TRANSLATED YET
+ ##ID:001680##
+ mcset $l "Invalid operand" \
+ "Invalid operand" ;# <-- NOT TRANSLATED YET
+ ##ID:001681##
+ mcset $l "Unknown instruction: %s" \
+ "Unknown instruction: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001682##
+ mcset $l "Compilation error at line %s: %s" \
+ "Compilation error at line %s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001683##
+ mcset $l " in %s" \
+ " in %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001684##
+ mcset $l "\033\[31;1mCompilation error at line \033\[31;1;4m%s\033\[m%s: %s" \
+ "\033\[31;1mCompilation error at line \033\[31;1;4m%s\033\[m%s: %s" ;# <-- NOT TRANSLATED YET
+}
+# external_compiler.tcl
+# ==============================================================================
+namespace eval ExternalCompiler {
+ ##ID:001685##
+ mcset $l "\n\nStarting compiler ..." \
+ "\n\nStarting compiler ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001686##
+ mcset $l "\n\nStarting make ..." \
+ "\n\nStarting make ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001687##
+ mcset $l "\nError: Unable to change working directory to '%s'" \
+ "\nError: Unable to change working directory to '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001688##
+ mcset $l "\nUnable to create \"%s\"" \
+ "\nUnable to create \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001689##
+ mcset $l "\nUnable to find \"%s\"" \
+ "\nUnable to find \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001690##
+ mcset $l "\nUnable to find \"%s\"\n\tMCU 8051 IDE debug file (*.adf) could not be generated\n\tPLEASE CHECK YOUR %s CONFIGURATION" \
+ "\nUnable to find \"%s\"\n\tMCU 8051 IDE debug file (*.adf) could not be generated\n\tPLEASE CHECK YOUR %s CONFIGURATION" ;# <-- NOT TRANSLATED YET
+ ##ID:001691##
+ mcset $l "\nCompilation successful" \
+ "\nCompilation successful" ;# <-- NOT TRANSLATED YET
+ ##ID:001692##
+ mcset $l "\nCompilation FAILED" \
+ "\nCompilation FAILED" ;# <-- NOT TRANSLATED YET
+ ##ID:001693##
+ mcset $l "File access error:\n%s" \
+ "File access error:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:001694##
+ mcset $l "Unable to understand formulation at line %s in file %s" \
+ "Unable to understand formulation at line %s in file %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001695##
+ mcset $l "Compilation error:\nFile \"%s\" is not a valid Intel® HEX 8 file" \
+ "Compilation error:\nFile \"%s\" is not a valid Intel® HEX 8 file" ;# <-- NOT TRANSLATED YET
+}
+# disassembler.tcl
+# ==============================================================================
+namespace eval disassembler {
+ ##ID:001696##
+ mcset $l "Initializing disassembler ..." \
+ "Initializing disassembler ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001697##
+ mcset $l "Disassembly FAILED ..." \
+ "Disassembly FAILED ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001698##
+ mcset $l "\033\[31;1mDisassembly FAILED\033\[m ..." \
+ "\033\[31;1mDisassembly FAILED\033\[m ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001699##
+ mcset $l "Aborted" \
+ "Aborted" ;# <-- NOT TRANSLATED YET
+ ##ID:001700##
+ mcset $l "Disassembly complete" \
+ "Disassembly complete" ;# <-- NOT TRANSLATED YET
+ ##ID:001701##
+ mcset $l "\033\[32;1mDisassembly complete\033\[m" \
+ "\033\[32;1mDisassembly complete\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001702##
+ mcset $l "Invalid line (line contain not allowed characters)" \
+ "Invalid line (line contain not allowed characters)" ;# <-- NOT TRANSLATED YET
+ ##ID:001703##
+ mcset $l "Line do not contain odd number of chars" \
+ "Line do not contain odd number of chars" ;# <-- NOT TRANSLATED YET
+ ##ID:001704##
+ mcset $l "Bad checksum, given: %s ; computed: %s" \
+ "Bad checksum, given: %s ; computed: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001705##
+ mcset $l "Unknown record type number `%s' (Intel HEX 8 can contain only 00 and 01)" \
+ "Unknown record type number `%s' (Intel HEX 8 can contain only 00 and 01)" ;# <-- NOT TRANSLATED YET
+ ##ID:001706##
+ mcset $l "Length field do not correspond true data length" \
+ "Length field do not correspond true data length" ;# <-- NOT TRANSLATED YET
+ ##ID:001707##
+ mcset $l "Unexpected address -- code is not well formatted" \
+ "Unexpected address -- code is not well formatted" ;# <-- NOT TRANSLATED YET
+ ##ID:001708##
+ mcset $l "Warning: %s" \
+ "Warning: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001709##
+ mcset $l "\033\[33mWarning\033\[m: %s" \
+ "\033\[33mWarning\033\[m: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001710##
+ mcset $l " at line %s" \
+ " at line %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001711##
+ mcset $l " at line \033\[31;1;4m%s\033\[m" \
+ " at line \033\[31;1;4m%s\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001712##
+ mcset $l "Error%s: %s" \
+ "Error%s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001713##
+ mcset $l "\033\[31;1mError%s\033\[m: %s" \
+ "\033\[31;1mError%s\033\[m: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001714##
+ mcset $l "Code address overflow, instruction: %s" \
+ "Code address overflow, instruction: %s" ;# <-- NOT TRANSLATED YET
+}
+# preprocessor.tcl
+# ==============================================================================
+namespace eval PreProcessor {
+ ##ID:001716##
+ mcset $l "Aborted" \
+ "Aborted" ;# <-- NOT TRANSLATED YET
+ ##ID:001718##
+ mcset $l "Inclusion nesting exceeded maximum allowed level" \
+ "Inclusion nesting exceeded maximum allowed level" ;# <-- NOT TRANSLATED YET
+ ##ID:001721##
+ mcset $l "Macro nesting exceeded maximum allowed level" \
+ "Macro nesting exceeded maximum allowed level" ;# <-- NOT TRANSLATED YET
+ ##ID:001725##
+ mcset $l "Invalid argument: %s" \
+ "Invalid argument: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001726##
+ mcset $l "Extra characters after control sequence: %s" \
+ "Extra characters after control sequence: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001727##
+ mcset $l "Control %s has been overridden (by compiler settings)" \
+ "Control %s has been overridden (by compiler settings)" ;# <-- NOT TRANSLATED YET
+ ##ID:001728##
+ mcset $l "Control `%s' expect exactly one argument, but no argument given" \
+ "Control `%s' expect exactly one argument, but no argument given" ;# <-- NOT TRANSLATED YET
+ ##ID:001729##
+ mcset $l "Control `%s' takes no arguments." \
+ "Control `%s' takes no arguments." ;# <-- NOT TRANSLATED YET
+ ##ID:001730##
+ mcset $l "Invalid argument (must be integer): %s" \
+ "Invalid argument (must be integer): %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001731##
+ mcset $l "Unsupported control sequence: %s -- control sequence ignored" \
+ "Unsupported control sequence: %s -- control sequence ignored" ;# <-- NOT TRANSLATED YET
+ ##ID:001732##
+ mcset $l "You are using unusual directive 'BYTE', consider usage of 'DB' instead" \
+ "You are using unusual directive 'BYTE', consider usage of 'DB' instead" ;# <-- NOT TRANSLATED YET
+ ##ID:001733##
+ mcset $l "CSEG cannot take any label: %s" \
+ "CSEG cannot take any label: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001734##
+ mcset $l "Missing `AT' operator" \
+ "Missing `AT' operator" ;# <-- NOT TRANSLATED YET
+ ##ID:001735##
+ mcset $l "Argument value out of range: %s (%s)" \
+ "Argument value out of range: %s (%s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001736##
+ mcset $l "Invalid expression `%s'" \
+ "Invalid expression `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001737##
+ mcset $l "Using `%s', but active segment is `%s' (should be CSEG)" \
+ "Using `%s', but active segment is `%s' (should be CSEG)" ;# <-- NOT TRANSLATED YET
+ ##ID:001738##
+ mcset $l "Missing value" \
+ "Missing value" ;# <-- NOT TRANSLATED YET
+ ##ID:001739##
+ mcset $l "Invalid value" \
+ "Invalid value" ;# <-- NOT TRANSLATED YET
+ ##ID:001740##
+ mcset $l "Directive DW can take only one argument" \
+ "Directive DW can take only one argument" ;# <-- NOT TRANSLATED YET
+ ##ID:001741##
+ mcset $l "Unable to recognize character: `%s'" \
+ "Unable to recognize character: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001742##
+ mcset $l "Argument value out of range: %s" \
+ "Argument value out of range: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001743##
+ mcset $l "Expected bit address: %s" \
+ "Expected bit address: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001744##
+ mcset $l "Label is too far for 8-bit relative addressing." \
+ "Label is too far for 8-bit relative addressing." ;# <-- NOT TRANSLATED YET
+ ##ID:001745##
+ mcset $l "Operand value out of range: `%s' (`%s')" \
+ "Operand value out of range: `%s' (`%s')" ;# <-- NOT TRANSLATED YET
+ ##ID:001746##
+ mcset $l "Value out of range: `%s' (%s)" \
+ "Value out of range: `%s' (%s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001747##
+ mcset $l "Invalid label declaration: `%s'\n\tLabels can contain alphanumeric characters only and must not begin with a digit" \
+ "Invalid label declaration: `%s'\n\tLabels can contain alphanumeric characters only and must not begin with a digit" ;# <-- NOT TRANSLATED YET
+ ##ID:001748##
+ mcset $l "Unknown keyword: `%s'\n\t`%s' is neither macro nor instruction nor directive" \
+ "Unknown keyword: `%s'\n\t`%s' is neither macro nor instruction nor directive" ;# <-- NOT TRANSLATED YET
+ ##ID:001749##
+ mcset $l "Invalid bit designator: %s" \
+ "Invalid bit designator: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001750##
+ mcset $l "Given register does not belong to the bit addressable area: %s" \
+ "Given register does not belong to the bit addressable area: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001751##
+ mcset $l "Invalid value: %s'" \
+ "Invalid value: %s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001752##
+ mcset $l "Invalid numeric base `%s'\n\tPossible options are: __H (hex), __D (dec) __B (bin), __Q __O (oct) and 'char'" \
+ "Invalid numeric base `%s'\n\tPossible options are: __H (hex), __D (dec) __B (bin), __Q __O (oct) and 'char'" ;# <-- NOT TRANSLATED YET
+ ##ID:001753##
+ mcset $l "Special function register \"%s\" is not available on the target MCU" \
+ "Special function register \"%s\" is not available on the target MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:001754##
+ mcset $l "Special function bit \"%s\" is not available on the target MCU" \
+ "Special function bit \"%s\" is not available on the target MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:001755##
+ mcset $l "Symbol not defined: %s" \
+ "Symbol not defined: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001756##
+ mcset $l "Reserved keyword used as label" \
+ "Reserved keyword used as label" ;# <-- NOT TRANSLATED YET
+ ##ID:001757##
+ mcset $l "Invalid label: `%s' \n\t(labels can contain only alphanumeric characters and must not begin with a digit)" \
+ "Invalid label: `%s' \n\t(labels can contain only alphanumeric characters and must not begin with a digit)" ;# <-- NOT TRANSLATED YET
+ ##ID:001758##
+ mcset $l "Unable to overwrite already reserved program memory at address 0x%s -- compilation failed" \
+ "Unable to overwrite already reserved program memory at address 0x%s -- compilation failed" ;# <-- NOT TRANSLATED YET
+ ##ID:001759##
+ mcset $l "This instruction exceeding code memory capacity" \
+ "This instruction exceeding code memory capacity" ;# <-- NOT TRANSLATED YET
+ ##ID:001760##
+ mcset $l "No instruction found at address 0x00. Consider usage of appropriate ORG directive to clarify correct code placement." \
+ "No instruction found at address 0x00. Consider usage of appropriate ORG directive to clarify correct code placement." ;# <-- NOT TRANSLATED YET
+ ##ID:001761##
+ mcset $l "Label was already defined: `%s'" \
+ "Label was already defined: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001762##
+ mcset $l "Overwriting `%s' with `%s' (according to your previous definition!)" \
+ "Overwriting `%s' with `%s' (according to your previous definition!)" ;# <-- NOT TRANSLATED YET
+ ##ID:001763##
+ mcset $l "Too few operands, %s must take exactly %s operand" \
+ "Too few operands, %s must take exactly %s operand" ;# <-- NOT TRANSLATED YET
+ ##ID:001764##
+ mcset $l "Too few operands, %s must take exactly %s operands" \
+ "Too few operands, %s must take exactly %s operands" ;# <-- NOT TRANSLATED YET
+ ##ID:001765##
+ mcset $l "Too many operands, %s can take only %s operand" \
+ "Too many operands, %s can take only %s operand" ;# <-- NOT TRANSLATED YET
+ ##ID:001766##
+ mcset $l "Too many operands, %s can take only %s operands" \
+ "Too many operands, %s can take only %s operands" ;# <-- NOT TRANSLATED YET
+ ##ID:001767##
+ mcset $l "`%s' changed by compiler to `%s'" \
+ "`%s' changed by compiler to `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001768##
+ mcset $l "Invalid set of operands: %s %s" \
+ "Invalid set of operands: %s %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001769##
+ mcset $l "Direct value used as operand for %s" \
+ "Direct value used as operand for %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001770##
+ mcset $l "Too many arguments, \$s extra argument(s)" \
+ "Too many arguments, \$s extra argument(s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001771##
+ mcset $l "Too few arguments, %s argument(s) missing: %s ..." \
+ "Too few arguments, %s argument(s) missing: %s ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001772##
+ mcset $l "Cannot define macro inside another one -- macro processing failed" \
+ "Cannot define macro inside another one -- macro processing failed" ;# <-- NOT TRANSLATED YET
+ ##ID:001773##
+ mcset $l "Missing number of repeats" \
+ "Missing number of repeats" ;# <-- NOT TRANSLATED YET
+ ##ID:001774##
+ mcset $l "Number of repeats is lower than zero" \
+ "Number of repeats is lower than zero" ;# <-- NOT TRANSLATED YET
+ ##ID:001775##
+ mcset $l "Zero number of repeats" \
+ "Zero number of repeats" ;# <-- NOT TRANSLATED YET
+ ##ID:001776##
+ mcset $l "Reserved keyword used as macro parameter: %s in macro %s" \
+ "Reserved keyword used as macro parameter: %s in macro %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001777##
+ mcset $l "Reserved keyword substituted with macro argument: %s --> %s" \
+ "Reserved keyword substituted with macro argument: %s --> %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001778##
+ mcset $l "Macro name is reserved keyword: %s" \
+ "Macro name is reserved keyword: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001779##
+ mcset $l "Macro `%s' is already defined" \
+ "Macro `%s' is already defined" ;# <-- NOT TRANSLATED YET
+ ##ID:001780##
+ mcset $l "Directive %s takes no arguments" \
+ "Directive %s takes no arguments" ;# <-- NOT TRANSLATED YET
+ ##ID:001781##
+ mcset $l "Label is not allowed here (%s)" \
+ "Label is not allowed here (%s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001782##
+ mcset $l "Value of ``\$'' is not known at this point" \
+ "Value of ``\$'' is not known at this point" ;# <-- NOT TRANSLATED YET
+ ##ID:001783##
+ mcset $l "Unable to close macro, no macro is opened" \
+ "Unable to close macro, no macro is opened" ;# <-- NOT TRANSLATED YET
+ ##ID:001784##
+ mcset $l "Invalid label specification: ``%s''" \
+ "Invalid label specification: ``%s''" ;# <-- NOT TRANSLATED YET
+ ##ID:001785##
+ mcset $l "Missing name of macro" \
+ "Missing name of macro" ;# <-- NOT TRANSLATED YET
+ ##ID:001786##
+ mcset $l "Labels are not allowed before directives ENDM" \
+ "Labels are not allowed before directives ENDM" ;# <-- NOT TRANSLATED YET
+ ##ID:001787##
+ mcset $l "Missing file name" \
+ "Missing file name" ;# <-- NOT TRANSLATED YET
+ ##ID:001788##
+ mcset $l "Unable to open file: %s" \
+ "Unable to open file: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001789##
+ mcset $l "File not found: %s" \
+ "File not found: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001790##
+ mcset $l "Extra symbols after `END' directive" \
+ "Extra symbols after `END' directive" ;# <-- NOT TRANSLATED YET
+ ##ID:001791##
+ mcset $l "Missing `END' directive" \
+ "Missing `END' directive" ;# <-- NOT TRANSLATED YET
+ ##ID:001792##
+ mcset $l "Missing address" \
+ "Missing address" ;# <-- NOT TRANSLATED YET
+ ##ID:001793##
+ mcset $l "Label already defined: `%s'" \
+ "Label already defined: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001794##
+ mcset $l "Invalid label: `%s'" \
+ "Invalid label: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001795##
+ mcset $l "This ORG has lower value than the previous one" \
+ "This ORG has lower value than the previous one" ;# <-- NOT TRANSLATED YET
+ ##ID:001796##
+ mcset $l "This formulation is deprecated, consider usage of \"<Const> <Directive> <Value>\" instead" \
+ "This formulation is deprecated, consider usage of \"<Const> <Directive> <Value>\" instead" ;# <-- NOT TRANSLATED YET
+ ##ID:001797##
+ mcset $l "Missing name of constant to define" \
+ "Missing name of constant to define" ;# <-- NOT TRANSLATED YET
+ ##ID:001798##
+ mcset $l "Empty expression" \
+ "Empty expression" ;# <-- NOT TRANSLATED YET
+ ##ID:001799##
+ mcset $l "Missing expression" \
+ "Missing expression" ;# <-- NOT TRANSLATED YET
+ ##ID:001800##
+ mcset $l "Argument value is out of range ({0 1 2 3}) : `%s'" \
+ "Argument value is out of range ({0 1 2 3}) : `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001801##
+ mcset $l "Missing size" \
+ "Missing size" ;# <-- NOT TRANSLATED YET
+ ##ID:001802##
+ mcset $l "Length of data area cannot be negative number: %s" \
+ "Length of data area cannot be negative number: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001803##
+ mcset $l "Using `DBIT' directive, but active segment is `%s' (should be BSEG)" \
+ "Using `DBIT' directive, but active segment is `%s' (should be BSEG)" ;# <-- NOT TRANSLATED YET
+ ##ID:001804##
+ mcset $l "Using `%s' directive, but currently active segment is `%s'" \
+ "Using `%s' directive, but currently active segment is `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001805##
+ mcset $l "Exceeding %s segment boundary by %s bites." \
+ "Exceeding %s segment boundary by %s bites." ;# <-- NOT TRANSLATED YET
+ ##ID:001806##
+ mcset $l "Exceeding %s segment boundary by %s Bytes." \
+ "Exceeding %s segment boundary by %s Bytes." ;# <-- NOT TRANSLATED YET
+ ##ID:001807##
+ mcset $l "Nearing %s segment boundary" \
+ "Nearing %s segment boundary" ;# <-- NOT TRANSLATED YET
+ ##ID:001808##
+ mcset $l "Overwriting reserved memory -- in %s area at addresses: %s" \
+ "Overwriting reserved memory -- in %s area at addresses: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001809##
+ mcset $l "Unable redefine constant: %s" \
+ "Unable redefine constant: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001810##
+ mcset $l "Ambiguous symbol definition: %s" \
+ "Ambiguous symbol definition: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001811##
+ mcset $l "Unknown operator: `%s', should be `%s at <address>', e.g. `%s at X+0FFh'" \
+ "Unknown operator: `%s', should be `%s at <address>', e.g. `%s at X+0FFh'" ;# <-- NOT TRANSLATED YET
+ ##ID:001812##
+ mcset $l "Segment pointer is too high: %s / %s" \
+ "Segment pointer is too high: %s / %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001813##
+ mcset $l "Segment pointer cannot be negative: `%s'" \
+ "Segment pointer cannot be negative: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001814##
+ mcset $l "Missing condition" \
+ "Missing condition" ;# <-- NOT TRANSLATED YET
+ ##ID:001815##
+ mcset $l "Unexpected `ELSE'" \
+ "Unexpected `ELSE'" ;# <-- NOT TRANSLATED YET
+ ##ID:001816##
+ mcset $l "Unexpected `ELSEIF'" \
+ "Unexpected `ELSEIF'" ;# <-- NOT TRANSLATED YET
+ ##ID:001817##
+ mcset $l "Unexpected `ENDIF'" \
+ "Unexpected `ENDIF'" ;# <-- NOT TRANSLATED YET
+ ##ID:001818##
+ mcset $l "Invalid symbolic name: %s" \
+ "Invalid symbolic name: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001819##
+ mcset $l "Invalid expression: `%s'" \
+ "Invalid expression: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001820##
+ mcset $l "Expected symbol to define, but got label: `%s'" \
+ "Expected symbol to define, but got label: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001821##
+ mcset $l "Invalid symbol name: `%s'" \
+ "Invalid symbol name: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001822##
+ mcset $l "Special value (with no numerical representation) assigned to constant: %s <- %s" \
+ "Special value (with no numerical representation) assigned to constant: %s <- %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001823##
+ mcset $l "Trying to overwrite constant: %s" \
+ "Trying to overwrite constant: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001824##
+ mcset $l "Expression out of range" \
+ "Expression out of range" ;# <-- NOT TRANSLATED YET
+ ##ID:001825##
+ mcset $l "Exceeding code memory capacity: %s <- %s" \
+ "Exceeding code memory capacity: %s <- %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001826##
+ mcset $l "Exceeding internal data memory capacity: %s <- %s" \
+ "Exceeding internal data memory capacity: %s <- %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001827##
+ mcset $l "Exceeding external data memory capacity: %s <- %s" \
+ "Exceeding external data memory capacity: %s <- %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001828##
+ mcset $l "Trying to change variable `%s' with wrong directive (EQU)" \
+ "Trying to change variable `%s' with wrong directive (EQU)" ;# <-- NOT TRANSLATED YET
+ ##ID:001829##
+ mcset $l "Setting new variable value: %s <- %s" \
+ "Setting new variable value: %s <- %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001830##
+ mcset $l "Invalid expression - parentheses are not balanced: `%s'" \
+ "Invalid expression - parentheses are not balanced: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001831##
+ mcset $l "Invalid value: `%s' (should be char)" \
+ "Invalid value: `%s' (should be char)" ;# <-- NOT TRANSLATED YET
+ ##ID:001832##
+ mcset $l "Invalid numeric value: %s (should be decimal number)" \
+ "Invalid numeric value: %s (should be decimal number)" ;# <-- NOT TRANSLATED YET
+ ##ID:001833##
+ mcset $l "Invalid numeric value: %s (should be hexadecimal number)" \
+ "Invalid numeric value: %s (should be hexadecimal number)" ;# <-- NOT TRANSLATED YET
+ ##ID:001834##
+ mcset $l "Invalid numeric value: %s (should be binary number)" \
+ "Invalid numeric value: %s (should be binary number)" ;# <-- NOT TRANSLATED YET
+ ##ID:001835##
+ mcset $l "Invalid numeric value: %s (should be octal number)" \
+ "Invalid numeric value: %s (should be octal number)" ;# <-- NOT TRANSLATED YET
+ ##ID:001836##
+ mcset $l "Undefined symbol name: %s" \
+ "Undefined symbol name: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001837##
+ mcset $l "Floating point value converted to integer value `%s' -> `%s'" \
+ "Floating point value converted to integer value `%s' -> `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001838##
+ mcset $l "Overflow `%s' -> `%s'" \
+ "Overflow `%s' -> `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001839##
+ mcset $l "Cannot to use string `%s' as a valid value" \
+ "Cannot to use string `%s' as a valid value" ;# <-- NOT TRANSLATED YET
+ ##ID:001840##
+ mcset $l "Cannot to use string `%s' as value" \
+ "Cannot to use string `%s' as value" ;# <-- NOT TRANSLATED YET
+ ##ID:001841##
+ mcset $l "Compilation error at %s: %s" \
+ "Compilation error at %s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001842##
+ mcset $l " in %s" \
+ " in %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001843##
+ mcset $l "\033\[31;1mCompilation error\033\[m at \033\[31;1;4m%s\033\[m%s: %s" \
+ "\033\[31;1mCompilation error\033\[m at \033\[31;1;4m%s\033\[m%s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001844##
+ mcset $l "Notice at %s: %s" \
+ "Notice at %s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001845##
+ mcset $l "\033\[33;1mNotice\033\[m at \033\[33;1;4m%s\033\[m%s: %s" \
+ "\033\[33;1mNotice\033\[m at \033\[33;1;4m%s\033\[m%s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001846##
+ mcset $l "Warning at %s: %s" \
+ "Warning at %s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001847##
+ mcset $l "\033\[33mWarning\033\[m at \033\[33;4m%s\033\[m%s: %s" \
+ "\033\[33mWarning\033\[m at \033\[33;4m%s\033\[m%s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001848##
+ mcset $l "Syntax error at %s: %s" \
+ "Syntax error at %s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001849##
+ mcset $l "\033\[31;1mSyntax error\033\[m at \033\[31;1;4m%s\033\[m%s: %s" \
+ "\033\[31;1mSyntax error\033\[m at \033\[31;1;4m%s\033\[m%s: %s" ;# <-- NOT TRANSLATED YET
+}
+# errorhandler.tcl
+# ==============================================================================
+namespace eval ErrorHandler {
+ ##ID:001850##
+ mcset $l "PROGRAM ERROR " \
+ "PROGRAM ERROR " ;# <-- NOT TRANSLATED YET
+ ##ID:001851##
+ mcset $l "Error log saved in: %s\n" \
+ "Error log saved in: %s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001852##
+ mcset $l "Please send this file to %s or report this bug at http://mcu8051ide.sf.net/forum\n\n\n" \
+ "Please send this file to %s or report this bug at http://mcu8051ide.sf.net/forum\n\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001853##
+ mcset $l "ERROR DETAILS:\n--------------\n" \
+ "ERROR DETAILS:\n--------------\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001854##
+ mcset $l "Skip errors" \
+ "Skip errors" ;# <-- NOT TRANSLATED YET
+ ##ID:001855##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:001856##
+ mcset $l "PROGRAM ERROR - MCU 8051 IDE" \
+ "PROGRAM ERROR - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+}
+# notes.tcl
+# ==============================================================================
+namespace eval Notes {
+ ##ID:001857##
+ mcset $l "Pencil" \
+ "Pencil" ;# <-- NOT TRANSLATED YET
+ ##ID:001858##
+ mcset $l "Line" \
+ "Line" ;# <-- NOT TRANSLATED YET
+ ##ID:001859##
+ mcset $l "Arrow" \
+ "Arrow" ;# <-- NOT TRANSLATED YET
+ ##ID:001860##
+ mcset $l "Rectangle" \
+ "Rectangle" ;# <-- NOT TRANSLATED YET
+ ##ID:001861##
+ mcset $l "Oval" \
+ "Oval" ;# <-- NOT TRANSLATED YET
+ ##ID:001862##
+ mcset $l "Insert text" \
+ "Insert text" ;# <-- NOT TRANSLATED YET
+ ##ID:001863##
+ mcset $l "Move" \
+ "Move" ;# <-- NOT TRANSLATED YET
+ ##ID:001864##
+ mcset $l "Move canvas" \
+ "Move canvas" ;# <-- NOT TRANSLATED YET
+ ##ID:001865##
+ mcset $l "Eraser" \
+ "Eraser" ;# <-- NOT TRANSLATED YET
+ ##ID:001866##
+ mcset $l "Zoom in" \
+ "Zoom in" ;# <-- NOT TRANSLATED YET
+ ##ID:001867##
+ mcset $l "Zoom out" \
+ "Zoom out" ;# <-- NOT TRANSLATED YET
+ ##ID:001868##
+ mcset $l "Insert image" \
+ "Insert image" ;# <-- NOT TRANSLATED YET
+ ##ID:001869##
+ mcset $l "Select color" \
+ "Select color" ;# <-- NOT TRANSLATED YET
+ ##ID:001870##
+ mcset $l "Clear all" \
+ "Clear all" ;# <-- NOT TRANSLATED YET
+ ##ID:001871##
+ mcset $l "Really close ?" \
+ "Really close ?" ;# <-- NOT TRANSLATED YET
+ ##ID:001872##
+ mcset $l "Do you really want to close your notes ? (There is no save function ...)" \
+ "Do you really want to close your notes ? (There is no save function ...)" ;# <-- NOT TRANSLATED YET
+ ##ID:001873##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:001874##
+ mcset $l "Shade" \
+ "Shade" ;# <-- NOT TRANSLATED YET
+ ##ID:001875##
+ mcset $l "Draw ovals" \
+ "Draw ovals" ;# <-- NOT TRANSLATED YET
+ ##ID:001876##
+ mcset $l "Draw rectangles" \
+ "Draw rectangles" ;# <-- NOT TRANSLATED YET
+ ##ID:001877##
+ mcset $l "Draw arrows" \
+ "Draw arrows" ;# <-- NOT TRANSLATED YET
+ ##ID:001878##
+ mcset $l "Draw lines" \
+ "Draw lines" ;# <-- NOT TRANSLATED YET
+ ##ID:001879##
+ mcset $l "Text:" \
+ "Text:" ;# <-- NOT TRANSLATED YET
+ ##ID:001880##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:001881##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:001882##
+ mcset $l "Enter text" \
+ "Enter text" ;# <-- NOT TRANSLATED YET
+ ##ID:001883##
+ mcset $l "Are you sure ?" \
+ "Are you sure ?" ;# <-- NOT TRANSLATED YET
+ ##ID:001884##
+ mcset $l "Do you really want to clear this notepad\n(there is no undo action)" \
+ "Do you really want to clear this notepad\n(there is no undo action)" ;# <-- NOT TRANSLATED YET
+ ##ID:001885##
+ mcset $l "Insert image from file" \
+ "Insert image from file" ;# <-- NOT TRANSLATED YET
+ ##ID:001886##
+ mcset $l "Unable to read file" \
+ "Unable to read file" ;# <-- NOT TRANSLATED YET
+ ##ID:001887##
+ mcset $l "Scribble notepad" \
+ "Scribble notepad" ;# <-- NOT TRANSLATED YET
+ ##ID:001888##
+ mcset $l "Portable network graphics" \
+ "Portable network graphics" ;# <-- NOT TRANSLATED YET
+}
+# sfrwatches.tcl
+# ==============================================================================
+namespace eval SFRWatches {
+ ##ID:001889##
+ mcset $l "Set to 0x00" \
+ "Set to 0x00" ;# <-- NOT TRANSLATED YET
+ ##ID:001890##
+ mcset $l "Set this register to 0" \
+ "Set this register to 0" ;# <-- NOT TRANSLATED YET
+ ##ID:001891##
+ mcset $l "Set to 0xFF" \
+ "Set to 0xFF" ;# <-- NOT TRANSLATED YET
+ ##ID:001892##
+ mcset $l "Set this register to 255" \
+ "Set this register to 255" ;# <-- NOT TRANSLATED YET
+ ##ID:001893##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:001894##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:001895##
+ mcset $l "Register" \
+ "Register" ;# <-- NOT TRANSLATED YET
+ ##ID:001896##
+ mcset $l "Search:" \
+ "Search:" ;# <-- NOT TRANSLATED YET
+}
+# stackmonitor.tcl
+# ==============================================================================
+namespace eval StackMonitor {
+ ##ID:001897##
+ mcset $l "Do you really want to clear the list without any effect in simulator engine ?" \
+ "Do you really want to clear the list without any effect in simulator engine ?" ;# <-- NOT TRANSLATED YET
+ ##ID:001898##
+ mcset $l "Confirmation" \
+ "Confirmation" ;# <-- NOT TRANSLATED YET
+ ##ID:001899##
+ mcset $l "Push value onto stack." \
+ "Push value onto stack." ;# <-- NOT TRANSLATED YET
+ ##ID:001900##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:001901##
+ mcset $l "PUSH" \
+ "PUSH" ;# <-- NOT TRANSLATED YET
+ ##ID:001902##
+ mcset $l "POP" \
+ "POP" ;# <-- NOT TRANSLATED YET
+ ##ID:001903##
+ mcset $l "Clear" \
+ "Clear" ;# <-- NOT TRANSLATED YET
+ ##ID:001904##
+ mcset $l "SP: " \
+ "SP: " ;# <-- NOT TRANSLATED YET
+ ##ID:001905##
+ mcset $l "Push value onto stack (HEX)" \
+ "Push value onto stack (HEX)" ;# <-- NOT TRANSLATED YET
+ ##ID:001906##
+ mcset $l "Stack - %s - MCU 8051 IDE" \
+ "Stack - %s - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:001907##
+ mcset $l "General" \
+ "General" ;# <-- NOT TRANSLATED YET
+ ##ID:001908##
+ mcset $l "Subprogram" \
+ "Subprogram" ;# <-- NOT TRANSLATED YET
+ ##ID:001909##
+ mcset $l "Interrupt" \
+ "Interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:001910##
+ mcset $l "Legend:" \
+ "Legend:" ;# <-- NOT TRANSLATED YET
+ ##ID:001911##
+ mcset $l "Show/Hide tool bar" \
+ "Show/Hide tool bar" ;# <-- NOT TRANSLATED YET
+ ##ID:001912##
+ mcset $l "Current stack pointer value" \
+ "Current stack pointer value" ;# <-- NOT TRANSLATED YET
+ # Keep string length here!
+ ##ID:001913##
+ mcset $l {Addr HH Dec Binary Oct A} \
+ {Addr HH Dec Binary Oct A} ;# <-- NOT TRANSLATED YET
+}
+# terminal.tcl
+# ==============================================================================
+namespace eval Terminal {
+ ##ID:001914##
+ mcset $l "Unable to find urxvt" \
+ "Unable to find urxvt" ;# <-- NOT TRANSLATED YET
+ ##ID:001915##
+ mcset $l "Unable to execute program \"urxvt\", terminal emulator is eiter not available or badly configured." \
+ "Unable to execute program \"urxvt\", terminal emulator is eiter not available or badly configured." ;# <-- NOT TRANSLATED YET
+}
+# eightsegment.tcl
+# ==============================================================================
+namespace eval EightSegment {
+ ##ID:001916##
+ mcset $l "8 segment editor" \
+ "8 segment editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001917##
+ mcset $l "Common cathode" \
+ "Common cathode" ;# <-- NOT TRANSLATED YET
+ ##ID:001918##
+ mcset $l "Hex:" \
+ "Hex:" ;# <-- NOT TRANSLATED YET
+ ##ID:001919##
+ mcset $l "Dec:" \
+ "Dec:" ;# <-- NOT TRANSLATED YET
+ ##ID:001920##
+ mcset $l "Bin:" \
+ "Bin:" ;# <-- NOT TRANSLATED YET
+ ##ID:001921##
+ mcset $l "Copy to clipboard" \
+ "Copy to clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:001922##
+ mcset $l "Copy contents of the entrybox to clipboard" \
+ "Copy contents of the entrybox to clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:001923##
+ mcset $l "Common anode" \
+ "Common anode" ;# <-- NOT TRANSLATED YET
+ ##ID:001924##
+ mcset $l "LED" \
+ "LED" ;# <-- NOT TRANSLATED YET
+ ##ID:001925##
+ mcset $l "PIN" \
+ "PIN" ;# <-- NOT TRANSLATED YET
+ ##ID:001926##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+}
+# symbol_viewer.tcl
+# ==============================================================================
+namespace eval SymbolViewer {
+ ##ID:001927##
+ mcset $l "Assembly symbol table - MCU 8051 IDE" \
+ "Assembly symbol table - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:001928##
+ mcset $l "Copy symbol name" \
+ "Copy symbol name" ;# <-- NOT TRANSLATED YET
+ ##ID:001929##
+ mcset $l "Copy hex value" \
+ "Copy hex value" ;# <-- NOT TRANSLATED YET
+ ##ID:001930##
+ mcset $l "Copy dec value" \
+ "Copy dec value" ;# <-- NOT TRANSLATED YET
+ ##ID:001931##
+ mcset $l "Copy line" \
+ "Copy line" ;# <-- NOT TRANSLATED YET
+ ##ID:001932##
+ mcset $l "Open *.LST" \
+ "Open *.LST" ;# <-- NOT TRANSLATED YET
+ ##ID:001933##
+ mcset $l "Load table of symbols from list file (*.lst)\n\tOnly for: ASEM-51, MCU8051IDE and ASM51" \
+ "Load table of symbols from list file (*.lst)\n\tOnly for: ASEM-51, MCU8051IDE and ASM51" ;# <-- NOT TRANSLATED YET
+ ##ID:001934##
+ mcset $l "Open code listing" \
+ "Open code listing" ;# <-- NOT TRANSLATED YET
+ ##ID:001935##
+ mcset $l "Reload" \
+ "Reload" ;# <-- NOT TRANSLATED YET
+ ##ID:001936##
+ mcset $l "Reload opened file" \
+ "Reload opened file" ;# <-- NOT TRANSLATED YET
+ ##ID:001937##
+ mcset $l "Search:" \
+ "Search:" ;# <-- NOT TRANSLATED YET
+ ##ID:001938##
+ mcset $l "Search for symbol by its name or value" \
+ "Search for symbol by its name or value" ;# <-- NOT TRANSLATED YET
+ ##ID:001939##
+ mcset $l "Search for symbol" \
+ "Search for symbol" ;# <-- NOT TRANSLATED YET
+ ##ID:001940##
+ mcset $l "Clear search entry box" \
+ "Clear search entry box" ;# <-- NOT TRANSLATED YET
+ ##ID:001941##
+ mcset $l "Symbol\t\t\t\tType\tHEX\tDEC\tUsed" \
+ "Symbol\t\t\t\tType\tHEX\tDEC\tUsed" ;# <-- NOT TRANSLATED YET
+ ##ID:001942##
+ mcset $l "Display" \
+ "Display" ;# <-- NOT TRANSLATED YET
+ ##ID:001943##
+ mcset $l "Used symbols" \
+ "Used symbols" ;# <-- NOT TRANSLATED YET
+ ##ID:001944##
+ mcset $l "Unused symbols" \
+ "Unused symbols" ;# <-- NOT TRANSLATED YET
+ ##ID:001945##
+ mcset $l "Sort by" \
+ "Sort by" ;# <-- NOT TRANSLATED YET
+ ##ID:001946##
+ mcset $l "Incremental order" \
+ "Incremental order" ;# <-- NOT TRANSLATED YET
+ ##ID:001947##
+ mcset $l "Decremental order" \
+ "Decremental order" ;# <-- NOT TRANSLATED YET
+ ##ID:001948##
+ mcset $l "Load symbol table - MCU 8051 IDE" \
+ "Load symbol table - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:001949##
+ mcset $l "Code listing" \
+ "Code listing" ;# <-- NOT TRANSLATED YET
+ ##ID:001950##
+ mcset $l "Invalid file" \
+ "Invalid file" ;# <-- NOT TRANSLATED YET
+ ##ID:001951##
+ mcset $l "Unable to use selected file. Please check your permissions. File: '%s'" \
+ "Unable to use selected file. Please check your permissions. File: '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001952##
+ mcset $l "YES" \
+ "YES" ;# <-- NOT TRANSLATED YET
+ ##ID:001953##
+ mcset $l "NO" \
+ "NO" ;# <-- NOT TRANSLATED YET
+}
+# sfrmap.tcl
+# ==============================================================================
+namespace eval SFRMap {
+ ##ID:001954##
+ mcset $l "Map of SFR area" \
+ "Map of SFR area" ;# <-- NOT TRANSLATED YET
+ ##ID:001955##
+ mcset $l "Reserved" \
+ "Reserved" ;# <-- NOT TRANSLATED YET
+ ##ID:001956##
+ mcset $l "Bit addressable" \
+ "Bit addressable" ;# <-- NOT TRANSLATED YET
+ ##ID:001957##
+ mcset $l "HEX:" \
+ "HEX:" ;# <-- NOT TRANSLATED YET
+ ##ID:001958##
+ mcset $l "DEC:" \
+ "DEC:" ;# <-- NOT TRANSLATED YET
+ ##ID:001959##
+ mcset $l "BIN:" \
+ "BIN:" ;# <-- NOT TRANSLATED YET
+ ##ID:001960##
+ mcset $l "OCT:" \
+ "OCT:" ;# <-- NOT TRANSLATED YET
+}
+# hibernate.tcl
+# ==============================================================================
+namespace eval Hibernate {
+ ##ID:001961##
+ mcset $l "Abort" \
+ "Abort" ;# <-- NOT TRANSLATED YET
+ ##ID:001962##
+ mcset $l "Hibernation progress" \
+ "Hibernation progress" ;# <-- NOT TRANSLATED YET
+ ##ID:001963##
+ mcset $l "Interrupt at vector 0x%s " \
+ "Interrupt at vector 0x%s " ;# <-- NOT TRANSLATED YET
+ ##ID:001964##
+ mcset $l "Fatal error" \
+ "Fatal error" ;# <-- NOT TRANSLATED YET
+ ##ID:001965##
+ mcset $l "Version of this M5IHIB file is higher than %s\nUnable to continue." \
+ "Version of this M5IHIB file is higher than %s\nUnable to continue." ;# <-- NOT TRANSLATED YET
+ ##ID:001966##
+ mcset $l "The following problems must be \nresolved before program resumption" \
+ "The following problems must be \nresolved before program resumption" ;# <-- NOT TRANSLATED YET
+ ##ID:001967##
+ mcset $l "This file is indented for %s but the current MCU is %s" \
+ "This file is indented for %s but the current MCU is %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001968##
+ mcset $l "Set current MCU to %s" \
+ "Set current MCU to %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001969##
+ mcset $l "This file contains %s B of external data memory but but your processor has %s B" \
+ "This file contains %s B of external data memory but but your processor has %s B" ;# <-- NOT TRANSLATED YET
+ ##ID:001970##
+ mcset $l "Set current XDATA capacity to %s B" \
+ "Set current XDATA capacity to %s B" ;# <-- NOT TRANSLATED YET
+ ##ID:001971##
+ mcset $l "Ignore this difference" \
+ "Ignore this difference" ;# <-- NOT TRANSLATED YET
+ ##ID:001972##
+ mcset $l "Current file (%s) has different MD5 hash than MD5 recorded in this hibernation file" \
+ "Current file (%s) has different MD5 hash than MD5 recorded in this hibernation file" ;# <-- NOT TRANSLATED YET
+ ##ID:001973##
+ mcset $l "This hibernation file was generated from \"%s\" but current file is \"%s\"" \
+ "This hibernation file was generated from \"%s\" but current file is \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001974##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:001975##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:001976##
+ mcset $l "Program resumption" \
+ "Program resumption" ;# <-- NOT TRANSLATED YET
+ ##ID:001977##
+ mcset $l "Options:" \
+ "Options:" ;# <-- NOT TRANSLATED YET
+}
+# find_in_files.tcl
+# ==============================================================================
+namespace eval FindInFiles {
+ ##ID:001978##
+ mcset $l "Go to" \
+ "Go to" ;# <-- NOT TRANSLATED YET
+ ##ID:001979##
+ mcset $l "Go to this line" \
+ "Go to this line" ;# <-- NOT TRANSLATED YET
+ ##ID:001980##
+ mcset $l "Clear" \
+ "Clear" ;# <-- NOT TRANSLATED YET
+ ##ID:001981##
+ mcset $l "Clear this panel" \
+ "Clear this panel" ;# <-- NOT TRANSLATED YET
+ ##ID:001982##
+ mcset $l "Search pattern" \
+ "Search pattern" ;# <-- NOT TRANSLATED YET
+ ##ID:001983##
+ mcset $l "File mask (e.g. \"*.c,*.asm\")" \
+ "File mask (e.g. \"*.c,*.asm\")" ;# <-- NOT TRANSLATED YET
+ ##ID:001984##
+ mcset $l "Select folder" \
+ "Select folder" ;# <-- NOT TRANSLATED YET
+ ##ID:001985##
+ mcset $l "Recursive" \
+ "Recursive" ;# <-- NOT TRANSLATED YET
+ ##ID:001986##
+ mcset $l "Search in all subfolders" \
+ "Search in all subfolders" ;# <-- NOT TRANSLATED YET
+ ##ID:001987##
+ mcset $l "Find" \
+ "Find" ;# <-- NOT TRANSLATED YET
+ ##ID:001988##
+ mcset $l "Start / Stop search" \
+ "Start / Stop search" ;# <-- NOT TRANSLATED YET
+ ##ID:001989##
+ mcset $l "Clear results" \
+ "Clear results" ;# <-- NOT TRANSLATED YET
+ ##ID:001990##
+ mcset $l "Case sensitive" \
+ "Case sensitive" ;# <-- NOT TRANSLATED YET
+ ##ID:001991##
+ mcset $l "Perform case sensitive search" \
+ "Perform case sensitive search" ;# <-- NOT TRANSLATED YET
+ ##ID:001992##
+ mcset $l "Regular expression" \
+ "Regular expression" ;# <-- NOT TRANSLATED YET
+ ##ID:001993##
+ mcset $l "Pattern is a regular expression" \
+ "Pattern is a regular expression" ;# <-- NOT TRANSLATED YET
+ ##ID:001994##
+ mcset $l "Pattern:" \
+ "Pattern:" ;# <-- NOT TRANSLATED YET
+ ##ID:001995##
+ mcset $l "Folder:" \
+ "Folder:" ;# <-- NOT TRANSLATED YET
+ ##ID:001996##
+ mcset $l "Mask:" \
+ "Mask:" ;# <-- NOT TRANSLATED YET
+ ##ID:001997##
+ mcset $l "Clear pattern entrybox" \
+ "Clear pattern entrybox" ;# <-- NOT TRANSLATED YET
+ ##ID:001998##
+ mcset $l "Show help for file mask" \
+ "Show help for file mask" ;# <-- NOT TRANSLATED YET
+ ##ID:001999##
+ mcset $l "Choose directory - MCU 8051 IDE" \
+ "Choose directory - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002000##
+ mcset $l "Folder not found" \
+ "Folder not found" ;# <-- NOT TRANSLATED YET
+ ##ID:002001##
+ mcset $l "The specified folder does not exist.\n'%s'" \
+ "The specified folder does not exist.\n'%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002002##
+ mcset $l "The string specified as a folder is not a folder.\n'%s'" \
+ "The string specified as a folder is not a folder.\n'%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002003##
+ mcset $l "Error" \
+ "Error" ;# <-- NOT TRANSLATED YET
+ ##ID:002004##
+ mcset $l "Invalid regular expression" \
+ "Invalid regular expression" ;# <-- NOT TRANSLATED YET
+ ##ID:002005##
+ mcset $l "Stop" \
+ "Stop" ;# <-- NOT TRANSLATED YET
+ ##ID:002006##
+ mcset $l "-- click to close --" \
+ "-- click to close --" ;# <-- NOT TRANSLATED YET
+ ##ID:002007##
+ mcset $l "Comma separated list of file masks (e.g \"*.c,*.h,*.asm\")\n" \
+ "Comma separated list of file masks (e.g \"*.c,*.h,*.asm\")\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002008##
+ mcset $l "The mask may contain any of the following special characters:\n" \
+ "The mask may contain any of the following special characters:\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002009##
+ mcset $l " ? Matches any single character.\n" \
+ " ? Matches any single character.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002010##
+ mcset $l " * Matches any sequence of zero or more characters.\n" \
+ " * Matches any sequence of zero or more characters.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002011##
+ mcset $l " \[chars\] Matches any single character in chars.\n" \
+ " \[chars\] Matches any single character in chars.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002012##
+ mcset $l " If chars contains a sequence of the form a-b then any\n" \
+ " If chars contains a sequence of the form a-b then any\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002013##
+ mcset $l " character between a and b (inclusive) will match.\n" \
+ " character between a and b (inclusive) will match.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002014##
+ mcset $l " \\x Matches the character x." \
+ " \\x Matches the character x." ;# <-- NOT TRANSLATED YET
+}
+# fsbrowser.tcl
+# ==============================================================================
+namespace eval FSBrowser {
+ ##ID:002015##
+ mcset $l "Sorting" \
+ "Sorting" ;# <-- NOT TRANSLATED YET
+ ##ID:002016##
+ mcset $l "By Name" \
+ "By Name" ;# <-- NOT TRANSLATED YET
+ ##ID:002017##
+ mcset $l "Sort files by name" \
+ "Sort files by name" ;# <-- NOT TRANSLATED YET
+ ##ID:002018##
+ mcset $l "By Date" \
+ "By Date" ;# <-- NOT TRANSLATED YET
+ ##ID:002019##
+ mcset $l "Sort files by date" \
+ "Sort files by date" ;# <-- NOT TRANSLATED YET
+ ##ID:002020##
+ mcset $l "By Size" \
+ "By Size" ;# <-- NOT TRANSLATED YET
+ ##ID:002021##
+ mcset $l "Sort files by size" \
+ "Sort files by size" ;# <-- NOT TRANSLATED YET
+ ##ID:002022##
+ mcset $l "Reverse" \
+ "Reverse" ;# <-- NOT TRANSLATED YET
+ ##ID:002023##
+ mcset $l "Decremental sorting" \
+ "Decremental sorting" ;# <-- NOT TRANSLATED YET
+ ##ID:002024##
+ mcset $l "Case insensitive" \
+ "Case insensitive" ;# <-- NOT TRANSLATED YET
+ ##ID:002025##
+ mcset $l "Sorting mode ASCII / Dictionary" \
+ "Sorting mode ASCII / Dictionary" ;# <-- NOT TRANSLATED YET
+ ##ID:002026##
+ mcset $l "Show hidden files" \
+ "Show hidden files" ;# <-- NOT TRANSLATED YET
+ ##ID:002027##
+ mcset $l "Show / Ignore files starting with dot" \
+ "Show / Ignore files starting with dot" ;# <-- NOT TRANSLATED YET
+ ##ID:002028##
+ mcset $l "Up" \
+ "Up" ;# <-- NOT TRANSLATED YET
+ ##ID:002029##
+ mcset $l "Go to parent folder" \
+ "Go to parent folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002030##
+ mcset $l "Back" \
+ "Back" ;# <-- NOT TRANSLATED YET
+ ##ID:002031##
+ mcset $l "Go back in history" \
+ "Go back in history" ;# <-- NOT TRANSLATED YET
+ ##ID:002032##
+ mcset $l "Forward" \
+ "Forward" ;# <-- NOT TRANSLATED YET
+ ##ID:002033##
+ mcset $l "Go forward in history" \
+ "Go forward in history" ;# <-- NOT TRANSLATED YET
+ ##ID:002034##
+ mcset $l "Home" \
+ "Home" ;# <-- NOT TRANSLATED YET
+ ##ID:002035##
+ mcset $l "Go to your home folder" \
+ "Go to your home folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002036##
+ mcset $l "Reload" \
+ "Reload" ;# <-- NOT TRANSLATED YET
+ ##ID:002037##
+ mcset $l "Reload file list" \
+ "Reload file list" ;# <-- NOT TRANSLATED YET
+ ##ID:002038##
+ mcset $l "Rename" \
+ "Rename" ;# <-- NOT TRANSLATED YET
+ ##ID:002039##
+ mcset $l "Rename file" \
+ "Rename file" ;# <-- NOT TRANSLATED YET
+ ##ID:002040##
+ mcset $l "Delete" \
+ "Delete" ;# <-- NOT TRANSLATED YET
+ ##ID:002041##
+ mcset $l "Delete file" \
+ "Delete file" ;# <-- NOT TRANSLATED YET
+ ##ID:002042##
+ mcset $l "New folder" \
+ "New folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002043##
+ mcset $l "Create new directory" \
+ "Create new directory" ;# <-- NOT TRANSLATED YET
+ ##ID:002044##
+ mcset $l "Bookmark folder" \
+ "Bookmark folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002045##
+ mcset $l "Bookmark the current directory" \
+ "Bookmark the current directory" ;# <-- NOT TRANSLATED YET
+ ##ID:002046##
+ mcset $l "Properties" \
+ "Properties" ;# <-- NOT TRANSLATED YET
+ ##ID:002047##
+ mcset $l "Show file properties" \
+ "Show file properties" ;# <-- NOT TRANSLATED YET
+ ##ID:002048##
+ mcset $l "Add bookmark" \
+ "Add bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002049##
+ mcset $l "Bookmark the current folder" \
+ "Bookmark the current folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002050##
+ mcset $l "Edit bookmarks" \
+ "Edit bookmarks" ;# <-- NOT TRANSLATED YET
+ ##ID:002051##
+ mcset $l "Invoke bookmark editor" \
+ "Invoke bookmark editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002052##
+ mcset $l "Back in history" \
+ "Back in history" ;# <-- NOT TRANSLATED YET
+ ##ID:002053##
+ mcset $l "Forward in history" \
+ "Forward in history" ;# <-- NOT TRANSLATED YET
+ ##ID:002054##
+ mcset $l "Bookmark" \
+ "Bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002055##
+ mcset $l "Bookmark menu" \
+ "Bookmark menu" ;# <-- NOT TRANSLATED YET
+ ##ID:002056##
+ mcset $l "Current document folder" \
+ "Current document folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002057##
+ mcset $l "Go to directory containing the current document" \
+ "Go to directory containing the current document" ;# <-- NOT TRANSLATED YET
+ ##ID:002058##
+ mcset $l "Configure" \
+ "Configure" ;# <-- NOT TRANSLATED YET
+ ##ID:002059##
+ mcset $l "File system browser configuration menu" \
+ "File system browser configuration menu" ;# <-- NOT TRANSLATED YET
+ ##ID:002060##
+ mcset $l "Current directory" \
+ "Current directory" ;# <-- NOT TRANSLATED YET
+ ##ID:002061##
+ mcset $l "Directory location bar" \
+ "Directory location bar" ;# <-- NOT TRANSLATED YET
+ ##ID:002062##
+ mcset $l "Confirm directory location" \
+ "Confirm directory location" ;# <-- NOT TRANSLATED YET
+ ##ID:002063##
+ mcset $l "Filter" \
+ "Filter" ;# <-- NOT TRANSLATED YET
+ ##ID:002064##
+ mcset $l "File filter" \
+ "File filter" ;# <-- NOT TRANSLATED YET
+ ##ID:002065##
+ mcset $l "Invalid directory" \
+ "Invalid directory" ;# <-- NOT TRANSLATED YET
+ ##ID:002066##
+ mcset $l "The specified directory does not exist:\n%s" \
+ "The specified directory does not exist:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002067##
+ mcset $l "Unable to compile" \
+ "Unable to compile" ;# <-- NOT TRANSLATED YET
+ ##ID:002068##
+ mcset $l "Unable to open source file while simulator is engaged." \
+ "Unable to open source file while simulator is engaged." ;# <-- NOT TRANSLATED YET
+ ##ID:002069##
+ mcset $l "Open file %s" \
+ "Open file %s" ;# <-- NOT TRANSLATED YET
+ ##ID:002070##
+ mcset $l "This file does not look like a source code.\nDo you really want to open it ?" \
+ "This file does not look like a source code.\nDo you really want to open it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002071##
+ mcset $l "Permission denied" \
+ "Permission denied" ;# <-- NOT TRANSLATED YET
+ ##ID:002072##
+ mcset $l "Unable to rename file:\n%s" \
+ "Unable to rename file:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002073##
+ mcset $l "Do you really want to delete file:\n%s" \
+ "Do you really want to delete file:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002074##
+ mcset $l "Unable to remove file:\n%s" \
+ "Unable to remove file:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002075##
+ mcset $l "Create new folder in:\n%s" \
+ "Create new folder in:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002076##
+ mcset $l "Clear" \
+ "Clear" ;# <-- NOT TRANSLATED YET
+ ##ID:002077##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:002078##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:002079##
+ mcset $l "Unable to create folder" \
+ "Unable to create folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002080##
+ mcset $l "Unable to create the specified folder" \
+ "Unable to create the specified folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002081##
+ mcset $l "Directory" \
+ "Directory" ;# <-- NOT TRANSLATED YET
+ ##ID:002082##
+ mcset $l "File" \
+ "File" ;# <-- NOT TRANSLATED YET
+ ##ID:002083##
+ mcset $l "Unknown Error" \
+ "Unknown Error" ;# <-- NOT TRANSLATED YET
+ ##ID:002084##
+ mcset $l "This file apparently does not exist" \
+ "This file apparently does not exist" ;# <-- NOT TRANSLATED YET
+ ##ID:002085##
+ mcset $l "General" \
+ "General" ;# <-- NOT TRANSLATED YET
+ ##ID:002086##
+ mcset $l "Permissions" \
+ "Permissions" ;# <-- NOT TRANSLATED YET
+ ##ID:002087##
+ mcset $l "Name:" \
+ "Name:" ;# <-- NOT TRANSLATED YET
+ ##ID:002088##
+ mcset $l "Access permissions" \
+ "Access permissions" ;# <-- NOT TRANSLATED YET
+ ##ID:002089##
+ mcset $l "Ownership" \
+ "Ownership" ;# <-- NOT TRANSLATED YET
+ ##ID:002090##
+ mcset $l "Owner" \
+ "Owner" ;# <-- NOT TRANSLATED YET
+ ##ID:002091##
+ mcset $l "Group" \
+ "Group" ;# <-- NOT TRANSLATED YET
+ ##ID:002092##
+ mcset $l "Item properties" \
+ "Item properties" ;# <-- NOT TRANSLATED YET
+ ##ID:002093##
+ mcset $l "Unable to change permissions for file:\n%s" \
+ "Unable to change permissions for file:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002094##
+ mcset $l "Unable to rename file:\n%s\n\t=>\n%s" \
+ "Unable to rename file:\n%s\n\t=>\n%s" ;# <-- NOT TRANSLATED YET
+}
+# ihextools.tcl
+# ==============================================================================
+namespace eval IHexTools {
+ ##ID:002095##
+ mcset $l "Line contains invalid characters" \
+ "Line contains invalid characters" ;# <-- NOT TRANSLATED YET
+ ##ID:002096##
+ mcset $l "Line contains even number of characters" \
+ "Line contains even number of characters" ;# <-- NOT TRANSLATED YET
+ ##ID:002097##
+ mcset $l "Unknown record type '%s'" \
+ "Unknown record type '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002098##
+ mcset $l "Bad checksum" \
+ "Bad checksum" ;# <-- NOT TRANSLATED YET
+ ##ID:002099##
+ mcset $l "Bad length" \
+ "Bad length" ;# <-- NOT TRANSLATED YET
+ ##ID:002100##
+ mcset $l "Missing EOF" \
+ "Missing EOF" ;# <-- NOT TRANSLATED YET
+ ##ID:002101##
+ mcset $l "Data length exceeding limit 0x10000" \
+ "Data length exceeding limit 0x10000" ;# <-- NOT TRANSLATED YET
+ ##ID:002102##
+ mcset $l "Invalid address '%s'" \
+ "Invalid address '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002103##
+ mcset $l "Invalid line number '%s'" \
+ "Invalid line number '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002104##
+ mcset $l "Invalid data field" \
+ "Invalid data field" ;# <-- NOT TRANSLATED YET
+ ##ID:002105##
+ mcset $l "Error at line %s:\t" \
+ "Error at line %s:\t" ;# <-- NOT TRANSLATED YET
+}
+# project.tcl
+# ==============================================================================
+namespace eval Project {
+ ##ID:002106##
+ mcset $l "Project loading error" \
+ "Project loading error" ;# <-- NOT TRANSLATED YET
+ ##ID:002107##
+ mcset $l "ERROR:\nThe project file cannot be loaded correctly due to a xml parsing error. The file is either corrupted or it is not a project file acceptable by this environment." \
+ "ERROR:\nThe project file cannot be loaded correctly due to a xml parsing error. The file is either corrupted or it is not a project file acceptable by this environment." ;# <-- NOT TRANSLATED YET
+ ##ID:002108##
+ mcset $l "Converting old project file to new version" \
+ "Converting old project file to new version" ;# <-- NOT TRANSLATED YET
+}
+# simulator.tcl
+# ==============================================================================
+namespace eval Simulator {
+ ##ID:002109##
+ mcset $l "Simulator warning" \
+ "Simulator warning" ;# <-- NOT TRANSLATED YET
+ ##ID:002110##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:002111##
+ mcset $l "See simulator configuration dialog\nMain Menu -> Configure -> Simulator" \
+ "See simulator configuration dialog\nMain Menu -> Configure -> Simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:002112##
+ mcset $l "Do not show this dialog again" \
+ "Do not show this dialog again" ;# <-- NOT TRANSLATED YET
+ ##ID:002113##
+ mcset $l "PC:" \
+ "PC:" ;# <-- NOT TRANSLATED YET
+ ##ID:002114##
+ mcset $l "Line:" \
+ "Line:" ;# <-- NOT TRANSLATED YET
+ ##ID:002115##
+ mcset $l "File:" \
+ "File:" ;# <-- NOT TRANSLATED YET
+ ##ID:002116##
+ mcset $l "Invalid return from interrupt" \
+ "Invalid return from interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:002117##
+ mcset $l "Unable to initialize EEPROM programming cycle\nbecause EEMWE, RDYBSY and WRTINH must be set\n" \
+ "Unable to initialize EEPROM programming cycle\nbecause EEMWE, RDYBSY and WRTINH must be set\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002118##
+ mcset $l "Data EEPROM write cycle aborted\n" \
+ "Data EEPROM write cycle aborted\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002119##
+ mcset $l "Unable to read write-only register.\nRandom value returned.\n\nRegister:\t\t0x%s" \
+ "Unable to read write-only register.\nRandom value returned.\n\nRegister:\t\t0x%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002120##
+ mcset $l "Invalid instruction OP code\n" \
+ "Invalid instruction OP code\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002121##
+ mcset $l "Stack overflow\n" \
+ "Stack overflow\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002122##
+ mcset $l "Stack underflow\n" \
+ "Stack underflow\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002123##
+ mcset $l "WATCHDOG OVERFLOW\n" \
+ "WATCHDOG OVERFLOW\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002124##
+ mcset $l "Timer mode has been changed while timer was running.\nIt is important to stop timer/counter before changing modes.\n\nTimer number: %s\n" \
+ "Timer mode has been changed while timer was running.\nIt is important to stop timer/counter before changing modes.\n\nTimer number: %s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002125##
+ mcset $l "UART mode has been changed while UART was engaged.\n" \
+ "UART mode has been changed while UART was engaged.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002126##
+ mcset $l "UART: Frame discarded (according to MCS-51 manual)\n" \
+ "UART: Frame discarded (according to MCS-51 manual)\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002127##
+ mcset $l "Unable to access file:\n%s" \
+ "Unable to access file:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002128##
+ mcset $l "Permission denied" \
+ "Permission denied" ;# <-- NOT TRANSLATED YET
+ ##ID:002129##
+ mcset $l "Specified file does already exist,\ndo you want to overwrite it ?" \
+ "Specified file does already exist,\ndo you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002130##
+ mcset $l "Overwrite file ?" \
+ "Overwrite file ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002131##
+ mcset $l "Save error log - MCU 8051 IDE" \
+ "Save error log - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002132##
+ mcset $l "Undefined result - MCU 8051 IDE" \
+ "Undefined result - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002133##
+ mcset $l "Save as XHTML" \
+ "Save as XHTML" ;# <-- NOT TRANSLATED YET
+ ##ID:002134##
+ mcset $l "Log files" \
+ "Log files" ;# <-- NOT TRANSLATED YET
+ ##ID:002135##
+ mcset $l "HTML files" \
+ "HTML files" ;# <-- NOT TRANSLATED YET
+ ##ID:002136##
+ mcset $l "Save as plain text" \
+ "Save as plain text" ;# <-- NOT TRANSLATED YET
+ ##ID:002137##
+ mcset $l "\"Undefined result\"" \
+ "\"Undefined result\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002138##
+ mcset $l "Summary:" \
+ "Summary:" ;# <-- NOT TRANSLATED YET
+ ##ID:002139##
+ mcset $l "\nYour program tried access to register at address " \
+ "\nYour program tried access to register at address " ;# <-- NOT TRANSLATED YET
+ ##ID:002140##
+ mcset $l "\nYour program tried indirect access to register at address " \
+ "\nYour program tried indirect access to register at address " ;# <-- NOT TRANSLATED YET
+ ##ID:002141##
+ mcset $l "\nYour program tried direct access to register at address " \
+ "\nYour program tried direct access to register at address " ;# <-- NOT TRANSLATED YET
+ ##ID:002142##
+ mcset $l "CODE" \
+ "CODE" ;# <-- NOT TRANSLATED YET
+ ##ID:002143##
+ mcset $l "XDATA" \
+ "XDATA" ;# <-- NOT TRANSLATED YET
+ ##ID:002144##
+ mcset $l "Bit area" \
+ "Bit area" ;# <-- NOT TRANSLATED YET
+ ##ID:002145##
+ mcset $l "IDATA" \
+ "IDATA" ;# <-- NOT TRANSLATED YET
+ ##ID:002146##
+ mcset $l "SFR" \
+ "SFR" ;# <-- NOT TRANSLATED YET
+ ##ID:002147##
+ mcset $l "0x%s in program memory" \
+ "0x%s in program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002148##
+ mcset $l "0x%s in external data memory" \
+ "0x%s in external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002149##
+ mcset $l "0x%s in internal data memory" \
+ "0x%s in internal data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002150##
+ mcset $l "0x%s in bit addressable area" \
+ "0x%s in bit addressable area" ;# <-- NOT TRANSLATED YET
+ ##ID:002151##
+ mcset $l "0x%s in special function registers area" \
+ "0x%s in special function registers area" ;# <-- NOT TRANSLATED YET
+ ##ID:002152##
+ mcset $l ". This register is not implemented on this processor (" \
+ ". This register is not implemented on this processor (" ;# <-- NOT TRANSLATED YET
+ ##ID:002153##
+ mcset $l ") in this configuration. You can continue in simulation but result of this operation is undefined." \
+ ") in this configuration. You can continue in simulation but result of this operation is undefined." ;# <-- NOT TRANSLATED YET
+ ##ID:002154##
+ mcset $l "\n\nError details:" \
+ "\n\nError details:" ;# <-- NOT TRANSLATED YET
+ ##ID:002155##
+ mcset $l "\n\tTarget memory:\t\t" \
+ "\n\tTarget memory:\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002156##
+ mcset $l "\n\tTarget address: \t" \
+ "\n\tTarget address: \t" ;# <-- NOT TRANSLATED YET
+ ##ID:002157##
+ mcset $l "\n\tLine:\t\t\t" \
+ "\n\tLine:\t\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002158##
+ mcset $l "\n\tFile:\t\t\t" \
+ "\n\tFile:\t\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002159##
+ mcset $l "\n\tProject:\t\t" \
+ "\n\tProject:\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002160##
+ mcset $l "\n\nProcessor details:" \
+ "\n\nProcessor details:" ;# <-- NOT TRANSLATED YET
+ ##ID:002161##
+ mcset $l "\n\tType:\t\t\t" \
+ "\n\tType:\t\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002162##
+ mcset $l "\n\tRam size:\t\t" \
+ "\n\tRam size:\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002163##
+ mcset $l "\n\tProgram memory: \t" \
+ "\n\tProgram memory: \t" ;# <-- NOT TRANSLATED YET
+ ##ID:002164##
+ mcset $l "\n\tExternal memory:\t" \
+ "\n\tExternal memory:\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002165##
+ mcset $l "\n\tExpanded memory:\t" \
+ "\n\tExpanded memory:\t" ;# <-- NOT TRANSLATED YET
+}
+# ledmatrix.tcl
+# ==============================================================================
+namespace eval LedMatrix {
+ ##ID:002166##
+ mcset $l "Fade out interval" \
+ "Fade out interval" ;# <-- NOT TRANSLATED YET
+ ##ID:002167##
+ mcset $l "dim_interval_changed" \
+ "dim_interval_changed" ;# <-- NOT TRANSLATED YET
+ ##ID:002168##
+ mcset $l "Set LED dim interval to 0 instruction cycles" \
+ "Set LED dim interval to 0 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002169##
+ mcset $l "Set LED dim interval to 5 instruction cycles" \
+ "Set LED dim interval to 5 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002170##
+ mcset $l "Set LED dim interval to 10 instruction cycles" \
+ "Set LED dim interval to 10 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002171##
+ mcset $l "Set LED dim interval to 20 instruction cycles" \
+ "Set LED dim interval to 20 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002172##
+ mcset $l "Set LED dim interval to 50 instruction cycles" \
+ "Set LED dim interval to 50 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002173##
+ mcset $l "Set LED dim interval to 100 instruction cycles" \
+ "Set LED dim interval to 100 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002174##
+ mcset $l "Set LED dim interval to 200 instruction cycles" \
+ "Set LED dim interval to 200 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002175##
+ mcset $l "Set LED dim interval to 500 instruction cycles" \
+ "Set LED dim interval to 500 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002176##
+ mcset $l "Set LED dim interval to 1000 instruction cycles" \
+ "Set LED dim interval to 1000 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002177##
+ mcset $l "Mapping" \
+ "Mapping" ;# <-- NOT TRANSLATED YET
+ ##ID:002178##
+ mcset $l "Random" \
+ "Random" ;# <-- NOT TRANSLATED YET
+ ##ID:002179##
+ mcset $l "Random access to the matrix (default)" \
+ "Random access to the matrix (default)" ;# <-- NOT TRANSLATED YET
+ ##ID:002180##
+ mcset $l "Row" \
+ "Row" ;# <-- NOT TRANSLATED YET
+ ##ID:002181##
+ mcset $l "When a particular row is activated, it's previous state is forgotten" \
+ "When a particular row is activated, it's previous state is forgotten" ;# <-- NOT TRANSLATED YET
+ ##ID:002182##
+ mcset $l "Column" \
+ "Column" ;# <-- NOT TRANSLATED YET
+ ##ID:002183##
+ mcset $l "When a particular column is activated, it's previous state is forgotten" \
+ "When a particular column is activated, it's previous state is forgotten" ;# <-- NOT TRANSLATED YET
+ ##ID:002184##
+ mcset $l "Color" \
+ "Color" ;# <-- NOT TRANSLATED YET
+ ##ID:002185##
+ mcset $l "Red" \
+ "Red" ;# <-- NOT TRANSLATED YET
+ ##ID:002186##
+ mcset $l "Orange" \
+ "Orange" ;# <-- NOT TRANSLATED YET
+ ##ID:002187##
+ mcset $l "Yellow" \
+ "Yellow" ;# <-- NOT TRANSLATED YET
+ ##ID:002188##
+ mcset $l "Green" \
+ "Green" ;# <-- NOT TRANSLATED YET
+ ##ID:002189##
+ mcset $l "Blue" \
+ "Blue" ;# <-- NOT TRANSLATED YET
+ ##ID:002190##
+ mcset $l "Purple" \
+ "Purple" ;# <-- NOT TRANSLATED YET
+ ##ID:002191##
+ mcset $l "Light up when" \
+ "Light up when" ;# <-- NOT TRANSLATED YET
+ ##ID:002192##
+ mcset $l "Row 0 & Column 0" \
+ "Row 0 & Column 0" ;# <-- NOT TRANSLATED YET
+ ##ID:002193##
+ mcset $l "Light up LED when both wires are in low" \
+ "Light up LED when both wires are in low" ;# <-- NOT TRANSLATED YET
+ ##ID:002194##
+ mcset $l "Row 0 & Column 1" \
+ "Row 0 & Column 1" ;# <-- NOT TRANSLATED YET
+ ##ID:002195##
+ mcset $l "Light up LED when row wire is in low and column wire is in high" \
+ "Light up LED when row wire is in low and column wire is in high" ;# <-- NOT TRANSLATED YET
+ ##ID:002196##
+ mcset $l "Row 1 & Column 0" \
+ "Row 1 & Column 0" ;# <-- NOT TRANSLATED YET
+ ##ID:002197##
+ mcset $l "Light up LED when row wire is in high and column wire is in low" \
+ "Light up LED when row wire is in high and column wire is in low" ;# <-- NOT TRANSLATED YET
+ ##ID:002198##
+ mcset $l "Row 1 & Column 1" \
+ "Row 1 & Column 1" ;# <-- NOT TRANSLATED YET
+ ##ID:002199##
+ mcset $l "Light up LED when both wires are in high" \
+ "Light up LED when both wires are in high" ;# <-- NOT TRANSLATED YET
+ ##ID:002200##
+ mcset $l "All fade out" \
+ "All fade out" ;# <-- NOT TRANSLATED YET
+ ##ID:002201##
+ mcset $l "Dim all LEDs" \
+ "Dim all LEDs" ;# <-- NOT TRANSLATED YET
+ ##ID:002202##
+ mcset $l "Show help" \
+ "Show help" ;# <-- NOT TRANSLATED YET
+ ##ID:002203##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002204##
+ mcset $l "Save configuration" \
+ "Save configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002205##
+ mcset $l "Save configuration into a file" \
+ "Save configuration into a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002206##
+ mcset $l "Load configuration" \
+ "Load configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002207##
+ mcset $l "Load configuration from a file" \
+ "Load configuration from a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002208##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002209##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002210##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002211##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002212##
+ mcset $l "Configure" \
+ "Configure" ;# <-- NOT TRANSLATED YET
+ ##ID:002213##
+ mcset $l "LED matrix" \
+ "LED matrix" ;# <-- NOT TRANSLATED YET
+ ##ID:002214##
+ mcset $l "This tool consists of 64 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Condition on which a LED lights up and LED colors are configurable. Also fade out interval is configurable.\n\n" \
+ "This tool consists of 64 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Condition on which a LED lights up and LED colors are configurable. Also fade out interval is configurable.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002215##
+ mcset $l "LED states:" \
+ "LED states:" ;# <-- NOT TRANSLATED YET
+ ##ID:002216##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002217##
+ mcset $l " Off\n " \
+ " Off\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002218##
+ mcset $l " Fast blinking\n " \
+ " Fast blinking\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002219##
+ mcset $l " Shining\n " \
+ " Shining\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002220##
+ mcset $l " Fading out" \
+ " Fading out" ;# <-- NOT TRANSLATED YET
+}
+# leddisplay.tcl
+# ==============================================================================
+namespace eval LedDisplay {
+ ##ID:002221##
+ mcset $l "Common electrode" \
+ "Common electrode" ;# <-- NOT TRANSLATED YET
+ ##ID:002222##
+ mcset $l "Common anode" \
+ "Common anode" ;# <-- NOT TRANSLATED YET
+ ##ID:002223##
+ mcset $l "Common cathode" \
+ "Common cathode" ;# <-- NOT TRANSLATED YET
+ ##ID:002224##
+ mcset $l "Color" \
+ "Color" ;# <-- NOT TRANSLATED YET
+ ##ID:002225##
+ mcset $l "Red" \
+ "Red" ;# <-- NOT TRANSLATED YET
+ ##ID:002226##
+ mcset $l "Orange" \
+ "Orange" ;# <-- NOT TRANSLATED YET
+ ##ID:002227##
+ mcset $l "Yellow" \
+ "Yellow" ;# <-- NOT TRANSLATED YET
+ ##ID:002228##
+ mcset $l "Green" \
+ "Green" ;# <-- NOT TRANSLATED YET
+ ##ID:002229##
+ mcset $l "Blue" \
+ "Blue" ;# <-- NOT TRANSLATED YET
+ ##ID:002230##
+ mcset $l "Purple" \
+ "Purple" ;# <-- NOT TRANSLATED YET
+ ##ID:002231##
+ mcset $l "Show help" \
+ "Show help" ;# <-- NOT TRANSLATED YET
+ ##ID:002232##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002233##
+ mcset $l "Save configuration" \
+ "Save configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002234##
+ mcset $l "Save configuration into a file" \
+ "Save configuration into a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002235##
+ mcset $l "Load configuration" \
+ "Load configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002236##
+ mcset $l "Load configuration from a file" \
+ "Load configuration from a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002237##
+ mcset $l "LED Display" \
+ "LED Display" ;# <-- NOT TRANSLATED YET
+ ##ID:002238##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002239##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002240##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002241##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002242##
+ mcset $l "Configure" \
+ "Configure" ;# <-- NOT TRANSLATED YET
+ ##ID:002243##
+ mcset $l "Virtual LED display with common anode (default) or cathode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later.\n\n" \
+ "Virtual LED display with common anode (default) or cathode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002244##
+ mcset $l "LED states:" \
+ "LED states:" ;# <-- NOT TRANSLATED YET
+ ##ID:002245##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002246##
+ mcset $l " Off\n " \
+ " Off\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002247##
+ mcset $l " Fast blinking\n " \
+ " Fast blinking\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002248##
+ mcset $l " Shining\n " \
+ " Shining\n " ;# <-- NOT TRANSLATED YET
+}
+# ledpanel.tcl
+# ==============================================================================
+namespace eval LedPanel {
+ ##ID:002249##
+ mcset $l "Color" \
+ "Color" ;# <-- NOT TRANSLATED YET
+ ##ID:002250##
+ mcset $l "Red" \
+ "Red" ;# <-- NOT TRANSLATED YET
+ ##ID:002251##
+ mcset $l "Orange" \
+ "Orange" ;# <-- NOT TRANSLATED YET
+ ##ID:002252##
+ mcset $l "Yellow" \
+ "Yellow" ;# <-- NOT TRANSLATED YET
+ ##ID:002253##
+ mcset $l "Green" \
+ "Green" ;# <-- NOT TRANSLATED YET
+ ##ID:002254##
+ mcset $l "Blue" \
+ "Blue" ;# <-- NOT TRANSLATED YET
+ ##ID:002255##
+ mcset $l "Purple" \
+ "Purple" ;# <-- NOT TRANSLATED YET
+ ##ID:002256##
+ mcset $l "Show help" \
+ "Show help" ;# <-- NOT TRANSLATED YET
+ ##ID:002257##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002258##
+ mcset $l "Save configuration" \
+ "Save configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002259##
+ mcset $l "Save configuration into a file" \
+ "Save configuration into a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002260##
+ mcset $l "Load configuration" \
+ "Load configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002261##
+ mcset $l "Load configuration from a file" \
+ "Load configuration from a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002262##
+ mcset $l "LED panel" \
+ "LED panel" ;# <-- NOT TRANSLATED YET
+ ##ID:002263##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002264##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002265##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002266##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002267##
+ mcset $l "Configure" \
+ "Configure" ;# <-- NOT TRANSLATED YET
+ ##ID:002268##
+ mcset $l "This tool consists of 8 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. LED colors are configurable.\n\n" \
+ "This tool consists of 8 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. LED colors are configurable.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002269##
+ mcset $l "LED states:" \
+ "LED states:" ;# <-- NOT TRANSLATED YET
+ ##ID:002270##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002271##
+ mcset $l " Off\n " \
+ " Off\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002272##
+ mcset $l " Fast blinking\n " \
+ " Fast blinking\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002273##
+ mcset $l " Shining" \
+ " Shining" ;# <-- NOT TRANSLATED YET
+}
+# matrixkeypad.tcl
+# ==============================================================================
+namespace eval MatrixKeyPad {
+ ##ID:002274##
+ mcset $l "Radio buttons" \
+ "Radio buttons" ;# <-- NOT TRANSLATED YET
+ ##ID:002275##
+ mcset $l "Show help" \
+ "Show help" ;# <-- NOT TRANSLATED YET
+ ##ID:002276##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002277##
+ mcset $l "Save configuration" \
+ "Save configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002278##
+ mcset $l "Save configuration into a file" \
+ "Save configuration into a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002279##
+ mcset $l "Load configuration" \
+ "Load configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002280##
+ mcset $l "Load configuration from a file" \
+ "Load configuration from a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002281##
+ mcset $l "Matrix Keypad" \
+ "Matrix Keypad" ;# <-- NOT TRANSLATED YET
+ ##ID:002282##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002283##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002284##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002285##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002286##
+ mcset $l "Configure" \
+ "Configure" ;# <-- NOT TRANSLATED YET
+ ##ID:002287##
+ mcset $l "This tool consists of 16 switches connected in matrix. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n" \
+ "This tool consists of 16 switches connected in matrix. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002288##
+ mcset $l "Keypad can be configured in two ways:" \
+ "Keypad can be configured in two ways:" ;# <-- NOT TRANSLATED YET
+ ##ID:002289##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002290##
+ mcset $l "1)" \
+ "1)" ;# <-- NOT TRANSLATED YET
+ ##ID:002291##
+ mcset $l " To allow key combinations\n Menu -> Check \"Radio buttons\"\n " \
+ " To allow key combinations\n Menu -> Check \"Radio buttons\"\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002292##
+ mcset $l "2)" \
+ "2)" ;# <-- NOT TRANSLATED YET
+ ##ID:002293##
+ mcset $l " To do not allow key combinations\n Menu -> Uncheck \"Radio buttons\"" \
+ " To do not allow key combinations\n Menu -> Uncheck \"Radio buttons\"" ;# <-- NOT TRANSLATED YET
+}
+# simplekeypad.tcl
+# ==============================================================================
+namespace eval SimpleKeyPad {
+ ##ID:002294##
+ mcset $l "Simple Keypad" \
+ "Simple Keypad" ;# <-- NOT TRANSLATED YET
+ ##ID:002295##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002296##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002297##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002298##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002299##
+ mcset $l "Configure" \
+ "Configure" ;# <-- NOT TRANSLATED YET
+ ##ID:002300##
+ mcset $l "Radio buttons" \
+ "Radio buttons" ;# <-- NOT TRANSLATED YET
+ ##ID:002301##
+ mcset $l "Show help" \
+ "Show help" ;# <-- NOT TRANSLATED YET
+ ##ID:002302##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002303##
+ mcset $l "Save configuration" \
+ "Save configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002304##
+ mcset $l "Save configuration into a file" \
+ "Save configuration into a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002305##
+ mcset $l "Load configuration" \
+ "Load configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002306##
+ mcset $l "Load configuration from a file" \
+ "Load configuration from a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002307##
+ mcset $l "This tool consists of 8 switches. Each of them can connect any port pin of the simulated uC to ground. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n" \
+ "This tool consists of 8 switches. Each of them can connect any port pin of the simulated uC to ground. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002308##
+ mcset $l "Keypad can be configured in two ways:" \
+ "Keypad can be configured in two ways:" ;# <-- NOT TRANSLATED YET
+ ##ID:002309##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002310##
+ mcset $l "1)" \
+ "1)" ;# <-- NOT TRANSLATED YET
+ ##ID:002311##
+ mcset $l " To allow key combinations\n Menu -> Check \"Radio buttons\"\n " \
+ " To allow key combinations\n Menu -> Check \"Radio buttons\"\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002312##
+ mcset $l "2)" \
+ "2)" ;# <-- NOT TRANSLATED YET
+ ##ID:002313##
+ mcset $l " To do not allow key combinations\n Menu -> Uncheck \"Radio buttons\"" \
+ " To do not allow key combinations\n Menu -> Uncheck \"Radio buttons\"" ;# <-- NOT TRANSLATED YET
+}
+# multiplexedleddisplay.tcl
+# ==============================================================================
+namespace eval MultiplexedLedDisplay {
+ ##ID:002314##
+ mcset $l "Common electrode" \
+ "Common electrode" ;# <-- NOT TRANSLATED YET
+ ##ID:002315##
+ mcset $l "Common anode" \
+ "Common anode" ;# <-- NOT TRANSLATED YET
+ ##ID:002316##
+ mcset $l "Common cathode" \
+ "Common cathode" ;# <-- NOT TRANSLATED YET
+ ##ID:002317##
+ mcset $l "Fade out interval" \
+ "Fade out interval" ;# <-- NOT TRANSLATED YET
+ ##ID:002318##
+ mcset $l "Set LED dim interval to 0 instruction cycles" \
+ "Set LED dim interval to 0 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002319##
+ mcset $l "Set LED dim interval to 5 instruction cycles" \
+ "Set LED dim interval to 5 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002320##
+ mcset $l "Set LED dim interval to 10 instruction cycles" \
+ "Set LED dim interval to 10 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002321##
+ mcset $l "Set LED dim interval to 20 instruction cycles" \
+ "Set LED dim interval to 20 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002322##
+ mcset $l "Set LED dim interval to 50 instruction cycles" \
+ "Set LED dim interval to 50 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002323##
+ mcset $l "Set LED dim interval to 100 instruction cycles" \
+ "Set LED dim interval to 100 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002324##
+ mcset $l "Set LED dim interval to 200 instruction cycles" \
+ "Set LED dim interval to 200 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002325##
+ mcset $l "Set LED dim interval to 500 instruction cycles" \
+ "Set LED dim interval to 500 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002326##
+ mcset $l "Set LED dim interval to 1000 instruction cycles" \
+ "Set LED dim interval to 1000 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002327##
+ mcset $l "All fade out" \
+ "All fade out" ;# <-- NOT TRANSLATED YET
+ ##ID:002328##
+ mcset $l "Dim all LEDs" \
+ "Dim all LEDs" ;# <-- NOT TRANSLATED YET
+ ##ID:002329##
+ mcset $l "Color" \
+ "Color" ;# <-- NOT TRANSLATED YET
+ ##ID:002330##
+ mcset $l "Red" \
+ "Red" ;# <-- NOT TRANSLATED YET
+ ##ID:002331##
+ mcset $l "Orange" \
+ "Orange" ;# <-- NOT TRANSLATED YET
+ ##ID:002332##
+ mcset $l "Yellow" \
+ "Yellow" ;# <-- NOT TRANSLATED YET
+ ##ID:002333##
+ mcset $l "Green" \
+ "Green" ;# <-- NOT TRANSLATED YET
+ ##ID:002334##
+ mcset $l "Blue" \
+ "Blue" ;# <-- NOT TRANSLATED YET
+ ##ID:002335##
+ mcset $l "Purple" \
+ "Purple" ;# <-- NOT TRANSLATED YET
+ ##ID:002336##
+ mcset $l "Show help" \
+ "Show help" ;# <-- NOT TRANSLATED YET
+ ##ID:002337##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002338##
+ mcset $l "Save configuration" \
+ "Save configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002339##
+ mcset $l "Save configuration into a file" \
+ "Save configuration into a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002340##
+ mcset $l "Load configuration" \
+ "Load configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002341##
+ mcset $l "Load configuration from a file" \
+ "Load configuration from a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002342##
+ mcset $l "Multiplexed LED display" \
+ "Multiplexed LED display" ;# <-- NOT TRANSLATED YET
+ ##ID:002343##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002344##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002345##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002346##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002347##
+ mcset $l "Configure" \
+ "Configure" ;# <-- NOT TRANSLATED YET
+ ##ID:002348##
+ mcset $l "Virtual Multiplexed LED Display with common anode (default) or cathode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. LED fade out interval and LED colors are configurable.\n\n" \
+ "Virtual Multiplexed LED Display with common anode (default) or cathode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. LED fade out interval and LED colors are configurable.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002349##
+ mcset $l "LED states:" \
+ "LED states:" ;# <-- NOT TRANSLATED YET
+ ##ID:002350##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002351##
+ mcset $l " Off\n " \
+ " Off\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002352##
+ mcset $l " Fast blinking\n " \
+ " Fast blinking\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002353##
+ mcset $l " Shining\n " \
+ " Shining\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002354##
+ mcset $l " Fading out\n " \
+ " Fading out\n " ;# <-- NOT TRANSLATED YET
+}
+# virtual_hw_component.tcl
+# ==============================================================================
+namespace eval VirtualHWComponent {
+ ##ID:002355##
+ mcset $l "Component modified" \
+ "Component modified" ;# <-- NOT TRANSLATED YET
+ ##ID:002356##
+ mcset $l "Do you want to save the configuration of this panel before closing?" \
+ "Do you want to save the configuration of this panel before closing?" ;# <-- NOT TRANSLATED YET
+ ##ID:002357##
+ mcset $l "Save configuration" \
+ "Save configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002358##
+ mcset $l "Load configuration" \
+ "Load configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:002359##
+ mcset $l "Overwrite file" \
+ "Overwrite file" ;# <-- NOT TRANSLATED YET
+ ##ID:002360##
+ mcset $l "A file with name '%s' already exists. Do you want to overwrite it ?" \
+ "A file with name '%s' already exists. Do you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002361##
+ mcset $l "IO Error" \
+ "IO Error" ;# <-- NOT TRANSLATED YET
+ ##ID:002362##
+ mcset $l "Unable to write to file:\n\"%s\"" \
+ "Unable to write to file:\n\"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002363##
+ mcset $l "Unable to read file:\n\"%s\"" \
+ "Unable to read file:\n\"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002364##
+ mcset $l "Unable to read configuration from file:\n\"%s\"" \
+ "Unable to read configuration from file:\n\"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002365##
+ mcset $l "File corrupted" \
+ "File corrupted" ;# <-- NOT TRANSLATED YET
+ ##ID:002366##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:002367##
+ mcset $l "Wire colors:" \
+ "Wire colors:" ;# <-- NOT TRANSLATED YET
+ ##ID:002368##
+ mcset $l "ON" \
+ "ON" ;# <-- NOT TRANSLATED YET
+ ##ID:002369##
+ mcset $l "OFF" \
+ "OFF" ;# <-- NOT TRANSLATED YET
+ ##ID:002370##
+ mcset $l "VH component" \
+ "VH component" ;# <-- NOT TRANSLATED YET
+}
+# hwmanager.tcl
+# ==============================================================================
+namespace eval HwManager {
+ ##ID:002371##
+ mcset $l "HW:" \
+ "HW:" ;# <-- NOT TRANSLATED YET
+ ##ID:002372##
+ mcset $l "available/installed plugins" \
+ "available/installed plugins" ;# <-- NOT TRANSLATED YET
+ ##ID:002373##
+ mcset $l "List available or installed HW plugins" \
+ "List available or installed HW plugins" ;# <-- NOT TRANSLATED YET
+ ##ID:002374##
+ mcset $l "Refresh list available or installed HW plugins" \
+ "Refresh list available or installed HW plugins" ;# <-- NOT TRANSLATED YET
+ ##ID:002375##
+ mcset $l "Refresh" \
+ "Refresh" ;# <-- NOT TRANSLATED YET
+ ##ID:002376##
+ mcset $l "Too old version" \
+ "Too old version" ;# <-- NOT TRANSLATED YET
+ ##ID:002377##
+ mcset $l "Plugin %s requires MCU 8051 IDE version %s and above, please upgrade your MCU 8051 IDE" \
+ "Plugin %s requires MCU 8051 IDE version %s and above, please upgrade your MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002378##
+ mcset $l "PLUGIN ERROR" \
+ "PLUGIN ERROR" ;# <-- NOT TRANSLATED YET
+ ##ID:002379##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:002380##
+ mcset $l "Plugin name:\t%s\n" \
+ "Plugin name:\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002381##
+ mcset $l "Plugin version:\t%s\n" \
+ "Plugin version:\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002382##
+ mcset $l "Author:\t\t%s <%s>\n" \
+ "Author:\t\t%s <%s>\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002383##
+ mcset $l "PLUGIN ERROR - MCU 8051 IDE" \
+ "PLUGIN ERROR - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002384##
+ mcset $l "Hardware is busy" \
+ "Hardware is busy" ;# <-- NOT TRANSLATED YET
+ ##ID:002385##
+ mcset $l "Plugin \"%s\" is busy.\nDo you really want to close the program ?" \
+ "Plugin \"%s\" is busy.\nDo you really want to close the program ?" ;# <-- NOT TRANSLATED YET
+}
+# graph.tcl
+# ==============================================================================
+namespace eval Graph {
+ ##ID:002386##
+ mcset $l "ON" \
+ "ON" ;# <-- NOT TRANSLATED YET
+ ##ID:002387##
+ mcset $l "OFF" \
+ "OFF" ;# <-- NOT TRANSLATED YET
+ ##ID:002388##
+ mcset $l "True state" \
+ "True state" ;# <-- NOT TRANSLATED YET
+ ##ID:002389##
+ mcset $l "Port latches" \
+ "Port latches" ;# <-- NOT TRANSLATED YET
+ ##ID:002390##
+ mcset $l "True output" \
+ "True output" ;# <-- NOT TRANSLATED YET
+ ##ID:002391##
+ mcset $l "Legend" \
+ "Legend" ;# <-- NOT TRANSLATED YET
+ ##ID:002392##
+ mcset $l "Turn graph on/off" \
+ "Turn graph on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002393##
+ mcset $l "Enable/Disable graph" \
+ "Enable/Disable graph" ;# <-- NOT TRANSLATED YET
+ ##ID:002394##
+ mcset $l "Change grid" \
+ "Change grid" ;# <-- NOT TRANSLATED YET
+ ##ID:002395##
+ mcset $l "Change grid morphology" \
+ "Change grid morphology" ;# <-- NOT TRANSLATED YET
+ ##ID:002396##
+ mcset $l "Change bit length on X axis to a lower value" \
+ "Change bit length on X axis to a lower value" ;# <-- NOT TRANSLATED YET
+ ##ID:002397##
+ mcset $l "Zoom in (X axis)" \
+ "Zoom in (X axis)" ;# <-- NOT TRANSLATED YET
+ ##ID:002398##
+ mcset $l "Change bit length on X axis to a higher value" \
+ "Change bit length on X axis to a higher value" ;# <-- NOT TRANSLATED YET
+ ##ID:002399##
+ mcset $l "Zoom out (X axis)" \
+ "Zoom out (X axis)" ;# <-- NOT TRANSLATED YET
+ ##ID:002400##
+ mcset $l "Clear user marks" \
+ "Clear user marks" ;# <-- NOT TRANSLATED YET
+ ##ID:002401##
+ mcset $l "Clear marks" \
+ "Clear marks" ;# <-- NOT TRANSLATED YET
+ ##ID:002402##
+ mcset $l "-- click to close --" \
+ "-- click to close --" ;# <-- NOT TRANSLATED YET
+ ##ID:002403##
+ mcset $l "Log. 1 forced to log. 0" \
+ "Log. 1 forced to log. 0" ;# <-- NOT TRANSLATED YET
+ ##ID:002404##
+ mcset $l "Not connected" \
+ "Not connected" ;# <-- NOT TRANSLATED YET
+ ##ID:002405##
+ mcset $l "Access to external memory" \
+ "Access to external memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002406##
+ mcset $l "Indeterminable state" \
+ "Indeterminable state" ;# <-- NOT TRANSLATED YET
+ ##ID:002407##
+ mcset $l "No voltage" \
+ "No voltage" ;# <-- NOT TRANSLATED YET
+ ##ID:002408##
+ mcset $l "Log. 1" \
+ "Log. 1" ;# <-- NOT TRANSLATED YET
+ ##ID:002409##
+ mcset $l "Log. 0" \
+ "Log. 0" ;# <-- NOT TRANSLATED YET
+}
+# graphwidget.tcl
+# ==============================================================================
+namespace eval GraphWidget {
+ ##ID:002410##
+ mcset $l "ON/OFF" \
+ "ON/OFF" ;# <-- NOT TRANSLATED YET
+ ##ID:002411##
+ mcset $l "Enable/Disable graph" \
+ "Enable/Disable graph" ;# <-- NOT TRANSLATED YET
+ ##ID:002412##
+ mcset $l "Change grid" \
+ "Change grid" ;# <-- NOT TRANSLATED YET
+ ##ID:002413##
+ mcset $l "Change grid morphology" \
+ "Change grid morphology" ;# <-- NOT TRANSLATED YET
+ ##ID:002414##
+ mcset $l "Zoom in" \
+ "Zoom in" ;# <-- NOT TRANSLATED YET
+ ##ID:002415##
+ mcset $l "Change bit length on X axis to a lower value" \
+ "Change bit length on X axis to a lower value" ;# <-- NOT TRANSLATED YET
+ ##ID:002416##
+ mcset $l "Zoom out" \
+ "Zoom out" ;# <-- NOT TRANSLATED YET
+ ##ID:002417##
+ mcset $l "Change bit length on X axis to a higher value" \
+ "Change bit length on X axis to a higher value" ;# <-- NOT TRANSLATED YET
+ ##ID:002418##
+ mcset $l "Remove marks" \
+ "Remove marks" ;# <-- NOT TRANSLATED YET
+ ##ID:002419##
+ mcset $l "Clear user marks" \
+ "Clear user marks" ;# <-- NOT TRANSLATED YET
+ ##ID:002420##
+ mcset $l "Performance warning" \
+ "Performance warning" ;# <-- NOT TRANSLATED YET
+ ##ID:002421##
+ mcset $l "You have just enabled simulation of external devices. Having this feature enabled causes serious reduction of simulator performance, the number of instructions executed per second in real time usually decreases by a factor of hundreds, maybe even thousands." \
+ "You have just enabled simulation of external devices. Having this feature enabled causes serious reduction of simulator performance, the number of instructions executed per second in real time usually decreases by a factor of hundreds, maybe even thousands." ;# <-- NOT TRANSLATED YET
+ ##ID:004480##
+ mcset $l "Do not display again" \
+ "Do not display again" ;# <-- NOT TRANSLATED YET
+}
+# hexeditdlg.tcl
+# ==============================================================================
+namespace eval HexEditDlg {
+ ##ID:002422##
+ mcset $l "LJMP this_address" \
+ "LJMP this_address" ;# <-- NOT TRANSLATED YET
+ ##ID:002423##
+ mcset $l "LCALL this_address" \
+ "LCALL this_address" ;# <-- NOT TRANSLATED YET
+ ##ID:002424##
+ mcset $l "Code memory" \
+ "Code memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002425##
+ mcset $l "Expanded RAM" \
+ "Expanded RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:002426##
+ mcset $l "Data EEPROM" \
+ "Data EEPROM" ;# <-- NOT TRANSLATED YET
+ ##ID:002427##
+ mcset $l "XDATA memory" \
+ "XDATA memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002428##
+ mcset $l "untitled" \
+ "untitled" ;# <-- NOT TRANSLATED YET
+ ##ID:002429##
+ mcset $l "Hexadecimal editor" \
+ "Hexadecimal editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002430##
+ mcset $l "Load IHEX8 file" \
+ "Load IHEX8 file" ;# <-- NOT TRANSLATED YET
+ ##ID:002431##
+ mcset $l "Open file" \
+ "Open file" ;# <-- NOT TRANSLATED YET
+ ##ID:002432##
+ mcset $l "Save current data to IHEX8 file" \
+ "Save current data to IHEX8 file" ;# <-- NOT TRANSLATED YET
+ ##ID:002433##
+ mcset $l "Save file" \
+ "Save file" ;# <-- NOT TRANSLATED YET
+ ##ID:002434##
+ mcset $l "Save current data to IHEX8 file under a different name" \
+ "Save current data to IHEX8 file under a different name" ;# <-- NOT TRANSLATED YET
+ ##ID:002435##
+ mcset $l "Save as" \
+ "Save as" ;# <-- NOT TRANSLATED YET
+ ##ID:002436##
+ mcset $l "Reload data from simulator" \
+ "Reload data from simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:002437##
+ mcset $l "Reload" \
+ "Reload" ;# <-- NOT TRANSLATED YET
+ ##ID:002438##
+ mcset $l "Exit editor" \
+ "Exit editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002439##
+ mcset $l "Exit" \
+ "Exit" ;# <-- NOT TRANSLATED YET
+ ##ID:002440##
+ mcset $l "Current view mode" \
+ "Current view mode" ;# <-- NOT TRANSLATED YET
+ ##ID:002441##
+ mcset $l "View mode" \
+ "View mode" ;# <-- NOT TRANSLATED YET
+ ##ID:002442##
+ mcset $l "VALUE" \
+ "VALUE" ;# <-- NOT TRANSLATED YET
+ ##ID:002443##
+ mcset $l "ADDRESS" \
+ "ADDRESS" ;# <-- NOT TRANSLATED YET
+ ##ID:002444##
+ mcset $l "DEC: " \
+ "DEC: " ;# <-- NOT TRANSLATED YET
+ ##ID:002445##
+ mcset $l "OCT: " \
+ "OCT: " ;# <-- NOT TRANSLATED YET
+ ##ID:002446##
+ mcset $l "HEX: " \
+ "HEX: " ;# <-- NOT TRANSLATED YET
+ ##ID:002447##
+ mcset $l "BIN: " \
+ "BIN: " ;# <-- NOT TRANSLATED YET
+ ##ID:002448##
+ mcset $l "LJMP" \
+ "LJMP" ;# <-- NOT TRANSLATED YET
+ ##ID:002449##
+ mcset $l "Perform program jump" \
+ "Perform program jump" ;# <-- NOT TRANSLATED YET
+ ##ID:002450##
+ mcset $l "Program jump" \
+ "Program jump" ;# <-- NOT TRANSLATED YET
+ ##ID:002451##
+ mcset $l "LCALL" \
+ "LCALL" ;# <-- NOT TRANSLATED YET
+ ##ID:002452##
+ mcset $l "Perform subprogram call" \
+ "Perform subprogram call" ;# <-- NOT TRANSLATED YET
+ ##ID:002453##
+ mcset $l "Subprogram call" \
+ "Subprogram call" ;# <-- NOT TRANSLATED YET
+ ##ID:002454##
+ mcset $l "Cursor:" \
+ "Cursor:" ;# <-- NOT TRANSLATED YET
+ ##ID:002455##
+ mcset $l "Address of entry under mouse cursor" \
+ "Address of entry under mouse cursor" ;# <-- NOT TRANSLATED YET
+ ##ID:002456##
+ mcset $l "Line\t%s:\tInvalid characters\n" \
+ "Line\t%s:\tInvalid characters\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002457##
+ mcset $l "Line\t%s:\tInvalid chceksum\n" \
+ "Line\t%s:\tInvalid chceksum\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002458##
+ mcset $l "Line\t%s:\tInvalid length\n" \
+ "Line\t%s:\tInvalid length\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002459##
+ mcset $l "Line\t%s:\tUnknown record type: '%s'\n" \
+ "Line\t%s:\tUnknown record type: '%s'\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002460##
+ mcset $l "Line\t%s:\tMissing EOF" \
+ "Line\t%s:\tMissing EOF" ;# <-- NOT TRANSLATED YET
+ ##ID:002461##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:002462##
+ mcset $l "Error(s) occurred while parsing IHEX file" \
+ "Error(s) occurred while parsing IHEX file" ;# <-- NOT TRANSLATED YET
+ ##ID:002463##
+ mcset $l "File modified" \
+ "File modified" ;# <-- NOT TRANSLATED YET
+ ##ID:002464##
+ mcset $l "File %s has been modifed.\nDo you want to save it ?" \
+ "File %s has been modifed.\nDo you want to save it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:004536##
+ mcset $l "Content of the hex editor has been changed.\nDo you really want to reload without saving it?" \
+ "Content of the hex editor has been changed.\nDo you really want to reload without saving it?" ;# <-- NOT TRANSLATED YET
+ ##ID:002465##
+ mcset $l "Save file - MCU 8051 IDE" \
+ "Save file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002466##
+ mcset $l "Open file - MCU 8051 IDE" \
+ "Open file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002467##
+ mcset $l "Permission denied" \
+ "Permission denied" ;# <-- NOT TRANSLATED YET
+ ##ID:002468##
+ mcset $l "Unable to open file:\n%s" \
+ "Unable to open file:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002469##
+ mcset $l "Unable to access file: %s" \
+ "Unable to access file: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:002470##
+ mcset $l "Overwrite file" \
+ "Overwrite file" ;# <-- NOT TRANSLATED YET
+ ##ID:002471##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "A file name '%s' already exists. Are you sure you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002472##
+ mcset $l "Saving file" \
+ "Saving file" ;# <-- NOT TRANSLATED YET
+ ##ID:002473##
+ mcset $l "Abort" \
+ "Abort" ;# <-- NOT TRANSLATED YET
+ ##ID:002474##
+ mcset $l "File %s saved" \
+ "File %s saved" ;# <-- NOT TRANSLATED YET
+ ##ID:002475##
+ mcset $l "Load IHEX8 file into editor and simulator XDATA memory" \
+ "Load IHEX8 file into editor and simulator XDATA memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002476##
+ mcset $l "Save current content of XDATA memory to IHEX8 file" \
+ "Save current content of XDATA memory to IHEX8 file" ;# <-- NOT TRANSLATED YET
+ ##ID:002477##
+ mcset $l "Save current document under a different name" \
+ "Save current document under a different name" ;# <-- NOT TRANSLATED YET
+ ##ID:002478##
+ mcset $l "Reload data from simulator XDATA memory" \
+ "Reload data from simulator XDATA memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002479##
+ mcset $l "Copy selected text to clipboard" \
+ "Copy selected text to clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:002480##
+ mcset $l "Paste clipboard contents" \
+ "Paste clipboard contents" ;# <-- NOT TRANSLATED YET
+ ##ID:002481##
+ mcset $l "Invoke dialog for searching strings in the text" \
+ "Invoke dialog for searching strings in the text" ;# <-- NOT TRANSLATED YET
+ ##ID:002482##
+ mcset $l "Find next occurrence of the search string" \
+ "Find next occurrence of the search string" ;# <-- NOT TRANSLATED YET
+ ##ID:002483##
+ mcset $l "Find previous occurrence of the search string" \
+ "Find previous occurrence of the search string" ;# <-- NOT TRANSLATED YET
+ ##ID:002484##
+ mcset $l "Switch view mode to hexadecimal" \
+ "Switch view mode to hexadecimal" ;# <-- NOT TRANSLATED YET
+ ##ID:002485##
+ mcset $l "Switch view mode to decimal" \
+ "Switch view mode to decimal" ;# <-- NOT TRANSLATED YET
+ ##ID:002486##
+ mcset $l "Switch view mode to octal" \
+ "Switch view mode to octal" ;# <-- NOT TRANSLATED YET
+ ##ID:002487##
+ mcset $l "Save current content of program (CODE) memory to IHEX8 file" \
+ "Save current content of program (CODE) memory to IHEX8 file" ;# <-- NOT TRANSLATED YET
+ ##ID:002488##
+ mcset $l "Save" \
+ "Save" ;# <-- NOT TRANSLATED YET
+ ##ID:002489##
+ mcset $l "Open ADF" \
+ "Open ADF" ;# <-- NOT TRANSLATED YET
+ ##ID:002490##
+ mcset $l "Open IHEX8" \
+ "Open IHEX8" ;# <-- NOT TRANSLATED YET
+ ##ID:002491##
+ mcset $l "Copy" \
+ "Copy" ;# <-- NOT TRANSLATED YET
+ ##ID:002492##
+ mcset $l "Paste" \
+ "Paste" ;# <-- NOT TRANSLATED YET
+ ##ID:002493##
+ mcset $l "Find" \
+ "Find" ;# <-- NOT TRANSLATED YET
+ ##ID:002494##
+ mcset $l "Find next" \
+ "Find next" ;# <-- NOT TRANSLATED YET
+ ##ID:002495##
+ mcset $l "Find previous" \
+ "Find previous" ;# <-- NOT TRANSLATED YET
+ ##ID:002496##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:002497##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:002498##
+ mcset $l "OCT" \
+ "OCT" ;# <-- NOT TRANSLATED YET
+ ##ID:002499##
+ mcset $l "File" \
+ "File" ;# <-- NOT TRANSLATED YET
+ ##ID:002500##
+ mcset $l "Edit" \
+ "Edit" ;# <-- NOT TRANSLATED YET
+ ##ID:002501##
+ mcset $l "Mode" \
+ "Mode" ;# <-- NOT TRANSLATED YET
+ ##ID:002502##
+ mcset $l "Intel 8 HEX" \
+ "Intel 8 HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:002503##
+ mcset $l "Simulator file" \
+ "Simulator file" ;# <-- NOT TRANSLATED YET
+}
+# todo.tcl
+# ==============================================================================
+namespace eval Todo {
+ ##ID:002504##
+ mcset $l "Undo" \
+ "Undo" ;# <-- NOT TRANSLATED YET
+ ##ID:002505##
+ mcset $l "Undo last operation" \
+ "Undo last operation" ;# <-- NOT TRANSLATED YET
+ ##ID:002506##
+ mcset $l "Redo" \
+ "Redo" ;# <-- NOT TRANSLATED YET
+ ##ID:002507##
+ mcset $l "Take back last undo operation" \
+ "Take back last undo operation" ;# <-- NOT TRANSLATED YET
+ ##ID:002508##
+ mcset $l "Cut" \
+ "Cut" ;# <-- NOT TRANSLATED YET
+ ##ID:002509##
+ mcset $l "Copy" \
+ "Copy" ;# <-- NOT TRANSLATED YET
+ ##ID:002510##
+ mcset $l "Paste" \
+ "Paste" ;# <-- NOT TRANSLATED YET
+ ##ID:002511##
+ mcset $l "Clear" \
+ "Clear" ;# <-- NOT TRANSLATED YET
+ ##ID:002512##
+ mcset $l "Select all" \
+ "Select all" ;# <-- NOT TRANSLATED YET
+ ##ID:002513##
+ mcset $l "Find" \
+ "Find" ;# <-- NOT TRANSLATED YET
+ ##ID:002514##
+ mcset $l "Find next" \
+ "Find next" ;# <-- NOT TRANSLATED YET
+ ##ID:002515##
+ mcset $l "Find previous" \
+ "Find previous" ;# <-- NOT TRANSLATED YET
+ ##ID:002516##
+ mcset $l "Bold text" \
+ "Bold text" ;# <-- NOT TRANSLATED YET
+ ##ID:002517##
+ mcset $l "Use bold font" \
+ "Use bold font" ;# <-- NOT TRANSLATED YET
+ ##ID:002518##
+ mcset $l "Italic text" \
+ "Italic text" ;# <-- NOT TRANSLATED YET
+ ##ID:002519##
+ mcset $l "Use italic font" \
+ "Use italic font" ;# <-- NOT TRANSLATED YET
+ ##ID:002520##
+ mcset $l "Strikethrough font" \
+ "Strikethrough font" ;# <-- NOT TRANSLATED YET
+ ##ID:002521##
+ mcset $l "Strikethrough text" \
+ "Strikethrough text" ;# <-- NOT TRANSLATED YET
+ ##ID:002522##
+ mcset $l "Use strikethrough font" \
+ "Use strikethrough font" ;# <-- NOT TRANSLATED YET
+ ##ID:002523##
+ mcset $l "Underline text" \
+ "Underline text" ;# <-- NOT TRANSLATED YET
+ ##ID:002524##
+ mcset $l "Use underline font" \
+ "Use underline font" ;# <-- NOT TRANSLATED YET
+ ##ID:002525##
+ mcset $l "Erase tags" \
+ "Erase tags" ;# <-- NOT TRANSLATED YET
+ ##ID:002526##
+ mcset $l "Clear rich text tags" \
+ "Clear rich text tags" ;# <-- NOT TRANSLATED YET
+ ##ID:002527##
+ mcset $l "Insert OK image" \
+ "Insert OK image" ;# <-- NOT TRANSLATED YET
+ ##ID:002528##
+ mcset $l "Insert image \"Ok\"" \
+ "Insert image \"Ok\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002529##
+ mcset $l "Notes for file:" \
+ "Notes for file:" ;# <-- NOT TRANSLATED YET
+ ##ID:002530##
+ mcset $l "Find next occurrence of search string" \
+ "Find next occurrence of search string" ;# <-- NOT TRANSLATED YET
+ ##ID:002531##
+ mcset $l "Find previous occurrence of search string" \
+ "Find previous occurrence of search string" ;# <-- NOT TRANSLATED YET
+ ##ID:002532##
+ mcset $l "Hide search bar" \
+ "Hide search bar" ;# <-- NOT TRANSLATED YET
+ ##ID:002533##
+ mcset $l "Find:" \
+ "Find:" ;# <-- NOT TRANSLATED YET
+ ##ID:002534##
+ mcset $l "Match case" \
+ "Match case" ;# <-- NOT TRANSLATED YET
+ ##ID:002535##
+ mcset $l "Bold font" \
+ "Bold font" ;# <-- NOT TRANSLATED YET
+ ##ID:002536##
+ mcset $l "Striketrought font" \
+ "Striketrought font" ;# <-- NOT TRANSLATED YET
+ ##ID:002537##
+ mcset $l "Underline font" \
+ "Underline font" ;# <-- NOT TRANSLATED YET
+ ##ID:002538##
+ mcset $l "Erase text tags" \
+ "Erase text tags" ;# <-- NOT TRANSLATED YET
+ ##ID:002539##
+ mcset $l "Remove formatting tags within selected area" \
+ "Remove formatting tags within selected area" ;# <-- NOT TRANSLATED YET
+ ##ID:002540##
+ mcset $l "Insert \"Ok\" image at the current cursor position" \
+ "Insert \"Ok\" image at the current cursor position" ;# <-- NOT TRANSLATED YET
+}
+# subprograms.tcl
+# ==============================================================================
+namespace eval SubPrograms {
+ ##ID:002541##
+ mcset $l "Go to source line" \
+ "Go to source line" ;# <-- NOT TRANSLATED YET
+ ##ID:002542##
+ mcset $l "Navigate code editor to the line from which this subprogram was invoked" \
+ "Navigate code editor to the line from which this subprogram was invoked" ;# <-- NOT TRANSLATED YET
+ ##ID:002543##
+ mcset $l "Go to target line" \
+ "Go to target line" ;# <-- NOT TRANSLATED YET
+ ##ID:002544##
+ mcset $l "Navigate code editor to the line from where this subprogram resides" \
+ "Navigate code editor to the line from where this subprogram resides" ;# <-- NOT TRANSLATED YET
+ ##ID:002545##
+ mcset $l "Copy source address to clipboard" \
+ "Copy source address to clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:002546##
+ mcset $l "Copy return address to clipboard (hexadecimal representation)" \
+ "Copy return address to clipboard (hexadecimal representation)" ;# <-- NOT TRANSLATED YET
+ ##ID:002547##
+ mcset $l "Copy target address to clipboard" \
+ "Copy target address to clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:002548##
+ mcset $l "Copy address where this subprogram begins to the clipboard" \
+ "Copy address where this subprogram begins to the clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:002549##
+ mcset $l "Remove this" \
+ "Remove this" ;# <-- NOT TRANSLATED YET
+ ##ID:002550##
+ mcset $l "Remove this entry" \
+ "Remove this entry" ;# <-- NOT TRANSLATED YET
+ ##ID:002551##
+ mcset $l "Enable" \
+ "Enable" ;# <-- NOT TRANSLATED YET
+ ##ID:002552##
+ mcset $l "Include interrupts" \
+ "Include interrupts" ;# <-- NOT TRANSLATED YET
+ ##ID:002553##
+ mcset $l "RETURN" \
+ "RETURN" ;# <-- NOT TRANSLATED YET
+ ##ID:002554##
+ mcset $l "Clear" \
+ "Clear" ;# <-- NOT TRANSLATED YET
+ ##ID:002555##
+ mcset $l "Save" \
+ "Save" ;# <-- NOT TRANSLATED YET
+ ##ID:002556##
+ mcset $l "TOTAL: " \
+ "TOTAL: " ;# <-- NOT TRANSLATED YET
+ ##ID:002557##
+ mcset $l "Line not found" \
+ "Line not found" ;# <-- NOT TRANSLATED YET
+ ##ID:002558##
+ mcset $l "There is no matching line in the source code" \
+ "There is no matching line in the source code" ;# <-- NOT TRANSLATED YET
+ ##ID:002559##
+ mcset $l " Return address:\t" \
+ " Return address:\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002560##
+ mcset $l "Save file - MCU 8051 IDE" \
+ "Save file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002561##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "A file name '%s' already exists. Are you sure you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002562##
+ mcset $l "Overwrite file" \
+ "Overwrite file" ;# <-- NOT TRANSLATED YET
+ ##ID:002563##
+ mcset $l "Unable to write to file:\n\"%s\"" \
+ "Unable to write to file:\n\"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002564##
+ mcset $l "Permission denied" \
+ "Permission denied" ;# <-- NOT TRANSLATED YET
+ ##ID:002565##
+ mcset $l "Plain text" \
+ "Plain text" ;# <-- NOT TRANSLATED YET
+}
+# stopwatch.tcl
+# ==============================================================================
+namespace eval Stopwatch {
+ ##ID:002566##
+ mcset $l "Micro seconds" \
+ "Micro seconds" ;# <-- NOT TRANSLATED YET
+ ##ID:002567##
+ mcset $l "Clock cycles" \
+ "Clock cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002568##
+ mcset $l "Instruction cycles" \
+ "Instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002569##
+ mcset $l "Instructions passed" \
+ "Instructions passed" ;# <-- NOT TRANSLATED YET
+ ##ID:002570##
+ mcset $l "Program bytes" \
+ "Program bytes" ;# <-- NOT TRANSLATED YET
+ ##ID:002571##
+ mcset $l "Interrupts" \
+ "Interrupts" ;# <-- NOT TRANSLATED YET
+ ##ID:002572##
+ mcset $l "Subprogram calls" \
+ "Subprogram calls" ;# <-- NOT TRANSLATED YET
+ ##ID:002573##
+ mcset $l "RET" \
+ "RET" ;# <-- NOT TRANSLATED YET
+ ##ID:002574##
+ mcset $l "RETI" \
+ "RETI" ;# <-- NOT TRANSLATED YET
+ ##ID:002575##
+ mcset $l "Breakpoints" \
+ "Breakpoints" ;# <-- NOT TRANSLATED YET
+ ##ID:002576##
+ mcset $l "Stopwatch" \
+ "Stopwatch" ;# <-- NOT TRANSLATED YET
+ ##ID:002577##
+ mcset $l "Stop" \
+ "Stop" ;# <-- NOT TRANSLATED YET
+ ##ID:002578##
+ mcset $l "Start" \
+ "Start" ;# <-- NOT TRANSLATED YET
+ ##ID:002579##
+ mcset $l "Save as plain text" \
+ "Save as plain text" ;# <-- NOT TRANSLATED YET
+ ##ID:002580##
+ mcset $l "Save as XHTML" \
+ "Save as XHTML" ;# <-- NOT TRANSLATED YET
+ ##ID:002581##
+ mcset $l "Close window" \
+ "Close window" ;# <-- NOT TRANSLATED YET
+ ##ID:002582##
+ mcset $l "Current" \
+ "Current" ;# <-- NOT TRANSLATED YET
+ ##ID:002583##
+ mcset $l "Project:" \
+ "Project:" ;# <-- NOT TRANSLATED YET
+ ##ID:002584##
+ mcset $l "Date:" \
+ "Date:" ;# <-- NOT TRANSLATED YET
+ ##ID:002585##
+ mcset $l "Generated by %s" \
+ "Generated by %s" ;# <-- NOT TRANSLATED YET
+ ##ID:002586##
+ mcset $l "Clear all" \
+ "Clear all" ;# <-- NOT TRANSLATED YET
+ ##ID:002587##
+ mcset $l "Stop after" \
+ "Stop after" ;# <-- NOT TRANSLATED YET
+ ##ID:002588##
+ mcset $l "Overall" \
+ "Overall" ;# <-- NOT TRANSLATED YET
+ ##ID:002589##
+ mcset $l "Clear entrybox" \
+ "Clear entrybox" ;# <-- NOT TRANSLATED YET
+ ##ID:002590##
+ mcset $l "Clear" \
+ "Clear" ;# <-- NOT TRANSLATED YET
+ ##ID:002591##
+ mcset $l "Stop simulation" \
+ "Stop simulation" ;# <-- NOT TRANSLATED YET
+ ##ID:002592##
+ mcset $l "Save stopwatch state - MCU 8051 IDE" \
+ "Save stopwatch state - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002593##
+ mcset $l "Overwrite file" \
+ "Overwrite file" ;# <-- NOT TRANSLATED YET
+ ##ID:002594##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "A file name '%s' already exists. Are you sure you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002595##
+ mcset $l "Permission denied" \
+ "Permission denied" ;# <-- NOT TRANSLATED YET
+ ##ID:002596##
+ mcset $l "Unable to open file:\n'%s'" \
+ "Unable to open file:\n'%s'" ;# <-- NOT TRANSLATED YET
+}
+# simulator_engine.tcl
+# ==============================================================================
+namespace eval Simulator_ENGINE {
+ ##ID:002597##
+ mcset $l "Interrupt at vector 0x%s " \
+ "Interrupt at vector 0x%s " ;# <-- NOT TRANSLATED YET
+ ##ID:002598##
+ mcset $l "No instruction found at 0x%s" \
+ "No instruction found at 0x%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002599##
+ mcset $l "Breakpoint reached at 0x%s" \
+ "Breakpoint reached at 0x%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002600##
+ mcset $l "Out of memory" \
+ "Out of memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002601##
+ mcset $l "%s has not enough program memory to load this program. Simulator will work but the loaded code is incomplete" \
+ "%s has not enough program memory to load this program. Simulator will work but the loaded code is incomplete" ;# <-- NOT TRANSLATED YET
+ ##ID:002602##
+ mcset $l "Interrupt PC: 0x%s; line: %s; vector 0x%s " \
+ "Interrupt PC: 0x%s; line: %s; vector 0x%s " ;# <-- NOT TRANSLATED YET
+ ##ID:002603##
+ mcset $l "Incomplete instruction OP code at 0x%s" \
+ "Incomplete instruction OP code at 0x%s" ;# <-- NOT TRANSLATED YET
+}
+# maintab.tcl
+# ==============================================================================
+namespace eval MainTab {
+ ##ID:002604##
+ mcset $l "FATAL ERROR" \
+ "FATAL ERROR" ;# <-- NOT TRANSLATED YET
+ ##ID:002605##
+ mcset $l "MCUs database file is corrupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE." \
+ "MCUs database file is corrupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:002606##
+ mcset $l "IO Error" \
+ "IO Error" ;# <-- NOT TRANSLATED YET
+ ##ID:002607##
+ mcset $l "Unable to open VHW file:\n\"%s\"" \
+ "Unable to open VHW file:\n\"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002867##
+ mcset $l "Opening project files" \
+ "Opening project files" ;# <-- NOT TRANSLATED YET
+ ##ID:002868##
+ mcset $l "Abort" \
+ "Abort" ;# <-- NOT TRANSLATED YET
+ ##ID:004495##
+ mcset $l "Initializing ..." \
+ "Initializing ..." ;# <-- NOT TRANSLATED YET
+ ##ID:004496##
+ mcset $l "Finishing ..." \
+ "Finishing ..." ;# <-- NOT TRANSLATED YET
+}
+# selectmcu.tcl
+# ==============================================================================
+namespace eval SelectMCU {
+ ##ID:002608##
+ mcset $l "Choose MCU - MCU 8051 IDE" \
+ "Choose MCU - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002609##
+ mcset $l "Clear search bar" \
+ "Clear search bar" ;# <-- NOT TRANSLATED YET
+ ##ID:002610##
+ mcset $l "Search bar, enter something like \"C4051\"" \
+ "Search bar, enter something like \"C4051\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002611##
+ mcset $l "Processor Type\t\tCODE/PMEM IDATA/IRAM GPIO Frequency" \
+ "Processor Type\t\tCODE/PMEM IDATA/IRAM GPIO Frequency" ;# <-- NOT TRANSLATED YET
+ ##ID:002612##
+ mcset $l "Search:" \
+ "Search:" ;# <-- NOT TRANSLATED YET
+ ##ID:002613##
+ mcset $l " Vendor:" \
+ " Vendor:" ;# <-- NOT TRANSLATED YET
+ ##ID:002614##
+ mcset $l "all" \
+ "all" ;# <-- NOT TRANSLATED YET
+ ##ID:002615##
+ mcset $l "One of available packages for selected microcontroller" \
+ "One of available packages for selected microcontroller" ;# <-- NOT TRANSLATED YET
+ ##ID:002616##
+ mcset $l {Vendor:} \
+ {Vendor:} ;# <-- NOT TRANSLATED YET
+ ##ID:002617##
+ mcset $l {UART:} \
+ {UART:} ;# <-- NOT TRANSLATED YET
+ ##ID:002618##
+ mcset $l {Operating voltage:} \
+ {Operating voltage:} ;# <-- NOT TRANSLATED YET
+ ##ID:002619##
+ mcset $l {Interrupt sources:} \
+ {Interrupt sources:} ;# <-- NOT TRANSLATED YET
+ ##ID:002620##
+ mcset $l {Timers:} \
+ {Timers:} ;# <-- NOT TRANSLATED YET
+ ##ID:002621##
+ mcset $l "External RAM (XDATA)" \
+ "External RAM (XDATA)" ;# <-- NOT TRANSLATED YET
+ ##ID:002622##
+ mcset $l "External ROM/FLASH (XCODE)" \
+ "External ROM/FLASH (XCODE)" ;# <-- NOT TRANSLATED YET
+ ##ID:002623##
+ mcset $l "NOT available" \
+ "NOT available" ;# <-- NOT TRANSLATED YET
+ ##ID:002624##
+ mcset $l "Enable" \
+ "Enable" ;# <-- NOT TRANSLATED YET
+ ##ID:002625##
+ mcset $l "Connect external data memory" \
+ "Connect external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002626##
+ mcset $l "Amount of external data memory" \
+ "Amount of external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002627##
+ mcset $l "Connect external program memory" \
+ "Connect external program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002628##
+ mcset $l "Amount of total program memory minus internal program memory" \
+ "Amount of total program memory minus internal program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002629##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:002630##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:002631##
+ mcset $l "Unable to open file containing supported MCUs,\nplease check your installation" \
+ "Unable to open file containing supported MCUs,\nplease check your installation" ;# <-- NOT TRANSLATED YET
+ ##ID:002632##
+ mcset $l "MCUs database file is corrupted ,\nplease check your installation" \
+ "MCUs database file is corrupted,\nplease check your installation" ;# <-- NOT TRANSLATED YET
+ ##ID:002633##
+ mcset $l "Error" \
+ "Error" ;# <-- NOT TRANSLATED YET
+ ##ID:002634##
+ mcset $l " Image not found" \
+ " Image not found" ;# <-- NOT TRANSLATED YET
+ ##ID:002635##
+ mcset $l "Loading image ..." \
+ "Loading image ..." ;# <-- NOT TRANSLATED YET
+}
+# regwatches.tcl
+# ==============================================================================
+namespace eval RegWatches {
+ ##ID:002636##
+ mcset $l "Move top" \
+ "Move top" ;# <-- NOT TRANSLATED YET
+ ##ID:002637##
+ mcset $l "Move this register watch to the top of list" \
+ "Move this register watch to the top of list" ;# <-- NOT TRANSLATED YET
+ ##ID:002638##
+ mcset $l "Move up" \
+ "Move up" ;# <-- NOT TRANSLATED YET
+ ##ID:002639##
+ mcset $l "Move this register watch up" \
+ "Move this register watch up" ;# <-- NOT TRANSLATED YET
+ ##ID:002640##
+ mcset $l "Move down" \
+ "Move down" ;# <-- NOT TRANSLATED YET
+ ##ID:002641##
+ mcset $l "Move this register watch down" \
+ "Move this register watch down" ;# <-- NOT TRANSLATED YET
+ ##ID:002642##
+ mcset $l "Move bottom" \
+ "Move bottom" ;# <-- NOT TRANSLATED YET
+ ##ID:002643##
+ mcset $l "Move this register watch to the bottom of list" \
+ "Move this register watch to the bottom of list" ;# <-- NOT TRANSLATED YET
+ ##ID:002644##
+ mcset $l "Remove" \
+ "Remove" ;# <-- NOT TRANSLATED YET
+ ##ID:002645##
+ mcset $l "Remove this register watch from the list" \
+ "Remove this register watch from the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002646##
+ mcset $l "Remove all" \
+ "Remove all" ;# <-- NOT TRANSLATED YET
+ ##ID:002647##
+ mcset $l "Clear the list of register watches" \
+ "Clear the list of register watches" ;# <-- NOT TRANSLATED YET
+ ##ID:002648##
+ mcset $l "Save" \
+ "Save" ;# <-- NOT TRANSLATED YET
+ ##ID:002649##
+ mcset $l "Save this list to a file" \
+ "Save this list to a file" ;# <-- NOT TRANSLATED YET
+ ##ID:002650##
+ mcset $l "Configure" \
+ "Configure" ;# <-- NOT TRANSLATED YET
+ ##ID:002651##
+ mcset $l "Configure this panel" \
+ "Configure this panel" ;# <-- NOT TRANSLATED YET
+ ##ID:002652##
+ mcset $l "Sort by" \
+ "Sort by" ;# <-- NOT TRANSLATED YET
+ ##ID:002653##
+ mcset $l "Name" \
+ "Name" ;# <-- NOT TRANSLATED YET
+ ##ID:002654##
+ mcset $l "Address" \
+ "Address" ;# <-- NOT TRANSLATED YET
+ ##ID:002655##
+ mcset $l "Type" \
+ "Type" ;# <-- NOT TRANSLATED YET
+ ##ID:002656##
+ mcset $l "Incremental" \
+ "Incremental" ;# <-- NOT TRANSLATED YET
+ ##ID:002657##
+ mcset $l "Decremental" \
+ "Decremental" ;# <-- NOT TRANSLATED YET
+ ##ID:002658##
+ mcset $l "Autoload from code listing" \
+ "Autoload from code listing" ;# <-- NOT TRANSLATED YET
+ ##ID:002659##
+ mcset $l "Clear on auto-load" \
+ "Clear on auto-load" ;# <-- NOT TRANSLATED YET
+ ##ID:002660##
+ mcset $l "Save under a different file name" \
+ "Save under a different file name" ;# <-- NOT TRANSLATED YET
+ ##ID:002661##
+ mcset $l "Open *.wtc file" \
+ "Open *.wtc file" ;# <-- NOT TRANSLATED YET
+ ##ID:002662##
+ mcset $l "Import list of registers from code listing or WTC file" \
+ "Import list of registers from code listing or WTC file" ;# <-- NOT TRANSLATED YET
+ ##ID:002663##
+ mcset $l "Import list of registers from *.lst or *.wtc file" \
+ "Import list of registers from *.lst or *.wtc file" ;# <-- NOT TRANSLATED YET
+ ##ID:002664##
+ mcset $l "Enter your search string here" \
+ "Enter your search string here" ;# <-- NOT TRANSLATED YET
+ ##ID:002665##
+ mcset $l "Search for a name" \
+ "Search for a name" ;# <-- NOT TRANSLATED YET
+ ##ID:002666##
+ mcset $l "Clear search string" \
+ "Clear search string" ;# <-- NOT TRANSLATED YET
+ ##ID:002667##
+ mcset $l "Register address:\n 1 or 2 digits\tinternal RAM (not SFR)\n 3 digits\t\texpanded RAM\n 4 digits\t\texternal RAM\n dot and 2 digits\tBit" \
+ "Register address:\n 1 or 2 digits\tinternal RAM (not SFR)\n 3 digits\t\texpanded RAM\n 4 digits\t\texternal RAM\n dot and 2 digits\tBit" ;# <-- NOT TRANSLATED YET
+ ##ID:002668##
+ mcset $l "Register address or bit address" \
+ "Register address or bit address" ;# <-- NOT TRANSLATED YET
+ ##ID:002669##
+ mcset $l "Name of the watch. Any string." \
+ "Name of the watch. Any string." ;# <-- NOT TRANSLATED YET
+ ##ID:002670##
+ mcset $l "Add this entry to register watches" \
+ "Add this entry to register watches" ;# <-- NOT TRANSLATED YET
+ ##ID:002671##
+ mcset $l "New register watches entry" \
+ "New register watches entry" ;# <-- NOT TRANSLATED YET
+ ##ID:002672##
+ mcset $l "Create new register watch" \
+ "Create new register watch" ;# <-- NOT TRANSLATED YET
+ ##ID:002673##
+ mcset $l "Remove this entry" \
+ "Remove this entry" ;# <-- NOT TRANSLATED YET
+ ##ID:002674##
+ mcset $l "Addr" \
+ "Addr" ;# <-- NOT TRANSLATED YET
+ ##ID:002675##
+ mcset $l "Register name" \
+ "Register name" ;# <-- NOT TRANSLATED YET
+ ##ID:002676##
+ mcset $l "Unable to assign, address is already in use" \
+ "Unable to assign, address is already in use" ;# <-- NOT TRANSLATED YET
+ ##ID:002677##
+ mcset $l "You must specify the register address." \
+ "You must specify the register address." ;# <-- NOT TRANSLATED YET
+ ##ID:002678##
+ mcset $l "Specified address is already used." \
+ "Specified address is already used." ;# <-- NOT TRANSLATED YET
+ ##ID:002679##
+ mcset $l "Overwrite file" \
+ "Overwrite file" ;# <-- NOT TRANSLATED YET
+ ##ID:002680##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "A file name '%s' already exists. Are you sure you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002681##
+ mcset $l "Error - MCU 8051 IDE" \
+ "Error - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002682##
+ mcset $l "Unable to access file \"%s\", check your permissions." \
+ "Unable to access file \"%s\", check your permissions." ;# <-- NOT TRANSLATED YET
+ ##ID:002683##
+ mcset $l "Definitions saved to \"%s\"" \
+ "Definitions saved to \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002684##
+ mcset $l "Save watches - MCU 8051 IDE" \
+ "Save watches - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002685##
+ mcset $l "File access error" \
+ "File access error" ;# <-- NOT TRANSLATED YET
+ ##ID:002686##
+ mcset $l "Unable to read file '%s'" \
+ "Unable to read file '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002687##
+ mcset $l "Corrupted file" \
+ "Corrupted file" ;# <-- NOT TRANSLATED YET
+ ##ID:002688##
+ mcset $l "file: %s is either corrupted or it is not a file in expected format." \
+ "file: %s is either corrupted or it is not a file in expected format." ;# <-- NOT TRANSLATED YET
+ ##ID:002689##
+ mcset $l "Load watches from file - MCU 8051 IDE" \
+ "Load watches from file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002690##
+ mcset $l "Import file - MCU 8051 IDE" \
+ "Import file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002691##
+ mcset $l "Unknown file" \
+ "Unknown file" ;# <-- NOT TRANSLATED YET
+ ##ID:002692##
+ mcset $l "Unable to recognize file format" \
+ "Unable to recognize file format" ;# <-- NOT TRANSLATED YET
+ ##ID:002693##
+ mcset $l "Unable to open file:\n'%s'" \
+ "Unable to open file:\n'%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002694##
+ mcset $l "Are you sure ?" \
+ "Are you sure ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002695##
+ mcset $l "Do you really want to clear the panel ?" \
+ "Do you really want to clear the panel ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002696##
+ mcset $l "MCU 8051 IDE watches definition" \
+ "MCU 8051 IDE watches definition" ;# <-- NOT TRANSLATED YET
+ ##ID:002697##
+ mcset $l "Code listing" \
+ "Code listing" ;# <-- NOT TRANSLATED YET
+}
+# fsd.tcl
+# ==============================================================================
+namespace eval KIFSD::FSD {
+ ##ID:002698##
+ mcset $l " Name\t\t\t\t Size Rights Date " \
+ " Name\t\t\t\t Size Rights Date " ;# <-- NOT TRANSLATED YET
+ ##ID:002699##
+ mcset $l "Location:" \
+ "Location:" ;# <-- NOT TRANSLATED YET
+ ##ID:002700##
+ mcset $l "Filter:" \
+ "Filter:" ;# <-- NOT TRANSLATED YET
+ ##ID:002701##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:002702##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:002703##
+ mcset $l "Parent folder" \
+ "Parent folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002704##
+ mcset $l "Back" \
+ "Back" ;# <-- NOT TRANSLATED YET
+ ##ID:002705##
+ mcset $l "Forward" \
+ "Forward" ;# <-- NOT TRANSLATED YET
+ ##ID:002706##
+ mcset $l "Reload" \
+ "Reload" ;# <-- NOT TRANSLATED YET
+ ##ID:002707##
+ mcset $l "New folder" \
+ "New folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002708##
+ mcset $l "Short view" \
+ "Short view" ;# <-- NOT TRANSLATED YET
+ ##ID:002709##
+ mcset $l "Detailed view" \
+ "Detailed view" ;# <-- NOT TRANSLATED YET
+ ##ID:002710##
+ mcset $l "Bookmarks" \
+ "Bookmarks" ;# <-- NOT TRANSLATED YET
+ ##ID:002711##
+ mcset $l "Configure" \
+ "Configure" ;# <-- NOT TRANSLATED YET
+ ##ID:002712##
+ mcset $l "By name" \
+ "By name" ;# <-- NOT TRANSLATED YET
+ ##ID:002713##
+ mcset $l "By date" \
+ "By date" ;# <-- NOT TRANSLATED YET
+ ##ID:002714##
+ mcset $l "By size" \
+ "By size" ;# <-- NOT TRANSLATED YET
+ ##ID:002715##
+ mcset $l "Reverse" \
+ "Reverse" ;# <-- NOT TRANSLATED YET
+ ##ID:002716##
+ mcset $l "Folders first" \
+ "Folders first" ;# <-- NOT TRANSLATED YET
+ ##ID:002717##
+ mcset $l "Case insensitive" \
+ "Case insensitive" ;# <-- NOT TRANSLATED YET
+ ##ID:002718##
+ mcset $l "Sorting" \
+ "Sorting" ;# <-- NOT TRANSLATED YET
+ ##ID:002719##
+ mcset $l "Show hidden files" \
+ "Show hidden files" ;# <-- NOT TRANSLATED YET
+ ##ID:002720##
+ mcset $l "Quick access navigation panel" \
+ "Quick access navigation panel" ;# <-- NOT TRANSLATED YET
+ ##ID:002721##
+ mcset $l "Separate folders" \
+ "Separate folders" ;# <-- NOT TRANSLATED YET
+ ##ID:002722##
+ mcset $l "Add bookmark" \
+ "Add bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002723##
+ mcset $l "Edit bookmarks" \
+ "Edit bookmarks" ;# <-- NOT TRANSLATED YET
+ ##ID:002724##
+ mcset $l "Up" \
+ "Up" ;# <-- NOT TRANSLATED YET
+ ##ID:002725##
+ mcset $l "Rename" \
+ "Rename" ;# <-- NOT TRANSLATED YET
+ ##ID:002726##
+ mcset $l "Delete" \
+ "Delete" ;# <-- NOT TRANSLATED YET
+ ##ID:002727##
+ mcset $l "Bookmark folder" \
+ "Bookmark folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002728##
+ mcset $l "Properties" \
+ "Properties" ;# <-- NOT TRANSLATED YET
+ ##ID:002729##
+ mcset $l "Add entry" \
+ "Add entry" ;# <-- NOT TRANSLATED YET
+ ##ID:002730##
+ mcset $l "Hide panel" \
+ "Hide panel" ;# <-- NOT TRANSLATED YET
+ ##ID:002731##
+ mcset $l "Move up" \
+ "Move up" ;# <-- NOT TRANSLATED YET
+ ##ID:002732##
+ mcset $l "Move down" \
+ "Move down" ;# <-- NOT TRANSLATED YET
+ ##ID:002733##
+ mcset $l "Edit entry" \
+ "Edit entry" ;# <-- NOT TRANSLATED YET
+ ##ID:002734##
+ mcset $l "Remove entry" \
+ "Remove entry" ;# <-- NOT TRANSLATED YET
+ ##ID:002735##
+ mcset $l "Invalid folder" \
+ "Invalid folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002736##
+ mcset $l "The specified folder does not exist:\n%s" \
+ "The specified folder does not exist:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002737##
+ mcset $l "Create new folder in:\n%s" \
+ "Create new folder in:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002738##
+ mcset $l "Clear" \
+ "Clear" ;# <-- NOT TRANSLATED YET
+ ##ID:002739##
+ mcset $l "Unable to create folder" \
+ "Unable to create folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002740##
+ mcset $l "Unable to create the specified folder" \
+ "Unable to create the specified folder" ;# <-- NOT TRANSLATED YET
+ ##ID:002741##
+ mcset $l "Delete file" \
+ "Delete file" ;# <-- NOT TRANSLATED YET
+ ##ID:002742##
+ mcset $l "Do you really want to delete file:\n%s" \
+ "Do you really want to delete file:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002743##
+ mcset $l "Permission denied" \
+ "Permission denied" ;# <-- NOT TRANSLATED YET
+ ##ID:002744##
+ mcset $l "Unable to remove file:\n%s" \
+ "Unable to remove file:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002745##
+ mcset $l "Unable to rename file:\n%s" \
+ "Unable to rename file:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002746##
+ mcset $l "Unknown Error" \
+ "Unknown Error" ;# <-- NOT TRANSLATED YET
+ ##ID:002747##
+ mcset $l "This file apparently does not exist" \
+ "This file apparently does not exist" ;# <-- NOT TRANSLATED YET
+ ##ID:002748##
+ mcset $l "Unable to change permissions for file:\n%s" \
+ "Unable to change permissions for file:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002749##
+ mcset $l "Unable to rename file:%s" \
+ "Unable to rename file:%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002750##
+ mcset $l "Remove" \
+ "Remove" ;# <-- NOT TRANSLATED YET
+ ##ID:002751##
+ mcset $l "Edit" \
+ "Edit" ;# <-- NOT TRANSLATED YET
+ ##ID:002752##
+ mcset $l "Down" \
+ "Down" ;# <-- NOT TRANSLATED YET
+ ##ID:002753##
+ mcset $l "New entry" \
+ "New entry" ;# <-- NOT TRANSLATED YET
+ ##ID:002754##
+ mcset $l "Name" \
+ "Name" ;# <-- NOT TRANSLATED YET
+ ##ID:002755##
+ mcset $l "URL" \
+ "URL" ;# <-- NOT TRANSLATED YET
+ ##ID:002756##
+ mcset $l "Icon" \
+ "Icon" ;# <-- NOT TRANSLATED YET
+ ##ID:002757##
+ mcset $l "Name:" \
+ "Name:" ;# <-- NOT TRANSLATED YET
+ ##ID:002758##
+ mcset $l "Ownership" \
+ "Ownership" ;# <-- NOT TRANSLATED YET
+ ##ID:002759##
+ mcset $l "Owner" \
+ "Owner" ;# <-- NOT TRANSLATED YET
+ ##ID:002760##
+ mcset $l "Group" \
+ "Group" ;# <-- NOT TRANSLATED YET
+ ##ID:002761##
+ mcset $l "Item properties" \
+ "Item properties" ;# <-- NOT TRANSLATED YET
+ ##ID:002762##
+ mcset $l "Type" \
+ "Type" ;# <-- NOT TRANSLATED YET
+ ##ID:002763##
+ mcset $l "Location" \
+ "Location" ;# <-- NOT TRANSLATED YET
+ ##ID:002764##
+ mcset $l "Size" \
+ "Size" ;# <-- NOT TRANSLATED YET
+ ##ID:002765##
+ mcset $l "Modified" \
+ "Modified" ;# <-- NOT TRANSLATED YET
+ ##ID:002766##
+ mcset $l "Accessed" \
+ "Accessed" ;# <-- NOT TRANSLATED YET
+ ##ID:002767##
+ mcset $l "Access permissions" \
+ "Access permissions" ;# <-- NOT TRANSLATED YET
+ ##ID:002768##
+ mcset $l "Class" \
+ "Class" ;# <-- NOT TRANSLATED YET
+ ##ID:002769##
+ mcset $l "Read" \
+ "Read" ;# <-- NOT TRANSLATED YET
+ ##ID:002770##
+ mcset $l "Write" \
+ "Write" ;# <-- NOT TRANSLATED YET
+ ##ID:002771##
+ mcset $l "Exec" \
+ "Exec" ;# <-- NOT TRANSLATED YET
+ ##ID:002772##
+ mcset $l "Others" \
+ "Others" ;# <-- NOT TRANSLATED YET
+}
+# filelist.tcl
+# ==============================================================================
+namespace eval FileList {
+ ##ID:002773##
+ mcset $l "Append to project" \
+ "Append to project" ;# <-- NOT TRANSLATED YET
+ ##ID:002774##
+ mcset $l "Append this file to the current project" \
+ "Append this file to the current project" ;# <-- NOT TRANSLATED YET
+ ##ID:002775##
+ mcset $l "New" \
+ "New" ;# <-- NOT TRANSLATED YET
+ ##ID:002776##
+ mcset $l "Create new file and open its editor" \
+ "Create new file and open its editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002777##
+ mcset $l "Open" \
+ "Open" ;# <-- NOT TRANSLATED YET
+ ##ID:002778##
+ mcset $l "Open an existing file" \
+ "Open an existing file" ;# <-- NOT TRANSLATED YET
+ ##ID:002779##
+ mcset $l "Save" \
+ "Save" ;# <-- NOT TRANSLATED YET
+ ##ID:002780##
+ mcset $l "Save this file" \
+ "Save this file" ;# <-- NOT TRANSLATED YET
+ ##ID:002781##
+ mcset $l "Save as" \
+ "Save as" ;# <-- NOT TRANSLATED YET
+ ##ID:002782##
+ mcset $l "Save this file under different name" \
+ "Save this file under different name" ;# <-- NOT TRANSLATED YET
+ ##ID:002783##
+ mcset $l "Save all" \
+ "Save all" ;# <-- NOT TRANSLATED YET
+ ##ID:002784##
+ mcset $l "Save all file in the list" \
+ "Save all file in the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002785##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:002786##
+ mcset $l "Close this file" \
+ "Close this file" ;# <-- NOT TRANSLATED YET
+ ##ID:002787##
+ mcset $l "Close All" \
+ "Close All" ;# <-- NOT TRANSLATED YET
+ ##ID:002788##
+ mcset $l "Close all files in the list" \
+ "Close all files in the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002789##
+ mcset $l "Bookmark" \
+ "Bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002790##
+ mcset $l "Add/Remove bookmark for this file" \
+ "Add/Remove bookmark for this file" ;# <-- NOT TRANSLATED YET
+ ##ID:002791##
+ mcset $l "Move up" \
+ "Move up" ;# <-- NOT TRANSLATED YET
+ ##ID:002792##
+ mcset $l "Move this file up in the list" \
+ "Move this file up in the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002793##
+ mcset $l "Move down" \
+ "Move down" ;# <-- NOT TRANSLATED YET
+ ##ID:002794##
+ mcset $l "Move this file down in the list" \
+ "Move this file down in the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002795##
+ mcset $l "Move to top" \
+ "Move to top" ;# <-- NOT TRANSLATED YET
+ ##ID:002796##
+ mcset $l "Move this file to the top of the list" \
+ "Move this file to the top of the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002797##
+ mcset $l "Move to bottom" \
+ "Move to bottom" ;# <-- NOT TRANSLATED YET
+ ##ID:002798##
+ mcset $l "Move this file to the bottom of the list" \
+ "Move this file to the bottom of the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002799##
+ mcset $l "Sort items by" \
+ "Sort items by" ;# <-- NOT TRANSLATED YET
+ ##ID:002800##
+ mcset $l "Document Name" \
+ "Document Name" ;# <-- NOT TRANSLATED YET
+ ##ID:002801##
+ mcset $l "File URL" \
+ "File URL" ;# <-- NOT TRANSLATED YET
+ ##ID:002802##
+ mcset $l "File Size in B" \
+ "File Size in B" ;# <-- NOT TRANSLATED YET
+ ##ID:002803##
+ mcset $l "Open with" \
+ "Open with" ;# <-- NOT TRANSLATED YET
+ ##ID:002804##
+ mcset $l "Hide the panel" \
+ "Hide the panel" ;# <-- NOT TRANSLATED YET
+ ##ID:002805##
+ mcset $l "Remove file from the project" \
+ "Remove file from the project" ;# <-- NOT TRANSLATED YET
+ ##ID:002806##
+ mcset $l "Remove this file from the project" \
+ "Remove this file from the project" ;# <-- NOT TRANSLATED YET
+ ##ID:002807##
+ mcset $l "Close file" \
+ "Close file" ;# <-- NOT TRANSLATED YET
+ ##ID:002808##
+ mcset $l "Open file" \
+ "Open file" ;# <-- NOT TRANSLATED YET
+ ##ID:002809##
+ mcset $l "Open this file" \
+ "Open this file" ;# <-- NOT TRANSLATED YET
+ ##ID:002810##
+ mcset $l "Move this item up" \
+ "Move this item up" ;# <-- NOT TRANSLATED YET
+ ##ID:002811##
+ mcset $l "Move this item down" \
+ "Move this item down" ;# <-- NOT TRANSLATED YET
+ ##ID:002812##
+ mcset $l "Move this item to the top of the list" \
+ "Move this item to the top of the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002813##
+ mcset $l "Move this item to the bottom of the list" \
+ "Move this item to the bottom of the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002814##
+ mcset $l "Add/Remove bookmark" \
+ "Add/Remove bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002815##
+ mcset $l "Move file up" \
+ "Move file up" ;# <-- NOT TRANSLATED YET
+ ##ID:002816##
+ mcset $l "Move selected file up in the list" \
+ "Move selected file up in the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002817##
+ mcset $l "Move file down" \
+ "Move file down" ;# <-- NOT TRANSLATED YET
+ ##ID:002818##
+ mcset $l "Move selected file down in the list" \
+ "Move selected file down in the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002819##
+ mcset $l "Move item to top" \
+ "Move item to top" ;# <-- NOT TRANSLATED YET
+ ##ID:002820##
+ mcset $l "Move selected file to the top of the list" \
+ "Move selected file to the top of the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002821##
+ mcset $l "Move item to bottom" \
+ "Move item to bottom" ;# <-- NOT TRANSLATED YET
+ ##ID:002822##
+ mcset $l "Move selected file to the bottom of the list" \
+ "Move selected file to the bottom of the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002823##
+ mcset $l "Open this file and create its own editor" \
+ "Open this file and create its own editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002824##
+ mcset $l "Close this file and close its editor" \
+ "Close this file and close its editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002825##
+ mcset $l "Exclude this file from list of files of this project" \
+ "Exclude this file from list of files of this project" ;# <-- NOT TRANSLATED YET
+ ##ID:002826##
+ mcset $l "Hide this panel" \
+ "Hide this panel" ;# <-- NOT TRANSLATED YET
+ ##ID:002827##
+ mcset $l "Opened Files:" \
+ "Opened Files:" ;# <-- NOT TRANSLATED YET
+ ##ID:002828##
+ mcset $l "Opened files" \
+ "Opened files" ;# <-- NOT TRANSLATED YET
+ ##ID:002829##
+ mcset $l "Files in the project" \
+ "Files in the project" ;# <-- NOT TRANSLATED YET
+ ##ID:002830##
+ mcset $l "File system browser" \
+ "File system browser" ;# <-- NOT TRANSLATED YET
+ ##ID:002831##
+ mcset $l "List of SFR's" \
+ "List of SFR's" ;# <-- NOT TRANSLATED YET
+ ##ID:002832##
+ mcset $l "Files of the current project" \
+ "Files of the current project" ;# <-- NOT TRANSLATED YET
+ ##ID:002833##
+ mcset $l "Special Function Registers" \
+ "Special Function Registers" ;# <-- NOT TRANSLATED YET
+ ##ID:002834##
+ mcset $l "Bookmarks for opened files" \
+ "Bookmarks for opened files" ;# <-- NOT TRANSLATED YET
+ ##ID:002835##
+ mcset $l "List of opened files" \
+ "List of opened files" ;# <-- NOT TRANSLATED YET
+ ##ID:002836##
+ mcset $l "Search for file" \
+ "Search for file" ;# <-- NOT TRANSLATED YET
+ ##ID:002837##
+ mcset $l "Search for certain file name in list of opened files" \
+ "Search for certain file name in list of opened files" ;# <-- NOT TRANSLATED YET
+ ##ID:002838##
+ mcset $l "Search for certain file name in list of project files" \
+ "Search for certain file name in list of project files" ;# <-- NOT TRANSLATED YET
+ ##ID:002839##
+ mcset $l "Clear search entry box" \
+ "Clear search entry box" ;# <-- NOT TRANSLATED YET
+ ##ID:002840##
+ mcset $l "Previous editor" \
+ "Previous editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002841##
+ mcset $l "Switch to the previous editor" \
+ "Switch to the previous editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002842##
+ mcset $l "Next editor" \
+ "Next editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002843##
+ mcset $l "Switch to the next editor" \
+ "Switch to the next editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002844##
+ mcset $l "Bookmarks for project files" \
+ "Bookmarks for project files" ;# <-- NOT TRANSLATED YET
+ ##ID:002845##
+ mcset $l "List of project files" \
+ "List of project files" ;# <-- NOT TRANSLATED YET
+ ##ID:002846##
+ mcset $l "Project Files:" \
+ "Project Files:" ;# <-- NOT TRANSLATED YET
+ ##ID:002847##
+ mcset $l "Show the panel" \
+ "Show the panel" ;# <-- NOT TRANSLATED YET
+ ##ID:002848##
+ mcset $l "Currently opened files" \
+ "Currently opened files" ;# <-- NOT TRANSLATED YET
+ ##ID:002849##
+ mcset $l "Files in the current project" \
+ "Files in the current project" ;# <-- NOT TRANSLATED YET
+ ##ID:002850##
+ mcset $l "SFR watches" \
+ "SFR watches" ;# <-- NOT TRANSLATED YET
+ ##ID:002851##
+ mcset $l "(read only)" \
+ "(read only)" ;# <-- NOT TRANSLATED YET
+ ##ID:002852##
+ mcset $l "File does not exist" \
+ "File does not exist" ;# <-- NOT TRANSLATED YET
+ ##ID:002853##
+ mcset $l "Path:" \
+ "Path:" ;# <-- NOT TRANSLATED YET
+ ##ID:002854##
+ mcset $l "Size:" \
+ "Size:" ;# <-- NOT TRANSLATED YET
+ ##ID:002855##
+ mcset $l "Modified:" \
+ "Modified:" ;# <-- NOT TRANSLATED YET
+ ##ID:002856##
+ mcset $l "Owner:" \
+ "Owner:" ;# <-- NOT TRANSLATED YET
+ ##ID:002857##
+ mcset $l "Permissions:" \
+ "Permissions:" ;# <-- NOT TRANSLATED YET
+ ##ID:002858##
+ mcset $l "Encoding:" \
+ "Encoding:" ;# <-- NOT TRANSLATED YET
+ ##ID:002859##
+ mcset $l "EOL:" \
+ "EOL:" ;# <-- NOT TRANSLATED YET
+ ##ID:002860##
+ mcset $l "Are you sure ?" \
+ "Are you sure ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002861##
+ mcset $l "Reload of the file will change contents of the current editor. Are you sure you want that ?" \
+ "Reload of the file will change contents of the current editor. Are you sure you want that ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002862##
+ mcset $l "Reload aborted" \
+ "Reload aborted" ;# <-- NOT TRANSLATED YET
+ ##ID:002863##
+ mcset $l "Binary File Opened - MCU 8015 IDE" \
+ "Binary File Opened - MCU 8015 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002864##
+ mcset $l "The file %s is binary, saving it will result corrupted file." \
+ "The file %s is binary, saving it will result corrupted file." ;# <-- NOT TRANSLATED YET
+ ##ID:002865##
+ mcset $l "Unknown error" \
+ "Unknown error" ;# <-- NOT TRANSLATED YET
+ ##ID:004497##
+ mcset $l "Checking for changes in files ..." \
+ "Checking for changes in files ..." ;# <-- NOT TRANSLATED YET
+ ##ID:002866##
+ mcset $l "Error raised during md5 checking of file:\n%s.\nMaybe md5 extension is not correctly loaded." \
+ "Error raised during md5 checking of file:\n%s.\nMaybe md5 extension is not correctly loaded." ;# <-- NOT TRANSLATED YET
+ ##ID:002869##
+ mcset $l "The following files could not be located:" \
+ "The following files could not be located:" ;# <-- NOT TRANSLATED YET
+ ##ID:002870##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:002871##
+ mcset $l "File(s) not found" \
+ "File(s) not found" ;# <-- NOT TRANSLATED YET
+ ##ID:002872##
+ mcset $l "The following files were modified since last save:" \
+ "The following files were modified since last save:" ;# <-- NOT TRANSLATED YET
+ ##ID:002873##
+ mcset $l "File(s) changed" \
+ "File(s) changed" ;# <-- NOT TRANSLATED YET
+ ##ID:002874##
+ mcset $l "File not found - MCU 8051 IDE" \
+ "File not found - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002875##
+ mcset $l "File %s not found !" \
+ "File %s not found !" ;# <-- NOT TRANSLATED YET
+ ##ID:004498##
+ mcset $l "Dangerously large file!" \
+ "Dangerously large file!" ;# <-- NOT TRANSLATED YET
+ ##ID:004499##
+ mcset $l "WARNING: The file you are about to open is larger than 10MB!\n\nOpening extremely big source code files might lead your system to run out of operating memory, then the MCU 8051 IDE might got killed by the operating system!\n\nARE YOU SURE you want to proceed?" \
+ "WARNING: The file you are about to open is larger than 10MB!\n\nOpening extremely big source code files might lead your system to run out of operating memory, then the MCU 8051 IDE might got killed by the operating system!\n\nARE YOU SURE you want to proceed?" ;# <-- NOT TRANSLATED YET
+ ##ID:002876##
+ mcset $l "File: %s is already opened." \
+ "File: %s is already opened." ;# <-- NOT TRANSLATED YET
+ ##ID:002877##
+ mcset $l "Do you want to add this file to the project ?\n%s" \
+ "Do you want to add this file to the project ?\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002878##
+ mcset $l "Yes" \
+ "Yes" ;# <-- NOT TRANSLATED YET
+ ##ID:002879##
+ mcset $l "No" \
+ "No" ;# <-- NOT TRANSLATED YET
+ ##ID:002880##
+ mcset $l "Do not ask again" \
+ "Do not ask again" ;# <-- NOT TRANSLATED YET
+ ##ID:002882##
+ mcset $l "Add file ?" \
+ "Add file ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002883##
+ mcset $l "Overwrite file" \
+ "Overwrite file" ;# <-- NOT TRANSLATED YET
+ ##ID:002884##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "A file name '%s' already exists. Are you sure you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002885##
+ mcset $l "Close document - MCU 8051 IDE" \
+ "Close document - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002886##
+ mcset $l "The document %s have been modified.\nDo you want to save it ?" \
+ "The document %s have been modified.\nDo you want to save it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002887##
+ mcset $l "Last editor window closed -> opening a new one ..." \
+ "Last editor window closed -> opening a new one ..." ;# <-- NOT TRANSLATED YET
+ ##ID:002888##
+ mcset $l "The following documents have been modified,\ndo you want to save them before closing ?" \
+ "The following documents have been modified,\ndo you want to save them before closing ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002889##
+ mcset $l "Unsaved files" \
+ "Unsaved files" ;# <-- NOT TRANSLATED YET
+ ##ID:002890##
+ mcset $l "Save selected" \
+ "Save selected" ;# <-- NOT TRANSLATED YET
+ ##ID:002891##
+ mcset $l "Discard" \
+ "Discard" ;# <-- NOT TRANSLATED YET
+ ##ID:002892##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:002893##
+ mcset $l "Close files - MCU 8051 IDE" \
+ "Close files - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002894##
+ mcset $l "File not found" \
+ "File not found" ;# <-- NOT TRANSLATED YET
+ ##ID:002895##
+ mcset $l "File %s could not be located at the specified location." \
+ "File %s could not be located at the specified location." ;# <-- NOT TRANSLATED YET
+ ##ID:002896##
+ mcset $l "File changed" \
+ "File changed" ;# <-- NOT TRANSLATED YET
+ ##ID:002897##
+ mcset $l "File \"%s\" was modified since last project save\nTime: %s" \
+ "File \"%s\" was modified since last project save\nTime: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:002898##
+ mcset $l "Raised error during md5 checking file %s. Maybe md5 extension is not correctly loaded." \
+ "Raised error during md5 checking file %s. Maybe md5 extension is not correctly loaded." ;# <-- NOT TRANSLATED YET
+ ##ID:002899##
+ mcset $l "Program not found" \
+ "Program not found" ;# <-- NOT TRANSLATED YET
+ ##ID:002900##
+ mcset $l "Unable to execute \"%s\"" \
+ "Unable to execute \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002901##
+ mcset $l "Enter command to execute:" \
+ "Enter command to execute:" ;# <-- NOT TRANSLATED YET
+ ##ID:002902##
+ mcset $l "Open with other ..." \
+ "Open with other ..." ;# <-- NOT TRANSLATED YET
+ ##ID:002903##
+ mcset $l "Unable to find \"%s\" in list of opened files or project files" \
+ "Unable to find \"%s\" in list of opened files or project files" ;# <-- NOT TRANSLATED YET
+ ##ID:002904##
+ mcset $l "Simulator: unable to switch to file: '%s'" \
+ "Simulator: unable to switch to file: '%s'" ;# <-- NOT TRANSLATED YET
+}
+# rightpanel.tcl
+# ==============================================================================
+namespace eval RightPanel {
+ ##ID:002905##
+ mcset $l "Remove" \
+ "Remove" ;# <-- NOT TRANSLATED YET
+ ##ID:002906##
+ mcset $l "Add/Remove editor bookmark to/from current line" \
+ "Add/Remove editor bookmark to/from current line" ;# <-- NOT TRANSLATED YET
+ ##ID:002907##
+ mcset $l "Previous" \
+ "Previous" ;# <-- NOT TRANSLATED YET
+ ##ID:002908##
+ mcset $l "Go to previous bookmark" \
+ "Go to previous bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002909##
+ mcset $l "Next" \
+ "Next" ;# <-- NOT TRANSLATED YET
+ ##ID:002910##
+ mcset $l "Go to next bookmark" \
+ "Go to next bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002911##
+ mcset $l "Remove all" \
+ "Remove all" ;# <-- NOT TRANSLATED YET
+ ##ID:002912##
+ mcset $l "Remove all bookmarks from the editor" \
+ "Remove all bookmarks from the editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002913##
+ mcset $l "Go to previous breakpoint" \
+ "Go to previous breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:002914##
+ mcset $l "Go to next breakpoint" \
+ "Go to next breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:002915##
+ mcset $l "Remove all breakpoints from the editor" \
+ "Remove all breakpoints from the editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002916##
+ mcset $l "List of bookmarks in the current editor" \
+ "List of bookmarks in the current editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002917##
+ mcset $l "List of breakpoints in the current editor" \
+ "List of breakpoints in the current editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002918##
+ mcset $l "Details for instruction on the current line" \
+ "Details for instruction on the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:002919##
+ mcset $l "Register watches (for internal data memory, external data memory, expanded data memory and bits)" \
+ "Register watches (for internal data memory, external data memory, expanded data memory and bits)" ;# <-- NOT TRANSLATED YET
+ ##ID:002920##
+ mcset $l "List of active subprograms" \
+ "List of active subprograms" ;# <-- NOT TRANSLATED YET
+ ##ID:002921##
+ mcset $l "Symbol list" \
+ "Symbol list" ;# <-- NOT TRANSLATED YET
+ ##ID:002922##
+ mcset $l "Hardware manager" \
+ "Hardware manager" ;# <-- NOT TRANSLATED YET
+ ##ID:002923##
+ mcset $l "Hide the panel" \
+ "Hide the panel" ;# <-- NOT TRANSLATED YET
+ ##ID:002924##
+ mcset $l "Bookmarks" \
+ "Bookmarks" ;# <-- NOT TRANSLATED YET
+ ##ID:002925##
+ mcset $l "List of bookmarks in editor (Ctrl+6)" \
+ "List of bookmarks in editor (Ctrl+6)" ;# <-- NOT TRANSLATED YET
+ ##ID:002926##
+ mcset $l "Breakpoints" \
+ "Breakpoints" ;# <-- NOT TRANSLATED YET
+ ##ID:002927##
+ mcset $l "List of breakpoints in editor (Ctrl+7)" \
+ "List of breakpoints in editor (Ctrl+7)" ;# <-- NOT TRANSLATED YET
+ ##ID:002928##
+ mcset $l "Symbols" \
+ "Symbols" ;# <-- NOT TRANSLATED YET
+ ##ID:002929##
+ mcset $l "Symbol List" \
+ "Symbol List" ;# <-- NOT TRANSLATED YET
+ ##ID:002930##
+ mcset $l "Instruction" \
+ "Instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:002931##
+ mcset $l "Instruction details (Ctrl+8)" \
+ "Instruction details (Ctrl+8)" ;# <-- NOT TRANSLATED YET
+ ##ID:002932##
+ mcset $l "Watches" \
+ "Watches" ;# <-- NOT TRANSLATED YET
+ ##ID:002933##
+ mcset $l "Register watches (Ctrl+9)" \
+ "Register watches (Ctrl+9)" ;# <-- NOT TRANSLATED YET
+ ##ID:002934##
+ mcset $l "Subprograms" \
+ "Subprograms" ;# <-- NOT TRANSLATED YET
+ ##ID:002935##
+ mcset $l "Active subprograms (Ctrl+0)" \
+ "Active subprograms (Ctrl+0)" ;# <-- NOT TRANSLATED YET
+ ##ID:002936##
+ mcset $l "Hardware" \
+ "Hardware" ;# <-- NOT TRANSLATED YET
+ ##ID:002937##
+ mcset $l "Hide" \
+ "Hide" ;# <-- NOT TRANSLATED YET
+ ##ID:002938##
+ mcset $l "Show the panel" \
+ "Show the panel" ;# <-- NOT TRANSLATED YET
+ ##ID:002939##
+ mcset $l "Hardware tools" \
+ "Hardware tools" ;# <-- NOT TRANSLATED YET
+ ##ID:002940##
+ mcset $l "Hardware tools manager" \
+ "Hardware tools manager" ;# <-- NOT TRANSLATED YET
+ ##ID:002941##
+ mcset $l "MCU register watches (Ctrl+9)" \
+ "MCU register watches (Ctrl+9)" ;# <-- NOT TRANSLATED YET
+ ##ID:002942##
+ mcset $l "Register watches for internal data memory, external data memory and expanded data memory" \
+ "Register watches for internal data memory, external data memory and expanded data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002943##
+ mcset $l "Move to previous bookmark" \
+ "Move to previous bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002944##
+ mcset $l "Go to to line of previous bookmark" \
+ "Go to to line of previous bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002945##
+ mcset $l "Move to the next bookmark" \
+ "Move to the next bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002946##
+ mcset $l "Go to to line of next bookmark" \
+ "Go to to line of next bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002947##
+ mcset $l "Add/Remove bookmark on the current line" \
+ "Add/Remove bookmark on the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:002948##
+ mcset $l "Add/Remove bookmark on the current line in editor" \
+ "Add/Remove bookmark on the current line in editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002949##
+ mcset $l "Clear all bookmarks" \
+ "Clear all bookmarks" ;# <-- NOT TRANSLATED YET
+ ##ID:002950##
+ mcset $l "Clear all bookmarks from editor" \
+ "Clear all bookmarks from editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002951##
+ mcset $l "Move to previous breakpoint" \
+ "Move to previous breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:002952##
+ mcset $l "Go to to line of previous breakpoint" \
+ "Go to to line of previous breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:002953##
+ mcset $l "Move to next breakpoint" \
+ "Move to next breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:002954##
+ mcset $l "Go to to line of next breakpoint" \
+ "Go to to line of next breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:002955##
+ mcset $l "Add/Remove breakpoint on the current line" \
+ "Add/Remove breakpoint on the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:002956##
+ mcset $l "Add/Remove breakpoint on the current line in editor" \
+ "Add/Remove breakpoint on the current line in editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002957##
+ mcset $l "Clear all breakpoints" \
+ "Clear all breakpoints" ;# <-- NOT TRANSLATED YET
+ ##ID:002958##
+ mcset $l "Clear all breakpoints from editor" \
+ "Clear all breakpoints from editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002959##
+ mcset $l "Reevaluate" \
+ "Reevaluate" ;# <-- NOT TRANSLATED YET
+ ##ID:002960##
+ mcset $l "Reevaluate ..." \
+ "Reevaluate ..." ;# <-- NOT TRANSLATED YET
+ ##ID:002961##
+ mcset $l "Clear search string" \
+ "Clear search string" ;# <-- NOT TRANSLATED YET
+ ##ID:002962##
+ mcset $l "Search for a constant, variable, function or macro" \
+ "Search for a constant, variable, function or macro" ;# <-- NOT TRANSLATED YET
+ ##ID:002963##
+ mcset $l " Search:" \
+ " Search:" ;# <-- NOT TRANSLATED YET
+}
+# X.tcl
+# ==============================================================================
+namespace eval X {
+ ##ID:002964##
+ mcset $l "Options" \
+ "Options" ;# <-- NOT TRANSLATED YET
+ ##ID:002965##
+ mcset $l "Case sensitive" \
+ "Case sensitive" ;# <-- NOT TRANSLATED YET
+ ##ID:002966##
+ mcset $l "Backwards" \
+ "Backwards" ;# <-- NOT TRANSLATED YET
+ ##ID:002967##
+ mcset $l "From cursor" \
+ "From cursor" ;# <-- NOT TRANSLATED YET
+ ##ID:002968##
+ mcset $l "Regular expr." \
+ "Regular expr." ;# <-- NOT TRANSLATED YET
+ ##ID:002969##
+ mcset $l "Prompt on replace" \
+ "Prompt on replace" ;# <-- NOT TRANSLATED YET
+ ##ID:002970##
+ mcset $l "Case sensitive search" \
+ "Case sensitive search" ;# <-- NOT TRANSLATED YET
+ ##ID:002971##
+ mcset $l "Search backwards from the specified location" \
+ "Search backwards from the specified location" ;# <-- NOT TRANSLATED YET
+ ##ID:002972##
+ mcset $l "Start search from cursor instead of beginning" \
+ "Start search from cursor instead of beginning" ;# <-- NOT TRANSLATED YET
+ ##ID:002973##
+ mcset $l "Use search string as regular expression" \
+ "Use search string as regular expression" ;# <-- NOT TRANSLATED YET
+ ##ID:002974##
+ mcset $l "Selected text" \
+ "Selected text" ;# <-- NOT TRANSLATED YET
+ ##ID:002975##
+ mcset $l "Search within selected text only" \
+ "Search within selected text only" ;# <-- NOT TRANSLATED YET
+ ##ID:002976##
+ mcset $l "Save" \
+ "Save" ;# <-- NOT TRANSLATED YET
+ ##ID:002977##
+ mcset $l "Save this project" \
+ "Save this project" ;# <-- NOT TRANSLATED YET
+ ##ID:002978##
+ mcset $l "Edit project" \
+ "Edit project" ;# <-- NOT TRANSLATED YET
+ ##ID:002979##
+ mcset $l "Edit additional project detail" \
+ "Edit additional project detail" ;# <-- NOT TRANSLATED YET
+ ##ID:002980##
+ mcset $l "Save and close" \
+ "Save and close" ;# <-- NOT TRANSLATED YET
+ ##ID:002981##
+ mcset $l "Save and close this project" \
+ "Save and close this project" ;# <-- NOT TRANSLATED YET
+ ##ID:002982##
+ mcset $l "Close without saving" \
+ "Close without saving" ;# <-- NOT TRANSLATED YET
+ ##ID:002983##
+ mcset $l "Close this project" \
+ "Close this project" ;# <-- NOT TRANSLATED YET
+ ##ID:002984##
+ mcset $l "Move left" \
+ "Move left" ;# <-- NOT TRANSLATED YET
+ ##ID:002985##
+ mcset $l "Move this tab to right the beginning of the tab bar" \
+ "Move this tab to right the beginning of the tab bar" ;# <-- NOT TRANSLATED YET
+ ##ID:002986##
+ mcset $l "Move right" \
+ "Move right" ;# <-- NOT TRANSLATED YET
+ ##ID:002987##
+ mcset $l "Move this tab to right the end of the tab bar" \
+ "Move this tab to right the end of the tab bar" ;# <-- NOT TRANSLATED YET
+ ##ID:002988##
+ mcset $l "Move to beginning" \
+ "Move to beginning" ;# <-- NOT TRANSLATED YET
+ ##ID:002989##
+ mcset $l "Move to end" \
+ "Move to end" ;# <-- NOT TRANSLATED YET
+ ##ID:002990##
+ mcset $l "Export to XHTML - MCU 8051 IDE" \
+ "Export to XHTML - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002991##
+ mcset $l "Export to LaTeX - MCU 8051 IDE" \
+ "Export to LaTeX - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002992##
+ mcset $l "Export to XHTML file" \
+ "Export to XHTML file" ;# <-- NOT TRANSLATED YET
+ ##ID:002993##
+ mcset $l "Export to LaTeX file" \
+ "Export to LaTeX file" ;# <-- NOT TRANSLATED YET
+ ##ID:002994##
+ mcset $l "Hexadecimal number" \
+ "Hexadecimal number" ;# <-- NOT TRANSLATED YET
+ ##ID:002995##
+ mcset $l "Octal number" \
+ "Octal number" ;# <-- NOT TRANSLATED YET
+ ##ID:002996##
+ mcset $l "Decimal number" \
+ "Decimal number" ;# <-- NOT TRANSLATED YET
+ ##ID:002997##
+ mcset $l "Binary number" \
+ "Binary number" ;# <-- NOT TRANSLATED YET
+ ##ID:002998##
+ mcset $l "Constant" \
+ "Constant" ;# <-- NOT TRANSLATED YET
+ ##ID:002999##
+ mcset $l "Generic number" \
+ "Generic number" ;# <-- NOT TRANSLATED YET
+ ##ID:003000##
+ mcset $l "Comment" \
+ "Comment" ;# <-- NOT TRANSLATED YET
+ ##ID:003001##
+ mcset $l "Control sequence" \
+ "Control sequence" ;# <-- NOT TRANSLATED YET
+ ##ID:003002##
+ mcset $l "Symbol" \
+ "Symbol" ;# <-- NOT TRANSLATED YET
+ ##ID:003003##
+ mcset $l "Directive" \
+ "Directive" ;# <-- NOT TRANSLATED YET
+ ##ID:003004##
+ mcset $l "Label" \
+ "Label" ;# <-- NOT TRANSLATED YET
+ ##ID:003005##
+ mcset $l "Instruction" \
+ "Instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003006##
+ mcset $l "SFR register" \
+ "SFR register" ;# <-- NOT TRANSLATED YET
+ ##ID:003007##
+ mcset $l "Indirect address" \
+ "Indirect address" ;# <-- NOT TRANSLATED YET
+ ##ID:003008##
+ mcset $l "Immediate hex" \
+ "Immediate hex" ;# <-- NOT TRANSLATED YET
+ ##ID:003009##
+ mcset $l "Immediate oct" \
+ "Immediate oct" ;# <-- NOT TRANSLATED YET
+ ##ID:003010##
+ mcset $l "Immediate dec" \
+ "Immediate dec" ;# <-- NOT TRANSLATED YET
+ ##ID:003011##
+ mcset $l "Immediate bin" \
+ "Immediate bin" ;# <-- NOT TRANSLATED YET
+ ##ID:003012##
+ mcset $l "Immediate const" \
+ "Immediate const" ;# <-- NOT TRANSLATED YET
+ ##ID:003013##
+ mcset $l "Immediate generic" \
+ "Immediate generic" ;# <-- NOT TRANSLATED YET
+ ##ID:003014##
+ mcset $l "Macro instruction" \
+ "Macro instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003015##
+ mcset $l "Uppercase" \
+ "Uppercase" ;# <-- NOT TRANSLATED YET
+ ##ID:003016##
+ mcset $l "Lowercase" \
+ "Lowercase" ;# <-- NOT TRANSLATED YET
+ ##ID:003017##
+ mcset $l "Keep case" \
+ "Keep case" ;# <-- NOT TRANSLATED YET
+ ##ID:003018##
+ mcset $l "Code listing files" \
+ "Code listing files" ;# <-- NOT TRANSLATED YET
+ ##ID:003019##
+ mcset $l "Assembly debug files (before v1.0.5)" \
+ "Assembly debug files (before v1.0.5)" ;# <-- NOT TRANSLATED YET
+ ##ID:003020##
+ mcset $l "IHEX object code files" \
+ "IHEX object code files" ;# <-- NOT TRANSLATED YET
+ ##ID:003021##
+ mcset $l "Binary object code files" \
+ "Binary object code files" ;# <-- NOT TRANSLATED YET
+ ##ID:003022##
+ mcset $l "HTML files" \
+ "HTML files" ;# <-- NOT TRANSLATED YET
+ ##ID:003023##
+ mcset $l "TeX sources" \
+ "TeX sources" ;# <-- NOT TRANSLATED YET
+ ##ID:003024##
+ mcset $l "Hibernated programs" \
+ "Hibernated programs" ;# <-- NOT TRANSLATED YET
+ ##ID:003025##
+ mcset $l "ASL: NoICE-compatible command file" \
+ "ASL: NoICE-compatible command file" ;# <-- NOT TRANSLATED YET
+ ##ID:003026##
+ mcset $l "ASL: Atmel debug file used by the AVR tools" \
+ "ASL: Atmel debug file used by the AVR tools" ;# <-- NOT TRANSLATED YET
+ ##ID:003027##
+ mcset $l "SDCC: The memory map for the load module" \
+ "SDCC: The memory map for the load module" ;# <-- NOT TRANSLATED YET
+ ##ID:003028##
+ mcset $l "ASL object files" \
+ "ASL object files" ;# <-- NOT TRANSLATED YET
+ ##ID:003029##
+ mcset $l "Macro definition file" \
+ "Macro definition file" ;# <-- NOT TRANSLATED YET
+ ##ID:003030##
+ mcset $l "Macro output files" \
+ "Macro output files" ;# <-- NOT TRANSLATED YET
+ ##ID:003031##
+ mcset $l "SDCC IHEX8 object files" \
+ "SDCC IHEX8 object files" ;# <-- NOT TRANSLATED YET
+ ##ID:003032##
+ mcset $l "MCU 8051 IDE Assembler debug files" \
+ "MCU 8051 IDE Assembler debug files" ;# <-- NOT TRANSLATED YET
+ ##ID:003033##
+ mcset $l "SDCC Assembler debug files" \
+ "SDCC Assembler debug files" ;# <-- NOT TRANSLATED YET
+ ##ID:003034##
+ mcset $l "SDCC: Object file created by the assembler" \
+ "SDCC: Object file created by the assembler" ;# <-- NOT TRANSLATED YET
+ ##ID:003035##
+ mcset $l "SDCC debug files" \
+ "SDCC debug files" ;# <-- NOT TRANSLATED YET
+ ##ID:003036##
+ mcset $l "SDCC: A file with a summary of the memory usage" \
+ "SDCC: A file with a summary of the memory usage" ;# <-- NOT TRANSLATED YET
+ ##ID:003037##
+ mcset $l "SDCC: Linker script" \
+ "SDCC: Linker script" ;# <-- NOT TRANSLATED YET
+ ##ID:003038##
+ mcset $l "SDCC: Symbol listing for the source file" \
+ "SDCC: Symbol listing for the source file" ;# <-- NOT TRANSLATED YET
+ ##ID:003039##
+ mcset $l "OMF-51 object files" \
+ "OMF-51 object files" ;# <-- NOT TRANSLATED YET
+ ##ID:003040##
+ mcset $l "SDCC: Listing file updated with linkedit information" \
+ "SDCC: Listing file updated with linkedit information" ;# <-- NOT TRANSLATED YET
+ ##ID:003041##
+ mcset $l "MD5 hashes for C source files" \
+ "MD5 hashes for C source files" ;# <-- NOT TRANSLATED YET
+ ##ID:003042##
+ mcset $l "Doxygen backup file" \
+ "Doxygen backup file" ;# <-- NOT TRANSLATED YET
+ ##ID:003043##
+ mcset $l "Assembly language sources" \
+ "Assembly language sources" ;# <-- NOT TRANSLATED YET
+ ##ID:003044##
+ mcset $l "Register watches definition files" \
+ "Register watches definition files" ;# <-- NOT TRANSLATED YET
+ ##ID:003045##
+ mcset $l "MCU 8051 IDE hibernated program" \
+ "MCU 8051 IDE hibernated program" ;# <-- NOT TRANSLATED YET
+ ##ID:003046##
+ mcset $l "MCU 8051 IDE project" \
+ "MCU 8051 IDE roject" ;# <-- NOT TRANSLATED YET
+ ##ID:003047##
+ mcset $l "C sources" \
+ "C sources" ;# <-- NOT TRANSLATED YET
+ ##ID:003048##
+ mcset $l "C headers" \
+ "C headers" ;# <-- NOT TRANSLATED YET
+ ##ID:003049##
+ mcset $l "Virtual Hardware Component" \
+ "Virtual Hardware Component" ;# <-- NOT TRANSLATED YET
+ ##ID:003050##
+ mcset $l "Virtual Hardware" \
+ "Virtual Hardware" ;# <-- NOT TRANSLATED YET
+ ##ID:003051##
+ mcset $l "Text files" \
+ "Text files" ;# <-- NOT TRANSLATED YET
+ ##ID:003052##
+ mcset $l "All backup files" \
+ "All backup files" ;# <-- NOT TRANSLATED YET
+ ##ID:003053##
+ mcset $l "echo \"This is a custom command\"\necho \"\tYou can configure it in Main menu->Configure->Edit user commands.\"\necho \"\tCustom commands are intended for running external programs from this IDE (e.g. program uploaders)\"" \
+ "echo \"This is a custom command\"\necho \"\tYou can configure it in Main menu->Configure->Edit user commands.\"\necho \"\tCustom commands are intended for running external programs from this IDE (e.g. program uploaders)\"" ;# <-- NOT TRANSLATED YET
+ ##ID:003054##
+ mcset $l "More: Main menu -> Configure -> Edit user commands" \
+ "More: Main menu -> Configure -> Edit user commands" ;# <-- NOT TRANSLATED YET
+ ##ID:003055##
+ mcset $l "Unable to compile" \
+ "Unable to compile" ;# <-- NOT TRANSLATED YET
+ ##ID:003056##
+ mcset $l "Simulator is engaged, shutdown the simulator first." \
+ "Simulator is engaged, shutdown the simulator first." ;# <-- NOT TRANSLATED YET
+ ##ID:003057##
+ mcset $l "Open file - MCU 8051 IDE" \
+ "Open file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003058##
+ mcset $l "New file - MCU 8051 IDE" \
+ "New file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003059##
+ mcset $l "Assembly language" \
+ "Assembly language" ;# <-- NOT TRANSLATED YET
+ ##ID:003060##
+ mcset $l "C source" \
+ "C source" ;# <-- NOT TRANSLATED YET
+ ##ID:003061##
+ mcset $l "C header" \
+ "C header" ;# <-- NOT TRANSLATED YET
+ ##ID:003062##
+ mcset $l "Code listing" \
+ "Code listing" ;# <-- NOT TRANSLATED YET
+ ##ID:003063##
+ mcset $l "All files" \
+ "All files" ;# <-- NOT TRANSLATED YET
+ ##ID:003064##
+ mcset $l "File not found - MCU 8051 IDE" \
+ "File not found - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003065##
+ mcset $l "The selected file do not exist:\n%s" \
+ "The selected file do not exist:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:003066##
+ mcset $l "Save file - MCU 8051 IDE" \
+ "Save file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003067##
+ mcset $l "Text to find:" \
+ "Text to find:" ;# <-- NOT TRANSLATED YET
+ ##ID:003068##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:003069##
+ mcset $l "Cancel" \
+ "Cancel" ;# <-- NOT TRANSLATED YET
+ ##ID:003070##
+ mcset $l "Find - MCU 8051 IDE" \
+ "Find - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003071##
+ mcset $l "Unable to execute" \
+ "Unable to execute" ;# <-- NOT TRANSLATED YET
+ ##ID:003072##
+ mcset $l "Search result: %s matches found" \
+ "Search result: %s matches found" ;# <-- NOT TRANSLATED YET
+ ##ID:003073##
+ mcset $l "Find - %s" \
+ "Find - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003074##
+ mcset $l "Search string '%s' not found !" \
+ "Search string '%s' not found !" ;# <-- NOT TRANSLATED YET
+ ##ID:003075##
+ mcset $l "Beginning of document reached\n\nContinue from end ?" \
+ "Beginning of document reached\n\nContinue from end ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003076##
+ mcset $l "End of document reached\n\nContinue from beginning ?" \
+ "End of document reached\n\nContinue from beginning ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003077##
+ mcset $l "Editor: Nothing to search ..." \
+ "Editor: Nothing to search ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003078##
+ mcset $l "Text to find: " \
+ "Text to find: " ;# <-- NOT TRANSLATED YET
+ ##ID:003079##
+ mcset $l "Replace with:" \
+ "Replace with:" ;# <-- NOT TRANSLATED YET
+ ##ID:003080##
+ mcset $l "Replace - MCU 8051 IDE" \
+ "Replace - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003081##
+ mcset $l "Replace - %s" \
+ "Replace - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003082##
+ mcset $l "Found an occurrence of your search term.\nWhat do you want to do ?" \
+ "Found an occurrence of your search term.\nWhat do you want to do ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003083##
+ mcset $l "Replace" \
+ "Replace" ;# <-- NOT TRANSLATED YET
+ ##ID:003084##
+ mcset $l "Replace & close" \
+ "Replace & close" ;# <-- NOT TRANSLATED YET
+ ##ID:003085##
+ mcset $l "Replace all" \
+ "Replace all" ;# <-- NOT TRANSLATED YET
+ ##ID:003086##
+ mcset $l "Find next" \
+ "Find next" ;# <-- NOT TRANSLATED YET
+ ##ID:003087##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:003088##
+ mcset $l "Replace confirmation - %s" \
+ "Replace confirmation - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003089##
+ mcset $l "Go to line" \
+ "Go to line" ;# <-- NOT TRANSLATED YET
+ ##ID:003090##
+ mcset $l "Go to line - MCU 8051 IDE" \
+ "Go to line - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003091##
+ mcset $l "Choose directory - MCU 8051 IDE" \
+ "Choose directory - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003092##
+ mcset $l "Create a new project.\n All entries are required. Other options --> edit project." \
+ "Create a new project.\n All entries are required. Other options --> edit project." ;# <-- NOT TRANSLATED YET
+ ##ID:003093##
+ mcset $l "General" \
+ "General" ;# <-- NOT TRANSLATED YET
+ ##ID:003094##
+ mcset $l "Project name" \
+ "Project name" ;# <-- NOT TRANSLATED YET
+ ##ID:003095##
+ mcset $l "Project directory" \
+ "Project directory" ;# <-- NOT TRANSLATED YET
+ ##ID:003096##
+ mcset $l "Choose destination location" \
+ "Choose destination location" ;# <-- NOT TRANSLATED YET
+ ##ID:003097##
+ mcset $l "Processor" \
+ "Processor" ;# <-- NOT TRANSLATED YET
+ ##ID:003098##
+ mcset $l "External RAM (XDATA)" \
+ "External RAM (XDATA)" ;# <-- NOT TRANSLATED YET
+ ##ID:003099##
+ mcset $l "External ROM/FLASH (XCODE)" \
+ "External ROM/FLASH (XCODE)" ;# <-- NOT TRANSLATED YET
+ ##ID:003100##
+ mcset $l "Type:" \
+ "Type:" ;# <-- NOT TRANSLATED YET
+ ##ID:003101##
+ mcset $l "Selected uC" \
+ "Selected uC" ;# <-- NOT TRANSLATED YET
+ ##ID:003102##
+ mcset $l "Select MCU" \
+ "Select MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:003103##
+ mcset $l "Choose processor from database" \
+ "Choose processor from database" ;# <-- NOT TRANSLATED YET
+ ##ID:003104##
+ mcset $l "Enable" \
+ "Enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003105##
+ mcset $l "Connect external data memory" \
+ "Connect external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:003106##
+ mcset $l "Amount of external data memory" \
+ "Amount of external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:003107##
+ mcset $l "Connect external program memory" \
+ "Connect external program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:003108##
+ mcset $l "Amount of total program memory minus internal program memory" \
+ "Amount of total program memory minus internal program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:003109##
+ mcset $l "New project - MCU 8051 IDE" \
+ "New project - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003110##
+ mcset $l "Invalid request" \
+ "Invalid request" ;# <-- NOT TRANSLATED YET
+ ##ID:003111##
+ mcset $l "Both entries in section general must be filled." \
+ "Both entries in section general must be filled." ;# <-- NOT TRANSLATED YET
+ ##ID:003112##
+ mcset $l "Create directory - MCU 8051 IDE" \
+ "Create directory - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003113##
+ mcset $l "The specified directory does not exist do you want to create it ?" \
+ "The specified directory does not exist do you want to create it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003114##
+ mcset $l "File access error" \
+ "File access error" ;# <-- NOT TRANSLATED YET
+ ##ID:003115##
+ mcset $l "Creation of directory '%s' FAILED !\nPlease check your permissions." \
+ "Creation of directory '%s' FAILED !\nPlease check your permissions." ;# <-- NOT TRANSLATED YET
+ ##ID:003116##
+ mcset $l "File already exists - MCU 8051 IDE" \
+ "File already exists - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003117##
+ mcset $l "Some project with the same name already exists in the specified directory. \nDo you want to overwrite it ?" \
+ "Some project with the same name already exists in the specified directory. \nDo you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003118##
+ mcset $l "Unable to write to file:\n\"%s\"" \
+ "Unable to write to file:\n\"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:003119##
+ mcset $l "Open project - MCU 8051 IDE" \
+ "Open project - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003120##
+ mcset $l "Error - MCU 8051 IDE" \
+ "Error - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003121##
+ mcset $l "Unable to load file: %s" \
+ "Unable to load file: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003122##
+ mcset $l "Project saved to %s" \
+ "Project saved to %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003123##
+ mcset $l "IO Error" \
+ "IO Error" ;# <-- NOT TRANSLATED YET
+ ##ID:003124##
+ mcset $l "General information" \
+ "General information" ;# <-- NOT TRANSLATED YET
+ ##ID:003125##
+ mcset $l "Version" \
+ "Version" ;# <-- NOT TRANSLATED YET
+ ##ID:003126##
+ mcset $l "Date" \
+ "Date" ;# <-- NOT TRANSLATED YET
+ ##ID:003127##
+ mcset $l "Copyright" \
+ "Copyright" ;# <-- NOT TRANSLATED YET
+ ##ID:003128##
+ mcset $l "License" \
+ "License" ;# <-- NOT TRANSLATED YET
+ ##ID:003129##
+ mcset $l "Authors:" \
+ "Authors:" ;# <-- NOT TRANSLATED YET
+ ##ID:003130##
+ mcset $l "List of project authors (one per line):" \
+ "List of project authors (one per line):" ;# <-- NOT TRANSLATED YET
+ ##ID:003131##
+ mcset $l "XDATA" \
+ "XDATA" ;# <-- NOT TRANSLATED YET
+ ##ID:003132##
+ mcset $l "XCODE" \
+ "XCODE" ;# <-- NOT TRANSLATED YET
+ ##ID:003133##
+ mcset $l "Clock \[kHz\]:" \
+ "Clock \[kHz\]:" ;# <-- NOT TRANSLATED YET
+ ##ID:003134##
+ mcset $l "Main file:" \
+ "Main file:" ;# <-- NOT TRANSLATED YET
+ ##ID:003135##
+ mcset $l "Project main file (e.g. main.c)\n(empty string means always compile current file)" \
+ "Project main file (e.g. main.c)\n(empty string means always compile current file)" ;# <-- NOT TRANSLATED YET
+ ##ID:003136##
+ mcset $l "Size of external data memory" \
+ "Size of external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:003137##
+ mcset $l "Project description" \
+ "Project description" ;# <-- NOT TRANSLATED YET
+ ##ID:003138##
+ mcset $l "Edit project - MCU 8051 IDE" \
+ "Edit project - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003139##
+ mcset $l "Select main file - %s - MCU 8051 IDE" \
+ "Select main file - %s - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003140##
+ mcset $l "New values saved." \
+ "New values saved." ;# <-- NOT TRANSLATED YET
+ ##ID:003141##
+ mcset $l "Requesting confirmation %s" \
+ "Requesting confirmation %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003142##
+ mcset $l "Are you sure want to close the project without saving changes ?" \
+ "Are you sure want to close the project without saving changes ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003143##
+ mcset $l "Unable to run assembler" \
+ "Unable to run assembler" ;# <-- NOT TRANSLATED YET
+ ##ID:003144##
+ mcset $l "Something is already running in background." \
+ "Something is already running in background." ;# <-- NOT TRANSLATED YET
+ ##ID:003145##
+ mcset $l "Compiling ..." \
+ "Compiling ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003146##
+ mcset $l "Compiler not found" \
+ "Compiler not found" ;# <-- NOT TRANSLATED YET
+ ##ID:003147##
+ mcset $l "Unable to find sdcc, please install sdcc and restart MCU 8051 IDE" \
+ "Unable to find sdcc, please install sdcc and restart MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003148##
+ mcset $l "MCU 8051 IDE Native assembler" \
+ "MCU 8051 IDE Native assembler" ;# <-- NOT TRANSLATED YET
+ ##ID:003149##
+ mcset $l "%s assembler not found" \
+ "%s assembler not found" ;# <-- NOT TRANSLATED YET
+ ##ID:003150##
+ mcset $l "Unable to run program \"%s\". Please check if you have installed this assembler or choose a different one in compiler configuration dialog." \
+ "Unable to run program \"%s\". Please check if you have installed this assembler or choose a different one in compiler configuration dialog." ;# <-- NOT TRANSLATED YET
+ ##ID:003151##
+ mcset $l "Compiler crash - MCU 8051 IDE" \
+ "Compiler crash - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003152##
+ mcset $l "Compiler crashed, we are terribly sorry about that.\n\nPlease report this bug via project web or mail to author and please don't forget to include source code on which this error occurred." \
+ "Compiler crashed, we are terribly sorry about that.\n\nPlease report this bug via project web or mail to author and please don't forget to include source code on which this error occurred." ;# <-- NOT TRANSLATED YET
+ ##ID:003153##
+ mcset $l "Compilation successful" \
+ "Compilation successful" ;# <-- NOT TRANSLATED YET
+ ##ID:003154##
+ mcset $l "Compilation failed" \
+ "Compilation failed" ;# <-- NOT TRANSLATED YET
+ ##ID:003155##
+ mcset $l "Compilation failed, see messages for details." \
+ "Compilation failed, see messages for details." ;# <-- NOT TRANSLATED YET
+ ##ID:003156##
+ mcset $l "Compilation: " \
+ "Compilation: " ;# <-- NOT TRANSLATED YET
+ ##ID:003157##
+ mcset $l "Abort" \
+ "Abort" ;# <-- NOT TRANSLATED YET
+ ##ID:003158##
+ mcset $l "This editor seems to be empty" \
+ "This editor seems to be empty" ;# <-- NOT TRANSLATED YET
+ ##ID:003159##
+ mcset $l "Export dialog" \
+ "Export dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:003160##
+ mcset $l "Finishing syntax highlight ..." \
+ "Finishing syntax highlight ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003161##
+ mcset $l "Export as %s - MCU 8051 IDE" \
+ "Export as %s - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003162##
+ mcset $l "Permission denied" \
+ "Permission denied" ;# <-- NOT TRANSLATED YET
+ ##ID:003163##
+ mcset $l "Unable to access file: %s" \
+ "Unable to access file: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003164##
+ mcset $l "Overwrite file" \
+ "Overwrite file" ;# <-- NOT TRANSLATED YET
+ ##ID:003165##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "A file name '%s' already exists. Are you sure you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003166##
+ mcset $l "Unable to write to file: \"%s\"" \
+ "Unable to write to file: \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:003167##
+ mcset $l "\[lindex \$args 1\] - MCU 8051 IDE" \
+ "\[lindex \$args 1\] - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003168##
+ mcset $l "Converting ..." \
+ "Converting ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003169##
+ mcset $l "Exported data saved to %s" \
+ "Exported data saved to %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003170##
+ mcset $l "\nExiting program on user request ..." \
+ "\nExiting program on user request ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003171##
+ mcset $l "An error occurred when saving the last session" \
+ "An error occurred when saving the last session" ;# <-- NOT TRANSLATED YET
+ ##ID:003172##
+ mcset $l "Saving project: %s" \
+ "Saving project: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003173##
+ mcset $l "Program terminated" \
+ "Program terminated" ;# <-- NOT TRANSLATED YET
+ ##ID:003174##
+ mcset $l "Unable to save running configuration" \
+ "Unable to save running configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:003175##
+ mcset $l "Access denied" \
+ "Access denied" ;# <-- NOT TRANSLATED YET
+ ##ID:003176##
+ mcset $l "The following documents have been modified,\ndo you want to save them before closing ?" \
+ "The following documents have been modified,\ndo you want to save them before closing ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003177##
+ mcset $l "Unsaved files" \
+ "Unsaved files" ;# <-- NOT TRANSLATED YET
+ ##ID:003178##
+ mcset $l "Project: \"%s\"" \
+ "Project: \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:003179##
+ mcset $l "Save selected" \
+ "Save selected" ;# <-- NOT TRANSLATED YET
+ ##ID:003180##
+ mcset $l "Save all" \
+ "Save all" ;# <-- NOT TRANSLATED YET
+ ##ID:003181##
+ mcset $l "Discard" \
+ "Discard" ;# <-- NOT TRANSLATED YET
+ ##ID:003182##
+ mcset $l "Attention" \
+ "Attention" ;# <-- NOT TRANSLATED YET
+ ##ID:003183##
+ mcset $l "You have to chose one action" \
+ "You have to chose one action" ;# <-- NOT TRANSLATED YET
+ ##ID:003184##
+ mcset $l "Exit program - MCU 8051 IDE" \
+ "Exit program - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003185##
+ mcset $l "Simulator is not started" \
+ "Simulator is not started" ;# <-- NOT TRANSLATED YET
+ ##ID:003186##
+ mcset $l "Simulator is busy" \
+ "Simulator is busy" ;# <-- NOT TRANSLATED YET
+ ##ID:003187##
+ mcset $l "Recompile ?" \
+ "Recompile ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003188##
+ mcset $l "MD5 hashes verification failed. That probably means than some source files have been modified since last compilation.\n\nDo you want to recompile the code ?" \
+ "MD5 hashes verification failed. That probably means than some source files have been modified since last compilation.\n\nDo you want to recompile the code ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003189##
+ mcset $l "File not found" \
+ "File not found" ;# <-- NOT TRANSLATED YET
+ ##ID:003190##
+ mcset $l "Simulator data file not found.\nDo you want create it ?" \
+ "Simulator data file not found.\nDo you want create it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003191##
+ mcset $l "Unable to start simulator" \
+ "Unable to start simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:003192##
+ mcset $l "Unable to read simulator file. Possibly you have disabled generation of simulator file in compiler configuration dialog." \
+ "Unable to read simulator file. Possibly you have disabled generation of simulator file in compiler configuration dialog." ;# <-- NOT TRANSLATED YET
+ ##ID:003193##
+ mcset $l "Unable to find hex file" \
+ "Unable to find hex file" ;# <-- NOT TRANSLATED YET
+ ##ID:003194##
+ mcset $l "Unable to open:\n'%s'" \
+ "Unable to open:\n'%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:003195##
+ mcset $l "Unable to gain unlimited access to the given file" \
+ "Unable to gain unlimited access to the given file" ;# <-- NOT TRANSLATED YET
+ ##ID:003196##
+ mcset $l "Parsing file ..." \
+ "Parsing file ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003197##
+ mcset $l "Unable to open file:\n\"%s\"\nfor writing" \
+ "Unable to open file:\n\"%s\"\nfor writing" ;# <-- NOT TRANSLATED YET
+ ##ID:003198##
+ mcset $l "Error(s) occurred while parsing IHEX file - %s" \
+ "Error(s) occurred while parsing IHEX file - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003199##
+ mcset $l "grab release %s; destroy %s" \
+ "grab release %s; destroy %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003200##
+ mcset $l "Input file" \
+ "Input file" ;# <-- NOT TRANSLATED YET
+ ##ID:003201##
+ mcset $l "Output file" \
+ "Output file" ;# <-- NOT TRANSLATED YET
+ ##ID:003202##
+ mcset $l "File where to save result" \
+ "File where to save result" ;# <-- NOT TRANSLATED YET
+ ##ID:003203##
+ mcset $l "Invoke dialog to select output file" \
+ "Invoke dialog to select output file" ;# <-- NOT TRANSLATED YET
+ ##ID:003204##
+ mcset $l "Convert Binary file to Intel HEX 8 - MCU 8051 IDE" \
+ "Convert Binary file to Intel HEX 8 - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003205##
+ mcset $l "Convert Intel HEX 8 to binary file - MCU 8051 IDE" \
+ "Convert Intel HEX 8 to binary file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003206##
+ mcset $l "Convert sim file to Intel HEX 8 - MCU 8051 IDE" \
+ "Convert sim file to Intel HEX 8 - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003207##
+ mcset $l "Both entries must be filled" \
+ "Both entries must be filled" ;# <-- NOT TRANSLATED YET
+ ##ID:003208##
+ mcset $l "Unable to open file '%s'" \
+ "Unable to open file '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:003209##
+ mcset $l "Loading file ..." \
+ "Loading file ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003210##
+ mcset $l "Saving file ..." \
+ "Saving file ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003211##
+ mcset $l "Corrupted file - MCU 8051 IDE" \
+ "Corrupted file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003212##
+ mcset $l "IHEX 8" \
+ "IHEX 8" ;# <-- NOT TRANSLATED YET
+ ##ID:003213##
+ mcset $l "The selected file %s does not exist." \
+ "The selected file %s does not exist." ;# <-- NOT TRANSLATED YET
+ ##ID:003214##
+ mcset $l "Disassembly failed" \
+ "Decompilation failed" ;# <-- NOT TRANSLATED YET
+ ##ID:003215##
+ mcset $l "Decompilation failed -- see messages for details" \
+ "Decompilation failed -- see messages for details" ;# <-- NOT TRANSLATED YET
+ ##ID:003216##
+ mcset $l "\nLoading IHEX file ..." \
+ "\nLoading IHEX file ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003217##
+ mcset $l "Unable to open file" \
+ "Unable to open file" ;# <-- NOT TRANSLATED YET
+ ##ID:003218##
+ mcset $l "Unable to read file '%s'" \
+ "Unable to read file '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:003219##
+ mcset $l "Successful" \
+ "Successful" ;# <-- NOT TRANSLATED YET
+ ##ID:003220##
+ mcset $l "FAILED" \
+ "FAILED" ;# <-- NOT TRANSLATED YET
+ ##ID:003221##
+ mcset $l "About dialog" \
+ "About dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:003222##
+ mcset $l "About" \
+ "About" ;# <-- NOT TRANSLATED YET
+ ##ID:003223##
+ mcset $l "An open source IDE for MCS-51 based microconrollers for POSIX Systems, this software is licenced under the GNU GPL v2 licence. You can find more at the project web page http://mcu8051ide.sourceforge.net\n" \
+ "An open source IDE for MCS-51 based microconrollers for POSIX Systems, this software is licenced under the GNU GPL v2 licence. You can find more at the project web page http://mcu8051ide.sourceforge.net\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003224##
+ mcset $l "You are currently using version for Microsoft® Windows®.\n" \
+ "You are currently using version for Microsoft® Windows®.\n"
+ ##ID:003226##
+ mcset $l "Web: http://mcu8051ide.sourceforge.net\n" \
+ "Web: http://mcu8051ide.sourceforge.net\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003227##
+ mcset $l "Thanks to SDCC development team for their great work !\n" \
+ "Thanks to SDCC development team for their great work !\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003228##
+ mcset $l "Thanks to %s for their help during development\n" \
+ "Thanks to %s for their help during development\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003229##
+ mcset $l "Thanks to" \
+ "Thanks to" ;# <-- NOT TRANSLATED YET
+ ##ID:003230##
+ mcset $l "SDCC developers:\n" \
+ "SDCC developers:\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003231##
+ mcset $l "\n(Please post suggestions to %s)\n" \
+ "\n(Please post suggestions to %s)\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003232##
+ mcset $l "FILE \"license.txt\" WAS NOT FOUND\n\n" \
+ "FILE \"license.txt\" WAS NOT FOUND\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003233##
+ mcset $l "Text of the license agreement is not available,\n" \
+ "Text of the license agreement is not available,\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003234##
+ mcset $l "please check your installation." \
+ "please check your installation." ;# <-- NOT TRANSLATED YET
+ ##ID:003235##
+ mcset $l "About - MCU 8051 IDE" \
+ "About - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003236##
+ mcset $l "Unable to indent C source without program indent, please install indent and restart MCU 8051 IDE." \
+ "Unable to indent C source without program indent, please install indent and restart MCU 8051 IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:003237##
+ mcset $l "Unable to indent C source code.\n\n%s" \
+ "Unable to indent C source code.\n\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:003238##
+ mcset $l "Reformatting code" \
+ "Reformatting code" ;# <-- NOT TRANSLATED YET
+ ##ID:003239##
+ mcset $l "Options dialog" \
+ "Options dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:003240##
+ mcset $l "Backup files" \
+ "Backup files" ;# <-- NOT TRANSLATED YET
+ ##ID:003241##
+ mcset $l "Other files" \
+ "Other files" ;# <-- NOT TRANSLATED YET
+ ##ID:003242##
+ mcset $l "Remove files" \
+ "Remove files" ;# <-- NOT TRANSLATED YET
+ ##ID:003243##
+ mcset $l "Cleanup project folder - MCU 8051 IDE" \
+ "Cleanup project folder - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003244##
+ mcset $l "Cleanup project folder" \
+ "Cleanup project folder" ;# <-- NOT TRANSLATED YET
+ ##ID:003245##
+ mcset $l "Are you sure ?" \
+ "Are you sure ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003246##
+ mcset $l "These files will be removed" \
+ "These files will be removed" ;# <-- NOT TRANSLATED YET
+ ##ID:003247##
+ mcset $l "Proceed" \
+ "Proceed" ;# <-- NOT TRANSLATED YET
+ ##ID:003248##
+ mcset $l "%d file(s) removed." \
+ "%d file(s) removed." ;# <-- NOT TRANSLATED YET
+ ##ID:003249##
+ mcset $l "Confirm termination - MCU 8051 IDE" \
+ "Confirm termination - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003250##
+ mcset $l "This process is already in progress. Do you want to terminate it ?" \
+ "This process is already in progress. Do you want to terminate it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003251##
+ mcset $l "Confirmation required" \
+ "Confirmation required" ;# <-- NOT TRANSLATED YET
+ ##ID:003252##
+ mcset $l "Do you really want to execute\ncustom command %s ?" \
+ "Do you really want to execute\ncustom command %s ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003253##
+ mcset $l "Warning - Custom command" \
+ "Warning - Custom command" ;# <-- NOT TRANSLATED YET
+ ##ID:003254##
+ mcset $l "Some variables in user command could not be resolved." \
+ "Some variables in user command could not be resolved." ;# <-- NOT TRANSLATED YET
+ ##ID:003255##
+ mcset $l "Custom command finished" \
+ "Custom command finished" ;# <-- NOT TRANSLATED YET
+ ##ID:003256##
+ mcset $l "Custom command failed" \
+ "Custom command failed" ;# <-- NOT TRANSLATED YET
+ ##ID:003257##
+ mcset $l "Custom command %s - MCU 8051 IDE" \
+ "Custom command %s - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:004500##
+ mcset $l "Unknow error" \
+ "Unknow error" ;# <-- NOT TRANSLATED YET
+ ##ID:004501##
+ mcset $l "Unable to execute your script in the urxvt terminal emulator." \
+ "Unable to execute your script in the urxvt terminal emulator." ;# <-- NOT TRANSLATED YET
+ ##ID:004502##
+ mcset $l "Kill the script?" \
+ "Kill the script?" ;# <-- NOT TRANSLATED YET
+ ##ID:004503##
+ mcset $l "Closing this window terminates all child processes of the terminal.\n\nDo you want to proceed?" \
+ "Closing this window terminates all child processes of the terminal.\n\nDo you want to proceed?" ;# <-- NOT TRANSLATED YET
+ ##ID:003258##
+ mcset $l "Welcome dialog" \
+ "Welcome dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:003259##
+ mcset $l "Welcome to MCU 8051 IDE !" \
+ "Welcome to MCU 8051 IDE !" ;# <-- NOT TRANSLATED YET
+ ##ID:003260##
+ mcset $l "Click here to open demonstration project." \
+ "Click here to open demonstration project." ;# <-- NOT TRANSLATED YET
+ ##ID:003261##
+ mcset $l "MCU 8051 IDE is a fully featured Integrated Development Environment" \
+ "MCU 8051 IDE is fully featured Integrated Development Environment" ;# <-- NOT TRANSLATED YET
+ ##ID:003262##
+ mcset $l " for MCS-51 based microcontrollers. It's written for POSIX Operating Systems (GNU/Linux, etc.) " \
+ " for MCS-51 based microcontrollers. It's written for POSIX Operating Systems (GNU/Linux, etc.) " ;# <-- NOT TRANSLATED YET
+ ##ID:003263##
+ mcset $l "and since version 1.3.5 it is also available for Microsoft® Windows® operating system." \
+ "and since version 1.3.5 it is also available for Microsoft® Windows® operating system." ;# <-- NOT TRANSLATED YET
+ ##ID:003264##
+ mcset $l "Main features:" \
+ "Main features:" ;# <-- NOT TRANSLATED YET
+ ##ID:003265##
+ mcset $l "Editor with syntax highlight, validation and popup-based completion\n\t" \
+ "Editor with syntax highlight, validation and popup-based completion\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003266##
+ mcset $l "MCS-51 Assembler and Disassembler\n\t" \
+ "MCS-51 Assembler and Disassembler\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003267##
+ mcset $l "MCS-51 Simulator (not all MCUs are fully supported !)\n\t" \
+ "MCS-51 Simulator (not all MCUs are fully supported !)\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003268##
+ mcset $l "Support for C language (using C compiler SDCC)\n\t" \
+ "Support for C language (using C compiler SDCC)\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003269##
+ mcset $l "Partial support for some HW tools\n\t" \
+ "Partial support for some HW tools\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003270##
+ mcset $l "Project management\n\t" \
+ "Project management\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003271##
+ mcset $l "Custom editable commands (using shell scripts)\n\t" \
+ "Custom editable commands (using shell scripts)\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003272##
+ mcset $l "Dynamic help for instruction at the current line\n\t" \
+ "Dynamic help for instruction at the current line\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003273##
+ mcset $l "Hexadecimal editor for eXternal RAM, Expanded RAM, Code memory, etc.\n\t" \
+ "Hexadecimal editor for eXternal RAM, Expanded RAM, Code memory, etc.\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003274##
+ mcset $l "Scientific calculator\n\t" \
+ "Scientific calculator\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003275##
+ mcset $l "Simple hardware simulation (LED's, etc.)\n\t" \
+ "Simple hardware simulation (LED's, etc.)\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003276##
+ mcset $l "Graph showing voltage levels on ports\n\n" \
+ "Graph showing voltage levels on ports\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003277##
+ mcset $l "Where to start:" \
+ "Where to start:" ;# <-- NOT TRANSLATED YET
+ ##ID:003278##
+ mcset $l "\n\t1. Create a new project" \
+ "\n\t1. Create a new project" ;# <-- NOT TRANSLATED YET
+ ##ID:003279##
+ mcset $l "Enter project name\n\t\t" \
+ "Enter project name\n\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003280##
+ mcset $l "Choose project directory\n\t\t" \
+ "Choose project directory\n\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003281##
+ mcset $l "Choose microcontroller (e.g. AT89S52)\n" \
+ "Choose microcontroller (e.g. AT89S52)\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003282##
+ mcset $l "\t2. Write your code in the opened editor and click on " \
+ "\t2. Write your code in the opened editor and click on " ;# <-- NOT TRANSLATED YET
+ ##ID:003283##
+ mcset $l " to start the simulator\n" \
+ " to start the simulator\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003284##
+ mcset $l "\t3. Step through your program by clicking on " \
+ "\t3. Step through your program by clicking on " ;# <-- NOT TRANSLATED YET
+ ##ID:003285##
+ mcset $l "Web site:" \
+ "Web site:" ;# <-- NOT TRANSLATED YET
+ ##ID:003286##
+ mcset $l "Author:" \
+ "Author:" ;# <-- NOT TRANSLATED YET
+ ##ID:003287##
+ mcset $l "Thank you for using/trying MCU 8051 IDE." \
+ "Thank you for using/trying MCU 8051 IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:003288##
+ mcset $l "Welcome to MCU 8051 IDE" \
+ "Welcome to MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003289##
+ mcset $l "Change letter case" \
+ "Change letter case" ;# <-- NOT TRANSLATED YET
+ ##ID:003290##
+ mcset $l "U" \
+ "U" ;# <-- NOT TRANSLATED YET
+ ##ID:003291##
+ mcset $l "L" \
+ "L" ;# <-- NOT TRANSLATED YET
+ ##ID:003292##
+ mcset $l "All " \
+ "All " ;# <-- NOT TRANSLATED YET
+ ##ID:003293##
+ mcset $l "Change letter case - MCU 8051 IDE" \
+ "Change letter case - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003294##
+ mcset $l "Formatting ..." \
+ "Formatting ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003295##
+ mcset $l "File name:" \
+ "File name:" ;# <-- NOT TRANSLATED YET
+ ##ID:003296##
+ mcset $l "Path:" \
+ "Path:" ;# <-- NOT TRANSLATED YET
+ ##ID:003297##
+ mcset $l "MCU:" \
+ "MCU:" ;# <-- NOT TRANSLATED YET
+ ##ID:003298##
+ mcset $l "XDATA:" \
+ "XDATA:" ;# <-- NOT TRANSLATED YET
+ ##ID:003299##
+ mcset $l "XCODE:" \
+ "XCODE:" ;# <-- NOT TRANSLATED YET
+ ##ID:003300##
+ mcset $l "Clock:" \
+ "Clock:" ;# <-- NOT TRANSLATED YET
+ ##ID:003301##
+ mcset $l "Default clock used by simulator engine" \
+ "Default clock used by simulator engine" ;# <-- NOT TRANSLATED YET
+ ##ID:003302##
+ mcset $l "Version:" \
+ "Version:" ;# <-- NOT TRANSLATED YET
+ ##ID:003303##
+ mcset $l "Project version (any string)" \
+ "Project version (any string)" ;# <-- NOT TRANSLATED YET
+ ##ID:003304##
+ mcset $l "Date:" \
+ "Date:" ;# <-- NOT TRANSLATED YET
+ ##ID:003305##
+ mcset $l "Project last update" \
+ "Project last update" ;# <-- NOT TRANSLATED YET
+ ##ID:003306##
+ mcset $l "Fill date entry with the current date" \
+ "Fill date entry with the current date" ;# <-- NOT TRANSLATED YET
+ ##ID:003307##
+ mcset $l "License:" \
+ "License:" ;# <-- NOT TRANSLATED YET
+ ##ID:003308##
+ mcset $l "Name of the license" \
+ "Name of the license" ;# <-- NOT TRANSLATED YET
+ ##ID:003309##
+ mcset $l "Copyright:" \
+ "Copyright:" ;# <-- NOT TRANSLATED YET
+ ##ID:003310##
+ mcset $l "Copyright information" \
+ "Copyright information" ;# <-- NOT TRANSLATED YET
+ ##ID:003311##
+ mcset $l "< Undefined >" \
+ "< Undefined >" ;# <-- NOT TRANSLATED YET
+ ##ID:003312##
+ mcset $l "%s - EEPROM write buffer" \
+ "%s - EEPROM write buffer" ;# <-- NOT TRANSLATED YET
+ ##ID:003313##
+ mcset $l "OFFSET = " \
+ "OFFSET = " ;# <-- NOT TRANSLATED YET
+ ##ID:003314##
+ mcset $l "Cursor: " \
+ "Cursor: " ;# <-- NOT TRANSLATED YET
+ ##ID:003315##
+ mcset $l "EEPROM write buffer - %s - MCU 8051 IDE" \
+ "EEPROM write buffer - %s - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003316##
+ mcset $l "This operation cannot be performed on an untitled file" \
+ "This operation cannot be performed on an untitled file" ;# <-- NOT TRANSLATED YET
+ ##ID:003317##
+ mcset $l "This file does not contain any part of the running program" \
+ "This file does not contain any part of the running program" ;# <-- NOT TRANSLATED YET
+ ##ID:003319##
+ mcset $l "Line to address" \
+ "Line to address" ;# <-- NOT TRANSLATED YET
+ ##ID:003320##
+ mcset $l "PC = " \
+ "PC = " ;# <-- NOT TRANSLATED YET
+ ##ID:003321##
+ mcset $l "Program jump" \
+ "Program jump" ;# <-- NOT TRANSLATED YET
+ ##ID:003322##
+ mcset $l "Subprogram call" \
+ "Subprogram call" ;# <-- NOT TRANSLATED YET
+ ##ID:003323##
+ mcset $l "Graphical representation of the line where to go" \
+ "Graphical representation of the line where to go" ;# <-- NOT TRANSLATED YET
+ ##ID:003324##
+ mcset $l "Line where to go" \
+ "Line where to go" ;# <-- NOT TRANSLATED YET
+ ##ID:003325##
+ mcset $l "Unable to resolve" \
+ "Unable to resolve" ;# <-- NOT TRANSLATED YET
+ ##ID:003326##
+ mcset $l "Hibernate running program - MCU 8051 IDE" \
+ "Hibernate running program - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003327##
+ mcset $l "Resume hibernated program - MCU 8051 IDE" \
+ "Resume hibernated program - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003328##
+ mcset $l "Hibernation failed" \
+ "Hibernation failed" ;# <-- NOT TRANSLATED YET
+ ##ID:003329##
+ mcset $l "Unable to write to file:\n%s\nCheck your permissions." \
+ "Unable to write to file:\n%s\nCheck your permissions." ;# <-- NOT TRANSLATED YET
+ ##ID:003330##
+ mcset $l "Resumption failed" \
+ "Resumption failed" ;# <-- NOT TRANSLATED YET
+ ##ID:003331##
+ mcset $l "Unable to read file:\n%s\nCheck your permissions." \
+ "Unable to read file:\n%s\nCheck your permissions." ;# <-- NOT TRANSLATED YET
+ ##ID:003332##
+ mcset $l "This hibernation is corrupted or it is not MCU 8051 IDE M5IHIB file." \
+ "This hibernation is corrupted or it is not MCU 8051 IDE M5IHIB file." ;# <-- NOT TRANSLATED YET
+ ##ID:003333##
+ mcset $l "Unable to change directory to '%s'." \
+ "Unable to change directory to '%s'." ;# <-- NOT TRANSLATED YET
+ ##ID:003334##
+ mcset $l "\nUnable to change directory to '%s'\n" \
+ "\nUnable to change directory to '%s'\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003335##
+ mcset $l "Unable to find Doxygen" \
+ "Unable to find Doxygen" ;# <-- NOT TRANSLATED YET
+ ##ID:003336##
+ mcset $l "Unable to find Doxygen. Please install doxygen and restart MCU 8051 IDE." \
+ "Unable to find Doxygen. Please install doxygen and restart MCU 8051 IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:003337##
+ mcset $l "Unable to find doxywizard" \
+ "Unable to find doxywizard" ;# <-- NOT TRANSLATED YET
+ ##ID:003338##
+ mcset $l "Unable to find doxywizard. Please install doxygen and restart MCU 8051 IDE." \
+ "Unable to find doxywizard. Please install doxygen and restart MCU 8051 IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:003339##
+ mcset $l "\nError: Unable to change directory to '%s'\n" \
+ "\nError: Unable to change directory to '%s'\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003340##
+ mcset $l "Unable to gain file statistics while external editor is used" \
+ "Unable to gain file statistics while external editor is used" ;# <-- NOT TRANSLATED YET
+ ##ID:003341##
+ mcset $l "Characters" \
+ "Characters" ;# <-- NOT TRANSLATED YET
+ ##ID:003342##
+ mcset $l "Words and numbers:" \
+ "Words and numbers:" ;# <-- NOT TRANSLATED YET
+ ##ID:003343##
+ mcset $l "Alphanumeric characters and connector punctuation characters" \
+ "Alphanumeric characters and connector punctuation characters" ;# <-- NOT TRANSLATED YET
+ ##ID:003344##
+ mcset $l "Comments:" \
+ "Comments:" ;# <-- NOT TRANSLATED YET
+ ##ID:003345##
+ mcset $l "Characters highlighted as comments" \
+ "Characters highlighted as comments" ;# <-- NOT TRANSLATED YET
+ ##ID:003346##
+ mcset $l "Other characters:" \
+ "Other characters:" ;# <-- NOT TRANSLATED YET
+ ##ID:003347##
+ mcset $l "All other characters without EOLs (e.g. spaces and brackets)" \
+ "All other characters without EOLs (e.g. spaces and brackets)" ;# <-- NOT TRANSLATED YET
+ ##ID:003348##
+ mcset $l "Total characters:" \
+ "Total characters:" ;# <-- NOT TRANSLATED YET
+ ##ID:003349##
+ mcset $l "All characters in the text without EOLs" \
+ "All characters in the text without EOLs" ;# <-- NOT TRANSLATED YET
+ ##ID:003350##
+ mcset $l "Strings" \
+ "Strings" ;# <-- NOT TRANSLATED YET
+ ##ID:003351##
+ mcset $l "Words:" \
+ "Words:" ;# <-- NOT TRANSLATED YET
+ ##ID:003352##
+ mcset $l "Just normal words (not keywords and not comments)" \
+ "Just normal words (not keywords and not comments)" ;# <-- NOT TRANSLATED YET
+ ##ID:003353##
+ mcset $l "Keywords:" \
+ "Keywords:" ;# <-- NOT TRANSLATED YET
+ ##ID:003354##
+ mcset $l "Instructions, Assembler directives, C directives, C keywords" \
+ "Instructions, Assembler directives, C directives, C keywords" ;# <-- NOT TRANSLATED YET
+ ##ID:003355##
+ mcset $l "Words in comments" \
+ "Words in comments" ;# <-- NOT TRANSLATED YET
+ ##ID:003356##
+ mcset $l "Total strings:" \
+ "Total strings:" ;# <-- NOT TRANSLATED YET
+ ##ID:003357##
+ mcset $l "Total number of words in the text" \
+ "Total number of words in the text" ;# <-- NOT TRANSLATED YET
+ ##ID:003358##
+ mcset $l "Lines" \
+ "Lines" ;# <-- NOT TRANSLATED YET
+ ##ID:003359##
+ mcset $l "Empty lines:" \
+ "Empty lines:" ;# <-- NOT TRANSLATED YET
+ ##ID:003360##
+ mcset $l "Totally empty lines (without even spaces)" \
+ "Totally empty lines (without even spaces)" ;# <-- NOT TRANSLATED YET
+ ##ID:003361##
+ mcset $l "Commented lines:" \
+ "Commented lines:" ;# <-- NOT TRANSLATED YET
+ ##ID:003362##
+ mcset $l "Lines which are all commented" \
+ "Lines which are all commented" ;# <-- NOT TRANSLATED YET
+ ##ID:003363##
+ mcset $l "Normal lines:" \
+ "Normal lines:" ;# <-- NOT TRANSLATED YET
+ ##ID:003364##
+ mcset $l "Just normal code lines" \
+ "Just normal code lines" ;# <-- NOT TRANSLATED YET
+ ##ID:003365##
+ mcset $l "Total lines:" \
+ "Total lines:" ;# <-- NOT TRANSLATED YET
+ ##ID:003366##
+ mcset $l "Total number of lines in the text" \
+ "Total number of lines in the text" ;# <-- NOT TRANSLATED YET
+ ##ID:003367##
+ mcset $l "Copy" \
+ "Copy" ;# <-- NOT TRANSLATED YET
+ ##ID:003368##
+ mcset $l "File statistics - MCU 8051 IDE" \
+ "File statistics - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003369##
+ mcset $l "Statistics for: %s\n\n" \
+ "Statistics for: %s\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003370##
+ mcset $l "Characters:\n" \
+ "Characters:\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003371##
+ mcset $l " Words and numbers:\t\t%s\n" \
+ " Words and numbers:\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003372##
+ mcset $l " Comments:\t\t\t%s\n" \
+ " Comments:\t\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003373##
+ mcset $l " Other characters:\t\t%s\n" \
+ " Other characters:\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003374##
+ mcset $l " ------\n" \
+ " ------\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003375##
+ mcset $l " Total characters:\t\t%s\n\n" \
+ " Total characters:\t\t%s\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003376##
+ mcset $l "Strings:\n" \
+ "Strings:\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003377##
+ mcset $l " Words:\t\t\t%s\n" \
+ " Words:\t\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003378##
+ mcset $l " Keywords:\t\t\t%s\n" \
+ " Keywords:\t\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003379##
+ mcset $l " Total strings:\t\t%s\n" \
+ " Total strings:\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003380##
+ mcset $l "Lines:\n" \
+ "Lines:\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003381##
+ mcset $l " Empty lines:\t\t\t%s\n" \
+ " Empty lines:\t\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003382##
+ mcset $l " Commented lines:\t\t%s\n" \
+ " Commented lines:\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003383##
+ mcset $l " Normal lines:\t\t\t%s\n" \
+ " Normal lines:\t\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003384##
+ mcset $l " Total lines:\t\t\t%s\n" \
+ " Total lines:\t\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003385##
+ mcset $l "Unable to read file:\n\"%s\"" \
+ "Unable to read file:\n\"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:003386##
+ mcset $l "File modified" \
+ "File modified" ;# <-- NOT TRANSLATED YET
+ ##ID:003387##
+ mcset $l "The current VHW connections have been modified,\ndo you want to save them before closing ?" \
+ "The current VHW connections have been modified,\ndo you want to save them before closing ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003388##
+ mcset $l "Open file - Virtual HW - MCU 8051 IDE" \
+ "Open file - Virtual HW - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003389##
+ mcset $l "Virtual HW" \
+ "Virtual HW" ;# <-- NOT TRANSLATED YET
+ ##ID:003390##
+ mcset $l "VH component" \
+ "VH component" ;# <-- NOT TRANSLATED YET
+ ##ID:004525##
+ mcset $l "All relevant" \
+ "All relevant" ;# <-- NOT TRANSLATED YET
+ ##ID:003391##
+ mcset $l "Load file - Virtual HW - MCU 8051 IDE" \
+ "Load file - Virtual HW - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003392##
+ mcset $l "Unable to save Virtual HW connections" \
+ "Unable to save Virtual HW connections" ;# <-- NOT TRANSLATED YET
+ ##ID:003393##
+ mcset $l "Save file - Virtual HW - MCU 8051 IDE" \
+ "Save file - Virtual HW - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003394##
+ mcset $l "A file name '%s' already exists. Do you want to overwrite it ?" \
+ "A file name '%s' already exists. Do you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003395##
+ mcset $l "Unable to save file:\n\"%s\"" \
+ "Unable to save file:\n\"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:003396##
+ mcset $l "Do you really want to remove all virtual hardware from the current simulation scenario ?" \
+ "Do you really want to remove all virtual hardware from the current simulation scenario ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003397##
+ mcset $l "Set display size" \
+ "Set display size" ;# <-- NOT TRANSLATED YET
+}
+# simulator_gui.tcl
+# ==============================================================================
+namespace eval Simulator_GUI {
+ set ::SFB_TRANSLATIONS {
+ ##ID:003398##
+ mcset $l "Bit address: 0xD7 -- Carry Flag" \
+ "Bit address: 0xD7 -- Carry Flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003399##
+ mcset $l "Bit address: 0xD6 -- Auxiliary Carry Flag" \
+ "Bit address: 0xD6 -- Auxiliary Carry Flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003400##
+ mcset $l "Bit address: 0xD5 -- Flag 0 available to the user for general purpose" \
+ "Bit address: 0xD5 -- Flag 0 available to the user for general purpose" ;# <-- NOT TRANSLATED YET
+ ##ID:003401##
+ mcset $l "Bit address: 0xD4 -- Register Bank selector bit 1" \
+ "Bit address: 0xD4 -- Register Bank selector bit 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003402##
+ mcset $l "Bit address: 0xD3 -- Register Bank selector bit 0" \
+ "Bit address: 0xD3 -- Register Bank selector bit 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003403##
+ mcset $l "Bit address: 0xD2 -- Overflow Flag" \
+ "Bit address: 0xD2 -- Overflow Flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003404##
+ mcset $l "Bit address: 0xD1 -- Usable as a general purpose flag" \
+ "Bit address: 0xD1 -- Usable as a general purpose flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003405##
+ mcset $l "Bit address: 0xD0 -- Parity flag" \
+ "Bit address: 0xD0 -- Parity flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003406##
+ mcset $l "Bit address: 0x9F -- Framing Error bit" \
+ "Bit address: 0x9F -- Framing Error bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003407##
+ mcset $l "Bit address: 0x8F -- Timer 1 overflow flag" \
+ "Bit address: 0x8F -- Timer 1 overflow flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003408##
+ mcset $l "Bit address: 0x8E -- Timer 1 run control bit" \
+ "Bit address: 0x8E -- Timer 1 run control bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003409##
+ mcset $l "Bit address: 0x8D -- Timer 0 overflow flag" \
+ "Bit address: 0x8D -- Timer 0 overflow flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003410##
+ mcset $l "Bit address: 0x8C -- Timer 0 run control bit" \
+ "Bit address: 0x8C -- Timer 0 run control bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003411##
+ mcset $l "Bit address: 0x8B -- External Interrupt 1 edge flag" \
+ "Bit address: 0x8B -- External Interrupt 1 edge flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003412##
+ mcset $l "Bit address: 0x8A -- Interrupt 1 type control bit" \
+ "Bit address: 0x8A -- Interrupt 1 type control bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003413##
+ mcset $l "Bit address: 0x89 -- External Interrupt 0 edge flag" \
+ "Bit address: 0x89 -- External Interrupt 0 edge flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003414##
+ mcset $l "Bit address: 0x88 -- Interrupt 0 type control bit" \
+ "Bit address: 0x88 -- Interrupt 0 type control bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003415##
+ mcset $l "Bit address: 0xA8 -- Enable or disable External Interrupt 0" \
+ "Bit address: 0xA8 -- Enable or disable External Interrupt 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003416##
+ mcset $l "Bit address: 0xA9 -- Enable or disable the Timer 0 overflow interrupt" \
+ "Bit address: 0xA9 -- Enable or disable the Timer 0 overflow interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003417##
+ mcset $l "Bit address: 0xAA -- Enable or disable External Interrupt 1" \
+ "Bit address: 0xAA -- Enable or disable External Interrupt 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003418##
+ mcset $l "Bit address: 0xAB -- Enable or disable the Timer 1 overflow interrupt" \
+ "Bit address: 0xAB -- Enable or disable the Timer 1 overflow interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003419##
+ mcset $l "Bit address: 0xAC -- Enable or disable the serial port interrupt" \
+ "Bit address: 0xAC -- Enable or disable the serial port interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003420##
+ mcset $l "Bit address: 0xAD -- Enable or disable the Timer 2 overflow interrupt" \
+ "Bit address: 0xAD -- Enable or disable the Timer 2 overflow interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003421##
+ mcset $l "Bit address: 0xAE -- Enable or disable the comparator interrupt" \
+ "Bit address: 0xAE -- Enable or disable the comparator interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003422##
+ mcset $l "Bit address: 0xB8 -- Defines the External Interrupt 0 priority level" \
+ "Bit address: 0xB8 -- Defines the External Interrupt 0 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003423##
+ mcset $l "Bit address: 0xB9 -- Defines the Timer 0 interrupt priority level" \
+ "Bit address: 0xB9 -- Defines the Timer 0 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003424##
+ mcset $l "Bit address: 0xBA -- Defines External Interrupt 1 priority level" \
+ "Bit address: 0xBA -- Defines External Interrupt 1 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003425##
+ mcset $l "Bit address: 0xBB -- Defines the Timer 1 interrupt priority level" \
+ "Bit address: 0xBB -- Defines the Timer 1 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003426##
+ mcset $l "Bit address: 0xBC -- Defines the Serial Port interrupt priority level" \
+ "Bit address: 0xBC -- Defines the Serial Port interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003427##
+ mcset $l "Bit address: 0xBD -- Defines the Timer 2 interrupt priority level" \
+ "Bit address: 0xBD -- Defines the Timer 2 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003428##
+ mcset $l "Bit address: 0xBE -- Defines the comparator interrupt priority level" \
+ "Bit address: 0xBE -- Defines the comparator interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003429##
+ mcset $l "Bit address: 0x98 -- Receive interrupt flag" \
+ "Bit address: 0x98 -- Receive interrupt flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003430##
+ mcset $l "Bit address: 0x99 -- Transmit interrupt flag" \
+ "Bit address: 0x99 -- Transmit interrupt flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003431##
+ mcset $l "Bit address: 0xCF -- Timer 2 overflow flag" \
+ "Bit address: 0xCF -- Timer 2 overflow flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003432##
+ mcset $l "Bit address: 0xCE -- Timer 2 external flag" \
+ "Bit address: 0xCE -- Timer 2 external flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003433##
+ mcset $l "Bit address: 0xBF -- Not implemented" \
+ "Bit address: 0xBF -- Not implemented" ;# <-- NOT TRANSLATED YET
+ ##ID:003434##
+ mcset $l "Bit address: 0xAF -- Disables all interrupts" \
+ "Bit address: 0xAF -- Disables all interrupts" ;# <-- NOT TRANSLATED YET
+ ##ID:003435##
+ mcset $l "Bit address: 0x9F -- Serial Port mode specifier" \
+ "Bit address: 0x9F -- Serial Port mode specifier" ;# <-- NOT TRANSLATED YET
+ ##ID:003436##
+ mcset $l "Bit address: 0x9E -- Serial Port mode specifier" \
+ "Bit address: 0x9E -- Serial Port mode specifier" ;# <-- NOT TRANSLATED YET
+ ##ID:003437##
+ mcset $l "Bit address: 0x9D -- Enables the multiprocessor communication feature" \
+ "Bit address: 0x9D -- Enables the multiprocessor communication feature" ;# <-- NOT TRANSLATED YET
+ ##ID:003438##
+ mcset $l "Bit address: 0x9C -- Enable/Disable reception" \
+ "Bit address: 0x9C -- Enable/Disable reception" ;# <-- NOT TRANSLATED YET
+ ##ID:003439##
+ mcset $l "Bit address: 0x9B -- The 9th bit that will be transmitted in modes 2 and 3" \
+ "Bit address: 0x9B -- The 9th bit that will be transmitted in modes 2 and 3" ;# <-- NOT TRANSLATED YET
+ ##ID:003440##
+ mcset $l "Bit address: 0x9A -- Receiver Bit 8" \
+ "Bit address: 0x9A -- Receiver Bit 8" ;# <-- NOT TRANSLATED YET
+ ##ID:003441##
+ mcset $l "Bit address: 0xCD -- Receive clock enable" \
+ "Bit address: 0xCD -- Receive clock enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003442##
+ mcset $l "Bit address: 0xCC -- Transmit clock enable" \
+ "Bit address: 0xCC -- Transmit clock enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003443##
+ mcset $l "Bit address: 0xCB -- Timer 2 external enable" \
+ "Bit address: 0xCB -- Timer 2 external enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003444##
+ mcset $l "Bit address: 0xCA -- Start/Stop control for Timer 2" \
+ "Bit address: 0xCA -- Start/Stop control for Timer 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003445##
+ mcset $l "Bit address: 0xC9 -- Timer or counter select for Timer 2" \
+ "Bit address: 0xC9 -- Timer or counter select for Timer 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003446##
+ mcset $l "Bit address: 0xC8 -- Capture/Reload select" \
+ "Bit address: 0xC8 -- Capture/Reload select" ;# <-- NOT TRANSLATED YET
+ }
+ eval ${SFB_TRANSLATIONS}
+ ##ID:003447##
+ mcset $l "Set to 1" \
+ "Set to 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003448##
+ mcset $l "Set this bit to 1" \
+ "Set this bit to 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003449##
+ mcset $l "Set to 0" \
+ "Set to 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003450##
+ mcset $l "Set this bit to 0" \
+ "Set this bit to 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003451##
+ mcset $l "Start/Stop simulator" \
+ "Start/Stop simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:003452##
+ mcset $l "Load program into the simulator engine, or shutdown the MCU simulator." \
+ "Load program into the simulator engine, or shutdown the MCU simulator." ;# <-- NOT TRANSLATED YET
+ ##ID:003453##
+ mcset $l "Reset" \
+ "Reset" ;# <-- NOT TRANSLATED YET
+ ##ID:003454##
+ mcset $l "Perform HW reset" \
+ "Perform HW reset" ;# <-- NOT TRANSLATED YET
+ ##ID:003455##
+ mcset $l "Step back" \
+ "Step back" ;# <-- NOT TRANSLATED YET
+ ##ID:003456##
+ mcset $l "Take MCU back to state before the last instruction" \
+ "Take MCU back to state before the last instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003457##
+ mcset $l "Step program" \
+ "Step program" ;# <-- NOT TRANSLATED YET
+ ##ID:003458##
+ mcset $l "Step by 1 instruction" \
+ "Step by 1 instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003459##
+ mcset $l "Step over" \
+ "Step over" ;# <-- NOT TRANSLATED YET
+ ##ID:003460##
+ mcset $l "Step by 1 line of code" \
+ "Step by 1 line of code" ;# <-- NOT TRANSLATED YET
+ ##ID:003461##
+ mcset $l "Animate program" \
+ "Animate program" ;# <-- NOT TRANSLATED YET
+ ##ID:003462##
+ mcset $l "Run program and show results after each instruction" \
+ "Run program and show results after each instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003463##
+ mcset $l "Run program" \
+ "Run program" ;# <-- NOT TRANSLATED YET
+ ##ID:003464##
+ mcset $l "Run program and show results after some time" \
+ "Run program and show results after some time" ;# <-- NOT TRANSLATED YET
+ ##ID:003465##
+ mcset $l "TIMERS 0 & 1" \
+ "TIMERS 0 & 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003466##
+ mcset $l "INTERRUPTS" \
+ "INTERRUPTS" ;# <-- NOT TRANSLATED YET
+ ##ID:003467##
+ mcset $l "HEX DEC BIN OCT CHAR" \
+ "HEX DEC BIN OCT CHAR" ;# <-- NOT TRANSLATED YET
+ ##ID:003468##
+ mcset $l "SFR 0xE0: Primary Accumulator" \
+ "SFR 0xE0: Primary Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:003469##
+ mcset $l "SFR 0xF0: Secondary Accumulator" \
+ "SFR 0xF0: Secondary Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:003470##
+ mcset $l "Address: %s" \
+ "Address: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003471##
+ mcset $l "SFR 0xD0: Program Status Word" \
+ "SFR 0xD0: Program Status Word" ;# <-- NOT TRANSLATED YET
+ ##ID:003472##
+ mcset $l "SFR 0x81: Stack pointer" \
+ "SFR 0x81: Stack pointer" ;# <-- NOT TRANSLATED YET
+ ##ID:003473##
+ mcset $l "Carry Flag" \
+ "Carry Flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003474##
+ mcset $l "Auxiliary Carry flag.\n(For BCD operations.)" \
+ "Auxiliary Carry flag.\n(For BCD operations.)" ;# <-- NOT TRANSLATED YET
+ ##ID:003475##
+ mcset $l "Flag 0\n(Available to the user for general purposes.)" \
+ "Flag 0\n(Available to the user for general purposes.)" ;# <-- NOT TRANSLATED YET
+ ##ID:003476##
+ mcset $l "Register bank Select control bit 1. Set/cleared\nby software to determine working register bank." \
+ "Register bank Select control bit 1. Set/cleared\nby software to determine working register bank." ;# <-- NOT TRANSLATED YET
+ ##ID:003477##
+ mcset $l "Register bank Select control bit 0. Set/cleared\nby software to determine working register bank." \
+ "Register bank Select control bit 0. Set/cleared\nby software to determine working register bank." ;# <-- NOT TRANSLATED YET
+ ##ID:003478##
+ mcset $l "Overflow flag" \
+ "Overflow flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003479##
+ mcset $l "(reserved)" \
+ "(reserved)" ;# <-- NOT TRANSLATED YET
+ ##ID:003480##
+ mcset $l "Parity flag.\nSet/cleared by hardware each instruction cycle to\nindicate and odd/even number of “one” bits in the\naccumulator, i.e., even parity." \
+ "Parity flag.\nSet/cleared by hardware each instruction cycle to\nindicate and odd/even number of “one” bits in the\naccumulator, i.e., even parity." ;# <-- NOT TRANSLATED YET
+ ##ID:003481##
+ mcset $l "SFR 0x88: Timer/Counter control register" \
+ "SFR 0x88: Timer/Counter control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003482##
+ mcset $l "Timer 1 Overflow Flag\nCleared by hardware when processor vectors to interrupt routine.\nSet by hardware on timer/counter overflow, when the timer 1 register overflows." \
+ "Timer 1 Overflow Flag\nCleared by hardware when processor vectors to interrupt routine.\nSet by hardware on timer/counter overflow, when the timer 1 register overflows." ;# <-- NOT TRANSLATED YET
+ ##ID:003483##
+ mcset $l "Timer 1 Run Control Bit\nClear to turn off timer/counter 1.\nSet to turn on timer/counter 1." \
+ "Timer 1 Run Control Bit\nClear to turn off timer/counter 1.\nSet to turn on timer/counter 1." ;# <-- NOT TRANSLATED YET
+ ##ID:003484##
+ mcset $l "Timer 0 Overflow Flag\nCleared by hardware when processor vectors to interrupt routine.\nSet by hardware on timer/counter overflow, when the timer 0 register overflows." \
+ "Timer 0 Overflow Flag\nCleared by hardware when processor vectors to interrupt routine.\nSet by hardware on timer/counter overflow, when the timer 0 register overflows." ;# <-- NOT TRANSLATED YET
+ ##ID:003485##
+ mcset $l "Timer 0 Run Control Bit\nClear to turn off timer/counter 0.\nSet to turn on timer/counter 0." \
+ "Timer 0 Run Control Bit\nClear to turn off timer/counter 0.\nSet to turn on timer/counter 0." ;# <-- NOT TRANSLATED YET
+ ##ID:003486##
+ mcset $l "Interrupt 1 Edge Flag\nCleared by hardware when interrupt is processed if edge-triggered (see IT1).\nSet by hardware when external interrupt is detected on INT1# pin." \
+ "Interrupt 1 Edge Flag\nCleared by hardware when interrupt is processed if edge-triggered (see IT1).\nSet by hardware when external interrupt is detected on INT1# pin." ;# <-- NOT TRANSLATED YET
+ ##ID:003487##
+ mcset $l "Interrupt 1 Type Control Bit\nClear to select low level active (level triggered) for external interrupt 1 (INT1#).\nSet to select falling edge active (edge triggered) for external interrupt 1." \
+ "Interrupt 1 Type Control Bit\nClear to select low level active (level triggered) for external interrupt 1 (INT1#).\nSet to select falling edge active (edge triggered) for external interrupt 1." ;# <-- NOT TRANSLATED YET
+ ##ID:003488##
+ mcset $l "Interrupt 0 Edge Flag\nCleared by hardware when interrupt is processed if edge-triggered (see IT0).\nSet by hardware when external interrupt is detected on INT0# pin." \
+ "Interrupt 0 Edge Flag\nCleared by hardware when interrupt is processed if edge-triggered (see IT0).\nSet by hardware when external interrupt is detected on INT0# pin." ;# <-- NOT TRANSLATED YET
+ ##ID:003489##
+ mcset $l "Interrupt 0 Type Control Bit\nClear to select low level active (level triggered) for external interrupt 0 (INT0#).\nSet to select falling edge active (edge triggered) for external interrupt 0." \
+ "Interrupt 0 Type Control Bit\nClear to select low level active (level triggered) for external interrupt 0 (INT0#).\nSet to select falling edge active (edge triggered) for external interrupt 0." ;# <-- NOT TRANSLATED YET
+ ##ID:003490##
+ mcset $l "Timer 1 Gating Control Bit" \
+ "Timer 1 Gating Control Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003491##
+ mcset $l "Timer 1 Counter/Timer Select Bit" \
+ "Timer 1 Counter/Timer Select Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003492##
+ mcset $l "Timer 1 Mode Select Bit" \
+ "Timer 1 Mode Select Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003493##
+ mcset $l "Timer 0 Gating Control Bit" \
+ "Timer 0 Gating Control Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003494##
+ mcset $l "Timer 0 Counter/Timer Select Bit" \
+ "Timer 0 Counter/Timer Select Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003495##
+ mcset $l "Timer 0 Mode Select Bit" \
+ "Timer 0 Mode Select Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003496##
+ mcset $l "SFR 0x89: Timer/Counter mode control register" \
+ "SFR 0x89: Timer/Counter mode control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003497##
+ mcset $l "Timer 1 Gating Control Bit\nClear to enable timer 1 whenever the TR1 bit is set.\nSet to enable timer 1 only while the INT1# pin is high and TR1 bit is set." \
+ "Timer 1 Gating Control Bit\nClear to enable timer 1 whenever the TR1 bit is set.\nSet to enable timer 1 only while the INT1# pin is high and TR1 bit is set." ;# <-- NOT TRANSLATED YET
+ ##ID:003498##
+ mcset $l "Timer 1 Counter/Timer Select Bit\nClear for timer operation: timer 1 counts the divided-down system clock.\nSet for Counter operation: timer 1 counts negative transitions on external pin T1." \
+ "Timer 1 Counter/Timer Select Bit\nClear for timer operation: timer 1 counts the divided-down system clock.\nSet for Counter operation: timer 1 counts negative transitions on external pin T1." ;# <-- NOT TRANSLATED YET
+ ##ID:003499##
+ mcset $l "Timer 1 Mode Select Bits\nM11\tM01\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH1) with 5-bit prescaler (TL1).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL1). Reloaded from TH1 at overflow.\n 1\t 1\tMode 3: timer 1 halted. Retains count." \
+ "Timer 1 Mode Select Bits\nM11\tM01\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH1) with 5-bit prescaler (TL1).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL1). Reloaded from TH1 at overflow.\n 1\t 1\tMode 3: timer 1 halted. Retains count." ;# <-- NOT TRANSLATED YET
+ ##ID:003500##
+ mcset $l "Timer 0 Gating Control Bit\nClear to enable timer 0 whenever the TR0 bit is set.\nSet to enable timer/counter 0 only while the INT0# pin is high and the TR0 bit is set." \
+ "Timer 0 Gating Control Bit\nClear to enable timer 0 whenever the TR0 bit is set.\nSet to enable timer/counter 0 only while the INT0# pin is high and the TR0 bit is set." ;# <-- NOT TRANSLATED YET
+ ##ID:003501##
+ mcset $l "Timer 0 Counter/Timer Select Bit\nClear for timer operation: timer 0 counts the divided-down system clock.\nSet for counter operation: timer 0 counts negative transitions on external pin T0." \
+ "Timer 0 Counter/Timer Select Bit\nClear for timer operation: timer 0 counts the divided-down system clock.\nSet for counter operation: timer 0 counts negative transitions on external pin T0." ;# <-- NOT TRANSLATED YET
+ ##ID:003502##
+ mcset $l "Timer 0 Mode Select Bit\nM1\tM0\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH0) with 5-bit prescaler (TL0).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL0). Reloaded from TH0 at overflow.\n 1\t 1\tMode 3: TL0 is an 8-bit timer/counter.\nTH0 is an 8-bit timer using timer 1’s TR0 and TF0 bits." \
+ "Timer 0 Mode Select Bit\nM1\tM0\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH0) with 5-bit prescaler (TL0).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL0). Reloaded from TH0 at overflow.\n 1\t 1\tMode 3: TL0 is an 8-bit timer/counter.\nTH0 is an 8-bit timer using timer 1’s TR0 and TF0 bits." ;# <-- NOT TRANSLATED YET
+ ##ID:003503##
+ mcset $l "Timer 0 Mode Select Bit\nM10\tM00\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH0) with 5-bit prescaler (TL0).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL0). Reloaded from TH0 at overflow.\n 1\t 1\tMode 3: TL0 is an 8-bit timer/counter.\nTH0 is an 8-bit timer using timer 1’s TR0 and TF0 bits." \
+ "Timer 0 Mode Select Bit\nM10\tM00\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH0) with 5-bit prescaler (TL0).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL0). Reloaded from TH0 at overflow.\n 1\t 1\tMode 3: TL0 is an 8-bit timer/counter.\nTH0 is an 8-bit timer using timer 1’s TR0 and TF0 bits." ;# <-- NOT TRANSLATED YET
+ ##ID:003504##
+ mcset $l "SFR 0xA8: Interrupt enable register" \
+ "SFR 0xA8: Interrupt enable register" ;# <-- NOT TRANSLATED YET
+ ##ID:003505##
+ mcset $l "Global disable bit. If EA = O, all Interrupts are disabled. If EA = 1, each interrupt can be\nindividually enabled or disabled by setting or clearing its enable bit." \
+ "Global disable bit. If EA = O, all Interrupts are disabled. If EA = 1, each interrupt can be\nindividually enabled or disabled by setting or clearing its enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003506##
+ mcset $l "Timer 0 interrupt enable bit." \
+ "Timer 0 interrupt enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003507##
+ mcset $l "Timer 1 interrupt enable bit." \
+ "Timer 1 interrupt enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003508##
+ mcset $l "Timer 2 interrupt enable bit." \
+ "Timer 2 interrupt enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003509##
+ mcset $l "External interrupt 1 enable bit." \
+ "External interrupt 1 enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003510##
+ mcset $l "External interrupt O enable bit." \
+ "External interrupt O enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003511##
+ mcset $l "SFR 0xB8: Interrupt priority register" \
+ "SFR 0xB8: Interrupt priority register" ;# <-- NOT TRANSLATED YET
+ ##ID:003512##
+ mcset $l "Not implemented" \
+ "Not implemented" ;# <-- NOT TRANSLATED YET
+ ##ID:003513##
+ mcset $l "Timer 1 interrupt priority bit" \
+ "Timer 1 interrupt priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003514##
+ mcset $l "External interrupt 1 priority bit" \
+ "External interrupt 1 priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003515##
+ mcset $l "Timer 0 interrupt priority bit" \
+ "Timer 0 interrupt priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003516##
+ mcset $l "External interrupt 0 priority bit" \
+ "External interrupt 0 priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003517##
+ mcset $l "SFR 0x98: Serial port control register" \
+ "SFR 0x98: Serial port control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003518##
+ mcset $l "Serial port Mode bit 0\nRefer to SM1 for serial port mode selection.\nSMOD0 must be cleared to enable access to the SM0 bit" \
+ "Serial port Mode bit 0\nRefer to SM1 for serial port mode selection.\nSMOD0 must be cleared to enable access to the SM0 bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003519##
+ mcset $l "Serial port Mode bit 1\nSM0\tSM1\tMode\tDescription\t\tBaud Rate\n0\t0\t0\tShift Register\tFCPU PERIPH/6\n0\t1\t1\t8-bit UART\tVariable\n1\t0\t2\t9-bit UART\tFCPU PERIPH /32 or /16\n1\t1\t3\t9-bit UART\tVariable" \
+ "Serial port Mode bit 1\nSM0\tSM1\tMode\tDescription\t\tBaud Rate\n0\t0\t0\tShift Register\tFCPU PERIPH/6\n0\t1\t1\t8-bit UART\tVariable\n1\t0\t2\t9-bit UART\tFCPU PERIPH /32 or /16\n1\t1\t3\t9-bit UART\tVariable" ;# <-- NOT TRANSLATED YET
+ ##ID:003520##
+ mcset $l "Serial port Mode 2 bit / Multiprocessor Communication Enable bit\nClear to disable multiprocessor communication feature.\nSet to enable multiprocessor communication feature in mode 2 and 3, and eventually mode 1. This bit should be\ncleared in mode 0" \
+ "Serial port Mode 2 bit / Multiprocessor Communication Enable bit\nClear to disable multiprocessor communication feature.\nSet to enable multiprocessor communication feature in mode 2 and 3, and eventually mode 1. This bit should be\ncleared in mode 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003521##
+ mcset $l "Reception Enable bit\nClear to disable serial reception.\nSet to enable serial reception." \
+ "Reception Enable bit\nClear to disable serial reception.\nSet to enable serial reception." ;# <-- NOT TRANSLATED YET
+ ##ID:003522##
+ mcset $l "Transmitter Bit 8 / Ninth bit to transmit in modes 2 and 3.\no transmit a logic 0 in the 9th bit.\nSet to transmit a logic 1 in the 9th bit." \
+ "Transmitter Bit 8 / Ninth bit to transmit in modes 2 and 3.\no transmit a logic 0 in the 9th bit.\nSet to transmit a logic 1 in the 9th bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003523##
+ mcset $l "Receiver Bit 8 / Ninth bit received in modes 2 and 3\nCleared by hardware if 9th bit received is a logic 0.\nSet by hardware if 9th bit received is a logic 1.\nIn mode 1, if SM2 = 0, RB8 is the received stop bit. In mode 0 RB8 is not used." \
+ "Receiver Bit 8 / Ninth bit received in modes 2 and 3\nCleared by hardware if 9th bit received is a logic 0.\nSet by hardware if 9th bit received is a logic 1.\nIn mode 1, if SM2 = 0, RB8 is the received stop bit. In mode 0 RB8 is not used." ;# <-- NOT TRANSLATED YET
+ ##ID:003524##
+ mcset $l "Transmit Interrupt flag\nClear to acknowledge interrupt.\nSet by hardware at the end of the 8th bit time in mode 0 or at the beginning of the stop bit in the other modes." \
+ "Transmit Interrupt flag\nClear to acknowledge interrupt.\nSet by hardware at the end of the 8th bit time in mode 0 or at the beginning of the stop bit in the other modes." ;# <-- NOT TRANSLATED YET
+ ##ID:003525##
+ mcset $l "Receive Interrupt flag\nClear to acknowledge interrupt.\nSet by hardware at the end of the 8th bit time in mode 0, see Figure 2-26. and Figure 2-27. in the other modes." \
+ "Receive Interrupt flag\nClear to acknowledge interrupt.\nSet by hardware at the end of the 8th bit time in mode 0, see Figure 2-26. and Figure 2-27. in the other modes." ;# <-- NOT TRANSLATED YET
+ ##ID:003526##
+ mcset $l "Power Off Flag" \
+ "Power Off Flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003527##
+ mcset $l "Power-Off Flag\nCleared to recognize next reset type.\nSet by hardware when VCC rises from 0 to its nominal voltage. Can also be set by software." \
+ "Power-Off Flag\nCleared to recognize next reset type.\nSet by hardware when VCC rises from 0 to its nominal voltage. Can also be set by software." ;# <-- NOT TRANSLATED YET
+ ##ID:003528##
+ mcset $l "General purpose flag bit" \
+ "General purpose flag bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003529##
+ mcset $l "General purpose Flag\nCleared by user for general purpose usage.\nSet by user for general purpose usage." \
+ "General purpose Flag\nCleared by user for general purpose usage.\nSet by user for general purpose usage." ;# <-- NOT TRANSLATED YET
+ ##ID:003530##
+ mcset $l "Power down bit" \
+ "Power down bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003531##
+ mcset $l "Power-Down mode bit\nCleared by hardware when reset occurs.\nSet to enter power-down mode." \
+ "Power-Down mode bit\nCleared by hardware when reset occurs.\nSet to enter power-down mode." ;# <-- NOT TRANSLATED YET
+ ##ID:003532##
+ mcset $l "Idle mode bit" \
+ "Idle mode bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003533##
+ mcset $l "Idle mode bit\nCleared by hardware when interrupt or reset occurs.\nSet to enter idle mode." \
+ "Idle mode bit\nCleared by hardware when interrupt or reset occurs.\nSet to enter idle mode." ;# <-- NOT TRANSLATED YET
+ ##ID:003534##
+ mcset $l "Double baud rate bit" \
+ "Double baud rate bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003535##
+ mcset $l "Serial port Mode bit 1 for UART\nSet to select double baud rate in mode 1, 2 or 3." \
+ "Serial port Mode bit 1 for UART\nSet to select double baud rate in mode 1, 2 or 3." ;# <-- NOT TRANSLATED YET
+ ##ID:003536##
+ mcset $l "Frame Error Select" \
+ "Frame Error Select" ;# <-- NOT TRANSLATED YET
+ ##ID:003537##
+ mcset $l "Frame Error Select. When SMOD0 = 0, SCON.7 is SM0. When SMOD0 = 1, SCON.7 is FE.\nNote that FE will be set after a frame error\nregardless of the state of SMOD0." \
+ "Frame Error Select. When SMOD0 = 0, SCON.7 is SM0. When SMOD0 = 1, SCON.7 is FE.\nNote that FE will be set after a frame error\nregardless of the state of SMOD0." ;# <-- NOT TRANSLATED YET
+ ##ID:003538##
+ mcset $l "Pulse Width Modulation Enable" \
+ "Pulse Width Modulation Enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003539##
+ mcset $l "Pulse Width Modulation Enable. When PWMEN = 1, Timer 0 and Timer 1 are\nconfigured as an 8-bit PWM counter with 8-bit auto-reload prescaler.\nThe PWM outputs on T1 (P3.5)." \
+ "Pulse Width Modulation Enable. When PWMEN = 1, Timer 0 and Timer 1 are\nconfigured as an 8-bit PWM counter with 8-bit auto-reload prescaler.\nThe PWM outputs on T1 (P3.5)." ;# <-- NOT TRANSLATED YET
+ ##ID:003540##
+ mcset $l "SFR 0xC8: Timer/Counter 2 control register" \
+ "SFR 0xC8: Timer/Counter 2 control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003541##
+ mcset $l "Timer 2 overflow Flag\nTF2 is not set if RCLK=1 or TCLK = 1.\nMust be cleared by software.\nSet by hardware on timer 2 overflow." \
+ "Timer 2 overflow Flag\nTF2 is not set if RCLK=1 or TCLK = 1.\nMust be cleared by software.\nSet by hardware on timer 2 overflow." ;# <-- NOT TRANSLATED YET
+ ##ID:003542##
+ mcset $l "Timer 2 External Flag\nSet when a capture or a reload is caused by a negative transition on T2EX pin if EXEN2=1.\nSet to cause the CPU to vector to timer 2 interrupt routine when timer 2 interrupt is enabled.\nMust be cleared by software." \
+ "Timer 2 External Flag\nSet when a capture or a reload is caused by a negative transition on T2EX pin if EXEN2=1.\nSet to cause the CPU to vector to timer 2 interrupt routine when timer 2 interrupt is enabled.\nMust be cleared by software." ;# <-- NOT TRANSLATED YET
+ ##ID:003543##
+ mcset $l "Receive Clock bit\nClear to use timer 1 overflow as receive clock for serial port in mode 1 or 3.\nSet to use timer 2 overflow as receive clock for serial port in mode 1 or 3." \
+ "Receive Clock bit\nClear to use timer 1 overflow as receive clock for serial port in mode 1 or 3.\nSet to use timer 2 overflow as receive clock for serial port in mode 1 or 3." ;# <-- NOT TRANSLATED YET
+ ##ID:003544##
+ mcset $l "Transmit Clock bit\nClear to use timer 1 overflow as transmit clock for serial port in mode 1 or 3.\nSet to use timer 2 overflow as transmit clock for serial port in mode 1 or 3." \
+ "Transmit Clock bit\nClear to use timer 1 overflow as transmit clock for serial port in mode 1 or 3.\nSet to use timer 2 overflow as transmit clock for serial port in mode 1 or 3." ;# <-- NOT TRANSLATED YET
+ ##ID:003545##
+ mcset $l "Timer 2 External Enable bit\nClear to ignore events on T2EX pin for timer 2 operation.\nSet to cause a capture or reload when a negative transition on T2EX pin is\ndetected, if timer 2 is not used to clock the serial port." \
+ "Timer 2 External Enable bit\nClear to ignore events on T2EX pin for timer 2 operation.\nSet to cause a capture or reload when a negative transition on T2EX pin is\ndetected, if timer 2 is not used to clock the serial port." ;# <-- NOT TRANSLATED YET
+ ##ID:003546##
+ mcset $l "Timer 2 Run control bit\nClear to turn off timer 2.\nSet to turn on timer 2." \
+ "Timer 2 Run control bit\nClear to turn off timer 2.\nSet to turn on timer 2." ;# <-- NOT TRANSLATED YET
+ ##ID:003547##
+ mcset $l "Timer/Counter 2 select bit\nClear for timer operation (input from internal clock system: FOSC).\nSet for counter operation (input from T2 input pin)." \
+ "Timer/Counter 2 select bit\nClear for timer operation (input from internal clock system: FOSC).\nSet for counter operation (input from T2 input pin)." ;# <-- NOT TRANSLATED YET
+ ##ID:003548##
+ mcset $l "Timer 2 Capture/Reload bit\nIf RCLK=1 or TCLK=1, CP/RL2# is ignored and timer is forced to auto-reload on timer 2 overflow.\nClear to auto-reload on timer 2 overflows or negative transitions on T2EX pin if EXEN2=1.\nSet to capture on negative transitions on T2EX pin if EXEN2=1." \
+ "Timer 2 Capture/Reload bit\nIf RCLK=1 or TCLK=1, CP/RL2# is ignored and timer is forced to auto-reload on timer 2 overflow.\nClear to auto-reload on timer 2 overflows or negative transitions on T2EX pin if EXEN2=1.\nSet to capture on negative transitions on T2EX pin if EXEN2=1." ;# <-- NOT TRANSLATED YET
+ ##ID:003549##
+ mcset $l "Reserved" \
+ "Reserved" ;# <-- NOT TRANSLATED YET
+ ##ID:003550##
+ mcset $l "Timer 2 Output Enable bit" \
+ "Timer 2 Output Enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003551##
+ mcset $l "Down Counter Enable bit" \
+ "Down Counter Enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003552##
+ mcset $l "SFR 0xC9: Timer/Counter 2 mode control register" \
+ "SFR 0xC9: Timer/Counter 2 mode control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003553##
+ mcset $l "Reserved\nThe value read from this bit is indeterminate. Do not set this bit." \
+ "Reserved\nThe value read from this bit is indeterminate. Do not set this bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003554##
+ mcset $l "Timer 2 Output Enable bit\nClear to program P1.0/T2 as clock input or I/O port.\nSet to program P1.0/T2 as clock output." \
+ "Timer 2 Output Enable bit\nClear to program P1.0/T2 as clock input or I/O port.\nSet to program P1.0/T2 as clock output." ;# <-- NOT TRANSLATED YET
+ ##ID:003555##
+ mcset $l "Down Counter Enable bit\nClear to disable timer 2 as up/down counter.\nSet to enable timer 2 as up/down counter." \
+ "Down Counter Enable bit\nClear to disable timer 2 as up/down counter.\nSet to enable timer 2 as up/down counter." ;# <-- NOT TRANSLATED YET
+ ##ID:003556##
+ mcset $l "Defines the Timer 2 interrupt priority level" \
+ "Defines the Timer 2 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003557##
+ mcset $l "Timer 2 interrupt priority bit" \
+ "Timer 2 interrupt priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003558##
+ mcset $l "Defines the Serial Port interrupt priority level" \
+ "Defines the Serial Port interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003559##
+ mcset $l "Serial Port interrupt enable bit" \
+ "Serial Port interrupt enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003560##
+ mcset $l "Serial Port interrupt priority bit" \
+ "Serial Port interrupt priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003561##
+ mcset $l "Defines the comparator interrupt priority level" \
+ "Defines the comparator interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003562##
+ mcset $l "Comparator Interrupt Priority bit" \
+ "Comparator Interrupt Priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003563##
+ mcset $l "Power-down Exit Mode" \
+ "Power-down Exit Mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003564##
+ mcset $l "Power-down Exit Mode. When PWDEX = 1, wake up from Power-down is externally controlled.\nWhen PWDEX = 0, wake up from Power-down is internally timed." \
+ "Power-down Exit Mode. When PWDEX = 1, wake up from Power-down is externally controlled.\nWhen PWDEX = 0, wake up from Power-down is internally timed." ;# <-- NOT TRANSLATED YET
+ ##ID:003565##
+ mcset $l "Internal/External RAM access using MOVX" \
+ "Internal/External RAM access using MOVX" ;# <-- NOT TRANSLATED YET
+ ##ID:003566##
+ mcset $l "Internal/External RAM access using MOVX @ Ri/@DPTR\nEXTRAM\tOperating Mode\n0\tInternal ERAM (00H-FFH) access using MOVX @ Ri/@DPTR\n1\tExternal data memory access" \
+ "Internal/External RAM access using MOVX @ Ri/@DPTR\nEXTRAM\tOperating Mode\n0\tInternal ERAM (00H-FFH) access using MOVX @ Ri/@DPTR\n1\tExternal data memory access" ;# <-- NOT TRANSLATED YET
+ ##ID:003567##
+ mcset $l "When set, this bit configures the interrupt driven exit from power-down\nto resume execution on the rising edge of the interrupt signal. When\nthis bit is cleared, the execution resumes after a self-timed interval\n(nominal 2 ms) referenced from the falling edge of the interrupt signal." \
+ "When set, this bit configures the interrupt driven exit from power-down\nto resume execution on the rising edge of the interrupt signal. When\nthis bit is cleared, the execution resumes after a self-timed interval\n(nominal 2 ms) referenced from the falling edge of the interrupt signal." ;# <-- NOT TRANSLATED YET
+ ##ID:003568##
+ mcset $l "Reserved for future expansion" \
+ "Reserved for future expansion" ;# <-- NOT TRANSLATED YET
+ ##ID:003569##
+ mcset $l "Disable/Enable Reset out" \
+ "Disable/Enable Reset out" ;# <-- NOT TRANSLATED YET
+ ##ID:003570##
+ mcset $l "Disable/Enable Reset out\nDISRTO\tOperating Mode\n0\tReset pin is driven High after WDT times out\n1\tReset pin is input only" \
+ "Disable/Enable Reset out\nDISRTO\tOperating Mode\n0\tReset pin is driven High after WDT times out\n1\tReset pin is input only" ;# <-- NOT TRANSLATED YET
+ ##ID:003571##
+ mcset $l "Disable/Enable WDT in IDLE mode" \
+ "Disable/Enable WDT in IDLE mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003572##
+ mcset $l "Disable/Enable WDT in IDLE mode\nWDIDLE\tOperating Mode\n0\tWDT continues to count in IDLE mode\n1\tWDT halts counting in IDLE mode" \
+ "Disable/Enable WDT in IDLE mode\nWDIDLE\tOperating Mode\n0\tWDT continues to count in IDLE mode\n1\tWDT halts counting in IDLE mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003573##
+ mcset $l "General purpose user flag" \
+ "General purpose user flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003574##
+ mcset $l "SFR 0x8E: Auxiliary Register" \
+ "SFR 0x8E: Auxiliary Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003575##
+ mcset $l "SFR 0xA2: Auxiliary Register 1" \
+ "SFR 0xA2: Auxiliary Register 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003576##
+ mcset $l "SFR 0x97: Analog Comparator Control and Status Register" \
+ "SFR 0x97: Analog Comparator Control and Status Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003577##
+ mcset $l "SFR 0x96: Data EEPROM Control Register" \
+ "SFR 0x96: Data EEPROM Control Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003578##
+ mcset $l "SFR 0xD5: SPI Control Register" \
+ "SFR 0xD5: SPI Control Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003579##
+ mcset $l "SFR 0xAA: SPI Status Register" \
+ "SFR 0xAA: SPI Status Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003580##
+ mcset $l "SFR 0xA7: Watchdog Control Register" \
+ "SFR 0xA7: Watchdog Control Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003581##
+ mcset $l "SFR 0xA7: Watchdog Prescaler Control Register" \
+ "SFR 0xA7: Watchdog Prescaler Control Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003582##
+ mcset $l "SFR 0xB7: Interrupt Priority High Register" \
+ "SFR 0xB7: Interrupt Priority High Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003583##
+ mcset $l "SFR 0x8F: Clock Register" \
+ "SFR 0x8F: Clock Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003584##
+ mcset $l "Defines the Timer 1 interrupt priority level" \
+ "Defines the Timer 1 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003585##
+ mcset $l "Defines External Interrupt 1 priority level" \
+ "Defines External Interrupt 1 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003586##
+ mcset $l "Defines the Timer 0 interrupt priority level" \
+ "Defines the Timer 0 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003587##
+ mcset $l "Defines the External Interrupt 0 priority level" \
+ "Defines the External Interrupt 0 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003588##
+ mcset $l "X2 mode flag" \
+ "X2 mode flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003589##
+ mcset $l "When X2 = 0, the frequency (at XTAL1 pin) is internally divided by 2 before it is used as the device system frequency.\nWhen X2 = 1, the divide by 2 is no longer used and the XTAL1 frequency becomes the device system frequency. This\nenables the user to use a 6 MHz crystal instead of a 12 MHz crystal in order to reduce EMI." \
+ "When X2 = 0, the frequency (at XTAL1 pin) is internally divided by 2 before it is used as the device system frequency.\nWhen X2 = 1, the divide by 2 is no longer used and the XTAL1 frequency becomes the device system frequency. This\nenables the user to use a 6 MHz crystal instead of a 12 MHz crystal in order to reduce EMI." ;# <-- NOT TRANSLATED YET
+ ##ID:003590##
+ mcset $l "EEPROM data memory load enable bit" \
+ "EEPROM data memory load enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003591##
+ mcset $l "EEPROM data memory write enable bit" \
+ "EEPROM data memory write enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003592##
+ mcset $l "Internal EEPROM access enable" \
+ "Internal EEPROM access enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003593##
+ mcset $l "Data pointer register select" \
+ "Data pointer register select" ;# <-- NOT TRANSLATED YET
+ ##ID:003594##
+ mcset $l "RDY/BSY (Ready/Busy) flag for the data EEPROM memory (read-only)" \
+ "RDY/BSY (Ready/Busy) flag for the data EEPROM memory (read-only)" ;# <-- NOT TRANSLATED YET
+ ##ID:003595##
+ mcset $l "Write Inhibit (read-only)" \
+ "Write Inhibit (read-only)" ;# <-- NOT TRANSLATED YET
+ ##ID:003596##
+ mcset $l "EEPROM data memory load enable bit. Used to implement Page Mode Write. A MOVX\ninstruction writing into the data EEPROM will not initiate the programming cycle\nif this bit is set, rather it will just load data into the volatile data buffer\nof the data EEPROM memory. Before the last MOVX, reset this bit and the data\nEEPROM will program all the bytes previously loaded on the same page of the\naddress given by the last MOVX instruction." \
+ "EEPROM data memory load enable bit. Used to implement Page Mode Write. A MOVX\ninstruction writing into the data EEPROM will not initiate the programming cycle\nif this bit is set, rather it will just load data into the volatile data buffer\nof the data EEPROM memory. Before the last MOVX, reset this bit and the data\nEEPROM will program all the bytes previously loaded on the same page of the\naddress given by the last MOVX instruction." ;# <-- NOT TRANSLATED YET
+ ##ID:003597##
+ mcset $l "EEPROM data memory write enable bit. Set this bit to 1 before initiating byte\nwrite to on-chip EEPROM with the MOVX instruction. User software should set\nthis bit to 0 after EEPROM write is completed." \
+ "EEPROM data memory write enable bit. Set this bit to 1 before initiating byte\nwrite to on-chip EEPROM with the MOVX instruction. User software should set\nthis bit to 0 after EEPROM write is completed." ;# <-- NOT TRANSLATED YET
+ ##ID:003598##
+ mcset $l "Internal EEPROM access enable. When EEMEN = 1, the MOVX instruction with DPTR\nwill access on-chip EEPROM instead of external data memory if the address used\nis less than 2K. When EEMEN = 0 or the address used is ≥ 2K," \
+ "Internal EEPROM access enable. When EEMEN = 1, the MOVX instruction with DPTR\nwill access on-chip EEPROM instead of external data memory if the address used\nis less than 2K. When EEMEN = 0 or the address used is ≥ 2K," ;# <-- NOT TRANSLATED YET
+ ##ID:003599##
+ mcset $l "MOVX with DPTR accesses external data memory.\nData pointer register select. DPS = 0 selects the first bank of data pointer\nregister, DP0, and DPS = 1 selects the second bank, DP1." \
+ "MOVX with DPTR accesses external data memory.\nData pointer register select. DPS = 0 selects the first bank of data pointer\nregister, DP0, and DPS = 1 selects the second bank, DP1." ;# <-- NOT TRANSLATED YET
+ ##ID:003600##
+ mcset $l "RDY/BSY (Ready/Busy) flag for the data EEPROM memory. This is a read-only bit\nwhich is cleared by hardware during the programming cycle of the on-chip EEPROM.\nIt is also set by hardware when the programming is completed. Note that RDY/BSY\nwill be cleared long after the completion of the MOVX instruction which has\ninitiated the programming cycle." \
+ "RDY/BSY (Ready/Busy) flag for the data EEPROM memory. This is a read-only bit\nwhich is cleared by hardware during the programming cycle of the on-chip EEPROM.\nIt is also set by hardware when the programming is completed. Note that RDY/BSY\nwill be cleared long after the completion of the MOVX instruction which has\ninitiated the programming cycle." ;# <-- NOT TRANSLATED YET
+ ##ID:003601##
+ mcset $l "WRTINH (Write Inhibit) is a READ-ONLY bit which is cleared by hardware when Vcc is\ntoo low for the programming cycle of the on-chip EEPROM to be executed. When this\nbit is cleared, an ongoing programming cycle will be aborted or a new programming\ncycle will not start." \
+ "WRTINH (Write Inhibit) is a READ-ONLY bit which is cleared by hardware when Vcc is\ntoo low for the programming cycle of the on-chip EEPROM to be executed. When this\nbit is cleared, an ongoing programming cycle will be aborted or a new programming\ncycle will not start." ;# <-- NOT TRANSLATED YET
+ ##ID:003602##
+ mcset $l "Prescaler bit for the watchdog timer" \
+ "Prescaler bit for the watchdog timer" ;# <-- NOT TRANSLATED YET
+ ##ID:003603##
+ mcset $l "Enable/disable the Watchdog Timer in IDLE mode" \
+ "Enable/disable the Watchdog Timer in IDLE mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003604##
+ mcset $l "Enable/disable the WDT-driven Reset Out" \
+ "Enable/disable the WDT-driven Reset Out" ;# <-- NOT TRANSLATED YET
+ ##ID:003605##
+ mcset $l "Hardware mode select for the WDT" \
+ "Hardware mode select for the WDT" ;# <-- NOT TRANSLATED YET
+ ##ID:003606##
+ mcset $l "Watchdog software reset bit" \
+ "Watchdog software reset bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003607##
+ mcset $l "Watchdog software enable bit" \
+ "Watchdog software enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003608##
+ mcset $l "Enable/disable the Watchdog Timer in IDLE mode. When WDIDLE = 0, WDT\ncontinues to count in IDLE mode. When WDIDLE = 1, WDT freezes while\nthe device is in IDLE mode." \
+ "Enable/disable the Watchdog Timer in IDLE mode. When WDIDLE = 0, WDT\ncontinues to count in IDLE mode. When WDIDLE = 1, WDT freezes while\nthe device is in IDLE mode." ;# <-- NOT TRANSLATED YET
+ ##ID:003609##
+ mcset $l "Enable/disable the WDT-driven Reset Out (WDT drives the RST pin). When\nDISRTO = 0, the RST pin is driven high after WDT times out and the entire\nboard is reset. When DISRTO = 1, the RST pin remains only as an input and the\nWDT resets only the microcontroller internally after WDT times out." \
+ "Enable/disable the WDT-driven Reset Out (WDT drives the RST pin). When\nDISRTO = 0, the RST pin is driven high after WDT times out and the entire\nboard is reset. When DISRTO = 1, the RST pin remains only as an input and the\nWDT resets only the microcontroller internally after WDT times out." ;# <-- NOT TRANSLATED YET
+ ##ID:003610##
+ mcset $l "Hardware mode select for the WDT. When HWDT = 0, the WDT can be turned on/off\nby simply setting or clearing WDTEN in the same register (this is the software\nmode for WDT). When HWDT = 1, the WDT has to be set by writing the sequence\n1EH/E1H to the WDTRST register (with address 0A6H) and after being set in this\nway, WDT cannot be turned off except by reset, warm or cold (this is the hardware\nmode for WDT). To prevent the hardware WDT from resetting the entire device,\nthe same sequence 1EH/E1H must be written to the same WDTRST SFR before the\ntimeout interval." \
+ "Hardware mode select for the WDT. When HWDT = 0, the WDT can be turned on/off\nby simply setting or clearing WDTEN in the same register (this is the software\nmode for WDT). When HWDT = 1, the WDT has to be set by writing the sequence\n1EH/E1H to the WDTRST register (with address 0A6H) and after being set in this\nway, WDT cannot be turned off except by reset, warm or cold (this is the hardware\nmode for WDT). To prevent the hardware WDT from resetting the entire device,\nthe same sequence 1EH/E1H must be written to the same WDTRST SFR before the\ntimeout interval." ;# <-- NOT TRANSLATED YET
+ ##ID:003611##
+ mcset $l "Watchdog software reset bit. If HWDT = 0 (i.e. WDT is in software controlled mode),\nwhen set by software, this bit resets WDT. After being set by software, WSWRST is\nreset by hardware during the next machine cycle. If HWDT = 1, this bit has no effect,\nand if set by software, it will not be cleared by hardware." \
+ "Watchdog software reset bit. If HWDT = 0 (i.e. WDT is in software controlled mode),\nwhen set by software, this bit resets WDT. After being set by software, WSWRST is\nreset by hardware during the next machine cycle. If HWDT = 1, this bit has no effect,\nand if set by software, it will not be cleared by hardware." ;# <-- NOT TRANSLATED YET
+ ##ID:003612##
+ mcset $l "Watchdog software enable bit. When HWDT = 0 (i.e. WDT is in software-controlled mode),\nthis bit enables WDT when set to 1 and disables WDT when cleared to 0 (it does not\nreset WDT in this case, but just freezes the existing counter state). If HWDT = 1, this\nbit is READ-ONLY and reflects the status of the WDT (whether it is running or not)." \
+ "Watchdog software enable bit. When HWDT = 0 (i.e. WDT is in software-controlled mode),\nthis bit enables WDT when set to 1 and disables WDT when cleared to 0 (it does not\nreset WDT in this case, but just freezes the existing counter state). If HWDT = 1, this\nbit is READ-ONLY and reflects the status of the WDT (whether it is running or not)." ;# <-- NOT TRANSLATED YET
+ ##ID:003613##
+ mcset $l "Do not try to set or clear this bit" \
+ "Do not try to set or clear this bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003614##
+ mcset $l "WDT Time-out select bit" \
+ "WDT Time-out select bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003615##
+ mcset $l "Prescaler bits for the watchdog timer (WDT). When all three bits are cleared\nto 0, the watchdog timer has a nominal period of 16K machine cycles,\n(i.e. 16 ms at a XTAL frequency of 12 MHz in normal mode or 6 MHz in x2 mode).\nWhen all three bits are set to 1, the nominal period is 2048K machine cycles,\n(i.e. 2048 ms at 12 MHz clock frequency in normal mode or 6 MHz in x2 mode)." \
+ "Prescaler bits for the watchdog timer (WDT). When all three bits are cleared\nto 0, the watchdog timer has a nominal period of 16K machine cycles,\n(i.e. 16 ms at a XTAL frequency of 12 MHz in normal mode or 6 MHz in x2 mode).\nWhen all three bits are set to 1, the nominal period is 2048K machine cycles,\n(i.e. 2048 ms at 12 MHz clock frequency in normal mode or 6 MHz in x2 mode)." ;# <-- NOT TRANSLATED YET
+ ##ID:003616##
+ mcset $l "SPI interrupt flag" \
+ "SPI interrupt flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003617##
+ mcset $l "Write collision flag" \
+ "Write collision flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003618##
+ mcset $l "Load enable" \
+ "Load enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003619##
+ mcset $l "Disable slave output bit" \
+ "Disable slave output bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003620##
+ mcset $l "Enhanced SPI mode select bit" \
+ "Enhanced SPI mode select bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003621##
+ mcset $l "SPI interrupt flag. When a serial transfer is complete, the SPIF bit is set and an interrupt is generated if SPIE = 1 and ES\n= 1. The SPIF bit is cleared by reading the SPI status register followed by reading/writing the SPI data register." \
+ "SPI interrupt flag. When a serial transfer is complete, the SPIF bit is set and an interrupt is generated if SPIE = 1 and ES\n= 1. The SPIF bit is cleared by reading the SPI status register followed by reading/writing the SPI data register." ;# <-- NOT TRANSLATED YET
+ ##ID:003622##
+ mcset $l "When ENH = 0: Write collision flag. The WCOL bit is set if the SPI data register is written during a data transfer. During\ndata transfer, the result of reading the SPDR register may be incorrect, and writing to it has no effect. The WCOL bit (and\nthe SPIF bit) are cleared by reading the SPI status register followed by reading/writing the SPI data register.\nWhen ENH = 1: WCOL works in Enhanced mode as Tx Buffer Full. Writing during WCOL = 1 in enhanced mode will\noverwrite the waiting data already present in the Tx Buffer. In this mode, WCOL is no longer reset by the SPIF reset but\nis reset when the write buffer has been unloaded into the serial shift register." \
+ "When ENH = 0: Write collision flag. The WCOL bit is set if the SPI data register is written during a data transfer. During\ndata transfer, the result of reading the SPDR register may be incorrect, and writing to it has no effect. The WCOL bit (and\nthe SPIF bit) are cleared by reading the SPI status register followed by reading/writing the SPI data register.\nWhen ENH = 1: WCOL works in Enhanced mode as Tx Buffer Full. Writing during WCOL = 1 in enhanced mode will\noverwrite the waiting data already present in the Tx Buffer. In this mode, WCOL is no longer reset by the SPIF reset but\nis reset when the write buffer has been unloaded into the serial shift register." ;# <-- NOT TRANSLATED YET
+ ##ID:003623##
+ mcset $l "Load enable for the Tx buffer in enhanced SPI mode.\nWhen ENH is set, it is safe to load the Tx Buffer while LDEN = 1 and WCOL = 0. LDEN is high during bits 0 - 3 and is low\nduring bits 4 - 7 of the SPI serial byte transmission time frame." \
+ "Load enable for the Tx buffer in enhanced SPI mode.\nWhen ENH is set, it is safe to load the Tx Buffer while LDEN = 1 and WCOL = 0. LDEN is high during bits 0 - 3 and is low\nduring bits 4 - 7 of the SPI serial byte transmission time frame." ;# <-- NOT TRANSLATED YET
+ ##ID:003624##
+ mcset $l "Disable slave output bit.\nWhen set, this bit causes the MISO pin to be tri-stated so more than one slave device can share the same interface with\na single master. Normally, the first byte in a transmission could be the slave address and only the selected slave should\nclear its DISSO bit." \
+ "Disable slave output bit.\nWhen set, this bit causes the MISO pin to be tri-stated so more than one slave device can share the same interface with\na single master. Normally, the first byte in a transmission could be the slave address and only the selected slave should\nclear its DISSO bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003625##
+ mcset $l "Enhanced SPI mode select bit. When ENH = 0, SPI is in normal mode, i.e. without write double buffering.\nWhen ENH = 1, SPI is in enhanced mode with write double buffering. The Tx buffer shares the same address with the\nSPDR register." \
+ "Enhanced SPI mode select bit. When ENH = 0, SPI is in normal mode, i.e. without write double buffering.\nWhen ENH = 1, SPI is in enhanced mode with write double buffering. The Tx buffer shares the same address with the\nSPDR register." ;# <-- NOT TRANSLATED YET
+ ##ID:003626##
+ mcset $l "SPI interrupt enable" \
+ "SPI interrupt enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003627##
+ mcset $l "SPI enable" \
+ "SPI enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003628##
+ mcset $l "Data order" \
+ "Data order" ;# <-- NOT TRANSLATED YET
+ ##ID:003629##
+ mcset $l "Master/slave select" \
+ "Master/slave select" ;# <-- NOT TRANSLATED YET
+ ##ID:003630##
+ mcset $l "Clock polarity" \
+ "Clock polarity" ;# <-- NOT TRANSLATED YET
+ ##ID:003631##
+ mcset $l "Clock phase" \
+ "Clock phase" ;# <-- NOT TRANSLATED YET
+ ##ID:003632##
+ mcset $l "SPI clock rate select" \
+ "SPI clock rate select" ;# <-- NOT TRANSLATED YET
+ ##ID:003633##
+ mcset $l "SPI interrupt enable.\nThis bit, in conjunction with the ES bit in the IE register,\nenables SPI interrupts: SPIE = 1 and ES = 1 enable SPI interrupts. SPIE = 0 disables SPI interrupts." \
+ "SPI interrupt enable.\nThis bit, in conjunction with the ES bit in the IE register,\nenables SPI interrupts: SPIE = 1 and ES = 1 enable SPI interrupts. SPIE = 0 disables SPI interrupts." ;# <-- NOT TRANSLATED YET
+ ##ID:003634##
+ mcset $l "SPI enable. SPI = 1 enables the SPI channel and connects\nSS, MOSI, MISO and SCK to pins P1.4, P1.5, P1.6, and P1.7.\nSPI = 0 disables the SPI channel." \
+ "SPI enable. SPI = 1 enables the SPI channel and connects\nSS, MOSI, MISO and SCK to pins P1.4, P1.5, P1.6, and P1.7.\nSPI = 0 disables the SPI channel." ;# <-- NOT TRANSLATED YET
+ ##ID:003635##
+ mcset $l "Data order. DORD = 1 selects LSB first data transmission.\nDORD = 0 selects MSB first data transmission." \
+ "Data order. DORD = 1 selects LSB first data transmission.\nDORD = 0 selects MSB first data transmission." ;# <-- NOT TRANSLATED YET
+ ##ID:003636##
+ mcset $l "Master/slave select. MSTR = 1 selects Master SPI mode.\nMSTR = 0 selects slave SPI mode." \
+ "Master/slave select. MSTR = 1 selects Master SPI mode.\nMSTR = 0 selects slave SPI mode." ;# <-- NOT TRANSLATED YET
+ ##ID:003637##
+ mcset $l "Clock polarity. When CPOL = 1, SCK is high when idle. When CPOL = 0,\nSCK of the master device is low when not transmitting. Please refer to\nfigure on SPI clock phase and polarity control." \
+ "Clock polarity. When CPOL = 1, SCK is high when idle. When CPOL = 0,\nSCK of the master device is low when not transmitting. Please refer to\nfigure on SPI clock phase and polarity control." ;# <-- NOT TRANSLATED YET
+ ##ID:003638##
+ mcset $l "Clock phase. The CPHA bit together with the CPOL bit controls the\nclock and data relationship between master and slave. Please refer\nto figure on SPI clock phase and polarity control." \
+ "Clock phase. The CPHA bit together with the CPOL bit controls the\nclock and data relationship between master and slave. Please refer\nto figure on SPI clock phase and polarity control." ;# <-- NOT TRANSLATED YET
+ ##ID:003639##
+ mcset $l "SPI clock rate select.\nThese two bits control the SCK rate of the device configured as master.\nSPR1 and SPR0 have no effect on the slave. The relationship between SCK and the\noscillator frequency, FOSC., is as follows:\n SPR1\tSPR0\tSCK\n 0\t0\tf/4 (f/2 in x2mode)\n 0\t1\tf/16 (f/8 in x2 mode)\n 1\t0\tf/64 (f/32 in x2 mode)\n 1\t1\tf/128 (f/64 in x2 mode)" \
+ "SPI clock rate select.\nThese two bits control the SCK rate of the device configured as master.\nSPR1 and SPR0 have no effect on the slave. The relationship between SCK and the\noscillator frequency, FOSC., is as follows:\n SPR1\tSPR0\tSCK\n 0\t0\tf/4 (f/2 in x2mode)\n 0\t1\tf/16 (f/8 in x2 mode)\n 1\t0\tf/64 (f/32 in x2 mode)\n 1\t1\tf/128 (f/64 in x2 mode)" ;# <-- NOT TRANSLATED YET
+ ##ID:003640##
+ mcset $l "Comparator Interrupt" \
+ "Comparator Interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003641##
+ mcset $l "Comparator Enable" \
+ "Comparator Enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003642##
+ mcset $l "Comparator Interrupt Mode" \
+ "Comparator Interrupt Mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003643##
+ mcset $l "Comparator Interrupt Flag. Set when the comparator output meets the conditions specified by the CM \[2:0\] bits and CEN\nis set. The flag must be cleared by software. The interrupt may be enabled/disabled by setting/clearing bit 6 of IE." \
+ "Comparator Interrupt Flag. Set when the comparator output meets the conditions specified by the CM \[2:0\] bits and CEN\nis set. The flag must be cleared by software. The interrupt may be enabled/disabled by setting/clearing bit 6 of IE." ;# <-- NOT TRANSLATED YET
+ ##ID:003644##
+ mcset $l "Comparator Enable. Set this bit to enable the comparator. Clearing this bit will force the comparator output low and\nprevent further events from setting CF." \
+ "Comparator Enable. Set this bit to enable the comparator. Clearing this bit will force the comparator output low and\nprevent further events from setting CF." ;# <-- NOT TRANSLATED YET
+ ##ID:003645##
+ mcset $l "Comparator Interrupt Mode\n 2 1 0\tInterrupt Mode\n--- --- ---\t---------------------------------------\n 0 0 0\tNegative (Low) level\n 0 0 1\tPositive edge\n 0 1 0\tToggle with debounce\n 0 1 1\tPositive edge with debounce\n 1 0 0\tNegative edge\n 1 0 1\tToggle\n 1 1 0\tNegative edge with debounce\n 1 1 1\tPositive (High) level" \
+ "Comparator Interrupt Mode\n 2 1 0\tInterrupt Mode\n--- --- ---\t---------------------------------------\n 0 0 0\tNegative (Low) level\n 0 0 1\tPositive edge\n 0 1 0\tToggle with debounce\n 0 1 1\tPositive edge with debounce\n 1 0 0\tNegative edge\n 1 0 1\tToggle\n 1 1 0\tNegative edge with debounce\n 1 1 1\tPositive (High) level" ;# <-- NOT TRANSLATED YET
+ ##ID:003646##
+ mcset $l "Data Pointer Register Select" \
+ "Data Pointer Register Select" ;# <-- NOT TRANSLATED YET
+ ##ID:003647##
+ mcset $l "DPS\tData Pointer Register Select\n0\tSelects DPTR Registers DP0L, DP0H\n1\tSelects DPTR Registers DP1L, DP1H\n" \
+ "DPS\tData Pointer Register Select\n0\tSelects DPTR Registers DP0L, DP0H\n1\tSelects DPTR Registers DP1L, DP1H\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003648##
+ mcset $l "Disable/Enable ALE" \
+ "Disable/Enable ALE" ;# <-- NOT TRANSLATED YET
+ ##ID:003649##
+ mcset $l "Disable/Enable ALE\nDISALE\tOperating Mode\n0\tALE is emitted at a constant rate of 1/6 the oscillator frequency\n1\tALE is active only during a MOVX or MOVC instruction" \
+ "Disable/Enable ALE\nDISALE\tOperating Mode\n0\tALE is emitted at a constant rate of 1/6 the oscillator frequency\n1\tALE is active only during a MOVX or MOVC instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003650##
+ mcset $l "Register %s: Located in IDATA, address depends on bits RS0 and RS1 in PSW" \
+ "Register %s: Located in IDATA, address depends on bits RS0 and RS1 in PSW" ;# <-- NOT TRANSLATED YET
+ ##ID:003651##
+ mcset $l "SFR 0x8D: 2nd part of 16-bit counting register for timer 1" \
+ "SFR 0x8D: 2nd part of 16-bit counting register for timer 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003652##
+ mcset $l "SFR 0x8B: 1st part of 16-bit counting register for timer 1" \
+ "SFR 0x8B: 1st part of 16-bit counting register for timer 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003653##
+ mcset $l "SFR 0x8C: 2nd part of 16-bit counting register for timer 0" \
+ "SFR 0x8C: 2nd part of 16-bit counting register for timer 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003654##
+ mcset $l "SFR 0x8A: 1nd part of 16-bit counting register for timer 0" \
+ "SFR 0x8A: 1nd part of 16-bit counting register for timer 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003655##
+ mcset $l "SFR 0x8D..0x8B: 16-bit counting register for timer 1" \
+ "SFR 0x8D..0x8B: 16-bit counting register for timer 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003656##
+ mcset $l "SFR 0x8C..0x8A: 16-bit counting register for timer 0" \
+ "SFR 0x8C..0x8A: 16-bit counting register for timer 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003657##
+ mcset $l "SFR 0x%s: Latch of port %s" \
+ "SFR 0x%s: Latch of port %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003658##
+ mcset $l "SFR 0x87: Power control register" \
+ "SFR 0x87: Power control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003659##
+ mcset $l "SFR 0x83: Data pointer register" \
+ "SFR 0x83: Data pointer register" ;# <-- NOT TRANSLATED YET
+ ##ID:003660##
+ mcset $l "SFR 0x82: Data pointer register" \
+ "SFR 0x82: Data pointer register" ;# <-- NOT TRANSLATED YET
+ ##ID:003661##
+ mcset $l "SFR 0x85: Data pointer register" \
+ "SFR 0x85: Data pointer register" ;# <-- NOT TRANSLATED YET
+ ##ID:003662##
+ mcset $l "SFR 0x84: Data pointer register" \
+ "SFR 0x84: Data pointer register" ;# <-- NOT TRANSLATED YET
+ ##ID:003663##
+ mcset $l "Clock:" \
+ "Clock:" ;# <-- NOT TRANSLATED YET
+ ##ID:003664##
+ mcset $l "Processor clock in kHz" \
+ "Processor clock in kHz" ;# <-- NOT TRANSLATED YET
+ ##ID:003665##
+ mcset $l "SFR 0x99: Serial Data Buffer - RECEIVE buffer" \
+ "SFR 0x99: Serial Data Buffer - RECEIVE buffer" ;# <-- NOT TRANSLATED YET
+ ##ID:003666##
+ mcset $l "SFR 0x99: Serial Data Buffer - TRANSMIT buffer" \
+ "SFR 0x99: Serial Data Buffer - TRANSMIT buffer" ;# <-- NOT TRANSLATED YET
+ ##ID:003667##
+ mcset $l "Program counter" \
+ "Program counter" ;# <-- NOT TRANSLATED YET
+ ##ID:003668##
+ mcset $l "Set PC (Program Counter) according to\nline number in source code" \
+ "Set PC (Program Counter) according to\nline number in source code" ;# <-- NOT TRANSLATED YET
+ ##ID:003669##
+ mcset $l "Set PC by line number" \
+ "Set PC by line number" ;# <-- NOT TRANSLATED YET
+ ##ID:003670##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:003671##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:003672##
+ mcset $l "Time:" \
+ "Time:" ;# <-- NOT TRANSLATED YET
+ ##ID:003673##
+ mcset $l "Overall time" \
+ "Overall time" ;# <-- NOT TRANSLATED YET
+ ##ID:003674##
+ mcset $l "SFR 0xCD: Part of 16-bit counting register for Timer/Counter 2" \
+ "SFR 0xCD: Part of 16-bit counting register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003675##
+ mcset $l "SFR 0xCC: Part of 16-bit counting register for Timer/Counter 2" \
+ "SFR 0xCC: Part of 16-bit counting register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003676##
+ mcset $l "SFR 0xCB: Part of 16-bit capture register for Timer/Counter 2" \
+ "SFR 0xCB: Part of 16-bit capture register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003677##
+ mcset $l "SFR 0xCA: Part of 16-bit capture register for Timer/Counter 2" \
+ "SFR 0xCA: Part of 16-bit capture register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003678##
+ mcset $l "SFR 0xCC..0xCD: 16-bit counting register for Timer/Counter 2" \
+ "SFR 0xCC..0xCD: 16-bit counting register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003679##
+ mcset $l "SFR 0xCA..0xCB: 16-bit capture register for Timer/Counter 2" \
+ "SFR 0xCA..0xCB: 16-bit capture register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003680##
+ mcset $l "Watchdog timer" \
+ "Watchdog timer" ;# <-- NOT TRANSLATED YET
+ ##ID:003681##
+ mcset $l "OFF" \
+ "OFF" ;# <-- NOT TRANSLATED YET
+ ##ID:003682##
+ mcset $l "ON " \
+ "ON " ;# <-- NOT TRANSLATED YET
+ ##ID:003683##
+ mcset $l "Simulator" \
+ "Simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:003684##
+ mcset $l "Watchdog:" \
+ "Watchdog:" ;# <-- NOT TRANSLATED YET
+ ##ID:003685##
+ mcset $l "Watchdog timer ON/OFF switch" \
+ "Watchdog timer ON/OFF switch" ;# <-- NOT TRANSLATED YET
+ ##ID:003686##
+ mcset $l "Watchdog Prescaler (0-7 bits)" \
+ "Watchdog Prescaler (0-7 bits)" ;# <-- NOT TRANSLATED YET
+ ##ID:003687##
+ mcset $l "Reset watchdog timer" \
+ "Reset watchdog timer" ;# <-- NOT TRANSLATED YET
+ ##ID:003688##
+ mcset $l "Reset Watchdog" \
+ "Reset Watchdog" ;# <-- NOT TRANSLATED YET
+ ##ID:003689##
+ mcset $l "SFR 0xB9: Used to define which bits in the SADDR are to be used" \
+ "SFR 0xB9: Used to define which bits in the SADDR are to be used" ;# <-- NOT TRANSLATED YET
+ ##ID:003690##
+ mcset $l "SFR 0xA9: Define the slave's address" \
+ "SFR 0xA9: Define the slave's address" ;# <-- NOT TRANSLATED YET
+ ##ID:003691##
+ mcset $l "SFR 0x86: SPI Data Register" \
+ "SFR 0x86: SPI Data Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003692##
+ mcset $l "SFR 0xA6: Watchdog reset" \
+ "SFR 0xA6: Watchdog reset" ;# <-- NOT TRANSLATED YET
+ ##ID:003693##
+ mcset $l "Writing to EEPROM" \
+ "Writing to EEPROM" ;# <-- NOT TRANSLATED YET
+ ##ID:003694##
+ mcset $l "Finalize data EEPROM write cycle" \
+ "Finalize data EEPROM write cycle" ;# <-- NOT TRANSLATED YET
+ ##ID:003695##
+ mcset $l "Finalize write cycle" \
+ "Finalize write cycle" ;# <-- NOT TRANSLATED YET
+ ##ID:003696##
+ mcset $l "Cancel data EEPROM write cycle" \
+ "Cancel data EEPROM write cycle" ;# <-- NOT TRANSLATED YET
+ ##ID:003697##
+ mcset $l "Cancel write cycle" \
+ "Cancel write cycle" ;# <-- NOT TRANSLATED YET
+ ##ID:003698##
+ mcset $l "EEPROM write cycle progress" \
+ "EEPROM write cycle progress" ;# <-- NOT TRANSLATED YET
+}
+# interruptmonitor.tcl
+# ==============================================================================
+namespace eval InterruptMonitor {
+ eval ${SFB_TRANSLATIONS}
+ ##ID:003699##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:003700##
+ mcset $l "Interrupt monitor" \
+ "Interrupt monitor" ;# <-- NOT TRANSLATED YET
+ ##ID:003701##
+ mcset $l "Close this dialog window" \
+ "Close this dialog window" ;# <-- NOT TRANSLATED YET
+ ##ID:003702##
+ mcset $l {Vector:} \
+ {Vector:} ;# <-- NOT TRANSLATED YET
+ ##ID:003703##
+ mcset $l {Enable bit:} \
+ {Enable bit:} ;# <-- NOT TRANSLATED YET
+ ##ID:003704##
+ mcset $l {Flag bit:} \
+ {Flag bit:} ;# <-- NOT TRANSLATED YET
+ ##ID:003705##
+ mcset $l {Priority bits:} \
+ {Priority bits:} ;# <-- NOT TRANSLATED YET
+ ##ID:003706##
+ mcset $l { Line:} \
+ { Line:} ;# <-- NOT TRANSLATED YET
+ ##ID:003707##
+ mcset $l { File:} \
+ { File:} ;# <-- NOT TRANSLATED YET
+ ##ID:003708##
+ mcset $l { PC:} \
+ { PC:} ;# <-- NOT TRANSLATED YET
+ ##ID:003709##
+ mcset $l "Increase priority level" \
+ "Increase priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003710##
+ mcset $l "Decrease priority level" \
+ "Decrease priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003711##
+ mcset $l "Invoke this interrupt" \
+ "Invoke this interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003712##
+ mcset $l "Priority level" \
+ "Priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003713##
+ mcset $l "SPSR.7 -- SPI interrupt flag" \
+ "SPSR.7 -- SPI interrupt flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003714##
+ mcset $l "ACSR.4 -- Comparator Interrupt" \
+ "ACSR.4 -- Comparator Interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003715##
+ mcset $l "IPH.0 -- Defines the External Interrupt 0 priority level" \
+ "IPH.0 -- Defines the External Interrupt 0 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003716##
+ mcset $l "IPH.1 -- Defines the Timer 0 interrupt priority level" \
+ "IPH.1 -- Defines the Timer 0 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003717##
+ mcset $l "IPH.2 -- Defines External Interrupt 1 priority level" \
+ "IPH.2 -- Defines External Interrupt 1 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003718##
+ mcset $l "IPH.3 -- Defines the Timer 1 interrupt priority level" \
+ "IPH.3 -- Defines the Timer 1 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003719##
+ mcset $l "IPH.4 -- Defines the Serial Port interrupt priority level" \
+ "IPH.4 -- Defines the Serial Port interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003720##
+ mcset $l "IPH.5 -- Defines the Timer 2 interrupt priority level" \
+ "IPH.5 -- Defines the Timer 2 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003721##
+ mcset $l "IPH.6 -- Defines the comparator interrupt priority level" \
+ "IPH.6 -- Defines the comparator interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003722##
+ mcset $l "Interrupts in progress" \
+ "Interrupts in progress" ;# <-- NOT TRANSLATED YET
+ ##ID:003723##
+ mcset $l "Pending interrupts" \
+ "Pending interrupts" ;# <-- NOT TRANSLATED YET
+ ##ID:003724##
+ mcset $l "Interrupt priorities" \
+ "Interrupt priorities" ;# <-- NOT TRANSLATED YET
+ ##ID:003725##
+ mcset $l "Expand all" \
+ "Expand all" ;# <-- NOT TRANSLATED YET
+ ##ID:003726##
+ mcset $l "Collapse all" \
+ "Collapse all" ;# <-- NOT TRANSLATED YET
+ ##ID:003727##
+ mcset $l "Priority:" \
+ "Priority:" ;# <-- NOT TRANSLATED YET
+ ##ID:003728##
+ mcset $l "Invoked from:" \
+ "Invoked from:" ;# <-- NOT TRANSLATED YET
+}
+# rs232debugger.tcl
+# ==============================================================================
+namespace eval RS232Debugger {
+ ##ID:003729##
+ mcset $l "Special character file representing the target physical device" \
+ "Special character file representing the target physical device" ;# <-- NOT TRANSLATED YET
+ ##ID:003730##
+ mcset $l "Refresh list of relevant devices" \
+ "Refresh list of relevant devices" ;# <-- NOT TRANSLATED YET
+ ##ID:003731##
+ mcset $l "Connection speed in bps" \
+ "Connection speed in bps" ;# <-- NOT TRANSLATED YET
+ ##ID:003732##
+ mcset $l "Parity" \
+ "Parity" ;# <-- NOT TRANSLATED YET
+ ##ID:003733##
+ mcset $l "none" \
+ "none" ;# <-- NOT TRANSLATED YET
+ ##ID:003734##
+ mcset $l "odd" \
+ "odd" ;# <-- NOT TRANSLATED YET
+ ##ID:003735##
+ mcset $l "even" \
+ "even" ;# <-- NOT TRANSLATED YET
+ ##ID:003736##
+ mcset $l "mark" \
+ "mark" ;# <-- NOT TRANSLATED YET
+ ##ID:003737##
+ mcset $l "space" \
+ "space" ;# <-- NOT TRANSLATED YET
+ ##ID:003738##
+ mcset $l "Number of data bits" \
+ "Number of data bits" ;# <-- NOT TRANSLATED YET
+ ##ID:003739##
+ mcset $l "Number of stop bits" \
+ "Number of stop bits" ;# <-- NOT TRANSLATED YET
+ ##ID:003740##
+ mcset $l "Display incoming data or discard them" \
+ "Display incoming data or discard them" ;# <-- NOT TRANSLATED YET
+ ##ID:003741##
+ mcset $l "Remove selected data" \
+ "Remove selected data" ;# <-- NOT TRANSLATED YET
+ ##ID:003742##
+ mcset $l "Send selected data" \
+ "Send selected data" ;# <-- NOT TRANSLATED YET
+ ##ID:003743##
+ mcset $l "Error message" \
+ "Error message" ;# <-- NOT TRANSLATED YET
+ ##ID:003744##
+ mcset $l "Receive data on current cursor position" \
+ "Receive data on current cursor position" ;# <-- NOT TRANSLATED YET
+ ##ID:003745##
+ mcset $l "RS232 DBG: Invalid baud rate, setting to default: %s" \
+ "RS232 DBG: Invalid baud rate, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003746##
+ mcset $l "RS232 DBG: Invalid parity, setting to default: %s" \
+ "RS232 DBG: Invalid parity, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003747##
+ mcset $l "RS232 DBG: Invalid data length, setting to default: %s" \
+ "RS232 DBG: Invalid data length, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003748##
+ mcset $l "RS232 DBG: Invalid stop bit length, setting to default: %s" \
+ "RS232 DBG: Invalid stop bit length, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003749##
+ mcset $l "RS232 DBG: Invalid flag reception_enabled, setting to default: %s" \
+ "RS232 DBG: Invalid flag reception_enabled, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003750##
+ mcset $l "RS232 DBG: Invalid reception address, setting to default: %s" \
+ "RS232 DBG: Invalid reception address, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003751##
+ mcset $l "RS232 DBG: Invalid current cell address, setting to default: %s" \
+ "RS232 DBG: Invalid current cell address, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003752##
+ mcset $l "RS232 Debugger" \
+ "RS232 Debugger" ;# <-- NOT TRANSLATED YET
+ ##ID:003753##
+ mcset $l "UART/RS232 Debugger - MCU 8051 IDE" \
+ "UART/RS232 Debugger - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003754##
+ mcset $l "RS-232\nDTE" \
+ "RS-232\nDTE" ;# <-- NOT TRANSLATED YET
+ ##ID:003755##
+ mcset $l "DE-9" \
+ "DE-9" ;# <-- NOT TRANSLATED YET
+ ##ID:003756##
+ mcset $l "DCD" \
+ "DCD" ;# <-- NOT TRANSLATED YET
+ ##ID:003757##
+ mcset $l "DSR" \
+ "DSR" ;# <-- NOT TRANSLATED YET
+ ##ID:003758##
+ mcset $l "CTS" \
+ "CTS" ;# <-- NOT TRANSLATED YET
+ ##ID:003759##
+ mcset $l "RI" \
+ "RI" ;# <-- NOT TRANSLATED YET
+ ##ID:003760##
+ mcset $l "DTR" \
+ "DTR" ;# <-- NOT TRANSLATED YET
+ ##ID:003761##
+ mcset $l "RTS" \
+ "RTS" ;# <-- NOT TRANSLATED YET
+ ##ID:003762##
+ mcset $l "Break" \
+ "Break" ;# <-- NOT TRANSLATED YET
+ ##ID:003763##
+ mcset $l "Port configuration" \
+ "Port configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:003764##
+ mcset $l "Physical port" \
+ "Physical port" ;# <-- NOT TRANSLATED YET
+ ##ID:003765##
+ mcset $l "Baud rate" \
+ "Baud rate" ;# <-- NOT TRANSLATED YET
+ ##ID:003766##
+ mcset $l "Data bits" \
+ "Data bits" ;# <-- NOT TRANSLATED YET
+ ##ID:003767##
+ mcset $l "Stop bits" \
+ "Stop bits" ;# <-- NOT TRANSLATED YET
+ ##ID:003768##
+ mcset $l "Enable reception" \
+ "Enable reception" ;# <-- NOT TRANSLATED YET
+ ##ID:003769##
+ mcset $l "Terminate connection" \
+ "Terminate connection" ;# <-- NOT TRANSLATED YET
+ ##ID:003770##
+ mcset $l "Data to send" \
+ "Data to send" ;# <-- NOT TRANSLATED YET
+ ##ID:003771##
+ mcset $l "Received data" \
+ "Received data" ;# <-- NOT TRANSLATED YET
+ ##ID:003772##
+ mcset $l "Send selected" \
+ "Send selected" ;# <-- NOT TRANSLATED YET
+ ##ID:003773##
+ mcset $l "Clear selected" \
+ "Clear selected" ;# <-- NOT TRANSLATED YET
+ ##ID:003774##
+ mcset $l "Receive here" \
+ "Receive here" ;# <-- NOT TRANSLATED YET
+ ##ID:003775##
+ mcset $l "Unknown failure" \
+ "Unknown failure" ;# <-- NOT TRANSLATED YET
+ ##ID:003776##
+ mcset $l "Unable to change port configuration" \
+ "Unable to change port configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:003777##
+ mcset $l "IO Error" \
+ "IO Error" ;# <-- NOT TRANSLATED YET
+ ##ID:003778##
+ mcset $l "No port opened." \
+ "No port opened." ;# <-- NOT TRANSLATED YET
+ ##ID:003779##
+ mcset $l "Unable to send the data\n\n%s" \
+ "Unable to send the data\n\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:003780##
+ mcset $l "Not enough space in the receive buffer !" \
+ "Not enough space in the receive buffer !" ;# <-- NOT TRANSLATED YET
+ ##ID:003781##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:003782##
+ mcset $l "Keep reception enabled" \
+ "Keep reception enabled" ;# <-- NOT TRANSLATED YET
+ ##ID:003783##
+ mcset $l "Data lost" \
+ "Data lost" ;# <-- NOT TRANSLATED YET
+ ##ID:003784##
+ mcset $l "There is something wrong with the port. Closing connection and disabling reception on this channel !" \
+ "There is something wrong with the port. Closing connection and disabling reception on this channel !" ;# <-- NOT TRANSLATED YET
+ ##ID:003785##
+ mcset $l "Access Error" \
+ "Access Error" ;# <-- NOT TRANSLATED YET
+ ##ID:003786##
+ mcset $l "Unable to open the specified file" \
+ "Unable to open the specified file" ;# <-- NOT TRANSLATED YET
+ ##ID:003787##
+ mcset $l "Unable to use the specified file" \
+ "Unable to use the specified file" ;# <-- NOT TRANSLATED YET
+ ##ID:003788##
+ mcset $l "RS232 pin: GND -- Common ground" \
+ "RS232 pin: GND -- Common ground" ;# <-- NOT TRANSLATED YET
+ ##ID:003789##
+ mcset $l "RS232 pin: DCD -- Carrier Detect" \
+ "RS232 pin: DCD -- Carrier Detect" ;# <-- NOT TRANSLATED YET
+ ##ID:003790##
+ mcset $l "RS232 pin: DSR -- Data Set Ready" \
+ "RS232 pin: DSR -- Data Set Ready" ;# <-- NOT TRANSLATED YET
+ ##ID:003791##
+ mcset $l "RS232 pin: CTS -- Clear To Send" \
+ "RS232 pin: CTS -- Clear To Send" ;# <-- NOT TRANSLATED YET
+ ##ID:003792##
+ mcset $l "RS232 pin: RI -- Ring Indicator" \
+ "RS232 pin: RI -- Ring Indicator" ;# <-- NOT TRANSLATED YET
+ ##ID:003793##
+ mcset $l "RS232 pin: DTR -- Data Terminal Ready" \
+ "RS232 pin: DTR -- Data Terminal Ready" ;# <-- NOT TRANSLATED YET
+ ##ID:003794##
+ mcset $l "RS232 pin: RTS -- Request To Send" \
+ "RS232 pin: RTS -- Request To Send" ;# <-- NOT TRANSLATED YET
+ ##ID:003795##
+ mcset $l "RS232 pin: TxD -- Transmitted Data" \
+ "RS232 pin: TxD -- Transmitted Data" ;# <-- NOT TRANSLATED YET
+ ##ID:003796##
+ mcset $l "RS232 pin: RxD -- Received Data" \
+ "RS232 pin: RxD -- Received Data" ;# <-- NOT TRANSLATED YET
+}
+# speccalc.tcl
+# ==============================================================================
+namespace eval SpecCalc {
+ ##ID:003797##
+ mcset $l "Loops" \
+ "Loops" ;# <-- NOT TRANSLATED YET
+ ##ID:003798##
+ mcset $l "Timer 0/1" \
+ "Timer 0/1" ;# <-- NOT TRANSLATED YET
+ ##ID:003799##
+ mcset $l "Timer 2" \
+ "Timer 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003800##
+ mcset $l "SPI" \
+ "SPI" ;# <-- NOT TRANSLATED YET
+ ##ID:003801##
+ mcset $l "Calculate timer preset" \
+ "Calculate timer preset" ;# <-- NOT TRANSLATED YET
+ ##ID:003802##
+ mcset $l "Preset" \
+ "Preset" ;# <-- NOT TRANSLATED YET
+ ##ID:003803##
+ mcset $l "Clock out" \
+ "Clock out" ;# <-- NOT TRANSLATED YET
+ ##ID:003804##
+ mcset $l "Special Calculator - MCU 8051 IDE" \
+ "Special Calculator - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003805##
+ mcset $l "Time" \
+ "Time" ;# <-- NOT TRANSLATED YET
+ ##ID:003806##
+ mcset $l "Time unit" \
+ "Time unit" ;# <-- NOT TRANSLATED YET
+ ##ID:003807##
+ mcset $l "Clock \[kHz\]" \
+ "Clock \[kHz\]" ;# <-- NOT TRANSLATED YET
+ ##ID:003808##
+ mcset $l "MCU clock" \
+ "MCU clock" ;# <-- NOT TRANSLATED YET
+ ##ID:003809##
+ mcset $l "Clock cycles per machine cycle\n 12 - Common 8051\n 6 - Core 51X2\n 1 - Single cycle core" \
+ "Clock cycles per machine cycle\n 12 - Common 8051\n 6 - Core 51X2\n 1 - Single cycle core" ;# <-- NOT TRANSLATED YET
+ ##ID:003810##
+ mcset $l "Clock cycles per machine cycle" \
+ "Clock cycles per machine cycle" ;# <-- NOT TRANSLATED YET
+ ##ID:003811##
+ mcset $l "Registers to use" \
+ "Registers to use" ;# <-- NOT TRANSLATED YET
+ ##ID:003812##
+ mcset $l "Source code:" \
+ "Source code:" ;# <-- NOT TRANSLATED YET
+ ##ID:003813##
+ mcset $l "Evaluate" \
+ "Evaluate" ;# <-- NOT TRANSLATED YET
+ ##ID:003814##
+ mcset $l "Copy" \
+ "Copy" ;# <-- NOT TRANSLATED YET
+ ##ID:003815##
+ mcset $l "Create a wait loop" \
+ "Create a wait loop" ;# <-- NOT TRANSLATED YET
+ ##ID:003816##
+ mcset $l "Mode" \
+ "Mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003817##
+ mcset $l "Timer mode" \
+ "Timer mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003818##
+ mcset $l "Show functional block diagram" \
+ "Show functional block diagram" ;# <-- NOT TRANSLATED YET
+ ##ID:003819##
+ mcset $l "Enhanced timer/counter" \
+ "Enhanced timer/counter" ;# <-- NOT TRANSLATED YET
+ ##ID:003820##
+ mcset $l "Calculate for enhanced timers" \
+ "Calculate for enhanced timers" ;# <-- NOT TRANSLATED YET
+ ##ID:003821##
+ mcset $l "The number of active bits in TL1 minus 1" \
+ "The number of active bits in TL1 minus 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003822##
+ mcset $l "Results:" \
+ "Results:" ;# <-- NOT TRANSLATED YET
+ ##ID:003823##
+ mcset $l "TH" \
+ "TH" ;# <-- NOT TRANSLATED YET
+ ##ID:003824##
+ mcset $l "TL" \
+ "TL" ;# <-- NOT TRANSLATED YET
+ ##ID:003825##
+ mcset $l "RH" \
+ "RH" ;# <-- NOT TRANSLATED YET
+ ##ID:003826##
+ mcset $l "RL" \
+ "RL" ;# <-- NOT TRANSLATED YET
+ ##ID:003827##
+ mcset $l "Repeats" \
+ "Repeats" ;# <-- NOT TRANSLATED YET
+ ##ID:003828##
+ mcset $l "Rest" \
+ "Rest" ;# <-- NOT TRANSLATED YET
+ ##ID:003829##
+ mcset $l "Do not change" \
+ "Do not change" ;# <-- NOT TRANSLATED YET
+ ##ID:003830##
+ mcset $l "Zero" \
+ "Zero" ;# <-- NOT TRANSLATED YET
+ ##ID:003831##
+ mcset $l "none" \
+ "none" ;# <-- NOT TRANSLATED YET
+ ##ID:003832##
+ mcset $l "Calculate timer 0/1 preset" \
+ "Calculate timer 0/1 preset" ;# <-- NOT TRANSLATED YET
+ ##ID:003833##
+ mcset $l "RCAL2H" \
+ "RCAL2H" ;# <-- NOT TRANSLATED YET
+ ##ID:003834##
+ mcset $l "RCAL2L" \
+ "RCAL2L" ;# <-- NOT TRANSLATED YET
+ ##ID:003835##
+ mcset $l "T2H" \
+ "T2H" ;# <-- NOT TRANSLATED YET
+ ##ID:003836##
+ mcset $l "T2L" \
+ "T2L" ;# <-- NOT TRANSLATED YET
+ ##ID:003837##
+ mcset $l "Calculate timer 2 preset" \
+ "Calculate timer 2 preset" ;# <-- NOT TRANSLATED YET
+ ##ID:003838##
+ mcset $l "Frequency" \
+ "Frequency" ;# <-- NOT TRANSLATED YET
+ ##ID:003839##
+ mcset $l "F osc" \
+ "F osc" ;# <-- NOT TRANSLATED YET
+ ##ID:003840##
+ mcset $l "X2" \
+ "X2" ;# <-- NOT TRANSLATED YET
+ ##ID:003841##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:003842##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:003843##
+ mcset $l "RCAP2H" \
+ "RCAP2H" ;# <-- NOT TRANSLATED YET
+ ##ID:003844##
+ mcset $l "RCAP2L" \
+ "RCAP2L" ;# <-- NOT TRANSLATED YET
+ ##ID:003845##
+ mcset $l "Error" \
+ "Error" ;# <-- NOT TRANSLATED YET
+ ##ID:003846##
+ mcset $l "Calculate clock output" \
+ "Calculate clock output" ;# <-- NOT TRANSLATED YET
+ ##ID:003847##
+ mcset $l "Baud rate" \
+ "Baud rate" ;# <-- NOT TRANSLATED YET
+ ##ID:003848##
+ mcset $l "UART mode" \
+ "UART mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003849##
+ mcset $l "Generator" \
+ "Generator" ;# <-- NOT TRANSLATED YET
+ ##ID:003850##
+ mcset $l "Baud rate generator" \
+ "Baud rate generator" ;# <-- NOT TRANSLATED YET
+ ##ID:003851##
+ mcset $l "Bit PCON.7 -- Double baud rate" \
+ "Bit PCON.7 -- Double baud rate" ;# <-- NOT TRANSLATED YET
+ ##ID:003852##
+ mcset $l "SPD (SPeeD) in BDRCON register" \
+ "SPD (SPeeD) in BDRCON register" ;# <-- NOT TRANSLATED YET
+ ##ID:003853##
+ mcset $l "Calculate for enhanced timer 1" \
+ "Calculate for enhanced timer 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003854##
+ mcset $l "T1 mode" \
+ "T1 mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003855##
+ mcset $l "Timer 1 mode" \
+ "Timer 1 mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003856##
+ mcset $l "UART baud rate" \
+ "UART baud rate" ;# <-- NOT TRANSLATED YET
+ ##ID:003857##
+ mcset $l "Mode X2 or single cycle core" \
+ "Mode X2 or single cycle core" ;# <-- NOT TRANSLATED YET
+ ##ID:003858##
+ mcset $l "SCK \[kHz\]" \
+ "SCK \[kHz\]" ;# <-- NOT TRANSLATED YET
+ ##ID:003859##
+ mcset $l "Set MCU oscillator to " \
+ "Set MCU oscillator to " ;# <-- NOT TRANSLATED YET
+ ##ID:003860##
+ mcset $l " kHz" \
+ " kHz" ;# <-- NOT TRANSLATED YET
+ ##ID:003861##
+ mcset $l "Calculate oscillator frequency" \
+ "Calculate oscillator frequency" ;# <-- NOT TRANSLATED YET
+ ##ID:003862##
+ mcset $l "Unable to evaluate" \
+ "Unable to evaluate" ;# <-- NOT TRANSLATED YET
+ ##ID:003863##
+ mcset $l "ERROR: Missing time\n" \
+ "ERROR: Missing time\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003864##
+ mcset $l "ERROR: Time rate cannot be 0\n" \
+ "ERROR: Time rate cannot be 0\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003865##
+ mcset $l "ERROR: Missing MCU clock rate\n" \
+ "ERROR: Missing MCU clock rate\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003866##
+ mcset $l "ERROR: MCU clock rate cannot be 0\n" \
+ "ERROR: MCU clock rate cannot be 0\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003867##
+ mcset $l "ERROR: Missing register name %s\n" \
+ "ERROR: Missing register name %s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003868##
+ mcset $l "ERROR: Ambiguous register name %s\n" \
+ "ERROR: Ambiguous register name %s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003869##
+ mcset $l "; START: Wait loop, time: %s %s\n; Clock: %s kHz (%s)\n; Used registers: " \
+ "; START: Wait loop, time: %s %s\n; Clock: %s kHz (%s)\n; Used registers: " ;# <-- NOT TRANSLATED YET
+ ##ID:003870##
+ mcset $l "; Rest: %s\n" \
+ "; Rest: %s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003871##
+ mcset $l "; END: Wait loop" \
+ "; END: Wait loop" ;# <-- NOT TRANSLATED YET
+ ##ID:003872##
+ mcset $l "Invalid time" \
+ "Invalid time" ;# <-- NOT TRANSLATED YET
+ ##ID:003873##
+ mcset $l "Invalid clock rate" \
+ "Invalid clock rate" ;# <-- NOT TRANSLATED YET
+ ##ID:003874##
+ mcset $l "Value is too high" \
+ "Value is too high" ;# <-- NOT TRANSLATED YET
+ ##ID:003875##
+ mcset $l "One" \
+ "One" ;# <-- NOT TRANSLATED YET
+ ##ID:003876##
+ mcset $l "Timer 0/1 in mode 0" \
+ "Timer 0/1 in mode 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003877##
+ mcset $l "Timer 0/1 in mode 1" \
+ "Timer 0/1 in mode 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003878##
+ mcset $l "Timer 0/1 in mode 2" \
+ "Timer 0/1 in mode 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003879##
+ mcset $l "Timer 2 as up/down counter" \
+ "Timer 2 as up/down counter" ;# <-- NOT TRANSLATED YET
+ ##ID:003880##
+ mcset $l "Timer 1/2 as UART baud rate generator" \
+ "Timer 1/2 as UART baud rate generator" ;# <-- NOT TRANSLATED YET
+ ##ID:003881##
+ mcset $l "Internal baud rate generator" \
+ "Internal baud rate generator" ;# <-- NOT TRANSLATED YET
+ ##ID:003882##
+ mcset $l "Diagram or formula" \
+ "Diagram or formula" ;# <-- NOT TRANSLATED YET
+ ##ID:003883##
+ mcset $l "UART baud rate generator" \
+ "UART baud rate generator" ;# <-- NOT TRANSLATED YET
+ ##ID:003884##
+ mcset $l "All files" \
+ "All files" ;# <-- NOT TRANSLATED YET
+ ##ID:003885##
+ mcset $l "Text files" \
+ "Text files" ;# <-- NOT TRANSLATED YET
+ ##ID:003886##
+ mcset $l "HTML files" \
+ "HTML files" ;# <-- NOT TRANSLATED YET
+}
+# table_of_instructions.tcl
+# ==============================================================================
+namespace eval TableOfInstructions {
+ ##ID:003887##
+ mcset $l "Exit" \
+ "Exit" ;# <-- NOT TRANSLATED YET
+ ##ID:003888##
+ mcset $l "OP code (hex): " \
+ "OP code (hex): " ;# <-- NOT TRANSLATED YET
+ ##ID:003889##
+ mcset $l "Class: " \
+ "Class: " ;# <-- NOT TRANSLATED YET
+ ##ID:003890##
+ mcset $l "Description: " \
+ "Description: " ;# <-- NOT TRANSLATED YET
+ ##ID:003891##
+ mcset $l "Length: " \
+ "Length: " ;# <-- NOT TRANSLATED YET
+ ##ID:003892##
+ mcset $l "Time: " \
+ "Time: " ;# <-- NOT TRANSLATED YET
+ ##ID:003893##
+ mcset $l "Flags: " \
+ "Flags: " ;# <-- NOT TRANSLATED YET
+ ##ID:003894##
+ mcset $l "Note: " \
+ "Note: " ;# <-- NOT TRANSLATED YET
+ ##ID:003895##
+ mcset $l "OP code not defined" \
+ "OP code not defined" ;# <-- NOT TRANSLATED YET
+ ##ID:003896##
+ mcset $l "This instruction does not exist on 8051" \
+ "This instruction does not exist on 8051" ;# <-- NOT TRANSLATED YET
+ ##ID:003897##
+ mcset $l "Operands" \
+ "Operands" ;# <-- NOT TRANSLATED YET
+ ##ID:003898##
+ mcset $l "Length" \
+ "Length" ;# <-- NOT TRANSLATED YET
+ ##ID:003899##
+ mcset $l "Time" \
+ "Time" ;# <-- NOT TRANSLATED YET
+ ##ID:003900##
+ mcset $l "Mnemonics" \
+ "Mnemonics" ;# <-- NOT TRANSLATED YET
+}
+# spell_check.tcl
+# ==============================================================================
+namespace eval Editor {
+ ##ID:003901##
+ mcset $l "Hunspell error" \
+ "Hunspell error" ;# <-- NOT TRANSLATED YET
+ ##ID:003902##
+ mcset $l "Unable to start the spell checker. Please try to re-install the hunspell. Spell checking function will not be available" \
+ "Unable to start the spell checker. Please try to re-install the hunspell. Spell checking function will not be available" ;# <-- NOT TRANSLATED YET
+ ##ID:003903##
+ mcset $l "Refresh list of dictionaries" \
+ "Refresh list of dictionaries" ;# <-- NOT TRANSLATED YET
+ ##ID:003904##
+ mcset $l "Turn off spell checking" \
+ "Turn off spell checking" ;# <-- NOT TRANSLATED YET
+ ##ID:003905##
+ mcset $l "Set dictionary by language" \
+ "Set dictionary by language" ;# <-- NOT TRANSLATED YET
+ ##ID:003906##
+ mcset $l "Set dictionary by country" \
+ "Set dictionary by country" ;# <-- NOT TRANSLATED YET
+ ##ID:003907##
+ mcset $l "File changed on disk" \
+ "File changed on disk" ;# <-- NOT TRANSLATED YET
+ ##ID:003908##
+ mcset $l "The file '%s' was modified from outside of this program.\n\nWhat do you want to do with the modified file" \
+ "The file '%s' was modified from outside of this program.\n\nWhat do you want to do with the modified file" ;# <-- NOT TRANSLATED YET
+ ##ID:003909##
+ mcset $l "Reload in editor" \
+ "Reload in editor" ;# <-- NOT TRANSLATED YET
+ ##ID:003910##
+ mcset $l "Overwrite on disk" \
+ "Overwrite on disk" ;# <-- NOT TRANSLATED YET
+ ##ID:003911##
+ mcset $l "Do nothing" \
+ "Do nothing" ;# <-- NOT TRANSLATED YET
+ # Names of languages
+ ##ID:003912##
+ mcset $l "Abkhazian" \
+ "Abkhazian" ;# <-- NOT TRANSLATED YET
+ ##ID:003913##
+ mcset $l "Afar" \
+ "Afar" ;# <-- NOT TRANSLATED YET
+ ##ID:003914##
+ mcset $l "Afrikaans" \
+ "Afrikaans" ;# <-- NOT TRANSLATED YET
+ ##ID:003915##
+ mcset $l "Akan" \
+ "Akan" ;# <-- NOT TRANSLATED YET
+ ##ID:003916##
+ mcset $l "Albanian" \
+ "Albanian" ;# <-- NOT TRANSLATED YET
+ ##ID:003917##
+ mcset $l "Amharic" \
+ "Amharic" ;# <-- NOT TRANSLATED YET
+ ##ID:003918##
+ mcset $l "Arabic" \
+ "Arabic" ;# <-- NOT TRANSLATED YET
+ ##ID:003919##
+ mcset $l "Aragonese" \
+ "Aragonese" ;# <-- NOT TRANSLATED YET
+ ##ID:003920##
+ mcset $l "Armenian" \
+ "Armenian" ;# <-- NOT TRANSLATED YET
+ ##ID:003921##
+ mcset $l "Assamese" \
+ "Assamese" ;# <-- NOT TRANSLATED YET
+ ##ID:003922##
+ mcset $l "Avaric" \
+ "Avaric" ;# <-- NOT TRANSLATED YET
+ ##ID:003923##
+ mcset $l "Avestan" \
+ "Avestan" ;# <-- NOT TRANSLATED YET
+ ##ID:003924##
+ mcset $l "Aymara" \
+ "Aymara" ;# <-- NOT TRANSLATED YET
+ ##ID:003925##
+ mcset $l "Azerbaijani" \
+ "Azerbaijani" ;# <-- NOT TRANSLATED YET
+ ##ID:003926##
+ mcset $l "Bambara" \
+ "Bambara" ;# <-- NOT TRANSLATED YET
+ ##ID:003927##
+ mcset $l "Bashkir" \
+ "Bashkir" ;# <-- NOT TRANSLATED YET
+ ##ID:003928##
+ mcset $l "Basque" \
+ "Basque" ;# <-- NOT TRANSLATED YET
+ ##ID:003929##
+ mcset $l "Belarusian" \
+ "Belarusian" ;# <-- NOT TRANSLATED YET
+ ##ID:003930##
+ mcset $l "Bengali" \
+ "Bengali" ;# <-- NOT TRANSLATED YET
+ ##ID:003931##
+ mcset $l "Bihari languages" \
+ "Bihari languages" ;# <-- NOT TRANSLATED YET
+ ##ID:003932##
+ mcset $l "Bislama" \
+ "Bislama" ;# <-- NOT TRANSLATED YET
+ ##ID:003933##
+ mcset $l "Bokmål, Norwegian" \
+ "Bokmål, Norwegian" ;# <-- NOT TRANSLATED YET
+ ##ID:003934##
+ mcset $l "Bosnian" \
+ "Bosnian" ;# <-- NOT TRANSLATED YET
+ ##ID:003935##
+ mcset $l "Breton" \
+ "Breton" ;# <-- NOT TRANSLATED YET
+ ##ID:003936##
+ mcset $l "Bulgarian" \
+ "Bulgarian" ;# <-- NOT TRANSLATED YET
+ ##ID:003937##
+ mcset $l "Burmese" \
+ "Burmese" ;# <-- NOT TRANSLATED YET
+ ##ID:003938##
+ mcset $l "Castilian" \
+ "Castilian" ;# <-- NOT TRANSLATED YET
+ ##ID:003939##
+ mcset $l "Catalan" \
+ "Catalan" ;# <-- NOT TRANSLATED YET
+ ##ID:003940##
+ mcset $l "Central Khmer" \
+ "Central Khmer" ;# <-- NOT TRANSLATED YET
+ ##ID:003941##
+ mcset $l "Chamorro" \
+ "Chamorro" ;# <-- NOT TRANSLATED YET
+ ##ID:003942##
+ mcset $l "Chechen" \
+ "Chechen" ;# <-- NOT TRANSLATED YET
+ ##ID:003943##
+ mcset $l "Chewa" \
+ "Chewa" ;# <-- NOT TRANSLATED YET
+ ##ID:003944##
+ mcset $l "Chichewa" \
+ "Chichewa" ;# <-- NOT TRANSLATED YET
+ ##ID:003945##
+ mcset $l "Chinese" \
+ "Chinese" ;# <-- NOT TRANSLATED YET
+ ##ID:003946##
+ mcset $l "Chuang" \
+ "Chuang" ;# <-- NOT TRANSLATED YET
+ ##ID:003947##
+ mcset $l "Church Slavic" \
+ "Church Slavic" ;# <-- NOT TRANSLATED YET
+ ##ID:003948##
+ mcset $l "Church Slavonic" \
+ "Church Slavonic" ;# <-- NOT TRANSLATED YET
+ ##ID:003949##
+ mcset $l "Chuvash" \
+ "Chuvash" ;# <-- NOT TRANSLATED YET
+ ##ID:003950##
+ mcset $l "Cornish" \
+ "Cornish" ;# <-- NOT TRANSLATED YET
+ ##ID:003951##
+ mcset $l "Corsican" \
+ "Corsican" ;# <-- NOT TRANSLATED YET
+ ##ID:003952##
+ mcset $l "Cree" \
+ "Cree" ;# <-- NOT TRANSLATED YET
+ ##ID:003953##
+ mcset $l "Croatian" \
+ "Croatian" ;# <-- NOT TRANSLATED YET
+ ##ID:003954##
+ mcset $l "Czech" \
+ "Czech" ;# <-- NOT TRANSLATED YET
+ ##ID:003955##
+ mcset $l "Danish" \
+ "Danish" ;# <-- NOT TRANSLATED YET
+ ##ID:003956##
+ mcset $l "Dhivehi" \
+ "Dhivehi" ;# <-- NOT TRANSLATED YET
+ ##ID:003957##
+ mcset $l "Divehi" \
+ "Divehi" ;# <-- NOT TRANSLATED YET
+ ##ID:003958##
+ mcset $l "Dutch" \
+ "Dutch" ;# <-- NOT TRANSLATED YET
+ ##ID:003959##
+ mcset $l "Dzongkha" \
+ "Dzongkha" ;# <-- NOT TRANSLATED YET
+ ##ID:003960##
+ mcset $l "English" \
+ "English" ;# <-- NOT TRANSLATED YET
+ ##ID:003961##
+ mcset $l "Esperanto" \
+ "Esperanto" ;# <-- NOT TRANSLATED YET
+ ##ID:003962##
+ mcset $l "Estonian" \
+ "Estonian" ;# <-- NOT TRANSLATED YET
+ ##ID:003963##
+ mcset $l "Ewe" \
+ "Ewe" ;# <-- NOT TRANSLATED YET
+ ##ID:003964##
+ mcset $l "Faroese" \
+ "Faroese" ;# <-- NOT TRANSLATED YET
+ ##ID:003965##
+ mcset $l "Fijian" \
+ "Fijian" ;# <-- NOT TRANSLATED YET
+ ##ID:003966##
+ mcset $l "Finnish" \
+ "Finnish" ;# <-- NOT TRANSLATED YET
+ ##ID:003967##
+ mcset $l "Flemish" \
+ "Flemish" ;# <-- NOT TRANSLATED YET
+ ##ID:003968##
+ mcset $l "French" \
+ "French" ;# <-- NOT TRANSLATED YET
+ ##ID:003969##
+ mcset $l "Fulah" \
+ "Fulah" ;# <-- NOT TRANSLATED YET
+ ##ID:003970##
+ mcset $l "Gaelic" \
+ "Gaelic" ;# <-- NOT TRANSLATED YET
+ ##ID:003971##
+ mcset $l "Galician" \
+ "Galician" ;# <-- NOT TRANSLATED YET
+ ##ID:003972##
+ mcset $l "Ganda" \
+ "Ganda" ;# <-- NOT TRANSLATED YET
+ ##ID:003973##
+ mcset $l "Georgian" \
+ "Georgian" ;# <-- NOT TRANSLATED YET
+ ##ID:003974##
+ mcset $l "German" \
+ "German" ;# <-- NOT TRANSLATED YET
+ ##ID:003975##
+ mcset $l "Gikuyu" \
+ "Gikuyu" ;# <-- NOT TRANSLATED YET
+ ##ID:003976##
+ mcset $l "Greek, Modern" \
+ "Greek, Modern" ;# <-- NOT TRANSLATED YET
+ ##ID:003977##
+ mcset $l "Greenlandic" \
+ "Greenlandic" ;# <-- NOT TRANSLATED YET
+ ##ID:003978##
+ mcset $l "Guarani" \
+ "Guarani" ;# <-- NOT TRANSLATED YET
+ ##ID:003979##
+ mcset $l "Gujarati" \
+ "Gujarati" ;# <-- NOT TRANSLATED YET
+ ##ID:003980##
+ mcset $l "Haitian" \
+ "Haitian" ;# <-- NOT TRANSLATED YET
+ ##ID:003981##
+ mcset $l "Haitian Creole" \
+ "Haitian Creole" ;# <-- NOT TRANSLATED YET
+ ##ID:003982##
+ mcset $l "Hausa" \
+ "Hausa" ;# <-- NOT TRANSLATED YET
+ ##ID:003983##
+ mcset $l "Hebrew" \
+ "Hebrew" ;# <-- NOT TRANSLATED YET
+ ##ID:003984##
+ mcset $l "Herero" \
+ "Herero" ;# <-- NOT TRANSLATED YET
+ ##ID:003985##
+ mcset $l "Hindi" \
+ "Hindi" ;# <-- NOT TRANSLATED YET
+ ##ID:003986##
+ mcset $l "Hiri Motu" \
+ "Hiri Motu" ;# <-- NOT TRANSLATED YET
+ ##ID:003987##
+ mcset $l "Hungarian" \
+ "Hungarian" ;# <-- NOT TRANSLATED YET
+ ##ID:003988##
+ mcset $l "Icelandic" \
+ "Icelandic" ;# <-- NOT TRANSLATED YET
+ ##ID:003989##
+ mcset $l "Ido" \
+ "Ido" ;# <-- NOT TRANSLATED YET
+ ##ID:003990##
+ mcset $l "Igbo" \
+ "Igbo" ;# <-- NOT TRANSLATED YET
+ ##ID:003991##
+ mcset $l "Indonesian" \
+ "Indonesian" ;# <-- NOT TRANSLATED YET
+ ##ID:003992##
+ mcset $l "Interlingue" \
+ "Interlingue" ;# <-- NOT TRANSLATED YET
+ ##ID:003993##
+ mcset $l "Inuktitut" \
+ "Inuktitut" ;# <-- NOT TRANSLATED YET
+ ##ID:003994##
+ mcset $l "Inupiaq" \
+ "Inupiaq" ;# <-- NOT TRANSLATED YET
+ ##ID:003995##
+ mcset $l "Irish" \
+ "Irish" ;# <-- NOT TRANSLATED YET
+ ##ID:003996##
+ mcset $l "Italian" \
+ "Italian" ;# <-- NOT TRANSLATED YET
+ ##ID:003997##
+ mcset $l "Japanese" \
+ "Japanese" ;# <-- NOT TRANSLATED YET
+ ##ID:003998##
+ mcset $l "Javanese" \
+ "Javanese" ;# <-- NOT TRANSLATED YET
+ ##ID:003999##
+ mcset $l "Kalaallisut" \
+ "Kalaallisut" ;# <-- NOT TRANSLATED YET
+ ##ID:004000##
+ mcset $l "Kannada" \
+ "Kannada" ;# <-- NOT TRANSLATED YET
+ ##ID:004001##
+ mcset $l "Kanuri" \
+ "Kanuri" ;# <-- NOT TRANSLATED YET
+ ##ID:004002##
+ mcset $l "Kashmiri" \
+ "Kashmiri" ;# <-- NOT TRANSLATED YET
+ ##ID:004003##
+ mcset $l "Kazakh" \
+ "Kazakh" ;# <-- NOT TRANSLATED YET
+ ##ID:004004##
+ mcset $l "Kikuyu" \
+ "Kikuyu" ;# <-- NOT TRANSLATED YET
+ ##ID:004005##
+ mcset $l "Kinyarwanda" \
+ "Kinyarwanda" ;# <-- NOT TRANSLATED YET
+ ##ID:004006##
+ mcset $l "Kirghiz" \
+ "Kirghiz" ;# <-- NOT TRANSLATED YET
+ ##ID:004007##
+ mcset $l "Komi" \
+ "Komi" ;# <-- NOT TRANSLATED YET
+ ##ID:004008##
+ mcset $l "Kongo" \
+ "Kongo" ;# <-- NOT TRANSLATED YET
+ ##ID:004009##
+ mcset $l "Korean" \
+ "Korean" ;# <-- NOT TRANSLATED YET
+ ##ID:004010##
+ mcset $l "Kuanyama" \
+ "Kuanyama" ;# <-- NOT TRANSLATED YET
+ ##ID:004011##
+ mcset $l "Kurdish" \
+ "Kurdish" ;# <-- NOT TRANSLATED YET
+ ##ID:004012##
+ mcset $l "Kwanyama" \
+ "Kwanyama" ;# <-- NOT TRANSLATED YET
+ ##ID:004013##
+ mcset $l "Kyrgyz" \
+ "Kyrgyz" ;# <-- NOT TRANSLATED YET
+ ##ID:004014##
+ mcset $l "Lao" \
+ "Lao" ;# <-- NOT TRANSLATED YET
+ ##ID:004015##
+ mcset $l "Latin" \
+ "Latin" ;# <-- NOT TRANSLATED YET
+ ##ID:004016##
+ mcset $l "Latvian" \
+ "Latvian" ;# <-- NOT TRANSLATED YET
+ ##ID:004017##
+ mcset $l "Letzeburgesch" \
+ "Letzeburgesch" ;# <-- NOT TRANSLATED YET
+ ##ID:004018##
+ mcset $l "Limburgan" \
+ "Limburgan" ;# <-- NOT TRANSLATED YET
+ ##ID:004019##
+ mcset $l "Limburger" \
+ "Limburger" ;# <-- NOT TRANSLATED YET
+ ##ID:004020##
+ mcset $l "Limburgish" \
+ "Limburgish" ;# <-- NOT TRANSLATED YET
+ ##ID:004021##
+ mcset $l "Lingala" \
+ "Lingala" ;# <-- NOT TRANSLATED YET
+ ##ID:004022##
+ mcset $l "Lithuanian" \
+ "Lithuanian" ;# <-- NOT TRANSLATED YET
+ ##ID:004023##
+ mcset $l "Luba-Katanga" \
+ "Luba-Katanga" ;# <-- NOT TRANSLATED YET
+ ##ID:004024##
+ mcset $l "Luxembourgish" \
+ "Luxembourgish" ;# <-- NOT TRANSLATED YET
+ ##ID:004025##
+ mcset $l "Macedonian" \
+ "Macedonian" ;# <-- NOT TRANSLATED YET
+ ##ID:004026##
+ mcset $l "Malagasy" \
+ "Malagasy" ;# <-- NOT TRANSLATED YET
+ ##ID:004027##
+ mcset $l "Malay" \
+ "Malay" ;# <-- NOT TRANSLATED YET
+ ##ID:004028##
+ mcset $l "Malayalam" \
+ "Malayalam" ;# <-- NOT TRANSLATED YET
+ ##ID:004029##
+ mcset $l "Maldivian" \
+ "Maldivian" ;# <-- NOT TRANSLATED YET
+ ##ID:004030##
+ mcset $l "Maltese" \
+ "Maltese" ;# <-- NOT TRANSLATED YET
+ ##ID:004031##
+ mcset $l "Manx" \
+ "Manx" ;# <-- NOT TRANSLATED YET
+ ##ID:004032##
+ mcset $l "Maori" \
+ "Maori" ;# <-- NOT TRANSLATED YET
+ ##ID:004033##
+ mcset $l "Marathi" \
+ "Marathi" ;# <-- NOT TRANSLATED YET
+ ##ID:004034##
+ mcset $l "Marshallese" \
+ "Marshallese" ;# <-- NOT TRANSLATED YET
+ ##ID:004035##
+ mcset $l "Moldavian" \
+ "Moldavian" ;# <-- NOT TRANSLATED YET
+ ##ID:004036##
+ mcset $l "Moldovan" \
+ "Moldovan" ;# <-- NOT TRANSLATED YET
+ ##ID:004037##
+ mcset $l "Mongolian" \
+ "Mongolian" ;# <-- NOT TRANSLATED YET
+ ##ID:004038##
+ mcset $l "Nauru" \
+ "Nauru" ;# <-- NOT TRANSLATED YET
+ ##ID:004039##
+ mcset $l "Navaho" \
+ "Navaho" ;# <-- NOT TRANSLATED YET
+ ##ID:004040##
+ mcset $l "Navajo" \
+ "Navajo" ;# <-- NOT TRANSLATED YET
+ ##ID:004041##
+ mcset $l "Ndebele, North" \
+ "Ndebele, North" ;# <-- NOT TRANSLATED YET
+ ##ID:004042##
+ mcset $l "Ndebele, South" \
+ "Ndebele, South" ;# <-- NOT TRANSLATED YET
+ ##ID:004043##
+ mcset $l "Ndonga" \
+ "Ndonga" ;# <-- NOT TRANSLATED YET
+ ##ID:004044##
+ mcset $l "Nepali" \
+ "Nepali" ;# <-- NOT TRANSLATED YET
+ ##ID:004045##
+ mcset $l "North Ndebele" \
+ "North Ndebele" ;# <-- NOT TRANSLATED YET
+ ##ID:004046##
+ mcset $l "Northern Sami" \
+ "Northern Sami" ;# <-- NOT TRANSLATED YET
+ ##ID:004047##
+ mcset $l "Norwegian" \
+ "Norwegian" ;# <-- NOT TRANSLATED YET
+ ##ID:004048##
+ mcset $l "Norwegian Bokmål" \
+ "Norwegian Bokmål" ;# <-- NOT TRANSLATED YET
+ ##ID:004049##
+ mcset $l "Norwegian Nynorsk" \
+ "Norwegian Nynorsk" ;# <-- NOT TRANSLATED YET
+ ##ID:004050##
+ mcset $l "Nuosu" \
+ "Nuosu" ;# <-- NOT TRANSLATED YET
+ ##ID:004051##
+ mcset $l "Nyanja" \
+ "Nyanja" ;# <-- NOT TRANSLATED YET
+ ##ID:004052##
+ mcset $l "Nynorsk, Norwegian" \
+ "Nynorsk, Norwegian" ;# <-- NOT TRANSLATED YET
+ ##ID:004053##
+ mcset $l "Occidental" \
+ "Occidental" ;# <-- NOT TRANSLATED YET
+ ##ID:004054##
+ mcset $l "Occitan" \
+ "Occitan" ;# <-- NOT TRANSLATED YET
+ ##ID:004055##
+ mcset $l "Ojibwa" \
+ "Ojibwa" ;# <-- NOT TRANSLATED YET
+ ##ID:004056##
+ mcset $l "Old Bulgarian" \
+ "Old Bulgarian" ;# <-- NOT TRANSLATED YET
+ ##ID:004057##
+ mcset $l "Old Church Slavonic" \
+ "Old Church Slavonic" ;# <-- NOT TRANSLATED YET
+ ##ID:004058##
+ mcset $l "Old Slavonic" \
+ "Old Slavonic" ;# <-- NOT TRANSLATED YET
+ ##ID:004059##
+ mcset $l "Oriya" \
+ "Oriya" ;# <-- NOT TRANSLATED YET
+ ##ID:004060##
+ mcset $l "Oromo" \
+ "Oromo" ;# <-- NOT TRANSLATED YET
+ ##ID:004061##
+ mcset $l "Ossetian" \
+ "Ossetian" ;# <-- NOT TRANSLATED YET
+ ##ID:004062##
+ mcset $l "Ossetic" \
+ "Ossetic" ;# <-- NOT TRANSLATED YET
+ ##ID:004063##
+ mcset $l "Pali" \
+ "Pali" ;# <-- NOT TRANSLATED YET
+ ##ID:004064##
+ mcset $l "Panjabi" \
+ "Panjabi" ;# <-- NOT TRANSLATED YET
+ ##ID:004065##
+ mcset $l "Pashto" \
+ "Pashto" ;# <-- NOT TRANSLATED YET
+ ##ID:004066##
+ mcset $l "Persian" \
+ "Persian" ;# <-- NOT TRANSLATED YET
+ ##ID:004067##
+ mcset $l "Polish" \
+ "Polish" ;# <-- NOT TRANSLATED YET
+ ##ID:004068##
+ mcset $l "Portuguese" \
+ "Portuguese" ;# <-- NOT TRANSLATED YET
+ ##ID:004069##
+ mcset $l "Punjabi" \
+ "Punjabi" ;# <-- NOT TRANSLATED YET
+ ##ID:004070##
+ mcset $l "Pushto" \
+ "Pushto" ;# <-- NOT TRANSLATED YET
+ ##ID:004071##
+ mcset $l "Quechua" \
+ "Quechua" ;# <-- NOT TRANSLATED YET
+ ##ID:004072##
+ mcset $l "Romanian" \
+ "Romanian" ;# <-- NOT TRANSLATED YET
+ ##ID:004073##
+ mcset $l "Romansh" \
+ "Romansh" ;# <-- NOT TRANSLATED YET
+ ##ID:004074##
+ mcset $l "Rundi" \
+ "Rundi" ;# <-- NOT TRANSLATED YET
+ ##ID:004075##
+ mcset $l "Russian" \
+ "Russian" ;# <-- NOT TRANSLATED YET
+ ##ID:004076##
+ mcset $l "Samoan" \
+ "Samoan" ;# <-- NOT TRANSLATED YET
+ ##ID:004077##
+ mcset $l "Sango" \
+ "Sango" ;# <-- NOT TRANSLATED YET
+ ##ID:004078##
+ mcset $l "Sanskrit" \
+ "Sanskrit" ;# <-- NOT TRANSLATED YET
+ ##ID:004079##
+ mcset $l "Sardinian" \
+ "Sardinian" ;# <-- NOT TRANSLATED YET
+ ##ID:004080##
+ mcset $l "Scottish Gaelic" \
+ "Scottish Gaelic" ;# <-- NOT TRANSLATED YET
+ ##ID:004081##
+ mcset $l "Serbian" \
+ "Serbian" ;# <-- NOT TRANSLATED YET
+ ##ID:004082##
+ mcset $l "Shona" \
+ "Shona" ;# <-- NOT TRANSLATED YET
+ ##ID:004083##
+ mcset $l "Sichuan Yi" \
+ "Sichuan Yi" ;# <-- NOT TRANSLATED YET
+ ##ID:004084##
+ mcset $l "Sindhi" \
+ "Sindhi" ;# <-- NOT TRANSLATED YET
+ ##ID:004085##
+ mcset $l "Sinhala" \
+ "Sinhala" ;# <-- NOT TRANSLATED YET
+ ##ID:004086##
+ mcset $l "Sinhalese" \
+ "Sinhalese" ;# <-- NOT TRANSLATED YET
+ ##ID:004087##
+ mcset $l "Slovak" \
+ "Slovak" ;# <-- NOT TRANSLATED YET
+ ##ID:004088##
+ mcset $l "Slovenian" \
+ "Slovenian" ;# <-- NOT TRANSLATED YET
+ ##ID:004089##
+ mcset $l "Somali" \
+ "Somali" ;# <-- NOT TRANSLATED YET
+ ##ID:004090##
+ mcset $l "Sotho, Southern" \
+ "Sotho, Southern" ;# <-- NOT TRANSLATED YET
+ ##ID:004091##
+ mcset $l "South Ndebele" \
+ "South Ndebele" ;# <-- NOT TRANSLATED YET
+ ##ID:004092##
+ mcset $l "Spanish" \
+ "Spanish" ;# <-- NOT TRANSLATED YET
+ ##ID:004093##
+ mcset $l "Sundanese" \
+ "Sundanese" ;# <-- NOT TRANSLATED YET
+ ##ID:004094##
+ mcset $l "Swahili" \
+ "Swahili" ;# <-- NOT TRANSLATED YET
+ ##ID:004095##
+ mcset $l "Swati" \
+ "Swati" ;# <-- NOT TRANSLATED YET
+ ##ID:004096##
+ mcset $l "Swedish" \
+ "Swedish" ;# <-- NOT TRANSLATED YET
+ ##ID:004097##
+ mcset $l "Tagalog" \
+ "Tagalog" ;# <-- NOT TRANSLATED YET
+ ##ID:004098##
+ mcset $l "Tahitian" \
+ "Tahitian" ;# <-- NOT TRANSLATED YET
+ ##ID:004099##
+ mcset $l "Tajik" \
+ "Tajik" ;# <-- NOT TRANSLATED YET
+ ##ID:004100##
+ mcset $l "Tamil" \
+ "Tamil" ;# <-- NOT TRANSLATED YET
+ ##ID:004101##
+ mcset $l "Tatar" \
+ "Tatar" ;# <-- NOT TRANSLATED YET
+ ##ID:004102##
+ mcset $l "Telugu" \
+ "Telugu" ;# <-- NOT TRANSLATED YET
+ ##ID:004103##
+ mcset $l "Thai" \
+ "Thai" ;# <-- NOT TRANSLATED YET
+ ##ID:004104##
+ mcset $l "Tibetan" \
+ "Tibetan" ;# <-- NOT TRANSLATED YET
+ ##ID:004105##
+ mcset $l "Tigrinya" \
+ "Tigrinya" ;# <-- NOT TRANSLATED YET
+ ##ID:004106##
+ mcset $l "Tonga" \
+ "Tonga" ;# <-- NOT TRANSLATED YET
+ ##ID:004107##
+ mcset $l "Tsonga" \
+ "Tsonga" ;# <-- NOT TRANSLATED YET
+ ##ID:004108##
+ mcset $l "Tswana" \
+ "Tswana" ;# <-- NOT TRANSLATED YET
+ ##ID:004109##
+ mcset $l "Turkish" \
+ "Turkish" ;# <-- NOT TRANSLATED YET
+ ##ID:004110##
+ mcset $l "Turkmen" \
+ "Turkmen" ;# <-- NOT TRANSLATED YET
+ ##ID:004111##
+ mcset $l "Twi" \
+ "Twi" ;# <-- NOT TRANSLATED YET
+ ##ID:004112##
+ mcset $l "Uighur" \
+ "Uighur" ;# <-- NOT TRANSLATED YET
+ ##ID:004113##
+ mcset $l "Ukrainian" \
+ "Ukrainian" ;# <-- NOT TRANSLATED YET
+ ##ID:004114##
+ mcset $l "Urdu" \
+ "Urdu" ;# <-- NOT TRANSLATED YET
+ ##ID:004115##
+ mcset $l "Uyghur" \
+ "Uyghur" ;# <-- NOT TRANSLATED YET
+ ##ID:004116##
+ mcset $l "Uzbek" \
+ "Uzbek" ;# <-- NOT TRANSLATED YET
+ ##ID:004117##
+ mcset $l "Valencian" \
+ "Valencian" ;# <-- NOT TRANSLATED YET
+ ##ID:004118##
+ mcset $l "Venda" \
+ "Venda" ;# <-- NOT TRANSLATED YET
+ ##ID:004119##
+ mcset $l "Vietnamese" \
+ "Vietnamese" ;# <-- NOT TRANSLATED YET
+ ##ID:004120##
+ mcset $l "Volapük" \
+ "Volapük" ;# <-- NOT TRANSLATED YET
+ ##ID:004121##
+ mcset $l "Walloon" \
+ "Walloon" ;# <-- NOT TRANSLATED YET
+ ##ID:004122##
+ mcset $l "Welsh" \
+ "Welsh" ;# <-- NOT TRANSLATED YET
+ ##ID:004123##
+ mcset $l "Western Frisian" \
+ "Western Frisian" ;# <-- NOT TRANSLATED YET
+ ##ID:004124##
+ mcset $l "Wolof" \
+ "Wolof" ;# <-- NOT TRANSLATED YET
+ ##ID:004125##
+ mcset $l "Xhosa" \
+ "Xhosa" ;# <-- NOT TRANSLATED YET
+ ##ID:004126##
+ mcset $l "Yiddish" \
+ "Yiddish" ;# <-- NOT TRANSLATED YET
+ ##ID:004127##
+ mcset $l "Yoruba" \
+ "Yoruba" ;# <-- NOT TRANSLATED YET
+ ##ID:004128##
+ mcset $l "Zhuang" \
+ "Zhuang" ;# <-- NOT TRANSLATED YET
+ ##ID:004129##
+ mcset $l "Zulu" \
+ "Zulu" ;# <-- NOT TRANSLATED YET
+ # Names of countries
+ ##ID:004130##
+ mcset $l "Afghanistan" \
+ "Afghanistan" ;# <-- NOT TRANSLATED YET
+ ##ID:004131##
+ mcset $l "Åland Islands" \
+ "Åland Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004132##
+ mcset $l "Albania" \
+ "Albania" ;# <-- NOT TRANSLATED YET
+ ##ID:004133##
+ mcset $l "Algeria" \
+ "Algeria" ;# <-- NOT TRANSLATED YET
+ ##ID:004134##
+ mcset $l "American Samoa" \
+ "American Samoa" ;# <-- NOT TRANSLATED YET
+ ##ID:004135##
+ mcset $l "Andorra" \
+ "Andorra" ;# <-- NOT TRANSLATED YET
+ ##ID:004136##
+ mcset $l "Angola" \
+ "Angola" ;# <-- NOT TRANSLATED YET
+ ##ID:004137##
+ mcset $l "Anguilla" \
+ "Anguilla" ;# <-- NOT TRANSLATED YET
+ ##ID:004138##
+ mcset $l "Antarctica" \
+ "Antarctica" ;# <-- NOT TRANSLATED YET
+ ##ID:004139##
+ mcset $l "Antigua And Barbuda" \
+ "Antigua And Barbuda" ;# <-- NOT TRANSLATED YET
+ ##ID:004140##
+ mcset $l "Argentina" \
+ "Argentina" ;# <-- NOT TRANSLATED YET
+ ##ID:004141##
+ mcset $l "Armenia" \
+ "Armenia" ;# <-- NOT TRANSLATED YET
+ ##ID:004142##
+ mcset $l "Aruba" \
+ "Aruba" ;# <-- NOT TRANSLATED YET
+ ##ID:004143##
+ mcset $l "Australia" \
+ "Australia" ;# <-- NOT TRANSLATED YET
+ ##ID:004144##
+ mcset $l "Austria" \
+ "Austria" ;# <-- NOT TRANSLATED YET
+ ##ID:004145##
+ mcset $l "Azerbaijan" \
+ "Azerbaijan" ;# <-- NOT TRANSLATED YET
+ ##ID:004146##
+ mcset $l "Bahamas" \
+ "Bahamas" ;# <-- NOT TRANSLATED YET
+ ##ID:004147##
+ mcset $l "Bahrain" \
+ "Bahrain" ;# <-- NOT TRANSLATED YET
+ ##ID:004148##
+ mcset $l "Bangladesh" \
+ "Bangladesh" ;# <-- NOT TRANSLATED YET
+ ##ID:004149##
+ mcset $l "Barbados" \
+ "Barbados" ;# <-- NOT TRANSLATED YET
+ ##ID:004150##
+ mcset $l "Belarus" \
+ "Belarus" ;# <-- NOT TRANSLATED YET
+ ##ID:004151##
+ mcset $l "Belgium" \
+ "Belgium" ;# <-- NOT TRANSLATED YET
+ ##ID:004152##
+ mcset $l "Belize" \
+ "Belize" ;# <-- NOT TRANSLATED YET
+ ##ID:004153##
+ mcset $l "Benin" \
+ "Benin" ;# <-- NOT TRANSLATED YET
+ ##ID:004154##
+ mcset $l "Bermuda" \
+ "Bermuda" ;# <-- NOT TRANSLATED YET
+ ##ID:004155##
+ mcset $l "Bhutan" \
+ "Bhutan" ;# <-- NOT TRANSLATED YET
+ ##ID:004156##
+ mcset $l "Bolivia, Plurinational State Of" \
+ "Bolivia, Plurinational State Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004157##
+ mcset $l "Bosnia And Herzegovina" \
+ "Bosnia And Herzegovina" ;# <-- NOT TRANSLATED YET
+ ##ID:004158##
+ mcset $l "Botswana" \
+ "Botswana" ;# <-- NOT TRANSLATED YET
+ ##ID:004159##
+ mcset $l "Bouvet Island" \
+ "Bouvet Island" ;# <-- NOT TRANSLATED YET
+ ##ID:004160##
+ mcset $l "Brazil" \
+ "Brazil" ;# <-- NOT TRANSLATED YET
+ ##ID:004161##
+ mcset $l "British Indian Ocean Territory" \
+ "British Indian Ocean Territory" ;# <-- NOT TRANSLATED YET
+ ##ID:004162##
+ mcset $l "Brunei Darussalam" \
+ "Brunei Darussalam" ;# <-- NOT TRANSLATED YET
+ ##ID:004163##
+ mcset $l "Bulgaria" \
+ "Bulgaria" ;# <-- NOT TRANSLATED YET
+ ##ID:004164##
+ mcset $l "Burkina Faso" \
+ "Burkina Faso" ;# <-- NOT TRANSLATED YET
+ ##ID:004165##
+ mcset $l "Burundi" \
+ "Burundi" ;# <-- NOT TRANSLATED YET
+ ##ID:004166##
+ mcset $l "Cambodia" \
+ "Cambodia" ;# <-- NOT TRANSLATED YET
+ ##ID:004167##
+ mcset $l "Cameroon" \
+ "Cameroon" ;# <-- NOT TRANSLATED YET
+ ##ID:004168##
+ mcset $l "Canada" \
+ "Canada" ;# <-- NOT TRANSLATED YET
+ ##ID:004169##
+ mcset $l "Cape Verde" \
+ "Cape Verde" ;# <-- NOT TRANSLATED YET
+ ##ID:004170##
+ mcset $l "Cayman Islands" \
+ "Cayman Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004171##
+ mcset $l "Central African Republic" \
+ "Central African Republic" ;# <-- NOT TRANSLATED YET
+ ##ID:004172##
+ mcset $l "Chad" \
+ "Chad" ;# <-- NOT TRANSLATED YET
+ ##ID:004173##
+ mcset $l "Chile" \
+ "Chile" ;# <-- NOT TRANSLATED YET
+ ##ID:004174##
+ mcset $l "China" \
+ "China" ;# <-- NOT TRANSLATED YET
+ ##ID:004175##
+ mcset $l "Christmas Island" \
+ "Christmas Island" ;# <-- NOT TRANSLATED YET
+ ##ID:004176##
+ mcset $l "Cocos (Keeling) Islands" \
+ "Cocos (Keeling) Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004177##
+ mcset $l "Colombia" \
+ "Colombia" ;# <-- NOT TRANSLATED YET
+ ##ID:004178##
+ mcset $l "Comoros" \
+ "Comoros" ;# <-- NOT TRANSLATED YET
+ ##ID:004179##
+ mcset $l "Congo" \
+ "Congo" ;# <-- NOT TRANSLATED YET
+ ##ID:004180##
+ mcset $l "Congo, The Democratic Republic Of The" \
+ "Congo, The Democratic Republic Of The" ;# <-- NOT TRANSLATED YET
+ ##ID:004181##
+ mcset $l "Cook Islands" \
+ "Cook Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004182##
+ mcset $l "Costa Rica" \
+ "Costa Rica" ;# <-- NOT TRANSLATED YET
+ ##ID:004183##
+ mcset $l "Côte D'Ivoire" \
+ "Côte D'Ivoire" ;# <-- NOT TRANSLATED YET
+ ##ID:004184##
+ mcset $l "Croatia" \
+ "Croatia" ;# <-- NOT TRANSLATED YET
+ ##ID:004185##
+ mcset $l "Cuba" \
+ "Cuba" ;# <-- NOT TRANSLATED YET
+ ##ID:004186##
+ mcset $l "Cyprus" \
+ "Cyprus" ;# <-- NOT TRANSLATED YET
+ ##ID:004187##
+ mcset $l "Czech Republic" \
+ "Czech Republic" ;# <-- NOT TRANSLATED YET
+ ##ID:004188##
+ mcset $l "Denmark" \
+ "Denmark" ;# <-- NOT TRANSLATED YET
+ ##ID:004189##
+ mcset $l "Djibouti" \
+ "Djibouti" ;# <-- NOT TRANSLATED YET
+ ##ID:004190##
+ mcset $l "Dominica" \
+ "Dominica" ;# <-- NOT TRANSLATED YET
+ ##ID:004191##
+ mcset $l "Dominican Republic" \
+ "Dominican Republic" ;# <-- NOT TRANSLATED YET
+ ##ID:004192##
+ mcset $l "Ecuador" \
+ "Ecuador" ;# <-- NOT TRANSLATED YET
+ ##ID:004193##
+ mcset $l "Egypt" \
+ "Egypt" ;# <-- NOT TRANSLATED YET
+ ##ID:004194##
+ mcset $l "El Salvador" \
+ "El Salvador" ;# <-- NOT TRANSLATED YET
+ ##ID:004195##
+ mcset $l "Equatorial Guinea" \
+ "Equatorial Guinea" ;# <-- NOT TRANSLATED YET
+ ##ID:004196##
+ mcset $l "Eritrea" \
+ "Eritrea" ;# <-- NOT TRANSLATED YET
+ ##ID:004197##
+ mcset $l "Estonia" \
+ "Estonia" ;# <-- NOT TRANSLATED YET
+ ##ID:004198##
+ mcset $l "Ethiopia" \
+ "Ethiopia" ;# <-- NOT TRANSLATED YET
+ ##ID:004199##
+ mcset $l "Falkland Islands (Malvinas)" \
+ "Falkland Islands (Malvinas)" ;# <-- NOT TRANSLATED YET
+ ##ID:004200##
+ mcset $l "Faroe Islands" \
+ "Faroe Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004201##
+ mcset $l "Fiji" \
+ "Fiji" ;# <-- NOT TRANSLATED YET
+ ##ID:004202##
+ mcset $l "Finland" \
+ "Finland" ;# <-- NOT TRANSLATED YET
+ ##ID:004203##
+ mcset $l "France" \
+ "France" ;# <-- NOT TRANSLATED YET
+ ##ID:004204##
+ mcset $l "French Guiana" \
+ "French Guiana" ;# <-- NOT TRANSLATED YET
+ ##ID:004205##
+ mcset $l "French Polynesia" \
+ "French Polynesia" ;# <-- NOT TRANSLATED YET
+ ##ID:004206##
+ mcset $l "French Southern Territories" \
+ "French Southern Territories" ;# <-- NOT TRANSLATED YET
+ ##ID:004207##
+ mcset $l "Gabon" \
+ "Gabon" ;# <-- NOT TRANSLATED YET
+ ##ID:004208##
+ mcset $l "Gambia" \
+ "Gambia" ;# <-- NOT TRANSLATED YET
+ ##ID:004209##
+ mcset $l "Georgia" \
+ "Georgia" ;# <-- NOT TRANSLATED YET
+ ##ID:004210##
+ mcset $l "Germany" \
+ "Germany" ;# <-- NOT TRANSLATED YET
+ ##ID:004211##
+ mcset $l "Ghana" \
+ "Ghana" ;# <-- NOT TRANSLATED YET
+ ##ID:004212##
+ mcset $l "Gibraltar" \
+ "Gibraltar" ;# <-- NOT TRANSLATED YET
+ ##ID:004213##
+ mcset $l "Greece" \
+ "Greece" ;# <-- NOT TRANSLATED YET
+ ##ID:004214##
+ mcset $l "Greenland" \
+ "Greenland" ;# <-- NOT TRANSLATED YET
+ ##ID:004215##
+ mcset $l "Grenada" \
+ "Grenada" ;# <-- NOT TRANSLATED YET
+ ##ID:004216##
+ mcset $l "Guadeloupe" \
+ "Guadeloupe" ;# <-- NOT TRANSLATED YET
+ ##ID:004217##
+ mcset $l "Guam" \
+ "Guam" ;# <-- NOT TRANSLATED YET
+ ##ID:004218##
+ mcset $l "Guatemala" \
+ "Guatemala" ;# <-- NOT TRANSLATED YET
+ ##ID:004219##
+ mcset $l "Guernsey" \
+ "Guernsey" ;# <-- NOT TRANSLATED YET
+ ##ID:004220##
+ mcset $l "Guinea" \
+ "Guinea" ;# <-- NOT TRANSLATED YET
+ ##ID:004221##
+ mcset $l "Guinea-Bissau" \
+ "Guinea-Bissau" ;# <-- NOT TRANSLATED YET
+ ##ID:004222##
+ mcset $l "Guyana" \
+ "Guyana" ;# <-- NOT TRANSLATED YET
+ ##ID:004223##
+ mcset $l "Haiti" \
+ "Haiti" ;# <-- NOT TRANSLATED YET
+ ##ID:004224##
+ mcset $l "Heard Island And Mcdonald Islands" \
+ "Heard Island And Mcdonald Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004225##
+ mcset $l "Holy See (Vatican City State)" \
+ "Holy See (Vatican City State)" ;# <-- NOT TRANSLATED YET
+ ##ID:004226##
+ mcset $l "Honduras" \
+ "Honduras" ;# <-- NOT TRANSLATED YET
+ ##ID:004227##
+ mcset $l "Hong Kong" \
+ "Hong Kong" ;# <-- NOT TRANSLATED YET
+ ##ID:004228##
+ mcset $l "Hungary" \
+ "Hungary" ;# <-- NOT TRANSLATED YET
+ ##ID:004229##
+ mcset $l "Iceland" \
+ "Iceland" ;# <-- NOT TRANSLATED YET
+ ##ID:004230##
+ mcset $l "India" \
+ "India" ;# <-- NOT TRANSLATED YET
+ ##ID:004231##
+ mcset $l "Indonesia" \
+ "Indonesia" ;# <-- NOT TRANSLATED YET
+ ##ID:004232##
+ mcset $l "Iran, Islamic Republic Of" \
+ "Iran, Islamic Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004233##
+ mcset $l "Iraq" \
+ "Iraq" ;# <-- NOT TRANSLATED YET
+ ##ID:004234##
+ mcset $l "Ireland" \
+ "Ireland" ;# <-- NOT TRANSLATED YET
+ ##ID:004235##
+ mcset $l "Isle Of Man" \
+ "Isle Of Man" ;# <-- NOT TRANSLATED YET
+ ##ID:004236##
+ mcset $l "Israel" \
+ "Israel" ;# <-- NOT TRANSLATED YET
+ ##ID:004237##
+ mcset $l "Italy" \
+ "Italy" ;# <-- NOT TRANSLATED YET
+ ##ID:004238##
+ mcset $l "Jamaica" \
+ "Jamaica" ;# <-- NOT TRANSLATED YET
+ ##ID:004239##
+ mcset $l "Japan" \
+ "Japan" ;# <-- NOT TRANSLATED YET
+ ##ID:004240##
+ mcset $l "Jersey" \
+ "Jersey" ;# <-- NOT TRANSLATED YET
+ ##ID:004241##
+ mcset $l "Jordan" \
+ "Jordan" ;# <-- NOT TRANSLATED YET
+ ##ID:004242##
+ mcset $l "Kazakhstan" \
+ "Kazakhstan" ;# <-- NOT TRANSLATED YET
+ ##ID:004243##
+ mcset $l "Kenya" \
+ "Kenya" ;# <-- NOT TRANSLATED YET
+ ##ID:004244##
+ mcset $l "Kiribati" \
+ "Kiribati" ;# <-- NOT TRANSLATED YET
+ ##ID:004245##
+ mcset $l "Korea, Democratic People'S Republic Of" \
+ "Korea, Democratic People'S Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004246##
+ mcset $l "Korea, Republic Of" \
+ "Korea, Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004247##
+ mcset $l "Kuwait" \
+ "Kuwait" ;# <-- NOT TRANSLATED YET
+ ##ID:004248##
+ mcset $l "Kyrgyzstan" \
+ "Kyrgyzstan" ;# <-- NOT TRANSLATED YET
+ ##ID:004249##
+ mcset $l "Lao People'S Democratic Republic" \
+ "Lao People'S Democratic Republic" ;# <-- NOT TRANSLATED YET
+ ##ID:004250##
+ mcset $l "Latvia" \
+ "Latvia" ;# <-- NOT TRANSLATED YET
+ ##ID:004251##
+ mcset $l "Lebanon" \
+ "Lebanon" ;# <-- NOT TRANSLATED YET
+ ##ID:004252##
+ mcset $l "Lesotho" \
+ "Lesotho" ;# <-- NOT TRANSLATED YET
+ ##ID:004253##
+ mcset $l "Liberia" \
+ "Liberia" ;# <-- NOT TRANSLATED YET
+ ##ID:004254##
+ mcset $l "Libyan Arab Jamahiriya" \
+ "Libyan Arab Jamahiriya" ;# <-- NOT TRANSLATED YET
+ ##ID:004255##
+ mcset $l "Liechtenstein" \
+ "Liechtenstein" ;# <-- NOT TRANSLATED YET
+ ##ID:004256##
+ mcset $l "Lithuania" \
+ "Lithuania" ;# <-- NOT TRANSLATED YET
+ ##ID:004257##
+ mcset $l "Luxembourg" \
+ "Luxembourg" ;# <-- NOT TRANSLATED YET
+ ##ID:004258##
+ mcset $l "Macao" \
+ "Macao" ;# <-- NOT TRANSLATED YET
+ ##ID:004259##
+ mcset $l "Macedonia, The Former Yugoslav Republic Of" \
+ "Macedonia, The Former Yugoslav Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004260##
+ mcset $l "Madagascar" \
+ "Madagascar" ;# <-- NOT TRANSLATED YET
+ ##ID:004261##
+ mcset $l "Malawi" \
+ "Malawi" ;# <-- NOT TRANSLATED YET
+ ##ID:004262##
+ mcset $l "Malaysia" \
+ "Malaysia" ;# <-- NOT TRANSLATED YET
+ ##ID:004263##
+ mcset $l "Maldives" \
+ "Maldives" ;# <-- NOT TRANSLATED YET
+ ##ID:004264##
+ mcset $l "Mali" \
+ "Mali" ;# <-- NOT TRANSLATED YET
+ ##ID:004265##
+ mcset $l "Malta" \
+ "Malta" ;# <-- NOT TRANSLATED YET
+ ##ID:004266##
+ mcset $l "Marshall Islands" \
+ "Marshall Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004267##
+ mcset $l "Martinique" \
+ "Martinique" ;# <-- NOT TRANSLATED YET
+ ##ID:004268##
+ mcset $l "Mauritania" \
+ "Mauritania" ;# <-- NOT TRANSLATED YET
+ ##ID:004269##
+ mcset $l "Mauritius" \
+ "Mauritius" ;# <-- NOT TRANSLATED YET
+ ##ID:004270##
+ mcset $l "Mayotte" \
+ "Mayotte" ;# <-- NOT TRANSLATED YET
+ ##ID:004271##
+ mcset $l "Mexico" \
+ "Mexico" ;# <-- NOT TRANSLATED YET
+ ##ID:004272##
+ mcset $l "Micronesia, Federated States Of" \
+ "Micronesia, Federated States Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004273##
+ mcset $l "Moldova, Republic Of" \
+ "Moldova, Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004274##
+ mcset $l "Monaco" \
+ "Monaco" ;# <-- NOT TRANSLATED YET
+ ##ID:004275##
+ mcset $l "Mongolia" \
+ "Mongolia" ;# <-- NOT TRANSLATED YET
+ ##ID:004276##
+ mcset $l "Montenegro" \
+ "Montenegro" ;# <-- NOT TRANSLATED YET
+ ##ID:004277##
+ mcset $l "Montserrat" \
+ "Montserrat" ;# <-- NOT TRANSLATED YET
+ ##ID:004278##
+ mcset $l "Morocco" \
+ "Morocco" ;# <-- NOT TRANSLATED YET
+ ##ID:004279##
+ mcset $l "Mozambique" \
+ "Mozambique" ;# <-- NOT TRANSLATED YET
+ ##ID:004280##
+ mcset $l "Myanmar" \
+ "Myanmar" ;# <-- NOT TRANSLATED YET
+ ##ID:004281##
+ mcset $l "Namibia" \
+ "Namibia" ;# <-- NOT TRANSLATED YET
+ ##ID:004282##
+ mcset $l "Nepal" \
+ "Nepal" ;# <-- NOT TRANSLATED YET
+ ##ID:004283##
+ mcset $l "Netherlands" \
+ "Netherlands" ;# <-- NOT TRANSLATED YET
+ ##ID:004284##
+ mcset $l "Netherlands Antilles" \
+ "Netherlands Antilles" ;# <-- NOT TRANSLATED YET
+ ##ID:004285##
+ mcset $l "New Caledonia" \
+ "New Caledonia" ;# <-- NOT TRANSLATED YET
+ ##ID:004286##
+ mcset $l "New Zealand" \
+ "New Zealand" ;# <-- NOT TRANSLATED YET
+ ##ID:004287##
+ mcset $l "Nicaragua" \
+ "Nicaragua" ;# <-- NOT TRANSLATED YET
+ ##ID:004288##
+ mcset $l "Niger" \
+ "Niger" ;# <-- NOT TRANSLATED YET
+ ##ID:004289##
+ mcset $l "Nigeria" \
+ "Nigeria" ;# <-- NOT TRANSLATED YET
+ ##ID:004290##
+ mcset $l "Niue" \
+ "Niue" ;# <-- NOT TRANSLATED YET
+ ##ID:004291##
+ mcset $l "Norfolk Island" \
+ "Norfolk Island" ;# <-- NOT TRANSLATED YET
+ ##ID:004292##
+ mcset $l "Northern Mariana Islands" \
+ "Northern Mariana Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004293##
+ mcset $l "Norway" \
+ "Norway" ;# <-- NOT TRANSLATED YET
+ ##ID:004294##
+ mcset $l "Oman" \
+ "Oman" ;# <-- NOT TRANSLATED YET
+ ##ID:004295##
+ mcset $l "Pakistan" \
+ "Pakistan" ;# <-- NOT TRANSLATED YET
+ ##ID:004296##
+ mcset $l "Palau" \
+ "Palau" ;# <-- NOT TRANSLATED YET
+ ##ID:004297##
+ mcset $l "Palestinian Territory, Occupied" \
+ "Palestinian Territory, Occupied" ;# <-- NOT TRANSLATED YET
+ ##ID:004298##
+ mcset $l "Panama" \
+ "Panama" ;# <-- NOT TRANSLATED YET
+ ##ID:004299##
+ mcset $l "Papua New Guinea" \
+ "Papua New Guinea" ;# <-- NOT TRANSLATED YET
+ ##ID:004300##
+ mcset $l "Paraguay" \
+ "Paraguay" ;# <-- NOT TRANSLATED YET
+ ##ID:004301##
+ mcset $l "Peru" \
+ "Peru" ;# <-- NOT TRANSLATED YET
+ ##ID:004302##
+ mcset $l "Philippines" \
+ "Philippines" ;# <-- NOT TRANSLATED YET
+ ##ID:004303##
+ mcset $l "Pitcairn" \
+ "Pitcairn" ;# <-- NOT TRANSLATED YET
+ ##ID:004304##
+ mcset $l "Poland" \
+ "Poland" ;# <-- NOT TRANSLATED YET
+ ##ID:004305##
+ mcset $l "Portugal" \
+ "Portugal" ;# <-- NOT TRANSLATED YET
+ ##ID:004306##
+ mcset $l "Puerto Rico" \
+ "Puerto Rico" ;# <-- NOT TRANSLATED YET
+ ##ID:004307##
+ mcset $l "Qatar" \
+ "Qatar" ;# <-- NOT TRANSLATED YET
+ ##ID:004308##
+ mcset $l "Réunion" \
+ "Réunion" ;# <-- NOT TRANSLATED YET
+ ##ID:004309##
+ mcset $l "Romania" \
+ "Romania" ;# <-- NOT TRANSLATED YET
+ ##ID:004310##
+ mcset $l "Russian Federation" \
+ "Russian Federation" ;# <-- NOT TRANSLATED YET
+ ##ID:004311##
+ mcset $l "Rwanda" \
+ "Rwanda" ;# <-- NOT TRANSLATED YET
+ ##ID:004312##
+ mcset $l "Saint Barthélemy" \
+ "Saint Barthélemy" ;# <-- NOT TRANSLATED YET
+ ##ID:004313##
+ mcset $l "Saint Helena, Ascension And Tristan Da Cunha" \
+ "Saint Helena, Ascension And Tristan Da Cunha" ;# <-- NOT TRANSLATED YET
+ ##ID:004314##
+ mcset $l "Saint Kitts And Nevis" \
+ "Saint Kitts And Nevis" ;# <-- NOT TRANSLATED YET
+ ##ID:004315##
+ mcset $l "Saint Lucia" \
+ "Saint Lucia" ;# <-- NOT TRANSLATED YET
+ ##ID:004316##
+ mcset $l "Saint Martin" \
+ "Saint Martin" ;# <-- NOT TRANSLATED YET
+ ##ID:004317##
+ mcset $l "Saint Pierre And Miquelon" \
+ "Saint Pierre And Miquelon" ;# <-- NOT TRANSLATED YET
+ ##ID:004318##
+ mcset $l "Saint Vincent And The Grenadines" \
+ "Saint Vincent And The Grenadines" ;# <-- NOT TRANSLATED YET
+ ##ID:004319##
+ mcset $l "Samoa" \
+ "Samoa" ;# <-- NOT TRANSLATED YET
+ ##ID:004320##
+ mcset $l "San Marino" \
+ "San Marino" ;# <-- NOT TRANSLATED YET
+ ##ID:004321##
+ mcset $l "Sao Tome And Principe" \
+ "Sao Tome And Principe" ;# <-- NOT TRANSLATED YET
+ ##ID:004322##
+ mcset $l "Saudi Arabia" \
+ "Saudi Arabia" ;# <-- NOT TRANSLATED YET
+ ##ID:004323##
+ mcset $l "Senegal" \
+ "Senegal" ;# <-- NOT TRANSLATED YET
+ ##ID:004324##
+ mcset $l "Serbia" \
+ "Serbia" ;# <-- NOT TRANSLATED YET
+ ##ID:004325##
+ mcset $l "Seychelles" \
+ "Seychelles" ;# <-- NOT TRANSLATED YET
+ ##ID:004326##
+ mcset $l "Sierra Leone" \
+ "Sierra Leone" ;# <-- NOT TRANSLATED YET
+ ##ID:004327##
+ mcset $l "Singapore" \
+ "Singapore" ;# <-- NOT TRANSLATED YET
+ ##ID:004328##
+ mcset $l "Slovakia" \
+ "Slovakia" ;# <-- NOT TRANSLATED YET
+ ##ID:004329##
+ mcset $l "Slovenia" \
+ "Slovenia" ;# <-- NOT TRANSLATED YET
+ ##ID:004330##
+ mcset $l "Solomon Islands" \
+ "Solomon Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004331##
+ mcset $l "Somalia" \
+ "Somalia" ;# <-- NOT TRANSLATED YET
+ ##ID:004332##
+ mcset $l "South Africa" \
+ "South Africa" ;# <-- NOT TRANSLATED YET
+ ##ID:004333##
+ mcset $l "South Georgia And The South Sandwich Islands" \
+ "South Georgia And The South Sandwich Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004334##
+ mcset $l "Spain" \
+ "Spain" ;# <-- NOT TRANSLATED YET
+ ##ID:004335##
+ mcset $l "Sri Lanka" \
+ "Sri Lanka" ;# <-- NOT TRANSLATED YET
+ ##ID:004336##
+ mcset $l "Sudan" \
+ "Sudan" ;# <-- NOT TRANSLATED YET
+ ##ID:004337##
+ mcset $l "Suriname" \
+ "Suriname" ;# <-- NOT TRANSLATED YET
+ ##ID:004338##
+ mcset $l "Svalbard And Jan Mayen" \
+ "Svalbard And Jan Mayen" ;# <-- NOT TRANSLATED YET
+ ##ID:004339##
+ mcset $l "Swaziland" \
+ "Swaziland" ;# <-- NOT TRANSLATED YET
+ ##ID:004340##
+ mcset $l "Sweden" \
+ "Sweden" ;# <-- NOT TRANSLATED YET
+ ##ID:004341##
+ mcset $l "Switzerland" \
+ "Switzerland" ;# <-- NOT TRANSLATED YET
+ ##ID:004342##
+ mcset $l "Syrian Arab Republic" \
+ "Syrian Arab Republic" ;# <-- NOT TRANSLATED YET
+ ##ID:004343##
+ mcset $l "Taiwan, Province Of China" \
+ "Taiwan, Province Of China" ;# <-- NOT TRANSLATED YET
+ ##ID:004344##
+ mcset $l "Tajikistan" \
+ "Tajikistan" ;# <-- NOT TRANSLATED YET
+ ##ID:004345##
+ mcset $l "Tanzania, United Republic Of" \
+ "Tanzania, United Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004346##
+ mcset $l "Thailand" \
+ "Thailand" ;# <-- NOT TRANSLATED YET
+ ##ID:004347##
+ mcset $l "Timor-Leste" \
+ "Timor-Leste" ;# <-- NOT TRANSLATED YET
+ ##ID:004348##
+ mcset $l "Togo" \
+ "Togo" ;# <-- NOT TRANSLATED YET
+ ##ID:004349##
+ mcset $l "Tokelau" \
+ "Tokelau" ;# <-- NOT TRANSLATED YET
+ ##ID:004350##
+ mcset $l "Trinidad And Tobago" \
+ "Trinidad And Tobago" ;# <-- NOT TRANSLATED YET
+ ##ID:004351##
+ mcset $l "Tunisia" \
+ "Tunisia" ;# <-- NOT TRANSLATED YET
+ ##ID:004352##
+ mcset $l "Turkey" \
+ "Turkey" ;# <-- NOT TRANSLATED YET
+ ##ID:004353##
+ mcset $l "Turkmenistan" \
+ "Turkmenistan" ;# <-- NOT TRANSLATED YET
+ ##ID:004354##
+ mcset $l "Turks And Caicos Islands" \
+ "Turks And Caicos Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004355##
+ mcset $l "Tuvalu" \
+ "Tuvalu" ;# <-- NOT TRANSLATED YET
+ ##ID:004356##
+ mcset $l "Uganda" \
+ "Uganda" ;# <-- NOT TRANSLATED YET
+ ##ID:004357##
+ mcset $l "Ukraine" \
+ "Ukraine" ;# <-- NOT TRANSLATED YET
+ ##ID:004358##
+ mcset $l "United Arab Emirates" \
+ "United Arab Emirates" ;# <-- NOT TRANSLATED YET
+ ##ID:004359##
+ mcset $l "United Kingdom" \
+ "United Kingdom" ;# <-- NOT TRANSLATED YET
+ ##ID:004360##
+ mcset $l "United States" \
+ "United States" ;# <-- NOT TRANSLATED YET
+ ##ID:004361##
+ mcset $l "United States Minor Outlying Islands" \
+ "United States Minor Outlying Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004362##
+ mcset $l "Uruguay" \
+ "Uruguay" ;# <-- NOT TRANSLATED YET
+ ##ID:004363##
+ mcset $l "Uzbekistan" \
+ "Uzbekistan" ;# <-- NOT TRANSLATED YET
+ ##ID:004364##
+ mcset $l "Vanuatu" \
+ "Vanuatu" ;# <-- NOT TRANSLATED YET
+ ##ID:004365##
+ mcset $l "Vatican City State" \
+ "Vatican City State" ;# <-- NOT TRANSLATED YET
+ ##ID:004366##
+ mcset $l "Venezuela, Bolivarian Republic Of" \
+ "Venezuela, Bolivarian Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004367##
+ mcset $l "Viet Nam" \
+ "Viet Nam" ;# <-- NOT TRANSLATED YET
+ ##ID:004368##
+ mcset $l "Virgin Islands, British" \
+ "Virgin Islands, British" ;# <-- NOT TRANSLATED YET
+ ##ID:004369##
+ mcset $l "Virgin Islands, U.S." \
+ "Virgin Islands, U.S." ;# <-- NOT TRANSLATED YET
+ ##ID:004370##
+ mcset $l "Wallis And Futuna" \
+ "Wallis And Futuna" ;# <-- NOT TRANSLATED YET
+ ##ID:004371##
+ mcset $l "Western Sahara" \
+ "Western Sahara" ;# <-- NOT TRANSLATED YET
+ ##ID:004372##
+ mcset $l "Yemen" \
+ "Yemen" ;# <-- NOT TRANSLATED YET
+ ##ID:004373##
+ mcset $l "Zambia" \
+ "Zambia" ;# <-- NOT TRANSLATED YET
+ ##ID:004374##
+ mcset $l "Zimbabwe" \
+ "Zimbabwe" ;# <-- NOT TRANSLATED YET
+}
+# lcd_hd44780.tcl
+# ==============================================================================
+namespace eval LcdHD44780 {
+ ##ID:004375##
+ mcset $l "LCD display" \
+ "LCD display" ;# <-- NOT TRANSLATED YET
+ ##ID:004376##
+ mcset $l "NOTE" \
+ "NOTE" ;# <-- NOT TRANSLATED YET
+ ##ID:004377##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:004378##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:004379##
+ mcset $l "Set font" \
+ "Set font" ;# <-- NOT TRANSLATED YET
+ ##ID:004380##
+ mcset $l "ROM code A00" \
+ "ROM code A00" ;# <-- NOT TRANSLATED YET
+ ##ID:004381##
+ mcset $l "ROM code A02" \
+ "ROM code A02" ;# <-- NOT TRANSLATED YET
+ ##ID:004382##
+ mcset $l "Set character size" \
+ "Set character size" ;# <-- NOT TRANSLATED YET
+ ##ID:004383##
+ mcset $l "hd44780" \
+ "hd44780" ;# <-- NOT TRANSLATED YET
+ ##ID:004384##
+ mcset $l "Disable delays" \
+ "Disable delays" ;# <-- NOT TRANSLATED YET
+ ##ID:004385##
+ mcset $l "Ignore errors" \
+ "Ignore errors" ;# <-- NOT TRANSLATED YET
+ ##ID:004386##
+ mcset $l "Show HD44780 log" \
+ "Show HD44780 log" ;# <-- NOT TRANSLATED YET
+ ##ID:004387##
+ mcset $l "Display the log of events which are currently happening in the simulated HD44780 chip" \
+ "Display the log of events which are currently happening in the simulated HD44780 chip" ;# <-- NOT TRANSLATED YET
+ ##ID:004388##
+ mcset $l "Show CGROM" \
+ "Show CGROM" ;# <-- NOT TRANSLATED YET
+ ##ID:004389##
+ mcset $l "Display content of HD44780 Character Generator ROM" \
+ "Display content of HD44780 Character Generator ROM" ;# <-- NOT TRANSLATED YET
+ ##ID:004390##
+ mcset $l "Show CGRAM" \
+ "Show CGRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004391##
+ mcset $l "Display content of HD44780 Character Generator RAM" \
+ "Display content of HD44780 Character Generator RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004392##
+ mcset $l "Show DDRAM" \
+ "Show DDRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004393##
+ mcset $l "Display content of HD44780 Display data RAM" \
+ "Display content of HD44780 Display data RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004394##
+ mcset $l "Reset HD44780" \
+ "Reset HD44780" ;# <-- NOT TRANSLATED YET
+ ##ID:004395##
+ mcset $l "Reinitialize the simulated HD44780, but do not affect DDRAM and CGRAM" \
+ "Reinitialize the simulated HD44780, but do not affect DDRAM and CGRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004396##
+ mcset $l "Clear DDRAM & CGRAM" \
+ "Clear DDRAM & CGRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004397##
+ mcset $l "Clear the entire Display Data RAM and Character Generator RAM" \
+ "Clear the entire Display Data RAM and Character Generator RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004398##
+ mcset $l "Show help" \
+ "Show help" ;# <-- NOT TRANSLATED YET
+ ##ID:004399##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:004400##
+ mcset $l "Save configuration" \
+ "Save configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:004401##
+ mcset $l "Save configuration into a file" \
+ "Save configuration into a file" ;# <-- NOT TRANSLATED YET
+ ##ID:004402##
+ mcset $l "Load configuration" \
+ "Load configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:004403##
+ mcset $l "Load configuration from a file" \
+ "Load configuration from a file" ;# <-- NOT TRANSLATED YET
+ ##ID:004404##
+ mcset $l "Cursor blinking" \
+ "Cursor blinking" ;# <-- NOT TRANSLATED YET
+ ##ID:004405##
+ mcset $l "Accompanies display shift" \
+ "Accompanies display shift" ;# <-- NOT TRANSLATED YET
+ ##ID:004406##
+ mcset $l "Display ON/OFF" \
+ "Display ON/OFF" ;# <-- NOT TRANSLATED YET
+ ##ID:004407##
+ mcset $l "Cursor ON/OFF" \
+ "Cursor ON/OFF" ;# <-- NOT TRANSLATED YET
+ ##ID:004408##
+ mcset $l "2 lines display / 1 line display" \
+ "2 lines display / 1 line display" ;# <-- NOT TRANSLATED YET
+ ##ID:004409##
+ mcset $l "5 × 10 dots / 5 × 8 dots" \
+ "5 × 10 dots / 5 × 8 dots" ;# <-- NOT TRANSLATED YET
+ ##ID:004410##
+ mcset $l "Increment AC / Decrement AC" \
+ "Increment AC / Decrement AC" ;# <-- NOT TRANSLATED YET
+ ##ID:004411##
+ mcset $l "8-bit data transfer / 4-bit data transfer" \
+ "8-bit data transfer / 4-bit data transfer" ;# <-- NOT TRANSLATED YET
+ ##ID:004412##
+ mcset $l "One More Nibble to transfer / data transfer complete" \
+ "One More Nibble to transfer / data transfer complete" ;# <-- NOT TRANSLATED YET
+ ##ID:004413##
+ mcset $l "Internally operating / Instructions acceptable" \
+ "Internally operating / Instructions acceptable" ;# <-- NOT TRANSLATED YET
+ ##ID:004414##
+ mcset $l "Show or hide the bottom part" \
+ "Show or hide the bottom part" ;# <-- NOT TRANSLATED YET
+ ##ID:004415##
+ mcset $l "Show or hide the right part" \
+ "Show or hide the right part" ;# <-- NOT TRANSLATED YET
+ ##ID:004416##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:004417##
+ mcset $l "Configure" \
+ "Configure" ;# <-- NOT TRANSLATED YET
+ ##ID:004418##
+ mcset $l "Shift:" \
+ "Shift:" ;# <-- NOT TRANSLATED YET
+ ##ID:004419##
+ mcset $l "Close" \
+ "Close" ;# <-- NOT TRANSLATED YET
+ ##ID:004420##
+ mcset $l "Cursor: " \
+ "Cursor: " ;# <-- NOT TRANSLATED YET
+ ##ID:004421##
+ mcset $l "HD44780 Character Generator ROM (ROM Code: A0%d) - MCU 8051 IDE" \
+ "HD44780 Character Generator ROM (ROM Code: A0%d) - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:004422##
+ mcset $l "Clear log" \
+ "Clear log" ;# <-- NOT TRANSLATED YET
+ ##ID:004423##
+ mcset $l "HD44780 log - MCU 8051 IDE" \
+ "HD44780 log - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:004424##
+ mcset $l "\[INFO\] " \
+ "\[INFO\] " ;# <-- NOT TRANSLATED YET
+ ##ID:004425##
+ mcset $l "\[WARNING\] " \
+ "\[WARNING\] " ;# <-- NOT TRANSLATED YET
+ ##ID:004426##
+ mcset $l "\[ERROR\] " \
+ "\[ERROR\] " ;# <-- NOT TRANSLATED YET
+ ##ID:004427##
+ mcset $l "HD44780 ERROR" \
+ "HD44780 ERROR" ;# <-- NOT TRANSLATED YET
+ ##ID:004428##
+ mcset $l "Received instruction: %s" \
+ "Received instruction: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:004429##
+ mcset $l "Clear Display" \
+ "Clear Display" ;# <-- NOT TRANSLATED YET
+ ##ID:004430##
+ mcset $l "Return Home" \
+ "Return Home" ;# <-- NOT TRANSLATED YET
+ ##ID:004431##
+ mcset $l "Entry Mode Set" \
+ "Entry Mode Set" ;# <-- NOT TRANSLATED YET
+ ##ID:004432##
+ mcset $l "Display On Off Control" \
+ "Display On Off Control" ;# <-- NOT TRANSLATED YET
+ ##ID:004433##
+ mcset $l "Cursor Or Display Shift" \
+ "Cursor Or Display Shift" ;# <-- NOT TRANSLATED YET
+ ##ID:004434##
+ mcset $l "Function Set" \
+ "Function Set" ;# <-- NOT TRANSLATED YET
+ ##ID:004435##
+ mcset $l "Set CGRAM Address" \
+ "Set CGRAM Address" ;# <-- NOT TRANSLATED YET
+ ##ID:004436##
+ mcset $l "Set DDRAM Address" \
+ "Set DDRAM Address" ;# <-- NOT TRANSLATED YET
+ ##ID:004437##
+ mcset $l "Read Busy Flag & Address" \
+ "Read Busy Flag & Address" ;# <-- NOT TRANSLATED YET
+ ##ID:004438##
+ mcset $l "Write Data To CG Or DDRAM" \
+ "Write Data To CG Or DDRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004439##
+ mcset $l "Neither \"Set DDRAM Address\" nor \"Set CGRAM Address\" instruction was issued prior to the write instruction" \
+ "Neither \"Set DDRAM Address\" nor \"Set CGRAM Address\" instruction was issued prior to the write instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:004440##
+ mcset $l "Read Data From CG Or DDRAM" \
+ "Read Data From CG Or DDRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004441##
+ mcset $l "Neither \"Set DDRAM Address\" nor \"Set CGRAM Address\" instruction was issued prior to the read instruction" \
+ "Neither \"Set DDRAM Address\" nor \"Set CGRAM Address\" instruction was issued prior to the read instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:004442##
+ mcset $l "Controller is busy, unable to execute requested instruction." \
+ "Controller is busy, unable to execute requested instruction." ;# <-- NOT TRANSLATED YET
+ ##ID:004443##
+ mcset $l "Commencing execution, this action will take %d micro-seonds to comply." \
+ "Commencing execution, this action will take %d micro-seonds to comply." ;# <-- NOT TRANSLATED YET
+ ##ID:004444##
+ mcset $l "Operation finished" \
+ "Operation finished" ;# <-- NOT TRANSLATED YET
+ ##ID:004445##
+ mcset $l "Skipping delay" \
+ "Skipping delay" ;# <-- NOT TRANSLATED YET
+ ##ID:004446##
+ mcset $l "Device reset" \
+ "Device reset" ;# <-- NOT TRANSLATED YET
+ ##ID:004447##
+ mcset $l "DDRAM address is too high: %d" \
+ "DDRAM address is too high: %d" ;# <-- NOT TRANSLATED YET
+ ##ID:004448##
+ mcset $l "CGRAM address is too high: %d" \
+ "CGRAM address is too high: %d" ;# <-- NOT TRANSLATED YET
+ ##ID:004449##
+ mcset $l "Value is too high: 0x%X" \
+ "Value is too high: 0x%X" ;# <-- NOT TRANSLATED YET
+ ##ID:004450##
+ mcset $l "Input is corrupted: %s" \
+ "Input is corrupted: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:004451##
+ mcset $l "Invalid instruction: %2Xh" \
+ "Invalid instruction: %2Xh" ;# <-- NOT TRANSLATED YET
+ ##ID:004452##
+ mcset $l "Received an invalid input on signal %s" \
+ "Received an invalid input on signal %s" ;# <-- NOT TRANSLATED YET
+ ##ID:004453##
+ mcset $l "LCD display controled by HD44780 driver\n\n" \
+ "LCD display controled by HD44780 driver\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:004454##
+ mcset $l "Starting the HD44780 boot-up sequence." \
+ "Starting the HD44780 boot-up sequence." ;# <-- NOT TRANSLATED YET
+ ##ID:004455##
+ mcset $l "Receiving the Most Significant Nibble (%02Xh)" \
+ "Receiving the Most Significant Nibble (%02Xh)" ;# <-- NOT TRANSLATED YET
+ ##ID:004456##
+ mcset $l "Receiving the Less Significant Nibble (%02Xh)" \
+ "Receiving the Less Significant Nibble (%02Xh)" ;# <-- NOT TRANSLATED YET
+}
diff --git a/translations/tool.tcl b/translations/tool.tcl
new file mode 100755
index 0000000..668855f
--- /dev/null
+++ b/translations/tool.tcl
@@ -0,0 +1,697 @@
+#! /usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# Copyright (C) 2011 by Martin Ošmera #
+# martin.osmera@gmail.com #
+# #
+# This program is free software; you can redistribute it and#or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation; either version 2 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the #
+# Free Software Foundation, Inc., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+#
+# This is the translation manipulation tool written for the MCU 8051 IDE
+# project, purpose of this tool is to simplify maintenance of the
+# translation files. Since the template.txt might get updated every now and
+# then, we need to keep the translation files updated.
+#
+# This file is intended to be used as a stand-alone executable
+#
+# Command line options:
+# -t <file>
+# Update a translation template file (e.g. template.txt).
+# -m <file>
+# Update the given translation file (<file>) according to the
+# template.txt file located in the same directory as this script.
+# -h, --help, --usage
+# Print the help message.
+# --------------------------------------------------------------------------
+
+namespace eval TranslationManipulationTool {
+ variable orig_dir ;# String: Directory from which the script was executed
+ variable tmp_dir ;# String: Temporary directory, e.g. "/tmp"
+ variable error_code ;# Int: Auxiliary variable indicating error
+
+ ## Initialize the tool, set some variables, etc.
+ # @return void
+ proc init {} {
+ variable orig_dir ;# String: Directory from which the script was executed
+ variable tmp_dir ;# String: Temporary directory, e.g. "/tmp"
+ variable error_code ;# Int: Auxiliary variable indicating error
+
+ set error_code 0
+ set orig_dir [pwd]
+ set tmp_dir {/tmp}
+ if {[string first {Windows} ${::tcl_platform(os)}] != -1} {
+ set tmp_dir ${::env(TEMP)}
+ }
+
+ if {$tmp_dir == {}} {
+ puts stderr "ERROR: Unable to determinate location of the temp directory."
+ exit 1
+ }
+
+ cd [file dirname $::argv0]
+ }
+
+ ## Update translation template file
+ #
+ # The update does these things:
+ # - add IDs to translation strings which does not have any yet,
+ # - remove duplicity translation strings,
+ # - remove translation strings which clearly cannot be translated, e.g. "--- %s".
+ #
+ # @param String filename - Name of the subject for the update
+ # @return void
+ proc update_template {filename} {
+ variable orig_dir ;# String: Directory from which the script was executed
+ variable tmp_dir ;# String: Temporary directory, e.g. "/tmp"
+ variable error_code ;# Int: Auxiliary variable indicating error
+
+ # Inform user about what we are doing
+ puts ""
+ puts " * Updating the template file: $filename"
+
+ # Open the translation template file (for reading)
+ if {[catch {
+ set f [file join $orig_dir $filename]
+ set template_file [open $f {r}]
+ }]} then {
+ puts stderr "ERROR: Unable to open $f file, exiting."
+ exit 1
+ }
+ # Open a temporary file (for writing)
+ if {[catch {
+ set f [file join $tmp_dir "mcu8051ide_template_txt.tmp"]
+ set template_file_tmp [open $f {w} 0644]
+ }]} then {
+ catch {
+ close $template_file
+ }
+ puts stderr "ERROR: Unable to open mcu8051ide_template_txt.tmp file, exiting."
+ exit 1
+ }
+
+ # Determinate the highest value of translation string ID
+ set highest_id 0
+ while {![eof $template_file]} {
+ set line [gets $template_file]
+
+ if {[regexp {^\s*##ID:\d{6}##\s*$} $line]} {
+ regexp {\d{6}} $line id
+ set id [string trimleft $id 0]
+ if {![string length $id]} {
+ set id 0
+ }
+ if {$id > $highest_id} {
+ set highest_id $id
+ }
+ }
+ }
+ # Increment the highest ID by 10 in order to make less probable
+ #+ that we actually reuse an ID.
+ if {$highest_id} {
+ incr highest_id 10
+ }
+
+ # Update the template file, the file itself will remain unchanged,
+ #+ we write results to the previously created/opened temporary file
+ seek $template_file 0 ;# Return at the beginning of the file
+ set line {} ;# String: Line read from the file
+ set prev_line {} ;# String: Line previously read from the file
+ array set tr_str_in_ns {} ;# Array of Lists: Translation strings in a namespace
+ set current_namespace {} ;# String: Current namespace
+ set transl_count 0 ;# Int: Number of translation strings found in the template
+ set rem_transl_count 0 ;# Int: Number of removed translation strings
+ set add_ids_count 0 ;# Int: Number of added IDs
+ while {![eof $template_file]} {
+ set line_raw [gets $template_file]
+
+ # Skip empty lines, or lines containing only white space
+ if {[regexp {^\s*$} $line_raw]} {
+ continue
+ }
+
+ set prev_line $line
+ set line $line_raw
+
+ # Detect white space
+ if {[regexp {namespace\s+eval\s+[^\{]+} $line ns_name]} {
+ regsub {namespace\s+eval\s+} $ns_name {} ns_name
+ regsub {\s*$} $ns_name {} ns_name
+ set current_namespace $ns_name
+ }
+
+ # Make the array with translation strings in a namespace aware of the current namespace
+ if {[lsearch -ascii -exact [array names tr_str_in_ns] $current_namespace] == -1} {
+ set tr_str_in_ns($current_namespace) [list]
+ }
+
+ # Attempt to extract the string for translation (original/source string)
+ if {[regexp {^\s*mcset\s+\$l\s+} $line]} {
+ set idx [string first {mcset} $line]
+ } else {
+ set idx -1
+ }
+ set trans_str $line
+ regsub -all {^\s*mcset\s+\$l\s*} $trans_str {} trans_str ;# Remove " mcset $l "
+ regsub -all {\s*\\\s*$} $trans_str {} trans_str ;# Remove trailing backslash
+ set trans_str_orig $trans_str
+ regsub -all {\{} $trans_str "\\\{" trans_str
+ regsub -all {\}} $trans_str "\\\}" trans_str
+ regsub -all {\"} $trans_str "\\\"" trans_str
+ if {$idx != -1} {
+ # Check for possibly duplicity, this condition is not allowed and it has to fixed
+ if {[lsearch -ascii -exact $tr_str_in_ns($current_namespace) $trans_str] != -1} {
+ puts "Removing duplicity: $trans_str_orig from namespace $current_namespace"
+ incr rem_transl_count
+ # Remove the next line as well
+ if {![eof $template_file]} {
+ gets $template_file
+ }
+ continue
+ }
+
+ # Check for nonsense string for translation, e.g. "--- %s ---"
+ if {![regexp {\w} $trans_str]} {
+ puts "Removing nonsense: $trans_str_orig from namespace $current_namespace"
+ incr rem_transl_count
+ # Remove the next line as well
+ if {![eof $template_file]} {
+ gets $template_file
+ }
+ continue
+ }
+
+ # Remember this translation in order to be able to detect possible duplicities later
+ lappend tr_str_in_ns($current_namespace) $trans_str
+ incr transl_count
+
+ # Generate and add a new ID if there is none yet
+ if {![regexp {^\s*##ID:\d{6}##\s*$} $prev_line]} {
+ incr add_ids_count
+ puts $template_file_tmp [format "%s##ID:%06d##" [string repeat { } $idx] [incr highest_id]]
+ } else {
+ puts $template_file_tmp $prev_line
+ }
+ }
+
+ # ID are handled separately, so we don't want them printed here
+ if {![regexp {^\s*##ID:\d{6}##\s*$} $line]} {
+ puts $template_file_tmp $line
+ }
+ }
+ array unset tr_str_in_ns
+
+ # Inform user about results
+ puts ""
+ puts "** Translation template updated"
+ puts " * Current number of translation strings: $transl_count"
+ puts " * Number of removed translation strings: $rem_transl_count"
+ puts " * Number of added translation IDs: $add_ids_count"
+
+ # Close all opened files
+ if {[catch {
+ close $template_file
+ }]} then {
+ puts stderr "ERROR: Unable to close the template file."
+ set error_code 1
+ }
+ if {[catch {
+ close $template_file_tmp
+ }]} then {
+ puts stderr "ERROR: Unable to close the template tmp file."
+ set error_code 1
+ }
+ if {$error_code} {
+ exit $error_code
+ }
+
+ # Move, copy, and/or remove files
+ set s [file join $tmp_dir "mcu8051ide_template_txt.tmp"]
+ set t "template.txt"
+ catch {
+ file rename -force $t "${t}~"
+ }
+ if {[catch {
+ file copy -force $s $t
+ }]} then {
+ puts stderr "ERROR: Unable to copy $s --> $t."
+ exit 1
+ }
+ catch {
+ file delete -force $s
+ }
+ }
+
+ ## Update translation file (a .msg file)
+ #
+ # The update does these things:
+ # -
+ #
+ # @param String filename - Name of the subject for the update
+ # @return void
+ proc update_msg_file {filename} {
+ variable orig_dir ;# String: Directory from which the script was executed
+ variable tmp_dir ;# String: Temporary directory, e.g. "/tmp"
+ variable error_code ;# Int: Auxiliary variable indicating error
+
+ # Local variables, all of them are Int: number of -
+ set missing_id_count 0 ;# - translation strings without ID
+ set not_trans_count 0 ;# - not translated strings
+ set trans_count 0 ;# - translated strings
+ set updated_count 0 ;# - updated translation strings
+ set found_in_src 0 ;# - translation strings found in the translation file
+ set found_in_tmpl 0 ;# - translation strings found in the template file
+ set added_count 0 ;# - translation strings copied from the translation file to the translation file
+ set id_dupl_count 0 ;# - duplicities in translation string ID
+
+ # Inform user about what we are doing
+ puts ""
+ puts "* Updating translation file: $filename"
+
+ if {$filename == {}} {
+ puts stderr "No file name given."
+ return
+ }
+ if {[catch {
+ set f [file join $orig_dir $filename]
+ set source_file [open $f {r}]
+ }]} then {
+ puts stderr "ERROR: Unable to open $f file, exiting."
+ exit 1
+ }
+ if {[catch {
+ set f [file join . "template.txt"]
+ set template_file [open $f {r}]
+ }]} then {
+ catch {
+ close $source_file
+ }
+ puts stderr "ERROR: Unable to open $f file, exiting."
+ exit 1
+ }
+ if {[catch {
+ set f [file tail $filename]
+ set f [file join $tmp_dir "${f}.tmp"]
+ set target_file [open $f {w} 0644]
+ }]} then {
+ catch {
+ close $source_file
+ }
+ catch {
+ close $template_file
+ }
+ puts stderr "ERROR: Unable to open $f file, exiting."
+ exit 1
+ }
+
+ array set trans_strs_by_id {}
+
+ # Copy commets at the begining of the source file to the target file,
+ #+ and load all translations into an array
+ set header 1
+ while {![eof $source_file]} {
+ set line [gets $source_file]
+
+ # Copy only continuous block of comments at the beginning of the file
+ if {$header && [regexp {^\s*#} $line] && ![regexp {^\s*##ID:\d{6}##\s*$} $line]} {
+ puts $target_file $line
+ continue
+ }
+ if {$header} {
+ set header 0
+ }
+
+ # Detect translation string ID
+ if {[regexp {^\s*##ID:\d{6}##\s*$} $line]} {
+ regexp {\d{6}} $line id
+
+ # Get original string, the string for translation
+ set trans_str_org [get_trans_str_org $source_file]
+ if {$trans_str_org == {}} {
+ break ;# We can still partially recover from here
+ }
+ set trans_str_org_raw [lindex $trans_str_org 1]
+ set trans_str_org [lindex $trans_str_org 0]
+
+ # Get translated string
+ set trans_str_trn [get_trans_str_trn $source_file]
+ if {$trans_str_trn == {}} {
+ break ;# We can still partially recover from here
+ }
+ set update_flag [lindex $trans_str_trn 2]
+ set trans_str_trn_raw [lindex $trans_str_trn 1]
+ set trans_str_trn [lindex $trans_str_trn 0]
+
+ # Check whether strings {} have the same length
+ if {
+ [string index [lindex $trans_str_org 0] 1] == "\{"
+ &&
+ [string length $trans_str_trn] != [string length $trans_str_org]
+ } then {
+ puts stderr "Warning: Translation probably violates the translation rules: ``$trans_str_org_raw'' --> ``$trans_str_trn_raw''"
+ }
+
+ # Detect, and remove, strings with duplicit IDs
+ if {[lsearch -ascii -exact [array names trans_strs_by_id] $id] != -1} {
+ puts stderr "Warning: Duplicit ID found: $id, ignoring!"
+ incr id_dupl_count
+ } else {
+ set trans_strs_by_id($id) [list $trans_str_org $trans_str_trn $update_flag]
+ incr found_in_src
+ }
+ }
+
+ # The mcset command should have been already handled when ID was detected
+ if {[regexp {^\s*mcset\s+\$l\s+} $line]} {
+ set idx [string first {mcset} $line]
+ } else {
+ set idx -1
+ }
+ if {$idx != -1} {
+ regsub -all {^\s*mcset\s+\$l\s*} $line {} line ;# Remove " mcset $l "
+ regsub -all {\s*\\\s*$} $line {} line ;# Remove trailing backslash
+ puts stderr "Warning: Missing translation string ID: ``$line'', removing!"
+ }
+ }
+ # We don't need the source file opened for reading any more
+ catch {
+ close $source_file
+ }
+
+ # Copy the rest (not commets at the begining of the file) from the
+ #+ template file to the target file, and update it from the
+ #+ trans_strs_by_id array which was extracted from the source file
+ set header 1
+ while {![eof $template_file]} {
+ set line [gets $template_file]
+
+ # Copy commets at the begining of the template file
+ if {$header && [regexp {^\s*#} $line] && ![regexp {^\s*##ID:\d{6}##\s*$} $line]} {
+ continue
+ }
+ if {$header} {
+ set header 0
+ }
+
+ # Detect translation string ID
+ if {[regexp {^\s*##ID:\d{6}##\s*$} $line]} {
+ regexp {\d{6}} $line id
+
+ # Get original string, the string for translation
+ set trans_str_org [get_trans_str_org $template_file]
+ if {$trans_str_org == {}} {
+ exit 1 ;# It would make no sense to continue from here
+ }
+ set mcset_idx [lindex $trans_str_org 2]
+ set trans_str_org_raw [lindex $trans_str_org 1]
+ set trans_str_org [lindex $trans_str_org 0]
+
+ # Get translated string
+ set trans_str_trn [get_trans_str_trn $template_file]
+ if {$trans_str_trn == {}} {
+ exit 1 ;# It would make no sense to continue from here
+ }
+ set trans_str_trn_raw [lindex $trans_str_trn 1]
+ set trans_str_trn [lindex $trans_str_trn 0]
+
+ # Regenerate the mcset command along with the string for translation
+ set original_string [string repeat { } $mcset_idx]
+ append original_string {mcset $l } $trans_str_org " \\"
+ regsub -all {\\\{} $original_string "\{" original_string
+ regsub -all {\\\}} $original_string "\}" original_string
+ regsub -all {\\\"} $original_string "\"" original_string
+
+ # Regenerate new translated string
+ set translation [string repeat { } [expr {$mcset_idx + 9}]]
+ if {[lsearch -ascii -exact [array names trans_strs_by_id] $id] == -1} {
+ # The string was not even found in the given translation file
+ append translation $trans_str_trn
+ regsub -all {\\\{} $translation "\{" translation
+ regsub -all {\\\}} $translation "\}" translation
+ regsub -all {\\\"} $translation "\"" translation
+ } else {
+ # The string was found in the translation file
+ append translation [lindex $trans_strs_by_id($id) 1]
+ regsub -all {\\\{} $translation "\{" translation
+ regsub -all {\\\}} $translation "\}" translation
+ regsub -all {\\\"} $translation "\"" translation
+
+ # But, it has not been translated (yet)
+ if {$trans_str_trn == [lindex $trans_strs_by_id($id) 1]} {
+ append translation " ;# <-- NOT TRANSLATED YET"
+ incr not_trans_count
+ } else {
+ incr trans_count
+ }
+
+ # If the source string (string for translation) in the template differs from
+ # the same string in the given translation file then add " ;# <-- UPDATE?"
+ # comment there.
+ if {$trans_str_org != [lindex $trans_strs_by_id($id) 0]} {
+ set foo [lindex $trans_strs_by_id($id) 0]
+ regsub -all {\\\{} $foo "\{" foo
+ regsub -all {\\\}} $foo "\}" foo
+ regsub -all {\\\"} $foo "\"" foo
+ puts "Source strings does not match, translation might need an update: ``$trans_str_org_raw'' --> ``$foo''"
+ append translation " ;# <-- UPDATE?"
+ incr updated_count
+ } elseif {[lindex $trans_strs_by_id($id) 2]} {
+ append translation " ;# <-- UPDATE?"
+ }
+ }
+
+ # Write results to the temporary file
+ puts $target_file $line ;# <-- #ID:dddddd##
+ puts $target_file $original_string ;# <-- mcset $l "original string"
+ puts $target_file $translation ;# <-- "translated string"
+
+ incr found_in_tmpl
+ continue
+ }
+
+ # Copy the rest
+ puts $target_file $line
+ }
+ array unset trans_strs_by_id {}
+
+ set added_count [expr {$found_in_tmpl - $found_in_src}]
+
+ # Inform user about results
+ puts ""
+ puts "** File: $filename updated"
+ puts " * Number of translations without ID: $missing_id_count"
+ puts " * Number of ID duplicities: $id_dupl_count"
+ puts " * Translated strings: $trans_count"
+ puts " * Not translated strings: $not_trans_count"
+ puts " * Number of translation which might need to be updated: $updated_count"
+ puts " * Number of strings added for translations: $added_count"
+
+ # Close all opened files
+ if {[catch {
+ close $template_file
+ }]} then {
+ puts stderr "ERROR: Unable to close the template file."
+ set error_code 1
+ }
+ if {[catch {
+ close $target_file
+ }]} then {
+ puts stderr "ERROR: Unable to close the target file."
+ set error_code 1
+ }
+ if {$error_code} {
+ exit $error_code
+ }
+
+ # Move, copy, and/or remove files
+ set s [file tail $filename]
+ set s [file join $tmp_dir "${s}.tmp"]
+ set t [file join $orig_dir $filename]
+ catch {
+ file rename -force $t "${t}~"
+ }
+ if {[catch {
+ file copy -force $s $t
+ }]} then {
+ puts stderr "ERROR: Unable to copy $s --> $t."
+ exit 1
+ }
+ catch {
+ file delete -force $s
+ }
+ }
+
+ ## Attempt to extract string for translation from the given file
+ # @param ChannelID source_file - File descriptor returned by "open"
+ # @return List:
+ # - {escaped_string raw_string index_of_mcset} <-- In case of success
+ # - {} <-- In case of failure
+ proc get_trans_str_org {source_file} {
+ if {[eof $source_file]} {
+ puts stderr "Warning: Unexpected end of file."
+ return {}
+ }
+ set trans_str_org [gets $source_file]
+ if {[regexp {^\s*mcset\s+\$l\s+} $trans_str_org]} {
+ set idx [string first {mcset} $trans_str_org]
+ } else {
+ set idx -1
+ }
+ if {$idx == -1} {
+ puts stderr "ERROR: Expected ``mcset $l'' at the beginnig of the line!"
+ return {}
+ }
+ regsub -all {^\s*mcset\s+\$l\s*} $trans_str_org {} trans_str_org ;# Remove " mcset $l "
+ regsub -all {\s*\\\s*$} $trans_str_org {} trans_str_org ;# Remove trailing backslash
+ set trans_str_org_raw $trans_str_org
+ regsub -all {\{} $trans_str_org "\\\{" trans_str_org
+ regsub -all {\}} $trans_str_org "\\\}" trans_str_org
+ regsub -all {\"} $trans_str_org "\\\"" trans_str_org
+
+ return [list $trans_str_org $trans_str_org_raw $idx]
+ }
+
+ ## Attempt to extract translated string from the given file
+ # @param ChannelID source_file - File descriptor returned by "open"
+ # @return List:
+ # - {escaped_string raw_string update_flag} <-- In case of success
+ # - {} <-- In case of failure
+ # @note
+ # update_flag == 1 means that there was ``;# <-- UPDATE?'' on the line,
+ # it's important because that comment should be preserved
+ proc get_trans_str_trn {source_file} {
+ if {[eof $source_file]} {
+ puts stderr "Warning: Unexpected end of file."
+ return {}
+ }
+ set trans_str_trn [gets $source_file]
+ if {[regexp ";# <-- UPDATE\?" $trans_str_trn]} {
+ set update_flag 1
+ } else {
+ set update_flag 0
+ }
+ regsub -all ";#.*$" $trans_str_trn {} trans_str_trn ;# Remove commet
+ regsub -all {\s*$} $trans_str_trn {} trans_str_trn ;# Remove trailing white space
+ regsub -all {^\s*} $trans_str_trn {} trans_str_trn ;# Remove leading white space
+ set trans_str_trn_raw $trans_str_trn
+ regsub -all {\{} $trans_str_trn "\\\{" trans_str_trn
+ regsub -all {\}} $trans_str_trn "\\\}" trans_str_trn
+ regsub -all {\"} $trans_str_trn "\\\"" trans_str_trn
+
+ return [list $trans_str_trn $trans_str_trn_raw $update_flag]
+ }
+
+ ## Print some information about what this tool is, and what's the license, etc.
+ # @return void
+ proc print_basic_info {} {
+ puts "Translation manipulation tool written for MCU 8051 IDE."
+ puts ""
+ puts "This software is licensed under GNU GPLv2 and comes with no warranty, "
+ puts "please report any bugs you encounter to the author of the script:"
+ puts "<mailto:martin.osmera@gmail.com>."
+ puts ""
+ }
+
+ ## Print help message to inform the user how to use this tool
+ # @return void
+ proc print_help {} {
+ print_basic_info
+ puts "Options:"
+ puts " -t <file>"
+ puts " Update a translation template file (e.g. template.txt)."
+ puts ""
+ puts " -m <file>"
+ puts " Update the given translation file (<file>) according to the"
+ puts " template.txt file located in the same directory as this script."
+ puts ""
+ puts " -h, --help, --usage"
+ puts " Print this message."
+ puts ""
+ }
+
+ ## Entry point to the tool functions
+ # @return void
+ proc main {} {
+ # If no CLI arguments were provided, print the help message
+ if {!$::argc} {
+ print_help
+ return 1
+ }
+
+ # Initialize the tool
+ TranslationManipulationTool::init
+
+ # List: Operations to execute
+ set command_list [list]
+
+ # Iterate over provided CLI arguments list and process it
+ for {set i 0} {$i < $::argc} {incr i} {
+ set arg [lindex $::argv $i]
+ switch -exact -- $arg {
+ {-h} { ;# Print the help message
+ print_help
+ return 0
+ }
+ {--help} { ;# Print the help message
+ print_help
+ return 0
+ }
+ {--usage} { ;# Print the help message
+ print_help
+ return 0
+ }
+ {-t} { ;# Update template file
+ set filename [lindex $::argv [incr i]]
+ if {![string length $filename]} {
+ puts stderr "Argument expected after the $arg option."
+ exit 1
+ }
+ lappend command_list "update_template $filename"
+ }
+ {-m} { ;# Update translation file
+ set filename [lindex $::argv [incr i]]
+ if {![string length $filename]} {
+ puts stderr "Argument expected after the $arg option."
+ exit 1
+ }
+ lappend command_list "update_msg_file $filename"
+ }
+ default { ;# Nonsense argument --> error
+ puts stderr "Unknown option ``$arg''."
+ puts stderr "Please type \"${::argv0} --help\" for help."
+ return 1
+ }
+ }
+ }
+
+ # Print some information about what this tool is, and what's the license, etc.
+ print_basic_info
+
+ # Execute required operations
+ foreach cmd $command_list {
+ eval $cmd
+ }
+
+ # Success
+ return 0
+ }
+}
+
+# Start the tool
+exit [TranslationManipulationTool::main]
diff --git a/translations/zh_CN.msg b/translations/zh_CN.msg
new file mode 100644
index 0000000..1253275
--- /dev/null
+++ b/translations/zh_CN.msg
@@ -0,0 +1,13729 @@
+#
+# Translation file from English language to Chinese
+# by:Yayi (China) <yz@yayi.biz>;asmwarrior <asmwarrior@gmail.com>
+#
+# Created: 2010.12.20.
+# Last update: 2012.7.29
+# Notes to translation: 如果遇到翻译错误或者建议更改请发邮件给我
+#
+set l [file tail [file rootname [info script]]]
+# main.tcl
+# ==============================================================================
+namespace eval :: {
+ ##ID:000001##
+ mcset $l "Translated into _Language_ by _Name_ (_country_) <_email_>" \
+ "Translated into chinese by Yayi (China) <yz@yayi.biz>\n如果遇到翻译错误或者建议更改请发邮件给我."
+ ##ID:000002##
+ mcset $l "Initializing" \
+ "正在初始化"
+ ##ID:000003##
+ mcset $l "\tLoading libraries" \
+ "\t正在加载库"
+ ##ID:000004##
+ mcset $l "\tLoading program sources" \
+ "\t正在加载程序源"
+ ##ID:000005##
+ mcset $l "FATAL ERROR" \
+ "致命错误"
+ ##ID:000006##
+ mcset $l "MCUs database file is corrupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE." \
+ "MCU的数据库已损坏,\n此程序离开它无法运行.\n请重新安装 MCU 8051 IDE."
+ ##ID:000007##
+ mcset $l "\tOpening last session" \
+ "\t打开最后一次会话"
+ ##ID:000008##
+ mcset $l "File not found" \
+ "文件没有找到"
+ ##ID:000009##
+ mcset $l "Unable to open project file:\n\"%s\"" \
+ "无法打开项目文件:\n\"%s\""
+ ##ID:000010##
+ mcset $l "%s is now operational\n" \
+ "%s目前正在运行\n"
+ ##ID:000011##
+ mcset $l "Initializing %s" \
+ "正在初始化%s"
+ ##ID:000012##
+ mcset $l "\nInitializing MCU 8051 IDE %s" \
+ "\n正在初始化 MCU 8051 IDE %s"
+ ##ID:000013##
+ mcset $l "\nInitializing \033\[1mMCU 8051 IDE \033\[32m%s\033\[m" \
+ "\n正在初始化 \033\[1mMCU 8051 IDE \033\[32m%s\033\[m"
+ ##ID:000014##
+ mcset $l "\nExiting on signal %s" \
+ "\n正在退出 %s"
+ ##ID:000015##
+ mcset $l "\nERROR: Unable to exit the program correctly -- TERMINATING NOW!" \
+ "\n错误: 无法正常退出程序 -- 正在结束" ;
+}
+# environment.tcl
+# ==============================================================================
+namespace eval :: {
+ ##ID:000016##
+ mcset $l "Permission denied" \
+ "没有权限"
+ ##ID:000017##
+ mcset $l "Unable to save configuration file" \
+ "无法保存配置文件"
+ ##ID:000018##
+ mcset $l " * Restoring default settings" \
+ " * 恢复默认设置"
+ ##ID:000019##
+ mcset $l "Change level of syntax validation" \
+ "更改语法检查级别"
+ ##ID:000020##
+ mcset $l "Configure spell checker" \
+ "配置拼写检查"
+ ##ID:000021##
+ mcset $l "Spell checker (hunspell) is not available." \
+ "拼写检查(hunspell)不可用"
+ ##ID:000022##
+ mcset $l "Show status bar history" \
+ "显示历史状态条"
+ ##ID:000023##
+ mcset $l "MCU chosen for simulation" \
+ "选择用于仿真的单片机"
+ ##ID:000024##
+ mcset $l "Syntax validation disabled" \
+ "关闭语法检查"
+ ##ID:000025##
+ mcset $l "Current validation level: %s" \
+ "当前语法检查级别: %s"
+ ##ID:000026##
+ mcset $l "Custom command %s: %s" \
+ "自定义命令 %s: %s"
+ ##ID:000027##
+ mcset $l "Clear" \
+ "清除"
+ # Main menu / File
+ ##ID:000028##
+ mcset $l "File" \
+ "文件"
+ ##ID:000029##
+ mcset $l "New" \
+ "新建"
+ ##ID:000030##
+ mcset $l "Create new file" \
+ "创建新文件"
+ ##ID:000031##
+ mcset $l "Open" \
+ "打开"
+ ##ID:000032##
+ mcset $l "Open an existing file" \
+ "打开文件"
+ ##ID:000033##
+ mcset $l "Open recent" \
+ "最近打开"
+ ##ID:000034##
+ mcset $l "Save" \
+ "保存"
+ ##ID:000035##
+ mcset $l "Save the current file" \
+ "保存当前文件"
+ ##ID:000036##
+ mcset $l "Save as" \
+ "另存为"
+ ##ID:000037##
+ mcset $l "Save under a different name" \
+ "根据不同的名称保存"
+ ##ID:000038##
+ mcset $l "Save all" \
+ "保存所有"
+ ##ID:000039##
+ mcset $l "Save the current file under a different name" \
+ "根据不同的名称保存当前文件"
+ ##ID:000040##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:000041##
+ mcset $l "Close the current file" \
+ "关闭当前文件"
+ ##ID:000042##
+ mcset $l "Close all" \
+ "关闭全部"
+ ##ID:000043##
+ mcset $l "Close all opened files" \
+ "关闭所有打开的文件"
+ ##ID:000044##
+ mcset $l "File statistics" \
+ "文件统计"
+ ##ID:000045##
+ mcset $l "Display file statistics" \
+ "显示统计文件"
+ ##ID:000046##
+ mcset $l "Save session" \
+ "保存会话"
+ ##ID:000047##
+ mcset $l "Save current session. Session file contains list of opened project, sizes of panels, etc." \
+ "保存当前会话.项目中打开的会话文件,面板尺寸等"
+ ##ID:000048##
+ mcset $l "Quit" \
+ "退出"
+ ##ID:000049##
+ mcset $l "Exit program" \
+ "退出程序"
+ # Main menu / Edit
+ ##ID:000050##
+ mcset $l "Edit" \
+ "编辑"
+ ##ID:000051##
+ mcset $l "Undo" \
+ "撤销"
+ ##ID:000052##
+ mcset $l "Take back last operation" \
+ "返回到最后操作"
+ ##ID:000053##
+ mcset $l "Redo" \
+ "取消撤销"
+ ##ID:000054##
+ mcset $l "Take back last undo" \
+ "取消最后的撤销"
+ ##ID:000055##
+ mcset $l "Cut" \
+ "剪切"
+ ##ID:000056##
+ mcset $l "Move selected text into the clipboard" \
+ "剪切选定的文本到剪贴板"
+ ##ID:000057##
+ mcset $l "Copy" \
+ "复制"
+ ##ID:000058##
+ mcset $l "Copy selected text into the clipboard" \
+ "复制选定的文本到剪贴板"
+ ##ID:000059##
+ mcset $l "Paste" \
+ "粘帖"
+ ##ID:000060##
+ mcset $l "Paste text from clipboard" \
+ "粘贴剪贴板中的文本"
+ ##ID:000061##
+ mcset $l "Select all" \
+ "选择所有"
+ ##ID:000062##
+ mcset $l "Select all text in the editor" \
+ "在编辑器中选择所有文本"
+ ##ID:000063##
+ mcset $l "Find" \
+ "查找"
+ ##ID:000064##
+ mcset $l "Find a string in the text" \
+ "在文本中查找"
+ ##ID:000065##
+ mcset $l "Find next" \
+ "查找下一个"
+ ##ID:000066##
+ mcset $l "Find next occurrence of search string" \
+ "查找下一个搜索字符"
+ ##ID:000067##
+ mcset $l "Find previous" \
+ "查找上一个"
+ ##ID:004514##
+ mcset $l "Fill with pseudo-random values" \
+ "伪随机值填充"
+ ##ID:000068##
+ mcset $l "Find previous occurrence of search string" \
+ "查找上一个搜索字符"
+ ##ID:000069##
+ mcset $l "Replace" \
+ "替换"
+ ##ID:000070##
+ mcset $l "Replace some string with another" \
+ "替换其他的字符"
+ ##ID:000071##
+ mcset $l "Go to line" \
+ "到达指定的行目"
+ ##ID:000072##
+ mcset $l "Jump to line" \
+ "转跳到指定的行目"
+ ##ID:000073##
+ mcset $l "Comment" \
+ "注释"
+ ##ID:000074##
+ mcset $l "Comment selected text" \
+ "注释选定的文本"
+ ##ID:000075##
+ mcset $l "Uncomment" \
+ "取消注释"
+ ##ID:000076##
+ mcset $l "Uncomment selected text" \
+ "取消指定文本的注释"
+ ##ID:000077##
+ mcset $l "Indent" \
+ "缩进"
+ ##ID:000078##
+ mcset $l "Indent selected text" \
+ "缩进指定的文本"
+ ##ID:000079##
+ mcset $l "Unindent" \
+ "取消缩进"
+ ##ID:000080##
+ mcset $l "Unindent selected text" \
+ "取消指定文本的缩进"
+ # Main menu / View
+ ##ID:000081##
+ mcset $l "View" \
+ "查看"
+ ##ID:000082##
+ mcset $l "Read only mode" \
+ "只读模式"
+ ##ID:000083##
+ mcset $l "Set current editor to read only/normal mode" \
+ "当前编辑器设置为只读/正常模式"
+ ##ID:000084##
+ mcset $l "Switch to command line" \
+ "切换至命令行"
+ ##ID:000085##
+ mcset $l "Switch to editor command line" \
+ "切换至编辑器命令行"
+ ##ID:000086##
+ mcset $l "Show/Hide icon border" \
+ "显示/隐藏图标栏"
+ ##ID:000087##
+ mcset $l "Show/Hide editor's icon border (bookmark icons)" \
+ "显示/隐藏编辑器的图标栏(书签图标)"
+ ##ID:000088##
+ mcset $l "Show/Hide line numbers" \
+ "显示/隐藏行目"
+ ##ID:000089##
+ mcset $l "Show/Hide editor's line numbers" \
+ "显示/隐藏编辑器行目"
+ ##ID:000090##
+ mcset $l "Reload" \
+ "刷新"
+ ##ID:000091##
+ mcset $l "Reload current file" \
+ "刷新当前文件"
+ ##ID:000092##
+ mcset $l "Highlight" \
+ "高亮"
+ ##ID:000093##
+ mcset $l "None" \
+ "无"
+ ##ID:000094##
+ mcset $l "Assembly language" \
+ "汇编语言模式"
+ ##ID:000095##
+ mcset $l "Assembler ASX8051" \
+ "ASX8051汇编模式"
+ ##ID:000096##
+ mcset $l "Reallocable assembler from SDCC project" \
+ "从SDCC项目中分配汇编器"
+ ##ID:000097##
+ mcset $l "C language" \
+ "C语言模式"
+ ##ID:000098##
+ mcset $l "Code listing" \
+ "代码列表模式"
+ ##ID:000099##
+ mcset $l "Full screen mode" \
+ "全屏模式"
+ ##ID:000100##
+ mcset $l "Toggle full screen mode" \
+ "切换到全屏模式"
+ ##ID:000101##
+ mcset $l "Clear messages panel" \
+ "清除信息面板"
+ # Main menu / Project
+ ##ID:000102##
+ mcset $l "Project" \
+ "项目"
+ ##ID:000103##
+ mcset $l "Create new project" \
+ "创建新项目"
+ ##ID:000104##
+ mcset $l "Open an existing project" \
+ "打开已有的项目"
+ ##ID:000105##
+ mcset $l "Save the current project" \
+ "保存当前项目"
+ ##ID:000106##
+ mcset $l "Edit project" \
+ "编辑项目"
+ ##ID:000107##
+ mcset $l "Edit project details" \
+ "编辑项目详情"
+ ##ID:000108##
+ mcset $l "Save and close" \
+ "保存关闭"
+ ##ID:000109##
+ mcset $l "Save the current project and close it" \
+ "保存并关闭当前项目"
+ ##ID:000110##
+ mcset $l "Close without saving" \
+ "不保存关闭"
+ ##ID:000111##
+ mcset $l "Close current project" \
+ "关闭当前项目"
+ # Main menu / Simulator
+ ##ID:000112##
+ mcset $l "Simulator" \
+ "模拟器"
+ ##ID:000113##
+ mcset $l "Start / Shutdown" \
+ "启动 / 关闭"
+ ##ID:000114##
+ mcset $l "Start simulator engine" \
+ "启动模拟器引擎"
+ ##ID:000115##
+ mcset $l "Debug this file only" \
+ "只调试这个文件"
+ ##ID:000116##
+ mcset $l "Start simulator engine and load current file only" \
+ "启动模拟器引擎和只加载当前文件"
+ ##ID:000117##
+ mcset $l "Step back" \
+ "后退"
+ ##ID:000118##
+ mcset $l "Step program back by 1 instruction" \
+ "后退一条程序指令"
+ ##ID:000119##
+ mcset $l "Step" \
+ "单步"
+ ##ID:000120##
+ mcset $l "Step program by 1 instruction" \
+ "步测一条程序指令"
+ ##ID:000121##
+ mcset $l "Step over" \
+ "跟踪"
+ ##ID:000122##
+ mcset $l "Step program by 1 line of code" \
+ "步测每一行代码(进入函数)"
+ ##ID:000123##
+ mcset $l "Animate" \
+ "模式动画"
+ ##ID:000124##
+ mcset $l "Run program and show results after each change" \
+ "运行程序,并显示在每次更改后的结果"
+ ##ID:000125##
+ mcset $l "Run" \
+ "运行"
+ ##ID:000126##
+ mcset $l "Run program and show results periodically in some interval" \
+ "运行程序,并显示结果在指定的期间"
+ ##ID:000127##
+ mcset $l "Hiberante program" \
+ "冬眠程序"
+ ##ID:000128##
+ mcset $l "Save current state of simulator engine to a file for future resumption" \
+ "保存模拟器引擎的当前状态,以备将来恢复文件"
+ ##ID:000129##
+ mcset $l "Resume hibernated program" \
+ "恢复已冬眠的程序"
+ ##ID:000130##
+ mcset $l "Interrupt monitor" \
+ "中断监控"
+ ##ID:000131##
+ mcset $l "Dialog in which you can control MCU interrupts" \
+ "您可以在对话中控制单片机的中断"
+ ##ID:000132##
+ mcset $l "Stopwatch" \
+ "秒表"
+ ##ID:000133##
+ mcset $l "Configurable stopwatch timer which can stop simulation on various conditions" \
+ "配置的秒表定时器,可用模拟各种条件下停止"
+ ##ID:000134##
+ mcset $l "Find cursor" \
+ "查找指示器"
+ ##ID:000135##
+ mcset $l "Find simulator cursor in the editor" \
+ "在编辑器中找到模拟指示器"
+ ##ID:000136##
+ mcset $l "Translate line number to address in program memory and set PC to that address" \
+ "把寄存器地址翻译成PC行号地址"
+ ##ID:000137##
+ mcset $l "Clear highlight" \
+ "清除高亮"
+ ##ID:000138##
+ mcset $l "Clear highlight for changed values" \
+ "清除变动值的高亮"
+ ##ID:000139##
+ mcset $l "Allow breakpoints" \
+ "允许断点"
+ ##ID:000140##
+ mcset $l "Enable simulator breakpoints (marks, where to stop program in animate or run mode)" \
+ "启用模拟器断点(标记在哪里停止运行模式动画或程序)"
+ # Main menu / Virtual MCU
+ ##ID:000141##
+ mcset $l "Virtual MCU" \
+ "虚拟单片机"
+ ##ID:000142##
+ mcset $l "Show SFR map" \
+ "显示SFR映射"
+ ##ID:000143##
+ mcset $l "Show map of special function registers area" \
+ "显示特殊功能寄存器区的地图"
+ ##ID:000144##
+ mcset $l "Show bit area" \
+ "显示位区域"
+ ##ID:000145##
+ mcset $l "Show bit addressable area" \
+ "显示位寻址区"
+ ##ID:000146##
+ mcset $l "Show stack" \
+ "显示堆栈"
+ ##ID:000147##
+ mcset $l "Invoke MCU stack monitor" \
+ "调用单片机堆栈监视器"
+ ##ID:000148##
+ mcset $l "Show Code memory" \
+ "显示代码存储器"
+ ##ID:000149##
+ mcset $l "Invoke hex editor with program code" \
+ "调用程序代码的十六进制编辑器"
+ ##ID:000150##
+ mcset $l "Show XDATA memory" \
+ "显示XDATA存储器"
+ ##ID:000151##
+ mcset $l "Invoke hex editor with external data memory" \
+ "调用与外部数据存储器的十六进制编辑器"
+ ##ID:000152##
+ mcset $l "Show ERAM" \
+ "显示ERAM"
+ ##ID:000153##
+ mcset $l "Invoke hex editor with expanded RAM" \
+ "调用扩展RAM的十六进制编辑器"
+ ##ID:000154##
+ mcset $l "Show Data EEPROM" \
+ "显示EEPROM数据"
+ ##ID:000155##
+ mcset $l "Invoke hex editor with data EEPROM" \
+ "调用EEPROM数据的十六进制编辑器"
+ ##ID:000156##
+ mcset $l "Show EEPROM write buffer" \
+ "显示EEPROM写入缓冲区"
+ ##ID:000157##
+ mcset $l "Invoke hex editor editor with data EEPROM write buffer" \
+ "调用编辑器与EEPROM数据写入缓冲区的十六进制编辑器"
+ ##ID:000158##
+ mcset $l "Reset" \
+ "复位"
+ ##ID:000159##
+ mcset $l "Only SFR" \
+ "只复位SFR"
+ ##ID:000160##
+ mcset $l "Reset Special Function Registers only" \
+ "只复位特殊功能寄存器"
+ ##ID:000161##
+ mcset $l "All zeros" \
+ "全部为0"
+ ##ID:000162##
+ mcset $l "Reset all internal registers to zeroes" \
+ "复位所有内部寄存器为零"
+ ##ID:000163##
+ mcset $l "All ones" \
+ "所有"
+ ##ID:000164##
+ mcset $l "Reset all internal registers to ones (0xFF)" \
+ "复位所有的内部寄存器(0xFF)"
+ ##ID:000165##
+ mcset $l "Random values" \
+ "随机值"
+ ##ID:000166##
+ mcset $l "Reset all internal registers to random values" \
+ "复位所有内部寄存器的随机值"
+ ##ID:000167##
+ mcset $l "Virtual UART terminal" \
+ "虚拟 UART 终端" ;
+ ##ID:000168##
+ mcset $l "Simulated UART terminal connected to the MCU simulator" \
+ "模拟UART终端连接到MCU的模拟器"
+ # Main menu / Virtual HW
+ ##ID:000169##
+ mcset $l "Virtual HW" \
+ "虚拟硬件"
+ ##ID:000170##
+ mcset $l "LED Panel" \
+ "LED面板"
+ ##ID:000171##
+ mcset $l "LED Display" \
+ "数码管"
+ ##ID:000172##
+ mcset $l "LED Matrix" \
+ "矩阵LED"
+ ##ID:000173##
+ mcset $l "LCD display (HD44780)" \
+ "LCD 显示屏 (HD44780)"
+ ##ID:000174##
+ mcset $l "Multiplexed LED Display" \
+ "复用数码管"
+ ##ID:000175##
+ mcset $l "LCD display controlled by HD44780" \
+ "LCD HD44780 显示屏控制"
+ ##ID:000176##
+ mcset $l "DS1620 thermometer" \
+ "DS1620 温度计"
+ ##ID:000177##
+ mcset $l "DS1620 temperature sensor" \
+ "DS1620 温度计传感器"
+ ##ID:000178##
+ mcset $l "Simple Keypad" \
+ "简单按键"
+ ##ID:000179##
+ mcset $l "Matrix Keypad" \
+ "矩阵按键"
+ ##ID:000180##
+ mcset $l "Load VHW connections from a file" \
+ "从文件中载入VHW连接"
+ ##ID:000181##
+ mcset $l "Load" \
+ "加载"
+ ##ID:000182##
+ mcset $l "Import VHW connections from a file" \
+ "从文件加载VHW连接"
+ ##ID:000183##
+ mcset $l "Load recent" \
+ "最近的加载"
+ ##ID:000184##
+ mcset $l "Save current VHW connections to a file" \
+ "保存当前VHW连接到一个文件"
+ ##ID:000185##
+ mcset $l "Save current VHW connections under a different name" \
+ "根据不同的名称保存当前虚拟硬件连接"
+ ##ID:000186##
+ mcset $l "Remove all" \
+ "全部删除"
+ ##ID:000187##
+ mcset $l "Remove all VHW" \
+ "删除全部虚拟硬件"
+ # Main menu / Tools
+ ##ID:000188##
+ mcset $l "Tools" \
+ "工具"
+ ##ID:000189##
+ mcset $l "Compile" \
+ "编译"
+ ##ID:000190##
+ mcset $l "Compile the source code" \
+ "编译的源代码"
+ ##ID:000191##
+ mcset $l "Compile this file" \
+ "编译当前文件"
+ ##ID:000192##
+ mcset $l "Compile current file only" \
+ "仅编译当前文件"
+ ##ID:000193##
+ mcset $l "Disassemble" \
+ "反汇编"
+ ##ID:000194##
+ mcset $l "Disassemble object code and open new editor with the result" \
+ "反汇编目标代码并在新的编辑器窗口打开反汇编结果"
+ ##ID:000195##
+ mcset $l "Encoding" \
+ "编码"
+ ##ID:000196##
+ mcset $l "End of line" \
+ "尾行"
+ ##ID:000197##
+ mcset $l "Auto indent" \
+ "自动缩进"
+ ##ID:000198##
+ mcset $l "Reformat source code (Indention level etc.)" \
+ "格式化源代码(缩进水平等)"
+ ##ID:000199##
+ mcset $l "Change letter case" \
+ "变更字母大小写"
+ ##ID:000200##
+ mcset $l "Change letter case in source code (with options)" \
+ "变动源代码的字母大小写(选项)"
+ ##ID:000201##
+ mcset $l "Export as XHTML" \
+ "导出为XHTML"
+ ##ID:000202##
+ mcset $l "Export highlighted code as XHTML file" \
+ "导出为XHTML代码文件"
+ ##ID:000203##
+ mcset $l "Export as LaTeX" \
+ "导出为LaTeX"
+ ##ID:000204##
+ mcset $l "Export highlighted code as LaTeX source, using package color" \
+ "导出着色的LaTeX源代码,采用color宏包"
+ ##ID:000205##
+ mcset $l "Document current function" \
+ "当前函数的文件"
+ ##ID:000206##
+ mcset $l "Create doxygen documentation for function on current line" \
+ "对当前行函数创建doxygen的文档"
+ ##ID:000207##
+ mcset $l "Run doxywizard" \
+ "运行doxywizard"
+ ##ID:000208##
+ mcset $l "Run doxygen front-end" \
+ "运行doxygen的前端"
+ ##ID:000209##
+ mcset $l "Clear C API documentation" \
+ "清除C语言API的文档"
+ ##ID:000210##
+ mcset $l "Remove C API documentation created by doxygen" \
+ "使用doxygen删除C语言API的文档"
+ ##ID:000211##
+ mcset $l "Build C API documentation" \
+ "构建C语言的API文档"
+ ##ID:000212##
+ mcset $l "Run doxygen to create C API documentation" \
+ "运行doxygen创建C语言的API文档"
+ ##ID:000213##
+ mcset $l "Clean up project folder" \
+ "清理项目文件夹"
+ ##ID:000214##
+ mcset $l "Invoke dialog to remove needless files the project directory" \
+ "删除不必要的文件对话框项目目录"
+ ##ID:000215##
+ mcset $l "Custom command 0" \
+ "自定义命令0"
+ ##ID:000216##
+ mcset $l "Custom command 1" \
+ "自定义命令1"
+ ##ID:000217##
+ mcset $l "Custom command 2" \
+ "自定义命令2"
+ # Main menu / Utilities / Encoding
+ ##ID:000218##
+ mcset $l "Unicode" \
+ "Unicode" ;# <-- NOT TRANSLATED YET
+ ##ID:000219##
+ mcset $l "Western European" \
+ "Western European" ;# <-- NOT TRANSLATED YET
+ ##ID:000220##
+ mcset $l "Central European" \
+ "Central European" ;# <-- NOT TRANSLATED YET
+ ##ID:000221##
+ mcset $l "Baltic" \
+ "Baltic" ;# <-- NOT TRANSLATED YET
+ ##ID:000222##
+ mcset $l "Cyrillic" \
+ "Cyrillic" ;# <-- NOT TRANSLATED YET
+ ##ID:000223##
+ mcset $l "Arabic" \
+ "Arabic" ;# <-- NOT TRANSLATED YET
+ ##ID:000224##
+ mcset $l "Greek" \
+ "Greek" ;# <-- NOT TRANSLATED YET
+ ##ID:000225##
+ mcset $l "Hebrew" \
+ "Hebrew" ;# <-- NOT TRANSLATED YET
+ ##ID:000226##
+ mcset $l "Turkish" \
+ "Turkish" ;# <-- NOT TRANSLATED YET
+ ##ID:000227##
+ mcset $l "Northern European" \
+ "Northern European" ;# <-- NOT TRANSLATED YET
+ ##ID:000228##
+ mcset $l "South-Eastern Europe" \
+ "South-Eastern Europe" ;# <-- NOT TRANSLATED YET
+ ##ID:000229##
+ mcset $l "Vietnamese" \
+ "Vietnamese" ;# <-- NOT TRANSLATED YET
+ # Main menu / Utilities
+ ##ID:000230##
+ mcset $l "Utilities" \
+ "实用工具集"
+ ##ID:000231##
+ mcset $l "Hex -> Bin" \
+ "Hex -> Bin" ;# <-- NOT TRANSLATED YET
+ ##ID:000232##
+ mcset $l "Bin -> Hex" \
+ "Bin -> Hex" ;# <-- NOT TRANSLATED YET
+ ##ID:000233##
+ mcset $l "Sim -> Hex" \
+ "Sim -> Hex" ;# <-- NOT TRANSLATED YET
+ ##ID:000234##
+ mcset $l "Sim -> Bin" \
+ "Sim -> Bin" ;# <-- NOT TRANSLATED YET
+ ##ID:000235##
+ mcset $l "Convert Intel HEX 8 file to binary file" \
+ "八进制文件转换为二进制文件"
+ ##ID:000236##
+ mcset $l "Convert binary file to Intel HEX 8 file" \
+ "二进制文件转换为八进制文件"
+ ##ID:000237##
+ mcset $l "Convert simulator file to Intel HEX 8 file" \
+ "模拟器文件转换为八进制文件"
+ ##ID:000238##
+ mcset $l "Convert simulator file to binary file" \
+ "模拟器文件转换为二进制文件"
+ ##ID:000239##
+ mcset $l "Normalize Intel 8 hex file" \
+ "Normalize Intel 8 hex file" ;# <-- NOT TRANSLATED YET
+ ##ID:000240##
+ mcset $l "Reformat the given IHEX8" \
+ "Reformat the given IHEX8" ;# <-- NOT TRANSLATED YET
+ ##ID:000241##
+ mcset $l "Hex Editor" \
+ "HEX编辑器"
+ ##ID:000242##
+ mcset $l "Invoke project independent hexadecimal editor with capacity of 64KB" \
+ "Invoke project independent hexadecimal editor with capacity of 64KB" ;# <-- NOT TRANSLATED YET
+ ##ID:000243##
+ mcset $l "Symbol Table" \
+ "符号表"
+ ##ID:000244##
+ mcset $l "Assembly language symbol table viewer" \
+ "汇编语言的符号表查看器"
+ ##ID:000245##
+ mcset $l "8-Segment Editor" \
+ "8段LED编辑器"
+ ##ID:000246##
+ mcset $l "8-Segment LED Display Editor" \
+ "8段LED编辑器"
+ ##ID:000247##
+ mcset $l "ASCII Chart" \
+ "ASCII表"
+ ##ID:000248##
+ mcset $l "8051 Instruction Table" \
+ "8051指令表" ;
+ ##ID:000249##
+ mcset $l "Interactive table of 8051 instructions" \
+ "交互式8051指令表"
+ ##ID:000250##
+ mcset $l "Scribble Notepad" \
+ "便利贴"
+ ##ID:000251##
+ mcset $l "Base Converter" \
+ "进制转换"
+ ##ID:000252##
+ mcset $l "Special Calculator" \
+ "特殊计算器"
+ ##ID:000253##
+ mcset $l "UART/RS232 Debugger" \
+ "UART/RS232调试器"
+ # Main menu / Configure
+ ##ID:000254##
+ mcset $l "Configure" \
+ "配置"
+ ##ID:000255##
+ mcset $l "Configure Editor" \
+ "配置编辑器"
+ ##ID:000256##
+ mcset $l "Editor configuration (colors, fonts, highlighting, etc.)" \
+ "编辑器配置(颜色,字体,高亮,等等)"
+ ##ID:000257##
+ mcset $l "Configure Compiler" \
+ "配置编译器"
+ ##ID:000258##
+ mcset $l "Various compilation options" \
+ "不同的编译选项"
+ ##ID:000259##
+ mcset $l "Configure Simulator" \
+ "配置模拟器"
+ ##ID:000260##
+ mcset $l "Opens simulator configuration dialog" \
+ "打开模拟器配置对话框"
+ ##ID:000261##
+ mcset $l "Configure Right Panel" \
+ "配置右侧面板"
+ ##ID:000262##
+ mcset $l "Right panel configuration (instruction details colors)" \
+ "右面板配置(指令颜色)"
+ ##ID:000263##
+ mcset $l "Configure Main Toolbar" \
+ "配置主工具栏"
+ ##ID:000264##
+ mcset $l "Adjust content of the main toolbar (under main menu)" \
+ "调整的主要工具栏的内容(主菜单)"
+ ##ID:000265##
+ mcset $l "Edit custom commands" \
+ "编辑自定义命令"
+ ##ID:000266##
+ mcset $l "Set or modify user defined commands" \
+ "设置或修改用户定义的命令"
+ ##ID:000267##
+ mcset $l "Configure shortcuts" \
+ "配置快捷键"
+ ##ID:000268##
+ mcset $l "Set or modify key shortcuts" \
+ "设置或修改快捷键"
+ ##ID:000269##
+ mcset $l "Configure terminal emulator" \
+ "配置终端仿真器"
+ ##ID:000270##
+ mcset $l "Configure embedded terminal emulator -- RXVT-UNICODE" \
+ "配置嵌入式终端模拟器 -- RXVT-UNICODE"
+ ##ID:000271##
+ mcset $l "Configure MCU 8051 IDE" \
+ "配置8051单片机IDE"
+ ##ID:000272##
+ mcset $l "Invoke global configuration dialog" \
+ "调用全局配置对话框"
+ # Main menu / Help
+ ##ID:000273##
+ mcset $l "Help" \
+ "帮助"
+ ##ID:000274##
+ mcset $l "About" \
+ "关于"
+ ##ID:000275##
+ mcset $l "About MCU 8051 IDE" \
+ "关于 MCU 8051 IDE"
+ ##ID:000276##
+ mcset $l "Display the documentation for MCU 8051 IDE" \
+ "打开MCU 8051 IDE文档"
+ ##ID:000277##
+ mcset $l "Welcome Dialog" \
+ "欢迎界面"
+ ##ID:000278##
+ mcset $l "Invoke dialog which you have seen on the first start" \
+ "调用您在第一次启动程序时看到的对话框"
+ ##ID:000279##
+ mcset $l "Tip of the Day" \
+ "每日提示"
+ ##ID:000280##
+ mcset $l "Some tips about how to use this program more efficiently" \
+ "关于如何更有效地使用这个程序的一些小技巧"
+ ##ID:000281##
+ mcset $l "Project web page" \
+ "项目主页"
+ ##ID:000282##
+ mcset $l "Report a bug" \
+ "报告bug"
+ ##ID:000283##
+ mcset $l "ASEM-51 manual" \
+ "ASEM-51手册"
+ ##ID:000284##
+ mcset $l "SDCC manual" \
+ "SDCC手册"
+ ##ID:000285##
+ mcset $l "Handbook" \
+ "手册"
+ # Toolbar
+ ##ID:000286##
+ mcset $l "Hide toolbar" \
+ "隐藏工具栏"
+ ##ID:000287##
+ mcset $l "Show toolbar" \
+ "显示工具栏"
+ ##ID:000288##
+ mcset $l "Configure Toolbar" \
+ "配置工具栏"
+ ##ID:000289##
+ mcset $l "Configure main toolbar" \
+ "配置主工具栏"
+ ##ID:000290##
+ mcset $l "Hide main toolbar" \
+ "隐藏主工具栏"
+ ##ID:000291##
+ mcset $l "Configure custom commands" \
+ "配置自定义命令"
+ ##ID:000292##
+ mcset $l "Invoke custom commands configuration dialog" \
+ "调用自定义命令配置对话框"
+ set ::TOOLBAR_TRANSLATIONS {
+ ##ID:000293##
+ mcset $l "Open file" \
+ "打开文件"
+ ##ID:000294##
+ mcset $l "Save all opened files (in this project)" \
+ "保存所有打开的文件(在本项目)"
+ ##ID:000295##
+ mcset $l "Exit" \
+ "退出"
+ ##ID:000296##
+ mcset $l "Exit application" \
+ "退出应用程序"
+ ##ID:000297##
+ mcset $l "Reload the current file" \
+ "刷新当前文件"
+ ##ID:000298##
+ mcset $l "Open project" \
+ "打开项目"
+ ##ID:000299##
+ mcset $l "Save project" \
+ "保存项目"
+ ##ID:000300##
+ mcset $l "Save and close project" \
+ "保存并关闭项目"
+ ##ID:000301##
+ mcset $l "Close project without saving" \
+ "不保存关闭"
+ ##ID:000302##
+ mcset $l "Show CODE memory" \
+ "显示代码存储器"
+ ##ID:000303##
+ mcset $l "Show data EEPROM" \
+ "显示EEPROM数据"
+ ##ID:000304##
+ mcset $l "Start / Shutdown simulator" \
+ "启动/关机模拟器"
+ ##ID:000305##
+ mcset $l "Load debug file into simulator engine" \
+ "加载调试文件到模拟器引擎"
+ ##ID:000306##
+ mcset $l "Perform HW reset" \
+ "执行硬件复位"
+ ##ID:000307##
+ mcset $l "Step program" \
+ "单步"
+ ##ID:000308##
+ mcset $l "Step by 1 instruction" \
+ "步测一条程序指令"
+ ##ID:000309##
+ mcset $l "Step by 1 line of code" \
+ "步测每一行代码(进入函数)"
+ ##ID:000310##
+ mcset $l "Animate program" \
+ "动画程序"
+ ##ID:000311##
+ mcset $l "Run program and show results after each instruction" \
+ "运行程序,并显示在每次更改后的结果"
+ ##ID:000312##
+ mcset $l "Run program" \
+ "运行程序"
+ ##ID:000313##
+ mcset $l "Run program in simulator" \
+ "运行程序,并显示结果在指定的期间"
+ ##ID:000314##
+ mcset $l "Hibernate program" \
+ "冬眠程序"
+ ##ID:000315##
+ mcset $l "Hibernate running program to a file" \
+ "冬眠正在运行的程序到一个文件"
+ ##ID:000316##
+ mcset $l "Resume program" \
+ "恢复已冬眠程序"
+ ##ID:000317##
+ mcset $l "Configurable stopwatch timer which stop simulation on various conditions" \
+ "配置的秒表定时器,可用模拟各种条件下停止"
+ ##ID:000318##
+ mcset $l "Compile source code" \
+ "编译源代码"
+ ##ID:000319##
+ mcset $l "Symbol table" \
+ "符号表"
+ ##ID:000320##
+ mcset $l "8-segment editor" \
+ "8段LED编辑器"
+ ##ID:000321##
+ mcset $l "8-segment LED display editor" \
+ "8段LED编辑器"
+ ##ID:000322##
+ mcset $l "ASCII chart" \
+ "ASCII表"
+ ##ID:000323##
+ mcset $l "Reformat source code (Indention level ...)" \
+ "重新格式化源代码(缩进)"
+ ##ID:000324##
+ mcset $l "Switch to the next editor" \
+ "切换到下一个编辑器"
+ ##ID:000325##
+ mcset $l "Switch to the previous editor" \
+ "切换到上一个编辑器"
+ ##ID:000326##
+ mcset $l "Tip of the day" \
+ "每日提示"
+ ##ID:000327##
+ mcset $l "Scribble notepad" \
+ "便利贴"
+ ##ID:000328##
+ mcset $l "LED panel" \
+ "LED面板"
+ ##ID:000329##
+ mcset $l "LED display" \
+ "数码管"
+ ##ID:000330##
+ mcset $l "LED matrix" \
+ "矩阵LED"
+ ##ID:000331##
+ mcset $l "Multiplexed LED display" \
+ "复用数码管"
+ ##ID:000332##
+ mcset $l "Simple keypad" \
+ "简单按键"
+ ##ID:000333##
+ mcset $l "Matrix keypad" \
+ "矩阵按键"
+ ##ID:000334##
+ mcset $l "VHW Open" \
+ "打开VHW"
+ ##ID:000335##
+ mcset $l "VHW Load" \
+ "加载VHW"
+ ##ID:000336##
+ mcset $l "VHW Save" \
+ "保存VHW"
+ ##ID:000337##
+ mcset $l "VHW Save as" \
+ "VHW另存为"
+ ##ID:000338##
+ mcset $l "VHW Remove all" \
+ "VHW全部删除"
+ ##ID:000339##
+ mcset $l "Special calculator" \
+ "特殊计算器"
+ }
+ namespace eval toolbar {
+ eval ${::TOOLBAR_TRANSLATIONS}
+ }
+}
+# asciichart.tcl
+# ==============================================================================
+namespace eval AsciiChart {
+ ##ID:000340##
+ mcset $l "ASCII chart" \
+ "ASCII码表"
+ ##ID:000341##
+ mcset $l "Exit" \
+ "退出"
+ ##ID:000342##
+ mcset $l "Character: " \
+ "字符: "
+ ##ID:000343##
+ mcset $l "Hex address" \
+ "Hex地址"
+ ##ID:000344##
+ mcset $l "Dec address" \
+ "Dec地址"
+ ##ID:000345##
+ mcset $l "Oct address" \
+ "Oct地址"
+ ##ID:000346##
+ mcset $l "Bin address" \
+ "Bin地址"
+ ##ID:000347##
+ mcset $l "Caret notation" \
+ "插入符号表示法"
+ ##ID:000348##
+ mcset $l "C Escape Code" \
+ "C转义代码"
+ ##ID:000349##
+ mcset $l "%s - Copy contents of entrybox to clipboard" \
+ "%s - 对entrybox的内容复制到剪贴板"
+ ##ID:000350##
+ mcset $l "Copy to clipboard" \
+ "复制到剪贴板"
+}
+# baseconverter.tcl
+# ==============================================================================
+namespace eval BaseConverter {
+ ##ID:000351##
+ mcset $l "Converter" \
+ "转换器"
+ ##ID:000352##
+ mcset $l "Enlarge" \
+ "放大"
+ ##ID:000353##
+ mcset $l "More" \
+ "更多"
+ ##ID:000354##
+ mcset $l "Shrink" \
+ "缩小"
+ ##ID:000355##
+ mcset $l "Less" \
+ "更少"
+ ##ID:000356##
+ mcset $l "Bits" \
+ "Bits" ;# <-- NOT TRANSLATED YET
+ ##ID:000357##
+ mcset $l "BCD" \
+ "BCD" ;# <-- NOT TRANSLATED YET
+ ##ID:000358##
+ mcset $l "ASCII" \
+ "ASCII" ;# <-- NOT TRANSLATED YET
+ ##ID:000359##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:000360##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:000361##
+ mcset $l "BIN" \
+ "BIN" ;# <-- NOT TRANSLATED YET
+ ##ID:000362##
+ mcset $l "OCT" \
+ "OCT" ;# <-- NOT TRANSLATED YET
+}
+# bitmap.tcl
+# ==============================================================================
+namespace eval BitMap {
+ ##ID:000363##
+ mcset $l "Log. 0" \
+ "Log. 0" ;# <-- NOT TRANSLATED YET
+ ##ID:000364##
+ mcset $l "Log. 1" \
+ "Log. 1" ;# <-- NOT TRANSLATED YET
+ ##ID:000365##
+ mcset $l "Bit addr." \
+ "Bit addr." ;# <-- NOT TRANSLATED YET
+ ##ID:000366##
+ mcset $l "Reg. addr." \
+ "Reg. addr." ;# <-- NOT TRANSLATED YET
+ ##ID:000367##
+ mcset $l "Register: " \
+ "Register: " ;# <-- NOT TRANSLATED YET
+ ##ID:000368##
+ mcset $l " Bit address: " \
+ " Bit address: " ;# <-- NOT TRANSLATED YET
+ ##ID:000369##
+ mcset $l "Bit addressable area - %s - %s - %s" \
+ "Bit addressable area - %s - %s - %s" ;# <-- NOT TRANSLATED YET
+}
+# bottomnotebook.tcl
+# ==============================================================================
+namespace eval BottomNoteBook {
+ ##ID:000370##
+ mcset $l "Simulator" \
+ "模拟器"
+ ##ID:000371##
+ mcset $l "C variables" \
+ "C变量"
+ ##ID:000372##
+ mcset $l "IO Ports" \
+ "IO端口"
+ ##ID:000373##
+ mcset $l "Messages" \
+ "消息"
+ ##ID:000374##
+ mcset $l "Calculator" \
+ "计算器"
+ ##ID:000375##
+ mcset $l "Notes" \
+ "注释"
+ ##ID:000376##
+ mcset $l "Terminal" \
+ "终端"
+ ##ID:000377##
+ mcset $l "Find in files" \
+ "在文件中查找"
+ ##ID:000378##
+ mcset $l "Show" \
+ "显示"
+ ##ID:000379##
+ mcset $l "Hide" \
+ "隐藏"
+ ##ID:000380##
+ mcset $l "Simulator panel %s" \
+ "模拟器面板 %s"
+ ##ID:000381##
+ mcset $l "Variables from C source code %s" \
+ "从C源代码中的变量 %s"
+ ##ID:000382##
+ mcset $l "Graph showing state of MCU ports %s" \
+ "显示MCU端口状态图表 %s"
+ ##ID:000383##
+ mcset $l "Compiler messages %s" \
+ "编译器消息 %s"
+ ##ID:000384##
+ mcset $l "Personal to do list & notepad %s" \
+ "私人待办事&记事本 %s"
+ ##ID:000385##
+ mcset $l "Scientific calculator %s" \
+ "科学计算器 %s"
+ ##ID:000386##
+ mcset $l "Terminal emulator %s" \
+ "终端仿真器 %s"
+ ##ID:000387##
+ mcset $l "Find in files %s" \
+ "在文件中查找 %s"
+ ##ID:000388##
+ mcset $l "Hide this panel" \
+ "隐藏这个面板"
+ ##ID:000389##
+ mcset $l "Show this panel" \
+ "显示这个面板"
+ ##ID:000390##
+ mcset $l "Simulator panel" \
+ "模拟器"
+ ##ID:000391##
+ mcset $l "List of variables defined in C program" \
+ "C程序里定义的变量列表"
+ ##ID:000392##
+ mcset $l "Graph showing voltage levels" \
+ "图表显示电压等级"
+ ##ID:000393##
+ mcset $l "Compiler messages" \
+ "编译器消息"
+ ##ID:000394##
+ mcset $l "Editable notepad" \
+ "可编辑记事本"
+ ##ID:000395##
+ mcset $l "Scientific calculator" \
+ "科学计算器"
+ ##ID:000396##
+ mcset $l "Linux terminal emulator" \
+ "Linux终端模拟器"
+ ##ID:000397##
+ mcset $l "Search string in files" \
+ "在文件中搜索"
+ ##ID:000398##
+ mcset $l "Hide the panel" \
+ "隐藏面板"
+ ##ID:000399##
+ mcset $l "Show the panel" \
+ "显示面板"
+}
+# calculator.tcl
+# ==============================================================================
+namespace eval Calculator {
+ ##ID:000400##
+ mcset $l "Save" \
+ "保存"
+ ##ID:000401##
+ mcset $l "Load" \
+ "加载"
+ ##ID:000402##
+ mcset $l "Calculator: M%s saved" \
+ "计算器: M%s 保存"
+ ##ID:000403##
+ mcset $l "Calculator: Unable to evaluate, missing argument" \
+ "计算器: 无法评估,缺少参数"
+ ##ID:000404##
+ mcset $l "Calculator: Unable to evaluate, missing operator" \
+ "计算器: 无法评估,缺少操作符"
+ ##ID:000405##
+ mcset $l "Calculator: WARNING result is +/- infinity => operation terminated !" \
+ "计算器: 警告的结果是+/-无穷=>操作终止!"
+ ##ID:000406##
+ mcset $l "Calculator: This value is too high to invert (max. 0xFFFFFFFF)" \
+ "计算器: 此值倒置太高(max. 0xFFFFFFFF)"
+ ##ID:000407##
+ mcset $l "Calculator: ERROR (result value is out of allowed range)" \
+ "计算器: 错误(结果值超出允许的范围内)"
+ ##ID:000408##
+ mcset $l "Calculator: Unable to evaluate, result value is too high" \
+ "计算器:无法评估,结果值过高"
+ ##ID:000409##
+ mcset $l "Calculator: UNDO: previous state was: %s %s %s" \
+ "计算器: 撤消:以前的状态: %s %s %s"
+ ##ID:000410##
+ mcset $l "Calculator: REDO: previous state was: %s %s %s" \
+ "计算器: 重做: 以前的状态: %s %s %s"
+ ##ID:000411##
+ mcset $l "Calculator: Value is too high to convert, value deleted !" \
+ "计算器: 值过高转换,删除值!"
+ ##ID:000412##
+ mcset $l "Calculator: ERROR, result is too high (cannot be displayed)" \
+ "计算器: 错误,结果是太高(无法显示)"
+ ##ID:000413##
+ mcset $l "Calculator: ERROR, value is too high" \
+ "计算器: 错误,值过高"
+ ##ID:000414##
+ mcset $l "Buffer display" \
+ "显示缓冲区"
+ ##ID:000415##
+ mcset $l "Calculator buffer" \
+ "计算器缓冲区"
+ ##ID:000416##
+ mcset $l "Selected operation" \
+ "所选操作"
+ ##ID:000417##
+ mcset $l "Main display" \
+ "主萤幕"
+ ##ID:000418##
+ mcset $l "Numeric base" \
+ "Numeric base" ;# <-- NOT TRANSLATED YET
+ ##ID:000419##
+ mcset $l "Angle unit" \
+ "角度单位"
+ ##ID:000420##
+ mcset $l "Clear both displays" \
+ "清除两个显示器"
+ ##ID:000421##
+ mcset $l "Clear main display" \
+ "清除主显示器"
+ ##ID:000422##
+ mcset $l "Negate value in main display" \
+ "在主显示屏显示否定值"
+ ##ID:000423##
+ mcset $l "Memory bank %s" \
+ "记忆库 %s"
+ ##ID:000424##
+ mcset $l "Save content of main display to this memory bank %s" \
+ "主要展示内容保存这个记忆库 %s"
+ ##ID:000425##
+ mcset $l "Load content of this bank into main display" \
+ "主要展示加载内容的记忆库"
+ ##ID:000426##
+ mcset $l "Load content of memory bank %s into calculator main display" \
+ "加载内容的记忆库 %s 到计算器主显示屏"
+ ##ID:000427##
+ mcset $l "Timers preset" \
+ "预设定时器"
+ ##ID:000428##
+ mcset $l "Invalid numerical base: '%s'" \
+ "无效的数值基地: '%s'"
+ ##ID:000429##
+ mcset $l "Invalid angle unit: '%s'" \
+ "无效的角度单位: '%s'"
+ ##ID:000430##
+ mcset $l "Calculator - timers preset: you are trying to insert an invalid value" \
+ "计算器-定时器预设:您尝试插入一个无效值"
+ ##ID:000431##
+ mcset $l "Frequency \[kHz\]" \
+ "频率 \[kHz\]"
+ ##ID:000432##
+ mcset $l "Mode" \
+ "模式"
+ ##ID:000433##
+ mcset $l "Time \[us\]" \
+ "时间 \[us\]"
+ ##ID:000434##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:000435##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:000436##
+ mcset $l "OCT" \
+ "OCT" ;# <-- NOT TRANSLATED YET
+ ##ID:000437##
+ mcset $l "Repeats" \
+ "重复数" ;
+ ##ID:000438##
+ mcset $l "Correction" \
+ "Correction" ;# <-- NOT TRANSLATED YET
+ ##ID:000439##
+ mcset $l "Bit-wise AND" \
+ "Bit-wise AND" ;# <-- NOT TRANSLATED YET
+ ##ID:000440##
+ mcset $l "Bit-wise AND. Valid for integer operands only." \
+ "Bit-wise AND.唯一有效的操作数为整数."
+ ##ID:000441##
+ mcset $l "Sine" \
+ "正弦"
+ ##ID:000442##
+ mcset $l "Cosine" \
+ "余弦"
+ ##ID:000443##
+ mcset $l "Tangent" \
+ "正切"
+ ##ID:000444##
+ mcset $l "Bit-wise OR" \
+ "Bit-wise OR" ;# <-- NOT TRANSLATED YET
+ ##ID:000445##
+ mcset $l "Bit-wise OR. Valid for integer operands only." \
+ "Bit-wise OR. 唯一有效的操作数为整数."
+ ##ID:000446##
+ mcset $l "Arc sine" \
+ "Arc sine" ;# <-- NOT TRANSLATED YET
+ ##ID:000447##
+ mcset $l "Arc sine. Argument should be in the range \[-1,1\]." \
+ "Arc sine. 参数应该是在范围 \[-1,1\]."
+ ##ID:000448##
+ mcset $l "Arc cosine" \
+ "Arc cosine" ;# <-- NOT TRANSLATED YET
+ ##ID:000449##
+ mcset $l "Arc cosine. Argument should be in the range \[-1,1\]." \
+ "Arc cosine. 参数应该是在范围 \[-1,1\]."
+ ##ID:000450##
+ mcset $l "Arc tangent" \
+ "Arc tangent" ;# <-- NOT TRANSLATED YET
+ ##ID:000451##
+ mcset $l "Bit-wise NOT" \
+ "Bit-wise NOT" ;# <-- NOT TRANSLATED YET
+ ##ID:000452##
+ mcset $l "Bit-wise NOT. Valid for integer operands only." \
+ "Bit-wise NOT. 唯一有效的操作数为整数."
+ ##ID:000453##
+ mcset $l "Exponential of argument (e**arg)" \
+ "Exponential of argument (e**arg)" ;# <-- NOT TRANSLATED YET
+ ##ID:000454##
+ mcset $l "Square root" \
+ "Square root" ;# <-- NOT TRANSLATED YET
+ ##ID:000455##
+ mcset $l "Square root. Argument must be non-negative." \
+ "Square root. 参数必须为非负值."
+ ##ID:000456##
+ mcset $l "Power" \
+ "Power" ;# <-- NOT TRANSLATED YET
+ ##ID:000457##
+ mcset $l "Computes the value of x raised to the power y. If x is negative, y must be an integer value." \
+ "Computes the value of x raised to the power y. If x is negative, y must be an integer value." ;# <-- NOT TRANSLATED YET
+ ##ID:000458##
+ mcset $l "Bit-wise exclusive OR" \
+ "Bit-wise exclusive OR" ;# <-- NOT TRANSLATED YET
+ ##ID:000459##
+ mcset $l "Bit-wise exclusive OR. Valid for integer operands only." \
+ "Bit-wise exclusive OR. 唯一有效的操作数为整数."
+ ##ID:000460##
+ mcset $l "Base 10 logarithm" \
+ "Base 10 logarithm" ;# <-- NOT TRANSLATED YET
+ ##ID:000461##
+ mcset $l "Returns the base 10 logarithm of argument. Argument must be a positive value." \
+ "Returns the base 10 logarithm of argument. Argument must be a positive value." ;# <-- NOT TRANSLATED YET
+ ##ID:000462##
+ mcset $l "Natural logarithm" \
+ "取自然对数"
+ ##ID:000463##
+ mcset $l "Returns the natural logarithm of argument. Argument must be a positive value." \
+ "Returns the natural logarithm of argument. Argument must be a positive value." ;# <-- NOT TRANSLATED YET
+ ##ID:000464##
+ mcset $l "Constant Pi" \
+ "Pi常数"
+ ##ID:000465##
+ mcset $l "Right shift" \
+ "右移位"
+ ##ID:000466##
+ mcset $l "Right shift. Valid for integer operands only. A right shift always propagates the sign bit." \
+ "Right shift. Valid for integer operands only. A right shift always propagates the sign bit." ;# <-- NOT TRANSLATED YET
+ ##ID:000467##
+ mcset $l "Modulo" \
+ "取模"
+ ##ID:000468##
+ mcset $l "Computes remainder of integer division" \
+ "计算整数除法的余数"
+ ##ID:000469##
+ mcset $l "Undo last operation" \
+ "撤消最后一次操作"
+ ##ID:000470##
+ mcset $l "Undo last operation. Not all operations are supported." \
+ "撤消最后一次操作. 并非所有操作都支持."
+ ##ID:000471##
+ mcset $l "Take back last undo operation" \
+ "重做上次撤销的操作"
+ ##ID:000472##
+ mcset $l "Take back last undo operation. Not all operations are supported." \
+ "重做上次撤销的操作.并非所有操作都支持."
+}
+# innerwindow.tcl
+# ==============================================================================
+namespace eval InnerWindow {
+ ##ID:000473##
+ mcset $l "Shade/Unshade" \
+ "色彩/取消色彩"
+ ##ID:000474##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:000475##
+ mcset $l "Shade" \
+ "阴影"
+}
+# configdialogues.tcl
+# ==============================================================================
+namespace eval ::configDialogues::editor {
+ ##ID:000476##
+ mcset $l "Editor configuration - %s" \
+ "编辑器配置 - %s"
+ ##ID:000477##
+ mcset $l "Editor configuration" \
+ "编辑器配置"
+ ##ID:000478##
+ mcset $l "Editor" \
+ "编辑器"
+ ##ID:000479##
+ mcset $l "Editor selection" \
+ "编辑器选择"
+ ##ID:000480##
+ mcset $l "General" \
+ "常规"
+ ##ID:000481##
+ mcset $l "General configuration" \
+ "常规配置"
+ ##ID:000482##
+ mcset $l "Colors" \
+ "颜色"
+ ##ID:000483##
+ mcset $l "Various colors in editor" \
+ "多种颜色编辑器"
+ ##ID:000484##
+ mcset $l "Fonts" \
+ "字体"
+ ##ID:000485##
+ mcset $l "Fonts used by editor" \
+ "编辑器中使用的字体"
+ ##ID:000486##
+ mcset $l "Syntax highlight" \
+ "语法高亮"
+ ##ID:000487##
+ mcset $l "Source code highlighting" \
+ "源代码高亮"
+ ##ID:000488##
+ mcset $l "Apply" \
+ "应用"
+ ##ID:000489##
+ mcset $l "Ok" \
+ "确认"
+ ##ID:000490##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:000491##
+ mcset $l "Preferred editor:" \
+ "常用编辑器:"
+ ##ID:000492##
+ mcset $l "Native editor" \
+ "本机编辑器"
+ ##ID:000493##
+ mcset $l "(This change will take effect upon next start.)" \
+ "(此更改将在下次启动的效果.)"
+ ##ID:000494##
+ mcset $l "Editing" \
+ "正在编辑"
+ ##ID:000495##
+ mcset $l "File opening, saving, etc." \
+ "文件正在打开,保存等."
+ ##ID:000496##
+ mcset $l "Command line" \
+ "命令行"
+ ##ID:000497##
+ mcset $l "Auto brackets" \
+ "自动括号"
+ ##ID:000498##
+ mcset $l "When you type a left bracket, editor\nwill automatically insert right bracket" \
+ "当您输入一个左括号,编辑器\n会自动插入右括号"
+ ##ID:000499##
+ mcset $l "Indentation mode" \
+ "缩进模式"
+ ##ID:000500##
+ mcset $l "none" \
+ "无"
+ ##ID:000501##
+ mcset $l "normal" \
+ "正常"
+ ##ID:000502##
+ mcset $l "What to do when you press enter\n\tnone\t- start on the beginning of the next line\n\tnormal\t- keep indention of the previous line" \
+ "What to do when you press enter\n\tnone\t- start on the beginning of the next line\n\tnormal\t- keep indention of the previous line" ;# <-- NOT TRANSLATED YET
+ ##ID:004467##
+ mcset $l "Tab width" \
+ "Tab符宽度"
+ ##ID:004468##
+ mcset $l "Maximum width of the tab character, measured in number of spaces" \
+ "最大的TAB宽度,用空格数表示"
+ ##ID:000503##
+ mcset $l "Insert spaces instead of tabs" \
+ "插入空格以替代TAB符"
+ ##ID:000504##
+ mcset $l "Use spaces instead of tabs" \
+ "使用空格代替制表符"
+ ##ID:000505##
+ mcset $l "Number of spaces" \
+ "空格的数量"
+ ##ID:000506##
+ mcset $l "Number of spaces to use instead of tabs" \
+ "空格数,而不是使用制表符"
+ ##ID:000507##
+ mcset $l "Enable autocompletion" \
+ "启用自动完成功能"
+ ##ID:000508##
+ mcset $l "Enable popup-based autocompletion" \
+ "启用自动完成弹出"
+ ##ID:000509##
+ mcset $l "Highlight trailing space" \
+ "突出尾随空格"
+ ##ID:000510##
+ mcset $l "Show tab bar" \
+ "显示标签栏"
+ ##ID:000511##
+ mcset $l "Default encoding" \
+ "默认编码方式"
+ ##ID:000512##
+ mcset $l "When you open file with unknown encoding\nthis encoding will be used" \
+ "当您打开未知编码\n该文件将用于编码"
+ ##ID:000513##
+ mcset $l "Default EOL" \
+ "默认EOL"
+ ##ID:000514##
+ mcset $l "When you open file with unknown\nEOL (End Of Line) this EOL will be used" \
+ "当您打开未知\n EOL(行结束)文件将被用于这个停产"
+ ##ID:000515##
+ mcset $l "Autosave interval \[minutes\]" \
+ "自动保存时间间隔 \[分钟\]"
+ ##ID:000516##
+ mcset $l "Autosave interval in minutes (0 means disabled)" \
+ "自动保存时间间隔以分钟为单位 (0 means disabled)"
+ ##ID:000517##
+ mcset $l "Text area background" \
+ "文本区域的背景"
+ ##ID:000518##
+ mcset $l "Normal text" \
+ "普通文本"
+ ##ID:000519##
+ mcset $l "Selected text" \
+ "选定的文本"
+ ##ID:000520##
+ mcset $l "Current line" \
+ "当前行"
+ ##ID:000521##
+ mcset $l "Bookmark" \
+ "书签"
+ ##ID:000522##
+ mcset $l "Simulator line" \
+ "Simulator line" ;# <-- NOT TRANSLATED YET
+ ##ID:000523##
+ mcset $l "Breakpoint" \
+ "断点"
+ ##ID:000524##
+ mcset $l "Invalid breakpoint" \
+ "无效的断点"
+ ##ID:000525##
+ mcset $l "Line with an error" \
+ "行有错误"
+ ##ID:000526##
+ mcset $l "Trailing space" \
+ "后缘空白"
+ ##ID:000527##
+ mcset $l "Additional elements" \
+ "其他要素"
+ ##ID:000528##
+ mcset $l "Icon border background" \
+ "Icon border background" ;# <-- NOT TRANSLATED YET
+ ##ID:000529##
+ mcset $l "Line numbers background" \
+ "Line numbers background" ;# <-- NOT TRANSLATED YET
+ ##ID:000530##
+ mcset $l "Line numbers foreground" \
+ "Line numbers foreground" ;# <-- NOT TRANSLATED YET
+ ##ID:000531##
+ mcset $l "The Quick Brown Fox Jumps Over The Lazy Dog" \
+ "The Quick Brown Fox Jumps Over The Lazy Dog" ;# <-- NOT TRANSLATED YET
+ ##ID:000532##
+ mcset $l "Searching for available fonts ..." \
+ "正在搜索可用字体 ..."
+ ##ID:000533##
+ mcset $l "Assembler" \
+ "汇编器"
+ ##ID:000534##
+ mcset $l "C language" \
+ "C 语言"
+ ##ID:000535##
+ mcset $l "Code listing" \
+ "代码清单"
+ # Keep string length here!
+ ##ID:000536##
+ mcset $l {Color} \
+ {颜色}
+ # Keep string length here!
+ ##ID:000537##
+ mcset $l {Content} \
+ {内容}
+ ##ID:000538##
+ mcset $l "increment some register" \
+ "增加一些寄存器"
+ ##ID:000539##
+ mcset $l "close main loop" \
+ "关闭主循环"
+ ##ID:000540##
+ mcset $l "Comment" \
+ "注释"
+ ##ID:000541##
+ mcset $l "String" \
+ "字符串"
+ ##ID:000542##
+ mcset $l "macro Some value" \
+ "macro Some value" ;# <-- NOT TRANSLATED YET
+ ##ID:000543##
+ mcset $l "Select color - %s" \
+ "选择颜色 - %s"
+ ##ID:000544##
+ mcset $l "Invalid key: '%s'" \
+ "Invalid key: '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:000545##
+ mcset $l "Unable to use external embedded editor because rxvt-unicode is not available" \
+ "Unable to use external embedded editor because rxvt-unicode is not available" ;# <-- NOT TRANSLATED YET
+ ##ID:000546##
+ mcset $l "Program %s is not available. Using native editor." \
+ "程序 %s 不可用. 使用内置编辑器."
+ ##ID:000547##
+ mcset $l "Char" \
+ "字符"
+ ##ID:000548##
+ mcset $l "Hexadecimal number" \
+ "十六进制数"
+ ##ID:000549##
+ mcset $l "Octal number" \
+ "八进制数"
+ ##ID:000550##
+ mcset $l "Decimal number" \
+ "十进制数"
+ ##ID:000551##
+ mcset $l "Binary number" \
+ "二进制数"
+ ##ID:000552##
+ mcset $l "Constant" \
+ "常量"
+ ##ID:000553##
+ mcset $l "Generic number" \
+ "通用数"
+ ##ID:000554##
+ mcset $l "Control sequence" \
+ "Control sequence" ;# <-- NOT TRANSLATED YET
+ ##ID:000555##
+ mcset $l "Symbol" \
+ "符号"
+ ##ID:000556##
+ mcset $l "Operand separator" \
+ "Operand separator" ;# <-- NOT TRANSLATED YET
+ ##ID:000557##
+ mcset $l "Directive" \
+ "指令"
+ ##ID:000558##
+ mcset $l "Label" \
+ "标签"
+ ##ID:000559##
+ mcset $l "Instruction" \
+ "指令"
+ ##ID:000560##
+ mcset $l "SFR register" \
+ "SFR寄存器"
+ ##ID:000561##
+ mcset $l "Indirect address" \
+ "间接寻址"
+ ##ID:000562##
+ mcset $l "Immediate char" \
+ "Immediate char" ;# <-- NOT TRANSLATED YET
+ ##ID:000563##
+ mcset $l "Immediate hex" \
+ "Immediate hex" ;# <-- NOT TRANSLATED YET
+ ##ID:000564##
+ mcset $l "Immediate oct" \
+ "Immediate oct" ;# <-- NOT TRANSLATED YET
+ ##ID:000565##
+ mcset $l "Immediate dec" \
+ "Immediate dec" ;# <-- NOT TRANSLATED YET
+ ##ID:000566##
+ mcset $l "Immediate bin" \
+ "Immediate bin" ;# <-- NOT TRANSLATED YET
+ ##ID:000567##
+ mcset $l "Immediate const" \
+ "Immediate const" ;# <-- NOT TRANSLATED YET
+ ##ID:000568##
+ mcset $l "Immediate generic" \
+ "Immediate generic" ;# <-- NOT TRANSLATED YET
+ ##ID:000569##
+ mcset $l "Macro instruction" \
+ "宏指令"
+ ##ID:000570##
+ mcset $l "Keyword" \
+ "关键字"
+ ##ID:000571##
+ mcset $l "Data type" \
+ "数据类型"
+ ##ID:000572##
+ mcset $l "Decimal" \
+ "十进制"
+ ##ID:000573##
+ mcset $l "Hexadecimal" \
+ "十六进制"
+ ##ID:000574##
+ mcset $l "Octal" \
+ "八进制"
+ ##ID:000575##
+ mcset $l "Float" \
+ "浮点型"
+ ##ID:000576##
+ mcset $l "String char" \
+ "String char" ;# <-- NOT TRANSLATED YET
+ ##ID:000577##
+ mcset $l "Bracket" \
+ "Bracket" ;# <-- NOT TRANSLATED YET
+ ##ID:000578##
+ mcset $l "Preprocessor" \
+ "预编译器"
+ ##ID:000579##
+ mcset $l "Preprocessor lib." \
+ "预编译库."
+ ##ID:000580##
+ mcset $l "Doxygen: Comment" \
+ "Doxygen: Comment" ;# <-- NOT TRANSLATED YET
+ ##ID:000581##
+ mcset $l "Doxygen: Tag" \
+ "Doxygen: Tag" ;# <-- NOT TRANSLATED YET
+ ##ID:000582##
+ mcset $l "Doxygen: Word" \
+ "Doxygen: Word" ;# <-- NOT TRANSLATED YET
+ ##ID:000583##
+ mcset $l "Doxygen: Name" \
+ "Doxygen: Name" ;# <-- NOT TRANSLATED YET
+ ##ID:000584##
+ mcset $l "Doxygen: HTML" \
+ "Doxygen: HTML" ;# <-- NOT TRANSLATED YET
+ ##ID:000585##
+ mcset $l "Doxygen: HTML arg." \
+ "Doxygen: HTML arg." ;# <-- NOT TRANSLATED YET
+ ##ID:000586##
+ mcset $l "Doxygen: HTML val." \
+ "Doxygen: HTML val." ;# <-- NOT TRANSLATED YET
+ ##ID:000587##
+ mcset $l "Value" \
+ "Value" ;# <-- NOT TRANSLATED YET
+ ##ID:000588##
+ mcset $l "Processor code" \
+ "Processor code" ;# <-- NOT TRANSLATED YET
+ ##ID:000589##
+ mcset $l "Address" \
+ "Address" ;# <-- NOT TRANSLATED YET
+ ##ID:000590##
+ mcset $l "Line number" \
+ "Line number" ;# <-- NOT TRANSLATED YET
+ ##ID:000591##
+ mcset $l "Macro level" \
+ "Macro level" ;# <-- NOT TRANSLATED YET
+ ##ID:000592##
+ mcset $l "Inclusion level" \
+ "Inclusion level" ;# <-- NOT TRANSLATED YET
+ ##ID:000593##
+ mcset $l "Error / Warning" \
+ "错误 / 警告"
+ ##ID:000594##
+ mcset $l "Message" \
+ "消息"
+}
+namespace eval ::configDialogues::compiler {
+ ##ID:000595##
+ mcset $l "Compiler configuration" \
+ "编译器配置"
+ ##ID:000596##
+ mcset $l "Assembly language" \
+ "汇编语言"
+ ##ID:000597##
+ mcset $l "Configure compiler for assembly language" \
+ "汇编语言的编译器配置"
+ ##ID:000598##
+ mcset $l "C language -- SDCC" \
+ "C语言 -- SDCC"
+ ##ID:000599##
+ mcset $l "GNU make utility" \
+ "GNU make 工具"
+ ##ID:000600##
+ mcset $l "Make utility is not available, please install GNU make and restart the IDE." \
+ "Make工具不存在, 请安装GNU make然后重启程序."
+ ##ID:000601##
+ mcset $l "Use this Makefile instead of calling C compiler directly:" \
+ "使用这个Makefile而不是直接调用C编译器:"
+ ##ID:000602##
+ mcset $l "Makefile:" \
+ "Makefile:" ;# <-- NOT TRANSLATED YET
+ ##ID:004491##
+ mcset $l "Targets:" \
+ "目标:"
+ ##ID:004492##
+ mcset $l "Options:" \
+ "选项:"
+ ##ID:000603##
+ mcset $l "Clear the entrybox" \
+ "清除输入框中内容"
+ ##ID:000604##
+ mcset $l "Select Makefile" \
+ "选择 Makefile"
+ ##ID:000605##
+ mcset $l "Compiler" \
+ "编译器"
+ ##ID:000606##
+ mcset $l "Reset to defaults" \
+ "重设为默认值"
+ ##ID:000607##
+ mcset $l "Reset all settings to defaults" \
+ "重设所有设置为默认值"
+ ##ID:000608##
+ mcset $l "Ok" \
+ "确定" ;
+ ##ID:000609##
+ mcset $l "Commit new settings" \
+ "应用新的设置"
+ ##ID:000610##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:000611##
+ mcset $l "Take changes back and close dialog" \
+ "应用并关闭窗口"
+ ##ID:000612##
+ mcset $l "Configure compiler - %s" \
+ "配置编译器 - %s"
+ ##ID:000613##
+ mcset $l "General" \
+ "常规"
+ ##ID:000614##
+ mcset $l "Code generation" \
+ "代码生成"
+ ##ID:000615##
+ mcset $l "Optimization" \
+ "优化"
+ ##ID:000616##
+ mcset $l "Linker" \
+ "链接器"
+ ##ID:000617##
+ mcset $l "Custom" \
+ "自定义"
+ ##ID:000618##
+ mcset $l "Standard:" \
+ "标准:"
+ ##ID:000619##
+ mcset $l "Include path" \
+ "Include 路径"
+ ##ID:000620##
+ mcset $l "Add to the include path, as in -Ipath\nPaths are separated by semicolons (`;')" \
+ "Add to the include path, as in -Ipath\nPaths are separated by semicolons (`;')" ;# <-- NOT TRANSLATED YET
+ ##ID:000621##
+ mcset $l "Disable warning" \
+ "禁用警告"
+ ##ID:000622##
+ mcset $l "Disable specific warning (--disable-warning)\nNumbers are separated by semicolons (`;')" \
+ "Disable specific warning (--disable-warning)\nNumbers are separated by semicolons (`;')" ;# <-- NOT TRANSLATED YET
+ ##ID:000623##
+ mcset $l "Model:" \
+ "Model:" ;# <-- NOT TRANSLATED YET
+ ##ID:000624##
+ mcset $l "External data space is used" \
+ "使用外部数据空间"
+ ##ID:000625##
+ mcset $l "External paged data space is used" \
+ "External paged data space is used" ;# <-- NOT TRANSLATED YET
+ ##ID:000626##
+ mcset $l "Internal data space is used" \
+ "Internal data space is used" ;# <-- NOT TRANSLATED YET
+ ##ID:000627##
+ mcset $l "Use this name for the code segment" \
+ "Use this name for the code segment" ;# <-- NOT TRANSLATED YET
+ ##ID:000628##
+ mcset $l "Use this name for the const segment" \
+ "Use this name for the const segment" ;# <-- NOT TRANSLATED YET
+ ##ID:000629##
+ mcset $l "Stack:" \
+ "堆栈:"
+ ##ID:000630##
+ mcset $l "Include the given library in the link\nPaths are separated by semicolons (`;')" \
+ "Include the given library in the link\nPaths are separated by semicolons (`;')" ;# <-- NOT TRANSLATED YET
+ ##ID:000631##
+ mcset $l "Add the next field to the library search path\nPaths are separated by semicolons (`;')" \
+ "Add the next field to the library search path\nPaths are separated by semicolons (`;')" ;# <-- NOT TRANSLATED YET
+ ##ID:000632##
+ mcset $l "Use this path to search for libraries" \
+ "Use this path to search for libraries" ;# <-- NOT TRANSLATED YET
+ ##ID:000633##
+ mcset $l "External Ram start location" \
+ "External Ram start location" ;# <-- NOT TRANSLATED YET
+ ##ID:000634##
+ mcset $l "External Stack start location" \
+ "External Stack start location" ;# <-- NOT TRANSLATED YET
+ ##ID:000635##
+ mcset $l "Code Segment Location" \
+ "代码段的位置"
+ ##ID:000636##
+ mcset $l "Stack pointer initial value" \
+ "Stack pointer initial value" ;# <-- NOT TRANSLATED YET
+ ##ID:000637##
+ mcset $l "Direct data start location" \
+ "Direct data start location" ;# <-- NOT TRANSLATED YET
+ ##ID:000638##
+ mcset $l "Tells the linker to allocate this space for stack" \
+ "Tells the linker to allocate this space for stack" ;# <-- NOT TRANSLATED YET
+ ##ID:000641##
+ mcset $l "Preferred assembler:" \
+ "汇编首选项:"
+ ##ID:000642##
+ mcset $l "Notes to assemblers:\n" \
+ "汇编器注意事项:\n"
+ ##ID:000643##
+ mcset $l " a) MCU 8051 IDE has its own native assembler\n" \
+ " a) MCU 8051 IDE 拥有自己的汇编器了\n" ;
+ ##ID:000644##
+ mcset $l " b) ASEM-51 is a great assembler written by W.W. Heinz.\n" \
+ " b) ASEM-51 is a great assembler written by W.W. Heinz.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000645##
+ mcset $l " You can find it at http://plit.de/asem-51/home.htm\n" \
+ " 您可以在 http://plit.de/asem-51/home.htm 找到\n" ;
+ ##ID:000646##
+ mcset $l " c) ASL: http://linux.maruhn.com/sec/asl.html\n" \
+ " c) ASL: http://linux.maruhn.com/sec/asl.html\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000647##
+ mcset $l " d) AS31: http://www.pjrc.com/tech/8051/\n" \
+ " d) AS31: http://www.pjrc.com/tech/8051/\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000648##
+ mcset $l "MCU 8051 IDE native assembler - Sophisticated but slow" \
+ "MCU 8051 IDE native assembler - Sophisticated but slow" ;# <-- NOT TRANSLATED YET
+ ##ID:000649##
+ mcset $l "Sophisticated and very fast assembler written by W.W. Heinz" \
+ "Sophisticated and very fast assembler written by W.W. Heinz" ;# <-- NOT TRANSLATED YET
+ ##ID:000650##
+ mcset $l "Multiplatform assembler written by Alfred Arnold" \
+ "Multiplatform assembler written by Alfred Arnold" ;# <-- NOT TRANSLATED YET
+ ##ID:000651##
+ mcset $l "Simple 8051 assembler" \
+ "Simple 8051 assembler" ;# <-- NOT TRANSLATED YET
+ ##ID:000652##
+ mcset $l "Generate an object file in absolute OMF-51 format" \
+ "Generate an object file in absolute OMF-51 format" ;# <-- NOT TRANSLATED YET
+ ##ID:000653##
+ mcset $l "Output additional column numbers after the line numbers of program error messages" \
+ "Output additional column numbers after the line numbers of program error messages" ;# <-- NOT TRANSLATED YET
+ ##ID:000654##
+ mcset $l "Output additional product, version, and error summary information" \
+ "Output additional product, version, and error summary information" ;# <-- NOT TRANSLATED YET
+ ##ID:000655##
+ mcset $l "Generate MCU 8051 IDE debug file" \
+ "生成 MCU 8051 IDE 调试文件"
+ ##ID:000656##
+ mcset $l "Generate <file>.adb (MCU 8051 IDE Assembler Debug File) from <file>.lst" \
+ "Generate <file>.adb (MCU 8051 IDE Assembler Debug File) from <file>.lst" ;# <-- NOT TRANSLATED YET
+ ##ID:000657##
+ mcset $l "Include paths:" \
+ "Include 路径:"
+ ##ID:000658##
+ mcset $l "Option -i\nSeparate directories by colons (`:')" \
+ "Option -i\nSeparate directories by colons (`:')" ;# <-- NOT TRANSLATED YET
+ ##ID:000659##
+ mcset $l "Custom options:" \
+ "自定义选项:"
+ ##ID:000660##
+ mcset $l "Generate a listing file, option `-l'" \
+ "生成一个列表文件,选项 `-l'"
+ ##ID:000661##
+ mcset $l "This option tells the assembler to generate a listing file.\n\nTHIS OPTION IS REQUIRED BY THIS IDE TO GENERATE DEBUG FILE !" \
+ "This option tells the assembler to generate a listing file.\n\nTHIS OPTION IS REQUIRED BY THIS IDE TO GENERATE DEBUG FILE !" ;# <-- NOT TRANSLATED YET
+ ##ID:000662##
+ mcset $l "Generate <file>.adb (MCU 8051 IDE Assembler Debug File)\nfrom <file>.lst" \
+ "Generate <file>.adb (MCU 8051 IDE Assembler Debug File)\nfrom <file>.lst" ;# <-- NOT TRANSLATED YET
+ ##ID:000663##
+ mcset $l "This options specifies the output format that is to be used.\n\nSee AS31 manual page for more details ..." \
+ "This options specifies the output format that is to be used.\n\nSee AS31 manual page for more details ..." ;# <-- NOT TRANSLATED YET
+ ##ID:000664##
+ mcset $l "This option specifies a format specific string which is\npassed to the format generator. Both format \"tdr\" and the\nsrecord formats use this option." \
+ "This option specifies a format specific string which is\npassed to the format generator. Both format \"tdr\" and the\nsrecord formats use this option." ;# <-- NOT TRANSLATED YET
+ ##ID:000665##
+ mcset $l "Change the data structure that is internally used to store\nthe symbol table. By default, AS uses binary trees to store\nmacro and symbol definitions. Turning this option on will\nchange this to AVL-balanced trees. Depending on the ratio\nof symbol entries and lookups, this might speed up assembly.\nUsing AVL-balanced trees helps also reducing the stack usage,\nwhich is however irrelevant for the C version of AS." \
+ "Change the data structure that is internally used to store\nthe symbol table. By default, AS uses binary trees to store\nmacro and symbol definitions. Turning this option on will\nchange this to AVL-balanced trees. Depending on the ratio\nof symbol entries and lookups, this might speed up assembly.\nUsing AVL-balanced trees helps also reducing the stack usage,\nwhich is however irrelevant for the C version of AS." ;# <-- NOT TRANSLATED YET
+ ##ID:000666##
+ mcset $l "Instruct AS to write out the shared symbol definitions in\na format suitable for including into an AS assembler program.\nThe file's name is constructed by replacing the source file's\nextension with '.inc'. See the user manual for more\ninformation about symbol sharing." \
+ "Instruct AS to write out the shared symbol definitions in\na format suitable for including into an AS assembler program.\nThe file's name is constructed by replacing the source file's\nextension with '.inc'. See the user manual for more\ninformation about symbol sharing." ;# <-- NOT TRANSLATED YET
+ ##ID:000667##
+ mcset $l "Add a cross reference table to the assembler listing. A cross\nreference table lists all symbols that have been referenced\nat least once during assembly, including the source line\nnumber(s) and count of every reference. This option only makes\nsense when the generation of an assembly listing has been\nturned on via the -L or -l parameters. " \
+ "Add a cross reference table to the assembler listing. A cross\nreference table lists all symbols that have been referenced\nat least once during assembly, including the source line\nnumber(s) and count of every reference. This option only makes\nsense when the generation of an assembly listing has been\nturned on via the -L or -l parameters. " ;# <-- NOT TRANSLATED YET
+ ##ID:000668##
+ mcset $l "Instruct AS to write out the shared symbol definitions in a\nformat suitable for including into a C program. The file's\nname is constructed by replacing the source file's extension\nwith '.h'. See the user manual for more information about\nsymbol sharing." \
+ "Instruct AS to write out the shared symbol definitions in a\nformat suitable for including into a C program. The file's\nname is constructed by replacing the source file's extension\nwith '.h'. See the user manual for more information about\nsymbol sharing." ;# <-- NOT TRANSLATED YET
+ ##ID:000669##
+ mcset $l "Force AS to print all hexadecimal constants with lowercase\nletters, rather than with uppercase letters A..F which is\nthe default." \
+ "Force AS to print all hexadecimal constants with lowercase\nletters, rather than with uppercase letters A..F which is\nthe default." ;# <-- NOT TRANSLATED YET
+ ##ID:000670##
+ mcset $l "Add an include file list to the assembly listing. An include\nfile list contains all files that have been included while\nassembling the source files, including multiple and nested\ninclusion. Nesting of inclusion is identified by different\nindention. This option only makes sense when the generation of\nan assembly listing has been turned on via the -L or -l parameters." \
+ "Add an include file list to the assembly listing. An include\nfile list contains all files that have been included while\nassembling the source files, including multiple and nested\ninclusion. Nesting of inclusion is identified by different\nindention. This option only makes sense when the generation of\nan assembly listing has been turned on via the -L or -l parameters." ;# <-- NOT TRANSLATED YET
+ ##ID:000671##
+ mcset $l "Turn on generation of an assembly listing and send it to a\nfile whose name is constructed by replacing the source\nfile's extension with '.lst'." \
+ "Turn on generation of an assembly listing and send it to a\nfile whose name is constructed by replacing the source\nfile's extension with '.lst'." ;# <-- NOT TRANSLATED YET
+ ##ID:000672##
+ mcset $l "Turn on generation of a macro definition file. A macro\ndefinition file is a file that contains all macro definitions\nthat have been detected during assembly, in a format suitable\nfor an inclusion into another file. The macro definition file's\nname is constructed by replacing the source file's extension\nwith '.mac'." \
+ "Turn on generation of a macro definition file. A macro\ndefinition file is a file that contains all macro definitions\nthat have been detected during assembly, in a format suitable\nfor an inclusion into another file. The macro definition file's\nname is constructed by replacing the source file's extension\nwith '.mac'." ;# <-- NOT TRANSLATED YET
+ ##ID:000673##
+ mcset $l "Turn on generation of a macro output file. A macro output\nfile contains the intermediate source code that remains after\nmacro expansion and conditional assembly. The macro output\nfile's name is constructed by replacing the source file's\nextension with '.i'." \
+ "Turn on generation of a macro output file. A macro output\nfile contains the intermediate source code that remains after\nmacro expansion and conditional assembly. The macro output\nfile's name is constructed by replacing the source file's\nextension with '.i'." ;# <-- NOT TRANSLATED YET
+ ##ID:000674##
+ mcset $l "Force AS to extend all error and warning messages with their\ninternal error resp. warning number." \
+ "Force AS to extend all error and warning messages with their\ninternal error resp. warning number." ;# <-- NOT TRANSLATED YET
+ ##ID:000675##
+ mcset $l "Turn on silent assembly mode. In silent compilation mode, AS\nwill not do any console output except for warning and\nerror messages." \
+ "Turn on silent assembly mode. In silent compilation mode, AS\nwill not do any console output except for warning and\nerror messages." ;# <-- NOT TRANSLATED YET
+ ##ID:000676##
+ mcset $l "Add a section list to the assembly listing. A section list\ncontains all sections that have been defined in the source\nfiles, marking their nesting level by different levels of\nindentation. This option only makes sense when the generation\nof an assembly listing has been turned on via the\n-L or -l parameters." \
+ "Add a section list to the assembly listing. A section list\ncontains all sections that have been defined in the source\nfiles, marking their nesting level by different levels of\nindentation. This option only makes sense when the generation\nof an assembly listing has been turned on via the\n-L or -l parameters." ;# <-- NOT TRANSLATED YET
+ ##ID:000677##
+ mcset $l "Tell AS to do additional bookkeeping about which address\nranges have been used by the assembled program. This option\nenables the detection of overlapping memory usage. If an\nassembly listing has been turned on via the -L or -l parameters,\nit will also contain a list of all used memory areas." \
+ "Tell AS to do additional bookkeeping about which address\nranges have been used by the assembled program. This option\nenables the detection of overlapping memory usage. If an\nassembly listing has been turned on via the -L or -l parameters,\nit will also contain a list of all used memory areas." ;# <-- NOT TRANSLATED YET
+ ##ID:000678##
+ mcset $l "Force AS to operate in case-sensitive mode. By default,\nnames of symbols, macros, user-defined functions and sections\nare treated in a case-insensitive manner." \
+ "Force AS to operate in case-sensitive mode. By default,\nnames of symbols, macros, user-defined functions and sections\nare treated in a case-insensitive manner." ;# <-- NOT TRANSLATED YET
+ ##ID:000679##
+ mcset $l "Suppress output of warnings." \
+ "禁止输出警告."
+ ##ID:000680##
+ mcset $l "Turn on extended error reporting. With extended error\nreporting, several error and warning messages will also\nprint the item that created the message, e.g. the name of\nan unknown instruction. When this option is given twice,\nthe erroneous source line is additinally printed." \
+ "Turn on extended error reporting. With extended error\nreporting, several error and warning messages will also\nprint the item that created the message, e.g. the name of\nan unknown instruction. When this option is given twice,\nthe erroneous source line is additinally printed." ;# <-- NOT TRANSLATED YET
+ ##ID:000681##
+ mcset $l "Generate IHEX file" \
+ "生成IHEX文件"
+ ##ID:000682##
+ mcset $l "Use program p2hex to convert <file>.p to <file>.hex" \
+ "Use program p2hex to convert <file>.p to <file>.hex" ;# <-- NOT TRANSLATED YET
+ ##ID:000683##
+ mcset $l "Generate <file>.adb (MCU 8051 IDE Assembler Debug File)\nfrom <file>.hex and <file>.map" \
+ "Generate <file>.adb (MCU 8051 IDE Assembler Debug File)\nfrom <file>.hex and <file>.map" ;# <-- NOT TRANSLATED YET
+ ##ID:000684##
+ mcset $l "Set the target processor to <name>.\nUse this option if the source file does\nnot contain a CPU statement." \
+ "Set the target processor to <name>.\nUse this option if the source file does\nnot contain a CPU statement." ;# <-- NOT TRANSLATED YET
+ ##ID:000685##
+ mcset $l "-g \[MAP|Atmel|NoICE\]\n\tInstruct AS to write an additional file containing\n\tdebug information. This information covers the symbol\n\ttable and the relation between source line numbers\n\tand machine addresses. The argument specifies whether\n\tdebug info shall be written in AS's own MAP format,\n\tthe object format for Atmel's AVR tools, or a command\n\tfile suitable for John Hartman's NoICE. If no argument\n\tis given, MAP will be chosen. The file's name is\n\tconstructed by replacing the source file's extension\n\twith '.map', '.obj', or '.noi' respectively.\n\nMCU 8051 IDE requires MAP to be selected\nhere to generate debug file" \
+ "-g \[MAP|Atmel|NoICE\]\n\tInstruct AS to write an additional file containing\n\tdebug information. This information covers the symbol\n\ttable and the relation between source line numbers\n\tand machine addresses. The argument specifies whether\n\tdebug info shall be written in AS's own MAP format,\n\tthe object format for Atmel's AVR tools, or a command\n\tfile suitable for John Hartman's NoICE. If no argument\n\tis given, MAP will be chosen. The file's name is\n\tconstructed by replacing the source file's extension\n\twith '.map', '.obj', or '.noi' respectively.\n\nMCU 8051 IDE requires MAP to be selected\nhere to generate debug file" ;# <-- NOT TRANSLATED YET
+ ##ID:000686##
+ mcset $l "-r \[pass number\]\n\tTell AS to output warnings when a situation appears\n\tin a source file that forces another pass of assembly.\n\tSuch situations either take place when a symbol is\n\tundefined in the first pass or a symbol's value has\n\tchanged compared to the previous pass. This option\n\tis useful to track down sources of excessive\n\tmulti-passing, but be aware that it might yield a\n\tfairly large number of warnings, especially in the\n\tfirst pass. Optionally, a pass number may be added\n\tto this option to inhibit output until a certain\n\tpass is reached." \
+ "-r \[pass number\]\n\tTell AS to output warnings when a situation appears\n\tin a source file that forces another pass of assembly.\n\tSuch situations either take place when a symbol is\n\tundefined in the first pass or a symbol's value has\n\tchanged compared to the previous pass. This option\n\tis useful to track down sources of excessive\n\tmulti-passing, but be aware that it might yield a\n\tfairly large number of warnings, especially in the\n\tfirst pass. Optionally, a pass number may be added\n\tto this option to inhibit output until a certain\n\tpass is reached." ;# <-- NOT TRANSLATED YET
+ ##ID:000687##
+ mcset $l "-i <path\[:path...\]>\tAdd new entries to the list of paths that are\n\tsearched for include files. New entries are\n\tprepended to the current include path list,\n\tso if multiple paths are given with one\n\tcommand-line parameter, they will be entered\n\tinto the path list in reverse order." \
+ "-i <path\[:path...\]>\tAdd new entries to the list of paths that are\n\tsearched for include files. New entries are\n\tprepended to the current include path list,\n\tso if multiple paths are given with one\n\tcommand-line parameter, they will be entered\n\tinto the path list in reverse order." ;# <-- NOT TRANSLATED YET
+ ##ID:000688##
+ mcset $l "Trace calls to the preprocessor, assembler and linker" \
+ "Trace calls to the preprocessor, assembler and linker" ;# <-- NOT TRANSLATED YET
+ ##ID:000689##
+ mcset $l "Execute verbosely. Show sub commands as they are run" \
+ "Execute verbosely. Show sub commands as they are run" ;# <-- NOT TRANSLATED YET
+ ##ID:000690##
+ mcset $l "Compile only; do not assemble or link" \
+ "Compile only; do not assemble or link" ;# <-- NOT TRANSLATED YET
+ ##ID:000691##
+ mcset $l "Compile and assemble, but do not link" \
+ "Compile and assemble, but do not link" ;# <-- NOT TRANSLATED YET
+ ##ID:000692##
+ mcset $l "Preprocess only, do not compile" \
+ "只允许预编译器, 不编译"
+ ##ID:000693##
+ mcset $l "Act in c1 mode. The standard input is preprocessed code, the output is assembly code." \
+ "Act in c1 mode. The standard input is preprocessed code, the output is assembly code." ;# <-- NOT TRANSLATED YET
+ ##ID:000694##
+ mcset $l "Display the directories in the compiler's search path" \
+ "显示编译器的搜索路径"
+ ##ID:000695##
+ mcset $l "Send errors to stdout instead of stderr" \
+ "将错误报告发送到stdout而不是stderr"
+ ##ID:000696##
+ mcset $l "Do not include the standard library directory in the search path" \
+ "不包括在标准库的搜索路径目录"
+ ##ID:000697##
+ mcset $l "Disable some of the more pedantic warnings" \
+ "禁用一些迂腐警告"
+ ##ID:000698##
+ mcset $l "Enable debugging symbol output" \
+ "启用调试符号输出"
+ ##ID:000699##
+ mcset $l "Display complexity of compiled functions" \
+ "Display complexity of compiled functions" ;# <-- NOT TRANSLATED YET
+ ##ID:000700##
+ mcset $l "Permit '\$' as an identifier character" \
+ "Permit '\$' as an identifier character" ;# <-- NOT TRANSLATED YET
+ ##ID:000701##
+ mcset $l "Make \"char\" unsigned by default" \
+ "Make \"char\" unsigned by default" ;# <-- NOT TRANSLATED YET
+ ##ID:000702##
+ mcset $l "Use C89 standard only" \
+ "Use C89 standard only" ;# <-- NOT TRANSLATED YET
+ ##ID:000703##
+ mcset $l "Use C89 standard with SDCC extensions" \
+ "Use C89 standard with SDCC extensions" ;# <-- NOT TRANSLATED YET
+ ##ID:000704##
+ mcset $l "Use C99 standard only (incomplete)" \
+ "Use C99 standard only (incomplete)" ;# <-- NOT TRANSLATED YET
+ ##ID:000705##
+ mcset $l "Use C99 standard with SDCC extensions (incomplete)" \
+ "Use C99 standard with SDCC extensions (incomplete)" ;# <-- NOT TRANSLATED YET
+ ##ID:000706##
+ mcset $l "Use external stack" \
+ "使用外部堆栈"
+ ##ID:000707##
+ mcset $l "Use reenterant calls on the int and long support functions" \
+ "Use reenterant calls on the int and long support functions" ;# <-- NOT TRANSLATED YET
+ ##ID:000708##
+ mcset $l "Use reenterant calls on the float support functions" \
+ "Use reenterant calls on the float support functions" ;# <-- NOT TRANSLATED YET
+ ##ID:000709##
+ mcset $l "Issue a return after main()" \
+ "Issue a return after main()" ;# <-- NOT TRANSLATED YET
+ ##ID:000710##
+ mcset $l "Use movc instead of movx to read xram (xdata)" \
+ "Use movc instead of movx to read xram (xdata)" ;# <-- NOT TRANSLATED YET
+ ##ID:000711##
+ mcset $l "On supported ports, generate extra profiling information" \
+ "On supported ports, generate extra profiling information" ;# <-- NOT TRANSLATED YET
+ ##ID:000712##
+ mcset $l "Leave out the frame pointer." \
+ "Leave out the frame pointer." ;# <-- NOT TRANSLATED YET
+ ##ID:000713##
+ mcset $l "Callee will always save registers used" \
+ "Callee will always save registers used" ;# <-- NOT TRANSLATED YET
+ ##ID:000714##
+ mcset $l "Insert call to function __stack_probe at each function prologue" \
+ "Insert call to function __stack_probe at each function prologue" ;# <-- NOT TRANSLATED YET
+ ##ID:000715##
+ mcset $l "Use Bank1 for parameter passing" \
+ "Use Bank1 for parameter passing" ;# <-- NOT TRANSLATED YET
+ ##ID:000716##
+ mcset $l "Don't memcpy initialized xram from code" \
+ "Don't memcpy initialized xram from code" ;# <-- NOT TRANSLATED YET
+ ##ID:000717##
+ mcset $l "Don't include c-code as comments in the asm file" \
+ "Don't include c-code as comments in the asm file" ;# <-- NOT TRANSLATED YET
+ ##ID:000718##
+ mcset $l "Don't include peephole optimizer comments" \
+ "Don't include peephole optimizer comments" ;# <-- NOT TRANSLATED YET
+ ##ID:000719##
+ mcset $l "Include code generator comments" \
+ "Include code generator comments" ;# <-- NOT TRANSLATED YET
+ ##ID:000720##
+ mcset $l "Make short 8 bits (for old times sake)" \
+ "Make short 8 bits (for old times sake)" ;# <-- NOT TRANSLATED YET
+ ##ID:000721##
+ mcset $l "Stack automatic variables" \
+ "Stack automatic variables" ;# <-- NOT TRANSLATED YET
+ ##ID:000722##
+ mcset $l "Disable overlaying leaf function auto variables" \
+ "Disable overlaying leaf function auto variables" ;# <-- NOT TRANSLATED YET
+ ##ID:000723##
+ mcset $l "Disable the GCSE optimisation" \
+ "Disable the GCSE optimisation" ;# <-- NOT TRANSLATED YET
+ ##ID:000724##
+ mcset $l "Disable label optimisation" \
+ "Disable label optimisation" ;# <-- NOT TRANSLATED YET
+ ##ID:000725##
+ mcset $l "Disable optimisation of invariants" \
+ "Disable optimisation of invariants" ;# <-- NOT TRANSLATED YET
+ ##ID:000726##
+ mcset $l "Disable loop variable induction" \
+ "Disable loop variable induction" ;# <-- NOT TRANSLATED YET
+ ##ID:000727##
+ mcset $l "Don't generate boundary check for jump tables" \
+ "Don't generate boundary check for jump tables" ;# <-- NOT TRANSLATED YET
+ ##ID:000728##
+ mcset $l "Disable the loop reverse optimisation" \
+ "Disable the loop reverse optimisation" ;# <-- NOT TRANSLATED YET
+ ##ID:000729##
+ mcset $l "Disable the peephole assembly file optimisation" \
+ "Disable the peephole assembly file optimisation" ;# <-- NOT TRANSLATED YET
+ ##ID:000730##
+ mcset $l "On some ports, disable passing some parameters in registers" \
+ "On some ports, disable passing some parameters in registers" ;# <-- NOT TRANSLATED YET
+ ##ID:000731##
+ mcset $l "Enable peephole optimization on inline assembly" \
+ "Enable peephole optimization on inline assembly" ;# <-- NOT TRANSLATED YET
+ ##ID:000732##
+ mcset $l "Optimize for code speed rather than size" \
+ "Optimize for code speed rather than size" ;# <-- NOT TRANSLATED YET
+ ##ID:000733##
+ mcset $l "Optimize for code size rather than speed" \
+ "Optimize for code size rather than speed" ;# <-- NOT TRANSLATED YET
+ ##ID:000734##
+ mcset $l "Output in Intel hex format" \
+ "Output in Intel hex format" ;# <-- NOT TRANSLATED YET
+ ##ID:000735##
+ mcset $l "Output in S19 hex format" \
+ "Output in S19 hex format" ;# <-- NOT TRANSLATED YET
+ ##ID:000736##
+ mcset $l "Output" \
+ "Output" ;# <-- NOT TRANSLATED YET
+ ##ID:000737##
+ mcset $l "Messages and output code" \
+ "Messages and output code" ;# <-- NOT TRANSLATED YET
+ ##ID:000738##
+ mcset $l "Directives" \
+ "Directives" ;# <-- NOT TRANSLATED YET
+ ##ID:000739##
+ mcset $l "Which directives accept and which do not" \
+ "Which directives accept and which do not" ;# <-- NOT TRANSLATED YET
+ ##ID:000740##
+ mcset $l "Source" \
+ "Source" ;# <-- NOT TRANSLATED YET
+ ##ID:000741##
+ mcset $l "Use value defined in source code" \
+ "Use value defined in source code" ;# <-- NOT TRANSLATED YET
+ ##ID:000742##
+ mcset $l "Always" \
+ "总是"
+ ##ID:000743##
+ mcset $l "Generate always" \
+ "总是生成"
+ ##ID:000744##
+ mcset $l "Never" \
+ "从不"
+ ##ID:000745##
+ mcset $l "Never generate" \
+ "从不生成"
+ ##ID:000746##
+ mcset $l "Generate code listing" \
+ "生成的代码列表"
+ ##ID:000747##
+ mcset $l "Should compiler generate *.lst files" \
+ "Should compiler generate *.lst files" ;# <-- NOT TRANSLATED YET
+ ##ID:000748##
+ mcset $l "Table of symbols (in *.lst)" \
+ "Table of symbols (in *.lst)" ;# <-- NOT TRANSLATED YET
+ ##ID:000749##
+ mcset $l "Include table of used symbolic names to code listing" \
+ "Include table of used symbolic names to code listing" ;# <-- NOT TRANSLATED YET
+ ##ID:000750##
+ mcset $l "Generate object code (ihex8)" \
+ "Generate object code (ihex8)" ;# <-- NOT TRANSLATED YET
+ ##ID:000751##
+ mcset $l "Generate object code in format Intel Hex 8 (*.hex)" \
+ "Generate object code in format Intel Hex 8 (*.hex)" ;# <-- NOT TRANSLATED YET
+ ##ID:000752##
+ mcset $l "Generate code for simulator" \
+ "Generate code for simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000753##
+ mcset $l "Generate *.sim file for simulator" \
+ "Generate *.sim file for simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:000754##
+ mcset $l "Generate binary object code" \
+ "Generate binary object code" ;# <-- NOT TRANSLATED YET
+ ##ID:000755##
+ mcset $l "Generate binary object code (*.bin)" \
+ "Generate binary object code (*.bin)" ;# <-- NOT TRANSLATED YET
+ ##ID:000756##
+ mcset $l "Warning level" \
+ "警告级别"
+ ##ID:000757##
+ mcset $l "All" \
+ "全部"
+ ##ID:000758##
+ mcset $l "Errors + Warnings" \
+ "错误 + 警告"
+ ##ID:000759##
+ mcset $l "Errros only" \
+ "只是错误"
+ ##ID:000760##
+ mcset $l "Nothing" \
+ "不使用警告"
+ ##ID:000761##
+ mcset $l "What kind of messages should be included in compiler log output" \
+ "What kind of messages should be included in compiler log output" ;# <-- NOT TRANSLATED YET
+ ##ID:000762##
+ mcset $l "Verbose" \
+ "详细"
+ ##ID:000763##
+ mcset $l "Should compiler inform user about what it is doing" \
+ "Should compiler inform user about what it is doing" ;# <-- NOT TRANSLATED YET
+ ##ID:000764##
+ mcset $l "Enable optimization" \
+ "启用优化"
+ ##ID:000765##
+ mcset $l "Enable peephole optimization" \
+ "启用peephole优化"
+ ##ID:000766##
+ mcset $l "Maximum HEX record data length" \
+ "Maximum HEX record data length" ;# <-- NOT TRANSLATED YET
+ ##ID:000767##
+ mcset $l "Maximum length of Intel HEX 8 record data field.\n\nGenerally it doesn't matter what is set here. But some (badly written)\nprogrammers may refuse to load files containing records which exceeds\ncertain length.\n\nHigher value also results in smaller .hex files\n\nValue equal to 0 will be treated as 1" \
+ "Maximum length of Intel HEX 8 record data field.\n\nGenerally it doesn't matter what is set here. But some (badly written)\nprogrammers may refuse to load files containing records which exceeds\ncertain length.\n\nHigher value also results in smaller .hex files\n\nValue equal to 0 will be treated as 1" ;# <-- NOT TRANSLATED YET
+ ##ID:000768##
+ mcset $l "Ignore directives" \
+ "忽略指令"
+ ##ID:000769##
+ mcset $l "Accept" \
+ "接受"
+ ##ID:000770##
+ mcset $l "Ignore" \
+ "忽略"
+ ##ID:000771##
+ mcset $l "Restore defaults" \
+ "恢复默认设置"
+ ##ID:000772##
+ mcset $l "Are you sure that you want restore default settings ?" \
+ "您确定要恢复默认设置?"
+}
+namespace eval ::configDialogues::rightPanel {
+ ##ID:000773##
+ mcset $l "Right panel configuration" \
+ "右面板配置"
+ ##ID:000774##
+ mcset $l "Register watches" \
+ "登记表"
+ ##ID:000775##
+ mcset $l "Configure highlighting colors for register watches" \
+ "配置登记表高亮颜色,"
+ ##ID:000776##
+ mcset $l "Instruction details" \
+ "详细说明"
+ ##ID:000777##
+ mcset $l "Configure highlighting colors for instruction details" \
+ "详细配置指令的高亮颜色"
+ ##ID:000778##
+ mcset $l "Bold" \
+ "Bold" ;# <-- NOT TRANSLATED YET
+ ##ID:000779##
+ mcset $l "Apply" \
+ "应用"
+ ##ID:000780##
+ mcset $l "Ok" \
+ "好"
+ ##ID:000781##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:000782##
+ mcset $l "Configure right panel - %s" \
+ "右侧面板配置 - %s"
+ ##ID:000783##
+ mcset $l "Select color - %s" \
+ "选择颜色- %s"
+ ##ID:000784##
+ mcset $l "Bit" \
+ "Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:000785##
+ mcset $l "Name" \
+ "Name" ;# <-- NOT TRANSLATED YET
+ ##ID:000786##
+ mcset $l " etc." \
+ " etc." ;# <-- NOT TRANSLATED YET
+}
+namespace eval ::configDialogues::toolbar {
+ eval ${::TOOLBAR_TRANSLATIONS}
+ ##ID:000787##
+ mcset $l "Toolbar configuration" \
+ "工具栏配置"
+ ##ID:000788##
+ mcset $l "Search for a string in ListBox" \
+ "在ListBox中查找"
+ ##ID:000789##
+ mcset $l "Clear" \
+ "清除"
+ ##ID:000790##
+ mcset $l "available items" \
+ "可用项"
+ ##ID:000791##
+ mcset $l "Current toolbar items" \
+ "当前工具栏项目"
+ ##ID:000792##
+ mcset $l "Defaults" \
+ "默认"
+ ##ID:000793##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000794##
+ mcset $l "Apply" \
+ "应用"
+ ##ID:000795##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:000796##
+ mcset $l "Configure Main Toolbar - %s" \
+ "配置的主工具栏 - %s"
+ ##ID:000797##
+ mcset $l " -- SEPARATOR --" \
+ " -- SEPARATOR --" ;# <-- NOT TRANSLATED YET
+ ##ID:000798##
+ mcset $l "Restore defaults" \
+ "恢复默认设置"
+ ##ID:000799##
+ mcset $l "Are you sure that you want restore default settings ?" \
+ "您确定要恢复默认设置?"
+ ##ID:000800##
+ mcset $l "Save changes?" \
+ "是否保存更改?"
+ ##ID:000801##
+ mcset $l "The settings have been changed. Do you want to save the changes?" \
+ "设置已更改,您是否想保存?"
+}
+namespace eval ::configDialogues::custom_commands {
+ ##ID:000802##
+ mcset $l "Edit custom commands" \
+ "编辑自定义命令"
+ ##ID:000803##
+ mcset $l "Command %s" \
+ "命令 %s"
+ ##ID:000804##
+ mcset $l "Short description" \
+ "简单说明"
+ ##ID:000805##
+ mcset $l "This string will be used as status bar tip (max. 50 chars)" \
+ "这个说明将会显示在状态栏提示(最多50个字符)"
+ ##ID:000806##
+ mcset $l "Options" \
+ "选项"
+ ##ID:000807##
+ mcset $l "Confirmation dialog" \
+ "配置界面"
+ ##ID:000808##
+ mcset $l "Invoke dialog to confirm command execution." \
+ "调用命令执行的确认界面" ;# <-- UPDATE?
+ ##ID:000809##
+ mcset $l "Show results" \
+ "显示结果"
+ ##ID:000810##
+ mcset $l "After finish show dialog with results." \
+ "完成后结果的显示界面" ;# <-- UPDATE?
+ ##ID:000811##
+ mcset $l "Ignore errors" \
+ "忽略错误"
+ ##ID:000812##
+ mcset $l "Do not invoke error dialog if the process fails." \
+ "如果这个过程失败不调用错误界面" ;# <-- UPDATE?
+ ##ID:004493##
+ mcset $l "Run in terminal" \
+ "运行终端"
+ ##ID:004494##
+ mcset $l "Run interactively in terminal emulator." \
+ "Run interactively in terminal emulator." ;# <-- NOT TRANSLATED YET
+ ##ID:000813##
+ mcset $l "Bash script to execute" \
+ "使用Shell脚本执行" ;# <-- UPDATE?
+ ##ID:000814##
+ mcset $l "Show help" \
+ "显示帮助"
+ ##ID:000815##
+ mcset $l "Ok" \
+ "确定"
+ ##ID:000816##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:000817##
+ mcset $l "Edit custom commands - %s" \
+ "编辑自定义命令 - %s"
+ ##ID:000818##
+ mcset $l "-- click to close --" \
+ "-- 点击关闭 --"
+ ##ID:000819##
+ mcset $l "Custom command %s: %s" \
+ "自定义命令 %s: %s"
+ ##ID:000820##
+ mcset $l "VARIABLES:" \
+ "变量:"
+ ##ID:000821##
+ mcset $l "\t\tThe full URL of the current file\n" \
+ "\t\t当前文件的完整URL\n"
+ ##ID:000822##
+ mcset $l "\t\tList of the URLs of all open documents\n" \
+ "\t\t列出所有打开文档的URL\n"
+ ##ID:000823##
+ mcset $l "\t\tProject directory\n" \
+ "\t\t项目目录\n"
+ ##ID:000824##
+ mcset $l "\t\tThe file name of the current document\n" \
+ "\t\t当前文件的文件名\n"
+ ##ID:000825##
+ mcset $l "\t\tSame as %filename, but without extension\n" \
+ "\t\tSame as %filename, but without extension\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000826##
+ mcset $l "\t\tName of project main file\n" \
+ "\t\tName of project main file\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000827##
+ mcset $l "\t\tNumber of the current line\n" \
+ "\t\tNumber of the current line\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000828##
+ mcset $l "\t\tNumber of the current column\n" \
+ "\t\tNumber of the current column\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000829##
+ mcset $l "\t\tThe selected text in the current file\n" \
+ "\t\tThe selected text in the current file\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000830##
+ mcset $l "\t\tThe full text of the current file\n" \
+ "\t\tThe full text of the current file\n" ;# <-- NOT TRANSLATED YET
+ ##ID:000831##
+ mcset $l "\t\tPercent sign\n\n" \
+ "\t\tPercent sign\n\n" ;# <-- NOT TRANSLATED YET
+ # Keep string length here! Also percent signs should remain at the same positions.
+ ##ID:000832##
+ mcset $l {Variables %line, %column, %selection and %text} \
+ {Variables %line, %column, %selection and %text} ;# <-- NOT TRANSLATED YET
+ ##ID:000833##
+ mcset $l "\nare not available if external editor is used" \
+ "\nare not available if external editor is used" ;# <-- NOT TRANSLATED YET
+}
+namespace eval ::configDialogues::global {
+ ##ID:000834##
+ mcset $l "MCU 8051 IDE configuration" \
+ "配置单片机IDE"
+ ##ID:000835##
+ mcset $l "Display splash screen" \
+ "显示启动画面"
+ ##ID:000836##
+ mcset $l "Show splash screen on start-up" \
+ "启动时显示启动画面"
+ ##ID:000837##
+ mcset $l "Show tips on start-up" \
+ "启动时显示提示"
+ ##ID:000838##
+ mcset $l "Invoke dialog with tip of the day on start-up" \
+ "在启动时调用每日提示界面"
+ ##ID:000839##
+ mcset $l "Language" \
+ "语言"
+ ##ID:000840##
+ mcset $l "Your preferred language" \
+ "您首选的语言"
+ ##ID:000841##
+ mcset $l "Do not always ask whether to add file to the project after the file is opened" \
+ "该文件被打开后,不要老是问是否添加文件到项目里,"
+ ##ID:004479##
+ mcset $l "Do not show performance warning when enabling external HW simulation." \
+ "Do not show performance warning when enabling external HW simulation." ;# <-- NOT TRANSLATED YET
+ ##ID:000842##
+ mcset $l "Reset to defaults" \
+ "重设为默认值"
+ ##ID:000843##
+ mcset $l "Reset all settings to defaults" \
+ "重设所有设置为默认值"
+ ##ID:000844##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000845##
+ mcset $l "Commit new settings" \
+ "应用新的设置"
+ ##ID:000846##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:000847##
+ mcset $l "Take changes back and close dialog" \
+ "Take changes back and close dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:000848##
+ mcset $l "Configure MCU 8051 IDE" \
+ "配置 MCU 8051 IDE"
+ ##ID:000849##
+ mcset $l "Unable to write to base configuration file" \
+ "无法写入相应的配置文件"
+ ##ID:000850##
+ mcset $l "Application language changed" \
+ "改变应用程序语言"
+ ##ID:000851##
+ mcset $l "Language for this application has been changed. The change will take effect upon next start of application" \
+ "此应用程序的语言已被修改,\n这一变化将在下次启动时生效"
+ ##ID:000852##
+ mcset $l "Widget style" \
+ "控件样式"
+ ##ID:000853##
+ mcset $l "Your preferred widget style" \
+ "您首选的控件风格"
+ ##ID:000854##
+ mcset $l "Background color" \
+ "背景颜色"
+ ##ID:000855##
+ mcset $l "Common background color for almost everything in the GUI" \
+ "几乎所有的图形用户界面的共同背景颜色"
+ ##ID:000856##
+ mcset $l "Global font size factor" \
+ "全局字体的大小"
+ ##ID:000857##
+ mcset $l "Allows you to adjust size of (almost) all fonts used in this IDE" \
+ "允许您调整(几乎)所有的IDE中使用的字体大小"
+ ##ID:000858##
+ mcset $l "Normal" \
+ "Normal" ;# <-- NOT TRANSLATED YET
+ ##ID:000859##
+ mcset $l "A little larger" \
+ "A little larger" ;# <-- NOT TRANSLATED YET
+ ##ID:000860##
+ mcset $l "Notably larger" \
+ "Notably larger" ;# <-- NOT TRANSLATED YET
+ ##ID:000861##
+ mcset $l "Much larger" \
+ "Much larger" ;# <-- NOT TRANSLATED YET
+ ##ID:000862##
+ mcset $l "Huge" \
+ "Huge" ;# <-- NOT TRANSLATED YET
+ ##ID:000863##
+ mcset $l "Too BIG" \
+ "Too BIG" ;# <-- NOT TRANSLATED YET
+}
+namespace eval ::configDialogues::terminal {
+ ##ID:000864##
+ mcset $l "Terminal configuration" \
+ "终端配置"
+ ##ID:000865##
+ mcset $l "Foreground color" \
+ "前景颜色"
+ ##ID:000866##
+ mcset $l "Background color" \
+ "背景颜色"
+ ##ID:000867##
+ mcset $l "Font size" \
+ "字体大小"
+ ##ID:000868##
+ mcset $l "Font family" \
+ "字体"
+ ##ID:000869##
+ mcset $l "Use settings and restart terminal emulator" \
+ "应用设置并重新启动终端仿真器"
+ ##ID:000870##
+ mcset $l "Reset to defaults" \
+ "重设为默认值"
+ ##ID:000871##
+ mcset $l "Reset all settings to defaults" \
+ "重设所有设置为默认值"
+ ##ID:000872##
+ mcset $l "Ok" \
+ "确定"
+ ##ID:000873##
+ mcset $l "Commit new settings" \
+ "应用新的设置"
+ ##ID:000874##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:000875##
+ mcset $l "Take changes back and close dialog" \
+ "应用更改并关闭窗口"
+ ##ID:000876##
+ mcset $l "Configure terminal emulator" \
+ "配置终端仿真器"
+ ##ID:000877##
+ mcset $l "Select foreground color" \
+ "选择前景颜色"
+ ##ID:000878##
+ mcset $l "Select background color" \
+ "选择背景颜色"
+ ##ID:000879##
+ mcset $l "Invalid value of key: '%s'" \
+ "无效关键值: '%s'"
+}
+namespace eval ::configDialogues::simulator {
+ ##ID:000880##
+ mcset $l "Simulator configuration" \
+ "配置模拟器"
+ ##ID:000881##
+ mcset $l "Warning dialogues" \
+ "警告界面"
+ ##ID:000882##
+ mcset $l "Other" \
+ "其他"
+ ##ID:000883##
+ mcset $l "Undefined values" \
+ "未定义的值"
+ ##ID:000884##
+ mcset $l "Return random value" \
+ "返回随机值"
+ ##ID:000885##
+ mcset $l "Return zero value" \
+ "返回零值"
+ ##ID:000886##
+ mcset $l "Return highest possible value" \
+ "返回最高值"
+ ##ID:000887##
+ mcset $l "Reverse run" \
+ "反向运行"
+ ##ID:000888##
+ mcset $l "Stack capacity" \
+ "堆栈的容量"
+ ##ID:000889##
+ mcset $l "Number of steps which can be taken back" \
+ "Number of steps which can be taken back" ;# <-- NOT TRANSLATED YET
+ ##ID:004547##
+ mcset $l "Colors" \
+ "Colors" ;# <-- NOT TRANSLATED YET
+ ##ID:004548##
+ mcset $l "ON color" \
+ "ON color" ;# <-- NOT TRANSLATED YET
+ ##ID:004549##
+ mcset $l "OFF color" \
+ "OFF color" ;# <-- NOT TRANSLATED YET
+ ##ID:004550##
+ mcset $l "Color to display a bit name for a bit set to log. 1" \
+ "Color to display a bit name for a bit set to log. 1" ;# <-- NOT TRANSLATED YET
+ ##ID:004551##
+ mcset $l "Color to display a bit name for a bit set to log. 0" \
+ "Color to display a bit name for a bit set to log. 0" ;# <-- NOT TRANSLATED YET
+ ##ID:000890##
+ mcset $l "Defaults" \
+ "默认"
+ ##ID:000891##
+ mcset $l "Reset settings to defaults" \
+ "重设所有设置为默认值"
+ ##ID:000892##
+ mcset $l "Ok" \
+ "确定" ;
+ ##ID:000893##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:000894##
+ mcset $l "Simulator configuration - %s" \
+ "配置模拟器 - %s"
+ ##ID:000895##
+ mcset $l "Are you sure ?" \
+ "您确定吗?"
+ ##ID:000896##
+ mcset $l "Are you sure you want to restore default settings" \
+ "您确定要恢复默认设置?"
+ ##ID:000897##
+ mcset $l "Ignore stack overflow" \
+ "忽略堆栈溢出"
+ ##ID:000898##
+ mcset $l "Ignore stack underflow" \
+ "忽略堆栈下溢"
+ ##ID:000899##
+ mcset $l "Ignore invalid instructions" \
+ "忽略无效指令"
+ ##ID:000900##
+ mcset $l "Ignore watchdog overflow" \
+ "忽略看门狗溢出"
+ ##ID:000901##
+ mcset $l "Ignore invalid return from interrupt" \
+ "忽略无效的中断返回"
+ ##ID:000902##
+ mcset $l "Ignore reading from write only register" \
+ "忽略读取只写寄存器"
+ ##ID:000903##
+ mcset $l "Ignore invalid access to IDATA/SFR" \
+ "忽略IDATA/SFR无效访问"
+ ##ID:000904##
+ mcset $l "Ignore invalid access to EDATA" \
+ "忽略EDATA无效访问"
+ ##ID:000905##
+ mcset $l "Ignore invalid access to XDATA" \
+ "忽略XDATA无效访问"
+ ##ID:000906##
+ mcset $l "Ignore invalid access to bit" \
+ "忽略bit无效访问"
+ ##ID:000907##
+ mcset $l "Ignore invalid access to CODE" \
+ "忽略CODE无效访问"
+ ##ID:000908##
+ mcset $l "Ignore EEPROM write failure" \
+ "忽略EEPROM写入失败"
+ ##ID:000909##
+ mcset $l "Ignore EEPROM write abort" \
+ "忽略EEPROM写入中止"
+ ##ID:000910##
+ mcset $l "Ignore UART frame discard" \
+ "忽略丢弃的UART帧"
+ ##ID:000911##
+ mcset $l "Ignore illegal UART mode change" \
+ "忽略非法转变UART模式"
+ ##ID:000912##
+ mcset $l "Ignore illegal Timer/Counter mode change" \
+ "忽略非法改变定时器/计数器模式"
+ ##ID:000913##
+ mcset $l "Do not complain about invalid breakpoints" \
+ "不要抱怨无效的断点"
+ ##ID:000914##
+ mcset $l "Check this to disable warning on stack overflow" \
+ "检查禁用堆栈溢出的警告"
+ ##ID:000915##
+ mcset $l "Check this to disable warning on stack underflow" \
+ "检查禁用堆栈下溢警告"
+ ##ID:000916##
+ mcset $l "Check this to disable warning on\ninvalid instruction" \
+ "检查禁用警告\n无效的指令"
+ ##ID:000917##
+ mcset $l "Do not stop simulation on device reset\ninvoked by watchdog timer overflow" \
+ "Do not stop simulation on device reset\ninvoked by watchdog timer overflow" ;# <-- NOT TRANSLATED YET
+ ##ID:000918##
+ mcset $l "Do not show warning dialog when program trying to return from interrupt which has not been invoked" \
+ "Do not show warning dialog when program trying to return from interrupt which has not been invoked" ;# <-- NOT TRANSLATED YET
+ ##ID:000919##
+ mcset $l "Do not display warning dialog when\nreading from write-only register" \
+ "Do not display warning dialog when\nreading from write-only register" ;# <-- NOT TRANSLATED YET
+ ##ID:000920##
+ mcset $l "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Internal Data Memory (IDATA) or SFR area" \
+ "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Internal Data Memory (IDATA) or SFR area" ;# <-- NOT TRANSLATED YET
+ ##ID:000921##
+ mcset $l "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Expanded Data Memory (EDATA)" \
+ "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Expanded Data Memory (EDATA)" ;# <-- NOT TRANSLATED YET
+ ##ID:000922##
+ mcset $l "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented External Data Memory (XDATA)" \
+ "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented External Data Memory (XDATA)" ;# <-- NOT TRANSLATED YET
+ ##ID:000923##
+ mcset $l "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented bit in IDATA or SFR area" \
+ "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented bit in IDATA or SFR area" ;# <-- NOT TRANSLATED YET
+ ##ID:000924##
+ mcset $l "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Program Memory (CODE)" \
+ "Do not display dialog \"Undefined result\" when simulated program\naccessing unimplemented Program Memory (CODE)" ;# <-- NOT TRANSLATED YET
+ ##ID:000925##
+ mcset $l "Check this to disable warning on\ndata eeprom write failure" \
+ "Check this to disable warning on\ndata eeprom write failure" ;# <-- NOT TRANSLATED YET
+ ##ID:000926##
+ mcset $l "Check this to disable warning on\ndata eeprom write abort" \
+ "Check this to disable warning on\ndata eeprom write abort" ;# <-- NOT TRANSLATED YET
+ ##ID:000927##
+ mcset $l "Check this to disable warning on UART frame discard" \
+ "Check this to disable warning on UART frame discard" ;# <-- NOT TRANSLATED YET
+ ##ID:000928##
+ mcset $l "Check this to disable warning on illegal UART mode change" \
+ "Check this to disable warning on illegal UART mode change" ;# <-- NOT TRANSLATED YET
+ ##ID:000929##
+ mcset $l "Check this to disable warning on illegal Timer/Counter mode change" \
+ "Check this to disable warning on illegal Timer/Counter mode change" ;# <-- NOT TRANSLATED YET
+ ##ID:000930##
+ mcset $l "Disable warning: \"warning: Invalid breakpoint\"" \
+ "禁用警告: \"警告: 无效的断点\""
+}
+namespace eval ::configDialogues::shortcuts {
+ # Strings in shortcuts configuration dialog
+ ##ID:000931##
+ mcset $l "Configure key shortcuts" \
+ "配置快捷键"
+ ##ID:000932##
+ mcset $l "available items" \
+ "现有项目"
+ ##ID:000933##
+ mcset $l "<Nothing selected>" \
+ "<没有选中>"
+ ##ID:000934##
+ mcset $l "Search:" \
+ "搜索:"
+ ##ID:000935##
+ mcset $l "Enter your search string here" \
+ "在这里输入您的搜索字"
+ ##ID:000936##
+ mcset $l "Clear" \
+ "清除"
+ ##ID:000937##
+ mcset $l "Current shortcut:" \
+ "当前的快捷方式:"
+ ##ID:000938##
+ mcset $l "Default:" \
+ "默认:"
+ ##ID:000939##
+ mcset $l "Restore default" \
+ "恢复默认"
+ ##ID:000940##
+ mcset $l "Accept" \
+ "应用"
+ ##ID:000941##
+ mcset $l "Accept new shortcut" \
+ "接受新的快捷方式"
+ ##ID:000942##
+ mcset $l "Original" \
+ "原始"
+ ##ID:000943##
+ mcset $l "Discard new shortcut" \
+ "放弃新的快捷方式"
+ ##ID:000944##
+ mcset $l "Defaults" \
+ "默认"
+ ##ID:000945##
+ mcset $l "Reset all settings to defaults" \
+ "重设所有设置为默认值"
+ ##ID:000946##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:000947##
+ mcset $l "Commit new settings" \
+ "应用新的设置"
+ ##ID:000948##
+ mcset $l "Take changes back and close dialog" \
+ "Take changes back and close dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:000949##
+ mcset $l "Configure shortcuts - %s" \
+ "配置快捷键 - %s"
+ ##ID:000950##
+ mcset $l "Modifier required (Control or Alt)" \
+ "Modifier required (Control or Alt)" ;# <-- NOT TRANSLATED YET
+ ##ID:000951##
+ mcset $l "This combination is hard-coded in the main window, so it cannot be used" \
+ "This combination is hard-coded in the main window, so it cannot be used" ;# <-- NOT TRANSLATED YET
+ ##ID:000952##
+ mcset $l "This combination is hard-coded, so it cannot be used" \
+ "This combination is hard-coded, so it cannot be used" ;# <-- NOT TRANSLATED YET
+ ##ID:000953##
+ mcset $l "The '%s' key combination has already been assigned to \"%s\"." \
+ "The '%s' key combination has already been assigned to \"%s\"." ;# <-- NOT TRANSLATED YET
+ ##ID:000954##
+ mcset $l "Removing key combination for action \"%s\"" \
+ "Removing key combination for action \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:000955##
+ mcset $l "Item changed" \
+ "改变项目"
+ ##ID:000956##
+ mcset $l "The previous item was modified. Do you want to save it ?" \
+ "The previous item was modified. Do you want to save it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:000957##
+ mcset $l "Confirmation required" \
+ "确认"
+ ##ID:000958##
+ mcset $l "This will discard all shortcut settings and replace them with defaults. Are you sure by that ?" \
+ "This will discard all shortcut settings and replace them with defaults. Are you sure by that ?" ;# <-- NOT TRANSLATED YET
+ ## Shortcut names
+ # Main
+ ##ID:000959##
+ mcset $l "Main" \
+ "Main" ;# <-- NOT TRANSLATED YET
+ ##ID:000960##
+ mcset $l "Exit program" \
+ "退出程序"
+ ##ID:000961##
+ mcset $l "Save session" \
+ "保存会话"
+ ##ID:000962##
+ mcset $l "File statistics" \
+ "档案统计"
+ ##ID:000963##
+ mcset $l "Toggle full screen mode" \
+ "切换到全屏模式"
+ # Project management
+ ##ID:000964##
+ mcset $l "Project management" \
+ "项目管理"
+ ##ID:000965##
+ mcset $l "New project" \
+ "新项目"
+ ##ID:000966##
+ mcset $l "Open project" \
+ "打开项目"
+ ##ID:000967##
+ mcset $l "Save project" \
+ "保存项目"
+ ##ID:000968##
+ mcset $l "Edit project" \
+ "编辑项目"
+ ##ID:000969##
+ mcset $l "Save and close project" \
+ "保存并关闭项目"
+ ##ID:000970##
+ mcset $l "Close project" \
+ "关闭项目"
+ # Simulator
+ ##ID:000971##
+ mcset $l "Simulator" \
+ "模拟器"
+ ##ID:000972##
+ mcset $l "Start simulator" \
+ "启动模拟器"
+ ##ID:000973##
+ mcset $l "Debug this file only" \
+ "只调试这个文件"
+ ##ID:000974##
+ mcset $l "Show SFR map" \
+ "显示SFR映射p"
+ ##ID:000975##
+ mcset $l "Bit addressable array" \
+ "Bit addressable array" ;# <-- NOT TRANSLATED YET
+ ##ID:000976##
+ mcset $l "Show Code memory" \
+ "显示代码的内存"
+ ##ID:000977##
+ mcset $l "Show XDATA memory" \
+ "显示XDATA内存"
+ ##ID:000978##
+ mcset $l "Show ERAM" \
+ "显示ERAM"
+ ##ID:000979##
+ mcset $l "Show Data EEPROM" \
+ "显示EEPROM数据"
+ ##ID:000980##
+ mcset $l "Show EEPROM write buffer" \
+ "显示EEPROM写显示缓冲区"
+ ##ID:000981##
+ mcset $l "Invoke MCU stack monitor" \
+ "调用单片机堆栈监视器"
+ ##ID:000982##
+ mcset $l "Reset - Only SFR" \
+ "复位 - Only SFR"
+ ##ID:000983##
+ mcset $l "Reset - All zeros" \
+ "复位 - All zeros"
+ ##ID:000984##
+ mcset $l "Reset - All ones" \
+ "复位 - All ones"
+ ##ID:000985##
+ mcset $l "Reset - Random" \
+ "复位 - Random"
+ ##ID:000986##
+ mcset $l "Simulator: Step" \
+ "Simulator: Step" ;# <-- NOT TRANSLATED YET
+ ##ID:000987##
+ mcset $l "Simulator: Step Back" \
+ "Simulator: Step Back" ;# <-- NOT TRANSLATED YET
+ ##ID:000988##
+ mcset $l "Simulator: Step over" \
+ "Simulator: Step over" ;# <-- NOT TRANSLATED YET
+ ##ID:000989##
+ mcset $l "Simulator: Animate" \
+ "Simulator: Animate" ;# <-- NOT TRANSLATED YET
+ ##ID:000990##
+ mcset $l "Simulator: Run" \
+ "Simulator: Run" ;# <-- NOT TRANSLATED YET
+ ##ID:000991##
+ mcset $l "Allow/Deny breakpoints" \
+ "允许/拒绝断点"
+ ##ID:000992##
+ mcset $l "Clear highlight" \
+ "清除高亮"
+ ##ID:000993##
+ mcset $l "Find cursor" \
+ "查找光标"
+ ##ID:000994##
+ mcset $l "Jump to line" \
+ "转跳到指定的行目"
+ ##ID:000995##
+ mcset $l "Simulator: Hibernate" \
+ "Simulator: Hibernate" ;# <-- NOT TRANSLATED YET
+ ##ID:000996##
+ mcset $l "Simulator: Resume" \
+ "Simulator: Resume" ;# <-- NOT TRANSLATED YET
+ ##ID:000997##
+ mcset $l "Interrupt monitor" \
+ "Interrupt monitor" ;# <-- NOT TRANSLATED YET
+ ##ID:000998##
+ mcset $l "Stopwatch" \
+ "秒表"
+ # Virtual HW
+ ##ID:000999##
+ mcset $l "Virtual HW" \
+ "虚拟硬件"
+ ##ID:001000##
+ mcset $l "LED panel" \
+ "LED面板"
+ ##ID:001001##
+ mcset $l "LED display" \
+ "数码管"
+ ##ID:001002##
+ mcset $l "LED matrix" \
+ "矩阵LED"
+ ##ID:001003##
+ mcset $l "Multiplexed LED display" \
+ "复用数码管"
+ ##ID:001004##
+ mcset $l "Simple keypad" \
+ "简单按键"
+ ##ID:001005##
+ mcset $l "Matrix keypad" \
+ "矩阵按键"
+ ##ID:001006##
+ mcset $l "Open" \
+ "打开"
+ ##ID:001007##
+ mcset $l "Load" \
+ "加载"
+ ##ID:001008##
+ mcset $l "Save" \
+ "保存"
+ ##ID:001009##
+ mcset $l "Save as" \
+ "另存为"
+ ##ID:001010##
+ mcset $l "Remove all" \
+ "删除所有"
+ # Tools
+ ##ID:001011##
+ mcset $l "Tools" \
+ "工具"
+ ##ID:001012##
+ mcset $l "Compile" \
+ "编译"
+ ##ID:001013##
+ mcset $l "Compile this file only" \
+ "只编译这个文件"
+ ##ID:001014##
+ mcset $l "Disassemble" \
+ "反汇编"
+ ##ID:001015##
+ mcset $l "Auto indent" \
+ "自动缩进"
+ ##ID:001016##
+ mcset $l "Change letter case" \
+ "变更字母大小写"
+ ##ID:001017##
+ mcset $l "Cleanup dialog" \
+ "清理界面"
+ ##ID:001018##
+ mcset $l "Export as XHTML" \
+ "导出为XHTML"
+ ##ID:001019##
+ mcset $l "Export as LaTeX" \
+ "导出为LaTeX"
+ ##ID:001020##
+ mcset $l "Document current function" \
+ "当前文件的函数"
+ ##ID:001021##
+ mcset $l "Run doxywizard" \
+ "运行doxywizard"
+ ##ID:001022##
+ mcset $l "Build C API documentation" \
+ "构建C API文档"
+ ##ID:001023##
+ mcset $l "Clear C API documentation" \
+ "清除C API文档"
+ ##ID:001024##
+ mcset $l "Custom command 0" \
+ "自定义命令0"
+ ##ID:001025##
+ mcset $l "Custom command 1" \
+ "自定义命令1"
+ ##ID:001026##
+ mcset $l "Custom command 2" \
+ "自定义命令2"
+ # Utilities
+ ##ID:001027##
+ mcset $l "Utilities" \
+ "Utilities" ;# <-- NOT TRANSLATED YET
+ ##ID:001028##
+ mcset $l "Hex -> Bin" \
+ "Hex -> Bin" ;# <-- NOT TRANSLATED YET
+ ##ID:001029##
+ mcset $l "Bin -> Hex" \
+ "Bin -> Hex" ;# <-- NOT TRANSLATED YET
+ ##ID:001030##
+ mcset $l "Sim -> Hex" \
+ "Sim -> Hex" ;# <-- NOT TRANSLATED YET
+ ##ID:001031##
+ mcset $l "Sim -> Bin" \
+ "Sim -> Bin" ;# <-- NOT TRANSLATED YET
+ ##ID:001032##
+ mcset $l "Normalize IHEX8" \
+ "Normalize IHEX8" ;# <-- NOT TRANSLATED YET
+ ##ID:001033##
+ mcset $l "Hex Editor" \
+ "Hex Editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001034##
+ mcset $l "Symbol table" \
+ "符号表"
+ ##ID:001035##
+ mcset $l "8-segment editor" \
+ "8段LED编辑器"
+ ##ID:001036##
+ mcset $l "ASCII chart" \
+ "ASCII表"
+ ##ID:001037##
+ mcset $l "Scribble notepad" \
+ "便利贴"
+ ##ID:001038##
+ mcset $l "Base Converter" \
+ "进制转换"
+ ##ID:001039##
+ mcset $l "UART/RS232 Debugger" \
+ "UART/RS232调试"
+ ##ID:001040##
+ mcset $l "Help" \
+ "帮助"
+ ##ID:001041##
+ mcset $l "About dialog" \
+ "关于界面"
+ ##ID:001042##
+ mcset $l "Welcome dialog" \
+ "欢迎界面"
+ ##ID:001043##
+ mcset $l "Tip of the day" \
+ "每日提示"
+ # Messages text
+ ##ID:001044##
+ mcset $l "Messages text" \
+ "消息文本"
+ ##ID:001045##
+ mcset $l "Clear messages" \
+ "清除消息"
+ ##ID:001046##
+ mcset $l "Find" \
+ "查找"
+ ##ID:001047##
+ mcset $l "Find next" \
+ "查找下一个"
+ ##ID:001048##
+ mcset $l "Find previous" \
+ "查找上一个"
+ # Notes
+ ##ID:001049##
+ mcset $l "Notes" \
+ "注释"
+ ##ID:001050##
+ mcset $l "Bold text" \
+ "粗体"
+ ##ID:001051##
+ mcset $l "Italic text" \
+ "斜体"
+ ##ID:001052##
+ mcset $l "Strikethrough text" \
+ "删除线文本"
+ ##ID:001053##
+ mcset $l "Underline text" \
+ "下划线文本"
+ ##ID:001054##
+ mcset $l "Erase tags" \
+ "擦除标记"
+ ##ID:001055##
+ mcset $l "Insert OK image" \
+ "已经插入图片"
+ ##ID:001056##
+ mcset $l "Register watches" \
+ "登记表"
+ ##ID:001057##
+ mcset $l "Move to top" \
+ "移动到顶部"
+ ##ID:001058##
+ mcset $l "Move up" \
+ "向上移动"
+ ##ID:001059##
+ mcset $l "Move down" \
+ "向下移动"
+ ##ID:001060##
+ mcset $l "Move to bottom" \
+ "移动到底部"
+ ##ID:001061##
+ mcset $l "Remove" \
+ "删除"
+ # Editor
+ ##ID:001062##
+ mcset $l "Editor" \
+ "编辑"
+ ##ID:001063##
+ mcset $l "Read only mode" \
+ "只读模式"
+ ##ID:001064##
+ mcset $l "New" \
+ "新建"
+ ##ID:001065##
+ mcset $l "Save all" \
+ "保存全部"
+ ##ID:001066##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:001067##
+ mcset $l "Close all" \
+ "关闭所有"
+ ##ID:001068##
+ mcset $l "Show/Hide icon border" \
+ "显示/隐藏图标栏"
+ ##ID:001069##
+ mcset $l "Show/Hide line numbers" \
+ "显示/隐藏行目"
+ ##ID:001070##
+ mcset $l "Reload" \
+ "刷新"
+ ##ID:001071##
+ mcset $l "Next editor" \
+ "下一个的编辑"
+ ##ID:001072##
+ mcset $l "Previous editor" \
+ "上一个的编辑"
+ ##ID:001073##
+ mcset $l "Breakpoint" \
+ "断点"
+ ##ID:001074##
+ mcset $l "Bookmark" \
+ "书签"
+ ##ID:001075##
+ mcset $l "Undo" \
+ "撤消"
+ ##ID:001076##
+ mcset $l "Redo" \
+ "取消撤销"
+ ##ID:001077##
+ mcset $l "Copy" \
+ "复制"
+ ##ID:001078##
+ mcset $l "Cut" \
+ "剪切"
+ ##ID:001079##
+ mcset $l "Paste" \
+ "粘帖"
+ ##ID:001080##
+ mcset $l "Select all" \
+ "选择所有"
+ ##ID:001081##
+ mcset $l "Replace" \
+ "替换"
+ ##ID:001082##
+ mcset $l "Go to line" \
+ "到达指定的行目"
+ ##ID:001083##
+ mcset $l "Comment" \
+ "注释"
+ ##ID:001084##
+ mcset $l "Uncomment" \
+ "取消注释"
+ ##ID:001085##
+ mcset $l "Indent" \
+ "缩进"
+ ##ID:001086##
+ mcset $l "Unindent" \
+ "取消缩进"
+ ##ID:001087##
+ mcset $l "Uppercase" \
+ "大写"
+ ##ID:001088##
+ mcset $l "Lowercase" \
+ "小写"
+ ##ID:001089##
+ mcset $l "Capitalize" \
+ "大写"
+ ##ID:001090##
+ mcset $l "Go to next bookmark" \
+ "转到下一页书签"
+ ##ID:001091##
+ mcset $l "Go to previous bookmark" \
+ "转到上一页书签"
+ ##ID:001092##
+ mcset $l "Program jump" \
+ "程序跳转"
+ ##ID:001093##
+ mcset $l "Call subprogram" \
+ "调用子程序"
+ ##ID:001094##
+ mcset $l "Editor command line" \
+ "编辑命令行"
+ ##ID:001095##
+ mcset $l "Split vertical" \
+ "垂直分割"
+ ##ID:001096##
+ mcset $l "Split horizontal" \
+ "水平分割"
+ ##ID:001097##
+ mcset $l "Close current view" \
+ "关闭当前视图"
+ ##ID:001098##
+ mcset $l "Block selection mode" \
+ "块选择模式"
+}
+# instructiondetails.tcl
+# ==============================================================================
+namespace eval InstructionDetails {
+ ##ID:001099##
+ mcset $l "Note:" \
+ "注"
+ ##ID:001100##
+ mcset $l "OPCODE:" \
+ "OPCODE:" ;# <-- NOT TRANSLATED YET
+ ##ID:001101##
+ mcset $l "Time:" \
+ "Time:" ;# <-- NOT TRANSLATED YET
+ ##ID:001102##
+ mcset $l "Length:" \
+ "Length:" ;# <-- NOT TRANSLATED YET
+ ##ID:001103##
+ mcset $l "Flags:" \
+ "Flags:" ;# <-- NOT TRANSLATED YET
+ ##ID:001104##
+ mcset $l "Class:" \
+ "Class:" ;# <-- NOT TRANSLATED YET
+ ##ID:001105##
+ mcset $l "no help available for this directive" \
+ "no help available for this directive" ;# <-- NOT TRANSLATED YET
+ ##ID:001106##
+ mcset $l "\tCarry flag\n" \
+ "\tCarry flag\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001107##
+ mcset $l "\tIndirect address" \
+ "\tIndirect address" ;# <-- NOT TRANSLATED YET
+ ##ID:001108##
+ mcset $l "\tRegisters of active bank\n" \
+ "\tRegisters of active bank\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001109##
+ mcset $l "\tAccumulator\n" \
+ "\tAccumulator\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001110##
+ mcset $l "\tPrimary work register\n" \
+ "\tPrimary work register\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001111##
+ mcset $l "\tData PoinTeR register (16 bit)\n" \
+ "\tData PoinTeR register (16 bit)\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001112##
+ mcset $l "\tbit memory direct address\n" \
+ "\tbit memory direct address\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001113##
+ mcset $l "\tinternal data memory or SFR direct address\n" \
+ "\tinternal data memory or SFR direct address\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001114##
+ mcset $l "\t16 bit constant data\n" \
+ "\t16 bit constant data\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001115##
+ mcset $l "\t8 bit constant data\n" \
+ "\t8 bit constant data\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001116##
+ mcset $l "\t16 bit program memory address\n" \
+ "\t16 bit program memory address\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001117##
+ mcset $l "\t11 bit program memory address\n" \
+ "\t11 bit program memory address\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001118##
+ mcset $l "\t8 bit offset for relative jump\n" \
+ "\t8 bit offset for relative jump\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001119##
+ mcset $l "bit" \
+ "bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001120##
+ mcset $l "data" \
+ "data" ;# <-- NOT TRANSLATED YET
+ ##ID:001121##
+ mcset $l "imm16" \
+ "imm16" ;# <-- NOT TRANSLATED YET
+ ##ID:001122##
+ mcset $l "imm8" \
+ "imm8" ;# <-- NOT TRANSLATED YET
+ ##ID:001123##
+ mcset $l "code16" \
+ "code16" ;# <-- NOT TRANSLATED YET
+ ##ID:001124##
+ mcset $l "code11" \
+ "code11" ;# <-- NOT TRANSLATED YET
+ ##ID:001125##
+ mcset $l "code8" \
+ "code8" ;# <-- NOT TRANSLATED YET
+ ##ID:001126##
+ mcset $l "-- click to close --" \
+ "-- 点击关闭 --"
+ ##ID:001127##
+ mcset $l "Instruction operands" \
+ "Instruction operands" ;# <-- NOT TRANSLATED YET
+ ##ID:001128##
+ mcset $l "Instruction name" \
+ "Instruction name" ;# <-- NOT TRANSLATED YET
+ ##ID:001129##
+ mcset $l "Show legend" \
+ "Show legend" ;# <-- NOT TRANSLATED YET
+ ##ID:001130##
+ mcset $l "Conditional assembly\n\nSyntax:\n ELSEIF <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "Conditional assembly\n\nSyntax:\n ELSEIF <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001131##
+ mcset $l "IF Not, conditional assembly\n\nSyntax:\n IFN <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "IF Not, conditional assembly\n\nSyntax:\n IFN <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001132##
+ mcset $l "ELSE IF Not\n\nSyntax:\n ELSEIFN <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFN SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "ELSE IF Not\n\nSyntax:\n ELSEIFN <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFN SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001133##
+ mcset $l "IF DEFined\n\nSyntax:\n IFDEF <symbol>\n\nExample:\n IFDEF CND\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "IF DEFined\n\nSyntax:\n IFDEF <symbol>\n\nExample:\n IFDEF CND\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001134##
+ mcset $l "ELSE IF DEFined\n\nSyntax:\n ELSEIFDEF <symbol>\n\nExample:\n IFDEF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "ELSE IF DEFined\n\nSyntax:\n ELSEIFDEF <symbol>\n\nExample:\n IFDEF(2 * 4 - CND)\n MOV A, #20h\n ELSEIFDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001135##
+ mcset $l "IF Not DEFined\n\nSyntax:\n IFNDEF <symbol>\n\nExample:\n IFNDEF CND\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "IF Not DEFined\n\nSyntax:\n IFNDEF <symbol>\n\nExample:\n IFNDEF CND\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001136##
+ mcset $l "ELSE IF Not DEFined\n\nSyntax:\n ELSEIFNDEF <symbol>\n\nExample:\n IFDEF CND\n MOV A, #20h\n ELSEIFNDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "ELSE IF Not DEFined\n\nSyntax:\n ELSEIFNDEF <symbol>\n\nExample:\n IFDEF CND\n MOV A, #20h\n ELSEIFNDEF SOMETHING_ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001137##
+ mcset $l "IF Black\n\nSyntax:\n IFB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" \
+ "IF Black\n\nSyntax:\n IFB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001138##
+ mcset $l "ELSE IF Black\n\nSyntax:\n ELSEIFB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSEIFB <SOMETHING_ELSE>\n MOV A, #40h\n ENDIF\n\literal:\n Supported by ASEM-51 only" \
+ "ELSE IF Black\n\nSyntax:\n ELSEIFB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSEIFB <SOMETHING_ELSE>\n MOV A, #40h\n ENDIF\n\literal:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001139##
+ mcset $l "IF Not Black\n\nSyntax:\n IFNB <literal>\n\nExample:\n IFNB <CND>\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" \
+ "IF Not Black\n\nSyntax:\n IFNB <literal>\n\nExample:\n IFNB <CND>\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001140##
+ mcset $l "ELSE IF Not Black\n\nSyntax:\n ELSEIFNB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSEIFNB <SOMETHING_ELSE>\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" \
+ "ELSE IF Not Black\n\nSyntax:\n ELSEIFNB <literal>\n\nExample:\n IFB <CND>\n MOV A, #20h\n ELSEIFNB <SOMETHING_ELSE>\n MOV A, #40h\n ENDIF\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001141##
+ mcset $l "REPeaT Macro\n\nSyntax:\n REPT <expr>\n\nExample:\n REPT 5\n NOP\n ENDM\n\n" \
+ "REPeaT Macro\n\nSyntax:\n REPT <expr>\n\nExample:\n REPT 5\n NOP\n ENDM\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001142##
+ mcset $l "REPeaT Macro\n\nSyntax:\n TIMES <expr>\n\nExample:\n TIMES 5\n NOP\n ENDM\n\nNote:\n Supported by native assembler only" \
+ "REPeaT Macro\n\nSyntax:\n TIMES <expr>\n\nExample:\n TIMES 5\n NOP\n ENDM\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001143##
+ mcset $l "define module NAME\n\nSyntax:\n NAME <name>\n\nExample:\n NAME my_2nd_program\n\nNote:\n Supported by ASEM-51 only" \
+ "define module NAME\n\nSyntax:\n NAME <name>\n\nExample:\n NAME my_2nd_program\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001144##
+ mcset $l "Conditional assembly\n\nSyntax:\n IF <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "Conditional assembly\n\nSyntax:\n IF <expr>\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001145##
+ mcset $l "Conditional assembly\n\nSyntax:\n ELSE\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "Conditional assembly\n\nSyntax:\n ELSE\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001146##
+ mcset $l "Conditional assembly\n\nSyntax:\n ENDIF\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" \
+ "Conditional assembly\n\nSyntax:\n ENDIF\n\nExample:\n IF(2 * 4 - CND)\n MOV A, #20h\n ELSE\n MOV A, #40h\n ENDIF\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001147##
+ mcset $l "END of Macro definition\n\nSyntax:\n ENDM\n\nExample:\n ABC MACRO\n MOV B, #12d\n ENDM\n\n" \
+ "END of Macro definition\n\nSyntax:\n ENDM\n\nExample:\n ABC MACRO\n MOV B, #12d\n ENDM\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001148##
+ mcset $l "END of the program\n\nSyntax:\n END\n\nExample:\n END\n\n" \
+ "END of the program\n\nSyntax:\n END\n\nExample:\n END\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001149##
+ mcset $l "premature end of macro expansion\n\nSyntax:\n EXITM\n\nExample:\n ABC MACRO\n MOV B, #12d\n EXITM\n NOP\n ENDM\n\n" \
+ "premature end of macro expansion\n\nSyntax:\n EXITM\n\nExample:\n ABC MACRO\n MOV B, #12d\n EXITM\n NOP\n ENDM\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001150##
+ mcset $l "enable code LISTing\n\nSyntax:\n LIST\n\nExample:\n NOP\n NOLIST\n NOP\n NOP\n LIST\n NOP\n\n" \
+ "enable code LISTing\n\nSyntax:\n LIST\n\nExample:\n NOP\n NOLIST\n NOP\n NOP\n LIST\n NOP\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001151##
+ mcset $l "disabled code listing\n\nSyntax:\n NOLIST\n\nExample:\n NOP\n NOLIST\n NOP\n NOP\n LIST\n NOP\n\n" \
+ "disabled code listing\n\nSyntax:\n NOLIST\n\nExample:\n NOP\n NOLIST\n NOP\n NOP\n LIST\n NOP\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001152##
+ mcset $l "switch to DATA segment \[at address\]\n\nSyntax:\n DSEG \[AT <expr>\]\n\nExample:\n DSEG at 20d\n\n" \
+ "switch to DATA segment \[at address\]\n\nSyntax:\n DSEG \[AT <expr>\]\n\nExample:\n DSEG at 20d\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001153##
+ mcset $l "switch to IDATA segment \[at address\]\n\nSyntax:\n ISEG \[AT <expr>\]\n\nExample:\n ISEG at 10d\n\n" \
+ "switch to IDATA segment \[at address\]\n\nSyntax:\n ISEG \[AT <expr>\]\n\nExample:\n ISEG at 10d\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001154##
+ mcset $l "switch to BIT segment \[at address\]\n\nSyntax:\n BSEG \[AT <expr>\]\n\nExample:\n BSEG at 5d\n\n" \
+ "switch to BIT segment \[at address\]\n\nSyntax:\n BSEG \[AT <expr>\]\n\nExample:\n BSEG at 5d\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001155##
+ mcset $l "switch to XDATA segment \[at address\]\n\nSyntax:\n XSEG \[AT <expr>\]\n\nExample:\n XSEG at 30d\n\n" \
+ "switch to XDATA segment \[at address\]\n\nSyntax:\n XSEG \[AT <expr>\]\n\nExample:\n XSEG at 30d\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001156##
+ mcset $l "switch to CODE segment \[at address\]\n\nSyntax:\n CSEG \[AT <expr>\]\n\nExample:\n CSEG at 40d\n\n" \
+ "switch to CODE segment \[at address\]\n\nSyntax:\n CSEG \[AT <expr>\]\n\nExample:\n CSEG at 40d\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001157##
+ mcset $l "define a FLAG bit\n\nSyntax:\n <symbol> FLAG <expr>\n\nExample:\n F4 FLAG 16h\n\nNote:\n Deprecated directive. Consider directive BIT instead." \
+ "define a FLAG bit\n\nSyntax:\n <symbol> FLAG <expr>\n\nExample:\n F4 FLAG 16h\n\nNote:\n Deprecated directive. Consider directive BIT instead." ;# <-- NOT TRANSLATED YET
+ ##ID:001158##
+ mcset $l "SKIP bytes in the code memory\n\nSyntax:\n SKIP <expr>\n\nExample:\n SKIP 5\n\n" \
+ "SKIP bytes in the code memory\n\nSyntax:\n SKIP <expr>\n\nExample:\n SKIP 5\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001159##
+ mcset $l "EQUivalent\n\nSyntax:\n <symbol> EQU <expr>\n\nExample:\n ABC EQU R0\n XYZ EQU 4Eh+12\n\n" \
+ "EQUivalent\n\nSyntax:\n <symbol> EQU <expr>\n\nExample:\n ABC EQU R0\n XYZ EQU 4Eh+12\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001160##
+ mcset $l "define BIT address\n\nSyntax:\n <symbol> BIT <expr>\n\nExample:\n ABC BIT P4.5\n\n" \
+ "define BIT address\n\nSyntax:\n <symbol> BIT <expr>\n\nExample:\n ABC BIT P4.5\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001161##
+ mcset $l "SET numeric variable or variable register\n\nSyntax:\n <symbol> SET <expr>\n <symbol> SET <register>\n\nExample:\n ALPHA SET R0\n ALPHA SET 42*BETA\n\n" \
+ "SET numeric variable or variable register\n\nSyntax:\n <symbol> SET <expr>\n <symbol> SET <register>\n\nExample:\n ALPHA SET R0\n ALPHA SET 42*BETA\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001162##
+ mcset $l "define address in the CODE memory\n\nSyntax:\n <symbol> CODE <expr>\n\nExample:\n TBL CODE 600h\n\n" \
+ "define address in the CODE memory\n\nSyntax:\n <symbol> CODE <expr>\n\nExample:\n TBL CODE 600h\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001163##
+ mcset $l "define address in the DATA memory\n\nSyntax:\n <symbol> DATA <expr>\n\nExample:\n UIV DATA 20h\n\n" \
+ "define address in the DATA memory\n\nSyntax:\n <symbol> DATA <expr>\n\nExample:\n UIV DATA 20h\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001164##
+ mcset $l "define address in the Internal DATA memory\n\nSyntax:\n <symbol> IDATA <expr>\n\nExample:\n UIV IDATA 20h\n\n" \
+ "define address in the Internal DATA memory\n\nSyntax:\n <symbol> IDATA <expr>\n\nExample:\n UIV IDATA 20h\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001165##
+ mcset $l "define address in the External DATA memory\n\nSyntax:\n <symbol> XDATA <expr>\n\nExample:\n UIV XDATA 400h\n\n" \
+ "define address in the External DATA memory\n\nSyntax:\n <symbol> XDATA <expr>\n\nExample:\n UIV XDATA 400h\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001166##
+ mcset $l "MACRO definition\n\nSyntax:\n <macro> MACRO \[<arg0> \[,<arg1> ... \]\n\n\nExample:\n ABC MACRO X\n MOV X, #12d\n ENDM\n\n" \
+ "MACRO definition\n\nSyntax:\n <macro> MACRO \[<arg0> \[,<arg1> ... \]\n\n\nExample:\n ABC MACRO X\n MOV X, #12d\n ENDM\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001167##
+ mcset $l "Define Space\n\nSyntax:\n DS <expr>\n\nExample:\n DS 2+4\n\n" \
+ "Define Space\n\nSyntax:\n DS <expr>\n\nExample:\n DS 2+4\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001168##
+ mcset $l "Define Words\n\nSyntax:\n DW <expr1> \[,<expr2> ... \]\n\nExample:\n DW 0,02009H,2009,4171\n\n" \
+ "Define Words\n\nSyntax:\n DW <expr1> \[,<expr2> ... \]\n\nExample:\n DW 0,02009H,2009,4171\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001169##
+ mcset $l "Define Bytes\n\nSyntax:\n DB <expr1> \[,<expr2> ... \]\n\nExample:\n DB 24,'August',09,(2*8+24)/8\n\n" \
+ "Define Bytes\n\nSyntax:\n DB <expr1> \[,<expr2> ... \]\n\nExample:\n DB 24,'August',09,(2*8+24)/8\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001170##
+ mcset $l "Define BITs\n\nSyntax:\n DBIT <expr>\n\nExample:\n DBIT 4+2\n\n" \
+ "Define BITs\n\nSyntax:\n DBIT <expr>\n\nExample:\n DBIT 4+2\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001171##
+ mcset $l "INCLUDE an external source code\n\nSyntax:\n INCLUDE <filename>\n\nExample:\n INCLUDE 'my file.asm'\n\n" \
+ "INCLUDE an external source code\n\nSyntax:\n INCLUDE <filename>\n\nExample:\n INCLUDE 'my file.asm'\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001172##
+ mcset $l "ORiGin of code segment location\n\nSyntax:\n ORG <expr>\n\nExample:\n ORG 0Bh\n\n" \
+ "ORiGin of code segment location\n\nSyntax:\n ORG <expr>\n\nExample:\n ORG 0Bh\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001173##
+ mcset $l "USING register banks\n\nSyntax:\n USING <expr>\n\nExample:\n USING 2\n\n" \
+ "USING register banks\n\nSyntax:\n USING <expr>\n\nExample:\n USING 2\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001174##
+ mcset $l "define BYTE address in the data memory\n\nSyntax:\n <symbol> BYTE <expr>\n\nExample:\n UIV BYTE 20h\n\nNote:\n Deprecated directive. Consider directive DATA instead." \
+ "define BYTE address in the data memory\n\nSyntax:\n <symbol> BYTE <expr>\n\nExample:\n UIV BYTE 20h\n\nNote:\n Deprecated directive. Consider directive DATA instead." ;# <-- NOT TRANSLATED YET
+ ##ID:001175##
+ mcset $l "List full IFxx .. ENDIF\n\nSyntax:\n \$COND\n\nExample:\n \$COND\n\nNote:\n Supported by ASEM-51 only" \
+ "List full IFxx .. ENDIF\n\nSyntax:\n \$COND\n\nExample:\n \$COND\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001176##
+ mcset $l "Don't list lines in false branches\n\nSyntax:\n \$NOCOND\n\nExample:\n \$NOCOND\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't list lines in false branches\n\nSyntax:\n \$NOCOND\n\nExample:\n \$NOCOND\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001177##
+ mcset $l "List assembled lines only\n\nSyntax:\n \$CONDONLY\n\nExample:\n \$CONDONLY\n\nNote:\n Supported by ASEM-51 only" \
+ "List assembled lines only\n\nSyntax:\n \$CONDONLY\n\nExample:\n \$CONDONLY\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001178##
+ mcset $l "Inserts date string into page header\n\nSyntax:\n \$DATE(string)\n\nExample:\n \$DATE(1965-12-31)\n\n" \
+ "Inserts date string into page header\n\nSyntax:\n \$DATE(string)\n\nExample:\n \$DATE(1965-12-31)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001179##
+ mcset $l "Include debug information\n\nSyntax:\n \$DEBUG\n\nExample:\n \$DEBUG\n\nNote:\n Supported by ASEM-51 only" \
+ "Include debug information\n\nSyntax:\n \$DEBUG\n\nExample:\n \$DEBUG\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001180##
+ mcset $l "Include debug information\n\nSyntax:\n \$DB\n\nExample:\n \$DB\n\nNote:\n Supported by ASEM-51 only" \
+ "Include debug information\n\nSyntax:\n \$DB\n\nExample:\n \$DB\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001181##
+ mcset $l "Don't include debug information\n\nSyntax:\n \$NODEBUG\n\nExample:\n \$NODEBUG\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't include debug information\n\nSyntax:\n \$NODEBUG\n\nExample:\n \$NODEBUG\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001182##
+ mcset $l "Don't include debug information\n\nSyntax:\n \$NODB\n\nExample:\n \$NODB\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't include debug information\n\nSyntax:\n \$NODB\n\nExample:\n \$NODB\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001183##
+ mcset $l "Start a new page in list file\n\nSyntax:\n \$EJECT\n\nExample:\n \$EJECT\n\n" \
+ "Start a new page in list file\n\nSyntax:\n \$EJECT\n\nExample:\n \$EJECT\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001184##
+ mcset $l "Start a new page in list file\n\nSyntax:\n \$EJ\n\nExample:\n \$EJ\n\n" \
+ "Start a new page in list file\n\nSyntax:\n \$EJ\n\nExample:\n \$EJ\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001185##
+ mcset $l "Force a user-defined error\n\nSyntax:\n \$ERROR(string)\n\nExample:\n \$ERROR(Impossible combination ...)\n\nNote:\n Supported by ASEM-51 only" \
+ "Force a user-defined error\n\nSyntax:\n \$ERROR(string)\n\nExample:\n \$ERROR(Impossible combination ...)\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001186##
+ mcset $l "Force a user-defined warning\n\nSyntax:\n \$WARNING(string)\n\nExample:\n \$WARNING(Testing only !)\n\nNote:\n Supported by ASEM-51 only" \
+ "Force a user-defined warning\n\nSyntax:\n \$WARNING(string)\n\nExample:\n \$WARNING(Testing only !)\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001187##
+ mcset $l "List macro calls and expansion lines\n\nSyntax:\n \$GE\n\nExample:\n \$GE\n\nNote:\n Supported by ASEM-51 only" \
+ "List macro calls and expansion lines\n\nSyntax:\n \$GE\n\nExample:\n \$GE\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001188##
+ mcset $l "List macro calls and expansion lines\n\nSyntax:\n \$GEN\n\nExample:\n \$GEN\n\nNote:\n Supported by ASEM-51 only" \
+ "List macro calls and expansion lines\n\nSyntax:\n \$GEN\n\nExample:\n \$GEN\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001189##
+ mcset $l "List macro calls only\n\nSyntax:\n \$NOGE\n\nExample:\n \$NOGE\n\nNote:\n Supported by ASEM-51 only" \
+ "List macro calls only\n\nSyntax:\n \$NOGE\n\nExample:\n \$NOGE\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001190##
+ mcset $l "List macro calls only\n\nSyntax:\n \$NOGEN\n\nExample:\n \$NOGEN\n\nNote:\n Supported by ASEM-51 only" \
+ "List macro calls only\n\nSyntax:\n \$NOGEN\n\nExample:\n \$NOGEN\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001191##
+ mcset $l "List expansion lines only\n\nSyntax:\n \$GO\n\nExample:\n \$GO\n\nNote:\n Supported by ASEM-51 only" \
+ "List expansion lines only\n\nSyntax:\n \$GO\n\nExample:\n \$GO\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001192##
+ mcset $l "List expansion lines only\n\nSyntax:\n \$GENONLY\n\nExample:\n \$GENONLY\n\nNote:\n Supported by ASEM-51 only" \
+ "List expansion lines only\n\nSyntax:\n \$GENONLY\n\nExample:\n \$GENONLY\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001193##
+ mcset $l "Include a source file\n\nSyntax:\n \$INCLUDE(string)\n\nExample:\n \$INCLUDE(somefile.asm)\n\n" \
+ "Include a source file\n\nSyntax:\n \$INCLUDE(string)\n\nExample:\n \$INCLUDE(somefile.asm)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001194##
+ mcset $l "Include a source file\n\nSyntax:\n \$INC(string)\n\nExample:\n \$INC(somefile.asm)\n\n" \
+ "Include a source file\n\nSyntax:\n \$INC(string)\n\nExample:\n \$INC(somefile.asm)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001195##
+ mcset $l "List subsequent source lines\n\nSyntax:\n \$LIST\n\nExample:\n \$LIST\n\n" \
+ "List subsequent source lines\n\nSyntax:\n \$LIST\n\nExample:\n \$LIST\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001196##
+ mcset $l "List subsequent source lines\n\nSyntax:\n \$LI\n\nExample:\n \$LI\n\n" \
+ "List subsequent source lines\n\nSyntax:\n \$LI\n\nExample:\n \$LI\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001197##
+ mcset $l "Don't list subsequent source lines\n\nSyntax:\n \$NOLI\n\nExample:\n \$NOLI\n\n" \
+ "Don't list subsequent source lines\n\nSyntax:\n \$NOLI\n\nExample:\n \$NOLI\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001198##
+ mcset $l "Don't list subsequent source lines\n\nSyntax:\n \$NOLIST\n\nExample:\n \$NOLIST\n\n" \
+ "Don't list subsequent source lines\n\nSyntax:\n \$NOLIST\n\nExample:\n \$NOLIST\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001199##
+ mcset $l "Reserve n % of free memory for macros\n\nSyntax:\n \$MACRO(int)\n\nExample:\n \$MACRO(50)\n\nNote:\n Supported by ASEM-51 only" \
+ "Reserve n % of free memory for macros\n\nSyntax:\n \$MACRO(int)\n\nExample:\n \$MACRO(50)\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001200##
+ mcset $l "Reserve n % of free memory for macros\n\nSyntax:\n \$MR(int)\n\nExample:\n \$MR(50)\n\nNote:\n Supported by ASEM-51 only" \
+ "Reserve n % of free memory for macros\n\nSyntax:\n \$MR(int)\n\nExample:\n \$MR(50)\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001201##
+ mcset $l "Reserve all for the symbol table\n\nSyntax:\n \$NOMR\n\nExample:\n \$NOMR\n\nNote:\n Supported by ASEM-51 only" \
+ "Reserve all for the symbol table\n\nSyntax:\n \$NOMR\n\nExample:\n \$NOMR\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001202##
+ mcset $l "Reserve all for the symbol table\n\nSyntax:\n \$NOMACRO\n\nExample:\n \$NOMACRO\n\nNote:\n Supported by ASEM-51 only" \
+ "Reserve all for the symbol table\n\nSyntax:\n \$NOMACRO\n\nExample:\n \$NOMACRO\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001203##
+ mcset $l "Enable predefined SFR symbols\n\nSyntax:\n \$MOD51\n\nExample:\n \$MOD51\n\nNote:\n Supported by ASEM-51 only" \
+ "Enable predefined SFR symbols\n\nSyntax:\n \$MOD51\n\nExample:\n \$MOD51\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001204##
+ mcset $l "Enable predefined SFR symbols\n\nSyntax:\n \$MO\n\nExample:\n \$MO\n\nNote:\n Supported by ASEM-51 only" \
+ "Enable predefined SFR symbols\n\nSyntax:\n \$MO\n\nExample:\n \$MO\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001205##
+ mcset $l "Disable predefined SFR symbols\n\nSyntax:\n \$NOMOD\n\nExample:\n \$NOMOD\n\n" \
+ "Disable predefined SFR symbols\n\nSyntax:\n \$NOMOD\n\nExample:\n \$NOMOD\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001206##
+ mcset $l "Disable predefined SFR symbols\n\nSyntax:\n \$NOMO\n\nExample:\n \$NOMO\n\n" \
+ "Disable predefined SFR symbols\n\nSyntax:\n \$NOMO\n\nExample:\n \$NOMO\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001207##
+ mcset $l "Disable predefined SFR symbols\n\nSyntax:\n \$NOMOD51\n\nExample:\n \$NOMOD51\n\n" \
+ "Disable predefined SFR symbols\n\nSyntax:\n \$NOMOD51\n\nExample:\n \$NOMOD51\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001208##
+ mcset $l "Don't list predefined symbols\n\nSyntax:\n \$NOBUILTIN\n\nExample:\n \$NOBUILTIN\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't list predefined symbols\n\nSyntax:\n \$NOBUILTIN\n\nExample:\n \$NOBUILTIN\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001209##
+ mcset $l "Don't use tabs in list file\n\nSyntax:\n \$NOTABS\n\nExample:\n \$NOTABS\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't use tabs in list file\n\nSyntax:\n \$NOTABS\n\nExample:\n \$NOTABS\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001210##
+ mcset $l "Enable listing page formatting\n\nSyntax:\n \$LIST\n\nExample:\n \$PAGING\n\n" \
+ "Enable listing page formatting\n\nSyntax:\n \$LIST\n\nExample:\n \$PAGING\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001211##
+ mcset $l "Enable listing page formatting\n\nSyntax:\n \$PI\n\nExample:\n \$PI\n\n" \
+ "Enable listing page formatting\n\nSyntax:\n \$PI\n\nExample:\n \$PI\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001212##
+ mcset $l "Disable listing page formatting\n\nSyntax:\n \$NOPI\n\nExample:\n \$NOPI\n\n" \
+ "Disable listing page formatting\n\nSyntax:\n \$NOPI\n\nExample:\n \$NOPI\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001213##
+ mcset $l "Disable listing page formatting\n\nSyntax:\n \$NOPAGING\n\nExample:\n \$NOPAGING\n\n" \
+ "Disable listing page formatting\n\nSyntax:\n \$NOPAGING\n\nExample:\n \$NOPAGING\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001214##
+ mcset $l "Set lines per page for listing\n\nSyntax:\n \$PAGELENGTH(int)\n\nExample:\n \$PAGELENGTH(64)\n\n" \
+ "Set lines per page for listing\n\nSyntax:\n \$PAGELENGTH(int)\n\nExample:\n \$PAGELENGTH(64)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001215##
+ mcset $l "Set lines per page for listing\n\nSyntax:\n \$PL(int)\n\nExample:\n \$PL(64)\n\n" \
+ "Set lines per page for listing\n\nSyntax:\n \$PL(int)\n\nExample:\n \$PL(64)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001216##
+ mcset $l "Set columns per line for listing\n\nSyntax:\n \$PAGEWIDTH(int)\n\nExample:\n \$PAGEWIDTH(132)\n\n" \
+ "Set columns per line for listing\n\nSyntax:\n \$PAGEWIDTH(int)\n\nExample:\n \$PAGEWIDTH(132)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001217##
+ mcset $l "Set columns per line for listing\n\nSyntax:\n \$PW(int)\n\nExample:\n \$PW(132)\n\n" \
+ "Set columns per line for listing\n\nSyntax:\n \$PW(int)\n\nExample:\n \$PW(132)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001218##
+ mcset $l "Switch on 83C75x family support\n\nSyntax:\n \$PHILIPS\n\nExample:\n \$PHILIPS\n\nNote:\n Supported by ASEM-51 only" \
+ "Switch on 83C75x family support\n\nSyntax:\n \$PHILIPS\n\nExample:\n \$PHILIPS\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001219##
+ mcset $l "Save current \$LIST/\$GEN/\$COND\n\nSyntax:\n \$SAVE\n\nExample:\n \$SAVE\n\nNote:\n Supported by ASEM-51 only" \
+ "Save current \$LIST/\$GEN/\$COND\n\nSyntax:\n \$SAVE\n\nExample:\n \$SAVE\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001220##
+ mcset $l "Save current \$LIST/\$GEN/\$COND\n\nSyntax:\n \$SA\n\nExample:\n \$SA\n\nNote:\n Supported by ASEM-51 only" \
+ "Save current \$LIST/\$GEN/\$COND\n\nSyntax:\n \$SA\n\nExample:\n \$SA\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001221##
+ mcset $l "Restore old \$LIST/\$GEN/\$COND\n\nSyntax:\n \$RESTORE\n\nExample:\n \$RESTORE\n\nNote:\n Supported by ASEM-51 only" \
+ "Restore old \$LIST/\$GEN/\$COND\n\nSyntax:\n \$RESTORE\n\nExample:\n \$RESTORE\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001222##
+ mcset $l "Restore old \$LIST/\$GEN/\$COND\n\nSyntax:\n \$RS\n\nExample:\n \$RS\n\nNote:\n Supported by ASEM-51 only" \
+ "Restore old \$LIST/\$GEN/\$COND\n\nSyntax:\n \$RS\n\nExample:\n \$RS\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001223##
+ mcset $l "Create symbol table\n\nSyntax:\n \$SYMBOLS\n\nExample:\n \$SYMBOLS\n\n" \
+ "Create symbol table\n\nSyntax:\n \$SYMBOLS\n\nExample:\n \$SYMBOLS\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001224##
+ mcset $l "Create symbol table\n\nSyntax:\n \$SB\n\nExample:\n \$SB\n\n" \
+ "Create symbol table\n\nSyntax:\n \$SB\n\nExample:\n \$SB\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001225##
+ mcset $l "Don't create symbol table\n\nSyntax:\n \$NOSYMBOLS\n\nExample:\n \$NOSYMBOLS\n\n" \
+ "Don't create symbol table\n\nSyntax:\n \$NOSYMBOLS\n\nExample:\n \$NOSYMBOLS\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001226##
+ mcset $l "Don't create symbol table\n\nSyntax:\n \$NOSB\n\nExample:\n \$NOSB\n\n" \
+ "Don't create symbol table\n\nSyntax:\n \$NOSB\n\nExample:\n \$NOSB\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001227##
+ mcset $l "Inserts title string into page header\n\nSyntax:\n \$TITLE(string)\n\nExample:\n \$TITLE(My firts code)\n\n" \
+ "Inserts title string into page header\n\nSyntax:\n \$TITLE(string)\n\nExample:\n \$TITLE(My firts code)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001228##
+ mcset $l "Inserts title string into page header\n\nSyntax:\n \$TT(string)\n\nExample:\n \$TT(My firts code)\n\n" \
+ "Inserts title string into page header\n\nSyntax:\n \$TT(string)\n\nExample:\n \$TT(My firts code)\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001229##
+ mcset $l "Create cross reference\n\nSyntax:\n \$XREF\n\nExample:\n \$XREF\n\nNote:\n Supported by ASEM-51 only" \
+ "Create cross reference\n\nSyntax:\n \$XREF\n\nExample:\n \$XREF\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001230##
+ mcset $l "Create cross reference\n\nSyntax:\n \$XR\n\nExample:\n \$XR\n\nNote:\n Supported by ASEM-51 only" \
+ "Create cross reference\n\nSyntax:\n \$XR\n\nExample:\n \$XR\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001231##
+ mcset $l "Don't create cross reference\n\nSyntax:\n \$NOXREF\n\nExample:\n \$NOXREF\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't create cross reference\n\nSyntax:\n \$NOXREF\n\nExample:\n \$NOXREF\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001232##
+ mcset $l "Don't create cross reference\n\nSyntax:\n \$NOXR\n\nExample:\n \$NOXR\n\nNote:\n Supported by ASEM-51 only" \
+ "Don't create cross reference\n\nSyntax:\n \$NOXR\n\nExample:\n \$NOXR\n\nNote:\n Supported by ASEM-51 only" ;# <-- NOT TRANSLATED YET
+ ##ID:001233##
+ mcset $l "Do not create Intel HEX file\n\nSyntax:\n \$NOOBJECT\n\nExample:\n \$NOOBJECT\n\nNote:\n Supported by native assembler only" \
+ "Do not create Intel HEX file\n\nSyntax:\n \$NOOBJECT\n\nExample:\n \$NOOBJECT\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001234##
+ mcset $l "Specify file name for Intel HEX\n\nSyntax:\n \$OBJECT(string)\n\nExample:\n \$OBJECT(my_hex.hex)\n\nNote:\n Supported by native assembler only" \
+ "Specify file name for Intel HEX\n\nSyntax:\n \$OBJECT(string)\n\nExample:\n \$OBJECT(my_hex.hex)\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001235##
+ mcset $l "Specify file name for list file\n\nSyntax:\n \$PRINT(string)\n\nExample:\n \$PRINT(my_list.lst)\n\nNote:\n Supported by native assembler only" \
+ "Specify file name for list file\n\nSyntax:\n \$PRINT(string)\n\nExample:\n \$PRINT(my_list.lst)\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001236##
+ mcset $l "Do not create list file at all\n\nSyntax:\n \$NOPRINT\n\nExample:\n \$NOPRINT\n\nNote:\n Supported by native assembler only" \
+ "Do not create list file at all\n\nSyntax:\n \$NOPRINT\n\nExample:\n \$NOPRINT\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001237##
+ mcset $l "Define and expand macro instruction after! conditional assembly and definitions of constants\n\nSyntax:\n \$NOMACROSFIRTS\n\nExample:\n \$NOMACROSFIRTS\n\nNote:\n Supported by native assembler only" \
+ "Define and expand macro instruction after! conditional assembly and definitions of constants\n\nSyntax:\n \$NOMACROSFIRTS\n\nExample:\n \$NOMACROSFIRTS\n\nNote:\n Supported by native assembler only" ;# <-- NOT TRANSLATED YET
+ ##ID:001238##
+ mcset $l "Add register to Accumulator" \
+ "Add register to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001239##
+ mcset $l "Add direct byte to Accumulator" \
+ "Add direct byte to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001240##
+ mcset $l "Add indirect RAM to Accumulator" \
+ "Add indirect RAM to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001241##
+ mcset $l "Add immediate data to Accumulator" \
+ "Add immediate data to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001242##
+ mcset $l "Add register to Accumulator with Carry" \
+ "Add register to Accumulator with Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001243##
+ mcset $l "Add direct byte to Accumulator with Carry" \
+ "Add direct byte to Accumulator with Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001244##
+ mcset $l "Add indirect RAM to Accumulator with Carry" \
+ "Add indirect RAM to Accumulator with Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001245##
+ mcset $l "Add immediate data to Acc with Carry" \
+ "Add immediate data to Acc with Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001246##
+ mcset $l "Subtract Register from Acc with borrow" \
+ "Subtract Register from Acc with borrow" ;# <-- NOT TRANSLATED YET
+ ##ID:001247##
+ mcset $l "Subtract direct byte from Acc with borrow" \
+ "Subtract direct byte from Acc with borrow" ;# <-- NOT TRANSLATED YET
+ ##ID:001248##
+ mcset $l "Subtract indirect RAM from ACC with borrow" \
+ "Subtract indirect RAM from ACC with borrow" ;# <-- NOT TRANSLATED YET
+ ##ID:001249##
+ mcset $l "Subtract immediate data from Acc with borrow" \
+ "Subtract immediate data from Acc with borrow" ;# <-- NOT TRANSLATED YET
+ ##ID:001250##
+ mcset $l "Increment Accumulator" \
+ "Increment Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001251##
+ mcset $l "Increment register" \
+ "Increment register" ;# <-- NOT TRANSLATED YET
+ ##ID:001252##
+ mcset $l "Increment direct byte" \
+ "Increment direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001253##
+ mcset $l "Increment direct RAM" \
+ "Increment direct RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:001254##
+ mcset $l "Decrement Accumulator" \
+ "Decrement Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001255##
+ mcset $l "Decrement Register" \
+ "Decrement Register" ;# <-- NOT TRANSLATED YET
+ ##ID:001256##
+ mcset $l "Decrement direct byte" \
+ "Decrement direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001257##
+ mcset $l "Decrement indirect RAM" \
+ "Decrement indirect RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:001258##
+ mcset $l "Increment Data Pointer" \
+ "Increment Data Pointer" ;# <-- NOT TRANSLATED YET
+ ##ID:001259##
+ mcset $l "Multiply A & B" \
+ "Multiply A & B" ;# <-- NOT TRANSLATED YET
+ ##ID:001260##
+ mcset $l "Divide A by B" \
+ "Divide A by B" ;# <-- NOT TRANSLATED YET
+ ##ID:001261##
+ mcset $l "Decimal Adjust Accumulator" \
+ "Decimal Adjust Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001262##
+ mcset $l "AND Register to Accumulator" \
+ "AND Register to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001263##
+ mcset $l "AND direct byte to Accumulator" \
+ "AND direct byte to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001264##
+ mcset $l "AND indirect RAM to Accumulator" \
+ "AND indirect RAM to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001265##
+ mcset $l "AND immediate data to Accumulator" \
+ "AND immediate data to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001266##
+ mcset $l "AND Accumulator to direct byte" \
+ "AND Accumulator to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001267##
+ mcset $l "AND immediate data to direct byte" \
+ "AND immediate data to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001268##
+ mcset $l "OR register to Accumulator" \
+ "OR register to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001269##
+ mcset $l "OR direct byte to Accumulator" \
+ "OR direct byte to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001270##
+ mcset $l "OR indirect RAM to Accumulator" \
+ "OR indirect RAM to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001271##
+ mcset $l "OR immediate data to Accumulator" \
+ "OR immediate data to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001272##
+ mcset $l "OR Accumulator to direct byte" \
+ "OR Accumulator to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001273##
+ mcset $l "OR immediate data to direct byte" \
+ "OR immediate data to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001274##
+ mcset $l "Exclusive-OR register to Accumulator" \
+ "Exclusive-OR register to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001275##
+ mcset $l "Exclusive-OR direct byte to Accumulator" \
+ "Exclusive-OR direct byte to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001276##
+ mcset $l "Exclusive-OR indirect RAM to Accumulator" \
+ "Exclusive-OR indirect RAM to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001277##
+ mcset $l "Exclusive-OR immediate data to Accumulator" \
+ "Exclusive-OR immediate data to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001278##
+ mcset $l "Exclusive-OR Accumulator to direct byte" \
+ "Exclusive-OR Accumulator to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001279##
+ mcset $l "Exclusive-OR immediate data to direct byte" \
+ "Exclusive-OR immediate data to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001280##
+ mcset $l "Clear Accumulator" \
+ "Clear Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001281##
+ mcset $l "Complement Accumulator" \
+ "Complement Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001282##
+ mcset $l "Rotate Accumulator Left" \
+ "Rotate Accumulator Left" ;# <-- NOT TRANSLATED YET
+ ##ID:001283##
+ mcset $l "Rotate Accumulator Left through the Carry" \
+ "Rotate Accumulator Left through the Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001284##
+ mcset $l "Rotate Accumulator Right" \
+ "Rotate Accumulator Right" ;# <-- NOT TRANSLATED YET
+ ##ID:001285##
+ mcset $l "Rotate Accumulator Right through the Carry" \
+ "Rotate Accumulator Right through the Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001286##
+ mcset $l "Swap nibbles within the Accumulator" \
+ "Swap nibbles within the Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001287##
+ mcset $l "Move register to Accumulator" \
+ "Move register to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001288##
+ mcset $l "Move direct byte to Accumulator" \
+ "Move direct byte to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001289##
+ mcset $l "Move indirect RAM to Accumulator" \
+ "Move indirect RAM to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001290##
+ mcset $l "Move immediate data to Accumulator" \
+ "Move immediate data to Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001291##
+ mcset $l "Move Accumulator to register" \
+ "Move Accumulator to register" ;# <-- NOT TRANSLATED YET
+ ##ID:001292##
+ mcset $l "Move direct byte to register" \
+ "Move direct byte to register" ;# <-- NOT TRANSLATED YET
+ ##ID:001293##
+ mcset $l "Move immediate data to register" \
+ "Move immediate data to register" ;# <-- NOT TRANSLATED YET
+ ##ID:001294##
+ mcset $l "Move Accumulator to direct byte" \
+ "Move Accumulator to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001295##
+ mcset $l "Move register to direct byte" \
+ "Move register to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001296##
+ mcset $l "Move direct byte to direct" \
+ "Move direct byte to direct" ;# <-- NOT TRANSLATED YET
+ ##ID:001297##
+ mcset $l "Move indirect RAM to direct byte" \
+ "Move indirect RAM to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001298##
+ mcset $l "Move immediate data to direct byte" \
+ "Move immediate data to direct byte" ;# <-- NOT TRANSLATED YET
+ ##ID:001299##
+ mcset $l "Move Accumulator to indirect RAM" \
+ "Move Accumulator to indirect RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:001300##
+ mcset $l "Move direct byte to indirect RAM" \
+ "Move direct byte to indirect RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:001301##
+ mcset $l "Move immediate data to indirect RAM" \
+ "Move immediate data to indirect RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:001302##
+ mcset $l "Load Data Pointer with a 16-bit constant" \
+ "Load Data Pointer with a 16-bit constant" ;# <-- NOT TRANSLATED YET
+ ##ID:001303##
+ mcset $l "Move Code byte relative to DPTR to Acc" \
+ "Move Code byte relative to DPTR to Acc" ;# <-- NOT TRANSLATED YET
+ ##ID:001304##
+ mcset $l "Move Code byte relative to PC to Acc" \
+ "Move Code byte relative to PC to Acc" ;# <-- NOT TRANSLATED YET
+ ##ID:001305##
+ mcset $l "Move External RAM (8-bit addr) to Acc" \
+ "Move External RAM (8-bit addr) to Acc" ;# <-- NOT TRANSLATED YET
+ ##ID:001306##
+ mcset $l "Move Exernal RAM (16-bit addr) to Acc" \
+ "Move Exernal RAM (16-bit addr) to Acc" ;# <-- NOT TRANSLATED YET
+ ##ID:001307##
+ mcset $l "Move Acc to External RAM (8-bit addr)" \
+ "Move Acc to External RAM (8-bit addr)" ;# <-- NOT TRANSLATED YET
+ ##ID:001308##
+ mcset $l "Move Acc to External RAM (16-bit addr)" \
+ "Move Acc to External RAM (16-bit addr)" ;# <-- NOT TRANSLATED YET
+ ##ID:001309##
+ mcset $l "Push direct byte onto stack" \
+ "Push direct byte onto stack" ;# <-- NOT TRANSLATED YET
+ ##ID:001310##
+ mcset $l "Pop direct byte from stack" \
+ "Pop direct byte from stack" ;# <-- NOT TRANSLATED YET
+ ##ID:001311##
+ mcset $l "Exchange register with Accumulator" \
+ "Exchange register with Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001312##
+ mcset $l "Exchange direct byte with Accumulator" \
+ "Exchange direct byte with Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001313##
+ mcset $l "Exchange indirect RAM with Accumulator" \
+ "Exchange indirect RAM with Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:001314##
+ mcset $l "Exchange low-order Digit indirect RAM with Acc" \
+ "Exchange low-order Digit indirect RAM with Acc" ;# <-- NOT TRANSLATED YET
+ ##ID:001315##
+ mcset $l "Clear Carry" \
+ "Clear Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001316##
+ mcset $l "Clear direct bit" \
+ "Clear direct bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001317##
+ mcset $l "Set Carry" \
+ "Set Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001318##
+ mcset $l "Set direct bit" \
+ "Set direct bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001319##
+ mcset $l "Complement Carry" \
+ "Complement Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001320##
+ mcset $l "Complement direct bit" \
+ "Complement direct bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001321##
+ mcset $l "AND direct bit to CARRY" \
+ "AND direct bit to CARRY" ;# <-- NOT TRANSLATED YET
+ ##ID:001322##
+ mcset $l "AND complement of direct bit to Carry" \
+ "AND complement of direct bit to Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001323##
+ mcset $l "OR direct bit to Carry" \
+ "OR direct bit to Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001324##
+ mcset $l "OR complement of direct bit to Carry" \
+ "OR complement of direct bit to Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001325##
+ mcset $l "Move direct bit to Carry" \
+ "Move direct bit to Carry" ;# <-- NOT TRANSLATED YET
+ ##ID:001326##
+ mcset $l "Move Carry to direct bit" \
+ "Move Carry to direct bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001327##
+ mcset $l "Jump if Carry is set" \
+ "Jump if Carry is set" ;# <-- NOT TRANSLATED YET
+ ##ID:001328##
+ mcset $l "Jump if Carry not set" \
+ "Jump if Carry not set" ;# <-- NOT TRANSLATED YET
+ ##ID:001329##
+ mcset $l "Jump if direct Bit is set" \
+ "Jump if direct Bit is set" ;# <-- NOT TRANSLATED YET
+ ##ID:001330##
+ mcset $l "Jump if direct Bit is Not set" \
+ "Jump if direct Bit is Not set" ;# <-- NOT TRANSLATED YET
+ ##ID:001331##
+ mcset $l "Jump if direct Bit is set & clear bit" \
+ "Jump if direct Bit is set & clear bit" ;# <-- NOT TRANSLATED YET
+ ##ID:001332##
+ mcset $l "Absolute Subroutine Call" \
+ "Absolute Subroutine Call" ;# <-- NOT TRANSLATED YET
+ ##ID:001333##
+ mcset $l "Long Subroutine Call" \
+ "Long Subroutine Call" ;# <-- NOT TRANSLATED YET
+ ##ID:001334##
+ mcset $l "Return from Subroutine" \
+ "Return from Subroutine" ;# <-- NOT TRANSLATED YET
+ ##ID:001335##
+ mcset $l "Return from interrupt" \
+ "Return from interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:001336##
+ mcset $l "Absolute Jump" \
+ "Absolute Jump" ;# <-- NOT TRANSLATED YET
+ ##ID:001337##
+ mcset $l "Long Jump" \
+ "Long Jump" ;# <-- NOT TRANSLATED YET
+ ##ID:001338##
+ mcset $l "Short Jump (relative addr)" \
+ "Short Jump (relative addr)" ;# <-- NOT TRANSLATED YET
+ ##ID:001339##
+ mcset $l "Jump indirect relative to the DPTR" \
+ "Jump indirect relative to the DPTR" ;# <-- NOT TRANSLATED YET
+ ##ID:001340##
+ mcset $l "Jump if Accumulator is Zero" \
+ "Jump if Accumulator is Zero" ;# <-- NOT TRANSLATED YET
+ ##ID:001341##
+ mcset $l "Jump if Accumulator is Not Zero" \
+ "Jump if Accumulator is Not Zero" ;# <-- NOT TRANSLATED YET
+ ##ID:001342##
+ mcset $l "Compare direct byte to Acc and Jump if Not Equal" \
+ "Compare direct byte to Acc and Jump if Not Equal" ;# <-- NOT TRANSLATED YET
+ ##ID:001343##
+ mcset $l "Compare immediate to Acc and Jump if Not Equal" \
+ "Compare immediate to Acc and Jump if Not Equal" ;# <-- NOT TRANSLATED YET
+ ##ID:001344##
+ mcset $l "Compare immediate to register and Jump if Not Equal" \
+ "Compare immediate to register and Jump if Not Equal" ;# <-- NOT TRANSLATED YET
+ ##ID:001345##
+ mcset $l "Compare immediate to indirect and Jump if Not Equal" \
+ "Compare immediate to indirect and Jump if Not Equal" ;# <-- NOT TRANSLATED YET
+ ##ID:001346##
+ mcset $l "Decrement register and Jump if Not Zero" \
+ "Decrement register and Jump if Not Zero" ;# <-- NOT TRANSLATED YET
+ ##ID:001347##
+ mcset $l "Decrement direct byte and Jump if Not Zero" \
+ "Decrement direct byte and Jump if Not Zero" ;# <-- NOT TRANSLATED YET
+ ##ID:001348##
+ mcset $l "Program Branching" \
+ "Program Branching" ;# <-- NOT TRANSLATED YET
+ ##ID:001349##
+ mcset $l "No Operation" \
+ "No Operation" ;# <-- NOT TRANSLATED YET
+ ##ID:001350##
+ mcset $l "Data Transfer" \
+ "Data Transfer" ;# <-- NOT TRANSLATED YET
+ ##ID:001351##
+ mcset $l "Boolean Variable Manipulation" \
+ "Boolean Variable Manipulation" ;# <-- NOT TRANSLATED YET
+ ##ID:001352##
+ mcset $l "Read-Modify-Write" \
+ "Read-Modify-Write" ;# <-- NOT TRANSLATED YET
+ ##ID:001353##
+ mcset $l "Logical Operations" \
+ "Logical Operations" ;# <-- NOT TRANSLATED YET
+ ##ID:001354##
+ mcset $l "Arithmetic Operations" \
+ "Arithmetic Operations" ;# <-- NOT TRANSLATED YET
+}
+# messages.tcl
+# ==============================================================================
+namespace eval Messages {
+ ##ID:001355##
+ mcset $l "Copy selected text into clipboard" \
+ "复制选定的文本到剪贴板"
+ ##ID:001356##
+ mcset $l "Clear all messages" \
+ "清除所有消息"
+ ##ID:001357##
+ mcset $l "Select all text in this TextBox" \
+ "Select all text in this TextBox" ;# <-- NOT TRANSLATED YET
+ ##ID:001358##
+ mcset $l "Find next" \
+ "查找下一个"
+ ##ID:001359##
+ mcset $l "Find previous" \
+ "查找上一个"
+ ##ID:001360##
+ mcset $l "Match case" \
+ "区分大小写"
+ ##ID:001361##
+ mcset $l "Find:" \
+ "查找:"
+ ##ID:001362##
+ mcset $l "Hide search bar" \
+ "隐藏搜索栏"
+ ##ID:001363##
+ mcset $l "Find previous occurrence of search string" \
+ "查找上一个出现的搜索字"
+ ##ID:001364##
+ mcset $l "Find next occurrence of search string" \
+ "查找下一个出现的搜索字"
+}
+# hexeditor.tcl
+# ==============================================================================
+namespace eval HexEditor {
+ ##ID:001365##
+ mcset $l "Select all" \
+ "选择所有"
+ ##ID:001366##
+ mcset $l "Text to find" \
+ "要查找的文本"
+ ##ID:001367##
+ mcset $l "Where" \
+ "Where" ;# <-- NOT TRANSLATED YET
+ ##ID:001368##
+ mcset $l "Left view" \
+ "左视图"
+ ##ID:001369##
+ mcset $l "Right view" \
+ "右视图"
+ ##ID:001370##
+ mcset $l "Options" \
+ "选项"
+ ##ID:001371##
+ mcset $l "From cursor" \
+ "从光标"
+ ##ID:001372##
+ mcset $l "Backwards" \
+ "向后"
+ ##ID:001373##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:001374##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:001375##
+ mcset $l "Find" \
+ "查找"
+ ##ID:001376##
+ mcset $l "String not found" \
+ "字符未找到"
+ ##ID:001377##
+ mcset $l "Search string '%s' not found !" \
+ "字符 '%s' 没有搜索到!"
+}
+# cvarsview.tcl
+# ==============================================================================
+namespace eval CVarsView {
+ ##ID:001378##
+ mcset $l "Unable to read file\n'%s'" \
+ "无法读取文件\n'%s'"
+ ##ID:001379##
+ mcset $l "Permission denied" \
+ "没有权限"
+ ##ID:001380##
+ mcset $l "Search:" \
+ "搜索:"
+ ##ID:001381##
+ mcset $l {Value Level Data type Variable name} \
+ {Value Level Data type Variable name} ;# <-- NOT TRANSLATED YET
+ ##ID:001382##
+ mcset $l {Value Data type Variable name} \
+ {Value Data type Variable name} ;# <-- NOT TRANSLATED YET
+ ##ID:001383##
+ mcset $l "Global static scalar variables" \
+ "Global static scalar variables" ;# <-- NOT TRANSLATED YET
+ ##ID:001384##
+ mcset $l "Local static scalar variables" \
+ "Local static scalar variables" ;# <-- NOT TRANSLATED YET
+}
+# my_tk_messageBox.tcl
+# ==============================================================================
+namespace eval my_tk_messageBox {
+ ##ID:001385##
+ mcset $l "Abort" \
+ "中止"
+ ##ID:001386##
+ mcset $l "Retry" \
+ "重试"
+ ##ID:001387##
+ mcset $l "Ignore" \
+ "忽略"
+ ##ID:001388##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:001389##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:001390##
+ mcset $l "Yes" \
+ "Yes" ;# <-- NOT TRANSLATED YET
+ ##ID:001391##
+ mcset $l "No" \
+ "No" ;# <-- NOT TRANSLATED YET
+}
+# tips.tcl
+# ==============================================================================
+namespace eval Tips {
+ ##ID:001392##
+ mcset $l "Did you know ... " \
+ "您知道吗 ... "
+ ##ID:001393##
+ mcset $l "Show tips on start-up" \
+ "在启动时显示"
+ ##ID:001394##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:001395##
+ mcset $l "Next" \
+ "下一页"
+ ##ID:001396##
+ mcset $l "Previous" \
+ "上一页"
+ ##ID:001397##
+ mcset $l "Tip of the day - MCU 8051 IDE" \
+ "每日提示 - MCU 8051 IDE"
+ ##ID:001398##
+ mcset $l "Unable to open file containing tips,\nplease check your installation" \
+ "无法打开文件,其中包含提示,\n请检查您的安装"
+ ##ID:001399##
+ mcset $l "Unable to parse tips.xml" \
+ "无法解析tips.xml"
+ ##ID:001400##
+ mcset $l "File tips.xml is corrupted,\nplease check your installation" \
+ "文件tips.xml已损坏,\n请检查您的安装"
+}
+# editor.tcl
+# ==============================================================================
+namespace eval Editor {
+ ##ID:001401##
+ mcset $l "LJMP this line" \
+ "LJMP这一行"
+ ##ID:001402##
+ mcset $l "LCALL this line" \
+ "LCALL这一行"
+ ##ID:001403##
+ mcset $l "Program jump" \
+ "程序转跳"
+ ##ID:001404##
+ mcset $l "Call subprogram" \
+ "调用子程序"
+ ##ID:001405##
+ mcset $l "Breakpoint" \
+ "断点"
+ ##ID:001406##
+ mcset $l "Bookmark" \
+ "书签"
+ ##ID:001407##
+ mcset $l "Add/Remove breakpoint to/from current line" \
+ "Add/Remove breakpoint to/from current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001408##
+ mcset $l "Add/Remove bookmark to/from current line" \
+ "Add/Remove bookmark to/from current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001409##
+ mcset $l "Uppercase" \
+ "大写"
+ ##ID:001410##
+ mcset $l "Lowercase" \
+ "小写"
+ ##ID:001411##
+ mcset $l "Capitalize" \
+ "大写"
+ ##ID:001412##
+ mcset $l "Save file" \
+ "保存文件"
+ ##ID:001413##
+ mcset $l "Save this file" \
+ "保存这个文件"
+ ##ID:001414##
+ mcset $l "Configure panel" \
+ "配置面板"
+ ##ID:001415##
+ mcset $l "Invoke editor configuration dialog" \
+ "调用编辑器配置面板"
+ ##ID:001416##
+ mcset $l "Hide this panel" \
+ "隐藏这个面板"
+ ##ID:001417##
+ mcset $l "Hide panel" \
+ "隐藏面板"
+ ##ID:001418##
+ mcset $l "Split vertical" \
+ "垂直分割"
+ ##ID:001419##
+ mcset $l "Split the editor vertically" \
+ "垂直分割编辑器"
+ ##ID:001420##
+ mcset $l "Split horizontal" \
+ "水平分割"
+ ##ID:001421##
+ mcset $l "Split the editor horizontally" \
+ "水平分割编辑器"
+ ##ID:001422##
+ mcset $l "Close current view" \
+ "关闭当前视图"
+ ##ID:001423##
+ mcset $l "Back" \
+ "返回"
+ ##ID:001424##
+ mcset $l "Go to previous file in the file list" \
+ "移动到文件列表里的上一个文件"
+ ##ID:001425##
+ mcset $l "Go to next file in the file list" \
+ "移动到文件列表里的下一个文件"
+ ##ID:001426##
+ mcset $l "Forward" \
+ "向前"
+ ##ID:001427##
+ mcset $l "Editor command line, type `help' for more" \
+ "Editor command line, type `help' for more" ;# <-- NOT TRANSLATED YET
+ ##ID:001428##
+ mcset $l "Icon border - click to add/remove bookmark" \
+ "Icon border - click to add/remove bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:001429##
+ mcset $l "Line numbers - click to add/remove breakpoint" \
+ "Line numbers - click to add/remove breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:001430##
+ mcset $l "Insertion mode" \
+ "Insertion mode" ;# <-- NOT TRANSLATED YET
+ ##ID:001431##
+ mcset $l "Insertion mode -- OVR == overwrite; INS == insert" \
+ "Insertion mode -- OVR == overwrite; INS == insert" ;# <-- NOT TRANSLATED YET
+ ##ID:001432##
+ mcset $l "INS" \
+ "INS" ;# <-- NOT TRANSLATED YET
+ ##ID:001433##
+ mcset $l "OVR" \
+ "OVR" ;# <-- NOT TRANSLATED YET
+ ##ID:001434##
+ mcset $l "Selection mode" \
+ "Selection mode" ;# <-- NOT TRANSLATED YET
+ ##ID:001435##
+ mcset $l "Selection mode -- BLK == block; NORM == normal" \
+ "Selection mode -- BLK == block; NORM == normal" ;# <-- NOT TRANSLATED YET
+ ##ID:001436##
+ mcset $l "NORM" \
+ "NORM" ;# <-- NOT TRANSLATED YET
+ ##ID:001437##
+ mcset $l "BLK" \
+ "BLK" ;# <-- NOT TRANSLATED YET
+ ##ID:001438##
+ mcset $l "Line:" \
+ "Line:" ;# <-- NOT TRANSLATED YET
+ ##ID:001439##
+ mcset $l " Column:" \
+ " Column:" ;# <-- NOT TRANSLATED YET
+ ##ID:001440##
+ mcset $l " Total:" \
+ " Total:" ;# <-- NOT TRANSLATED YET
+ ##ID:001441##
+ mcset $l "Editor status bar" \
+ "编辑器状态栏"
+ ##ID:001442##
+ mcset $l "Starting simulator" \
+ "启动模拟器"
+ ##ID:001443##
+ mcset $l "Simulator mode " \
+ "模拟器模式 "
+ ##ID:001444##
+ mcset $l "Editor disabled" \
+ "禁用编辑器"
+ ##ID:001445##
+ mcset $l "File has been modified, click to save" \
+ "文件已被修改,点击保存"
+ ##ID:001446##
+ mcset $l "Name of the current file or \"untitled\" if the file has not yet been saved under any name" \
+ "Name of the current file or \"untitled\" if the file has not yet been saved under any name" ;# <-- NOT TRANSLATED YET
+ ##ID:001447##
+ mcset $l "File type\n C/H\tC source / header\n ASM\tAssembly language\n LST\tCode listing\n ASX\tASX8051 assembler" \
+ "File type\n C/H\tC source / header\n ASM\tAssembly language\n LST\tCode listing\n ASX\tASX8051 assembler" ;# <-- NOT TRANSLATED YET
+ ##ID:001448##
+ mcset $l "File type" \
+ "文件类型"
+ ##ID:001449##
+ mcset $l "Invalid command" \
+ "无效的命令"
+ ##ID:001450##
+ mcset $l "Ambiguous command" \
+ "Ambiguous command" ;# <-- NOT TRANSLATED YET
+ ##ID:001451##
+ mcset $l "This MCU cannot have connected external data memory" \
+ "This MCU cannot have connected external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:001452##
+ mcset $l "This MCU cannot have connected external program memory" \
+ "This MCU cannot have connected external program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:001453##
+ mcset $l "EDITOR COMMAND LINE: invalid command, type `help list' to get list of available commands" \
+ "EDITOR COMMAND LINE: invalid command, type `help list' to get list of available commands" ;# <-- NOT TRANSLATED YET
+ ##ID:001454##
+ mcset $l "EDITOR COMMAND LINE: wrong # args (command: %s)" \
+ "EDITOR COMMAND LINE: wrong # args (command: %s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001455##
+ mcset $l "EDITOR COMMAND LINE: This command takes no arguments" \
+ "EDITOR COMMAND LINE: This command takes no arguments" ;# <-- NOT TRANSLATED YET
+ ##ID:001456##
+ mcset $l "EDITOR COMMAND LINE: Invalid number format" \
+ "EDITOR COMMAND LINE: Invalid number format" ;# <-- NOT TRANSLATED YET
+ ##ID:001457##
+ mcset $l "EDITOR COMMAND LINE: This command requires exactly one argument" \
+ "EDITOR COMMAND LINE: This command requires exactly one argument" ;# <-- NOT TRANSLATED YET
+ ##ID:001458##
+ mcset $l "EDITOR COMMAND LINE: Unknown command: `%s'" \
+ "EDITOR COMMAND LINE: Unknown command: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001459##
+ mcset $l "EDITOR COMMAND LINE: Unsupported processor `%s'" \
+ "EDITOR COMMAND LINE: Unsupported processor `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001460##
+ mcset $l "EDITOR COMMAND LINE: Expected integer but got `%s' (command: %s)" \
+ "EDITOR COMMAND LINE: Expected integer but got `%s' (command: %s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001461##
+ mcset $l "EDITOR COMMAND LINE: This MCU has XDATA memory limit 0x10000 B (65536) (command: %s)" \
+ "EDITOR COMMAND LINE: This MCU has XDATA memory limit 0x10000 B (65536) (command: %s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001462##
+ mcset $l "EDITOR COMMAND LINE: This MCU has CODE memory limit 0x10000 B (65536) (command: %s)" \
+ "EDITOR COMMAND LINE: This MCU has CODE memory limit 0x10000 B (65536) (command: %s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001463##
+ mcset $l "EDITOR COMMAND LINE: Invalid format string" \
+ "EDITOR COMMAND LINE: Invalid format string" ;# <-- NOT TRANSLATED YET
+ ##ID:001464##
+ mcset $l "EDITOR COMMAND LINE: syntax error: expected integer (command: %s)" \
+ "EDITOR COMMAND LINE: syntax error: expected integer (command: %s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001465##
+ mcset $l "Target line out of range" \
+ "Target line out of range" ;# <-- NOT TRANSLATED YET
+ ##ID:001466##
+ mcset $l "Invalid option: %s" \
+ "无效的选项: %s"
+ ##ID:001467##
+ mcset $l "String not found: %s" \
+ "String not found: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001468##
+ mcset $l "Found %s occurrences" \
+ "Found %s occurrences" ;# <-- NOT TRANSLATED YET
+ ##ID:001469##
+ mcset $l "Success" \
+ "成功"
+ ##ID:001470##
+ mcset $l "Help" \
+ "帮助"
+ ##ID:001471##
+ mcset $l "This is MCU 8051 IDE command line\n\nusage: <b>command \[arguments\]</b>\n\nEnter <b>help list</b> for list of available commands or\n<b>help <STRING command></b> for help for individual command" \
+ "This is MCU 8051 IDE command line\n\nusage: <b>command \[arguments\]</b>\n\nEnter <b>help list</b> for list of available commands or\n<b>help <STRING command></b> for help for individual command" ;# <-- NOT TRANSLATED YET
+ ##ID:001472##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:001473##
+ mcset $l "Close this window" \
+ "关闭这个窗口"
+ ##ID:001474##
+ mcset $l "Replace: %s replacements made" \
+ "Replace: %s replacements made" ;# <-- NOT TRANSLATED YET
+ ##ID:001475##
+ mcset $l "Finishing highlight" \
+ "Finishing highlight" ;# <-- NOT TRANSLATED YET
+ ##ID:001476##
+ mcset $l "Invalid list of bookmarks -- bookmarks discarded" \
+ "Invalid list of bookmarks -- bookmarks discarded" ;# <-- NOT TRANSLATED YET
+ ##ID:001477##
+ mcset $l "Invalid list of breakpoints -- bookmarks discarded" \
+ "Invalid list of breakpoints -- bookmarks discarded" ;# <-- NOT TRANSLATED YET
+ ##ID:001478##
+ mcset $l "File switching locked" \
+ "File switching locked" ;# <-- NOT TRANSLATED YET
+ ##ID:001479##
+ mcset $l "File switching unlocked" \
+ "File switching unlocked" ;# <-- NOT TRANSLATED YET
+ ##ID:001480##
+ mcset $l "Lock file switching" \
+ "Lock file switching" ;# <-- NOT TRANSLATED YET
+ ##ID:001481##
+ mcset $l "Unlock file switching" \
+ "Unlock file switching" ;# <-- NOT TRANSLATED YET
+ ##ID:001482##
+ mcset $l "Unable to open file:\n\"%s\"\nfor writing" \
+ "Unable to open file:\n\"%s\"\nfor writing" ;# <-- NOT TRANSLATED YET
+ ##ID:001483##
+ mcset $l "File %s saved" \
+ "File %s saved" ;# <-- NOT TRANSLATED YET
+ ##ID:001484##
+ mcset $l "Unable to execute: nothing selected" \
+ "Unable to execute: nothing selected" ;# <-- NOT TRANSLATED YET
+ ##ID:001485##
+ mcset $l "FATAL ERROR" \
+ "FATAL ERROR" ;# <-- NOT TRANSLATED YET
+ ##ID:001486##
+ mcset $l "Unable to start embedded editor due to an unknown error. This error did not occurred in MCU 8051 IDE code but somewhere else. Please try to restart MCU 8051 IDE with --reset-user-settings" \
+ "Unable to start embedded editor due to an unknown error. This error did not occurred in MCU 8051 IDE code but somewhere else. Please try to restart MCU 8051 IDE with --reset-user-settings" ;# <-- NOT TRANSLATED YET
+ ##ID:001487##
+ mcset $l "No function to document" \
+ "No function to document" ;# <-- NOT TRANSLATED YET
+ ##ID:001488##
+ mcset $l "Read-only project" \
+ "Read-only project" ;# <-- NOT TRANSLATED YET
+ ##ID:001489##
+ mcset $l "This project has a special purpose, modifications to this project are not allowed." \
+ "This project has a special purpose, modifications to this project are not allowed." ;# <-- NOT TRANSLATED YET
+ ##ID:001490##
+ mcset $l "This editor is only for reading, to change that press alt+v and o" \
+ "This editor is only for reading, to change that press alt+v and o" ;# <-- NOT TRANSLATED YET
+ ##ID:001491##
+ mcset $l " READ ONLY " \
+ " READ ONLY " ;# <-- NOT TRANSLATED YET
+ ##ID:001492##
+ mcset $l "available commands" \
+ "available commands" ;# <-- NOT TRANSLATED YET
+ ##ID:001493##
+ mcset $l "DEC -> HEX" \
+ "DEC -> HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:001494##
+ mcset $l "DEC -> OCT" \
+ "DEC -> OCT" ;# <-- NOT TRANSLATED YET
+ ##ID:001495##
+ mcset $l "DEC -> BIN" \
+ "DEC -> BIN" ;# <-- NOT TRANSLATED YET
+ ##ID:001496##
+ mcset $l "HEX -> DEC" \
+ "HEX -> DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:001497##
+ mcset $l "HEX -> OCT" \
+ "HEX -> OCT" ;# <-- NOT TRANSLATED YET
+ ##ID:001498##
+ mcset $l "HEX -> BIN" \
+ "HEX -> BIN" ;# <-- NOT TRANSLATED YET
+ ##ID:001499##
+ mcset $l "OCT -> HEX" \
+ "OCT -> HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:001500##
+ mcset $l "OCT -> DEC" \
+ "OCT -> DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:001501##
+ mcset $l "OCT -> BIN" \
+ "OCT -> BIN" ;# <-- NOT TRANSLATED YET
+ ##ID:001502##
+ mcset $l "BIN -> HEX" \
+ "BIN -> HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:001503##
+ mcset $l "BIN -> DEC" \
+ "BIN -> DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:001504##
+ mcset $l "BIN -> OCT" \
+ "BIN -> OCT" ;# <-- NOT TRANSLATED YET
+ ##ID:001505##
+ mcset $l "Animate program" \
+ "Animate program" ;# <-- NOT TRANSLATED YET
+ ##ID:001506##
+ mcset $l "Compile current file" \
+ "编译当前文件"
+ ##ID:001507##
+ mcset $l "Reformat code" \
+ "重新格式化代码"
+ ##ID:001508##
+ mcset $l "Bookmark current line" \
+ "当前行的书签"
+ ##ID:001509##
+ mcset $l "Add/Remove breakpoint" \
+ "添加/删除断点"
+ ##ID:001510##
+ mcset $l "Capitalize selection" \
+ "Capitalize selection" ;# <-- NOT TRANSLATED YET
+ ##ID:001511##
+ mcset $l "Clear history" \
+ "清除历史"
+ ##ID:001512##
+ mcset $l "Comment selected text" \
+ "注释选定的文本"
+ ##ID:001513##
+ mcset $l "Copy selection" \
+ "复制选取"
+ ##ID:001514##
+ mcset $l "Custom command" \
+ "自定义命令"
+ ##ID:001515##
+ mcset $l "Cut selection" \
+ "剪切选取"
+ ##ID:001516##
+ mcset $l "Insert date" \
+ "插入时间"
+ ##ID:001517##
+ mcset $l "Exit command line" \
+ "退出命令行"
+ ##ID:001518##
+ mcset $l "Exit program" \
+ "退出程序"
+ ##ID:001519##
+ mcset $l "Find string" \
+ "查找字符"
+ ##ID:001520##
+ mcset $l "Go to line" \
+ "到达指定的行目"
+ ##ID:001521##
+ mcset $l "Insert literal character" \
+ "插入文字字符"
+ ##ID:001522##
+ mcset $l "Indent selection" \
+ "选择缩进"
+ ##ID:001523##
+ mcset $l "Remove current line" \
+ "删除当前行"
+ ##ID:001524##
+ mcset $l "Open file" \
+ "打开文件"
+ ##ID:001525##
+ mcset $l "Paste clipboard" \
+ "粘贴剪贴板"
+ ##ID:001526##
+ mcset $l "Take back last undo" \
+ "Take back last undo" ;# <-- NOT TRANSLATED YET
+ ##ID:001527##
+ mcset $l "Reload current document" \
+ "Reload current document" ;# <-- NOT TRANSLATED YET
+ ##ID:001528##
+ mcset $l "Replace strings" \
+ "替换字符串"
+ ##ID:001529##
+ mcset $l "Run simulation" \
+ "模拟运行"
+ ##ID:001530##
+ mcset $l "Save current line" \
+ "保存当前行"
+ ##ID:001531##
+ mcset $l "Show/Hide icon border" \
+ "显示/隐藏图标栏"
+ ##ID:001532##
+ mcset $l "Show/Hide line n. bar" \
+ "显示/隐藏 line n. bar"
+ ##ID:001533##
+ mcset $l "Start/Stop simulator" \
+ "启动/停止模拟器"
+ ##ID:001534##
+ mcset $l "Step program" \
+ "Step program" ;# <-- NOT TRANSLATED YET
+ ##ID:001535##
+ mcset $l "To lowercase" \
+ "To lowercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001536##
+ mcset $l "To uppercase" \
+ "To uppercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001537##
+ mcset $l "Uncomment selection" \
+ "取消选中注释"
+ ##ID:001538##
+ mcset $l "Take back last operation" \
+ "Take back last operation" ;# <-- NOT TRANSLATED YET
+ ##ID:001539##
+ mcset $l "Unindent selection" \
+ "取消选择缩进"
+ ##ID:001540##
+ mcset $l "Hibernate running program" \
+ "Hibernate running program" ;# <-- NOT TRANSLATED YET
+ ##ID:001541##
+ mcset $l "Resume hibernated program" \
+ "Resume hibernated program" ;# <-- NOT TRANSLATED YET
+ ##ID:001542##
+ mcset $l "Change current MCU" \
+ "切换当前MCU"
+ ##ID:001543##
+ mcset $l "Set XCODE memory size for current MCU" \
+ "Set XCODE memory size for current MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:001544##
+ mcset $l "SET XDATA memory size for current MCU" \
+ "SET XDATA memory size for current MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:001545##
+ mcset $l "Available commands" \
+ "Available commands" ;# <-- NOT TRANSLATED YET
+ ##ID:001546##
+ mcset $l "Command hibernate" \
+ "Command hibernate" ;# <-- NOT TRANSLATED YET
+ ##ID:001547##
+ mcset $l "<b>hibernate</b> \[<STRING target-file>\]\nHibernate running program (available only when simulator is stated).\n\nThis function saves current state of the simulator engine for future resumption. If no target is not specified it will invoke file selection dialog" \
+ "<b>hibernate</b> \[<STRING target-file>\]\nHibernate running program (available only when simulator is stated).\n\nThis function saves current state of the simulator engine for future resumption. If no target is not specified it will invoke file selection dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:001548##
+ mcset $l "Command resume" \
+ "Command resume" ;# <-- NOT TRANSLATED YET
+ ##ID:001549##
+ mcset $l "<b>resume</b> \[<STRING source-file>\]\nResume hibernated program (available only when simulator is stated).\n\nThis function restores previous state of the simulator engine stored in the given file. If no source is not specified it will invoke file selection dialog" \
+ "<b>resume</b> \[<STRING source-file>\]\nResume hibernated program (available only when simulator is stated).\n\nThis function restores previous state of the simulator engine stored in the given file. If no source is not specified it will invoke file selection dialog" ;# <-- NOT TRANSLATED YET
+ ##ID:001550##
+ mcset $l "Command switch-mcu" \
+ "Command switch-mcu" ;# <-- NOT TRANSLATED YET
+ ##ID:001551##
+ mcset $l "<b>switch-mcu</b> <STRING processor-type>\nChange current MCU. Type `switch-mcu list' for list of supported microcontrollers" \
+ "<b>switch-mcu</b> <STRING processor-type>\nChange current MCU. Type `switch-mcu list' for list of supported microcontrollers" ;# <-- NOT TRANSLATED YET
+ ##ID:001552##
+ mcset $l "Command set-xcode" \
+ "Command set-xcode" ;# <-- NOT TRANSLATED YET
+ ##ID:001553##
+ mcset $l "<b>set-xcode</b> <INT size>\nChange capacity of external program memory.\nNote: this command also close CODE memory hex editor" \
+ "<b>set-xcode</b> <INT size>\nChange capacity of external program memory.\nNote: this command also close CODE memory hex editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001554##
+ mcset $l "Command set-xdata" \
+ "Command set-xdata" ;# <-- NOT TRANSLATED YET
+ ##ID:001555##
+ mcset $l "<b>set-xdata</b> <INT size>\nChange capacity of external data memory.\nNote: this command also close XDATA memory hex editor" \
+ "<b>set-xdata</b> <INT size>\nChange capacity of external data memory.\nNote: this command also close XDATA memory hex editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001556##
+ mcset $l "Command run" \
+ "Command run" ;# <-- NOT TRANSLATED YET
+ ##ID:001557##
+ mcset $l "Run simulation (available only when simulator is stated)" \
+ "Run simulation (available only when simulator is stated)" ;# <-- NOT TRANSLATED YET
+ ##ID:001558##
+ mcset $l "Command exit" \
+ "Command exit" ;# <-- NOT TRANSLATED YET
+ ##ID:001559##
+ mcset $l "Exits this command line" \
+ "Exits this command line" ;# <-- NOT TRANSLATED YET
+ ##ID:001560##
+ mcset $l "Command exit-program" \
+ "Command exit-program" ;# <-- NOT TRANSLATED YET
+ ##ID:001561##
+ mcset $l "Quit MCU 8051 IDE" \
+ "退出MCU 8051 IDE"
+ ##ID:001562##
+ mcset $l "Command set-icon-border" \
+ "Command set-icon-border" ;# <-- NOT TRANSLATED YET
+ ##ID:001563##
+ mcset $l "Sets the visibility of the icon border" \
+ "Sets the visibility of the icon border" ;# <-- NOT TRANSLATED YET
+ ##ID:001564##
+ mcset $l "Command set-line-numbers" \
+ "Command set-line-numbers" ;# <-- NOT TRANSLATED YET
+ ##ID:001565##
+ mcset $l "Sets the visibility of the line numbers." \
+ "Sets the visibility of the line numbers." ;# <-- NOT TRANSLATED YET
+ ##ID:001566##
+ mcset $l "Command help" \
+ "Command help" ;# <-- NOT TRANSLATED YET
+ ##ID:001567##
+ mcset $l "<b>help</b> <STRING command>\nShows help for the given command\n\n<b>help list</b>\nShows list of available command" \
+ "<b>help</b> <STRING command>\nShows help for the given command\n\n<b>help list</b>\nShows list of available command" ;# <-- NOT TRANSLATED YET
+ ##ID:001568##
+ mcset $l "Command open" \
+ "Command open" ;# <-- NOT TRANSLATED YET
+ ##ID:001569##
+ mcset $l "<b>open</b> <STRING full_filename>\nOpens the given file in new editor" \
+ "<b>open</b> <STRING full_filename>\nOpens the given file in new editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001570##
+ mcset $l "Command indent" \
+ "Command indent" ;# <-- NOT TRANSLATED YET
+ ##ID:001571##
+ mcset $l "Indents current line or selected area" \
+ "Indents current line or selected area" ;# <-- NOT TRANSLATED YET
+ ##ID:001572##
+ mcset $l "Command unindent" \
+ "Command unindent" ;# <-- NOT TRANSLATED YET
+ ##ID:001573##
+ mcset $l "Unindents current line or selected area" \
+ "Unindents current line or selected area" ;# <-- NOT TRANSLATED YET
+ ##ID:001574##
+ mcset $l "Command comment" \
+ "Command comment" ;# <-- NOT TRANSLATED YET
+ ##ID:001575##
+ mcset $l "Comments current line or selected area" \
+ "Comments current line or selected area" ;# <-- NOT TRANSLATED YET
+ ##ID:001576##
+ mcset $l "Command uncomment" \
+ "Command uncomment" ;# <-- NOT TRANSLATED YET
+ ##ID:001577##
+ mcset $l "Uncomments current line or selected area" \
+ "Uncomments current line or selected area" ;# <-- NOT TRANSLATED YET
+ ##ID:001578##
+ mcset $l "Command kill-line" \
+ "Command kill-line" ;# <-- NOT TRANSLATED YET
+ ##ID:001579##
+ mcset $l "Removes the current line" \
+ "Removes the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001580##
+ mcset $l "Command date" \
+ "Command date" ;# <-- NOT TRANSLATED YET
+ ##ID:001581##
+ mcset $l "<b>date</b> <STRING format>\nInserts formatted date at the current position in text\n\n<b>Format string:</b>\n%% => %\n%a => Weekday name (Mon, Tue, etc.)\n%A => Weekday name (Monday, Tuesday, etc.)\n%b => Month name (Jan, Feb, etc.)\n%B => Full month name\n%C => Year (19 or 20)\n%d => Day of month (01 - 31)\n%D => %m/%d/%y\n%h => Abbreviated month name.\n%H => Hour (00 - 23)\n%I => Hour (01 - 12)\n%j => Day of year (001 - 366)\n%k => Hour (0 - 23)\n%l => Hour (1 - 12).\n%m => Month (01 - 12)\n%M => Minute (00 - 59)\n%n => Newline\n%p => AM/PM\n%R => %H:%M.\n%s => Unix timestamp\n%S => Seconds (00 - 59)\n%t => Tab\n%T => %H:%M:%S.\n%u => Weekday number (Monday = 1, Sunday = 7)\n%w => Weekday number (Sunday = 0, Saturday = 6)\n%y => Year without century (00 - 99)\n%Y => Year with century (e.g. 1459)" \
+ "<b>date</b> <STRING format>\nInserts formatted date at the current position in text\n\n<b>Format string:</b>\n%% => %\n%a => Weekday name (Mon, Tue, etc.)\n%A => Weekday name (Monday, Tuesday, etc.)\n%b => Month name (Jan, Feb, etc.)\n%B => Full month name\n%C => Year (19 or 20)\n%d => Day of month (01 - 31)\n%D => %m/%d/%y\n%h => Abbreviated month name.\n%H => Hour (00 - 23)\n%I => Hour (01 - 12)\n%j => Day of year (001 - 366)\n%k => Hour (0 - 23)\n%l => Hour (1 - 12).\n%m => Month (01 - 12)\n%M => Minute (00 - 59)\n%n => Newline\n%p => AM/PM\n%R => %H:%M.\n%s => Unix timestamp\n%S => Seconds (00 - 59)\n%t => Tab\n%T => %H:%M:%S.\n%u => Weekday number (Monday = 1, Sunday = 7)\n%w => Weekday number (Sunday = 0, Saturday = 6)\n%y => Year without century (00 - 99)\n%Y => Year with century (e.g. 1459)" ;# <-- NOT TRANSLATED YET
+ ##ID:001582##
+ mcset $l "Command clear" \
+ "Command clear" ;# <-- NOT TRANSLATED YET
+ ##ID:001583##
+ mcset $l "Clears command line history" \
+ "Clears command line history" ;# <-- NOT TRANSLATED YET
+ ##ID:001584##
+ mcset $l "Command char" \
+ "Command char" ;# <-- NOT TRANSLATED YET
+ ##ID:001585##
+ mcset $l "<b>char</b> <NUMBER identifier>\nInserts literal characters by their numerical identifier.\nIdentifier can be in decimal hexadecimal or octal form." \
+ "<b>char</b> <NUMBER identifier>\nInserts literal characters by their numerical identifier.\nIdentifier can be in decimal hexadecimal or octal form." ;# <-- NOT TRANSLATED YET
+ ##ID:001586##
+ mcset $l "Command goto" \
+ "Command goto" ;# <-- NOT TRANSLATED YET
+ ##ID:001587##
+ mcset $l "<b>goto</b> <INT line>\nGo to the given line" \
+ "<b>goto</b> <INT line>\nGo to the given line" ;# <-- NOT TRANSLATED YET
+ ##ID:001588##
+ mcset $l "Command replace" \
+ "Command replace" ;# <-- NOT TRANSLATED YET
+ ##ID:001589##
+ mcset $l "<b>replace\[:options\]</b> <STRING pattern> <STRING replacement>\n\n<b>options:</b>\nb Search backwards\nc Search from cursor position\nr Regular expression search\ns Case sensitive search\np Ask before replacement" \
+ "<b>replace\[:options\]</b> <STRING pattern> <STRING replacement>\n\n<b>options:</b>\nb Search backwards\nc Search from cursor position\nr Regular expression search\ns Case sensitive search\np Ask before replacement" ;# <-- NOT TRANSLATED YET
+ ##ID:001590##
+ mcset $l "Command find" \
+ "Command find" ;# <-- NOT TRANSLATED YET
+ ##ID:001591##
+ mcset $l "<b>find\[:options\]</b> <STRING pattern>\n\n<b>options:</b>\nb Search backwards\nc Search from cursor position\ne Search in the selection only\nr Regular expression search\ns Case sensitive search" \
+ "<b>find\[:options\]</b> <STRING pattern>\n\n<b>options:</b>\nb Search backwards\nc Search from cursor position\ne Search in the selection only\nr Regular expression search\ns Case sensitive search" ;# <-- NOT TRANSLATED YET
+ ##ID:001592##
+ mcset $l "Command cut" \
+ "Command cut" ;# <-- NOT TRANSLATED YET
+ ##ID:001593##
+ mcset $l "Cut selected text" \
+ "Cut selected text" ;# <-- NOT TRANSLATED YET
+ ##ID:001594##
+ mcset $l "Command copy" \
+ "Command copy" ;# <-- NOT TRANSLATED YET
+ ##ID:001595##
+ mcset $l "Copy selected text to clipboard" \
+ "Copy selected text to clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:001596##
+ mcset $l "Command paste" \
+ "Command paste" ;# <-- NOT TRANSLATED YET
+ ##ID:001597##
+ mcset $l "Paste clipboard content" \
+ "Paste clipboard content" ;# <-- NOT TRANSLATED YET
+ ##ID:001598##
+ mcset $l "Command tolower" \
+ "Command tolower" ;# <-- NOT TRANSLATED YET
+ ##ID:001599##
+ mcset $l "Convert selected text to lowercase" \
+ "Convert selected text to lowercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001600##
+ mcset $l "Command toupper" \
+ "Command toupper" ;# <-- NOT TRANSLATED YET
+ ##ID:001601##
+ mcset $l "Convert selected text to uppercase" \
+ "Convert selected text to uppercase" ;# <-- NOT TRANSLATED YET
+ ##ID:001602##
+ mcset $l "Command capitalize" \
+ "Command capitalize" ;# <-- NOT TRANSLATED YET
+ ##ID:001603##
+ mcset $l "Capitalize the selected text (convert 1st character to uppercase)" \
+ "Capitalize the selected text (convert 1st character to uppercase)" ;# <-- NOT TRANSLATED YET
+ ##ID:001604##
+ mcset $l "Command save" \
+ "Command save" ;# <-- NOT TRANSLATED YET
+ ##ID:001605##
+ mcset $l "Save the current document" \
+ "Save the current document" ;# <-- NOT TRANSLATED YET
+ ##ID:001606##
+ mcset $l "Command bookmark" \
+ "Command bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:001607##
+ mcset $l "Bookmark the current line" \
+ "Bookmark the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001608##
+ mcset $l "Command custom" \
+ "Command custom" ;# <-- NOT TRANSLATED YET
+ ##ID:001609##
+ mcset $l "<b>custom</b> <INT command_number>\nExecute custom command (see menu Configuration -> Custom commands)" \
+ "<b>custom</b> <INT command_number>\nExecute custom command (see menu Configuration -> Custom commands)" ;# <-- NOT TRANSLATED YET
+ ##ID:001610##
+ mcset $l "Command breakpoint" \
+ "Command breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:001611##
+ mcset $l "Add / Remove breakpoint to the current line" \
+ "Add / Remove breakpoint to the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:001612##
+ mcset $l "Command undo" \
+ "Command undo" ;# <-- NOT TRANSLATED YET
+ ##ID:001613##
+ mcset $l "Command redo" \
+ "Command redo" ;# <-- NOT TRANSLATED YET
+ ##ID:001614##
+ mcset $l "Command auto-indent" \
+ "Command auto-indent" ;# <-- NOT TRANSLATED YET
+ ##ID:001615##
+ mcset $l "Command reload" \
+ "Command reload" ;# <-- NOT TRANSLATED YET
+ ##ID:001616##
+ mcset $l "Reload the current document" \
+ "Reload the current document" ;# <-- NOT TRANSLATED YET
+ ##ID:001617##
+ mcset $l "Command assemble" \
+ "Command assemble" ;# <-- NOT TRANSLATED YET
+ ##ID:001618##
+ mcset $l "Compile the current document" \
+ "Compile the current document" ;# <-- NOT TRANSLATED YET
+ ##ID:001619##
+ mcset $l "Command sim" \
+ "Command sim" ;# <-- NOT TRANSLATED YET
+ ##ID:001620##
+ mcset $l "Start / Stop simulator" \
+ "启动/停止模拟器"
+ ##ID:001621##
+ mcset $l "Command step" \
+ "Command step" ;# <-- NOT TRANSLATED YET
+ ##ID:001622##
+ mcset $l "Step program (available only when simulator is stated)" \
+ "Step program (available only when simulator is stated)" ;# <-- NOT TRANSLATED YET
+ ##ID:001623##
+ mcset $l "Command animate" \
+ "Command animate" ;# <-- NOT TRANSLATED YET
+ ##ID:001624##
+ mcset $l "Animate program (available only when simulator is stated)" \
+ "Animate program (available only when simulator is stated)" ;# <-- NOT TRANSLATED YET
+ ##ID:001625##
+ mcset $l "Command d2h" \
+ "Command d2h" ;# <-- NOT TRANSLATED YET
+ ##ID:001626##
+ mcset $l "Convert decimal number to hexadecimal and write result to editor" \
+ "Convert decimal number to hexadecimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001627##
+ mcset $l "Command d2o" \
+ "Command d2o" ;# <-- NOT TRANSLATED YET
+ ##ID:001628##
+ mcset $l "Convert decimal number to octal and write result to editor" \
+ "Convert decimal number to octal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001629##
+ mcset $l "Command d2b" \
+ "Command d2b" ;# <-- NOT TRANSLATED YET
+ ##ID:001630##
+ mcset $l "Convert decimal number to binary and write result to editor" \
+ "Convert decimal number to binary and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001631##
+ mcset $l "Command h2d" \
+ "Command h2d" ;# <-- NOT TRANSLATED YET
+ ##ID:001632##
+ mcset $l "Convert hexadecimal number to decimal and write result to editor" \
+ "Convert hexadecimal number to decimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001633##
+ mcset $l "Command h2o" \
+ "Command h2o" ;# <-- NOT TRANSLATED YET
+ ##ID:001634##
+ mcset $l "Convert hexadecimal number to octal and write result to editor" \
+ "Convert hexadecimal number to octal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001635##
+ mcset $l "Command h2b" \
+ "Command h2b" ;# <-- NOT TRANSLATED YET
+ ##ID:001636##
+ mcset $l "Convert hexadecimal number to binary and write result to editor" \
+ "Convert hexadecimal number to binary and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001637##
+ mcset $l "Command o2h" \
+ "Command o2h" ;# <-- NOT TRANSLATED YET
+ ##ID:001638##
+ mcset $l "Convert octal number to hexadecimal and write result to editor" \
+ "Convert octal number to hexadecimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001639##
+ mcset $l "Command o2d" \
+ "Command o2d" ;# <-- NOT TRANSLATED YET
+ ##ID:001640##
+ mcset $l "Convert octal number to decimal and write result to editor" \
+ "Convert octal number to decimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001641##
+ mcset $l "Command o2b" \
+ "Command o2b" ;# <-- NOT TRANSLATED YET
+ ##ID:001642##
+ mcset $l "Convert octal number to binary and write result to editor" \
+ "Convert octal number to binary and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001643##
+ mcset $l "Command b2h" \
+ "Command b2h" ;# <-- NOT TRANSLATED YET
+ ##ID:001644##
+ mcset $l "Convert binary number to hexadecimal and write result to editor" \
+ "Convert binary number to hexadecimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001645##
+ mcset $l "Command b2d" \
+ "Command b2d" ;# <-- NOT TRANSLATED YET
+ ##ID:001646##
+ mcset $l "Convert binary number to decimal and write result to editor" \
+ "Convert binary number to decimal and write result to editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001647##
+ mcset $l "Command b2o" \
+ "Command b2o" ;# <-- NOT TRANSLATED YET
+ ##ID:001648##
+ mcset $l "Convert binary number to octal and write result to editor" \
+ "Convert binary number to octal and write result to editor" ;# <-- NOT TRANSLATED YET
+}
+# compiler.tcl
+# ==============================================================================
+namespace eval Compiler {
+ ##ID:001649##
+ mcset $l "%s errors, %s warnings" \
+ "%s errors, %s warnings" ;# <-- NOT TRANSLATED YET
+ ##ID:001650##
+ mcset $l "Unable to open the specified file. (%s)" \
+ "Unable to open the specified file. (%s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001651##
+ mcset $l "Unable to open the specified file. (\033\[34;1m%s\033\[m)" \
+ "Unable to open the specified file. (\033\[34;1m%s\033\[m)" ;# <-- NOT TRANSLATED YET
+ ##ID:001652##
+ mcset $l "Compilation FAILED !" \
+ "Compilation FAILED !" ;# <-- NOT TRANSLATED YET
+ ##ID:001653##
+ mcset $l "\033\[31;1mCompilation FAILED !\033\[m" \
+ "\033\[31;1mCompilation FAILED !\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001654##
+ mcset $l "Compiling file: %s" \
+ "Compiling file: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001655##
+ mcset $l "Compiling file: \033\[34;1m%s\033\[m" \
+ "Compiling file: \033\[34;1m%s\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001656##
+ mcset $l "Initializing pre-processor ..." \
+ "Initializing pre-processor ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001657##
+ mcset $l "Pre-processing FAILED !" \
+ "Pre-processing FAILED !" ;# <-- NOT TRANSLATED YET
+ ##ID:001658##
+ mcset $l "\033\[31;1mPre-processing FAILED !\033\[m" \
+ "\033\[31;1mPre-processing FAILED !\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001659##
+ mcset $l "Compiling ..." \
+ "Compiling ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001660##
+ mcset $l "Creating IHEX8 ...\t\t\t-> \"%s\"" \
+ "Creating IHEX8 ...\t\t\t-> \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001661##
+ mcset $l "Creating IHEX8 ...\t\t\t-> \"\033\[34;1m%s\033\[m\"" \
+ "Creating IHEX8 ...\t\t\t-> \"\033\[34;1m%s\033\[m\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001662##
+ mcset $l "Error: Unable to open file \"%s\" for writing" \
+ "Error: Unable to open file \"%s\" for writing" ;# <-- NOT TRANSLATED YET
+ ##ID:001663##
+ mcset $l "\033\[31;1mError\033\[m: Unable to open file \"\033\[34;1m%s\033\[m\" for writing" \
+ "\033\[31;1mError\033\[m: Unable to open file \"\033\[34;1m%s\033\[m\" for writing" ;# <-- NOT TRANSLATED YET
+ ##ID:001664##
+ mcset $l "Creating object file ...\t\t-> \"%s\"" \
+ "Creating object file ...\t\t-> \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001665##
+ mcset $l "Creating object file ...\t\t-> \"\033\[34;1m%s\033\[m\"" \
+ "Creating object file ...\t\t-> \"\033\[34;1m%s\033\[m\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001666##
+ mcset $l "Creating assembler debug file ...\t-> \"%s\"" \
+ "Creating assembler debug file ...\t-> \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001667##
+ mcset $l "Creating simulator data file ...\t-> \"\033\[34;1m%s\033\[m\"" \
+ "Creating simulator data file ...\t-> \"\033\[34;1m%s\033\[m\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001668##
+ mcset $l "Number of optimization performed: %s" \
+ "Number of optimization performed: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001669##
+ mcset $l "Number of optimization performed: \033\[1m%s\033\[m" \
+ "Number of optimization performed: \033\[1m%s\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001670##
+ mcset $l "Compilation successful. (time: %s sec.)" \
+ "Compilation successful. (time: %s sec.)" ;# <-- NOT TRANSLATED YET
+ ##ID:001671##
+ mcset $l "\033\[32;1mCompilation successful.\033\[m (time: %s sec.)" \
+ "\033\[32;1mCompilation successful.\033\[m (time: %s sec.)" ;# <-- NOT TRANSLATED YET
+ ##ID:001672##
+ mcset $l "Creating code listing file ...\t\t-> \"%s\"" \
+ "Creating code listing file ...\t\t-> \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001673##
+ mcset $l "Creating code listing file ...\t\t-> \"\033\[34;1m%s\033\[m\"" \
+ "Creating code listing file ...\t\t-> \"\033\[34;1m%s\033\[m\"" ;# <-- NOT TRANSLATED YET
+}
+# assembler.tcl
+# ==============================================================================
+namespace eval assembler {
+ ##ID:001674##
+ mcset $l "File access error:\n%s" \
+ "文件访问错误:\n%s"
+ ##ID:001675##
+ mcset $l "Aborted" \
+ "中止"
+ ##ID:001676##
+ mcset $l "Unknown error %s" \
+ "未知错误 %s"
+ ##ID:001677##
+ mcset $l "Invalid address at %s" \
+ "无效地址 at %s"
+ ##ID:001678##
+ mcset $l "Invalid operand: '%s'" \
+ "无效的操作数: '%s'"
+ ##ID:001679##
+ mcset $l "Invalid value" \
+ "无效值"
+ ##ID:001680##
+ mcset $l "Invalid operand" \
+ "无效的操作数"
+ ##ID:001681##
+ mcset $l "Unknown instruction: %s" \
+ "未知的指令: %s"
+ ##ID:001682##
+ mcset $l "Compilation error at line %s: %s" \
+ "编译错误在行 %s: %s"
+ ##ID:001683##
+ mcset $l " in %s" \
+ " in %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001684##
+ mcset $l "\033\[31;1mCompilation error at line \033\[31;1;4m%s\033\[m%s: %s" \
+ "\033\[31;1mCompilation error at line \033\[31;1;4m%s\033\[m%s: %s" ;# <-- NOT TRANSLATED YET
+}
+# external_compiler.tcl
+# ==============================================================================
+namespace eval ExternalCompiler {
+ ##ID:001685##
+ mcset $l "\n\nStarting compiler ..." \
+ "\n\nStarting compiler ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001686##
+ mcset $l "\n\nStarting make ..." \
+ "\n\nStarting make ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001687##
+ mcset $l "\nError: Unable to change working directory to '%s'" \
+ "\nError: Unable to change working directory to '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001688##
+ mcset $l "\nUnable to create \"%s\"" \
+ "\nUnable to create \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001689##
+ mcset $l "\nUnable to find \"%s\"" \
+ "\nUnable to find \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001690##
+ mcset $l "\nUnable to find \"%s\"\n\tMCU 8051 IDE debug file (*.adf) could not be generated\n\tPLEASE CHECK YOUR %s CONFIGURATION" \
+ "\nUnable to find \"%s\"\n\tMCU 8051 IDE debug file (*.adf) could not be generated\n\tPLEASE CHECK YOUR %s CONFIGURATION" ;# <-- NOT TRANSLATED YET
+ ##ID:001691##
+ mcset $l "\nCompilation successful" \
+ "\nCompilation successful" ;# <-- NOT TRANSLATED YET
+ ##ID:001692##
+ mcset $l "\nCompilation FAILED" \
+ "\nCompilation FAILED" ;# <-- NOT TRANSLATED YET
+ ##ID:001693##
+ mcset $l "File access error:\n%s" \
+ "文件访问错误:\n%s"
+ ##ID:001694##
+ mcset $l "Unable to understand formulation at line %s in file %s" \
+ "Unable to understand formulation at line %s in file %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001695##
+ mcset $l "Compilation error:\nFile \"%s\" is not a valid Intel® HEX 8 file" \
+ "Compilation error:\nFile \"%s\" is not a valid Intel® HEX 8 file" ;# <-- NOT TRANSLATED YET
+}
+# disassembler.tcl
+# ==============================================================================
+namespace eval disassembler {
+ ##ID:001696##
+ mcset $l "Initializing disassembler ..." \
+ "Initializing disassembler ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001697##
+ mcset $l "Disassembly FAILED ..." \
+ "Disassembly FAILED ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001698##
+ mcset $l "\033\[31;1mDisassembly FAILED\033\[m ..." \
+ "\033\[31;1mDisassembly FAILED\033\[m ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001699##
+ mcset $l "Aborted" \
+ "Aborted" ;# <-- NOT TRANSLATED YET
+ ##ID:001700##
+ mcset $l "Disassembly complete" \
+ "Disassembly complete" ;# <-- NOT TRANSLATED YET
+ ##ID:001701##
+ mcset $l "\033\[32;1mDisassembly complete\033\[m" \
+ "\033\[32;1mDisassembly complete\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001702##
+ mcset $l "Invalid line (line contain not allowed characters)" \
+ "Invalid line (line contain not allowed characters)" ;# <-- NOT TRANSLATED YET
+ ##ID:001703##
+ mcset $l "Line do not contain odd number of chars" \
+ "Line do not contain odd number of chars" ;# <-- NOT TRANSLATED YET
+ ##ID:001704##
+ mcset $l "Bad checksum, given: %s ; computed: %s" \
+ "Bad checksum, given: %s ; computed: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001705##
+ mcset $l "Unknown record type number `%s' (Intel HEX 8 can contain only 00 and 01)" \
+ "Unknown record type number `%s' (Intel HEX 8 can contain only 00 and 01)" ;# <-- NOT TRANSLATED YET
+ ##ID:001706##
+ mcset $l "Length field do not correspond true data length" \
+ "Length field do not correspond true data length" ;# <-- NOT TRANSLATED YET
+ ##ID:001707##
+ mcset $l "Unexpected address -- code is not well formatted" \
+ "Unexpected address -- code is not well formatted" ;# <-- NOT TRANSLATED YET
+ ##ID:001708##
+ mcset $l "Warning: %s" \
+ "Warning: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001709##
+ mcset $l "\033\[33mWarning\033\[m: %s" \
+ "\033\[33mWarning\033\[m: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001710##
+ mcset $l " at line %s" \
+ " at line %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001711##
+ mcset $l " at line \033\[31;1;4m%s\033\[m" \
+ " at line \033\[31;1;4m%s\033\[m" ;# <-- NOT TRANSLATED YET
+ ##ID:001712##
+ mcset $l "Error%s: %s" \
+ "Error%s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001713##
+ mcset $l "\033\[31;1mError%s\033\[m: %s" \
+ "\033\[31;1mError%s\033\[m: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001714##
+ mcset $l "Code address overflow, instruction: %s" \
+ "Code address overflow, instruction: %s" ;# <-- NOT TRANSLATED YET
+}
+# preprocessor.tcl
+# ==============================================================================
+namespace eval PreProcessor {
+ ##ID:001716##
+ mcset $l "Aborted" \
+ "中止"
+ ##ID:001718##
+ mcset $l "Inclusion nesting exceeded maximum allowed level" \
+ "Inclusion nesting exceeded maximum allowed level" ;# <-- NOT TRANSLATED YET
+ ##ID:001721##
+ mcset $l "Macro nesting exceeded maximum allowed level" \
+ "Macro nesting exceeded maximum allowed level" ;# <-- NOT TRANSLATED YET
+ ##ID:001725##
+ mcset $l "Invalid argument: %s" \
+ "Invalid argument: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001726##
+ mcset $l "Extra characters after control sequence: %s" \
+ "Extra characters after control sequence: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001727##
+ mcset $l "Control %s has been overridden (by compiler settings)" \
+ "Control %s has been overridden (by compiler settings)" ;# <-- NOT TRANSLATED YET
+ ##ID:001728##
+ mcset $l "Control `%s' expect exactly one argument, but no argument given" \
+ "Control `%s' expect exactly one argument, but no argument given" ;# <-- NOT TRANSLATED YET
+ ##ID:001729##
+ mcset $l "Control `%s' takes no arguments." \
+ "Control `%s' takes no arguments." ;# <-- NOT TRANSLATED YET
+ ##ID:001730##
+ mcset $l "Invalid argument (must be integer): %s" \
+ "Invalid argument (must be integer): %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001731##
+ mcset $l "Unsupported control sequence: %s -- control sequence ignored" \
+ "Unsupported control sequence: %s -- control sequence ignored" ;# <-- NOT TRANSLATED YET
+ ##ID:001732##
+ mcset $l "You are using unusual directive 'BYTE', consider usage of 'DB' instead" \
+ "You are using unusual directive 'BYTE', consider usage of 'DB' instead" ;# <-- NOT TRANSLATED YET
+ ##ID:001733##
+ mcset $l "CSEG cannot take any label: %s" \
+ "CSEG cannot take any label: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001734##
+ mcset $l "Missing `AT' operator" \
+ "Missing `AT' operator" ;# <-- NOT TRANSLATED YET
+ ##ID:001735##
+ mcset $l "Argument value out of range: %s (%s)" \
+ "Argument value out of range: %s (%s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001736##
+ mcset $l "Invalid expression `%s'" \
+ "Invalid expression `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001737##
+ mcset $l "Using `%s', but active segment is `%s' (should be CSEG)" \
+ "Using `%s', but active segment is `%s' (should be CSEG)" ;# <-- NOT TRANSLATED YET
+ ##ID:001738##
+ mcset $l "Missing value" \
+ "Missing value" ;# <-- NOT TRANSLATED YET
+ ##ID:001739##
+ mcset $l "Invalid value" \
+ "Invalid value" ;# <-- NOT TRANSLATED YET
+ ##ID:001740##
+ mcset $l "Directive DW can take only one argument" \
+ "Directive DW can take only one argument" ;# <-- NOT TRANSLATED YET
+ ##ID:001741##
+ mcset $l "Unable to recognize character: `%s'" \
+ "Unable to recognize character: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001742##
+ mcset $l "Argument value out of range: %s" \
+ "Argument value out of range: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001743##
+ mcset $l "Expected bit address: %s" \
+ "Expected bit address: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001744##
+ mcset $l "Label is too far for 8-bit relative addressing." \
+ "Label is too far for 8-bit relative addressing." ;# <-- NOT TRANSLATED YET
+ ##ID:001745##
+ mcset $l "Operand value out of range: `%s' (`%s')" \
+ "Operand value out of range: `%s' (`%s')" ;# <-- NOT TRANSLATED YET
+ ##ID:001746##
+ mcset $l "Value out of range: `%s' (%s)" \
+ "Value out of range: `%s' (%s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001747##
+ mcset $l "Invalid label declaration: `%s'\n\tLabels can contain alphanumeric characters only and must not begin with a digit" \
+ "Invalid label declaration: `%s'\n\tLabels can contain alphanumeric characters only and must not begin with a digit" ;# <-- NOT TRANSLATED YET
+ ##ID:001748##
+ mcset $l "Unknown keyword: `%s'\n\t`%s' is neither macro nor instruction nor directive" \
+ "Unknown keyword: `%s'\n\t`%s' is neither macro nor instruction nor directive" ;# <-- NOT TRANSLATED YET
+ ##ID:001749##
+ mcset $l "Invalid bit designator: %s" \
+ "Invalid bit designator: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001750##
+ mcset $l "Given register does not belong to the bit addressable area: %s" \
+ "Given register does not belong to the bit addressable area: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001751##
+ mcset $l "Invalid value: %s'" \
+ "Invalid value: %s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001752##
+ mcset $l "Invalid numeric base `%s'\n\tPossible options are: __H (hex), __D (dec) __B (bin), __Q __O (oct) and 'char'" \
+ "Invalid numeric base `%s'\n\tPossible options are: __H (hex), __D (dec) __B (bin), __Q __O (oct) and 'char'" ;# <-- NOT TRANSLATED YET
+ ##ID:001753##
+ mcset $l "Special function register \"%s\" is not available on the target MCU" \
+ "Special function register \"%s\" is not available on the target MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:001754##
+ mcset $l "Special function bit \"%s\" is not available on the target MCU" \
+ "Special function bit \"%s\" is not available on the target MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:001755##
+ mcset $l "Symbol not defined: %s" \
+ "Symbol not defined: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001756##
+ mcset $l "Reserved keyword used as label" \
+ "Reserved keyword used as label" ;# <-- NOT TRANSLATED YET
+ ##ID:001757##
+ mcset $l "Invalid label: `%s' \n\t(labels can contain only alphanumeric characters and must not begin with a digit)" \
+ "Invalid label: `%s' \n\t(labels can contain only alphanumeric characters and must not begin with a digit)" ;# <-- NOT TRANSLATED YET
+ ##ID:001758##
+ mcset $l "Unable to overwrite already reserved program memory at address 0x%s -- compilation failed" \
+ "Unable to overwrite already reserved program memory at address 0x%s -- compilation failed" ;# <-- NOT TRANSLATED YET
+ ##ID:001759##
+ mcset $l "This instruction exceeding code memory capacity" \
+ "This instruction exceeding code memory capacity" ;# <-- NOT TRANSLATED YET
+ ##ID:001760##
+ mcset $l "No instruction found at address 0x00. Consider usage of appropriate ORG directive to clarify correct code placement." \
+ "No instruction found at address 0x00. Consider usage of appropriate ORG directive to clarify correct code placement." ;# <-- NOT TRANSLATED YET
+ ##ID:001761##
+ mcset $l "Label was already defined: `%s'" \
+ "Label is already defined: `%s'"
+ ##ID:001762##
+ mcset $l "Overwriting `%s' with `%s' (according to your previous definition!)" \
+ "Overwriting `%s' with `%s' (according to your previous definition!)" ;# <-- NOT TRANSLATED YET
+ ##ID:001763##
+ mcset $l "Too few operands, %s must take exactly %s operand" \
+ "Too few operands, %s must take exactly %s operand" ;# <-- NOT TRANSLATED YET
+ ##ID:001764##
+ mcset $l "Too few operands, %s must take exactly %s operands" \
+ "Too few operands, %s must take exactly %s operands" ;# <-- NOT TRANSLATED YET
+ ##ID:001765##
+ mcset $l "Too many operands, %s can take only %s operand" \
+ "Too many operands, %s can take only %s operand" ;# <-- NOT TRANSLATED YET
+ ##ID:001766##
+ mcset $l "Too many operands, %s can take only %s operands" \
+ "Too many operands, %s can take only %s operands" ;# <-- NOT TRANSLATED YET
+ ##ID:001767##
+ mcset $l "`%s' changed by compiler to `%s'" \
+ "`%s' changed by compiler to `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001768##
+ mcset $l "Invalid set of operands: %s %s" \
+ "Invalid set of operands: %s %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001769##
+ mcset $l "Direct value used as operand for %s" \
+ "Direct value used as operand for %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001770##
+ mcset $l "Too many arguments, \$s extra argument(s)" \
+ "Too many arguments, \$s extra argument(s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001771##
+ mcset $l "Too few arguments, %s argument(s) missing: %s ..." \
+ "Too few arguments, %s argument(s) missing: %s ..." ;# <-- NOT TRANSLATED YET
+ ##ID:001772##
+ mcset $l "Cannot define macro inside another one -- macro processing failed" \
+ "Cannot define macro inside another one -- macro processing failed" ;# <-- NOT TRANSLATED YET
+ ##ID:001773##
+ mcset $l "Missing number of repeats" \
+ "Missing number of repeats" ;# <-- NOT TRANSLATED YET
+ ##ID:001774##
+ mcset $l "Number of repeats is lower than zero" \
+ "Number of repeats is lower than zero" ;# <-- NOT TRANSLATED YET
+ ##ID:001775##
+ mcset $l "Zero number of repeats" \
+ "Zero number of repeats" ;# <-- NOT TRANSLATED YET
+ ##ID:001776##
+ mcset $l "Reserved keyword used as macro parameter: %s in macro %s" \
+ "Reserved keyword used as macro parameter: %s in macro %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001777##
+ mcset $l "Reserved keyword substituted with macro argument: %s --> %s" \
+ "Reserved keyword substituted with macro argument: %s --> %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001778##
+ mcset $l "Macro name is reserved keyword: %s" \
+ "Macro name is reserved keyword: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001779##
+ mcset $l "Macro `%s' is already defined" \
+ "Macro `%s' is already defined" ;# <-- NOT TRANSLATED YET
+ ##ID:001780##
+ mcset $l "Directive %s takes no arguments" \
+ "Directive %s takes no arguments" ;# <-- NOT TRANSLATED YET
+ ##ID:001781##
+ mcset $l "Label is not allowed here (%s)" \
+ "Label is not allowed here (%s)" ;# <-- NOT TRANSLATED YET
+ ##ID:001782##
+ mcset $l "Value of ``\$'' is not known at this point" \
+ "Value of ``\$'' is not known at this point" ;# <-- NOT TRANSLATED YET
+ ##ID:001783##
+ mcset $l "Unable to close macro, no macro is opened" \
+ "Unable to close macro, no macro is opened" ;# <-- NOT TRANSLATED YET
+ ##ID:001784##
+ mcset $l "Invalid label specification: ``%s''" \
+ "Invalid label specification: ``%s''" ;# <-- NOT TRANSLATED YET
+ ##ID:001785##
+ mcset $l "Missing name of macro" \
+ "Missing name of macro" ;# <-- NOT TRANSLATED YET
+ ##ID:001786##
+ mcset $l "Labels are not allowed before directives ENDM" \
+ "Labels are not allowed before directives ENDM" ;# <-- NOT TRANSLATED YET
+ ##ID:001787##
+ mcset $l "Missing file name" \
+ "Missing file name" ;# <-- NOT TRANSLATED YET
+ ##ID:001788##
+ mcset $l "Unable to open file: %s" \
+ "无法打开文件: %s"
+ ##ID:001789##
+ mcset $l "File not found: %s" \
+ "文件没有找到: %s"
+ ##ID:001790##
+ mcset $l "Extra symbols after `END' directive" \
+ "Extra symbols after `END' directive" ;# <-- NOT TRANSLATED YET
+ ##ID:001791##
+ mcset $l "Missing `END' directive" \
+ "Missing `END' directive" ;# <-- NOT TRANSLATED YET
+ ##ID:001792##
+ mcset $l "Missing address" \
+ "Missing address" ;# <-- NOT TRANSLATED YET
+ ##ID:001793##
+ mcset $l "Label already defined: `%s'" \
+ "Label already defined: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001794##
+ mcset $l "Invalid label: `%s'" \
+ "Invalid label: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001795##
+ mcset $l "This ORG has lower value than the previous one" \
+ "This ORG has lower value than the previous one" ;# <-- NOT TRANSLATED YET
+ ##ID:001796##
+ mcset $l "This formulation is deprecated, consider usage of \"<Const> <Directive> <Value>\" instead" \
+ "This formulation is deprecated, consider usage of \"<Const> <Directive> <Value>\" instead" ;# <-- NOT TRANSLATED YET
+ ##ID:001797##
+ mcset $l "Missing name of constant to define" \
+ "Missing name of constant to define" ;# <-- NOT TRANSLATED YET
+ ##ID:001798##
+ mcset $l "Empty expression" \
+ "Empty expression" ;# <-- NOT TRANSLATED YET
+ ##ID:001799##
+ mcset $l "Missing expression" \
+ "Missing expression" ;# <-- NOT TRANSLATED YET
+ ##ID:001800##
+ mcset $l "Argument value is out of range ({0 1 2 3}) : `%s'" \
+ "Argument value is out of range ({0 1 2 3}) : `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001801##
+ mcset $l "Missing size" \
+ "Missing size" ;# <-- NOT TRANSLATED YET
+ ##ID:001802##
+ mcset $l "Length of data area cannot be negative number: %s" \
+ "Length of data area cannot be negative number: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001803##
+ mcset $l "Using `DBIT' directive, but active segment is `%s' (should be BSEG)" \
+ "Using `DBIT' directive, but active segment is `%s' (should be BSEG)" ;# <-- NOT TRANSLATED YET
+ ##ID:001804##
+ mcset $l "Using `%s' directive, but currently active segment is `%s'" \
+ "Using `%s' directive, but currently active segment is `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001805##
+ mcset $l "Exceeding %s segment boundary by %s bites." \
+ "Exceeding %s segment boundary by %s bites." ;# <-- NOT TRANSLATED YET
+ ##ID:001806##
+ mcset $l "Exceeding %s segment boundary by %s Bytes." \
+ "Exceeding %s segment boundary by %s Bytes." ;# <-- NOT TRANSLATED YET
+ ##ID:001807##
+ mcset $l "Nearing %s segment boundary" \
+ "Nearing %s segment boundary" ;# <-- NOT TRANSLATED YET
+ ##ID:001808##
+ mcset $l "Overwriting reserved memory -- in %s area at addresses: %s" \
+ "Overwriting reserved memory -- in %s area at addresses: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001809##
+ mcset $l "Unable redefine constant: %s" \
+ "Unable redefine constant: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001810##
+ mcset $l "Ambiguous symbol definition: %s" \
+ "Ambiguous symbol definition: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001811##
+ mcset $l "Unknown operator: `%s', should be `%s at <address>', e.g. `%s at X+0FFh'" \
+ "Unknown operator: `%s', should be `%s at <address>', e.g. `%s at X+0FFh'" ;# <-- NOT TRANSLATED YET
+ ##ID:001812##
+ mcset $l "Segment pointer is too high: %s / %s" \
+ "Segment pointer is too high: %s / %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001813##
+ mcset $l "Segment pointer cannot be negative: `%s'" \
+ "Segment pointer cannot be negative: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001814##
+ mcset $l "Missing condition" \
+ "Missing condition" ;# <-- NOT TRANSLATED YET
+ ##ID:001815##
+ mcset $l "Unexpected `ELSE'" \
+ "Unexpected `ELSE'" ;# <-- NOT TRANSLATED YET
+ ##ID:001816##
+ mcset $l "Unexpected `ELSEIF'" \
+ "Unexpected `ELSEIF'" ;# <-- NOT TRANSLATED YET
+ ##ID:001817##
+ mcset $l "Unexpected `ENDIF'" \
+ "Unexpected `ENDIF'" ;# <-- NOT TRANSLATED YET
+ ##ID:001818##
+ mcset $l "Invalid symbolic name: %s" \
+ "Invalid symbolic name: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001819##
+ mcset $l "Invalid expression: `%s'" \
+ "Invalid expression: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001820##
+ mcset $l "Expected symbol to define, but got label: `%s'" \
+ "Expected symbol to define, but got label: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001821##
+ mcset $l "Invalid symbol name: `%s'" \
+ "Invalid symbol name: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001822##
+ mcset $l "Special value (with no numerical representation) assigned to constant: %s <- %s" \
+ "Special value (with no numerical representation) assigned to constant: %s <- %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001823##
+ mcset $l "Trying to overwrite constant: %s" \
+ "Trying to overwrite constant: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001824##
+ mcset $l "Expression out of range" \
+ "Expression out of range" ;# <-- NOT TRANSLATED YET
+ ##ID:001825##
+ mcset $l "Exceeding code memory capacity: %s <- %s" \
+ "Exceeding code memory capacity: %s <- %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001826##
+ mcset $l "Exceeding internal data memory capacity: %s <- %s" \
+ "Exceeding internal data memory capacity: %s <- %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001827##
+ mcset $l "Exceeding external data memory capacity: %s <- %s" \
+ "Exceeding external data memory capacity: %s <- %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001828##
+ mcset $l "Trying to change variable `%s' with wrong directive (EQU)" \
+ "Trying to change variable `%s' with wrong directive (EQU)" ;# <-- NOT TRANSLATED YET
+ ##ID:001829##
+ mcset $l "Setting new variable value: %s <- %s" \
+ "Setting new variable value: %s <- %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001830##
+ mcset $l "Invalid expression - parentheses are not balanced: `%s'" \
+ "Invalid expression - parentheses are not balanced: `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001831##
+ mcset $l "Invalid value: `%s' (should be char)" \
+ "Invalid value: `%s' (should be char)" ;# <-- NOT TRANSLATED YET
+ ##ID:001832##
+ mcset $l "Invalid numeric value: %s (should be decimal number)" \
+ "Invalid numeric value: %s (should be decimal number)" ;# <-- NOT TRANSLATED YET
+ ##ID:001833##
+ mcset $l "Invalid numeric value: %s (should be hexadecimal number)" \
+ "Invalid numeric value: %s (should be hexadecimal number)" ;# <-- NOT TRANSLATED YET
+ ##ID:001834##
+ mcset $l "Invalid numeric value: %s (should be binary number)" \
+ "Invalid numeric value: %s (should be binary number)" ;# <-- NOT TRANSLATED YET
+ ##ID:001835##
+ mcset $l "Invalid numeric value: %s (should be octal number)" \
+ "Invalid numeric value: %s (should be octal number)" ;# <-- NOT TRANSLATED YET
+ ##ID:001836##
+ mcset $l "Undefined symbol name: %s" \
+ "Undefined symbol name: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001837##
+ mcset $l "Floating point value converted to integer value `%s' -> `%s'" \
+ "Floating point value converted to integer value `%s' -> `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001838##
+ mcset $l "Overflow `%s' -> `%s'" \
+ "Overflow `%s' -> `%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001839##
+ mcset $l "Cannot to use string `%s' as a valid value" \
+ "Cannot to use string `%s' as a valid value" ;# <-- NOT TRANSLATED YET
+ ##ID:001840##
+ mcset $l "Cannot to use string `%s' as value" \
+ "Cannot to use string `%s' as value" ;# <-- NOT TRANSLATED YET
+ ##ID:001841##
+ mcset $l "Compilation error at %s: %s" \
+ "Compilation error at %s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001842##
+ mcset $l " in %s" \
+ " in %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001843##
+ mcset $l "\033\[31;1mCompilation error\033\[m at \033\[31;1;4m%s\033\[m%s: %s" \
+ "\033\[31;1mCompilation error\033\[m at \033\[31;1;4m%s\033\[m%s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001844##
+ mcset $l "Notice at %s: %s" \
+ "Notice at %s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001845##
+ mcset $l "\033\[33;1mNotice\033\[m at \033\[33;1;4m%s\033\[m%s: %s" \
+ "\033\[33;1mNotice\033\[m at \033\[33;1;4m%s\033\[m%s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001846##
+ mcset $l "Warning at %s: %s" \
+ "Warning at %s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001847##
+ mcset $l "\033\[33mWarning\033\[m at \033\[33;4m%s\033\[m%s: %s" \
+ "\033\[33mWarning\033\[m at \033\[33;4m%s\033\[m%s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001848##
+ mcset $l "Syntax error at %s: %s" \
+ "Syntax error at %s: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001849##
+ mcset $l "\033\[31;1mSyntax error\033\[m at \033\[31;1;4m%s\033\[m%s: %s" \
+ "\033\[31;1mSyntax error\033\[m at \033\[31;1;4m%s\033\[m%s: %s" ;# <-- NOT TRANSLATED YET
+}
+# errorhandler.tcl
+# ==============================================================================
+namespace eval ErrorHandler {
+ ##ID:001850##
+ mcset $l "PROGRAM ERROR " \
+ "程序错误 "
+ ##ID:001851##
+ mcset $l "Error log saved in: %s\n" \
+ "错误日志保存在: %s\n"
+ ##ID:001852##
+ mcset $l "Please send this file to %s or report this bug at http://mcu8051ide.sf.net/forum\n\n\n" \
+ "Please send this file to %s or report this bug at http://mcu8051ide.sf.net/forum\n\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:001853##
+ mcset $l "ERROR DETAILS:\n--------------\n" \
+ "错误详细信息:\n--------------\n"
+ ##ID:001854##
+ mcset $l "Skip errors" \
+ "跳过错误"
+ ##ID:001855##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:001856##
+ mcset $l "PROGRAM ERROR - MCU 8051 IDE" \
+ "程序错误 - MCU 8051 IDE"
+}
+# notes.tcl
+# ==============================================================================
+namespace eval Notes {
+ ##ID:001857##
+ mcset $l "Pencil" \
+ "铅笔"
+ ##ID:001858##
+ mcset $l "Line" \
+ "线"
+ ##ID:001859##
+ mcset $l "Arrow" \
+ "箭头"
+ ##ID:001860##
+ mcset $l "Rectangle" \
+ "矩形"
+ ##ID:001861##
+ mcset $l "Oval" \
+ "椭圆形"
+ ##ID:001862##
+ mcset $l "Insert text" \
+ "插入文本"
+ ##ID:001863##
+ mcset $l "Move" \
+ "移动"
+ ##ID:001864##
+ mcset $l "Move canvas" \
+ "移动画布"
+ ##ID:001865##
+ mcset $l "Eraser" \
+ "橡皮擦"
+ ##ID:001866##
+ mcset $l "Zoom in" \
+ "放大"
+ ##ID:001867##
+ mcset $l "Zoom out" \
+ "缩小"
+ ##ID:001868##
+ mcset $l "Insert image" \
+ "插入图像"
+ ##ID:001869##
+ mcset $l "Select color" \
+ "选择颜色"
+ ##ID:001870##
+ mcset $l "Clear all" \
+ "清除所有"
+ ##ID:001871##
+ mcset $l "Really close ?" \
+ "真的关闭 ?"
+ ##ID:001872##
+ mcset $l "Do you really want to close your notes ? (There is no save function ...)" \
+ "Do you really want to close your notes ? (There is no save function ...)" ;# <-- NOT TRANSLATED YET
+ ##ID:001873##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:001874##
+ mcset $l "Shade" \
+ "收缩"
+ ##ID:001875##
+ mcset $l "Draw ovals" \
+ "绘制椭圆"
+ ##ID:001876##
+ mcset $l "Draw rectangles" \
+ "绘制矩形"
+ ##ID:001877##
+ mcset $l "Draw arrows" \
+ "绘制箭头"
+ ##ID:001878##
+ mcset $l "Draw lines" \
+ "绘制线"
+ ##ID:001879##
+ mcset $l "Text:" \
+ "文本:"
+ ##ID:001880##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:001881##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:001882##
+ mcset $l "Enter text" \
+ "输入文本"
+ ##ID:001883##
+ mcset $l "Are you sure ?" \
+ "您确定吗?"
+ ##ID:001884##
+ mcset $l "Do you really want to clear this notepad\n(there is no undo action)" \
+ "您难道真的要清除这个记事本?\n(无法返回的操作)"
+ ##ID:001885##
+ mcset $l "Insert image from file" \
+ "从文件中插入图像"
+ ##ID:001886##
+ mcset $l "Unable to read file" \
+ "无法读取文件"
+ ##ID:001887##
+ mcset $l "Scribble notepad" \
+ "便利贴"
+ ##ID:001888##
+ mcset $l "Portable network graphics" \
+ "Portable network graphics" ;# <-- NOT TRANSLATED YET
+}
+# sfrwatches.tcl
+# ==============================================================================
+namespace eval SFRWatches {
+ ##ID:001889##
+ mcset $l "Set to 0x00" \
+ "Set to 0x00" ;# <-- NOT TRANSLATED YET
+ ##ID:001890##
+ mcset $l "Set this register to 0" \
+ "Set this register to 0" ;# <-- NOT TRANSLATED YET
+ ##ID:001891##
+ mcset $l "Set to 0xFF" \
+ "Set to 0xFF" ;# <-- NOT TRANSLATED YET
+ ##ID:001892##
+ mcset $l "Set this register to 255" \
+ "Set this register to 255" ;# <-- NOT TRANSLATED YET
+ ##ID:001893##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:001894##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:001895##
+ mcset $l "Register" \
+ "Register" ;# <-- NOT TRANSLATED YET
+ ##ID:001896##
+ mcset $l "Search:" \
+ "Search:" ;# <-- NOT TRANSLATED YET
+}
+# stackmonitor.tcl
+# ==============================================================================
+namespace eval StackMonitor {
+ ##ID:001897##
+ mcset $l "Do you really want to clear the list without any effect in simulator engine ?" \
+ "Do you really want to clear the list without any effect in simulator engine ?" ;# <-- NOT TRANSLATED YET
+ ##ID:001898##
+ mcset $l "Confirmation" \
+ "确认"
+ ##ID:001899##
+ mcset $l "Push value onto stack." \
+ "Push value onto stack." ;# <-- NOT TRANSLATED YET
+ ##ID:001900##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:001901##
+ mcset $l "PUSH" \
+ "PUSH" ;# <-- NOT TRANSLATED YET
+ ##ID:001902##
+ mcset $l "POP" \
+ "POP" ;# <-- NOT TRANSLATED YET
+ ##ID:001903##
+ mcset $l "Clear" \
+ "清除"
+ ##ID:001904##
+ mcset $l "SP: " \
+ "SP: " ;# <-- NOT TRANSLATED YET
+ ##ID:001905##
+ mcset $l "Push value onto stack (HEX)" \
+ "Push value onto stack (HEX)" ;# <-- NOT TRANSLATED YET
+ ##ID:001906##
+ mcset $l "Stack - %s - MCU 8051 IDE" \
+ "Stack - %s - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:001907##
+ mcset $l "General" \
+ "General" ;# <-- NOT TRANSLATED YET
+ ##ID:001908##
+ mcset $l "Subprogram" \
+ "Subprogram" ;# <-- NOT TRANSLATED YET
+ ##ID:001909##
+ mcset $l "Interrupt" \
+ "中断"
+ ##ID:001910##
+ mcset $l "Legend:" \
+ "Legend:" ;# <-- NOT TRANSLATED YET
+ ##ID:001911##
+ mcset $l "Show/Hide tool bar" \
+ "显示/隐藏工具栏"
+ ##ID:001912##
+ mcset $l "Current stack pointer value" \
+ "Current stack pointer value" ;# <-- NOT TRANSLATED YET
+ # Keep string length here!
+ ##ID:001913##
+ mcset $l {Addr HH Dec Binary Oct A} \
+ {Addr HH Dec Binary Oct A} ;# <-- NOT TRANSLATED YET
+}
+# terminal.tcl
+# ==============================================================================
+namespace eval Terminal {
+ ##ID:001914##
+ mcset $l "Unable to find urxvt" \
+ "找不到urxvt"
+ ##ID:001915##
+ mcset $l "Unable to execute program \"urxvt\", terminal emulator is eiter not available or badly configured." \
+ "Unable to execute program \"urxvt\", terminal emulator is eiter not available or badly configured." ;# <-- NOT TRANSLATED YET
+}
+# eightsegment.tcl
+# ==============================================================================
+namespace eval EightSegment {
+ ##ID:001916##
+ mcset $l "8 segment editor" \
+ "8 segment editor" ;# <-- NOT TRANSLATED YET
+ ##ID:001917##
+ mcset $l "Common cathode" \
+ "Common cathode" ;# <-- NOT TRANSLATED YET
+ ##ID:001918##
+ mcset $l "Hex:" \
+ "Hex:" ;# <-- NOT TRANSLATED YET
+ ##ID:001919##
+ mcset $l "Dec:" \
+ "Dec:" ;# <-- NOT TRANSLATED YET
+ ##ID:001920##
+ mcset $l "Bin:" \
+ "Bin:" ;# <-- NOT TRANSLATED YET
+ ##ID:001921##
+ mcset $l "Copy to clipboard" \
+ "复制到剪贴板"
+ ##ID:001922##
+ mcset $l "Copy contents of the entrybox to clipboard" \
+ "Copy contents of the entrybox to clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:001923##
+ mcset $l "Common anode" \
+ "Common anode" ;# <-- NOT TRANSLATED YET
+ ##ID:001924##
+ mcset $l "LED" \
+ "LED" ;# <-- NOT TRANSLATED YET
+ ##ID:001925##
+ mcset $l "PIN" \
+ "PIN" ;# <-- NOT TRANSLATED YET
+ ##ID:001926##
+ mcset $l "Close" \
+ "关闭"
+}
+# symbol_viewer.tcl
+# ==============================================================================
+namespace eval SymbolViewer {
+ ##ID:001927##
+ mcset $l "Assembly symbol table - MCU 8051 IDE" \
+ "符号表集合 - MCU 8051 IDE"
+ ##ID:001928##
+ mcset $l "Copy symbol name" \
+ "复制符号名称"
+ ##ID:001929##
+ mcset $l "Copy hex value" \
+ "复制十六进制值"
+ ##ID:001930##
+ mcset $l "Copy dec value" \
+ "复制十进制值"
+ ##ID:001931##
+ mcset $l "Copy line" \
+ "复制行"
+ ##ID:001932##
+ mcset $l "Open *.LST" \
+ "打开*.LST"
+ ##ID:001933##
+ mcset $l "Load table of symbols from list file (*.lst)\n\tOnly for: ASEM-51, MCU8051IDE and ASM51" \
+ "Load table of symbols from list file (*.lst)\n\tOnly for: ASEM-51, MCU8051IDE and ASM51" ;# <-- NOT TRANSLATED YET
+ ##ID:001934##
+ mcset $l "Open code listing" \
+ "打开代码列表"
+ ##ID:001935##
+ mcset $l "Reload" \
+ "刷新"
+ ##ID:001936##
+ mcset $l "Reload opened file" \
+ "刷新打开的文件"
+ ##ID:001937##
+ mcset $l "Search:" \
+ "搜索:"
+ ##ID:001938##
+ mcset $l "Search for symbol by its name or value" \
+ "Search for symbol by its name or value" ;# <-- NOT TRANSLATED YET
+ ##ID:001939##
+ mcset $l "Search for symbol" \
+ "Search for symbol" ;# <-- NOT TRANSLATED YET
+ ##ID:001940##
+ mcset $l "Clear search entry box" \
+ "清除搜索输入框"
+ ##ID:001941##
+ mcset $l "Symbol\t\t\t\tType\tHEX\tDEC\tUsed" \
+ "Symbol\t\t\t\tType\tHEX\tDEC\tUsed" ;# <-- NOT TRANSLATED YET
+ ##ID:001942##
+ mcset $l "Display" \
+ "显示"
+ ##ID:001943##
+ mcset $l "Used symbols" \
+ "Used symbols" ;# <-- NOT TRANSLATED YET
+ ##ID:001944##
+ mcset $l "Unused symbols" \
+ "Unused symbols" ;# <-- NOT TRANSLATED YET
+ ##ID:001945##
+ mcset $l "Sort by" \
+ "Sort by" ;# <-- NOT TRANSLATED YET
+ ##ID:001946##
+ mcset $l "Incremental order" \
+ "Incremental order" ;# <-- NOT TRANSLATED YET
+ ##ID:001947##
+ mcset $l "Decremental order" \
+ "Decremental order" ;# <-- NOT TRANSLATED YET
+ ##ID:001948##
+ mcset $l "Load symbol table - MCU 8051 IDE" \
+ "载入符号表 - MCU 8051 IDE"
+ ##ID:001949##
+ mcset $l "Code listing" \
+ "代码列表"
+ ##ID:001950##
+ mcset $l "Invalid file" \
+ "无效文件"
+ ##ID:001951##
+ mcset $l "Unable to use selected file. Please check your permissions. File: '%s'" \
+ "Unable to use selected file. Please check your permissions. File: '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:001952##
+ mcset $l "YES" \
+ "Yes"
+ ##ID:001953##
+ mcset $l "NO" \
+ "NO" ;# <-- NOT TRANSLATED YET
+}
+# sfrmap.tcl
+# ==============================================================================
+namespace eval SFRMap {
+ ##ID:001954##
+ mcset $l "Map of SFR area" \
+ "Map of SFR area" ;# <-- NOT TRANSLATED YET
+ ##ID:001955##
+ mcset $l "Reserved" \
+ "Reserved" ;# <-- NOT TRANSLATED YET
+ ##ID:001956##
+ mcset $l "Bit addressable" \
+ "Bit addressable" ;# <-- NOT TRANSLATED YET
+ ##ID:001957##
+ mcset $l "HEX:" \
+ "HEX:" ;# <-- NOT TRANSLATED YET
+ ##ID:001958##
+ mcset $l "DEC:" \
+ "DEC:" ;# <-- NOT TRANSLATED YET
+ ##ID:001959##
+ mcset $l "BIN:" \
+ "BIN:" ;# <-- NOT TRANSLATED YET
+ ##ID:001960##
+ mcset $l "OCT:" \
+ "OCT:" ;# <-- NOT TRANSLATED YET
+}
+# hibernate.tcl
+# ==============================================================================
+namespace eval Hibernate {
+ ##ID:001961##
+ mcset $l "Abort" \
+ "中止"
+ ##ID:001962##
+ mcset $l "Hibernation progress" \
+ "Hibernation progress" ;# <-- NOT TRANSLATED YET
+ ##ID:001963##
+ mcset $l "Interrupt at vector 0x%s " \
+ "Interrupt at vector 0x%s " ;# <-- NOT TRANSLATED YET
+ ##ID:001964##
+ mcset $l "Fatal error" \
+ "致命错误"
+ ##ID:001965##
+ mcset $l "Version of this M5IHIB file is higher than %s\nUnable to continue." \
+ "Version of this M5IHIB file is higher than %s\nUnable to continue." ;# <-- NOT TRANSLATED YET
+ ##ID:001966##
+ mcset $l "The following problems must be \nresolved before program resumption" \
+ "The following problems must be \nresolved before program resumption" ;# <-- NOT TRANSLATED YET
+ ##ID:001967##
+ mcset $l "This file is indented for %s but the current MCU is %s" \
+ "This file is indented for %s but the current MCU is %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001968##
+ mcset $l "Set current MCU to %s" \
+ "Set current MCU to %s" ;# <-- NOT TRANSLATED YET
+ ##ID:001969##
+ mcset $l "This file contains %s B of external data memory but but your processor has %s B" \
+ "This file contains %s B of external data memory but but your processor has %s B" ;# <-- NOT TRANSLATED YET
+ ##ID:001970##
+ mcset $l "Set current XDATA capacity to %s B" \
+ "Set current XDATA capacity to %s B" ;# <-- NOT TRANSLATED YET
+ ##ID:001971##
+ mcset $l "Ignore this difference" \
+ "Ignore this difference" ;# <-- NOT TRANSLATED YET
+ ##ID:001972##
+ mcset $l "Current file (%s) has different MD5 hash than MD5 recorded in this hibernation file" \
+ "Current file (%s) has different MD5 hash than MD5 recorded in this hibernation file" ;# <-- NOT TRANSLATED YET
+ ##ID:001973##
+ mcset $l "This hibernation file was generated from \"%s\" but current file is \"%s\"" \
+ "This hibernation file was generated from \"%s\" but current file is \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:001974##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:001975##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:001976##
+ mcset $l "Program resumption" \
+ "恢复计划"
+ ##ID:001977##
+ mcset $l "Options:" \
+ "选项:"
+}
+# find_in_files.tcl
+# ==============================================================================
+namespace eval FindInFiles {
+ ##ID:001978##
+ mcset $l "Go to" \
+ "转到"
+ ##ID:001979##
+ mcset $l "Go to this line" \
+ "前往此行"
+ ##ID:001980##
+ mcset $l "Clear" \
+ "清除"
+ ##ID:001981##
+ mcset $l "Clear this panel" \
+ "清除此面板"
+ ##ID:001982##
+ mcset $l "Search pattern" \
+ "搜索模式"
+ ##ID:001983##
+ mcset $l "File mask (e.g. \"*.c,*.asm\")" \
+ "File mask (e.g. \"*.c,*.asm\")" ;# <-- NOT TRANSLATED YET
+ ##ID:001984##
+ mcset $l "Select folder" \
+ "选择文件夹"
+ ##ID:001985##
+ mcset $l "Recursive" \
+ "递归"
+ ##ID:001986##
+ mcset $l "Search in all subfolders" \
+ "搜索所有子文件夹"
+ ##ID:001987##
+ mcset $l "Find" \
+ "查找"
+ ##ID:001988##
+ mcset $l "Start / Stop search" \
+ "开始/停止搜索"
+ ##ID:001989##
+ mcset $l "Clear results" \
+ "清除结果"
+ ##ID:001990##
+ mcset $l "Case sensitive" \
+ "区分大小写"
+ ##ID:001991##
+ mcset $l "Perform case sensitive search" \
+ "执行区分大小写的搜索"
+ ##ID:001992##
+ mcset $l "Regular expression" \
+ "正规表达式"
+ ##ID:001993##
+ mcset $l "Pattern is a regular expression" \
+ "正规表达式模式"
+ ##ID:001994##
+ mcset $l "Pattern:" \
+ "模式:"
+ ##ID:001995##
+ mcset $l "Folder:" \
+ "文件夹:"
+ ##ID:001996##
+ mcset $l "Mask:" \
+ "Mask:" ;# <-- NOT TRANSLATED YET
+ ##ID:001997##
+ mcset $l "Clear pattern entrybox" \
+ "Clear pattern entrybox" ;# <-- NOT TRANSLATED YET
+ ##ID:001998##
+ mcset $l "Show help for file mask" \
+ "Show help for file mask" ;# <-- NOT TRANSLATED YET
+ ##ID:001999##
+ mcset $l "Choose directory - MCU 8051 IDE" \
+ "选择目录 - MCU 8051 IDE"
+ ##ID:002000##
+ mcset $l "Folder not found" \
+ "没有找到文件夹"
+ ##ID:002001##
+ mcset $l "The specified folder does not exist.\n'%s'" \
+ "The specified folder does not exist.\n'%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002002##
+ mcset $l "The string specified as a folder is not a folder.\n'%s'" \
+ "The string specified as a folder is not a folder.\n'%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002003##
+ mcset $l "Error" \
+ "错误"
+ ##ID:002004##
+ mcset $l "Invalid regular expression" \
+ "Invalid regular expression" ;# <-- NOT TRANSLATED YET
+ ##ID:002005##
+ mcset $l "Stop" \
+ "停止"
+ ##ID:002006##
+ mcset $l "-- click to close --" \
+ "-- 点击关闭 --"
+ ##ID:002007##
+ mcset $l "Comma separated list of file masks (e.g \"*.c,*.h,*.asm\")\n" \
+ "Comma separated list of file masks (e.g \"*.c,*.h,*.asm\")\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002008##
+ mcset $l "The mask may contain any of the following special characters:\n" \
+ "The mask may contain any of the following special characters:\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002009##
+ mcset $l " ? Matches any single character.\n" \
+ " ? Matches any single character.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002010##
+ mcset $l " * Matches any sequence of zero or more characters.\n" \
+ " * Matches any sequence of zero or more characters.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002011##
+ mcset $l " \[chars\] Matches any single character in chars.\n" \
+ " \[chars\] Matches any single character in chars.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002012##
+ mcset $l " If chars contains a sequence of the form a-b then any\n" \
+ " If chars contains a sequence of the form a-b then any\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002013##
+ mcset $l " character between a and b (inclusive) will match.\n" \
+ " character between a and b (inclusive) will match.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002014##
+ mcset $l " \\x Matches the character x." \
+ " \\x Matches the character x." ;# <-- NOT TRANSLATED YET
+}
+# fsbrowser.tcl
+# ==============================================================================
+namespace eval FSBrowser {
+ ##ID:002015##
+ mcset $l "Sorting" \
+ "排序"
+ ##ID:002016##
+ mcset $l "By Name" \
+ "按名称"
+ ##ID:002017##
+ mcset $l "Sort files by name" \
+ "按文件名称排序"
+ ##ID:002018##
+ mcset $l "By Date" \
+ "按日期"
+ ##ID:002019##
+ mcset $l "Sort files by date" \
+ "按文件日期排序"
+ ##ID:002020##
+ mcset $l "By Size" \
+ "俺大小"
+ ##ID:002021##
+ mcset $l "Sort files by size" \
+ "按文件大小排序"
+ ##ID:002022##
+ mcset $l "Reverse" \
+ "反向"
+ ##ID:002023##
+ mcset $l "Decremental sorting" \
+ "递减排序"
+ ##ID:002024##
+ mcset $l "Case insensitive" \
+ "不区分大小写"
+ ##ID:002025##
+ mcset $l "Sorting mode ASCII / Dictionary" \
+ "Sorting mode ASCII / Dictionary" ;# <-- NOT TRANSLATED YET
+ ##ID:002026##
+ mcset $l "Show hidden files" \
+ "显示隐藏文件"
+ ##ID:002027##
+ mcset $l "Show / Ignore files starting with dot" \
+ "显示/忽略文件开头点"
+ ##ID:002028##
+ mcset $l "Up" \
+ "向上"
+ ##ID:002029##
+ mcset $l "Go to parent folder" \
+ "转到父文件夹"
+ ##ID:002030##
+ mcset $l "Back" \
+ "后退"
+ ##ID:002031##
+ mcset $l "Go back in history" \
+ "转到上一个访问的位置"
+ ##ID:002032##
+ mcset $l "Forward" \
+ "向前"
+ ##ID:002033##
+ mcset $l "Go forward in history" \
+ "转到下一个访问的位置"
+ ##ID:002034##
+ mcset $l "Home" \
+ "主文件夹"
+ ##ID:002035##
+ mcset $l "Go to your home folder" \
+ "转到您的主文件夹"
+ ##ID:002036##
+ mcset $l "Reload" \
+ "刷新"
+ ##ID:002037##
+ mcset $l "Reload file list" \
+ "刷新文件列表"
+ ##ID:002038##
+ mcset $l "Rename" \
+ "重命名"
+ ##ID:002039##
+ mcset $l "Rename file" \
+ "重命名文件"
+ ##ID:002040##
+ mcset $l "Delete" \
+ "删除"
+ ##ID:002041##
+ mcset $l "Delete file" \
+ "删除文件"
+ ##ID:002042##
+ mcset $l "New folder" \
+ "新建文件夹"
+ ##ID:002043##
+ mcset $l "Create new directory" \
+ "新建目录"
+ ##ID:002044##
+ mcset $l "Bookmark folder" \
+ "书签文件夹"
+ ##ID:002045##
+ mcset $l "Bookmark the current directory" \
+ "Bookmark the current directory" ;# <-- NOT TRANSLATED YET
+ ##ID:002046##
+ mcset $l "Properties" \
+ "属性"
+ ##ID:002047##
+ mcset $l "Show file properties" \
+ "显示文件属性"
+ ##ID:002048##
+ mcset $l "Add bookmark" \
+ "添加书签"
+ ##ID:002049##
+ mcset $l "Bookmark the current folder" \
+ "书签当前文件夹"
+ ##ID:002050##
+ mcset $l "Edit bookmarks" \
+ "编辑书签"
+ ##ID:002051##
+ mcset $l "Invoke bookmark editor" \
+ "调用书签编辑器"
+ ##ID:002052##
+ mcset $l "Back in history" \
+ "转到上一个访问的位置"
+ ##ID:002053##
+ mcset $l "Forward in history" \
+ "转到下一个访问的位置"
+ ##ID:002054##
+ mcset $l "Bookmark" \
+ "书签"
+ ##ID:002055##
+ mcset $l "Bookmark menu" \
+ "书签菜单"
+ ##ID:002056##
+ mcset $l "Current document folder" \
+ "当前的文件夹"
+ ##ID:002057##
+ mcset $l "Go to directory containing the current document" \
+ "转到当前文档所在的目录"
+ ##ID:002058##
+ mcset $l "Configure" \
+ "配置"
+ ##ID:002059##
+ mcset $l "File system browser configuration menu" \
+ "文件系统浏览器的配置菜单"
+ ##ID:002060##
+ mcset $l "Current directory" \
+ "当前目录"
+ ##ID:002061##
+ mcset $l "Directory location bar" \
+ "目录位置栏"
+ ##ID:002062##
+ mcset $l "Confirm directory location" \
+ "目录位置确认"
+ ##ID:002063##
+ mcset $l "Filter" \
+ "过滤器"
+ ##ID:002064##
+ mcset $l "File filter" \
+ "文件过滤器"
+ ##ID:002065##
+ mcset $l "Invalid directory" \
+ "无效目录"
+ ##ID:002066##
+ mcset $l "The specified directory does not exist:\n%s" \
+ "The specified directory does not exist:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002067##
+ mcset $l "Unable to compile" \
+ "无法编译"
+ ##ID:002068##
+ mcset $l "Unable to open source file while simulator is engaged." \
+ "Unable to open source file while simulator is engaged." ;# <-- NOT TRANSLATED YET
+ ##ID:002069##
+ mcset $l "Open file %s" \
+ "打开文件 %s"
+ ##ID:002070##
+ mcset $l "This file does not look like a source code.\nDo you really want to open it ?" \
+ "This file does not look like a source code.\nDo you really want to open it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002071##
+ mcset $l "Permission denied" \
+ "没有权限"
+ ##ID:002072##
+ mcset $l "Unable to rename file:\n%s" \
+ "无法重命名文件:\n%s"
+ ##ID:002073##
+ mcset $l "Do you really want to delete file:\n%s" \
+ "您是否确定删除文件:\n%s"
+ ##ID:002074##
+ mcset $l "Unable to remove file:\n%s" \
+ "无法删除文件:\n%s"
+ ##ID:002075##
+ mcset $l "Create new folder in:\n%s" \
+ "在创建新文件夹:\n%s"
+ ##ID:002076##
+ mcset $l "Clear" \
+ "清除"
+ ##ID:002077##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:002078##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:002079##
+ mcset $l "Unable to create folder" \
+ "无法创建文件夹"
+ ##ID:002080##
+ mcset $l "Unable to create the specified folder" \
+ "无法创建指定的文件夹"
+ ##ID:002081##
+ mcset $l "Directory" \
+ "目录"
+ ##ID:002082##
+ mcset $l "File" \
+ "文件"
+ ##ID:002083##
+ mcset $l "Unknown Error" \
+ "未知错误"
+ ##ID:002084##
+ mcset $l "This file apparently does not exist" \
+ "此文件显然不存在"
+ ##ID:002085##
+ mcset $l "General" \
+ "General" ;# <-- NOT TRANSLATED YET
+ ##ID:002086##
+ mcset $l "Permissions" \
+ "权限"
+ ##ID:002087##
+ mcset $l "Name:" \
+ "名称:"
+ ##ID:002088##
+ mcset $l "Access permissions" \
+ "访问权限"
+ ##ID:002089##
+ mcset $l "Ownership" \
+ "所有权"
+ ##ID:002090##
+ mcset $l "Owner" \
+ "所有主"
+ ##ID:002091##
+ mcset $l "Group" \
+ "所有组"
+ ##ID:002092##
+ mcset $l "Item properties" \
+ "项目属性"
+ ##ID:002093##
+ mcset $l "Unable to change permissions for file:\n%s" \
+ "Unable to change permissions for file:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002094##
+ mcset $l "Unable to rename file:\n%s\n\t=>\n%s" \
+ "无法重命名文件:\n%s\n\t=>\n%s"
+}
+# ihextools.tcl
+# ==============================================================================
+namespace eval IHexTools {
+ ##ID:002095##
+ mcset $l "Line contains invalid characters" \
+ "Line contains invalid characters" ;# <-- NOT TRANSLATED YET
+ ##ID:002096##
+ mcset $l "Line contains even number of characters" \
+ "Line contains even number of characters" ;# <-- NOT TRANSLATED YET
+ ##ID:002097##
+ mcset $l "Unknown record type '%s'" \
+ "Unknown record type '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002098##
+ mcset $l "Bad checksum" \
+ "Bad checksum" ;# <-- NOT TRANSLATED YET
+ ##ID:002099##
+ mcset $l "Bad length" \
+ "Bad length" ;# <-- NOT TRANSLATED YET
+ ##ID:002100##
+ mcset $l "Missing EOF" \
+ "Missing EOF" ;# <-- NOT TRANSLATED YET
+ ##ID:002101##
+ mcset $l "Data length exceeding limit 0x10000" \
+ "Data length exceeding limit 0x10000" ;# <-- NOT TRANSLATED YET
+ ##ID:002102##
+ mcset $l "Invalid address '%s'" \
+ "Invalid address '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002103##
+ mcset $l "Invalid line number '%s'" \
+ "Invalid line number '%s'" ;# <-- NOT TRANSLATED YET
+ ##ID:002104##
+ mcset $l "Invalid data field" \
+ "Invalid data field" ;# <-- NOT TRANSLATED YET
+ ##ID:002105##
+ mcset $l "Error at line %s:\t" \
+ "Error at line %s:\t" ;# <-- NOT TRANSLATED YET
+}
+# project.tcl
+# ==============================================================================
+namespace eval Project {
+ ##ID:002106##
+ mcset $l "Project loading error" \
+ "项目加载错误"
+ ##ID:002107##
+ mcset $l "ERROR:\nThe project file cannot be loaded correctly due to a xml parsing error. The file is either corrupted or it is not a project file acceptable by this environment." \
+ "ERROR:\nThe project file cannot be loaded correctly due to a xml parsing error. The file is either corrupted or it is not a project file acceptable by this environment." ;# <-- NOT TRANSLATED YET
+ ##ID:002108##
+ mcset $l "Converting old project file to new version" \
+ "Converting old project file to new version" ;# <-- NOT TRANSLATED YET
+}
+# simulator.tcl
+# ==============================================================================
+namespace eval Simulator {
+ ##ID:002109##
+ mcset $l "Simulator warning" \
+ "模拟器错误"
+ ##ID:002110##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:002111##
+ mcset $l "See simulator configuration dialog\nMain Menu -> Configure -> Simulator" \
+ "See simulator configuration dialog\n主菜单 -> 配置 -> 模拟器"
+ ##ID:002112##
+ mcset $l "Do not show this dialog again" \
+ "不再显示此对话框"
+ ##ID:002113##
+ mcset $l "PC:" \
+ "PC:" ;# <-- NOT TRANSLATED YET
+ ##ID:002114##
+ mcset $l "Line:" \
+ "Line:" ;# <-- NOT TRANSLATED YET
+ ##ID:002115##
+ mcset $l "File:" \
+ "文件:"
+ ##ID:002116##
+ mcset $l "Invalid return from interrupt" \
+ "Invalid return from interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:002117##
+ mcset $l "Unable to initialize EEPROM programming cycle\nbecause EEMWE, RDYBSY and WRTINH must be set\n" \
+ "Unable to initialize EEPROM programming cycle\nbecause EEMWE, RDYBSY and WRTINH must be set\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002118##
+ mcset $l "Data EEPROM write cycle aborted\n" \
+ "Data EEPROM write cycle aborted\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002119##
+ mcset $l "Unable to read write-only register.\nRandom value returned.\n\nRegister:\t\t0x%s" \
+ "Unable to read write-only register.\nRandom value returned.\n\nRegister:\t\t0x%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002120##
+ mcset $l "Invalid instruction OP code\n" \
+ "Invalid instruction OP code\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002121##
+ mcset $l "Stack overflow\n" \
+ "Stack overflow\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002122##
+ mcset $l "Stack underflow\n" \
+ "Stack underflow\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002123##
+ mcset $l "WATCHDOG OVERFLOW\n" \
+ "看门狗溢出\n"
+ ##ID:002124##
+ mcset $l "Timer mode has been changed while timer was running.\nIt is important to stop timer/counter before changing modes.\n\nTimer number: %s\n" \
+ "Timer mode has been changed while timer was running.\nIt is important to stop timer/counter before changing modes.\n\nTimer number: %s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002125##
+ mcset $l "UART mode has been changed while UART was engaged.\n" \
+ "UART mode has been changed while UART was engaged.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002126##
+ mcset $l "UART: Frame discarded (according to MCS-51 manual)\n" \
+ "UART: Frame discarded (according to MCS-51 manual)\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002127##
+ mcset $l "Unable to access file:\n%s" \
+ "无法访问文件:\n%s"
+ ##ID:002128##
+ mcset $l "Permission denied" \
+ "没有权限"
+ ##ID:002129##
+ mcset $l "Specified file does already exist,\ndo you want to overwrite it ?" \
+ "Specified file does already exist,\ndo you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002130##
+ mcset $l "Overwrite file ?" \
+ "覆盖文件 ?"
+ ##ID:002131##
+ mcset $l "Save error log - MCU 8051 IDE" \
+ "保存错误日志 - MCU 8051 IDE"
+ ##ID:002132##
+ mcset $l "Undefined result - MCU 8051 IDE" \
+ "未定义的结果 - MCU 8051 IDE"
+ ##ID:002133##
+ mcset $l "Save as XHTML" \
+ "另存为XHTML"
+ ##ID:002134##
+ mcset $l "Log files" \
+ "Log files" ;# <-- NOT TRANSLATED YET
+ ##ID:002135##
+ mcset $l "HTML files" \
+ "HTML files" ;# <-- NOT TRANSLATED YET
+ ##ID:002136##
+ mcset $l "Save as plain text" \
+ "保存为纯文本"
+ ##ID:002137##
+ mcset $l "\"Undefined result\"" \
+ "\"未定义的结果\""
+ ##ID:002138##
+ mcset $l "Summary:" \
+ "Summary:" ;# <-- NOT TRANSLATED YET
+ ##ID:002139##
+ mcset $l "\nYour program tried access to register at address " \
+ "\nYour program tried access to register at address " ;# <-- NOT TRANSLATED YET
+ ##ID:002140##
+ mcset $l "\nYour program tried indirect access to register at address " \
+ "\nYour program tried indirect access to register at address " ;# <-- NOT TRANSLATED YET
+ ##ID:002141##
+ mcset $l "\nYour program tried direct access to register at address " \
+ "\nYour program tried direct access to register at address " ;# <-- NOT TRANSLATED YET
+ ##ID:002142##
+ mcset $l "CODE" \
+ "CODE" ;# <-- NOT TRANSLATED YET
+ ##ID:002143##
+ mcset $l "XDATA" \
+ "XDATA" ;# <-- NOT TRANSLATED YET
+ ##ID:002144##
+ mcset $l "Bit area" \
+ "Bit area" ;# <-- NOT TRANSLATED YET
+ ##ID:002145##
+ mcset $l "IDATA" \
+ "IDATA" ;# <-- NOT TRANSLATED YET
+ ##ID:002146##
+ mcset $l "SFR" \
+ "SFR" ;# <-- NOT TRANSLATED YET
+ ##ID:002147##
+ mcset $l "0x%s in program memory" \
+ "0x%s in program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002148##
+ mcset $l "0x%s in external data memory" \
+ "0x%s in external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002149##
+ mcset $l "0x%s in internal data memory" \
+ "0x%s in internal data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002150##
+ mcset $l "0x%s in bit addressable area" \
+ "0x%s in bit addressable area" ;# <-- NOT TRANSLATED YET
+ ##ID:002151##
+ mcset $l "0x%s in special function registers area" \
+ "0x%s in special function registers area" ;# <-- NOT TRANSLATED YET
+ ##ID:002152##
+ mcset $l ". This register is not implemented on this processor (" \
+ ". This register is not implemented on this processor (" ;# <-- NOT TRANSLATED YET
+ ##ID:002153##
+ mcset $l ") in this configuration. You can continue in simulation but result of this operation is undefined." \
+ ") in this configuration. You can continue in simulation but result of this operation is undefined." ;# <-- NOT TRANSLATED YET
+ ##ID:002154##
+ mcset $l "\n\nError details:" \
+ "\n\n错误的详细信息:"
+ ##ID:002155##
+ mcset $l "\n\tTarget memory:\t\t" \
+ "\n\tTarget memory:\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002156##
+ mcset $l "\n\tTarget address: \t" \
+ "\n\tTarget address: \t" ;# <-- NOT TRANSLATED YET
+ ##ID:002157##
+ mcset $l "\n\tLine:\t\t\t" \
+ "\n\tLine:\t\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002158##
+ mcset $l "\n\tFile:\t\t\t" \
+ "\n\tFile:\t\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002159##
+ mcset $l "\n\tProject:\t\t" \
+ "\n\tProject:\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002160##
+ mcset $l "\n\nProcessor details:" \
+ "\n\nProcessor details:" ;# <-- NOT TRANSLATED YET
+ ##ID:002161##
+ mcset $l "\n\tType:\t\t\t" \
+ "\n\tType:\t\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002162##
+ mcset $l "\n\tRam size:\t\t" \
+ "\n\tRam size:\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002163##
+ mcset $l "\n\tProgram memory: \t" \
+ "\n\tProgram memory: \t" ;# <-- NOT TRANSLATED YET
+ ##ID:002164##
+ mcset $l "\n\tExternal memory:\t" \
+ "\n\tExternal memory:\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002165##
+ mcset $l "\n\tExpanded memory:\t" \
+ "\n\tExpanded memory:\t" ;# <-- NOT TRANSLATED YET
+}
+# ledmatrix.tcl
+# ==============================================================================
+namespace eval LedMatrix {
+ ##ID:002166##
+ mcset $l "Fade out interval" \
+ "Fade out interval" ;# <-- NOT TRANSLATED YET
+ ##ID:002167##
+ mcset $l "dim_interval_changed" \
+ "dim_interval_changed" ;# <-- NOT TRANSLATED YET
+ ##ID:002168##
+ mcset $l "Set LED dim interval to 0 instruction cycles" \
+ "Set LED dim interval to 0 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002169##
+ mcset $l "Set LED dim interval to 5 instruction cycles" \
+ "Set LED dim interval to 5 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002170##
+ mcset $l "Set LED dim interval to 10 instruction cycles" \
+ "Set LED dim interval to 10 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002171##
+ mcset $l "Set LED dim interval to 20 instruction cycles" \
+ "Set LED dim interval to 20 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002172##
+ mcset $l "Set LED dim interval to 50 instruction cycles" \
+ "Set LED dim interval to 50 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002173##
+ mcset $l "Set LED dim interval to 100 instruction cycles" \
+ "Set LED dim interval to 100 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002174##
+ mcset $l "Set LED dim interval to 200 instruction cycles" \
+ "Set LED dim interval to 200 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002175##
+ mcset $l "Set LED dim interval to 500 instruction cycles" \
+ "Set LED dim interval to 500 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002176##
+ mcset $l "Set LED dim interval to 1000 instruction cycles" \
+ "Set LED dim interval to 1000 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002177##
+ mcset $l "Mapping" \
+ "Mapping" ;# <-- NOT TRANSLATED YET
+ ##ID:002178##
+ mcset $l "Random" \
+ "Random" ;# <-- NOT TRANSLATED YET
+ ##ID:002179##
+ mcset $l "Random access to the matrix (default)" \
+ "Random access to the matrix (default)" ;# <-- NOT TRANSLATED YET
+ ##ID:002180##
+ mcset $l "Row" \
+ "Row" ;# <-- NOT TRANSLATED YET
+ ##ID:002181##
+ mcset $l "When a particular row is activated, it's previous state is forgotten" \
+ "When a particular row is activated, it's previous state is forgotten" ;# <-- NOT TRANSLATED YET
+ ##ID:002182##
+ mcset $l "Column" \
+ "Column" ;# <-- NOT TRANSLATED YET
+ ##ID:002183##
+ mcset $l "When a particular column is activated, it's previous state is forgotten" \
+ "When a particular column is activated, it's previous state is forgotten" ;# <-- NOT TRANSLATED YET
+ ##ID:002184##
+ mcset $l "Color" \
+ "Color" ;# <-- NOT TRANSLATED YET
+ ##ID:002185##
+ mcset $l "Red" \
+ "Red" ;# <-- NOT TRANSLATED YET
+ ##ID:002186##
+ mcset $l "Orange" \
+ "Orange" ;# <-- NOT TRANSLATED YET
+ ##ID:002187##
+ mcset $l "Yellow" \
+ "Yellow" ;# <-- NOT TRANSLATED YET
+ ##ID:002188##
+ mcset $l "Green" \
+ "Green" ;# <-- NOT TRANSLATED YET
+ ##ID:002189##
+ mcset $l "Blue" \
+ "Blue" ;# <-- NOT TRANSLATED YET
+ ##ID:002190##
+ mcset $l "Purple" \
+ "Purple" ;# <-- NOT TRANSLATED YET
+ ##ID:002191##
+ mcset $l "Light up when" \
+ "Light up when" ;# <-- NOT TRANSLATED YET
+ ##ID:002192##
+ mcset $l "Row 0 & Column 0" \
+ "Row 0 & Column 0" ;# <-- NOT TRANSLATED YET
+ ##ID:002193##
+ mcset $l "Light up LED when both wires are in low" \
+ "Light up LED when both wires are in low" ;# <-- NOT TRANSLATED YET
+ ##ID:002194##
+ mcset $l "Row 0 & Column 1" \
+ "Row 0 & Column 1" ;# <-- NOT TRANSLATED YET
+ ##ID:002195##
+ mcset $l "Light up LED when row wire is in low and column wire is in high" \
+ "Light up LED when row wire is in low and column wire is in high" ;# <-- NOT TRANSLATED YET
+ ##ID:002196##
+ mcset $l "Row 1 & Column 0" \
+ "Row 1 & Column 0" ;# <-- NOT TRANSLATED YET
+ ##ID:002197##
+ mcset $l "Light up LED when row wire is in high and column wire is in low" \
+ "Light up LED when row wire is in high and column wire is in low" ;# <-- NOT TRANSLATED YET
+ ##ID:002198##
+ mcset $l "Row 1 & Column 1" \
+ "Row 1 & Column 1" ;# <-- NOT TRANSLATED YET
+ ##ID:002199##
+ mcset $l "Light up LED when both wires are in high" \
+ "Light up LED when both wires are in high" ;# <-- NOT TRANSLATED YET
+ ##ID:002200##
+ mcset $l "All fade out" \
+ "All fade out" ;# <-- NOT TRANSLATED YET
+ ##ID:002201##
+ mcset $l "Dim all LEDs" \
+ "Dim all LEDs" ;# <-- NOT TRANSLATED YET
+ ##ID:002202##
+ mcset $l "Show help" \
+ "显示帮助"
+ ##ID:002203##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002204##
+ mcset $l "Save configuration" \
+ "保存配置"
+ ##ID:002205##
+ mcset $l "Save configuration into a file" \
+ "保存配置到一个文件中"
+ ##ID:002206##
+ mcset $l "Load configuration" \
+ "导入配置"
+ ##ID:002207##
+ mcset $l "Load configuration from a file" \
+ "从一个文件中导入配置"
+ ##ID:002208##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002209##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002210##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002211##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002212##
+ mcset $l "Configure" \
+ "配置"
+ ##ID:002213##
+ mcset $l "LED matrix" \
+ "矩阵LED"
+ ##ID:002214##
+ mcset $l "This tool consists of 64 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Condition on which a LED lights up and LED colors are configurable. Also fade out interval is configurable.\n\n" \
+ "This tool consists of 64 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Condition on which a LED lights up and LED colors are configurable. Also fade out interval is configurable.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002215##
+ mcset $l "LED states:" \
+ "LED states:" ;# <-- NOT TRANSLATED YET
+ ##ID:002216##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002217##
+ mcset $l " Off\n " \
+ " Off\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002218##
+ mcset $l " Fast blinking\n " \
+ " Fast blinking\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002219##
+ mcset $l " Shining\n " \
+ " Shining\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002220##
+ mcset $l " Fading out" \
+ " Fading out" ;# <-- NOT TRANSLATED YET
+}
+# leddisplay.tcl
+# ==============================================================================
+namespace eval LedDisplay {
+ ##ID:002221##
+ mcset $l "Common electrode" \
+ "Common electrode" ;# <-- NOT TRANSLATED YET
+ ##ID:002222##
+ mcset $l "Common anode" \
+ "Common anode" ;# <-- NOT TRANSLATED YET
+ ##ID:002223##
+ mcset $l "Common cathode" \
+ "Common cathode" ;# <-- NOT TRANSLATED YET
+ ##ID:002224##
+ mcset $l "Color" \
+ "Color" ;# <-- NOT TRANSLATED YET
+ ##ID:002225##
+ mcset $l "Red" \
+ "Red" ;# <-- NOT TRANSLATED YET
+ ##ID:002226##
+ mcset $l "Orange" \
+ "Orange" ;# <-- NOT TRANSLATED YET
+ ##ID:002227##
+ mcset $l "Yellow" \
+ "Yellow" ;# <-- NOT TRANSLATED YET
+ ##ID:002228##
+ mcset $l "Green" \
+ "Green" ;# <-- NOT TRANSLATED YET
+ ##ID:002229##
+ mcset $l "Blue" \
+ "Blue" ;# <-- NOT TRANSLATED YET
+ ##ID:002230##
+ mcset $l "Purple" \
+ "Purple" ;# <-- NOT TRANSLATED YET
+ ##ID:002231##
+ mcset $l "Show help" \
+ "显示帮助"
+ ##ID:002232##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002233##
+ mcset $l "Save configuration" \
+ "保存配置"
+ ##ID:002234##
+ mcset $l "Save configuration into a file" \
+ "保存配置到一个文件中"
+ ##ID:002235##
+ mcset $l "Load configuration" \
+ "导入配置"
+ ##ID:002236##
+ mcset $l "Load configuration from a file" \
+ "从一个文件中导入配置"
+ ##ID:002237##
+ mcset $l "LED Display" \
+ "数码管"
+ ##ID:002238##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002239##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002240##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002241##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002242##
+ mcset $l "Configure" \
+ "配置"
+ ##ID:002243##
+ mcset $l "Virtual LED display with common anode (default) or cathode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later.\n\n" \
+ "Virtual LED display with common anode (default) or cathode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002244##
+ mcset $l "LED states:" \
+ "LED states:" ;# <-- NOT TRANSLATED YET
+ ##ID:002245##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002246##
+ mcset $l " Off\n " \
+ " Off\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002247##
+ mcset $l " Fast blinking\n " \
+ " Fast blinking\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002248##
+ mcset $l " Shining\n " \
+ " Shining\n " ;# <-- NOT TRANSLATED YET
+}
+# ledpanel.tcl
+# ==============================================================================
+namespace eval LedPanel {
+ ##ID:002249##
+ mcset $l "Color" \
+ "颜色"
+ ##ID:002250##
+ mcset $l "Red" \
+ "红色"
+ ##ID:002251##
+ mcset $l "Orange" \
+ "橙色"
+ ##ID:002252##
+ mcset $l "Yellow" \
+ "黄色"
+ ##ID:002253##
+ mcset $l "Green" \
+ "绿色"
+ ##ID:002254##
+ mcset $l "Blue" \
+ "蓝色"
+ ##ID:002255##
+ mcset $l "Purple" \
+ "紫色"
+ ##ID:002256##
+ mcset $l "Show help" \
+ "显示帮助"
+ ##ID:002257##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002258##
+ mcset $l "Save configuration" \
+ "保存配置"
+ ##ID:002259##
+ mcset $l "Save configuration into a file" \
+ "保存配置到一个文件中"
+ ##ID:002260##
+ mcset $l "Load configuration" \
+ "导入配置"
+ ##ID:002261##
+ mcset $l "Load configuration from a file" \
+ "从一个文件中导入配置"
+ ##ID:002262##
+ mcset $l "LED panel" \
+ "LED面板"
+ ##ID:002263##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002264##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002265##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002266##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002267##
+ mcset $l "Configure" \
+ "配置"
+ ##ID:002268##
+ mcset $l "This tool consists of 8 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. LED colors are configurable.\n\n" \
+ "This tool consists of 8 LED's. Each of them can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. LED colors are configurable.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002269##
+ mcset $l "LED states:" \
+ "LED 状态:"
+ ##ID:002270##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002271##
+ mcset $l " Off\n " \
+ " 关闭\n "
+ ##ID:002272##
+ mcset $l " Fast blinking\n " \
+ " 快速闪烁\n "
+ ##ID:002273##
+ mcset $l " Shining" \
+ " Shining" ;# <-- NOT TRANSLATED YET
+}
+# matrixkeypad.tcl
+# ==============================================================================
+namespace eval MatrixKeyPad {
+ ##ID:002274##
+ mcset $l "Radio buttons" \
+ "单选按钮"
+ ##ID:002275##
+ mcset $l "Show help" \
+ "显示帮助"
+ ##ID:002276##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002277##
+ mcset $l "Save configuration" \
+ "保存配置"
+ ##ID:002278##
+ mcset $l "Save configuration into a file" \
+ "保存配置到一个文件中"
+ ##ID:002279##
+ mcset $l "Load configuration" \
+ "导入配置"
+ ##ID:002280##
+ mcset $l "Load configuration from a file" \
+ "从一个文件中导入配置"
+ ##ID:002281##
+ mcset $l "Matrix Keypad" \
+ "矩阵按键"
+ ##ID:002282##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002283##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002284##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002285##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation 开/关"
+ ##ID:002286##
+ mcset $l "Configure" \
+ "配置"
+ ##ID:002287##
+ mcset $l "This tool consists of 16 switches connected in matrix. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n" \
+ "This tool consists of 16 switches connected in matrix. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002288##
+ mcset $l "Keypad can be configured in two ways:" \
+ "Keypad can be configured in two ways:" ;# <-- NOT TRANSLATED YET
+ ##ID:002289##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002290##
+ mcset $l "1)" \
+ "1)" ;# <-- NOT TRANSLATED YET
+ ##ID:002291##
+ mcset $l " To allow key combinations\n Menu -> Check \"Radio buttons\"\n " \
+ " To allow key combinations\n Menu -> Check \"Radio buttons\"\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002292##
+ mcset $l "2)" \
+ "2)" ;# <-- NOT TRANSLATED YET
+ ##ID:002293##
+ mcset $l " To do not allow key combinations\n Menu -> Uncheck \"Radio buttons\"" \
+ " To do not allow key combinations\n Menu -> Uncheck \"Radio buttons\"" ;# <-- NOT TRANSLATED YET
+}
+# simplekeypad.tcl
+# ==============================================================================
+namespace eval SimpleKeyPad {
+ ##ID:002294##
+ mcset $l "Simple Keypad" \
+ "简单按键"
+ ##ID:002295##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002296##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002297##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002298##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation 开/关"
+ ##ID:002299##
+ mcset $l "Configure" \
+ "配置"
+ ##ID:002300##
+ mcset $l "Radio buttons" \
+ "单选按钮"
+ ##ID:002301##
+ mcset $l "Show help" \
+ "显示帮助"
+ ##ID:002302##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002303##
+ mcset $l "Save configuration" \
+ "保存配置"
+ ##ID:002304##
+ mcset $l "Save configuration into a file" \
+ "保存配置到一个文件中"
+ ##ID:002305##
+ mcset $l "Load configuration" \
+ "导入配置"
+ ##ID:002306##
+ mcset $l "Load configuration from a file" \
+ "从一个文件中导入配置"
+ ##ID:002307##
+ mcset $l "This tool consists of 8 switches. Each of them can connect any port pin of the simulated uC to ground. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n" \
+ "This tool consists of 8 switches. Each of them can connect any port pin of the simulated uC to ground. Connections with the uC are made with ComboBoxes on the bottom of the panel. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. Wire colors are identical to colors used in graph representing IO ports.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002308##
+ mcset $l "Keypad can be configured in two ways:" \
+ "Keypad can be configured in two ways:" ;# <-- NOT TRANSLATED YET
+ ##ID:002309##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002310##
+ mcset $l "1)" \
+ "1)" ;# <-- NOT TRANSLATED YET
+ ##ID:002311##
+ mcset $l " To allow key combinations\n Menu -> Check \"Radio buttons\"\n " \
+ " To allow key combinations\n Menu -> Check \"Radio buttons\"\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002312##
+ mcset $l "2)" \
+ "2)" ;# <-- NOT TRANSLATED YET
+ ##ID:002313##
+ mcset $l " To do not allow key combinations\n Menu -> Uncheck \"Radio buttons\"" \
+ " To do not allow key combinations\n Menu -> Uncheck \"Radio buttons\"" ;# <-- NOT TRANSLATED YET
+}
+# multiplexedleddisplay.tcl
+# ==============================================================================
+namespace eval MultiplexedLedDisplay {
+ ##ID:002314##
+ mcset $l "Common electrode" \
+ "Common electrode" ;# <-- NOT TRANSLATED YET
+ ##ID:002315##
+ mcset $l "Common anode" \
+ "Common anode" ;# <-- NOT TRANSLATED YET
+ ##ID:002316##
+ mcset $l "Common cathode" \
+ "Common cathode" ;# <-- NOT TRANSLATED YET
+ ##ID:002317##
+ mcset $l "Fade out interval" \
+ "Fade out interval" ;# <-- NOT TRANSLATED YET
+ ##ID:002318##
+ mcset $l "Set LED dim interval to 0 instruction cycles" \
+ "Set LED dim interval to 0 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002319##
+ mcset $l "Set LED dim interval to 5 instruction cycles" \
+ "Set LED dim interval to 5 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002320##
+ mcset $l "Set LED dim interval to 10 instruction cycles" \
+ "Set LED dim interval to 10 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002321##
+ mcset $l "Set LED dim interval to 20 instruction cycles" \
+ "Set LED dim interval to 20 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002322##
+ mcset $l "Set LED dim interval to 50 instruction cycles" \
+ "Set LED dim interval to 50 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002323##
+ mcset $l "Set LED dim interval to 100 instruction cycles" \
+ "Set LED dim interval to 100 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002324##
+ mcset $l "Set LED dim interval to 200 instruction cycles" \
+ "Set LED dim interval to 200 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002325##
+ mcset $l "Set LED dim interval to 500 instruction cycles" \
+ "Set LED dim interval to 500 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002326##
+ mcset $l "Set LED dim interval to 1000 instruction cycles" \
+ "Set LED dim interval to 1000 instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002327##
+ mcset $l "All fade out" \
+ "All fade out" ;# <-- NOT TRANSLATED YET
+ ##ID:002328##
+ mcset $l "Dim all LEDs" \
+ "Dim all LEDs" ;# <-- NOT TRANSLATED YET
+ ##ID:002329##
+ mcset $l "Color" \
+ "Color" ;# <-- NOT TRANSLATED YET
+ ##ID:002330##
+ mcset $l "Red" \
+ "Red" ;# <-- NOT TRANSLATED YET
+ ##ID:002331##
+ mcset $l "Orange" \
+ "Orange" ;# <-- NOT TRANSLATED YET
+ ##ID:002332##
+ mcset $l "Yellow" \
+ "Yellow" ;# <-- NOT TRANSLATED YET
+ ##ID:002333##
+ mcset $l "Green" \
+ "Green" ;# <-- NOT TRANSLATED YET
+ ##ID:002334##
+ mcset $l "Blue" \
+ "Blue" ;# <-- NOT TRANSLATED YET
+ ##ID:002335##
+ mcset $l "Purple" \
+ "Purple" ;# <-- NOT TRANSLATED YET
+ ##ID:002336##
+ mcset $l "Show help" \
+ "显示帮助"
+ ##ID:002337##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:002338##
+ mcset $l "Save configuration" \
+ "保存配置"
+ ##ID:002339##
+ mcset $l "Save configuration into a file" \
+ "保存配置到一个文件中"
+ ##ID:002340##
+ mcset $l "Load configuration" \
+ "导入配置"
+ ##ID:002341##
+ mcset $l "Load configuration from a file" \
+ "从一个文件中导入配置"
+ ##ID:002342##
+ mcset $l "Multiplexed LED display" \
+ "复用数码管"
+ ##ID:002343##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:002344##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:002345##
+ mcset $l "Note" \
+ "Note" ;# <-- NOT TRANSLATED YET
+ ##ID:002346##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002347##
+ mcset $l "Configure" \
+ "配置"
+ ##ID:002348##
+ mcset $l "Virtual Multiplexed LED Display with common anode (default) or cathode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. LED fade out interval and LED colors are configurable.\n\n" \
+ "Virtual Multiplexed LED Display with common anode (default) or cathode. Each segment can be connected to any port pin of the simulated uC. Connections with the uC are made with ComboBoxes. Panel configuration can be saved to a file with extension vhc, and can be loaded from that file later. LED fade out interval and LED colors are configurable.\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002349##
+ mcset $l "LED states:" \
+ "LED states:" ;# <-- NOT TRANSLATED YET
+ ##ID:002350##
+ mcset $l "\n " \
+ "\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002351##
+ mcset $l " Off\n " \
+ " Off\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002352##
+ mcset $l " Fast blinking\n " \
+ " Fast blinking\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002353##
+ mcset $l " Shining\n " \
+ " Shining\n " ;# <-- NOT TRANSLATED YET
+ ##ID:002354##
+ mcset $l " Fading out\n " \
+ " Fading out\n " ;# <-- NOT TRANSLATED YET
+}
+# virtual_hw_component.tcl
+# ==============================================================================
+namespace eval VirtualHWComponent {
+ ##ID:002355##
+ mcset $l "Component modified" \
+ "Component modified" ;# <-- NOT TRANSLATED YET
+ ##ID:002356##
+ mcset $l "Do you want to save the configuration of this panel before closing?" \
+ "Do you want to save the configuration of this panel before closing?" ;# <-- NOT TRANSLATED YET
+ ##ID:002357##
+ mcset $l "Save configuration" \
+ "保存配置"
+ ##ID:002358##
+ mcset $l "Load configuration" \
+ "载入配置"
+ ##ID:002359##
+ mcset $l "Overwrite file" \
+ "覆盖文件"
+ ##ID:002360##
+ mcset $l "A file with name '%s' already exists. Do you want to overwrite it ?" \
+ "A file with name '%s' already exists. Do you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002361##
+ mcset $l "IO Error" \
+ "IO Error" ;# <-- NOT TRANSLATED YET
+ ##ID:002362##
+ mcset $l "Unable to write to file:\n\"%s\"" \
+ "无法写入文件:\n\"%s\""
+ ##ID:002363##
+ mcset $l "Unable to read file:\n\"%s\"" \
+ "无法读取文件:\n\"%s\""
+ ##ID:002364##
+ mcset $l "Unable to read configuration from file:\n\"%s\"" \
+ "无法读取配置文件:\n\"%s\""
+ ##ID:002365##
+ mcset $l "File corrupted" \
+ "文件损坏"
+ ##ID:002366##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:002367##
+ mcset $l "Wire colors:" \
+ "Wire colors:" ;# <-- NOT TRANSLATED YET
+ ##ID:002368##
+ mcset $l "ON" \
+ "ON" ;# <-- NOT TRANSLATED YET
+ ##ID:002369##
+ mcset $l "OFF" \
+ "OFF" ;# <-- NOT TRANSLATED YET
+ ##ID:002370##
+ mcset $l "VH component" \
+ "VH component" ;# <-- NOT TRANSLATED YET
+}
+# hwmanager.tcl
+# ==============================================================================
+namespace eval HwManager {
+ ##ID:002371##
+ mcset $l "HW:" \
+ "HW:" ;# <-- NOT TRANSLATED YET
+ ##ID:002372##
+ mcset $l "available/installed plugins" \
+ "使用/安装的插件"
+ ##ID:002373##
+ mcset $l "List available or installed HW plugins" \
+ "列出可用的硬件或安装插件"
+ ##ID:002374##
+ mcset $l "Refresh list available or installed HW plugins" \
+ "刷新列表或安装硬件插件"
+ ##ID:002375##
+ mcset $l "Refresh" \
+ "刷新"
+ ##ID:002376##
+ mcset $l "Too old version" \
+ "太旧的版本"
+ ##ID:002377##
+ mcset $l "Plugin %s requires MCU 8051 IDE version %s and above, please upgrade your MCU 8051 IDE" \
+ "刷新Plugin %s requires MCU 8051 IDE version %s and above, please upgrade your MCU 8051 IDE刷新"
+ ##ID:002378##
+ mcset $l "PLUGIN ERROR" \
+ "插件错误"
+ ##ID:002379##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:002380##
+ mcset $l "Plugin name:\t%s\n" \
+ "插件名称:\t%s\n"
+ ##ID:002381##
+ mcset $l "Plugin version:\t%s\n" \
+ "插件版本:\t%s\n"
+ ##ID:002382##
+ mcset $l "Author:\t\t%s <%s>\n" \
+ "作者:\t\t%s <%s>\n"
+ ##ID:002383##
+ mcset $l "PLUGIN ERROR - MCU 8051 IDE" \
+ "插件错误 - MCU 8051 IDE"
+ ##ID:002384##
+ mcset $l "Hardware is busy" \
+ "Hardware is busy" ;# <-- NOT TRANSLATED YET
+ ##ID:002385##
+ mcset $l "Plugin \"%s\" is busy.\nDo you really want to close the program ?" \
+ "Plugin \"%s\" is busy.\nDo you really want to close the program ?" ;# <-- NOT TRANSLATED YET
+}
+# graph.tcl
+# ==============================================================================
+namespace eval Graph {
+ ##ID:002386##
+ mcset $l "ON" \
+ "ON" ;# <-- NOT TRANSLATED YET
+ ##ID:002387##
+ mcset $l "OFF" \
+ "OFF" ;# <-- NOT TRANSLATED YET
+ ##ID:002388##
+ mcset $l "True state" \
+ "True state" ;# <-- NOT TRANSLATED YET
+ ##ID:002389##
+ mcset $l "Port latches" \
+ "Port latches" ;# <-- NOT TRANSLATED YET
+ ##ID:002390##
+ mcset $l "True output" \
+ "True output" ;# <-- NOT TRANSLATED YET
+ ##ID:002391##
+ mcset $l "Legend" \
+ "Legend" ;# <-- NOT TRANSLATED YET
+ ##ID:002392##
+ mcset $l "Turn graph on/off" \
+ "Turn graph on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:002393##
+ mcset $l "Enable/Disable graph" \
+ "Enable/Disable graph" ;# <-- NOT TRANSLATED YET
+ ##ID:002394##
+ mcset $l "Change grid" \
+ "Change grid" ;# <-- NOT TRANSLATED YET
+ ##ID:002395##
+ mcset $l "Change grid morphology" \
+ "Change grid morphology" ;# <-- NOT TRANSLATED YET
+ ##ID:002396##
+ mcset $l "Change bit length on X axis to a lower value" \
+ "Change bit length on X axis to a lower value" ;# <-- NOT TRANSLATED YET
+ ##ID:002397##
+ mcset $l "Zoom in (X axis)" \
+ "Zoom in (X axis)" ;# <-- NOT TRANSLATED YET
+ ##ID:002398##
+ mcset $l "Change bit length on X axis to a higher value" \
+ "Change bit length on X axis to a higher value" ;# <-- NOT TRANSLATED YET
+ ##ID:002399##
+ mcset $l "Zoom out (X axis)" \
+ "Zoom out (X axis)" ;# <-- NOT TRANSLATED YET
+ ##ID:002400##
+ mcset $l "Clear user marks" \
+ "Clear user marks" ;# <-- NOT TRANSLATED YET
+ ##ID:002401##
+ mcset $l "Clear marks" \
+ "Clear marks" ;# <-- NOT TRANSLATED YET
+ ##ID:002402##
+ mcset $l "-- click to close --" \
+ "-- click to close --" ;# <-- NOT TRANSLATED YET
+ ##ID:002403##
+ mcset $l "Log. 1 forced to log. 0" \
+ "Log. 1 forced to log. 0" ;# <-- NOT TRANSLATED YET
+ ##ID:002404##
+ mcset $l "Not connected" \
+ "Not connected" ;# <-- NOT TRANSLATED YET
+ ##ID:002405##
+ mcset $l "Access to external memory" \
+ "Access to external memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002406##
+ mcset $l "Indeterminable state" \
+ "Indeterminable state" ;# <-- NOT TRANSLATED YET
+ ##ID:002407##
+ mcset $l "No voltage" \
+ "No voltage" ;# <-- NOT TRANSLATED YET
+ ##ID:002408##
+ mcset $l "Log. 1" \
+ "Log. 1" ;# <-- NOT TRANSLATED YET
+ ##ID:002409##
+ mcset $l "Log. 0" \
+ "Log. 0" ;# <-- NOT TRANSLATED YET
+}
+# graphwidget.tcl
+# ==============================================================================
+namespace eval GraphWidget {
+ ##ID:002410##
+ mcset $l "ON/OFF" \
+ "ON/OFF" ;# <-- NOT TRANSLATED YET
+ ##ID:002411##
+ mcset $l "Enable/Disable graph" \
+ "Enable/Disable graph" ;# <-- NOT TRANSLATED YET
+ ##ID:002412##
+ mcset $l "Change grid" \
+ "Change grid" ;# <-- NOT TRANSLATED YET
+ ##ID:002413##
+ mcset $l "Change grid morphology" \
+ "Change grid morphology" ;# <-- NOT TRANSLATED YET
+ ##ID:002414##
+ mcset $l "Zoom in" \
+ "Zoom in" ;# <-- NOT TRANSLATED YET
+ ##ID:002415##
+ mcset $l "Change bit length on X axis to a lower value" \
+ "Change bit length on X axis to a lower value" ;# <-- NOT TRANSLATED YET
+ ##ID:002416##
+ mcset $l "Zoom out" \
+ "Zoom out" ;# <-- NOT TRANSLATED YET
+ ##ID:002417##
+ mcset $l "Change bit length on X axis to a higher value" \
+ "Change bit length on X axis to a higher value" ;# <-- NOT TRANSLATED YET
+ ##ID:002418##
+ mcset $l "Remove marks" \
+ "Remove marks" ;# <-- NOT TRANSLATED YET
+ ##ID:002419##
+ mcset $l "Clear user marks" \
+ "Clear user marks" ;# <-- NOT TRANSLATED YET
+ ##ID:002420##
+ mcset $l "Performance warning" \
+ "Performance warning" ;# <-- NOT TRANSLATED YET
+ ##ID:002421##
+ mcset $l "You have just enabled simulation of external devices. Having this feature enabled causes serious reduction of simulator performance, the number of instructions executed per second in real time usually decreases by a factor of hundreds, maybe even thousands." \
+ "You have just enabled simulation of external devices. Having this feature enabled causes serious reduction of simulator performance, the number of instructions executed per second in real time usually decreases by a factor of hundreds, maybe even thousands." ;# <-- NOT TRANSLATED YET
+ ##ID:004480##
+ mcset $l "Do not display again" \
+ "Do not display again" ;# <-- NOT TRANSLATED YET
+}
+# hexeditdlg.tcl
+# ==============================================================================
+namespace eval HexEditDlg {
+ ##ID:002422##
+ mcset $l "LJMP this_address" \
+ "LJMP this_address" ;# <-- NOT TRANSLATED YET
+ ##ID:002423##
+ mcset $l "LCALL this_address" \
+ "LCALL this_address" ;# <-- NOT TRANSLATED YET
+ ##ID:002424##
+ mcset $l "Code memory" \
+ "Code memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002425##
+ mcset $l "Expanded RAM" \
+ "Expanded RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:002426##
+ mcset $l "Data EEPROM" \
+ "Data EEPROM" ;# <-- NOT TRANSLATED YET
+ ##ID:002427##
+ mcset $l "XDATA memory" \
+ "XDATA memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002428##
+ mcset $l "untitled" \
+ "untitled" ;# <-- NOT TRANSLATED YET
+ ##ID:002429##
+ mcset $l "Hexadecimal editor" \
+ "Hexadecimal editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002430##
+ mcset $l "Load IHEX8 file" \
+ "Load IHEX8 file" ;# <-- NOT TRANSLATED YET
+ ##ID:002431##
+ mcset $l "Open file" \
+ "打开文件"
+ ##ID:002432##
+ mcset $l "Save current data to IHEX8 file" \
+ "Save current data to IHEX8 file" ;# <-- NOT TRANSLATED YET
+ ##ID:002433##
+ mcset $l "Save file" \
+ "保存文件"
+ ##ID:002434##
+ mcset $l "Save current data to IHEX8 file under a different name" \
+ "Save current data to IHEX8 file under a different name" ;# <-- NOT TRANSLATED YET
+ ##ID:002435##
+ mcset $l "Save as" \
+ "另存为"
+ ##ID:002436##
+ mcset $l "Reload data from simulator" \
+ "Reload data from simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:002437##
+ mcset $l "Reload" \
+ "刷新"
+ ##ID:002438##
+ mcset $l "Exit editor" \
+ "退出编辑"
+ ##ID:002439##
+ mcset $l "Exit" \
+ "退出"
+ ##ID:002440##
+ mcset $l "Current view mode" \
+ "Current view mode" ;# <-- NOT TRANSLATED YET
+ ##ID:002441##
+ mcset $l "View mode" \
+ "View mode" ;# <-- NOT TRANSLATED YET
+ ##ID:002442##
+ mcset $l "VALUE" \
+ "VALUE" ;# <-- NOT TRANSLATED YET
+ ##ID:002443##
+ mcset $l "ADDRESS" \
+ "ADDRESS" ;# <-- NOT TRANSLATED YET
+ ##ID:002444##
+ mcset $l "DEC: " \
+ "DEC: " ;# <-- NOT TRANSLATED YET
+ ##ID:002445##
+ mcset $l "OCT: " \
+ "OCT: " ;# <-- NOT TRANSLATED YET
+ ##ID:002446##
+ mcset $l "HEX: " \
+ "HEX: " ;# <-- NOT TRANSLATED YET
+ ##ID:002447##
+ mcset $l "BIN: " \
+ "BIN: " ;# <-- NOT TRANSLATED YET
+ ##ID:002448##
+ mcset $l "LJMP" \
+ "LJMP" ;# <-- NOT TRANSLATED YET
+ ##ID:002449##
+ mcset $l "Perform program jump" \
+ "Perform program jump" ;# <-- NOT TRANSLATED YET
+ ##ID:002450##
+ mcset $l "Program jump" \
+ "程序转跳"
+ ##ID:002451##
+ mcset $l "LCALL" \
+ "LCALL" ;# <-- NOT TRANSLATED YET
+ ##ID:002452##
+ mcset $l "Perform subprogram call" \
+ "执行子程序调用"
+ ##ID:002453##
+ mcset $l "Subprogram call" \
+ "子程序调用"
+ ##ID:002454##
+ mcset $l "Cursor:" \
+ "光标:"
+ ##ID:002455##
+ mcset $l "Address of entry under mouse cursor" \
+ "Address of entry under mouse cursor" ;# <-- NOT TRANSLATED YET
+ ##ID:002456##
+ mcset $l "Line\t%s:\tInvalid characters\n" \
+ "Line\t%s:\tInvalid characters\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002457##
+ mcset $l "Line\t%s:\tInvalid chceksum\n" \
+ "Line\t%s:\tInvalid chceksum\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002458##
+ mcset $l "Line\t%s:\tInvalid length\n" \
+ "Line\t%s:\tInvalid length\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002459##
+ mcset $l "Line\t%s:\tUnknown record type: '%s'\n" \
+ "Line\t%s:\tUnknown record type: '%s'\n" ;# <-- NOT TRANSLATED YET
+ ##ID:002460##
+ mcset $l "Line\t%s:\tMissing EOF" \
+ "Line\t%s:\tMissing EOF" ;# <-- NOT TRANSLATED YET
+ ##ID:002461##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:002462##
+ mcset $l "Error(s) occurred while parsing IHEX file" \
+ "Error(s) occurred while parsing IHEX file" ;# <-- NOT TRANSLATED YET
+ ##ID:002463##
+ mcset $l "File modified" \
+ "File modified" ;# <-- NOT TRANSLATED YET
+ ##ID:002464##
+ mcset $l "File %s has been modifed.\nDo you want to save it ?" \
+ "File %s has been modifed.\nDo you want to save it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:004536##
+ mcset $l "Content of the hex editor has been changed.\nDo you really want to reload without saving it?" \
+ "Content of the hex editor has been changed.\nDo you really want to reload without saving it?" ;# <-- NOT TRANSLATED YET
+ ##ID:002465##
+ mcset $l "Save file - MCU 8051 IDE" \
+ "保存文件 - MCU 8051 IDE"
+ ##ID:002466##
+ mcset $l "Open file - MCU 8051 IDE" \
+ "打开文件 - MCU 8051 IDE"
+ ##ID:002467##
+ mcset $l "Permission denied" \
+ "没有权限"
+ ##ID:002468##
+ mcset $l "Unable to open file:\n%s" \
+ "无法打开文件:\n%s"
+ ##ID:002469##
+ mcset $l "Unable to access file: %s" \
+ "无法访问文件: %s"
+ ##ID:002470##
+ mcset $l "Overwrite file" \
+ "覆盖文件"
+ ##ID:002471##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "A file name '%s' already exists. Are you sure you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002472##
+ mcset $l "Saving file" \
+ "正在保存文件"
+ ##ID:002473##
+ mcset $l "Abort" \
+ "中止"
+ ##ID:002474##
+ mcset $l "File %s saved" \
+ "文件 %s 已经保存"
+ ##ID:002475##
+ mcset $l "Load IHEX8 file into editor and simulator XDATA memory" \
+ "Load IHEX8 file into editor and simulator XDATA memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002476##
+ mcset $l "Save current content of XDATA memory to IHEX8 file" \
+ "Save current content of XDATA memory to IHEX8 file" ;# <-- NOT TRANSLATED YET
+ ##ID:002477##
+ mcset $l "Save current document under a different name" \
+ "Save current document under a different name" ;# <-- NOT TRANSLATED YET
+ ##ID:002478##
+ mcset $l "Reload data from simulator XDATA memory" \
+ "Reload data from simulator XDATA memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002479##
+ mcset $l "Copy selected text to clipboard" \
+ "复制选定的文本到剪贴板"
+ ##ID:002480##
+ mcset $l "Paste clipboard contents" \
+ "粘贴剪贴板内容"
+ ##ID:002481##
+ mcset $l "Invoke dialog for searching strings in the text" \
+ "Invoke dialog for searching strings in the text" ;# <-- NOT TRANSLATED YET
+ ##ID:002482##
+ mcset $l "Find next occurrence of the search string" \
+ "Find next occurrence of the search string" ;# <-- NOT TRANSLATED YET
+ ##ID:002483##
+ mcset $l "Find previous occurrence of the search string" \
+ "Find previous occurrence of the search string" ;# <-- NOT TRANSLATED YET
+ ##ID:002484##
+ mcset $l "Switch view mode to hexadecimal" \
+ "Switch view mode to hexadecimal" ;# <-- NOT TRANSLATED YET
+ ##ID:002485##
+ mcset $l "Switch view mode to decimal" \
+ "Switch view mode to decimal" ;# <-- NOT TRANSLATED YET
+ ##ID:002486##
+ mcset $l "Switch view mode to octal" \
+ "Switch view mode to octal" ;# <-- NOT TRANSLATED YET
+ ##ID:002487##
+ mcset $l "Save current content of program (CODE) memory to IHEX8 file" \
+ "Save current content of program (CODE) memory to IHEX8 file" ;# <-- NOT TRANSLATED YET
+ ##ID:002488##
+ mcset $l "Save" \
+ "保存"
+ ##ID:002489##
+ mcset $l "Open ADF" \
+ "打开ADF"
+ ##ID:002490##
+ mcset $l "Open IHEX8" \
+ "打开IHEX8"
+ ##ID:002491##
+ mcset $l "Copy" \
+ "复制"
+ ##ID:002492##
+ mcset $l "Paste" \
+ "粘帖"
+ ##ID:002493##
+ mcset $l "Find" \
+ "查找"
+ ##ID:002494##
+ mcset $l "Find next" \
+ "查找下一个"
+ ##ID:002495##
+ mcset $l "Find previous" \
+ "查找上一个"
+ ##ID:002496##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:002497##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:002498##
+ mcset $l "OCT" \
+ "OCT" ;# <-- NOT TRANSLATED YET
+ ##ID:002499##
+ mcset $l "File" \
+ "文件"
+ ##ID:002500##
+ mcset $l "Edit" \
+ "编辑"
+ ##ID:002501##
+ mcset $l "Mode" \
+ "模式"
+ ##ID:002502##
+ mcset $l "Intel 8 HEX" \
+ "Intel 8 HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:002503##
+ mcset $l "Simulator file" \
+ "模拟器文件"
+}
+# todo.tcl
+# ==============================================================================
+namespace eval Todo {
+ ##ID:002504##
+ mcset $l "Undo" \
+ "撤消"
+ ##ID:002505##
+ mcset $l "Undo last operation" \
+ "撤消最后一次操作"
+ ##ID:002506##
+ mcset $l "Redo" \
+ "取消撤销"
+ ##ID:002507##
+ mcset $l "Take back last undo operation" \
+ "重做上次撤销的操作."
+ ##ID:002508##
+ mcset $l "Cut" \
+ "剪切"
+ ##ID:002509##
+ mcset $l "Copy" \
+ "复制"
+ ##ID:002510##
+ mcset $l "Paste" \
+ "粘帖"
+ ##ID:002511##
+ mcset $l "Clear" \
+ "清除"
+ ##ID:002512##
+ mcset $l "Select all" \
+ "选择所有"
+ ##ID:002513##
+ mcset $l "Find" \
+ "查找"
+ ##ID:002514##
+ mcset $l "Find next" \
+ "查找下一个"
+ ##ID:002515##
+ mcset $l "Find previous" \
+ "查找上一个"
+ ##ID:002516##
+ mcset $l "Bold text" \
+ "粗体"
+ ##ID:002517##
+ mcset $l "Use bold font" \
+ "使用粗体"
+ ##ID:002518##
+ mcset $l "Italic text" \
+ "斜体"
+ ##ID:002519##
+ mcset $l "Use italic font" \
+ "使用斜体"
+ ##ID:002520##
+ mcset $l "Strikethrough font" \
+ "删除线字体"
+ ##ID:002521##
+ mcset $l "Strikethrough text" \
+ "删除线文本"
+ ##ID:002522##
+ mcset $l "Use strikethrough font" \
+ "使用删除线字体"
+ ##ID:002523##
+ mcset $l "Underline text" \
+ "下划线字体"
+ ##ID:002524##
+ mcset $l "Use underline font" \
+ "使用下划线字体"
+ ##ID:002525##
+ mcset $l "Erase tags" \
+ "删除标记"
+ ##ID:002526##
+ mcset $l "Clear rich text tags" \
+ "Clear rich text tags" ;# <-- NOT TRANSLATED YET
+ ##ID:002527##
+ mcset $l "Insert OK image" \
+ "已经插入图片"
+ ##ID:002528##
+ mcset $l "Insert image \"Ok\"" \
+ "插入图片 \"Ok\""
+ ##ID:002529##
+ mcset $l "Notes for file:" \
+ "注释文件:"
+ ##ID:002530##
+ mcset $l "Find next occurrence of search string" \
+ "查找下一个出现的搜索字"
+ ##ID:002531##
+ mcset $l "Find previous occurrence of search string" \
+ "查找上一个出现的搜索字"
+ ##ID:002532##
+ mcset $l "Hide search bar" \
+ "隐藏搜索栏"
+ ##ID:002533##
+ mcset $l "Find:" \
+ "查找:"
+ ##ID:002534##
+ mcset $l "Match case" \
+ "区分大小写"
+ ##ID:002535##
+ mcset $l "Bold font" \
+ "粗体字"
+ ##ID:002536##
+ mcset $l "Striketrought font" \
+ "删除线字体"
+ ##ID:002537##
+ mcset $l "Underline font" \
+ "下划线字体"
+ ##ID:002538##
+ mcset $l "Erase text tags" \
+ "删除文本标记"
+ ##ID:002539##
+ mcset $l "Remove formatting tags within selected area" \
+ "删除所选区域内的标记"
+ ##ID:002540##
+ mcset $l "Insert \"Ok\" image at the current cursor position" \
+ "Insert \"Ok\" image at the current cursor position" ;# <-- NOT TRANSLATED YET
+}
+# subprograms.tcl
+# ==============================================================================
+namespace eval SubPrograms {
+ ##ID:002541##
+ mcset $l "Go to source line" \
+ "Go to source line" ;# <-- NOT TRANSLATED YET
+ ##ID:002542##
+ mcset $l "Navigate code editor to the line from which this subprogram was invoked" \
+ "Navigate code editor to the line from which this subprogram was invoked" ;# <-- NOT TRANSLATED YET
+ ##ID:002543##
+ mcset $l "Go to target line" \
+ "Go to target line" ;# <-- NOT TRANSLATED YET
+ ##ID:002544##
+ mcset $l "Navigate code editor to the line from where this subprogram resides" \
+ "Navigate code editor to the line from where this subprogram resides" ;# <-- NOT TRANSLATED YET
+ ##ID:002545##
+ mcset $l "Copy source address to clipboard" \
+ "Copy source address to clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:002546##
+ mcset $l "Copy return address to clipboard (hexadecimal representation)" \
+ "Copy return address to clipboard (hexadecimal representation)" ;# <-- NOT TRANSLATED YET
+ ##ID:002547##
+ mcset $l "Copy target address to clipboard" \
+ "Copy target address to clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:002548##
+ mcset $l "Copy address where this subprogram begins to the clipboard" \
+ "Copy address where this subprogram begins to the clipboard" ;# <-- NOT TRANSLATED YET
+ ##ID:002549##
+ mcset $l "Remove this" \
+ "Remove this" ;# <-- NOT TRANSLATED YET
+ ##ID:002550##
+ mcset $l "Remove this entry" \
+ "Remove this entry" ;# <-- NOT TRANSLATED YET
+ ##ID:002551##
+ mcset $l "Enable" \
+ "Enable" ;# <-- NOT TRANSLATED YET
+ ##ID:002552##
+ mcset $l "Include interrupts" \
+ "Include interrupts" ;# <-- NOT TRANSLATED YET
+ ##ID:002553##
+ mcset $l "RETURN" \
+ "RETURN" ;# <-- NOT TRANSLATED YET
+ ##ID:002554##
+ mcset $l "Clear" \
+ "清除"
+ ##ID:002555##
+ mcset $l "Save" \
+ "保存"
+ ##ID:002556##
+ mcset $l "TOTAL: " \
+ "TOTAL: " ;# <-- NOT TRANSLATED YET
+ ##ID:002557##
+ mcset $l "Line not found" \
+ "Line not found" ;# <-- NOT TRANSLATED YET
+ ##ID:002558##
+ mcset $l "There is no matching line in the source code" \
+ "There is no matching line in the source code" ;# <-- NOT TRANSLATED YET
+ ##ID:002559##
+ mcset $l " Return address:\t" \
+ " Return address:\t" ;# <-- NOT TRANSLATED YET
+ ##ID:002560##
+ mcset $l "Save file - MCU 8051 IDE" \
+ "保存文件 - MCU 8051 IDE"
+ ##ID:002561##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "A file name '%s' already exists. Are you sure you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002562##
+ mcset $l "Overwrite file" \
+ "覆盖文件"
+ ##ID:002563##
+ mcset $l "Unable to write to file:\n\"%s\"" \
+ "无法写入文件:\n\"%s\""
+ ##ID:002564##
+ mcset $l "Permission denied" \
+ "没有权限"
+ ##ID:002565##
+ mcset $l "Plain text" \
+ "纯文本"
+}
+# stopwatch.tcl
+# ==============================================================================
+namespace eval Stopwatch {
+ ##ID:002566##
+ mcset $l "Micro seconds" \
+ "Micro seconds" ;# <-- NOT TRANSLATED YET
+ ##ID:002567##
+ mcset $l "Clock cycles" \
+ "Clock cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002568##
+ mcset $l "Instruction cycles" \
+ "Instruction cycles" ;# <-- NOT TRANSLATED YET
+ ##ID:002569##
+ mcset $l "Instructions passed" \
+ "Instructions passed" ;# <-- NOT TRANSLATED YET
+ ##ID:002570##
+ mcset $l "Program bytes" \
+ "Program bytes" ;# <-- NOT TRANSLATED YET
+ ##ID:002571##
+ mcset $l "Interrupts" \
+ "Interrupts" ;# <-- NOT TRANSLATED YET
+ ##ID:002572##
+ mcset $l "Subprogram calls" \
+ "Subprogram calls" ;# <-- NOT TRANSLATED YET
+ ##ID:002573##
+ mcset $l "RET" \
+ "RET" ;# <-- NOT TRANSLATED YET
+ ##ID:002574##
+ mcset $l "RETI" \
+ "RETI" ;# <-- NOT TRANSLATED YET
+ ##ID:002575##
+ mcset $l "Breakpoints" \
+ "Breakpoints" ;# <-- NOT TRANSLATED YET
+ ##ID:002576##
+ mcset $l "Stopwatch" \
+ "Stopwatch" ;# <-- NOT TRANSLATED YET
+ ##ID:002577##
+ mcset $l "Stop" \
+ "停止"
+ ##ID:002578##
+ mcset $l "Start" \
+ "开始"
+ ##ID:002579##
+ mcset $l "Save as plain text" \
+ "Save as plain text" ;# <-- NOT TRANSLATED YET
+ ##ID:002580##
+ mcset $l "Save as XHTML" \
+ "另存为XHTML"
+ ##ID:002581##
+ mcset $l "Close window" \
+ "Close window" ;# <-- NOT TRANSLATED YET
+ ##ID:002582##
+ mcset $l "Current" \
+ "Current" ;# <-- NOT TRANSLATED YET
+ ##ID:002583##
+ mcset $l "Project:" \
+ "Project:" ;# <-- NOT TRANSLATED YET
+ ##ID:002584##
+ mcset $l "Date:" \
+ "Date:" ;# <-- NOT TRANSLATED YET
+ ##ID:002585##
+ mcset $l "Generated by %s" \
+ "Generated by %s" ;# <-- NOT TRANSLATED YET
+ ##ID:002586##
+ mcset $l "Clear all" \
+ "清除所有"
+ ##ID:002587##
+ mcset $l "Stop after" \
+ "Stop after" ;# <-- NOT TRANSLATED YET
+ ##ID:002588##
+ mcset $l "Overall" \
+ "Overall" ;# <-- NOT TRANSLATED YET
+ ##ID:002589##
+ mcset $l "Clear entrybox" \
+ "Clear entrybox" ;# <-- NOT TRANSLATED YET
+ ##ID:002590##
+ mcset $l "Clear" \
+ "清除"
+ ##ID:002591##
+ mcset $l "Stop simulation" \
+ "Stop simulation" ;# <-- NOT TRANSLATED YET
+ ##ID:002592##
+ mcset $l "Save stopwatch state - MCU 8051 IDE" \
+ "Save stopwatch state - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002593##
+ mcset $l "Overwrite file" \
+ "覆盖文件"
+ ##ID:002594##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "A file name '%s' already exists. Are you sure you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002595##
+ mcset $l "Permission denied" \
+ "没有权限"
+ ##ID:002596##
+ mcset $l "Unable to open file:\n'%s'" \
+ "无法打开文件:\n'%s'"
+}
+# simulator_engine.tcl
+# ==============================================================================
+namespace eval Simulator_ENGINE {
+ ##ID:002597##
+ mcset $l "Interrupt at vector 0x%s " \
+ "Interrupt at vector 0x%s " ;# <-- NOT TRANSLATED YET
+ ##ID:002598##
+ mcset $l "No instruction found at 0x%s" \
+ "No instruction found at 0x%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002599##
+ mcset $l "Breakpoint reached at 0x%s" \
+ "Breakpoint reached at 0x%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002600##
+ mcset $l "Out of memory" \
+ "Out of memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002601##
+ mcset $l "%s has not enough program memory to load this program. Simulator will work but the loaded code is incomplete" \
+ "%s has not enough program memory to load this program. Simulator will work but the loaded code is incomplete" ;# <-- NOT TRANSLATED YET
+ ##ID:002602##
+ mcset $l "Interrupt PC: 0x%s; line: %s; vector 0x%s " \
+ "Interrupt PC: 0x%s; line: %s; vector 0x%s " ;# <-- NOT TRANSLATED YET
+ ##ID:002603##
+ mcset $l "Incomplete instruction OP code at 0x%s" \
+ "Incomplete instruction OP code at 0x%s" ;# <-- NOT TRANSLATED YET
+}
+# maintab.tcl
+# ==============================================================================
+namespace eval MainTab {
+ ##ID:002604##
+ mcset $l "FATAL ERROR" \
+ "致命错误"
+ ##ID:002605##
+ mcset $l "MCUs database file is corrupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE." \
+ "MCUs database file is corrupted,\nthis program cannot run without it.\nPlease reinstall MCU 8051 IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:002606##
+ mcset $l "IO Error" \
+ "IO Error" ;# <-- NOT TRANSLATED YET
+ ##ID:002607##
+ mcset $l "Unable to open VHW file:\n\"%s\"" \
+ "无法打开VHW文件:\n\"%s\""
+ ##ID:002867##
+ mcset $l "Opening project files" \
+ "正在打开项目文件"
+ ##ID:002868##
+ mcset $l "Abort" \
+ "中止"
+ ##ID:004495##
+ mcset $l "Initializing ..." \
+ "Initializing ..." ;# <-- NOT TRANSLATED YET
+ ##ID:004496##
+ mcset $l "Finishing ..." \
+ "Finishing ..." ;# <-- NOT TRANSLATED YET
+}
+# selectmcu.tcl
+# ==============================================================================
+namespace eval SelectMCU {
+ ##ID:002608##
+ mcset $l "Choose MCU - MCU 8051 IDE" \
+ "选择 MCU - MCU 8051 IDE"
+ ##ID:002609##
+ mcset $l "Clear search bar" \
+ "清除搜索栏"
+ ##ID:002610##
+ mcset $l "Search bar, enter something like \"C4051\"" \
+ "Search bar, enter something like \"C4051\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002611##
+ mcset $l "Processor Type\t\tCODE/PMEM IDATA/IRAM GPIO Frequency" \
+ "Processor Type\t\tCODE/PMEM IDATA/IRAM GPIO Frequency" ;# <-- NOT TRANSLATED YET
+ ##ID:002612##
+ mcset $l "Search:" \
+ "搜索:"
+ ##ID:002613##
+ mcset $l " Vendor:" \
+ " Vendor:" ;# <-- NOT TRANSLATED YET
+ ##ID:002614##
+ mcset $l "all" \
+ "全部"
+ ##ID:002615##
+ mcset $l "One of available packages for selected microcontroller" \
+ "One of available packages for selected microcontroller" ;# <-- NOT TRANSLATED YET
+ ##ID:002616##
+ mcset $l {Vendor:} \
+ {Vendor:} ;# <-- NOT TRANSLATED YET
+ ##ID:002617##
+ mcset $l {UART:} \
+ {UART:} ;# <-- NOT TRANSLATED YET
+ ##ID:002618##
+ mcset $l {Operating voltage:} \
+ {Operating voltage:} ;# <-- NOT TRANSLATED YET
+ ##ID:002619##
+ mcset $l {Interrupt sources:} \
+ {Interrupt sources:} ;# <-- NOT TRANSLATED YET
+ ##ID:002620##
+ mcset $l {Timers:} \
+ {Timers:} ;# <-- NOT TRANSLATED YET
+ ##ID:002621##
+ mcset $l "External RAM (XDATA)" \
+ "External RAM (XDATA)" ;# <-- NOT TRANSLATED YET
+ ##ID:002622##
+ mcset $l "External ROM/FLASH (XCODE)" \
+ "External ROM/FLASH (XCODE)" ;# <-- NOT TRANSLATED YET
+ ##ID:002623##
+ mcset $l "NOT available" \
+ "NOT available" ;# <-- NOT TRANSLATED YET
+ ##ID:002624##
+ mcset $l "Enable" \
+ "Enable" ;# <-- NOT TRANSLATED YET
+ ##ID:002625##
+ mcset $l "Connect external data memory" \
+ "Connect external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002626##
+ mcset $l "Amount of external data memory" \
+ "Amount of external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002627##
+ mcset $l "Connect external program memory" \
+ "Connect external program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002628##
+ mcset $l "Amount of total program memory minus internal program memory" \
+ "Amount of total program memory minus internal program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002629##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:002630##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:002631##
+ mcset $l "Unable to open file containing supported MCUs,\nplease check your installation" \
+ "Unable to open file containing supported MCUs,\nplease check your installation" ;# <-- NOT TRANSLATED YET
+ ##ID:002632##
+ mcset $l "MCUs database file is corrupted ,\nplease check your installation" \
+ "MCUs database file is corrupted,\nplease check your installation" ;# <-- NOT TRANSLATED YET
+ ##ID:002633##
+ mcset $l "Error" \
+ "错误"
+ ##ID:002634##
+ mcset $l " Image not found" \
+ " Image not found" ;# <-- NOT TRANSLATED YET
+ ##ID:002635##
+ mcset $l "Loading image ..." \
+ "Loading image ..." ;# <-- NOT TRANSLATED YET
+}
+# regwatches.tcl
+# ==============================================================================
+namespace eval RegWatches {
+ ##ID:002636##
+ mcset $l "Move top" \
+ "返移动顶部"
+ ##ID:002637##
+ mcset $l "Move this register watch to the top of list" \
+ "移动该寄存器到列表的顶部"
+ ##ID:002638##
+ mcset $l "Move up" \
+ "向上移动"
+ ##ID:002639##
+ mcset $l "Move this register watch up" \
+ "向上移动该寄存器"
+ ##ID:002640##
+ mcset $l "Move down" \
+ "向下移动"
+ ##ID:002641##
+ mcset $l "Move this register watch down" \
+ "向下移动该寄存器"
+ ##ID:002642##
+ mcset $l "Move bottom" \
+ "移动底部"
+ ##ID:002643##
+ mcset $l "Move this register watch to the bottom of list" \
+ "动该寄存器到列表的底部"
+ ##ID:002644##
+ mcset $l "Remove" \
+ "删除"
+ ##ID:002645##
+ mcset $l "Remove this register watch from the list" \
+ "从列表删中除该寄存器"
+ ##ID:002646##
+ mcset $l "Remove all" \
+ "删除所有"
+ ##ID:002647##
+ mcset $l "Clear the list of register watches" \
+ "清除列表中的所有寄存器"
+ ##ID:002648##
+ mcset $l "Save" \
+ "保存"
+ ##ID:002649##
+ mcset $l "Save this list to a file" \
+ "保存这个列表到一个文件"
+ ##ID:002650##
+ mcset $l "Configure" \
+ "配置"
+ ##ID:002651##
+ mcset $l "Configure this panel" \
+ "配置这个面板"
+ ##ID:002652##
+ mcset $l "Sort by" \
+ "按"
+ ##ID:002653##
+ mcset $l "Name" \
+ "名称"
+ ##ID:002654##
+ mcset $l "Address" \
+ "地址"
+ ##ID:002655##
+ mcset $l "Type" \
+ "类型"
+ ##ID:002656##
+ mcset $l "Incremental" \
+ "增量"
+ ##ID:002657##
+ mcset $l "Decremental" \
+ "递减"
+ ##ID:002658##
+ mcset $l "Autoload from code listing" \
+ "自动加载代码列表"
+ ##ID:002659##
+ mcset $l "Clear on auto-load" \
+ "清除自动加载"
+ ##ID:002660##
+ mcset $l "Save under a different file name" \
+ "除根据不同的文件名保存"
+ ##ID:002661##
+ mcset $l "Open *.wtc file" \
+ "打开*.wtc文件"
+ ##ID:002662##
+ mcset $l "Import list of registers from code listing or WTC file" \
+ "Import list of registers from code listing or WTC file" ;# <-- NOT TRANSLATED YET
+ ##ID:002663##
+ mcset $l "Import list of registers from *.lst or *.wtc file" \
+ "Import list of registers from *.lst or *.wtc file" ;# <-- NOT TRANSLATED YET
+ ##ID:002664##
+ mcset $l "Enter your search string here" \
+ "Enter your search string here" ;# <-- NOT TRANSLATED YET
+ ##ID:002665##
+ mcset $l "Search for a name" \
+ "Search for a name" ;# <-- NOT TRANSLATED YET
+ ##ID:002666##
+ mcset $l "Clear search string" \
+ "Clear search string" ;# <-- NOT TRANSLATED YET
+ ##ID:002667##
+ mcset $l "Register address:\n 1 or 2 digits\tinternal RAM (not SFR)\n 3 digits\t\texpanded RAM\n 4 digits\t\texternal RAM\n dot and 2 digits\tBit" \
+ "Register address:\n 1 or 2 digits\tinternal RAM (not SFR)\n 3 digits\t\texpanded RAM\n 4 digits\t\texternal RAM\n dot and 2 digits\tBit" ;# <-- NOT TRANSLATED YET
+ ##ID:002668##
+ mcset $l "Register address or bit address" \
+ "Register address or bit address" ;# <-- NOT TRANSLATED YET
+ ##ID:002669##
+ mcset $l "Name of the watch. Any string." \
+ "Name of the watch. Any string." ;# <-- NOT TRANSLATED YET
+ ##ID:002670##
+ mcset $l "Add this entry to register watches" \
+ "Add this entry to register watches" ;# <-- NOT TRANSLATED YET
+ ##ID:002671##
+ mcset $l "New register watches entry" \
+ "New register watches entry" ;# <-- NOT TRANSLATED YET
+ ##ID:002672##
+ mcset $l "Create new register watch" \
+ "Create new register watch" ;# <-- NOT TRANSLATED YET
+ ##ID:002673##
+ mcset $l "Remove this entry" \
+ "Remove this entry" ;# <-- NOT TRANSLATED YET
+ ##ID:002674##
+ mcset $l "Addr" \
+ "Addr" ;# <-- NOT TRANSLATED YET
+ ##ID:002675##
+ mcset $l "Register name" \
+ "Register name" ;# <-- NOT TRANSLATED YET
+ ##ID:002676##
+ mcset $l "Unable to assign, address is already in use" \
+ "无法分配, 地址正在使用"
+ ##ID:002677##
+ mcset $l "You must specify the register address." \
+ "您必须指定寄存器地址。"
+ ##ID:002678##
+ mcset $l "Specified address is already used." \
+ "指定的地址已经被使用"
+ ##ID:002679##
+ mcset $l "Overwrite file" \
+ "覆盖文件"
+ ##ID:002680##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "文件 '%s' 已经存在. 您确认覆盖它吗?"
+ ##ID:002681##
+ mcset $l "Error - MCU 8051 IDE" \
+ "错误 - MCU 8051 IDE"
+ ##ID:002682##
+ mcset $l "Unable to access file \"%s\", check your permissions." \
+ "无法访问文件 \"%s\", 检请查您的权限."
+ ##ID:002683##
+ mcset $l "Definitions saved to \"%s\"" \
+ "Definitions saved to \"%s\"" ;# <-- NOT TRANSLATED YET
+ ##ID:002684##
+ mcset $l "Save watches - MCU 8051 IDE" \
+ "Save watches - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002685##
+ mcset $l "File access error" \
+ "文件访问错误"
+ ##ID:002686##
+ mcset $l "Unable to read file '%s'" \
+ "无法读取文件 '%s'"
+ ##ID:002687##
+ mcset $l "Corrupted file" \
+ "损坏的文件"
+ ##ID:002688##
+ mcset $l "file: %s is either corrupted or it is not a file in expected format." \
+ "file: %s is either corrupted or it is not a file in expected format." ;# <-- NOT TRANSLATED YET
+ ##ID:002689##
+ mcset $l "Load watches from file - MCU 8051 IDE" \
+ "Load watches from file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002690##
+ mcset $l "Import file - MCU 8051 IDE" \
+ "导入文件 - MCU 8051 IDE"
+ ##ID:002691##
+ mcset $l "Unknown file" \
+ "未知文件"
+ ##ID:002692##
+ mcset $l "Unable to recognize file format" \
+ "Unable to recognize file format" ;# <-- NOT TRANSLATED YET
+ ##ID:002693##
+ mcset $l "Unable to open file:\n'%s'" \
+ "无法打开文件:\n'%s'"
+ ##ID:002694##
+ mcset $l "Are you sure ?" \
+ "您确定吗"
+ ##ID:002695##
+ mcset $l "Do you really want to clear the panel ?" \
+ "Do you really want to clear the panel ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002696##
+ mcset $l "MCU 8051 IDE watches definition" \
+ "MCU 8051 IDE watches definition" ;# <-- NOT TRANSLATED YET
+ ##ID:002697##
+ mcset $l "Code listing" \
+ "Code listing" ;# <-- NOT TRANSLATED YET
+}
+# fsd.tcl
+# ==============================================================================
+namespace eval KIFSD::FSD {
+ ##ID:002698##
+ mcset $l " Name\t\t\t\t Size Rights Date " \
+ " Name\t\t\t\t Size Rights Date " ;# <-- NOT TRANSLATED YET
+ ##ID:002699##
+ mcset $l "Location:" \
+ "Location:" ;# <-- NOT TRANSLATED YET
+ ##ID:002700##
+ mcset $l "Filter:" \
+ "过滤器:"
+ ##ID:002701##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:002702##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:002703##
+ mcset $l "Parent folder" \
+ "父文件夹"
+ ##ID:002704##
+ mcset $l "Back" \
+ "返回"
+ ##ID:002705##
+ mcset $l "Forward" \
+ "向前"
+ ##ID:002706##
+ mcset $l "Reload" \
+ "刷新"
+ ##ID:002707##
+ mcset $l "New folder" \
+ "新建文件夹"
+ ##ID:002708##
+ mcset $l "Short view" \
+ "Short view" ;# <-- NOT TRANSLATED YET
+ ##ID:002709##
+ mcset $l "Detailed view" \
+ "Detailed view" ;# <-- NOT TRANSLATED YET
+ ##ID:002710##
+ mcset $l "Bookmarks" \
+ "书签"
+ ##ID:002711##
+ mcset $l "Configure" \
+ "配置"
+ ##ID:002712##
+ mcset $l "By name" \
+ "按名称"
+ ##ID:002713##
+ mcset $l "By date" \
+ "按日期"
+ ##ID:002714##
+ mcset $l "By size" \
+ "按大小"
+ ##ID:002715##
+ mcset $l "Reverse" \
+ "反向"
+ ##ID:002716##
+ mcset $l "Folders first" \
+ "Folders first" ;# <-- NOT TRANSLATED YET
+ ##ID:002717##
+ mcset $l "Case insensitive" \
+ "不区分大小写"
+ ##ID:002718##
+ mcset $l "Sorting" \
+ "排序"
+ ##ID:002719##
+ mcset $l "Show hidden files" \
+ "显示隐藏文件"
+ ##ID:002720##
+ mcset $l "Quick access navigation panel" \
+ "Quick access navigation panel" ;# <-- NOT TRANSLATED YET
+ ##ID:002721##
+ mcset $l "Separate folders" \
+ "单独文件夹"
+ ##ID:002722##
+ mcset $l "Add bookmark" \
+ "添加书签"
+ ##ID:002723##
+ mcset $l "Edit bookmarks" \
+ "编辑书签"
+ ##ID:002724##
+ mcset $l "Up" \
+ "向上"
+ ##ID:002725##
+ mcset $l "Rename" \
+ "重命名"
+ ##ID:002726##
+ mcset $l "Delete" \
+ "删除"
+ ##ID:002727##
+ mcset $l "Bookmark folder" \
+ "收藏夹"
+ ##ID:002728##
+ mcset $l "Properties" \
+ "属性"
+ ##ID:002729##
+ mcset $l "Add entry" \
+ "添加条目"
+ ##ID:002730##
+ mcset $l "Hide panel" \
+ "隐藏面板"
+ ##ID:002731##
+ mcset $l "Move up" \
+ "向上移动"
+ ##ID:002732##
+ mcset $l "Move down" \
+ "向下移动"
+ ##ID:002733##
+ mcset $l "Edit entry" \
+ "编辑录入"
+ ##ID:002734##
+ mcset $l "Remove entry" \
+ "重命名条目"
+ ##ID:002735##
+ mcset $l "Invalid folder" \
+ "无效的文件夹"
+ ##ID:002736##
+ mcset $l "The specified folder does not exist:\n%s" \
+ "指定的文件不存在:\n%s"
+ ##ID:002737##
+ mcset $l "Create new folder in:\n%s" \
+ "创建新文件夹:\n%s"
+ ##ID:002738##
+ mcset $l "Clear" \
+ "清除"
+ ##ID:002739##
+ mcset $l "Unable to create folder" \
+ "无法创建文件夹"
+ ##ID:002740##
+ mcset $l "Unable to create the specified folder" \
+ "无法创建指定的文件夹"
+ ##ID:002741##
+ mcset $l "Delete file" \
+ "删除文件"
+ ##ID:002742##
+ mcset $l "Do you really want to delete file:\n%s" \
+ "您真的确定删除文件:\n%s"
+ ##ID:002743##
+ mcset $l "Permission denied" \
+ "没有权限"
+ ##ID:002744##
+ mcset $l "Unable to remove file:\n%s" \
+ "无法删除文件:\n%s"
+ ##ID:002745##
+ mcset $l "Unable to rename file:\n%s" \
+ "无法重命名文件:\n%s"
+ ##ID:002746##
+ mcset $l "Unknown Error" \
+ "未知错误"
+ ##ID:002747##
+ mcset $l "This file apparently does not exist" \
+ "此文件显然不存在"
+ ##ID:002748##
+ mcset $l "Unable to change permissions for file:\n%s" \
+ "无法更改文件权限:\n%s"
+ ##ID:002749##
+ mcset $l "Unable to rename file:%s" \
+ "无法重命名文件:%s"
+ ##ID:002750##
+ mcset $l "Remove" \
+ "删除"
+ ##ID:002751##
+ mcset $l "Edit" \
+ "编辑"
+ ##ID:002752##
+ mcset $l "Down" \
+ "向下"
+ ##ID:002753##
+ mcset $l "New entry" \
+ "新条目"
+ ##ID:002754##
+ mcset $l "Name" \
+ "名称"
+ ##ID:002755##
+ mcset $l "URL" \
+ "URL" ;# <-- NOT TRANSLATED YET
+ ##ID:002756##
+ mcset $l "Icon" \
+ "图标"
+ ##ID:002757##
+ mcset $l "Name:" \
+ "名称:"
+ ##ID:002758##
+ mcset $l "Ownership" \
+ "所有权"
+ ##ID:002759##
+ mcset $l "Owner" \
+ "所有者"
+ ##ID:002760##
+ mcset $l "Group" \
+ "所有组"
+ ##ID:002761##
+ mcset $l "Item properties" \
+ "项目属性"
+ ##ID:002762##
+ mcset $l "Type" \
+ "类型"
+ ##ID:002763##
+ mcset $l "Location" \
+ "位置"
+ ##ID:002764##
+ mcset $l "Size" \
+ "大小"
+ ##ID:002765##
+ mcset $l "Modified" \
+ "Modified" ;# <-- NOT TRANSLATED YET
+ ##ID:002766##
+ mcset $l "Accessed" \
+ "Accessed" ;# <-- NOT TRANSLATED YET
+ ##ID:002767##
+ mcset $l "Access permissions" \
+ "访问权限"
+ ##ID:002768##
+ mcset $l "Class" \
+ "类型"
+ ##ID:002769##
+ mcset $l "Read" \
+ "读取"
+ ##ID:002770##
+ mcset $l "Write" \
+ "写入"
+ ##ID:002771##
+ mcset $l "Exec" \
+ "执行"
+ ##ID:002772##
+ mcset $l "Others" \
+ "其他"
+}
+# filelist.tcl
+# ==============================================================================
+namespace eval FileList {
+ ##ID:002773##
+ mcset $l "Append to project" \
+ "添加到项目"
+ ##ID:002774##
+ mcset $l "Append this file to the current project" \
+ "添加此文件到当前项目"
+ ##ID:002775##
+ mcset $l "New" \
+ "新建"
+ ##ID:002776##
+ mcset $l "Create new file and open its editor" \
+ "创建新的文件并打开它的编辑"
+ ##ID:002777##
+ mcset $l "Open" \
+ "打开"
+ ##ID:002778##
+ mcset $l "Open an existing file" \
+ "打开一个现有的文件"
+ ##ID:002779##
+ mcset $l "Save" \
+ "保存"
+ ##ID:002780##
+ mcset $l "Save this file" \
+ "保存这个文件"
+ ##ID:002781##
+ mcset $l "Save as" \
+ "另存为"
+ ##ID:002782##
+ mcset $l "Save this file under different name" \
+ "以不同的名称保存此文件"
+ ##ID:002783##
+ mcset $l "Save all" \
+ "保存全部"
+ ##ID:002784##
+ mcset $l "Save all file in the list" \
+ "保存列表中的所有文件"
+ ##ID:002785##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:002786##
+ mcset $l "Close this file" \
+ "关闭这个文件"
+ ##ID:002787##
+ mcset $l "Close All" \
+ "关闭所有"
+ ##ID:002788##
+ mcset $l "Close all files in the list" \
+ "关闭列表中的所有的文件"
+ ##ID:002789##
+ mcset $l "Bookmark" \
+ "书签"
+ ##ID:002790##
+ mcset $l "Add/Remove bookmark for this file" \
+ "添加/删除这个文件书签"
+ ##ID:002791##
+ mcset $l "Move up" \
+ "向上移动"
+ ##ID:002792##
+ mcset $l "Move this file up in the list" \
+ "在列表中向上移动这个文件"
+ ##ID:002793##
+ mcset $l "Move down" \
+ "向下移动"
+ ##ID:002794##
+ mcset $l "Move this file down in the list" \
+ "在列表中向下移动这个文件"
+ ##ID:002795##
+ mcset $l "Move to top" \
+ "移动到顶部"
+ ##ID:002796##
+ mcset $l "Move this file to the top of the list" \
+ "将此文件移动到列表的顶部“"
+ ##ID:002797##
+ mcset $l "Move to bottom" \
+ "移动到底部"
+ ##ID:002798##
+ mcset $l "Move this file to the bottom of the list" \
+ "将此文件移动到列表的底部"
+ ##ID:002799##
+ mcset $l "Sort items by" \
+ "项目排序"
+ ##ID:002800##
+ mcset $l "Document Name" \
+ "文件名称"
+ ##ID:002801##
+ mcset $l "File URL" \
+ "文件 URL"
+ ##ID:002802##
+ mcset $l "File Size in B" \
+ "File Size in B" ;# <-- NOT TRANSLATED YET
+ ##ID:002803##
+ mcset $l "Open with" \
+ "打开"
+ ##ID:002804##
+ mcset $l "Hide the panel" \
+ "隐藏面板"
+ ##ID:002805##
+ mcset $l "Remove file from the project" \
+ "从项目中删除文件"
+ ##ID:002806##
+ mcset $l "Remove this file from the project" \
+ "从项目中移除此文件"
+ ##ID:002807##
+ mcset $l "Close file" \
+ "关闭文件"
+ ##ID:002808##
+ mcset $l "Open file" \
+ "打开文件"
+ ##ID:002809##
+ mcset $l "Open this file" \
+ "打开这个文件"
+ ##ID:002810##
+ mcset $l "Move this item up" \
+ "移动此项目"
+ ##ID:002811##
+ mcset $l "Move this item down" \
+ "向下移动此项目"
+ ##ID:002812##
+ mcset $l "Move this item to the top of the list" \
+ "移动此项目到列表的顶部"
+ ##ID:002813##
+ mcset $l "Move this item to the bottom of the list" \
+ "移动此项目到列表的底部"
+ ##ID:002814##
+ mcset $l "Add/Remove bookmark" \
+ "添加/删除书签"
+ ##ID:002815##
+ mcset $l "Move file up" \
+ "向上移动文件"
+ ##ID:002816##
+ mcset $l "Move selected file up in the list" \
+ "Move selected file up in the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002817##
+ mcset $l "Move file down" \
+ "向下移动文件"
+ ##ID:002818##
+ mcset $l "Move selected file down in the list" \
+ "Move selected file down in the list" ;# <-- NOT TRANSLATED YET
+ ##ID:002819##
+ mcset $l "Move item to top" \
+ "移至项目顶部"
+ ##ID:002820##
+ mcset $l "Move selected file to the top of the list" \
+ "移动选定的文件到列表顶部"
+ ##ID:002821##
+ mcset $l "Move item to bottom" \
+ "移至项目底部"
+ ##ID:002822##
+ mcset $l "Move selected file to the bottom of the list" \
+ "选定的文件移动到列表的底部"
+ ##ID:002823##
+ mcset $l "Open this file and create its own editor" \
+ "打开这个文件并创建它的编辑器"
+ ##ID:002824##
+ mcset $l "Close this file and close its editor" \
+ "关闭该文件与其编辑器"
+ ##ID:002825##
+ mcset $l "Exclude this file from list of files of this project" \
+ "从此项目移除这个文件"
+ ##ID:002826##
+ mcset $l "Hide this panel" \
+ "隐藏这个面板"
+ ##ID:002827##
+ mcset $l "Opened Files:" \
+ "打开文件:"
+ ##ID:002828##
+ mcset $l "Opened files" \
+ "打开这个文件"
+ ##ID:002829##
+ mcset $l "Files in the project" \
+ "项目中的文件"
+ ##ID:002830##
+ mcset $l "File system browser" \
+ "文件系统浏览器"
+ ##ID:002831##
+ mcset $l "List of SFR's" \
+ "List of SFR's" ;# <-- NOT TRANSLATED YET
+ ##ID:002832##
+ mcset $l "Files of the current project" \
+ "文件中的当前项目"
+ ##ID:002833##
+ mcset $l "Special Function Registers" \
+ "特殊功能寄存器"
+ ##ID:002834##
+ mcset $l "Bookmarks for opened files" \
+ "打开的文件的书签"
+ ##ID:002835##
+ mcset $l "List of opened files" \
+ "打开的文件列表"
+ ##ID:002836##
+ mcset $l "Search for file" \
+ "搜索文件"
+ ##ID:002837##
+ mcset $l "Search for certain file name in list of opened files" \
+ "在打开的文件列表中搜索特定的文件名"
+ ##ID:002838##
+ mcset $l "Search for certain file name in list of project files" \
+ "在项目文件列表中搜索特定的文件名"
+ ##ID:002839##
+ mcset $l "Clear search entry box" \
+ "清除搜索输入框"
+ ##ID:002840##
+ mcset $l "Previous editor" \
+ "上一步的编辑"
+ ##ID:002841##
+ mcset $l "Switch to the previous editor" \
+ "切换到下一个编辑器"
+ ##ID:002842##
+ mcset $l "Next editor" \
+ "下一个的编辑"
+ ##ID:002843##
+ mcset $l "Switch to the next editor" \
+ "切换到下一个编辑器"
+ ##ID:002844##
+ mcset $l "Bookmarks for project files" \
+ "项目文件书签"
+ ##ID:002845##
+ mcset $l "List of project files" \
+ "项目文件列表"
+ ##ID:002846##
+ mcset $l "Project Files:" \
+ "项目:"
+ ##ID:002847##
+ mcset $l "Show the panel" \
+ "显示面板"
+ ##ID:002848##
+ mcset $l "Currently opened files" \
+ "当前打开的文件"
+ ##ID:002849##
+ mcset $l "Files in the current project" \
+ "当前项目中的文件"
+ ##ID:002850##
+ mcset $l "SFR watches" \
+ "SFR watches" ;# <-- NOT TRANSLATED YET
+ ##ID:002851##
+ mcset $l "(read only)" \
+ "(只读)"
+ ##ID:002852##
+ mcset $l "File does not exist" \
+ "文件不存在"
+ ##ID:002853##
+ mcset $l "Path:" \
+ "路径:"
+ ##ID:002854##
+ mcset $l "Size:" \
+ "大小:"
+ ##ID:002855##
+ mcset $l "Modified:" \
+ "Modified:" ;# <-- NOT TRANSLATED YET
+ ##ID:002856##
+ mcset $l "Owner:" \
+ "所有者:"
+ ##ID:002857##
+ mcset $l "Permissions:" \
+ "权限:"
+ ##ID:002858##
+ mcset $l "Encoding:" \
+ "编码:"
+ ##ID:002859##
+ mcset $l "EOL:" \
+ "EOL:" ;# <-- NOT TRANSLATED YET
+ ##ID:002860##
+ mcset $l "Are you sure ?" \
+ "您确定吗"
+ ##ID:002861##
+ mcset $l "Reload of the file will change contents of the current editor. Are you sure you want that ?" \
+ "Reload of the file will change contents of the current editor. Are you sure you want that ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002862##
+ mcset $l "Reload aborted" \
+ "终止刷新"
+ ##ID:002863##
+ mcset $l "Binary File Opened - MCU 8015 IDE" \
+ "打开二进制文件 - MCU 8015 IDE"
+ ##ID:002864##
+ mcset $l "The file %s is binary, saving it will result corrupted file." \
+ "文件 %s 是二进制文件,保存它会导致文件损坏。"
+ ##ID:002865##
+ mcset $l "Unknown error" \
+ "未知错误"
+ ##ID:004497##
+ mcset $l "Checking for changes in files ..." \
+ "正在检查文件的更改 ..."
+ ##ID:002866##
+ mcset $l "Error raised during md5 checking of file:\n%s.\nMaybe md5 extension is not correctly loaded." \
+ "Raised error during md5 checking file %s. Maybe md5 extension is not correctly loaded." ;# <-- UPDATE?
+ ##ID:002869##
+ mcset $l "The following files could not be located:" \
+ "下列文件无法找到:"
+ ##ID:002870##
+ mcset $l "Ok" \
+ "确定"
+ ##ID:002871##
+ mcset $l "File(s) not found" \
+ "没有找到文件"
+ ##ID:002872##
+ mcset $l "The following files were modified since last save:" \
+ "The following files were modified since last save:" ;# <-- NOT TRANSLATED YET
+ ##ID:002873##
+ mcset $l "File(s) changed" \
+ "文件已被更改"
+ ##ID:002874##
+ mcset $l "File not found - MCU 8051 IDE" \
+ "文件没有找到 - MCU 8051 IDE"
+ ##ID:002875##
+ mcset $l "File %s not found !" \
+ "文件 %s 没有找到 !"
+ ##ID:004498##
+ mcset $l "Dangerously large file!" \
+ "Dangerously large file!" ;# <-- NOT TRANSLATED YET
+ ##ID:004499##
+ mcset $l "WARNING: The file you are about to open is larger than 10MB!\n\nOpening extremely big source code files might lead your system to run out of operating memory, then the MCU 8051 IDE might got killed by the operating system!\n\nARE YOU SURE you want to proceed?" \
+ "WARNING: The file you are about to open is larger than 10MB!\n\nOpening extremely big source code files might lead your system to run out of operating memory, then the MCU 8051 IDE might got killed by the operating system!\n\nARE YOU SURE you want to proceed?" ;# <-- NOT TRANSLATED YET
+ ##ID:002876##
+ mcset $l "File: %s is already opened." \
+ "文件 : %s 已经打开."
+ ##ID:002877##
+ mcset $l "Do you want to add this file to the project ?\n%s" \
+ "Do you want to add this file to the project ?\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:002878##
+ mcset $l "Yes" \
+ "Yes" ;# <-- NOT TRANSLATED YET
+ ##ID:002879##
+ mcset $l "No" \
+ "No" ;# <-- NOT TRANSLATED YET
+ ##ID:002880##
+ mcset $l "Do not ask again" \
+ "不要再询问"
+ ##ID:002882##
+ mcset $l "Add file ?" \
+ "添加文件?"
+ ##ID:002883##
+ mcset $l "Overwrite file" \
+ "覆盖文件"
+ ##ID:002884##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "A file name '%s' already exists. Are you sure you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002885##
+ mcset $l "Close document - MCU 8051 IDE" \
+ "关闭文档 - MCU 8051 IDE"
+ ##ID:002886##
+ mcset $l "The document %s have been modified.\nDo you want to save it ?" \
+ "The document %s have been modified.\nDo you want to save it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002887##
+ mcset $l "Last editor window closed -> opening a new one ..." \
+ "Last editor window closed -> opening a new one ..." ;# <-- NOT TRANSLATED YET
+ ##ID:002888##
+ mcset $l "The following documents have been modified,\ndo you want to save them before closing ?" \
+ "The following documents have been modified,\ndo you want to save them before closing ?" ;# <-- NOT TRANSLATED YET
+ ##ID:002889##
+ mcset $l "Unsaved files" \
+ "未保存文件"
+ ##ID:002890##
+ mcset $l "Save selected" \
+ "保存选定"
+ ##ID:002891##
+ mcset $l "Discard" \
+ "丢弃"
+ ##ID:002892##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:002893##
+ mcset $l "Close files - MCU 8051 IDE" \
+ "关闭文件 - MCU 8051 IDE"
+ ##ID:002894##
+ mcset $l "File not found" \
+ "文件没有找到"
+ ##ID:002895##
+ mcset $l "File %s could not be located at the specified location." \
+ "File %s could not be located at the specified location." ;# <-- NOT TRANSLATED YET
+ ##ID:002896##
+ mcset $l "File changed" \
+ "文件已经修改"
+ ##ID:002897##
+ mcset $l "File \"%s\" was modified since last project save\nTime: %s" \
+ "File \"%s\" was modified since last project save\nTime: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:002898##
+ mcset $l "Raised error during md5 checking file %s. Maybe md5 extension is not correctly loaded." \
+ "Raised error during md5 checking file %s. Maybe md5 extension is not correctly loaded." ;# <-- NOT TRANSLATED YET
+ ##ID:002899##
+ mcset $l "Program not found" \
+ "找不到程序"
+ ##ID:002900##
+ mcset $l "Unable to execute \"%s\"" \
+ "无法执行 \"%s\""
+ ##ID:002901##
+ mcset $l "Enter command to execute:" \
+ "输入要执行的命令:"
+ ##ID:002902##
+ mcset $l "Open with other ..." \
+ "Open with other ..." ;# <-- NOT TRANSLATED YET
+ ##ID:002903##
+ mcset $l "Unable to find \"%s\" in list of opened files or project files" \
+ "Unable to find \"%s\" in list of opened files or project files" ;# <-- NOT TRANSLATED YET
+ ##ID:002904##
+ mcset $l "Simulator: unable to switch to file: '%s'" \
+ "模拟器: 无法切换到文件: '%s'"
+}
+# rightpanel.tcl
+# ==============================================================================
+namespace eval RightPanel {
+ ##ID:002905##
+ mcset $l "Remove" \
+ "删除"
+ ##ID:002906##
+ mcset $l "Add/Remove editor bookmark to/from current line" \
+ "Add/Remove editor bookmark to/from current line" ;# <-- NOT TRANSLATED YET
+ ##ID:002907##
+ mcset $l "Previous" \
+ "上一页"
+ ##ID:002908##
+ mcset $l "Go to previous bookmark" \
+ "转到上一页书签"
+ ##ID:002909##
+ mcset $l "Next" \
+ "下一页"
+ ##ID:002910##
+ mcset $l "Go to next bookmark" \
+ "转到下一页书签"
+ ##ID:002911##
+ mcset $l "Remove all" \
+ "删除所有"
+ ##ID:002912##
+ mcset $l "Remove all bookmarks from the editor" \
+ "从编辑器中删除所有书签"
+ ##ID:002913##
+ mcset $l "Go to previous breakpoint" \
+ "转到上一个前断点"
+ ##ID:002914##
+ mcset $l "Go to next breakpoint" \
+ "转到下一个前断点"
+ ##ID:002915##
+ mcset $l "Remove all breakpoints from the editor" \
+ "从编译中删除所有断点"
+ ##ID:002916##
+ mcset $l "List of bookmarks in the current editor" \
+ "列出当前编辑器的书签"
+ ##ID:002917##
+ mcset $l "List of breakpoints in the current editor" \
+ "列出当前编辑器的书签"
+ ##ID:002918##
+ mcset $l "Details for instruction on the current line" \
+ "Details for instruction on the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:002919##
+ mcset $l "Register watches (for internal data memory, external data memory, expanded data memory and bits)" \
+ "Register watches (for internal data memory, external data memory, expanded data memory and bits)" ;# <-- NOT TRANSLATED YET
+ ##ID:002920##
+ mcset $l "List of active subprograms" \
+ "List of active subprograms" ;# <-- NOT TRANSLATED YET
+ ##ID:002921##
+ mcset $l "Symbol list" \
+ "Symbol list" ;# <-- NOT TRANSLATED YET
+ ##ID:002922##
+ mcset $l "Hardware manager" \
+ "硬件管理"
+ ##ID:002923##
+ mcset $l "Hide the panel" \
+ "隐藏面板"
+ ##ID:002924##
+ mcset $l "Bookmarks" \
+ "书签"
+ ##ID:002925##
+ mcset $l "List of bookmarks in editor (Ctrl+6)" \
+ "编辑器中的书签列表 (Ctrl+6)"
+ ##ID:002926##
+ mcset $l "Breakpoints" \
+ "断点"
+ ##ID:002927##
+ mcset $l "List of breakpoints in editor (Ctrl+7)" \
+ "编辑器中的断点列表 (Ctrl+7)"
+ ##ID:002928##
+ mcset $l "Symbols" \
+ "符号"
+ ##ID:002929##
+ mcset $l "Symbol List" \
+ "符号列表"
+ ##ID:002930##
+ mcset $l "Instruction" \
+ "指令"
+ ##ID:002931##
+ mcset $l "Instruction details (Ctrl+8)" \
+ "Instruction details (Ctrl+8)" ;# <-- NOT TRANSLATED YET
+ ##ID:002932##
+ mcset $l "Watches" \
+ "Watches" ;# <-- NOT TRANSLATED YET
+ ##ID:002933##
+ mcset $l "Register watches (Ctrl+9)" \
+ "Register watches (Ctrl+9)" ;# <-- NOT TRANSLATED YET
+ ##ID:002934##
+ mcset $l "Subprograms" \
+ "子程序"
+ ##ID:002935##
+ mcset $l "Active subprograms (Ctrl+0)" \
+ "Active subprograms (Ctrl+0)" ;# <-- NOT TRANSLATED YET
+ ##ID:002936##
+ mcset $l "Hardware" \
+ "硬件"
+ ##ID:002937##
+ mcset $l "Hide" \
+ "隐藏"
+ ##ID:002938##
+ mcset $l "Show the panel" \
+ "显示面板"
+ ##ID:002939##
+ mcset $l "Hardware tools" \
+ "硬件工具"
+ ##ID:002940##
+ mcset $l "Hardware tools manager" \
+ "硬件工具管理"
+ ##ID:002941##
+ mcset $l "MCU register watches (Ctrl+9)" \
+ "MCU register watches (Ctrl+9)" ;# <-- NOT TRANSLATED YET
+ ##ID:002942##
+ mcset $l "Register watches for internal data memory, external data memory and expanded data memory" \
+ "Register watches for internal data memory, external data memory and expanded data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:002943##
+ mcset $l "Move to previous bookmark" \
+ "Move to previous bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002944##
+ mcset $l "Go to to line of previous bookmark" \
+ "Go to to line of previous bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002945##
+ mcset $l "Move to the next bookmark" \
+ "Move to the next bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002946##
+ mcset $l "Go to to line of next bookmark" \
+ "Go to to line of next bookmark" ;# <-- NOT TRANSLATED YET
+ ##ID:002947##
+ mcset $l "Add/Remove bookmark on the current line" \
+ "Add/Remove bookmark on the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:002948##
+ mcset $l "Add/Remove bookmark on the current line in editor" \
+ "Add/Remove bookmark on the current line in editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002949##
+ mcset $l "Clear all bookmarks" \
+ "清除所有书签"
+ ##ID:002950##
+ mcset $l "Clear all bookmarks from editor" \
+ "清除所有编辑器的书签"
+ ##ID:002951##
+ mcset $l "Move to previous breakpoint" \
+ "Move to previous breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:002952##
+ mcset $l "Go to to line of previous breakpoint" \
+ "Go to to line of previous breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:002953##
+ mcset $l "Move to next breakpoint" \
+ "Move to next breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:002954##
+ mcset $l "Go to to line of next breakpoint" \
+ "Go to to line of next breakpoint" ;# <-- NOT TRANSLATED YET
+ ##ID:002955##
+ mcset $l "Add/Remove breakpoint on the current line" \
+ "Add/Remove breakpoint on the current line" ;# <-- NOT TRANSLATED YET
+ ##ID:002956##
+ mcset $l "Add/Remove breakpoint on the current line in editor" \
+ "Add/Remove breakpoint on the current line in editor" ;# <-- NOT TRANSLATED YET
+ ##ID:002957##
+ mcset $l "Clear all breakpoints" \
+ "清除所有断点"
+ ##ID:002958##
+ mcset $l "Clear all breakpoints from editor" \
+ "清除所有编辑器的断点"
+ ##ID:002959##
+ mcset $l "Reevaluate" \
+ "Reevaluate" ;# <-- NOT TRANSLATED YET
+ ##ID:002960##
+ mcset $l "Reevaluate ..." \
+ "Reevaluate ..." ;# <-- NOT TRANSLATED YET
+ ##ID:002961##
+ mcset $l "Clear search string" \
+ "Clear search string" ;# <-- NOT TRANSLATED YET
+ ##ID:002962##
+ mcset $l "Search for a constant, variable, function or macro" \
+ "Search for a constant, variable, function or macro" ;# <-- NOT TRANSLATED YET
+ ##ID:002963##
+ mcset $l " Search:" \
+ " 搜索:"
+}
+# X.tcl
+# ==============================================================================
+namespace eval X {
+ ##ID:002964##
+ mcset $l "Options" \
+ "选项"
+ ##ID:002965##
+ mcset $l "Case sensitive" \
+ "区分大小写"
+ ##ID:002966##
+ mcset $l "Backwards" \
+ "向后"
+ ##ID:002967##
+ mcset $l "From cursor" \
+ "从光标"
+ ##ID:002968##
+ mcset $l "Regular expr." \
+ "正规表达式."
+ ##ID:002969##
+ mcset $l "Prompt on replace" \
+ "替换时提示"
+ ##ID:002970##
+ mcset $l "Case sensitive search" \
+ "区分大小写的搜索"
+ ##ID:002971##
+ mcset $l "Search backwards from the specified location" \
+ "从指定位置反向搜索"
+ ##ID:002972##
+ mcset $l "Start search from cursor instead of beginning" \
+ "从头开始搜索"
+ ##ID:002973##
+ mcset $l "Use search string as regular expression" \
+ "Use search string as regular expression" ;# <-- NOT TRANSLATED YET
+ ##ID:002974##
+ mcset $l "Selected text" \
+ "所选文字"
+ ##ID:002975##
+ mcset $l "Search within selected text only" \
+ "仅在选定的文本中搜索"
+ ##ID:002976##
+ mcset $l "Save" \
+ "保存"
+ ##ID:002977##
+ mcset $l "Save this project" \
+ "保存这个项目"
+ ##ID:002978##
+ mcset $l "Edit project" \
+ "编辑这个项目"
+ ##ID:002979##
+ mcset $l "Edit additional project detail" \
+ "编辑附加项目细节"
+ ##ID:002980##
+ mcset $l "Save and close" \
+ "保存并关闭"
+ ##ID:002981##
+ mcset $l "Save and close this project" \
+ "保存并关闭这个项目"
+ ##ID:002982##
+ mcset $l "Close without saving" \
+ "不保存关闭"
+ ##ID:002983##
+ mcset $l "Close this project" \
+ "关闭这个项目"
+ ##ID:002984##
+ mcset $l "Move left" \
+ "Move left" ;# <-- NOT TRANSLATED YET
+ ##ID:002985##
+ mcset $l "Move this tab to right the beginning of the tab bar" \
+ "Move this tab to right the beginning of the tab bar" ;# <-- NOT TRANSLATED YET
+ ##ID:002986##
+ mcset $l "Move right" \
+ "Move right" ;# <-- NOT TRANSLATED YET
+ ##ID:002987##
+ mcset $l "Move this tab to right the end of the tab bar" \
+ "Move this tab to right the end of the tab bar" ;# <-- NOT TRANSLATED YET
+ ##ID:002988##
+ mcset $l "Move to beginning" \
+ "Move to beginning" ;# <-- NOT TRANSLATED YET
+ ##ID:002989##
+ mcset $l "Move to end" \
+ "Move to end" ;# <-- NOT TRANSLATED YET
+ ##ID:002990##
+ mcset $l "Export to XHTML - MCU 8051 IDE" \
+ "Export to XHTML - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002991##
+ mcset $l "Export to LaTeX - MCU 8051 IDE" \
+ "Export to LaTeX - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:002992##
+ mcset $l "Export to XHTML file" \
+ "Export to XHTML file" ;# <-- NOT TRANSLATED YET
+ ##ID:002993##
+ mcset $l "Export to LaTeX file" \
+ "Export to LaTeX file" ;# <-- NOT TRANSLATED YET
+ ##ID:002994##
+ mcset $l "Hexadecimal number" \
+ "Hexadecimal number" ;# <-- NOT TRANSLATED YET
+ ##ID:002995##
+ mcset $l "Octal number" \
+ "Octal number" ;# <-- NOT TRANSLATED YET
+ ##ID:002996##
+ mcset $l "Decimal number" \
+ "Decimal number" ;# <-- NOT TRANSLATED YET
+ ##ID:002997##
+ mcset $l "Binary number" \
+ "Binary number" ;# <-- NOT TRANSLATED YET
+ ##ID:002998##
+ mcset $l "Constant" \
+ "Constant" ;# <-- NOT TRANSLATED YET
+ ##ID:002999##
+ mcset $l "Generic number" \
+ "Generic number" ;# <-- NOT TRANSLATED YET
+ ##ID:003000##
+ mcset $l "Comment" \
+ "注释"
+ ##ID:003001##
+ mcset $l "Control sequence" \
+ "Control sequence" ;# <-- NOT TRANSLATED YET
+ ##ID:003002##
+ mcset $l "Symbol" \
+ "Symbol" ;# <-- NOT TRANSLATED YET
+ ##ID:003003##
+ mcset $l "Directive" \
+ "Directive" ;# <-- NOT TRANSLATED YET
+ ##ID:003004##
+ mcset $l "Label" \
+ "Label" ;# <-- NOT TRANSLATED YET
+ ##ID:003005##
+ mcset $l "Instruction" \
+ "Instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003006##
+ mcset $l "SFR register" \
+ "SFR register" ;# <-- NOT TRANSLATED YET
+ ##ID:003007##
+ mcset $l "Indirect address" \
+ "Indirect address" ;# <-- NOT TRANSLATED YET
+ ##ID:003008##
+ mcset $l "Immediate hex" \
+ "Immediate hex" ;# <-- NOT TRANSLATED YET
+ ##ID:003009##
+ mcset $l "Immediate oct" \
+ "Immediate oct" ;# <-- NOT TRANSLATED YET
+ ##ID:003010##
+ mcset $l "Immediate dec" \
+ "Immediate dec" ;# <-- NOT TRANSLATED YET
+ ##ID:003011##
+ mcset $l "Immediate bin" \
+ "Immediate bin" ;# <-- NOT TRANSLATED YET
+ ##ID:003012##
+ mcset $l "Immediate const" \
+ "Immediate const" ;# <-- NOT TRANSLATED YET
+ ##ID:003013##
+ mcset $l "Immediate generic" \
+ "Immediate generic" ;# <-- NOT TRANSLATED YET
+ ##ID:003014##
+ mcset $l "Macro instruction" \
+ "Macro instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003015##
+ mcset $l "Uppercase" \
+ "大写"
+ ##ID:003016##
+ mcset $l "Lowercase" \
+ "小写"
+ ##ID:003017##
+ mcset $l "Keep case" \
+ "Keep case" ;# <-- NOT TRANSLATED YET
+ ##ID:003018##
+ mcset $l "Code listing files" \
+ "Code listing files" ;# <-- NOT TRANSLATED YET
+ ##ID:003019##
+ mcset $l "Assembly debug files (before v1.0.5)" \
+ "Assembly debug files (before v1.0.5)" ;# <-- NOT TRANSLATED YET
+ ##ID:003020##
+ mcset $l "IHEX object code files" \
+ "IHEX object code files" ;# <-- NOT TRANSLATED YET
+ ##ID:003021##
+ mcset $l "Binary object code files" \
+ "Binary object code files" ;# <-- NOT TRANSLATED YET
+ ##ID:003022##
+ mcset $l "HTML files" \
+ "HTML文件"
+ ##ID:003023##
+ mcset $l "TeX sources" \
+ "TeX sources" ;# <-- NOT TRANSLATED YET
+ ##ID:003024##
+ mcset $l "Hibernated programs" \
+ "Hibernated programs" ;# <-- NOT TRANSLATED YET
+ ##ID:003025##
+ mcset $l "ASL: NoICE-compatible command file" \
+ "ASL: NoICE-compatible command file"
+ ##ID:003026##
+ mcset $l "ASL: Atmel debug file used by the AVR tools" \
+ "ASL: Atmel debug file used by the AVR tools" ;# <-- NOT TRANSLATED YET
+ ##ID:003027##
+ mcset $l "SDCC: The memory map for the load module" \
+ "SDCC: The memory map for the load module" ;# <-- NOT TRANSLATED YET
+ ##ID:003028##
+ mcset $l "ASL object files" \
+ "ASL object files" ;# <-- NOT TRANSLATED YET
+ ##ID:003029##
+ mcset $l "Macro definition file" \
+ "Macro definition file" ;# <-- NOT TRANSLATED YET
+ ##ID:003030##
+ mcset $l "Macro output files" \
+ "Macro output files" ;# <-- NOT TRANSLATED YET
+ ##ID:003031##
+ mcset $l "SDCC IHEX8 object files" \
+ "SDCC IHEX8 object files" ;# <-- NOT TRANSLATED YET
+ ##ID:003032##
+ mcset $l "MCU 8051 IDE Assembler debug files" \
+ "MCU 8051 IDE Assembler debug files" ;# <-- NOT TRANSLATED YET
+ ##ID:003033##
+ mcset $l "SDCC Assembler debug files" \
+ "SDCC Assembler debug files" ;# <-- NOT TRANSLATED YET
+ ##ID:003034##
+ mcset $l "SDCC: Object file created by the assembler" \
+ "SDCC: Object file created by the assembler" ;# <-- NOT TRANSLATED YET
+ ##ID:003035##
+ mcset $l "SDCC debug files" \
+ "SDCC debug files" ;# <-- NOT TRANSLATED YET
+ ##ID:003036##
+ mcset $l "SDCC: A file with a summary of the memory usage" \
+ "SDCC: A file with a summary of the memory usage" ;# <-- NOT TRANSLATED YET
+ ##ID:003037##
+ mcset $l "SDCC: Linker script" \
+ "SDCC: Linker script" ;# <-- NOT TRANSLATED YET
+ ##ID:003038##
+ mcset $l "SDCC: Symbol listing for the source file" \
+ "SDCC: Symbol listing for the source file" ;# <-- NOT TRANSLATED YET
+ ##ID:003039##
+ mcset $l "OMF-51 object files" \
+ "OMF-51 object files" ;# <-- NOT TRANSLATED YET
+ ##ID:003040##
+ mcset $l "SDCC: Listing file updated with linkedit information" \
+ "SDCC: Listing file updated with linkedit information" ;# <-- NOT TRANSLATED YET
+ ##ID:003041##
+ mcset $l "MD5 hashes for C source files" \
+ "MD5 hashes for C source files" ;# <-- NOT TRANSLATED YET
+ ##ID:003042##
+ mcset $l "Doxygen backup file" \
+ "Doxygen backup file" ;# <-- NOT TRANSLATED YET
+ ##ID:003043##
+ mcset $l "Assembly language sources" \
+ "Assembly language sources" ;# <-- NOT TRANSLATED YET
+ ##ID:003044##
+ mcset $l "Register watches definition files" \
+ "Register watches definition files" ;# <-- NOT TRANSLATED YET
+ ##ID:003045##
+ mcset $l "MCU 8051 IDE hibernated program" \
+ "MCU 8051 IDE hibernated program" ;# <-- NOT TRANSLATED YET
+ ##ID:003046##
+ mcset $l "MCU 8051 IDE project" \
+ "MCU 8051 IDE roject" ;# <-- NOT TRANSLATED YET
+ ##ID:003047##
+ mcset $l "C sources" \
+ "C sources" ;# <-- NOT TRANSLATED YET
+ ##ID:003048##
+ mcset $l "C headers" \
+ "C headers" ;# <-- NOT TRANSLATED YET
+ ##ID:003049##
+ mcset $l "Virtual Hardware Component" \
+ "Virtual Hardware Component" ;# <-- NOT TRANSLATED YET
+ ##ID:003050##
+ mcset $l "Virtual Hardware" \
+ "Virtual Hardware" ;# <-- NOT TRANSLATED YET
+ ##ID:003051##
+ mcset $l "Text files" \
+ "文本文件"
+ ##ID:003052##
+ mcset $l "All backup files" \
+ "所有备份文件"
+ ##ID:003053##
+ mcset $l "echo \"This is a custom command\"\necho \"\tYou can configure it in Main menu->Configure->Edit user commands.\"\necho \"\tCustom commands are intended for running external programs from this IDE (e.g. program uploaders)\"" \
+ "echo \"This is a custom command\"\necho \"\tYou can configure it in Main menu->Configure->Edit user commands.\"\necho \"\tCustom commands are intended for running external programs from this IDE (e.g. program uploaders)\"" ;# <-- NOT TRANSLATED YET
+ ##ID:003054##
+ mcset $l "More: Main menu -> Configure -> Edit user commands" \
+ "More: Main menu -> Configure -> Edit user commands" ;# <-- NOT TRANSLATED YET
+ ##ID:003055##
+ mcset $l "Unable to compile" \
+ "Unable to compile" ;# <-- NOT TRANSLATED YET
+ ##ID:003056##
+ mcset $l "Simulator is engaged, shutdown the simulator first." \
+ "Simulator is engaged, shutdown the simulator first." ;# <-- NOT TRANSLATED YET
+ ##ID:003057##
+ mcset $l "Open file - MCU 8051 IDE" \
+ "打开文件 - MCU 8051 IDE"
+ ##ID:003058##
+ mcset $l "New file - MCU 8051 IDE" \
+ "新建文件 - MCU 8051 IDE"
+ ##ID:003059##
+ mcset $l "Assembly language" \
+ "Assembly language" ;# <-- NOT TRANSLATED YET
+ ##ID:003060##
+ mcset $l "C source" \
+ "C source" ;# <-- NOT TRANSLATED YET
+ ##ID:003061##
+ mcset $l "C header" \
+ "C header" ;# <-- NOT TRANSLATED YET
+ ##ID:003062##
+ mcset $l "Code listing" \
+ "Code listing" ;# <-- NOT TRANSLATED YET
+ ##ID:003063##
+ mcset $l "All files" \
+ "所有文件"
+ ##ID:003064##
+ mcset $l "File not found - MCU 8051 IDE" \
+ "文件没有找到 - MCU 8051 IDE"
+ ##ID:003065##
+ mcset $l "The selected file do not exist:\n%s" \
+ "The selected file do not exist:\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:003066##
+ mcset $l "Save file - MCU 8051 IDE" \
+ "保存文件 - MCU 8051 IDE"
+ ##ID:003067##
+ mcset $l "Text to find:" \
+ "要查找的文本:"
+ ##ID:003068##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:003069##
+ mcset $l "Cancel" \
+ "取消"
+ ##ID:003070##
+ mcset $l "Find - MCU 8051 IDE" \
+ "查找 - MCU 8051 IDE"
+ ##ID:003071##
+ mcset $l "Unable to execute" \
+ "无法执行"
+ ##ID:003072##
+ mcset $l "Search result: %s matches found" \
+ "Search result: %s matches found" ;# <-- NOT TRANSLATED YET
+ ##ID:003073##
+ mcset $l "Find - %s" \
+ "查找- %s"
+ ##ID:003074##
+ mcset $l "Search string '%s' not found !" \
+ "Search string '%s' not found !" ;# <-- NOT TRANSLATED YET
+ ##ID:003075##
+ mcset $l "Beginning of document reached\n\nContinue from end ?" \
+ "Beginning of document reached\n\nContinue from end ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003076##
+ mcset $l "End of document reached\n\nContinue from beginning ?" \
+ "End of document reached\n\nContinue from beginning ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003077##
+ mcset $l "Editor: Nothing to search ..." \
+ "Editor: Nothing to search ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003078##
+ mcset $l "Text to find: " \
+ "Text to find: " ;# <-- NOT TRANSLATED YET
+ ##ID:003079##
+ mcset $l "Replace with:" \
+ "Replace with:" ;# <-- NOT TRANSLATED YET
+ ##ID:003080##
+ mcset $l "Replace - MCU 8051 IDE" \
+ "Replace - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003081##
+ mcset $l "Replace - %s" \
+ "Replace - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003082##
+ mcset $l "Found an occurrence of your search term.\nWhat do you want to do ?" \
+ "Found an occurrence of your search term.\nWhat do you want to do ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003083##
+ mcset $l "Replace" \
+ "替换"
+ ##ID:003084##
+ mcset $l "Replace & close" \
+ "替换及关闭"
+ ##ID:003085##
+ mcset $l "Replace all" \
+ "全部替换"
+ ##ID:003086##
+ mcset $l "Find next" \
+ "查找下一个"
+ ##ID:003087##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:003088##
+ mcset $l "Replace confirmation - %s" \
+ "Replace confirmation - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003089##
+ mcset $l "Go to line" \
+ "到达指定的行目"
+ ##ID:003090##
+ mcset $l "Go to line - MCU 8051 IDE" \
+ "到达指定的行目 - MCU 8051 IDE"
+ ##ID:003091##
+ mcset $l "Choose directory - MCU 8051 IDE" \
+ "选择目录 - MCU 8051 IDE"
+ ##ID:003092##
+ mcset $l "Create a new project.\n All entries are required. Other options --> edit project." \
+ "Create a new project.\n All entries are required. Other options --> edit project." ;# <-- NOT TRANSLATED YET
+ ##ID:003093##
+ mcset $l "General" \
+ "General" ;# <-- NOT TRANSLATED YET
+ ##ID:003094##
+ mcset $l "Project name" \
+ "项目名称"
+ ##ID:003095##
+ mcset $l "Project directory" \
+ "项目目录"
+ ##ID:003096##
+ mcset $l "Choose destination location" \
+ "选择目标位置"
+ ##ID:003097##
+ mcset $l "Processor" \
+ "Processor" ;# <-- NOT TRANSLATED YET
+ ##ID:003098##
+ mcset $l "External RAM (XDATA)" \
+ "External RAM (XDATA)" ;# <-- NOT TRANSLATED YET
+ ##ID:003099##
+ mcset $l "External ROM/FLASH (XCODE)" \
+ "External ROM/FLASH (XCODE)" ;# <-- NOT TRANSLATED YET
+ ##ID:003100##
+ mcset $l "Type:" \
+ "类型:"
+ ##ID:003101##
+ mcset $l "Selected uC" \
+ "Selected uC" ;# <-- NOT TRANSLATED YET
+ ##ID:003102##
+ mcset $l "Select MCU" \
+ "Select MCU" ;# <-- NOT TRANSLATED YET
+ ##ID:003103##
+ mcset $l "Choose processor from database" \
+ "Choose processor from database" ;# <-- NOT TRANSLATED YET
+ ##ID:003104##
+ mcset $l "Enable" \
+ "Enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003105##
+ mcset $l "Connect external data memory" \
+ "Connect external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:003106##
+ mcset $l "Amount of external data memory" \
+ "Amount of external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:003107##
+ mcset $l "Connect external program memory" \
+ "Connect external program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:003108##
+ mcset $l "Amount of total program memory minus internal program memory" \
+ "Amount of total program memory minus internal program memory" ;# <-- NOT TRANSLATED YET
+ ##ID:003109##
+ mcset $l "New project - MCU 8051 IDE" \
+ "新建项目 - MCU 8051 IDE"
+ ##ID:003110##
+ mcset $l "Invalid request" \
+ "无效的请求"
+ ##ID:003111##
+ mcset $l "Both entries in section general must be filled." \
+ "Both entries in section general must be filled." ;# <-- NOT TRANSLATED YET
+ ##ID:003112##
+ mcset $l "Create directory - MCU 8051 IDE" \
+ "创建目录 - MCU 8051 IDE"
+ ##ID:003113##
+ mcset $l "The specified directory does not exist do you want to create it ?" \
+ "The specified directory does not exist do you want to create it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003114##
+ mcset $l "File access error" \
+ "文件访问错误"
+ ##ID:003115##
+ mcset $l "Creation of directory '%s' FAILED !\nPlease check your permissions." \
+ "Creation of directory '%s' FAILED !\nPlease check your permissions." ;# <-- NOT TRANSLATED YET
+ ##ID:003116##
+ mcset $l "File already exists - MCU 8051 IDE" \
+ "文件已存在 - MCU 8051 IDE"
+ ##ID:003117##
+ mcset $l "Some project with the same name already exists in the specified directory. \nDo you want to overwrite it ?" \
+ "Some project with the same name already exists in the specified directory. \nDo you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003118##
+ mcset $l "Unable to write to file:\n\"%s\"" \
+ "无法写入文件:\n\"%s\""
+ ##ID:003119##
+ mcset $l "Open project - MCU 8051 IDE" \
+ "打开项目 - MCU 8051 IDE"
+ ##ID:003120##
+ mcset $l "Error - MCU 8051 IDE" \
+ "错误 - MCU 8051 IDE"
+ ##ID:003121##
+ mcset $l "Unable to load file: %s" \
+ "无法载入文件: %s"
+ ##ID:003122##
+ mcset $l "Project saved to %s" \
+ "项目保存到 %s"
+ ##ID:003123##
+ mcset $l "IO Error" \
+ "IO Error" ;# <-- NOT TRANSLATED YET
+ ##ID:003124##
+ mcset $l "General information" \
+ "General information" ;# <-- NOT TRANSLATED YET
+ ##ID:003125##
+ mcset $l "Version" \
+ "Version" ;# <-- NOT TRANSLATED YET
+ ##ID:003126##
+ mcset $l "Date" \
+ "Date" ;# <-- NOT TRANSLATED YET
+ ##ID:003127##
+ mcset $l "Copyright" \
+ "Copyright" ;# <-- NOT TRANSLATED YET
+ ##ID:003128##
+ mcset $l "License" \
+ "License" ;# <-- NOT TRANSLATED YET
+ ##ID:003129##
+ mcset $l "Authors:" \
+ "Authors:" ;# <-- NOT TRANSLATED YET
+ ##ID:003130##
+ mcset $l "List of project authors (one per line):" \
+ "List of project authors (one per line):" ;# <-- NOT TRANSLATED YET
+ ##ID:003131##
+ mcset $l "XDATA" \
+ "XDATA" ;# <-- NOT TRANSLATED YET
+ ##ID:003132##
+ mcset $l "XCODE" \
+ "XCODE" ;# <-- NOT TRANSLATED YET
+ ##ID:003133##
+ mcset $l "Clock \[kHz\]:" \
+ "Clock \[kHz\]:" ;# <-- NOT TRANSLATED YET
+ ##ID:003134##
+ mcset $l "Main file:" \
+ "Main file:" ;# <-- NOT TRANSLATED YET
+ ##ID:003135##
+ mcset $l "Project main file (e.g. main.c)\n(empty string means always compile current file)" \
+ "Project main file (e.g. main.c)\n(empty string means always compile current file)" ;# <-- NOT TRANSLATED YET
+ ##ID:003136##
+ mcset $l "Size of external data memory" \
+ "Size of external data memory" ;# <-- NOT TRANSLATED YET
+ ##ID:003137##
+ mcset $l "Project description" \
+ "项目说明"
+ ##ID:003138##
+ mcset $l "Edit project - MCU 8051 IDE" \
+ "编辑项目 - MCU 8051 IDE"
+ ##ID:003139##
+ mcset $l "Select main file - %s - MCU 8051 IDE" \
+ "Select main file - %s - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003140##
+ mcset $l "New values saved." \
+ "New values saved." ;# <-- NOT TRANSLATED YET
+ ##ID:003141##
+ mcset $l "Requesting confirmation %s" \
+ "Requesting confirmation %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003142##
+ mcset $l "Are you sure want to close the project without saving changes ?" \
+ "Are you sure want to close the project without saving changes ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003143##
+ mcset $l "Unable to run assembler" \
+ "Unable to run assembler" ;# <-- NOT TRANSLATED YET
+ ##ID:003144##
+ mcset $l "Something is already running in background." \
+ "Something is already running in background." ;# <-- NOT TRANSLATED YET
+ ##ID:003145##
+ mcset $l "Compiling ..." \
+ "正在编译 ..."
+ ##ID:003146##
+ mcset $l "Compiler not found" \
+ "没有找到编译器"
+ ##ID:003147##
+ mcset $l "Unable to find sdcc, please install sdcc and restart MCU 8051 IDE" \
+ "没有找到SDCC, 请安装SDCC和重新安装 MCU 8051 IDE"
+ ##ID:003148##
+ mcset $l "MCU 8051 IDE Native assembler" \
+ "MCU 8051 IDE Native assembler" ;# <-- NOT TRANSLATED YET
+ ##ID:003149##
+ mcset $l "%s assembler not found" \
+ "%s assembler not found" ;# <-- NOT TRANSLATED YET
+ ##ID:003150##
+ mcset $l "Unable to run program \"%s\". Please check if you have installed this assembler or choose a different one in compiler configuration dialog." \
+ "Unable to run program \"%s\". Please check if you have installed this assembler or choose a different one in compiler configuration dialog." ;# <-- NOT TRANSLATED YET
+ ##ID:003151##
+ mcset $l "Compiler crash - MCU 8051 IDE" \
+ "编译器崩溃 - MCU 8051 IDE"
+ ##ID:003152##
+ mcset $l "Compiler crashed, we are terribly sorry about that.\n\nPlease report this bug via project web or mail to author and please don't forget to include source code on which this error occurred." \
+ "Compiler crashed, we are terribly sorry about that.\n\nPlease report this bug via project web or mail to author and please don't forget to include source code on which this error occurred." ;# <-- NOT TRANSLATED YET
+ ##ID:003153##
+ mcset $l "Compilation successful" \
+ "编译成功"
+ ##ID:003154##
+ mcset $l "Compilation failed" \
+ "编译失败"
+ ##ID:003155##
+ mcset $l "Compilation failed, see messages for details." \
+ "编译失败,详见消息."
+ ##ID:003156##
+ mcset $l "Compilation: " \
+ "编辑:"
+ ##ID:003157##
+ mcset $l "Abort" \
+ "中止"
+ ##ID:003158##
+ mcset $l "This editor seems to be empty" \
+ "这个编辑器似乎是空的"
+ ##ID:003159##
+ mcset $l "Export dialog" \
+ "导出日志"
+ ##ID:003160##
+ mcset $l "Finishing syntax highlight ..." \
+ "正在完成语法高亮 ..."
+ ##ID:003161##
+ mcset $l "Export as %s - MCU 8051 IDE" \
+ "导出为 %s - MCU 8051 IDE"
+ ##ID:003162##
+ mcset $l "Permission denied" \
+ "没有权限"
+ ##ID:003163##
+ mcset $l "Unable to access file: %s" \
+ "无法访问文件: %s"
+ ##ID:003164##
+ mcset $l "Overwrite file" \
+ "覆盖文件"
+ ##ID:003165##
+ mcset $l "A file name '%s' already exists. Are you sure you want to overwrite it ?" \
+ "A file name '%s' already exists. Are you sure you want to overwrite it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003166##
+ mcset $l "Unable to write to file: \"%s\"" \
+ "无法写入文件: \"%s\""
+ ##ID:003167##
+ mcset $l "\[lindex \$args 1\] - MCU 8051 IDE" \
+ "\[lindex \$args 1\] - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003168##
+ mcset $l "Converting ..." \
+ "Converting ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003169##
+ mcset $l "Exported data saved to %s" \
+ "Exported data saved to %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003170##
+ mcset $l "\nExiting program on user request ..." \
+ "\nExiting program on user request ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003171##
+ mcset $l "An error occurred when saving the last session" \
+ "An error occurred when saving the last session" ;# <-- NOT TRANSLATED YET
+ ##ID:003172##
+ mcset $l "Saving project: %s" \
+ "Saving project: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003173##
+ mcset $l "Program terminated" \
+ "计划已终止"
+ ##ID:003174##
+ mcset $l "Unable to save running configuration" \
+ "无法保存正在运行的配置"
+ ##ID:003175##
+ mcset $l "Access denied" \
+ "拒绝访问"
+ ##ID:003176##
+ mcset $l "The following documents have been modified,\ndo you want to save them before closing ?" \
+ "The following documents have been modified,\ndo you want to save them before closing ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003177##
+ mcset $l "Unsaved files" \
+ "未保存的文件"
+ ##ID:003178##
+ mcset $l "Project: \"%s\"" \
+ "项目: \"%s\""
+ ##ID:003179##
+ mcset $l "Save selected" \
+ "保存所选"
+ ##ID:003180##
+ mcset $l "Save all" \
+ "保存全部"
+ ##ID:003181##
+ mcset $l "Discard" \
+ "丢弃"
+ ##ID:003182##
+ mcset $l "Attention" \
+ "Attention" ;# <-- NOT TRANSLATED YET
+ ##ID:003183##
+ mcset $l "You have to chose one action" \
+ "You have to chose one action" ;# <-- NOT TRANSLATED YET
+ ##ID:003184##
+ mcset $l "Exit program - MCU 8051 IDE" \
+ "退出程序 - MCU 8051 IDE"
+ ##ID:003185##
+ mcset $l "Simulator is not started" \
+ "模拟器没有启动"
+ ##ID:003186##
+ mcset $l "Simulator is busy" \
+ "模拟器正在运行"
+ ##ID:003187##
+ mcset $l "Recompile ?" \
+ "重新编译>"
+ ##ID:003188##
+ mcset $l "MD5 hashes verification failed. That probably means than some source files have been modified since last compilation.\n\nDo you want to recompile the code ?" \
+ "MD5 hashes verification failed. That probably means than some source files have been modified since last compilation.\n\nDo you want to recompile the code ?" ;
+ ##ID:003189##
+ mcset $l "File not found" \
+ "无法找到文件"
+ ##ID:003190##
+ mcset $l "Simulator data file not found.\nDo you want create it ?" \
+ "Simulator data file not found.\nDo you want create it ?" ;# <-- NOT TRANSLATED YET
+ ##ID:003191##
+ mcset $l "Unable to start simulator" \
+ "Unable to start simulator" ;# <-- NOT TRANSLATED YET
+ ##ID:003192##
+ mcset $l "Unable to read simulator file. Possibly you have disabled generation of simulator file in compiler configuration dialog." \
+ "Unable to read simulator file. Possibly you have disabled generation of simulator file in compiler configuration dialog." ;# <-- NOT TRANSLATED YET
+ ##ID:003193##
+ mcset $l "Unable to find hex file" \
+ "Unable to find hex file" ;# <-- NOT TRANSLATED YET
+ ##ID:003194##
+ mcset $l "Unable to open:\n'%s'" \
+ "无法打开文件:\n'%s'"
+ ##ID:003195##
+ mcset $l "Unable to gain unlimited access to the given file" \
+ "Unable to gain unlimited access to the given file" ;# <-- NOT TRANSLATED YET
+ ##ID:003196##
+ mcset $l "Parsing file ..." \
+ "分析文件 ..."
+ ##ID:003197##
+ mcset $l "Unable to open file:\n\"%s\"\nfor writing" \
+ "Unable to open file:\n\"%s\"\nfor writing" ;# <-- NOT TRANSLATED YET
+ ##ID:003198##
+ mcset $l "Error(s) occurred while parsing IHEX file - %s" \
+ "Error(s) occurred while parsing IHEX file - %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003199##
+ mcset $l "grab release %s; destroy %s" \
+ "grab release %s; destroy %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003200##
+ mcset $l "Input file" \
+ "Input file" ;# <-- NOT TRANSLATED YET
+ ##ID:003201##
+ mcset $l "Output file" \
+ "Output file" ;# <-- NOT TRANSLATED YET
+ ##ID:003202##
+ mcset $l "File where to save result" \
+ "File where to save result" ;# <-- NOT TRANSLATED YET
+ ##ID:003203##
+ mcset $l "Invoke dialog to select output file" \
+ "调用界面,选择输出文件"
+ ##ID:003204##
+ mcset $l "Convert Binary file to Intel HEX 8 - MCU 8051 IDE" \
+ "Convert Binary file to Intel HEX 8 - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003205##
+ mcset $l "Convert Intel HEX 8 to binary file - MCU 8051 IDE" \
+ "Convert Intel HEX 8 to binary file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003206##
+ mcset $l "Convert sim file to Intel HEX 8 - MCU 8051 IDE" \
+ "Convert sim file to Intel HEX 8 - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003207##
+ mcset $l "Both entries must be filled" \
+ "这两个条目必须填写"
+ ##ID:003208##
+ mcset $l "Unable to open file '%s'" \
+ "无法打开文件 '%s'"
+ ##ID:003209##
+ mcset $l "Loading file ..." \
+ "正在打开文件 ..."
+ ##ID:003210##
+ mcset $l "Saving file ..." \
+ "正在保存文件 ..."
+ ##ID:003211##
+ mcset $l "Corrupted file - MCU 8051 IDE" \
+ "Corrupted file - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003212##
+ mcset $l "IHEX 8" \
+ "IHEX 8" ;# <-- NOT TRANSLATED YET
+ ##ID:003213##
+ mcset $l "The selected file %s does not exist." \
+ "The selected file %s does not exist." ;# <-- NOT TRANSLATED YET
+ ##ID:003214##
+ mcset $l "Disassembly failed" \
+ "Decompilation failed" ;# <-- NOT TRANSLATED YET
+ ##ID:003215##
+ mcset $l "Decompilation failed -- see messages for details" \
+ "Decompilation failed -- see messages for details" ;# <-- NOT TRANSLATED YET
+ ##ID:003216##
+ mcset $l "\nLoading IHEX file ..." \
+ "\nLoading IHEX file ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003217##
+ mcset $l "Unable to open file" \
+ "无法打开文件"
+ ##ID:003218##
+ mcset $l "Unable to read file '%s'" \
+ "无法读取文件 '%s'"
+ ##ID:003219##
+ mcset $l "Successful" \
+ "成功"
+ ##ID:003220##
+ mcset $l "FAILED" \
+ "失败"
+ ##ID:003221##
+ mcset $l "About dialog" \
+ "关于界面"
+ ##ID:003222##
+ mcset $l "About" \
+ "关于"
+ ##ID:003223##
+ mcset $l "An open source IDE for MCS-51 based microconrollers for POSIX Systems, this software is licenced under the GNU GPL v2 licence. You can find more at the project web page http://mcu8051ide.sourceforge.net\n" \
+ "An open source IDE for MCS-51 based microconrollers for POSIX Systems, this software is licenced under the GNU GPL v2 licence. You can find more at the project web page http://mcu8051ide.sourceforge.net\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003224##
+ mcset $l "You are currently using version for Microsoft® Windows®.\n" \
+ "You are currently using version for Microsoft® Windows®.\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003226##
+ mcset $l "Web: http://mcu8051ide.sourceforge.net\n" \
+ "Web: http://mcu8051ide.sourceforge.net\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003227##
+ mcset $l "Thanks to SDCC development team for their great work !\n" \
+ "Thanks to SDCC development team for their great work !\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003228##
+ mcset $l "Thanks to %s for their help during development\n" \
+ "Thanks to %s for their help during development\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003229##
+ mcset $l "Thanks to" \
+ "Thanks to" ;# <-- NOT TRANSLATED YET
+ ##ID:003230##
+ mcset $l "SDCC developers:\n" \
+ "SDCC developers:\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003231##
+ mcset $l "\n(Please post suggestions to %s)\n" \
+ "\n(Please post suggestions to %s)\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003232##
+ mcset $l "FILE \"license.txt\" WAS NOT FOUND\n\n" \
+ "FILE \"license.txt\" WAS NOT FOUND\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003233##
+ mcset $l "Text of the license agreement is not available,\n" \
+ "Text of the license agreement is not available,\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003234##
+ mcset $l "please check your installation." \
+ "please check your installation." ;# <-- NOT TRANSLATED YET
+ ##ID:003235##
+ mcset $l "About - MCU 8051 IDE" \
+ "关于 - MCU 8051 IDE"
+ ##ID:003236##
+ mcset $l "Unable to indent C source without program indent, please install indent and restart MCU 8051 IDE." \
+ "Unable to indent C source without program indent, please install indent and restart MCU 8051 IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:003237##
+ mcset $l "Unable to indent C source code.\n\n%s" \
+ "无法缩进C源代码.\n\n%s"
+ ##ID:003238##
+ mcset $l "Reformatting code" \
+ "格式化代码"
+ ##ID:003239##
+ mcset $l "Options dialog" \
+ "选项界面"
+ ##ID:003240##
+ mcset $l "Backup files" \
+ "备份文件"
+ ##ID:003241##
+ mcset $l "Other files" \
+ "其他文件"
+ ##ID:003242##
+ mcset $l "Remove files" \
+ "删除文件"
+ ##ID:003243##
+ mcset $l "Cleanup project folder - MCU 8051 IDE" \
+ "清理项目文件夹 - MCU 8051 IDE"
+ ##ID:003244##
+ mcset $l "Cleanup project folder" \
+ "清理项目文件夹"
+ ##ID:003245##
+ mcset $l "Are you sure ?" \
+ "您确定吗?"
+ ##ID:003246##
+ mcset $l "These files will be removed" \
+ "These files will be removed" ;# <-- NOT TRANSLATED YET
+ ##ID:003247##
+ mcset $l "Proceed" \
+ "Proceed" ;# <-- NOT TRANSLATED YET
+ ##ID:003248##
+ mcset $l "%d file(s) removed." \
+ "%d file(s) removed." ;# <-- NOT TRANSLATED YET
+ ##ID:003249##
+ mcset $l "Confirm termination - MCU 8051 IDE" \
+ "终止确认 - MCU 8051 IDE"
+ ##ID:003250##
+ mcset $l "This process is already in progress. Do you want to terminate it ?" \
+ "这个过程已经在进行中,您想终止它吗?"
+ ##ID:003251##
+ mcset $l "Confirmation required" \
+ "需要确认"
+ ##ID:003252##
+ mcset $l "Do you really want to execute\ncustom command %s ?" \
+ "您真的要执行\n自定义命令 %s ?"
+ ##ID:003253##
+ mcset $l "Warning - Custom command" \
+ "警告 - 自定义命令"
+ ##ID:003254##
+ mcset $l "Some variables in user command could not be resolved." \
+ "Some variables in user command could not be resolved." ;# <-- NOT TRANSLATED YET
+ ##ID:003255##
+ mcset $l "Custom command finished" \
+ "自定义命令完成"
+ ##ID:003256##
+ mcset $l "Custom command failed" \
+ "自定义命令失败"
+ ##ID:003257##
+ mcset $l "Custom command %s - MCU 8051 IDE" \
+ "自定义命令 %s - MCU 8051 IDE"
+ ##ID:004500##
+ mcset $l "Unknow error" \
+ "Unknow error" ;# <-- NOT TRANSLATED YET
+ ##ID:004501##
+ mcset $l "Unable to execute your script in the urxvt terminal emulator." \
+ "Unable to execute your script in the urxvt terminal emulator." ;# <-- NOT TRANSLATED YET
+ ##ID:004502##
+ mcset $l "Kill the script?" \
+ "Kill the script?" ;# <-- NOT TRANSLATED YET
+ ##ID:004503##
+ mcset $l "Closing this window terminates all child processes of the terminal.\n\nDo you want to proceed?" \
+ "Closing this window terminates all child processes of the terminal.\n\nDo you want to proceed?" ;# <-- NOT TRANSLATED YET
+ ##ID:003258##
+ mcset $l "Welcome dialog" \
+ "欢迎界面"
+ ##ID:003259##
+ mcset $l "Welcome to MCU 8051 IDE !" \
+ "欢迎使用 8051 IDE !"
+ ##ID:003260##
+ mcset $l "Click here to open demonstration project." \
+ "Click here to open demonstration project." ;# <-- NOT TRANSLATED YET
+ ##ID:003261##
+ mcset $l "MCU 8051 IDE is a fully featured Integrated Development Environment" \
+ "MCU 8051 IDE is fully featured Integrated Development Environment" ;# <-- NOT TRANSLATED YET
+ ##ID:003262##
+ mcset $l " for MCS-51 based microcontrollers. It's written for POSIX Operating Systems (GNU/Linux, etc.) " \
+ " for MCS-51 based microcontrollers. It's written for POSIX Operating Systems (GNU/Linux, etc.) " ;# <-- NOT TRANSLATED YET
+ ##ID:003263##
+ mcset $l "and since version 1.3.5 it is also available for Microsoft® Windows® operating system." \
+ "and since version 1.3.5 it is also available for Microsoft® Windows® operating system." ;# <-- NOT TRANSLATED YET
+ ##ID:003264##
+ mcset $l "Main features:" \
+ "Main features:" ;# <-- NOT TRANSLATED YET
+ ##ID:003265##
+ mcset $l "Editor with syntax highlight, validation and popup-based completion\n\t" \
+ "Editor with syntax highlight, validation and popup-based completion\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003266##
+ mcset $l "MCS-51 Assembler and Disassembler\n\t" \
+ "MCS-51 Assembler and Disassembler\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003267##
+ mcset $l "MCS-51 Simulator (not all MCUs are fully supported !)\n\t" \
+ "MCS-51 Simulator (not all MCUs are fully supported !)\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003268##
+ mcset $l "Support for C language (using C compiler SDCC)\n\t" \
+ "Support for C language (using C compiler SDCC)\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003269##
+ mcset $l "Partial support for some HW tools\n\t" \
+ "Partial support for some HW tools\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003270##
+ mcset $l "Project management\n\t" \
+ "Project management\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003271##
+ mcset $l "Custom editable commands (using shell scripts)\n\t" \
+ "Custom editable commands (using shell scripts)\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003272##
+ mcset $l "Dynamic help for instruction at the current line\n\t" \
+ "Dynamic help for instruction at the current line\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003273##
+ mcset $l "Hexadecimal editor for eXternal RAM, Expanded RAM, Code memory, etc.\n\t" \
+ "Hexadecimal editor for eXternal RAM, Expanded RAM, Code memory, etc.\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003274##
+ mcset $l "Scientific calculator\n\t" \
+ "Scientific calculator\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003275##
+ mcset $l "Simple hardware simulation (LED's, etc.)\n\t" \
+ "Simple hardware simulation (LED's, etc.)\n\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003276##
+ mcset $l "Graph showing voltage levels on ports\n\n" \
+ "Graph showing voltage levels on ports\n\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003277##
+ mcset $l "Where to start:" \
+ "Where to start:" ;# <-- NOT TRANSLATED YET
+ ##ID:003278##
+ mcset $l "\n\t1. Create a new project" \
+ "\n\t1. Create a new project" ;# <-- NOT TRANSLATED YET
+ ##ID:003279##
+ mcset $l "Enter project name\n\t\t" \
+ "Enter project name\n\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003280##
+ mcset $l "Choose project directory\n\t\t" \
+ "Choose project directory\n\t\t" ;# <-- NOT TRANSLATED YET
+ ##ID:003281##
+ mcset $l "Choose microcontroller (e.g. AT89S52)\n" \
+ "Choose microcontroller (e.g. AT89S52)\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003282##
+ mcset $l "\t2. Write your code in the opened editor and click on " \
+ "\t2. Write your code in the opened editor and click on " ;# <-- NOT TRANSLATED YET
+ ##ID:003283##
+ mcset $l " to start the simulator\n" \
+ " to start the simulator\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003284##
+ mcset $l "\t3. Step through your program by clicking on " \
+ "\t3. Step through your program by clicking on " ;# <-- NOT TRANSLATED YET
+ ##ID:003285##
+ mcset $l "Web site:" \
+ "Web site:" ;# <-- NOT TRANSLATED YET
+ ##ID:003286##
+ mcset $l "Author:" \
+ "Author:" ;# <-- NOT TRANSLATED YET
+ ##ID:003287##
+ mcset $l "Thank you for using/trying MCU 8051 IDE." \
+ "Thank you for using/trying MCU 8051 IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:003288##
+ mcset $l "Welcome to MCU 8051 IDE" \
+ "欢迎使用 MCU 8051 IDE"
+ ##ID:003289##
+ mcset $l "Change letter case" \
+ "变更字母大小写"
+ ##ID:003290##
+ mcset $l "U" \
+ "U" ;# <-- NOT TRANSLATED YET
+ ##ID:003291##
+ mcset $l "L" \
+ "L" ;# <-- NOT TRANSLATED YET
+ ##ID:003292##
+ mcset $l "All " \
+ "All " ;# <-- NOT TRANSLATED YET
+ ##ID:003293##
+ mcset $l "Change letter case - MCU 8051 IDE" \
+ "变更字母大小写 - MCU 8051 IDE"
+ ##ID:003294##
+ mcset $l "Formatting ..." \
+ "Formatting ..." ;# <-- NOT TRANSLATED YET
+ ##ID:003295##
+ mcset $l "File name:" \
+ "File name:" ;# <-- NOT TRANSLATED YET
+ ##ID:003296##
+ mcset $l "Path:" \
+ "Path:" ;# <-- NOT TRANSLATED YET
+ ##ID:003297##
+ mcset $l "MCU:" \
+ "MCU:" ;# <-- NOT TRANSLATED YET
+ ##ID:003298##
+ mcset $l "XDATA:" \
+ "XDATA:" ;# <-- NOT TRANSLATED YET
+ ##ID:003299##
+ mcset $l "XCODE:" \
+ "XCODE:" ;# <-- NOT TRANSLATED YET
+ ##ID:003300##
+ mcset $l "Clock:" \
+ "Clock:" ;# <-- NOT TRANSLATED YET
+ ##ID:003301##
+ mcset $l "Default clock used by simulator engine" \
+ "Default clock used by simulator engine" ;# <-- NOT TRANSLATED YET
+ ##ID:003302##
+ mcset $l "Version:" \
+ "Version:" ;# <-- NOT TRANSLATED YET
+ ##ID:003303##
+ mcset $l "Project version (any string)" \
+ "Project version (any string)" ;# <-- NOT TRANSLATED YET
+ ##ID:003304##
+ mcset $l "Date:" \
+ "Date:" ;# <-- NOT TRANSLATED YET
+ ##ID:003305##
+ mcset $l "Project last update" \
+ "Project last update" ;# <-- NOT TRANSLATED YET
+ ##ID:003306##
+ mcset $l "Fill date entry with the current date" \
+ "Fill date entry with the current date" ;# <-- NOT TRANSLATED YET
+ ##ID:003307##
+ mcset $l "License:" \
+ "License:" ;# <-- NOT TRANSLATED YET
+ ##ID:003308##
+ mcset $l "Name of the license" \
+ "Name of the license" ;# <-- NOT TRANSLATED YET
+ ##ID:003309##
+ mcset $l "Copyright:" \
+ "Copyright:" ;# <-- NOT TRANSLATED YET
+ ##ID:003310##
+ mcset $l "Copyright information" \
+ "Copyright information" ;# <-- NOT TRANSLATED YET
+ ##ID:003311##
+ mcset $l "< Undefined >" \
+ "< Undefined >" ;# <-- NOT TRANSLATED YET
+ ##ID:003312##
+ mcset $l "%s - EEPROM write buffer" \
+ "%s - EEPROM write buffer" ;# <-- NOT TRANSLATED YET
+ ##ID:003313##
+ mcset $l "OFFSET = " \
+ "OFFSET = " ;# <-- NOT TRANSLATED YET
+ ##ID:003314##
+ mcset $l "Cursor: " \
+ "光标"
+ ##ID:003315##
+ mcset $l "EEPROM write buffer - %s - MCU 8051 IDE" \
+ "EEPROM写缓冲区 - %s - MCU 8051 IDE"
+ ##ID:003316##
+ mcset $l "This operation cannot be performed on an untitled file" \
+ "此操作无法对一个未命名的文件执行"
+ ##ID:003317##
+ mcset $l "This file does not contain any part of the running program" \
+ "此文件正在被其他程序使用"
+ ##ID:003319##
+ mcset $l "Line to address" \
+ "Line to address" ;# <-- NOT TRANSLATED YET
+ ##ID:003320##
+ mcset $l "PC = " \
+ "PC = " ;# <-- NOT TRANSLATED YET
+ ##ID:003321##
+ mcset $l "Program jump" \
+ "程序跳转"
+ ##ID:003322##
+ mcset $l "Subprogram call" \
+ "子程序调用"
+ ##ID:003323##
+ mcset $l "Graphical representation of the line where to go" \
+ "Graphical representation of the line where to go" ;# <-- NOT TRANSLATED YET
+ ##ID:003324##
+ mcset $l "Line where to go" \
+ "Line where to go" ;# <-- NOT TRANSLATED YET
+ ##ID:003325##
+ mcset $l "Unable to resolve" \
+ "无法解释"
+ ##ID:003326##
+ mcset $l "Hibernate running program - MCU 8051 IDE" \
+ "Hibernate running program - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003327##
+ mcset $l "Resume hibernated program - MCU 8051 IDE" \
+ "Resume hibernated program - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:003328##
+ mcset $l "Hibernation failed" \
+ "休眠失败"
+ ##ID:003329##
+ mcset $l "Unable to write to file:\n%s\nCheck your permissions." \
+ "Unable to write to file:\n%s\nCheck your permissions." ;# <-- NOT TRANSLATED YET
+ ##ID:003330##
+ mcset $l "Resumption failed" \
+ "恢复失败"
+ ##ID:003331##
+ mcset $l "Unable to read file:\n%s\nCheck your permissions." \
+ "Unable to read file:\n%s\nCheck your permissions." ;# <-- NOT TRANSLATED YET
+ ##ID:003332##
+ mcset $l "This hibernation is corrupted or it is not MCU 8051 IDE M5IHIB file." \
+ "This hibernation is corrupted or it is not MCU 8051 IDE M5IHIB file." ;# <-- NOT TRANSLATED YET
+ ##ID:003333##
+ mcset $l "Unable to change directory to '%s'." \
+ "无法更改目录 '%s'."
+ ##ID:003334##
+ mcset $l "\nUnable to change directory to '%s'\n" \
+ "\n无法更改目录 '%s'\n"
+ ##ID:003335##
+ mcset $l "Unable to find Doxygen" \
+ "无法找到 Doxygen"
+ ##ID:003336##
+ mcset $l "Unable to find Doxygen. Please install doxygen and restart MCU 8051 IDE." \
+ "Unable to find Doxygen. Please install doxygen and restart MCU 8051 IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:003337##
+ mcset $l "Unable to find doxywizard" \
+ "无法找到 doxywizard"
+ ##ID:003338##
+ mcset $l "Unable to find doxywizard. Please install doxygen and restart MCU 8051 IDE." \
+ "Unable to find doxywizard. Please install doxygen and restart MCU 8051 IDE." ;# <-- NOT TRANSLATED YET
+ ##ID:003339##
+ mcset $l "\nError: Unable to change directory to '%s'\n" \
+ "\n错误: 无法更改目录 '%s'\n"
+ ##ID:003340##
+ mcset $l "Unable to gain file statistics while external editor is used" \
+ "Unable to gain file statistics while external editor is used" ;# <-- NOT TRANSLATED YET
+ ##ID:003341##
+ mcset $l "Characters" \
+ "字符"
+ ##ID:003342##
+ mcset $l "Words and numbers:" \
+ "文字和数字:"
+ ##ID:003343##
+ mcset $l "Alphanumeric characters and connector punctuation characters" \
+ "Alphanumeric characters and connector punctuation characters" ;# <-- NOT TRANSLATED YET
+ ##ID:003344##
+ mcset $l "Comments:" \
+ "Comments:" ;# <-- NOT TRANSLATED YET
+ ##ID:003345##
+ mcset $l "Characters highlighted as comments" \
+ "Characters highlighted as comments" ;# <-- NOT TRANSLATED YET
+ ##ID:003346##
+ mcset $l "Other characters:" \
+ "Other characters:" ;# <-- NOT TRANSLATED YET
+ ##ID:003347##
+ mcset $l "All other characters without EOLs (e.g. spaces and brackets)" \
+ "All other characters without EOLs (e.g. spaces and brackets)" ;# <-- NOT TRANSLATED YET
+ ##ID:003348##
+ mcset $l "Total characters:" \
+ "Total characters:" ;# <-- NOT TRANSLATED YET
+ ##ID:003349##
+ mcset $l "All characters in the text without EOLs" \
+ "All characters in the text without EOLs" ;# <-- NOT TRANSLATED YET
+ ##ID:003350##
+ mcset $l "Strings" \
+ "Strings" ;# <-- NOT TRANSLATED YET
+ ##ID:003351##
+ mcset $l "Words:" \
+ "Words:" ;# <-- NOT TRANSLATED YET
+ ##ID:003352##
+ mcset $l "Just normal words (not keywords and not comments)" \
+ "Just normal words (not keywords and not comments)" ;# <-- NOT TRANSLATED YET
+ ##ID:003353##
+ mcset $l "Keywords:" \
+ "Keywords:" ;# <-- NOT TRANSLATED YET
+ ##ID:003354##
+ mcset $l "Instructions, Assembler directives, C directives, C keywords" \
+ "Instructions, Assembler directives, C directives, C keywords" ;# <-- NOT TRANSLATED YET
+ ##ID:003355##
+ mcset $l "Words in comments" \
+ "Words in comments" ;# <-- NOT TRANSLATED YET
+ ##ID:003356##
+ mcset $l "Total strings:" \
+ "Total strings:" ;# <-- NOT TRANSLATED YET
+ ##ID:003357##
+ mcset $l "Total number of words in the text" \
+ "Total number of words in the text" ;# <-- NOT TRANSLATED YET
+ ##ID:003358##
+ mcset $l "Lines" \
+ "Lines" ;# <-- NOT TRANSLATED YET
+ ##ID:003359##
+ mcset $l "Empty lines:" \
+ "Empty lines:" ;# <-- NOT TRANSLATED YET
+ ##ID:003360##
+ mcset $l "Totally empty lines (without even spaces)" \
+ "Totally empty lines (without even spaces)" ;# <-- NOT TRANSLATED YET
+ ##ID:003361##
+ mcset $l "Commented lines:" \
+ "Commented lines:" ;# <-- NOT TRANSLATED YET
+ ##ID:003362##
+ mcset $l "Lines which are all commented" \
+ "Lines which are all commented" ;# <-- NOT TRANSLATED YET
+ ##ID:003363##
+ mcset $l "Normal lines:" \
+ "Normal lines:" ;# <-- NOT TRANSLATED YET
+ ##ID:003364##
+ mcset $l "Just normal code lines" \
+ "Just normal code lines" ;# <-- NOT TRANSLATED YET
+ ##ID:003365##
+ mcset $l "Total lines:" \
+ "Total lines:" ;# <-- NOT TRANSLATED YET
+ ##ID:003366##
+ mcset $l "Total number of lines in the text" \
+ "文本总行数"
+ ##ID:003367##
+ mcset $l "Copy" \
+ "复制"
+ ##ID:003368##
+ mcset $l "File statistics - MCU 8051 IDE" \
+ "文件统计 - MCU 8051 IDE"
+ ##ID:003369##
+ mcset $l "Statistics for: %s\n\n" \
+ "统计: %s\n\n"
+ ##ID:003370##
+ mcset $l "Characters:\n" \
+ "字符:\n"
+ ##ID:003371##
+ mcset $l " Words and numbers:\t\t%s\n" \
+ "文字和数字:\t\t%s\n"
+ ##ID:003372##
+ mcset $l " Comments:\t\t\t%s\n" \
+ "注释:\t\t\t%s\n"
+ ##ID:003373##
+ mcset $l " Other characters:\t\t%s\n" \
+ " 其他字符:\t\t%s\n"
+ ##ID:003374##
+ mcset $l " ------\n" \
+ " ------\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003375##
+ mcset $l " Total characters:\t\t%s\n\n" \
+ " 总字符:\t\t%s\n\n"
+ ##ID:003376##
+ mcset $l "Strings:\n" \
+ "Strings:\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003377##
+ mcset $l " Words:\t\t\t%s\n" \
+ " Words:\t\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003378##
+ mcset $l " Keywords:\t\t\t%s\n" \
+ " Keywords:\t\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003379##
+ mcset $l " Total strings:\t\t%s\n" \
+ " Total strings:\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003380##
+ mcset $l "Lines:\n" \
+ "Lines:\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003381##
+ mcset $l " Empty lines:\t\t\t%s\n" \
+ " Empty lines:\t\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003382##
+ mcset $l " Commented lines:\t\t%s\n" \
+ " Commented lines:\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003383##
+ mcset $l " Normal lines:\t\t\t%s\n" \
+ " Normal lines:\t\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003384##
+ mcset $l " Total lines:\t\t\t%s\n" \
+ " Total lines:\t\t\t%s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003385##
+ mcset $l "Unable to read file:\n\"%s\"" \
+ "无法读取文件:\n\"%s\""
+ ##ID:003386##
+ mcset $l "File modified" \
+ "文件修改"
+ ##ID:003387##
+ mcset $l "The current VHW connections have been modified,\ndo you want to save them before closing ?" \
+ "目前VHW连接已被修改,\n您要关闭之前保存它们?"
+ ##ID:003388##
+ mcset $l "Open file - Virtual HW - MCU 8051 IDE" \
+ "打开文件 - Virtual HW - MCU 8051 IDE"
+ ##ID:003389##
+ mcset $l "Virtual HW" \
+ "虚拟硬件"
+ ##ID:003390##
+ mcset $l "VH component" \
+ "VH component" ;# <-- NOT TRANSLATED YET
+ ##ID:004525##
+ mcset $l "All relevant" \
+ "All relevant" ;# <-- NOT TRANSLATED YET
+ ##ID:003391##
+ mcset $l "Load file - Virtual HW - MCU 8051 IDE" \
+ "加载 - 虚拟硬件 - MCU 8051 IDE"
+ ##ID:003392##
+ mcset $l "Unable to save Virtual HW connections" \
+ "无法保存虚拟硬件连接"
+ ##ID:003393##
+ mcset $l "Save file - Virtual HW - MCU 8051 IDE" \
+ "保存文件 - 虚拟硬件 - MCU 8051 IDE"
+ ##ID:003394##
+ mcset $l "A file name '%s' already exists. Do you want to overwrite it ?" \
+ "文件名 '%s' 已经存在,您想覆盖它吗?"
+ ##ID:003395##
+ mcset $l "Unable to save file:\n\"%s\"" \
+ "无法保存文件:\n\"%s\""
+ ##ID:003396##
+ mcset $l "Do you really want to remove all virtual hardware from the current simulation scenario ?" \
+ "您真的想删除目前所有虚拟硬件的模拟场景?"
+ ##ID:003397##
+ mcset $l "Set display size" \
+ "Set display size" ;# <-- NOT TRANSLATED YET
+}
+# simulator_gui.tcl
+# ==============================================================================
+namespace eval Simulator_GUI {
+ set ::SFB_TRANSLATIONS {
+ ##ID:003398##
+ mcset $l "Bit address: 0xD7 -- Carry Flag" \
+ "Bit address: 0xD7 -- Carry Flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003399##
+ mcset $l "Bit address: 0xD6 -- Auxiliary Carry Flag" \
+ "Bit address: 0xD6 -- Auxiliary Carry Flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003400##
+ mcset $l "Bit address: 0xD5 -- Flag 0 available to the user for general purpose" \
+ "Bit address: 0xD5 -- Flag 0 available to the user for general purpose" ;# <-- NOT TRANSLATED YET
+ ##ID:003401##
+ mcset $l "Bit address: 0xD4 -- Register Bank selector bit 1" \
+ "Bit address: 0xD4 -- Register Bank selector bit 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003402##
+ mcset $l "Bit address: 0xD3 -- Register Bank selector bit 0" \
+ "Bit address: 0xD3 -- Register Bank selector bit 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003403##
+ mcset $l "Bit address: 0xD2 -- Overflow Flag" \
+ "Bit address: 0xD2 -- Overflow Flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003404##
+ mcset $l "Bit address: 0xD1 -- Usable as a general purpose flag" \
+ "Bit address: 0xD1 -- Usable as a general purpose flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003405##
+ mcset $l "Bit address: 0xD0 -- Parity flag" \
+ "Bit address: 0xD0 -- Parity flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003406##
+ mcset $l "Bit address: 0x9F -- Framing Error bit" \
+ "Bit address: 0x9F -- Framing Error bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003407##
+ mcset $l "Bit address: 0x8F -- Timer 1 overflow flag" \
+ "Bit address: 0x8F -- Timer 1 overflow flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003408##
+ mcset $l "Bit address: 0x8E -- Timer 1 run control bit" \
+ "Bit address: 0x8E -- Timer 1 run control bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003409##
+ mcset $l "Bit address: 0x8D -- Timer 0 overflow flag" \
+ "Bit address: 0x8D -- Timer 0 overflow flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003410##
+ mcset $l "Bit address: 0x8C -- Timer 0 run control bit" \
+ "Bit address: 0x8C -- Timer 0 run control bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003411##
+ mcset $l "Bit address: 0x8B -- External Interrupt 1 edge flag" \
+ "Bit address: 0x8B -- External Interrupt 1 edge flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003412##
+ mcset $l "Bit address: 0x8A -- Interrupt 1 type control bit" \
+ "Bit address: 0x8A -- Interrupt 1 type control bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003413##
+ mcset $l "Bit address: 0x89 -- External Interrupt 0 edge flag" \
+ "Bit address: 0x89 -- External Interrupt 0 edge flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003414##
+ mcset $l "Bit address: 0x88 -- Interrupt 0 type control bit" \
+ "Bit address: 0x88 -- Interrupt 0 type control bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003415##
+ mcset $l "Bit address: 0xA8 -- Enable or disable External Interrupt 0" \
+ "Bit address: 0xA8 -- Enable or disable External Interrupt 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003416##
+ mcset $l "Bit address: 0xA9 -- Enable or disable the Timer 0 overflow interrupt" \
+ "Bit address: 0xA9 -- Enable or disable the Timer 0 overflow interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003417##
+ mcset $l "Bit address: 0xAA -- Enable or disable External Interrupt 1" \
+ "Bit address: 0xAA -- Enable or disable External Interrupt 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003418##
+ mcset $l "Bit address: 0xAB -- Enable or disable the Timer 1 overflow interrupt" \
+ "Bit address: 0xAB -- Enable or disable the Timer 1 overflow interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003419##
+ mcset $l "Bit address: 0xAC -- Enable or disable the serial port interrupt" \
+ "Bit address: 0xAC -- Enable or disable the serial port interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003420##
+ mcset $l "Bit address: 0xAD -- Enable or disable the Timer 2 overflow interrupt" \
+ "Bit address: 0xAD -- Enable or disable the Timer 2 overflow interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003421##
+ mcset $l "Bit address: 0xAE -- Enable or disable the comparator interrupt" \
+ "Bit address: 0xAE -- Enable or disable the comparator interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003422##
+ mcset $l "Bit address: 0xB8 -- Defines the External Interrupt 0 priority level" \
+ "Bit address: 0xB8 -- Defines the External Interrupt 0 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003423##
+ mcset $l "Bit address: 0xB9 -- Defines the Timer 0 interrupt priority level" \
+ "Bit address: 0xB9 -- Defines the Timer 0 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003424##
+ mcset $l "Bit address: 0xBA -- Defines External Interrupt 1 priority level" \
+ "Bit address: 0xBA -- Defines External Interrupt 1 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003425##
+ mcset $l "Bit address: 0xBB -- Defines the Timer 1 interrupt priority level" \
+ "Bit address: 0xBB -- Defines the Timer 1 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003426##
+ mcset $l "Bit address: 0xBC -- Defines the Serial Port interrupt priority level" \
+ "Bit address: 0xBC -- Defines the Serial Port interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003427##
+ mcset $l "Bit address: 0xBD -- Defines the Timer 2 interrupt priority level" \
+ "Bit address: 0xBD -- Defines the Timer 2 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003428##
+ mcset $l "Bit address: 0xBE -- Defines the comparator interrupt priority level" \
+ "Bit address: 0xBE -- Defines the comparator interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003429##
+ mcset $l "Bit address: 0x98 -- Receive interrupt flag" \
+ "Bit address: 0x98 -- Receive interrupt flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003430##
+ mcset $l "Bit address: 0x99 -- Transmit interrupt flag" \
+ "Bit address: 0x99 -- Transmit interrupt flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003431##
+ mcset $l "Bit address: 0xCF -- Timer 2 overflow flag" \
+ "Bit address: 0xCF -- Timer 2 overflow flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003432##
+ mcset $l "Bit address: 0xCE -- Timer 2 external flag" \
+ "Bit address: 0xCE -- Timer 2 external flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003433##
+ mcset $l "Bit address: 0xBF -- Not implemented" \
+ "Bit address: 0xBF -- Not implemented" ;# <-- NOT TRANSLATED YET
+ ##ID:003434##
+ mcset $l "Bit address: 0xAF -- Disables all interrupts" \
+ "Bit address: 0xAF -- Disables all interrupts" ;# <-- NOT TRANSLATED YET
+ ##ID:003435##
+ mcset $l "Bit address: 0x9F -- Serial Port mode specifier" \
+ "Bit address: 0x9F -- Serial Port mode specifier" ;# <-- NOT TRANSLATED YET
+ ##ID:003436##
+ mcset $l "Bit address: 0x9E -- Serial Port mode specifier" \
+ "Bit address: 0x9E -- Serial Port mode specifier" ;# <-- NOT TRANSLATED YET
+ ##ID:003437##
+ mcset $l "Bit address: 0x9D -- Enables the multiprocessor communication feature" \
+ "Bit address: 0x9D -- Enables the multiprocessor communication feature" ;# <-- NOT TRANSLATED YET
+ ##ID:003438##
+ mcset $l "Bit address: 0x9C -- Enable/Disable reception" \
+ "Bit address: 0x9C -- Enable/Disable reception" ;# <-- NOT TRANSLATED YET
+ ##ID:003439##
+ mcset $l "Bit address: 0x9B -- The 9th bit that will be transmitted in modes 2 and 3" \
+ "Bit address: 0x9B -- The 9th bit that will be transmitted in modes 2 and 3" ;# <-- NOT TRANSLATED YET
+ ##ID:003440##
+ mcset $l "Bit address: 0x9A -- Receiver Bit 8" \
+ "Bit address: 0x9A -- Receiver Bit 8" ;# <-- NOT TRANSLATED YET
+ ##ID:003441##
+ mcset $l "Bit address: 0xCD -- Receive clock enable" \
+ "Bit address: 0xCD -- Receive clock enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003442##
+ mcset $l "Bit address: 0xCC -- Transmit clock enable" \
+ "Bit address: 0xCC -- Transmit clock enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003443##
+ mcset $l "Bit address: 0xCB -- Timer 2 external enable" \
+ "Bit address: 0xCB -- Timer 2 external enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003444##
+ mcset $l "Bit address: 0xCA -- Start/Stop control for Timer 2" \
+ "Bit address: 0xCA -- Start/Stop control for Timer 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003445##
+ mcset $l "Bit address: 0xC9 -- Timer or counter select for Timer 2" \
+ "Bit address: 0xC9 -- Timer or counter select for Timer 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003446##
+ mcset $l "Bit address: 0xC8 -- Capture/Reload select" \
+ "Bit address: 0xC8 -- Capture/Reload select" ;# <-- NOT TRANSLATED YET
+ }
+ eval ${SFB_TRANSLATIONS}
+ ##ID:003447##
+ mcset $l "Set to 1" \
+ "Set to 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003448##
+ mcset $l "Set this bit to 1" \
+ "Set this bit to 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003449##
+ mcset $l "Set to 0" \
+ "Set to 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003450##
+ mcset $l "Set this bit to 0" \
+ "Set this bit to 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003451##
+ mcset $l "Start/Stop simulator" \
+ "启动/停止 模拟器" ;
+ ##ID:003452##
+ mcset $l "Load program into the simulator engine, or shutdown the MCU simulator." \
+ "加载SIM文件到模拟器" ;
+ ##ID:003453##
+ mcset $l "Reset" \
+ "复位"
+ ##ID:003454##
+ mcset $l "Perform HW reset" \
+ "执行硬件复位"
+ ##ID:003455##
+ mcset $l "Step back" \
+ "Step back" ;# <-- NOT TRANSLATED YET
+ ##ID:003456##
+ mcset $l "Take MCU back to state before the last instruction" \
+ "Take MCU back to state before the last instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003457##
+ mcset $l "Step program" \
+ "Step program" ;# <-- NOT TRANSLATED YET
+ ##ID:003458##
+ mcset $l "Step by 1 instruction" \
+ "Step by 1 instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003459##
+ mcset $l "Step over" \
+ "Step over" ;# <-- NOT TRANSLATED YET
+ ##ID:003460##
+ mcset $l "Step by 1 line of code" \
+ "Step by 1 line of code" ;# <-- NOT TRANSLATED YET
+ ##ID:003461##
+ mcset $l "Animate program" \
+ "Animate program" ;# <-- NOT TRANSLATED YET
+ ##ID:003462##
+ mcset $l "Run program and show results after each instruction" \
+ "Run program and show results after each instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003463##
+ mcset $l "Run program" \
+ "运行程序"
+ ##ID:003464##
+ mcset $l "Run program and show results after some time" \
+ "Run program and show results after some time" ;# <-- NOT TRANSLATED YET
+ ##ID:003465##
+ mcset $l "TIMERS 0 & 1" \
+ "TIMERS 0 & 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003466##
+ mcset $l "INTERRUPTS" \
+ "INTERRUPTS" ;# <-- NOT TRANSLATED YET
+ ##ID:003467##
+ mcset $l "HEX DEC BIN OCT CHAR" \
+ "HEX DEC BIN OCT CHAR" ;# <-- NOT TRANSLATED YET
+ ##ID:003468##
+ mcset $l "SFR 0xE0: Primary Accumulator" \
+ "SFR 0xE0: Primary Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:003469##
+ mcset $l "SFR 0xF0: Secondary Accumulator" \
+ "SFR 0xF0: Secondary Accumulator" ;# <-- NOT TRANSLATED YET
+ ##ID:003470##
+ mcset $l "Address: %s" \
+ "Address: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003471##
+ mcset $l "SFR 0xD0: Program Status Word" \
+ "SFR 0xD0: Program Status Word" ;# <-- NOT TRANSLATED YET
+ ##ID:003472##
+ mcset $l "SFR 0x81: Stack pointer" \
+ "SFR 0x81: Stack pointer" ;# <-- NOT TRANSLATED YET
+ ##ID:003473##
+ mcset $l "Carry Flag" \
+ "Carry Flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003474##
+ mcset $l "Auxiliary Carry flag.\n(For BCD operations.)" \
+ "Auxiliary Carry flag.\n(For BCD operations.)" ;# <-- NOT TRANSLATED YET
+ ##ID:003475##
+ mcset $l "Flag 0\n(Available to the user for general purposes.)" \
+ "Flag 0\n(Available to the user for general purposes.)" ;# <-- NOT TRANSLATED YET
+ ##ID:003476##
+ mcset $l "Register bank Select control bit 1. Set/cleared\nby software to determine working register bank." \
+ "Register bank Select control bit 1. Set/cleared\nby software to determine working register bank." ;# <-- NOT TRANSLATED YET
+ ##ID:003477##
+ mcset $l "Register bank Select control bit 0. Set/cleared\nby software to determine working register bank." \
+ "Register bank Select control bit 0. Set/cleared\nby software to determine working register bank." ;# <-- NOT TRANSLATED YET
+ ##ID:003478##
+ mcset $l "Overflow flag" \
+ "Overflow flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003479##
+ mcset $l "(reserved)" \
+ "(reserved)" ;# <-- NOT TRANSLATED YET
+ ##ID:003480##
+ mcset $l "Parity flag.\nSet/cleared by hardware each instruction cycle to\nindicate and odd/even number of “one” bits in the\naccumulator, i.e., even parity." \
+ "Parity flag.\nSet/cleared by hardware each instruction cycle to\nindicate and odd/even number of “one” bits in the\naccumulator, i.e., even parity." ;# <-- NOT TRANSLATED YET
+ ##ID:003481##
+ mcset $l "SFR 0x88: Timer/Counter control register" \
+ "SFR 0x88: Timer/Counter control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003482##
+ mcset $l "Timer 1 Overflow Flag\nCleared by hardware when processor vectors to interrupt routine.\nSet by hardware on timer/counter overflow, when the timer 1 register overflows." \
+ "Timer 1 Overflow Flag\nCleared by hardware when processor vectors to interrupt routine.\nSet by hardware on timer/counter overflow, when the timer 1 register overflows." ;# <-- NOT TRANSLATED YET
+ ##ID:003483##
+ mcset $l "Timer 1 Run Control Bit\nClear to turn off timer/counter 1.\nSet to turn on timer/counter 1." \
+ "Timer 1 Run Control Bit\nClear to turn off timer/counter 1.\nSet to turn on timer/counter 1." ;# <-- NOT TRANSLATED YET
+ ##ID:003484##
+ mcset $l "Timer 0 Overflow Flag\nCleared by hardware when processor vectors to interrupt routine.\nSet by hardware on timer/counter overflow, when the timer 0 register overflows." \
+ "Timer 0 Overflow Flag\nCleared by hardware when processor vectors to interrupt routine.\nSet by hardware on timer/counter overflow, when the timer 0 register overflows." ;# <-- NOT TRANSLATED YET
+ ##ID:003485##
+ mcset $l "Timer 0 Run Control Bit\nClear to turn off timer/counter 0.\nSet to turn on timer/counter 0." \
+ "Timer 0 Run Control Bit\nClear to turn off timer/counter 0.\nSet to turn on timer/counter 0." ;# <-- NOT TRANSLATED YET
+ ##ID:003486##
+ mcset $l "Interrupt 1 Edge Flag\nCleared by hardware when interrupt is processed if edge-triggered (see IT1).\nSet by hardware when external interrupt is detected on INT1# pin." \
+ "Interrupt 1 Edge Flag\nCleared by hardware when interrupt is processed if edge-triggered (see IT1).\nSet by hardware when external interrupt is detected on INT1# pin." ;# <-- NOT TRANSLATED YET
+ ##ID:003487##
+ mcset $l "Interrupt 1 Type Control Bit\nClear to select low level active (level triggered) for external interrupt 1 (INT1#).\nSet to select falling edge active (edge triggered) for external interrupt 1." \
+ "Interrupt 1 Type Control Bit\nClear to select low level active (level triggered) for external interrupt 1 (INT1#).\nSet to select falling edge active (edge triggered) for external interrupt 1." ;# <-- NOT TRANSLATED YET
+ ##ID:003488##
+ mcset $l "Interrupt 0 Edge Flag\nCleared by hardware when interrupt is processed if edge-triggered (see IT0).\nSet by hardware when external interrupt is detected on INT0# pin." \
+ "Interrupt 0 Edge Flag\nCleared by hardware when interrupt is processed if edge-triggered (see IT0).\nSet by hardware when external interrupt is detected on INT0# pin." ;# <-- NOT TRANSLATED YET
+ ##ID:003489##
+ mcset $l "Interrupt 0 Type Control Bit\nClear to select low level active (level triggered) for external interrupt 0 (INT0#).\nSet to select falling edge active (edge triggered) for external interrupt 0." \
+ "Interrupt 0 Type Control Bit\nClear to select low level active (level triggered) for external interrupt 0 (INT0#).\nSet to select falling edge active (edge triggered) for external interrupt 0." ;# <-- NOT TRANSLATED YET
+ ##ID:003490##
+ mcset $l "Timer 1 Gating Control Bit" \
+ "Timer 1 Gating Control Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003491##
+ mcset $l "Timer 1 Counter/Timer Select Bit" \
+ "Timer 1 Counter/Timer Select Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003492##
+ mcset $l "Timer 1 Mode Select Bit" \
+ "Timer 1 Mode Select Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003493##
+ mcset $l "Timer 0 Gating Control Bit" \
+ "Timer 0 Gating Control Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003494##
+ mcset $l "Timer 0 Counter/Timer Select Bit" \
+ "Timer 0 Counter/Timer Select Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003495##
+ mcset $l "Timer 0 Mode Select Bit" \
+ "Timer 0 Mode Select Bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003496##
+ mcset $l "SFR 0x89: Timer/Counter mode control register" \
+ "SFR 0x89: Timer/Counter mode control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003497##
+ mcset $l "Timer 1 Gating Control Bit\nClear to enable timer 1 whenever the TR1 bit is set.\nSet to enable timer 1 only while the INT1# pin is high and TR1 bit is set." \
+ "Timer 1 Gating Control Bit\nClear to enable timer 1 whenever the TR1 bit is set.\nSet to enable timer 1 only while the INT1# pin is high and TR1 bit is set." ;# <-- NOT TRANSLATED YET
+ ##ID:003498##
+ mcset $l "Timer 1 Counter/Timer Select Bit\nClear for timer operation: timer 1 counts the divided-down system clock.\nSet for Counter operation: timer 1 counts negative transitions on external pin T1." \
+ "Timer 1 Counter/Timer Select Bit\nClear for timer operation: timer 1 counts the divided-down system clock.\nSet for Counter operation: timer 1 counts negative transitions on external pin T1." ;# <-- NOT TRANSLATED YET
+ ##ID:003499##
+ mcset $l "Timer 1 Mode Select Bits\nM11\tM01\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH1) with 5-bit prescaler (TL1).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL1). Reloaded from TH1 at overflow.\n 1\t 1\tMode 3: timer 1 halted. Retains count." \
+ "Timer 1 Mode Select Bits\nM11\tM01\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH1) with 5-bit prescaler (TL1).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL1). Reloaded from TH1 at overflow.\n 1\t 1\tMode 3: timer 1 halted. Retains count." ;# <-- NOT TRANSLATED YET
+ ##ID:003500##
+ mcset $l "Timer 0 Gating Control Bit\nClear to enable timer 0 whenever the TR0 bit is set.\nSet to enable timer/counter 0 only while the INT0# pin is high and the TR0 bit is set." \
+ "Timer 0 Gating Control Bit\nClear to enable timer 0 whenever the TR0 bit is set.\nSet to enable timer/counter 0 only while the INT0# pin is high and the TR0 bit is set." ;# <-- NOT TRANSLATED YET
+ ##ID:003501##
+ mcset $l "Timer 0 Counter/Timer Select Bit\nClear for timer operation: timer 0 counts the divided-down system clock.\nSet for counter operation: timer 0 counts negative transitions on external pin T0." \
+ "Timer 0 Counter/Timer Select Bit\nClear for timer operation: timer 0 counts the divided-down system clock.\nSet for counter operation: timer 0 counts negative transitions on external pin T0." ;# <-- NOT TRANSLATED YET
+ ##ID:003502##
+ mcset $l "Timer 0 Mode Select Bit\nM1\tM0\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH0) with 5-bit prescaler (TL0).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL0). Reloaded from TH0 at overflow.\n 1\t 1\tMode 3: TL0 is an 8-bit timer/counter.\nTH0 is an 8-bit timer using timer 1’s TR0 and TF0 bits." \
+ "Timer 0 Mode Select Bit\nM1\tM0\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH0) with 5-bit prescaler (TL0).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL0). Reloaded from TH0 at overflow.\n 1\t 1\tMode 3: TL0 is an 8-bit timer/counter.\nTH0 is an 8-bit timer using timer 1’s TR0 and TF0 bits." ;# <-- NOT TRANSLATED YET
+ ##ID:003503##
+ mcset $l "Timer 0 Mode Select Bit\nM10\tM00\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH0) with 5-bit prescaler (TL0).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL0). Reloaded from TH0 at overflow.\n 1\t 1\tMode 3: TL0 is an 8-bit timer/counter.\nTH0 is an 8-bit timer using timer 1’s TR0 and TF0 bits." \
+ "Timer 0 Mode Select Bit\nM10\tM00\tOperating mode\n 0\t 0\tMode 0: 8-bit timer/counter (TH0) with 5-bit prescaler (TL0).\n 0\t 1\tMode 1: 16-bit timer/counter.\n 1\t 0\tMode 2: 8-bit auto-reload timer/counter (TL0). Reloaded from TH0 at overflow.\n 1\t 1\tMode 3: TL0 is an 8-bit timer/counter.\nTH0 is an 8-bit timer using timer 1’s TR0 and TF0 bits." ;# <-- NOT TRANSLATED YET
+ ##ID:003504##
+ mcset $l "SFR 0xA8: Interrupt enable register" \
+ "SFR 0xA8: Interrupt enable register" ;# <-- NOT TRANSLATED YET
+ ##ID:003505##
+ mcset $l "Global disable bit. If EA = O, all Interrupts are disabled. If EA = 1, each interrupt can be\nindividually enabled or disabled by setting or clearing its enable bit." \
+ "Global disable bit. If EA = O, all Interrupts are disabled. If EA = 1, each interrupt can be\nindividually enabled or disabled by setting or clearing its enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003506##
+ mcset $l "Timer 0 interrupt enable bit." \
+ "Timer 0 interrupt enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003507##
+ mcset $l "Timer 1 interrupt enable bit." \
+ "Timer 1 interrupt enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003508##
+ mcset $l "Timer 2 interrupt enable bit." \
+ "Timer 2 interrupt enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003509##
+ mcset $l "External interrupt 1 enable bit." \
+ "External interrupt 1 enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003510##
+ mcset $l "External interrupt O enable bit." \
+ "External interrupt O enable bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003511##
+ mcset $l "SFR 0xB8: Interrupt priority register" \
+ "SFR 0xB8: Interrupt priority register" ;# <-- NOT TRANSLATED YET
+ ##ID:003512##
+ mcset $l "Not implemented" \
+ "Not implemented" ;# <-- NOT TRANSLATED YET
+ ##ID:003513##
+ mcset $l "Timer 1 interrupt priority bit" \
+ "Timer 1 interrupt priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003514##
+ mcset $l "External interrupt 1 priority bit" \
+ "External interrupt 1 priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003515##
+ mcset $l "Timer 0 interrupt priority bit" \
+ "Timer 0 interrupt priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003516##
+ mcset $l "External interrupt 0 priority bit" \
+ "External interrupt 0 priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003517##
+ mcset $l "SFR 0x98: Serial port control register" \
+ "SFR 0x98: Serial port control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003518##
+ mcset $l "Serial port Mode bit 0\nRefer to SM1 for serial port mode selection.\nSMOD0 must be cleared to enable access to the SM0 bit" \
+ "Serial port Mode bit 0\nRefer to SM1 for serial port mode selection.\nSMOD0 must be cleared to enable access to the SM0 bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003519##
+ mcset $l "Serial port Mode bit 1\nSM0\tSM1\tMode\tDescription\t\tBaud Rate\n0\t0\t0\tShift Register\tFCPU PERIPH/6\n0\t1\t1\t8-bit UART\tVariable\n1\t0\t2\t9-bit UART\tFCPU PERIPH /32 or /16\n1\t1\t3\t9-bit UART\tVariable" \
+ "Serial port Mode bit 1\nSM0\tSM1\tMode\tDescription\t\tBaud Rate\n0\t0\t0\tShift Register\tFCPU PERIPH/6\n0\t1\t1\t8-bit UART\tVariable\n1\t0\t2\t9-bit UART\tFCPU PERIPH /32 or /16\n1\t1\t3\t9-bit UART\tVariable" ;# <-- NOT TRANSLATED YET
+ ##ID:003520##
+ mcset $l "Serial port Mode 2 bit / Multiprocessor Communication Enable bit\nClear to disable multiprocessor communication feature.\nSet to enable multiprocessor communication feature in mode 2 and 3, and eventually mode 1. This bit should be\ncleared in mode 0" \
+ "Serial port Mode 2 bit / Multiprocessor Communication Enable bit\nClear to disable multiprocessor communication feature.\nSet to enable multiprocessor communication feature in mode 2 and 3, and eventually mode 1. This bit should be\ncleared in mode 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003521##
+ mcset $l "Reception Enable bit\nClear to disable serial reception.\nSet to enable serial reception." \
+ "Reception Enable bit\nClear to disable serial reception.\nSet to enable serial reception." ;# <-- NOT TRANSLATED YET
+ ##ID:003522##
+ mcset $l "Transmitter Bit 8 / Ninth bit to transmit in modes 2 and 3.\no transmit a logic 0 in the 9th bit.\nSet to transmit a logic 1 in the 9th bit." \
+ "Transmitter Bit 8 / Ninth bit to transmit in modes 2 and 3.\no transmit a logic 0 in the 9th bit.\nSet to transmit a logic 1 in the 9th bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003523##
+ mcset $l "Receiver Bit 8 / Ninth bit received in modes 2 and 3\nCleared by hardware if 9th bit received is a logic 0.\nSet by hardware if 9th bit received is a logic 1.\nIn mode 1, if SM2 = 0, RB8 is the received stop bit. In mode 0 RB8 is not used." \
+ "Receiver Bit 8 / Ninth bit received in modes 2 and 3\nCleared by hardware if 9th bit received is a logic 0.\nSet by hardware if 9th bit received is a logic 1.\nIn mode 1, if SM2 = 0, RB8 is the received stop bit. In mode 0 RB8 is not used." ;# <-- NOT TRANSLATED YET
+ ##ID:003524##
+ mcset $l "Transmit Interrupt flag\nClear to acknowledge interrupt.\nSet by hardware at the end of the 8th bit time in mode 0 or at the beginning of the stop bit in the other modes." \
+ "Transmit Interrupt flag\nClear to acknowledge interrupt.\nSet by hardware at the end of the 8th bit time in mode 0 or at the beginning of the stop bit in the other modes." ;# <-- NOT TRANSLATED YET
+ ##ID:003525##
+ mcset $l "Receive Interrupt flag\nClear to acknowledge interrupt.\nSet by hardware at the end of the 8th bit time in mode 0, see Figure 2-26. and Figure 2-27. in the other modes." \
+ "Receive Interrupt flag\nClear to acknowledge interrupt.\nSet by hardware at the end of the 8th bit time in mode 0, see Figure 2-26. and Figure 2-27. in the other modes." ;# <-- NOT TRANSLATED YET
+ ##ID:003526##
+ mcset $l "Power Off Flag" \
+ "Power Off Flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003527##
+ mcset $l "Power-Off Flag\nCleared to recognize next reset type.\nSet by hardware when VCC rises from 0 to its nominal voltage. Can also be set by software." \
+ "Power-Off Flag\nCleared to recognize next reset type.\nSet by hardware when VCC rises from 0 to its nominal voltage. Can also be set by software." ;# <-- NOT TRANSLATED YET
+ ##ID:003528##
+ mcset $l "General purpose flag bit" \
+ "General purpose flag bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003529##
+ mcset $l "General purpose Flag\nCleared by user for general purpose usage.\nSet by user for general purpose usage." \
+ "General purpose Flag\nCleared by user for general purpose usage.\nSet by user for general purpose usage." ;# <-- NOT TRANSLATED YET
+ ##ID:003530##
+ mcset $l "Power down bit" \
+ "Power down bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003531##
+ mcset $l "Power-Down mode bit\nCleared by hardware when reset occurs.\nSet to enter power-down mode." \
+ "Power-Down mode bit\nCleared by hardware when reset occurs.\nSet to enter power-down mode." ;# <-- NOT TRANSLATED YET
+ ##ID:003532##
+ mcset $l "Idle mode bit" \
+ "Idle mode bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003533##
+ mcset $l "Idle mode bit\nCleared by hardware when interrupt or reset occurs.\nSet to enter idle mode." \
+ "Idle mode bit\nCleared by hardware when interrupt or reset occurs.\nSet to enter idle mode." ;# <-- NOT TRANSLATED YET
+ ##ID:003534##
+ mcset $l "Double baud rate bit" \
+ "Double baud rate bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003535##
+ mcset $l "Serial port Mode bit 1 for UART\nSet to select double baud rate in mode 1, 2 or 3." \
+ "Serial port Mode bit 1 for UART\nSet to select double baud rate in mode 1, 2 or 3." ;# <-- NOT TRANSLATED YET
+ ##ID:003536##
+ mcset $l "Frame Error Select" \
+ "Frame Error Select" ;# <-- NOT TRANSLATED YET
+ ##ID:003537##
+ mcset $l "Frame Error Select. When SMOD0 = 0, SCON.7 is SM0. When SMOD0 = 1, SCON.7 is FE.\nNote that FE will be set after a frame error\nregardless of the state of SMOD0." \
+ "Frame Error Select. When SMOD0 = 0, SCON.7 is SM0. When SMOD0 = 1, SCON.7 is FE.\nNote that FE will be set after a frame error\nregardless of the state of SMOD0." ;# <-- NOT TRANSLATED YET
+ ##ID:003538##
+ mcset $l "Pulse Width Modulation Enable" \
+ "Pulse Width Modulation Enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003539##
+ mcset $l "Pulse Width Modulation Enable. When PWMEN = 1, Timer 0 and Timer 1 are\nconfigured as an 8-bit PWM counter with 8-bit auto-reload prescaler.\nThe PWM outputs on T1 (P3.5)." \
+ "Pulse Width Modulation Enable. When PWMEN = 1, Timer 0 and Timer 1 are\nconfigured as an 8-bit PWM counter with 8-bit auto-reload prescaler.\nThe PWM outputs on T1 (P3.5)." ;# <-- NOT TRANSLATED YET
+ ##ID:003540##
+ mcset $l "SFR 0xC8: Timer/Counter 2 control register" \
+ "SFR 0xC8: Timer/Counter 2 control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003541##
+ mcset $l "Timer 2 overflow Flag\nTF2 is not set if RCLK=1 or TCLK = 1.\nMust be cleared by software.\nSet by hardware on timer 2 overflow." \
+ "Timer 2 overflow Flag\nTF2 is not set if RCLK=1 or TCLK = 1.\nMust be cleared by software.\nSet by hardware on timer 2 overflow." ;# <-- NOT TRANSLATED YET
+ ##ID:003542##
+ mcset $l "Timer 2 External Flag\nSet when a capture or a reload is caused by a negative transition on T2EX pin if EXEN2=1.\nSet to cause the CPU to vector to timer 2 interrupt routine when timer 2 interrupt is enabled.\nMust be cleared by software." \
+ "Timer 2 External Flag\nSet when a capture or a reload is caused by a negative transition on T2EX pin if EXEN2=1.\nSet to cause the CPU to vector to timer 2 interrupt routine when timer 2 interrupt is enabled.\nMust be cleared by software." ;# <-- NOT TRANSLATED YET
+ ##ID:003543##
+ mcset $l "Receive Clock bit\nClear to use timer 1 overflow as receive clock for serial port in mode 1 or 3.\nSet to use timer 2 overflow as receive clock for serial port in mode 1 or 3." \
+ "Receive Clock bit\nClear to use timer 1 overflow as receive clock for serial port in mode 1 or 3.\nSet to use timer 2 overflow as receive clock for serial port in mode 1 or 3." ;# <-- NOT TRANSLATED YET
+ ##ID:003544##
+ mcset $l "Transmit Clock bit\nClear to use timer 1 overflow as transmit clock for serial port in mode 1 or 3.\nSet to use timer 2 overflow as transmit clock for serial port in mode 1 or 3." \
+ "Transmit Clock bit\nClear to use timer 1 overflow as transmit clock for serial port in mode 1 or 3.\nSet to use timer 2 overflow as transmit clock for serial port in mode 1 or 3." ;# <-- NOT TRANSLATED YET
+ ##ID:003545##
+ mcset $l "Timer 2 External Enable bit\nClear to ignore events on T2EX pin for timer 2 operation.\nSet to cause a capture or reload when a negative transition on T2EX pin is\ndetected, if timer 2 is not used to clock the serial port." \
+ "Timer 2 External Enable bit\nClear to ignore events on T2EX pin for timer 2 operation.\nSet to cause a capture or reload when a negative transition on T2EX pin is\ndetected, if timer 2 is not used to clock the serial port." ;# <-- NOT TRANSLATED YET
+ ##ID:003546##
+ mcset $l "Timer 2 Run control bit\nClear to turn off timer 2.\nSet to turn on timer 2." \
+ "Timer 2 Run control bit\nClear to turn off timer 2.\nSet to turn on timer 2." ;# <-- NOT TRANSLATED YET
+ ##ID:003547##
+ mcset $l "Timer/Counter 2 select bit\nClear for timer operation (input from internal clock system: FOSC).\nSet for counter operation (input from T2 input pin)." \
+ "Timer/Counter 2 select bit\nClear for timer operation (input from internal clock system: FOSC).\nSet for counter operation (input from T2 input pin)." ;# <-- NOT TRANSLATED YET
+ ##ID:003548##
+ mcset $l "Timer 2 Capture/Reload bit\nIf RCLK=1 or TCLK=1, CP/RL2# is ignored and timer is forced to auto-reload on timer 2 overflow.\nClear to auto-reload on timer 2 overflows or negative transitions on T2EX pin if EXEN2=1.\nSet to capture on negative transitions on T2EX pin if EXEN2=1." \
+ "Timer 2 Capture/Reload bit\nIf RCLK=1 or TCLK=1, CP/RL2# is ignored and timer is forced to auto-reload on timer 2 overflow.\nClear to auto-reload on timer 2 overflows or negative transitions on T2EX pin if EXEN2=1.\nSet to capture on negative transitions on T2EX pin if EXEN2=1." ;# <-- NOT TRANSLATED YET
+ ##ID:003549##
+ mcset $l "Reserved" \
+ "保留"
+ ##ID:003550##
+ mcset $l "Timer 2 Output Enable bit" \
+ "Timer 2 Output Enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003551##
+ mcset $l "Down Counter Enable bit" \
+ "Down Counter Enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003552##
+ mcset $l "SFR 0xC9: Timer/Counter 2 mode control register" \
+ "SFR 0xC9: Timer/Counter 2 mode control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003553##
+ mcset $l "Reserved\nThe value read from this bit is indeterminate. Do not set this bit." \
+ "Reserved\nThe value read from this bit is indeterminate. Do not set this bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003554##
+ mcset $l "Timer 2 Output Enable bit\nClear to program P1.0/T2 as clock input or I/O port.\nSet to program P1.0/T2 as clock output." \
+ "Timer 2 Output Enable bit\nClear to program P1.0/T2 as clock input or I/O port.\nSet to program P1.0/T2 as clock output." ;# <-- NOT TRANSLATED YET
+ ##ID:003555##
+ mcset $l "Down Counter Enable bit\nClear to disable timer 2 as up/down counter.\nSet to enable timer 2 as up/down counter." \
+ "Down Counter Enable bit\nClear to disable timer 2 as up/down counter.\nSet to enable timer 2 as up/down counter." ;# <-- NOT TRANSLATED YET
+ ##ID:003556##
+ mcset $l "Defines the Timer 2 interrupt priority level" \
+ "Defines the Timer 2 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003557##
+ mcset $l "Timer 2 interrupt priority bit" \
+ "Timer 2 interrupt priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003558##
+ mcset $l "Defines the Serial Port interrupt priority level" \
+ "Defines the Serial Port interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003559##
+ mcset $l "Serial Port interrupt enable bit" \
+ "Serial Port interrupt enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003560##
+ mcset $l "Serial Port interrupt priority bit" \
+ "Serial Port interrupt priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003561##
+ mcset $l "Defines the comparator interrupt priority level" \
+ "Defines the comparator interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003562##
+ mcset $l "Comparator Interrupt Priority bit" \
+ "Comparator Interrupt Priority bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003563##
+ mcset $l "Power-down Exit Mode" \
+ "Power-down Exit Mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003564##
+ mcset $l "Power-down Exit Mode. When PWDEX = 1, wake up from Power-down is externally controlled.\nWhen PWDEX = 0, wake up from Power-down is internally timed." \
+ "Power-down Exit Mode. When PWDEX = 1, wake up from Power-down is externally controlled.\nWhen PWDEX = 0, wake up from Power-down is internally timed." ;# <-- NOT TRANSLATED YET
+ ##ID:003565##
+ mcset $l "Internal/External RAM access using MOVX" \
+ "Internal/External RAM access using MOVX" ;# <-- NOT TRANSLATED YET
+ ##ID:003566##
+ mcset $l "Internal/External RAM access using MOVX @ Ri/@DPTR\nEXTRAM\tOperating Mode\n0\tInternal ERAM (00H-FFH) access using MOVX @ Ri/@DPTR\n1\tExternal data memory access" \
+ "Internal/External RAM access using MOVX @ Ri/@DPTR\nEXTRAM\tOperating Mode\n0\tInternal ERAM (00H-FFH) access using MOVX @ Ri/@DPTR\n1\tExternal data memory access" ;# <-- NOT TRANSLATED YET
+ ##ID:003567##
+ mcset $l "When set, this bit configures the interrupt driven exit from power-down\nto resume execution on the rising edge of the interrupt signal. When\nthis bit is cleared, the execution resumes after a self-timed interval\n(nominal 2 ms) referenced from the falling edge of the interrupt signal." \
+ "When set, this bit configures the interrupt driven exit from power-down\nto resume execution on the rising edge of the interrupt signal. When\nthis bit is cleared, the execution resumes after a self-timed interval\n(nominal 2 ms) referenced from the falling edge of the interrupt signal." ;# <-- NOT TRANSLATED YET
+ ##ID:003568##
+ mcset $l "Reserved for future expansion" \
+ "Reserved for future expansion" ;# <-- NOT TRANSLATED YET
+ ##ID:003569##
+ mcset $l "Disable/Enable Reset out" \
+ "Disable/Enable Reset out" ;# <-- NOT TRANSLATED YET
+ ##ID:003570##
+ mcset $l "Disable/Enable Reset out\nDISRTO\tOperating Mode\n0\tReset pin is driven High after WDT times out\n1\tReset pin is input only" \
+ "Disable/Enable Reset out\nDISRTO\tOperating Mode\n0\tReset pin is driven High after WDT times out\n1\tReset pin is input only" ;# <-- NOT TRANSLATED YET
+ ##ID:003571##
+ mcset $l "Disable/Enable WDT in IDLE mode" \
+ "Disable/Enable WDT in IDLE mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003572##
+ mcset $l "Disable/Enable WDT in IDLE mode\nWDIDLE\tOperating Mode\n0\tWDT continues to count in IDLE mode\n1\tWDT halts counting in IDLE mode" \
+ "Disable/Enable WDT in IDLE mode\nWDIDLE\tOperating Mode\n0\tWDT continues to count in IDLE mode\n1\tWDT halts counting in IDLE mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003573##
+ mcset $l "General purpose user flag" \
+ "General purpose user flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003574##
+ mcset $l "SFR 0x8E: Auxiliary Register" \
+ "SFR 0x8E: Auxiliary Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003575##
+ mcset $l "SFR 0xA2: Auxiliary Register 1" \
+ "SFR 0xA2: Auxiliary Register 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003576##
+ mcset $l "SFR 0x97: Analog Comparator Control and Status Register" \
+ "SFR 0x97: Analog Comparator Control and Status Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003577##
+ mcset $l "SFR 0x96: Data EEPROM Control Register" \
+ "SFR 0x96: Data EEPROM Control Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003578##
+ mcset $l "SFR 0xD5: SPI Control Register" \
+ "SFR 0xD5: SPI Control Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003579##
+ mcset $l "SFR 0xAA: SPI Status Register" \
+ "SFR 0xAA: SPI Status Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003580##
+ mcset $l "SFR 0xA7: Watchdog Control Register" \
+ "SFR 0xA7: Watchdog Control Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003581##
+ mcset $l "SFR 0xA7: Watchdog Prescaler Control Register" \
+ "SFR 0xA7: Watchdog Prescaler Control Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003582##
+ mcset $l "SFR 0xB7: Interrupt Priority High Register" \
+ "SFR 0xB7: Interrupt Priority High Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003583##
+ mcset $l "SFR 0x8F: Clock Register" \
+ "SFR 0x8F: Clock Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003584##
+ mcset $l "Defines the Timer 1 interrupt priority level" \
+ "Defines the Timer 1 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003585##
+ mcset $l "Defines External Interrupt 1 priority level" \
+ "Defines External Interrupt 1 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003586##
+ mcset $l "Defines the Timer 0 interrupt priority level" \
+ "Defines the Timer 0 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003587##
+ mcset $l "Defines the External Interrupt 0 priority level" \
+ "Defines the External Interrupt 0 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003588##
+ mcset $l "X2 mode flag" \
+ "X2 mode flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003589##
+ mcset $l "When X2 = 0, the frequency (at XTAL1 pin) is internally divided by 2 before it is used as the device system frequency.\nWhen X2 = 1, the divide by 2 is no longer used and the XTAL1 frequency becomes the device system frequency. This\nenables the user to use a 6 MHz crystal instead of a 12 MHz crystal in order to reduce EMI." \
+ "When X2 = 0, the frequency (at XTAL1 pin) is internally divided by 2 before it is used as the device system frequency.\nWhen X2 = 1, the divide by 2 is no longer used and the XTAL1 frequency becomes the device system frequency. This\nenables the user to use a 6 MHz crystal instead of a 12 MHz crystal in order to reduce EMI." ;# <-- NOT TRANSLATED YET
+ ##ID:003590##
+ mcset $l "EEPROM data memory load enable bit" \
+ "EEPROM data memory load enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003591##
+ mcset $l "EEPROM data memory write enable bit" \
+ "EEPROM data memory write enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003592##
+ mcset $l "Internal EEPROM access enable" \
+ "Internal EEPROM access enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003593##
+ mcset $l "Data pointer register select" \
+ "Data pointer register select" ;# <-- NOT TRANSLATED YET
+ ##ID:003594##
+ mcset $l "RDY/BSY (Ready/Busy) flag for the data EEPROM memory (read-only)" \
+ "RDY/BSY (Ready/Busy) flag for the data EEPROM memory (read-only)" ;# <-- NOT TRANSLATED YET
+ ##ID:003595##
+ mcset $l "Write Inhibit (read-only)" \
+ "Write Inhibit (read-only)" ;# <-- NOT TRANSLATED YET
+ ##ID:003596##
+ mcset $l "EEPROM data memory load enable bit. Used to implement Page Mode Write. A MOVX\ninstruction writing into the data EEPROM will not initiate the programming cycle\nif this bit is set, rather it will just load data into the volatile data buffer\nof the data EEPROM memory. Before the last MOVX, reset this bit and the data\nEEPROM will program all the bytes previously loaded on the same page of the\naddress given by the last MOVX instruction." \
+ "EEPROM data memory load enable bit. Used to implement Page Mode Write. A MOVX\ninstruction writing into the data EEPROM will not initiate the programming cycle\nif this bit is set, rather it will just load data into the volatile data buffer\nof the data EEPROM memory. Before the last MOVX, reset this bit and the data\nEEPROM will program all the bytes previously loaded on the same page of the\naddress given by the last MOVX instruction." ;# <-- NOT TRANSLATED YET
+ ##ID:003597##
+ mcset $l "EEPROM data memory write enable bit. Set this bit to 1 before initiating byte\nwrite to on-chip EEPROM with the MOVX instruction. User software should set\nthis bit to 0 after EEPROM write is completed." \
+ "EEPROM data memory write enable bit. Set this bit to 1 before initiating byte\nwrite to on-chip EEPROM with the MOVX instruction. User software should set\nthis bit to 0 after EEPROM write is completed." ;# <-- NOT TRANSLATED YET
+ ##ID:003598##
+ mcset $l "Internal EEPROM access enable. When EEMEN = 1, the MOVX instruction with DPTR\nwill access on-chip EEPROM instead of external data memory if the address used\nis less than 2K. When EEMEN = 0 or the address used is ≥ 2K," \
+ "Internal EEPROM access enable. When EEMEN = 1, the MOVX instruction with DPTR\nwill access on-chip EEPROM instead of external data memory if the address used\nis less than 2K. When EEMEN = 0 or the address used is ≥ 2K," ;# <-- NOT TRANSLATED YET
+ ##ID:003599##
+ mcset $l "MOVX with DPTR accesses external data memory.\nData pointer register select. DPS = 0 selects the first bank of data pointer\nregister, DP0, and DPS = 1 selects the second bank, DP1." \
+ "MOVX with DPTR accesses external data memory.\nData pointer register select. DPS = 0 selects the first bank of data pointer\nregister, DP0, and DPS = 1 selects the second bank, DP1." ;# <-- NOT TRANSLATED YET
+ ##ID:003600##
+ mcset $l "RDY/BSY (Ready/Busy) flag for the data EEPROM memory. This is a read-only bit\nwhich is cleared by hardware during the programming cycle of the on-chip EEPROM.\nIt is also set by hardware when the programming is completed. Note that RDY/BSY\nwill be cleared long after the completion of the MOVX instruction which has\ninitiated the programming cycle." \
+ "RDY/BSY (Ready/Busy) flag for the data EEPROM memory. This is a read-only bit\nwhich is cleared by hardware during the programming cycle of the on-chip EEPROM.\nIt is also set by hardware when the programming is completed. Note that RDY/BSY\nwill be cleared long after the completion of the MOVX instruction which has\ninitiated the programming cycle." ;# <-- NOT TRANSLATED YET
+ ##ID:003601##
+ mcset $l "WRTINH (Write Inhibit) is a READ-ONLY bit which is cleared by hardware when Vcc is\ntoo low for the programming cycle of the on-chip EEPROM to be executed. When this\nbit is cleared, an ongoing programming cycle will be aborted or a new programming\ncycle will not start." \
+ "WRTINH (Write Inhibit) is a READ-ONLY bit which is cleared by hardware when Vcc is\ntoo low for the programming cycle of the on-chip EEPROM to be executed. When this\nbit is cleared, an ongoing programming cycle will be aborted or a new programming\ncycle will not start." ;# <-- NOT TRANSLATED YET
+ ##ID:003602##
+ mcset $l "Prescaler bit for the watchdog timer" \
+ "Prescaler bit for the watchdog timer" ;# <-- NOT TRANSLATED YET
+ ##ID:003603##
+ mcset $l "Enable/disable the Watchdog Timer in IDLE mode" \
+ "Enable/disable the Watchdog Timer in IDLE mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003604##
+ mcset $l "Enable/disable the WDT-driven Reset Out" \
+ "Enable/disable the WDT-driven Reset Out" ;# <-- NOT TRANSLATED YET
+ ##ID:003605##
+ mcset $l "Hardware mode select for the WDT" \
+ "Hardware mode select for the WDT" ;# <-- NOT TRANSLATED YET
+ ##ID:003606##
+ mcset $l "Watchdog software reset bit" \
+ "Watchdog software reset bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003607##
+ mcset $l "Watchdog software enable bit" \
+ "Watchdog software enable bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003608##
+ mcset $l "Enable/disable the Watchdog Timer in IDLE mode. When WDIDLE = 0, WDT\ncontinues to count in IDLE mode. When WDIDLE = 1, WDT freezes while\nthe device is in IDLE mode." \
+ "Enable/disable the Watchdog Timer in IDLE mode. When WDIDLE = 0, WDT\ncontinues to count in IDLE mode. When WDIDLE = 1, WDT freezes while\nthe device is in IDLE mode." ;# <-- NOT TRANSLATED YET
+ ##ID:003609##
+ mcset $l "Enable/disable the WDT-driven Reset Out (WDT drives the RST pin). When\nDISRTO = 0, the RST pin is driven high after WDT times out and the entire\nboard is reset. When DISRTO = 1, the RST pin remains only as an input and the\nWDT resets only the microcontroller internally after WDT times out." \
+ "Enable/disable the WDT-driven Reset Out (WDT drives the RST pin). When\nDISRTO = 0, the RST pin is driven high after WDT times out and the entire\nboard is reset. When DISRTO = 1, the RST pin remains only as an input and the\nWDT resets only the microcontroller internally after WDT times out." ;# <-- NOT TRANSLATED YET
+ ##ID:003610##
+ mcset $l "Hardware mode select for the WDT. When HWDT = 0, the WDT can be turned on/off\nby simply setting or clearing WDTEN in the same register (this is the software\nmode for WDT). When HWDT = 1, the WDT has to be set by writing the sequence\n1EH/E1H to the WDTRST register (with address 0A6H) and after being set in this\nway, WDT cannot be turned off except by reset, warm or cold (this is the hardware\nmode for WDT). To prevent the hardware WDT from resetting the entire device,\nthe same sequence 1EH/E1H must be written to the same WDTRST SFR before the\ntimeout interval." \
+ "Hardware mode select for the WDT. When HWDT = 0, the WDT can be turned on/off\nby simply setting or clearing WDTEN in the same register (this is the software\nmode for WDT). When HWDT = 1, the WDT has to be set by writing the sequence\n1EH/E1H to the WDTRST register (with address 0A6H) and after being set in this\nway, WDT cannot be turned off except by reset, warm or cold (this is the hardware\nmode for WDT). To prevent the hardware WDT from resetting the entire device,\nthe same sequence 1EH/E1H must be written to the same WDTRST SFR before the\ntimeout interval." ;# <-- NOT TRANSLATED YET
+ ##ID:003611##
+ mcset $l "Watchdog software reset bit. If HWDT = 0 (i.e. WDT is in software controlled mode),\nwhen set by software, this bit resets WDT. After being set by software, WSWRST is\nreset by hardware during the next machine cycle. If HWDT = 1, this bit has no effect,\nand if set by software, it will not be cleared by hardware." \
+ "Watchdog software reset bit. If HWDT = 0 (i.e. WDT is in software controlled mode),\nwhen set by software, this bit resets WDT. After being set by software, WSWRST is\nreset by hardware during the next machine cycle. If HWDT = 1, this bit has no effect,\nand if set by software, it will not be cleared by hardware." ;# <-- NOT TRANSLATED YET
+ ##ID:003612##
+ mcset $l "Watchdog software enable bit. When HWDT = 0 (i.e. WDT is in software-controlled mode),\nthis bit enables WDT when set to 1 and disables WDT when cleared to 0 (it does not\nreset WDT in this case, but just freezes the existing counter state). If HWDT = 1, this\nbit is READ-ONLY and reflects the status of the WDT (whether it is running or not)." \
+ "Watchdog software enable bit. When HWDT = 0 (i.e. WDT is in software-controlled mode),\nthis bit enables WDT when set to 1 and disables WDT when cleared to 0 (it does not\nreset WDT in this case, but just freezes the existing counter state). If HWDT = 1, this\nbit is READ-ONLY and reflects the status of the WDT (whether it is running or not)." ;# <-- NOT TRANSLATED YET
+ ##ID:003613##
+ mcset $l "Do not try to set or clear this bit" \
+ "Do not try to set or clear this bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003614##
+ mcset $l "WDT Time-out select bit" \
+ "WDT Time-out select bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003615##
+ mcset $l "Prescaler bits for the watchdog timer (WDT). When all three bits are cleared\nto 0, the watchdog timer has a nominal period of 16K machine cycles,\n(i.e. 16 ms at a XTAL frequency of 12 MHz in normal mode or 6 MHz in x2 mode).\nWhen all three bits are set to 1, the nominal period is 2048K machine cycles,\n(i.e. 2048 ms at 12 MHz clock frequency in normal mode or 6 MHz in x2 mode)." \
+ "Prescaler bits for the watchdog timer (WDT). When all three bits are cleared\nto 0, the watchdog timer has a nominal period of 16K machine cycles,\n(i.e. 16 ms at a XTAL frequency of 12 MHz in normal mode or 6 MHz in x2 mode).\nWhen all three bits are set to 1, the nominal period is 2048K machine cycles,\n(i.e. 2048 ms at 12 MHz clock frequency in normal mode or 6 MHz in x2 mode)." ;# <-- NOT TRANSLATED YET
+ ##ID:003616##
+ mcset $l "SPI interrupt flag" \
+ "SPI interrupt flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003617##
+ mcset $l "Write collision flag" \
+ "Write collision flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003618##
+ mcset $l "Load enable" \
+ "Load enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003619##
+ mcset $l "Disable slave output bit" \
+ "Disable slave output bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003620##
+ mcset $l "Enhanced SPI mode select bit" \
+ "Enhanced SPI mode select bit" ;# <-- NOT TRANSLATED YET
+ ##ID:003621##
+ mcset $l "SPI interrupt flag. When a serial transfer is complete, the SPIF bit is set and an interrupt is generated if SPIE = 1 and ES\n= 1. The SPIF bit is cleared by reading the SPI status register followed by reading/writing the SPI data register." \
+ "SPI interrupt flag. When a serial transfer is complete, the SPIF bit is set and an interrupt is generated if SPIE = 1 and ES\n= 1. The SPIF bit is cleared by reading the SPI status register followed by reading/writing the SPI data register." ;# <-- NOT TRANSLATED YET
+ ##ID:003622##
+ mcset $l "When ENH = 0: Write collision flag. The WCOL bit is set if the SPI data register is written during a data transfer. During\ndata transfer, the result of reading the SPDR register may be incorrect, and writing to it has no effect. The WCOL bit (and\nthe SPIF bit) are cleared by reading the SPI status register followed by reading/writing the SPI data register.\nWhen ENH = 1: WCOL works in Enhanced mode as Tx Buffer Full. Writing during WCOL = 1 in enhanced mode will\noverwrite the waiting data already present in the Tx Buffer. In this mode, WCOL is no longer reset by the SPIF reset but\nis reset when the write buffer has been unloaded into the serial shift register." \
+ "When ENH = 0: Write collision flag. The WCOL bit is set if the SPI data register is written during a data transfer. During\ndata transfer, the result of reading the SPDR register may be incorrect, and writing to it has no effect. The WCOL bit (and\nthe SPIF bit) are cleared by reading the SPI status register followed by reading/writing the SPI data register.\nWhen ENH = 1: WCOL works in Enhanced mode as Tx Buffer Full. Writing during WCOL = 1 in enhanced mode will\noverwrite the waiting data already present in the Tx Buffer. In this mode, WCOL is no longer reset by the SPIF reset but\nis reset when the write buffer has been unloaded into the serial shift register." ;# <-- NOT TRANSLATED YET
+ ##ID:003623##
+ mcset $l "Load enable for the Tx buffer in enhanced SPI mode.\nWhen ENH is set, it is safe to load the Tx Buffer while LDEN = 1 and WCOL = 0. LDEN is high during bits 0 - 3 and is low\nduring bits 4 - 7 of the SPI serial byte transmission time frame." \
+ "Load enable for the Tx buffer in enhanced SPI mode.\nWhen ENH is set, it is safe to load the Tx Buffer while LDEN = 1 and WCOL = 0. LDEN is high during bits 0 - 3 and is low\nduring bits 4 - 7 of the SPI serial byte transmission time frame." ;# <-- NOT TRANSLATED YET
+ ##ID:003624##
+ mcset $l "Disable slave output bit.\nWhen set, this bit causes the MISO pin to be tri-stated so more than one slave device can share the same interface with\na single master. Normally, the first byte in a transmission could be the slave address and only the selected slave should\nclear its DISSO bit." \
+ "Disable slave output bit.\nWhen set, this bit causes the MISO pin to be tri-stated so more than one slave device can share the same interface with\na single master. Normally, the first byte in a transmission could be the slave address and only the selected slave should\nclear its DISSO bit." ;# <-- NOT TRANSLATED YET
+ ##ID:003625##
+ mcset $l "Enhanced SPI mode select bit. When ENH = 0, SPI is in normal mode, i.e. without write double buffering.\nWhen ENH = 1, SPI is in enhanced mode with write double buffering. The Tx buffer shares the same address with the\nSPDR register." \
+ "Enhanced SPI mode select bit. When ENH = 0, SPI is in normal mode, i.e. without write double buffering.\nWhen ENH = 1, SPI is in enhanced mode with write double buffering. The Tx buffer shares the same address with the\nSPDR register." ;# <-- NOT TRANSLATED YET
+ ##ID:003626##
+ mcset $l "SPI interrupt enable" \
+ "SPI interrupt enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003627##
+ mcset $l "SPI enable" \
+ "SPI enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003628##
+ mcset $l "Data order" \
+ "Data order" ;# <-- NOT TRANSLATED YET
+ ##ID:003629##
+ mcset $l "Master/slave select" \
+ "Master/slave select" ;# <-- NOT TRANSLATED YET
+ ##ID:003630##
+ mcset $l "Clock polarity" \
+ "Clock polarity" ;# <-- NOT TRANSLATED YET
+ ##ID:003631##
+ mcset $l "Clock phase" \
+ "Clock phase" ;# <-- NOT TRANSLATED YET
+ ##ID:003632##
+ mcset $l "SPI clock rate select" \
+ "SPI clock rate select" ;# <-- NOT TRANSLATED YET
+ ##ID:003633##
+ mcset $l "SPI interrupt enable.\nThis bit, in conjunction with the ES bit in the IE register,\nenables SPI interrupts: SPIE = 1 and ES = 1 enable SPI interrupts. SPIE = 0 disables SPI interrupts." \
+ "SPI interrupt enable.\nThis bit, in conjunction with the ES bit in the IE register,\nenables SPI interrupts: SPIE = 1 and ES = 1 enable SPI interrupts. SPIE = 0 disables SPI interrupts." ;# <-- NOT TRANSLATED YET
+ ##ID:003634##
+ mcset $l "SPI enable. SPI = 1 enables the SPI channel and connects\nSS, MOSI, MISO and SCK to pins P1.4, P1.5, P1.6, and P1.7.\nSPI = 0 disables the SPI channel." \
+ "SPI enable. SPI = 1 enables the SPI channel and connects\nSS, MOSI, MISO and SCK to pins P1.4, P1.5, P1.6, and P1.7.\nSPI = 0 disables the SPI channel." ;# <-- NOT TRANSLATED YET
+ ##ID:003635##
+ mcset $l "Data order. DORD = 1 selects LSB first data transmission.\nDORD = 0 selects MSB first data transmission." \
+ "Data order. DORD = 1 selects LSB first data transmission.\nDORD = 0 selects MSB first data transmission." ;# <-- NOT TRANSLATED YET
+ ##ID:003636##
+ mcset $l "Master/slave select. MSTR = 1 selects Master SPI mode.\nMSTR = 0 selects slave SPI mode." \
+ "Master/slave select. MSTR = 1 selects Master SPI mode.\nMSTR = 0 selects slave SPI mode." ;# <-- NOT TRANSLATED YET
+ ##ID:003637##
+ mcset $l "Clock polarity. When CPOL = 1, SCK is high when idle. When CPOL = 0,\nSCK of the master device is low when not transmitting. Please refer to\nfigure on SPI clock phase and polarity control." \
+ "Clock polarity. When CPOL = 1, SCK is high when idle. When CPOL = 0,\nSCK of the master device is low when not transmitting. Please refer to\nfigure on SPI clock phase and polarity control." ;# <-- NOT TRANSLATED YET
+ ##ID:003638##
+ mcset $l "Clock phase. The CPHA bit together with the CPOL bit controls the\nclock and data relationship between master and slave. Please refer\nto figure on SPI clock phase and polarity control." \
+ "Clock phase. The CPHA bit together with the CPOL bit controls the\nclock and data relationship between master and slave. Please refer\nto figure on SPI clock phase and polarity control." ;# <-- NOT TRANSLATED YET
+ ##ID:003639##
+ mcset $l "SPI clock rate select.\nThese two bits control the SCK rate of the device configured as master.\nSPR1 and SPR0 have no effect on the slave. The relationship between SCK and the\noscillator frequency, FOSC., is as follows:\n SPR1\tSPR0\tSCK\n 0\t0\tf/4 (f/2 in x2mode)\n 0\t1\tf/16 (f/8 in x2 mode)\n 1\t0\tf/64 (f/32 in x2 mode)\n 1\t1\tf/128 (f/64 in x2 mode)" \
+ "SPI clock rate select.\nThese two bits control the SCK rate of the device configured as master.\nSPR1 and SPR0 have no effect on the slave. The relationship between SCK and the\noscillator frequency, FOSC., is as follows:\n SPR1\tSPR0\tSCK\n 0\t0\tf/4 (f/2 in x2mode)\n 0\t1\tf/16 (f/8 in x2 mode)\n 1\t0\tf/64 (f/32 in x2 mode)\n 1\t1\tf/128 (f/64 in x2 mode)" ;# <-- NOT TRANSLATED YET
+ ##ID:003640##
+ mcset $l "Comparator Interrupt" \
+ "Comparator Interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003641##
+ mcset $l "Comparator Enable" \
+ "Comparator Enable" ;# <-- NOT TRANSLATED YET
+ ##ID:003642##
+ mcset $l "Comparator Interrupt Mode" \
+ "Comparator Interrupt Mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003643##
+ mcset $l "Comparator Interrupt Flag. Set when the comparator output meets the conditions specified by the CM \[2:0\] bits and CEN\nis set. The flag must be cleared by software. The interrupt may be enabled/disabled by setting/clearing bit 6 of IE." \
+ "Comparator Interrupt Flag. Set when the comparator output meets the conditions specified by the CM \[2:0\] bits and CEN\nis set. The flag must be cleared by software. The interrupt may be enabled/disabled by setting/clearing bit 6 of IE." ;# <-- NOT TRANSLATED YET
+ ##ID:003644##
+ mcset $l "Comparator Enable. Set this bit to enable the comparator. Clearing this bit will force the comparator output low and\nprevent further events from setting CF." \
+ "Comparator Enable. Set this bit to enable the comparator. Clearing this bit will force the comparator output low and\nprevent further events from setting CF." ;# <-- NOT TRANSLATED YET
+ ##ID:003645##
+ mcset $l "Comparator Interrupt Mode\n 2 1 0\tInterrupt Mode\n--- --- ---\t---------------------------------------\n 0 0 0\tNegative (Low) level\n 0 0 1\tPositive edge\n 0 1 0\tToggle with debounce\n 0 1 1\tPositive edge with debounce\n 1 0 0\tNegative edge\n 1 0 1\tToggle\n 1 1 0\tNegative edge with debounce\n 1 1 1\tPositive (High) level" \
+ "Comparator Interrupt Mode\n 2 1 0\tInterrupt Mode\n--- --- ---\t---------------------------------------\n 0 0 0\tNegative (Low) level\n 0 0 1\tPositive edge\n 0 1 0\tToggle with debounce\n 0 1 1\tPositive edge with debounce\n 1 0 0\tNegative edge\n 1 0 1\tToggle\n 1 1 0\tNegative edge with debounce\n 1 1 1\tPositive (High) level" ;# <-- NOT TRANSLATED YET
+ ##ID:003646##
+ mcset $l "Data Pointer Register Select" \
+ "Data Pointer Register Select" ;# <-- NOT TRANSLATED YET
+ ##ID:003647##
+ mcset $l "DPS\tData Pointer Register Select\n0\tSelects DPTR Registers DP0L, DP0H\n1\tSelects DPTR Registers DP1L, DP1H\n" \
+ "DPS\tData Pointer Register Select\n0\tSelects DPTR Registers DP0L, DP0H\n1\tSelects DPTR Registers DP1L, DP1H\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003648##
+ mcset $l "Disable/Enable ALE" \
+ "Disable/Enable ALE" ;# <-- NOT TRANSLATED YET
+ ##ID:003649##
+ mcset $l "Disable/Enable ALE\nDISALE\tOperating Mode\n0\tALE is emitted at a constant rate of 1/6 the oscillator frequency\n1\tALE is active only during a MOVX or MOVC instruction" \
+ "Disable/Enable ALE\nDISALE\tOperating Mode\n0\tALE is emitted at a constant rate of 1/6 the oscillator frequency\n1\tALE is active only during a MOVX or MOVC instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:003650##
+ mcset $l "Register %s: Located in IDATA, address depends on bits RS0 and RS1 in PSW" \
+ "Register %s: Located in IDATA, address depends on bits RS0 and RS1 in PSW" ;# <-- NOT TRANSLATED YET
+ ##ID:003651##
+ mcset $l "SFR 0x8D: 2nd part of 16-bit counting register for timer 1" \
+ "SFR 0x8D: 2nd part of 16-bit counting register for timer 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003652##
+ mcset $l "SFR 0x8B: 1st part of 16-bit counting register for timer 1" \
+ "SFR 0x8B: 1st part of 16-bit counting register for timer 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003653##
+ mcset $l "SFR 0x8C: 2nd part of 16-bit counting register for timer 0" \
+ "SFR 0x8C: 2nd part of 16-bit counting register for timer 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003654##
+ mcset $l "SFR 0x8A: 1nd part of 16-bit counting register for timer 0" \
+ "SFR 0x8A: 1nd part of 16-bit counting register for timer 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003655##
+ mcset $l "SFR 0x8D..0x8B: 16-bit counting register for timer 1" \
+ "SFR 0x8D..0x8B: 16-bit counting register for timer 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003656##
+ mcset $l "SFR 0x8C..0x8A: 16-bit counting register for timer 0" \
+ "SFR 0x8C..0x8A: 16-bit counting register for timer 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003657##
+ mcset $l "SFR 0x%s: Latch of port %s" \
+ "SFR 0x%s: Latch of port %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003658##
+ mcset $l "SFR 0x87: Power control register" \
+ "SFR 0x87: Power control register" ;# <-- NOT TRANSLATED YET
+ ##ID:003659##
+ mcset $l "SFR 0x83: Data pointer register" \
+ "SFR 0x83: Data pointer register" ;# <-- NOT TRANSLATED YET
+ ##ID:003660##
+ mcset $l "SFR 0x82: Data pointer register" \
+ "SFR 0x82: Data pointer register" ;# <-- NOT TRANSLATED YET
+ ##ID:003661##
+ mcset $l "SFR 0x85: Data pointer register" \
+ "SFR 0x85: Data pointer register" ;# <-- NOT TRANSLATED YET
+ ##ID:003662##
+ mcset $l "SFR 0x84: Data pointer register" \
+ "SFR 0x84: Data pointer register" ;# <-- NOT TRANSLATED YET
+ ##ID:003663##
+ mcset $l "Clock:" \
+ "Clock:" ;# <-- NOT TRANSLATED YET
+ ##ID:003664##
+ mcset $l "Processor clock in kHz" \
+ "Processor clock in kHz" ;# <-- NOT TRANSLATED YET
+ ##ID:003665##
+ mcset $l "SFR 0x99: Serial Data Buffer - RECEIVE buffer" \
+ "SFR 0x99: Serial Data Buffer - RECEIVE buffer" ;# <-- NOT TRANSLATED YET
+ ##ID:003666##
+ mcset $l "SFR 0x99: Serial Data Buffer - TRANSMIT buffer" \
+ "SFR 0x99: Serial Data Buffer - TRANSMIT buffer" ;# <-- NOT TRANSLATED YET
+ ##ID:003667##
+ mcset $l "Program counter" \
+ "Program counter" ;# <-- NOT TRANSLATED YET
+ ##ID:003668##
+ mcset $l "Set PC (Program Counter) according to\nline number in source code" \
+ "Set PC (Program Counter) according to\nline number in source code" ;# <-- NOT TRANSLATED YET
+ ##ID:003669##
+ mcset $l "Set PC by line number" \
+ "Set PC by line number" ;# <-- NOT TRANSLATED YET
+ ##ID:003670##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:003671##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:003672##
+ mcset $l "Time:" \
+ "Time:" ;# <-- NOT TRANSLATED YET
+ ##ID:003673##
+ mcset $l "Overall time" \
+ "Overall time" ;# <-- NOT TRANSLATED YET
+ ##ID:003674##
+ mcset $l "SFR 0xCD: Part of 16-bit counting register for Timer/Counter 2" \
+ "SFR 0xCD: Part of 16-bit counting register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003675##
+ mcset $l "SFR 0xCC: Part of 16-bit counting register for Timer/Counter 2" \
+ "SFR 0xCC: Part of 16-bit counting register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003676##
+ mcset $l "SFR 0xCB: Part of 16-bit capture register for Timer/Counter 2" \
+ "SFR 0xCB: Part of 16-bit capture register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003677##
+ mcset $l "SFR 0xCA: Part of 16-bit capture register for Timer/Counter 2" \
+ "SFR 0xCA: Part of 16-bit capture register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003678##
+ mcset $l "SFR 0xCC..0xCD: 16-bit counting register for Timer/Counter 2" \
+ "SFR 0xCC..0xCD: 16-bit counting register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003679##
+ mcset $l "SFR 0xCA..0xCB: 16-bit capture register for Timer/Counter 2" \
+ "SFR 0xCA..0xCB: 16-bit capture register for Timer/Counter 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003680##
+ mcset $l "Watchdog timer" \
+ "看门狗定时器"
+ ##ID:003681##
+ mcset $l "OFF" \
+ "关"
+ ##ID:003682##
+ mcset $l "ON " \
+ "开 "
+ ##ID:003683##
+ mcset $l "Simulator" \
+ "模拟器"
+ ##ID:003684##
+ mcset $l "Watchdog:" \
+ "看门狗:"
+ ##ID:003685##
+ mcset $l "Watchdog timer ON/OFF switch" \
+ "看门狗定时器 开/关 选项"
+ ##ID:003686##
+ mcset $l "Watchdog Prescaler (0-7 bits)" \
+ "看门狗预分频器 (0-7 bits)"
+ ##ID:003687##
+ mcset $l "Reset watchdog timer" \
+ "复位看门狗定时器"
+ ##ID:003688##
+ mcset $l "Reset Watchdog" \
+ "复位看门狗"
+ ##ID:003689##
+ mcset $l "SFR 0xB9: Used to define which bits in the SADDR are to be used" \
+ "SFR 0xB9: Used to define which bits in the SADDR are to be used" ;# <-- NOT TRANSLATED YET
+ ##ID:003690##
+ mcset $l "SFR 0xA9: Define the slave's address" \
+ "SFR 0xA9: Define the slave's address" ;# <-- NOT TRANSLATED YET
+ ##ID:003691##
+ mcset $l "SFR 0x86: SPI Data Register" \
+ "SFR 0x86: SPI Data Register" ;# <-- NOT TRANSLATED YET
+ ##ID:003692##
+ mcset $l "SFR 0xA6: Watchdog reset" \
+ "SFR 0xA6: Watchdog reset" ;# <-- NOT TRANSLATED YET
+ ##ID:003693##
+ mcset $l "Writing to EEPROM" \
+ "Writing to EEPROM" ;# <-- NOT TRANSLATED YET
+ ##ID:003694##
+ mcset $l "Finalize data EEPROM write cycle" \
+ "Finalize data EEPROM write cycle" ;# <-- NOT TRANSLATED YET
+ ##ID:003695##
+ mcset $l "Finalize write cycle" \
+ "Finalize write cycle" ;# <-- NOT TRANSLATED YET
+ ##ID:003696##
+ mcset $l "Cancel data EEPROM write cycle" \
+ "Cancel data EEPROM write cycle" ;# <-- NOT TRANSLATED YET
+ ##ID:003697##
+ mcset $l "Cancel write cycle" \
+ "Cancel write cycle" ;# <-- NOT TRANSLATED YET
+ ##ID:003698##
+ mcset $l "EEPROM write cycle progress" \
+ "EEPROM write cycle progress" ;# <-- NOT TRANSLATED YET
+}
+# interruptmonitor.tcl
+# ==============================================================================
+namespace eval InterruptMonitor {
+ eval ${SFB_TRANSLATIONS}
+ ##ID:003699##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:003700##
+ mcset $l "Interrupt monitor" \
+ "中断监控"
+ ##ID:003701##
+ mcset $l "Close this dialog window" \
+ "关闭此对话框窗口"
+ ##ID:003702##
+ mcset $l {Vector:} \
+ {Vector:} ;# <-- NOT TRANSLATED YET
+ ##ID:003703##
+ mcset $l {Enable bit:} \
+ {Enable bit:} ;# <-- NOT TRANSLATED YET
+ ##ID:003704##
+ mcset $l {Flag bit:} \
+ {Flag bit:} ;# <-- NOT TRANSLATED YET
+ ##ID:003705##
+ mcset $l {Priority bits:} \
+ {Priority bits:} ;# <-- NOT TRANSLATED YET
+ ##ID:003706##
+ mcset $l { Line:} \
+ { Line:} ;# <-- NOT TRANSLATED YET
+ ##ID:003707##
+ mcset $l { File:} \
+ { 文件:}
+ ##ID:003708##
+ mcset $l { PC:} \
+ { PC:} ;# <-- NOT TRANSLATED YET
+ ##ID:003709##
+ mcset $l "Increase priority level" \
+ "增加优先级"
+ ##ID:003710##
+ mcset $l "Decrease priority level" \
+ "减少优先级"
+ ##ID:003711##
+ mcset $l "Invoke this interrupt" \
+ "调用此中断"
+ ##ID:003712##
+ mcset $l "Priority level" \
+ "优先级"
+ ##ID:003713##
+ mcset $l "SPSR.7 -- SPI interrupt flag" \
+ "SPSR.7 -- SPI interrupt flag" ;# <-- NOT TRANSLATED YET
+ ##ID:003714##
+ mcset $l "ACSR.4 -- Comparator Interrupt" \
+ "ACSR.4 -- Comparator Interrupt" ;# <-- NOT TRANSLATED YET
+ ##ID:003715##
+ mcset $l "IPH.0 -- Defines the External Interrupt 0 priority level" \
+ "IPH.0 -- Defines the External Interrupt 0 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003716##
+ mcset $l "IPH.1 -- Defines the Timer 0 interrupt priority level" \
+ "IPH.1 -- Defines the Timer 0 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003717##
+ mcset $l "IPH.2 -- Defines External Interrupt 1 priority level" \
+ "IPH.2 -- Defines External Interrupt 1 priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003718##
+ mcset $l "IPH.3 -- Defines the Timer 1 interrupt priority level" \
+ "IPH.3 -- Defines the Timer 1 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003719##
+ mcset $l "IPH.4 -- Defines the Serial Port interrupt priority level" \
+ "IPH.4 -- Defines the Serial Port interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003720##
+ mcset $l "IPH.5 -- Defines the Timer 2 interrupt priority level" \
+ "IPH.5 -- Defines the Timer 2 interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003721##
+ mcset $l "IPH.6 -- Defines the comparator interrupt priority level" \
+ "IPH.6 -- Defines the comparator interrupt priority level" ;# <-- NOT TRANSLATED YET
+ ##ID:003722##
+ mcset $l "Interrupts in progress" \
+ "Interrupts in progress" ;# <-- NOT TRANSLATED YET
+ ##ID:003723##
+ mcset $l "Pending interrupts" \
+ "Pending interrupts" ;# <-- NOT TRANSLATED YET
+ ##ID:003724##
+ mcset $l "Interrupt priorities" \
+ "Interrupt priorities" ;# <-- NOT TRANSLATED YET
+ ##ID:003725##
+ mcset $l "Expand all" \
+ "Expand all" ;# <-- NOT TRANSLATED YET
+ ##ID:003726##
+ mcset $l "Collapse all" \
+ "Collapse all" ;# <-- NOT TRANSLATED YET
+ ##ID:003727##
+ mcset $l "Priority:" \
+ "Priority:" ;# <-- NOT TRANSLATED YET
+ ##ID:003728##
+ mcset $l "Invoked from:" \
+ "Invoked from:" ;# <-- NOT TRANSLATED YET
+}
+# rs232debugger.tcl
+# ==============================================================================
+namespace eval RS232Debugger {
+ ##ID:003729##
+ mcset $l "Special character file representing the target physical device" \
+ "Special character file representing the target physical device" ;# <-- NOT TRANSLATED YET
+ ##ID:003730##
+ mcset $l "Refresh list of relevant devices" \
+ "Refresh list of relevant devices" ;# <-- NOT TRANSLATED YET
+ ##ID:003731##
+ mcset $l "Connection speed in bps" \
+ "Connection speed in bps" ;# <-- NOT TRANSLATED YET
+ ##ID:003732##
+ mcset $l "Parity" \
+ "Parity" ;# <-- NOT TRANSLATED YET
+ ##ID:003733##
+ mcset $l "none" \
+ "none" ;# <-- NOT TRANSLATED YET
+ ##ID:003734##
+ mcset $l "odd" \
+ "odd" ;# <-- NOT TRANSLATED YET
+ ##ID:003735##
+ mcset $l "even" \
+ "even" ;# <-- NOT TRANSLATED YET
+ ##ID:003736##
+ mcset $l "mark" \
+ "mark" ;# <-- NOT TRANSLATED YET
+ ##ID:003737##
+ mcset $l "space" \
+ "space" ;# <-- NOT TRANSLATED YET
+ ##ID:003738##
+ mcset $l "Number of data bits" \
+ "Number of data bits" ;# <-- NOT TRANSLATED YET
+ ##ID:003739##
+ mcset $l "Number of stop bits" \
+ "Number of stop bits" ;# <-- NOT TRANSLATED YET
+ ##ID:003740##
+ mcset $l "Display incoming data or discard them" \
+ "Display incoming data or discard them" ;# <-- NOT TRANSLATED YET
+ ##ID:003741##
+ mcset $l "Remove selected data" \
+ "删除选定的数据"
+ ##ID:003742##
+ mcset $l "Send selected data" \
+ "发送选定的数据"
+ ##ID:003743##
+ mcset $l "Error message" \
+ "错误消息"
+ ##ID:003744##
+ mcset $l "Receive data on current cursor position" \
+ "Receive data on current cursor position" ;# <-- NOT TRANSLATED YET
+ ##ID:003745##
+ mcset $l "RS232 DBG: Invalid baud rate, setting to default: %s" \
+ "RS232 DBG: Invalid baud rate, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003746##
+ mcset $l "RS232 DBG: Invalid parity, setting to default: %s" \
+ "RS232 DBG: Invalid parity, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003747##
+ mcset $l "RS232 DBG: Invalid data length, setting to default: %s" \
+ "RS232 DBG: Invalid data length, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003748##
+ mcset $l "RS232 DBG: Invalid stop bit length, setting to default: %s" \
+ "RS232 DBG: Invalid stop bit length, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003749##
+ mcset $l "RS232 DBG: Invalid flag reception_enabled, setting to default: %s" \
+ "RS232 DBG: Invalid flag reception_enabled, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003750##
+ mcset $l "RS232 DBG: Invalid reception address, setting to default: %s" \
+ "RS232 DBG: Invalid reception address, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003751##
+ mcset $l "RS232 DBG: Invalid current cell address, setting to default: %s" \
+ "RS232 DBG: Invalid current cell address, setting to default: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:003752##
+ mcset $l "RS232 Debugger" \
+ "RS232 Debugger" ;# <-- NOT TRANSLATED YET
+ ##ID:003753##
+ mcset $l "UART/RS232 Debugger - MCU 8051 IDE" \
+ "UART/RS232调试 - MCU 8051 IDE"
+ ##ID:003754##
+ mcset $l "RS-232\nDTE" \
+ "RS-232\nDTE" ;# <-- NOT TRANSLATED YET
+ ##ID:003755##
+ mcset $l "DE-9" \
+ "DE-9" ;# <-- NOT TRANSLATED YET
+ ##ID:003756##
+ mcset $l "DCD" \
+ "DCD" ;# <-- NOT TRANSLATED YET
+ ##ID:003757##
+ mcset $l "DSR" \
+ "DSR" ;# <-- NOT TRANSLATED YET
+ ##ID:003758##
+ mcset $l "CTS" \
+ "CTS" ;# <-- NOT TRANSLATED YET
+ ##ID:003759##
+ mcset $l "RI" \
+ "RI" ;# <-- NOT TRANSLATED YET
+ ##ID:003760##
+ mcset $l "DTR" \
+ "DTR" ;# <-- NOT TRANSLATED YET
+ ##ID:003761##
+ mcset $l "RTS" \
+ "RTS" ;# <-- NOT TRANSLATED YET
+ ##ID:003762##
+ mcset $l "Break" \
+ "Break" ;# <-- NOT TRANSLATED YET
+ ##ID:003763##
+ mcset $l "Port configuration" \
+ "Port configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:003764##
+ mcset $l "Physical port" \
+ "Physical port" ;# <-- NOT TRANSLATED YET
+ ##ID:003765##
+ mcset $l "Baud rate" \
+ "Baud rate" ;# <-- NOT TRANSLATED YET
+ ##ID:003766##
+ mcset $l "Data bits" \
+ "Data bits" ;# <-- NOT TRANSLATED YET
+ ##ID:003767##
+ mcset $l "Stop bits" \
+ "Stop bits" ;# <-- NOT TRANSLATED YET
+ ##ID:003768##
+ mcset $l "Enable reception" \
+ "Enable reception" ;# <-- NOT TRANSLATED YET
+ ##ID:003769##
+ mcset $l "Terminate connection" \
+ "Terminate connection" ;# <-- NOT TRANSLATED YET
+ ##ID:003770##
+ mcset $l "Data to send" \
+ "Data to send" ;# <-- NOT TRANSLATED YET
+ ##ID:003771##
+ mcset $l "Received data" \
+ "Received data" ;# <-- NOT TRANSLATED YET
+ ##ID:003772##
+ mcset $l "Send selected" \
+ "Send selected" ;# <-- NOT TRANSLATED YET
+ ##ID:003773##
+ mcset $l "Clear selected" \
+ "Clear selected" ;# <-- NOT TRANSLATED YET
+ ##ID:003774##
+ mcset $l "Receive here" \
+ "Receive here" ;# <-- NOT TRANSLATED YET
+ ##ID:003775##
+ mcset $l "Unknown failure" \
+ "Unknown failure" ;# <-- NOT TRANSLATED YET
+ ##ID:003776##
+ mcset $l "Unable to change port configuration" \
+ "Unable to change port configuration" ;# <-- NOT TRANSLATED YET
+ ##ID:003777##
+ mcset $l "IO Error" \
+ "IO Error" ;# <-- NOT TRANSLATED YET
+ ##ID:003778##
+ mcset $l "No port opened." \
+ "No port opened." ;# <-- NOT TRANSLATED YET
+ ##ID:003779##
+ mcset $l "Unable to send the data\n\n%s" \
+ "Unable to send the data\n\n%s" ;# <-- NOT TRANSLATED YET
+ ##ID:003780##
+ mcset $l "Not enough space in the receive buffer !" \
+ "Not enough space in the receive buffer !" ;# <-- NOT TRANSLATED YET
+ ##ID:003781##
+ mcset $l "Ok" \
+ "Ok" ;# <-- NOT TRANSLATED YET
+ ##ID:003782##
+ mcset $l "Keep reception enabled" \
+ "Keep reception enabled" ;# <-- NOT TRANSLATED YET
+ ##ID:003783##
+ mcset $l "Data lost" \
+ "Data lost" ;# <-- NOT TRANSLATED YET
+ ##ID:003784##
+ mcset $l "There is something wrong with the port. Closing connection and disabling reception on this channel !" \
+ "There is something wrong with the port. Closing connection and disabling reception on this channel !" ;# <-- NOT TRANSLATED YET
+ ##ID:003785##
+ mcset $l "Access Error" \
+ "Access Error" ;# <-- NOT TRANSLATED YET
+ ##ID:003786##
+ mcset $l "Unable to open the specified file" \
+ "Unable to open the specified file" ;# <-- NOT TRANSLATED YET
+ ##ID:003787##
+ mcset $l "Unable to use the specified file" \
+ "Unable to use the specified file" ;# <-- NOT TRANSLATED YET
+ ##ID:003788##
+ mcset $l "RS232 pin: GND -- Common ground" \
+ "RS232 pin: GND -- Common ground" ;# <-- NOT TRANSLATED YET
+ ##ID:003789##
+ mcset $l "RS232 pin: DCD -- Carrier Detect" \
+ "RS232 pin: DCD -- Carrier Detect" ;# <-- NOT TRANSLATED YET
+ ##ID:003790##
+ mcset $l "RS232 pin: DSR -- Data Set Ready" \
+ "RS232 pin: DSR -- Data Set Ready" ;# <-- NOT TRANSLATED YET
+ ##ID:003791##
+ mcset $l "RS232 pin: CTS -- Clear To Send" \
+ "RS232 pin: CTS -- Clear To Send" ;# <-- NOT TRANSLATED YET
+ ##ID:003792##
+ mcset $l "RS232 pin: RI -- Ring Indicator" \
+ "RS232 pin: RI -- Ring Indicator" ;# <-- NOT TRANSLATED YET
+ ##ID:003793##
+ mcset $l "RS232 pin: DTR -- Data Terminal Ready" \
+ "RS232 pin: DTR -- Data Terminal Ready" ;# <-- NOT TRANSLATED YET
+ ##ID:003794##
+ mcset $l "RS232 pin: RTS -- Request To Send" \
+ "RS232 pin: RTS -- Request To Send" ;# <-- NOT TRANSLATED YET
+ ##ID:003795##
+ mcset $l "RS232 pin: TxD -- Transmitted Data" \
+ "RS232 pin: TxD -- Transmitted Data" ;# <-- NOT TRANSLATED YET
+ ##ID:003796##
+ mcset $l "RS232 pin: RxD -- Received Data" \
+ "RS232 pin: RxD -- Received Data" ;# <-- NOT TRANSLATED YET
+}
+# speccalc.tcl
+# ==============================================================================
+namespace eval SpecCalc {
+ ##ID:003797##
+ mcset $l "Loops" \
+ "Loops" ;# <-- NOT TRANSLATED YET
+ ##ID:003798##
+ mcset $l "Timer 0/1" \
+ "定时器 0/1"
+ ##ID:003799##
+ mcset $l "Timer 2" \
+ "定时器 2"
+ ##ID:003800##
+ mcset $l "SPI" \
+ "SPI" ;# <-- NOT TRANSLATED YET
+ ##ID:003801##
+ mcset $l "Calculate timer preset" \
+ "计算定时器的预置"
+ ##ID:003802##
+ mcset $l "Preset" \
+ "预设"
+ ##ID:003803##
+ mcset $l "Clock out" \
+ "Clock out" ;# <-- NOT TRANSLATED YET
+ ##ID:003804##
+ mcset $l "Special Calculator - MCU 8051 IDE" \
+ "特殊计算器 - MCU 8051 IDE"
+ ##ID:003805##
+ mcset $l "Time" \
+ "Time" ;# <-- NOT TRANSLATED YET
+ ##ID:003806##
+ mcset $l "Time unit" \
+ "Time unit" ;# <-- NOT TRANSLATED YET
+ ##ID:003807##
+ mcset $l "Clock \[kHz\]" \
+ "Clock \[kHz\]" ;# <-- NOT TRANSLATED YET
+ ##ID:003808##
+ mcset $l "MCU clock" \
+ "MCU clock" ;# <-- NOT TRANSLATED YET
+ ##ID:003809##
+ mcset $l "Clock cycles per machine cycle\n 12 - Common 8051\n 6 - Core 51X2\n 1 - Single cycle core" \
+ "Clock cycles per machine cycle\n 12 - Common 8051\n 6 - Core 51X2\n 1 - Single cycle core" ;# <-- NOT TRANSLATED YET
+ ##ID:003810##
+ mcset $l "Clock cycles per machine cycle" \
+ "Clock cycles per machine cycle" ;# <-- NOT TRANSLATED YET
+ ##ID:003811##
+ mcset $l "Registers to use" \
+ "使用寄存器"
+ ##ID:003812##
+ mcset $l "Source code:" \
+ "Source code:" ;# <-- NOT TRANSLATED YET
+ ##ID:003813##
+ mcset $l "Evaluate" \
+ "Evaluate" ;# <-- NOT TRANSLATED YET
+ ##ID:003814##
+ mcset $l "Copy" \
+ "复制"
+ ##ID:003815##
+ mcset $l "Create a wait loop" \
+ "Create a wait loop" ;# <-- NOT TRANSLATED YET
+ ##ID:003816##
+ mcset $l "Mode" \
+ "模式"
+ ##ID:003817##
+ mcset $l "Timer mode" \
+ "定时器模式"
+ ##ID:003818##
+ mcset $l "Show functional block diagram" \
+ "Show functional block diagram" ;# <-- NOT TRANSLATED YET
+ ##ID:003819##
+ mcset $l "Enhanced timer/counter" \
+ "Enhanced timer/counter" ;# <-- NOT TRANSLATED YET
+ ##ID:003820##
+ mcset $l "Calculate for enhanced timers" \
+ "Calculate for enhanced timers" ;# <-- NOT TRANSLATED YET
+ ##ID:003821##
+ mcset $l "The number of active bits in TL1 minus 1" \
+ "The number of active bits in TL1 minus 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003822##
+ mcset $l "Results:" \
+ "结果:"
+ ##ID:003823##
+ mcset $l "TH" \
+ "TH" ;# <-- NOT TRANSLATED YET
+ ##ID:003824##
+ mcset $l "TL" \
+ "TL" ;# <-- NOT TRANSLATED YET
+ ##ID:003825##
+ mcset $l "RH" \
+ "RH" ;# <-- NOT TRANSLATED YET
+ ##ID:003826##
+ mcset $l "RL" \
+ "RL" ;# <-- NOT TRANSLATED YET
+ ##ID:003827##
+ mcset $l "Repeats" \
+ "重复"
+ ##ID:003828##
+ mcset $l "Rest" \
+ "休息"
+ ##ID:003829##
+ mcset $l "Do not change" \
+ "不要更改"
+ ##ID:003830##
+ mcset $l "Zero" \
+ "Zero" ;# <-- NOT TRANSLATED YET
+ ##ID:003831##
+ mcset $l "none" \
+ "无"
+ ##ID:003832##
+ mcset $l "Calculate timer 0/1 preset" \
+ "Calculate timer 0/1 preset" ;# <-- NOT TRANSLATED YET
+ ##ID:003833##
+ mcset $l "RCAL2H" \
+ "RCAL2H" ;# <-- NOT TRANSLATED YET
+ ##ID:003834##
+ mcset $l "RCAL2L" \
+ "RCAL2L" ;# <-- NOT TRANSLATED YET
+ ##ID:003835##
+ mcset $l "T2H" \
+ "T2H" ;# <-- NOT TRANSLATED YET
+ ##ID:003836##
+ mcset $l "T2L" \
+ "T2L" ;# <-- NOT TRANSLATED YET
+ ##ID:003837##
+ mcset $l "Calculate timer 2 preset" \
+ "Calculate timer 2 preset" ;# <-- NOT TRANSLATED YET
+ ##ID:003838##
+ mcset $l "Frequency" \
+ "Frequency" ;# <-- NOT TRANSLATED YET
+ ##ID:003839##
+ mcset $l "F osc" \
+ "F osc" ;# <-- NOT TRANSLATED YET
+ ##ID:003840##
+ mcset $l "X2" \
+ "X2" ;# <-- NOT TRANSLATED YET
+ ##ID:003841##
+ mcset $l "HEX" \
+ "HEX" ;# <-- NOT TRANSLATED YET
+ ##ID:003842##
+ mcset $l "DEC" \
+ "DEC" ;# <-- NOT TRANSLATED YET
+ ##ID:003843##
+ mcset $l "RCAP2H" \
+ "RCAP2H" ;# <-- NOT TRANSLATED YET
+ ##ID:003844##
+ mcset $l "RCAP2L" \
+ "RCAP2L" ;# <-- NOT TRANSLATED YET
+ ##ID:003845##
+ mcset $l "Error" \
+ "错误"
+ ##ID:003846##
+ mcset $l "Calculate clock output" \
+ "Calculate clock output" ;# <-- NOT TRANSLATED YET
+ ##ID:003847##
+ mcset $l "Baud rate" \
+ "波特率"
+ ##ID:003848##
+ mcset $l "UART mode" \
+ "UART模式"
+ ##ID:003849##
+ mcset $l "Generator" \
+ "Generator" ;# <-- NOT TRANSLATED YET
+ ##ID:003850##
+ mcset $l "Baud rate generator" \
+ "Baud rate generator" ;# <-- NOT TRANSLATED YET
+ ##ID:003851##
+ mcset $l "Bit PCON.7 -- Double baud rate" \
+ "Bit PCON.7 -- Double baud rate" ;# <-- NOT TRANSLATED YET
+ ##ID:003852##
+ mcset $l "SPD (SPeeD) in BDRCON register" \
+ "SPD (SPeeD) in BDRCON register" ;# <-- NOT TRANSLATED YET
+ ##ID:003853##
+ mcset $l "Calculate for enhanced timer 1" \
+ "Calculate for enhanced timer 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003854##
+ mcset $l "T1 mode" \
+ "T1模式"
+ ##ID:003855##
+ mcset $l "Timer 1 mode" \
+ "Timer 1 mode" ;# <-- NOT TRANSLATED YET
+ ##ID:003856##
+ mcset $l "UART baud rate" \
+ "UART baud rate" ;# <-- NOT TRANSLATED YET
+ ##ID:003857##
+ mcset $l "Mode X2 or single cycle core" \
+ "Mode X2 or single cycle core" ;# <-- NOT TRANSLATED YET
+ ##ID:003858##
+ mcset $l "SCK \[kHz\]" \
+ "SCK \[kHz\]" ;# <-- NOT TRANSLATED YET
+ ##ID:003859##
+ mcset $l "Set MCU oscillator to " \
+ "设置MCU振荡器 "
+ ##ID:003860##
+ mcset $l " kHz" \
+ " kHz" ;# <-- NOT TRANSLATED YET
+ ##ID:003861##
+ mcset $l "Calculate oscillator frequency" \
+ "振荡频率计算"
+ ##ID:003862##
+ mcset $l "Unable to evaluate" \
+ "Unable to evaluate" ;# <-- NOT TRANSLATED YET
+ ##ID:003863##
+ mcset $l "ERROR: Missing time\n" \
+ "ERROR: Missing time\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003864##
+ mcset $l "ERROR: Time rate cannot be 0\n" \
+ "ERROR: Time rate cannot be 0\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003865##
+ mcset $l "ERROR: Missing MCU clock rate\n" \
+ "ERROR: Missing MCU clock rate\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003866##
+ mcset $l "ERROR: MCU clock rate cannot be 0\n" \
+ "ERROR: MCU clock rate cannot be 0\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003867##
+ mcset $l "ERROR: Missing register name %s\n" \
+ "ERROR: Missing register name %s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003868##
+ mcset $l "ERROR: Ambiguous register name %s\n" \
+ "ERROR: Ambiguous register name %s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003869##
+ mcset $l "; START: Wait loop, time: %s %s\n; Clock: %s kHz (%s)\n; Used registers: " \
+ "; START: Wait loop, time: %s %s\n; Clock: %s kHz (%s)\n; Used registers: " ;# <-- NOT TRANSLATED YET
+ ##ID:003870##
+ mcset $l "; Rest: %s\n" \
+ "; Rest: %s\n" ;# <-- NOT TRANSLATED YET
+ ##ID:003871##
+ mcset $l "; END: Wait loop" \
+ "; END: Wait loop" ;# <-- NOT TRANSLATED YET
+ ##ID:003872##
+ mcset $l "Invalid time" \
+ "无效的时间"
+ ##ID:003873##
+ mcset $l "Invalid clock rate" \
+ "无效的时钟频率"
+ ##ID:003874##
+ mcset $l "Value is too high" \
+ "值过高"
+ ##ID:003875##
+ mcset $l "One" \
+ "One" ;# <-- NOT TRANSLATED YET
+ ##ID:003876##
+ mcset $l "Timer 0/1 in mode 0" \
+ "Timer 0/1 in mode 0" ;# <-- NOT TRANSLATED YET
+ ##ID:003877##
+ mcset $l "Timer 0/1 in mode 1" \
+ "Timer 0/1 in mode 1" ;# <-- NOT TRANSLATED YET
+ ##ID:003878##
+ mcset $l "Timer 0/1 in mode 2" \
+ "Timer 0/1 in mode 2" ;# <-- NOT TRANSLATED YET
+ ##ID:003879##
+ mcset $l "Timer 2 as up/down counter" \
+ "Timer 2 as up/down counter" ;# <-- NOT TRANSLATED YET
+ ##ID:003880##
+ mcset $l "Timer 1/2 as UART baud rate generator" \
+ "Timer 1/2 as UART baud rate generator" ;# <-- NOT TRANSLATED YET
+ ##ID:003881##
+ mcset $l "Internal baud rate generator" \
+ "Internal baud rate generator" ;# <-- NOT TRANSLATED YET
+ ##ID:003882##
+ mcset $l "Diagram or formula" \
+ "Diagram or formula" ;# <-- NOT TRANSLATED YET
+ ##ID:003883##
+ mcset $l "UART baud rate generator" \
+ "UART baud rate generator" ;# <-- NOT TRANSLATED YET
+ ##ID:003884##
+ mcset $l "All files" \
+ "所有文件"
+ ##ID:003885##
+ mcset $l "Text files" \
+ "文本文件"
+ ##ID:003886##
+ mcset $l "HTML files" \
+ "HTML文件"
+}
+# table_of_instructions.tcl
+# ==============================================================================
+namespace eval TableOfInstructions {
+ ##ID:003887##
+ mcset $l "Exit" \
+ "退出"
+ ##ID:003888##
+ mcset $l "OP code (hex): " \
+ "OP code (hex): " ;# <-- NOT TRANSLATED YET
+ ##ID:003889##
+ mcset $l "Class: " \
+ "Class: " ;# <-- NOT TRANSLATED YET
+ ##ID:003890##
+ mcset $l "Description: " \
+ "Description: " ;# <-- NOT TRANSLATED YET
+ ##ID:003891##
+ mcset $l "Length: " \
+ "Length: " ;# <-- NOT TRANSLATED YET
+ ##ID:003892##
+ mcset $l "Time: " \
+ "Time: " ;# <-- NOT TRANSLATED YET
+ ##ID:003893##
+ mcset $l "Flags: " \
+ "Flags: " ;# <-- NOT TRANSLATED YET
+ ##ID:003894##
+ mcset $l "Note: " \
+ "Note: " ;# <-- NOT TRANSLATED YET
+ ##ID:003895##
+ mcset $l "OP code not defined" \
+ "OP code not defined" ;# <-- NOT TRANSLATED YET
+ ##ID:003896##
+ mcset $l "This instruction does not exist on 8051" \
+ "This instruction does not exist on 8051" ;# <-- NOT TRANSLATED YET
+ ##ID:003897##
+ mcset $l "Operands" \
+ "Operands" ;# <-- NOT TRANSLATED YET
+ ##ID:003898##
+ mcset $l "Length" \
+ "Length" ;# <-- NOT TRANSLATED YET
+ ##ID:003899##
+ mcset $l "Time" \
+ "Time" ;# <-- NOT TRANSLATED YET
+ ##ID:003900##
+ mcset $l "Mnemonics" \
+ "Mnemonics" ;# <-- NOT TRANSLATED YET
+}
+# spell_check.tcl
+# ==============================================================================
+namespace eval Editor {
+ ##ID:003901##
+ mcset $l "Hunspell error" \
+ "Hunspell error" ;# <-- NOT TRANSLATED YET
+ ##ID:003902##
+ mcset $l "Unable to start the spell checker. Please try to re-install the hunspell. Spell checking function will not be available" \
+ "Unable to start the spell checker. Please try to re-install the hunspell. Spell checking function will not be available" ;# <-- NOT TRANSLATED YET
+ ##ID:003903##
+ mcset $l "Refresh list of dictionaries" \
+ "Refresh list of dictionaries" ;# <-- NOT TRANSLATED YET
+ ##ID:003904##
+ mcset $l "Turn off spell checking" \
+ "Turn off spell checking" ;# <-- NOT TRANSLATED YET
+ ##ID:003905##
+ mcset $l "Set dictionary by language" \
+ "Set dictionary by language" ;# <-- NOT TRANSLATED YET
+ ##ID:003906##
+ mcset $l "Set dictionary by country" \
+ "Set dictionary by country" ;# <-- NOT TRANSLATED YET
+ ##ID:003907##
+ mcset $l "File changed on disk" \
+ "File changed on disk" ;# <-- NOT TRANSLATED YET
+ ##ID:003908##
+ mcset $l "The file '%s' was modified from outside of this program.\n\nWhat do you want to do with the modified file" \
+ "The file '%s' was modified from outside of this program.\n\nWhat do you want to do with the modified file" ;# <-- NOT TRANSLATED YET
+ ##ID:003909##
+ mcset $l "Reload in editor" \
+ "Reload in editor" ;# <-- NOT TRANSLATED YET
+ ##ID:003910##
+ mcset $l "Overwrite on disk" \
+ "Overwrite on disk" ;# <-- NOT TRANSLATED YET
+ ##ID:003911##
+ mcset $l "Do nothing" \
+ "Do nothing" ;# <-- NOT TRANSLATED YET
+ # Names of languages
+ ##ID:003912##
+ mcset $l "Abkhazian" \
+ "Abkhazian" ;# <-- NOT TRANSLATED YET
+ ##ID:003913##
+ mcset $l "Afar" \
+ "Afar" ;# <-- NOT TRANSLATED YET
+ ##ID:003914##
+ mcset $l "Afrikaans" \
+ "Afrikaans" ;# <-- NOT TRANSLATED YET
+ ##ID:003915##
+ mcset $l "Akan" \
+ "Akan" ;# <-- NOT TRANSLATED YET
+ ##ID:003916##
+ mcset $l "Albanian" \
+ "Albanian" ;# <-- NOT TRANSLATED YET
+ ##ID:003917##
+ mcset $l "Amharic" \
+ "Amharic" ;# <-- NOT TRANSLATED YET
+ ##ID:003918##
+ mcset $l "Arabic" \
+ "Arabic" ;# <-- NOT TRANSLATED YET
+ ##ID:003919##
+ mcset $l "Aragonese" \
+ "Aragonese" ;# <-- NOT TRANSLATED YET
+ ##ID:003920##
+ mcset $l "Armenian" \
+ "Armenian" ;# <-- NOT TRANSLATED YET
+ ##ID:003921##
+ mcset $l "Assamese" \
+ "Assamese" ;# <-- NOT TRANSLATED YET
+ ##ID:003922##
+ mcset $l "Avaric" \
+ "Avaric" ;# <-- NOT TRANSLATED YET
+ ##ID:003923##
+ mcset $l "Avestan" \
+ "Avestan" ;# <-- NOT TRANSLATED YET
+ ##ID:003924##
+ mcset $l "Aymara" \
+ "Aymara" ;# <-- NOT TRANSLATED YET
+ ##ID:003925##
+ mcset $l "Azerbaijani" \
+ "Azerbaijani" ;# <-- NOT TRANSLATED YET
+ ##ID:003926##
+ mcset $l "Bambara" \
+ "Bambara" ;# <-- NOT TRANSLATED YET
+ ##ID:003927##
+ mcset $l "Bashkir" \
+ "Bashkir" ;# <-- NOT TRANSLATED YET
+ ##ID:003928##
+ mcset $l "Basque" \
+ "Basque" ;# <-- NOT TRANSLATED YET
+ ##ID:003929##
+ mcset $l "Belarusian" \
+ "Belarusian" ;# <-- NOT TRANSLATED YET
+ ##ID:003930##
+ mcset $l "Bengali" \
+ "Bengali" ;# <-- NOT TRANSLATED YET
+ ##ID:003931##
+ mcset $l "Bihari languages" \
+ "Bihari languages" ;# <-- NOT TRANSLATED YET
+ ##ID:003932##
+ mcset $l "Bislama" \
+ "Bislama" ;# <-- NOT TRANSLATED YET
+ ##ID:003933##
+ mcset $l "Bokmål, Norwegian" \
+ "Bokmål, Norwegian" ;# <-- NOT TRANSLATED YET
+ ##ID:003934##
+ mcset $l "Bosnian" \
+ "Bosnian" ;# <-- NOT TRANSLATED YET
+ ##ID:003935##
+ mcset $l "Breton" \
+ "Breton" ;# <-- NOT TRANSLATED YET
+ ##ID:003936##
+ mcset $l "Bulgarian" \
+ "Bulgarian" ;# <-- NOT TRANSLATED YET
+ ##ID:003937##
+ mcset $l "Burmese" \
+ "Burmese" ;# <-- NOT TRANSLATED YET
+ ##ID:003938##
+ mcset $l "Castilian" \
+ "Castilian" ;# <-- NOT TRANSLATED YET
+ ##ID:003939##
+ mcset $l "Catalan" \
+ "Catalan" ;# <-- NOT TRANSLATED YET
+ ##ID:003940##
+ mcset $l "Central Khmer" \
+ "Central Khmer" ;# <-- NOT TRANSLATED YET
+ ##ID:003941##
+ mcset $l "Chamorro" \
+ "Chamorro" ;# <-- NOT TRANSLATED YET
+ ##ID:003942##
+ mcset $l "Chechen" \
+ "Chechen" ;# <-- NOT TRANSLATED YET
+ ##ID:003943##
+ mcset $l "Chewa" \
+ "Chewa" ;# <-- NOT TRANSLATED YET
+ ##ID:003944##
+ mcset $l "Chichewa" \
+ "Chichewa" ;# <-- NOT TRANSLATED YET
+ ##ID:003945##
+ mcset $l "Chinese" \
+ "Chinese" ;# <-- NOT TRANSLATED YET
+ ##ID:003946##
+ mcset $l "Chuang" \
+ "Chuang" ;# <-- NOT TRANSLATED YET
+ ##ID:003947##
+ mcset $l "Church Slavic" \
+ "Church Slavic" ;# <-- NOT TRANSLATED YET
+ ##ID:003948##
+ mcset $l "Church Slavonic" \
+ "Church Slavonic" ;# <-- NOT TRANSLATED YET
+ ##ID:003949##
+ mcset $l "Chuvash" \
+ "Chuvash" ;# <-- NOT TRANSLATED YET
+ ##ID:003950##
+ mcset $l "Cornish" \
+ "Cornish" ;# <-- NOT TRANSLATED YET
+ ##ID:003951##
+ mcset $l "Corsican" \
+ "Corsican" ;# <-- NOT TRANSLATED YET
+ ##ID:003952##
+ mcset $l "Cree" \
+ "Cree" ;# <-- NOT TRANSLATED YET
+ ##ID:003953##
+ mcset $l "Croatian" \
+ "Croatian" ;# <-- NOT TRANSLATED YET
+ ##ID:003954##
+ mcset $l "Czech" \
+ "Czech" ;# <-- NOT TRANSLATED YET
+ ##ID:003955##
+ mcset $l "Danish" \
+ "Danish" ;# <-- NOT TRANSLATED YET
+ ##ID:003956##
+ mcset $l "Dhivehi" \
+ "Dhivehi" ;# <-- NOT TRANSLATED YET
+ ##ID:003957##
+ mcset $l "Divehi" \
+ "Divehi" ;# <-- NOT TRANSLATED YET
+ ##ID:003958##
+ mcset $l "Dutch" \
+ "Dutch" ;# <-- NOT TRANSLATED YET
+ ##ID:003959##
+ mcset $l "Dzongkha" \
+ "Dzongkha" ;# <-- NOT TRANSLATED YET
+ ##ID:003960##
+ mcset $l "English" \
+ "English" ;# <-- NOT TRANSLATED YET
+ ##ID:003961##
+ mcset $l "Esperanto" \
+ "Esperanto" ;# <-- NOT TRANSLATED YET
+ ##ID:003962##
+ mcset $l "Estonian" \
+ "Estonian" ;# <-- NOT TRANSLATED YET
+ ##ID:003963##
+ mcset $l "Ewe" \
+ "Ewe" ;# <-- NOT TRANSLATED YET
+ ##ID:003964##
+ mcset $l "Faroese" \
+ "Faroese" ;# <-- NOT TRANSLATED YET
+ ##ID:003965##
+ mcset $l "Fijian" \
+ "Fijian" ;# <-- NOT TRANSLATED YET
+ ##ID:003966##
+ mcset $l "Finnish" \
+ "Finnish" ;# <-- NOT TRANSLATED YET
+ ##ID:003967##
+ mcset $l "Flemish" \
+ "Flemish" ;# <-- NOT TRANSLATED YET
+ ##ID:003968##
+ mcset $l "French" \
+ "French" ;# <-- NOT TRANSLATED YET
+ ##ID:003969##
+ mcset $l "Fulah" \
+ "Fulah" ;# <-- NOT TRANSLATED YET
+ ##ID:003970##
+ mcset $l "Gaelic" \
+ "Gaelic" ;# <-- NOT TRANSLATED YET
+ ##ID:003971##
+ mcset $l "Galician" \
+ "Galician" ;# <-- NOT TRANSLATED YET
+ ##ID:003972##
+ mcset $l "Ganda" \
+ "Ganda" ;# <-- NOT TRANSLATED YET
+ ##ID:003973##
+ mcset $l "Georgian" \
+ "Georgian" ;# <-- NOT TRANSLATED YET
+ ##ID:003974##
+ mcset $l "German" \
+ "German" ;# <-- NOT TRANSLATED YET
+ ##ID:003975##
+ mcset $l "Gikuyu" \
+ "Gikuyu" ;# <-- NOT TRANSLATED YET
+ ##ID:003976##
+ mcset $l "Greek, Modern" \
+ "Greek, Modern" ;# <-- NOT TRANSLATED YET
+ ##ID:003977##
+ mcset $l "Greenlandic" \
+ "Greenlandic" ;# <-- NOT TRANSLATED YET
+ ##ID:003978##
+ mcset $l "Guarani" \
+ "Guarani" ;# <-- NOT TRANSLATED YET
+ ##ID:003979##
+ mcset $l "Gujarati" \
+ "Gujarati" ;# <-- NOT TRANSLATED YET
+ ##ID:003980##
+ mcset $l "Haitian" \
+ "Haitian" ;# <-- NOT TRANSLATED YET
+ ##ID:003981##
+ mcset $l "Haitian Creole" \
+ "Haitian Creole" ;# <-- NOT TRANSLATED YET
+ ##ID:003982##
+ mcset $l "Hausa" \
+ "Hausa" ;# <-- NOT TRANSLATED YET
+ ##ID:003983##
+ mcset $l "Hebrew" \
+ "Hebrew" ;# <-- NOT TRANSLATED YET
+ ##ID:003984##
+ mcset $l "Herero" \
+ "Herero" ;# <-- NOT TRANSLATED YET
+ ##ID:003985##
+ mcset $l "Hindi" \
+ "Hindi" ;# <-- NOT TRANSLATED YET
+ ##ID:003986##
+ mcset $l "Hiri Motu" \
+ "Hiri Motu" ;# <-- NOT TRANSLATED YET
+ ##ID:003987##
+ mcset $l "Hungarian" \
+ "Hungarian" ;# <-- NOT TRANSLATED YET
+ ##ID:003988##
+ mcset $l "Icelandic" \
+ "Icelandic" ;# <-- NOT TRANSLATED YET
+ ##ID:003989##
+ mcset $l "Ido" \
+ "Ido" ;# <-- NOT TRANSLATED YET
+ ##ID:003990##
+ mcset $l "Igbo" \
+ "Igbo" ;# <-- NOT TRANSLATED YET
+ ##ID:003991##
+ mcset $l "Indonesian" \
+ "Indonesian" ;# <-- NOT TRANSLATED YET
+ ##ID:003992##
+ mcset $l "Interlingue" \
+ "Interlingue" ;# <-- NOT TRANSLATED YET
+ ##ID:003993##
+ mcset $l "Inuktitut" \
+ "Inuktitut" ;# <-- NOT TRANSLATED YET
+ ##ID:003994##
+ mcset $l "Inupiaq" \
+ "Inupiaq" ;# <-- NOT TRANSLATED YET
+ ##ID:003995##
+ mcset $l "Irish" \
+ "Irish" ;# <-- NOT TRANSLATED YET
+ ##ID:003996##
+ mcset $l "Italian" \
+ "Italian" ;# <-- NOT TRANSLATED YET
+ ##ID:003997##
+ mcset $l "Japanese" \
+ "Japanese" ;# <-- NOT TRANSLATED YET
+ ##ID:003998##
+ mcset $l "Javanese" \
+ "Javanese" ;# <-- NOT TRANSLATED YET
+ ##ID:003999##
+ mcset $l "Kalaallisut" \
+ "Kalaallisut" ;# <-- NOT TRANSLATED YET
+ ##ID:004000##
+ mcset $l "Kannada" \
+ "Kannada" ;# <-- NOT TRANSLATED YET
+ ##ID:004001##
+ mcset $l "Kanuri" \
+ "Kanuri" ;# <-- NOT TRANSLATED YET
+ ##ID:004002##
+ mcset $l "Kashmiri" \
+ "Kashmiri" ;# <-- NOT TRANSLATED YET
+ ##ID:004003##
+ mcset $l "Kazakh" \
+ "Kazakh" ;# <-- NOT TRANSLATED YET
+ ##ID:004004##
+ mcset $l "Kikuyu" \
+ "Kikuyu" ;# <-- NOT TRANSLATED YET
+ ##ID:004005##
+ mcset $l "Kinyarwanda" \
+ "Kinyarwanda" ;# <-- NOT TRANSLATED YET
+ ##ID:004006##
+ mcset $l "Kirghiz" \
+ "Kirghiz" ;# <-- NOT TRANSLATED YET
+ ##ID:004007##
+ mcset $l "Komi" \
+ "Komi" ;# <-- NOT TRANSLATED YET
+ ##ID:004008##
+ mcset $l "Kongo" \
+ "Kongo" ;# <-- NOT TRANSLATED YET
+ ##ID:004009##
+ mcset $l "Korean" \
+ "Korean" ;# <-- NOT TRANSLATED YET
+ ##ID:004010##
+ mcset $l "Kuanyama" \
+ "Kuanyama" ;# <-- NOT TRANSLATED YET
+ ##ID:004011##
+ mcset $l "Kurdish" \
+ "Kurdish" ;# <-- NOT TRANSLATED YET
+ ##ID:004012##
+ mcset $l "Kwanyama" \
+ "Kwanyama" ;# <-- NOT TRANSLATED YET
+ ##ID:004013##
+ mcset $l "Kyrgyz" \
+ "Kyrgyz" ;# <-- NOT TRANSLATED YET
+ ##ID:004014##
+ mcset $l "Lao" \
+ "Lao" ;# <-- NOT TRANSLATED YET
+ ##ID:004015##
+ mcset $l "Latin" \
+ "Latin" ;# <-- NOT TRANSLATED YET
+ ##ID:004016##
+ mcset $l "Latvian" \
+ "Latvian" ;# <-- NOT TRANSLATED YET
+ ##ID:004017##
+ mcset $l "Letzeburgesch" \
+ "Letzeburgesch" ;# <-- NOT TRANSLATED YET
+ ##ID:004018##
+ mcset $l "Limburgan" \
+ "Limburgan" ;# <-- NOT TRANSLATED YET
+ ##ID:004019##
+ mcset $l "Limburger" \
+ "Limburger" ;# <-- NOT TRANSLATED YET
+ ##ID:004020##
+ mcset $l "Limburgish" \
+ "Limburgish" ;# <-- NOT TRANSLATED YET
+ ##ID:004021##
+ mcset $l "Lingala" \
+ "Lingala" ;# <-- NOT TRANSLATED YET
+ ##ID:004022##
+ mcset $l "Lithuanian" \
+ "Lithuanian" ;# <-- NOT TRANSLATED YET
+ ##ID:004023##
+ mcset $l "Luba-Katanga" \
+ "Luba-Katanga" ;# <-- NOT TRANSLATED YET
+ ##ID:004024##
+ mcset $l "Luxembourgish" \
+ "Luxembourgish" ;# <-- NOT TRANSLATED YET
+ ##ID:004025##
+ mcset $l "Macedonian" \
+ "Macedonian" ;# <-- NOT TRANSLATED YET
+ ##ID:004026##
+ mcset $l "Malagasy" \
+ "Malagasy" ;# <-- NOT TRANSLATED YET
+ ##ID:004027##
+ mcset $l "Malay" \
+ "Malay" ;# <-- NOT TRANSLATED YET
+ ##ID:004028##
+ mcset $l "Malayalam" \
+ "Malayalam" ;# <-- NOT TRANSLATED YET
+ ##ID:004029##
+ mcset $l "Maldivian" \
+ "Maldivian" ;# <-- NOT TRANSLATED YET
+ ##ID:004030##
+ mcset $l "Maltese" \
+ "Maltese" ;# <-- NOT TRANSLATED YET
+ ##ID:004031##
+ mcset $l "Manx" \
+ "Manx" ;# <-- NOT TRANSLATED YET
+ ##ID:004032##
+ mcset $l "Maori" \
+ "Maori" ;# <-- NOT TRANSLATED YET
+ ##ID:004033##
+ mcset $l "Marathi" \
+ "Marathi" ;# <-- NOT TRANSLATED YET
+ ##ID:004034##
+ mcset $l "Marshallese" \
+ "Marshallese" ;# <-- NOT TRANSLATED YET
+ ##ID:004035##
+ mcset $l "Moldavian" \
+ "Moldavian" ;# <-- NOT TRANSLATED YET
+ ##ID:004036##
+ mcset $l "Moldovan" \
+ "Moldovan" ;# <-- NOT TRANSLATED YET
+ ##ID:004037##
+ mcset $l "Mongolian" \
+ "Mongolian" ;# <-- NOT TRANSLATED YET
+ ##ID:004038##
+ mcset $l "Nauru" \
+ "Nauru" ;# <-- NOT TRANSLATED YET
+ ##ID:004039##
+ mcset $l "Navaho" \
+ "Navaho" ;# <-- NOT TRANSLATED YET
+ ##ID:004040##
+ mcset $l "Navajo" \
+ "Navajo" ;# <-- NOT TRANSLATED YET
+ ##ID:004041##
+ mcset $l "Ndebele, North" \
+ "Ndebele, North" ;# <-- NOT TRANSLATED YET
+ ##ID:004042##
+ mcset $l "Ndebele, South" \
+ "Ndebele, South" ;# <-- NOT TRANSLATED YET
+ ##ID:004043##
+ mcset $l "Ndonga" \
+ "Ndonga" ;# <-- NOT TRANSLATED YET
+ ##ID:004044##
+ mcset $l "Nepali" \
+ "Nepali" ;# <-- NOT TRANSLATED YET
+ ##ID:004045##
+ mcset $l "North Ndebele" \
+ "North Ndebele" ;# <-- NOT TRANSLATED YET
+ ##ID:004046##
+ mcset $l "Northern Sami" \
+ "Northern Sami" ;# <-- NOT TRANSLATED YET
+ ##ID:004047##
+ mcset $l "Norwegian" \
+ "Norwegian" ;# <-- NOT TRANSLATED YET
+ ##ID:004048##
+ mcset $l "Norwegian Bokmål" \
+ "Norwegian Bokmål" ;# <-- NOT TRANSLATED YET
+ ##ID:004049##
+ mcset $l "Norwegian Nynorsk" \
+ "Norwegian Nynorsk" ;# <-- NOT TRANSLATED YET
+ ##ID:004050##
+ mcset $l "Nuosu" \
+ "Nuosu" ;# <-- NOT TRANSLATED YET
+ ##ID:004051##
+ mcset $l "Nyanja" \
+ "Nyanja" ;# <-- NOT TRANSLATED YET
+ ##ID:004052##
+ mcset $l "Nynorsk, Norwegian" \
+ "Nynorsk, Norwegian" ;# <-- NOT TRANSLATED YET
+ ##ID:004053##
+ mcset $l "Occidental" \
+ "Occidental" ;# <-- NOT TRANSLATED YET
+ ##ID:004054##
+ mcset $l "Occitan" \
+ "Occitan" ;# <-- NOT TRANSLATED YET
+ ##ID:004055##
+ mcset $l "Ojibwa" \
+ "Ojibwa" ;# <-- NOT TRANSLATED YET
+ ##ID:004056##
+ mcset $l "Old Bulgarian" \
+ "Old Bulgarian" ;# <-- NOT TRANSLATED YET
+ ##ID:004057##
+ mcset $l "Old Church Slavonic" \
+ "Old Church Slavonic" ;# <-- NOT TRANSLATED YET
+ ##ID:004058##
+ mcset $l "Old Slavonic" \
+ "Old Slavonic" ;# <-- NOT TRANSLATED YET
+ ##ID:004059##
+ mcset $l "Oriya" \
+ "Oriya" ;# <-- NOT TRANSLATED YET
+ ##ID:004060##
+ mcset $l "Oromo" \
+ "Oromo" ;# <-- NOT TRANSLATED YET
+ ##ID:004061##
+ mcset $l "Ossetian" \
+ "Ossetian" ;# <-- NOT TRANSLATED YET
+ ##ID:004062##
+ mcset $l "Ossetic" \
+ "Ossetic" ;# <-- NOT TRANSLATED YET
+ ##ID:004063##
+ mcset $l "Pali" \
+ "Pali" ;# <-- NOT TRANSLATED YET
+ ##ID:004064##
+ mcset $l "Panjabi" \
+ "Panjabi" ;# <-- NOT TRANSLATED YET
+ ##ID:004065##
+ mcset $l "Pashto" \
+ "Pashto" ;# <-- NOT TRANSLATED YET
+ ##ID:004066##
+ mcset $l "Persian" \
+ "Persian" ;# <-- NOT TRANSLATED YET
+ ##ID:004067##
+ mcset $l "Polish" \
+ "Polish" ;# <-- NOT TRANSLATED YET
+ ##ID:004068##
+ mcset $l "Portuguese" \
+ "Portuguese" ;# <-- NOT TRANSLATED YET
+ ##ID:004069##
+ mcset $l "Punjabi" \
+ "Punjabi" ;# <-- NOT TRANSLATED YET
+ ##ID:004070##
+ mcset $l "Pushto" \
+ "Pushto" ;# <-- NOT TRANSLATED YET
+ ##ID:004071##
+ mcset $l "Quechua" \
+ "Quechua" ;# <-- NOT TRANSLATED YET
+ ##ID:004072##
+ mcset $l "Romanian" \
+ "Romanian" ;# <-- NOT TRANSLATED YET
+ ##ID:004073##
+ mcset $l "Romansh" \
+ "Romansh" ;# <-- NOT TRANSLATED YET
+ ##ID:004074##
+ mcset $l "Rundi" \
+ "Rundi" ;# <-- NOT TRANSLATED YET
+ ##ID:004075##
+ mcset $l "Russian" \
+ "Russian" ;# <-- NOT TRANSLATED YET
+ ##ID:004076##
+ mcset $l "Samoan" \
+ "Samoan" ;# <-- NOT TRANSLATED YET
+ ##ID:004077##
+ mcset $l "Sango" \
+ "Sango" ;# <-- NOT TRANSLATED YET
+ ##ID:004078##
+ mcset $l "Sanskrit" \
+ "Sanskrit" ;# <-- NOT TRANSLATED YET
+ ##ID:004079##
+ mcset $l "Sardinian" \
+ "Sardinian" ;# <-- NOT TRANSLATED YET
+ ##ID:004080##
+ mcset $l "Scottish Gaelic" \
+ "Scottish Gaelic" ;# <-- NOT TRANSLATED YET
+ ##ID:004081##
+ mcset $l "Serbian" \
+ "Serbian" ;# <-- NOT TRANSLATED YET
+ ##ID:004082##
+ mcset $l "Shona" \
+ "Shona" ;# <-- NOT TRANSLATED YET
+ ##ID:004083##
+ mcset $l "Sichuan Yi" \
+ "Sichuan Yi" ;# <-- NOT TRANSLATED YET
+ ##ID:004084##
+ mcset $l "Sindhi" \
+ "Sindhi" ;# <-- NOT TRANSLATED YET
+ ##ID:004085##
+ mcset $l "Sinhala" \
+ "Sinhala" ;# <-- NOT TRANSLATED YET
+ ##ID:004086##
+ mcset $l "Sinhalese" \
+ "Sinhalese" ;# <-- NOT TRANSLATED YET
+ ##ID:004087##
+ mcset $l "Slovak" \
+ "Slovak" ;# <-- NOT TRANSLATED YET
+ ##ID:004088##
+ mcset $l "Slovenian" \
+ "Slovenian" ;# <-- NOT TRANSLATED YET
+ ##ID:004089##
+ mcset $l "Somali" \
+ "Somali" ;# <-- NOT TRANSLATED YET
+ ##ID:004090##
+ mcset $l "Sotho, Southern" \
+ "Sotho, Southern" ;# <-- NOT TRANSLATED YET
+ ##ID:004091##
+ mcset $l "South Ndebele" \
+ "South Ndebele" ;# <-- NOT TRANSLATED YET
+ ##ID:004092##
+ mcset $l "Spanish" \
+ "Spanish" ;# <-- NOT TRANSLATED YET
+ ##ID:004093##
+ mcset $l "Sundanese" \
+ "Sundanese" ;# <-- NOT TRANSLATED YET
+ ##ID:004094##
+ mcset $l "Swahili" \
+ "Swahili" ;# <-- NOT TRANSLATED YET
+ ##ID:004095##
+ mcset $l "Swati" \
+ "Swati" ;# <-- NOT TRANSLATED YET
+ ##ID:004096##
+ mcset $l "Swedish" \
+ "Swedish" ;# <-- NOT TRANSLATED YET
+ ##ID:004097##
+ mcset $l "Tagalog" \
+ "Tagalog" ;# <-- NOT TRANSLATED YET
+ ##ID:004098##
+ mcset $l "Tahitian" \
+ "Tahitian" ;# <-- NOT TRANSLATED YET
+ ##ID:004099##
+ mcset $l "Tajik" \
+ "Tajik" ;# <-- NOT TRANSLATED YET
+ ##ID:004100##
+ mcset $l "Tamil" \
+ "Tamil" ;# <-- NOT TRANSLATED YET
+ ##ID:004101##
+ mcset $l "Tatar" \
+ "Tatar" ;# <-- NOT TRANSLATED YET
+ ##ID:004102##
+ mcset $l "Telugu" \
+ "Telugu" ;# <-- NOT TRANSLATED YET
+ ##ID:004103##
+ mcset $l "Thai" \
+ "Thai" ;# <-- NOT TRANSLATED YET
+ ##ID:004104##
+ mcset $l "Tibetan" \
+ "Tibetan" ;# <-- NOT TRANSLATED YET
+ ##ID:004105##
+ mcset $l "Tigrinya" \
+ "Tigrinya" ;# <-- NOT TRANSLATED YET
+ ##ID:004106##
+ mcset $l "Tonga" \
+ "Tonga" ;# <-- NOT TRANSLATED YET
+ ##ID:004107##
+ mcset $l "Tsonga" \
+ "Tsonga" ;# <-- NOT TRANSLATED YET
+ ##ID:004108##
+ mcset $l "Tswana" \
+ "Tswana" ;# <-- NOT TRANSLATED YET
+ ##ID:004109##
+ mcset $l "Turkish" \
+ "Turkish" ;# <-- NOT TRANSLATED YET
+ ##ID:004110##
+ mcset $l "Turkmen" \
+ "Turkmen" ;# <-- NOT TRANSLATED YET
+ ##ID:004111##
+ mcset $l "Twi" \
+ "Twi" ;# <-- NOT TRANSLATED YET
+ ##ID:004112##
+ mcset $l "Uighur" \
+ "Uighur" ;# <-- NOT TRANSLATED YET
+ ##ID:004113##
+ mcset $l "Ukrainian" \
+ "Ukrainian" ;# <-- NOT TRANSLATED YET
+ ##ID:004114##
+ mcset $l "Urdu" \
+ "Urdu" ;# <-- NOT TRANSLATED YET
+ ##ID:004115##
+ mcset $l "Uyghur" \
+ "Uyghur" ;# <-- NOT TRANSLATED YET
+ ##ID:004116##
+ mcset $l "Uzbek" \
+ "Uzbek" ;# <-- NOT TRANSLATED YET
+ ##ID:004117##
+ mcset $l "Valencian" \
+ "Valencian" ;# <-- NOT TRANSLATED YET
+ ##ID:004118##
+ mcset $l "Venda" \
+ "Venda" ;# <-- NOT TRANSLATED YET
+ ##ID:004119##
+ mcset $l "Vietnamese" \
+ "Vietnamese" ;# <-- NOT TRANSLATED YET
+ ##ID:004120##
+ mcset $l "Volapük" \
+ "Volapük" ;# <-- NOT TRANSLATED YET
+ ##ID:004121##
+ mcset $l "Walloon" \
+ "Walloon" ;# <-- NOT TRANSLATED YET
+ ##ID:004122##
+ mcset $l "Welsh" \
+ "Welsh" ;# <-- NOT TRANSLATED YET
+ ##ID:004123##
+ mcset $l "Western Frisian" \
+ "Western Frisian" ;# <-- NOT TRANSLATED YET
+ ##ID:004124##
+ mcset $l "Wolof" \
+ "Wolof" ;# <-- NOT TRANSLATED YET
+ ##ID:004125##
+ mcset $l "Xhosa" \
+ "Xhosa" ;# <-- NOT TRANSLATED YET
+ ##ID:004126##
+ mcset $l "Yiddish" \
+ "Yiddish" ;# <-- NOT TRANSLATED YET
+ ##ID:004127##
+ mcset $l "Yoruba" \
+ "Yoruba" ;# <-- NOT TRANSLATED YET
+ ##ID:004128##
+ mcset $l "Zhuang" \
+ "Zhuang" ;# <-- NOT TRANSLATED YET
+ ##ID:004129##
+ mcset $l "Zulu" \
+ "Zulu" ;# <-- NOT TRANSLATED YET
+ # Names of countries
+ ##ID:004130##
+ mcset $l "Afghanistan" \
+ "Afghanistan" ;# <-- NOT TRANSLATED YET
+ ##ID:004131##
+ mcset $l "Åland Islands" \
+ "Åland Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004132##
+ mcset $l "Albania" \
+ "Albania" ;# <-- NOT TRANSLATED YET
+ ##ID:004133##
+ mcset $l "Algeria" \
+ "Algeria" ;# <-- NOT TRANSLATED YET
+ ##ID:004134##
+ mcset $l "American Samoa" \
+ "American Samoa" ;# <-- NOT TRANSLATED YET
+ ##ID:004135##
+ mcset $l "Andorra" \
+ "Andorra" ;# <-- NOT TRANSLATED YET
+ ##ID:004136##
+ mcset $l "Angola" \
+ "Angola" ;# <-- NOT TRANSLATED YET
+ ##ID:004137##
+ mcset $l "Anguilla" \
+ "Anguilla" ;# <-- NOT TRANSLATED YET
+ ##ID:004138##
+ mcset $l "Antarctica" \
+ "Antarctica" ;# <-- NOT TRANSLATED YET
+ ##ID:004139##
+ mcset $l "Antigua And Barbuda" \
+ "Antigua And Barbuda" ;# <-- NOT TRANSLATED YET
+ ##ID:004140##
+ mcset $l "Argentina" \
+ "Argentina" ;# <-- NOT TRANSLATED YET
+ ##ID:004141##
+ mcset $l "Armenia" \
+ "Armenia" ;# <-- NOT TRANSLATED YET
+ ##ID:004142##
+ mcset $l "Aruba" \
+ "Aruba" ;# <-- NOT TRANSLATED YET
+ ##ID:004143##
+ mcset $l "Australia" \
+ "Australia" ;# <-- NOT TRANSLATED YET
+ ##ID:004144##
+ mcset $l "Austria" \
+ "Austria" ;# <-- NOT TRANSLATED YET
+ ##ID:004145##
+ mcset $l "Azerbaijan" \
+ "Azerbaijan" ;# <-- NOT TRANSLATED YET
+ ##ID:004146##
+ mcset $l "Bahamas" \
+ "Bahamas" ;# <-- NOT TRANSLATED YET
+ ##ID:004147##
+ mcset $l "Bahrain" \
+ "Bahrain" ;# <-- NOT TRANSLATED YET
+ ##ID:004148##
+ mcset $l "Bangladesh" \
+ "Bangladesh" ;# <-- NOT TRANSLATED YET
+ ##ID:004149##
+ mcset $l "Barbados" \
+ "Barbados" ;# <-- NOT TRANSLATED YET
+ ##ID:004150##
+ mcset $l "Belarus" \
+ "Belarus" ;# <-- NOT TRANSLATED YET
+ ##ID:004151##
+ mcset $l "Belgium" \
+ "Belgium" ;# <-- NOT TRANSLATED YET
+ ##ID:004152##
+ mcset $l "Belize" \
+ "Belize" ;# <-- NOT TRANSLATED YET
+ ##ID:004153##
+ mcset $l "Benin" \
+ "Benin" ;# <-- NOT TRANSLATED YET
+ ##ID:004154##
+ mcset $l "Bermuda" \
+ "Bermuda" ;# <-- NOT TRANSLATED YET
+ ##ID:004155##
+ mcset $l "Bhutan" \
+ "Bhutan" ;# <-- NOT TRANSLATED YET
+ ##ID:004156##
+ mcset $l "Bolivia, Plurinational State Of" \
+ "Bolivia, Plurinational State Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004157##
+ mcset $l "Bosnia And Herzegovina" \
+ "Bosnia And Herzegovina" ;# <-- NOT TRANSLATED YET
+ ##ID:004158##
+ mcset $l "Botswana" \
+ "Botswana" ;# <-- NOT TRANSLATED YET
+ ##ID:004159##
+ mcset $l "Bouvet Island" \
+ "Bouvet Island" ;# <-- NOT TRANSLATED YET
+ ##ID:004160##
+ mcset $l "Brazil" \
+ "Brazil" ;# <-- NOT TRANSLATED YET
+ ##ID:004161##
+ mcset $l "British Indian Ocean Territory" \
+ "British Indian Ocean Territory" ;# <-- NOT TRANSLATED YET
+ ##ID:004162##
+ mcset $l "Brunei Darussalam" \
+ "Brunei Darussalam" ;# <-- NOT TRANSLATED YET
+ ##ID:004163##
+ mcset $l "Bulgaria" \
+ "Bulgaria" ;# <-- NOT TRANSLATED YET
+ ##ID:004164##
+ mcset $l "Burkina Faso" \
+ "Burkina Faso" ;# <-- NOT TRANSLATED YET
+ ##ID:004165##
+ mcset $l "Burundi" \
+ "Burundi" ;# <-- NOT TRANSLATED YET
+ ##ID:004166##
+ mcset $l "Cambodia" \
+ "Cambodia" ;# <-- NOT TRANSLATED YET
+ ##ID:004167##
+ mcset $l "Cameroon" \
+ "Cameroon" ;# <-- NOT TRANSLATED YET
+ ##ID:004168##
+ mcset $l "Canada" \
+ "Canada" ;# <-- NOT TRANSLATED YET
+ ##ID:004169##
+ mcset $l "Cape Verde" \
+ "Cape Verde" ;# <-- NOT TRANSLATED YET
+ ##ID:004170##
+ mcset $l "Cayman Islands" \
+ "Cayman Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004171##
+ mcset $l "Central African Republic" \
+ "Central African Republic" ;# <-- NOT TRANSLATED YET
+ ##ID:004172##
+ mcset $l "Chad" \
+ "Chad" ;# <-- NOT TRANSLATED YET
+ ##ID:004173##
+ mcset $l "Chile" \
+ "Chile" ;# <-- NOT TRANSLATED YET
+ ##ID:004174##
+ mcset $l "China" \
+ "China" ;# <-- NOT TRANSLATED YET
+ ##ID:004175##
+ mcset $l "Christmas Island" \
+ "Christmas Island" ;# <-- NOT TRANSLATED YET
+ ##ID:004176##
+ mcset $l "Cocos (Keeling) Islands" \
+ "Cocos (Keeling) Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004177##
+ mcset $l "Colombia" \
+ "Colombia" ;# <-- NOT TRANSLATED YET
+ ##ID:004178##
+ mcset $l "Comoros" \
+ "Comoros" ;# <-- NOT TRANSLATED YET
+ ##ID:004179##
+ mcset $l "Congo" \
+ "Congo" ;# <-- NOT TRANSLATED YET
+ ##ID:004180##
+ mcset $l "Congo, The Democratic Republic Of The" \
+ "Congo, The Democratic Republic Of The" ;# <-- NOT TRANSLATED YET
+ ##ID:004181##
+ mcset $l "Cook Islands" \
+ "Cook Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004182##
+ mcset $l "Costa Rica" \
+ "Costa Rica" ;# <-- NOT TRANSLATED YET
+ ##ID:004183##
+ mcset $l "Côte D'Ivoire" \
+ "Côte D'Ivoire" ;# <-- NOT TRANSLATED YET
+ ##ID:004184##
+ mcset $l "Croatia" \
+ "Croatia" ;# <-- NOT TRANSLATED YET
+ ##ID:004185##
+ mcset $l "Cuba" \
+ "Cuba" ;# <-- NOT TRANSLATED YET
+ ##ID:004186##
+ mcset $l "Cyprus" \
+ "Cyprus" ;# <-- NOT TRANSLATED YET
+ ##ID:004187##
+ mcset $l "Czech Republic" \
+ "Czech Republic" ;# <-- NOT TRANSLATED YET
+ ##ID:004188##
+ mcset $l "Denmark" \
+ "Denmark" ;# <-- NOT TRANSLATED YET
+ ##ID:004189##
+ mcset $l "Djibouti" \
+ "Djibouti" ;# <-- NOT TRANSLATED YET
+ ##ID:004190##
+ mcset $l "Dominica" \
+ "Dominica" ;# <-- NOT TRANSLATED YET
+ ##ID:004191##
+ mcset $l "Dominican Republic" \
+ "Dominican Republic" ;# <-- NOT TRANSLATED YET
+ ##ID:004192##
+ mcset $l "Ecuador" \
+ "Ecuador" ;# <-- NOT TRANSLATED YET
+ ##ID:004193##
+ mcset $l "Egypt" \
+ "Egypt" ;# <-- NOT TRANSLATED YET
+ ##ID:004194##
+ mcset $l "El Salvador" \
+ "El Salvador" ;# <-- NOT TRANSLATED YET
+ ##ID:004195##
+ mcset $l "Equatorial Guinea" \
+ "Equatorial Guinea" ;# <-- NOT TRANSLATED YET
+ ##ID:004196##
+ mcset $l "Eritrea" \
+ "Eritrea" ;# <-- NOT TRANSLATED YET
+ ##ID:004197##
+ mcset $l "Estonia" \
+ "Estonia" ;# <-- NOT TRANSLATED YET
+ ##ID:004198##
+ mcset $l "Ethiopia" \
+ "Ethiopia" ;# <-- NOT TRANSLATED YET
+ ##ID:004199##
+ mcset $l "Falkland Islands (Malvinas)" \
+ "Falkland Islands (Malvinas)" ;# <-- NOT TRANSLATED YET
+ ##ID:004200##
+ mcset $l "Faroe Islands" \
+ "Faroe Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004201##
+ mcset $l "Fiji" \
+ "Fiji" ;# <-- NOT TRANSLATED YET
+ ##ID:004202##
+ mcset $l "Finland" \
+ "Finland" ;# <-- NOT TRANSLATED YET
+ ##ID:004203##
+ mcset $l "France" \
+ "France" ;# <-- NOT TRANSLATED YET
+ ##ID:004204##
+ mcset $l "French Guiana" \
+ "French Guiana" ;# <-- NOT TRANSLATED YET
+ ##ID:004205##
+ mcset $l "French Polynesia" \
+ "French Polynesia" ;# <-- NOT TRANSLATED YET
+ ##ID:004206##
+ mcset $l "French Southern Territories" \
+ "French Southern Territories" ;# <-- NOT TRANSLATED YET
+ ##ID:004207##
+ mcset $l "Gabon" \
+ "Gabon" ;# <-- NOT TRANSLATED YET
+ ##ID:004208##
+ mcset $l "Gambia" \
+ "Gambia" ;# <-- NOT TRANSLATED YET
+ ##ID:004209##
+ mcset $l "Georgia" \
+ "Georgia" ;# <-- NOT TRANSLATED YET
+ ##ID:004210##
+ mcset $l "Germany" \
+ "Germany" ;# <-- NOT TRANSLATED YET
+ ##ID:004211##
+ mcset $l "Ghana" \
+ "Ghana" ;# <-- NOT TRANSLATED YET
+ ##ID:004212##
+ mcset $l "Gibraltar" \
+ "Gibraltar" ;# <-- NOT TRANSLATED YET
+ ##ID:004213##
+ mcset $l "Greece" \
+ "Greece" ;# <-- NOT TRANSLATED YET
+ ##ID:004214##
+ mcset $l "Greenland" \
+ "Greenland" ;# <-- NOT TRANSLATED YET
+ ##ID:004215##
+ mcset $l "Grenada" \
+ "Grenada" ;# <-- NOT TRANSLATED YET
+ ##ID:004216##
+ mcset $l "Guadeloupe" \
+ "Guadeloupe" ;# <-- NOT TRANSLATED YET
+ ##ID:004217##
+ mcset $l "Guam" \
+ "Guam" ;# <-- NOT TRANSLATED YET
+ ##ID:004218##
+ mcset $l "Guatemala" \
+ "Guatemala" ;# <-- NOT TRANSLATED YET
+ ##ID:004219##
+ mcset $l "Guernsey" \
+ "Guernsey" ;# <-- NOT TRANSLATED YET
+ ##ID:004220##
+ mcset $l "Guinea" \
+ "Guinea" ;# <-- NOT TRANSLATED YET
+ ##ID:004221##
+ mcset $l "Guinea-Bissau" \
+ "Guinea-Bissau" ;# <-- NOT TRANSLATED YET
+ ##ID:004222##
+ mcset $l "Guyana" \
+ "Guyana" ;# <-- NOT TRANSLATED YET
+ ##ID:004223##
+ mcset $l "Haiti" \
+ "Haiti" ;# <-- NOT TRANSLATED YET
+ ##ID:004224##
+ mcset $l "Heard Island And Mcdonald Islands" \
+ "Heard Island And Mcdonald Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004225##
+ mcset $l "Holy See (Vatican City State)" \
+ "Holy See (Vatican City State)" ;# <-- NOT TRANSLATED YET
+ ##ID:004226##
+ mcset $l "Honduras" \
+ "Honduras" ;# <-- NOT TRANSLATED YET
+ ##ID:004227##
+ mcset $l "Hong Kong" \
+ "Hong Kong" ;# <-- NOT TRANSLATED YET
+ ##ID:004228##
+ mcset $l "Hungary" \
+ "Hungary" ;# <-- NOT TRANSLATED YET
+ ##ID:004229##
+ mcset $l "Iceland" \
+ "Iceland" ;# <-- NOT TRANSLATED YET
+ ##ID:004230##
+ mcset $l "India" \
+ "India" ;# <-- NOT TRANSLATED YET
+ ##ID:004231##
+ mcset $l "Indonesia" \
+ "Indonesia" ;# <-- NOT TRANSLATED YET
+ ##ID:004232##
+ mcset $l "Iran, Islamic Republic Of" \
+ "Iran, Islamic Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004233##
+ mcset $l "Iraq" \
+ "Iraq" ;# <-- NOT TRANSLATED YET
+ ##ID:004234##
+ mcset $l "Ireland" \
+ "Ireland" ;# <-- NOT TRANSLATED YET
+ ##ID:004235##
+ mcset $l "Isle Of Man" \
+ "Isle Of Man" ;# <-- NOT TRANSLATED YET
+ ##ID:004236##
+ mcset $l "Israel" \
+ "Israel" ;# <-- NOT TRANSLATED YET
+ ##ID:004237##
+ mcset $l "Italy" \
+ "Italy" ;# <-- NOT TRANSLATED YET
+ ##ID:004238##
+ mcset $l "Jamaica" \
+ "Jamaica" ;# <-- NOT TRANSLATED YET
+ ##ID:004239##
+ mcset $l "Japan" \
+ "Japan" ;# <-- NOT TRANSLATED YET
+ ##ID:004240##
+ mcset $l "Jersey" \
+ "Jersey" ;# <-- NOT TRANSLATED YET
+ ##ID:004241##
+ mcset $l "Jordan" \
+ "Jordan" ;# <-- NOT TRANSLATED YET
+ ##ID:004242##
+ mcset $l "Kazakhstan" \
+ "Kazakhstan" ;# <-- NOT TRANSLATED YET
+ ##ID:004243##
+ mcset $l "Kenya" \
+ "Kenya" ;# <-- NOT TRANSLATED YET
+ ##ID:004244##
+ mcset $l "Kiribati" \
+ "Kiribati" ;# <-- NOT TRANSLATED YET
+ ##ID:004245##
+ mcset $l "Korea, Democratic People'S Republic Of" \
+ "Korea, Democratic People'S Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004246##
+ mcset $l "Korea, Republic Of" \
+ "Korea, Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004247##
+ mcset $l "Kuwait" \
+ "Kuwait" ;# <-- NOT TRANSLATED YET
+ ##ID:004248##
+ mcset $l "Kyrgyzstan" \
+ "Kyrgyzstan" ;# <-- NOT TRANSLATED YET
+ ##ID:004249##
+ mcset $l "Lao People'S Democratic Republic" \
+ "Lao People'S Democratic Republic" ;# <-- NOT TRANSLATED YET
+ ##ID:004250##
+ mcset $l "Latvia" \
+ "Latvia" ;# <-- NOT TRANSLATED YET
+ ##ID:004251##
+ mcset $l "Lebanon" \
+ "Lebanon" ;# <-- NOT TRANSLATED YET
+ ##ID:004252##
+ mcset $l "Lesotho" \
+ "Lesotho" ;# <-- NOT TRANSLATED YET
+ ##ID:004253##
+ mcset $l "Liberia" \
+ "Liberia" ;# <-- NOT TRANSLATED YET
+ ##ID:004254##
+ mcset $l "Libyan Arab Jamahiriya" \
+ "Libyan Arab Jamahiriya" ;# <-- NOT TRANSLATED YET
+ ##ID:004255##
+ mcset $l "Liechtenstein" \
+ "Liechtenstein" ;# <-- NOT TRANSLATED YET
+ ##ID:004256##
+ mcset $l "Lithuania" \
+ "Lithuania" ;# <-- NOT TRANSLATED YET
+ ##ID:004257##
+ mcset $l "Luxembourg" \
+ "Luxembourg" ;# <-- NOT TRANSLATED YET
+ ##ID:004258##
+ mcset $l "Macao" \
+ "Macao" ;# <-- NOT TRANSLATED YET
+ ##ID:004259##
+ mcset $l "Macedonia, The Former Yugoslav Republic Of" \
+ "Macedonia, The Former Yugoslav Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004260##
+ mcset $l "Madagascar" \
+ "Madagascar" ;# <-- NOT TRANSLATED YET
+ ##ID:004261##
+ mcset $l "Malawi" \
+ "Malawi" ;# <-- NOT TRANSLATED YET
+ ##ID:004262##
+ mcset $l "Malaysia" \
+ "Malaysia" ;# <-- NOT TRANSLATED YET
+ ##ID:004263##
+ mcset $l "Maldives" \
+ "Maldives" ;# <-- NOT TRANSLATED YET
+ ##ID:004264##
+ mcset $l "Mali" \
+ "Mali" ;# <-- NOT TRANSLATED YET
+ ##ID:004265##
+ mcset $l "Malta" \
+ "Malta" ;# <-- NOT TRANSLATED YET
+ ##ID:004266##
+ mcset $l "Marshall Islands" \
+ "Marshall Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004267##
+ mcset $l "Martinique" \
+ "Martinique" ;# <-- NOT TRANSLATED YET
+ ##ID:004268##
+ mcset $l "Mauritania" \
+ "Mauritania" ;# <-- NOT TRANSLATED YET
+ ##ID:004269##
+ mcset $l "Mauritius" \
+ "Mauritius" ;# <-- NOT TRANSLATED YET
+ ##ID:004270##
+ mcset $l "Mayotte" \
+ "Mayotte" ;# <-- NOT TRANSLATED YET
+ ##ID:004271##
+ mcset $l "Mexico" \
+ "Mexico" ;# <-- NOT TRANSLATED YET
+ ##ID:004272##
+ mcset $l "Micronesia, Federated States Of" \
+ "Micronesia, Federated States Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004273##
+ mcset $l "Moldova, Republic Of" \
+ "Moldova, Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004274##
+ mcset $l "Monaco" \
+ "Monaco" ;# <-- NOT TRANSLATED YET
+ ##ID:004275##
+ mcset $l "Mongolia" \
+ "Mongolia" ;# <-- NOT TRANSLATED YET
+ ##ID:004276##
+ mcset $l "Montenegro" \
+ "Montenegro" ;# <-- NOT TRANSLATED YET
+ ##ID:004277##
+ mcset $l "Montserrat" \
+ "Montserrat" ;# <-- NOT TRANSLATED YET
+ ##ID:004278##
+ mcset $l "Morocco" \
+ "Morocco" ;# <-- NOT TRANSLATED YET
+ ##ID:004279##
+ mcset $l "Mozambique" \
+ "Mozambique" ;# <-- NOT TRANSLATED YET
+ ##ID:004280##
+ mcset $l "Myanmar" \
+ "Myanmar" ;# <-- NOT TRANSLATED YET
+ ##ID:004281##
+ mcset $l "Namibia" \
+ "Namibia" ;# <-- NOT TRANSLATED YET
+ ##ID:004282##
+ mcset $l "Nepal" \
+ "Nepal" ;# <-- NOT TRANSLATED YET
+ ##ID:004283##
+ mcset $l "Netherlands" \
+ "Netherlands" ;# <-- NOT TRANSLATED YET
+ ##ID:004284##
+ mcset $l "Netherlands Antilles" \
+ "Netherlands Antilles" ;# <-- NOT TRANSLATED YET
+ ##ID:004285##
+ mcset $l "New Caledonia" \
+ "New Caledonia" ;# <-- NOT TRANSLATED YET
+ ##ID:004286##
+ mcset $l "New Zealand" \
+ "New Zealand" ;# <-- NOT TRANSLATED YET
+ ##ID:004287##
+ mcset $l "Nicaragua" \
+ "Nicaragua" ;# <-- NOT TRANSLATED YET
+ ##ID:004288##
+ mcset $l "Niger" \
+ "Niger" ;# <-- NOT TRANSLATED YET
+ ##ID:004289##
+ mcset $l "Nigeria" \
+ "Nigeria" ;# <-- NOT TRANSLATED YET
+ ##ID:004290##
+ mcset $l "Niue" \
+ "Niue" ;# <-- NOT TRANSLATED YET
+ ##ID:004291##
+ mcset $l "Norfolk Island" \
+ "Norfolk Island" ;# <-- NOT TRANSLATED YET
+ ##ID:004292##
+ mcset $l "Northern Mariana Islands" \
+ "Northern Mariana Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004293##
+ mcset $l "Norway" \
+ "Norway" ;# <-- NOT TRANSLATED YET
+ ##ID:004294##
+ mcset $l "Oman" \
+ "Oman" ;# <-- NOT TRANSLATED YET
+ ##ID:004295##
+ mcset $l "Pakistan" \
+ "Pakistan" ;# <-- NOT TRANSLATED YET
+ ##ID:004296##
+ mcset $l "Palau" \
+ "Palau" ;# <-- NOT TRANSLATED YET
+ ##ID:004297##
+ mcset $l "Palestinian Territory, Occupied" \
+ "Palestinian Territory, Occupied" ;# <-- NOT TRANSLATED YET
+ ##ID:004298##
+ mcset $l "Panama" \
+ "Panama" ;# <-- NOT TRANSLATED YET
+ ##ID:004299##
+ mcset $l "Papua New Guinea" \
+ "Papua New Guinea" ;# <-- NOT TRANSLATED YET
+ ##ID:004300##
+ mcset $l "Paraguay" \
+ "Paraguay" ;# <-- NOT TRANSLATED YET
+ ##ID:004301##
+ mcset $l "Peru" \
+ "Peru" ;# <-- NOT TRANSLATED YET
+ ##ID:004302##
+ mcset $l "Philippines" \
+ "Philippines" ;# <-- NOT TRANSLATED YET
+ ##ID:004303##
+ mcset $l "Pitcairn" \
+ "Pitcairn" ;# <-- NOT TRANSLATED YET
+ ##ID:004304##
+ mcset $l "Poland" \
+ "Poland" ;# <-- NOT TRANSLATED YET
+ ##ID:004305##
+ mcset $l "Portugal" \
+ "Portugal" ;# <-- NOT TRANSLATED YET
+ ##ID:004306##
+ mcset $l "Puerto Rico" \
+ "Puerto Rico" ;# <-- NOT TRANSLATED YET
+ ##ID:004307##
+ mcset $l "Qatar" \
+ "Qatar" ;# <-- NOT TRANSLATED YET
+ ##ID:004308##
+ mcset $l "Réunion" \
+ "Réunion" ;# <-- NOT TRANSLATED YET
+ ##ID:004309##
+ mcset $l "Romania" \
+ "Romania" ;# <-- NOT TRANSLATED YET
+ ##ID:004310##
+ mcset $l "Russian Federation" \
+ "Russian Federation" ;# <-- NOT TRANSLATED YET
+ ##ID:004311##
+ mcset $l "Rwanda" \
+ "Rwanda" ;# <-- NOT TRANSLATED YET
+ ##ID:004312##
+ mcset $l "Saint Barthélemy" \
+ "Saint Barthélemy" ;# <-- NOT TRANSLATED YET
+ ##ID:004313##
+ mcset $l "Saint Helena, Ascension And Tristan Da Cunha" \
+ "Saint Helena, Ascension And Tristan Da Cunha" ;# <-- NOT TRANSLATED YET
+ ##ID:004314##
+ mcset $l "Saint Kitts And Nevis" \
+ "Saint Kitts And Nevis" ;# <-- NOT TRANSLATED YET
+ ##ID:004315##
+ mcset $l "Saint Lucia" \
+ "Saint Lucia" ;# <-- NOT TRANSLATED YET
+ ##ID:004316##
+ mcset $l "Saint Martin" \
+ "Saint Martin" ;# <-- NOT TRANSLATED YET
+ ##ID:004317##
+ mcset $l "Saint Pierre And Miquelon" \
+ "Saint Pierre And Miquelon" ;# <-- NOT TRANSLATED YET
+ ##ID:004318##
+ mcset $l "Saint Vincent And The Grenadines" \
+ "Saint Vincent And The Grenadines" ;# <-- NOT TRANSLATED YET
+ ##ID:004319##
+ mcset $l "Samoa" \
+ "Samoa" ;# <-- NOT TRANSLATED YET
+ ##ID:004320##
+ mcset $l "San Marino" \
+ "San Marino" ;# <-- NOT TRANSLATED YET
+ ##ID:004321##
+ mcset $l "Sao Tome And Principe" \
+ "Sao Tome And Principe" ;# <-- NOT TRANSLATED YET
+ ##ID:004322##
+ mcset $l "Saudi Arabia" \
+ "Saudi Arabia" ;# <-- NOT TRANSLATED YET
+ ##ID:004323##
+ mcset $l "Senegal" \
+ "Senegal" ;# <-- NOT TRANSLATED YET
+ ##ID:004324##
+ mcset $l "Serbia" \
+ "Serbia" ;# <-- NOT TRANSLATED YET
+ ##ID:004325##
+ mcset $l "Seychelles" \
+ "Seychelles" ;# <-- NOT TRANSLATED YET
+ ##ID:004326##
+ mcset $l "Sierra Leone" \
+ "Sierra Leone" ;# <-- NOT TRANSLATED YET
+ ##ID:004327##
+ mcset $l "Singapore" \
+ "Singapore" ;# <-- NOT TRANSLATED YET
+ ##ID:004328##
+ mcset $l "Slovakia" \
+ "Slovakia" ;# <-- NOT TRANSLATED YET
+ ##ID:004329##
+ mcset $l "Slovenia" \
+ "Slovenia" ;# <-- NOT TRANSLATED YET
+ ##ID:004330##
+ mcset $l "Solomon Islands" \
+ "Solomon Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004331##
+ mcset $l "Somalia" \
+ "Somalia" ;# <-- NOT TRANSLATED YET
+ ##ID:004332##
+ mcset $l "South Africa" \
+ "South Africa" ;# <-- NOT TRANSLATED YET
+ ##ID:004333##
+ mcset $l "South Georgia And The South Sandwich Islands" \
+ "South Georgia And The South Sandwich Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004334##
+ mcset $l "Spain" \
+ "Spain" ;# <-- NOT TRANSLATED YET
+ ##ID:004335##
+ mcset $l "Sri Lanka" \
+ "Sri Lanka" ;# <-- NOT TRANSLATED YET
+ ##ID:004336##
+ mcset $l "Sudan" \
+ "Sudan" ;# <-- NOT TRANSLATED YET
+ ##ID:004337##
+ mcset $l "Suriname" \
+ "Suriname" ;# <-- NOT TRANSLATED YET
+ ##ID:004338##
+ mcset $l "Svalbard And Jan Mayen" \
+ "Svalbard And Jan Mayen" ;# <-- NOT TRANSLATED YET
+ ##ID:004339##
+ mcset $l "Swaziland" \
+ "Swaziland" ;# <-- NOT TRANSLATED YET
+ ##ID:004340##
+ mcset $l "Sweden" \
+ "Sweden" ;# <-- NOT TRANSLATED YET
+ ##ID:004341##
+ mcset $l "Switzerland" \
+ "Switzerland" ;# <-- NOT TRANSLATED YET
+ ##ID:004342##
+ mcset $l "Syrian Arab Republic" \
+ "Syrian Arab Republic" ;# <-- NOT TRANSLATED YET
+ ##ID:004343##
+ mcset $l "Taiwan, Province Of China" \
+ "Taiwan, Province Of China" ;# <-- NOT TRANSLATED YET
+ ##ID:004344##
+ mcset $l "Tajikistan" \
+ "Tajikistan" ;# <-- NOT TRANSLATED YET
+ ##ID:004345##
+ mcset $l "Tanzania, United Republic Of" \
+ "Tanzania, United Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004346##
+ mcset $l "Thailand" \
+ "Thailand" ;# <-- NOT TRANSLATED YET
+ ##ID:004347##
+ mcset $l "Timor-Leste" \
+ "Timor-Leste" ;# <-- NOT TRANSLATED YET
+ ##ID:004348##
+ mcset $l "Togo" \
+ "Togo" ;# <-- NOT TRANSLATED YET
+ ##ID:004349##
+ mcset $l "Tokelau" \
+ "Tokelau" ;# <-- NOT TRANSLATED YET
+ ##ID:004350##
+ mcset $l "Trinidad And Tobago" \
+ "Trinidad And Tobago" ;# <-- NOT TRANSLATED YET
+ ##ID:004351##
+ mcset $l "Tunisia" \
+ "Tunisia" ;# <-- NOT TRANSLATED YET
+ ##ID:004352##
+ mcset $l "Turkey" \
+ "Turkey" ;# <-- NOT TRANSLATED YET
+ ##ID:004353##
+ mcset $l "Turkmenistan" \
+ "Turkmenistan" ;# <-- NOT TRANSLATED YET
+ ##ID:004354##
+ mcset $l "Turks And Caicos Islands" \
+ "Turks And Caicos Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004355##
+ mcset $l "Tuvalu" \
+ "Tuvalu" ;# <-- NOT TRANSLATED YET
+ ##ID:004356##
+ mcset $l "Uganda" \
+ "Uganda" ;# <-- NOT TRANSLATED YET
+ ##ID:004357##
+ mcset $l "Ukraine" \
+ "Ukraine" ;# <-- NOT TRANSLATED YET
+ ##ID:004358##
+ mcset $l "United Arab Emirates" \
+ "United Arab Emirates" ;# <-- NOT TRANSLATED YET
+ ##ID:004359##
+ mcset $l "United Kingdom" \
+ "United Kingdom" ;# <-- NOT TRANSLATED YET
+ ##ID:004360##
+ mcset $l "United States" \
+ "United States" ;# <-- NOT TRANSLATED YET
+ ##ID:004361##
+ mcset $l "United States Minor Outlying Islands" \
+ "United States Minor Outlying Islands" ;# <-- NOT TRANSLATED YET
+ ##ID:004362##
+ mcset $l "Uruguay" \
+ "Uruguay" ;# <-- NOT TRANSLATED YET
+ ##ID:004363##
+ mcset $l "Uzbekistan" \
+ "Uzbekistan" ;# <-- NOT TRANSLATED YET
+ ##ID:004364##
+ mcset $l "Vanuatu" \
+ "Vanuatu" ;# <-- NOT TRANSLATED YET
+ ##ID:004365##
+ mcset $l "Vatican City State" \
+ "Vatican City State" ;# <-- NOT TRANSLATED YET
+ ##ID:004366##
+ mcset $l "Venezuela, Bolivarian Republic Of" \
+ "Venezuela, Bolivarian Republic Of" ;# <-- NOT TRANSLATED YET
+ ##ID:004367##
+ mcset $l "Viet Nam" \
+ "Viet Nam" ;# <-- NOT TRANSLATED YET
+ ##ID:004368##
+ mcset $l "Virgin Islands, British" \
+ "Virgin Islands, British" ;# <-- NOT TRANSLATED YET
+ ##ID:004369##
+ mcset $l "Virgin Islands, U.S." \
+ "Virgin Islands, U.S." ;# <-- NOT TRANSLATED YET
+ ##ID:004370##
+ mcset $l "Wallis And Futuna" \
+ "Wallis And Futuna" ;# <-- NOT TRANSLATED YET
+ ##ID:004371##
+ mcset $l "Western Sahara" \
+ "Western Sahara" ;# <-- NOT TRANSLATED YET
+ ##ID:004372##
+ mcset $l "Yemen" \
+ "Yemen" ;# <-- NOT TRANSLATED YET
+ ##ID:004373##
+ mcset $l "Zambia" \
+ "Zambia" ;# <-- NOT TRANSLATED YET
+ ##ID:004374##
+ mcset $l "Zimbabwe" \
+ "Zimbabwe" ;# <-- NOT TRANSLATED YET
+}
+# lcd_hd44780.tcl
+# ==============================================================================
+namespace eval LcdHD44780 {
+ ##ID:004375##
+ mcset $l "LCD display" \
+ "LCD 显示屏" ;
+ ##ID:004376##
+ mcset $l "NOTE" \
+ "NOTE" ;# <-- NOT TRANSLATED YET
+ ##ID:004377##
+ mcset $l "BIT" \
+ "BIT" ;# <-- NOT TRANSLATED YET
+ ##ID:004378##
+ mcset $l "PORT" \
+ "PORT" ;# <-- NOT TRANSLATED YET
+ ##ID:004379##
+ mcset $l "Set font" \
+ "设置字体"
+ ##ID:004380##
+ mcset $l "ROM code A00" \
+ "ROM code A00" ;# <-- NOT TRANSLATED YET
+ ##ID:004381##
+ mcset $l "ROM code A02" \
+ "ROM code A02" ;# <-- NOT TRANSLATED YET
+ ##ID:004382##
+ mcset $l "Set character size" \
+ "设置字符大小"
+ ##ID:004383##
+ mcset $l "hd44780" \
+ "hd44780" ;# <-- NOT TRANSLATED YET
+ ##ID:004384##
+ mcset $l "Disable delays" \
+ "禁止延迟"
+ ##ID:004385##
+ mcset $l "Ignore errors" \
+ "忽略错误"
+ ##ID:004386##
+ mcset $l "Show HD44780 log" \
+ "显示 HD44780 日志"
+ ##ID:004387##
+ mcset $l "Display the log of events which are currently happening in the simulated HD44780 chip" \
+ "Display the log of events which are currently happening in the simulated HD44780 chip" ;# <-- NOT TRANSLATED YET
+ ##ID:004388##
+ mcset $l "Show CGROM" \
+ "Show CGROM" ;# <-- NOT TRANSLATED YET
+ ##ID:004389##
+ mcset $l "Display content of HD44780 Character Generator ROM" \
+ "Display content of HD44780 Character Generator ROM" ;# <-- NOT TRANSLATED YET
+ ##ID:004390##
+ mcset $l "Show CGRAM" \
+ "Show CGRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004391##
+ mcset $l "Display content of HD44780 Character Generator RAM" \
+ "Display content of HD44780 Character Generator RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004392##
+ mcset $l "Show DDRAM" \
+ "Show DDRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004393##
+ mcset $l "Display content of HD44780 Display data RAM" \
+ "Display content of HD44780 Display data RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004394##
+ mcset $l "Reset HD44780" \
+ "复位 HD44780"
+ ##ID:004395##
+ mcset $l "Reinitialize the simulated HD44780, but do not affect DDRAM and CGRAM" \
+ "Reinitialize the simulated HD44780, but do not affect DDRAM and CGRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004396##
+ mcset $l "Clear DDRAM & CGRAM" \
+ "Clear DDRAM & CGRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004397##
+ mcset $l "Clear the entire Display Data RAM and Character Generator RAM" \
+ "Clear the entire Display Data RAM and Character Generator RAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004398##
+ mcset $l "Show help" \
+ "显示帮助"
+ ##ID:004399##
+ mcset $l "Show brief help" \
+ "Show brief help" ;# <-- NOT TRANSLATED YET
+ ##ID:004400##
+ mcset $l "Save configuration" \
+ "保存设置"
+ ##ID:004401##
+ mcset $l "Save configuration into a file" \
+ "保存设置至文件"
+ ##ID:004402##
+ mcset $l "Load configuration" \
+ "加载配置"
+ ##ID:004403##
+ mcset $l "Load configuration from a file" \
+ "从文件加载配置" ;
+ ##ID:004404##
+ mcset $l "Cursor blinking" \
+ "光标闪烁"
+ ##ID:004405##
+ mcset $l "Accompanies display shift" \
+ "Accompanies display shift" ;# <-- NOT TRANSLATED YET
+ ##ID:004406##
+ mcset $l "Display ON/OFF" \
+ "显示 开/关"
+ ##ID:004407##
+ mcset $l "Cursor ON/OFF" \
+ "光标 开/关"
+ ##ID:004408##
+ mcset $l "2 lines display / 1 line display" \
+ "2 lines display / 1 line display" ;# <-- NOT TRANSLATED YET
+ ##ID:004409##
+ mcset $l "5 × 10 dots / 5 × 8 dots" \
+ "5 × 10 dots / 5 × 8 dots" ;# <-- NOT TRANSLATED YET
+ ##ID:004410##
+ mcset $l "Increment AC / Decrement AC" \
+ "Increment AC / Decrement AC" ;# <-- NOT TRANSLATED YET
+ ##ID:004411##
+ mcset $l "8-bit data transfer / 4-bit data transfer" \
+ "8-bit data transfer / 4-bit data transfer" ;# <-- NOT TRANSLATED YET
+ ##ID:004412##
+ mcset $l "One More Nibble to transfer / data transfer complete" \
+ "One More Nibble to transfer / data transfer complete" ;# <-- NOT TRANSLATED YET
+ ##ID:004413##
+ mcset $l "Internally operating / Instructions acceptable" \
+ "Internally operating / Instructions acceptable" ;# <-- NOT TRANSLATED YET
+ ##ID:004414##
+ mcset $l "Show or hide the bottom part" \
+ "Show or hide the bottom part" ;# <-- NOT TRANSLATED YET
+ ##ID:004415##
+ mcset $l "Show or hide the right part" \
+ "Show or hide the right part" ;# <-- NOT TRANSLATED YET
+ ##ID:004416##
+ mcset $l "Turn HW simulation on/off" \
+ "Turn HW simulation on/off" ;# <-- NOT TRANSLATED YET
+ ##ID:004417##
+ mcset $l "Configure" \
+ "配置"
+ ##ID:004418##
+ mcset $l "Shift:" \
+ "Shift:" ;# <-- NOT TRANSLATED YET
+ ##ID:004419##
+ mcset $l "Close" \
+ "关闭"
+ ##ID:004420##
+ mcset $l "Cursor: " \
+ "光标: "
+ ##ID:004421##
+ mcset $l "HD44780 Character Generator ROM (ROM Code: A0%d) - MCU 8051 IDE" \
+ "HD44780 Character Generator ROM (ROM Code: A0%d) - MCU 8051 IDE" ;# <-- NOT TRANSLATED YET
+ ##ID:004422##
+ mcset $l "Clear log" \
+ "清除日志"
+ ##ID:004423##
+ mcset $l "HD44780 log - MCU 8051 IDE" \
+ "HD44780 日志 - MCU 8051 IDE"
+ ##ID:004424##
+ mcset $l "\[INFO\] " \
+ "\[信息\] "
+ ##ID:004425##
+ mcset $l "\[WARNING\] " \
+ "\[警告\] "
+ ##ID:004426##
+ mcset $l "\[ERROR\] " \
+ "\[错误\] "
+ ##ID:004427##
+ mcset $l "HD44780 ERROR" \
+ "HD44780 错误"
+ ##ID:004428##
+ mcset $l "Received instruction: %s" \
+ "Received instruction: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:004429##
+ mcset $l "Clear Display" \
+ "Clear Display" ;# <-- NOT TRANSLATED YET
+ ##ID:004430##
+ mcset $l "Return Home" \
+ "Return Home" ;# <-- NOT TRANSLATED YET
+ ##ID:004431##
+ mcset $l "Entry Mode Set" \
+ "Entry Mode Set" ;# <-- NOT TRANSLATED YET
+ ##ID:004432##
+ mcset $l "Display On Off Control" \
+ "Display On Off Control" ;# <-- NOT TRANSLATED YET
+ ##ID:004433##
+ mcset $l "Cursor Or Display Shift" \
+ "Cursor Or Display Shift" ;# <-- NOT TRANSLATED YET
+ ##ID:004434##
+ mcset $l "Function Set" \
+ "Function Set" ;# <-- NOT TRANSLATED YET
+ ##ID:004435##
+ mcset $l "Set CGRAM Address" \
+ "Set CGRAM Address" ;# <-- NOT TRANSLATED YET
+ ##ID:004436##
+ mcset $l "Set DDRAM Address" \
+ "Set DDRAM Address" ;# <-- NOT TRANSLATED YET
+ ##ID:004437##
+ mcset $l "Read Busy Flag & Address" \
+ "Read Busy Flag & Address" ;# <-- NOT TRANSLATED YET
+ ##ID:004438##
+ mcset $l "Write Data To CG Or DDRAM" \
+ "Write Data To CG Or DDRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004439##
+ mcset $l "Neither \"Set DDRAM Address\" nor \"Set CGRAM Address\" instruction was issued prior to the write instruction" \
+ "Neither \"Set DDRAM Address\" nor \"Set CGRAM Address\" instruction was issued prior to the write instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:004440##
+ mcset $l "Read Data From CG Or DDRAM" \
+ "Read Data From CG Or DDRAM" ;# <-- NOT TRANSLATED YET
+ ##ID:004441##
+ mcset $l "Neither \"Set DDRAM Address\" nor \"Set CGRAM Address\" instruction was issued prior to the read instruction" \
+ "Neither \"Set DDRAM Address\" nor \"Set CGRAM Address\" instruction was issued prior to the read instruction" ;# <-- NOT TRANSLATED YET
+ ##ID:004442##
+ mcset $l "Controller is busy, unable to execute requested instruction." \
+ "Controller is busy, unable to execute requested instruction." ;# <-- NOT TRANSLATED YET
+ ##ID:004443##
+ mcset $l "Commencing execution, this action will take %d micro-seonds to comply." \
+ "Commencing execution, this action will take %d micro-seonds to comply." ;# <-- NOT TRANSLATED YET
+ ##ID:004444##
+ mcset $l "Operation finished" \
+ "操作完成"
+ ##ID:004445##
+ mcset $l "Skipping delay" \
+ "跳过延迟"
+ ##ID:004446##
+ mcset $l "Device reset" \
+ "复位设备"
+ ##ID:004447##
+ mcset $l "DDRAM address is too high: %d" \
+ "DDRAM address is too high: %d" ;# <-- NOT TRANSLATED YET
+ ##ID:004448##
+ mcset $l "CGRAM address is too high: %d" \
+ "CGRAM address is too high: %d" ;# <-- NOT TRANSLATED YET
+ ##ID:004449##
+ mcset $l "Value is too high: 0x%X" \
+ "Value is too high: 0x%X" ;# <-- NOT TRANSLATED YET
+ ##ID:004450##
+ mcset $l "Input is corrupted: %s" \
+ "Input is corrupted: %s" ;# <-- NOT TRANSLATED YET
+ ##ID:004451##
+ mcset $l "Invalid instruction: %2Xh" \
+ "无效的指令: %2Xh"
+ ##ID:004452##
+ mcset $l "Received an invalid input on signal %s" \
+ "收到无效的信号输入 %s"
+ ##ID:004453##
+ mcset $l "LCD display controled by HD44780 driver\n\n" \
+ "LCD HD44780 显示屏驱动程序\n\n"
+ ##ID:004454##
+ mcset $l "Starting the HD44780 boot-up sequence." \
+ "Starting the HD44780 boot-up sequence." ;# <-- NOT TRANSLATED YET
+ ##ID:004455##
+ mcset $l "Receiving the Most Significant Nibble (%02Xh)" \
+ "Receiving the Most Significant Nibble (%02Xh)" ;# <-- NOT TRANSLATED YET
+ ##ID:004456##
+ mcset $l "Receiving the Less Significant Nibble (%02Xh)" \
+ "Receiving the Less Significant Nibble (%02Xh)" ;# <-- NOT TRANSLATED YET
+}
+