;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
;Û                                                                           Û
;Û                              SOUND PROCEDURES                             Û
;Û                                                                           Û
;Û                    These procedures are not optimized.                    Û
;Û                                                                           Û
;Û       NOTE: '@' - this char can use only with PROC/PROCS and MACRO.       Û
;Û                                                                           Û
;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;-----------------------------------------------------------------------------
; Second POKEY detect routine.
; out: A - $00 - absent
;          $80 - present 
;  Code & idea: Seban/SLIGHT 
;  (c) 1995,96 Slight! 
;-----------------------------------------------------------------------------
SecondPOKEY PROC
     sei
     inc $d40e
     lda #$03
     sta $d21f
     sta $d210
     ldx #$00
     stx $d211
     inx
     stx $d21e
     ldx $d40b
     bne *-3
     stx $d219
_wpokey_
     ldx $d40b
     bmi _extpokey_
     lda #$01
     bit $d20e
     bne _wpokey_
_extpokey_
     lda $10
     sta $d20e
     dec $d40e
     cli
     txa
     rts
ENDP
;-----------------------------------------------------------------------------
; Set the tempo of the TMC file. (Not work!)
; in: X - tempo.
;-----------------------------------------------------------------------------
TempoTMC PROC X
 lda #$30
 jmp _inittmc_
 ifndef PlayTMC
   PlayTMC $FFFF
 endndef
ENDP
;-----------------------------------------------------------------------------
; Continue playing after StopTMC.
;-----------------------------------------------------------------------------
ContTMC PROC
 lda $D40E           ;disable DLI (NMIEN bit 7=0)
 and #%01111111
 sta $D40E

 lda 512           ;get old DLIV
 sta _hlpdli_+1
 lda 513
 sta _hlpdli_+2

 lda <_dlitmc_     ;set new DLIV
 sta 512
 lda >_dlitmc_
 STA 513

 lda $D40E           ;enable DLI (NMIEN bit 7=1)
 ora #%10000000
 sta $D40E

 lda 546
 sta _hlp_t_+1
 lda 547
 STA _hlp_t_+2
 ldy <_play_tmc_
 ldx >_play_tmc_
 lda #6
 jsr 58460
 lda #$60
 jmp _inittmc_
 ifndef PlayTMC
   PlayTMC $FFFF
 endndef
ENDP
;-----------------------------------------------------------------------------
; Stop playing of the TMC file. (immediately)
;-----------------------------------------------------------------------------
StopTMC PROC
 lda _czygrc_
 bne _stoptmc1_
 rts
_stoptmc1_:
 lda $D40E           ;disable DLI (NMIEN bit 7=0)
 and #%01111111
 sta $D40E
 lda _hlpdli_+1
 sta 512             ;set old DLIV
 lda _hlpdli_+2
 sta 513
 lda $D40E           ;enable DLI (NMIEN bit 7=1)
 ora #%10000000
 sta $D40E
 ldy _hlp_t_+1
 ldx _hlp_t_+2
 lda #6
 jsr 58460
 lda #$40
 jmp _inittmc_
 IfNDef PlayTMC
   PlayTMC $FFFF
 endndef
ENDP
;-----------------------------------------------------------------------------
; Play the TMC file.
; in: YX - address.
;-----------------------------------------------------------------------------
PlayTMC PROC YX
 stx _adrtmc2_
 sty _adrtmc2_+1

 StopTMC
; test if TMC, must be space
 ldy #29+6
 lda (_adrtmc2_),y
 cmp #' '
 jne _errtmc_

 ldy #2
 lda (_adrtmc2_),y
 sta _adrtmc1_
 iny
 lda (_adrtmc2_),y
 STA _adrtmc1_+1

 lda _adrtmc2_
 clc
 adc #6
 sta _adrtmc2_
 lda _adrtmc2_+1
 adc #0
 sta _adrtmc2_+1

 lda _adrtmc2_
 clc
 adc #$20
 sta _lsbtmc_
 lda _adrtmc2_+1
 adc #0
 STA _lsbtmc_+1

 lda _adrtmc2_
 clc
 adc #$60
 sta _msbtmc_
 lda _adrtmc2_+1
 ADC #0
 sta _msbtmc_+1

 lda _adrtmc2_
 clc
 adc #$A0
 sta _lsbtmc2_
 lda _adrtmc2_+1
 adc #0
 sta _lsbtmc2_+1

 lda _adrtmc2_
 clc
 adc <$120
 sta _msbtmc2_
 LDA _adrtmc2_+1
 ADC >$120
 sta _msbtmc2_+1

 jsr _reloc_tmc_

;set DLIST VECTOR
 ldy #31
 lda (_adrtmc2_),y
 cmp #1
 beq _skiptmc1_
 sta _freqtmc_       ;2,3,4 frequency for frame

 lda $D40E           ;disable DLI (NMIEN bit 7=0)
 and #%01111111
 sta $D40E

 lda 560
 sta _wordtmc_
 lda 561
 sta _wordtmc_+1
 ldy #0

; ldy #255
;_tmc1_:
; iny
; lda (_wordtmc_),y
; and #%01000000    ;check if load counter of screen
; beq _tmc1_
; iny
; iny               ;+2 for excepting ADDRESS
                   ;now it is second line of screen !
 lda (_wordtmc_),y
 ora #%10000000    ;active DLI in this line (bit 7)
 sta (_wordtmc_),y

 lda 512           ;get old DLIV
 sta _hlpdli_+1
 lda 513
 sta _hlpdli_+2

 lda <_dlitmc_     ;set new DLIV
 sta 512
 lda >_dlitmc_
 STA 513

 lda $D40E           ;enable DLI (NMIEN bit 7=1)
 ora #%10000000
 sta $D40E

_skiptmc1_:
 ldy _adrtmc2_
 ldx _adrtmc2_+1
;zachowaj stary adres przerwania
 lda 546
 sta _hlp_t_+1
 lda 547
 sta _hlp_t_+2
;inicjalizuj
 lda #$70
 jsr _inittmc_
;graj muzyk©
 lda #$00
 tax
 jsr _inittmc_
;inicjalizuj nowe przerwanie
 LDY <_play_tmc_
 ldx >_play_tmc_
 LDA #6
 jmp 58460

_play_tmc_:
 jsr _tacttmc_
_hlp_t_:
 jmp $FFFF

_dlitmc_:
 phr
 lda _freqtmc_
 cmp #4
 beq _dlitmc1_
 cmp #3
 beq _dlitmc2_
 lda #48-1
_dliskip_:
 cmp $D40B
 bcs *-3
 jsr _soundtmc_
 PLR
 rti

_hlpdli_:
 jmp $FFFF

_dlitmc1_:
 lda #8-1
 cmp $D40B
 bcs *-3
 jsr _soundtmc_
 lda #48-1
 cmp $D40B
 bcs *-3
 jsr _soundtmc_
 lda #88-1
 bne _dliskip_

_dlitmc2_:
 lda #20-1
 cmp $D40B
 bcs *-3
 jsr _soundtmc_
 LDA #76-1
 bne _dliskip_

_adrtmc1_ = 32 ;(2)
_adrtmc2_ = 34 ;(2)
_lsbtmc_  = 36 ;(2)
_msbtmc_  = 38 ;(2)
_lsbtmc2_ = 40 ;(2)
_msbtmc2_ = 42 ;(2)
_wordtmc_ = 44 ;(2)
_freqtmc_ DB 0

_errtmc_:
 COLOR 1
 POSITION 0,0
 PRINTE 'ERROR: THIS IS NOT THE TMC FILE!'
 jmp *
;*----------------------------------*
;* RELOCATOR from the SYZYGY's ZINE *
;*----------------------------------*
_reloc_tmc_:
     ldy #0
     LDA (_lsbtmc_),Y
     bne _k1_
     lda (_msbtmc_),y
     beq _k3_
     lda (_lsbtmc_),y
_k1_:
     sec
     sbc _adrtmc1_
     sta (_lsbtmc_),y
     bcs _k2_
     lda (_msbtmc_),y
     tax
     dex
     txa
     sta (_msbtmc_),y
_k2_:
     lda (_msbtmc_),y
     sec
     sbc _adrtmc1_+1
     clc
     adc _adrtmc2_+1
     sta (_msbtmc_),y
     LDA (_lsbtmc_),Y
     clc
     adc _adrtmc2_
     sta (_lsbtmc_),y
     bcc _k3_
     lda (_msbtmc_),y
     tax
     inx
     txa
     sta (_msbtmc_),y
_k3_:
     lda (_lsbtmc2_),y
     bne _k1__
     lda (_msbtmc2_),y
     beq _k3__
     lda (_lsbtmc2_),y
