From f508189682b6fba62e08feeb1596f682bad5fff9 Mon Sep 17 00:00:00 2001 From: tpearson Date: Wed, 24 Feb 2010 18:42:24 +0000 Subject: Added KDE3 version of PikLab git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/piklab@1095639 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- src/devices/Makefile.am | 1 + src/devices/base/Makefile.am | 9 + src/devices/base/base.pro | 6 + src/devices/base/device_group.cpp | 362 + src/devices/base/device_group.h | 87 + src/devices/base/generic_device.cpp | 216 + src/devices/base/generic_device.h | 171 + src/devices/base/generic_memory.cpp | 48 + src/devices/base/generic_memory.h | 47 + src/devices/base/hex_buffer.cpp | 290 + src/devices/base/hex_buffer.h | 51 + src/devices/base/register.cpp | 156 + src/devices/base/register.h | 130 + src/devices/devices.pro | 2 + src/devices/gui/Makefile.am | 7 + src/devices/gui/device_group_ui.cpp | 9 + src/devices/gui/device_group_ui.h | 45 + src/devices/gui/hex_view.cpp | 23 + src/devices/gui/hex_view.h | 39 + src/devices/gui/hex_word_editor.cpp | 42 + src/devices/gui/hex_word_editor.h | 64 + src/devices/gui/memory_editor.cpp | 369 + src/devices/gui/memory_editor.h | 156 + src/devices/gui/register_view.cpp | 208 + src/devices/gui/register_view.h | 105 + src/devices/list/Makefile.am | 11 + src/devices/list/device_list.cpp | 40 + src/devices/list/device_list.h | 34 + src/devices/list/device_list_noui.cpp | 18 + src/devices/list/device_list_ui.cpp | 20 + src/devices/list/list.pro | 6 + src/devices/mem24/Makefile.am | 3 + src/devices/mem24/base/Makefile.am | 6 + src/devices/mem24/base/base.pro | 6 + src/devices/mem24/base/mem24.cpp | 22 + src/devices/mem24/base/mem24.h | 47 + src/devices/mem24/gui/Makefile.am | 7 + src/devices/mem24/gui/mem24_group_ui.cpp | 16 + src/devices/mem24/gui/mem24_group_ui.h | 28 + src/devices/mem24/gui/mem24_hex_view.cpp | 38 + src/devices/mem24/gui/mem24_hex_view.h | 33 + src/devices/mem24/gui/mem24_memory_editor.cpp | 80 + src/devices/mem24/gui/mem24_memory_editor.h | 77 + src/devices/mem24/mem24.pro | 2 + src/devices/mem24/mem24/Makefile.am | 6 + src/devices/mem24/mem24/mem24.pro | 6 + src/devices/mem24/mem24/mem24_group.cpp | 43 + src/devices/mem24/mem24/mem24_group.h | 39 + src/devices/mem24/mem24/mem24_memory.cpp | 92 + src/devices/mem24/mem24/mem24_memory.h | 45 + src/devices/mem24/prog/Makefile.am | 5 + src/devices/mem24/prog/mem24_prog.cpp | 88 + src/devices/mem24/prog/mem24_prog.h | 63 + src/devices/mem24/prog/prog.pro | 6 + src/devices/mem24/xml/Makefile.am | 12 + src/devices/mem24/xml/mem24_xml_to_data.cpp | 60 + src/devices/mem24/xml/xml.pro | 13 + src/devices/mem24/xml_data/24AA00.xml | 41 + src/devices/mem24/xml_data/24AA01.xml | 41 + src/devices/mem24/xml_data/24AA014.xml | 33 + src/devices/mem24/xml_data/24AA02.xml | 41 + src/devices/mem24/xml_data/24AA024.xml | 33 + src/devices/mem24/xml_data/24AA025.xml | 33 + src/devices/mem24/xml_data/24AA04.xml | 41 + src/devices/mem24/xml_data/24AA08.xml | 41 + src/devices/mem24/xml_data/24AA1025.xml | 33 + src/devices/mem24/xml_data/24AA128.xml | 44 + src/devices/mem24/xml_data/24AA16.xml | 41 + src/devices/mem24/xml_data/24AA164.xml | 33 + src/devices/mem24/xml_data/24AA256.xml | 44 + src/devices/mem24/xml_data/24AA32A.xml | 33 + src/devices/mem24/xml_data/24AA512.xml | 50 + src/devices/mem24/xml_data/24AA515.xml | 33 + src/devices/mem24/xml_data/24AA64.xml | 33 + src/devices/mem24/xml_data/24AA65.xml | 33 + src/devices/mem24/xml_data/24C00.xml | 43 + src/devices/mem24/xml_data/24C01C.xml | 35 + src/devices/mem24/xml_data/24C02C.xml | 35 + src/devices/mem24/xml_data/24C65.xml | 32 + src/devices/mem24/xml_data/24FC1025.xml | 32 + src/devices/mem24/xml_data/24FC128.xml | 44 + src/devices/mem24/xml_data/24FC256.xml | 44 + src/devices/mem24/xml_data/24FC512.xml | 49 + src/devices/mem24/xml_data/24FC515.xml | 32 + src/devices/mem24/xml_data/24LC00.xml | 41 + src/devices/mem24/xml_data/24LC014.xml | 32 + src/devices/mem24/xml_data/24LC01B.xml | 40 + src/devices/mem24/xml_data/24LC024.xml | 32 + src/devices/mem24/xml_data/24LC025.xml | 32 + src/devices/mem24/xml_data/24LC02B.xml | 40 + src/devices/mem24/xml_data/24LC04B.xml | 40 + src/devices/mem24/xml_data/24LC08B.xml | 40 + src/devices/mem24/xml_data/24LC1025.xml | 32 + src/devices/mem24/xml_data/24LC128.xml | 43 + src/devices/mem24/xml_data/24LC16B.xml | 40 + src/devices/mem24/xml_data/24LC21A.xml | 33 + src/devices/mem24/xml_data/24LC22A.xml | 33 + src/devices/mem24/xml_data/24LC256.xml | 43 + src/devices/mem24/xml_data/24LC32A.xml | 32 + src/devices/mem24/xml_data/24LC512.xml | 49 + src/devices/mem24/xml_data/24LC515.xml | 32 + src/devices/mem24/xml_data/24LC64.xml | 32 + src/devices/mem24/xml_data/24LC65.xml | 33 + src/devices/mem24/xml_data/24LCS21A.xml | 33 + src/devices/mem24/xml_data/Makefile.am | 12 + src/devices/mem24/xml_data/deps.mak | 6 + src/devices/mem24/xml_data/xml_data.pro | 5 + src/devices/pic/Makefile.am | 3 + src/devices/pic/base/Makefile.am | 6 + src/devices/pic/base/base.pro | 6 + src/devices/pic/base/pic.cpp | 426 + src/devices/pic/base/pic.h | 179 + src/devices/pic/base/pic_config.cpp | 456 + src/devices/pic/base/pic_config.h | 107 + src/devices/pic/base/pic_protection.cpp | 361 + src/devices/pic/base/pic_protection.h | 60 + src/devices/pic/base/pic_register.cpp | 287 + src/devices/pic/base/pic_register.h | 115 + src/devices/pic/gui/Makefile.am | 9 + src/devices/pic/gui/pic_config_editor.cpp | 68 + src/devices/pic/gui/pic_config_editor.h | 37 + src/devices/pic/gui/pic_config_word_editor.cpp | 196 + src/devices/pic/gui/pic_config_word_editor.h | 70 + src/devices/pic/gui/pic_group_ui.cpp | 87 + src/devices/pic/gui/pic_group_ui.h | 29 + src/devices/pic/gui/pic_hex_view.cpp | 60 + src/devices/pic/gui/pic_hex_view.h | 39 + src/devices/pic/gui/pic_memory_editor.cpp | 404 + src/devices/pic/gui/pic_memory_editor.h | 189 + src/devices/pic/gui/pic_prog_group_ui.cpp | 41 + src/devices/pic/gui/pic_prog_group_ui.h | 31 + src/devices/pic/gui/pic_register_view.cpp | 329 + src/devices/pic/gui/pic_register_view.h | 88 + src/devices/pic/pic.pro | 2 + src/devices/pic/pic/Makefile.am | 5 + src/devices/pic/pic/pic.pro | 6 + src/devices/pic/pic/pic_group.cpp | 87 + src/devices/pic/pic/pic_group.h | 39 + src/devices/pic/pic/pic_memory.cpp | 560 + src/devices/pic/pic/pic_memory.h | 80 + src/devices/pic/prog/Makefile.am | 5 + src/devices/pic/prog/pic_debug.cpp | 118 + src/devices/pic/prog/pic_debug.h | 65 + src/devices/pic/prog/pic_prog.cpp | 751 + src/devices/pic/prog/pic_prog.h | 110 + src/devices/pic/prog/pic_prog_specific.cpp | 121 + src/devices/pic/prog/pic_prog_specific.h | 86 + src/devices/pic/prog/prog.pro | 6 + src/devices/pic/xml/Makefile.am | 12 + src/devices/pic/xml/pic_xml_to_data.cpp | 718 + src/devices/pic/xml/xml.pro | 13 + src/devices/pic/xml_data/10F200.xml | 76 + src/devices/pic/xml_data/10F202.xml | 76 + src/devices/pic/xml_data/10F204.xml | 76 + src/devices/pic/xml_data/10F206.xml | 76 + src/devices/pic/xml_data/10F220.xml | 81 + src/devices/pic/xml_data/10F222.xml | 81 + src/devices/pic/xml_data/12C508.xml | 71 + src/devices/pic/xml_data/12C508A.xml | 68 + src/devices/pic/xml_data/12C509.xml | 71 + src/devices/pic/xml_data/12C509A.xml | 68 + src/devices/pic/xml_data/12C671.xml | 85 + src/devices/pic/xml_data/12C672.xml | 87 + src/devices/pic/xml_data/12CE518.xml | 69 + src/devices/pic/xml_data/12CE519.xml | 69 + src/devices/pic/xml_data/12CE673.xml | 86 + src/devices/pic/xml_data/12CE674.xml | 88 + src/devices/pic/xml_data/12CR509A.xml | 68 + src/devices/pic/xml_data/12F508.xml | 71 + src/devices/pic/xml_data/12F509.xml | 71 + src/devices/pic/xml_data/12F510.xml | 74 + src/devices/pic/xml_data/12F519.xml | 82 + src/devices/pic/xml_data/12F609.xml | 99 + src/devices/pic/xml_data/12F615.xml | 99 + src/devices/pic/xml_data/12F629.xml | 102 + src/devices/pic/xml_data/12F635.xml | 104 + src/devices/pic/xml_data/12F675.xml | 102 + src/devices/pic/xml_data/12F683.xml | 100 + src/devices/pic/xml_data/14000.xml | 99 + src/devices/pic/xml_data/16C432.xml | 88 + src/devices/pic/xml_data/16C433.xml | 91 + src/devices/pic/xml_data/16C505.xml | 87 + src/devices/pic/xml_data/16C52.xml | 90 + src/devices/pic/xml_data/16C54.xml | 105 + src/devices/pic/xml_data/16C54A.xml | 115 + src/devices/pic/xml_data/16C54B.xml | 110 + src/devices/pic/xml_data/16C54C.xml | 110 + src/devices/pic/xml_data/16C55.xml | 123 + src/devices/pic/xml_data/16C554.xml | 112 + src/devices/pic/xml_data/16C557.xml | 137 + src/devices/pic/xml_data/16C558.xml | 116 + src/devices/pic/xml_data/16C55A.xml | 128 + src/devices/pic/xml_data/16C56.xml | 105 + src/devices/pic/xml_data/16C56A.xml | 110 + src/devices/pic/xml_data/16C57.xml | 123 + src/devices/pic/xml_data/16C57C.xml | 128 + src/devices/pic/xml_data/16C58A.xml | 114 + src/devices/pic/xml_data/16C58B.xml | 110 + src/devices/pic/xml_data/16C61.xml | 84 + src/devices/pic/xml_data/16C62.xml | 95 + src/devices/pic/xml_data/16C620.xml | 113 + src/devices/pic/xml_data/16C620A.xml | 117 + src/devices/pic/xml_data/16C621.xml | 115 + src/devices/pic/xml_data/16C621A.xml | 119 + src/devices/pic/xml_data/16C622.xml | 117 + src/devices/pic/xml_data/16C622A.xml | 121 + src/devices/pic/xml_data/16C62A.xml | 100 + src/devices/pic/xml_data/16C62B.xml | 100 + src/devices/pic/xml_data/16C63.xml | 100 + src/devices/pic/xml_data/16C63A.xml | 101 + src/devices/pic/xml_data/16C64.xml | 201 + src/devices/pic/xml_data/16C641.xml | 99 + src/devices/pic/xml_data/16C642.xml | 104 + src/devices/pic/xml_data/16C64A.xml | 253 + src/devices/pic/xml_data/16C65.xml | 201 + src/devices/pic/xml_data/16C65A.xml | 253 + src/devices/pic/xml_data/16C65B.xml | 207 + src/devices/pic/xml_data/16C66.xml | 100 + src/devices/pic/xml_data/16C661.xml | 111 + src/devices/pic/xml_data/16C662.xml | 116 + src/devices/pic/xml_data/16C67.xml | 253 + src/devices/pic/xml_data/16C71.xml | 81 + src/devices/pic/xml_data/16C710.xml | 112 + src/devices/pic/xml_data/16C711.xml | 112 + src/devices/pic/xml_data/16C712.xml | 108 + src/devices/pic/xml_data/16C715.xml | 117 + src/devices/pic/xml_data/16C716.xml | 112 + src/devices/pic/xml_data/16C717.xml | 129 + src/devices/pic/xml_data/16C72.xml | 100 + src/devices/pic/xml_data/16C72A.xml | 100 + src/devices/pic/xml_data/16C73.xml | 95 + src/devices/pic/xml_data/16C73A.xml | 100 + src/devices/pic/xml_data/16C73B.xml | 101 + src/devices/pic/xml_data/16C74.xml | 201 + src/devices/pic/xml_data/16C745.xml | 92 + src/devices/pic/xml_data/16C74A.xml | 206 + src/devices/pic/xml_data/16C74B.xml | 207 + src/devices/pic/xml_data/16C76.xml | 100 + src/devices/pic/xml_data/16C765.xml | 198 + src/devices/pic/xml_data/16C77.xml | 206 + src/devices/pic/xml_data/16C770.xml | 108 + src/devices/pic/xml_data/16C771.xml | 108 + src/devices/pic/xml_data/16C773.xml | 106 + src/devices/pic/xml_data/16C774.xml | 259 + src/devices/pic/xml_data/16C781.xml | 104 + src/devices/pic/xml_data/16C782.xml | 104 + src/devices/pic/xml_data/16C84.xml | 99 + src/devices/pic/xml_data/16C923.xml | 270 + src/devices/pic/xml_data/16C924.xml | 270 + src/devices/pic/xml_data/16C925.xml | 199 + src/devices/pic/xml_data/16C926.xml | 199 + src/devices/pic/xml_data/16CE623.xml | 114 + src/devices/pic/xml_data/16CE624.xml | 116 + src/devices/pic/xml_data/16CE625.xml | 117 + src/devices/pic/xml_data/16CR54.xml_broken | 87 + src/devices/pic/xml_data/16CR54A.xml | 107 + src/devices/pic/xml_data/16CR54B.xml | 110 + src/devices/pic/xml_data/16CR54C.xml | 110 + src/devices/pic/xml_data/16CR56A.xml | 110 + src/devices/pic/xml_data/16CR57B.xml | 125 + src/devices/pic/xml_data/16CR57C.xml | 128 + src/devices/pic/xml_data/16CR58A.xml | 107 + src/devices/pic/xml_data/16CR58B.xml | 110 + src/devices/pic/xml_data/16CR62.xml | 100 + src/devices/pic/xml_data/16CR620A.xml | 113 + src/devices/pic/xml_data/16CR63.xml | 100 + src/devices/pic/xml_data/16CR64.xml | 206 + src/devices/pic/xml_data/16CR65.xml | 253 + src/devices/pic/xml_data/16CR72.xml | 100 + src/devices/pic/xml_data/16CR73.xml | 127 + src/devices/pic/xml_data/16CR74.xml | 202 + src/devices/pic/xml_data/16CR76.xml | 127 + src/devices/pic/xml_data/16CR77.xml | 202 + src/devices/pic/xml_data/16CR83.xml | 110 + src/devices/pic/xml_data/16CR84.xml | 110 + src/devices/pic/xml_data/16F505.xml | 81 + src/devices/pic/xml_data/16F506.xml | 86 + src/devices/pic/xml_data/16F54.xml | 98 + src/devices/pic/xml_data/16F57.xml | 116 + src/devices/pic/xml_data/16F59.xml | 144 + src/devices/pic/xml_data/16F610.xml | 123 + src/devices/pic/xml_data/16F616.xml | 124 + src/devices/pic/xml_data/16F627.xml | 143 + src/devices/pic/xml_data/16F627A.xml | 164 + src/devices/pic/xml_data/16F628.xml | 145 + src/devices/pic/xml_data/16F628A.xml | 164 + src/devices/pic/xml_data/16F630.xml | 108 + src/devices/pic/xml_data/16F631.xml | 135 + src/devices/pic/xml_data/16F636.xml | 110 + src/devices/pic/xml_data/16F639.xml | 116 + src/devices/pic/xml_data/16F648A.xml | 164 + src/devices/pic/xml_data/16F676.xml | 108 + src/devices/pic/xml_data/16F677.xml | 135 + src/devices/pic/xml_data/16F684.xml | 106 + src/devices/pic/xml_data/16F685.xml | 135 + src/devices/pic/xml_data/16F687.xml | 135 + src/devices/pic/xml_data/16F688.xml | 106 + src/devices/pic/xml_data/16F689.xml | 135 + src/devices/pic/xml_data/16F690.xml | 135 + src/devices/pic/xml_data/16F716.xml | 119 + src/devices/pic/xml_data/16F72.xml | 130 + src/devices/pic/xml_data/16F73.xml | 121 + src/devices/pic/xml_data/16F737.xml | 215 + src/devices/pic/xml_data/16F74.xml | 196 + src/devices/pic/xml_data/16F747.xml | 196 + src/devices/pic/xml_data/16F76.xml | 121 + src/devices/pic/xml_data/16F767.xml | 215 + src/devices/pic/xml_data/16F77.xml | 196 + src/devices/pic/xml_data/16F777.xml | 196 + src/devices/pic/xml_data/16F785.xml | 120 + src/devices/pic/xml_data/16F818.xml | 176 + src/devices/pic/xml_data/16F819.xml | 176 + src/devices/pic/xml_data/16F83.xml | 106 + src/devices/pic/xml_data/16F84.xml | 106 + src/devices/pic/xml_data/16F84A.xml | 108 + src/devices/pic/xml_data/16F87.xml | 186 + src/devices/pic/xml_data/16F870.xml | 120 + src/devices/pic/xml_data/16F871.xml | 226 + src/devices/pic/xml_data/16F872.xml | 120 + src/devices/pic/xml_data/16F873.xml | 127 + src/devices/pic/xml_data/16F873A.xml | 151 + src/devices/pic/xml_data/16F874.xml | 233 + src/devices/pic/xml_data/16F874A.xml | 273 + src/devices/pic/xml_data/16F876.xml | 127 + src/devices/pic/xml_data/16F876A.xml | 151 + src/devices/pic/xml_data/16F877.xml | 233 + src/devices/pic/xml_data/16F877A.xml | 273 + src/devices/pic/xml_data/16F88.xml | 184 + src/devices/pic/xml_data/16F882.xml | 175 + src/devices/pic/xml_data/16F883.xml | 175 + src/devices/pic/xml_data/16F884.xml | 250 + src/devices/pic/xml_data/16F886.xml | 175 + src/devices/pic/xml_data/16F887.xml | 250 + src/devices/pic/xml_data/16F913.xml | 156 + src/devices/pic/xml_data/16F914.xml | 188 + src/devices/pic/xml_data/16F916.xml | 156 + src/devices/pic/xml_data/16F917.xml | 188 + src/devices/pic/xml_data/16F946.xml | 161 + src/devices/pic/xml_data/16HV540.xml | 97 + src/devices/pic/xml_data/17C42.xml | 192 + src/devices/pic/xml_data/17C42A.xml | 196 + src/devices/pic/xml_data/17C43.xml | 196 + src/devices/pic/xml_data/17C44.xml | 196 + src/devices/pic/xml_data/17C752.xml | 201 + src/devices/pic/xml_data/17C756.xml | 201 + src/devices/pic/xml_data/17C756A.xml | 201 + src/devices/pic/xml_data/17C762.xml | 233 + src/devices/pic/xml_data/17C766.xml | 233 + src/devices/pic/xml_data/17CR42.xml | 196 + src/devices/pic/xml_data/17CR43.xml | 196 + src/devices/pic/xml_data/18C242.xml | 146 + src/devices/pic/xml_data/18C252.xml | 146 + src/devices/pic/xml_data/18C442.xml | 252 + src/devices/pic/xml_data/18C452.xml | 252 + src/devices/pic/xml_data/18C601.xml | 225 + src/devices/pic/xml_data/18C658.xml | 248 + src/devices/pic/xml_data/18C801.xml | 257 + src/devices/pic/xml_data/18C858.xml | 280 + src/devices/pic/xml_data/18F1220.xml | 279 + src/devices/pic/xml_data/18F1230.xml | 311 + src/devices/pic/xml_data/18F1320.xml | 280 + src/devices/pic/xml_data/18F1330.xml | 313 + src/devices/pic/xml_data/18F2220.xml | 244 + src/devices/pic/xml_data/18F2221.xml | 281 + src/devices/pic/xml_data/18F2320.xml | 271 + src/devices/pic/xml_data/18F2321.xml | 282 + src/devices/pic/xml_data/18F2331.xml | 256 + src/devices/pic/xml_data/18F2410.xml | 268 + src/devices/pic/xml_data/18F242.xml | 221 + src/devices/pic/xml_data/18F2420.xml | 277 + src/devices/pic/xml_data/18F2423.xml | 274 + src/devices/pic/xml_data/18F2431.xml | 257 + src/devices/pic/xml_data/18F2439.xml | 210 + src/devices/pic/xml_data/18F2450.xml | 299 + src/devices/pic/xml_data/18F2455.xml | 288 + src/devices/pic/xml_data/18F248.xml | 216 + src/devices/pic/xml_data/18F2480.xml | 283 + src/devices/pic/xml_data/18F24J10.xml | 182 + src/devices/pic/xml_data/18F2510.xml | 298 + src/devices/pic/xml_data/18F2515.xml | 255 + src/devices/pic/xml_data/18F252.xml | 246 + src/devices/pic/xml_data/18F2520.xml | 307 + src/devices/pic/xml_data/18F2523.xml | 298 + src/devices/pic/xml_data/18F2525.xml | 264 + src/devices/pic/xml_data/18F2539.xml | 222 + src/devices/pic/xml_data/18F2550.xml | 292 + src/devices/pic/xml_data/18F258.xml | 241 + src/devices/pic/xml_data/18F2580.xml | 307 + src/devices/pic/xml_data/18F2585.xml | 266 + src/devices/pic/xml_data/18F25J10.xml | 182 + src/devices/pic/xml_data/18F2610.xml | 267 + src/devices/pic/xml_data/18F2620.xml | 265 + src/devices/pic/xml_data/18F2680.xml | 278 + src/devices/pic/xml_data/18F2682.xml | 284 + src/devices/pic/xml_data/18F2685.xml | 296 + src/devices/pic/xml_data/18F4220.xml | 351 + src/devices/pic/xml_data/18F4221.xml | 368 + src/devices/pic/xml_data/18F4320.xml | 377 + src/devices/pic/xml_data/18F4321.xml | 368 + src/devices/pic/xml_data/18F4331.xml | 384 + src/devices/pic/xml_data/18F4410.xml | 349 + src/devices/pic/xml_data/18F442.xml | 327 + src/devices/pic/xml_data/18F4420.xml | 358 + src/devices/pic/xml_data/18F4423.xml | 349 + src/devices/pic/xml_data/18F4431.xml | 409 + src/devices/pic/xml_data/18F4439.xml | 316 + src/devices/pic/xml_data/18F4450.xml | 378 + src/devices/pic/xml_data/18F4455.xml | 398 + src/devices/pic/xml_data/18F448.xml | 322 + src/devices/pic/xml_data/18F4480.xml | 358 + src/devices/pic/xml_data/18F44J10.xml | 129 + src/devices/pic/xml_data/18F4510.xml | 373 + src/devices/pic/xml_data/18F4515.xml | 361 + src/devices/pic/xml_data/18F452.xml | 352 + src/devices/pic/xml_data/18F4520.xml | 382 + src/devices/pic/xml_data/18F4523.xml | 379 + src/devices/pic/xml_data/18F4525.xml | 370 + src/devices/pic/xml_data/18F4539.xml | 328 + src/devices/pic/xml_data/18F4550.xml | 402 + src/devices/pic/xml_data/18F458.xml | 347 + src/devices/pic/xml_data/18F4580.xml | 382 + src/devices/pic/xml_data/18F4585.xml | 372 + src/devices/pic/xml_data/18F45J10.xml | 129 + src/devices/pic/xml_data/18F4610.xml | 373 + src/devices/pic/xml_data/18F4620.xml | 371 + src/devices/pic/xml_data/18F4680.xml | 384 + src/devices/pic/xml_data/18F4682.xml | 390 + src/devices/pic/xml_data/18F4685.xml | 402 + src/devices/pic/xml_data/18F6310.xml | 250 + src/devices/pic/xml_data/18F6390.xml | 250 + src/devices/pic/xml_data/18F6393.xml | 253 + src/devices/pic/xml_data/18F63J11.xml | 185 + src/devices/pic/xml_data/18F63J90.xml | 184 + src/devices/pic/xml_data/18F6410.xml | 250 + src/devices/pic/xml_data/18F6490.xml | 250 + src/devices/pic/xml_data/18F6493.xml | 253 + src/devices/pic/xml_data/18F64J11.xml | 185 + src/devices/pic/xml_data/18F64J90.xml | 185 + src/devices/pic/xml_data/18F6520.xml | 283 + src/devices/pic/xml_data/18F6525.xml | 287 + src/devices/pic/xml_data/18F6527.xml | 302 + src/devices/pic/xml_data/18F6585.xml | 350 + src/devices/pic/xml_data/18F65J10.xml | 185 + src/devices/pic/xml_data/18F65J11.xml | 185 + src/devices/pic/xml_data/18F65J15.xml | 185 + src/devices/pic/xml_data/18F65J50.xml | 199 + src/devices/pic/xml_data/18F65J90.xml | 185 + src/devices/pic/xml_data/18F6620.xml | 285 + src/devices/pic/xml_data/18F6621.xml | 299 + src/devices/pic/xml_data/18F6622.xml | 314 + src/devices/pic/xml_data/18F6627.xml | 332 + src/devices/pic/xml_data/18F6680.xml | 362 + src/devices/pic/xml_data/18F66J10.xml | 185 + src/devices/pic/xml_data/18F66J11.xml | 190 + src/devices/pic/xml_data/18F66J15.xml | 185 + src/devices/pic/xml_data/18F66J16.xml | 189 + src/devices/pic/xml_data/18F66J50.xml | 199 + src/devices/pic/xml_data/18F66J55.xml | 199 + src/devices/pic/xml_data/18F66J60.xml | 185 + src/devices/pic/xml_data/18F66J65.xml | 185 + src/devices/pic/xml_data/18F6720.xml | 330 + src/devices/pic/xml_data/18F6722.xml | 356 + src/devices/pic/xml_data/18F67J10.xml | 185 + src/devices/pic/xml_data/18F67J11.xml | 190 + src/devices/pic/xml_data/18F67J50.xml | 199 + src/devices/pic/xml_data/18F67J60.xml | 185 + src/devices/pic/xml_data/18F8310.xml | 266 + src/devices/pic/xml_data/18F8390.xml | 266 + src/devices/pic/xml_data/18F8393.xml | 254 + src/devices/pic/xml_data/18F83J11.xml | 143 + src/devices/pic/xml_data/18F83J90.xml | 143 + src/devices/pic/xml_data/18F8410.xml | 251 + src/devices/pic/xml_data/18F8490.xml | 251 + src/devices/pic/xml_data/18F8493.xml | 254 + src/devices/pic/xml_data/18F84J11.xml | 143 + src/devices/pic/xml_data/18F84J90.xml | 143 + src/devices/pic/xml_data/18F8520.xml | 311 + src/devices/pic/xml_data/18F8525.xml | 312 + src/devices/pic/xml_data/18F8527.xml | 346 + src/devices/pic/xml_data/18F8585.xml | 312 + src/devices/pic/xml_data/18F85J10.xml | 143 + src/devices/pic/xml_data/18F85J11.xml | 143 + src/devices/pic/xml_data/18F85J15.xml | 143 + src/devices/pic/xml_data/18F85J50.xml | 161 + src/devices/pic/xml_data/18F85J90.xml | 142 + src/devices/pic/xml_data/18F8620.xml | 311 + src/devices/pic/xml_data/18F8621.xml | 324 + src/devices/pic/xml_data/18F8622.xml | 358 + src/devices/pic/xml_data/18F8627.xml | 376 + src/devices/pic/xml_data/18F8680.xml | 324 + src/devices/pic/xml_data/18F86J10.xml | 143 + src/devices/pic/xml_data/18F86J11.xml | 152 + src/devices/pic/xml_data/18F86J15.xml | 143 + src/devices/pic/xml_data/18F86J16.xml | 151 + src/devices/pic/xml_data/18F86J50.xml | 161 + src/devices/pic/xml_data/18F86J55.xml | 161 + src/devices/pic/xml_data/18F86J60.xml | 196 + src/devices/pic/xml_data/18F86J65.xml | 193 + src/devices/pic/xml_data/18F8720.xml | 359 + src/devices/pic/xml_data/18F8722.xml | 400 + src/devices/pic/xml_data/18F87J10.xml | 143 + src/devices/pic/xml_data/18F87J11.xml | 151 + src/devices/pic/xml_data/18F87J50.xml | 161 + src/devices/pic/xml_data/18F87J60.xml | 193 + src/devices/pic/xml_data/18F96J60.xml | 211 + src/devices/pic/xml_data/18F96J65.xml | 211 + src/devices/pic/xml_data/18F97J60.xml | 211 + src/devices/pic/xml_data/24FJ128GA006.xml | 122 + src/devices/pic/xml_data/24FJ128GA008.xml | 122 + src/devices/pic/xml_data/24FJ128GA010.xml | 122 + src/devices/pic/xml_data/24FJ64GA002.xml | 132 + src/devices/pic/xml_data/24FJ64GA004.xml | 132 + src/devices/pic/xml_data/24FJ64GA006.xml | 122 + src/devices/pic/xml_data/24FJ64GA008.xml | 122 + src/devices/pic/xml_data/24FJ64GA010.xml | 122 + src/devices/pic/xml_data/24FJ96GA006.xml | 122 + src/devices/pic/xml_data/24FJ96GA008.xml | 122 + src/devices/pic/xml_data/24FJ96GA010.xml | 122 + src/devices/pic/xml_data/24HJ128GP206.xml | 199 + src/devices/pic/xml_data/24HJ128GP210.xml | 199 + src/devices/pic/xml_data/24HJ128GP306.xml | 199 + src/devices/pic/xml_data/24HJ128GP310.xml | 199 + src/devices/pic/xml_data/24HJ128GP506.xml | 199 + src/devices/pic/xml_data/24HJ128GP510.xml | 199 + src/devices/pic/xml_data/24HJ12GP201.xml | 177 + src/devices/pic/xml_data/24HJ12GP202.xml | 177 + src/devices/pic/xml_data/24HJ16GP304.xml | 180 + src/devices/pic/xml_data/24HJ256GP206.xml | 199 + src/devices/pic/xml_data/24HJ256GP210.xml | 199 + src/devices/pic/xml_data/24HJ256GP610.xml | 199 + src/devices/pic/xml_data/24HJ32GP202.xml | 180 + src/devices/pic/xml_data/24HJ32GP204.xml | 180 + src/devices/pic/xml_data/24HJ64GP206.xml | 199 + src/devices/pic/xml_data/24HJ64GP210.xml | 199 + src/devices/pic/xml_data/24HJ64GP506.xml | 199 + src/devices/pic/xml_data/24HJ64GP510.xml | 199 + src/devices/pic/xml_data/30F1010.xml | 221 + src/devices/pic/xml_data/30F2010.xml | 237 + src/devices/pic/xml_data/30F2011.xml | 203 + src/devices/pic/xml_data/30F2012.xml | 213 + src/devices/pic/xml_data/30F2020.xml | 221 + src/devices/pic/xml_data/30F2023.xml | 162 + src/devices/pic/xml_data/30F3010.xml | 242 + src/devices/pic/xml_data/30F3011.xml | 302 + src/devices/pic/xml_data/30F3012.xml | 220 + src/devices/pic/xml_data/30F3013.xml | 230 + src/devices/pic/xml_data/30F3014.xml | 289 + src/devices/pic/xml_data/30F4011.xml | 305 + src/devices/pic/xml_data/30F4012.xml | 246 + src/devices/pic/xml_data/30F4013.xml | 290 + src/devices/pic/xml_data/30F5011.xml | 276 + src/devices/pic/xml_data/30F5013.xml | 292 + src/devices/pic/xml_data/30F5015.xml | 232 + src/devices/pic/xml_data/30F5016.xml | 248 + src/devices/pic/xml_data/30F6010.xml | 252 + src/devices/pic/xml_data/30F6010A.xml | 308 + src/devices/pic/xml_data/30F6011.xml | 224 + src/devices/pic/xml_data/30F6011A.xml | 273 + src/devices/pic/xml_data/30F6012.xml | 224 + src/devices/pic/xml_data/30F6012A.xml | 273 + src/devices/pic/xml_data/30F6013.xml | 240 + src/devices/pic/xml_data/30F6013A.xml | 289 + src/devices/pic/xml_data/30F6014.xml | 240 + src/devices/pic/xml_data/30F6014A.xml | 289 + src/devices/pic/xml_data/30F6015.xml | 285 + src/devices/pic/xml_data/Makefile.am | 12 + src/devices/pic/xml_data/deps.mak | 43 + src/devices/pic/xml_data/pic.xsd | 295 + src/devices/pic/xml_data/registers/registers.xml | 57694 +++++++++++++++++++ .../pic/xml_data/registers/registers_missing.xml | 59 + src/devices/pic/xml_data/validate.sh | 5 + src/devices/pic/xml_data/validate/Makefile | 4 + src/devices/pic/xml_data/validate/validate.cpp | 72 + src/devices/pic/xml_data/xml_data.pro | 5 + 574 files changed, 150750 insertions(+) create mode 100644 src/devices/Makefile.am create mode 100644 src/devices/base/Makefile.am create mode 100644 src/devices/base/base.pro create mode 100644 src/devices/base/device_group.cpp create mode 100644 src/devices/base/device_group.h create mode 100644 src/devices/base/generic_device.cpp create mode 100644 src/devices/base/generic_device.h create mode 100644 src/devices/base/generic_memory.cpp create mode 100644 src/devices/base/generic_memory.h create mode 100644 src/devices/base/hex_buffer.cpp create mode 100644 src/devices/base/hex_buffer.h create mode 100644 src/devices/base/register.cpp create mode 100644 src/devices/base/register.h create mode 100644 src/devices/devices.pro create mode 100644 src/devices/gui/Makefile.am create mode 100644 src/devices/gui/device_group_ui.cpp create mode 100644 src/devices/gui/device_group_ui.h create mode 100644 src/devices/gui/hex_view.cpp create mode 100644 src/devices/gui/hex_view.h create mode 100644 src/devices/gui/hex_word_editor.cpp create mode 100644 src/devices/gui/hex_word_editor.h create mode 100644 src/devices/gui/memory_editor.cpp create mode 100644 src/devices/gui/memory_editor.h create mode 100644 src/devices/gui/register_view.cpp create mode 100644 src/devices/gui/register_view.h create mode 100644 src/devices/list/Makefile.am create mode 100644 src/devices/list/device_list.cpp create mode 100644 src/devices/list/device_list.h create mode 100644 src/devices/list/device_list_noui.cpp create mode 100644 src/devices/list/device_list_ui.cpp create mode 100644 src/devices/list/list.pro create mode 100644 src/devices/mem24/Makefile.am create mode 100644 src/devices/mem24/base/Makefile.am create mode 100644 src/devices/mem24/base/base.pro create mode 100644 src/devices/mem24/base/mem24.cpp create mode 100644 src/devices/mem24/base/mem24.h create mode 100644 src/devices/mem24/gui/Makefile.am create mode 100644 src/devices/mem24/gui/mem24_group_ui.cpp create mode 100644 src/devices/mem24/gui/mem24_group_ui.h create mode 100644 src/devices/mem24/gui/mem24_hex_view.cpp create mode 100644 src/devices/mem24/gui/mem24_hex_view.h create mode 100644 src/devices/mem24/gui/mem24_memory_editor.cpp create mode 100644 src/devices/mem24/gui/mem24_memory_editor.h create mode 100644 src/devices/mem24/mem24.pro create mode 100644 src/devices/mem24/mem24/Makefile.am create mode 100644 src/devices/mem24/mem24/mem24.pro create mode 100644 src/devices/mem24/mem24/mem24_group.cpp create mode 100644 src/devices/mem24/mem24/mem24_group.h create mode 100644 src/devices/mem24/mem24/mem24_memory.cpp create mode 100644 src/devices/mem24/mem24/mem24_memory.h create mode 100644 src/devices/mem24/prog/Makefile.am create mode 100644 src/devices/mem24/prog/mem24_prog.cpp create mode 100644 src/devices/mem24/prog/mem24_prog.h create mode 100644 src/devices/mem24/prog/prog.pro create mode 100644 src/devices/mem24/xml/Makefile.am create mode 100644 src/devices/mem24/xml/mem24_xml_to_data.cpp create mode 100644 src/devices/mem24/xml/xml.pro create mode 100644 src/devices/mem24/xml_data/24AA00.xml create mode 100644 src/devices/mem24/xml_data/24AA01.xml create mode 100644 src/devices/mem24/xml_data/24AA014.xml create mode 100644 src/devices/mem24/xml_data/24AA02.xml create mode 100644 src/devices/mem24/xml_data/24AA024.xml create mode 100644 src/devices/mem24/xml_data/24AA025.xml create mode 100644 src/devices/mem24/xml_data/24AA04.xml create mode 100644 src/devices/mem24/xml_data/24AA08.xml create mode 100644 src/devices/mem24/xml_data/24AA1025.xml create mode 100644 src/devices/mem24/xml_data/24AA128.xml create mode 100644 src/devices/mem24/xml_data/24AA16.xml create mode 100644 src/devices/mem24/xml_data/24AA164.xml create mode 100644 src/devices/mem24/xml_data/24AA256.xml create mode 100644 src/devices/mem24/xml_data/24AA32A.xml create mode 100644 src/devices/mem24/xml_data/24AA512.xml create mode 100644 src/devices/mem24/xml_data/24AA515.xml create mode 100644 src/devices/mem24/xml_data/24AA64.xml create mode 100644 src/devices/mem24/xml_data/24AA65.xml create mode 100644 src/devices/mem24/xml_data/24C00.xml create mode 100644 src/devices/mem24/xml_data/24C01C.xml create mode 100644 src/devices/mem24/xml_data/24C02C.xml create mode 100644 src/devices/mem24/xml_data/24C65.xml create mode 100644 src/devices/mem24/xml_data/24FC1025.xml create mode 100644 src/devices/mem24/xml_data/24FC128.xml create mode 100644 src/devices/mem24/xml_data/24FC256.xml create mode 100644 src/devices/mem24/xml_data/24FC512.xml create mode 100644 src/devices/mem24/xml_data/24FC515.xml create mode 100644 src/devices/mem24/xml_data/24LC00.xml create mode 100644 src/devices/mem24/xml_data/24LC014.xml create mode 100644 src/devices/mem24/xml_data/24LC01B.xml create mode 100644 src/devices/mem24/xml_data/24LC024.xml create mode 100644 src/devices/mem24/xml_data/24LC025.xml create mode 100644 src/devices/mem24/xml_data/24LC02B.xml create mode 100644 src/devices/mem24/xml_data/24LC04B.xml create mode 100644 src/devices/mem24/xml_data/24LC08B.xml create mode 100644 src/devices/mem24/xml_data/24LC1025.xml create mode 100644 src/devices/mem24/xml_data/24LC128.xml create mode 100644 src/devices/mem24/xml_data/24LC16B.xml create mode 100644 src/devices/mem24/xml_data/24LC21A.xml create mode 100644 src/devices/mem24/xml_data/24LC22A.xml create mode 100644 src/devices/mem24/xml_data/24LC256.xml create mode 100644 src/devices/mem24/xml_data/24LC32A.xml create mode 100644 src/devices/mem24/xml_data/24LC512.xml create mode 100644 src/devices/mem24/xml_data/24LC515.xml create mode 100644 src/devices/mem24/xml_data/24LC64.xml create mode 100644 src/devices/mem24/xml_data/24LC65.xml create mode 100644 src/devices/mem24/xml_data/24LCS21A.xml create mode 100644 src/devices/mem24/xml_data/Makefile.am create mode 100644 src/devices/mem24/xml_data/deps.mak create mode 100644 src/devices/mem24/xml_data/xml_data.pro create mode 100644 src/devices/pic/Makefile.am create mode 100644 src/devices/pic/base/Makefile.am create mode 100644 src/devices/pic/base/base.pro create mode 100644 src/devices/pic/base/pic.cpp create mode 100644 src/devices/pic/base/pic.h create mode 100644 src/devices/pic/base/pic_config.cpp create mode 100644 src/devices/pic/base/pic_config.h create mode 100644 src/devices/pic/base/pic_protection.cpp create mode 100644 src/devices/pic/base/pic_protection.h create mode 100644 src/devices/pic/base/pic_register.cpp create mode 100644 src/devices/pic/base/pic_register.h create mode 100644 src/devices/pic/gui/Makefile.am create mode 100644 src/devices/pic/gui/pic_config_editor.cpp create mode 100644 src/devices/pic/gui/pic_config_editor.h create mode 100644 src/devices/pic/gui/pic_config_word_editor.cpp create mode 100644 src/devices/pic/gui/pic_config_word_editor.h create mode 100644 src/devices/pic/gui/pic_group_ui.cpp create mode 100644 src/devices/pic/gui/pic_group_ui.h create mode 100644 src/devices/pic/gui/pic_hex_view.cpp create mode 100644 src/devices/pic/gui/pic_hex_view.h create mode 100644 src/devices/pic/gui/pic_memory_editor.cpp create mode 100644 src/devices/pic/gui/pic_memory_editor.h create mode 100644 src/devices/pic/gui/pic_prog_group_ui.cpp create mode 100644 src/devices/pic/gui/pic_prog_group_ui.h create mode 100644 src/devices/pic/gui/pic_register_view.cpp create mode 100644 src/devices/pic/gui/pic_register_view.h create mode 100644 src/devices/pic/pic.pro create mode 100644 src/devices/pic/pic/Makefile.am create mode 100644 src/devices/pic/pic/pic.pro create mode 100644 src/devices/pic/pic/pic_group.cpp create mode 100644 src/devices/pic/pic/pic_group.h create mode 100644 src/devices/pic/pic/pic_memory.cpp create mode 100644 src/devices/pic/pic/pic_memory.h create mode 100644 src/devices/pic/prog/Makefile.am create mode 100644 src/devices/pic/prog/pic_debug.cpp create mode 100644 src/devices/pic/prog/pic_debug.h create mode 100644 src/devices/pic/prog/pic_prog.cpp create mode 100644 src/devices/pic/prog/pic_prog.h create mode 100644 src/devices/pic/prog/pic_prog_specific.cpp create mode 100644 src/devices/pic/prog/pic_prog_specific.h create mode 100644 src/devices/pic/prog/prog.pro create mode 100644 src/devices/pic/xml/Makefile.am create mode 100644 src/devices/pic/xml/pic_xml_to_data.cpp create mode 100644 src/devices/pic/xml/xml.pro create mode 100644 src/devices/pic/xml_data/10F200.xml create mode 100644 src/devices/pic/xml_data/10F202.xml create mode 100644 src/devices/pic/xml_data/10F204.xml create mode 100644 src/devices/pic/xml_data/10F206.xml create mode 100644 src/devices/pic/xml_data/10F220.xml create mode 100644 src/devices/pic/xml_data/10F222.xml create mode 100644 src/devices/pic/xml_data/12C508.xml create mode 100644 src/devices/pic/xml_data/12C508A.xml create mode 100644 src/devices/pic/xml_data/12C509.xml create mode 100644 src/devices/pic/xml_data/12C509A.xml create mode 100644 src/devices/pic/xml_data/12C671.xml create mode 100644 src/devices/pic/xml_data/12C672.xml create mode 100644 src/devices/pic/xml_data/12CE518.xml create mode 100644 src/devices/pic/xml_data/12CE519.xml create mode 100644 src/devices/pic/xml_data/12CE673.xml create mode 100644 src/devices/pic/xml_data/12CE674.xml create mode 100644 src/devices/pic/xml_data/12CR509A.xml create mode 100644 src/devices/pic/xml_data/12F508.xml create mode 100644 src/devices/pic/xml_data/12F509.xml create mode 100644 src/devices/pic/xml_data/12F510.xml create mode 100644 src/devices/pic/xml_data/12F519.xml create mode 100644 src/devices/pic/xml_data/12F609.xml create mode 100644 src/devices/pic/xml_data/12F615.xml create mode 100644 src/devices/pic/xml_data/12F629.xml create mode 100644 src/devices/pic/xml_data/12F635.xml create mode 100644 src/devices/pic/xml_data/12F675.xml create mode 100644 src/devices/pic/xml_data/12F683.xml create mode 100644 src/devices/pic/xml_data/14000.xml create mode 100644 src/devices/pic/xml_data/16C432.xml create mode 100644 src/devices/pic/xml_data/16C433.xml create mode 100644 src/devices/pic/xml_data/16C505.xml create mode 100644 src/devices/pic/xml_data/16C52.xml create mode 100644 src/devices/pic/xml_data/16C54.xml create mode 100644 src/devices/pic/xml_data/16C54A.xml create mode 100644 src/devices/pic/xml_data/16C54B.xml create mode 100644 src/devices/pic/xml_data/16C54C.xml create mode 100644 src/devices/pic/xml_data/16C55.xml create mode 100644 src/devices/pic/xml_data/16C554.xml create mode 100644 src/devices/pic/xml_data/16C557.xml create mode 100644 src/devices/pic/xml_data/16C558.xml create mode 100644 src/devices/pic/xml_data/16C55A.xml create mode 100644 src/devices/pic/xml_data/16C56.xml create mode 100644 src/devices/pic/xml_data/16C56A.xml create mode 100644 src/devices/pic/xml_data/16C57.xml create mode 100644 src/devices/pic/xml_data/16C57C.xml create mode 100644 src/devices/pic/xml_data/16C58A.xml create mode 100644 src/devices/pic/xml_data/16C58B.xml create mode 100644 src/devices/pic/xml_data/16C61.xml create mode 100644 src/devices/pic/xml_data/16C62.xml create mode 100644 src/devices/pic/xml_data/16C620.xml create mode 100644 src/devices/pic/xml_data/16C620A.xml create mode 100644 src/devices/pic/xml_data/16C621.xml create mode 100644 src/devices/pic/xml_data/16C621A.xml create mode 100644 src/devices/pic/xml_data/16C622.xml create mode 100644 src/devices/pic/xml_data/16C622A.xml create mode 100644 src/devices/pic/xml_data/16C62A.xml create mode 100644 src/devices/pic/xml_data/16C62B.xml create mode 100644 src/devices/pic/xml_data/16C63.xml create mode 100644 src/devices/pic/xml_data/16C63A.xml create mode 100644 src/devices/pic/xml_data/16C64.xml create mode 100644 src/devices/pic/xml_data/16C641.xml create mode 100644 src/devices/pic/xml_data/16C642.xml create mode 100644 src/devices/pic/xml_data/16C64A.xml create mode 100644 src/devices/pic/xml_data/16C65.xml create mode 100644 src/devices/pic/xml_data/16C65A.xml create mode 100644 src/devices/pic/xml_data/16C65B.xml create mode 100644 src/devices/pic/xml_data/16C66.xml create mode 100644 src/devices/pic/xml_data/16C661.xml create mode 100644 src/devices/pic/xml_data/16C662.xml create mode 100644 src/devices/pic/xml_data/16C67.xml create mode 100644 src/devices/pic/xml_data/16C71.xml create mode 100644 src/devices/pic/xml_data/16C710.xml create mode 100644 src/devices/pic/xml_data/16C711.xml create mode 100644 src/devices/pic/xml_data/16C712.xml create mode 100644 src/devices/pic/xml_data/16C715.xml create mode 100644 src/devices/pic/xml_data/16C716.xml create mode 100644 src/devices/pic/xml_data/16C717.xml create mode 100644 src/devices/pic/xml_data/16C72.xml create mode 100644 src/devices/pic/xml_data/16C72A.xml create mode 100644 src/devices/pic/xml_data/16C73.xml create mode 100644 src/devices/pic/xml_data/16C73A.xml create mode 100644 src/devices/pic/xml_data/16C73B.xml create mode 100644 src/devices/pic/xml_data/16C74.xml create mode 100644 src/devices/pic/xml_data/16C745.xml create mode 100644 src/devices/pic/xml_data/16C74A.xml create mode 100644 src/devices/pic/xml_data/16C74B.xml create mode 100644 src/devices/pic/xml_data/16C76.xml create mode 100644 src/devices/pic/xml_data/16C765.xml create mode 100644 src/devices/pic/xml_data/16C77.xml create mode 100644 src/devices/pic/xml_data/16C770.xml create mode 100644 src/devices/pic/xml_data/16C771.xml create mode 100644 src/devices/pic/xml_data/16C773.xml create mode 100644 src/devices/pic/xml_data/16C774.xml create mode 100644 src/devices/pic/xml_data/16C781.xml create mode 100644 src/devices/pic/xml_data/16C782.xml create mode 100644 src/devices/pic/xml_data/16C84.xml create mode 100644 src/devices/pic/xml_data/16C923.xml create mode 100644 src/devices/pic/xml_data/16C924.xml create mode 100644 src/devices/pic/xml_data/16C925.xml create mode 100644 src/devices/pic/xml_data/16C926.xml create mode 100644 src/devices/pic/xml_data/16CE623.xml create mode 100644 src/devices/pic/xml_data/16CE624.xml create mode 100644 src/devices/pic/xml_data/16CE625.xml create mode 100644 src/devices/pic/xml_data/16CR54.xml_broken create mode 100644 src/devices/pic/xml_data/16CR54A.xml create mode 100644 src/devices/pic/xml_data/16CR54B.xml create mode 100644 src/devices/pic/xml_data/16CR54C.xml create mode 100644 src/devices/pic/xml_data/16CR56A.xml create mode 100644 src/devices/pic/xml_data/16CR57B.xml create mode 100644 src/devices/pic/xml_data/16CR57C.xml create mode 100644 src/devices/pic/xml_data/16CR58A.xml create mode 100644 src/devices/pic/xml_data/16CR58B.xml create mode 100644 src/devices/pic/xml_data/16CR62.xml create mode 100644 src/devices/pic/xml_data/16CR620A.xml create mode 100644 src/devices/pic/xml_data/16CR63.xml create mode 100644 src/devices/pic/xml_data/16CR64.xml create mode 100644 src/devices/pic/xml_data/16CR65.xml create mode 100644 src/devices/pic/xml_data/16CR72.xml create mode 100644 src/devices/pic/xml_data/16CR73.xml create mode 100644 src/devices/pic/xml_data/16CR74.xml create mode 100644 src/devices/pic/xml_data/16CR76.xml create mode 100644 src/devices/pic/xml_data/16CR77.xml create mode 100644 src/devices/pic/xml_data/16CR83.xml create mode 100644 src/devices/pic/xml_data/16CR84.xml create mode 100644 src/devices/pic/xml_data/16F505.xml create mode 100644 src/devices/pic/xml_data/16F506.xml create mode 100644 src/devices/pic/xml_data/16F54.xml create mode 100644 src/devices/pic/xml_data/16F57.xml create mode 100644 src/devices/pic/xml_data/16F59.xml create mode 100644 src/devices/pic/xml_data/16F610.xml create mode 100644 src/devices/pic/xml_data/16F616.xml create mode 100644 src/devices/pic/xml_data/16F627.xml create mode 100644 src/devices/pic/xml_data/16F627A.xml create mode 100644 src/devices/pic/xml_data/16F628.xml create mode 100644 src/devices/pic/xml_data/16F628A.xml create mode 100644 src/devices/pic/xml_data/16F630.xml create mode 100644 src/devices/pic/xml_data/16F631.xml create mode 100644 src/devices/pic/xml_data/16F636.xml create mode 100644 src/devices/pic/xml_data/16F639.xml create mode 100644 src/devices/pic/xml_data/16F648A.xml create mode 100644 src/devices/pic/xml_data/16F676.xml create mode 100644 src/devices/pic/xml_data/16F677.xml create mode 100644 src/devices/pic/xml_data/16F684.xml create mode 100644 src/devices/pic/xml_data/16F685.xml create mode 100644 src/devices/pic/xml_data/16F687.xml create mode 100644 src/devices/pic/xml_data/16F688.xml create mode 100644 src/devices/pic/xml_data/16F689.xml create mode 100644 src/devices/pic/xml_data/16F690.xml create mode 100644 src/devices/pic/xml_data/16F716.xml create mode 100644 src/devices/pic/xml_data/16F72.xml create mode 100644 src/devices/pic/xml_data/16F73.xml create mode 100644 src/devices/pic/xml_data/16F737.xml create mode 100644 src/devices/pic/xml_data/16F74.xml create mode 100644 src/devices/pic/xml_data/16F747.xml create mode 100644 src/devices/pic/xml_data/16F76.xml create mode 100644 src/devices/pic/xml_data/16F767.xml create mode 100644 src/devices/pic/xml_data/16F77.xml create mode 100644 src/devices/pic/xml_data/16F777.xml create mode 100644 src/devices/pic/xml_data/16F785.xml create mode 100644 src/devices/pic/xml_data/16F818.xml create mode 100644 src/devices/pic/xml_data/16F819.xml create mode 100644 src/devices/pic/xml_data/16F83.xml create mode 100644 src/devices/pic/xml_data/16F84.xml create mode 100644 src/devices/pic/xml_data/16F84A.xml create mode 100644 src/devices/pic/xml_data/16F87.xml create mode 100644 src/devices/pic/xml_data/16F870.xml create mode 100644 src/devices/pic/xml_data/16F871.xml create mode 100644 src/devices/pic/xml_data/16F872.xml create mode 100644 src/devices/pic/xml_data/16F873.xml create mode 100644 src/devices/pic/xml_data/16F873A.xml create mode 100644 src/devices/pic/xml_data/16F874.xml create mode 100644 src/devices/pic/xml_data/16F874A.xml create mode 100644 src/devices/pic/xml_data/16F876.xml create mode 100644 src/devices/pic/xml_data/16F876A.xml create mode 100644 src/devices/pic/xml_data/16F877.xml create mode 100644 src/devices/pic/xml_data/16F877A.xml create mode 100644 src/devices/pic/xml_data/16F88.xml create mode 100644 src/devices/pic/xml_data/16F882.xml create mode 100644 src/devices/pic/xml_data/16F883.xml create mode 100644 src/devices/pic/xml_data/16F884.xml create mode 100644 src/devices/pic/xml_data/16F886.xml create mode 100644 src/devices/pic/xml_data/16F887.xml create mode 100644 src/devices/pic/xml_data/16F913.xml create mode 100644 src/devices/pic/xml_data/16F914.xml create mode 100644 src/devices/pic/xml_data/16F916.xml create mode 100644 src/devices/pic/xml_data/16F917.xml create mode 100644 src/devices/pic/xml_data/16F946.xml create mode 100644 src/devices/pic/xml_data/16HV540.xml create mode 100644 src/devices/pic/xml_data/17C42.xml create mode 100644 src/devices/pic/xml_data/17C42A.xml create mode 100644 src/devices/pic/xml_data/17C43.xml create mode 100644 src/devices/pic/xml_data/17C44.xml create mode 100644 src/devices/pic/xml_data/17C752.xml create mode 100644 src/devices/pic/xml_data/17C756.xml create mode 100644 src/devices/pic/xml_data/17C756A.xml create mode 100644 src/devices/pic/xml_data/17C762.xml create mode 100644 src/devices/pic/xml_data/17C766.xml create mode 100644 src/devices/pic/xml_data/17CR42.xml create mode 100644 src/devices/pic/xml_data/17CR43.xml create mode 100644 src/devices/pic/xml_data/18C242.xml create mode 100644 src/devices/pic/xml_data/18C252.xml create mode 100644 src/devices/pic/xml_data/18C442.xml create mode 100644 src/devices/pic/xml_data/18C452.xml create mode 100644 src/devices/pic/xml_data/18C601.xml create mode 100644 src/devices/pic/xml_data/18C658.xml create mode 100644 src/devices/pic/xml_data/18C801.xml create mode 100644 src/devices/pic/xml_data/18C858.xml create mode 100644 src/devices/pic/xml_data/18F1220.xml create mode 100644 src/devices/pic/xml_data/18F1230.xml create mode 100644 src/devices/pic/xml_data/18F1320.xml create mode 100644 src/devices/pic/xml_data/18F1330.xml create mode 100644 src/devices/pic/xml_data/18F2220.xml create mode 100644 src/devices/pic/xml_data/18F2221.xml create mode 100644 src/devices/pic/xml_data/18F2320.xml create mode 100644 src/devices/pic/xml_data/18F2321.xml create mode 100644 src/devices/pic/xml_data/18F2331.xml create mode 100644 src/devices/pic/xml_data/18F2410.xml create mode 100644 src/devices/pic/xml_data/18F242.xml create mode 100644 src/devices/pic/xml_data/18F2420.xml create mode 100644 src/devices/pic/xml_data/18F2423.xml create mode 100644 src/devices/pic/xml_data/18F2431.xml create mode 100644 src/devices/pic/xml_data/18F2439.xml create mode 100644 src/devices/pic/xml_data/18F2450.xml create mode 100644 src/devices/pic/xml_data/18F2455.xml create mode 100644 src/devices/pic/xml_data/18F248.xml create mode 100644 src/devices/pic/xml_data/18F2480.xml create mode 100644 src/devices/pic/xml_data/18F24J10.xml create mode 100644 src/devices/pic/xml_data/18F2510.xml create mode 100644 src/devices/pic/xml_data/18F2515.xml create mode 100644 src/devices/pic/xml_data/18F252.xml create mode 100644 src/devices/pic/xml_data/18F2520.xml create mode 100644 src/devices/pic/xml_data/18F2523.xml create mode 100644 src/devices/pic/xml_data/18F2525.xml create mode 100644 src/devices/pic/xml_data/18F2539.xml create mode 100644 src/devices/pic/xml_data/18F2550.xml create mode 100644 src/devices/pic/xml_data/18F258.xml create mode 100644 src/devices/pic/xml_data/18F2580.xml create mode 100644 src/devices/pic/xml_data/18F2585.xml create mode 100644 src/devices/pic/xml_data/18F25J10.xml create mode 100644 src/devices/pic/xml_data/18F2610.xml create mode 100644 src/devices/pic/xml_data/18F2620.xml create mode 100644 src/devices/pic/xml_data/18F2680.xml create mode 100644 src/devices/pic/xml_data/18F2682.xml create mode 100644 src/devices/pic/xml_data/18F2685.xml create mode 100644 src/devices/pic/xml_data/18F4220.xml create mode 100644 src/devices/pic/xml_data/18F4221.xml create mode 100644 src/devices/pic/xml_data/18F4320.xml create mode 100644 src/devices/pic/xml_data/18F4321.xml create mode 100644 src/devices/pic/xml_data/18F4331.xml create mode 100644 src/devices/pic/xml_data/18F4410.xml create mode 100644 src/devices/pic/xml_data/18F442.xml create mode 100644 src/devices/pic/xml_data/18F4420.xml create mode 100644 src/devices/pic/xml_data/18F4423.xml create mode 100644 src/devices/pic/xml_data/18F4431.xml create mode 100644 src/devices/pic/xml_data/18F4439.xml create mode 100644 src/devices/pic/xml_data/18F4450.xml create mode 100644 src/devices/pic/xml_data/18F4455.xml create mode 100644 src/devices/pic/xml_data/18F448.xml create mode 100644 src/devices/pic/xml_data/18F4480.xml create mode 100644 src/devices/pic/xml_data/18F44J10.xml create mode 100644 src/devices/pic/xml_data/18F4510.xml create mode 100644 src/devices/pic/xml_data/18F4515.xml create mode 100644 src/devices/pic/xml_data/18F452.xml create mode 100644 src/devices/pic/xml_data/18F4520.xml create mode 100644 src/devices/pic/xml_data/18F4523.xml create mode 100644 src/devices/pic/xml_data/18F4525.xml create mode 100644 src/devices/pic/xml_data/18F4539.xml create mode 100644 src/devices/pic/xml_data/18F4550.xml create mode 100644 src/devices/pic/xml_data/18F458.xml create mode 100644 src/devices/pic/xml_data/18F4580.xml create mode 100644 src/devices/pic/xml_data/18F4585.xml create mode 100644 src/devices/pic/xml_data/18F45J10.xml create mode 100644 src/devices/pic/xml_data/18F4610.xml create mode 100644 src/devices/pic/xml_data/18F4620.xml create mode 100644 src/devices/pic/xml_data/18F4680.xml create mode 100644 src/devices/pic/xml_data/18F4682.xml create mode 100644 src/devices/pic/xml_data/18F4685.xml create mode 100644 src/devices/pic/xml_data/18F6310.xml create mode 100644 src/devices/pic/xml_data/18F6390.xml create mode 100644 src/devices/pic/xml_data/18F6393.xml create mode 100644 src/devices/pic/xml_data/18F63J11.xml create mode 100644 src/devices/pic/xml_data/18F63J90.xml create mode 100644 src/devices/pic/xml_data/18F6410.xml create mode 100644 src/devices/pic/xml_data/18F6490.xml create mode 100644 src/devices/pic/xml_data/18F6493.xml create mode 100644 src/devices/pic/xml_data/18F64J11.xml create mode 100644 src/devices/pic/xml_data/18F64J90.xml create mode 100644 src/devices/pic/xml_data/18F6520.xml create mode 100644 src/devices/pic/xml_data/18F6525.xml create mode 100644 src/devices/pic/xml_data/18F6527.xml create mode 100644 src/devices/pic/xml_data/18F6585.xml create mode 100644 src/devices/pic/xml_data/18F65J10.xml create mode 100644 src/devices/pic/xml_data/18F65J11.xml create mode 100644 src/devices/pic/xml_data/18F65J15.xml create mode 100644 src/devices/pic/xml_data/18F65J50.xml create mode 100644 src/devices/pic/xml_data/18F65J90.xml create mode 100644 src/devices/pic/xml_data/18F6620.xml create mode 100644 src/devices/pic/xml_data/18F6621.xml create mode 100644 src/devices/pic/xml_data/18F6622.xml create mode 100644 src/devices/pic/xml_data/18F6627.xml create mode 100644 src/devices/pic/xml_data/18F6680.xml create mode 100644 src/devices/pic/xml_data/18F66J10.xml create mode 100644 src/devices/pic/xml_data/18F66J11.xml create mode 100644 src/devices/pic/xml_data/18F66J15.xml create mode 100644 src/devices/pic/xml_data/18F66J16.xml create mode 100644 src/devices/pic/xml_data/18F66J50.xml create mode 100644 src/devices/pic/xml_data/18F66J55.xml create mode 100644 src/devices/pic/xml_data/18F66J60.xml create mode 100644 src/devices/pic/xml_data/18F66J65.xml create mode 100644 src/devices/pic/xml_data/18F6720.xml create mode 100644 src/devices/pic/xml_data/18F6722.xml create mode 100644 src/devices/pic/xml_data/18F67J10.xml create mode 100644 src/devices/pic/xml_data/18F67J11.xml create mode 100644 src/devices/pic/xml_data/18F67J50.xml create mode 100644 src/devices/pic/xml_data/18F67J60.xml create mode 100644 src/devices/pic/xml_data/18F8310.xml create mode 100644 src/devices/pic/xml_data/18F8390.xml create mode 100644 src/devices/pic/xml_data/18F8393.xml create mode 100644 src/devices/pic/xml_data/18F83J11.xml create mode 100644 src/devices/pic/xml_data/18F83J90.xml create mode 100644 src/devices/pic/xml_data/18F8410.xml create mode 100644 src/devices/pic/xml_data/18F8490.xml create mode 100644 src/devices/pic/xml_data/18F8493.xml create mode 100644 src/devices/pic/xml_data/18F84J11.xml create mode 100644 src/devices/pic/xml_data/18F84J90.xml create mode 100644 src/devices/pic/xml_data/18F8520.xml create mode 100644 src/devices/pic/xml_data/18F8525.xml create mode 100644 src/devices/pic/xml_data/18F8527.xml create mode 100644 src/devices/pic/xml_data/18F8585.xml create mode 100644 src/devices/pic/xml_data/18F85J10.xml create mode 100644 src/devices/pic/xml_data/18F85J11.xml create mode 100644 src/devices/pic/xml_data/18F85J15.xml create mode 100644 src/devices/pic/xml_data/18F85J50.xml create mode 100644 src/devices/pic/xml_data/18F85J90.xml create mode 100644 src/devices/pic/xml_data/18F8620.xml create mode 100644 src/devices/pic/xml_data/18F8621.xml create mode 100644 src/devices/pic/xml_data/18F8622.xml create mode 100644 src/devices/pic/xml_data/18F8627.xml create mode 100644 src/devices/pic/xml_data/18F8680.xml create mode 100644 src/devices/pic/xml_data/18F86J10.xml create mode 100644 src/devices/pic/xml_data/18F86J11.xml create mode 100644 src/devices/pic/xml_data/18F86J15.xml create mode 100644 src/devices/pic/xml_data/18F86J16.xml create mode 100644 src/devices/pic/xml_data/18F86J50.xml create mode 100644 src/devices/pic/xml_data/18F86J55.xml create mode 100644 src/devices/pic/xml_data/18F86J60.xml create mode 100644 src/devices/pic/xml_data/18F86J65.xml create mode 100644 src/devices/pic/xml_data/18F8720.xml create mode 100644 src/devices/pic/xml_data/18F8722.xml create mode 100644 src/devices/pic/xml_data/18F87J10.xml create mode 100644 src/devices/pic/xml_data/18F87J11.xml create mode 100644 src/devices/pic/xml_data/18F87J50.xml create mode 100644 src/devices/pic/xml_data/18F87J60.xml create mode 100644 src/devices/pic/xml_data/18F96J60.xml create mode 100644 src/devices/pic/xml_data/18F96J65.xml create mode 100644 src/devices/pic/xml_data/18F97J60.xml create mode 100644 src/devices/pic/xml_data/24FJ128GA006.xml create mode 100644 src/devices/pic/xml_data/24FJ128GA008.xml create mode 100644 src/devices/pic/xml_data/24FJ128GA010.xml create mode 100644 src/devices/pic/xml_data/24FJ64GA002.xml create mode 100644 src/devices/pic/xml_data/24FJ64GA004.xml create mode 100644 src/devices/pic/xml_data/24FJ64GA006.xml create mode 100644 src/devices/pic/xml_data/24FJ64GA008.xml create mode 100644 src/devices/pic/xml_data/24FJ64GA010.xml create mode 100644 src/devices/pic/xml_data/24FJ96GA006.xml create mode 100644 src/devices/pic/xml_data/24FJ96GA008.xml create mode 100644 src/devices/pic/xml_data/24FJ96GA010.xml create mode 100644 src/devices/pic/xml_data/24HJ128GP206.xml create mode 100644 src/devices/pic/xml_data/24HJ128GP210.xml create mode 100644 src/devices/pic/xml_data/24HJ128GP306.xml create mode 100644 src/devices/pic/xml_data/24HJ128GP310.xml create mode 100644 src/devices/pic/xml_data/24HJ128GP506.xml create mode 100644 src/devices/pic/xml_data/24HJ128GP510.xml create mode 100644 src/devices/pic/xml_data/24HJ12GP201.xml create mode 100644 src/devices/pic/xml_data/24HJ12GP202.xml create mode 100644 src/devices/pic/xml_data/24HJ16GP304.xml create mode 100644 src/devices/pic/xml_data/24HJ256GP206.xml create mode 100644 src/devices/pic/xml_data/24HJ256GP210.xml create mode 100644 src/devices/pic/xml_data/24HJ256GP610.xml create mode 100644 src/devices/pic/xml_data/24HJ32GP202.xml create mode 100644 src/devices/pic/xml_data/24HJ32GP204.xml create mode 100644 src/devices/pic/xml_data/24HJ64GP206.xml create mode 100644 src/devices/pic/xml_data/24HJ64GP210.xml create mode 100644 src/devices/pic/xml_data/24HJ64GP506.xml create mode 100644 src/devices/pic/xml_data/24HJ64GP510.xml create mode 100644 src/devices/pic/xml_data/30F1010.xml create mode 100644 src/devices/pic/xml_data/30F2010.xml create mode 100644 src/devices/pic/xml_data/30F2011.xml create mode 100644 src/devices/pic/xml_data/30F2012.xml create mode 100644 src/devices/pic/xml_data/30F2020.xml create mode 100644 src/devices/pic/xml_data/30F2023.xml create mode 100644 src/devices/pic/xml_data/30F3010.xml create mode 100644 src/devices/pic/xml_data/30F3011.xml create mode 100644 src/devices/pic/xml_data/30F3012.xml create mode 100644 src/devices/pic/xml_data/30F3013.xml create mode 100644 src/devices/pic/xml_data/30F3014.xml create mode 100644 src/devices/pic/xml_data/30F4011.xml create mode 100644 src/devices/pic/xml_data/30F4012.xml create mode 100644 src/devices/pic/xml_data/30F4013.xml create mode 100644 src/devices/pic/xml_data/30F5011.xml create mode 100644 src/devices/pic/xml_data/30F5013.xml create mode 100644 src/devices/pic/xml_data/30F5015.xml create mode 100644 src/devices/pic/xml_data/30F5016.xml create mode 100644 src/devices/pic/xml_data/30F6010.xml create mode 100644 src/devices/pic/xml_data/30F6010A.xml create mode 100644 src/devices/pic/xml_data/30F6011.xml create mode 100644 src/devices/pic/xml_data/30F6011A.xml create mode 100644 src/devices/pic/xml_data/30F6012.xml create mode 100644 src/devices/pic/xml_data/30F6012A.xml create mode 100644 src/devices/pic/xml_data/30F6013.xml create mode 100644 src/devices/pic/xml_data/30F6013A.xml create mode 100644 src/devices/pic/xml_data/30F6014.xml create mode 100644 src/devices/pic/xml_data/30F6014A.xml create mode 100644 src/devices/pic/xml_data/30F6015.xml create mode 100644 src/devices/pic/xml_data/Makefile.am create mode 100644 src/devices/pic/xml_data/deps.mak create mode 100644 src/devices/pic/xml_data/pic.xsd create mode 100644 src/devices/pic/xml_data/registers/registers.xml create mode 100644 src/devices/pic/xml_data/registers/registers_missing.xml create mode 100755 src/devices/pic/xml_data/validate.sh create mode 100644 src/devices/pic/xml_data/validate/Makefile create mode 100644 src/devices/pic/xml_data/validate/validate.cpp create mode 100644 src/devices/pic/xml_data/xml_data.pro (limited to 'src/devices') diff --git a/src/devices/Makefile.am b/src/devices/Makefile.am new file mode 100644 index 0000000..00ec7c1 --- /dev/null +++ b/src/devices/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = base gui pic mem24 list diff --git a/src/devices/base/Makefile.am b/src/devices/base/Makefile.am new file mode 100644 index 0000000..836da68 --- /dev/null +++ b/src/devices/base/Makefile.am @@ -0,0 +1,9 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_LTLIBRARIES = libdevicebase.la +libdevicebase_la_LDFLAGS = $(all_libraries) +libdevicebase_la_SOURCES = generic_device.cpp hex_buffer.cpp generic_memory.cpp \ + register.cpp device_group.cpp + + diff --git a/src/devices/base/base.pro b/src/devices/base/base.pro new file mode 100644 index 0000000..f74efc6 --- /dev/null +++ b/src/devices/base/base.pro @@ -0,0 +1,6 @@ +STOPDIR = ../../.. +include($${STOPDIR}/lib.pro) + +TARGET = devicebase +HEADERS += generic_device.h hex_buffer.h generic_memory.h device_group.h register.h +SOURCES += generic_device.cpp hex_buffer.cpp generic_memory.cpp register.cpp diff --git a/src/devices/base/device_group.cpp b/src/devices/base/device_group.cpp new file mode 100644 index 0000000..df230d1 --- /dev/null +++ b/src/devices/base/device_group.cpp @@ -0,0 +1,362 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "device_group.h" + +#if !defined(NO_KDE) +# include +# include + +QColor Device::statusColor(Status status) +{ + switch (status.type()) { + case Status::Future: return Qt::blue; + case Status::InProduction: return Qt::green; + case Status::Mature: + case Status::NotRecommended: return QColor("orange"); + case Status::EOL: return Qt::red; + case Status::Unknown: + case Status::Nb_Types: break; + } + return Qt::black; +} + +QString coloredString(const QString &text, QColor color) +{ + return QString("" + text + ""; +} + +QString supportedString(bool supported) +{ + return coloredString(supported ? i18n("Supported") : i18n("Unsupported"), + supported ? Qt::green : Qt::red); +} + +class Tick { +public: + Tick() {} + Tick(double value, double oValue) { + s = KGlobal::locale()->formatNumber(value, 1); + min = oValue; + } + QString s; + double min; +}; + +class TickMap : public QMap +{ +public: + TickMap() {} + void add(double value, double oValue) { + insert(value, Tick(value, oValue), false); + (*this)[value].min = QMIN((*this)[value].min, oValue); + } +}; + +QPixmap drawGraph(const QValueVector &boxes) +{ + const uint w = 300, h = 200; + QPixmap pixmap(w, h); + pixmap.fill(Qt::white); + QPainter p(&pixmap); + QFontMetrics f(p.font()); + TickMap xTicks, yTicks; + xTicks.add(0.0, 0.0); + yTicks.add(0.0, 0.0); + for (uint i=0; i &boxes) +{ + uint sp = 10; + QPixmap graph = drawGraph(boxes); + QPainter p; + QFontMetrics f(p.font()); + QPixmap pixmap(graph.width() + sp + f.width(xLabel), graph.height() + sp + f.lineSpacing()); + pixmap.fill(Qt::white); + copyBlt(&pixmap, 0, f.lineSpacing() + sp, &graph, 0, 0, graph.width(), graph.height()); + p.begin(&pixmap); + p.setPen(Qt::black); + p.drawText(0, f.lineSpacing(), yLabel); + p.drawText(pixmap.width()-1-f.width(xLabel), pixmap.height()-1, xLabel); + return pixmap; +} + +const Device::Package *Device::barPackage(const char *name, const Device::Data &data) +{ + for (uint i=0; i%2").arg(href).arg(data.alternatives()[i].upper()); + } + } + doc += htmlTableRow(i18n("Alternatives"), s); + } + doc += documentHtml; + doc += ""; + + doc += "
"; + doc += ""; + doc += data.group().informationHtml(data); + QString s; + for (uint i=0; i
"; + for (uint k=0; ktypes.count(); k++) { + if ( k!=0 ) doc += " "; + doc += i18n(Package::TYPE_DATA[package->types[k]].label); + doc += "(" + QString::number(package->pins.count()) + ")"; + } + doc += "
"; + QString label = data.name() + "_pins_graph.png"; + doc += ""; + if (msf) msf->setPixmap(label, pix); + doc += "
"; + } + return doc; +} + +QString Device::htmlVoltageFrequencyGraphs(const Device::Data &data, const QString &imagePrefix, QMimeSourceFactory *msf) +{ + QString doc; + FOR_EACH(Special, special) { + for (uint k=0; k"; + QString label = data.name() + "_" + data.fname(special) + "_" + + fr.operatingCondition.key() + ".png"; + doc += ""; + if (msf) msf->setPixmap(label, Device::vddGraph(i18n("F (MHz)"), i18n("Vdd (V)"), fr.vdds)); + } + } + return doc; +} + +QPixmap Device::memoryGraph(const QValueList &r) +{ + QValueList ranges = r; + QPixmap pixmap; + QPainter p; + QFontMetrics fm(p.font()); + // order + qHeapSort(ranges); + // add empty ranges + QValueList::iterator it; + for (it=ranges.begin(); it!=ranges.end(); ) { + QValueList::iterator prev = it; + ++it; + if ( it==ranges.end() ) break; + if ( (*prev).endAddress+1==(*it).startAddress ) continue; + MemoryGraphData data; + data.startAddress = (*prev).endAddress + 1; + data.endAddress = (*it).startAddress-1; + ranges.insert(it, data); + } + // compute widths and total height + int theight = fm.ascent() + (fm.ascent()%2==0 ? 1 : 0); + int hspacing = 5; + int height = 1; + int w1 = 0, w2 = 0; + for (it=ranges.begin(); it!=ranges.end(); ++it) { + w1 = QMAX(w1, fm.width((*it).start)); + w1 = QMAX(w1, fm.width((*it).end)); + w2 = QMAX(w2, fm.width((*it).label)); + (*it).height = 2*hspacing + theight; + if ( (*it).startAddress!=(*it).endAddress ) (*it).height += 2*theight; + height += (*it).height; + } + int wspacing = 4; + int width = wspacing + w1 + wspacing + wspacing + w2; + pixmap.resize(width, height); + pixmap.fill(Qt::white); + p.begin(&pixmap); + int h = 0; + // draw ranges + for (it=ranges.begin(); it!=ranges.end(); ++it) { + p.setPen(QPen(Qt::black, 1, Qt::DotLine)); + p.drawLine(0,h, width-1,h); + p.setPen(QPen(Qt::black, 1)); + p.setBrush((*it).label.isEmpty() ? Qt::gray : Qt::white); + p.drawRect(0,h, wspacing+w1+wspacing,(*it).height+1); + int hmid = h+(*it).height/2+theight/2; + p.drawText(wspacing+w1+wspacing+wspacing,hmid, (*it).label); + if ( (*it).startAddress==(*it).endAddress ) p.drawText(wspacing,hmid, (*it).start); + else { + p.drawText(wspacing,h+theight, (*it).start); + p.drawText(wspacing,h+(*it).height-3, (*it).end); + } + h += (*it).height; + p.setPen(QPen(Qt::black, 1, Qt::DotLine)); + p.drawLine(0,h, width-1,h); + } + p.end(); + return pixmap; +} + +#endif diff --git a/src/devices/base/device_group.h b/src/devices/base/device_group.h new file mode 100644 index 0000000..087ca99 --- /dev/null +++ b/src/devices/base/device_group.h @@ -0,0 +1,87 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef DEVICE_GROUP_H +#define DEVICE_GROUP_H + +#if !defined(NO_KDE) +# include +#endif + +#include "generic_device.h" +#include "common/common/group.h" +#include "common/common/streamer.h" +namespace Debugger { class DeviceSpecific; class Base; } + +namespace Device +{ +class Memory; + +//---------------------------------------------------------------------------- +class MemoryRange { +public: + MemoryRange() {} + virtual ~MemoryRange() {} + virtual bool all() const { return true; } +}; + +//---------------------------------------------------------------------------- +class GroupBase : public ::Group::Base +{ +public: + virtual Memory *createMemory(const Device::Data &data) const = 0; + virtual QString informationHtml(const Device::Data &data) const = 0; +#if !defined(NO_KDE) + virtual QPixmap memoryGraph(const Device::Data &data) const = 0; +#endif + +protected: + virtual void addDevice(const QString &name, const Device::Data *data, ::Group::Support support) { + const_cast(data)->_group = this; + ::Group::Base::addDevice(name, data, support); + } +}; + +template +class Group : public GroupBase, public DataStreamer +{ +protected: + virtual void initSupported() { + QValueList list = fromCppString(dataStream(), dataSize()); + for (uint i=0; iname(), list[i], ::Group::Support::Tested); + } + virtual uint dataSize() const = 0; + virtual const char *dataStream() const = 0; +}; + +//---------------------------------------------------------------------------- +#if !defined(NO_KDE) +extern QColor statusColor(Status status); +extern QPixmap vddGraph(const QString &xLabel, const QString &yLabel, const QValueVector &boxes); +extern const Package *barPackage(const char *name, const Data &data); +extern QPixmap pinsGraph(const Package &package); + +extern QString htmlInfo(const Data &data, const QString &deviceHref, const QString &documentHtml); +extern QString htmlPinDiagrams(const Device::Data &data, const QString &imagePrefix, QMimeSourceFactory *msf); +extern QString htmlVoltageFrequencyGraphs(const Device::Data &data, const QString &imagePrefix, QMimeSourceFactory *msf); + +class MemoryGraphData +{ +public: + Address startAddress, endAddress; + QString start, end, label; + int height; + bool operator <(const MemoryGraphData &data) const { return ( startAddress < data.startAddress ); } +}; +extern QPixmap memoryGraph(const QValueList &ranges); + +#endif + +} // namespace + +#endif diff --git a/src/devices/base/generic_device.cpp b/src/devices/base/generic_device.cpp new file mode 100644 index 0000000..bf69dce --- /dev/null +++ b/src/devices/base/generic_device.cpp @@ -0,0 +1,216 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "generic_device.h" + +#include "common/global/global.h" +#include "device_group.h" +#include "register.h" + +//----------------------------------------------------------------------------- +const Device::Status::Data Device::Status::DATA[Nb_Types] = { + { "IP", I18N_NOOP("In Production") }, + { "Future", I18N_NOOP("Future Product") }, + { "NR", I18N_NOOP("Not Recommended for New Design") }, + { "EOL", I18N_NOOP("End Of Life" ) }, + { "?", I18N_NOOP("Unknown") }, + { "Mature", I18N_NOOP("Mature") } +}; + +const Device::MemoryTechnology::Data Device::MemoryTechnology::DATA[Nb_Types] = { + { "FLASH", I18N_NOOP("Flash") }, + { "EPROM", I18N_NOOP("EPROM (OTP)") }, + { "ROM", I18N_NOOP("ROM") }, + { "ROMLESS", I18N_NOOP("ROM-less") } +}; + +const Device::OperatingCondition::Data Device::OperatingCondition::DATA[Nb_Types] = { + { "commercial", I18N_NOOP("Commercial") }, + { "industrial", I18N_NOOP("Industrial") }, + { "extended", I18N_NOOP("Extended") } +}; + +const Device::Special::Data Device::Special::DATA[Nb_Types] = { + { "", I18N_NOOP("Normal") }, + { "low_power", I18N_NOOP("Low Power") }, + { "low_voltage", I18N_NOOP("Low Voltage") }, + { "high_voltage", I18N_NOOP("High Voltage") } +}; + +const Device::Package::TypeData Device::Package::TYPE_DATA[] = { + { "pdip", I18N_NOOP("PDIP"), Bar, { 8, 14, 18, 20, 28, 40, 0, 0, 0 } }, + { "sdip", I18N_NOOP("SDIP"), Bar, { 0, 0, 0, 0, 28, 0, 0, 0, 0 } }, // skinny + { "spdip", I18N_NOOP("SPDIP"), Bar, { 0, 0, 0, 0, 28, 0, 64, 0, 0 } }, // shrink + { "sot23", I18N_NOOP("SOT-23"), Bar, { 5, 6, 0, 0, 0, 0, 0, 0, 0 } }, + { "msop", I18N_NOOP("MSOP"), Bar, { 8, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { "ssop", I18N_NOOP("SSOP"), Bar, { 0, 0, 0, 20, 28, 0, 0, 0, 0 } }, + { "tssop", I18N_NOOP("TSSOP"), Bar, { 8, 14, 0, 0, 0, 0, 0, 0, 0 } }, + { "soic", I18N_NOOP("SOIC"), Bar, { 8, 14, 18, 20, 28, 0, 0, 0, 0 } }, + { "tqfp", I18N_NOOP("TQFP"), Square, { 0, 0, 0, 0, 0, 44, 64, 80, 100 } }, + { "mqfp", I18N_NOOP("MQFP"), Square, { 0, 0, 0, 0, 0, 44, 0, 0, 0 } }, + { "dfns", I18N_NOOP("DFN-S"), Bar, { 8, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { "qfn", I18N_NOOP("QFN"), Square, { 0, 16, 0, 20, 28, 44, 0, 0, 0 } }, + { "qfns", I18N_NOOP("QFN-S"), Bar, { 0, 0, 0, 0, 28, 0, 0, 0, 0 } }, + { "plcc", I18N_NOOP("PLCC"), Square, { 0, 0, 0, 0, 0, 44, 68, 84, 0 } }, + { "mlf", I18N_NOOP("MLF"), Square, { 0, 0, 0, 0, 28, 0, 0, 0, 0 } }, + { "dfn", I18N_NOOP("DFN"), Bar, { 8, 0, 0, 0, 0, 0, 0, 0, 0 } }, + { 0, 0, Square, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } } +}; + +//----------------------------------------------------------------------------- +double Device::FrequencyRange::vddMin() const +{ + double vdd = 0.0; + for (uint i=0; i=-1 ); + Array array(s==-1 ? size()-index : s); + for (uint i=0; i>(QDataStream &s, RangeBox::Value &rbv) +{ + s >> rbv.x >> rbv.yMin >> rbv.yMax; + return s; +} + +QDataStream &Device::operator <<(QDataStream &s, const RangeBox &rb) +{ + s << rb.start << rb.end << rb.osc << rb.mode << rb.special; + return s; +} +QDataStream &Device::operator >>(QDataStream &s, RangeBox &rb) +{ + s >> rb.start >> rb.end >> rb.osc >> rb.mode >> rb.special; + return s; +} + +QDataStream &Device::operator <<(QDataStream &s, const FrequencyRange &frange) +{ + s << frange.operatingCondition << frange.special << frange.vdds; + return s; +} +QDataStream &Device::operator >>(QDataStream &s, FrequencyRange &frange) +{ + s >> frange.operatingCondition >> frange.special >> frange.vdds; + return s; +} + +QDataStream &Device::operator <<(QDataStream &s, const Package &package) +{ + s << package.types << package.pins; + return s; +} +QDataStream &Device::operator >>(QDataStream &s, Package &package) +{ + s >> package.types >> package.pins; + return s; +} + +QDataStream &Device::operator <<(QDataStream &s, const Documents &documents) +{ + s << documents.webpage << documents.datasheet << documents.progsheet << documents.erratas; + return s; +} +QDataStream &Device::operator >>(QDataStream &s, Documents &documents) +{ + s >> documents.webpage >> documents.datasheet >> documents.progsheet >> documents.erratas; + return s; +} + +QDataStream &Device::operator <<(QDataStream &s, const Data &data) +{ + s << data._name << data._documents << data._alternatives << data._status + << data._frequencyRanges << data._memoryTechnology + << data._packages; + return s; +} +QDataStream &Device::operator >>(QDataStream &s, Data &data) +{ + s >> data._name >> data._documents >> data._alternatives >> data._status + >> data._frequencyRanges >> data._memoryTechnology + >> data._packages; + return s; +} diff --git a/src/devices/base/generic_device.h b/src/devices/base/generic_device.h new file mode 100644 index 0000000..e3cbec9 --- /dev/null +++ b/src/devices/base/generic_device.h @@ -0,0 +1,171 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef GENERIC_DEVICE_H +#define GENERIC_DEVICE_H + +#include + +#include "common/common/misc.h" +#include "common/common/bitvalue.h" +#include "common/common/key_enum.h" +#include "common/global/global.h" + +namespace Device +{ +//---------------------------------------------------------------------------- +BEGIN_DECLARE_ENUM(Status) + InProduction = 0, Future, NotRecommended, EOL, Unknown, Mature +END_DECLARE_ENUM_STD(Status) + +BEGIN_DECLARE_ENUM(MemoryTechnology) + Flash = 0, Eprom, Rom, Romless +END_DECLARE_ENUM_STD(MemoryTechnology) + +class RangeBox { +public: + struct Value { double x, yMin, yMax; }; + Value start, end; + QString osc, mode, special; + double yMin() const { return qMin(start.yMin, end.yMin); } + double yMax() const { return qMax(start.yMax, end.yMax); } +}; + +BEGIN_DECLARE_ENUM(OperatingCondition) + Commercial = 0, Industrial, Extended +END_DECLARE_ENUM_STD(OperatingCondition) + +BEGIN_DECLARE_ENUM(Special) + Normal = 0, LowPower, LowVoltage, HighVoltage +END_DECLARE_ENUM_STD(Special) + +class FrequencyRange { +public: + OperatingCondition operatingCondition; + Special special; + QValueVector vdds; + double vddMin() const; + double vddMax() const; +}; + +class IdData { +public: + BitValue revision, minorRevision, process; + Special special; +}; + +class Package +{ +public: + QValueVector types; + QValueVector pins; + +public: + enum Shape { Bar, Square }; + enum { MAX_NB = 9 }; + struct TypeData { + const char *name, *label; + Shape shape; + uint nbPins[MAX_NB]; + }; + static const TypeData TYPE_DATA[]; +}; + +class Documents +{ +public: + QString webpage, datasheet, progsheet; + QStringList erratas; +}; + +//---------------------------------------------------------------------------- +class XmlToDataBase; +class GroupBase; +class RegistersData; + +//---------------------------------------------------------------------------- +// we don't want implicit sharing +class Array +{ +public: + Array(uint size = 0) : _data(size) {} + Array(const Array &array); + Array &operator =(const Array &); + Array &operator +=(const Array &a); + void append(uint v); + Array mid(uint index, int size = -1) const; + void resize(uint s) { _data.resize(s); } + uint size() const { return _data.size(); } + uint count() const { return _data.size(); } + BitValue operator [](uint i) const { return _data[i]; } + BitValue &operator [](uint i) { return _data[i]; } + bool operator ==(const Array &array) const { return _data==array._data; } + bool operator !=(const Array &array) const { return _data!=array._data; } + +private: + QMemArray _data; +}; + +//---------------------------------------------------------------------------- +class Data +{ +public: + Data(RegistersData *rdata) : _group(0), _registersData(rdata) {} + virtual ~Data(); + const GroupBase &group() const { return *_group; } + virtual QString name() const { return _name; } + virtual QString fname(Special) const { return _name; } + virtual QString listViewGroup() const = 0; + Status status() const { return _status; } + const Documents &documents() const { return _documents; } + const QStringList &alternatives() const { return _alternatives; } + MemoryTechnology memoryTechnology() const { return _memoryTechnology; } + virtual bool matchId(BitValue rawId, IdData &idata) const = 0; + const QValueVector &frequencyRanges() const { return _frequencyRanges; } + double vddMin() const; + double vddMax() const; + virtual uint nbBitsAddress() const = 0; + uint nbBytesAddress() const { return nbBitsAddress()/8 + (nbBitsAddress()%8 ? 1 : 0); } + uint nbCharsAddress() const { return nbBitsAddress()/4 + (nbBitsAddress()%4 ? 1 : 0); } + virtual bool canWriteCalibration() const = 0; // #### REMOVE ME + const RegistersData *registersData() const { return _registersData; } + const QValueVector &packages() const { return _packages; } + +protected: + const GroupBase *_group; + QString _name; + Documents _documents; + QStringList _alternatives; + Status _status; + QValueVector _frequencyRanges; + MemoryTechnology _memoryTechnology; + RegistersData *_registersData; + QValueVector _packages; + + friend class XmlToDataBase; + friend class GroupBase; + friend QDataStream &operator <<(QDataStream &s, const Data &data); + friend QDataStream &operator >>(QDataStream &s, Data &data); +}; + +QDataStream &operator <<(QDataStream &s, const RangeBox::Value &rbv); +QDataStream &operator >>(QDataStream &s, RangeBox::Value &rbv); +QDataStream &operator <<(QDataStream &s, const RangeBox &rb); +QDataStream &operator >>(QDataStream &s, RangeBox &rb); +QDataStream &operator <<(QDataStream &s, const FrequencyRange &frange); +QDataStream &operator >>(QDataStream &s, FrequencyRange &frange); +QDataStream &operator <<(QDataStream &s, const Package &package); +QDataStream &operator >>(QDataStream &s, Package &package); +QDataStream &operator <<(QDataStream &s, const Documents &documents); +QDataStream &operator >>(QDataStream &s, Documents &documents); +QDataStream &operator <<(QDataStream &s, const Data &data); +QDataStream &operator >>(QDataStream &s, Data &data); + +} // namespace + +#endif diff --git a/src/devices/base/generic_memory.cpp b/src/devices/base/generic_memory.cpp new file mode 100644 index 0000000..78c4dd6 --- /dev/null +++ b/src/devices/base/generic_memory.cpp @@ -0,0 +1,48 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "generic_memory.h" + +bool Device::Memory::load(QTextStream &stream, QStringList &errors, + WarningTypes &warningTypes, QStringList &warnings) +{ + HexBuffer hb; + if ( !hb.load(stream, errors) ) return false; + warningTypes = fromHexBuffer(hb, warnings); + return true; +} + +Device::Memory::WarningTypes Device::Memory::fromHexBuffer(const HexBuffer &hb, QStringList &warnings) +{ + clear(); + WarningTypes result = NoWarning; + warnings.clear(); + QMap inRange; + fromHexBuffer(hb, result, warnings, inRange); + + // check that all values in FragBuffer are within memory ranges + HexBuffer::const_iterator it = hb.begin(); + for (; it!=hb.end(); ++it) { + if ( !it.data().isInitialized() || inRange[it.key()] ) continue; + if ( !(result & ValueOutsideRange) ) { + result |= ValueOutsideRange; + warnings += i18n("At least one value (at address %1) is defined outside memory ranges.").arg(toHexLabel(it.key(), 8)); + } + break; + } + + return result; +} + +bool Device::Memory::save(QTextStream &stream, HexBuffer::Format format) const +{ + savePartial(stream, format); + HexBuffer hb; + hb.saveEnd(stream); + return true; +} diff --git a/src/devices/base/generic_memory.h b/src/devices/base/generic_memory.h new file mode 100644 index 0000000..74bd938 --- /dev/null +++ b/src/devices/base/generic_memory.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef GENERIC_MEMORY_H +#define GENERIC_MEMORY_H + +#include "devices/base/generic_device.h" +#include "devices/base/hex_buffer.h" + +namespace Device +{ + +class Memory +{ +public: + const Data &device() const { return _device; } + virtual ~Memory() {} + virtual void fill(BitValue value) = 0; + virtual void clear() { fill(BitValue()); } + virtual void copyFrom(const Memory &memory) = 0; + virtual BitValue checksum() const = 0; + + virtual HexBuffer toHexBuffer() const = 0; + bool save(QTextStream &stream, HexBuffer::Format format) const; + enum WarningType { NoWarning = 0, ValueTooLarge = 1, ValueOutsideRange = 2 }; + Q_DECLARE_FLAGS(WarningTypes, WarningType) + WarningTypes fromHexBuffer(const HexBuffer &hb, QStringList &warnings); + bool load(QTextStream &stream, QStringList &errors, WarningTypes &warningTypes, QStringList &warnings); + +protected: + const Data &_device; + + Memory(const Data &device) : _device(device) {} + virtual void fromHexBuffer(const HexBuffer &hb, WarningTypes &warningTypes, + QStringList &warnings, QMap &inRange) = 0; + virtual void savePartial(QTextStream &stream, HexBuffer::Format format) const = 0; +}; +Q_DECLARE_OPERATORS_FOR_FLAGS(Memory::WarningTypes) + +} // namespace + +#endif diff --git a/src/devices/base/hex_buffer.cpp b/src/devices/base/hex_buffer.cpp new file mode 100644 index 0000000..a63554d --- /dev/null +++ b/src/devices/base/hex_buffer.cpp @@ -0,0 +1,290 @@ +/*************************************************************************** + * Copyright (C) 2005-2007 Nicolas Hadacek * + * (C) 2003 by Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#include "hex_buffer.h" + +#include + +#include "devices/base/generic_device.h" + +//----------------------------------------------------------------------------- +const char * const HexBuffer::FORMATS[Nb_Formats] = { + "inhx8m", /*"inhx8s", */"inhx16", "inhx32" +}; + +void HexBuffer::savePartial(QTextStream &stream, Format format) const +{ + BitValue oldseg; + const_iterator block = begin(); + int len; + while ( fetchNextBlock(block, end(), &len) ) { + // block found, write it + BitValue seg = block.key() >> 15 ; // 2 * seg address + if ( format==IHX32 && seg!=oldseg ) { + char buf[50]; + BitValue check = 0x02 + 0x04 + seg.byte(1) + seg.byte(0); + sprintf(buf, ":02000004%04X%02X\n", seg.toUInt(), check.twoComplement().byte(0)); + stream << buf; + oldseg = seg; + } + writeHexBlock(stream, len, block, format); + } +} + +void HexBuffer::saveEnd(QTextStream &stream) const +{ + stream << ":00000001FF\n"; +} + +/* Write one line of Intel-hex file + * Original code source from Timo Rossi, + * modified by Alain Gibaud to support large blocks write + */ +void HexBuffer::writeHexBlock(QTextStream &stream, int reclen, // length (in words) + const_iterator& data, // pointer to 1st data word (incremented by function) + Format format) +{ + while ( reclen>HEXBLKSIZE ) { + writeHexBlock(stream, HEXBLKSIZE, data, format); + reclen -= HEXBLKSIZE; + } + if ( reclen<=0 ) return; /* Oops, block has just a HEXBLKSIZE * n size */ + + char buf[20]; + BitValue check = 0x0; + + // line start + uint loc = data.key(); + switch (format) { + case IHX8M: + case IHX32: + loc *= 2; + sprintf(buf, ":%02X%04X00", 2*reclen, loc & 0xFFFF); + check += ((loc) & 0xff) + (((loc) >> 8) & 0xff) + 2*reclen; + break; + case IHX16: + sprintf(buf, ":%02X%04X00", reclen, loc & 0xFFFF); + check += (loc & 0xff) + ((loc >> 8) & 0xff) + reclen; + break; + case Nb_Formats: Q_ASSERT(false); break; + } + stream << buf; + + // data + for (; reclen > 0; ++data, --reclen) { + BitValue word = data.data(); + switch (format) { + case IHX8M: + case IHX32: + sprintf(buf, "%02X%02X", word.byte(0), word.byte(1)); + break; + case IHX16: + sprintf(buf, "%02X%02X", word.byte(1), word.byte(0)); + break; + case Nb_Formats: Q_ASSERT(false); break; + } + stream << buf; + check += word.byte(0) + word.byte(1); + } + + // checksum, assumes 2-complement + sprintf(buf, "%02X\n", check.twoComplement().byte(0)); + stream << buf; +} + +/* ------------------------------------------------------------------------- + This routine detects the next block to output + A block is a set of consecutive addresse words not + containing 0xFFFFFFFF + @return true if a block has been detected + 'it' is updated to point to the first address of the block + '*len' contains the size of the block +*/ +bool HexBuffer::fetchNextBlock(const_iterator& it, const const_iterator &end, int *len) +{ + uint startadr, curadr; + // for( i = *start ; (i < MAXPICSIZE) && (Mem[i] == INVALID) ; ++i) ; + // skip non-used words + + // Search block start + while ( it!=end && !it.data().isInitialized() ) ++it; + + // if(i >= MAXPICSIZE ) return false ; + if ( it==end ) return false; + + //for( *start = i ; (i < MAXPICSIZE) && (Mem[i] != INVALID) ; ++i) ; + //*len = i - *start ; + // search block end - a block may not cross a segment boundary + const_iterator itt(it) ; + for (curadr = startadr = itt.key(), ++itt; itt!=end; ++itt) { + if ( itt.key()!=curadr+1 ) break; // non contiguous addresses + if ( !itt.data().isInitialized() ) break; // unused word found + if ( ((itt.key()) & 0xFFFF0000U)!=(curadr & 0xFFFF0000U) ) break; // cross segment boundary + curadr = itt.key(); + } + *len = curadr - startadr + 1 ; + + return *len != 0 ; +} + +QString HexBuffer::ErrorData::message() const +{ + switch (type) { + case UnrecognizedFormat: return i18n("Unrecognized format (line %1).").arg(line); + case UnexpectedEOF: return i18n("Unexpected end-of-file."); + case UnexpectedEOL: return i18n("Unexpected end-of-line (line %1).").arg(line); + case WrongCRC: return i18n("CRC mismatch (line %1).").arg(line); + } + Q_ASSERT(false); + return QString::null; +} + +bool HexBuffer::load(QTextStream &stream, QStringList &errors) +{ + Format format; + QValueList list = load(stream, format); + if ( list.isEmpty() ) return true; + errors.clear(); + for (uint i=0; i HexBuffer::load(QTextStream &stream, Format &format) +{ + clear(); + format = Nb_Formats; + QValueList errors; + load(stream, format, errors); + if ( format==Nb_Formats ) format = IHX8M; // default + return errors; +} + +/* ------------------------------------------------------------------------- + Read a Intel HEX file of either INHX16 or INHX8M format type, detecting + the format automagicly by the wordcount and length of the line + Tested in 8 and 16 bits modes + ------------------------------------------------------------------------ */ +void HexBuffer::load(QTextStream &stream, Format &format, QValueList &errors) +{ + uint addrH = 0; // upper 16 bits of 32 bits address (inhx32 format) + uint line = 1; + + for (; !stream.atEnd(); line++) { // read each line + QString s = stream.readLine(); + if ( !s.startsWith(":") ) continue; // skip invalid intel hex line + s = s.stripWhiteSpace(); // clean-up white spaces at end-of-line + if ( s==":" ) continue; // skip empty line + + const char *p = s.latin1(); + p += 1; // skip ':' + uint bytecount = (s.length()-11) / 2; // number of data bytes of this record + + // get the byte count, the address and the type for this line. + uint count, addr, type; + if ( sscanf(p, "%02X%04X%02X", &count , &addr, &type)!=3 ) { + errors += ErrorData(line, UnrecognizedFormat); + return; + } + p += 8; + uint cksum = count + (addr >> 8) + (addr & 0xFF) + type; + + if( type==0x01 ) { // EOF field :00 0000 01 FF + uint data; + if ( sscanf(p, "%02X", &data)!=1 ) errors += ErrorData(line, UnexpectedEOL); + else if ( ((cksum+data) & 0xFF)!=0 ) errors += ErrorData(line, WrongCRC); + return; + } + + if ( type==0x04 ) { // linear extended record (for 0x21xxxx, :02 0000 04 0021 D9) + if( sscanf(p, "%04X", &addrH)!=1 ) { + errors += ErrorData(line, UnrecognizedFormat); // bad address record + return; + } + p += 4; + cksum += (addrH & 0xFF); + cksum += (addrH >> 8); + if ( format==Nb_Formats || format==IHX8M ) format = IHX32; + else if ( format!=IHX32 ) { + errors += ErrorData(line, UnrecognizedFormat); // inconsistent format + return; + } + uint data; + if ( sscanf(p, "%02X", &data)!=1 ) errors += ErrorData(line, UnexpectedEOL); + else if ( ((cksum+data) & 0xFF)!=0 ) errors += ErrorData(line, WrongCRC); + //qDebug("new address high: %s", toHex(addrH<<16, 8).data()); + continue; // goto next record + } + + /* Figure out if its INHX16 or INHX8M + if count is a 16 bits words count => INHX16 + if count is a byte count => INHX8M or INHX32 */ + if ( bytecount==count ) { + if ( format==Nb_Formats ) format = IHX8M; + else if ( format!=IHX8M && format!=IHX32 ) { + errors += ErrorData(line, UnrecognizedFormat); // inconsistent format + return; + } + /* Processing a INHX8M line */ + /* Modified to be able to read fuses from hexfile created by C18 toolchain */ + /* changed by Tobias Schoene 9 April 2005, */ + /* modified by A.G, because low and hi bytes was swapped in Tobias's code , 8 may 2005 + */ + uint addrbase = ((addrH << 16) | addr); + //qDebug("line %i: address %s", line, toHex(addrbase, 8).data()); + for (uint x = 0; x> 1; + BitValue value = (*this)[a]; + if ( addrbase+x & 1 ) insert(a, value.maskWith(0x00FF) | data << 8); // Odd addr => Hi byte + else insert(a, value.maskWith(0xFF00) | data); // Low byte + //if ( x==0 ) qDebug("fb@%s: %s", toHex(addrbase+x >> 1, 8).data(), toHex(fb[addrbase+x >> 1], 8).data()); + cksum += data; + } + } else if ( bytecount==count*2 ) { + if ( format==Nb_Formats ) format = IHX16; + else if ( format!=IHX16 ) { + errors += ErrorData(line, UnrecognizedFormat); // inconsistent format + return; + } + /* Processing a INHX16 line */ + for(uint x=0; x * + * (C) 2003 by Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#ifndef HEX_BUFFER_H +#define HEX_BUFFER_H + +#include "common/global/global.h" +#include "common/common/bitvalue.h" +class QTextStream; + +class HexBuffer : public QMap +{ +public: + enum Format { /// Differents flavors of Intel HEX file formats + IHX8M = 0, ///< 8 bits "swapped" format + // IHX8S, + IHX16, ///< 16 bits format + IHX32, ///< 8 bit format with 32 bits addresses + Nb_Formats + }; + static const char * const FORMATS[Nb_Formats]; + + void savePartial(QTextStream &s, Format format) const; + void saveEnd(QTextStream &s) const; + enum ErrorType { UnrecognizedFormat, WrongCRC, UnexpectedEOF, UnexpectedEOL }; + class ErrorData { + public: + ErrorData() {} + ErrorData(uint _line, ErrorType _type) : line(_line), type(_type) {} + QString message() const; + uint line; + ErrorType type; + }; + QValueList load(QTextStream &stream, Format &format); + bool load(QTextStream &stream, QStringList &errors); + +private: + enum { HEXBLKSIZE = 8 }; // line size in HEX files + + static bool fetchNextBlock(const_iterator& start, const const_iterator &end, int *len); + static void writeHexBlock(QTextStream &stream, int reclen, const_iterator& data, Format format); + void load(QTextStream &stream, Format &format, QValueList &errors); +}; + +#endif diff --git a/src/devices/base/register.cpp b/src/devices/base/register.cpp new file mode 100644 index 0000000..85fc013 --- /dev/null +++ b/src/devices/base/register.cpp @@ -0,0 +1,156 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "register.h" + +//---------------------------------------------------------------------------- +namespace Register +{ + List *_list = 0; +} +Register::List &Register::list() +{ + if ( _list==0 ) _list = new List; + return *_list; +} + +//---------------------------------------------------------------------------- +Register::TypeData::TypeData(Address address, uint nbChars) + : _nbChars(nbChars), _address(address) +{ + Q_ASSERT( address.isValid() && nbChars!=0 ); +} +Register::TypeData::TypeData(const QString &name, uint nbChars) + : _nbChars(nbChars), _name(name) +{ + Q_ASSERT( !name.isEmpty() && nbChars!=0 ); +} +Register::TypeData::TypeData(const QString &name, Address address, uint nbChars) + : _nbChars(nbChars), _address(address), _name(name) +{ + Q_ASSERT( address.isValid() && nbChars!=0 && !name.isEmpty() ); +} + +Register::Type Register::TypeData::type() const +{ + if ( !_address.isValid() ) { + if ( _name.isEmpty() ) return Invalid; + return Special; + } + if ( _name.isEmpty() ) return Regular; + return Combined; +} + +QString Register::TypeData::toString() const +{ + return QString("%1 %2 %3").arg(toLabel(_address)).arg(_nbChars).arg(_name); +} + +Register::TypeData Register::TypeData::fromString(const QString &s) +{ + QStringList list = QStringList::split(" ", s); + if ( list.count()<2 || list.count()>3 ) return TypeData(); + bool ok; + Address address = list[0].toUInt(&ok); + if ( !ok ) return TypeData(); + uint nbChars = list[1].toUInt(&ok); + if ( !ok || nbChars==0 || (nbChars%2)!=0 ) return TypeData(); + QString name; + if ( list.count()==3 ) name = list[2]; + if ( !address.isValid() ) { + if ( name.isEmpty() ) return TypeData(); + return TypeData(name, nbChars); + } + if ( name.isEmpty() ) return TypeData(address, nbChars); + return TypeData(name, address, nbChars); +} + +//---------------------------------------------------------------------------- +void Register::List::init() +{ + _regulars.clear(); + _specials.clear(); + _watched.clear(); + _portDatas.clear(); + delayedChanged(); +} + +void Register::List::setWatched(const TypeData &data, bool watched) +{ + if (watched) { + if ( _watched.contains(data) ) return; + _watched.append(data); + } else _watched.remove(data); + delayedChanged(); +} + +void Register::List::clearWatched() +{ + _watched.clear(); + delayedChanged(); +} + +void Register::List::setValue(const TypeData &data, BitValue value) +{ + if ( !data.address().isValid() ) { + _specials[data.name()].old = _specials[data.name()].current; + _specials[data.name()].current = value; + } else { + Q_ASSERT( (data.nbChars()%2)==0 ); + uint nb = data.nbChars()/2; + for (uint i=0; i &data) +{ + _portDatas[index].old = _portDatas[index].current; + _portDatas[index].current = data; + delayedChanged(); +} + +BitValue Register::List::value(const TypeData &data) const +{ + if ( !data.address().isValid() ) { + if ( !_specials.contains(data.name()) ) return BitValue(); + return _specials[data.name()].current; + } + Q_ASSERT( (data.nbChars()%2)==0 ); + uint nb = data.nbChars()/2; + BitValue value = 0; + for (int i=nb-1; i>=0; i--) { + value <<= 8; + BitValue v = _regulars[data.address() + i].current; + if ( !v.isInitialized() ) return BitValue(); + value += v; + } + return value; +} + +BitValue Register::List::oldValue(const TypeData &data) const +{ + if ( !data.address().isValid() ) { + if ( !_specials.contains(data.name()) ) return BitValue(); + return _specials[data.name()].old; + } + Q_ASSERT( (data.nbChars()%2)==0 ); + uint nb = data.nbChars()/2; + BitValue value = 0; + for (int i=nb-1; i>=0; i--) { + value <<= 8; + BitValue v = _regulars[data.address() + i].old; + if ( !v.isInitialized() ) return BitValue(); + value += v; + } + return value; +} diff --git a/src/devices/base/register.h b/src/devices/base/register.h new file mode 100644 index 0000000..1c587e2 --- /dev/null +++ b/src/devices/base/register.h @@ -0,0 +1,130 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef REGISTER_H +#define REGISTER_H + +#include "common/common/storage.h" +#include "devices/base/generic_device.h" +namespace Register { class TypeData; } + +namespace Device +{ +enum RegisterProperty { NotAccessible = 0x0, Readable = 0x1, Writable = 0x2 }; +Q_DECLARE_FLAGS(RegisterProperties, RegisterProperty) +Q_DECLARE_OPERATORS_FOR_FLAGS(RegisterProperties) + +enum { MAX_NB_PORTS = 8 }; +enum { MAX_NB_PORT_BITS = 16 }; +enum BitState { Low = 0, High, WeakPullUp, WeakPullDown, HighImpedance, Unknown }; +enum IoState { IoLow = 0, IoHigh, IoUnknown }; +class PortBitData { +public: + PortBitData() : state(Unknown), driving(false), drivenState(IoUnknown), drivingState(IoUnknown) {} + BitState state; + bool driving; + IoState drivenState, drivingState; + bool operator !=(const PortBitData &pdb) const { + return ( state!=pdb.state || driving!=pdb.driving || drivenState!=pdb.drivenState || drivingState!=pdb.drivingState ); + } +}; + +} // namespace + +namespace Register +{ +//---------------------------------------------------------------------------- +enum Type { Regular, Special, Combined, Invalid }; +class TypeData { +public: + TypeData() : _nbChars(0) {} + TypeData(Address address, uint nbChars); + TypeData(const QString &name, uint nbChars); + TypeData(const QString &name, Address address, uint nbChars); + bool operator ==(const TypeData &data) const { return _name==data._name && _address==data._address && _nbChars==data._nbChars; } + Type type() const; + QString name() const { return _name; } + Address address() const { return _address; } + uint nbChars() const { return _nbChars; } + QString toString() const; + static TypeData fromString(const QString &s); + +private: + uint _nbChars; + Address _address; + QString _name; +}; + +} // namespace + +namespace Device +{ +//---------------------------------------------------------------------------- +class RegistersData +{ +public: + RegistersData() {} + virtual ~RegistersData() {} + virtual uint nbRegisters() const = 0; + virtual uint nbBits() const = 0; + uint nbBytes() const { return nbBitsToNbBytes(nbBits()); } + uint nbChars() const { return nbBitsToNbChars(nbBits()); } + virtual uint addressFromIndex(uint i) const = 0; + virtual uint indexFromAddress(Address address) const = 0; + virtual RegisterProperties properties(Address address) const = 0; + virtual QValueList relatedRegisters(const Register::TypeData &data) const = 0; + virtual bool hasPort(uint index) const = 0; + virtual int portIndex(Address address) const = 0; + virtual QString portName(uint index) const = 0; + virtual bool hasPortBit(uint index, uint bit) const = 0; + virtual QString portBitName(uint index, uint bit) const = 0; +}; + +} // namespace + +namespace Register +{ +//---------------------------------------------------------------------------- +class List; +extern List &list(); + +class List : public GenericStorage +{ +Q_OBJECT +public: + List() : GenericStorage(0, "register_list") {} + void init(); + void setWatched(const TypeData &data, bool watched); + void clearWatched(); + const QValueList &watched() const { return _watched; } + bool isWatched(const TypeData &data) const { return _watched.contains(data); } + void setValue(const TypeData &data, BitValue value); + BitValue value(const TypeData &data) const; + BitValue oldValue(const TypeData &data) const; + void setPortData(uint index, const QMap &data); + QMap portData(uint index) const { return _portDatas[index].current; } + QMap oldPortData(uint index) const { return _portDatas[index].old; } + +private: + class StateData { + public: + BitValue current, old; + }; + QMap _regulars; // registers with address + QMap _specials; // registers with no address + class PortData { + public: + QMap current, old; + }; + QMap _portDatas; // port index + QValueList _watched; +}; + +} // namespace + +#endif diff --git a/src/devices/devices.pro b/src/devices/devices.pro new file mode 100644 index 0000000..136930d --- /dev/null +++ b/src/devices/devices.pro @@ -0,0 +1,2 @@ +TEMPLATE = subdirs +SUBDIRS = base list pic mem24 diff --git a/src/devices/gui/Makefile.am b/src/devices/gui/Makefile.am new file mode 100644 index 0000000..ae92163 --- /dev/null +++ b/src/devices/gui/Makefile.am @@ -0,0 +1,7 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +libdeviceui_la_LDFLAGS = $(all_libraries) +noinst_LTLIBRARIES = libdeviceui.la +libdeviceui_la_SOURCES = hex_word_editor.cpp memory_editor.cpp \ + register_view.cpp hex_view.cpp device_group_ui.cpp diff --git a/src/devices/gui/device_group_ui.cpp b/src/devices/gui/device_group_ui.cpp new file mode 100644 index 0000000..64b5c14 --- /dev/null +++ b/src/devices/gui/device_group_ui.cpp @@ -0,0 +1,9 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "device_group_ui.h" diff --git a/src/devices/gui/device_group_ui.h b/src/devices/gui/device_group_ui.h new file mode 100644 index 0000000..3b2fa91 --- /dev/null +++ b/src/devices/gui/device_group_ui.h @@ -0,0 +1,45 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef DEVICE_GROUP_UI_H +#define DEVICE_GROUP_UI_H + +#include +class QWidget; +class KPopupMenu; +class KListViewItem; +class KAction; + +#include "devices/base/generic_device.h" +#include "devices/base/device_group.h" +#include "devices/base/register.h" +namespace Register { class View; class ListViewItem; } +class HexEditor; +class ListContainer; + +namespace Device +{ +class Memory; +class HexView; +class MemoryEditor; + +class GroupUI : public ::Group::BaseGui +{ +public: + virtual HexView *createHexView(const HexEditor &editor, QWidget *parent) const = 0; + virtual Register::View *createRegisterView(QWidget *parent) const = 0; + virtual MemoryEditor *createConfigEditor(Device::Memory &memory, QWidget *parent) const = 0; + virtual void fillWatchListContainer(ListContainer *container, QValueVector &ids) const = 0; + virtual Register::ListViewItem *createWatchItem(const Register::TypeData &data, KListViewItem *parent) const = 0; +}; + +inline const Device::GroupUI &groupui(const Device::Data &data) { return static_cast(*data.group().gui()); } + +} // namespace + +#endif diff --git a/src/devices/gui/hex_view.cpp b/src/devices/gui/hex_view.cpp new file mode 100644 index 0000000..6b26b0a --- /dev/null +++ b/src/devices/gui/hex_view.cpp @@ -0,0 +1,23 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * Copyright (C) 2003 Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#include "hex_view.h" + +Device::HexView::HexView(const HexEditor &editor, QWidget *parent, const char *name) + : MemoryEditorGroup(0, parent, name), _editor(editor) +{} + +void Device::HexView::display(Memory *memory) +{ + _memory = memory; + for (uint i=0; i<_editors.count(); i++) delete _editors[i]; + _editors.clear(); + if ( _memory==0 ) return; + display(); +} diff --git a/src/devices/gui/hex_view.h b/src/devices/gui/hex_view.h new file mode 100644 index 0000000..d73710e --- /dev/null +++ b/src/devices/gui/hex_view.h @@ -0,0 +1,39 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * Copyright (C) 2003 Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#ifndef HEX_VIEW_H +#define HEX_VIEW_H + +#include "memory_editor.h" +#include "libgui/hex_editor.h" + +namespace Device +{ + +class HexView : public MemoryEditorGroup +{ +Q_OBJECT +public: + HexView(const HexEditor &editor, QWidget *parent, const char *name); + virtual void display(Memory *memory); + virtual uint nbChecksumChars() const = 0; + virtual BitValue checksum() const = 0; + bool isModified() const { return _editor.isModified(); } + const Memory *originalMemory() const { return _editor.originalMemory(); } + +protected: + virtual void display() = 0; + +private: + const HexEditor &_editor; +}; + +} // namespace + +#endif diff --git a/src/devices/gui/hex_word_editor.cpp b/src/devices/gui/hex_word_editor.cpp new file mode 100644 index 0000000..fd64e13 --- /dev/null +++ b/src/devices/gui/hex_word_editor.cpp @@ -0,0 +1,42 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * Copyright (C) 2003-2004 Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#include "hex_word_editor.h" + +#include +#include +#include +#include +#include + +//----------------------------------------------------------------------------- +Device::HexWordEditor::HexWordEditor(Memory &memory, uint nbChars, QWidget *parent) + : GenericHexWordEditor(nbChars, true, parent), _memory(memory) +{ + setOffset(-1); +} + +void Device::HexWordEditor::setOffset(int offset) +{ + _offset = offset; + set(); +} + +//----------------------------------------------------------------------------- +Device::RegisterHexWordEditor::RegisterHexWordEditor(QWidget *parent, uint nbChars, BitValue mask) + : GenericHexWordEditor(nbChars, true, parent), _mask(mask) +{ + clear(); +} + +void Device::RegisterHexWordEditor::setValue(BitValue word) +{ + _word = word; + set(); +} diff --git a/src/devices/gui/hex_word_editor.h b/src/devices/gui/hex_word_editor.h new file mode 100644 index 0000000..bd9fadb --- /dev/null +++ b/src/devices/gui/hex_word_editor.h @@ -0,0 +1,64 @@ +/*************************************************************************** + * Copyright (C) 2005-2007 Nicolas Hadacek * + * Copyright (C) 2003-2004 Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#ifndef HEX_WORD_EDITOR_H +#define HEX_WORD_EDITOR_H + +#include "common/gui/hexword_gui.h" +#include "devices/base/generic_memory.h" + +namespace Device +{ +//----------------------------------------------------------------------------- +class HexWordEditor : public GenericHexWordEditor +{ +Q_OBJECT +public: + HexWordEditor(Memory &memory, uint nbChars, QWidget *parent); + void setOffset(int offset); + int offset() const { return _offset; } + +protected: + Device::Memory &_memory; + int _offset; + + virtual bool isValid() const { return _offset!=-1; } + virtual BitValue mask() const = 0; + virtual BitValue normalizeWord(BitValue value) const = 0; + virtual BitValue word() const = 0; + virtual void setWord(BitValue value) = 0; + virtual BitValue blankValue() const { return BitValue(); } +}; + +//----------------------------------------------------------------------------- +class RegisterHexWordEditor : public GenericHexWordEditor +{ +Q_OBJECT +public: + RegisterHexWordEditor(QWidget *parent, uint nbChars, BitValue mask); + void clear() { setValue(BitValue()); } + void setValue(BitValue word); + BitValue value() const { return _word; } + void setColor(QColor color) { setPaletteForegroundColor(color); } + void unsetColor() { unsetPalette(); } + +private: + BitValue _mask, _word; + + virtual bool isValid() const { return true; } + virtual BitValue mask() const { return _mask; } + virtual BitValue normalizeWord(BitValue value) const { return value.maskWith(_mask); } + virtual BitValue word() const { return _word; } + virtual void setWord(BitValue value) { _word = value; } + virtual BitValue blankValue() const { return BitValue(); } +}; + +} // namespace + +#endif diff --git a/src/devices/gui/memory_editor.cpp b/src/devices/gui/memory_editor.cpp new file mode 100644 index 0000000..175f011 --- /dev/null +++ b/src/devices/gui/memory_editor.cpp @@ -0,0 +1,369 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * Copyright (C) 2003-2004 Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#include "memory_editor.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common/common/misc.h" +#include "hex_word_editor.h" +#include "device_group_ui.h" +#include "libgui/toplevel.h" +#include "libgui/main_global.h" +#include "hex_view.h" +#include "libgui/gui_prog_manager.h" + +//----------------------------------------------------------------------------- +Device::MemoryEditor::MemoryEditor(Device::Memory *memory, QWidget *parent, const char *name) + : QFrame(parent, name), _memory(memory) +{ + _top = new QVBoxLayout(this, 5, 10); +} + +//----------------------------------------------------------------------------- +Device::MemoryRangeEditor::MemoryRangeEditor(Device::Memory &memory, + uint nbLines, uint nbCols, uint offset, int nb, + QWidget *parent, const char *name) + : MemoryEditor(&memory, parent, name), + _nbLines(nbLines), _nbCols(nbCols), _offset(offset), _nb(nb) +{} + +void Device::MemoryRangeEditor::init() +{ + if ( _nb==-1 ) _nb = nbWords(); + uint totalNbLines = _nb / _nbCols; + if ( (_nb % _nbCols)!=0 ) totalNbLines++; + + QHBoxLayout *hbox = new QHBoxLayout(_top); + + QVBoxLayout *vbox = new QVBoxLayout(hbox); + QFrame *frame = new QFrame(this); + frame->setFrameStyle(QFrame::Panel | QFrame::Raised); + frame->setMargin(5); + vbox->addWidget(frame); + vbox->addStretch(1); + QHBoxLayout *fbox = new QHBoxLayout(frame, 5, 5); + QGrid *grid = new QGrid(3+_nbCols, QGrid::Horizontal, frame, "memory_range_editor_grid"); + fbox->addWidget(grid); + grid->setSpacing(0); + grid->setMargin(3); + QFont f("courier", font().pointSize()); + grid->setFont(f); + for (uint k=0; k<_nbLines; ++k) { + // addresses + QWidget *w = new QWidget(grid); + w->setFixedWidth(10); + _blocks.append(w); + QLabel *label = new QLabel(toHex(0, 2*_memory->device().nbBytesAddress()), grid, "address_label"); + _addresses.append(label); + label = new QLabel(":", grid); + // memory + for (uint i = 0; i<_nbCols; ++i) { + HexWordEditor *h = createHexWordEditor(grid); + _editors.append(h); + connect(h, SIGNAL(modified()), SIGNAL(modified())); + connect(h, SIGNAL(moveNext()), SLOT(moveNext())); + connect(h, SIGNAL(movePrev()), SLOT(movePrev())); + connect(h, SIGNAL(moveFirst()), SLOT(moveFirst())); + connect(h, SIGNAL(moveLast()), SLOT(moveLast())); + connect(h, SIGNAL(moveUp()), SLOT(moveUp())); + connect(h, SIGNAL(moveDown()), SLOT(moveDown())); + connect(h, SIGNAL(moveNextPage()), SLOT(moveNextPage())); + connect(h, SIGNAL(movePrevPage()), SLOT(movePrevPage())); + } + } + + // scrollbar if there are more lines to display than visible + _scrollbar = new QScrollBar(0, QMAX(_nbLines, totalNbLines)-_nbLines, 1, _nbLines, 0, + QScrollBar::Vertical, frame, "memory_range_editor_scrollbar"); + connect(_scrollbar, SIGNAL(valueChanged(int)), SLOT(setIndex(int))) ; + if ( totalNbLines<=_nbLines ) _scrollbar->hide(); + fbox->addWidget(_scrollbar); + fbox->addStretch(1); + + vbox->addStretch(1); + QVBoxLayout *vboxc = new QVBoxLayout(hbox); + vboxc->setSpacing(0); + _comment = new QLabel(this); + _comment->hide(); + vboxc->addWidget(_comment); + _spacer = new QLabel(this); + _spacer->setFixedHeight(10); + _spacer->hide(); + vboxc->addWidget(_spacer); + addLegend(vboxc); + vboxc->addStretch(1); + hbox->addStretch(1); + + setReadOnly(false); + setIndex(0); +} + +void Device::MemoryRangeEditor::setComment(const QString &text) +{ + _comment->setText(text); + _comment->show(); + _spacer->show(); +} + +void Device::MemoryRangeEditor::setReadOnly(bool readOnly) +{ + for (uint i=0; i<_editors.count(); i++) + _editors[i]->setReadOnly(readOnly || isRangeReadOnly()); +} + +void Device::MemoryRangeEditor::updateDisplay() +{ + setIndex(_scrollbar->value()); +} + +void Device::MemoryRangeEditor::setStartWord(int index) +{ + setIndex(index / _nbCols / addressIncrement()); +} + +void Device::MemoryRangeEditor::setEndWord(int index) +{ + uint i = index / _nbCols / addressIncrement(); + i = (i<_nbLines ? 0 : i - _nbLines + 1); + setIndex(i); +} + +void Device::MemoryRangeEditor::setIndex(int index) +{ + _scrollbar->blockSignals(true); + _scrollbar->setValue(index); + _scrollbar->blockSignals(false); + + // memory + for (uint i=0; i<_editors.count(); i++) { + int offset = wordOffset() + i; + _editors[i]->setOffset(offsetsetText(toHex(address, 2*_memory->device().nbBytesAddress())); + updateAddressColor(i, address); + address += inc * _nbCols; + } +} + +void Device::MemoryRangeEditor::moveNext() +{ + QValueList::iterator it = _editors.find((HexWordEditor *)sender()); + ++it; + if ( it==_editors.end() || (*it)->offset()==-1 ) { + if ( current()==uint(_scrollbar->maxValue()) ) return; // at end + setIndex(current()+1); + _editors[_editors.count()-_nbCols]->setFocus(); + } else (*it)->setFocus(); +} + +void Device::MemoryRangeEditor::movePrev() +{ + QValueList::iterator it = _editors.find((HexWordEditor *)sender()); + if ( it==_editors.begin() ) { + if ( current()==0 ) return; // at beginning + setIndex(current()-1); + _editors[_nbCols-1]->setFocus(); + } else { + --it; + (*it)->setFocus(); + } +} + +void Device::MemoryRangeEditor::moveFirst() +{ + if ( _editors[0]==0 ) return; + setIndex(0); + _editors[0]->setFocus(); +} + +void Device::MemoryRangeEditor::moveLast() +{ + if ( _editors.count()==0 ) return; + setIndex(_scrollbar->maxValue()); + for (uint i=1; i<=_nbCols; i++) { + if ( _editors[_editors.count()-i]->offset()==-1 ) continue; + _editors[_editors.count()-i]->setFocus(); + break; + } +} + +void Device::MemoryRangeEditor::moveUp() +{ + int i = _editors.findIndex((HexWordEditor *)sender()); + uint line = i / _nbCols; + if ( line==0 ) { + if ( current()==0 ) return; // on first line + setIndex(current()-1); + _editors[i]->setFocus(); + } else _editors[i-_nbCols]->setFocus(); +} + +void Device::MemoryRangeEditor::moveDown() +{ + int i = _editors.findIndex((HexWordEditor *)sender()); + uint line = i / _nbCols; + if ( line+1==_nbLines ) { + if ( current()==uint(_scrollbar->maxValue()) ) return; // on last line + setIndex(current()+1); + if ( _editors[i]->offset()==-1 ) _editors[i-_nbCols]->setFocus(); + else _editors[i]->setFocus(); + } else _editors[i+_nbCols]->setFocus(); +} + +void Device::MemoryRangeEditor::moveNextPage() +{ + int i = _editors.findIndex((HexWordEditor *)sender()); + if ( _nbLines>(uint(_scrollbar->maxValue()) - current()) ) i = (_nbLines-1) * _nbCols + (i % _nbCols); + else setIndex(current()+_nbLines); + if ( _editors[i]->offset()==-1 ) _editors[i-_nbCols]->setFocus(); + else _editors[i]->setFocus(); +} + +void Device::MemoryRangeEditor::movePrevPage() +{ + int i = _editors.findIndex((HexWordEditor *)sender()); + if ( current()<_nbLines ) i = (i % _nbCols); + else setIndex(current()-_nbLines); + _editors[i]->setFocus(); +} + +//----------------------------------------------------------------------------- +Device::MemoryEditorGroup::MemoryEditorGroup(Device::Memory *memory, QWidget *parent, const char *name) + : MemoryEditor(memory, parent, name) +{} + +void Device::MemoryEditorGroup::addEditor(MemoryEditor *editor) +{ + connect(editor, SIGNAL(modified()), SIGNAL(modified())); + _editors.append(editor); +} + +void Device::MemoryEditorGroup::setReadOnly(bool readOnly) +{ + for (uint i=0; i<_editors.count(); i++) + _editors[i]->setReadOnly(readOnly); +} + +void Device::MemoryEditorGroup::updateDisplay() +{ + for (uint i=0; i<_editors.count(); i++) + _editors[i]->updateDisplay(); +} + +//----------------------------------------------------------------------------- +const Device::ActionData Device::ACTION_DATA[Nb_Actions] = { + { I18N_NOOP("&Clear"), "fileclose", NeedWrite }, + { I18N_NOOP("&Zero"), 0, NeedWrite }, + { I18N_NOOP("For checksum check"), 0, NeedWrite }, + { I18N_NOOP("Re&load"), "reload", SeparatorAfter | NeedModified }, + { I18N_NOOP("&Program"), "piklab_burnchip", NeedProgrammer }, + { I18N_NOOP("&Verify"), "piklab_verifychip", NeedProgrammer }, + { I18N_NOOP("&Read"), "piklab_readchip", NeedProgrammer | NeedWrite }, + { I18N_NOOP("&Erase"), "piklab_erasechip", NeedProgrammer }, + { I18N_NOOP("&Blank Check"), "piklab_blankcheck", NeedProgrammer } +}; + +Device::MemoryTypeEditor::MemoryTypeEditor(const HexView *hexview, Device::Memory &memory, + QWidget *parent, const char *name) + : MemoryEditorGroup(&memory, parent, name), + _title(0), _comment(0), _hexview(hexview) +{ + for (uint i=0; iaddWidget(new SeparatorWidget(this)); + QHBoxLayout *hbox = new QHBoxLayout(_top); + + _title = new PopupButton(this); + for (uint i=0; iappendSeparator(); + } + _title->appendSeparator(); + hbox->addWidget(_title); + + _comment = new QLabel(this); + hbox->addWidget(_comment); + hbox->addStretch(1); + + connect(&Main::toplevel(), SIGNAL(stateChanged()), SLOT(stateChanged())); +} + +void Device::MemoryTypeEditor::addAction(KAction *action) +{ + _title->appendAction(action); +} + +void Device::MemoryTypeEditor::doAction() +{ + for (uint i=0; iinitProgramming(false) ) return; + bool ok = internalDoAction(action); + if ( ACTION_DATA[action].properties & NeedProgrammer ) + Programmer::manager->endProgramming(); + if (ok) { + updateDisplay(); + modified(); + } +} + +void Device::MemoryTypeEditor::stateChanged() +{ + bool idle = ( Main::state()==Main::Idle ); + for (uint i=0; iisModified()) ) on = false; + _actions[i]->setEnabled(on); + } +} + +void Device::MemoryTypeEditor::setReadOnly(bool readOnly) +{ + _readOnly = readOnly; + MemoryEditorGroup::setReadOnly(readOnly); + stateChanged(); +} + +const Device::Memory *Device::MemoryTypeEditor::originalMemory() const +{ + return (_hexview ? _hexview->originalMemory() : 0); +} diff --git a/src/devices/gui/memory_editor.h b/src/devices/gui/memory_editor.h new file mode 100644 index 0000000..9836261 --- /dev/null +++ b/src/devices/gui/memory_editor.h @@ -0,0 +1,156 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef MEMORY_EDITOR_H +#define MEMORY_EDITOR_H + +#include +#include +#include +#include "common/common/qflags.h" +#include "common/common/bitvalue.h" +class QVBoxLayout; +class QHBoxLayout; +class QHBox; +class KAction; +class PopupButton; + +namespace Device +{ +class HexView; +class HexWordEditor; +class Memory; + +enum Action { Clear = 0, Zero, ChecksumCheck, Reload, + Program, Verify, Read, Erase, BlankCheck, Nb_Actions }; +enum ActionProperty { NoProperty = 0, SeparatorAfter = 1, NeedProgrammer = 2, + NeedWrite = 4, NeedModified = 8 }; +Q_DECLARE_FLAGS(ActionProperties, ActionProperty) +Q_DECLARE_OPERATORS_FOR_FLAGS(ActionProperties) +struct ActionData { + const char *label, *icon; + ActionProperties properties; +}; +extern const ActionData ACTION_DATA[Nb_Actions]; + +//---------------------------------------------------------------------------- +class MemoryEditor : public QFrame +{ +Q_OBJECT +public: + MemoryEditor(Device::Memory *memory, QWidget *parent, const char *name); + virtual void setReadOnly(bool readOnly) = 0; + +public slots: + virtual void updateDisplay() = 0; + +signals: + void modified(); + +protected: + Device::Memory *_memory; + QVBoxLayout *_top; +}; + +//---------------------------------------------------------------------------- +class MemoryRangeEditor : public MemoryEditor +{ +Q_OBJECT +public: + MemoryRangeEditor(Device::Memory &memory, uint nbLines, uint nbCols, + uint offset, int nb, QWidget *parent, const char *name); + virtual void init(); + virtual void setReadOnly(bool readOnly); + void setComment(const QString &text); + +public slots: + virtual void updateDisplay(); + void moveNext(); + void movePrev(); + void moveFirst(); + void moveLast(); + void moveUp(); + void moveDown(); + void moveNextPage(); + void movePrevPage(); + +protected slots: + void setStartWord(int index); + void setEndWord(int index); + void setIndex(int index); + +protected: + uint _nbLines, _nbCols, _offset; + int _nb; + QValueList _addresses; + QValueList _blocks; + QValueList _editors; + QScrollBar *_scrollbar; + QLabel *_comment; + QWidget *_spacer; + + uint wordOffset() const { return _offset + current() * _nbCols; } + uint current() const { return _scrollbar->value(); } + virtual uint nbWords() const = 0; + virtual uint addressIncrement() const = 0; + virtual Address startAddress() const = 0; + virtual HexWordEditor *createHexWordEditor(QWidget *parent) = 0; + virtual bool isRangeReadOnly() const = 0; + virtual void updateAddressColor(uint i, Address address) { Q_UNUSED(i); Q_UNUSED(address); } + virtual void addLegend(QVBoxLayout *vbox) { Q_UNUSED(vbox); } +}; + +//---------------------------------------------------------------------------- +class MemoryEditorGroup : public MemoryEditor +{ +Q_OBJECT +public: + MemoryEditorGroup(Device::Memory *memory, QWidget *parent, const char *name); + void addEditor(MemoryEditor *editor); + virtual void setReadOnly(bool readOnly); + +public slots: + virtual void updateDisplay(); + +protected: + bool _modified; + QValueList _editors; +}; + +//---------------------------------------------------------------------------- +class MemoryTypeEditor : public MemoryEditorGroup +{ +Q_OBJECT +public: + MemoryTypeEditor(const HexView *hexview, Device::Memory &memory, QWidget *parent, const char *name); + virtual void init(bool first); + virtual void setReadOnly(bool readOnly); + +protected slots: + void doAction(); + void stateChanged(); + +protected: + PopupButton *_title; + QLabel *_comment; + const HexView *_hexview; + virtual bool internalDoAction(Action action) = 0; // return true if memory modified + virtual bool hasAction(Action) const { return true; } + void addAction(KAction *action); + const Device::Memory *originalMemory() const; + +private: + bool _readOnly; + KAction *_actions[Nb_Actions]; + + void doAction(Action action); +}; + +} // namespace + +#endif diff --git a/src/devices/gui/register_view.cpp b/src/devices/gui/register_view.cpp new file mode 100644 index 0000000..70dedc9 --- /dev/null +++ b/src/devices/gui/register_view.cpp @@ -0,0 +1,208 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "register_view.h" + +#include "libgui/main_global.h" +#include "libgui/gui_debug_manager.h" + +//---------------------------------------------------------------------------- +Register::PortBitListViewItem::PortBitListViewItem(uint index, uint bit, KListViewItem *parent) + : KListViewItem(parent), _index(index), _bit(bit) +{ + const Device::RegistersData *rdata = Main::deviceData()->registersData(); + setText(1, rdata->portBitName(_index, _bit)); + setSelectable(false); +} + +void Register::PortBitListViewItem::updateView() +{ + const QMap &pdata = Register::list().portData(_index); + QString text; + if ( pdata.isEmpty() ) text = "--"; + else { +/* + switch (pdata[_bit].state) { + case Device::High: text = " 1"; break; + case Device::Low: text = " 0"; break; + case Device::WeakPullUp: text = "w1"; break; + case Device::WeakPullDown: text = "w0"; break; + case Device::HighImpedance: text = "HZ"; break; + case Device::Unknown: text = " "; break; + } +*/ + if ( pdata[_bit].drivingState==Device::IoUnknown ) text = " "; + else text += (pdata[_bit].drivingState==Device::IoHigh ? "1" : "0"); + text += (pdata[_bit].driving ? " > " : " < "); + if ( pdata[_bit].drivenState==Device::IoUnknown ) text += " "; + else text += (pdata[_bit].drivenState==Device::IoHigh ? "1" : "0"); + } + setText(2, text); + repaint(); +} + +void Register::PortBitListViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int align) +{ + QColorGroup ncg = cg; + const QMap &data = Register::list().portData(_index); + const QMap &odata = Register::list().oldPortData(_index); + bool changed = ( !data.isEmpty() && data[_bit]!=odata[_bit] ); + if ( column==2 && changed ) ncg.setColor(QColorGroup::Text, red); + KListViewItem::paintCell(p, ncg, column, width, align); +} + +QString Register::PortBitListViewItem::tooltip(int col) const +{ + if ( col!=2 ) return QString::null; + const QMap &pdata = Register::list().portData(_index); + if ( pdata.isEmpty() ) return QString::null; + QString s = text(1) + ": "; + if (pdata[_bit].driving) { + if ( pdata[_bit].drivingState!=Device::IoUnknown ) s += i18n("unknown state"); + else s += (pdata[_bit].drivingState==Device::IoHigh ? i18n("driving high") : i18n("driving low")); + s += i18n(" (output)"); + } else { + if ( pdata[_bit].drivenState==Device::IoUnknown ) s += i18n("unknown state"); + else s += (pdata[_bit].drivenState==Device::IoHigh ? i18n("driven high") : i18n("driven low")); + s += i18n(" (input)"); + } + return s; +} + +//----------------------------------------------------------------------------- +Register::ListViewItem::ListViewItem(const TypeData &data, KListViewItem *parent) + : EditListViewItem(parent), _data(data), _base(NumberBase::Hex) +{ + setSelectable(false); + const Device::RegistersData *rdata = Main::deviceData()->registersData(); + if ( data.type()==Regular && rdata ) { + int i = rdata->portIndex(data.address()); + if ( i!=-1 ) { + for (int k=Device::MAX_NB_PORT_BITS-1; k>=0; k--) { + if ( !rdata->hasPortBit(i, k) ) continue; + PortBitListViewItem *item = new PortBitListViewItem(i, k, this); + _items.append(item); + } + } + } +} + +QString Register::ListViewItem::text() const +{ + BitValue value = Register::list().value(_data); + uint nbChars = convertNbChars(_data.nbChars(), NumberBase::Hex, _base); + return (value.isInitialized() ? toLabel(_base, value, nbChars) : "--"); +} + +int Register::ListViewItem::compare(QListViewItem *item, int, bool) const +{ + const TypeData &data = static_cast(item)->data(); + int i1 = list().watched().findIndex(data); + Q_ASSERT( i1!=-1 ); + int i2 = list().watched().findIndex(_data); + Q_ASSERT( i2!=-1 ); + return ( i1-i2 ); +} + +void Register::ListViewItem::updateView() +{ + if ( _data.type()!=Special ) setText(0, toHexLabel(_data.address(), nbCharsAddress()) + ":"); + setText(1, label()); + setText(2, text()); + repaint(); + for (uint i=0; i<_items.count(); i++) _items[i]->updateView(); +} + +void Register::ListViewItem::setBase(NumberBase base) +{ + _base = base; + updateView(); +} + +void Register::ListViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int align) +{ + QColorGroup ncg = cg; + BitValue value = Register::list().value(_data); + BitValue oldValue = Register::list().oldValue(_data); + if ( column==2 && value!=oldValue ) ncg.setColor(QColorGroup::Text, red); + EditListViewItem::paintCell(p, ncg, column, width, align); +} + +QString Register::ListViewItem::tooltip(int col) const +{ + if ( col!=2 ) return QString::null; + BitValue value = Register::list().value(_data); + if ( !value.isInitialized() ) return QString::null; + BitValue v = value; + QString s; + for (uint i=0; i<_data.nbChars(); i++) { + char c = v.nybble(i); + if ( isprint(c) ) s = c + s; + else s = "." + s; + } + return QString("%1 - %2 - \"%3\"").arg(toHexLabel(value, _data.nbChars())) + .arg(toLabel(NumberBase::Bin, value, 4*_data.nbChars())).arg(s); +} + +QWidget *Register::ListViewItem::editWidgetFactory(int col) const +{ + if ( col!=2 || Main::programmerState()!=Programmer::Halted ) return 0; + return new NumberLineEdit(text(), 0); +} + +void Register::ListViewItem::editDone(int col, const QWidget *edit) +{ + if ( col!=2 ) return; + bool ok; + ulong value = static_cast(edit)->value(&ok); + if (ok) Debugger::manager->writeRegister(_data, value); +} + +//---------------------------------------------------------------------------- +Register::LineEdit::LineEdit(QWidget *parent, const char *name) + : NumberLineEdit(parent, name), _base(NumberBase::Nb_Types) +{ + connect(this, SIGNAL(lostFocus()), SLOT(updateText())); + connect(this, SIGNAL(returnPressed()), SLOT(returnPressedSlot())); +} + +void Register::LineEdit::updateText() +{ + setText(_value.isInitialized() ? toLabel(_base, _value, _nbChars) : "--"); + uint w = 2*frameWidth() + maxLabelWidth(_base, _nbChars, font()); + setFixedWidth(w+5); + setFixedHeight(minimumSizeHint().height()); +} + +void Register::LineEdit::setValue(NumberBase base, BitValue value, uint nbChars) +{ + _base = base; + _value = value; + _nbChars = nbChars; + updateText(); +} + +void Register::LineEdit::returnPressedSlot() +{ + bool ok; + uint v = fromAnyLabel(text(), &ok); + if (ok) _value = v; + updateText(); + emit modified(); +} + +void Register::LineEdit::keyPressEvent(QKeyEvent *e) +{ + if ( e->key()==Key_Escape ) clearFocus(); + else NumberLineEdit::keyPressEvent(e); +} + +//---------------------------------------------------------------------------- +Register::View::View(QWidget *parent, const char *name) + : QFrame(parent, name), GenericView(list()) +{} diff --git a/src/devices/gui/register_view.h b/src/devices/gui/register_view.h new file mode 100644 index 0000000..7ef8a54 --- /dev/null +++ b/src/devices/gui/register_view.h @@ -0,0 +1,105 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef REGISTER_VIEW_H +#define REGISTER_VIEW_H + +#include + +#include "devices/base/register.h" +#include "common/gui/number_gui.h" +#include "common/gui/list_view.h" + +namespace Register +{ +enum { PortBitRtti = 1000, RegisterRtti = 1001 }; + +//----------------------------------------------------------------------------- +class PortBitListViewItem : public KListViewItem +{ +public: + PortBitListViewItem(uint address, uint bit, KListViewItem *parent); + virtual int rtti() const { return PortBitRtti; } + void updateView(); + QString tooltip(int column) const; + +private: + uint _index, _bit; + + virtual void paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int align); +}; + +//----------------------------------------------------------------------------- +class ListViewItem : public EditListViewItem +{ +public: + ListViewItem(const TypeData &data, KListViewItem *item); + virtual int rtti() const { return RegisterRtti; } + virtual void updateView(); + const TypeData &data() const { return _data; } + QString tooltip(int column) const; + NumberBase base() const { return _base; } + void setBase(NumberBase base); + virtual QString label() const = 0; + virtual int compare(QListViewItem *item, int, bool) const; + +protected: + TypeData _data; + QValueList _items; + NumberBase _base; + + virtual void paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int align); + virtual QWidget *editWidgetFactory(int col) const; + virtual bool alwaysAcceptEdit(int) const { return false; } + virtual void editDone(int col, const QWidget *editWidget); + virtual uint nbCharsAddress() const = 0; + virtual QString text() const; + virtual void activate() {} +}; + +//----------------------------------------------------------------------------- +class LineEdit : public NumberLineEdit +{ +Q_OBJECT +public: + LineEdit(QWidget *parent, const char *name = 0); + void setValue(NumberBase base, BitValue value, uint nbChars); + BitValue value() const { return _value; } + +signals: + void modified(); + +protected: + virtual void keyPressEvent(QKeyEvent *e); + +private slots: + void updateText(); + void returnPressedSlot(); + +private: + NumberBase _base; + BitValue _value; + uint _nbChars; +}; + +//----------------------------------------------------------------------------- +class View : public QFrame, public GenericView +{ +Q_OBJECT +public: + View(QWidget *parent, const char *name); + +signals: + void readSignal(uint address); + void writeSignal(uint address, uint value); + void setWatchedSignal(uint address, bool watched); +}; + +} // namespace + +#endif diff --git a/src/devices/list/Makefile.am b/src/devices/list/Makefile.am new file mode 100644 index 0000000..ce1c03a --- /dev/null +++ b/src/devices/list/Makefile.am @@ -0,0 +1,11 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + + +noinst_LTLIBRARIES = libdevicelistnoui.la libdevicelistui.la + +libdevicelistnoui_la_LDFLAGS = $(all_libraries) +libdevicelistnoui_la_SOURCES = device_list.cpp device_list_noui.cpp + +libdevicelistui_la_LDFLAGS = $(all_libraries) +libdevicelistui_la_SOURCES = device_list.cpp device_list_ui.cpp diff --git a/src/devices/list/device_list.cpp b/src/devices/list/device_list.cpp new file mode 100644 index 0000000..1434ec8 --- /dev/null +++ b/src/devices/list/device_list.cpp @@ -0,0 +1,40 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "device_list.h" + +#include + +#include "devices/pic/pic/pic_group.h" +#include "devices/mem24/mem24/mem24_group.h" + +const Device::AutoData Device::AUTO_DATA = { "*", I18N_NOOP("") }; + +const Device::Data *Device::Lister::data(const QString &device) const +{ + for (ConstIterator it=begin(); it!=end(); it++) { + const Data *data = static_cast(it.data()->deviceData(device).data); + if (data) return data; + } + return 0; +} + +QString Device::Lister::checkName(const QString &device) const +{ + if ( device==AUTO_DATA.name ) return device; + if ( isSupported(device) ) return device; + if ( device.startsWith("p") ) // compat mode for PiKdev + return checkName(device.mid(1)); + return "16F871"; // default... +} + +namespace Device +{ + Lister _lister; + const Lister &lister() { return _lister; } +} diff --git a/src/devices/list/device_list.h b/src/devices/list/device_list.h new file mode 100644 index 0000000..3d9fb78 --- /dev/null +++ b/src/devices/list/device_list.h @@ -0,0 +1,34 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef DEVICE_LIST_H +#define DEVICE_LIST_H + +#include "devices/base/generic_device.h" +#include "common/common/lister.h" + +namespace Device +{ + +struct AutoData { + const char *name, *label; +}; +extern const AutoData AUTO_DATA; + +class Lister : public ::Group::Lister +{ +public: + Lister(); + const Data *data(const QString &device) const; + QString checkName(const QString &device) const; +}; +extern const Lister &lister(); + +} // namespace + +#endif diff --git a/src/devices/list/device_list_noui.cpp b/src/devices/list/device_list_noui.cpp new file mode 100644 index 0000000..46d909e --- /dev/null +++ b/src/devices/list/device_list_noui.cpp @@ -0,0 +1,18 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "device_list.h" + +#include "devices/pic/pic/pic_group.h" +#include "devices/mem24/mem24/mem24_group.h" + +Device::Lister::Lister() +{ + addGroup(new Pic::Group, 0); + addGroup(new Mem24::Group, 0); +} diff --git a/src/devices/list/device_list_ui.cpp b/src/devices/list/device_list_ui.cpp new file mode 100644 index 0000000..ebcd7ea --- /dev/null +++ b/src/devices/list/device_list_ui.cpp @@ -0,0 +1,20 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "device_list.h" + +#include "devices/pic/pic/pic_group.h" +#include "devices/pic/gui/pic_group_ui.h" +#include "devices/mem24/mem24/mem24_group.h" +#include "devices/mem24/gui/mem24_group_ui.h" + +Device::Lister::Lister() +{ + addGroup(new Pic::Group, new Pic::GroupUI); + addGroup(new Mem24::Group, new Mem24::GroupUI); +} diff --git a/src/devices/list/list.pro b/src/devices/list/list.pro new file mode 100644 index 0000000..02f07b0 --- /dev/null +++ b/src/devices/list/list.pro @@ -0,0 +1,6 @@ +STOPDIR = ../../.. +include($${STOPDIR}/lib.pro) + +TARGET = devicelist +HEADERS += device_list.h +SOURCES += device_list.cpp device_list_noui.cpp diff --git a/src/devices/mem24/Makefile.am b/src/devices/mem24/Makefile.am new file mode 100644 index 0000000..7c80d86 --- /dev/null +++ b/src/devices/mem24/Makefile.am @@ -0,0 +1,3 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO +SUBDIRS = base xml xml_data mem24 prog gui diff --git a/src/devices/mem24/base/Makefile.am b/src/devices/mem24/base/Makefile.am new file mode 100644 index 0000000..336afca --- /dev/null +++ b/src/devices/mem24/base/Makefile.am @@ -0,0 +1,6 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_LTLIBRARIES = libmem24base.la +libmem24base_la_LDFLAGS = $(all_libraries) +libmem24base_la_SOURCES = mem24.cpp diff --git a/src/devices/mem24/base/base.pro b/src/devices/mem24/base/base.pro new file mode 100644 index 0000000..a42b768 --- /dev/null +++ b/src/devices/mem24/base/base.pro @@ -0,0 +1,6 @@ +STOPDIR = ../../../.. +include($${STOPDIR}/lib.pro) + +TARGET = mem24base +HEADERS += mem24.h +SOURCES += mem24.cpp diff --git a/src/devices/mem24/base/mem24.cpp b/src/devices/mem24/base/mem24.cpp new file mode 100644 index 0000000..03bffe3 --- /dev/null +++ b/src/devices/mem24/base/mem24.cpp @@ -0,0 +1,22 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "mem24.h" + +QDataStream &Mem24::operator <<(QDataStream &s, const Data &data) +{ + s << static_cast(data); + s << data._nbBytes << data._nbBlocks << data._nbBytesPage; + return s; +} +QDataStream &Mem24::operator >>(QDataStream &s, Data &data) +{ + s >> static_cast(data); + s >> data._nbBytes >> data._nbBlocks >> data._nbBytesPage; + return s; +} diff --git a/src/devices/mem24/base/mem24.h b/src/devices/mem24/base/mem24.h new file mode 100644 index 0000000..d66ff47 --- /dev/null +++ b/src/devices/mem24/base/mem24.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef MEM24_H +#define MEM24_H + +#include "common/common/misc.h" +#include "devices/base/generic_device.h" + +namespace Mem24 +{ +class XmlToData; +class Group; + +//----------------------------------------------------------------------------- +class Data : public Device::Data +{ +public: + Data() : Device::Data(0) {} + virtual QString listViewGroup() const { return i18n("24 EEPROM"); } + uint nbBytes() const { return _nbBytes; } + virtual bool matchId(BitValue, Device::IdData &) const { return false; } + virtual uint nbBitsAddress() const { return nbBits(_nbBytes-1); } + virtual bool canWriteCalibration() const { return false; } + uint nbBlocks() const { return _nbBlocks; } + uint nbBytesPage() const { return _nbBytesPage; } + +private: + uint _nbBytes, _nbBlocks, _nbBytesPage; + + friend class XmlToData; + friend class Group; + friend QDataStream &operator <<(QDataStream &s, const Data &data); + friend QDataStream &operator >>(QDataStream &s, Data &data); +}; + +QDataStream &operator <<(QDataStream &s, const Data &data); +QDataStream &operator >>(QDataStream &s, Data &data); + +} // namespace + +#endif diff --git a/src/devices/mem24/gui/Makefile.am b/src/devices/mem24/gui/Makefile.am new file mode 100644 index 0000000..6838d57 --- /dev/null +++ b/src/devices/mem24/gui/Makefile.am @@ -0,0 +1,7 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_LTLIBRARIES = libmem24ui.la +libmem24ui_la_SOURCES = mem24_hex_view.cpp mem24_memory_editor.cpp \ + mem24_group_ui.cpp +libmem24ui_la_LDFLAGS = $(all_libraries) diff --git a/src/devices/mem24/gui/mem24_group_ui.cpp b/src/devices/mem24/gui/mem24_group_ui.cpp new file mode 100644 index 0000000..751e5a7 --- /dev/null +++ b/src/devices/mem24/gui/mem24_group_ui.cpp @@ -0,0 +1,16 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "mem24_group_ui.h" + +#include "mem24_hex_view.h" + +Device::HexView *Mem24::GroupUI::createHexView(const HexEditor &editor, QWidget *parent) const +{ + return new HexView(editor, parent); +} diff --git a/src/devices/mem24/gui/mem24_group_ui.h b/src/devices/mem24/gui/mem24_group_ui.h new file mode 100644 index 0000000..37766b5 --- /dev/null +++ b/src/devices/mem24/gui/mem24_group_ui.h @@ -0,0 +1,28 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef MEM24_GROUP_UI_H +#define MEM24_GROUP_UI_H + +#include "devices/gui/device_group_ui.h" + +namespace Mem24 +{ +class GroupUI : public Device::GroupUI +{ +public: + virtual Device::HexView *createHexView(const HexEditor &editor, QWidget *parent) const; + virtual Register::View *createRegisterView(QWidget *) const { return 0; } + virtual Device::MemoryEditor *createConfigEditor(Device::Memory &, QWidget *) const { return 0; } + virtual void fillWatchListContainer(ListContainer *, QValueVector &) const {} + virtual Register::ListViewItem *createWatchItem(const Register::TypeData &, KListViewItem *) const { return 0; } +}; + +} // namespace + +#endif diff --git a/src/devices/mem24/gui/mem24_hex_view.cpp b/src/devices/mem24/gui/mem24_hex_view.cpp new file mode 100644 index 0000000..0ada8d0 --- /dev/null +++ b/src/devices/mem24/gui/mem24_hex_view.cpp @@ -0,0 +1,38 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "mem24_hex_view.h" + +#include +#include +#include + +#include "mem24_memory_editor.h" + +Mem24::HexView::HexView(const HexEditor &editor, QWidget *parent) + : Device::HexView(editor, parent, "mem24_hex_view") +{} + +void Mem24::HexView::display() +{ + Memory *pmemory = static_cast(_memory); + MemoryTypeEditor *e = new MemoryTypeEditor(this, *pmemory, this); + e->init(true); + e->show(); + _top->addWidget(e); + addEditor(e); +} + +BitValue Mem24::HexView::checksum() const +{ + if ( _memory==0 ) return 0x0000; + BitValue cs = 0x0000; + for (uint i=0; i(_memory->device()).nbBytes(); i++) + cs += static_cast(_memory)->byte(i); + return cs.maskWith(0xFFFF); +} diff --git a/src/devices/mem24/gui/mem24_hex_view.h b/src/devices/mem24/gui/mem24_hex_view.h new file mode 100644 index 0000000..378a25e --- /dev/null +++ b/src/devices/mem24/gui/mem24_hex_view.h @@ -0,0 +1,33 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef MEM24_HEX_VIEW_H +#define MEM24_HEX_VIEW_H + +class QVBoxLayout; + +#include "devices/gui/hex_view.h" + +namespace Mem24 +{ + +class HexView : public Device::HexView +{ +Q_OBJECT +public: + HexView(const HexEditor &editor, QWidget *parent); + virtual uint nbChecksumChars() const { return 4; } + virtual BitValue checksum() const; + +private: + virtual void display(); +}; + +} // namespace + +#endif diff --git a/src/devices/mem24/gui/mem24_memory_editor.cpp b/src/devices/mem24/gui/mem24_memory_editor.cpp new file mode 100644 index 0000000..61f98fe --- /dev/null +++ b/src/devices/mem24/gui/mem24_memory_editor.cpp @@ -0,0 +1,80 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "mem24_memory_editor.h" + +#include +#include +#include + +#include "common/gui/misc_gui.h" +#include "mem24_hex_view.h" +#include "progs/base/generic_prog.h" +#include "libgui/main_global.h" +#include "devices/base/device_group.h" + +//----------------------------------------------------------------------------- +Mem24::MemoryRangeEditor::MemoryRangeEditor(Memory &memory, QWidget *parent) + : Device::MemoryRangeEditor(memory, 16, 16, 0, -1, parent, "mem24_memory_range_editor"), + MemoryCaster(memory) +{} + +Device::HexWordEditor *Mem24::MemoryRangeEditor::createHexWordEditor(QWidget *parent) +{ + return new HexWordEditor(memory(), parent); +} + +//----------------------------------------------------------------------------- +Mem24::MemoryTypeEditor::MemoryTypeEditor(const HexView *hexview, Memory &memory, QWidget *parent) + : Device::MemoryTypeEditor(hexview, memory, parent, "mem24_memory_type_editor"), + MemoryCaster(memory) +{} + +void Mem24::MemoryTypeEditor::init(bool first) +{ + Device::MemoryTypeEditor::init(first); + _title->setText(i18n("EEPROM Memory")); + MemoryRangeEditor *mre = new MemoryRangeEditor(memory(), this); + mre->init(); + addEditor(mre); + _top->addWidget(mre); +} + +bool Mem24::MemoryTypeEditor::internalDoAction(Device::Action action) +{ + switch (action) { + case Device::Clear: + case Device::ChecksumCheck: + memory().clear(); return true; + case Device::Zero: memory().fill(0); return true; + case Device::Reload: + Q_ASSERT(originalMemory()); + memory().copyFrom(*originalMemory()); return true; + case Device::Program: + Main::programmer()->program(memory(), Device::MemoryRange()); + return false; + case Device::Verify: + Main::programmer()->verify(memory(), Device::MemoryRange()); + return false; + case Device::Read: { + Memory mem(device()); + if ( !Main::programmer()->read(mem, Device::MemoryRange()) ) return false; + memory().copyFrom(mem); + return true; + } + case Device::Erase: + Main::programmer()->erase(Device::MemoryRange()); + return false; + case Device::BlankCheck: + Main::programmer()->blankCheck(Device::MemoryRange()); + return false; + case Device::Nb_Actions: break; + } + Q_ASSERT(false); + return false; +} diff --git a/src/devices/mem24/gui/mem24_memory_editor.h b/src/devices/mem24/gui/mem24_memory_editor.h new file mode 100644 index 0000000..eb99e97 --- /dev/null +++ b/src/devices/mem24/gui/mem24_memory_editor.h @@ -0,0 +1,77 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef MEM24_MEMORY_EDITOR_H +#define MEM24_MEMORY_EDITOR_H + +#include "devices/gui/memory_editor.h" +#include "devices/gui/hex_word_editor.h" +#include "devices/mem24/mem24/mem24_memory.h" + +namespace Mem24 +{ +class HexView; + +//----------------------------------------------------------------------------- +class MemoryCaster +{ +public: + MemoryCaster(Memory &memory) : _memory(memory) {} + const Data &device() const { return static_cast(_memory.device()); } + const Memory &memory() const { return static_cast(_memory); } + Memory &memory() { return static_cast(_memory); } + +private: + Memory &_memory; +}; + +//----------------------------------------------------------------------------- +class HexWordEditor : public Device::HexWordEditor, public MemoryCaster +{ +Q_OBJECT +public: + HexWordEditor(Memory &memory, QWidget *parent) + : Device::HexWordEditor(memory, 2, parent), MemoryCaster(memory) {} + +private: + virtual BitValue mask() const { return 0xFF; } + virtual BitValue normalizeWord(BitValue value) const { return value; } + virtual BitValue word() const { return memory().byte(_offset); } + virtual void setWord(BitValue value) { memory().setByte(_offset, value); } +}; + +//----------------------------------------------------------------------------- +class MemoryRangeEditor : public Device::MemoryRangeEditor, public MemoryCaster +{ +Q_OBJECT +public: + MemoryRangeEditor(Memory &memory, QWidget *parent); + +private: + virtual uint nbWords() const { return device().nbBytes(); } + virtual uint addressIncrement() const { return 1; } + virtual Address startAddress() const { return 0x0; } + virtual Device::HexWordEditor *createHexWordEditor(QWidget *parent); + virtual bool isRangeReadOnly() const { return false; } +}; + +//----------------------------------------------------------------------------- +class MemoryTypeEditor : public Device::MemoryTypeEditor, public MemoryCaster +{ +Q_OBJECT +public: + MemoryTypeEditor(const HexView *hexview, Memory &memory, QWidget *parent); + virtual void init(bool first); + +private: + virtual bool internalDoAction(Device::Action action); +}; + +} // namespace + +#endif diff --git a/src/devices/mem24/mem24.pro b/src/devices/mem24/mem24.pro new file mode 100644 index 0000000..0602143 --- /dev/null +++ b/src/devices/mem24/mem24.pro @@ -0,0 +1,2 @@ +TEMPLATE = subdirs +SUBDIRS = base xml mem24 xml_data prog diff --git a/src/devices/mem24/mem24/Makefile.am b/src/devices/mem24/mem24/Makefile.am new file mode 100644 index 0000000..3c7e9a8 --- /dev/null +++ b/src/devices/mem24/mem24/Makefile.am @@ -0,0 +1,6 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_LTLIBRARIES = libmem24.la +libmem24_la_LDFLAGS = $(all_libraries) +libmem24_la_SOURCES = mem24_memory.cpp mem24_group.cpp diff --git a/src/devices/mem24/mem24/mem24.pro b/src/devices/mem24/mem24/mem24.pro new file mode 100644 index 0000000..4bdbea4 --- /dev/null +++ b/src/devices/mem24/mem24/mem24.pro @@ -0,0 +1,6 @@ +STOPDIR = ../../../.. +include($${STOPDIR}/lib.pro) + +TARGET = mem24 +HEADERS += mem24_memory.h mem24_group.h +SOURCES += mem24_memory.cpp mem24_group.cpp diff --git a/src/devices/mem24/mem24/mem24_group.cpp b/src/devices/mem24/mem24/mem24_group.cpp new file mode 100644 index 0000000..53cad5b --- /dev/null +++ b/src/devices/mem24/mem24/mem24_group.cpp @@ -0,0 +1,43 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "mem24_group.h" + +#include "mem24_memory.h" + +Device::Memory *Mem24::Group::createMemory(const Device::Data &data) const +{ + return new Memory(static_cast(data)); +} + +QString Mem24::Group::informationHtml(const Device::Data &data) const +{ + const Mem24::Data &mdata = static_cast(data); + QString tmp = i18n("%1 bytes").arg(formatNumber(mdata.nbBytes())); + return htmlTableRow(i18n("Memory Size"), tmp); +} + +#if !defined(NO_KDE) +QPixmap Mem24::Group::memoryGraph(const Device::Data &data) const +{ + const Mem24::Data &mdata = static_cast(data); + uint offset = 0x0; + QValueList ranges; + for (uint i=0; i * + * * + * 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. * + ***************************************************************************/ +#ifndef MEM24_GROUP_H +#define MEM24_GROUP_H + +#include "common/global/global.h" +#include "devices/base/device_group.h" +#include "devices/mem24/base/mem24.h" + +namespace Mem24 +{ +extern const uint DATA_SIZE; +extern const char *DATA_STREAM; + +class Group : public Device::Group +{ +public: + virtual QString name() const { return "mem24"; } + virtual QString label() const { return i18n("Serial Memory 24"); } + virtual Device::Memory *createMemory(const Device::Data &data) const; + virtual QString informationHtml(const Device::Data &data) const; +#if !defined(NO_KDE) + virtual QPixmap memoryGraph(const Device::Data &data) const; +#endif + +private: + virtual uint dataSize() const { return DATA_SIZE; } + virtual const char *dataStream() const { return DATA_STREAM; } +}; + +} // namespace + +#endif diff --git a/src/devices/mem24/mem24/mem24_memory.cpp b/src/devices/mem24/mem24/mem24_memory.cpp new file mode 100644 index 0000000..a4296ea --- /dev/null +++ b/src/devices/mem24/mem24/mem24_memory.cpp @@ -0,0 +1,92 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "mem24_memory.h" + +#include + +#include "common/global/global.h" +#include "common/common/misc.h" + +Mem24::Memory::Memory(const Data &data) + : Device::Memory(data) +{ + fill(BitValue()); +} + +void Mem24::Memory::fill(BitValue value) +{ + _data = Device::Array(device().nbBytes()); + for (uint i=0; i<_data.count(); i++) _data[i] = value; +} + +void Mem24::Memory::copyFrom(const Device::Memory &memory) +{ + Q_ASSERT( device().name()==memory.device().name() ); + _data = static_cast(memory)._data; +} + +Device::Array Mem24::Memory::arrayForWriting() const +{ + Device::Array data(_data.count()); + for (uint i=0; ioffset ); + return _data[offset]; +} + +void Mem24::Memory::setByte(uint offset, BitValue value) +{ + Q_ASSERT( _data.size()>offset ); + Q_ASSERT( value<=0xFF ); + _data[offset] = value; +} + +BitValue Mem24::Memory::checksum() const +{ + BitValue cs = 0x0000; + for (uint i=0; i<_data.count(); i++) cs += _data[i]; + return cs.maskWith(0xFFFF); +} + +//----------------------------------------------------------------------------- +void Mem24::Memory::savePartial(QTextStream &stream, HexBuffer::Format format) const +{ + HexBuffer hb = toHexBuffer(); + hb.savePartial(stream, format); +} + +//----------------------------------------------------------------------------- +HexBuffer Mem24::Memory::toHexBuffer() const +{ + HexBuffer hb; + for (uint k=0; k &inRange) +{ + BitValue mask = 0xFF; + for (uint k=0; k * + * * + * 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. * + ***************************************************************************/ +#ifndef MEM24_MEMORY_H +#define MEM24_MEMORY_H + +#include "common/global/global.h" +#include "devices/base/generic_memory.h" +#include "devices/base/hex_buffer.h" +#include "devices/mem24/base/mem24.h" + +namespace Mem24 +{ + +class Memory : public Device::Memory +{ +public: + Memory(const Data &data); + const Data &device() const { return static_cast(_device); } + virtual void fill(BitValue value); + virtual void checksumCheckFill() { clear(); } + Device::Array arrayForWriting() const; + BitValue byte(uint offset) const; + void setByte(uint offset, BitValue value); + virtual BitValue checksum() const; + + virtual HexBuffer toHexBuffer() const; + virtual void copyFrom(const Device::Memory &memory); + +private: + Device::Array _data; + + virtual void savePartial(QTextStream &stream, HexBuffer::Format format) const; + virtual void fromHexBuffer(const HexBuffer &hb, WarningTypes &warningTypes, + QStringList &warnings, QMap &inRange); +}; + +} // namespace + +#endif diff --git a/src/devices/mem24/prog/Makefile.am b/src/devices/mem24/prog/Makefile.am new file mode 100644 index 0000000..1c1a55e --- /dev/null +++ b/src/devices/mem24/prog/Makefile.am @@ -0,0 +1,5 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_LTLIBRARIES = libmem24prog.la +libmem24prog_la_SOURCES = mem24_prog.cpp diff --git a/src/devices/mem24/prog/mem24_prog.cpp b/src/devices/mem24/prog/mem24_prog.cpp new file mode 100644 index 0000000..4c4b201 --- /dev/null +++ b/src/devices/mem24/prog/mem24_prog.cpp @@ -0,0 +1,88 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "mem24_prog.h" + +#include "common/global/global.h" +#include "devices/list/device_list.h" +#include "progs/base/prog_config.h" + +//----------------------------------------------------------------------------- +bool Programmer::Mem24DeviceSpecific::read(Device::Array &data, const VerifyData *vdata) +{ + setPowerOn(); + doRead(data, vdata); + setPowerOff(); + return !hasError(); +} + +bool Programmer::Mem24DeviceSpecific::write(const Device::Array &data) +{ + setPowerOn(); + doWrite(data); + setPowerOff(); + return !hasError(); +} + +bool Programmer::Mem24DeviceSpecific::verifyByte(uint index, BitValue d, const VerifyData &vdata) +{ + BitValue v = static_cast(vdata.memory).byte(index); + v = v.maskWith(0xFF); + d = d.maskWith(0xFF); + if ( v==d ) return true; + Address address = index; + if ( vdata.actions & BlankCheckVerify ) + log(Log::LineType::Error, i18n("Device memory is not blank (at address %1: reading %2 and expecting %3).") + .arg(toHexLabel(address, device().nbCharsAddress())).arg(toHexLabel(d, 2)).arg(toHexLabel(v, 2))); + else log(Log::LineType::Error, i18n("Device memory doesn't match hex file (at address %1: reading %2 and expecting %3).") + .arg(toHexLabel(address, device().nbCharsAddress())).arg(toHexLabel(d, 2)).arg(toHexLabel(v, 2))); + return false; +} + +//---------------------------------------------------------------------------- +uint Programmer::Mem24Base::nbSteps(Task task, const Device::MemoryRange *) const +{ + uint nb = device()->nbBytes(); + if ( task==Task::Write && readConfigEntry(Config::VerifyAfterProgram).toBool() ) nb += device()->nbBytes(); + return nb; +} + +bool Programmer::Mem24Base::internalErase(const Device::MemoryRange &) +{ + initProgramming(); + Mem24::Memory memory(*device()); + return specific()->write(memory.arrayForWriting()); +} + +bool Programmer::Mem24Base::internalRead(Device::Memory *memory, const Device::MemoryRange &, const VerifyData *vdata) +{ + initProgramming(); + Device::Array data; + if ( !specific()->read(data, vdata) ) return false; + if (memory) for (uint i=0; i(memory)->setByte(i, data[i]); + return true; +} + +bool Programmer::Mem24Base::internalProgram(const Device::Memory &memory, const Device::MemoryRange &) +{ + initProgramming(); + const Mem24::Memory &pmemory = static_cast(memory); + const Device::Array &data = pmemory.arrayForWriting(); + if ( !specific()->write(data) ) return false; + if ( !readConfigEntry(Config::VerifyAfterProgram).toBool() ) return true; + VerifyActions actions = IgnoreProtectedVerify; + if ( readConfigEntry(Config::OnlyVerifyProgrammed).toBool() ) actions |= OnlyProgrammedVerify; + VerifyData vdata(actions, pmemory); + Device::Array adata; + return specific()->read(adata, &vdata); +} + +bool Programmer::Mem24Base::verifyDeviceId() +{ + return specific()->verifyPresence(); +} diff --git a/src/devices/mem24/prog/mem24_prog.h b/src/devices/mem24/prog/mem24_prog.h new file mode 100644 index 0000000..86948c2 --- /dev/null +++ b/src/devices/mem24/prog/mem24_prog.h @@ -0,0 +1,63 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef MEM24_PROG_H +#define MEM24_PROG_H + +#include "progs/base/generic_prog.h" +#include "devices/mem24/mem24/mem24_memory.h" + +namespace Programmer +{ +//----------------------------------------------------------------------------- +class Mem24DeviceSpecific : public DeviceSpecific +{ +public: + Mem24DeviceSpecific(::Programmer::Base &base) : DeviceSpecific(base) {} + const Mem24::Data &device() const { return static_cast(*_base.device()); } + bool read(Device::Array &data, const VerifyData *vdata); + bool write(const Device::Array &data); + bool verifyByte(uint index, BitValue d, const VerifyData &vdata); + virtual bool verifyPresence() = 0; + +protected: + virtual bool doRead(Device::Array &data, const VerifyData *vdata) = 0; + virtual bool doWrite(const Device::Array &data) = 0; +}; + +//----------------------------------------------------------------------------- +class Mem24Hardware : public Hardware +{ +public: + Mem24Hardware(::Programmer::Base &base, Port::Base *port, const QString &name) : Hardware(base, port, name) {} + const Mem24::Data &device() const { return static_cast(*_base.device()); } +}; + +//----------------------------------------------------------------------------- +class Mem24Base : public Base +{ +public: + Mem24Base(const Group &group, const Mem24::Data *data, const char *name) : Base(group, data, name) {} + const Mem24::Data *device() const { return static_cast(_device); } + +protected: + Mem24DeviceSpecific *specific() const { return static_cast(_specific); } + virtual bool verifyDeviceId(); + virtual uint nbSteps(Task task, const Device::MemoryRange *range) const; + virtual bool initProgramming() { return true; } + virtual bool checkErase() { return true; } + virtual bool internalErase(const Device::MemoryRange &range); + virtual bool checkRead() { return true; } + virtual bool internalRead(Device::Memory *memory, const Device::MemoryRange &range, const VerifyData *vdata); + virtual bool checkProgram(const Device::Memory &) { return true; } + virtual bool internalProgram(const Device::Memory &memory, const Device::MemoryRange &range); +}; + +} // namespace + +#endif diff --git a/src/devices/mem24/prog/prog.pro b/src/devices/mem24/prog/prog.pro new file mode 100644 index 0000000..2acd347 --- /dev/null +++ b/src/devices/mem24/prog/prog.pro @@ -0,0 +1,6 @@ +STOPDIR = ../../../.. +include($${STOPDIR}/lib.pro) + +TARGET = mem24prog +HEADERS += mem24_prog.h +SOURCES += mem24_prog.cpp diff --git a/src/devices/mem24/xml/Makefile.am b/src/devices/mem24/xml/Makefile.am new file mode 100644 index 0000000..88a4305 --- /dev/null +++ b/src/devices/mem24/xml/Makefile.am @@ -0,0 +1,12 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_PROGRAMS = mem24_xml_to_data + +mem24_xml_to_data_SOURCES = mem24_xml_to_data.cpp +mem24_xml_to_data_DEPENDENCIES = $(top_builddir)/src/devices/mem24/base/libmem24base.la \ + $(top_builddir)/src/xml_to_data/libxmltodata.la $(top_builddir)/src/devices/base/libdevicebase.la \ + $(top_builddir)/src/common/common/libcommon.la +mem24_xml_to_data_LDADD = $(top_builddir)/src/devices/mem24/base/libmem24base.la \ + $(top_builddir)/src/xml_to_data/libxmltodata.la $(top_builddir)/src/devices/base/libdevicebase.la \ + $(top_builddir)/src/common/common/libcommon.la $(LIB_KDECORE) diff --git a/src/devices/mem24/xml/mem24_xml_to_data.cpp b/src/devices/mem24/xml/mem24_xml_to_data.cpp new file mode 100644 index 0000000..734ebca --- /dev/null +++ b/src/devices/mem24/xml/mem24_xml_to_data.cpp @@ -0,0 +1,60 @@ +/*************************************************************************** + * Copyright (C) 2006-2007 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include +#include + +#include "xml_to_data/device_xml_to_data.h" +#include "common/common/misc.h" +#include "devices/mem24/base/mem24.h" + +namespace Mem24 +{ + +class XmlToData : public Device::XmlToData +{ +private: + virtual uint nbOutputFiles(uint) const { return 1; } + virtual bool isIncluded(uint, uint) const { return true; } + virtual QString namespaceName() const { return "Mem24"; } + +virtual void processDevice(QDomElement device) +{ + Device::XmlToDataBase::processDevice(device); + + QDomElement e = findUniqueElement(device, "memory", "name", QString::null); + bool ok; + data()->_nbBytes = fromHexLabel(e.attribute("size"), &ok); + if ( !ok ) qFatal("Missing or invalid size"); + data()->_nbBlocks = e.attribute("nb_blocks").toUInt(&ok); + if ( !ok || data()->_nbBlocks==0 ) qFatal("Missing, zero, or invalid nb_blocks"); + if ( (data()->_nbBytes % data()->_nbBlocks)!=0 ) qFatal("nb_blocks should divide size"); + if ( data()->_nbBlocks>8 ) qFatal("nb_blocks is too large (>8)"); + data()->_nbBytesPage = e.attribute("page_size").toUInt(&ok); + if ( !ok || data()->_nbBytesPage==0 ) qFatal("Missing, zero, or invalid page_size"); + if ( ((data()->_nbBytes/data()->_nbBlocks) % data()->_nbBytesPage)!=0 ) qFatal("page_size should divide size/nb_blocks"); + QStringList names; + names.append(QString::null); + checkTagNames(device, "memory", names); +} + +virtual void checkPins(const QMap &pinLabels) const +{ + if ( !pinLabels.contains("VCC") ) qFatal("No VDD pin specified"); + if ( !pinLabels.contains("VSS") ) qFatal("No VSS pin specified"); + QMap::const_iterator it; + for (it=pinLabels.begin(); it!=pinLabels.end(); ++it) + if ( it.data()!=1 ) qFatal(QString("Duplicated pin %1").arg(it.key())); +} + +}; // class + +} // namespace + +//----------------------------------------------------------------------------- +XML_MAIN(Mem24::XmlToData) diff --git a/src/devices/mem24/xml/xml.pro b/src/devices/mem24/xml/xml.pro new file mode 100644 index 0000000..9730b29 --- /dev/null +++ b/src/devices/mem24/xml/xml.pro @@ -0,0 +1,13 @@ +STOPDIR = ../../../.. +include($${STOPDIR}/app.pro) + +TARGET = mem24_xml_to_data +SOURCES += mem24_xml_to_data.cpp +LIBS += ../../../devices/mem24/base/libmem24base.a ../../../xml_to_data/libxmltodata.a \ + ../../../devices/base/libdevicebase.a ../../../common/global/libglobal.a \ + ../../../common/nokde/libnokde.a ../../../common/common/libcommon.a + +unix:QMAKE_POST_LINK = cd ../xml_data && ../xml/mem24_xml_to_data +unix:QMAKE_CLEAN += ../xml_data/mem24_data.cpp +win32:QMAKE_POST_LINK = cd ..\xml_data && ..\xml\mem24_xml_to_data.exe +win32:QMAKE_CLEAN += ..\xml_data\mem24_data.cpp diff --git a/src/devices/mem24/xml_data/24AA00.xml b/src/devices/mem24/xml_data/24AA00.xml new file mode 100644 index 0000000..6b9e114 --- /dev/null +++ b/src/devices/mem24/xml_data/24AA00.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA01.xml b/src/devices/mem24/xml_data/24AA01.xml new file mode 100644 index 0000000..f3aa59d --- /dev/null +++ b/src/devices/mem24/xml_data/24AA01.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA014.xml b/src/devices/mem24/xml_data/24AA014.xml new file mode 100644 index 0000000..91b93ca --- /dev/null +++ b/src/devices/mem24/xml_data/24AA014.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA02.xml b/src/devices/mem24/xml_data/24AA02.xml new file mode 100644 index 0000000..a4c3174 --- /dev/null +++ b/src/devices/mem24/xml_data/24AA02.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA024.xml b/src/devices/mem24/xml_data/24AA024.xml new file mode 100644 index 0000000..7d2bfe5 --- /dev/null +++ b/src/devices/mem24/xml_data/24AA024.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA025.xml b/src/devices/mem24/xml_data/24AA025.xml new file mode 100644 index 0000000..174c163 --- /dev/null +++ b/src/devices/mem24/xml_data/24AA025.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA04.xml b/src/devices/mem24/xml_data/24AA04.xml new file mode 100644 index 0000000..18ca2ac --- /dev/null +++ b/src/devices/mem24/xml_data/24AA04.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA08.xml b/src/devices/mem24/xml_data/24AA08.xml new file mode 100644 index 0000000..84852f2 --- /dev/null +++ b/src/devices/mem24/xml_data/24AA08.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA1025.xml b/src/devices/mem24/xml_data/24AA1025.xml new file mode 100644 index 0000000..54940f3 --- /dev/null +++ b/src/devices/mem24/xml_data/24AA1025.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA128.xml b/src/devices/mem24/xml_data/24AA128.xml new file mode 100644 index 0000000..bf113e8 --- /dev/null +++ b/src/devices/mem24/xml_data/24AA128.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA16.xml b/src/devices/mem24/xml_data/24AA16.xml new file mode 100644 index 0000000..fb471b5 --- /dev/null +++ b/src/devices/mem24/xml_data/24AA16.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA164.xml b/src/devices/mem24/xml_data/24AA164.xml new file mode 100644 index 0000000..76ac031 --- /dev/null +++ b/src/devices/mem24/xml_data/24AA164.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA256.xml b/src/devices/mem24/xml_data/24AA256.xml new file mode 100644 index 0000000..899389d --- /dev/null +++ b/src/devices/mem24/xml_data/24AA256.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA32A.xml b/src/devices/mem24/xml_data/24AA32A.xml new file mode 100644 index 0000000..bc8d0f4 --- /dev/null +++ b/src/devices/mem24/xml_data/24AA32A.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA512.xml b/src/devices/mem24/xml_data/24AA512.xml new file mode 100644 index 0000000..baa575e --- /dev/null +++ b/src/devices/mem24/xml_data/24AA512.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA515.xml b/src/devices/mem24/xml_data/24AA515.xml new file mode 100644 index 0000000..b80a53a --- /dev/null +++ b/src/devices/mem24/xml_data/24AA515.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA64.xml b/src/devices/mem24/xml_data/24AA64.xml new file mode 100644 index 0000000..0d52b6b --- /dev/null +++ b/src/devices/mem24/xml_data/24AA64.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24AA65.xml b/src/devices/mem24/xml_data/24AA65.xml new file mode 100644 index 0000000..b35b50b --- /dev/null +++ b/src/devices/mem24/xml_data/24AA65.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24C00.xml b/src/devices/mem24/xml_data/24C00.xml new file mode 100644 index 0000000..13bc0f7 --- /dev/null +++ b/src/devices/mem24/xml_data/24C00.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24C01C.xml b/src/devices/mem24/xml_data/24C01C.xml new file mode 100644 index 0000000..3526522 --- /dev/null +++ b/src/devices/mem24/xml_data/24C01C.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24C02C.xml b/src/devices/mem24/xml_data/24C02C.xml new file mode 100644 index 0000000..f4ce091 --- /dev/null +++ b/src/devices/mem24/xml_data/24C02C.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24C65.xml b/src/devices/mem24/xml_data/24C65.xml new file mode 100644 index 0000000..6f9be98 --- /dev/null +++ b/src/devices/mem24/xml_data/24C65.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24FC1025.xml b/src/devices/mem24/xml_data/24FC1025.xml new file mode 100644 index 0000000..c783952 --- /dev/null +++ b/src/devices/mem24/xml_data/24FC1025.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24FC128.xml b/src/devices/mem24/xml_data/24FC128.xml new file mode 100644 index 0000000..88b0c8e --- /dev/null +++ b/src/devices/mem24/xml_data/24FC128.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24FC256.xml b/src/devices/mem24/xml_data/24FC256.xml new file mode 100644 index 0000000..08595ed --- /dev/null +++ b/src/devices/mem24/xml_data/24FC256.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24FC512.xml b/src/devices/mem24/xml_data/24FC512.xml new file mode 100644 index 0000000..0811a8d --- /dev/null +++ b/src/devices/mem24/xml_data/24FC512.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24FC515.xml b/src/devices/mem24/xml_data/24FC515.xml new file mode 100644 index 0000000..9469c8c --- /dev/null +++ b/src/devices/mem24/xml_data/24FC515.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC00.xml b/src/devices/mem24/xml_data/24LC00.xml new file mode 100644 index 0000000..b6b588e --- /dev/null +++ b/src/devices/mem24/xml_data/24LC00.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC014.xml b/src/devices/mem24/xml_data/24LC014.xml new file mode 100644 index 0000000..f3dd3e7 --- /dev/null +++ b/src/devices/mem24/xml_data/24LC014.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC01B.xml b/src/devices/mem24/xml_data/24LC01B.xml new file mode 100644 index 0000000..f96bc6d --- /dev/null +++ b/src/devices/mem24/xml_data/24LC01B.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC024.xml b/src/devices/mem24/xml_data/24LC024.xml new file mode 100644 index 0000000..7fa84bf --- /dev/null +++ b/src/devices/mem24/xml_data/24LC024.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC025.xml b/src/devices/mem24/xml_data/24LC025.xml new file mode 100644 index 0000000..8f5df38 --- /dev/null +++ b/src/devices/mem24/xml_data/24LC025.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC02B.xml b/src/devices/mem24/xml_data/24LC02B.xml new file mode 100644 index 0000000..3e34cde --- /dev/null +++ b/src/devices/mem24/xml_data/24LC02B.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC04B.xml b/src/devices/mem24/xml_data/24LC04B.xml new file mode 100644 index 0000000..0f83be9 --- /dev/null +++ b/src/devices/mem24/xml_data/24LC04B.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC08B.xml b/src/devices/mem24/xml_data/24LC08B.xml new file mode 100644 index 0000000..a617e0c --- /dev/null +++ b/src/devices/mem24/xml_data/24LC08B.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC1025.xml b/src/devices/mem24/xml_data/24LC1025.xml new file mode 100644 index 0000000..79ba144 --- /dev/null +++ b/src/devices/mem24/xml_data/24LC1025.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC128.xml b/src/devices/mem24/xml_data/24LC128.xml new file mode 100644 index 0000000..b850eac --- /dev/null +++ b/src/devices/mem24/xml_data/24LC128.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC16B.xml b/src/devices/mem24/xml_data/24LC16B.xml new file mode 100644 index 0000000..f07bd5e --- /dev/null +++ b/src/devices/mem24/xml_data/24LC16B.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC21A.xml b/src/devices/mem24/xml_data/24LC21A.xml new file mode 100644 index 0000000..010b3a2 --- /dev/null +++ b/src/devices/mem24/xml_data/24LC21A.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC22A.xml b/src/devices/mem24/xml_data/24LC22A.xml new file mode 100644 index 0000000..237b47e --- /dev/null +++ b/src/devices/mem24/xml_data/24LC22A.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC256.xml b/src/devices/mem24/xml_data/24LC256.xml new file mode 100644 index 0000000..5a49ee9 --- /dev/null +++ b/src/devices/mem24/xml_data/24LC256.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC32A.xml b/src/devices/mem24/xml_data/24LC32A.xml new file mode 100644 index 0000000..abd17f2 --- /dev/null +++ b/src/devices/mem24/xml_data/24LC32A.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC512.xml b/src/devices/mem24/xml_data/24LC512.xml new file mode 100644 index 0000000..f643c99 --- /dev/null +++ b/src/devices/mem24/xml_data/24LC512.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC515.xml b/src/devices/mem24/xml_data/24LC515.xml new file mode 100644 index 0000000..55482b3 --- /dev/null +++ b/src/devices/mem24/xml_data/24LC515.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC64.xml b/src/devices/mem24/xml_data/24LC64.xml new file mode 100644 index 0000000..d35cf1a --- /dev/null +++ b/src/devices/mem24/xml_data/24LC64.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LC65.xml b/src/devices/mem24/xml_data/24LC65.xml new file mode 100644 index 0000000..3fb3fbb --- /dev/null +++ b/src/devices/mem24/xml_data/24LC65.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/24LCS21A.xml b/src/devices/mem24/xml_data/24LCS21A.xml new file mode 100644 index 0000000..0cb4846 --- /dev/null +++ b/src/devices/mem24/xml_data/24LCS21A.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/mem24/xml_data/Makefile.am b/src/devices/mem24/xml_data/Makefile.am new file mode 100644 index 0000000..42cacaa --- /dev/null +++ b/src/devices/mem24/xml_data/Makefile.am @@ -0,0 +1,12 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_LTLIBRARIES = libmem24xml.la +libmem24xml_la_LDFLAGS = $(all_libraries) +libmem24xml_la_SOURCES = mem24_data.cpp +libmem24xml_la_DEPENDENCIES = mem24_data.cpp + +include deps.mak +mem24_data.cpp: ../xml/mem24_xml_to_data $(noinst_DATA) + ../xml/mem24_xml_to_data +CLEANFILES = mem24_data.cpp diff --git a/src/devices/mem24/xml_data/deps.mak b/src/devices/mem24/xml_data/deps.mak new file mode 100644 index 0000000..5c1f243 --- /dev/null +++ b/src/devices/mem24/xml_data/deps.mak @@ -0,0 +1,6 @@ +noinst_DATA = \ + 24AA00.xml 24AA01.xml 24AA014.xml 24AA02.xml 24AA024.xml 24AA025.xml 24AA04.xml 24AA08.xml 24AA1025.xml 24AA128.xml\ + 24AA16.xml 24AA164.xml 24AA256.xml 24AA32A.xml 24AA512.xml 24AA515.xml 24AA64.xml 24AA65.xml 24C00.xml 24C01C.xml\ + 24C02C.xml 24C65.xml 24FC1025.xml 24FC128.xml 24FC256.xml 24FC512.xml 24FC515.xml 24LC00.xml 24LC014.xml 24LC01B.xml\ + 24LC024.xml 24LC025.xml 24LC02B.xml 24LC04B.xml 24LC08B.xml 24LC1025.xml 24LC128.xml 24LC16B.xml 24LC21A.xml 24LC22A.xml\ + 24LC256.xml 24LC32A.xml 24LC512.xml 24LC515.xml 24LC64.xml 24LC65.xml 24LCS21A.xml diff --git a/src/devices/mem24/xml_data/xml_data.pro b/src/devices/mem24/xml_data/xml_data.pro new file mode 100644 index 0000000..4842ae2 --- /dev/null +++ b/src/devices/mem24/xml_data/xml_data.pro @@ -0,0 +1,5 @@ +STOPDIR = ../../../.. +include($${STOPDIR}/lib.pro) + +TARGET = mem24xml +SOURCES += mem24_data.cpp diff --git a/src/devices/pic/Makefile.am b/src/devices/pic/Makefile.am new file mode 100644 index 0000000..13e5611 --- /dev/null +++ b/src/devices/pic/Makefile.am @@ -0,0 +1,3 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO +SUBDIRS = base xml xml_data pic prog gui diff --git a/src/devices/pic/base/Makefile.am b/src/devices/pic/base/Makefile.am new file mode 100644 index 0000000..ebade1c --- /dev/null +++ b/src/devices/pic/base/Makefile.am @@ -0,0 +1,6 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_LTLIBRARIES = libpicbase.la +libpicbase_la_SOURCES = pic.cpp pic_config.cpp pic_protection.cpp \ + pic_register.cpp diff --git a/src/devices/pic/base/base.pro b/src/devices/pic/base/base.pro new file mode 100644 index 0000000..621d6d3 --- /dev/null +++ b/src/devices/pic/base/base.pro @@ -0,0 +1,6 @@ +STOPDIR = ../../../.. +include($${STOPDIR}/lib.pro) + +TARGET = picbase +HEADERS += pic_protection.h pic_config.h pic_register.h pic.h +SOURCES += pic_protection.cpp pic_config.cpp pic_register.cpp pic.cpp diff --git a/src/devices/pic/base/pic.cpp b/src/devices/pic/base/pic.cpp new file mode 100644 index 0000000..8f81540 --- /dev/null +++ b/src/devices/pic/base/pic.cpp @@ -0,0 +1,426 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic.h" + +#include "common/global/global.h" +#include "common/common/misc.h" +#include "common/global/purl.h" +#include "pic_register.h" +#include "pic_config.h" + +//------------------------------------------------------------------------------ +const Pic::ProgVoltageType::Data Pic::ProgVoltageType::DATA[Nb_Types] = { + { "vpp", 0 }, + { "vdd_prog", 0 }, + { "vdd_prog_write", 0 } +}; + +const Pic::MemoryRangeType::Data Pic::MemoryRangeType::DATA[Nb_Types] = { + { "code", I18N_NOOP("Code memory"), Writable }, + { "calibration", I18N_NOOP("Calibration"), Writable }, + { "user_ids", I18N_NOOP("User IDs"), Writable }, + { "device_id", I18N_NOOP("Device ID"), ReadOnly }, + { "config", I18N_NOOP("Configuration Bits"), Writable }, + { "eeprom", I18N_NOOP("Data EEPROM"), Writable }, + { "debug_vector", I18N_NOOP("Debug Vector"), Writable }, + { "hardware_stack", I18N_NOOP("Hardware Stack"), ReadOnly }, + { "calibration_backup", I18N_NOOP("Calibration Backup"), Writable }, + { "program_executive", I18N_NOOP("Program Executive"), Writable } +}; + +const Pic::SelfWrite::Data Pic::SelfWrite::DATA[Nb_Types] = { + { "yes", 0 }, + { "no", 0 } +}; + +const Pic::DeviceType::Data Pic::DeviceType::DATA[Nb_Types] = { + { 0, I18N_NOOP("Normal") }, + { 0, I18N_NOOP("J") }, + { 0, I18N_NOOP("K") } +}; + +const Pic::Architecture::Data Pic::Architecture::DATA[Nb_Types] = { +// name family_label nbBytesPC nbBytesWord packed nbBitsRegister registerBankLength +// {Code, Cal, UserID, DevId, Conf, EEPROM, DebugVec, HardStack, CalBackup, Program Executive} randomAccess + { "10X", I18N_NOOP("Baseline Family"), 0, 2, false, 8, 0x020, { 12, 12, 12, 12, 12, 8, 12, 0, 12, 0 }, false, SelfWrite::No, DeviceType::Normal }, // 9, 10, 11 or 12-bit program counter + { "16X", I18N_NOOP("Midrange Family"), 13, 2, false, 8, 0x080, { 14, 14, 14, 14, 14, 8, 14, 0, 14, 0 }, false, SelfWrite::Nb_Types, DeviceType::Normal }, // max eeprom: 256 words + { "17C", I18N_NOOP("17C Family"), 16, 2, false, 8, 0x100, { 16, 0, 0, 0, 16, 8, 0, 0, 0, 0 }, true, SelfWrite::No, DeviceType::Normal }, + { "18C", I18N_NOOP("18C Family"), 21, 2, true, 8, 0x100, { 16, 8, 8, 8, 8, 8, 16, 0, 8, 0 }, true, SelfWrite::No, DeviceType::Normal }, + { "18F", I18N_NOOP("18F Family"), 21, 2, true, 8, 0x100, { 16, 8, 8, 8, 8, 8, 16, 0, 8, 0 }, true, SelfWrite::Nb_Types, DeviceType::Normal }, + { "18J", I18N_NOOP("18J Family"), 21, 2, true, 8, 0x100, { 16, 8, 8, 8, 8, 8, 16, 0, 8, 0 }, true, SelfWrite::Yes, DeviceType::J }, + { "24F", I18N_NOOP("24F Family"), 23, 4, false, 16, 0x800, { 24, 0, 0, 16, 24, 0, 24, 0, 0, 24 }, true, SelfWrite::Yes, DeviceType::J }, + { "24H", I18N_NOOP("24H Family"), 23, 4, false, 16, 0x800, { 24, 0, 8, 16, 8, 0, 24, 0, 0, 24 }, true, SelfWrite::Yes, DeviceType::J }, + { "30F", I18N_NOOP("30F Family"), 23, 4, false, 16, 0xA00, { 24, 0, 24, 16, 16, 16, 24, 0, 0, 24 }, true, SelfWrite::Yes, DeviceType::Normal }, // dsPIC: eeprom max = 2 kwords = 4 kbytes + { "33F", I18N_NOOP("33F Family"), 23, 4, false, 16, 0x800, { 24, 0, 8, 16, 8, 0, 24, 0, 0, 24 }, true, SelfWrite::Yes, DeviceType::J } +}; + +const Pic::Checksum::Algorithm::Data Pic::Checksum::Algorithm::DATA[Nb_Types] = { + { "", 0 }, + { "XOR4", 0 }, + { "XNOR7", 0 }, + { "XNOR8", 0 } +}; + +const Pic::Feature::Data Pic::Feature::DATA[Nb_Types] = { + { "ccp", I18N_NOOP("CCP") }, + { "adc", I18N_NOOP("ADC") }, + { "ssp", I18N_NOOP("SSP") }, + { "lvd", I18N_NOOP("Low Voltage Detect") }, + { "usb", I18N_NOOP("USB") }, + { "usart", I18N_NOOP("USART") }, + { "can", I18N_NOOP("CAN") }, + { "ecan", I18N_NOOP("ECAN") }, + { "ethernet", I18N_NOOP("Ethernet") }, + { "lcd", I18N_NOOP("LCD") }, + { "motor_control", I18N_NOOP("Motor Control") }, + { "motion_feedback", I18N_NOOP("Motion Feeback") }, + { "self_write", I18N_NOOP("Self-Write") } +}; + +//----------------------------------------------------------------------------- +Pic::Data::Data() + : Device::Data(new RegistersData(*this)) +{ + FOR_EACH(ProgVoltageType, type) { + _voltages[type].min = 0.0; + _voltages[type].max = 0.0; + _voltages[type].nominal = 0.0; + } + FOR_EACH(MemoryRangeType, type) { + _ranges[type].properties = NotPresent; + _ranges[type].start = 0; + _ranges[type].end = 0; + _ranges[type].hexFileOffset = 0; + } + _config = new Config(*this); + _calibration.opcode = 0; + _calibration.opcodeMask = 0; +} + +Pic::Data::~Data() +{ + delete _config; +} + +bool Pic::Data::isReadable(MemoryRangeType type) const +{ + return ( range(type).properties & Programmable ); +} + +bool Pic::Data::isWritable(MemoryRangeType type) const +{ + return ( (type.data().properties & Writable) && (range(type).properties & Programmable) ); +} + +uint Pic::Data::addressIncrement(MemoryRangeType type) const +{ + uint inc = _architecture.data().nbBytesWord; + if ( _architecture.data().packed + && ( type==MemoryRangeType::Code || type==MemoryRangeType::DebugVector ) ) return inc; + return inc / 2; +} + +uint Pic::Data::nbWords(MemoryRangeType type) const +{ + if ( !isPresent(type) ) return 0; + return nbAddresses(type) / addressIncrement(type); +} + +uint Pic::Data::nbAddresses(MemoryRangeType type) const +{ + if ( !isPresent(type) ) return 0; + return (range(type).end - range(type).start + 1); +} + +QString Pic::Data::fname(Device::Special special) const +{ + QString s = name(); + switch (special.type()) { + case Device::Special::Normal: break; + case Device::Special::LowPower: + // assume name is of form "NNX..." + s.insert(2, 'L'); + break; + case Device::Special::LowVoltage: + // assume name is of form "NNXN..." + s.replace(2, 1, "LV"); + break; + case Device::Special::HighVoltage: + // assume name is of form "NNXN..." + s.replace(2, 1, "HV"); + break; + case Device::Special::Nb_Types: Q_ASSERT(false); break; + } + return s; +} + +bool Pic::Data::matchId(BitValue rawId, Device::IdData &idata) const +{ + if ( !isPresent(MemoryRangeType::DeviceId) ) return false; + QMap::const_iterator it; + for (it=_ids.begin(); it!=_ids.end(); ++it) { + idata.special = it.key(); + BitValue nid = 0x0; + switch (architecture().type()) { + case Architecture::P10X: + case Architecture::P16X: + case Architecture::P17C: + case Architecture::P18C: + case Architecture::P18F: + case Architecture::P18J: + nid = rawId.clearMaskBits(0x1F); + idata.revision = rawId.maskWith(0x1F); + break; + case Architecture::P24F: + nid = (rawId >> 16).maskWith(0x3FFF); + idata.revision = (rawId >> 6).maskWith(0x7); + idata.minorRevision = rawId.maskWith(0x7); + break; + case Architecture::P30F: + nid = (rawId >> 16).maskWith(0xFFFF); + idata.revision = (rawId >> 6).maskWith(0x3F); + idata.minorRevision = rawId.maskWith(0x3F); + idata.process = (rawId >> 12).maskWith(0xF); + break; + case Architecture::P24H: + case Architecture::P33F: + nid = (rawId >> 16).maskWith(0xFFFF); + idata.revision = rawId.maskWith(0xFFFF); // ?? + break; + case Architecture::Nb_Types: Q_ASSERT(false); break; + } + if ( nid==it.data() ) return true; + } + return false; +} + +QStringList Pic::Data::idNames(const QMap &ids) const +{ + QStringList list; + QMap::const_iterator it; + for (it=ids.begin(); it!=ids.end(); ++it) { + switch (_architecture.type()) { + case Architecture::P10X: + case Architecture::P16X: + case Architecture::P17C: + case Architecture::P18C: + case Architecture::P18F: + case Architecture::P18J: + list += i18n("%1 (rev. %2)").arg(it.key()).arg(toLabel(it.data().revision)); + break; + case Architecture::P24F: + list += i18n("%1 (rev. %2.%3)").arg(it.key()).arg(toLabel(it.data().revision)).arg(toLabel(it.data().minorRevision)); + break; + case Architecture::P30F: + list += i18n("%1 (proc. %2; rev. %3.%4)").arg(it.key()).arg(toLabel(it.data().process)).arg(toLabel(it.data().revision)).arg(toLabel(it.data().minorRevision)); + break; + case Architecture::P24H: + case Architecture::P33F: + list += i18n("%1 (rev. %2)").arg(it.key()).arg(toLabel(it.data().revision)); + break; + case Architecture::Nb_Types: Q_ASSERT(false); break; + } + } + return list; +} + +bool Pic::Data::checkCalibration(const Device::Array &data, QString *message) const +{ + Q_ASSERT( nbWords(MemoryRangeType::Cal)==data.count() ); + for (uint i=0; i(*_registersData); +} + +bool Pic::Data::hasFeature(Feature feature, bool *unknown) const +{ + bool ok = ( registersData().nbBanks!=0 ); + if (unknown) *unknown = !ok; + if (!ok) return false; + switch (feature.type()) { + case Feature::CCP: return registersData().sfrs.contains("CCP1CON"); + case Feature::ADC: return registersData().sfrs.contains("ADCON0"); + case Feature::SSP: return registersData().sfrs.contains("SSPCON"); + case Feature::LVD: return registersData().sfrs.contains("LVDCON"); + case Feature::USB: return registersData().sfrs.contains("UCON"); + case Feature::USART: + return ( registersData().sfrs.contains("TXSTA") // 16F + || registersData().sfrs.contains("TXSTA1") // 18F + || registersData().sfrs.contains("U1MODE") ); // 30F + case Feature::CAN: return registersData().sfrs.contains("CANCON") && !registersData().sfrs.contains("ECANCON"); + case Feature::ECAN: return registersData().sfrs.contains("ECANCON"); + case Feature::Ethernet: return registersData().sfrs.contains("ETHCON1"); + case Feature::LCD: return registersData().sfrs.contains("LCDCON"); + case Feature::MotorControl: return registersData().sfrs.contains("PWMCON0"); + case Feature::MotionFeedback: return registersData().sfrs.contains("CAP1CON"); + case Feature::SelfWrite: return _selfWrite==SelfWrite::Yes; + case Feature::Nb_Types: Q_ASSERT(false); break; + } + return false; +} + +Device::Array Pic::Data::gotoInstruction(Address address, bool withPageSelection) const +{ + Q_ASSERT( address0x1FF && withPageSelection) + a.append(0x4A3 | (address>0x1FF ? 0x100 : 0x000)); // bsf STATUS,PA0 or bcf STATUS,PA0 + a.append(0xA00 | (address.toUInt() & 0x1FF)); // goto + break; + case Architecture::P16X: + if ( nbWords(MemoryRangeType::Code)>0x7FF && withPageSelection ) { + if ( address<=0x7FF ) a.append(0x018A); // clrf PCLATH + else { + a.append(0x3000 | (address.toUInt() >> 8)); // movl high address + a.append(0x008A); // movwf PCLATH + } + } + a.append(0x2800 | (address.toUInt() & 0x7FF)); + break; + case Architecture::P17C: + a.append(0xC000 | (address.toUInt() & 0x1FFF)); + break; + case Architecture::P18C: + case Architecture::P18F: + case Architecture::P18J: + a.append(0xEF00 | ((address.toUInt()/2) & 0xFF)); + a.append(0xF000 | ((address.toUInt()/2) >> 8)); + break; + case Architecture::P24F: + case Architecture::P24H: + case Architecture::P30F: + case Architecture::P33F: + a.append(0x040000 | (address.toUInt() & 0x00FFFE)); + a.append(0X000000 | (address.toUInt() >> 16)); + break; + case Architecture::Nb_Types: Q_ASSERT(false); break; + } + return a; +} + +bool Pic::Data::isGotoInstruction(BitValue instruction) const +{ + switch (_architecture.type()) { + case Architecture::P10X: return ( instruction.maskWith(0xE00)==0xA00 ); + case Architecture::P16X: return ( instruction.maskWith(0xF800)==0x2800 ); + case Architecture::P17C: return ( instruction.maskWith(0xE000)==0xC000 ); + case Architecture::P18C: + case Architecture::P18F: + case Architecture::P18J: return ( instruction.maskWith(0xFF00)==0xEF00 ); + case Architecture::P24F: + case Architecture::P24H: + case Architecture::P30F: + case Architecture::P33F: return ( instruction.maskWith(0xFF0000)==0x040000 ); + case Architecture::Nb_Types: Q_ASSERT(false); break; + } + return false; +} + +uint Pic::Data::nbWordsWriteAlignment(MemoryRangeType type) const +{ + if ( type!=MemoryRangeType::Code ) return 1; + return QMAX(_nbWordsCodeWrite, uint(16)); +} + +//---------------------------------------------------------------------------- +QDataStream &operator <<(QDataStream &s, const Pic::VoltageData &vd) +{ + s << vd.min << vd.max << vd.nominal; + return s; +} +QDataStream &operator >>(QDataStream &s, Pic::VoltageData &vd) +{ + s >> vd.min >> vd.max >> vd.nominal; + return s; +} + +QDataStream &operator <<(QDataStream &s, const Pic::MemoryRangeData &mrd) +{ + s << Q_UINT8(mrd.properties) << mrd.start << mrd.end << mrd.hexFileOffset; + return s; +} +QDataStream &operator >>(QDataStream &s, Pic::MemoryRangeData &mrd) +{ + Q_UINT8 properties; + s >> properties >> mrd.start >> mrd.end >> mrd.hexFileOffset; + mrd.properties = Pic::MemoryRangeProperties(properties); + return s; +} + +QDataStream &operator <<(QDataStream &s, const Pic::Checksum::Data &cd) +{ + s << cd.constant << cd.bbsize << cd.algorithm << cd.protectedMaskNames; + s << cd.blankChecksum << cd.checkChecksum; + return s; +} +QDataStream &operator >>(QDataStream &s, Pic::Checksum::Data &cd) +{ + s >> cd.constant >> cd.bbsize >> cd.algorithm >> cd.protectedMaskNames; + s >> cd.blankChecksum >> cd.checkChecksum; + return s; +} + +QDataStream &operator <<(QDataStream &s, const Pic::CalibrationData &cd) +{ + s << cd.opcode << cd.opcodeMask; + return s; +} +QDataStream &operator >>(QDataStream &s, Pic::CalibrationData &cd) +{ + s >> cd.opcode >> cd.opcodeMask; + return s; +} + +QDataStream &Pic::operator <<(QDataStream &s, const Pic::Data &data) +{ + s << static_cast(data); + s << data._architecture << data._ids << data._nbBitsPC; + s << data._voltages << data._ranges; + s << data._userIdRecommendedMask; + s << *data._config; + s << data._checksums; + s << data._calibration; + s << static_cast(*data._registersData); + s << data._nbWordsCodeWrite << data._nbWordsCodeRowErase; + s << data._selfWrite; + return s; +} +QDataStream &Pic::operator >>(QDataStream &s, Pic::Data &data) +{ + s >> static_cast(data); + s >> data._architecture >> data._ids >> data._nbBitsPC; + s >> data._voltages >> data._ranges; + s >> data._userIdRecommendedMask; + s >> *data._config; + s >> data._checksums; + s >> data._calibration; + s >> static_cast(*data._registersData); + s >> data._nbWordsCodeWrite >> data._nbWordsCodeRowErase; + s >> data._selfWrite; + return s; +} diff --git a/src/devices/pic/base/pic.h b/src/devices/pic/base/pic.h new file mode 100644 index 0000000..7b0dfc4 --- /dev/null +++ b/src/devices/pic/base/pic.h @@ -0,0 +1,179 @@ +/*************************************************************************** + * Copyright (C) 2005-2007 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_H +#define PIC_H + +#include +#include + +#include "common/global/global.h" +#include "common/common/bitvalue.h" +#include "devices/base/generic_device.h" + +namespace Pic +{ +class XmlToData; +class Group; +class Config; +class RegistersData; + +//----------------------------------------------------------------------------- +struct VoltageData { + double min, max, nominal; +}; +inline bool operator ==(const Pic::VoltageData &v1, const Pic::VoltageData &v2) { return ( v1.min==v2.min && v1.max==v2.max && v1.nominal==v2.nominal ); } + +BEGIN_DECLARE_ENUM(ProgVoltageType) + Vpp = 0, VddBulkErase, VddWrite +END_DECLARE_ENUM_STD(ProgVoltageType) + +struct CalibrationData { + BitValue opcode, opcodeMask; +}; + +enum MemoryRangeTypeProperty { ReadOnly = 0, Writable = 1 }; +Q_DECLARE_FLAGS(MemoryRangeTypeProperties, MemoryRangeTypeProperty) +Q_DECLARE_OPERATORS_FOR_FLAGS(MemoryRangeTypeProperties) +struct MemoryRangeTypeData { + const char *key, *label; + MemoryRangeTypeProperties properties; +}; +BEGIN_DECLARE_ENUM(MemoryRangeType) + Code = 0, Cal, UserId, DeviceId, Config, Eeprom, DebugVector, HardwareStack, CalBackup, ProgramExecutive +END_DECLARE_ENUM(MemoryRangeType, MemoryRangeTypeData) + +BEGIN_DECLARE_ENUM(SelfWrite) + Yes, No +END_DECLARE_ENUM_STD(SelfWrite) + +BEGIN_DECLARE_ENUM(DeviceType) + Normal, J, K +END_DECLARE_ENUM_STD(DeviceType) + +struct ArchitectureData { + const char *key, *label; + uint nbBitsPC; // nb bits program counter + uint nbBytesWord; // nb bytes per word (hex file and icd2) + bool packed; // addressIncrement = (packed ? nbBytesWord : nbBytesWord/2) + uint nbBitsRegister; + uint registerBankLength; + uint nbBits[MemoryRangeType::Nb_Types]; // nb bits per word + bool hasAddressAccess; // memory can be accessed randomly + SelfWrite::Type selfWrite; + DeviceType::Type deviceType; +}; +BEGIN_DECLARE_ENUM(Architecture) + P10X = 0, P16X, P17C, P18C, P18F, P18J, P24F, P24H, P30F, P33F +END_DECLARE_ENUM(Architecture, ArchitectureData) + +enum MemoryRangeProperty { NotPresent = 0, Present = 1, Programmable = 2 }; +Q_DECLARE_FLAGS(MemoryRangeProperties, MemoryRangeProperty) +Q_DECLARE_OPERATORS_FOR_FLAGS(MemoryRangeProperties) +struct MemoryRangeData { + MemoryRangeProperties properties; + Address start, end; + uint hexFileOffset; +}; + +namespace Checksum +{ + BEGIN_DECLARE_ENUM(Algorithm) + Normal = 0, XOR4, XNOR7, XNOR8 + END_DECLARE_ENUM_STD(Algorithm) + class Data { + public: + BitValue constant; + Algorithm algorithm; + QStringList protectedMaskNames; + QString bbsize; + BitValue blankChecksum, checkChecksum; + }; +} // namespace + +BEGIN_DECLARE_ENUM(Feature) + CCP, ADC, SSP, LVD, USB, USART, CAN, ECAN, Ethernet, LCD, MotorControl, + MotionFeedback, SelfWrite +END_DECLARE_ENUM_STD(Feature) + +//----------------------------------------------------------------------------- +class Data : public Device::Data +{ +public: + Data(); + virtual ~Data(); + virtual QString fname(Device::Special special) const; + virtual QString listViewGroup() const { return _architecture.label(); } + bool isPresent(MemoryRangeType type) const { return (range(type).properties & Present); } + bool isReadable(MemoryRangeType type) const; + bool isWritable(MemoryRangeType type) const; + uint nbAddresses(MemoryRangeType type) const; + uint nbWords(MemoryRangeType type) const; + uint addressIncrement(MemoryRangeType type) const; + uint nbWordsWriteAlignment(MemoryRangeType type) const; + MemoryRangeData range(MemoryRangeType type) const { return _ranges[type]; } + virtual uint nbBitsAddress() const { return _nbBitsPC; } + uint nbBitsWord(MemoryRangeType type) const { return _architecture.data().nbBits[type.type()]; } + uint nbBytesWord(MemoryRangeType type) const { return nbBitsToNbBytes(nbBitsWord(type)); } + uint nbCharsWord(MemoryRangeType type) const { return nbBitsToNbChars(nbBitsWord(type)); } + BitValue mask(MemoryRangeType type) const { return uint(1 << nbBitsWord(type))-1; } + BitValue userIdRecommendedMask() const { return _userIdRecommendedMask; } + const Config &config() const { return *_config; } + Architecture architecture() const { return _architecture; } + bool is18Family() const { return ( _architecture==Architecture::P18C || _architecture==Architecture::P18F || _architecture==Architecture::P18J); } + bool is16bitFamily() const { return ( _architecture.data().nbBitsRegister==16 ); } + VoltageData voltage(ProgVoltageType type) const { return _voltages[type]; } + virtual bool canWriteCalibration() const { return isWritable(MemoryRangeType::Cal); } + bool checkCalibration(const Device::Array &data, QString *message = 0) const; + const QMap ids() const { return _ids; } + virtual bool matchId(BitValue rawId, Device::IdData &data) const; + QStringList idNames(const QMap &ids) const; + const QMap checksums() const { return _checksums; } + const RegistersData ®istersData() const; + const CalibrationData &calibrationData() const { return _calibration; } + + bool hasFeature(Feature feature, bool *unknown = 0) const; + BitValue nopInstruction() const { return 0x0; } + Device::Array gotoInstruction(Address address, bool withPageSelection) const; + bool isGotoInstruction(BitValue instruction) const; + +private: + Architecture _architecture; + QMap _ids; + uint _nbBitsPC; + uint _nbWordsCodeWrite; // #### only for 18F/18J devices [0 for other devices] + uint _nbWordsCodeRowErase; // #### only for 18F/18J devices [0 for other devices or if not available] + QMap _voltages; + QMap _ranges; + BitValue _userIdRecommendedMask; + Config *_config; + QMap _checksums; + CalibrationData _calibration; + SelfWrite _selfWrite; + + friend class XmlToData; + friend class Group; + friend QDataStream &operator <<(QDataStream &s, const Data &data); + friend QDataStream &operator >>(QDataStream &s, Data &data); +}; + +QDataStream &operator <<(QDataStream &s, const Data &data); +QDataStream &operator >>(QDataStream &s, Data &data); + +} // namespace + +QDataStream &operator <<(QDataStream &s, const Pic::VoltageData &vd); +QDataStream &operator >>(QDataStream &s, Pic::VoltageData &vd); +QDataStream &operator <<(QDataStream &s, const Pic::MemoryRangeData &mrd); +QDataStream &operator >>(QDataStream &s, Pic::MemoryRangeData &mrd); +QDataStream &operator <<(QDataStream &s, const Pic::Checksum::Data &cd); +QDataStream &operator >>(QDataStream &s, Pic::Checksum::Data &cd); +QDataStream &operator <<(QDataStream &s, const Pic::CalibrationData &cd); +QDataStream &operator >>(QDataStream &s, Pic::CalibrationData &cd); + +#endif diff --git a/src/devices/pic/base/pic_config.cpp b/src/devices/pic/base/pic_config.cpp new file mode 100644 index 0000000..6672794 --- /dev/null +++ b/src/devices/pic/base/pic_config.cpp @@ -0,0 +1,456 @@ +/*************************************************************************** + * Copyright (C) 2005-2007 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_config.h" + +#include + +const Pic::ConfigNameType::Data Pic::ConfigNameType::DATA[Nb_Types] = { + { "cname", 0 }, + { "ecname", 0 }, + { "sdcc_cname", 0 } +}; + +const Pic::Config::Data Pic::Config::DATA[] = { + { { "CP", I18N_NOOP("Code code-protection") }, MemoryRange, { { 0, 0 } } }, + { { "CPD", I18N_NOOP("Data code-protection") }, MemoryRange, { { 0, 0 } } }, + { { "CPC", I18N_NOOP("Calibration code-protection") }, MemoryRange, { { 0, 0 } } }, + { { "CPB", I18N_NOOP("Boot code-protection") }, MemoryRange, { { 0, 0 } } }, + + { { "WRT", I18N_NOOP("Code write-protection") }, MemoryRange, { { 0, 0 } } }, + { { "WRTD", I18N_NOOP("Data write-protection") }, MemoryRange, { { 0, 0 } } }, + { { "WRTB", I18N_NOOP("Boot write-protection") }, MemoryRange, { { 0, 0 } } }, + { { "WRTC", I18N_NOOP("Configuration write-protection") }, MemoryRange, { { 0, 0 } } }, + + { { "EBTR", I18N_NOOP("Table read-protection") }, MemoryRange, { { 0, 0 } } }, + { { "EBTRB", I18N_NOOP("Boot table read-protection") }, MemoryRange, { { 0, 0 } } }, + + { { "WDT", I18N_NOOP("Watchdog timer") }, Toggle, { { 0, 0 } } }, + { { "MCLRE", I18N_NOOP("Master clear reset"), }, Fixed, { + { "External", I18N_NOOP("External"), }, + { "Internal", I18N_NOOP("Disabled (connected to Vdd)") }, { 0, 0 } } }, + { { "PWRTE", I18N_NOOP("Power-up timer") }, Toggle, { { 0, 0 } } }, + + { { "FOSC", I18N_NOOP("Oscillator") }, Fixed, { + { "EXTRC", I18N_NOOP("External RC oscillator") }, + { "EXTRC_CLKOUT", I18N_NOOP("External RC oscillator with CLKOUT") }, + { "EXTRC_IO", I18N_NOOP("External RC oscillator (no CLKOUT)") }, + { "INTRC", I18N_NOOP("Internal oscillator") }, + { "INTRC_CLKOUT", I18N_NOOP("Internal oscillator with CLKOUT") }, + { "INTRC_IO", I18N_NOOP("Internal oscillator (no CLKOUT)") }, + { "XT", I18N_NOOP("Crystal/resonator") }, + { "XTPLL", I18N_NOOP("Crystal/resonator, PLL enabled") }, + { "LP", I18N_NOOP("Low power crystal") }, + { "EC", I18N_NOOP("External clock") }, + { "EC_CLKOUT", I18N_NOOP("External clock with CLKOUT") }, + { "EC_IO", I18N_NOOP("External clock (no CLKOUT)") }, + { "ECPLL_CLKOUT", I18N_NOOP("External clock with CLKOUT, PLL enabled") }, + { "ECPLL_IO", I18N_NOOP("External clock (no CLKOUT), PLL enabled") }, + { "E4_CLKOUT", I18N_NOOP("External clock with 4x PLL and with CLKOUT") }, + { "E4_IO", I18N_NOOP("External clock with 4x PLL (no CLKOUT)") }, + { "E4S_IO", I18N_NOOP("External clock with software controlled 4x PLL (no CLKOUT)") }, + { "ER", I18N_NOOP("External resistor") }, + { "ER_CLKOUT", I18N_NOOP("External resistor with CLKOUT") }, + { "ER_IO", I18N_NOOP("External resistor (no CLKOUT)") }, + { "HS", I18N_NOOP("High speed crystal/resonator") }, + { "HSPLL", I18N_NOOP("High speed crystal/resonator, PLL enabled") }, + { "H4", I18N_NOOP("High speed crystal/resonator with 4x PLL") }, + { "H4S", I18N_NOOP("High speed crystal/resonator with software controlled 4x PLL") }, + { "INTXT", I18N_NOOP("Internal oscillator, XT used by USB") }, + { "INTHS", I18N_NOOP("Internal oscillator, HS used by USB") }, + { 0, 0 } } }, + + { { "BG", I18N_NOOP("Bandgap voltage calibration") }, Fixed, { + { "Lowest", I18N_NOOP("Lowest") }, + { "Mid/Low", I18N_NOOP("Mid/Low") }, + { "Mid/High", I18N_NOOP("Mid/High") }, + { "Highest", I18N_NOOP("Highest") }, { 0, 0 } } }, + { { "TRIM", I18N_NOOP("Internal Trim") }, Fixed, { + { "00", I18N_NOOP("00") }, { "01", I18N_NOOP("01") }, + { "10", I18N_NOOP("10") }, { "11", I18N_NOOP("11") }, { 0, 0 } } }, + { { "BODEN", I18N_NOOP("Brown-out detect") }, Toggle, { + { "On_run", I18N_NOOP("Enabled in run - Disabled in sleep") }, + { "Software", I18N_NOOP("SBODEN controls BOD function") }, { 0, 0 } } }, + { { "FCMEN", I18N_NOOP("Fail-safe clock monitor") }, Toggle, { { 0, 0 } } }, + { { "IESO", I18N_NOOP("Internal-external switchover") }, Toggle, { { 0, 0 } } }, + { { "WUREN", I18N_NOOP("Wake-up reset") }, Toggle, { { 0, 0 } } }, + { { "DEBUG", I18N_NOOP("In-circuit debugger") }, Toggle, { { 0, 0 } } }, + { { "MPEEN", I18N_NOOP("Memory parity error") }, Toggle, { { 0, 0 } } }, + { { "BORV", I18N_NOOP("Brown-out reset voltage") }, ValueDouble, { + { "0", I18N_NOOP("Undefined") }, { 0, 0 } } }, + { { "LVP", I18N_NOOP("Low voltage programming") }, Toggle, { { 0, 0 } } }, + { { "CCP2MX", I18N_NOOP("CCP2 multiplex") }, Pin, { { 0, 0 } } }, + { { "CCP1MX", I18N_NOOP("CCP1 multiplex") }, Pin, { { 0, 0 } } }, + { { "BORSEN", I18N_NOOP("Brown-out reset software") }, Toggle, { { 0, 0 } } }, + { { "WDTPS", I18N_NOOP("WDT post-scaler") }, Ratio, { + { "Disabled", I18N_NOOP("Disabled") }, { 0, 0 } } }, + { { "PM", I18N_NOOP("Processor mode") }, Fixed, { + { "Extended microcontroller", I18N_NOOP("Extended microcontroller") }, + { "Microcontroller", I18N_NOOP("Microcontroller") }, + { "Microprocessor", I18N_NOOP("Microprocessor") }, + { "Code-protected microcontroller", I18N_NOOP("Code protected microcontroller") }, + { "Microprocessor with boot", I18N_NOOP("Microprocessor with boot block") }, + { 0, 0 } } }, + + { { "OSCSEN", I18N_NOOP("Oscillator system clock switch") }, Toggle, { { 0, 0 } } }, + { { "STVREN", I18N_NOOP("Stack full/underflow reset") }, Toggle, { { 0, 0 } } }, + { { "BW", I18N_NOOP("External bus data width (in bits)") }, ValueUInt, { { 0, 0 } } }, + { { "PBADEN", I18N_NOOP("PORTB A/D") }, Fixed, { + { "digital", I18N_NOOP("Digital") }, + { "analog", I18N_NOOP("Analog") }, { 0, 0 } } }, + { { "WINEN", I18N_NOOP("Watchdog timer window") }, Toggle, { { 0, 0 } } }, + { { "HPOL", I18N_NOOP("Odd PWM output polarity") }, Fixed, { + { "high", I18N_NOOP("Active high") }, + { "low", I18N_NOOP("Active low") }, { 0, 0 } } }, + { { "LPOL", I18N_NOOP("Even PWM output polarity") }, Fixed, { + { "high", I18N_NOOP("Active high") }, + { "low", I18N_NOOP("Active low") }, { 0, 0 } } }, + { { "PWMPIN", I18N_NOOP("PWM output pin reset state") }, Toggle, { { 0, 0 } } }, + { { "T1OSCMX", I18N_NOOP("Timer1 oscillator mode") }, Fixed, { + { "Legacy", I18N_NOOP("Standard operation") }, + { "Low Power", I18N_NOOP("Low power in sleep mode") }, + { "RA6", I18N_NOOP("T1OSO/T1CKI on RA6") }, + { "RB2", I18N_NOOP("T1OSO/T1CKI on RB2") }, { 0, 0 } } }, + { { "EXCLKMX", I18N_NOOP("TMR0/T5CKI external clock mux") }, Pin, { { 0, 0 } } }, + { { "FLTAMX", I18N_NOOP("FLTA mux") }, Pin, { { 0, 0 } } }, + { { "PWM4MX", I18N_NOOP("PWM4 mux") }, Pin, { { 0, 0 } } }, + { { "SSPMX", I18N_NOOP("SSP I/O mux (SCK/SLC, SDA/SDI, SD0)") }, Pins, { { 0, 0 } } }, + { { "LPT1OSC", I18N_NOOP("Low-power timer1 oscillator") }, Toggle, { { 0, 0 } } }, + { { "XINST", I18N_NOOP("Extended instruction set") }, Toggle, { { 0, 0 } } }, + { { "BBSIZ", I18N_NOOP("Boot block size") }, ValueUInt, { { 0, 0 } } }, + { { "ICPORT", I18N_NOOP("Dedicated in-circuit port") }, Toggle, { { 0, 0 } } }, + { { "VREGEN", I18N_NOOP("USB voltage regulator") }, Toggle, { { 0, 0 } } }, + { { "WAIT", I18N_NOOP("External bus data wait") }, Toggle, { { 0, 0 } } }, + { { "ABW", I18N_NOOP("Address bus width (in bits)") }, ValueUInt, { { 0, 0 } } }, + { { "ECCPMX", I18N_NOOP("ECCP mux") }, Fixed, { + { "RE6-RE3", I18N_NOOP("PWM multiplexed onto RE6 and RE3") }, + { "RH7-RH4", I18N_NOOP("PWM multiplexed onto RH7 and RH4") }, + { "RE6-RE5", I18N_NOOP("PWM multiplexed onto RE6 and RE5") }, + { "RH7-RH6", I18N_NOOP("PWM multiplexed onto RH7 and RH6") }, { 0, 0 } } }, + + { { "FCKSM", I18N_NOOP("Clock switching mode") }, Fixed, { + { "Switching off, monitor off", I18N_NOOP("Switching off, monitor off") }, + { "Switching on, monitor off", I18N_NOOP("Switching on, monitor off") }, + { "Switching on, monitor on", I18N_NOOP("Switching on, monitor on") }, { 0, 0 } } }, + { { "FOS", I18N_NOOP("Oscillator source") }, Fixed, { + { "INTRC_F", I18N_NOOP("Internal fast RC") }, + { "INTRC_LP", I18N_NOOP("Internal low-power RC") }, + { "PRIM", I18N_NOOP("Primary") }, + { "TMR1", I18N_NOOP("Timer1") }, { 0, 0 } } }, + { { "FPR", I18N_NOOP("Primary oscillator mode") }, Fixed, { + { "XTL", I18N_NOOP("Low-power/low-frequency crystal") }, + { "HS", I18N_NOOP("High speed crystal") }, + { "XT", I18N_NOOP("XT Crystal") }, + { "XT4", I18N_NOOP("XT Crystal with 4x PLL") }, + { "XT8", I18N_NOOP("XT Crystal with 8x PLL") }, + { "XT16", I18N_NOOP("XT Crystal with 16x PLL") }, + { "EC_CLKOUT", I18N_NOOP("External clock with CLKOUT") }, + { "EC_IO", I18N_NOOP("External clock (no CLKOUT)") }, + { "EC4", I18N_NOOP("External clock with 4x PLL") }, + { "EC8", I18N_NOOP("External clock with 8x PLL") }, + { "EC16", I18N_NOOP("External clock with 16x PLL") }, + { "FRC8", I18N_NOOP("Internal fast RC oscillator with 8x PLL") }, + { "EXTRC_CLKOUT", I18N_NOOP("External RC oscillator with CLKOUT") }, + { "EXTRC_IO", I18N_NOOP("External RC oscillator (no CLKOUT)") }, { 0, 0 } } }, + { { "FOSFPR", I18N_NOOP("Oscillator mode") }, Fixed, { + { "XTL", I18N_NOOP("Low-power/low-frequency crystal") }, + { "HS", I18N_NOOP("High speed crystal") }, + { "XT", I18N_NOOP("XT Crystal") }, + { "XT4", I18N_NOOP("XT Crystal with 4x PLL") }, + { "XT8", I18N_NOOP("XT Crystal with 8x PLL") }, + { "XT16", I18N_NOOP("XT Crystal with 16x PLL") }, + { "HS2_4", I18N_NOOP("HS/2 Crystal with 4x PLL") }, + { "HS2_8", I18N_NOOP("HS/2 Crystal with 8x PLL") }, + { "HS2_16", I18N_NOOP("HS/2 Crystal with 16x PLL") }, + { "HS3_4", I18N_NOOP("HS/3 Crystal with 4x PLL") }, + { "HS3_8", I18N_NOOP("HS/3 Crystal with 8x PLL") }, + { "HS3_16", I18N_NOOP("HS/3 Crystal with 16x PLL") }, + { "EC_CLKOUT", I18N_NOOP("External clock with CLKOUT") }, + { "EC_IO", I18N_NOOP("External clock (no CLKOUT)") }, + { "EC4", I18N_NOOP("External clock with 4x PLL") }, + { "EC8", I18N_NOOP("External clock with 8x PLL") }, + { "EC16", I18N_NOOP("External clock with 16x PLL") }, + { "FRC4", I18N_NOOP("Internal fast RC oscillator with 4x PLL") }, + { "FRC8", I18N_NOOP("Internal fast RC oscillator with 8x PLL") }, + { "FRC16", I18N_NOOP("Internal fast RC oscillator with 16x PLL") }, + { "TMR1", I18N_NOOP("Low-power 32 kHz oscillator (TMR1 oscillator)") }, + { "INTRC_F", I18N_NOOP("Internal fast RC oscillator (no PLL)") }, + { "INTRC_LP", I18N_NOOP("Internal low-power RC oscillator") }, + { "EXTRC_CLKOUT", I18N_NOOP("External RC oscillator with CLKOUT") }, + { "EXTRC_IO", I18N_NOOP("External RC oscillator (no CLKOUT)") }, { 0, 0 } } }, + { { "FWPSA", I18N_NOOP("Watchdog timer prescaler A") }, Ratio, { { 0, 0 } } }, + { { "FWPSB", I18N_NOOP("Watchdog timer prescaler B") }, Ratio, { { 0, 0 } } }, + { { "FWDTEN", I18N_NOOP("Watchdog") }, Toggle, { + { "Software", I18N_NOOP("Software") }, { 0, 0 } } }, + { { "FPWRT", I18N_NOOP("Power-on reset timer value (ms)") }, ValueUInt, { + { "0", I18N_NOOP("Disabled") }, { 0, 0 } } }, + { { "GCP", I18N_NOOP("General code segment read-protection") }, MemoryRange, { { 0, 0 } } }, + { { "GWRP", I18N_NOOP("General code segment write-protection") }, MemoryRange, { { 0, 0 } } }, + { { "COE", I18N_NOOP("Reset into clip on emulation mode") }, Toggle, { { 0, 0 } } }, + { { "ICS", I18N_NOOP("ICD communication channel") }, Pins, { { 0, 0 } } }, + + { { "USBDIV", I18N_NOOP("USB clock (PLL divided by)") }, ValueUInt, { + { "1", I18N_NOOP("not divided") }, { 0, 0 } } }, + { { "CPUDIV", I18N_NOOP("CPU system clock (divided by)") }, ValueUInt, { + { "1", I18N_NOOP("not divided") }, { 0, 0 } } }, + { { "PLLDIV", I18N_NOOP("PLL clock (divided by)") }, ValueUInt, { + { "1", I18N_NOOP("not divided") }, { 0, 0 } } }, + + { { "MCPU", I18N_NOOP("Master clear pull-up resistor") }, Toggle, { { 0, 0 } } }, + { { "IOSCFS", I18N_NOOP("Internal oscillator speed") }, Fixed, { + { "8MHZ", I18N_NOOP("8 MHz") }, + { "4MHZ", I18N_NOOP("4 MHz") }, { 0, 0 } } }, + + // 18J specific + { { "ETHLED", I18N_NOOP("Ethernet LED enable") }, Toggle, { { 0, 0 } } }, + { { "FOSC2", I18N_NOOP("Default system clock select") }, Fixed, { + { "FOSC1:FOSC0", I18N_NOOP("FOSC1:FOSC0") }, + { "INTRC", I18N_NOOP("INTRC") }, { 0, 0 } } }, + { { "EMB", I18N_NOOP("External memory bus") }, Fixed, { + { "Disabled", I18N_NOOP("Disabled") }, + { "12BIT", I18N_NOOP("12-bit external bus") }, + { "16BIT", I18N_NOOP("16-bit external bus") }, + { "20BIT", I18N_NOOP("20-bit external bus") }, { 0, 0 } } }, + { { "EASHFT", I18N_NOOP("External address bus shift") }, Toggle, { { 0, 0 } } }, + { { "MSSPSEL", I18N_NOOP("MSSP address select bit") }, Fixed, { + { "7BIT", I18N_NOOP("7-bit address mask mode") }, + { "5BIT", I18N_NOOP("5-bit address mask mode") }, { 0, 0 } } }, + { { "PMPMX", I18N_NOOP("PMP pin select bit") }, Fixed, { + { "Connected", I18N_NOOP("Connected to EMB") }, + { "NotConnected", I18N_NOOP("Not connected to EMB") }, { 0, 0 } } }, + + // 24X specific / 30F1010 / 30F202X + { { "WRTBS", I18N_NOOP("Boot segment write-protection") }, MemoryRange, { { 0, 0 } } }, + { { "BSSIZ", I18N_NOOP("Boot segment size") }, ValueUInt, { { 0, 0 } } }, + { { "BSSEC", I18N_NOOP("Boot segment security") }, Fixed, { + { "High Security", I18N_NOOP("High Security") }, + { "Standard Security", I18N_NOOP("Standard Security") }, { 0, 0 } } }, + { { "EBSSIZ", I18N_NOOP("Boot segment EEPROM size") }, ValueUInt, { { 0, 0 } } }, + { { "RBSSIZ", I18N_NOOP("Boot segment RAM size") }, ValueUInt, { { 0, 0 } } }, + { { "WRTSS", I18N_NOOP("Secure segment write-protection") }, MemoryRange, { { 0, 0 } } }, + { { "SSSIZ", I18N_NOOP("Secure segment size") }, ValueUInt, { { 0, 0 } } }, + { { "SSSEC", I18N_NOOP("Secure segment security") }, Fixed, { + { "High Security", I18N_NOOP("High Security") }, + { "Standard Security", I18N_NOOP("Standard Security") }, { 0, 0 } } }, + { { "ESSSIZ", I18N_NOOP("Secure segment EEPROM size") }, ValueUInt, { { 0, 0 } } }, + { { "RSSSIZ", I18N_NOOP("Secure segment RAM size") }, ValueUInt, { { 0, 0 } } }, + { { "WRTGS", I18N_NOOP("General segment write-protection") }, MemoryRange, { { 0, 0 } } }, + { { "GSSEC", I18N_NOOP("General segment security") }, Fixed, { + { "Off", I18N_NOOP("Off") }, + { "High Security", I18N_NOOP("High security") }, + { "Standard Security", I18N_NOOP("Standard security") }, { 0, 0 } } }, + { { "FNOSC", I18N_NOOP("Initial oscillator source") }, Fixed, { + { "EXTRC_F" , I18N_NOOP("Fast RC oscillator") }, + { "INTRC_F", I18N_NOOP("Internal fast RC oscillator") }, + { "INTRC_F_PLL", I18N_NOOP("Internal fast RC oscillator with PLL") }, + { "PRIM", I18N_NOOP("Primary oscillator") }, + { "PRIM_PLL", I18N_NOOP("Primary oscillator with PLL") }, + { "SECOND", I18N_NOOP("Secondary oscillator (LP)") }, + { "EXTRC_LP", I18N_NOOP("Low power RC oscillator") }, + { "INTRC_F_POST", I18N_NOOP("Internal fast RC oscillator with postscaler") }, { 0, 0 } } }, + { { "POSCMD", I18N_NOOP("Primary oscillator mode") }, Fixed, { + { "Off", I18N_NOOP("Off") }, + { "HS", I18N_NOOP("HS crystal oscillator") }, + { "XT", I18N_NOOP("XT crystal oscillator") }, + { "EC", I18N_NOOP("External clock") }, { 0, 0 } } }, + { { "TEMP", I18N_NOOP("Temperature protection") }, Toggle, { { 0, 0 } } }, + { { "OSCIOFNC", I18N_NOOP("OSC2 pin function") }, Fixed, { + { "IO", I18N_NOOP("Digital I/O") }, + { "Clock", I18N_NOOP("Clock output") }, { 0, 0 } } }, + { { "WINDIS", I18N_NOOP("Watchdog timer window") }, Toggle, { { 0, 0 } } }, + { { "WDTPRE", I18N_NOOP("Watchdog timer prescaler") }, Ratio, { { 0, 0 } } }, + { { "WDTPOST", I18N_NOOP("Watchdog timer postscaler") }, Ratio, { { 0, 0 } } }, + { { "JTAGEN", I18N_NOOP("JTAG port enabled") }, Toggle, { { 0, 0 } } }, + { { "IOL1WAY", I18N_NOOP("Peripheral pin select configuration") }, Fixed, { + { "One reconfiguration", I18N_NOOP("Allow only one reconfiguration") }, + { "Multiple reconfigurations", I18N_NOOP("Allow multiple reconfigurations") }, { 0, 0 } } }, + { { "ALTI2C", I18N_NOOP("Alternate I2C pins") }, Pin, { { 0, 0 } } }, + { { "I2C1SEL", I18N_NOOP("I2C pins selection") }, Fixed, { + { "Default", I18N_NOOP("Default") }, + { "Alternate", I18N_NOOP("Alternate") }, { 0, 0 } } }, + { { "FRANGE", I18N_NOOP("Frequency range selection for FRC oscillator") }, Fixed, { + { "High range", I18N_NOOP("High range (nominal FRC frequency is 14.1 MHz)") }, + { "Low range", I18N_NOOP("Low range (nominal FRC frequency is 9.7 MHz)") }, { 0, 0 } } }, + + { { 0, 0 }, Fixed, { { 0, 0 } } } +}; + +QMap *Pic::Config::_masks = 0; +QMap &Pic::Config::masks() +{ + if ( _masks==0 ) { + _masks = new QMap; + for (uint i=0; DATA[i].mask.name; i++) { + (*_masks)[DATA[i].mask.name] = MapData(i, -1); + if ( DATA[i].type==MemoryRange ) { + for (uint k=0; k=0 ) return i18n("%1 for block %2").arg(s).arg(mp.block); + return s; +} + +const Pic::Config::Mask *Pic::Config::findMask(const QString &mask, uint *wordIndex) const +{ + for (uint i=0; ivalues.count()); i++) + if ( cmask->values[i].name==value ) return &cmask->values[i]; + return 0; +} + +bool Pic::Config::checkValueName(const QString &mask, const QString &name) const +{ + const Data &data = DATA[masks()[mask].index]; + QString pinRegexp = "[A-Z]+\\d*(/[A-Z]+\\d*)?"; + switch (data.type) { + case Fixed: break; + case ValueDouble: { + bool ok; + (void)name.toDouble(&ok); + if (ok) return true; + break; + } + case ValueUInt: { + bool ok; + (void)name.toUInt(&ok); + if (ok) return true; + break; + } + case Ratio: { + QRegExp regexp("(\\d+):(\\d+)"); + if ( regexp.exactMatch(name) ) { + bool ok1, ok2; + (void)regexp.cap(1).toUInt(&ok1); + (void)regexp.cap(2).toUInt(&ok2); + if ( ok1 && ok2 ) return true; + } + break; + } + case MemoryRange: + return _protection.checkRange(mask, name); + case Toggle: + if ( name=="On" || name=="Off" ) return true; + break; + case Pin: { + QRegExp regexp(pinRegexp); + if ( regexp.exactMatch(name) ) return true; + break; + } + case Pins: { + QRegExp regexp(pinRegexp + "(, " + pinRegexp + ")+"); + if ( regexp.exactMatch(name) ) return true; + break; + } + } + for (uint i=0; data.values[i].name; i++) + if ( data.values[i].name==name ) return true; + return false; +} + +QString Pic::Config::valueLabel(const QString &mask, const QString &name) +{ + const Data &data = DATA[masks()[mask].index]; + switch (data.type) { + case Fixed: + case ValueDouble: + case ValueUInt: + case Pin: + case Pins: + case Ratio: break; + case MemoryRange: + if ( name=="All" ) return i18n("All"); + if ( name=="Off" ) return i18n("Disabled"); + break; + case Toggle: + if ( name=="On" ) return i18n("Enabled"); + if ( name=="Off" ) return i18n("Disabled"); + break; + } + for (uint i=0; data.values[i].name; i++) + if ( data.values[i].name==name ) return i18n(data.values[i].label); + return name; +} + +BitValue Pic::Config::Word::usedMask() const +{ + BitValue mask = 0x0; + for (uint i=0; i>(QDataStream &s, Config::Value &value) +{ + s >> value.name >> value.configNames >> value.value; + return s; +} + +QDataStream &Pic::operator <<(QDataStream &s, const Config::Mask &mask) +{ + s << mask.name << mask.value << mask.values; + return s; +} +QDataStream &Pic::operator >>(QDataStream &s, Config::Mask &mask) +{ + s >> mask.name >> mask.value >> mask.values; + return s; +} + +QDataStream &Pic::operator <<(QDataStream &s, const Config::Word &word) +{ + s << word.name << word.ignoredCNames << word.wmask << word.pmask << word.cmask << word.bvalue << word.masks; + return s; +} +QDataStream &Pic::operator >>(QDataStream &s, Config::Word &word) +{ + s >> word.name >> word.ignoredCNames >> word.wmask >> word.pmask >> word.cmask >> word.bvalue >> word.masks; + return s; +} + +QDataStream &Pic::operator <<(QDataStream &s, const Config &config) +{ + s << config._words; + return s; +} +QDataStream &Pic::operator >>(QDataStream &s, Config &config) +{ + s >> config._words; + return s; +} diff --git a/src/devices/pic/base/pic_config.h b/src/devices/pic/base/pic_config.h new file mode 100644 index 0000000..185a19e --- /dev/null +++ b/src/devices/pic/base/pic_config.h @@ -0,0 +1,107 @@ +/*************************************************************************** + * Copyright (C) 2005-2007 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_CONFIG_H +#define PIC_CONFIG_H + +#include +#include + +#include "common/common/bitvalue.h" +#include "pic_protection.h" +#include "pic.h" + +namespace Pic +{ +class Data; + +BEGIN_DECLARE_ENUM(ConfigNameType) + Default = 0, Extra, SDCC +END_DECLARE_ENUM_STD(ConfigNameType) + +class Config +{ +public: + class Value { + public: + QString name; + QMap configNames; + BitValue value; + bool operator <(const Value &cv) const { return value values; // ordered from lower to higher + bool operator <(const Mask &cm) const { return value masks; // ordered from lower to higher + BitValue usedMask() const; + }; + +public: + Config(const Pic::Data &data) : _data(data), _protection(data, *this) {} + QValueVector _words; + const Protection &protection() const { return _protection; } + + const Value *findValue(const QString &mask, const QString &value) const; + const Mask *findMask(const QString &mask, uint *wordIndex = 0) const; + static bool hasMaskName(const QString &mask); + static QString maskLabel(const QString &mask); + bool checkValueName(const QString &mask, const QString &name) const; + static QString valueLabel(const QString &mask, const QString &name); + +private: + class MapData { + public: + MapData() {} + MapData(int i, int b) : index(i), block(b) {} + int index, block; + }; + static QMap &masks(); + static QMap *_masks; // mask name -> index in DATA + + struct NameData { + const char *name, *label; + }; + enum Type { Fixed, ValueDouble, ValueUInt, Ratio, MemoryRange, Toggle, Pin, Pins }; + class Data { + public: + const NameData mask; + Type type; + const NameData values[50]; + }; + static const Data DATA[]; + +private: + const Pic::Data &_data; + Protection _protection; +}; + +QDataStream &operator <<(QDataStream &s, const Config::Value &value); +QDataStream &operator >>(QDataStream &s, Config::Value &value); +QDataStream &operator <<(QDataStream &s, const Config::Mask &mask); +QDataStream &operator >>(QDataStream &s, Config::Mask &mask); +QDataStream &operator <<(QDataStream &s, const Config::Word &word); +QDataStream &operator >>(QDataStream &s, Config::Word &word); +QDataStream &operator <<(QDataStream &s, const Config &config); +QDataStream &operator >>(QDataStream &s, Config &config); + +} //namespace + +#endif diff --git a/src/devices/pic/base/pic_protection.cpp b/src/devices/pic/base/pic_protection.cpp new file mode 100644 index 0000000..da77881 --- /dev/null +++ b/src/devices/pic/base/pic_protection.cpp @@ -0,0 +1,361 @@ +/*************************************************************************** + * Copyright (C) 2005-2007 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_protection.h" + +#include "pic_config.h" + +#include + +bool Pic::Protection::isNoneProtectedValueName(const QString &name) const +{ + if ( name=="Off" ) return true; + if ( _data.architecture()==Architecture::P17C ) return !isAllProtectedValueName(name); + return false; +} + +bool Pic::Protection::isAllProtectedValueName(const QString &name) const +{ + if ( name=="All" ) return true; + if ( _data.architecture()==Architecture::P17C ) return ( name=="Code-protected microcontroller" ); + return false; +} + +Pic::Protection::Family Pic::Protection::family() const +{ + if ( _config.findMask("WRTBS") ) return CodeGuard; + QString mask = maskName(ProgramProtected, MemoryRangeType::Code); + if ( _config.findMask(QString("%1_%2").arg(mask).arg(0)) ) return BlockProtection; + if ( _config.findMask(mask) ) return BasicProtection; + return NoProtection; +} + +QString Pic::Protection::securityValueName(Type type) const +{ + if ( type==StandardSecurity ) return "Standard Security"; + if ( type==HighSecurity ) return "High Security"; + Q_ASSERT( type==Nb_Types ); + return "Off"; +} + +QString Pic::Protection::bootSizeMaskName() const +{ + return (family()==CodeGuard ? "BSSIZ" : "BBSIZ"); +} + +QString Pic::Protection::bootMaskName(Type type) const +{ + Q_ASSERT( type!=Nb_Types ); + if ( family()==CodeGuard ) { + if ( type==WriteProtected ) return "WRTBS"; + if ( type==StandardSecurity || type==HighSecurity ) return "BSSEC"; + } else { + if ( type==ProgramProtected ) return "CPB"; + if ( type==WriteProtected ) return "WRTB"; + if ( type==ReadProtected ) return "EBTRB"; + } + return QString::null; +} + +QString Pic::Protection::blockSizeMaskName(uint block) const +{ + if ( family()==CodeGuard ) { + Q_ASSERT( block==0 ); + return "SSSIZ"; + } + return blockMaskName(ProgramProtected, block); +} + +QString Pic::Protection::blockMaskName(Type type, uint block) const +{ + Q_ASSERT( type!=Nb_Types ); + if ( family()==CodeGuard ) { + if ( type==WriteProtected ) return (block==0 ? "WRTSS" : "WRTGS"); + if ( type==StandardSecurity || type==HighSecurity ) return (block==0 ? "SSSEC" : "GSSEC"); + return QString::null; + } + return QString("%1_%2").arg(maskName(type, MemoryRangeType::Code)).arg(block); +} + +QString Pic::Protection::maskName(Type type, MemoryRangeType mtype) const +{ + Q_ASSERT( type!=Nb_Types ); + switch (mtype.type()) { + case MemoryRangeType::Code: + if ( type==ProgramProtected ) { + if ( _data.architecture()==Architecture::P17C ) return "PM"; + if ( _data.architecture()==Architecture::P30F || _data.architecture()==Architecture::P24F ) return "GCP"; + return "CP"; + } + if ( type==WriteProtected ) { + if ( _data.architecture()==Architecture::P30F || _data.architecture()==Architecture::P24F ) return "GWRP"; + return "WRT"; + } + if ( type==ReadProtected ) return "EBTR"; + break; + case MemoryRangeType::Eeprom: + if ( type==ProgramProtected ) return "CPD"; + if ( type==WriteProtected ) return "WRTD"; + break; + case MemoryRangeType::Cal: + if ( type==ProgramProtected ) return "CPC"; + break; + case MemoryRangeType::Config: + if ( type==WriteProtected ) return "WRTC"; + if ( type==ReadProtected ) return "EBTRC"; + break; + case MemoryRangeType::Nb_Types: Q_ASSERT(false); break; + default: break; + } + return QString::null; +} + +bool Pic::Protection::extractRanges(const QString &name, QValueVector
&starts, Address &end, bool &ok) +{ + ok = false; + QRegExp regexp("([A-F0-9]+)(/[A-F0-9]+)?(/[A-F0-9]+)?:([A-F0-9]+)"); + if ( !regexp.exactMatch(name) ) return false; + bool ok1; + end = fromHex(regexp.cap(regexp.numCaptures()), &ok1); + if ( !ok1 ) { + qDebug("Malformed end address"); + return true; + } + starts.clear(); + for (int i=1; i=end && (starts.count()==0 || starts[starts.count()-1] starts; + Address end; + bool ok2 = extractRanges(name, starts, end, ok1); + Q_ASSERT(ok1); + Q_ASSERT(ok2); + Q_UNUSED(ok2); + AddressRangeVector rv; + for (uint i=0; ivalues.count()); k++) { + bool ok1; + uint size = bsmask->values[k].name.toUInt(&ok1); + if ( !ok1 ) { + qDebug("Could not recognize boot size value"); + return pr; + } + if ( size==0 ) { + qDebug("Boot size cannot be zero"); + return pr; + } + Address end = 2 * size - 1; // instruction words + if ( pr.ends.count()!=0 && end==pr.ends[pr.ends.count()-1] ) continue; + pr.ends.append(end); + qHeapSort(pr.ends); + } + } else { + pr.starts.append(rdata.start); + pr.ends.append(rdata.end); + } + ok = true; + return pr; + } + if ( isBootBlock && bsmask ) { + qDebug("Protected range should not be explicit when boot size is present"); + return pr; + } + + // extract start and end + Address end; + bool ok1; + if ( !extractRanges(name, pr.starts, end, ok1) ) { + qDebug("Could not recognized explicit range"); + return pr; + } + if ( !ok1 ) return pr; + if ( end>rdata.end ) { + qDebug("End is beyond memory range"); + return pr; + } + if ( (rtype!=MemoryRangeType::Code || isBootBlock) && (pr.starts.count()>1 || !rexp.cap(2).isEmpty() || bmask==0) ) { + qDebug("Only code with blocks and boot can have multiple protected ranges"); + return pr; + } + if ( isBootBlock && pr.starts[0]!=0 ) { + qDebug("Boot block start should be zero"); + return pr; + } + pr.ends.append(end); + + // check with boot block + if ( pr.starts.count()>1 ) { + if ( bmask==0 ) { + qDebug("No boot mask"); + return pr; + } + for (uint i=0; ivalues.count()); i++) { + if ( bmask->values[i].name=="Off" ) continue; + bool ok1; + ProtectedRange bpr = extractRange(bmask->name, bmask->values[i].name, ok1); + if ( !ok1 ) return pr; + if ( bpr.ends.count()!=pr.starts.count() ) { + qDebug("Boot number of ends (%i) should be the same as code number of starts (%i)", int(bpr.ends.count()), int(pr.starts.count())); + return pr; + } + for (uint k=0; k * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_PROTECTION_H +#define PIC_PROTECTION_H + +#include "pic.h" + +namespace Pic +{ +class Data; + +//---------------------------------------------------------------------------- +class Protection +{ +public: + enum { MAX_NB_BLOCKS = 8 }; + enum Family { NoProtection = 0, BasicProtection, BlockProtection, CodeGuard, Nb_Families }; + enum Type { ProgramProtected = 0, WriteProtected, ReadProtected, + StandardSecurity, HighSecurity, Nb_Types }; + +public: + Protection(const Pic::Data &data, const Config &config) : _data(data), _config(config) {} + Family family() const; + QString securityValueName(Type type) const; + bool hasBootBlock() const; + QString bootSizeMaskName() const; + QString bootMaskName(Type ptype) const; + QString bootLabel() const; + uint nbBlocks() const; + QString blockSizeMaskName(uint i) const; + QString blockMaskName(Type ptype, uint i) const; + QString blockLabel(uint i) const; + AddressRangeVector extractRanges(const QString &name, MemoryRangeType type) const; + bool checkRange(const QString &mask, const QString &name) const; + QString maskName(Type type, MemoryRangeType mtype) const; + bool isAllProtectedValueName(const QString &valueName) const; + bool isNoneProtectedValueName(const QString &valueName) const; + +private: + const Pic::Data &_data; + const Config &_config; + + enum SegmentType { BootSegment = 0, SecureSegment, GeneralSegment, Nb_SegmentTypes }; + static bool extractRanges(const QString &name, QValueVector
&starts, Address &end, bool &ok); + class ProtectedRange { + public: + QValueVector
starts, ends; + }; + ProtectedRange extractRange(const QString &mask, const QString &name, bool &ok) const; +}; + +} //namespace + +#endif diff --git a/src/devices/pic/base/pic_register.cpp b/src/devices/pic/base/pic_register.cpp new file mode 100644 index 0000000..fcfe5ef --- /dev/null +++ b/src/devices/pic/base/pic_register.cpp @@ -0,0 +1,287 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_register.h" + +#include "pic.h" + +//----------------------------------------------------------------------------- +Pic::RegistersData::RegistersData(const Data &data) + : nbBanks(0), accessBankSplit(0), _data(data) +{} + +Address Pic::RegistersData::mirroredAddress(Address address) const +{ + Address mirror = address; + for (uint i=0; i=mirrored[i][k].start+mirrored[i][k].length ) continue; + delta = address - mirrored[i][k].start; + break; + } + if ( delta==-1 ) continue; + for (uint k=0; k::const_iterator it; + for (it=sfrs.begin(); it!=sfrs.end(); ++it) { + if ( it.data().address!=address ) continue; + for (uint i=0; i=unused[i].start && address"; + case Sfr: return sfrNames[address]; + } + Q_ASSERT(false); + return QString::null; +} + +bool Pic::RegistersData::hasPort(uint index) const +{ + Q_ASSERT( index Pic::RegistersData::relatedRegisters(const Register::TypeData &data) const +{ + QValueList list; + if ( data.type()==Register::Regular ) { + int i = portIndex(data.address()); + if ( i==-1 ) list.append(data); + else { + list.append(Register::TypeData(sfrs[portName(i)].address, nbChars())); + if ( hasTris(i) ) list.append(Register::TypeData(sfrs[trisName(i)].address, nbChars())); + if ( hasLatch(i) ) list.append(Register::TypeData(sfrs[latchName(i)].address, nbChars())); + } + } else if ( data.type()==Register::Combined ) { + uint nb = nbBitsToNbBytes(4*data.nbChars()) / nbBytes(); + for (uint i=0; i::const_iterator it; + for (it=sfrNames.begin(); it!=sfrNames.end(); ++it) + if ( bankFromAddress(it.key())==i ) return true; + return false; +} + +bool Pic::RegistersData::hasSharedGprs(uint &firstIndex, bool &all) const +{ + bool ok = false; + all = true; + for (uint i=0; i>(QDataStream &s, RangeData &rd) +{ + s >> rd.start >> rd.length; + return s; +} + +QDataStream &Pic::operator <<(QDataStream &s, const RegisterBitData &rbd) +{ + s << Q_UINT8(rbd.properties) << Q_UINT8(rbd.por) << Q_UINT8(rbd.mclr); + return s; +} +QDataStream &Pic::operator >>(QDataStream &s, RegisterBitData &rbd) +{ + Q_UINT8 properties, por, mclr; + s >> properties >> por >> mclr; + rbd.properties = RegisterBitProperties(properties); + rbd.por = RegisterBitState(por); + rbd.mclr = RegisterBitState(mclr); + return s; +} + +QDataStream &Pic::operator <<(QDataStream &s, const RegisterData &rd) +{ + s << rd.address; + for (int i=0; i>(QDataStream &s, RegisterData &rd) +{ + s >> rd.address; + for (int i=0; i> rd.bits[i]; + return s; +} + +QDataStream &Pic::operator <<(QDataStream &s, const CombinedData &rd) +{ + s << rd.address << rd.nbChars; + return s; +} +QDataStream &Pic::operator >>(QDataStream &s, CombinedData &rd) +{ + s >> rd.address >> rd.nbChars; + return s; +} + +QDataStream &Pic::operator <<(QDataStream &s, const RegistersData &rd) +{ + s << rd.nbBanks << rd.accessBankSplit << rd.unusedBankMask; + s << rd.sfrs << rd.mirrored << rd.unused << rd.combined; + return s; +} +QDataStream &Pic::operator >>(QDataStream &s, RegistersData &rd) +{ + s >> rd.nbBanks >> rd.accessBankSplit >> rd.unusedBankMask; + s >> rd.sfrs >> rd.mirrored >> rd.unused >> rd.combined; + rd.sfrNames.clear(); + QMap::const_iterator it; + for(it=rd.sfrs.begin(); it!=rd.sfrs.end(); ++it) rd.sfrNames[it.data().address] = it.key(); + return s; +} diff --git a/src/devices/pic/base/pic_register.h b/src/devices/pic/base/pic_register.h new file mode 100644 index 0000000..41da020 --- /dev/null +++ b/src/devices/pic/base/pic_register.h @@ -0,0 +1,115 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_REGISTER_H +#define PIC_REGISTER_H + +#include + +#include "devices/base/register.h" +#include "pic.h" + +namespace Pic +{ +class Data; +struct RangeData { + Address start; + uint length; +}; + +//----------------------------------------------------------------------------- +enum RegisterType { UnusedRegister, Sfr, Gpr, Mirrored}; +enum RegisterBitProperty { RegisterBitUnused = 0x0, + RegisterBitRead = 0x1, RegisterBitWrite = 0x2, + RegisterBitOnlySoftwareClear = 0x4, RegisterBitOnlySoftwareSet = 0x8, + MaxRegisterBitProperty = 0x15 +}; +Q_DECLARE_FLAGS(RegisterBitProperties, RegisterBitProperty) +Q_DECLARE_OPERATORS_FOR_FLAGS(RegisterBitProperties) +enum RegisterBitState { RegisterBitUnknown = 0, RegisterBitLow, RegisterBitHigh, + RegisterBitUnchanged, RegisterBitDepends, RegisterBitDependsConfig, Nb_RegisterBitStates +}; + +//----------------------------------------------------------------------------- +class RegisterBitData +{ +public: + RegisterBitData() : properties(RegisterBitUnused) {} + RegisterBitProperties properties; + RegisterBitState por, mclr; +}; +struct RegisterData +{ + Address address; + RegisterBitData bits[Device::MAX_NB_PORT_BITS]; +}; +struct CombinedData +{ + Address address; + uint nbChars; +}; + +class RegistersData : public Device::RegistersData +{ +public: + RegistersData(const Data &data); + virtual uint nbBits() const { return _data.architecture().data().nbBitsRegister; } + uint nbBytesPerBank() const { return _data.architecture().data().registerBankLength; } + uint nbRegistersPerBank() const { return nbBytesPerBank() / nbBytes(); } + uint nbCharsAddress() const { return ::nbChars(nbRegisters() - 1); } + virtual uint nbRegisters() const { return nbBanks * nbRegistersPerBank(); } + virtual uint addressFromIndex(uint i) const { return nbBytes() * i; } + virtual uint indexFromAddress(Address address) const { return address.toUInt() / nbBytes(); } + bool isBankUsed(uint i) const; + uint bankFromAddress(Address address) const { return indexFromAddress(address) / nbRegistersPerBank(); } + bool bankHasSfrs(uint i) const; // slow + bool hasSharedGprs(uint &firstIndex, bool &all) const; // i.e. mirrored in all banks (all is for first bank only) + uint firstGprIndex() const; // in first bank + + uint nbBanks, accessBankSplit, unusedBankMask; + QMap sfrs; + QMap sfrNames; // address -> name + QValueVector > mirrored; + QValueVector unused; + QMap combined; + + virtual Device::RegisterProperties properties(Address address) const; + RegisterType type(Address address) const; + QString label(Address address) const; + virtual QValueList relatedRegisters(const Register::TypeData &data) const; + + virtual bool hasPort(uint index) const; + virtual int portIndex(Address address) const; + virtual QString portName(uint index) const; + bool hasTris(uint index) const; + QString trisName(uint index) const; + bool hasLatch(uint index) const; + QString latchName(uint index) const; + virtual bool hasPortBit(uint index, uint bit) const; + virtual QString portBitName(uint index, uint bit) const; + +private: + const Data &_data; + Address mirroredAddress(Address address) const; +}; + +//----------------------------------------------------------------------------- +QDataStream &operator <<(QDataStream &s, const RangeData &rd); +QDataStream &operator >>(QDataStream &s, RangeData &rd); +QDataStream &operator <<(QDataStream &s, const RegisterBitData &rbd); +QDataStream &operator >>(QDataStream &s, RegisterBitData &rbd); +QDataStream &operator <<(QDataStream &s, const RegisterData &rd); +QDataStream &operator >>(QDataStream &s, RegisterData &rd); +QDataStream &operator <<(QDataStream &s, const CombinedData &rd); +QDataStream &operator >>(QDataStream &s, CombinedData &rd); +QDataStream &operator <<(QDataStream &s, const RegistersData &rd); +QDataStream &operator >>(QDataStream &s, RegistersData &rd); + +} // namespace + +#endif diff --git a/src/devices/pic/gui/Makefile.am b/src/devices/pic/gui/Makefile.am new file mode 100644 index 0000000..72f3165 --- /dev/null +++ b/src/devices/pic/gui/Makefile.am @@ -0,0 +1,9 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO +libpicui_la_LDFLAGS = $(all_libraries) +noinst_LTLIBRARIES = libpicui.la + + +libpicui_la_SOURCES = pic_config_editor.cpp \ + pic_config_word_editor.cpp pic_hex_view.cpp pic_memory_editor.cpp pic_register_view.cpp pic_group_ui.cpp \ + pic_prog_group_ui.cpp diff --git a/src/devices/pic/gui/pic_config_editor.cpp b/src/devices/pic/gui/pic_config_editor.cpp new file mode 100644 index 0000000..1812bbf --- /dev/null +++ b/src/devices/pic/gui/pic_config_editor.cpp @@ -0,0 +1,68 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_config_editor.h" + +#include +#include +#include + +#include "pic_config_word_editor.h" +#include "common/common/misc.h" +#include "common/gui/misc_gui.h" + +//---------------------------------------------------------------------------- +Pic::MemoryConfigEditorWidget::MemoryConfigEditorWidget(Memory &memory, bool withWordEditor, QWidget *parent) + : Device::MemoryEditorGroup(&memory, parent, "pic_config_editor_widget"), + MemoryCaster(MemoryRangeType::Config, memory) +{ + QHBoxLayout *hb = new QHBoxLayout(_top); + + TabWidget *tabw = 0; + uint nbWords = device().nbWords(MemoryRangeType::Config); + if ( nbWords>1 ) { + tabw = new TabWidget(this); + tabw->setIgnoreWheelEvent(true); + hb->addWidget(tabw); + } + + for(uint i=0; i1 ) { + page = new QWidget(tabw); + tabw->addTab(page, device().config()._words[i].name); + } else { + page = new QGroupBox(this); + hb->addWidget(page); + } + QVBoxLayout *vbox = new QVBoxLayout(page, 10, 10); + QHBoxLayout *hbox = new QHBoxLayout(vbox); + ConfigWordEditor *we = new ConfigWordEditor(memory, i, withWordEditor, page); + addEditor(we); + hbox->addWidget(we); + hbox->addStretch(1); + vbox->addStretch(1); + } +} + +//---------------------------------------------------------------------------- +Pic::MemoryConfigEditor::MemoryConfigEditor(const HexView *hexview, Memory &memory, QWidget *parent) + : MemoryTypeEditor(hexview, MemoryRangeType::Config, memory, parent, "pic_config_editor") +{} + +void Pic::MemoryConfigEditor::init(bool first) +{ + MemoryTypeEditor::init(first); + MemoryConfigEditorWidget *w = new MemoryConfigEditorWidget(memory(), true, this); + addEditor(w); + _top->addWidget(w); +} diff --git a/src/devices/pic/gui/pic_config_editor.h b/src/devices/pic/gui/pic_config_editor.h new file mode 100644 index 0000000..888debf --- /dev/null +++ b/src/devices/pic/gui/pic_config_editor.h @@ -0,0 +1,37 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_CONFIG_EDITOR_H +#define PIC_CONFIG_EDITOR_H + +#include "pic_memory_editor.h" + +//---------------------------------------------------------------------------- +namespace Pic +{ +class HexView; + +class MemoryConfigEditorWidget : public Device::MemoryEditorGroup, public MemoryCaster +{ +Q_OBJECT +public: + MemoryConfigEditorWidget(Memory &memory, bool withWordEditor, QWidget *parent); +}; + +//---------------------------------------------------------------------------- +class MemoryConfigEditor : public MemoryTypeEditor +{ +Q_OBJECT +public: + MemoryConfigEditor(const HexView *hexview, Memory &memory, QWidget *parent); + virtual void init(bool first); +}; + +} // namespace + +#endif diff --git a/src/devices/pic/gui/pic_config_word_editor.cpp b/src/devices/pic/gui/pic_config_word_editor.cpp new file mode 100644 index 0000000..23e4bce --- /dev/null +++ b/src/devices/pic/gui/pic_config_word_editor.cpp @@ -0,0 +1,196 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * Copyright (C) 2003-2004 Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#include "pic_config_word_editor.h" + +#include +#include +#include +#include + +#include "common/common/misc.h" +#include "common/gui/misc_gui.h" + +//---------------------------------------------------------------------------- +Pic::ConfigWordComboBox::ConfigWordComboBox(QWidget *parent) + : ComboBox(parent) +{ + setIgnoreWheelEvent(true); +} + +uint Pic::ConfigWordComboBox::index() const +{ + if ( isValid() ) return _map[currentItem()]; + if ( currentItem()==0 ) return _invalidIndex; + return _map[currentItem()-1]; +} + +void Pic::ConfigWordComboBox::setItem(uint i) +{ + if ( !isValid() ) removeItem(0); + for (uint l=0; l<_map.count(); l++) + if ( _map[l]==i ) setCurrentItem(l); +} + +void Pic::ConfigWordComboBox::setInvalidItem(uint i, const QString &label) +{ + if ( !isValid() ) changeItem(label, 0); + else insertItem(label, 0); + setCurrentItem(0); + _invalidIndex = i; +} + +//---------------------------------------------------------------------------- +Pic::ConfigWordDialog::ConfigWordDialog(const Memory &memory, uint ci, QWidget *parent) + : Dialog(parent, "config_word_dialog", true, i18n("Config Word Details"), Close, Close, false) +{ + uint nbChars = memory.device().nbCharsWord(MemoryRangeType::Config); + const Config::Word &cword = memory.device().config()._words[ci]; + + QGridLayout *grid = new QGridLayout(mainWidget(), 0, 0, 10, 10); + uint row = 0; + QLabel *label = new QLabel(i18n("Name:"), mainWidget()); + grid->addWidget(label, row, 0); + label = new QLabel(cword.name, mainWidget()); + grid->addWidget(label, row, 1); + row++; + label = new QLabel(i18n("Index:"), mainWidget()); + grid->addWidget(label, row, 0); + label = new QLabel(QString::number(ci), mainWidget()); + grid->addWidget(label, row, 1); + row++; + label = new QLabel(i18n("Raw Value:"), mainWidget()); + grid->addWidget(label, row, 0); + label = new QLabel(toHexLabel(memory.word(MemoryRangeType::Config, ci), nbChars), mainWidget()); + grid->addWidget(label, row, 1); + row++; + label = new QLabel(i18n("Value:"), mainWidget()); + grid->addWidget(label, row, 0); + label = new QLabel(toHexLabel(memory.normalizedWord(MemoryRangeType::Config, ci), nbChars), mainWidget()); + grid->addWidget(label, row, 1); + row++; + label = new QLabel(i18n("Raw Blank Value:"), mainWidget()); + grid->addWidget(label, row, 0); + label = new QLabel(toHexLabel(cword.bvalue, nbChars), mainWidget()); + grid->addWidget(label, row, 1); + row++; + label = new QLabel(i18n("Used Mask:"), mainWidget()); + grid->addWidget(label, row, 0); + label = new QLabel(toHexLabel(cword.usedMask(), nbChars), mainWidget()); + grid->addWidget(label, row, 1); + row++; + label = new QLabel(i18n("Write Mask:"), mainWidget()); + grid->addWidget(label, row, 0); + label = new QLabel(toHexLabel(cword.wmask, nbChars), mainWidget()); + grid->addWidget(label, row, 1); + row++; + label = new QLabel(i18n("Protected Mask:"), mainWidget()); + grid->addWidget(label, row, 0); + label = new QLabel(toHexLabel(cword.pmask, nbChars), mainWidget()); + grid->addWidget(label, row, 1); + row++; + label = new QLabel(i18n("Checksum Mask:"), mainWidget()); + grid->addWidget(label, row, 0); + label = new QLabel(toHexLabel(cword.cmask, nbChars), mainWidget()); + grid->addWidget(label, row, 1); + row++; +} + +//---------------------------------------------------------------------------- +Pic::ConfigWordEditor::ConfigWordEditor(Memory &memory, uint ci, bool withWordEditor, QWidget *parent) + : MemoryEditor(MemoryRangeType::Config, memory, parent, "pic_config_word_editor"), _configIndex(ci) +{ + if (withWordEditor) { + QHBoxLayout *hbox = new QHBoxLayout(_top); + _mdb = new MemoryRangeEditor(MemoryRangeType::Config, memory, 1, 1, ci, 1, this); + _mdb->init(); + connect(_mdb, SIGNAL(modified()), SIGNAL(modified())); + connect(_mdb, SIGNAL(modified()), SLOT(updateDisplay())); + hbox->addWidget(_mdb); + KPushButton *button = new KPushButton(i18n("Details..."), this); + button->setFixedHeight(button->sizeHint().height()); + connect(button, SIGNAL(clicked()), SLOT(showDialog())); + hbox->addWidget(button); + hbox->addStretch(1); + } else _mdb = 0; + + QGridLayout *grid = new QGridLayout(_top); + grid->setColStretch(2, 1); + const Config::Word &cword = device().config()._words[ci]; + _combos.resize(cword.masks.count()); + uint nbChars = device().nbCharsWord(MemoryRangeType::Config); + for (uint k=0; k<_combos.count(); k++) { + const Config::Mask &cmask = cword.masks[k]; + QLabel *label = new QLabel(Config::maskLabel(cmask.name) + ":", this); + grid->addWidget(label, k, 0); + label = new QLabel(cmask.name, this); + grid->addWidget(label, k, 1); + _combos[k] = new ConfigWordComboBox(this); + for (uint i=0; iappendItem(label, i); + } + connect(_combos[k], SIGNAL(activated(int)), SLOT(slotModified())); + grid->addWidget(_combos[k], k, 2); + } +} + +void Pic::ConfigWordEditor::setReadOnly(bool readOnly) +{ + if (_mdb) _mdb->setReadOnly(readOnly); + const Config::Word &cword = device().config()._words[_configIndex]; + for (uint k=0; k<_combos.count(); k++) { + const Config::Mask &cmask = cword.masks[k]; + _combos[k]->setEnabled(!readOnly && !cmask.value.isOverlapping(cword.pmask) && cmask.values.count()!=1); + } +} + +void Pic::ConfigWordEditor::slotModified() +{ + BitValue v = memory().word(MemoryRangeType::Config, _configIndex); + //qDebug("BinWordEditor::slotModified %i: %s", _configIndex, toHex(v, 4).data()); + for (uint k=0; k<_combos.count(); k++) { + const Config::Mask &cmask = device().config()._words[_configIndex].masks[k]; + v = v.clearMaskBits(cmask.value); + v |= cmask.values[_combos[k]->index()].value; // set value + } + memory().setWord(MemoryRangeType::Config, _configIndex, v); + //qDebug(" now: %s", toHex(v, 4).data()); + if (_mdb) _mdb->updateDisplay(); + emit modified(); +} + +void Pic::ConfigWordEditor::updateDisplay() +{ + BitValue v = memory().word(MemoryRangeType::Config, _configIndex); + uint nbChars = device().nbCharsWord(MemoryRangeType::Config); + //qDebug("BinWordEditor::updateDisplay %i: %s", _configIndex, toHex(v, 4).data()); + for (uint k=0; k<_combos.count(); k++) { + const Config::Mask &cmask = device().config()._words[_configIndex].masks[k]; + for (int i=cmask.values.count()-1; i>=0; i--) { + if ( cmask.values[i].value.isInside(v) ) { + if ( cmask.values[i].isValid() ) _combos[k]->setItem(i); + else { + QString label = i18n("") + " (" + toHexLabel(cmask.values[i].value, nbChars) + ")"; + _combos[k]->setInvalidItem(i, label); + } + break; + } + } + } + if (_mdb) _mdb->updateDisplay(); +} + +void Pic::ConfigWordEditor::showDialog() +{ + ConfigWordDialog dialog(memory(), _configIndex, this); + dialog.exec(); +} diff --git a/src/devices/pic/gui/pic_config_word_editor.h b/src/devices/pic/gui/pic_config_word_editor.h new file mode 100644 index 0000000..8f483c7 --- /dev/null +++ b/src/devices/pic/gui/pic_config_word_editor.h @@ -0,0 +1,70 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * Copyright (C) 2003-2004 Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_CONFIG_WORD_EDITOR_H +#define PIC_CONFIG_WORD_EDITOR_H + +#include + +#include "common/gui/dialog.h" +#include "common/gui/misc_gui.h" +#include "pic_memory_editor.h" + +namespace Pic +{ +//---------------------------------------------------------------------------- +class ConfigWordDialog : public Dialog +{ +Q_OBJECT +public: + ConfigWordDialog(const Memory &memory, uint index, QWidget *parent); +}; + +//---------------------------------------------------------------------------- +class ConfigWordComboBox : public ComboBox +{ +Q_OBJECT +public: + ConfigWordComboBox(QWidget *parent); + void appendItem(const QString &text, uint index) { insertItem(text); _map.append(index); } + uint index() const; + void setItem(uint index); + void setInvalidItem(uint index, const QString &label); + +private: + QValueVector _map; // item index -> value index + uint _invalidIndex; // if invalid -> value index + + bool isValid() const { return uint(count())==_map.count(); } +}; + +//---------------------------------------------------------------------------- +class ConfigWordEditor : public MemoryEditor +{ +Q_OBJECT +public: + ConfigWordEditor(Memory &memory, uint index, bool withWordEditor, QWidget *parent); + virtual void setReadOnly(bool readOnly); + +public slots: + virtual void updateDisplay(); + +private slots: + void slotModified(); + void showDialog(); + +private: + uint _configIndex; + MemoryRangeEditor *_mdb; + QValueVector _combos; +}; + +} // namespace + +#endif diff --git a/src/devices/pic/gui/pic_group_ui.cpp b/src/devices/pic/gui/pic_group_ui.cpp new file mode 100644 index 0000000..3f7a84c --- /dev/null +++ b/src/devices/pic/gui/pic_group_ui.cpp @@ -0,0 +1,87 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_group_ui.h" + +#include + +#include "libgui/main_global.h" +#include "pic_hex_view.h" +#include "pic_register_view.h" +#include "pic_config_editor.h" +#include "coff/base/text_coff.h" +#include "libgui/gui_debug_manager.h" +#include "common/gui/list_container.h" + +Device::HexView *Pic::GroupUI::createHexView(const HexEditor &editor, QWidget *parent) const +{ + return new HexView(editor, parent); +} + +Register::View *Pic::GroupUI::createRegisterView(QWidget *parent) const +{ + return new RegisterView(parent); +} + +Device::MemoryEditor *Pic::GroupUI::createConfigEditor(Device::Memory &memory, QWidget *parent) const +{ + return new MemoryConfigEditorWidget(static_cast(memory), false, parent); +} + +void Pic::GroupUI::fillWatchListContainer(ListContainer *container, QValueVector &ids) const +{ + ids.clear(); + const Pic::Data &data = static_cast(*Main::deviceData()); + const Pic::RegistersData &rdata = data.registersData(); + ListContainer *branch = container->appendBranch(i18n("SFRs")); + QValueVector list = Pic::sfrList(data); + for (uint i=0; iappendItem(list[i].label(), ids.count(), ListContainer::UnChecked); + ids.append(list[i].data()); + } + branch = container->appendBranch(i18n("I/Os")); + for (uint i=0; iappendItem(name, ids.count(), ListContainer::UnChecked); + ids.append(Register::TypeData(rdata.sfrs[name].address, rdata.nbChars())); + } + branch = container->appendBranch(i18n("GPRs")); + const Coff::Object *coff = Debugger::manager->coff(); + list = Pic::gprList(data, coff); + for (uint k=0; kappendBranch(i18n("Bank %1").arg(k))); + uint nb = 0; + for (uint i=0; iappendItem(list[i].label(), ids.count(), ListContainer::UnChecked); + ids.append(list[i].data()); + nb++; + } + } + branch = container->appendBranch(i18n("Variables")); + if (coff) { + list = Pic::variableList(data, *coff); + if ( list.count()==0 ) { + branch->appendItem(i18n("No variable"), ids.count(), ListContainer::Disabled); + ids.append(Register::TypeData()); + } else for (uint i=0; iappendItem(list[i].label(), ids.count(), ListContainer::UnChecked); + ids.append(list[i].data()); + } + } else { + branch->appendItem(i18n("Please compile the current project"), ids.count(), ListContainer::Disabled); + ids.append(Register::TypeData()); + } +} + +Register::ListViewItem *Pic::GroupUI::createWatchItem(const Register::TypeData &data, KListViewItem *parent) const +{ + return new Pic::RegisterListViewItem(data, parent); +} diff --git a/src/devices/pic/gui/pic_group_ui.h b/src/devices/pic/gui/pic_group_ui.h new file mode 100644 index 0000000..a8bee66 --- /dev/null +++ b/src/devices/pic/gui/pic_group_ui.h @@ -0,0 +1,29 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_GROUP_UI_H +#define PIC_GROUP_UI_H + +#include "devices/gui/device_group_ui.h" + +namespace Pic +{ + +class GroupUI : public Device::GroupUI +{ +public: + virtual Device::HexView *createHexView(const HexEditor &editor, QWidget *parent) const; + virtual Register::View *createRegisterView(QWidget *parent) const; + virtual Device::MemoryEditor *createConfigEditor(Device::Memory &memory, QWidget *parent) const; + virtual void fillWatchListContainer(ListContainer *container, QValueVector &ids) const; + virtual Register::ListViewItem *createWatchItem(const Register::TypeData &data, KListViewItem *parent) const; +}; + +} // namespace + +#endif diff --git a/src/devices/pic/gui/pic_hex_view.cpp b/src/devices/pic/gui/pic_hex_view.cpp new file mode 100644 index 0000000..07a1938 --- /dev/null +++ b/src/devices/pic/gui/pic_hex_view.cpp @@ -0,0 +1,60 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * Copyright (C) 2003 Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#include "pic_hex_view.h" + +#include +#include + +#include + +#include "pic_memory_editor.h" +#include "pic_config_editor.h" + +Pic::HexView::HexView(const HexEditor &editor, QWidget *parent) + : Device::HexView(editor, parent, "pic_hex_view") +{} + +const Pic::MemoryRangeType::Type Pic::HexView::MEMORY_DATA[] = { + MemoryRangeType::Code, MemoryRangeType::Config, MemoryRangeType::Eeprom, MemoryRangeType::UserId, + MemoryRangeType::Cal, MemoryRangeType::Nb_Types +}; + +void Pic::HexView::display() +{ + bool first = true; + for (uint i=0; MEMORY_DATA[i]!=MemoryRangeType::Nb_Types; i++) { + Pic::MemoryRangeType type = MEMORY_DATA[i]; + if ( !memory()->device().isReadable(type) ) continue; + Device::MemoryTypeEditor *e = 0; + switch (type.type()) { + case MemoryRangeType::Config: e = new MemoryConfigEditor(this, *memory(), this); break; + case MemoryRangeType::Cal: e = new MemoryCalibrationEditor(this, *memory(), this); break; + case MemoryRangeType::Code: + case MemoryRangeType::Eeprom: e = new MemoryTypeRangeEditor(this, type, *memory(), this); break; + case MemoryRangeType::UserId: e = new MemoryUserIdEditor(this, *memory(), this); break; + case MemoryRangeType::DeviceId: + case MemoryRangeType::HardwareStack: + case MemoryRangeType::ProgramExecutive: + case MemoryRangeType::DebugVector: + case MemoryRangeType::CalBackup: + case MemoryRangeType::Nb_Types: Q_ASSERT(false); break; + } + e->init(first); + e->show(); + _top->addWidget(e); + addEditor(e); + first = false; + } +} + +BitValue Pic::HexView::checksum() const +{ + return (_memory ? memory()->checksum() : 0x0000); +} diff --git a/src/devices/pic/gui/pic_hex_view.h b/src/devices/pic/gui/pic_hex_view.h new file mode 100644 index 0000000..2086ccb --- /dev/null +++ b/src/devices/pic/gui/pic_hex_view.h @@ -0,0 +1,39 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * Copyright (C) 2003 Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_HEX_VIEW_H +#define PIC_HEX_VIEW_H + +class QVBoxLayout; + +#include "devices/gui/hex_view.h" +#include "devices/pic/pic/pic_memory.h" + +namespace Pic +{ + +class HexView : public Device::HexView +{ +Q_OBJECT +public: + HexView(const HexEditor &editor, QWidget *parent); + Memory *memory() { return static_cast(_memory); } + const Memory *memory() const { return static_cast(_memory); } + virtual uint nbChecksumChars() const { return 4; } + virtual BitValue checksum() const; + +private: + static const MemoryRangeType::Type MEMORY_DATA[]; + + virtual void display(); +}; + +} // namespace + +#endif diff --git a/src/devices/pic/gui/pic_memory_editor.cpp b/src/devices/pic/gui/pic_memory_editor.cpp new file mode 100644 index 0000000..3d78097 --- /dev/null +++ b/src/devices/pic/gui/pic_memory_editor.cpp @@ -0,0 +1,404 @@ +/*************************************************************************** + * Copyright (C) 2005-2007 Nicolas Hadacek * + * Copyright (C) 2003-2004 Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#include "pic_memory_editor.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "common/common/misc.h" +#include "pic_config_editor.h" +#include "libgui/toplevel.h" +#include "libgui/main_global.h" +#include "devices/pic/prog/pic_prog.h" +#include "libgui/global_config.h" +#include "pic_hex_view.h" + +//----------------------------------------------------------------------------- +Pic::MemoryEditorLegend::Data::Data(const QString &text, QWidget *parent) +{ + button = new PopupButton(text, parent); + KActionCollection *ac = 0; + KAction *a = new KAction(i18n("Go to start"), "top", 0, parent, SLOT(gotoStart()), ac); + actions.append(a); + button->appendAction(a); + a = new KAction(i18n("Go to end"), "bottom", 0, parent, SLOT(gotoEnd()), ac); + actions.append(a); + button->appendAction(a); + label = new QLabel(parent); +} + +void Pic::MemoryEditorLegend::Data::setProtected(bool on) +{ + if (on) label->setPaletteBackgroundColor(MemoryEditorLegend::protectedColor()); + else label->unsetPalette(); +} + +bool Pic::MemoryEditorLegend::Data::hasAction(const KAction *action) const +{ + for (uint i=0; isetFixedWidth(20); + w->setPaletteBackgroundColor(protectedColor()); + grid->addWidget(w, 0, 0); + const Protection &protection = device().config().protection(); + QString s = (protection.family()==Protection::CodeGuard ? i18n("High Security") : i18n("Code protection")); + QLabel *label = new QLabel(s, this); + grid->addMultiCellWidget(label, 0,0, 1,2); + grid->addRowSpacing(1, 10); + uint row = 2; + + if ( type==MemoryRangeType::Code && protection.hasBootBlock() ) { + w = new QWidget(this); + w->setFixedWidth(20); + w->setPaletteBackgroundColor(bootColor()); + grid->addWidget(w, row, 0); + _boot = Data(protection.bootLabel(), this); + grid->addWidget(_boot.button, row, 1); + grid->addWidget(_boot.label, row, 2); + row++; + } + + uint nb = (type==MemoryRangeType::Code ? protection.nbBlocks() : 0); + for (uint i=0; isetFixedWidth(20); + w->setPaletteBackgroundColor(blockColor(i)); + grid->addWidget(w, row, 0); + _blocks.append(Data(protection.blockLabel(i), this)); + grid->addWidget(_blocks[i].button, row, 1); + grid->addWidget(_blocks[i].label, row, 2); + row++; + } +} + +void Pic::MemoryEditorLegend::updateDisplay() +{ + const Protection &protection = device().config().protection(); + Protection::Type ptype = (protection.family()==Protection::CodeGuard ? Protection::HighSecurity : Protection::ProgramProtected); + uint nbChars = 2 * device().nbBytesAddress(); + if (_boot.label) { + AddressRange r = memory().bootRange(); + if ( r.isEmpty() ) _boot.label->setText(i18n("not present")); + else _boot.label->setText(QString("[%1:%2]").arg(toHex(r.start, nbChars)).arg(toHex(r.end, nbChars))); + _boot.button->setEnabled(!r.isEmpty()); + _boot.setProtected(memory().isBootProtected(ptype)); + } + for (uint i=0; i<_blocks.count(); i++) { + AddressRange r = memory().blockRange(i); + if ( r.isEmpty() ) _blocks[i].label->setText(i18n("not present")); + else _blocks[i].label->setText(QString("[%1:%2]").arg(toHex(r.start, nbChars)).arg(toHex(r.end, nbChars))); + _blocks[i].button->setEnabled(!r.isEmpty()); + _blocks[i].setProtected(memory().isBlockProtected(ptype, i)); + } +} + +void Pic::MemoryEditorLegend::gotoStart() +{ + Address start = device().range(type()).start; + const KAction *action = static_cast(sender()); + if ( _boot.hasAction(action) ) { + AddressRange r = memory().bootRange(); + emit setStartWord(r.start - start); + return; + } + for (uint i=0; i<_blocks.count(); i++) { + if ( _blocks[i].hasAction(action) ) { + AddressRange r = memory().blockRange(i); + emit setStartWord(r.start - start); + return; + } + } + Q_ASSERT(false); +} + +void Pic::MemoryEditorLegend::gotoEnd() +{ + Address start = device().range(type()).start; + const KAction *action = static_cast(sender()); + if ( _boot.hasAction(action) ) { + AddressRange r = memory().bootRange(); + emit setEndWord(r.end - start); + return; + } + for (uint i=0; i<_blocks.count(); i++) { + if ( _blocks[i].hasAction(action) ) { + AddressRange r = memory().blockRange(i); + emit setEndWord(r.end - start); + return; + } + } + Q_ASSERT(false); +} + + +//----------------------------------------------------------------------------- +Pic::HexWordEditor::HexWordEditor(MemoryRangeType type, Memory &memory, QWidget *parent) + : Device::HexWordEditor(memory, memory.device().nbCharsWord(type), parent), + MemoryCaster(type, memory) +{} + +void Pic::HexWordEditor::setWord(BitValue value) +{ + if ( type()==MemoryRangeType::Config ) { + const Config::Word &cword = device().config()._words[_offset]; + value |= cword.usedMask().complementInMask(device().mask(MemoryRangeType::Config)); + } + memory().setWord(type(), _offset, value); +} + +//----------------------------------------------------------------------------- +Pic::MemoryRangeEditor::MemoryRangeEditor(MemoryRangeType type, Memory &memory, + uint nbLines, uint nbCols, + uint wordOffset, int nbWords, QWidget *parent) + : Device::MemoryRangeEditor(memory, nbLines, nbCols, wordOffset, nbWords, parent, "pic_memory_range_editor"), + MemoryCaster(type, memory), _legend(0) +{ + if ( type==MemoryRangeType::Code ) _blockRanges.resize(memory.device().config().protection().nbBlocks()); +} + +void Pic::MemoryRangeEditor::addLegend(QVBoxLayout *vbox) +{ + if ( type()==MemoryRangeType::Code || type()==MemoryRangeType::Eeprom ) { + _legend = new MemoryEditorLegend(type(), memory(), this); + connect(_legend, SIGNAL(setStartWord(int)), SLOT(setStartWord(int))); + connect(_legend, SIGNAL(setEndWord(int)), SLOT(setEndWord(int))); + vbox->addWidget(_legend); + } +} + +bool Pic::MemoryRangeEditor::isRangeReadOnly() const +{ + return ( (type().data().properties & ReadOnly) || type()==MemoryRangeType::CalBackup ); +} + +void Pic::MemoryRangeEditor::updateDisplay() +{ + const Protection &protection = device().config().protection(); + if ( type()==MemoryRangeType::Code ) { + if ( protection.hasBootBlock() ) _bootRange = memory().bootRange(); + for (uint k=0; k<_blockRanges.count(); k++) + _blockRanges[k] = memory().blockRange(k); + } + Protection::Type ptype = (protection.family()==Protection::CodeGuard ? Protection::HighSecurity : Protection::ProgramProtected); + _codeProtected = memory().protectedRanges(ptype, type()); + Device::MemoryRangeEditor::updateDisplay(); + if (_legend) _legend->updateDisplay(); +} + +void Pic::MemoryRangeEditor::updateAddressColor(uint i, Address address) +{ + if ( _codeProtected.contains(address) ) + _addresses[i]->setPaletteBackgroundColor(MemoryEditorLegend::protectedColor()); + else _addresses[i]->unsetPalette(); + _blocks[i]->unsetPalette(); + if ( type()==MemoryRangeType::Code ) { + if ( _bootRange.contains(address) ) _blocks[i]->setPaletteBackgroundColor(MemoryEditorLegend::bootColor()); + else for (uint k=0; k<_blockRanges.count(); k++) { + if ( !_blockRanges[k].contains(address) ) continue; + _blocks[i]->setPaletteBackgroundColor(MemoryEditorLegend::blockColor(k)); + break; + } + } +} + +Device::HexWordEditor *Pic::MemoryRangeEditor::createHexWordEditor(QWidget *parent) +{ + return new HexWordEditor(type(), memory(), parent); +} + +//----------------------------------------------------------------------------- +Pic::MemoryTypeEditor::MemoryTypeEditor(const HexView *hexview, MemoryRangeType type, Memory &memory, QWidget *parent, const char *name) + : Device::MemoryTypeEditor(hexview, memory, parent, name), MemoryCaster(type, memory) +{} + +void Pic::MemoryTypeEditor::init(bool first) +{ + Device::MemoryTypeEditor::init(first); + _title->setText(type().label()); + + uint nbChars = device().nbCharsWord(type()); + QString add; + if ( type()==MemoryRangeType::UserId ) add = i18n(" - recommended mask: %1").arg(toHexLabel(device().userIdRecommendedMask(), nbChars)); + if ( type()==MemoryRangeType::Cal && _hexview ) add = i18n(" - not programmed by default"); + QString comment = i18n("%1-bit words - mask: %2") + .arg(device().nbBitsWord(type())).arg(toHexLabel(device().mask(type()), nbChars)); + _comment->setText(comment + add); +} + +bool Pic::MemoryTypeEditor::internalDoAction(Device::Action action) +{ + Programmer::PicBase *prog = static_cast(Main::programmer()); + switch (action) { + case Device::Clear: memory().clear(type()); return true; + case Device::Zero: memory().fill(type(), 0); return true; + case Device::ChecksumCheck : memory().checksumCheckFill(); return true; + case Device::Reload: { + const Memory *omemory = static_cast(originalMemory()); + Q_ASSERT(omemory); + memory().copyFrom(type(), *omemory); return true; + } + case Device::Program: + prog->programSingle(type(), memory()); + return false; + case Device::Verify: + prog->verifySingle(type(), memory()); + return false; + case Device::Read: + return prog->readSingle(type(), memory()); + case Device::Erase: + prog->eraseSingle(type()); + return false; + case Device::BlankCheck: + prog->blankCheckSingle(type()); + return false; + case Device::Nb_Actions: break; + } + Q_ASSERT(false); + return false; +} + +//----------------------------------------------------------------------------- +Pic::MemoryTypeRangeEditor::MemoryTypeRangeEditor(const HexView *hexview, MemoryRangeType type, Memory &memory, QWidget *parent) + : MemoryTypeEditor(hexview, type, memory, parent, "pic_memory_type_range_editor"), _mre(0) +{} + +void Pic::MemoryTypeRangeEditor::init(bool first) +{ + MemoryTypeEditor::init(first); + uint nbLines = 0; + if ( type()==MemoryRangeType::Code ) nbLines = 16; + else if ( type()==MemoryRangeType::Eeprom ) nbLines = 8; + else nbLines = (device().nbWords(type())/8>1 ? 2 : 1); + _mre = new MemoryRangeEditor(type(), memory(), nbLines, 8, 0, -1, this); + addEditor(_mre); + _top->addWidget(_mre); + _mre->init(); +} + +//----------------------------------------------------------------------------- +Pic::MemoryUserIdEditor::MemoryUserIdEditor(const HexView *hexview, Memory &memory, QWidget *parent) + : MemoryTypeRangeEditor(hexview, MemoryRangeType::UserId, memory, parent), _saveReadOnly(false) +{} + +void Pic::MemoryUserIdEditor::init(bool first) +{ + MemoryTypeRangeEditor::init(first); + _setToChecksum = new KToggleAction(i18n("Set to unprotected checksum"), 0, 0, + this, SLOT(toggleSetToChecksum()), Main::toplevel().actionCollection()); + addAction(_setToChecksum); + if ( readConfigEntry(BaseGlobalConfig::UserIdSetToChecksum).toBool() && memory().isClear(MemoryRangeType::UserId) ) { + _setToChecksum->activate(); + toggleSetToChecksum(); + } +} + +void Pic::MemoryUserIdEditor::toggleSetToChecksum() +{ + if ( _setToChecksum->isChecked() ) { + _mre->setComment(i18n("Set to unprotected checksum")); + emit modified(); + } else _mre->setComment(QString::null); + setReadOnly(_saveReadOnly); +} + +void Pic::MemoryUserIdEditor::updateDisplay() +{ + if ( _setToChecksum->isChecked() ) memory().setUserIdToUnprotectedChecksum(); + MemoryTypeRangeEditor::updateDisplay(); +} + +void Pic::MemoryUserIdEditor::setReadOnly(bool readOnly) +{ + _saveReadOnly = readOnly; + MemoryTypeRangeEditor::setReadOnly(readOnly || _setToChecksum->isChecked()); +} + +//----------------------------------------------------------------------------- +Pic::MemoryCalibrationEditor::MemoryCalibrationEditor(const HexView *hexview, Memory &memory, QWidget *parent) + : MemoryTypeEditor(hexview, MemoryRangeType::Cal, memory, parent, "pic_memory_calibration_editor") +{} + +void Pic::MemoryCalibrationEditor::init(bool first) +{ + MemoryTypeEditor::init(first); + MemoryRangeEditor *mre = new MemoryRangeEditor(MemoryRangeType::Cal, memory(), 1, 8, 0, -1, this); + addEditor(mre); + _top->addWidget(mre); + mre->init(); + if ( device().isReadable(MemoryRangeType::CalBackup) ) { + mre = new MemoryRangeEditor(MemoryRangeType::CalBackup, memory(), 1, 8, 0, -1, this); + addEditor(mre); + _top->addWidget(mre); + mre->init(); + mre->setComment(i18n("(backup)")); + } +} + +bool Pic::MemoryCalibrationEditor::hasAction(Device::Action action) const +{ + return ( action==Device::Read || action==Device::Verify || action==Device::Program ); +} + +bool Pic::MemoryCalibrationEditor::internalDoAction(Device::Action action) +{ + Programmer::PicBase *prog = static_cast(Main::programmer()); + switch (action) { + case Device::Reload: { + const Memory *omemory = static_cast(originalMemory()); + Q_ASSERT(omemory); + memory().copyFrom(MemoryRangeType::Cal, *omemory); + memory().copyFrom(MemoryRangeType::CalBackup, *omemory); + return true; + } + case Device::Program: + if ( prog->programCalibration(memory().arrayForWriting(Pic::MemoryRangeType::Cal)) ) + return prog->readSingle(MemoryRangeType::Cal, memory()); + return false; + case Device::Verify: + prog->verifySingle(MemoryRangeType::Cal, memory()); + return false; + case Device::Read: + return prog->readSingle(MemoryRangeType::Cal, memory()); + case Device::Clear: + case Device::Zero: + case Device::ChecksumCheck: + case Device::Erase: + case Device::BlankCheck: + case Device::Nb_Actions: break; + } + Q_ASSERT(false); + return false; +} diff --git a/src/devices/pic/gui/pic_memory_editor.h b/src/devices/pic/gui/pic_memory_editor.h new file mode 100644 index 0000000..bf67cd1 --- /dev/null +++ b/src/devices/pic/gui/pic_memory_editor.h @@ -0,0 +1,189 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * Copyright (C) 2003-2004 Alain Gibaud * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_MEMORY_EDITOR_H +#define PIC_MEMORY_EDITOR_H + +#include +#include +class KToggleAction; + +#include "devices/gui/memory_editor.h" +#include "devices/gui/hex_word_editor.h" +#include "devices/pic/pic/pic_memory.h" +class PopupButton; + +namespace Pic +{ +class HexView; + +//----------------------------------------------------------------------------- +class MemoryCaster +{ +public: + MemoryCaster(MemoryRangeType type, Device::Memory &memory) : _type(type), _memory(memory) {} + MemoryRangeType type() const { return _type; } + const Data &device() const { return static_cast(_memory.device()); } + const Memory &memory() const { return static_cast(_memory); } + Memory &memory() { return static_cast(_memory); } + +private: + MemoryRangeType _type; + Device::Memory &_memory; +}; + +//----------------------------------------------------------------------------- +class MemoryEditor : public Device::MemoryEditor, public MemoryCaster +{ +Q_OBJECT +public: + MemoryEditor(MemoryRangeType type, Memory &memory, QWidget *parent, const char *name) + : Device::MemoryEditor(&memory, parent, name), MemoryCaster(type, memory) {} +}; + +//----------------------------------------------------------------------------- +class MemoryEditorLegend : public MemoryEditor +{ +Q_OBJECT +public: + MemoryEditorLegend(MemoryRangeType type, Memory &memory, QWidget *parent); + virtual void setReadOnly(bool) {} + + static QColor protectedColor() { return QColor("#FF8888"); } + static QColor bootColor() { return QColor("#8888FF"); } + static QColor blockColor(uint i) { return QColor(BLOCK_COLORS[i]); } + +signals: + void setStartWord(int i); + void setEndWord(int i); + +public slots: + virtual void updateDisplay(); + +private slots: + void gotoStart(); + void gotoEnd(); + +private: + class Data { + public: + Data() : button(0), label(0) {} + Data(const QString &text, QWidget *parent); + void setProtected(bool on); + bool hasAction(const KAction *action) const; + PopupButton *button; + QLabel *label; + QValueVector actions; + }; + Data _boot; + QValueVector _blocks; + + static const char * const BLOCK_COLORS[Protection::MAX_NB_BLOCKS]; +}; + +//----------------------------------------------------------------------------- +class HexWordEditor : public Device::HexWordEditor, public MemoryCaster +{ +Q_OBJECT +public: + HexWordEditor(MemoryRangeType type, Memory &memory, QWidget *parent); + +private: + virtual BitValue mask() const { return memory().device().mask(type()); } + virtual BitValue normalizeWord(BitValue value) const { return memory().normalizeWord(type(), _offset, value); } + virtual BitValue word() const { return memory().word(type(), _offset); } + virtual void setWord(BitValue value); +}; + +//----------------------------------------------------------------------------- +class MemoryRangeEditor : public Device::MemoryRangeEditor, public MemoryCaster +{ + Q_OBJECT +public: + MemoryRangeEditor(MemoryRangeType type, Memory &memory, + uint nbLines, uint nbCols, uint wordOffset, int nbWords, QWidget *parent); + +public slots: + virtual void updateDisplay(); + +private: + MemoryEditorLegend *_legend; + AddressRange _bootRange; + AddressRangeVector _blockRanges; + AddressRangeVector _codeProtected; + + virtual uint nbWords() const { return device().nbWords(type()); } + virtual uint addressIncrement() const { return device().addressIncrement(type()); } + virtual Address startAddress() const { return device().range(type()).start; } + virtual Device::HexWordEditor *createHexWordEditor(QWidget *parent); + virtual void updateAddressColor(uint i, Address address); + virtual bool isRangeReadOnly() const; + virtual void addLegend(QVBoxLayout *vbox); +}; + +//----------------------------------------------------------------------------- +class MemoryTypeEditor : public Device::MemoryTypeEditor, public MemoryCaster +{ +Q_OBJECT +public: + MemoryTypeEditor(const HexView *hexview, MemoryRangeType type, Memory &memory, QWidget *parent, const char *name); + virtual void init(bool first); + +private: + virtual bool internalDoAction(Device::Action action); +}; + +//----------------------------------------------------------------------------- +class MemoryTypeRangeEditor : public MemoryTypeEditor +{ +Q_OBJECT +public: + MemoryTypeRangeEditor(const HexView *hexview, MemoryRangeType type, Memory &memory, QWidget *parent); + virtual void init(bool first); + +protected: + MemoryRangeEditor *_mre; +}; + +//----------------------------------------------------------------------------- +class MemoryUserIdEditor : public MemoryTypeRangeEditor +{ +Q_OBJECT +public: + MemoryUserIdEditor(const HexView *hexview, Memory &memory, QWidget *parent); + virtual void init(bool first); + virtual void setReadOnly(bool readOnly); + +public slots: + virtual void updateDisplay(); + +private slots: + void toggleSetToChecksum(); + +private: + bool _saveReadOnly; + KToggleAction *_setToChecksum; +}; + +//----------------------------------------------------------------------------- +class MemoryCalibrationEditor : public MemoryTypeEditor +{ +Q_OBJECT +public: + MemoryCalibrationEditor(const HexView *hexview, Memory &memory, QWidget *parent); + virtual void init(bool first); + +private: + virtual bool hasAction(Device::Action action) const; + virtual bool internalDoAction(Device::Action action); +}; + +} // namespace + +#endif diff --git a/src/devices/pic/gui/pic_prog_group_ui.cpp b/src/devices/pic/gui/pic_prog_group_ui.cpp new file mode 100644 index 0000000..e063b77 --- /dev/null +++ b/src/devices/pic/gui/pic_prog_group_ui.cpp @@ -0,0 +1,41 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_prog_group_ui.h" + +#include "progs/gui/prog_config_widget.h" +#include "progs/base/prog_group.h" + +Programmer::PicAdvancedDialog::PicAdvancedDialog(PicBase &base, QWidget *parent, const char *name) + : AdvancedDialog(base, parent, name) +{ + if (_voltagesContainer) { + uint k = _voltagesContainer->numRows(); + for (uint i=0; iaddWidget(label, k,k, 0,0); + _voltages[i] = new QLabel(_voltagesContainer); + _voltagesContainer->addWidget(_voltages[i], k,k, 1,1); + k++; + } + } + } +} + +void Programmer::PicAdvancedDialog::updateDisplay() +{ + ::Programmer::AdvancedDialog::updateDisplay(); + for (uint i=0; isetText("---"); + else _voltages[i]->setText(QString("%1 V").arg(v)); + } +} diff --git a/src/devices/pic/gui/pic_prog_group_ui.h b/src/devices/pic/gui/pic_prog_group_ui.h new file mode 100644 index 0000000..75821b5 --- /dev/null +++ b/src/devices/pic/gui/pic_prog_group_ui.h @@ -0,0 +1,31 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_PROG_GROUP_UI_H +#define PIC_PROG_GROUP_UI_H + +#include "progs/gui/prog_group_ui.h" +#include "devices/pic/prog/pic_prog.h" + +namespace Programmer +{ +class PicAdvancedDialog : public ::Programmer::AdvancedDialog +{ +Q_OBJECT +public: + PicAdvancedDialog(PicBase &base, QWidget *parent, const char *name); + virtual void updateDisplay(); + +private: + QLabel *_voltages[Pic::Nb_VoltageTypes]; + PicBase &base() { return static_cast(_base); } +}; + +} // namespace + +#endif diff --git a/src/devices/pic/gui/pic_register_view.cpp b/src/devices/pic/gui/pic_register_view.cpp new file mode 100644 index 0000000..ef7de9b --- /dev/null +++ b/src/devices/pic/gui/pic_register_view.cpp @@ -0,0 +1,329 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_register_view.h" + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "libgui/main_global.h" +#include "devices/gui/hex_word_editor.h" +#include "common/gui/misc_gui.h" +#include "devices/pic/base/pic.h" +#include "progs/base/generic_prog.h" +#include "progs/base/generic_debug.h" +#include "progs/base/prog_group.h" +#include "libgui/gui_debug_manager.h" +#include "coff/base/text_coff.h" + +//----------------------------------------------------------------------------- +Pic::BankWidget::BankWidget(uint i, QWidget *parent) + : QFrame(parent, "bank_widget"), _bindex(i), _bankCombo(0) +{ + setFrameStyle(WinPanel | Sunken); + QGridLayout *top = new QGridLayout(this, 1, 1, 5, 0); + top->setColSpacing(1, 4); + QFont f("courier", font().pointSize()); + + const Pic::Data &data = static_cast(*Main::deviceData()); + const Pic::RegistersData &rdata = data.registersData(); + bool debugging = Main::programmerGroup().isDebugger(); + uint row = 0; + if ( rdata.nbBanks!=1 ) { + if ( data.is18Family() ) { + if ( (i/2)==0 ) { + QString title = ((i%2)==0 ? i18n("Access Bank (low)") : i18n("Access Bank (high)")); + QLabel *label = new QLabel(title, this); + label->setAlignment(AlignCenter); + top->addMultiCellWidget(label, row,row, 0,6, AlignHCenter); + } else { + _bankCombo = new QComboBox(this); + for (uint k=1; k<2*rdata.nbBanks-1; k++) { + _bankCombo->insertItem((k%2)==0 ? i18n("Bank %1 (low)").arg(k/2) : i18n("Bank %1 (high)").arg(k/2)); + } + if ( _bindex==3 ) _bankCombo->setCurrentItem(1); + connect(_bankCombo, SIGNAL(activated(int)), SLOT(bankChanged())); + top->addMultiCellWidget(_bankCombo, row,row, 0,6, AlignHCenter); + } + } else { + QLabel *label = new QLabel(i18n("Bank %1").arg(i), this); + label->setAlignment(AlignCenter); + top->addMultiCellWidget(label, row,row, 0,6, AlignHCenter); + } + row++; + top->setRowSpacing(row, 5); + row++; + } + + KIconLoader loader; + QPixmap readIcon = loader.loadIcon("viewmag", KIcon::Small); + QPixmap editIcon = loader.loadIcon("edit", KIcon::Small); + uint nb; + if ( !data.is18Family() ) nb = rdata.nbRegistersPerBank(); + else nb = kMax(rdata.accessBankSplit, rdata.nbRegistersPerBank() - rdata.accessBankSplit); + _registers.resize(nb); + for (uint k=0; ksetFont(f); + top->addWidget(_registers[k].alabel, row, 0); + if (debugging) { + _registers[k].button = new PopupButton(this); + _registers[k].button->appendItem(i18n("Read"), readIcon, ReadId); + _registers[k].button->appendItem(i18n("Edit"), editIcon, EditId); + _registers[k].button->appendItem(i18n("Watch"), WatchId); + connect(_registers[k].button, SIGNAL(activated(int)), SLOT(buttonActivated(int))); + top->addWidget(_registers[k].button, row, 2); + _registers[k].edit = new Register::LineEdit(this); + connect(_registers[k].edit, SIGNAL(modified()), SLOT(write())); + _registers[k].edit->setFont(f); + top->addWidget(_registers[k].edit, row, 6); + } else { + _registers[k].label = new QLabel(this); + top->addWidget(_registers[k].label, row, 2); + } + row++; + } + + if (debugging) { + top->setColSpacing(3, 5); + top->setColSpacing(5, 5); + } + top->setRowStretch(row, 1); + + updateRegisterAddresses(); +} + +void Pic::BankWidget::bankChanged() +{ + updateRegisterAddresses(); + updateView(); +} + +uint Pic::BankWidget::bank() const +{ + const Pic::Data &data = static_cast(*Main::deviceData()); + if ( !data.is18Family() ) return _bindex; + if ( _bindex==0 ) return 0; + const Pic::RegistersData &rdata = data.registersData(); + if ( _bindex==1 ) return rdata.nbBanks - 1; + return (_bankCombo->currentItem()+1)/2; +} + +uint Pic::BankWidget::nbRegisters() const +{ + const Pic::Data &data = static_cast(*Main::deviceData()); + const Pic::RegistersData &rdata = data.registersData(); + if ( !data.is18Family() ) return rdata.nbRegistersPerBank(); + if ( _bindex==0 || (_bankCombo && _bankCombo->currentItem()==2*int(rdata.nbBanks)-3) ) return rdata.accessBankSplit; + if ( _bindex==1 || (_bankCombo && _bankCombo->currentItem()==0) ) return rdata.nbRegistersPerBank() - rdata.accessBankSplit; + return rdata.nbRegistersPerBank() / 2; +} + +uint Pic::BankWidget::indexOffset() const +{ + const Pic::Data &data = static_cast(*Main::deviceData()); + const Pic::RegistersData &rdata = data.registersData(); + uint offset = bank() * rdata.nbRegistersPerBank(); + if ( !data.is18Family() ) return offset; + if ( _bindex==0 || (_bankCombo && (_bankCombo->currentItem()%2)==1) ) return offset; + if ( _bindex==1 || (_bankCombo && _bankCombo->currentItem()==0) ) return offset + rdata.accessBankSplit; + return offset + rdata.nbRegistersPerBank()/2; +} + +void Pic::BankWidget::updateRegisterAddresses() +{ + const Pic::Data &data = static_cast(*Main::deviceData()); + const Pic::RegistersData &rdata = data.registersData(); + uint nbChars = rdata.nbCharsAddress(); + uint nb = nbRegisters(); + uint offset = indexOffset(); + for (uint k=0; k<_registers.count(); k++) { + if ( kshow(); + _registers[k].address = rdata.addressFromIndex(offset + k); + _registers[k].alabel->setText(toHexLabel(_registers[k].address, nbChars) + ":"); + } else _registers[k].alabel->hide(); + } +} + +void Pic::BankWidget::buttonActivated(int id) +{ + const Pic::Data &data = static_cast(*Main::deviceData()); + const Pic::RegistersData &rdata = data.registersData(); + for (uint i=0; i<_registers.count(); i++) { + if ( sender()!=_registers[i].button ) continue; + Register::TypeData rtd(_registers[i].address, rdata.nbChars()); + switch (id) { + case ReadId: Debugger::manager->readRegister(rtd); break; + case EditId: + _registers[i].edit->selectAll(); + _registers[i].edit->setFocus(); + break; + case WatchId: { + bool isWatched = Register::list().isWatched(rtd); + Debugger::manager->setRegisterWatched(rtd, !isWatched); + break; + } + } + break; + } +} + +void Pic::BankWidget::write() +{ + const Pic::Data &data = static_cast(*Main::deviceData()); + const Pic::RegistersData &rdata = data.registersData(); + for (uint i=0; i<_registers.count(); i++) { + if ( sender()!=_registers[i].edit ) continue; + Register::TypeData rtd(_registers[i].address, rdata.nbChars()); + Debugger::manager->writeRegister(rtd, _registers[i].edit->value()); + break; + } +} + +void Pic::BankWidget::updateView() +{ + const Pic::Data &data = static_cast(*Main::deviceData()); + const Pic::RegistersData &rdata = data.registersData(); + bool active = ( Main::programmerState()==Programmer::Halted ); + const Coff::Object *coff = Debugger::manager->coff(); + uint nb = nbRegisters(); + for (uint i=0; i<_registers.count(); i++) { + uint address = _registers[i].address; + Device::RegisterProperties rp = rdata.properties(address); + QString label = rdata.label(address); + Register::TypeData rtd(address, rdata.nbChars()); + bool isWatched = Register::list().isWatched(rtd); + if (coff) { + QString name = coff->variableName(address); + if ( !name.isEmpty() ) label = "<" + name + ">"; + } + if (_registers[i].button) { + if ( ishow(); + _registers[i].button->setText(label); + if (isWatched) { + QFont f = _registers[i].button->font(); + f.setBold(true); + _registers[i].button->setFont(f); + } else _registers[i].button->unsetFont(); + _registers[i].button->popup()->setItemEnabled(ReadId, active && (rp & Device::Readable)); + _registers[i].button->popup()->setItemEnabled(EditId, active); + _registers[i].button->popup()->changeItem(WatchId, isWatched ? i18n("Stop Watching") : i18n("Watch")); + _registers[i].button->popup()->setItemEnabled(WatchId, rp & Device::Readable); + } else _registers[i].button->hide(); + } + if (_registers[i].label) { + if ( ishow(); + _registers[i].label->setText(label); + } else _registers[i].label->hide(); + } + if (_registers[i].edit) { + if ( ishow(); + _registers[i].edit->setEnabled(active); + BitValue value = Register::list().value(rtd); + if ( value!=Register::list().oldValue(rtd) ) _registers[i].edit->setColor(red); + else _registers[i].edit->unsetColor(); + _registers[i].edit->setValue(NumberBase::Hex, value, rdata.nbChars()); + } else _registers[i].edit->hide(); + } + } +} + +//----------------------------------------------------------------------------- +Pic::RegisterView::RegisterView(QWidget *parent) + : Register::View(parent, "pic_register_view"), + _readAllButton(0), _clearAllButton(0) +{ + QVBoxLayout *vbox = new QVBoxLayout(this, 10, 10); + QHBoxLayout *hbox = new QHBoxLayout(vbox); + + bool debugging = Main::programmerGroup().isDebugger(); + const Pic::Data &data = static_cast(*Main::deviceData()); + uint nb = data.registersData().nbBanks; + if ( debugging && nb!=0 ) { + QWidget *w = new QWidget(this); + hbox->addWidget(w); + QGridLayout *grid = new QGridLayout(w, 1, 1, 0, 10); + _readAllButton = new QPushButton(i18n("Read All"), w); + connect(_readAllButton, SIGNAL(clicked()), Debugger::manager, SLOT(readAllRegisters())); + grid->addWidget(_readAllButton, 0, 0); + _clearAllButton = new QPushButton(i18n("Clear all watching"), w); + connect(_clearAllButton, SIGNAL(clicked()), SLOT(stopWatchAllRegisters())); + grid->addWidget(_clearAllButton, 0, 1); + grid->setColStretch(2, 1); + } + + QHBoxLayout *hbox2 = 0; + if ( nb==0 ) { + QLabel *label = new QLabel(i18n("Registers information not available."), this); + vbox->addWidget(label); + } else { + hbox = new QHBoxLayout(vbox); + hbox2 = new QHBoxLayout(hbox); + hbox->addStretch(1); + if ( data.is18Family() ) { + nb = 2; + for (uint k=1; kshow(); + hbox2->addWidget(_banks[i]); + } + } + vbox->addStretch(1); +} + +void Pic::RegisterView::updateView() +{ + if (_readAllButton) _readAllButton->setEnabled(Main::programmerState()==Programmer::Halted); + for (uint i=0; i<_banks.count(); i++) if (_banks[i]) _banks[i]->updateView(); +} + +void Pic::RegisterView::stopWatchAllRegisters() +{ + Debugger::manager->stopWatchAll(); +} + +//---------------------------------------------------------------------------- +Pic::RegisterListViewItem::RegisterListViewItem(const Register::TypeData &data, KListViewItem *parent) + : Register::ListViewItem(data, parent) +{} + +uint Pic::RegisterListViewItem::nbCharsAddress() const +{ + const Pic::Data &data = static_cast(*Main::deviceData()); + return data.registersData().nbCharsAddress(); +} + +QString Pic::RegisterListViewItem::label() const +{ + if ( _data.type()!=Register::Regular ) return _data.name(); + const Coff::Object *coff = Debugger::manager->coff(); + if (coff) { + QString name = coff->variableName(_data.address()); + if ( !name.isEmpty() ) return "<" + name + ">"; + } + const Pic::Data &data = static_cast(*Main::deviceData()); + return data.registersData().label(_data.address()); +} diff --git a/src/devices/pic/gui/pic_register_view.h b/src/devices/pic/gui/pic_register_view.h new file mode 100644 index 0000000..f5b9d4b --- /dev/null +++ b/src/devices/pic/gui/pic_register_view.h @@ -0,0 +1,88 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_REGISTER_VIEW_H +#define PIC_REGISTER_VIEW_H + +#include +class QPushButton; +class QCheckBox; +class QLabel; +class QComboBox; + +#include "devices/gui/register_view.h" +#include "devices/pic/base/pic.h" +#include "devices/pic/base/pic_register.h" +class PopupButton; +namespace Device { class RegisterHexWordEditor; } + +namespace Pic +{ +//----------------------------------------------------------------------------- +class BankWidget : public QFrame +{ +Q_OBJECT +public: + BankWidget(uint bank, QWidget *parent); + void updateView(); + +private slots: + void buttonActivated(int id); + void write(); + void bankChanged(); + +private: + enum Id { ReadId, EditId, WatchId }; + class Data { + public: + Data() : label(0), button(0), edit(0) {} + uint address; + QLabel *alabel, *label; + PopupButton *button; + Register::LineEdit *edit; + }; + uint _bindex; + QComboBox *_bankCombo; + QValueVector _registers; + + uint bank() const; + uint nbRegisters() const; + uint indexOffset() const; + void updateRegisterAddresses(); +}; + +//----------------------------------------------------------------------------- +class RegisterView : public Register::View +{ +Q_OBJECT +public: + RegisterView(QWidget *parent); + virtual void updateView(); + +private slots: + void stopWatchAllRegisters(); + +private: + QPushButton *_readAllButton, *_clearAllButton; + QValueVector _banks; +}; + +//----------------------------------------------------------------------------- +class RegisterListViewItem : public Register::ListViewItem +{ +public: + RegisterListViewItem(const Register::TypeData &data, KListViewItem *parent); + +private: + virtual uint nbCharsAddress() const; + virtual QString label() const; +}; + +} // namespace + +#endif diff --git a/src/devices/pic/pic.pro b/src/devices/pic/pic.pro new file mode 100644 index 0000000..cf3c06a --- /dev/null +++ b/src/devices/pic/pic.pro @@ -0,0 +1,2 @@ +TEMPLATE = subdirs +SUBDIRS = base xml pic xml_data prog diff --git a/src/devices/pic/pic/Makefile.am b/src/devices/pic/pic/Makefile.am new file mode 100644 index 0000000..e9deb80 --- /dev/null +++ b/src/devices/pic/pic/Makefile.am @@ -0,0 +1,5 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_LTLIBRARIES = libpic.la +libpic_la_SOURCES = pic_memory.cpp pic_group.cpp diff --git a/src/devices/pic/pic/pic.pro b/src/devices/pic/pic/pic.pro new file mode 100644 index 0000000..8893c67 --- /dev/null +++ b/src/devices/pic/pic/pic.pro @@ -0,0 +1,6 @@ +STOPDIR = ../../../.. +include($${STOPDIR}/lib.pro) + +TARGET = pic +HEADERS += pic_memory.h pic_group.h +SOURCES += pic_memory.cpp pic_group.cpp \ No newline at end of file diff --git a/src/devices/pic/pic/pic_group.cpp b/src/devices/pic/pic/pic_group.cpp new file mode 100644 index 0000000..639d2cf --- /dev/null +++ b/src/devices/pic/pic/pic_group.cpp @@ -0,0 +1,87 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_group.h" + +#if !defined(NO_KDE) +# include +#endif + +#include "pic_memory.h" +#include "devices/pic/base/pic_register.h" + +Device::Memory *Pic::Group::createMemory(const Device::Data &data) const +{ + return new Memory(static_cast(data)); +} + +QString Pic::Group::informationHtml(const Device::Data &data) const +{ + const Pic::Data &pdata = static_cast(data); + // memory type + QString s = htmlTableRow(i18n("Memory Type"), data.memoryTechnology().label()); + if ( pdata.isPresent(MemoryRangeType::Code) ) { + uint nbw = pdata.nbWords(MemoryRangeType::Code); + QString tmp = i18n("%1 words").arg(formatNumber(nbw)); + tmp += i18n(" (%2 bits)").arg(pdata.nbBitsWord(MemoryRangeType::Code)); + s += htmlTableRow(MemoryRangeType(MemoryRangeType::Code).label(), tmp); + } + if ( pdata.isPresent(MemoryRangeType::Eeprom) ) { + uint nbw = pdata.nbWords(MemoryRangeType::Eeprom); + QString tmp = i18n("%1 bytes").arg(formatNumber(nbw)); + tmp += i18n(" (%2 bits)").arg(pdata.nbBitsWord(MemoryRangeType::Eeprom)); + if ( !(pdata.range(MemoryRangeType::Eeprom).properties & Programmable) ) tmp += i18n(" (not programmable)"); + s += htmlTableRow(MemoryRangeType(MemoryRangeType::Eeprom).label(), tmp); + } + + // io ports + const Pic::RegistersData &rdata = pdata.registersData(); + QString tmp; + if ( rdata.nbBanks!=0 ) { + uint nb = 0; + for (uint i=0; i"); + s += htmlTableRow(i18n("IO Ports"), tmp); + } + + // features + tmp = QString::null; + FOR_EACH(Feature, feature) { + if ( !pdata.hasFeature(feature) ) continue; + if ( !tmp.isEmpty() ) tmp += ", "; + tmp += feature.label(); + } + if ( !tmp.isEmpty() ) s += htmlTableRow(i18n("Features"), tmp); + + return s; +} + +#if !defined(NO_KDE) +QPixmap Pic::Group::memoryGraph(const Device::Data &data) const +{ + const Pic::Data &pdata = static_cast(data); + QValueList ranges; + FOR_EACH(Pic::MemoryRangeType, type) { + if ( type==Pic::MemoryRangeType::Eeprom || !pdata.isPresent(type) ) continue; + Device::MemoryGraphData data; + data.startAddress = pdata.range(type).start; + data.start = toHexLabel(pdata.range(type).start, pdata.nbCharsAddress()); + data.endAddress = pdata.range(type).end; + data.end = toHexLabel(pdata.range(type).end, pdata.nbCharsAddress()); + data.label = type.label(); + ranges.append(data); + } + return Device::memoryGraph(ranges); +} +#endif diff --git a/src/devices/pic/pic/pic_group.h b/src/devices/pic/pic/pic_group.h new file mode 100644 index 0000000..1b95e09 --- /dev/null +++ b/src/devices/pic/pic/pic_group.h @@ -0,0 +1,39 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_GROUP_H +#define PIC_GROUP_H + +#include "common/global/global.h" +#include "devices/base/device_group.h" +#include "devices/pic/base/pic.h" + +namespace Pic +{ +extern const uint DATA_SIZE; +extern const char *DATA_STREAM; + +class Group : public Device::Group +{ +public: + virtual QString name() const { return "pic"; } + virtual QString label() const { return i18n("PIC"); } + virtual Device::Memory *createMemory(const Device::Data &data) const; + virtual QString informationHtml(const Device::Data &data) const; +#if !defined(NO_KDE) + virtual QPixmap memoryGraph(const Device::Data &data) const; +#endif + +private: + virtual uint dataSize() const { return DATA_SIZE; } + virtual const char *dataStream() const { return DATA_STREAM; } +}; + +} // namespace + +#endif diff --git a/src/devices/pic/pic/pic_memory.cpp b/src/devices/pic/pic/pic_memory.cpp new file mode 100644 index 0000000..cccb2f9 --- /dev/null +++ b/src/devices/pic/pic/pic_memory.cpp @@ -0,0 +1,560 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_memory.h" + +#include + +#include "common/common/misc.h" + +Pic::Memory::Memory(const Data &data) + : Device::Memory(data) +{ + FOR_EACH(MemoryRangeType, i) _ranges[i].resize(device().nbWords(i)); + fill(BitValue()); +} + +void Pic::Memory::fill(MemoryRangeType type, BitValue value) +{ + for (uint i=0; i<_ranges[type].count(); i++) { + if ( type==MemoryRangeType::Config && !value.isInitialized() ) _ranges[type][i] = device().config()._words[i].bvalue; + else _ranges[type][i] = value; + } +} + +bool Pic::Memory::isClear(MemoryRangeType type) const +{ + for (uint i=0; i<_ranges[type].count(); i++) { + if ( type==MemoryRangeType::Config ) { + if ( _ranges[type][i]!=device().config()._words[i].bvalue ) return false; + } else if ( _ranges[type][i].isInitialized() ) return false; + } + return true; +} + +void Pic::Memory::fill(BitValue value) +{ + FOR_EACH(MemoryRangeType, k) fill(k, value); +} + +void Pic::Memory::copyFrom(MemoryRangeType type, const Memory &memory) +{ + Q_ASSERT( memory.device().name()==device().name() ); + for (uint i=0; i<_ranges[type].count(); i++) _ranges[type][i] = memory._ranges[type][i]; +} + +void Pic::Memory::copyFrom(const Device::Memory &memory) +{ + Q_ASSERT( memory.device().name()==device().name() ); + FOR_EACH(MemoryRangeType, i) copyFrom(i, static_cast(memory)); +} + +Device::Array Pic::Memory::arrayForWriting(MemoryRangeType type) const +{ + Device::Array data = _ranges[type]; + for (uint i=0; i=_ranges[type].size() ) qDebug("Memory::setWord: type=%s offset=%s size=%s value=%s", type.key(), toHexLabelAbs(offset).latin1(), toHexLabelAbs(_ranges[type].size()).latin1(), toHexLabelAbs(value).latin1()); + CRASH_ASSERT( offset<_ranges[type].size() ); + _ranges[type][offset] = value; +} + +void Pic::Memory::setArray(MemoryRangeType type, const Device::Array &data) +{ + CRASH_ASSERT( _ranges[type].size()==data.size() ); + _ranges[type] = data; +} + +QString Pic::Memory::findValue(const QString &maskName) const +{ + if ( maskName.isEmpty() ) return QString::null; + uint i; + const Config::Mask *mask = device().config().findMask(maskName, &i); + if ( mask==0 ) return QString::null; + BitValue v = word(MemoryRangeType::Config, i).maskWith(mask->value); + for (uint k=0; kvalues.count()); k++) + if ( v.isInside(mask->values[k].value) ) return mask->values[k].name; + Q_ASSERT(false); + return QString::null; +} + +AddressRange Pic::Memory::bootRange() const +{ + const Protection &protection = device().config().protection(); + // with boot size + QString value = findValue(protection.bootSizeMaskName()); + if ( !value.isEmpty() ) { + uint size = value.toUInt(); + if ( size==0 ) return AddressRange(); + Address start = device().range(MemoryRangeType::Code).start; + if ( device().architecture()==Architecture::P30F ) start = 0x100; + return AddressRange(start, 2 * size - 1); // instruction words + } + // only CPB + QString maskName = protection.bootMaskName(Protection::ProgramProtected); + const Config::Mask *mask = device().config().findMask(maskName); + for (uint k=0; kvalues.count()); k++) { + AddressRangeVector rv = protection.extractRanges(mask->values[k].name, MemoryRangeType::Code); + if ( !rv.isEmpty() ) return rv[0]; + } + Q_ASSERT(false); + return AddressRange(); +} + +AddressRange Pic::Memory::blockRange(uint i) const +{ + const Protection &protection = device().config().protection(); + Q_ASSERT( ivalues.count()); k++) { + AddressRangeVector rv = protection.extractRanges(mask->values[k].name, MemoryRangeType::Code); + if ( !rv.isEmpty() ) return AddressRange(previous.end + 1, rv[0].end); + } + Q_ASSERT(false); + return AddressRange(); +} + +AddressRange Pic::Memory::bootProtectedRange(Protection::Type ptype) const +{ + const Protection &protection = device().config().protection(); + QString maskName = protection.bootMaskName(ptype); + QString value = findValue(maskName); + if ( value.isEmpty() ) return AddressRange(); + if ( protection.family()!=Protection::CodeGuard ) { + if ( protection.extractRanges(value, MemoryRangeType::Code).isEmpty() ) return AddressRange(); + } else { + if ( value!=protection.securityValueName(ptype) ) return AddressRange(); + } + return bootRange(); +} + +AddressRange Pic::Memory::blockProtectedRange(Protection::Type ptype, uint i) const +{ + const Protection &protection = device().config().protection(); + QString maskName = protection.blockMaskName(ptype, i); + QString value = findValue(maskName); + if ( value.isEmpty() ) return AddressRange(); + if ( protection.family()!=Protection::CodeGuard ) { + if ( protection.extractRanges(value, MemoryRangeType::Code).isEmpty() ) return AddressRange(); + } else { + if ( value!=protection.securityValueName(ptype) ) return AddressRange(); + } + return blockRange(i); +} + +AddressRangeVector Pic::Memory::protectedRanges(Protection::Type ptype, MemoryRangeType type) const +{ + const Protection &protection = device().config().protection(); + AddressRangeVector rv; + if ( type==MemoryRangeType::Code ) { + if ( protection.hasBootBlock() ) rv.append(bootProtectedRange(ptype)); + if ( protection.nbBlocks()!=0 ) { + for (uint i=0; ivalue); + for (int k=mask->values.count()-1; k>=0; k--) { // important to get the highest value in case of identical values + if ( mask->values[k].name!=valueName ) continue; + setWord(MemoryRangeType::Config, i, v | mask->values[k].value); + return; + } + Q_ASSERT(false); +} + +void Pic::Memory::setProtection(bool on, const QString &maskName, Protection::Type ptype) +{ + const Config::Mask *mask = device().config().findMask(maskName, 0); + if( mask==0 ) return; + const Protection &protection = device().config().protection(); + QString valueName; + if ( ptype==Protection::StandardSecurity || ptype==Protection::HighSecurity ) + valueName = protection.securityValueName(ptype); + else { + for (int k=mask->values.count()-1; k>=0; k--) { + if ( (on && protection.isAllProtectedValueName(mask->values[k].name)) + || (!on && protection.isNoneProtectedValueName(mask->values[k].name)) ) valueName = mask->values[k].name; + } + } + setConfigValue(maskName, valueName); +} + +bool Pic::Memory::hasFlagOn(const QString &maskName, bool valueIfNotPresent) const +{ + const Config::Mask *mask = device().config().findMask(maskName, 0); + if ( mask==0 ) return valueIfNotPresent; + Q_ASSERT(mask); + Q_ASSERT( mask->values.count()==2 ); + return ( findValue(maskName)=="On" ); +} + +void Pic::Memory::setFlagOn(const QString &maskName, bool on) +{ + const Config::Mask *mask = device().config().findMask(maskName, 0); + Q_UNUSED(mask); + Q_ASSERT(mask); + Q_ASSERT( mask->values.count()==2 ); + setConfigValue(maskName, on ? "On" : "Off"); +} + +void Pic::Memory::checksumCheckFill() +{ + clear(); + switch (device().architecture().type()) { + case Architecture::P10X: + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).start.toUInt(), 0x723); + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).end.toUInt(), 0x723); + break; + case Architecture::P16X: + if ( device().name()=="16F72" || device().name()=="16F73" || device().name()=="16F74" || device().name()=="16F76" || device().name()=="16F77" + || device().name()=="16CR73" || device().name()=="16CR74" || device().name()=="16CR76" || device().name()=="16CR77" ) { + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).start.toUInt(), 0x05E6); + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).end.toUInt(), 0x05E6); + } else { + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).start.toUInt(), 0x25E6); + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).end.toUInt(), 0x25E6); + } + break; + case Architecture::P17C: + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).start.toUInt(), 0xC0DE); + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).end.toUInt(), 0xC0DE); + break; + case Architecture::P18C: + case Architecture::P18F: + case Architecture::P18J: + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).start.toUInt()/2, 0xAAFF); + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).end.toUInt()/2, 0xFFAA); + break; + case Architecture::P24F: + case Architecture::P24H: + case Architecture::P30F: + case Architecture::P33F: + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).start.toUInt(), 0xAAAAAA); + setWord(MemoryRangeType::Code, device().range(MemoryRangeType::Code).end.toUInt(), 0xAAAAAA); + break; + case Architecture::Nb_Types: Q_ASSERT(false); break; + } +} + +BitValue Pic::Memory::checksum() const +{ + // code + BitValue mask = device().mask(MemoryRangeType::Code); + AddressRangeVector rv = protectedRanges(Protection::ProgramProtected, MemoryRangeType::Code); + bool isProtected = !rv.isEmpty(); + uint inc = device().addressIncrement(MemoryRangeType::Code); + //uint nbChars = device().nbCharsWord(MemoryRangeType::Code); + //qDebug("protected: %i nb: %s (%s)", isProtected, toHexLabelAbs(inc*device().nbWords(MemoryRangeType::Code)).latin1(), toHexLabel(mask, nbChars).latin1()); + //for (uint i=0; i &checksums = device().checksums(); + if ( checksums.contains(valueName) ) { // #### REMOVE ME !! + algorithm = checksums[valueName].algorithm; + cs = checksums[valueName].constant; + } + } + //qDebug("constant: %s", toHexLabelAbs(cs).data()); + //qDebug("algo: %s", Checksum::ALGORITHM_DATA[algorithm].name); + for (uint i=0; i &inRange) +{ + if ( !device().isWritable(type) ) return; + uint nbBytes = device().architecture().data().nbBytesWord; + bool packed = device().architecture().data().packed; + uint offset = device().range(type).hexFileOffset; + if ( offset==0 ) offset = device().range(type).start.toUInt(); + BitValue mask = device().mask(type); + uint wNbBytes = nbBytes; + if ( packed && type!=Pic::MemoryRangeType::Code ) { + offset /= 2; + wNbBytes /= 2; + } + uint byte = 0; + uint wOffset = 0; + uint wByte = 0; + //qDebug("%s wnb=%i snb=%i", MEMORY_RANGE_TYPE_DATA[type].label, wNbBytes, nbBytes); + for (uint k=0; k &inRange) +{ + FOR_EACH(MemoryRangeType, i) fromHexBuffer(i, hb, result, warnings, inRange); +} diff --git a/src/devices/pic/pic/pic_memory.h b/src/devices/pic/pic/pic_memory.h new file mode 100644 index 0000000..f7c98ba --- /dev/null +++ b/src/devices/pic/pic/pic_memory.h @@ -0,0 +1,80 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_MEMORY_H +#define PIC_MEMORY_H + +#include "common/global/global.h" +#include "devices/base/generic_memory.h" +#include "devices/base/hex_buffer.h" +#include "devices/pic/base/pic_config.h" + +namespace Pic +{ + +class Memory : public Device::Memory +{ +public: + Memory(const Data &data); + const Data &device() const { return static_cast(_device); } + virtual void fill(BitValue value); + void checksumCheckFill(); // a special memory fill for checksum check (cf datasheets) + virtual void fill(MemoryRangeType type, BitValue value); + virtual void clear() { Device::Memory::clear(); } + bool isClear(MemoryRangeType type) const; + void clear(MemoryRangeType type) { fill(type, BitValue()); } + Device::Array arrayForWriting(MemoryRangeType type) const; + BitValue word(MemoryRangeType type, uint offset) const; + BitValue normalizeWord(MemoryRangeType type, uint offset, BitValue value) const; + BitValue normalizedWord(MemoryRangeType type, uint offset) const; + void setWord(MemoryRangeType type, uint offset, BitValue value); + void setArray(MemoryRangeType type, const Device::Array &array); + + AddressRange bootRange() const; + AddressRange blockRange(uint i) const; + bool isBootProtected(Protection::Type ptype) const { return !bootProtectedRange(ptype).isEmpty(); } + bool isBlockProtected(Protection::Type ptype, uint i) const { return !blockProtectedRange(ptype, i).isEmpty(); } + bool isProtected(Protection::Type ptype, MemoryRangeType type) const { return !protectedRanges(ptype, type).isEmpty(); } + AddressRangeVector protectedRanges(Protection::Type ptype, MemoryRangeType type) const; + void setConfigValue(const QString &maskName, const QString &valueName); + bool hasDebugOn() const { return hasFlagOn("DEBUG", false); } + void setDebugOn(bool on) { setFlagOn("DEBUG", on); } + bool hasWatchdogTimerOn() const { return hasFlagOn("WDT", false); } + void setWatchdogTimerOn(bool on) { return setFlagOn("WDT", on); } + void setBootProtection(bool on, Protection::Type ptype); + void setBlockProtection(bool on, Protection::Type ptype, uint block); + void setProtection(bool on, Protection::Type ptype, MemoryRangeType type); + + virtual BitValue checksum() const; + BitValue unprotectedChecksum() const; + void setUserIdToUnprotectedChecksum(); + + virtual HexBuffer toHexBuffer() const; + virtual void copyFrom(const Device::Memory &memory); + void copyFrom(MemoryRangeType type, const Memory &memory); + void fromHexBuffer(MemoryRangeType type, const HexBuffer &hb, WarningTypes &warningTypes, + QStringList &warnings, QMap &inRange); + +private: + QMap _ranges; + + void toHexBuffer(MemoryRangeType type, HexBuffer &hb) const; + virtual void savePartial(QTextStream &stream, HexBuffer::Format format) const; + virtual void fromHexBuffer(const HexBuffer &hb, WarningTypes &warningTypes, + QStringList &warnings, QMap &inRange); + QString findValue(const QString &maskName) const; + bool hasFlagOn(const QString &maskName, bool valueIfNotPresent) const; + void setFlagOn(const QString &maskName, bool on); + void setProtection(bool on, const QString &maskName, Protection::Type ptype); + AddressRange bootProtectedRange(Protection::Type ptype) const; + AddressRange blockProtectedRange(Protection::Type ptype, uint block) const; +}; + +} // namespace + +#endif diff --git a/src/devices/pic/prog/Makefile.am b/src/devices/pic/prog/Makefile.am new file mode 100644 index 0000000..055d2cd --- /dev/null +++ b/src/devices/pic/prog/Makefile.am @@ -0,0 +1,5 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_LTLIBRARIES = libpicprog.la +libpicprog_la_SOURCES = pic_prog.cpp pic_prog_specific.cpp pic_debug.cpp diff --git a/src/devices/pic/prog/pic_debug.cpp b/src/devices/pic/prog/pic_debug.cpp new file mode 100644 index 0000000..443bb10 --- /dev/null +++ b/src/devices/pic/prog/pic_debug.cpp @@ -0,0 +1,118 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_debug.h" + +#include "common/common/misc.h" +#include "devices/pic/base/pic_register.h" +#include "progs/manager/debug_manager.h" + +//---------------------------------------------------------------------------- +Register::TypeData Debugger::PicBase::registerTypeData(const QString &name) const +{ + const Pic::RegistersData &rdata = device()->registersData(); + Q_ASSERT(rdata.sfrs.contains(name)); + return Register::TypeData(rdata.sfrs[name].address, rdata.nbChars()); +} + +bool Debugger::PicBase::updatePortStatus(uint index, QMap &bits) +{ + const Pic::RegistersData &rdata = device()->registersData(); + BitValue tris; + if ( rdata.hasTris(index) ) { + tris = Register::list().value(registerTypeData(rdata.trisName(index))); + Q_ASSERT( tris.isInitialized() ); + } + BitValue port = Register::list().value(registerTypeData(rdata.portName(index))); + Q_ASSERT( port.isInitialized() ); + BitValue latch; + if ( rdata.hasLatch(index) ) { + latch = Register::list().value(registerTypeData(rdata.latchName(index))); + Q_ASSERT( latch.isInitialized() ); + } + for (uint i=0; i(_base); +} +const Debugger::PicBase &Debugger::PicSpecific::base() const +{ + return static_cast(_base); +} + +bool Debugger::PicSpecific::updateStatus() +{ + if ( !Debugger::manager->readRegister(base().pcTypeData()) ) return false; + if ( !Debugger::manager->readRegister(base().registerTypeData("STATUS")) ) return false; + if ( !Debugger::manager->readRegister(wregTypeData()) ) return false; + return true; +} + +//---------------------------------------------------------------------------- +Register::TypeData Debugger::P16FSpecific::wregTypeData() const +{ + return Register::TypeData("WREG", device().registersData().nbChars()); +} + +QString Debugger::P16FSpecific::statusString() const +{ + const Pic::RegistersData &rdata = device().registersData(); + BitValue status = Register::list().value(base().registerTypeData("STATUS")); + uint bank = (status.bit(5) ? 1 : 0) + (status.bit(6) ? 2 : 0); + BitValue wreg = Register::list().value(wregTypeData()); + return QString("W:%1 %2 %3 %4 PC:%5 Bank:%6") + .arg(toHexLabel(wreg, rdata.nbChars())).arg(status.bit(2) ? "Z" : "z") + .arg(status.bit(1) ? "DC" : "dc").arg(status.bit(0) ? "C" : "c") + .arg(toHexLabel(_base.pc(), device().nbCharsAddress())).arg(bank); +} + +//---------------------------------------------------------------------------- +bool Debugger::P18FSpecific::updateStatus() +{ + if ( !PicSpecific::updateStatus() ) return false; + if ( !Debugger::manager->readRegister(base().registerTypeData("BSR")) ) return false; + return true; +} + +Register::TypeData Debugger::P18FSpecific::wregTypeData() const +{ + return base().registerTypeData("WREG"); +} + +QString Debugger::P18FSpecific::statusString() const +{ + const Pic::RegistersData &rdata = device().registersData(); + BitValue status = Register::list().value(base().registerTypeData("STATUS")); + BitValue bsr = Register::list().value(base().registerTypeData("BSR")); + BitValue wreg = Register::list().value(wregTypeData()); + return QString("W:%1 %2 %3 %4 %5 %6 PC:%7 Bank:%8") + .arg(toHexLabel(wreg, rdata.nbChars())).arg(status.bit(4) ? "N" : "n") + .arg(status.bit(3) ? "OV" : "ov").arg(status.bit(2) ? "Z" : "z") + .arg(status.bit(1) ? "DC" : "dc").arg(status.bit(0) ? "C" : "c") + .arg(toHexLabel(base().pc(), device().nbCharsAddress())).arg(toLabel(bsr)); +} diff --git a/src/devices/pic/prog/pic_debug.h b/src/devices/pic/prog/pic_debug.h new file mode 100644 index 0000000..dfb8af6 --- /dev/null +++ b/src/devices/pic/prog/pic_debug.h @@ -0,0 +1,65 @@ +/*************************************************************************** + * Copyright (C) 2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_DEBUG_H +#define PIC_DEBUG_H + +#include "progs/base/generic_debug.h" +#include "pic_prog.h" +#include "devices/base/register.h" + +namespace Debugger +{ +class PicBase; + +//---------------------------------------------------------------------------- +class PicSpecific : public DeviceSpecific +{ +public: + PicSpecific(Debugger::Base &base) : DeviceSpecific(base) {} + const Pic::Data &device() const { return static_cast(*_base.device()); } + PicBase &base(); + const PicBase &base() const; + virtual bool updateStatus(); + virtual Register::TypeData wregTypeData() const = 0; +}; + +//---------------------------------------------------------------------------- +class P16FSpecific : public PicSpecific +{ +public: + P16FSpecific(Debugger::Base &base) : PicSpecific(base) {} + virtual QString statusString() const; + virtual Register::TypeData wregTypeData() const; +}; + +//---------------------------------------------------------------------------- +class P18FSpecific : public PicSpecific +{ +public: + P18FSpecific(Debugger::Base &base) : PicSpecific(base) {} + virtual QString statusString() const; + virtual bool updateStatus(); + virtual Register::TypeData wregTypeData() const; +}; + +//---------------------------------------------------------------------------- +class PicBase : public Debugger::Base +{ +public: + PicBase(Programmer::PicBase &base) : Debugger::Base(base) {} + PicSpecific *deviceSpecific() { return static_cast(_deviceSpecific); } + const PicSpecific *deviceSpecific() const { return static_cast(_deviceSpecific); } + const Pic::Data *device() const { return static_cast(Debugger::Base::device()); } + Register::TypeData registerTypeData(const QString &name) const; + virtual bool updatePortStatus(uint index, QMap &bits); +}; + +} // namespace + +#endif diff --git a/src/devices/pic/prog/pic_prog.cpp b/src/devices/pic/prog/pic_prog.cpp new file mode 100644 index 0000000..bc7dcd1 --- /dev/null +++ b/src/devices/pic/prog/pic_prog.cpp @@ -0,0 +1,751 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_prog.h" + +#include "common/global/global.h" +#include "devices/list/device_list.h" +#include "progs/base/prog_config.h" +#include "progs/base/prog_group.h" +#include "pic_debug.h" + +//----------------------------------------------------------------------------- +bool Programmer::PicGroup::canReadVoltages() const +{ + for (uint i=0; i(base.device()); + if ( data==0 ) return 0; + switch (data->architecture().type()) { + case Pic::Architecture::P10X: + case Pic::Architecture::P16X: return new ::Debugger::P16FSpecific(base); + case Pic::Architecture::P18C: + case Pic::Architecture::P18F: + case Pic::Architecture::P18J: return new ::Debugger::P18FSpecific(base); + case Pic::Architecture::P24F: + case Pic::Architecture::P24H: + case Pic::Architecture::P30F: + case Pic::Architecture::P33F: + case Pic::Architecture::P17C: + case Pic::Architecture::Nb_Types: break; + } + Q_ASSERT(false); + return 0; +} + +//----------------------------------------------------------------------------- +Programmer::PicBase::PicBase(const Group &group, const Pic::Data *data, const char *name) + : Base(group, data, name), _deviceMemory(0), _hasProtectedCode(false), _hasProtectedEeprom(false) +{ + if (data) _deviceMemory = new Pic::Memory(*data); +} + +Programmer::PicBase::~PicBase() +{ + delete _deviceMemory; +} + +void Programmer::PicBase::clear() +{ + ::Programmer::Base::clear(); + for (uint i=0; i(range); + switch (task.type()) { + case Task::Erase: return 1; + case Task::Read: + case Task::Verify: + case Task::BlankCheck: { + uint nb = 0; + FOR_EACH(Pic::MemoryRangeType, type) { + if ( type!=Pic::MemoryRangeType::Code && type!=Pic::MemoryRangeType::Eeprom ) continue; + if ( !device()->isReadable(type) || !specific()->canReadRange(type) ) continue; + if ( !prange->all() && prange->_type!=type ) continue; + nb += device()->nbWords(type); + } + return QMAX(nb, uint(1)); + } + case Task::Write: { + uint nb = 0; + FOR_EACH(Pic::MemoryRangeType, type) { + if ( type!=Pic::MemoryRangeType::Code && type!=Pic::MemoryRangeType::Eeprom ) continue; + if ( !device()->isWritable(type) || !specific()->canWriteRange(type) ) continue; + if ( !prange->all() && prange->_type!=type ) continue; + nb += device()->nbWords(type); + if ( readConfigEntry(Config::VerifyAfterProgram).toBool() ) nb += device()->nbWords(type); + } + return QMAX(nb, uint(1)); + } + case Task::Nb_Types: break; + } + Q_ASSERT(false); + return 0; +} + +bool Programmer::PicBase::readVoltages() +{ + if ( !hardware()->readVoltages(_voltages) ) return false; + bool ok = true; + for (uint i=0; isetTargetReset(Pic::ResetHeld) ) return false; + } + Pic::TargetMode mode; + if ( !getTargetMode(mode) ) return false; + if ( mode!=Pic::TargetInProgramming ) { + log(Log::LineType::Error, i18n("Device not in programming")); + return false; + } + return true; +} + +bool Programmer::PicBase::initProgramming(Task) +{ +/* + if ( vpp()!=UNKNOWN_VOLTAGE ) { + const Pic::VoltageData &tvpp = device()->voltage(Pic::Vpp); + if ( vpp()tvpp.max ) { + QString s = i18n("Vpp (%1 V) is higher than the maximum voltage (%2 V). You may damage the device.") + .arg(vpp()).arg(tvpp.max); + log(Log::LineType::Warning, s); + if ( !askContinue(s) ) { + logUserAbort(); + return false; + } + } + } + if ( vdd()!=UNKNOWN_VOLTAGE ) { + Q_ASSERT( type!=Pic::Vpp ); + const Pic::VoltageData &tvdd = device()->voltage(type); + if ( vdd()voltage(Pic::VddWrite).min!=tvdd.min ) + log(Log::LineType::Warning, i18n("Vdd (%1 V) is too low for high-voltage programming\n(piklab only supports high-voltage programming at the moment).\nMinimum required is %2 V.") + .arg(vdd()).arg(tvdd.min)); + else if ( type==Pic::VddRead && device()->voltage(Pic::VddWrite).min!=tvdd.min ) + log(Log::LineType::Warning, i18n("Vdd (%1 V) is too low for reading\nMinimum required is %2 V.") + .arg(vdd()).arg(tvdd.min)); + else log(Log::LineType::Warning, i18n("Vdd (%1 V) is too low for programming\nMinimum required is %2 V.") + .arg(vdd()).arg(tvdd.min)); + } else if ( vdd()>tvdd.max ) { + QString s = i18n("Vdd (%1 V) is higher than the maximum voltage (%2 V). You may damage the device.") + .arg(vdd()).arg(tvdd.max); + log(Log::LineType::Warning, s); + if ( !askContinue(s) ) { + logUserAbort(); + return false; + } + } + } +*/ + if ( specific()->canReadRange(Pic::MemoryRangeType::Config) ) { + // read config + Device::Array data; + if ( !specific()->read(Pic::MemoryRangeType::Config, data, 0) ) return false; + _deviceMemory->setArray(Pic::MemoryRangeType::Config, data); + _hasProtectedCode = _deviceMemory->isProtected(Pic::Protection::ProgramProtected, Pic::MemoryRangeType::Code); + _hasProtectedEeprom = _deviceMemory->isProtected(Pic::Protection::ProgramProtected, Pic::MemoryRangeType::Eeprom); + log(Log::DebugLevel::Normal, QString(" protected: code=%1 data=%2") + .arg(_hasProtectedCode ? "true" : "false").arg(_hasProtectedEeprom ? "true" : "false")); + // read calibration + if ( !readCalibration() ) return false; + } + + return initProgramming(); +} + +bool Programmer::PicBase::preserveCode() +{ + if ( _hasProtectedCode && !askContinue(i18n("All or part of code memory is protected so it cannot be preserved. Continue anyway?")) ) + return false; + return readRange(Pic::MemoryRangeType::Code, _deviceMemory, 0); +} + +bool Programmer::PicBase::preserveEeprom() +{ + if ( _hasProtectedEeprom && !askContinue(i18n("All or part of data EEPROM is protected so it cannot be preserved. Continue anyway?")) ) + return false; + return readRange(Pic::MemoryRangeType::Eeprom, _deviceMemory, 0); +} + +bool Programmer::PicBase::internalRun() +{ + _state = ::Programmer::Running; + return hardware()->setTargetReset(Pic::ResetReleased); +} + +bool Programmer::PicBase::internalStop() +{ + _state = ::Programmer::Stopped; + return hardware()->setTargetReset(Pic::ResetHeld); +} + +bool Programmer::PicBase::getTargetMode(Pic::TargetMode &mode) +{ + return hardware()->getTargetMode(mode); +} + +bool Programmer::PicBase::initProgramming() +{ + _state = ::Programmer::Stopped; + return hardware()->setTargetReset(Pic::ResetHeld); +} + +//----------------------------------------------------------------------------- +BitValue Programmer::PicBase::readDeviceId() +{ + Device::Array data; + if ( !specific()->read(Pic::MemoryRangeType::DeviceId, data, 0) ) return 0; + Q_ASSERT( data.count()!=0 ); + BitValue id = 0x0; + switch (device()->architecture().type()) { + case Pic::Architecture::P10X: + case Pic::Architecture::P16X: + case Pic::Architecture::P17C: id = data[0]; break; + case Pic::Architecture::P18C: + case Pic::Architecture::P18F: + case Pic::Architecture::P18J: id = data[0] | (data[1] << 8); break; + case Pic::Architecture::P24F: + case Pic::Architecture::P24H: + case Pic::Architecture::P30F: + case Pic::Architecture::P33F: id = data[1] | (data[0] << 16); break; + case Pic::Architecture::Nb_Types: Q_ASSERT(false); break; + } + return id; +} + +bool Programmer::PicBase::verifyDeviceId() +{ + if ( !specific()->canReadRange(Pic::MemoryRangeType::DeviceId ) ) return true; + if ( !device()->isReadable(Pic::MemoryRangeType::DeviceId) ) { + log(Log::LineType::Information, i18n("Device not autodetectable: continuing with the specified device name \"%1\"...").arg(device()->name())); + return true; + } + BitValue rawId = readDeviceId(); + if ( hasError() ) return false; + uint nbChars = device()->nbWords(Pic::MemoryRangeType::DeviceId) * device()->nbCharsWord(Pic::MemoryRangeType::DeviceId); + if ( rawId==0x0 || rawId==device()->mask(Pic::MemoryRangeType::DeviceId) ) { + log(Log::LineType::Error, i18n("Missing or incorrect device (Read id is %1).").arg(toHexLabel(rawId, nbChars))); + return false; + } + QMap ids; + QValueVector names = group().supportedDevices(); + for (uint k=0; k(group().deviceData(names[k]).data); + if ( data->architecture()!=device()->architecture() ) continue; + Device::IdData idata; + if ( data->matchId(rawId, idata) ) ids[names[k]] = idata; + } + QString message; + if ( ids.count()!=0 ) { + log(Log::LineType::Information, i18n("Read id: %1").arg(device()->idNames(ids).join("; "))); + if ( ids.contains(device()->name()) ) return true; + message = i18n("Read id does not match the specified device name \"%1\".").arg(device()->name()); + } else { + log(Log::LineType::Warning, i18n(" Unknown or incorrect device (Read id is %1).").arg(toHexLabel(rawId, nbChars))); + message = i18n("Unknown device."); + } + if ( !askContinue(message) ) { + logUserAbort(); + return false; + } + log(Log::LineType::Information, i18n("Continue with the specified device name: \"%1\"...").arg(device()->name())); + return true; +} + +//----------------------------------------------------------------------------- +QString Programmer::PicBase::prettyCalibration(const Device::Array &data) const +{ + QString s; + for (uint i=0; inbCharsWord(Pic::MemoryRangeType::Cal)); + } + return s; +} + +bool Programmer::PicBase::readCalibration() +{ + if ( device()->isReadable(Pic::MemoryRangeType::Cal) ) { + if ( !specific()->canReadRange(Pic::MemoryRangeType::Cal) ) { + log(Log::LineType::Warning, i18n("Osccal cannot be read by the selected programmer")); + return true; + } + Device::Array data; + if ( !specific()->read(Pic::MemoryRangeType::Cal, data, 0) ) return false; + _deviceMemory->setArray(Pic::MemoryRangeType::Cal, data); + log(Log::DebugLevel::Normal, QString(" Read osccal: %1").arg(prettyCalibration(data))); + QString message; + if ( !device()->checkCalibration(data, &message) ) log(Log::LineType::Warning, " " + message); + if ( device()->isReadable(Pic::MemoryRangeType::CalBackup) ) { + if ( !specific()->canReadRange(Pic::MemoryRangeType::CalBackup) ) { + log(Log::LineType::Warning, i18n("Osccal backup cannot be read by the selected programmer")); + return true; + } + if ( !specific()->read(Pic::MemoryRangeType::CalBackup, data, 0) ) return false; + _deviceMemory->setArray(Pic::MemoryRangeType::CalBackup, data); + log(Log::DebugLevel::Normal, QString(" Read osccal backup: %1").arg(prettyCalibration(data))); + if ( !device()->checkCalibration(data, &message) ) log(Log::LineType::Warning, " " + message); + } + } + return true; +} + +bool Programmer::PicBase::restoreCalibration() +{ + if ( !specific()->canReadRange(Pic::MemoryRangeType::Cal) || !specific()->canWriteRange(Pic::MemoryRangeType::Cal) ) return true; + if ( !device()->isWritable(Pic::MemoryRangeType::Cal) ) return true; + Device::Array data = _deviceMemory->arrayForWriting(Pic::MemoryRangeType::Cal); + Device::Array bdata = _deviceMemory->arrayForWriting(Pic::MemoryRangeType::CalBackup); + if ( device()->isReadable(Pic::MemoryRangeType::CalBackup) && specific()->canReadRange(Pic::MemoryRangeType::CalBackup) ) { + if ( !device()->checkCalibration(data) && device()->checkCalibration(bdata) ) { + log(Log::LineType::Information, i18n(" Replace invalid osccal with backup value.")); + data = bdata; + } + } + Device::Array cdata; + if ( !specific()->read(Pic::MemoryRangeType::Cal, cdata, 0) ) return false; + if ( cdata==data ) { + log(Log::LineType::Information, i18n(" Osccal is unchanged.")); + return true; + } + if ( !programRange(Pic::MemoryRangeType::Cal, data) ) return false; + if ( !specific()->read(Pic::MemoryRangeType::Cal, cdata, 0) ) return false; + if ( cdata==data ) log(Log::LineType::Information, i18n(" Osccal has been preserved.")); + + if ( !device()->isWritable(Pic::MemoryRangeType::CalBackup) || !device()->checkCalibration(bdata) ) return true; + if ( !specific()->read(Pic::MemoryRangeType::CalBackup, cdata, 0) ) return false; + if ( cdata.count()==0 ) { + log(Log::LineType::Warning, i18n("Osccal backup cannot be read by selected programmer")); + return true; + } + if ( cdata==bdata ) { + log(Log::LineType::Information, i18n(" Osccal backup is unchanged.")); + return true; + } + if ( !programRange(Pic::MemoryRangeType::CalBackup, bdata) ) return false; + if ( !specific()->read(Pic::MemoryRangeType::CalBackup, cdata, 0) ) return false; + if ( cdata==bdata ) log(Log::LineType::Information, i18n(" Osccal backup has been preserved.")); + return true; +} + +bool Programmer::PicBase::restoreBandGapBits() +{ + if ( !specific()->canReadRange(Pic::MemoryRangeType::Config) ) return true; + bool hasProtectedBits = false; + for (uint i=0; inbWords(Pic::MemoryRangeType::Config); i++) + if ( device()->config()._words[i].pmask!=0 ) hasProtectedBits = true; + if ( !hasProtectedBits ) return true; + Device::Array cdata; + if ( !specific()->read(Pic::MemoryRangeType::Config, cdata, 0) ) return false; + Device::Array data = _deviceMemory->arrayForWriting(Pic::MemoryRangeType::Config); + for (uint i=0; iconfig()._words[i].pmask; + if ( pmask==0 ) continue; + cdata[i] = cdata[i].clearMaskBits(pmask); + cdata[i] |= data[i].maskWith(pmask); + } + if ( !specific()->canWriteRange(Pic::MemoryRangeType::Config) ) { + log(Log::LineType::Warning, i18n("Could not restore band gap bits because programmer does not support writing config bits.")); + return true; + } + log(Log::DebugLevel::Normal, QString(" Write config with band gap bits: %2").arg(toHexLabel(cdata[0], device()->nbCharsWord(Pic::MemoryRangeType::Config)))); + if ( !programRange(Pic::MemoryRangeType::Config, cdata) ) return false; + if ( !specific()->read(Pic::MemoryRangeType::Config, data, 0) ) return false; + if ( data==cdata ) log(Log::LineType::Information, i18n(" Band gap bits have been preserved.")); + return true; +} + +bool Programmer::PicBase::eraseAll() +{ + if ( !specific()->canEraseAll() ) { + log(Log::LineType::SoftError, i18n("The selected programmer does not support erasing the whole device.")); + return false; + } + if ( !specific()->erase(_hasProtectedCode || _hasProtectedEeprom) ) return false; + if ( !restoreCalibration() ) return false; + return true; +} + +bool Programmer::PicBase::checkErase() +{ + if ( device()->memoryTechnology()==Device::MemoryTechnology::Rom || device()->memoryTechnology()==Device::MemoryTechnology::Romless + || device()->memoryTechnology()==Device::MemoryTechnology::Eprom ) { + log(Log::LineType::SoftError, i18n("Cannot erase ROM or EPROM device.")); + return false; + } + return true; +} + +bool Programmer::PicBase::internalErase(const Device::MemoryRange &range) +{ + if ( !initProgramming(Task::Erase) ) return false; + bool ok = true; + if ( range.all() ) ok = eraseAll(); + else ok = eraseRange(static_cast(range)._type); + if ( !restoreBandGapBits() ) return false; + return ok; +} + +bool Programmer::PicBase::eraseSingle(Pic::MemoryRangeType type) +{ + return erase(Pic::MemoryRange(type)); +} + +bool Programmer::PicBase::eraseRange(Pic::MemoryRangeType type) +{ + bool ok = internalEraseRange(type); + if ( !restoreCalibration() ) return false; + if ( ok && readConfigEntry(Config::BlankCheckAfterErase).toBool() ) { + Pic::Memory memory(*device()); + VerifyData vdata(BlankCheckVerify, memory); + return readRange(type, 0, &vdata); + } + return ok; +} + +bool Programmer::PicBase::internalEraseRange(Pic::MemoryRangeType type) +{ + if ( !specific()->canEraseRange(type) && !specific()->canEraseAll() ) { + log(Log::LineType::SoftError, i18n("The selected programmer does not support erasing neither the specified range nor the whole device.")); + return false; + } + if ( type==Pic::MemoryRangeType::Code && _hasProtectedCode ) { + log(Log::LineType::SoftError, i18n("Cannot erase protected code memory. Consider erasing the whole chip.")); + return false; + } + if ( type==Pic::MemoryRangeType::Eeprom && _hasProtectedEeprom ) { + log(Log::LineType::SoftError, i18n("Cannot erase protected data EEPROM. Consider erasing the whole chip.")); + return false; + } + if ( specific()->canEraseRange(type) ) return specific()->eraseRange(type); + bool softErase = true; + if ( type!=Pic::MemoryRangeType::Code && (!specific()->canReadRange(Pic::MemoryRangeType::Code) + || !specific()->canWriteRange(Pic::MemoryRangeType::Code)) ) softErase = false; + if ( type!=Pic::MemoryRangeType::Eeprom && (!specific()->canReadRange(Pic::MemoryRangeType::Eeprom) + || !specific()->canWriteRange(Pic::MemoryRangeType::Eeprom)) ) softErase = false; + if ( type!=Pic::MemoryRangeType::Config && (!specific()->canReadRange(Pic::MemoryRangeType::Config) + || !specific()->canWriteRange(Pic::MemoryRangeType::Config)) ) softErase = false; + if ( type!=Pic::MemoryRangeType::UserId && (!specific()->canReadRange(Pic::MemoryRangeType::UserId) + || !specific()->canWriteRange(Pic::MemoryRangeType::UserId)) ) softErase = false; + if ( !softErase ) { + log(Log::LineType::SoftError, i18n("Cannot erase specified range because of programmer limitations.")); + return false; + } + if ( !askContinue(i18n("%1: Erasing this range only is not supported with this programmer. This will erase the whole chip and restore the other memory ranges.").arg(type.label())) ) { + logUserAbort(); + return false; + } + if ( type!=Pic::MemoryRangeType::Code && !preserveCode() ) return false; + if ( type!=Pic::MemoryRangeType::Eeprom && !preserveEeprom() ) return false; + if ( type!=Pic::MemoryRangeType::UserId && !readRange(Pic::MemoryRangeType::UserId, _deviceMemory, 0) ) return false; + specific()->erase(_hasProtectedCode || _hasProtectedEeprom); + if ( type!=Pic::MemoryRangeType::Code && !programAndVerifyRange(Pic::MemoryRangeType::Code, *_deviceMemory) ) return false; + if ( type!=Pic::MemoryRangeType::Eeprom && !programAndVerifyRange(Pic::MemoryRangeType::Eeprom, *_deviceMemory) ) return false; + if ( type!=Pic::MemoryRangeType::UserId && !programAndVerifyRange(Pic::MemoryRangeType::UserId, *_deviceMemory) ) return false; + if ( !programAndVerifyRange(Pic::MemoryRangeType::Config, *_deviceMemory) ) return false; + return true; +} + +//----------------------------------------------------------------------------- +bool Programmer::PicBase::readSingle(Pic::MemoryRangeType type, Pic::Memory &memory) +{ + if ( !specific()->canReadRange(type) ) { + log(Log::LineType::SoftError, i18n("The selected programmer cannot read the specified memory range.")); + return false; + } + Pic::Memory tmp(*device()); + if ( !read(tmp, Pic::MemoryRange(type)) ) return false; + memory.copyFrom(type, tmp); + if ( type==Pic::MemoryRangeType::Cal ) memory.copyFrom(Pic::MemoryRangeType::CalBackup, tmp); + return true; +} + +bool Programmer::PicBase::readRange(Pic::MemoryRangeType type, Pic::Memory *memory, const VerifyData *vd) +{ + if ( !device()->isReadable(type) ) return true; + if ( !specific()->canReadRange(type) ) { + log(Log::LineType::Information, i18n("The selected programmer cannot read %1: operation skipped.").arg(type.label())); + return true; + } + VerifyData *vdata = (vd ? new VerifyData(vd->actions, vd->memory) : 0); + if (vdata) { + log(Log::LineType::Information, i18n(" Verify memory: %1").arg(type.label())); + if ( !(vdata->actions & IgnoreProtectedVerify) ) { + vdata->protectedRanges = static_cast(vdata->memory).protectedRanges(Pic::Protection::ProgramProtected, type); + if ( !vdata->protectedRanges.isEmpty() ) log(Log::LineType::Warning, i18n(" Part of device memory is protected (in %1) and cannot be verified.") + .arg(type.label())); + } else vdata->protectedRanges.clear(); + } else { + log(Log::LineType::Information, i18n(" Read memory: %1").arg(type.label())); + CRASH_ASSERT(memory); + } + Device::Array data; + bool ok = specific()->read(type, data, vdata); + delete vdata; + if (!ok) return false; + if (memory) memory->setArray(type, data); + return true; +} + +bool Programmer::PicBase::checkRead() +{ + if ( device()->memoryTechnology()==Device::MemoryTechnology::Romless ) { + log(Log::LineType::SoftError, i18n("Cannot read ROMless device.")); + return false; + } + return true; +} + +bool Programmer::PicBase::internalRead(Device::Memory *memory, const Device::MemoryRange &range, const VerifyData *vdata) +{ + if ( !initProgramming(Task::Read) ) return false; + Pic::Memory *pmemory = static_cast(memory); + if ( !range.all() ) { + Pic::MemoryRangeType type = static_cast(range)._type; + if ( type==Pic::MemoryRangeType::Cal ) { + if ( !readRange(Pic::MemoryRangeType::Cal, pmemory, vdata) ) return false; + return readRange(Pic::MemoryRangeType::CalBackup, pmemory, vdata); + } + return readRange(type, pmemory, vdata); + } + if ( !readRange(Pic::MemoryRangeType::Config, pmemory, vdata) ) return false; + if ( !readRange(Pic::MemoryRangeType::UserId, pmemory, vdata) ) return false; + if ( vdata==0 ) if ( !readRange(Pic::MemoryRangeType::Cal, pmemory, 0) ) return false; + if ( vdata==0 ) if ( !readRange(Pic::MemoryRangeType::CalBackup, pmemory, 0) ) return false; + if ( !readRange(Pic::MemoryRangeType::Code, pmemory, vdata) ) return false; + if ( !readRange(Pic::MemoryRangeType::Eeprom, pmemory, vdata) ) return false; + return true; +} + +//----------------------------------------------------------------------------- +bool Programmer::PicBase::programSingle(Pic::MemoryRangeType type, const Pic::Memory &memory) +{ + if ( !specific()->canWriteRange(type) ) { + log(Log::LineType::SoftError, i18n("The selected programmer cannot read the specified memory range.")); + return false; + } + return program(memory, Pic::MemoryRange(type)); +} + +bool Programmer::PicBase::programRange(Pic::MemoryRangeType mtype, const Device::Array &data) +{ + log(Log::LineType::Information, i18n(" Write memory: %1").arg(mtype.label())); + bool only = ( readConfigEntry(Config::OnlyProgramNonMask).toBool() + && (mtype==Pic::MemoryRangeType::Code || mtype==Pic::MemoryRangeType::Eeprom) ); + return specific()->write(mtype, data, !only); +} + +bool Programmer::PicBase::programAndVerifyRange(Pic::MemoryRangeType type, const Pic::Memory &memory) +{ + if ( !device()->isWritable(type) || !specific()->canWriteRange(type) ) return true; + Device::Array data = memory.arrayForWriting(type); + if ( !programRange(type, data) ) return false; + if ( !readConfigEntry(Config::VerifyAfterProgram).toBool() ) return true; + if ( !specific()->canReadRange(type) ) return true; + VerifyActions actions = IgnoreProtectedVerify; + if ( type==Pic::MemoryRangeType::Code && readConfigEntry(Config::OnlyVerifyProgrammed).toBool() ) actions |= OnlyProgrammedVerify; + VerifyData vdata(actions, memory); + return readRange(type, 0, &vdata); +} + +bool Programmer::PicBase::programAll(const Pic::Memory &memory) +{ + if ( !programAndVerifyRange(Pic::MemoryRangeType::Code, memory) ) return false; + if ( readConfigEntry(Config::ProgramEeprom).toBool() ) { + const Pic::Memory &tmp = (readConfigEntry(Config::PreserveEeprom).toBool() ? *_deviceMemory : memory); + if ( !programAndVerifyRange(Pic::MemoryRangeType::Eeprom, tmp) ) return false; + } + if ( !programAndVerifyRange(Pic::MemoryRangeType::UserId, memory) ) return false; + if ( memory.isProtected(Pic::Protection::WriteProtected, Pic::MemoryRangeType::Config) ) { + log(Log::DebugLevel::Normal, " Config write protection is on: first program without it and then with it"); + Pic::Memory tmp(memory.device()); + tmp.copyFrom(Pic::MemoryRangeType::Config, memory); + tmp.setProtection(false, Pic::Protection::WriteProtected, Pic::MemoryRangeType::Config); + if ( !programAndVerifyRange(Pic::MemoryRangeType::Config, tmp) ) return false; + } + if ( !programAndVerifyRange(Pic::MemoryRangeType::Config, memory) ) return false; + return true; +} + +bool Programmer::PicBase::checkProgram(const Device::Memory &memory) +{ + if ( device()->memoryTechnology()==Device::MemoryTechnology::Rom || device()->memoryTechnology()==Device::MemoryTechnology::Romless ) { + log(Log::LineType::SoftError, i18n("Cannot write ROM or ROMless device.")); + return false; + } + if ( !group().isDebugger() && static_cast(memory).hasDebugOn() ) { + if ( !askContinue(i18n("DEBUG configuration bit is on. Are you sure you want to continue programming the chip?")) ) { + logUserAbort(); + return false; + } + } + return true; +} + +bool Programmer::PicBase::internalProgram(const Device::Memory &memory, const Device::MemoryRange &range) +{ + if ( !initProgramming(Task::Erase) ) return false; + const Pic::Memory &pmemory = static_cast(memory); + + // blank check if OTP device + bool eprom = ( device()->memoryTechnology()==Device::MemoryTechnology::Eprom ); + if (eprom) { + log(Log::LineType::Information, i18n(" EPROM device: blank checking first...")); + Pic::Memory memory(*device()); + VerifyData vdata(BlankCheckVerify, memory); + if ( !internalRead(0, range, &vdata) ) return false; + log(Log::LineType::Information, i18n(" Blank check successful")); + // check if protecting device + bool protectedCode = pmemory.isProtected(Pic::Protection::ProgramProtected, Pic::MemoryRangeType::Code); + bool protectedEeprom = pmemory.isProtected(Pic::Protection::ProgramProtected, Pic::MemoryRangeType::Eeprom); + if ( protectedCode || protectedEeprom ) { + log(Log::LineType::SoftError, i18n("Protecting code memory or data EEPROM on OTP devices is disabled as a security...")); + return false; + } + } + + // programming + bool ok = true; + if ( !range.all() ) { + Pic::MemoryRangeType type = static_cast(range)._type; + if ( (type==Pic::MemoryRangeType::Code && _hasProtectedCode) || (type==Pic::MemoryRangeType::Eeprom && _hasProtectedEeprom) ) { + log(Log::LineType::SoftError, i18n("This memory range is programming protected.")); + return false; + } + if ( specific()->canEraseRange(type) ) { + if ( !specific()->emulatedErase() && !eraseRange(type) ) return false; + } else log(Log::LineType::Warning, i18n("The range cannot be erased first by the selected programmer so programming may fail...")); + ok = programRange(type, pmemory.arrayForWriting(type)); + VerifyData vdata(NormalVerify, pmemory); + if (ok) ok = readRange(type, 0, &vdata); + } else { + if ( !eprom ) { + if ( specific()->canEraseAll() ) { + if ( !specific()->emulatedErase() ) { + log(Log::LineType::Information, i18n(" Erasing device")); + ok = ( !readConfigEntry(Config::PreserveEeprom).toBool() || preserveEeprom() ); + if (ok) ok = eraseAll(); + } + } else log(Log::LineType::Warning, i18n("The device cannot be erased first by the selected programmer so programming may fail...")); + } + if (ok) ok = programAll(pmemory); + } + if ( !restoreBandGapBits() ) return false; + return ok; +} + +//----------------------------------------------------------------------------- +bool Programmer::PicBase::checkProgramCalibration(const Device::Array &data) +{ + QString message, s = prettyCalibration(data); + if ( !device()->checkCalibration(data, &message) ) { + sorry(i18n("The calibration word %1 is not valid.").arg(s), message); + return false; + } + return askContinue(i18n("Do you want to overwrite the device calibration with %1?").arg(s)); +} + +bool Programmer::PicBase::tryProgramCalibration(const Device::Array &data, bool &success) +{ + log(Log::LineType::Information, i18n(" Write memory: %1").arg(Pic::MemoryRangeType(Pic::MemoryRangeType::Cal).label())); + success = true; + if ( !specific()->write(Pic::MemoryRangeType::Cal, data, true) ) return false; + Device::Array read; + if ( !specific()->read(Pic::MemoryRangeType::Cal, read, 0) ) return false; + for (uint i=0; iisWritable(Pic::MemoryRangeType::CalBackup) ) { + if ( !specific()->read(Pic::MemoryRangeType::CalBackup, read, 0) ) return false; + if ( device()->checkCalibration(read) ) return true; // do not overwrite correct backup value + log(Log::LineType::Information, i18n(" Write memory: %1").arg(Pic::MemoryRangeType(Pic::MemoryRangeType::CalBackup).label())); + if ( !specific()->write(Pic::MemoryRangeType::CalBackup, data, true) ) return false; + if ( !specific()->read(Pic::MemoryRangeType::CalBackup, read, 0) ) return false; + for (uint i=0; ierase(_hasProtectedCode || _hasProtectedEeprom); + if ( !restoreBandGapBits() ) return false; + if ( !ok ) return false; + // retry + if ( !tryProgramCalibration(data, success) ) return false; + return success; +} + +bool Programmer::PicBase::programCalibration(const Device::Array &data) +{ + _progressMonitor.clear(); + bool ok = doProgramCalibration(data); + endProgramming(); + return ok; +} + +bool Programmer::PicBase::doProgramCalibration(const Device::Array &data) +{ + if ( !checkProgramCalibration(data) ) return false; + if ( !doConnectDevice() ) return false; + log(Log::LineType::Information, i18n("Programming calibration...")); + emit actionMessage(i18n("Programming calibration...")); + if ( !internalProgramCalibration(data) ) return false; + log(Log::LineType::Information, i18n("Programming calibration successful")); + return true; +} + +//----------------------------------------------------------------------------- +bool Programmer::PicBase::verifySingle(Pic::MemoryRangeType type, const Pic::Memory &memory) +{ + return verify(memory, Pic::MemoryRange(type)); +} + +bool Programmer::PicBase::blankCheckSingle(Pic::MemoryRangeType type) +{ + return blankCheck(Pic::MemoryRange(type)); +} diff --git a/src/devices/pic/prog/pic_prog.h b/src/devices/pic/prog/pic_prog.h new file mode 100644 index 0000000..0fb37f7 --- /dev/null +++ b/src/devices/pic/prog/pic_prog.h @@ -0,0 +1,110 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_PROG_H +#define PIC_PROG_H + +#include "pic_prog_specific.h" +#include "progs/base/prog_group.h" +#include "devices/base/device_group.h" + +namespace Pic +{ + +class MemoryRange : public Device::MemoryRange { +public: + MemoryRange(MemoryRangeType type) : _type(type) {} + virtual bool all() const { return _type==MemoryRangeType::Nb_Types; } + MemoryRangeType _type; +}; + +} //namespace + +namespace Programmer +{ +//----------------------------------------------------------------------------- +class PicGroup : public Group +{ +public: + virtual bool canReadVoltage(Pic::VoltageType) const { return false; } + virtual bool canReadVoltages() const; + virtual ::Debugger::DeviceSpecific *createDebuggerDeviceSpecific(::Debugger::Base &base) const; +}; + +//----------------------------------------------------------------------------- +class PicBase : public Base +{ +public: + PicBase(const Group &group, const Pic::Data *data, const char *name); + virtual ~PicBase(); + PicDeviceSpecific *specific() { return static_cast(_specific); } + const PicDeviceSpecific *specific() const { return static_cast(_specific); } + const Pic::Data *device() const { return static_cast(_device); } + const Pic::Memory &deviceMemory() const { return *_deviceMemory; } + const PicGroup &group() const { return static_cast(_group); } + double voltage(Pic::VoltageType type) const { return _voltages[type].value; } + virtual bool readVoltages(); + bool getTargetMode(Pic::TargetMode &mode); + + bool eraseSingle(Pic::MemoryRangeType type); + bool readSingle(Pic::MemoryRangeType type, Pic::Memory &memory); + bool programSingle(Pic::MemoryRangeType type, const Pic::Memory &memory); + bool verifySingle(Pic::MemoryRangeType type, const Pic::Memory &memory); + bool blankCheckSingle(Pic::MemoryRangeType type); + bool readCalibration(); + bool programCalibration(const Device::Array &data); + +protected: + PicHardware *hardware() { return static_cast(_hardware); } + virtual bool internalSetupHardware(); + virtual double vdd() const { return _voltages[Pic::TargetVdd].value; } + virtual double vpp() const { return _voltages[Pic::TargetVpp].value; } + virtual bool verifyDeviceId(); + virtual uint nbSteps(Task task, const Device::MemoryRange *range) const; + bool initProgramming(Task task); + virtual bool initProgramming(); + virtual bool internalRun(); + virtual bool internalStop(); + virtual void clear(); + + virtual bool checkErase(); + virtual bool internalErase(const Device::MemoryRange &range); + + virtual bool checkRead(); + virtual bool internalRead(Device::Memory *memory, const Device::MemoryRange &range, const VerifyData *data); + bool readRange(Pic::MemoryRangeType type, Pic::Memory *memory, const VerifyData *data); + + virtual bool checkProgram(const Device::Memory &memory); + virtual bool internalProgram(const Device::Memory &memory, const Device::MemoryRange &range); + virtual bool programAll(const Pic::Memory &memory); + bool programAndVerifyRange(Pic::MemoryRangeType type, const Pic::Memory &memory); + bool programRange(Pic::MemoryRangeType type, const Device::Array &array); + +private: + Pic::Memory *_deviceMemory; + bool _hasProtectedCode, _hasProtectedEeprom; + PicHardware::VoltagesData _voltages; + + BitValue readDeviceId(); + bool eraseAll(); + bool eraseRange(Pic::MemoryRangeType type); + bool restoreCalibration(); + bool restoreBandGapBits(); + bool doProgramCalibration(const Device::Array &data); + bool checkProgramCalibration(const Device::Array &data); + bool internalProgramCalibration(const Device::Array &data); + QString prettyCalibration(const Device::Array &data) const; + bool tryProgramCalibration(const Device::Array &data, bool &success); + bool preserveCode(); + bool preserveEeprom(); + bool internalEraseRange(Pic::MemoryRangeType type); +}; + +} // namespace + +#endif diff --git a/src/devices/pic/prog/pic_prog_specific.cpp b/src/devices/pic/prog/pic_prog_specific.cpp new file mode 100644 index 0000000..bfcd2fa --- /dev/null +++ b/src/devices/pic/prog/pic_prog_specific.cpp @@ -0,0 +1,121 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include "pic_prog_specific.h" + +#include "common/global/global.h" + +//----------------------------------------------------------------------------- +const char * const Pic::VOLTAGE_TYPE_LABELS[Nb_VoltageTypes] = { + I18N_NOOP("Programmer Vpp"), I18N_NOOP("Target Vdd"), I18N_NOOP("Target Vpp") +}; + +const char * const Pic::TARGET_MODE_LABELS[Nb_TargetModes] = { + I18N_NOOP("Stopped"), I18N_NOOP("Running"), I18N_NOOP("In Programming") +}; + +const char * const Pic::RESET_MODE_LABELS[Nb_ResetModes] = { + I18N_NOOP("Reset Held"), I18N_NOOP("Reset Released") +}; + +//----------------------------------------------------------------------------- +uint Programmer::PicDeviceSpecific::findNonMaskStart(Pic::MemoryRangeType type, const Device::Array &data) const +{ + uint start = 0; + for (; start(this)->log(Log::DebugLevel::Normal, QString("start before align: %1").arg(start)); + uint align = device().nbWordsWriteAlignment(type); + start -= start % align; + const_cast(this)->log(Log::DebugLevel::Normal, QString("start after align: %1 (align=%2)").arg(start).arg(align)); + return start; +} + +uint Programmer::PicDeviceSpecific::findNonMaskEnd(Pic::MemoryRangeType type, const Device::Array &data) const +{ + uint end = data.count()-1; + for (; end>0; end--) + if ( data[end]!=device().mask(type) ) break; + const_cast(this)->log(Log::DebugLevel::Normal, QString("end before align: %1").arg(end)); + uint align = device().nbWordsWriteAlignment(type); + if ( (end+1) % align ) end += align - (end+1) % align; + const_cast(this)->log(Log::DebugLevel::Normal, QString("end after align: %1 (align=%2)").arg(end).arg(align)); + Q_ASSERT(end(vdata.memory).normalizedWord(type, i); + BitValue d = static_cast(vdata.memory).normalizeWord(type, i, word); + if ( type==Pic::MemoryRangeType::Config ) { + BitValue pmask = device().config()._words[i].pmask; + v = v.clearMaskBits(pmask); + d = d.clearMaskBits(pmask); + } + return compareWords(type, i, v, d, vdata.actions); +} diff --git a/src/devices/pic/prog/pic_prog_specific.h b/src/devices/pic/prog/pic_prog_specific.h new file mode 100644 index 0000000..fef8a61 --- /dev/null +++ b/src/devices/pic/prog/pic_prog_specific.h @@ -0,0 +1,86 @@ +/*************************************************************************** + * Copyright (C) 2005-2006 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#ifndef PIC_PROG_SPECIFIC_H +#define PIC_PROG_SPECIFIC_H + +#include "progs/base/prog_specific.h" +#include "progs/base/generic_prog.h" +#include "devices/pic/pic/pic_memory.h" + +//---------------------------------------------------------------------------- +namespace Pic +{ + enum ResetMode { ResetHeld = 0, ResetReleased, Nb_ResetModes}; + extern const char * const RESET_MODE_LABELS[Nb_ResetModes]; + + enum VoltageType { ProgrammerVpp = 0, TargetVdd, TargetVpp, Nb_VoltageTypes }; + extern const char * const VOLTAGE_TYPE_LABELS[Nb_VoltageTypes]; + + enum TargetMode { TargetStopped = 0, TargetRunning, TargetInProgramming, Nb_TargetModes}; + extern const char * const TARGET_MODE_LABELS[Nb_TargetModes]; + + enum WriteMode { WriteOnlyMode = 0, EraseWriteMode, Nb_WriteModes }; +} // namespace + +namespace Programmer +{ +//----------------------------------------------------------------------------- +class PicDeviceSpecific : public DeviceSpecific +{ +public: + PicDeviceSpecific(::Programmer::Base &base) : DeviceSpecific(base) {} + const Pic::Data &device() const { return static_cast(*_base.device()); } + virtual bool canEraseAll() const = 0; + virtual bool canEraseRange(Pic::MemoryRangeType type) const = 0; + virtual bool emulatedErase() const { return false; } + virtual bool canReadRange(Pic::MemoryRangeType type) const = 0; + virtual bool canWriteRange(Pic::MemoryRangeType type) const = 0; + bool eraseRange(Pic::MemoryRangeType type); + bool erase(bool isProtected); + bool read(Pic::MemoryRangeType type, Device::Array &data, const VerifyData *vdata); + bool write(Pic::MemoryRangeType type, const Device::Array &data, bool force); + uint findNonMaskStart(Pic::MemoryRangeType type, const Device::Array &data) const; + uint findNonMaskEnd(Pic::MemoryRangeType type, const Device::Array &data) const; + +protected: + virtual bool doErase(bool isProtected) = 0; + virtual bool doEraseRange(Pic::MemoryRangeType type) = 0; + bool doEmulatedEraseRange(Pic::MemoryRangeType type); + virtual bool doRead(Pic::MemoryRangeType type, Device::Array &data, const VerifyData *vdata) = 0; + virtual bool doWrite(Pic::MemoryRangeType type, const Device::Array &data, bool force) = 0; +}; + +//----------------------------------------------------------------------------- +class PicHardware : public Hardware +{ +public: + class VoltageData { + public: + VoltageData() : value(UNKNOWN_VOLTAGE) {} + double value; + bool error; + }; + class VoltagesData : public QValueVector { + public: + VoltagesData() : QValueVector(Pic::Nb_VoltageTypes) {} + }; + +public: + PicHardware(::Programmer::Base &base, Port::Base *port, const QString &name) : Hardware(base, port, name) {} + const Pic::Data &device() const { return static_cast(*_base.device()); } + virtual bool readVoltages(VoltagesData &) { return true; } + virtual bool getTargetMode(Pic::TargetMode &mode) { mode = Pic::TargetInProgramming; return true; } + virtual bool setTargetReset(Pic::ResetMode) { return true; } + bool compareWords(Pic::MemoryRangeType type, uint index, BitValue v, BitValue d, VerifyActions actions); + bool verifyWord(uint index, BitValue word, Pic::MemoryRangeType type, const VerifyData &vdata); +}; + +} // namespace + +#endif diff --git a/src/devices/pic/prog/prog.pro b/src/devices/pic/prog/prog.pro new file mode 100644 index 0000000..c0caf87 --- /dev/null +++ b/src/devices/pic/prog/prog.pro @@ -0,0 +1,6 @@ +STOPDIR = ../../../.. +include($${STOPDIR}/lib.pro) + +TARGET = picprog +HEADERS += pic_prog.h pic_debug.h pic_prog_specific.h +SOURCES += pic_prog.cpp pic_debug.cpp pic_prog_specific.cpp diff --git a/src/devices/pic/xml/Makefile.am b/src/devices/pic/xml/Makefile.am new file mode 100644 index 0000000..a941f8d --- /dev/null +++ b/src/devices/pic/xml/Makefile.am @@ -0,0 +1,12 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_PROGRAMS = pic_xml_to_data + +pic_xml_to_data_SOURCES = pic_xml_to_data.cpp +pic_xml_to_data_DEPENDENCIES = $(top_builddir)/src/devices/pic/base/libpicbase.la \ + $(top_builddir)/src/xml_to_data/libxmltodata.la $(top_builddir)/src/devices/base/libdevicebase.la \ + $(top_builddir)/src/common/common/libcommon.la +pic_xml_to_data_LDADD = $(top_builddir)/src/devices/pic/base/libpicbase.la \ + $(top_builddir)/src/xml_to_data/libxmltodata.la $(top_builddir)/src/devices/base/libdevicebase.la \ + $(top_builddir)/src/common/common/libcommon.la $(LIB_KDECORE) diff --git a/src/devices/pic/xml/pic_xml_to_data.cpp b/src/devices/pic/xml/pic_xml_to_data.cpp new file mode 100644 index 0000000..f3675de --- /dev/null +++ b/src/devices/pic/xml/pic_xml_to_data.cpp @@ -0,0 +1,718 @@ +/*************************************************************************** + * Copyright (C) 2005-2007 Nicolas Hadacek * + * * + * 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. * + ***************************************************************************/ +#include +#include + +#include "xml_to_data/device_xml_to_data.h" +#include "common/common/misc.h" +#include "devices/pic/base/pic_config.h" +#include "devices/pic/base/pic_register.h" + +namespace Pic +{ +class XmlToData : public Device::XmlToData +{ +private: + virtual QString namespaceName() const { return "Pic"; } + +bool getVoltages(ProgVoltageType type, QDomElement element) +{ + QDomElement voltages = findUniqueElement(element, "voltages", "name", type.key()); + if ( voltages.isNull() ) return false; + bool ok1, ok2, ok3; + data()->_voltages[type].min = voltages.attribute("min").toDouble(&ok1); + data()->_voltages[type].max = voltages.attribute("max").toDouble(&ok2); + data()->_voltages[type].nominal = voltages.attribute("nominal").toDouble(&ok3); + if ( !ok1 || !ok2 || !ok3 ) qFatal(QString("Cannot extract voltage value for \"%1\"").arg(type.key())); + if ( data()->_voltages[type].min>data()->_voltages[type].max + || data()->_voltages[type].nominal_voltages[type].min + || data()->_voltages[type].nominal>data()->_voltages[type].max ) + qFatal("Inconsistent voltages order"); + return true; +} + +bool getMemoryRange(MemoryRangeType type, QDomElement element) +{ + QDomElement range = findUniqueElement(element, "memory", "name", type.key()); + if ( range.isNull() ) return false; + data()->_ranges[type].properties = Present; + bool ok; + uint nbCharsAddress = data()->nbCharsAddress(); + data()->_ranges[type].start = fromHexLabel(range.attribute("start"), nbCharsAddress, &ok); + if ( !ok ) qFatal("Cannot extract start address"); + data()->_ranges[type].end = fromHexLabel(range.attribute("end"), nbCharsAddress, &ok); + if ( !ok ) qFatal("Cannot extract end address"); + if ( data()->_ranges[type].end_ranges[type].start ) qFatal("Memory range end is before its start"); + uint nbCharsWord = data()->nbCharsWord(type); + if ( data()->nbBitsWord(type)==0 ) qFatal(QString("Architecture doesn't contain memory range %1").arg(type.key())); + if ( type==MemoryRangeType::UserId ) { + data()->_userIdRecommendedMask = fromHexLabel(range.attribute("rmask"), nbCharsWord, &ok); + if ( !ok ) qFatal("Cannot extract rmask value for user id"); + if ( !data()->_userIdRecommendedMask.isInside(data()->mask(type)) ) qFatal(QString("rmask is not inside mask %1 (%2)").arg(toHexLabel(data()->_userIdRecommendedMask, 8)).arg(toHexLabel(data()->mask(type), 8))); + } + if ( range.attribute("hexfile_offset")!="?" ) { + data()->_ranges[type].properties |= Programmable; + if ( !range.attribute("hexfile_offset").isEmpty() ) { + data()->_ranges[type].hexFileOffset = fromHexLabel(range.attribute("hexfile_offset"), nbCharsAddress, &ok); + if ( !ok ) qFatal("Cannot extract hexfile_offset"); + } + } + if ( type==MemoryRangeType::Cal && !data()->is18Family() ) { + data()->_calibration.opcodeMask = fromHexLabel(range.attribute("cal_opmask"), nbCharsWord, &ok); + if ( !ok ) qFatal("Cannot extract calibration opcode mask"); + data()->_calibration.opcode = fromHexLabel(range.attribute("cal_opcode"), nbCharsWord, &ok); + if ( !ok ) qFatal("Cannot extract calibration opcode"); + if ( !data()->_calibration.opcode.isInside(data()->_calibration.opcodeMask) ) qFatal("Calibration opcode should be inside opcode mask"); + if ( !data()->_calibration.opcodeMask.isInside(data()->mask(type)) ) qFatal("Calibration mask should be inside opcode mask"); + } + QString wwa = range.attribute("word_write_align"); + QString wea = range.attribute("word_erase_align"); + if ( type==MemoryRangeType::Code ) { + if ( data()->_architecture==Architecture::P18F || data()->_architecture==Architecture::P18J ) { + data()->_nbWordsCodeWrite = wwa.toUInt(&ok); + if ( !ok || data()->_nbWordsCodeWrite==0 || (data()->_nbWordsCodeWrite%4)!=0 ) qFatal("Missing or malformed word write align"); + data()->_nbWordsCodeRowErase = wea.toUInt(&ok); + if ( !ok || (data()->_nbWordsCodeRowErase%4)!=0 ) qFatal("Missing or malformed word erase align"); + } else { + if ( !wwa.isEmpty() || !wea.isEmpty() ) qFatal("word align should not be defined for this device family/subfamily"); + data()->_nbWordsCodeWrite = 0; // #### TODO + data()->_nbWordsCodeRowErase = 0; // #### TODO + } + } else if ( !wwa.isEmpty() || !wea.isEmpty() ) qFatal("word align should not be defined for this memory range"); + return true; +} + +bool hasValue(const Pic::Config::Mask &mask, BitValue value) +{ + for (uint i=0; iarchitecture()!=Pic::Architecture::P18J && data()->architecture()!=Pic::Architecture::P24H + && data()->architecture()!=Pic::Architecture::P24F && data()->architecture()!=Pic::Architecture::P33F + && data()->name()!="30F1010" && data()->name()!="30F2020" && data()->name()!="30F2023" ) + qFatal(QString("cname not defined for \"%1\" (%2)").arg(cvalue.name).arg(cmask.name)); + } + if ( cnames.count()==1 && cnames[0]=="_" ) cnames.clear(); + for (uint i=0; inbCharsWord(MemoryRangeType::Config); + BitValue mask = cmask.value.complementInMask(maxValue(NumberBase::Hex, nbChars)); + if ( ok && v==(mask | cvalue.value) ) continue; + } else if ( XOR(cnames[i].startsWith("_"), data()->architecture()==Pic::Architecture::P30F) ) continue; + qFatal(QString("Invalid config name for \"%1\"/\"%2\"").arg(cmask.name).arg(cvalue.name)); + } + QStringList &ecnames = cvalue.configNames[Pic::ConfigNameType::Extra]; + for (uint i=0; inbCharsWord(MemoryRangeType::Config); + bool ok; + QString defName; + QMap defConfigNames; + Config::Mask cmask; + cmask.name = mask.attribute("name"); + if ( !Config::hasMaskName(cmask.name) ) qFatal(QString("Unknown mask name %1").arg(cmask.name)); + cmask.value = fromHexLabel(mask.attribute("value"), nbChars, &ok); + if ( !ok || cmask.value==0 || cmask.value>data()->mask(MemoryRangeType::Config) ) + qFatal(QString("Malformed mask value in mask %1").arg(mask.attribute("name"))); + //QStringList names; + QDomNode child = mask.firstChild(); + while ( !child.isNull() ) { + QDomElement value = child.toElement(); + child = child.nextSibling(); + if ( value.isNull() ) continue; + if ( value.nodeName()!="value" ) qFatal(QString("Non value child in mask %1").arg(cmask.name)); + if ( value.attribute("value")=="default" ) { + if ( !defName.isEmpty() ) qFatal(QString("Default value already defined for mask %1").arg(cmask.name)); + defName = value.attribute("name"); + //if ( names.contains(defName) ) qFatal(QString("Value name duplicated in mask %1").arg(cmask.name)); + //names.append(defName); + FOR_EACH(Pic::ConfigNameType, type) defConfigNames[type] = QStringList::split(' ', value.attribute(type.data().key)); + continue; + } + Config::Value cvalue; + cvalue.value = fromHexLabel(value.attribute("value"), nbChars, &ok); + if ( !ok || !cvalue.value.isInside(cmask.value) ) qFatal(QString("Malformed value in mask %1").arg(cmask.name)); + cvalue.name = value.attribute("name"); + //if ( names.contains(cvalue.name) ) qFatal(QString("Value name duplicated in mask %1").arg(cmask.name)); + //names.append(cvalue.name); + FOR_EACH(Pic::ConfigNameType, type) cvalue.configNames[type] = QStringList::split(' ', value.attribute(type.data().key)); + processName(cmask, pmask, cvalue); + cmask.values.append(cvalue); + } + // add default values + if ( !defName.isEmpty() ) { + uint nb = 0; + BitValue::const_iterator it; + for (it=cmask.value.begin(); it!=cmask.value.end(); ++it) { + if ( hasValue(cmask, *it) ) continue; // already set + nb++; + Config::Value cvalue; + cvalue.value = *it; + cvalue.name = defName; + cvalue.configNames = defConfigNames; + processName(cmask, pmask, cvalue); + cmask.values.append(cvalue); + } + if ( nb<=1 ) qFatal(QString("Default value used less than twice in mask %1").arg(cmask.name)); + } + qHeapSort(cmask.values); + return cmask; +} + +Pic::Config::Word toConfigWord(QDomElement config) +{ + uint nbChars = data()->nbCharsWord(MemoryRangeType::Config); + Config::Word cword; + cword.name = config.attribute("name"); + if ( cword.name.isNull() ) qFatal("Config word name not specified."); + bool ok; + cword.wmask = fromHexLabel(config.attribute("wmask"), nbChars, &ok); + BitValue gmask = data()->mask(MemoryRangeType::Config); + if ( !ok || cword.wmask>gmask ) qFatal(QString("Missing or malformed config wmask \"%1\"").arg(config.attribute("wmask"))); + cword.bvalue = fromHexLabel(config.attribute("bvalue"), nbChars, &ok); + if ( !ok ) qFatal(QString("Missing or malformed config bvalue \"%1\"").arg(config.attribute("bvalue"))); + if ( config.attribute("pmask").isEmpty() ) cword.pmask = 0; + else { + bool ok; + cword.pmask = fromHexLabel(config.attribute("pmask"), nbChars, &ok); + if ( !ok || cword.pmask>gmask ) qFatal("Missing or malformed config pmask"); + } + cword.ignoredCNames = QStringList::split(' ', config.attribute("icnames")); + for (uint i=0; i_architecture==Pic::Architecture::P30F ) cword.cmask = cword.wmask; + else cword.cmask = mask; + } else { + bool ok; + cword.cmask = fromHexLabel(config.attribute("cmask"), nbChars, &ok); + if ( !ok || cword.cmask>gmask ) qFatal("Missing or malformed config cmask"); + //if ( data()->_architecture==Pic::Architecture::P30X &&cword.cmask==cword.wmask ) qFatal(QString("Redundant cmask in %1").arg(cword.name)); + if ( cword.cmask==mask ) qFatal(QString("Redundant cmask in %1").arg(cword.name)); + } + if ( !cword.pmask.isInside(cword.usedMask()) ) qFatal("pmask should be inside or'ed mask values."); + return cword; +} + +QValueVector getConfigWords(QDomElement element) +{ + uint nbWords = data()->nbWords(MemoryRangeType::Config); + QValueVector configWords(nbWords); + QDomNode child = element.firstChild(); + while ( !child.isNull() ) { + QDomElement config = child.toElement(); + child = child.nextSibling(); + if ( config.isNull() || config.nodeName()!="config" ) continue; + bool ok; + uint offset = fromHexLabel(config.attribute("offset"), 1, &ok); + if ( !ok ) qFatal("Missing or malformed config offset"); + if ( (offset % data()->addressIncrement(MemoryRangeType::Config))!=0 ) qFatal("Config offset not aligned"); + offset /= data()->addressIncrement(MemoryRangeType::Config); + if ( offset>=nbWords ) qFatal(QString("Offset too big %1/%2").arg(offset).arg(nbWords)); + if ( !configWords[offset].name.isNull() ) qFatal(QString("Config offset %1 is duplicated").arg(offset)); + for (uint i=0; i_config->protection(); + QString valueName; + if ( protection.family()==Protection::BlockProtection ) { + valueName = checksum.attribute("protected_blocks"); + bool ok; + uint nb = valueName.toUInt(&ok); + uint max = (protection.hasBootBlock() ? 1 : 0) + protection.nbBlocks(); + if ( !ok || nb>max ) qFatal("Invalid number of protected blocks for checksum"); + if ( nb>0 ) cdata.protectedMaskNames += "CPB"; + for (uint i=1; i_config->findMask(protection.bootSizeMaskName()); + if ( mask==0 ) { + if ( !cdata.bbsize.isEmpty() ) qFatal("Device does not have a variable boot size (no \"bbsize\" allowed in checksum)"); + } else if ( cdata.bbsize.isEmpty() ) { + if ( nb==1 ) qFatal("\"bbsize\" should be define in checksum for \"protected_blocks\"==1"); + } else { + const Config::Value *value = data()->_config->findValue(protection.bootSizeMaskName(), cdata.bbsize); + if ( value==0 ) qFatal("Invalid \"bbsize\" in checksum"); + valueName += "_" + cdata.bbsize; + } + } else { + valueName = checksum.attribute("protected"); + if ( protection.family()==Protection::NoProtection && !valueName.isEmpty() ) + qFatal("Checksum protected attribute for device with no code protection"); + } + if ( data()->_checksums.contains(valueName) ) qFatal("Duplicate checksum protected range"); + + QString s = checksum.attribute("constant"); + if ( s.isEmpty() ) cdata.constant = 0x0000; + else { + bool ok; + cdata.constant = fromHexLabel(s, 4, &ok); + if ( !ok ) qFatal("Malformed checksum constant"); + } + + s = checksum.attribute("type"); + if ( s.isEmpty() ) cdata.algorithm = Checksum::Algorithm::Normal; + else { + cdata.algorithm = Checksum::Algorithm::fromKey(s); + if ( cdata.algorithm==Checksum::Algorithm::Nb_Types ) qFatal("Unrecognized checksum algorithm"); + } + + s = checksum.attribute("mprotected"); + if ( !s.isEmpty() ) { + QStringList list = QStringList::split(" ", s); + for (uint i=0; iconfig().findMask(list[i]); + if ( mask==0 ) qFatal(QString("Not valid mask name for \"protected\" tag in checksum: %1").arg(list[i])); + if ( mask->values.count()==2 ) continue; + for (uint k=0; kvalues.count()); k++) { + QString valueName = mask->values[k].name; + if ( valueName.isEmpty() ) continue; + if ( !protection.isNoneProtectedValueName(valueName) && !protection.isAllProtectedValueName(valueName) ) + qFatal(QString("Not switch protection from mask name for \"protected\" tag in checksum: %1").arg(list[i])); + } + } + cdata.protectedMaskNames = list; + } + + s = checksum.attribute("bchecksum"); + if ( s.isEmpty() ) qFatal("No blank checksum"); + else { + bool ok; + cdata.blankChecksum = fromHexLabel(s, 4, &ok); + if ( !ok ) qFatal("Malformed blank checksum"); + } + + s = checksum.attribute("cchecksum"); + if ( s.isEmpty() ) qFatal("No check checksum"); + else { + bool ok; + cdata.checkChecksum = fromHexLabel(s, 4, &ok); + if ( !ok ) qFatal("Malformed check checksum"); + } + + data()->_checksums[valueName] = cdata; + return valueName; +} + +virtual void processDevice(QDomElement device) +{ + Device::XmlToDataBase::processDevice(device); + + QString arch = device.attribute("architecture"); + data()->_architecture = Architecture::fromKey(arch); + if ( data()->_architecture==Architecture::Nb_Types ) qFatal(QString("Unrecognized architecture \"%1\"").arg(arch)); + if ( (data()->_architecture==Architecture::P18F && data()->_name.contains("C")) + || (data()->_architecture==Architecture::P18F && data()->_name.contains("J")) ) qFatal("Not matching family"); + + bool ok; + QString pc = device.attribute("pc"); + data()->_nbBitsPC = data()->_architecture.data().nbBitsPC; + if ( data()->_nbBitsPC==0 ) { + data()->_nbBitsPC = pc.toUInt(&ok); + if ( !ok || data()->_nbBitsPC==0 ) qFatal("Malformed or missing PC"); + } else if ( !pc.isEmpty() ) qFatal("No PC should be provided for this device architecture"); + + QString sw = device.attribute("self_write"); + data()->_selfWrite = (data()->_memoryTechnology!=Device::MemoryTechnology::Flash ? SelfWrite::No : data()->_architecture.data().selfWrite); + if ( data()->_selfWrite==SelfWrite::Nb_Types ) { + data()->_selfWrite = SelfWrite::fromKey(sw); + if ( data()->_selfWrite==SelfWrite::Nb_Types ) qFatal("Malformed or missing self-write field"); + } else if ( !sw.isEmpty() ) qFatal("Self-write is set for the whole family or non-flash device"); + + // device ids + FOR_EACH(Device::Special, special) { + QString key = "id" + (special==Device::Special::Normal ? QString::null : QString("_") + special.key()); + QString id = device.attribute(key); + if ( id.isEmpty() ) { + if ( special==Device::Special::Normal ) data()->_ids[special] = 0x0000; + } else { + data()->_ids[special] = fromHexLabel(id, 4, &ok); + if ( !ok ) qFatal("Malformed id"); + } + } + + // voltages + QStringList names; + FOR_EACH(ProgVoltageType, vtype) { + names += vtype.key(); + if ( !getVoltages(vtype, device) ) { + switch (vtype.type()) { + case ProgVoltageType::Vpp: + case ProgVoltageType::VddBulkErase: qFatal(QString("Voltage \"%1\" not defined").arg(vtype.key())); + case ProgVoltageType::VddWrite: data()->_voltages[ProgVoltageType::VddWrite] = data()->_voltages[ProgVoltageType::VddBulkErase]; break; + case ProgVoltageType::Nb_Types: Q_ASSERT(false); break; + } + } + } + //if ( data()->vddMin()>data()->_voltages[ProgVoltageType::VddWrite].min ) qFatal("Vdd min higher than VddWrite min"); + //if ( data()->vddMax()_voltages[ProgVoltageType::VddWrite].max ) qFatal("Vdd max lower than VddWrite max"); + if ( data()->_voltages[ProgVoltageType::VddWrite].min>data()->_voltages[ProgVoltageType::VddBulkErase].min ) qFatal("VddWrite min higher than VddBulkErase min"); + if ( data()->_voltages[ProgVoltageType::VddWrite].max_voltages[ProgVoltageType::VddBulkErase].max ) qFatal("VddWrite max lower than VddBulkErase max"); + checkTagNames(device, "voltages", names); + + // memory ranges + names.clear(); + FOR_EACH(MemoryRangeType, i) { + names += i.key(); + if ( !getMemoryRange(i, device) ) continue; + if ( !(data()->_ranges[i].properties & Programmable) ) continue; + for(MemoryRangeType k; k_ranges[k].properties & Present) + || !(data()->_ranges[k].properties & Programmable) ) continue; + if ( i==MemoryRangeType::DebugVector + && k==MemoryRangeType::ProgramExecutive ) continue; + if ( k==MemoryRangeType::DebugVector + && i==MemoryRangeType::ProgramExecutive ) continue; + Address start1 = data()->_ranges[k].start + data()->_ranges[k].hexFileOffset; + Address end1 = data()->_ranges[k].end + data()->_ranges[k].hexFileOffset; + Address start2 = data()->_ranges[i].start + data()->_ranges[i].hexFileOffset; + Address end2 = data()->_ranges[i].end + data()->_ranges[i].hexFileOffset; + if ( end1>=start2 && start1<=end2 ) + qFatal(QString("Overlapping memory ranges (%1 and %2)").arg(k.key()).arg(i.key())); + } + } + checkTagNames(device, "memory", names); + if ( XOR(data()->_ids[Device::Special::Normal]!=0x0000, (data()->_ranges[MemoryRangeType::DeviceId].properties & Present)) ) + qFatal("Id present and device id memory range absent or the opposite"); + + // config words + QValueVector cwords = getConfigWords(device); + uint nbWords = data()->nbWords(MemoryRangeType::Config); + data()->_config->_words.resize(nbWords); + FOR_EACH(Pic::ConfigNameType, type) { + QMap cnames; // cname -> mask name + for (uint i=0; i_config->_words[i] = cwords[i]; + const Config::Word &word = data()->_config->_words[i]; + for (uint j=0; j_config->_words[i]; + for (uint j=0; j_config->checkValueName(mask.name, value.name) ) + qFatal(QString("Malformed value name \"%1\" in mask %2").arg(value.name).arg(mask.name)); + } + } + } + // check if all values are explicit + for (uint i=0; i_config->_words[i]; + for (uint j=0; jnbCharsWord(MemoryRangeType::Config))).arg(mask.name)); + } + } + + // checksums (after config bits!) + QDomElement checksums = findUniqueElement(device, "checksums", QString::null, QString::null); + if ( checksums.isNull() ) { + // qFatal("No checksum defined"); // #### FIXME + } else { + QMap valueNames; + const Pic::Protection &protection = data()->_config->protection(); + if ( protection.family()==Protection::BasicProtection ) { + QString maskName = protection.maskName(Protection::ProgramProtected, MemoryRangeType::Code); + const Pic::Config::Mask *mask = data()->_config->findMask(maskName); + Q_ASSERT(mask); + for (uint i=0; ivalues.count()); i++) valueNames[mask->values[i].name] = false; + } + QDomNode child = checksums.firstChild(); + while ( !child.isNull() ) { + if ( !child.isElement() ) continue; + if ( child.nodeName()!="checksum" ) qFatal("Childs of \"checksums\" should \"checksum\""); + QString valueName = getChecksumData(child.toElement()); + if ( protection.family()==Protection::BasicProtection ) { + if ( !valueNames.contains(valueName) ) qFatal("Unknown protected attribute"); + valueNames[valueName] = true; + } + child = child.nextSibling(); + } + QMap::const_iterator it; + for (it=valueNames.begin(); it!=valueNames.end(); ++it) + if ( !it.key().isEmpty() && !it.data() ) qFatal(QString("Missing checksum \"%1\"").arg(it.key())); + } +} + +void processMirrored(QDomElement element) +{ + QValueVector mirrored; + QDomNode child = element.firstChild(); + while ( !child.isNull() ) { + if ( !child.isElement() ) qFatal("\"mirror\" child should be an element"); + QDomElement e = child.toElement(); + if ( e.nodeName()!="range" ) qFatal("\"mirror\" child should be \"range\""); + RangeData rd; + bool ok; + rd.start = fromHexLabel(e.attribute("start"), &ok); + Address end = fromHexLabel(e.attribute("end"), &ok); + rd.length = end-rd.start+1; + if ( !mirrored.isEmpty() && rd.length!=mirrored[0].length ) + qFatal("Mirrored are not of the same length"); + mirrored.append(rd); + child = child.nextSibling(); + } + if ( !mirrored.isEmpty() ) static_cast(data()->_registersData)->mirrored.append(mirrored); +} + +void processUnused(QDomElement e) +{ + RangeData rd; + bool ok; + rd.start = fromHexLabel(e.attribute("start"), &ok); + if (!ok) qFatal("Malformed start for unused register"); + Address end = fromHexLabel(e.attribute("end"), &ok); + rd.length = end-rd.start+1; + if (!ok) qFatal("Malformed end for unused register"); + static_cast(data()->_registersData)->unused.append(rd); +} + +void processSfr(QDomElement e) +{ + QString name = e.attribute("name"); + if ( name.isEmpty() ) qFatal("SFR cannot have empty name"); + if ( data()->registersData().sfrs.contains(name) || data()->registersData().combined.contains(name) ) + qFatal("SFR name is duplicated"); + bool ok; + uint address = fromHexLabel(e.attribute("address"), &ok); + if ( !ok ) qFatal(QString("SFR %1 address %2 is malformed").arg(name).arg(e.attribute("address"))); + uint rlength = data()->registersData().nbBanks * data()->architecture().data().registerBankLength; + if ( address>=rlength ) qFatal(QString("Address %1 outside register range").arg(toHexLabel(address, 3))); + RegisterData rdata; + rdata.address = address; + uint nb = data()->registersData().nbBits(); + if ( nb>Device::MAX_NB_PORT_BITS ) qFatal(QString("Need higher MAX_NB_PORT_BITS: %1").arg(nb)); + QString access = e.attribute("access"); + if ( uint(access.length())!=nb ) qFatal("access is missing or malformed"); + QString mclr = e.attribute("mclr"); + if ( uint(mclr.length())!=nb ) qFatal("mclr is missing or malformed"); + QString por = e.attribute("por"); + if ( uint(por.length())!=nb ) qFatal("por is missing or malformed"); + for (uint i=0; iMaxRegisterBitProperty ) qFatal(QString("Malformed access bit %1").arg(k)); + rdata.bits[k].mclr = RegisterBitState(fromHex(mclr[i].latin1(), &ok)); + if ( !ok || rdata.bits[k].mclr>Nb_RegisterBitStates ) qFatal(QString("Malformed mclr bit %1").arg(k)); + rdata.bits[k].por = RegisterBitState(fromHex(por[i].latin1(), &ok)); + if ( !ok || rdata.bits[k].por>Nb_RegisterBitStates ) qFatal(QString("Malformed por bit %1").arg(k)); + } + static_cast(data()->_registersData)->sfrs[name] = rdata; +} + +void processCombined(QDomElement e) +{ + QString name = e.attribute("name"); + if ( name.isEmpty() ) qFatal("Combined register cannot have empty name"); + if ( data()->registersData().sfrs.contains(name) || data()->registersData().combined.contains(name) ) + qFatal("Combined register name is duplicated"); + bool ok; + CombinedData rdata; + rdata.address = fromHexLabel(e.attribute("address"), &ok); + if ( !ok ) qFatal(QString("Combined %1 address %2 is malformed").arg(name).arg(e.attribute("address"))); + uint rlength = data()->registersData().nbBanks * data()->architecture().data().registerBankLength; + if ( rdata.address>=rlength ) qFatal(QString("Address %1 outside register range").arg(toHexLabel(rdata.address, 3))); + rdata.nbChars = 2*e.attribute("size").toUInt(&ok); + if ( !ok || rdata.nbChars<2 ) qFatal(QString("Combined %1 size %2 is malformed").arg(name).arg(e.attribute("size"))); + Address end = rdata.address + rdata.nbChars/2 - 1; + if ( end>=rlength ) qFatal(QString("Address %1 outside register range").arg(toHexLabel(end, 3))); + static_cast(data()->_registersData)->combined[name] = rdata; +} + +void processDeviceRegisters(QDomElement element) +{ + QString s = element.attribute("same_as"); + if ( !s.isEmpty() ) { + if ( !_map.contains(s) ) qFatal(QString("Registers same as unknown device %1").arg(s)); + const Pic::Data *d = static_cast(_map[s]); + data()->_registersData = d->_registersData; + return; + } + + RegistersData &rdata = *static_cast(data()->_registersData); + bool ok; + rdata.nbBanks = element.attribute("nb_banks").toUInt(&ok); + if ( !ok || data()->registersData().nbBanks==0 ) qFatal("Malformed number of banks"); + if ( data()->is18Family() ) { + rdata.accessBankSplit = fromHexLabel(element.attribute("access_bank_split_offset"), &ok); + if ( !ok || rdata.accessBankSplit==0 || rdata.accessBankSplit>=0xFF ) qFatal("Malformed access bank split offset"); + rdata.unusedBankMask = fromHexLabel(element.attribute("unused_bank_mask"), &ok); + if ( !ok || rdata.unusedBankMask>=maxValue(NumberBase::Hex, rdata.nbBanks) ) qFatal("Malformed access unused bank mask"); + } else { + rdata.accessBankSplit = 0; + rdata.unusedBankMask = 0; + } + + QDomNode child = element.firstChild(); + while ( !child.isNull() ) { + if ( !child.isElement() ) qFatal("\"device\" child should be an element"); + QDomElement e = child.toElement(); + if ( e.nodeName()=="mirror" ) processMirrored(e); + else if ( e.nodeName()=="unused" ) processUnused(e); + else if ( e.nodeName()=="combined" ) processCombined(e); + else if ( e.nodeName()=="sfr" ) processSfr(e); + else qFatal(QString("Node name \"%1\" is not recognized").arg(e.nodeName())); + child = child.nextSibling(); + } + + for (uint i=0; i::const_iterator it = _map.begin(); + for (; it!=_map.end(); ++it) { + _data = it.data(); + if ( !devices.contains(it.key()) ) qWarning("Register description not found for %s", it.key().latin1()); + } +} + +virtual void checkPins(const QMap &pinLabels) const +{ + if ( !pinLabels.contains("VDD") ) qFatal("No VDD pin specified"); + if ( !pinLabels.contains("VSS") ) qFatal("No VSS pin specified"); + QMap::const_iterator it; + for (it=pinLabels.begin(); it!=pinLabels.end(); ++it) { + if ( it.key()=="VDD" || it.key()=="VSS" || it.key().startsWith("CCP") ) continue; + if ( it.data()!=1 ) qFatal(QString("Duplicated pin \"%1\"").arg(it.key())); + } + const Pic::RegistersData &rdata = static_cast(*_data->registersData()); + for (uint i=0; i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/10F202.xml b/src/devices/pic/xml_data/10F202.xml new file mode 100644 index 0000000..25ce72a --- /dev/null +++ b/src/devices/pic/xml_data/10F202.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/10F204.xml b/src/devices/pic/xml_data/10F204.xml new file mode 100644 index 0000000..e2d2e6d --- /dev/null +++ b/src/devices/pic/xml_data/10F204.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/10F206.xml b/src/devices/pic/xml_data/10F206.xml new file mode 100644 index 0000000..4e66268 --- /dev/null +++ b/src/devices/pic/xml_data/10F206.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/10F220.xml b/src/devices/pic/xml_data/10F220.xml new file mode 100644 index 0000000..694d161 --- /dev/null +++ b/src/devices/pic/xml_data/10F220.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/10F222.xml b/src/devices/pic/xml_data/10F222.xml new file mode 100644 index 0000000..4cba906 --- /dev/null +++ b/src/devices/pic/xml_data/10F222.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12C508.xml b/src/devices/pic/xml_data/12C508.xml new file mode 100644 index 0000000..cb39eae --- /dev/null +++ b/src/devices/pic/xml_data/12C508.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12C508A.xml b/src/devices/pic/xml_data/12C508A.xml new file mode 100644 index 0000000..f1ffb3f --- /dev/null +++ b/src/devices/pic/xml_data/12C508A.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12C509.xml b/src/devices/pic/xml_data/12C509.xml new file mode 100644 index 0000000..dbe885b --- /dev/null +++ b/src/devices/pic/xml_data/12C509.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12C509A.xml b/src/devices/pic/xml_data/12C509A.xml new file mode 100644 index 0000000..240783f --- /dev/null +++ b/src/devices/pic/xml_data/12C509A.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12C671.xml b/src/devices/pic/xml_data/12C671.xml new file mode 100644 index 0000000..f675723 --- /dev/null +++ b/src/devices/pic/xml_data/12C671.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12C672.xml b/src/devices/pic/xml_data/12C672.xml new file mode 100644 index 0000000..80511f1 --- /dev/null +++ b/src/devices/pic/xml_data/12C672.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12CE518.xml b/src/devices/pic/xml_data/12CE518.xml new file mode 100644 index 0000000..e27cbb3 --- /dev/null +++ b/src/devices/pic/xml_data/12CE518.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12CE519.xml b/src/devices/pic/xml_data/12CE519.xml new file mode 100644 index 0000000..210e186 --- /dev/null +++ b/src/devices/pic/xml_data/12CE519.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12CE673.xml b/src/devices/pic/xml_data/12CE673.xml new file mode 100644 index 0000000..3007c29 --- /dev/null +++ b/src/devices/pic/xml_data/12CE673.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12CE674.xml b/src/devices/pic/xml_data/12CE674.xml new file mode 100644 index 0000000..7670f3f --- /dev/null +++ b/src/devices/pic/xml_data/12CE674.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12CR509A.xml b/src/devices/pic/xml_data/12CR509A.xml new file mode 100644 index 0000000..9a795da --- /dev/null +++ b/src/devices/pic/xml_data/12CR509A.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12F508.xml b/src/devices/pic/xml_data/12F508.xml new file mode 100644 index 0000000..19fd956 --- /dev/null +++ b/src/devices/pic/xml_data/12F508.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12F509.xml b/src/devices/pic/xml_data/12F509.xml new file mode 100644 index 0000000..8f3ae12 --- /dev/null +++ b/src/devices/pic/xml_data/12F509.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12F510.xml b/src/devices/pic/xml_data/12F510.xml new file mode 100644 index 0000000..15a2d81 --- /dev/null +++ b/src/devices/pic/xml_data/12F510.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12F519.xml b/src/devices/pic/xml_data/12F519.xml new file mode 100644 index 0000000..600618c --- /dev/null +++ b/src/devices/pic/xml_data/12F519.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12F609.xml b/src/devices/pic/xml_data/12F609.xml new file mode 100644 index 0000000..d3409ee --- /dev/null +++ b/src/devices/pic/xml_data/12F609.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12F615.xml b/src/devices/pic/xml_data/12F615.xml new file mode 100644 index 0000000..d59445e --- /dev/null +++ b/src/devices/pic/xml_data/12F615.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12F629.xml b/src/devices/pic/xml_data/12F629.xml new file mode 100644 index 0000000..53c0cf4 --- /dev/null +++ b/src/devices/pic/xml_data/12F629.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12F635.xml b/src/devices/pic/xml_data/12F635.xml new file mode 100644 index 0000000..f06c3b6 --- /dev/null +++ b/src/devices/pic/xml_data/12F635.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12F675.xml b/src/devices/pic/xml_data/12F675.xml new file mode 100644 index 0000000..6e0f054 --- /dev/null +++ b/src/devices/pic/xml_data/12F675.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/12F683.xml b/src/devices/pic/xml_data/12F683.xml new file mode 100644 index 0000000..1c23260 --- /dev/null +++ b/src/devices/pic/xml_data/12F683.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/14000.xml b/src/devices/pic/xml_data/14000.xml new file mode 100644 index 0000000..8cf2db6 --- /dev/null +++ b/src/devices/pic/xml_data/14000.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C432.xml b/src/devices/pic/xml_data/16C432.xml new file mode 100644 index 0000000..e112d5c --- /dev/null +++ b/src/devices/pic/xml_data/16C432.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C433.xml b/src/devices/pic/xml_data/16C433.xml new file mode 100644 index 0000000..cf07aaa --- /dev/null +++ b/src/devices/pic/xml_data/16C433.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C505.xml b/src/devices/pic/xml_data/16C505.xml new file mode 100644 index 0000000..2cbe2c9 --- /dev/null +++ b/src/devices/pic/xml_data/16C505.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C52.xml b/src/devices/pic/xml_data/16C52.xml new file mode 100644 index 0000000..6ef7753 --- /dev/null +++ b/src/devices/pic/xml_data/16C52.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C54.xml b/src/devices/pic/xml_data/16C54.xml new file mode 100644 index 0000000..06455ee --- /dev/null +++ b/src/devices/pic/xml_data/16C54.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C54A.xml b/src/devices/pic/xml_data/16C54A.xml new file mode 100644 index 0000000..c264f10 --- /dev/null +++ b/src/devices/pic/xml_data/16C54A.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C54B.xml b/src/devices/pic/xml_data/16C54B.xml new file mode 100644 index 0000000..d20ae0e --- /dev/null +++ b/src/devices/pic/xml_data/16C54B.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C54C.xml b/src/devices/pic/xml_data/16C54C.xml new file mode 100644 index 0000000..0d1907b --- /dev/null +++ b/src/devices/pic/xml_data/16C54C.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C55.xml b/src/devices/pic/xml_data/16C55.xml new file mode 100644 index 0000000..0d93443 --- /dev/null +++ b/src/devices/pic/xml_data/16C55.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C554.xml b/src/devices/pic/xml_data/16C554.xml new file mode 100644 index 0000000..1723220 --- /dev/null +++ b/src/devices/pic/xml_data/16C554.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C557.xml b/src/devices/pic/xml_data/16C557.xml new file mode 100644 index 0000000..3a9ddab --- /dev/null +++ b/src/devices/pic/xml_data/16C557.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C558.xml b/src/devices/pic/xml_data/16C558.xml new file mode 100644 index 0000000..484efee --- /dev/null +++ b/src/devices/pic/xml_data/16C558.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C55A.xml b/src/devices/pic/xml_data/16C55A.xml new file mode 100644 index 0000000..27b9eac --- /dev/null +++ b/src/devices/pic/xml_data/16C55A.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C56.xml b/src/devices/pic/xml_data/16C56.xml new file mode 100644 index 0000000..a8ec195 --- /dev/null +++ b/src/devices/pic/xml_data/16C56.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C56A.xml b/src/devices/pic/xml_data/16C56A.xml new file mode 100644 index 0000000..0543765 --- /dev/null +++ b/src/devices/pic/xml_data/16C56A.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C57.xml b/src/devices/pic/xml_data/16C57.xml new file mode 100644 index 0000000..4aef05a --- /dev/null +++ b/src/devices/pic/xml_data/16C57.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C57C.xml b/src/devices/pic/xml_data/16C57C.xml new file mode 100644 index 0000000..4d5f180 --- /dev/null +++ b/src/devices/pic/xml_data/16C57C.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C58A.xml b/src/devices/pic/xml_data/16C58A.xml new file mode 100644 index 0000000..a12abb6 --- /dev/null +++ b/src/devices/pic/xml_data/16C58A.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C58B.xml b/src/devices/pic/xml_data/16C58B.xml new file mode 100644 index 0000000..04f56ce --- /dev/null +++ b/src/devices/pic/xml_data/16C58B.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C61.xml b/src/devices/pic/xml_data/16C61.xml new file mode 100644 index 0000000..0b62c88 --- /dev/null +++ b/src/devices/pic/xml_data/16C61.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C62.xml b/src/devices/pic/xml_data/16C62.xml new file mode 100644 index 0000000..8eebe47 --- /dev/null +++ b/src/devices/pic/xml_data/16C62.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C620.xml b/src/devices/pic/xml_data/16C620.xml new file mode 100644 index 0000000..8a676af --- /dev/null +++ b/src/devices/pic/xml_data/16C620.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C620A.xml b/src/devices/pic/xml_data/16C620A.xml new file mode 100644 index 0000000..9770da4 --- /dev/null +++ b/src/devices/pic/xml_data/16C620A.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C621.xml b/src/devices/pic/xml_data/16C621.xml new file mode 100644 index 0000000..401ee06 --- /dev/null +++ b/src/devices/pic/xml_data/16C621.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C621A.xml b/src/devices/pic/xml_data/16C621A.xml new file mode 100644 index 0000000..97e136e --- /dev/null +++ b/src/devices/pic/xml_data/16C621A.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C622.xml b/src/devices/pic/xml_data/16C622.xml new file mode 100644 index 0000000..f1675bc --- /dev/null +++ b/src/devices/pic/xml_data/16C622.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C622A.xml b/src/devices/pic/xml_data/16C622A.xml new file mode 100644 index 0000000..04e0d9b --- /dev/null +++ b/src/devices/pic/xml_data/16C622A.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C62A.xml b/src/devices/pic/xml_data/16C62A.xml new file mode 100644 index 0000000..71bf13f --- /dev/null +++ b/src/devices/pic/xml_data/16C62A.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C62B.xml b/src/devices/pic/xml_data/16C62B.xml new file mode 100644 index 0000000..6550cbb --- /dev/null +++ b/src/devices/pic/xml_data/16C62B.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C63.xml b/src/devices/pic/xml_data/16C63.xml new file mode 100644 index 0000000..7d21001 --- /dev/null +++ b/src/devices/pic/xml_data/16C63.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C63A.xml b/src/devices/pic/xml_data/16C63A.xml new file mode 100644 index 0000000..2a3eac3 --- /dev/null +++ b/src/devices/pic/xml_data/16C63A.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C64.xml b/src/devices/pic/xml_data/16C64.xml new file mode 100644 index 0000000..2bd6f77 --- /dev/null +++ b/src/devices/pic/xml_data/16C64.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C641.xml b/src/devices/pic/xml_data/16C641.xml new file mode 100644 index 0000000..2a819ff --- /dev/null +++ b/src/devices/pic/xml_data/16C641.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C642.xml b/src/devices/pic/xml_data/16C642.xml new file mode 100644 index 0000000..c5847a9 --- /dev/null +++ b/src/devices/pic/xml_data/16C642.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C64A.xml b/src/devices/pic/xml_data/16C64A.xml new file mode 100644 index 0000000..c5331e6 --- /dev/null +++ b/src/devices/pic/xml_data/16C64A.xml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C65.xml b/src/devices/pic/xml_data/16C65.xml new file mode 100644 index 0000000..1d5de06 --- /dev/null +++ b/src/devices/pic/xml_data/16C65.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C65A.xml b/src/devices/pic/xml_data/16C65A.xml new file mode 100644 index 0000000..4220f2d --- /dev/null +++ b/src/devices/pic/xml_data/16C65A.xml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C65B.xml b/src/devices/pic/xml_data/16C65B.xml new file mode 100644 index 0000000..c5eae8a --- /dev/null +++ b/src/devices/pic/xml_data/16C65B.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C66.xml b/src/devices/pic/xml_data/16C66.xml new file mode 100644 index 0000000..bfa3307 --- /dev/null +++ b/src/devices/pic/xml_data/16C66.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C661.xml b/src/devices/pic/xml_data/16C661.xml new file mode 100644 index 0000000..612f636 --- /dev/null +++ b/src/devices/pic/xml_data/16C661.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C662.xml b/src/devices/pic/xml_data/16C662.xml new file mode 100644 index 0000000..a09c5c5 --- /dev/null +++ b/src/devices/pic/xml_data/16C662.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C67.xml b/src/devices/pic/xml_data/16C67.xml new file mode 100644 index 0000000..43c1aa1 --- /dev/null +++ b/src/devices/pic/xml_data/16C67.xml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C71.xml b/src/devices/pic/xml_data/16C71.xml new file mode 100644 index 0000000..d23acc3 --- /dev/null +++ b/src/devices/pic/xml_data/16C71.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C710.xml b/src/devices/pic/xml_data/16C710.xml new file mode 100644 index 0000000..d6a90c2 --- /dev/null +++ b/src/devices/pic/xml_data/16C710.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C711.xml b/src/devices/pic/xml_data/16C711.xml new file mode 100644 index 0000000..29518e3 --- /dev/null +++ b/src/devices/pic/xml_data/16C711.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C712.xml b/src/devices/pic/xml_data/16C712.xml new file mode 100644 index 0000000..6979deb --- /dev/null +++ b/src/devices/pic/xml_data/16C712.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C715.xml b/src/devices/pic/xml_data/16C715.xml new file mode 100644 index 0000000..501018f --- /dev/null +++ b/src/devices/pic/xml_data/16C715.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C716.xml b/src/devices/pic/xml_data/16C716.xml new file mode 100644 index 0000000..f34e760 --- /dev/null +++ b/src/devices/pic/xml_data/16C716.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C717.xml b/src/devices/pic/xml_data/16C717.xml new file mode 100644 index 0000000..19c6f6a --- /dev/null +++ b/src/devices/pic/xml_data/16C717.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C72.xml b/src/devices/pic/xml_data/16C72.xml new file mode 100644 index 0000000..e6b88a2 --- /dev/null +++ b/src/devices/pic/xml_data/16C72.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C72A.xml b/src/devices/pic/xml_data/16C72A.xml new file mode 100644 index 0000000..cabb079 --- /dev/null +++ b/src/devices/pic/xml_data/16C72A.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C73.xml b/src/devices/pic/xml_data/16C73.xml new file mode 100644 index 0000000..78b69fa --- /dev/null +++ b/src/devices/pic/xml_data/16C73.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C73A.xml b/src/devices/pic/xml_data/16C73A.xml new file mode 100644 index 0000000..df9a672 --- /dev/null +++ b/src/devices/pic/xml_data/16C73A.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C73B.xml b/src/devices/pic/xml_data/16C73B.xml new file mode 100644 index 0000000..b2418f1 --- /dev/null +++ b/src/devices/pic/xml_data/16C73B.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C74.xml b/src/devices/pic/xml_data/16C74.xml new file mode 100644 index 0000000..091501d --- /dev/null +++ b/src/devices/pic/xml_data/16C74.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C745.xml b/src/devices/pic/xml_data/16C745.xml new file mode 100644 index 0000000..1a4ab42 --- /dev/null +++ b/src/devices/pic/xml_data/16C745.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C74A.xml b/src/devices/pic/xml_data/16C74A.xml new file mode 100644 index 0000000..0d784c9 --- /dev/null +++ b/src/devices/pic/xml_data/16C74A.xml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C74B.xml b/src/devices/pic/xml_data/16C74B.xml new file mode 100644 index 0000000..ce7274f --- /dev/null +++ b/src/devices/pic/xml_data/16C74B.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C76.xml b/src/devices/pic/xml_data/16C76.xml new file mode 100644 index 0000000..c5819a2 --- /dev/null +++ b/src/devices/pic/xml_data/16C76.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C765.xml b/src/devices/pic/xml_data/16C765.xml new file mode 100644 index 0000000..c441e17 --- /dev/null +++ b/src/devices/pic/xml_data/16C765.xml @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C77.xml b/src/devices/pic/xml_data/16C77.xml new file mode 100644 index 0000000..f863d24 --- /dev/null +++ b/src/devices/pic/xml_data/16C77.xml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C770.xml b/src/devices/pic/xml_data/16C770.xml new file mode 100644 index 0000000..de1d9e9 --- /dev/null +++ b/src/devices/pic/xml_data/16C770.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C771.xml b/src/devices/pic/xml_data/16C771.xml new file mode 100644 index 0000000..4bf7fcd --- /dev/null +++ b/src/devices/pic/xml_data/16C771.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C773.xml b/src/devices/pic/xml_data/16C773.xml new file mode 100644 index 0000000..1b74ed5 --- /dev/null +++ b/src/devices/pic/xml_data/16C773.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C774.xml b/src/devices/pic/xml_data/16C774.xml new file mode 100644 index 0000000..1d577ee --- /dev/null +++ b/src/devices/pic/xml_data/16C774.xml @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C781.xml b/src/devices/pic/xml_data/16C781.xml new file mode 100644 index 0000000..2861a67 --- /dev/null +++ b/src/devices/pic/xml_data/16C781.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C782.xml b/src/devices/pic/xml_data/16C782.xml new file mode 100644 index 0000000..6192a30 --- /dev/null +++ b/src/devices/pic/xml_data/16C782.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C84.xml b/src/devices/pic/xml_data/16C84.xml new file mode 100644 index 0000000..595bcd9 --- /dev/null +++ b/src/devices/pic/xml_data/16C84.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C923.xml b/src/devices/pic/xml_data/16C923.xml new file mode 100644 index 0000000..a670a59 --- /dev/null +++ b/src/devices/pic/xml_data/16C923.xml @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C924.xml b/src/devices/pic/xml_data/16C924.xml new file mode 100644 index 0000000..614ff48 --- /dev/null +++ b/src/devices/pic/xml_data/16C924.xml @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C925.xml b/src/devices/pic/xml_data/16C925.xml new file mode 100644 index 0000000..b9c703d --- /dev/null +++ b/src/devices/pic/xml_data/16C925.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16C926.xml b/src/devices/pic/xml_data/16C926.xml new file mode 100644 index 0000000..4120d43 --- /dev/null +++ b/src/devices/pic/xml_data/16C926.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CE623.xml b/src/devices/pic/xml_data/16CE623.xml new file mode 100644 index 0000000..18e6848 --- /dev/null +++ b/src/devices/pic/xml_data/16CE623.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CE624.xml b/src/devices/pic/xml_data/16CE624.xml new file mode 100644 index 0000000..4f205a7 --- /dev/null +++ b/src/devices/pic/xml_data/16CE624.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CE625.xml b/src/devices/pic/xml_data/16CE625.xml new file mode 100644 index 0000000..d7aa576 --- /dev/null +++ b/src/devices/pic/xml_data/16CE625.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR54.xml_broken b/src/devices/pic/xml_data/16CR54.xml_broken new file mode 100644 index 0000000..cef44cb --- /dev/null +++ b/src/devices/pic/xml_data/16CR54.xml_broken @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR54A.xml b/src/devices/pic/xml_data/16CR54A.xml new file mode 100644 index 0000000..c3a5d2a --- /dev/null +++ b/src/devices/pic/xml_data/16CR54A.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR54B.xml b/src/devices/pic/xml_data/16CR54B.xml new file mode 100644 index 0000000..43456d8 --- /dev/null +++ b/src/devices/pic/xml_data/16CR54B.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR54C.xml b/src/devices/pic/xml_data/16CR54C.xml new file mode 100644 index 0000000..3667ce3 --- /dev/null +++ b/src/devices/pic/xml_data/16CR54C.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR56A.xml b/src/devices/pic/xml_data/16CR56A.xml new file mode 100644 index 0000000..0b28931 --- /dev/null +++ b/src/devices/pic/xml_data/16CR56A.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR57B.xml b/src/devices/pic/xml_data/16CR57B.xml new file mode 100644 index 0000000..caba4c3 --- /dev/null +++ b/src/devices/pic/xml_data/16CR57B.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR57C.xml b/src/devices/pic/xml_data/16CR57C.xml new file mode 100644 index 0000000..379f1bc --- /dev/null +++ b/src/devices/pic/xml_data/16CR57C.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR58A.xml b/src/devices/pic/xml_data/16CR58A.xml new file mode 100644 index 0000000..3841400 --- /dev/null +++ b/src/devices/pic/xml_data/16CR58A.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR58B.xml b/src/devices/pic/xml_data/16CR58B.xml new file mode 100644 index 0000000..b450e31 --- /dev/null +++ b/src/devices/pic/xml_data/16CR58B.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR62.xml b/src/devices/pic/xml_data/16CR62.xml new file mode 100644 index 0000000..0b27a3c --- /dev/null +++ b/src/devices/pic/xml_data/16CR62.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR620A.xml b/src/devices/pic/xml_data/16CR620A.xml new file mode 100644 index 0000000..a2e6db3 --- /dev/null +++ b/src/devices/pic/xml_data/16CR620A.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR63.xml b/src/devices/pic/xml_data/16CR63.xml new file mode 100644 index 0000000..08d6f3f --- /dev/null +++ b/src/devices/pic/xml_data/16CR63.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR64.xml b/src/devices/pic/xml_data/16CR64.xml new file mode 100644 index 0000000..e155a97 --- /dev/null +++ b/src/devices/pic/xml_data/16CR64.xml @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR65.xml b/src/devices/pic/xml_data/16CR65.xml new file mode 100644 index 0000000..df4d3f4 --- /dev/null +++ b/src/devices/pic/xml_data/16CR65.xml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR72.xml b/src/devices/pic/xml_data/16CR72.xml new file mode 100644 index 0000000..efaa9f8 --- /dev/null +++ b/src/devices/pic/xml_data/16CR72.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR73.xml b/src/devices/pic/xml_data/16CR73.xml new file mode 100644 index 0000000..6513255 --- /dev/null +++ b/src/devices/pic/xml_data/16CR73.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR74.xml b/src/devices/pic/xml_data/16CR74.xml new file mode 100644 index 0000000..6fec92e --- /dev/null +++ b/src/devices/pic/xml_data/16CR74.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR76.xml b/src/devices/pic/xml_data/16CR76.xml new file mode 100644 index 0000000..dd9916a --- /dev/null +++ b/src/devices/pic/xml_data/16CR76.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR77.xml b/src/devices/pic/xml_data/16CR77.xml new file mode 100644 index 0000000..661ebf0 --- /dev/null +++ b/src/devices/pic/xml_data/16CR77.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR83.xml b/src/devices/pic/xml_data/16CR83.xml new file mode 100644 index 0000000..01c4166 --- /dev/null +++ b/src/devices/pic/xml_data/16CR83.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16CR84.xml b/src/devices/pic/xml_data/16CR84.xml new file mode 100644 index 0000000..5d93205 --- /dev/null +++ b/src/devices/pic/xml_data/16CR84.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F505.xml b/src/devices/pic/xml_data/16F505.xml new file mode 100644 index 0000000..bbc2607 --- /dev/null +++ b/src/devices/pic/xml_data/16F505.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F506.xml b/src/devices/pic/xml_data/16F506.xml new file mode 100644 index 0000000..4fa7a47 --- /dev/null +++ b/src/devices/pic/xml_data/16F506.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F54.xml b/src/devices/pic/xml_data/16F54.xml new file mode 100644 index 0000000..4b55624 --- /dev/null +++ b/src/devices/pic/xml_data/16F54.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F57.xml b/src/devices/pic/xml_data/16F57.xml new file mode 100644 index 0000000..e84e053 --- /dev/null +++ b/src/devices/pic/xml_data/16F57.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F59.xml b/src/devices/pic/xml_data/16F59.xml new file mode 100644 index 0000000..b29659a --- /dev/null +++ b/src/devices/pic/xml_data/16F59.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F610.xml b/src/devices/pic/xml_data/16F610.xml new file mode 100644 index 0000000..46795b1 --- /dev/null +++ b/src/devices/pic/xml_data/16F610.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F616.xml b/src/devices/pic/xml_data/16F616.xml new file mode 100644 index 0000000..9f8ca55 --- /dev/null +++ b/src/devices/pic/xml_data/16F616.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F627.xml b/src/devices/pic/xml_data/16F627.xml new file mode 100644 index 0000000..7ce03a5 --- /dev/null +++ b/src/devices/pic/xml_data/16F627.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F627A.xml b/src/devices/pic/xml_data/16F627A.xml new file mode 100644 index 0000000..de43d7a --- /dev/null +++ b/src/devices/pic/xml_data/16F627A.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F628.xml b/src/devices/pic/xml_data/16F628.xml new file mode 100644 index 0000000..fed16fa --- /dev/null +++ b/src/devices/pic/xml_data/16F628.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F628A.xml b/src/devices/pic/xml_data/16F628A.xml new file mode 100644 index 0000000..8c5a4cc --- /dev/null +++ b/src/devices/pic/xml_data/16F628A.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F630.xml b/src/devices/pic/xml_data/16F630.xml new file mode 100644 index 0000000..a82ffdb --- /dev/null +++ b/src/devices/pic/xml_data/16F630.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F631.xml b/src/devices/pic/xml_data/16F631.xml new file mode 100644 index 0000000..e6a5274 --- /dev/null +++ b/src/devices/pic/xml_data/16F631.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F636.xml b/src/devices/pic/xml_data/16F636.xml new file mode 100644 index 0000000..e47314e --- /dev/null +++ b/src/devices/pic/xml_data/16F636.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F639.xml b/src/devices/pic/xml_data/16F639.xml new file mode 100644 index 0000000..7affb7b --- /dev/null +++ b/src/devices/pic/xml_data/16F639.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F648A.xml b/src/devices/pic/xml_data/16F648A.xml new file mode 100644 index 0000000..17b4f83 --- /dev/null +++ b/src/devices/pic/xml_data/16F648A.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F676.xml b/src/devices/pic/xml_data/16F676.xml new file mode 100644 index 0000000..b608d48 --- /dev/null +++ b/src/devices/pic/xml_data/16F676.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F677.xml b/src/devices/pic/xml_data/16F677.xml new file mode 100644 index 0000000..d27b2eb --- /dev/null +++ b/src/devices/pic/xml_data/16F677.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F684.xml b/src/devices/pic/xml_data/16F684.xml new file mode 100644 index 0000000..f330925 --- /dev/null +++ b/src/devices/pic/xml_data/16F684.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F685.xml b/src/devices/pic/xml_data/16F685.xml new file mode 100644 index 0000000..aa35aa3 --- /dev/null +++ b/src/devices/pic/xml_data/16F685.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F687.xml b/src/devices/pic/xml_data/16F687.xml new file mode 100644 index 0000000..2e58780 --- /dev/null +++ b/src/devices/pic/xml_data/16F687.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F688.xml b/src/devices/pic/xml_data/16F688.xml new file mode 100644 index 0000000..2692159 --- /dev/null +++ b/src/devices/pic/xml_data/16F688.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F689.xml b/src/devices/pic/xml_data/16F689.xml new file mode 100644 index 0000000..f22fdcd --- /dev/null +++ b/src/devices/pic/xml_data/16F689.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F690.xml b/src/devices/pic/xml_data/16F690.xml new file mode 100644 index 0000000..7a51bac --- /dev/null +++ b/src/devices/pic/xml_data/16F690.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F716.xml b/src/devices/pic/xml_data/16F716.xml new file mode 100644 index 0000000..8ebaa00 --- /dev/null +++ b/src/devices/pic/xml_data/16F716.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F72.xml b/src/devices/pic/xml_data/16F72.xml new file mode 100644 index 0000000..d49b2cd --- /dev/null +++ b/src/devices/pic/xml_data/16F72.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F73.xml b/src/devices/pic/xml_data/16F73.xml new file mode 100644 index 0000000..157cb74 --- /dev/null +++ b/src/devices/pic/xml_data/16F73.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F737.xml b/src/devices/pic/xml_data/16F737.xml new file mode 100644 index 0000000..0184aa9 --- /dev/null +++ b/src/devices/pic/xml_data/16F737.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F74.xml b/src/devices/pic/xml_data/16F74.xml new file mode 100644 index 0000000..fc2b312 --- /dev/null +++ b/src/devices/pic/xml_data/16F74.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F747.xml b/src/devices/pic/xml_data/16F747.xml new file mode 100644 index 0000000..ec03640 --- /dev/null +++ b/src/devices/pic/xml_data/16F747.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F76.xml b/src/devices/pic/xml_data/16F76.xml new file mode 100644 index 0000000..3b6fcf3 --- /dev/null +++ b/src/devices/pic/xml_data/16F76.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F767.xml b/src/devices/pic/xml_data/16F767.xml new file mode 100644 index 0000000..77ed134 --- /dev/null +++ b/src/devices/pic/xml_data/16F767.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F77.xml b/src/devices/pic/xml_data/16F77.xml new file mode 100644 index 0000000..e02e2cb --- /dev/null +++ b/src/devices/pic/xml_data/16F77.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F777.xml b/src/devices/pic/xml_data/16F777.xml new file mode 100644 index 0000000..71899b2 --- /dev/null +++ b/src/devices/pic/xml_data/16F777.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F785.xml b/src/devices/pic/xml_data/16F785.xml new file mode 100644 index 0000000..80c9091 --- /dev/null +++ b/src/devices/pic/xml_data/16F785.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F818.xml b/src/devices/pic/xml_data/16F818.xml new file mode 100644 index 0000000..0ff73b5 --- /dev/null +++ b/src/devices/pic/xml_data/16F818.xml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F819.xml b/src/devices/pic/xml_data/16F819.xml new file mode 100644 index 0000000..e7ee0a6 --- /dev/null +++ b/src/devices/pic/xml_data/16F819.xml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F83.xml b/src/devices/pic/xml_data/16F83.xml new file mode 100644 index 0000000..25b80a3 --- /dev/null +++ b/src/devices/pic/xml_data/16F83.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F84.xml b/src/devices/pic/xml_data/16F84.xml new file mode 100644 index 0000000..62c1f8d --- /dev/null +++ b/src/devices/pic/xml_data/16F84.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F84A.xml b/src/devices/pic/xml_data/16F84A.xml new file mode 100644 index 0000000..ffffba1 --- /dev/null +++ b/src/devices/pic/xml_data/16F84A.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F87.xml b/src/devices/pic/xml_data/16F87.xml new file mode 100644 index 0000000..835b481 --- /dev/null +++ b/src/devices/pic/xml_data/16F87.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F870.xml b/src/devices/pic/xml_data/16F870.xml new file mode 100644 index 0000000..ec66b54 --- /dev/null +++ b/src/devices/pic/xml_data/16F870.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F871.xml b/src/devices/pic/xml_data/16F871.xml new file mode 100644 index 0000000..8b918ca --- /dev/null +++ b/src/devices/pic/xml_data/16F871.xml @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F872.xml b/src/devices/pic/xml_data/16F872.xml new file mode 100644 index 0000000..7702922 --- /dev/null +++ b/src/devices/pic/xml_data/16F872.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F873.xml b/src/devices/pic/xml_data/16F873.xml new file mode 100644 index 0000000..4bbb1cb --- /dev/null +++ b/src/devices/pic/xml_data/16F873.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F873A.xml b/src/devices/pic/xml_data/16F873A.xml new file mode 100644 index 0000000..ee26828 --- /dev/null +++ b/src/devices/pic/xml_data/16F873A.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F874.xml b/src/devices/pic/xml_data/16F874.xml new file mode 100644 index 0000000..fe20128 --- /dev/null +++ b/src/devices/pic/xml_data/16F874.xml @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F874A.xml b/src/devices/pic/xml_data/16F874A.xml new file mode 100644 index 0000000..c89b407 --- /dev/null +++ b/src/devices/pic/xml_data/16F874A.xml @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F876.xml b/src/devices/pic/xml_data/16F876.xml new file mode 100644 index 0000000..19264e8 --- /dev/null +++ b/src/devices/pic/xml_data/16F876.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F876A.xml b/src/devices/pic/xml_data/16F876A.xml new file mode 100644 index 0000000..f1c23ce --- /dev/null +++ b/src/devices/pic/xml_data/16F876A.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F877.xml b/src/devices/pic/xml_data/16F877.xml new file mode 100644 index 0000000..f83da05 --- /dev/null +++ b/src/devices/pic/xml_data/16F877.xml @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F877A.xml b/src/devices/pic/xml_data/16F877A.xml new file mode 100644 index 0000000..3a16d77 --- /dev/null +++ b/src/devices/pic/xml_data/16F877A.xml @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F88.xml b/src/devices/pic/xml_data/16F88.xml new file mode 100644 index 0000000..b2325c3 --- /dev/null +++ b/src/devices/pic/xml_data/16F88.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F882.xml b/src/devices/pic/xml_data/16F882.xml new file mode 100644 index 0000000..db2c723 --- /dev/null +++ b/src/devices/pic/xml_data/16F882.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F883.xml b/src/devices/pic/xml_data/16F883.xml new file mode 100644 index 0000000..1140b72 --- /dev/null +++ b/src/devices/pic/xml_data/16F883.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F884.xml b/src/devices/pic/xml_data/16F884.xml new file mode 100644 index 0000000..fbe9423 --- /dev/null +++ b/src/devices/pic/xml_data/16F884.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F886.xml b/src/devices/pic/xml_data/16F886.xml new file mode 100644 index 0000000..3205cd7 --- /dev/null +++ b/src/devices/pic/xml_data/16F886.xml @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F887.xml b/src/devices/pic/xml_data/16F887.xml new file mode 100644 index 0000000..78be11e --- /dev/null +++ b/src/devices/pic/xml_data/16F887.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F913.xml b/src/devices/pic/xml_data/16F913.xml new file mode 100644 index 0000000..c904d5d --- /dev/null +++ b/src/devices/pic/xml_data/16F913.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F914.xml b/src/devices/pic/xml_data/16F914.xml new file mode 100644 index 0000000..d74a0d5 --- /dev/null +++ b/src/devices/pic/xml_data/16F914.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F916.xml b/src/devices/pic/xml_data/16F916.xml new file mode 100644 index 0000000..b066f93 --- /dev/null +++ b/src/devices/pic/xml_data/16F916.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F917.xml b/src/devices/pic/xml_data/16F917.xml new file mode 100644 index 0000000..9e17dcc --- /dev/null +++ b/src/devices/pic/xml_data/16F917.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16F946.xml b/src/devices/pic/xml_data/16F946.xml new file mode 100644 index 0000000..53df522 --- /dev/null +++ b/src/devices/pic/xml_data/16F946.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/16HV540.xml b/src/devices/pic/xml_data/16HV540.xml new file mode 100644 index 0000000..439aa82 --- /dev/null +++ b/src/devices/pic/xml_data/16HV540.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/17C42.xml b/src/devices/pic/xml_data/17C42.xml new file mode 100644 index 0000000..e072c94 --- /dev/null +++ b/src/devices/pic/xml_data/17C42.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/17C42A.xml b/src/devices/pic/xml_data/17C42A.xml new file mode 100644 index 0000000..58c59b3 --- /dev/null +++ b/src/devices/pic/xml_data/17C42A.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/17C43.xml b/src/devices/pic/xml_data/17C43.xml new file mode 100644 index 0000000..4c91f40 --- /dev/null +++ b/src/devices/pic/xml_data/17C43.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/17C44.xml b/src/devices/pic/xml_data/17C44.xml new file mode 100644 index 0000000..da4be7b --- /dev/null +++ b/src/devices/pic/xml_data/17C44.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/17C752.xml b/src/devices/pic/xml_data/17C752.xml new file mode 100644 index 0000000..20f798f --- /dev/null +++ b/src/devices/pic/xml_data/17C752.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/17C756.xml b/src/devices/pic/xml_data/17C756.xml new file mode 100644 index 0000000..a5df4c4 --- /dev/null +++ b/src/devices/pic/xml_data/17C756.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/17C756A.xml b/src/devices/pic/xml_data/17C756A.xml new file mode 100644 index 0000000..f20ee31 --- /dev/null +++ b/src/devices/pic/xml_data/17C756A.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/17C762.xml b/src/devices/pic/xml_data/17C762.xml new file mode 100644 index 0000000..10e3a86 --- /dev/null +++ b/src/devices/pic/xml_data/17C762.xml @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/17C766.xml b/src/devices/pic/xml_data/17C766.xml new file mode 100644 index 0000000..0d2559d --- /dev/null +++ b/src/devices/pic/xml_data/17C766.xml @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/17CR42.xml b/src/devices/pic/xml_data/17CR42.xml new file mode 100644 index 0000000..b691cd8 --- /dev/null +++ b/src/devices/pic/xml_data/17CR42.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/17CR43.xml b/src/devices/pic/xml_data/17CR43.xml new file mode 100644 index 0000000..13c1f2c --- /dev/null +++ b/src/devices/pic/xml_data/17CR43.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18C242.xml b/src/devices/pic/xml_data/18C242.xml new file mode 100644 index 0000000..798c478 --- /dev/null +++ b/src/devices/pic/xml_data/18C242.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18C252.xml b/src/devices/pic/xml_data/18C252.xml new file mode 100644 index 0000000..81f370b --- /dev/null +++ b/src/devices/pic/xml_data/18C252.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18C442.xml b/src/devices/pic/xml_data/18C442.xml new file mode 100644 index 0000000..419ee29 --- /dev/null +++ b/src/devices/pic/xml_data/18C442.xml @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18C452.xml b/src/devices/pic/xml_data/18C452.xml new file mode 100644 index 0000000..73e3610 --- /dev/null +++ b/src/devices/pic/xml_data/18C452.xml @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18C601.xml b/src/devices/pic/xml_data/18C601.xml new file mode 100644 index 0000000..6d41b1c --- /dev/null +++ b/src/devices/pic/xml_data/18C601.xml @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18C658.xml b/src/devices/pic/xml_data/18C658.xml new file mode 100644 index 0000000..9ca140c --- /dev/null +++ b/src/devices/pic/xml_data/18C658.xml @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18C801.xml b/src/devices/pic/xml_data/18C801.xml new file mode 100644 index 0000000..3e067ad --- /dev/null +++ b/src/devices/pic/xml_data/18C801.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18C858.xml b/src/devices/pic/xml_data/18C858.xml new file mode 100644 index 0000000..7ce8087 --- /dev/null +++ b/src/devices/pic/xml_data/18C858.xml @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F1220.xml b/src/devices/pic/xml_data/18F1220.xml new file mode 100644 index 0000000..e46f7f0 --- /dev/null +++ b/src/devices/pic/xml_data/18F1220.xml @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F1230.xml b/src/devices/pic/xml_data/18F1230.xml new file mode 100644 index 0000000..043687a --- /dev/null +++ b/src/devices/pic/xml_data/18F1230.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F1320.xml b/src/devices/pic/xml_data/18F1320.xml new file mode 100644 index 0000000..d4dd214 --- /dev/null +++ b/src/devices/pic/xml_data/18F1320.xml @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F1330.xml b/src/devices/pic/xml_data/18F1330.xml new file mode 100644 index 0000000..14130ce --- /dev/null +++ b/src/devices/pic/xml_data/18F1330.xml @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2220.xml b/src/devices/pic/xml_data/18F2220.xml new file mode 100644 index 0000000..43f6fbc --- /dev/null +++ b/src/devices/pic/xml_data/18F2220.xml @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2221.xml b/src/devices/pic/xml_data/18F2221.xml new file mode 100644 index 0000000..f2a58d6 --- /dev/null +++ b/src/devices/pic/xml_data/18F2221.xml @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2320.xml b/src/devices/pic/xml_data/18F2320.xml new file mode 100644 index 0000000..80e8250 --- /dev/null +++ b/src/devices/pic/xml_data/18F2320.xml @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2321.xml b/src/devices/pic/xml_data/18F2321.xml new file mode 100644 index 0000000..a016fc7 --- /dev/null +++ b/src/devices/pic/xml_data/18F2321.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2331.xml b/src/devices/pic/xml_data/18F2331.xml new file mode 100644 index 0000000..46a8872 --- /dev/null +++ b/src/devices/pic/xml_data/18F2331.xml @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2410.xml b/src/devices/pic/xml_data/18F2410.xml new file mode 100644 index 0000000..15d6179 --- /dev/null +++ b/src/devices/pic/xml_data/18F2410.xml @@ -0,0 +1,268 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F242.xml b/src/devices/pic/xml_data/18F242.xml new file mode 100644 index 0000000..d09dd83 --- /dev/null +++ b/src/devices/pic/xml_data/18F242.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2420.xml b/src/devices/pic/xml_data/18F2420.xml new file mode 100644 index 0000000..aba9ace --- /dev/null +++ b/src/devices/pic/xml_data/18F2420.xml @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2423.xml b/src/devices/pic/xml_data/18F2423.xml new file mode 100644 index 0000000..0905f18 --- /dev/null +++ b/src/devices/pic/xml_data/18F2423.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2431.xml b/src/devices/pic/xml_data/18F2431.xml new file mode 100644 index 0000000..f898f99 --- /dev/null +++ b/src/devices/pic/xml_data/18F2431.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2439.xml b/src/devices/pic/xml_data/18F2439.xml new file mode 100644 index 0000000..ad389e3 --- /dev/null +++ b/src/devices/pic/xml_data/18F2439.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2450.xml b/src/devices/pic/xml_data/18F2450.xml new file mode 100644 index 0000000..2388a92 --- /dev/null +++ b/src/devices/pic/xml_data/18F2450.xml @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2455.xml b/src/devices/pic/xml_data/18F2455.xml new file mode 100644 index 0000000..7097218 --- /dev/null +++ b/src/devices/pic/xml_data/18F2455.xml @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F248.xml b/src/devices/pic/xml_data/18F248.xml new file mode 100644 index 0000000..973ba90 --- /dev/null +++ b/src/devices/pic/xml_data/18F248.xml @@ -0,0 +1,216 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2480.xml b/src/devices/pic/xml_data/18F2480.xml new file mode 100644 index 0000000..7f8929b --- /dev/null +++ b/src/devices/pic/xml_data/18F2480.xml @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F24J10.xml b/src/devices/pic/xml_data/18F24J10.xml new file mode 100644 index 0000000..c4ae257 --- /dev/null +++ b/src/devices/pic/xml_data/18F24J10.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2510.xml b/src/devices/pic/xml_data/18F2510.xml new file mode 100644 index 0000000..1950de1 --- /dev/null +++ b/src/devices/pic/xml_data/18F2510.xml @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2515.xml b/src/devices/pic/xml_data/18F2515.xml new file mode 100644 index 0000000..89960ae --- /dev/null +++ b/src/devices/pic/xml_data/18F2515.xml @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F252.xml b/src/devices/pic/xml_data/18F252.xml new file mode 100644 index 0000000..b1d4153 --- /dev/null +++ b/src/devices/pic/xml_data/18F252.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2520.xml b/src/devices/pic/xml_data/18F2520.xml new file mode 100644 index 0000000..3c77df0 --- /dev/null +++ b/src/devices/pic/xml_data/18F2520.xml @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2523.xml b/src/devices/pic/xml_data/18F2523.xml new file mode 100644 index 0000000..6a92c8d --- /dev/null +++ b/src/devices/pic/xml_data/18F2523.xml @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2525.xml b/src/devices/pic/xml_data/18F2525.xml new file mode 100644 index 0000000..2ff5bc7 --- /dev/null +++ b/src/devices/pic/xml_data/18F2525.xml @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2539.xml b/src/devices/pic/xml_data/18F2539.xml new file mode 100644 index 0000000..0f4a17a --- /dev/null +++ b/src/devices/pic/xml_data/18F2539.xml @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2550.xml b/src/devices/pic/xml_data/18F2550.xml new file mode 100644 index 0000000..21ab9ae --- /dev/null +++ b/src/devices/pic/xml_data/18F2550.xml @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F258.xml b/src/devices/pic/xml_data/18F258.xml new file mode 100644 index 0000000..bb27ca5 --- /dev/null +++ b/src/devices/pic/xml_data/18F258.xml @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2580.xml b/src/devices/pic/xml_data/18F2580.xml new file mode 100644 index 0000000..6721af5 --- /dev/null +++ b/src/devices/pic/xml_data/18F2580.xml @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2585.xml b/src/devices/pic/xml_data/18F2585.xml new file mode 100644 index 0000000..12b38f1 --- /dev/null +++ b/src/devices/pic/xml_data/18F2585.xml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F25J10.xml b/src/devices/pic/xml_data/18F25J10.xml new file mode 100644 index 0000000..57f37d4 --- /dev/null +++ b/src/devices/pic/xml_data/18F25J10.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2610.xml b/src/devices/pic/xml_data/18F2610.xml new file mode 100644 index 0000000..e38c6d2 --- /dev/null +++ b/src/devices/pic/xml_data/18F2610.xml @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2620.xml b/src/devices/pic/xml_data/18F2620.xml new file mode 100644 index 0000000..7c25f21 --- /dev/null +++ b/src/devices/pic/xml_data/18F2620.xml @@ -0,0 +1,265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2680.xml b/src/devices/pic/xml_data/18F2680.xml new file mode 100644 index 0000000..2dcd013 --- /dev/null +++ b/src/devices/pic/xml_data/18F2680.xml @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2682.xml b/src/devices/pic/xml_data/18F2682.xml new file mode 100644 index 0000000..8c13b2d --- /dev/null +++ b/src/devices/pic/xml_data/18F2682.xml @@ -0,0 +1,284 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F2685.xml b/src/devices/pic/xml_data/18F2685.xml new file mode 100644 index 0000000..bca6818 --- /dev/null +++ b/src/devices/pic/xml_data/18F2685.xml @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4220.xml b/src/devices/pic/xml_data/18F4220.xml new file mode 100644 index 0000000..f1c19c7 --- /dev/null +++ b/src/devices/pic/xml_data/18F4220.xml @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4221.xml b/src/devices/pic/xml_data/18F4221.xml new file mode 100644 index 0000000..d4a7e11 --- /dev/null +++ b/src/devices/pic/xml_data/18F4221.xml @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4320.xml b/src/devices/pic/xml_data/18F4320.xml new file mode 100644 index 0000000..734bb11 --- /dev/null +++ b/src/devices/pic/xml_data/18F4320.xml @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4321.xml b/src/devices/pic/xml_data/18F4321.xml new file mode 100644 index 0000000..6bdd265 --- /dev/null +++ b/src/devices/pic/xml_data/18F4321.xml @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4331.xml b/src/devices/pic/xml_data/18F4331.xml new file mode 100644 index 0000000..a22e667 --- /dev/null +++ b/src/devices/pic/xml_data/18F4331.xml @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4410.xml b/src/devices/pic/xml_data/18F4410.xml new file mode 100644 index 0000000..8ca9b17 --- /dev/null +++ b/src/devices/pic/xml_data/18F4410.xml @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F442.xml b/src/devices/pic/xml_data/18F442.xml new file mode 100644 index 0000000..61f6a63 --- /dev/null +++ b/src/devices/pic/xml_data/18F442.xml @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4420.xml b/src/devices/pic/xml_data/18F4420.xml new file mode 100644 index 0000000..83a0022 --- /dev/null +++ b/src/devices/pic/xml_data/18F4420.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4423.xml b/src/devices/pic/xml_data/18F4423.xml new file mode 100644 index 0000000..1760494 --- /dev/null +++ b/src/devices/pic/xml_data/18F4423.xml @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4431.xml b/src/devices/pic/xml_data/18F4431.xml new file mode 100644 index 0000000..c19b48a --- /dev/null +++ b/src/devices/pic/xml_data/18F4431.xml @@ -0,0 +1,409 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4439.xml b/src/devices/pic/xml_data/18F4439.xml new file mode 100644 index 0000000..3441809 --- /dev/null +++ b/src/devices/pic/xml_data/18F4439.xml @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4450.xml b/src/devices/pic/xml_data/18F4450.xml new file mode 100644 index 0000000..e634df1 --- /dev/null +++ b/src/devices/pic/xml_data/18F4450.xml @@ -0,0 +1,378 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4455.xml b/src/devices/pic/xml_data/18F4455.xml new file mode 100644 index 0000000..282decb --- /dev/null +++ b/src/devices/pic/xml_data/18F4455.xml @@ -0,0 +1,398 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F448.xml b/src/devices/pic/xml_data/18F448.xml new file mode 100644 index 0000000..40de124 --- /dev/null +++ b/src/devices/pic/xml_data/18F448.xml @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4480.xml b/src/devices/pic/xml_data/18F4480.xml new file mode 100644 index 0000000..b9a87da --- /dev/null +++ b/src/devices/pic/xml_data/18F4480.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F44J10.xml b/src/devices/pic/xml_data/18F44J10.xml new file mode 100644 index 0000000..ddf2019 --- /dev/null +++ b/src/devices/pic/xml_data/18F44J10.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4510.xml b/src/devices/pic/xml_data/18F4510.xml new file mode 100644 index 0000000..b038b39 --- /dev/null +++ b/src/devices/pic/xml_data/18F4510.xml @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4515.xml b/src/devices/pic/xml_data/18F4515.xml new file mode 100644 index 0000000..4325432 --- /dev/null +++ b/src/devices/pic/xml_data/18F4515.xml @@ -0,0 +1,361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F452.xml b/src/devices/pic/xml_data/18F452.xml new file mode 100644 index 0000000..12ad5ce --- /dev/null +++ b/src/devices/pic/xml_data/18F452.xml @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4520.xml b/src/devices/pic/xml_data/18F4520.xml new file mode 100644 index 0000000..a1a1e75 --- /dev/null +++ b/src/devices/pic/xml_data/18F4520.xml @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4523.xml b/src/devices/pic/xml_data/18F4523.xml new file mode 100644 index 0000000..29b2583 --- /dev/null +++ b/src/devices/pic/xml_data/18F4523.xml @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4525.xml b/src/devices/pic/xml_data/18F4525.xml new file mode 100644 index 0000000..f37d90b --- /dev/null +++ b/src/devices/pic/xml_data/18F4525.xml @@ -0,0 +1,370 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4539.xml b/src/devices/pic/xml_data/18F4539.xml new file mode 100644 index 0000000..71a1f4c --- /dev/null +++ b/src/devices/pic/xml_data/18F4539.xml @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4550.xml b/src/devices/pic/xml_data/18F4550.xml new file mode 100644 index 0000000..b0e26c8 --- /dev/null +++ b/src/devices/pic/xml_data/18F4550.xml @@ -0,0 +1,402 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F458.xml b/src/devices/pic/xml_data/18F458.xml new file mode 100644 index 0000000..33069dd --- /dev/null +++ b/src/devices/pic/xml_data/18F458.xml @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4580.xml b/src/devices/pic/xml_data/18F4580.xml new file mode 100644 index 0000000..e6e105a --- /dev/null +++ b/src/devices/pic/xml_data/18F4580.xml @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4585.xml b/src/devices/pic/xml_data/18F4585.xml new file mode 100644 index 0000000..fb438b8 --- /dev/null +++ b/src/devices/pic/xml_data/18F4585.xml @@ -0,0 +1,372 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F45J10.xml b/src/devices/pic/xml_data/18F45J10.xml new file mode 100644 index 0000000..af2c752 --- /dev/null +++ b/src/devices/pic/xml_data/18F45J10.xml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4610.xml b/src/devices/pic/xml_data/18F4610.xml new file mode 100644 index 0000000..d105cdb --- /dev/null +++ b/src/devices/pic/xml_data/18F4610.xml @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4620.xml b/src/devices/pic/xml_data/18F4620.xml new file mode 100644 index 0000000..5964590 --- /dev/null +++ b/src/devices/pic/xml_data/18F4620.xml @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4680.xml b/src/devices/pic/xml_data/18F4680.xml new file mode 100644 index 0000000..f5ef137 --- /dev/null +++ b/src/devices/pic/xml_data/18F4680.xml @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4682.xml b/src/devices/pic/xml_data/18F4682.xml new file mode 100644 index 0000000..19b387b --- /dev/null +++ b/src/devices/pic/xml_data/18F4682.xml @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F4685.xml b/src/devices/pic/xml_data/18F4685.xml new file mode 100644 index 0000000..7b68ee2 --- /dev/null +++ b/src/devices/pic/xml_data/18F4685.xml @@ -0,0 +1,402 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6310.xml b/src/devices/pic/xml_data/18F6310.xml new file mode 100644 index 0000000..9bdbfb7 --- /dev/null +++ b/src/devices/pic/xml_data/18F6310.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6390.xml b/src/devices/pic/xml_data/18F6390.xml new file mode 100644 index 0000000..02f2498 --- /dev/null +++ b/src/devices/pic/xml_data/18F6390.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6393.xml b/src/devices/pic/xml_data/18F6393.xml new file mode 100644 index 0000000..bc778f4 --- /dev/null +++ b/src/devices/pic/xml_data/18F6393.xml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F63J11.xml b/src/devices/pic/xml_data/18F63J11.xml new file mode 100644 index 0000000..37273bc --- /dev/null +++ b/src/devices/pic/xml_data/18F63J11.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F63J90.xml b/src/devices/pic/xml_data/18F63J90.xml new file mode 100644 index 0000000..ef1310c --- /dev/null +++ b/src/devices/pic/xml_data/18F63J90.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6410.xml b/src/devices/pic/xml_data/18F6410.xml new file mode 100644 index 0000000..c270208 --- /dev/null +++ b/src/devices/pic/xml_data/18F6410.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6490.xml b/src/devices/pic/xml_data/18F6490.xml new file mode 100644 index 0000000..1727686 --- /dev/null +++ b/src/devices/pic/xml_data/18F6490.xml @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6493.xml b/src/devices/pic/xml_data/18F6493.xml new file mode 100644 index 0000000..89f409d --- /dev/null +++ b/src/devices/pic/xml_data/18F6493.xml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F64J11.xml b/src/devices/pic/xml_data/18F64J11.xml new file mode 100644 index 0000000..fd126a0 --- /dev/null +++ b/src/devices/pic/xml_data/18F64J11.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F64J90.xml b/src/devices/pic/xml_data/18F64J90.xml new file mode 100644 index 0000000..fedf592 --- /dev/null +++ b/src/devices/pic/xml_data/18F64J90.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6520.xml b/src/devices/pic/xml_data/18F6520.xml new file mode 100644 index 0000000..a022295 --- /dev/null +++ b/src/devices/pic/xml_data/18F6520.xml @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6525.xml b/src/devices/pic/xml_data/18F6525.xml new file mode 100644 index 0000000..953e12a --- /dev/null +++ b/src/devices/pic/xml_data/18F6525.xml @@ -0,0 +1,287 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6527.xml b/src/devices/pic/xml_data/18F6527.xml new file mode 100644 index 0000000..04a2bf1 --- /dev/null +++ b/src/devices/pic/xml_data/18F6527.xml @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6585.xml b/src/devices/pic/xml_data/18F6585.xml new file mode 100644 index 0000000..0bf9bab --- /dev/null +++ b/src/devices/pic/xml_data/18F6585.xml @@ -0,0 +1,350 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F65J10.xml b/src/devices/pic/xml_data/18F65J10.xml new file mode 100644 index 0000000..a67fe87 --- /dev/null +++ b/src/devices/pic/xml_data/18F65J10.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F65J11.xml b/src/devices/pic/xml_data/18F65J11.xml new file mode 100644 index 0000000..2ef5b3d --- /dev/null +++ b/src/devices/pic/xml_data/18F65J11.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F65J15.xml b/src/devices/pic/xml_data/18F65J15.xml new file mode 100644 index 0000000..f5f310a --- /dev/null +++ b/src/devices/pic/xml_data/18F65J15.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F65J50.xml b/src/devices/pic/xml_data/18F65J50.xml new file mode 100644 index 0000000..d0cdd2b --- /dev/null +++ b/src/devices/pic/xml_data/18F65J50.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F65J90.xml b/src/devices/pic/xml_data/18F65J90.xml new file mode 100644 index 0000000..91997da --- /dev/null +++ b/src/devices/pic/xml_data/18F65J90.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6620.xml b/src/devices/pic/xml_data/18F6620.xml new file mode 100644 index 0000000..e88ee06 --- /dev/null +++ b/src/devices/pic/xml_data/18F6620.xml @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6621.xml b/src/devices/pic/xml_data/18F6621.xml new file mode 100644 index 0000000..664de3f --- /dev/null +++ b/src/devices/pic/xml_data/18F6621.xml @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6622.xml b/src/devices/pic/xml_data/18F6622.xml new file mode 100644 index 0000000..6fb81d7 --- /dev/null +++ b/src/devices/pic/xml_data/18F6622.xml @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6627.xml b/src/devices/pic/xml_data/18F6627.xml new file mode 100644 index 0000000..74248c6 --- /dev/null +++ b/src/devices/pic/xml_data/18F6627.xml @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6680.xml b/src/devices/pic/xml_data/18F6680.xml new file mode 100644 index 0000000..d0a9922 --- /dev/null +++ b/src/devices/pic/xml_data/18F6680.xml @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F66J10.xml b/src/devices/pic/xml_data/18F66J10.xml new file mode 100644 index 0000000..7bb9aa7 --- /dev/null +++ b/src/devices/pic/xml_data/18F66J10.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F66J11.xml b/src/devices/pic/xml_data/18F66J11.xml new file mode 100644 index 0000000..8fd1314 --- /dev/null +++ b/src/devices/pic/xml_data/18F66J11.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F66J15.xml b/src/devices/pic/xml_data/18F66J15.xml new file mode 100644 index 0000000..c1c5c95 --- /dev/null +++ b/src/devices/pic/xml_data/18F66J15.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F66J16.xml b/src/devices/pic/xml_data/18F66J16.xml new file mode 100644 index 0000000..cf84f44 --- /dev/null +++ b/src/devices/pic/xml_data/18F66J16.xml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F66J50.xml b/src/devices/pic/xml_data/18F66J50.xml new file mode 100644 index 0000000..34dbe21 --- /dev/null +++ b/src/devices/pic/xml_data/18F66J50.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F66J55.xml b/src/devices/pic/xml_data/18F66J55.xml new file mode 100644 index 0000000..7e95978 --- /dev/null +++ b/src/devices/pic/xml_data/18F66J55.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F66J60.xml b/src/devices/pic/xml_data/18F66J60.xml new file mode 100644 index 0000000..e4ac5ea --- /dev/null +++ b/src/devices/pic/xml_data/18F66J60.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F66J65.xml b/src/devices/pic/xml_data/18F66J65.xml new file mode 100644 index 0000000..8431ec8 --- /dev/null +++ b/src/devices/pic/xml_data/18F66J65.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6720.xml b/src/devices/pic/xml_data/18F6720.xml new file mode 100644 index 0000000..c023b5e --- /dev/null +++ b/src/devices/pic/xml_data/18F6720.xml @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F6722.xml b/src/devices/pic/xml_data/18F6722.xml new file mode 100644 index 0000000..fb30985 --- /dev/null +++ b/src/devices/pic/xml_data/18F6722.xml @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F67J10.xml b/src/devices/pic/xml_data/18F67J10.xml new file mode 100644 index 0000000..78223c3 --- /dev/null +++ b/src/devices/pic/xml_data/18F67J10.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F67J11.xml b/src/devices/pic/xml_data/18F67J11.xml new file mode 100644 index 0000000..d13e7dc --- /dev/null +++ b/src/devices/pic/xml_data/18F67J11.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F67J50.xml b/src/devices/pic/xml_data/18F67J50.xml new file mode 100644 index 0000000..91eade3 --- /dev/null +++ b/src/devices/pic/xml_data/18F67J50.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F67J60.xml b/src/devices/pic/xml_data/18F67J60.xml new file mode 100644 index 0000000..29922db --- /dev/null +++ b/src/devices/pic/xml_data/18F67J60.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8310.xml b/src/devices/pic/xml_data/18F8310.xml new file mode 100644 index 0000000..1fe084d --- /dev/null +++ b/src/devices/pic/xml_data/18F8310.xml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8390.xml b/src/devices/pic/xml_data/18F8390.xml new file mode 100644 index 0000000..4dbff0c --- /dev/null +++ b/src/devices/pic/xml_data/18F8390.xml @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8393.xml b/src/devices/pic/xml_data/18F8393.xml new file mode 100644 index 0000000..ce846db --- /dev/null +++ b/src/devices/pic/xml_data/18F8393.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F83J11.xml b/src/devices/pic/xml_data/18F83J11.xml new file mode 100644 index 0000000..4a9d249 --- /dev/null +++ b/src/devices/pic/xml_data/18F83J11.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F83J90.xml b/src/devices/pic/xml_data/18F83J90.xml new file mode 100644 index 0000000..8e10c27 --- /dev/null +++ b/src/devices/pic/xml_data/18F83J90.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8410.xml b/src/devices/pic/xml_data/18F8410.xml new file mode 100644 index 0000000..b5c49cd --- /dev/null +++ b/src/devices/pic/xml_data/18F8410.xml @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8490.xml b/src/devices/pic/xml_data/18F8490.xml new file mode 100644 index 0000000..3871a60 --- /dev/null +++ b/src/devices/pic/xml_data/18F8490.xml @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8493.xml b/src/devices/pic/xml_data/18F8493.xml new file mode 100644 index 0000000..4e8bc52 --- /dev/null +++ b/src/devices/pic/xml_data/18F8493.xml @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F84J11.xml b/src/devices/pic/xml_data/18F84J11.xml new file mode 100644 index 0000000..9c69d2b --- /dev/null +++ b/src/devices/pic/xml_data/18F84J11.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F84J90.xml b/src/devices/pic/xml_data/18F84J90.xml new file mode 100644 index 0000000..59711f3 --- /dev/null +++ b/src/devices/pic/xml_data/18F84J90.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8520.xml b/src/devices/pic/xml_data/18F8520.xml new file mode 100644 index 0000000..6bc1aae --- /dev/null +++ b/src/devices/pic/xml_data/18F8520.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8525.xml b/src/devices/pic/xml_data/18F8525.xml new file mode 100644 index 0000000..e7b5219 --- /dev/null +++ b/src/devices/pic/xml_data/18F8525.xml @@ -0,0 +1,312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8527.xml b/src/devices/pic/xml_data/18F8527.xml new file mode 100644 index 0000000..62c01d4 --- /dev/null +++ b/src/devices/pic/xml_data/18F8527.xml @@ -0,0 +1,346 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8585.xml b/src/devices/pic/xml_data/18F8585.xml new file mode 100644 index 0000000..08367ab --- /dev/null +++ b/src/devices/pic/xml_data/18F8585.xml @@ -0,0 +1,312 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F85J10.xml b/src/devices/pic/xml_data/18F85J10.xml new file mode 100644 index 0000000..99b998c --- /dev/null +++ b/src/devices/pic/xml_data/18F85J10.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F85J11.xml b/src/devices/pic/xml_data/18F85J11.xml new file mode 100644 index 0000000..91b4cc2 --- /dev/null +++ b/src/devices/pic/xml_data/18F85J11.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F85J15.xml b/src/devices/pic/xml_data/18F85J15.xml new file mode 100644 index 0000000..c2445ab --- /dev/null +++ b/src/devices/pic/xml_data/18F85J15.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F85J50.xml b/src/devices/pic/xml_data/18F85J50.xml new file mode 100644 index 0000000..dee0637 --- /dev/null +++ b/src/devices/pic/xml_data/18F85J50.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F85J90.xml b/src/devices/pic/xml_data/18F85J90.xml new file mode 100644 index 0000000..61e7571 --- /dev/null +++ b/src/devices/pic/xml_data/18F85J90.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8620.xml b/src/devices/pic/xml_data/18F8620.xml new file mode 100644 index 0000000..8503556 --- /dev/null +++ b/src/devices/pic/xml_data/18F8620.xml @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8621.xml b/src/devices/pic/xml_data/18F8621.xml new file mode 100644 index 0000000..e5689ae --- /dev/null +++ b/src/devices/pic/xml_data/18F8621.xml @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8622.xml b/src/devices/pic/xml_data/18F8622.xml new file mode 100644 index 0000000..fe29be9 --- /dev/null +++ b/src/devices/pic/xml_data/18F8622.xml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8627.xml b/src/devices/pic/xml_data/18F8627.xml new file mode 100644 index 0000000..2b7f70b --- /dev/null +++ b/src/devices/pic/xml_data/18F8627.xml @@ -0,0 +1,376 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8680.xml b/src/devices/pic/xml_data/18F8680.xml new file mode 100644 index 0000000..97ec3c0 --- /dev/null +++ b/src/devices/pic/xml_data/18F8680.xml @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F86J10.xml b/src/devices/pic/xml_data/18F86J10.xml new file mode 100644 index 0000000..6cc1ec1 --- /dev/null +++ b/src/devices/pic/xml_data/18F86J10.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F86J11.xml b/src/devices/pic/xml_data/18F86J11.xml new file mode 100644 index 0000000..05e065e --- /dev/null +++ b/src/devices/pic/xml_data/18F86J11.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F86J15.xml b/src/devices/pic/xml_data/18F86J15.xml new file mode 100644 index 0000000..bcebf10 --- /dev/null +++ b/src/devices/pic/xml_data/18F86J15.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F86J16.xml b/src/devices/pic/xml_data/18F86J16.xml new file mode 100644 index 0000000..b06b858 --- /dev/null +++ b/src/devices/pic/xml_data/18F86J16.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F86J50.xml b/src/devices/pic/xml_data/18F86J50.xml new file mode 100644 index 0000000..fa67e08 --- /dev/null +++ b/src/devices/pic/xml_data/18F86J50.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F86J55.xml b/src/devices/pic/xml_data/18F86J55.xml new file mode 100644 index 0000000..9b29823 --- /dev/null +++ b/src/devices/pic/xml_data/18F86J55.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F86J60.xml b/src/devices/pic/xml_data/18F86J60.xml new file mode 100644 index 0000000..42f3d20 --- /dev/null +++ b/src/devices/pic/xml_data/18F86J60.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F86J65.xml b/src/devices/pic/xml_data/18F86J65.xml new file mode 100644 index 0000000..c2cdf41 --- /dev/null +++ b/src/devices/pic/xml_data/18F86J65.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8720.xml b/src/devices/pic/xml_data/18F8720.xml new file mode 100644 index 0000000..f634b25 --- /dev/null +++ b/src/devices/pic/xml_data/18F8720.xml @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F8722.xml b/src/devices/pic/xml_data/18F8722.xml new file mode 100644 index 0000000..3db0bbd --- /dev/null +++ b/src/devices/pic/xml_data/18F8722.xml @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F87J10.xml b/src/devices/pic/xml_data/18F87J10.xml new file mode 100644 index 0000000..bc21af2 --- /dev/null +++ b/src/devices/pic/xml_data/18F87J10.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F87J11.xml b/src/devices/pic/xml_data/18F87J11.xml new file mode 100644 index 0000000..d3c84fb --- /dev/null +++ b/src/devices/pic/xml_data/18F87J11.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F87J50.xml b/src/devices/pic/xml_data/18F87J50.xml new file mode 100644 index 0000000..1749435 --- /dev/null +++ b/src/devices/pic/xml_data/18F87J50.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F87J60.xml b/src/devices/pic/xml_data/18F87J60.xml new file mode 100644 index 0000000..d101ed3 --- /dev/null +++ b/src/devices/pic/xml_data/18F87J60.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F96J60.xml b/src/devices/pic/xml_data/18F96J60.xml new file mode 100644 index 0000000..655b586 --- /dev/null +++ b/src/devices/pic/xml_data/18F96J60.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F96J65.xml b/src/devices/pic/xml_data/18F96J65.xml new file mode 100644 index 0000000..a61bb94 --- /dev/null +++ b/src/devices/pic/xml_data/18F96J65.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/18F97J60.xml b/src/devices/pic/xml_data/18F97J60.xml new file mode 100644 index 0000000..ce570ba --- /dev/null +++ b/src/devices/pic/xml_data/18F97J60.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24FJ128GA006.xml b/src/devices/pic/xml_data/24FJ128GA006.xml new file mode 100644 index 0000000..7f264b9 --- /dev/null +++ b/src/devices/pic/xml_data/24FJ128GA006.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24FJ128GA008.xml b/src/devices/pic/xml_data/24FJ128GA008.xml new file mode 100644 index 0000000..b8d43d8 --- /dev/null +++ b/src/devices/pic/xml_data/24FJ128GA008.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24FJ128GA010.xml b/src/devices/pic/xml_data/24FJ128GA010.xml new file mode 100644 index 0000000..d57c7ff --- /dev/null +++ b/src/devices/pic/xml_data/24FJ128GA010.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24FJ64GA002.xml b/src/devices/pic/xml_data/24FJ64GA002.xml new file mode 100644 index 0000000..e051b07 --- /dev/null +++ b/src/devices/pic/xml_data/24FJ64GA002.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24FJ64GA004.xml b/src/devices/pic/xml_data/24FJ64GA004.xml new file mode 100644 index 0000000..c87748e --- /dev/null +++ b/src/devices/pic/xml_data/24FJ64GA004.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24FJ64GA006.xml b/src/devices/pic/xml_data/24FJ64GA006.xml new file mode 100644 index 0000000..6492f51 --- /dev/null +++ b/src/devices/pic/xml_data/24FJ64GA006.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24FJ64GA008.xml b/src/devices/pic/xml_data/24FJ64GA008.xml new file mode 100644 index 0000000..2ead302 --- /dev/null +++ b/src/devices/pic/xml_data/24FJ64GA008.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24FJ64GA010.xml b/src/devices/pic/xml_data/24FJ64GA010.xml new file mode 100644 index 0000000..627da04 --- /dev/null +++ b/src/devices/pic/xml_data/24FJ64GA010.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24FJ96GA006.xml b/src/devices/pic/xml_data/24FJ96GA006.xml new file mode 100644 index 0000000..9f02be4 --- /dev/null +++ b/src/devices/pic/xml_data/24FJ96GA006.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24FJ96GA008.xml b/src/devices/pic/xml_data/24FJ96GA008.xml new file mode 100644 index 0000000..eeba6d2 --- /dev/null +++ b/src/devices/pic/xml_data/24FJ96GA008.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24FJ96GA010.xml b/src/devices/pic/xml_data/24FJ96GA010.xml new file mode 100644 index 0000000..700d288 --- /dev/null +++ b/src/devices/pic/xml_data/24FJ96GA010.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ128GP206.xml b/src/devices/pic/xml_data/24HJ128GP206.xml new file mode 100644 index 0000000..c065e99 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ128GP206.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ128GP210.xml b/src/devices/pic/xml_data/24HJ128GP210.xml new file mode 100644 index 0000000..b0922d0 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ128GP210.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ128GP306.xml b/src/devices/pic/xml_data/24HJ128GP306.xml new file mode 100644 index 0000000..97f23e1 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ128GP306.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ128GP310.xml b/src/devices/pic/xml_data/24HJ128GP310.xml new file mode 100644 index 0000000..a600601 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ128GP310.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ128GP506.xml b/src/devices/pic/xml_data/24HJ128GP506.xml new file mode 100644 index 0000000..ae2fd06 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ128GP506.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ128GP510.xml b/src/devices/pic/xml_data/24HJ128GP510.xml new file mode 100644 index 0000000..7195e60 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ128GP510.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ12GP201.xml b/src/devices/pic/xml_data/24HJ12GP201.xml new file mode 100644 index 0000000..b0c3357 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ12GP201.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ12GP202.xml b/src/devices/pic/xml_data/24HJ12GP202.xml new file mode 100644 index 0000000..60fdce8 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ12GP202.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ16GP304.xml b/src/devices/pic/xml_data/24HJ16GP304.xml new file mode 100644 index 0000000..f4d50d8 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ16GP304.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ256GP206.xml b/src/devices/pic/xml_data/24HJ256GP206.xml new file mode 100644 index 0000000..d977b29 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ256GP206.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ256GP210.xml b/src/devices/pic/xml_data/24HJ256GP210.xml new file mode 100644 index 0000000..000bc00 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ256GP210.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ256GP610.xml b/src/devices/pic/xml_data/24HJ256GP610.xml new file mode 100644 index 0000000..4c1e714 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ256GP610.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ32GP202.xml b/src/devices/pic/xml_data/24HJ32GP202.xml new file mode 100644 index 0000000..d93607a --- /dev/null +++ b/src/devices/pic/xml_data/24HJ32GP202.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ32GP204.xml b/src/devices/pic/xml_data/24HJ32GP204.xml new file mode 100644 index 0000000..5a9e126 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ32GP204.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ64GP206.xml b/src/devices/pic/xml_data/24HJ64GP206.xml new file mode 100644 index 0000000..a3266fa --- /dev/null +++ b/src/devices/pic/xml_data/24HJ64GP206.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ64GP210.xml b/src/devices/pic/xml_data/24HJ64GP210.xml new file mode 100644 index 0000000..630a12a --- /dev/null +++ b/src/devices/pic/xml_data/24HJ64GP210.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ64GP506.xml b/src/devices/pic/xml_data/24HJ64GP506.xml new file mode 100644 index 0000000..372c767 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ64GP506.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/24HJ64GP510.xml b/src/devices/pic/xml_data/24HJ64GP510.xml new file mode 100644 index 0000000..8711793 --- /dev/null +++ b/src/devices/pic/xml_data/24HJ64GP510.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F1010.xml b/src/devices/pic/xml_data/30F1010.xml new file mode 100644 index 0000000..1d59008 --- /dev/null +++ b/src/devices/pic/xml_data/30F1010.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F2010.xml b/src/devices/pic/xml_data/30F2010.xml new file mode 100644 index 0000000..f252785 --- /dev/null +++ b/src/devices/pic/xml_data/30F2010.xml @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F2011.xml b/src/devices/pic/xml_data/30F2011.xml new file mode 100644 index 0000000..a767855 --- /dev/null +++ b/src/devices/pic/xml_data/30F2011.xml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F2012.xml b/src/devices/pic/xml_data/30F2012.xml new file mode 100644 index 0000000..6da9eb7 --- /dev/null +++ b/src/devices/pic/xml_data/30F2012.xml @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F2020.xml b/src/devices/pic/xml_data/30F2020.xml new file mode 100644 index 0000000..3aa30e9 --- /dev/null +++ b/src/devices/pic/xml_data/30F2020.xml @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F2023.xml b/src/devices/pic/xml_data/30F2023.xml new file mode 100644 index 0000000..8241600 --- /dev/null +++ b/src/devices/pic/xml_data/30F2023.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F3010.xml b/src/devices/pic/xml_data/30F3010.xml new file mode 100644 index 0000000..1041c86 --- /dev/null +++ b/src/devices/pic/xml_data/30F3010.xml @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F3011.xml b/src/devices/pic/xml_data/30F3011.xml new file mode 100644 index 0000000..b092d8b --- /dev/null +++ b/src/devices/pic/xml_data/30F3011.xml @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F3012.xml b/src/devices/pic/xml_data/30F3012.xml new file mode 100644 index 0000000..b87d96a --- /dev/null +++ b/src/devices/pic/xml_data/30F3012.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F3013.xml b/src/devices/pic/xml_data/30F3013.xml new file mode 100644 index 0000000..702e415 --- /dev/null +++ b/src/devices/pic/xml_data/30F3013.xml @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F3014.xml b/src/devices/pic/xml_data/30F3014.xml new file mode 100644 index 0000000..13bd387 --- /dev/null +++ b/src/devices/pic/xml_data/30F3014.xml @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F4011.xml b/src/devices/pic/xml_data/30F4011.xml new file mode 100644 index 0000000..89791c2 --- /dev/null +++ b/src/devices/pic/xml_data/30F4011.xml @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F4012.xml b/src/devices/pic/xml_data/30F4012.xml new file mode 100644 index 0000000..e42b34c --- /dev/null +++ b/src/devices/pic/xml_data/30F4012.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F4013.xml b/src/devices/pic/xml_data/30F4013.xml new file mode 100644 index 0000000..1732e6e --- /dev/null +++ b/src/devices/pic/xml_data/30F4013.xml @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F5011.xml b/src/devices/pic/xml_data/30F5011.xml new file mode 100644 index 0000000..a1f311d --- /dev/null +++ b/src/devices/pic/xml_data/30F5011.xml @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F5013.xml b/src/devices/pic/xml_data/30F5013.xml new file mode 100644 index 0000000..debd97f --- /dev/null +++ b/src/devices/pic/xml_data/30F5013.xml @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F5015.xml b/src/devices/pic/xml_data/30F5015.xml new file mode 100644 index 0000000..af7c20a --- /dev/null +++ b/src/devices/pic/xml_data/30F5015.xml @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F5016.xml b/src/devices/pic/xml_data/30F5016.xml new file mode 100644 index 0000000..aa2e7e1 --- /dev/null +++ b/src/devices/pic/xml_data/30F5016.xml @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F6010.xml b/src/devices/pic/xml_data/30F6010.xml new file mode 100644 index 0000000..8b26c7c --- /dev/null +++ b/src/devices/pic/xml_data/30F6010.xml @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F6010A.xml b/src/devices/pic/xml_data/30F6010A.xml new file mode 100644 index 0000000..2f5e976 --- /dev/null +++ b/src/devices/pic/xml_data/30F6010A.xml @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F6011.xml b/src/devices/pic/xml_data/30F6011.xml new file mode 100644 index 0000000..60e6f5f --- /dev/null +++ b/src/devices/pic/xml_data/30F6011.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F6011A.xml b/src/devices/pic/xml_data/30F6011A.xml new file mode 100644 index 0000000..bb499b1 --- /dev/null +++ b/src/devices/pic/xml_data/30F6011A.xml @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F6012.xml b/src/devices/pic/xml_data/30F6012.xml new file mode 100644 index 0000000..e7c1797 --- /dev/null +++ b/src/devices/pic/xml_data/30F6012.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F6012A.xml b/src/devices/pic/xml_data/30F6012A.xml new file mode 100644 index 0000000..6dd84fb --- /dev/null +++ b/src/devices/pic/xml_data/30F6012A.xml @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F6013.xml b/src/devices/pic/xml_data/30F6013.xml new file mode 100644 index 0000000..34b66cf --- /dev/null +++ b/src/devices/pic/xml_data/30F6013.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F6013A.xml b/src/devices/pic/xml_data/30F6013A.xml new file mode 100644 index 0000000..e0a5758 --- /dev/null +++ b/src/devices/pic/xml_data/30F6013A.xml @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F6014.xml b/src/devices/pic/xml_data/30F6014.xml new file mode 100644 index 0000000..8cf7766 --- /dev/null +++ b/src/devices/pic/xml_data/30F6014.xml @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F6014A.xml b/src/devices/pic/xml_data/30F6014A.xml new file mode 100644 index 0000000..c6a6efe --- /dev/null +++ b/src/devices/pic/xml_data/30F6014A.xml @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/30F6015.xml b/src/devices/pic/xml_data/30F6015.xml new file mode 100644 index 0000000..784f38d --- /dev/null +++ b/src/devices/pic/xml_data/30F6015.xml @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/Makefile.am b/src/devices/pic/xml_data/Makefile.am new file mode 100644 index 0000000..43b13d4 --- /dev/null +++ b/src/devices/pic/xml_data/Makefile.am @@ -0,0 +1,12 @@ +INCLUDES = -I$(top_srcdir)/src $(all_includes) +METASOURCES = AUTO + +noinst_LTLIBRARIES = libpicxml.la +libpicxml_la_SOURCES = pic_data.cpp +libpicxml_la_DEPENDENCIES = pic_data.cpp + +include deps.mak +noinst_DATA += registers/registers.xml registers/registers_missing.xml +pic_data.cpp: ../xml/pic_xml_to_data $(noinst_DATA) + ../xml/pic_xml_to_data +CLEANFILES = pic_data.cpp diff --git a/src/devices/pic/xml_data/deps.mak b/src/devices/pic/xml_data/deps.mak new file mode 100644 index 0000000..ac8dcee --- /dev/null +++ b/src/devices/pic/xml_data/deps.mak @@ -0,0 +1,43 @@ +noinst_DATA = \ + 10F200.xml 10F202.xml 10F204.xml 10F206.xml 10F220.xml 10F222.xml 12C508.xml 12C508A.xml 12C509.xml 12C509A.xml\ + 12C671.xml 12C672.xml 12CE518.xml 12CE519.xml 12CE673.xml 12CE674.xml 12CR509A.xml 12F508.xml 12F509.xml 12F510.xml\ + 12F519.xml 12F609.xml 12F615.xml 12F629.xml 12F635.xml 12F675.xml 12F683.xml 14000.xml 16C432.xml 16C433.xml\ + 16C505.xml 16C52.xml 16C54.xml 16C54A.xml 16C54B.xml 16C54C.xml 16C55.xml 16C554.xml 16C557.xml 16C558.xml\ + 16C55A.xml 16C56.xml 16C56A.xml 16C57.xml 16C57C.xml 16C58A.xml 16C58B.xml 16C61.xml 16C62.xml 16C620.xml\ + 16C620A.xml 16C621.xml 16C621A.xml 16C622.xml 16C622A.xml 16C62A.xml 16C62B.xml 16C63.xml 16C63A.xml 16C64.xml\ + 16C641.xml 16C642.xml 16C64A.xml 16C65.xml 16C65A.xml 16C65B.xml 16C66.xml 16C661.xml 16C662.xml 16C67.xml\ + 16C71.xml 16C710.xml 16C711.xml 16C712.xml 16C715.xml 16C716.xml 16C717.xml 16C72.xml 16C72A.xml 16C73.xml\ + 16C73A.xml 16C73B.xml 16C74.xml 16C745.xml 16C74A.xml 16C74B.xml 16C76.xml 16C765.xml 16C77.xml 16C770.xml\ + 16C771.xml 16C773.xml 16C774.xml 16C781.xml 16C782.xml 16C84.xml 16C923.xml 16C924.xml 16C925.xml 16C926.xml\ + 16CE623.xml 16CE624.xml 16CE625.xml 16CR54A.xml 16CR54B.xml 16CR54C.xml 16CR56A.xml 16CR57B.xml 16CR57C.xml 16CR58A.xml\ + 16CR58B.xml 16CR62.xml 16CR620A.xml 16CR63.xml 16CR64.xml 16CR65.xml 16CR72.xml 16CR73.xml 16CR74.xml 16CR76.xml\ + 16CR77.xml 16CR83.xml 16CR84.xml 16F505.xml 16F506.xml 16F54.xml 16F57.xml 16F59.xml 16F610.xml 16F616.xml\ + 16F627.xml 16F627A.xml 16F628.xml 16F628A.xml 16F630.xml 16F631.xml 16F636.xml 16F639.xml 16F648A.xml 16F676.xml\ + 16F677.xml 16F684.xml 16F685.xml 16F687.xml 16F688.xml 16F689.xml 16F690.xml 16F716.xml 16F72.xml 16F73.xml\ + 16F737.xml 16F74.xml 16F747.xml 16F76.xml 16F767.xml 16F77.xml 16F777.xml 16F785.xml 16F818.xml 16F819.xml\ + 16F83.xml 16F84.xml 16F84A.xml 16F87.xml 16F870.xml 16F871.xml 16F872.xml 16F873.xml 16F873A.xml 16F874.xml\ + 16F874A.xml 16F876.xml 16F876A.xml 16F877.xml 16F877A.xml 16F88.xml 16F882.xml 16F883.xml 16F884.xml 16F886.xml\ + 16F887.xml 16F913.xml 16F914.xml 16F916.xml 16F917.xml 16F946.xml 16HV540.xml 17C42.xml 17C42A.xml 17C43.xml\ + 17C44.xml 17C752.xml 17C756.xml 17C756A.xml 17C762.xml 17C766.xml 17CR42.xml 17CR43.xml 18C242.xml 18C252.xml\ + 18C442.xml 18C452.xml 18C601.xml 18C658.xml 18C801.xml 18C858.xml 18F1220.xml 18F1230.xml 18F1320.xml 18F1330.xml\ + 18F2220.xml 18F2221.xml 18F2320.xml 18F2321.xml 18F2331.xml 18F2410.xml 18F242.xml 18F2420.xml 18F2423.xml 18F2431.xml\ + 18F2439.xml 18F2450.xml 18F2455.xml 18F248.xml 18F2480.xml 18F24J10.xml 18F2510.xml 18F2515.xml 18F252.xml 18F2520.xml\ + 18F2523.xml 18F2525.xml 18F2539.xml 18F2550.xml 18F258.xml 18F2580.xml 18F2585.xml 18F25J10.xml 18F2610.xml 18F2620.xml\ + 18F2680.xml 18F2682.xml 18F2685.xml 18F4220.xml 18F4221.xml 18F4320.xml 18F4321.xml 18F4331.xml 18F4410.xml 18F442.xml\ + 18F4420.xml 18F4423.xml 18F4431.xml 18F4439.xml 18F4450.xml 18F4455.xml 18F448.xml 18F4480.xml 18F44J10.xml 18F4510.xml\ + 18F4515.xml 18F452.xml 18F4520.xml 18F4523.xml 18F4525.xml 18F4539.xml 18F4550.xml 18F458.xml 18F4580.xml 18F4585.xml\ + 18F45J10.xml 18F4610.xml 18F4620.xml 18F4680.xml 18F4682.xml 18F4685.xml 18F6310.xml 18F6390.xml 18F6393.xml 18F63J11.xml\ + 18F63J90.xml 18F6410.xml 18F6490.xml 18F6493.xml 18F64J11.xml 18F64J90.xml 18F6520.xml 18F6525.xml 18F6527.xml 18F6585.xml\ + 18F65J10.xml 18F65J11.xml 18F65J15.xml 18F65J50.xml 18F65J90.xml 18F6620.xml 18F6621.xml 18F6622.xml 18F6627.xml 18F6680.xml\ + 18F66J10.xml 18F66J11.xml 18F66J15.xml 18F66J16.xml 18F66J50.xml 18F66J55.xml 18F66J60.xml 18F66J65.xml 18F6720.xml 18F6722.xml\ + 18F67J10.xml 18F67J11.xml 18F67J50.xml 18F67J60.xml 18F8310.xml 18F8390.xml 18F8393.xml 18F83J11.xml 18F83J90.xml 18F8410.xml\ + 18F8490.xml 18F8493.xml 18F84J11.xml 18F84J90.xml 18F8520.xml 18F8525.xml 18F8527.xml 18F8585.xml 18F85J10.xml 18F85J11.xml\ + 18F85J15.xml 18F85J50.xml 18F85J90.xml 18F8620.xml 18F8621.xml 18F8622.xml 18F8627.xml 18F8680.xml 18F86J10.xml 18F86J11.xml\ + 18F86J15.xml 18F86J16.xml 18F86J50.xml 18F86J55.xml 18F86J60.xml 18F86J65.xml 18F8720.xml 18F8722.xml 18F87J10.xml 18F87J11.xml\ + 18F87J50.xml 18F87J60.xml 18F96J60.xml 18F96J65.xml 18F97J60.xml 24FJ128GA006.xml 24FJ128GA008.xml 24FJ128GA010.xml 24FJ64GA002.xml 24FJ64GA004.xml\ + 24FJ64GA006.xml 24FJ64GA008.xml 24FJ64GA010.xml 24FJ96GA006.xml 24FJ96GA008.xml 24FJ96GA010.xml 24HJ128GP206.xml 24HJ128GP210.xml 24HJ128GP306.xml 24HJ128GP310.xml\ + 24HJ128GP506.xml 24HJ128GP510.xml 24HJ12GP201.xml 24HJ12GP202.xml 24HJ16GP304.xml 24HJ256GP206.xml 24HJ256GP210.xml 24HJ256GP610.xml 24HJ32GP202.xml 24HJ32GP204.xml\ + 24HJ64GP206.xml 24HJ64GP210.xml 24HJ64GP506.xml 24HJ64GP510.xml 30F1010.xml 30F2010.xml 30F2011.xml 30F2012.xml 30F2020.xml 30F2023.xml\ + 30F3010.xml 30F3011.xml 30F3012.xml 30F3013.xml 30F3014.xml 30F4011.xml 30F4012.xml 30F4013.xml 30F5011.xml 30F5013.xml\ + 30F5015.xml 30F5016.xml 30F6010.xml 30F6010A.xml 30F6011.xml 30F6011A.xml 30F6012.xml 30F6012A.xml 30F6013.xml 30F6013A.xml\ + 30F6014.xml 30F6014A.xml 30F6015.xml diff --git a/src/devices/pic/xml_data/pic.xsd b/src/devices/pic/xml_data/pic.xsd new file mode 100644 index 0000000..f358f68 --- /dev/null +++ b/src/devices/pic/xml_data/pic.xsd @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/devices/pic/xml_data/registers/registers.xml b/src/devices/pic/xml_data/registers/registers.xml new file mode 100644 index 0000000..d7c0884 --- /dev/null +++ b/src/devices/pic/xml_data/registers/registers.xml @@ -0,0 +1,57694 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/registers/registers_missing.xml b/src/devices/pic/xml_data/registers/registers_missing.xml new file mode 100644 index 0000000..b6e3173 --- /dev/null +++ b/src/devices/pic/xml_data/registers/registers_missing.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/devices/pic/xml_data/validate.sh b/src/devices/pic/xml_data/validate.sh new file mode 100755 index 0000000..20dbe5e --- /dev/null +++ b/src/devices/pic/xml_data/validate.sh @@ -0,0 +1,5 @@ +cd validate +make +cd .. +validate/validate $1 + diff --git a/src/devices/pic/xml_data/validate/Makefile b/src/devices/pic/xml_data/validate/Makefile new file mode 100644 index 0000000..d235259 --- /dev/null +++ b/src/devices/pic/xml_data/validate/Makefile @@ -0,0 +1,4 @@ +all: validate + +validate: validate.cpp + g++ -o validate -lxerces-c validate.cpp diff --git a/src/devices/pic/xml_data/validate/validate.cpp b/src/devices/pic/xml_data/validate/validate.cpp new file mode 100644 index 0000000..7e733b0 --- /dev/null +++ b/src/devices/pic/xml_data/validate/validate.cpp @@ -0,0 +1,72 @@ +// Necessary includes. We refer to these as "common includes" +// in the following examples. +#include +#include +#include + +// Handy definitions of constants. +#include + +#include + +using namespace std; +XERCES_CPP_NAMESPACE_USE + +class Handler : public DefaultHandler +{ +public: + virtual void error (const SAXParseException &exc) { + char* message = XMLString::transcode(exc.getMessage()); + cout << "Exception: " << message << "\n"; + XMLString::release(&message); + } + virtual void fatalError (const SAXParseException &exc) { + char* message = XMLString::transcode(exc.getMessage()); + cout << "Exception: " << message << "\n"; + XMLString::release(&message); + } +}; + +int main(int argc, char* argv[]) +{ +XMLPlatformUtils::Initialize(); + +// Create a SAX2 parser object. +SAX2XMLReader* parser = XMLReaderFactory::createXMLReader(); + +// Set the appropriate features on the parser. +// Enable namespaces, schema validation, and the checking +// of all Schema constraints. +// We refer to these as "common features" in following examples. +parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); +parser->setFeature(XMLUni::fgSAX2CoreValidation, true); +parser->setFeature(XMLUni::fgXercesDynamic, false); +parser->setFeature(XMLUni::fgXercesSchema, true); +parser->setFeature(XMLUni::fgXercesSchemaFullChecking, true); +//parser->setProperty(XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation, (void *)"pic.xsd"); + +// Set appropriate ContentHandler, ErrorHandler, and EntityResolver. +// These will be referred to as "common handlers" in subsequent examples. + +// You will use a default handler provided by Xerces-C++ (no op action). +// Users should write their own handlers and install them. +Handler handler; +parser->setContentHandler(&handler); + +// The object parser calls when it detects violations of the schema. +parser->setErrorHandler(&handler); + +// The object parser calls to find the schema and +// resolve schema imports/includes. +parser->setEntityResolver(&handler); + +// Parse the XML document. +// Document content sent to registered ContentHandler instance. +if ( argc==1 ) { printf("Needs one argument\n"); return -1; } +parser->parse(argv[1]); + +// Delete the parser instance. +delete parser; + +return 0; +} diff --git a/src/devices/pic/xml_data/xml_data.pro b/src/devices/pic/xml_data/xml_data.pro new file mode 100644 index 0000000..086bf53 --- /dev/null +++ b/src/devices/pic/xml_data/xml_data.pro @@ -0,0 +1,5 @@ +STOPDIR = ../../../.. +include($${STOPDIR}/lib.pro) + +TARGET = picxml +SOURCES += pic_data.cpp -- cgit v1.2.3