Спасибо B2M. Отличный эмулятор. По предоставленной Вами информации удалось сделать в эмуляторе РК86 и два фонта и 256 кб ОЗУ, прокачиваемого в окне 8400...BFFF. Написал тест расширенного ОЗУ и это ОЗУ оказалось исправно. Интересно, какое это ОЗУ? Думаю, что это ОЗУ не из конвенциональной памяти (не ОЗУ XT, адресуемое до 640 кб), а ОЗУ защищённого режима, и поэтому можно без конца расширять это ОЗУ в эмуляторе РК86. Сейчас закончу писать и попробую сделать в эмуляторе РК86 512 кб, т.к чем больше ОЗУ, тем приятнее.
Однако "ложку дёгтя" добавил тот факт, что фонт всего-лишь 6*8, в то время, как на моём реальном РК86 фонт 8*10 и я привык, что никаких двух линий растра разделяющих строки нет. Ну, я понимаю, что для близости с реальным базовым РК86 надо было ввести эти две линии растра между строками. Но фонт-то зачем уродовать? Зрение-то у всех своё. С эстетической точки зрения лучше было бы применить более красивый фонт 8*8. Кроме того, реальный фонт от реального РК86 не годится, т.к реальный фонт инверсный, а у Вас в эмуляторе фонт неинверсный. Поэтому подставить реальный фонт нельзя, что создаёт лишние неудобства пользователю и к тому-же, "разлучает с реальностью". Поэтому не смог сразу использовать свой фонт с инверсией и псевдографикой. Придётся его вручную переделывать из матрицы 8*10 в матрицу 6*8.
Очень большое достижение, что Вы проэмулировали команды ВГ75. В своём эмуляторе, в своё время, я это делать не стал, т.к решил, что это слишком сложно. Однако, Вы не точно ВГ75 проэмулировали. Я использовал на РК86 монитор (ROM-BIOS), который отличался от базового двумя байтами в п/п-мме PUSK_VG, отчего курсор был не крошечной мигающей чёрточкой толщиной в 1 пиксель, а мигающим прямоугольником 6*8, что визуально намного приятнее. Если в моих исходниках поставить флаг ORIG=0, то будет такой курсор. Но на Вашем эмуляторе это не получается. Курсор получается не сплошной, а какой-то мусор.
Ну вот, теперь можно с удобством сделать для РК86 RK-DOS с поддержкой эл.диска и реального дисковода. Эл.диск - привод 'A:', а дисковод - привод 'B:'. Если ОЗУ для эл.диска нет, то дисковод становится приводом 'A:', а эл.диска нет. Хотя может быть и есть, но очень-очень маленький, размером в 15 кб из ОЗУ в области 8400...BFFF. В реале даже небольшой эл.диск ценен, т.к существенно облегчает копирование файлов на дискетах.
Однако, B2M не расслабляйтесь ещё. Ещё полно недоработок. Во-первых, в реальном РК86, то ОЗУ, что включается в окно 8400...BFFF при записи в порт управления F102 числа 0, это основное ОЗУ с адресов 400...3FFF. И соответственно, при числе 1 - будет отображён участок 4400...7FFF. А в эмуляторе отображается не основное ОЗУ, а какое-то другое ОЗУ, так, как будто мы для основного ОЗУ используем пол-банки РУ5-тых, а для верхнего ОЗУ имеем отдельную банку РУ7-мых. Реальный РК86 столько параллельных банок не потянет, т.к ОЗУ не имеет буферов, отчего возможна только одна банка динамических ОЗУ. Поэтому при числах 0 и 1 в окне 8400 отображается то же самое ОЗУ, что является в РК86 базовым ОЗУ 0...7FFF.
Не подскажете, как совместить основное ОЗУ и ОЗУ оконного диспетчера?
Кроме того, мне не удалось реализовать в архитектуре РК86 в эмуляторе цельно пол-банковую коммутацию ОЗУ. Это когда есть регистр F300 и занося в него порядковый номер пол-банки, во всём основном ОЗУ 0...7FFF включается ОЗУ нужной пол-банки. Это как в ОРИОНЕ, но коммутируется не 60К, а 32К и нет некоммутируемой области F000...F3FF (а зачем некоммутируемая область, если при нужде её легко про-имитировать, записав в обе пол-банки одинаковый код). Думаю, что для реализации такой полу-банковой архитектуры уже понадобится задействовать map[0,1,2,3...FF].
Прилагаю тот конфиг, с которым мне удалось получить два фонта в знакогенераторе и дополнительные 256К ОЗУ (кроме основных 32К) прокачиваемые в окне 8400...BFFF (управление портом С ППА по адресу F100). Здесь тип CPU стоит Z80, поэтому используйте совместимый с Z80 монитор (ROM-BIOS) или измените тип процессора в конфиге и соответственно имя ПЗУ F800 с ZBIOS.ROM на BIOS.ROM. Здесь вместо странного фонта знакогенератора SYMGEN.BIN используется файл 2KFONT.DAT, но вы можете подставить свой фонт от реального РК86 (даже всего 1 кб размером). Если Ваш фонт РК - оригинал, т.е инвертированный, то Вы увидите всё в инверсии (причём синхронизация не сорвётся, как в реальном РК86). Не забудьте убедиться, что в секции 'cas' адреса входов в подпрограммы RDBYTE, WRBYTE и адрес возврата из них (@BAK) соответствуют Вашему ПЗУ F800, иначе при директивах I и O будет завис. Чтобы не заботиться об этих адресах используйте тот монитор, что выложен в моём предыдущем посте (транслировать с ключом B2M=0 (тогда адрес выхода из TAPE-подпрограмм как раз и будет FC9D вместо базовых FCA4). Обратите внимание на первую строчку CPUclock=. Если Вам не хватает скорости 1.77 МГЦ, то можно сделать себе и побольше. А если игра работает слишком быстро (что как раз обычно и имеет место), то ставьте клок поменьше.
Скрытый текст
main.CPUClock=1777777Hz
main.Caption="Ðàäèî-86ÐÊ"
CPU : Z80 {
debug=cas
mem=mm
pc=F800
port.maptomem=1
}
mem1 : Memory {
size=8000
}
mem8400 : Memory {
size=40000
frame[0].size=3C00
frame[0].page=D14.portC[0-3]
}
font : Memory {
rom="Radio/2KFONT.DAT"
frame[0].size=400
frame[0].page=D14.portC[7]
}
bios : Memory {
rom="Radio\ZBIOS.ROM"
}
memE000 : Memory {
rom="Radio\IRISHA.ROM"
}
D14 : K580ww55 {
}
sys : K580ww55 {
portA=kbd.~mask
portB=kbd.~data
portC[0]=cas.record
portC[4]=cas.playback
portC[5-7]=kbd.~data2
}
tim : K580wi53 {
clock[0].rate=1/1
clock[1].rate=1/1
clock[2]=tim.out[1]
~gate[0]=tim.out[2]
gate[1].value=1
gate[2].value=1
}
crt : K580wg75 {
dma=dma[2]
font=font.frame[0]
hilight=crt.ggh
}
dma : K580wt57 {
mem=mem1
}
mm : MemMap {
map[0][0000-7FFF]=mem1[0000]
map[0][8000-83FF]=sys.data
map[0][C000-DFFF]=crt.data
map[0][E000-FFFF].wo=dma.data
map[0][E000-EFFF].ro=memE000[0000]
map[0][F100-F1FF]=D14.data
map[0][F200-F2FF]=tim.data
map[0][F800-FFFF].ro=bios[0000]
map[0][8400-BFFF]=mem8400.frame[0]
}
kbd : Keyboard {
layout="Radio\layout.kbd"
}
beep : beep {
input=cpu.int
input2=sys.portC[0]
input[0]=tim.out[0]
}
cas : tape-recorder {
biproc[FB98-FC9D]=rk
boproc[FC46-FC9D]=rk
}
[свернуть]




Ответить с цитированием