_k1__:
     sec
     sbc _adrtmc1_
     sta (_lsbtmc2_),y
     bcs _k2__
     lda (_msbtmc2_),y
     TAX
     dex
     txa
     sta (_msbtmc2_),y
_k2__:
     lda (_msbtmc2_),y
     sec
     sbc _adrtmc1_+1
     clc
     adc _adrtmc2_+1
     sta (_msbtmc2_),y
     lda (_lsbtmc2_),y
     clc
     adc _adrtmc2_
     sta (_lsbtmc2_),y
     bcc _k3__
     lda (_msbtmc2_),y
     tax
     inx
     txa
     sta (_msbtmc2_),y
_k3__:
     TYA
     clc
     adc #$40
     tay
     lda (_lsbtmc2_),y
     bne _k1___
     lda (_msbtmc2_),y
     beq _k3___
     lda (_lsbtmc2_),y
_k1___:
     sec
     sbc _adrtmc1_
     sta (_lsbtmc2_),y
     bcs _k2___
     lda (_msbtmc2_),y
     tax
     dex
     txa
     sta (_msbtmc2_),y
_k2___:
     lda (_msbtmc2_),y
     sec
     SBC _adrtmc1_+1
     clc
     adc _adrtmc2_+1
     sta (_msbtmc2_),y
     lda (_lsbtmc2_),y
     clc
     adc _adrtmc2_
     sta (_lsbtmc2_),y
     bcc _k3___
     lda (_msbtmc2_),y
     tax
     inx
     txa
     sta (_msbtmc2_),y
_k3___:
     tya
     sec
     sbc #$40
     tay
     iny
     cpy #$40
     beq _rtz_
     JMP _reloc_tmc_+2
_rtz_:
     rts

;*-----------------*
;*   TMC  Player   *
;* Jaskier/Taquart *
;*-----------------*

_byte_    EQU 36
_bajt_    EQU 37
_addrtmc_ EQU 38 ;(2)
_adrsng_  EQU 40 ;(2)

 JMP _inittmc_
 JMP _tacttmc_
 JMP _soundtmc_

_maxvol_ DB B(15)
_volume_ DB S'        '
_freqen_ DB S'        '
_kanal_  DB S'        '
_aktwys_ DB S'        '
_numdzw_ DB S'        '
_audctl_ DB S'        '
_aud1_   DB B(0)
_aud2_   DB B(0)

_voltab_:
 DB S'                '
 DB S'        !!!!!!!!'
 DB S'    !!!!!!!!""""'
 DB S'   !!!!!"""""###'
 DB S'  !!!!""""####$$'
 DB S'  !!!"""###$$$%%'
 DB S'  !!"""##$$$%%&&'
 DB S'  !!""##$$%%&&'''''
 DB S' !!""##$$%%&&''''('
 DB S' !!""#$$%%&''''(()'
 DB S' !!"##$%%&''''())*'
 DB S' !!"#$$%&''''()**+'
 DB S' !""#$%&&''()**+,'
 DB S' !"##$%&''()**+,-'
 DB S' !"#$%&''''()*+,-.'
 DB S' !"#$%&''()*+,-./'

_frqtab_:
 DB B(0),B($f1),B($e4),B($d7)
 DB B($cb),B($c0),B($b5),B($aa)
 DB B($a1),B($98),B($8f),B($87)
 DB B($7f),B($78),B($72),B($6b)
 DB B($65),B($5f),B($5a),B($55)
 db b($50),b($4b),b($47),b($43)
 db b($3f),b($3c),b($38),b($35)
 db b($32),b($2f),b($2c),b($2a)
 DB B($27),B($25),B($23),B($21)
 db b($1f),b($1d),b($1c),b($1a)
 DB B($18),B($17),B($16),B($14)
 db b($13),b($12),b($11),b($10)
 db b(15),b(14),b(13),b(12)
 db b(11),b(10),b(9),b(8)
 db b(7),b(6),b(5),b(4)
 db b(3),b(2),b(1),b(0)

 db b(0),b($f2),b($e6),b($da)
 db b($ce),b($bf),b($b6),b($aa)
 db b($a1),b($98),b($8f),b($89)
 db b($80),b($7a),b($71),b($6b)
 DB B($65),B($5f),B($5c),B($56)
 DB B($50),B($4d),B($47),B($44)
 db b($3e),b($3c),b($38),b($35)
 DB B($32),B($2f),B($2d),B($2a)
 DB B($28),B($25),B($23),B($21)
 DB B($1f),B($1d),B($1c),B($1a)
 db b($18),b($17),b($16),b($14)
 db b($13),b($12),b($11),b($10)
 db b(15),b(14),b(13),b(12)
 db b(11),b(10),b(9),b(8)
 db b(7),b(6),b(5),b(4)
 DB B(3),B(2),B(1),B(0)

 db b(0),b($ff),b($f1),b($e4)
 db b($d8),b($ca),b($c0),b($b5)
 db b($ab),b($a2),b($99),b($8e)
 db b($87),b($7f),b($79),b($73)
 DB B($70),B($66),B($61),B($5a)
 db b($55),b($52),b($4b),b($48)
 db b($43),b($3f),b($3c),b($39)
 db b($37),b($33),b($30),b($2d)
 db b($2a),b($28),b($25),b($24)
 DB B($21),B($1f),B($1e),B($1c)
 DB B($1b),B($19),B($17),B($16)
 db b($15),b($13),b($12),b($11)
 DB B($10),B(15),B(14),B(13)
 DB B(12),B(11),B(10),B(9)
 DB B(8),B(7),B(6),B(5)
 db b(4),b(3),b(2),b(1)

 db b(0),b($f3),b($e6),b($d9)
 db b($cc),b($c1),b($b5),b($ad)
 db b($a2),b($99),b($90),b($88)
 DB B($80),B($79),B($72),B($6c)
 db b($66),b($60),b($5b),b($55)
 db b($51),b($4c),b($48),b($44)
 db b($40),b($3c),b($39),b($35)
 db b($32),b($2f),b($2d),b($2a)
 db b($28),b($25),b($23),b($21)
 DB B($1f),B($1d),B($1c),B($1a)
 db b($18),b($17),b($16),b($14)
 db b($13),b($12),b($11),b($10)
 db b(15),b(14),b(13),b(12)
 db b(11),b(10),b(9),b(8)
 DB B(7),B(6),B(5),B(4)
 DB B(3),B(2),B(1),B(0)

_basslo_:
 DB B(0),B($f2),B($33),B($96)
 DB B($e2),B($38),B($8c),B($00)
 db b($6a),b($e8),b($6a),b($ef)
 db b($80),b($08),b($ae),b($46)
 db b($e6),b($95),b($41),b($f6)
 db b($b0),b($6e),b($30),b($f6)
 db b($bb),b($84),b($52),b($22)
 DB B($f4),B($c8),B($a0),B($7a)
 db b($55),b($34),b($14),b($f5)
 db b($d8),b($bd),b($a4),b($8d)
 db b($77),b($60),b($4e),b($38)
 db b($27),b($15),b($06),b($f7)
 db b($e8),b($db),b($cf),b($c3)
 DB B($b8),B($ac),B($a2),B($9a)
 db b($90),b($88),b($7f),b($78)
 db b($70),b($6a),b($64),b($5e)

_basshi_:
 DB B(0),B(13),B(13),B(12)
 DB B(11),B(11),B(10),B(10)
 DB B(9),B(8),B(8),B(7)
 DB B(7),B(7),B(6),B(6)
 DB B(5),B(5),B(5),B(4)
 DB B(4),B(4),B(4),B(3)
 db b(3),b(3),b(3),b(3)
 db b(2),b(2),b(2),b(2)
 db b(2),b(2),b(2),b(1)
 db b(1),b(1),b(1),b(1)
 db b(1),b(1),b(1),b(1)
 db b(1),b(1),b(1),b(0)
 db b(0),b(0),b(0),b(0)
 db b(0),b(0),b(0),b(0)
 DB B(0),B(0),B(0),B(0)
 DB B(0),B(0),B(0),B(0)

_czygrx_ DB S'        '
_pozwpt_ DB S'        '
_delay_  DB S'        '
_numptr_ DB S'        '
_poddzw_ DB S'        '
_wysdzw_ DB S'        '
_znksz_  DB S'        '
_frq_    DB S'        '
_vol1ch_ DB S'        '
_vol2ch_ DB S'        '
_adcvl1_ DB S'        '
_adcvl2_ DB S'        '
_adrsnl_ DB S'        '
_adrsnh_ DB S'        '
_slupy_  DB S'        '
_opad1_  DB S'        '
_opad2_  DB S'        '
_lopad1_ DB S'        '
_lopad2_ DB S'        '
_typ_    DB S'        '
_param_  DB S'        '
_pomoc1_ DB S'        '
_pomoc2_ DB S'        '
_czekaj_ DB S'        '
_dtyp_   DB S'        '
_ltyp_   DB S'        '
_ilperm_ DB S'        '
_aperm_  DB S'        '
_dperm_  DB S'        '
_lperm_  DB S'        '
_kolejn_ DB S'        '
_tempo_  DB B(0)
_ltempo_ DB B(0)
_pozptr_ DB B(0)
_czygrc_ DB B(0)

