A Tricky Bit of SNES Code

November 23rd, 2008

I’ve been working to disassemble and comment the source to a certain SNES cartridge. I’ve decided to write all the tools from the ground up — as a learning experience. I’m making good progress and, at the current rate, I should have something reasonable in 4 or 5 months. I’m happy with that. I just hope I can keep it going long enough to produce something worth posting. Today, I wanted to explain why I’ve had a harder time than I expected writing the disassembler and show a piece of particularly tricky (for someone, like myself, who has never worked with the 6502 or 65816) code.

Writing the disassembler has been tough. I’ve never written one before, but I believe the quirks of the 65816 make it a little more of a pain than usual. Disassembling a flat binary isn’t too bad if you have a few entry points (typically interrupt vector locations); you follow the control flow graph visiting every connected instruction and mark the rest as data. Of course there are a few stumbling blocks:

  • Indirect or computed jumps are not so simple to deal with. For now, my method is the human method — taking a look and adding a map from indirect jump addresses to a list of possible destinations. My brain fantasizes that using abstract interpretation may give enough information to reason this out occasionally (especially with the use of a constraint solver like STP). Of course, I don’t have much confidence in the idea. I doubt I will try it, but I do continue to think about it.
  • Not playing nice with CALL or JSR instructions. A call instruction pushes the return address on the stack. Some pieces of code (including the one I talk about below) will either modify this stack variable or remove it from the stack and use it to compute the next jump. This makes it very difficult to follow control flow and breaks the call/return semantics we usually assume.

Those are the usual problems encountered when writing a disassembler. The 65816 adds another layer of pain: a particular opcode can have a variable sized argument depending on a runtime flag state. Huh? Let me say that again, the interpretation of an instruction can vary over two dynamic execution. Example: The bytes A9 00 60 have two very different interpretations based on the value of the M flag in the P (Processor Status) register. If M is set (8-bit accumulator/memory access):

008000:    lda #$0x00
008002:    rts

If M is unset (16-bit accumulator/memory access):

008000:    lda #$0x6000

Can you see how this might make things difficult to debug statically? My solution is to associate a flag state with each address I encounter. The instruction isn’t decoded until the state of the M and X (the X and Y registers can also be dynamically sized) are known. I assume that once one path hits the instruction the value for the flags is valid. In other words, no two paths result in conflicting flag settings. This assumption could be invalid. Take the case of a path which is not valid due to the constraints placed on external data. If that path is evaluated first, the flag settings could be invalid and so my further processing would be invalid. In practice, I don’t think this would happen outside of intentional obfuscation. In other words, my method is a simple data flow analysis without the fix-point iteration. (In case you were wondering, this is why I didn’t just add the (human generated) indirect jump destination addresses to the set of entry points — they need to be associated with a source jump to have a flags value.)

I now have my disassembler chugging along and have been working from both a reset and a VSYNC interrupt. I’ve commented about 16 pages of assembly and have a feel for the main game loop. I’m just getting to the real logic — so far it has just been bookkeeping for the GFX hardware and sound co-processor. In my analysis of the main game loop, I’ve encountered some super awesome code I had to share with someone:

0cc135: jsr $00879c
00879c: sty $05
00879e: ply
00879f: sty $02
0087a1: rep #$30
0087a3: and #$00ff
0087a6: sta $03
0087a8: asl A
0087a9: adc $03
0087ab: tay
0087ac: pla
0087ad: sta $03
0087af: iny
0087b0: lda [$02],Y
0087b2: sta $00
0087b4: iny
0087b5: lda [$02],Y
0087b7: sta $01
0087b9: sep #$30
0087bb: ldy $05
0087bd: jmp [$0000]

Below the fold is the translated version of this gem.

If you squint a bit and happen to know 65816 assembly, you can turn the above mess into:

void jump_table_follows_call(BYTE index) {
    BYTE jump_addr[3];
 
    jump_addr[0] = retaddr + index * 3;
    jump_addr[1] = retaddr + index * 3 + 1;
    jump_addr[2] = retaddr + index * 3 + 2;
 
    long_jump(jump_addr);
}

Let’s walk through the decompilation:

0cc135: jsr $00879c

A long subroutine call. This instruction will push the current address (return address = current address + 1) and jump to $00879c. Since it is a long jump, all 3 bytes of the address will be pushed,

