tm2.asx
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:28k
源码类别:

Windows CE

开发平台:

C/C++

  1. ;-------------------
  2. ;  TMC 2.00 Player
  3. ;------------------
  4. player equ $200
  5. normal equ 1 ; change to 0 for short version
  6.        org player
  7. addr   equ $fa
  8. byte   equ $fc
  9. bajt   equ $fd
  10. filter equ $fe
  11. maxvol equ $ff
  12. ; some tables on start (to avoid page breaking)
  13. voltab dta d'                '
  14.        dta d'        !!!!!!!!'
  15.        dta d'    !!!!!!!!""""'
  16.        dta d'   !!!!!"""""###'
  17.        dta d'  !!!!""""####$$'
  18.        dta d'  !!!"""###$$$%%'
  19.        dta d'  !!"""##$$$%%&&'
  20.        dta d'  !!""##$$%%&&'''''
  21.        dta d' !!""##$$%%&&''''('
  22.        dta d' !!""#$$%%&''''(()'
  23.        dta d' !!"##$%%&''''())*'
  24.        dta d' !!"#$$%&''''()**+'
  25.        dta d' !""#$%&&''()**+,'
  26.        dta d' !"##$%&''()**+,-'
  27.        dta d' !"#$%&''''()*+,-.'
  28.        dta d' !"#$%&''()*+,-./'
  29. frqtab dta 0,$f1,$e4,$d7
  30.        dta $cb,$c0,$b5,$aa
  31.        dta $a1,$98,$8f,$87
  32.        dta $7f,$78,$72,$6b
  33.        dta $65,$5f,$5a,$55
  34.        dta $50,$4b,$47,$43
  35.        dta $3f,$3c,$38,$35
  36.        dta $32,$2f,$2c,$2a
  37.        dta $27,$25,$23,$21
  38.        dta $1f,$1d,$1c,$1a
  39.        dta $18,$17,$16,$14
  40.        dta $13,$12,$11,$10
  41.        dta 15,14,13,12
  42.        dta 11,10,9,8
  43.        dta 7,6,5,4
  44.        dta 3,2,1,0
  45.        dta 0,$f2,$e9,$da
  46.        dta $ce,$bf,$b6,$aa
  47.        dta $a1,$98,$8f,$89
  48.        dta $80,$7a,$71,$6b
  49.        dta $65,$5f,$5c,$56
  50.        dta $50,$4d,$47,$44
  51.        dta $3e,$3c,$38,$35
  52.        dta $32,$2f,$2d,$2a
  53.        dta $28,$25,$23,$21
  54.        dta $1f,$1d,$1c,$1a
  55.        dta $18,$17,$16,$14
  56.        dta $13,$12,$11,$10
  57.        dta 15,14,13,12
  58.        dta 11,10,9,8
  59.        dta 7,6,5,4
  60.        dta 3,2,1,0
  61.        dta 0,$ff,$f1,$e4
  62.        dta $d8,$ca,$c0,$b5
  63.        dta $ab,$a2,$99,$8e
  64.        dta $87,$7f,$79,$73
  65.        dta $70,$66,$61,$5a
  66.        dta $55,$52,$4b,$48
  67.        dta $43,$3f,$3c,$39
  68.        dta $37,$33,$30,$2d
  69.        dta $2a,$28,$25,$24
  70.        dta $21,$1f,$1e,$1c
  71.        dta $1b,$19,$17,$16
  72.        dta $15,$13,$12,$11
  73.        dta $10,15,14,13
  74.        dta 12,11,10,9
  75.        dta 8,7,6,5
  76.        dta 4,3,2,1
  77.        dta 0,$f3,$e6,$d9
  78.        dta $cc,$c1,$b5,$ad
  79.        dta $a2,$99,$90,$88
  80.        dta $80,$79,$72,$6c
  81.        dta $66,$60,$5b,$55
  82.        dta $51,$4c,$48,$44
  83.        dta $40,$3c,$39,$35
  84.        dta $32,$2f,$2d,$2a
  85.        dta $28,$25,$23,$21
  86.        dta $1f,$1d,$1c,$1a
  87.        dta $18,$17,$16,$14
  88.        dta $13,$12,$11,$10
  89.        dta 15,14,13,12
  90.        dta 11,10,9,8
  91.        dta 7,6,5,4
  92.        dta 3,2,1,0
  93. basslo dta l($be2,$b38,$a8c,$a00)
  94.        dta l($96a,$8e8,$86a,$7ef)
  95.        dta l($780,$708,$6ae,$646)
  96.        dta l($5e6,$595,$541,$4f6)
  97.        dta l($4b0,$46e,$430,$3f6)
  98.        dta l($3bb,$384,$352,$322)
  99.        dta l($2f4,$2c8,$2a0,$27a)
  100.        dta l($255,$234,$214,$1f5)
  101.        dta l($1d8,$1bd,$1a4,$18d)
  102.        dta l($177,$160,$14e,$138)
  103.        dta l($127,$115,$106,$0f7)
  104.        dta l($0e8,$0db,$0cf,$0c3)
  105.        dta l($0b8,$0ac,$0a2,$09a)
  106.        dta l($090,$088,$07f,$078)
  107.        dta l($070,$06a,$064,$05e)
  108.        dta l($057,$052,$032,$00a)
  109.        dta 0,$f2,$33,$96
  110.        dta $e2,$38,$8c,$00
  111.        dta $6a,$e8,$6a,$ef
  112.        dta $80,$08,$ae,$46
  113.        dta $e6,$95,$41,$f6
  114.        dta $b0,$6e,$30,$f6
  115.        dta $bb,$84,$52,$22
  116.        dta $f4,$c8,$a0,$7a
  117.        dta $55,$34,$14,$f5
  118.        dta $d8,$bd,$a4,$8d
  119.        dta $77,$60,$4e,$38
  120.        dta $27,$15,$06,$f7
  121.        dta $e8,$db,$cf,$c3
  122.        dta $b8,$ac,$a2,$9a
  123.        dta $90,$88,$7f,$78
  124.        dta $70,$6a,$64,$5e
  125. basshi dta h($be2,$b38,$a8c,$a00)
  126.        dta h($96a,$8e8,$86a,$7ef)
  127.        dta h($780,$708,$6ae,$646)
  128.        dta h($5e6,$595,$541,$4f6)
  129.        dta h($4b0,$46e,$430,$3f6)
  130.        dta h($3bb,$384,$352,$322)
  131.        dta h($2f4,$2c8,$2a0,$27a)
  132.        dta h($255,$234,$214,$1f5)
  133.        dta h($1d8,$1bd,$1a4,$18d)
  134.        dta h($177,$160,$14e,$138)
  135.        dta h($127,$115,$106,$0f7)
  136.        dta h($0e8,$0db,$0cf,$0c3)
  137.        dta h($0b8,$0ac,$0a2,$09a)
  138.        dta h($090,$088,$07f,$078)
  139.        dta h($070,$06a,$064,$05e)
  140.        dta h($057,$052,$032,$00a)
  141.        dta 0,13,13,12
  142.        dta 11,11,10,10
  143.        dta 9,8,8,7
  144.        dta 7,7,6,6
  145.        dta 5,5,5,4
  146.        dta 4,4,4,3
  147.        dta 3,3,3,3
  148.        dta 2,2,2,2
  149.        dta 2,2,2,1
  150.        dta 1,1,1,1
  151.        dta 1,1,1,1
  152.        dta 1,1,1,0
  153.        dta 0,0,0,0
  154.        dta 0,0,0,0
  155.        dta 0,0,0,0
  156.        dta 0,0,0,0
  157. tables_len equ *-player
  158. ;      org +$300
  159.        jmp init
  160.        jmp play
  161.        jmp sound
  162. ; some external controls
  163. quadro dta 1           ; 0=mono, 1-63=stereo, 64-127= RMT stereo, 128-255=quadro
  164. pokeys dta 16          ; which data should go to which pokey (0,1,2 and 3 respectively)
  165.        dta 20          ; for stereo config: 16=first 4 tracks, 20=last 4 tracks
  166.        dta 0           ; for quadro values should be:
  167.        dta 0           ; 0=main volume from tracks 0-3, 4=main volume from tracks 4-5
  168.                        ; 8=additional volume from tracks 0-3, 12=additional volume from tracks 4-5
  169.                        ; typical: 0,4,12,8 which should sound well on pokeys 0&2 on left channel
  170.                        ; and pokeys 1&3 on right channel
  171.                        ; (on stereo atari these settings should also sound well)
  172. silent dta d'        ' ; which channel should be silent
  173. ; these values are usable from the outside of player
  174. czygrc dta 0           ; if song should be played
  175. pozsng dta 0           ; position in song
  176. specialflag dta 0      ; flag triggered in song data
  177. adrsng dta a(0)        ; address of song line
  178. tempo  dta 0           ; tempo of song
  179. ltempo dta 0           ; counter of tempo
  180. pozptr dta 0           ; counter of positions in patterns (64 means end of pattern)
  181.        ift normal ; !!!
  182. aud1   dta 0           ; total AUDCTL of left channel
  183. aud2   dta 0           ; and right
  184. voltabs equ *          ; (24 bytes)
  185.        eif ; !!!
  186. vol1ch dta d'        ' ; volume of main channels
  187.        ift normal ; !!!
  188. vol2ch dta d'        ' ; volume of additional channels
  189. volume dta d'        ' ; volume of channels in stereo (taken from vol1ch and vol2ch)
  190. freqtabs equ *         ; (24 bytes)
  191.        eif ; !!!
  192. frq    dta d'        ' ; frequency
  193.        ift normal ; !!!
  194. note   dta d'        ' ; actual note played on channel (taken from aktwys)
  195. freqen dta d'        ' ; frequency of channels in stereo (taken from frq)
  196.        eif ; !!!
  197. ; data for accesing pattern data
  198. adrptl dta d'        ' ; address of pattern data
  199. adrpth dta d'        ' ;
  200. pozwpt dta d'        ' ; index for accesing data in pattern
  201. poddzw dta d'        ' ; change of note
  202. delay  dta d'        ' ; how many spaces in pattern should be skipped
  203. ; data for accesing instrument data
  204. czygrx dta d'        ' ; if something is played on channel
  205. adrsnl dta d'        ' ; address of instrument data
  206. adrsnh dta d'        ' ;
  207. numdzw dta d'        ' ; number of instrument
  208. wysdzw dta d'        ' ; note to play
  209. aktwys dta d'        ' ; actual played note
  210. znksz  dta d'        ' ; distortion
  211. audctl dta d'        ' ; AUDCTL
  212. slupy  dta d'        ' ; counter for data inside instrument
  213. ; data for specific sound effects
  214. sndlen dta d'        ' ; length of instrument
  215. sndlop dta d'        ' ; where to loop sound data
  216. actvol dta d'        ' ; volume of sounds
  217. actvl1 dta d'        ' ; actual control of main volume
  218.        ift normal ; !!!
  219. actvl2 dta d'        ' ; and additional volume
  220.        eif ; !!!
  221. opad1  dta d'        ' ; how soon the sound should fade (main volume)
  222. opad2  dta d'        ' ; and additional volume
  223. lopad1 dta d'        ' ; counters for fading
  224. lopad2 dta d'        ' ;
  225. opadst dta d'        ' ; start of fading
  226. typ    dta d'        ' ; type of effect
  227. param  dta d'        ' ; parameter for effect
  228. typdat dta d'        ' ; data for effect
  229. czekaj dta d'        ' ; how soon the effect should start
  230. dtyp   dta d'        ' ; how often the effect should chanfe
  231. ltyp   dta d'        ' ; counter for effect change
  232. ilperm dta d'        ' ; how many arpeggio sounds
  233. aperm  dta d'        ' ; actual arpeggio sound
  234. dperm  dta d'        ' ; how soon the arpeggio should change
  235. lperm  dta d'        ' ; counter for arpeggio
  236. kolejn dta d'        ' ; order of arpeggio
  237. sndfilter dta d'        ' ; filter from sound data
  238. mainaudctl dta d'        ' ; main audctl
  239. addaudctl dta d'        ' ; additional audctl
  240. shiftfrq dta d'        '
  241. shiftnote dta d'        '
  242. shiftfilter dta d'        '
  243. ; some useful tables
  244.        ift normal ; !!!
  245. przeci dta 4,5,6,7     ; which channel is the opposite (used only in stereo)
  246.        dta 0,1,2,3
  247.        eif ; !!!
  248. audtb1 dta 4,2,0,0     ; which byte in audctl has to be set to make sound "2 channel synth"
  249.        dta 4,2,0,0
  250. audtb2 dta 0,16,0,8    ; which byte in audctl has to be set to make sound "2 channel bass"
  251.        dta 0,16,0,8
  252. usedaudctl dta 4+129,$50+2+129,129,$28+129 ; bits of AUDCTL used in channel
  253.        dta 4+129,$50+2+129,129,$28+129
  254. ;-------------------------
  255. ; start of player program
  256. player_program equ *
  257. ; new address of song line
  258. p3     dey
  259.        lda (addr),y
  260.        sta pozsng
  261.        mvx #0 byte
  262.        asl @
  263.        rol byte
  264.        asl @
  265.        rol byte
  266.        asl @
  267.        rol byte
  268.        asl @
  269.        rol byte
  270.        adc pozsng ; clc
  271.        scc:inc byte
  272.        clc
  273. zm0    adc #0
  274.        sta addr
  275.        lda byte
  276. zm1    adc #0
  277.        sta addr+1
  278.        jmp p1
  279. ; play song (call only one time per frame)
  280. play   jsr pokey
  281.        lda czygrc
  282.        beq rsound
  283.        dec ltempo
  284.        bmi p4
  285. rsound jmp sound+3
  286. p4     dec pozptr
  287.        bne r1
  288. ; get new patterns from song
  289.        ldx #0
  290.        inc pozsng
  291.        mwa adrsng addr
  292. p1     ldy #16
  293.        lda (addr),y
  294.        bmi p3
  295.        jeq stop
  296.        sta pozptr
  297.        dey
  298. p2     lda (addr),y
  299.        dey
  300.        sty byte
  301.        tay
  302. zm2    lda $ffff,y
  303.        sta adrptl,x
  304. zm3    lda $ffff,y
  305.        sta adrpth,x
  306.        lda #0
  307.        sta delay,x
  308.        sta pozwpt,x
  309.        ldy byte
  310.        lda (addr),y
  311.        sta poddzw,x
  312.        inx
  313.        dey
  314.        bpl p2
  315.        lda #17
  316.        add addr
  317.        sta adrsng
  318.        lda #0
  319.        adc addr+1
  320.        sta adrsng+1
  321. ; get new data from patterns
  322. r1     mva tempo ltempo
  323.        ldx #7
  324. r2     dec delay,x
  325.        bmi r13
  326. r14    dex
  327.        bpl r2
  328.        jmp sound+3
  329. r13    mva adrptl,x addr
  330.        mva adrpth,x addr+1
  331.        ldy pozwpt,x
  332. r3     lda (addr),y ; get data
  333.        bne r4
  334.        iny ; $00: only new volume
  335.        lda (addr),y
  336.        sta actvol,x
  337.        and #$f0
  338.        sta actvl1,x
  339.        ift normal ; !!!
  340.        lda (addr),y
  341.        asl @
  342.        asl @
  343.        asl @
  344.        asl @
  345.        sta actvl2,x
  346.        eif ; !!!
  347.        iny
  348.        tya
  349.        sta pozwpt,x
  350.        jmp r14
  351. r4     cmp #$40
  352.        bcs r5
  353.        adc poddzw,x ; $01-$3f: new note with sound and maybe volume
  354.        sta wysdzw,x
  355.        iny
  356.        lda (addr),y
  357.        bpl r11
  358.        and #$7f
  359.        sta byte
  360.        iny
  361.        lda (addr),y
  362.        sta actvol,x
  363.        and #$f0
  364.        sta actvl1,x
  365.        ift normal ; !!!
  366.        lda (addr),y
  367.        asl @
  368.        asl @
  369.        asl @
  370.        asl @
  371.        sta actvl2,x
  372.        eif ; !!!
  373.        iny
  374.        tya
  375.        sta pozwpt,x
  376.        ldy byte
  377.        jsr dzwiek
  378.        jmp r14
  379. r11    tay ; without volume
  380.        inc pozwpt,x
  381.        inc pozwpt,x
  382.        lda actvol,x
  383.        and #$f0
  384.        sta actvl1,x
  385.        ift normal ; !!!
  386.        lda actvol,x
  387.        asl @
  388.        asl @
  389.        asl @
  390.        asl @
  391.        sta actvl2,x
  392.        eif ; !!!
  393.        jsr dzwiek
  394.        jmp r14
  395. r5     cmp #$80
  396.        bcs r6
  397.        and #$3f ; $41-$7f: new note with volume
  398.        add poddzw,x
  399.        sta wysdzw,x
  400.        iny
  401.        lda (addr),y
  402.        sta actvol,x
  403.        and #$f0
  404.        sta actvl1,x
  405.        ift normal ; !!!
  406.        lda (addr),y
  407.        asl @
  408.        asl @
  409.        asl @
  410.        asl @
  411.        sta actvl2,x
  412.        eif ; !!!
  413.        iny
  414.        tya
  415.        sta pozwpt,x
  416.        jmp r14
  417. r6     bne r7
  418.        iny ; $80: more than 15 spaces
  419.        lda (addr),y
  420.        sta delay,x
  421.        iny
  422.        tya
  423.        sta pozwpt,x
  424.        jmp r14
  425. r7     cmp #$c0
  426.        bcs r8
  427.        and #$3f ; $81-$bf: new note
  428.        add poddzw,x
  429.        sta wysdzw,x
  430.        inc pozwpt,x
  431.        jmp r14
  432. r8     cmp #$d0
  433.        bcs r9
  434.        iny ; $c0-$cf: new tempo
  435.        inc pozwpt,x
  436.        and #15
  437.        sta tempo
  438.        sta ltempo
  439.        jmp r3
  440. r9     cmp #$e0 ; special code
  441.        bcs r15
  442.        mva (addr),y byte
  443.        iny
  444.        mva (addr),y bajt
  445.        iny
  446.        tya
  447.        sta pozwpt,x
  448.        lda byte
  449.        jsr specialcode
  450.        jmp r14
  451. r15    cmp #$f0 ; special code with volume
  452.        bcs r12
  453.        mva (addr),y byte
  454.        iny
  455.        mva (addr),y bajt
  456.        lda byte
  457.        jsr specialcode
  458.        ldy pozwpt,x
  459.        iny
  460.        iny
  461.        lda (addr),y
  462.        sta actvol,x
  463.        and #$f0
  464.        sta actvl1,x
  465.        ift normal ; !!!
  466.        lda (addr),y
  467.        asl @
  468.        asl @
  469.        asl @
  470.        asl @
  471.        sta actvl2,x
  472.        eif ; !!!
  473.        iny
  474.        tya
  475.        sta pozwpt,x
  476.        jmp r14
  477. r12    cmp #$ff
  478.        bcs r10
  479.        sbc #$ef ; $f0-$fe: spaces-$f0 (c is clear here)
  480.        sta delay,x
  481.        inc pozwpt,x
  482.        jmp r14
  483. r10    lda #$40 ; $ff: spaces till the end of pattern
  484.        sta delay,x
  485.        jmp r14
  486. ; main play sound loop
  487. sound  jsr pokey
  488.        ldx #7
  489. p5     lda czygrx,x
  490.        beq p6
  491.        jmp graj
  492. grajreturn equ *
  493.        lda silent,x
  494.        beq p7
  495.        lda #0 ; silent channel
  496.        sta vol1ch,x
  497.        ift normal ; !!!
  498.        sta vol2ch,x
  499.        eif ; !!!
  500.        dex
  501.        bpl p5
  502.        jmp p8
  503. p7     ldy bajt
  504.        lda frqtab,y
  505.        add byte
  506.        sta frq,x
  507.        tya
  508.        sta aktwys,x
  509.        lda audctl,x
  510.        and audtb2,x
  511.        beq p11
  512.        lda bajt ; 2 channel bass
  513.        and #$7f
  514.        tay
  515.        lda basslo,y
  516.        add byte
  517.        sta frq-1,x
  518.        lda basshi,y
  519.        adc #0
  520.        sta frq,x
  521.        lda #0
  522.        sta vol1ch-1,x
  523.        ldy przeci,x
  524.        sta vol2ch-1,y
  525.        dex
  526.        dex
  527.        bpl p5
  528.        jmp p8
  529. p11    lda audctl,x
  530.        and audtb1,x
  531.        beq p6
  532.        lda sndfilter,x ;two channel filter
  533.        add bajt
  534.        sta aktwys+2,x
  535.        tay
  536.        lda frqtab,y
  537.        add byte
  538.        sec
  539.        adc filter
  540.        sta frq+2,x
  541. p6     dex
  542.        bpl p5
  543. ; sound postprocessing
  544. p8     inx
  545.        stx byte
  546.        ift normal ; !!!
  547.        ldx #3
  548.        lda quadro
  549.        beq p9
  550.        and #$40
  551.        bne p12
  552.        ldx #7 ; standard stereo settings
  553. p9     txa
  554.        tay
  555.        lda vol1ch,y
  556.        bne p10
  557.        ldy przeci,x
  558.        lda vol2ch,y
  559.        bne p10
  560.        txa
  561.        tay
  562.        lda #0
  563. p10    ora znksz,y
  564.        sta volume,x
  565.        lda frq,y
  566.        sta freqen,x
  567.        lda aktwys,y
  568.        sta note,x
  569.        lda audctl,y
  570.        ora byte
  571.        sta byte
  572.        cpx #4
  573.        sne:sta aud2
  574.        dex
  575.        bpl p9
  576.        sta aud1
  577.        rts
  578. p12    equ * ; RMT stereo
  579. p13    lda vol1ch,x
  580.        ora znksz,x
  581.        sta volume,x
  582.        lda vol2ch+4,x
  583.        ora znksz+4,x
  584.        sta volume+4,x
  585.        mva frq,x freqen,x
  586.        mva frq+4,x freqen+4,x
  587.        mva aktwys,x note,x
  588.        mva aktwys+4,x note+4,x
  589.        dex
  590.        bpl p13
  591.        lda audctl
  592.        ora audctl+1
  593.        ora audctl+2
  594.        ora audctl+3
  595.        sta aud1
  596.        lda audctl+4
  597.        ora audctl+5
  598.        ora audctl+6
  599.        ora audctl+7
  600.        sta aud2
  601.        rts
  602. ; set pokey
  603. pokey  lda quadro
  604.        jeq pokey1
  605.        jpl pokey2
  606.        lda pokeys+3 ; data for pokey 3
  607.        tax
  608.        lsr @
  609.        lsr @
  610.        and #1
  611.        tay
  612.        lda aud1,y
  613.        sta $d238
  614.        txa
  615.        and #4
  616.        tay
  617.        lda freqtabs,y
  618.        sta $d230
  619.        lda voltabs,x
  620.        sta $d231
  621.        lda freqtabs+1,y
  622.        sta $d232
  623.        lda voltabs+1,x
  624.        sta $d233
  625.        lda freqtabs+2,y
  626.        sta $d234
  627.        lda voltabs+2,x
  628.        sta $d235
  629.        lda freqtabs+3,y
  630.        sta $d236
  631.        lda voltabs+3,x
  632.        sta $d237
  633.        lda pokeys+2 ; data for pokey 2
  634.        tax
  635.        lsr @
  636.        lsr @
  637.        and #1
  638.        tay
  639.        lda aud1,y
  640.        sta $d228
  641.        txa
  642.        and #4
  643.        tay
  644.        lda freqtabs,y
  645.        sta $d220
  646.        lda voltabs,x
  647.        sta $d221
  648.        lda freqtabs+1,y
  649.        sta $d222
  650.        lda voltabs+1,x
  651.        sta $d223
  652.        lda freqtabs+2,y
  653.        sta $d224
  654.        lda voltabs+2,x
  655.        sta $d225
  656.        lda freqtabs+3,y
  657.        sta $d226
  658.        lda voltabs+3,x
  659.        sta $d227
  660. pokey2 lda pokeys+1 ; data for pokey 1
  661.        tax
  662.        lsr @
  663.        lsr @
  664.        and #1
  665.        tay
  666.        lda aud1,y
  667.        sta $d218
  668.        txa
  669.        ldy quadro
  670.        spl:and #4
  671.        tay
  672.        lda freqtabs,y
  673.        sta $d210
  674.        lda voltabs,x
  675.        sta $d211
  676.        lda freqtabs+1,y
  677.        sta $d212
  678.        lda voltabs+1,x
  679.        sta $d213
  680.        lda freqtabs+2,y
  681.        sta $d214
  682.        lda voltabs+2,x
  683.        sta $d215
  684.        lda freqtabs+3,y
  685.        sta $d216
  686.        lda voltabs+3,x
  687.        sta $d217
  688. pokey1 lda pokeys ; data for pokey 0
  689.        tax
  690.        lsr @
  691.        lsr @
  692.        and #1
  693.        tay
  694.        lda aud1,y
  695.        sta $d208
  696.        txa
  697.        ldy quadro
  698.        spl:and #4
  699.        tay
  700.        lda freqtabs,y
  701.        sta $d200
  702.        lda voltabs,x
  703.        sta $d201
  704.        lda freqtabs+1,y
  705.        sta $d202
  706.        lda voltabs+1,x
  707.        sta $d203
  708.        lda freqtabs+2,y
  709.        sta $d204
  710.        lda voltabs+2,x
  711.        sta $d205
  712.        lda freqtabs+3,y
  713.        sta $d206
  714.        lda voltabs+3,x
  715.        sta $d207
  716.        rts
  717.        els ; !!!
  718.        rts
  719. pokey  lda audctl+4
  720.        ora audctl+5
  721.        ora audctl+6
  722.        ora audctl+7
  723.        sta $d218
  724.        lda frq+4
  725.        sta $d210
  726.        lda vol1ch+4
  727.        ora znksz+4
  728.        sta $d211
  729.        lda frq+5
  730.        sta $d212
  731.        lda vol1ch+5
  732.        ora znksz+5
  733.        sta $d213
  734.        lda frq+6
  735.        sta $d214
  736.        lda vol1ch+6
  737.        ora znksz+6
  738.        sta $d215
  739.        lda frq+7
  740.        sta $d216
  741.        lda vol1ch+7
  742.        ora znksz+7
  743.        sta $d217
  744.        lda audctl+0
  745.        ora audctl+1
  746.        ora audctl+2
  747.        ora audctl+3
  748.        sta $d208
  749.        lda frq+0
  750.        sta $d200
  751.        lda vol1ch+0
  752.        ora znksz+0
  753.        sta $d201
  754.        lda frq+1
  755.        sta $d202
  756.        lda vol1ch+1
  757.        ora znksz+1
  758.        sta $d203
  759.        lda frq+2
  760.        sta $d204
  761.        lda vol1ch+2
  762.        ora znksz+2
  763.        sta $d205
  764.        lda frq+3
  765.        sta $d206
  766.        lda vol1ch+3
  767.        ora znksz+3
  768.        sta $d207
  769.        rts
  770.        eif ; !!!
  771. ; sound processing
  772. graj   lda adrsnl,x
  773.        sta addr
  774.        lda adrsnh,x
  775.        sta addr+1
  776.        mva shiftfrq,x byte
  777.        mva shiftnote,x bajt
  778.        mva shiftfilter,x filter
  779.        lda slupy,x
  780.        cmp sndlen,x
  781.        bcc n1
  782.        sta opadst,x
  783.        lda sndlop,x
  784.        sta slupy,x
  785.        jmp n0
  786. n1     lda opadst,x ; sound fading
  787.        beq n6
  788. n0     lda opad1,x
  789.        beq n7
  790.        dec lopad1,x
  791.        bne n7
  792.        sta lopad1,x
  793.        lda actvl1,x
  794.        beq n7
  795.        sub #16
  796.        sta actvl1,x
  797. n7     lda opad2,x
  798.        beq n6
  799.        dec lopad2,x
  800.        bne n6
  801.        sta lopad2,x
  802.        ift normal ; !!!
  803.        lda actvl2,x
  804.        beq n6
  805.        sub #16
  806.        sta actvl2,x
  807.        eif ; !!!
  808. n6     ldy aperm,x ; arpeggio
  809.        lda (addr),y
  810.        add wysdzw,x
  811.        add:sta bajt
  812.        dec lperm,x
  813.        bpl m1
  814.        lda dperm,x
  815.        sta lperm,x
  816.        lda kolejn,x
  817.        beq m6
  818.        add aperm,x
  819.        sta aperm,x
  820.        beq m7
  821.        cmp ilperm,x
  822.        bcc m1
  823.        lda #$ff
  824.        sta kolejn,x
  825.        jmp m1
  826. m7     lda #1
  827.        sta kolejn,x
  828.        jmp m1
  829. m6     inc aperm,x
  830.        lda ilperm,x
  831.        cmp aperm,x
  832.        bcs m1
  833.        lda #0
  834.        sta aperm,x
  835. m1     lda #19
  836.        add:sta addr
  837.        scc:inc addr+1
  838.        ldy slupy,x
  839.        lda (addr),y ; main sound data
  840.        and #$f0
  841.        sta znksz,x
  842.        lda (addr),y
  843.        and #15
  844.        ora actvl1,x
  845.        tay
  846.        lda voltab,y
  847.        ora maxvol
  848.        tay
  849.        lda voltab,y
  850.        sta vol1ch,x
  851.        ift normal ; !!!
  852.        ldy slupy,x
  853.        iny
  854.        lda (addr),y
  855.        and #15
  856.        ora actvl2,x
  857.        tay
  858.        lda voltab,y
  859.        ora maxvol
  860.        tay
  861.        lda voltab,y
  862.        sta vol2ch,x
  863.        eif ; !!!
  864.        lda czekaj,x
  865.        bne m2
  866.        lda typ,x
  867.        sta m5+1
  868. m5     bpl * ; jmp
  869.        jmp typ0
  870.        nop
  871.        jmp typ1
  872.        nop
  873.        jmp typ2
  874.        nop
  875.        jmp typ3
  876.        nop
  877.        jmp typ4
  878.        nop
  879.        jmp typ5
  880.        nop
  881.        jmp typ6
  882.        nop
  883.        jmp typ7
  884. m2     dec czekaj,x
  885. m3     ldy slupy,x ; accents
  886.        iny
  887.        lda (addr),y
  888.        and #$70
  889.        lsr @
  890.        lsr @
  891.        lsr @
  892.        sta n5+1
  893.        lda (addr),y
  894.        bmi n3
  895.        lda mainaudctl,x
  896.        jmp n4
  897. n3     lda addaudctl,x
  898. n4     and usedaudctl,x
  899.        sta audctl,x
  900.        iny
  901.        iny
  902.        tya
  903.        sta slupy,x
  904.        dey
  905.        lda (addr),y
  906. n5     bcc * ; jmp
  907.        bcc a0
  908.        bcc a1
  909.        bcc a2
  910.        bcc a3
  911.        bcc a4
  912.        bcc a5
  913.        bcc a6
  914.        bcc a7
  915. ; accents
  916. a1     adc:sta shiftfrq,x
  917.        lda (addr),y
  918. a0     add:sta byte
  919.        jmp grajreturn
  920. a3     adc:sta shiftnote,x
  921.        lda (addr),y
  922. a2     add:sta bajt
  923.        jmp grajreturn
  924. a5     adc:sta shiftfilter,x
  925.        lda (addr),y
  926. a4     add:sta filter
  927.        jmp grajreturn
  928. a6     sta byte
  929.        lda #0
  930. a7     sta bajt
  931.        jmp grajreturn
  932. ; effects
  933. typ1   lda typdat,x
  934.        and #3
  935.        lsr @
  936.        bcc t0
  937.        bne t1
  938.        lda param,x
  939.        add:sta byte
  940. t0     dec ltyp,x
  941.        bpl typ0
  942.        inc typdat,x
  943.        mva dtyp,x ltyp,x
  944.        jmp m3
  945. t1     lda byte
  946.        sbc param,x ; sec
  947.        sta byte
  948.        dec ltyp,x
  949.        bpl typ0
  950.        inc typdat,x
  951.        mva dtyp,x ltyp,x
  952.        jmp m3
  953. typ2   ldy typdat,x
  954.        lda param,x
  955.        bmi t2
  956.        iny
  957.        iny
  958. t2     dey
  959.        tya
  960.        add:sta byte
  961.        dec ltyp,x
  962.        bpl typ0
  963.        tya
  964.        sta typdat,x
  965.        cmp param,x
  966.        bne t3
  967.        eor #$ff
  968.        sta param,x
  969. t3     mva dtyp,x ltyp,x
  970. typ0   jmp m3
  971. typ3   ldy typdat,x
  972.        lda param,x
  973.        bmi t4
  974.        iny
  975.        iny
  976. t4     dey
  977.        tya
  978.        add:sta bajt
  979.        dec ltyp,x
  980.        bpl typ0
  981.        tya
  982.        sta typdat,x
  983.        cmp param,x
  984.        bne t3
  985.        eor #$ff
  986.        sta param,x
  987.        mva dtyp,x ltyp,x
  988.        jmp m3
  989. typ4   lda typdat,x
  990.        add:sta byte
  991.        dec ltyp,x
  992.        bpl typ0
  993.        lda param,x
  994.        add:sta typdat,x
  995.        mva dtyp,x ltyp,x
  996.        jmp m3
  997. typ5   lda bajt
  998.        sub typdat,x
  999.        sta bajt
  1000.        dec ltyp,x
  1001.        bpl typ0
  1002.        lda param,x
  1003.        add:sta typdat,x
  1004.        mva dtyp,x ltyp,x
  1005.        jmp m3
  1006. typ6   lda param,x
  1007.        add:sta byte
  1008. typ7   jmp m3 ; placeholder for new type of sound
  1009. ;----------------
  1010. ; init functions
  1011. ; play song, X=number of song
  1012. songx  ldy #16
  1013. zm4    lda #0
  1014.        sta addr
  1015. zm5    lda #0
  1016.        sta addr+1
  1017.        mva #0 pozsng
  1018. d5     txa
  1019.        beq inic
  1020.        lda (addr),y
  1021.        seq:bpl d4
  1022.        dex
  1023. d4     lda #17
  1024.        add:sta addr
  1025.        scc:inc addr+1
  1026.        inc pozsng
  1027.        bne d5
  1028.        ldx #0
  1029. ; play song, X=line of song
  1030. playx  lda #0
  1031.        sta byte
  1032.        txa
  1033.        sta pozsng
  1034.        asl @
  1035.        rol byte
  1036.        asl @
  1037.        rol byte
  1038.        asl @
  1039.        rol byte
  1040.        asl @
  1041.        rol byte
  1042.        adc pozsng ; clc
  1043.        scc:inc byte
  1044.        clc
  1045. zm6    adc #0
  1046.        sta addr
  1047.        lda byte
  1048. zm7    adc #0
  1049.        sta addr+1
  1050. inic   jsr stop
  1051.        mwa addr adrsng
  1052.        ldx #7
  1053. i4     mva #$ff actvol,x
  1054.        lda #$f0
  1055.        sta actvl1,x
  1056.        ift normal ; !!!
  1057.        sta actvl2,x
  1058.        eif ; !!!
  1059.        dex
  1060.        bpl i4
  1061.        lda #3
  1062.        sta $d20f
  1063.        sta $d21f
  1064.        ift normal ; !!!
  1065.        sta $d22f
  1066.        sta $d23f
  1067.        eif ; !!!
  1068.        dec pozsng
  1069.        inx
  1070.        stx ltempo
  1071.        inx
  1072.        stx pozptr
  1073.        stx czygrc
  1074.        rts
  1075. i1     txa ; change of tempo
  1076.        and #15
  1077.        sta tempo
  1078.        rts
  1079. i2     stx czygrc ; pause, continue
  1080.        rts
  1081. init   cmp #$10 ; A=$00
  1082.        jcc songx
  1083.        cmp #$20 ; A=$10
  1084.        bcc playx
  1085.        cmp #$30 ; A=$20
  1086.        jcc d2
  1087.        cmp #$40 ; A=$30
  1088.        bcc i1
  1089.        cmp #$50 ; A=$40
  1090.        jcc stop
  1091.        cmp #$60 ; A=$50
  1092.        bcc i2
  1093.        cmp #$70 ; A=$60
  1094.        jcs i3
  1095.        sty bajt
  1096. specialcode and #15
  1097.        asl @
  1098.        sta sc17+1
  1099.        lda bajt
  1100. sc17   bcc * ; jmp
  1101.        bcc sc0
  1102.        bcc sc1
  1103.        bcc sc2
  1104.        bcc sc3
  1105.        bcc sc4
  1106.        bcc sc5
  1107.        bcc sc6
  1108.        bcc sc7
  1109.        bcc sc8
  1110.        bcc sc9
  1111.        bcc sc10
  1112.        bcc sc11
  1113.        bcc sc12
  1114.        bcc sc13
  1115.        bcc sc14
  1116.        bcc sc15
  1117. sc0    sta specialflag ; code 0: set special flag
  1118. sc10   equ *
  1119. sc11   equ *
  1120. sc12   equ *
  1121. sc13   equ *
  1122. sc14   equ *
  1123. sc15   equ *
  1124.        rts
  1125. ; special codes
  1126. sc4    sta sndfilter,x
  1127.        rts
  1128. sc5    sta mainaudctl,x
  1129.        rts
  1130. sc6    sta addaudctl,x
  1131.        rts
  1132. sc7    sta shiftfilter,x
  1133.        rts
  1134. sc8    sta shiftfrq,x
  1135.        rts
  1136. sc9    sta shiftnote,x
  1137.        rts
  1138. sc1    and #$70
  1139.        lsr @
  1140.        lsr @
  1141.        sta typ,x
  1142.        and #$30
  1143.        sne:sta typdat,x
  1144.        lda bajt
  1145.        bmi sc16
  1146.        and #15
  1147.        sta param,x
  1148.        rts
  1149. sc16   and #15
  1150.        eor #$ff
  1151.        add #1
  1152.        sta param,x
  1153.        rts
  1154. sc2    and #$3f
  1155.        sta dtyp,x
  1156.        sta ltyp,x
  1157.        rts
  1158. sc3    and #$80
  1159.        asl @
  1160.        rol @
  1161.        sta kolejn,x
  1162.        lda bajt
  1163.        and #$70
  1164.        lsr @
  1165.        lsr @
  1166.        lsr @
  1167.        lsr @
  1168.        sta ilperm,x
  1169.        sne:sta kolejn,x
  1170.        lda bajt
  1171.        and #15
  1172.        sta dperm,x
  1173.        sta lperm,x
  1174.        lda aperm,x
  1175.        cmp ilperm,x
  1176.        bcc sc0
  1177.        lda ilperm,x
  1178.        seq:sbc #1 ; sec
  1179.        sta aperm,x
  1180.        rts
  1181. ; init of new song
  1182. i3     sty addr
  1183.        stx addr+1
  1184.        ldy #25
  1185.        mva (addr),y+ quadro
  1186.        mva (addr),y+ pokeys
  1187.        mva (addr),y+ pokeys+1
  1188.        mva (addr),y+ pokeys+2
  1189.        mva (addr),y+ pokeys+3
  1190.        lda (addr),y
  1191.        sta tempo
  1192.        lda addr ; low byte of instruments data
  1193.        eor #$80
  1194.        smi:inx
  1195.        sta zm8+1
  1196.        stx zm8+2
  1197.        eor #$80 ; low byte of pattern data
  1198.        smi:inx
  1199.        sta zm2+1
  1200.        stx zm2+2
  1201.        inx      ; high byte of pattern data
  1202.        sta zm3+1
  1203.        stx zm3+2
  1204.        inx      ; high byte of instrument data
  1205.        sta zm9+1
  1206.        stx zm9+2
  1207.        eor #$80 ; track data
  1208.        smi:inx
  1209.        sta adrsng
  1210.        sta zm0+1
  1211.        sta zm4+1
  1212.        sta zm6+1
  1213.        stx adrsng+1
  1214.        stx zm1+1
  1215.        stx zm5+1
  1216.        stx zm7+1
  1217.        mva #$f0 maxvol
  1218.        lda #0
  1219.        sta czygrc
  1220.        sta specialflag
  1221. ; stop playing
  1222. stop   ldx #7
  1223.        lda #0
  1224.        sta czygrc
  1225. d9     sta czygrx,x
  1226.        sta audctl,x
  1227.        sta vol1ch,x
  1228.        ift normal ; !!!
  1229.        sta vol2ch,x
  1230.        sta volume,x
  1231.        sta $d230,x
  1232.        sta $d220,x
  1233.        eif ; !!!
  1234.        sta $d210,x
  1235.        sta $d200,x
  1236.        dex
  1237.        bpl d9
  1238.        sta $d218
  1239.        sta $d208
  1240.        ift normal ; !!!
  1241.        sta $d238
  1242.        sta $d228
  1243.        sta aud1
  1244.        sta aud2
  1245.        eif ; !!!
  1246.        rts
  1247. ; procedures for play new instrument
  1248. d1     sta vol1ch,x ; if attempt to play empty sound - clear data
  1249.        ift normal ; !!!
  1250.        sta vol2ch,x
  1251.        sta volume,x
  1252.        eif ; !!!
  1253.        sta audctl,x
  1254.        rts
  1255. d0     tya ; change only volume
  1256.        sta actvol,x
  1257. d3     and #$f0
  1258.        sta actvl1,x
  1259.        lda actvol,x
  1260.        ift normal ; !!!
  1261.        asl @
  1262.        asl @
  1263.        asl @
  1264.        asl @
  1265.        sta actvl2,x
  1266.        eif ; !!!
  1267.        rts
  1268. d2     and #7
  1269.        sta addr
  1270.        txa
  1271.        ldx addr
  1272.        and #$3f
  1273.        beq d0
  1274.        sta wysdzw,x
  1275.        tya
  1276.        bmi d2-1
  1277.        lda actvol,x
  1278.        jsr d3
  1279. dzwiek mva #0 czygrx,x
  1280. zm9    lda $ffff,y
  1281.        beq d1
  1282.        sta adrsnh,x
  1283.        sta addr+1
  1284. zm8    lda $ffff,y
  1285.        sta adrsnl,x
  1286.        sta addr
  1287.        tya
  1288.        sta numdzw,x
  1289.        ldy #8
  1290.        mva (addr),y+ sndlen,x
  1291.        mva (addr),y+ sndlop,x
  1292.        mva (addr),y+ sndfilter,x
  1293.        mva (addr),y+ mainaudctl,x
  1294.        mva (addr),y+ addaudctl,x
  1295.        mva (addr),y+ opad1,x
  1296.        sta lopad1,x
  1297.        mva (addr),y+ opad2,x
  1298.        sta lopad2,x
  1299.        lda (addr),y
  1300.        and #$70
  1301.        lsr @
  1302.        lsr @
  1303.        sta typ,x
  1304.        lda (addr),y+
  1305.        bmi d7
  1306.        and #15
  1307.        sta param,x
  1308.        jmp d8
  1309. d7     and #15
  1310.        eor #$ff
  1311.        add #1
  1312.        sta param,x
  1313. d8     mva (addr),y+ czekaj,x
  1314.        lda (addr),y+
  1315.        and #$3f
  1316.        sta dtyp,x
  1317.        sta ltyp,x
  1318.        lda (addr),y
  1319.        and #$80
  1320.        asl @
  1321.        rol @
  1322.        sta kolejn,x
  1323.        lda (addr),y
  1324.        and #$70
  1325.        lsr @
  1326.        lsr @
  1327.        lsr @
  1328.        lsr @
  1329.        sta ilperm,x
  1330.        bne d6
  1331.        sta kolejn,x
  1332. d6     lda (addr),y-
  1333.        and #15
  1334.        sta dperm,x
  1335.        sta lperm,x
  1336.        lda (addr),y
  1337.        and #$c0
  1338.        ora wysdzw,x
  1339.        sta wysdzw,x
  1340.        tay
  1341.        lda frqtab,y
  1342.        sta frq,x
  1343.        lda #0
  1344.        sta slupy,x
  1345.        sta typdat,x
  1346.        sta opadst,x
  1347.        sta aperm,x
  1348.        sta shiftfrq,x
  1349.        sta shiftnote,x
  1350.        sta shiftfilter,x
  1351.        lda #1
  1352.        sta czygrx,x
  1353.        rts
  1354. endplr end