Спасибо за инфу. А недолго это сколько ?
- - - Добавлено - - -

Сообщение от
Pyk
В общем случае перед sta ramDiskMode нужно прерывания запретить, а после out $10 - опять разрешить.
Это помогло. Спасибо. Но вот очень хочется понять почему такое происходит.
Если кто-то поможет найти ошибку, заранее большое спасибо!
Ниже эээто код прерывания
Код:
Interruption2:
; get the return addr which this interruption call stored into the stack
xthl
shld @return + 1
pop h
shld @restoreHL + 1
; store psw as the first element in the interruption stack
; because the following dad psw corrupts it
push psw
pop h
shld STACK_INTERRUPTION_ADDR-2
lxi h, 0
dad sp
shld @restoreSP + 1
; restore two bytes that were corrupted by this interruption call
push b
; dismount ram disks to not damage the ram-disk data with the interruption stack
xra a
out $10
lxi sp, STACK_INTERRUPTION_ADDR-2
push b
push d
call GCPlayerUpdate
INTERRUPTION_MAIN_LOGIC()
pop d
pop b
pop psw
mov l, a
; restore the ram-disk mode
; ramDiskMode doesn't guarantee that a ram-disk is in this mode already. that mode could be applied only after the next command in the main program
lda ramDiskMode
out $10
; restore A
mov a, l
@restoreHL: lxi h, TEMP_ADDR
@restoreSP: lxi sp, TEMP_ADDR
ei
@return: jmp TEMP_ADDR
.closelabels
все места в основной программе где используется квазидиск обернуты вот такими вставками:
Код:
mvi a, _command
sta ramDiskMode
out $10
...
Код:
xra a
sta ramDiskMode
out $10
Последний билд можно взять тут.
https://github.com/parallelno/Vector...GameNoname.rom
call GCPlayerUpdate это плеер gigachad16 который начинает глючно играть вконце трека.
INTERRUPTION_MAIN_LOGIC() это код для опроса клавиатуры и прочего
Код:
; interruption logic
mvi a, PORT0_OUT_IN
out 0
xra a
out 3
IN 2
inr a
sta anyKeyPressed
mvi a, $fe
out 3
IN 2
sta keyCode
mvi a, PORT0_OUT_OUT
out 0
lda borderColorIdx
out 2
lda scrOffsetY
out 3
lxi h, interruptionCounter
inr m
Глюк влияет на музыку. Ее данные в основной памяти. После нескольких повторов трека, она становится все более поломанной. И только один раз я заметил что спрайты скелетов стали покарапчены. Их данные в квазидиске.
Эти глюки происходят только если игра не синхрониизированна с прерываниями, т.е не имеет hlt в основной цикле. то есть прерывание может прервать основную программу в любом месте.
Если добавить di/ei как посоветовал Pyk, то чинится.
Пытаясь починить баг, я попробовал записывать 0 в регистры AY, очищать буфер музыки по окончанию трека, перенес инициализацию и эти очистки в основную программу чтобы не делать прерывание слишком долгим, но это не помогло.
Буду очень благодарен если кто-то поможет найти багу! Заранее спасибо!