moni varmaan miettiin miten se sidillä tehdään no tässäpä hieman codia
selväähän on että samplet soitetaan NMI keskeytyksillä mutta tässä ihan
ilman keskeytyksiä malli esimerkki ja ilman aika korjausta coodissa saattaa olla
virheitä koska kirjoitin sen ulkomuistista...
*=$1000
sample =$1000
start
sei ;keskeytykset pois
lda #<sample ;asetetaan samplen osoiteen alatavu
ldx #>sample ; ---===-- ylä tavu
sta $fe ; alatavu nollasivulle
stx $ff ; ylätavu ---===---
ldy #0 ; nollataan Y
loop lda ($fe),y ; ladataan sample tavu
pha ;tallennetaan pinoon
lsr
lsr
lsr
lsr ;siirretään tavun ylin 4 bittiä alimmaiseksi
sta $d418 ; sample volume rekisteriin
sta $d020 ; vähän väriä
jsr wait ;odotetaan ettei mene liian nopeasti
pla ;palautetaan sample tavu pinosta
and #$0f ;siivotaan jo käytetyt ylimmät bitit pois
sta $d418 ; ja taas volume rekisteriin uusi sample
sta $d020 ;lisää väriä
jsr wait ;odotellaan
inc $fe ;lisätään sample osoitetta yhdellä
bne tsek ;menikö jo yli
inc $ff ;lisätään ylintä osoite tavua yhdellä
tsek
lda #$fb
cmp $dc01 ;onko CTRL näppäintä painettu
bne loop ;ei ole jatketaan
cli ;keskeytykset päälle
rts ;paluu basiciin tms.
wait ldx #0 ; x=0
loop2 dex ; x=x-1
bne loop2 ; pyöritetään looppi2 kunnes päästään taas 0
rts
sample koostuu yleisimmin kahdesta osasta koska volume rekisteri on vain 4 bittinen
yhteen tavuun siis mahtuu kaksi sample otantaa
Hahahaha...
vihdoin löysin 8bit sample malli rutiinin
tuota pitääkin alkaa urakalla tutkimaan selvästi siinä on vielä
parantamisen varaa... kertoilen sitten kun oma rutiini polpahtaa pinnalle xF
perskules...
sain kyllä rutiinin toimimaan mutta...
jotenkin epäilen ettei se ole sitä mitä etsin
tällä hetkellä ajan samplerillä ääntä sisään ja tuuppaan sen ulos tuolla 8bit sid rutiinillani
jouduin jopa ronkkimaan aidon rutiinin vicius sid demosta
mikä on sama kuin netissä kerrottu esimerkki
ongelma vain on se etten saa kyseisellä rutiinilla pihaustakaan omasta vehkeestäni
malli esimerkki ei toimi ellen ensimmäistä lda #$11 muuta lda #$10 muotoon
ihmettelen tätä koska itse demossa äänet toimivat aivan hyvin ?!?
tosin Wanha sid 6581 filtterit eivät toimi ihan niin hyvin kuin videossa
vaan niiden soundi on paljon räkäisempi ja resonassia on reilummin o7
ajan ohjelmaa ilman keskeytyksiä ja pimennetyllä ruudulla jotta BaadLinet ei häiritse
samalla hieman mietin sitä ettei ääni kuulosta koviin hyvältä jos sample soitto taajuus
laskee jonkin verran tarkoittaa sitä että 4bit samplea voin ajaa alemmallakin taajuudella
ja se ei silti kuulu itse äänessä tämä rutiini taas vaatii ruurta näyte taajuutta ?!?
eli epäilen ettei rutiini toimi oikein oletus on että 8bit sämpleä pitäisi pystyä ajamaan
hitaammalla taajuudella sen suuremman dynaamisuuden vuoksi
olenko nyt ihan metsässä ?
tiedän että aito vicius koodi ajaa sampleä fiksatulla irq rasteri ajastuksella ja näin välttää badline häsän...
8bit_sid lda #$11 <- tämä pitää muuttaa #$10 muotoon että toimii ?!?!
sta $d412
lda #$ 09
sta $d412
lda sample,x
sta $d40f
nop
lda #$01
sta $d412
tässä avaava artikkeli asiasta
http://codebase64.org/doku.php?id=base:vicious_sid_demo_routine_explained (http://codebase64.org/doku.php?id=base:vicious_sid_demo_routine_explained)
ok
tässä hieman omia Sample rutiineija teillekin ihmeteltäväksi
samplen soitossa ajastus on tärkeimpiä äänenlaatuun vaikuttavia
asioita kuten tässä esteltävässä rutiinissä
ensimmäinen rivi BIT $DD0D
käynnistetään ajastus uudelleen heti alussa
näin varmistetaan että seuraavakin sample tulee "tarkasti" halutun ajan kuluttua
koska laskuri alkaa heti tämän jälkeen laskea seuraavaa keskeytys aikaa
ohjelmoijalle jääkin sitten vain ajastaa itse samplen soittaminen molemmissa
osissa (C64 4bit samplet koostuvat kahdesta samplesta ala ja ylä osa)
tarkalleen samalla ajastuksella kuin edellinen
tietenkään tämä ei ole mahdollista kovin tarkasti badline ja prosessorin suorittamien
käskyjen erilaistan suoritus aikojen suhteen keskeytykset eivät pysty keskeyttämään
itse käskyjen suoritusta
(eivät edes ystiset NMI keskeytykset vaikka pystyvätkin ajamaan IRQ keskeytysten ylitse)
joten sen täytyy odottaa kunnes se on suoritettu loppuun
tämä voi kestää 2-6 kellojaksoon kielletyt käskyt tästä vieläkin enemmän
rutiini olettaa että olet jo kytkenyt ylemmän Romin pois päältä
ja asettaa keskeytykset suoraan Hard puolelle eli FFFE ja FFFF
Soft osotteet 0318 ja 0319 NMI keskeytyksille
soiton ajotuksen kannalta kellojaksot mitä käytät ennen STA $D418
käskyä ovat merkityksellisiä kuten huomaat molemmissa ajastus on 20 kellosykliä
voit alemmasta rutiinista poistaa "ylimääräiset" NOP lauseet mutta se vaikuttaa hieman
äänen laatuun tosin keskeytys vie vähemmän kello jaksoja ja pystyt ajamaan sitä
ylemmillä kierroksilla ilman että kone kaatuu...
äänen korkeuttahan säädellään LO $dd04 ja HI $dd05 arvoilla
jos HI on 0 ja Lo menee alle $35 alkaa C64 kaatuminen lähestymään
eikä prossa ehdi juuri muuta tekemäänkään kuin ajamaan pelkkää NMI keskeytys looppia
ORA lauseet ovat jos käytät SID puolta ja käytää myös Filttereitä
*= $1000
NMIS LDA #<NMI
LDX #>NMI
STA $FFFA
STX $FFFB
LDA #$81
STA $DD0D
BIT $DD0D
RTS
; DON'T FORGET SET $DD04 AND $DD05
; $DD05=0 $DD04<35 AND C64 GONA FLIP
;****************************
; ************************
; * BB = A REC SAVE *
; * 6C = SAMPLE TEMP *
; * SAMPLE = SAM READER *
; ************************
;CLOCK
NMI BIT $DD0D ;CYCLES
STA $BB ;3
LDA $6C ;3 6
LSR A ;2 8
LSR A ;2 10
LSR A ;2 12
LSR A ;2 14
SU1 ORA #0 ;2 16 *
STA $D418 ;4 20
INC SAMPLE+1 ;6 26
BNE END1 ;3 29
INC SAMPLE+2 ;6
END1 LDA #<NMI2 ;2 31
STA $FFFA ;4 35
LDA $BB ;3 38 TOTAL
RTI ; * 38-2=36
KILL LDA #0
STA $DD0E
LDA #8
ORA VOL
STA $D418
JMP END1
NMI2
BIT $DD0D
STA $BB ;3
LDA $6C ;3 6
NOP ;2 8 *
NOP ;2 10 *
NOP ;2 12 *
AND #$0F ;2 14
SU2 ORA #0 ;2 16 *
STA $D418 ;4 20
SAMPLE LDA $1000 ;4 24
CMP #$F0 ;2 26
BEQ KILL ;2/3 28
STA $6C ;3 31
END2 LDA #<NMI ;2 33
STA $FFFA ;4 37
LDA $BB ;3 40 TOTAL
RTI ;* 40-8=32
; * = CAN REMOVE
; SAMPLE MUST END $F0
; ---------------------
;******************************