1 radix dec 2 ; Code bank 0; Start address: 0; End address: 1023 3 0000 : org 0 4 5 ; Define start addresses for data regions 6 00000020 = shared___globals equ 32 7 00000000 = __indf equ 0 8 00000002 = __pcl equ 2 9 00000003 = __status equ 3 10 00000004 = __fsr equ 4 11 00000003 = __c___byte equ 3 12 00000000 = __c___bit equ 0 13 00000003 = __z___byte equ 3 14 00000002 = __z___bit equ 2 15 00000003 = __rp0___byte equ 3 16 00000005 = __rp0___bit equ 5 17 00000003 = __rp1___byte equ 3 18 00000006 = __rp1___bit equ 6 19 00000003 = __irp___byte equ 3 20 00000007 = __irp___bit equ 7 21 0000000a = __pclath equ 10 22 0000000a = __cb0___byte equ 10 23 00000003 = __cb0___bit equ 3 24 0000000a = __cb1___byte equ 10 25 00000004 = __cb1___bit equ 4 26 27 ; # ***************************************************************************** 28 ; # 29 ; # Copyright (c) 2000-2004 by Wayne Gramlich 30 ; # All rights reserved. 31 ; # 32 ; # This is the code that implements the Servo4 module. Basically 33 ; # it just waits for commands that come in at 2400 baud and responds 34 ; # to them. See: 35 ; # 36 ; # http://web.gramlich.net/projects/robobricks/servo4/index.html 37 ; # 38 ; # for more details. 39 ; # 40 ; # ***************************************************************************** 41 42 ; # ***************************************************************************** 43 ; # 44 ; # This code is pretty complicated. It has the goals of properly responding 45 ; # to commands sent 2400 baud and keeping up to 4 servos on position without 46 ; # any sevro chatter. 47 ; # 48 ; # The output waveforms from the chip look basically as follows: 49 ; # 50 ; # servo0 __[XX]____________________________[XX]__________________________ 51 ; # servo1 __________[XX]____________________________[XX]__________________ 52 ; # servo2 __________________[XX]____________________________[XX]__________ 53 ; # servo3 __________________________[XX]____________________________[XX]__ 54 ; # 55 ; # The basic unit of timing is the "tick", which is definded as 1/3 of 56 ; # a bit time at 2400 baud, or 1/(3*2400), or .138ms or 138us. The code 57 ; # uses 32 ticks to service one servo, 32/(3*2400) = 4.44ms. Since there 58 ; # are 4 servos, the total cycle time is (4*32*)/(3*2400) = 17.7ms. This 59 ; # is called the "frame rate" and is just a tiny bit shorter than the 60 ; # target of 20ms. 61 ; # 62 ; # Initially, the servo4 code was carefully crafted to generate 63 ; # pulses that went from 1ms-2ms for each servo. Unfortunately, 64 ; # most servos only go from +60 to -60 degrees with 1-2ms input 65 ; # pulse width. In order, to get a full range of motion out of 66 ; # most servos, the range has been extended from .2ms to 2.3ms. 67 ; # This means that some values may cause the servo to push 68 ; # against its mechanical stops. 69 ; # 70 ; # During the 32 ticks (numbered from 0 to 31) that are used to 71 ; # service a particular servo. The ticks are divided up as follows: 72 ; # 73 ; # Servo Tick 0: 74 ; # This tick is used to figure out which servo line to turn 75 ; # on (if enabled.) 76 ; # Servo Tick 1: 77 ; # This tick just leaves the servos alone. 78 ; # Servo Ticks 2-17 (17-2+1=16 ticks total): 79 ; # These ticks are used to figure out when when to turn 80 ; # the servo off. 17/(3*2400) = 2.3ms. 81 ; # Servo Tick 18: 82 ; # This is fail safe code that just turns off off the servo 83 ; # just in case something goes wrong. 84 ; # Servo Ticks 19-31: 85 ; # These ticks are used to decode any commands that have 86 ; # come in from the serial line. 87 ; # 88 ; # For Ticks 2-17, the first "half" is spent checking against the 89 ; # position variable. The second "half" is allocated to serial I/O 90 ; # service. Bit 3 of the position variable specifies which tick 91 ; # "half", the servo off needs to occur in. If bit 3 is a 1, 92 ; # we generate a "long" pulse by turning on the servo at the 93 ; # beginning of tick 0. If bit 3 is a 0, we generate a "short" 94 ; # pulse by turning on the servo halfway through tick 0. By 95 ; # adjusting the start of the pulse on bit 3 in tick 0, it is 96 ; # ensured that the off pulse will always occur in the first 97 ; # half of ticks 2-17. Here is some drawings: 98 ; # 99 ; # Position=0: ________[XXXXXXXXXXXXXXXXXXXXXXX]________________________________ 100 ; # Position=7: ________[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]________________________ 101 ; # Position=8: [XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]________________________________ 102 ; # Position=15: [XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]________________________ 103 ; # Position=16: _________[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]________________ 104 ; # Position=23: _________[XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]________ 105 ; # Position=24: [XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]________________ 106 ; # Position=31: [XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX]________ 107 ; # 108 ; # Tick: |<------0------>|<------1------>|<------2------>|<------3------>| 109 ; # 110 ; # Since bit 3 is used to adjust the beginning and end of the 111 ; # pulse start, it is no longer used in the counting process. 112 ; # This is done by clearing bit 3 at the end of every servo 113 ; # service tick. 114 ; # 115 ; # The fine grain positioning of the servo off signal is done with 116 ; # some timing loops. These loops have been carefully hand tweaked 117 ; # to provide approximately 8 instructions of delay for each position 118 ; # increment. It was necessary to unroll the loop a little to 119 ; # smooth out the increments. 120 ; # 121 ; # The serial I/O is done using a state machine using the variable 122 ; # "state" . The state variable can range from 0 through 61. 123 ; # The states are as follows: 124 ; # 125 ; # Serial State 0: 126 ; # Wait for start bit. 127 ; # Serial State 1-29: 128 ; # Receive byte. 129 ; # Serial State 31-61: 130 ; # Send byte. 131 ; # 132 ; # The state machine stays in state 0 until it receives a start bit. 133 ; # It then spends the next 29 ticks receiving a byte of data before 134 ; # returning to state 0. Right before it returns to state 0, it 135 ; # sets the decode_requested bit. During servo ticks 19-31, the 136 ; # decode_requested bit is tested to see whether the command decode 137 ; # procedure needs to be called. 138 ; # 139 ; # The decode procedure is separate from everything only because 140 ; # not everything can be crammed into a single code bank of the 141 ; # PIC12C509. Instead, the decode routine is in code bank 0 142 ; # and the main routine is in code bank 1. The decode takes the 143 ; # received byte and dispatches appropriately. If it needs to 144 ; # send a response byte, it crams the byte into the "buffer" 145 ; # variable and sets state to 31. The next 30 ticks, will cause 146 ; # buffer to be emptied out to the serial port. 147 ; # 148 ; # Since decoding is always deferred to servo ticks 19-31, it 149 ; # is quite possible that command decoding will not commence 150 ; # until well after a second byte of data is being received. 151 ; # That is OK, since a byte takes at least 29 ticks to receive 152 ; # whereas the longest it takes to process a servo is 20 ticks. 153 ; # Thus, there will never be a buffer overrun. 154 ; # 155 ; # ***************************************************************************** 156 157 ; buffer = 'servo4' 158 ; line_number = 133 159 ; library _pic12f629 entered 160 161 ; # Copyright (c) 2004 by Wayne C. Gramlich 162 ; # All rights reserved. 163 164 ; buffer = '_pic12f629' 165 ; line_number = 6 166 ; processor pic12f675 167 ; line_number = 7 168 ; configure_address 0x2007 169 ; line_number = 8 170 ; configure_fill 0x0 171 ; line_number = 9 172 ; configure_option bg: bg11 = 0x3000 173 ; line_number = 10 174 ; configure_option bg: bg00 = 0x0000 175 ; line_number = 11 176 ; configure_option cpd: on = 0x000 177 ; line_number = 12 178 ; configure_option cpd: off = 0x100 179 ; line_number = 13 180 ; configure_option cp: on = 0x00 181 ; line_number = 14 182 ; configure_option cp: off = 0x80 183 ; line_number = 15 184 ; configure_option boden: on = 0x40 185 ; line_number = 16 186 ; configure_option boden: off = 0x00 187 ; line_number = 17 188 ; configure_option mclre: on = 0x20 189 ; line_number = 18 190 ; configure_option mclre: off = 0x00 191 ; line_number = 19 192 ; configure_option pwrte: on = 0x00 193 ; line_number = 20 194 ; configure_option pwrte: off = 0x10 195 ; line_number = 21 196 ; configure_option wdte: on = 8 197 ; line_number = 22 198 ; configure_option wdte: off = 0 199 ; line_number = 23 200 ; configure_option fosc: rc_clk = 7 201 ; line_number = 24 202 ; configure_option fosc: rc_no_clk = 6 203 ; line_number = 25 204 ; configure_option fosc: int_clk = 5 205 ; line_number = 26 206 ; configure_option fosc: int_no_clk = 4 207 ; line_number = 27 208 ; configure_option fosc: ec = 3 209 ; line_number = 28 210 ; configure_option fosc: hs = 2 211 ; line_number = 29 212 ; configure_option fosc: xt = 1 213 ; line_number = 30 214 ; configure_option fosc: lp = 0 215 ; line_number = 31 216 ; code_bank 0x0 : 0x3ff 217 ; line_number = 32 218 ; data_bank 0x0 : 0x7f 219 ; line_number = 33 220 ; data_bank 0x80 : 0xff 221 ; line_number = 34 222 ; shared_region 0x20 : 0x5f 223 ; line_number = 35 224 ; interrupts_possible 225 ; line_number = 36 226 ; osccal_register_symbol _osccal 227 ; line_number = 37 228 ; osccal_at_address 0x3ff 229 ; line_number = 38 230 ; packages pdip=8, soic=8, dfn_s=8 231 ; line_number = 39 232 ; pin vdd, power_supply 233 ; line_number = 40 234 ; pin_bindings pdip=1, soic=1, dfn_s=1 235 ; line_number = 41 236 ; pin gp5_in, gp5_out, t1cki, osc1, clkin, gp5_unused 237 ; line_number = 42 238 ; pin_bindings pdip=2, soic=2, dfn_s=2 239 ; line_number = 43 240 ; bind_to _gpio@5 241 ; line_number = 44 242 ; or_if gp5_in _trisio 16 243 ; line_number = 45 244 ; or_if gp5_out _trisio 0 245 ; line_number = 46 246 ; pin gp4_in, gp4_out, t1g, osc2, clkout, gp4_unused 247 ; line_number = 47 248 ; pin_bindings pdip=3, soic=3, dfn_s=3 249 ; line_number = 48 250 ; bind_to _gpio@4 251 ; line_number = 49 252 ; or_if gp4_in _trisio 8 253 ; line_number = 50 254 ; or_if gp4_out _trisio 0 255 ; line_number = 51 256 ; pin gp3_in, mclr, vpp, rp3_unused 257 ; line_number = 52 258 ; pin_bindings pdip=4, soic=4, dfn_s=4 259 ; line_number = 53 260 ; bind_to _gpio@4 261 ; line_number = 54 262 ; or_if gp3_in _trisio 4 263 ; line_number = 55 264 ; pin gp2_in, gp2_out, t0cki, int, cout, gp2_unused 265 ; line_number = 56 266 ; pin_bindings pdip=5, soic=5, dfn_s=5 267 ; line_number = 57 268 ; bind_to _gpio@2 269 ; line_number = 58 270 ; or_if gp2_in _trisio 4 271 ; line_number = 59 272 ; or_if gp2_out _trisio 0 273 ; line_number = 60 274 ; pin gp1_in, gp1_out, cin_minus, gp1_unused 275 ; line_number = 61 276 ; pin_bindings pdip=6, soic=6, dfn_s=6 277 ; line_number = 62 278 ; bind_to _gpio@1 279 ; line_number = 63 280 ; or_if gp1_in _trisio 2 281 ; line_number = 64 282 ; or_if gp1_out _trisio 0 283 ; line_number = 65 284 ; pin gp0_in, gp0_out, gp0_unused 285 ; line_number = 66 286 ; pin_bindings pdip=7, soic=7, dfn_s=7 287 ; line_number = 67 288 ; bind_to _gpio@0 289 ; line_number = 68 290 ; or_if gp0_in _trisio 1 291 ; line_number = 69 292 ; or_if gp0_out _trisio 0 293 ; line_number = 70 294 ; pin vss, ground 295 ; line_number = 71 296 ; pin_bindings pdip=8, soic=8, dfn_s=8 297 298 299 ; line_number = 76 300 ; library _pic12f629_675 entered 301 ; # Copyright (c) 2004 by Wayne C. Gramlich 302 ; # All rights reserved. 303 304 ; # Shared register definitions for the PIC12F629 and PIC12F675. 305 306 ; buffer = '_pic12f629_675' 307 ; line_number = 7 308 ; register _indf = 309 00000000 = _indf equ 0 310 311 ; line_number = 9 312 ; register _tmr0 = 313 00000001 = _tmr0 equ 1 314 315 ; line_number = 11 316 ; register _pcl = 317 00000002 = _pcl equ 2 318 319 ; line_number = 13 320 ; register _status = 321 00000003 = _status equ 3 322 ; line_number = 14 323 ; bind _rp0 = _status@5 324 00000003 = _rp0___byte equ _status 325 00000005 = _rp0___bit equ 5 326 ; line_number = 15 327 ; bind _to = _status@4 328 00000003 = _to___byte equ _status 329 00000004 = _to___bit equ 4 330 ; line_number = 16 331 ; bind _pd = _status@3 332 00000003 = _pd___byte equ _status 333 00000003 = _pd___bit equ 3 334 ; line_number = 17 335 ; bind _z = _status@2 336 00000003 = _z___byte equ _status 337 00000002 = _z___bit equ 2 338 ; line_number = 18 339 ; bind _dc = _status@1 340 00000003 = _dc___byte equ _status 341 00000001 = _dc___bit equ 1 342 ; line_number = 19 343 ; bind _c = _status@0 344 00000003 = _c___byte equ _status 345 00000000 = _c___bit equ 0 346 347 ; line_number = 21 348 ; register _fsr = 349 00000004 = _fsr equ 4 350 351 ; line_number = 23 352 ; register _gpio = 353 00000005 = _gpio equ 5 354 ; line_number = 24 355 ; bind _gpio5 = _gpio@5 356 00000005 = _gpio5___byte equ _gpio 357 00000005 = _gpio5___bit equ 5 358 ; line_number = 25 359 ; bind _gpio4 = _gpio@4 360 00000005 = _gpio4___byte equ _gpio 361 00000004 = _gpio4___bit equ 4 362 ; line_number = 26 363 ; bind _gpio3 = _gpio@3 364 00000005 = _gpio3___byte equ _gpio 365 00000003 = _gpio3___bit equ 3 366 ; line_number = 27 367 ; bind _gpio2 = _gpio@2 368 00000005 = _gpio2___byte equ _gpio 369 00000002 = _gpio2___bit equ 2 370 ; line_number = 28 371 ; bind _gpio1 = _gpio@1 372 00000005 = _gpio1___byte equ _gpio 373 00000001 = _gpio1___bit equ 1 374 ; line_number = 29 375 ; bind _gpio0 = _gpio@0 376 00000005 = _gpio0___byte equ _gpio 377 00000000 = _gpio0___bit equ 0 378 379 ; line_number = 31 380 ; register _pclath = 381 0000000a = _pclath equ 10 382 383 ; line_number = 33 384 ; register _intcon = 385 0000000b = _intcon equ 11 386 ; line_number = 34 387 ; bind _gie = _intcon@7 388 0000000b = _gie___byte equ _intcon 389 00000007 = _gie___bit equ 7 390 ; line_number = 35 391 ; bind _peie = _intcon@6 392 0000000b = _peie___byte equ _intcon 393 00000006 = _peie___bit equ 6 394 ; line_number = 36 395 ; bind _t0ie = _intcon@5 396 0000000b = _t0ie___byte equ _intcon 397 00000005 = _t0ie___bit equ 5 398 ; line_number = 37 399 ; bind _inte = _intcon@4 400 0000000b = _inte___byte equ _intcon 401 00000004 = _inte___bit equ 4 402 ; line_number = 38 403 ; bind _gpie = _intcon@3 404 0000000b = _gpie___byte equ _intcon 405 00000003 = _gpie___bit equ 3 406 ; line_number = 39 407 ; bind _t0if = _intcon@2 408 0000000b = _t0if___byte equ _intcon 409 00000002 = _t0if___bit equ 2 410 ; line_number = 40 411 ; bind _intf = _intcon@1 412 0000000b = _intf___byte equ _intcon 413 00000001 = _intf___bit equ 1 414 ; line_number = 41 415 ; bind _gpif = _intcon@0 416 0000000b = _gpif___byte equ _intcon 417 00000000 = _gpif___bit equ 0 418 419 ; line_number = 43 420 ; register _pir1 = 421 0000000c = _pir1 equ 12 422 ; line_number = 44 423 ; bind _eeif = _pir1@7 424 0000000c = _eeif___byte equ _pir1 425 00000007 = _eeif___bit equ 7 426 ; line_number = 45 427 ; bind _cmif = _pir1@3 428 0000000c = _cmif___byte equ _pir1 429 00000003 = _cmif___bit equ 3 430 ; line_number = 46 431 ; bind _tmr1if = _pir1@0 432 0000000c = _tmr1if___byte equ _pir1 433 00000000 = _tmr1if___bit equ 0 434 435 ; line_number = 48 436 ; register _tmr1l = 437 0000000e = _tmr1l equ 14 438 439 ; line_number = 50 440 ; register _tmr1h = 441 0000000f = _tmr1h equ 15 442 443 ; line_number = 52 444 ; register _t1con = 445 00000010 = _t1con equ 16 446 ; line_number = 53 447 ; bind _t1ge = _t1con@6 448 00000010 = _t1ge___byte equ _t1con 449 00000006 = _t1ge___bit equ 6 450 ; line_number = 54 451 ; bind _t1ckps1 = _t1con@5 452 00000010 = _t1ckps1___byte equ _t1con 453 00000005 = _t1ckps1___bit equ 5 454 ; line_number = 55 455 ; bind _t1ckps0 = _t1con@4 456 00000010 = _t1ckps0___byte equ _t1con 457 00000004 = _t1ckps0___bit equ 4 458 ; line_number = 56 459 ; bind _t1oscen = _t1con@3 460 00000010 = _t1oscen___byte equ _t1con 461 00000003 = _t1oscen___bit equ 3 462 ; line_number = 57 463 ; bind _t1sync = _t1con@2 464 00000010 = _t1sync___byte equ _t1con 465 00000002 = _t1sync___bit equ 2 466 ; line_number = 58 467 ; bind _tmr1cs = _t1con@1 468 00000010 = _tmr1cs___byte equ _t1con 469 00000001 = _tmr1cs___bit equ 1 470 ; line_number = 59 471 ; bind _tmr1on = _t1con@0 472 00000010 = _tmr1on___byte equ _t1con 473 00000000 = _tmr1on___bit equ 0 474 475 ; line_number = 61 476 ; register _cmcon = 477 00000019 = _cmcon equ 25 478 ; line_number = 62 479 ; bind _cout = _cmcon@6 480 00000019 = _cout___byte equ _cmcon 481 00000006 = _cout___bit equ 6 482 ; line_number = 63 483 ; bind _cinv = _cmcon@4 484 00000019 = _cinv___byte equ _cmcon 485 00000004 = _cinv___bit equ 4 486 ; line_number = 64 487 ; bind _cis = _cmcon@3 488 00000019 = _cis___byte equ _cmcon 489 00000003 = _cis___bit equ 3 490 ; line_number = 65 491 ; bind _cm2 = _cmcon@2 492 00000019 = _cm2___byte equ _cmcon 493 00000002 = _cm2___bit equ 2 494 ; line_number = 66 495 ; bind _cm1 = _cmcon@1 496 00000019 = _cm1___byte equ _cmcon 497 00000001 = _cm1___bit equ 1 498 ; line_number = 67 499 ; bind _cm0 = _cmcon@0 500 00000019 = _cm0___byte equ _cmcon 501 00000000 = _cm0___bit equ 0 502 503 ; line_number = 69 504 ; register _adcon0 = 505 0000001f = _adcon0 equ 31 506 ; line_number = 70 507 ; bind _adfm = _adcon0@7 508 0000001f = _adfm___byte equ _adcon0 509 00000007 = _adfm___bit equ 7 510 ; line_number = 71 511 ; bind _vcfg = _adcon0@6 512 0000001f = _vcfg___byte equ _adcon0 513 00000006 = _vcfg___bit equ 6 514 ; line_number = 72 515 ; bind _csh1 = _adcon0@3 516 0000001f = _csh1___byte equ _adcon0 517 00000003 = _csh1___bit equ 3 518 ; line_number = 73 519 ; bind _csh0 = _adcon0@2 520 0000001f = _csh0___byte equ _adcon0 521 00000002 = _csh0___bit equ 2 522 ; line_number = 74 523 ; bind _go = _adcon0@1 524 0000001f = _go___byte equ _adcon0 525 00000001 = _go___bit equ 1 526 ; line_number = 75 527 ; bind _adon = _adcon0@0 528 0000001f = _adon___byte equ _adcon0 529 00000000 = _adon___bit equ 0 530 531 ; # Data bank 1 (0x80-0xff): 532 533 ; line_number = 79 534 ; register _option_reg = 535 00000081 = _option_reg equ 129 536 ; line_number = 80 537 ; bind _gppu = _option_reg@7 538 00000081 = _gppu___byte equ _option_reg 539 00000007 = _gppu___bit equ 7 540 ; line_number = 81 541 ; bind _intedg = _option_reg@6 542 00000081 = _intedg___byte equ _option_reg 543 00000006 = _intedg___bit equ 6 544 ; line_number = 82 545 ; bind _t0cs = _option_reg@5 546 00000081 = _t0cs___byte equ _option_reg 547 00000005 = _t0cs___bit equ 5 548 ; line_number = 83 549 ; bind _t0se = _option_reg@4 550 00000081 = _t0se___byte equ _option_reg 551 00000004 = _t0se___bit equ 4 552 ; line_number = 84 553 ; bind _psa = _option_reg@3 554 00000081 = _psa___byte equ _option_reg 555 00000003 = _psa___bit equ 3 556 ; line_number = 85 557 ; bind _ps2 = _option_reg@2 558 00000081 = _ps2___byte equ _option_reg 559 00000002 = _ps2___bit equ 2 560 ; line_number = 86 561 ; bind _ps1 = _option_reg@1 562 00000081 = _ps1___byte equ _option_reg 563 00000001 = _ps1___bit equ 1 564 ; line_number = 87 565 ; bind _ps0 = _option_reg@0 566 00000081 = _ps0___byte equ _option_reg 567 00000000 = _ps0___bit equ 0 568 569 ; line_number = 89 570 ; register _trisio = 571 00000085 = _trisio equ 133 572 ; line_number = 90 573 ; bind _trisio5 = _trisio@5 574 00000085 = _trisio5___byte equ _trisio 575 00000005 = _trisio5___bit equ 5 576 ; line_number = 91 577 ; bind _trisio4 = _trisio@4 578 00000085 = _trisio4___byte equ _trisio 579 00000004 = _trisio4___bit equ 4 580 ; line_number = 92 581 ; bind _trisio3 = _trisio@3 582 00000085 = _trisio3___byte equ _trisio 583 00000003 = _trisio3___bit equ 3 584 ; line_number = 93 585 ; bind _trisio2 = _trisio@2 586 00000085 = _trisio2___byte equ _trisio 587 00000002 = _trisio2___bit equ 2 588 ; line_number = 94 589 ; bind _trisio1 = _trisio@1 590 00000085 = _trisio1___byte equ _trisio 591 00000001 = _trisio1___bit equ 1 592 ; line_number = 95 593 ; bind _trisio0 = _trisio@0 594 00000085 = _trisio0___byte equ _trisio 595 00000000 = _trisio0___bit equ 0 596 597 ; line_number = 97 598 ; register _pie1 = 599 0000008c = _pie1 equ 140 600 ; line_number = 98 601 ; bind _eeie = _pie1@7 602 0000008c = _eeie___byte equ _pie1 603 00000007 = _eeie___bit equ 7 604 ; line_number = 99 605 ; bind _cmie = _pie1@3 606 0000008c = _cmie___byte equ _pie1 607 00000003 = _cmie___bit equ 3 608 ; line_number = 100 609 ; bind _tmr1ie = _pie1@0 610 0000008c = _tmr1ie___byte equ _pie1 611 00000000 = _tmr1ie___bit equ 0 612 613 ; line_number = 102 614 ; register _pcon = 615 0000008e = _pcon equ 142 616 ; line_number = 103 617 ; bind _por = _pcon@1 618 0000008e = _por___byte equ _pcon 619 00000001 = _por___bit equ 1 620 ; line_number = 104 621 ; bind _bor = _pcon@0 622 0000008e = _bor___byte equ _pcon 623 00000000 = _bor___bit equ 0 624 625 ; line_number = 106 626 ; register _osccal = 627 00000090 = _osccal equ 144 628 ; line_number = 107 629 ; bind _cal5 = _osccal@7 630 00000090 = _cal5___byte equ _osccal 631 00000007 = _cal5___bit equ 7 632 ; line_number = 108 633 ; bind _cal4 = _osccal@6 634 00000090 = _cal4___byte equ _osccal 635 00000006 = _cal4___bit equ 6 636 ; line_number = 109 637 ; bind _cal3 = _osccal@5 638 00000090 = _cal3___byte equ _osccal 639 00000005 = _cal3___bit equ 5 640 ; line_number = 110 641 ; bind _cal2 = _osccal@4 642 00000090 = _cal2___byte equ _osccal 643 00000004 = _cal2___bit equ 4 644 ; line_number = 111 645 ; bind _cal1 = _osccal@3 646 00000090 = _cal1___byte equ _osccal 647 00000003 = _cal1___bit equ 3 648 ; line_number = 112 649 ; bind _cal0 = _osccal@2 650 00000090 = _cal0___byte equ _osccal 651 00000002 = _cal0___bit equ 2 652 ; line_number = 113 653 ; constant _osccal_lsb = 4 654 00000004 = _osccal_lsb equ 4 655 656 ; line_number = 115 657 ; register _wpua = 658 00000095 = _wpua equ 149 659 ; line_number = 116 660 ; bind _wpua5 = _wpua@5 661 00000095 = _wpua5___byte equ _wpua 662 00000005 = _wpua5___bit equ 5 663 ; line_number = 117 664 ; bind _wpua4 = _wpua@4 665 00000095 = _wpua4___byte equ _wpua 666 00000004 = _wpua4___bit equ 4 667 ; line_number = 118 668 ; bind _wpua2 = _wpua@2 669 00000095 = _wpua2___byte equ _wpua 670 00000002 = _wpua2___bit equ 2 671 ; line_number = 119 672 ; bind _wpua1 = _wpua@1 673 00000095 = _wpua1___byte equ _wpua 674 00000001 = _wpua1___bit equ 1 675 ; line_number = 120 676 ; bind _wpua0 = _wpua@0 677 00000095 = _wpua0___byte equ _wpua 678 00000000 = _wpua0___bit equ 0 679 680 ; line_number = 122 681 ; register _ioca = 682 00000096 = _ioca equ 150 683 ; line_number = 123 684 ; bind _ioca5 = _ioca@5 685 00000096 = _ioca5___byte equ _ioca 686 00000005 = _ioca5___bit equ 5 687 ; line_number = 124 688 ; bind _ioca4 = _ioca@4 689 00000096 = _ioca4___byte equ _ioca 690 00000004 = _ioca4___bit equ 4 691 ; line_number = 125 692 ; bind _ioca3 = _ioca@3 693 00000096 = _ioca3___byte equ _ioca 694 00000003 = _ioca3___bit equ 3 695 ; line_number = 126 696 ; bind _ioca2 = _ioca@2 697 00000096 = _ioca2___byte equ _ioca 698 00000002 = _ioca2___bit equ 2 699 ; line_number = 127 700 ; bind _ioca1 = _ioca@1 701 00000096 = _ioca1___byte equ _ioca 702 00000001 = _ioca1___bit equ 1 703 ; line_number = 128 704 ; bind _ioca0 = _ioca@0 705 00000096 = _ioca0___byte equ _ioca 706 00000000 = _ioca0___bit equ 0 707 708 ; line_number = 130 709 ; register _vrcon = 710 00000099 = _vrcon equ 153 711 ; line_number = 131 712 ; bind _vren = _vrcon@7 713 00000099 = _vren___byte equ _vrcon 714 00000007 = _vren___bit equ 7 715 ; line_number = 132 716 ; bind _vrr = _vrcon@5 717 00000099 = _vrr___byte equ _vrcon 718 00000005 = _vrr___bit equ 5 719 ; line_number = 133 720 ; bind _vr3 = _vrcon@3 721 00000099 = _vr3___byte equ _vrcon 722 00000003 = _vr3___bit equ 3 723 ; line_number = 134 724 ; bind _vr2 = _vrcon@2 725 00000099 = _vr2___byte equ _vrcon 726 00000002 = _vr2___bit equ 2 727 ; line_number = 135 728 ; bind _vr1 = _vrcon@1 729 00000099 = _vr1___byte equ _vrcon 730 00000001 = _vr1___bit equ 1 731 ; line_number = 136 732 ; bind _vr0 = _vrcon@0 733 00000099 = _vr0___byte equ _vrcon 734 00000000 = _vr0___bit equ 0 735 736 ; line_number = 138 737 ; register _eedata = 738 0000009a = _eedata equ 154 739 740 ; line_number = 140 741 ; register _eeadr = 742 0000009b = _eeadr equ 155 743 744 ; line_number = 142 745 ; register _eecon1 = 746 0000009c = _eecon1 equ 156 747 ; line_number = 143 748 ; bind _wrerr = _eecon1@3 749 0000009c = _wrerr___byte equ _eecon1 750 00000003 = _wrerr___bit equ 3 751 ; line_number = 144 752 ; bind _wren = _eecon1@2 753 0000009c = _wren___byte equ _eecon1 754 00000002 = _wren___bit equ 2 755 ; line_number = 145 756 ; bind _wr = _eecon1@1 757 0000009c = _wr___byte equ _eecon1 758 00000001 = _wr___bit equ 1 759 ; line_number = 146 760 ; bind _rd = _eecon1@0 761 0000009c = _rd___byte equ _eecon1 762 00000000 = _rd___bit equ 0 763 764 ; line_number = 148 765 ; register _eecon2 = 766 0000009d = _eecon2 equ 157 767 768 769 ; buffer = '_pic12f629' 770 ; line_number = 76 771 ; library _pic12f629_675 exited 772 773 774 775 ; buffer = 'servo4' 776 ; line_number = 133 777 ; library _pic12f629 exited 778 ; line_number = 134 779 ; library clock4mhz entered 780 ; # Copyright (c) 2004 by Wayne C. Gramlich 781 ; # All rights reserved. 782 783 ; # This library defines the contstants {clock_rate}, {instruction_rate}, 784 ; # and {clocks_per_instruction}. 785 786 ; # Define processor constants: 787 ; buffer = 'clock4mhz' 788 ; line_number = 9 789 ; constant clock_rate = 4000000 790 003d0900 = clock_rate equ 4000000 791 ; line_number = 10 792 ; constant clocks_per_instruction = 4 793 00000004 = clocks_per_instruction equ 4 794 ; line_number = 11 795 ; constant instruction_rate = clock_rate / clocks_per_instruction 796 000f4240 = instruction_rate equ 1000000 797 798 799 ; buffer = 'servo4' 800 ; line_number = 134 801 ; library clock4mhz exited 802 803 ; line_number = 136 804 ; package pdip 805 ; line_number = 137 806 ; pin 1 = power_supply 807 ; line_number = 138 808 ; pin 2 = gp5_out, name = serial_out, mask = serial_out_mask 809 00000005 = serial_out___byte equ _gpio 810 00000005 = serial_out___bit equ 5 811 00000020 = serial_out_mask equ 32 812 ; line_number = 139 813 ; pin 3 = gp4_out, name = servo3, bit = servo3_bit 814 00000005 = servo3___byte equ _gpio 815 00000004 = servo3___bit equ 4 816 00000004 = servo3_bit equ 4 817 ; line_number = 140 818 ; pin 4 = gp3_in, name = serial_in, mask = serial_in_mask 819 00000005 = serial_in___byte equ _gpio 820 00000004 = serial_in___bit equ 4 821 00000010 = serial_in_mask equ 16 822 ; line_number = 141 823 ; pin 5 = gp2_out, name = servo2, bit = servo2_bit 824 00000005 = servo2___byte equ _gpio 825 00000002 = servo2___bit equ 2 826 00000002 = servo2_bit equ 2 827 ; line_number = 142 828 ; pin 6 = gp1_out, name = servo1, bit = servo1_bit 829 00000005 = servo1___byte equ _gpio 830 00000001 = servo1___bit equ 1 831 00000001 = servo1_bit equ 1 832 ; line_number = 143 833 ; pin 7 = gp0_out, name = servo0, bit = servo0_bit 834 00000005 = servo0___byte equ _gpio 835 00000000 = servo0___bit equ 0 836 00000000 = servo0_bit equ 0 837 ; line_number = 144 838 ; pin 8 = ground 839 840 841 ; # Define serial communication control constants: 842 ; line_number = 149 843 ; constant baud_rate = 2400 844 00000960 = baud_rate equ 2400 845 ; line_number = 150 846 ; constant instructions_per_bit = instruction_rate / baud_rate 847 000001a0 = instructions_per_bit equ 416 848 ; line_number = 151 849 ; constant delays_per_bit = 3 850 00000003 = delays_per_bit equ 3 851 ; line_number = 152 852 ; constant instructions_per_delay = instructions_per_bit / delays_per_bit 853 0000008a = instructions_per_delay equ 138 854 855 ; # Number of servos (changed only during debugging): 856 ; line_number = 155 857 ; constant servos_power = 2 858 00000002 = servos_power equ 2 859 ; line_number = 156 860 ; constant servos = (1 << servos_power) 861 00000004 = servos equ 4 862 ; line_number = 157 863 ; constant servos_maximum = (servos - 1) 864 00000003 = servos_maximum equ 3 865 ; line_number = 158 866 ; constant servos_index_mask = servos_maximum 867 00000003 = servos_index_mask equ 3 868 869 ; # Register definitions: 870 871 ; line_number = 162 872 ; global counter byte 873 00000020 = counter equ shared___globals 874 ; line_number = 163 875 ; global positions[servos] array[byte] 876 00000021 = positions equ shared___globals+1 877 ; line_number = 164 878 ; global enable_mask byte 879 00000025 = enable_mask equ shared___globals+5 880 ; line_number = 165 881 ; global servo byte 882 00000026 = servo equ shared___globals+6 883 ; line_number = 166 884 ; global glitch byte 885 00000027 = glitch equ shared___globals+7 886 ; line_number = 167 887 ; global id_index byte 888 00000028 = id_index equ shared___globals+8 889 ; line_number = 168 890 ; global state byte 891 00000029 = state equ shared___globals+9 892 ; line_number = 169 893 ; global received byte 894 0000002a = received equ shared___globals+10 895 ; line_number = 170 896 ; global buffer byte 897 0000002b = buffer equ shared___globals+11 898 ; line_number = 171 899 ; global decode_state byte 900 0000002c = decode_state equ shared___globals+12 901 ; line_number = 172 902 ; global position byte 903 0000002d = position equ shared___globals+13 904 ; line_number = 173 905 ; global previous byte 906 0000002e = previous equ shared___globals+14 907 ; line_number = 174 908 ; global amount byte 909 0000002f = amount equ shared___globals+15 910 911 ; line_number = 176 912 ; global decode_request bit 913 0000005f = decode_request___byte equ shared___globals+63 914 00000000 = decode_request___bit equ 0 915 916 ; line_number = 178 917 ; procedure main 918 0000 : main: 919 ; Need to calibrate the oscillator 920 0000 23ff call 1023 921 0001 1683 bsf __rp0___byte, __rp0___bit 922 0002 0090 movwf _osccal 923 ; Initialize some registers 924 0003 3004 movlw 4 925 0004 0085 movwf _trisio 926 ; arguments_none 927 ; line_number = 180 928 ; returns_nothing 929 930 ; # This procedure waits for commands and keeps the servo pulses going: 931 932 ; line_number = 184 933 ; local temp byte 934 00000030 = main__temp equ shared___globals+16 935 936 ; # Initialize everything: 937 ; before procedure statements delay=non-uniform, bit states=(data:X0=>X1 code:XX=>XX) 938 ; line_number = 187 939 ; servo := 0 940 0005 3000 movlw 0 941 0006 1283 bcf __rp0___byte, __rp0___bit 942 0007 00a6 movwf servo 943 ; line_number = 188 944 ; loop_exactly servos start 945 00000032 = main__1 equ shared___globals+18 946 0008 3004 movlw 4 947 0009 00b2 movwf main__1 948 000a : main__2: 949 ; line_number = 189 950 ; positions[servo] := 0x80 951 ; index_fsr_first 952 000a 0826 movf servo,w 953 000b 3e21 addlw positions 954 000c 0084 movwf __fsr 955 000d 3080 movlw 128 956 000e 0080 movwf __indf 957 ; line_number = 190 958 ; servo := servo + 1 959 000f 0aa6 incf servo,f 960 ; line_number = 188 961 ; loop_exactly servos wrap-up 962 0010 0bb2 decfsz main__1,f 963 0011 280a goto main__2 964 ; line_number = 188 965 ; loop_exactly servos done 966 ; line_number = 191 967 ; buffer := 0 968 0012 3000 movlw 0 969 0013 00ab movwf buffer 970 ; line_number = 192 971 ; counter := 0 972 0014 3000 movlw 0 973 0015 00a0 movwf counter 974 ; line_number = 193 975 ; decode_request := 0 976 0016 105f bcf decode_request___byte, decode_request___bit 977 ; line_number = 194 978 ; decode_state := 0 979 0017 3000 movlw 0 980 0018 00ac movwf decode_state 981 ; line_number = 195 982 ; enable_mask := 0 983 0019 3000 movlw 0 984 001a 00a5 movwf enable_mask 985 ; line_number = 196 986 ; glitch := 0 987 001b 3000 movlw 0 988 001c 00a7 movwf glitch 989 ; line_number = 197 990 ; id_index := 0 991 001d 3000 movlw 0 992 001e 00a8 movwf id_index 993 ; line_number = 198 994 ; position := 0 995 001f 3000 movlw 0 996 0020 00ad movwf position 997 ; line_number = 199 998 ; serial_out := 1 999 0021 1685 bsf serial_out___byte, serial_out___bit 1000 ; line_number = 200 1001 ; servo := 0 1002 0022 3000 movlw 0 1003 0023 00a6 movwf servo 1004 ; line_number = 201 1005 ; state := 0 1006 0024 3000 movlw 0 1007 0025 00a9 movwf state 1008 1009 ; # Wait for commands: 1010 ; line_number = 204 1011 ; loop_forever start 1012 0026 : main__3: 1013 ; # Loop_forever has an overhead of 2 instructions per cycle: 1014 ; line_number = 206 1015 ; delay instructions_per_delay - 2 start 1016 ; Delay expression evaluates to 136 1017 ; # This is the servo maintenence portion of the code: 1018 ; line_number = 208 1019 ; counter := counter + 1 1020 ; Delay at assignment is 0 1021 0026 0aa0 incf counter,f 1022 1023 ; line_number = 210 1024 ; switch counter & 0x1f start 1025 ; line_number = 211 1026 ; case_maximum 31 1027 0027 3000 movlw main__71>>8 1028 0028 008a movwf __pclath 1029 0029 301f movlw 31 1030 002a 0520 andwf counter,w 1031 002b 3e2d addlw main__71 1032 002c 0082 movwf __pcl 1033 ; page_group 32 1034 002d : main__71: 1035 002d 284d goto main__66 1036 002e 2895 goto main__67 1037 002f 28a7 goto main__69 1038 0030 28a7 goto main__69 1039 0031 28a7 goto main__69 1040 0032 28a7 goto main__69 1041 0033 28a7 goto main__69 1042 0034 28a7 goto main__69 1043 0035 28a7 goto main__69 1044 0036 28a7 goto main__69 1045 0037 28a7 goto main__69 1046 0038 28a7 goto main__69 1047 0039 28a7 goto main__69 1048 003a 28a7 goto main__69 1049 003b 28a7 goto main__69 1050 003c 28a7 goto main__69 1051 003d 28a7 goto main__69 1052 003e 28a7 goto main__69 1053 003f 289c goto main__68 1054 0040 28f2 goto main__70 1055 0041 28f2 goto main__70 1056 0042 28f2 goto main__70 1057 0043 28f2 goto main__70 1058 0044 28f2 goto main__70 1059 0045 28f2 goto main__70 1060 0046 28f2 goto main__70 1061 0047 28f2 goto main__70 1062 0048 28f2 goto main__70 1063 0049 28f2 goto main__70 1064 004a 28f2 goto main__70 1065 004b 28f2 goto main__70 1066 004c 28f2 goto main__70 1067 ; case_data[0] delay=82{0 } 1068 ; case_data[1] delay=1{1 } 1069 ; case_data[2] delay=5{18 } 1070 ; case_data[3] delay=78{2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 } 1071 ; case_data[4] delay=81 1072 ; Maximum Case Delay = 82 1073 ; line_number = 212 1074 ; case 0 1075 004d : main__66: 1076 ; # Counter = xss0 0000 (Turn on Servo Pulse): 1077 ; line_number = 214 1078 ; servo := (counter >> 5) & servos_index_mask 1079 ; Delay at assignment is 0 1080 00000032 = main__4 equ shared___globals+18 1081 004d 0e20 swapf counter,w 1082 004e 00b2 movwf main__4 1083 004f 0c32 rrf main__4,w 1084 0050 3903 andlw 3 1085 0051 00a6 movwf servo 1086 ; line_number = 215 1087 ; position := positions[servo] 1088 ; Delay at assignment is 5 1089 0052 0826 movf servo,w 1090 0053 3e21 addlw positions 1091 0054 0084 movwf __fsr 1092 0055 0800 movf __indf,w 1093 0056 00ad movwf position 1094 ; line_number = 216 1095 ; if position@3 start 1096 ; Delay at if is 10 1097 0000002d = main__select__31___byte equ position 1098 00000003 = main__select__31___bit equ 3 1099 ; (after recombine) true_delay=13, false_delay=69 uniform_delay=true 1100 ; CASE: true_code_size > 1 && false_code_size > 1 1101 ; true_code_size=14 false_code_size=22 1102 0057 1dad btfss main__select__31___byte, main__select__31___bit 1103 0058 2876 goto main__32 1104 ; # Long pulse -- turn on immediately: 1105 ; line_number = 218 1106 ; switch servo start 1107 0059 3000 movlw main__28>>8 1108 005a 008a movwf __pclath 1109 005b 0826 movf servo,w 1110 005c 3e5e addlw main__28 1111 005d 0082 movwf __pcl 1112 ; page_group 4 1113 005e : main__28: 1114 005e 2862 goto main__24 1115 005f 2865 goto main__25 1116 0060 2868 goto main__26 1117 0061 286b goto main__27 1118 ; case_data[0] delay=2{0 } 1119 ; case_data[1] delay=2{1 } 1120 ; case_data[2] delay=2{2 } 1121 ; case_data[3] delay=2{3 } 1122 ; Maximum Case Delay = 2 1123 ; line_number = 219 1124 ; case 0 1125 0062 : main__24: 1126 ; # Servo 0: 1127 ; line_number = 221 1128 ; if enable_mask@0 start 1129 ; Delay at if is 0 1130 00000025 = main__select__20___byte equ enable_mask 1131 00000000 = main__select__20___bit equ 0 1132 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1133 ; CASE: True.size=1 False.size=0 1134 0062 1825 btfsc main__select__20___byte, main__select__20___bit 1135 ; line_number = 222 1136 ; servo0 := 1 1137 ; Delay at assignment is 0 1138 0063 1405 bsf servo0___byte, servo0___bit 1139 ; code.delay=2 back_code.delay=0 1140 ; <=bit_code_emit@symbol; sym=main__select__20 (data:X0=>X0 code:XX=>XX) 1141 ; if final true delay=1 false delay=0 code delay=2 1142 ; line_number = 221 1143 ; if enable_mask@0 done 1144 0064 286e goto main__29 1145 ; line_number = 223 1146 ; case 1 1147 0065 : main__25: 1148 ; # Servo 1: 1149 ; line_number = 225 1150 ; if enable_mask@1 start 1151 ; Delay at if is 0 1152 00000025 = main__select__21___byte equ enable_mask 1153 00000001 = main__select__21___bit equ 1 1154 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1155 ; CASE: True.size=1 False.size=0 1156 0065 18a5 btfsc main__select__21___byte, main__select__21___bit 1157 ; line_number = 226 1158 ; servo1 := 1 1159 ; Delay at assignment is 0 1160 0066 1485 bsf servo1___byte, servo1___bit 1161 ; code.delay=2 back_code.delay=0 1162 ; <=bit_code_emit@symbol; sym=main__select__21 (data:X0=>X0 code:XX=>XX) 1163 ; if final true delay=1 false delay=0 code delay=2 1164 ; line_number = 225 1165 ; if enable_mask@1 done 1166 0067 286e goto main__29 1167 ; line_number = 227 1168 ; case 2 1169 0068 : main__26: 1170 ; # Servo 2: 1171 ; line_number = 229 1172 ; if enable_mask@2 start 1173 ; Delay at if is 0 1174 00000025 = main__select__22___byte equ enable_mask 1175 00000002 = main__select__22___bit equ 2 1176 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1177 ; CASE: True.size=1 False.size=0 1178 0068 1925 btfsc main__select__22___byte, main__select__22___bit 1179 ; line_number = 230 1180 ; servo2 := 1 1181 ; Delay at assignment is 0 1182 0069 1505 bsf servo2___byte, servo2___bit 1183 ; code.delay=2 back_code.delay=0 1184 ; <=bit_code_emit@symbol; sym=main__select__22 (data:X0=>X0 code:XX=>XX) 1185 ; if final true delay=1 false delay=0 code delay=2 1186 ; line_number = 229 1187 ; if enable_mask@2 done 1188 006a 286e goto main__29 1189 ; line_number = 231 1190 ; case 3 1191 006b : main__27: 1192 ; # Servo 3: 1193 ; line_number = 233 1194 ; if enable_mask@3 start 1195 ; Delay at if is 0 1196 00000025 = main__select__23___byte equ enable_mask 1197 00000003 = main__select__23___bit equ 3 1198 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1199 ; CASE: True.size=1 False.size=0 1200 006b 19a5 btfsc main__select__23___byte, main__select__23___bit 1201 ; line_number = 234 1202 ; servo3 := 1 1203 ; Delay at assignment is 0 1204 006c 1605 bsf servo3___byte, servo3___bit 1205 ; code.delay=2 back_code.delay=0 1206 ; <=bit_code_emit@symbol; sym=main__select__23 (data:X0=>X0 code:XX=>XX) 1207 ; if final true delay=1 false delay=0 code delay=2 1208 ; line_number = 233 1209 ; if enable_mask@3 done 1210 006d 286e goto main__29 1211 006e : main__29: 1212 ; switch end:(data:X0=>X0 code:XX=>XX) 1213 ; line_number = 218 1214 ; switch servo done 1215 ; line_number = 235 1216 ; position@3 := 0 1217 ; Delay at assignment is 12 1218 0000002d = main__select__30___byte equ position 1219 00000003 = main__select__30___bit equ 3 1220 006e 11ad bcf main__select__30___byte, main__select__30___bit 1221 ; Delay 55 cycles 1222 ; Delay loop takes 13 * 4 = 52 cycles 1223 006f 300d movlw 13 1224 0070 : main__34: 1225 0070 3eff addlw 255 1226 0071 1d03 btfss __z___byte, __z___bit 1227 0072 2870 goto main__34 1228 0073 2874 goto main__35 1229 0074 : main__35: 1230 0074 0000 nop 1231 0075 2894 goto main__33 1232 0076 : main__32: 1233 ; # Short pulse turn on after approximately half a tick: 1234 ; Delay at delay is 0 1235 ; line_number = 238 1236 ; delay 67 start 1237 ; Delay expression evaluates to 67 1238 ; # We've got plenty of time to set things up during 1239 ; # this delay, but not much time after that. 1240 ; line_number = 241 1241 ; temp := _gpio & (serial_in_mask | serial_out_mask) 1242 ; Delay at assignment is 0 1243 0076 3030 movlw 48 1244 0077 0505 andwf _gpio,w 1245 0078 00b0 movwf main__temp 1246 ; line_number = 242 1247 ; switch servo start 1248 0079 3000 movlw main__17>>8 1249 007a 008a movwf __pclath 1250 007b 0826 movf servo,w 1251 007c 3e7e addlw main__17 1252 007d 0082 movwf __pcl 1253 ; page_group 4 1254 007e : main__17: 1255 007e 2882 goto main__13 1256 007f 2885 goto main__14 1257 0080 2888 goto main__15 1258 0081 288b goto main__16 1259 ; case_data[0] delay=2{0 } 1260 ; case_data[1] delay=2{1 } 1261 ; case_data[2] delay=2{2 } 1262 ; case_data[3] delay=2{3 } 1263 ; Maximum Case Delay = 2 1264 ; line_number = 243 1265 ; case 0 1266 0082 : main__13: 1267 ; # Servo 0: 1268 ; line_number = 245 1269 ; if enable_mask@0 start 1270 ; Delay at if is 0 1271 00000025 = main__select__6___byte equ enable_mask 1272 00000000 = main__select__6___bit equ 0 1273 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1274 ; CASE: True.size=1 False.size=0 1275 0082 1825 btfsc main__select__6___byte, main__select__6___bit 1276 ; line_number = 246 1277 ; temp@servo0_bit := 1 1278 ; Delay at assignment is 0 1279 00000030 = main__select__5___byte equ main__temp 1280 00000000 = main__select__5___bit equ 0 1281 0083 1430 bsf main__select__5___byte, main__select__5___bit 1282 ; code.delay=2 back_code.delay=0 1283 ; <=bit_code_emit@symbol; sym=main__select__6 (data:X0=>X0 code:XX=>XX) 1284 ; if final true delay=1 false delay=0 code delay=2 1285 ; line_number = 245 1286 ; if enable_mask@0 done 1287 0084 288e goto main__18 1288 ; line_number = 247 1289 ; case 1 1290 0085 : main__14: 1291 ; # Servo 1: 1292 ; line_number = 249 1293 ; if enable_mask@1 start 1294 ; Delay at if is 0 1295 00000025 = main__select__8___byte equ enable_mask 1296 00000001 = main__select__8___bit equ 1 1297 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1298 ; CASE: True.size=1 False.size=0 1299 0085 18a5 btfsc main__select__8___byte, main__select__8___bit 1300 ; line_number = 250 1301 ; temp@servo1_bit := 1 1302 ; Delay at assignment is 0 1303 00000030 = main__select__7___byte equ main__temp 1304 00000001 = main__select__7___bit equ 1 1305 0086 14b0 bsf main__select__7___byte, main__select__7___bit 1306 ; code.delay=2 back_code.delay=0 1307 ; <=bit_code_emit@symbol; sym=main__select__8 (data:X0=>X0 code:XX=>XX) 1308 ; if final true delay=1 false delay=0 code delay=2 1309 ; line_number = 249 1310 ; if enable_mask@1 done 1311 0087 288e goto main__18 1312 ; line_number = 251 1313 ; case 2 1314 0088 : main__15: 1315 ; # Servo 2: 1316 ; line_number = 253 1317 ; if enable_mask@2 start 1318 ; Delay at if is 0 1319 00000025 = main__select__10___byte equ enable_mask 1320 00000002 = main__select__10___bit equ 2 1321 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1322 ; CASE: True.size=1 False.size=0 1323 0088 1925 btfsc main__select__10___byte, main__select__10___bit 1324 ; line_number = 254 1325 ; temp@servo2_bit := 1 1326 ; Delay at assignment is 0 1327 00000030 = main__select__9___byte equ main__temp 1328 00000002 = main__select__9___bit equ 2 1329 0089 1530 bsf main__select__9___byte, main__select__9___bit 1330 ; code.delay=2 back_code.delay=0 1331 ; <=bit_code_emit@symbol; sym=main__select__10 (data:X0=>X0 code:XX=>XX) 1332 ; if final true delay=1 false delay=0 code delay=2 1333 ; line_number = 253 1334 ; if enable_mask@2 done 1335 008a 288e goto main__18 1336 ; line_number = 255 1337 ; case 3 1338 008b : main__16: 1339 ; # Servo 3: 1340 ; line_number = 257 1341 ; if enable_mask@3 start 1342 ; Delay at if is 0 1343 00000025 = main__select__12___byte equ enable_mask 1344 00000003 = main__select__12___bit equ 3 1345 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1346 ; CASE: True.size=1 False.size=0 1347 008b 19a5 btfsc main__select__12___byte, main__select__12___bit 1348 ; line_number = 258 1349 ; temp@servo3_bit := 1 1350 ; Delay at assignment is 0 1351 00000030 = main__select__11___byte equ main__temp 1352 00000004 = main__select__11___bit equ 4 1353 008c 1630 bsf main__select__11___byte, main__select__11___bit 1354 ; code.delay=2 back_code.delay=0 1355 ; <=bit_code_emit@symbol; sym=main__select__12 (data:X0=>X0 code:XX=>XX) 1356 ; if final true delay=1 false delay=0 code delay=2 1357 ; line_number = 257 1358 ; if enable_mask@3 done 1359 008d 288e goto main__18 1360 008e : main__18: 1361 ; switch end:(data:X0=>X0 code:XX=>XX) 1362 ; line_number = 242 1363 ; switch servo done 1364 ; Delay 52 cycles 1365 ; Delay loop takes 13 * 4 = 52 cycles 1366 008e 300d movlw 13 1367 008f : main__19: 1368 008f 3eff addlw 255 1369 0090 1d03 btfss __z___byte, __z___bit 1370 0091 288f goto main__19 1371 ; line_number = 238 1372 ; delay 67 done 1373 ; # Now just store the the result into {_gpio}: 1374 ; line_number = 260 1375 ; _gpio := temp 1376 ; Delay at assignment is 67 1377 0092 0830 movf main__temp,w 1378 0093 0085 movwf _gpio 1379 0094 : main__33: 1380 ; code.delay=82 back_code.delay=0 1381 ; <=bit_code_emit@symbol; sym=main__select__31 (data:X0=>X0 code:XX=>XX) 1382 ; if final true delay=13 false delay=69 code delay=82 1383 ; line_number = 216 1384 ; if position@3 done 1385 0094 28fe goto main__72 1386 ; line_number = 261 1387 ; case 1 1388 0095 : main__67: 1389 ; # Do nothing. (Leave pulse on): 1390 ; line_number = 263 1391 ; watch_dog_reset done 1392 ; Delay at watch_dog_reset is 0 1393 0095 0064 clrwdt 1394 ; Delay 81 cycles 1395 ; Delay loop takes 20 * 4 = 80 cycles 1396 0096 3014 movlw 20 1397 0097 : main__73: 1398 0097 3eff addlw 255 1399 0098 1d03 btfss __z___byte, __z___bit 1400 0099 2897 goto main__73 1401 009a 0000 nop 1402 009b 28fe goto main__72 1403 ; line_number = 264 1404 ; case 18 1405 009c : main__68: 1406 ; # Fail safe. Turn all servos off: 1407 ; line_number = 266 1408 ; watch_dog_reset done 1409 ; Delay at watch_dog_reset is 0 1410 009c 0064 clrwdt 1411 ; line_number = 267 1412 ; servo0 := 0 1413 ; Delay at assignment is 1 1414 009d 1005 bcf servo0___byte, servo0___bit 1415 ; line_number = 268 1416 ; servo1 := 0 1417 ; Delay at assignment is 2 1418 009e 1085 bcf servo1___byte, servo1___bit 1419 ; line_number = 269 1420 ; servo2 := 0 1421 ; Delay at assignment is 3 1422 009f 1105 bcf servo2___byte, servo2___bit 1423 ; line_number = 270 1424 ; servo3 := 0 1425 ; Delay at assignment is 4 1426 00a0 1205 bcf servo3___byte, servo3___bit 1427 ; Delay 77 cycles 1428 ; Delay loop takes 19 * 4 = 76 cycles 1429 00a1 3013 movlw 19 1430 00a2 : main__74: 1431 00a2 3eff addlw 255 1432 00a3 1d03 btfss __z___byte, __z___bit 1433 00a4 28a2 goto main__74 1434 00a5 0000 nop 1435 00a6 28fe goto main__72 1436 ; line_number = 271 1437 ; case 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 1438 00a7 : main__69: 1439 ; # Servo service: 1440 ; line_number = 273 1441 ; position := position + 1 1442 ; Delay at assignment is 0 1443 00a7 0aad incf position,f 1444 ; line_number = 274 1445 ; switch servo start 1446 00a8 3000 movlw main__60>>8 1447 00a9 008a movwf __pclath 1448 00aa 0826 movf servo,w 1449 00ab 3ead addlw main__60 1450 00ac 0082 movwf __pcl 1451 ; page_group 4 1452 00ad : main__60: 1453 00ad 28b1 goto main__56 1454 00ae 28c0 goto main__57 1455 00af 28cf goto main__58 1456 00b0 28de goto main__59 1457 ; case_data[0] delay=65{0 } 1458 ; case_data[1] delay=65{1 } 1459 ; case_data[2] delay=65{2 } 1460 ; case_data[3] delay=65{3 } 1461 ; Maximum Case Delay = 65 1462 ; line_number = 275 1463 ; case 0 1464 00b1 : main__56: 1465 ; Delay at delay is 0 1466 ; line_number = 276 1467 ; delay 65 start 1468 ; Delay expression evaluates to 65 1469 ; line_number = 277 1470 ; loop_exactly 4 start 1471 ; Delay at loop_exactly is 0 1472 00000032 = main__36 equ shared___globals+18 1473 00b1 3004 movlw 4 1474 00b2 00b2 movwf main__36 1475 00b3 : main__37: 1476 ; line_number = 278 1477 ; position := position - 1 1478 ; Delay at assignment is 0 1479 00b3 03ad decf position,f 1480 ; line_number = 279 1481 ; if _z start 1482 ; Delay at if is 1 1483 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1484 ; CASE: True.size=1 False.size=0 1485 00b4 1903 btfsc _z___byte, _z___bit 1486 ; line_number = 280 1487 ; servo0 := 0 1488 ; Delay at assignment is 0 1489 00b5 1005 bcf servo0___byte, servo0___bit 1490 ; code.delay=3 back_code.delay=0 1491 ; <=bit_code_emit@symbol; sym=_z (data:X0=>X0 code:XX=>XX) 1492 ; if final true delay=1 false delay=0 code delay=3 1493 ; line_number = 279 1494 ; if _z done 1495 ; Delay at delay is 3 1496 ; line_number = 281 1497 ; delay 5 start 1498 ; Delay expression evaluates to 5 1499 ; line_number = 282 1500 ; do_nothing 1501 ; Delay 5 cycles 1502 00b6 28b7 goto main__38 1503 00b7 : main__38: 1504 00b7 28b8 goto main__39 1505 00b8 : main__39: 1506 00b8 0000 nop 1507 ; line_number = 281 1508 ; delay 5 done 1509 ; line_number = 283 1510 ; position := position - 1 1511 ; Delay at assignment is 8 1512 00b9 03ad decf position,f 1513 ; line_number = 284 1514 ; if _z start 1515 ; Delay at if is 9 1516 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1517 ; CASE: True.size=1 False.size=0 1518 00ba 1903 btfsc _z___byte, _z___bit 1519 ; line_number = 285 1520 ; servo0 := 0 1521 ; Delay at assignment is 0 1522 00bb 1005 bcf servo0___byte, servo0___bit 1523 ; code.delay=11 back_code.delay=0 1524 ; <=bit_code_emit@symbol; sym=_z (data:X0=>X0 code:XX=>XX) 1525 ; if final true delay=1 false delay=0 code delay=11 1526 ; line_number = 284 1527 ; if _z done 1528 ; Delay at delay is 11 1529 ; line_number = 286 1530 ; delay 2 start 1531 ; Delay expression evaluates to 2 1532 ; line_number = 287 1533 ; do_nothing 1534 ; Delay 2 cycles 1535 00bc 28bd goto main__40 1536 00bd : main__40: 1537 ; line_number = 286 1538 ; delay 2 done 1539 ; line_number = 277 1540 ; loop_exactly 4 wrap-up 1541 00bd 0bb2 decfsz main__36,f 1542 00be 28b3 goto main__37 1543 ; loop_exactly delay after all=65 1544 ; line_number = 277 1545 ; loop_exactly 4 done 1546 ; line_number = 276 1547 ; delay 65 done 1548 00bf 28ed goto main__61 1549 ; line_number = 288 1550 ; case 1 1551 00c0 : main__57: 1552 ; line_number = 289 1553 ; loop_exactly 4 start 1554 ; Delay at loop_exactly is 0 1555 00000032 = main__41 equ shared___globals+18 1556 00c0 3004 movlw 4 1557 00c1 00b2 movwf main__41 1558 00c2 : main__42: 1559 ; line_number = 290 1560 ; position := position - 1 1561 ; Delay at assignment is 0 1562 00c2 03ad decf position,f 1563 ; line_number = 291 1564 ; if _z start 1565 ; Delay at if is 1 1566 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1567 ; CASE: True.size=1 False.size=0 1568 00c3 1903 btfsc _z___byte, _z___bit 1569 ; line_number = 292 1570 ; servo1 := 0 1571 ; Delay at assignment is 0 1572 00c4 1085 bcf servo1___byte, servo1___bit 1573 ; code.delay=3 back_code.delay=0 1574 ; <=bit_code_emit@symbol; sym=_z (data:X0=>X0 code:XX=>XX) 1575 ; if final true delay=1 false delay=0 code delay=3 1576 ; line_number = 291 1577 ; if _z done 1578 ; Delay at delay is 3 1579 ; line_number = 293 1580 ; delay 5 start 1581 ; Delay expression evaluates to 5 1582 ; line_number = 294 1583 ; do_nothing 1584 ; Delay 5 cycles 1585 00c5 28c6 goto main__43 1586 00c6 : main__43: 1587 00c6 28c7 goto main__44 1588 00c7 : main__44: 1589 00c7 0000 nop 1590 ; line_number = 293 1591 ; delay 5 done 1592 ; line_number = 295 1593 ; position := position - 1 1594 ; Delay at assignment is 8 1595 00c8 03ad decf position,f 1596 ; line_number = 296 1597 ; if _z start 1598 ; Delay at if is 9 1599 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1600 ; CASE: True.size=1 False.size=0 1601 00c9 1903 btfsc _z___byte, _z___bit 1602 ; line_number = 297 1603 ; servo1 := 0 1604 ; Delay at assignment is 0 1605 00ca 1085 bcf servo1___byte, servo1___bit 1606 ; code.delay=11 back_code.delay=0 1607 ; <=bit_code_emit@symbol; sym=_z (data:X0=>X0 code:XX=>XX) 1608 ; if final true delay=1 false delay=0 code delay=11 1609 ; line_number = 296 1610 ; if _z done 1611 ; Delay at delay is 11 1612 ; line_number = 298 1613 ; delay 2 start 1614 ; Delay expression evaluates to 2 1615 ; line_number = 299 1616 ; do_nothing 1617 ; Delay 2 cycles 1618 00cb 28cc goto main__45 1619 00cc : main__45: 1620 ; line_number = 298 1621 ; delay 2 done 1622 ; line_number = 289 1623 ; loop_exactly 4 wrap-up 1624 00cc 0bb2 decfsz main__41,f 1625 00cd 28c2 goto main__42 1626 ; loop_exactly delay after all=65 1627 ; line_number = 289 1628 ; loop_exactly 4 done 1629 00ce 28ed goto main__61 1630 ; line_number = 300 1631 ; case 2 1632 00cf : main__58: 1633 ; line_number = 301 1634 ; loop_exactly 4 start 1635 ; Delay at loop_exactly is 0 1636 00000032 = main__46 equ shared___globals+18 1637 00cf 3004 movlw 4 1638 00d0 00b2 movwf main__46 1639 00d1 : main__47: 1640 ; line_number = 302 1641 ; position := position - 1 1642 ; Delay at assignment is 0 1643 00d1 03ad decf position,f 1644 ; line_number = 303 1645 ; if _z start 1646 ; Delay at if is 1 1647 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1648 ; CASE: True.size=1 False.size=0 1649 00d2 1903 btfsc _z___byte, _z___bit 1650 ; line_number = 304 1651 ; servo2 := 0 1652 ; Delay at assignment is 0 1653 00d3 1105 bcf servo2___byte, servo2___bit 1654 ; code.delay=3 back_code.delay=0 1655 ; <=bit_code_emit@symbol; sym=_z (data:X0=>X0 code:XX=>XX) 1656 ; if final true delay=1 false delay=0 code delay=3 1657 ; line_number = 303 1658 ; if _z done 1659 ; Delay at delay is 3 1660 ; line_number = 305 1661 ; delay 5 start 1662 ; Delay expression evaluates to 5 1663 ; line_number = 306 1664 ; do_nothing 1665 ; Delay 5 cycles 1666 00d4 28d5 goto main__48 1667 00d5 : main__48: 1668 00d5 28d6 goto main__49 1669 00d6 : main__49: 1670 00d6 0000 nop 1671 ; line_number = 305 1672 ; delay 5 done 1673 ; line_number = 307 1674 ; position := position - 1 1675 ; Delay at assignment is 8 1676 00d7 03ad decf position,f 1677 ; line_number = 308 1678 ; if _z start 1679 ; Delay at if is 9 1680 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1681 ; CASE: True.size=1 False.size=0 1682 00d8 1903 btfsc _z___byte, _z___bit 1683 ; line_number = 309 1684 ; servo2 := 0 1685 ; Delay at assignment is 0 1686 00d9 1105 bcf servo2___byte, servo2___bit 1687 ; code.delay=11 back_code.delay=0 1688 ; <=bit_code_emit@symbol; sym=_z (data:X0=>X0 code:XX=>XX) 1689 ; if final true delay=1 false delay=0 code delay=11 1690 ; line_number = 308 1691 ; if _z done 1692 ; Delay at delay is 11 1693 ; line_number = 310 1694 ; delay 2 start 1695 ; Delay expression evaluates to 2 1696 ; line_number = 311 1697 ; do_nothing 1698 ; Delay 2 cycles 1699 00da 28db goto main__50 1700 00db : main__50: 1701 ; line_number = 310 1702 ; delay 2 done 1703 ; line_number = 301 1704 ; loop_exactly 4 wrap-up 1705 00db 0bb2 decfsz main__46,f 1706 00dc 28d1 goto main__47 1707 ; loop_exactly delay after all=65 1708 ; line_number = 301 1709 ; loop_exactly 4 done 1710 00dd 28ed goto main__61 1711 ; line_number = 312 1712 ; case 3 1713 00de : main__59: 1714 ; line_number = 313 1715 ; loop_exactly 4 start 1716 ; Delay at loop_exactly is 0 1717 00000032 = main__51 equ shared___globals+18 1718 00de 3004 movlw 4 1719 00df 00b2 movwf main__51 1720 00e0 : main__52: 1721 ; line_number = 314 1722 ; position := position - 1 1723 ; Delay at assignment is 0 1724 00e0 03ad decf position,f 1725 ; line_number = 315 1726 ; if _z start 1727 ; Delay at if is 1 1728 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1729 ; CASE: True.size=1 False.size=0 1730 00e1 1903 btfsc _z___byte, _z___bit 1731 ; line_number = 316 1732 ; servo3 := 0 1733 ; Delay at assignment is 0 1734 00e2 1205 bcf servo3___byte, servo3___bit 1735 ; code.delay=3 back_code.delay=0 1736 ; <=bit_code_emit@symbol; sym=_z (data:X0=>X0 code:XX=>XX) 1737 ; if final true delay=1 false delay=0 code delay=3 1738 ; line_number = 315 1739 ; if _z done 1740 ; Delay at delay is 3 1741 ; line_number = 317 1742 ; delay 5 start 1743 ; Delay expression evaluates to 5 1744 ; line_number = 318 1745 ; do_nothing 1746 ; Delay 5 cycles 1747 00e3 28e4 goto main__53 1748 00e4 : main__53: 1749 00e4 28e5 goto main__54 1750 00e5 : main__54: 1751 00e5 0000 nop 1752 ; line_number = 317 1753 ; delay 5 done 1754 ; line_number = 319 1755 ; position := position - 1 1756 ; Delay at assignment is 8 1757 00e6 03ad decf position,f 1758 ; line_number = 320 1759 ; if _z start 1760 ; Delay at if is 9 1761 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 1762 ; CASE: True.size=1 False.size=0 1763 00e7 1903 btfsc _z___byte, _z___bit 1764 ; line_number = 321 1765 ; servo3 := 0 1766 ; Delay at assignment is 0 1767 00e8 1205 bcf servo3___byte, servo3___bit 1768 ; code.delay=11 back_code.delay=0 1769 ; <=bit_code_emit@symbol; sym=_z (data:X0=>X0 code:XX=>XX) 1770 ; if final true delay=1 false delay=0 code delay=11 1771 ; line_number = 320 1772 ; if _z done 1773 ; Delay at delay is 11 1774 ; line_number = 322 1775 ; delay 2 start 1776 ; Delay expression evaluates to 2 1777 ; line_number = 323 1778 ; do_nothing 1779 ; Delay 2 cycles 1780 00e9 28ea goto main__55 1781 00ea : main__55: 1782 ; line_number = 322 1783 ; delay 2 done 1784 ; line_number = 313 1785 ; loop_exactly 4 wrap-up 1786 00ea 0bb2 decfsz main__51,f 1787 00eb 28e0 goto main__52 1788 ; loop_exactly delay after all=65 1789 ; line_number = 313 1790 ; loop_exactly 4 done 1791 00ec 28ed goto main__61 1792 00ed : main__61: 1793 ; switch end:(data:X0=>X0 code:XX=>XX) 1794 ; line_number = 274 1795 ; switch servo done 1796 ; line_number = 324 1797 ; position := position - 1 1798 ; Delay at assignment is 76 1799 00ed 03ad decf position,f 1800 ; line_number = 325 1801 ; position@3 := 0 1802 ; Delay at assignment is 77 1803 0000002d = main__select__62___byte equ position 1804 00000003 = main__select__62___bit equ 3 1805 00ee 11ad bcf main__select__62___byte, main__select__62___bit 1806 ; Delay 4 cycles 1807 00ef 28f0 goto main__75 1808 00f0 : main__75: 1809 00f0 28f1 goto main__76 1810 00f1 : main__76: 1811 00f1 28fe goto main__72 1812 ; line_number = 326 1813 ; default 1814 00f2 : main__70: 1815 ; # Do decode when we are not busy servicing the servos: 1816 ; line_number = 328 1817 ; if decode_request start 1818 ; Delay at if is 0 1819 ; (after recombine) true_delay=78, false_delay=0 uniform_delay=true 1820 ; CASE: true_code.size = 0 && false_code.size > 1 1821 ; bit_code_emit_helper1: body_code.size=2 true_test=true body_code.delay=78 (uniform delay) 1822 00f2 185f btfsc decode_request___byte, decode_request___bit 1823 00f3 28fa goto main__63 1824 ; Delay 77 cycles 1825 ; Delay loop takes 19 * 4 = 76 cycles 1826 00f4 3013 movlw 19 1827 00f5 : main__65: 1828 00f5 3eff addlw 255 1829 00f6 1d03 btfss __z___byte, __z___bit 1830 00f7 28f5 goto main__65 1831 00f8 0000 nop 1832 00f9 28fc goto main__64 1833 00fa : main__63: 1834 ; line_number = 329 1835 ; decode_request := 0 1836 ; Delay at assignment is 0 1837 00fa 105f bcf decode_request___byte, decode_request___bit 1838 ; line_number = 330 1839 ; call decode() 1840 ; Delay at call is 1 1841 00fb 217b call decode 1842 1843 00fc : main__64: 1844 ; code.delay=81 back_code.delay=0 1845 ; <=bit_code_emit@symbol; sym=decode_request (data:X0=>X0 code:XX=>XX) 1846 ; if final true delay=78 false delay=0 code delay=81 1847 ; line_number = 328 1848 ; if decode_request done 1849 ; Delay 1 cycles 1850 00fc 0000 nop 1851 00fd 28fe goto main__72 1852 00fe : main__72: 1853 ; switch end:(data:X0=>X? code:XX=>XX) 1854 ; line_number = 210 1855 ; switch counter & 0x1f done 1856 ; # This is the serial I/O state machine. It is very 1857 ; # carefully coded to take as few cycles as possible. 1858 ; line_number = 334 1859 ; switch state start 1860 ; line_number = 335 1861 ; case_maximum 61 1862 00fe 3001 movlw main__89>>8 1863 00ff 008a movwf __pclath 1864 0100 1283 bcf __rp0___byte, __rp0___bit 1865 0101 0829 movf state,w 1866 0102 3e04 addlw main__89 1867 0103 0082 movwf __pcl 1868 ; page_group 62 1869 0104 : main__89: 1870 0104 2942 goto main__79 1871 0105 2971 goto main__88 1872 0106 2971 goto main__88 1873 0107 2947 goto main__80 1874 0108 294c goto main__81 1875 0109 2971 goto main__88 1876 010a 2947 goto main__80 1877 010b 294c goto main__81 1878 010c 2971 goto main__88 1879 010d 2947 goto main__80 1880 010e 294c goto main__81 1881 010f 2971 goto main__88 1882 0110 2947 goto main__80 1883 0111 294c goto main__81 1884 0112 2971 goto main__88 1885 0113 2947 goto main__80 1886 0114 294c goto main__81 1887 0115 2971 goto main__88 1888 0116 2947 goto main__80 1889 0117 294c goto main__81 1890 0118 2971 goto main__88 1891 0119 2947 goto main__80 1892 011a 294c goto main__81 1893 011b 2971 goto main__88 1894 011c 2947 goto main__80 1895 011d 294c goto main__81 1896 011e 2971 goto main__88 1897 011f 2971 goto main__88 1898 0120 2971 goto main__88 1899 0121 2951 goto main__82 1900 0122 2971 goto main__88 1901 0123 2957 goto main__83 1902 0124 2971 goto main__88 1903 0125 2971 goto main__88 1904 0126 295c goto main__84 1905 0127 2962 goto main__85 1906 0128 2971 goto main__88 1907 0129 295c goto main__84 1908 012a 2962 goto main__85 1909 012b 2971 goto main__88 1910 012c 295c goto main__84 1911 012d 2962 goto main__85 1912 012e 2971 goto main__88 1913 012f 295c goto main__84 1914 0130 2962 goto main__85 1915 0131 2971 goto main__88 1916 0132 295c goto main__84 1917 0133 2962 goto main__85 1918 0134 2971 goto main__88 1919 0135 295c goto main__84 1920 0136 2962 goto main__85 1921 0137 2971 goto main__88 1922 0138 295c goto main__84 1923 0139 2962 goto main__85 1924 013a 2971 goto main__88 1925 013b 295c goto main__84 1926 013c 2971 goto main__88 1927 013d 2971 goto main__88 1928 013e 2967 goto main__86 1929 013f 2971 goto main__88 1930 0140 296c goto main__87 1931 0141 2971 goto main__88 1932 ; case_data[0] delay=2{0 } 1933 ; case_data[1] delay=3{3 6 9 12 15 18 21 24 } 1934 ; case_data[2] delay=3{4 7 10 13 16 19 22 25 } 1935 ; case_data[3] delay=5{29 } 1936 ; case_data[4] delay=2{31 } 1937 ; case_data[5] delay=4{34 37 40 43 46 49 52 55 } 1938 ; case_data[6] delay=3{35 38 41 44 47 50 53 } 1939 ; case_data[7] delay=2{58 } 1940 ; case_data[8] delay=2{60 } 1941 ; case_data[9] delay=1 1942 ; Maximum Case Delay = 5 1943 ; line_number = 336 1944 ; case 0 1945 0142 : main__79: 1946 ; # This is the wait for next byte state: 1947 1948 ; # We test for the start bit: 1949 ; line_number = 340 1950 ; if !serial_in start 1951 ; Delay at if is 0 1952 ; (after recombine) true_delay=0, false_delay=1 uniform_delay=true 1953 ; CASE: true_code.size=0 && false_code.size=1 1954 0142 1e05 btfss serial_in___byte, serial_in___bit 1955 ; # We have a start bit! Now sequence through the 1956 ; # remaining states: 1957 ; line_number = 343 1958 ; state := state + 1 1959 ; Delay at assignment is 0 1960 0143 0aa9 incf state,f 1961 ; code.delay=2 back_code.delay=0 1962 ; <=bit_code_emit@symbol; sym=serial_in (data:X0=>X0 code:XX=>XX) 1963 ; if final true delay=1 false delay=0 code delay=2 1964 ; line_number = 340 1965 ; if !serial_in done 1966 ; Delay 3 cycles 1967 0144 2945 goto main__91 1968 0145 : main__91: 1969 0145 0000 nop 1970 0146 2975 goto main__90 1971 ; line_number = 344 1972 ; case 3, 6, 9, 12, 15, 18, 21, 24 1973 0147 : main__80: 1974 ; # Shift the buffer byte over by one bit: 1975 ; line_number = 346 1976 ; state := state + 1 1977 ; Delay at assignment is 0 1978 0147 0aa9 incf state,f 1979 ; line_number = 347 1980 ; buffer := buffer >> 1 1981 ; Delay at assignment is 1 1982 ; Assignment of variable to self (no code needed) 1983 0148 0cab rrf buffer,f 1984 0149 13ab bcf buffer, 7 1985 ; Delay 2 cycles 1986 014a 294b goto main__92 1987 014b : main__92: 1988 014b 2975 goto main__90 1989 ; line_number = 348 1990 ; case 4, 7, 10, 13, 16, 19, 22, 25 1991 014c : main__81: 1992 ; # Test to see whether we have a bit or not: 1993 ; line_number = 350 1994 ; state := state + 1 1995 ; Delay at assignment is 0 1996 014c 0aa9 incf state,f 1997 ; line_number = 351 1998 ; if serial_in start 1999 ; Delay at if is 1 2000 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 2001 ; CASE: True.size=1 False.size=0 2002 014d 1a05 btfsc serial_in___byte, serial_in___bit 2003 ; line_number = 352 2004 ; buffer@7 := 1 2005 ; Delay at assignment is 0 2006 0000002b = main__select__77___byte equ buffer 2007 00000007 = main__select__77___bit equ 7 2008 014e 17ab bsf main__select__77___byte, main__select__77___bit 2009 ; code.delay=3 back_code.delay=0 2010 ; <=bit_code_emit@symbol; sym=serial_in (data:X0=>X0 code:XX=>XX) 2011 ; if final true delay=1 false delay=0 code delay=3 2012 ; line_number = 351 2013 ; if serial_in done 2014 ; Delay 2 cycles 2015 014f 2950 goto main__93 2016 0150 : main__93: 2017 0150 2975 goto main__90 2018 ; line_number = 353 2019 ; case 29 2020 0151 : main__82: 2021 ; # We are done receiving. We stop 2/3's of the way 2022 ; # through the stop bit: 2023 ; line_number = 356 2024 ; state := 0 2025 ; Delay at assignment is 0 2026 0151 3000 movlw 0 2027 0152 00a9 movwf state 2028 ; line_number = 357 2029 ; received := buffer 2030 ; Delay at assignment is 2 2031 0153 082b movf buffer,w 2032 0154 00aa movwf received 2033 ; line_number = 358 2034 ; decode_request := 1 2035 ; Delay at assignment is 4 2036 0155 145f bsf decode_request___byte, decode_request___bit 2037 0156 2975 goto main__90 2038 ; line_number = 359 2039 ; case 31 2040 0157 : main__83: 2041 ; # Send start bit: 2042 ; line_number = 361 2043 ; state := state + 1 2044 ; Delay at assignment is 0 2045 0157 0aa9 incf state,f 2046 ; line_number = 362 2047 ; serial_out := 0 2048 ; Delay at assignment is 1 2049 0158 1285 bcf serial_out___byte, serial_out___bit 2050 ; Delay 3 cycles 2051 0159 295a goto main__94 2052 015a : main__94: 2053 015a 0000 nop 2054 015b 2975 goto main__90 2055 ; line_number = 363 2056 ; case 34, 37, 40, 43, 46, 49, 52, 55 2057 015c : main__84: 2058 ; # Send data bit: 2059 ; line_number = 365 2060 ; state := state + 1 2061 ; Delay at assignment is 0 2062 015c 0aa9 incf state,f 2063 ; line_number = 366 2064 ; serial_out := buffer@0 2065 ; Delay at assignment is 1 2066 015d 1285 bcf serial_out___byte, serial_out___bit 2067 0000002b = main__select__78___byte equ buffer 2068 00000000 = main__select__78___bit equ 0 2069 ; (after recombine) true_delay=1, false_delay=0 uniform_delay=true 2070 ; CASE: True.size=1 False.size=0 2071 015e 182b btfsc main__select__78___byte, main__select__78___bit 2072 015f 1685 bsf serial_out___byte, serial_out___bit 2073 ; code.delay=4 back_code.delay=0 2074 ; <=bit_code_emit@symbol; sym=main__select__78 (data:X0=>X0 code:XX=>XX) 2075 ; Delay 1 cycles 2076 0160 0000 nop 2077 0161 2975 goto main__90 2078 ; line_number = 367 2079 ; case 35, 38, 41, 44, 47, 50, 53 2080 0162 : main__85: 2081 ; # Shift sending byte: 2082 ; line_number = 369 2083 ; state := state + 1 2084 ; Delay at assignment is 0 2085 0162 0aa9 incf state,f 2086 ; line_number = 370 2087 ; buffer := buffer >> 1 2088 ; Delay at assignment is 1 2089 ; Assignment of variable to self (no code needed) 2090 0163 0cab rrf buffer,f 2091 0164 13ab bcf buffer, 7 2092 ; Delay 2 cycles 2093 0165 2966 goto main__95 2094 0166 : main__95: 2095 0166 2975 goto main__90 2096 ; line_number = 371 2097 ; case 58 2098 0167 : main__86: 2099 ; # Send stop bit 2100 ; line_number = 373 2101 ; state := state + 1 2102 ; Delay at assignment is 0 2103 0167 0aa9 incf state,f 2104 ; line_number = 374 2105 ; serial_out := 1 2106 ; Delay at assignment is 1 2107 0168 1685 bsf serial_out___byte, serial_out___bit 2108 ; Delay 3 cycles 2109 0169 296a goto main__96 2110 016a : main__96: 2111 016a 0000 nop 2112 016b 2975 goto main__90 2113 ; line_number = 375 2114 ; case 60 2115 016c : main__87: 2116 ; # Done sending: 2117 ; line_number = 377 2118 ; state := 0 2119 ; Delay at assignment is 0 2120 016c 3000 movlw 0 2121 016d 00a9 movwf state 2122 ; Delay 3 cycles 2123 016e 296f goto main__97 2124 016f : main__97: 2125 016f 0000 nop 2126 0170 2975 goto main__90 2127 ; line_number = 378 2128 ; default 2129 0171 : main__88: 2130 ; # All other states do nothing except increment state variable: 2131 ; line_number = 380 2132 ; state := state + 1 2133 ; Delay at assignment is 0 2134 0171 0aa9 incf state,f 2135 2136 2137 ; Delay 4 cycles 2138 0172 2973 goto main__98 2139 0173 : main__98: 2140 0173 2974 goto main__99 2141 0174 : main__99: 2142 0174 2975 goto main__90 2143 0175 : main__90: 2144 ; switch end:(data:X0=>X0 code:XX=>XX) 2145 ; line_number = 334 2146 ; switch state done 2147 ; Delay 26 cycles 2148 ; Delay loop takes 6 * 4 = 24 cycles 2149 0175 3006 movlw 6 2150 0176 : main__100: 2151 0176 3eff addlw 255 2152 0177 1d03 btfss __z___byte, __z___bit 2153 0178 2976 goto main__100 2154 0179 297a goto main__101 2155 017a : main__101: 2156 ; line_number = 206 2157 ; delay instructions_per_delay - 2 done 2158 ; line_number = 204 2159 ; loop_forever wrap-up 2160 017a 2826 goto main__3 2161 ; line_number = 204 2162 ; loop_forever done 2163 ; delay after procedure statements=non-uniform 2164 2165 2166 2167 2168 ; line_number = 383 2169 ; procedure decode 2170 017b : decode: 2171 ; arguments_none 2172 ; line_number = 385 2173 ; returns_nothing 2174 ; # 75 was found by trail and error: 2175 ; line_number = 387 2176 ; exact_delay 75 2177 2178 ; line_number = 389 2179 ; local temp byte 2180 00000031 = decode__temp equ shared___globals+17 2181 2182 ; before procedure statements delay=0, bit states=(data:X0=>X0 code:XX=>XX) 2183 ; line_number = 391 2184 ; switch decode_state start 2185 017b 3001 movlw decode__82>>8 2186 017c 008a movwf __pclath 2187 017d 082c movf decode_state,w 2188 017e 3e80 addlw decode__82 2189 017f 0082 movwf __pcl 2190 ; page_group 3 2191 0180 : decode__82: 2192 0180 2983 goto decode__79 2193 0181 2aba goto decode__80 2194 0182 2ad5 goto decode__81 2195 ; case_data[0] delay=62{0 } 2196 ; case_data[1] delay=29{1 } 2197 ; case_data[2] delay=5{2 } 2198 ; Maximum Case Delay = 62 2199 ; line_number = 392 2200 ; case 0 2201 0183 : decode__79: 2202 ; # Main decode: 2203 ; line_number = 394 2204 ; switch received >> 6 start 2205 0183 3001 movlw decode__69>>8 2206 0184 008a movwf __pclath 2207 00000034 = decode__70 equ shared___globals+20 2208 0185 0e2a swapf received,w 2209 0186 00b4 movwf decode__70 2210 0187 0cb4 rrf decode__70,f 2211 0188 0c34 rrf decode__70,w 2212 0189 3903 andlw 3 2213 018a 3e8c addlw decode__69 2214 018b 0082 movwf __pcl 2215 ; page_group 4 2216 018c : decode__69: 2217 018c 2990 goto decode__65 2218 018d 29a1 goto decode__66 2219 018e 29ba goto decode__67 2220 018f 29db goto decode__68 2221 ; case_data[0] delay=11{0 } 2222 ; case_data[1] delay=20{1 } 2223 ; case_data[2] delay=25{2 } 2224 ; case_data[3] delay=48{3 } 2225 ; Maximum Case Delay = 48 2226 ; line_number = 395 2227 ; case 0 2228 0190 : decode__65: 2229 ; # Received = 00hh hhss (Set High): 2230 ; line_number = 397 2231 ; temp := received & servos_index_mask 2232 ; Delay at assignment is 0 2233 0190 3003 movlw 3 2234 0191 052a andwf received,w 2235 0192 00b1 movwf decode__temp 2236 ; line_number = 398 2237 ; positions[temp] := (received << 2) & 0xf0 2238 ; Delay at assignment is 3 2239 ; index_fsr_first 2240 0193 0831 movf decode__temp,w 2241 0194 3e21 addlw positions 2242 0195 0084 movwf __fsr 2243 00000033 = decode__1 equ shared___globals+19 2244 0196 0d2a rlf received,w 2245 0197 00b3 movwf decode__1 2246 0198 0d33 rlf decode__1,w 2247 0199 39f0 andlw 240 2248 019a 0080 movwf __indf 2249 ; Delay 37 cycles 2250 ; Delay loop takes 9 * 4 = 36 cycles 2251 019b 3009 movlw 9 2252 019c : decode__72: 2253 019c 3eff addlw 255 2254 019d 1d03 btfss __z___byte, __z___bit 2255 019e 299c goto decode__72 2256 019f 0000 nop 2257 01a0 2ab9 goto decode__71 2258 ; line_number = 399 2259 ; case 1 2260 01a1 : decode__66: 2261 ; # Received = 01ll llss (Set Low): 2262 ; line_number = 401 2263 ; temp := received & servos_index_mask 2264 ; Delay at assignment is 0 2265 01a1 3003 movlw 3 2266 01a2 052a andwf received,w 2267 01a3 00b1 movwf decode__temp 2268 ; line_number = 402 2269 ; positions[temp] := positions[temp] & 0xf0 | (received >> 2) & 0xf 2270 ; Delay at assignment is 3 2271 ; right_temporary_first 2272 00000033 = decode__2 equ shared___globals+19 2273 00000034 = decode__3 equ shared___globals+20 2274 01a4 0831 movf decode__temp,w 2275 01a5 3e21 addlw positions 2276 01a6 0084 movwf __fsr 2277 01a7 0800 movf __indf,w 2278 01a8 39f0 andlw 240 2279 01a9 00b4 movwf decode__3 2280 00000035 = decode__4 equ shared___globals+21 2281 01aa 0c2a rrf received,w 2282 01ab 00b5 movwf decode__4 2283 01ac 0c35 rrf decode__4,w 2284 01ad 390f andlw 15 2285 01ae 0434 iorwf decode__3,w 2286 01af 00b3 movwf decode__2 2287 01b0 0831 movf decode__temp,w 2288 01b1 3e21 addlw positions 2289 01b2 0084 movwf __fsr 2290 01b3 0833 movf decode__2,w 2291 01b4 0080 movwf __indf 2292 ; Delay 28 cycles 2293 ; Delay loop takes 7 * 4 = 28 cycles 2294 01b5 3007 movlw 7 2295 01b6 : decode__73: 2296 01b6 3eff addlw 255 2297 01b7 1d03 btfss __z___byte, __z___bit 2298 01b8 29b6 goto decode__73 2299 01b9 2ab9 goto decode__71 2300 ; line_number = 403 2301 ; case 2 2302 01ba : decode__67: 2303 ; # Received = 10xx xxxx: 2304 ; line_number = 405 2305 ; temp := received & servos_index_mask 2306 ; Delay at assignment is 0 2307 01ba 3003 movlw 3 2308 01bb 052a andwf received,w 2309 01bc 00b1 movwf decode__temp 2310 ; line_number = 406 2311 ; amount := (received >> 2) & 7 2312 ; Delay at assignment is 3 2313 00000034 = decode__5 equ shared___globals+20 2314 01bd 0c2a rrf received,w 2315 01be 00b4 movwf decode__5 2316 01bf 0c34 rrf decode__5,w 2317 01c0 3907 andlw 7 2318 01c1 00af movwf amount 2319 ; line_number = 407 2320 ; if received@5 start 2321 ; Delay at if is 8 2322 0000002a = decode__select__6___byte equ received 2323 00000005 = decode__select__6___bit equ 5 2324 ; (after recombine) true_delay=3, false_delay=0 uniform_delay=true 2325 ; CASE: true_code.size = 0 && false_code.size > 1 2326 ; bit_code_emit_helper1: body_code.size=3 true_test=true body_code.delay=3 (uniform delay) 2327 01c2 1aaa btfsc decode__select__6___byte, decode__select__6___bit 2328 01c3 29c6 goto decode__7 2329 ; Delay 2 cycles 2330 01c4 29c5 goto decode__9 2331 01c5 : decode__9: 2332 01c5 29c9 goto decode__8 2333 01c6 : decode__7: 2334 ; # Decrement (Received = 101s sddd): 2335 ; line_number = 409 2336 ; amount := 0 - amount 2337 ; Delay at assignment is 0 2338 01c6 092f comf amount,w 2339 01c7 3e01 addlw 1 2340 01c8 00af movwf amount 2341 01c9 : decode__8: 2342 ; code.delay=14 back_code.delay=0 2343 ; <=bit_code_emit@symbol; sym=decode__select__6 (data:X0=>X0 code:XX=>XX) 2344 ; if final true delay=3 false delay=0 code delay=14 2345 ; line_number = 407 2346 ; if received@5 done 2347 ; # else Increment (Received = 100s siii) do nothing: 2348 ; line_number = 411 2349 ; positions[temp] := positions[temp] + amount 2350 ; Delay at assignment is 14 2351 ; right_temporary_first 2352 00000034 = decode__10 equ shared___globals+20 2353 01c9 0831 movf decode__temp,w 2354 01ca 3e21 addlw positions 2355 01cb 0084 movwf __fsr 2356 01cc 0800 movf __indf,w 2357 01cd 072f addwf amount,w 2358 01ce 00b4 movwf decode__10 2359 01cf 0831 movf decode__temp,w 2360 01d0 3e21 addlw positions 2361 01d1 0084 movwf __fsr 2362 01d2 0834 movf decode__10,w 2363 01d3 0080 movwf __indf 2364 ; Delay 23 cycles 2365 ; Delay loop takes 5 * 4 = 20 cycles 2366 01d4 3005 movlw 5 2367 01d5 : decode__74: 2368 01d5 3eff addlw 255 2369 01d6 1d03 btfss __z___byte, __z___bit 2370 01d7 29d5 goto decode__74 2371 01d8 29d9 goto decode__75 2372 01d9 : decode__75: 2373 01d9 0000 nop 2374 01da 2ab9 goto decode__71 2375 ; line_number = 412 2376 ; case 3 2377 01db : decode__68: 2378 ; # Received = 11xx xxxx: 2379 ; line_number = 414 2380 ; switch (received >> 3) & 7 start 2381 01db 3001 movlw decode__54>>8 2382 01dc 008a movwf __pclath 2383 00000034 = decode__55 equ shared___globals+20 2384 01dd 0c2a rrf received,w 2385 01de 00b4 movwf decode__55 2386 01df 0cb4 rrf decode__55,f 2387 01e0 0c34 rrf decode__55,w 2388 01e1 3907 andlw 7 2389 01e2 3ee4 addlw decode__54 2390 01e3 0082 movwf __pcl 2391 ; page_group 8 2392 01e4 : decode__54: 2393 01e4 29ec goto decode__48 2394 01e5 29f6 goto decode__49 2395 01e6 2a09 goto decode__50 2396 01e7 2a29 goto decode__51 2397 01e8 2a4b goto decode__52 2398 01e9 2a4b goto decode__52 2399 01ea 2a4b goto decode__52 2400 01eb 2a51 goto decode__53 2401 ; case_data[0] delay=4{0 } 2402 ; case_data[1] delay=22{1 } 2403 ; case_data[2] delay=13{2 } 2404 ; case_data[3] delay=15{3 } 2405 ; case_data[4] delay=0{4 5 6 } 2406 ; case_data[5] delay=34{7 } 2407 ; Maximum Case Delay = 34 2408 ; line_number = 415 2409 ; case 0 2410 01ec : decode__48: 2411 ; # Set Position/Enable (Received = 1100 0ess): 2412 ; line_number = 417 2413 ; previous := received 2414 ; Delay at assignment is 0 2415 01ec 082a movf received,w 2416 01ed 00ae movwf previous 2417 ; line_number = 418 2418 ; decode_state := 1 2419 ; Delay at assignment is 2 2420 01ee 3001 movlw 1 2421 01ef 00ac movwf decode_state 2422 ; Delay 30 cycles 2423 ; Delay loop takes 7 * 4 = 28 cycles 2424 01f0 3007 movlw 7 2425 01f1 : decode__57: 2426 01f1 3eff addlw 255 2427 01f2 1d03 btfss __z___byte, __z___bit 2428 01f3 29f1 goto decode__57 2429 01f4 29f5 goto decode__58 2430 01f5 : decode__58: 2431 01f5 2ab8 goto decode__56 2432 ; line_number = 419 2433 ; case 1 2434 01f6 : decode__49: 2435 ; # Set Enable (Received = 1100 1ess): 2436 ; line_number = 421 2437 ; temp := received & servos_index_mask 2438 ; Delay at assignment is 0 2439 01f6 3003 movlw 3 2440 01f7 052a andwf received,w 2441 01f8 00b1 movwf decode__temp 2442 ; line_number = 422 2443 ; temp := masks[temp] 2444 ; Delay at assignment is 3 2445 01f9 0831 movf decode__temp,w 2446 01fa 2330 call masks 2447 01fb 00b1 movwf decode__temp 2448 ; line_number = 423 2449 ; if received@2 start 2450 ; Delay at if is 16 2451 0000002a = decode__select__11___byte equ received 2452 00000002 = decode__select__11___bit equ 2 2453 ; (after recombine) true_delay=2, false_delay=3 uniform_delay=true 2454 ; CASE: true_code_size > 1 && false_code_size > 1 2455 ; true_code_size=2 false_code_size=3 2456 01fc 1d2a btfss decode__select__11___byte, decode__select__11___bit 2457 01fd 2a01 goto decode__12 2458 ; line_number = 424 2459 ; enable_mask := enable_mask | temp 2460 ; Delay at assignment is 0 2461 01fe 0831 movf decode__temp,w 2462 01ff 04a5 iorwf enable_mask,f 2463 ; Delay 0 cycles 2464 0200 2a04 goto decode__13 2465 0201 : decode__12: 2466 ; line_number = 426 2467 ; enable_mask := enable_mask & (0xff ^ temp) 2468 ; Delay at assignment is 0 2469 0201 30ff movlw 255 2470 0202 0631 xorwf decode__temp,w 2471 0203 05a5 andwf enable_mask,f 2472 0204 : decode__13: 2473 ; code.delay=22 back_code.delay=0 2474 ; <=bit_code_emit@symbol; sym=decode__select__11 (data:X0=>X0 code:XX=>XX) 2475 ; if final true delay=2 false delay=3 code delay=22 2476 ; line_number = 423 2477 ; if received@2 done 2478 ; Delay 12 cycles 2479 ; Delay loop takes 3 * 4 = 12 cycles 2480 0204 3003 movlw 3 2481 0205 : decode__59: 2482 0205 3eff addlw 255 2483 0206 1d03 btfss __z___byte, __z___bit 2484 0207 2a05 goto decode__59 2485 0208 2ab8 goto decode__56 2486 ; line_number = 427 2487 ; case 2 2488 0209 : decode__50: 2489 ; # Received = 1101 0xxx: 2490 ; line_number = 429 2491 ; temp := received & servos_index_mask 2492 ; Delay at assignment is 0 2493 0209 3003 movlw 3 2494 020a 052a andwf received,w 2495 020b 00b1 movwf decode__temp 2496 ; line_number = 430 2497 ; if received@2 start 2498 ; Delay at if is 3 2499 0000002a = decode__select__14___byte equ received 2500 00000002 = decode__select__14___bit equ 2 2501 ; (after recombine) true_delay=17, false_delay=5 uniform_delay=true 2502 ; CASE: true_code_size > 1 && false_code_size > 1 2503 ; true_code_size=7 false_code_size=5 2504 020c 192a btfsc decode__select__14___byte, decode__select__14___bit 2505 020d 2a1a goto decode__15 2506 ; Delay 11 cycles 2507 ; Delay loop takes 2 * 4 = 8 cycles 2508 020e 3002 movlw 2 2509 020f : decode__17: 2510 020f 3eff addlw 255 2511 0210 1d03 btfss __z___byte, __z___bit 2512 0211 2a0f goto decode__17 2513 0212 2a13 goto decode__18 2514 0213 : decode__18: 2515 0213 0000 nop 2516 ; # Read Position (Received = 1101 00ss): 2517 ; line_number = 437 2518 ; buffer := positions[temp] 2519 ; Delay at assignment is 0 2520 0214 0831 movf decode__temp,w 2521 0215 3e21 addlw positions 2522 0216 0084 movwf __fsr 2523 0217 0800 movf __indf,w 2524 0218 00ab movwf buffer 2525 0219 2a21 goto decode__16 2526 021a : decode__15: 2527 ; # Read Enable (Received = 1101 01ss): 2528 ; line_number = 432 2529 ; buffer := 0 2530 ; Delay at assignment is 0 2531 021a 3000 movlw 0 2532 021b 00ab movwf buffer 2533 ; line_number = 433 2534 ; if enable_mask & masks[temp] != 0 start 2535 ; Delay at if is 2 2536 ; Left minus Right 2537 021c 0831 movf decode__temp,w 2538 021d 2330 call masks 2539 021e 0525 andwf enable_mask,w 2540 ; (after recombine) true_delay=0, false_delay=1 uniform_delay=true 2541 ; CASE: true_code.size=0 && false_code.size=1 2542 021f 1d03 btfss __z___byte, __z___bit 2543 ; line_number = 434 2544 ; buffer := buffer + 1 2545 ; Delay at assignment is 0 2546 0220 0aab incf buffer,f 2547 ; code.delay=17 back_code.delay=0 2548 ; <=bit_code_emit@symbol; sym=__z (data:X0=>X0 code:XX=>XX) 2549 ; Uniform delay broke in relation_code_emit 2550 ; if final true delay=1 false delay=0 code delay=17 2551 ; line_number = 433 2552 ; if enable_mask & masks[temp] != 0 done 2553 0221 : decode__16: 2554 ; code.delay=11 back_code.delay=0 2555 ; <=bit_code_emit@symbol; sym=decode__select__14 (data:X0=>X0 code:XX=>XX) 2556 ; if final true delay=17 false delay=5 code delay=11 2557 ; line_number = 430 2558 ; if received@2 done 2559 ; line_number = 438 2560 ; state := 31 2561 ; Delay at assignment is 11 2562 0221 301f movlw 31 2563 0222 00a9 movwf state 2564 ; Delay 21 cycles 2565 ; Delay loop takes 5 * 4 = 20 cycles 2566 0223 3005 movlw 5 2567 0224 : decode__60: 2568 0224 3eff addlw 255 2569 0225 1d03 btfss __z___byte, __z___bit 2570 0226 2a24 goto decode__60 2571 0227 0000 nop 2572 0228 2ab8 goto decode__56 2573 ; line_number = 439 2574 ; case 3 2575 0229 : decode__51: 2576 ; # Received = 1101 1xxx: 2577 ; line_number = 441 2578 ; switch received & 7 start 2579 0229 3002 movlw decode__22>>8 2580 022a 008a movwf __pclath 2581 022b 3007 movlw 7 2582 022c 052a andwf received,w 2583 022d 3e2f addlw decode__22 2584 022e 0082 movwf __pcl 2585 ; page_group 8 2586 022f : decode__22: 2587 022f 2a37 goto decode__19 2588 0230 2a3c goto decode__20 2589 0231 2a40 goto decode__21 2590 0232 2a40 goto decode__21 2591 0233 2a40 goto decode__21 2592 0234 2a40 goto decode__21 2593 0235 2a40 goto decode__21 2594 0236 2a40 goto decode__21 2595 ; case_data[0] delay=4{0 } 2596 ; case_data[1] delay=2{1 } 2597 ; case_data[2] delay=0{2 3 4 5 6 7 } 2598 ; Maximum Case Delay = 4 2599 ; line_number = 442 2600 ; case 0 2601 0237 : decode__19: 2602 ; # Read Enables (Received = 1101 1000): 2603 ; line_number = 444 2604 ; buffer := enable_mask 2605 ; Delay at assignment is 0 2606 0237 0825 movf enable_mask,w 2607 0238 00ab movwf buffer 2608 ; line_number = 445 2609 ; state := 31 2610 ; Delay at assignment is 2 2611 0239 301f movlw 31 2612 023a 00a9 movwf state 2613 023b 2a43 goto decode__23 2614 ; line_number = 446 2615 ; case 1 2616 023c : decode__20: 2617 ; # Set Enables (Received = 1101 1001): 2618 ; line_number = 448 2619 ; decode_state := 2 2620 ; Delay at assignment is 0 2621 023c 3002 movlw 2 2622 023d 00ac movwf decode_state 2623 ; Delay 2 cycles 2624 023e 2a3f goto decode__24 2625 023f : decode__24: 2626 023f 2a43 goto decode__23 2627 ; line_number = 449 2628 ; case 2, 3, 4, 5, 6, 7 2629 0240 : decode__21: 2630 ; line_number = 450 2631 ; do_nothing 2632 ; Delay 4 cycles 2633 0240 2a41 goto decode__25 2634 0241 : decode__25: 2635 0241 2a42 goto decode__26 2636 0242 : decode__26: 2637 0242 2a43 goto decode__23 2638 0243 : decode__23: 2639 ; switch end:(data:X0=>X? code:XX=>XX) 2640 ; line_number = 441 2641 ; switch received & 7 done 2642 ; Delay 19 cycles 2643 ; Delay loop takes 4 * 4 = 16 cycles 2644 0243 3004 movlw 4 2645 0244 : decode__61: 2646 0244 3eff addlw 255 2647 0245 1283 bcf __rp0___byte, __rp0___bit 2648 0246 1d03 btfss __z___byte, __z___bit 2649 0247 2a44 goto decode__61 2650 0248 2a49 goto decode__62 2651 0249 : decode__62: 2652 0249 0000 nop 2653 024a 2ab8 goto decode__56 2654 ; line_number = 451 2655 ; case 4, 5, 6 2656 024b : decode__52: 2657 ; # Received = 1110 0xxx, 1110 1xxx, or 1111 0xxx: 2658 ; # Do nothing: 2659 ; Delay 34 cycles 2660 ; Delay loop takes 8 * 4 = 32 cycles 2661 024b 3008 movlw 8 2662 024c : decode__63: 2663 024c 3eff addlw 255 2664 024d 1d03 btfss __z___byte, __z___bit 2665 024e 2a4c goto decode__63 2666 024f 2a50 goto decode__64 2667 0250 : decode__64: 2668 0250 2ab8 goto decode__56 2669 ; line_number = 454 2670 ; case 7 2671 0251 : decode__53: 2672 ; # Shared Commands (Received = 1111 1xxx): 2673 ; line_number = 456 2674 ; switch received & 7 start 2675 0251 3002 movlw decode__38>>8 2676 0252 008a movwf __pclath 2677 0253 3007 movlw 7 2678 0254 052a andwf received,w 2679 0255 3e57 addlw decode__38 2680 0256 0082 movwf __pcl 2681 ; page_group 8 2682 0257 : decode__38: 2683 0257 2a5f goto decode__30 2684 0258 2a68 goto decode__31 2685 0259 2a71 goto decode__32 2686 025a 2a7d goto decode__33 2687 025b 2a88 goto decode__34 2688 025c 2a9b goto decode__35 2689 025d 2aa3 goto decode__36 2690 025e 2aaf goto decode__37 2691 ; case_data[0] delay=3{0 } 2692 ; case_data[1] delay=3{1 } 2693 ; case_data[2] delay=6{2 } 2694 ; case_data[3] delay=4{3 } 2695 ; case_data[4] delay=23{4 } 2696 ; case_data[5] delay=2{5 } 2697 ; case_data[6] delay=6{6 } 2698 ; case_data[7] delay=3{7 } 2699 ; Maximum Case Delay = 23 2700 ; line_number = 457 2701 ; case 0 2702 025f : decode__30: 2703 ; This case body wants this bit set 2704 025f 1683 bsf __rp0___byte, __rp0___bit 2705 ; # Clock Decrement (Received = 1111 1000): 2706 ; line_number = 459 2707 ; _osccal := _osccal - _osccal_lsb 2708 ; Delay at assignment is 0 2709 0260 30fc movlw 252 2710 0261 0790 addwf _osccal,f 2711 ; Delay 20 cycles 2712 ; Delay loop takes 5 * 4 = 20 cycles 2713 0262 3005 movlw 5 2714 0263 : decode__40: 2715 0263 3eff addlw 255 2716 0264 1283 bcf __rp0___byte, __rp0___bit 2717 0265 1d03 btfss __z___byte, __z___bit 2718 0266 2a63 goto decode__40 2719 0267 2ab7 goto decode__39 2720 ; line_number = 460 2721 ; case 1 2722 0268 : decode__31: 2723 ; This case body wants this bit set 2724 0268 1683 bsf __rp0___byte, __rp0___bit 2725 ; # Clock Increment (Received = 1111 1001): 2726 ; line_number = 462 2727 ; _osccal := _osccal + _osccal_lsb 2728 ; Delay at assignment is 0 2729 0269 3004 movlw 4 2730 026a 0790 addwf _osccal,f 2731 ; Delay 20 cycles 2732 ; Delay loop takes 5 * 4 = 20 cycles 2733 026b 3005 movlw 5 2734 026c : decode__41: 2735 026c 3eff addlw 255 2736 026d 1283 bcf __rp0___byte, __rp0___bit 2737 026e 1d03 btfss __z___byte, __z___bit 2738 026f 2a6c goto decode__41 2739 0270 2ab7 goto decode__39 2740 ; line_number = 463 2741 ; case 2 2742 0271 : decode__32: 2743 ; This case body wants this bit set 2744 0271 1683 bsf __rp0___byte, __rp0___bit 2745 ; # Clock Read (Received = 1111 1010): 2746 ; line_number = 465 2747 ; buffer := _osccal 2748 ; Delay at assignment is 0 2749 0272 0810 movf _osccal,w 2750 0273 1283 bcf __rp0___byte, __rp0___bit 2751 0274 00ab movwf buffer 2752 ; line_number = 466 2753 ; state := 31 2754 ; Delay at assignment is 3 2755 0275 301f movlw 31 2756 0276 00a9 movwf state 2757 ; Delay 17 cycles 2758 ; Delay loop takes 4 * 4 = 16 cycles 2759 0277 3004 movlw 4 2760 0278 : decode__42: 2761 0278 3eff addlw 255 2762 0279 1d03 btfss __z___byte, __z___bit 2763 027a 2a78 goto decode__42 2764 027b 0000 nop 2765 027c 2ab7 goto decode__39 2766 ; line_number = 467 2767 ; case 3 2768 027d : decode__33: 2769 ; # Clock Pulse (Received = 1111 1011): 2770 ; line_number = 469 2771 ; buffer := 0 2772 ; Delay at assignment is 0 2773 027d 3000 movlw 0 2774 027e 00ab movwf buffer 2775 ; line_number = 470 2776 ; state := 31 2777 ; Delay at assignment is 2 2778 027f 301f movlw 31 2779 0280 00a9 movwf state 2780 ; Delay 19 cycles 2781 ; Delay loop takes 4 * 4 = 16 cycles 2782 0281 3004 movlw 4 2783 0282 : decode__43: 2784 0282 3eff addlw 255 2785 0283 1d03 btfss __z___byte, __z___bit 2786 0284 2a82 goto decode__43 2787 0285 2a86 goto decode__44 2788 0286 : decode__44: 2789 0286 0000 nop 2790 0287 2ab7 goto decode__39 2791 ; line_number = 471 2792 ; case 4 2793 0288 : decode__34: 2794 ; # ID Next (Received = 1111 1100): 2795 ; line_number = 473 2796 ; buffer := 0 2797 ; Delay at assignment is 0 2798 0288 3000 movlw 0 2799 0289 00ab movwf buffer 2800 ; line_number = 474 2801 ; if id_index < id.size start 2802 ; Delay at if is 2 2803 028a 3030 movlw 48 2804 028b 0228 subwf id_index,w 2805 ; (after recombine) true_delay=0, false_delay=14 uniform_delay=true 2806 ; CASE: true.size=0 && false.size>1 2807 ; bit_code_emit_helper1: body_code.size=4 true_test=false body_code.delay=14 (uniform delay) 2808 028c 1c03 btfss __c___byte, __c___bit 2809 028d 2a94 goto decode__27 2810 ; Delay 13 cycles 2811 ; Delay loop takes 3 * 4 = 12 cycles 2812 028e 3003 movlw 3 2813 028f : decode__29: 2814 028f 3eff addlw 255 2815 0290 1d03 btfss __z___byte, __z___bit 2816 0291 2a8f goto decode__29 2817 0292 0000 nop 2818 0293 2a98 goto decode__28 2819 0294 : decode__27: 2820 ; line_number = 475 2821 ; buffer := id[id_index] 2822 ; Delay at assignment is 0 2823 0294 0828 movf id_index,w 2824 0295 22e2 call id 2825 0296 00ab movwf buffer 2826 ; line_number = 476 2827 ; id_index := id_index + 1 2828 ; Delay at assignment is 13 2829 0297 0aa8 incf id_index,f 2830 0298 : decode__28: 2831 ; code.delay=21 back_code.delay=0 2832 ; <=bit_code_emit@symbol; sym=__c (data:X0=>X0 code:XX=>XX) 2833 ; Uniform delay broke in relation_code_emit 2834 ; if final true delay=14 false delay=0 code delay=21 2835 ; line_number = 474 2836 ; if id_index < id.size done 2837 ; line_number = 477 2838 ; state := 31 2839 ; Delay at assignment is 21 2840 0298 301f movlw 31 2841 0299 00a9 movwf state 2842 029a 2ab7 goto decode__39 2843 ; line_number = 478 2844 ; case 5 2845 029b : decode__35: 2846 ; # ID Reset (Received = 1111 1101): 2847 ; line_number = 480 2848 ; id_index := 0 2849 ; Delay at assignment is 0 2850 029b 3000 movlw 0 2851 029c 00a8 movwf id_index 2852 ; Delay 21 cycles 2853 ; Delay loop takes 5 * 4 = 20 cycles 2854 029d 3005 movlw 5 2855 029e : decode__45: 2856 029e 3eff addlw 255 2857 029f 1d03 btfss __z___byte, __z___bit 2858 02a0 2a9e goto decode__45 2859 02a1 0000 nop 2860 02a2 2ab7 goto decode__39 2861 ; line_number = 481 2862 ; case 6 2863 02a3 : decode__36: 2864 ; # Glitch Read (Received = 1111 1110): 2865 ; line_number = 483 2866 ; buffer := glitch 2867 ; Delay at assignment is 0 2868 02a3 0827 movf glitch,w 2869 02a4 00ab movwf buffer 2870 ; line_number = 484 2871 ; state := 31 2872 ; Delay at assignment is 2 2873 02a5 301f movlw 31 2874 02a6 00a9 movwf state 2875 ; line_number = 485 2876 ; glitch := 0 2877 ; Delay at assignment is 4 2878 02a7 3000 movlw 0 2879 02a8 00a7 movwf glitch 2880 ; Delay 17 cycles 2881 ; Delay loop takes 4 * 4 = 16 cycles 2882 02a9 3004 movlw 4 2883 02aa : decode__46: 2884 02aa 3eff addlw 255 2885 02ab 1d03 btfss __z___byte, __z___bit 2886 02ac 2aaa goto decode__46 2887 02ad 0000 nop 2888 02ae 2ab7 goto decode__39 2889 ; line_number = 486 2890 ; case 7 2891 02af : decode__37: 2892 ; # Glitch (Received = 1111 1111): 2893 ; line_number = 488 2894 ; if glitch != 0xff start 2895 ; Delay at if is 0 2896 ; Left minus Right 2897 02af 0a27 incf glitch,w 2898 ; (after recombine) true_delay=0, false_delay=1 uniform_delay=true 2899 ; CASE: true_code.size=0 && false_code.size=1 2900 02b0 1d03 btfss __z___byte, __z___bit 2901 ; line_number = 489 2902 ; glitch := glitch + 1 2903 ; Delay at assignment is 0 2904 02b1 0aa7 incf glitch,f 2905 ; code.delay=3 back_code.delay=0 2906 ; <=bit_code_emit@symbol; sym=__z (data:X0=>X0 code:XX=>XX) 2907 ; Uniform delay broke in relation_code_emit 2908 ; if final true delay=1 false delay=0 code delay=3 2909 ; line_number = 488 2910 ; if glitch != 0xff done 2911 ; Delay 20 cycles 2912 ; Delay loop takes 5 * 4 = 20 cycles 2913 02b2 3005 movlw 5 2914 02b3 : decode__47: 2915 02b3 3eff addlw 255 2916 02b4 1d03 btfss __z___byte, __z___bit 2917 02b5 2ab3 goto decode__47 2918 02b6 2ab7 goto decode__39 2919 02b7 : decode__39: 2920 ; switch end:(data:X0=>X? code:XX=>XX) 2921 ; line_number = 456 2922 ; switch received & 7 done 2923 02b7 2ab8 goto decode__56 2924 02b8 : decode__56: 2925 ; switch end:(data:X0=>X? code:XX=>XX) 2926 ; line_number = 414 2927 ; switch (received >> 3) & 7 done 2928 02b8 2ab9 goto decode__71 2929 02b9 : decode__71: 2930 ; switch end:(data:X0=>X? code:XX=>XX) 2931 ; line_number = 394 2932 ; switch received >> 6 done 2933 02b9 2ae0 goto decode__83 2934 ; line_number = 490 2935 ; case 1 2936 02ba : decode__80: 2937 ; # Set Position/Enable (2nd byte = pppp pppp): 2938 ; line_number = 492 2939 ; decode_state := 0 2940 ; Delay at assignment is 0 2941 02ba 3000 movlw 0 2942 02bb 00ac movwf decode_state 2943 ; line_number = 493 2944 ; temp := previous & servos_index_mask 2945 ; Delay at assignment is 2 2946 02bc 3003 movlw 3 2947 02bd 052e andwf previous,w 2948 02be 00b1 movwf decode__temp 2949 ; line_number = 494 2950 ; positions[temp] := received 2951 ; Delay at assignment is 5 2952 ; index_fsr_first 2953 02bf 0831 movf decode__temp,w 2954 02c0 3e21 addlw positions 2955 02c1 0084 movwf __fsr 2956 02c2 082a movf received,w 2957 02c3 0080 movwf __indf 2958 ; line_number = 495 2959 ; temp := masks[temp] 2960 ; Delay at assignment is 10 2961 02c4 0831 movf decode__temp,w 2962 02c5 2330 call masks 2963 02c6 00b1 movwf decode__temp 2964 ; line_number = 496 2965 ; if previous@2 start 2966 ; Delay at if is 23 2967 0000002e = decode__select__76___byte equ previous 2968 00000002 = decode__select__76___bit equ 2 2969 ; (after recombine) true_delay=2, false_delay=3 uniform_delay=true 2970 ; CASE: true_code_size > 1 && false_code_size > 1 2971 ; true_code_size=2 false_code_size=3 2972 02c7 1d2e btfss decode__select__76___byte, decode__select__76___bit 2973 02c8 2acc goto decode__77 2974 ; line_number = 497 2975 ; enable_mask := enable_mask | temp 2976 ; Delay at assignment is 0 2977 02c9 0831 movf decode__temp,w 2978 02ca 04a5 iorwf enable_mask,f 2979 ; Delay 0 cycles 2980 02cb 2acf goto decode__78 2981 02cc : decode__77: 2982 ; line_number = 499 2983 ; enable_mask := enable_mask & (0xff ^ temp) 2984 ; Delay at assignment is 0 2985 02cc 30ff movlw 255 2986 02cd 0631 xorwf decode__temp,w 2987 02ce 05a5 andwf enable_mask,f 2988 02cf : decode__78: 2989 ; code.delay=29 back_code.delay=0 2990 ; <=bit_code_emit@symbol; sym=decode__select__76 (data:X0=>X0 code:XX=>XX) 2991 ; if final true delay=2 false delay=3 code delay=29 2992 ; line_number = 496 2993 ; if previous@2 done 2994 ; Delay 33 cycles 2995 ; Delay loop takes 8 * 4 = 32 cycles 2996 02cf 3008 movlw 8 2997 02d0 : decode__84: 2998 02d0 3eff addlw 255 2999 02d1 1d03 btfss __z___byte, __z___bit 3000 02d2 2ad0 goto decode__84 3001 02d3 0000 nop 3002 02d4 2ae0 goto decode__83 3003 ; line_number = 500 3004 ; case 2 3005 02d5 : decode__81: 3006 ; # Set Enables (2nd byte = 0000 eeee): 3007 ; line_number = 502 3008 ; decode_state := 0 3009 ; Delay at assignment is 0 3010 02d5 3000 movlw 0 3011 02d6 00ac movwf decode_state 3012 ; line_number = 503 3013 ; enable_mask := received & 0xf 3014 ; Delay at assignment is 2 3015 02d7 300f movlw 15 3016 02d8 052a andwf received,w 3017 02d9 00a5 movwf enable_mask 3018 3019 3020 ; Delay 57 cycles 3021 ; Delay loop takes 14 * 4 = 56 cycles 3022 02da 300e movlw 14 3023 02db : decode__85: 3024 02db 3eff addlw 255 3025 02dc 1d03 btfss __z___byte, __z___bit 3026 02dd 2adb goto decode__85 3027 02de 0000 nop 3028 02df 2ae0 goto decode__83 3029 02e0 : decode__83: 3030 ; switch end:(data:X0=>X? code:XX=>XX) 3031 ; line_number = 391 3032 ; switch decode_state done 3033 ; delay after procedure statements=72 3034 02e0 1283 bcf __rp0___byte, __rp0___bit 3035 ; Delay 0 cycles 3036 ; Implied return 3037 02e1 3400 retlw 0 3038 ; Final delay = 75 3039 3040 3041 3042 3043 ; line_number = 506 3044 ; constant zero8 = "\0,0,0,0,0,0,0,0\" 3045 ; zero8 = '\0,0,0,0,0,0,0,0\' 3046 ; line_number = 507 3047 ; constant module_name = "\7\Servo4E" 3048 ; module_name = '\7\Servo4E' 3049 ; line_number = 508 3050 ; constant vendor_name = "\15\Gramlich&Benson" 3051 ; vendor_name = '\15\Gramlich&Benson' 3052 3053 ; line_number = 510 3054 ; string id = "\1,0,15,4,0,0,0,0\" ~ zero8 ~ zero8 ~ module_name ~ vendor_name start 3055 ; id = '\1,0,15,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7\Servo4E\15\Gramlich&Benson' 3056 02e2 : id: 3057 ; Temporarily save index into FSR 3058 02e2 0084 movwf __fsr 3059 ; Initialize PCLATH to point to this code page 3060 02e3 3003 movlw id___base>>8 3061 02e4 008a movwf __pclath 3062 ; Restore index from FSR 3063 02e5 0804 movf __fsr,w 3064 02e6 3e00 addlw id___base 3065 ; Index to the correct return value 3066 02e7 0082 movwf __pcl 3067 ; page_group 48 3068 ; Add 24 NOP's until start of new page 3069 02e8 0000 nop 3070 02e9 0000 nop 3071 02ea 0000 nop 3072 02eb 0000 nop 3073 02ec 0000 nop 3074 02ed 0000 nop 3075 02ee 0000 nop 3076 02ef 0000 nop 3077 02f0 0000 nop 3078 02f1 0000 nop 3079 02f2 0000 nop 3080 02f3 0000 nop 3081 02f4 0000 nop 3082 02f5 0000 nop 3083 02f6 0000 nop 3084 02f7 0000 nop 3085 02f8 0000 nop 3086 02f9 0000 nop 3087 02fa 0000 nop 3088 02fb 0000 nop 3089 02fc 0000 nop 3090 02fd 0000 nop 3091 02fe 0000 nop 3092 02ff 0000 nop 3093 0300 : id___base: 3094 0300 3401 retlw 1 3095 0301 3400 retlw 0 3096 0302 340f retlw 15 3097 0303 3404 retlw 4 3098 0304 3400 retlw 0 3099 0305 3400 retlw 0 3100 0306 3400 retlw 0 3101 0307 3400 retlw 0 3102 0308 3400 retlw 0 3103 0309 3400 retlw 0 3104 030a 3400 retlw 0 3105 030b 3400 retlw 0 3106 030c 3400 retlw 0 3107 030d 3400 retlw 0 3108 030e 3400 retlw 0 3109 030f 3400 retlw 0 3110 0310 3400 retlw 0 3111 0311 3400 retlw 0 3112 0312 3400 retlw 0 3113 0313 3400 retlw 0 3114 0314 3400 retlw 0 3115 0315 3400 retlw 0 3116 0316 3400 retlw 0 3117 0317 3400 retlw 0 3118 0318 3407 retlw 7 3119 0319 3453 retlw 83 3120 031a 3465 retlw 101 3121 031b 3472 retlw 114 3122 031c 3476 retlw 118 3123 031d 346f retlw 111 3124 031e 3434 retlw 52 3125 031f 3445 retlw 69 3126 0320 340f retlw 15 3127 0321 3447 retlw 71 3128 0322 3472 retlw 114 3129 0323 3461 retlw 97 3130 0324 346d retlw 109 3131 0325 346c retlw 108 3132 0326 3469 retlw 105 3133 0327 3463 retlw 99 3134 0328 3468 retlw 104 3135 0329 3426 retlw 38 3136 032a 3442 retlw 66 3137 032b 3465 retlw 101 3138 032c 346e retlw 110 3139 032d 3473 retlw 115 3140 032e 346f retlw 111 3141 032f 346e retlw 110 3142 ; line_number = 510 3143 ; string id = "\1,0,15,4,0,0,0,0\" ~ zero8 ~ zero8 ~ module_name ~ vendor_name start 3144 ; line_number = 511 3145 ; string masks = "\1,2,4,8\" start 3146 ; masks = '\1,2,4,8\' 3147 0330 : masks: 3148 ; Temporarily save index into FSR 3149 0330 0084 movwf __fsr 3150 ; Initialize PCLATH to point to this code page 3151 0331 3003 movlw masks___base>>8 3152 0332 008a movwf __pclath 3153 ; Restore index from FSR 3154 0333 0804 movf __fsr,w 3155 0334 3e36 addlw masks___base 3156 ; Index to the correct return value 3157 0335 0082 movwf __pcl 3158 ; page_group 4 3159 0336 : masks___base: 3160 0336 3401 retlw 1 3161 0337 3402 retlw 2 3162 0338 3404 retlw 4 3163 0339 3408 retlw 8 3164 ; line_number = 511 3165 ; string masks = "\1,2,4,8\" start 3166 3167 3168 ; Configuration bits 3169 ; fill = 0x0 3170 ; bg = bg11 (0x3000) 3171 ; cpd = off (0x100) 3172 ; cp = on (0x0) 3173 ; boden = off (0x0) 3174 ; mclre = off (0x0) 3175 ; pwrte = off (0x10) 3176 ; wdte = on (0x8) 3177 ; fosc = rc_no_clk (0x6) 3178 ; 12574 = 0x311e 3179 311e = __config 12574 3180 ; Define start addresses for data regions 3181 ; Region="shared___globals" Address=32" Size=64 Bytes=22 Bits=1 Available=41 3182 ; Region="shared___globals" Address=32" Size=64 Bytes=22 Bits=1 Available=41 3183 ; Region="shared___globals" Address=32" Size=64 Bytes=22 Bits=1 Available=41 3184 end