_przeci_:
 DB B(4),B(5),B(6),B(7)
 DB B(0),B(1),B(2),B(3)
_audtb1_:
 DB B(4),B(2),B(0),B(0)
 DB B(4),B(2),B(0),B(0)
_audtb2_:
 DB B(0),B(16),B(0),B(8)
 DB B(0),B(16),B(0),B(8)

_tacttmc_:
 LDA _czygrc_
 BEQ _r1_-3
 LDA _pozptr_
 CMP #64
 BCC _r1_
 DEC _ltempo_
 BEQ *+5
 JMP _soundtmc_

 LDX #7
 LDA #0
_p1_:
 STA _pozwpt_,X
 STA _delay_,X
 DEX
 BPL _p1_
 STA _pozptr_
 TAX
 LDY #15
_p2_:
 LDA (_adrsng_),Y
 BPL _p3_
 DEY
 LDA (_adrsng_),Y
 BPL *+5
 JMP _stop_
 STX _addrtmc_
 ASL @
 ASL @
 ROL _addrtmc_
 ASL @
 ROL _addrtmc_
 ASL @
 ROL _addrtmc_
_zm0_:
 ADC #0
 STA _adrsng_
 LDA _addrtmc_
_zm1_:
 ADC #0
 STA _adrsng_+1
 BCC _p2_-2
_p3_:
 STA _numptr_,X
 DEY
 LDA (_adrsng_),Y
 STA _poddzw_,X
 INX
 DEY
 BPL _p2_
 CLC
 LDA _adrsng_
 ADC #16
 STA _adrsng_
 BCC *+4
 INC _adrsng_+1
 JMP _soundtmc_

_r1_:
 DEC _ltempo_
 BPL _r1_-3
 INC _pozptr_
 LDA _tempo_
 STA _ltempo_
 LDX #7
_r2_:
 DEC _delay_,X
 BMI *+5
 JMP _r14_
 LDY _numptr_,X
_zm2_:
 LDA $ffff,Y
 STA _addrtmc_
_zm3_:
 LDA $ffff,Y
 STA _addrtmc_+1
 LDY _pozwpt_,X
_r3_:
 LDA (_addrtmc_),Y
 BNE _r4_
 JSR _nparam_
 JMP _r13_
_r4_:
 CMP #$40
 BCS _r5_
 ADC _poddzw_,X
 STA _wysdzw_,X
 JSR _nparam_
 LDY _numdzw_,X
 JSR _dzwiek_
 JMP _r13_
_r5_:
 BNE _r8_
 INY
 INC _pozwpt_,X
 LDA (_addrtmc_),Y
 BPL _r6_
 STA _bajt_
 JSR _nparam_
 LDA _bajt_
_r6_:
 AND #$7f
 BNE _r7_
 LDA #64
 STA _pozptr_
 BNE _r13_
_r7_:
 STA _tempo_
 STA _ltempo_
 BNE _r13_
_r8_:
 CMP #$80
 BCS _r11_
 AND #$3f
 ADC _poddzw_,X
 STA _wysdzw_,X
 INY
 INC _pozwpt_,X
 LDA (_addrtmc_),Y
 AND #127
 BNE _r9_
 LDA #64
 STA _pozptr_
 BNE _r10_
_r9_:
 STA _tempo_
 STA _ltempo_
_r10_:
 JSR _nparam_
 LDY _numdzw_,X
 JSR _dzwiek_
 JMP _r13_
_r11_:
 CMP #$c0
 BCS _r12_
 AND #$3f
 STA _numdzw_,X
 INY
 INC _pozwpt_,X
 JMP _r3_
_r12_:
 AND #$3f
 STA _delay_,X
_r13_:
 INC _pozwpt_,X
_r14_:
 DEX
 BMI _soundtmc_
 JMP _r2_

_soundtmc_:
 LDX #7
_p5_:
 LDA _czygrx_,X
 BEQ _p6_
 JSR _graj_
 LDA _audctl_,X
 AND _audtb1_,X
 BEQ _p6_
 LDY #71
 LDA (_addrtmc_),Y
 CLC
 ADC _aktwys_,X
 STA _aktwys_+2,X
 TAY
 LDA _frqtab_,Y
 SEC
 ADC _pomoc1_,X
 STA _frq_+2,X
_p6_:
 DEX
 BPL _p5_

 ASL _maxvol_
 ASL _maxvol_
 ASL _maxvol_
 ASL _maxvol_
 INX
 STX _addrtmc_
 STX _addrtmc_+1
 LDX #7
_p9_:
 TXA
 TAY
 LDA _vol1ch_,Y
 BNE _p10_
 LDY _przeci_,X
 LDA _vol2ch_,Y
 BNE _p10_
 TXA
 TAY
 LDA #0
_p10_:
 STA _byte_
 TYA
 STA _kanal_,X
 LDA _frq_,Y
 STA _freqen_,X
 LDA _audctl_,Y
 STA _bajt_
 ORA _addrtmc_+1
 STA _addrtmc_+1
 LDA _bajt_
 AND _audtb1_,X
 BEQ _p11_
 LDA _frq_+2,Y
 STA _freqen_+2,X
_p11_:
 LDA _bajt_
 AND _audtb2_,X
 BEQ _p12_
 LDA _aktwys_,Y
 AND #$3f
 TAY
 INY
 STY _addrtmc_
 LDA _basshi_-1,Y
 STA _freqen_,X
 JMP _p13_
_p12_:
 LDY _addrtmc_
 BEQ _p13_
 LDA _basslo_-1,Y
 STA _freqen_,X
 LDA #0
 STA _addrtmc_
_p13_:
 LDA _byte_
 ORA _maxvol_
 TAY
 LDA _voltab_,Y
 LDY _kanal_,X
 ORA _znksz_,Y
 STA _volume_,X
 CPX #4
 BNE _p14_
 LDA _addrtmc_+1
 STA _aud2_
 LDA #0
 STA _addrtmc_+1
_p14_:
 DEX
 BPL _p9_
 LSR _maxvol_
 LSR _maxvol_
 LSR _maxvol_
 LSR _maxvol_
 LDA _addrtmc_+1
_quit_:
 LDX #3
 STX $d21f
 STX $d20f
 LDX _freqen_+4
 LDY _freqen_
 STX $d210
 STY $d200
 LDX _volume_+4
 LDY _volume_
 STX $d211
 STY $d201
 LDX _freqen_+5
 LDY _freqen_+1
 STX $d212
 STY $d202
 LDX _volume_+5
 LDY _volume_+1
 STX $d213
 STY $d203
 LDX _freqen_+6
 LDY _freqen_+2
 STX $d214
 STY $d204
 LDX _volume_+6
 LDY _volume_+2
 STX $d215
 STY $d205
 LDX _freqen_+7
 LDY _freqen_+3
 STX $d216
 STY $d206
 LDX _volume_+7
 LDY _volume_+3
 STX $d217
 STY $d207
 STA _aud1_
 LDX _aud2_
 STX $d218
 STA $d208
 RTS

_graj_:
 LDA _adrsnl_,X
 STA _addrtmc_
 LDA _adrsnh_,X
 STA _addrtmc_+1
 LDY _slupy_,X
 CPY #63
 BEQ _n6_
 INC _slupy_,X
 INC _slupy_,X
 INC _slupy_,X
 LDA (_addrtmc_),Y
 AND #$f0
 STA _znksz_,X
 LDA (_addrtmc_),Y
 AND #15
 SEC
 SBC _adcvl1_,X
 BPL _n1_
 LDA #0
_n1_:
 STA _vol1ch_,X
 INY
 LDA (_addrtmc_),Y
 AND #15
 SEC
 SBC _adcvl2_,X
 BPL _n2_
 LDA #0
_n2_:
 STA _vol2ch_,X
 LDA (_addrtmc_),Y
 AND #$f0
 BEQ _n8_
 BPL _n3_
 LDY #73
 LDA (_addrtmc_),Y
 LDY _slupy_,X
 DEY
 DEY
 BPL _n4_
_n3_:
 LDA #0
