moronizzz, размещай это дело в памяти
ld a,(foo)
inc a
ld (foo),a
ld hl,(foow)
ret
foo db 1
foow dw #8001
moronizzz, размещай это дело в памяти
ld a,(foo)
inc a
ld (foo),a
ld hl,(foow)
ret
foo db 1
foow dw #8001
Я нашёл статью, где немного описывается как звуки из бипера извлекать: http://zxpress.ru/article.php?id=5441&lng=eng
В связи с этим появились новые вопросы:
1) Есть ли где-то шпаргалка по соответствию задержек (частоты смены 4 бита) и нот?
2) Если предложенную функцию запускать в цикле, получается, что цвет бордюра постоянно меняется (из-за того, что используется XOR, чтобы менять значение 4 бита), есть ли общеизветный способ это обойти? Пока надумал только тестировать четвёртый бит при помощи BIT и устанавливать/сбрасывать в зависимости от предыдущего результата, но по-моему это очень медленно получится.
На всякий случай код из статьи:
Скрытый текст
10 DI; ban interrupt
20 LD BC, 2560; BC = length
30 LD A, 7; A = Border color
40 BEGIN XOR 16; inverting bits D4
50 OUT (254), A; output to port A 254
60 LD D, 100; D = delay (frequency)
70 PAUSE DEC D; D = D-1
80 JR NZ, PAUSE; if D <> 0 then loop
90 DEC BC; BC = BC-1
100 LD D, A; preservation A
110 LD A, B; BC =
120 OR C; 0?
130 LD A, D; A recovery
140 JR NZ, BEGIN; if BC <> 0 then loop
150 EI; permission to interrupt
160 RET; return to BASIC[свернуть]
3) Есть ли где-то пример того, как музыку на бипере приделывают к демо/интро? Выглядит так, как будто должна быть написана процедура (subroutine), издающая звуки, и к этой процедуре должны производиться регулярные обращения при выполнении программы - это так?
Последний раз редактировалось moronizzz; 23.08.2016 в 03:17.
moronizzz,
2) По хитрому не знаю. Нужно по честному: знать какой у тебя сейчас цвет бордюра, и при записи в порт FE этот цвет подтверждать в младших трёх битах.
Вот посмотри на код из статьи, строка 30. Программист знал, что цвет белый и только белый. И он смело пишет константу 7.
Тут "подтверждение" работает только один раз, потому что если в цикле заново указывать цвет, то будет сбрасываться и четвёртый бит, у меня сейчас примерно так всё это выглядит:
Скрытый текст
DI ; ban interrupt
LD A, %00000100 ; A = Border color
main_loop:
LD A, D ; A recovery
LD BC, 2000 ; BC = length
BEGIN:
;XOR %00010000 ; inverting bits D4
; чтобы сохранить цвет бордюра
BIT 4, A
LD A, %00000100
JP NZ, skip_set
SET 4, A
skip_set
JP Z, skip_res
RES 4, A
skip_res
OUT (254), A ; output to port A 254
LD E, A
LD A, (delay)
LD D, A ; D = delay (frequency)
LD A, E
PAUSE:
DEC D ; D = D-1
JR NZ, PAUSE ; if D <> 0 then loop
DEC BC ; BC = BC-1
LD D, A ; preservation A
LD A, B ; BC = 0?
OR C ;
JR NZ, BEGIN ; if BC <> 0 then loop
LD A, (delay)
SUB 5
CP 0
JP Z, finish
LD (delay), A
JR main_loop
RET
finish:
nop
EI ; permission to interrupt
RET ; return to BASIC
delay: DEFB 255
[свернуть]
Если ты в E хранишь текущее значение, выведенное в #fe, то лучше его и использовать, а не сохранять A куда попало:Код:BIT 4, A LD A, %00000100 JP NZ, skip_set SET 4, A skip_set JP Z, skip_res RES 4, A skip_res
Другой вопрос - если менять кол-во тактов между выводами в #FE, меняется и частота звука бипераКод:LD A, E XOR %00010000 ; изменить бит 4 на противоположный LD E,A OUT (254), A
Последний раз редактировалось SAM style; 23.08.2016 в 18:11.
Все любят гипножабу
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Вижу, что люди добавляют в образ с программой картинки и музыку бинарниками - где почитать как эти бинарники использовать из кода? Про графику, опять же, более-менее понятно, достаточно знать в какую область памяти она загружена и копировать на экран, а в случае с музыкой как будет?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)