nowsza wersja
;-------------------
;- Synth Player v1.2
;- 12.02.2004
;-------------------
opt h+
org $b000
tmp equ $00
loop equ tmp+1 ; starszy bajt licznika dla length_Loop
tempo equ 16 ; tempo, ilosc pelnych przebiegow length_Loop
length_Loop equ 450 ; dlugosc petli playera, ile ma odegrac wartosci z sampla
audc1 equ $d201 ;rejestry Pokeya
audc2 equ $d203
audc3 equ $d205
audc4 equ $d207
;------------------------------------
;- PROCEDURKA PLAYER-a DLA 4 KANALOW
;------------------------------------
player equ *
;- kanal #1
clc
del0 lda #0
del0m adc #0
sta del0+1
lda adres0+1
adc #0
sta adres0+1
del0_ lda #0
del0m_ adc #0
sta del0_+1
lda adres0_+1
adc #0
sta adres0_+1
adres0 lda $ff00 ; adres 1-ego sampla
adres0_ adc $ff00 ; adres fali modyfikacyjnej
lsr @ ; dla Covoxa moznaby pominac 'LSR @', wiekszy przedzial wartosci przyjmie Covox
tax
vol0 lda $ff00,x ; adres tablicy glosnosci dla 1-ego sampla
ch0 sta audc1
;- kanal #2
clc
del1 lda #0
del1m adc #0
sta del1+1
lda adres1+1
adc #0
sta adres1+1
del1_ lda #0
del1m_ adc #0
sta del1_+1
lda adres1_+1
adc #0
sta adres1_+1
adres1 lda $ff00 ; adres 2-ego sampla
adres1_ adc $ff00
lsr @
tax
vol1 lda $ff00,x ; adres tablicy glosnosci dla 2-ego sampla
ch1 sta audc2
;- kanal #3
clc
del2 lda #0
del2m adc #0
sta del2+1
lda adres2+1
adc #0
sta adres2+1
del2_ lda #0
del2m_ adc #0
sta del2_+1
lda adres2_+1
adc #0
sta adres2_+1
adres2 lda $ff00 ; adres 3-ego sampla
adres2_ adc $ff00
lsr @
tax
vol2 lda $ff00,x ; adres tablicy glosnosci dla 3-ego sampla
ch2 sta audc3
;- kanal #4
clc
del3 lda #0
del3m adc #0
sta del3+1
lda adres3+1
adc #0
sta adres3+1
del3_ lda #0
del3m_ adc #0
sta del3_+1
lda adres3_+1
adc #0
sta adres3_+1
adres3 lda $ff00 ; adres 4-ego sampla
adres3_ adc $ff00
lsr @
tax
vol3 lda $ff00,x ; adres tablicy glosnosci dla 4-ego sampla
ch3 sta audc4
dey
beq test
jmp player
*-----------------
test lda loop
beq test_
dec loop ; zmniejszenie starszego licznika length_Loop
jmp player
test_ ldy <length_Loop
lda >length_Loop
sta loop
dec tmp ; tempo wyrazone w liczbie powtorzen petli playera
beq HEAD
jmp player
;-----------------------------------
;- dekodowanie patternu
;- ustawienie nowych czestotliwosci
;- glosnosci itp.
;-----------------------------------
HEAD
timer lda #0
inc timer+1 ; licznik na potrzeby testow, ustawia po kolei 32 glosnosci i 32 czestotliwosci
and #$1f
tax
tay
* track 0
lda Adr_Volume,y
sta vol0+2
lda frq,x
sta del0m+1
clc
shift0 adc #3 ; czestotliwosc fali modyfikacyjnej, zwiekszona o wartosc SHIFT wzgledem glownej czestotliwosci
sta del0m_+1
lda #0 ; zerowanie licznika
sta del0+1
sta del0_+1
lda Adr_Instr,x
sta adres0+2
lda >sampl01 ; fala modyfikujaca
sta adres0_+2
* track 1
ldy #0 ;graj cisze
lda Adr_Volume,y
sta vol1+2
lda frq,x
sta del1m+1
clc
shift1 adc #9
sta del1m_+1
lda #0
sta del1+1
sta del1_+1
lda Adr_Instr,x
sta adres1+2
; lda #0
; sta adres1+1
* track 2
ldy #0
lda Adr_Volume,y
sta vol2+2
lda frq,x
sta del2m+1
clc
shift2 adc #9
sta del2m_+1
lda #0
sta del2+1
sta del2_+1
lda Adr_Instr,x
sta adres2+2
; lda #0
; sta adres2+1
* track 3
ldy #0
lda Adr_Volume,y
sta vol3+2
lda frq,x
sta del3m+1
clc
shift3 adc #9
sta del3m_+1
lda #0
sta del3+1
sta del3_+1
lda Adr_Instr,x
sta adres3+2
; lda #0
; sta adres3+1
* let's go
lda #tempo
sta tmp
ldy <length_Loop
lda >length_Loop
sta loop
jmp player
*----
*- tutaj startuje program po wczytaniu do pamieci
*----
main
lda 20
cmp 20
beq *-2
sei ;wylaczenie ROM-u i wszystkich przerwan
lda #0
sta $d40e
sta $d400
lda #$fe
sta $d301
lda #0 ;zerujemy POKEY
sta $d208
lda #3
sta $d20f
ldx #33
ldy #0 ;ustawiamy 4-bit w tablicach glosnosci dla Pokeya
cnv0 lda volume,y ;w przypadku Covoxa, nie musielibysmy tego robic
ora #%00010000
cnv1 sta volume,y
iny
bne cnv0
inc cnv0+2
inc cnv1+2
dex
bne cnv0
ldy #0 ; wyliczamy tablice czestotliwosci
lda #24 ; pierwsza czestorliwosc
crea sta frq,y
clc
adc #3 ; stala addycja
iny
cpy #32
bne crea
jmp HEAD ; startujemy od zera (timer=0)
*----
*- tablice na 4-ej stronie
*----
org $0400
*----
*- instrumenty, czyli 256-bajtowe sample (32)
*----
Sampl00
:256 dta b(1) ; fala prostokatna
; :32 dta b(4)
; :32 dta b(8)
; :32 dta b(4)
; :32 dta b(0)
Sampl01 ; fala trojkatna
:8 dta b(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0)
Sampl02 ; fala modyfikujaca
:8 dta b(0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0)
;- adresy instrumentow
Adr_Instr
:32 dta h(Sampl02)
*----
*- tablice z opuznieniami dla kazdej z czestotliwosci (nuty)
*----
;- oryginalna z INERTI (2 bajtowe wartosci L, H)
; dta l(50),l(53),l(57),l(60),l(63)
; dta l(67),l(71),l(76),l(80)
; dta l(85),l(90),l(95),l(101)
; dta l(107),l(113),l(120),l(127)
; dta l(135),l(143),l(151),l(160)
; dta l(170),l(180),l(190),l(202)
; dta l(214),l(227),l(240),l(254)
; dta l(270),l(286),l(302),l(320)
; dta l(339),l(360),l(381),l(404)
; dta l(428),l(453),l(480),l(508)
; dta l(539),l(571),l(605),l(641)
; dta l(679),l(719),l(762)
*- i dla obecnego playera, wziete z kosmosu :), trzeba je dobrac porzadniej
*- 32 wartosci
frq
:32 brk
*----
*- tablica ze starszymi adresami glosnosci (33)
*----
Adr_Volume
dta h(volume,volume+$100,volume+$200,volume+$300,volume+$400,volume+$500,volume+$600,volume+$700)
dta h(volume+$800,volume+$900,volume+$a00,volume+$b00,volume+$c00,volume+$d00,volume+$e00,volume+$f00)
dta h(volume+$1000,volume+$1100,volume+$1200,volume+$1300,volume+$1400,volume+$1500,volume+$1600,volume+$1700)
dta h(volume+$1800,volume+$1900,volume+$1a00,volume+$1b00,volume+$1c00,volume+$1d00,volume+$1e00,volume+$1f00)
dta h(volume+$2000)
*----
*- 33 tablice z glosnosciami, kazda po 256 bajtow
*- dla Pokeya, trzeba ustawic 4-bit we wszystkich tablicach
*----
org $1000
volume ins 'volume.tab'
*---
run main