Na, egyenlőre a következő lett a megszakom.
Lapozással, jobb és bal csatornára két különböző hang írással, 4KHz -en, szemre úgy 25-30% -al visz több időt a főprogram futása ha ez is megy alatta. Ha valahol elnéztem vagy elszámoltam valamit, akkor mégse.
A megszak az összes árnyékregisztert használja.
Igazából azért vettem előre a hangot, és ezért ezt a megszakot, mert ennek sebességéhez kell igazítsam a többit, ha megcsinálom az egészet, és aztán derül ki, hogy a hang miatt mégse jó, félő hogy nem kerülne bele a hang végül.
Szóval ha van tipp, hogy hogyan lehetne felgyorsítani, az nem volna rossz.
void IRQ() __naked
{
__asm
di
ex af, af ;csak árnyékregisztereket használunk
in a, (0xb4) ;megnézzük, hogy hang megszak jött -e
and #0x2
jr z, IRQ_NoAudio ;ha nem hang elugrunk oda, ezzel kizártunk minden zavaró tényezőt a lehető leggyorsabb hang megszakhoz,
;vagyis a video vackai nem lassítják tovább a hangot
ld a, #D_Ints+ 0x2 ;tehát akkor hangmegszakunk van itt már
out (0xb4), a ;ha már itt van A regiszterben, ilintézzük a 0xb4 sorsát
exx ;még mindíg csak árnyékot használunk, melyben elő van készítve főprogram által:
;DE= egyik minta
;HL= másik minta
;b= egyik minta vége után lévő cím felső bájtja
;c= másik minta vége után lévő cím felső bájtja
;tehát a hangminták csak 256 -os igazításon és hosszon vannak
ld a, #0xf9
out (D_Page1), a ;belapozzuk a hangminta szegmenst
ld a, d
cp b ;ellenőrizzuk, hogy elértük -e már a hangminta végét
jr nc, IRQ_AudioEnd0 ;ha elértük átugorjuk a minta kezelését
ld a, (de) ;betöltjük a mintát
out (0xa8), a ;kiirjuk a mintát
inc de ;növeljük a minta címét
IRQ_AudioEnd0:
ld a, h
cp c ;ellenőrizzuk, hogy elértük -e már a másik hangminta végét
jr nc, IRQ_AudioEnd1 ;ha elértük átugorjuk a minta kezelését
ld a, (hl) ;betöltjük a másik mintát
out (0xac), a ;kiirjuk a mintát
inc hl ;növeljük a minta címét
IRQ_AudioEnd1:
ld a, #0xfc
out (D_Page1), a ;visszatesszük az ellapozott lapunkat
exx
ex af, af
ei
ret ;ez egy audio megszak volt, visszatérünk. azt remélem, hogy ha itt volt video megszak IS az audio mellett,
;akkor az a visszatérés után újra kiváltódik majd egyedül, hang megszak nélkül
IRQ_NoAudio:
ld a, #D_Ints+ 0x20 ;ha ide eljöttünk, akkor ez egy video megszak, és ez már nem számít, mert ez sokkal kevesebbszer fut csak le
out (0xb4), a
ld a, #1
ld (_g_WasIRQ), a
ex af, af
ei
ret
__endasm;
}