Paguo-86PK wrote:Задумaлся над применением картриджа, как у NES, который мог бы вставляться в панельку оригинального РФ2… можно разместить ПЗУ до 512 Кб из 256 страниц по 2 Кб.
Если идея введения страничного ПЗУ F800 в окне 2 кб приемлема (не идеально для программирования, но проще в аппаратной доделке на уже готовом изделии), то идея введения картриджа в окне 2 кб - неудачна. Что мешает ввести окно в 16 кб или даже 32 кб. Коду картриджа лучше работать из ПЗУ. Не хочется называть обычную страничность F800 картриджем.
Страничность ПЗУ это лобовое расширение ПЗУ F800 в ОРИОНЕ. Я сам это делал как минимум 3 раза (я имею ввиду программы). А впервые я это сделал в ОРИОНЕ в самом начале 1991 года. Потому-что в ОРИОНЕ ПЗУ всего 2 кб, как и в РК, но в ОРИОНЕ её родная ОС (называемая ORDOS) в 2 кб должна по сбросу грузиться или с МГ-ленты или автоматически из ROM-диска. Потому, если для РК доп.ПЗУ в 2 кб не нужны, то в ОРИОНЕ это необходимость, иначе надо каждый раз грузить ORDOS с МГ-ленты, что при серъёзном использовании машины вообще не годится (т.к ORDOS при отладке программ гибнет и её надо снова грузить с МГ-ленты). А платы ROM-дисков ещё ни у кого не было, они появились в продаже лишь к лету 1991.
Помыкавшись пару месяцев без ROM-диска, я применил в ОРИОНЕ РФ2 на которую уже ранее была напаяна панелька на 24 ноги (так у меня было в Специалисте, там так в 2 этажа у меня стояло 6 ПЗУ РФ2). В нижнуюю ПЗУ прошил чуть переделанный Монитор-3 ОРИОНА, который по сбросу загружал ORDOS на B800 из второй РФ2 во второй странице (страницы комммутировал бит запасного порта). Получилось по сути расширение ПЗУ до 4 кб самыми простейшими средствами без вторжений в печ.плату и без расхода доп.микросхем.
И когда позднее в 1991 году я выпускал партию печ.плат для установки в ОРИОН процессора Z80 (называлась Z80CARD-I), то в ней как раз и использовалась эта идея двухстраничного ПЗУ F800 за счёт напайки на РФ2 панельки или даже самих двух РФ2 в два этажа (тогда нижнюю РФ2 не очистить УФ-лучами). Для такого расширенного ROM-BIOS был RAM-монитор (называемый М3-EXT, который правда из-за отсутствия у людей такой доработки получил гораздо большее распространение в виде RAM-версии, что менее удобно, т.к конфликтует по месту загрузки с ORDOS), а известные программисты Adelaide в 1992 написали резидентный отладчик для Z80. В платах Z80CARD-II двух этажей РФ2 уже не поддерживалось (к тому времени в этом уже не было нужды, печ.платы ROM-дисков расространились и были у всех, давая не 2 доп.кб, а 64). Но у меня на всех моих 5 платах ОРИОНА всегда стояло как минимум две страницы ПЗУ.
В 1994 г. я странслировал Shadowy-монитор, который прошивался уже не в РФ2, а в 27256 (окно то же) и поддерживал загрузку резидентных программ из 27256. В монитор добавлялась команда @n, где n - номер программы (обычно, отладчик, УФ-прошиватель, бейсик, редактор-ассемблер и холодный загрузчик с дисковода).
Потому на 3-х из 5 моих плат ОРИОНА на месте +12В преобразователя рядом с ПЗУ РФ2 стоит вторая панелька на 28 ног. Но последние 23 года я использовал как раз только двухэтажные РФ2 (т.к они вечные, тогда как 27256 портятся после нескольких десяткох перешивок). У меня и сейчас есть все исходники для двухэтажного ПЗУ и мой эмулятор ОРИОНА из 1998 года поддерживает именно две ПЗУ РФ2 в окне F800 (второе ПЗУ называется SHADOWY.DAT). Две ПЗУ F800 нужны для эмулятора РК86 на ОРИОНЕ (скорость эмуляции 150 КГЦ, но половина РК-игр играбельна), т.к при эмуляции в области F800 должно стоять именно ПЗУ РК (точнее РК-совместимое), а не ОРИОНА и переставлять их можно только программно.
Это я к тому, что когда в ПЗУ не мощный ROM-BIOS, а оно служит лишь для резидентного хранения, то без разницы, что окно доступа к ПЗУ маленькие. Хотя с картриджем для игровых консолей не так. Обычно программа работает в ПЗУ самого картриджа, а продвинутые картриджи Денди содержат и доп.ОЗУ в котором тоже программа работает). Но для РК другое дело, для него нет программ не умещающихся в 28 кб ОЗУ и не придвидится программ работающих из ПЗУ. Потому для РК это без разницы.
Картридж в окне C000...FFFF (или 8000...FFFF) и даже работа прямо из него возможна потому, что в ВГ75 на C000 и ВТ57 на E000 программа лезет (и то только граф.программа, меняющая число строк) только один раз, когда ставит режим ВГ75. А т.к делает установку режима и лезет в ППА клавиатуры или ПЗУ F800 ваша программа, то кто мешает ей скинуть фрагмент кода в ОЗУ и оттуда один раз записать байты режима в ВГ75 и ВТ57, а затем включить в окне выше C000 картридж и прогонять там сплошной код игры?
Paguo-86PK wrote:каждые 2 Кб должны повторяться JMP-командами, чтобы не разрушать API - F800…F834
А вот эта мысль неудачна. Зачем дублировать стандартные входы?
Если в страничном ПЗУ просто переключаются разные версии 2-х килобайтовых мониторов, то там и эти входы есть и эти мониторы не переключают банки. А если используется свой уже изначально страничный ROM-BIOS, то короче удобнее специальный код межбанкового вызова подпрограмм. Ведь исполнительный код (например, п/п-мы вывода F809) всё равно остался в банке 0.
В ранних версиях я имел межстраничный вызов крошечным фрагментом в свободном ОЗУ F3F0...F3FF (в ОРИОНЕ это кусок ОЗУ отведённый на расширение именно ROM-BIOS, хотя нашлись уроды, которым и для программ в ОЗУ понадобилось эти ячейки использовать просто как рабочие, хотя для этого они имели ещё 60 кб других ячеек, из-за чего улучшенные версии ПЗУ висли на программах идиотов). Для РК такой угрозы нет, кто мешает занять 7FF4...7FFF?
Код межстраничного вызова в ОЗУ короче (ПЗУ экономится) и один на все страницы ПЗУ. Но из-за уродов на ОРИОНЕ, в версии ПЗУ из двух РФ2 которым я пользуюсь уже 25 лет для межбанковых переходов и вызовов используется вот такая конструкция:
В банке 0:
Code: Select all
; ===============================================
R1CALL: EX AF,AF
LD A,81H
OUT (0FCH), A ; этот же код в банке 1
EX AF,AF
LD IY,R1_BAK ; адрес возврата
PUSH IY
JP (IX) ; в банке 1 здесь тоже стоит JP (IX)
; -------------------------------------------------
R1_BAK: EX AF,AF
LD A,1
OUT (0FCH), A ; этот же код в банке 1
EX AF,AF
RET
; -------------------------------------------------
PROMPT: defb 13,10,'->',0
IX_JMP: EX AF,AF
JP (IX) ; в банке 1 здесь тоже стоит JP (IX)
В банке 1:
Code: Select all
; ----------------------------------------------
if $ gt R1CALL-6
if1
.printx * R0CALL over ! *
@OVER1 EQU $-(R1CALL-6)
endif
@FREE1 EQU 0
else
@FREE1 EQU R1CALL-6-$
rept @FREE1
defb 0
endm
endif
; ----------------------------------------------
LDHL1: LD A,0FFH ; 2
LD_HL: LD IX,@LD_HL ; 4
R0CALL: EX AF,AF
LD A,0
OUT (0FCH), A ; этот же код в банке 0
EX AF,AF
LD IY,R0_BAK ; адрес возврата
PUSH IY
JP (IX) ; в банке 0 здесь тоже стоит JP (IX)
; -------------------------------------------------
R0_BAK: EX AF,AF
LD A,0
OUT (0FCH), A ; этот же код в банке 0
EX AF,AF
RET
; -------------------------------------------------
R0_JMP: EX AF,AF
LD A,0
OUT (0FCH), A ; этот же код в банке 0
if $ ne IX_JMP
if1
.printx * IX_JMP shifted ! *
endif
endif
EX AF,AF
JP (IX) ; в банке 0 здесь тоже стоит JP (IX)
; -------------------------------------------------
YCONIN: LD IX,AF803
JR R0CALL
; -------------------------------------------------
YCOUTC: LD IX,AF809
JR R0CALL
; -------------------------------------------------
YHEX_A: LD IX,AF815
JR R0CALL
; -------------------------------------------------
YCHSUM: LD IX,AF82A
JP R0CALL
; -------------------------------------------------
YRRAM: LD IX,AF836
JR R0CALL
; -------------------------------------------------
YWRAM: LD IX,AF839
JR R0CALL
; -------------------------------------------------
YLDBYTE:
LD IX,AF806
JR R0CALL
; -------------------------------------------------
YERROR: LD IX,ERROR
JR R0CALL
Я сам уже не помню, но если подумать понять можно, как этот код работает. В обоих банках ПЗУ есть синхронные входы для вызова п/п-ммы в другой странице и синхронные выходы для возврата. В одной странице стоит OUT, что переключает страницы ПЗУ, в следующей команде оказываемся уже в другой странице, где стоит продолжение программы.
Paguo-86PK wrote:сам эмулятор можно как-то отмодифицировать, чтобы область F800…FFFF стала страничной.
Какой у Вас эмулятор? Для РК86 предпочтительнее EMU80, т.к РК-КНГМД не поддержан в EMU. Я сам сейчас не использую, но знаю (т.к ранее уже делал) как составить страничность и в другом эмуляторе, что называется EMU.
Для страничности ПЗУ F800 при EMU80 нужен вот такой код. Здесь 8 страниц (ясно как сделать сколько надо), которые переключаются по записи в тот же адрес окна ПЗУ). Это удобнее всего, т.к после установки 555 ИД7 для РК-КНГМД по схеме из ж.Радио 01.1993, это единственный свободный чип селект на запись. Переключение страниц ПЗУ размером по 2 кб в окне F800...FFFF тут управляется записью чисел 0...7 (в адрес окна ПЗУ F800...FFFF). При нужде подставьте иной диапазон адресов области для переключателя.
Code: Select all
.
@ROM_0 = "rk86/rom0.DAT"
@ROM_1 = "rk86/rom1.DAT"
@ROM_2 = "rk86/rom2.DAT"
@ROM_3 = "rk86/rom3.DAT"
@ROM_4 = "rk86/rom4.DAT"
@ROM_5 = "rk86/rom5.DAT"
@ROM_6 = "rk86/rom6.DAT"
@ROM_7 = "rk86/rom7.DAT"
Rom rom0 = @ROM_0,0x800
Rom rom1 = @ROM_1,0x800
Rom rom2 = @ROM_2,0x800
Rom rom3 = @ROM_3,0x800
Rom rom4 = @ROM_4,0x800
Rom rom5 = @ROM_5,0x800
Rom rom6 = @ROM_6,0x800
Rom rom7 = @ROM_7,0x800
AddrSpaceMapper rom = 8
rom.page = 0, &rom0
rom.page = 1, &rom1
rom.page = 2, &rom2
rom.page = 3, &rom3
rom.page = 4, &rom4
rom.page = 5, &rom5
rom.page = 6, &rom6
rom.page = 7, &rom7
PageSelector romPageSelector
romPageSelector.mapper = &rom
Translator romSelectorTranslator = &romPageSelector
romSelectorTranslator.writeAndMask = 0x7
addrSpace.writeRange = &romSelectorTranslator, 0xF800, 0xFFFF
addrSpace.writeRange = &dma, 0xE000, 0xE7FF
addrSpace.readRange = &rom, 0xF800, 0xFFFF
.
- - - Добавлено - - -
Ладно, зачем трахаться редактируя конфиг, если я это уже сделал. Вот просто возьмите этот эмулятор в котором конфиг, которым я пользуюсь. Этого конфига Вам хватит на все случаи совместимого развития РК86 (версию самого эмулятора можете заменить на более свежую, если у Вас не Win XP). Таймер ВИ53 на вывод звуков я убрал, а то он стоял не пойми где, мешался (добавить не проблема), а в реале ВИ53 пищит по сбросу случайными тонами, если его программно не инициализировать).
Два идентичных конфига Z80 / КР580, отличаются только строкой с CPU. Есть ПЗУ 9000...9FFF с отладчиком (его запуск командой G9000<ВК>), есть 32 страницы доп.ОЗУ по 8 кб в окне A000...BFFF (порт коммутации 8800, а запасной ППА D14 перенесён на 8400) и есть 16 страниц ПЗУ с окном 2 кб (коммутация портом F800). Прерывания, если надо могу добавить. В мониторе доп.директива <B> - загрузка с дисковода. Для реала есть версия ПЗУ, где загрузка дисковода начинается, если удерживать одну из спец.клавиш при нажатии на сброс, но для эмулятора это неудобно, т.к в нём для сброса нужны две руки, а третьей руки у многих нет.
Удобно отлаживать программы используя команду HALT. В исходнике её вставляете в том месте до которого программа прогоняется без ошибок и по запуску странслированной программы вылетаете в этом месте в отладчик (чтобы продолжить трассировку надо забить код 76 HALT-а нулём в окне 'A', или можно перешагнуть HALT просто увеличив регистр PC на 1, - к сожалению, команду U для прохода через команду HALT разработчик
Pyk не добавил). Командой Z переключаете мнемоники, если кто привык к иным (жаль, что это не задаётся в конфиге, из-за чего при КР580 приходится переключать непривычную мнемонику).
You do not have the required permissions to view the files attached to this post.