És jól gondolom, hogy ezt az AYRESET rutint így csak a program elején kell hívni, menet közben amikor a játék resetelgeti az AY-t (konkrét esetben úgy tűnik minden hangeffektnél), akkor oda praktikusabb egy csak a regisztertörléseket alkalmazó egyszerűbb verziót rakni?
Talán nem sok jelentősége van, de jelenleg nem hívja az ayReset-et a program. Itt egy módosított verzió, ami a turbó felismerést csak az első hívásnál végzi el, így nem kell külön ayNull rutin. Ezen kívül, mivel a burkológörbe emuláció nem használ 1 kHz-es megszakítást, annak az engedélyezését töröltem.
ayReset:
di
ld hl, ayRegisters - 1
ld bc, 10afh
xor a
.l1: inc hl
out (c), a
ld (hl), a
dec c
djnz .l1
res 3, l ; register 7
ld (hl), 3fh
if NO_ENVELOPE_IRQ == 0
ld (envelopeInterrupt.l4 + 1), a
ld a, 18h ; = JR +nn
ld (envelopeInterrupt.l2), a
ld hl, MIN_ENV_FREQVAL
ld (envelopeInterrupt.l3 + 1), hl
ld a, low (envelopeInterrupt.l12 - envelopeInterrupt.l11)
ld (envelopeInterrupt.l10 + 1), a
ld a, low envelopeEnableTable
ld (setChannelAmplitude.l3 + 1), a
endif
ld a, 10h ; use 17-bit noise generator
out (0a6h), a
.l4: ld a, 0c9h ; * = RET
ld (.l4), a
ld a, 04h
out (0bfh), a
ld c, b
call .l2
ld l, b
call .l2 ; L = 1 kHz interrupts per video frame
ld a, 25
cp l
ld a, 03h
rla
rla
out (0bfh), a ; Z80 <= 5 MHz: 04h, > 5 MHz: 06h
; if NO_ENVELOPE_IRQ == 0
; ld a, 33h
; else
ld a, 30h
; endif
out (0b4h), a ; enable 1 kHz and video interrupts
ret
.l2: in a, (0b4h)
and 11h
or c
rlca
and 66h
ld c, a ; -ON--ON-
rlca ; ON--ON--
xor c ; OXN-OXN-
bit 2, a
jr z, .l3
inc l ; 1 kHz interrupt
.l3: cp 0c0h
jr c, .l2 ; not 50 Hz interrupt ?
ret