_n4_:
 STA _audctl_,X
 LDA (_addrtmc_),Y
 AND #$70
 BEQ _n9_
 LSR @
 LSR @
 STA _n5_+1
 LDA #0
 STA _pomoc1_,X
 INY
 LDA (_addrtmc_),Y
_n5_:
 BCC *
 NOP
 NOP
 NOP
 NOP
 JMP _a1_
 NOP
 JMP _a2_
 NOP
 JMP _a3_
 NOP
 JMP _a4_
 NOP
 JMP _a5_
 NOP
 JMP _a6_
 NOP
 JMP _a7_
_n6_:
 LDA _opad1_,X
 BEQ _n7_
 DEC _lopad1_,X
 BNE _n7_
 STA _lopad1_,X
 LDA _vol1ch_,X
 AND #15
 BEQ _n7_
 DEC _vol1ch_,X
_n7_:
 LDA _opad2_,X
 BEQ _n8_
 DEC _lopad2_,X
 BNE _n8_
 STA _lopad2_,X
 LDA _vol2ch_,X
 AND #15
 BEQ _n8_
 DEC _vol2ch_,X
_n8_:
 LDY #72
 LDA (_addrtmc_),Y
 STA _audctl_,X
_n9_:
 LDA _aperm_,X
 CLC
 ADC #63
 TAY
 LDA (_addrtmc_),Y
 ADC _wysdzw_,X
 STA _aktwys_,X
 TAY
 LDA _frqtab_,Y
 STA _frq_,X
 DEC _lperm_,X
 BPL _m1_
 LDA _dperm_,X
 STA _lperm_,X
 LDA _kolejn_,X
 BEQ _m6_
 CLC
 ADC _aperm_,X
 STA _aperm_,X
 BEQ _m7_
 CMP _ilperm_,X
 BNE _m1_
 LDA #$fe
_m7_:
 CLC
 ADC #1
 STA _kolejn_,X
 BNE _m1_
_m6_:
 INC _aperm_,X
 LDA _ilperm_,X
 CMP _aperm_,X
 BCS _m1_
 LDA #0
 STA _aperm_,X
_m1_:
 LDA _czekaj_,X
 BEQ _m2_
 DEC _czekaj_,X
 RTS
_m2_:
 LDA _pomoc2_,X
 STA _byte_
 LDA _param_,X
 STA _bajt_
 JSR _m4_
 DEC _ltyp_,X
 BPL _m4_-1
 LDA _byte_
 STA _pomoc2_,X
 LDA _bajt_
 STA _param_,X
 LDA _dtyp_,X
 STA _ltyp_,X
 RTS
_m4_:
 LDA _typ_,X
 STA _m5_+1
_m5_:
 BPL *
 JMP _typ0_
 NOP
 JMP _typ1_
 NOP
 JMP _typ2_
 NOP
 JMP _typ3_
 NOP
 JMP _typ4_
 NOP
 JMP _typ5_
 NOP
 JMP _typ6_
 NOP
 JMP _typ7_

_typ1_:
 LDA _byte_
 INC _byte_
 AND #3
 LSR @
 BCC _t2_
 BNE _typ6_
 LDA _bajt_
_t1_:
 STA _pomoc1_,X
 CLC
 ADC _frq_,X
 STA _frq_,X
_typ0_:
 RTS
_t2_:
 LDA #0
 STA _pomoc1_,X
 RTS
_typ2_:
 JSR _t5_
 JMP _t1_
_typ3_:
 JSR _t5_
 CLC
 ADC _aktwys_,X
 JMP _a5_
_typ4_:
 LDA _byte_
 STA _pomoc1_,X
 CLC
 ADC _frq_,X
_t3_:
 STA _frq_,X
 LDA _byte_
 CLC
 ADC _bajt_
 STA _byte_
 RTS
_typ5_:
 LDA _aktwys_,X
 SEC
 SBC _byte_
 STA _aktwys_,X
 TAY
 LDA _frqtab_,Y
 JMP _t3_
_typ6_:
 LDA _frq_,X
 SEC
 SBC _bajt_
 STA _frq_,X
 SEC
 LDA #0
 SBC _bajt_
 STA _pomoc1_,X
 RTS
_typ7_:
 LDA _ltyp_,X
 BNE _typ0_
 LDA _bajt_
 BPL _t4_
 LDA _vol2ch_,X
 BEQ _typ0_
 LDA _vol1ch_,X
 CMP #15
 BEQ _typ0_
 INC _vol1ch_,X
 RTS
_t4_:
 LDA _vol1ch_,X
 BEQ _typ0_
 LDA _vol2ch_,X
 CMP #15
 BEQ _typ0_
 INC _vol2ch_,X
 RTS
_t5_:
 LDY _byte_
 LDA _bajt_
 BMI _t6_
 INY
 INY
_t6_:
 DEY
 TYA
 STA _byte_
 CMP _bajt_
 BNE _t7_
 LDA _bajt_
 EOR #$ff
 STA _bajt_
_t7_:
 TYA
 RTS

_a2_:
 ADC _frq_,X
_a1_:
 STA _frq_,X
 RTS
_a3_:
 LDY _wysdzw_,X
 ADC _frqtab_,Y
 STA _frq_,X
 TYA
 STA _aktwys_,X
 RTS
_a4_:
 AND $d20a
 STA _frq_,X
 RTS
_a7_:
 ADC _wysdzw_,X
_a5_:
 STA _aktwys_,X
 TAY
 LDA _frqtab_,Y
 STA _frq_,X
 RTS
_a6_:
 STA _aktwys_,X
 TAY
 LDA _frq_,X
 ADC _frqtab_,Y
 STA _frq_,X
 RTS

_nparam_:
 INY
 INC _pozwpt_,X
 LDA (_addrtmc_),Y
 LSR @
 LSR @
 LSR @
 LSR @
 STA _adcvl1_,X
 LDA (_addrtmc_),Y
 AND #15
 STA _adcvl2_,X
 RTS

_songx_:
 JSR _stop_
 LDY #15
_zm4_:
 LDA #0
 STA _adrsng_
_zm5_:
 LDA #0
 STA _adrsng_+1
_d5_:
 TXA
 BEQ _inic_
_d3_:
 LDA (_adrsng_),Y
 BPL _d4_
 DEX
_d4_:
 CLC
 LDA _adrsng_
 ADC #16
 STA _adrsng_
 BCC _d5_
 INC _adrsng_+1
 BCS _d5_

_playx_:
 JSR _stop_
 LDA #0
 STA _addrtmc_
 TXA
 ASL @
 ASL @
 ROL _addrtmc_
 ASL @
 ROL _addrtmc_
 ASL @
 ROL _addrtmc_
_zm6_:
 ADC #0
 STA _adrsng_
 LDA _addrtmc_
_zm7_:
 ADC #0
 STA _adrsng_+1
_inic_:
 LDA #64
 STA _pozptr_
 LDA #1
 STA _ltempo_
 STA _czygrc_
 RTS

_inittmc_:
 CMP #$10
 BCC _songx_
 CMP #$20
 BCC _playx_
 CMP #$30
 BCS *+5
 JMP _d2_
 CMP #$40
 BCS _i1_
 TXA
 AND #15
 BEQ _i1_-1
 STA _tempo_
 RTS
_i1_:
 CMP #$50
 BCC _stop_
 CMP #$60
 BCS _i2_
 LDA #0
_i3_:
 STA _czygrc_
 RTS
_i2_:
 CMP #$70
 BCC _i3_

 LDA #1
 STA _ltempo_
 LDA #64
 STA _pozptr_
 STY _addrtmc_
 STX _addrtmc_+1
 LDY #30
 LDA (_addrtmc_),Y
 STA _tempo_
 LDA _addrtmc_
 CLC
 ADC #32
 STA _zm8_+1
 BCC *+3
 INX
 STX _zm8_+2
 CLC
 ADC #$40
 STA _zm9_+1
 BCC *+3
 INX
 STX _zm9_+2
 CLC
 ADC #$40
 STA _zm2_+1
 BCC *+3
 INX
 STX _zm2_+2
 CLC
 ADC #$80
 STA _zm3_+1
 BCC *+3
 INX
 STX _zm3_+2
 CLC
 ADC #$80
 STA _adrsng_
 STA _zm0_+1
 STA _zm4_+1
 STA _zm6_+1
 BCC *+3
 INX
 STX _adrsng_+1
 STX _zm1_+1
 STX _zm5_+1
 STX _zm7_+1

_stop_:
 LDY #7
 LDA #0
 STA _czygrc_
_d9_:
 STA $d200,Y
 STA $d210,Y
 STA _volume_,Y
 STA _vol1ch_,Y
 STA _vol2ch_,Y
 STA _audctl_,Y
 STA _czygrx_,Y
 DEY
 BPL _d9_
 STA $d208
 STA $d218
 STA _aud1_
 STA _aud2_
 RTS

