sqplayer
SQ-Tracker player
; Povodny player generovany SQ-Linkerom doplneny o GLOBVOL, ; tj. moznost globalneho utlmenia © 2009 mborik/RM-TEAM. ; Player je mozne pouzit aj bez vyhladavania skladby linkera na zaciatku, ; staci iba uvodny ldir 10-tich bajtov z BUFFER+2 na I_SM. CHZL: equ CHNZ2-CHNZ1 AY_SONG: ld hl,BUFFER ; inicializacia linkera: AY_SONG_NUMBER: ld a,1 ; na zaciatku kazdeho "bloku" ld de,1 ; je jeho dlzka AY_SONG2: add hl,de dec hl ld e,(hl) inc hl ld d,(hl) dec a jr nz,AY_SONG2 inc hl ld de,I_SM ; nasleduju 5x dvojbajty ld bc,10 ; s informaciami o umiestneni ldir ; patt/smp/orn/pos AY_INIT: ld a,8 ; inicializacia prehravaca ld (CHNZ1),a ld (CHNZ2),a ld (CHNZ3),a ld bc,257 call AY_REND1 AY_CHI: ld hl,(I_CH) ld ix,CHNZ1 call AY_I9 call AY_I call AY_I AY_STOP: ld de,1855 AY_CHI1: call OUT1 ld e,0 inc d ld a,d cp 12 jr nz,AY_CHI1 ret AY_PLAY: ld hl,AY_SYS dec (hl) jr nz,GLOBVOL AY_PLPOS: ld (hl),0 inc hl dec (hl) ld a,(hl) or a call z,AY_REST cp 4 call c,AY_I ld ix,CHNZ1 ld c,36 call AY_P ld ix,CHNZ2 ld c,18 call AY_P ld ix,CHNZ3 ld c,9 call AY_P GLOBVOL: ld a,0 ; global attenuation ld (CHNZ1+11),a ; pre vsetky kanaly ld (CHNZ2+11),a ld (CHNZ3+11),a bit 3,a ; dosiahla hodnota attenuation jr z,AY_C ; cislo vacsie ako 8? push hl ; ak ano, je nutne upravit ld hl,CHNZ1 ; sq-flagy, aby sa prestali ld de,CHZL ; prehravat hw obalky vo ld c,3 ; vsetkych troch kanaloch GLOBVOL1: res 0,(hl) ; vynulovanim nulteho bytu add hl,de dec c jr nz,GLOBVOL1 pop hl AY_C: xor a ; vynuluje mixer register ld l,a ld h,a ld (AY_N+1),hl ld ix,CHNZ1 ; postupne prechadza kanalmi call AY_R call AY_R call AY_R AY_N: ld bc,0 ; nastavenie mixer registra ld a,b ; B = sumove generatory pre ABC rla ; C = tonove generatory pre ABC rla rla or c cpl ; potom sa bity komplementuju AY_OFF: or 0 ld e,a ld d,7 ; a posielaju na register 7 AY OUT1: ld bc,$FFFD out (c),d ld b,$BF out (c),e ret AY_I: ld hl,0 AY_I1: ld ix,CHNZ1 AY_I9: ld a,(hl) or a jr nz,AY_I3 AY_I2: ld hl,(I_RP) AY_I3: ld b,(hl) rl b res 5,(ix+0) jr nc,AY_I4 set 5,(ix+0) AY_I4: inc hl ld a,(hl) and 15 ld (ix+26),a ld a,(hl) and 240 rra rra rra rra cp 9 jr c,ZBR sub 9 cpl ZBR: ld (ix+24),a inc hl ld (AY_I+1),hl ld l,b ld h,0 ld de,(I_PT) add hl,de ld e,(hl) inc hl ld d,(hl) inc de ld (ix+22),e ld (ix+23),d ld de,CHZL add ix,de ld (AY_I1+2),ix ret AY_REST: ld a,(CHNZ1+26) ld (CHNZ1+11),a ld a,(CHNZ2+26) ld (CHNZ2+11),a ld a,(CHNZ3+26) ld (CHNZ3+11),a ld hl,(CHNZ1+22) dec hl ld b,(hl) inc hl ld (CHNZ1+18),hl ld hl,(CHNZ2+22) ld (CHNZ2+18),hl ld hl,(CHNZ3+22) ld (CHNZ3+18),hl ld hl,(CHNZ1+24) ld (CHNZ1+20),hl ld hl,(CHNZ2+24) ld (CHNZ2+20),hl ld hl,(CHNZ3+24) ld (CHNZ3+20),hl ld hl,(AY_I+1) ld c,(hl) inc hl ld (AY_I+1),hl ld hl,CHNZ1 ld (AY_I1+2),hl ld a,3 ld d,0 AY_REST1: res 4,(hl) bit 5,(hl) jr z,AY_REST2 set 4,(hl) AY_REST2: ld e,21 add hl,de ld (hl),d ld e,CHZL-21 add hl,de dec a jr nz,AY_REST1 AY_REND1: ld (AY_SYS),bc ld a,c AY_REND2: ld (AY_PLPOS+1),a ld a,b ret AY_P: ld a,(ix+21) or a jr z,Y01 dec (ix+21) bit 7,(ix+0) jr nz,Y33 ret Y01: ld e,(ix+18) ld d,(ix+19) set 6,(ix+0) res 7,(ix+0) ld a,(de) inc de bit 7,a jr z,Y02 Y05: ld (ix+18),e ld (ix+19),d ld b,a bit 6,a jr z,Y60 dec de ld (ix+27),e ld (ix+28),d Y34: and 31 jp AY_SMP Y60: bit 5,a jr nz,Y06 and 15 bit 4,b jr z,Y07 neg Y07: add a,(ix+12) ld (ix+12),a Y33: ld e,(ix+27) ld d,(ix+28) res 6,(ix+0) ld a,(de) bit 7,a jr nz,Y34 inc de jp SMP_ORN Y06: and 15 ld (ix+21),a bit 4,b ret z or a jr z,Y33 set 7,(ix+0) jr Y33 Y02: cp 96 jp c,Y03 sub 96 cp 15 jr c,Y04 ld hl,AY_OFF+1 ld b,a ld a,(hl) or c ld (hl),a set 3,(ix+0) ld a,b sub 15 jp z,Z26 Y04: dec a ex de,hl ld c,(hl) inc hl bit 6,(ix+0) jr z,Y69 ld (ix+18),l ld (ix+19),h res 6,(ix+0) Y69: cp 8 jr c,Z38 set 0,(ix+0) ld l,c ld e,a ld d,13 call OUT1 ld d,11 ld e,l jp OUT1 Z38: cp 6 ; channel volume set jr nc,Z36 bit 4,(ix+0) ret z or a jr nz,Z31 ld a,c AY_V: and 15 ld (ix+11),a ret Z31: dec a ; channel volume slide jr nz,Z32 ld a,c add a,(ix+11) jr AY_V Z32: dec a ; global volume set jr nz,Z33 ld a,c ld (CHNZ1+11),a ld (CHNZ2+11),a ld (CHNZ3+11),a ret Z33: dec a ; global volume slide jr nz,Z34 ld b,3 ld de,CHZL ld hl,CHNZ1+11 Z33_2: ld a,(hl) add a,c and 15 ld (hl),a add hl,de djnz Z33_2 ret Z34: ld hl,AY_SYS ; speed set dec a jr nz,Z35 ld a,c AY_S: and 31 jr nz,AY_Z ld a,32 AY_Z: ld (hl),a jp AY_REND2 Z35: ld a,(hl) ; speed slide add a,c jr AY_S Z36: sub 6 ld b,0 ld a,c ld c,b jr nz,Z37 dec b neg Z37: set 2,(ix+0) ld (ix+13),c ld (ix+14),c ld (ix+15),a ld (ix+16),b ret Y03: ld (ix+12),a dec de ld (ix+27),e ld (ix+28),d inc de call SMP_ORN bit 6,(ix+0) ret z Z26: ld (ix+18),e ld (ix+19),d ret SMP_ORN: ld a,(de) inc de bit 7,a jr z,SMP_ORN9 ld b,a rra and 31 call nz,AY_SMP bit 6,b ret z ld a,(de) and 240 rr b rra rra rra srl a call nz,AY_ORN ld a,(de) inc de and 15 ret z SMP_ORN9: jp Y04 AY_SMP: push bc add a,a ld c,a ld b,0 ld a,(ix+0) and %11110000 ld (ix+0),a ld hl,(I_SM) add hl,bc ld c,(hl) inc hl ld b,(hl) push ix pop hl inc hl ld (hl),c inc hl ld (hl),b inc bc inc bc inc hl ld (hl),c inc hl ld (hl),b inc hl ld (hl),32 inc hl ld (AY_NXT+1),hl pop bc ld hl,AY_OFF+1 ld a,(hl) or c xor c ld (hl),a ret AY_ORN: add a,a ld c,a ld b,0 ld hl,(I_OR) add hl,bc ld c,(hl) inc hl ld b,(hl) AY_NXT: ld hl,0 ld (hl),c inc hl ld (hl),b inc hl inc bc inc bc ld (hl),c inc hl ld (hl),b inc hl ld (hl),32 set 1,(ix+0) ret OUT2: ld hl,AY_N+1 ; podla carry nastavi v AY_N rl (hl) ; tonovy generator, sumovy off inc hl ; potom vytiahne cislo kanalu rl (hl) ld a,(ix+17) add a,8 ; pripocita k nemu 8 out (c),a ; tj. volume registre AY ld b,$BF out (c),e ; a posle hodnotu v E jp AY_ZCH AY_R: ld l,(ix+3) ld h,(ix+4) ld bc,$FFFD ld d,(ix+0) ld e,0 bit 3,d ; ak sa nema nic hrat, umlcat jr nz,OUT2 ld a,(hl) and 15 jp nz,AY_R1 bit 0,d ; ak sa ma hrat obalka, nastav jr z,AY_R2 ld e,16 jp AY_R2 AY_R1: sub (ix+11) ; od hlasitosti z sa odpocita jr c,AY_R2 ; global volume nastavenie ld e,a AY_R2: ld a,(ix+17) ; vytiahne sa cislo kanalu add a,8 ; pripocita sa 8 cim sa dostnem out (c),a ; na registre hlasitosi AY ld b,$BF out (c),e ld a,(hl) inc hl and 240 ; vytiahujem sumove data rra rra rra ld d,6 ld e,(hl) rl e bit 5,(hl) ; zistujem, ci budeme sumiet jr z,AY_ZNN adc a,0 ld b,$FF out (c),d ld b,$BF out (c),a AY_ZNN: ld a,e rla ex de,hl ld hl,AY_N+1 ; nastavime v AY_N stavy oboch rl (hl) ; generatorov (sum/ton) pre ch. inc hl rla rl (hl) ex de,hl ld a,(hl) ; vypocitavanie frekvencie... and 31 ld d,a inc hl ld e,(hl) inc hl push de ld d,0 dec (ix+5) jp nz,FQ_2 ld l,(ix+1) ld h,(ix+2) ld a,(hl) inc hl cp 32 ld c,(hl) inc hl jr nz,FQ_1 set 3,(ix+0) res 1,(ix+0) FQ_1: ld b,a add a,a add a,b ld e,a add hl,de ld (ix+5),c FQ_2: ld (ix+3),l ld (ix+4),h ld a,(ix+12) bit 1,(ix+0) jr z,FQ_5 ld l,(ix+8) ld h,(ix+9) add a,(hl) inc hl dec (ix+10) jp nz,FQ_4 ex af,af' ld l,(ix+6) ld h,(ix+7) ld a,(hl) inc hl cp 32 ld e,b jr z,FQ_3 ld c,(hl) ld e,a FQ_3: inc hl add hl,de ld (ix+10),c ex af,af' FQ_4: ld (ix+8),l ld (ix+9),h FQ_5: add a,(ix+20) cp 45 jr nc,FQ_6 add a,a ld e,a ld hl,FRQ2 add hl,de ld d,(hl) inc hl jp FQ_7 FQ_6: ld hl,FRQ1-45 ld e,a add hl,de FQ_7: ld e,(hl) ex de,hl pop de ; ...frekvenciu mame, bit 4,d ; bude este fine-tuning? res 4,d jr z,FQ_9 add hl,de db 1 ; ld bc,NN namiesto sbc hl,de FQ_9: sbc hl,de bit 2,(ix+0) jr z,OUT9 ld c,(ix+13) ld b,(ix+14) add hl,bc ex de,hl ld l,(ix+15) ld h,(ix+16) add hl,bc ld (ix+13),l ld (ix+14),h ex de,hl OUT9: ld a,(ix+17) ; vytiahi cislo kanalu add a,a ; vynasob dvoma ld bc,$FFFD ; a naprogramuj freq tonu out (c),a ld b,$BF out (c),l inc a ld b,$FF out (c),a ld b,$BF out (c),h AY_ZCH: ld de,CHZL ; prejdi s IX na dalsi kanal add ix,de ret FRQ2: db 13,93,12,156 db 11,231,11,60 db 10,155,10,2,9,115 db 8,235,8,107,7,242 db 7,128,7,20,6,174 db 6,78,5,244,5,158 db 5,79,5,1,4,185 db 4,117,4,53,3,249 db 3,192,3,138,3,87 db 3,39,2,250,2,207 db 2,167,2,129,2,93 db 2,59,2,27,1,252 db 1,224,1,197,1,172 db 1,148,1,125,1,104 db 1,83,1,64 db 1,46,1,29,1,13 FRQ1: db 254,240,226,214 db 202,190,180,170 db 160,151,143,135 db 127,120,113,107 db 101,95,90,85,80 db 76,71,67,64,60,57 db 53,50,48,45,42,40 db 38,36,34,32,30,28 db 27,25,24,22,21,20 db 19,18,17,16,15,14 PLAY_LEN: equ $-AY_SONG CHNZ1: ds 29 CHNZ2: ds 29 CHNZ3: ds 29 AY_SYS: ds 2 I_SM: ds 2 I_OR: ds 2 I_PT: ds 2 I_CH: ds 2 I_RP: ds 2 ; nasleduju data songu ; taktiez Bulbov format .sqt zacina prave tu BUFFER:
Navigation: general . math . graphic . sound . system . other . back to start
sqplayer.txt · Last modified: 2017/02/16 13:25 by darkbyte