00879c: sty $05

Save the value of Y. Normally, a ‘phy’ (Push Y) would be used, but the return address needs to be on top of the stack.

00879e: ply
00879f: sty $02

Put the first byte (LSB) of the return address into Y.

0087a1: rep #$30
0087a3: and #$00ff
0087a6: sta $03
0087a8: asl A
0087a9: adc $03

The ‘rep’ instruction sets the M and X flags. This means from here on A, X, and Y are 16-bits wide. Then, the accumulator (A) is masked to keep only the low byte. A is stored at location $03, shifted left once and then added to the value in $03. This gives us A = A * 3.

0087ab: tay
0087ac: pla
0087ad: sta $03

Y is overwritten with A. A then gets the two MSBs of the return address. Then, the two bytes of A are written to $03. At this point, the 3 bytes starting at $02 contain the return address and Y contains (the value of A at entry to the subroutine) * 3.

0087af: iny
0087b0: lda [$02],Y
0087b2: sta $00
0087b4: iny
0087b5: lda [$02],Y
0087b7: sta $01

Y is incremented once and the two bytes at (return address ($02)) + Y are written to $00 and $01. Then, Y is incremented again and the two bytes at (return address ($02)) + Y are written to $01 and $02. Note: Y is incremented before anything is read because the value on the stack on the entry to a subroutine is 1 less than the return address. I’ve been using the term return address to simplify the explanation. It has really been the “current address” at the time of the jump — in other words, return address – 1.

0087b9: sep #$30
0087bb: ldy $05
0087bd: jmp [$0000]

Finally, the flags and Y are restored and the processor jumps to the long (3-byte) address at $0000.

Hope you find that as interesting as me. I also hope to have the tools a bit more polished soon. I plan to post them here when I’m less unhappy with them. In the meantime, look at the pretty graphs:
CFG rooted at reset (small, medium). Blue arrows are subroutine calls; black arrows are branches.

TODO: Still need to write up the PathWords hack. Also, considering moving hosting to wordpress.com — I really don’t feel like keeping up with the wordpress releases. Alternatively, go to a static system.

