Przerwania, tu też może djabeł siedzieć. Oryginalna perkusja to takie tuk-tuk na przerwaniach. W ich miejsce dałem samplowane bębny, które z pewnością trwają dłużej niż jedno przerwanie.
Podmienilem kod JUMP_PERC_ADDR na ten co podałeś.
Zrobię eksperyment z oryginalną obsługą perkusji, możliwe że w tym tkwi problem.
Oryginalny kod perkusji wygląda tak. Dane sampli pobierane są z ROM.
DRUM01: LD E,$0A
LD A,BORDER_CLR
LD HL,$0100
DRUM01NOISE: XOR $18
OUT ($FE),A
LD B,(HL)
DRUM01LOOP: DJNZ DRUM01LOOP
INC HL
DEC E
JR NZ,DRUM01NOISE
RET
lub
DRUM02: LD HL,$005A
DRUM02LOOP: LD A,(HL)
OR A
RET Z
AND $18
OR BORDER_CLR
OUT ($FE),A
INC HL
JR DRUM02LOOP
W zmienionym kodzie z samplowaną perkusją wymuszone jest granie całego sampla i wtedy dopiero powrót.
DRUM01:
PUSH HL
PUSH DE
PUSH BC
EXX
PUSH HL
PUSH DE
PUSH BC
EXX
PUSH IX
PUSH IY
PUSH AF
EX AF,AF'
PUSH AF
EX AF,AF'
LD HL, AY_DATA1 ;bass D 1
CALL AY_SETUP ;ustawienie rejestrów AY - stały dźwięk jako dodatkowy bas
LD IX, KIK_SMP ;adres sampla w RAM
LD DE, 16 ;długość w bajtach
CALL DR_SAMPLER
EX AF,AF'
POP AF
EX AF,AF'
POP AF
POP IY
POP IX
EXX
POP BC
POP DE
POP HL
EXX
POP BC
POP DE
POP HL
RET
Ustawienie AY, z tabeli, na wejściu HL= adres tabeli
AY_SETUP:
LD C,253 ;AY register write
LD D,0
AY_SETUP_LOOP LD B, 255
LD A, D
OUT (C),A
LD B, 191
LD A, (HL)
OUT (C),A
INC HL
INC D
LD A,D
CP 14
JR NZ, AY_SETUP_LOOP
RET
Poniżej przykładowa tabela dla jednego z 4 używanych dźwięków AY i jednocześnie perkusji. Cały subengine jest work in progress, używa 2 sampli perkusji i 4 ustawień AY + wyciszenie. Tak, że tymczasowo odczytywane i zapisywane są wszystkie rejestry AY, choć wystarczy zmiana dwóch lub trzech. Do posłuchania w załączniku.
AY_DATA1 ; bass triangle D
DEFB 0,0,0,0,0,0 ;tone ABC registers 0-5 values
DEFB 0 ;noise freq
DEFB %111111 ;control register CBA-noise-tone 1=off 0=on
DEFB 0,16,0 ;volume/envelope ABC
DEFB 11,0 ;envelope freq
DEFB %1110 ;envelope form