_d1_:
 STA _vol1ch_,X
 STA _vol2ch_,X
 STA _audctl_,X
 LDA _wysdzw_,X
 STA _aktwys_,X
 RTS
_d0_:
 TYA
 EOR #$f0
 LSR @
 LSR @
 LSR @
 LSR @
 STA _adcvl1_,X
 TYA
 AND #15
 EOR #15
 STA _adcvl2_,X
 RTS
_d2_:
 AND #7
 STA _addrtmc_
 TXA
 LDX _addrtmc_
 AND #$3f
 BEQ _d0_
 STA _wysdzw_,X
_dzwiek_:
 LDA #0
 STA _czygrx_,X
_zm8_:
 LDA $ffff,Y
 STA _adrsnl_,X
 STA _addrtmc_
_zm9_:
 LDA $ffff,Y
 STA _adrsnh_,X
 STA _addrtmc_+1
 ORA _addrtmc_
 BEQ _d1_
 LDY #74
 LDA (_addrtmc_),Y
 STA _opad1_,X
 STA _lopad1_,X
 INY
 LDA (_addrtmc_),Y
 STA _opad2_,X
 STA _lopad2_,X
 INY
 LDA (_addrtmc_),Y
 AND #$70
 LSR @
 LSR @
 STA _typ_,X
 LDA (_addrtmc_),Y
 AND #15
 STA _param_,X
 LDA (_addrtmc_),Y
 BPL _d7_
 LDA _param_,X
 EOR #$ff
 CLC
 ADC #1
 STA _param_,X
_d7_:
 INY
 LDA (_addrtmc_),Y
 STA _czekaj_,X
 INY
 LDA (_addrtmc_),Y
 AND #$3f
 STA _dtyp_,X
 STA _ltyp_,X
 INY
 LDA (_addrtmc_),Y
 AND #$80
 BEQ _d8_
 LDA #1
_d8_:
 STA _kolejn_,X
 LDA (_addrtmc_),Y
 AND #$70
 LSR @
 LSR @
 LSR @
 LSR @
 STA _ilperm_,X
 BNE _d6_
 STA _kolejn_,X
_d6_:
 LDA (_addrtmc_),Y
 AND #15
 STA _dperm_,X
 STA _lperm_,X
 DEY
 LDA (_addrtmc_),Y
 AND #$c0
 CLC
 ADC _wysdzw_,X
 STA _wysdzw_,X
 STA _aktwys_,X
 TAY
 LDA _frqtab_,Y
 STA _frq_,X
 LDA #0
 STA _slupy_,X
 STA _pomoc1_,X
 STA _pomoc2_,X
 STA _aperm_,X
 LDA #1
 STA _czygrx_,X
 RTS
ENDP

;-----------------------------------------------------------------------------
; Generate sound.
; in:    A - channel.
;     (34) - voice.
;     (33) - tone.
;     (32) - loud.
;-----------------------------------------------------------------------------
Sound PROC A,(34),(33),(32)
 ldx 34
 and #3
 asl @
 tay
 lda #0
 STA 53768
 lda #3
 sta 53775
 txa
 sta 53760,y
 lda 32
 and #%00001111
 sta 32
 lda 33
 asl @
 asl @
 asl @
 asl @
 clc
 adc 32
 sta 53761,y
 rts
ENDP
;-----------------------------------------------------------------------------
; Play the CMC file.
; in: YX - address.
;-----------------------------------------------------------------------------
PlayCMC PROC YX
; CMC Player by MP's
; (c) 1992 Tajemnice ATARI
 stx _adrcmc2_
 sty _adrcmc2_+1
 ldy #7
 lda (_adrcmc2_),y
 cmp #227 ;c
 jne _errcmc_
 iny
 lda (_adrcmc2_),y
 cmp #237 ;m
 jne _errcmc_
 iny
 lda (_adrcmc2_),y
 cmp #227 ;c
 jne _errcmc_

 ldy #2
 lda (_adrcmc2_),y
 sta _adrcmc1_
 iny
 lda (_adrcmc2_),y
 STA _adrcmc1_+1

 lda _adrcmc2_
 clc
 adc #6
 sta _adrcmc2_
 lda _adrcmc2_+1
 adc #0
 sta _adrcmc2_+1

 lda _adrcmc2_
 clc
 adc #$14
 sta _lsbcmc_
 lda _adrcmc2_+1
 adc #0
 sta _lsbcmc_+1

 lda _adrcmc2_
 clc
 adc #$54
 sta _msbcmc_
 lda _adrcmc2_+1
 ADC #0
 sta _msbcmc_+1

 jsr _reloc_cmc_

 ldx _adrcmc2_
 ldy _adrcmc2_+1
;zachowaj stary adres przerwania
 lda 546
 sta _hlp_w_+1
 lda 547
 sta _hlp_w_+2
;inicjalizuj
 lda #$70
 jsr _m_init_
;graj muzyk©
 lda #$00
 tax
 jsr _m_init_
;inicjalizuj nowe przerwanie
 ldy <_play_cmc_
 ldx >_play_cmc_
 LDA #6
 jmp 58460

_play_cmc_:
 jsr _m_tact_
_hlp_w_:
 jmp $FFFF
;------------------
;    SYZYGY #6    :
;  Relokator CMC  :
;------------------
_reloc_cmc_:
     ldy #0
     lda (_lsbcmc_),y
     cmp #$ff
     bne _ck1_
     lda (_msbcmc_),y
     cmp #$ff
     beq _ck3_
     lda (_lsbcmc_),y
_ck1_:
     sec
     sbc _adrcmc1_
     STA (_lsbcmc_),Y
     bcs _ck2_
     lda (_msbcmc_),y
     tax
     dex
     txa
     sta (_msbcmc_),y
_ck2_:
     lda (_msbcmc_),y
     sec
     sbc _adrcmc1_+1
     clc
     adc _adrcmc2_+1
     sta (_msbcmc_),y
     lda (_lsbcmc_),y
     clc
     adc _adrcmc2_
     sta (_lsbcmc_),y
     bcc _ck3_
     lda (_msbcmc_),y
     tax
     inx
     txa
     STA (_msbcmc_),Y
_ck3_:
     iny
     cpy #$40
     bne _reloc_cmc_+2
     rts
_errcmc_:
 COLOR 1
 POSITION 0,0
 PRINTE 'ERROR: THIS IS NOT THE CMC FILE!'
 jmp *
_m_init_=_player_cmc_+3
_m_tact_=_player_cmc_+6
_adrcmc1_=32 ;pocz.adr.muz.(nagˆ¢wek)
_adrcmc2_=34 ;gdzie relokowa†
_lsbcmc_=36  ;(2)
_msbcmc_=38  ;(2)

;*---------------------------*
;*     cmc player v 2.1      *
;*   by Marcin Lewandowski   *
;* based on cmc player v 2.0 *
;*      by Janusz Pelc       *
;*---------------------------*

;*--- strona 0

_addr_ = 61  ;(2)
_word_ = 63  ;(2)

;*--- skoki
_player_cmc_:
 jmp _basic_
 jmp _init_
 jmp _play_

;*--- dane

_volume_ db s'   '
_czest_  db s'   '
_numins_ db s'   '

 db c' cmc player v 2.1 '

_frq_    db s'    '
_znieks_ DB S'    '
_audc_   db b(0)

_czest1_ db s'   '
_czest2_ db s'   '
_czest3_ db s'   '
_zniek_  db s'   '
_count1_ db b($ff),b($ff),b($ff)
_count2_ db s'   '
_lopad_  db s'   '
_numptr_ db s'   '
_poswpt_ db s'   '
_ilewol_ db s'   '
_czygrx_ db b($80),b($80),b($80)
_czygrc_ db b($80)

_dana0_  db s'   '
_dana1_  db s'   '
_dana2_  db s'   '
_dana3_  db s'   '
_dana4_  db s'   '
_dana5_  db s'   '
_ladr_   DB S'   '
_hadr_   db s'   '

_posptr_ db b(0)
_possng_ db b(0)
_pocrep_ db b(0)
_konrep_ db b(0)
_ilrep_  db b(0)
_tmpo_   db b(0)
_ltemp_  db b(0)
_b1_     db b(0)
_b2_     db b(0)
_b3_     db b(0)
_czygr_  db b(0)

_adrmus_ db a(0)
_adradr_ db a(0)
_adrsng_ db a(0)

;*--- init