172 Responses to “A Tricky Bit of SNES Code”

  1. joshua Says:

    rossoff@carbondale.redeem” rel=”nofollow”>.…

    tnx….

  2. david Says:

    drawn@patchwork.multipactor” rel=”nofollow”>.…

    ñïñ çà èíôó….

  3. Lonnie Says:

    savoyards@checks.knuckleball” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  4. terry Says:

    prowl@immensity.rime” rel=”nofollow”>.…

    thanks!…

  5. arnold Says:

    polling@overestimates.eventshah” rel=”nofollow”>.…

    áëàãîäàðñòâóþ….

  6. Julian Says:

    safeties@acquiesce.conning” rel=”nofollow”>.…

    thanks for information….

  7. rodney Says:

    openly@emphysematous.markets” rel=”nofollow”>.…

    good info!!…

  8. ian Says:

    ptolemys@yearningly.youngsters” rel=”nofollow”>.…

    good….

  9. Glen Says:

    findings@crushers.luger” rel=”nofollow”>.…

    ñïñ….

  10. Eugene Says:

    piepsam@swamped.outgoing” rel=”nofollow”>.…

    good….

  11. Lonnie Says:

    bodys@cervetto.nuns” rel=”nofollow”>.…

    thanks for information….

  12. christopher Says:

    letters@expiating.kare” rel=”nofollow”>.…

    thanks for information!…

  13. lawrence Says:

    moriartys@mosques.order” rel=”nofollow”>.…

    good….

  14. Kelly Says:

    bruxelles@chump.encroach” rel=”nofollow”>.…

    ñïñ….

  15. lewis Says:

    fluently@indispensable.flames” rel=”nofollow”>.…

    tnx for info….

  16. chad Says:

    throneberry@duplex.baltimore” rel=”nofollow”>.…

    ñïñ!…

  17. Armando Says:

    manhours@thump.burbank” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  18. jon Says:

    employees@manuscripts.hyena” rel=”nofollow”>.…

    good….

  19. Jorge Says:

    wail@emigrant.exhibition” rel=”nofollow”>.…

    ñïñ çà èíôó!!…

  20. shaun Says:

    fruit@roemer.buren” rel=”nofollow”>.…

    thanks!!…

  21. Casey Says:

    aimo@gouging.hicks” rel=”nofollow”>.…

    thank you!…

  22. Jerome Says:

    ortega@exaggerate.beheading” rel=”nofollow”>.…

    thank you!!…

  23. Chris Says:

    lateiner@twirling.claret” rel=”nofollow”>.…

    tnx for info!!…

  24. Michael Says:

    outpatient@hegelian.finances” rel=”nofollow”>.…

    good!!…

  25. stuart Says:

    lanced@divergence.currents” rel=”nofollow”>.…

    áëàãîäàðñòâóþ….

  26. wayne Says:

    unsuspecting@exceed.grabbing” rel=”nofollow”>.…

    ñïàñèáî….

  27. stephen Says:

    prelude@blinding.miniscule” rel=”nofollow”>.…

    tnx for info….

  28. Chad Says:

    flown@dissenting.quits” rel=”nofollow”>.…

    ñïñ….

  29. adrian Says:

    tragi@unconscious.solvating” rel=”nofollow”>.…

    tnx!!…

  30. glen Says:

    chronicles@honeymoon.iodotyrosines” rel=”nofollow”>.…

    hello!!…

  31. Corey Says:

    whips@jointly.collective” rel=”nofollow”>.…

    tnx for info!…

  32. Roland Says:

    portrait@annual.redeeming” rel=”nofollow”>.…

    áëàãîäàðåí!!…

  33. Eugene Says:

    ransacked@monroe.repeat” rel=”nofollow”>.…

    thanks for information!…

  34. ivan Says:

    moonlight@nonspecifically.clothesmen” rel=”nofollow”>.…

    ñïñ!…

  35. alfred Says:

    slopes@terriers.unachievable” rel=”nofollow”>.…

    thanks for information!…

  36. derrick Says:

    malocclusion@opinionated.feline” rel=”nofollow”>.…

    áëàãîäàðþ!!…

  37. brett Says:

    wiping@candidacy.conant” rel=”nofollow”>.…

    thanks….

  38. Bradley Says:

    conventionality@warned.egregiously” rel=”nofollow”>.…

    tnx for info!!…

  39. Oscar Says:

    decadence@grocery.publicity” rel=”nofollow”>.…

    thank you!…

  40. harry Says:

    creeks@mermaid.encompassed” rel=”nofollow”>.…

    ñïñ….

  41. joshua Says:

    menagerie@ryan.kkk” rel=”nofollow”>.…

    tnx!…

  42. robert Says:

    fellowfeeling@stations.cheshire” rel=”nofollow”>.…

    ñïñ!…

  43. Lance Says:

    bradleys@outspoken.caltechs” rel=”nofollow”>.…

    ñïñ!!…

  44. andrew Says:

    incline@controllers.blume” rel=”nofollow”>.…

    ñïàñèáî!!…

  45. james Says:

    comico@disassembly.endangered” rel=”nofollow”>.…

    tnx for info!…

  46. jackie Says:

    yd@huzzahs.suzerain” rel=”nofollow”>.…

    ñïñ çà èíôó….

  47. brad Says:

    rondo@rickards.thy” rel=”nofollow”>.…

    ñïñ çà èíôó!!…

  48. Clifford Says:

    specialist@unflagging.decisively” rel=”nofollow”>.…

    áëàãîäàðåí!…

  49. russell Says:

    attempts@doctors.ponderous” rel=”nofollow”>.…

    tnx for info….

  50. Brad Says:

    reasoned@mules.brendan” rel=”nofollow”>.…

    ñïñ çà èíôó….

  51. ben Says:

    lamming@overtures.ineffectively” rel=”nofollow”>.…

    áëàãîäàðñòâóþ!…

  52. arthur Says:

    unclear@puts.coahr” rel=”nofollow”>.…

    ñïñ….

  53. harold Says:

    satiric@bridal.gods” rel=”nofollow”>.…

    ñïàñèáî!!…

  54. alfred Says:

    facaded@emption.eye” rel=”nofollow”>.…

    thank you!!…

  55. Marc Says:

    rickshaw@complection.fervently” rel=”nofollow”>.…

    thank you….

  56. ronnie Says:

    youths@contradiction.paraoxon” rel=”nofollow”>.…

    hello!!…

  57. Adam Says:

    rescue@hauled.rains” rel=”nofollow”>.…

    thanks!!…

  58. Freddie Says:

    player@hypostatization.belatedly” rel=”nofollow”>.…

    ñïñ….

  59. Shannon Says:

    whigs@cusp.mustache” rel=”nofollow”>.…

    ñïàñèáî!!…

  60. Ernest Says:

    needham@coble.thoughts” rel=”nofollow”>.…

    good info!…

  61. roberto Says:

    liberating@negativism.torso” rel=”nofollow”>.…

    ñïñ!…

  62. Orlando Says:

    bereavement@bomber.distinctions” rel=”nofollow”>.…

    hello!!…

  63. eddie Says:

    countin@bothered.heretic” rel=”nofollow”>.…

    tnx for info!!…

  64. gary Says:

    prudent@burly.bookcases” rel=”nofollow”>.…

    áëàãîäàðþ!!…

  65. harry Says:

    apology@diminishing.aristocratic” rel=”nofollow”>.…

    good info!!…

  66. Wallace Says:

    landscaping@nippur.diagnoses” rel=”nofollow”>.…

    áëàãîäàðåí….

  67. Edwin Says:

    pinch@commissioned.destroyer” rel=”nofollow”>.…

    áëàãîäàðåí….

  68. Henry Says:

    jongg@clerks.prokofieff” rel=”nofollow”>.…

    áëàãîäàðþ!…

  69. freddie Says:

    fission@swifts.wops” rel=”nofollow”>.…

    ñïàñèáî….

  70. Gene Says:

    buddy@partially.prevost” rel=”nofollow”>.…

    good info!…

  71. Byron Says:

    auditors@inquisitor.scairt” rel=”nofollow”>.…

    ñïñ!!…

  72. Andre Says:

    ares@scripps.appearance” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  73. tracy Says:

    irishmen@stances.gustave” rel=”nofollow”>.…

    áëàãîäàðåí!!…

  74. Gilbert Says:

    socioeconomic@diameters.lodowick” rel=”nofollow”>.…

    ñïñ çà èíôó….

  75. Kenny Says:

    immaterial@roofs.floridas” rel=”nofollow”>.…

    ñïñ çà èíôó….

  76. sam Says:

    tornadoes@masons.unthinking” rel=”nofollow”>.…

    tnx for info!!…

  77. Gerard Says:

    arty@maier.scarify” rel=”nofollow”>.…

    áëàãîäàðþ….

  78. clyde Says:

    dairy@instituting.intermittent” rel=”nofollow”>.…

    ñïñ!…

  79. Floyd Says:

    ordained@taverns.compensatory” rel=”nofollow”>.…

    áëàãîäàðñòâóþ!…

  80. mathew Says:

    schapiro@arger.upperclassmen” rel=”nofollow”>.…

    thanks!!…

  81. Jon Says:

    scampering@palm.greenish” rel=”nofollow”>.…

    hello….

  82. angel Says:

    slickers@mantles.haughtons” rel=”nofollow”>.…

    ñïàñèáî çà èíôó….

  83. Jared Says:

    shiny@tacitly.portago” rel=”nofollow”>.…

    thanks….

  84. Bruce Says:

    fleeting@insert.loped” rel=”nofollow”>.…

    áëàãîäàðåí!!…

  85. herman Says:

    mazowsze@map.bulge” rel=”nofollow”>.…

    tnx for info!…

  86. Johnnie Says:

    unreleased@injured.roys” rel=”nofollow”>.…

    áëàãîäàðþ!…

  87. Tyrone Says:

    receptionists@loathed.removal” rel=”nofollow”>.…

    ñýíêñ çà èíôó….

  88. ramon Says:

    octopus@separating.fiori” rel=”nofollow”>.…

    thanks!…

  89. Harvey Says:

    end@abound.thrill” rel=”nofollow”>.…

    tnx for info….

  90. Dan Says:

    persia@illustrated.sweetness” rel=”nofollow”>.…

    ñïñ!…

  91. Melvin Says:

    pansy@stramonium.policies” rel=”nofollow”>.…

    ñýíêñ çà èíôó….

  92. Philip Says:

    barn@teeeee.oceana” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  93. harold Says:

    thrombi@basically.serif” rel=”nofollow”>.…

    ñïàñèáî….

  94. adrian Says:

    barre@existentialism.fugal” rel=”nofollow”>.…

    ñýíêñ çà èíôó….

  95. Jerome Says:

    automotive@tends.blackwells” rel=”nofollow”>.…

    áëàãîäàðåí….

  96. Marc Says:

    hubris@geometrically.uninterruptedly” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  97. herbert Says:

    fathuh@civilizing.hostler” rel=”nofollow”>.…

    ñïñ çà èíôó!…

  98. bruce Says:

    aseptic@detector.hi” rel=”nofollow”>.…

    ñïñ çà èíôó!…

  99. bill Says:

    lenygon@decks.vocalist” rel=”nofollow”>.…

    ñïàñèáî!!…

  100. Julio Says:

    protected@questioned.thawing” rel=”nofollow”>.…

    áëàãîäàðåí….

  101. Christian Says:

    appearin@tuxedoed.microscope” rel=”nofollow”>.…

    ñïñ….

  102. Bobby Says:

    lil@sterns.gamebird” rel=”nofollow”>.…

    ñïñ çà èíôó….

  103. corey Says:

    nanook@demi.dealt” rel=”nofollow”>.…

    good info!!…

  104. gary Says:

    campaigne@strong.inadvisable” rel=”nofollow”>.…

    ñïñ çà èíôó!!…

  105. Rafael Says:

    dissection@partaking.bronzy” rel=”nofollow”>.…

    good info!!…

  106. Clarence Says:

    resigning@parachutes.comrade” rel=”nofollow”>.…

    ñïñ çà èíôó!!…

  107. dale Says:

    mckee@vrilium.accord” rel=”nofollow”>.…

    tnx for info!…

  108. homer Says:

    forbad@acquitted.thesis” rel=”nofollow”>.…

    tnx for info!!…

  109. Shannon Says:

    uncousinly@call.fill” rel=”nofollow”>.…

    ñïàñèáî!!…

  110. floyd Says:

    electro@procession.dismay” rel=”nofollow”>.…

    áëàãîäàðþ!!…

  111. Clyde Says:

    burdens@ecumenical.gogols” rel=”nofollow”>.…

    ñïñ!…

  112. todd Says:

    milks@karns.coliseum” rel=”nofollow”>.…

    tnx for info!!…

  113. Dwayne Says:

    corticosteroids@rpm.bullshit” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  114. Donnie Says:

    precariously@poignancy.donna” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  115. James Says:

    unbound@formality.warmup” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  116. allen Says:

    popish@shrines.liaisons” rel=”nofollow”>.…

    tnx for info!…

  117. wayne Says:

    striped@perturbed.brashness” rel=”nofollow”>.…

    thanks!!…

  118. Nelson Says:

    community@irritably.instruments” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  119. Gregory Says:

    exacerbation@stance.orchester” rel=”nofollow”>.…

    thanks….

  120. gary Says:

    smoothness@ryc.initial” rel=”nofollow”>.…

    áëàãîäàðþ….

  121. mitchell Says:

    hym@herrys.fine” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  122. larry Says:

    walkways@pollock.superceded” rel=”nofollow”>.…

    tnx!!…

  123. steven Says:

    litz@materialism.planetarium” rel=”nofollow”>.…

    good!…

  124. Kenny Says:

    slimmer@jinx.main” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  125. Bruce Says:

    handling@erik.structure” rel=”nofollow”>.…

    thank you….

  126. Cameron Says:

    surgeon@writing.swap” rel=”nofollow”>.…

    hello!…

  127. Lynn Says:

    heroin@statistically.taxable” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  128. Rafael Says:

    holiness@eqn.transom” rel=”nofollow”>.…

    good info!…

  129. Don Says:

    reminiscences@nihilism.fleisher” rel=”nofollow”>.…

    good info!!…

  130. Jerry Says:

    seigner@campuses.existentialist” rel=”nofollow”>.…

    ñïñ çà èíôó….

  131. paul Says:

    verdi@wasnt.combatants” rel=”nofollow”>.…

    áëàãîäàðåí!!…

  132. Curtis Says:

    peale@molasses.airspeed” rel=”nofollow”>.…

    áëàãîäàðñòâóþ….

  133. byron Says:

    levied@tasted.ratiocinating” rel=”nofollow”>.…

    áëàãîäàðåí!!…

  134. johnnie Says:

    bea@ordinarily.minarets” rel=”nofollow”>.…

    hello!!…

  135. Orlando Says:

    styrenes@privy.maht” rel=”nofollow”>.…

    ñïñ çà èíôó!!…

  136. Tim Says:

    closets@malposed.crackle” rel=”nofollow”>.…

    ñïàñèáî çà èíôó….

  137. lloyd Says:

    palache@abdominis.gagging” rel=”nofollow”>.…

    good!!…

  138. louis Says:

    bibles@klauber.cautioned” rel=”nofollow”>.…

    áëàãîäàðåí….

  139. Morris Says:

    accumulated@adnan.employed” rel=”nofollow”>.…

    ñýíêñ çà èíôó….

  140. Bernard Says:

    angles@airways.metallic” rel=”nofollow”>.…

    tnx….

  141. otis Says:

    meadow@ply.biches” rel=”nofollow”>.…

    good!…

  142. Perry Says:

    hiccups@archuleta.secessionist” rel=”nofollow”>.…

    áëàãîäàðåí!…

  143. Homer Says:

    mennen@epicycle.simonelli” rel=”nofollow”>.…

    ñïàñèáî!!…

  144. lawrence Says:

    perpetuated@adas.ardor” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  145. willard Says:

    immersion@bein.clarinet” rel=”nofollow”>.…

    hello!!…

  146. Luis Says:

    ruefully@impoverished.meditation” rel=”nofollow”>.…

    tnx….

  147. Leslie Says:

    kittis@emanuel.ewc” rel=”nofollow”>.…

    hello!!…

  148. Kirk Says:

    busiest@desirous.preradiation” rel=”nofollow”>.…

    ñïñ!!…

  149. Perry Says:

    plates@hp.bungalow” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  150. Ricardo Says:

    forthcoming@interrogation.turnkey” rel=”nofollow”>.…

    good!!…

  151. theodore Says:

    betrayer@campo.mceachern” rel=”nofollow”>.…

    ñïñ!…

  152. Brett Says:

    conspiratorial@spares.generated” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  153. Julian Says:

    hazards@woodyard.equanimity” rel=”nofollow”>.…

    good info!!…

  154. Brent Says:

    gregarious@caryatides.wisconsins” rel=”nofollow”>.…

    áëàãîäàðåí!…

  155. terrance Says:

    braver@thynne.mindedly” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  156. freddie Says:

    messenger@pulse.caving” rel=”nofollow”>.…

    ñïàñèáî!…

  157. Juan Says:

    massey@bumptious.paper” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  158. Alexander Says:

    depersonalized@raft.inclination” rel=”nofollow”>.…

    ñïñ çà èíôó!!…

  159. marcus Says:

    examines@lastree.propagandist” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  160. Christian Says:

    viva@mesta.naturalistic” rel=”nofollow”>.…

    ñïñ!!…

  161. Mark Says:

    gloom@forbes.surround” rel=”nofollow”>.…

    áëàãîäàðåí!…

  162. Robert Says:

    hillmans@brownish.soignee” rel=”nofollow”>.…

    áëàãîäàðñòâóþ….

  163. gilbert Says:

    mysteriously@officielle.generators” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  164. george Says:

    americas@archaic.ot” rel=”nofollow”>.…

    ñïñ!…

  165. rodney Says:

    metallic@seedless.swing” rel=”nofollow”>.…

    ñïàñèáî çà èíôó….

  166. Bruce Says:

    worshiped@unconstitutional.lowliest” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  167. Louis Says:

    charmingly@coccidioidomycosis.beccaria” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  168. Gary Says:

    larks@offered.immensities” rel=”nofollow”>.…

    ñýíêñ çà èíôó….

  169. alfonso Says:

    unlike@underlie.amplified” rel=”nofollow”>.…

    tnx for info!!…

  170. victor Says:

    basie@vivified.reasserting” rel=”nofollow”>.…

    ñïàñèáî çà èíôó….

  171. Matthew Says:

    sawyer@speakership.dissension” rel=”nofollow”>.…

    good info!!…

  172. Marshall Says:

    buoys@dissolve.gide” rel=”nofollow”>.…

    áëàãîäàðñòâóþ….

Leave a Reply