- Сообщения
- 281
- Счётчик реакций
- 19
- Очки
- 890
Вызов #3D13 (SET-MIN) в ROM Spectrum устанавливает системную переменную IY на адрес #5C3A (системный флаг). Если это выполнить во время проигрывания музыки на прерываниях, возможны следующие последствия:
1. **Сбой музыки** — если музыкальный драйвер использует IY для своих целей (например, как указатель на структуру данных)
2. **Некорректная работа ISR** — если обработчик прерываний полагается на корректное значение IY
3. **Краш системы** — в худшем случае, если после изменения IY музыкальный драйвер попытается записать данные по неправильному адресу
Пример кода, который может сломать музыку:
```z80
DI ; отключаем прерывания на время
LD IY, #5C3A ; эквивалент CALL #3D13
EI ; включаем прерывания обратно
```
**Важно**: Большинство музыкальных драйверов для Spectrum используют альтернативные регистры (IX, HL, DE, BC) или сохраняют IY в стеке. Но некоторые оптимизированные драйверы могут использовать IY для быстрого доступа к данным.
**Рекомендация**: Если нужно использовать #3D13 во время работы музыки на прерываниях:
1. Сохранить текущее значение IY
2. Выполнить CALL #3D13
3. Восстановить IY
4. Или использовать DI/EI вокруг вызова
```z80
SAVE_IY:
PUSH IY
CALL #3D13
POP IY
RET
```
Короткий ответ: **Музыка может сломаться, если её драйвер использует регистр IY**.
1. **Сбой музыки** — если музыкальный драйвер использует IY для своих целей (например, как указатель на структуру данных)
2. **Некорректная работа ISR** — если обработчик прерываний полагается на корректное значение IY
3. **Краш системы** — в худшем случае, если после изменения IY музыкальный драйвер попытается записать данные по неправильному адресу
Пример кода, который может сломать музыку:
```z80
DI ; отключаем прерывания на время
LD IY, #5C3A ; эквивалент CALL #3D13
EI ; включаем прерывания обратно
```
**Важно**: Большинство музыкальных драйверов для Spectrum используют альтернативные регистры (IX, HL, DE, BC) или сохраняют IY в стеке. Но некоторые оптимизированные драйверы могут использовать IY для быстрого доступа к данным.
**Рекомендация**: Если нужно использовать #3D13 во время работы музыки на прерываниях:
1. Сохранить текущее значение IY
2. Выполнить CALL #3D13
3. Восстановить IY
4. Или использовать DI/EI вокруг вызова
```z80
SAVE_IY:
PUSH IY
CALL #3D13
POP IY
RET
```
Короткий ответ: **Музыка может сломаться, если её драйвер использует регистр IY**.