├── LICENSE ├── README.md ├── prog72.py ├── schematic.png ├── test.hex └── test_big.hex /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 SyedTahmidMahbub 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # q-dpico_picprog72 2 | Quick and dirty PIC16F72 programmer using the Raspberry Pi Pico and MicroPython 3 | 4 | Details: https://tahmidmc.blogspot.com/2024/01/quick-and-dirty-pic16f72-programmer.html 5 | -------------------------------------------------------------------------------- /prog72.py: -------------------------------------------------------------------------------- 1 | from machine import Pin, PWM, ADC 2 | from time import sleep, sleep_ms, sleep_us, ticks_ms 3 | 4 | 5 | ############################## 6 | HEX_FILE = "test.hex" # name of hex file in filesystem 7 | CODE_START_ADDR = 0 # code region goes from 0x000 to 0x7ff 8 | CODE_END_ADDR = 0x7ff # code region goes from 0x000 to 0x7ff 9 | CONFIG_START_ADDR = 0x2000 # config region goes from 0x2000 to 0x2007 10 | CONFIG_END_ADDR = 0x2007 # config region goes from 0x2000 to 0x2007 11 | DEVID_PIC16F72 = 5 # device ID for PIC16F72 12 | 13 | PWM_PIN = 22 # PWM for boost converter for VPP 14 | FB_PIN = 28 # Feedback for boost output voltage 15 | PGD_PIN = 10 # Programming pin: PGD 16 | PGC_PIN = 11 # Programming pin: PGC 17 | VPP_PIN = 12 # Programming pin enable: VPP 18 | 19 | PWM_FREQ = 50000 # Boost converter frequency 20 | INITIAL_DUTY = int(0.5 * 65536) 21 | DUTY_STEP = 50 22 | LOOP_TIME_MS = 10 # Boost regulation loop interval 23 | BOOST_TARGET_V = 13.2 # VPP target voltage 24 | DUTY_MAX = int(0.65 * 65536) # Duty cycle bound 25 | DUTY_MIN = int(0.25 * 65536) # Duty cycle bound 26 | ADC_SF = 12.94/1.414 # Voltage divider 27 | 28 | # ICSP commands: 29 | # http://ww1.microchip.com/downloads/en/devicedoc/39588a.pdf 30 | CMD_LOAD_CONFIG = 0 31 | CMD_LOAD_DATA = 2 32 | CMD_READ_DATA = 4 33 | CMD_INC_ADDR = 6 34 | CMD_BEGIN_PROG = 8 35 | CMD_BULK_ERASE = 9 36 | CMD_END_PROG = 14 37 | ############################## 38 | 39 | PGD = Pin(PGD_PIN, Pin.OUT) 40 | PGC = Pin(PGC_PIN, Pin.OUT) 41 | VPP = Pin(VPP_PIN, Pin.OUT) 42 | 43 | # 100ns required 44 | # 13 cycles @ 125MHz = 104ns 45 | @micropython.asm_thumb 46 | def tsethold(): 47 | nop() 48 | nop() 49 | nop() 50 | nop() 51 | nop() 52 | nop() 53 | nop() 54 | nop() 55 | nop() 56 | nop() 57 | nop() 58 | nop() 59 | nop() 60 | 61 | 62 | def enter_prog(): 63 | PGD.value(0) 64 | PGC.value(0) 65 | VPP.value(0) 66 | sleep_ms(100) 67 | VPP.value(1) 68 | sleep_ms(10) 69 | 70 | 71 | def command(x): 72 | # Send 6 bit command, LSB first: 73 | # Target latches bit at falling edge of PGC 74 | x = x & 0x3f 75 | for _ in range(6): 76 | b = x & 1 77 | x = x >> 1 78 | 79 | # Shift out b: 80 | PGC.value(1) 81 | PGD.value(b) 82 | # tset1: 83 | tsethold() 84 | PGC.value(0) 85 | # thold1: 86 | tsethold() 87 | 88 | # tdly1: 89 | sleep_us(1) 90 | 91 | 92 | def write_data(x): 93 | # Write 16 bits of data, LSB first: 94 | # This is 0, then 14 bits of data, then 0 95 | # Target latches bit at falling edge of PGC 96 | x = (x & 0x3fff) << 1 97 | for i in range(16): 98 | b = x & 1 99 | x = x >> 1 100 | 101 | # Shift out b: 102 | PGC.value(1) 103 | PGD.value(b) 104 | # tset1: 105 | tsethold() 106 | PGC.value(0) 107 | # thold1: 108 | tsethold() 109 | 110 | 111 | def read_data(): 112 | # Read 16 bits of data, LSB first: 113 | # This is 0, then 14 bits of data, then 0 114 | # Target sets bit at rising edge of PGC 115 | x = 0 116 | PGD.init(PGD.IN, Pin.PULL_DOWN) 117 | for _ in range(16): 118 | PGC.value(1) 119 | # tset1: 120 | tsethold() 121 | PGC.value(0) 122 | b = PGD.value() 123 | # thold1: 124 | tsethold() 125 | 126 | # Shift in b: 127 | x = x >> 1 | (b << 15) 128 | PGD.init(PGD.OUT) 129 | return x >> 1 130 | ############################## 131 | # Run boost converter to get VPP voltage: 132 | def boostVPP(pwm_dout, vboost_ch, timeout_ms): 133 | adc_vout = ADC(vboost_ch) 134 | pwm_dout.freq(PWM_FREQ) 135 | duty16 = INITIAL_DUTY 136 | pwm_dout.duty_u16(duty16) 137 | 138 | boost_volts = 0 139 | t0 = ticks_ms() 140 | while ticks_ms() - t0 < timeout_ms: 141 | adc_reading = 0 142 | N = 32 143 | for _ in range(N): 144 | adc_reading += (adc_vout.read_u16() >> 8) 145 | adc_reading /= N 146 | 147 | # averaged now 148 | adc_volts = adc_reading * 3.3 / 256.0 149 | boost_volts = adc_volts * ADC_SF 150 | 151 | if abs(boost_volts - BOOST_TARGET_V) < 0.02: 152 | break 153 | if boost_volts < BOOST_TARGET_V: 154 | duty16 += DUTY_STEP 155 | if duty16 > DUTY_MAX: 156 | duty16 = DUTY_MAX 157 | else: 158 | duty16 -= DUTY_STEP 159 | if duty16 < DUTY_MIN: 160 | duty16 = DUTY_MIN 161 | 162 | pwm22.duty_u16(duty16) 163 | sleep_ms(LOOP_TIME_MS) 164 | return boost_volts 165 | 166 | 167 | def find_target(): 168 | # Try to read the device ID: 169 | enter_prog() 170 | command(CMD_LOAD_CONFIG) # PC: 0x2000 171 | write_data(0) # required dummy write 172 | 173 | command(CMD_INC_ADDR) # PC: 0x2001 174 | command(CMD_INC_ADDR) # PC: 0x2002 175 | command(CMD_INC_ADDR) # PC: 0x2003 176 | command(CMD_INC_ADDR) # PC: 0x2004 177 | command(CMD_INC_ADDR) # PC: 0x2005 178 | command(CMD_INC_ADDR) # PC: 0x2006 179 | command(CMD_READ_DATA) 180 | id = read_data() 181 | devid = id >> 5 182 | devrev = id & 0x1f 183 | return (devid, devrev) 184 | 185 | def bulk_erase(): 186 | enter_prog() # Reset PC 187 | command(CMD_BULK_ERASE) 188 | sleep_ms(30) 189 | 190 | def blank_check(): 191 | enter_prog() # Reset PC 192 | for addr in range(CODE_START_ADDR, CODE_END_ADDR+1): 193 | command(CMD_READ_DATA) 194 | d = read_data() 195 | if d != 0x3fff: 196 | print(f"{d:04x} @ {addr:04x}") 197 | return False 198 | command(CMD_INC_ADDR) 199 | return True 200 | 201 | def program(): 202 | enter_prog() # Reset PC 203 | current_word_addr = CODE_START_ADDR 204 | current_config_addr = 0 205 | with open(HEX_FILE) as f: 206 | line = f.readline() # Read in hex file line by line 207 | while line: 208 | line = line.strip() 209 | startchar = line[0] 210 | if startchar != start_code: 211 | return False 212 | # raise Exception("Start code is not valid!") 213 | 214 | num_bytes = int(line[1:3], 16) 215 | num_words = int(num_bytes / 2) 216 | if num_words * 2 != num_bytes: 217 | return False 218 | # raise Exception("Data not on a 2-byte boundary!") 219 | 220 | start_byte_h = int(line[3:5], 16) 221 | start_byte_l = int(line[5:7], 16) 222 | start_word_addr = int(((start_byte_h * 256) + start_byte_l)/2) 223 | 224 | data_type = int(line[7:9], 16) 225 | if data_type not in allowed_data_types: 226 | return False 227 | # raise Exception(f"Data type {data_type} not supported!") 228 | 229 | idx = 9 230 | data_byte_sum = 0 231 | for i in range(num_words): 232 | data_byte_sum += int(line[idx+2:idx+4], 16) + int(line[idx:idx+2], 16) 233 | data_16_chr = line[idx+2:idx+4] + line[idx:idx+2] 234 | data_16 = int(data_16_chr, 16) 235 | idx += 4 236 | 237 | addr = start_word_addr + i 238 | if addr >= CODE_START_ADDR and addr <= CODE_END_ADDR: 239 | # Code space 240 | num_increments = addr - current_word_addr 241 | if num_increments < 0: 242 | return False 243 | # raise Exception("Memory map is not monotonically increasing!") 244 | if num_increments > 0: 245 | # Skip ahead to the right code location: 246 | for _ in range(num_increments): 247 | command(CMD_INC_ADDR) 248 | current_word_addr += 1 249 | # print(f"Write 0x{data_16:04x} @ 0x{current_word_addr:04x}") 250 | 251 | # Program one word: 252 | command(CMD_LOAD_DATA) 253 | write_data(data_16) 254 | command(CMD_BEGIN_PROG) 255 | sleep_ms(3) 256 | command(CMD_END_PROG) 257 | command(CMD_INC_ADDR) 258 | current_word_addr += 1 259 | elif addr >= CONFIG_START_ADDR and addr <= CONFIG_END_ADDR: 260 | # Config space 261 | if current_config_addr == 0: 262 | # If first time writing a config word, set PC to config space: 263 | command(CMD_LOAD_CONFIG) 264 | write_data(0) # required dummy write 265 | current_config_addr = CONFIG_START_ADDR 266 | 267 | num_increments = addr - current_config_addr 268 | if num_increments < 0: 269 | return False 270 | # raise Exception("Config map is not monotonically increasing!") 271 | if num_increments > 0: 272 | # Skip ahead to the right config location: 273 | for _ in range(num_increments): 274 | command(CMD_INC_ADDR) 275 | current_config_addr += 1 276 | # print(f"Write 0x{data_16:04x} @ 0x{current_config_addr:04x}") 277 | 278 | # Program one word: 279 | command(CMD_LOAD_DATA) 280 | write_data(data_16) 281 | command(CMD_BEGIN_PROG) 282 | sleep_ms(3) 283 | command(CMD_END_PROG) 284 | command(CMD_INC_ADDR) 285 | current_config_addr += 1 286 | else: 287 | return False 288 | # raise Exception(f"Addr {addr} beyond code and config spaces!") 289 | 290 | # Compute checksum. 291 | # Backwards since exception is raised after programming, but it's fine for here. 292 | checksum = int(line[idx:idx+2], 16) 293 | checksum_computed = num_bytes + start_byte_h + start_byte_l + data_type + data_byte_sum 294 | checksum_computed = 256 - (checksum_computed % 256) 295 | 296 | if checksum != checksum_computed: 297 | return False 298 | # raise Exception(f"Checksum {checksum} does not match computed: {checksum_computed}") 299 | 300 | # Read next line: 301 | line = f.readline() 302 | return True 303 | ############################################################ 304 | 305 | PGD.value(0) 306 | PGC.value(0) 307 | VPP.value(0) 308 | print(f"Hex file to flash: {HEX_FILE}") 309 | 310 | print(f"[1] Starting VPP regulation... ", end='') 311 | t0 = ticks_ms() 312 | pwm22 = PWM(Pin(PWM_PIN)) 313 | vboost_ch = Pin(FB_PIN, mode=Pin.IN) 314 | boost_v = boostVPP(pwm22, vboost_ch, 5000) 315 | t1 = (ticks_ms() - t0)/1000 316 | print(f"converged to {boost_v:.2f}V in {t1:.2f}s") 317 | # Once regulation is achieved, hold duty cycle and continue 318 | 319 | print(f"[2] Trying to find PIC16F72... ", end='') 320 | found = False 321 | devid, devrev = find_target() 322 | if devid == DEVID_PIC16F72: 323 | print(f"found, rev {devrev}") 324 | found = True 325 | else: 326 | print(f"not found: id = 0x{id :04x}") 327 | 328 | start_code = ':' 329 | allowed_data_types = [0, 1] # data, EOF 330 | if found: 331 | # Steps: 332 | # 1. Bulk erase part and wait at least 30ms 333 | # 2. Read all code words and ensure chip is blank 334 | # 3. Write flash words and program 335 | # 4. Done - no verification done here 336 | 337 | print(f"[3] Bulk erase ... ", end='') 338 | t0 = ticks_ms() 339 | 340 | # Step 1: 341 | bulk_erase() 342 | 343 | # Step 2: 344 | blank = blank_check() 345 | tblank = (ticks_ms() - t0)/1000 346 | status = "completed" if blank else "failed" 347 | print(f"{status} in {tblank:.2f}s") 348 | 349 | # Step 3: 350 | if blank: 351 | print(f"[4] Programming ... ", end='') 352 | t0 = ticks_ms() 353 | p = program() 354 | tprog = (ticks_ms() - t0)/1000 355 | status = "completed" if p else "failed" 356 | print(f"{status} in {tprog:.2f} seconds") 357 | 358 | pwm22.duty_u16(0) 359 | pwm22.deinit() 360 | VPP.value(0) 361 | PGD.value(0) 362 | PGC.value(0) 363 | 364 | print(f"Done") 365 | 366 | 367 | -------------------------------------------------------------------------------- /schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SyedTahmidMahbub/q-dpico_picprog72/5a918e72d2a5b05f3c61767de552f66991e75294/schematic.png -------------------------------------------------------------------------------- /test.hex: -------------------------------------------------------------------------------- 1 | :02000000FE2FD1 2 | :100FE2003E308316031386008312031386013E30BC 3 | :0E0FF200C00040088606F82F00288301F12F6A 4 | :02400E00F93F78 5 | :00000001FF 6 | -------------------------------------------------------------------------------- /test_big.hex: -------------------------------------------------------------------------------- 1 | :02000000FA2FD5 2 | :100200007F087F398A000408840A0319FF0A8200E4 3 | :10021000003400340034003400340034003400343E 4 | :10022000003400340034003400340034003400342E 5 | :10023000003400340034003400340034003400341E 6 | :10024000003400340034003400340034003400340E 7 | :1002500000340034003400340034003400340034FE 8 | :1002600000340034003400340034003400340034EE 9 | :1002700000340034003400340034003400340034DE 10 | :1002800000340034003400340034003400340034CE 11 | :1002900000340034003400340034003400340034BE 12 | :1002A00000340034003400340034003400340034AE 13 | :1002B000003400340034003400340034003400349E 14 | :1002C000003400340034003400340034003400348E 15 | :1002D000003400340034003400340034003400347E 16 | :1002E000003400340034003400340034003400346E 17 | :1002F000003400340034003400340034003400345E 18 | :10030000003400340034003400340034003400344D 19 | :10031000003400340034003400340034003400343D 20 | :10032000003400340034003400340034003400342D 21 | :10033000003400340034003400340034003400341D 22 | :10034000003400340034003400340034003400340D 23 | :1003500000340034003400340034003400340034FD 24 | :1003600000340034003400340034003400340034ED 25 | :1003700000340034003400340034003400340034DD 26 | :1003800000340034003400340034003400340034CD 27 | :1003900000340034003400340034003400340034BD 28 | :1003A00000340034003400340034003400340034AD 29 | :1003B000003400340034003400340034003400349D 30 | :1003C000003400340034003400340034003400348D 31 | :1003D000003400340034003400340034003400347D 32 | :1003E000003400340034003400340034003400346D 33 | :1003F000003400340034003400340034003400345D 34 | :10040000003400340034003400340034003400344C 35 | :10041000003400340034003400340034003400343C 36 | :10042000003400340034003400340034003400342C 37 | :10043000003400340034003400340034003400341C 38 | :10044000003400340034003400340034003400340C 39 | :1004500000340034003400340034003400340034FC 40 | :1004600000340034003400340034003400340034EC 41 | :1004700000340034003400340034003400340034DC 42 | :1004800000340034003400340034003400340034CC 43 | :1004900000340034003400340034003400340034BC 44 | :1004A00000340034003400340034003400340034AC 45 | :1004B000003400340034003400340034003400349C 46 | :1004C000003400340034003400340034003400348C 47 | :1004D000003400340034003400340034003400347C 48 | :1004E000003400340034003400340034003400346C 49 | :1004F000003400340034003400340034003400345C 50 | :10050000003400340034003400340034003400344B 51 | :10051000003400340034003400340034003400343B 52 | :10052000003400340034003400340034003400342B 53 | :10053000003400340034003400340034003400341B 54 | :10054000003400340034003400340034003400340B 55 | :1005500000340034003400340034003400340034FB 56 | :1005600000340034003400340034003400340034EB 57 | :1005700000340034003400340034003400340034DB 58 | :1005800000340034003400340034003400340034CB 59 | :1005900000340034003400340034003400340034BB 60 | :1005A00000340034003400340034003400340034AB 61 | :1005B000003400340034003400340034003400349B 62 | :1005C000003400340034003400340034003400348B 63 | :1005D000003400340034003400340034003400347B 64 | :1005E000003400340034003400340034003400346B 65 | :1005F000003400340034003400340034003400345B 66 | :10060000003400340034003400340034003400344A 67 | :10061000003400340034003400340034003400343A 68 | :10062000003400340034003400340034003400342A 69 | :10063000003400340034003400340034003400341A 70 | :10064000003400340034003400340034003400340A 71 | :1006500000340034003400340034003400340034FA 72 | :1006600000340034003400340034003400340034EA 73 | :1006700000340034003400340034003400340034DA 74 | :1006800000340034003400340034003400340034CA 75 | :1006900000340034003400340034003400340034BA 76 | :1006A00000340034003400340034003400340034AA 77 | :1006B000003400340034003400340034003400349A 78 | :1006C000003400340034003400340034003400348A 79 | :1006D000003400340034003400340034003400347A 80 | :1006E000003400340034003400340034003400346A 81 | :1006F000003400340034003400340034003400345A 82 | :100700000034003400340034003400340034003449 83 | :100710000034003400340034003400340034003439 84 | :100720000034003400340034003400340034003429 85 | :100730000034003400340034003400340034003419 86 | :100740000034003400340034003400340034003409 87 | :1007500000340034003400340034003400340034F9 88 | :1007600000340034003400340034003400340034E9 89 | :1007700000340034003400340034003400340034D9 90 | :1007800000340034003400340034003400340034C9 91 | :1007900000340034003400340034003400340034B9 92 | :1007A00000340034003400340034003400340034A9 93 | :1007B0000034003400340034003400340034003499 94 | :1007C0000034003400340034003400340034003489 95 | :1007D0000034003400340034003400340034003479 96 | :1007E0000034003400340034003400340034003469 97 | :1007F0000034003400340034003400340034003459 98 | :100800000034003400340034003400340034003448 99 | :100810000034003400340034003400340034003438 100 | :100820000034003400340034003400340034003428 101 | :100830000034003400340034003400340034003418 102 | :100840000034003400340034003400340034003408 103 | :1008500000340034003400340034003400340034F8 104 | :1008600000340034003400340034003400340034E8 105 | :1008700000340034003400340034003400340034D8 106 | :1008800000340034003400340034003400340034C8 107 | :1008900000340034003400340034003400340034B8 108 | :1008A00000340034003400340034003400340034A8 109 | :1008B0000034003400340034003400340034003498 110 | :1008C0000034003400340034003400340034003488 111 | :1008D0000034003400340034003400340034003478 112 | :1008E0000034003400340034003400340034003468 113 | :1008F0000034003400340034003400340034003458 114 | :100900000034003400340034003400340034003447 115 | :100910000034003400340034003400340034003437 116 | :100920000034003400340034003400340034003427 117 | :100930000034003400340034003400340034003417 118 | :100940000034003400340034003400340034003407 119 | :1009500000340034003400340034003400340034F7 120 | :1009600000340034003400340034003400340034E7 121 | :1009700000340034003400340034003400340034D7 122 | :1009800000340034003400340034003400340034C7 123 | :1009900000340034003400340034003400340034B7 124 | :1009A00000340034003400340034003400340034A7 125 | :1009B0000034003400340034003400340034003497 126 | :1009C0000034003400340034003400340034003487 127 | :1009D0000034003400340034003400340034003477 128 | :1009E0000034003400340034003400340034003467 129 | :1009F0000034003400340034003400340034003457 130 | :100A00000034003400340034003400340034003446 131 | :100A10000034003400340034003400340034003436 132 | :100A20000034003400340034003400340034003426 133 | :100A30000034003400340034003400340034003416 134 | :100A40000034003400340034003400340034003406 135 | :100A500000340034003400340034003400340034F6 136 | :100A600000340034003400340034003400340034E6 137 | :100A700000340034003400340034003400340034D6 138 | :100A800000340034003400340034003400340034C6 139 | :100A900000340034003400340034003400340034B6 140 | :100AA00000340034003400340034003400340034A6 141 | :100AB0000034003400340034003400340034003496 142 | :100AC0000034003400340034003400340034003486 143 | :100AD0000034003400340034003400340034003476 144 | :100AE0000034003400340034003400340034003466 145 | :100AF0000034003400340034003400340034003456 146 | :100B00000034003400340034003400340034003445 147 | :100B10000034003400340034003400340034003435 148 | :100B20000034003400340034003400340034003425 149 | :100B30000034003400340034003400340034003415 150 | :100B40000034003400340034003400340034003405 151 | :100B500000340034003400340034003400340034F5 152 | :100B600000340034003400340034003400340034E5 153 | :100B700000340034003400340034003400340034D5 154 | :100B800000340034003400340034003400340034C5 155 | :100B900000340034003400340034003400340034B5 156 | :100BA00000340034003400340034003400340034A5 157 | :100BB0000034003400340034003400340034003495 158 | :100BC0000034003400340034003400340034003485 159 | :100BD0000034003400340034003400340034003475 160 | :100BE0000034003400340034003400340034003465 161 | :100BF0000034003400340034003400340034003455 162 | :100C00000034003400340034003400340034003444 163 | :100C10000034003400340034003400340034003434 164 | :100C20000034003400340034003400340034003424 165 | :100C30000034003400340034003400340034003414 166 | :100C40000034003400340034003400340034003404 167 | :100C500000340034003400340034003400340034F4 168 | :100C600000340034003400340034003400340034E4 169 | :100C700000340034003400340034003400340034D4 170 | :100C800000340034003400340034003400340034C4 171 | :100C900000340034003400340034003400340034B4 172 | :100CA00000340034003400340034003400340034A4 173 | :100CB0000034003400340034003400340034003494 174 | :100CC0000034003400340034003400340034003484 175 | :100CD0000034003400340034003400340034003474 176 | :100CE0000034003400340034003400340034003464 177 | :100CF0000034003400340034003400340034003454 178 | :100D00000034003400340034003400340034003443 179 | :100D10000034003400340034003400340034003433 180 | :100D20000034003400340034003400340034003423 181 | :100D30000034003400340034003400340034003413 182 | :100D40000034003400340034003400340034003403 183 | :100D500000340034003400340034003400340034F3 184 | :100D600000340034003400340034003400340034E3 185 | :100D700000340034003400340034003400340034D3 186 | :100D800000340034003400340034003400340034C3 187 | :100D900000340034003400340034003400340034B3 188 | :100DA00000340034003400340034003400340034A3 189 | :100DB0000034003400340034003400340034003493 190 | :100DC0000034003400340034003400340034003483 191 | :100DD0000034003400340034003400340034003473 192 | :100DE0000034003400340034003400340034003463 193 | :100DF0000034003400340034003400340034003453 194 | :100E00000034003400340034003400340034003442 195 | :100E10000034003400340034003400340034003432 196 | :100E20000034003400340034003400340034003422 197 | :100E30000034003400340034003400340034003412 198 | :100E40000034003400340034003400340034003402 199 | :100E500000340034003400340034003400340034F2 200 | :100E600000340034003400340034003400340034E2 201 | :100E700000340034003400340034003400340034D2 202 | :100E800000340034003400340034003400340034C2 203 | :100E90003E30831603138600831203138601F1018B 204 | :100EA000F2017108F0007007403E84007108800074 205 | :100EB000840A720880000130F1070318F20A00303A 206 | :100EC000F2077208803AFF0080307F02031D6A2F0C 207 | :100ED00018307102031C6D2F6E2F512F3E30F00021 208 | :100EE00070088312031386066E2F002864008001A9 209 | :0C0EF000840A0406031900340406772F5E 210 | :0C0FF40040308400703076278301482FC5 211 | :02400E00F93F78 212 | :00000001FF 213 | --------------------------------------------------------------------------------