Радио-86РК
16.01.2020, 22:04
Выделилoсь отсюда (https://zx-pk.ru/threads/31147-v-poiskakh-uteryannykh-vozmozhnostej%E2%80%A6.html?p=1042521&viewfull=1#post1042521)
Как известно, разработчики консоли Famicon-NES сэкономили центами на микросхемах, что сказалось на последующем избыточном содержании многих картриджей.
Теоретически, для РЛК можно тоже разработать подобный картридж для замены им оригинальной РФ2…
Так как к РФ2 подходит лишь сигнал ЧТЕНИЯ, выбор страницы ПЗУ через ЗАПИСЬ никак, казалось бы, недостижим без дополнительных проводков…
Однако, можно прибегнуть к трюку как в старом анекдоте про «Ошибку записи при чтении»: Ячейки FFF0…FFFF зарезервировать под накопительный регистр.
Скажем, включить последовательно две микросхемы К155ИР1, чтобы биты с адреса A0…A4 записывались в регистры при чтении ячеек FFF0…FFFF.
Затем все 8 бит с этих двух регистров можно чтением из FF00…FFEF записать уже в сам К531ИР23 и активировать нужную страницу…
(Получается: две ИР1, одна ИР23, одна ЛА2 для старших бит адреса и ещё ЛА4 для ИР1…)
Как пример, вот набросок кода для этого дела:
; Аккумулятор - код страницы
Page_Select:
PUSH PSW
PUSH H
MVI H,0FFh
CALL Page_Switch
POP H
POP PSW
RET
Page_Switch:
PUSH PSW
RRC
RRC
RRC
RRC
CALL Page_Nibble
POP PSW
Page_Nibble:
ORI 0F0h
MOV L,A ; Код нужной страницы накапливается тетрадами
CMP M ; Чтением FFF0…FFFF заносим в накопительный регистр
RETПример вызовов:
MVI A,015h ; Странница подпрограммы F815
CALL Page_Select
MOV A,M
CALL 0FF00h ; Вызов подпрограммы
MVI A,04Dh ; Странница директивы M
CALL Page_Select
CALL 0FF00h ; Вызов подпрограммыСледует также позаботиться о стеке вызовов страниц, чтобы вызывать из любых страниц произвольно другие страницы и корректно возвращаться. Но это уже вопрос программный…
Можно ещё больше сэкономить на регистрах/логике и все 256 ячеек FF00…FFFF отнять под выбор страницы:
PUSH H
LXI H,0FFFDh; Адрес входа в подпрограмму страницы
XTHL
PUSH H
LXI H,0FF15h; Код страницы
XTHL
RET ; Передача управления по адрес FEFD после FF15, где одни C9В этом случае потребуется одна ЛА2 и один ИР23. Но это не совместимо с оригинальным ПЗУ, так как там подпрограммы обслуживания клавиатуры, отладки, текст и директива «X»…
Хотя, можно использовать две ИР23 - буферную и индексную.
В буферный регистр заносить по всем адресам (A8…A1), если на A0 логическая «1».
А в индексный регистр - только по FFFE.
?????XXX XXXXXXXX - ROM-Address
-------------------------------
???????X XXXXXXX1 - Prepare Page
?????111 1111111? - Select Page
Switch_Page:
PUSH H
PUSH D
MOV L,A
MVI H,07Fh
DAD H
INX H
LXI D,0FFFEh
MOV A,M ; <- Odd address only
LDAX D ; <- Even address only
POP D
POP H
RET
Можно, напротив, применить К555ИР8 и использовать лишь две ячейки - FFFE/FFFF.
Загружать индекс страницы в ИР23 можно через адреса FFF0…FFFD.
Тогда МОНИТОР будет практически полностью совместим на странице #0, а код страницы потребуется набирать по одному биту.
Данный вариант обеспечивает максимальную совместимость, но требует логики побольше и код переключения будет громоздок…
Словом, вариантов - очень много!
P.S.: По мере удачного развития темы подредактирую здесь зарезервированное…
Как известно, разработчики консоли Famicon-NES сэкономили центами на микросхемах, что сказалось на последующем избыточном содержании многих картриджей.
Теоретически, для РЛК можно тоже разработать подобный картридж для замены им оригинальной РФ2…
Так как к РФ2 подходит лишь сигнал ЧТЕНИЯ, выбор страницы ПЗУ через ЗАПИСЬ никак, казалось бы, недостижим без дополнительных проводков…
Однако, можно прибегнуть к трюку как в старом анекдоте про «Ошибку записи при чтении»: Ячейки FFF0…FFFF зарезервировать под накопительный регистр.
Скажем, включить последовательно две микросхемы К155ИР1, чтобы биты с адреса A0…A4 записывались в регистры при чтении ячеек FFF0…FFFF.
Затем все 8 бит с этих двух регистров можно чтением из FF00…FFEF записать уже в сам К531ИР23 и активировать нужную страницу…
(Получается: две ИР1, одна ИР23, одна ЛА2 для старших бит адреса и ещё ЛА4 для ИР1…)
Как пример, вот набросок кода для этого дела:
; Аккумулятор - код страницы
Page_Select:
PUSH PSW
PUSH H
MVI H,0FFh
CALL Page_Switch
POP H
POP PSW
RET
Page_Switch:
PUSH PSW
RRC
RRC
RRC
RRC
CALL Page_Nibble
POP PSW
Page_Nibble:
ORI 0F0h
MOV L,A ; Код нужной страницы накапливается тетрадами
CMP M ; Чтением FFF0…FFFF заносим в накопительный регистр
RETПример вызовов:
MVI A,015h ; Странница подпрограммы F815
CALL Page_Select
MOV A,M
CALL 0FF00h ; Вызов подпрограммы
MVI A,04Dh ; Странница директивы M
CALL Page_Select
CALL 0FF00h ; Вызов подпрограммыСледует также позаботиться о стеке вызовов страниц, чтобы вызывать из любых страниц произвольно другие страницы и корректно возвращаться. Но это уже вопрос программный…
Можно ещё больше сэкономить на регистрах/логике и все 256 ячеек FF00…FFFF отнять под выбор страницы:
PUSH H
LXI H,0FFFDh; Адрес входа в подпрограмму страницы
XTHL
PUSH H
LXI H,0FF15h; Код страницы
XTHL
RET ; Передача управления по адрес FEFD после FF15, где одни C9В этом случае потребуется одна ЛА2 и один ИР23. Но это не совместимо с оригинальным ПЗУ, так как там подпрограммы обслуживания клавиатуры, отладки, текст и директива «X»…
Хотя, можно использовать две ИР23 - буферную и индексную.
В буферный регистр заносить по всем адресам (A8…A1), если на A0 логическая «1».
А в индексный регистр - только по FFFE.
?????XXX XXXXXXXX - ROM-Address
-------------------------------
???????X XXXXXXX1 - Prepare Page
?????111 1111111? - Select Page
Switch_Page:
PUSH H
PUSH D
MOV L,A
MVI H,07Fh
DAD H
INX H
LXI D,0FFFEh
MOV A,M ; <- Odd address only
LDAX D ; <- Even address only
POP D
POP H
RET
Можно, напротив, применить К555ИР8 и использовать лишь две ячейки - FFFE/FFFF.
Загружать индекс страницы в ИР23 можно через адреса FFF0…FFFD.
Тогда МОНИТОР будет практически полностью совместим на странице #0, а код страницы потребуется набирать по одному биту.
Данный вариант обеспечивает максимальную совместимость, но требует логики побольше и код переключения будет громоздок…
Словом, вариантов - очень много!
P.S.: По мере удачного развития темы подредактирую здесь зарезервированное…