;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ ;Û Û ;Û 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