_init_: sta _b1_
 STX _b2_
 sty _b3_
 and #$70
 lsr @
 lsr @
 lsr @
 tax
 lda _tab1_,x
 sta _zm1_+1
 lda _tab1_+1,x
 sta _zm1_+2
 lda #3
 sta $d20f
 cld
 lda _word_
 pha
 lda _word_+1
 pha
 ldy _b3_
 ldx _b2_
 lda _b1_
_zm1_: jsr _graj_
 PLA
 sta _word_+1
 pla
 sta _word_
 rts

_graj_: lda _adrsng_
 sta _word_
 lda _adrsng_+1
 sta _word_+1
 ldy #0
 txa
 beq _grajx_
_l1_: lda (_word_),y
 cmp #$8f
 beq _l2_
 cmp #$ef
 bne _l3_
_l2_: dex
 bne _l3_
 iny
 cpy #$54
 BCS _l4_
 tya
 tax
 bpl _grajx_
_l3_: iny
 cpy #$54
 bcc _l1_
_l4_: rts

_grajx_: stx _possng_
 jsr _skoncz_
 lda #0
 ldx #9
_l5_: sta _poswpt_,x
 dex
 bpl _l5_
 sta _posptr_
 lda #1
 sta _czygr_
 lda #$ff
 sta _konrep_
 lda _adrmus_
 STA _word_
 lda _adrmus_+1
 sta _word_+1
 ldy #$13
 lda (_word_),y
 tax
 lda _adrsng_
 sta _word_
 lda _adrsng_+1
 sta _word_+1
 ldy _possng_
_l6_: lda (_word_),y
 cmp #$cf
 bne _l7_
 tya
 clc
 adc #$55
 tay
 lda (_word_),y
 bmi _l8_
 tax
 jmp _l8_
_l7_: CMP #$8f
 beq _l8_
 cmp #$ef
 beq _l8_
 dey
 bpl _l6_
_l8_: stx _tmpo_
 stx _ltemp_
 rts

_tempo_: and #$f
 beq _l8_
 stx _d0_+1
 stx _d1_+1
 stx _d2_+1
 sty _d0_+2
 sty _d1_+2
 sty _d2_+2
 rts

_inic_: stx _adrmus_
 stx _word_
 STY _adrmus_+1
 sty _word_+1
 clc
 txa
 adc #$14
 sta _adradr_
 tya
 adc #0
 sta _adradr_+1
 stx _adrsng_
 iny
 iny
 sty _adrsng_+1
 ldy #$13
 lda (_word_),y
 sta _tmpo_
 sta _ltemp_

_skoncz_: ldx #8
_l9_: lda #0
 sta _czygr_
 sta $d200,x
 CPX #3
 bcs _l10_
 sta _volume_,x
 lda #$ff
 sta _count1_,x
_l10_: dex
 bpl _l9_

_przer_: lda #$80
_l11_: ldx #3
_l12_: sta _czygrx_,x
 dex
 bpl _l12_
_l13_: rts

_kont_: lda #1
 sta _czygr_
 lda #0
 beq _l11_

_instr_: and #3
 cmp #3
 BEQ _l13_
 cpx #$40
 bcs _l13_
 cpy #26
 bcs _l13_
 tax
 lda #$80
 sta _czygrx_,x

_inst_: lda #0
 sta _count1_,x
 sta _count2_,x
 sta _lopad_,x
 lda _b2_
 sta _czest_,x

 lda _b3_
 asl @
 asl @
 asl @
 sta _word_
 clc
 LDA _adrmus_
 adc #$30
 pha
 lda _adrmus_+1
 adc #1
 tay
 pla
 clc
 adc _word_
 sta _ladr_,x
 tya
 adc #0
 sta _hadr_,x

 clc
 lda _adrmus_
 adc #$94
 sta _word_
 lda _adrmus_+1
 adc #0
 sta _word_+1
 lda _b3_
 ASL @
 adc _b3_
 asl @
 tay
 lda (_word_),y
 sta _dana0_,x
 iny
 lda (_word_),y
 sta _dana1_,x
 and #7
 sta _b1_
 iny
 lda (_word_),y
 sta _dana2_,x
 iny
 lda (_word_),y
 sta _dana3_,x
 iny
 lda (_word_),y
 sta _dana4_,x
 iny
 lda (_word_),y
 STA _dana5_,X

 ldy #0
 lda _b1_
 cmp #3
 bne _l14_
 ldy #2
_l14_: cmp #7
 bne _l15_
 ldy #4
_l15_: lda _tab3_,y
 sta _word_
 lda _tab3_+1,y
 sta _word_+1
 lda _dana2_,x
 lsr @
 lsr @
 lsr @
 lsr @
 clc
 adc _b2_
 sta _b2_
 STA _zm2_+1
 tay
 lda _b1_
 cmp #7
 bne _l16_
 tya
 asl @
 tay
 lda (_word_),y
 sta _czest1_,x
 iny
 sty _b2_
 jmp _l17_
_l16_: lda (_word_),y
 sta _czest1_,x
 lda _dana2_,x
 and #$f
 clc
 adc _b2_
 sta _b2_
_l17_: ldy _b2_
 lda _b1_
 CMP #5
 php
 lda (_word_),y
 plp
 beq _l18_
 cmp _czest1_,x
 bne _l18_
 sec
 sbc #1
_l18_: sta _czest2_,x
 lda _dana0_,x
 pha
 and #3
 tay
 lda _tab4_,y
 sta _zniek_,x
 pla
 lsr @
 lsr @
 lsr @
 lsr @
 ldy #$3e
 CMP #$f
 beq _l19_
 ldy #$37
 cmp #$e
 beq _l19_
 ldy #$30
 cmp #$d
 beq _l19_
 clc
_zm2_: adc #0
 tay
_l19_: lda _tab5_,y
 sta _czest3_,x
 rts

;*--- play

_play_: cld
 lda _addr_
 pha
 lda _addr_+1
 pha
 LDA _word_
 pha
 lda _word_+1
 pha
 lda _czygr_
 bne _g1_
 jmp _end_
_g1_: lda _czygrc_
 beq _g2_
 jmp _dal3_
_g2_: lda _tmpo_
 cmp _ltemp_
 beq _g3_
 jmp _dal2_
_g3_: lda _posptr_
 beq _g4_
 jmp _dal1_
_g4_: ldx #2
_g5_: ldy _czygrx_,x
 bmi _g6_
 sta _czygrx_,x
_g6_: sta _poswpt_,x
 DEX
 bpl _g5_

 lda _adrsng_
 sta _addr_
 lda _adrsng_+1
 sta _addr_+1
 ldy _possng_
 sty _word_
_g7_: cpy _konrep_
 bne _g8_
 lda _ilrep_
 beq _g8_
 lda _possng_
 ldy _pocrep_
 sty _possng_
 dec _ilrep_
 bne _g7_
 sta _possng_
 tay
 bpl _g7_
_g8_: ldx #0
_g9_: LDA (_addr_),Y
 cmp #$fe
 bne _g10_
 ldy _possng_
 iny
 cpy _word_
 beq _g11_
 sty _possng_
 jmp _g7_
_g10_: sta _numptr_,x
 clc
 tya
 adc #$55
 tay
 inx
 cpx #3
 bcc _g9_
 ldy _possng_
 lda (_addr_),y
 bpl _dal1_
 cmp #$ff
 beq _dal1_
 LSR @
 lsr @
 lsr @
 and #$e
 tax
 lda _tab2_,x
 sta _zm3_+1
 lda _tab2_+1,x
 sta _zm3_+2
 lda _numptr_+1
 sta _word_+1
_zm3_: jsr _stop_
 sty _possng_
 cpy #$55
 bcs _g11_
 cpy _word_
 bne _g7_
_g11_: ldy _word_
 sty _possng_
 jmp _end_

_stop_: jsr _przer_
_g12_: LDY #$ff
 rts
_jump_: bmi _g12_
 tay
 rts
_up_: bmi _g12_
 sec
 tya
 sbc _word_+1
 tay
 rts
_down_: bmi _g12_
 clc
 tya
 adc _word_+1
 tay
 rts
_temp_: bmi _g12_
 sta _tmpo_
 sta _ltemp_
 iny
 rts
_rep_: BMI _g12_
 lda _numptr_+2
 bmi _g12_
 sta _ilrep_
 iny
 sty _pocrep_
 clc
 tya
 adc _word_+1
 sta _konrep_
 rts
_break_: dey
 bmi _g13_
 lda (_addr_),y
 cmp #$8f
 beq _g13_
 cmp #$ef
 bne _break_
_g13_: iny
 rts

_dal1_: ldx #2
_v1_: LDA _ilewol_,X
 beq _v2_
 dec _ilewol_,x
 bpl _v7_
