User Tools

Site Tools


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