don't click here

Knuckles' Chaotix's PWM Samples (Drums)

Discussion in 'Engineering & Reverse Engineering' started by Andlabs, Aug 27, 2009.

Thread Status:
Not open for further replies.
  1. Andlabs

    Andlabs

    「いっきまーす」 Wiki Sysop
    2,175
    1
    0
    Writing my own MD/Genesis sound driver :D
    edit 29 sep 2013 - if you are coming here looking for just the samples, the WAV format rips are now at http://andlabs.lostsig.com/misc/chaotix_wav.zip
    I probably have the other files elsewhere but not right now; plus due to calamity I don't really have a complete backup of what used to be on iDisk, sorry :/ I can still try to provide files when asked



    This morning and all of yesterday was quite interesting. I've been trying to get my hands on these drums for a while to use in XMs, and here they are. This wasn't done alone; I had a fair bit of help with this, and I'll try to credit everybody. But just rip them and enjoy!

    Some technical information.

    Yesterday, Varion Icaria asked me about these samples, and I told him I was looking for them too. Having some experience with sound drivers, he located the Knuckles' Chaotix sound driver, which is 4,872 bytes (just like Sonic 2) at $75B6A in the ROM. All his talk about bank switching and the bank switching macro in Sonic 2's SVN disassembly led me to search for a bank switch in the disassembled driver. By chance, the first bank switch happened to be the one - drx, Aurochs, and Varion to thank for deciphering it.

    PWM data begins at address $58000 in the ROM. The PWM Table is at that location, followed immediately by all the samples. Samples are uncompressed in the ROM, but otherwise are the same as Sonic 1: 8-bit unsigned mono PCM @ 11025hz. The PWM Table consists of a number of 16-byte entries whose format is very straightforward:

    Bytes 0-3: Physical Address of Sample - just chop off the first byte (always $22) to get the ROM Address
    Bytes 4-7: Length of Sample
    Bytes 8-11: Always zero
    Bytes 12-15: Sample Rate

    The Sample Rate is the most interesting part. A value of $00000800 means 11025hz, and the lower the value, the lower the pitch. <a href="http://forums.sonicretro.org/index.php?showtopic=11763&hl=sample+rate" target="_blank">A post made by Sonic 65</a> told me the SMPS sample rate for 11025hz is $C. So to convert from Chaotix to SMPS and vice versa, use an inverse proportion:

    $C * $00000800 = SMPSRate * ChaotixRate

    Changing $C to 11025 will get you the real sample rate.

    If you're going to use these samples in Sonic 1/2/3/K, use $C for all the samples with 0x00000800, and do the calculation for the rest. For the ones straight out of Chaotix, you will get imprecise answers for all the others. Fortunately, these values are close to the whole number that you can just use the whole number. I included these values in a file "rates" in the compressed samples archive below, as well as in the list below.

    Here are the samples:

    81 - Electric Kick
    82 - Electric Snare
    83 - Splash Cymbal
    84 - Ride Bell
    85 - High Tom
    86 - Mid Tom (use SMPS speed $F)
    87 - Low Tom (use SMPS speed $14)
    88 - Electric Hi-Hat
    89 - Crash Cymbal
    8A - Clap
    8B - Acoustic Kick
    8C - Acoustic Snare
    8D - Bell
    8E - Fingers Snapping
    8F - Cowbell
    90 - High Click
    91 - Low Click (use SMPS speed $10)
    92 - High Bongo
    93 - Low Bongo (use SMPS speed $10)
    94 - High Timpani
    95 - Low Timpani (use SMPS speed $10)
    96 - Silence

    So that's pretty much all the info you need to know. Thanks to: Varion, drx, Aurochs, Sik, Puto, Cinossu, Sonic 65, and anyone else I missed =P

    And now, the downloads:

    PWM Table
    Raw samples
    Converted to WAV
    Compressed for Sonic 1/2/3/K
    A split.txt file for ROM splitters

    That's all, folks.

    EDIT - Varion correctly identified two of the cymbals I misidentified.
     
  2. Varion Icaria

    Varion Icaria

    He's waiting.... Tech Member
    1,019
    11
    18
    S4: Cybernetic Outbreak
    Fun fun now I can convert Chaotix songs :P
     
  3. Sonic 65

    Sonic 65

    Tech Member
    Actually, the sample rate in that post of mine was only for my custom PCM driver; the original SMPS driver used in Sonic 1 has different sample rates. I believe the sample rate for 11025Hz in the S1 driver is $1B, and the lower the sample byte, the higher the rate.

    Nevertheless, this is still great work! I'm sure it'll make Chaotix conversions a lot more accurate.
     
  4. Andlabs

    Andlabs

    「いっきまーす」 Wiki Sysop
    2,175
    1
    0
    Writing my own MD/Genesis sound driver :D
    Well it seemed to work for Sonic & Knuckles, so meh.
     
  5. Varion Icaria

    Varion Icaria

    He's waiting.... Tech Member
    1,019
    11
    18
    S4: Cybernetic Outbreak
    Keep in mind Sonic 1 and SK are very different. Although SK is very weird with the whole split sound driver.
     
  6. Tweaker

    Tweaker

    Banned
    12,387
    2
    0
    Wow, uh... I just realized that I must have never released all the information I had on Chaotix, because I pretty much knew all of this since as early as 2005.

    From my notes:
    Code (Text):
    1. Knuckles Chaotix:
    2. Music Pointers (These add to 40000): $76AE9
    3. Music Pointers (These add to 48000): $76B05
    4. Music Pointers (These add to 50000): $76B33
    5. Sound Effect Pointers (These add to 50000): $76B3B
    6.  
    7. PWM Sample Pointers: $58000
    8.  
    9. These pointers work a bit oddly. Pointers are in 10 byte chunks. First byte is the sample rate for the PCM data (in khz). Next, we have the sample pointer (Big endian, 24-bit, AKA 3 bytes). The samples are raw PCM data at about 22100hz. You can replace them with any sample at the same or lower rate. Bytes 6 and 7 are the length of the sample in bytes. Finally, bytes E and F are the rate at which the sample is played.
    10.  
    11. PWM Sample Definitions for Chaotix:
    12.  
    13. 81: Kick
    14. 82: Snare
    15. 83: Splash Cymbal
    16. 84: Ride Bell
    17. 85: High Tom
    18. 86: Mid Tom
    19. 87: Low Tom
    20. 88: Ride Center
    21. 89: Crash Cymbal
    22. 8A: Techno Clap
    23. 8B: Flat Kick
    24. 8C: Alternate Snare
    As it seems, some of my information is completely wrong. I never did look too much into this, haha.

    The plus to this—in addition to my obviously never releasing the information I had on this (honestly slipped my mind, I swear!), you also opted to complete the PWM definitions table, which is something I never finished for whatever reason. The sample rips are also going a bit above and beyond what I had planned to do, which is only a good thing.

    Great work figuring this all out, though. :)
     
  7. Shoemanbundy

    Shoemanbundy

    Researcher
    1,094
    30
    28
    Chicago, Illinois
    selling shoes
    This should be fun to play with. If only it were used in some Aphex Twin or something now :)

    Now if you could get samples of all FM and PSG instruments...that'd be sweet. But anyways, thanks!
     
  8. drx

    drx

    mfw Researcher
    2,254
    350
    63
    :rolleyes:
    Here's the code that processes PWM, from my disassembly:

    Code (Text):
    1. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.section Cache
    2.  
    3. CacheStart:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    4. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bra&nbsp;&nbsp;&nbsp;&nbsp;PWMInit
    5. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop
    6. ! ---------------------------------------------------------------------------
    7.  
    8. Cache_S_PWMInt:
    9. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bra&nbsp;&nbsp;&nbsp;&nbsp;S_PWMInt
    10. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop
    11. ! ---------------------------------------------------------------------------
    12.  
    13. PWMInit:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    14. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x30,pc), r0 ! [C000003C] = 0xAAAAAAAA
    15. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x34,pc), r1 ! [C0000040] = dword_C00001EC
    16. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @r1
    17. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x34,pc), r1 ! [C0000044] = _sysreg
    18. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;#1, r0
    19. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r0, @(pwmintclr,r1) ! PWM interrupt clear
    20. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.b&nbsp;&nbsp;&nbsp;&nbsp;r0, @(intmask,r1) ! interrupt mask
    21. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x30,pc), r0 ! [C0000048] = _pwmtimerctl
    22. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;@(0x1C,pc), r1 ! [C0000038] = 0b100000101
    23. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r1, @r0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! setup&nbsp;&nbsp;&nbsp;&nbsp;L and R&nbsp;&nbsp;&nbsp;&nbsp;channels; set TM cycle multiplier to 1
    24. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x2C,pc), r0 ! [C000004C] = _pwmcycle
    25. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;@(0x18,pc), r1 ! [C000003A] = 1047
    26. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r1, @r0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! set cycle register to&nbsp;&nbsp;&nbsp;&nbsp;1047;
    27. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! final&nbsp;&nbsp;&nbsp;&nbsp;PWM cycle becomes: 23,01MHz/1047 = 21,977KHz
    28. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x2C,pc), r6 ! [C0000050] = _pwmlchwidth
    29. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x2C,pc), r7 ! [C0000054] = _pwmrchwidth
    30. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;#~0xFFFFFFFF, r0
    31. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r0, @r6
    32. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r0, @r6
    33. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r0, @r6
    34. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r0, @r7
    35. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r0, @r7
    36. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r0, @r7
    37. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rts
    38. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop
    39. ! ---------------------------------------------------------------------------
    40. word_C0000038:&nbsp;&nbsp;&nbsp;&nbsp;.word 0b100000101&nbsp;&nbsp;&nbsp;&nbsp;! ...
    41. word_C000003A:&nbsp;&nbsp;&nbsp;&nbsp;.word 1047&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    42. dword_C000003C:&nbsp;&nbsp;&nbsp;&nbsp;.long 0xAAAAAAAA&nbsp;&nbsp;&nbsp;&nbsp;! ...
    43. off_C0000040:&nbsp;&nbsp;&nbsp;&nbsp;.long dword_C00001EC&nbsp;&nbsp;&nbsp;&nbsp;! ...
    44. dword_C0000044:&nbsp;&nbsp;&nbsp;&nbsp;.long _sysreg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    45. dword_C0000048:&nbsp;&nbsp;&nbsp;&nbsp;.long _pwmtimerctl&nbsp;&nbsp;&nbsp;&nbsp;! ...
    46. dword_C000004C:&nbsp;&nbsp;&nbsp;&nbsp;.long _pwmcycle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    47. dword_C0000050:&nbsp;&nbsp;&nbsp;&nbsp;.long _pwmlchwidth&nbsp;&nbsp;&nbsp;&nbsp;! ...
    48. dword_C0000054:&nbsp;&nbsp;&nbsp;&nbsp;.long _pwmrchwidth&nbsp;&nbsp;&nbsp;&nbsp;! ...
    49. ! ---------------------------------------------------------------------------
    50.  
    51. S_PWMInt:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    52. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;@(0x96,pc), r1 ! [C00000F2] = 0xFFFFFE10
    53. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.b&nbsp;&nbsp;&nbsp;&nbsp;@(_TOCR,r1), r0&nbsp;&nbsp;&nbsp;&nbsp;! timer&nbsp;&nbsp;&nbsp;&nbsp;output compare control register
    54. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;#2, r0
    55. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.b&nbsp;&nbsp;&nbsp;&nbsp;r0, @(_TOCR,r1)&nbsp;&nbsp;&nbsp;&nbsp;! timer&nbsp;&nbsp;&nbsp;&nbsp;output compare control register
    56. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x98,pc), r1 ! [C00000FC] = _pwmintclr
    57. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r0, @r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! clear&nbsp;&nbsp;&nbsp;&nbsp;the interrupt
    58. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x98,pc), r1 ! [C0000100] = dword_C00001EC
    59. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r1, r0
    60. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotr&nbsp;&nbsp;&nbsp;&nbsp;r0
    61. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bf/s&nbsp;&nbsp;&nbsp;&nbsp;S_PWMInt_End&nbsp;&nbsp;&nbsp;&nbsp;! return one out of two&nbsp;&nbsp;&nbsp;&nbsp;interrupts
    62. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @r1
    63. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r2, @-r15
    64. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r6, @-r15
    65. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r7, @-r15
    66. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r4, @-r15
    67. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r5, @-r15
    68. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r14, @-r15
    69. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sts.l&nbsp;&nbsp;&nbsp;&nbsp;pr, @-r15
    70. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sts.l&nbsp;&nbsp;&nbsp;&nbsp;macl, @-r15
    71. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;#0, r4
    72. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;#0, r5
    73. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;#0, r6
    74. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;#0, r7
    75. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x7C,pc), r1 ! [C0000104] = _comm8
    76. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x7C,pc), r14&nbsp;&nbsp;&nbsp;&nbsp;! [C0000108] = ~0x3FFFFE0B
    77. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bsr&nbsp;&nbsp;&nbsp;&nbsp;PWMChannel_Process
    78. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop
    79. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x7C,pc), r1 ! [C000010C] = _commA
    80. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x7C,pc), r14&nbsp;&nbsp;&nbsp;&nbsp;! [C0000110] = PWM2_Settings
    81. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bsr&nbsp;&nbsp;&nbsp;&nbsp;PWMChannel_Process
    82. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop
    83. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x7C,pc), r1 ! [C0000114] = _commC
    84. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x7C,pc), r14&nbsp;&nbsp;&nbsp;&nbsp;! [C0000118] = ~0x3FFFFDB3
    85. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bsr&nbsp;&nbsp;&nbsp;&nbsp;PWMChannel_Process
    86. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop
    87. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x7C,pc), r1 ! [C000011C] = _commE
    88. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x7C,pc), r14&nbsp;&nbsp;&nbsp;&nbsp;! [C0000120] = PWM4_Settings
    89. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bsr&nbsp;&nbsp;&nbsp;&nbsp;PWMChannel_Process
    90. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop
    91. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;@(0x4A,pc), r1 ! [C00000F4] = 0x400
    92. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;r1, r4
    93. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;r1, r5
    94. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;r1, r6
    95. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;r1, r7
    96. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;@(0x42,pc), r1 ! [C00000F6] = 0x7FF
    97. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;r1, r4
    98. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;r1, r5
    99. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;r1, r6
    100. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;r1, r7
    101. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;@(0x3A,pc), r1 ! [C00000F8] = 0x200
    102. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r1, r4
    103. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r1, r5
    104. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r1, r6
    105. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r1, r7
    106. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x5C,pc), r0 ! [C0000124] = _pwmlchwidth
    107. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x60,pc), r1 ! [C0000128] = _pwmrchwidth
    108. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lds.l&nbsp;&nbsp;&nbsp;&nbsp;@r15+, macl
    109. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lds.l&nbsp;&nbsp;&nbsp;&nbsp;@r15+, pr
    110. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r15+, r14
    111. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r4, @r0
    112. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r5, @r1
    113. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r15+, r5
    114. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r15+, r4
    115.  
    116. loc_C00000D6:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    117. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;@r0, r2
    118. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp/pz&nbsp;&nbsp;&nbsp;&nbsp;r2
    119. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt&nbsp;&nbsp;&nbsp;&nbsp;loc_C00000E4
    120. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;#0x18, r2
    121.  
    122. loc_C00000DE:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    123. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dt&nbsp;&nbsp;&nbsp;&nbsp;r2
    124. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bf&nbsp;&nbsp;&nbsp;&nbsp;loc_C00000DE
    125. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt&nbsp;&nbsp;&nbsp;&nbsp;loc_C00000D6
    126.  
    127. loc_C00000E4:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    128. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r6, @r0
    129. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r7, @r1
    130. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r15+, r7
    131. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r15+, r6
    132. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r15+, r2
    133. ! START&nbsp;&nbsp;&nbsp;&nbsp;OF FUNCTION CHUNK FOR PWMChannel_Process
    134.  
    135. S_PWMInt_End:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    136. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rts
    137. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nop
    138. ! END OF FUNCTION CHUNK&nbsp;&nbsp;&nbsp;&nbsp;FOR PWMChannel_Process
    139. ! ---------------------------------------------------------------------------
    140. word_C00000F2:&nbsp;&nbsp;&nbsp;&nbsp;.word _FRT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    141. word_C00000F4:&nbsp;&nbsp;&nbsp;&nbsp;.word 0x400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    142. word_C00000F6:&nbsp;&nbsp;&nbsp;&nbsp;.word 0x7FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    143. word_C00000F8:&nbsp;&nbsp;&nbsp;&nbsp;.word 0x200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    144. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.align 4
    145. dword_C00000FC:&nbsp;&nbsp;&nbsp;&nbsp;.long _pwmintclr&nbsp;&nbsp;&nbsp;&nbsp;! ...
    146. off_C0000100:&nbsp;&nbsp;&nbsp;&nbsp;.long dword_C00001EC&nbsp;&nbsp;&nbsp;&nbsp;! ...
    147. dword_C0000104:&nbsp;&nbsp;&nbsp;&nbsp;.long _comm8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    148. dword_C0000108:&nbsp;&nbsp;&nbsp;&nbsp;.long ~0x3FFFFE0B&nbsp;&nbsp;&nbsp;&nbsp;! ...
    149. dword_C000010C:&nbsp;&nbsp;&nbsp;&nbsp;.long _commA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    150. off_C0000110:&nbsp;&nbsp;&nbsp;&nbsp;.long PWM2_Settings&nbsp;&nbsp;&nbsp;&nbsp;! ...
    151. dword_C0000114:&nbsp;&nbsp;&nbsp;&nbsp;.long _commC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    152. dword_C0000118:&nbsp;&nbsp;&nbsp;&nbsp;.long ~0x3FFFFDB3&nbsp;&nbsp;&nbsp;&nbsp;! ...
    153. dword_C000011C:&nbsp;&nbsp;&nbsp;&nbsp;.long _commE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    154. off_C0000120:&nbsp;&nbsp;&nbsp;&nbsp;.long PWM4_Settings&nbsp;&nbsp;&nbsp;&nbsp;! ...
    155. dword_C0000124:&nbsp;&nbsp;&nbsp;&nbsp;.long _pwmlchwidth&nbsp;&nbsp;&nbsp;&nbsp;! ...
    156. dword_C0000128:&nbsp;&nbsp;&nbsp;&nbsp;.long _pwmrchwidth&nbsp;&nbsp;&nbsp;&nbsp;! ...
    157.  
    158. ;----------------------
    159. ;
    160. ; PWMChannel_Process
    161. ; - - -&nbsp;&nbsp;&nbsp;&nbsp;- - - -&nbsp;&nbsp;&nbsp;&nbsp;- - -
    162. ;
    163. ; Processes a PWM sample of ID given by&nbsp;&nbsp;&nbsp;&nbsp;r1, outputs
    164. ;&nbsp;&nbsp;it additively to a channel given by r14
    165. ;
    166. ; Variables used:
    167. ;&nbsp;&nbsp;r1&nbsp;&nbsp;(input)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- pointer; comm8, A, C, or E;&nbsp;&nbsp;&nbsp;&nbsp;depending on PWM channel
    168. ;&nbsp;&nbsp;r4&nbsp;&nbsp;(output,&nbsp;&nbsp;&nbsp;&nbsp;additive) - left channel width (1st)
    169. ;&nbsp;&nbsp;r6&nbsp;&nbsp;(output,&nbsp;&nbsp;&nbsp;&nbsp;additive) - left channel width (2st)
    170. ;&nbsp;&nbsp;r5&nbsp;&nbsp;(output,&nbsp;&nbsp;&nbsp;&nbsp;additive) - right channel width&nbsp;&nbsp;&nbsp;&nbsp;(1st)
    171. ;&nbsp;&nbsp;r7&nbsp;&nbsp;(output,&nbsp;&nbsp;&nbsp;&nbsp;additive) - right channel width&nbsp;&nbsp;&nbsp;&nbsp;(2st)
    172. ;&nbsp;&nbsp;r14 (input, output)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- pointer; PWM channel settings
    173. ;
    174. ; Variables destroyed: r0, r2
    175. ;
    176. ;----------------------
    177.  
    178. ! =============== S U B&nbsp;&nbsp;&nbsp;&nbsp;R O U T&nbsp;&nbsp;&nbsp;&nbsp;I N E =======================================
    179.  
    180.  
    181. PWMChannel_Process:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    182.  
    183. ! FUNCTION CHUNK AT C00000EE SIZE 00000004 BYTES
    184.  
    185. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;@r1, r2
    186. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r2, r2
    187. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt&nbsp;&nbsp;&nbsp;&nbsp;loc_C0000174
    188. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;@r1, r0
    189. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp/eq&nbsp;&nbsp;&nbsp;&nbsp;r2, r0
    190. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bf&nbsp;&nbsp;&nbsp;&nbsp;PWMChannel_Process
    191. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;#0, r0
    192. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;r0, @r1
    193. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extu.b&nbsp;&nbsp;&nbsp;&nbsp;r2, r0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! r0 <-&nbsp;&nbsp;&nbsp;&nbsp;lower byte ($01) of comm
    194. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(0x54,pc), r1 ! [C0000194] = Pointer_Cartridge_PWMSamplePointers
    195. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shll2&nbsp;&nbsp;&nbsp;&nbsp;r0
    196. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r1, r1
    197. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shll2&nbsp;&nbsp;&nbsp;&nbsp;r0
    198. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r0, r1
    199. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r1+, r0&nbsp;&nbsp;&nbsp;&nbsp;! address of the sample; cartridge
    200. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(PWM_SampleAddress,r14)
    201. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r1+, r0&nbsp;&nbsp;&nbsp;&nbsp;! length of the&nbsp;&nbsp;&nbsp;&nbsp;sample (in bytes)
    202. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(PWM_SampleLength,r14)
    203. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(PWM_SampleCounter,r14)
    204. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r1+, r0&nbsp;&nbsp;&nbsp;&nbsp;! ??? (always 0)
    205. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(8,r14)
    206. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@r1+, r0&nbsp;&nbsp;&nbsp;&nbsp;! sample rate
    207. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(PWM_SampleRate,r14)
    208. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;#0, r0
    209. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(PWM_SampleRateCounter,r14)
    210. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap.b&nbsp;&nbsp;&nbsp;&nbsp;r2, r0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! r0 <-&nbsp;&nbsp;&nbsp;&nbsp;upper byte of comm
    211. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! r0 <-&nbsp;&nbsp;&nbsp;&nbsp;xxxx yyyy (8-bit)
    212. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shlr2&nbsp;&nbsp;&nbsp;&nbsp;r0
    213. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shlr&nbsp;&nbsp;&nbsp;&nbsp;r0
    214. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;#0x1E, r0
    215. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;#2, r0
    216. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(PWM_LChVolume,r14) ! r0 =&nbsp;&nbsp;&nbsp;&nbsp;(r0>>3)&0x1e + 2
    217. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! r0 <-&nbsp;&nbsp;&nbsp;&nbsp;000x xxx0 + 2
    218. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap.b&nbsp;&nbsp;&nbsp;&nbsp;r2, r0
    219. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shll&nbsp;&nbsp;&nbsp;&nbsp;r0
    220. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;#0x1E, r0
    221. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;#2, r0
    222. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(PWM_RChVolume,r14) ! r0 =&nbsp;&nbsp;&nbsp;&nbsp;(r0<<1)&0x1e + 2
    223. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! r0 <-&nbsp;&nbsp;&nbsp;&nbsp;000y yyy0 + 2
    224.  
    225. loc_C0000174:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    226. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_SampleRateCounter,r14), r0
    227. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_SampleRate,r14), r1
    228. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.w&nbsp;&nbsp;&nbsp;&nbsp;@(0x14,pc), r2 ! [C0000190] = 0x800
    229. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1, r0
    230. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(PWM_SampleRateCounter,r14)
    231. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp/hs&nbsp;&nbsp;&nbsp;&nbsp;r2, r0
    232. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt&nbsp;&nbsp;&nbsp;&nbsp;loc_C0000198
    233. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_LChLastSample,r14), r0
    234. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_RChLastSample,r14), r1
    235. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r0, r4
    236. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r0, r6
    237. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1, r5
    238. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rts
    239. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1, r7
    240. ! ---------------------------------------------------------------------------
    241. word_C0000190:&nbsp;&nbsp;&nbsp;&nbsp;.word 0x800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    242. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.align 4
    243. off_C0000194:&nbsp;&nbsp;&nbsp;&nbsp;.long Pointer_Cartridge_PWMSamplePointers ! ...
    244. ! ---------------------------------------------------------------------------
    245.  
    246. loc_C0000198:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    247. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;r2, r0
    248. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(~0xFFFFFFD7,r14)
    249. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_SampleCounter,r14), r0
    250. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_SampleAddress,r14), r1
    251. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dt&nbsp;&nbsp;&nbsp;&nbsp;r0
    252. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bf&nbsp;&nbsp;&nbsp;&nbsp;loc_C00001AC
    253. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_LoopFlag,r14), r1&nbsp;&nbsp;&nbsp;&nbsp;! 0x08 - loop flag (unused)
    254. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tst&nbsp;&nbsp;&nbsp;&nbsp;r1, r1
    255. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt&nbsp;&nbsp;&nbsp;&nbsp;S_PWMInt_End
    256. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_LoopCounterResetValue,r14), r0 ! 0x0C - counter value to revert when counter=0 (unused)
    257.  
    258. loc_C00001AC:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;! ...
    259. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.b&nbsp;&nbsp;&nbsp;&nbsp;@r1+, r2
    260. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(PWM_SampleCounter,r14)
    261. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r1, @(PWM_SampleAddress,r14)
    262. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;#0xFFFFFF80, r0
    263. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;r0, r2
    264. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_LChVolume,r14), r1
    265. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;muls&nbsp;&nbsp;&nbsp;&nbsp;r1, r2
    266. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_LChLastSample,r14), r1
    267. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sts&nbsp;&nbsp;&nbsp;&nbsp;macl, r0
    268. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shar&nbsp;&nbsp;&nbsp;&nbsp;r0
    269. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shar&nbsp;&nbsp;&nbsp;&nbsp;r0
    270. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shar&nbsp;&nbsp;&nbsp;&nbsp;r0
    271. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shar&nbsp;&nbsp;&nbsp;&nbsp;r0
    272. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(PWM_LChLastSample,r14)
    273. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r0, r6
    274. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1, r0
    275. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shar&nbsp;&nbsp;&nbsp;&nbsp;r0
    276. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r0, r4
    277. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_RChVolume,r14), r1
    278. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;muls&nbsp;&nbsp;&nbsp;&nbsp;r1, r2
    279. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;@(PWM_RChLastSample,r14), r1
    280. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sts&nbsp;&nbsp;&nbsp;&nbsp;macl, r0
    281. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shar&nbsp;&nbsp;&nbsp;&nbsp;r0
    282. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shar&nbsp;&nbsp;&nbsp;&nbsp;r0
    283. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shar&nbsp;&nbsp;&nbsp;&nbsp;r0
    284. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shar&nbsp;&nbsp;&nbsp;&nbsp;r0
    285. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov.l&nbsp;&nbsp;&nbsp;&nbsp;r0, @(PWM_RChLastSample,r14)
    286. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r0, r7
    287. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r1, r0
    288. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shar&nbsp;&nbsp;&nbsp;&nbsp;r0
    289. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rts
    290. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;r0, r5
    291. ! End of function PWMChannel_Process
    292.  
    293. ! ---------------------------------------------------------------------------
    294. dword_C00001EC:&nbsp;&nbsp;&nbsp;&nbsp;.long 0xAAAAAAAA&nbsp;&nbsp;&nbsp;&nbsp;! ...
    295. Pointer_Cartridge_PWMSamplePointers:.long Cartridge_PWMSamplePointers !&nbsp;&nbsp;&nbsp;&nbsp;...
    296. PWM1_Settings:&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x10,&nbsp;&nbsp;&nbsp;&nbsp;0x800,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0
    297. PWM2_Settings:&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x10,&nbsp;&nbsp;&nbsp;&nbsp;0x800,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 ! ...
    298. PWM3_Settings:&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x10,&nbsp;&nbsp;&nbsp;&nbsp;0x800,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0
    299. PWM4_Settings:&nbsp;&nbsp;&nbsp;&nbsp;.long&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x10,&nbsp;&nbsp;&nbsp;&nbsp;0x800,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 ! ...
    300. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.align 0x400
    301.  
    302. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.end !
    edit: I also welcome you to view my Sonic 1 32x code, which has a fully working PWM driver if I recall correctly.
     
Thread Status:
Not open for further replies.