_v2_: lda _czygrx_,x
 bne _v7_
 ldy _numptr_,x
 cpy #$40
 bcs _v7_
 lda _adradr_
 sta _addr_
 lda _adradr_+1
 sta _addr_+1
 lda (_addr_),y
 sta _word_
 clc
 tya
 adc #$40
 tay
 lda (_addr_),y
 sta _word_+1
 and _word_
 CMP #$ff
 beq _v7_
_v3_: ldy _poswpt_,x
 lda (_word_),y
 and #$c0
 bne _v4_
 lda (_word_),y
 and #$3f
 sta _numins_,x
 inc _poswpt_,x
 bpl _v3_
_v4_: cmp #$40
 bne _v5_
 lda (_word_),y
 and #$3f
 sta _b2_
 lda _numins_,x
 sta _b3_
 jsr _inst_
 jmp _v6_
_v5_: cmp #$80
 bne _v7_
 LDA (_word_),Y
 and #$3f
 sta _ilewol_,x
_v6_: inc _poswpt_,x
_v7_: dex
 bpl _v1_

 ldx _posptr_
 inx
 txa
 and #$3f
 sta _posptr_

_dal2_: dec _ltemp_
 bne _dal3_
 lda _tmpo_
 sta _ltemp_
 lda _posptr_
 bne _dal3_
 inc _possng_

_dal3_: ldy _czest2_
 LDA _dana1_
 and #7
 cmp #5
 beq _a1_
 cmp #6
 bne _a2_
_a1_: dey
_a2_: sty _frq_+3
 ldy #0
 cmp #5
 beq _a3_
 cmp #6
 bne _a4_
_a3_: ldy #2
_a4_: cmp #7
 bne _a5_
 ldy #$28
_a5_: sty _audc_

 ldx #2
_loop_: lda _dana1_,x
 and #$e0
 STA _znieks_,X
 lda _ladr_,x
 sta _addr_
 lda _hadr_,x
 sta _addr_+1
 lda _count1_,x
 cmp #$ff
 beq _y4_
 cmp #$f
 bne _y2_
 lda _lopad_,x
 beq _y4_
 dec _lopad_,x
 lda _lopad_,x
 bne _y4_
 ldy _volume_,x
 beq _y1_
 dey
_y1_: tya
 sta _volume_,x
 lda _dana3_,x
 sta _lopad_,x
 JMP _y4_
_y2_: lda _count1_,x
 lsr @
 tay
 lda (_addr_),y
 bcc _y3_
 lsr @
 lsr @
 lsr @
 lsr @
_y3_: and #$f
 sta _volume_,x
_y4_: ldy _czest1_,x
 lda _dana1_,x
 and #7
 cmp #1
 bne _y6_
 dey
 tya
 iny
 cmp _czest2_,x
 php
 LDA #1
 plp
 bne _y5_
 asl @
 asl @
_y5_: and _count2_,x
 beq _y6_
 ldy _czest2_,x
 cpy #$ff
 bne _y6_
 lda #0
 sta _volume_,x
_y6_: tya
 sta _frq_,x
 lda #1
 sta _b1_
 lda _count1_,x
 cmp #$f
 beq _y9_
 and #7
 tay
 lda _tab9_,y
 STA _word_
 lda _count1_,x
 and #8
 php
 txa
 plp
 clc
 beq _y7_
 adc #3
_y7_: tay
 lda _dana4_,y
 and _word_
 beq _y9_
 lda _czest3_,x
 sta _frq_,x
 stx _b1_
 dex
 bpl _y8_
 sta _frq_+3
 lda #0
 sta _audc_
_y8_: inx
 LDA _zniek_,X
 sta _znieks_,x
_y9_: lda _count1_,x
 and #$f
 cmp #$f
 beq _y10_
 inc _count1_,x
 lda _count1_,x
 cmp #$f
 bne _y10_
 lda _dana3_,x
 sta _lopad_,x
_y10_: lda _czygrx_,x
 bpl _y11_
 lda _volume_,x
 bne _y11_
 lda #$40
 sta _czygrx_,x
_y11_: inc _count2_,x
 ldy #0
 lda _dana1_,x
 lsr @
 LSR @
 lsr @
 lsr @
 bcc _y12_
 dey
_y12_: lsr @
 bcc _y13_
 iny
_y13_: clc
 tya
 adc _czest1_,x
 sta _czest1_,x
 lda _czest2_,x
 cmp #$ff
 bne _y14_
 ldy #0
_y14_: clc
 tya
 adc _czest2_,x
 sta _czest2_,x
 dex
 bmi _x1_
 JMP _loop_

_x1_: lda _znieks_
 sta _znieks_+3
 lda _dana1_
 and #7
 tax
 ldy #3
 lda _b1_
 beq _x2_
 ldy _tab10_,x
_x2_: tya
 pha
 lda _tab8_,y
 php
 and #$7f
 tax
 tya
 and #3
 asl @
 tay
 lda _frq_,x
_d0_: STA $d200,Y
 iny
 lda _volume_,x
 cpx #3
 bne _x3_
 lda _volume_
_x3_: ora _znieks_,x
 plp
 bpl _d1_
 lda #0
_d1_: sta $d200,y
 pla
 tay
 dey
 and #3
 bne _x2_
 ldy #8
 lda _audc_
_d2_: sta $d200,y

 clc
_end_: pla
 STA _word_+1
 pla
 sta _word_
 pla
 sta _addr_+1
 pla
 sta _addr_
 rts

;*--- basic

_basic_: pla
 tax
 beq _p6_
 cmp #2
 beq _p2_
_p1_: pla
 pla
 dex
 bne _p1_
 rts
_p2_: lda $14
 CMP $14
 beq *-2
 lda $224
 cmp <_p8_
 bne _p3_
 lda $225
 cmp >_p8_
 beq _p1_
_p3_: lda $224
 sta _p9_+1
 lda $225
 sta _p9_+2
 lda <_p8_
 sta $224
 lda >_p8_
 sta $225
 pla
 pla
 beq _p4_
 sec
 sbc #1
_p4_: sta _p5_+1
 PLA
 tay
 pla
 tax
 lda #$70
 jsr _init_
 lda #0
_p5_: ldx #0
 jmp _init_
_p6_: lda $14
 cmp $14
 beq *-2
 lda $224
 cmp <_p8_
 bne _p2_-1
 lda $225
 cmp >_p8_
 bne _p2_-1
_p7_: lda _p9_+1
 sta $224
 lda _p9_+2
 sta $225
 LDA #$40
 jmp _init_
_p8_: jsr _play_
 bcc _p9_
 jsr _p7_
_p9_: jmp $ffff

;*--- tablice

_tab1_ db a(_graj_)
 db a(_grajx_)
 db a(_instr_)
 db a(_tempo_)
 db a(_skoncz_)
 db a(_przer_)
 db a(_kont_)
 db a(_inic_)

_tab2_ db a(_stop_)
 db a(_jump_)
 db a(_up_)
 db a(_down_)
 DB A(_temp_)
 db a(_rep_)
 db a(_break_)

_tab3_ db a(_tab5_)
 db a(_tab6_)
 db a(_tab7_)

_tab4_ db b($80),b($a0)
 db b($20),b($40)

_tab5_ db b($ff),b($f1),b($e4),b($d7)
 db b($cb),b($c0),b($b5),b($aa)
 db b($a1),b($98),b($8f),b($87)
 db b($7f),b($78),b($72),b($6b)
 db b($65),b($5f),b($5a),b($55)
 db b($50),b($4b),b($47),b($43)
 db b($3f),b($3c),b($38),b($35)
 db b($32),b($2f),b($2c),b($2a)
 db b($27),b($25),b($23),b($21)
 db b($1f),b($1d),b($1c),b($1a)
 db b($18),b($17),b($16),b($14)
 DB B($13),B($12),B($11),B($10)
 db b($0f),b($0e),b($0d),b($0c)
 db b($0b),b($0a),b($09),b($08)
 db b($07),b($06),b($05),b($04)
 db b($03),b($02),b($01),b($00)
 db b($00)

_tab6_ db b($00),b($00),b($00),b($00)
 db b($f2),b($e9),b($da),b($ce)
 db b($bf),b($b6),b($aa),b($a1)
 db b($98),b($8f),b($89),b($80)
 db b($7a),b($71),b($6b),b($65)
 db b($5f),b($00),b($56),b($50)
 db b($67),b($60),b($5a),b($55)
 db b($51),b($4c),b($48),b($43)
 db b($3f),b($3d),b($39),b($34)
 db b($33),b($39),b($2d),b($2a)
 db b($28),b($25),b($24),b($21)
 db b($1f),b($1e),b($00),b($00)
 db b($0f),b($0e),b($0d),b($0c)
 db b($0b),b($0a),b($09),b($08)
 db b($07),b($06),b($05),b($04)
 DB B($03),B($02),B($01),B($00)
 db b($00)

_tab7_ db a($b38),a($a8c),a($a00),a($96a)
 db a($8e8),a($86a),a($7ef),a($780)
 db a($708),a($6ae),a($646),a($5e6)
 db a($595),a($541),a($4f6),a($4b0)
 db a($46e),a($430),a($3f6),a($3bb)
 db a($384),a($352),a($322),a($2f4)
 db a($2c8),a($2a0),a($27a),a($255)
 db a($234),a($214),a($1f5),a($1d8)
 db a($1bd),a($1a4),a($18d),a($177)
 db a($160),a($14e),a($138),a($127)
 db a($115),a($106),a($0f7),a($0e8)
 db a($0db),a($0cf),a($0c3),a($0b8)
 db a($0ac),a($0a2),a($09a),a($090)
 db a($088),a($07f),a($078),a($070)
 db a($06a),a($064),a($05e),a($057)
 db a($052),a($032),a($00a)

_tab8_ db b($00),b($01),b($02),b($83)
 db b($00),b($01),b($02),b($03)
 DB B($01),B($00),B($02),B($83)
 db b($01),b($00),b($02),b($03)
 db b($01),b($02),b($80),b($03)

_tab9_ db b($80),b($40),b($20),b($10)
 db b($08),b($04),b($02),b($01)

_tab10_ db b(3),b(3),b(3),b(3)
 db b(7),b($b),b($f),b($13)

;*--- koniec
ENDP
;-----------------------------------------------------------------------------
; Stop playing of the CMC file.
;-----------------------------------------------------------------------------
StopCMC PROC
 lda _czygr_
 bne _stopcmc1_
 rts
_stopcmc1_:
 ldy _hlp_w_+1
 ldx _hlp_w_+2
 lda #6
 jsr 58460
 lda #$40
 jmp _m_init_
 IfNDef PlayCMC
   PlayCMC $FFFF
 endndef
ENDP
;-----------------------------------------------------------------------------
; Set the tempo of the CMC file.
; in: X - tempo.
;-----------------------------------------------------------------------------
TempoCMC PROC X
 lda #$30
 jmp _m_init_
 ifndef PlayCMC
   PlayCMC $FFFF
 endndef
ENDP
;-----------------------------------------------------------------------------
; Continue playing after StopCMC.
;-----------------------------------------------------------------------------
ContCMC PROC
 lda 546
 sta _hlp_w_+1
 lda 547
 STA _hlp_w_+2
 ldy <_play_cmc_
 ldx >_play_cmc_
 lda #6
 jsr 58460
 lda #$60
 jmp _m_init_
 ifndef PlayCMC
   PlayCMC $FFFF
 endndef
ENDP
;-----------------------------------------------------------------------------
; Set the position of playing.
; in: X - position.
;-----------------------------------------------------------------------------
PosCMC PROC X
 lda #$10
 jmp _m_init_
 ifndef PlayCMC
   PlayCMC $FFFF
 endndef
ENDP
;-----------------------------------------------------------------------------
; Set the frequency of first generator.
;-----------------------------------------------------------------------------
AudF1 MACRO freq
 lda #freq
 sta $D200 ;set AUDF1
ENDM
;-----------------------------------------------------------------------------
; Set the frequency of second generator.
;-----------------------------------------------------------------------------
AudF2 MACRO freq
 lda #freq
 sta $D202 ;set AUDF2
ENDM
;-----------------------------------------------------------------------------
; Set the frequency of third generator.
;-----------------------------------------------------------------------------
AudF3 MACRO freq
 lda #freq
 sta $D204 ;set AUDF3
ENDM
;-----------------------------------------------------------------------------
; Set the frequency of fourth generator.
;-----------------------------------------------------------------------------
AudF4 MACRO freq
 lda #freq
 sta $D206 ;set AUDF4
ENDM
;-----------------------------------------------------------------------------
; Set the tone and the loud of first generator.
;-----------------------------------------------------------------------------
AudC1 MACRO tone_loud
 lda #tone_loud
 sta $D201 ;set AUDC1
ENDM
;-----------------------------------------------------------------------------
; Set the tone and the loud of second generator.
;-----------------------------------------------------------------------------
AudC2 MACRO tone_loud
 lda #tone_loud
 sta $D203 ;set AUDC2
ENDM
;-----------------------------------------------------------------------------
; Set the tone and the loud of third generator.
;-----------------------------------------------------------------------------
AudC3 MACRO tone_loud
 lda #tone_loud
 sta $D205 ;set AUDC3
ENDM
;-----------------------------------------------------------------------------
; Set the tone and the loud of fourth generator.
;-----------------------------------------------------------------------------
AudC4 MACRO tone_loud
 lda #tone_loud
 sta $D207 ;set AUDC4
ENDM
;-----------------------------------------------------------------------------
; Set the control register.
;-----------------------------------------------------------------------------
AudCTL MACRO option
 lda #opton
 sta $D208 ;set AUDCTL
ENDM
;-----------------------------------------------------------------------------
; Play the SMP file on the POKEY interrupt.
;-----------------------------------------------------------------------------
InterruptSMP@ON PROC
  lda #1
  sta _intSMP_
  rts
 ifndef _intSMP_
_intSMP_ db 1
 endndef
ENDP
;-----------------------------------------------------------------------------
; Play the SMP file directly.
;-----------------------------------------------------------------------------
InterruptSMP@OFF PROC
  lda #0
  sta _intSMP_
  rts
 ifndef _intSMP_
_intSMP_ db 1
 endndef
ENDP
;-----------------------------------------------------------------------------
; Play the SMP file directly. (NOTE: it is used only when InterruptSMP OFF)
;-----------------------------------------------------------------------------
TempoSMP PROC A
  sta _tempoSMP_
  rts
 ifndef _tempoSMP_
_tempoSMP_ db 0
 endndef
ENDP
;-----------------------------------------------------------------------------
; Play the SMP file.
; in: YX - address.
;-----------------------------------------------------------------------------
PlaySMP PROC YX
  stx 32
  sty 33
  ldy #0
  lda (32),y
  cmp #'S'
  bne _error_smp_
  iny
  lda (32),y
  cmp #'M'
  bne _error_smp_
  iny
  lda (32),y
  cmp #'P'
  bne _error_smp_
  ldy #3+13+2
  lda (32),y

  lda #0
  sta $D206       ;reset AUDF4
  lda #%10101010
  sta _high_smp_  ;which is nibble playing ?

  ;Disable POKEY interrupt
  lda #192
  sta 53774       ;IRQEN

 ;set address datas of sample
;zzz
  lda 32
  add #3+13+2+1         ;add length of header
  sta _init_sample_+1
  lda 33
  adc #0
  sta _init_sample_+2

  ;Set address POKEY interrupt
  ldx <_start_sample_
  ldy >_start_sample_
  stx 532         ;VTIMR3
  sty 533         ;VTIMR3

  lda #0
  sta $D208      ;set AUDCTL  on 64kHz

  lda #196       ;Enable POKEY interrupt
  sta 16         ;IRQENS
  sta 53774      ;IRQEN
  lda _intSMP_
  bne _playsmp1_
_playsmp0_:
  lda #196
  cmp 16
  beq _playsmp0_
_playsmp1_:
  rts

_error_smp_:
  COLOR 1
  POSITION 0,0
  PRINTE 'THIS IS NOT THE SMP FILE !'
  jmp *
  InterruptSMP ON
  TempoSMP 0

 ;this procedure plays sample on AUDC4
_start_sample_:
  txa
  pha

_init_sample_:
  lda $FFFF
  beq _plays3_
  bit _high_smp_
  bvc _plays2_
  ora #$F0
  sta $D207 ;AUDC4
  clc
  ROL _high_smp_
  inc _init_sample_+1
  bne _plays1_
  inc _init_sample_+2
_plays1_:
  lda _intSMP_
  bne _plays11_

  ldx _tempoSMP_   ;wait for the end of loop
  beq _init_sample_
_playsa_:
  dex
  bne _playsa_
  beq _init_sample_
_plays11_:
  pla
  tax
  pla
  rti

_plays2_:
  lsr @
  lsr @
  lsr @
  lsr @
  ora #$F0
  sta $D207 ;audc4
  sec
  rol _high_smp_
  lda _intSMP_
  beq _init_sample_
  pla
  tax
  pla
  rti

_plays3_:
  lda #192  ;Disable POKEY interrupt
  sta 53774 ;IRQEN
  sta 16
  pla
  tax
  pla
  rti

 ;zmienne
_high_smp_ db 0
ENDP
